From cad21cf776582a63f3c6a2c0da37648dc63d933c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 23 Oct 2016 02:37:33 -0700 Subject: [PATCH 001/269] change gfx files --- gfx/L1.png | Bin 494 -> 460 bytes gfx/L2.png | Bin 585 -> 500 bytes gfx/R1.png | Bin 600 -> 528 bytes gfx/R2.png | Bin 644 -> 566 bytes gfx/app.png | Bin 4681 -> 2597 bytes gfx/bg_overlay.png | Bin 2235 -> 29641 bytes gfx/circle.png | Bin 1249 -> 630 bytes gfx/config.png | Bin 5174 -> 3611 bytes gfx/cross.png | Bin 1300 -> 593 bytes gfx/disc.png | Bin 5892 -> 3853 bytes gfx/down.png | Bin 755 -> 486 bytes gfx/elm.png | Bin 0 -> 1490 bytes gfx/eth.png | Bin 5012 -> 2201 bytes gfx/exit.png | Bin 4236 -> 1898 bytes gfx/hdd.png | Bin 8068 -> 2735 bytes gfx/icon.sys | Bin 964 -> 964 bytes gfx/left.png | Bin 748 -> 494 bytes gfx/load0.png | Bin 609 -> 843 bytes gfx/load1.png | Bin 606 -> 139 bytes gfx/load2.png | Bin 591 -> 843 bytes gfx/load3.png | Bin 600 -> 139 bytes gfx/load4.png | Bin 603 -> 843 bytes gfx/load5.png | Bin 592 -> 139 bytes gfx/load6.png | Bin 610 -> 843 bytes gfx/load7.png | Bin 618 -> 139 bytes gfx/logo.png | Bin 8734 -> 12463 bytes gfx/right.png | Bin 734 -> 493 bytes gfx/save.png | Bin 2978 -> 1769 bytes gfx/select.png | Bin 315 -> 562 bytes gfx/square.png | Bin 1224 -> 507 bytes gfx/start.png | Bin 750 -> 634 bytes gfx/triangle.png | Bin 1250 -> 607 bytes gfx/up.png | Bin 772 -> 494 bytes gfx/usb.png | Bin 4736 -> 1241 bytes 34 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 gfx/elm.png diff --git a/gfx/L1.png b/gfx/L1.png index 1e83f47aa547a9b81dd797a3afb86294142f9b7f..fb89da6ecca3f9f0261ea4c4ed9f3445b785a012 100644 GIT binary patch literal 460 zcmV;-0WuopM0*&O)Tx$Vq9 zXU?8kWsC`$HZ^Y|Hoz80fHW$$+p-;~a{8-|y#w!)R)_#y@MI>If`m`EoOtE5##pgF z*A6sQb-@Z4fjC3GSO_{`3?kP3-D%b%w&i(3)>{vpiEU?GaBMB`0q(&Y>wzb-4W7ZP zGjEZ_zKAkg1P@>j+;As;{|h((S7511V1|DX+;T+cU=s`+*Uwahxb+ZRGA7a{M93$7 z40@bzCL&Zu{TqBvy9-_8oerO)x~>c>x?Su7?0{V|a0HE~5v3~x-x@gKB9U_}EyjW5 ziBqs$l5=wJj%Dx&RtqwwEVhu51-~f5X2O^;QkF5V!IA3;WdKxYbs#Y@AWdO%ATls9Fd#5FIx{#rGC3eEFf}kR3Xa1^00007bV*G` z2igM*4le>3TpV)%000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP0003+ zNklST1=xi#i6z*C9oU7$#LzNGEW*H0d?N9^sZLsW-23q2 zout!py1MEdx(m_6A*`O~C%C!5tm`@%hC#zH&^V4X&*$_wZki_Q`=08$rZi0{NfO5Y z;y{phT}N%(vKbrJ1ZRX$Tvb(U=CKGM3G%WmnE)p~D}X@fP1BGp%S%pNFM=2Y<Y% zvraw@Ns`F(yakUO=h=0DN&&!prfN|X$#EP~6omvq*sSr_yXoL+xUNfK7#@C$b%Ely z#cvTs5oK9+c%n9)-t8cc<5RfX0%zm@1g@O-KX-6P?9-mt`s^Nof*{!CY}-C0$ILI> zP5?&5jgA8>%lfq&(=-=y++gq=3cv+nRPYjr-0>lh|1`VBt~E^~RaF^)o81*B9ysYKVY61kAn#i0v#Tg^JZ*9=Ekgdy7v-1HD-|xPy)BA zVG#)Vl;hAEM_ugIR^!>tNR+@ZsDq$|_a=2k@Cm*|D$QPx&yf5S34PwEtqH}$<17ze zz!iApyL51Xp}nUA{bDW7f=-3054i^O;FMn?*Y?3A(R*$ZI+99t^nnLZ1=HY!>8e_3 z$h<^9Km}}rMX&(wfS=R}uS*BCK*zul-!H%cSOG)eJ*!B#*4X6z5R|EjU8W^7O_=Bv z$ROAQ8(@dR9buGGZ`-E!x4;aT1#{pGZ1T`^umslGbMk3wBH-7piH7E|dA)*V&iVY! z;&1Pcb`>xMj$3p=y|!v~#0b2J=p}N(wL}(|4nL+9`)w{T+mw`oC&FD|m+RS8{!GD@ qMQLSqmFFnfTC>jo|5?$#1sDJ(`t4;l2(DWI0000WdKxYbs#Y@AWdO%ATls9Fd#5FIx{#rGBO}7Ff}kR2#J@y00007bV*G` z2igM*4lXh#o*kY5000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP0004? zNkllL@#4Xzu{pR&8(@3>qp z*zfmn90!ZVLilxMNb>XfjMM2PBR6;n;y7Y(yWLJkg@*&aB>8r`6$gqqt^shXIG;|ZXf~TqB>8+E-EJ4fVo}z%ZDTwhW3$=FsTGfc<~g^ugTf0Fc(=>f+M$OvKX0sTLM!s*2Mnm?q(L(!xc~nA2gL=Il8dH8%Ex-W7XHM4IEmv2 X#&s@4zy^4(00000NkvXXu0mjfjk)jQ diff --git a/gfx/R1.png b/gfx/R1.png index c1c5df503e9595134a261f26577a4b803b8421f8..45b0aa3cd9d9c2bff56308960c0355265ca2cb32 100644 GIT binary patch literal 528 zcmV+r0`L8aP)Y%F{kOSQ3IM0^7a3qiCIA3(75R@k^!8gILs<3I2R4)J7T_T~S_lm*MjRumXDd z0Z}FKZ9NfXikobMJY|$59>ESc10&#?iRQoz7yw^M8#B(NnHIRI*eS?@bI<}7!87C1 zNt#0??CKBj0PevJ{qn`5RASfYsfvzhoJnI|QTm{s>tK})+6Ou-IVMSz5EZ7u2{;Dx z-~!wkA5*G!SjAb99iQdBG~EWvGgi&ONTP(C{Wq3EYTiNrt8ui8#*we75WdKxYbs#Y@AWdO%ATls9Fd#5FIy5jkF*YDAFf}kRNTuOA00007bV*G` z2igM*4lf=JT|hhl000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP00056 zNklxTDb;GH5W3a?3A*UjeD?p z^qiWBIrHkgnw)wT#+m2$|2Y3MKHm=)Jl4B;B9Xv)y~b*_!eX(&d_GswY&H{`PNx`; z$LMrAh{xj+M3^s^OH3vc42MGu1_PmfzptcTuLoV%QK?iA4u@p`Bd0kxHJeQ|8V#X( zy{@ckwTeQafK)0a16USDPIFDu;9QT#1E`ynBgQPnLvH z^F^*#qgJbh{eF+*@n}C|)Q7{t-fID((dhpH7KE8tzb}`IXznW@m&+j%iMRupKBM{z z!2ezW+wJykZ@FCl9?UMv=oPNxwJ24w(mK^pQd;WScAS5=Ih=A7a{ARq(yFq_RHnM@)Ui;0b_rHXia mvMh|8K7PO7{hQ#iezTt3Mi+Y1i($q90000-8=W*?m2VLckg|cQYuhss|x%93u^st&9IKO_T7|O9`oN_dj+0yqbLW6 zfVj$;18lZ>-!}Tr57vss=sTZ@2xtZ=koAZ@q?J#`9FS&fk!rSSpG=6qHnSXx&b>_L z;|x-f2GFB9mH;2PXD8P>U+kGJqzNw*CrPjX?v1%gaL6^w;FNnVf?ZHUjTJ3SKYIiH zAj(Xffo*UBUcd?1r{g7xd>y=&^N2ds%^(;8;~Wh~s*SF~uOHt)<9BH>=0pCKNZH2kqMV?gFzcgRS-55*3|g zi?3)CxCJc*ZcK+kgxODWKFF~Ik7dYsJ2J-2Y2KLU6m>pY%XoOa?g{hACNzhc0uPv9 zc0ZLP%YRZ=$*24oY=ALM)xY(WSMi#UnVR_jvicBU0FFEdnzv^%-2eap07*qoM6N<$ Ef(9n|kpKVy literal 644 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 uU146Bp5x?}w5E3{R3L>nuKT~wj6b&U%-8WeP literal 4681 zcmV-P61MG$P)7Fl~z3n^SKK#+Rz4R*==eszY zf=j_!An~QkuCcLqZzzcd6=perr4#VuzksFVG#U-|?c0a7_E@{!{@C&3$NzD)*O>ME z)}5bu`3B%lqt#nxXWKv53}yRRtBFIncyS4|2AjVw%}1DlU^gl0DoKS9G$9xRGX~?= zgG=DZC;X%UN~!A_jmGDI%Lm}CfBNzx0)GaCR-n_fR04wuge$f;m|sdr;uw@ zq$!AibN;$G-$%djr9kY!mimX&N|&|u*jn*o=rO3?2tc(tMyoZ>!oobj^=rvD5`ft9 zJ_jLy7Dz=1!vLkBRuyKpH#q&11rX(DJWf$lO;jTwi4wF}u-4Ctb>N)GDX&M4pV_Us zVnUIm01mH}UVZX<|5DbkLYxT^qv*u*R9g+~lp~PWGr4^mwilt77D?^e3>*nS$njZTYNr_MaJ>}UO>x~6+evWU zlz1^_Tsgk_;c>2<5;{GHa~5lT>72t_i?w+@@9+0%t$6O}QTFX~AWa(EzQlLF_kF(l z*rOO@a7nT`0D5V^E;v$zFfb@_BpL)^_jHrzml9Bp>fW7*gczlH?bQvsXCf{wCg?yw zffE3Wbq=>6Jp7g#*X+<-SWI!w&#tvDBS_x%T4a~C!6GD9kvL7a9igg=blXcTE-W!# z4^Sf*phg1V`Z;otAXGwwF&bkuqBRp^6}C;*!79>oDd`zdO0#2og`2KwQlG3qGe9>2 zq^?m_LnOkD*H(D{Ej8x4czaRK8RSJ4K|~F-A-g7mb3#z5;*_S_UgFa1ETRlruPx$e z29yBw`sf*u*p$G6b3y{_o^CMPPOy2QPPU0vbo0ICRzUdv6M; zhr(>fA=0;WB7#z?pt({Co6Th2mtU6x2+*PkjKQWUolYA>Fj{X8fT#?B_y@w!KrC1z zxhJ@7o`8`(DF^&Y*z6KwE2F)XQKD zgCLT#L;&YkCK1#K07k2T?dQl+*nnIGj4=d(CP7oF*Rb=3h0_o?%~;bg)(EK940|U- zcC(e>s~K{8?Ox*|M@20vkv!@lvf(Zl~x!tj){unLLIJ{3HWYg__fKDE60RO zkuB6c7s^^osD-b5fu#D5Y-1IwF%CRX26DQKnhe4!q5;UIRKC< z$2Hr8kKE8>kqfk5KZfmCZx3*Y0VY5uL9VLPUb4(a$$;MHf~9H7efQnR+u#06+;h)8 zOifJ<05A;303#%81I}7p>AkC^jj2HDSAj6dsIPMsFr+9Jy5M@?BEjPQ7KdQ*?ZiRq z1YK>QOM_QRp|wUtIC=6Ulao`t`qle6c<@sz(tmj!ukT7wIg?WFE67#?kXpa)hDKv_ zZUYp7(V0NGz`jIs5VAIqI)_qs{r#03;gBW7QrlpvH1X=W$30)RkCk&O~UovDD%vj;*cHMqwa z5_%;N!Z4&(s{wHAf1c;avFCZ|^eNtX*E_lT>Z^J8z4!8?AN`0YpL}w~)j~4bLv8?l zDa9rX*en1h6Fkp>R)j`jv_|Jkq1N8x8lvQ|(6Wpfj%u|^rBdOMkA8&N^JjU(ZExcK z_q`XT6c0S`07`2<|M}1Pr&a+$B!8#MY=D0^0&1%n5EvoIbw8W^+y>->EW{iFVendB zas0zKzsURevB?J(bPAn4G`S!M-?tl1qh&qcn>$vrnoA~;d{~Um;ulZR{ zoS)~xkA2)*aBaBys%r?tkjEc?ob&CJ!$*!5QKv6_`rx25l-mR83qQ&Rj07Oir56Z< zS_m=&2!eG&U~IA8=EkV}P#*+;{m^$0vG9`<1YrdgFY)6SUqlIFY)qAr-(XjuDkIy zRBJV^oY_v=>yUJp3Uw%Ui>j;^D~)3X`9=W{C?VGZB~URL12PZOIl*Y>RlxsZ_N3q8 z^@FZ`CVb%i576r@^1{&{a^}n#M1&7M_?tX)_`d;1nx-U4LLMZWnYn_w3uk!zFCXQh zhacg!3vGfRTwz5}eWRCogrkh$NB}BY5g0#^*g6`aA}|VF0N@CWLuLE&!T=REpbUb? z=iqODgmdRFa>FaH1K^Ik?&de{dk-Hdg~I0M=IQl%#SH%V#0icZJ;ufJXZeFqej*E& zxRU-;><4_g+$gV|m#Q3?Z$JI-)ap%?3HbCM z|4{)>KAWx9SP>Hdc*Wkm%xs_H@4o&uzWmr@h5i?tA^L7`d3oIQULe#^4}?Z2G(({g zLZHEDDFio06*d6z8>C^}oh#b`;fZhj4b6!O{_3k=<0*zqm)LlXtTD6>#zYH zfV%Nz&H$sl;HCh8LjQbn1sFLK%0dpNmG=&Lat>;>dbZdj^Fczu-g$=OTiB_oneqRJ?p(70a%t>(^=899WVHZ^Z(ctGI=YAnNMNmP6 z$)>jlX_}uQSi(Tls-{df9EhVeI0Wd<GFj|jX21f&+JODw?03!noa77l*ErguB08s)-0=)!!iK7=g zdWoeM+pO;B#VK);67?+qakLAwG3e4!yGww)p7t}@iL=sRLZ7R#M4K_b7nQgiig7bAjCoKxhrdfHr<9sseEhs1hw)qSdTpOhB^Pv%x?M6)l811He!$ zgDO)`mjRInVXVvA_-lFiJO`@Z_TcQ82-vgJa{A>MOume0ka`J#ArQ0z6ZBbNS`c@E zgkIERdgm^b2x*$GD%-jM2(?fN`T$gdzU6nWFYIuctA#nTu!&BR!{X9JTFr0mI)bLhJX`14! z_4MB?01DLvsMmxbfT;$w#$c@J^*G3kU64}fc#!yG^}H`m`~Ci!U=krt6efl^@ZfIW z4(12nAow0WJ~VyrU3Zjy>bXRB=RPJH-lHbFfiP4$2%~_5GP5twp&tbv8nCXt?l=v7Uyi{ z3)p_n?r*S2bydehCz%{I^Xd7f*2BE{Q{{%vdXj z(LQhzXb6p?V#ucSro~i^XDgs&N-&0rnqq70_}GDa)$@xpV+Kz1UJHf!3UMX7&EZ_Eazph zx>e8imtRv#v1`|^%N<&goO2`nfb|2=54`zi2Eb~9tQU;o`*PoXe0;n(8o%7MwG0>n zKq*}?U^PM30%Q2z;eO{FyLRm=w!j-rTWi;(AnI z{YJ1n6V9TtL(wvA^AJ_}+FFClQ~q53;ZwOjJw46Eix=s1I_n-P^ck>qDxh^K2e8U4 zk1}{0u?r%CF=kT+aqCnd2>Lk;u;OXDUW2z%|0r;B7EDe~GBGi+Vd1yd4+ty$dTOzy z@AUE$n!LUdl~|4bC*$x4NpM+@zvG>&>ZX6MPXfvvng7I1G82h z@M;3D)mL7-$Flu={{H~y96NXJT=t3G;0Y1Meq?I_(7i<}V}1!VAvWq3f|sdVHiE+g zT&aH;jQmJ^a&i)-6iJc{Y@LlUL{UVN^uIJ+3BsCt&Gi zh~|jr=TQz!cJPo7Fh^f0MVh7q)GzBMEI;AtcDpF0n3$NrIafq<%L0iA^?IGTxw#dE z9=^6|0QT%W^}FNe{&xS;Kks0E@)dNi*vq!D2}Gad(!v}|Nm4qg8H~b|sXN?1T+e5B zVq$_cO_#BzY#+ifq*AF2d{I955k~*orUAJ2+E>htjWvnei*(OE#nSPA;#co|58cWA zEJo1)J(vH-$1W3grT!ei@_z%$o1$ExzMc#9dKJ}~MI{;}TkoA-Gai0x&&2 zU7MVoB#I(B+jlZIJBzB1p}JjarP(P9G7#<>5_YAW&-k$L!x{2FQ}l4j7%#o<4>8wn zhuHcfM5WmI;&EEf9AqwI$EG(!&bh~{)#|Ip$H!~VInGwAXszk>dd0wpsl1Z#D=}iV z8Cq>wE&d^bpj60WbB0dc;36-iGn)1#$5ovOQOi|hr6lY5>+Ick-+j&W^zT3bD()0OJ zID8+@`p;sZbOKa-h!p@o1U`KD@Zn=y2Eb2Sy6m9nPfPlL55WHcOp;B(9@V^^00000 LNkvXXu0mjf!=v*# diff --git a/gfx/bg_overlay.png b/gfx/bg_overlay.png index 33310c61f50439232b75795ad5c73cb937826454..3de6633a3c06336efc55ff76e53f72aae417bfb2 100755 GIT binary patch literal 29641 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 literal 2235 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sU_8LV1{5)>y?F^pu@pObhHwBu4M$1`kk47* z5n0T@z%2yAjF;}#{Q(Nfl(C#5R5WfrBD=NDxcD>w(67H)lP z#=yW~>gnPbQZeW4HA6-Q1)c*22lhXI$keCCRaJKW3=_kG$A9=37#`>{b1(=bGcYnF z@hC7j^f0n8bQm@;Fc`84Fen^jU}88T;lR)!F{)@Z2u4%EXhs+<3r35>(HdbGSBlS= ZRAks{WjZ!41vWGoJYD@<);T3K0RS|Cez^bu diff --git a/gfx/circle.png b/gfx/circle.png index 247e88c8cdaa0f9de0f60d79894187d4c5161c45..5fa9cfd580dd486efed70e4822f7360778bced09 100644 GIT binary patch delta 605 zcmV-j0;2ul3HAh#B!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0006Q zNklGD7{~FQQA@%4x-J)L~i$d{)I9RjAR> z*QG*VP+v2$u?vV)yw>7O?G|GER*S6j7uHe2F(v+phJRFWCY4}JTQaM@6)f5sw&=AN zw7A_kr}MQ6FU3mbx60&>dns00aVVRox?nXmjyl|O+pOr$|7y}BD)3M?1HKMBbRn;c zFZH%B;Dsi6ry@U&!+5Vdv)Y|j!Ef1mLrRv@aSRvHgnHSF>-eUc4L5ML(q4}7L;-m{ zVp+90f>u#IV&aP4+Tc!Kn+W&Zx)j_etEBVr6|!x2qt@puIFDzT)Dncm|MV4lfVN6w rqZ)q!R%h+*FW@J>AXja`rT_x~n4Ju=A_g&u00000NkvXXu0mjf7u6-# delta 1229 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 diff --git a/gfx/cross.png b/gfx/cross.png index d2ecc18c4db847f74dfcb3989fc10b7e20d93a8f..10f4ed8e36ed067fa2e99504458d707826bf1f61 100644 GIT binary patch delta 568 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 delta 731 zcmV<10wn$B1M>xtB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01E2>01E2?f{P7W0000S zbVXQnQ*UN;cVTj606}DLVr3vkX>w(EZ*psMAVX6%akb+%0000MbVXQnLvm$dbZKvH zAXI5>WdJcUFEKJNF*UpJ(jou=0!v9mK~y-6t&`7c>OdI9&wpfUQ7BYR#EnIa`@2y= z={^|fV+cM(L22K?C+Q+SgVe=cip0MQMH^AfKdt8L%AnP>x8(-8 zK?|ZNQZ}1C^L1T^VHoVkKv|YiEEZu|mhZW)i_vKGy9tlQ7z1O0L;V|&F$T-BuwJiy zpl#dO?RH-Rg@2$0&+~i`V+?{IV87qvyAT6`xm-3kn~f^Va!pZ`C(b!G zn++Vt0RU*4hQ(sRt`3h6zz-l6iy@cGJxP*OTCG;<;X2uDR#OzE?0Fsx!vNGl{^w?V)(4;`A8Q(FupEQvEz`*oQa=P3GS^S zrLLPMu%h3QI^3q_$h3yM)079OjF3p7CXt;3siN`tF|tQv{@aja$m7Th zNDyfiHJn5WJwzfuM|MPC2m}J)bULA`stVk0Hvye4P3HehF@oUm5dJ z*^X3u-B~0DX=eJFi^R?@M(AR@?g{#>)^R<4fIRPsRF2W($X;3k>SboC<9Mosjv?P6 z&l#}G;&ptBTuOz|9%L=D*#M!Nsji+>2>k(hRPaVX&UhVwANMcAkx#p zG&cw99W8KYygNUfTLmuHW%F8>i0+V(Iz+W86FdxfzU z@37i>cpX+~gNAmgd!pfRm^C#uv5AR^1-FPFH#Rm(*P}uy*%aO>itp z^HEI7kwm)^$BcL!mIs#O89zTWGZTHP7Rf~HI?SCf(|Wo#iFPHPUU=V+wxXgUrR%&Q zA5u)GRiH>-mK*sfvU$+hF70dGzP`RhNuDI9v>*9WfXI_nRvnd{Y`c_&27^JxOrcOH z-f0J1f5*9Vk)cVR_bDpNA)sCILNhZnVRSV9dYzxo%F2?9>+tToo1%6+)_X;RK%Vvh z<=stXr3q-4^7P_#I@#pp)Yz^CUNUK0867ILBK6~kpKVy07*qoM6N<$f?{#dcmMzZ literal 0 HcmV?d00001 diff --git a/gfx/eth.png b/gfx/eth.png index e809e2a77bf61d279bb5614e005c20c6f8a2b866..f3214c2d9ff5cb0c509b36544f7e4a5d39f6b0c9 100644 GIT binary patch literal 2201 zcmaJ@e>~IqAOCDdmbf|!={svA$~GI@>~mYpMkaG&$y98%4;I^Jwhu;%ehXcNBk|}f zaY|9=a&>Z=`=-9GqIBg;iR&(xBqT|S@7ATeKfb=7_viC@|9Cu~&)3gC-Uot%)|$^> zIv)T4bG|<>L_d2QK2sC@zgnL7NI%&kzTrqH9D}4t)DXat!O;+&uaLw-A&^9tn%D}l z0KkYK7ltF@fT`kZ%r+W z0Yi9xA8qM(Y(gA@s6a9~B_)NF;!c9qv1AI9$uwwCsYE@3s7X~K5-m}wahO%$K^m!A zu0rIn5^qqHM8io4o1pjf&kz)hT z`TIYGHNsRCL=J&8aFSZ8FI~0WT1Me5D4FD5Vge$0q0%NOHLhr1*MreW(;qCe?>aq4;`m7&I=EN~JS>ISdBJ zhcV0L!O|oJq(o-9vcI^@Ik|>bP^k2ld5~J349Wb|umb-fWKcf0FZ4O}K5}Jq`@)!$ zOV&F>HWc=6g`PdqcaLHDscrR}PmK>L_1&)4xAn-?&R762Hs|v=LT&f+ORb`$%Q@}XF%HLT+Fx{i=guaNEn8+08`IR4TBQm4!k+b9(%v=E*gMwLJH_Y)n}$m! z8%uX({%rua#utvTRF-}60c@aAl+o0i1{bW>LTmpN<&-J%?IPVqrK20Mfiyc5!|0zz z>oR*iYOErLyvZXbs_>i*HT8KVUh4)unPooF!yU-#ntRxS(`6+aZ$56f5EOMptRV{F zdJ3sRRC(0qF~b3s*h?{41~?HL|5e3c8@uK#uZK(z-+G5i=jDJ)FjdfzMO7Gi`me$TRsS&W&eMSZu&*Af}OyT_64=e|DZ=v_WT z5qm<=8;cRQL&57TgJV4G`zN|CUBI+W4VV+{jU2N-L!Uz%6_y-n-)uacQ0dTjH6e&F z<=dwYD306{SY?ZK-c&l;Rj|kJebd9-A9c=lCkCSf?s**iQphLPWyIZ2)#d9f^2)X} z|KQjcDy}ND{++U@!CLFO|G;gly92RjR|bCf`NHpyp7YNv+Mm}Fe4!b$pd+-65rDe5 zvn0wW9ooeo-Z$y5yQ@y>jQ`lHlUP6akC%Ay;t`aJvF%mJHC9xN#zQc8 zqu*L~ShQV@m}t%4gym;e>Nw)P*yC@tv|3gXO;Ibz;*HkkzGQ{vm<pRKRtHAOX$$g39(nqgc&#&7JB({$uo%7khD)s{DtDm%W zDAroZvJ)d8k2c)J{B|kiK3JC1)8lpF;Y5I~KYA;pri%9N-GMsRvqtYT3y)#zFCH6X z4vC^xGHN5SAX9iqX~7c?9;j#zsJ02-e*R8tXG9Th6)W=CgeeQRGbnHUoe_XfoU+BN zxHw&2@qBsA=ll&(t6B>Z)Sd;WuhGm-tgt#YS@zg(>92X^H5uD`WCvDzS+_rz%cY!M#!*IDZ5mYdUFMq@6!dVU2AqcU2Y@pX~&?o$J{ zQL^Xnn3rtS>zJ^^a-L)yguSeL zIFx^6(uR0M)`QzIv&7{4v_V@jIqJdFZoe&Fm`BymZbydl8hy-4E0Pqj=B$*sqr5E^ z2jEaal&rKu^%Ro^;=V0b1Zt{?Nj12ld8x8%@z|#)&wRDMOpuM7I(y^Fxr-()Fzc1b z?g#hW{`I(y>$UA+o#&ey%B#PvD}GRudui;Cy${#aY$i+4!nW!&c9iO^dn?P&#P?6C z2P^PHZKThNx0)AhazA;4dMM}ey@9sGvGo)&eRp%IGukmA<9Y;mP(0bl>IUsbr?Fwl zJuY7t#J$&Coyt!q4~;*-y*AD0jNiXKjDHcB2sc?;du#2teqBa5|msIKfJg{%<=v(GS6lh+W?MvnPhZ-dYIv|!1oQ})%u8c{TGWtd71zK literal 5012 zcmWky2{;sg7#{0d_qwu2)VCNu9d|S)>X>U3hTadgb2x5xr&hc%uQR! zEje;E4KnKxx2pInHMe z9H{)zdKOS{3x+yJgV%I;T^m0DU|{=qP<);ZJppg>`D;PwmomaNdP~^E7?27=N6%mw*M%6AK_@r4a~egnXHH$RGf)ZR%-h zSOn&Lz2kAu;%m$K+gfsy>l99(pX1f?BW(_$hJ4yz6!2j>jfBkP=q?YlANl-1j0hJJ z?j>-kGLl`Gr-GBzwkTr7rUrZC{fm9y{Nz znJ>@%sQ;|zTG@Q*{M`F=K8OVqUtld9kxWU;JoqxLJi9oCE(1#eh!s`rW?+|pAJ?Ln zV&Art54S7JuU1RO)z#M8Jv=>__!~QhilrF+^5ys6si~>+oa>%b?;9JH=urj>esqG} zhr6Ef)lGg3v#I0^UO}n|*ys6qlatTv5ETy&k6}WMawL+1VMm z5JoF=w}fAngev zgAyfZDkZgYf1pG(@o-hvSl52#_)!F`w45Ftp`4qRG|~jbCnok_U5;pMc}}u%*)oQH zwu4;ef@o;8D}QK5cJXq(o^*1WnZWCE_Wj)~E<$y6wQoyld82&y1`;Z$TSAJyQ79%Z z-nYvU93O{dsoHydQykiKJ*-WJ(Jh+@;=Y>;!zGGPpG?(A!ilB_U#%RD%Y*Cz_+9pf zk=3gUo-^{y%*@{_K5ln_c*W!@KX_SJccHQ3?`!J# zS`XH^?&O;ZM`O%j2q}z$ex9BFr3?*Tk$;l*S&vUo+q4bt#|l$tdg@V_oBQrQ87g-PI^%yi4<@#%Yepjb-4S_!A7-XI|OJWGV%WU z)yYy=Rz}yGc#(ZOiKHh^?I)r$aj^DbYYPMX^r682_{2($s>RwY*b{hBXsB!!qvSxx zOYOL-(9=hQ&lQXZRfCUYva_@EaXbJt02+zzNZ$*fDm3t?SLlUnUQI`9Yg29~V$! zluHjMvM&7r)7;-Ksu)*VS=swSHAp7pk3Voor=Xy))J&e!^!AqSScDpo+L|8j|BJHZ z?e|asztc>1A{85s2B=EVsf96(Kt6cQ##+98Y(L&-Qog_0<#1NRZdGaDeYiF4^XE5CONdo0_DO&L&6C}v zk)?00=NDtNAi(JOI58vRLT0hJZ7C+(@#*bvb)v7mT!(YozjwzWu>EOI;!8-lrt`DE zZeCtJYinZPckAy`M#tSJ$w~Aup@dROd3bnY2P$HNA{=F+rCU{Eu>%RHr~heq$p~ zlFA-*W$1a-pFfX8*yyMr6d==Q8Uq-fN!fMG8|SoTkxB~0=!sELyX&tjzjwv3Pu5`L zl8GrPtebPqyno3%Ah==@5`LGpGP+S^-*un=N1;;1%LT+&(_QcULMI;cqi$0`o`XKd zew>q5Ln|Jn}o0F3>a4A6nzx!P~EiDb2;>w8L z^yJC4Ca`4|Q-cWgG7&KF4odvWI|Q&SKp|klp}gqk?%vUtdSz^OHeq9;QaD8yD$(jW zef^DfHH5%48O0wOeYZEU;N3g+#tLD!n1x~GovzPC`u~z#<>Zraz4y4}y>B(tc_D|~ zPy0k@Xlbh+?zFRiGbnf5-TIJ(#sc&l0w$Y{qe89PkXmA1U)>UCctD<@@l>#2%&n3 z4tt6P+o4*z_;Re_(9+8I$-fKE8Vtr zj$4wx&7-opm<{cI6tiDCOnW&`?$+=c$M1vLj)RSf?paWsgf7Hkz+}k4cGO4;+7;uR z@>}^24h{mp$6V>kk+7-&E5<~hayn!p#OXy)J*KhMryyh@J>3JRL6c|$j+ z^=atiV_a-WF<<@InCa&92jlpMo7KI)4yV2Eo}CZdp7F>rIr5hniz|W=ZBC4_CYJOhIpIaTVu@VFU8;|bUJ>x* zAD>KbVls>4kkU)Qf(61Zq}rMziiQ7%r6s5R!(~nw`k!E`{2tY;4?dPvQdUmsbA~1L zA_CSe44z*%{BlW2N$J<#fOO%96527hFD^493wqC*lKZ7glL1JNwHOR)0KvBi0196I zky%)6ZG*RBjzqzky!XmbpXDkfmFZ2^gd5eaBbVNP_^{N?<kIKkM8W6>WGV92@yx&?zTV~DJxR%lvl@E=UP_sx=vNNNX$mm++G-?olpip^efu^) zO-UZYNyNBjrG2&DdvUP!lK}`6DVeisq0=fC>`k-UCk=Tat?QQN7ZI zRb`l>S^bECe{z-;DsYO|P+)`;+sU=zLY=6d8d!`LJ>+UYo23ziqJYYAkW)dXCz$;u z9{?3hw|yLlLvDoQm^GG=S)e^*UH63r>s_G=Ljkku=kZDEe{`*bdTMGlxR$zXG-X56 zTvCMy^}gIBxwzMaiVf_y?wW3s7QFq95aS-vNXn}FTT^`aliNBvv}!8B*7Y*2s5oaN zS9_wN1SREzEXltj1H}z1ERT;u7S_h356}PL+V--NpM}p1Xqszm$Cw zl=MDX^}*SZ@H8Y0n3|prDICr@eP{YYLcO4iNU;#}^er18Di+H_DU-|v7?S!QT6A9~ zAk1tbBKe!meBwe>V{RN=Qnqa*WA!Z-xKAgFle)n1x_i1^*8IL^&x{7VBn)vTNovs1 z&8qN7X#xgwm8~vESX^@n`%Fk(msQwTGtHm52PtEKopsAFuD2d+FFSY0d*|mgTi8&6k#r^sDa`LG+x_P%@C@>&E z-eu%WVXbjd$&`2W4bsArGdw(8(QhT5;XSMLg)1%$@-`F{eNjQT%wTobFA56;s0!F6Vcljo!Z6?UvYGwrI!{lQz z>cps_O%Wi{EBDq>0QTl-R3iZA=8j=QN3gz%g{(EIbPbg<_>?$N1$KSOc;&B@FgIs! zMH8JMqz*(^k;7M2EPz5rQ4vl@6OMU7eKoD)=~F(1 zLNA}xgk;Kudj6zdpY0i>%GuEp@<)F>q6d{Ts@%r^=@H|LI8%onWWjx(G?@GAqPzN# z_IwF`JVk!FJLm}ta`v7@ne5P+Kd@fwtA4k!b_ur!5pXasCww#;8JY>~+!aDgv~$;? zpjx*XfiyEKnI8}VIO8~2oU@t2V{)MnweHjlNh3bXUm=pDQI|zL4s7mAsuxIpV)lC) z^(!4xHZp!wyx;jm^@bHjB#R5|9NZ=2G%U+D>;!g}d{}eonB&;5tp2psR=jO9sn{{4$9jn7v!0`KMVPJ0 zWjzjBGZ86@KrN3E1mj(ZpcW=R3kk^d^p~+CaoNPMFbc4(nM~(YxEwiaBK7x4fg}pV z^lOx)32ZywVW3VoF}Ggk5pL;{&O|_inh7#s{fi=@oe%Vq25#9jniHm0R#Bi|V`O5A zX(Vhm)+7xeuSII5hIfgeXRlL75E{paXf*g#vWUT9S%!(tM6Aufg8Ata6zm~4X|H0j z%UCS-G7^BH)7ID5_nc*8WgIU+AF`YD^K~nYsE&p!51puRuyvp_8ZMoWt3g*JX!jrA5yYBJi zS~>5$c@Gb2%Z`%cGV6lo)1F7qu{Kqb3}ADSqD#fVC1o*^r!M_OkoDbQCPEmA`}|6_ z2aYaC4t%x66zZI`&@9c~zD1l_RhSDJYEGQ^dld3R^+YATsjj>nd`o(Ix^+|Fu7TPO zU7+Z_fu&_;aSTX!twPhZXU{$w3Ct_2MjCa_ ze89`GH7%(_KE&Crj66ht$!a8Ygf`Y;-@L@>FQ*x=A!!u!Q2t6xBspz4F+f)|HK5O# z?ZJ!>txyWoYql{GBmh@?cXY-MSIw{1E>vP~{>r}Eo-Ihs{(c!5833(|Y`p@MmX(!d zt2~qiA7bpR_q4k8sdo8J_&k47+Nqgz=awc|J

MImC;GGajKn>WtY){Ko6T(&BC ziGL9b4<0vp#Jg?<8}uL0>|~dhJ9R|Ru>!0>c$)F6G@fGI6NIR3)O^Wg$f{@jwEfb= zpm2nfzdz%JftJZ-GU#`aSf8TG%1UFB996i+#13RH7lq(=7)+WsN;S@^)EDnA(&rkR z2x2PxB6jI$R!AgOFS9sH)9PyaI&D71H$@aO=_yq^hRV(529!=4rb) zv)IGK9iP38^Y+J07I9OtcinJEMzn>7GRwN0p{9;b?*o7l4P9h|-ShNpJ~<`NJCv7} z)?1Ai1m6(PyVQSr{2Sk7cot)?_H*f*y`dpzM|I!P{$u%<8!qD84Xzgq%>BlAp;Y+O zKL=yRYR5lzs*3VpuI-A1kD%Y;@}8{1oW^rsEB;j3z~ynyUwtlZM+zlUocuOt`M#^z zKd|(j%PTl{dwaXRIf#6=b+o%gi#d;dlSB!l`6Ue$Qyxu#ZOo|`XdBEm3zD5|#?R?o zmkw4xP`s&HjYE)0*3J6!j2(=AeFn7Pc8kF#!LJ O0ead-S`}!=C;tQTl}Y;m diff --git a/gfx/exit.png b/gfx/exit.png index 090f3a111787251cfe972d7322d30b64f15c2312..c65c97116548acc4edd8e863a6c1d30fe26e20ab 100644 GIT binary patch literal 1898 zcmaJ?X;>3i6b%F^YA7O$s8rLis0f)%fJh<%5<(!#X26Pym@qRygk<7mC;?IlP-PM8 zf*Xps)uMo?SWyr)SioK4f_14|6h%b=>xK(c{(cvr|4-Xez4cu));g(l!>QVb#SU^E_~isaHnM2tw`^o6Go zUlNH-lSRkiF=3$`2$j>NMhsmoR}yRz$=6@4ltRe}PK`$rWeP5>>+mreRR(iuv%JF? zVah-xNfwfUAyFCO(NIP*#D;19epFvIhY*k>xRk1vrzlh$HJ8?}%OU2*Wq?NQhv3Ov z+NYvo!Xl}GD27nI>7E`C0|coo79I5RX0bqbDw6>+0S0liJU}mwH;coZLj8Qvh-?^~ zz!3|CpK}ormzIR%N)7;|rKQo+Jn1Nw2!L!h+o-{0dJqT?Rk{L~sy!4crvU{4qJl7) z5|^P0s!>rIkEY^W8d2$|Ey$H$WEHB5sHI8(q%(|L8UTic{XbML|AJQGV&rSR z|0%4BPFEs;7*V0A7(^Ugf|D_ok`ss_QXIviQ8ZPfaSwvv3YDJKM(|iynKX$DS^Tuwl|L@hY3qZQ;zBC`O&WIrOX5JTnE{w;H4gV*9SsNQETJa{eaLAd}? z3}8Iie;xF|65$@>^ownY;EVAQ1>ts#uyu)e-E`t>xg`?tqSeZx+3^Eczp~{I_+Y*P(VAXU|J*^Sat@x6RBt7jp_0ufg^enY54~T}*76n~&L* zo|jyusRkHAeykgbM!UMY^;oDNxnZsvd=9mYIV*2b}zZXT}T$Zx6_l}Vve5H zc#ix|&@a$wp3P1}vb7}J{|@-3WL9O9)>Ka_)0%aRTWq#meiAFI+hX}5N6HY~|7fB& zVYOeXQ!L*^Dlod3W4H{yuFp5P$WdQ(Vtg z;T3tPXU!Ue4dnwa^r^nA^{5|JIK;h=xwAD&Q}F_87-92Z-|l-gFB(pd99n$hx^_p3 zdiV66M=K*+C*)ByS*dxo`@AHhyL#s=sr>Wei6lv}qKvPll&E`hB^7c}bCyjOa1rby34!`;c&M7w8Z9CtN*Hhx! zY5ug=L4SJh=2a)g_?~suv_I8XLjl9f54Kr9>y32{sqNibY{D!*)($b9LXn)BDf3vl zR&}oY%+;InCbN19H`ptEPqJ;QW;V}%TuSM1Ga=WPwrE}MxUN6HLiCZbOA{Vq9^?Kp zt50um=q`YCQRU@2p;B;dtaZEWIOL}N6%KGYFk=;yzpA2j^`_ZJw|iQxpj4#@qr2gn zWk<$4=Icn4xIc|7HEau^IGCZ0+GiD_Z#&PbBaWB5n;x0pQtS6Rlilf^>j=Ti65?~d zyW?Ux4p=?$rnvE4WPzDvV(hSytoz$_^{RfBLAAhnWYii8z+vH zfUB)?lQ*O`ZK?En_WLl2zg|YO6?C0>|E_*%z4)Pb>(*@xw57-9*4>!6hI1@e0acM8 zZ98V#UK`gzu}B5Y9mxG&*Md3+35C%g&RJT#({{22*|~CqMV+<%jW@!Be816KSqKW8 z*#p97e0QZU0!r>P%bcnw#Vv|ZZj`^gNfM=Wl7rWL_>eu#(#H8nJ2Ia4xKF%2E4a~c z;F()yRC(}JIJPe#hvl&H|vlWwfo8X&F9zFn|w5LAgw)jAyGH=!C2$pPZSg` JsOC#@{sDuV@Qwfg literal 4236 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

jpqd(I=(C^<0w4 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 SuK$ey0000 diff --git a/gfx/icon.sys b/gfx/icon.sys index 7cf92d08f7aa566c4de4edd4783e8eeb2bddc056..861ab72295706b21525dbb1a1300b4ff569b9c95 100644 GIT binary patch literal 964 zcmWFtHgaKLkYWIV1R&-GVpSkc0%8zA=f?uYrUUVHkR%YG^MOM4NEoDq;p~|+`+#^a zn8U!ZA4r2RNFBqsFJJ6H_|bz0HXuI3|9^HXSFEr*cgDvK#O>|ju>;{l2M&PwhYmQ{ z!!Ss`DX(clQ)^RSQ+`uXQ(#keQ-4!qQwvaJ5=fRfkYA9amzkVLoMJ4h23kKBCyfe? Hpb!861sXpR literal 964 zcmWFtHgaKLU}FG*1|Y5l;(0)P0EqtsF*+Y8gcE?&yKNJ;2jcx88l(`)hVy~8fW;Ap zG}v$6WMu#8!v|Z4ScCn6{q{(Fgi4q^#0-czO?gfEP1#MUP5n(hO)X8WO_R{o6Xxd^ Yyz=!H4XP+}IwD@`bogRFWUgmzbb%7v|)QGJOh1uqwdZ=hE#?@Ah$ z@D`e2QuRp`|D4 zbI3pvX5bMPVShr&!h%is1@DSHf50%4T0?NpHWsie3GFHH1FQQ9wa^$SQ8zpXw$i^7 zB_GwSWj!^pZyAoDk9C`dL+;H3=-^mOCJ>iI7qG65SAvN$(8czINs~M&n{W)TYQM^N zYq1iwuWh4R<#@TCaR(S~mHn`U#_<;*7i_Dlo3z&@YWo*I0t^5zxkovr0iLt~0000< KMNUMnLSTY|63vzX delta 724 zcmV;_0xSLQ1MCHmB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01E2>01E2?f{P7W0000S zbVXQnQ*UN;cVTj606}DLVr3vkX>w(EZ*psMAVX6%akb+%0000MbVXQnLvm$dbZKvH zAXI5>WdJcUFEKJNF*UpJ(jou=0z^qfK~y-6t(4Dd>QE5IzkhR%p{-H`t8`N-#{J!> z;KhB2uVSCTO-0|qzDO6zGoHlCmNW2UX1u_B+&iTHN>2&&U9exZ#2nb1R>U%&!2wd02 zdcBT;oOA4UyMHf%G^r4VVGJUKfKmz}1Wt*V2%ODk`gA&lBuSu@!uNelCKGs`r+)<` z`F#FQsZ{#4A2W&~42MH~u~;;7x!irVTJ2t3T);FOl}RWm&#g6s5};Ll6Y; zJP!b%X&M~IA)kuUYPHbs_q+Lg{`YFNYVPypa#>RpMGeCcwrztk2G05Sc6fJp2gaEC zF_+8bRK^&V%Ox0NpPo}9u-$HBv)LR7FdmQf!C(MMk`6B5B(U9XV>B9dT-R+Di$$%` zXhelVL4UI>tNHTs(y=TH+wB&dbFA0vgKr|0N+q1n=LA4}w48IDbABMeXf(pp(^JQ? ztls72rIyKL)ZK0eA;e$MUgcV?1^_9;Fb-ZomSs&*6jca;)oKMvlHfQF48zcE+ioHu zQifpwz|lWlUtg=KR0@vcfKrMu43SQ!AxV;Yj7>SQLjVv$!1sMnO5^1VAx{2sqB;1! z56(F_=P_`z*~B~hF)$v1CJymwkRQ7-B*MWEmzp%qSRm+o?;|Wpi-P=y?QiZ0I%=_k99rjckmR7um)Awhbes4Y+S>gT!RO*tmhz& zSxjiOVN~NFuA>W;eg$`|>k@RL4da+W18!qOp@W;^dX}pL$M8(a#5MAhevI6kNLbei z>vwY>)FM*I;D5p2+=Kxo;acApUhjMv%TY>NqQula!FT=HG> zv=uz>5?sWz&;769uC?yIA11uTjJg7?ntrq9&-HE}EPqt+V(rzLig|hL((x*wcYRcE zxqEuv-{lkB91eOL9R-;_+cJt`m~m{6uM zS(q6!ic_fewA+kxTK}_nub>}r236iz&L93R?ZgS)y%8M_Q+j`gb$0L5qZHMftyYg; zDIVdX&hzoi`{b`9_u7Ulnzp27U{cGIc7HDBhPs3uaQ@b}ljR@9fHn~`3tO>Pqf2U3 yW-TY{#Y23``t_JYaJz&w{b}uVd3EwbfB^v2F&nA<=rnu)0000V>IRB3Hx09R#XATcl?O<{5%GB7bPATTyM zGc-CfH6Sf8H83!d7kdN%000McNliru+5-v;ClTvRaw`A;010qNS#tmY3labT3lag+ z-G2N4000DMK}|sb0I`n?{9y$E00Fp3L_t(Y$HiB@N(3sow|5-yB62s#j@zYEF zf16B-6kJ)a5=#S5C7nV`tIjqc65&2f@RiEGJch@^uYYE_3Om?qxZo=*mv4rar49+~ zec0g5P%^ba1Xqj-2^1vnbM z?273mspm=mdD3W4n&(L?T+-V9AG@09n|8HW`?)N&cx>9w+ni+Z#5el2;4+AJg`FOMtf)JA-_R6OyGevFru%OJmw Wb4ZYhvpfX=0000|?gp6b*|5YGm+q L^>bP0l+XkK#}z0( delta 581 zcmV-L0=oT+0p0|VB!4V)MObu0a%Ew3X>V>IRB3Hx09R#XATcl?O<{5%GB7bPATTyM zGc-ChG9WE5H83!e-%Jev000McNliru+5-v;CoHohJ~{vZ010qNS#tmY3labT3lag+ z-G2N4000DMK}|sb0I`n?{9y$E00Fg0L_t(Y$IX|&O2j}A#((oPK7fVxf?{bQ*IC(E z3YNZw)*Q(xdXjx3|Ugbnd-_HGli7YBxr&FuGOXJ=<- zqsUV}zl_{J8acZ#(mFA+e`JJlp1d>8ckH67*UFny0TdEXBEg!Q(rxS7f}>6^1^A+A(z)W`O4Z4Is2lK+jIO^A*M9) zxy87;>Q_1q>bRX%fJjx?8{>bV+d)9hsO&7{+dA$vG*y}H<1y4Qcvx7T`Osr{}tja%wBeK<&s T4`HMz00000NkvXXu0mjfc`pd8 diff --git a/gfx/load2.png b/gfx/load2.png index ba7a97066b301292bd8c8e488a50a37762bf1742..09fa3515d5d5c3994f2e74b09c18e76448d67ded 100644 GIT binary patch delta 820 zcmV-41Izr+1j`1HB!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0008* zNklQ7-B*MWEmzp%qSRm+o?;|Wpi-P=y?QiZ0I%=_k99rjckmR7um)Awhbes4Y+S>gT!RO*tmhz& zSxjiOVN~NFuA>W;eg$`|>k@RL4da+W18!qOp@W;^dX}pL$M8(a#5MAhevI6kNLbei z>vwY>)FM*I;D5p2+=Kxo;acApUhjMv%TY>NqQula!FT=HG> zv=uz>5?sWz&;769uC?yIA11uTjJg7?ntrq9&-HE}EPqt+V(rzLig|hL((x*wcYRcE zxqEuv-{lkB91eOL9R-;_+cJt`m~m{6uM zS(q6!ic_fewA+kxTK}_nub>}r236iz&L93R?ZgS)y%8M_Q+j`gb$0L5qZHMftyYg; zDIVdX&hzoi`{b`9_u7Ulnzp27U{cGIc7HDBhPs3uaQ@b}ljR@9fHn~`3tO>Pqf2U3 yW-TY{#Y23``t_JYaJz&w{b}uVd3EwbfB^v2F&nA<=rnu)0000V>IRB3Hx09R#XATcl?O<{5%GB7bPATTyM zGc-CiGaxN6H83#v0!JqR000McNliru+5-v;C?VW{l1&u-E%H- ze0~w%KN6o^5VuZ<_m7A%k0;(Sk9Fv|s>bUZap#=4xmOgdYxB^@zOhN)ySX(Q_$YD_ z><3OM;^!CQ<9~LTIEEYo9N*YFl;vMr?4}Bo;)f~{0OEw<1h##Kf;s!nFTLyrqP);G2mCabuw=jQ|p;gDQp!+di zy<(quKO9vHt>6EHmGUMd z#LErO2rtLP?{KpVJ~M7QZ?98vZ?E-_rS^ZdN&KaL10|nGjfbN+;s5{u07*qoM6N<$ Ef|Yyu9{>OV diff --git a/gfx/load3.png b/gfx/load3.png index 72efde3ecc81cd13ed8ae10db3f2f55ecad389b6..8ae9f6831a9c714ee036189d438334a9763bbba9 100644 GIT binary patch delta 110 zcmcb?(#<$QC0(+_HKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|SGur;B4q z#jQ7I4H+32IG7c-)<3VDeSn?og6FH#SCn_g=uJQUv|?gp6b*|5YGm+q L^>bP0l+XkK#DOR{ delta 575 zcmV-F0>J%?0oVkPB!4V)MObu0a%Ew3X>V>IRB3Hx09R#XATcl?O<{5%GB7bPATTyM zGc`IfF(554H83y)6*I~J000McNliru+5-v;C>3kDs{H@}010qNS#tmY3labT3lag+ z-G2N4000DMK}|sb0I`n?{9y$E00FN_L_t(Y$HiB@N(3b3z^lle zU_Wr8h+kfbPk(x0VhuS2IKWer?;TbXYsn$NQ(5d3Q<6J_yeELWnLKI`; zIJ7!=;vMr?4}Bo;MIVry%WXXB5f~5;;kLS&hs1jSCdFLw@vAsqfw%=>HAAvST?-6Zmo>12|vL_NRU|+7gzuQ N002ovPDHLkV1oWa|2_Z! diff --git a/gfx/load4.png b/gfx/load4.png index a14a9fb99ac8824ae5c92ef0a1ab50f8b4407b7d..09fa3515d5d5c3994f2e74b09c18e76448d67ded 100644 GIT binary patch delta 820 zcmV-41Izr|1j`1HB!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0008* zNklQ7-B*MWEmzp%qSRm+o?;|Wpi-P=y?QiZ0I%=_k99rjckmR7um)Awhbes4Y+S>gT!RO*tmhz& zSxjiOVN~NFuA>W;eg$`|>k@RL4da+W18!qOp@W;^dX}pL$M8(a#5MAhevI6kNLbei z>vwY>)FM*I;D5p2+=Kxo;acApUhjMv%TY>NqQula!FT=HG> zv=uz>5?sWz&;769uC?yIA11uTjJg7?ntrq9&-HE}EPqt+V(rzLig|hL((x*wcYRcE zxqEuv-{lkB91eOL9R-;_+cJt`m~m{6uM zS(q6!ic_fewA+kxTK}_nub>}r236iz&L93R?ZgS)y%8M_Q+j`gb$0L5qZHMftyYg; zDIVdX&hzoi`{b`9_u7Ulnzp27U{cGIc7HDBhPs3uaQ@b}ljR@9fHn~`3tO>Pqf2U3 yW-TY{#Y23``t_JYaJz&w{b}uVd3EwbfB^v2F&nA<=rnu)0000V>IRB3Hx09R#XATcl?O<{5%GB7bPATTyM zGc`IgGaxN6H83z81tkCg000McNliru+5-v;C?q;(s>c8T010qNS#tmY3labT3lag+ z-G2N4000DMK}|sb0I`n?{9y$E00FW|L_t(Y$HiB@N(3I)plvBSu>%jkMH$tJsz3=GRAlkeM1<|k{6 zr+j`9-#-$cT@d$9i1&|(F^(tRF^+lInOO4rMm#tt?(WSh=CyIyV_j|1_hGRc4ZMn6 z6zhQ#MEv|he1F_`6Z?=ufdf2m^4)`KVqbD7@Vs^`hB3)yLsk#qY|5_IfcvM!w|B)k zjz)zIo_NPN=3O5Md^HBN;F5)hJ>rKazjK2f>}?wW&rCYGToxL!VsFFzlZLiD#tw!b z_3{<#!~j-Svc_lXL191UN(Vme8>^Q32}sxlKDU^0 zYc0!DV=}4!h~R#1yUBpKtnH1Ace=!v*S}{L@~07*qoM6N<$f*BPx# diff --git a/gfx/load5.png b/gfx/load5.png index 9a219aa2987f74954a3b74dcbcb810c5d5359e13..8ae9f6831a9c714ee036189d438334a9763bbba9 100644 GIT binary patch delta 110 zcmcb>(#<$QC0(+_HKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|SGur;B4q z#jQ7I4H+32IG7c-)<3VDeSn?og6FH#SCn_g=uJQUv|?gp6b*|5YGm+q L^>bP0l+XkK!4W7h delta 567 zcmV-70?7S~0nh}HB!4V)MObu0a%Ew3X>V>IRB3Hx09R#XATcl?O<{5%GB7bPATTyM zGc`IhG9WE5H83!D*e)sn000McNliru+5-v;DF*f&+F}3z010qNS#tmY3labT3lag+ z-G2N4000DMK}|sb0I`n?{9y$E00E~-L_t(Y$IX|$O2j}A$A9xQK7fVxf?{bQ*IC(E z3YNZw)X42! zwvU5Bro)qO#*zCLhv+k z$7J=&JR1S65Bzj4*9t>J?b`yE?QtihC2B&Fr;ZM(C4V6dZsO`9dcsxQD>=d4TvhpT2}VTXe@wsi2N)l{x-rr6tUXk6Y;{ZtzcjcAD%Q7-B*MWEmzp%qSRm+o?;|Wpi-P=y?QiZ0I%=_k99rjckmR7um)Awhbes4Y+S>gT!RO*tmhz& zSxjiOVN~NFuA>W;eg$`|>k@RL4da+W18!qOp@W;^dX}pL$M8(a#5MAhevI6kNLbei z>vwY>)FM*I;D5p2+=Kxo;acApUhjMv%TY>NqQula!FT=HG> zv=uz>5?sWz&;769uC?yIA11uTjJg7?ntrq9&-HE}EPqt+V(rzLig|hL((x*wcYRcE zxqEuv-{lkB91eOL9R-;_+cJt`m~m{6uM zS(q6!ic_fewA+kxTK}_nub>}r236iz&L93R?ZgS)y%8M_Q+j`gb$0L5qZHMftyYg; zDIVdX&hzoi`{b`9_u7Ulnzp27U{cGIc7HDBhPs3uaQ@b}ljR@9fHn~`3tO>Pqf2U3 yW-TY{#Y23``t_JYaJz&w{b}uVd3EwbfB^v2F&nA<=rnu)0000V>IRB3Hx09R#XATcl?O<{5%GB7bPATTyM zGc`IiFd!{3H83#hf;Jie000McNliru+5-v;DH80)4j%vj010qNS#tmY3labT3lag+ z-G2N4000DMK}|sb0I`n?{9y$E00Fs4L_t(Y$IX|$N&`U<$A9l>d;kmW1;x@r(plM9 z3YNZwWh%AtqX;QPEVK|rLVPA1^DcYhCo=4vSNzmV^jY9B7G#?6u3`XinC}e!<#?4t{f24mioDfm4ivg=HPQtm*_0Xy8Tj zsrbMH%`?kjmF}Fg*A_FE!aOl|)oik~@@(h6X^Y&?GQbn>Ia%#uA>U$>o8cI)9u01W zqbuWf+d?EJH3F4ZHHMaWwbXO#ZM|?gp6b*|5YGm+q L^>bP0l+XkK%snVd delta 593 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 literal 8734 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 diff --git a/gfx/right.png b/gfx/right.png index 39544182c6b590dcc0d06c41f8524c329441903e..ce91652bfeb7ce18254295afe83336e5599af898 100644 GIT binary patch delta 467 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 J9*;~f`5VA2oD~27 delta 2972 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 Sw;{{`0000n-LE`~^1 zh*CB-J`##QKtf6>J4q8IQC4hFEUeg&jTL2WBS}eNujC^OG$IR)88XIPnXbh~HF zt(#^sr+%F~_q^x*I`4V!=$2(^icttm&6}Zv2yir}GSUjRxG6~`mZZ?)tSO%DvLc{; z5OU*04X6Y0G>Y9gkq4SpX;L|n;QZ~86T;4y$_Ycuf{}9~=R{UIVgB*n=g}1vdID~p zcml8B$D@uZn%FULlrn;-q^yVy%*QUM(ZGjICbciss0zSyrcQK$UJwQ=APD+_ zpXuBI)!+qOa!)PynUvcG4`3KHfIV;o#^{v6c@xC!g;@_az$s_~3!nqcFiM@#Pt#~> zbc0E*8_dESm;jH|8RAE51Pn4Wx>HRgxKIVw8EG5S8fWhhbC$mY;`yC2F){?k!6DeC zof}ZeEH0_8=rz481B+lvI@1zjNOhn|#Tejvkk2OnKZtQJ)q`KEB}XS3!8};wd3920 zlxKRvVigA3K@Vk$X;8?VGn-coq6Hj-0ourSazZXlu{cY`BGP5>#&=075XV#w`j~-R zZ~#X6Tga?}3(ghbj5YGf+K8}tGrFSxHhu*d0A#_FQn2?I6#xJL07*qoM6N<$f}kVs AGynhq literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<NS%LgXo-U3d9>b&;k6vVLcqutS;K{veD-sL5MK0fM zT+I4)Ly5wQuLiFiyks~I9Xoa`foGBgkHq3o+lbkJ7~ak=U9+1hG!^JN22WQ%mvv4F FO#pS?ZLa_T diff --git a/gfx/square.png b/gfx/square.png index 7b2d10a2fa2366624e9bf47e97f1d146a4988021..7c63346a03b9b32acb044eec7d315773bedcdb77 100644 GIT binary patch delta 481 zcmV<70UrLy3Ht+(B!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0004< zNklA7-el+T~_;1JndQm3{+ocew zEo3mwhz2XX$!fxKruw(EZ*psMAVX6%akb+%0000MbVXQnLvm$dbZKvH zAXI5>WdJcUFEKGMF*T`0earv=1RzO7K~y-6eUx2@RaF$ne}DUY-E;26o40XviWCd2 zAhGg6R4nL=9;3#{6eKHqiSbbgdhDs!kg#4NiQapyV1lR~3@LE1d{CL0d*^y*&N

w#Zn@|y`EAk@_qk}ef#!(s+4*-&vPb|N%zW?D|ut*?5fBdSRv8TfKhm+9!Ege1Bh{ zQtHs`?Cdwkjvd<>1OXQ>US#3YCA!@%Nt%-9Ij-Z-YPAqYvAneOZGWYI>~^4c8|=W` z+}sZ*-#r;!xNw2XmoHNlC4M8IwP_PYRZ^7|qijU4-+w0xL$*zCeS7=%?ZM*W;*kxG za|`y^(W6IyJaOVgG(Z0nEB!tXY~D=RY~lq0LD(P&LxN_AAB99wM4>B|yIrCvnw_4W zK7WVg!-o%lIX5@=ez(_Ss@3MjXZGU=h&I?tV~P@!<<#0BrAAxJAJ_io21Ty{VM?+<%*zntF9K8ey#^2pd#Yg_xSEtdK&Z zjK!@Xay+cxpcRHhegkV|!%aklAP5@GX7iMnW!b4TO(}|kR(liUEW_p{!!#vM6N)@1 z%O~VjNu@PnEFyvu0R>7athG3fgYWzAc*YpwI3|iB43;!WsLP5tj!B0px~wRQf~u&{ zT7M$~0yvIhV}&<%Sw!%(*1gea^iWk*)D8@j1d57uI3!I{Y+a+Z#u!6g*VMH^MAo}h zw;-NJRaIDPd!8}oOrGcGwK0gRn2g5Mm7zDd!P+nZ0j)K*t`QMN#e~vmKmiH`IF5tX znk>uCcx!8GOG>FY48sT2*r6&*T7H8U9)EwDtjtjY!n#hemT^_^?9Scme%zAjI1c0S z_@?W+OI}%)^PNs-!T0^cT5FQgkY2pX2QR&b!}`1wAXeB&DCP3|^}j%Y>$yxO6Otr3 zZH$>$B0{6lIM{Btf1a6{aV!G%mV*{V-8py%uu6fcaXc5-^H^M5>?KLET|{aJpnojO zU-LXamm~?E<5F9Ttu00@wOEX;*K;Bm1XI`GIyk<^N^d1klH`bp)c-kOQ52nPx7+Vc zO-;G3>td}%sr42&{u`mSW_2*Qwid_7MdX+J9oVN@t=8#Ir*j~RqP?Ey{RJBLM$$tHqD-Qd_8>~L z>3if`9O5z<+{rF{m^=63`JMCo{mz&zl}efUKJsPm?Z+0}#t>fMTP1?XmRX52*z5Uc zyuvUB@BpLuQt6fW8U>KUdTcbXF!<{zs6jmU*;IpwkFZ=*rX#C0C}Ot(zrmv@sHgat zW)Q#Ar#Pr^UWHXyhh1JD!(&qyf_s9uX#|lJ)UTDAcJPq81+G-kio58-xX-24;}h?To`QX&c|dbv*o=BF)cn;H z?B|3tyn~z0e6rH}#JC$$pS$LLy!_WY=Dh!Qw4fcIY^|c#LQ0le2lucY4LI+6ZD_P^ z`mK|FZdwcR0X_H;50*;^U>VMuiUPXrg4O8se%^sjq1QmdaSUs{AO6Nx)Zz$sc%D%D zq~i|-jN&v}(d6|Nc!r$cH{%8_;DFbLum{Z;L5tU~p)FyoSxGA~;no|r<)i4ZHS28E zB|f(kGkEWL#_!=@fRncIh}Wx3N8*tb#B!JU9FAjCw2bxUv)=7^$`)?I2Ge#J+pL|U z@6|;uKc~WchfB^Tw9X+5Y7s8_Gu~)%9`v0PSc%IPbH-ww@%&1;_Wmzg^rrv=0P(-_ UB8`Mk_5c6?07*qoM6N<$g8q9l`2YX_ literal 750 zcmVWdKHUX&^B&AWdO%ATls9Fd#5DIx;yrGBhA9Ff}kRd=FtO00007bV*G` z2igM+4FM=taaw5r000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP0006- zNkl@0hvaw-?ftf?A!kRA9JHcPb!t;Kp^^;tt*{>HLD z0$KrPvsv2hcC=ovX}{l7v)LraacH~U(&6Cq+Zyyid-{i1$o8gy<#L&3vzgzRPN)6y zWHO<_U_hJAhNjc0Dgz!167YEWt6sn?v=HwqfUQ<5@(+nbf|ALkD&uL&Di-*i)oOJF z@4Bvpe^bbu1w3V`RLU<)`1yQJwh6;)NHEEayb-|xTgS8OJi5T57x=cP%vBF$P?1(Xw? zg23dcBSUOneObU4*KW51P$mulVYX-g-xVv?NUZ#) z@C3ZG&|7xB>sBU{q2+R^Ab5L_5SMzg4(pNC)&j&t_rJ@{+tL$%*KzSEw&pqFwjH*= gtlbOdaW7raKf&EVl|Tw>#{d8T07*qoM6N<$f<2E*Pyhe` diff --git a/gfx/triangle.png b/gfx/triangle.png index b82bdfc02b2bfcec32960ffdf3986d7dbc27a1e4..67b62a250f7c1a38b3d1446ea703200315d8ec2a 100644 GIT binary patch delta 582 zcmV-M0=fO-3Eu>eB!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o00063 zNkl@93P!7xpg+L1L>pTO78Gq14Ht@TL}?Wjq%NeO zMK0XfDpxL~RqHmPrIHv?iby(RGvklz_pRsB%W1CTfe*~wdw;FDl!+=+@rOa|}fVEy! zBZD_C%bd$}5q~v4;CRr{XP3n&?xG>c(ofu#1U!cY1qeGm!g*c$sL3bGOm2@oi^w|M z)Z>P=TTyn8Ksia|x$x1tlv9S-ik$JU{{a7{C`yYi%ZDY>l2pjRlN? zrD?&wVGO;f#h!vT;}%BrKNF0N?7|vK3hcAXYPS^Kq<@y>AQte}Wtq_~+O!&8z>?}v z)DAd*>)(v09MGR U;ds+OLjV8(07*qoM6N<$g8Fb1bN~PV delta 1230 zcmV;<1Tp*H1mX#hB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01FZT01FZU(%pXi0000S zbVXQnQ*UN;cVTj606}DLVr3vkX>w(EZ*psMAVX6%akb+%0000MbVXQnLvm$dbZKvH zAXI5>WdJcUFEKGMF*T`0earv=1UgAXK~y-6eU!~>TxAr8pMUqg_s(agnPw&-*#)Y> zwpzg|)X<`oNLrPGQ7a9U#x7i>3n>);4RIj|U5E=2zXC!Qid876l{9ssm?qjZ1Us1- zGas3IXXf5J_v5%on_`VU`}1%(=XV|@BJ5U5siVWg!&CeA?Yo%GX6bgjIF7SXDwW=; z)oODh;_lk_Ab(IPbzp34?Cr_P$9Wn;|2i9WD2bf(wPkXRs#RUQ-sf*Buz{znI@ObuxC$>VzG$ld1$R) z9~c-o3xA+3%Njg%=+GtGwy|v+5kZKtEDIe4_Gqp?|G{qbk;*8U{^W0~Z_ zHA2UxK5+`w?GPg%fZB;1N~sYY1Od%vlSZR~M4gXR0IzwsumY=-XX za|CD3L2M8k0uiV%A{rc`G4To`pI#;~`>?b@*LAyE>pMzBC=?1a*}m+D`P?4R8t;+) zgr<3SJ=;5q@BO^Q0BEmE=GINLks^qClu#mGaa=@x{*S)2kr*%J^B?C6`O$PLNgQvFrBK8YqXd-JD5dE6J!;vGVsZ?qz skw{!r>V9}V&wJPR{W%f&VYj}20I@w&^++0aO#lD@07*qoM6N<$f;$vVivR!s diff --git a/gfx/up.png b/gfx/up.png index 76040923f64d7bffebf8e3a6b4457e648f5d1654..0394c3760edc3f87e7f02e228316cdcbf800f39d 100644 GIT binary patch delta 468 zcmV;_0W1E52JQopB!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0004y zNklWP?GU!JK zMsX;oWDxt9(B`OCrxu_Bo?r;uydJc4Q;mO;NGV)U!vC(lkg; z;y6WCu2r6M=#lHBXHMexMPoRZT{!mi&0@`TmQ96iNlne^?OChWf1ea5XeY~kAKJ1( zF|98aP+}zoR41q&2ihx3mDj2%pcV2L(1fHGuqZ|S88qQXfB^ty_(uee4%b8g0000< KMNUMnLSTYibJ`XF delta 748 zcmVUB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01E2>01E2?f{P7W0000S zbVXQnQ*UN;cVTj606}DLVr3vkX>w(EZ*psMAVX6%akb+%0000MbVXQnLvm$dbZKvH zAXI5>WdJcUFEKJNF*UpJ(jou=0$fQ%K~y-6t(4DB>Od66zklhpLNo>|5EjNwUAk~# z#vra~N_YrfgB3&{!8h<3T$Gg$(CFf>jeimrB#<^Vlqn@lkE`2zxloPfo@6#>W`3FT zojD&PBK*(L^ES%mGTq(XZR9(h4t(EddH1xu4a>5&<_*L6^o6;=pGGc_vF%l@R;!-@ z(=^?h|Eh_(z<=RzIJmvNUCVX5UBq!b_>@?wRDKB|NC-g}7Z)UipmMqF5)n+(>@}NB zy1&1t)6-Kb7K=S1!qL%@+h{aM2tj9OXLN9IK&ELD5rGLIs9vuF0Os>K0AMs4;qmdY zKOT>7N~MxpEEb*VbUH|qq-9xF&$jJr&N-4KK^(^b0DsqY5d;C#8Dkk}Hk*Ml2GcZg zetv#ksZ=h*Fl_y<=H%qWwQbu;(-gk%gL4ik<#r7jW7$g66gxXR;G8>uA3i)hbU5dj zPN(3UXXiJ7oO5WJ2F4gPO+y^Vczu0E6h&(dcz=H%JU>6fFpRYaYyhJuLKH=iQX&jP zyu7^N?SJj9KcCNA$H&L+)zuYMt5tV0nY5msp8Au?1k2?TQcBEbvrIAo(3Mj3@bJKZ zKc7}gIgnD`SeDgmx7!Zq9HmmpsaC5!-}i6!_xCUN_V%3BY6YcKCK&)QAp`*Ep69KN zfMr>(ZQG7g3Sk(+Fbo7i0MGLVzVEk?6T0Vl0A;W-PqkXj(RCd`5J1y3q-l!X-CY=l z;cR05(QsQRrLb5mvSu;Hpp^P@mUI1Zu~?+Sp>dh~>c&s@5hR#QH=k1c?xd2c8frLIe*I(eOmX z79K<`At8b$*4QdUgH)9umMW2^s(Ssu-0vonapumMxpU9l&VSr5`Q_%GnK}2IZ_e`n zzL~2>qfsr)mZgQ-Pj)hFQ(z`oX81l0 ztPaZ*=m=heo~H6fFbvcLeFPj7be=2+91r>wm<^UBI6eui4eAu=0N#TDA@6y7nc zrqn>L&$54pdWF_j!3dx^Jq!Hc?=4_1C^MaRn9H&ZO0hmcy`#Ws8wXHb7r`1o9q2Y<9kmT5NgJL!c!lMe{H1Kccv zJ-}!%2sDGo;FZma?Q71%O9xQcx(AFim7fJ0z)OW4lNCvMUO9mF-7BD-;Mf8%6cm9v zMGp83&an<=zz6`fJQXb?g#=LRn|#R_Sb6% z)N-6&DL8fpOqZM{UfXamMj)%-dF=qQDsWye&fyrP2XyHXtti5$@6fdl4&`Cz0)!X%MCp)B$~@IXa0C|c~gd*Fa# zhn>C$E`xF{_6*^ds&M$3pllsD;kFSrYfBRgo#%Xq?=l~F*taC}18y8}fg5F%pAl}{ zR)27vx1c{sw2LCjYTnLhL3_wLBrOsm-@tZ8GdY3g;u9X4)c7|Xw$@APkMAt1Xf)kW zk}XN%!ALnTT#2lj?;d51?sMj-mKVFTrgQ0Sk!6DNv~@sR&JL}x5J#eI>JckR+Q&;x zJIXPzRJo9Lk%TZ)432=WQF&_+lx_B)Eq{*jLJ3~uNRam7sZ62G)|hJ{b(Nb}Qn-QV zIdKGZ;T+;b*6W3u{euj>H9Np)^-K*XQF2($&f!HaqNUOEh*USEnZ?lyUNGr-!fuOX zg&sr)h*DRZEK+B`!{7j81}T&yfYzK6uwHO%A!~{*txX5Wk`Ky3i;YIO3L>i7rGM%* zIlA+=wf~AxRyS{C-*dHnALB}c1E;XuZke>PP jaL6s=fUrB@p8x{@$68w2+*;L)00000NkvXXu0mjfMs+}u literal 4736 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 HI>r76x@e`X From ac9dd9f2f07bdf2166621e3fe0f06bda32e93cfe Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 23 Oct 2016 06:58:03 -0700 Subject: [PATCH 002/269] Update all changes from OPL Daily Builds from BitBucket Repo https://bitbucket.org/Jay-Jay/opl-daily-builds/commits/ : * added ELF Launcher Menu (aka: ELM) -- it's a clone version of the APPS page in OPL, * added changes so both ELM and APPS support CFG data for INFO PAGE, * added a new Attribute feature where selected MODES can also be displayed on INFO PAGE, * updated LANG files, * plus a few miscellaneous tweaks (browse the OPL Daily Builds repo from BitBucket to learn more...). --- CHANGELOG | 2 +- DETAILED_CHANGELOG | 8 +- Makefile | 7 +- OLD_DETAILED_CHANGELOG | 1893 ++++++++++++++++++------------------ include/config.h | 4 + include/dialogs.h | 1 + include/elmsupport.h | 11 + include/ethsupport.h | 1 + include/hddsupport.h | 1 + include/iosupport.h | 1 + include/lang.h | 2 + include/opl.h | 1 + include/textures.h | 1 + include/usbsupport.h | 1 + lng/lang_Arabic.lng | 424 ++++---- lng/lang_Bulgarian.lng | 44 +- lng/lang_Czech.lng | 14 +- lng/lang_English.lng | 4 +- lng/lang_Filipino.lng | 22 +- lng/lang_French.lng | 278 +++--- lng/lang_German.lng | 86 +- lng/lang_Greek.lng | 26 +- lng/lang_Indonesian.lng | 12 +- lng/lang_Italian.lng | 14 +- lng/lang_Korean.lng | 424 ++++---- lng/lang_Laotian.lng | 10 +- lng/lang_Polish.lng | 20 +- lng/lang_Portuguese.lng | 24 +- lng/lang_Portuguese_BR.lng | 234 ++--- lng/lang_Russian.lng | 24 +- lng/lang_Spanish.lng | 32 +- lng/lang_Swedish.lng | 12 +- lng/lang_TChinese.lng | 10 +- lng/lang_Turkish.lng | 16 +- src/appsupport.c | 117 ++- src/config.c | 2 + src/dialogs.c | 11 +- src/elmsupport.c | 286 ++++++ src/ethsupport.c | 4 + src/gui.c | 25 +- src/hddsupport.c | 4 + src/lang.c | 4 +- src/menusys.c | 2 +- src/opl.c | 10 +- src/textures.c | 2 + src/usbsupport.c | 4 + 46 files changed, 2342 insertions(+), 1793 deletions(-) create mode 100644 include/elmsupport.h create mode 100644 src/elmsupport.c diff --git a/CHANGELOG b/CHANGELOG index bf83027b5..0ce812624 100755 --- a/CHANGELOG +++ b/CHANGELOG @@ -42,7 +42,7 @@ GUI: * Improved the behaviour of the auto-refresh option. * GSM moved to Game Options menu since its a Per-Game option now. * Infamous "Blockhead Grande" theme bug SQUARSHED! (Themes should now get loaded correctly, regardless of display settings). -* New logo design by Berion, new changed icons by El_Patas. +* New theme and logo design by Jay-Jay. * Better error reporting and help messages in general. * Network settings are now saved in opl_network.cfg. * Improved stability, design and UI responsiveness. diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 97b8ea2a1..4f85a0705 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,8 +10,12 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: -rev954 - Caio Oliveira - make_changelog.sh: Rework revision (see NOTE) - Sat Oct 22 18:37:18 2016 -0200 -rev953 - Caio Oliveira - OLD_DETAILED_CHANGELOG: Bring BitBucket changelog - Sat Oct 22 17:42:04 2016 -0200 +rev958 - Jay-Jay-OPL - change gfx files - Sun Oct 23 02:37:33 2016 -0700 +rev957 - Jay-Jay - Merge pull request #1 from ifcaro/master - Sun Oct 23 02:06:52 2016 -0700 +rev956 - Caio Oliveira - Makefile: Fix REVISION reported by @ElPatas and reforced by @ShaolinAssasin - Sat Oct 22 21:55:40 2016 -0200 +rev955 - Caio Oliveira - src/dialogs: Rework some minor issues - Sat Oct 22 21:55:40 2016 -0200 +rev954 - Caio Oliveira - make_changelog.sh: Rework revision (see NOTE) - Sat Oct 22 21:55:40 2016 -0200 +rev953 - Caio Oliveira - OLD_DETAILED_CHANGELOG: Bring BitBucket changelog - Sat Oct 22 21:55:40 2016 -0200 rev952 - Caio Oliveira - OPL: Fix GIT revision (see NOTE below) - Fri Oct 21 05:27:04 2016 -0200 rev951 - doctorxyz - Makefile: Git REVISION number via shell git log command - Thu Oct 20 13:48:36 2016 -0200 rev950 - Caio Oliveira - OPL: Update versioning to new scheme - Thu Oct 20 13:44:31 2016 -0200 diff --git a/Makefile b/Makefile index cc4b73007..5074ebc4c 100755 --- a/Makefile +++ b/Makefile @@ -64,9 +64,9 @@ OPL_VERSION = $(VERSION).$(SUBVERSION).$(PATCHLEVEL).$(REVISION)$(if $(EXTRAVERS FRONTEND_OBJS = obj/pad.o obj/fntsys.o obj/renderman.o obj/menusys.o obj/OSDHistory.o obj/system.o obj/lang.o obj/config.o obj/hdd.o obj/dialogs.o \ obj/dia.o obj/ioman.o obj/texcache.o obj/themes.o obj/supportbase.o obj/usbsupport.o obj/ethsupport.o obj/hddsupport.o \ - obj/appsupport.o obj/gui.o obj/textures.o obj/opl.o obj/atlas.o obj/nbns.o obj/httpclient.o + obj/appsupport.o obj/elmsupport.o obj/gui.o obj/textures.o obj/opl.o obj/atlas.o obj/nbns.o obj/httpclient.o -GFX_OBJS = obj/usb_icon.o obj/hdd_icon.o obj/eth_icon.o obj/app_icon.o \ +GFX_OBJS = obj/usb_icon.o obj/hdd_icon.o obj/eth_icon.o obj/app_icon.o obj/elm_icon.o \ obj/cross_icon.o obj/triangle_icon.o obj/circle_icon.o obj/square_icon.o obj/select_icon.o obj/start_icon.o \ obj/left_icon.o obj/right_icon.o obj/up_icon.o obj/down_icon.o obj/L1_icon.o obj/L2_icon.o obj/R1_icon.o obj/R2_icon.o \ obj/load0.o obj/load1.o obj/load2.o obj/load3.o obj/load4.o obj/load5.o obj/load6.o obj/load7.o obj/logo.o obj/bg_overlay.o obj/freesans.o \ @@ -570,6 +570,9 @@ eth_icon.s: app_icon.s: $(BIN2S) gfx/app.png asm/app_icon.s app_png +elm_icon.s: + $(BIN2S) gfx/elm.png asm/elm_icon.s elm_png + cross_icon.s: $(BIN2S) gfx/cross.png asm/cross_icon.s cross_png diff --git a/OLD_DETAILED_CHANGELOG b/OLD_DETAILED_CHANGELOG index 10ea66d0d..df870d2b2 100644 --- a/OLD_DETAILED_CHANGELOG +++ b/OLD_DETAILED_CHANGELOG @@ -8,945 +8,958 @@ Open PS2 Loader detailed ChangeLog: -rev940 - BLURT output (for debugging purposes) - Tue Oct 11 10:28:29 2016 -0300 -rev939 - I also like to commit in two-phases...:p - Mon Oct 10 01:20:59 2016 -0300 -rev938 - Optional FMV fix (enabled by setting UNALIGNED_BUFFER_PATCH to 0) - Sun Oct 09 21:06:03 2016 -0300 -rev937 - Minor changes - Fri Oct 07 11:54:10 2016 -0300 -rev936 - Auto Start Last Game fix - Thu Oct 06 16:43:19 2016 -0300 -rev935 - GSM: Improved DISPFBx and DISPLAYx patching (both enabled as default). IGS: Bitmap/TXT Files created with the same automatic number - Mon Oct 03 15:24:30 2016 -0300 -rev934 - GSM: Fixes and improvements on Core Flags and Skip Videos (FMVs) functionality restoration - Mon Oct 03 07:28:47 2016 -0300 -rev933 - IGS improvements - Sat Oct 01 19:08:01 2016 -0300 -rev932 - SP193: USB Fragmentation Check enabled as default - Sat Oct 01 18:11:28 2016 -0300 -rev931 - IGS: 24-bit Pixel Storage Size memory alignment fix - Wed Sep 28 18:45:51 2016 -0300 -rev930 - IGS: 16-bit Pixel Storage Size (PSMCT16 and PSMCT16S) fix - Tue Sep 27 21:17:43 2016 -0300 -rev929 - IGS source code refactoring (several improvements and fixes) - Tue Sep 27 06:11:30 2016 -0300 -rev928 - IGS some header/api fixes/improvements. - Mon Sep 19 11:57:49 2016 -0300 -rev927 - IGS (InGame Screenshot Feature) initial commit. Update on GSM version & credits. - Thu Sep 15 20:13:41 2016 -0300 -rev926 - GSM Core additions - Thu Sep 15 18:35:06 2016 -0300 -rev925 - Update languages - Thu Sep 15 04:32:32 2016 -0300 -rev924 - Changed old lang_Turkish_0.9.3.lng useless name - Thu Sep 15 02:00:27 2016 +0000 -rev923 - Changed old lang_TChinese_0.9.3.lng useless name - Thu Sep 15 01:59:37 2016 +0000 -rev922 - Changed old lang_Swedish_0.9.3.lng useless name - Thu Sep 15 01:58:48 2016 +0000 -rev921 - Changed old lang_Spanish_0.9.3.lng useless name - Thu Sep 15 01:58:05 2016 +0000 -rev920 - Changed old lang_Russian_0.9.3.lng useless name - Thu Sep 15 01:57:11 2016 +0000 -rev919 - Changed old lang_Portuguese_BR_0.9.3.lng useless name - Thu Sep 15 01:56:21 2016 +0000 -rev918 - Changed old lang_Portuguese_0.9.3.lng useless name - Thu Sep 15 01:55:33 2016 +0000 -rev917 - Changed old lang_Polish_0.9.3.lng useless name - Thu Sep 15 01:54:41 2016 +0000 -rev916 - Changed old lang_Laotian_0.9.3.lng useless name - Thu Sep 15 01:53:53 2016 +0000 -rev915 - Changed old lang_Italian_0.9.3.lng useless name - Thu Sep 15 01:52:59 2016 +0000 -rev914 - Changed old lang_Indonesian_0.9.3.lng useless name - Thu Sep 15 01:51:56 2016 +0000 -rev913 - Changed old lang_German_0.9.3.lng useless name - Thu Sep 15 01:51:10 2016 +0000 -rev912 - Changed old lang_French_0.9.3.lng useless name - Thu Sep 15 01:49:31 2016 +0000 -rev911 - Changed old lang_English_0.9.3.lng useless name - Thu Sep 15 01:47:57 2016 +0000 -rev910 - Changed old lang_Czech_0.9.3.lng useless name - Thu Sep 15 01:42:49 2016 +0000 -rev909 - Changed old lang_Bulgarian_0.9.3.lng useless name - Thu Sep 15 01:40:28 2016 +0000 -rev908 - Changed old useless name - Thu Sep 15 01:33:16 2016 +0000 -rev907 - GSM Internals: New SMODE1, SYNCH1, SYNCH2 & SYNCV macros; magic numbers on predef VModes replaced to their corresponding SYNCV values - Sun Sep 11 16:05:38 2016 -0300 -rev906 - GSM & Cheat Engine gardening - Sat Sep 10 07:36:08 2016 -0300 -rev905 - Cheat Engine: Warning instead of a message box, when no cheats have been found - Sat Sep 10 07:00:01 2016 -0300 -rev904 - Proper naming of VMC, GSM and CHEAT preprocessor conditionals - Sat Sep 10 06:46:16 2016 -0300 -rev903 - VGA GSM vmode adjustments - Mon Sep 05 02:29:10 2016 -0300 -rev902 - VGA GSM vmode fixes - Sat Sep 03 09:45:58 2016 -0300 -rev901 - Re-added several VGA GSM vmodes for better game compatibility - Tue Aug 30 16:57:49 2016 -0300 -rev900 - ConsoleRegion functionality fix - Mon Aug 29 07:27:19 2016 -0300 -rev899 - Rollback changes made to delay() for avoiding BSOD - Fri Aug 26 15:34:41 2016 -0300 -rev898 - Some revisions on Makefiles - Fri Aug 26 12:03:54 2016 -0300 -rev897 - EE Core debug message bugfix - Fri Aug 26 11:59:48 2016 -0300 -rev896 - PS2Logo (less time on its GUI debug warning messages) - Fri Aug 26 11:57:15 2016 -0300 -rev895 - PS2Logo bugfix - Fri Aug 26 11:54:51 2016 -0300 -rev894 - 'Playstation 2' boot logo GUI setting (on/off) - Thu Aug 25 21:01:42 2016 -0300 -rev893 - Gardening - Thu Aug 25 14:22:26 2016 -0300 -rev892 - IGR: Green and Blue Debug Colors adjust - Mon Aug 22 10:13:15 2016 -0300 -rev891 - IGR: Yellow Debug Color adjust - Mon Aug 22 08:31:19 2016 -0300 -rev890 - PS2LOGO improvements and new GUI Warning messages - Fri Aug 19 20:55:58 2016 -0300 -rev889 - guiWarning: tweaks for displaying multi-line strings - Fri Aug 19 20:42:22 2016 -0300 -rev888 - New Makefile variable (for developers) - Fri Aug 19 20:36:58 2016 -0300 -rev887 - PS2LOGO flag fixes (in Makefile) - Sun Aug 14 08:41:36 2016 -0300 -rev886 - IOP Memory Usage Warning (works together with Debug Colors). - Sat Aug 13 19:51:42 2016 -0300 -rev885 - Functions added: guiWarning(GUI) & delay(Util) - Fri Aug 12 11:42:28 2016 -0300 -rev884 - 'Playstation 2' boot logo & startup sound - l_oliveira's code optimizations - Tue Aug 09 00:00:44 2016 -0300 -rev883 - SP193: PS3 BC(Backwards Compatible) fixes - Mon Aug 08 16:19:43 2016 -0300 -rev882 - 'Playstation 2' boot logo & startup sound - Mon Aug 08 10:21:15 2016 -0300 -rev881 - Reduced PS2RD string size in About Screen - Sun Aug 07 18:18:13 2016 -0300 -rev880 - Updated for compiling with latest PS2SDK revision - Thu Aug 04 15:33:21 2016 -0300 -rev879 - () Turns out Hommi's ASM is in the PS2SDK as "Exit(0)" so replicating it here - Sat May 14 12:29:00 2016 -0400 -rev878 - (*) Changed the "sysExecExit()" function call, reverted it to Hominem's - Sat May 14 00:28:03 2016 -0400 -rev877 - GSM 0.38 Core readded (now fully PS2RD compatible)* - Tue Jan 05 05:19:55 2016 -0500 -rev876 - Restorations and addtions - Wed Dec 23 13:00:14 2015 +0100 -rev875 - About Menu: Credits added - Wed Nov 04 18:48:54 2015 -0500 -rev874 - Updated changelog - Wed Nov 04 02:16:05 2015 +0100 -rev873 - lang_Turkish.lng deleted - Wed Nov 04 00:38:44 2015 +0000 -rev872 - lang_TChinese.lng deleted - Wed Nov 04 00:38:17 2015 +0000 -rev871 - lang_Swedish.lng deleted - Wed Nov 04 00:37:48 2015 +0000 -rev870 - lang_Spanish.lng deleted - Wed Nov 04 00:37:21 2015 +0000 -rev869 - lang_Russian.lng deleted - Wed Nov 04 00:36:55 2015 +0000 -rev868 - lang_Portuguese_BR.lng deleted - Wed Nov 04 00:36:21 2015 +0000 -rev867 - lang_Portuguese.lng deleted - Wed Nov 04 00:35:45 2015 +0000 -rev866 - lang_Polish.lng deleted - Wed Nov 04 00:35:19 2015 +0000 -rev865 - lang_Laotian.lng deleted - Wed Nov 04 00:34:36 2015 +0000 -rev864 - lang_Italian.lng deleted - Wed Nov 04 00:33:50 2015 +0000 -rev863 - lang_Indonesian.lng deleted - Wed Nov 04 00:33:12 2015 +0000 -rev862 - lang_German.lng deleted - Wed Nov 04 00:32:35 2015 +0000 -rev861 - lang_French.lng deleted - Wed Nov 04 00:31:25 2015 +0000 -rev860 - lang_English.lng deleted - Wed Nov 04 00:30:21 2015 +0000 -rev859 - lang_Czech.lng deleted - Wed Nov 04 00:26:29 2015 +0000 -rev858 - lang_Czech.lng deleted - Wed Nov 04 00:24:03 2015 +0000 -rev857 - lang_Bulgarian.lng deleted - Wed Nov 04 00:23:36 2015 +0000 -rev856 - lang_Arabic.lng deleted online with Bitbucket - Wed Nov 04 00:19:25 2015 +0000 -rev855 - Updated languages - Wed Nov 04 01:07:43 2015 +0100 -rev854 - Update languages - Sun Oct 25 13:05:27 2015 +0100 -rev853 - writeMCIcon MC Folder Creation fix - Reported by Grahf, fixed by SP193 - Fri Oct 23 13:30:20 2015 -0400 -rev852 - Change version to 'OPL 0.9.4 WIP', re-enable development build flag - Fri Oct 23 04:16:22 2015 -0400 -rev851 - Added tag 0.9.3 for changeset 9b5321def22d - Wed Oct 21 00:59:28 2015 -0400 -rev850 - Massive language update: Arabic, Brazilian Portuguese, Bulgarian, French, Portuguese, Russian, Spanish and Traditional Chinese. - Wed Oct 21 00:49:42 2015 -0400 -rev849 - Updated: Polish language - summary: Massive language upArabic, Brazilian Portuguese, Bulgarian, French, Portuguese, Russian, Spanish and Traditional Chinese. -rev848 - About Menu: Contributors added, followed by case-insensitive sorting - Mon Oct 19 16:16:25 2015 -0400 -rev847 - SP193 - Fixed renaming functionality for USBExtreme games + DEV9 will not be activated unless either Ethernet or ATA is used: - Mon Oct 19 15:37:15 2015 -0400 -rev846 - Jay-Jay'n'gledson999:Portuguese BR language fix - Sat Oct 17 21:47:36 2015 -0400 -rev845 - Updated Portuguese BR language - Thu Oct 08 01:45:29 2015 -0400 -rev844 - SP193: HDD unit will be checked for fonts only if HDD support is set to AUTO. - Mon Oct 05 14:07:48 2015 -0400 -rev843 - Added Traditional Chinese language (It was missing in r840... Sorry) - Mon Oct 05 08:33:33 2015 -0400 -rev842 - Update German Language and Update Theme Icons - Sun Oct 04 20:55:55 2015 -0400 -rev841 - Readded width specifiers on Game Settings Page. Let's help each other and work as a team ;-) - Sun Oct 04 05:21:30 2015 -0700 -rev840 - Translations Updated (French, Portuguese BR and Spanish) and Added (Traditional Chinese). Let's help each other and work as a team ;-) - Sun Oct 04 06:51:43 2015 -0400 -rev839 - Update Language Translation Files - Sun Oct 04 06:34:32 2015 -0400 -rev838 - Update Language Translation Files - Sat Oct 03 17:12:30 2015 -0700 -rev837 - Newest SP193's 0.9.3 patch - Mode x Labels :-) Remember guys we still need updated language files for 0.9.3 :-( - Sat Oct 03 13:54:36 2015 -0700 -rev836 - Here is SP193's 0.9.3 patch :-) But we still need updated language files :-( - Sat Oct 03 07:07:24 2015 -0400 -rev835 - Update Spanish translation - Sat Oct 03 02:06:26 2015 -0400 -rev834 - About Menu: Credits listed in alphabetical order - Wed Sep 30 20:46:49 2015 +0200 -rev833 - Deleted: scripts/out.txt - Tue Sep 29 21:16:38 2015 -0400 -rev832 - Auto Start Last Game - Configureable Countdown : Value in second(s), 0 to disable auto start - Tue Sep 29 08:20:27 2015 +0000 -rev831 - Fixes for VMC (compilation warning) and Auto-start Last Game (bugs and conflicts) - Mon Sep 28 10:43:25 2015 -0400 -rev830 - Auto-start feature fix - Wait for pending operations to finish - Sun Sep 27 21:09:19 2015 -0400 -rev829 - Added Autostart toggle for Last Played Game feature: When enabled, starts the chosen game automatically within a few seconds - unless the user presses any valid key. - Wed Sep 23 14:00:43 2015 -0400 -rev828 - OPL Spanish translation by El_Patas - Wed Sep 23 05:16:42 2015 -0400 -rev827 - update language files and also fonts - Sat Sep 19 06:55:27 2015 -0400 -rev826 - update language files - Thu Sep 17 01:21:16 2015 -0700 -rev825 - Now Last Played Game feature starts the chosen game automatically within a few seconds - unless the user presses any valid key. - Sat Sep 05 22:05:46 2015 -0700 -rev824 - Rollback: removed FAT driver from in-game. New universal system added to support non-standard sector sizes. - Thu Sep 03 02:54:19 2015 -0400 -rev823 - Added support for downloading compatibility entries through the Internet from the OPL-CL service. - Sun Aug 30 02:46:25 2015 +0800 -rev822 - Removed locking semaphore for game list, GUI OPs will now be cleared before the menu is cleared prior to game list updating (so that old commands will not be executed) and added checks for file-open problems under USB support. - Fri Aug 21 18:52:47 2015 +0800 -rev821 - Updated to support the new PS2SDK changes (SIF CMD buffer set, USBHDFSDV SIF CMD ID changed to 0), USBHDFSD IOCTL codes consolidated into usb-ioctl.h, standardized which "prefix" buffer to use within usbsupport.c (was unable to access game files when a prefix is set, due to the path getting incorrectly generated), removed cdrom_lseek64 as it is not implemented in the SONY CDVDMAN, changed cdrom_dclose to become cdrom_close since close() and dclose() are the same here and SONY does it that way too, simplified cdrom_lseek to be more tolerant to errors like the SONY original, adjusted CBT to apply to reading operations as well, adjusted CBT to be 5000us, adjusted speed limit for Accurate Reads to 2800KB/s (timed to the 36.864MHz IOP clock). - Sat Aug 15 18:03:17 2015 +0800 -rev820 - update lang Arabic; new lang Portuguese-Brazilian. - Sat Aug 15 12:59:47 2015 +0800 -rev819 - updated lang Arabic 90% translated; new lang Portuguese-Brazilian 100% translated. - Wed Aug 05 21:05:54 2015 -0700 -rev818 - Merged ifcaro/open-ps2-loader into default - Wed Aug 05 20:51:23 2015 -0700 -rev817 - Update LNG files to support OPL r813 changes, removed obsolete LNG files that need an overhaul. - Mon Aug 03 22:15:17 2015 -0700 -rev816 - Merged ifcaro/open-ps2-loader into default - Mon Aug 03 18:29:26 2015 -0700 -rev815 - Update LNG files credits and dates for OPL r811. - Sun Aug 02 20:14:16 2015 -0700 -rev814 - Re-added 'VGA 640x480i @60Hz' again GSM vmode for better game compatibility (avoid BSOD/freezing/no signal on certain games and VGA monitors) - Sat Aug 01 16:37:38 2015 -0700 -rev813 - Merged the CallBack Timer setting into Accurate Reads compat mode (applies to everything other than reads), new compat mode (High module storage @ 0x01C00000), EE core linkfile adjusted to have the stack before _end for better manageability, EE core will now always reset stack pointer to _end, and fixed blockSize within fat.c overflowing (resulted in extremely poor performance). - Mon Aug 03 22:40:45 2015 -0400 -rev812 - Fixed VMC size parameter for USB support, simplified LSN calculation for the first phase of cdrom_read() since integer division will truncate anyway, changed stray memcpy() call in fat.c to mips_memcpy(), fixed (updated) the delete and rename functions within supportbase, and fixed updating of the game list under USB mode after an item has been deleted/renamed. - Mon Aug 03 03:31:02 2015 +0800 -rev811 - Merged in Jay-Jay/open-ps2-loader (pull request #23) - Mon Aug 03 01:13:56 2015 +0800 -rev810 - Update more LNG files. - Sun Aug 02 03:39:44 2015 +0800 -rev809 - restored Makefile changes to default from last pushed commit, sorry - Tue Jul 28 13:29:14 2015 -0700 -rev808 - added a new word to LNG SRC files so it can be used to replace the word SETTINGS in the footer of main page so it can abbreviated in the LNG files without affecting the same full word in other areas; updated LNG files to include new changes in recent commits; French LNG updated 100% translated. - Tue Jul 28 09:13:12 2015 -0700 -rev807 - Imported fixes for SMAP (wrong watermark value) and IOMAN (incorrect declaration for lseek) stuff, fixed GSM extension's "ok" button, added patch entry for SRW IMPACT LE, removed NBNS's Rules.make file in favour of the common one, and adjusted in-game FAT driver's parameters and strategy to improve seeking performance. - Tue Jul 28 09:08:30 2015 -0700 -rev806 - Merged in Jay-Jay/open-ps2-loader (pull request #22) - Sun Aug 02 03:38:49 2015 +0800 -rev805 - Updating some LNG files. - Tue Jul 28 20:11:29 2015 +0800 -rev804 - Added missing files from previous commit, removed leftover SMB DMA address definition (disused since long ago) and removed leftover code that updated ReadPos (is now updated by CDVDMAN itself, not by the individual drivers). - Mon Jul 27 01:46:03 2015 -0700 -rev803 - Added a small FAT driver to in-game USB support. USB support no longer needs total disc image defragmentation and all sector sizes should be supported. - Tue Jul 28 15:39:25 2015 +0800 -rev802 - Changed game list-locking mechanism to use a semaphore, game list will now be locked when updated and drawn (mutually exclusive operations), deferred GUI operations will be cleared when the GUI is to be suspended (otherwise a crash might result because the requests would be for the previous GUI instance), fixed ELFLDR (wrong compile-time flags, hence IOP reset missing) by removing the RESET_IOP option, re-ordered code that checks for outstanding deferred GUI operations (guiHandleDeferredOps) to prevent potential crash if the linked-list is modified as it waits for the list to be unlocked (not done here, but IF), lowered the priority of the running thread to 90 in ioBlockOps() as it was starving lower-priority (NETMAN) threads, and removed redundant calls to SifInitRpc() in sysExecElf and sysLaunchLoaderElf. - Tue Jul 28 14:21:03 2015 +0800 -rev801 - Refactored config reading system to allow reading of config file from RAM (for future use), fixed IOMAN crashing due to the request list being set to NULL as it waits for the process sema to be released, fixed OPL getting stuck if HDLDump server could not be started, refactored directory-creation system to be unified and without the need for a redundant check, changed GSM controls to become read-only if GSM is disabled, completed moving the GSM stuff into pggsm.h, added missing "childproof" target into Makefile, consolidated the different IO handler types into opl.h, updated to build with the latest PS2SDK revision, added support for DNS (for future use and manual static setting will not be saved!), added a setting into opl.h that determiens whether the OPL source is a development version, blocking I/O operations in IOMAN will no longer pause I/O execution (oustanding I/O operations will be completed), the I/O request sema will be locked when the number of I/O requests are counted, error messages will now be cleared when HDLDump server is started, failures to start the HDLDump server will be stated, CFG folder will now be "CFG-DEV" instead for development builds, changed config-handling code to use the limits from config.h for key and value management, and changed network initialization to prevent deadlocks that occur during simultaneous initialization of HDLDump and SMB support. - Mon Jul 27 05:12:21 2015 +0800 -rev800 - Fixed SMB auto-refresh (CD, DVD and USBExtreme lists checked one-by-one) and refactored code in CDVDMAN and MCEMU for better coherency (USB, SMB and HDD-split up into individual files, for as much as possible). - Sun Jul 26 03:40:05 2015 +0800 -rev799 - BUGFIX: Replaced all calls (and related macros) to the FILEIO RPC service with FILEXIO. OPL is intermittently unstable when listing games, as the rom0:FILEIO module does not suspend interrupts before the DMA transfers for the dread() and getstat() functions (SONY BUGBUG!!). - Sun Jul 12 20:40:11 2015 +0800 -rev798 - Fixes: Added check for streaming status into CDVDMAN streaming system (for games that read after starting streaming), fixed broken CDVDMAN debug build, changed ambiguous debug strings in CDVDMAN, fixed length checking of ISO filenames and improved on error-handling code in supportbase.c. - Sat Jul 11 03:25:55 2015 +0800 -rev797 - Fixed and enhanced streaming support: - Sat Jul 11 03:17:13 2015 +0800 -rev796 - Consolidated error codes, added error codes for HDD mode, sync'ed with updates to HDD and PFS from PS2SDK, added workaround for clone/compatible network adaptors and corrected UV coordinates for texture-drawing. - Sun Jun 28 18:18:52 2015 +0800 -rev795 - Fixed NBNS support (unable to resolve NB names after first attempt), revised timeout clock value and adjusted code to prevent some other race-conditions from occuring, adjusted SMB support initialization code to always retry until the link mode can be set successfully, changed link mode setting and DHCP completion-checking intervals to 1 second (reduce strain on IOP), link mode will now be set once at initialization before the TCP/IP stack is initialized (avoid double-initializing the SMAP). Updated to support the new PS2SDK revision. - Sat Jun 20 20:06:02 2015 +0800 -rev794 - Fixed SMB intialization when built within VMC support, by moving the SMB initialization function into the "oplsmb" export table. - Tue Jun 16 21:50:14 2015 +0800 -rev793 - Moved SMB authentication code into a SMBINIT IOP module, so that SMB code can be modular and won't be part of the EE core itself. Fixed support for the USBLD format under SMB mode, renamed mode 5 to "Emulate DVD-DL", fixed filesystem selection within cdvdman_findfile() for mode 5, fixed NBNS support to check against the transaction ID as specified in the RFCs, changed the EE-side libnbns library into a normal C file for simplicity, and lowered the module storage region so that the occupied region will be as low as possible since SMB authentication code is now in an IOP module. - Sat May 30 13:02:35 2015 +0800 -rev792 - Rolled back the new changes to the UI's behaviour, added error-reporting code (reports READCF* errors) to reading functions within CDVDFSV, got ReadIOPM and ReadChain functions within CDVDFSV to report read progress to the EE library, added a new workaround for the SIF becoming unusable after an IOP reset with ongoing DMA transfers. - Thu Apr 16 21:59:05 2015 +0800 -rev791 - Updated to use the new SIF register definitions, to support automatic screen switching and hiding, USB, HDD and APP modes are now always enabled, added a toggle for hiding advanced network options, fixed CDVDFSV initialization (Initializing SIF on the main thread causes the IOP reset to stall; refer to SCE docs), fixed open(), dopen(), read(), dread() and getstat() to first wait for the, drive to become ready (and for read, forever attempt to read) to be in-line with the original behaviour of CDVDMAN, DEV9 will no longer be powered-off during IGR, the SIF register BOOTEND flag will now be cleared before every IOP reset, within the EE core to ensure correct behaviour, updated network support to ensure that timeouts are accurate regardless of the current video mode. - Sun Mar 29 16:35:13 2015 +0800 -rev790 - Updated to support the new PS2SDK revision, changed module management so that only the necessary modules will remain resident in-game, changed unloadPad() to call padEnd() instead of padReset() in order to actually stop the PADMAN RPC service, re-added the "ei" instruction to crt0, fixed the logic that determines whether the IP address config has been changed (When DHCP is enabled, re-arranged the EE core so that modules (0x0009A000) will now be stored after the EE core (0x00088000). - Sun Mar 22 19:14:28 2015 +0800 -rev789 - Updated to work with the new update to the PS2SDK (mainly with the renaming of the EE PS2IP over SIF RPC library, ps2ip, to ps2ips). - Tue Mar 03 21:35:40 2015 +0800 -rev788 - Changed OPL to use NETMAN and PS2IPS for full control over the network subsystem, SMAP (re-)initialization will no longer be done whenever unnecessary (valid link state = not needed) and renamed "smap" to become "smap-ingame". - Sat Feb 28 21:32:31 2015 +0800 -rev787 - Updated to support the new PS2SDK PS2IP module (LWIP v1.4.1) and updated PS2ETH SMAP driver, while yet maintaining support for the (in-game) SMSTCPIP stack which was based on an ancient version of LWIP. - Sat Feb 28 15:58:29 2015 +0800 -rev786 - Added support for the NBNS protocol, added functions for changing the visibility and type of UI elements without hardcoding the element's index number, changed the keyboard to hide passwords, and adjusted language string and some function names. - Sat Feb 28 14:38:40 2015 +0800 -rev785 - Added patches for Oneechanbara, Ratchet and Clank: Up Your Arsenal and updated SMAP. - Sun Feb 22 16:24:52 2015 +0800 -rev784 - Removed space-filler code in EESYNC, which is found only in some EESYNC versions, presumed to make up for the lesser space taken up by a Debug SECRMAN module. The export table has been removed too, as no module ever links with it. - Fri Feb 20 13:44:46 2015 +0800 -rev783 - New compatibility mode 1 (accurate reads) and the user callback will no longer be called during streaming (incorrect behaviour). - Fri Feb 13 15:28:26 2015 +0800 -rev782 - Fixed IOP resets with command lines that are not NULL-terminated (e.g. SOCOM games), added path-purification for cdrom_getstat(), "untweaked" the TCP/IP stack for GUI mode (better performance), fixed screen rendering (screen cut-off) under 480P mode, fixed default-theme scaling, added/fixed missing/incorrect UI hints. - Fri Feb 13 15:23:56 2015 +0800 -rev781 - upload new background image - Sun Feb 01 21:22:41 2015 +0800 -rev780 - Merged ifcaro/open-ps2-loader into default - Wed Jan 28 23:09:41 2015 -0800 -rev779 - remove background image to be able to sync with ifcaro repo - Wed Jan 28 22:59:46 2015 -0800 -rev778 - upload new background image - Wed Jan 28 22:59:06 2015 -0800 -rev777 - replace old background image - Wed Jan 28 22:35:58 2015 -0800 -rev776 - include bg_overlay.png background image - Wed Jan 28 22:31:55 2015 -0800 -rev775 - Merged ifcaro/open-ps2-loader into default - Tue Jan 27 23:35:32 2015 -0800 -rev774 - Merged ifcaro/open-ps2-loader into default - Sat Jan 24 03:21:25 2015 -0800 -rev773 - update opl.icn made it smaller in size with help from sav3r and updated icon load png files to match new modified opl logo key - Tue Jan 20 15:12:41 2015 -0800 -rev772 - made opl.icn smaller in size with help from sav3r and updated load png files to math new OPL logo key - Mon Jan 19 01:39:50 2015 -0800 -rev771 - Updated to compile w/o warnings on new PS2SDK revision, modified GUI to support loading of embedded resources for the internal theme, added menu hints, added an option for changing the select button. - Mon Jan 19 01:32:13 2015 -0800 -rev770 - Increased buffer size for path parsing to 32-bytes to handle slightly-malformed paths like how SCE does, fixed broken debug printf() statement, removed unnecessary checks that should be only used for debugging (as SCE doesn't perform them), added an additional backslash to SMB paths for compatibility with some SMB servers and changed the ELF-loading error screen (white) to be always shown regardless of the debug enabled/disabled setting. - Wed Jan 28 23:18:46 2015 +0800 -rev769 - Changed cdrom_open() to set f->mode to O_RDONLY for games that fail to specify O_RDONLY, re-adjusted the path-sanitizing code to function from only cdrom_open() in order to not affect cdrom_dopen(), and corrected non-compliant behaviour of (in-game) SMB support. - Thu Jan 22 21:39:00 2015 +0800 -rev768 - Fixed DVD-DL parameter passing for USB and SMB modes, fixed ISO filename handling (ISO file name without the startup file name) in USB mode. - Tue Jan 20 20:13:51 2015 +0800 -rev767 - Merged ifcaro/open-ps2-loader into default - Sat Jan 17 18:30:20 2015 +0800 -rev766 - update logo.png in gfx folder - Fri Jan 16 23:29:57 2015 -0800 -rev765 - made new gfx icons, removed logo.old, change default theme background color. - Tue Jan 13 01:39:53 2015 -0800 -rev764 - add missing logo.old to gfx folder - Fri Jan 02 13:28:22 2015 -0800 -rev763 - clean up old gfx files - Wed Dec 31 14:32:48 2014 -0800 -rev762 - Merged ifcaro/open-ps2-loader into default - Wed Dec 31 14:16:10 2014 -0800 -rev761 - Merged ifcaro/open-ps2-loader into default - Wed Dec 31 14:02:07 2014 -0800 -rev760 - delete logo.old_old file from gfx folder - Wed Dec 24 08:33:10 2014 -0800 -rev759 - update gfx artwork - Wed Dec 24 03:17:31 2014 -0800 -rev758 - Replaced the path-sanitizing code with something closer to the SCE-original, and fixed cdrom_dread() to NULL-terminate the filename. - Wed Dec 24 02:55:10 2014 -0800 -rev757 - Fixed DVD-DL detection over SMB for images >4GB, fixed DVD-DL handling for USB and SMB, updated OPL to support the new GCC 3.2.3 toolchain. - Sat Jan 17 12:22:24 2015 +0800 -rev756 - Fixed USBD module loading, DVD9 detection, one printf string in CDVDMAN (potential use of uninitialized pointer) and EP's name in the credits. - Sat Jan 17 12:17:15 2015 +0800 -rev755 - Prototype attempt at fixing DVD-DL support within PS2ESDL for USB and SMB modes. - Sun Jan 11 14:22:16 2015 +0800 -rev754 - Fixed UI freezing while user cycles through the games list, rolled back changes to the rename() function of the APA driver, integer values in the UI can now wrap around, changed module loading for better performance, fixed theme loading from USB devices, users no longer have to name their ISO images in a specific format and removed debugging code from regular OPL builds. - Sat Jan 10 23:08:56 2015 +0800 -rev753 - Aaand the Scheisse-Kopf Award goes to yours truly. For having convinced a sick - Sat Jan 10 13:47:04 2015 +0800 -rev752 - Removed broken game label in GSM screen; removed developer comments. - Sun Dec 28 07:57:58 2014 -0500 -rev751 - Fixed cheats support again, renamed the extension to .CHT from .cht (to be uniform with the naming convention of other OPL-related files), and corrected boundary-limiting when printing the path to the cheat record file in all modes. - Wed Dec 24 12:28:28 2014 -0500 -rev750 - Fixed cheats support. - Thu Dec 25 00:57:51 2014 +0800 -rev749 - Close branch psx_core/the-most-accurate-and-correct-translatio-1384761167035. - Thu Dec 25 00:18:17 2014 +0800 -rev748 - Close branch ps2rd-max-codes-250. - Wed Dec 24 16:15:07 2014 +0000 -rev747 - Removed unused compatibility mode 9 strings, added missing cheats status/error messages, updated art assets and modified the cheats engine to not use memory at 0x00080000 directly. - Wed Dec 24 16:15:04 2014 +0000 -rev746 - Fixed SMB support and updated changelog. - Thu Dec 25 00:01:21 2014 +0800 -rev745 - Updated changelog files, removed unused UI strings, updated UI string labels, replaced the hardcoded use of tools within Makefiles with variables like $BIN2S, merged support for the CXD9566R into general DEV9 support, and removed power-on code from in-game DEV9 driver. - Wed Dec 24 10:06:56 2014 +0800 -rev744 - (*) Our "About" menu now has a "Quality Assurance" section, officially showing - Tue Dec 23 23:35:00 2014 +0800 -rev743 - Re-added the GET HEADER IOCTL2 function, to the APA driver. Updated the English translation template. - Thu Dec 18 13:35:27 2014 -0500 -rev742 - Sync'ing with the HDD and PFS driver updates from PS2SDK, fixed freezing when the HDLDump server is closed and the games list is reopened, completed TODOs in ioman.c, removed workaround from config.c, added missing UI hints and changed the region-handling code to default to Japan. - Sat Dec 13 14:52:32 2014 +0800 -rev741 - Removed tag 0.9.3 - Sat Dec 13 00:38:24 2014 +0800 -rev740 - Removed tag 0.9.3 - Fri Dec 12 16:06:42 2014 +0800 -rev739 - Removed tag 0.9.3 - Fri Dec 12 16:06:37 2014 +0800 -rev738 - Removed tag 0.9.3 - Fri Dec 12 16:06:36 2014 +0800 +rev953 - doctorxyz committed 6678592 - Mon Oct 10 00:23:15 2016 -0700 +rev952 - doctorxyz committed 60648cd - Sun Oct 09 20:35:58 2016 -0700 +rev951 - doctorxyz committed 33fec21 - Fri Oct 07 17:45:21 2016 -0700 +rev950 - doctorxyz committed 7121d7e - Thu Oct 06 17:39:57 2016 -0700 +rev949 - doctorxyz committed 763d4a4 - Mon Oct 03 17:45:50 2016 -0700 +rev948 - doctorxyz committed 1d2de4e - Sat Oct 01 20:51:42 2016 -0700 +rev947 - doctorxyz committed a57fcdf - Sat Oct 01 20:46:34 2016 -0700 +rev946 - doctorxyz committed da3a806 - Wed Sep 28 17:32:28 2016 -0700 +rev945 - doctorxyz committed 7887287 - Wed Sep 28 02:28:24 2016 -0700 +rev944 - doctorxyz committed dc41440 - Tue Sep 27 03:11:57 2016 -0700 +rev943 - update lang files - Mon Sep 19 14:29:21 2016 -0700 +rev942 - doctorxyz committed a0a99c0 - Mon Sep 19 12:12:06 2016 -0700 +rev941 - doctorxyz committed 828010d - Fri Sep 16 00:17:20 2016 -0700 +rev940 - doctorxyz committed a47f93b - Thu Sep 15 23:56:55 2016 -0700 +rev939 - committed d3bda76 - Sun Sep 11 15:28:44 2016 -0700 +rev938 - doctorxyz commited the following changes to ifcaro repo: - Sat Sep 10 20:52:26 2016 -0700 +rev937 - doctorxyz committed 9c5e7c6 - Mon Sep 05 00:31:15 2016 -0700 +rev936 - doctorxyz committed 7c806d8 - Sat Sep 03 06:28:34 2016 -0700 +rev935 - doctorxyz committed b766df3 - Tue Aug 30 13:08:52 2016 -0700 +rev934 - doctorxyz committed 93664a5 - Mon Aug 29 03:41:58 2016 -0700 +rev933 - doctorxyz committed 54b92d3 - Fri Aug 26 23:35:01 2016 -0700 +rev932 - doctorxyz committed 0def76c - Fri Aug 26 23:27:39 2016 -0700 +rev931 - doctorxyz committed 7f57a23 - Fri Aug 26 23:06:21 2016 -0700 +rev930 - doctorxyz committed eedf9dd - Fri Aug 26 23:01:08 2016 -0700 +rev929 - doctorxyz committed 75fecb6 - Fri Aug 26 22:55:08 2016 -0700 +rev928 - fixed error made to /include/lang.h - Thu Aug 25 19:18:23 2016 -0700 +rev927 - doctorxyz committed a3c0816 - Thu Aug 25 19:02:35 2016 -0700 +rev926 - doctorxyz committed a8d009b - Thu Aug 25 18:30:19 2016 -0700 +rev925 - doctorxyz committed 0bcb75c and 8bdabca - Mon Aug 22 16:23:39 2016 -0700 +rev924 - update lang files - Sun Aug 21 02:06:46 2016 -0700 +rev923 - doctorxyz committed 2dcd832 - Fri Aug 19 21:30:33 2016 -0700 +rev922 - doctorxyz committed c7c2e30 - Fri Aug 19 21:10:20 2016 -0700 +rev921 - doctorxyz committed 6ab74e2 - Fri Aug 19 21:05:01 2016 -0700 +rev920 - update lang file - Fri Aug 19 21:01:47 2016 -0700 +rev919 - doctorxyz committed 17be579 - Sun Aug 14 05:16:01 2016 -0700 +rev918 - doctorxyz committed d4af286 - PS2LOGO Makefile fix - Sat Aug 13 17:59:11 2016 -0700 +rev917 - doctorxyz committed 3689111 - Sat Aug 13 12:59:34 2016 -0700 +rev916 - doctorxyz committed d4ac025 - Sat Aug 13 12:53:46 2016 -0700 +rev915 - doctorxyz committed fdbf4a3 - Sat Aug 13 12:47:39 2016 -0700 +rev914 - doctorxyz committed 104c42e - Mon Aug 08 20:52:03 2016 -0700 +rev913 - doctorxyz committed b567af4 - Mon Aug 08 15:36:35 2016 -0700 +rev912 - doctorxyz committed a702d04 - Mon Aug 08 15:26:34 2016 -0700 +rev911 - doctorxyz committed 2658467 Reduced PS2RD string size in About Screen - Mon Aug 08 15:14:19 2016 -0700 +rev910 - doctorxyz committed b8d022b - Mon Aug 08 15:09:15 2016 -0700 +rev909 - . - Fri Aug 05 12:26:58 2016 +0100 +rev908 - no message - Fri Aug 05 12:21:54 2016 +0100 +rev907 - no message - Fri Aug 05 12:16:04 2016 +0100 +rev906 - Merged Jay-Jay/opl-daily-builds into default - Thu Aug 04 17:05:18 2016 +0100 +rev905 - Changing Modes to output Modes=1+2+3+4+5... - Thu Aug 04 17:03:05 2016 +0100 +rev904 - made a small edit - Sun Jul 24 03:27:23 2016 -0700 +rev903 - Adding the prefix "modes/" - Sun Jul 24 10:56:39 2016 +0100 +rev902 - no message - Sat Jul 23 21:49:38 2016 +0100 +rev901 - Trying to implement Modes on CFG - Sat Jul 23 21:47:45 2016 +0100 +rev900 - update lang files - Thu Jun 23 14:22:30 2016 -0700 +rev899 - update lang files - Tue Jun 21 18:37:47 2016 -0700 +rev898 - update Lang files - Tue Jun 14 12:13:06 2016 -0700 +rev897 - fix a lang.c error done in previous repo - Sat May 14 16:06:10 2016 -0700 +rev896 - include Bat Rastard recent pull request: https://goo.gl/XcZNJc - Sat May 14 15:03:51 2016 -0700 +rev895 - updated Brazilian Portuguese language - Mon Apr 04 19:09:30 2016 -0700 +rev894 - Update German Lang - Wed Jan 06 13:55:48 2016 -0800 +rev893 - update LANG files - Tue Jan 05 16:31:26 2016 -0800 +rev892 - add modfications done by doctorxyz in commit 2b8273a for GSM; updated About page and include more helpers; fixed it so Daily Build Lang files are compatible with official OPL v0.9.3 and so on... - Tue Jan 05 14:44:26 2016 -0800 +rev891 - update lang dates - Sun Oct 25 12:02:16 2015 -0700 +rev890 - Part 2 of 2 - restore changes to fix syncing conflicts between both repos. - Sun Oct 25 11:22:45 2015 -0700 +rev889 - Merged ifcaro/open-ps2-loader into default - Sun Oct 25 11:18:28 2015 -0700 +rev888 - Update languages - Sun Oct 25 13:05:27 2015 +0100 +rev887 - Part 1 of 2 - make changes to fix syncing conflicts between both repos. - Sun Oct 25 11:17:46 2015 -0700 +rev886 - update about page - Fri Oct 23 17:09:57 2015 -0700 +rev885 - Part 2 of 2 - restore changes to fix syncing conflicts between both repos. - Fri Oct 23 16:17:47 2015 -0700 +rev884 - Merged ifcaro/open-ps2-loader into default - Fri Oct 23 15:22:58 2015 -0700 +rev883 - writeMCIcon MC Folder Creation fix - Reported by Grahf, fixed by SP193 - Fri Oct 23 13:30:20 2015 -0400 +rev882 - Change version to 'OPL 0.9.4 WIP', re-enable development build flag - Fri Oct 23 04:16:22 2015 -0400 +rev881 - Added tag 0.9.3 for changeset 9b5321def22d - Wed Oct 21 00:59:28 2015 -0400 +rev880 - Massive language update: Arabic, Brazilian Portuguese, Bulgarian, French, Portuguese, Russian, Spanish and Traditional Chinese. - Wed Oct 21 00:49:42 2015 -0400 +rev879 - Updated: Polish language - summary: Massive language upArabic, Brazilian Portuguese, Bulgarian, French, Portuguese, Russian, Spanish and Traditional Chinese. +rev878 - About Menu: Contributors added, followed by case-insensitive sorting - Mon Oct 19 16:16:25 2015 -0400 +rev877 - swap DETAILED_CHANGELOG to fix conflicts. - Mon Oct 19 15:37:15 2015 -0400 +rev876 - Part 1 of 2 - make changes to fix syncing conflicts between both repos. - Fri Oct 23 15:21:18 2015 -0700 +rev875 - Part 2 of 2 - restore changes to fix syncing conflicts between both repos. - Fri Oct 23 15:17:31 2015 -0700 +rev874 - Merged ifcaro/open-ps2-loader into default - Sun Oct 18 15:19:40 2015 -0700 +rev873 - SP193 - Fixed renaming functionality for USBExtreme games + DEV9 will not be activated unless either Ethernet or ATA is used: - Sun Oct 18 15:12:43 2015 -0700 +rev872 - Jay-Jay'n'gledson999:Portuguese BR language fix - Sat Oct 17 21:47:36 2015 -0400 +rev871 - Part 1 of 2 - make changes to fix syncing conflicts between both repos. - Thu Oct 08 01:45:29 2015 -0400 +rev870 - Update Italian translation - Sun Oct 18 15:11:47 2015 -0700 +rev869 - Update Lang translations - Thu Oct 08 12:08:07 2015 -0700 +rev868 - Update language translations - Thu Oct 08 07:41:48 2015 -0700 +rev867 - Merged ifcaro/open-ps2-loader into default - Thu Oct 08 03:46:48 2015 -0700 +rev866 - Updated Portuguese BR language - Tue Oct 06 12:54:50 2015 -0700 +rev865 - SP193: HDD unit will be checked for fonts only if HDD support is set to AUTO. - Mon Oct 05 14:07:48 2015 -0400 +rev864 - Merged ifcaro/open-ps2-loader into default - Mon Oct 05 08:33:33 2015 -0400 +rev863 - Added Traditional Chinese language (It was missing in r840... Sorry) - Mon Oct 05 00:34:23 2015 -0700 +rev862 - Part 2 of 2 - fix conflicts from merger from ifcaro repo. - Sun Oct 04 20:55:55 2015 -0400 +rev861 - Merged ifcaro/open-ps2-loader into default - Sun Oct 04 05:43:30 2015 -0700 +rev860 - Update German Language and Update Theme Icons - Sun Oct 04 05:37:35 2015 -0700 +rev859 - Readded width specifiers on Game Settings Page. Let's help each other and work as a team ;-) - Sun Oct 04 05:21:30 2015 -0700 +rev858 - Translations Updated (French, Portuguese BR and Spanish) and Added (Traditional Chinese). Let's help each other and work as a team ;-) - Sun Oct 04 06:51:43 2015 -0400 +rev857 - Part 1 of 2 - fix conflicts for merger from ifcaro repo - Sun Oct 04 06:34:32 2015 -0400 +rev856 - Update Languages and rollback width specifiers on Game Settings Page for Game Modes. - Sun Oct 04 05:37:07 2015 -0700 +rev855 - Merged ifcaro/open-ps2-loader into default - Sun Oct 04 05:32:50 2015 -0700 +rev854 - Update Language Translation Files - Sun Oct 04 03:07:39 2015 -0700 +rev853 - Merged ifcaro/open-ps2-loader into default - Sat Oct 03 17:12:30 2015 -0700 +rev852 - Update Language Translation Files - Sat Oct 03 14:06:00 2015 -0700 +rev851 - Update Language Translation Files - Sat Oct 03 13:54:36 2015 -0700 +rev850 - Merged ifcaro/open-ps2-loader into default - Sat Oct 03 14:04:48 2015 -0700 +rev849 - Newest SP193's 0.9.3 patch - Mode x Labels :-) Remember guys we still need updated language files for 0.9.3 :-( - Sat Oct 03 07:30:38 2015 -0700 +rev848 - Part 2: rollback changes in Part 1, after ifcaro merger, plus edited some new code to make ELF Loader Menu (ELM) continue to work. New bug in APPS and ELM pages: If an ELF with a prefix (example: XX.title.ELF) is stored on SMB (shared folder) it will not load, but will load if the ELF is without a prefix (example: SMS.ELF) via SMB. But ELFs with prefixes (example: XX.title.ELF) will still load okay if the ELFs are stored on USB -- HDD not tested. - Sat Oct 03 07:07:24 2015 -0400 +rev847 - Merged ifcaro/open-ps2-loader into default - Sat Oct 03 07:21:29 2015 -0700 +rev846 - Here is SP193's 0.9.3 patch :-) But we still need updated language files :-( - Sat Oct 03 03:18:57 2015 -0700 +rev845 - Part 1: revert conflicting code changes to be ale to merge ifcaro's open-ps2-loader repo into Jay-Jay's OPL Daily Build repo. - Sat Oct 03 02:06:26 2015 -0400 +rev844 - Update lanc.c - Sat Oct 03 03:16:26 2015 -0700 +rev843 - Update: DETAILED_CHANGELOG - Fri Oct 02 00:35:23 2015 -0700 +rev842 - Merged ifcaro/open-ps2-loader into default - Thu Oct 01 21:43:21 2015 -0700 +rev841 - Update Spanish translation - summary: UpDETAILED_CHANGELOG +rev840 - Update language files - Thu Oct 01 16:02:05 2015 -0700 +rev839 - Disabled the Development Builds setting that was set since OPL r801 commit 144ad43. Go ahead and rename your CFG-DEV folder back to CFG. -- if you are using OPL Manager v16+ make sure to toggle back to CFG folder under Settings. -- Developer danielb7390 fixed issue for HDD users and also for the APPS and ELM pages -- because that device and pages would still attempt to fetch from CFG-DEV, even when the Development Builds setting was disabled. - Wed Sep 30 20:46:49 2015 +0200 +rev838 - Developer danielb7390 added support to fetch both conf_apps.cfg and conf_elm.cfg files from the root of all the devices in this order: MC, HDD, SMB, and USB. -- for MC it still looks for the file at the default OPL directory. - Thu Oct 01 16:00:05 2015 -0700 +rev837 - Developer danielb7390 added support for both the APPS and ELF Loader Menu pages to populate the CFG file for the INFO Page feature for Custom Themes. The CFG file must have the ELF file name. Examples: SMS.ELF.cfg or XX.AC2.ELF.cfg. It searches the CFG files from both CFG / CFG-DEV folders on all devices in this order: HDD, ETH, and USB. - Thu Oct 01 14:54:54 2015 -0700 +rev836 - Update language files - Thu Oct 01 14:35:11 2015 -0700 +rev835 - Added a new page: ELF Loader Menu (identical to the APPS page) to list a separate list of ELF files. This new page can be enabled under OPL Settings. It will use it's own conf_elm.cfg file in MC OPL directory so you can list the ELF files for this new page. - Thu Oct 01 11:00:21 2015 -0700 +rev834 - About Menu: Credits listed in alphabetical order - Thu Oct 01 08:48:43 2015 -0700 +rev833 - Deleted: scripts/out.txt - Thu Oct 01 08:22:08 2015 -0700 +rev832 - Auto Start Last Game - Configureable Countdown : Value in second(s), 0 to disable auto start - Tue Sep 29 21:16:38 2015 -0400 +rev831 - Fixes for VMC (compilation warning) and Auto-start Last Game (bugs and conflicts) - Tue Sep 29 08:20:27 2015 +0000 +rev830 - Auto-start feature fix - Wait for pending operations to finish - Mon Sep 28 10:43:25 2015 -0400 +rev829 - Added Autostart toggle for Last Played Game feature: When enabled, starts the chosen game automatically within a few seconds - unless the user presses any valid key. - Sun Sep 27 21:09:19 2015 -0400 +rev828 - OPL Spanish translation by El_Patas - Wed Sep 23 14:00:43 2015 -0400 +rev827 - update language files and also fonts - Wed Sep 23 05:16:42 2015 -0400 +rev826 - update language files - Sat Sep 19 06:55:27 2015 -0400 +rev825 - Now Last Played Game feature starts the chosen game automatically within a few seconds - unless the user presses any valid key. - Thu Sep 17 01:21:16 2015 -0700 +rev824 - Rollback: removed FAT driver from in-game. New universal system added to support non-standard sector sizes. - Sat Sep 05 22:05:46 2015 -0700 +rev823 - Added support for downloading compatibility entries through the Internet from the OPL-CL service. - Thu Sep 03 02:54:19 2015 -0400 +rev822 - Removed locking semaphore for game list, GUI OPs will now be cleared before the menu is cleared prior to game list updating (so that old commands will not be executed) and added checks for file-open problems under USB support. - Sun Aug 30 02:46:25 2015 +0800 +rev821 - Updated to support the new PS2SDK changes (SIF CMD buffer set, USBHDFSDV SIF CMD ID changed to 0), USBHDFSD IOCTL codes consolidated into usb-ioctl.h, standardized which "prefix" buffer to use within usbsupport.c (was unable to access game files when a prefix is set, due to the path getting incorrectly generated), removed cdrom_lseek64 as it is not implemented in the SONY CDVDMAN, changed cdrom_dclose to become cdrom_close since close() and dclose() are the same here and SONY does it that way too, simplified cdrom_lseek to be more tolerant to errors like the SONY original, adjusted CBT to apply to reading operations as well, adjusted CBT to be 5000us, adjusted speed limit for Accurate Reads to 2800KB/s (timed to the 36.864MHz IOP clock). - Fri Aug 21 18:52:47 2015 +0800 +rev820 - update lang Arabic; new lang Portuguese-Brazilian. - Sat Aug 15 18:03:17 2015 +0800 +rev819 - updated lang Arabic 90% translated; new lang Portuguese-Brazilian 100% translated. - Sat Aug 15 12:59:47 2015 +0800 +rev818 - Merged ifcaro/open-ps2-loader into default - Wed Aug 05 21:05:54 2015 -0700 +rev817 - Update LNG files to support OPL r813 changes, removed obsolete LNG files that need an overhaul. - Wed Aug 05 20:51:23 2015 -0700 +rev816 - Merged ifcaro/open-ps2-loader into default - Mon Aug 03 22:15:17 2015 -0700 +rev815 - Update LNG files credits and dates for OPL r811. - Mon Aug 03 18:29:26 2015 -0700 +rev814 - Re-added 'VGA 640x480i @60Hz' again GSM vmode for better game compatibility (avoid BSOD/freezing/no signal on certain games and VGA monitors) - Sun Aug 02 20:14:16 2015 -0700 +rev813 - Merged the CallBack Timer setting into Accurate Reads compat mode (applies to everything other than reads), new compat mode (High module storage @ 0x01C00000), EE core linkfile adjusted to have the stack before _end for better manageability, EE core will now always reset stack pointer to _end, and fixed blockSize within fat.c overflowing (resulted in extremely poor performance). - Sat Aug 01 16:37:38 2015 -0700 +rev812 - Fixed VMC size parameter for USB support, simplified LSN calculation for the first phase of cdrom_read() since integer division will truncate anyway, changed stray memcpy() call in fat.c to mips_memcpy(), fixed (updated) the delete and rename functions within supportbase, and fixed updating of the game list under USB mode after an item has been deleted/renamed. - Mon Aug 03 22:40:45 2015 -0400 +rev811 - Merged in Jay-Jay/open-ps2-loader (pull request #23) - Mon Aug 03 03:31:02 2015 +0800 +rev810 - Update more LNG files. - Mon Aug 03 01:13:56 2015 +0800 +rev809 - restored Makefile changes to default from last pushed commit, sorry - Sun Aug 02 03:39:44 2015 +0800 +rev808 - added a new word to LNG SRC files so it can be used to replace the word SETTINGS in the footer of main page so it can abbreviated in the LNG files without affecting the same full word in other areas; updated LNG files to include new changes in recent commits; French LNG updated 100% translated. - Tue Jul 28 13:29:14 2015 -0700 +rev807 - Imported fixes for SMAP (wrong watermark value) and IOMAN (incorrect declaration for lseek) stuff, fixed GSM extension's "ok" button, added patch entry for SRW IMPACT LE, removed NBNS's Rules.make file in favour of the common one, and adjusted in-game FAT driver's parameters and strategy to improve seeking performance. - Tue Jul 28 09:13:12 2015 -0700 +rev806 - Merged in Jay-Jay/open-ps2-loader (pull request #22) - Tue Jul 28 09:08:30 2015 -0700 +rev805 - Updating some LNG files. - Sun Aug 02 03:38:49 2015 +0800 +rev804 - Added missing files from previous commit, removed leftover SMB DMA address definition (disused since long ago) and removed leftover code that updated ReadPos (is now updated by CDVDMAN itself, not by the individual drivers). - Tue Jul 28 20:11:29 2015 +0800 +rev803 - Added a small FAT driver to in-game USB support. USB support no longer needs total disc image defragmentation and all sector sizes should be supported. - Mon Jul 27 01:46:03 2015 -0700 +rev802 - Changed game list-locking mechanism to use a semaphore, game list will now be locked when updated and drawn (mutually exclusive operations), deferred GUI operations will be cleared when the GUI is to be suspended (otherwise a crash might result because the requests would be for the previous GUI instance), fixed ELFLDR (wrong compile-time flags, hence IOP reset missing) by removing the RESET_IOP option, re-ordered code that checks for outstanding deferred GUI operations (guiHandleDeferredOps) to prevent potential crash if the linked-list is modified as it waits for the list to be unlocked (not done here, but IF), lowered the priority of the running thread to 90 in ioBlockOps() as it was starving lower-priority (NETMAN) threads, and removed redundant calls to SifInitRpc() in sysExecElf and sysLaunchLoaderElf. - Tue Jul 28 15:39:25 2015 +0800 +rev801 - Refactored config reading system to allow reading of config file from RAM (for future use), fixed IOMAN crashing due to the request list being set to NULL as it waits for the process sema to be released, fixed OPL getting stuck if HDLDump server could not be started, refactored directory-creation system to be unified and without the need for a redundant check, changed GSM controls to become read-only if GSM is disabled, completed moving the GSM stuff into pggsm.h, added missing "childproof" target into Makefile, consolidated the different IO handler types into opl.h, updated to build with the latest PS2SDK revision, added support for DNS (for future use and manual static setting will not be saved!), added a setting into opl.h that determiens whether the OPL source is a development version, blocking I/O operations in IOMAN will no longer pause I/O execution (oustanding I/O operations will be completed), the I/O request sema will be locked when the number of I/O requests are counted, error messages will now be cleared when HDLDump server is started, failures to start the HDLDump server will be stated, CFG folder will now be "CFG-DEV" instead for development builds, changed config-handling code to use the limits from config.h for key and value management, and changed network initialization to prevent deadlocks that occur during simultaneous initialization of HDLDump and SMB support. - Tue Jul 28 14:21:03 2015 +0800 +rev800 - Fixed SMB auto-refresh (CD, DVD and USBExtreme lists checked one-by-one) and refactored code in CDVDMAN and MCEMU for better coherency (USB, SMB and HDD-split up into individual files, for as much as possible). - Mon Jul 27 05:12:21 2015 +0800 +rev799 - BUGFIX: Replaced all calls (and related macros) to the FILEIO RPC service with FILEXIO. OPL is intermittently unstable when listing games, as the rom0:FILEIO module does not suspend interrupts before the DMA transfers for the dread() and getstat() functions (SONY BUGBUG!!). - Sun Jul 26 03:40:05 2015 +0800 +rev798 - Fixes: Added check for streaming status into CDVDMAN streaming system (for games that read after starting streaming), fixed broken CDVDMAN debug build, changed ambiguous debug strings in CDVDMAN, fixed length checking of ISO filenames and improved on error-handling code in supportbase.c. - Sun Jul 12 20:40:11 2015 +0800 +rev797 - Fixed and enhanced streaming support: - Sat Jul 11 03:25:55 2015 +0800 +rev796 - Consolidated error codes, added error codes for HDD mode, sync'ed with updates to HDD and PFS from PS2SDK, added workaround for clone/compatible network adaptors and corrected UV coordinates for texture-drawing. - Sat Jul 11 03:17:13 2015 +0800 +rev795 - Fixed NBNS support (unable to resolve NB names after first attempt), revised timeout clock value and adjusted code to prevent some other race-conditions from occuring, adjusted SMB support initialization code to always retry until the link mode can be set successfully, changed link mode setting and DHCP completion-checking intervals to 1 second (reduce strain on IOP), link mode will now be set once at initialization before the TCP/IP stack is initialized (avoid double-initializing the SMAP). Updated to support the new PS2SDK revision. - Sun Jun 28 18:18:52 2015 +0800 +rev794 - Fixed SMB intialization when built within VMC support, by moving the SMB initialization function into the "oplsmb" export table. - Sat Jun 20 20:06:02 2015 +0800 +rev793 - Moved SMB authentication code into a SMBINIT IOP module, so that SMB code can be modular and won't be part of the EE core itself. Fixed support for the USBLD format under SMB mode, renamed mode 5 to "Emulate DVD-DL", fixed filesystem selection within cdvdman_findfile() for mode 5, fixed NBNS support to check against the transaction ID as specified in the RFCs, changed the EE-side libnbns library into a normal C file for simplicity, and lowered the module storage region so that the occupied region will be as low as possible since SMB authentication code is now in an IOP module. - Tue Jun 16 21:50:14 2015 +0800 +rev792 - Rolled back the new changes to the UI's behaviour, added error-reporting code (reports READCF* errors) to reading functions within CDVDFSV, got ReadIOPM and ReadChain functions within CDVDFSV to report read progress to the EE library, added a new workaround for the SIF becoming unusable after an IOP reset with ongoing DMA transfers. - Sat May 30 13:02:35 2015 +0800 +rev791 - Updated to use the new SIF register definitions, to support automatic screen switching and hiding, USB, HDD and APP modes are now always enabled, added a toggle for hiding advanced network options, fixed CDVDFSV initialization (Initializing SIF on the main thread causes the IOP reset to stall; refer to SCE docs), fixed open(), dopen(), read(), dread() and getstat() to first wait for the, drive to become ready (and for read, forever attempt to read) to be in-line with the original behaviour of CDVDMAN, DEV9 will no longer be powered-off during IGR, the SIF register BOOTEND flag will now be cleared before every IOP reset, within the EE core to ensure correct behaviour, updated network support to ensure that timeouts are accurate regardless of the current video mode. - Thu Apr 16 21:59:05 2015 +0800 +rev790 - Updated to support the new PS2SDK revision, changed module management so that only the necessary modules will remain resident in-game, changed unloadPad() to call padEnd() instead of padReset() in order to actually stop the PADMAN RPC service, re-added the "ei" instruction to crt0, fixed the logic that determines whether the IP address config has been changed (When DHCP is enabled, re-arranged the EE core so that modules (0x0009A000) will now be stored after the EE core (0x00088000). - Sun Mar 29 16:35:13 2015 +0800 +rev789 - Updated to work with the new update to the PS2SDK (mainly with the renaming of the EE PS2IP over SIF RPC library, ps2ip, to ps2ips). - Sun Mar 22 19:14:28 2015 +0800 +rev788 - Changed OPL to use NETMAN and PS2IPS for full control over the network subsystem, SMAP (re-)initialization will no longer be done whenever unnecessary (valid link state = not needed) and renamed "smap" to become "smap-ingame". - Tue Mar 03 21:35:40 2015 +0800 +rev787 - Updated to support the new PS2SDK PS2IP module (LWIP v1.4.1) and updated PS2ETH SMAP driver, while yet maintaining support for the (in-game) SMSTCPIP stack which was based on an ancient version of LWIP. - Sat Feb 28 21:32:31 2015 +0800 +rev786 - Added support for the NBNS protocol, added functions for changing the visibility and type of UI elements without hardcoding the element's index number, changed the keyboard to hide passwords, and adjusted language string and some function names. - Sat Feb 28 15:58:29 2015 +0800 +rev785 - Added patches for Oneechanbara, Ratchet and Clank: Up Your Arsenal and updated SMAP. - Sat Feb 28 14:38:40 2015 +0800 +rev784 - Removed space-filler code in EESYNC, which is found only in some EESYNC versions, presumed to make up for the lesser space taken up by a Debug SECRMAN module. The export table has been removed too, as no module ever links with it. - Sun Feb 22 16:24:52 2015 +0800 +rev783 - New compatibility mode 1 (accurate reads) and the user callback will no longer be called during streaming (incorrect behaviour). - Fri Feb 20 13:44:46 2015 +0800 +rev782 - Fixed IOP resets with command lines that are not NULL-terminated (e.g. SOCOM games), added path-purification for cdrom_getstat(), "untweaked" the TCP/IP stack for GUI mode (better performance), fixed screen rendering (screen cut-off) under 480P mode, fixed default-theme scaling, added/fixed missing/incorrect UI hints. - Fri Feb 13 15:28:26 2015 +0800 +rev781 - upload new background image - Fri Feb 13 15:23:56 2015 +0800 +rev780 - Merged ifcaro/open-ps2-loader into default - Sun Feb 01 21:22:41 2015 +0800 +rev779 - remove background image to be able to sync with ifcaro repo - Wed Jan 28 23:09:41 2015 -0800 +rev778 - upload new background image - Wed Jan 28 22:59:46 2015 -0800 +rev777 - replace old background image - Wed Jan 28 22:59:06 2015 -0800 +rev776 - include bg_overlay.png background image - Wed Jan 28 22:35:58 2015 -0800 +rev775 - Merged ifcaro/open-ps2-loader into default - Wed Jan 28 22:31:55 2015 -0800 +rev774 - Merged ifcaro/open-ps2-loader into default - Tue Jan 27 23:35:32 2015 -0800 +rev773 - update opl.icn made it smaller in size with help from sav3r and updated icon load png files to match new modified opl logo key - Sat Jan 24 03:21:25 2015 -0800 +rev772 - made opl.icn smaller in size with help from sav3r and updated load png files to math new OPL logo key - Tue Jan 20 15:12:41 2015 -0800 +rev771 - Updated to compile w/o warnings on new PS2SDK revision, modified GUI to support loading of embedded resources for the internal theme, added menu hints, added an option for changing the select button. - Mon Jan 19 01:39:50 2015 -0800 +rev770 - Increased buffer size for path parsing to 32-bytes to handle slightly-malformed paths like how SCE does, fixed broken debug printf() statement, removed unnecessary checks that should be only used for debugging (as SCE doesn't perform them), added an additional backslash to SMB paths for compatibility with some SMB servers and changed the ELF-loading error screen (white) to be always shown regardless of the debug enabled/disabled setting. - Mon Jan 19 01:32:13 2015 -0800 +rev769 - Changed cdrom_open() to set f->mode to O_RDONLY for games that fail to specify O_RDONLY, re-adjusted the path-sanitizing code to function from only cdrom_open() in order to not affect cdrom_dopen(), and corrected non-compliant behaviour of (in-game) SMB support. - Wed Jan 28 23:18:46 2015 +0800 +rev768 - Fixed DVD-DL parameter passing for USB and SMB modes, fixed ISO filename handling (ISO file name without the startup file name) in USB mode. - Thu Jan 22 21:39:00 2015 +0800 +rev767 - Merged ifcaro/open-ps2-loader into default - Tue Jan 20 20:13:51 2015 +0800 +rev766 - update logo.png in gfx folder - Sat Jan 17 18:30:20 2015 +0800 +rev765 - made new gfx icons, removed logo.old, change default theme background color. - Fri Jan 16 23:29:57 2015 -0800 +rev764 - add missing logo.old to gfx folder - Tue Jan 13 01:39:53 2015 -0800 +rev763 - clean up old gfx files - Fri Jan 02 13:28:22 2015 -0800 +rev762 - Merged ifcaro/open-ps2-loader into default - Wed Dec 31 14:32:48 2014 -0800 +rev761 - Merged ifcaro/open-ps2-loader into default - Wed Dec 31 14:16:10 2014 -0800 +rev760 - delete logo.old_old file from gfx folder - Wed Dec 31 14:02:07 2014 -0800 +rev759 - update gfx artwork - Wed Dec 24 08:33:10 2014 -0800 +rev758 - Replaced the path-sanitizing code with something closer to the SCE-original, and fixed cdrom_dread() to NULL-terminate the filename. - Wed Dec 24 03:17:31 2014 -0800 +rev757 - Fixed DVD-DL detection over SMB for images >4GB, fixed DVD-DL handling for USB and SMB, updated OPL to support the new GCC 3.2.3 toolchain. - Wed Dec 24 02:55:10 2014 -0800 +rev756 - Fixed USBD module loading, DVD9 detection, one printf string in CDVDMAN (potential use of uninitialized pointer) and EP's name in the credits. - Sat Jan 17 12:22:24 2015 +0800 +rev755 - Prototype attempt at fixing DVD-DL support within PS2ESDL for USB and SMB modes. - Sat Jan 17 12:17:15 2015 +0800 +rev754 - Fixed UI freezing while user cycles through the games list, rolled back changes to the rename() function of the APA driver, integer values in the UI can now wrap around, changed module loading for better performance, fixed theme loading from USB devices, users no longer have to name their ISO images in a specific format and removed debugging code from regular OPL builds. - Sun Jan 11 14:22:16 2015 +0800 +rev753 - Aaand the Scheisse-Kopf Award goes to yours truly. For having convinced a sick - Sat Jan 10 23:08:56 2015 +0800 +rev752 - Removed broken game label in GSM screen; removed developer comments. - Sat Jan 10 13:47:04 2015 +0800 +rev751 - Fixed cheats support again, renamed the extension to .CHT from .cht (to be uniform with the naming convention of other OPL-related files), and corrected boundary-limiting when printing the path to the cheat record file in all modes. - Sun Dec 28 07:57:58 2014 -0500 +rev750 - Fixed cheats support. - Wed Dec 24 12:28:28 2014 -0500 +rev749 - Close branch psx_core/the-most-accurate-and-correct-translatio-1384761167035. - Thu Dec 25 00:57:51 2014 +0800 +rev748 - Close branch ps2rd-max-codes-250. - Thu Dec 25 00:18:17 2014 +0800 +rev747 - Removed unused compatibility mode 9 strings, added missing cheats status/error messages, updated art assets and modified the cheats engine to not use memory at 0x00080000 directly. - Wed Dec 24 16:15:07 2014 +0000 +rev746 - Fixed SMB support and updated changelog. - Wed Dec 24 16:15:04 2014 +0000 +rev745 - Updated changelog files, removed unused UI strings, updated UI string labels, replaced the hardcoded use of tools within Makefiles with variables like $BIN2S, merged support for the CXD9566R into general DEV9 support, and removed power-on code from in-game DEV9 driver. - Thu Dec 25 00:01:21 2014 +0800 +rev744 - (*) Our "About" menu now has a "Quality Assurance" section, officially showing - Wed Dec 24 10:06:56 2014 +0800 +rev743 - Re-added the GET HEADER IOCTL2 function, to the APA driver. Updated the English translation template. - Tue Dec 23 23:35:00 2014 +0800 +rev742 - Sync'ing with the HDD and PFS driver updates from PS2SDK, fixed freezing when the HDLDump server is closed and the games list is reopened, completed TODOs in ioman.c, removed workaround from config.c, added missing UI hints and changed the region-handling code to default to Japan. - Thu Dec 18 13:35:27 2014 -0500 +rev741 - Removed tag 0.9.3 - Sat Dec 13 14:52:32 2014 +0800 +rev740 - Removed tag 0.9.3 - Sat Dec 13 00:38:24 2014 +0800 +rev739 - Removed tag 0.9.3 - Fri Dec 12 16:06:42 2014 +0800 +rev738 - Removed tag 0.9.3 - Fri Dec 12 16:06:37 2014 +0800 rev737 - Removed tag 0.9.3 - Fri Dec 12 16:06:36 2014 +0800 -rev736 - Removed tag 0.9.3 - Fri Dec 12 16:06:35 2014 +0800 -rev735 - Removed tag 0.9.3 - Fri Dec 12 16:06:34 2014 +0800 -rev734 - Rewrote HDD support to use the PS2 APA driver instead of HDLDump's code. - Fri Dec 12 16:06:07 2014 +0800 -rev733 - Dumbed-down the locking mechanism to use only sync_flag, as the use of the event flag APIs will still not totally protect against simultaneous access from an interrupt handler (It'll probably only fully work if the whole code was run from a syscall, but even SCE never did that). - Wed Dec 10 22:37:03 2014 +0800 -rev732 - Modified cdrom_read() to minimize the number of copy processes. - Sun Nov 30 16:02:34 2014 +0800 -rev731 - Added a fully streaming system. - Sun Nov 30 15:57:45 2014 +0800 -rev730 - Fixed sceCdChangeThreadPriority to not change the main thread priority* and added RPC support for it, added thread IDs for OPL's threads**, and added support for a streaming function callback***. - Sun Nov 30 15:55:35 2014 +0800 -rev729 - Replaced the old signaling system with one that works more like the SCE original, and fixed an age-long offset-calculation bug in CDVDFSV. - Sun Nov 30 15:29:16 2014 +0800 -rev728 - Removed the use of (internal & non-standard) sceCdRead0 function, old (unused) reading core and refactored the reading system. - Sun Nov 30 15:09:37 2014 +0800 -rev727 - (*) Useless GSM VMODE Removal (1st draft) - Sun Nov 30 14:13:05 2014 +0800 -rev726 - (*) Hey Bat, try not to break non-GSM builds of OPL next time, willya?!? *LOL* - Thu Nov 20 04:11:28 2014 -0500 -rev725 - (*) Decided to let the new logo escape the asylum. Those who want to classic - Mon Nov 10 13:09:00 2014 -0500 -rev724 - Sync-Merged with ifcaro/open-ps2-loader - Mon Nov 10 04:42:25 2014 -0500 -rev723 - (*) Per-Game GSM is COMPLETE! Repository frozen for now. Thanks to SP193 for - Sun Nov 09 16:11:59 2014 -0500 -rev722 - (*) Whoops! - Sat Nov 08 16:25:46 2014 -0500 -rev721 - (*) Went to far re-globalizing GSM - Sat Nov 08 10:30:24 2014 -0500 -rev720 - (*) Re-globalized GSM - Fri Nov 07 22:05:32 2014 -0500 -rev719 - (*) Per-Game GSM Complete (I think). There were two solutions to the issue. I - Wed Nov 05 19:51:47 2014 -0500 -rev718 - Merged ifcaro/open-ps2-loader into default - Mon Nov 03 23:31:15 2014 -0500 -rev717 - Added tag 0.9.3 for changeset 1fbd6857681b - Mon Nov 03 15:34:49 2014 -0500 -rev716 - (*) Per-Game GSM (In One Commit) - couldn't make sense of the shit I had - Sat Nov 01 10:26:48 2014 -0400 -rev715 - Merged in Aced14/open-ps2-loader/ps2rd-max-codes-250 (pull request #11) - Sat Nov 01 10:26:12 2014 -0400 -rev714 - Increased ps2rd's cheat line limit (MAX_CODES) to 250. - Sun Nov 09 19:16:08 2014 +0800 -rev713 - Improved IGR stability (E P), fixed MC slot 1 use when a VMC is mounted as the 2nd slot (E P), fixed art drawing, fixed poor game list loading performance and brought forward texture cache initialization. - Sun Nov 09 04:25:05 2014 -0500 -rev712 - Replaced all obsolete Makefile rule files with a common file and integrated the discID module into the EE side. - Mon Nov 03 21:35:05 2014 +0800 -rev711 - Changed auto-refresh behaviour and fixed the SMB reconnect option: - Tue Oct 14 22:29:01 2014 +0800 -rev710 - Updated the GUI to have device-dependent refresh rates and moved some of the static buffers in CDVDMAN onto the stack. - Sun Oct 12 23:13:38 2014 +0800 -rev709 - README edited online with Bitbucket - Fri Oct 10 23:19:40 2014 +0800 -rev708 - README edited online with Bitbucket - Tue Oct 07 09:20:45 2014 +0000 -rev707 - Fixed DEVCTL code handling in CDVDMAN, syntax errors and SMB mode error handling when there isn't a network adaptor attached. - Tue Oct 07 09:18:40 2014 +0000 -rev706 - Improved on the reliability of USB support, added more error messages for SMB and removed VSYNC mode: - Tue Oct 07 16:57:28 2014 +0800 -rev705 - Fix for Crash Bandicoot: The Wrath of Cortex. - Tue Oct 07 01:57:13 2014 +0800 -rev704 - Fixes: - Mon Oct 06 00:00:36 2014 +0800 -rev703 - Fixes and optimizations: - Sun Oct 05 08:31:44 2014 +0800 -rev702 - Rewritten the patching system and how parameters are passed to IOPCORE, for maintainability. - Sat Oct 04 09:39:20 2014 +0800 -rev701 - Added a patch for Super Robot Wars IMPACT, and optimized CDVDMAN's callback functionality. - Sat Oct 04 03:45:38 2014 +0800 -rev700 - Fixed CDVDMAN initialization. Fixes: SSX World Tour and the Harry Potter series. - Fri Oct 03 05:35:49 2014 +0800 -rev699 - Updated USBHDFSD to support disks >1TB and <=2TB (Sync'ed with PS2SDK update). - Tue Sep 30 08:54:16 2014 +0800 -rev698 - Corrected path handling, which was broken in commit e5e85f0. - Tue Sep 30 01:01:15 2014 +0800 -rev697 - Fixes and updates: - Sun Sep 28 09:44:28 2014 +0800 -rev696 - in-game SMB fixes and enhancements: - Mon Sep 08 20:36:57 2014 +0800 -rev695 - Added an option for DTL-T100dded an option for DTL-T10000 support, since this unit can have a different set of IOP modules in its flash ROM. - Wed Aug 20 22:47:26 2014 +0800 -rev694 - SP193: FreeType fix - Mon Aug 04 13:07:19 2014 +0800 -rev693 - More Makefile fixes - In order to CHILDPROOF, RTL, GSM and CHEAT switches work properly - Sat Jul 12 16:07:03 2014 -0300 -rev692 - Makefile fix to build without PS2RD Cheat Engine (CHEAT = 0) - Wed Jul 09 19:37:45 2014 -0300 -rev691 - EE Core - Only Install PadOpen Hook if IGR is enabled - Wed Jul 09 15:43:00 2014 -0300 -rev690 - Merged doctorxyz's commit with mine. - Fri Jul 04 08:47:43 2014 -0300 -rev689 - OPL+PS2RD Cheat Engine Integration - Thu Jun 26 19:13:48 2014 +0800 -rev688 - Updated OPL to compile with the new PS2SDK. - Mon Jun 23 08:20:53 2014 -0300 -rev687 - Fixed the theme bug and improved code: - Mon Jun 23 18:39:24 2014 +0800 -rev686 - Sync'ing with the PS2SDK commit for today: the main point behind this commit is the rollback of the use of the pre and post-DMA callbacks within DEV9, for compatibility with a certain clone adaptor. - Sun Jun 15 18:52:00 2014 +0800 -rev685 - Merged in psx_core/open-ps2-loader/psx_core/the-most-accurate-and-correct-translatio-1384761167035 (pull request #6) - Tue Jun 10 21:47:33 2014 +0800 -rev684 - The most accurate and correct translation from english to russian by RA1n. (lang_Russian.lng edited online with Bitbucket) - Sun Jun 01 19:35:01 2014 +0800 -rev683 - Fixed a buffer overflow problem in CDVDFSV and refactored all CDVDMAN defines: - Mon Nov 18 07:52:59 2013 +0000 -rev682 - Added a proper patch for Choujikuu Yousai Macross (SLPM-65405). - Fri May 09 21:50:36 2014 +0800 -rev681 - Completed the integrated DECI2 debugging system and updated some log messages. - Thu May 01 17:01:58 2014 +0800 -rev680 - Completed the incomplete modifications from the previous commit + enhanced IGR. - Tue Apr 22 00:57:53 2014 +0800 -rev679 - changes.txt - Mon Apr 21 22:21:07 2014 +0800 -rev678 - Updated OPL to be fully compatible (compiles without the deprecated warnings) with the HEAD revision of the PS2SDK. - Sat Apr 19 13:52:29 2014 +0800 -rev677 - *Changed the configGetString function to return a const value, since the configuration keys are not to be changed without configSetStr(), except for two lines within themes.c. This is to safeguard against accidental configuration corruption/overwriting. - Sat Jan 11 20:27:05 2014 +0800 -rev676 - * Updating LNG files - Ethernet modes (among other things) were missing. - Wed Nov 06 13:16:17 2013 +0800 -rev675 - Reverting the change in the previous commit. - Fri Nov 01 12:42:36 2013 -0400 -rev674 - Fix for the workaround for the Chinese SATA network adaptor: I forgot that the register is 16-bit, which means that the adaptor probably reports 0xFFFF as its version number. - Fri Nov 01 20:32:26 2013 +0800 -rev673 - *Ported over the workaround for Chinese SATA network adaptors (See the PS2SDK update for today). - Fri Nov 01 17:43:16 2013 +0800 -rev672 - * Rev672 tapped for release - updated changelogs. - Fri Nov 01 13:47:59 2013 +0800 -rev671 - *Replaced the TLB reinitialization mechanism with a built-in one. No more patching/hooking onto the EE kernel for that! Done partly for compatibility with the PSX. - Fri Oct 25 17:52:49 2013 -0400 -rev670 - * Hey Bat! Try not to commit non-default changes to Makefiles next time, will - Thu Oct 24 15:13:40 2013 +0800 -rev669 - * MASSIVE UPDATE - Consider deleting and re-cloning your local repos if - Tue Oct 22 14:06:16 2013 -0400 -rev668 - * Massive changes to GSM function calls - some of which were so similar that - Tue Oct 22 13:55:08 2013 -0400 -rev667 - * Anticipating blood-curdling scream from SP193! - Mon Oct 21 17:29:56 2013 -0400 -rev666 - * Cleaned up GSM code - Fri Oct 18 12:43:06 2013 -0400 -rev665 - Added tag 0.9.2 for changeset 3eb5ac59e7a5 - Wed Oct 16 17:05:23 2013 -0400 -rev664 - (*) Refreshed language files - Sat Oct 12 06:59:14 2013 -0400 -rev663 - (*) Aaaand after a half-assed busted GUI staring me dead in the face for over - Sat Oct 12 06:57:49 2013 -0400 -rev662 - Updating CHANGELOG ahead of release - actual release revision can be - Fri Oct 11 17:49:17 2013 -0400 -rev661 - * Rebase complete - Wed Oct 02 11:29:13 2013 -0400 -rev660 - *Modified compatibility mode 7 to not affect sceCdStRead(), as the streaming functions are already underperforming. - Tue Oct 01 16:43:01 2013 -0400 -rev659 - *Sync'ing the HDD module updates for the PSX. OPL should now run properly on the PSX. - Wed Oct 02 00:17:01 2013 +0800 -rev658 - *Sync'ing HDD updates... again. - Tue Oct 01 23:04:45 2013 +0800 -rev657 - *Sync'ing the updates in the PS2SDK with the ATAD modules here: common/include/atahw.h was updated, and all ATAD modules are using the commands defined within atahw.h. - Sun Sep 29 19:22:24 2013 +0800 -rev656 - *Optimized CDVDMAN (Declared internal structures and functions as static). - Fri Sep 27 18:22:17 2013 +0800 -rev655 - The original files I modified couldn't be committed directly into the repository, so I had to check out a new copy of the repository and copy my changes over manually. - Mon Sep 02 15:21:49 2013 +0800 -rev654 - *Updated ATAD (Normal ATAD and the HDPro version) to be the same as the ones from the PS2SDK. - Thu Aug 08 14:22:12 2013 +0800 -rev653 - *Re-added SPU reset code. CLEARSPU shouldn't be used and I was wrong about that. - Thu Aug 08 14:12:32 2013 +0800 -rev652 - *Added sceCdPowerOff(). Games that power off the console should be able to do so now. - Sun Jul 21 12:12:43 2013 +0800 -rev651 - *Cleaned up IGR code. - Wed Jul 17 15:08:08 2013 +0800 -rev650 - Added power-off processing code. Games (mainly older one) that use it should no longer cause a deadlock. - Wed Jul 17 13:12:54 2013 +0800 -rev649 - *Updated all DEV9 and ATAD module code. - Sat Jun 15 01:56:50 2013 +0800 -rev648 - (AKuHAK): Updated OPL to support the updated LIBPNG port. - Sat Jun 15 01:26:36 2013 +0800 -rev647 - Removed the integrated FreeType copy. Please update your FreeType library (From ps2sdk-ports)! - Sat Jun 15 00:52:08 2013 +0800 -rev646 - *Removed the old Protokernel patch, since the PS2SDK now has a complete one. - Sun Jun 02 20:44:40 2013 +0800 -rev645 - *Removed the old Protokernel patch, since a full patch has been integrated into the PS2SDK. - Thu Mar 21 00:11:48 2013 +0800 -rev644 - Added tag 0.9.1 for changeset 2ebb9bb56c19 - Thu Mar 21 00:08:41 2013 +0800 -rev643 - Updated USBLD_VERSION to "0.9" - Mon Aug 13 06:00:01 2012 -0300 -rev642 - Added tag 0.9 for changeset 830d78f67941 - Mon Aug 13 05:57:32 2012 -0300 -rev641 - Updated CHANGELOG and DETAILED_CHANGELOG files - Sat Jul 28 10:35:29 2012 -0300 -rev640 - Disabling auto-refresh of game list by default, as it is causing bugs sometimes - Sat Jul 28 10:35:22 2012 -0300 -rev639 - mgh: fix for default HDD DMA mode, that wasn't correctly set - Tue May 01 16:37:04 2012 +0200 -rev638 - Suggestion from "mgh". - Thu Apr 26 22:46:24 2012 +0200 -rev637 - Fix a bug (in revision 426) which made "Mode 3 - Unhook Syscalls" un-effectivei ("Unhook Syscalls" was in fact activated by "Mode 7 - Reduced memory usage", which was setting both modes 3&7). - Mon Mar 26 22:40:28 2012 +0200 -rev636 - * fix for theme font handling (when switching back to the default theme, the language font wasn't re-applyied) - Sat Mar 24 22:08:24 2012 +0100 -rev635 - damn wide font ;) - Sat Mar 24 00:21:03 2012 +0100 -rev634 - Added hidden options to be able to define your own device delay before loading ART/config files. - Wed Mar 07 21:32:39 2012 +0100 -rev633 - layout adjustment - Wed Mar 07 21:17:18 2012 +0100 -rev632 - language files update - Wed Mar 07 20:54:36 2012 +0100 -rev631 - don't do HDD checks when no vmc configuref - Tue Mar 06 19:31:33 2012 +0100 -rev630 - fix for corrupted graphics when manipulating config files - Sun Mar 04 23:03:08 2012 +0100 -rev629 - SilverBull: apply a delay to CDVDMAN functions (initially for Shadow Heart 2) - Sun Mar 04 17:47:44 2012 +0100 -rev628 - adding i18n strings - Sun Mar 04 14:36:46 2012 +0100 -rev627 - Big up for Volca ... slowdown the busy icon - Wed Feb 29 22:53:10 2012 +0100 -rev626 - fix for wrapping artefact when display_mode=ALWAYS - Mon Feb 27 21:18:00 2012 +0100 -rev625 - remove useless code for compatibility mode 7 which is unused now. - Mon Feb 27 18:53:58 2012 +0100 -rev624 - fix for broken UL on ETH mode - Sun Feb 26 14:57:10 2012 +0100 -rev623 - make start/select button skinnable - Sun Feb 26 12:58:47 2012 +0100 -rev622 - make action buttons skinnable - Sat Feb 25 10:55:24 2012 +0100 -rev621 - small correction for gcc warning - Fri Feb 24 23:08:05 2012 +0100 -rev620 - * CRITICAL FIX for 4K disk. It was broken since the beginning for both UL and ISO (2 bugs, one when checking for the cluster size for UL, and one for UL/ISO when patching the usb_cdvdman_irx) - Fri Feb 24 20:20:27 2012 +0100 -rev619 - Finalize the "list share" feature. Now you can list the share, select one from the list and OPL will connect it and display the games. - Fri Feb 24 19:59:26 2012 +0100 -rev618 - * fix a refresh bug introduced lately - Mon Feb 20 23:22:33 2012 +0100 -rev617 - cosmetics again (prefixing every LOG by its location) - Sun Feb 19 17:44:06 2012 +0100 -rev616 - just some cosmetics - Sun Feb 19 16:32:35 2012 +0100 -rev615 - * don't display a share connection error when listing share - Sun Feb 19 15:46:15 2012 +0100 -rev614 - Hey Hominem ... don't commit shit you used for trying to reproduce some bug ;) - Sun Feb 19 14:28:36 2012 +0100 -rev613 - Adding ETHPrefix to fix the use of some box/NAS adding a sub path to the share - Sat Feb 18 11:43:45 2012 +0100 -rev612 - few changes to be able to refresh the menu from anywhere (should be used when selecting a share, after connecting to it, refresh the menu, but it doesn't work currently due to the info screen crashing ...) - Sat Feb 18 11:16:58 2012 +0100 -rev611 - * Add a feature to list network shares. Just let the sharename empty into network settings, and OPL will try to connect and list the shares (BUT then don't try to do anything with the share list, their are handled like games, but are not, so everything would crash) - Sat Feb 18 11:07:07 2012 +0100 -rev610 - * reverted some changes from rev500, finally crazyc was correct (when he skipped one vmc in error, but still wrote the structure in IRX but with flag as inactive) - Thu Feb 16 22:38:21 2012 +0100 -rev609 - load and use the internal LOGO before swapping theme (avoid flickering at startup) - Wed Feb 15 22:13:25 2012 +0100 -rev608 - NOTE: Concerning my comment in R606, I'm sorry Volca, the code wasn't "dangerous" and didn't write memory out of bounds (thanks to the check < MAX_GS_MODE) - Sun Feb 12 23:02:04 2012 +0100 -rev607 - fix small bug in alternate device mode, when loading config files - Sat Feb 11 15:33:02 2012 +0100 -rev606 - * fixed dangerous code (out of bounds memory writing in renderman) - Fri Feb 10 18:41:41 2012 +0100 -rev605 - clarify the gui - Fri Feb 10 00:19:28 2012 +0100 -rev604 - Some changes in the way the network is "reloaded". - Wed Feb 08 21:18:17 2012 +0100 -rev603 - * Minor GUI changes (deferred error message display, small optim for main loop) - Tue Feb 07 23:06:20 2012 +0100 -rev602 - Added "InfoHintText" element, to be able to put a small version of hints for the info screen. - Mon Feb 06 22:19:26 2012 +0100 -rev601 - Remove useless stuff (was thing for RTL transposition only, which will not be implemented after all as too complicated) - Tue Jan 31 23:05:17 2012 +0100 -rev600 - Fix for space and punctuation characters. These one are weak/neutral and should not change the current rendering direction. - Tue Jan 31 22:18:03 2012 +0100 -rev599 - Support for Right-to-Left scripting (Hebrew, Arabic, Syriac, Tifinar, ... languages) - Tue Jan 31 21:49:25 2012 +0100 -rev598 - merge (?) - Sat Jan 28 21:55:11 2012 +0100 -rev597 - Work around FOR PFS BUG with O_TRUNC - Sat Jan 14 15:24:26 2012 +0100 -rev596 - Polishing things, full IO for loading/saving of config files, factorization, ... - Sat Jan 14 15:19:09 2012 +0100 -rev595 - automatically create the CFG folder - Sat Jan 14 11:25:39 2012 +0100 -rev594 - remove duplicate methods / factorization (need to ensure compatibility mode among other don't have regression) - Sun Jan 08 13:59:22 2012 +0100 -rev593 - Configuration related to DNAS/VMC/DMA/COMPAT are now saved in single per game files on each media. - Sun Jan 08 01:40:40 2012 +0100 -rev592 - fixed the alternate device mode. - Sat Jan 07 23:38:56 2012 +0100 -rev591 - l_oliveira: fix for SCPH-10000 with Sony Kernel update - Fri Oct 14 10:20:26 2011 +0200 -rev590 - fix for Kingdom Hearts 2: Final Mix(SLPM_666.75) gummi missions freezing - Tue Oct 25 20:33:55 2011 +0200 -rev589 - fix cdinited flag for SSX on Tour (broken in r585) - Mon Jun 20 18:09:10 2011 +0200 -rev588 - update to comply with the latest PS2SDK - Thu Jun 09 17:05:57 2011 +0200 -rev587 - Fixed sceGetReadPos() to return the buffer offset in 2048-byte units (Updated dynamically). - Thu Jun 09 16:52:44 2011 +0200 -rev586 - Added new patch for Rugby League 2: World Cup Edition (PAL). - Wed May 04 16:40:35 2011 +0800 -rev585 - romz: added better cd tray emulation (fixes A2M games) - Sat Apr 30 22:29:07 2011 +0800 -rev584 - extracted code branching from ItemsList drawing and main drawing method - Fri Apr 29 17:48:50 2011 +0200 -rev583 - fix for the "alternate device mode" that was failing to re-read the configuration files from "mass" device - Wed Mar 09 23:39:07 2011 +0100 -rev582 - * use alignment for clipped/wrapped text - Sun Mar 06 01:42:13 2011 +0100 -rev581 - ItemsList can now use clipping too. As a result, the "items" option for ItemsList has been removed. Now to limit the number of items being displayed, specify a "height" value. - Sun Mar 06 00:05:42 2011 +0100 -rev580 - * caching of last attribute value (for AttributeText/Image element), to not search the config file every frame - Sat Mar 05 22:10:20 2011 +0100 -rev579 - cdvdfsv: implemented sceCdChangeThreadPriority export (as suggested by romz) - Sat Mar 05 19:11:31 2011 +0100 -rev578 - fix EE core makefiles (alt EE core broken in r546) - Mon Feb 28 10:32:09 2011 +0100 -rev577 - * minor addition to have more transitions - Mon Feb 28 09:56:24 2011 +0100 -rev576 - Probable fix for the previous random crash (rev 572) at startup - Sat Feb 26 21:27:05 2011 +0100 -rev575 - * fix problem with semaphore - Wed Feb 23 11:03:52 2011 +0100 -rev574 - Merged changes - Tue Feb 22 23:52:13 2011 +0100 -rev573 - * Added text block rendering function - Tue Feb 22 21:45:42 2011 +0100 -rev572 - * add a delay before loading per-game config file (same as Art, to not spam when navigating very fast) - Tue Feb 22 21:43:36 2011 +0100 -rev571 - Merged changes - Tue Feb 22 21:11:38 2011 +0100 -rev570 - * Fix for rendering problems caused by CLUT alpha setting change - Tue Feb 22 20:20:19 2011 +0100 -rev569 - use deferred IO to load config file (should be more safe, got sometimes corrupted file before) - Tue Feb 22 20:19:45 2011 +0100 -rev568 - * Font rendering now uses clut - Mon Feb 21 23:14:38 2011 +0100 -rev567 - * hints now display either "Info" or "Run" depending if the presentation page is available in the theme AND the option is enabled in settings - Mon Feb 21 22:41:46 2011 +0100 -rev566 - * add loading attributes from a per-game file - Mon Feb 21 00:25:03 2011 +0100 -rev565 - fix for config reading, "val" were truncated at 32 char (copy/paste typo) - Sun Feb 20 22:48:39 2011 +0100 -rev564 - * added new element type "StaticText" to display an hardcoded/static string to the screen - Sat Feb 19 22:49:11 2011 +0100 -rev563 - * added information page (new option to enable it or not) - Sat Feb 19 01:33:36 2011 +0100 -rev562 - First working version of the font atlasing. Probably still buggy so beware :D - Fri Feb 18 20:18:17 2011 +0100 -rev561 - small fixes - Mon Feb 14 22:58:02 2011 +0100 -rev560 - * Fix for rendering artifacts on disabled vsync (the reason was we didn't wait for GS to finish before ending the frame) - Sun Feb 13 01:43:02 2011 +0100 -rev559 - * Improvement for the config reader - it now handles python-like prefixes. Also added a safeguard for the max length of key and value in splitter - Sat Feb 12 18:04:35 2011 +0100 -rev558 - Erf first "merge" (I hope it works ...) - Sat Feb 12 16:22:24 2011 +0100 -rev557 - First step (almost) finished - Sat Feb 12 11:56:55 2011 +0100 -rev556 - step 2, loose coupling - Sat Feb 12 11:56:09 2011 +0100 -rev555 - first step of the theme/menu rendering rewrite - Sun Feb 06 10:48:00 2011 +0100 -rev554 - romz: fix for cdvdman's sceCdSC() - Fri Feb 04 14:19:11 2011 +0100 -rev553 - fix for "use_default=0" option in theme (entering the virtual keyboard was crashing, among other ...) - Sun Feb 06 17:39:33 2011 +0100 -rev552 - * fix a bug in color settings not applied to elements (needed to restart OPL, or cicle with another theme) - Tue Feb 01 08:42:07 2011 +0100 -rev551 - fix for language fonts being reset-ed when changing theme - Mon Jan 31 21:51:58 2011 +0100 -rev550 - re work of virtual keyboard (needed to remove the non-latin characters), added focus on current selected chars - Sun Jan 30 22:23:20 2011 +0100 -rev549 - * saved some place in game settings (to add future GSM settings) - Sun Jan 30 20:57:10 2011 +0100 -rev548 - fix for broken hdldsrv (since r517/r521) - Sun Jan 30 17:57:54 2011 +0100 -rev547 - just some cosmetics to the main Makefile - Fri Jan 28 11:07:45 2011 +0100 -rev546 - just some cosmetics for the EE core - Thu Jan 20 16:56:51 2011 +0100 -rev545 - fix (hopefully) for DVD9 games - Thu Jan 20 15:32:05 2011 +0100 -rev544 - fix for Sonic Unleashed (broken in r515) - Wed Jan 19 15:07:45 2011 +0100 -rev543 - Merged changes - Wed Jan 19 09:19:30 2011 +0100 -rev542 - * Mode setting (PAL/NTSC/Auto) - Sun Jan 16 20:03:21 2011 +0100 -rev541 - * Implemented kerning - Sun Jan 16 19:51:10 2011 +0100 -rev540 - * Longer first-press delay for pads - more comfy controls on max repeat speed - Sun Jan 16 19:49:53 2011 +0100 -rev539 - * Added sclean make target for make clean without Freetype - Sun Jan 16 19:28:44 2011 +0100 -rev538 - EP: fix for POPWW (SLUS_210.22) - Sun Jan 16 19:23:58 2011 +0100 -rev537 - fix for the HD Pro (doesn't support idle timeout) - Sun Jan 16 12:13:12 2011 +0100 -rev536 - fix for white screen freezing in 'Tenchu: Wrath of Heaven' - Sun Jan 16 12:03:57 2011 +0100 -rev535 - fix for the BSOD at game launch on some PS3 (added timeout on wait SPU reset) - Sun Jan 09 17:49:56 2011 +0100 -rev534 - fix for POPWW (SLES_528.22) over SMB, HDD - Sat Jan 08 15:10:07 2011 +0100 -rev533 - fix for SSX on Tour - Sat Jan 08 09:29:46 2011 +0100 -rev532 - small fixes - Fri Jan 07 15:11:50 2011 +0100 -rev531 - short ELF name in App list (looks better for most themes) - Fri Jan 07 13:52:39 2011 +0100 -rev530 - Added option to specify the HDD spin down time out. - Fri Jan 07 13:12:02 2011 +0100 -rev529 - implemented hddSetIdleTimeout() - Wed Jan 05 22:04:17 2011 +0100 -rev528 - removed hdpro_checker IOP module (HD Pro is now detected directly from EE) - Wed Jan 05 17:04:27 2011 +0100 -rev527 - changes to be able to debug IOP core with HD Pro - Tue Jan 04 18:13:31 2011 +0100 -rev526 - added in-game code for HD Pro - Tue Jan 04 13:33:33 2011 +0100 -rev525 - added hdpro_atad IOP module (HD Pro users should have their games listed) - Tue Jan 04 12:16:56 2011 +0100 -rev524 - added hdpro_checker IOP module (detect if HD Pro Kit is present) - Tue Jan 04 09:09:45 2011 +0100 -rev523 - fix for Street Fighter Zero Fighters Generation (SLPM_664.09) by lee4, reverted Capcom Classics Collection fix - Mon Jan 03 21:14:55 2011 +0100 -rev522 - Fix for Capcom Classics Collection - Sat Jan 01 10:04:43 2011 +0100 -rev521 - fix for broken SMB (by r517) on some setup - Thu Dec 30 19:36:30 2010 +0100 -rev520 - * Added theme support for multiple fonts (default_font, font0, font1... + _font=ID in the components) - Thu Dec 30 19:09:57 2010 +0100 -rev519 - configurable IGR path (limited to 32 characters) - Thu Dec 30 12:41:14 2010 +0100 -rev518 - fix for game ID system (broken in r513) - Thu Dec 30 00:34:02 2010 +0100 -rev517 - saved 4k of IOP mem in cdvdman/SMB, direct write to buffer - Wed Dec 29 21:10:54 2010 +0100 -rev516 - * Added support for multiple fonts (not used but there ;)) - Wed Dec 29 20:44:02 2010 +0100 -rev515 - fix for Capcom protected games (SFAA, VDC) - Wed Dec 29 18:03:32 2010 +0100 -rev514 - fix for games from 'Army Men' series - Wed Dec 29 15:28:31 2010 +0100 -rev513 - cdvdman: fix potential buffer overflow for long ISO filenames - Fri Dec 24 16:56:55 2010 +0100 -rev512 - enlarged cdvdman buffer for ISO name to 64 bytes - Mon Dec 20 19:39:15 2010 +0100 -rev511 - when creating a new VMC, the gEnableRenameDelete option should not be applied - Mon Dec 20 17:07:51 2010 +0100 -rev510 - * switch default background mode to "Art" - Sun Dec 19 17:57:47 2010 +0100 -rev509 - * fix USB fragmentation check of Game file parts (it should now works as expected) - Sun Dec 19 17:27:55 2010 +0100 -rev508 - fix for 10K patches freezing on some modchipped PS2 - Sun Dec 19 16:48:50 2010 +0100 -rev507 - * add configurable USB delay (3 is the default value currently used). If you have OPL stuck on yellow or orange screen (when using USB mode only), try increasing this value - Sun Dec 19 13:59:33 2010 +0100 -rev506 - fix for Super Dimensional Fortress Macross (SLPM_654.05) over HDD - Sat Dec 11 16:57:17 2010 +0100 -rev505 - final translations for release 0.8 - Sat Dec 11 10:16:21 2010 +0100 -rev504 - tagged r503 as release v0.8 - Thu Dec 09 20:37:29 2010 +0100 -rev503 - izdubar: added an About screen to the GUI - Wed Dec 08 12:58:24 2010 +0100 -rev502 - languages updates - Wed Dec 08 12:56:57 2010 +0100 -rev501 - work around for the infinite refresh on some NAS device - Tue Dec 07 11:29:46 2010 +0100 -rev500 - a few fixes so that OPL can comply with some Digitus NAS (with the help of Thinner), removed obsoletes language files and added 'Filipino' language file - Mon Dec 06 08:52:19 2010 +0100 -rev499 - update for Turkish language - Sat Dec 04 18:53:39 2010 +0100 -rev498 - fix for english and french translation - Sun Nov 28 19:31:10 2010 +0100 -rev497 - small fixes - Sun Nov 28 13:28:01 2010 +0100 -rev496 - Thanks to jimmi's help and ideas, things should now be fixed for alternate device start (and traditional mode too). - Sun Nov 28 01:29:24 2010 +0100 -rev495 - added ability to use '-use-early-debug' arg (for using ps2client netdump) - Sun Nov 28 01:10:54 2010 +0100 -rev494 - * devices started in alternate mode now have valid hints - Sat Nov 27 15:10:04 2010 +0100 -rev493 - genvmc: wait progress message update before to return from vmc_abort() call - Sat Nov 27 01:05:50 2010 +0100 -rev492 - genvmc: fixed IOP freezing on vmc_abort() call - Sun Nov 21 17:26:46 2010 +0100 -rev491 - added debug prints to genvmc module - Sun Nov 21 16:52:36 2010 +0100 -rev490 - modified sysReset() to allow genvmc to load properly - Sun Nov 21 15:25:00 2010 +0100 -rev489 - * create an opl.icn into the OPL folder on MC, so the PS2 browser doesn't display it as corrupted data - Sun Nov 21 15:02:05 2010 +0100 -rev488 - * IPCONFIG.DAT file now loaded from the alternate device too - Fri Nov 19 11:07:24 2010 +0100 -rev487 - When no config for OPL is found: - Fri Nov 19 00:24:13 2010 +0100 -rev486 - Fix in samba code: server buffer size could be set to 0 due to the type casting - Wed Nov 17 23:25:56 2010 +0100 -rev485 - small fixes (USB delay, result return) - Wed Nov 10 20:27:28 2010 +0100 -rev484 - * Applications configuration file is read from alternate device too - Sat Oct 30 20:22:45 2010 +0200 -rev483 - Enable saving settings capability on USB or HDD. - Sat Oct 30 19:40:47 2010 +0200 -rev482 - small changes - Sat Oct 30 03:20:45 2010 +0200 -rev481 - * IO thread stabilization attempt (not sure if it helps, but it seems so) - Fri Oct 15 23:57:44 2010 +0200 -rev480 - small bug with VMC settings - Fri Oct 15 20:26:44 2010 +0200 -rev479 - add some error messages to warn user of various failing situations - Wed Oct 06 19:47:22 2010 +0200 -rev478 - fix compat flag problem on HDD due to merge - Wed Oct 06 19:41:50 2010 +0200 -rev477 - make alt background configurable too - Tue Oct 05 15:32:05 2010 +0200 -rev476 - Start the pads before loading the config, as we may have to set the scrolling speed. - Mon Oct 04 20:50:07 2010 +0200 -rev475 - few changes for SMB (in particular for device in "security share" mode - Mon Oct 04 20:05:11 2010 +0200 -rev474 - added FILEIO version check, to be sure - Mon Oct 04 19:11:24 2010 +0200 -rev473 - fix hdd partition check - Mon Oct 04 17:23:39 2010 +0200 -rev472 - patch for FILEIO remove rpc handler - Mon Oct 04 10:20:37 2010 -0500 -rev471 - updated smblab - Mon Oct 04 16:52:40 2010 +0200 -rev470 - reviewed labs so they can compile - Mon Oct 04 12:48:31 2010 +0200 -rev469 - only show VMC delete (and change size) button if "Rename/delete" operation are enabled in settings - Mon Oct 04 12:03:13 2010 +0200 -rev468 - fioXXX operations on SMB makes strange things - Sun Oct 03 21:05:29 2010 +0200 -rev467 - fioXXX operations on SMB make strange things ... - Sun Oct 03 16:37:42 2010 +0200 -rev466 - merge vmc fork - Sun Oct 03 16:37:08 2010 +0200 -rev465 - fix DNAS settings bug - Sun Oct 03 08:03:17 2010 -0500 -rev464 - fix for invalid background when rendering guiMsgBox (deletion warning of VMC items) - Sun Oct 03 14:33:52 2010 +0200 -rev463 - WARNING: uncertain change ! - Sun Oct 03 11:35:49 2010 +0200 -rev462 - remember last focused item when reseting dialog - Sun Oct 03 00:49:09 2010 +0200 -rev461 - I like to commit in two-phases ... - Sun Oct 03 00:28:10 2010 +0200 -rev460 - fix for OK buttons - Sat Oct 02 11:21:02 2010 +0200 -rev459 - Opps, disable VMC by default ... (as it is only GUI stuff, we don't want to confuse users ;)) - Sat Oct 02 11:19:48 2010 +0200 -rev458 - Added VMC GUI (first shot) - Sat Oct 02 00:38:50 2010 +0200 -rev457 - moved IOP modules to more explicit subfolders - Fri Oct 01 23:38:07 2010 +0200 -rev456 - added mcman module and genvmclab - Thu Sep 30 17:28:59 2010 +0200 -rev455 - save config files individually - Mon Sep 27 20:33:56 2010 +0200 -rev454 - prepare stuff for VMC - Sun Sep 19 12:37:24 2010 +0200 -rev453 - * removing settings for hdd was doing bad things - Sun Sep 19 00:52:26 2010 +0200 -rev452 - * shutdown routine was free-ing stuff still used into the launch method ... - Sat Sep 18 23:04:37 2010 +0200 -rev451 - more corrections - Sat Sep 18 22:26:05 2010 +0200 -rev450 - save config *before* shutting down the config files - Sat Sep 18 00:40:21 2010 +0200 -rev449 - fixed a few bugs: - Sat Sep 18 00:24:12 2010 +0200 -rev448 - * compatibility settings for HDD are now saved into the config files. - Fri Sep 17 22:43:08 2010 +0200 -rev447 - fixed broken themes on MC - Fri Sep 17 21:35:50 2010 +0200 -rev446 - should fix the invalid list positioning - Mon Sep 13 22:11:29 2010 +0200 -rev445 - added file fragmentation test for USB games, code from Polo35 (VMC branch) - Sun Sep 12 11:23:06 2010 +0200 -rev444 - splitted settings into "main settings" and "graphic settings" - Sat Sep 11 23:45:42 2010 +0200 -rev443 - added "childproof" mode: - Sat Sep 11 22:36:59 2010 +0200 -rev442 - add rename/delete functionality to Apps - Wed Sep 08 23:58:07 2010 +0200 -rev441 - added hint for "X Play" - Wed Sep 08 22:44:13 2010 +0200 -rev440 - added genvmc command-line tool for pc - Sat Sep 04 21:55:21 2010 +0200 -rev439 - update modload version check in MODLOAD hooking - Sat Sep 04 20:27:17 2010 +0200 -rev438 - added rename and delete functionality for UL format (ul.cfg) - Sat Sep 04 10:23:55 2010 +0200 -rev437 - only apply sorting, when autosort settings enabled - Fri Sep 03 23:22:33 2010 +0200 -rev436 - fix update of HDD game list after restarting modules (when leaving HDLD server) - Fri Sep 03 20:43:36 2010 +0200 -rev435 - enable HDD rename/delete - Fri Sep 03 19:55:34 2010 +0200 -rev434 - fix again for those games resetting IOP with null arg - Fri Sep 03 09:57:04 2010 +0200 -rev433 - Added "rename" and "delete" functionalities for games. - Fri Sep 03 09:07:57 2010 +0200 -rev432 - smbman: added debug prints ability - Thu Sep 02 23:07:32 2010 +0200 -rev431 - use MODLOAD hooking on IOP instead of patching LMB on EE - Thu Sep 02 19:01:13 2010 +0200 -rev430 - fix for alternative EE core build - Thu Sep 02 16:07:15 2010 +0200 -rev429 - fix: give some delay to ingame mass driver - Fri Aug 20 11:05:42 2010 +0200 -rev428 - EE core: get rid of libc dependency - Thu Aug 19 09:56:14 2010 +0200 -rev427 - IGR: use kernel's InitializeTLB instead of syscall - Wed Aug 11 18:52:17 2010 +0200 -rev426 - EE core: rewrote all syscall hooks in asm - Sun Aug 08 20:52:36 2010 +0200 -rev425 - EE core: a few tweaks to asm code - Sat Aug 07 21:36:24 2010 +0200 -rev424 - EE core: improved LoadExecPS2/SifSetDma hooks - Thu Aug 05 22:28:01 2010 +0200 -rev423 - update spanish language file - Thu Aug 05 21:27:58 2010 +0200 -rev422 - added Italian language file - Thu Aug 05 19:53:32 2010 +0200 -rev421 - EE core: a few tweaks to asm code - Wed Aug 04 20:05:27 2010 +0200 -rev420 - EE core: improve LoadExecPS2 hooking (fixes Tecmo Hit Parade SLPS_204.01) - Tue Aug 03 20:35:24 2010 +0200 -rev419 - crazyc: add MC dump ability to genvmc - Tue Aug 03 17:03:25 2010 +0200 -rev418 - fix for Star Ocean 3 - Till the End of Time (broken in r395) - Mon Aug 02 21:42:12 2010 +0200 -rev417 - fix for V-Rally 3 PAL (SLES_507.25) - Mon Aug 02 16:31:25 2010 +0200 -rev416 - fix for Shaun Palmer's Pro Snowboarder US (SLUS_201.99) - Sat Jul 31 21:31:30 2010 +0200 -rev415 - few i18n changes - Sat Jul 31 17:37:41 2010 +0200 -rev414 - clean-up in GUI strings (removed old entries, added missing values) - Fri Jul 30 22:51:02 2010 +0200 -rev413 - fix for NRA Gun Club (SLUS_214.32) - Thu Jul 29 21:30:45 2010 +0200 -rev412 - improvements to genvmc module - Mon Jul 26 20:26:00 2010 +0200 -rev411 - added genvmc IOP module - Mon Jul 26 14:19:49 2010 +0200 -rev410 - fix attempt for Jak X - Sun Jul 25 17:22:56 2010 +0200 -rev409 - fix for those games rebooting IOP with null arg (fixes Bloody Roar 3) - Sat Jul 24 10:09:38 2010 +0200 -rev408 - fix for GTA 3 a-spec over SMB - Fri Jul 23 17:39:26 2010 +0200 -rev407 - cdvdfsv: name module like orginal one - cdvd_ee_driver - Fri Jul 23 13:39:36 2010 +0200 -rev406 - EE core: fix for Quake III Revolution - Fri Jul 23 10:40:53 2010 +0200 -rev405 - fix for Jak 3 - Thu Jul 22 18:25:23 2010 +0200 -rev404 - fix for Full Spectrum Warrior - Thu Jul 22 08:49:21 2010 +0200 -rev403 - fix for those having SMB slowdown/freeze issue on some setups - Wed Jul 21 21:44:41 2010 +0200 -rev402 - cdvdman: fix lseek fileIO (fixes Shadow of Ganymede) - Wed Jul 21 18:52:43 2010 +0200 -rev401 - HDD core fix: init filesystem before to return disc type (fixes Xyanide Resurrection) - Tue Jul 20 20:16:31 2010 +0200 -rev400 - Added translation information for custom language - Tue Jul 20 16:08:45 2010 +0200 -rev399 - dlanor: fix for invisible cursor GUI glitch - Tue Jul 20 15:29:15 2010 +0200 -rev398 - fix for Viewtiful Joe - Sun Jul 18 16:05:12 2010 +0200 -rev397 - fix for EveryBody's Golf and other games - Sun Jul 18 15:58:03 2010 +0200 -rev396 - added feature to be able to disable sceSifStopModule/sceSifUnloadModule - Sat Jul 17 17:26:26 2010 +0200 -rev395 - hook SCE's SifLoadModuleBuffer to fake some modules to be loaded correctly through LoadModuleBuffer calls - Sat Jul 17 16:42:48 2010 +0200 -rev394 - fix for Kya: Dark Lineage PAL (SLES_514.73) - Sat Jul 17 09:33:09 2010 +0200 -rev393 - fix for V-Rally 3 US (SLUS_204.96) - Thu Jul 15 15:06:51 2010 +0200 -rev392 - fix for Kya: Dark Lineage US (SLUS_204.40) - Thu Jul 15 13:21:31 2010 +0200 -rev391 - changed the patches for Prince Of Persia: The Two Thrones - Wed Jul 14 19:19:34 2010 +0200 -rev390 - fix for Prince of Persia: The Two Thrones NTSC U (SLUS_212.87) - Wed Jul 14 19:15:35 2010 +0200 -rev389 - hdldsvr: use real HDD writes - Tue Jul 13 12:35:52 2010 +0200 -rev388 - udptty: redirect Kprintf output to tty - Tue Jul 13 09:41:41 2010 +0200 -rev387 - cdvdman: set cdstatus to CDVD_STAT_PAUSE in sceCdStStart/sceCdStResume - Mon Jul 12 20:50:43 2010 +0200 -rev386 - added EELOAD patches - Sun Jul 11 16:42:07 2010 +0200 -rev385 - fix for Suikoden IV (HDD) broken in r359 - Wed Jul 07 19:24:05 2010 +0200 -rev384 - fix for Prince of Persia: The Two Thrones PAL (SLES_537.77) - Tue Jul 06 09:49:52 2010 +0200 -rev383 - cdvdman: do not allocate IOP memory in cd callback handler (fixes Syphon Filter Logan's Shadow on HDD) - Mon Jul 05 19:01:47 2010 +0200 -rev382 - EE core: change stack pointer a bit earlier - Sun Jul 04 18:30:17 2010 +0200 -rev381 - EE core: use an intermediate stack during the IOP reset 'hook' code - Fri Jul 02 21:59:55 2010 +0200 -rev380 - use maximum priority for EE SMB password hashing thread - Fri Jul 02 21:50:10 2010 +0200 -rev379 - Fix for Suikoden V (in patch form) - Fri Jul 02 19:30:42 2010 +0200 -rev378 - fix for Max Payne EU version (SLES_503.25) - Fri Jul 02 16:19:09 2010 +0200 -rev377 - * make arrow icons customizable - Thu Jul 01 21:08:36 2010 +0200 -rev376 - PS3 fix 2: use XLOADFILE when building EELOADCNF - Wed Jun 30 23:44:26 2010 +0200 -rev375 - PS3 fix 1: reinstated cddev module use in EE core - Wed Jun 30 21:47:52 2010 +0200 -rev374 - * don't unmount pfs0 when we are launching an app that is on HDD - Wed Jun 30 21:21:18 2010 +0200 -rev373 - fix number 2 for Kingdom Hearts 2 gummi ship missions (should fix all regions) - Wed Jun 30 21:00:04 2010 +0200 -rev372 - fix for Kingdom Hearts 2 (SLUS_210.05) freeze on gummi ship missions - Wed Jun 30 14:38:03 2010 +0200 -rev371 - Apply Max Payne US patch on all 3 cores - Wed Jun 30 11:01:15 2010 +0200 -rev370 - SMSTCPIP: revert ARP_QUEUEING setting change (should fix broken Downhill Domination - SCUS_971.77 via SMB) - Tue Jun 29 16:56:26 2010 +0200 -rev369 - added compatibility mode 8 (should fix NFS Underground 2 - SLUS_210.65) - Tue Jun 29 16:45:45 2010 +0200 -rev368 - fix for the recent freezing using themes - Mon Jun 28 19:39:40 2010 +0200 -rev367 - changed smbauth & tcpip threads priorities (fixes Spiderman 3 and Genji) - Mon Jun 28 18:08:42 2010 +0200 -rev366 - link GUI SMB auth stuff to SMB core - Mon Jun 28 08:34:57 2010 +0200 -rev365 - * startup logo implementation, with a placeholder Logo - Sun Jun 27 22:55:56 2010 +0200 -rev364 - SMB core: do not perform password hashing if SMB server uses plaintext passwords - Sun Jun 27 20:41:48 2010 +0200 -rev363 - Max Payne US version (SLUS_202.30) fix for SMB use - Sun Jun 27 19:38:17 2010 +0200 -rev362 - EE core: added a ResetSPU() in LoadExecPS2 hook - Sun Jun 27 18:53:00 2010 +0200 -rev361 - added User Security Level support to SMB core - Sun Jun 27 18:51:33 2010 +0200 -rev360 - cdvdman: change back SceCdTrayReq traycheck return value - Sat Jun 26 22:04:12 2010 +0200 -rev359 - SMB core: save more IOP memory to increase compatibility - Sat Jun 26 09:38:33 2010 +0200 -rev358 - removed cddev module use from EE core, removed cddev - Fri Jun 25 10:36:55 2010 +0200 -rev357 - default to settings menu when no devices started or no config file found - Wed Jun 23 13:31:22 2010 +0200 -rev356 - * re-enable game "test" functionality (from compatibility settings) - Wed Jun 23 12:55:53 2010 +0200 -rev355 - use ICO fix (r346) only in compatibility mode 7 - Wed Jun 23 12:06:48 2010 +0200 -rev354 - smbman: do not rely on EndOfSearch but rather SearchCount field - Wed Jun 23 09:54:52 2010 +0200 -rev353 - remove uneeded stuff from ps2link module - Tue Jun 22 22:31:11 2010 +0200 -rev352 - EE core: remove InitializeUserMemory() patch when removing kernel hooks - Mon Jun 21 12:43:50 2010 +0200 -rev351 - fix: do no longer use sbv_patch_user_mem_clear() to be compatible with faulty DMS4 modchip - Mon Jun 21 11:02:31 2010 +0200 -rev350 - ps2link module: corrected Makefile - Sun Jun 20 19:46:58 2010 +0200 -rev349 - reload ps2link module on 'make debug' rule - Sun Jun 20 19:00:52 2010 +0200 -rev348 - fix: HDD gamelist was deallocated too early in HDD game launch process - Sat Jun 19 11:52:19 2010 +0200 -rev347 - * ISO support also "enabled" for USB (don't know what is the filesize limit, either 2Go or 4Go) - Sat Jun 19 11:08:28 2010 +0200 -rev346 - cdvdfsv: remove a 2KB of wasted IOP mem (fixes ICO - SCUS_971.59 via SMB) - Fri Jun 18 22:36:12 2010 +0200 -rev345 - SMSTCPIP: adjust PBUF_POOL_SIZE for ingame use (fixes again Disgaea SLUS_206.66 broken since r283) - Fri Jun 18 22:08:30 2010 +0200 -rev344 - added a new compatibilty mode: "reduce the buffers used by cdvdman/cdvdfsv" - Thu Jun 17 12:14:37 2010 +0200 -rev343 - added make_changelog.sh script and DETAILED_CHANGELOG file - Wed Jun 16 21:56:10 2010 +0200 -rev342 - cdvdman: check faulty filepath(more than one ';1') - fixes WWE Smackdown! Shut your mouth (SLUS_204.83) - Wed Jun 16 20:25:36 2010 +0200 -rev341 - use ioptrap module while debugging - Wed Jun 16 19:51:14 2010 +0200 -rev340 - fix for HDD games compat modes saving to another game when using sorted list - Wed Jun 16 14:12:26 2010 +0200 -rev339 - cdvdman fix: dread must return entry size (fixes Captain Tsubasa SLPS_256.91) - Mon Jun 14 20:30:37 2010 +0200 -rev338 - removed netlog module (now replaced by UDPtty) - Sun Jun 13 17:37:48 2010 +0200 -rev337 - make use of UDPtty for in-game debugging - Sun Jun 13 14:55:24 2010 +0200 -rev336 - 10K patch fix: only patch kernel if not already patched - Sun Jun 13 14:48:15 2010 +0200 -rev335 - fix for exiting kernel mode correctly while applying 10K patches - Sat Jun 12 15:05:24 2010 +0200 -rev334 - use more versatile code to get ROMVER info in 10K patches - Sat Jun 12 13:03:30 2010 +0200 -rev333 - remove debug from 10K patches - Sat Jun 12 12:47:16 2010 +0200 -rev332 - 10K fix 2: OPL now runs on original 10K kernel - Fri Jun 11 23:42:36 2010 +0200 -rev331 - loader: do a system restart in LoadExecPS2 hook as the real syscall does (reinitialize GS, INTC, TIMER, DMAC, VU0, VU1, VIF0, VIF1, GIF, IPU, FPU and ScratchPad - Fri Jun 11 23:39:48 2010 +0200 -rev330 - hdd.c: do not deallocate partion table when it's not allocated - Wed Jun 09 21:13:38 2010 +0200 -rev329 - free the HDL game list and HDD partition table in hddCleanup() - Tue Jun 08 22:06:03 2010 +0200 -rev328 - 10K fix 1: OPL now runs on patched 10K kernel - Tue Jun 08 20:07:04 2010 +0200 -rev327 - modified Disc ID stuff to no longer freeze on No disc/Invalid disc - Tue Jun 08 12:07:01 2010 +0200 -rev326 - fix to avoid warning on unused variable in hdd.c - Sun Jun 06 21:08:31 2010 +0200 -rev325 - modified and tested HDD deleting game code (real writes still deactivated) - Sun Jun 06 16:00:49 2010 +0200 -rev324 - use EE SIO debug in the loader - Sun Jun 06 15:57:29 2010 +0200 -rev323 - use EE SIO debug output in the GUI on 'make EESIO_debug' - Sat Jun 05 14:53:15 2010 +0200 -rev322 - cdvdman: be compatible with mass storage device having sector size of 4096 - Fri Jun 04 11:18:35 2010 +0200 -rev321 - usbhdfsd: added an ioctl to return mass storage device sectorsize - Thu Jun 03 12:49:06 2010 +0200 -rev320 - * Fix for issue #29 (dia.c tooltip display) - Thu Jun 03 11:26:33 2010 +0200 -rev319 - Put plasma speed back after the framerate optimization - Wed Jun 02 19:40:33 2010 +0200 -rev318 - cdvdman: be compatible with mass storage having sector size of 512, 1024, 2048 - Wed Jun 02 19:19:00 2010 +0200 -rev317 - * separate background rendering (Issue #31) - Wed Jun 02 18:32:30 2010 +0200 -rev316 - usbhdfsd: removed unused code in fs_getFileStartSector() - Wed Jun 02 18:29:25 2010 +0200 -rev315 - cdvdman: fix for my previous code tweak breaking compat with SMB games in ul format - Wed Jun 02 16:42:36 2010 +0200 -rev314 - cdvdman: code tweaking for opening ISO file(s) - Wed Jun 02 15:38:01 2010 +0200 -rev313 - cdvdman: optimized code size for plain ISO support in cdvdman_ReadSect() - Wed Jun 02 15:19:27 2010 +0200 -rev312 - fix for theme choosen not saving - Wed Jun 02 13:05:27 2010 +0200 -rev311 - use LOG() rather than printf() - Mon May 31 20:12:26 2010 +0200 -rev310 - fix for issue #23 - Mon May 31 12:03:14 2010 +0200 -rev309 - make use of udptty in debug version - Sun May 30 19:36:35 2010 +0200 -rev308 - added udptty module - Sun May 30 17:25:10 2010 +0200 -rev307 - forgot system.h, now added - Sat May 29 20:34:44 2010 +0200 -rev306 - added system.h and sysLoadModuleBuffer to able to check for modules already loaded - Sat May 29 18:03:54 2010 +0200 -rev305 - added lanman module & lanlab - Sat May 29 17:57:43 2010 +0200 -rev304 - moved smblab & hdldsvrlab to labs folder - Sat May 29 16:00:14 2010 +0200 -rev303 - small fix in game disc settings handling - Sat May 29 13:39:14 2010 +0200 -rev302 - * stop io timer while io is blocked (seems not to affect the hdl server transfer rate though :( ) - Sat May 29 01:33:40 2010 +0200 -rev301 - buffered write (for config file) - Fri May 28 18:14:10 2010 +0200 -rev300 - Fixing issue #21 - Fri May 28 16:54:37 2010 +0200 -rev299 - * Maybe a more resource friendly (but a bit awkward for now) hdld svr screen - Thu May 27 19:44:24 2010 +0200 -rev298 - smbman: reconnect, re-logon and re-open share on connection loss - Thu May 27 18:51:56 2010 +0200 -rev297 - smbman: removed connect/disconnect (now done by logon/logoff) - Thu May 27 16:47:17 2010 +0200 -rev296 - SMSMAP: do not wait forever for link established (wait around 10s otherwise fails to load) - Thu May 27 15:13:17 2010 +0200 -rev295 - added hdldsvrlab for testing purpose - Thu May 27 14:29:57 2010 +0200 -rev294 - fix for SMB "file open" in APPEND mode - Thu May 27 11:44:40 2010 +0200 -rev293 - Removing unzip, not used any more - Thu May 27 11:33:26 2010 +0200 -rev292 - fix for themes listing in SMB mode - Thu May 27 08:32:30 2010 +0200 -rev291 - Fix for missing Art in SMB mode - Wed May 26 23:01:04 2010 +0200 -rev290 - renamed hdl.c to hdd.c and hddFormat() to hddGetFormat() - Wed May 26 22:27:36 2010 +0200 -rev289 - * Fork merge: Porting back the GUI repository changes - Wed May 26 20:48:07 2010 +0200 -rev288 - added hddFormat, hddDeleteHDLGame (untested) - Wed May 26 20:01:23 2010 +0200 -rev287 - fix for LoadHdldsvr() and UnloadHdldSvr() - Tue May 25 08:35:24 2010 +0200 -rev286 - added UnloadHdldSvr() - Sun May 23 17:25:33 2010 +0200 -rev285 - added LoadHdldSvr() to GUI (currently never called) - Sun May 23 16:08:35 2010 +0200 -rev284 - hdldsvr: use real writes (the module is not loaded by the GUI) - Sun May 23 09:45:54 2010 +0200 -rev283 - hdldsvr: added CMD_WRIT & CMD_WRIS, completed UDP thread part (only fake writes) - Sat May 22 18:18:32 2010 +0200 -rev282 - hdldsvr: added CMD_FLSH & CMD_POWX - Sat May 22 11:41:45 2010 +0200 -rev281 - hdldsvr: a fix in interpreting/replying command result - Fri May 21 10:51:18 2010 +0200 -rev280 - hdldsvr: added CMD_STAT & CMD_READ (hdl_dump able to attach and list games) - Fri May 21 10:11:22 2010 +0200 -rev279 - added hdldsvr IOP module skeleton - Fri May 21 10:07:45 2010 +0200 -rev278 - added a specific SMSTCPIP for ingame use, and re-enabled UDP in the normal one - Thu May 20 20:13:19 2010 +0200 -rev277 - Anti-freeze fix for NBSS Session KeepAlive in smbman and ingame SMB core - Thu May 20 19:57:09 2010 +0200 -rev276 - make use of new smbman fileXio functions - Wed May 19 21:20:43 2010 +0200 -rev275 - applied SMB connection speedup to ingame SMB core - Tue May 18 20:28:56 2010 +0200 -rev274 - smbman: finished chdir implementation - Tue May 18 12:43:54 2010 +0200 -rev273 - smbman: implemented dopen/dread/dclose/chdir (chdir is not complete) - Tue May 18 12:00:32 2010 +0200 -rev272 - smbman: implemented FindFirst2, FindNext2 requests, different tweaks to make connection faster - Mon May 17 22:16:40 2010 +0200 -rev271 - smbman: fixed a killer buffer overflow while generating DES keys - Mon May 17 17:11:56 2010 +0200 -rev270 - smbman: added mkdir IO function, make LogOn not retrying forever - Mon May 17 12:37:30 2010 +0200 -rev269 - smbman: added Rename request and his rename IO function - Sun May 16 19:03:49 2010 +0200 -rev268 - smbman: added Delete Directory request and his rmdir IO function - Sun May 16 17:43:06 2010 +0200 -rev267 - smbman: added Delete request and his remove IO function - Sun May 16 16:59:25 2010 +0200 -rev266 - smbman: added poll() to not lock forever using lwip_recv - Sun May 16 16:35:31 2010 +0200 -rev265 - smbman: fix for closing previously created tcp connection before opening it (in the same module instance) - Sun May 16 14:01:51 2010 +0200 -rev264 - smbman: added timer to echo the SMB server every 3 sec while not doing IO - Sun May 16 13:36:20 2010 +0200 -rev263 - smbman: added QueryDiskInfo request and his devctl function - Sun May 16 13:21:34 2010 +0200 -rev262 - smbman: added file IO getstat support - Sat May 15 17:15:58 2010 +0200 -rev261 - smbman: a few tweaks to the packet structs - Sat May 15 16:05:06 2010 +0200 -rev260 - smbman: added QueryPathInformation Trans2 request - Fri May 14 14:04:09 2010 +0200 -rev259 - smbman: modified smb_ReadAndX and smb_WriteAndX to support large files (>4GB) - Fri May 14 13:32:58 2010 +0200 -rev258 - smbman: added generic lseek64 support (needs PS2SDK lseek64 fix to work) - Fri May 14 10:17:05 2010 +0200 -rev257 - smbman: reviewed devctl functions - Thu May 13 22:40:36 2010 +0200 -rev256 - smbman: reviewed AddPassword function - Thu May 13 16:14:45 2010 +0200 -rev255 - * added method for managing passwords, re-enable smb_NTCreateAndX, small fix when read only mode requested - Thu May 13 11:48:13 2010 +0200 -rev254 - added smblab to test smbman functions - Wed May 12 22:33:19 2010 +0200 -rev253 - smbman: finished smb_NetShareEnum(), added smb_Echo(), refined devctls - Wed May 12 20:43:27 2010 +0200 -rev252 - tagged r245 as release 0.7 - Wed May 12 17:52:40 2010 +0200 -rev251 - smbman: fixed fatal error for compiling in smb_NetShareEnum() - Tue May 11 20:56:56 2010 +0200 -rev250 - added a few commands to smbman (TreeDisconnect, LogOffAndX, NetShareEnum) - Tue May 11 20:53:03 2010 +0200 -rev249 - Porting back the opl2iso into the main repository - Tue May 11 20:48:45 2010 +0200 -rev248 - added write support to smbman - Sun May 09 19:17:26 2010 +0200 -rev247 - added NTLMv1 authentification ability to smbman - Sun May 09 17:06:37 2010 +0200 -rev246 - added user security level to smbman, currently supports plaintext/encrypted passwords and LanMan authentification - Sat May 08 22:49:44 2010 +0200 -rev245 - updated version number to 0.7 and changelog, credits - Sat May 08 18:59:02 2010 +0200 -rev244 - izdubar: fix for 18K - Tue May 04 17:13:11 2010 +0200 -rev243 - IGR2 Fix 5. - Tue May 04 16:37:28 2010 +0200 -rev242 - IGR2 Fix 4. - Tue Mar 30 11:53:11 2010 +0200 -rev241 - corrected polish translation by Berion - Tue Mar 23 13:27:19 2010 +0100 -rev240 - Added an embedded Elf loader to the GUI (actually used on Exit to Elf) - Mon Mar 15 10:06:28 2010 +0100 -rev239 - IGR2 fix 3. - Sat Mar 13 20:29:29 2010 +0100 -rev238 - Pad repeat pre-delay (double the repeat delay for now). - Sat Mar 06 18:17:59 2010 +0100 -rev237 - Renamed iso2usbld to iso2opl, fix for running iso2opl on Big Endian systems - Thu Mar 04 19:09:04 2010 +0100 -rev236 - IGR2 fix 2. - Wed Mar 03 19:47:29 2010 +0100 -rev235 - Gilgamesh88: fix read buffer double increment bug in smbman.c - Tue Mar 02 23:55:57 2010 +0100 -rev234 - IRG2 first fix. ;) - Tue Mar 02 11:36:07 2010 +0100 -rev233 - smbman, usbhdfsd: just cosmetics, fixed indents and leading/trailing whitespaces - Mon Mar 01 23:48:20 2010 +0100 -rev232 - eesync/imgdrv: just cosmetics - Mon Mar 01 20:05:55 2010 +0100 -rev231 - just cosmetics: fixed indents, removed leading/trailing whitespaces - Mon Mar 01 11:31:27 2010 +0100 -rev230 - Fix: be sure HDD is actually used and selected before storing - Mon Mar 01 09:54:14 2010 +0100 -rev229 - HDD settings only stored on save, not test (untested) - Mon Mar 01 08:53:18 2010 +0100 -rev228 - merging branches - Mon Mar 01 08:34:45 2010 +0100 -rev227 - Two more fixes by Izdubar - Sun Feb 28 21:39:54 2010 +0100 -rev226 - Rewrote completly IGR. - Sun Feb 28 21:39:13 2010 +0100 -rev225 - dev9: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 21:30:38 2010 +0100 -rev224 - cddev, discID: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 20:43:27 2010 +0100 -rev223 - cdvdfsv: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 20:32:54 2010 +0100 -rev222 - cdvdman: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 20:18:56 2010 +0100 -rev221 - A couple of fixes: - Sun Feb 28 17:06:08 2010 +0100 -rev220 - * this slipped through - default delay should be 7 - Fri Feb 26 08:58:19 2010 +0100 -rev219 - * Cummulative patch by gilgamesh - consistency improvements - Thu Feb 25 18:53:06 2010 +0100 -rev218 - New coloured icons by Gilgamesh88 - Thu Feb 25 18:49:47 2010 +0100 -rev217 - Added PCMCIA support (auto-detected, should work with 18K atm) - Thu Feb 25 18:46:47 2010 +0100 -rev216 - Fix again to the sed command in all modules Rules.make files causing 'unrecognized -mcpu=r3000 option' on some dev environments - Mon Feb 22 09:10:51 2010 +0100 -rev215 - Working IGR fix for NFS Underground2 this time. :D - Sun Feb 21 13:39:36 2010 +0100 -rev214 - Removed PS2ETH and GSKIT vars definition from Makefile - Tue Feb 16 20:40:56 2010 +0100 -rev213 - Corrected misuse of ps2-packer in Makefile, sorry for those who'll need to move it - Tue Feb 16 20:16:19 2010 +0100 -rev212 - IGR fix 2. - Tue Feb 16 16:02:03 2010 +0100 -rev211 - Modified sed in Rules.make files to fix unrecognized option -mcpu=r3000 when using fr_FR.UTF-8 as LANG env var on some Linux distro - Tue Feb 16 15:24:30 2010 +0100 -rev210 - Add "Disable Debug Colors" setting. - Tue Feb 16 11:40:27 2010 +0100 -rev209 - zipped theme support (very slow) - Mon Feb 15 19:45:22 2010 +0100 -rev208 - Fix a bug when setting compatibility in multiple device. - Sun Feb 14 22:38:46 2010 +0100 -rev207 - IGR fixs: - Sun Feb 14 20:50:03 2010 +0100 -rev206 - A fix for the pink freezes when using custom lang file - Sun Feb 14 12:36:19 2010 +0100 -rev205 - Adding the ability to load language localisation files - Fri Jan 29 17:30:57 2010 +0100 -rev204 - Optimization of scePadRead hooking time. - Thu Jan 28 19:04:00 2010 +0100 -rev203 - Revert to sbv patch use with igr too. - Tue Jan 26 18:32:04 2010 +0100 -rev202 - Revert to Sbv patches use for old game compatibility. - Sun Jan 24 19:12:07 2010 +0100 -rev201 - Add a poweroff combo trick. - Sun Jan 24 10:20:58 2010 +0100 -rev200 - Add compat mode 6 to disable IGR. ( In compatibility settings ) - Sat Jan 23 23:34:44 2010 +0100 -rev199 - Loader size optimization. - Sat Jan 23 14:59:52 2010 +0100 -rev198 - Sorry .s file don't want to be push. - Sat Jan 23 14:41:15 2010 +0100 -rev197 - Loader size optimization. - Thu Jan 21 22:02:25 2010 +0100 -rev196 - home & end for HDD games - Thu Jan 21 21:08:09 2010 +0100 -rev195 - some more pointer handling fixes - Thu Jan 21 18:59:25 2010 +0100 -rev194 - pagestart handling fixes - Thu Jan 21 17:24:15 2010 +0100 -rev193 - Merging branches - Thu Jan 21 17:17:07 2010 +0100 -rev192 - * Selection in static mode now not centered (HDLoader like) - Thu Jan 21 15:21:42 2010 +0100 -rev191 - SMSMAP: wait link status forever (hopefully it fixes freeze on 1 bug) - Thu Jan 21 15:19:56 2010 +0100 -rev190 - Fix sound loop bug when using in game reset. - Thu Jan 21 14:58:32 2010 +0100 -rev189 - In Game Reset first shot. ( Disabled for the moment ) - Thu Jan 21 00:06:19 2010 +0100 -rev188 - get rid of kernel mem usage for patches code and let it handled by the loader - Tue Jan 19 23:16:15 2010 +0100 -rev187 - Added some generic patching mode for some games - Fri Jan 15 13:26:36 2010 +0100 -rev186 - cosmetic changes again to patches table code - Thu Jan 14 14:31:08 2010 +0100 -rev185 - Added patch for Armored Core Nine Breaker NTSC US via USB - Wed Jan 13 20:26:43 2010 +0100 -rev184 - Added value check to the game patching process - Wed Jan 13 16:53:31 2010 +0100 -rev183 - Loader now uses game patches (actually Disgaea PAL USB/SMB fix) - Wed Jan 13 10:41:07 2010 +0100 -rev182 - Enabled game patches table before to launch the loader - Tue Jan 12 22:25:22 2010 +0100 -rev181 - Added game patches table code - Tue Jan 12 19:09:12 2010 +0100 -rev180 - Slower Dialog scrolling. Also a speed handling fix. - Tue Jan 12 18:53:03 2010 +0100 -rev179 - HDD autostart option added. - Tue Jan 12 18:32:17 2010 +0100 -rev178 - some cosmetic changes to PS3 network fix - Tue Jan 12 17:50:00 2010 +0100 -rev177 - fix to SMSMAP to be able to use network on PS3 - Tue Jan 12 13:33:16 2010 +0100 -rev176 - adjusted DMA modes implementation (functional now) - Tue Jan 12 12:45:43 2010 +0100 -rev175 - Added DMA mode in UI - Sat Jan 09 13:43:03 2010 +0100 -rev174 - v12/v13 HDD detect fix: information given by dlanor - Sat Jan 09 01:24:28 2010 +0100 -rev173 - modified and tested HDD write OK (for compat modes), still disabled - Fri Jan 08 14:33:15 2010 +0100 -rev172 - totally ignore native HDL compatibilty modes - Thu Jan 07 11:51:47 2010 +0100 -rev171 - fix for lack of file opened check in smbman - Wed Jan 06 22:21:32 2010 +0100 -rev170 - fix for modchip freezing (maybe not all modchips) - Wed Jan 06 21:27:09 2010 +0100 -rev169 - Untested: - Wed Jan 06 20:28:31 2010 +0100 -rev168 - fixing bug in hdd usage gui selection - Wed Jan 06 08:52:00 2010 +0100 -rev167 - a copy-paste warning fix - Tue Jan 05 22:38:32 2010 +0100 -rev166 - First shot of HDD integration into GUI. Compat modes very rough. Untested! - Tue Jan 05 22:13:53 2010 +0100 -rev165 - added dutch language - Tue Jan 05 20:42:05 2010 +0100 -rev164 - changes to redundant code in system.c, changes to HDD compat modes handling - Tue Jan 05 17:13:56 2010 +0100 -rev163 - changes for SOCOM 3 Online playing - Mon Jan 04 19:48:35 2010 +0100 -rev162 - added poweroff support (currently disabled) - Mon Jan 04 14:50:46 2010 +0100 -rev161 - updated CREDITS file - Mon Jan 04 11:35:12 2010 +0100 -rev160 - HDL code: fix potential overflow while changing game name - Sun Jan 03 18:48:26 2010 +0100 -rev159 - changes to HDL code (added ability to save compat flags and game name) - Sun Jan 03 15:59:19 2010 +0100 -rev158 - added ps2hdd module, adjusted code to support 48-bit LBA HDD and set Transfer Mode - Sun Jan 03 15:44:10 2010 +0100 -rev157 - added atad module - Sun Jan 03 14:39:45 2010 +0100 -rev156 - fix to cdvdman so that HDD core is able to detect network adapter - Sun Jan 03 11:16:39 2010 +0100 -rev155 - changes again to HDD code - Sun Jan 03 11:04:27 2010 +0100 -rev154 - changes to HDD code - Sat Jan 02 20:57:22 2010 +0100 -rev153 - added HDL layer to GUI (currently disabled) - Sat Jan 02 20:34:34 2010 +0100 -rev152 - Game ID GUI and injection implementation (for DNAS) - Sat Jan 02 14:50:04 2010 +0100 -rev151 - changes to hdl header struct - Sat Jan 02 12:40:45 2010 +0100 -rev150 - added code for internal HDD support (HDL format) to cdvdman - Fri Jan 01 20:18:19 2010 +0100 -rev149 - fixes to SMB code for NAS devices not supporting Unicode strings - Fri Jan 01 15:42:27 2010 +0100 -rev148 - fixed bug in cdvdfsv never returning CDVD_READY_READY state for blocking mode - Thu Dec 31 09:25:44 2009 +0100 -rev147 - changes to be able to use a valid disc ID on online games - Mon Dec 28 21:27:32 2009 +0100 -rev146 - Adding the ability to choose the default menu (USB, NET, HDD games). - Sun Dec 27 17:33:49 2009 +0100 -rev145 - Network startup forced to be synchronous (Solution for bug #16, hopefully) - Sun Dec 27 17:18:04 2009 +0100 -rev144 - Better randomization of the port value (And even more hacky). Improves network startup delays significantly here - Sun Dec 27 17:00:13 2009 +0100 -rev143 - tagged r142 to release 0.6 - Sun Dec 27 14:29:14 2009 +0100 -rev142 - Updated version number - Wed Dec 23 20:15:44 2009 +0100 -rev141 - Hacky SMB speedup: "Randomize" the source port value to avoid port reusal. - Wed Dec 23 19:15:48 2009 +0100 -rev140 - updated CHANGELOG/CREDTIS/README files - Wed Dec 23 13:20:55 2009 +0100 -rev139 - Added configurable exit button - Wed Dec 23 10:45:48 2009 +0100 -rev138 - Changed UI color controls - Tue Dec 22 22:25:22 2009 +0100 -rev137 - fixed long reconnection time (yellow screen) - Tue Dec 22 19:47:30 2009 +0100 -rev136 - Added support for multiple partitions - Tue Dec 22 17:33:33 2009 +0100 -rev135 - Fixing linux samba compatibility (White screen removal fix) - Tue Dec 22 16:54:22 2009 +0100 -rev134 - Changed modes text - Tue Dec 22 14:16:20 2009 +0100 -rev133 - changes to SMSUTILS so it doesn't use PS2SDKSRC env var to build - Tue Dec 22 13:14:19 2009 +0100 -rev132 - new core merging step3: adapted EE core to new IOP core - Mon Dec 21 18:52:28 2009 +0100 -rev131 - new core merging step2: added new modules - Mon Dec 21 16:51:23 2009 +0100 -rev130 - new core merging step1: deleted modules - Mon Dec 21 15:36:12 2009 +0100 -rev129 - Implemented sorting (via select) - Mon Dec 21 15:26:46 2009 +0100 -rev128 - Adding two new icons - Wed Dec 02 13:11:06 2009 +0100 -rev127 - tagged r126 to release 0.5 - Wed Dec 02 10:52:36 2009 +0100 -rev126 - * Added languages - Sun Nov 29 19:58:33 2009 +0100 -rev125 - Czech welcome message update - Sun Nov 29 16:28:09 2009 +0100 -rev124 - added ioctl cmd to usbhdfsd to retrieve physical file sector - Mon Nov 23 16:46:23 2009 +0100 -rev123 - added sifman module, currently unused - Sun Nov 22 11:59:09 2009 +0100 -rev122 - reduced buffers again in isofs/smbman - Sun Nov 15 20:10:27 2009 +0100 -rev121 - try to use IPCONFIG.DAT from mc in slot 2 - Sat Nov 14 16:54:05 2009 +0100 -rev120 - chaanged some modules rules.make to build properly on my Ubuntu environment - Fri Nov 13 18:55:53 2009 +0100 -rev119 - changes to lwipopts.h to reduce SMSTCPIP mem usage - Fri Nov 13 17:10:40 2009 +0100 -rev118 - reduced IOP mem usage for isofs/smbman modules - Fri Nov 13 14:42:11 2009 +0100 -rev117 - Correcting hints - Fri Nov 13 09:43:26 2009 +0100 -rev116 - Adding UI component hint feature. Hints on Compat settings now - Fri Nov 13 09:37:27 2009 +0100 -rev115 - enlighted mass driver mem usage for mode 2 - Thu Nov 12 20:51:39 2009 +0100 -rev114 - implemented mode 2: have lower mem usage in SMSTCPIP/smbman modules - Thu Nov 12 20:31:08 2009 +0100 -rev113 - Enabled SMSMAP/SMSTCPIP IOP modules - Thu Nov 12 19:26:35 2009 +0100 -rev112 - Fixed pink screen, and bugs in IOP reboot - Thu Nov 12 16:08:21 2009 +0100 -rev111 - reverted loader changes: stupid idea to choose g_buf address at runtime - Thu Nov 12 14:47:47 2009 +0100 -rev110 - added compat mode 1, inverted modes 4 & 5 - Wed Nov 11 22:26:12 2009 +0100 -rev109 - added compat mode 4 & 5 - Wed Nov 11 21:28:57 2009 +0100 -rev108 - added compat mode 3 - Wed Nov 11 21:08:01 2009 +0100 -rev107 - Moving the compat mask to third argument - Wed Nov 11 20:47:49 2009 +0100 -rev106 - FIX: Temporary fix - Second pink freeze for some games - This helps another bit - Wed Nov 11 16:21:25 2009 +0100 -rev105 - Virt. keyboard now uses button icons - Wed Nov 11 15:50:07 2009 +0100 -rev104 - FIX: This removes the freeze on second pink for some games (on my machine) - Wed Nov 11 14:15:09 2009 +0100 -rev103 - Renaming to lower case - caused Error opening with case sensitive linux filesystem - Wed Nov 11 10:54:19 2009 +0100 -rev102 - Adding select and start button icons by JNABK - Wed Nov 11 10:14:12 2009 +0100 -rev101 - FIX: Compat settings now seem to propagate well. Copy-paste introduced bug fixed - Wed Nov 11 10:09:52 2009 +0100 -rev100 - set IP changed flag to ensure IP settings get saved - Wed Nov 11 09:51:39 2009 +0100 -rev99 - Merging changes - Wed Nov 11 06:50:21 2009 +0100 -rev98 - * Pass in the compat settings in the same string - Tue Nov 10 22:08:55 2009 +0100 -rev97 - fix: saving config if SYS-CONF doesn't exists - Tue Nov 10 22:07:31 2009 +0100 -rev96 - Compat settings count now 5, propagation to loader.c implemented - Tue Nov 10 19:50:50 2009 +0100 -rev95 - changes to SMSTCPIP/include/lwipopts.h - Tue Nov 10 19:16:23 2009 +0100 -rev94 - added missing smap_opt.s, updated CREDITS file - Tue Nov 10 12:04:33 2009 +0100 -rev93 - add SMSMAP/SMSTCIP modules, currently not used - Tue Nov 10 11:34:52 2009 +0100 -rev92 - added stuff to build an alternate loader (suitable for Sonic Unleashed) - Tue Nov 10 11:23:26 2009 +0100 -rev91 - FIX: Config loading was removed. Putting it back - Tue Nov 10 10:25:24 2009 +0100 -rev90 - FIX: Error codes are <0, not <=0. This could affect loading if file handle had value 0 - Tue Nov 10 09:07:25 2009 +0100 -rev89 - reverted netlog loading accidentally committed - Tue Nov 10 09:06:29 2009 +0100 -rev88 - fix for freezing multi-elf games - Mon Nov 09 20:32:32 2009 +0100 -rev87 - Adding missing icons - Mon Nov 09 20:29:58 2009 +0100 -rev86 - FIX: Issue 10 (share name overflow) - Sun Nov 08 21:12:15 2009 +0100 -rev85 - Show icons at background in config dialogs - Sun Nov 08 20:04:14 2009 +0100 -rev84 - Changed name, updated spanish translation, and now info txt shows in selected language - Sun Nov 08 02:29:23 2009 +0100 -rev83 - added missing ioman_add header file for dev9 module - Sun Nov 08 02:13:54 2009 +0100 -rev82 - enlighted dev9 module and added dev9x device driver - Fri Nov 06 21:02:33 2009 +0100 -rev81 - renamed GetSyscall to GetSycallHandler and use syscallnr header - Fri Nov 06 20:57:03 2009 +0100 -rev80 - FIX: The remaining ip config fields renumbered. That should be it - Fri Nov 06 16:25:36 2009 +0100 -rev79 - Fix: IP config screen had all the settings moved by one (renumbered the dialog but not the value injection) - Fri Nov 06 08:48:56 2009 +0100 -rev78 - Fix for the recent error with media and parts reading. - Fri Nov 06 08:09:20 2009 +0100 -rev77 - reverting back isofs to rev71 - Thu Nov 05 12:39:02 2009 +0100 -rev76 - reverted cdvdman & isofs to rev70 - Wed Nov 04 18:12:29 2009 +0100 -rev75 - Reverting this (commit by accident) - Wed Nov 04 17:18:48 2009 +0100 -rev74 - * New compat mode ui (via triangle) - currently without function - Tue Nov 03 21:42:15 2009 +0100 -rev73 - added SIF and SIF RPC init calls to cdvdman - Tue Nov 03 21:39:13 2009 +0100 -rev72 - few changes to cdvdman and commented unneeded code in smbman - Tue Nov 03 18:50:05 2009 +0100 -rev71 - fix for those games opening files with other flag than O_RDONLY - Tue Nov 03 18:34:03 2009 +0100 -rev70 - fix: smaller elf at second make all - Mon Nov 02 18:09:42 2009 +0100 -rev69 - fix for some games freezing while searching for a non-existent file - Mon Nov 02 13:28:11 2009 +0100 -rev68 - Added ugly virtual keyboard - Mon Nov 02 12:09:40 2009 +0100 -rev67 - Merging changes - Sun Nov 01 23:21:19 2009 +0100 -rev66 - New data driven dialog code. Needs color, enum and string inputs to be complete. IP config rewritten to use it. - Sun Nov 01 20:25:52 2009 +0100 -rev65 - remove pink screen when a IOP reset hook has finished (set_reg_hook reaches 0) - Sun Nov 01 20:25:10 2009 +0100 -rev64 - fix for white screens: bad gamename crc32 calculation - Sun Nov 01 16:18:15 2009 +0100 -rev63 - Small file adressing fix - Sun Nov 01 11:50:30 2009 +0100 -rev62 - Merged changes - Sat Oct 31 19:06:23 2009 +0100 -rev61 - Some input system rewrites, scrolling after dialog fix, settings only saved on save settings subitem now - Sat Oct 31 12:22:29 2009 +0100 -rev60 - usbhdfsd: removed use of PS2SDKSRC env var - Sat Oct 31 12:18:09 2009 +0100 -rev59 - Network UI improvements: Port and autostart settings, network loading feedback - Sat Oct 31 12:08:12 2009 +0100 -rev58 - Config handling improved - now remembers the loaded config and stores to the same location - Sat Oct 31 09:11:53 2009 +0100 -rev57 - iso2usbld: only use long long and not __int64 - Sat Oct 31 07:09:53 2009 +0100 -rev56 - iso2usbld: added commented use of open/read/write/lsee64/close - Fri Oct 30 22:50:27 2009 +0100 -rev55 - build iso2usbld on make pc_tools - Fri Oct 30 21:00:58 2009 +0100 -rev54 - Adding the missing network icons, sorry everyone! - Fri Oct 30 11:37:17 2009 +0100 -rev53 - Adding network icons by JNABK - Fri Oct 30 08:05:09 2009 +0100 -rev52 - just corrected a comment - Thu Oct 29 20:25:46 2009 +0100 -rev51 - fix once again to avoid breaking compatibility - Thu Oct 29 17:02:08 2009 +0100 -rev50 - another fix to fake module load to avoid breaking compatibility - Thu Oct 29 16:58:07 2009 +0100 -rev49 - fix for faking some modules load correctly - Thu Oct 29 14:07:59 2009 +0100 -rev48 - fix for multi-elf games freezing on pink - Thu Oct 29 13:16:09 2009 +0100 -rev47 - fixes for iso2usbld to handle large ISO (>4Gb) - Wed Oct 28 20:22:14 2009 +0100 -rev46 - renamed PUBLIC share to PS2SMB - Wed Oct 28 18:29:11 2009 +0100 -rev45 - modified iso2usbld CFLAGS - Wed Oct 28 16:48:15 2009 +0100 -rev44 - create USBLD folder on mass if not existing - Wed Oct 28 13:49:58 2009 +0100 -rev43 - apply IP settings to loader/modules - Wed Oct 28 12:34:45 2009 +0100 -rev42 - Added IP configuration screen - Wed Oct 28 12:00:29 2009 +0100 -rev41 - different fixes, one very important for iso2usbld - Tue Oct 27 21:58:29 2009 +0100 -rev40 - Updated CHANGELOG, README and CREDITS - Tue Oct 27 20:58:24 2009 +0100 -rev39 - Added missing license headers - Tue Oct 27 16:13:35 2009 +0100 -rev38 - added support to network games trought SMB protocol - Mon Oct 26 20:27:06 2009 +0100 -rev37 - just acouple changes for isofs patch & cdvdman - Mon Oct 26 18:52:16 2009 +0100 -rev36 - allow isofs to handle up to 8 parts - Sat Oct 24 20:03:21 2009 +0200 -rev35 - added .hgtags - Sat Oct 24 17:56:28 2009 +0200 -rev34 - added missing readonly makefile for mass_driver - Sat Oct 24 16:14:24 2009 +0200 -rev33 - disabled write support for ingame mass_driver - Sat Oct 24 16:12:02 2009 +0200 -rev32 - added LICENSE, README, CREDITS and CHANGELOG - Sat Oct 24 16:09:31 2009 +0200 -rev31 - New_Iop_Reset: switched to reset with EELOADCNF - Fri Oct 23 10:20:06 2009 +0200 -rev30 - Now searchs for USBD.IRX in MC. If not exists load embedded usbd.irx for each platform - Thu Oct 22 20:27:52 2009 +0200 -rev29 - static mode now fit with JNABK templates also in PAL mode - Sun Oct 18 20:26:50 2009 +0200 -rev28 - Fix: Welcome text showing extra text - Sun Oct 18 00:48:15 2009 +0200 -rev27 - fix for PS3 with software emulation - Sat Oct 17 22:54:56 2009 +0200 -rev26 - Added spanish translation - Sat Oct 17 22:43:30 2009 +0200 -rev25 - Oops. These slipped through. Reverting - Sat Oct 17 20:44:42 2009 +0200 -rev24 - Adding save icon - Sat Oct 17 16:32:20 2009 +0200 -rev23 - Adding language support - Sat Oct 17 16:30:30 2009 +0200 -rev22 - * rewritten the config file handling (to use key=val lines) - Sat Oct 17 16:29:49 2009 +0200 -rev21 - * cleaning up the code a bit - all menu construction now in main, etc. - Tue Oct 13 21:56:57 2009 +0200 -rev20 - isofs: fixed bug in skipmod_check() - Tue Oct 13 17:55:35 2009 +0200 -rev19 - modified isofs: allow it to fake some module load from cdrom - Tue Oct 06 08:52:56 2009 +0200 -rev18 - fix for 8+3 elf's filename - Mon Oct 05 21:01:36 2009 +0200 -rev17 - Added messages of what is doing makefile - Sun Oct 04 20:44:48 2009 +0200 -rev16 - fix: cdvdman.c:1708: warning: unused variable `netlog_modname' - Sun Oct 04 20:43:49 2009 +0200 -rev15 - loader: modified Patch_Img into Patch_Mod using g_buf - Sun Oct 04 19:38:27 2009 +0200 -rev14 - loader now loads at e8000 and use g_buf at 88000 - Sun Oct 04 16:57:37 2009 +0200 -rev13 - modified cdvdman: added stream and other fixes - Sun Oct 04 15:45:04 2009 +0200 -rev12 - modified isofs to handle media type - Sun Oct 04 15:31:56 2009 +0200 -rev11 - moved IOP reset to LoadExecPS2 replacement - Sun Oct 04 15:13:06 2009 +0200 -rev10 - added debug over ethernet - Sun Oct 04 14:56:59 2009 +0200 -rev9 - Updated interface - Sun Oct 04 14:40:10 2009 +0200 -rev8 - Updated interface with dynamic menu - Sun Oct 04 02:34:51 2009 +0200 -rev7 - a few fixes so that it can compile - Fri Oct 02 18:40:33 2009 +0200 -rev6 - iso2usbld: fixes for linux build - Tue Sep 29 09:39:20 2009 +0200 -rev5 - iso2usbld: fixed those deprecated type casts - Sun Sep 27 21:55:27 2009 +0200 -rev4 - bugfix for iso2usbld - Sun Sep 27 21:20:14 2009 +0200 -rev3 - modified .hignore - Sun Sep 27 19:00:50 2009 +0200 -rev2 - added open usb loader sources - Sun Sep 27 17:42:30 2009 +0200 -rev1 - added iso2usbld - Sun Sep 27 17:36:34 2009 +0200 -rev0 - added .hgignore - Sun Sep 27 16:28:14 2009 +0200 +rev736 - Removed tag 0.9.3 - Fri Dec 12 16:06:36 2014 +0800 +rev735 - Removed tag 0.9.3 - Fri Dec 12 16:06:35 2014 +0800 +rev734 - Rewrote HDD support to use the PS2 APA driver instead of HDLDump's code. - Fri Dec 12 16:06:34 2014 +0800 +rev733 - Dumbed-down the locking mechanism to use only sync_flag, as the use of the event flag APIs will still not totally protect against simultaneous access from an interrupt handler (It'll probably only fully work if the whole code was run from a syscall, but even SCE never did that). - Fri Dec 12 16:06:07 2014 +0800 +rev732 - Modified cdrom_read() to minimize the number of copy processes. - Wed Dec 10 22:37:03 2014 +0800 +rev731 - Added a fully streaming system. - Sun Nov 30 16:02:34 2014 +0800 +rev730 - Fixed sceCdChangeThreadPriority to not change the main thread priority* and added RPC support for it, added thread IDs for OPL's threads**, and added support for a streaming function callback***. - Sun Nov 30 15:57:45 2014 +0800 +rev729 - Replaced the old signaling system with one that works more like the SCE original, and fixed an age-long offset-calculation bug in CDVDFSV. - Sun Nov 30 15:55:35 2014 +0800 +rev728 - Removed the use of (internal & non-standard) sceCdRead0 function, old (unused) reading core and refactored the reading system. - Sun Nov 30 15:29:16 2014 +0800 +rev727 - (*) Useless GSM VMODE Removal (1st draft) - Sun Nov 30 15:09:37 2014 +0800 +rev726 - (*) Hey Bat, try not to break non-GSM builds of OPL next time, willya?!? *LOL* - Sun Nov 30 14:13:05 2014 +0800 +rev725 - (*) Decided to let the new logo escape the asylum. Those who want to classic - Thu Nov 20 04:11:28 2014 -0500 +rev724 - Sync-Merged with ifcaro/open-ps2-loader - Mon Nov 10 13:09:00 2014 -0500 +rev723 - (*) Per-Game GSM is COMPLETE! Repository frozen for now. Thanks to SP193 for - Mon Nov 10 04:42:25 2014 -0500 +rev722 - (*) Whoops! - Sun Nov 09 16:11:59 2014 -0500 +rev721 - (*) Went to far re-globalizing GSM - Sat Nov 08 16:25:46 2014 -0500 +rev720 - (*) Re-globalized GSM - Sat Nov 08 10:30:24 2014 -0500 +rev719 - (*) Per-Game GSM Complete (I think). There were two solutions to the issue. I - Fri Nov 07 22:05:32 2014 -0500 +rev718 - Merged ifcaro/open-ps2-loader into default - Wed Nov 05 19:51:47 2014 -0500 +rev717 - Added tag 0.9.3 for changeset 1fbd6857681b - Mon Nov 03 23:31:15 2014 -0500 +rev716 - (*) Per-Game GSM (In One Commit) - couldn't make sense of the shit I had - Mon Nov 03 15:34:49 2014 -0500 +rev715 - Merged in Aced14/open-ps2-loader/ps2rd-max-codes-250 (pull request #11) - Sat Nov 01 10:26:48 2014 -0400 +rev714 - Increased ps2rd's cheat line limit (MAX_CODES) to 250. - Sat Nov 01 10:26:12 2014 -0400 +rev713 - Improved IGR stability (E P), fixed MC slot 1 use when a VMC is mounted as the 2nd slot (E P), fixed art drawing, fixed poor game list loading performance and brought forward texture cache initialization. - Sun Nov 09 19:16:08 2014 +0800 +rev712 - Replaced all obsolete Makefile rule files with a common file and integrated the discID module into the EE side. - Sun Nov 09 04:25:05 2014 -0500 +rev711 - Changed auto-refresh behaviour and fixed the SMB reconnect option: - Mon Nov 03 21:35:05 2014 +0800 +rev710 - Updated the GUI to have device-dependent refresh rates and moved some of the static buffers in CDVDMAN onto the stack. - Tue Oct 14 22:29:01 2014 +0800 +rev709 - README edited online with Bitbucket - Sun Oct 12 23:13:38 2014 +0800 +rev708 - README edited online with Bitbucket - Fri Oct 10 23:19:40 2014 +0800 +rev707 - Fixed DEVCTL code handling in CDVDMAN, syntax errors and SMB mode error handling when there isn't a network adaptor attached. - Tue Oct 07 09:20:45 2014 +0000 +rev706 - Improved on the reliability of USB support, added more error messages for SMB and removed VSYNC mode: - Tue Oct 07 09:18:40 2014 +0000 +rev705 - Fix for Crash Bandicoot: The Wrath of Cortex. - Tue Oct 07 16:57:28 2014 +0800 +rev704 - Fixes: - Tue Oct 07 01:57:13 2014 +0800 +rev703 - Fixes and optimizations: - Mon Oct 06 00:00:36 2014 +0800 +rev702 - Rewritten the patching system and how parameters are passed to IOPCORE, for maintainability. - Sun Oct 05 08:31:44 2014 +0800 +rev701 - Added a patch for Super Robot Wars IMPACT, and optimized CDVDMAN's callback functionality. - Sat Oct 04 09:39:20 2014 +0800 +rev700 - Fixed CDVDMAN initialization. Fixes: SSX World Tour and the Harry Potter series. - Sat Oct 04 03:45:38 2014 +0800 +rev699 - Updated USBHDFSD to support disks >1TB and <=2TB (Sync'ed with PS2SDK update). - Fri Oct 03 05:35:49 2014 +0800 +rev698 - Corrected path handling, which was broken in commit e5e85f0. - Tue Sep 30 08:54:16 2014 +0800 +rev697 - Fixes and updates: - Tue Sep 30 01:01:15 2014 +0800 +rev696 - in-game SMB fixes and enhancements: - Sun Sep 28 09:44:28 2014 +0800 +rev695 - Added an option for DTL-T100dded an option for DTL-T10000 support, since this unit can have a different set of IOP modules in its flash ROM. - Mon Sep 08 20:36:57 2014 +0800 +rev694 - SP193: FreeType fix - Wed Aug 20 22:47:26 2014 +0800 +rev693 - More Makefile fixes - In order to CHILDPROOF, RTL, GSM and CHEAT switches work properly - Mon Aug 04 13:07:19 2014 +0800 +rev692 - Makefile fix to build without PS2RD Cheat Engine (CHEAT = 0) - Sat Jul 12 16:07:03 2014 -0300 +rev691 - EE Core - Only Install PadOpen Hook if IGR is enabled - Wed Jul 09 19:37:45 2014 -0300 +rev690 - Merged doctorxyz's commit with mine. - Wed Jul 09 15:43:00 2014 -0300 +rev689 - OPL+PS2RD Cheat Engine Integration - Fri Jul 04 08:47:43 2014 -0300 +rev688 - Updated OPL to compile with the new PS2SDK. - Thu Jun 26 19:13:48 2014 +0800 +rev687 - Fixed the theme bug and improved code: - Mon Jun 23 08:20:53 2014 -0300 +rev686 - Sync'ing with the PS2SDK commit for today: the main point behind this commit is the rollback of the use of the pre and post-DMA callbacks within DEV9, for compatibility with a certain clone adaptor. - Mon Jun 23 18:39:24 2014 +0800 +rev685 - Merged in psx_core/open-ps2-loader/psx_core/the-most-accurate-and-correct-translatio-1384761167035 (pull request #6) - Sun Jun 15 18:52:00 2014 +0800 +rev684 - The most accurate and correct translation from english to russian by RA1n. (lang_Russian.lng edited online with Bitbucket) - Tue Jun 10 21:47:33 2014 +0800 +rev683 - Fixed a buffer overflow problem in CDVDFSV and refactored all CDVDMAN defines: - Sun Jun 01 19:35:01 2014 +0800 +rev682 - Added a proper patch for Choujikuu Yousai Macross (SLPM-65405). - Mon Nov 18 07:52:59 2013 +0000 +rev681 - Completed the integrated DECI2 debugging system and updated some log messages. - Fri May 09 21:50:36 2014 +0800 +rev680 - Completed the incomplete modifications from the previous commit + enhanced IGR. - Thu May 01 17:01:58 2014 +0800 +rev679 - changes.txt - Tue Apr 22 00:57:53 2014 +0800 +rev678 - Updated OPL to be fully compatible (compiles without the deprecated warnings) with the HEAD revision of the PS2SDK. - Mon Apr 21 22:21:07 2014 +0800 +rev677 - *Changed the configGetString function to return a const value, since the configuration keys are not to be changed without configSetStr(), except for two lines within themes.c. This is to safeguard against accidental configuration corruption/overwriting. - Sat Apr 19 13:52:29 2014 +0800 +rev676 - * Updating LNG files - Ethernet modes (among other things) were missing. - Sat Jan 11 20:27:05 2014 +0800 +rev675 - Reverting the change in the previous commit. - Wed Nov 06 13:16:17 2013 +0800 +rev674 - Fix for the workaround for the Chinese SATA network adaptor: I forgot that the register is 16-bit, which means that the adaptor probably reports 0xFFFF as its version number. - Fri Nov 01 12:42:36 2013 -0400 +rev673 - *Ported over the workaround for Chinese SATA network adaptors (See the PS2SDK update for today). - Fri Nov 01 20:32:26 2013 +0800 +rev672 - * Rev672 tapped for release - updated changelogs. - Fri Nov 01 17:43:16 2013 +0800 +rev671 - *Replaced the TLB reinitialization mechanism with a built-in one. No more patching/hooking onto the EE kernel for that! Done partly for compatibility with the PSX. - Fri Nov 01 13:47:59 2013 +0800 +rev670 - * Hey Bat! Try not to commit non-default changes to Makefiles next time, will - Fri Oct 25 17:52:49 2013 -0400 +rev669 - * MASSIVE UPDATE - Consider deleting and re-cloning your local repos if - Thu Oct 24 15:13:40 2013 +0800 +rev668 - * Massive changes to GSM function calls - some of which were so similar that - Tue Oct 22 14:06:16 2013 -0400 +rev667 - * Anticipating blood-curdling scream from SP193! - Tue Oct 22 13:55:08 2013 -0400 +rev666 - * Cleaned up GSM code - Mon Oct 21 17:29:56 2013 -0400 +rev665 - Added tag 0.9.2 for changeset 3eb5ac59e7a5 - Fri Oct 18 12:43:06 2013 -0400 +rev664 - (*) Refreshed language files - Wed Oct 16 17:05:23 2013 -0400 +rev663 - (*) Aaaand after a half-assed busted GUI staring me dead in the face for over - Sat Oct 12 06:59:14 2013 -0400 +rev662 - Updating CHANGELOG ahead of release - actual release revision can be - Sat Oct 12 06:57:49 2013 -0400 +rev661 - * Rebase complete - Fri Oct 11 17:49:17 2013 -0400 +rev660 - *Modified compatibility mode 7 to not affect sceCdStRead(), as the streaming functions are already underperforming. - Wed Oct 02 11:29:13 2013 -0400 +rev659 - *Sync'ing the HDD module updates for the PSX. OPL should now run properly on the PSX. - Tue Oct 01 16:43:01 2013 -0400 +rev658 - *Sync'ing HDD updates... again. - Wed Oct 02 00:17:01 2013 +0800 +rev657 - *Sync'ing the updates in the PS2SDK with the ATAD modules here: common/include/atahw.h was updated, and all ATAD modules are using the commands defined within atahw.h. - Tue Oct 01 23:04:45 2013 +0800 +rev656 - *Optimized CDVDMAN (Declared internal structures and functions as static). - Sun Sep 29 19:22:24 2013 +0800 +rev655 - The original files I modified couldn't be committed directly into the repository, so I had to check out a new copy of the repository and copy my changes over manually. - Fri Sep 27 18:22:17 2013 +0800 +rev654 - *Updated ATAD (Normal ATAD and the HDPro version) to be the same as the ones from the PS2SDK. - Mon Sep 02 15:21:49 2013 +0800 +rev653 - *Re-added SPU reset code. CLEARSPU shouldn't be used and I was wrong about that. - Thu Aug 08 14:22:12 2013 +0800 +rev652 - *Added sceCdPowerOff(). Games that power off the console should be able to do so now. - Thu Aug 08 14:12:32 2013 +0800 +rev651 - *Cleaned up IGR code. - Sun Jul 21 12:12:43 2013 +0800 +rev650 - Added power-off processing code. Games (mainly older one) that use it should no longer cause a deadlock. - Wed Jul 17 15:08:08 2013 +0800 +rev649 - *Updated all DEV9 and ATAD module code. - Wed Jul 17 13:12:54 2013 +0800 +rev648 - (AKuHAK): Updated OPL to support the updated LIBPNG port. - Sat Jun 15 01:56:50 2013 +0800 +rev647 - Removed the integrated FreeType copy. Please update your FreeType library (From ps2sdk-ports)! - Sat Jun 15 01:26:36 2013 +0800 +rev646 - *Removed the old Protokernel patch, since the PS2SDK now has a complete one. - Sat Jun 15 00:52:08 2013 +0800 +rev645 - *Removed the old Protokernel patch, since a full patch has been integrated into the PS2SDK. - Sun Jun 02 20:44:40 2013 +0800 +rev644 - Added tag 0.9.1 for changeset 2ebb9bb56c19 - Thu Mar 21 00:11:48 2013 +0800 +rev643 - Updated USBLD_VERSION to "0.9" - Thu Mar 21 00:08:41 2013 +0800 +rev642 - Added tag 0.9 for changeset 830d78f67941 - Mon Aug 13 06:00:01 2012 -0300 +rev641 - Updated CHANGELOG and DETAILED_CHANGELOG files - Mon Aug 13 05:57:32 2012 -0300 +rev640 - Disabling auto-refresh of game list by default, as it is causing bugs sometimes - Sat Jul 28 10:35:29 2012 -0300 +rev639 - mgh: fix for default HDD DMA mode, that wasn't correctly set - Sat Jul 28 10:35:22 2012 -0300 +rev638 - Suggestion from "mgh". - Tue May 01 16:37:04 2012 +0200 +rev637 - Fix a bug (in revision 426) which made "Mode 3 - Unhook Syscalls" un-effectivei ("Unhook Syscalls" was in fact activated by "Mode 7 - Reduced memory usage", which was setting both modes 3&7). - Thu Apr 26 22:46:24 2012 +0200 +rev636 - * fix for theme font handling (when switching back to the default theme, the language font wasn't re-applyied) - Mon Mar 26 22:40:28 2012 +0200 +rev635 - damn wide font ;) - Sat Mar 24 22:08:24 2012 +0100 +rev634 - Added hidden options to be able to define your own device delay before loading ART/config files. - Sat Mar 24 00:21:03 2012 +0100 +rev633 - layout adjustment - Wed Mar 07 21:32:39 2012 +0100 +rev632 - language files update - Wed Mar 07 21:17:18 2012 +0100 +rev631 - don't do HDD checks when no vmc configuref - Wed Mar 07 20:54:36 2012 +0100 +rev630 - fix for corrupted graphics when manipulating config files - Tue Mar 06 19:31:33 2012 +0100 +rev629 - SilverBull: apply a delay to CDVDMAN functions (initially for Shadow Heart 2) - Sun Mar 04 23:03:08 2012 +0100 +rev628 - adding i18n strings - Sun Mar 04 17:47:44 2012 +0100 +rev627 - Big up for Volca ... slowdown the busy icon - Sun Mar 04 14:36:46 2012 +0100 +rev626 - fix for wrapping artefact when display_mode=ALWAYS - Wed Feb 29 22:53:10 2012 +0100 +rev625 - remove useless code for compatibility mode 7 which is unused now. - Mon Feb 27 21:18:00 2012 +0100 +rev624 - fix for broken UL on ETH mode - Mon Feb 27 18:53:58 2012 +0100 +rev623 - make start/select button skinnable - Sun Feb 26 14:57:10 2012 +0100 +rev622 - make action buttons skinnable - Sun Feb 26 12:58:47 2012 +0100 +rev621 - small correction for gcc warning - Sat Feb 25 10:55:24 2012 +0100 +rev620 - * CRITICAL FIX for 4K disk. It was broken since the beginning for both UL and ISO (2 bugs, one when checking for the cluster size for UL, and one for UL/ISO when patching the usb_cdvdman_irx) - Fri Feb 24 23:08:05 2012 +0100 +rev619 - Finalize the "list share" feature. Now you can list the share, select one from the list and OPL will connect it and display the games. - Fri Feb 24 20:20:27 2012 +0100 +rev618 - * fix a refresh bug introduced lately - Fri Feb 24 19:59:26 2012 +0100 +rev617 - cosmetics again (prefixing every LOG by its location) - Mon Feb 20 23:22:33 2012 +0100 +rev616 - just some cosmetics - Sun Feb 19 17:44:06 2012 +0100 +rev615 - * don't display a share connection error when listing share - Sun Feb 19 16:32:35 2012 +0100 +rev614 - Hey Hominem ... don't commit shit you used for trying to reproduce some bug ;) - Sun Feb 19 15:46:15 2012 +0100 +rev613 - Adding ETHPrefix to fix the use of some box/NAS adding a sub path to the share - Sun Feb 19 14:28:36 2012 +0100 +rev612 - few changes to be able to refresh the menu from anywhere (should be used when selecting a share, after connecting to it, refresh the menu, but it doesn't work currently due to the info screen crashing ...) - Sat Feb 18 11:43:45 2012 +0100 +rev611 - * Add a feature to list network shares. Just let the sharename empty into network settings, and OPL will try to connect and list the shares (BUT then don't try to do anything with the share list, their are handled like games, but are not, so everything would crash) - Sat Feb 18 11:16:58 2012 +0100 +rev610 - * reverted some changes from rev500, finally crazyc was correct (when he skipped one vmc in error, but still wrote the structure in IRX but with flag as inactive) - Sat Feb 18 11:07:07 2012 +0100 +rev609 - load and use the internal LOGO before swapping theme (avoid flickering at startup) - Thu Feb 16 22:38:21 2012 +0100 +rev608 - NOTE: Concerning my comment in R606, I'm sorry Volca, the code wasn't "dangerous" and didn't write memory out of bounds (thanks to the check < MAX_GS_MODE) - Wed Feb 15 22:13:25 2012 +0100 +rev607 - fix small bug in alternate device mode, when loading config files - Sun Feb 12 23:02:04 2012 +0100 +rev606 - * fixed dangerous code (out of bounds memory writing in renderman) - Sat Feb 11 15:33:02 2012 +0100 +rev605 - clarify the gui - Fri Feb 10 18:41:41 2012 +0100 +rev604 - Some changes in the way the network is "reloaded". - Fri Feb 10 00:19:28 2012 +0100 +rev603 - * Minor GUI changes (deferred error message display, small optim for main loop) - Wed Feb 08 21:18:17 2012 +0100 +rev602 - Added "InfoHintText" element, to be able to put a small version of hints for the info screen. - Tue Feb 07 23:06:20 2012 +0100 +rev601 - Remove useless stuff (was thing for RTL transposition only, which will not be implemented after all as too complicated) - Mon Feb 06 22:19:26 2012 +0100 +rev600 - Fix for space and punctuation characters. These one are weak/neutral and should not change the current rendering direction. - Tue Jan 31 23:05:17 2012 +0100 +rev599 - Support for Right-to-Left scripting (Hebrew, Arabic, Syriac, Tifinar, ... languages) - Tue Jan 31 22:18:03 2012 +0100 +rev598 - merge (?) - Tue Jan 31 21:49:25 2012 +0100 +rev597 - Work around FOR PFS BUG with O_TRUNC - Sat Jan 28 21:55:11 2012 +0100 +rev596 - Polishing things, full IO for loading/saving of config files, factorization, ... - Sat Jan 14 15:24:26 2012 +0100 +rev595 - automatically create the CFG folder - Sat Jan 14 15:19:09 2012 +0100 +rev594 - remove duplicate methods / factorization (need to ensure compatibility mode among other don't have regression) - Sat Jan 14 11:25:39 2012 +0100 +rev593 - Configuration related to DNAS/VMC/DMA/COMPAT are now saved in single per game files on each media. - Sun Jan 08 13:59:22 2012 +0100 +rev592 - fixed the alternate device mode. - Sun Jan 08 01:40:40 2012 +0100 +rev591 - l_oliveira: fix for SCPH-10000 with Sony Kernel update - Sat Jan 07 23:38:56 2012 +0100 +rev590 - fix for Kingdom Hearts 2: Final Mix(SLPM_666.75) gummi missions freezing - Fri Oct 14 10:20:26 2011 +0200 +rev589 - fix cdinited flag for SSX on Tour (broken in r585) - Tue Oct 25 20:33:55 2011 +0200 +rev588 - update to comply with the latest PS2SDK - Mon Jun 20 18:09:10 2011 +0200 +rev587 - Fixed sceGetReadPos() to return the buffer offset in 2048-byte units (Updated dynamically). - Thu Jun 09 17:05:57 2011 +0200 +rev586 - Added new patch for Rugby League 2: World Cup Edition (PAL). - Thu Jun 09 16:52:44 2011 +0200 +rev585 - romz: added better cd tray emulation (fixes A2M games) - Wed May 04 16:40:35 2011 +0800 +rev584 - extracted code branching from ItemsList drawing and main drawing method - Sat Apr 30 22:29:07 2011 +0800 +rev583 - fix for the "alternate device mode" that was failing to re-read the configuration files from "mass" device - Fri Apr 29 17:48:50 2011 +0200 +rev582 - * use alignment for clipped/wrapped text - Wed Mar 09 23:39:07 2011 +0100 +rev581 - ItemsList can now use clipping too. As a result, the "items" option for ItemsList has been removed. Now to limit the number of items being displayed, specify a "height" value. - Sun Mar 06 01:42:13 2011 +0100 +rev580 - * caching of last attribute value (for AttributeText/Image element), to not search the config file every frame - Sun Mar 06 00:05:42 2011 +0100 +rev579 - cdvdfsv: implemented sceCdChangeThreadPriority export (as suggested by romz) - Sat Mar 05 22:10:20 2011 +0100 +rev578 - fix EE core makefiles (alt EE core broken in r546) - Sat Mar 05 19:11:31 2011 +0100 +rev577 - * minor addition to have more transitions - Mon Feb 28 10:32:09 2011 +0100 +rev576 - Probable fix for the previous random crash (rev 572) at startup - Mon Feb 28 09:56:24 2011 +0100 +rev575 - * fix problem with semaphore - Sat Feb 26 21:27:05 2011 +0100 +rev574 - Merged changes - Wed Feb 23 11:03:52 2011 +0100 +rev573 - * Added text block rendering function - Tue Feb 22 23:52:13 2011 +0100 +rev572 - * add a delay before loading per-game config file (same as Art, to not spam when navigating very fast) - Tue Feb 22 21:45:42 2011 +0100 +rev571 - Merged changes - Tue Feb 22 21:43:36 2011 +0100 +rev570 - * Fix for rendering problems caused by CLUT alpha setting change - Tue Feb 22 21:11:38 2011 +0100 +rev569 - use deferred IO to load config file (should be more safe, got sometimes corrupted file before) - Tue Feb 22 20:20:19 2011 +0100 +rev568 - * Font rendering now uses clut - Tue Feb 22 20:19:45 2011 +0100 +rev567 - * hints now display either "Info" or "Run" depending if the presentation page is available in the theme AND the option is enabled in settings - Mon Feb 21 23:14:38 2011 +0100 +rev566 - * add loading attributes from a per-game file - Mon Feb 21 22:41:46 2011 +0100 +rev565 - fix for config reading, "val" were truncated at 32 char (copy/paste typo) - Mon Feb 21 00:25:03 2011 +0100 +rev564 - * added new element type "StaticText" to display an hardcoded/static string to the screen - Sun Feb 20 22:48:39 2011 +0100 +rev563 - * added information page (new option to enable it or not) - Sat Feb 19 22:49:11 2011 +0100 +rev562 - First working version of the font atlasing. Probably still buggy so beware :D - Sat Feb 19 01:33:36 2011 +0100 +rev561 - small fixes - Fri Feb 18 20:18:17 2011 +0100 +rev560 - * Fix for rendering artifacts on disabled vsync (the reason was we didn't wait for GS to finish before ending the frame) - Mon Feb 14 22:58:02 2011 +0100 +rev559 - * Improvement for the config reader - it now handles python-like prefixes. Also added a safeguard for the max length of key and value in splitter - Sun Feb 13 01:43:02 2011 +0100 +rev558 - Erf first "merge" (I hope it works ...) - Sat Feb 12 18:04:35 2011 +0100 +rev557 - First step (almost) finished - Sat Feb 12 16:22:24 2011 +0100 +rev556 - step 2, loose coupling - Sat Feb 12 11:56:55 2011 +0100 +rev555 - first step of the theme/menu rendering rewrite - Sat Feb 12 11:56:09 2011 +0100 +rev554 - romz: fix for cdvdman's sceCdSC() - Sun Feb 06 10:48:00 2011 +0100 +rev553 - fix for "use_default=0" option in theme (entering the virtual keyboard was crashing, among other ...) - Fri Feb 04 14:19:11 2011 +0100 +rev552 - * fix a bug in color settings not applied to elements (needed to restart OPL, or cicle with another theme) - Sun Feb 06 17:39:33 2011 +0100 +rev551 - fix for language fonts being reset-ed when changing theme - Tue Feb 01 08:42:07 2011 +0100 +rev550 - re work of virtual keyboard (needed to remove the non-latin characters), added focus on current selected chars - Mon Jan 31 21:51:58 2011 +0100 +rev549 - * saved some place in game settings (to add future GSM settings) - Sun Jan 30 22:23:20 2011 +0100 +rev548 - fix for broken hdldsrv (since r517/r521) - Sun Jan 30 20:57:10 2011 +0100 +rev547 - just some cosmetics to the main Makefile - Sun Jan 30 17:57:54 2011 +0100 +rev546 - just some cosmetics for the EE core - Fri Jan 28 11:07:45 2011 +0100 +rev545 - fix (hopefully) for DVD9 games - Thu Jan 20 16:56:51 2011 +0100 +rev544 - fix for Sonic Unleashed (broken in r515) - Thu Jan 20 15:32:05 2011 +0100 +rev543 - Merged changes - Wed Jan 19 15:07:45 2011 +0100 +rev542 - * Mode setting (PAL/NTSC/Auto) - Wed Jan 19 09:19:30 2011 +0100 +rev541 - * Implemented kerning - Sun Jan 16 20:03:21 2011 +0100 +rev540 - * Longer first-press delay for pads - more comfy controls on max repeat speed - Sun Jan 16 19:51:10 2011 +0100 +rev539 - * Added sclean make target for make clean without Freetype - Sun Jan 16 19:49:53 2011 +0100 +rev538 - EP: fix for POPWW (SLUS_210.22) - Sun Jan 16 19:28:44 2011 +0100 +rev537 - fix for the HD Pro (doesn't support idle timeout) - Sun Jan 16 19:23:58 2011 +0100 +rev536 - fix for white screen freezing in 'Tenchu: Wrath of Heaven' - Sun Jan 16 12:13:12 2011 +0100 +rev535 - fix for the BSOD at game launch on some PS3 (added timeout on wait SPU reset) - Sun Jan 16 12:03:57 2011 +0100 +rev534 - fix for POPWW (SLES_528.22) over SMB, HDD - Sun Jan 09 17:49:56 2011 +0100 +rev533 - fix for SSX on Tour - Sat Jan 08 15:10:07 2011 +0100 +rev532 - small fixes - Sat Jan 08 09:29:46 2011 +0100 +rev531 - short ELF name in App list (looks better for most themes) - Fri Jan 07 15:11:50 2011 +0100 +rev530 - Added option to specify the HDD spin down time out. - Fri Jan 07 13:52:39 2011 +0100 +rev529 - implemented hddSetIdleTimeout() - Fri Jan 07 13:12:02 2011 +0100 +rev528 - removed hdpro_checker IOP module (HD Pro is now detected directly from EE) - Wed Jan 05 22:04:17 2011 +0100 +rev527 - changes to be able to debug IOP core with HD Pro - Wed Jan 05 17:04:27 2011 +0100 +rev526 - added in-game code for HD Pro - Tue Jan 04 18:13:31 2011 +0100 +rev525 - added hdpro_atad IOP module (HD Pro users should have their games listed) - Tue Jan 04 13:33:33 2011 +0100 +rev524 - added hdpro_checker IOP module (detect if HD Pro Kit is present) - Tue Jan 04 12:16:56 2011 +0100 +rev523 - fix for Street Fighter Zero Fighters Generation (SLPM_664.09) by lee4, reverted Capcom Classics Collection fix - Tue Jan 04 09:09:45 2011 +0100 +rev522 - Fix for Capcom Classics Collection - Mon Jan 03 21:14:55 2011 +0100 +rev521 - fix for broken SMB (by r517) on some setup - Sat Jan 01 10:04:43 2011 +0100 +rev520 - * Added theme support for multiple fonts (default_font, font0, font1... + _font=ID in the components) - Thu Dec 30 19:36:30 2010 +0100 +rev519 - configurable IGR path (limited to 32 characters) - Thu Dec 30 19:09:57 2010 +0100 +rev518 - fix for game ID system (broken in r513) - Thu Dec 30 12:41:14 2010 +0100 +rev517 - saved 4k of IOP mem in cdvdman/SMB, direct write to buffer - Thu Dec 30 00:34:02 2010 +0100 +rev516 - * Added support for multiple fonts (not used but there ;)) - Wed Dec 29 21:10:54 2010 +0100 +rev515 - fix for Capcom protected games (SFAA, VDC) - Wed Dec 29 20:44:02 2010 +0100 +rev514 - fix for games from 'Army Men' series - Wed Dec 29 18:03:32 2010 +0100 +rev513 - cdvdman: fix potential buffer overflow for long ISO filenames - Wed Dec 29 15:28:31 2010 +0100 +rev512 - enlarged cdvdman buffer for ISO name to 64 bytes - Fri Dec 24 16:56:55 2010 +0100 +rev511 - when creating a new VMC, the gEnableRenameDelete option should not be applied - Mon Dec 20 19:39:15 2010 +0100 +rev510 - * switch default background mode to "Art" - Mon Dec 20 17:07:51 2010 +0100 +rev509 - * fix USB fragmentation check of Game file parts (it should now works as expected) - Sun Dec 19 17:57:47 2010 +0100 +rev508 - fix for 10K patches freezing on some modchipped PS2 - Sun Dec 19 17:27:55 2010 +0100 +rev507 - * add configurable USB delay (3 is the default value currently used). If you have OPL stuck on yellow or orange screen (when using USB mode only), try increasing this value - Sun Dec 19 16:48:50 2010 +0100 +rev506 - fix for Super Dimensional Fortress Macross (SLPM_654.05) over HDD - Sun Dec 19 13:59:33 2010 +0100 +rev505 - final translations for release 0.8 - Sat Dec 11 16:57:17 2010 +0100 +rev504 - tagged r503 as release v0.8 - Sat Dec 11 10:16:21 2010 +0100 +rev503 - izdubar: added an About screen to the GUI - Thu Dec 09 20:37:29 2010 +0100 +rev502 - languages updates - Wed Dec 08 12:58:24 2010 +0100 +rev501 - work around for the infinite refresh on some NAS device - Wed Dec 08 12:56:57 2010 +0100 +rev500 - a few fixes so that OPL can comply with some Digitus NAS (with the help of Thinner), removed obsoletes language files and added 'Filipino' language file - Tue Dec 07 11:29:46 2010 +0100 +rev499 - update for Turkish language - Mon Dec 06 08:52:19 2010 +0100 +rev498 - fix for english and french translation - Sat Dec 04 18:53:39 2010 +0100 +rev497 - small fixes - Sun Nov 28 19:31:10 2010 +0100 +rev496 - Thanks to jimmi's help and ideas, things should now be fixed for alternate device start (and traditional mode too). - Sun Nov 28 13:28:01 2010 +0100 +rev495 - added ability to use '-use-early-debug' arg (for using ps2client netdump) - Sun Nov 28 01:29:24 2010 +0100 +rev494 - * devices started in alternate mode now have valid hints - Sun Nov 28 01:10:54 2010 +0100 +rev493 - genvmc: wait progress message update before to return from vmc_abort() call - Sat Nov 27 15:10:04 2010 +0100 +rev492 - genvmc: fixed IOP freezing on vmc_abort() call - Sat Nov 27 01:05:50 2010 +0100 +rev491 - added debug prints to genvmc module - Sun Nov 21 17:26:46 2010 +0100 +rev490 - modified sysReset() to allow genvmc to load properly - Sun Nov 21 16:52:36 2010 +0100 +rev489 - * create an opl.icn into the OPL folder on MC, so the PS2 browser doesn't display it as corrupted data - Sun Nov 21 15:25:00 2010 +0100 +rev488 - * IPCONFIG.DAT file now loaded from the alternate device too - Sun Nov 21 15:02:05 2010 +0100 +rev487 - When no config for OPL is found: - Fri Nov 19 11:07:24 2010 +0100 +rev486 - Fix in samba code: server buffer size could be set to 0 due to the type casting - Fri Nov 19 00:24:13 2010 +0100 +rev485 - small fixes (USB delay, result return) - Wed Nov 17 23:25:56 2010 +0100 +rev484 - * Applications configuration file is read from alternate device too - Wed Nov 10 20:27:28 2010 +0100 +rev483 - Enable saving settings capability on USB or HDD. - Sat Oct 30 20:22:45 2010 +0200 +rev482 - small changes - Sat Oct 30 19:40:47 2010 +0200 +rev481 - * IO thread stabilization attempt (not sure if it helps, but it seems so) - Sat Oct 30 03:20:45 2010 +0200 +rev480 - small bug with VMC settings - Fri Oct 15 23:57:44 2010 +0200 +rev479 - add some error messages to warn user of various failing situations - Fri Oct 15 20:26:44 2010 +0200 +rev478 - fix compat flag problem on HDD due to merge - Wed Oct 06 19:47:22 2010 +0200 +rev477 - make alt background configurable too - Wed Oct 06 19:41:50 2010 +0200 +rev476 - Start the pads before loading the config, as we may have to set the scrolling speed. - Tue Oct 05 15:32:05 2010 +0200 +rev475 - few changes for SMB (in particular for device in "security share" mode - Mon Oct 04 20:50:07 2010 +0200 +rev474 - added FILEIO version check, to be sure - Mon Oct 04 20:05:11 2010 +0200 +rev473 - fix hdd partition check - Mon Oct 04 19:11:24 2010 +0200 +rev472 - patch for FILEIO remove rpc handler - Mon Oct 04 17:23:39 2010 +0200 +rev471 - updated smblab - Mon Oct 04 10:20:37 2010 -0500 +rev470 - reviewed labs so they can compile - Mon Oct 04 16:52:40 2010 +0200 +rev469 - only show VMC delete (and change size) button if "Rename/delete" operation are enabled in settings - Mon Oct 04 12:48:31 2010 +0200 +rev468 - fioXXX operations on SMB makes strange things - Mon Oct 04 12:03:13 2010 +0200 +rev467 - fioXXX operations on SMB make strange things ... - Sun Oct 03 21:05:29 2010 +0200 +rev466 - merge vmc fork - Sun Oct 03 16:37:42 2010 +0200 +rev465 - fix DNAS settings bug - Sun Oct 03 16:37:08 2010 +0200 +rev464 - fix for invalid background when rendering guiMsgBox (deletion warning of VMC items) - Sun Oct 03 08:03:17 2010 -0500 +rev463 - WARNING: uncertain change ! - Sun Oct 03 14:33:52 2010 +0200 +rev462 - remember last focused item when reseting dialog - Sun Oct 03 11:35:49 2010 +0200 +rev461 - I like to commit in two-phases ... - Sun Oct 03 00:49:09 2010 +0200 +rev460 - fix for OK buttons - Sun Oct 03 00:28:10 2010 +0200 +rev459 - Opps, disable VMC by default ... (as it is only GUI stuff, we don't want to confuse users ;)) - Sat Oct 02 11:21:02 2010 +0200 +rev458 - Added VMC GUI (first shot) - Sat Oct 02 11:19:48 2010 +0200 +rev457 - moved IOP modules to more explicit subfolders - Sat Oct 02 00:38:50 2010 +0200 +rev456 - added mcman module and genvmclab - Fri Oct 01 23:38:07 2010 +0200 +rev455 - save config files individually - Thu Sep 30 17:28:59 2010 +0200 +rev454 - prepare stuff for VMC - Mon Sep 27 20:33:56 2010 +0200 +rev453 - * removing settings for hdd was doing bad things - Sun Sep 19 12:37:24 2010 +0200 +rev452 - * shutdown routine was free-ing stuff still used into the launch method ... - Sun Sep 19 00:52:26 2010 +0200 +rev451 - more corrections - Sat Sep 18 23:04:37 2010 +0200 +rev450 - save config *before* shutting down the config files - Sat Sep 18 22:26:05 2010 +0200 +rev449 - fixed a few bugs: - Sat Sep 18 00:40:21 2010 +0200 +rev448 - * compatibility settings for HDD are now saved into the config files. - Sat Sep 18 00:24:12 2010 +0200 +rev447 - fixed broken themes on MC - Fri Sep 17 22:43:08 2010 +0200 +rev446 - should fix the invalid list positioning - Fri Sep 17 21:35:50 2010 +0200 +rev445 - added file fragmentation test for USB games, code from Polo35 (VMC branch) - Mon Sep 13 22:11:29 2010 +0200 +rev444 - splitted settings into "main settings" and "graphic settings" - Sun Sep 12 11:23:06 2010 +0200 +rev443 - added "childproof" mode: - Sat Sep 11 23:45:42 2010 +0200 +rev442 - add rename/delete functionality to Apps - Sat Sep 11 22:36:59 2010 +0200 +rev441 - added hint for "X Play" - Wed Sep 08 23:58:07 2010 +0200 +rev440 - added genvmc command-line tool for pc - Wed Sep 08 22:44:13 2010 +0200 +rev439 - update modload version check in MODLOAD hooking - Sat Sep 04 21:55:21 2010 +0200 +rev438 - added rename and delete functionality for UL format (ul.cfg) - Sat Sep 04 20:27:17 2010 +0200 +rev437 - only apply sorting, when autosort settings enabled - Sat Sep 04 10:23:55 2010 +0200 +rev436 - fix update of HDD game list after restarting modules (when leaving HDLD server) - Fri Sep 03 23:22:33 2010 +0200 +rev435 - enable HDD rename/delete - Fri Sep 03 20:43:36 2010 +0200 +rev434 - fix again for those games resetting IOP with null arg - Fri Sep 03 19:55:34 2010 +0200 +rev433 - Added "rename" and "delete" functionalities for games. - Fri Sep 03 09:57:04 2010 +0200 +rev432 - smbman: added debug prints ability - Fri Sep 03 09:07:57 2010 +0200 +rev431 - use MODLOAD hooking on IOP instead of patching LMB on EE - Thu Sep 02 23:07:32 2010 +0200 +rev430 - fix for alternative EE core build - Thu Sep 02 19:01:13 2010 +0200 +rev429 - fix: give some delay to ingame mass driver - Thu Sep 02 16:07:15 2010 +0200 +rev428 - EE core: get rid of libc dependency - Fri Aug 20 11:05:42 2010 +0200 +rev427 - IGR: use kernel's InitializeTLB instead of syscall - Thu Aug 19 09:56:14 2010 +0200 +rev426 - EE core: rewrote all syscall hooks in asm - Wed Aug 11 18:52:17 2010 +0200 +rev425 - EE core: a few tweaks to asm code - Sun Aug 08 20:52:36 2010 +0200 +rev424 - EE core: improved LoadExecPS2/SifSetDma hooks - Sat Aug 07 21:36:24 2010 +0200 +rev423 - update spanish language file - Thu Aug 05 22:28:01 2010 +0200 +rev422 - added Italian language file - Thu Aug 05 21:27:58 2010 +0200 +rev421 - EE core: a few tweaks to asm code - Thu Aug 05 19:53:32 2010 +0200 +rev420 - EE core: improve LoadExecPS2 hooking (fixes Tecmo Hit Parade SLPS_204.01) - Wed Aug 04 20:05:27 2010 +0200 +rev419 - crazyc: add MC dump ability to genvmc - Tue Aug 03 20:35:24 2010 +0200 +rev418 - fix for Star Ocean 3 - Till the End of Time (broken in r395) - Tue Aug 03 17:03:25 2010 +0200 +rev417 - fix for V-Rally 3 PAL (SLES_507.25) - Mon Aug 02 21:42:12 2010 +0200 +rev416 - fix for Shaun Palmer's Pro Snowboarder US (SLUS_201.99) - Mon Aug 02 16:31:25 2010 +0200 +rev415 - few i18n changes - Sat Jul 31 21:31:30 2010 +0200 +rev414 - clean-up in GUI strings (removed old entries, added missing values) - Sat Jul 31 17:37:41 2010 +0200 +rev413 - fix for NRA Gun Club (SLUS_214.32) - Fri Jul 30 22:51:02 2010 +0200 +rev412 - improvements to genvmc module - Thu Jul 29 21:30:45 2010 +0200 +rev411 - added genvmc IOP module - Mon Jul 26 20:26:00 2010 +0200 +rev410 - fix attempt for Jak X - Mon Jul 26 14:19:49 2010 +0200 +rev409 - fix for those games rebooting IOP with null arg (fixes Bloody Roar 3) - Sun Jul 25 17:22:56 2010 +0200 +rev408 - fix for GTA 3 a-spec over SMB - Sat Jul 24 10:09:38 2010 +0200 +rev407 - cdvdfsv: name module like orginal one - cdvd_ee_driver - Fri Jul 23 17:39:26 2010 +0200 +rev406 - EE core: fix for Quake III Revolution - Fri Jul 23 13:39:36 2010 +0200 +rev405 - fix for Jak 3 - Fri Jul 23 10:40:53 2010 +0200 +rev404 - fix for Full Spectrum Warrior - Thu Jul 22 18:25:23 2010 +0200 +rev403 - fix for those having SMB slowdown/freeze issue on some setups - Thu Jul 22 08:49:21 2010 +0200 +rev402 - cdvdman: fix lseek fileIO (fixes Shadow of Ganymede) - Wed Jul 21 21:44:41 2010 +0200 +rev401 - HDD core fix: init filesystem before to return disc type (fixes Xyanide Resurrection) - Wed Jul 21 18:52:43 2010 +0200 +rev400 - Added translation information for custom language - Tue Jul 20 20:16:31 2010 +0200 +rev399 - dlanor: fix for invisible cursor GUI glitch - Tue Jul 20 16:08:45 2010 +0200 +rev398 - fix for Viewtiful Joe - Tue Jul 20 15:29:15 2010 +0200 +rev397 - fix for EveryBody's Golf and other games - Sun Jul 18 16:05:12 2010 +0200 +rev396 - added feature to be able to disable sceSifStopModule/sceSifUnloadModule - Sun Jul 18 15:58:03 2010 +0200 +rev395 - hook SCE's SifLoadModuleBuffer to fake some modules to be loaded correctly through LoadModuleBuffer calls - Sat Jul 17 17:26:26 2010 +0200 +rev394 - fix for Kya: Dark Lineage PAL (SLES_514.73) - Sat Jul 17 16:42:48 2010 +0200 +rev393 - fix for V-Rally 3 US (SLUS_204.96) - Sat Jul 17 09:33:09 2010 +0200 +rev392 - fix for Kya: Dark Lineage US (SLUS_204.40) - Thu Jul 15 15:06:51 2010 +0200 +rev391 - changed the patches for Prince Of Persia: The Two Thrones - Thu Jul 15 13:21:31 2010 +0200 +rev390 - fix for Prince of Persia: The Two Thrones NTSC U (SLUS_212.87) - Wed Jul 14 19:19:34 2010 +0200 +rev389 - hdldsvr: use real HDD writes - Wed Jul 14 19:15:35 2010 +0200 +rev388 - udptty: redirect Kprintf output to tty - Tue Jul 13 12:35:52 2010 +0200 +rev387 - cdvdman: set cdstatus to CDVD_STAT_PAUSE in sceCdStStart/sceCdStResume - Tue Jul 13 09:41:41 2010 +0200 +rev386 - added EELOAD patches - Mon Jul 12 20:50:43 2010 +0200 +rev385 - fix for Suikoden IV (HDD) broken in r359 - Sun Jul 11 16:42:07 2010 +0200 +rev384 - fix for Prince of Persia: The Two Thrones PAL (SLES_537.77) - Wed Jul 07 19:24:05 2010 +0200 +rev383 - cdvdman: do not allocate IOP memory in cd callback handler (fixes Syphon Filter Logan's Shadow on HDD) - Tue Jul 06 09:49:52 2010 +0200 +rev382 - EE core: change stack pointer a bit earlier - Mon Jul 05 19:01:47 2010 +0200 +rev381 - EE core: use an intermediate stack during the IOP reset 'hook' code - Sun Jul 04 18:30:17 2010 +0200 +rev380 - use maximum priority for EE SMB password hashing thread - Fri Jul 02 21:59:55 2010 +0200 +rev379 - Fix for Suikoden V (in patch form) - Fri Jul 02 21:50:10 2010 +0200 +rev378 - fix for Max Payne EU version (SLES_503.25) - Fri Jul 02 19:30:42 2010 +0200 +rev377 - * make arrow icons customizable - Fri Jul 02 16:19:09 2010 +0200 +rev376 - PS3 fix 2: use XLOADFILE when building EELOADCNF - Thu Jul 01 21:08:36 2010 +0200 +rev375 - PS3 fix 1: reinstated cddev module use in EE core - Wed Jun 30 23:44:26 2010 +0200 +rev374 - * don't unmount pfs0 when we are launching an app that is on HDD - Wed Jun 30 21:47:52 2010 +0200 +rev373 - fix number 2 for Kingdom Hearts 2 gummi ship missions (should fix all regions) - Wed Jun 30 21:21:18 2010 +0200 +rev372 - fix for Kingdom Hearts 2 (SLUS_210.05) freeze on gummi ship missions - Wed Jun 30 21:00:04 2010 +0200 +rev371 - Apply Max Payne US patch on all 3 cores - Wed Jun 30 14:38:03 2010 +0200 +rev370 - SMSTCPIP: revert ARP_QUEUEING setting change (should fix broken Downhill Domination - SCUS_971.77 via SMB) - Wed Jun 30 11:01:15 2010 +0200 +rev369 - added compatibility mode 8 (should fix NFS Underground 2 - SLUS_210.65) - Tue Jun 29 16:56:26 2010 +0200 +rev368 - fix for the recent freezing using themes - Tue Jun 29 16:45:45 2010 +0200 +rev367 - changed smbauth & tcpip threads priorities (fixes Spiderman 3 and Genji) - Mon Jun 28 19:39:40 2010 +0200 +rev366 - link GUI SMB auth stuff to SMB core - Mon Jun 28 18:08:42 2010 +0200 +rev365 - * startup logo implementation, with a placeholder Logo - Mon Jun 28 08:34:57 2010 +0200 +rev364 - SMB core: do not perform password hashing if SMB server uses plaintext passwords - Sun Jun 27 22:55:56 2010 +0200 +rev363 - Max Payne US version (SLUS_202.30) fix for SMB use - Sun Jun 27 20:41:48 2010 +0200 +rev362 - EE core: added a ResetSPU() in LoadExecPS2 hook - Sun Jun 27 19:38:17 2010 +0200 +rev361 - added User Security Level support to SMB core - Sun Jun 27 18:53:00 2010 +0200 +rev360 - cdvdman: change back SceCdTrayReq traycheck return value - Sun Jun 27 18:51:33 2010 +0200 +rev359 - SMB core: save more IOP memory to increase compatibility - Sat Jun 26 22:04:12 2010 +0200 +rev358 - removed cddev module use from EE core, removed cddev - Sat Jun 26 09:38:33 2010 +0200 +rev357 - default to settings menu when no devices started or no config file found - Fri Jun 25 10:36:55 2010 +0200 +rev356 - * re-enable game "test" functionality (from compatibility settings) - Wed Jun 23 13:31:22 2010 +0200 +rev355 - use ICO fix (r346) only in compatibility mode 7 - Wed Jun 23 12:55:53 2010 +0200 +rev354 - smbman: do not rely on EndOfSearch but rather SearchCount field - Wed Jun 23 12:06:48 2010 +0200 +rev353 - remove uneeded stuff from ps2link module - Wed Jun 23 09:54:52 2010 +0200 +rev352 - EE core: remove InitializeUserMemory() patch when removing kernel hooks - Tue Jun 22 22:31:11 2010 +0200 +rev351 - fix: do no longer use sbv_patch_user_mem_clear() to be compatible with faulty DMS4 modchip - Mon Jun 21 12:43:50 2010 +0200 +rev350 - ps2link module: corrected Makefile - Mon Jun 21 11:02:31 2010 +0200 +rev349 - reload ps2link module on 'make debug' rule - Sun Jun 20 19:46:58 2010 +0200 +rev348 - fix: HDD gamelist was deallocated too early in HDD game launch process - Sun Jun 20 19:00:52 2010 +0200 +rev347 - * ISO support also "enabled" for USB (don't know what is the filesize limit, either 2Go or 4Go) - Sat Jun 19 11:52:19 2010 +0200 +rev346 - cdvdfsv: remove a 2KB of wasted IOP mem (fixes ICO - SCUS_971.59 via SMB) - Sat Jun 19 11:08:28 2010 +0200 +rev345 - SMSTCPIP: adjust PBUF_POOL_SIZE for ingame use (fixes again Disgaea SLUS_206.66 broken since r283) - Fri Jun 18 22:36:12 2010 +0200 +rev344 - added a new compatibilty mode: "reduce the buffers used by cdvdman/cdvdfsv" - Fri Jun 18 22:08:30 2010 +0200 +rev343 - added make_changelog.sh script and DETAILED_CHANGELOG file - Thu Jun 17 12:14:37 2010 +0200 +rev342 - cdvdman: check faulty filepath(more than one ';1') - fixes WWE Smackdown! Shut your mouth (SLUS_204.83) - Wed Jun 16 21:56:10 2010 +0200 +rev341 - use ioptrap module while debugging - Wed Jun 16 20:25:36 2010 +0200 +rev340 - fix for HDD games compat modes saving to another game when using sorted list - Wed Jun 16 19:51:14 2010 +0200 +rev339 - cdvdman fix: dread must return entry size (fixes Captain Tsubasa SLPS_256.91) - Wed Jun 16 14:12:26 2010 +0200 +rev338 - removed netlog module (now replaced by UDPtty) - Mon Jun 14 20:30:37 2010 +0200 +rev337 - make use of UDPtty for in-game debugging - Sun Jun 13 17:37:48 2010 +0200 +rev336 - 10K patch fix: only patch kernel if not already patched - Sun Jun 13 14:55:24 2010 +0200 +rev335 - fix for exiting kernel mode correctly while applying 10K patches - Sun Jun 13 14:48:15 2010 +0200 +rev334 - use more versatile code to get ROMVER info in 10K patches - Sat Jun 12 15:05:24 2010 +0200 +rev333 - remove debug from 10K patches - Sat Jun 12 13:03:30 2010 +0200 +rev332 - 10K fix 2: OPL now runs on original 10K kernel - Sat Jun 12 12:47:16 2010 +0200 +rev331 - loader: do a system restart in LoadExecPS2 hook as the real syscall does (reinitialize GS, INTC, TIMER, DMAC, VU0, VU1, VIF0, VIF1, GIF, IPU, FPU and ScratchPad - Fri Jun 11 23:42:36 2010 +0200 +rev330 - hdd.c: do not deallocate partion table when it's not allocated - Fri Jun 11 23:39:48 2010 +0200 +rev329 - free the HDL game list and HDD partition table in hddCleanup() - Wed Jun 09 21:13:38 2010 +0200 +rev328 - 10K fix 1: OPL now runs on patched 10K kernel - Tue Jun 08 22:06:03 2010 +0200 +rev327 - modified Disc ID stuff to no longer freeze on No disc/Invalid disc - Tue Jun 08 20:07:04 2010 +0200 +rev326 - fix to avoid warning on unused variable in hdd.c - Tue Jun 08 12:07:01 2010 +0200 +rev325 - modified and tested HDD deleting game code (real writes still deactivated) - Sun Jun 06 21:08:31 2010 +0200 +rev324 - use EE SIO debug in the loader - Sun Jun 06 16:00:49 2010 +0200 +rev323 - use EE SIO debug output in the GUI on 'make EESIO_debug' - Sun Jun 06 15:57:29 2010 +0200 +rev322 - cdvdman: be compatible with mass storage device having sector size of 4096 - Sat Jun 05 14:53:15 2010 +0200 +rev321 - usbhdfsd: added an ioctl to return mass storage device sectorsize - Fri Jun 04 11:18:35 2010 +0200 +rev320 - * Fix for issue #29 (dia.c tooltip display) - Thu Jun 03 12:49:06 2010 +0200 +rev319 - Put plasma speed back after the framerate optimization - Thu Jun 03 11:26:33 2010 +0200 +rev318 - cdvdman: be compatible with mass storage having sector size of 512, 1024, 2048 - Wed Jun 02 19:40:33 2010 +0200 +rev317 - * separate background rendering (Issue #31) - Wed Jun 02 19:19:00 2010 +0200 +rev316 - usbhdfsd: removed unused code in fs_getFileStartSector() - Wed Jun 02 18:32:30 2010 +0200 +rev315 - cdvdman: fix for my previous code tweak breaking compat with SMB games in ul format - Wed Jun 02 18:29:25 2010 +0200 +rev314 - cdvdman: code tweaking for opening ISO file(s) - Wed Jun 02 16:42:36 2010 +0200 +rev313 - cdvdman: optimized code size for plain ISO support in cdvdman_ReadSect() - Wed Jun 02 15:38:01 2010 +0200 +rev312 - fix for theme choosen not saving - Wed Jun 02 15:19:27 2010 +0200 +rev311 - use LOG() rather than printf() - Wed Jun 02 13:05:27 2010 +0200 +rev310 - fix for issue #23 - Mon May 31 20:12:26 2010 +0200 +rev309 - make use of udptty in debug version - Mon May 31 12:03:14 2010 +0200 +rev308 - added udptty module - Sun May 30 19:36:35 2010 +0200 +rev307 - forgot system.h, now added - Sun May 30 17:25:10 2010 +0200 +rev306 - added system.h and sysLoadModuleBuffer to able to check for modules already loaded - Sat May 29 20:34:44 2010 +0200 +rev305 - added lanman module & lanlab - Sat May 29 18:03:54 2010 +0200 +rev304 - moved smblab & hdldsvrlab to labs folder - Sat May 29 17:57:43 2010 +0200 +rev303 - small fix in game disc settings handling - Sat May 29 16:00:14 2010 +0200 +rev302 - * stop io timer while io is blocked (seems not to affect the hdl server transfer rate though :( ) - Sat May 29 13:39:14 2010 +0200 +rev301 - buffered write (for config file) - Sat May 29 01:33:40 2010 +0200 +rev300 - Fixing issue #21 - Fri May 28 18:14:10 2010 +0200 +rev299 - * Maybe a more resource friendly (but a bit awkward for now) hdld svr screen - Fri May 28 16:54:37 2010 +0200 +rev298 - smbman: reconnect, re-logon and re-open share on connection loss - Thu May 27 19:44:24 2010 +0200 +rev297 - smbman: removed connect/disconnect (now done by logon/logoff) - Thu May 27 18:51:56 2010 +0200 +rev296 - SMSMAP: do not wait forever for link established (wait around 10s otherwise fails to load) - Thu May 27 16:47:17 2010 +0200 +rev295 - added hdldsvrlab for testing purpose - Thu May 27 15:13:17 2010 +0200 +rev294 - fix for SMB "file open" in APPEND mode - Thu May 27 14:29:57 2010 +0200 +rev293 - Removing unzip, not used any more - Thu May 27 11:44:40 2010 +0200 +rev292 - fix for themes listing in SMB mode - Thu May 27 11:33:26 2010 +0200 +rev291 - Fix for missing Art in SMB mode - Thu May 27 08:32:30 2010 +0200 +rev290 - renamed hdl.c to hdd.c and hddFormat() to hddGetFormat() - Wed May 26 23:01:04 2010 +0200 +rev289 - * Fork merge: Porting back the GUI repository changes - Wed May 26 22:27:36 2010 +0200 +rev288 - added hddFormat, hddDeleteHDLGame (untested) - Wed May 26 20:48:07 2010 +0200 +rev287 - fix for LoadHdldsvr() and UnloadHdldSvr() - Wed May 26 20:01:23 2010 +0200 +rev286 - added UnloadHdldSvr() - Tue May 25 08:35:24 2010 +0200 +rev285 - added LoadHdldSvr() to GUI (currently never called) - Sun May 23 17:25:33 2010 +0200 +rev284 - hdldsvr: use real writes (the module is not loaded by the GUI) - Sun May 23 16:08:35 2010 +0200 +rev283 - hdldsvr: added CMD_WRIT & CMD_WRIS, completed UDP thread part (only fake writes) - Sun May 23 09:45:54 2010 +0200 +rev282 - hdldsvr: added CMD_FLSH & CMD_POWX - Sat May 22 18:18:32 2010 +0200 +rev281 - hdldsvr: a fix in interpreting/replying command result - Sat May 22 11:41:45 2010 +0200 +rev280 - hdldsvr: added CMD_STAT & CMD_READ (hdl_dump able to attach and list games) - Fri May 21 10:51:18 2010 +0200 +rev279 - added hdldsvr IOP module skeleton - Fri May 21 10:11:22 2010 +0200 +rev278 - added a specific SMSTCPIP for ingame use, and re-enabled UDP in the normal one - Fri May 21 10:07:45 2010 +0200 +rev277 - Anti-freeze fix for NBSS Session KeepAlive in smbman and ingame SMB core - Thu May 20 20:13:19 2010 +0200 +rev276 - make use of new smbman fileXio functions - Thu May 20 19:57:09 2010 +0200 +rev275 - applied SMB connection speedup to ingame SMB core - Wed May 19 21:20:43 2010 +0200 +rev274 - smbman: finished chdir implementation - Tue May 18 20:28:56 2010 +0200 +rev273 - smbman: implemented dopen/dread/dclose/chdir (chdir is not complete) - Tue May 18 12:43:54 2010 +0200 +rev272 - smbman: implemented FindFirst2, FindNext2 requests, different tweaks to make connection faster - Tue May 18 12:00:32 2010 +0200 +rev271 - smbman: fixed a killer buffer overflow while generating DES keys - Mon May 17 22:16:40 2010 +0200 +rev270 - smbman: added mkdir IO function, make LogOn not retrying forever - Mon May 17 17:11:56 2010 +0200 +rev269 - smbman: added Rename request and his rename IO function - Mon May 17 12:37:30 2010 +0200 +rev268 - smbman: added Delete Directory request and his rmdir IO function - Sun May 16 19:03:49 2010 +0200 +rev267 - smbman: added Delete request and his remove IO function - Sun May 16 17:43:06 2010 +0200 +rev266 - smbman: added poll() to not lock forever using lwip_recv - Sun May 16 16:59:25 2010 +0200 +rev265 - smbman: fix for closing previously created tcp connection before opening it (in the same module instance) - Sun May 16 16:35:31 2010 +0200 +rev264 - smbman: added timer to echo the SMB server every 3 sec while not doing IO - Sun May 16 14:01:51 2010 +0200 +rev263 - smbman: added QueryDiskInfo request and his devctl function - Sun May 16 13:36:20 2010 +0200 +rev262 - smbman: added file IO getstat support - Sun May 16 13:21:34 2010 +0200 +rev261 - smbman: a few tweaks to the packet structs - Sat May 15 17:15:58 2010 +0200 +rev260 - smbman: added QueryPathInformation Trans2 request - Sat May 15 16:05:06 2010 +0200 +rev259 - smbman: modified smb_ReadAndX and smb_WriteAndX to support large files (>4GB) - Fri May 14 14:04:09 2010 +0200 +rev258 - smbman: added generic lseek64 support (needs PS2SDK lseek64 fix to work) - Fri May 14 13:32:58 2010 +0200 +rev257 - smbman: reviewed devctl functions - Fri May 14 10:17:05 2010 +0200 +rev256 - smbman: reviewed AddPassword function - Thu May 13 22:40:36 2010 +0200 +rev255 - * added method for managing passwords, re-enable smb_NTCreateAndX, small fix when read only mode requested - Thu May 13 16:14:45 2010 +0200 +rev254 - added smblab to test smbman functions - Thu May 13 11:48:13 2010 +0200 +rev253 - smbman: finished smb_NetShareEnum(), added smb_Echo(), refined devctls - Wed May 12 22:33:19 2010 +0200 +rev252 - tagged r245 as release 0.7 - Wed May 12 20:43:27 2010 +0200 +rev251 - smbman: fixed fatal error for compiling in smb_NetShareEnum() - Wed May 12 17:52:40 2010 +0200 +rev250 - added a few commands to smbman (TreeDisconnect, LogOffAndX, NetShareEnum) - Tue May 11 20:56:56 2010 +0200 +rev249 - Porting back the opl2iso into the main repository - Tue May 11 20:53:03 2010 +0200 +rev248 - added write support to smbman - Tue May 11 20:48:45 2010 +0200 +rev247 - added NTLMv1 authentification ability to smbman - Sun May 09 19:17:26 2010 +0200 +rev246 - added user security level to smbman, currently supports plaintext/encrypted passwords and LanMan authentification - Sun May 09 17:06:37 2010 +0200 +rev245 - updated version number to 0.7 and changelog, credits - Sat May 08 22:49:44 2010 +0200 +rev244 - izdubar: fix for 18K - Sat May 08 18:59:02 2010 +0200 +rev243 - IGR2 Fix 5. - Tue May 04 17:13:11 2010 +0200 +rev242 - IGR2 Fix 4. - Tue May 04 16:37:28 2010 +0200 +rev241 - corrected polish translation by Berion - Tue Mar 30 11:53:11 2010 +0200 +rev240 - Added an embedded Elf loader to the GUI (actually used on Exit to Elf) - Tue Mar 23 13:27:19 2010 +0100 +rev239 - IGR2 fix 3. - Mon Mar 15 10:06:28 2010 +0100 +rev238 - Pad repeat pre-delay (double the repeat delay for now). - Sat Mar 13 20:29:29 2010 +0100 +rev237 - Renamed iso2usbld to iso2opl, fix for running iso2opl on Big Endian systems - Sat Mar 06 18:17:59 2010 +0100 +rev236 - IGR2 fix 2. - Thu Mar 04 19:09:04 2010 +0100 +rev235 - Gilgamesh88: fix read buffer double increment bug in smbman.c - Wed Mar 03 19:47:29 2010 +0100 +rev234 - IRG2 first fix. ;) - Tue Mar 02 23:55:57 2010 +0100 +rev233 - smbman, usbhdfsd: just cosmetics, fixed indents and leading/trailing whitespaces - Tue Mar 02 11:36:07 2010 +0100 +rev232 - eesync/imgdrv: just cosmetics - Mon Mar 01 23:48:20 2010 +0100 +rev231 - just cosmetics: fixed indents, removed leading/trailing whitespaces - Mon Mar 01 20:05:55 2010 +0100 +rev230 - Fix: be sure HDD is actually used and selected before storing - Mon Mar 01 11:31:27 2010 +0100 +rev229 - HDD settings only stored on save, not test (untested) - Mon Mar 01 09:54:14 2010 +0100 +rev228 - merging branches - Mon Mar 01 08:53:18 2010 +0100 +rev227 - Two more fixes by Izdubar - Mon Mar 01 08:34:45 2010 +0100 +rev226 - Rewrote completly IGR. - Sun Feb 28 21:39:54 2010 +0100 +rev225 - dev9: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 21:39:13 2010 +0100 +rev224 - cddev, discID: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 21:30:38 2010 +0100 +rev223 - cdvdfsv: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 20:43:27 2010 +0100 +rev222 - cdvdman: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 20:32:54 2010 +0100 +rev221 - A couple of fixes: - Sun Feb 28 20:18:56 2010 +0100 +rev220 - * this slipped through - default delay should be 7 - Sun Feb 28 17:06:08 2010 +0100 +rev219 - * Cummulative patch by gilgamesh - consistency improvements - Fri Feb 26 08:58:19 2010 +0100 +rev218 - New coloured icons by Gilgamesh88 - Thu Feb 25 18:53:06 2010 +0100 +rev217 - Added PCMCIA support (auto-detected, should work with 18K atm) - Thu Feb 25 18:49:47 2010 +0100 +rev216 - Fix again to the sed command in all modules Rules.make files causing 'unrecognized -mcpu=r3000 option' on some dev environments - Thu Feb 25 18:46:47 2010 +0100 +rev215 - Working IGR fix for NFS Underground2 this time. :D - Mon Feb 22 09:10:51 2010 +0100 +rev214 - Removed PS2ETH and GSKIT vars definition from Makefile - Sun Feb 21 13:39:36 2010 +0100 +rev213 - Corrected misuse of ps2-packer in Makefile, sorry for those who'll need to move it - Tue Feb 16 20:40:56 2010 +0100 +rev212 - IGR fix 2. - Tue Feb 16 20:16:19 2010 +0100 +rev211 - Modified sed in Rules.make files to fix unrecognized option -mcpu=r3000 when using fr_FR.UTF-8 as LANG env var on some Linux distro - Tue Feb 16 16:02:03 2010 +0100 +rev210 - Add "Disable Debug Colors" setting. - Tue Feb 16 15:24:30 2010 +0100 +rev209 - zipped theme support (very slow) - Tue Feb 16 11:40:27 2010 +0100 +rev208 - Fix a bug when setting compatibility in multiple device. - Mon Feb 15 19:45:22 2010 +0100 +rev207 - IGR fixs: - Sun Feb 14 22:38:46 2010 +0100 +rev206 - A fix for the pink freezes when using custom lang file - Sun Feb 14 20:50:03 2010 +0100 +rev205 - Adding the ability to load language localisation files - Sun Feb 14 12:36:19 2010 +0100 +rev204 - Optimization of scePadRead hooking time. - Fri Jan 29 17:30:57 2010 +0100 +rev203 - Revert to sbv patch use with igr too. - Thu Jan 28 19:04:00 2010 +0100 +rev202 - Revert to Sbv patches use for old game compatibility. - Tue Jan 26 18:32:04 2010 +0100 +rev201 - Add a poweroff combo trick. - Sun Jan 24 19:12:07 2010 +0100 +rev200 - Add compat mode 6 to disable IGR. ( In compatibility settings ) - Sun Jan 24 10:20:58 2010 +0100 +rev199 - Loader size optimization. - Sat Jan 23 23:34:44 2010 +0100 +rev198 - Sorry .s file don't want to be push. - Sat Jan 23 14:59:52 2010 +0100 +rev197 - Loader size optimization. - Sat Jan 23 14:41:15 2010 +0100 +rev196 - home & end for HDD games - Thu Jan 21 22:02:25 2010 +0100 +rev195 - some more pointer handling fixes - Thu Jan 21 21:08:09 2010 +0100 +rev194 - pagestart handling fixes - Thu Jan 21 18:59:25 2010 +0100 +rev193 - Merging branches - Thu Jan 21 17:24:15 2010 +0100 +rev192 - * Selection in static mode now not centered (HDLoader like) - Thu Jan 21 17:17:07 2010 +0100 +rev191 - SMSMAP: wait link status forever (hopefully it fixes freeze on 1 bug) - Thu Jan 21 15:21:42 2010 +0100 +rev190 - Fix sound loop bug when using in game reset. - Thu Jan 21 15:19:56 2010 +0100 +rev189 - In Game Reset first shot. ( Disabled for the moment ) - Thu Jan 21 14:58:32 2010 +0100 +rev188 - get rid of kernel mem usage for patches code and let it handled by the loader - Thu Jan 21 00:06:19 2010 +0100 +rev187 - Added some generic patching mode for some games - Tue Jan 19 23:16:15 2010 +0100 +rev186 - cosmetic changes again to patches table code - Fri Jan 15 13:26:36 2010 +0100 +rev185 - Added patch for Armored Core Nine Breaker NTSC US via USB - Thu Jan 14 14:31:08 2010 +0100 +rev184 - Added value check to the game patching process - Wed Jan 13 20:26:43 2010 +0100 +rev183 - Loader now uses game patches (actually Disgaea PAL USB/SMB fix) - Wed Jan 13 16:53:31 2010 +0100 +rev182 - Enabled game patches table before to launch the loader - Wed Jan 13 10:41:07 2010 +0100 +rev181 - Added game patches table code - Tue Jan 12 22:25:22 2010 +0100 +rev180 - Slower Dialog scrolling. Also a speed handling fix. - Tue Jan 12 19:09:12 2010 +0100 +rev179 - HDD autostart option added. - Tue Jan 12 18:53:03 2010 +0100 +rev178 - some cosmetic changes to PS3 network fix - Tue Jan 12 18:32:17 2010 +0100 +rev177 - fix to SMSMAP to be able to use network on PS3 - Tue Jan 12 17:50:00 2010 +0100 +rev176 - adjusted DMA modes implementation (functional now) - Tue Jan 12 13:33:16 2010 +0100 +rev175 - Added DMA mode in UI - Tue Jan 12 12:45:43 2010 +0100 +rev174 - v12/v13 HDD detect fix: information given by dlanor - Sat Jan 09 13:43:03 2010 +0100 +rev173 - modified and tested HDD write OK (for compat modes), still disabled - Sat Jan 09 01:24:28 2010 +0100 +rev172 - totally ignore native HDL compatibilty modes - Fri Jan 08 14:33:15 2010 +0100 +rev171 - fix for lack of file opened check in smbman - Thu Jan 07 11:51:47 2010 +0100 +rev170 - fix for modchip freezing (maybe not all modchips) - Wed Jan 06 22:21:32 2010 +0100 +rev169 - Untested: - Wed Jan 06 21:27:09 2010 +0100 +rev168 - fixing bug in hdd usage gui selection - Wed Jan 06 20:28:31 2010 +0100 +rev167 - a copy-paste warning fix - Wed Jan 06 08:52:00 2010 +0100 +rev166 - First shot of HDD integration into GUI. Compat modes very rough. Untested! - Tue Jan 05 22:38:32 2010 +0100 +rev165 - added dutch language - Tue Jan 05 22:13:53 2010 +0100 +rev164 - changes to redundant code in system.c, changes to HDD compat modes handling - Tue Jan 05 20:42:05 2010 +0100 +rev163 - changes for SOCOM 3 Online playing - Tue Jan 05 17:13:56 2010 +0100 +rev162 - added poweroff support (currently disabled) - Mon Jan 04 19:48:35 2010 +0100 +rev161 - updated CREDITS file - Mon Jan 04 14:50:46 2010 +0100 +rev160 - HDL code: fix potential overflow while changing game name - Mon Jan 04 11:35:12 2010 +0100 +rev159 - changes to HDL code (added ability to save compat flags and game name) - Sun Jan 03 18:48:26 2010 +0100 +rev158 - added ps2hdd module, adjusted code to support 48-bit LBA HDD and set Transfer Mode - Sun Jan 03 15:59:19 2010 +0100 +rev157 - added atad module - Sun Jan 03 15:44:10 2010 +0100 +rev156 - fix to cdvdman so that HDD core is able to detect network adapter - Sun Jan 03 14:39:45 2010 +0100 +rev155 - changes again to HDD code - Sun Jan 03 11:16:39 2010 +0100 +rev154 - changes to HDD code - Sun Jan 03 11:04:27 2010 +0100 +rev153 - added HDL layer to GUI (currently disabled) - Sat Jan 02 20:57:22 2010 +0100 +rev152 - Game ID GUI and injection implementation (for DNAS) - Sat Jan 02 20:34:34 2010 +0100 +rev151 - changes to hdl header struct - Sat Jan 02 14:50:04 2010 +0100 +rev150 - added code for internal HDD support (HDL format) to cdvdman - Sat Jan 02 12:40:45 2010 +0100 +rev149 - fixes to SMB code for NAS devices not supporting Unicode strings - Fri Jan 01 20:18:19 2010 +0100 +rev148 - fixed bug in cdvdfsv never returning CDVD_READY_READY state for blocking mode - Fri Jan 01 15:42:27 2010 +0100 +rev147 - changes to be able to use a valid disc ID on online games - Thu Dec 31 09:25:44 2009 +0100 +rev146 - Adding the ability to choose the default menu (USB, NET, HDD games). - Mon Dec 28 21:27:32 2009 +0100 +rev145 - Network startup forced to be synchronous (Solution for bug #16, hopefully) - Sun Dec 27 17:33:49 2009 +0100 +rev144 - Better randomization of the port value (And even more hacky). Improves network startup delays significantly here - Sun Dec 27 17:18:04 2009 +0100 +rev143 - tagged r142 to release 0.6 - Sun Dec 27 17:00:13 2009 +0100 +rev142 - Updated version number - Sun Dec 27 14:29:14 2009 +0100 +rev141 - Hacky SMB speedup: "Randomize" the source port value to avoid port reusal. - Wed Dec 23 20:15:44 2009 +0100 +rev140 - updated CHANGELOG/CREDTIS/README files - Wed Dec 23 19:15:48 2009 +0100 +rev139 - Added configurable exit button - Wed Dec 23 13:20:55 2009 +0100 +rev138 - Changed UI color controls - Wed Dec 23 10:45:48 2009 +0100 +rev137 - fixed long reconnection time (yellow screen) - Tue Dec 22 22:25:22 2009 +0100 +rev136 - Added support for multiple partitions - Tue Dec 22 19:47:30 2009 +0100 +rev135 - Fixing linux samba compatibility (White screen removal fix) - Tue Dec 22 17:33:33 2009 +0100 +rev134 - Changed modes text - Tue Dec 22 16:54:22 2009 +0100 +rev133 - changes to SMSUTILS so it doesn't use PS2SDKSRC env var to build - Tue Dec 22 14:16:20 2009 +0100 +rev132 - new core merging step3: adapted EE core to new IOP core - Tue Dec 22 13:14:19 2009 +0100 +rev131 - new core merging step2: added new modules - Mon Dec 21 18:52:28 2009 +0100 +rev130 - new core merging step1: deleted modules - Mon Dec 21 16:51:23 2009 +0100 +rev129 - Implemented sorting (via select) - Mon Dec 21 15:36:12 2009 +0100 +rev128 - Adding two new icons - Mon Dec 21 15:26:46 2009 +0100 +rev127 - tagged r126 to release 0.5 - Wed Dec 02 13:11:06 2009 +0100 +rev126 - * Added languages - Wed Dec 02 10:52:36 2009 +0100 +rev125 - Czech welcome message update - Sun Nov 29 19:58:33 2009 +0100 +rev124 - added ioctl cmd to usbhdfsd to retrieve physical file sector - Sun Nov 29 16:28:09 2009 +0100 +rev123 - added sifman module, currently unused - Mon Nov 23 16:46:23 2009 +0100 +rev122 - reduced buffers again in isofs/smbman - Sun Nov 22 11:59:09 2009 +0100 +rev121 - try to use IPCONFIG.DAT from mc in slot 2 - Sun Nov 15 20:10:27 2009 +0100 +rev120 - chaanged some modules rules.make to build properly on my Ubuntu environment - Sat Nov 14 16:54:05 2009 +0100 +rev119 - changes to lwipopts.h to reduce SMSTCPIP mem usage - Fri Nov 13 18:55:53 2009 +0100 +rev118 - reduced IOP mem usage for isofs/smbman modules - Fri Nov 13 17:10:40 2009 +0100 +rev117 - Correcting hints - Fri Nov 13 14:42:11 2009 +0100 +rev116 - Adding UI component hint feature. Hints on Compat settings now - Fri Nov 13 09:43:26 2009 +0100 +rev115 - enlighted mass driver mem usage for mode 2 - Fri Nov 13 09:37:27 2009 +0100 +rev114 - implemented mode 2: have lower mem usage in SMSTCPIP/smbman modules - Thu Nov 12 20:51:39 2009 +0100 +rev113 - Enabled SMSMAP/SMSTCPIP IOP modules - Thu Nov 12 20:31:08 2009 +0100 +rev112 - Fixed pink screen, and bugs in IOP reboot - Thu Nov 12 19:26:35 2009 +0100 +rev111 - reverted loader changes: stupid idea to choose g_buf address at runtime - Thu Nov 12 16:08:21 2009 +0100 +rev110 - added compat mode 1, inverted modes 4 & 5 - Thu Nov 12 14:47:47 2009 +0100 +rev109 - added compat mode 4 & 5 - Wed Nov 11 22:26:12 2009 +0100 +rev108 - added compat mode 3 - Wed Nov 11 21:28:57 2009 +0100 +rev107 - Moving the compat mask to third argument - Wed Nov 11 21:08:01 2009 +0100 +rev106 - FIX: Temporary fix - Second pink freeze for some games - This helps another bit - Wed Nov 11 20:47:49 2009 +0100 +rev105 - Virt. keyboard now uses button icons - Wed Nov 11 16:21:25 2009 +0100 +rev104 - FIX: This removes the freeze on second pink for some games (on my machine) - Wed Nov 11 15:50:07 2009 +0100 +rev103 - Renaming to lower case - caused Error opening with case sensitive linux filesystem - Wed Nov 11 14:15:09 2009 +0100 +rev102 - Adding select and start button icons by JNABK - Wed Nov 11 10:54:19 2009 +0100 +rev101 - FIX: Compat settings now seem to propagate well. Copy-paste introduced bug fixed - Wed Nov 11 10:14:12 2009 +0100 +rev100 - set IP changed flag to ensure IP settings get saved - Wed Nov 11 10:09:52 2009 +0100 +rev99 - Merging changes - Wed Nov 11 09:51:39 2009 +0100 +rev98 - * Pass in the compat settings in the same string - Wed Nov 11 06:50:21 2009 +0100 +rev97 - fix: saving config if SYS-CONF doesn't exists - Tue Nov 10 22:08:55 2009 +0100 +rev96 - Compat settings count now 5, propagation to loader.c implemented - Tue Nov 10 22:07:31 2009 +0100 +rev95 - changes to SMSTCPIP/include/lwipopts.h - Tue Nov 10 19:50:50 2009 +0100 +rev94 - added missing smap_opt.s, updated CREDITS file - Tue Nov 10 19:16:23 2009 +0100 +rev93 - add SMSMAP/SMSTCIP modules, currently not used - Tue Nov 10 12:04:33 2009 +0100 +rev92 - added stuff to build an alternate loader (suitable for Sonic Unleashed) - Tue Nov 10 11:34:52 2009 +0100 +rev91 - FIX: Config loading was removed. Putting it back - Tue Nov 10 11:23:26 2009 +0100 +rev90 - FIX: Error codes are <0, not <=0. This could affect loading if file handle had value 0 - Tue Nov 10 10:25:24 2009 +0100 +rev89 - reverted netlog loading accidentally committed - Tue Nov 10 09:07:25 2009 +0100 +rev88 - fix for freezing multi-elf games - Tue Nov 10 09:06:29 2009 +0100 +rev87 - Adding missing icons - Mon Nov 09 20:32:32 2009 +0100 +rev86 - FIX: Issue 10 (share name overflow) - Mon Nov 09 20:29:58 2009 +0100 +rev85 - Show icons at background in config dialogs - Sun Nov 08 21:12:15 2009 +0100 +rev84 - Changed name, updated spanish translation, and now info txt shows in selected language - Sun Nov 08 20:04:14 2009 +0100 +rev83 - added missing ioman_add header file for dev9 module - Sun Nov 08 02:29:23 2009 +0100 +rev82 - enlighted dev9 module and added dev9x device driver - Sun Nov 08 02:13:54 2009 +0100 +rev81 - renamed GetSyscall to GetSycallHandler and use syscallnr header - Fri Nov 06 21:02:33 2009 +0100 +rev80 - FIX: The remaining ip config fields renumbered. That should be it - Fri Nov 06 20:57:03 2009 +0100 +rev79 - Fix: IP config screen had all the settings moved by one (renumbered the dialog but not the value injection) - Fri Nov 06 16:25:36 2009 +0100 +rev78 - Fix for the recent error with media and parts reading. - Fri Nov 06 08:48:56 2009 +0100 +rev77 - reverting back isofs to rev71 - Fri Nov 06 08:09:20 2009 +0100 +rev76 - reverted cdvdman & isofs to rev70 - Thu Nov 05 12:39:02 2009 +0100 +rev75 - Reverting this (commit by accident) - Wed Nov 04 18:12:29 2009 +0100 +rev74 - * New compat mode ui (via triangle) - currently without function - Wed Nov 04 17:18:48 2009 +0100 +rev73 - added SIF and SIF RPC init calls to cdvdman - Tue Nov 03 21:42:15 2009 +0100 +rev72 - few changes to cdvdman and commented unneeded code in smbman - Tue Nov 03 21:39:13 2009 +0100 +rev71 - fix for those games opening files with other flag than O_RDONLY - Tue Nov 03 18:50:05 2009 +0100 +rev70 - fix: smaller elf at second make all - Tue Nov 03 18:34:03 2009 +0100 +rev69 - fix for some games freezing while searching for a non-existent file - Mon Nov 02 18:09:42 2009 +0100 +rev68 - Added ugly virtual keyboard - Mon Nov 02 13:28:11 2009 +0100 +rev67 - Merging changes - Mon Nov 02 12:09:40 2009 +0100 +rev66 - New data driven dialog code. Needs color, enum and string inputs to be complete. IP config rewritten to use it. - Sun Nov 01 23:21:19 2009 +0100 +rev65 - remove pink screen when a IOP reset hook has finished (set_reg_hook reaches 0) - Sun Nov 01 20:25:52 2009 +0100 +rev64 - fix for white screens: bad gamename crc32 calculation - Sun Nov 01 20:25:10 2009 +0100 +rev63 - Small file adressing fix - Sun Nov 01 16:18:15 2009 +0100 +rev62 - Merged changes - Sun Nov 01 11:50:30 2009 +0100 +rev61 - Some input system rewrites, scrolling after dialog fix, settings only saved on save settings subitem now - Sat Oct 31 19:06:23 2009 +0100 +rev60 - usbhdfsd: removed use of PS2SDKSRC env var - Sat Oct 31 12:22:29 2009 +0100 +rev59 - Network UI improvements: Port and autostart settings, network loading feedback - Sat Oct 31 12:18:09 2009 +0100 +rev58 - Config handling improved - now remembers the loaded config and stores to the same location - Sat Oct 31 12:08:12 2009 +0100 +rev57 - iso2usbld: only use long long and not __int64 - Sat Oct 31 09:11:53 2009 +0100 +rev56 - iso2usbld: added commented use of open/read/write/lsee64/close - Sat Oct 31 07:09:53 2009 +0100 +rev55 - build iso2usbld on make pc_tools - Fri Oct 30 22:50:27 2009 +0100 +rev54 - Adding the missing network icons, sorry everyone! - Fri Oct 30 21:00:58 2009 +0100 +rev53 - Adding network icons by JNABK - Fri Oct 30 11:37:17 2009 +0100 +rev52 - just corrected a comment - Fri Oct 30 08:05:09 2009 +0100 +rev51 - fix once again to avoid breaking compatibility - Thu Oct 29 20:25:46 2009 +0100 +rev50 - another fix to fake module load to avoid breaking compatibility - Thu Oct 29 17:02:08 2009 +0100 +rev49 - fix for faking some modules load correctly - Thu Oct 29 16:58:07 2009 +0100 +rev48 - fix for multi-elf games freezing on pink - Thu Oct 29 14:07:59 2009 +0100 +rev47 - fixes for iso2usbld to handle large ISO (>4Gb) - Thu Oct 29 13:16:09 2009 +0100 +rev46 - renamed PUBLIC share to PS2SMB - Wed Oct 28 20:22:14 2009 +0100 +rev45 - modified iso2usbld CFLAGS - Wed Oct 28 18:29:11 2009 +0100 +rev44 - create USBLD folder on mass if not existing - Wed Oct 28 16:48:15 2009 +0100 +rev43 - apply IP settings to loader/modules - Wed Oct 28 13:49:58 2009 +0100 +rev42 - Added IP configuration screen - Wed Oct 28 12:34:45 2009 +0100 +rev41 - different fixes, one very important for iso2usbld - Wed Oct 28 12:00:29 2009 +0100 +rev40 - Updated CHANGELOG, README and CREDITS - Tue Oct 27 21:58:29 2009 +0100 +rev39 - Added missing license headers - Tue Oct 27 20:58:24 2009 +0100 +rev38 - added support to network games trought SMB protocol - Tue Oct 27 16:13:35 2009 +0100 +rev37 - just acouple changes for isofs patch & cdvdman - Mon Oct 26 20:27:06 2009 +0100 +rev36 - allow isofs to handle up to 8 parts - Mon Oct 26 18:52:16 2009 +0100 +rev35 - added .hgtags - Sat Oct 24 20:03:21 2009 +0200 +rev34 - added missing readonly makefile for mass_driver - Sat Oct 24 17:56:28 2009 +0200 +rev33 - disabled write support for ingame mass_driver - Sat Oct 24 16:14:24 2009 +0200 +rev32 - added LICENSE, README, CREDITS and CHANGELOG - Sat Oct 24 16:12:02 2009 +0200 +rev31 - New_Iop_Reset: switched to reset with EELOADCNF - Sat Oct 24 16:09:31 2009 +0200 +rev30 - Now searchs for USBD.IRX in MC. If not exists load embedded usbd.irx for each platform - Fri Oct 23 10:20:06 2009 +0200 +rev29 - static mode now fit with JNABK templates also in PAL mode - Thu Oct 22 20:27:52 2009 +0200 +rev28 - Fix: Welcome text showing extra text - Sun Oct 18 20:26:50 2009 +0200 +rev27 - fix for PS3 with software emulation - Sun Oct 18 00:48:15 2009 +0200 +rev26 - Added spanish translation - Sat Oct 17 22:54:56 2009 +0200 +rev25 - Oops. These slipped through. Reverting - Sat Oct 17 22:43:30 2009 +0200 +rev24 - Adding save icon - Sat Oct 17 20:44:42 2009 +0200 +rev23 - Adding language support - Sat Oct 17 16:32:20 2009 +0200 +rev22 - * rewritten the config file handling (to use key=val lines) - Sat Oct 17 16:30:30 2009 +0200 +rev21 - * cleaning up the code a bit - all menu construction now in main, etc. - Sat Oct 17 16:29:49 2009 +0200 +rev20 - isofs: fixed bug in skipmod_check() - Tue Oct 13 21:56:57 2009 +0200 +rev19 - modified isofs: allow it to fake some module load from cdrom - Tue Oct 13 17:55:35 2009 +0200 +rev18 - fix for 8+3 elf's filename - Tue Oct 06 08:52:56 2009 +0200 +rev17 - Added messages of what is doing makefile - Mon Oct 05 21:01:36 2009 +0200 +rev16 - fix: cdvdman.c:1708: warning: unused variable `netlog_modname' - Sun Oct 04 20:44:48 2009 +0200 +rev15 - loader: modified Patch_Img into Patch_Mod using g_buf - Sun Oct 04 20:43:49 2009 +0200 +rev14 - loader now loads at e8000 and use g_buf at 88000 - Sun Oct 04 19:38:27 2009 +0200 +rev13 - modified cdvdman: added stream and other fixes - Sun Oct 04 16:57:37 2009 +0200 +rev12 - modified isofs to handle media type - Sun Oct 04 15:45:04 2009 +0200 +rev11 - moved IOP reset to LoadExecPS2 replacement - Sun Oct 04 15:31:56 2009 +0200 +rev10 - added debug over ethernet - Sun Oct 04 15:13:06 2009 +0200 +rev9 - Updated interface - Sun Oct 04 14:56:59 2009 +0200 +rev8 - Updated interface with dynamic menu - Sun Oct 04 14:40:10 2009 +0200 +rev7 - a few fixes so that it can compile - Sun Oct 04 02:34:51 2009 +0200 +rev6 - iso2usbld: fixes for linux build - Fri Oct 02 18:40:33 2009 +0200 +rev5 - iso2usbld: fixed those deprecated type casts - Tue Sep 29 09:39:20 2009 +0200 +rev4 - bugfix for iso2usbld - Sun Sep 27 21:55:27 2009 +0200 +rev3 - modified .hignore - Sun Sep 27 21:20:14 2009 +0200 +rev2 - added open usb loader sources - Sun Sep 27 19:00:50 2009 +0200 +rev1 - added iso2usbld - Sun Sep 27 17:42:30 2009 +0200 +rev0 - added .hgignore - Sun Sep 27 17:36:34 2009 +0200 rev - - Sun Sep 27 16:20:30 2009 +0200 diff --git a/include/config.h b/include/config.h index eef7c5436..5b5fa2a03 100644 --- a/include/config.h +++ b/include/config.h @@ -6,6 +6,7 @@ enum CONFIG_INDEX { CONFIG_INDEX_OPL = 0, CONFIG_INDEX_LAST, CONFIG_INDEX_APPS, + CONFIG_INDEX_ELM, CONFIG_INDEX_NETWORK, CONFIG_INDEX_COUNT @@ -15,6 +16,7 @@ enum CONFIG_INDEX { #define CONFIG_OPL (1 << CONFIG_INDEX_OPL) #define CONFIG_LAST (1 << CONFIG_INDEX_LAST) #define CONFIG_APPS (1 << CONFIG_INDEX_APPS) +#define CONFIG_ELM (1 << CONFIG_INDEX_ELM) #define CONFIG_NETWORK (1 << CONFIG_INDEX_NETWORK) #define CONFIG_ALL 0xFF @@ -32,6 +34,7 @@ enum CONFIG_INDEX { #define CONFIG_ITEM_ALTSTARTUP "$AltStartup" #define CONFIG_ITEM_VMC "$VMC" #define CONFIG_ITEM_COMPAT "$Compatibility" +#define CONFIG_ITEM_DMA "Modes" #define CONFIG_ITEM_DMA "$DMA" #define CONFIG_ITEM_DNAS "$DNAS" #define CONFIG_ITEM_CONFIGSOURCE "$ConfigSource" @@ -73,6 +76,7 @@ enum CONFIG_INDEX { #define CONFIG_OPL_HDD_MODE "hdd_mode" #define CONFIG_OPL_ETH_MODE "eth_mode" #define CONFIG_OPL_APP_MODE "app_mode" +#define CONFIG_OPL_ELM_MODE "elm_mode" #define CONFIG_OPL_SWAP_SEL_BUTTON "swap_select_btn" //Network config keys diff --git a/include/dialogs.h b/include/dialogs.h index 81635a3c5..56c867527 100644 --- a/include/dialogs.h +++ b/include/dialogs.h @@ -29,6 +29,7 @@ enum UI_ITEMS { CFG_HDDMODE, CFG_ETHMODE, CFG_APPMODE, + CFG_ELMMODE, CFG_CHECKUSBFRAG, CFG_LASTPLAYED, CFG_LBL_AUTOSTARTLAST, diff --git a/include/elmsupport.h b/include/elmsupport.h new file mode 100644 index 000000000..878f1d8cd --- /dev/null +++ b/include/elmsupport.h @@ -0,0 +1,11 @@ +#ifndef __ELM_SUPPORT_H +#define __ELM_SUPPORT_H + +#include "include/iosupport.h" + +#define ELM_MODE_UPDATE_DELAY 240 + +void elmInit(); +item_list_t* elmGetObject(int initOnly); + +#endif diff --git a/include/ethsupport.h b/include/ethsupport.h index e2f5cab8d..e07be55b7 100644 --- a/include/ethsupport.h +++ b/include/ethsupport.h @@ -17,6 +17,7 @@ typedef struct } smb_vmc_infos_t; #endif +char* ethGetPrefix(void); void ethInit(void); //Full initialization (Start ETH + SMB and apply configuration). GUI must be already initialized, used by GUI to start SMB mode. void ethDeinitModules(void); //Module-only deinitialization, without the GUI's knowledge (for specific reasons, otherwise unused). int ethLoadInitModules(void); //Initializes Ethernet and applies configuration. diff --git a/include/hddsupport.h b/include/hddsupport.h index 0689be80f..5eee52c0c 100644 --- a/include/hddsupport.h +++ b/include/hddsupport.h @@ -130,6 +130,7 @@ typedef struct } hdd_vmc_infos_t; #endif +char* hddGetPrefix(void); int hddCheck(void); u32 hddGetTotalSectors(void); int hddIs48bit(void); diff --git a/include/iosupport.h b/include/iosupport.h index 222aadac5..c72763086 100644 --- a/include/iosupport.h +++ b/include/iosupport.h @@ -8,6 +8,7 @@ enum IO_MODES { ETH_MODE, HDD_MODE, APP_MODE, + ELM_MODE, MODE_COUNT }; diff --git a/include/lang.h b/include/lang.h index fd19f26b6..3ea9036cd 100644 --- a/include/lang.h +++ b/include/lang.h @@ -211,6 +211,8 @@ enum _STR_IDS { _STR_HINT_AUTOSTARTLAST, _STR_PS2LOGO, _STR_HINT_PS2LOGO, + _STR_ELM, + _STR_ELMMODE, LANG_STR_COUNT }; diff --git a/include/opl.h b/include/opl.h index 304d44e05..f6a200060 100644 --- a/include/opl.h +++ b/include/opl.h @@ -100,6 +100,7 @@ int gUSBStartMode; int gHDDStartMode; int gETHStartMode; int gAPPStartMode; +int gELMStartMode; int gAutosort; int gAutoRefresh; diff --git a/include/textures.h b/include/textures.h index 8b5136962..f3b6c0af3 100644 --- a/include/textures.h +++ b/include/textures.h @@ -14,6 +14,7 @@ enum INTERNAL_TEXTURE { HDD_ICON, ETH_ICON, APP_ICON, + ELM_ICON, LEFT_ICON, RIGHT_ICON, UP_ICON, diff --git a/include/usbsupport.h b/include/usbsupport.h index 0d648906a..4aa594687 100644 --- a/include/usbsupport.h +++ b/include/usbsupport.h @@ -17,6 +17,7 @@ typedef struct } usb_vmc_infos_t; #endif +char* usbGetPrefix(void); void usbInit(); item_list_t *usbGetObject(int initOnly); int usbFindPartition(char *target, char *name); diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 2866891c9..23ed6090e 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,210 +1,214 @@ -# Arabic Translation by LightWave - @http://psx-scene.com/forums/members/lightwave/ -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ -Arabic -Open PS2 Loader %s -تثبيت التغييرات -العودة -تثبيت و اعداد الشبكة -اعدادات متقدمة -<لا يوجد قيم> -حفظت التغييرات بنجاح... -هناك مشكلة في حفظ التغييرات -الخروج -الاعدادات -القائمة الرئيسية -العاب USB -العاب HDD -لعاب ETH -برامج -تيمات -لغات -سيتم ايقاف تشغيل النظام -Exit to Browser/OSDSYS? -الغاء التحديث ? -%d: لم يتم العثور على القرص الصلب -%d: القرص المضغوط غير منسق -%d: هناك مشكل في اعداد الشبكة -%d: لم يتم العثور على محول الشبكة -%d: لا يمكن التواصل مع خدمة SMB -%d: لا يمجن التسجيل في خدمة SMB -%d: لا يمكن فتح حصة SMB -%d: لا يمكن فتح قائمة حصص SMB -%d: لا يمكن فتح قائمة الالعاب -%d: السيرفر DHCP غير موجود -%d: لا يوجد اتصال في الشبكة -اشغال -ايقاف -تم -اختيار -الغاء -دائرة -ضرب -قائمة الالعاب -اعدادات اللعبة -حذف كل الاعدادات -تم حذف كل مفاتيح لللعبة -التمرير -ثقيل -متوسط -سريع -القائمة الافتراضية -شحن من القرص -يرجى الانتظار -هناك مشكل في شحن هوية اللعبة -الفرز الاوتوماتيكي -هناك مشكل في شحن ملف اللغات -تعطيل مصحح الالوان -لم يتم وجود على وحدة التحكم -تشغيل صورة اللعبة -شاشة واسعة -ايقاف -شحن الاعدادات -حفظ الاعدادات -تشغيل الجهاز -اعادة تنشيط -طريقة تشغيل الجهاز USB -طريقة تشغيل الجهاز HDD -طريقة تشغيل الجهاز ETH -طريقة تشغيل الجهاز البرامج -تلقائي -يدوي -تشغيل الخادم HDL -بداية تشغسل الخادم HDL ... -الخادم HDL في حالة تشغيل ... -لم يتم تشغسل الخادم HDL -تفريغ الخادم HDL ... -مكان IGR -لون الخلفية -لون الكتابة -- PS2 - -- السيرفر SMB - -نوع عنوان الي بي -ساكن -DHCP -عنوان الاي بي -العنوان -القناع -البوابة -السيرفرDNS -المحطة -الحصص -المستخدم -كلمة السر -<غير مضبوط> -نوع العنوان -اي بي -NetBIOS -قبول -سيتم حذفه نهائيا ةهل ستكمل? -تغيير الاسم -حذف -تشغيل -اعدادات العرض -تمكين عمليات الكتابة -تحقق اذا كانت اللعبة مجزئة -التذكير باخر لعبة -زر الاختيار -اللعبة مجزئة -غير ممكن تشغيل العنوان -قتجريب -ترك الفراغ لGUEST -قراءة دقيقة -الطريقة المتزامنة -حل Syscalls -تخطي فيديو -تقليد DVD-DL -الغاء IGR -High module storage -اخفاء بيانات DEV9 -تغيير الحجم يؤدي الى حذف ال VMC -صنع -بدء -تغيير -الغاء -إعادة تعيين -استخدام عام -اعداد VMC -الاسم -الحجم -الحالة -التقدم -ملف VMC موجود - ملف فاسد , حجمه غير صحيح -يجب صنع ملف VMC -هنالك مشكلة مع ال VMC %s, هل تريد الاكمال مع بطاقة الظاكرة الحقيقية ? (slot %d) ? -تحديث اوتوماتيكي -معلومات حول ... -المبرمجون -ضمان الجودة -مكان بادئة USB -Boots Custom ELF after an IGR -النسبة في الدقيقة, 0 للالغاء التدوير باستمرار -الدوران المستمر الاوتوماتيكي لل HDD -طريقة الفيديو -لون الكتابة -اللون المختار -عرض صفحة المعلومات -المعلومات -تخصيص ELF -اختيار الالوان -اعادة الاتصال -ترك الفراغ لادراج الملفات المقسمة -مكان بادئة ETH -الرجوع -فراغ -دخول -طريقة -فتحة VMC 1 -فتحة VMC 2 -هوية اللعبة -DMA طريقة -مزامنة اوتوماتيكية -طريقة 1 -طريقة 2 -طريقة 3 -طريقة 4 -طريقة 5 -طريقة 6 -طريقة 7 -طريقة 8 -اعداداتGSM -طريقة صلة الايثرنيت -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex -اعداداتGSM -تشغيل -تبديل GSM ON او OFF -وضع الفيديو -اجبار طريقة الشاشة المستبدلة -موضع افقي -تعديل افقي -موضع عمودي -تعديل عمودي -تخطي FMV -بتخطى FMV -اعدادات قائمة الغش -تشغيل PS2RD -تدع PS2RD لتصحيح الالعاب -PS2RD -اختيار اوتوماتيكي او اختيار قائمة الغش -اختيار اوتوماتيكي لقائمة الغش للالعاب -اختيار قائمة الغش للالعاب -هنك مشكلة في شحن ملف الغش -لا يوجد قائمة الغش لهذه اللعبة -تحميل الافتراضيات -التحديث عن طريق الشبكة -اعادة تحميل التسجيلات الموجودة ? -فشل التحديث -فشل في الاتصال بسيرفر التحديث -انتهى التحديث -الغي التحديث -تحميل الاعدادات من الانترنيت ? -اعدادات مغيرة -تحميل الافتراضيات -البدء%i الاوتوماتيكي في ثانية... -البدء الاوتوماتيكي -النسبة في الدقيقة, 0 للالغاء التدوير باستمرار -PS2 Logo -Only displayed for a valid disc logo which matches the console's region +# translation by alimadhi +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread +Arabic +Open PS2 Loader %s +حفظ التغييرات +خلف +تكوين الشبكة +خيارات متقدمة +<لايوجد قيم> +الإعدادات محفوظة +كتابة الاعدادات خطأ ! +خروج +الاعدادات +القائمة +ألعاب USB +ألعاب HDD +ألعاب ETH +تطبيقات +الموضوعه +اللغة +سوف يتوقف النضام. +؟(OSDSYS)خروج الى مستعرض +الغاء التحديث؟ +%d: لم يتم العثور على القرص الصلب +%d: القرص الصلب غير مهيأ +%d: خطأ في بدأ الشبكة +%d: لم يتم العثور على موديوم +%d: لا يمن الربط الى سيرف SMB +%d: لايمكن الدخول الى سيرف SMB +%d: ا يمكن فتح مشاركة SMB +%d: ايمكن مشاركة قائمة SMB +%d: لايمكن سدل قائمة الالعاب +%d: سيرفر تكوين المضيف الديناميكي غير متوفر +%d: لايوجد ربط بالشبكة +تشغيل +إيقاف +حسنا +اختيار +الغاء +دائرة +اكس +قائمة الالعاب +إعدادات اللعبة +إزالة كافة إعدادات +إزالة كافة مفاتيح اللعبة +التمرير +بطيء +متوسط +سريع +القائمة الافتراضية +تحميل من القرص +يرجى الانتظار +خطأ أثناء تحميل الايدي للعبة +تمرير تلقائي +خطأ في تحميل ملف اللغة +تعطيل تصحيح الألوان +لم يتم الكشف على وحدة تحكم ، انتظر ... +تمكين عرض اغلفة اللعبة +شاشة عريضة +إيقاف التشغيل +تحميل التكوين +حفظ التكوين +بدأ الجهاز +تحديث +USB الوضع الافتراضي +HDD الوضع الافتراضي +ETH الوضع الافتراضي + الوضع الافتراضي APPS +وضع عرض قائمة تشغيل التطبيقات +تلقائي +يدوي +بدأ خادم HDL +جاري بدأ سيرفر HDL +HDL جاري بتشغيل +فشل في بدا سيرفر HDL +الغاء تحميل خادم HDL +مسار IGR +لون الخلفية +لون النص +- PS2 - +- خادم SMB - +نوع عنوان IP +الحالة +تكوين المضيف الديناميكي +IP عنوان +عنوان +قناع +بوابة +DNS سيرفر +المنفذ +المشاركة +المستخدم +كلمة السر +<غير مضبوط> +نوع العنوان +IP +نت بايوس +قبول +سيتم حذف العنصر بشكل دائم ، متابعة ؟ +تسمية +حذف +تشغيل +اعدادات العرض +تمكين عمليات الكتابة +تحقق من تجزئة العاب USB +تذكر آخر لعبة تم اختيارها +اختر الزر +خطأ، اللعبة مجزئة +خطأ، لا يمكن تشغيل هذا البند +اختبار +ترك فارغة من اجل مصادقة الضيف. +قراءات دقيقة +وضع التزامن +Unhook Syscalls +0 وضع PSS +محاكي DVD-DL +تعطيل IGR +ارتفاع حدة التخزين +إخفاء حدة dev9 +تغير الحجم يؤدي الى إعادة تهيئة الـ VMC +انشاء +بدأ +تعديل +إحباط +إعادة تعيين +استخدام شامل +تكوين VMC +الاسم +الحجم +الحالة +التقدم +ملف سواقة وحدة التخزين موجود +ملف سواقة وحدة التخزين غير صالح، والحجم غير صحيح +يحتاج ملف سواقة وحدة التخزين الى الانشاء +خطاء في سواقة وحدة التخزين، استمرار اجباري مع الميموري كارد ؟ +التحديث التلقائي +حول +المبرمجون +ضمان الجودة +مسار بادئة USB +تشغيل تطبيق خاص بعد الترسيت من داخل اللعبة +القيمة في الدقيقة، صفر تعطيل هبوط الدوران +تلقائي هبوط دوران القرص الصلب +وضع الفيديو +لون الحوار +اللون المحدد +عرض معلومات الصحفة +معلومات +اختيار اللون +إعادة الاتصال +ترك فارغة الى قائمة المشاركة +مسار بادئة ETH +خلف +فراغ +دخول +الوضع +VMC فتحة 1 +VMC فتحة 2 +ايدي اللعبة +DMA الوضع +V -مزامنة +وضع 1 +وضع 2 +وضع 3 +وضع 4 +وضع 5 +وضع 6 +وضع 7 +وضع 8 +تكوين GSM +وضع وصلة ايرثلنك +100Mbit ثنائية الاتجاه +100Mbit نصف مزدوج +10Mbit ثنائية الاتجاه +10Mbit نصف مزدوج +إعدادات GSM +تمكين GSM +تبديل GSM تشغيل او إيقاف +VMODE +اجبار نوع مخصص للعرض +H-POS +تعديل افقي +V-POS +تعديل عامودي +FMV اجتياز +تخطي كامل لحركة الفيديو +اعدادات الغش +تمكين محرك الغش +يتيح محرك الغش من تصحيح الألعاب +وضع محرك الغش +تحديد تلقائي او اختر غش اللعبة +تحديد الغش تلقائي +اختر غش اللعبة +خطأ: فشل في تحميل ملف الغش +لم يتم العثور على الغش +تحميل افتراضي +تحديث الشبكة +إعادة تحميل السجلات الموجودة؟ +فشل التحديث. +فشل الاتصال لتحديث الخادم. +انتهى التحديث. +تم إلغاء التحديث. +تحميل الإعدادات من الشبكة؟ +إعدادات مخصصة +افتراضيات تحميلها +بدأ تلقائي في %i s... +تشغيل تلقائي +القيمة في الثانية (s)، صفر لتعطيل التشغيل التلقائي +PS2 Logo +Only displayed for a valid disc logo which matches the console's region +قائمة مشغلات ELF +مخصص ELF \ No newline at end of file diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 7f5e6f6e3..4e5f6465d 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,5 +1,7 @@ -# Bulgarian translation by wisi - @http://psx-scene.com/forums/members/wisi/ -# For Open PS2 Loader 0.9.3 Betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# translation by vsub and wisi +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Bulgarian Open PS2 Loader %s Запазване на промените @@ -19,7 +21,7 @@ ETH Игри Тема Език Изключване на системата? -Изход към Browser/OSDSYS? +Exit to Browser/OSDSYS? Отмяна на обновяването? %d: Твърд Диск не е свързан. %d: Твърд Диск не е форматиран. @@ -32,8 +34,8 @@ ETH Игри %d: Неуспешно изреждане на игрите %d: DHCP сървърът - недостъпен %d: Липсва мрежова връзка -Активирано -Изключено +On +Off ОК Избор Отмяна @@ -111,7 +113,7 @@ NetBIOS Прецизно четене Синхронен режим Откачане на OPL от Syscalls -Напред Видео +0 PSS режим Емулиране на DVD-DL Изключване на IGR Зареждане на модулите във висока памет @@ -137,14 +139,14 @@ VMC файлът трябва да бъде създаден. Програмисти: Качествен контрол от: USB поддиректория -Зареждане на ELF по избор при IGR +Boots Custom ELF after an IGR Стойност в минути, 0 за деактивиране Автоматично спиране на HDD след Видео режим Цвят на опциите Цвят на избран обект Страница с информация -Информация +Info Нестандартен ELF Избор на цвят Свързване @@ -159,14 +161,14 @@ VMC Слот 2 Game ID ДДП (DMA) режим Верт. Синхр. - | 1 - 2 - 3 - | 4 - 5 - 6 -Режими за съвместимост | 7 - 8 +режим 1 +режим 2 +режим 3 +режим 4 +режим 5 +режим 6 +режим 7 +режим 8 Настройки на GSM - избор на видеорежим в игра Скорост на мрежата и настройки за дуплекс 100 Mbit пълен дуплекс @@ -197,14 +199,16 @@ Cheats по избор Мрежово обновяване Повторно сваляне на наличните записи? Неуспешно обновяване. -Неуспешна връзка с сървъра. +Неуспешна връзка с сървъра. Failed to connect to update server. Обновяване завършено. Обновяване отменено. Сваляне на настройки от мрежата? -Потребителски настройки +Потребителски настройки Customized Settings Сваляне по подразбиране Авт.старт след %i Автостарт Стойност в секунди, 0 за деактивиране. -Показване на PS2 Logo -Активно само при валидно лого на диска, съвпадащо с региона на конзолата. +PS2 Logo +Only displayed for a valid disc logo which matches the console's region +ELF Loader Menu +ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index 357678793..040e821c9 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,5 +1,7 @@ -# Czech translation by jimmysmith -# For Open PS2 Loader 0.9.3+ betas (r907-r935) - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Translated by jimmysmith +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Czech Open PS2 Loader %s Uložit změny @@ -76,7 +78,7 @@ Vypínání HDL Serveru... Cesta k IGR Barva pozadí Barva textu -- PS2 - +- PS2 - - SMB Server - Typ IP adresy Statická @@ -111,7 +113,7 @@ Nechte prázdné pro přihlášení GUEST účtu Přesné čtení Synchronní mód Unhook Syscalls -Přeskočit videa +0 PSS mód Emulovat DVD-DL Vypnout IGR Vyšší adresa modulu @@ -207,4 +209,6 @@ Automatický start v %i s... Auto start Hodnota v sekundách, zadej 0 pro vypnutí auto startu PS2 Logo -Zobrazováno pouze u validního loga disku, který má stejný region jako konzole \ No newline at end of file +Only displayed for a valid disc logo which matches the console's region +ELF Loader Menu +ELF Loader Menu mód \ No newline at end of file diff --git a/lng/lang_English.lng b/lng/lang_English.lng index cbac578fa..bf97cb4c8 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -85,7 +85,7 @@ Refresh USB device start mode HDD device start mode ETH device start mode -Applications start mode +Applications menu display mode Auto Manual Start HDL Server @@ -228,3 +228,5 @@ Auto start Value in second(s), 0 to disable auto start PS2 Logo Only displayed for a valid disc logo which matches the console's region +ELF Loader Menu +ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index ccbcee06d..cecb9f8bb 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,10 +1,12 @@ -# Filipino translation by Ceed Lorenzo -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Translation by Ceed Lorenzo +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Filipino Open PS2 Loader %s I-save ang mga pagbabago Likod -Network config +Network Config Advanced options Save ang mga setting... @@ -23,7 +25,7 @@ Exit to Browser/OSDSYS? Cancel updating? %d: HardDisk Drive not detected %d: HardDisk Drive not formatted -%d: Network startup error +%d: Network startup error %d: No network adaptor detected %d: Hindi makakonekta sa SMB server %d: Hindi makapag-log in sa SMB server @@ -57,7 +59,7 @@ Huwag paganahin ang mga Kulay Debug Controller Walang natukoy na , naghihintay... Paganahin ang Cover Art Malapad na screen - +Power off Nilo-load ang config Sine-save ang config Simulan ang aparato @@ -111,11 +113,11 @@ Iwanang walang laman para sa Guest auth . Accurate Reads Synchronous Mode alisin sa pagkakakawit Syscalls -Skip Videos +0 PSS mode Emulate DVD-DL Disable IGR High module storage -Hide DEV9 module +Hide dev9 module Ang pagbabago ng laki ay i-reformat ang VMC Lumikha Start @@ -173,7 +175,7 @@ Ethernet bilis at duplex setting 100Mbit half-duplex 10Mbit full-duplex 10Mbit half-duplex -GSM Settings +GSM Mga Setting paganahin GSM Toggles GSM ON or OFF VMODE @@ -186,7 +188,7 @@ FMV Skip Skips Full Motion Videos Cheat Settings Enable PS2RD Cheat Engine -Let PS2RD Cheat Engine patch your games +Lets PS2RD Cheat Engine patch your games PS2RD Cheat Engine Mode Auto-select or Select game cheats Auto-select cheats @@ -208,3 +210,5 @@ Auto start Value in second(s), 0 to disable auto start PS2 Logo Only displayed for a valid disc logo which matches the console's region +ELF Loader Menu +ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_French.lng b/lng/lang_French.lng index a2e943b5d..f9aa7c261 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,164 +1,166 @@ -# French translation by ShaolinAssassin - @http://psx-scene.com/forums/members/shaolinassassin/ -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Translation by machiavel +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread French Open PS2 Loader %s Sauvegarder Retour -Configuration du réseau -Réglages avancés - -Configuration sauvegardée... -Erreur lors de la sauvegarde de la configuration -Quitter Open PS2 Loader -Configuration +Configuration réseau +Options avancées + +Options sauvegardées... +Erreur d'écriture des options! +Quitter +Options Menu -Périphérique USB -Disque dur interne -Serveur SMB +Jeux USB +Jeux HDD +Jeux ETH Apps Thème Langue -Le système va être éteint -Retour au navigateur PS2 / OSDSYS ? -Annuler le téléchargement ? -Erreur %d: disque dur non détecté -Erreur %d: disque dur non formaté -Erreur %d au démarrage du réseau -Erreur %d: adaptateur réseau non détecté -Erreur %d: connexion au serveur SMB impossible -Erreur %d: identification auprès du serveur SMB impossible -Erreur %d: ouverture du partage SMB impossible -Erreur %d: listing des partages SMB impossible à établir -Erreur %d: listing des jeux impossible à établir -Erreur %d: serveur DHCP indisponible -Erreur %d: connexion réseau inexistante +Le système va être éteint. +Quitter vers Menu/OSDSYS? +Annuler mise à jour? +%d: HDD non détecté +%d: HDD non formaté +%d: Erreur démarrage réseau +%d: adaptateur réseau non détecté +%d: Ne peut se connecter au serveur SMB +%d: Ne peut s'authentifier au serveur SMB +%d: Ne peut ouvrir le partage SMB +%d: Ne peut lister les partages SMB +%d: Ne peut lister les jeux +%d: Serveur DHCP indisponible +%d: Pas de connexion réseau On Off -Valider -Valider +OK +Select Annuler -O -X +Cercle +Croix Liste des jeux -Réglages -Supprimer tous les réglages -Réglages du jeu supprimés +Options du jeu +Effacer les options +Options du jeu supprimées Défilement Lent Moyen Rapide -Page au démarrage +Menu par défaut Charger depuis le disque Veuillez patienter Erreur lors du chargement de l'ID du jeu -Tri alphabétique +Tri automatique Erreur lors du chargement du fichier langue -Passer l'écran de debug -La manette PS2 a été déconnectée… -Fichiers ART +Désactiver couleurs de debug +Aucune manette détectée, attente... +Activer jaquette Écran large -Éteindre le système -Chargement... -Sauvegarde de la configuration +Éteindre +Chargement config +Sauvegarde config Démarrer le périphérique Rafraîchir -Démarrage du périphérique USB -Démarrage du disque dur interne -Démarrage du serveur SMB -Page apps -Automatique +Mode de démarrage USB +Mode de démarrage HDD +Mode de démarrage SMB +Mode d'affichage du menu des apps +Auto Manuel -Démarrer le serveur HDL -Serveur HDL en cours de démarrage... -Serveur HDL connecté… -Échec au démarrage du serveur HDL -Fermeture du serveur HDL… -Sortie via IGR vers : -Arrière-plan -Texte principal -- PS2 - +Démarrer serveur HDL +Démarrage serveur HDL... +Serveur HDL démarré... +Démarrage serveur HDL échoué +Déchargement serveur HDL... +Chemin IGR +Couleur de fond +Couleur du texte +- PS2 - - Serveur SMB - Type d'adresse IP Statique -Dynamique +DHCP Adresse IP Adresse -Masque de sous-réseau -Passerelle par défaut +Masque +Passerelle Serveur DNS Port -Nom du serveur SMB -Nom d'utilisateur +Partage +Utilisateur Mot de passe - + Type d'adresse IP NetBIOS -Valider -L'item sera définitivement supprimé, continuer ? +Accepter +L'objet sera définitivement supprimé, continuer ? Renommer -Suppr. +Supprimer Lancer -Configuration de l'affichage -Opérations d'écriture -Vérifier fragmentation (USB) -Dernier jeu joué -Touche de validation +Options d'affichage +Activer l'écriture +Vérifier fragmentation jeu USB +Souvenir dernier jeu joué +Bouton de sélection Erreur, le jeu est fragmenté -Erreur, impossible de lancer l'item -Tester les réglages -Laisser le champ vide pour s'identifier en tant qu'invité -Simuler la vitesse de lecture du CD/DVD -Mode de lecture alternatif (lecture synchrone) -Purger OPL après lancement du jeu -Passer les cinématiques -Émuler support double couche (DVD9 rippés en DVD5) -Désactiver l'IGR (incompatible avec certains jeux) -Charger les modules de stockage à une adresse plus élevée -Renommer le module DEV9 en CDVDMAN -Changer la taille de la VMC la formatera +Erreur, impossible de lancer l'objet +Tester +Laisser vide pour authentification invité +Lecture précise (simule la vitesse de lecture du CD/DVD) +Mode synchrone (mode de lecture alternatif) +Décrocher Syscalls (purge OPL après lancement du jeu) +Mode 0 PSS (Passe les cinématiques) +Émuler DVD-DL (DVD9 rippés en DVD5) +Désactiver IGR (incompatible avec certains jeux) +Stockage élevé (charge les modules de stockage à une adresse plus élevée) +Cacher module DEV9 (Renomme le module DEV9 en CDVDMAN) +Changer la taille reformatera la VMC Créer Démarrer Modifier Abandonner Réinitialiser VMC générique -Configurer la carte mém. virtuelle +Configurer la VMC Nom Taille État Progression -La carte mém. virtuelle existe déjà -Fichier carte mém. virtuelle non valide, taille incorrecte -La carte mém. virtuelle doit d'abord être créée -Erreur sur la carte mém. virtuelle %s. Continuer sur la carte mém. physique %d ? +Fichier VMC existant +Fichier VMC invalide, taille incorrecte +Fichier VMC doit d'abord être créé +Erreur sur VMC %s. Continuer sur MC physique %d ? Rafraîchissement automatique -Crédits -Développeurs -Béta-testeurs -Préfixe du chemin du périph. USB -Laisser le champ pour quitter OPL vers le navigateur PS2 +À propos +Codeurs +Assurance qualité +Préfixe du chemin USB +Lancer ELF perso après un IGR En minute(s), 0 pour désactiver l'arrêt automatique -Arrêt auto. disque dur interne +Arrêt auto. HDD Mode vidéo -Options -Sélection -Page d'informations +Couleur dialogue +Couleur sélectionné +Afficher page d'infos Infos. -ELF alternatif -Choix des couleurs de l'interface +ELF personnalisé +Sélection de la couleur Reconnecter -Laisser le champ pour lister les dossiers partagés -Préfixe du chemin du réseau +Laisser vide pour lister les partages +Préfixe du chemin ETH Effacer Espace -Valider -Maj/Min -Carte mém. virtuelle (VMC) 1 -Carte mém. virtuelle (VMC) 2 -ID +Entrer +Mode +Port VMC 1 +Port VMC 2 +ID jeu Vitesse de lecture (mode DMA) -Synchronisation verticale +Synchro verticale Mode 1 Mode 2 Mode 3 @@ -168,43 +170,45 @@ Mode 6 Mode 7 Mode 8 Configurer GSM -Vitesse Ethernet +Lien mode ETH 100Mbit full-duplex 100Mbit half-duplex 10Mbit full-duplex 10Mbit half-duplex -Configuration de GSM -GSM -Activer/Désactiver GSM -Mode vidéo à forcer -Modes vidéo disponibles : NTSC/PAL/60Hz/PS1/HDTV/VGA -Ajustement horizontal de l'écran -Ajouter/Soustraire -Ajustement vertical de l'écran -Ajouter/Soustraire -Avance rapide -Passer les vidéos au format FMV -Configuration de PS2RD -PS2RD -Activer/Désactiver PS2RD -Activation des codes +Options GSM +Activer GSM +Basculer On/Off GSM +VMODE +Mode d'affichage perso forcé +Pos. H +Ajustement horizontal +Pos. V +Ajustement vertical +Passer FMV +Passe les FMV +Options de cheat +Activer PS2RD +Laisser PS2RD patcher vos jeux +Mode PS2RD Automatique/Manuel Automatique Manuel (inactif, fonction à venir) -Échec du chargement du fichier de code .cht -Fichier de code .cht introuvable -Télécharger les régl. prédéfinis -Téléchargement des régl. prédéfinis -Mise à jour des données existantes -Échec du téléchargement -Impossible de se connecter au serveur -Téléchargement effectué avec succès -Téléchargement annulé -Télécharger les régl. prédéfinis depuis Internet ? -Réglages personnalisés -Réglages prédéfinis -Lancement automatique dans %s… -Lancement auto. -En seconde(s), 0 pour désactiver le lancement automatique +Erreur: Impossible de charger le fichier de cheat +Aucun cheat trouvé +Télécharger les régl. par défaut +Mise à jour réseau +Re-télécharger les données existantes? +Mise à jour échouée +Échec de connexion au serveur +Mise à jour terminée. +Mise à jour annulée. +Télécharger les options depuis le réseau? +Options personnalisées +Options par défaut téléchargées +Démarrage auto dans %i s... +Démarrage auto. +Valeur en seconde(s), 0 pour désactiver le démarrage auto Logo PS2 -S’affiche uniquement si le jeu et la console appartiennent à la même zone \ No newline at end of file +S'affiche uniquement si le logo du disque est compatible avec la région de votre console +Menu lanceur d'ELF +Mode d'affichage du menu lanceur d'ELF \ No newline at end of file diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 1951800a1..821b6f666 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,5 +1,7 @@ -# German translation by ps2guy -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# German Translation by ps2guy and lopotri +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread German Open PS2 Loader %s Änderungen speichern @@ -21,11 +23,11 @@ Sprache Das System wird ausgeschaltet. Verlassen und zum Browser/OSDSYS zurückkehren? Aktualisierung abbrechen? -%d: Festplatte wurde nicht gefunden -%d: Festplatte ist nicht formatiert +%d: Festplatte nicht erkannt +%d: Festplatte ist nicht formatiert %d: Fehler beim Starten des Netzwerks -%d: Netzwerkadapter nicht gefunden -%d: Keine Verbindung mit dem SMB Server möglich +%d: Netzwerkadapter nicht erkannt +%d: Keine verbindung zum SMB Server %d: Keine Anmeldung am SMB Server möglich %d: SMB Freigabe kann nicht geöffnet werden %d: SMB Freigaben können nicht aufgelistet werden @@ -42,7 +44,7 @@ Kreuz Spieleliste Spieleinst. Entferne alle Einstellungen -Entferne alle keys für das Spiel +Alle keys für das Spiel wurden entfernt Scrollen Langsam Mittel @@ -54,18 +56,18 @@ Fehler beim Laden der Spiel-ID Automatische Sortierung Fehler beim Laden der Sprachdatei Deaktiviere Debugfarben -Kein Controller erkannt, warten... +Kein Controller erkannt, warte... Aktiviere Cover Bilder Breitbild Ausschalten Lade Konfiguration Speichere Konfiguration -Gerät starten +Peripherie starten Aktual. -USB-Gerät Start Modus -HDD-Gerät Start Modus -ETH-Gerät Start Modus -Anwendung Start Modus +USB Start Modus +HDD Start Modus +ETH Start Modus +Anwendungen Menü Anzeigen Automatisch Manuell Starte HDL Server @@ -76,8 +78,8 @@ HDL Server entlädt... IGR-Pfad Hintergrundfarbe Textfarbe -- PS2 - -SMB Server - +- PS2 - +- SMB Server - IP-Adresstyp Statisch DHCP @@ -87,7 +89,7 @@ Netzmaske Gateway DNS Server Port -Freigeben +Freigabe Benutzername Passwort @@ -100,10 +102,10 @@ Umbenennen Löschen Ausführen Bildschirmeinstellungen -Aktiviere Schreiborperationen -Überprüfe USB Spielefragmentierung -Erinnere an zuletzt gespieltes Spiel -Auswählen button +Aktiviere Schreiboptionen +Prüfe USB Spielefragmentierung +Merke zuletzt gespieltes Spiel +Auswahltaste Fehler, das Spiel ist fragmentiert Fehler, Objekt kann nicht ausgeführt werden Test @@ -111,25 +113,25 @@ Leer lassen für Anmeldung als GAST Korrekte Lesegeschw Synchronmodus Systemaufrufe aushängen -Videos überspringen +0 PSS Modus Emuliere DVD-DL Deaktiviere IGR -Speichermodul -Verstecke dev9 Modul -Die Änderung der Größe wird die VMC erneut formatieren. +Erhöhte Speichermoduladresse +Verstecke DEV9 Modul +Ändern der Größe wird die VMC erneut formatieren! Erstellen Starten -Modifizieren +Bearbeiten Abbrechen -Neu starten -Nutze allgemeinen +Zurücksetzen +Benutze generierten Konfiguriere VMC Name Größe Status Fortschritt -VMC Datei existiert -Ungültige VMC Datei, Größe ist nicht korrekt +VMC-Datei existiert +Ungültige VMC-Datei, Größe ist nicht korrekt VMC-Datei muss erstellt werden Fehler mit VMC %s, fahre fort mit phys. MC (Steckplatz %d)? Automatisch aktualisieren @@ -137,18 +139,18 @@ Automatisch aktualisieren Programmierer Qualitätssicherung USB Präfix Pfad -Startet eine Custom ELF nach einem IGR +Startet benutzerdef. ELF nach einem IGR Wert in Minuten, 0 um Abschaltung der Festplatte zu deaktivieren -Automatische Abschaltung der Festplatte +Autom. Abschaltung der Festplatte Videomodus Dialogfarbe -Ausgewählte Farbe +Auswahlfarbe Infoseite anzeigen Info Benutzerdefinierte ELF Farbauswahl Verbindung wiederherstellen -Leerlassen um Freigaben aufzulisten +Leer lassen um Freigaben aufzulisten ETH Präfix Pfad Rücktaste Leertaste @@ -168,28 +170,28 @@ Modus 6 Modus 7 Modus 8 GSM konfigurieren -Ethernet-Geschwindigkeitsmodus +ETH Geschwindigkeitsmodus 100Mbit full-duplex 100Mbit half-duplex 10Mbit full-duplex 10Mbit half-duplex GSM Einstellungen Aktiviere GSM -Schalte GSM AN oder AUS +Schaltet GSM AN oder AUS VMODE Erzwungener benutzerdefinierter Bildschirmmodus H-POS -Horizontale Einstellung +Horizontale Justierung V-POS -Vertikale Einstellung +Vertikale Justierung Videosequenzen (FMV) überspringen Überspringe Full Motion Videos Cheat Einstellungen Aktiviere PS2RD Cheat Engine -PS2RD Cheat Engine deine Spiele patchen lassen +PS2RD Cheat Engine Spiele patcher PS2RD Cheat Engine Modus Automatisch auswählen lassen oder Spielecheats auswählen -Automatisch Cheats auswählen +Autom. Auswahl der Cheats Wähle Spielecheats Fehler: Laden des Cheat-File fehlgeschlagen Keine Cheats gefunden @@ -200,11 +202,13 @@ Aktualisierung fehlgeschlagen. Verbindung zum Updateserver fehlgeschlagen. Aktualisierung abgeschlossen. Aktualisierung abgebrochen. -Einstellungen übers Netzwerk laden? +Einstellungen übers Netzwerk herunterladen? Benutzerdefinierte Einstellungen Standardeinstellungen heruntergeladen Automatischer Start in %i s... Automatischer Start -Wert in Sekunden (sek), 0 zum Deaktivieren +Wert in Sekunden (sek), 0 um Auto-start zu deaktivieren PS2 Logo Wird nur bei gültigem Disc Logo angezeigt, welches mit der Region der Konsole übereinstimmen muss +ELF-starter Menü +ELF-starter Menü Anzeigen \ No newline at end of file diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 346199730..b2e492b98 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,5 +1,7 @@ -#Greek translation by RivalK93 -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Greek Translation by RivalK93 +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Greek Open PS2 Loader %s Αποθήκευση αλλαγών @@ -19,8 +21,8 @@ Open PS2 Loader %s Θέμα Γλώσσα Το σύστημα θα απενεργοποιηθεί. -Έξοδος στο Browser/OSDSYS; -Ακύρωση ενημέρωσης; +Έξοδος στο Browser/OSDSYS +Ακύρωση ενημέρωσης %d: Δεν εντοπίστηκε Σκληρός Δίσκος. %d: Ο Σκληρός Δίσκος δεν έχει διαμορφωθεί. %d: Σφάλμα εκκίνησης Δικτύου. @@ -68,7 +70,7 @@ Widescreen Εμφάνιση μενού Εφαρμογών Αυτόματα Χειροκίνητα -Εκκίνηση HDL Server +Εκκίνηση HDL Server Γίνεται εκκίνηση HDL Server... Λειτουγία HDL Server... Αποτυχία εκκίνησης HDL Server. @@ -95,7 +97,7 @@ Port IP NetBIOS Αποδοχή -Το αρχείο θα διαγραφεί οριστικά, συνέχεια; +Το αρχείο θα διαγραφεί οριστικά, συνέχεια Μετ/σία Διαγρ. Εκκίνηση @@ -111,7 +113,7 @@ NetBIOS Ακριβής ανάγνωση Συγχρονισμένη λειτουργία Αποκοπή Syscalls -Μετάβαση Βίντεο +Λειτουργία 0 PSS Εξομοίωση DVD-DL Απενεργοποίηση IGR Μονάδα μνήμης @@ -131,7 +133,7 @@ VMC γενικής χρήσης Το αρχείο VMC υπάρχει ήδη Μη έγκυρο αρχείο VMC, το μέγεθος είναι λάθος Πρέπει να δημιουργηθεί αρχείο VMC -Σφάλμα VMC %s, συνέχεια με την κανονική MC (Κάρτα Μνήμης %d) ; +Σφάλμα VMC %s, συνέχεια με την κανονική MC (Κάρτα Μνήμης %d) Αυτόματη ανανέωση Σχετικά Προγραμματιστές @@ -195,16 +197,18 @@ Patchάρισμα των παιχνιδιών από το PS2RD Δε βρέθηκαν cheats Λήψη προεπιλεγμένων Ενημέρωση δικτύου -Εκ νέου λήψη υπαρχόντων αρχείων; +Εκ νέου λήψη υπαρχόντων αρχείων Η ενημέρωση απέτυχε. Αποτυχία σύνδεσης σε Server ενημέρωσης. Η ενημέρωση ολοκληρώθηκε. Η ενημέρωση ακυρώθηκε. -Λήψη ρυθμίσεων από το δίκτυο; +Λήψη ρυθμίσεων από το δίκτυο Προσαρμοσμένες ρυθμίσεις Έγινε λήψη των προεπιλεγμένων -Αυτόματη εκκίνηση σε %i"... +Αυτόματη εκκίνηση σε %i "... Αυτόματη εκκίνηση Τιμή σε δευτερόλεπτα, 0 για μη αυτόματη εκκίνηση PS2 Logo Only displayed for a valid disc logo which matches the console's region +Μενού ELF Loader +Εμφάνιση μενού ELF Loader \ No newline at end of file diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 0467a6087..dc8a06b22 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,5 +1,7 @@ -# Indonesian translation by verislasher -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# translated by verislasher +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Indonesian Open PS2 Loader %s Simpan Perubahan @@ -76,7 +78,7 @@ Mengembalikan Server HDL... Pintasan IGR Warna latar belakang Warna teks -- PS2 - +- PS2 - - SMB Server - Jenis alamat IP Statis @@ -111,7 +113,7 @@ Tinggalkan kosong untuk Otent TAMU. Membaca akurat Mode Sinkronisasi Melepas kaitan syscalls -Loncat Video +Mode PSS 0 Emulasi DVD-DL Nonaktifkan IGR Mode Penyimpanan Tinggi @@ -208,3 +210,5 @@ Mulai otomatis Nilai dalam detik, 0 mencegah mulai otomatis Logo PS2 Hanya ditampilkan untuk logo disc yang valid yang cocok dengan region konsol +Menu peluncur ELF +Mode Tampilan Menu Pemuat ELF \ No newline at end of file diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index 0164aa433..dd08fba8c 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,5 +1,7 @@ -# Italian translation by jauffreblades - @http://psx-scene.com/forums/members/jauffreblades/ -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Translation by jauffre and andre95d +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Italian Open PS2 Loader %s Salva modifiche @@ -76,7 +78,7 @@ Server HDL in scaricamento dalla memoria... Esci su Colore di sfondo Colore testo -- PS2 - +- PS2 - - Server SMB - Tipo di indirizzo IP Statico @@ -111,7 +113,7 @@ Lasciare vuoto per autenticazione GUEST Lettura accurata Modo sincrono Unhook dalle syscalls -Skip Video +Modo 0 PSS Disabilita DVD-DL Disabilita IGR Moduli nell'area alta di memoria @@ -206,5 +208,7 @@ Impostazioni di default scaricate Avvio automatico in %i s... Avvio automatico Valore in secondi, 0 per disabilitare l'avvio automatico -Logo PS2 +PS2 Logo Mostrato soltanto con un logo del disco valido e compatibile con la regione della console +Menu ELF Loader +Caricamento menu ELF Loader \ No newline at end of file diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 29828f8ff..b81f79a04 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,210 +1,214 @@ -# Korean translation by ddinghoya -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ -Korean -Open PS2 Loader %s -저장 변경 -뒤로 -네트워크 구성 -고급 옵션 -<값 없음> -설정 저장… -설정 기록 중 에러! -종료 -설정 -메뉴 -USB 게임 -HDD 게임 -ETH 게임 -응용프로그램 -테마 -언어 -시스템 전원이 꺼집니다. -Browser/OSDSYS 종료합니까? -업데이트 취소합니까? -%d: HDD를 검색할 수 없습니다 -%d: HDD가 포맷되지 않았습니다 -%d: 네트워크 시작 에러 -%d: 네트워크 아답터 감지 안됩니다 -%d: SMB 서버에 접속할 수 없습니다 -%d: SMB 서버에 로그인할 수 없습니다 -%d: SMB 공유를 열 수 없습니다 -%d: SMB 공유 목록을 나열할 수 없습니다 -%d: 게임 목록을 나열 할 수 없습니다 -%d: DHCP 서버가 존재하지 않습니다 -%d: 네트워크에 접속할 수 없습니다 -켜기 -끄기 -확인 -선택 -취소 -O -X -게임 목록 -게임 설정 -모든 설정 제거 -설정된 게임 키 제거 -스크롤 속도 -느림 -보통 -빠름 -기본 메뉴 -디스크 읽기 -기다리세요 -게임 ID 불러오는 중 오류 -자동 정렬 -언어 파일 불러오는 중 오류 -디버그 색상 비활성 -컨트롤러가 없습니다. 대기 중… -표지 보기 -와이드 화면 -전원 끄기 -불러오기 설정 -저장 설정 -장치 시작 -새로 고침 -USB 장치 시작 모드 -HDD 장치 시작 모드 -ETH 장치 시작 모드 -응용프로그램 시작 모드 -자동 -수동 -HDL 서버 시작 -HDL 서버 시작 중… -HDL 서버 가동 중… -HDL 서버 시작 실패 -HDL 서버 업로딩 중… -IGR 경로 -배경 색상 -문자 색상 -- PS2 - -- SMB 서버 - -IP 주소 형식 -Static -DHCP -IP 주소 -주소 -마스크 -게이트웨이 -DNS 서버 -포트 -공유 -유저 -비밀번호 -<설정 안됨> -주소 형식 -IP -NetBIOS -허용 -항목은 영구적으로 삭제됩니다, 계속합니까? -이름변경 -삭제 -실행 -디스플레이 설정 -쓰기 작업 활성 -USB 게임 손상 검사 -마지막에 실행한 게임 기억 -버튼 선택 -오류, 게임이 손상 되었습니다. -오류, 항목을 실행할 수 없습니다 -테스트 -게스트 권한을 위해 지움 -정밀하게 읽음 -동기화 모드 -시스템 호출 해제 -동영상 건너 뛰기 -DV-DL 에뮬레이트 -IGR 비활성 -고성능 모듈 스토리지 -DEV9 모듈 숨기기 -크기 변경 시 VMC 재포멧 됩니다. -생성 -시작 -수정 -포기 -재설정 -일반적 사용 -VMC 구성 -이름 -크기 -현황 -진행 -VMC 파일 존재 -잘못된 VMC 파일, 크기가 다릅니다. -VMC 파일이 생성되야 합니다. -VMC %s 에러, 메모리카드(슬롯 %d)에서 계속합니까? -자동 새로 고침 -오픈 PS2 로더에 관하여 -개발자 -품질 보증 -USB prefix 경로 -IGR 후 사용자 정의 ELF 부팅 -분 입력, 회전 멈추지 않으려면 0으로 설정 -자동 HDD 회전 멈춤 -비디오 모드 -대화상자 색상 -선택한 색상 -정보 페이지 표시 -정보 -사용자 정의 ELF -색상 선택 -재접속 -목록 공유를 위해 지움 -ETH prefix 경로 -백스페이스 -스페이스 -입력 -모드 -VMC 슬롯 1 -VMC 슬롯 2 -게임 ID -DMA 모드 -V-Sync -모드 1 -모드 2 -모드 3 -모드 4 -모드 5 -모드 6 -모드 7 -모드 8 -GSM 구성 -이더넷 링크 모드 -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex -GSM 설정 -GSM 활성 -GSM 켜기 또는 끄기 -VMODE -강제 사용자 지정 디스플레이 모드 -H-POS -수평 조정 -V-POS -수직 조정 -FMV 건너뛰기 -풀 모션 비디오 건너뛰기 -치트 설정 -PS2RD 치트 엔진 활성 -PS2RD 치트 엔진 패치 적용 -PS2RD 치트 엔진 모드 -게임 치트 자동 선택 또는 선택 -치트 자동 선택 -게임 치트 선택 -오류: 치트 파일 불러오기 실패 -치트를 찾을 수 없음 -다운로드 기본값 -네트워크 업데이트 -기존 데이터에서 다시 다운로드 합니까? -업데이트 실패. -업데이트 서버에 연결 실패. -업데이트 완료. -업데이트 취소. -네트워크에서 설정을 다운로드 합니까? -사용자 정의 설정 -다운로드 받은 기본값 -%i 자동 시작… -자동 시작 -초 입력, 자동 시작하지 않으려면 0으로 설정 -PS2 로고 -콘솔의 지역과 일치하는 유효한 디스크 로고만 표시 +# Translated by DDinghoya +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread +Korean +Open PS2 Loader %s +저장 변경 +뒤로 +네트워크 구성 +고급 옵션 +<값 없음> +설정 저장… +설정 기록 중 에러! +종료 +설정 +메뉴 +USB 게임 +HDD 게임 +ETH 게임 +응용프로그램 +테마 +언어 +시스템 전원이 꺼집니다. +Browser/OSDSYS 종료합니까? +업데이트 취소합니까? +%d: HDD를 검색할 수 없습니다 +%d: HDD가 포맷되지 않았습니다 +%d: 네트워크 시작 에러 +%d: 네트워크 아답터 감지 안됩니다 +%d: SMB 서버에 접속할 수 없습니다 +%d: SMB 서버에 로그인할 수 없습니다 +%d: SMB 공유를 열 수 없습니다 +%d: SMB 공유 목록을 나열할 수 없습니다 +%d: 게임 목록을 나열 할 수 없습니다 +%d: DHCP 서버가 존재하지 않습니다 +%d: 네트워크에 접속할 수 없습니다 +켜기 +끄기 +확인 +선택 +취소 +O +X +게임 목록 +게임 설정 +모든 설정 제거 +설정된 게임 키 제거 +스크롤 속도 +느림 +보통 +빠름 +기본 메뉴 +디스크 읽기 +기다리세요 +게임 ID 불러오는 중 오류 +자동 정렬 +언어 파일 불러오는 중 오류 +디버그 색상 비활성 +컨트롤러가 없습니다. 대기 중… +표지 보기 +와이드 화면 +전원 끄기 +불러오기 설정 +저장 설정 +장치 시작 +새로 고침 +USB 장치 시작 모드 +HDD 장치 시작 모드 +ETH 장치 시작 모드 +응용프로그램 시작 모드 +자동 +수동 +HDL 서버 시작 +HDL 서버 시작 중… +HDL 서버 가동 중… +HDL 서버 시작 실패 +HDL 서버 업로딩 중… +IGR 경로 +배경 색상 +문자 색상 +- PS2 - +- SMB 서버 - +IP 주소 형식 +Static +DHCP +IP 주소 +주소 +마스크 +게이트웨이 +DNS 서버 +포트 +공유 +유저 +비밀번호 +<설정 안됨> +주소 형식 +IP +NetBIOS +허용 +항목은 영구적으로 삭제됩니다, 계속합니까? +이름변경 +삭제 +실행 +디스플레이 설정 +쓰기 작업 활성 +USB 게임 손상 검사 +마지막에 실행한 게임 기억 +버튼 선택 +오류, 게임이 손상 되었습니다. +오류, 항목을 실행할 수 없습니다 +테스트 +게스트 권한을 위해 지움 +정밀하게 읽음 +동기화 모드 +시스템 호출 해제 +0 PSS 모드 +DV-DL 에뮬레이트 +IGR 비활성 +고성능 모듈 스토리지 +DEV9 모듈 숨기기 +크기 변경 시 VMC 재포멧 됩니다. +생성 +시작 +수정 +포기 +재설정 +일반적 사용 +VMC 구성 +이름 +크기 +현황 +진행 +VMC 파일 존재 +잘못된 VMC 파일, 크기가 다릅니다. +VMC 파일이 생성되야 합니다. +VMC %s 에러, 메모리카드(슬롯 %d)에서 계속합니까? +자동 새로 고침 +오픈 PS2 로더에 관하여 +개발자 +품질 보증 +USB prefix 경로 +IGR 후 사용자 정의 ELF 부팅 +분 입력, 회전 멈추지 않으려면 0으로 설정 +자동 HDD 회전 멈춤 +비디오 모드 +대화상자 색상 +선택한 색상 +정보 페이지 표시 +정보 +사용자 정의 ELF +색상 선택 +재접속 +목록 공유를 위해 지움 +ETH prefix 경로 +백스페이스 +스페이스 +입력 +모드 +VMC 슬롯 1 +VMC 슬롯 2 +게임 ID +DMA 모드 +V-Sync +모드 1 +모드 2 +모드 3 +모드 4 +모드 5 +모드 6 +모드 7 +모드 8 +GSM 구성 +이더넷 링크 모드 +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex +GSM 설정 +GSM 활성 +GSM 켜기 또는 끄기 +VMODE +강제 사용자 지정 디스플레이 모드 +H-POS +수평 조정 +V-POS +수직 조정 +FMV 건너뛰기 +풀 모션 비디오 건너뛰기 +치트 설정 +PS2RD 치트 엔진 활성 +PS2RD 치트 엔진 패치 적용 +PS2RD 치트 엔진 모드 +게임 치트 자동 선택 또는 선택 +치트 자동 선택 +게임 치트 선택 +오류: 치트 파일 불러오기 실패 +치트를 찾을 수 없음 +다운로드 기본값 +네트워크 업데이트 +기존 데이터에서 다시 다운로드 합니까? +업데이트 실패. +업데이트 서버에 연결 실패. +업데이트 완료. +업데이트 취소. +네트워크에서 설정을 다운로드 합니까? +사용자 정의 설정 +다운로드 받은 기본값 +%i 자동 시작… +자동 시작 +초 입력, 자동 시작하지 않으려면 0으로 설정 +PS2 로고 +콘솔의 지역과 일치하는 유효한 디스크 로고만 표시 +ELF 로더 메뉴 +ELF 로더 메뉴 디스플레이 모드 \ No newline at end of file diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index e285dcf6c..60b782b6e 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,5 +1,7 @@ -# Laotian translation by blackbutterfly (Anousith Phompida ) -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Translation by Anousith Phompida (aka: blackbutterfly) +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Laotian Open PS2 Loader %s ບັນທຶກການປ່ຽນແປງ @@ -111,7 +113,7 @@ NetBIOS ອ່ານແບບຖືກຕ້ອງແມ່ນຍຳ ວິທີການອ່ານຂໍ້ມູນທີ່ມີທາງເລືອກ Unhook Syscalls -ຂ້າມວິດີໂອ +0 PSS mode ປະມວນຜົນ DVD-DL Disable IGR High module storage @@ -208,3 +210,5 @@ V-POS ຕັ້ງຄ່າຫົວໜ່ວຍ ວິນາທີ, ໃສ່ 0 ເພື່ອປິດການເປີດໃຊ້ແບບໂອໂຕ PS2 Logo ຈະຖືກສະແດງຜົນ ກໍຕໍ່ເມື່ອໂລໂກ້ຂອງແຜ່ນຖືກຕ້ອງ ແລະ ສອດຄ່ອງຕາມໂຊນຂອງເຄື່ອງ +ເມນູສຳລັບຈັດການ ELF +ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index 1dc66d33b..b971e9e93 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,5 +1,7 @@ -# Polish translation by dragolice @http://psx-scene.com/forums/members/dragolice/ -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Translation by yohokaru +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Polish Open PS2 Loader %s Zapisz zmiany @@ -32,8 +34,8 @@ Przerwać aktualizację? %d: Nie można wyświetlić gier %d: Serwer DHCP niedostępny %d: Brak połączenia sieciowego -Włącz -Wyłącz +na +od OK Wybierz Anuluj @@ -111,7 +113,7 @@ Pozostaw puste dla gości. Dokładny odczyt Tryb synchroniczny Odhookuj Syscalls -Przejdź filmy +Tryb 0 PSS Emuluj DVD-DL Wyłącz IGR Moduł dużej pamięci @@ -144,7 +146,7 @@ Tryb wideo Kolor ustawień Kolor zaznaczenia Wyświetl stronę informacji -Informacje +Info Niestandardowy ELF Wybór koloru Połącz ponownie @@ -206,5 +208,7 @@ Pobrano domyślne Auto start w %i s... Auto start Wartość w sekundach, 0 wyłącza auto start -PS2 Logo -Only displayed for a valid disc logo which matches the console's region +Logo PS2 +Pokaże się tylko jeśli region gry jest zgodny z regionem posiadanej konsoli. +ELF Loader Menu +ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index d5f46c692..37c711a2e 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,5 +1,7 @@ -# Portuguese translation by danielb -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Translation by danielb +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Portuguese Open PS2 Loader %s Salvar alterações @@ -13,7 +15,7 @@ Sair Configurações Menu Jogos por USB -Jogos por HDD +Jogos por HDD Jogos por Rede Aplicações Temas @@ -23,9 +25,9 @@ Sair p/ o Browser/OSDSYS? Cancelar atualização? %d: Disco Rigido não detetado %d: Disco Rigido não formatado -%d: Erro ao iniciar rede +%d: Erro ao iniciar rede %d: Adaptador de Rede não detetado -%d: Não foi possível ligar ao servidor SMB +%d: Não foi possível ligar ao servidor SMB %d: Não foi possível efetuar login no servidor SMB %d: Não foi possível abrir a partilha SMB %d: Impossivel listar partilhas SMB @@ -55,7 +57,7 @@ Ordenar automaticamente Erro ao carregar ficheiro de idioma Desativar depuração de cores Comando não detectado, esperando... -Ativar Arte de Capas +Ativar Arte de Capas Ecrâ Panorâmico Desligar PS2 Carregando configurações @@ -111,7 +113,7 @@ Deixar vazio para ligar como convidado (GUEST) Carregar núcleo alternativo Modo Síncrono Desativar chamadas do sistema -Saltar videos +Saltar videos PSS Emular DVD-DL Desativar IGR Armazenamento elevado do módulo @@ -131,7 +133,7 @@ Progresso Arquivo VMC já existe Arquivo VMC inválido, o tamanho está incorreto Arquivo VMC precisa ser criado! -Erro com o ficheiro VMC, continuar com MC físico? +Erro com o ficheiro VMC %s, continuar com MC físico (slot %d) ? Atualização automática Créditos Desenvolvedores @@ -143,7 +145,7 @@ Desligamento automático do HDD Modo de vídeo Cor do diálogo Cor selecionada -Mostrar Página de Informação +Mostrar Página de Informação Info ELF personalizado Seleção de Cor @@ -158,7 +160,7 @@ VMC Slot 1 VMC Slot 2 ID do Jogo Modo DMA -Sincronização do vídeo +Sincronização do vídeo Modo 1 Modo 2 Modo 3 @@ -208,3 +210,5 @@ Auto iniciar Valor em segundos, 0 para desativar Logo PS2 Apenas é exibido para um disco válido e que seja da mesma região da consola +Menu do Iniciador ELF +Modo de exibição do iniciador de ELF \ No newline at end of file diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index ad20b4c04..0391d17c7 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,80 +1,82 @@ -# Portuguese_Brazil translation by gledson999. http://gledson999.blogspot.com.br/ -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ -Portuguese Brazil +# Translation by Colossus and tonyhoro +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread +Brazilian Portuguese Open PS2 Loader %s -Salvar mudanças +Guardar Configurações Voltar -Configurações de rede +Configurações de Rede Opções avançadas -Configurações salvas... -Erro ao salvar as configurações! +Configurações Guardadas +Erro ao guardar configurações! Sair -Configurações +Configurações Gerais Menu -Jogos no USB +Jogos em USB Jogos no HDD -Jogos em ETH +Jogos na Rede Aplicativos -Temas +Tema Idioma -O sistema será desligado. -Sair para o Navegador/OSDSYS? -Cancelar as atualizações? +O sistema será desligado +Sair para o Navegador do PS2/OSDSYS? +Cancelar atualizações? %d: O Disco Rígido não foi detectado %d: O Disco Rígido não está formatado -%d: Erro ao iniciar a rede +%d: Erro ao iniciar rede %d: Nenhum adaptador de rede foi detectado -%d: Não foi possível conectar com o servidor SMB -%d: Não foi possível entrar no servidor SMB -%d: Não foi possível abrir o compartilhamento no SMB -%d: Não foi possível listar o compartilhamento no SMB -%d: Não foi possível listar os jogos -%d: O servidor DHCP está indisponível -%d: Nenhuma conexão de rede -ON -OFF -Ok -Ok +%d: Não foi possível conectar ao servidor SMB +%d: Não foi possível logar no servidor SMB +%d: Não foi possível abrir o compartilhamento SMB +%d: Impossível listar compartilhamentos SMB +%d: Impossível listar jogos +%d: Servidor DHCP indisponível +%d: Sem conexão de rede +Ativ. +Desativ. +Confirmar +Eleger Cancelar O X Lista de Jogos Configurar -Remover todas as configurações -Todas as configurações dos jogos foram removidas -Rolagem +Apagar configurações +As configurações do jogo foram apagadas +Velocidade de rolagem Lenta Média Rápida Menu padrão Carregar do disco -Por favor aguarde -Erro ao carregar o ID do jogo +Por favor espere +Erro ao carregar ID do jogo Organizar em ordem alfabética -Erro ao carregar os arquivos de idioma +Erro ao carregar arquivo de idioma Desativar cores de depuração -Nenhum controle detectado, aguardando... -Habilitar as artes da Capa -Tela panorâmica -Desligar o PS2 -Carregando configurações -Salvando configurações... +Nenhum controle detectado, esperando... +Habilitar Artes de Capa +Tela Panorâmica +Desligar PS2 +Carregando configurações... +Guardando configurações... Iniciar dispositivo Atualizar -Modo de inicio no USB -Modo de inicio no HDD -Modo de inicio no ETH -Modo de inicio nos Aplicativos +Modo de inicio do USB +Modo de inicio do HDD +Modo de inicio da Rede +Modo de inicio de Aplicativos Automático Manual -Iniciar o Servidor HDL -O servidor HDL está iniciando... -O servidor HDL está sendo executado... -Falha ao iniciar o servidor HDL. -O servidor HDL está sendo encerrado... -Caminho de saída do IGR -Cor do fundo +Iniciar Servidor HDL +O Servidor HDL está sendo iniciado... +O Servidor HDL está sendo executado... +Falha ao iniciar Servidor HDL +O Servidor HDL está sendo encerrado... +Definir saída do IGR +Cor de fundo Cor do texto - PS2 - - Servidor SMB - @@ -90,75 +92,75 @@ Porta Compartilhamento Usuário Senha - + Tipo de Endereço IP NetBIOS -Aceitar -O item será apagado permanentemente, continuar? +Confirmar +O item será apagado permanentemente! Continuar? Renomear Apagar Iniciar -Configurações de tela -Ativar opções de escritas -Verificar fragmentação no USB -Lembrar do último jogo jogado -Botão de seleção +Configurações de Tela +Ativar funções Apagar e Renomear +Verificar fragmentação de jogos em USB +Lembrar último jogo jogado +Botão de Seleção Erro, o jogo está fragmentado -Erro, o item não pode ser iniciado +Erro, não foi possível iniciar o item Testar -Deixe em branco para não usar senhas. -Leituras corretas +Deixar vazio para conectar como convidado (GUEST) +Leituras mais precisas Modo de Sincronia Desativar chamadas do sistema -Pular videos +Pular vídeos PSS Emular DVD-DL -Desativa o IGR -Armazenamento dos módulos elevados -Esconder módulo dev9 -Mudando de tamanho, formatará o VMC +Desativar IGR +Armazenamento elevado dos módulos +Esconder módulo DEV9 +Escolha o tamanho do VMC, caso já exista, alterar o tamanho irá reformatá-lo Criar Iniciar Modificar -Abortar -Reiniciar -Usa o genérico -Configure o VMC +Cancelar +Resetar +Usar genérico +Configurar VMC Nome Tamanho -Estatísticas +Estado Progresso -O arquivo do VMC já existe +Arquivo VMC já existe Arquivo VMC inválido, o tamanho está incorreto -O arquivo do VMC precisa ser criado -Error com o VMC %s, continuar com o MC físico (slot %d) ? +Arquivo VMC precisa ser criado +Erro com o VMC %s, continuar com Memory Card físico (slot %d) ? Atualização automática -Créditos +Sobre Desenvolvedores Controle de Qualidade -Prefixo do caminho USB -Inicia um ELF preferencial após um IGR +Prefixo de caminho USB +Iniciar ELF Personalizado depois do IGR Valor em minuto(s), 0 para desativar Desligamento automático do HDD -Modo de vídeo +Modo de Vídeo Cor do diálogo Cor selecionada Mostrar Página de Informação -Info. -ELF modificado +Info +ELF personalizado Seleção de Cor Reconectar Deixar vazio para listar compartilhamentos -Prefixo de caminho ETH +Prefixo de caminho de Rede Apagar Espaço -Enter +Confirmar Modo VMC Slot 1 VMC Slot 2 ID do Jogo -Modo de DMA -Sincronização do vídeo +Modo DMA +Sincronização Vertical Modo 1 Modo 2 Modo 3 @@ -168,43 +170,45 @@ Modo 6 Modo 7 Modo 8 Configurar GSM -Modo de link da Internet -100Mbit duplex-integral -100Mbit semi-duplex -10Mbit duplex-integral -10Mbit semi-duplex -Opções do GSM +Modo de conexão Ethernet +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex +Configurações do GSM Ativar GSM -Ativar/Desativar o GSM -VMODE -NTSC/PAL/60Hz/PS1/HDTV/VGA -POS-H -Ajustes Horizontais -POS-V -Ajustes Verticais +Ativar ou Desativar o GSM +Modo de Vídeo +Força o Modo de Vídeo escolhido +Posição Horizontal +Ajuste Horizontal +Posição Vertical +Ajuste Vertical Pular FMV Pula os vídeos do jogo -Opções de trapaças -Ativar o PS2RD Cheat Engine -Deixar o PS2RD patchear seus jogos +Opções de Cheats (trapaças) +Ativar PS2RD Cheat Engine +Permitir que o PS2RD Cheat Engine injete códigos nos jogos Modo do PS2RD Cheat Engine -Auto-selecionar ou Escolher as trapaças -Auto-selecionar trapaças -Selecionar trapaças -Erro: falha ao carregar as trapaças -Nenhuma trapaça encontrada +Auto selecionar ou Selecionar Cheats (trapaças) +Auto selecionar Cheats (trapaças) +Selecionar Cheats (trapaças) +Erro: falha ao carregar arquivo de Cheats (trapaças) +Nenhum cheat (trapaça) encontrado Baixar configurações -Atualizar pela Internet +Atualização pela Internet Baixar dados existentes novamente? -Falha na atualização. -Falha ao conectar no servidor de atualização. -Atualização concluída. -Atualização cancelada. -Baixar configurações da Internet? +Falha na atualização +Falha ao conectar no servidor de atualização +Atualização concluída +Atualização cancelada +Baixar configurações pela Internet? Configurações personalizadas Configurações baixadas -Iniciar automaticamente no %i s... -Auto-começar -Valores em segundos (s), 0 para desativar -Logotipo do Playstation 2 -Será mostrado apenas no jogo que for da mesma região do console +Auto iniciar em %i s... +Auto iniciar +Valor em segundo(s), 0 para desativar +Logotipo do PS2 +Aparece apenas se houver um logotipo válido que seja da mesma região que o console +ELF Loader Menu +Modo de inicio do ELF Loader Menu \ No newline at end of file diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 062e80c5a..7924416cf 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,5 +1,7 @@ -# Russian translation by druchapucha & frodosumkin -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Translated by druchapucha and frodosumkin +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Russian Open PS2 Loader %s Сохранить настройки @@ -40,7 +42,7 @@ HDD-Игры Круг Крест Список игр -Конфиг. Игры +Конфиг. Сбросить все настройки Все опции сброшены! Прокрутка @@ -70,14 +72,14 @@ HDD-Игры Вручную Запуск HDL сервера HDL сервер запускается... -HDL сервер запущен… +HDL сервер запущен... Нажмите кнопку [O], чтобы остановить Нажмите кнопку [X], чтобы прервать работу HDL сервера Выгрузка HDL сервера... ELF при вызове IGR Цвет фона Цвет обычного текста - PS2 - -- Сервер SMB - +- SMB Server - Тип IP-адреса Статичный DHCP @@ -100,7 +102,7 @@ NetBIOS Удалить Запустить Настройки экрана -Включить операцию записи +Разрешить переименование/удаление Проверять фрагментацию игр на USB Запоминать последнюю игру Кнопка выбор @@ -109,9 +111,9 @@ NetBIOS Проверка Оставьте пустым для гостевого доступа Аккуратное чтение -Режим синхронизации +Альтернативный метод чтения данных Разблокировать системные вызовы -Пропустить Видео +Использовать режим 0 PSS Эмулировать DVD-DL Отключить использование IGR Высокий модуль хранения @@ -202,9 +204,11 @@ PS2RD Cheat Engine пропатчит вашу игру Обновление отменено. Загрузить настройки из Интернет? Пользовательские настройки -Загрузка Стандартных +Загрузка стандартных Автозапуск через %i s... Автозапуск -Значение в секундах(ы), 0 чтобы выключить автопуск... +Значение в секундах(ы), 0 чтобы выключить автопуск.. PS2 логотип Отображается экран, который запускается при запуске игрового диска +Меню ELF Загрузчика +Отобразить меню ELF Загрузчика \ No newline at end of file diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index d6c2d4d71..e8680e334 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,5 +1,7 @@ -# Spanish translation by El_Patas - @http://psx-scene.com/forums/members/elpatas/ -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Translation by lauchon22 +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Spanish Open PS2 Loader %s Guardar cambios @@ -19,7 +21,7 @@ Aplicaciones Estilo Idioma Se apagará el sistema. -¿Salir al Navegador/OSDSYS de la consola? +¿Salir al navegador/OSDSYS? ¿Cancelar actualización? %d: Disco duro no detectado %d: Disco duro no formateado @@ -32,8 +34,8 @@ Se apagará el sistema. %d: No se pueden listar los juegos %d: Servidor DHCP no disponible %d: No hay conexión de red -Activa. -Desact. +Sí +No Aceptar Aceptar Cancelar @@ -65,7 +67,7 @@ Refrescar Modo de inicio para USB Modo de inicio para Disco duro Modo de inicio para Red -Modo de inicio para Aplicaciones +Modo inicio de menú de Aplicaciones Automático Manual Iniciar servidor HDLDump @@ -74,7 +76,7 @@ Servidor HDLDump conectado... Error al iniciar el servidor HDLDump. Cerrando servidor HDLDump... Ruta del IGR -Color de fondo +Color de fondo Color de texto - PS2 - - Servidor SMB - @@ -111,7 +113,7 @@ Dejar en blanco para autentificar como GUEST Lectura precisa Modo sincronizado Desvincula el sistema -Omite vídeos +Omite los vídeos PSS Emula DVD-DL Quita el IGR Almacena los módulos en alta dirección de memoria @@ -131,13 +133,13 @@ Progreso Archivo VMC creado Archivo VMC inválido, el tamaño es incorrecto El archivo VMC debe ser creado -Error con el archivo VMC %s, ¿continuar con la tarjeta física (slot %d)? +Error con el archivo VMC %s, ¿continuar con la tarjeta física (slot %d) ? Refresco automático de las listas Acerca del OPL Desarrolladores Testeadores Ruta predeterminada dispositivo USB -Dejar en blanco para salida hacia el navegador de PS2 +Lanzar ELF personalizado después de IGR Valor en minutos, 0 para desactivar el paro automático Paro automático rotación del Disco duro Modo de vídeo interfaz @@ -175,9 +177,9 @@ Configuración de velocidad ethernet y duplex 10Mbit half-duplex Opciones GSM Activar GSM +Activar o desactivar GSM +VMODO Forzar modo de vídeo seleccionado con GSM -Modo de vídeo seleccionado -Modo de vídeo a forzar Ajuste horizontal Configura la posición horizontal de la pantalla Ajuste vertical @@ -206,5 +208,7 @@ Descargados ajustes predeterminados Inicio en %i s... Inicio automático Valor en segundos, 0 para desactivar el inicio automático -Logotipo Playstation 2 -Sólo se mostrará si el juego es de la misma región que la consola \ No newline at end of file +PS2 Logo +Solo se muestra con un disco válido en una consola de la misma región +ELF Loader Menu +Modo inicio de menú de ELF Loader \ No newline at end of file diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 2720d38c3..d4dc2e0bd 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,5 +1,7 @@ -# Swedish translation by Flaya -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Translation by Lord_Flaya +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Swedish Open PS2 Loader %s Spara ändringar @@ -111,7 +113,7 @@ Lämna tomt för Gäst konto. Korrekt läsning Synkroniseringsläge Släpp Syscalls -Hoppa över videoklipp +0 PSS läge Emulera DVD-DL Inaktivera IGR Högmoduls-lagring @@ -131,7 +133,7 @@ Framsteg VMC fil existerar Ogiltig VMC fil, felaktig storlek VMC filen måste skapas -Fel med VMC % s , fortsätt med fysisk MC ( kortplats % d ) ? +Fel med VMC %s, fortsätt med fysisk MC (kortplats %d) ? Automatisk uppdatering Om Kodare @@ -208,3 +210,5 @@ Autostart Värde i sekund(er), 0 inaktiverar Autostart PS2 Logo Visas bara när skivavbilden matchar konsolens region +ELF launcher meny +ELF loader meny visningsläge \ No newline at end of file diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese.lng index 8a9dbdd69..b3ef97e84 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese.lng @@ -1,5 +1,7 @@ -# Traditional Chinese translation by kane159 - kane159) -# For Open PS2 Loader 0.9.3 betas - Official OPL Beta thread @http://psx-scene.com/forums/f150/open-ps2-loader-official-beta-revisions-releases-156209/ +# Translation by Gürkan DEMİR aka: dante +# Last update: 08/25/2016 +# Updated for OPL_r928_DB [616d6fd] +# official thread: http://ps2home.freeforums.net/post/1966/thread Turkish Open PS2 Loader %s Değişiklikleri kaydet @@ -59,7 +61,7 @@ Kapak Resimlerini etkinleştir Geniş ekran Gücü kapat Ayarlar yükleniyor -Ayarlar kayıt ediliyor +Ayarlar kayıt ediliyor Cihazı başlat Yenile USB cihazı başlangıç türü @@ -76,7 +78,7 @@ HDL Sunucu Durduruluyor... IGR çıkış yolu Arkaplan rengi Metin rengi -- PS2 - +- PS2 - - SMB Server - IP adres türü Sabit @@ -108,10 +110,10 @@ Hata, oyun dosyası parçalı Hata, nesne çalıştırılamıyor Test MİSAFİR oturumu için boş bırakınız. -Accurate Reads +Alternatif çekirdeği yükle Synchronous Mode Sis çağrılarını çöz -Videoları atla +PSS video iptali DVD-DL i etkinleştir IGR i etkisizleştir Uüksek konumda bellek kullanımı @@ -208,3 +210,5 @@ Auto start Value in second(s), 0 to disable auto start PS2 Logo Only displayed for a valid disc logo which matches the console's region +ELF Loader Menu +ELF Loader Menu display mode \ No newline at end of file diff --git a/src/appsupport.c b/src/appsupport.c index b2efe43fb..ea1f05652 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -9,6 +9,7 @@ #include "include/usbsupport.h" #include "include/ethsupport.h" #include "include/hddsupport.h" +#include "include/supportbase.h" static int appForceUpdate = 1; static int appItemCount = 0; @@ -68,12 +69,52 @@ static int appNeedsUpdate(void) return 0; } -static int appUpdateItemList(void) -{ - appItemCount = 0; - configClear(configApps); - configRead(configApps); - +static int appUpdateItemList(void) { + char path[256]; + static item_list_t *listSupport = NULL; + int ret=0; //Return from configRead + appItemCount = 0; + + //Clear config if already exists + if (configApps != NULL) + configFree(configApps); + + //Try MC?:/OPL/conf_apps.cfg + snprintf(path, sizeof(path), "%s/conf_apps.cfg", gBaseMCDir); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + + //Try HDD + if ( ret == 0 && (listSupport = hddGetObject(1)) ) { + if (configApps != NULL){ + configFree(configApps); + } + snprintf(path, sizeof(path), "%sconf_apps.cfg", hddGetPrefix()); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + } + + //Try ETH + if ( ret == 0 && (listSupport = ethGetObject(1)) ) { + if (configApps != NULL){ + configFree(configApps); + } + snprintf(path, sizeof(path), "%sconf_apps.cfg", ethGetPrefix()); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + } + + //Try USB + if ( ret == 0 && (listSupport = usbGetObject(1)) ){ + if (configApps != NULL){ + configFree(configApps); + } + snprintf(path, sizeof(path), "%sconf_apps.cfg", usbGetPrefix()); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + } + + //Count apps if (configApps->head) { struct config_value_t *cur = configApps->head; while (cur) { @@ -151,20 +192,74 @@ static void appLaunchItem(int id, config_set_t *configSet) guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL); } -static config_set_t *appGetConfig(int id) -{ - config_set_t *config = configAlloc(0, NULL, NULL); +static config_set_t* appGetConfig(int id) { + config_set_t* config = NULL; + static item_list_t *listSupport = NULL; struct config_value_t *cur = appGetConfigValue(id); + int ret=0; + + //Search on HDD, SMB, USB for the CFG/GAME.ELF.CFG file. + //HDD + if ( (listSupport = hddGetObject(1)) ) { + char path[256]; + #if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); + #else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); + #endif + config = configAlloc(1, NULL, path); + ret = configRead(config); + } + + //ETH + if ( ret == 0 && (listSupport = ethGetObject(1)) ) { + char path[256]; + if (config != NULL) + configFree(config); + + #if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), appGetELFName(cur->val)); + #else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(),appGetELFName(cur->val)); + #endif + config = configAlloc(1, NULL, path); + ret = configRead(config); + } + + //USB + if ( ret == 0 && (listSupport = usbGetObject(1)) ){ + char path[256]; + if (config != NULL) + configFree(config); + + #if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); + #else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); + #endif + config = configAlloc(1, NULL, path); + ret = configRead(config); + } + + if (ret == 0){ //No config found on previous devices, create one. + if (config != NULL) + configFree(config); + + config = configAlloc(1, NULL, NULL); + } + configSetStr(config, CONFIG_ITEM_NAME, appGetELFName(cur->val)); configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); + configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); + configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); return config; } static int appGetImage(char *folder, int isRelative, char *value, char *suffix, GSTEXTURE *resultTex, short psm) { - value = appGetELFName(value); - // We search on ever devices from fatest to slowest (HDD > ETH > USB) + //value = appGetELFName(value); + // Search every device from fastest to slowest (HDD > ETH > USB) static item_list_t *listSupport = NULL; if ((listSupport = hddGetObject(1))) { if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) diff --git a/src/config.c b/src/config.c index 842fd31cc..2e4b842ad 100644 --- a/src/config.c +++ b/src/config.c @@ -160,6 +160,8 @@ void configInit(char *prefix) configAlloc(CONFIG_LAST, &configFiles[CONFIG_INDEX_LAST], path); snprintf(path, sizeof(path), "%s/conf_apps.cfg", prefix); configAlloc(CONFIG_APPS, &configFiles[CONFIG_INDEX_APPS], path); + snprintf(path, sizeof(path), "%s/conf_elm.cfg", prefix); + configAlloc(CONFIG_ELM, &configFiles[CONFIG_INDEX_ELM], path); snprintf(path, sizeof(path), "%s/conf_network.cfg", prefix); configAlloc(CONFIG_NETWORK, &configFiles[CONFIG_INDEX_NETWORK], path); } diff --git a/src/dialogs.c b/src/dialogs.c index 918fec5d4..27ed0dfde 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -321,6 +321,11 @@ struct UIItem diaConfig[] = { {UI_ENUM, CFG_APPMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_ELMMODE}}}, + {UI_SPACER}, + {UI_ENUM, CFG_ELMMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, + {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_DEFDEVICE}}}, {UI_SPACER}, {UI_ENUM, CFG_DEFDEVICE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, @@ -482,11 +487,11 @@ struct UIItem diaAbout[] = { {UI_BREAK}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"BatRastard, crazyc, dlanor, doctorxyz, hominem.te.esse, ifcaro, izdubar", -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"BatRastard, crazyc, danielb, dlanor, doctorxyz, hominem.te.esse, ifcaro,", -1}}}, {UI_BREAK}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"Jay-Jay, jimmikaelkael, misfire, Polo35, reprep, SP193, volca", -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"izdubar, Jay-Jay, jimmikaelkael, misfire, Polo35, reprep, SP193, volca", -1}}}, {UI_BREAK}, {UI_SPACER}, @@ -498,7 +503,7 @@ struct UIItem diaAbout[] = { {UI_BREAK}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"algol, Berion, danielB, El_Patas, EP, gledson999, lee4, LocalH, RandQalan", -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"algol, Berion, El_Patas, EP, gledson999, lee4, LocalH, RandQalan", -1}}}, {UI_BREAK}, {UI_SPACER}, diff --git a/src/elmsupport.c b/src/elmsupport.c new file mode 100644 index 000000000..820f408dd --- /dev/null +++ b/src/elmsupport.c @@ -0,0 +1,286 @@ +#include "include/opl.h" +#include "include/lang.h" +#include "include/gui.h" +#include "include/elmsupport.h" +#include "include/themes.h" +#include "include/system.h" +#include "include/ioman.h" + +#include "include/usbsupport.h" +#include "include/ethsupport.h" +#include "include/hddsupport.h" +#include "include/supportbase.h" + +static int elmForceUpdate = 1; +static int elmItemCount = 0; + +static config_set_t *configElm; + +// forward declaration +static item_list_t elmItemList; + +static struct config_value_t* elmGetConfigValue(int id) { + struct config_value_t* cur = configElm->head; + + while (id--) { + cur = cur->next; + } + + return cur; +} + +static char* elmGetELFName(char* name) { + // Looking for the ELF name + char* pos = strrchr(name, '/'); + if (!pos) + pos = strrchr(name, ':'); + if (pos) { + return pos + 1; + } + + return name; +} + +void elmInit(void) { + LOG("ELMSUPPORT Init\n"); + elmForceUpdate = 1; + configGetInt(configGetByType(CONFIG_OPL), "elm_frames_delay", &elmItemList.delay); + configElm = configGetByType(CONFIG_ELM); + elmItemList.enabled = 1; +} + +item_list_t* elmGetObject(int initOnly) { + if (initOnly && !elmItemList.enabled) + return NULL; + return &elmItemList; +} + +static int elmNeedsUpdate(void) { + if (elmForceUpdate) { + elmForceUpdate = 0; + return 1; + } + + return 0; +} + +static int elmUpdateItemList(void) { + char path[256]; + static item_list_t *listSupport = NULL; + int ret=0; //Return from configRead + elmItemCount = 0; + + //Clear config if already exists + if (configElm != NULL) + configFree(configElm); + + //Try MC?:/OPL/conf_elm.cfg + snprintf(path, sizeof(path), "%s/conf_elm.cfg", gBaseMCDir); + configElm = configAlloc(CONFIG_ELM, NULL, path); + ret = configRead(configElm); + + //Try HDD + if ( ret == 0 && (listSupport = hddGetObject(1)) ) { + if (configElm != NULL){ + configFree(configElm); + } + snprintf(path, sizeof(path), "%sconf_elm.cfg", hddGetPrefix()); + configElm = configAlloc(CONFIG_ELM, NULL, path); + ret = configRead(configElm); + } + + //Try ETH + if ( ret == 0 && (listSupport = ethGetObject(1)) ) { + if (configElm != NULL){ + configFree(configElm); + } + snprintf(path, sizeof(path), "%sconf_elm.cfg", ethGetPrefix()); + configElm = configAlloc(CONFIG_ELM, NULL, path); + ret = configRead(configElm); + } + + //Try USB + if ( ret == 0 && (listSupport = usbGetObject(1)) ){ + if (configElm != NULL){ + configFree(configElm); + } + snprintf(path, sizeof(path), "%sconf_elm.cfg", usbGetPrefix()); + configElm = configAlloc(CONFIG_ELM, NULL, path); + ret = configRead(configElm); + } + + //Count elm + if (configElm->head) { + struct config_value_t* cur = configElm->head; + while (cur) { + cur = cur->next; + elmItemCount++; + } + } + return elmItemCount; +} + +static int elmGetItemCount(void) { + return elmItemCount; +} + +static char* elmGetItemName(int id) { + struct config_value_t* cur = elmGetConfigValue(id); + return cur->key; +} + +static int elmGetItemNameLength(int id) { + return 32; +} + +static char* elmGetItemStartup(int id) { + struct config_value_t* cur = elmGetConfigValue(id); + return elmGetELFName(cur->val); +} + +#ifndef __CHILDPROOF +static void elmDeleteItem(int id) { + struct config_value_t* cur = elmGetConfigValue(id); + fileXioRemove(cur->val); + cur->key[0] = '\0'; + configElm->modified = 1; + configWrite(configElm); + + elmForceUpdate = 1; +} + +static void elmRenameItem(int id, char* newName) { + struct config_value_t* cur = elmGetConfigValue(id); + + char value[256]; + strncpy(value, cur->val, sizeof(value)); + configRemoveKey(configElm, cur->key); + configSetStr(configElm, newName, value); + configWrite(configElm); + + elmForceUpdate = 1; +} +#endif + +static void elmLaunchItem(int id, config_set_t* configSet) { + struct config_value_t* cur = elmGetConfigValue(id); + int fd = fileXioOpen(cur->val, O_RDONLY, 0666); + if (fd >= 0) { + fileXioClose(fd); + + int exception = NO_EXCEPTION; + if (strncmp(cur->val, "pfs0:", 5) == 0) + exception = UNMOUNT_EXCEPTION; + + char filename[256]; + sprintf(filename,"%s",cur->val); + deinit(exception); // CAREFUL: deinit will call elmCleanUp, so configElm/cur will be freed + sysExecElf(filename); + } + else + guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL); +} + +static config_set_t* elmGetConfig(int id) { + config_set_t* config = NULL; + static item_list_t *listSupport = NULL; + struct config_value_t* cur = elmGetConfigValue(id); + int ret=0; + + //Search on HDD, SMB, USB for the CFG/GAME.ELF.cfg file. + //HDD + if ( (listSupport = hddGetObject(1)) ) { + char path[256]; + #if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), elmGetELFName(cur->val)); + #else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), elmGetELFName(cur->val)); + #endif + config = configAlloc(1, NULL, path); + ret = configRead(config); + } + + //ETH + if ( ret == 0 && (listSupport = ethGetObject(1)) ) { + char path[256]; + if (config != NULL) + configFree(config); + + #if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), elmGetELFName(cur->val)); + #else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(),elmGetELFName(cur->val)); + #endif + config = configAlloc(1, NULL, path); + ret = configRead(config); + } + + //USB + if ( ret == 0 && (listSupport = usbGetObject(1)) ){ + char path[256]; + if (config != NULL) + configFree(config); + + #if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), elmGetELFName(cur->val)); + #else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), elmGetELFName(cur->val)); + #endif + config = configAlloc(1, NULL, path); + ret = configRead(config); + } + + if (ret == 0){ //No config found on previous devices, create one. + if (config != NULL) + configFree(config); + + config = configAlloc(1, NULL, NULL); + } + + configSetStr(config, CONFIG_ITEM_NAME, elmGetELFName(cur->val)); + configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); + configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); + configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); + configSetStr(config, CONFIG_ITEM_MEDIA, "ELM"); + return config; +} + +static int elmGetImage(char* folder, int isRelative, char* value, char* suffix, GSTEXTURE* resultTex, short psm) { + //value = elmGetELFName(value); + // Search every device from fastest to slowest (HDD > ETH > USB) + static item_list_t *listSupport = NULL; + if ( (listSupport = hddGetObject(1)) ) { + if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) + return 0; + } + + if ( (listSupport = ethGetObject(1)) ) { + if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) + return 0; + } + + if ( (listSupport = usbGetObject(1)) ) + return listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm); + + return -1; +} + +static void elmCleanUp(int exception) { + if (elmItemList.enabled) { + LOG("ELMSUPPORT CleanUp\n"); + } +} + +static item_list_t elmItemList = { + ELM_MODE, 0, MODE_FLAG_NO_COMPAT|MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "ELF Loader Menu", _STR_ELM, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, +#ifdef __CHILDPROOF + &elmGetItemCount, NULL, &elmGetItemName, &elmGetItemNameLength, &elmGetItemStartup, NULL, NULL, &elmLaunchItem, +#else + &elmGetItemCount, NULL, &elmGetItemName, &elmGetItemNameLength, &elmGetItemStartup, &elmDeleteItem, &elmRenameItem, &elmLaunchItem, +#endif +#ifdef VMC + &elmGetConfig, &elmGetImage, &elmCleanUp, NULL, ELM_ICON +#else + &elmGetConfig, &elmGetImage, &elmCleanUp, ELM_ICON +#endif +}; diff --git a/src/ethsupport.c b/src/ethsupport.c index 85800b717..84312078c 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -64,6 +64,10 @@ static int ethGetNetIFLinkStatus(void); static int ethInitSemaID = -1; +char* ethGetPrefix(void){ + return ethPrefix; +} + //Initializes locking semaphore for network support (not for just SMB support, but for the network subsystem). static int ethInitSema(void) { diff --git a/src/gui.c b/src/gui.c index aa917fafe..ac020b7d7 100644 --- a/src/gui.c +++ b/src/gui.c @@ -379,6 +379,7 @@ void guiShowConfig() diaSetEnum(diaConfig, CFG_HDDMODE, deviceModes); diaSetEnum(diaConfig, CFG_ETHMODE, deviceModes); diaSetEnum(diaConfig, CFG_APPMODE, deviceModes); + diaSetEnum(diaConfig, CFG_ELMMODE, deviceModes); diaSetInt(diaConfig, CFG_DEBUG, gDisableDebug); diaSetInt(diaConfig, CFG_PS2LOGO, gPS2Logo); @@ -399,6 +400,7 @@ void guiShowConfig() diaSetInt(diaConfig, CFG_HDDMODE, gHDDStartMode); diaSetInt(diaConfig, CFG_ETHMODE, gETHStartMode); diaSetInt(diaConfig, CFG_APPMODE, gAPPStartMode); + diaSetInt(diaConfig, CFG_ELMMODE, gELMStartMode); int ret = diaExecuteDialog(diaConfig, -1, 1, &guiUpdater); if (ret) { @@ -422,6 +424,7 @@ void guiShowConfig() diaGetInt(diaConfig, CFG_HDDMODE, &gHDDStartMode); diaGetInt(diaConfig, CFG_ETHMODE, &gETHStartMode); diaGetInt(diaConfig, CFG_APPMODE, &gAPPStartMode); + diaGetInt(diaConfig, CFG_ELMMODE, &gELMStartMode); applyConfig(-1, -1); } @@ -1055,6 +1058,7 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_CONFIGSOURCE); configRemoveKey(configSet, CONFIG_ITEM_DMA); configRemoveKey(configSet, CONFIG_ITEM_COMPAT); + configRemoveKey(configSet, CONFIG_ITEM_MODES); configRemoveKey(configSet, CONFIG_ITEM_DNAS); configRemoveKey(configSet, CONFIG_ITEM_ALTSTARTUP); #ifdef GSM @@ -1070,10 +1074,18 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) menuSaveConfig(); } else if (result > 0) { // test button pressed or save button compatMode = 0; - for (i = 0; i < COMPAT_MODE_COUNT; ++i) { + char modesBuf[16];//(1+2+3+4+5+6+7+8)= 15 +1 null + int modesBufPos = 0; + for (i = 0; i < COMPAT_MODE_COUNT; ++i) { int mdpart; diaGetInt(diaCompatConfig, COMPAT_MODE_BASE + i, &mdpart); compatMode |= (mdpart ? 1 : 0) << i; + if (mdpart){ + if(modesBufPos == 0) + modesBufPos+=sprintf(modesBuf + modesBufPos, "%d", i+1); + else + modesBufPos+=sprintf(modesBuf + modesBufPos, "+%d", i+1); + } } if (support->flags & MODE_FLAG_COMPAT_DMA) { @@ -1084,10 +1096,13 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_DMA); } - if (compatMode != 0) - configSetInt(configSet, CONFIG_ITEM_COMPAT, compatMode); - else - configRemoveKey(configSet, CONFIG_ITEM_COMPAT); + if (compatMode != 0){ + configSetInt(configSet, CONFIG_ITEM_COMPAT, compatMode); + configSetStr(configSet, CONFIG_ITEM_MODES, modesBuf); + }else{ + configRemoveKey(configSet, CONFIG_ITEM_COMPAT); + configRemoveKey(configSet, CONFIG_ITEM_MODES); + } #ifdef GSM diaGetInt(diaGSConfig, GSMCFG_ENABLEGSM, &EnableGSM); diff --git a/src/hddsupport.c b/src/hddsupport.c index 602174cfd..f1aa64d00 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -53,6 +53,10 @@ const char *oplPart = "hdd0:+OPL"; // forward declaration static item_list_t hddGameList; +char* hddGetPrefix(void){ + return hddPrefix; +} + static void hddInitModules(void) { diff --git a/src/lang.c b/src/lang.c index 9b87db489..63b5667b0 100644 --- a/src/lang.c +++ b/src/lang.c @@ -76,7 +76,7 @@ static char *internalEnglish[LANG_STR_COUNT] = { "USB device start mode", "HDD device start mode", "ETH device start mode", - "Applications start mode", + "Applications menu display mode", "Auto", "Manual", "Start HDL Server", @@ -219,6 +219,8 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Value in second(s), 0 to disable auto start", "PS2 Logo", "(Only displayed for a valid disc logo which matches the console's region)", + "ELF Loader Menu", + "ELF Loader Menu display mode", }; static int guiLangID = 0; diff --git a/src/menusys.c b/src/menusys.c index f282b0183..de8aa6228 100644 --- a/src/menusys.c +++ b/src/menusys.c @@ -638,7 +638,7 @@ void menuHandleInputMenu() if (getKeyOn(KEY_START) || getKeyOn(gSelectButton == KEY_CIRCLE ? KEY_CROSS : KEY_CIRCLE)) { //Check if there is anything to show the user, at all. - if (gAPPStartMode || gETHStartMode || gUSBStartMode || gHDDStartMode) + if (gAPPStartMode || gELMStartMode || gETHStartMode || gUSBStartMode || gHDDStartMode) guiSwitchScreen(GUI_SCREEN_MAIN, TRANSITION_LEFT); } } diff --git a/src/opl.c b/src/opl.c index a8776193d..ba7514120 100644 --- a/src/opl.c +++ b/src/opl.c @@ -28,6 +28,7 @@ #include "include/ethsupport.h" #include "include/hddsupport.h" #include "include/appsupport.h" +#include "include/elmsupport.h" #ifdef __EESIO_DEBUG #include @@ -329,6 +330,7 @@ static void initAllSupport(int force_reinit) initSupport(ethGetObject(0), gETHStartMode, ETH_MODE, force_reinit || (gNetworkStartup >= ERROR_ETH_SMB_CONN)); initSupport(hddGetObject(0), gHDDStartMode, HDD_MODE, force_reinit); initSupport(appGetObject(0), gAPPStartMode, APP_MODE, force_reinit); + initSupport(elmGetObject(0), gELMStartMode, ELM_MODE, force_reinit); } static void deinitAllSupport(int exception) @@ -337,6 +339,7 @@ static void deinitAllSupport(int exception) moduleCleanup(&list_support[ETH_MODE], exception); moduleCleanup(&list_support[HDD_MODE], exception); moduleCleanup(&list_support[APP_MODE], exception); + moduleCleanup(&list_support[ELM_MODE], exception); } // ---------------------------------------------------------- @@ -571,6 +574,7 @@ static void _loadConfig() configGetInt(configOPL, CONFIG_OPL_HDD_MODE, &gHDDStartMode); configGetInt(configOPL, CONFIG_OPL_ETH_MODE, &gETHStartMode); configGetInt(configOPL, CONFIG_OPL_APP_MODE, &gAPPStartMode); + configGetInt(configOPL, CONFIG_OPL_ELM_MODE, &gELMStartMode); } } @@ -655,7 +659,8 @@ static void _saveConfig() configSetInt(configOPL, CONFIG_OPL_HDD_MODE, gHDDStartMode); configSetInt(configOPL, CONFIG_OPL_ETH_MODE, gETHStartMode); configSetInt(configOPL, CONFIG_OPL_APP_MODE, gAPPStartMode); - + configSetInt(configOPL, CONFIG_OPL_ELM_MODE, gELMStartMode); + configSetInt(configOPL, CONFIG_OPL_SWAP_SEL_BUTTON, gSelectButton == KEY_CIRCLE ? 0 : 1); } @@ -717,6 +722,7 @@ void applyConfig(int themeID, int langID) moduleUpdateMenu(ETH_MODE, changed); moduleUpdateMenu(HDD_MODE, changed); moduleUpdateMenu(APP_MODE, changed); + moduleUpdateMenu(ELM_MODE, changed); } int loadConfig(int types) @@ -1145,6 +1151,7 @@ static void setDefaults(void) clearIOModuleT(&list_support[ETH_MODE]); clearIOModuleT(&list_support[HDD_MODE]); clearIOModuleT(&list_support[APP_MODE]); + clearIOModuleT(&list_support[ELM_MODE]); gBaseMCDir = "mc?:OPL"; @@ -1200,6 +1207,7 @@ static void setDefaults(void) gHDDStartMode = START_MODE_DISABLED; gETHStartMode = START_MODE_DISABLED; gAPPStartMode = START_MODE_DISABLED; + gELMStartMode = START_MODE_DISABLED; gDefaultBgColor[0] = 0x030; gDefaultBgColor[1] = 0x030; diff --git a/src/textures.c b/src/textures.c index 72c87af18..5df82b4a1 100644 --- a/src/textures.c +++ b/src/textures.c @@ -17,6 +17,7 @@ extern void *usb_png; extern void *hdd_png; extern void *eth_png; extern void *app_png; +extern void *elm_png; extern void *cross_png; extern void *triangle_png; @@ -60,6 +61,7 @@ static texture_t internalDefault[TEXTURES_COUNT] = { {HDD_ICON, "hdd", &hdd_png}, {ETH_ICON, "eth", ð_png}, {APP_ICON, "app", &app_png}, + {ELM_ICON, "elm", &elm_png}, {LEFT_ICON, "left", &left_png}, {RIGHT_ICON, "right", &right_png}, {UP_ICON, "up", &up_png}, diff --git a/src/usbsupport.c b/src/usbsupport.c index afecca4b9..3ed78cdec 100644 --- a/src/usbsupport.c +++ b/src/usbsupport.c @@ -44,6 +44,10 @@ static base_game_info_t *usbGames; // forward declaration static item_list_t usbGameList; +char* usbGetPrefix(void){ + return usbPrefix; +} + //Identifies the partition that the specified file is stored on and generates a full path to it. int usbFindPartition(char *target, char *name) { From 1991dce235589ce69c973a30b9921a1e2b4ffece Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 23 Oct 2016 07:23:09 -0700 Subject: [PATCH 003/269] Oops! Fixed a tiny typo mistake in the previous commit. :) --- DETAILED_CHANGELOG | 14 +------------- include/config.h | 2 +- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 4f85a0705..9c9b4c6cb 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,21 +10,9 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev959 - Jay-Jay-OPL - Update all changes from OPL Daily Builds from BitBucket Repo https://bitbucket.org/Jay-Jay/opl-daily-builds/commits/ : * added ELF Launcher Menu (aka: ELM) -- it's a clone version of the APPS page in OPL, * added changes so both ELM and APPS support CFG data for INFO PAGE, * added a new Attribute feature where selected MODES can also be displayed on INFO PAGE, * updated LANG files, * plus a few miscellaneous tweaks (browse the OPL Daily Builds repo from BitBucket to learn more...). - Sun Oct 23 06:58:03 2016 -0700 rev958 - Jay-Jay-OPL - change gfx files - Sun Oct 23 02:37:33 2016 -0700 rev957 - Jay-Jay - Merge pull request #1 from ifcaro/master - Sun Oct 23 02:06:52 2016 -0700 rev956 - Caio Oliveira - Makefile: Fix REVISION reported by @ElPatas and reforced by @ShaolinAssasin - Sat Oct 22 21:55:40 2016 -0200 rev955 - Caio Oliveira - src/dialogs: Rework some minor issues - Sat Oct 22 21:55:40 2016 -0200 rev954 - Caio Oliveira - make_changelog.sh: Rework revision (see NOTE) - Sat Oct 22 21:55:40 2016 -0200 -rev953 - Caio Oliveira - OLD_DETAILED_CHANGELOG: Bring BitBucket changelog - Sat Oct 22 21:55:40 2016 -0200 -rev952 - Caio Oliveira - OPL: Fix GIT revision (see NOTE below) - Fri Oct 21 05:27:04 2016 -0200 -rev951 - doctorxyz - Makefile: Git REVISION number via shell git log command - Thu Oct 20 13:48:36 2016 -0200 -rev950 - Caio Oliveira - OPL: Update versioning to new scheme - Thu Oct 20 13:44:31 2016 -0200 -rev949 - uyjulian - run clang-format on all .c and .h files - Wed Oct 19 20:32:12 2016 -0200 -rev948 - uyjulian - add .clang-format configuration file - Wed Oct 19 20:32:12 2016 -0200 -rev947 - Caio Oliveira - .gitignore: Change from .hgignore and add more entries - Wed Oct 19 11:00:18 2016 -0200 -rev946 - Caio Oliveira - TravisCI: Initial Template - Wed Oct 19 11:00:18 2016 -0200 -rev945 - Caio Oliveira - lng_pack: Add script to pack all Langs in a zip - Wed Oct 19 11:00:18 2016 -0200 -rev944 - Caio Oliveira - make_changelog: Update it to GIT format - Wed Oct 19 11:00:18 2016 -0200 -rev943 - Caio Oliveira - README: Create a symlink need by GitHub - Wed Oct 19 09:47:19 2016 -0200 -rev942 - Caio Oliveira - CREDITS: Make same style in whole file - Wed Oct 19 09:47:19 2016 -0200 -rev941 - doctorxyz - Skip Videos: Three methods (0 PSS/sceMpegIsEnd/BIK) on a single place Now Skip Videos (a.k.a. 0 PSS) not only skips PSS files (by zeroing their sizes) but also skips Bink .BIK (new technique) and sceMpegIsEnd based ones - All of them from a single place: Game Settings->Customized Settings->Mode 4(Skip Videos) - sceMpegIsEnd and BIK approaches has been implemented on ee_core's patches, while 0 PSS code has been kept intact (on iopcore's cdvdman) - Renamed '0 PSS' for 'Skip Videos' according to each language (NB: Basic Google translation. Native speakers can improve it) - Removed now-redundant GSM's Skip Videos sceMpegIsEnd related stuff (ontheflypatcher) - Since sceMpegIsEnd isn't GSM-dependant anymore - Wed Oct 19 08:53:05 2016 -0200 diff --git a/include/config.h b/include/config.h index 5b5fa2a03..3d3f85181 100644 --- a/include/config.h +++ b/include/config.h @@ -34,7 +34,7 @@ enum CONFIG_INDEX { #define CONFIG_ITEM_ALTSTARTUP "$AltStartup" #define CONFIG_ITEM_VMC "$VMC" #define CONFIG_ITEM_COMPAT "$Compatibility" -#define CONFIG_ITEM_DMA "Modes" +#define CONFIG_ITEM_MODES "Modes" #define CONFIG_ITEM_DMA "$DMA" #define CONFIG_ITEM_DNAS "$DNAS" #define CONFIG_ITEM_CONFIGSOURCE "$ConfigSource" From b7e6f26f914270d304500c9bafb68e0e60ce0a97 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 23 Oct 2016 09:01:40 -0700 Subject: [PATCH 004/269] fix Changelogs --- DETAILED_CHANGELOG | 16 + OLD_DETAILED_CHANGELOG | 1893 ++++++++++++++++++++-------------------- 2 files changed, 956 insertions(+), 953 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 9c9b4c6cb..67be1f675 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,9 +10,25 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev962 - Jay-Jay - Merge pull request #2 from ifcaro/master - Sun Oct 23 08:42:58 2016 -0700 +rev961 - Caio Oliveira - src/dialogs: Fix chars overpassing of screen - Sun Oct 23 12:37:29 2016 -0200 +rev960 - Jay-Jay-OPL - Oops! Fixed a tiny typo mistake in the previous commit. :) - Sun Oct 23 07:23:09 2016 -0700 rev959 - Jay-Jay-OPL - Update all changes from OPL Daily Builds from BitBucket Repo https://bitbucket.org/Jay-Jay/opl-daily-builds/commits/ : * added ELF Launcher Menu (aka: ELM) -- it's a clone version of the APPS page in OPL, * added changes so both ELM and APPS support CFG data for INFO PAGE, * added a new Attribute feature where selected MODES can also be displayed on INFO PAGE, * updated LANG files, * plus a few miscellaneous tweaks (browse the OPL Daily Builds repo from BitBucket to learn more...). - Sun Oct 23 06:58:03 2016 -0700 rev958 - Jay-Jay-OPL - change gfx files - Sun Oct 23 02:37:33 2016 -0700 rev957 - Jay-Jay - Merge pull request #1 from ifcaro/master - Sun Oct 23 02:06:52 2016 -0700 rev956 - Caio Oliveira - Makefile: Fix REVISION reported by @ElPatas and reforced by @ShaolinAssasin - Sat Oct 22 21:55:40 2016 -0200 rev955 - Caio Oliveira - src/dialogs: Rework some minor issues - Sat Oct 22 21:55:40 2016 -0200 rev954 - Caio Oliveira - make_changelog.sh: Rework revision (see NOTE) - Sat Oct 22 21:55:40 2016 -0200 +rev953 - Caio Oliveira - OLD_DETAILED_CHANGELOG: Bring BitBucket changelog - Sat Oct 22 21:55:40 2016 -0200 +rev952 - Caio Oliveira - OPL: Fix GIT revision (see NOTE below) - Fri Oct 21 05:27:04 2016 -0200 +rev951 - doctorxyz - Makefile: Git REVISION number via shell git log command - Thu Oct 20 13:48:36 2016 -0200 +rev950 - Caio Oliveira - OPL: Update versioning to new scheme - Thu Oct 20 13:44:31 2016 -0200 +rev949 - uyjulian - run clang-format on all .c and .h files - Wed Oct 19 20:32:12 2016 -0200 +rev948 - uyjulian - add .clang-format configuration file - Wed Oct 19 20:32:12 2016 -0200 +rev947 - Caio Oliveira - .gitignore: Change from .hgignore and add more entries - Wed Oct 19 11:00:18 2016 -0200 +rev946 - Caio Oliveira - TravisCI: Initial Template - Wed Oct 19 11:00:18 2016 -0200 +rev945 - Caio Oliveira - lng_pack: Add script to pack all Langs in a zip - Wed Oct 19 11:00:18 2016 -0200 +rev944 - Caio Oliveira - make_changelog: Update it to GIT format - Wed Oct 19 11:00:18 2016 -0200 +rev943 - Caio Oliveira - README: Create a symlink need by GitHub - Wed Oct 19 09:47:19 2016 -0200 +rev942 - Caio Oliveira - CREDITS: Make same style in whole file - Wed Oct 19 09:47:19 2016 -0200 +rev941 - doctorxyz - Skip Videos: Three methods (0 PSS/sceMpegIsEnd/BIK) on a single place Now Skip Videos (a.k.a. 0 PSS) not only skips PSS files (by zeroing their sizes) but also skips Bink .BIK (new technique) and sceMpegIsEnd based ones - All of them from a single place: Game Settings->Customized Settings->Mode 4(Skip Videos) - sceMpegIsEnd and BIK approaches has been implemented on ee_core's patches, while 0 PSS code has been kept intact (on iopcore's cdvdman) - Renamed '0 PSS' for 'Skip Videos' according to each language (NB: Basic Google translation. Native speakers can improve it) - Removed now-redundant GSM's Skip Videos sceMpegIsEnd related stuff (ontheflypatcher) - Since sceMpegIsEnd isn't GSM-dependant anymore - Wed Oct 19 08:53:05 2016 -0200 diff --git a/OLD_DETAILED_CHANGELOG b/OLD_DETAILED_CHANGELOG index df870d2b2..10ea66d0d 100644 --- a/OLD_DETAILED_CHANGELOG +++ b/OLD_DETAILED_CHANGELOG @@ -8,958 +8,945 @@ Open PS2 Loader detailed ChangeLog: -rev953 - doctorxyz committed 6678592 - Mon Oct 10 00:23:15 2016 -0700 -rev952 - doctorxyz committed 60648cd - Sun Oct 09 20:35:58 2016 -0700 -rev951 - doctorxyz committed 33fec21 - Fri Oct 07 17:45:21 2016 -0700 -rev950 - doctorxyz committed 7121d7e - Thu Oct 06 17:39:57 2016 -0700 -rev949 - doctorxyz committed 763d4a4 - Mon Oct 03 17:45:50 2016 -0700 -rev948 - doctorxyz committed 1d2de4e - Sat Oct 01 20:51:42 2016 -0700 -rev947 - doctorxyz committed a57fcdf - Sat Oct 01 20:46:34 2016 -0700 -rev946 - doctorxyz committed da3a806 - Wed Sep 28 17:32:28 2016 -0700 -rev945 - doctorxyz committed 7887287 - Wed Sep 28 02:28:24 2016 -0700 -rev944 - doctorxyz committed dc41440 - Tue Sep 27 03:11:57 2016 -0700 -rev943 - update lang files - Mon Sep 19 14:29:21 2016 -0700 -rev942 - doctorxyz committed a0a99c0 - Mon Sep 19 12:12:06 2016 -0700 -rev941 - doctorxyz committed 828010d - Fri Sep 16 00:17:20 2016 -0700 -rev940 - doctorxyz committed a47f93b - Thu Sep 15 23:56:55 2016 -0700 -rev939 - committed d3bda76 - Sun Sep 11 15:28:44 2016 -0700 -rev938 - doctorxyz commited the following changes to ifcaro repo: - Sat Sep 10 20:52:26 2016 -0700 -rev937 - doctorxyz committed 9c5e7c6 - Mon Sep 05 00:31:15 2016 -0700 -rev936 - doctorxyz committed 7c806d8 - Sat Sep 03 06:28:34 2016 -0700 -rev935 - doctorxyz committed b766df3 - Tue Aug 30 13:08:52 2016 -0700 -rev934 - doctorxyz committed 93664a5 - Mon Aug 29 03:41:58 2016 -0700 -rev933 - doctorxyz committed 54b92d3 - Fri Aug 26 23:35:01 2016 -0700 -rev932 - doctorxyz committed 0def76c - Fri Aug 26 23:27:39 2016 -0700 -rev931 - doctorxyz committed 7f57a23 - Fri Aug 26 23:06:21 2016 -0700 -rev930 - doctorxyz committed eedf9dd - Fri Aug 26 23:01:08 2016 -0700 -rev929 - doctorxyz committed 75fecb6 - Fri Aug 26 22:55:08 2016 -0700 -rev928 - fixed error made to /include/lang.h - Thu Aug 25 19:18:23 2016 -0700 -rev927 - doctorxyz committed a3c0816 - Thu Aug 25 19:02:35 2016 -0700 -rev926 - doctorxyz committed a8d009b - Thu Aug 25 18:30:19 2016 -0700 -rev925 - doctorxyz committed 0bcb75c and 8bdabca - Mon Aug 22 16:23:39 2016 -0700 -rev924 - update lang files - Sun Aug 21 02:06:46 2016 -0700 -rev923 - doctorxyz committed 2dcd832 - Fri Aug 19 21:30:33 2016 -0700 -rev922 - doctorxyz committed c7c2e30 - Fri Aug 19 21:10:20 2016 -0700 -rev921 - doctorxyz committed 6ab74e2 - Fri Aug 19 21:05:01 2016 -0700 -rev920 - update lang file - Fri Aug 19 21:01:47 2016 -0700 -rev919 - doctorxyz committed 17be579 - Sun Aug 14 05:16:01 2016 -0700 -rev918 - doctorxyz committed d4af286 - PS2LOGO Makefile fix - Sat Aug 13 17:59:11 2016 -0700 -rev917 - doctorxyz committed 3689111 - Sat Aug 13 12:59:34 2016 -0700 -rev916 - doctorxyz committed d4ac025 - Sat Aug 13 12:53:46 2016 -0700 -rev915 - doctorxyz committed fdbf4a3 - Sat Aug 13 12:47:39 2016 -0700 -rev914 - doctorxyz committed 104c42e - Mon Aug 08 20:52:03 2016 -0700 -rev913 - doctorxyz committed b567af4 - Mon Aug 08 15:36:35 2016 -0700 -rev912 - doctorxyz committed a702d04 - Mon Aug 08 15:26:34 2016 -0700 -rev911 - doctorxyz committed 2658467 Reduced PS2RD string size in About Screen - Mon Aug 08 15:14:19 2016 -0700 -rev910 - doctorxyz committed b8d022b - Mon Aug 08 15:09:15 2016 -0700 -rev909 - . - Fri Aug 05 12:26:58 2016 +0100 -rev908 - no message - Fri Aug 05 12:21:54 2016 +0100 -rev907 - no message - Fri Aug 05 12:16:04 2016 +0100 -rev906 - Merged Jay-Jay/opl-daily-builds into default - Thu Aug 04 17:05:18 2016 +0100 -rev905 - Changing Modes to output Modes=1+2+3+4+5... - Thu Aug 04 17:03:05 2016 +0100 -rev904 - made a small edit - Sun Jul 24 03:27:23 2016 -0700 -rev903 - Adding the prefix "modes/" - Sun Jul 24 10:56:39 2016 +0100 -rev902 - no message - Sat Jul 23 21:49:38 2016 +0100 -rev901 - Trying to implement Modes on CFG - Sat Jul 23 21:47:45 2016 +0100 -rev900 - update lang files - Thu Jun 23 14:22:30 2016 -0700 -rev899 - update lang files - Tue Jun 21 18:37:47 2016 -0700 -rev898 - update Lang files - Tue Jun 14 12:13:06 2016 -0700 -rev897 - fix a lang.c error done in previous repo - Sat May 14 16:06:10 2016 -0700 -rev896 - include Bat Rastard recent pull request: https://goo.gl/XcZNJc - Sat May 14 15:03:51 2016 -0700 -rev895 - updated Brazilian Portuguese language - Mon Apr 04 19:09:30 2016 -0700 -rev894 - Update German Lang - Wed Jan 06 13:55:48 2016 -0800 -rev893 - update LANG files - Tue Jan 05 16:31:26 2016 -0800 -rev892 - add modfications done by doctorxyz in commit 2b8273a for GSM; updated About page and include more helpers; fixed it so Daily Build Lang files are compatible with official OPL v0.9.3 and so on... - Tue Jan 05 14:44:26 2016 -0800 -rev891 - update lang dates - Sun Oct 25 12:02:16 2015 -0700 -rev890 - Part 2 of 2 - restore changes to fix syncing conflicts between both repos. - Sun Oct 25 11:22:45 2015 -0700 -rev889 - Merged ifcaro/open-ps2-loader into default - Sun Oct 25 11:18:28 2015 -0700 -rev888 - Update languages - Sun Oct 25 13:05:27 2015 +0100 -rev887 - Part 1 of 2 - make changes to fix syncing conflicts between both repos. - Sun Oct 25 11:17:46 2015 -0700 -rev886 - update about page - Fri Oct 23 17:09:57 2015 -0700 -rev885 - Part 2 of 2 - restore changes to fix syncing conflicts between both repos. - Fri Oct 23 16:17:47 2015 -0700 -rev884 - Merged ifcaro/open-ps2-loader into default - Fri Oct 23 15:22:58 2015 -0700 -rev883 - writeMCIcon MC Folder Creation fix - Reported by Grahf, fixed by SP193 - Fri Oct 23 13:30:20 2015 -0400 -rev882 - Change version to 'OPL 0.9.4 WIP', re-enable development build flag - Fri Oct 23 04:16:22 2015 -0400 -rev881 - Added tag 0.9.3 for changeset 9b5321def22d - Wed Oct 21 00:59:28 2015 -0400 -rev880 - Massive language update: Arabic, Brazilian Portuguese, Bulgarian, French, Portuguese, Russian, Spanish and Traditional Chinese. - Wed Oct 21 00:49:42 2015 -0400 -rev879 - Updated: Polish language - summary: Massive language upArabic, Brazilian Portuguese, Bulgarian, French, Portuguese, Russian, Spanish and Traditional Chinese. -rev878 - About Menu: Contributors added, followed by case-insensitive sorting - Mon Oct 19 16:16:25 2015 -0400 -rev877 - swap DETAILED_CHANGELOG to fix conflicts. - Mon Oct 19 15:37:15 2015 -0400 -rev876 - Part 1 of 2 - make changes to fix syncing conflicts between both repos. - Fri Oct 23 15:21:18 2015 -0700 -rev875 - Part 2 of 2 - restore changes to fix syncing conflicts between both repos. - Fri Oct 23 15:17:31 2015 -0700 -rev874 - Merged ifcaro/open-ps2-loader into default - Sun Oct 18 15:19:40 2015 -0700 -rev873 - SP193 - Fixed renaming functionality for USBExtreme games + DEV9 will not be activated unless either Ethernet or ATA is used: - Sun Oct 18 15:12:43 2015 -0700 -rev872 - Jay-Jay'n'gledson999:Portuguese BR language fix - Sat Oct 17 21:47:36 2015 -0400 -rev871 - Part 1 of 2 - make changes to fix syncing conflicts between both repos. - Thu Oct 08 01:45:29 2015 -0400 -rev870 - Update Italian translation - Sun Oct 18 15:11:47 2015 -0700 -rev869 - Update Lang translations - Thu Oct 08 12:08:07 2015 -0700 -rev868 - Update language translations - Thu Oct 08 07:41:48 2015 -0700 -rev867 - Merged ifcaro/open-ps2-loader into default - Thu Oct 08 03:46:48 2015 -0700 -rev866 - Updated Portuguese BR language - Tue Oct 06 12:54:50 2015 -0700 -rev865 - SP193: HDD unit will be checked for fonts only if HDD support is set to AUTO. - Mon Oct 05 14:07:48 2015 -0400 -rev864 - Merged ifcaro/open-ps2-loader into default - Mon Oct 05 08:33:33 2015 -0400 -rev863 - Added Traditional Chinese language (It was missing in r840... Sorry) - Mon Oct 05 00:34:23 2015 -0700 -rev862 - Part 2 of 2 - fix conflicts from merger from ifcaro repo. - Sun Oct 04 20:55:55 2015 -0400 -rev861 - Merged ifcaro/open-ps2-loader into default - Sun Oct 04 05:43:30 2015 -0700 -rev860 - Update German Language and Update Theme Icons - Sun Oct 04 05:37:35 2015 -0700 -rev859 - Readded width specifiers on Game Settings Page. Let's help each other and work as a team ;-) - Sun Oct 04 05:21:30 2015 -0700 -rev858 - Translations Updated (French, Portuguese BR and Spanish) and Added (Traditional Chinese). Let's help each other and work as a team ;-) - Sun Oct 04 06:51:43 2015 -0400 -rev857 - Part 1 of 2 - fix conflicts for merger from ifcaro repo - Sun Oct 04 06:34:32 2015 -0400 -rev856 - Update Languages and rollback width specifiers on Game Settings Page for Game Modes. - Sun Oct 04 05:37:07 2015 -0700 -rev855 - Merged ifcaro/open-ps2-loader into default - Sun Oct 04 05:32:50 2015 -0700 -rev854 - Update Language Translation Files - Sun Oct 04 03:07:39 2015 -0700 -rev853 - Merged ifcaro/open-ps2-loader into default - Sat Oct 03 17:12:30 2015 -0700 -rev852 - Update Language Translation Files - Sat Oct 03 14:06:00 2015 -0700 -rev851 - Update Language Translation Files - Sat Oct 03 13:54:36 2015 -0700 -rev850 - Merged ifcaro/open-ps2-loader into default - Sat Oct 03 14:04:48 2015 -0700 -rev849 - Newest SP193's 0.9.3 patch - Mode x Labels :-) Remember guys we still need updated language files for 0.9.3 :-( - Sat Oct 03 07:30:38 2015 -0700 -rev848 - Part 2: rollback changes in Part 1, after ifcaro merger, plus edited some new code to make ELF Loader Menu (ELM) continue to work. New bug in APPS and ELM pages: If an ELF with a prefix (example: XX.title.ELF) is stored on SMB (shared folder) it will not load, but will load if the ELF is without a prefix (example: SMS.ELF) via SMB. But ELFs with prefixes (example: XX.title.ELF) will still load okay if the ELFs are stored on USB -- HDD not tested. - Sat Oct 03 07:07:24 2015 -0400 -rev847 - Merged ifcaro/open-ps2-loader into default - Sat Oct 03 07:21:29 2015 -0700 -rev846 - Here is SP193's 0.9.3 patch :-) But we still need updated language files :-( - Sat Oct 03 03:18:57 2015 -0700 -rev845 - Part 1: revert conflicting code changes to be ale to merge ifcaro's open-ps2-loader repo into Jay-Jay's OPL Daily Build repo. - Sat Oct 03 02:06:26 2015 -0400 -rev844 - Update lanc.c - Sat Oct 03 03:16:26 2015 -0700 -rev843 - Update: DETAILED_CHANGELOG - Fri Oct 02 00:35:23 2015 -0700 -rev842 - Merged ifcaro/open-ps2-loader into default - Thu Oct 01 21:43:21 2015 -0700 -rev841 - Update Spanish translation - summary: UpDETAILED_CHANGELOG -rev840 - Update language files - Thu Oct 01 16:02:05 2015 -0700 -rev839 - Disabled the Development Builds setting that was set since OPL r801 commit 144ad43. Go ahead and rename your CFG-DEV folder back to CFG. -- if you are using OPL Manager v16+ make sure to toggle back to CFG folder under Settings. -- Developer danielb7390 fixed issue for HDD users and also for the APPS and ELM pages -- because that device and pages would still attempt to fetch from CFG-DEV, even when the Development Builds setting was disabled. - Wed Sep 30 20:46:49 2015 +0200 -rev838 - Developer danielb7390 added support to fetch both conf_apps.cfg and conf_elm.cfg files from the root of all the devices in this order: MC, HDD, SMB, and USB. -- for MC it still looks for the file at the default OPL directory. - Thu Oct 01 16:00:05 2015 -0700 -rev837 - Developer danielb7390 added support for both the APPS and ELF Loader Menu pages to populate the CFG file for the INFO Page feature for Custom Themes. The CFG file must have the ELF file name. Examples: SMS.ELF.cfg or XX.AC2.ELF.cfg. It searches the CFG files from both CFG / CFG-DEV folders on all devices in this order: HDD, ETH, and USB. - Thu Oct 01 14:54:54 2015 -0700 -rev836 - Update language files - Thu Oct 01 14:35:11 2015 -0700 -rev835 - Added a new page: ELF Loader Menu (identical to the APPS page) to list a separate list of ELF files. This new page can be enabled under OPL Settings. It will use it's own conf_elm.cfg file in MC OPL directory so you can list the ELF files for this new page. - Thu Oct 01 11:00:21 2015 -0700 -rev834 - About Menu: Credits listed in alphabetical order - Thu Oct 01 08:48:43 2015 -0700 -rev833 - Deleted: scripts/out.txt - Thu Oct 01 08:22:08 2015 -0700 -rev832 - Auto Start Last Game - Configureable Countdown : Value in second(s), 0 to disable auto start - Tue Sep 29 21:16:38 2015 -0400 -rev831 - Fixes for VMC (compilation warning) and Auto-start Last Game (bugs and conflicts) - Tue Sep 29 08:20:27 2015 +0000 -rev830 - Auto-start feature fix - Wait for pending operations to finish - Mon Sep 28 10:43:25 2015 -0400 -rev829 - Added Autostart toggle for Last Played Game feature: When enabled, starts the chosen game automatically within a few seconds - unless the user presses any valid key. - Sun Sep 27 21:09:19 2015 -0400 -rev828 - OPL Spanish translation by El_Patas - Wed Sep 23 14:00:43 2015 -0400 -rev827 - update language files and also fonts - Wed Sep 23 05:16:42 2015 -0400 -rev826 - update language files - Sat Sep 19 06:55:27 2015 -0400 -rev825 - Now Last Played Game feature starts the chosen game automatically within a few seconds - unless the user presses any valid key. - Thu Sep 17 01:21:16 2015 -0700 -rev824 - Rollback: removed FAT driver from in-game. New universal system added to support non-standard sector sizes. - Sat Sep 05 22:05:46 2015 -0700 -rev823 - Added support for downloading compatibility entries through the Internet from the OPL-CL service. - Thu Sep 03 02:54:19 2015 -0400 -rev822 - Removed locking semaphore for game list, GUI OPs will now be cleared before the menu is cleared prior to game list updating (so that old commands will not be executed) and added checks for file-open problems under USB support. - Sun Aug 30 02:46:25 2015 +0800 -rev821 - Updated to support the new PS2SDK changes (SIF CMD buffer set, USBHDFSDV SIF CMD ID changed to 0), USBHDFSD IOCTL codes consolidated into usb-ioctl.h, standardized which "prefix" buffer to use within usbsupport.c (was unable to access game files when a prefix is set, due to the path getting incorrectly generated), removed cdrom_lseek64 as it is not implemented in the SONY CDVDMAN, changed cdrom_dclose to become cdrom_close since close() and dclose() are the same here and SONY does it that way too, simplified cdrom_lseek to be more tolerant to errors like the SONY original, adjusted CBT to apply to reading operations as well, adjusted CBT to be 5000us, adjusted speed limit for Accurate Reads to 2800KB/s (timed to the 36.864MHz IOP clock). - Fri Aug 21 18:52:47 2015 +0800 -rev820 - update lang Arabic; new lang Portuguese-Brazilian. - Sat Aug 15 18:03:17 2015 +0800 -rev819 - updated lang Arabic 90% translated; new lang Portuguese-Brazilian 100% translated. - Sat Aug 15 12:59:47 2015 +0800 -rev818 - Merged ifcaro/open-ps2-loader into default - Wed Aug 05 21:05:54 2015 -0700 -rev817 - Update LNG files to support OPL r813 changes, removed obsolete LNG files that need an overhaul. - Wed Aug 05 20:51:23 2015 -0700 -rev816 - Merged ifcaro/open-ps2-loader into default - Mon Aug 03 22:15:17 2015 -0700 -rev815 - Update LNG files credits and dates for OPL r811. - Mon Aug 03 18:29:26 2015 -0700 -rev814 - Re-added 'VGA 640x480i @60Hz' again GSM vmode for better game compatibility (avoid BSOD/freezing/no signal on certain games and VGA monitors) - Sun Aug 02 20:14:16 2015 -0700 -rev813 - Merged the CallBack Timer setting into Accurate Reads compat mode (applies to everything other than reads), new compat mode (High module storage @ 0x01C00000), EE core linkfile adjusted to have the stack before _end for better manageability, EE core will now always reset stack pointer to _end, and fixed blockSize within fat.c overflowing (resulted in extremely poor performance). - Sat Aug 01 16:37:38 2015 -0700 -rev812 - Fixed VMC size parameter for USB support, simplified LSN calculation for the first phase of cdrom_read() since integer division will truncate anyway, changed stray memcpy() call in fat.c to mips_memcpy(), fixed (updated) the delete and rename functions within supportbase, and fixed updating of the game list under USB mode after an item has been deleted/renamed. - Mon Aug 03 22:40:45 2015 -0400 -rev811 - Merged in Jay-Jay/open-ps2-loader (pull request #23) - Mon Aug 03 03:31:02 2015 +0800 -rev810 - Update more LNG files. - Mon Aug 03 01:13:56 2015 +0800 -rev809 - restored Makefile changes to default from last pushed commit, sorry - Sun Aug 02 03:39:44 2015 +0800 -rev808 - added a new word to LNG SRC files so it can be used to replace the word SETTINGS in the footer of main page so it can abbreviated in the LNG files without affecting the same full word in other areas; updated LNG files to include new changes in recent commits; French LNG updated 100% translated. - Tue Jul 28 13:29:14 2015 -0700 -rev807 - Imported fixes for SMAP (wrong watermark value) and IOMAN (incorrect declaration for lseek) stuff, fixed GSM extension's "ok" button, added patch entry for SRW IMPACT LE, removed NBNS's Rules.make file in favour of the common one, and adjusted in-game FAT driver's parameters and strategy to improve seeking performance. - Tue Jul 28 09:13:12 2015 -0700 -rev806 - Merged in Jay-Jay/open-ps2-loader (pull request #22) - Tue Jul 28 09:08:30 2015 -0700 -rev805 - Updating some LNG files. - Sun Aug 02 03:38:49 2015 +0800 -rev804 - Added missing files from previous commit, removed leftover SMB DMA address definition (disused since long ago) and removed leftover code that updated ReadPos (is now updated by CDVDMAN itself, not by the individual drivers). - Tue Jul 28 20:11:29 2015 +0800 -rev803 - Added a small FAT driver to in-game USB support. USB support no longer needs total disc image defragmentation and all sector sizes should be supported. - Mon Jul 27 01:46:03 2015 -0700 -rev802 - Changed game list-locking mechanism to use a semaphore, game list will now be locked when updated and drawn (mutually exclusive operations), deferred GUI operations will be cleared when the GUI is to be suspended (otherwise a crash might result because the requests would be for the previous GUI instance), fixed ELFLDR (wrong compile-time flags, hence IOP reset missing) by removing the RESET_IOP option, re-ordered code that checks for outstanding deferred GUI operations (guiHandleDeferredOps) to prevent potential crash if the linked-list is modified as it waits for the list to be unlocked (not done here, but IF), lowered the priority of the running thread to 90 in ioBlockOps() as it was starving lower-priority (NETMAN) threads, and removed redundant calls to SifInitRpc() in sysExecElf and sysLaunchLoaderElf. - Tue Jul 28 15:39:25 2015 +0800 -rev801 - Refactored config reading system to allow reading of config file from RAM (for future use), fixed IOMAN crashing due to the request list being set to NULL as it waits for the process sema to be released, fixed OPL getting stuck if HDLDump server could not be started, refactored directory-creation system to be unified and without the need for a redundant check, changed GSM controls to become read-only if GSM is disabled, completed moving the GSM stuff into pggsm.h, added missing "childproof" target into Makefile, consolidated the different IO handler types into opl.h, updated to build with the latest PS2SDK revision, added support for DNS (for future use and manual static setting will not be saved!), added a setting into opl.h that determiens whether the OPL source is a development version, blocking I/O operations in IOMAN will no longer pause I/O execution (oustanding I/O operations will be completed), the I/O request sema will be locked when the number of I/O requests are counted, error messages will now be cleared when HDLDump server is started, failures to start the HDLDump server will be stated, CFG folder will now be "CFG-DEV" instead for development builds, changed config-handling code to use the limits from config.h for key and value management, and changed network initialization to prevent deadlocks that occur during simultaneous initialization of HDLDump and SMB support. - Tue Jul 28 14:21:03 2015 +0800 -rev800 - Fixed SMB auto-refresh (CD, DVD and USBExtreme lists checked one-by-one) and refactored code in CDVDMAN and MCEMU for better coherency (USB, SMB and HDD-split up into individual files, for as much as possible). - Mon Jul 27 05:12:21 2015 +0800 -rev799 - BUGFIX: Replaced all calls (and related macros) to the FILEIO RPC service with FILEXIO. OPL is intermittently unstable when listing games, as the rom0:FILEIO module does not suspend interrupts before the DMA transfers for the dread() and getstat() functions (SONY BUGBUG!!). - Sun Jul 26 03:40:05 2015 +0800 -rev798 - Fixes: Added check for streaming status into CDVDMAN streaming system (for games that read after starting streaming), fixed broken CDVDMAN debug build, changed ambiguous debug strings in CDVDMAN, fixed length checking of ISO filenames and improved on error-handling code in supportbase.c. - Sun Jul 12 20:40:11 2015 +0800 -rev797 - Fixed and enhanced streaming support: - Sat Jul 11 03:25:55 2015 +0800 -rev796 - Consolidated error codes, added error codes for HDD mode, sync'ed with updates to HDD and PFS from PS2SDK, added workaround for clone/compatible network adaptors and corrected UV coordinates for texture-drawing. - Sat Jul 11 03:17:13 2015 +0800 -rev795 - Fixed NBNS support (unable to resolve NB names after first attempt), revised timeout clock value and adjusted code to prevent some other race-conditions from occuring, adjusted SMB support initialization code to always retry until the link mode can be set successfully, changed link mode setting and DHCP completion-checking intervals to 1 second (reduce strain on IOP), link mode will now be set once at initialization before the TCP/IP stack is initialized (avoid double-initializing the SMAP). Updated to support the new PS2SDK revision. - Sun Jun 28 18:18:52 2015 +0800 -rev794 - Fixed SMB intialization when built within VMC support, by moving the SMB initialization function into the "oplsmb" export table. - Sat Jun 20 20:06:02 2015 +0800 -rev793 - Moved SMB authentication code into a SMBINIT IOP module, so that SMB code can be modular and won't be part of the EE core itself. Fixed support for the USBLD format under SMB mode, renamed mode 5 to "Emulate DVD-DL", fixed filesystem selection within cdvdman_findfile() for mode 5, fixed NBNS support to check against the transaction ID as specified in the RFCs, changed the EE-side libnbns library into a normal C file for simplicity, and lowered the module storage region so that the occupied region will be as low as possible since SMB authentication code is now in an IOP module. - Tue Jun 16 21:50:14 2015 +0800 -rev792 - Rolled back the new changes to the UI's behaviour, added error-reporting code (reports READCF* errors) to reading functions within CDVDFSV, got ReadIOPM and ReadChain functions within CDVDFSV to report read progress to the EE library, added a new workaround for the SIF becoming unusable after an IOP reset with ongoing DMA transfers. - Sat May 30 13:02:35 2015 +0800 -rev791 - Updated to use the new SIF register definitions, to support automatic screen switching and hiding, USB, HDD and APP modes are now always enabled, added a toggle for hiding advanced network options, fixed CDVDFSV initialization (Initializing SIF on the main thread causes the IOP reset to stall; refer to SCE docs), fixed open(), dopen(), read(), dread() and getstat() to first wait for the, drive to become ready (and for read, forever attempt to read) to be in-line with the original behaviour of CDVDMAN, DEV9 will no longer be powered-off during IGR, the SIF register BOOTEND flag will now be cleared before every IOP reset, within the EE core to ensure correct behaviour, updated network support to ensure that timeouts are accurate regardless of the current video mode. - Thu Apr 16 21:59:05 2015 +0800 -rev790 - Updated to support the new PS2SDK revision, changed module management so that only the necessary modules will remain resident in-game, changed unloadPad() to call padEnd() instead of padReset() in order to actually stop the PADMAN RPC service, re-added the "ei" instruction to crt0, fixed the logic that determines whether the IP address config has been changed (When DHCP is enabled, re-arranged the EE core so that modules (0x0009A000) will now be stored after the EE core (0x00088000). - Sun Mar 29 16:35:13 2015 +0800 -rev789 - Updated to work with the new update to the PS2SDK (mainly with the renaming of the EE PS2IP over SIF RPC library, ps2ip, to ps2ips). - Sun Mar 22 19:14:28 2015 +0800 -rev788 - Changed OPL to use NETMAN and PS2IPS for full control over the network subsystem, SMAP (re-)initialization will no longer be done whenever unnecessary (valid link state = not needed) and renamed "smap" to become "smap-ingame". - Tue Mar 03 21:35:40 2015 +0800 -rev787 - Updated to support the new PS2SDK PS2IP module (LWIP v1.4.1) and updated PS2ETH SMAP driver, while yet maintaining support for the (in-game) SMSTCPIP stack which was based on an ancient version of LWIP. - Sat Feb 28 21:32:31 2015 +0800 -rev786 - Added support for the NBNS protocol, added functions for changing the visibility and type of UI elements without hardcoding the element's index number, changed the keyboard to hide passwords, and adjusted language string and some function names. - Sat Feb 28 15:58:29 2015 +0800 -rev785 - Added patches for Oneechanbara, Ratchet and Clank: Up Your Arsenal and updated SMAP. - Sat Feb 28 14:38:40 2015 +0800 -rev784 - Removed space-filler code in EESYNC, which is found only in some EESYNC versions, presumed to make up for the lesser space taken up by a Debug SECRMAN module. The export table has been removed too, as no module ever links with it. - Sun Feb 22 16:24:52 2015 +0800 -rev783 - New compatibility mode 1 (accurate reads) and the user callback will no longer be called during streaming (incorrect behaviour). - Fri Feb 20 13:44:46 2015 +0800 -rev782 - Fixed IOP resets with command lines that are not NULL-terminated (e.g. SOCOM games), added path-purification for cdrom_getstat(), "untweaked" the TCP/IP stack for GUI mode (better performance), fixed screen rendering (screen cut-off) under 480P mode, fixed default-theme scaling, added/fixed missing/incorrect UI hints. - Fri Feb 13 15:28:26 2015 +0800 -rev781 - upload new background image - Fri Feb 13 15:23:56 2015 +0800 -rev780 - Merged ifcaro/open-ps2-loader into default - Sun Feb 01 21:22:41 2015 +0800 -rev779 - remove background image to be able to sync with ifcaro repo - Wed Jan 28 23:09:41 2015 -0800 -rev778 - upload new background image - Wed Jan 28 22:59:46 2015 -0800 -rev777 - replace old background image - Wed Jan 28 22:59:06 2015 -0800 -rev776 - include bg_overlay.png background image - Wed Jan 28 22:35:58 2015 -0800 -rev775 - Merged ifcaro/open-ps2-loader into default - Wed Jan 28 22:31:55 2015 -0800 -rev774 - Merged ifcaro/open-ps2-loader into default - Tue Jan 27 23:35:32 2015 -0800 -rev773 - update opl.icn made it smaller in size with help from sav3r and updated icon load png files to match new modified opl logo key - Sat Jan 24 03:21:25 2015 -0800 -rev772 - made opl.icn smaller in size with help from sav3r and updated load png files to math new OPL logo key - Tue Jan 20 15:12:41 2015 -0800 -rev771 - Updated to compile w/o warnings on new PS2SDK revision, modified GUI to support loading of embedded resources for the internal theme, added menu hints, added an option for changing the select button. - Mon Jan 19 01:39:50 2015 -0800 -rev770 - Increased buffer size for path parsing to 32-bytes to handle slightly-malformed paths like how SCE does, fixed broken debug printf() statement, removed unnecessary checks that should be only used for debugging (as SCE doesn't perform them), added an additional backslash to SMB paths for compatibility with some SMB servers and changed the ELF-loading error screen (white) to be always shown regardless of the debug enabled/disabled setting. - Mon Jan 19 01:32:13 2015 -0800 -rev769 - Changed cdrom_open() to set f->mode to O_RDONLY for games that fail to specify O_RDONLY, re-adjusted the path-sanitizing code to function from only cdrom_open() in order to not affect cdrom_dopen(), and corrected non-compliant behaviour of (in-game) SMB support. - Wed Jan 28 23:18:46 2015 +0800 -rev768 - Fixed DVD-DL parameter passing for USB and SMB modes, fixed ISO filename handling (ISO file name without the startup file name) in USB mode. - Thu Jan 22 21:39:00 2015 +0800 -rev767 - Merged ifcaro/open-ps2-loader into default - Tue Jan 20 20:13:51 2015 +0800 -rev766 - update logo.png in gfx folder - Sat Jan 17 18:30:20 2015 +0800 -rev765 - made new gfx icons, removed logo.old, change default theme background color. - Fri Jan 16 23:29:57 2015 -0800 -rev764 - add missing logo.old to gfx folder - Tue Jan 13 01:39:53 2015 -0800 -rev763 - clean up old gfx files - Fri Jan 02 13:28:22 2015 -0800 -rev762 - Merged ifcaro/open-ps2-loader into default - Wed Dec 31 14:32:48 2014 -0800 -rev761 - Merged ifcaro/open-ps2-loader into default - Wed Dec 31 14:16:10 2014 -0800 -rev760 - delete logo.old_old file from gfx folder - Wed Dec 31 14:02:07 2014 -0800 -rev759 - update gfx artwork - Wed Dec 24 08:33:10 2014 -0800 -rev758 - Replaced the path-sanitizing code with something closer to the SCE-original, and fixed cdrom_dread() to NULL-terminate the filename. - Wed Dec 24 03:17:31 2014 -0800 -rev757 - Fixed DVD-DL detection over SMB for images >4GB, fixed DVD-DL handling for USB and SMB, updated OPL to support the new GCC 3.2.3 toolchain. - Wed Dec 24 02:55:10 2014 -0800 -rev756 - Fixed USBD module loading, DVD9 detection, one printf string in CDVDMAN (potential use of uninitialized pointer) and EP's name in the credits. - Sat Jan 17 12:22:24 2015 +0800 -rev755 - Prototype attempt at fixing DVD-DL support within PS2ESDL for USB and SMB modes. - Sat Jan 17 12:17:15 2015 +0800 -rev754 - Fixed UI freezing while user cycles through the games list, rolled back changes to the rename() function of the APA driver, integer values in the UI can now wrap around, changed module loading for better performance, fixed theme loading from USB devices, users no longer have to name their ISO images in a specific format and removed debugging code from regular OPL builds. - Sun Jan 11 14:22:16 2015 +0800 -rev753 - Aaand the Scheisse-Kopf Award goes to yours truly. For having convinced a sick - Sat Jan 10 23:08:56 2015 +0800 -rev752 - Removed broken game label in GSM screen; removed developer comments. - Sat Jan 10 13:47:04 2015 +0800 -rev751 - Fixed cheats support again, renamed the extension to .CHT from .cht (to be uniform with the naming convention of other OPL-related files), and corrected boundary-limiting when printing the path to the cheat record file in all modes. - Sun Dec 28 07:57:58 2014 -0500 -rev750 - Fixed cheats support. - Wed Dec 24 12:28:28 2014 -0500 -rev749 - Close branch psx_core/the-most-accurate-and-correct-translatio-1384761167035. - Thu Dec 25 00:57:51 2014 +0800 -rev748 - Close branch ps2rd-max-codes-250. - Thu Dec 25 00:18:17 2014 +0800 -rev747 - Removed unused compatibility mode 9 strings, added missing cheats status/error messages, updated art assets and modified the cheats engine to not use memory at 0x00080000 directly. - Wed Dec 24 16:15:07 2014 +0000 -rev746 - Fixed SMB support and updated changelog. - Wed Dec 24 16:15:04 2014 +0000 -rev745 - Updated changelog files, removed unused UI strings, updated UI string labels, replaced the hardcoded use of tools within Makefiles with variables like $BIN2S, merged support for the CXD9566R into general DEV9 support, and removed power-on code from in-game DEV9 driver. - Thu Dec 25 00:01:21 2014 +0800 -rev744 - (*) Our "About" menu now has a "Quality Assurance" section, officially showing - Wed Dec 24 10:06:56 2014 +0800 -rev743 - Re-added the GET HEADER IOCTL2 function, to the APA driver. Updated the English translation template. - Tue Dec 23 23:35:00 2014 +0800 -rev742 - Sync'ing with the HDD and PFS driver updates from PS2SDK, fixed freezing when the HDLDump server is closed and the games list is reopened, completed TODOs in ioman.c, removed workaround from config.c, added missing UI hints and changed the region-handling code to default to Japan. - Thu Dec 18 13:35:27 2014 -0500 -rev741 - Removed tag 0.9.3 - Sat Dec 13 14:52:32 2014 +0800 -rev740 - Removed tag 0.9.3 - Sat Dec 13 00:38:24 2014 +0800 -rev739 - Removed tag 0.9.3 - Fri Dec 12 16:06:42 2014 +0800 -rev738 - Removed tag 0.9.3 - Fri Dec 12 16:06:37 2014 +0800 +rev940 - BLURT output (for debugging purposes) - Tue Oct 11 10:28:29 2016 -0300 +rev939 - I also like to commit in two-phases...:p - Mon Oct 10 01:20:59 2016 -0300 +rev938 - Optional FMV fix (enabled by setting UNALIGNED_BUFFER_PATCH to 0) - Sun Oct 09 21:06:03 2016 -0300 +rev937 - Minor changes - Fri Oct 07 11:54:10 2016 -0300 +rev936 - Auto Start Last Game fix - Thu Oct 06 16:43:19 2016 -0300 +rev935 - GSM: Improved DISPFBx and DISPLAYx patching (both enabled as default). IGS: Bitmap/TXT Files created with the same automatic number - Mon Oct 03 15:24:30 2016 -0300 +rev934 - GSM: Fixes and improvements on Core Flags and Skip Videos (FMVs) functionality restoration - Mon Oct 03 07:28:47 2016 -0300 +rev933 - IGS improvements - Sat Oct 01 19:08:01 2016 -0300 +rev932 - SP193: USB Fragmentation Check enabled as default - Sat Oct 01 18:11:28 2016 -0300 +rev931 - IGS: 24-bit Pixel Storage Size memory alignment fix - Wed Sep 28 18:45:51 2016 -0300 +rev930 - IGS: 16-bit Pixel Storage Size (PSMCT16 and PSMCT16S) fix - Tue Sep 27 21:17:43 2016 -0300 +rev929 - IGS source code refactoring (several improvements and fixes) - Tue Sep 27 06:11:30 2016 -0300 +rev928 - IGS some header/api fixes/improvements. - Mon Sep 19 11:57:49 2016 -0300 +rev927 - IGS (InGame Screenshot Feature) initial commit. Update on GSM version & credits. - Thu Sep 15 20:13:41 2016 -0300 +rev926 - GSM Core additions - Thu Sep 15 18:35:06 2016 -0300 +rev925 - Update languages - Thu Sep 15 04:32:32 2016 -0300 +rev924 - Changed old lang_Turkish_0.9.3.lng useless name - Thu Sep 15 02:00:27 2016 +0000 +rev923 - Changed old lang_TChinese_0.9.3.lng useless name - Thu Sep 15 01:59:37 2016 +0000 +rev922 - Changed old lang_Swedish_0.9.3.lng useless name - Thu Sep 15 01:58:48 2016 +0000 +rev921 - Changed old lang_Spanish_0.9.3.lng useless name - Thu Sep 15 01:58:05 2016 +0000 +rev920 - Changed old lang_Russian_0.9.3.lng useless name - Thu Sep 15 01:57:11 2016 +0000 +rev919 - Changed old lang_Portuguese_BR_0.9.3.lng useless name - Thu Sep 15 01:56:21 2016 +0000 +rev918 - Changed old lang_Portuguese_0.9.3.lng useless name - Thu Sep 15 01:55:33 2016 +0000 +rev917 - Changed old lang_Polish_0.9.3.lng useless name - Thu Sep 15 01:54:41 2016 +0000 +rev916 - Changed old lang_Laotian_0.9.3.lng useless name - Thu Sep 15 01:53:53 2016 +0000 +rev915 - Changed old lang_Italian_0.9.3.lng useless name - Thu Sep 15 01:52:59 2016 +0000 +rev914 - Changed old lang_Indonesian_0.9.3.lng useless name - Thu Sep 15 01:51:56 2016 +0000 +rev913 - Changed old lang_German_0.9.3.lng useless name - Thu Sep 15 01:51:10 2016 +0000 +rev912 - Changed old lang_French_0.9.3.lng useless name - Thu Sep 15 01:49:31 2016 +0000 +rev911 - Changed old lang_English_0.9.3.lng useless name - Thu Sep 15 01:47:57 2016 +0000 +rev910 - Changed old lang_Czech_0.9.3.lng useless name - Thu Sep 15 01:42:49 2016 +0000 +rev909 - Changed old lang_Bulgarian_0.9.3.lng useless name - Thu Sep 15 01:40:28 2016 +0000 +rev908 - Changed old useless name - Thu Sep 15 01:33:16 2016 +0000 +rev907 - GSM Internals: New SMODE1, SYNCH1, SYNCH2 & SYNCV macros; magic numbers on predef VModes replaced to their corresponding SYNCV values - Sun Sep 11 16:05:38 2016 -0300 +rev906 - GSM & Cheat Engine gardening - Sat Sep 10 07:36:08 2016 -0300 +rev905 - Cheat Engine: Warning instead of a message box, when no cheats have been found - Sat Sep 10 07:00:01 2016 -0300 +rev904 - Proper naming of VMC, GSM and CHEAT preprocessor conditionals - Sat Sep 10 06:46:16 2016 -0300 +rev903 - VGA GSM vmode adjustments - Mon Sep 05 02:29:10 2016 -0300 +rev902 - VGA GSM vmode fixes - Sat Sep 03 09:45:58 2016 -0300 +rev901 - Re-added several VGA GSM vmodes for better game compatibility - Tue Aug 30 16:57:49 2016 -0300 +rev900 - ConsoleRegion functionality fix - Mon Aug 29 07:27:19 2016 -0300 +rev899 - Rollback changes made to delay() for avoiding BSOD - Fri Aug 26 15:34:41 2016 -0300 +rev898 - Some revisions on Makefiles - Fri Aug 26 12:03:54 2016 -0300 +rev897 - EE Core debug message bugfix - Fri Aug 26 11:59:48 2016 -0300 +rev896 - PS2Logo (less time on its GUI debug warning messages) - Fri Aug 26 11:57:15 2016 -0300 +rev895 - PS2Logo bugfix - Fri Aug 26 11:54:51 2016 -0300 +rev894 - 'Playstation 2' boot logo GUI setting (on/off) - Thu Aug 25 21:01:42 2016 -0300 +rev893 - Gardening - Thu Aug 25 14:22:26 2016 -0300 +rev892 - IGR: Green and Blue Debug Colors adjust - Mon Aug 22 10:13:15 2016 -0300 +rev891 - IGR: Yellow Debug Color adjust - Mon Aug 22 08:31:19 2016 -0300 +rev890 - PS2LOGO improvements and new GUI Warning messages - Fri Aug 19 20:55:58 2016 -0300 +rev889 - guiWarning: tweaks for displaying multi-line strings - Fri Aug 19 20:42:22 2016 -0300 +rev888 - New Makefile variable (for developers) - Fri Aug 19 20:36:58 2016 -0300 +rev887 - PS2LOGO flag fixes (in Makefile) - Sun Aug 14 08:41:36 2016 -0300 +rev886 - IOP Memory Usage Warning (works together with Debug Colors). - Sat Aug 13 19:51:42 2016 -0300 +rev885 - Functions added: guiWarning(GUI) & delay(Util) - Fri Aug 12 11:42:28 2016 -0300 +rev884 - 'Playstation 2' boot logo & startup sound - l_oliveira's code optimizations - Tue Aug 09 00:00:44 2016 -0300 +rev883 - SP193: PS3 BC(Backwards Compatible) fixes - Mon Aug 08 16:19:43 2016 -0300 +rev882 - 'Playstation 2' boot logo & startup sound - Mon Aug 08 10:21:15 2016 -0300 +rev881 - Reduced PS2RD string size in About Screen - Sun Aug 07 18:18:13 2016 -0300 +rev880 - Updated for compiling with latest PS2SDK revision - Thu Aug 04 15:33:21 2016 -0300 +rev879 - () Turns out Hommi's ASM is in the PS2SDK as "Exit(0)" so replicating it here - Sat May 14 12:29:00 2016 -0400 +rev878 - (*) Changed the "sysExecExit()" function call, reverted it to Hominem's - Sat May 14 00:28:03 2016 -0400 +rev877 - GSM 0.38 Core readded (now fully PS2RD compatible)* - Tue Jan 05 05:19:55 2016 -0500 +rev876 - Restorations and addtions - Wed Dec 23 13:00:14 2015 +0100 +rev875 - About Menu: Credits added - Wed Nov 04 18:48:54 2015 -0500 +rev874 - Updated changelog - Wed Nov 04 02:16:05 2015 +0100 +rev873 - lang_Turkish.lng deleted - Wed Nov 04 00:38:44 2015 +0000 +rev872 - lang_TChinese.lng deleted - Wed Nov 04 00:38:17 2015 +0000 +rev871 - lang_Swedish.lng deleted - Wed Nov 04 00:37:48 2015 +0000 +rev870 - lang_Spanish.lng deleted - Wed Nov 04 00:37:21 2015 +0000 +rev869 - lang_Russian.lng deleted - Wed Nov 04 00:36:55 2015 +0000 +rev868 - lang_Portuguese_BR.lng deleted - Wed Nov 04 00:36:21 2015 +0000 +rev867 - lang_Portuguese.lng deleted - Wed Nov 04 00:35:45 2015 +0000 +rev866 - lang_Polish.lng deleted - Wed Nov 04 00:35:19 2015 +0000 +rev865 - lang_Laotian.lng deleted - Wed Nov 04 00:34:36 2015 +0000 +rev864 - lang_Italian.lng deleted - Wed Nov 04 00:33:50 2015 +0000 +rev863 - lang_Indonesian.lng deleted - Wed Nov 04 00:33:12 2015 +0000 +rev862 - lang_German.lng deleted - Wed Nov 04 00:32:35 2015 +0000 +rev861 - lang_French.lng deleted - Wed Nov 04 00:31:25 2015 +0000 +rev860 - lang_English.lng deleted - Wed Nov 04 00:30:21 2015 +0000 +rev859 - lang_Czech.lng deleted - Wed Nov 04 00:26:29 2015 +0000 +rev858 - lang_Czech.lng deleted - Wed Nov 04 00:24:03 2015 +0000 +rev857 - lang_Bulgarian.lng deleted - Wed Nov 04 00:23:36 2015 +0000 +rev856 - lang_Arabic.lng deleted online with Bitbucket - Wed Nov 04 00:19:25 2015 +0000 +rev855 - Updated languages - Wed Nov 04 01:07:43 2015 +0100 +rev854 - Update languages - Sun Oct 25 13:05:27 2015 +0100 +rev853 - writeMCIcon MC Folder Creation fix - Reported by Grahf, fixed by SP193 - Fri Oct 23 13:30:20 2015 -0400 +rev852 - Change version to 'OPL 0.9.4 WIP', re-enable development build flag - Fri Oct 23 04:16:22 2015 -0400 +rev851 - Added tag 0.9.3 for changeset 9b5321def22d - Wed Oct 21 00:59:28 2015 -0400 +rev850 - Massive language update: Arabic, Brazilian Portuguese, Bulgarian, French, Portuguese, Russian, Spanish and Traditional Chinese. - Wed Oct 21 00:49:42 2015 -0400 +rev849 - Updated: Polish language - summary: Massive language upArabic, Brazilian Portuguese, Bulgarian, French, Portuguese, Russian, Spanish and Traditional Chinese. +rev848 - About Menu: Contributors added, followed by case-insensitive sorting - Mon Oct 19 16:16:25 2015 -0400 +rev847 - SP193 - Fixed renaming functionality for USBExtreme games + DEV9 will not be activated unless either Ethernet or ATA is used: - Mon Oct 19 15:37:15 2015 -0400 +rev846 - Jay-Jay'n'gledson999:Portuguese BR language fix - Sat Oct 17 21:47:36 2015 -0400 +rev845 - Updated Portuguese BR language - Thu Oct 08 01:45:29 2015 -0400 +rev844 - SP193: HDD unit will be checked for fonts only if HDD support is set to AUTO. - Mon Oct 05 14:07:48 2015 -0400 +rev843 - Added Traditional Chinese language (It was missing in r840... Sorry) - Mon Oct 05 08:33:33 2015 -0400 +rev842 - Update German Language and Update Theme Icons - Sun Oct 04 20:55:55 2015 -0400 +rev841 - Readded width specifiers on Game Settings Page. Let's help each other and work as a team ;-) - Sun Oct 04 05:21:30 2015 -0700 +rev840 - Translations Updated (French, Portuguese BR and Spanish) and Added (Traditional Chinese). Let's help each other and work as a team ;-) - Sun Oct 04 06:51:43 2015 -0400 +rev839 - Update Language Translation Files - Sun Oct 04 06:34:32 2015 -0400 +rev838 - Update Language Translation Files - Sat Oct 03 17:12:30 2015 -0700 +rev837 - Newest SP193's 0.9.3 patch - Mode x Labels :-) Remember guys we still need updated language files for 0.9.3 :-( - Sat Oct 03 13:54:36 2015 -0700 +rev836 - Here is SP193's 0.9.3 patch :-) But we still need updated language files :-( - Sat Oct 03 07:07:24 2015 -0400 +rev835 - Update Spanish translation - Sat Oct 03 02:06:26 2015 -0400 +rev834 - About Menu: Credits listed in alphabetical order - Wed Sep 30 20:46:49 2015 +0200 +rev833 - Deleted: scripts/out.txt - Tue Sep 29 21:16:38 2015 -0400 +rev832 - Auto Start Last Game - Configureable Countdown : Value in second(s), 0 to disable auto start - Tue Sep 29 08:20:27 2015 +0000 +rev831 - Fixes for VMC (compilation warning) and Auto-start Last Game (bugs and conflicts) - Mon Sep 28 10:43:25 2015 -0400 +rev830 - Auto-start feature fix - Wait for pending operations to finish - Sun Sep 27 21:09:19 2015 -0400 +rev829 - Added Autostart toggle for Last Played Game feature: When enabled, starts the chosen game automatically within a few seconds - unless the user presses any valid key. - Wed Sep 23 14:00:43 2015 -0400 +rev828 - OPL Spanish translation by El_Patas - Wed Sep 23 05:16:42 2015 -0400 +rev827 - update language files and also fonts - Sat Sep 19 06:55:27 2015 -0400 +rev826 - update language files - Thu Sep 17 01:21:16 2015 -0700 +rev825 - Now Last Played Game feature starts the chosen game automatically within a few seconds - unless the user presses any valid key. - Sat Sep 05 22:05:46 2015 -0700 +rev824 - Rollback: removed FAT driver from in-game. New universal system added to support non-standard sector sizes. - Thu Sep 03 02:54:19 2015 -0400 +rev823 - Added support for downloading compatibility entries through the Internet from the OPL-CL service. - Sun Aug 30 02:46:25 2015 +0800 +rev822 - Removed locking semaphore for game list, GUI OPs will now be cleared before the menu is cleared prior to game list updating (so that old commands will not be executed) and added checks for file-open problems under USB support. - Fri Aug 21 18:52:47 2015 +0800 +rev821 - Updated to support the new PS2SDK changes (SIF CMD buffer set, USBHDFSDV SIF CMD ID changed to 0), USBHDFSD IOCTL codes consolidated into usb-ioctl.h, standardized which "prefix" buffer to use within usbsupport.c (was unable to access game files when a prefix is set, due to the path getting incorrectly generated), removed cdrom_lseek64 as it is not implemented in the SONY CDVDMAN, changed cdrom_dclose to become cdrom_close since close() and dclose() are the same here and SONY does it that way too, simplified cdrom_lseek to be more tolerant to errors like the SONY original, adjusted CBT to apply to reading operations as well, adjusted CBT to be 5000us, adjusted speed limit for Accurate Reads to 2800KB/s (timed to the 36.864MHz IOP clock). - Sat Aug 15 18:03:17 2015 +0800 +rev820 - update lang Arabic; new lang Portuguese-Brazilian. - Sat Aug 15 12:59:47 2015 +0800 +rev819 - updated lang Arabic 90% translated; new lang Portuguese-Brazilian 100% translated. - Wed Aug 05 21:05:54 2015 -0700 +rev818 - Merged ifcaro/open-ps2-loader into default - Wed Aug 05 20:51:23 2015 -0700 +rev817 - Update LNG files to support OPL r813 changes, removed obsolete LNG files that need an overhaul. - Mon Aug 03 22:15:17 2015 -0700 +rev816 - Merged ifcaro/open-ps2-loader into default - Mon Aug 03 18:29:26 2015 -0700 +rev815 - Update LNG files credits and dates for OPL r811. - Sun Aug 02 20:14:16 2015 -0700 +rev814 - Re-added 'VGA 640x480i @60Hz' again GSM vmode for better game compatibility (avoid BSOD/freezing/no signal on certain games and VGA monitors) - Sat Aug 01 16:37:38 2015 -0700 +rev813 - Merged the CallBack Timer setting into Accurate Reads compat mode (applies to everything other than reads), new compat mode (High module storage @ 0x01C00000), EE core linkfile adjusted to have the stack before _end for better manageability, EE core will now always reset stack pointer to _end, and fixed blockSize within fat.c overflowing (resulted in extremely poor performance). - Mon Aug 03 22:40:45 2015 -0400 +rev812 - Fixed VMC size parameter for USB support, simplified LSN calculation for the first phase of cdrom_read() since integer division will truncate anyway, changed stray memcpy() call in fat.c to mips_memcpy(), fixed (updated) the delete and rename functions within supportbase, and fixed updating of the game list under USB mode after an item has been deleted/renamed. - Mon Aug 03 03:31:02 2015 +0800 +rev811 - Merged in Jay-Jay/open-ps2-loader (pull request #23) - Mon Aug 03 01:13:56 2015 +0800 +rev810 - Update more LNG files. - Sun Aug 02 03:39:44 2015 +0800 +rev809 - restored Makefile changes to default from last pushed commit, sorry - Tue Jul 28 13:29:14 2015 -0700 +rev808 - added a new word to LNG SRC files so it can be used to replace the word SETTINGS in the footer of main page so it can abbreviated in the LNG files without affecting the same full word in other areas; updated LNG files to include new changes in recent commits; French LNG updated 100% translated. - Tue Jul 28 09:13:12 2015 -0700 +rev807 - Imported fixes for SMAP (wrong watermark value) and IOMAN (incorrect declaration for lseek) stuff, fixed GSM extension's "ok" button, added patch entry for SRW IMPACT LE, removed NBNS's Rules.make file in favour of the common one, and adjusted in-game FAT driver's parameters and strategy to improve seeking performance. - Tue Jul 28 09:08:30 2015 -0700 +rev806 - Merged in Jay-Jay/open-ps2-loader (pull request #22) - Sun Aug 02 03:38:49 2015 +0800 +rev805 - Updating some LNG files. - Tue Jul 28 20:11:29 2015 +0800 +rev804 - Added missing files from previous commit, removed leftover SMB DMA address definition (disused since long ago) and removed leftover code that updated ReadPos (is now updated by CDVDMAN itself, not by the individual drivers). - Mon Jul 27 01:46:03 2015 -0700 +rev803 - Added a small FAT driver to in-game USB support. USB support no longer needs total disc image defragmentation and all sector sizes should be supported. - Tue Jul 28 15:39:25 2015 +0800 +rev802 - Changed game list-locking mechanism to use a semaphore, game list will now be locked when updated and drawn (mutually exclusive operations), deferred GUI operations will be cleared when the GUI is to be suspended (otherwise a crash might result because the requests would be for the previous GUI instance), fixed ELFLDR (wrong compile-time flags, hence IOP reset missing) by removing the RESET_IOP option, re-ordered code that checks for outstanding deferred GUI operations (guiHandleDeferredOps) to prevent potential crash if the linked-list is modified as it waits for the list to be unlocked (not done here, but IF), lowered the priority of the running thread to 90 in ioBlockOps() as it was starving lower-priority (NETMAN) threads, and removed redundant calls to SifInitRpc() in sysExecElf and sysLaunchLoaderElf. - Tue Jul 28 14:21:03 2015 +0800 +rev801 - Refactored config reading system to allow reading of config file from RAM (for future use), fixed IOMAN crashing due to the request list being set to NULL as it waits for the process sema to be released, fixed OPL getting stuck if HDLDump server could not be started, refactored directory-creation system to be unified and without the need for a redundant check, changed GSM controls to become read-only if GSM is disabled, completed moving the GSM stuff into pggsm.h, added missing "childproof" target into Makefile, consolidated the different IO handler types into opl.h, updated to build with the latest PS2SDK revision, added support for DNS (for future use and manual static setting will not be saved!), added a setting into opl.h that determiens whether the OPL source is a development version, blocking I/O operations in IOMAN will no longer pause I/O execution (oustanding I/O operations will be completed), the I/O request sema will be locked when the number of I/O requests are counted, error messages will now be cleared when HDLDump server is started, failures to start the HDLDump server will be stated, CFG folder will now be "CFG-DEV" instead for development builds, changed config-handling code to use the limits from config.h for key and value management, and changed network initialization to prevent deadlocks that occur during simultaneous initialization of HDLDump and SMB support. - Mon Jul 27 05:12:21 2015 +0800 +rev800 - Fixed SMB auto-refresh (CD, DVD and USBExtreme lists checked one-by-one) and refactored code in CDVDMAN and MCEMU for better coherency (USB, SMB and HDD-split up into individual files, for as much as possible). - Sun Jul 26 03:40:05 2015 +0800 +rev799 - BUGFIX: Replaced all calls (and related macros) to the FILEIO RPC service with FILEXIO. OPL is intermittently unstable when listing games, as the rom0:FILEIO module does not suspend interrupts before the DMA transfers for the dread() and getstat() functions (SONY BUGBUG!!). - Sun Jul 12 20:40:11 2015 +0800 +rev798 - Fixes: Added check for streaming status into CDVDMAN streaming system (for games that read after starting streaming), fixed broken CDVDMAN debug build, changed ambiguous debug strings in CDVDMAN, fixed length checking of ISO filenames and improved on error-handling code in supportbase.c. - Sat Jul 11 03:25:55 2015 +0800 +rev797 - Fixed and enhanced streaming support: - Sat Jul 11 03:17:13 2015 +0800 +rev796 - Consolidated error codes, added error codes for HDD mode, sync'ed with updates to HDD and PFS from PS2SDK, added workaround for clone/compatible network adaptors and corrected UV coordinates for texture-drawing. - Sun Jun 28 18:18:52 2015 +0800 +rev795 - Fixed NBNS support (unable to resolve NB names after first attempt), revised timeout clock value and adjusted code to prevent some other race-conditions from occuring, adjusted SMB support initialization code to always retry until the link mode can be set successfully, changed link mode setting and DHCP completion-checking intervals to 1 second (reduce strain on IOP), link mode will now be set once at initialization before the TCP/IP stack is initialized (avoid double-initializing the SMAP). Updated to support the new PS2SDK revision. - Sat Jun 20 20:06:02 2015 +0800 +rev794 - Fixed SMB intialization when built within VMC support, by moving the SMB initialization function into the "oplsmb" export table. - Tue Jun 16 21:50:14 2015 +0800 +rev793 - Moved SMB authentication code into a SMBINIT IOP module, so that SMB code can be modular and won't be part of the EE core itself. Fixed support for the USBLD format under SMB mode, renamed mode 5 to "Emulate DVD-DL", fixed filesystem selection within cdvdman_findfile() for mode 5, fixed NBNS support to check against the transaction ID as specified in the RFCs, changed the EE-side libnbns library into a normal C file for simplicity, and lowered the module storage region so that the occupied region will be as low as possible since SMB authentication code is now in an IOP module. - Sat May 30 13:02:35 2015 +0800 +rev792 - Rolled back the new changes to the UI's behaviour, added error-reporting code (reports READCF* errors) to reading functions within CDVDFSV, got ReadIOPM and ReadChain functions within CDVDFSV to report read progress to the EE library, added a new workaround for the SIF becoming unusable after an IOP reset with ongoing DMA transfers. - Thu Apr 16 21:59:05 2015 +0800 +rev791 - Updated to use the new SIF register definitions, to support automatic screen switching and hiding, USB, HDD and APP modes are now always enabled, added a toggle for hiding advanced network options, fixed CDVDFSV initialization (Initializing SIF on the main thread causes the IOP reset to stall; refer to SCE docs), fixed open(), dopen(), read(), dread() and getstat() to first wait for the, drive to become ready (and for read, forever attempt to read) to be in-line with the original behaviour of CDVDMAN, DEV9 will no longer be powered-off during IGR, the SIF register BOOTEND flag will now be cleared before every IOP reset, within the EE core to ensure correct behaviour, updated network support to ensure that timeouts are accurate regardless of the current video mode. - Sun Mar 29 16:35:13 2015 +0800 +rev790 - Updated to support the new PS2SDK revision, changed module management so that only the necessary modules will remain resident in-game, changed unloadPad() to call padEnd() instead of padReset() in order to actually stop the PADMAN RPC service, re-added the "ei" instruction to crt0, fixed the logic that determines whether the IP address config has been changed (When DHCP is enabled, re-arranged the EE core so that modules (0x0009A000) will now be stored after the EE core (0x00088000). - Sun Mar 22 19:14:28 2015 +0800 +rev789 - Updated to work with the new update to the PS2SDK (mainly with the renaming of the EE PS2IP over SIF RPC library, ps2ip, to ps2ips). - Tue Mar 03 21:35:40 2015 +0800 +rev788 - Changed OPL to use NETMAN and PS2IPS for full control over the network subsystem, SMAP (re-)initialization will no longer be done whenever unnecessary (valid link state = not needed) and renamed "smap" to become "smap-ingame". - Sat Feb 28 21:32:31 2015 +0800 +rev787 - Updated to support the new PS2SDK PS2IP module (LWIP v1.4.1) and updated PS2ETH SMAP driver, while yet maintaining support for the (in-game) SMSTCPIP stack which was based on an ancient version of LWIP. - Sat Feb 28 15:58:29 2015 +0800 +rev786 - Added support for the NBNS protocol, added functions for changing the visibility and type of UI elements without hardcoding the element's index number, changed the keyboard to hide passwords, and adjusted language string and some function names. - Sat Feb 28 14:38:40 2015 +0800 +rev785 - Added patches for Oneechanbara, Ratchet and Clank: Up Your Arsenal and updated SMAP. - Sun Feb 22 16:24:52 2015 +0800 +rev784 - Removed space-filler code in EESYNC, which is found only in some EESYNC versions, presumed to make up for the lesser space taken up by a Debug SECRMAN module. The export table has been removed too, as no module ever links with it. - Fri Feb 20 13:44:46 2015 +0800 +rev783 - New compatibility mode 1 (accurate reads) and the user callback will no longer be called during streaming (incorrect behaviour). - Fri Feb 13 15:28:26 2015 +0800 +rev782 - Fixed IOP resets with command lines that are not NULL-terminated (e.g. SOCOM games), added path-purification for cdrom_getstat(), "untweaked" the TCP/IP stack for GUI mode (better performance), fixed screen rendering (screen cut-off) under 480P mode, fixed default-theme scaling, added/fixed missing/incorrect UI hints. - Fri Feb 13 15:23:56 2015 +0800 +rev781 - upload new background image - Sun Feb 01 21:22:41 2015 +0800 +rev780 - Merged ifcaro/open-ps2-loader into default - Wed Jan 28 23:09:41 2015 -0800 +rev779 - remove background image to be able to sync with ifcaro repo - Wed Jan 28 22:59:46 2015 -0800 +rev778 - upload new background image - Wed Jan 28 22:59:06 2015 -0800 +rev777 - replace old background image - Wed Jan 28 22:35:58 2015 -0800 +rev776 - include bg_overlay.png background image - Wed Jan 28 22:31:55 2015 -0800 +rev775 - Merged ifcaro/open-ps2-loader into default - Tue Jan 27 23:35:32 2015 -0800 +rev774 - Merged ifcaro/open-ps2-loader into default - Sat Jan 24 03:21:25 2015 -0800 +rev773 - update opl.icn made it smaller in size with help from sav3r and updated icon load png files to match new modified opl logo key - Tue Jan 20 15:12:41 2015 -0800 +rev772 - made opl.icn smaller in size with help from sav3r and updated load png files to math new OPL logo key - Mon Jan 19 01:39:50 2015 -0800 +rev771 - Updated to compile w/o warnings on new PS2SDK revision, modified GUI to support loading of embedded resources for the internal theme, added menu hints, added an option for changing the select button. - Mon Jan 19 01:32:13 2015 -0800 +rev770 - Increased buffer size for path parsing to 32-bytes to handle slightly-malformed paths like how SCE does, fixed broken debug printf() statement, removed unnecessary checks that should be only used for debugging (as SCE doesn't perform them), added an additional backslash to SMB paths for compatibility with some SMB servers and changed the ELF-loading error screen (white) to be always shown regardless of the debug enabled/disabled setting. - Wed Jan 28 23:18:46 2015 +0800 +rev769 - Changed cdrom_open() to set f->mode to O_RDONLY for games that fail to specify O_RDONLY, re-adjusted the path-sanitizing code to function from only cdrom_open() in order to not affect cdrom_dopen(), and corrected non-compliant behaviour of (in-game) SMB support. - Thu Jan 22 21:39:00 2015 +0800 +rev768 - Fixed DVD-DL parameter passing for USB and SMB modes, fixed ISO filename handling (ISO file name without the startup file name) in USB mode. - Tue Jan 20 20:13:51 2015 +0800 +rev767 - Merged ifcaro/open-ps2-loader into default - Sat Jan 17 18:30:20 2015 +0800 +rev766 - update logo.png in gfx folder - Fri Jan 16 23:29:57 2015 -0800 +rev765 - made new gfx icons, removed logo.old, change default theme background color. - Tue Jan 13 01:39:53 2015 -0800 +rev764 - add missing logo.old to gfx folder - Fri Jan 02 13:28:22 2015 -0800 +rev763 - clean up old gfx files - Wed Dec 31 14:32:48 2014 -0800 +rev762 - Merged ifcaro/open-ps2-loader into default - Wed Dec 31 14:16:10 2014 -0800 +rev761 - Merged ifcaro/open-ps2-loader into default - Wed Dec 31 14:02:07 2014 -0800 +rev760 - delete logo.old_old file from gfx folder - Wed Dec 24 08:33:10 2014 -0800 +rev759 - update gfx artwork - Wed Dec 24 03:17:31 2014 -0800 +rev758 - Replaced the path-sanitizing code with something closer to the SCE-original, and fixed cdrom_dread() to NULL-terminate the filename. - Wed Dec 24 02:55:10 2014 -0800 +rev757 - Fixed DVD-DL detection over SMB for images >4GB, fixed DVD-DL handling for USB and SMB, updated OPL to support the new GCC 3.2.3 toolchain. - Sat Jan 17 12:22:24 2015 +0800 +rev756 - Fixed USBD module loading, DVD9 detection, one printf string in CDVDMAN (potential use of uninitialized pointer) and EP's name in the credits. - Sat Jan 17 12:17:15 2015 +0800 +rev755 - Prototype attempt at fixing DVD-DL support within PS2ESDL for USB and SMB modes. - Sun Jan 11 14:22:16 2015 +0800 +rev754 - Fixed UI freezing while user cycles through the games list, rolled back changes to the rename() function of the APA driver, integer values in the UI can now wrap around, changed module loading for better performance, fixed theme loading from USB devices, users no longer have to name their ISO images in a specific format and removed debugging code from regular OPL builds. - Sat Jan 10 23:08:56 2015 +0800 +rev753 - Aaand the Scheisse-Kopf Award goes to yours truly. For having convinced a sick - Sat Jan 10 13:47:04 2015 +0800 +rev752 - Removed broken game label in GSM screen; removed developer comments. - Sun Dec 28 07:57:58 2014 -0500 +rev751 - Fixed cheats support again, renamed the extension to .CHT from .cht (to be uniform with the naming convention of other OPL-related files), and corrected boundary-limiting when printing the path to the cheat record file in all modes. - Wed Dec 24 12:28:28 2014 -0500 +rev750 - Fixed cheats support. - Thu Dec 25 00:57:51 2014 +0800 +rev749 - Close branch psx_core/the-most-accurate-and-correct-translatio-1384761167035. - Thu Dec 25 00:18:17 2014 +0800 +rev748 - Close branch ps2rd-max-codes-250. - Wed Dec 24 16:15:07 2014 +0000 +rev747 - Removed unused compatibility mode 9 strings, added missing cheats status/error messages, updated art assets and modified the cheats engine to not use memory at 0x00080000 directly. - Wed Dec 24 16:15:04 2014 +0000 +rev746 - Fixed SMB support and updated changelog. - Thu Dec 25 00:01:21 2014 +0800 +rev745 - Updated changelog files, removed unused UI strings, updated UI string labels, replaced the hardcoded use of tools within Makefiles with variables like $BIN2S, merged support for the CXD9566R into general DEV9 support, and removed power-on code from in-game DEV9 driver. - Wed Dec 24 10:06:56 2014 +0800 +rev744 - (*) Our "About" menu now has a "Quality Assurance" section, officially showing - Tue Dec 23 23:35:00 2014 +0800 +rev743 - Re-added the GET HEADER IOCTL2 function, to the APA driver. Updated the English translation template. - Thu Dec 18 13:35:27 2014 -0500 +rev742 - Sync'ing with the HDD and PFS driver updates from PS2SDK, fixed freezing when the HDLDump server is closed and the games list is reopened, completed TODOs in ioman.c, removed workaround from config.c, added missing UI hints and changed the region-handling code to default to Japan. - Sat Dec 13 14:52:32 2014 +0800 +rev741 - Removed tag 0.9.3 - Sat Dec 13 00:38:24 2014 +0800 +rev740 - Removed tag 0.9.3 - Fri Dec 12 16:06:42 2014 +0800 +rev739 - Removed tag 0.9.3 - Fri Dec 12 16:06:37 2014 +0800 +rev738 - Removed tag 0.9.3 - Fri Dec 12 16:06:36 2014 +0800 rev737 - Removed tag 0.9.3 - Fri Dec 12 16:06:36 2014 +0800 -rev736 - Removed tag 0.9.3 - Fri Dec 12 16:06:36 2014 +0800 -rev735 - Removed tag 0.9.3 - Fri Dec 12 16:06:35 2014 +0800 -rev734 - Rewrote HDD support to use the PS2 APA driver instead of HDLDump's code. - Fri Dec 12 16:06:34 2014 +0800 -rev733 - Dumbed-down the locking mechanism to use only sync_flag, as the use of the event flag APIs will still not totally protect against simultaneous access from an interrupt handler (It'll probably only fully work if the whole code was run from a syscall, but even SCE never did that). - Fri Dec 12 16:06:07 2014 +0800 -rev732 - Modified cdrom_read() to minimize the number of copy processes. - Wed Dec 10 22:37:03 2014 +0800 -rev731 - Added a fully streaming system. - Sun Nov 30 16:02:34 2014 +0800 -rev730 - Fixed sceCdChangeThreadPriority to not change the main thread priority* and added RPC support for it, added thread IDs for OPL's threads**, and added support for a streaming function callback***. - Sun Nov 30 15:57:45 2014 +0800 -rev729 - Replaced the old signaling system with one that works more like the SCE original, and fixed an age-long offset-calculation bug in CDVDFSV. - Sun Nov 30 15:55:35 2014 +0800 -rev728 - Removed the use of (internal & non-standard) sceCdRead0 function, old (unused) reading core and refactored the reading system. - Sun Nov 30 15:29:16 2014 +0800 -rev727 - (*) Useless GSM VMODE Removal (1st draft) - Sun Nov 30 15:09:37 2014 +0800 -rev726 - (*) Hey Bat, try not to break non-GSM builds of OPL next time, willya?!? *LOL* - Sun Nov 30 14:13:05 2014 +0800 -rev725 - (*) Decided to let the new logo escape the asylum. Those who want to classic - Thu Nov 20 04:11:28 2014 -0500 -rev724 - Sync-Merged with ifcaro/open-ps2-loader - Mon Nov 10 13:09:00 2014 -0500 -rev723 - (*) Per-Game GSM is COMPLETE! Repository frozen for now. Thanks to SP193 for - Mon Nov 10 04:42:25 2014 -0500 -rev722 - (*) Whoops! - Sun Nov 09 16:11:59 2014 -0500 -rev721 - (*) Went to far re-globalizing GSM - Sat Nov 08 16:25:46 2014 -0500 -rev720 - (*) Re-globalized GSM - Sat Nov 08 10:30:24 2014 -0500 -rev719 - (*) Per-Game GSM Complete (I think). There were two solutions to the issue. I - Fri Nov 07 22:05:32 2014 -0500 -rev718 - Merged ifcaro/open-ps2-loader into default - Wed Nov 05 19:51:47 2014 -0500 -rev717 - Added tag 0.9.3 for changeset 1fbd6857681b - Mon Nov 03 23:31:15 2014 -0500 -rev716 - (*) Per-Game GSM (In One Commit) - couldn't make sense of the shit I had - Mon Nov 03 15:34:49 2014 -0500 -rev715 - Merged in Aced14/open-ps2-loader/ps2rd-max-codes-250 (pull request #11) - Sat Nov 01 10:26:48 2014 -0400 -rev714 - Increased ps2rd's cheat line limit (MAX_CODES) to 250. - Sat Nov 01 10:26:12 2014 -0400 -rev713 - Improved IGR stability (E P), fixed MC slot 1 use when a VMC is mounted as the 2nd slot (E P), fixed art drawing, fixed poor game list loading performance and brought forward texture cache initialization. - Sun Nov 09 19:16:08 2014 +0800 -rev712 - Replaced all obsolete Makefile rule files with a common file and integrated the discID module into the EE side. - Sun Nov 09 04:25:05 2014 -0500 -rev711 - Changed auto-refresh behaviour and fixed the SMB reconnect option: - Mon Nov 03 21:35:05 2014 +0800 -rev710 - Updated the GUI to have device-dependent refresh rates and moved some of the static buffers in CDVDMAN onto the stack. - Tue Oct 14 22:29:01 2014 +0800 -rev709 - README edited online with Bitbucket - Sun Oct 12 23:13:38 2014 +0800 -rev708 - README edited online with Bitbucket - Fri Oct 10 23:19:40 2014 +0800 -rev707 - Fixed DEVCTL code handling in CDVDMAN, syntax errors and SMB mode error handling when there isn't a network adaptor attached. - Tue Oct 07 09:20:45 2014 +0000 -rev706 - Improved on the reliability of USB support, added more error messages for SMB and removed VSYNC mode: - Tue Oct 07 09:18:40 2014 +0000 -rev705 - Fix for Crash Bandicoot: The Wrath of Cortex. - Tue Oct 07 16:57:28 2014 +0800 -rev704 - Fixes: - Tue Oct 07 01:57:13 2014 +0800 -rev703 - Fixes and optimizations: - Mon Oct 06 00:00:36 2014 +0800 -rev702 - Rewritten the patching system and how parameters are passed to IOPCORE, for maintainability. - Sun Oct 05 08:31:44 2014 +0800 -rev701 - Added a patch for Super Robot Wars IMPACT, and optimized CDVDMAN's callback functionality. - Sat Oct 04 09:39:20 2014 +0800 -rev700 - Fixed CDVDMAN initialization. Fixes: SSX World Tour and the Harry Potter series. - Sat Oct 04 03:45:38 2014 +0800 -rev699 - Updated USBHDFSD to support disks >1TB and <=2TB (Sync'ed with PS2SDK update). - Fri Oct 03 05:35:49 2014 +0800 -rev698 - Corrected path handling, which was broken in commit e5e85f0. - Tue Sep 30 08:54:16 2014 +0800 -rev697 - Fixes and updates: - Tue Sep 30 01:01:15 2014 +0800 -rev696 - in-game SMB fixes and enhancements: - Sun Sep 28 09:44:28 2014 +0800 -rev695 - Added an option for DTL-T100dded an option for DTL-T10000 support, since this unit can have a different set of IOP modules in its flash ROM. - Mon Sep 08 20:36:57 2014 +0800 -rev694 - SP193: FreeType fix - Wed Aug 20 22:47:26 2014 +0800 -rev693 - More Makefile fixes - In order to CHILDPROOF, RTL, GSM and CHEAT switches work properly - Mon Aug 04 13:07:19 2014 +0800 -rev692 - Makefile fix to build without PS2RD Cheat Engine (CHEAT = 0) - Sat Jul 12 16:07:03 2014 -0300 -rev691 - EE Core - Only Install PadOpen Hook if IGR is enabled - Wed Jul 09 19:37:45 2014 -0300 -rev690 - Merged doctorxyz's commit with mine. - Wed Jul 09 15:43:00 2014 -0300 -rev689 - OPL+PS2RD Cheat Engine Integration - Fri Jul 04 08:47:43 2014 -0300 -rev688 - Updated OPL to compile with the new PS2SDK. - Thu Jun 26 19:13:48 2014 +0800 -rev687 - Fixed the theme bug and improved code: - Mon Jun 23 08:20:53 2014 -0300 -rev686 - Sync'ing with the PS2SDK commit for today: the main point behind this commit is the rollback of the use of the pre and post-DMA callbacks within DEV9, for compatibility with a certain clone adaptor. - Mon Jun 23 18:39:24 2014 +0800 -rev685 - Merged in psx_core/open-ps2-loader/psx_core/the-most-accurate-and-correct-translatio-1384761167035 (pull request #6) - Sun Jun 15 18:52:00 2014 +0800 -rev684 - The most accurate and correct translation from english to russian by RA1n. (lang_Russian.lng edited online with Bitbucket) - Tue Jun 10 21:47:33 2014 +0800 -rev683 - Fixed a buffer overflow problem in CDVDFSV and refactored all CDVDMAN defines: - Sun Jun 01 19:35:01 2014 +0800 -rev682 - Added a proper patch for Choujikuu Yousai Macross (SLPM-65405). - Mon Nov 18 07:52:59 2013 +0000 -rev681 - Completed the integrated DECI2 debugging system and updated some log messages. - Fri May 09 21:50:36 2014 +0800 -rev680 - Completed the incomplete modifications from the previous commit + enhanced IGR. - Thu May 01 17:01:58 2014 +0800 -rev679 - changes.txt - Tue Apr 22 00:57:53 2014 +0800 -rev678 - Updated OPL to be fully compatible (compiles without the deprecated warnings) with the HEAD revision of the PS2SDK. - Mon Apr 21 22:21:07 2014 +0800 -rev677 - *Changed the configGetString function to return a const value, since the configuration keys are not to be changed without configSetStr(), except for two lines within themes.c. This is to safeguard against accidental configuration corruption/overwriting. - Sat Apr 19 13:52:29 2014 +0800 -rev676 - * Updating LNG files - Ethernet modes (among other things) were missing. - Sat Jan 11 20:27:05 2014 +0800 -rev675 - Reverting the change in the previous commit. - Wed Nov 06 13:16:17 2013 +0800 -rev674 - Fix for the workaround for the Chinese SATA network adaptor: I forgot that the register is 16-bit, which means that the adaptor probably reports 0xFFFF as its version number. - Fri Nov 01 12:42:36 2013 -0400 -rev673 - *Ported over the workaround for Chinese SATA network adaptors (See the PS2SDK update for today). - Fri Nov 01 20:32:26 2013 +0800 -rev672 - * Rev672 tapped for release - updated changelogs. - Fri Nov 01 17:43:16 2013 +0800 -rev671 - *Replaced the TLB reinitialization mechanism with a built-in one. No more patching/hooking onto the EE kernel for that! Done partly for compatibility with the PSX. - Fri Nov 01 13:47:59 2013 +0800 -rev670 - * Hey Bat! Try not to commit non-default changes to Makefiles next time, will - Fri Oct 25 17:52:49 2013 -0400 -rev669 - * MASSIVE UPDATE - Consider deleting and re-cloning your local repos if - Thu Oct 24 15:13:40 2013 +0800 -rev668 - * Massive changes to GSM function calls - some of which were so similar that - Tue Oct 22 14:06:16 2013 -0400 -rev667 - * Anticipating blood-curdling scream from SP193! - Tue Oct 22 13:55:08 2013 -0400 -rev666 - * Cleaned up GSM code - Mon Oct 21 17:29:56 2013 -0400 -rev665 - Added tag 0.9.2 for changeset 3eb5ac59e7a5 - Fri Oct 18 12:43:06 2013 -0400 -rev664 - (*) Refreshed language files - Wed Oct 16 17:05:23 2013 -0400 -rev663 - (*) Aaaand after a half-assed busted GUI staring me dead in the face for over - Sat Oct 12 06:59:14 2013 -0400 -rev662 - Updating CHANGELOG ahead of release - actual release revision can be - Sat Oct 12 06:57:49 2013 -0400 -rev661 - * Rebase complete - Fri Oct 11 17:49:17 2013 -0400 -rev660 - *Modified compatibility mode 7 to not affect sceCdStRead(), as the streaming functions are already underperforming. - Wed Oct 02 11:29:13 2013 -0400 -rev659 - *Sync'ing the HDD module updates for the PSX. OPL should now run properly on the PSX. - Tue Oct 01 16:43:01 2013 -0400 -rev658 - *Sync'ing HDD updates... again. - Wed Oct 02 00:17:01 2013 +0800 -rev657 - *Sync'ing the updates in the PS2SDK with the ATAD modules here: common/include/atahw.h was updated, and all ATAD modules are using the commands defined within atahw.h. - Tue Oct 01 23:04:45 2013 +0800 -rev656 - *Optimized CDVDMAN (Declared internal structures and functions as static). - Sun Sep 29 19:22:24 2013 +0800 -rev655 - The original files I modified couldn't be committed directly into the repository, so I had to check out a new copy of the repository and copy my changes over manually. - Fri Sep 27 18:22:17 2013 +0800 -rev654 - *Updated ATAD (Normal ATAD and the HDPro version) to be the same as the ones from the PS2SDK. - Mon Sep 02 15:21:49 2013 +0800 -rev653 - *Re-added SPU reset code. CLEARSPU shouldn't be used and I was wrong about that. - Thu Aug 08 14:22:12 2013 +0800 -rev652 - *Added sceCdPowerOff(). Games that power off the console should be able to do so now. - Thu Aug 08 14:12:32 2013 +0800 -rev651 - *Cleaned up IGR code. - Sun Jul 21 12:12:43 2013 +0800 -rev650 - Added power-off processing code. Games (mainly older one) that use it should no longer cause a deadlock. - Wed Jul 17 15:08:08 2013 +0800 -rev649 - *Updated all DEV9 and ATAD module code. - Wed Jul 17 13:12:54 2013 +0800 -rev648 - (AKuHAK): Updated OPL to support the updated LIBPNG port. - Sat Jun 15 01:56:50 2013 +0800 -rev647 - Removed the integrated FreeType copy. Please update your FreeType library (From ps2sdk-ports)! - Sat Jun 15 01:26:36 2013 +0800 -rev646 - *Removed the old Protokernel patch, since the PS2SDK now has a complete one. - Sat Jun 15 00:52:08 2013 +0800 -rev645 - *Removed the old Protokernel patch, since a full patch has been integrated into the PS2SDK. - Sun Jun 02 20:44:40 2013 +0800 -rev644 - Added tag 0.9.1 for changeset 2ebb9bb56c19 - Thu Mar 21 00:11:48 2013 +0800 -rev643 - Updated USBLD_VERSION to "0.9" - Thu Mar 21 00:08:41 2013 +0800 -rev642 - Added tag 0.9 for changeset 830d78f67941 - Mon Aug 13 06:00:01 2012 -0300 -rev641 - Updated CHANGELOG and DETAILED_CHANGELOG files - Mon Aug 13 05:57:32 2012 -0300 -rev640 - Disabling auto-refresh of game list by default, as it is causing bugs sometimes - Sat Jul 28 10:35:29 2012 -0300 -rev639 - mgh: fix for default HDD DMA mode, that wasn't correctly set - Sat Jul 28 10:35:22 2012 -0300 -rev638 - Suggestion from "mgh". - Tue May 01 16:37:04 2012 +0200 -rev637 - Fix a bug (in revision 426) which made "Mode 3 - Unhook Syscalls" un-effectivei ("Unhook Syscalls" was in fact activated by "Mode 7 - Reduced memory usage", which was setting both modes 3&7). - Thu Apr 26 22:46:24 2012 +0200 -rev636 - * fix for theme font handling (when switching back to the default theme, the language font wasn't re-applyied) - Mon Mar 26 22:40:28 2012 +0200 -rev635 - damn wide font ;) - Sat Mar 24 22:08:24 2012 +0100 -rev634 - Added hidden options to be able to define your own device delay before loading ART/config files. - Sat Mar 24 00:21:03 2012 +0100 -rev633 - layout adjustment - Wed Mar 07 21:32:39 2012 +0100 -rev632 - language files update - Wed Mar 07 21:17:18 2012 +0100 -rev631 - don't do HDD checks when no vmc configuref - Wed Mar 07 20:54:36 2012 +0100 -rev630 - fix for corrupted graphics when manipulating config files - Tue Mar 06 19:31:33 2012 +0100 -rev629 - SilverBull: apply a delay to CDVDMAN functions (initially for Shadow Heart 2) - Sun Mar 04 23:03:08 2012 +0100 -rev628 - adding i18n strings - Sun Mar 04 17:47:44 2012 +0100 -rev627 - Big up for Volca ... slowdown the busy icon - Sun Mar 04 14:36:46 2012 +0100 -rev626 - fix for wrapping artefact when display_mode=ALWAYS - Wed Feb 29 22:53:10 2012 +0100 -rev625 - remove useless code for compatibility mode 7 which is unused now. - Mon Feb 27 21:18:00 2012 +0100 -rev624 - fix for broken UL on ETH mode - Mon Feb 27 18:53:58 2012 +0100 -rev623 - make start/select button skinnable - Sun Feb 26 14:57:10 2012 +0100 -rev622 - make action buttons skinnable - Sun Feb 26 12:58:47 2012 +0100 -rev621 - small correction for gcc warning - Sat Feb 25 10:55:24 2012 +0100 -rev620 - * CRITICAL FIX for 4K disk. It was broken since the beginning for both UL and ISO (2 bugs, one when checking for the cluster size for UL, and one for UL/ISO when patching the usb_cdvdman_irx) - Fri Feb 24 23:08:05 2012 +0100 -rev619 - Finalize the "list share" feature. Now you can list the share, select one from the list and OPL will connect it and display the games. - Fri Feb 24 20:20:27 2012 +0100 -rev618 - * fix a refresh bug introduced lately - Fri Feb 24 19:59:26 2012 +0100 -rev617 - cosmetics again (prefixing every LOG by its location) - Mon Feb 20 23:22:33 2012 +0100 -rev616 - just some cosmetics - Sun Feb 19 17:44:06 2012 +0100 -rev615 - * don't display a share connection error when listing share - Sun Feb 19 16:32:35 2012 +0100 -rev614 - Hey Hominem ... don't commit shit you used for trying to reproduce some bug ;) - Sun Feb 19 15:46:15 2012 +0100 -rev613 - Adding ETHPrefix to fix the use of some box/NAS adding a sub path to the share - Sun Feb 19 14:28:36 2012 +0100 -rev612 - few changes to be able to refresh the menu from anywhere (should be used when selecting a share, after connecting to it, refresh the menu, but it doesn't work currently due to the info screen crashing ...) - Sat Feb 18 11:43:45 2012 +0100 -rev611 - * Add a feature to list network shares. Just let the sharename empty into network settings, and OPL will try to connect and list the shares (BUT then don't try to do anything with the share list, their are handled like games, but are not, so everything would crash) - Sat Feb 18 11:16:58 2012 +0100 -rev610 - * reverted some changes from rev500, finally crazyc was correct (when he skipped one vmc in error, but still wrote the structure in IRX but with flag as inactive) - Sat Feb 18 11:07:07 2012 +0100 -rev609 - load and use the internal LOGO before swapping theme (avoid flickering at startup) - Thu Feb 16 22:38:21 2012 +0100 -rev608 - NOTE: Concerning my comment in R606, I'm sorry Volca, the code wasn't "dangerous" and didn't write memory out of bounds (thanks to the check < MAX_GS_MODE) - Wed Feb 15 22:13:25 2012 +0100 -rev607 - fix small bug in alternate device mode, when loading config files - Sun Feb 12 23:02:04 2012 +0100 -rev606 - * fixed dangerous code (out of bounds memory writing in renderman) - Sat Feb 11 15:33:02 2012 +0100 -rev605 - clarify the gui - Fri Feb 10 18:41:41 2012 +0100 -rev604 - Some changes in the way the network is "reloaded". - Fri Feb 10 00:19:28 2012 +0100 -rev603 - * Minor GUI changes (deferred error message display, small optim for main loop) - Wed Feb 08 21:18:17 2012 +0100 -rev602 - Added "InfoHintText" element, to be able to put a small version of hints for the info screen. - Tue Feb 07 23:06:20 2012 +0100 -rev601 - Remove useless stuff (was thing for RTL transposition only, which will not be implemented after all as too complicated) - Mon Feb 06 22:19:26 2012 +0100 -rev600 - Fix for space and punctuation characters. These one are weak/neutral and should not change the current rendering direction. - Tue Jan 31 23:05:17 2012 +0100 -rev599 - Support for Right-to-Left scripting (Hebrew, Arabic, Syriac, Tifinar, ... languages) - Tue Jan 31 22:18:03 2012 +0100 -rev598 - merge (?) - Tue Jan 31 21:49:25 2012 +0100 -rev597 - Work around FOR PFS BUG with O_TRUNC - Sat Jan 28 21:55:11 2012 +0100 -rev596 - Polishing things, full IO for loading/saving of config files, factorization, ... - Sat Jan 14 15:24:26 2012 +0100 -rev595 - automatically create the CFG folder - Sat Jan 14 15:19:09 2012 +0100 -rev594 - remove duplicate methods / factorization (need to ensure compatibility mode among other don't have regression) - Sat Jan 14 11:25:39 2012 +0100 -rev593 - Configuration related to DNAS/VMC/DMA/COMPAT are now saved in single per game files on each media. - Sun Jan 08 13:59:22 2012 +0100 -rev592 - fixed the alternate device mode. - Sun Jan 08 01:40:40 2012 +0100 -rev591 - l_oliveira: fix for SCPH-10000 with Sony Kernel update - Sat Jan 07 23:38:56 2012 +0100 -rev590 - fix for Kingdom Hearts 2: Final Mix(SLPM_666.75) gummi missions freezing - Fri Oct 14 10:20:26 2011 +0200 -rev589 - fix cdinited flag for SSX on Tour (broken in r585) - Tue Oct 25 20:33:55 2011 +0200 -rev588 - update to comply with the latest PS2SDK - Mon Jun 20 18:09:10 2011 +0200 -rev587 - Fixed sceGetReadPos() to return the buffer offset in 2048-byte units (Updated dynamically). - Thu Jun 09 17:05:57 2011 +0200 -rev586 - Added new patch for Rugby League 2: World Cup Edition (PAL). - Thu Jun 09 16:52:44 2011 +0200 -rev585 - romz: added better cd tray emulation (fixes A2M games) - Wed May 04 16:40:35 2011 +0800 -rev584 - extracted code branching from ItemsList drawing and main drawing method - Sat Apr 30 22:29:07 2011 +0800 -rev583 - fix for the "alternate device mode" that was failing to re-read the configuration files from "mass" device - Fri Apr 29 17:48:50 2011 +0200 -rev582 - * use alignment for clipped/wrapped text - Wed Mar 09 23:39:07 2011 +0100 -rev581 - ItemsList can now use clipping too. As a result, the "items" option for ItemsList has been removed. Now to limit the number of items being displayed, specify a "height" value. - Sun Mar 06 01:42:13 2011 +0100 -rev580 - * caching of last attribute value (for AttributeText/Image element), to not search the config file every frame - Sun Mar 06 00:05:42 2011 +0100 -rev579 - cdvdfsv: implemented sceCdChangeThreadPriority export (as suggested by romz) - Sat Mar 05 22:10:20 2011 +0100 -rev578 - fix EE core makefiles (alt EE core broken in r546) - Sat Mar 05 19:11:31 2011 +0100 -rev577 - * minor addition to have more transitions - Mon Feb 28 10:32:09 2011 +0100 -rev576 - Probable fix for the previous random crash (rev 572) at startup - Mon Feb 28 09:56:24 2011 +0100 -rev575 - * fix problem with semaphore - Sat Feb 26 21:27:05 2011 +0100 -rev574 - Merged changes - Wed Feb 23 11:03:52 2011 +0100 -rev573 - * Added text block rendering function - Tue Feb 22 23:52:13 2011 +0100 -rev572 - * add a delay before loading per-game config file (same as Art, to not spam when navigating very fast) - Tue Feb 22 21:45:42 2011 +0100 -rev571 - Merged changes - Tue Feb 22 21:43:36 2011 +0100 -rev570 - * Fix for rendering problems caused by CLUT alpha setting change - Tue Feb 22 21:11:38 2011 +0100 -rev569 - use deferred IO to load config file (should be more safe, got sometimes corrupted file before) - Tue Feb 22 20:20:19 2011 +0100 -rev568 - * Font rendering now uses clut - Tue Feb 22 20:19:45 2011 +0100 -rev567 - * hints now display either "Info" or "Run" depending if the presentation page is available in the theme AND the option is enabled in settings - Mon Feb 21 23:14:38 2011 +0100 -rev566 - * add loading attributes from a per-game file - Mon Feb 21 22:41:46 2011 +0100 -rev565 - fix for config reading, "val" were truncated at 32 char (copy/paste typo) - Mon Feb 21 00:25:03 2011 +0100 -rev564 - * added new element type "StaticText" to display an hardcoded/static string to the screen - Sun Feb 20 22:48:39 2011 +0100 -rev563 - * added information page (new option to enable it or not) - Sat Feb 19 22:49:11 2011 +0100 -rev562 - First working version of the font atlasing. Probably still buggy so beware :D - Sat Feb 19 01:33:36 2011 +0100 -rev561 - small fixes - Fri Feb 18 20:18:17 2011 +0100 -rev560 - * Fix for rendering artifacts on disabled vsync (the reason was we didn't wait for GS to finish before ending the frame) - Mon Feb 14 22:58:02 2011 +0100 -rev559 - * Improvement for the config reader - it now handles python-like prefixes. Also added a safeguard for the max length of key and value in splitter - Sun Feb 13 01:43:02 2011 +0100 -rev558 - Erf first "merge" (I hope it works ...) - Sat Feb 12 18:04:35 2011 +0100 -rev557 - First step (almost) finished - Sat Feb 12 16:22:24 2011 +0100 -rev556 - step 2, loose coupling - Sat Feb 12 11:56:55 2011 +0100 -rev555 - first step of the theme/menu rendering rewrite - Sat Feb 12 11:56:09 2011 +0100 -rev554 - romz: fix for cdvdman's sceCdSC() - Sun Feb 06 10:48:00 2011 +0100 -rev553 - fix for "use_default=0" option in theme (entering the virtual keyboard was crashing, among other ...) - Fri Feb 04 14:19:11 2011 +0100 -rev552 - * fix a bug in color settings not applied to elements (needed to restart OPL, or cicle with another theme) - Sun Feb 06 17:39:33 2011 +0100 -rev551 - fix for language fonts being reset-ed when changing theme - Tue Feb 01 08:42:07 2011 +0100 -rev550 - re work of virtual keyboard (needed to remove the non-latin characters), added focus on current selected chars - Mon Jan 31 21:51:58 2011 +0100 -rev549 - * saved some place in game settings (to add future GSM settings) - Sun Jan 30 22:23:20 2011 +0100 -rev548 - fix for broken hdldsrv (since r517/r521) - Sun Jan 30 20:57:10 2011 +0100 -rev547 - just some cosmetics to the main Makefile - Sun Jan 30 17:57:54 2011 +0100 -rev546 - just some cosmetics for the EE core - Fri Jan 28 11:07:45 2011 +0100 -rev545 - fix (hopefully) for DVD9 games - Thu Jan 20 16:56:51 2011 +0100 -rev544 - fix for Sonic Unleashed (broken in r515) - Thu Jan 20 15:32:05 2011 +0100 -rev543 - Merged changes - Wed Jan 19 15:07:45 2011 +0100 -rev542 - * Mode setting (PAL/NTSC/Auto) - Wed Jan 19 09:19:30 2011 +0100 -rev541 - * Implemented kerning - Sun Jan 16 20:03:21 2011 +0100 -rev540 - * Longer first-press delay for pads - more comfy controls on max repeat speed - Sun Jan 16 19:51:10 2011 +0100 -rev539 - * Added sclean make target for make clean without Freetype - Sun Jan 16 19:49:53 2011 +0100 -rev538 - EP: fix for POPWW (SLUS_210.22) - Sun Jan 16 19:28:44 2011 +0100 -rev537 - fix for the HD Pro (doesn't support idle timeout) - Sun Jan 16 19:23:58 2011 +0100 -rev536 - fix for white screen freezing in 'Tenchu: Wrath of Heaven' - Sun Jan 16 12:13:12 2011 +0100 -rev535 - fix for the BSOD at game launch on some PS3 (added timeout on wait SPU reset) - Sun Jan 16 12:03:57 2011 +0100 -rev534 - fix for POPWW (SLES_528.22) over SMB, HDD - Sun Jan 09 17:49:56 2011 +0100 -rev533 - fix for SSX on Tour - Sat Jan 08 15:10:07 2011 +0100 -rev532 - small fixes - Sat Jan 08 09:29:46 2011 +0100 -rev531 - short ELF name in App list (looks better for most themes) - Fri Jan 07 15:11:50 2011 +0100 -rev530 - Added option to specify the HDD spin down time out. - Fri Jan 07 13:52:39 2011 +0100 -rev529 - implemented hddSetIdleTimeout() - Fri Jan 07 13:12:02 2011 +0100 -rev528 - removed hdpro_checker IOP module (HD Pro is now detected directly from EE) - Wed Jan 05 22:04:17 2011 +0100 -rev527 - changes to be able to debug IOP core with HD Pro - Wed Jan 05 17:04:27 2011 +0100 -rev526 - added in-game code for HD Pro - Tue Jan 04 18:13:31 2011 +0100 -rev525 - added hdpro_atad IOP module (HD Pro users should have their games listed) - Tue Jan 04 13:33:33 2011 +0100 -rev524 - added hdpro_checker IOP module (detect if HD Pro Kit is present) - Tue Jan 04 12:16:56 2011 +0100 -rev523 - fix for Street Fighter Zero Fighters Generation (SLPM_664.09) by lee4, reverted Capcom Classics Collection fix - Tue Jan 04 09:09:45 2011 +0100 -rev522 - Fix for Capcom Classics Collection - Mon Jan 03 21:14:55 2011 +0100 -rev521 - fix for broken SMB (by r517) on some setup - Sat Jan 01 10:04:43 2011 +0100 -rev520 - * Added theme support for multiple fonts (default_font, font0, font1... + _font=ID in the components) - Thu Dec 30 19:36:30 2010 +0100 -rev519 - configurable IGR path (limited to 32 characters) - Thu Dec 30 19:09:57 2010 +0100 -rev518 - fix for game ID system (broken in r513) - Thu Dec 30 12:41:14 2010 +0100 -rev517 - saved 4k of IOP mem in cdvdman/SMB, direct write to buffer - Thu Dec 30 00:34:02 2010 +0100 -rev516 - * Added support for multiple fonts (not used but there ;)) - Wed Dec 29 21:10:54 2010 +0100 -rev515 - fix for Capcom protected games (SFAA, VDC) - Wed Dec 29 20:44:02 2010 +0100 -rev514 - fix for games from 'Army Men' series - Wed Dec 29 18:03:32 2010 +0100 -rev513 - cdvdman: fix potential buffer overflow for long ISO filenames - Wed Dec 29 15:28:31 2010 +0100 -rev512 - enlarged cdvdman buffer for ISO name to 64 bytes - Fri Dec 24 16:56:55 2010 +0100 -rev511 - when creating a new VMC, the gEnableRenameDelete option should not be applied - Mon Dec 20 19:39:15 2010 +0100 -rev510 - * switch default background mode to "Art" - Mon Dec 20 17:07:51 2010 +0100 -rev509 - * fix USB fragmentation check of Game file parts (it should now works as expected) - Sun Dec 19 17:57:47 2010 +0100 -rev508 - fix for 10K patches freezing on some modchipped PS2 - Sun Dec 19 17:27:55 2010 +0100 -rev507 - * add configurable USB delay (3 is the default value currently used). If you have OPL stuck on yellow or orange screen (when using USB mode only), try increasing this value - Sun Dec 19 16:48:50 2010 +0100 -rev506 - fix for Super Dimensional Fortress Macross (SLPM_654.05) over HDD - Sun Dec 19 13:59:33 2010 +0100 -rev505 - final translations for release 0.8 - Sat Dec 11 16:57:17 2010 +0100 -rev504 - tagged r503 as release v0.8 - Sat Dec 11 10:16:21 2010 +0100 -rev503 - izdubar: added an About screen to the GUI - Thu Dec 09 20:37:29 2010 +0100 -rev502 - languages updates - Wed Dec 08 12:58:24 2010 +0100 -rev501 - work around for the infinite refresh on some NAS device - Wed Dec 08 12:56:57 2010 +0100 -rev500 - a few fixes so that OPL can comply with some Digitus NAS (with the help of Thinner), removed obsoletes language files and added 'Filipino' language file - Tue Dec 07 11:29:46 2010 +0100 -rev499 - update for Turkish language - Mon Dec 06 08:52:19 2010 +0100 -rev498 - fix for english and french translation - Sat Dec 04 18:53:39 2010 +0100 -rev497 - small fixes - Sun Nov 28 19:31:10 2010 +0100 -rev496 - Thanks to jimmi's help and ideas, things should now be fixed for alternate device start (and traditional mode too). - Sun Nov 28 13:28:01 2010 +0100 -rev495 - added ability to use '-use-early-debug' arg (for using ps2client netdump) - Sun Nov 28 01:29:24 2010 +0100 -rev494 - * devices started in alternate mode now have valid hints - Sun Nov 28 01:10:54 2010 +0100 -rev493 - genvmc: wait progress message update before to return from vmc_abort() call - Sat Nov 27 15:10:04 2010 +0100 -rev492 - genvmc: fixed IOP freezing on vmc_abort() call - Sat Nov 27 01:05:50 2010 +0100 -rev491 - added debug prints to genvmc module - Sun Nov 21 17:26:46 2010 +0100 -rev490 - modified sysReset() to allow genvmc to load properly - Sun Nov 21 16:52:36 2010 +0100 -rev489 - * create an opl.icn into the OPL folder on MC, so the PS2 browser doesn't display it as corrupted data - Sun Nov 21 15:25:00 2010 +0100 -rev488 - * IPCONFIG.DAT file now loaded from the alternate device too - Sun Nov 21 15:02:05 2010 +0100 -rev487 - When no config for OPL is found: - Fri Nov 19 11:07:24 2010 +0100 -rev486 - Fix in samba code: server buffer size could be set to 0 due to the type casting - Fri Nov 19 00:24:13 2010 +0100 -rev485 - small fixes (USB delay, result return) - Wed Nov 17 23:25:56 2010 +0100 -rev484 - * Applications configuration file is read from alternate device too - Wed Nov 10 20:27:28 2010 +0100 -rev483 - Enable saving settings capability on USB or HDD. - Sat Oct 30 20:22:45 2010 +0200 -rev482 - small changes - Sat Oct 30 19:40:47 2010 +0200 -rev481 - * IO thread stabilization attempt (not sure if it helps, but it seems so) - Sat Oct 30 03:20:45 2010 +0200 -rev480 - small bug with VMC settings - Fri Oct 15 23:57:44 2010 +0200 -rev479 - add some error messages to warn user of various failing situations - Fri Oct 15 20:26:44 2010 +0200 -rev478 - fix compat flag problem on HDD due to merge - Wed Oct 06 19:47:22 2010 +0200 -rev477 - make alt background configurable too - Wed Oct 06 19:41:50 2010 +0200 -rev476 - Start the pads before loading the config, as we may have to set the scrolling speed. - Tue Oct 05 15:32:05 2010 +0200 -rev475 - few changes for SMB (in particular for device in "security share" mode - Mon Oct 04 20:50:07 2010 +0200 -rev474 - added FILEIO version check, to be sure - Mon Oct 04 20:05:11 2010 +0200 -rev473 - fix hdd partition check - Mon Oct 04 19:11:24 2010 +0200 -rev472 - patch for FILEIO remove rpc handler - Mon Oct 04 17:23:39 2010 +0200 -rev471 - updated smblab - Mon Oct 04 10:20:37 2010 -0500 -rev470 - reviewed labs so they can compile - Mon Oct 04 16:52:40 2010 +0200 -rev469 - only show VMC delete (and change size) button if "Rename/delete" operation are enabled in settings - Mon Oct 04 12:48:31 2010 +0200 -rev468 - fioXXX operations on SMB makes strange things - Mon Oct 04 12:03:13 2010 +0200 -rev467 - fioXXX operations on SMB make strange things ... - Sun Oct 03 21:05:29 2010 +0200 -rev466 - merge vmc fork - Sun Oct 03 16:37:42 2010 +0200 -rev465 - fix DNAS settings bug - Sun Oct 03 16:37:08 2010 +0200 -rev464 - fix for invalid background when rendering guiMsgBox (deletion warning of VMC items) - Sun Oct 03 08:03:17 2010 -0500 -rev463 - WARNING: uncertain change ! - Sun Oct 03 14:33:52 2010 +0200 -rev462 - remember last focused item when reseting dialog - Sun Oct 03 11:35:49 2010 +0200 -rev461 - I like to commit in two-phases ... - Sun Oct 03 00:49:09 2010 +0200 -rev460 - fix for OK buttons - Sun Oct 03 00:28:10 2010 +0200 -rev459 - Opps, disable VMC by default ... (as it is only GUI stuff, we don't want to confuse users ;)) - Sat Oct 02 11:21:02 2010 +0200 -rev458 - Added VMC GUI (first shot) - Sat Oct 02 11:19:48 2010 +0200 -rev457 - moved IOP modules to more explicit subfolders - Sat Oct 02 00:38:50 2010 +0200 -rev456 - added mcman module and genvmclab - Fri Oct 01 23:38:07 2010 +0200 -rev455 - save config files individually - Thu Sep 30 17:28:59 2010 +0200 -rev454 - prepare stuff for VMC - Mon Sep 27 20:33:56 2010 +0200 -rev453 - * removing settings for hdd was doing bad things - Sun Sep 19 12:37:24 2010 +0200 -rev452 - * shutdown routine was free-ing stuff still used into the launch method ... - Sun Sep 19 00:52:26 2010 +0200 -rev451 - more corrections - Sat Sep 18 23:04:37 2010 +0200 -rev450 - save config *before* shutting down the config files - Sat Sep 18 22:26:05 2010 +0200 -rev449 - fixed a few bugs: - Sat Sep 18 00:40:21 2010 +0200 -rev448 - * compatibility settings for HDD are now saved into the config files. - Sat Sep 18 00:24:12 2010 +0200 -rev447 - fixed broken themes on MC - Fri Sep 17 22:43:08 2010 +0200 -rev446 - should fix the invalid list positioning - Fri Sep 17 21:35:50 2010 +0200 -rev445 - added file fragmentation test for USB games, code from Polo35 (VMC branch) - Mon Sep 13 22:11:29 2010 +0200 -rev444 - splitted settings into "main settings" and "graphic settings" - Sun Sep 12 11:23:06 2010 +0200 -rev443 - added "childproof" mode: - Sat Sep 11 23:45:42 2010 +0200 -rev442 - add rename/delete functionality to Apps - Sat Sep 11 22:36:59 2010 +0200 -rev441 - added hint for "X Play" - Wed Sep 08 23:58:07 2010 +0200 -rev440 - added genvmc command-line tool for pc - Wed Sep 08 22:44:13 2010 +0200 -rev439 - update modload version check in MODLOAD hooking - Sat Sep 04 21:55:21 2010 +0200 -rev438 - added rename and delete functionality for UL format (ul.cfg) - Sat Sep 04 20:27:17 2010 +0200 -rev437 - only apply sorting, when autosort settings enabled - Sat Sep 04 10:23:55 2010 +0200 -rev436 - fix update of HDD game list after restarting modules (when leaving HDLD server) - Fri Sep 03 23:22:33 2010 +0200 -rev435 - enable HDD rename/delete - Fri Sep 03 20:43:36 2010 +0200 -rev434 - fix again for those games resetting IOP with null arg - Fri Sep 03 19:55:34 2010 +0200 -rev433 - Added "rename" and "delete" functionalities for games. - Fri Sep 03 09:57:04 2010 +0200 -rev432 - smbman: added debug prints ability - Fri Sep 03 09:07:57 2010 +0200 -rev431 - use MODLOAD hooking on IOP instead of patching LMB on EE - Thu Sep 02 23:07:32 2010 +0200 -rev430 - fix for alternative EE core build - Thu Sep 02 19:01:13 2010 +0200 -rev429 - fix: give some delay to ingame mass driver - Thu Sep 02 16:07:15 2010 +0200 -rev428 - EE core: get rid of libc dependency - Fri Aug 20 11:05:42 2010 +0200 -rev427 - IGR: use kernel's InitializeTLB instead of syscall - Thu Aug 19 09:56:14 2010 +0200 -rev426 - EE core: rewrote all syscall hooks in asm - Wed Aug 11 18:52:17 2010 +0200 -rev425 - EE core: a few tweaks to asm code - Sun Aug 08 20:52:36 2010 +0200 -rev424 - EE core: improved LoadExecPS2/SifSetDma hooks - Sat Aug 07 21:36:24 2010 +0200 -rev423 - update spanish language file - Thu Aug 05 22:28:01 2010 +0200 -rev422 - added Italian language file - Thu Aug 05 21:27:58 2010 +0200 -rev421 - EE core: a few tweaks to asm code - Thu Aug 05 19:53:32 2010 +0200 -rev420 - EE core: improve LoadExecPS2 hooking (fixes Tecmo Hit Parade SLPS_204.01) - Wed Aug 04 20:05:27 2010 +0200 -rev419 - crazyc: add MC dump ability to genvmc - Tue Aug 03 20:35:24 2010 +0200 -rev418 - fix for Star Ocean 3 - Till the End of Time (broken in r395) - Tue Aug 03 17:03:25 2010 +0200 -rev417 - fix for V-Rally 3 PAL (SLES_507.25) - Mon Aug 02 21:42:12 2010 +0200 -rev416 - fix for Shaun Palmer's Pro Snowboarder US (SLUS_201.99) - Mon Aug 02 16:31:25 2010 +0200 -rev415 - few i18n changes - Sat Jul 31 21:31:30 2010 +0200 -rev414 - clean-up in GUI strings (removed old entries, added missing values) - Sat Jul 31 17:37:41 2010 +0200 -rev413 - fix for NRA Gun Club (SLUS_214.32) - Fri Jul 30 22:51:02 2010 +0200 -rev412 - improvements to genvmc module - Thu Jul 29 21:30:45 2010 +0200 -rev411 - added genvmc IOP module - Mon Jul 26 20:26:00 2010 +0200 -rev410 - fix attempt for Jak X - Mon Jul 26 14:19:49 2010 +0200 -rev409 - fix for those games rebooting IOP with null arg (fixes Bloody Roar 3) - Sun Jul 25 17:22:56 2010 +0200 -rev408 - fix for GTA 3 a-spec over SMB - Sat Jul 24 10:09:38 2010 +0200 -rev407 - cdvdfsv: name module like orginal one - cdvd_ee_driver - Fri Jul 23 17:39:26 2010 +0200 -rev406 - EE core: fix for Quake III Revolution - Fri Jul 23 13:39:36 2010 +0200 -rev405 - fix for Jak 3 - Fri Jul 23 10:40:53 2010 +0200 -rev404 - fix for Full Spectrum Warrior - Thu Jul 22 18:25:23 2010 +0200 -rev403 - fix for those having SMB slowdown/freeze issue on some setups - Thu Jul 22 08:49:21 2010 +0200 -rev402 - cdvdman: fix lseek fileIO (fixes Shadow of Ganymede) - Wed Jul 21 21:44:41 2010 +0200 -rev401 - HDD core fix: init filesystem before to return disc type (fixes Xyanide Resurrection) - Wed Jul 21 18:52:43 2010 +0200 -rev400 - Added translation information for custom language - Tue Jul 20 20:16:31 2010 +0200 -rev399 - dlanor: fix for invisible cursor GUI glitch - Tue Jul 20 16:08:45 2010 +0200 -rev398 - fix for Viewtiful Joe - Tue Jul 20 15:29:15 2010 +0200 -rev397 - fix for EveryBody's Golf and other games - Sun Jul 18 16:05:12 2010 +0200 -rev396 - added feature to be able to disable sceSifStopModule/sceSifUnloadModule - Sun Jul 18 15:58:03 2010 +0200 -rev395 - hook SCE's SifLoadModuleBuffer to fake some modules to be loaded correctly through LoadModuleBuffer calls - Sat Jul 17 17:26:26 2010 +0200 -rev394 - fix for Kya: Dark Lineage PAL (SLES_514.73) - Sat Jul 17 16:42:48 2010 +0200 -rev393 - fix for V-Rally 3 US (SLUS_204.96) - Sat Jul 17 09:33:09 2010 +0200 -rev392 - fix for Kya: Dark Lineage US (SLUS_204.40) - Thu Jul 15 15:06:51 2010 +0200 -rev391 - changed the patches for Prince Of Persia: The Two Thrones - Thu Jul 15 13:21:31 2010 +0200 -rev390 - fix for Prince of Persia: The Two Thrones NTSC U (SLUS_212.87) - Wed Jul 14 19:19:34 2010 +0200 -rev389 - hdldsvr: use real HDD writes - Wed Jul 14 19:15:35 2010 +0200 -rev388 - udptty: redirect Kprintf output to tty - Tue Jul 13 12:35:52 2010 +0200 -rev387 - cdvdman: set cdstatus to CDVD_STAT_PAUSE in sceCdStStart/sceCdStResume - Tue Jul 13 09:41:41 2010 +0200 -rev386 - added EELOAD patches - Mon Jul 12 20:50:43 2010 +0200 -rev385 - fix for Suikoden IV (HDD) broken in r359 - Sun Jul 11 16:42:07 2010 +0200 -rev384 - fix for Prince of Persia: The Two Thrones PAL (SLES_537.77) - Wed Jul 07 19:24:05 2010 +0200 -rev383 - cdvdman: do not allocate IOP memory in cd callback handler (fixes Syphon Filter Logan's Shadow on HDD) - Tue Jul 06 09:49:52 2010 +0200 -rev382 - EE core: change stack pointer a bit earlier - Mon Jul 05 19:01:47 2010 +0200 -rev381 - EE core: use an intermediate stack during the IOP reset 'hook' code - Sun Jul 04 18:30:17 2010 +0200 -rev380 - use maximum priority for EE SMB password hashing thread - Fri Jul 02 21:59:55 2010 +0200 -rev379 - Fix for Suikoden V (in patch form) - Fri Jul 02 21:50:10 2010 +0200 -rev378 - fix for Max Payne EU version (SLES_503.25) - Fri Jul 02 19:30:42 2010 +0200 -rev377 - * make arrow icons customizable - Fri Jul 02 16:19:09 2010 +0200 -rev376 - PS3 fix 2: use XLOADFILE when building EELOADCNF - Thu Jul 01 21:08:36 2010 +0200 -rev375 - PS3 fix 1: reinstated cddev module use in EE core - Wed Jun 30 23:44:26 2010 +0200 -rev374 - * don't unmount pfs0 when we are launching an app that is on HDD - Wed Jun 30 21:47:52 2010 +0200 -rev373 - fix number 2 for Kingdom Hearts 2 gummi ship missions (should fix all regions) - Wed Jun 30 21:21:18 2010 +0200 -rev372 - fix for Kingdom Hearts 2 (SLUS_210.05) freeze on gummi ship missions - Wed Jun 30 21:00:04 2010 +0200 -rev371 - Apply Max Payne US patch on all 3 cores - Wed Jun 30 14:38:03 2010 +0200 -rev370 - SMSTCPIP: revert ARP_QUEUEING setting change (should fix broken Downhill Domination - SCUS_971.77 via SMB) - Wed Jun 30 11:01:15 2010 +0200 -rev369 - added compatibility mode 8 (should fix NFS Underground 2 - SLUS_210.65) - Tue Jun 29 16:56:26 2010 +0200 -rev368 - fix for the recent freezing using themes - Tue Jun 29 16:45:45 2010 +0200 -rev367 - changed smbauth & tcpip threads priorities (fixes Spiderman 3 and Genji) - Mon Jun 28 19:39:40 2010 +0200 -rev366 - link GUI SMB auth stuff to SMB core - Mon Jun 28 18:08:42 2010 +0200 -rev365 - * startup logo implementation, with a placeholder Logo - Mon Jun 28 08:34:57 2010 +0200 -rev364 - SMB core: do not perform password hashing if SMB server uses plaintext passwords - Sun Jun 27 22:55:56 2010 +0200 -rev363 - Max Payne US version (SLUS_202.30) fix for SMB use - Sun Jun 27 20:41:48 2010 +0200 -rev362 - EE core: added a ResetSPU() in LoadExecPS2 hook - Sun Jun 27 19:38:17 2010 +0200 -rev361 - added User Security Level support to SMB core - Sun Jun 27 18:53:00 2010 +0200 -rev360 - cdvdman: change back SceCdTrayReq traycheck return value - Sun Jun 27 18:51:33 2010 +0200 -rev359 - SMB core: save more IOP memory to increase compatibility - Sat Jun 26 22:04:12 2010 +0200 -rev358 - removed cddev module use from EE core, removed cddev - Sat Jun 26 09:38:33 2010 +0200 -rev357 - default to settings menu when no devices started or no config file found - Fri Jun 25 10:36:55 2010 +0200 -rev356 - * re-enable game "test" functionality (from compatibility settings) - Wed Jun 23 13:31:22 2010 +0200 -rev355 - use ICO fix (r346) only in compatibility mode 7 - Wed Jun 23 12:55:53 2010 +0200 -rev354 - smbman: do not rely on EndOfSearch but rather SearchCount field - Wed Jun 23 12:06:48 2010 +0200 -rev353 - remove uneeded stuff from ps2link module - Wed Jun 23 09:54:52 2010 +0200 -rev352 - EE core: remove InitializeUserMemory() patch when removing kernel hooks - Tue Jun 22 22:31:11 2010 +0200 -rev351 - fix: do no longer use sbv_patch_user_mem_clear() to be compatible with faulty DMS4 modchip - Mon Jun 21 12:43:50 2010 +0200 -rev350 - ps2link module: corrected Makefile - Mon Jun 21 11:02:31 2010 +0200 -rev349 - reload ps2link module on 'make debug' rule - Sun Jun 20 19:46:58 2010 +0200 -rev348 - fix: HDD gamelist was deallocated too early in HDD game launch process - Sun Jun 20 19:00:52 2010 +0200 -rev347 - * ISO support also "enabled" for USB (don't know what is the filesize limit, either 2Go or 4Go) - Sat Jun 19 11:52:19 2010 +0200 -rev346 - cdvdfsv: remove a 2KB of wasted IOP mem (fixes ICO - SCUS_971.59 via SMB) - Sat Jun 19 11:08:28 2010 +0200 -rev345 - SMSTCPIP: adjust PBUF_POOL_SIZE for ingame use (fixes again Disgaea SLUS_206.66 broken since r283) - Fri Jun 18 22:36:12 2010 +0200 -rev344 - added a new compatibilty mode: "reduce the buffers used by cdvdman/cdvdfsv" - Fri Jun 18 22:08:30 2010 +0200 -rev343 - added make_changelog.sh script and DETAILED_CHANGELOG file - Thu Jun 17 12:14:37 2010 +0200 -rev342 - cdvdman: check faulty filepath(more than one ';1') - fixes WWE Smackdown! Shut your mouth (SLUS_204.83) - Wed Jun 16 21:56:10 2010 +0200 -rev341 - use ioptrap module while debugging - Wed Jun 16 20:25:36 2010 +0200 -rev340 - fix for HDD games compat modes saving to another game when using sorted list - Wed Jun 16 19:51:14 2010 +0200 -rev339 - cdvdman fix: dread must return entry size (fixes Captain Tsubasa SLPS_256.91) - Wed Jun 16 14:12:26 2010 +0200 -rev338 - removed netlog module (now replaced by UDPtty) - Mon Jun 14 20:30:37 2010 +0200 -rev337 - make use of UDPtty for in-game debugging - Sun Jun 13 17:37:48 2010 +0200 -rev336 - 10K patch fix: only patch kernel if not already patched - Sun Jun 13 14:55:24 2010 +0200 -rev335 - fix for exiting kernel mode correctly while applying 10K patches - Sun Jun 13 14:48:15 2010 +0200 -rev334 - use more versatile code to get ROMVER info in 10K patches - Sat Jun 12 15:05:24 2010 +0200 -rev333 - remove debug from 10K patches - Sat Jun 12 13:03:30 2010 +0200 -rev332 - 10K fix 2: OPL now runs on original 10K kernel - Sat Jun 12 12:47:16 2010 +0200 -rev331 - loader: do a system restart in LoadExecPS2 hook as the real syscall does (reinitialize GS, INTC, TIMER, DMAC, VU0, VU1, VIF0, VIF1, GIF, IPU, FPU and ScratchPad - Fri Jun 11 23:42:36 2010 +0200 -rev330 - hdd.c: do not deallocate partion table when it's not allocated - Fri Jun 11 23:39:48 2010 +0200 -rev329 - free the HDL game list and HDD partition table in hddCleanup() - Wed Jun 09 21:13:38 2010 +0200 -rev328 - 10K fix 1: OPL now runs on patched 10K kernel - Tue Jun 08 22:06:03 2010 +0200 -rev327 - modified Disc ID stuff to no longer freeze on No disc/Invalid disc - Tue Jun 08 20:07:04 2010 +0200 -rev326 - fix to avoid warning on unused variable in hdd.c - Tue Jun 08 12:07:01 2010 +0200 -rev325 - modified and tested HDD deleting game code (real writes still deactivated) - Sun Jun 06 21:08:31 2010 +0200 -rev324 - use EE SIO debug in the loader - Sun Jun 06 16:00:49 2010 +0200 -rev323 - use EE SIO debug output in the GUI on 'make EESIO_debug' - Sun Jun 06 15:57:29 2010 +0200 -rev322 - cdvdman: be compatible with mass storage device having sector size of 4096 - Sat Jun 05 14:53:15 2010 +0200 -rev321 - usbhdfsd: added an ioctl to return mass storage device sectorsize - Fri Jun 04 11:18:35 2010 +0200 -rev320 - * Fix for issue #29 (dia.c tooltip display) - Thu Jun 03 12:49:06 2010 +0200 -rev319 - Put plasma speed back after the framerate optimization - Thu Jun 03 11:26:33 2010 +0200 -rev318 - cdvdman: be compatible with mass storage having sector size of 512, 1024, 2048 - Wed Jun 02 19:40:33 2010 +0200 -rev317 - * separate background rendering (Issue #31) - Wed Jun 02 19:19:00 2010 +0200 -rev316 - usbhdfsd: removed unused code in fs_getFileStartSector() - Wed Jun 02 18:32:30 2010 +0200 -rev315 - cdvdman: fix for my previous code tweak breaking compat with SMB games in ul format - Wed Jun 02 18:29:25 2010 +0200 -rev314 - cdvdman: code tweaking for opening ISO file(s) - Wed Jun 02 16:42:36 2010 +0200 -rev313 - cdvdman: optimized code size for plain ISO support in cdvdman_ReadSect() - Wed Jun 02 15:38:01 2010 +0200 -rev312 - fix for theme choosen not saving - Wed Jun 02 15:19:27 2010 +0200 -rev311 - use LOG() rather than printf() - Wed Jun 02 13:05:27 2010 +0200 -rev310 - fix for issue #23 - Mon May 31 20:12:26 2010 +0200 -rev309 - make use of udptty in debug version - Mon May 31 12:03:14 2010 +0200 -rev308 - added udptty module - Sun May 30 19:36:35 2010 +0200 -rev307 - forgot system.h, now added - Sun May 30 17:25:10 2010 +0200 -rev306 - added system.h and sysLoadModuleBuffer to able to check for modules already loaded - Sat May 29 20:34:44 2010 +0200 -rev305 - added lanman module & lanlab - Sat May 29 18:03:54 2010 +0200 -rev304 - moved smblab & hdldsvrlab to labs folder - Sat May 29 17:57:43 2010 +0200 -rev303 - small fix in game disc settings handling - Sat May 29 16:00:14 2010 +0200 -rev302 - * stop io timer while io is blocked (seems not to affect the hdl server transfer rate though :( ) - Sat May 29 13:39:14 2010 +0200 -rev301 - buffered write (for config file) - Sat May 29 01:33:40 2010 +0200 -rev300 - Fixing issue #21 - Fri May 28 18:14:10 2010 +0200 -rev299 - * Maybe a more resource friendly (but a bit awkward for now) hdld svr screen - Fri May 28 16:54:37 2010 +0200 -rev298 - smbman: reconnect, re-logon and re-open share on connection loss - Thu May 27 19:44:24 2010 +0200 -rev297 - smbman: removed connect/disconnect (now done by logon/logoff) - Thu May 27 18:51:56 2010 +0200 -rev296 - SMSMAP: do not wait forever for link established (wait around 10s otherwise fails to load) - Thu May 27 16:47:17 2010 +0200 -rev295 - added hdldsvrlab for testing purpose - Thu May 27 15:13:17 2010 +0200 -rev294 - fix for SMB "file open" in APPEND mode - Thu May 27 14:29:57 2010 +0200 -rev293 - Removing unzip, not used any more - Thu May 27 11:44:40 2010 +0200 -rev292 - fix for themes listing in SMB mode - Thu May 27 11:33:26 2010 +0200 -rev291 - Fix for missing Art in SMB mode - Thu May 27 08:32:30 2010 +0200 -rev290 - renamed hdl.c to hdd.c and hddFormat() to hddGetFormat() - Wed May 26 23:01:04 2010 +0200 -rev289 - * Fork merge: Porting back the GUI repository changes - Wed May 26 22:27:36 2010 +0200 -rev288 - added hddFormat, hddDeleteHDLGame (untested) - Wed May 26 20:48:07 2010 +0200 -rev287 - fix for LoadHdldsvr() and UnloadHdldSvr() - Wed May 26 20:01:23 2010 +0200 -rev286 - added UnloadHdldSvr() - Tue May 25 08:35:24 2010 +0200 -rev285 - added LoadHdldSvr() to GUI (currently never called) - Sun May 23 17:25:33 2010 +0200 -rev284 - hdldsvr: use real writes (the module is not loaded by the GUI) - Sun May 23 16:08:35 2010 +0200 -rev283 - hdldsvr: added CMD_WRIT & CMD_WRIS, completed UDP thread part (only fake writes) - Sun May 23 09:45:54 2010 +0200 -rev282 - hdldsvr: added CMD_FLSH & CMD_POWX - Sat May 22 18:18:32 2010 +0200 -rev281 - hdldsvr: a fix in interpreting/replying command result - Sat May 22 11:41:45 2010 +0200 -rev280 - hdldsvr: added CMD_STAT & CMD_READ (hdl_dump able to attach and list games) - Fri May 21 10:51:18 2010 +0200 -rev279 - added hdldsvr IOP module skeleton - Fri May 21 10:11:22 2010 +0200 -rev278 - added a specific SMSTCPIP for ingame use, and re-enabled UDP in the normal one - Fri May 21 10:07:45 2010 +0200 -rev277 - Anti-freeze fix for NBSS Session KeepAlive in smbman and ingame SMB core - Thu May 20 20:13:19 2010 +0200 -rev276 - make use of new smbman fileXio functions - Thu May 20 19:57:09 2010 +0200 -rev275 - applied SMB connection speedup to ingame SMB core - Wed May 19 21:20:43 2010 +0200 -rev274 - smbman: finished chdir implementation - Tue May 18 20:28:56 2010 +0200 -rev273 - smbman: implemented dopen/dread/dclose/chdir (chdir is not complete) - Tue May 18 12:43:54 2010 +0200 -rev272 - smbman: implemented FindFirst2, FindNext2 requests, different tweaks to make connection faster - Tue May 18 12:00:32 2010 +0200 -rev271 - smbman: fixed a killer buffer overflow while generating DES keys - Mon May 17 22:16:40 2010 +0200 -rev270 - smbman: added mkdir IO function, make LogOn not retrying forever - Mon May 17 17:11:56 2010 +0200 -rev269 - smbman: added Rename request and his rename IO function - Mon May 17 12:37:30 2010 +0200 -rev268 - smbman: added Delete Directory request and his rmdir IO function - Sun May 16 19:03:49 2010 +0200 -rev267 - smbman: added Delete request and his remove IO function - Sun May 16 17:43:06 2010 +0200 -rev266 - smbman: added poll() to not lock forever using lwip_recv - Sun May 16 16:59:25 2010 +0200 -rev265 - smbman: fix for closing previously created tcp connection before opening it (in the same module instance) - Sun May 16 16:35:31 2010 +0200 -rev264 - smbman: added timer to echo the SMB server every 3 sec while not doing IO - Sun May 16 14:01:51 2010 +0200 -rev263 - smbman: added QueryDiskInfo request and his devctl function - Sun May 16 13:36:20 2010 +0200 -rev262 - smbman: added file IO getstat support - Sun May 16 13:21:34 2010 +0200 -rev261 - smbman: a few tweaks to the packet structs - Sat May 15 17:15:58 2010 +0200 -rev260 - smbman: added QueryPathInformation Trans2 request - Sat May 15 16:05:06 2010 +0200 -rev259 - smbman: modified smb_ReadAndX and smb_WriteAndX to support large files (>4GB) - Fri May 14 14:04:09 2010 +0200 -rev258 - smbman: added generic lseek64 support (needs PS2SDK lseek64 fix to work) - Fri May 14 13:32:58 2010 +0200 -rev257 - smbman: reviewed devctl functions - Fri May 14 10:17:05 2010 +0200 -rev256 - smbman: reviewed AddPassword function - Thu May 13 22:40:36 2010 +0200 -rev255 - * added method for managing passwords, re-enable smb_NTCreateAndX, small fix when read only mode requested - Thu May 13 16:14:45 2010 +0200 -rev254 - added smblab to test smbman functions - Thu May 13 11:48:13 2010 +0200 -rev253 - smbman: finished smb_NetShareEnum(), added smb_Echo(), refined devctls - Wed May 12 22:33:19 2010 +0200 -rev252 - tagged r245 as release 0.7 - Wed May 12 20:43:27 2010 +0200 -rev251 - smbman: fixed fatal error for compiling in smb_NetShareEnum() - Wed May 12 17:52:40 2010 +0200 -rev250 - added a few commands to smbman (TreeDisconnect, LogOffAndX, NetShareEnum) - Tue May 11 20:56:56 2010 +0200 -rev249 - Porting back the opl2iso into the main repository - Tue May 11 20:53:03 2010 +0200 -rev248 - added write support to smbman - Tue May 11 20:48:45 2010 +0200 -rev247 - added NTLMv1 authentification ability to smbman - Sun May 09 19:17:26 2010 +0200 -rev246 - added user security level to smbman, currently supports plaintext/encrypted passwords and LanMan authentification - Sun May 09 17:06:37 2010 +0200 -rev245 - updated version number to 0.7 and changelog, credits - Sat May 08 22:49:44 2010 +0200 -rev244 - izdubar: fix for 18K - Sat May 08 18:59:02 2010 +0200 -rev243 - IGR2 Fix 5. - Tue May 04 17:13:11 2010 +0200 -rev242 - IGR2 Fix 4. - Tue May 04 16:37:28 2010 +0200 -rev241 - corrected polish translation by Berion - Tue Mar 30 11:53:11 2010 +0200 -rev240 - Added an embedded Elf loader to the GUI (actually used on Exit to Elf) - Tue Mar 23 13:27:19 2010 +0100 -rev239 - IGR2 fix 3. - Mon Mar 15 10:06:28 2010 +0100 -rev238 - Pad repeat pre-delay (double the repeat delay for now). - Sat Mar 13 20:29:29 2010 +0100 -rev237 - Renamed iso2usbld to iso2opl, fix for running iso2opl on Big Endian systems - Sat Mar 06 18:17:59 2010 +0100 -rev236 - IGR2 fix 2. - Thu Mar 04 19:09:04 2010 +0100 -rev235 - Gilgamesh88: fix read buffer double increment bug in smbman.c - Wed Mar 03 19:47:29 2010 +0100 -rev234 - IRG2 first fix. ;) - Tue Mar 02 23:55:57 2010 +0100 -rev233 - smbman, usbhdfsd: just cosmetics, fixed indents and leading/trailing whitespaces - Tue Mar 02 11:36:07 2010 +0100 -rev232 - eesync/imgdrv: just cosmetics - Mon Mar 01 23:48:20 2010 +0100 -rev231 - just cosmetics: fixed indents, removed leading/trailing whitespaces - Mon Mar 01 20:05:55 2010 +0100 -rev230 - Fix: be sure HDD is actually used and selected before storing - Mon Mar 01 11:31:27 2010 +0100 -rev229 - HDD settings only stored on save, not test (untested) - Mon Mar 01 09:54:14 2010 +0100 -rev228 - merging branches - Mon Mar 01 08:53:18 2010 +0100 -rev227 - Two more fixes by Izdubar - Mon Mar 01 08:34:45 2010 +0100 -rev226 - Rewrote completly IGR. - Sun Feb 28 21:39:54 2010 +0100 -rev225 - dev9: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 21:39:13 2010 +0100 -rev224 - cddev, discID: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 21:30:38 2010 +0100 -rev223 - cdvdfsv: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 20:43:27 2010 +0100 -rev222 - cdvdman: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 20:32:54 2010 +0100 -rev221 - A couple of fixes: - Sun Feb 28 20:18:56 2010 +0100 -rev220 - * this slipped through - default delay should be 7 - Sun Feb 28 17:06:08 2010 +0100 -rev219 - * Cummulative patch by gilgamesh - consistency improvements - Fri Feb 26 08:58:19 2010 +0100 -rev218 - New coloured icons by Gilgamesh88 - Thu Feb 25 18:53:06 2010 +0100 -rev217 - Added PCMCIA support (auto-detected, should work with 18K atm) - Thu Feb 25 18:49:47 2010 +0100 -rev216 - Fix again to the sed command in all modules Rules.make files causing 'unrecognized -mcpu=r3000 option' on some dev environments - Thu Feb 25 18:46:47 2010 +0100 -rev215 - Working IGR fix for NFS Underground2 this time. :D - Mon Feb 22 09:10:51 2010 +0100 -rev214 - Removed PS2ETH and GSKIT vars definition from Makefile - Sun Feb 21 13:39:36 2010 +0100 -rev213 - Corrected misuse of ps2-packer in Makefile, sorry for those who'll need to move it - Tue Feb 16 20:40:56 2010 +0100 -rev212 - IGR fix 2. - Tue Feb 16 20:16:19 2010 +0100 -rev211 - Modified sed in Rules.make files to fix unrecognized option -mcpu=r3000 when using fr_FR.UTF-8 as LANG env var on some Linux distro - Tue Feb 16 16:02:03 2010 +0100 -rev210 - Add "Disable Debug Colors" setting. - Tue Feb 16 15:24:30 2010 +0100 -rev209 - zipped theme support (very slow) - Tue Feb 16 11:40:27 2010 +0100 -rev208 - Fix a bug when setting compatibility in multiple device. - Mon Feb 15 19:45:22 2010 +0100 -rev207 - IGR fixs: - Sun Feb 14 22:38:46 2010 +0100 -rev206 - A fix for the pink freezes when using custom lang file - Sun Feb 14 20:50:03 2010 +0100 -rev205 - Adding the ability to load language localisation files - Sun Feb 14 12:36:19 2010 +0100 -rev204 - Optimization of scePadRead hooking time. - Fri Jan 29 17:30:57 2010 +0100 -rev203 - Revert to sbv patch use with igr too. - Thu Jan 28 19:04:00 2010 +0100 -rev202 - Revert to Sbv patches use for old game compatibility. - Tue Jan 26 18:32:04 2010 +0100 -rev201 - Add a poweroff combo trick. - Sun Jan 24 19:12:07 2010 +0100 -rev200 - Add compat mode 6 to disable IGR. ( In compatibility settings ) - Sun Jan 24 10:20:58 2010 +0100 -rev199 - Loader size optimization. - Sat Jan 23 23:34:44 2010 +0100 -rev198 - Sorry .s file don't want to be push. - Sat Jan 23 14:59:52 2010 +0100 -rev197 - Loader size optimization. - Sat Jan 23 14:41:15 2010 +0100 -rev196 - home & end for HDD games - Thu Jan 21 22:02:25 2010 +0100 -rev195 - some more pointer handling fixes - Thu Jan 21 21:08:09 2010 +0100 -rev194 - pagestart handling fixes - Thu Jan 21 18:59:25 2010 +0100 -rev193 - Merging branches - Thu Jan 21 17:24:15 2010 +0100 -rev192 - * Selection in static mode now not centered (HDLoader like) - Thu Jan 21 17:17:07 2010 +0100 -rev191 - SMSMAP: wait link status forever (hopefully it fixes freeze on 1 bug) - Thu Jan 21 15:21:42 2010 +0100 -rev190 - Fix sound loop bug when using in game reset. - Thu Jan 21 15:19:56 2010 +0100 -rev189 - In Game Reset first shot. ( Disabled for the moment ) - Thu Jan 21 14:58:32 2010 +0100 -rev188 - get rid of kernel mem usage for patches code and let it handled by the loader - Thu Jan 21 00:06:19 2010 +0100 -rev187 - Added some generic patching mode for some games - Tue Jan 19 23:16:15 2010 +0100 -rev186 - cosmetic changes again to patches table code - Fri Jan 15 13:26:36 2010 +0100 -rev185 - Added patch for Armored Core Nine Breaker NTSC US via USB - Thu Jan 14 14:31:08 2010 +0100 -rev184 - Added value check to the game patching process - Wed Jan 13 20:26:43 2010 +0100 -rev183 - Loader now uses game patches (actually Disgaea PAL USB/SMB fix) - Wed Jan 13 16:53:31 2010 +0100 -rev182 - Enabled game patches table before to launch the loader - Wed Jan 13 10:41:07 2010 +0100 -rev181 - Added game patches table code - Tue Jan 12 22:25:22 2010 +0100 -rev180 - Slower Dialog scrolling. Also a speed handling fix. - Tue Jan 12 19:09:12 2010 +0100 -rev179 - HDD autostart option added. - Tue Jan 12 18:53:03 2010 +0100 -rev178 - some cosmetic changes to PS3 network fix - Tue Jan 12 18:32:17 2010 +0100 -rev177 - fix to SMSMAP to be able to use network on PS3 - Tue Jan 12 17:50:00 2010 +0100 -rev176 - adjusted DMA modes implementation (functional now) - Tue Jan 12 13:33:16 2010 +0100 -rev175 - Added DMA mode in UI - Tue Jan 12 12:45:43 2010 +0100 -rev174 - v12/v13 HDD detect fix: information given by dlanor - Sat Jan 09 13:43:03 2010 +0100 -rev173 - modified and tested HDD write OK (for compat modes), still disabled - Sat Jan 09 01:24:28 2010 +0100 -rev172 - totally ignore native HDL compatibilty modes - Fri Jan 08 14:33:15 2010 +0100 -rev171 - fix for lack of file opened check in smbman - Thu Jan 07 11:51:47 2010 +0100 -rev170 - fix for modchip freezing (maybe not all modchips) - Wed Jan 06 22:21:32 2010 +0100 -rev169 - Untested: - Wed Jan 06 21:27:09 2010 +0100 -rev168 - fixing bug in hdd usage gui selection - Wed Jan 06 20:28:31 2010 +0100 -rev167 - a copy-paste warning fix - Wed Jan 06 08:52:00 2010 +0100 -rev166 - First shot of HDD integration into GUI. Compat modes very rough. Untested! - Tue Jan 05 22:38:32 2010 +0100 -rev165 - added dutch language - Tue Jan 05 22:13:53 2010 +0100 -rev164 - changes to redundant code in system.c, changes to HDD compat modes handling - Tue Jan 05 20:42:05 2010 +0100 -rev163 - changes for SOCOM 3 Online playing - Tue Jan 05 17:13:56 2010 +0100 -rev162 - added poweroff support (currently disabled) - Mon Jan 04 19:48:35 2010 +0100 -rev161 - updated CREDITS file - Mon Jan 04 14:50:46 2010 +0100 -rev160 - HDL code: fix potential overflow while changing game name - Mon Jan 04 11:35:12 2010 +0100 -rev159 - changes to HDL code (added ability to save compat flags and game name) - Sun Jan 03 18:48:26 2010 +0100 -rev158 - added ps2hdd module, adjusted code to support 48-bit LBA HDD and set Transfer Mode - Sun Jan 03 15:59:19 2010 +0100 -rev157 - added atad module - Sun Jan 03 15:44:10 2010 +0100 -rev156 - fix to cdvdman so that HDD core is able to detect network adapter - Sun Jan 03 14:39:45 2010 +0100 -rev155 - changes again to HDD code - Sun Jan 03 11:16:39 2010 +0100 -rev154 - changes to HDD code - Sun Jan 03 11:04:27 2010 +0100 -rev153 - added HDL layer to GUI (currently disabled) - Sat Jan 02 20:57:22 2010 +0100 -rev152 - Game ID GUI and injection implementation (for DNAS) - Sat Jan 02 20:34:34 2010 +0100 -rev151 - changes to hdl header struct - Sat Jan 02 14:50:04 2010 +0100 -rev150 - added code for internal HDD support (HDL format) to cdvdman - Sat Jan 02 12:40:45 2010 +0100 -rev149 - fixes to SMB code for NAS devices not supporting Unicode strings - Fri Jan 01 20:18:19 2010 +0100 -rev148 - fixed bug in cdvdfsv never returning CDVD_READY_READY state for blocking mode - Fri Jan 01 15:42:27 2010 +0100 -rev147 - changes to be able to use a valid disc ID on online games - Thu Dec 31 09:25:44 2009 +0100 -rev146 - Adding the ability to choose the default menu (USB, NET, HDD games). - Mon Dec 28 21:27:32 2009 +0100 -rev145 - Network startup forced to be synchronous (Solution for bug #16, hopefully) - Sun Dec 27 17:33:49 2009 +0100 -rev144 - Better randomization of the port value (And even more hacky). Improves network startup delays significantly here - Sun Dec 27 17:18:04 2009 +0100 -rev143 - tagged r142 to release 0.6 - Sun Dec 27 17:00:13 2009 +0100 -rev142 - Updated version number - Sun Dec 27 14:29:14 2009 +0100 -rev141 - Hacky SMB speedup: "Randomize" the source port value to avoid port reusal. - Wed Dec 23 20:15:44 2009 +0100 -rev140 - updated CHANGELOG/CREDTIS/README files - Wed Dec 23 19:15:48 2009 +0100 -rev139 - Added configurable exit button - Wed Dec 23 13:20:55 2009 +0100 -rev138 - Changed UI color controls - Wed Dec 23 10:45:48 2009 +0100 -rev137 - fixed long reconnection time (yellow screen) - Tue Dec 22 22:25:22 2009 +0100 -rev136 - Added support for multiple partitions - Tue Dec 22 19:47:30 2009 +0100 -rev135 - Fixing linux samba compatibility (White screen removal fix) - Tue Dec 22 17:33:33 2009 +0100 -rev134 - Changed modes text - Tue Dec 22 16:54:22 2009 +0100 -rev133 - changes to SMSUTILS so it doesn't use PS2SDKSRC env var to build - Tue Dec 22 14:16:20 2009 +0100 -rev132 - new core merging step3: adapted EE core to new IOP core - Tue Dec 22 13:14:19 2009 +0100 -rev131 - new core merging step2: added new modules - Mon Dec 21 18:52:28 2009 +0100 -rev130 - new core merging step1: deleted modules - Mon Dec 21 16:51:23 2009 +0100 -rev129 - Implemented sorting (via select) - Mon Dec 21 15:36:12 2009 +0100 -rev128 - Adding two new icons - Mon Dec 21 15:26:46 2009 +0100 -rev127 - tagged r126 to release 0.5 - Wed Dec 02 13:11:06 2009 +0100 -rev126 - * Added languages - Wed Dec 02 10:52:36 2009 +0100 -rev125 - Czech welcome message update - Sun Nov 29 19:58:33 2009 +0100 -rev124 - added ioctl cmd to usbhdfsd to retrieve physical file sector - Sun Nov 29 16:28:09 2009 +0100 -rev123 - added sifman module, currently unused - Mon Nov 23 16:46:23 2009 +0100 -rev122 - reduced buffers again in isofs/smbman - Sun Nov 22 11:59:09 2009 +0100 -rev121 - try to use IPCONFIG.DAT from mc in slot 2 - Sun Nov 15 20:10:27 2009 +0100 -rev120 - chaanged some modules rules.make to build properly on my Ubuntu environment - Sat Nov 14 16:54:05 2009 +0100 -rev119 - changes to lwipopts.h to reduce SMSTCPIP mem usage - Fri Nov 13 18:55:53 2009 +0100 -rev118 - reduced IOP mem usage for isofs/smbman modules - Fri Nov 13 17:10:40 2009 +0100 -rev117 - Correcting hints - Fri Nov 13 14:42:11 2009 +0100 -rev116 - Adding UI component hint feature. Hints on Compat settings now - Fri Nov 13 09:43:26 2009 +0100 -rev115 - enlighted mass driver mem usage for mode 2 - Fri Nov 13 09:37:27 2009 +0100 -rev114 - implemented mode 2: have lower mem usage in SMSTCPIP/smbman modules - Thu Nov 12 20:51:39 2009 +0100 -rev113 - Enabled SMSMAP/SMSTCPIP IOP modules - Thu Nov 12 20:31:08 2009 +0100 -rev112 - Fixed pink screen, and bugs in IOP reboot - Thu Nov 12 19:26:35 2009 +0100 -rev111 - reverted loader changes: stupid idea to choose g_buf address at runtime - Thu Nov 12 16:08:21 2009 +0100 -rev110 - added compat mode 1, inverted modes 4 & 5 - Thu Nov 12 14:47:47 2009 +0100 -rev109 - added compat mode 4 & 5 - Wed Nov 11 22:26:12 2009 +0100 -rev108 - added compat mode 3 - Wed Nov 11 21:28:57 2009 +0100 -rev107 - Moving the compat mask to third argument - Wed Nov 11 21:08:01 2009 +0100 -rev106 - FIX: Temporary fix - Second pink freeze for some games - This helps another bit - Wed Nov 11 20:47:49 2009 +0100 -rev105 - Virt. keyboard now uses button icons - Wed Nov 11 16:21:25 2009 +0100 -rev104 - FIX: This removes the freeze on second pink for some games (on my machine) - Wed Nov 11 15:50:07 2009 +0100 -rev103 - Renaming to lower case - caused Error opening with case sensitive linux filesystem - Wed Nov 11 14:15:09 2009 +0100 -rev102 - Adding select and start button icons by JNABK - Wed Nov 11 10:54:19 2009 +0100 -rev101 - FIX: Compat settings now seem to propagate well. Copy-paste introduced bug fixed - Wed Nov 11 10:14:12 2009 +0100 -rev100 - set IP changed flag to ensure IP settings get saved - Wed Nov 11 10:09:52 2009 +0100 -rev99 - Merging changes - Wed Nov 11 09:51:39 2009 +0100 -rev98 - * Pass in the compat settings in the same string - Wed Nov 11 06:50:21 2009 +0100 -rev97 - fix: saving config if SYS-CONF doesn't exists - Tue Nov 10 22:08:55 2009 +0100 -rev96 - Compat settings count now 5, propagation to loader.c implemented - Tue Nov 10 22:07:31 2009 +0100 -rev95 - changes to SMSTCPIP/include/lwipopts.h - Tue Nov 10 19:50:50 2009 +0100 -rev94 - added missing smap_opt.s, updated CREDITS file - Tue Nov 10 19:16:23 2009 +0100 -rev93 - add SMSMAP/SMSTCIP modules, currently not used - Tue Nov 10 12:04:33 2009 +0100 -rev92 - added stuff to build an alternate loader (suitable for Sonic Unleashed) - Tue Nov 10 11:34:52 2009 +0100 -rev91 - FIX: Config loading was removed. Putting it back - Tue Nov 10 11:23:26 2009 +0100 -rev90 - FIX: Error codes are <0, not <=0. This could affect loading if file handle had value 0 - Tue Nov 10 10:25:24 2009 +0100 -rev89 - reverted netlog loading accidentally committed - Tue Nov 10 09:07:25 2009 +0100 -rev88 - fix for freezing multi-elf games - Tue Nov 10 09:06:29 2009 +0100 -rev87 - Adding missing icons - Mon Nov 09 20:32:32 2009 +0100 -rev86 - FIX: Issue 10 (share name overflow) - Mon Nov 09 20:29:58 2009 +0100 -rev85 - Show icons at background in config dialogs - Sun Nov 08 21:12:15 2009 +0100 -rev84 - Changed name, updated spanish translation, and now info txt shows in selected language - Sun Nov 08 20:04:14 2009 +0100 -rev83 - added missing ioman_add header file for dev9 module - Sun Nov 08 02:29:23 2009 +0100 -rev82 - enlighted dev9 module and added dev9x device driver - Sun Nov 08 02:13:54 2009 +0100 -rev81 - renamed GetSyscall to GetSycallHandler and use syscallnr header - Fri Nov 06 21:02:33 2009 +0100 -rev80 - FIX: The remaining ip config fields renumbered. That should be it - Fri Nov 06 20:57:03 2009 +0100 -rev79 - Fix: IP config screen had all the settings moved by one (renumbered the dialog but not the value injection) - Fri Nov 06 16:25:36 2009 +0100 -rev78 - Fix for the recent error with media and parts reading. - Fri Nov 06 08:48:56 2009 +0100 -rev77 - reverting back isofs to rev71 - Fri Nov 06 08:09:20 2009 +0100 -rev76 - reverted cdvdman & isofs to rev70 - Thu Nov 05 12:39:02 2009 +0100 -rev75 - Reverting this (commit by accident) - Wed Nov 04 18:12:29 2009 +0100 -rev74 - * New compat mode ui (via triangle) - currently without function - Wed Nov 04 17:18:48 2009 +0100 -rev73 - added SIF and SIF RPC init calls to cdvdman - Tue Nov 03 21:42:15 2009 +0100 -rev72 - few changes to cdvdman and commented unneeded code in smbman - Tue Nov 03 21:39:13 2009 +0100 -rev71 - fix for those games opening files with other flag than O_RDONLY - Tue Nov 03 18:50:05 2009 +0100 -rev70 - fix: smaller elf at second make all - Tue Nov 03 18:34:03 2009 +0100 -rev69 - fix for some games freezing while searching for a non-existent file - Mon Nov 02 18:09:42 2009 +0100 -rev68 - Added ugly virtual keyboard - Mon Nov 02 13:28:11 2009 +0100 -rev67 - Merging changes - Mon Nov 02 12:09:40 2009 +0100 -rev66 - New data driven dialog code. Needs color, enum and string inputs to be complete. IP config rewritten to use it. - Sun Nov 01 23:21:19 2009 +0100 -rev65 - remove pink screen when a IOP reset hook has finished (set_reg_hook reaches 0) - Sun Nov 01 20:25:52 2009 +0100 -rev64 - fix for white screens: bad gamename crc32 calculation - Sun Nov 01 20:25:10 2009 +0100 -rev63 - Small file adressing fix - Sun Nov 01 16:18:15 2009 +0100 -rev62 - Merged changes - Sun Nov 01 11:50:30 2009 +0100 -rev61 - Some input system rewrites, scrolling after dialog fix, settings only saved on save settings subitem now - Sat Oct 31 19:06:23 2009 +0100 -rev60 - usbhdfsd: removed use of PS2SDKSRC env var - Sat Oct 31 12:22:29 2009 +0100 -rev59 - Network UI improvements: Port and autostart settings, network loading feedback - Sat Oct 31 12:18:09 2009 +0100 -rev58 - Config handling improved - now remembers the loaded config and stores to the same location - Sat Oct 31 12:08:12 2009 +0100 -rev57 - iso2usbld: only use long long and not __int64 - Sat Oct 31 09:11:53 2009 +0100 -rev56 - iso2usbld: added commented use of open/read/write/lsee64/close - Sat Oct 31 07:09:53 2009 +0100 -rev55 - build iso2usbld on make pc_tools - Fri Oct 30 22:50:27 2009 +0100 -rev54 - Adding the missing network icons, sorry everyone! - Fri Oct 30 21:00:58 2009 +0100 -rev53 - Adding network icons by JNABK - Fri Oct 30 11:37:17 2009 +0100 -rev52 - just corrected a comment - Fri Oct 30 08:05:09 2009 +0100 -rev51 - fix once again to avoid breaking compatibility - Thu Oct 29 20:25:46 2009 +0100 -rev50 - another fix to fake module load to avoid breaking compatibility - Thu Oct 29 17:02:08 2009 +0100 -rev49 - fix for faking some modules load correctly - Thu Oct 29 16:58:07 2009 +0100 -rev48 - fix for multi-elf games freezing on pink - Thu Oct 29 14:07:59 2009 +0100 -rev47 - fixes for iso2usbld to handle large ISO (>4Gb) - Thu Oct 29 13:16:09 2009 +0100 -rev46 - renamed PUBLIC share to PS2SMB - Wed Oct 28 20:22:14 2009 +0100 -rev45 - modified iso2usbld CFLAGS - Wed Oct 28 18:29:11 2009 +0100 -rev44 - create USBLD folder on mass if not existing - Wed Oct 28 16:48:15 2009 +0100 -rev43 - apply IP settings to loader/modules - Wed Oct 28 13:49:58 2009 +0100 -rev42 - Added IP configuration screen - Wed Oct 28 12:34:45 2009 +0100 -rev41 - different fixes, one very important for iso2usbld - Wed Oct 28 12:00:29 2009 +0100 -rev40 - Updated CHANGELOG, README and CREDITS - Tue Oct 27 21:58:29 2009 +0100 -rev39 - Added missing license headers - Tue Oct 27 20:58:24 2009 +0100 -rev38 - added support to network games trought SMB protocol - Tue Oct 27 16:13:35 2009 +0100 -rev37 - just acouple changes for isofs patch & cdvdman - Mon Oct 26 20:27:06 2009 +0100 -rev36 - allow isofs to handle up to 8 parts - Mon Oct 26 18:52:16 2009 +0100 -rev35 - added .hgtags - Sat Oct 24 20:03:21 2009 +0200 -rev34 - added missing readonly makefile for mass_driver - Sat Oct 24 17:56:28 2009 +0200 -rev33 - disabled write support for ingame mass_driver - Sat Oct 24 16:14:24 2009 +0200 -rev32 - added LICENSE, README, CREDITS and CHANGELOG - Sat Oct 24 16:12:02 2009 +0200 -rev31 - New_Iop_Reset: switched to reset with EELOADCNF - Sat Oct 24 16:09:31 2009 +0200 -rev30 - Now searchs for USBD.IRX in MC. If not exists load embedded usbd.irx for each platform - Fri Oct 23 10:20:06 2009 +0200 -rev29 - static mode now fit with JNABK templates also in PAL mode - Thu Oct 22 20:27:52 2009 +0200 -rev28 - Fix: Welcome text showing extra text - Sun Oct 18 20:26:50 2009 +0200 -rev27 - fix for PS3 with software emulation - Sun Oct 18 00:48:15 2009 +0200 -rev26 - Added spanish translation - Sat Oct 17 22:54:56 2009 +0200 -rev25 - Oops. These slipped through. Reverting - Sat Oct 17 22:43:30 2009 +0200 -rev24 - Adding save icon - Sat Oct 17 20:44:42 2009 +0200 -rev23 - Adding language support - Sat Oct 17 16:32:20 2009 +0200 -rev22 - * rewritten the config file handling (to use key=val lines) - Sat Oct 17 16:30:30 2009 +0200 -rev21 - * cleaning up the code a bit - all menu construction now in main, etc. - Sat Oct 17 16:29:49 2009 +0200 -rev20 - isofs: fixed bug in skipmod_check() - Tue Oct 13 21:56:57 2009 +0200 -rev19 - modified isofs: allow it to fake some module load from cdrom - Tue Oct 13 17:55:35 2009 +0200 -rev18 - fix for 8+3 elf's filename - Tue Oct 06 08:52:56 2009 +0200 -rev17 - Added messages of what is doing makefile - Mon Oct 05 21:01:36 2009 +0200 -rev16 - fix: cdvdman.c:1708: warning: unused variable `netlog_modname' - Sun Oct 04 20:44:48 2009 +0200 -rev15 - loader: modified Patch_Img into Patch_Mod using g_buf - Sun Oct 04 20:43:49 2009 +0200 -rev14 - loader now loads at e8000 and use g_buf at 88000 - Sun Oct 04 19:38:27 2009 +0200 -rev13 - modified cdvdman: added stream and other fixes - Sun Oct 04 16:57:37 2009 +0200 -rev12 - modified isofs to handle media type - Sun Oct 04 15:45:04 2009 +0200 -rev11 - moved IOP reset to LoadExecPS2 replacement - Sun Oct 04 15:31:56 2009 +0200 -rev10 - added debug over ethernet - Sun Oct 04 15:13:06 2009 +0200 -rev9 - Updated interface - Sun Oct 04 14:56:59 2009 +0200 -rev8 - Updated interface with dynamic menu - Sun Oct 04 14:40:10 2009 +0200 -rev7 - a few fixes so that it can compile - Sun Oct 04 02:34:51 2009 +0200 -rev6 - iso2usbld: fixes for linux build - Fri Oct 02 18:40:33 2009 +0200 -rev5 - iso2usbld: fixed those deprecated type casts - Tue Sep 29 09:39:20 2009 +0200 -rev4 - bugfix for iso2usbld - Sun Sep 27 21:55:27 2009 +0200 -rev3 - modified .hignore - Sun Sep 27 21:20:14 2009 +0200 -rev2 - added open usb loader sources - Sun Sep 27 19:00:50 2009 +0200 -rev1 - added iso2usbld - Sun Sep 27 17:42:30 2009 +0200 -rev0 - added .hgignore - Sun Sep 27 17:36:34 2009 +0200 +rev736 - Removed tag 0.9.3 - Fri Dec 12 16:06:35 2014 +0800 +rev735 - Removed tag 0.9.3 - Fri Dec 12 16:06:34 2014 +0800 +rev734 - Rewrote HDD support to use the PS2 APA driver instead of HDLDump's code. - Fri Dec 12 16:06:07 2014 +0800 +rev733 - Dumbed-down the locking mechanism to use only sync_flag, as the use of the event flag APIs will still not totally protect against simultaneous access from an interrupt handler (It'll probably only fully work if the whole code was run from a syscall, but even SCE never did that). - Wed Dec 10 22:37:03 2014 +0800 +rev732 - Modified cdrom_read() to minimize the number of copy processes. - Sun Nov 30 16:02:34 2014 +0800 +rev731 - Added a fully streaming system. - Sun Nov 30 15:57:45 2014 +0800 +rev730 - Fixed sceCdChangeThreadPriority to not change the main thread priority* and added RPC support for it, added thread IDs for OPL's threads**, and added support for a streaming function callback***. - Sun Nov 30 15:55:35 2014 +0800 +rev729 - Replaced the old signaling system with one that works more like the SCE original, and fixed an age-long offset-calculation bug in CDVDFSV. - Sun Nov 30 15:29:16 2014 +0800 +rev728 - Removed the use of (internal & non-standard) sceCdRead0 function, old (unused) reading core and refactored the reading system. - Sun Nov 30 15:09:37 2014 +0800 +rev727 - (*) Useless GSM VMODE Removal (1st draft) - Sun Nov 30 14:13:05 2014 +0800 +rev726 - (*) Hey Bat, try not to break non-GSM builds of OPL next time, willya?!? *LOL* - Thu Nov 20 04:11:28 2014 -0500 +rev725 - (*) Decided to let the new logo escape the asylum. Those who want to classic - Mon Nov 10 13:09:00 2014 -0500 +rev724 - Sync-Merged with ifcaro/open-ps2-loader - Mon Nov 10 04:42:25 2014 -0500 +rev723 - (*) Per-Game GSM is COMPLETE! Repository frozen for now. Thanks to SP193 for - Sun Nov 09 16:11:59 2014 -0500 +rev722 - (*) Whoops! - Sat Nov 08 16:25:46 2014 -0500 +rev721 - (*) Went to far re-globalizing GSM - Sat Nov 08 10:30:24 2014 -0500 +rev720 - (*) Re-globalized GSM - Fri Nov 07 22:05:32 2014 -0500 +rev719 - (*) Per-Game GSM Complete (I think). There were two solutions to the issue. I - Wed Nov 05 19:51:47 2014 -0500 +rev718 - Merged ifcaro/open-ps2-loader into default - Mon Nov 03 23:31:15 2014 -0500 +rev717 - Added tag 0.9.3 for changeset 1fbd6857681b - Mon Nov 03 15:34:49 2014 -0500 +rev716 - (*) Per-Game GSM (In One Commit) - couldn't make sense of the shit I had - Sat Nov 01 10:26:48 2014 -0400 +rev715 - Merged in Aced14/open-ps2-loader/ps2rd-max-codes-250 (pull request #11) - Sat Nov 01 10:26:12 2014 -0400 +rev714 - Increased ps2rd's cheat line limit (MAX_CODES) to 250. - Sun Nov 09 19:16:08 2014 +0800 +rev713 - Improved IGR stability (E P), fixed MC slot 1 use when a VMC is mounted as the 2nd slot (E P), fixed art drawing, fixed poor game list loading performance and brought forward texture cache initialization. - Sun Nov 09 04:25:05 2014 -0500 +rev712 - Replaced all obsolete Makefile rule files with a common file and integrated the discID module into the EE side. - Mon Nov 03 21:35:05 2014 +0800 +rev711 - Changed auto-refresh behaviour and fixed the SMB reconnect option: - Tue Oct 14 22:29:01 2014 +0800 +rev710 - Updated the GUI to have device-dependent refresh rates and moved some of the static buffers in CDVDMAN onto the stack. - Sun Oct 12 23:13:38 2014 +0800 +rev709 - README edited online with Bitbucket - Fri Oct 10 23:19:40 2014 +0800 +rev708 - README edited online with Bitbucket - Tue Oct 07 09:20:45 2014 +0000 +rev707 - Fixed DEVCTL code handling in CDVDMAN, syntax errors and SMB mode error handling when there isn't a network adaptor attached. - Tue Oct 07 09:18:40 2014 +0000 +rev706 - Improved on the reliability of USB support, added more error messages for SMB and removed VSYNC mode: - Tue Oct 07 16:57:28 2014 +0800 +rev705 - Fix for Crash Bandicoot: The Wrath of Cortex. - Tue Oct 07 01:57:13 2014 +0800 +rev704 - Fixes: - Mon Oct 06 00:00:36 2014 +0800 +rev703 - Fixes and optimizations: - Sun Oct 05 08:31:44 2014 +0800 +rev702 - Rewritten the patching system and how parameters are passed to IOPCORE, for maintainability. - Sat Oct 04 09:39:20 2014 +0800 +rev701 - Added a patch for Super Robot Wars IMPACT, and optimized CDVDMAN's callback functionality. - Sat Oct 04 03:45:38 2014 +0800 +rev700 - Fixed CDVDMAN initialization. Fixes: SSX World Tour and the Harry Potter series. - Fri Oct 03 05:35:49 2014 +0800 +rev699 - Updated USBHDFSD to support disks >1TB and <=2TB (Sync'ed with PS2SDK update). - Tue Sep 30 08:54:16 2014 +0800 +rev698 - Corrected path handling, which was broken in commit e5e85f0. - Tue Sep 30 01:01:15 2014 +0800 +rev697 - Fixes and updates: - Sun Sep 28 09:44:28 2014 +0800 +rev696 - in-game SMB fixes and enhancements: - Mon Sep 08 20:36:57 2014 +0800 +rev695 - Added an option for DTL-T100dded an option for DTL-T10000 support, since this unit can have a different set of IOP modules in its flash ROM. - Wed Aug 20 22:47:26 2014 +0800 +rev694 - SP193: FreeType fix - Mon Aug 04 13:07:19 2014 +0800 +rev693 - More Makefile fixes - In order to CHILDPROOF, RTL, GSM and CHEAT switches work properly - Sat Jul 12 16:07:03 2014 -0300 +rev692 - Makefile fix to build without PS2RD Cheat Engine (CHEAT = 0) - Wed Jul 09 19:37:45 2014 -0300 +rev691 - EE Core - Only Install PadOpen Hook if IGR is enabled - Wed Jul 09 15:43:00 2014 -0300 +rev690 - Merged doctorxyz's commit with mine. - Fri Jul 04 08:47:43 2014 -0300 +rev689 - OPL+PS2RD Cheat Engine Integration - Thu Jun 26 19:13:48 2014 +0800 +rev688 - Updated OPL to compile with the new PS2SDK. - Mon Jun 23 08:20:53 2014 -0300 +rev687 - Fixed the theme bug and improved code: - Mon Jun 23 18:39:24 2014 +0800 +rev686 - Sync'ing with the PS2SDK commit for today: the main point behind this commit is the rollback of the use of the pre and post-DMA callbacks within DEV9, for compatibility with a certain clone adaptor. - Sun Jun 15 18:52:00 2014 +0800 +rev685 - Merged in psx_core/open-ps2-loader/psx_core/the-most-accurate-and-correct-translatio-1384761167035 (pull request #6) - Tue Jun 10 21:47:33 2014 +0800 +rev684 - The most accurate and correct translation from english to russian by RA1n. (lang_Russian.lng edited online with Bitbucket) - Sun Jun 01 19:35:01 2014 +0800 +rev683 - Fixed a buffer overflow problem in CDVDFSV and refactored all CDVDMAN defines: - Mon Nov 18 07:52:59 2013 +0000 +rev682 - Added a proper patch for Choujikuu Yousai Macross (SLPM-65405). - Fri May 09 21:50:36 2014 +0800 +rev681 - Completed the integrated DECI2 debugging system and updated some log messages. - Thu May 01 17:01:58 2014 +0800 +rev680 - Completed the incomplete modifications from the previous commit + enhanced IGR. - Tue Apr 22 00:57:53 2014 +0800 +rev679 - changes.txt - Mon Apr 21 22:21:07 2014 +0800 +rev678 - Updated OPL to be fully compatible (compiles without the deprecated warnings) with the HEAD revision of the PS2SDK. - Sat Apr 19 13:52:29 2014 +0800 +rev677 - *Changed the configGetString function to return a const value, since the configuration keys are not to be changed without configSetStr(), except for two lines within themes.c. This is to safeguard against accidental configuration corruption/overwriting. - Sat Jan 11 20:27:05 2014 +0800 +rev676 - * Updating LNG files - Ethernet modes (among other things) were missing. - Wed Nov 06 13:16:17 2013 +0800 +rev675 - Reverting the change in the previous commit. - Fri Nov 01 12:42:36 2013 -0400 +rev674 - Fix for the workaround for the Chinese SATA network adaptor: I forgot that the register is 16-bit, which means that the adaptor probably reports 0xFFFF as its version number. - Fri Nov 01 20:32:26 2013 +0800 +rev673 - *Ported over the workaround for Chinese SATA network adaptors (See the PS2SDK update for today). - Fri Nov 01 17:43:16 2013 +0800 +rev672 - * Rev672 tapped for release - updated changelogs. - Fri Nov 01 13:47:59 2013 +0800 +rev671 - *Replaced the TLB reinitialization mechanism with a built-in one. No more patching/hooking onto the EE kernel for that! Done partly for compatibility with the PSX. - Fri Oct 25 17:52:49 2013 -0400 +rev670 - * Hey Bat! Try not to commit non-default changes to Makefiles next time, will - Thu Oct 24 15:13:40 2013 +0800 +rev669 - * MASSIVE UPDATE - Consider deleting and re-cloning your local repos if - Tue Oct 22 14:06:16 2013 -0400 +rev668 - * Massive changes to GSM function calls - some of which were so similar that - Tue Oct 22 13:55:08 2013 -0400 +rev667 - * Anticipating blood-curdling scream from SP193! - Mon Oct 21 17:29:56 2013 -0400 +rev666 - * Cleaned up GSM code - Fri Oct 18 12:43:06 2013 -0400 +rev665 - Added tag 0.9.2 for changeset 3eb5ac59e7a5 - Wed Oct 16 17:05:23 2013 -0400 +rev664 - (*) Refreshed language files - Sat Oct 12 06:59:14 2013 -0400 +rev663 - (*) Aaaand after a half-assed busted GUI staring me dead in the face for over - Sat Oct 12 06:57:49 2013 -0400 +rev662 - Updating CHANGELOG ahead of release - actual release revision can be - Fri Oct 11 17:49:17 2013 -0400 +rev661 - * Rebase complete - Wed Oct 02 11:29:13 2013 -0400 +rev660 - *Modified compatibility mode 7 to not affect sceCdStRead(), as the streaming functions are already underperforming. - Tue Oct 01 16:43:01 2013 -0400 +rev659 - *Sync'ing the HDD module updates for the PSX. OPL should now run properly on the PSX. - Wed Oct 02 00:17:01 2013 +0800 +rev658 - *Sync'ing HDD updates... again. - Tue Oct 01 23:04:45 2013 +0800 +rev657 - *Sync'ing the updates in the PS2SDK with the ATAD modules here: common/include/atahw.h was updated, and all ATAD modules are using the commands defined within atahw.h. - Sun Sep 29 19:22:24 2013 +0800 +rev656 - *Optimized CDVDMAN (Declared internal structures and functions as static). - Fri Sep 27 18:22:17 2013 +0800 +rev655 - The original files I modified couldn't be committed directly into the repository, so I had to check out a new copy of the repository and copy my changes over manually. - Mon Sep 02 15:21:49 2013 +0800 +rev654 - *Updated ATAD (Normal ATAD and the HDPro version) to be the same as the ones from the PS2SDK. - Thu Aug 08 14:22:12 2013 +0800 +rev653 - *Re-added SPU reset code. CLEARSPU shouldn't be used and I was wrong about that. - Thu Aug 08 14:12:32 2013 +0800 +rev652 - *Added sceCdPowerOff(). Games that power off the console should be able to do so now. - Sun Jul 21 12:12:43 2013 +0800 +rev651 - *Cleaned up IGR code. - Wed Jul 17 15:08:08 2013 +0800 +rev650 - Added power-off processing code. Games (mainly older one) that use it should no longer cause a deadlock. - Wed Jul 17 13:12:54 2013 +0800 +rev649 - *Updated all DEV9 and ATAD module code. - Sat Jun 15 01:56:50 2013 +0800 +rev648 - (AKuHAK): Updated OPL to support the updated LIBPNG port. - Sat Jun 15 01:26:36 2013 +0800 +rev647 - Removed the integrated FreeType copy. Please update your FreeType library (From ps2sdk-ports)! - Sat Jun 15 00:52:08 2013 +0800 +rev646 - *Removed the old Protokernel patch, since the PS2SDK now has a complete one. - Sun Jun 02 20:44:40 2013 +0800 +rev645 - *Removed the old Protokernel patch, since a full patch has been integrated into the PS2SDK. - Thu Mar 21 00:11:48 2013 +0800 +rev644 - Added tag 0.9.1 for changeset 2ebb9bb56c19 - Thu Mar 21 00:08:41 2013 +0800 +rev643 - Updated USBLD_VERSION to "0.9" - Mon Aug 13 06:00:01 2012 -0300 +rev642 - Added tag 0.9 for changeset 830d78f67941 - Mon Aug 13 05:57:32 2012 -0300 +rev641 - Updated CHANGELOG and DETAILED_CHANGELOG files - Sat Jul 28 10:35:29 2012 -0300 +rev640 - Disabling auto-refresh of game list by default, as it is causing bugs sometimes - Sat Jul 28 10:35:22 2012 -0300 +rev639 - mgh: fix for default HDD DMA mode, that wasn't correctly set - Tue May 01 16:37:04 2012 +0200 +rev638 - Suggestion from "mgh". - Thu Apr 26 22:46:24 2012 +0200 +rev637 - Fix a bug (in revision 426) which made "Mode 3 - Unhook Syscalls" un-effectivei ("Unhook Syscalls" was in fact activated by "Mode 7 - Reduced memory usage", which was setting both modes 3&7). - Mon Mar 26 22:40:28 2012 +0200 +rev636 - * fix for theme font handling (when switching back to the default theme, the language font wasn't re-applyied) - Sat Mar 24 22:08:24 2012 +0100 +rev635 - damn wide font ;) - Sat Mar 24 00:21:03 2012 +0100 +rev634 - Added hidden options to be able to define your own device delay before loading ART/config files. - Wed Mar 07 21:32:39 2012 +0100 +rev633 - layout adjustment - Wed Mar 07 21:17:18 2012 +0100 +rev632 - language files update - Wed Mar 07 20:54:36 2012 +0100 +rev631 - don't do HDD checks when no vmc configuref - Tue Mar 06 19:31:33 2012 +0100 +rev630 - fix for corrupted graphics when manipulating config files - Sun Mar 04 23:03:08 2012 +0100 +rev629 - SilverBull: apply a delay to CDVDMAN functions (initially for Shadow Heart 2) - Sun Mar 04 17:47:44 2012 +0100 +rev628 - adding i18n strings - Sun Mar 04 14:36:46 2012 +0100 +rev627 - Big up for Volca ... slowdown the busy icon - Wed Feb 29 22:53:10 2012 +0100 +rev626 - fix for wrapping artefact when display_mode=ALWAYS - Mon Feb 27 21:18:00 2012 +0100 +rev625 - remove useless code for compatibility mode 7 which is unused now. - Mon Feb 27 18:53:58 2012 +0100 +rev624 - fix for broken UL on ETH mode - Sun Feb 26 14:57:10 2012 +0100 +rev623 - make start/select button skinnable - Sun Feb 26 12:58:47 2012 +0100 +rev622 - make action buttons skinnable - Sat Feb 25 10:55:24 2012 +0100 +rev621 - small correction for gcc warning - Fri Feb 24 23:08:05 2012 +0100 +rev620 - * CRITICAL FIX for 4K disk. It was broken since the beginning for both UL and ISO (2 bugs, one when checking for the cluster size for UL, and one for UL/ISO when patching the usb_cdvdman_irx) - Fri Feb 24 20:20:27 2012 +0100 +rev619 - Finalize the "list share" feature. Now you can list the share, select one from the list and OPL will connect it and display the games. - Fri Feb 24 19:59:26 2012 +0100 +rev618 - * fix a refresh bug introduced lately - Mon Feb 20 23:22:33 2012 +0100 +rev617 - cosmetics again (prefixing every LOG by its location) - Sun Feb 19 17:44:06 2012 +0100 +rev616 - just some cosmetics - Sun Feb 19 16:32:35 2012 +0100 +rev615 - * don't display a share connection error when listing share - Sun Feb 19 15:46:15 2012 +0100 +rev614 - Hey Hominem ... don't commit shit you used for trying to reproduce some bug ;) - Sun Feb 19 14:28:36 2012 +0100 +rev613 - Adding ETHPrefix to fix the use of some box/NAS adding a sub path to the share - Sat Feb 18 11:43:45 2012 +0100 +rev612 - few changes to be able to refresh the menu from anywhere (should be used when selecting a share, after connecting to it, refresh the menu, but it doesn't work currently due to the info screen crashing ...) - Sat Feb 18 11:16:58 2012 +0100 +rev611 - * Add a feature to list network shares. Just let the sharename empty into network settings, and OPL will try to connect and list the shares (BUT then don't try to do anything with the share list, their are handled like games, but are not, so everything would crash) - Sat Feb 18 11:07:07 2012 +0100 +rev610 - * reverted some changes from rev500, finally crazyc was correct (when he skipped one vmc in error, but still wrote the structure in IRX but with flag as inactive) - Thu Feb 16 22:38:21 2012 +0100 +rev609 - load and use the internal LOGO before swapping theme (avoid flickering at startup) - Wed Feb 15 22:13:25 2012 +0100 +rev608 - NOTE: Concerning my comment in R606, I'm sorry Volca, the code wasn't "dangerous" and didn't write memory out of bounds (thanks to the check < MAX_GS_MODE) - Sun Feb 12 23:02:04 2012 +0100 +rev607 - fix small bug in alternate device mode, when loading config files - Sat Feb 11 15:33:02 2012 +0100 +rev606 - * fixed dangerous code (out of bounds memory writing in renderman) - Fri Feb 10 18:41:41 2012 +0100 +rev605 - clarify the gui - Fri Feb 10 00:19:28 2012 +0100 +rev604 - Some changes in the way the network is "reloaded". - Wed Feb 08 21:18:17 2012 +0100 +rev603 - * Minor GUI changes (deferred error message display, small optim for main loop) - Tue Feb 07 23:06:20 2012 +0100 +rev602 - Added "InfoHintText" element, to be able to put a small version of hints for the info screen. - Mon Feb 06 22:19:26 2012 +0100 +rev601 - Remove useless stuff (was thing for RTL transposition only, which will not be implemented after all as too complicated) - Tue Jan 31 23:05:17 2012 +0100 +rev600 - Fix for space and punctuation characters. These one are weak/neutral and should not change the current rendering direction. - Tue Jan 31 22:18:03 2012 +0100 +rev599 - Support for Right-to-Left scripting (Hebrew, Arabic, Syriac, Tifinar, ... languages) - Tue Jan 31 21:49:25 2012 +0100 +rev598 - merge (?) - Sat Jan 28 21:55:11 2012 +0100 +rev597 - Work around FOR PFS BUG with O_TRUNC - Sat Jan 14 15:24:26 2012 +0100 +rev596 - Polishing things, full IO for loading/saving of config files, factorization, ... - Sat Jan 14 15:19:09 2012 +0100 +rev595 - automatically create the CFG folder - Sat Jan 14 11:25:39 2012 +0100 +rev594 - remove duplicate methods / factorization (need to ensure compatibility mode among other don't have regression) - Sun Jan 08 13:59:22 2012 +0100 +rev593 - Configuration related to DNAS/VMC/DMA/COMPAT are now saved in single per game files on each media. - Sun Jan 08 01:40:40 2012 +0100 +rev592 - fixed the alternate device mode. - Sat Jan 07 23:38:56 2012 +0100 +rev591 - l_oliveira: fix for SCPH-10000 with Sony Kernel update - Fri Oct 14 10:20:26 2011 +0200 +rev590 - fix for Kingdom Hearts 2: Final Mix(SLPM_666.75) gummi missions freezing - Tue Oct 25 20:33:55 2011 +0200 +rev589 - fix cdinited flag for SSX on Tour (broken in r585) - Mon Jun 20 18:09:10 2011 +0200 +rev588 - update to comply with the latest PS2SDK - Thu Jun 09 17:05:57 2011 +0200 +rev587 - Fixed sceGetReadPos() to return the buffer offset in 2048-byte units (Updated dynamically). - Thu Jun 09 16:52:44 2011 +0200 +rev586 - Added new patch for Rugby League 2: World Cup Edition (PAL). - Wed May 04 16:40:35 2011 +0800 +rev585 - romz: added better cd tray emulation (fixes A2M games) - Sat Apr 30 22:29:07 2011 +0800 +rev584 - extracted code branching from ItemsList drawing and main drawing method - Fri Apr 29 17:48:50 2011 +0200 +rev583 - fix for the "alternate device mode" that was failing to re-read the configuration files from "mass" device - Wed Mar 09 23:39:07 2011 +0100 +rev582 - * use alignment for clipped/wrapped text - Sun Mar 06 01:42:13 2011 +0100 +rev581 - ItemsList can now use clipping too. As a result, the "items" option for ItemsList has been removed. Now to limit the number of items being displayed, specify a "height" value. - Sun Mar 06 00:05:42 2011 +0100 +rev580 - * caching of last attribute value (for AttributeText/Image element), to not search the config file every frame - Sat Mar 05 22:10:20 2011 +0100 +rev579 - cdvdfsv: implemented sceCdChangeThreadPriority export (as suggested by romz) - Sat Mar 05 19:11:31 2011 +0100 +rev578 - fix EE core makefiles (alt EE core broken in r546) - Mon Feb 28 10:32:09 2011 +0100 +rev577 - * minor addition to have more transitions - Mon Feb 28 09:56:24 2011 +0100 +rev576 - Probable fix for the previous random crash (rev 572) at startup - Sat Feb 26 21:27:05 2011 +0100 +rev575 - * fix problem with semaphore - Wed Feb 23 11:03:52 2011 +0100 +rev574 - Merged changes - Tue Feb 22 23:52:13 2011 +0100 +rev573 - * Added text block rendering function - Tue Feb 22 21:45:42 2011 +0100 +rev572 - * add a delay before loading per-game config file (same as Art, to not spam when navigating very fast) - Tue Feb 22 21:43:36 2011 +0100 +rev571 - Merged changes - Tue Feb 22 21:11:38 2011 +0100 +rev570 - * Fix for rendering problems caused by CLUT alpha setting change - Tue Feb 22 20:20:19 2011 +0100 +rev569 - use deferred IO to load config file (should be more safe, got sometimes corrupted file before) - Tue Feb 22 20:19:45 2011 +0100 +rev568 - * Font rendering now uses clut - Mon Feb 21 23:14:38 2011 +0100 +rev567 - * hints now display either "Info" or "Run" depending if the presentation page is available in the theme AND the option is enabled in settings - Mon Feb 21 22:41:46 2011 +0100 +rev566 - * add loading attributes from a per-game file - Mon Feb 21 00:25:03 2011 +0100 +rev565 - fix for config reading, "val" were truncated at 32 char (copy/paste typo) - Sun Feb 20 22:48:39 2011 +0100 +rev564 - * added new element type "StaticText" to display an hardcoded/static string to the screen - Sat Feb 19 22:49:11 2011 +0100 +rev563 - * added information page (new option to enable it or not) - Sat Feb 19 01:33:36 2011 +0100 +rev562 - First working version of the font atlasing. Probably still buggy so beware :D - Fri Feb 18 20:18:17 2011 +0100 +rev561 - small fixes - Mon Feb 14 22:58:02 2011 +0100 +rev560 - * Fix for rendering artifacts on disabled vsync (the reason was we didn't wait for GS to finish before ending the frame) - Sun Feb 13 01:43:02 2011 +0100 +rev559 - * Improvement for the config reader - it now handles python-like prefixes. Also added a safeguard for the max length of key and value in splitter - Sat Feb 12 18:04:35 2011 +0100 +rev558 - Erf first "merge" (I hope it works ...) - Sat Feb 12 16:22:24 2011 +0100 +rev557 - First step (almost) finished - Sat Feb 12 11:56:55 2011 +0100 +rev556 - step 2, loose coupling - Sat Feb 12 11:56:09 2011 +0100 +rev555 - first step of the theme/menu rendering rewrite - Sun Feb 06 10:48:00 2011 +0100 +rev554 - romz: fix for cdvdman's sceCdSC() - Fri Feb 04 14:19:11 2011 +0100 +rev553 - fix for "use_default=0" option in theme (entering the virtual keyboard was crashing, among other ...) - Sun Feb 06 17:39:33 2011 +0100 +rev552 - * fix a bug in color settings not applied to elements (needed to restart OPL, or cicle with another theme) - Tue Feb 01 08:42:07 2011 +0100 +rev551 - fix for language fonts being reset-ed when changing theme - Mon Jan 31 21:51:58 2011 +0100 +rev550 - re work of virtual keyboard (needed to remove the non-latin characters), added focus on current selected chars - Sun Jan 30 22:23:20 2011 +0100 +rev549 - * saved some place in game settings (to add future GSM settings) - Sun Jan 30 20:57:10 2011 +0100 +rev548 - fix for broken hdldsrv (since r517/r521) - Sun Jan 30 17:57:54 2011 +0100 +rev547 - just some cosmetics to the main Makefile - Fri Jan 28 11:07:45 2011 +0100 +rev546 - just some cosmetics for the EE core - Thu Jan 20 16:56:51 2011 +0100 +rev545 - fix (hopefully) for DVD9 games - Thu Jan 20 15:32:05 2011 +0100 +rev544 - fix for Sonic Unleashed (broken in r515) - Wed Jan 19 15:07:45 2011 +0100 +rev543 - Merged changes - Wed Jan 19 09:19:30 2011 +0100 +rev542 - * Mode setting (PAL/NTSC/Auto) - Sun Jan 16 20:03:21 2011 +0100 +rev541 - * Implemented kerning - Sun Jan 16 19:51:10 2011 +0100 +rev540 - * Longer first-press delay for pads - more comfy controls on max repeat speed - Sun Jan 16 19:49:53 2011 +0100 +rev539 - * Added sclean make target for make clean without Freetype - Sun Jan 16 19:28:44 2011 +0100 +rev538 - EP: fix for POPWW (SLUS_210.22) - Sun Jan 16 19:23:58 2011 +0100 +rev537 - fix for the HD Pro (doesn't support idle timeout) - Sun Jan 16 12:13:12 2011 +0100 +rev536 - fix for white screen freezing in 'Tenchu: Wrath of Heaven' - Sun Jan 16 12:03:57 2011 +0100 +rev535 - fix for the BSOD at game launch on some PS3 (added timeout on wait SPU reset) - Sun Jan 09 17:49:56 2011 +0100 +rev534 - fix for POPWW (SLES_528.22) over SMB, HDD - Sat Jan 08 15:10:07 2011 +0100 +rev533 - fix for SSX on Tour - Sat Jan 08 09:29:46 2011 +0100 +rev532 - small fixes - Fri Jan 07 15:11:50 2011 +0100 +rev531 - short ELF name in App list (looks better for most themes) - Fri Jan 07 13:52:39 2011 +0100 +rev530 - Added option to specify the HDD spin down time out. - Fri Jan 07 13:12:02 2011 +0100 +rev529 - implemented hddSetIdleTimeout() - Wed Jan 05 22:04:17 2011 +0100 +rev528 - removed hdpro_checker IOP module (HD Pro is now detected directly from EE) - Wed Jan 05 17:04:27 2011 +0100 +rev527 - changes to be able to debug IOP core with HD Pro - Tue Jan 04 18:13:31 2011 +0100 +rev526 - added in-game code for HD Pro - Tue Jan 04 13:33:33 2011 +0100 +rev525 - added hdpro_atad IOP module (HD Pro users should have their games listed) - Tue Jan 04 12:16:56 2011 +0100 +rev524 - added hdpro_checker IOP module (detect if HD Pro Kit is present) - Tue Jan 04 09:09:45 2011 +0100 +rev523 - fix for Street Fighter Zero Fighters Generation (SLPM_664.09) by lee4, reverted Capcom Classics Collection fix - Mon Jan 03 21:14:55 2011 +0100 +rev522 - Fix for Capcom Classics Collection - Sat Jan 01 10:04:43 2011 +0100 +rev521 - fix for broken SMB (by r517) on some setup - Thu Dec 30 19:36:30 2010 +0100 +rev520 - * Added theme support for multiple fonts (default_font, font0, font1... + _font=ID in the components) - Thu Dec 30 19:09:57 2010 +0100 +rev519 - configurable IGR path (limited to 32 characters) - Thu Dec 30 12:41:14 2010 +0100 +rev518 - fix for game ID system (broken in r513) - Thu Dec 30 00:34:02 2010 +0100 +rev517 - saved 4k of IOP mem in cdvdman/SMB, direct write to buffer - Wed Dec 29 21:10:54 2010 +0100 +rev516 - * Added support for multiple fonts (not used but there ;)) - Wed Dec 29 20:44:02 2010 +0100 +rev515 - fix for Capcom protected games (SFAA, VDC) - Wed Dec 29 18:03:32 2010 +0100 +rev514 - fix for games from 'Army Men' series - Wed Dec 29 15:28:31 2010 +0100 +rev513 - cdvdman: fix potential buffer overflow for long ISO filenames - Fri Dec 24 16:56:55 2010 +0100 +rev512 - enlarged cdvdman buffer for ISO name to 64 bytes - Mon Dec 20 19:39:15 2010 +0100 +rev511 - when creating a new VMC, the gEnableRenameDelete option should not be applied - Mon Dec 20 17:07:51 2010 +0100 +rev510 - * switch default background mode to "Art" - Sun Dec 19 17:57:47 2010 +0100 +rev509 - * fix USB fragmentation check of Game file parts (it should now works as expected) - Sun Dec 19 17:27:55 2010 +0100 +rev508 - fix for 10K patches freezing on some modchipped PS2 - Sun Dec 19 16:48:50 2010 +0100 +rev507 - * add configurable USB delay (3 is the default value currently used). If you have OPL stuck on yellow or orange screen (when using USB mode only), try increasing this value - Sun Dec 19 13:59:33 2010 +0100 +rev506 - fix for Super Dimensional Fortress Macross (SLPM_654.05) over HDD - Sat Dec 11 16:57:17 2010 +0100 +rev505 - final translations for release 0.8 - Sat Dec 11 10:16:21 2010 +0100 +rev504 - tagged r503 as release v0.8 - Thu Dec 09 20:37:29 2010 +0100 +rev503 - izdubar: added an About screen to the GUI - Wed Dec 08 12:58:24 2010 +0100 +rev502 - languages updates - Wed Dec 08 12:56:57 2010 +0100 +rev501 - work around for the infinite refresh on some NAS device - Tue Dec 07 11:29:46 2010 +0100 +rev500 - a few fixes so that OPL can comply with some Digitus NAS (with the help of Thinner), removed obsoletes language files and added 'Filipino' language file - Mon Dec 06 08:52:19 2010 +0100 +rev499 - update for Turkish language - Sat Dec 04 18:53:39 2010 +0100 +rev498 - fix for english and french translation - Sun Nov 28 19:31:10 2010 +0100 +rev497 - small fixes - Sun Nov 28 13:28:01 2010 +0100 +rev496 - Thanks to jimmi's help and ideas, things should now be fixed for alternate device start (and traditional mode too). - Sun Nov 28 01:29:24 2010 +0100 +rev495 - added ability to use '-use-early-debug' arg (for using ps2client netdump) - Sun Nov 28 01:10:54 2010 +0100 +rev494 - * devices started in alternate mode now have valid hints - Sat Nov 27 15:10:04 2010 +0100 +rev493 - genvmc: wait progress message update before to return from vmc_abort() call - Sat Nov 27 01:05:50 2010 +0100 +rev492 - genvmc: fixed IOP freezing on vmc_abort() call - Sun Nov 21 17:26:46 2010 +0100 +rev491 - added debug prints to genvmc module - Sun Nov 21 16:52:36 2010 +0100 +rev490 - modified sysReset() to allow genvmc to load properly - Sun Nov 21 15:25:00 2010 +0100 +rev489 - * create an opl.icn into the OPL folder on MC, so the PS2 browser doesn't display it as corrupted data - Sun Nov 21 15:02:05 2010 +0100 +rev488 - * IPCONFIG.DAT file now loaded from the alternate device too - Fri Nov 19 11:07:24 2010 +0100 +rev487 - When no config for OPL is found: - Fri Nov 19 00:24:13 2010 +0100 +rev486 - Fix in samba code: server buffer size could be set to 0 due to the type casting - Wed Nov 17 23:25:56 2010 +0100 +rev485 - small fixes (USB delay, result return) - Wed Nov 10 20:27:28 2010 +0100 +rev484 - * Applications configuration file is read from alternate device too - Sat Oct 30 20:22:45 2010 +0200 +rev483 - Enable saving settings capability on USB or HDD. - Sat Oct 30 19:40:47 2010 +0200 +rev482 - small changes - Sat Oct 30 03:20:45 2010 +0200 +rev481 - * IO thread stabilization attempt (not sure if it helps, but it seems so) - Fri Oct 15 23:57:44 2010 +0200 +rev480 - small bug with VMC settings - Fri Oct 15 20:26:44 2010 +0200 +rev479 - add some error messages to warn user of various failing situations - Wed Oct 06 19:47:22 2010 +0200 +rev478 - fix compat flag problem on HDD due to merge - Wed Oct 06 19:41:50 2010 +0200 +rev477 - make alt background configurable too - Tue Oct 05 15:32:05 2010 +0200 +rev476 - Start the pads before loading the config, as we may have to set the scrolling speed. - Mon Oct 04 20:50:07 2010 +0200 +rev475 - few changes for SMB (in particular for device in "security share" mode - Mon Oct 04 20:05:11 2010 +0200 +rev474 - added FILEIO version check, to be sure - Mon Oct 04 19:11:24 2010 +0200 +rev473 - fix hdd partition check - Mon Oct 04 17:23:39 2010 +0200 +rev472 - patch for FILEIO remove rpc handler - Mon Oct 04 10:20:37 2010 -0500 +rev471 - updated smblab - Mon Oct 04 16:52:40 2010 +0200 +rev470 - reviewed labs so they can compile - Mon Oct 04 12:48:31 2010 +0200 +rev469 - only show VMC delete (and change size) button if "Rename/delete" operation are enabled in settings - Mon Oct 04 12:03:13 2010 +0200 +rev468 - fioXXX operations on SMB makes strange things - Sun Oct 03 21:05:29 2010 +0200 +rev467 - fioXXX operations on SMB make strange things ... - Sun Oct 03 16:37:42 2010 +0200 +rev466 - merge vmc fork - Sun Oct 03 16:37:08 2010 +0200 +rev465 - fix DNAS settings bug - Sun Oct 03 08:03:17 2010 -0500 +rev464 - fix for invalid background when rendering guiMsgBox (deletion warning of VMC items) - Sun Oct 03 14:33:52 2010 +0200 +rev463 - WARNING: uncertain change ! - Sun Oct 03 11:35:49 2010 +0200 +rev462 - remember last focused item when reseting dialog - Sun Oct 03 00:49:09 2010 +0200 +rev461 - I like to commit in two-phases ... - Sun Oct 03 00:28:10 2010 +0200 +rev460 - fix for OK buttons - Sat Oct 02 11:21:02 2010 +0200 +rev459 - Opps, disable VMC by default ... (as it is only GUI stuff, we don't want to confuse users ;)) - Sat Oct 02 11:19:48 2010 +0200 +rev458 - Added VMC GUI (first shot) - Sat Oct 02 00:38:50 2010 +0200 +rev457 - moved IOP modules to more explicit subfolders - Fri Oct 01 23:38:07 2010 +0200 +rev456 - added mcman module and genvmclab - Thu Sep 30 17:28:59 2010 +0200 +rev455 - save config files individually - Mon Sep 27 20:33:56 2010 +0200 +rev454 - prepare stuff for VMC - Sun Sep 19 12:37:24 2010 +0200 +rev453 - * removing settings for hdd was doing bad things - Sun Sep 19 00:52:26 2010 +0200 +rev452 - * shutdown routine was free-ing stuff still used into the launch method ... - Sat Sep 18 23:04:37 2010 +0200 +rev451 - more corrections - Sat Sep 18 22:26:05 2010 +0200 +rev450 - save config *before* shutting down the config files - Sat Sep 18 00:40:21 2010 +0200 +rev449 - fixed a few bugs: - Sat Sep 18 00:24:12 2010 +0200 +rev448 - * compatibility settings for HDD are now saved into the config files. - Fri Sep 17 22:43:08 2010 +0200 +rev447 - fixed broken themes on MC - Fri Sep 17 21:35:50 2010 +0200 +rev446 - should fix the invalid list positioning - Mon Sep 13 22:11:29 2010 +0200 +rev445 - added file fragmentation test for USB games, code from Polo35 (VMC branch) - Sun Sep 12 11:23:06 2010 +0200 +rev444 - splitted settings into "main settings" and "graphic settings" - Sat Sep 11 23:45:42 2010 +0200 +rev443 - added "childproof" mode: - Sat Sep 11 22:36:59 2010 +0200 +rev442 - add rename/delete functionality to Apps - Wed Sep 08 23:58:07 2010 +0200 +rev441 - added hint for "X Play" - Wed Sep 08 22:44:13 2010 +0200 +rev440 - added genvmc command-line tool for pc - Sat Sep 04 21:55:21 2010 +0200 +rev439 - update modload version check in MODLOAD hooking - Sat Sep 04 20:27:17 2010 +0200 +rev438 - added rename and delete functionality for UL format (ul.cfg) - Sat Sep 04 10:23:55 2010 +0200 +rev437 - only apply sorting, when autosort settings enabled - Fri Sep 03 23:22:33 2010 +0200 +rev436 - fix update of HDD game list after restarting modules (when leaving HDLD server) - Fri Sep 03 20:43:36 2010 +0200 +rev435 - enable HDD rename/delete - Fri Sep 03 19:55:34 2010 +0200 +rev434 - fix again for those games resetting IOP with null arg - Fri Sep 03 09:57:04 2010 +0200 +rev433 - Added "rename" and "delete" functionalities for games. - Fri Sep 03 09:07:57 2010 +0200 +rev432 - smbman: added debug prints ability - Thu Sep 02 23:07:32 2010 +0200 +rev431 - use MODLOAD hooking on IOP instead of patching LMB on EE - Thu Sep 02 19:01:13 2010 +0200 +rev430 - fix for alternative EE core build - Thu Sep 02 16:07:15 2010 +0200 +rev429 - fix: give some delay to ingame mass driver - Fri Aug 20 11:05:42 2010 +0200 +rev428 - EE core: get rid of libc dependency - Thu Aug 19 09:56:14 2010 +0200 +rev427 - IGR: use kernel's InitializeTLB instead of syscall - Wed Aug 11 18:52:17 2010 +0200 +rev426 - EE core: rewrote all syscall hooks in asm - Sun Aug 08 20:52:36 2010 +0200 +rev425 - EE core: a few tweaks to asm code - Sat Aug 07 21:36:24 2010 +0200 +rev424 - EE core: improved LoadExecPS2/SifSetDma hooks - Thu Aug 05 22:28:01 2010 +0200 +rev423 - update spanish language file - Thu Aug 05 21:27:58 2010 +0200 +rev422 - added Italian language file - Thu Aug 05 19:53:32 2010 +0200 +rev421 - EE core: a few tweaks to asm code - Wed Aug 04 20:05:27 2010 +0200 +rev420 - EE core: improve LoadExecPS2 hooking (fixes Tecmo Hit Parade SLPS_204.01) - Tue Aug 03 20:35:24 2010 +0200 +rev419 - crazyc: add MC dump ability to genvmc - Tue Aug 03 17:03:25 2010 +0200 +rev418 - fix for Star Ocean 3 - Till the End of Time (broken in r395) - Mon Aug 02 21:42:12 2010 +0200 +rev417 - fix for V-Rally 3 PAL (SLES_507.25) - Mon Aug 02 16:31:25 2010 +0200 +rev416 - fix for Shaun Palmer's Pro Snowboarder US (SLUS_201.99) - Sat Jul 31 21:31:30 2010 +0200 +rev415 - few i18n changes - Sat Jul 31 17:37:41 2010 +0200 +rev414 - clean-up in GUI strings (removed old entries, added missing values) - Fri Jul 30 22:51:02 2010 +0200 +rev413 - fix for NRA Gun Club (SLUS_214.32) - Thu Jul 29 21:30:45 2010 +0200 +rev412 - improvements to genvmc module - Mon Jul 26 20:26:00 2010 +0200 +rev411 - added genvmc IOP module - Mon Jul 26 14:19:49 2010 +0200 +rev410 - fix attempt for Jak X - Sun Jul 25 17:22:56 2010 +0200 +rev409 - fix for those games rebooting IOP with null arg (fixes Bloody Roar 3) - Sat Jul 24 10:09:38 2010 +0200 +rev408 - fix for GTA 3 a-spec over SMB - Fri Jul 23 17:39:26 2010 +0200 +rev407 - cdvdfsv: name module like orginal one - cdvd_ee_driver - Fri Jul 23 13:39:36 2010 +0200 +rev406 - EE core: fix for Quake III Revolution - Fri Jul 23 10:40:53 2010 +0200 +rev405 - fix for Jak 3 - Thu Jul 22 18:25:23 2010 +0200 +rev404 - fix for Full Spectrum Warrior - Thu Jul 22 08:49:21 2010 +0200 +rev403 - fix for those having SMB slowdown/freeze issue on some setups - Wed Jul 21 21:44:41 2010 +0200 +rev402 - cdvdman: fix lseek fileIO (fixes Shadow of Ganymede) - Wed Jul 21 18:52:43 2010 +0200 +rev401 - HDD core fix: init filesystem before to return disc type (fixes Xyanide Resurrection) - Tue Jul 20 20:16:31 2010 +0200 +rev400 - Added translation information for custom language - Tue Jul 20 16:08:45 2010 +0200 +rev399 - dlanor: fix for invisible cursor GUI glitch - Tue Jul 20 15:29:15 2010 +0200 +rev398 - fix for Viewtiful Joe - Sun Jul 18 16:05:12 2010 +0200 +rev397 - fix for EveryBody's Golf and other games - Sun Jul 18 15:58:03 2010 +0200 +rev396 - added feature to be able to disable sceSifStopModule/sceSifUnloadModule - Sat Jul 17 17:26:26 2010 +0200 +rev395 - hook SCE's SifLoadModuleBuffer to fake some modules to be loaded correctly through LoadModuleBuffer calls - Sat Jul 17 16:42:48 2010 +0200 +rev394 - fix for Kya: Dark Lineage PAL (SLES_514.73) - Sat Jul 17 09:33:09 2010 +0200 +rev393 - fix for V-Rally 3 US (SLUS_204.96) - Thu Jul 15 15:06:51 2010 +0200 +rev392 - fix for Kya: Dark Lineage US (SLUS_204.40) - Thu Jul 15 13:21:31 2010 +0200 +rev391 - changed the patches for Prince Of Persia: The Two Thrones - Wed Jul 14 19:19:34 2010 +0200 +rev390 - fix for Prince of Persia: The Two Thrones NTSC U (SLUS_212.87) - Wed Jul 14 19:15:35 2010 +0200 +rev389 - hdldsvr: use real HDD writes - Tue Jul 13 12:35:52 2010 +0200 +rev388 - udptty: redirect Kprintf output to tty - Tue Jul 13 09:41:41 2010 +0200 +rev387 - cdvdman: set cdstatus to CDVD_STAT_PAUSE in sceCdStStart/sceCdStResume - Mon Jul 12 20:50:43 2010 +0200 +rev386 - added EELOAD patches - Sun Jul 11 16:42:07 2010 +0200 +rev385 - fix for Suikoden IV (HDD) broken in r359 - Wed Jul 07 19:24:05 2010 +0200 +rev384 - fix for Prince of Persia: The Two Thrones PAL (SLES_537.77) - Tue Jul 06 09:49:52 2010 +0200 +rev383 - cdvdman: do not allocate IOP memory in cd callback handler (fixes Syphon Filter Logan's Shadow on HDD) - Mon Jul 05 19:01:47 2010 +0200 +rev382 - EE core: change stack pointer a bit earlier - Sun Jul 04 18:30:17 2010 +0200 +rev381 - EE core: use an intermediate stack during the IOP reset 'hook' code - Fri Jul 02 21:59:55 2010 +0200 +rev380 - use maximum priority for EE SMB password hashing thread - Fri Jul 02 21:50:10 2010 +0200 +rev379 - Fix for Suikoden V (in patch form) - Fri Jul 02 19:30:42 2010 +0200 +rev378 - fix for Max Payne EU version (SLES_503.25) - Fri Jul 02 16:19:09 2010 +0200 +rev377 - * make arrow icons customizable - Thu Jul 01 21:08:36 2010 +0200 +rev376 - PS3 fix 2: use XLOADFILE when building EELOADCNF - Wed Jun 30 23:44:26 2010 +0200 +rev375 - PS3 fix 1: reinstated cddev module use in EE core - Wed Jun 30 21:47:52 2010 +0200 +rev374 - * don't unmount pfs0 when we are launching an app that is on HDD - Wed Jun 30 21:21:18 2010 +0200 +rev373 - fix number 2 for Kingdom Hearts 2 gummi ship missions (should fix all regions) - Wed Jun 30 21:00:04 2010 +0200 +rev372 - fix for Kingdom Hearts 2 (SLUS_210.05) freeze on gummi ship missions - Wed Jun 30 14:38:03 2010 +0200 +rev371 - Apply Max Payne US patch on all 3 cores - Wed Jun 30 11:01:15 2010 +0200 +rev370 - SMSTCPIP: revert ARP_QUEUEING setting change (should fix broken Downhill Domination - SCUS_971.77 via SMB) - Tue Jun 29 16:56:26 2010 +0200 +rev369 - added compatibility mode 8 (should fix NFS Underground 2 - SLUS_210.65) - Tue Jun 29 16:45:45 2010 +0200 +rev368 - fix for the recent freezing using themes - Mon Jun 28 19:39:40 2010 +0200 +rev367 - changed smbauth & tcpip threads priorities (fixes Spiderman 3 and Genji) - Mon Jun 28 18:08:42 2010 +0200 +rev366 - link GUI SMB auth stuff to SMB core - Mon Jun 28 08:34:57 2010 +0200 +rev365 - * startup logo implementation, with a placeholder Logo - Sun Jun 27 22:55:56 2010 +0200 +rev364 - SMB core: do not perform password hashing if SMB server uses plaintext passwords - Sun Jun 27 20:41:48 2010 +0200 +rev363 - Max Payne US version (SLUS_202.30) fix for SMB use - Sun Jun 27 19:38:17 2010 +0200 +rev362 - EE core: added a ResetSPU() in LoadExecPS2 hook - Sun Jun 27 18:53:00 2010 +0200 +rev361 - added User Security Level support to SMB core - Sun Jun 27 18:51:33 2010 +0200 +rev360 - cdvdman: change back SceCdTrayReq traycheck return value - Sat Jun 26 22:04:12 2010 +0200 +rev359 - SMB core: save more IOP memory to increase compatibility - Sat Jun 26 09:38:33 2010 +0200 +rev358 - removed cddev module use from EE core, removed cddev - Fri Jun 25 10:36:55 2010 +0200 +rev357 - default to settings menu when no devices started or no config file found - Wed Jun 23 13:31:22 2010 +0200 +rev356 - * re-enable game "test" functionality (from compatibility settings) - Wed Jun 23 12:55:53 2010 +0200 +rev355 - use ICO fix (r346) only in compatibility mode 7 - Wed Jun 23 12:06:48 2010 +0200 +rev354 - smbman: do not rely on EndOfSearch but rather SearchCount field - Wed Jun 23 09:54:52 2010 +0200 +rev353 - remove uneeded stuff from ps2link module - Tue Jun 22 22:31:11 2010 +0200 +rev352 - EE core: remove InitializeUserMemory() patch when removing kernel hooks - Mon Jun 21 12:43:50 2010 +0200 +rev351 - fix: do no longer use sbv_patch_user_mem_clear() to be compatible with faulty DMS4 modchip - Mon Jun 21 11:02:31 2010 +0200 +rev350 - ps2link module: corrected Makefile - Sun Jun 20 19:46:58 2010 +0200 +rev349 - reload ps2link module on 'make debug' rule - Sun Jun 20 19:00:52 2010 +0200 +rev348 - fix: HDD gamelist was deallocated too early in HDD game launch process - Sat Jun 19 11:52:19 2010 +0200 +rev347 - * ISO support also "enabled" for USB (don't know what is the filesize limit, either 2Go or 4Go) - Sat Jun 19 11:08:28 2010 +0200 +rev346 - cdvdfsv: remove a 2KB of wasted IOP mem (fixes ICO - SCUS_971.59 via SMB) - Fri Jun 18 22:36:12 2010 +0200 +rev345 - SMSTCPIP: adjust PBUF_POOL_SIZE for ingame use (fixes again Disgaea SLUS_206.66 broken since r283) - Fri Jun 18 22:08:30 2010 +0200 +rev344 - added a new compatibilty mode: "reduce the buffers used by cdvdman/cdvdfsv" - Thu Jun 17 12:14:37 2010 +0200 +rev343 - added make_changelog.sh script and DETAILED_CHANGELOG file - Wed Jun 16 21:56:10 2010 +0200 +rev342 - cdvdman: check faulty filepath(more than one ';1') - fixes WWE Smackdown! Shut your mouth (SLUS_204.83) - Wed Jun 16 20:25:36 2010 +0200 +rev341 - use ioptrap module while debugging - Wed Jun 16 19:51:14 2010 +0200 +rev340 - fix for HDD games compat modes saving to another game when using sorted list - Wed Jun 16 14:12:26 2010 +0200 +rev339 - cdvdman fix: dread must return entry size (fixes Captain Tsubasa SLPS_256.91) - Mon Jun 14 20:30:37 2010 +0200 +rev338 - removed netlog module (now replaced by UDPtty) - Sun Jun 13 17:37:48 2010 +0200 +rev337 - make use of UDPtty for in-game debugging - Sun Jun 13 14:55:24 2010 +0200 +rev336 - 10K patch fix: only patch kernel if not already patched - Sun Jun 13 14:48:15 2010 +0200 +rev335 - fix for exiting kernel mode correctly while applying 10K patches - Sat Jun 12 15:05:24 2010 +0200 +rev334 - use more versatile code to get ROMVER info in 10K patches - Sat Jun 12 13:03:30 2010 +0200 +rev333 - remove debug from 10K patches - Sat Jun 12 12:47:16 2010 +0200 +rev332 - 10K fix 2: OPL now runs on original 10K kernel - Fri Jun 11 23:42:36 2010 +0200 +rev331 - loader: do a system restart in LoadExecPS2 hook as the real syscall does (reinitialize GS, INTC, TIMER, DMAC, VU0, VU1, VIF0, VIF1, GIF, IPU, FPU and ScratchPad - Fri Jun 11 23:39:48 2010 +0200 +rev330 - hdd.c: do not deallocate partion table when it's not allocated - Wed Jun 09 21:13:38 2010 +0200 +rev329 - free the HDL game list and HDD partition table in hddCleanup() - Tue Jun 08 22:06:03 2010 +0200 +rev328 - 10K fix 1: OPL now runs on patched 10K kernel - Tue Jun 08 20:07:04 2010 +0200 +rev327 - modified Disc ID stuff to no longer freeze on No disc/Invalid disc - Tue Jun 08 12:07:01 2010 +0200 +rev326 - fix to avoid warning on unused variable in hdd.c - Sun Jun 06 21:08:31 2010 +0200 +rev325 - modified and tested HDD deleting game code (real writes still deactivated) - Sun Jun 06 16:00:49 2010 +0200 +rev324 - use EE SIO debug in the loader - Sun Jun 06 15:57:29 2010 +0200 +rev323 - use EE SIO debug output in the GUI on 'make EESIO_debug' - Sat Jun 05 14:53:15 2010 +0200 +rev322 - cdvdman: be compatible with mass storage device having sector size of 4096 - Fri Jun 04 11:18:35 2010 +0200 +rev321 - usbhdfsd: added an ioctl to return mass storage device sectorsize - Thu Jun 03 12:49:06 2010 +0200 +rev320 - * Fix for issue #29 (dia.c tooltip display) - Thu Jun 03 11:26:33 2010 +0200 +rev319 - Put plasma speed back after the framerate optimization - Wed Jun 02 19:40:33 2010 +0200 +rev318 - cdvdman: be compatible with mass storage having sector size of 512, 1024, 2048 - Wed Jun 02 19:19:00 2010 +0200 +rev317 - * separate background rendering (Issue #31) - Wed Jun 02 18:32:30 2010 +0200 +rev316 - usbhdfsd: removed unused code in fs_getFileStartSector() - Wed Jun 02 18:29:25 2010 +0200 +rev315 - cdvdman: fix for my previous code tweak breaking compat with SMB games in ul format - Wed Jun 02 16:42:36 2010 +0200 +rev314 - cdvdman: code tweaking for opening ISO file(s) - Wed Jun 02 15:38:01 2010 +0200 +rev313 - cdvdman: optimized code size for plain ISO support in cdvdman_ReadSect() - Wed Jun 02 15:19:27 2010 +0200 +rev312 - fix for theme choosen not saving - Wed Jun 02 13:05:27 2010 +0200 +rev311 - use LOG() rather than printf() - Mon May 31 20:12:26 2010 +0200 +rev310 - fix for issue #23 - Mon May 31 12:03:14 2010 +0200 +rev309 - make use of udptty in debug version - Sun May 30 19:36:35 2010 +0200 +rev308 - added udptty module - Sun May 30 17:25:10 2010 +0200 +rev307 - forgot system.h, now added - Sat May 29 20:34:44 2010 +0200 +rev306 - added system.h and sysLoadModuleBuffer to able to check for modules already loaded - Sat May 29 18:03:54 2010 +0200 +rev305 - added lanman module & lanlab - Sat May 29 17:57:43 2010 +0200 +rev304 - moved smblab & hdldsvrlab to labs folder - Sat May 29 16:00:14 2010 +0200 +rev303 - small fix in game disc settings handling - Sat May 29 13:39:14 2010 +0200 +rev302 - * stop io timer while io is blocked (seems not to affect the hdl server transfer rate though :( ) - Sat May 29 01:33:40 2010 +0200 +rev301 - buffered write (for config file) - Fri May 28 18:14:10 2010 +0200 +rev300 - Fixing issue #21 - Fri May 28 16:54:37 2010 +0200 +rev299 - * Maybe a more resource friendly (but a bit awkward for now) hdld svr screen - Thu May 27 19:44:24 2010 +0200 +rev298 - smbman: reconnect, re-logon and re-open share on connection loss - Thu May 27 18:51:56 2010 +0200 +rev297 - smbman: removed connect/disconnect (now done by logon/logoff) - Thu May 27 16:47:17 2010 +0200 +rev296 - SMSMAP: do not wait forever for link established (wait around 10s otherwise fails to load) - Thu May 27 15:13:17 2010 +0200 +rev295 - added hdldsvrlab for testing purpose - Thu May 27 14:29:57 2010 +0200 +rev294 - fix for SMB "file open" in APPEND mode - Thu May 27 11:44:40 2010 +0200 +rev293 - Removing unzip, not used any more - Thu May 27 11:33:26 2010 +0200 +rev292 - fix for themes listing in SMB mode - Thu May 27 08:32:30 2010 +0200 +rev291 - Fix for missing Art in SMB mode - Wed May 26 23:01:04 2010 +0200 +rev290 - renamed hdl.c to hdd.c and hddFormat() to hddGetFormat() - Wed May 26 22:27:36 2010 +0200 +rev289 - * Fork merge: Porting back the GUI repository changes - Wed May 26 20:48:07 2010 +0200 +rev288 - added hddFormat, hddDeleteHDLGame (untested) - Wed May 26 20:01:23 2010 +0200 +rev287 - fix for LoadHdldsvr() and UnloadHdldSvr() - Tue May 25 08:35:24 2010 +0200 +rev286 - added UnloadHdldSvr() - Sun May 23 17:25:33 2010 +0200 +rev285 - added LoadHdldSvr() to GUI (currently never called) - Sun May 23 16:08:35 2010 +0200 +rev284 - hdldsvr: use real writes (the module is not loaded by the GUI) - Sun May 23 09:45:54 2010 +0200 +rev283 - hdldsvr: added CMD_WRIT & CMD_WRIS, completed UDP thread part (only fake writes) - Sat May 22 18:18:32 2010 +0200 +rev282 - hdldsvr: added CMD_FLSH & CMD_POWX - Sat May 22 11:41:45 2010 +0200 +rev281 - hdldsvr: a fix in interpreting/replying command result - Fri May 21 10:51:18 2010 +0200 +rev280 - hdldsvr: added CMD_STAT & CMD_READ (hdl_dump able to attach and list games) - Fri May 21 10:11:22 2010 +0200 +rev279 - added hdldsvr IOP module skeleton - Fri May 21 10:07:45 2010 +0200 +rev278 - added a specific SMSTCPIP for ingame use, and re-enabled UDP in the normal one - Thu May 20 20:13:19 2010 +0200 +rev277 - Anti-freeze fix for NBSS Session KeepAlive in smbman and ingame SMB core - Thu May 20 19:57:09 2010 +0200 +rev276 - make use of new smbman fileXio functions - Wed May 19 21:20:43 2010 +0200 +rev275 - applied SMB connection speedup to ingame SMB core - Tue May 18 20:28:56 2010 +0200 +rev274 - smbman: finished chdir implementation - Tue May 18 12:43:54 2010 +0200 +rev273 - smbman: implemented dopen/dread/dclose/chdir (chdir is not complete) - Tue May 18 12:00:32 2010 +0200 +rev272 - smbman: implemented FindFirst2, FindNext2 requests, different tweaks to make connection faster - Mon May 17 22:16:40 2010 +0200 +rev271 - smbman: fixed a killer buffer overflow while generating DES keys - Mon May 17 17:11:56 2010 +0200 +rev270 - smbman: added mkdir IO function, make LogOn not retrying forever - Mon May 17 12:37:30 2010 +0200 +rev269 - smbman: added Rename request and his rename IO function - Sun May 16 19:03:49 2010 +0200 +rev268 - smbman: added Delete Directory request and his rmdir IO function - Sun May 16 17:43:06 2010 +0200 +rev267 - smbman: added Delete request and his remove IO function - Sun May 16 16:59:25 2010 +0200 +rev266 - smbman: added poll() to not lock forever using lwip_recv - Sun May 16 16:35:31 2010 +0200 +rev265 - smbman: fix for closing previously created tcp connection before opening it (in the same module instance) - Sun May 16 14:01:51 2010 +0200 +rev264 - smbman: added timer to echo the SMB server every 3 sec while not doing IO - Sun May 16 13:36:20 2010 +0200 +rev263 - smbman: added QueryDiskInfo request and his devctl function - Sun May 16 13:21:34 2010 +0200 +rev262 - smbman: added file IO getstat support - Sat May 15 17:15:58 2010 +0200 +rev261 - smbman: a few tweaks to the packet structs - Sat May 15 16:05:06 2010 +0200 +rev260 - smbman: added QueryPathInformation Trans2 request - Fri May 14 14:04:09 2010 +0200 +rev259 - smbman: modified smb_ReadAndX and smb_WriteAndX to support large files (>4GB) - Fri May 14 13:32:58 2010 +0200 +rev258 - smbman: added generic lseek64 support (needs PS2SDK lseek64 fix to work) - Fri May 14 10:17:05 2010 +0200 +rev257 - smbman: reviewed devctl functions - Thu May 13 22:40:36 2010 +0200 +rev256 - smbman: reviewed AddPassword function - Thu May 13 16:14:45 2010 +0200 +rev255 - * added method for managing passwords, re-enable smb_NTCreateAndX, small fix when read only mode requested - Thu May 13 11:48:13 2010 +0200 +rev254 - added smblab to test smbman functions - Wed May 12 22:33:19 2010 +0200 +rev253 - smbman: finished smb_NetShareEnum(), added smb_Echo(), refined devctls - Wed May 12 20:43:27 2010 +0200 +rev252 - tagged r245 as release 0.7 - Wed May 12 17:52:40 2010 +0200 +rev251 - smbman: fixed fatal error for compiling in smb_NetShareEnum() - Tue May 11 20:56:56 2010 +0200 +rev250 - added a few commands to smbman (TreeDisconnect, LogOffAndX, NetShareEnum) - Tue May 11 20:53:03 2010 +0200 +rev249 - Porting back the opl2iso into the main repository - Tue May 11 20:48:45 2010 +0200 +rev248 - added write support to smbman - Sun May 09 19:17:26 2010 +0200 +rev247 - added NTLMv1 authentification ability to smbman - Sun May 09 17:06:37 2010 +0200 +rev246 - added user security level to smbman, currently supports plaintext/encrypted passwords and LanMan authentification - Sat May 08 22:49:44 2010 +0200 +rev245 - updated version number to 0.7 and changelog, credits - Sat May 08 18:59:02 2010 +0200 +rev244 - izdubar: fix for 18K - Tue May 04 17:13:11 2010 +0200 +rev243 - IGR2 Fix 5. - Tue May 04 16:37:28 2010 +0200 +rev242 - IGR2 Fix 4. - Tue Mar 30 11:53:11 2010 +0200 +rev241 - corrected polish translation by Berion - Tue Mar 23 13:27:19 2010 +0100 +rev240 - Added an embedded Elf loader to the GUI (actually used on Exit to Elf) - Mon Mar 15 10:06:28 2010 +0100 +rev239 - IGR2 fix 3. - Sat Mar 13 20:29:29 2010 +0100 +rev238 - Pad repeat pre-delay (double the repeat delay for now). - Sat Mar 06 18:17:59 2010 +0100 +rev237 - Renamed iso2usbld to iso2opl, fix for running iso2opl on Big Endian systems - Thu Mar 04 19:09:04 2010 +0100 +rev236 - IGR2 fix 2. - Wed Mar 03 19:47:29 2010 +0100 +rev235 - Gilgamesh88: fix read buffer double increment bug in smbman.c - Tue Mar 02 23:55:57 2010 +0100 +rev234 - IRG2 first fix. ;) - Tue Mar 02 11:36:07 2010 +0100 +rev233 - smbman, usbhdfsd: just cosmetics, fixed indents and leading/trailing whitespaces - Mon Mar 01 23:48:20 2010 +0100 +rev232 - eesync/imgdrv: just cosmetics - Mon Mar 01 20:05:55 2010 +0100 +rev231 - just cosmetics: fixed indents, removed leading/trailing whitespaces - Mon Mar 01 11:31:27 2010 +0100 +rev230 - Fix: be sure HDD is actually used and selected before storing - Mon Mar 01 09:54:14 2010 +0100 +rev229 - HDD settings only stored on save, not test (untested) - Mon Mar 01 08:53:18 2010 +0100 +rev228 - merging branches - Mon Mar 01 08:34:45 2010 +0100 +rev227 - Two more fixes by Izdubar - Sun Feb 28 21:39:54 2010 +0100 +rev226 - Rewrote completly IGR. - Sun Feb 28 21:39:13 2010 +0100 +rev225 - dev9: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 21:30:38 2010 +0100 +rev224 - cddev, discID: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 20:43:27 2010 +0100 +rev223 - cdvdfsv: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 20:32:54 2010 +0100 +rev222 - cdvdman: just cosmetics, fixed indents and leading/trailing whitespaces - Sun Feb 28 20:18:56 2010 +0100 +rev221 - A couple of fixes: - Sun Feb 28 17:06:08 2010 +0100 +rev220 - * this slipped through - default delay should be 7 - Fri Feb 26 08:58:19 2010 +0100 +rev219 - * Cummulative patch by gilgamesh - consistency improvements - Thu Feb 25 18:53:06 2010 +0100 +rev218 - New coloured icons by Gilgamesh88 - Thu Feb 25 18:49:47 2010 +0100 +rev217 - Added PCMCIA support (auto-detected, should work with 18K atm) - Thu Feb 25 18:46:47 2010 +0100 +rev216 - Fix again to the sed command in all modules Rules.make files causing 'unrecognized -mcpu=r3000 option' on some dev environments - Mon Feb 22 09:10:51 2010 +0100 +rev215 - Working IGR fix for NFS Underground2 this time. :D - Sun Feb 21 13:39:36 2010 +0100 +rev214 - Removed PS2ETH and GSKIT vars definition from Makefile - Tue Feb 16 20:40:56 2010 +0100 +rev213 - Corrected misuse of ps2-packer in Makefile, sorry for those who'll need to move it - Tue Feb 16 20:16:19 2010 +0100 +rev212 - IGR fix 2. - Tue Feb 16 16:02:03 2010 +0100 +rev211 - Modified sed in Rules.make files to fix unrecognized option -mcpu=r3000 when using fr_FR.UTF-8 as LANG env var on some Linux distro - Tue Feb 16 15:24:30 2010 +0100 +rev210 - Add "Disable Debug Colors" setting. - Tue Feb 16 11:40:27 2010 +0100 +rev209 - zipped theme support (very slow) - Mon Feb 15 19:45:22 2010 +0100 +rev208 - Fix a bug when setting compatibility in multiple device. - Sun Feb 14 22:38:46 2010 +0100 +rev207 - IGR fixs: - Sun Feb 14 20:50:03 2010 +0100 +rev206 - A fix for the pink freezes when using custom lang file - Sun Feb 14 12:36:19 2010 +0100 +rev205 - Adding the ability to load language localisation files - Fri Jan 29 17:30:57 2010 +0100 +rev204 - Optimization of scePadRead hooking time. - Thu Jan 28 19:04:00 2010 +0100 +rev203 - Revert to sbv patch use with igr too. - Tue Jan 26 18:32:04 2010 +0100 +rev202 - Revert to Sbv patches use for old game compatibility. - Sun Jan 24 19:12:07 2010 +0100 +rev201 - Add a poweroff combo trick. - Sun Jan 24 10:20:58 2010 +0100 +rev200 - Add compat mode 6 to disable IGR. ( In compatibility settings ) - Sat Jan 23 23:34:44 2010 +0100 +rev199 - Loader size optimization. - Sat Jan 23 14:59:52 2010 +0100 +rev198 - Sorry .s file don't want to be push. - Sat Jan 23 14:41:15 2010 +0100 +rev197 - Loader size optimization. - Thu Jan 21 22:02:25 2010 +0100 +rev196 - home & end for HDD games - Thu Jan 21 21:08:09 2010 +0100 +rev195 - some more pointer handling fixes - Thu Jan 21 18:59:25 2010 +0100 +rev194 - pagestart handling fixes - Thu Jan 21 17:24:15 2010 +0100 +rev193 - Merging branches - Thu Jan 21 17:17:07 2010 +0100 +rev192 - * Selection in static mode now not centered (HDLoader like) - Thu Jan 21 15:21:42 2010 +0100 +rev191 - SMSMAP: wait link status forever (hopefully it fixes freeze on 1 bug) - Thu Jan 21 15:19:56 2010 +0100 +rev190 - Fix sound loop bug when using in game reset. - Thu Jan 21 14:58:32 2010 +0100 +rev189 - In Game Reset first shot. ( Disabled for the moment ) - Thu Jan 21 00:06:19 2010 +0100 +rev188 - get rid of kernel mem usage for patches code and let it handled by the loader - Tue Jan 19 23:16:15 2010 +0100 +rev187 - Added some generic patching mode for some games - Fri Jan 15 13:26:36 2010 +0100 +rev186 - cosmetic changes again to patches table code - Thu Jan 14 14:31:08 2010 +0100 +rev185 - Added patch for Armored Core Nine Breaker NTSC US via USB - Wed Jan 13 20:26:43 2010 +0100 +rev184 - Added value check to the game patching process - Wed Jan 13 16:53:31 2010 +0100 +rev183 - Loader now uses game patches (actually Disgaea PAL USB/SMB fix) - Wed Jan 13 10:41:07 2010 +0100 +rev182 - Enabled game patches table before to launch the loader - Tue Jan 12 22:25:22 2010 +0100 +rev181 - Added game patches table code - Tue Jan 12 19:09:12 2010 +0100 +rev180 - Slower Dialog scrolling. Also a speed handling fix. - Tue Jan 12 18:53:03 2010 +0100 +rev179 - HDD autostart option added. - Tue Jan 12 18:32:17 2010 +0100 +rev178 - some cosmetic changes to PS3 network fix - Tue Jan 12 17:50:00 2010 +0100 +rev177 - fix to SMSMAP to be able to use network on PS3 - Tue Jan 12 13:33:16 2010 +0100 +rev176 - adjusted DMA modes implementation (functional now) - Tue Jan 12 12:45:43 2010 +0100 +rev175 - Added DMA mode in UI - Sat Jan 09 13:43:03 2010 +0100 +rev174 - v12/v13 HDD detect fix: information given by dlanor - Sat Jan 09 01:24:28 2010 +0100 +rev173 - modified and tested HDD write OK (for compat modes), still disabled - Fri Jan 08 14:33:15 2010 +0100 +rev172 - totally ignore native HDL compatibilty modes - Thu Jan 07 11:51:47 2010 +0100 +rev171 - fix for lack of file opened check in smbman - Wed Jan 06 22:21:32 2010 +0100 +rev170 - fix for modchip freezing (maybe not all modchips) - Wed Jan 06 21:27:09 2010 +0100 +rev169 - Untested: - Wed Jan 06 20:28:31 2010 +0100 +rev168 - fixing bug in hdd usage gui selection - Wed Jan 06 08:52:00 2010 +0100 +rev167 - a copy-paste warning fix - Tue Jan 05 22:38:32 2010 +0100 +rev166 - First shot of HDD integration into GUI. Compat modes very rough. Untested! - Tue Jan 05 22:13:53 2010 +0100 +rev165 - added dutch language - Tue Jan 05 20:42:05 2010 +0100 +rev164 - changes to redundant code in system.c, changes to HDD compat modes handling - Tue Jan 05 17:13:56 2010 +0100 +rev163 - changes for SOCOM 3 Online playing - Mon Jan 04 19:48:35 2010 +0100 +rev162 - added poweroff support (currently disabled) - Mon Jan 04 14:50:46 2010 +0100 +rev161 - updated CREDITS file - Mon Jan 04 11:35:12 2010 +0100 +rev160 - HDL code: fix potential overflow while changing game name - Sun Jan 03 18:48:26 2010 +0100 +rev159 - changes to HDL code (added ability to save compat flags and game name) - Sun Jan 03 15:59:19 2010 +0100 +rev158 - added ps2hdd module, adjusted code to support 48-bit LBA HDD and set Transfer Mode - Sun Jan 03 15:44:10 2010 +0100 +rev157 - added atad module - Sun Jan 03 14:39:45 2010 +0100 +rev156 - fix to cdvdman so that HDD core is able to detect network adapter - Sun Jan 03 11:16:39 2010 +0100 +rev155 - changes again to HDD code - Sun Jan 03 11:04:27 2010 +0100 +rev154 - changes to HDD code - Sat Jan 02 20:57:22 2010 +0100 +rev153 - added HDL layer to GUI (currently disabled) - Sat Jan 02 20:34:34 2010 +0100 +rev152 - Game ID GUI and injection implementation (for DNAS) - Sat Jan 02 14:50:04 2010 +0100 +rev151 - changes to hdl header struct - Sat Jan 02 12:40:45 2010 +0100 +rev150 - added code for internal HDD support (HDL format) to cdvdman - Fri Jan 01 20:18:19 2010 +0100 +rev149 - fixes to SMB code for NAS devices not supporting Unicode strings - Fri Jan 01 15:42:27 2010 +0100 +rev148 - fixed bug in cdvdfsv never returning CDVD_READY_READY state for blocking mode - Thu Dec 31 09:25:44 2009 +0100 +rev147 - changes to be able to use a valid disc ID on online games - Mon Dec 28 21:27:32 2009 +0100 +rev146 - Adding the ability to choose the default menu (USB, NET, HDD games). - Sun Dec 27 17:33:49 2009 +0100 +rev145 - Network startup forced to be synchronous (Solution for bug #16, hopefully) - Sun Dec 27 17:18:04 2009 +0100 +rev144 - Better randomization of the port value (And even more hacky). Improves network startup delays significantly here - Sun Dec 27 17:00:13 2009 +0100 +rev143 - tagged r142 to release 0.6 - Sun Dec 27 14:29:14 2009 +0100 +rev142 - Updated version number - Wed Dec 23 20:15:44 2009 +0100 +rev141 - Hacky SMB speedup: "Randomize" the source port value to avoid port reusal. - Wed Dec 23 19:15:48 2009 +0100 +rev140 - updated CHANGELOG/CREDTIS/README files - Wed Dec 23 13:20:55 2009 +0100 +rev139 - Added configurable exit button - Wed Dec 23 10:45:48 2009 +0100 +rev138 - Changed UI color controls - Tue Dec 22 22:25:22 2009 +0100 +rev137 - fixed long reconnection time (yellow screen) - Tue Dec 22 19:47:30 2009 +0100 +rev136 - Added support for multiple partitions - Tue Dec 22 17:33:33 2009 +0100 +rev135 - Fixing linux samba compatibility (White screen removal fix) - Tue Dec 22 16:54:22 2009 +0100 +rev134 - Changed modes text - Tue Dec 22 14:16:20 2009 +0100 +rev133 - changes to SMSUTILS so it doesn't use PS2SDKSRC env var to build - Tue Dec 22 13:14:19 2009 +0100 +rev132 - new core merging step3: adapted EE core to new IOP core - Mon Dec 21 18:52:28 2009 +0100 +rev131 - new core merging step2: added new modules - Mon Dec 21 16:51:23 2009 +0100 +rev130 - new core merging step1: deleted modules - Mon Dec 21 15:36:12 2009 +0100 +rev129 - Implemented sorting (via select) - Mon Dec 21 15:26:46 2009 +0100 +rev128 - Adding two new icons - Wed Dec 02 13:11:06 2009 +0100 +rev127 - tagged r126 to release 0.5 - Wed Dec 02 10:52:36 2009 +0100 +rev126 - * Added languages - Sun Nov 29 19:58:33 2009 +0100 +rev125 - Czech welcome message update - Sun Nov 29 16:28:09 2009 +0100 +rev124 - added ioctl cmd to usbhdfsd to retrieve physical file sector - Mon Nov 23 16:46:23 2009 +0100 +rev123 - added sifman module, currently unused - Sun Nov 22 11:59:09 2009 +0100 +rev122 - reduced buffers again in isofs/smbman - Sun Nov 15 20:10:27 2009 +0100 +rev121 - try to use IPCONFIG.DAT from mc in slot 2 - Sat Nov 14 16:54:05 2009 +0100 +rev120 - chaanged some modules rules.make to build properly on my Ubuntu environment - Fri Nov 13 18:55:53 2009 +0100 +rev119 - changes to lwipopts.h to reduce SMSTCPIP mem usage - Fri Nov 13 17:10:40 2009 +0100 +rev118 - reduced IOP mem usage for isofs/smbman modules - Fri Nov 13 14:42:11 2009 +0100 +rev117 - Correcting hints - Fri Nov 13 09:43:26 2009 +0100 +rev116 - Adding UI component hint feature. Hints on Compat settings now - Fri Nov 13 09:37:27 2009 +0100 +rev115 - enlighted mass driver mem usage for mode 2 - Thu Nov 12 20:51:39 2009 +0100 +rev114 - implemented mode 2: have lower mem usage in SMSTCPIP/smbman modules - Thu Nov 12 20:31:08 2009 +0100 +rev113 - Enabled SMSMAP/SMSTCPIP IOP modules - Thu Nov 12 19:26:35 2009 +0100 +rev112 - Fixed pink screen, and bugs in IOP reboot - Thu Nov 12 16:08:21 2009 +0100 +rev111 - reverted loader changes: stupid idea to choose g_buf address at runtime - Thu Nov 12 14:47:47 2009 +0100 +rev110 - added compat mode 1, inverted modes 4 & 5 - Wed Nov 11 22:26:12 2009 +0100 +rev109 - added compat mode 4 & 5 - Wed Nov 11 21:28:57 2009 +0100 +rev108 - added compat mode 3 - Wed Nov 11 21:08:01 2009 +0100 +rev107 - Moving the compat mask to third argument - Wed Nov 11 20:47:49 2009 +0100 +rev106 - FIX: Temporary fix - Second pink freeze for some games - This helps another bit - Wed Nov 11 16:21:25 2009 +0100 +rev105 - Virt. keyboard now uses button icons - Wed Nov 11 15:50:07 2009 +0100 +rev104 - FIX: This removes the freeze on second pink for some games (on my machine) - Wed Nov 11 14:15:09 2009 +0100 +rev103 - Renaming to lower case - caused Error opening with case sensitive linux filesystem - Wed Nov 11 10:54:19 2009 +0100 +rev102 - Adding select and start button icons by JNABK - Wed Nov 11 10:14:12 2009 +0100 +rev101 - FIX: Compat settings now seem to propagate well. Copy-paste introduced bug fixed - Wed Nov 11 10:09:52 2009 +0100 +rev100 - set IP changed flag to ensure IP settings get saved - Wed Nov 11 09:51:39 2009 +0100 +rev99 - Merging changes - Wed Nov 11 06:50:21 2009 +0100 +rev98 - * Pass in the compat settings in the same string - Tue Nov 10 22:08:55 2009 +0100 +rev97 - fix: saving config if SYS-CONF doesn't exists - Tue Nov 10 22:07:31 2009 +0100 +rev96 - Compat settings count now 5, propagation to loader.c implemented - Tue Nov 10 19:50:50 2009 +0100 +rev95 - changes to SMSTCPIP/include/lwipopts.h - Tue Nov 10 19:16:23 2009 +0100 +rev94 - added missing smap_opt.s, updated CREDITS file - Tue Nov 10 12:04:33 2009 +0100 +rev93 - add SMSMAP/SMSTCIP modules, currently not used - Tue Nov 10 11:34:52 2009 +0100 +rev92 - added stuff to build an alternate loader (suitable for Sonic Unleashed) - Tue Nov 10 11:23:26 2009 +0100 +rev91 - FIX: Config loading was removed. Putting it back - Tue Nov 10 10:25:24 2009 +0100 +rev90 - FIX: Error codes are <0, not <=0. This could affect loading if file handle had value 0 - Tue Nov 10 09:07:25 2009 +0100 +rev89 - reverted netlog loading accidentally committed - Tue Nov 10 09:06:29 2009 +0100 +rev88 - fix for freezing multi-elf games - Mon Nov 09 20:32:32 2009 +0100 +rev87 - Adding missing icons - Mon Nov 09 20:29:58 2009 +0100 +rev86 - FIX: Issue 10 (share name overflow) - Sun Nov 08 21:12:15 2009 +0100 +rev85 - Show icons at background in config dialogs - Sun Nov 08 20:04:14 2009 +0100 +rev84 - Changed name, updated spanish translation, and now info txt shows in selected language - Sun Nov 08 02:29:23 2009 +0100 +rev83 - added missing ioman_add header file for dev9 module - Sun Nov 08 02:13:54 2009 +0100 +rev82 - enlighted dev9 module and added dev9x device driver - Fri Nov 06 21:02:33 2009 +0100 +rev81 - renamed GetSyscall to GetSycallHandler and use syscallnr header - Fri Nov 06 20:57:03 2009 +0100 +rev80 - FIX: The remaining ip config fields renumbered. That should be it - Fri Nov 06 16:25:36 2009 +0100 +rev79 - Fix: IP config screen had all the settings moved by one (renumbered the dialog but not the value injection) - Fri Nov 06 08:48:56 2009 +0100 +rev78 - Fix for the recent error with media and parts reading. - Fri Nov 06 08:09:20 2009 +0100 +rev77 - reverting back isofs to rev71 - Thu Nov 05 12:39:02 2009 +0100 +rev76 - reverted cdvdman & isofs to rev70 - Wed Nov 04 18:12:29 2009 +0100 +rev75 - Reverting this (commit by accident) - Wed Nov 04 17:18:48 2009 +0100 +rev74 - * New compat mode ui (via triangle) - currently without function - Tue Nov 03 21:42:15 2009 +0100 +rev73 - added SIF and SIF RPC init calls to cdvdman - Tue Nov 03 21:39:13 2009 +0100 +rev72 - few changes to cdvdman and commented unneeded code in smbman - Tue Nov 03 18:50:05 2009 +0100 +rev71 - fix for those games opening files with other flag than O_RDONLY - Tue Nov 03 18:34:03 2009 +0100 +rev70 - fix: smaller elf at second make all - Mon Nov 02 18:09:42 2009 +0100 +rev69 - fix for some games freezing while searching for a non-existent file - Mon Nov 02 13:28:11 2009 +0100 +rev68 - Added ugly virtual keyboard - Mon Nov 02 12:09:40 2009 +0100 +rev67 - Merging changes - Sun Nov 01 23:21:19 2009 +0100 +rev66 - New data driven dialog code. Needs color, enum and string inputs to be complete. IP config rewritten to use it. - Sun Nov 01 20:25:52 2009 +0100 +rev65 - remove pink screen when a IOP reset hook has finished (set_reg_hook reaches 0) - Sun Nov 01 20:25:10 2009 +0100 +rev64 - fix for white screens: bad gamename crc32 calculation - Sun Nov 01 16:18:15 2009 +0100 +rev63 - Small file adressing fix - Sun Nov 01 11:50:30 2009 +0100 +rev62 - Merged changes - Sat Oct 31 19:06:23 2009 +0100 +rev61 - Some input system rewrites, scrolling after dialog fix, settings only saved on save settings subitem now - Sat Oct 31 12:22:29 2009 +0100 +rev60 - usbhdfsd: removed use of PS2SDKSRC env var - Sat Oct 31 12:18:09 2009 +0100 +rev59 - Network UI improvements: Port and autostart settings, network loading feedback - Sat Oct 31 12:08:12 2009 +0100 +rev58 - Config handling improved - now remembers the loaded config and stores to the same location - Sat Oct 31 09:11:53 2009 +0100 +rev57 - iso2usbld: only use long long and not __int64 - Sat Oct 31 07:09:53 2009 +0100 +rev56 - iso2usbld: added commented use of open/read/write/lsee64/close - Fri Oct 30 22:50:27 2009 +0100 +rev55 - build iso2usbld on make pc_tools - Fri Oct 30 21:00:58 2009 +0100 +rev54 - Adding the missing network icons, sorry everyone! - Fri Oct 30 11:37:17 2009 +0100 +rev53 - Adding network icons by JNABK - Fri Oct 30 08:05:09 2009 +0100 +rev52 - just corrected a comment - Thu Oct 29 20:25:46 2009 +0100 +rev51 - fix once again to avoid breaking compatibility - Thu Oct 29 17:02:08 2009 +0100 +rev50 - another fix to fake module load to avoid breaking compatibility - Thu Oct 29 16:58:07 2009 +0100 +rev49 - fix for faking some modules load correctly - Thu Oct 29 14:07:59 2009 +0100 +rev48 - fix for multi-elf games freezing on pink - Thu Oct 29 13:16:09 2009 +0100 +rev47 - fixes for iso2usbld to handle large ISO (>4Gb) - Wed Oct 28 20:22:14 2009 +0100 +rev46 - renamed PUBLIC share to PS2SMB - Wed Oct 28 18:29:11 2009 +0100 +rev45 - modified iso2usbld CFLAGS - Wed Oct 28 16:48:15 2009 +0100 +rev44 - create USBLD folder on mass if not existing - Wed Oct 28 13:49:58 2009 +0100 +rev43 - apply IP settings to loader/modules - Wed Oct 28 12:34:45 2009 +0100 +rev42 - Added IP configuration screen - Wed Oct 28 12:00:29 2009 +0100 +rev41 - different fixes, one very important for iso2usbld - Tue Oct 27 21:58:29 2009 +0100 +rev40 - Updated CHANGELOG, README and CREDITS - Tue Oct 27 20:58:24 2009 +0100 +rev39 - Added missing license headers - Tue Oct 27 16:13:35 2009 +0100 +rev38 - added support to network games trought SMB protocol - Mon Oct 26 20:27:06 2009 +0100 +rev37 - just acouple changes for isofs patch & cdvdman - Mon Oct 26 18:52:16 2009 +0100 +rev36 - allow isofs to handle up to 8 parts - Sat Oct 24 20:03:21 2009 +0200 +rev35 - added .hgtags - Sat Oct 24 17:56:28 2009 +0200 +rev34 - added missing readonly makefile for mass_driver - Sat Oct 24 16:14:24 2009 +0200 +rev33 - disabled write support for ingame mass_driver - Sat Oct 24 16:12:02 2009 +0200 +rev32 - added LICENSE, README, CREDITS and CHANGELOG - Sat Oct 24 16:09:31 2009 +0200 +rev31 - New_Iop_Reset: switched to reset with EELOADCNF - Fri Oct 23 10:20:06 2009 +0200 +rev30 - Now searchs for USBD.IRX in MC. If not exists load embedded usbd.irx for each platform - Thu Oct 22 20:27:52 2009 +0200 +rev29 - static mode now fit with JNABK templates also in PAL mode - Sun Oct 18 20:26:50 2009 +0200 +rev28 - Fix: Welcome text showing extra text - Sun Oct 18 00:48:15 2009 +0200 +rev27 - fix for PS3 with software emulation - Sat Oct 17 22:54:56 2009 +0200 +rev26 - Added spanish translation - Sat Oct 17 22:43:30 2009 +0200 +rev25 - Oops. These slipped through. Reverting - Sat Oct 17 20:44:42 2009 +0200 +rev24 - Adding save icon - Sat Oct 17 16:32:20 2009 +0200 +rev23 - Adding language support - Sat Oct 17 16:30:30 2009 +0200 +rev22 - * rewritten the config file handling (to use key=val lines) - Sat Oct 17 16:29:49 2009 +0200 +rev21 - * cleaning up the code a bit - all menu construction now in main, etc. - Tue Oct 13 21:56:57 2009 +0200 +rev20 - isofs: fixed bug in skipmod_check() - Tue Oct 13 17:55:35 2009 +0200 +rev19 - modified isofs: allow it to fake some module load from cdrom - Tue Oct 06 08:52:56 2009 +0200 +rev18 - fix for 8+3 elf's filename - Mon Oct 05 21:01:36 2009 +0200 +rev17 - Added messages of what is doing makefile - Sun Oct 04 20:44:48 2009 +0200 +rev16 - fix: cdvdman.c:1708: warning: unused variable `netlog_modname' - Sun Oct 04 20:43:49 2009 +0200 +rev15 - loader: modified Patch_Img into Patch_Mod using g_buf - Sun Oct 04 19:38:27 2009 +0200 +rev14 - loader now loads at e8000 and use g_buf at 88000 - Sun Oct 04 16:57:37 2009 +0200 +rev13 - modified cdvdman: added stream and other fixes - Sun Oct 04 15:45:04 2009 +0200 +rev12 - modified isofs to handle media type - Sun Oct 04 15:31:56 2009 +0200 +rev11 - moved IOP reset to LoadExecPS2 replacement - Sun Oct 04 15:13:06 2009 +0200 +rev10 - added debug over ethernet - Sun Oct 04 14:56:59 2009 +0200 +rev9 - Updated interface - Sun Oct 04 14:40:10 2009 +0200 +rev8 - Updated interface with dynamic menu - Sun Oct 04 02:34:51 2009 +0200 +rev7 - a few fixes so that it can compile - Fri Oct 02 18:40:33 2009 +0200 +rev6 - iso2usbld: fixes for linux build - Tue Sep 29 09:39:20 2009 +0200 +rev5 - iso2usbld: fixed those deprecated type casts - Sun Sep 27 21:55:27 2009 +0200 +rev4 - bugfix for iso2usbld - Sun Sep 27 21:20:14 2009 +0200 +rev3 - modified .hignore - Sun Sep 27 19:00:50 2009 +0200 +rev2 - added open usb loader sources - Sun Sep 27 17:42:30 2009 +0200 +rev1 - added iso2usbld - Sun Sep 27 17:36:34 2009 +0200 +rev0 - added .hgignore - Sun Sep 27 16:28:14 2009 +0200 rev - - Sun Sep 27 16:20:30 2009 +0200 From c6a52144f8dd10f9bdf27ba18a96247c09d912f0 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 23 Oct 2016 16:28:53 -0700 Subject: [PATCH 005/269] .github: Add some templates * pickup from https://github.com/a2o/snoopy/tree/master/.github * Thanks a lot @bostjan :) --- .github/ISSUE_TEMPLATE.md | 31 ++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..fd9b68a99 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,31 @@ +## Checklist before I submit this issue report + +I confirm that: +- [ ] I have tested this with the latest source code available +- [ ] I have checked existing OPL issues for duplicates and found none @ http://psx-scene.com/forums/official-open-ps2-loader-forum/ & https://github.com/ifcaro/Open-PS2-Loader/issues + + + +## Issue description - Describe the problem you are having + +(replace 'FILLIN' with description) + +FILLIN + + + +## Expected result + +FILLIN + + + +## Actual result + +FILLIN + + + +## Steps to reproduce + +FILLIN diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..b69f8716a --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,35 @@ +Checklists for Pull requests +---------------------------- + +About pull request itself: +- [X] I am submitting a pull request:) +- [ ] My submission does one logical thing only (one bugfix, one new feature). If I will want to supply multiple logical changes, I will submit multiple pull requests. + +Code quality: +(not applicable for non-code fixes of course) +- [ ] My submission follow coding style of file (or follow this coding style guide ) +- [ ] My submission is passing local test suite + +Commits: +- [ ] My commits are logical, easily readable, with concise comments. +- [ ] My commits follow the KISS principle: do one thing, and do it well. + +Licensing: +- [ ] I am the author of submission or have been authorized by submission copyright holder to issue this pull request. + +Branching: +- [ ] My submission is based on master branch. +- [ ] My submission is compatible with latest master branch updates (no conflicts, I did a rebase if it was necessary). +- [ ] The name of the branch I want to merge upstream is not 'master' (except for only the most trivial fixes, like typos and such). +- [ ] My branch name is *feature/my-shiny-new-opl-feature-title* (for new features). +- [ ] My branch name is *bugfix/my-totally-non-hackish-workaround* (for bugfixes). +- [ ] My branch name is *doc/what-i-did-to-documentation* (for documentation updates). + +Continuous integration: +- [x] [TODO] Once I will submit this pull request, I will wait for Travis-CI report (normally a couple of minutes) and fix any issues I might have introduced. +- [x] [TODO] Until TravisCI not is configured, you can configure and run TravisCI , it alrealdy have a working template. + + + +Pull request description +------------------------ From 2b7fec225ec630bd07cde9a6f48f9ca457a62087 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 23 Oct 2016 18:34:27 -0700 Subject: [PATCH 006/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Arabic.lng | 8 ++++---- lng/lang_Bulgarian.lng | 18 +++++++++--------- lng/lang_Czech.lng | 10 +++++----- lng/lang_English.lng | 2 +- lng/lang_Filipino.lng | 14 +++++++------- lng/lang_French.lng | 8 ++++---- lng/lang_German.lng | 8 ++++---- lng/lang_Greek.lng | 10 +++++----- lng/lang_Indonesian.lng | 10 +++++----- lng/lang_Italian.lng | 10 +++++----- lng/lang_Korean.lng | 8 ++++---- lng/lang_Laotian.lng | 8 ++++---- lng/lang_Polish.lng | 8 ++++---- lng/lang_Portuguese.lng | 20 ++++++++++---------- lng/lang_Portuguese_BR.lng | 8 ++++---- lng/lang_Russian.lng | 8 ++++---- lng/lang_Spanish.lng | 12 ++++++------ lng/lang_Swedish.lng | 8 ++++---- lng/lang_TChinese.lng | 8 ++++---- lng/lang_Turkish.lng | 12 ++++++------ 21 files changed, 100 insertions(+), 99 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 67be1f675..3ee853ad1 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev963 - Jay-Jay-OPL - fix Changelogs - Sun Oct 23 09:01:40 2016 -0700 rev962 - Jay-Jay - Merge pull request #2 from ifcaro/master - Sun Oct 23 08:42:58 2016 -0700 rev961 - Caio Oliveira - src/dialogs: Fix chars overpassing of screen - Sun Oct 23 12:37:29 2016 -0200 rev960 - Jay-Jay-OPL - Oops! Fixed a tiny typo mistake in the previous commit. :) - Sun Oct 23 07:23:09 2016 -0700 diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 23ed6090e..a4138ff62 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,9 +1,9 @@ # translation by alimadhi -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Arabic -Open PS2 Loader %s +OPL %s حفظ التغييرات خلف تكوين الشبكة @@ -114,7 +114,7 @@ IP قراءات دقيقة وضع التزامن Unhook Syscalls -0 وضع PSS +تخطي فيديو محاكي DVD-DL تعطيل IGR ارتفاع حدة التخزين diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 4e5f6465d..293ae40ec 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,9 +1,9 @@ # translation by vsub and wisi -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Bulgarian -Open PS2 Loader %s +OPL %s Запазване на промените Назад Мрежови настройки @@ -21,7 +21,7 @@ ETH Игри Тема Език Изключване на системата? -Exit to Browser/OSDSYS? +Изход към Browser/OSDSYS? Отмяна на обновяването? %d: Твърд Диск не е свързан. %d: Твърд Диск не е форматиран. @@ -113,7 +113,7 @@ NetBIOS Прецизно четене Синхронен режим Откачане на OPL от Syscalls -0 PSS режим +Напред Видео Емулиране на DVD-DL Изключване на IGR Зареждане на модулите във висока памет @@ -139,7 +139,7 @@ VMC файлът трябва да бъде създаден. Програмисти: Качествен контрол от: USB поддиректория -Boots Custom ELF after an IGR +Зареждане на ELF по избор при IGR Стойност в минути, 0 за деактивиране Автоматично спиране на HDD след Видео режим @@ -199,16 +199,16 @@ Cheats по избор Мрежово обновяване Повторно сваляне на наличните записи? Неуспешно обновяване. -Неуспешна връзка с сървъра. Failed to connect to update server. +Неуспешна връзка с сървъра. Обновяване завършено. Обновяване отменено. Сваляне на настройки от мрежата? -Потребителски настройки Customized Settings +Потребителски настройки Сваляне по подразбиране Авт.старт след %i Автостарт Стойност в секунди, 0 за деактивиране. PS2 Logo -Only displayed for a valid disc logo which matches the console's region +Активно само при валидно лого на диска, съвпадащо с региона на конзолата. ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index 040e821c9..cdfc202db 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,9 +1,9 @@ # Translated by jimmysmith -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Czech -Open PS2 Loader %s +OPL %s Uložit změny Zpět Síťová konfigurace @@ -113,7 +113,7 @@ Nechte prázdné pro přihlášení GUEST účtu Přesné čtení Synchronní mód Unhook Syscalls -0 PSS mód +Přeskočit videa Emulovat DVD-DL Vypnout IGR Vyšší adresa modulu @@ -209,6 +209,6 @@ Automatický start v %i s... Auto start Hodnota v sekundách, zadej 0 pro vypnutí auto startu PS2 Logo -Only displayed for a valid disc logo which matches the console's region +Zobrazováno pouze u validního loga disku, který má stejný region jako konzole ELF Loader Menu ELF Loader Menu mód \ No newline at end of file diff --git a/lng/lang_English.lng b/lng/lang_English.lng index bf97cb4c8..d4414d380 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -21,7 +21,7 @@ # # Put here the English name of your language (will be displayed in the OPL Settings menu), in standard latin characters. English -Open PS2 Loader %s +OPL %s Save changes Back Network config diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index cecb9f8bb..92a9af73e 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,9 +1,9 @@ # Translation by Ceed Lorenzo -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Filipino -Open PS2 Loader %s +OPL %s I-save ang mga pagbabago Likod Network Config @@ -25,7 +25,7 @@ Exit to Browser/OSDSYS? Cancel updating? %d: HardDisk Drive not detected %d: HardDisk Drive not formatted -%d: Network startup error +%d: Network startup error %d: No network adaptor detected %d: Hindi makakonekta sa SMB server %d: Hindi makapag-log in sa SMB server @@ -113,11 +113,11 @@ Iwanang walang laman para sa Guest auth . Accurate Reads Synchronous Mode alisin sa pagkakakawit Syscalls -0 PSS mode +Skip Videos Emulate DVD-DL Disable IGR High module storage -Hide dev9 module +Hide DEV9 module Ang pagbabago ng laki ay i-reformat ang VMC Lumikha Start @@ -188,7 +188,7 @@ FMV Skip Skips Full Motion Videos Cheat Settings Enable PS2RD Cheat Engine -Lets PS2RD Cheat Engine patch your games +Let PS2RD Cheat Engine patch your games PS2RD Cheat Engine Mode Auto-select or Select game cheats Auto-select cheats diff --git a/lng/lang_French.lng b/lng/lang_French.lng index f9aa7c261..2c6974c25 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,9 +1,9 @@ # Translation by machiavel -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread French -Open PS2 Loader %s +OPL %s Sauvegarder Retour Configuration réseau @@ -113,7 +113,7 @@ Laisser vide pour authentification invité Lecture précise (simule la vitesse de lecture du CD/DVD) Mode synchrone (mode de lecture alternatif) Décrocher Syscalls (purge OPL après lancement du jeu) -Mode 0 PSS (Passe les cinématiques) +Passer les cinématiques Émuler DVD-DL (DVD9 rippés en DVD5) Désactiver IGR (incompatible avec certains jeux) Stockage élevé (charge les modules de stockage à une adresse plus élevée) diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 821b6f666..7b18c355d 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,9 +1,9 @@ # German Translation by ps2guy and lopotri -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread German -Open PS2 Loader %s +OPL %s Änderungen speichern Zurück Netzwerkkonfiguration @@ -113,7 +113,7 @@ Leer lassen für Anmeldung als GAST Korrekte Lesegeschw Synchronmodus Systemaufrufe aushängen -0 PSS Modus +Videos überspringen Emuliere DVD-DL Deaktiviere IGR Erhöhte Speichermoduladresse diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index b2e492b98..5e938240c 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,9 +1,9 @@ # Greek Translation by RivalK93 -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Greek -Open PS2 Loader %s +OPL %s Αποθήκευση αλλαγών Πίσω Ρυθμίσεις δικτύου @@ -70,7 +70,7 @@ Widescreen Εμφάνιση μενού Εφαρμογών Αυτόματα Χειροκίνητα -Εκκίνηση HDL Server +Εκκίνηση HDL Server Γίνεται εκκίνηση HDL Server... Λειτουγία HDL Server... Αποτυχία εκκίνησης HDL Server. @@ -113,7 +113,7 @@ NetBIOS Ακριβής ανάγνωση Συγχρονισμένη λειτουργία Αποκοπή Syscalls -Λειτουργία 0 PSS +Μετάβαση Βίντεο Εξομοίωση DVD-DL Απενεργοποίηση IGR Μονάδα μνήμης diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index dc8a06b22..4ff4fd92d 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,9 +1,9 @@ # translated by verislasher -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Indonesian -Open PS2 Loader %s +OPL %s Simpan Perubahan Kembali Konfigurasi jaringan @@ -78,7 +78,7 @@ Mengembalikan Server HDL... Pintasan IGR Warna latar belakang Warna teks -- PS2 - +- PS2 - - SMB Server - Jenis alamat IP Statis @@ -113,7 +113,7 @@ Tinggalkan kosong untuk Otent TAMU. Membaca akurat Mode Sinkronisasi Melepas kaitan syscalls -Mode PSS 0 +Loncat Video Emulasi DVD-DL Nonaktifkan IGR Mode Penyimpanan Tinggi diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index dd08fba8c..8925a1fba 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,9 +1,9 @@ # Translation by jauffre and andre95d -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Italian -Open PS2 Loader %s +OPL %s Salva modifiche Indietro Configurazione rete @@ -78,7 +78,7 @@ Server HDL in scaricamento dalla memoria... Esci su Colore di sfondo Colore testo -- PS2 - +- PS2 - - Server SMB - Tipo di indirizzo IP Statico @@ -113,7 +113,7 @@ Lasciare vuoto per autenticazione GUEST Lettura accurata Modo sincrono Unhook dalle syscalls -Modo 0 PSS +Skip Video Disabilita DVD-DL Disabilita IGR Moduli nell'area alta di memoria diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index b81f79a04..e704d6af9 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,9 +1,9 @@ # Translated by DDinghoya -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Korean -Open PS2 Loader %s +OPL %s 저장 변경 뒤로 네트워크 구성 @@ -113,7 +113,7 @@ USB 게임 손상 검사 정밀하게 읽음 동기화 모드 시스템 호출 해제 -0 PSS 모드 +동영상 건너 뛰기 DV-DL 에뮬레이트 IGR 비활성 고성능 모듈 스토리지 diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index 60b782b6e..021871280 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,9 +1,9 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Laotian -Open PS2 Loader %s +OPL %s ບັນທຶກການປ່ຽນແປງ ກັບຄືນ ກຳນົດຄ່າທາງດ້ານ Network @@ -113,7 +113,7 @@ NetBIOS ອ່ານແບບຖືກຕ້ອງແມ່ນຍຳ ວິທີການອ່ານຂໍ້ມູນທີ່ມີທາງເລືອກ Unhook Syscalls -0 PSS mode +ຂ້າມວິດີໂອ ປະມວນຜົນ DVD-DL Disable IGR High module storage diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index b971e9e93..542155acf 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,9 +1,9 @@ # Translation by yohokaru -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Polish -Open PS2 Loader %s +OPL %s Zapisz zmiany Wróć Ustawienia sieci @@ -113,7 +113,7 @@ Pozostaw puste dla gości. Dokładny odczyt Tryb synchroniczny Odhookuj Syscalls -Tryb 0 PSS +Przejdź filmy Emuluj DVD-DL Wyłącz IGR Moduł dużej pamięci diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 37c711a2e..12fe956da 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,9 +1,9 @@ # Translation by danielb -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Portuguese -Open PS2 Loader %s +OPL %s Salvar alterações Voltar Configurações de Rede @@ -15,7 +15,7 @@ Sair Configurações Menu Jogos por USB -Jogos por HDD +Jogos por HDD Jogos por Rede Aplicações Temas @@ -25,9 +25,9 @@ Sair p/ o Browser/OSDSYS? Cancelar atualização? %d: Disco Rigido não detetado %d: Disco Rigido não formatado -%d: Erro ao iniciar rede +%d: Erro ao iniciar rede %d: Adaptador de Rede não detetado -%d: Não foi possível ligar ao servidor SMB +%d: Não foi possível ligar ao servidor SMB %d: Não foi possível efetuar login no servidor SMB %d: Não foi possível abrir a partilha SMB %d: Impossivel listar partilhas SMB @@ -57,7 +57,7 @@ Ordenar automaticamente Erro ao carregar ficheiro de idioma Desativar depuração de cores Comando não detectado, esperando... -Ativar Arte de Capas +Ativar Arte de Capas Ecrâ Panorâmico Desligar PS2 Carregando configurações @@ -113,7 +113,7 @@ Deixar vazio para ligar como convidado (GUEST) Carregar núcleo alternativo Modo Síncrono Desativar chamadas do sistema -Saltar videos PSS +Saltar videos Emular DVD-DL Desativar IGR Armazenamento elevado do módulo @@ -145,7 +145,7 @@ Desligamento automático do HDD Modo de vídeo Cor do diálogo Cor selecionada -Mostrar Página de Informação +Mostrar Página de Informação Info ELF personalizado Seleção de Cor @@ -160,7 +160,7 @@ VMC Slot 1 VMC Slot 2 ID do Jogo Modo DMA -Sincronização do vídeo +Sincronização do vídeo Modo 1 Modo 2 Modo 3 diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 0391d17c7..964013cc8 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,9 +1,9 @@ # Translation by Colossus and tonyhoro -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Brazilian Portuguese -Open PS2 Loader %s +OPL %s Guardar Configurações Voltar Configurações de Rede @@ -113,7 +113,7 @@ Deixar vazio para conectar como convidado (GUEST) Leituras mais precisas Modo de Sincronia Desativar chamadas do sistema -Pular vídeos PSS +Pular videos Emular DVD-DL Desativar IGR Armazenamento elevado dos módulos diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 7924416cf..98d7db7b5 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,9 +1,9 @@ # Translated by druchapucha and frodosumkin -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Russian -Open PS2 Loader %s +OPL %s Сохранить настройки Назад Конфигурация сети @@ -113,7 +113,7 @@ NetBIOS Аккуратное чтение Альтернативный метод чтения данных Разблокировать системные вызовы -Использовать режим 0 PSS +Пропустить Видео Эмулировать DVD-DL Отключить использование IGR Высокий модуль хранения diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index e8680e334..b06fec222 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,9 +1,9 @@ # Translation by lauchon22 -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Spanish -Open PS2 Loader %s +OPL %s Guardar cambios Atrás Ajustes conexión de red @@ -76,7 +76,7 @@ Servidor HDLDump conectado... Error al iniciar el servidor HDLDump. Cerrando servidor HDLDump... Ruta del IGR -Color de fondo +Color de fondo Color de texto - PS2 - - Servidor SMB - @@ -113,7 +113,7 @@ Dejar en blanco para autentificar como GUEST Lectura precisa Modo sincronizado Desvincula el sistema -Omite los vídeos PSS +Omite vídeos Emula DVD-DL Quita el IGR Almacena los módulos en alta dirección de memoria @@ -133,7 +133,7 @@ Progreso Archivo VMC creado Archivo VMC inválido, el tamaño es incorrecto El archivo VMC debe ser creado -Error con el archivo VMC %s, ¿continuar con la tarjeta física (slot %d) ? +Error con el archivo VMC %s, ¿continuar con la tarjeta física (slot %d)? Refresco automático de las listas Acerca del OPL Desarrolladores diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index d4dc2e0bd..e89629451 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,9 +1,9 @@ # Translation by Lord_Flaya -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Swedish -Open PS2 Loader %s +OPL %s Spara ändringar Tillbaka Nätverkskonfig @@ -113,7 +113,7 @@ Lämna tomt för Gäst konto. Korrekt läsning Synkroniseringsläge Släpp Syscalls -0 PSS läge +Hoppa över videoklipp Emulera DVD-DL Inaktivera IGR Högmoduls-lagring diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese.lng index b3ef97e84..a2e2c6366 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese.lng @@ -1,9 +1,9 @@ # Translated by kane159 -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Traditional Chinese -Open PS2 Loader %s +OPL %s 保存設置 返回 網絡設置 @@ -113,7 +113,7 @@ GUEST驗證留空. 精確讀取 同步模式 脫開系統調用 -0 PSS 模式 +跳过视频 模擬 DVD-DL 禁用 IGR 隱藏模式內存 diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index 450a2b205..f0e43fa28 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,9 +1,9 @@ # Translation by Gürkan DEMİR aka: dante -# Last update: 08/25/2016 -# Updated for OPL_r928_DB [616d6fd] +# Last update: 10/23/2016 +# Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Turkish -Open PS2 Loader %s +OPL %s Değişiklikleri kaydet Geri Ağ ayarları @@ -61,7 +61,7 @@ Kapak Resimlerini etkinleştir Geniş ekran Gücü kapat Ayarlar yükleniyor -Ayarlar kayıt ediliyor +Ayarlar kayıt ediliyor Cihazı başlat Yenile USB cihazı başlangıç türü @@ -78,7 +78,7 @@ HDL Sunucu Durduruluyor... IGR çıkış yolu Arkaplan rengi Metin rengi -- PS2 - +- PS2 - - SMB Server - IP adres türü Sabit @@ -113,7 +113,7 @@ MİSAFİR oturumu için boş bırakınız. Alternatif çekirdeği yükle Synchronous Mode Sis çağrılarını çöz -PSS video iptali +Videoları atla DVD-DL i etkinleştir IGR i etkisizleştir Uüksek konumda bellek kullanımı From f5ebbe0b84649eee625244f8ad45bf4d358f5b40 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 24 Oct 2016 10:52:51 -0700 Subject: [PATCH 007/269] Added several features and tweaks by the following developers: * BatRastard: Per Game CHEATS should be good now * Caio99BR: OPL - Last commit about revision, i hate it now --- .gitattributes | 17 +++++++++++ .travis.yml | 15 ++++------ DETAILED_CHANGELOG | 1 + Makefile | 24 ++++++++++------ include/config.h | 6 ++-- include/dialogs.h | 9 +++--- include/gui.h | 3 -- include/opl.h | 13 --------- include/pgcht.h | 16 +++++++++++ lng_pack.sh | 15 +++++----- src/cheatman.c | 4 +++ src/dialogs.c | 21 ++++++++------ src/gui.c | 71 +++++++++++++++++++++++++++++++++++++++------- src/menusys.c | 10 ------- src/opl.c | 19 +++---------- src/supportbase.c | 13 ++++++++- src/system.c | 3 ++ 17 files changed, 166 insertions(+), 94 deletions(-) create mode 100644 .gitattributes create mode 100644 include/pgcht.h diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..bdb0cabc8 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.travis.yml b/.travis.yml index d9bf58f67..5d4b50f66 100644 --- a/.travis.yml +++ b/.travis.yml @@ -87,20 +87,14 @@ before_script: script: ## Let's build Open PS2 Loader Release! - cd ${opl_build_dir}/ +- . make_changelog.sh +- git add DETAILED_CHANGELOG - make clean - make release ## Build Lang Pack and Latest Changelog -- . make_changelog.sh - . lng_pack.sh -## Set current Version and Revision -- export opl_version=$(ls | grep "OPNPS2LD-" | cut -c 10- | rev | cut -c 5- | rev) -- export opl_revision=$(($(cat DETAILED_CHANGELOG | grep "rev" | head -1 | cut -d " " -f 1 | cut -c 4-) + 1)) - -## Pack Open PS2 Loader Release on a zip -- zip -r OPNPS2LD-${opl_version}.zip DETAILED_CHANGELOG OLD_DETAILED_CHANGELOG OPNPS2LD-${opl_version}.ELF CREDITS LICENSE README - ## [TEMPLATE] Deploy OPL to Github Releases # 1. Clone this repository # 2. Copy '.travis.yml' to '.travis-original.yml' (you will need it after) @@ -118,8 +112,9 @@ deploy: skip_cleanup: true # api_key: # secure: [PUT YOUR NEW SECURE API KEY HERE] + file_glob: true file: - - "${opl_build_dir}/OPNPS2LD-${opl_version}.zip" - - "${opl_build_dir}/OPNPS2LD_LANGS-r${opl_revision}.zip" + - "${opl_build_dir}/OPNPS2LD-*.zip" + - "${opl_build_dir}/OPNPS2LD_LANGS-*.zip" on: tags: true diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 3ee853ad1..298ed5baf 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev964 - Jay-Jay-OPL - .github: Add some templates * pickup from https://github.com/a2o/snoopy/tree/master/.github * Thanks a lot @bostjan :) - Sun Oct 23 16:28:53 2016 -0700 rev963 - Jay-Jay-OPL - fix Changelogs - Sun Oct 23 09:01:40 2016 -0700 rev962 - Jay-Jay - Merge pull request #2 from ifcaro/master - Sun Oct 23 08:42:58 2016 -0700 rev961 - Caio Oliveira - src/dialogs: Fix chars overpassing of screen - Sun Oct 23 12:37:29 2016 -0200 diff --git a/Makefile b/Makefile index 5074ebc4c..4021da3eb 100755 --- a/Makefile +++ b/Makefile @@ -53,10 +53,13 @@ DECI2_DEBUG = 0 CHILDPROOF = 0 # ======== DO NOT MODIFY VALUES AFTER THIS POINT! UNLESS YOU KNOW WHAT YOU ARE DOING ======== -REVISION = $(shell $(($(cat DETAILED_CHANGELOG | grep "rev" | head -1 | cut -d " " -f 1 | cut -c 4- 2>/dev/null) + 1))) +REVISION = $(shell expr $$(cat DETAILED_CHANGELOG | grep "rev" | head -1 | cut -d " " -f 1 | cut -c 4-) + 1) GIT_HASH = $(shell git rev-parse --short=7 HEAD 2>/dev/null) -ifneq ($(shell git diff --quiet; echo $$?),0) +ifeq ($(shell git diff --quiet; echo $$?),1) + DIRTY = -dirty +endif +ifneq ($(shell test -d .git; echo $?),0) DIRTY = -dirty endif @@ -87,7 +90,7 @@ EECORE_OBJS = obj/ee_core.o obj/ioprp.o obj/util.o \ EE_BIN = opl.elf EE_BIN_PKD = OPNPS2LD.ELF -EE_BIN_VPKD = OPNPS2LD-$(OPL_VERSION).ELF +EE_VPKD = OPNPS2LD-$(OPL_VERSION) EE_SRC_DIR = src/ EE_OBJS_DIR = obj/ EE_ASM_DIR = asm/ @@ -202,21 +205,24 @@ all: echo "-Interface" $(MAKE) $(EE_BIN) -ifeq ($(DEBUG),0) - ifeq ($(NOT_PACKED),0) +ifneq ($(DEBUG),1) + ifneq ($(NOT_PACKED),1) echo "Stripping..." ee-strip $(EE_BIN) echo "Compressing..." ps2-packer $(EE_BIN) $(EE_BIN_PKD) > /dev/null - cp $(EE_BIN_PKD) $(EE_BIN_VPKD) - @echo "Package Complete: $(EE_BIN_VPKD)" + ifeq ($(RELEASE),1) + cp $(EE_BIN_PKD) $(EE_VPKD).ELF + zip -r $(EE_VPKD).zip $(EE_VPKD).ELF CREDITS *DETAILED_CHANGELOG LICENSE README + echo "Package Complete: $(EE_VPKD).zip" + endif endif endif release: - $(MAKE) VMC=1 GSM=1 IGS=1 CHEAT=1 all + $(MAKE) VMC=1 GSM=1 IGS=1 CHEAT=1 RELEASE=1 all childproof: $(MAKE) CHILDPROOF=1 all @@ -239,7 +245,7 @@ deci2_debug: clean: echo "Cleaning..." echo "-Interface" - rm -fr $(MAPFILE) $(EE_BIN) $(EE_BIN_PKD) $(EE_BIN_VPKD) $(EE_OBJS_DIR) $(EE_ASM_DIR) + rm -fr $(MAPFILE) $(EE_BIN) $(EE_BIN_PKD) $(EE_VPKD).* $(EE_OBJS_DIR) $(EE_ASM_DIR) echo "-EE core" $(MAKE) -C ee_core clean echo "-Elf Loader" diff --git a/include/config.h b/include/config.h index 3d3f85181..ac398ef8a 100644 --- a/include/config.h +++ b/include/config.h @@ -45,6 +45,10 @@ enum CONFIG_INDEX { #define CONFIG_ITEM_GSMXOFFSET "$GSMXOffset" #define CONFIG_ITEM_GSMYOFFSET "$GSMYOffset" +//Per-Game CHEAT keys. -Bat- +#define CONFIG_ITEM_ENABLECHEAT "$EnableCheat" +#define CONFIG_ITEM_CHEATMODE "$CheatMode" + //OPL config keys #define CONFIG_OPL_THEME "theme" #define CONFIG_OPL_LANGUAGE "language_text" @@ -57,8 +61,6 @@ enum CONFIG_INDEX { #define CONFIG_OPL_ENABLE_COVERART "enable_coverart" #define CONFIG_OPL_WIDESCREEN "wide_screen" #define CONFIG_OPL_VMODE "vmode" -#define CONFIG_OPL_CHEAT_ENABLE "enable_cheat" -#define CONFIG_OPL_CHEAT_MODE "cheatmode" #define CONFIG_OPL_DISABLE_DEBUG "disable_debug" #define CONFIG_OPL_PS2LOGO "ps2logo" #define CONFIG_OPL_EXIT_PATH "exit_path" diff --git a/include/dialogs.h b/include/dialogs.h index 56c867527..cdaa6019d 100644 --- a/include/dialogs.h +++ b/include/dialogs.h @@ -35,7 +35,6 @@ enum UI_ITEMS { CFG_LBL_AUTOSTARTLAST, CFG_AUTOSTARTLAST, CFG_SELECTBUTTON, - CFG_SHOWGSM, CFG_ENWRITEOP, CFG_USBPREFIX, CFG_ETHPREFIX, @@ -76,11 +75,12 @@ enum UI_ITEMS { NETCFG_RECONNECT, NETCFG_OK, - CHEATCFG_ENABLECHEAT, - CHEATCFG_CHEATMODE, + CHTCFG_CHEATCFG, + CHTCFG_ENABLECHEAT, + CHTCFG_CHEATMODE, - GSMCFG_ENABLEGSM, GSMCFG_GSCONFIG, + GSMCFG_ENABLEGSM, GSMCFG_GSMVMODE, GSMCFG_GSMXOFFSET, GSMCFG_GSMYOFFSET, @@ -124,6 +124,7 @@ enum UI_ITEMS { #define COMPAT_NOEXIT 0x70000000 #define COMPAT_GSMCONFIG (GSMCFG_GSCONFIG | COMPAT_NOEXIT) +#define COMPAT_CHEATCONFIG (CHTCFG_CHEATCFG | COMPAT_NOEXIT) #define COMPAT_LOADFROMDISC (COMPAT_LOADFROMDISC_ID | COMPAT_NOEXIT) #ifdef VMC #define COMPAT_VMC1_ACTION (COMPAT_VMC1_ACTION_ID | COMPAT_NOEXIT) diff --git a/include/gui.h b/include/gui.h index c7a95f3f5..178d2c4dc 100644 --- a/include/gui.h +++ b/include/gui.h @@ -127,9 +127,6 @@ void guiShowNetCompatUpdate(void); void guiShowAbout(); void guiShowConfig(); void guiShowUIConfig(); - -void guiShowCheatConfig(); - void guiShowNetConfig(); /** Renders the given string on screen for the given function until it's io finishes diff --git a/include/opl.h b/include/opl.h index f6a200060..fc7ff473f 100644 --- a/include/opl.h +++ b/include/opl.h @@ -114,19 +114,6 @@ int gSelectButton; #define IGS_VERSION "0.1" #endif -#ifdef CHEAT -#define CHEAT_VERSION "0.5.3.65.g774d1" - -#define MAX_HOOKS 5 -#define MAX_CODES 250 -#define MAX_CHEATLIST (MAX_HOOKS * 2 + MAX_CODES * 2) - -int gEnableCheat; // Enables PS2RD Cheat Engine - 0 for Off, 1 for On -int gCheatMode; // Cheat Mode - 0 Enable all cheats, 1 Cheats selected by user - -int gCheatList[MAX_CHEATLIST]; //Store hooks/codes addr+val pairs -#endif - // ------------------------------------------------------------------------------------------------------------------------ // 0,1,2 scrolling speed diff --git a/include/pgcht.h b/include/pgcht.h new file mode 100644 index 000000000..39b0e4492 --- /dev/null +++ b/include/pgcht.h @@ -0,0 +1,16 @@ +// # Header for Per-Game CHEAT + +#ifndef __PGCHT_H_ +#define __PGCHT_H_ + +#define CHEAT_VERSION "0.5.3.65.g774d1" + +#define MAX_HOOKS 5 +#define MAX_CODES 250 +#define MAX_CHEATLIST (MAX_HOOKS * 2 + MAX_CODES * 2) + +int gEnableCheat; // Enables PS2RD Cheat Engine - 0 for Off, 1 for On +int gCheatMode; // Cheat Mode - 0 Enable all cheats, 1 Cheats selected by user + +int gCheatList[MAX_CHEATLIST]; //Store hooks/codes addr+val pairs +#endif diff --git a/lng_pack.sh b/lng_pack.sh index 249b56da5..bd78b3b19 100644 --- a/lng_pack.sh +++ b/lng_pack.sh @@ -4,7 +4,9 @@ # Set variables _dir=$(pwd) _bdir="/tmp/opl_lng" -_rev=$(($(cat ${_dir}/DETAILED_CHANGELOG | grep "rev" | head -1 | cut -d " " -f 1 | cut -c 4-) + 1)) +opl_revision=$(($(cat ${_dir}/DETAILED_CHANGELOG | grep "rev" | head -1 | cut -d " " -f 1 | cut -c 4-) + 1)) +opl_git=$(git -C ${_dir}/ rev-parse --short=7 HEAD 2>/dev/null) +if [ ${opl_git} ]; then export opl_git=-${opl_git}; fi # Print a list printf "$(ls ${_dir}/lng/ | cut -c 6- | rev | cut -c 5- | rev)" > /tmp/opl_lng_list @@ -12,11 +14,11 @@ printf "$(ls ${_dir}/lng/ | cut -c 6- | rev | cut -c 5- | rev)" > /tmp/opl_lng_l # Copy like Jay-Jay format while IFS= read -r file do - mkdir -p ${_bdir}/${file}${_rev}/ - cp ${_dir}/lng/lang_${file}.lng ${_bdir}/${file}${_rev}/lang_${file}${_rev}.lng + mkdir -p ${_bdir}/${file}-${opl_revision}/ + cp ${_dir}/lng/lang_${file}.lng ${_bdir}/${file}-${opl_revision}/lang_${file}.lng if [ -e thirdparty/font_${file}.ttf ] then - cp ${_dir}/thirdparty/font_${file}.ttf ${_bdir}/${file}${_rev}/font_${file}.ttf + cp ${_dir}/thirdparty/font_${file}.ttf ${_bdir}/${file}-${opl_revision}/font_${file}.ttf fi done < /tmp/opl_lng_list @@ -47,10 +49,9 @@ EOF # Lets pack it! cd ${_bdir}/ -zip -r OPNPS2LD_LANGS-r${_rev}.zip * -cp ${_bdir}/OPNPS2LD_LANGS-r${_rev}.zip ${_dir}/OPNPS2LD_LANGS-r${_rev}.zip +zip -r ${_dir}/OPNPS2LD_LANGS-${opl_revision}${opl_git}.zip * # Cleanup cd ${_dir} rm -rf ${_bdir}/ /tmp/opl_lng_list -unset _dir _bdir _rev +unset _dir _bdir opl_revision diff --git a/src/cheatman.c b/src/cheatman.c index 504e5f487..88b2f3fa8 100644 --- a/src/cheatman.c +++ b/src/cheatman.c @@ -25,6 +25,10 @@ #include "include/cheatman.h" #include "include/ioman.h" +#ifdef CHEAT +#include "include/pgcht.h" +#endif + /* * make_code - Return a code object from string @s. */ diff --git a/src/dialogs.c b/src/dialogs.c index 56d8e17cd..85da11caa 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -176,11 +176,15 @@ struct UIItem diaCompatConfig[] = { {UI_BOOL, COMPAT_MODE_BASE + 7, 1, 1, _STR_HINT_MODE8, 0, 0, {.intvalue = {0, 0}}}, {UI_SPLITTER}, -// Note: Per-Game GSM uses a UI_BUTTON to open up the menu. An #ifdef should keep it -// out of Childproof and Non-GSM builds. --Bat-- #ifdef GSM - {UI_BUTTON, COMPAT_GSMCONFIG, 1, 1, -1, 0, 0, {.label = {NULL, _STR_GSCONFIG}}}, - {UI_BREAK}, + {UI_BUTTON, COMPAT_GSMCONFIG, 1, 1, -1, -30, 0, {.label = {NULL, _STR_GSCONFIG}}}, + {UI_SPACER}, +#endif +#ifdef CHEAT + {UI_BUTTON, COMPAT_CHEATCONFIG, 1, 1, -1, 0, 0, {.label = {NULL, _STR_CHEAT_SETTINGS}}}, +#endif +#if defined(GSM) || defined(CHEAT) + {UI_SPLITTER}, #endif {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_DMA_MODE}}}, @@ -217,8 +221,7 @@ struct UIItem diaCompatConfig[] = { {UI_STRING, COMPAT_GAMEID, 1, 1, -1, 0, 0, {.stringvalue = {"", "", NULL}}}, {UI_SPACER}, {UI_BUTTON, COMPAT_LOADFROMDISC, 1, 1, -1, 0, 0, {.label = {NULL, _STR_LOAD_FROM_DISC}}}, - {UI_SPLITTER}, - + {UI_BREAK}, {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_ALTSTARTUP}}}, {UI_SPACER}, {UI_STRING, COMPAT_ALTSTARTUP, 1, 1, -1, 0, 0, {.stringvalue = {"", "", &guiAltStartupNameHandler}}}, @@ -451,7 +454,7 @@ struct UIItem diaGSConfig[] = { }; #endif -// Cheat Menu +// Per Game Settings > Cheat Menu --Bat-- #ifdef CHEAT struct UIItem diaCheatConfig[] = { {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_CHEAT_SETTINGS}}}, @@ -459,12 +462,12 @@ struct UIItem diaCheatConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_ENABLECHEAT}}}, {UI_SPACER}, - {UI_BOOL, CHEATCFG_ENABLECHEAT, 1, 1, _STR_HINT_ENABLECHEAT, 0, 0, {.intvalue = {1, 1}}}, + {UI_BOOL, CHTCFG_ENABLECHEAT, 1, 1, _STR_HINT_ENABLECHEAT, 0, 0, {.intvalue = {1, 1}}}, {UI_BREAK}, {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_CHEATMODE}}}, {UI_SPACER}, - {UI_ENUM, CHEATCFG_CHEATMODE, 1, 1, _STR_HINT_CHEATMODE, 0, 0, {.intvalue = {0, 0}}}, + {UI_ENUM, CHTCFG_CHEATMODE, 1, 1, _STR_HINT_CHEATMODE, 0, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, // buttons diff --git a/src/gui.c b/src/gui.c index ac020b7d7..35dbe1e71 100644 --- a/src/gui.c +++ b/src/gui.c @@ -21,6 +21,9 @@ #ifdef GSM #include "include/pggsm.h" #endif +#ifdef CHEAT +#include "include/pgcht.h" +#endif #include #include @@ -589,20 +592,31 @@ static void guiShowGSConfig(void) #endif #ifdef CHEAT +static void guiSetCheatSettingsState(void) +{ + int isCheatEnabled; + + diaGetInt(diaCheatConfig, CHTCFG_ENABLECHEAT, &isCheatEnabled); + diaSetEnabled(diaCheatConfig, CHTCFG_CHEATMODE, isCheatEnabled); +} + +static int guiCheatUpdater(int modified) +{ + if (modified) { + guiSetCheatSettingsState(); + } + + return 0; +} + void guiShowCheatConfig(void) { // configure the enumerations const char *cheatmodeNames[] = {_l(_STR_CHEATMODEAUTO), _l(_STR_CHEATMODESELECT), NULL}; - diaSetEnum(diaCheatConfig, CHEATCFG_CHEATMODE, cheatmodeNames); - diaSetInt(diaCheatConfig, CHEATCFG_ENABLECHEAT, gEnableCheat); - diaSetInt(diaCheatConfig, CHEATCFG_CHEATMODE, gCheatMode); + diaSetEnum(diaCheatConfig, CHTCFG_CHEATMODE, cheatmodeNames); - int ret = diaExecuteDialog(diaCheatConfig, -1, 1, NULL); - if (ret) { - diaGetInt(diaCheatConfig, CHEATCFG_ENABLECHEAT, &gEnableCheat); - diaGetInt(diaCheatConfig, CHEATCFG_CHEATMODE, &gCheatMode); - } + diaExecuteDialog(diaCheatConfig, -1, 1, &guiCheatUpdater); } #endif @@ -965,7 +979,6 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) // Begin Per-Game GSM Integration --Bat-- #ifdef GSM - int EnableGSM = 0; configGetInt(configSet, CONFIG_ITEM_ENABLEGSM, &EnableGSM); diaSetInt(diaGSConfig, GSMCFG_ENABLEGSM, EnableGSM); @@ -983,9 +996,21 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) diaSetInt(diaGSConfig, GSMCFG_GSMYOFFSET, GSMYOffset); guiSetGSMSettingsState(); +#endif /* GSM */ -// End Of Per-Game GSM Integration --Bat-- -#endif +// Begin of Per-Game CHEAT Integration --Bat-- +#ifdef CHEAT + int EnableCheat = 0; + configGetInt(configSet, CONFIG_ITEM_ENABLECHEAT, &EnableCheat); + diaSetInt(diaCheatConfig, CHTCFG_ENABLECHEAT, EnableCheat); + + int CheatMode = 0; + configGetInt(configSet, CONFIG_ITEM_CHEATMODE, &CheatMode); + diaSetInt(diaCheatConfig, CHTCFG_CHEATMODE, CheatMode); + + guiSetCheatSettingsState(); + +#endif /* CHEAT */ // Find out the current game ID char hexid[32]; @@ -1026,6 +1051,12 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) guiShowGSConfig(); } #endif +#ifdef CHEAT + if (result == COMPAT_CHEATCONFIG) { + guiShowCheatConfig(); + } +#endif + if (result == COMPAT_LOADFROMDISC) { char hexDiscID[15]; if (sysGetDiscID(hexDiscID) >= 0) @@ -1067,6 +1098,10 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_GSMXOFFSET); configRemoveKey(configSet, CONFIG_ITEM_GSMYOFFSET); #endif +#ifdef CHEAT + configRemoveKey(configSet, CONFIG_ITEM_ENABLECHEAT); + configRemoveKey(configSet, CONFIG_ITEM_CHEATMODE); +#endif #ifdef VMC configRemoveVMC(configSet, 0); configRemoveVMC(configSet, 1); @@ -1130,6 +1165,20 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_GSMYOFFSET); #endif +#ifdef CHEAT + diaGetInt(diaCheatConfig, CHTCFG_ENABLECHEAT, &EnableCheat); + if (EnableCheat != 0) + configSetInt(configSet, CONFIG_ITEM_ENABLECHEAT, EnableCheat); + else + configRemoveKey(configSet, CONFIG_ITEM_ENABLECHEAT); + + diaGetInt(diaCheatConfig, CHTCFG_CHEATMODE, &CheatMode); + if (CheatMode != 0) + configSetInt(configSet, CONFIG_ITEM_CHEATMODE, CheatMode); + else + configRemoveKey(configSet, CONFIG_ITEM_CHEATMODE); +#endif + diaGetString(diaCompatConfig, COMPAT_GAMEID, hexid, sizeof(hexid)); if (hexid[0] != '\0') configSetStr(configSet, CONFIG_ITEM_DNAS, hexid); diff --git a/src/menusys.c b/src/menusys.c index de8aa6228..f3b1be33c 100644 --- a/src/menusys.c +++ b/src/menusys.c @@ -24,9 +24,6 @@ enum MENU_IDs { MENU_NET_UPDATE, MENU_SAVE_CHANGES, MENU_START_HDL, -#ifdef CHEAT - MENU_CHEAT_SETTINGS, -#endif MENU_ABOUT, MENU_EXIT, MENU_POWER_OFF @@ -119,9 +116,6 @@ static void menuInitMainMenu(void) submenuAppendItem(&mainMenu, -1, NULL, MENU_SAVE_CHANGES, _STR_SAVE_CHANGES); if (gHDDStartMode && gEnableWrite) // enabled at all? submenuAppendItem(&mainMenu, -1, NULL, MENU_START_HDL, _STR_STARTHDL); -#ifdef CHEAT - submenuAppendItem(&mainMenu, -1, NULL, MENU_CHEAT_SETTINGS, _STR_CHEAT_SETTINGS); -#endif #endif submenuAppendItem(&mainMenu, -1, NULL, MENU_ABOUT, _STR_ABOUT); submenuAppendItem(&mainMenu, -1, NULL, MENU_EXIT, _STR_EXIT); @@ -610,10 +604,6 @@ void menuHandleInputMenu() guiShowConfig(); } else if (id == MENU_GFX_SETTINGS) { guiShowUIConfig(); -#ifdef CHEAT - } else if (id == MENU_CHEAT_SETTINGS) { - guiShowCheatConfig(); -#endif } else if (id == MENU_NET_CONFIG) { guiShowNetConfig(); } else if (id == MENU_NET_UPDATE) { diff --git a/src/opl.c b/src/opl.c index ba7514120..3ac3f21b5 100644 --- a/src/opl.c +++ b/src/opl.c @@ -30,6 +30,10 @@ #include "include/appsupport.h" #include "include/elmsupport.h" +#ifdef CHEAT +#include "include/pgcht.h" +#endif + #ifdef __EESIO_DEBUG #include #define LOG_INIT() sio_init(38400, 0, 0, 0, 0) @@ -543,11 +547,6 @@ static void _loadConfig() configGetInt(configOPL, CONFIG_OPL_WIDESCREEN, &gWideScreen); configGetInt(configOPL, CONFIG_OPL_VMODE, &gVMode); -#ifdef CHEAT - configGetInt(configOPL, CONFIG_OPL_CHEAT_ENABLE, &gEnableCheat); - configGetInt(configOPL, CONFIG_OPL_CHEAT_MODE, &gCheatMode); -#endif - if (configGetStr(configOPL, CONFIG_OPL_THEME, &temp)) themeID = thmFindGuiID(temp); @@ -635,13 +634,6 @@ static void _saveConfig() configSetInt(configOPL, CONFIG_OPL_ENABLE_COVERART, gEnableArt); configSetInt(configOPL, CONFIG_OPL_WIDESCREEN, gWideScreen); configSetInt(configOPL, CONFIG_OPL_VMODE, gVMode); - - -#ifdef CHEAT - configSetInt(configOPL, CONFIG_OPL_CHEAT_ENABLE, gEnableCheat); - configSetInt(configOPL, CONFIG_OPL_CHEAT_MODE, gCheatMode); -#endif - configSetInt(configOPL, CONFIG_OPL_DISABLE_DEBUG, gDisableDebug); configSetInt(configOPL, CONFIG_OPL_PS2LOGO, gPS2Logo); configSetStr(configOPL, CONFIG_OPL_EXIT_PATH, gExitPath); @@ -1230,9 +1222,6 @@ static void setDefaults(void) gVMode = RM_VMODE_AUTO; #ifdef CHEAT - gEnableCheat = 0; - gCheatMode = 0; - memset(gCheatList, 0, sizeof(gCheatList)); #endif diff --git a/src/supportbase.c b/src/supportbase.c index ad94b60ea..332c76dfa 100644 --- a/src/supportbase.c +++ b/src/supportbase.c @@ -10,6 +10,9 @@ #ifdef GSM #include "include/pggsm.h" #endif +#ifdef CHEAT +#include "include/pgcht.h" +#endif #include @@ -392,14 +395,22 @@ int sbPrepare(base_game_info_t *game, config_set_t *configSet, int size_cdvdman, #ifdef GSM gEnableGSM = 0; + //Load the rest of the per-game GSM configuration, only if GSM is enabled. if (configGetInt(configSet, CONFIG_ITEM_ENABLEGSM, &gEnableGSM) && gEnableGSM) { - //Load the rest of the per-game GSM configuration, only if GSM is enabled. configGetInt(configSet, CONFIG_ITEM_GSMVMODE, &gGSMVMode); configGetInt(configSet, CONFIG_ITEM_GSMXOFFSET, &gGSMXOffset); configGetInt(configSet, CONFIG_ITEM_GSMYOFFSET, &gGSMYOffset); } #endif +#ifdef CHEAT + gEnableCheat = 0; + //Load the rest of the per-game CHEAT configuration if CHEAT is enabled. + if (configGetInt(configSet, CONFIG_ITEM_ENABLECHEAT, &gEnableCheat) && gEnableCheat) { + configGetInt(configSet, CONFIG_ITEM_CHEATMODE, &gCheatMode); + } +#endif + *patchindex = i; // game id diff --git a/src/system.c b/src/system.c index da56283b9..c8f0552c0 100644 --- a/src/system.c +++ b/src/system.c @@ -31,6 +31,9 @@ extern int size_genvmc_irx; #ifdef GSM #include "include/pggsm.h" #endif +#ifdef CHEAT +#include "include/pgcht.h" +#endif extern void *udnl_irx; extern int size_udnl_irx; From 94215370e0ed9860399a4067688e3d1ecfab1611 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 24 Oct 2016 18:55:31 -0700 Subject: [PATCH 008/269] SP193: Change in the PS2SDK about libpwroff. - In one commit last year, I changed its design (along with AUDSRV) to use SIFRPC instead because of the change in design of the user SIFCMD buffer. - Unfortunately, i didn't add proper re-initialization code to the new design of libpwroff. - So when OPL starts the HDLDump server the old libpwroff SIFRPC server is contacted and the EE crashes. - Server was broken in r878, and this change was made in 09-27-2016, working well again in r930. - Adjusted the HDLDump server thread priorities for proper functionality of the transfer data. - Update README. --- .travis.yml | 4 +- DETAILED_CHANGELOG | 2 + README | 133 +++++++++++++++++++++------------- modules/hdd/hdldsvr/hdldsvr.c | 4 +- 4 files changed, 88 insertions(+), 55 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d4b50f66..3a79dc150 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,8 @@ ## Thanks to: # - izdubar@psx-scene and jimmikaelkael@psx-scene # -# - doctorxyz@ps2home -# +# - Bat Rastard@psx-scene and doctorxyz@psx-scene +# # - and a lot of people around internet :) sudo: required language: c diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 298ed5baf..df9d7a2fa 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,8 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev966 - Jay-Jay-OPL - Added several features and tweaks by the following developers: * BatRastard: Per Game CHEATS should be good now * Caio99BR: OPL - Last commit about revision, i hate it now - Mon Oct 24 10:52:51 2016 -0700 +rev965 - Jay-Jay-OPL - update lang files - Sun Oct 23 18:34:27 2016 -0700 rev964 - Jay-Jay-OPL - .github: Add some templates * pickup from https://github.com/a2o/snoopy/tree/master/.github * Thanks a lot @bostjan :) - Sun Oct 23 16:28:53 2016 -0700 rev963 - Jay-Jay-OPL - fix Changelogs - Sun Oct 23 09:01:40 2016 -0700 rev962 - Jay-Jay - Merge pull request #2 from ifcaro/master - Sun Oct 23 08:42:58 2016 -0700 diff --git a/README b/README index 32f25ccdf..0e2a8785d 100755 --- a/README +++ b/README @@ -1,90 +1,117 @@ -Open PS2 Loader (OPL) -===================== - -``` ----------------------------------------------------------------------------- - Copyright 2013, Ifcaro & jimmikaelkael - Licenced under Academic Free License version 3.0 - Review LICENSE file for further details. - +Copyright 2013, Ifcaro & jimmikaelkael +Licenced under Academic Free License version 3.0 +Review LICENSE file for further details. + ----------------------------------------------------------------------------- Introduction ----------------------------------------------------------------------------- -Open PS2 Loader (OPL) is a 100% Open source game and application loader for -the PS2 and PS3 units. It now supports *.ISO images on HDD, Ethernet SMB -shares, and USB while also maintaining compatibility with USB Advance/Extreme -format. It's now the most compatible homebrew loader and it should work -without ps2load or change DNASXXX.IMG tricks. +Open PS2 Loader (OPL) is a 100% Open source game and application loader for +the PS2 and PS3 units. It supports three categories of devices : USB mass +storage devices, SMB shares and the PlayStation 2 HDD unit. USB devices and +SMB shares support USBExtreme and *.ISO formats while PS2 HDD supports HDLoader +format. It's now the most compatible homebrew loader. -OPL is also developed continuously - anyone can contribute improvements to +OPL is also developed continuously - anyone can contribute improvements to the project due to its open source nature. -For updated compatibility lists, visit the Open PS2 Loader forum at: +You can visit the Open PS2 Loader forum at: http://www.psx-scene.com/ +For updated compatibility list, you can visit OPL-CL site at: + +http://sx.sytes.net/oplcl/games.aspx + +----------------------------------------------------------------------------- +Release types +----------------------------------------------------------------------------- + +Open PS2 Loader bundle included several types of the same OPL version. These +types come with more or less features included. + +Type (can be a combination) - Description + +--- "Normal" (No suffixes) - Regular, basic OPL release, without any extra +features. Aka vanilla build. +--- "Childproof" - OPL release with some controls disabled (e.g. write +operations). There isnt a GSM+childproof version because GSM is for power users. +--- "VMC" - OPL release with Virtual Memory Card (VMC) support. +--- "GSM" - OPL release with GSM integrated into it. +--- "PS2RD" - OPL release with PS2RD Cheat Engine built-in feature. + ----------------------------------------------------------------------------- How to use ----------------------------------------------------------------------------- -OPL uses the same directory tree structure across HDD, SMB, and -USB modes ... - ---- "CD" (for games on CD media - i.e. blue-bottom discs) ---- "DVD (for DVD5 images; DVD9 images on USB must be split) ---- "VMC" (for 8MB Virtual Memory Card images) ---- "CFG" (for saving per-game configuation files) ---- "ART" (for box and disc art images) ---- "THM" (for themes support) +OPL uses the same directory tree structure across HDD, SMB, and +USB modes ... + +--- "CD" (for games on CD media - i.e. blue-bottom discs) - USB and SMB modes +only +--- "DVD (for DVD5 and DVD9 images if using the NTFS file system on USB or +SMB ; DVD9 images must be split and placed into the device root if using the +FAT32 file system on USB or SMB) - USB and SMB modes only +--- "VMC" (for Virtual Memory Card images - from 8MB up to 64MB) - all modes +--- "CFG" (for saving per-game configuration files) - all modes +--- "ART" (for game art images) - all modes +--- "THM" (for themes support) - all modes +--- "CHT" (for cheats files) - all modes +--- "CFG-DEV" (for saving per-game configuration files, when used from a OPL +dev build - aka beta build) - all modes + +OPL will automatically create the above directory structure the first time +you launch it and enable your favourite device. For HDD users, a 128Mb +OPL +partition will be created (you can enlarge it using uLaunchELF if you need to). + --- USB --- -Game files on USB must be perfectly defragmented either file by file or +Game files on USB must be perfectly defragmented either file by file or by whole drive, and Dual Layer DVD9 images must be split to avoid the 4GB -limitations of the FAT32 file system. We recommend Power Defragmenter -for best defragging results, and our own comman line tool iso2usbld to -convert or split games into USB Advance/Extreme format ... +limitations of the FAT32 file system. We recommend Auslogics Disk Defrag +for best defragging results. -http://my.opera.com/rejzor/blog/power-defragmenter-3-0-released +http://www.auslogics.com/en/software/disk-defrag/ -Other utilities are: USBUtil 2.0, USB Extreme installer or USB Insane. +You also need a PC program to convert or split games into USB Advance/Extreme +format, such as USBUtil 2.0. --- SMB --- For loading games by SMB protocol you need to share a folder (ex: PS2SMB) -on the host machine or NAS device and make sure that it has full read and -write permissions. USB Advance/Extreme format is optional - *.ISO images -are supported using the folder structure above with the added bonus that -DVD9 images don't have to be split if your SMB device uses the NTFS or -EXT3/4 file system. +on the host machine or NAS device and make sure that it has full read and +write permissions. USB Advance/Extreme format is optional - *.ISO images +are supported using the folder structure above with the added bonus that +DVD9 images don't have to be split if your SMB device uses the NTFS or +EXT3/4 file system. ---- HDD ---- -For PS2, 48-bit LBA internal HDDs up to 1TB are supported. They have to be -formatted with either WINHIIP or uLaunch. From there, use uLaunch to make a -partition (rec. minumum of 2GB) named "OPL". If OPL detects this partition -at start up, it'll automatically create the above directory structure. Use -it to migrate ART, THEMES, CFGs, VMCs, etc. off your MC or USB stick to the -internal HDD and free up space on those devices. - -To launch OPL, you can use any of the existing methods for loading an +For PS2, 48-bit LBA internal HDDs up to 2TB are supported. They have to be +formatted with either HDLoader or uLaunchELF (uLaunchELF is recommended). + +* + +To launch OPL, you can use any of the existing methods for loading an executable elf. + On PS3, you need an original SwapMagic 3.6+ or 3.8 disc (at the moment there aren't any other options). The steps for loading OPL on a PS3 are: - 1. Rename OPNPS2LD.ELF to SMBOOT0.ELF - 2. Make a folder in root of USB device called SWAPMAGIC and copy - SMBOOT0.ELF to it. - 3. Launch SwapMagic in PS3 and press UP+L1 then Open PS2 Loader should - start. - +1. Rename OPNPS2LD.ELF to SMBOOT0.ELF +2. Make a folder in root of USB device called SWAPMAGIC and copy +SMBOOT0.ELF to it. +3. Launch SwapMagic in PS3 and press UP+L1 then Open PS2 Loader should +start. + There are 4 forms for launching elfs in SwapMagic. SMBOOT0.ELF = UP + L1 @@ -92,8 +119,12 @@ SMBOOT1.ELF = UP + L2 SMBOOT2.ELF = UP + R1 SMBOOT3.ELF = UP + R2 +Note : on PS3, only USB and SMB modes are supported. + +* + Some notes for devs ----------------------------------------------------------------------------- -Open PS2 Loader needs the latest PS2SDK - +Open PS2 Loader needs the latest PS2SDK + https://github.com/ps2dev/ps2sdk diff --git a/modules/hdd/hdldsvr/hdldsvr.c b/modules/hdd/hdldsvr/hdldsvr.c index af0b6d70f..e947c0eb5 100644 --- a/modules/hdd/hdldsvr/hdldsvr.c +++ b/modules/hdd/hdldsvr/hdldsvr.c @@ -123,7 +123,7 @@ int _start(int argc, char **argv) // create & start the tcp thread thread_param.attr = TH_C; thread_param.thread = (void *)tcp_server_thread; - thread_param.priority = 0x64; + thread_param.priority = 0x10; thread_param.stacksize = 0x1000; thread_param.option = 0; @@ -134,7 +134,7 @@ int _start(int argc, char **argv) // create & start the udp thread thread_param.attr = TH_C; thread_param.thread = (void *)udp_server_thread; - thread_param.priority = 0x64; + thread_param.priority = 0x10; thread_param.stacksize = 0x1000; thread_param.option = 0; From f9a709bca6ed16b761e8788728d927ec2a77265c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 25 Oct 2016 11:41:07 -0700 Subject: [PATCH 009/269] OPL: Fix some shits @ElPatas1 check history of things, and please don't change things that you not INITIALLY written, and FUCK from what place i pickup it, (except if a pick it from a warez/p0rn site, in these cases you NEED to change) Also it is my last commit for OPL, you never will see my committing again here TravisCI: - FIX MY CREDITS Makefile: - Fix DIRTY flag README: - Fix HEADER docs/README: - Add initial folder for make some documentation lng_pack.sh: - Fix usage of printf (reported by @Jay-Jay-OPL) make_changelog.sh: - Fix usage of printf (reported by @Jay-Jay-OPL) Signed-off-by: Caio Oliveira --- .travis.yml | 4 ++-- DETAILED_CHANGELOG | 55 ++++++++++++++++++++++++---------------------- Makefile | 6 ++--- README | 4 ++++ docs/README | 10 +++++++++ lng_pack.sh | 4 +--- make_changelog.sh | 4 ++-- 7 files changed, 51 insertions(+), 36 deletions(-) create mode 100644 docs/README diff --git a/.travis.yml b/.travis.yml index 3a79dc150..5d4b50f66 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,8 @@ ## Thanks to: # - izdubar@psx-scene and jimmikaelkael@psx-scene # -# - Bat Rastard@psx-scene and doctorxyz@psx-scene -# +# - doctorxyz@ps2home +# # - and a lot of people around internet :) sudo: required language: c diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index df9d7a2fa..6e853022e 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,29 +10,32 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: -rev966 - Jay-Jay-OPL - Added several features and tweaks by the following developers: * BatRastard: Per Game CHEATS should be good now * Caio99BR: OPL - Last commit about revision, i hate it now - Mon Oct 24 10:52:51 2016 -0700 -rev965 - Jay-Jay-OPL - update lang files - Sun Oct 23 18:34:27 2016 -0700 -rev964 - Jay-Jay-OPL - .github: Add some templates * pickup from https://github.com/a2o/snoopy/tree/master/.github * Thanks a lot @bostjan :) - Sun Oct 23 16:28:53 2016 -0700 -rev963 - Jay-Jay-OPL - fix Changelogs - Sun Oct 23 09:01:40 2016 -0700 -rev962 - Jay-Jay - Merge pull request #2 from ifcaro/master - Sun Oct 23 08:42:58 2016 -0700 -rev961 - Caio Oliveira - src/dialogs: Fix chars overpassing of screen - Sun Oct 23 12:37:29 2016 -0200 -rev960 - Jay-Jay-OPL - Oops! Fixed a tiny typo mistake in the previous commit. :) - Sun Oct 23 07:23:09 2016 -0700 -rev959 - Jay-Jay-OPL - Update all changes from OPL Daily Builds from BitBucket Repo https://bitbucket.org/Jay-Jay/opl-daily-builds/commits/ : * added ELF Launcher Menu (aka: ELM) -- it's a clone version of the APPS page in OPL, * added changes so both ELM and APPS support CFG data for INFO PAGE, * added a new Attribute feature where selected MODES can also be displayed on INFO PAGE, * updated LANG files, * plus a few miscellaneous tweaks (browse the OPL Daily Builds repo from BitBucket to learn more...). - Sun Oct 23 06:58:03 2016 -0700 -rev958 - Jay-Jay-OPL - change gfx files - Sun Oct 23 02:37:33 2016 -0700 -rev957 - Jay-Jay - Merge pull request #1 from ifcaro/master - Sun Oct 23 02:06:52 2016 -0700 -rev956 - Caio Oliveira - Makefile: Fix REVISION reported by @ElPatas and reforced by @ShaolinAssasin - Sat Oct 22 21:55:40 2016 -0200 -rev955 - Caio Oliveira - src/dialogs: Rework some minor issues - Sat Oct 22 21:55:40 2016 -0200 -rev954 - Caio Oliveira - make_changelog.sh: Rework revision (see NOTE) - Sat Oct 22 21:55:40 2016 -0200 -rev953 - Caio Oliveira - OLD_DETAILED_CHANGELOG: Bring BitBucket changelog - Sat Oct 22 21:55:40 2016 -0200 -rev952 - Caio Oliveira - OPL: Fix GIT revision (see NOTE below) - Fri Oct 21 05:27:04 2016 -0200 -rev951 - doctorxyz - Makefile: Git REVISION number via shell git log command - Thu Oct 20 13:48:36 2016 -0200 -rev950 - Caio Oliveira - OPL: Update versioning to new scheme - Thu Oct 20 13:44:31 2016 -0200 -rev949 - uyjulian - run clang-format on all .c and .h files - Wed Oct 19 20:32:12 2016 -0200 -rev948 - uyjulian - add .clang-format configuration file - Wed Oct 19 20:32:12 2016 -0200 -rev947 - Caio Oliveira - .gitignore: Change from .hgignore and add more entries - Wed Oct 19 11:00:18 2016 -0200 -rev946 - Caio Oliveira - TravisCI: Initial Template - Wed Oct 19 11:00:18 2016 -0200 -rev945 - Caio Oliveira - lng_pack: Add script to pack all Langs in a zip - Wed Oct 19 11:00:18 2016 -0200 -rev944 - Caio Oliveira - make_changelog: Update it to GIT format - Wed Oct 19 11:00:18 2016 -0200 -rev943 - Caio Oliveira - README: Create a symlink need by GitHub - Wed Oct 19 09:47:19 2016 -0200 -rev942 - Caio Oliveira - CREDITS: Make same style in whole file - Wed Oct 19 09:47:19 2016 -0200 -rev941 - doctorxyz - Skip Videos: Three methods (0 PSS/sceMpegIsEnd/BIK) on a single place Now Skip Videos (a.k.a. 0 PSS) not only skips PSS files (by zeroing their sizes) but also skips Bink .BIK (new technique) and sceMpegIsEnd based ones - All of them from a single place: Game Settings->Customized Settings->Mode 4(Skip Videos) - sceMpegIsEnd and BIK approaches has been implemented on ee_core's patches, while 0 PSS code has been kept intact (on iopcore's cdvdman) - Renamed '0 PSS' for 'Skip Videos' according to each language (NB: Basic Google translation. Native speakers can improve it) - Removed now-redundant GSM's Skip Videos sceMpegIsEnd related stuff (ontheflypatcher) - Since sceMpegIsEnd isn't GSM-dependant anymore - Wed Oct 19 08:53:05 2016 -0200 +rev969 - Jay-Jay-OPL - SP193: Change in the PS2SDK about libpwroff. - In one commit last year, I changed its design (along with AUDSRV) to use SIFRPC instead because of the change in design of the user SIFCMD buffer. - Unfortunately, i didn't add proper re-initialization code to the new design of libpwroff. - So when OPL starts the HDLDump server the old libpwroff SIFRPC server is contacted and the EE crashes. - Server was broken in r878, and this change was made in 09-27-2016, working well again in r930. - Adjusted the HDLDump server thread priorities for proper functionality of the transfer data. - Update README. - Mon Oct 24 18:55:31 2016 -0700 +rev968 - Jay-Jay-OPL - Added several features and tweaks by the following developers: * BatRastard: Per Game CHEATS should be good now * Caio99BR: OPL - Last commit about revision, i hate it now - Mon Oct 24 10:52:51 2016 -0700 +rev967 - Jay-Jay-OPL - update lang files - Sun Oct 23 18:34:27 2016 -0700 +rev966 - Jay-Jay-OPL - .github: Add some templates * pickup from https://github.com/a2o/snoopy/tree/master/.github * Thanks a lot @bostjan :) - Sun Oct 23 16:28:53 2016 -0700 +rev965 - Jay-Jay-OPL - fix Changelogs - Sun Oct 23 09:01:40 2016 -0700 +rev964 - Jay-Jay - Merge pull request #2 from ifcaro/master - Sun Oct 23 08:42:58 2016 -0700 +rev963 - Caio Oliveira - src/dialogs: Fix chars overpassing of screen - Sun Oct 23 12:37:29 2016 -0200 +rev962 - Jay-Jay-OPL - Oops! Fixed a tiny typo mistake in the previous commit. :) - Sun Oct 23 07:23:09 2016 -0700 +rev961 - Jay-Jay-OPL - Update all changes from OPL Daily Builds from BitBucket Repo https://bitbucket.org/Jay-Jay/opl-daily-builds/commits/ : * added ELF Launcher Menu (aka: ELM) -- it's a clone version of the APPS page in OPL, * added changes so both ELM and APPS support CFG data for INFO PAGE, * added a new Attribute feature where selected MODES can also be displayed on INFO PAGE, * updated LANG files, * plus a few miscellaneous tweaks (browse the OPL Daily Builds repo from BitBucket to learn more...). - Sun Oct 23 06:58:03 2016 -0700 +rev960 - Jay-Jay-OPL - change gfx files - Sun Oct 23 02:37:33 2016 -0700 +rev959 - Jay-Jay - Merge pull request #1 from ifcaro/master - Sun Oct 23 02:06:52 2016 -0700 +rev958 - Caio Oliveira - Makefile: Fix REVISION reported by @ElPatas and reforced by @ShaolinAssasin - Sat Oct 22 21:55:40 2016 -0200 +rev957 - Caio Oliveira - src/dialogs: Rework some minor issues - Sat Oct 22 21:55:40 2016 -0200 +rev956 - Caio Oliveira - make_changelog.sh: Rework revision (see NOTE) - Sat Oct 22 21:55:40 2016 -0200 +rev955 - Caio Oliveira - OLD_DETAILED_CHANGELOG: Bring BitBucket changelog - Sat Oct 22 21:55:40 2016 -0200 +rev954 - Caio Oliveira - OPL: Fix GIT revision (see NOTE below) - Fri Oct 21 05:27:04 2016 -0200 +rev953 - doctorxyz - Makefile: Git REVISION number via shell git log command - Thu Oct 20 13:48:36 2016 -0200 +rev952 - Caio Oliveira - OPL: Update versioning to new scheme - Thu Oct 20 13:44:31 2016 -0200 +rev951 - uyjulian - run clang-format on all .c and .h files - Wed Oct 19 20:32:12 2016 -0200 +rev950 - uyjulian - add .clang-format configuration file - Wed Oct 19 20:32:12 2016 -0200 +rev949 - Caio Oliveira - .gitignore: Change from .hgignore and add more entries - Wed Oct 19 11:00:18 2016 -0200 +rev948 - Caio Oliveira - TravisCI: Initial Template - Wed Oct 19 11:00:18 2016 -0200 +rev947 - Caio Oliveira - lng_pack: Add script to pack all Langs in a zip - Wed Oct 19 11:00:18 2016 -0200 +rev946 - Caio Oliveira - make_changelog: Update it to GIT format - Wed Oct 19 11:00:18 2016 -0200 +rev945 - Caio Oliveira - README: Create a symlink need by GitHub - Wed Oct 19 09:47:19 2016 -0200 +rev944 - Caio Oliveira - CREDITS: Make same style in whole file - Wed Oct 19 09:47:19 2016 -0200 +rev943 - doctorxyz - Skip Videos: Three methods (0 PSS/sceMpegIsEnd/BIK) on a single place Now Skip Videos (a.k.a. 0 PSS) not only skips PSS files (by zeroing their sizes) but also skips Bink .BIK (new technique) and sceMpegIsEnd based ones - All of them from a single place: Game Settings->Customized Settings->Mode 4(Skip Videos) - sceMpegIsEnd and BIK approaches has been implemented on ee_core's patches, while 0 PSS code has been kept intact (on iopcore's cdvdman) - Renamed '0 PSS' for 'Skip Videos' according to each language (NB: Basic Google translation. Native speakers can improve it) - Removed now-redundant GSM's Skip Videos sceMpegIsEnd related stuff (ontheflypatcher) - Since sceMpegIsEnd isn't GSM-dependant anymore - Wed Oct 19 08:53:05 2016 -0200 +rev942 - doctorxyz - BLURT output (for debugging purposes) It accumulates and shows the line sequence of code executed (or not) on OPL's GUI. To use it, simply add 'BLURT;' macros in the start of lines you want (preferably the ones from the same file) and compile OPL as usual. To enable it on GUI, go to [Settings]->[Disable Debug Colors] and set it to [Off] - Tue Oct 11 10:28:29 2016 -0300 +rev941 - diff --git a/Makefile b/Makefile index 4021da3eb..68db85f5f 100755 --- a/Makefile +++ b/Makefile @@ -57,10 +57,10 @@ REVISION = $(shell expr $$(cat DETAILED_CHANGELOG | grep "rev" | head -1 | cut - GIT_HASH = $(shell git rev-parse --short=7 HEAD 2>/dev/null) ifeq ($(shell git diff --quiet; echo $$?),1) - DIRTY = -dirty + DIRTY = dirty endif -ifneq ($(shell test -d .git; echo $?),0) - DIRTY = -dirty +ifneq ($(shell test -d .git; echo $$?),0) + DIRTY = dirty endif OPL_VERSION = $(VERSION).$(SUBVERSION).$(PATCHLEVEL).$(REVISION)$(if $(EXTRAVERSION),-$(EXTRAVERSION))$(if $(GIT_HASH),-$(GIT_HASH))$(if $(DIRTY),-$(DIRTY))$(if $(LOCALVERSION),-$(LOCALVERSION)) diff --git a/README b/README index 0e2a8785d..2789d22ab 100755 --- a/README +++ b/README @@ -1,3 +1,7 @@ +Open PS2 Loader (OPL) +----------------------------------------------------------------------------- + +``` ----------------------------------------------------------------------------- Copyright 2013, Ifcaro & jimmikaelkael diff --git a/docs/README b/docs/README new file mode 100644 index 000000000..ddfedd4c3 --- /dev/null +++ b/docs/README @@ -0,0 +1,10 @@ +Open PS2 Loader - Docs +---------------------- + +Here will be a place for provide informations about building, making pull +requests, information about bugs reports and others. + +Please make all docs with 80 chars limit. + +Any contribution is welcome, and we will make possible to put your name at +credits and preserve it forever. diff --git a/lng_pack.sh b/lng_pack.sh index bd78b3b19..d4936f7f5 100644 --- a/lng_pack.sh +++ b/lng_pack.sh @@ -9,7 +9,7 @@ opl_git=$(git -C ${_dir}/ rev-parse --short=7 HEAD 2>/dev/null) if [ ${opl_git} ]; then export opl_git=-${opl_git}; fi # Print a list -printf "$(ls ${_dir}/lng/ | cut -c 6- | rev | cut -c 5- | rev)" > /tmp/opl_lng_list +ls ${_dir}/lng/ | cut -c 6- | rev | cut -c 5- | rev > /tmp/opl_lng_list # Copy like Jay-Jay format while IFS= read -r file @@ -31,8 +31,6 @@ done < /tmp/opl_lng_list ----------------------------------------------------------------------------- -Open PS2 Loader Official Translations (25 August 2016) - HOW TO INSTALL: 1. make sure you are running latest OPL 2. transfer both the the LANGUAGE FILE (.lng) and the FONT FILE (.ttf) into your OPL directory of your memory card diff --git a/make_changelog.sh b/make_changelog.sh index 23554688b..f6c396c29 100755 --- a/make_changelog.sh +++ b/make_changelog.sh @@ -35,7 +35,7 @@ then fi # Hack for fix first commit not showed -printf '\n' >> /tmp/commit_summary +echo -e '\n' >> /tmp/commit_summary # Store number of commits old_number_commits=$(($(cat OLD_DETAILED_CHANGELOG | grep "rev" | head -1 | cut -d " " -f 1 | cut -c 4-))) @@ -54,7 +54,7 @@ then fi # Hack for fix first commit not showed -printf '\n' >> /tmp/commit_summary +echo -e '\n' >> /tmp/commit_summary # Reverse commit history gawk '{ L[n++] = $0 } END { while(n--) print L[n] }' /tmp/commit_summary > /tmp/commit_summary_reverse From fce5f1f74a7c36d67fbce0c0c326e41ad335c004 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 25 Oct 2016 11:53:37 -0700 Subject: [PATCH 010/269] doctorxyz commited: Per-Game Cheat Engine - fix for ETH and HDD Modes --- DETAILED_CHANGELOG | 1 + src/ethsupport.c | 13 +++++++------ src/hddsupport.c | 25 +++++++++++++------------ 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 6e853022e..293791915 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev970 - Jay-Jay-OPL - OPL: Fix some shits - Tue Oct 25 11:41:07 2016 -0700 rev969 - Jay-Jay-OPL - SP193: Change in the PS2SDK about libpwroff. - In one commit last year, I changed its design (along with AUDSRV) to use SIFRPC instead because of the change in design of the user SIFCMD buffer. - Unfortunately, i didn't add proper re-initialization code to the new design of libpwroff. - So when OPL starts the HDLDump server the old libpwroff SIFRPC server is contacted and the EE crashes. - Server was broken in r878, and this change was made in 09-27-2016, working well again in r930. - Adjusted the HDLDump server thread priorities for proper functionality of the transfer data. - Update README. - Mon Oct 24 18:55:31 2016 -0700 rev968 - Jay-Jay-OPL - Added several features and tweaks by the following developers: * BatRastard: Per Game CHEATS should be good now * Caio99BR: OPL - Last commit about revision, i hate it now - Mon Oct 24 10:52:51 2016 -0700 rev967 - Jay-Jay-OPL - update lang files - Sun Oct 23 18:34:27 2016 -0700 diff --git a/src/ethsupport.c b/src/ethsupport.c index 84312078c..c2a3efa8d 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -633,6 +633,13 @@ static void ethLaunchGame(int id, config_set_t *configSet) } #endif + if (gRememberLastPlayed) { + configSetStr(configGetByType(CONFIG_LAST), "last_played", game->startup); + saveConfig(CONFIG_LAST, 0); + } + + compatmask = sbPrepare(game, configSet, size_smb_cdvdman_irx, &smb_cdvdman_irx, &i); + #ifdef CHEAT if ((result = sbLoadCheats(ethPrefix, game->startup)) < 0) { switch (result) { @@ -645,12 +652,6 @@ static void ethLaunchGame(int id, config_set_t *configSet) } #endif - if (gRememberLastPlayed) { - configSetStr(configGetByType(CONFIG_LAST), "last_played", game->startup); - saveConfig(CONFIG_LAST, 0); - } - - compatmask = sbPrepare(game, configSet, size_smb_cdvdman_irx, &smb_cdvdman_irx, &i); settings = (struct cdvdman_settings_smb *)((u8 *)(&smb_cdvdman_irx) + i); switch (game->format) { diff --git a/src/hddsupport.c b/src/hddsupport.c index f1aa64d00..5ac1c190a 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -372,18 +372,6 @@ static void hddLaunchGame(int id, config_set_t *configSet) } #endif -#ifdef CHEAT - if ((result = sbLoadCheats(hddPrefix, game->startup)) < 0) { - switch (result) { - case -ENOENT: - guiWarning(_l(_STR_NO_CHEATS_FOUND), 10); - break; - default: - guiWarning(_l(_STR_ERR_CHEATS_LOAD_FAILED), 10); - } - } -#endif - if (gRememberLastPlayed) { configSetStr(configGetByType(CONFIG_LAST), "last_played", game->startup); saveConfig(CONFIG_LAST, 0); @@ -413,6 +401,19 @@ static void hddLaunchGame(int id, config_set_t *configSet) } sbPrepare(NULL, configSet, size_irx, irx, &i); + +#ifdef CHEAT + if ((result = sbLoadCheats(hddPrefix, game->startup)) < 0) { + switch (result) { + case -ENOENT: + guiWarning(_l(_STR_NO_CHEATS_FOUND), 10); + break; + default: + guiWarning(_l(_STR_ERR_CHEATS_LOAD_FAILED), 10); + } + } +#endif + settings = (struct cdvdman_settings_hdd *)((u8 *)irx + i); // patch 48bit flag From 47e3211349dad95d3ddcdddfe5eeceaa81fe1972 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 27 Oct 2016 15:28:16 -0700 Subject: [PATCH 011/269] A Few fixes... * doctorxyz commited: GSM core - Screen garbage fix for God of War I (SCUS_973.99) & Sega Genesis Collection (SLUS_215.42) - This patch is applied only once, each time Hook_SetGsCrt is called; it makes DISPLAY2 appears, while DISPLAY1 not - by setting its value to zero. - PS: Sega Genesis Collection (SLUS_215.42) does not repeatedly write to GS Priviledge Registers, but God of War I (SCUS_973.99) does it. * Revert changes to Game Settings by using the old alignment settings for MODES -- thanks to @joseri from PS2-HOME for reporting this issue for translated langs. * Update translated langs by the PS2-HOME translators. --- DETAILED_CHANGELOG | 1 + ee_core/src/gsm_engine.S | 76 ++++++++++++++++++++++++---------------- lng/lang_French.lng | 2 +- lng/lang_Italian.lng | 2 +- lng/lang_Laotian.lng | 2 +- lng/lang_Russian.lng | 2 +- lng/lang_Spanish.lng | 2 +- lng/lang_Swedish.lng | 2 +- src/dialogs.c | 39 ++++++++++----------- 9 files changed, 71 insertions(+), 57 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 293791915..26ddf6711 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev971 - Jay-Jay-OPL - doctorxyz commited: Per-Game Cheat Engine - fix for ETH and HDD Modes - Tue Oct 25 11:53:37 2016 -0700 rev970 - Jay-Jay-OPL - OPL: Fix some shits - Tue Oct 25 11:41:07 2016 -0700 rev969 - Jay-Jay-OPL - SP193: Change in the PS2SDK about libpwroff. - In one commit last year, I changed its design (along with AUDSRV) to use SIFRPC instead because of the change in design of the user SIFCMD buffer. - Unfortunately, i didn't add proper re-initialization code to the new design of libpwroff. - So when OPL starts the HDLDump server the old libpwroff SIFRPC server is contacted and the EE crashes. - Server was broken in r878, and this change was made in 09-27-2016, working well again in r930. - Adjusted the HDLDump server thread priorities for proper functionality of the transfer data. - Update README. - Mon Oct 24 18:55:31 2016 -0700 rev968 - Jay-Jay-OPL - Added several features and tweaks by the following developers: * BatRastard: Per Game CHEATS should be good now * Caio99BR: OPL - Last commit about revision, i hate it now - Mon Oct 24 10:52:51 2016 -0700 diff --git a/ee_core/src/gsm_engine.S b/ee_core/src/gsm_engine.S index 720424c3a..5b22288f7 100755 --- a/ee_core/src/gsm_engine.S +++ b/ee_core/src/gsm_engine.S @@ -107,7 +107,7 @@ GSMDestGSRegs: .space 88 .equ Target_DISPLAY2, 80 # DWORD .globl GSMFlags -GSMFlags: .space 18 +GSMFlags: .space 17 .equ X_offset, 0 # WORD .equ Y_offset, 4 # WORD .equ ADAPTATION_fix, 8 # BYTE @@ -122,11 +122,12 @@ GSMFlags: .space 18 .p2align 4 # align 16 bytes (IMPORTANT!!!) -GSMAdapts: .space 18 +GSMAdapts: .space 19 .equ Adapted_DISPLAY1, 0 # DWORD .equ Adapted_DISPLAY2, 8 # DWORD .equ Interlace_FRAME_Mode_Flag, 16 # BYTE -> Double Height for SMODE2's INT=1 (Interlace Mode) and FFMD=1 (FRAME Mode. Read every line) .equ SMODE2_adaptation, 17 # BYTE -> Adapted SMODE2 patch value +.equ RC_adaptation, 18 # BYTE -> RC (Read Circuit) adaptation for avoiding garbage on screen ex.: Sega Genesis Collection (SLUS_215.42) .p2align 4 # align 16 bytes (IMPORTANT!!!) @@ -217,6 +218,13 @@ sb $a3, Interlace_FRAME_Mode_Flag($v0) //----------------------------------------------------------------------------------------- +// RC (Read Circuit) adaptation for avoiding garbage on screen ex.: Sega Genesis Collection (SLUS_215.42) +la $v0, GSMAdapts +li $a0, 1 +sb $a0, RC_adaptation($v0) + +//----------------------------------------------------------------------------------------- + // Remove all breakpoints (even when they aren't enabled) di // Disable Interupts li $a2, 0x8000 @@ -811,7 +819,7 @@ store_v0_as_PMODE: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt beqzl $zero,exit_GSHandler # Now go exit -sd $v0,0($a3) # after storing GS_PMODE +sd $v0,0($a3) # after storing # ---------------------------- # SMODE1 @@ -894,7 +902,7 @@ store_v0_as_SMODE1: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt beqzl $zero,exit_GSHandler # Now go exit -sd $v0,0($a3) # after storing GS_SMODE1 +sd $v0,0($a3) # after storing # ---------------------------- # SMODE2 @@ -933,7 +941,7 @@ store_v0_as_SMODE2: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt beqzl $zero,exit_GSHandler # Now go exit -sd $v0,0($a3) # after storing GS_reg_SMODE2 +sd $v0,0($a3) # after storing # ---------------------------- # SRFSH @@ -976,7 +984,7 @@ store_v0_as_SRFSH: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt beqzl $zero,exit_GSHandler # Now go exit -sd $v0,0($a3) # after storing GS_SRFSH +sd $v0,0($a3) # after storing # ---------------------------- # SYNCH1 @@ -1005,7 +1013,7 @@ store_v0_as_SYNCH1: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt beqzl $zero,exit_GSHandler # Now go exit -sd $v0,0($a3) # after storing GS_SYNCH1 +sd $v0,0($a3) # after storing # ---------------------------- # SYNCH2 @@ -1031,7 +1039,7 @@ store_v0_as_SYNCH2: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt beqzl $zero,exit_GSHandler # Now go exit -sd $v0,0($a3) # after storing GS_SYNCH2 +sd $v0,0($a3) # after storing # ---------------------------- # SYNCV @@ -1061,7 +1069,7 @@ store_v0_as_SYNCV: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt beqzl $zero,exit_GSHandler # Now go exit -sd $v0,0($a3) # after storing GS_SYNCV +sd $v0,0($a3) # after storing # ---------------------------- # DISPFB1 @@ -1097,10 +1105,8 @@ or $v0,$zero,$a1 # go use v0=a1 for DISPFB1 store_v0_as_DISPFB1: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt -sd $v0,GS_DISPFB1($s4) # Write to GS_DISPFB1 -sd $v0,GS_DISPFB2($s4) # Write to GS_DISPFB2 -beqzl $zero,exit_GSHandler_complex # Now go exit (complex) -nop +beqzl $zero,exit_GSHandler # Now go exit +sd $v0,0($a3) # after storing # ---------------------------- # DISPFB2 @@ -1136,10 +1142,8 @@ or $v0,$zero,$a1 # go use v0=a1 for DISPFB2 store_v0_as_DISPFB2: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt -sd $v0,GS_DISPFB2($s4) # Write to GS_DISPFB2 -sd $v0,GS_DISPFB1($s4) # Write to GS_DISPFB1 -beqzl $zero,exit_GSHandler_complex # Now go exit (complex) -nop +beqzl $zero,exit_GSHandler # Now go exit +sd $v0,0($a3) # after storing # ---------------------------- # DISPLAY1 @@ -1204,7 +1208,7 @@ nop # { or $t7,$zero,$t5 # t7 = Target_DW = Target_Width - 1 sub $t0,$t6,$t4 # t0 = Target_Width - Source_Pixels_Width li $t4,0 # t4 = Target_MAGH = 0 -beq $zero,$zero,have_DISPLAY1_write_4 # } +beql $zero,$zero,have_DISPLAY1_write_4 # } nop # otherwise # Target_Width_Scale nonzero @@ -1293,7 +1297,7 @@ nop # { or $t7,$zero,$t5 # t7 = Target_DH = Target_Height - 1 sub $t0,$t6,$t4 # t0 = Target_Height - Source_Pixels_Height li $t4,0 # t4 = Target_MAGV = 0 -beq $zero,$zero,have_DISPLAY1_write_10 # } +beql $zero,$zero,have_DISPLAY1_write_10 # } nop # otherwise # Target_Height_Scale nonzero @@ -1332,7 +1336,7 @@ add $t7,$t7,$t0 # t7 = Calculated_DH = Calculated_DH + Target_DY - Calculated have_DISPLAY1_write_12: lb $t0, Interlace_FRAME_Mode_Flag($s3) # in case of Double Height not needed -beq $t0,$zero,have_DISPLAY1_write_13 # Calculation is complete +beql $t0,$zero,have_DISPLAY1_write_13 # Calculation is complete nop ld $t0, Target_SMODE2($s1) @@ -1380,10 +1384,8 @@ ld $v0, Target_DISPLAY1($s1) # use forced mode without adaption store_v0_as_DISPLAY1: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt -sd $v0,GS_DISPLAY1($s4) # Write to GS_DISPLAY1 -sd $v0,GS_DISPLAY2($s4) # Write to GS_DISPLAY2 beqzl $zero,exit_GSHandler_complex # Now go exit (complex) -nop +sd $v0,0($a3) # after storing # ---------------------------- # DISPLAY2 @@ -1448,7 +1450,7 @@ nop # { or $t7,$zero,$t5 # t7 = Target_DW = Target_Width - 1 sub $t0,$t6,$t4 # t0 = Target_Width - Source_Pixels_Width li $t4,0 # t4 = Target_MAGH = 0 -beq $zero,$zero,have_DISPLAY2_write_4 # } +beql $zero,$zero,have_DISPLAY2_write_4 # } nop # otherwise # Target_Width_Scale nonzero @@ -1537,7 +1539,7 @@ nop # { or $t7,$zero,$t5 # t7 = Target_DH = Target_Height - 1 sub $t0,$t6,$t4 # t0 = Target_Height - Source_Pixels_Height li $t4,0 # t4 = Target_MAGV = 0 -beq $zero,$zero,have_DISPLAY2_write_10 # } +beql $zero,$zero,have_DISPLAY2_write_10 # } nop # otherwise # Target_Height_Scale nonzero @@ -1576,7 +1578,7 @@ add $t7,$t7,$t0 # t7 = Calculated_DH = Calculated_DH + Target_DY - Calculated have_DISPLAY2_write_12: lb $t0, Interlace_FRAME_Mode_Flag($s3) # in case of Double Height not needed -beq $t0,$zero,have_DISPLAY2_write_13 # Calculation is complete +beql $t0,$zero,have_DISPLAY2_write_13 # Calculation is complete nop ld $t0, Target_SMODE2($s1) @@ -1624,15 +1626,27 @@ ld $v0, Target_DISPLAY2($s1) # use forced mode without adaption store_v0_as_DISPLAY2: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt -sd $v0,GS_DISPLAY2($s4) # Write to GS_DISPLAY2 -sd $v0,GS_DISPLAY1($s4) # Write to GS_DISPLAY1 -beqzl $zero,exit_GSHandler_complex # Now go exit (complex) +sd $v0,0($a3) # store DISPLAY2 + +# ------------------------------------------------------------------------------------------------------ + +lb $a1, RC_adaptation($s3) +beqzl $a1,exit_GSHandler_complex # in case of RC_adaptation is disabled, go exit (complex) nop +sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! +sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt +sd $zero, GS_DISPLAY1($s4) # DISPLAY1 should never be displayed on this scenario (in order to avoid garbage on screen) +beqzl $zero,exit_GSHandler_complex +sb $zero, RC_adaptation($s3) # Disable RC_adaptation, since this patch should be applied only once, each time Hook_SetGsCrt is called. + # Sega Genesis Collection (SLUS_215.42) doesn't repeatedly write to GS Priviledge Registers, but God of War I (SCUS_973.99) does this! + +# ------------------------------------------------------------------------------------------------------ + exit_GSHandler_complex: -#li $t0, 0xFFFFFF # White -#sd $t0, %lo(GS_BGCOLOUR)($a0) # Change BGCOLOR (for debugging purposes) +#li $v0, 0xFFFFFF # White +#sd $v0, GS_BGCOLOUR($s4) # Change BGCOLOR (for debugging purposes) # ----- Here we restore some registers, used for complex calculations above lq $t2, 0xA0($a2) # t2 diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 2c6974c25..434fa80e6 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -113,7 +113,7 @@ Laisser vide pour authentification invité Lecture précise (simule la vitesse de lecture du CD/DVD) Mode synchrone (mode de lecture alternatif) Décrocher Syscalls (purge OPL après lancement du jeu) -Passer les cinématiques +Passer les vidéos Émuler DVD-DL (DVD9 rippés en DVD5) Désactiver IGR (incompatible avec certains jeux) Stockage élevé (charge les modules de stockage à une adresse plus élevée) diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index 8925a1fba..d6d70d404 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -113,7 +113,7 @@ Lasciare vuoto per autenticazione GUEST Lettura accurata Modo sincrono Unhook dalle syscalls -Skip Video +Salta i video Disabilita DVD-DL Disabilita IGR Moduli nell'area alta di memoria diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index 021871280..b059fb235 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -113,7 +113,7 @@ NetBIOS ອ່ານແບບຖືກຕ້ອງແມ່ນຍຳ ວິທີການອ່ານຂໍ້ມູນທີ່ມີທາງເລືອກ Unhook Syscalls -ຂ້າມວິດີໂອ +ຂ້າມການຫຼິ້ນວິດິໂອ ປະມວນຜົນ DVD-DL Disable IGR High module storage diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 98d7db7b5..7fa99eed9 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -113,7 +113,7 @@ NetBIOS Аккуратное чтение Альтернативный метод чтения данных Разблокировать системные вызовы -Пропустить Видео +Пропуск роликов Эмулировать DVD-DL Отключить использование IGR Высокий модуль хранения diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index b06fec222..d9e90d63b 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -113,7 +113,7 @@ Dejar en blanco para autentificar como GUEST Lectura precisa Modo sincronizado Desvincula el sistema -Omite vídeos +Apagar videos Emula DVD-DL Quita el IGR Almacena los módulos en alta dirección de memoria diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index e89629451..6edcc72aa 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -113,7 +113,7 @@ Lämna tomt för Gäst konto. Korrekt läsning Synkroniseringsläge Släpp Syscalls -Hoppa över videoklipp +Skippa Videos Emulera DVD-DL Inaktivera IGR Högmoduls-lagring diff --git a/src/dialogs.c b/src/dialogs.c index 85da11caa..1b1567cd2 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -140,40 +140,39 @@ struct UIItem diaCompatConfig[] = { {UI_LABEL, COMPAT_STATUS, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_MODE1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE1}}}, {UI_SPACER}, - {UI_BOOL, COMPAT_MODE_BASE, 1, 1, _STR_HINT_MODE1, 0, 0, {.intvalue = {0, 0}}}, + {UI_BOOL, COMPAT_MODE_BASE , 1, 1, _STR_HINT_MODE1, -10, 0, {.intvalue = {0, 0}}}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_MODE2}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE2}}}, {UI_SPACER}, - {UI_BOOL, COMPAT_MODE_BASE + 1, 1, 1, _STR_HINT_MODE2, 0, 0, {.intvalue = {0, 0}}}, - {UI_BREAK}, - - {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_MODE3}}}, - {UI_SPACER}, - {UI_BOOL, COMPAT_MODE_BASE + 2, 1, 1, _STR_HINT_MODE3, 0, 0, {.intvalue = {0, 0}}}, + {UI_BOOL, COMPAT_MODE_BASE + 1, 1, 1, _STR_HINT_MODE2, -10, 0, {.intvalue = {0, 0}}}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_MODE4}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE3}}}, {UI_SPACER}, - {UI_BOOL, COMPAT_MODE_BASE + 3, 1, 1, _STR_HINT_MODE4, 0, 0, {.intvalue = {0, 0}}}, + {UI_BOOL, COMPAT_MODE_BASE + 2, 1, 1, _STR_HINT_MODE3, -10, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, - - {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_MODE5}}}, + + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE4}}}, + {UI_SPACER}, + {UI_BOOL, COMPAT_MODE_BASE + 3, 1, 1, _STR_HINT_MODE4, -10, 0, {.intvalue = {0, 0}}}, + {UI_SPACER}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE5}}}, {UI_SPACER}, - {UI_BOOL, COMPAT_MODE_BASE + 4, 1, 1, _STR_HINT_MODE5, 0, 0, {.intvalue = {0, 0}}}, + {UI_BOOL, COMPAT_MODE_BASE + 4, 1, 1, _STR_HINT_MODE5, -10, 0, {.intvalue = {0, 0}}}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_MODE6}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE6}}}, {UI_SPACER}, - {UI_BOOL, COMPAT_MODE_BASE + 5, 1, 1, _STR_HINT_MODE6, 0, 0, {.intvalue = {0, 0}}}, + {UI_BOOL, COMPAT_MODE_BASE + 5, 1, 1, _STR_HINT_MODE6, -10, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_MODE7}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE7}}}, {UI_SPACER}, - {UI_BOOL, COMPAT_MODE_BASE + 6, 1, 1, _STR_HINT_MODE7, 0, 0, {.intvalue = {0, 0}}}, + {UI_BOOL, COMPAT_MODE_BASE + 6, 1, 1, _STR_HINT_MODE7, -10, 0, {.intvalue = {0, 0}}}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_MODE8}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE8}}}, {UI_SPACER}, - {UI_BOOL, COMPAT_MODE_BASE + 7, 1, 1, _STR_HINT_MODE8, 0, 0, {.intvalue = {0, 0}}}, + {UI_BOOL, COMPAT_MODE_BASE + 7, 1, 1, _STR_HINT_MODE8, -10, 0, {.intvalue = {0, 0}}}, {UI_SPLITTER}, #ifdef GSM From b8c33cd79acfd2edfe0f225359748a00b995383a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 31 Oct 2016 11:33:56 -0700 Subject: [PATCH 012/269] The following changes were made: ShaolinAssassin: GUI layout fix: compatibility with lang files restored (NOTE: partial merge, not all changes were added to the OPL Daily Builds repo). uyjulian: clang-format again. uyjulian: Fix readme to be in markdown format. uyjulian: consise templates.. doctorxyz: GSM Core gardening. uyjulian: fix spacing, links, and wording in readme. Jay-Jay-OPL: a few custom changes to some files and also lang updates for OPL Daily Builds repo. --- .github/ISSUE_TEMPLATE.md | 27 +-- .github/PULL_REQUEST_TEMPLATE.md | 37 +--- DETAILED_CHANGELOG | 1 + README | 150 +++++++--------- ee_core/src/gsm_engine.S | 280 +++++++++++++---------------- lng/lang_Indonesian.lng | 4 +- modules/iopcore/imgdrv/imgdrv.c | 2 +- modules/network/SMSTCPIP/sockets.c | 6 +- src/dialogs.c | 101 ++++++----- src/ethsupport.c | 10 +- src/gui.c | 4 +- src/lang.c | 2 +- 12 files changed, 272 insertions(+), 352 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index fd9b68a99..208f9db5b 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,31 +1,20 @@ -## Checklist before I submit this issue report - -I confirm that: -- [ ] I have tested this with the latest source code available -- [ ] I have checked existing OPL issues for duplicates and found none @ http://psx-scene.com/forums/official-open-ps2-loader-forum/ & https://github.com/ifcaro/Open-PS2-Loader/issues - +## Issue checklist +Note: these are not necessarily requirements -## Issue description - Describe the problem you are having +- [ ] I have checked existing OPL issues for duplicates and found none @ http://psx-scene.com/forums/official-open-ps2-loader-forum/ & https://github.com/ifcaro/Open-PS2-Loader/issues -(replace 'FILLIN' with description) +## Open PS2 loader version -FILLIN +## Open PS2 loader mode (USB, SMB, HDD) +## Open PS2 type (Normal, Childproof, VMC, GSM, PS2RD) +## Issue description - Describe the problem you are having ## Expected result -FILLIN - - - ## Actual result -FILLIN - - - -## Steps to reproduce +## How to reproduce the issue -FILLIN diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index b69f8716a..5521b8cf6 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,35 +1,10 @@ -Checklists for Pull requests ----------------------------- +## Pull Request checklist -About pull request itself: -- [X] I am submitting a pull request:) -- [ ] My submission does one logical thing only (one bugfix, one new feature). If I will want to supply multiple logical changes, I will submit multiple pull requests. +Note: these are not necessarily requirements -Code quality: -(not applicable for non-code fixes of course) -- [ ] My submission follow coding style of file (or follow this coding style guide ) -- [ ] My submission is passing local test suite +- [ ] I reformatted the code with clang-format +- [ ] I checked to make sure my submission worked +- [ ] I am the author of submission or have permission from the original author. -Commits: -- [ ] My commits are logical, easily readable, with concise comments. -- [ ] My commits follow the KISS principle: do one thing, and do it well. +## Pull Request description -Licensing: -- [ ] I am the author of submission or have been authorized by submission copyright holder to issue this pull request. - -Branching: -- [ ] My submission is based on master branch. -- [ ] My submission is compatible with latest master branch updates (no conflicts, I did a rebase if it was necessary). -- [ ] The name of the branch I want to merge upstream is not 'master' (except for only the most trivial fixes, like typos and such). -- [ ] My branch name is *feature/my-shiny-new-opl-feature-title* (for new features). -- [ ] My branch name is *bugfix/my-totally-non-hackish-workaround* (for bugfixes). -- [ ] My branch name is *doc/what-i-did-to-documentation* (for documentation updates). - -Continuous integration: -- [x] [TODO] Once I will submit this pull request, I will wait for Travis-CI report (normally a couple of minutes) and fix any issues I might have introduced. -- [x] [TODO] Until TravisCI not is configured, you can configure and run TravisCI , it alrealdy have a working template. - - - -Pull request description ------------------------- diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 26ddf6711..9d69575b5 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev972 - Jay-Jay-OPL - A Few fixes... * doctorxyz commited: GSM core - Screen garbage fix for God of War I (SCUS_973.99) & Sega Genesis Collection (SLUS_215.42) - This patch is applied only once, each time Hook_SetGsCrt is called; it makes DISPLAY2 appears, while DISPLAY1 not - by setting its value to zero. - PS: Sega Genesis Collection (SLUS_215.42) does not repeatedly write to GS Priviledge Registers, but God of War I (SCUS_973.99) does it. - Thu Oct 27 15:28:16 2016 -0700 rev971 - Jay-Jay-OPL - doctorxyz commited: Per-Game Cheat Engine - fix for ETH and HDD Modes - Tue Oct 25 11:53:37 2016 -0700 rev970 - Jay-Jay-OPL - OPL: Fix some shits - Tue Oct 25 11:41:07 2016 -0700 rev969 - Jay-Jay-OPL - SP193: Change in the PS2SDK about libpwroff. - In one commit last year, I changed its design (along with AUDSRV) to use SIFRPC instead because of the change in design of the user SIFCMD buffer. - Unfortunately, i didn't add proper re-initialization code to the new design of libpwroff. - So when OPL starts the HDLDump server the old libpwroff SIFRPC server is contacted and the EE crashes. - Server was broken in r878, and this change was made in 09-27-2016, working well again in r930. - Adjusted the HDLDump server thread priorities for proper functionality of the transfer data. - Update README. - Mon Oct 24 18:55:31 2016 -0700 diff --git a/README b/README index 2789d22ab..c1156d7e4 100755 --- a/README +++ b/README @@ -1,134 +1,108 @@ -Open PS2 Loader (OPL) ------------------------------------------------------------------------------ +# Open PS2 Loader -``` ------------------------------------------------------------------------------ +Copyright 2013, Ifcaro & jimmikaelkael +Licenced under Academic Free License version 3.0 +Review LICENSE file for further details. -Copyright 2013, Ifcaro & jimmikaelkael -Licenced under Academic Free License version 3.0 -Review LICENSE file for further details. - ------------------------------------------------------------------------------ - -Introduction ------------------------------------------------------------------------------ +## Introduction Open PS2 Loader (OPL) is a 100% Open source game and application loader for the PS2 and PS3 units. It supports three categories of devices : USB mass storage devices, SMB shares and the PlayStation 2 HDD unit. USB devices and -SMB shares support USBExtreme and *.ISO formats while PS2 HDD supports HDLoader -format. It's now the most compatible homebrew loader. +SMB shares support USBExtreme and \*.ISO formats while PS2 HDD supports HDLoader +format. It's now the most compatible homebrew loader. OPL is also developed continuously - anyone can contribute improvements to -the project due to its open source nature. +the project due to its open source nature. -You can visit the Open PS2 Loader forum at: +You can visit the Open PS2 Loader forum at: -http://www.psx-scene.com/ +http://psx-scene.com/forums/official-open-ps2-loader-forum/ -For updated compatibility list, you can visit OPL-CL site at: +For updated compatibility list, you can visit OPL-CL site at: -http://sx.sytes.net/oplcl/games.aspx +http://sx.sytes.net/oplcl/games.aspx ------------------------------------------------------------------------------ -Release types ------------------------------------------------------------------------------ +## Release types Open PS2 Loader bundle included several types of the same OPL version. These -types come with more or less features included. - -Type (can be a combination) - Description - ---- "Normal" (No suffixes) - Regular, basic OPL release, without any extra -features. Aka vanilla build. ---- "Childproof" - OPL release with some controls disabled (e.g. write -operations). There isnt a GSM+childproof version because GSM is for power users. ---- "VMC" - OPL release with Virtual Memory Card (VMC) support. ---- "GSM" - OPL release with GSM integrated into it. ---- "PS2RD" - OPL release with PS2RD Cheat Engine built-in feature. - ------------------------------------------------------------------------------ -How to use ------------------------------------------------------------------------------ - -OPL uses the same directory tree structure across HDD, SMB, and -USB modes ... - ---- "CD" (for games on CD media - i.e. blue-bottom discs) - USB and SMB modes -only ---- "DVD (for DVD5 and DVD9 images if using the NTFS file system on USB or -SMB ; DVD9 images must be split and placed into the device root if using the -FAT32 file system on USB or SMB) - USB and SMB modes only ---- "VMC" (for Virtual Memory Card images - from 8MB up to 64MB) - all modes ---- "CFG" (for saving per-game configuration files) - all modes ---- "ART" (for game art images) - all modes ---- "THM" (for themes support) - all modes ---- "CHT" (for cheats files) - all modes ---- "CFG-DEV" (for saving per-game configuration files, when used from a OPL -dev build - aka beta build) - all modes +types come with more or less features included. + +| Type (can be a combination) | Description | +| --------------------------- | --------------------------------------------------------------------------------- | +| "Normal" (No suffixes) | Regular, basic OPL release, without any extra features. Aka vanilla build. | +| "Childproof" | OPL release with some controls disabled (e.g. write operations). | +| "VMC" | OPL release with Virtual Memory Card (VMC) support. | +| "GSM" | OPL release with GSM integrated into it. | +| "PS2RD" | OPL release with PS2RD Cheat Engine built-in feature. | + +## How to use + +OPL uses the following directory tree structure across HDD, SMB, and +USB modes: + +| Folder | Description | Modes | +| ------ | ----------- | ----- | +| "CD" | for games on CD media - i.e. blue-bottom discs | USB and SMB | +| "DVD" | for DVD5 and DVD9 images if using the NTFS file system on USB or SMB ; DVD9 images must be split and placed into the device root if using the FAT32 file system on USB or SMB | USB and SMB | +| "VMC" | for Virtual Memory Card images - from 8MB up to 64MB | all | +| "CFG" | for saving per-game configuration files | all | +| "ART" | for game art images | all | +| "THM" | for themes support | all | +| "CHT" | for cheats files | all | +| "CFG-DEV" | for saving per-game configuration files, when used from a OPL dev build - aka beta build | all | OPL will automatically create the above directory structure the first time you launch it and enable your favourite device. For HDD users, a 128Mb +OPL -partition will be created (you can enlarge it using uLaunchELF if you need to). +partition will be created (you can enlarge it using uLaunchELF if you need to). +## USB ---- -USB ---- Game files on USB must be perfectly defragmented either file by file or by whole drive, and Dual Layer DVD9 images must be split to avoid the 4GB limitations of the FAT32 file system. We recommend Auslogics Disk Defrag -for best defragging results. +for best defragging results. -http://www.auslogics.com/en/software/disk-defrag/ +http://www.auslogics.com/en/software/disk-defrag/ You also need a PC program to convert or split games into USB Advance/Extreme -format, such as USBUtil 2.0. +format, such as USBUtil 2.0. + +## SMB ---- -SMB ---- For loading games by SMB protocol you need to share a folder (ex: PS2SMB) on the host machine or NAS device and make sure that it has full read and -write permissions. USB Advance/Extreme format is optional - *.ISO images +write permissions. USB Advance/Extreme format is optional - \*.ISO images are supported using the folder structure above with the added bonus that DVD9 images don't have to be split if your SMB device uses the NTFS or -EXT3/4 file system. +EXT3/4 file system. ----- -HDD ----- -For PS2, 48-bit LBA internal HDDs up to 2TB are supported. They have to be -formatted with either HDLoader or uLaunchELF (uLaunchELF is recommended). +## HDD -* +For PS2, 48-bit LBA internal HDDs up to 2TB are supported. They have to be +formatted with either HDLoader or uLaunchELF (uLaunchELF is recommended). To launch OPL, you can use any of the existing methods for loading an -executable elf. - +executable elf. On PS3, you need an original SwapMagic 3.6+ or 3.8 disc (at the moment -there aren't any other options). The steps for loading OPL on a PS3 are: +there aren't any other options). The steps for loading OPL on a PS3 are: 1. Rename OPNPS2LD.ELF to SMBOOT0.ELF -2. Make a folder in root of USB device called SWAPMAGIC and copy -SMBOOT0.ELF to it. -3. Launch SwapMagic in PS3 and press UP+L1 then Open PS2 Loader should -start. +2. Make a folder in root of USB device called SWAPMAGIC and copy SMBOOT0.ELF to it. +3. Launch SwapMagic in PS3 and press UP+L1 then Open PS2 Loader should start. -There are 4 forms for launching elfs in SwapMagic. +There are 4 forms for launching elfs in SwapMagic. -SMBOOT0.ELF = UP + L1 -SMBOOT1.ELF = UP + L2 -SMBOOT2.ELF = UP + R1 -SMBOOT3.ELF = UP + R2 +SMBOOT0.ELF = UP + L1 +SMBOOT1.ELF = UP + L2 +SMBOOT2.ELF = UP + R1 +SMBOOT3.ELF = UP + R2 -Note : on PS3, only USB and SMB modes are supported. +Note: on PS3, only USB and SMB modes are supported. -* +## Some notes for devs -Some notes for devs ------------------------------------------------------------------------------ -Open PS2 Loader needs the latest PS2SDK +Open PS2 Loader needs the latest PS2SDK: https://github.com/ps2dev/ps2sdk diff --git a/ee_core/src/gsm_engine.S b/ee_core/src/gsm_engine.S index 5b22288f7..9e71492d4 100755 --- a/ee_core/src/gsm_engine.S +++ b/ee_core/src/gsm_engine.S @@ -220,7 +220,7 @@ sb $a3, Interlace_FRAME_Mode_Flag($v0) // RC (Read Circuit) adaptation for avoiding garbage on screen ex.: Sega Genesis Collection (SLUS_215.42) la $v0, GSMAdapts -li $a0, 1 +li $a0, 1 # Enable RC_adaptation sb $a0, RC_adaptation($v0) //----------------------------------------------------------------------------------------- @@ -553,7 +553,7 @@ Skip_Call_Original_SetGsCrt: // Set Data Address Write Breakpoint // Trap writes to GS registers, so as to control their values -li $a0, 0x12000000 // Address base for trapping +li $a0, GS_BASE // Address base for trapping li $a1, 0x1FFFEF0F // Address mask for trapping //DOCTORXYZ // Trapping range is extended to match all kernel access segments @@ -596,56 +596,60 @@ addiu $sp, $sp, 0x0010 # Restore sp during return # When the processor takes a level 2 exception, the processor switches to # the kernel mode, by setting Status.ERL to 1. # +# Some parts has been taken from Toshiba's TX System RISC TX79 Core Architecture and PS2 Zone Loader's PNSelector +# +# $t0 = insn at ErrorEPC +# $t1 = rt +# $t2 = value in rt +# $t3 = base +# $t4 = address +# $t5 = address holding rt within array +# $t6 = address holding base within array +# $t7 = new value for rt +# + .globl GSHandler .ent GSHandler GSHandler: sync.l sync.p -sq $k0, -0x10($zero) # Store registers reserved for kernel -sq $k1, -0x20($zero) # usage in interrupt/trap handling - # Save all MIPS registers except zero($0) k0($26) and k1($27)) - # RA NB: NO!!! ALL registers are needed in this array, for evaluations - # RA NB: Even the $zero register is needed, as it may be used in conditionals - -la $k0, MIPS_Regs # Store MIPS_Regs via k0 -sq $zero, 0($k0) # $zero -sq $at, 0x10($k0) # at -sq $v0, 0x20($k0) # v0 -sq $v1, 0x30($k0) # v1 -sq $a0, 0x40($k0) # a0 -sq $a1, 0x50($k0) # a1 -sq $a2, 0x60($k0) # a2 -sq $a3, 0x70($k0) # a3 -sq $t0, 0x80($k0) -sq $t1, 0x90($k0) -sq $t2, 0xA0($k0) -sq $t3, 0xB0($k0) -sq $t4, 0xC0($k0) -sq $t5, 0xD0($k0) -sq $t6, 0xE0($k0) -sq $t7, 0xF0($k0) -sq $s0, 0x100($k0) -sq $s1, 0x110($k0) -sq $s2, 0x120($k0) -sq $s3, 0x130($k0) -sq $s4, 0x140($k0) -sq $s5, 0x150($k0) -sq $s6, 0x160($k0) -sq $s7, 0x170($k0) -sq $t8, 0x180($k0) -sq $t9, 0x190($k0) - # 0x1A0 must be set later, to initial $k0 value - # 0x1B0 must be set later, to initial $k1 value -sq $gp, 0x1C0($k0) -sq $sp, 0x1D0($k0) -sq $fp, 0x1E0($k0) -sq $ra, 0x1F0($k0) - -lq $t0, -0x10($zero) # t0 = entry k0 -lq $t1, -0x20($zero) # t1 = entry k1 -sq $t0, 0x1A0($k0) # store entry k0 in register array -sq $t1, 0x1B0($k0) # store entry k1 in register array - + +sq $k0, -0x10($zero) # Store $k1 register (reserved for kernel usage in interrupt and trap handling) +sq $k1, -0x20($zero) # Store $k1 register (reserved for kernel usage in interrupt and trap handling) +la $k0, MIPS_Regs # Store MIPS_Regs via $k0 +# sq $zero, 0x000($k0) +sq $at, 0x010($k0) +sq $v0, 0x020($k0) +sq $v1, 0x030($k0) +sq $a0, 0x040($k0) +sq $a1, 0x050($k0) +sq $a2, 0x060($k0) +sq $a3, 0x070($k0) +sq $t0, 0x080($k0) +sq $t1, 0x090($k0) +sq $t2, 0x0A0($k0) +sq $t3, 0x0B0($k0) +sq $t4, 0x0C0($k0) +sq $t5, 0x0D0($k0) +sq $t6, 0x0E0($k0) +sq $t7, 0x0F0($k0) +sq $s0, 0x100($k0) +sq $s1, 0x110($k0) +sq $s2, 0x120($k0) +sq $s3, 0x130($k0) +sq $s4, 0x140($k0) +sq $s5, 0x150($k0) +sq $s6, 0x160($k0) +sq $s7, 0x170($k0) +sq $t8, 0x180($k0) +sq $t9, 0x190($k0) +sq $k0, 0x1A0($k0) +sq $k1, 0x1B0($k0) +sq $gp, 0x1C0($k0) +sq $sp, 0x1D0($k0) +sq $fp, 0x1E0($k0) +sq $ra, 0x1F0($k0) + # # The read/write ErrorEPC register holds the virtual address at which instruction # processing can resume after servicing an error. This address can be: @@ -673,10 +677,10 @@ la $s0, GSMSourceGSRegs la $s1, GSMDestGSRegs la $s2, GSMFlags la $s3, GSMAdapts -li $s4,0xB2000000 # s4 = GS base address in KSEG1 +li $s4, GS_BASE -la $a2, MIPS_Regs # a2 -> MIPS_Regs -la $a3, op_t # a3 -> op_t +la $a2, MIPS_Regs # Locate MIPS_Regs via $a2 +la $a3, op_t # a3 -> op_t addu $a0,$v1,$a3 # a0 -> active entry in op_t lw $a1,0($a0) # a1 = opcode handler from op_t @@ -804,22 +808,19 @@ nop # | ALP | 15:8 | int 0:8:0 | Fixed Alpha Value (0xff = 1.0) | 0xFF | # '-------^------^-------------^---------------------------------------------^------^ have_PMODE_write: -lui $v0,0xB200 # v0 = GS base address in KSEG1 -andi $a3,$a3,0xFFFF # a3 = GS register offset -or $a3,$a3,$v0 # a3 = GS register address in KSEG1 -sd $a1, Source_PMODE($s0) # Source_PMODE = a1 -lb $v0, PMODE_fix($s2) # v0 = PMODE_fix -beql $v0,$zero,store_v0_as_PMODE # in case of PMODE_fix is disabled -or $v0,$zero,$a1 # go use v0=a1 for PMODE -ld $v0, Target_PMODE($s1) # v0 = Target_PMODE -beql $v0,$zero,exit_GSHandler # in case of Target_PMODE is zero -sd $a1,0($a3) # go use Source_PMODE +sd $a1, Source_PMODE($s0) # Source_PMODE = a1 +lb $v0, PMODE_fix($s2) # v0 = PMODE_fix +beql $v0,$zero,store_v0_as_PMODE # in case of PMODE_fix is disabled +or $v0,$zero,$a1 # go use Source_PMODE +ld $v0, Target_PMODE($s1) # v0 = Target_PMODE +beql $v0,$zero,store_v0_as_PMODE # in case of Target_PMODE is zero +or $v0,$zero,$a1 # go use Source_PMODE store_v0_as_PMODE: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt beqzl $zero,exit_GSHandler # Now go exit -sd $v0,0($a3) # after storing +sd $v0,0($a3) # after storing # ---------------------------- # SMODE1 @@ -887,9 +888,6 @@ sd $v0,0($a3) # after storing # An older GS rev. seems to require setting bit 16 and then reseting bit 16 and then waiting for 2.5ms. # have_SMODE1_write: -lui $v0,0xB200 # v0 = GS base address in KSEG1 -andi $a3,$a3,0xFFFF # a3 = GS register offset -or $a3,$a3,$v0 # a3 = GS register address in KSEG1 sd $a1, Source_SMODE1($s0) # Source_SMODE1 = a1 lb $v0, SMODE1_fix($s2) # v0 = SMODE1_fix beql $v0,$zero,store_v0_as_SMODE1 # in case of SMODE1_fix is disabled @@ -920,13 +918,11 @@ sd $v0,0($a3) # after storing # | | | |01 Stand-by 11 Off | # ^----^---^---------^-----------------------------------. have_SMODE2_write: -lui $v0,0xB200 # v0 = GS base address in KSEG1 -andi $a3,$a3,0xFFFF # a3 = GS register offset -or $a3,$a3,$v0 # a3 = GS register address in KSEG1 sd $a1, Source_SMODE2($s0) # Source_SMODE2 = a1 lb $v0, SMODE2_fix($s2) # v0 = SMODE2_fix beql $v0,$zero,store_v0_as_SMODE2 # in case of Separate SMODE2 fix disabled -or $v0,$zero,$a1 # go use v0=a1 for SMODE2 +or $v0,$zero,$a1 # go use Source_SMODE2 + srl $v0,$a1,1 # v0 = a1 aligned for FFMD in bit0 and $v0,$v0,$a1 # v0 bit 0 = INT & FFMD andi $v0,$v0,1 # v0 bit 0 = INT & FFMD isolated @@ -937,6 +933,7 @@ ld $v0, Target_SMODE2($s1) # go use Target_SMODE2 as adapted SMode2 andi $a1,$a1,2 # a1 = FFMD of Source_SMODE2 andi $v0,$v0,0xFFFD # v0 = Target_SMODE2 without FFMD or $v0,$v0,$a1 # v0 = Target_SMODE2 + Source FFMD + store_v0_as_SMODE2: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt @@ -969,9 +966,6 @@ sd $v0,0($a3) # after storing # DTV-720P (1280x720) 4 1 # have_SRFSH_write: -lui $v0,0xB200 # v0 = GS base address in KSEG1 -andi $a3,$a3,0xFFFF # a3 = GS register offset -or $a3,$a3,$v0 # a3 = GS register address in KSEG1 sd $a1, Source_SRFSH($s0) # Source_SRFSH = a1 lb $v0, SRFSH_fix($s2) # v0 = SRFSH_fix beql $v0,$zero,store_v0_as_SRFSH # in case of SRFSH_fix is disabled @@ -998,9 +992,6 @@ sd $v0,0($a3) # after storing #|HS |53:43|int 0:11:0| 0x7FF | # ----^-----^----------^-------' have_SYNCH1_write: -lui $v0,0xB200 # v0 = GS base address in KSEG1 -andi $a3,$a3,0xFFFF # a3 = GS register offset -or $a3,$a3,$v0 # a3 = GS register address in KSEG1 sd $a1, Source_SYNCH1($s0) # Source_SYNCH1 = a1 lb $v0, SYNCH_fix($s2) # v0 = SYNCH_fix beql $v0,$zero,store_v0_as_SYNCH1 # in case of SYNCH_fix is disabled @@ -1024,9 +1015,6 @@ sd $v0,0($a3) # after storing #|HB |21:11|int 0:11:0| 0x7FF | #'----^-----^----------^-------' have_SYNCH2_write: -lui $v0,0xB200 # v0 = GS base address in KSEG1 -andi $a3,$a3,0xFFFF # a3 = GS register offset -or $a3,$a3,$v0 # a3 = GS register address in KSEG1 sd $a1, Source_SYNCH2($s0) # Source_SYNCH2 = a1 lb $v0, SYNCH_fix($s2) # v0 = SYNCH_fix beql $v0,$zero,store_v0_as_SYNCH2 # in case of SYNCH_fix is disabled @@ -1054,9 +1042,6 @@ sd $v0,0($a3) # after storing # |VS |56:53|int 0:04:0| 0xF | # '----^-----^----------^-------' have_SYNCV_write: -lui $v0,0xB200 # v0 = GS base address in KSEG1 -andi $a3,$a3,0xFFFF # a3 = GS register offset -or $a3,$a3,$v0 # a3 = GS register address in KSEG1 sd $a1, Source_SYNCV($s0) # Source_SYNCV = a1 lb $v0, SYNCV_fix($s2) # v0 = SYNCV_fix beql $v0,$zero,store_v0_as_SYNCV # in case of SYNCV_fix is disabled @@ -1091,9 +1076,6 @@ sd $v0,0($a3) # after storing # | | | | Rectangular Area (in units of pixels) | | # '-------^------^-------------^---------------------------------------------^--------^ have_DISPFB1_write: -lui $v0,0xB200 # v0 = GS base address in KSEG1 -andi $a3,$a3,0xFFFF # a3 = GS register offset -or $a3,$a3,$v0 # a3 = GS register address in KSEG1 sd $a1, Source_DISPFB1($s0) # Source_DISPFB1 = a1 lb $v0, DISPFB_fix($s2) # v0 = DISPFB_fix beql $v0,$zero,store_v0_as_DISPFB1 # in case of DISPFB_fix is disabled @@ -1128,9 +1110,6 @@ sd $v0,0($a3) # after storing # | | | | Rectangular Area (in units of pixels) | | # '-------^------^-------------^---------------------------------------------^--------^ have_DISPFB2_write: -lui $v0,0xB200 # v0 = GS base address in KSEG1 -andi $a3,$a3,0xFFFF # a3 = GS register offset -or $a3,$a3,$v0 # a3 = GS register address in KSEG1 sd $a1, Source_DISPFB2($s0) # Source_DISPFB2 = a1 lb $v0, DISPFB_fix($s2) # v0 = DISPFB_fix beql $v0,$zero,store_v0_as_DISPFB2 # in case of DISPFB_fix is disabled @@ -1149,9 +1128,6 @@ sd $v0,0($a3) # after storing # DISPLAY1 # have_DISPLAY1_write: # Here a1=source_data, a2->.gsm_engine, a3=dest_adress -lui $v0,0xB200 # v0 = GS base address in KSEG1 -andi $a3,$a3,0xFFFF # a3 = GS register offset -or $a3,$a3,$v0 # a3 = GS register address in KSEG1 sd $a1, Source_DISPLAY1($s0) # request DISPLAY1 value = a1 ld $v1, Target_DISPLAY1($s1) # v1=forcing DISPLAY1 template @@ -1384,16 +1360,13 @@ ld $v0, Target_DISPLAY1($s1) # use forced mode without adaption store_v0_as_DISPLAY1: sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt -beqzl $zero,exit_GSHandler_complex # Now go exit (complex) +beqzl $zero,exit_GSHandler # Now go exit sd $v0,0($a3) # after storing # ---------------------------- # DISPLAY2 # have_DISPLAY2_write: # Here a1=source_data, a2->.gsm_engine, a3=dest_adress -lui $v0,0xB200 # v0 = GS base address in KSEG1 -andi $a3,$a3,0xFFFF # a3 = GS register offset -or $a3,$a3,$v0 # a3 = GS register address in KSEG1 sd $a1, Source_DISPLAY2($s0) # request DISPLAY2 value = a1 ld $v1, Target_DISPLAY2($s1) # v1=forcing DISPLAY2 template @@ -1631,54 +1604,54 @@ sd $v0,0($a3) # store DISPLAY2 # ------------------------------------------------------------------------------------------------------ lb $a1, RC_adaptation($s3) -beqzl $a1,exit_GSHandler_complex # in case of RC_adaptation is disabled, go exit (complex) +beqzl $a1,exit_GSHandler # in case of RC_adaptation is disabled, go exit nop sync.l # The addition of these two lines (sync.l and sync.p) made a lot of titles compatible with GSM! sync.p # These ones give a break to ee take a breath after patching and before enter original SetGsCrt sd $zero, GS_DISPLAY1($s4) # DISPLAY1 should never be displayed on this scenario (in order to avoid garbage on screen) -beqzl $zero,exit_GSHandler_complex +beqzl $zero,exit_GSHandler sb $zero, RC_adaptation($s3) # Disable RC_adaptation, since this patch should be applied only once, each time Hook_SetGsCrt is called. # Sega Genesis Collection (SLUS_215.42) doesn't repeatedly write to GS Priviledge Registers, but God of War I (SCUS_973.99) does this! # ------------------------------------------------------------------------------------------------------ -exit_GSHandler_complex: - -#li $v0, 0xFFFFFF # White -#sd $v0, GS_BGCOLOUR($s4) # Change BGCOLOR (for debugging purposes) - -# ----- Here we restore some registers, used for complex calculations above -lq $t2, 0xA0($a2) # t2 -lq $t3, 0xB0($a2) # t3 -lq $t4, 0xC0($a2) # t4 -lq $t5, 0xD0($a2) # t5 -lq $t6, 0xE0($a2) # t6 -lq $t7, 0xF0($a2) # t7 - exit_GSHandler: -# ----- Here we restore most registers used for all GSHandler traps -# ----- Since only a few registers are used this way we only restore those -la $k0, MIPS_Regs # Restore MIPS_Regs via k0 -lq $at, 0x10($k0) # at -lq $v0, 0x20($k0) # v0 -lq $v1, 0x30($k0) # v1 -lq $a0, 0x40($k0) # a0 -lq $a1, 0x50($k0) # a1 -lq $a2, 0x60($k0) # a2 -lq $a3, 0x70($k0) # a3 -lq $s0, 0x100($k0) -lq $s1, 0x110($k0) -lq $s2, 0x120($k0) -lq $s3, 0x130($k0) -lq $s4, 0x140($k0) -lq $s5, 0x150($k0) -lq $s6, 0x160($k0) -lq $s7, 0x170($k0) -lq $t8, 0x180($k0) -lq $t9, 0x190($k0) - -# Past this point in GSHandler, use only k0,k1,t0,t1 +la $k0, MIPS_Regs # Restore MIPS_Regs via $k0 +# lq $zero, 0x000($k0) +lq $at, 0x010($k0) +lq $v0, 0x020($k0) +lq $v1, 0x030($k0) +lq $a0, 0x040($k0) +lq $a1, 0x050($k0) +lq $a2, 0x060($k0) +lq $a3, 0x070($k0) +# lq $t0, 0x080($k0) +# lq $t1, 0x090($k0) +lq $t2, 0x0A0($k0) +lq $t3, 0x0B0($k0) +lq $t4, 0x0C0($k0) +lq $t5, 0x0D0($k0) +lq $t6, 0x0E0($k0) +lq $t7, 0x0F0($k0) +lq $s0, 0x100($k0) +lq $s1, 0x110($k0) +lq $s2, 0x120($k0) +lq $s3, 0x130($k0) +lq $s4, 0x140($k0) +lq $s5, 0x150($k0) +lq $s6, 0x160($k0) +lq $s7, 0x170($k0) +lq $t8, 0x180($k0) +lq $t9, 0x190($k0) +# lq $k0, 0x1A0($k0) +# lq $k1, 0x1B0($k0) +# lq $gp, 0x1C0($k0) +# lq $sp, 0x1D0($k0) +# lq $fp, 0x1E0($k0) +# lq $ra, 0x1F0($k0) + +# WARNING: Past this point in GSHandler, use should only $k0,$k1,$t0,$t1 mfc0 $k0, $13 # k0 = Cause of last exception srl $k0, 30 # BD2 Flags debug exception in branch delay slot. @@ -1691,7 +1664,7 @@ nop mfc0 $k0,$30 # k0 = ErrorEPC addiu $k0,$k0,4 # k0 = ErrorEPC+4 (-> next opcode) mtc0 $k0,$30 # store k0 in Error Exception Program Counter -#sync # ensure COP0 register update before proceeding +sync # ensure COP0 register update before proceeding b GSHandler_Final_Exit nop @@ -1747,7 +1720,7 @@ la $t0,MIPS_Regs # t0 -> saved register array addu $t0,$t1 # t0 -> register data of JR/JALR rs register lw $t0,0($t0) # t0 = jump destination address mtc0 $t0,$30 # store t0 in Error Exception Program Counter -# sync # ensure COP0 register update before proceeding +sync # ensure COP0 register update before proceeding b GSHandler_Final_Exit nop @@ -1760,7 +1733,7 @@ li $t0, 0x3FFFFFF # t0 = bitmask for jump destination bits and $k1, $k0, $t0 # k1 = destination bits (== destination/4) sll $t0, $k1, 2 # t0 = jump destination address mtc0 $t0, $30 # store t0 in Error Exception Program Counter -#sync # ensure COP0 register update before proceeding +sync # ensure COP0 register update before proceeding b GSHandler_Final_Exit nop @@ -1785,7 +1758,7 @@ mfc0 $t0, $30 # t0 = Error Exception Program Counter addiu $t0, 4 # t0 = ErrorEPC+4 (-> address after branch op) addu $t0, $k1 # t0 = jump destination address mtc0 $t0, $30 # store t0 in Error Exception Program Counter -#sync # ensure COP0 register update before proceeding +sync # ensure COP0 register update before proceeding b GSHandler_Final_Exit nop @@ -1798,7 +1771,7 @@ sll $t1,$k1, 4 # t1 = array index for saved register data la $t0,MIPS_Regs # t0 -> saved register array addu $t0,$t1 # t0 -> register data of rs register lq $t1,0($t0) # t1 = rs register data -#sync +sync bltz $t1,B_taken nop @@ -1806,7 +1779,7 @@ B_not_taken: mfc0 $k0,$30 # k0 = ErrorEPC addiu $k0,$k0,8 # k0 = ErrorEPC+8 pass branch_op and delay_slot mtc0 $k0,$30 # store k0 in Error Exception Program Counter -#sync # ensure COP0 register update before proceeding +sync # ensure COP0 register update before proceeding b GSHandler_Final_Exit nop @@ -1819,7 +1792,7 @@ sll $t1,$k1, 4 # t1 = array index for saved register data la $t0,MIPS_Regs # t0 -> saved register array addu $t0,$t1 # t0 -> register data of rs register lq $t1,0($t0) # t1 = rs register data -#sync +sync bgez $t1,B_taken nop b B_not_taken @@ -1833,7 +1806,7 @@ sll $t1,$k1, 4 # t1 = array index for saved register data la $t0,MIPS_Regs # t0 -> saved register array addu $t0,$t1 # t0 -> register data of rs register lq $t1,0($t0) # t1 = rs register data -#sync +sync blez $t1,B_taken nop b B_not_taken @@ -1847,7 +1820,7 @@ sll $t1,$k1, 4 # t1 = array index for saved register data la $t0,MIPS_Regs # t0 -> saved register array addu $t0,$t1 # t0 -> register data of rs register lq $t1,0($t0) # t1 = rs register data -#sync +sync bgtz $t1,B_taken nop b B_not_taken @@ -1861,13 +1834,13 @@ sll $k1,$k1, 4 # k1 = array index for saved rs register data la $t0,MIPS_Regs # t0 -> saved register array addu $k1,$t0 # k1 -> register data of rs register lq $t1,0($k1) # t1 = rs register data -#sync +sync srl $k1,$k0, 16 # k1 = aligned for rt register number andi $k1,0x1F # k1 = rt register number sll $k1,$k1, 4 # k1 = array index for saved rt register data addu $k1,$t0 # k1 -> register data of rt register lq $t0,0($k1) # t0 = rt register data -#sync +sync beq $t0,$t1,B_taken nop b B_not_taken @@ -1881,13 +1854,13 @@ sll $k1,$k1, 4 # k1 = array index for saved rs register data la $t0,MIPS_Regs # t0 -> saved register array addu $k1,$t0 # k1 -> register data of rs register lq $t1,0($k1) # t1 = rs register data -#sync +sync srl $k1,$k0, 16 # k1 = aligned for rt register number andi $k1,0x1F # k1 = rt register number sll $k1,$k1, 4 # k1 = array index for saved rt register data addu $k1,$t0 # k1 -> register data of rt register lq $t0,0($k1) # t0 = rt register data -#sync +sync bne $t0,$t1,B_taken nop b B_not_taken @@ -1900,20 +1873,19 @@ B_skip: # Unrecognized opcode, so just pass it by mfc0 $k0, $30 # k0 = ErrorEPC addiu $k0, $k0, 4 # k0 = ErrorEPC+4 (-> next opcode) mtc0 $k0, $30 # store k0 in Error Exception Program Counter -#sync # ensure COP0 register update before proceeding +sync # ensure COP0 register update before proceeding GSHandler_Final_Exit: -la $k0, MIPS_Regs # k0 -> .gsm_engine -lq $t0, 0x80($k0) # t0 -lq $t1, 0x90($k0) # t1 - -#mfc0 $k0, $12 # Set user mode, interrupts on -#ori $k0, $k0, 0x11 -#mtc0 $k0, $12 -#sync +la $k0, MIPS_Regs # Restore MIPS_Regs via $k0 +lq $t0, 0x080($k0) +lq $t1, 0x090($k0) +lq $gp, 0x1C0($k0) +lq $sp, 0x1D0($k0) +lq $fp, 0x1E0($k0) +lq $ra, 0x1F0($k0) +lq $k0, -0x10($zero) # Restore $k1 register (reserved for kernel usage in interrupt and trap handling) +lq $k1, -0x20($zero) # Restore $k1 register (reserved for kernel usage in interrupt and trap handling) -lq $k0, -0x10($zero) # Restore k0,k1 reserved for OS Kernel -lq $k1, -0x20($zero) sync.p sync.l eret # Return from exception diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 4ff4fd92d..46342fc62 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,5 +1,5 @@ # translated by verislasher -# Last update: 10/23/2016 +# Last update: 10/26/2016 # Updated for OPL_r963_DB [b7e6f26] # official thread: http://ps2home.freeforums.net/post/1966/thread Indonesian @@ -113,7 +113,7 @@ Tinggalkan kosong untuk Otent TAMU. Membaca akurat Mode Sinkronisasi Melepas kaitan syscalls -Loncat Video +Lewati video Emulasi DVD-DL Nonaktifkan IGR Mode Penyimpanan Tinggi diff --git a/modules/iopcore/imgdrv/imgdrv.c b/modules/iopcore/imgdrv/imgdrv.c index 93b8bbbe1..9f3af7c12 100644 --- a/modules/iopcore/imgdrv/imgdrv.c +++ b/modules/iopcore/imgdrv/imgdrv.c @@ -57,7 +57,7 @@ iop_device_ops_t my_device_ops = read_fs, //read NULL, //dummy_fs,//write lseek_fs, //lseek - /*dummy_fs,//ioctl + /*dummy_fs,//ioctl dummy_fs,//remove dummy_fs,//mkdir dummy_fs,//rmdir diff --git a/modules/network/SMSTCPIP/sockets.c b/modules/network/SMSTCPIP/sockets.c index 0b6d0c41f..36012cc40 100644 --- a/modules/network/SMSTCPIP/sockets.c +++ b/modules/network/SMSTCPIP/sockets.c @@ -1071,7 +1071,7 @@ int lwip_getsockopt(int s, int level, int optname, void *optval, socklen_t *optl #ifdef SO_REUSE case SO_REUSEADDR: case SO_REUSEPORT: -#endif /* SO_REUSE */ +#endif /* SO_REUSE */ /*case SO_USELOOPBACK: UNIMPL */ *(int *)optval = sock->conn->pcb.tcp->so_options & optname; LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, optname=0x%x, ..) = %s\n", s, optname, (*(int *)optval ? "on" : "off"))); @@ -1182,7 +1182,7 @@ int lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t #ifdef SO_REUSE case SO_REUSEADDR: case SO_REUSEPORT: -#endif /* SO_REUSE */ +#endif /* SO_REUSE */ /* UNIMPL case SO_USELOOPBACK: */ if (optlen < sizeof(int)) { err = EINVAL; @@ -1267,7 +1267,7 @@ int lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t #ifdef SO_REUSE case SO_REUSEADDR: case SO_REUSEPORT: -#endif /* SO_REUSE */ +#endif /* SO_REUSE */ /* UNIMPL case SO_USELOOPBACK: */ if (*(int *)optval) { sock->conn->pcb.tcp->so_options |= optname; diff --git a/src/dialogs.c b/src/dialogs.c index 1b1567cd2..a0456ff0a 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -19,6 +19,7 @@ struct UIItem diaNetConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_ETH_OPMODE}}}, {UI_SPACER}, {UI_ENUM, NETCFG_ETHOPMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, + {UI_SPLITTER}, {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_CAT_PS2}}}, @@ -127,8 +128,7 @@ struct UIItem diaNetConfig[] = { {UI_BREAK}, // end of dialog - {UI_TERMINATOR} -}; + {UI_TERMINATOR}}; // Per-Game Settings struct UIItem diaCompatConfig[] = { @@ -140,19 +140,19 @@ struct UIItem diaCompatConfig[] = { {UI_LABEL, COMPAT_STATUS, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE1}}}, {UI_SPACER}, - {UI_BOOL, COMPAT_MODE_BASE , 1, 1, _STR_HINT_MODE1, -10, 0, {.intvalue = {0, 0}}}, + {UI_BOOL, COMPAT_MODE_BASE, 1, 1, _STR_HINT_MODE1, -10, 0, {.intvalue = {0, 0}}}, {UI_SPACER}, {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE2}}}, {UI_SPACER}, {UI_BOOL, COMPAT_MODE_BASE + 1, 1, 1, _STR_HINT_MODE2, -10, 0, {.intvalue = {0, 0}}}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE3}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE3}}}, {UI_SPACER}, {UI_BOOL, COMPAT_MODE_BASE + 2, 1, 1, _STR_HINT_MODE3, -10, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, - + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE4}}}, {UI_SPACER}, {UI_BOOL, COMPAT_MODE_BASE + 3, 1, 1, _STR_HINT_MODE4, -10, 0, {.intvalue = {0, 0}}}, @@ -163,14 +163,14 @@ struct UIItem diaCompatConfig[] = { {UI_SPACER}, {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE6}}}, {UI_SPACER}, - {UI_BOOL, COMPAT_MODE_BASE + 5, 1, 1, _STR_HINT_MODE6, -10, 0, {.intvalue = {0, 0}}}, + {UI_BOOL, COMPAT_MODE_BASE + 5, 1, 1, _STR_HINT_MODE6, -10, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE7}}}, {UI_SPACER}, {UI_BOOL, COMPAT_MODE_BASE + 6, 1, 1, _STR_HINT_MODE7, -10, 0, {.intvalue = {0, 0}}}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE8}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MODE8}}}, {UI_SPACER}, {UI_BOOL, COMPAT_MODE_BASE + 7, 1, 1, _STR_HINT_MODE8, -10, 0, {.intvalue = {0, 0}}}, {UI_SPLITTER}, @@ -202,7 +202,6 @@ struct UIItem diaCompatConfig[] = { {UI_BUTTON, COMPAT_VMC1_DEFINE, 0, 1, -1, 0, 0, {.label = {NULL, -1}}}, #endif {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_VMC_SLOT2}}}, {UI_SPACER}, #ifndef __CHILDPROOF @@ -221,27 +220,39 @@ struct UIItem diaCompatConfig[] = { {UI_SPACER}, {UI_BUTTON, COMPAT_LOADFROMDISC, 1, 1, -1, 0, 0, {.label = {NULL, _STR_LOAD_FROM_DISC}}}, {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_ALTSTARTUP}}}, {UI_SPACER}, {UI_STRING, COMPAT_ALTSTARTUP, 1, 1, -1, 0, 0, {.stringvalue = {"", "", &guiAltStartupNameHandler}}}, {UI_SPLITTER}, - // buttons - {UI_BUTTON, COMPAT_TEST, 1, 1, -1, -30, 0, {.label = {NULL, _STR_TEST}}}, +// buttons #ifndef __CHILDPROOF + + {UI_BUTTON, COMPAT_SAVE, 1, 1, -1, 0, 0, {.label = {NULL, _STR_SAVE_CHANGES}}}, {UI_SPACER}, - {UI_BUTTON, COMPAT_DL_DEFAULTS, 1, 1, -1, 0, 0, {.label = {NULL, _STR_DL_DEFAULTS}}}, - {UI_BREAK}, - {UI_BUTTON, COMPAT_SAVE, 1, 1, -1, -30, 0, {.label = {NULL, _STR_SAVE_CHANGES}}}, +#endif + + {UI_BUTTON, COMPAT_TEST, 1, 1, -1, 0, 0, {.label = {NULL, _STR_TEST}}}, + +#ifndef __CHILDPROOF + {UI_SPACER}, - {UI_BUTTON, COMPAT_REMOVE, 1, 1, -1, 0, 0, {.label = {NULL, _STR_REMOVE_ALL_SETTINGS}}}, + {UI_BUTTON, COMPAT_DL_DEFAULTS, 1, 1, -1, 0, 0, {.label = {NULL, _STR_DL_DEFAULTS}}}, + #endif {UI_BREAK}, + {UI_BREAK}, + +#ifndef __CHILDPROOF + + {UI_BUTTON, COMPAT_REMOVE, 1, 1, -1, 0, 0, {.label = {NULL, _STR_REMOVE_ALL_SETTINGS}}}, + +#endif // end of dialog - {UI_TERMINATOR} -}; + {UI_TERMINATOR}}; // Settings Menu struct UIItem diaConfig[] = { @@ -337,8 +348,7 @@ struct UIItem diaConfig[] = { {UI_BREAK}, // end of dialog - {UI_TERMINATOR} -}; + {UI_TERMINATOR}}; // Display Settings Menu struct UIItem diaUIConfig[] = { @@ -380,24 +390,22 @@ struct UIItem diaUIConfig[] = { {UI_BOOL, UICFG_INFOPAGE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, {UI_SPLITTER}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_TXTCOLOR}}}, + {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_TXTCOLOR}}}, {UI_SPACER}, - {UI_COLOUR, UICFG_TXTCOL, 1, 1, -1, 0, 0, {.colourvalue = {0, 0}}}, - {UI_BREAK}, - - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_SELCOLOR}}}, + {UI_COLOUR, UICFG_TXTCOL, 1, 1, -1, -10, 17, {.colourvalue = {0, 0}}}, {UI_SPACER}, - {UI_COLOUR, UICFG_SELCOL, 1, 1, -1, 0, 0, {.colourvalue = {0, 0}}}, - {UI_BREAK}, - - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_UICOLOR}}}, + {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_SELCOLOR}}}, {UI_SPACER}, - {UI_COLOUR, UICFG_UICOL, 1, 1, -1, 0, 0, {.colourvalue = {0, 0}}}, + {UI_COLOUR, UICFG_SELCOL, 1, 1, -1, -10, 17, {.colourvalue = {0, 0}}}, {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_BGCOLOR}}}, + {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_UICOLOR}}}, + {UI_SPACER}, + {UI_COLOUR, UICFG_UICOL, 1, 1, -1, -10, 17, {.colourvalue = {0, 0}}}, {UI_SPACER}, - {UI_COLOUR, UICFG_BGCOL, 1, 1, -1, 0, 0, {.colourvalue = {0, 0}}}, + {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_BGCOLOR}}}, + {UI_SPACER}, + {UI_COLOUR, UICFG_BGCOL, 1, 1, -1, -10, 17, {.colourvalue = {0, 0}}}, {UI_SPLITTER}, {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_VMODE}}}, @@ -415,8 +423,7 @@ struct UIItem diaUIConfig[] = { {UI_BREAK}, // end of dialog - {UI_TERMINATOR} -}; + {UI_TERMINATOR}}; // Per-Game Game Settings > GSM Menu (--Bat--) #ifdef GSM @@ -449,8 +456,7 @@ struct UIItem diaGSConfig[] = { {UI_BREAK}, // end of dialog - {UI_TERMINATOR} -}; + {UI_TERMINATOR}}; #endif // Per Game Settings > Cheat Menu --Bat-- @@ -474,13 +480,13 @@ struct UIItem diaCheatConfig[] = { {UI_BREAK}, // end of dialog - {UI_TERMINATOR} -}; + {UI_TERMINATOR}}; #endif // About Menu struct UIItem diaAbout[] = { {UI_LABEL, 1, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, + {UI_BREAK}, {UI_SPLITTER}, // Coders @@ -497,6 +503,7 @@ struct UIItem diaAbout[] = { {UI_SPACER}, {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"... and the anonymous ...", -1}}}, + {UI_BREAK}, {UI_SPLITTER}, // Quality Assurance @@ -509,6 +516,7 @@ struct UIItem diaAbout[] = { {UI_SPACER}, {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"ShaolinAssassin, yoshi314 and zero35", -1}}}, + {UI_BREAK}, {UI_SPLITTER}, // Network update @@ -524,8 +532,7 @@ struct UIItem diaAbout[] = { {UI_BREAK}, // end of dialog - {UI_TERMINATOR} -}; + {UI_TERMINATOR}}; // Per-Game Game Settings > VMC Menu #ifdef VMC @@ -533,22 +540,22 @@ struct UIItem diaVMC[] = { {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_VMC_SCREEN}}}, {UI_SPLITTER}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_VMC_NAME}}}, + {UI_LABEL, 0, 1, 1, -1, -20, 0, {.label = {NULL, _STR_VMC_NAME}}}, {UI_SPACER}, {UI_STRING, VMC_NAME, 1, 1, -1, 0, 0, {.stringvalue = {"", "", &guiVmcNameHandler}}}, {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_VMC_SIZE}}}, + {UI_LABEL, 0, 1, 1, -1, -20, 0, {.label = {NULL, _STR_VMC_SIZE}}}, {UI_SPACER}, {UI_ENUM, VMC_SIZE, 1, 1, _STR_HINT_VMC_SIZE, 0, 0, {.intvalue = {0, 0}}}, {UI_SPLITTER}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_VMC_STATUS}}}, + {UI_LABEL, 0, 1, 1, -1, -20, 0, {.label = {NULL, _STR_VMC_STATUS}}}, {UI_SPACER}, {UI_LABEL, VMC_STATUS, 0, 1, -1, 0, 0, {.label = {NULL, -1}}}, {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_VMC_PROGRESS}}}, + {UI_LABEL, 0, 1, 1, -1, -20, 0, {.label = {NULL, _STR_VMC_PROGRESS}}}, {UI_SPACER}, {UI_INT, VMC_PROGRESS, 0, 1, -1, 0, 0, {.intvalue = {0, 0, 0, 100}}}, {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {"%", -1}}}, @@ -561,8 +568,7 @@ struct UIItem diaVMC[] = { {UI_BREAK}, // end of dialog - {UI_TERMINATOR} -}; + {UI_TERMINATOR}}; #endif // Network Update Menu @@ -573,7 +579,7 @@ struct UIItem diaNetCompatUpdate[] = { {UI_LABEL, NETUPD_OPT_UPD_ALL_LBL, 1, 1, -1, -40, 0, {.label = {NULL, _STR_NET_UPDATE_ALL}}}, {UI_SPACER}, {UI_BOOL, NETUPD_OPT_UPD_ALL, 0, 1, -1, 0, 0, {.intvalue = {0, 0, 0, 1}}}, - {UI_SPLITTER}, + {UI_BREAK}, {UI_LABEL, NETUPD_PROGRESS_LBL, 1, 1, -1, -40, 0, {.label = {NULL, _STR_VMC_PROGRESS}}}, {UI_SPACER}, @@ -588,5 +594,4 @@ struct UIItem diaNetCompatUpdate[] = { {UI_BREAK}, // end of dialog - {UI_TERMINATOR} -}; + {UI_TERMINATOR}}; diff --git a/src/ethsupport.c b/src/ethsupport.c index c2a3efa8d..e7aa17881 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -487,10 +487,10 @@ static int ethUpdateGameList(void) { int result; - if (gNetworkStartup != 0) - return 0; - if (gPCShareName[0]) { + if (gNetworkStartup != 0) + return 0; + if ((result = sbReadList(ðGames, ethPrefix, ðULSizePrev, ðGameCount)) < 0) { gNetworkStartup = ERROR_ETH_SMB_LISTGAMES; ethDisplayErrorStatus(); @@ -499,6 +499,10 @@ static int ethUpdateGameList(void) int i, count; ShareEntry_t sharelist[128]; smbGetShareList_in_t getsharelist; + + if (gNetworkStartup < ERROR_ETH_SMB_OPENSHARE) + return 0; + getsharelist.EE_addr = (void *)&sharelist[0]; getsharelist.maxent = 128; diff --git a/src/gui.c b/src/gui.c index 35dbe1e71..cd3963f4e 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1099,8 +1099,8 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_GSMYOFFSET); #endif #ifdef CHEAT - configRemoveKey(configSet, CONFIG_ITEM_ENABLECHEAT); - configRemoveKey(configSet, CONFIG_ITEM_CHEATMODE); + configRemoveKey(configSet, CONFIG_ITEM_ENABLECHEAT); + configRemoveKey(configSet, CONFIG_ITEM_CHEATMODE); #endif #ifdef VMC configRemoveVMC(configSet, 0); diff --git a/src/lang.c b/src/lang.c index 63b5667b0..a0cde0303 100644 --- a/src/lang.c +++ b/src/lang.c @@ -12,7 +12,7 @@ // Language support static char *internalEnglish[LANG_STR_COUNT] = { "English (internal)", - "Open PS2 Loader %s", + "OPL %s", "Save changes", "Back", "Network config", From 2e36ae3265e50a09c1fe556d0550b21f3215136e Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 23 Nov 2016 20:49:41 -0800 Subject: [PATCH 013/269] Optimized makefiles. (#24) * Optimized makefiles. Synced with mainstream ps2sdk: * Clear USB Mass Storage Device status to 0 at initialization-time (8997094) * Changed UsbMassRegisterCallback to call the callback once if a device is connected (cf385c0) * Test travis * Test travis 2 --- .travis.yml | 26 +--- DETAILED_CHANGELOG | 1 + Makefile | 237 +++++++++++++++--------------- ee_core/Makefile | 23 +-- modules/dev9/dev9.h | 6 +- modules/usb/usbhdfsd/fat_driver.c | 5 +- modules/usb/usbhdfsd/fat_write.h | 2 +- modules/usb/usbhdfsd/usb_driver.c | 8 +- 8 files changed, 152 insertions(+), 156 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d4b50f66..d492b79fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,36 +9,26 @@ sudo: required language: c +services: + - docker + before_install: ## Save current dir, go to previous dir and save it too - export opl_build_dir=$(pwd) - cd ../ - export travis_build_dir=$(pwd) -install: -## OPL Building Dependencies -- sudo apt-get install -yqq gcc-4.4 patch wget make git libc6-dev zlib1g zlib1g-dev libucl1 libucl-dev - before_script: ## Make cleanup, just for prevent anything - cd ${travis_build_dir}/ -- rm -rf gsKit/ ps2eth/ ps2toolchain/ ps2-packer/ ps2sdk-ports/ +- rm -rf gsKit/ ps2eth/ ps2-packer/ ps2sdk-ports/ ## Set up the environment. -- export PS2DEV=${travis_build_dir}/ps2dev -- export PS2SDK=${PS2DEV}/ps2sdk -- export PATH=${PATH}:${PS2DEV}/bin:${PS2DEV}/ee/bin:${PS2DEV}/iop/bin:${PS2DEV}/dvp/bin:${PS2SDK}/bin - export PS2ETH=${PS2DEV}/ps2eth - export GSKIT=${PS2DEV}/gsKit - export LANG=C - export LC_ALL=C -## ps2dev/PS2Toolchain -- cd ${travis_build_dir}/ -- git clone --quiet https://github.com/ps2dev/ps2toolchain.git ${travis_build_dir}/ps2toolchain/ -- cd ${travis_build_dir}/ps2toolchain/ -- ./toolchain.sh - ## ps2dev/PS2SDKPorts - cd ${travis_build_dir}/ - git clone --quiet https://github.com/ps2dev/ps2sdk-ports.git ${travis_build_dir}/ps2sdk-ports/ @@ -86,14 +76,10 @@ before_script: script: ## Let's build Open PS2 Loader Release! -- cd ${opl_build_dir}/ -- . make_changelog.sh -- git add DETAILED_CHANGELOG -- make clean -- make release +- docker run -it --rm -v ${opl_build_dir}/ mlafeldt/ps2dev make ## Build Lang Pack and Latest Changelog -- . lng_pack.sh +- docker run -it --rm -v ${opl_build_dir}/ mlafeldt/ps2dev ./lng_pack.sh ## [TEMPLATE] Deploy OPL to Github Releases # 1. Clone this repository diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 9d69575b5..a7982aea2 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev973 - Jay-Jay-OPL - The following changes were made: ShaolinAssassin: GUI layout fix: compatibility with lang files restored (NOTE: partial merge, not all changes were added to the OPL Daily Builds repo). uyjulian: clang-format again. uyjulian: Fix readme to be in markdown format. uyjulian: consise templates.. doctorxyz: GSM Core gardening. uyjulian: fix spacing, links, and wording in readme. Jay-Jay-OPL: a few custom changes to some files and also lang updates for OPL Daily Builds repo. - Mon Oct 31 11:33:56 2016 -0700 rev972 - Jay-Jay-OPL - A Few fixes... * doctorxyz commited: GSM core - Screen garbage fix for God of War I (SCUS_973.99) & Sega Genesis Collection (SLUS_215.42) - This patch is applied only once, each time Hook_SetGsCrt is called; it makes DISPLAY2 appears, while DISPLAY1 not - by setting its value to zero. - PS: Sega Genesis Collection (SLUS_215.42) does not repeatedly write to GS Priviledge Registers, but God of War I (SCUS_973.99) does it. - Thu Oct 27 15:28:16 2016 -0700 rev971 - Jay-Jay-OPL - doctorxyz commited: Per-Game Cheat Engine - fix for ETH and HDD Modes - Tue Oct 25 11:53:37 2016 -0700 rev970 - Jay-Jay-OPL - OPL: Fix some shits - Tue Oct 25 11:41:07 2016 -0700 diff --git a/Makefile b/Makefile index 68db85f5f..d5b44853c 100755 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ VERSION = 0 SUBVERSION = 9 -PATCHLEVEL = 4 -EXTRAVERSION = WIP +PATCHLEVEL = 3+ +EXTRAVERSION = Beta # How to DEBUG? # Simply type "make " to build OPL with the necessary debugging functionality. @@ -57,36 +57,36 @@ REVISION = $(shell expr $$(cat DETAILED_CHANGELOG | grep "rev" | head -1 | cut - GIT_HASH = $(shell git rev-parse --short=7 HEAD 2>/dev/null) ifeq ($(shell git diff --quiet; echo $$?),1) - DIRTY = dirty + DIRTY = -dirty endif -ifneq ($(shell test -d .git; echo $$?),0) - DIRTY = dirty +ifneq ($(shell test -d .git; echo $?),0) + DIRTY = -dirty endif OPL_VERSION = $(VERSION).$(SUBVERSION).$(PATCHLEVEL).$(REVISION)$(if $(EXTRAVERSION),-$(EXTRAVERSION))$(if $(GIT_HASH),-$(GIT_HASH))$(if $(DIRTY),-$(DIRTY))$(if $(LOCALVERSION),-$(LOCALVERSION)) -FRONTEND_OBJS = obj/pad.o obj/fntsys.o obj/renderman.o obj/menusys.o obj/OSDHistory.o obj/system.o obj/lang.o obj/config.o obj/hdd.o obj/dialogs.o \ - obj/dia.o obj/ioman.o obj/texcache.o obj/themes.o obj/supportbase.o obj/usbsupport.o obj/ethsupport.o obj/hddsupport.o \ - obj/appsupport.o obj/elmsupport.o obj/gui.o obj/textures.o obj/opl.o obj/atlas.o obj/nbns.o obj/httpclient.o +FRONTEND_OBJS = pad.o fntsys.o renderman.o menusys.o OSDHistory.o system.o lang.o config.o hdd.o dialogs.o \ + dia.o ioman.o texcache.o themes.o supportbase.o usbsupport.o ethsupport.o hddsupport.o \ + appsupport.o elmsupport.o gui.o textures.o opl.o atlas.o nbns.o httpclient.o -GFX_OBJS = obj/usb_icon.o obj/hdd_icon.o obj/eth_icon.o obj/app_icon.o obj/elm_icon.o \ - obj/cross_icon.o obj/triangle_icon.o obj/circle_icon.o obj/square_icon.o obj/select_icon.o obj/start_icon.o \ - obj/left_icon.o obj/right_icon.o obj/up_icon.o obj/down_icon.o obj/L1_icon.o obj/L2_icon.o obj/R1_icon.o obj/R2_icon.o \ - obj/load0.o obj/load1.o obj/load2.o obj/load3.o obj/load4.o obj/load5.o obj/load6.o obj/load7.o obj/logo.o obj/bg_overlay.o obj/freesans.o \ - obj/icon_sys.o obj/icon_icn.o +GFX_OBJS = usb_icon.o hdd_icon.o eth_icon.o app_icon.o elm_icon.o \ + cross_icon.o triangle_icon.o circle_icon.o square_icon.o select_icon.o start_icon.o \ + left_icon.o right_icon.o up_icon.o down_icon.o L1_icon.o L2_icon.o R1_icon.o R2_icon.o \ + load0.o load1.o load2.o load3.o load4.o load5.o load6.o load7.o logo.o bg_overlay.o freesans.o \ + icon_sys.o icon_icn.o -MISC_OBJS = obj/icon_sys_A.o obj/icon_sys_J.o +MISC_OBJS = icon_sys_A.o icon_sys_J.o -IOP_OBJS = obj/iomanx.o obj/filexio.o obj/ps2fs.o obj/usbd.o obj/usbhdfsd.o obj/usbhdfsdfsv.o \ - obj/ps2atad.o obj/hdpro_atad.o obj/poweroff.o obj/ps2hdd.o obj/genvmc.o obj/hdldsvr.o \ - obj/ps2dev9.o obj/smsutils.o obj/ps2ip.o obj/smap.o obj/isofs.o obj/nbns-iop.o \ - obj/httpclient-iop.o obj/netman.o obj/ps2ips.o +IOP_OBJS = iomanx.o filexio.o ps2fs.o usbd.o usbhdfsd.o usbhdfsdfsv.o \ + ps2atad.o hdpro_atad.o poweroff.o ps2hdd.o genvmc.o hdldsvr.o \ + ps2dev9.o smsutils.o ps2ip.o smap.o isofs.o nbns-iop.o \ + httpclient-iop.o netman.o ps2ips.o -EECORE_OBJS = obj/ee_core.o obj/ioprp.o obj/util.o \ - obj/elfldr.o obj/udnl.o obj/imgdrv.o obj/eesync.o \ - obj/usb_cdvdman.o obj/IOPRP_img.o obj/smb_cdvdman.o \ - obj/hdd_cdvdman.o obj/hdd_hdpro_cdvdman.o obj/cdvdfsv.o \ - obj/ingame_smstcpip.o obj/smap_ingame.o obj/smbman.o obj/smbinit.o +EECORE_OBJS = ee_core.o ioprp.o util.o \ + elfldr.o udnl.o imgdrv.o eesync.o \ + usb_cdvdman.o IOPRP_img.o smb_cdvdman.o \ + hdd_cdvdman.o hdd_hdpro_cdvdman.o cdvdfsv.o \ + ingame_smstcpip.o smap_ingame.o smbman.o smbinit.o EE_BIN = opl.elf EE_BIN_PKD = OPNPS2LD.ELF @@ -94,7 +94,6 @@ EE_VPKD = OPNPS2LD-$(OPL_VERSION) EE_SRC_DIR = src/ EE_OBJS_DIR = obj/ EE_ASM_DIR = asm/ -EE_OBJS = $(FRONTEND_OBJS) $(GFX_OBJS) $(MISC_OBJS) $(EECORE_OBJS) $(IOP_OBJS) MAPFILE = opl.map EE_LDFLAGS += -Wl,-Map,$(MAPFILE) @@ -110,7 +109,7 @@ BIN2O = $(PS2SDK)/bin/bin2o # but a tab is not allowed; if the line begins with a tab, it will be considered part of a recipe for a rule! ifeq ($(VMC),1) - IOP_OBJS += obj/usb_mcemu.o obj/hdd_mcemu.o obj/smb_mcemu.o + IOP_OBJS += usb_mcemu.o hdd_mcemu.o smb_mcemu.o EE_CFLAGS += -DVMC VMC_FLAGS = VMC=1 else @@ -124,7 +123,7 @@ endif ifeq ($(DTL_T10000),1) EE_CFLAGS += -D_DTL_T10000 EECORE_EXTRA_FLAGS += DTL_T10000=1 - IOP_OBJS += obj/sio2man.o obj/padman.o obj/mcman.o obj/mcserv.o + IOP_OBJS += sio2man.o padman.o mcman.o mcserv.o EE_LIBS += -lpadx else EE_LIBS += -lpad @@ -153,7 +152,7 @@ else IGS_FLAGS = IGS=0 endif ifeq ($(CHEAT),1) - FRONTEND_OBJS += obj/cheatman.o + FRONTEND_OBJS += cheatman.o EE_CFLAGS += -DCHEAT CHEAT_FLAGS = CHEAT=1 else @@ -163,7 +162,7 @@ endif ifeq ($(DEBUG),1) EE_CFLAGS += -D__DEBUG -g - EE_OBJS += obj/debug.o obj/udptty.o obj/ioptrap.o obj/ps2link.o + EE_OBJS += debug.o udptty.o ioptrap.o ps2link.o MOD_DEBUG_FLAGS = DEBUG=1 ifeq ($(IOPCORE_DEBUG),1) EE_CFLAGS += -D__INGAME_DEBUG @@ -171,7 +170,7 @@ ifeq ($(DEBUG),1) CDVDMAN_DEBUG_FLAGS = IOPCORE_DEBUG=1 MCEMU_DEBUG_FLAGS = IOPCORE_DEBUG=1 SMSTCPIP_INGAME_CFLAGS = - IOP_OBJS += obj/udptty-ingame.o + IOP_OBJS += udptty-ingame.o else ifeq ($(EESIO_DEBUG),1) EE_CFLAGS += -D__EESIO_DEBUG EECORE_EXTRA_FLAGS += EESIO_DEBUG=1 @@ -183,10 +182,10 @@ ifeq ($(DEBUG),1) ifeq ($(DECI2_DEBUG),1) EE_CFLAGS += -D__DECI2_DEBUG EECORE_EXTRA_FLAGS += DECI2_DEBUG=1 - IOP_OBJS += obj/drvtif_irx.o obj/tifinet_irx.o + IOP_OBJS += drvtif_irx.o tifinet_irx.o DECI2_DEBUG=1 else - IOP_OBJS += obj/udptty-ingame.o + IOP_OBJS += udptty-ingame.o endif endif else @@ -195,11 +194,13 @@ else endif EE_CFLAGS += -DOPL_VERSION=\"$(OPL_VERSION)\" +EE_OBJS = $(FRONTEND_OBJS) $(GFX_OBJS) $(MISC_OBJS) $(EECORE_OBJS) $(IOP_OBJS) +EE_OBJS := $(EE_OBJS:%=$(EE_OBJS_DIR)%) .SILENT: all: - @mkdir -p obj - @mkdir -p asm + @mkdir -p $(EE_OBJS_DIR) + @mkdir -p $(EE_ASM_DIR) echo "Building Open PS2 Loader $(OPL_VERSION)..." echo "-Interface" @@ -208,7 +209,7 @@ all: ifneq ($(DEBUG),1) ifneq ($(NOT_PACKED),1) echo "Stripping..." - ee-strip $(EE_BIN) + $(EE_STRIP) $(EE_BIN) echo "Compressing..." ps2-packer $(EE_BIN) $(EE_BIN_PKD) > /dev/null @@ -326,324 +327,324 @@ pc_tools_win32: ee_core.s: echo "-EE core" $(MAKE) $(PS2LOGO_FLAGS) $(VMC_FLAGS) $(GSM_FLAGS) $(IGS_FLAGS) $(CHEAT_FLAGS) $(EECORE_EXTRA_FLAGS) -C ee_core - $(BIN2S) ee_core/ee_core.elf asm/ee_core.s eecore_elf + $(BIN2S) ee_core/ee_core.elf $(EE_ASM_DIR)ee_core.s eecore_elf elfldr.s: echo "-Elf Loader" $(MAKE) -C elfldr - $(BIN2S) elfldr/elfldr.elf asm/elfldr.s elfldr_elf + $(BIN2S) elfldr/elfldr.elf $(EE_ASM_DIR)elfldr.s elfldr_elf echo "-IOP core" udnl.s: ifeq ($(DTL_T10000),1) echo " -udnl-t300" $(MAKE) -C modules/iopcore/udnl-t300 - $(BIN2S) modules/iopcore/udnl-t300/udnl.irx asm/udnl.s udnl_irx + $(BIN2S) modules/iopcore/udnl-t300/udnl.irx $(EE_ASM_DIR)udnl.s udnl_irx else echo " -udnl" $(MAKE) -C modules/iopcore/udnl - $(BIN2S) modules/iopcore/udnl/udnl.irx asm/udnl.s udnl_irx + $(BIN2S) modules/iopcore/udnl/udnl.irx $(EE_ASM_DIR)udnl.s udnl_irx endif imgdrv.s: echo " -imgdrv" $(MAKE) -C modules/iopcore/imgdrv - $(BIN2S) modules/iopcore/imgdrv/imgdrv.irx asm/imgdrv.s imgdrv_irx + $(BIN2S) modules/iopcore/imgdrv/imgdrv.irx $(EE_ASM_DIR)imgdrv.s imgdrv_irx eesync.s: echo " -eesync" $(MAKE) -C modules/iopcore/eesync - $(BIN2S) modules/iopcore/eesync/eesync.irx asm/eesync.s eesync_irx + $(BIN2S) modules/iopcore/eesync/eesync.irx $(EE_ASM_DIR)eesync.s eesync_irx usb_cdvdman.s: echo " -usb_cdvdman" $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) -C modules/iopcore/cdvdman -f Makefile.usb rebuild - $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx asm/usb_cdvdman.s usb_cdvdman_irx + $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx $(EE_ASM_DIR)usb_cdvdman.s usb_cdvdman_irx smb_cdvdman.s: echo " -smb_cdvdman" $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) -C modules/iopcore/cdvdman -f Makefile.smb rebuild - $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx asm/smb_cdvdman.s smb_cdvdman_irx + $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx $(EE_ASM_DIR)smb_cdvdman.s smb_cdvdman_irx hdd_cdvdman.s: echo " -hdd_cdvdman" $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) -C modules/iopcore/cdvdman -f Makefile.hdd rebuild - $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx asm/hdd_cdvdman.s hdd_cdvdman_irx + $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx $(EE_ASM_DIR)hdd_cdvdman.s hdd_cdvdman_irx hdd_hdpro_cdvdman.s: echo " -hdd_hdpro_cdvdman" $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) -C modules/iopcore/cdvdman -f Makefile.hdd.hdpro rebuild - $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx asm/hdd_hdpro_cdvdman.s hdd_hdpro_cdvdman_irx + $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx $(EE_ASM_DIR)hdd_hdpro_cdvdman.s hdd_hdpro_cdvdman_irx cdvdfsv.s: echo " -cdvdfsv" $(MAKE) -C modules/iopcore/cdvdfsv - $(BIN2S) modules/iopcore/cdvdfsv/cdvdfsv.irx asm/cdvdfsv.s cdvdfsv_irx + $(BIN2S) modules/iopcore/cdvdfsv/cdvdfsv.irx $(EE_ASM_DIR)cdvdfsv.s cdvdfsv_irx usb_mcemu.s: echo " -usb_mcemu" $(MAKE) $(MCEMU_DEBUG_FLAGS) -C modules/mcemu -f Makefile.usb rebuild - $(BIN2S) modules/mcemu/mcemu.irx asm/usb_mcemu.s usb_mcemu_irx + $(BIN2S) modules/mcemu/mcemu.irx $(EE_ASM_DIR)usb_mcemu.s usb_mcemu_irx hdd_mcemu.s: echo " -hdd_mcemu" $(MAKE) $(MCEMU_DEBUG_FLAGS) -C modules/mcemu -f Makefile.hdd rebuild - $(BIN2S) modules/mcemu/mcemu.irx asm/hdd_mcemu.s hdd_mcemu_irx + $(BIN2S) modules/mcemu/mcemu.irx $(EE_ASM_DIR)hdd_mcemu.s hdd_mcemu_irx smb_mcemu.s: echo " -smb_mcemu" $(MAKE) $(MCEMU_DEBUG_FLAGS) -C modules/mcemu -f Makefile.smb rebuild - $(BIN2S) modules/mcemu/mcemu.irx asm/smb_mcemu.s smb_mcemu_irx + $(BIN2S) modules/mcemu/mcemu.irx $(EE_ASM_DIR)smb_mcemu.s smb_mcemu_irx isofs.s: echo " -isofs" $(MAKE) -C modules/isofs - $(BIN2S) modules/isofs/isofs.irx asm/isofs.s isofs_irx + $(BIN2S) modules/isofs/isofs.irx $(EE_ASM_DIR)isofs.s isofs_irx usbd.s: - $(BIN2S) $(PS2SDK)/iop/irx/usbd.irx asm/usbd.s usbd_irx + $(BIN2S) $(PS2SDK)/iop/irx/usbd.irx $(EE_ASM_DIR)usbd.s usbd_irx usbhdfsd.s: echo " -usbhdfsd" $(MAKE) -C modules/usb/usbhdfsd - $(BIN2S) modules/usb/usbhdfsd/usbhdfsd.irx asm/usbhdfsd.s usbhdfsd_irx + $(BIN2S) modules/usb/usbhdfsd/usbhdfsd.irx $(EE_ASM_DIR)usbhdfsd.s usbhdfsd_irx usbhdfsdfsv.s: echo " -usbhdfsdfsv" $(MAKE) -C modules/usb/usbhdfsdfsv - $(BIN2S) modules/usb/usbhdfsdfsv/usbhdfsdfsv.irx asm/usbhdfsdfsv.s usbhdfsdfsv_irx + $(BIN2S) modules/usb/usbhdfsdfsv/usbhdfsdfsv.irx $(EE_ASM_DIR)usbhdfsdfsv.s usbhdfsdfsv_irx ps2dev9.s: echo " -ps2dev9" $(MAKE) -C modules/dev9 - $(BIN2S) modules/dev9/ps2dev9.irx asm/ps2dev9.s ps2dev9_irx + $(BIN2S) modules/dev9/ps2dev9.irx $(EE_ASM_DIR)ps2dev9.s ps2dev9_irx smsutils.s: echo " -SMSUTILS" $(MAKE) -C modules/network/SMSUTILS - $(BIN2S) modules/network/SMSUTILS/SMSUTILS.irx asm/smsutils.s smsutils_irx + $(BIN2S) modules/network/SMSUTILS/SMSUTILS.irx $(EE_ASM_DIR)smsutils.s smsutils_irx ps2ip.s: - $(BIN2S) $(PS2SDK)/iop/irx/ps2ip-nm.irx asm/ps2ip.s ps2ip_irx + $(BIN2S) $(PS2SDK)/iop/irx/ps2ip-nm.irx $(EE_ASM_DIR)ps2ip.s ps2ip_irx ingame_smstcpip.s: echo " -in-game SMSTCPIP" $(MAKE) $(SMSTCPIP_INGAME_CFLAGS) -C modules/network/SMSTCPIP rebuild - $(BIN2S) modules/network/SMSTCPIP/SMSTCPIP.irx asm/ingame_smstcpip.s ingame_smstcpip_irx + $(BIN2S) modules/network/SMSTCPIP/SMSTCPIP.irx $(EE_ASM_DIR)ingame_smstcpip.s ingame_smstcpip_irx smap_ingame.s: echo " -in-game SMAP" $(MAKE) -C modules/network/smap-ingame - $(BIN2S) modules/network/smap-ingame/smap.irx asm/smap_ingame.s smap_ingame_irx + $(BIN2S) modules/network/smap-ingame/smap.irx $(EE_ASM_DIR)smap_ingame.s smap_ingame_irx smap.s: - $(BIN2S) $(PS2SDK)/iop/irx/smap.irx asm/smap.s smap_irx + $(BIN2S) $(PS2SDK)/iop/irx/smap.irx $(EE_ASM_DIR)smap.s smap_irx netman.s: - $(BIN2S) $(PS2SDK)/iop/irx/netman.irx asm/netman.s netman_irx + $(BIN2S) $(PS2SDK)/iop/irx/netman.irx $(EE_ASM_DIR)netman.s netman_irx ps2ips.s: - $(BIN2S) $(PS2SDK)/iop/irx/ps2ips.irx asm/ps2ips.s ps2ips_irx + $(BIN2S) $(PS2SDK)/iop/irx/ps2ips.irx $(EE_ASM_DIR)ps2ips.s ps2ips_irx smbman.s: - $(BIN2S) $(PS2SDK)/iop/irx/smbman.irx asm/smbman.s smbman_irx + $(BIN2S) $(PS2SDK)/iop/irx/smbman.irx $(EE_ASM_DIR)smbman.s smbman_irx smbinit.s: echo " -smbinit" $(MAKE) -C modules/network/smbinit - $(BIN2S) modules/network/smbinit/smbinit.irx asm/smbinit.s smbinit_irx + $(BIN2S) modules/network/smbinit/smbinit.irx $(EE_ASM_DIR)smbinit.s smbinit_irx ps2atad.s: echo " -ps2atad" $(MAKE) -C modules/hdd/atad - $(BIN2S) modules/hdd/atad/ps2atad.irx asm/ps2atad.s ps2atad_irx + $(BIN2S) modules/hdd/atad/ps2atad.irx $(EE_ASM_DIR)ps2atad.s ps2atad_irx hdpro_atad.s: echo " -hdpro_atad" $(MAKE) -C modules/hdd/hdpro_atad - $(BIN2S) modules/hdd/hdpro_atad/hdpro_atad.irx asm/hdpro_atad.s hdpro_atad_irx + $(BIN2S) modules/hdd/hdpro_atad/hdpro_atad.irx $(EE_ASM_DIR)hdpro_atad.s hdpro_atad_irx poweroff.s: - $(BIN2S) $(PS2SDK)/iop/irx/poweroff.irx asm/poweroff.s poweroff_irx + $(BIN2S) $(PS2SDK)/iop/irx/poweroff.irx $(EE_ASM_DIR)poweroff.s poweroff_irx ps2hdd.s: echo " -ps2hdd" $(MAKE) -C modules/hdd/apa - $(BIN2S) modules/hdd/apa/ps2hdd.irx asm/ps2hdd.s ps2hdd_irx + $(BIN2S) modules/hdd/apa/ps2hdd.irx $(EE_ASM_DIR)ps2hdd.s ps2hdd_irx genvmc.s: echo " -genvmc" $(MAKE) $(MOD_DEBUG_FLAGS) -C modules/vmc/genvmc - $(BIN2S) modules/vmc/genvmc/genvmc.irx asm/genvmc.s genvmc_irx + $(BIN2S) modules/vmc/genvmc/genvmc.irx $(EE_ASM_DIR)genvmc.s genvmc_irx hdldsvr.s: echo " -hdldsvr" $(MAKE) -C modules/hdd/hdldsvr - $(BIN2S) modules/hdd/hdldsvr/hdldsvr.irx asm/hdldsvr.s hdldsvr_irx + $(BIN2S) modules/hdd/hdldsvr/hdldsvr.irx $(EE_ASM_DIR)hdldsvr.s hdldsvr_irx udptty.s: echo " -udptty" $(MAKE) -C modules/debug/udptty - $(BIN2S) modules/debug/udptty/udptty.irx asm/udptty.s udptty_irx + $(BIN2S) modules/debug/udptty/udptty.irx $(EE_ASM_DIR)udptty.s udptty_irx udptty-ingame.s: echo " -udptty-ingame" $(MAKE) -C modules/debug/udptty-ingame - $(BIN2S) modules/debug/udptty-ingame/udptty.irx asm/udptty-ingame.s udptty_ingame_irx + $(BIN2S) modules/debug/udptty-ingame/udptty.irx $(EE_ASM_DIR)udptty-ingame.s udptty_ingame_irx ioptrap.s: echo " -ioptrap" $(MAKE) -C modules/debug/ioptrap - $(BIN2S) modules/debug/ioptrap/ioptrap.irx asm/ioptrap.s ioptrap_irx + $(BIN2S) modules/debug/ioptrap/ioptrap.irx $(EE_ASM_DIR)ioptrap.s ioptrap_irx ps2link.s: echo " -ps2link" $(MAKE) -C modules/debug/ps2link - $(BIN2S) modules/debug/ps2link/ps2link.irx asm/ps2link.s ps2link_irx + $(BIN2S) modules/debug/ps2link/ps2link.irx $(EE_ASM_DIR)ps2link.s ps2link_irx nbns-iop.s: echo " -nbns" $(MAKE) -C modules/network/nbns - $(BIN2S) modules/network/nbns/nbns.irx asm/nbns-iop.s nbns_irx + $(BIN2S) modules/network/nbns/nbns.irx $(EE_ASM_DIR)nbns-iop.s nbns_irx httpclient-iop.s: echo " -httpclient" $(MAKE) -C modules/network/httpclient - $(BIN2S) modules/network/httpclient/httpclient.irx asm/httpclient-iop.s httpclient_irx + $(BIN2S) modules/network/httpclient/httpclient.irx $(EE_ASM_DIR)httpclient-iop.s httpclient_irx ps2fs.s: echo " -ps2fs" $(MAKE) -C modules/hdd/pfs - $(BIN2S) modules/hdd/pfs/ps2fs.irx asm/ps2fs.s ps2fs_irx + $(BIN2S) modules/hdd/pfs/ps2fs.irx $(EE_ASM_DIR)ps2fs.s ps2fs_irx iomanx.s: - $(BIN2S) $(PS2SDK)/iop/irx/iomanX.irx asm/iomanx.s iomanx_irx + $(BIN2S) $(PS2SDK)/iop/irx/iomanX.irx $(EE_ASM_DIR)iomanx.s iomanx_irx filexio.s: - $(BIN2S) $(PS2SDK)/iop/irx/fileXio.irx asm/filexio.s filexio_irx + $(BIN2S) $(PS2SDK)/iop/irx/fileXio.irx $(EE_ASM_DIR)filexio.s filexio_irx sio2man.s: - $(BIN2S) $(PS2SDK)/iop/irx/freesio2.irx asm/sio2man.s sio2man_irx + $(BIN2S) $(PS2SDK)/iop/irx/freesio2.irx $(EE_ASM_DIR)sio2man.s sio2man_irx padman.s: - $(BIN2S) $(PS2SDK)/iop/irx/freepad.irx asm/padman.s padman_irx + $(BIN2S) $(PS2SDK)/iop/irx/freepad.irx $(EE_ASM_DIR)padman.s padman_irx mcman.s: - $(BIN2S) $(PS2SDK)/iop/irx/mcman.irx asm/mcman.s mcman_irx + $(BIN2S) $(PS2SDK)/iop/irx/mcman.irx $(EE_ASM_DIR)mcman.s mcman_irx mcserv.s: - $(BIN2S) $(PS2SDK)/iop/irx/mcserv.irx asm/mcserv.s mcserv_irx + $(BIN2S) $(PS2SDK)/iop/irx/mcserv.irx $(EE_ASM_DIR)mcserv.s mcserv_irx load0.s: - $(BIN2S) gfx/load0.png asm/load0.s load0_png + $(BIN2S) gfx/load0.png $(EE_ASM_DIR)load0.s load0_png load1.s: - $(BIN2S) gfx/load1.png asm/load1.s load1_png + $(BIN2S) gfx/load1.png $(EE_ASM_DIR)load1.s load1_png load2.s: - $(BIN2S) gfx/load2.png asm/load2.s load2_png + $(BIN2S) gfx/load2.png $(EE_ASM_DIR)load2.s load2_png load3.s: - $(BIN2S) gfx/load3.png asm/load3.s load3_png + $(BIN2S) gfx/load3.png $(EE_ASM_DIR)load3.s load3_png load4.s: - $(BIN2S) gfx/load4.png asm/load4.s load4_png + $(BIN2S) gfx/load4.png $(EE_ASM_DIR)load4.s load4_png load5.s: - $(BIN2S) gfx/load5.png asm/load5.s load5_png + $(BIN2S) gfx/load5.png $(EE_ASM_DIR)load5.s load5_png load6.s: - $(BIN2S) gfx/load6.png asm/load6.s load6_png + $(BIN2S) gfx/load6.png $(EE_ASM_DIR)load6.s load6_png load7.s: - $(BIN2S) gfx/load7.png asm/load7.s load7_png + $(BIN2S) gfx/load7.png $(EE_ASM_DIR)load7.s load7_png logo.s: - $(BIN2S) gfx/logo.png asm/logo.s logo_png + $(BIN2S) gfx/logo.png $(EE_ASM_DIR)logo.s logo_png bg_overlay.s: - $(BIN2S) gfx/bg_overlay.png asm/bg_overlay.s bg_overlay_png + $(BIN2S) gfx/bg_overlay.png $(EE_ASM_DIR)bg_overlay.s bg_overlay_png usb_icon.s: - $(BIN2S) gfx/usb.png asm/usb_icon.s usb_png + $(BIN2S) gfx/usb.png $(EE_ASM_DIR)usb_icon.s usb_png hdd_icon.s: - $(BIN2S) gfx/hdd.png asm/hdd_icon.s hdd_png + $(BIN2S) gfx/hdd.png $(EE_ASM_DIR)hdd_icon.s hdd_png eth_icon.s: - $(BIN2S) gfx/eth.png asm/eth_icon.s eth_png + $(BIN2S) gfx/eth.png $(EE_ASM_DIR)eth_icon.s eth_png app_icon.s: - $(BIN2S) gfx/app.png asm/app_icon.s app_png + $(BIN2S) gfx/app.png $(EE_ASM_DIR)app_icon.s app_png elm_icon.s: - $(BIN2S) gfx/elm.png asm/elm_icon.s elm_png + $(BIN2S) gfx/elm.png $(EE_ASM_DIR)elm_icon.s elm_png cross_icon.s: - $(BIN2S) gfx/cross.png asm/cross_icon.s cross_png + $(BIN2S) gfx/cross.png $(EE_ASM_DIR)cross_icon.s cross_png triangle_icon.s: - $(BIN2S) gfx/triangle.png asm/triangle_icon.s triangle_png + $(BIN2S) gfx/triangle.png $(EE_ASM_DIR)triangle_icon.s triangle_png circle_icon.s: - $(BIN2S) gfx/circle.png asm/circle_icon.s circle_png + $(BIN2S) gfx/circle.png $(EE_ASM_DIR)circle_icon.s circle_png square_icon.s: - $(BIN2S) gfx/square.png asm/square_icon.s square_png + $(BIN2S) gfx/square.png $(EE_ASM_DIR)square_icon.s square_png select_icon.s: - $(BIN2S) gfx/select.png asm/select_icon.s select_png + $(BIN2S) gfx/select.png $(EE_ASM_DIR)select_icon.s select_png start_icon.s: - $(BIN2S) gfx/start.png asm/start_icon.s start_png + $(BIN2S) gfx/start.png $(EE_ASM_DIR)start_icon.s start_png left_icon.s: - $(BIN2S) gfx/left.png asm/left_icon.s left_png + $(BIN2S) gfx/left.png $(EE_ASM_DIR)left_icon.s left_png right_icon.s: - $(BIN2S) gfx/right.png asm/right_icon.s right_png + $(BIN2S) gfx/right.png $(EE_ASM_DIR)right_icon.s right_png up_icon.s: - $(BIN2S) gfx/up.png asm/up_icon.s up_png + $(BIN2S) gfx/up.png $(EE_ASM_DIR)up_icon.s up_png down_icon.s: - $(BIN2S) gfx/down.png asm/down_icon.s down_png + $(BIN2S) gfx/down.png $(EE_ASM_DIR)down_icon.s down_png L1_icon.s: - $(BIN2S) gfx/L1.png asm/L1_icon.s L1_png + $(BIN2S) gfx/L1.png $(EE_ASM_DIR)L1_icon.s L1_png L2_icon.s: - $(BIN2S) gfx/L2.png asm/L2_icon.s L2_png + $(BIN2S) gfx/L2.png $(EE_ASM_DIR)L2_icon.s L2_png R1_icon.s: - $(BIN2S) gfx/R1.png asm/R1_icon.s R1_png + $(BIN2S) gfx/R1.png $(EE_ASM_DIR)R1_icon.s R1_png R2_icon.s: - $(BIN2S) gfx/R2.png asm/R2_icon.s R2_png + $(BIN2S) gfx/R2.png $(EE_ASM_DIR)R2_icon.s R2_png freesans.s: - $(BIN2S) thirdparty/FreeSans_basic_latin.ttf asm/freesans.s freesansfont_raw + $(BIN2S) thirdparty/FreeSans_basic_latin.ttf $(EE_ASM_DIR)freesans.s freesansfont_raw icon_sys.s: - $(BIN2S) gfx/icon.sys asm/icon_sys.s icon_sys + $(BIN2S) gfx/icon.sys $(EE_ASM_DIR)icon_sys.s icon_sys icon_icn.s: - $(BIN2S) gfx/opl.icn asm/icon_icn.s icon_icn + $(BIN2S) gfx/opl.icn $(EE_ASM_DIR)icon_icn.s icon_icn icon_sys_A.s: - $(BIN2S) misc/icon_A.sys asm/icon_sys_A.s icon_sys_A + $(BIN2S) misc/icon_A.sys $(EE_ASM_DIR)icon_sys_A.s icon_sys_A icon_sys_J.s: - $(BIN2S) misc/icon_J.sys asm/icon_sys_J.s icon_sys_J + $(BIN2S) misc/icon_J.sys $(EE_ASM_DIR)icon_sys_J.s icon_sys_J IOPRP_img.s: - $(BIN2S) modules/iopcore/IOPRP.img asm/IOPRP_img.s IOPRP_img + $(BIN2S) modules/iopcore/IOPRP.img $(EE_ASM_DIR)IOPRP_img.s IOPRP_img drvtif_irx.s: - $(BIN2S) modules/debug/drvtif.irx asm/drvtif_irx.s drvtif_irx + $(BIN2S) modules/debug/drvtif.irx $(EE_ASM_DIR)drvtif_irx.s drvtif_irx tifinet_irx.s: - $(BIN2S) modules/debug/tifinet.irx asm/tifinet_irx.s tifinet_irx + $(BIN2S) modules/debug/tifinet.irx $(EE_ASM_DIR)tifinet_irx.s tifinet_irx $(EE_OBJS_DIR)%.o : $(EE_SRC_DIR)%.c $(EE_CC) $(EE_CFLAGS) $(EE_INCS) -c $< -o $@ diff --git a/ee_core/Makefile b/ee_core/Makefile index dedb7a701..a4811078e 100755 --- a/ee_core/Makefile +++ b/ee_core/Makefile @@ -10,18 +10,17 @@ # Standard Makefile EE_BIN = ee_core.elf +EE_SRC_DIR = src/ +EE_OBJS_DIR = obj/ -GSMCORE_EE_OBJS = obj/gsm_engine.o obj/gsm_api.o -IGSCORE_EE_OBJS = obj/igs_api.o -CHEATCORE_EE_OBJS = obj/cheat_engine.o obj/cheat_api.o +GSMCORE_EE_OBJS = gsm_engine.o gsm_api.o +IGSCORE_EE_OBJS = igs_api.o +CHEATCORE_EE_OBJS = cheat_engine.o cheat_api.o -EE_OBJS = obj/main.o obj/syshook.o obj/iopmgr.o obj/modmgr.o obj/util.o obj/patches.o obj/patches_asm.o \ - obj/padhook.o obj/spu.o obj/tlb.o obj/asm.o obj/crt0.o +EE_OBJS = main.o syshook.o iopmgr.o modmgr.o util.o patches.o patches_asm.o \ + padhook.o spu.o tlb.o asm.o crt0.o MAPFILE = ee_core.map -EE_SRC_DIR = src/ -EE_OBJS_DIR = obj/ - EE_INCS := -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -Iinclude -I. EE_CFLAGS = -D_EE -Os -G0 -Wall $(EE_INCS) @@ -60,6 +59,8 @@ EE_OBJS += $(CHEATCORE_EE_OBJS) EE_CFLAGS += -DCHEAT endif +EE_OBJS := $(EE_OBJS:%=$(EE_OBJS_DIR)%) + ifeq ($(IGS),1) EE_LDFLAGS = -nostartfiles -Tlinkfile.igs -L$(PS2SDK)/ee/lib -s -Wl,-Map,$(MAPFILE) else @@ -75,15 +76,15 @@ EE_LIBS += -lkernel $(EE_OBJS_DIR)%.o : $(EE_SRC_DIR)%.c - @mkdir -p obj + @mkdir -p $(EE_OBJS_DIR) $(EE_CC) $(EE_CFLAGS) $(EE_INCS) -c $< -o $@ $(EE_OBJS_DIR)%.o : $(EE_SRC_DIR)%.S - @mkdir -p obj + @mkdir -p $(EE_OBJS_DIR) $(EE_CC) $(EE_CFLAGS) $(EE_INCS) -c $< -o $@ $(EE_OBJS_DIR)%.o : $(EE_SRC_DIR)%.s - @mkdir -p obj + @mkdir -p $(EE_OBJS_DIR) $(EE_AS) $(EE_ASFLAGS) $< -o $@ $(EE_BIN) : $(EE_OBJS) diff --git a/modules/dev9/dev9.h b/modules/dev9/dev9.h index fc110adcc..854e75a8c 100755 --- a/modules/dev9/dev9.h +++ b/modules/dev9/dev9.h @@ -7,15 +7,15 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id: dev9.h 1454 2007-11-04 23:19:57Z roman_ps2dev $ +# $Id$ # DEV9 Device Driver definitions and imports. */ #ifndef IOP_DEV9_H #define IOP_DEV9_H -#include "types.h" -#include "irx.h" +#include +#include typedef int (*dev9_intr_cb_t)(int flag); typedef void (*dev9_shutdown_cb_t)(void); diff --git a/modules/usb/usbhdfsd/fat_driver.c b/modules/usb/usbhdfsd/fat_driver.c index 6ee5a1345..65931fece 100644 --- a/modules/usb/usbhdfsd/fat_driver.c +++ b/modules/usb/usbhdfsd/fat_driver.c @@ -36,10 +36,11 @@ static fat_driver *g_fatd[NUM_DRIVES]; int InitFAT(void) { int i; - int ret = 0; + for (i = 0; i < NUM_DRIVES; ++i) g_fatd[i] = NULL; - return ret; + + return 0; } //--------------------------------------------------------------------------- diff --git a/modules/usb/usbhdfsd/fat_write.h b/modules/usb/usbhdfsd/fat_write.h index caf2d7365..a3d3ed692 100644 --- a/modules/usb/usbhdfsd/fat_write.h +++ b/modules/usb/usbhdfsd/fat_write.h @@ -5,7 +5,7 @@ unsigned char toUpperChar(unsigned char c); int fat_createFile(fat_driver *fatd, const unsigned char *fname, char directory, char escapeNotExist, unsigned int *cluster, unsigned int *sfnSector, int *sfnOffset); int fat_deleteFile(fat_driver *fatd, const unsigned char *fname, char directory); int fat_truncateFile(fat_driver *fatd, unsigned int cluster, unsigned int sfnSector, int sfnOffset); -int fat_renameFile(fat_driver *fatd, fat_dir *fatdir, const char *dPName); +int fat_renameFile(fat_driver *fatd, fat_dir *fatdir, const char *fname); int fat_writeFile(fat_driver *fatd, fat_dir *fatDir, int *updateClusterIndices, unsigned int filePos, unsigned char *buffer, int size); int fat_updateSfn(fat_driver *fatd, int size, unsigned int sfnSector, int sfnOffset); diff --git a/modules/usb/usbhdfsd/usb_driver.c b/modules/usb/usbhdfsd/usb_driver.c index 97a85c6cb..df4d65ec7 100644 --- a/modules/usb/usbhdfsd/usb_driver.c +++ b/modules/usb/usbhdfsd/usb_driver.c @@ -1057,8 +1057,10 @@ int InitUSB(void) { int i; int ret = 0; - for (i = 0; i < NUM_DEVICES; ++i) + for (i = 0; i < NUM_DEVICES; ++i) { + g_mass_device[i].status = 0; g_mass_device[i].devId = -1; + } driver.next = NULL; driver.prev = NULL; @@ -1103,6 +1105,10 @@ int UsbMassRegisterCallback(int device, usbmass_cb_t callback) if (device >= 0 && device < NUM_DEVICES) { g_mass_device[device].callback = callback; result = 0; + if(g_mass_device[device].status & USBMASS_DEV_STAT_CONN) { + //If the device is already connected, let the callback know. + if(callback != NULL) callback(USBMASS_DEV_EV_CONN); + } } else result = -ENODEV; From 13bac02049cd3c9ed0c7955697ece3413c9a9d75 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 15 Dec 2016 18:02:59 -0800 Subject: [PATCH 014/269] * NOTE: Updating and rebuilding gsKit is required. - by @rickgaiser * Adapt for changes in gsKit - by @rickgaiser - Hacks are no longer needed for 576P and centering the screen. - by @rickgaiser * Add settings for display X and Y offset - by @rickgaiser --- DETAILED_CHANGELOG | 1 + include/config.h | 2 ++ include/dialogs.h | 2 ++ include/opl.h | 2 ++ include/renderman.h | 3 +++ src/dialogs.c | 10 +++++++++ src/gui.c | 10 ++++++++- src/opl.c | 6 +++++ src/renderman.c | 53 +++++++++++---------------------------------- 9 files changed, 48 insertions(+), 41 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index a7982aea2..bfa2acc88 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev974 - Jay-Jay-OPL - Optimized makefiles. (#24) * Optimized makefiles. Synced with mainstream ps2sdk: * Clear USB Mass Storage Device status to 0 at initialization-time (8997094) * Changed UsbMassRegisterCallback to call the callback once if a device is connected (cf385c0) * Test travis * Test travis 2 - Wed Nov 23 20:49:41 2016 -0800 rev973 - Jay-Jay-OPL - The following changes were made: ShaolinAssassin: GUI layout fix: compatibility with lang files restored (NOTE: partial merge, not all changes were added to the OPL Daily Builds repo). uyjulian: clang-format again. uyjulian: Fix readme to be in markdown format. uyjulian: consise templates.. doctorxyz: GSM Core gardening. uyjulian: fix spacing, links, and wording in readme. Jay-Jay-OPL: a few custom changes to some files and also lang updates for OPL Daily Builds repo. - Mon Oct 31 11:33:56 2016 -0700 rev972 - Jay-Jay-OPL - A Few fixes... * doctorxyz commited: GSM core - Screen garbage fix for God of War I (SCUS_973.99) & Sega Genesis Collection (SLUS_215.42) - This patch is applied only once, each time Hook_SetGsCrt is called; it makes DISPLAY2 appears, while DISPLAY1 not - by setting its value to zero. - PS: Sega Genesis Collection (SLUS_215.42) does not repeatedly write to GS Priviledge Registers, but God of War I (SCUS_973.99) does it. - Thu Oct 27 15:28:16 2016 -0700 rev971 - Jay-Jay-OPL - doctorxyz commited: Per-Game Cheat Engine - fix for ETH and HDD Modes - Tue Oct 25 11:53:37 2016 -0700 diff --git a/include/config.h b/include/config.h index ac398ef8a..145d2b731 100644 --- a/include/config.h +++ b/include/config.h @@ -61,6 +61,8 @@ enum CONFIG_INDEX { #define CONFIG_OPL_ENABLE_COVERART "enable_coverart" #define CONFIG_OPL_WIDESCREEN "wide_screen" #define CONFIG_OPL_VMODE "vmode" +#define CONFIG_OPL_XOFF "xoff" +#define CONFIG_OPL_YOFF "yoff" #define CONFIG_OPL_DISABLE_DEBUG "disable_debug" #define CONFIG_OPL_PS2LOGO "ps2logo" #define CONFIG_OPL_EXIT_PATH "exit_path" diff --git a/include/dialogs.h b/include/dialogs.h index cdaa6019d..f0df53944 100644 --- a/include/dialogs.h +++ b/include/dialogs.h @@ -19,6 +19,8 @@ enum UI_ITEMS { UICFG_WIDESCREEN, UICFG_AUTOREFRESH, UICFG_VMODE, + UICFG_XOFF, + UICFG_YOFF, UICFG_INFOPAGE, CFG_DEBUG, diff --git a/include/opl.h b/include/opl.h index fc7ff473f..8ea14a634 100644 --- a/include/opl.h +++ b/include/opl.h @@ -108,6 +108,8 @@ int gUseInfoScreen; int gEnableArt; int gWideScreen; int gVMode; // 0 - Auto, 1 - PAL, 2 - NTSC +int gXOff; +int gYOff; int gSelectButton; #ifdef IGS diff --git a/include/renderman.h b/include/renderman.h index be7888df0..33508bce2 100644 --- a/include/renderman.h +++ b/include/renderman.h @@ -102,6 +102,9 @@ void rmStartFrame(void); /** Ends the frame - last to call every frame */ void rmEndFrame(void); +/** Sets the display offset in units of pixels */ +void rmSetDisplayOffset(int x, int y); + /** Sets the aspect ratio correction for the upcoming operations. * When set, it will treat all pixmap widths/heights (not positions) as scaled with the ratios provided */ void rmSetAspectRatio(float width, float height); diff --git a/src/dialogs.c b/src/dialogs.c index a0456ff0a..6edcf18a5 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -413,6 +413,16 @@ struct UIItem diaUIConfig[] = { {UI_ENUM, UICFG_VMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {"X-Offset", -1}}}, + {UI_SPACER}, + {UI_INT, UICFG_XOFF, 1, 1, -1, 0, 0, {.intvalue = {0, 0, -300, 300}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {"Y-Offset", -1}}}, + {UI_SPACER}, + {UI_INT, UICFG_YOFF, 1, 1, -1, 0, 0, {.intvalue = {0, 0, -300, 300}}}, + {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_WIDE_SCREEN}}}, {UI_SPACER}, {UI_BOOL, UICFG_WIDESCREEN, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, diff --git a/src/gui.c b/src/gui.c index cd3963f4e..6bfa8e209 100644 --- a/src/gui.c +++ b/src/gui.c @@ -438,7 +438,7 @@ static int curTheme = -1; static int guiUIUpdater(int modified) { if (modified) { - int temp; + int temp, x, y; diaGetInt(diaUIConfig, UICFG_THEME, &temp); if (temp != curTheme) { curTheme = temp; @@ -477,6 +477,10 @@ static int guiUIUpdater(int modified) diaSetEnabled(diaUIConfig, UICFG_TXTCOL, temp); diaSetEnabled(diaUIConfig, UICFG_SELCOL, temp); } + + diaGetInt(diaUIConfig, UICFG_XOFF, &x); + diaGetInt(diaUIConfig, UICFG_YOFF, &y); + rmSetDisplayOffset(x, y); } return 0; @@ -505,6 +509,8 @@ void guiShowUIConfig(void) diaSetInt(diaUIConfig, UICFG_COVERART, gEnableArt); diaSetInt(diaUIConfig, UICFG_WIDESCREEN, gWideScreen); diaSetInt(diaUIConfig, UICFG_VMODE, gVMode); + diaSetInt(diaUIConfig, UICFG_XOFF, gXOff); + diaSetInt(diaUIConfig, UICFG_YOFF, gYOff); int ret = diaExecuteDialog(diaUIConfig, -1, 1, guiUIUpdater); if (ret) { @@ -524,6 +530,8 @@ void guiShowUIConfig(void) diaGetInt(diaUIConfig, UICFG_COVERART, &gEnableArt); diaGetInt(diaUIConfig, UICFG_WIDESCREEN, &gWideScreen); diaGetInt(diaUIConfig, UICFG_VMODE, &gVMode); + diaGetInt(diaUIConfig, UICFG_XOFF, &gXOff); + diaGetInt(diaUIConfig, UICFG_YOFF, &gYOff); applyConfig(themeID, langID); } diff --git a/src/opl.c b/src/opl.c index 3ac3f21b5..e0793fe48 100644 --- a/src/opl.c +++ b/src/opl.c @@ -546,6 +546,8 @@ static void _loadConfig() configGetInt(configOPL, CONFIG_OPL_ENABLE_COVERART, &gEnableArt); configGetInt(configOPL, CONFIG_OPL_WIDESCREEN, &gWideScreen); configGetInt(configOPL, CONFIG_OPL_VMODE, &gVMode); + configGetInt(configOPL, CONFIG_OPL_XOFF, &gXOff); + configGetInt(configOPL, CONFIG_OPL_YOFF, &gYOff); if (configGetStr(configOPL, CONFIG_OPL_THEME, &temp)) themeID = thmFindGuiID(temp); @@ -634,6 +636,8 @@ static void _saveConfig() configSetInt(configOPL, CONFIG_OPL_ENABLE_COVERART, gEnableArt); configSetInt(configOPL, CONFIG_OPL_WIDESCREEN, gWideScreen); configSetInt(configOPL, CONFIG_OPL_VMODE, gVMode); + configSetInt(configOPL, CONFIG_OPL_XOFF, gXOff); + configSetInt(configOPL, CONFIG_OPL_YOFF, gYOff); configSetInt(configOPL, CONFIG_OPL_DISABLE_DEBUG, gDisableDebug); configSetInt(configOPL, CONFIG_OPL_PS2LOGO, gPS2Logo); configSetStr(configOPL, CONFIG_OPL_EXIT_PATH, gExitPath); @@ -1220,6 +1224,8 @@ static void setDefaults(void) frameCounter = 0; gVMode = RM_VMODE_AUTO; + gXOff = 0; + gYOff = 0; #ifdef CHEAT memset(gCheatList, 0, sizeof(gCheatList)); diff --git a/src/renderman.c b/src/renderman.c index bc29d6ac6..9d6862a22 100644 --- a/src/renderman.c +++ b/src/renderman.c @@ -38,15 +38,16 @@ struct rm_mode char mode; char hsync; //In KHz short int height; + short int VCK; }; static struct rm_mode rm_mode_table[NUM_RM_VMODES] = { - {-1, 16, -1}, // AUTO - {GS_MODE_PAL, 16, 512}, // PAL@50Hz - {GS_MODE_NTSC, 16, 448}, // NTSC@60Hz - {GS_MODE_DTV_480P, 31, 448}, // DTV480P@60Hz - {GS_MODE_DTV_576P, 31, 512}, // DTV576P@50Hz - {GS_MODE_VGA_640_60, 31, 480}, // VGA640x480@60Hz + {-1, 16, -1, -1}, // AUTO + {GS_MODE_PAL, 16, 512, 4}, // PAL@50Hz + {GS_MODE_NTSC, 16, 448, 4}, // NTSC@60Hz + {GS_MODE_DTV_480P, 31, 448, 2}, // DTV480P@60Hz + {GS_MODE_DTV_576P, 31, 512, 2}, // DTV576P@50Hz + {GS_MODE_VGA_640_60, 31, 480, 2}, // VGA640x480@60Hz }; static float aspectWidth; @@ -349,42 +350,9 @@ int rmSetMode(int force) gsGlobal->PrimAlphaEnable = GS_SETTING_ON; gsGlobal->DoubleBuffering = GS_SETTING_ON; - if ((gsGlobal->Mode) == GS_MODE_DTV_576P) { // Write X, Y, DW and DH positions for DTV576P (not covered by GSKit lib) - gsGlobal->StartX = 324; - gsGlobal->StartY = 72; - gsGlobal->DW = 1280; - gsGlobal->DH = 512; - } - gsKit_init_screen(gsGlobal); - if (vmode == RM_VMODE_DTV480P) { // Overwrite X, Y and DW GSKit params for DTV480P - gsGlobal->StartX = 312; - gsGlobal->StartY = 37 + (480 - 448) / 2; - gsGlobal->DW = 1280; - gsGlobal->DH = 448; - } else if (vmode == RM_VMODE_VGA_640_60) { // Overwrite X, Y GSKit params for VGA_640_60 - gsGlobal->StartX = 276; - gsGlobal->StartY = 42; - } - - if ((vmode == RM_VMODE_DTV480P) || (vmode == RM_VMODE_VGA_640_60)) { // Commit settings for DTV480P and VGA_650_60 - DIntr(); // disable interrupts - GS_SET_DISPLAY1(gsGlobal->StartX, // X position in the display area (in VCK unit - gsGlobal->StartY, // Y position in the display area (in Raster u - gsGlobal->MagH, // Horizontal Magnification - gsGlobal->MagV, // Vertical Magnification - gsGlobal->DW - 1, // Display area width - gsGlobal->DH - 1); // Display area height - GS_SET_DISPLAY2(gsGlobal->StartX, // X position in the display area (in VCK units) - gsGlobal->StartY, // Y position in the display area (in Raster units) - gsGlobal->MagH, // Horizontal Magnification - gsGlobal->MagV, // Vertical Magnification - gsGlobal->DW - 1, // Display area width - gsGlobal->DH - 1); // Display area height - __asm__("sync.l; sync.p;"); - EIntr(); // enable interrupts - } + rmSetDisplayOffset(gXOff, gYOff); gsKit_mode_switch(gsGlobal, GS_ONESHOT); @@ -525,6 +493,11 @@ void rmDrawLine(int x, int y, int x1, int y1, u64 color) gsKit_prim_line(gsGlobal, x + transX, shiftY(y) + transY, x1 + transX, shiftY(y1) + transY, order, color); } +void rmSetDisplayOffset(int x, int y) +{ + gsKit_set_display_offset(gsGlobal, x * rm_mode_table[vmode].VCK, y); +} + void rmSetAspectRatio(float width, float height) { aspectWidth = width; From 0c7ccd7ff2e5f1b0c050a55c1214062b4eaea9e4 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 24 Dec 2016 02:21:24 -0800 Subject: [PATCH 015/269] Updated to support LWIP v2.0.0. by sp193 --- DETAILED_CHANGELOG | 1 + src/ethsupport.c | 50 +++++++++++++++++++++++----------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index bfa2acc88..b82cacb94 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev975 - Jay-Jay-OPL - * NOTE: Updating and rebuilding gsKit is required. - by @rickgaiser * Adapt for changes in gsKit - by @rickgaiser - Hacks are no longer needed for 576P and centering the screen. - by @rickgaiser * Add settings for display X and Y offset - by @rickgaiser - Thu Dec 15 18:02:59 2016 -0800 rev974 - Jay-Jay-OPL - Optimized makefiles. (#24) * Optimized makefiles. Synced with mainstream ps2sdk: * Clear USB Mass Storage Device status to 0 at initialization-time (8997094) * Changed UsbMassRegisterCallback to call the callback once if a device is connected (cf385c0) * Test travis * Test travis 2 - Wed Nov 23 20:49:41 2016 -0800 rev973 - Jay-Jay-OPL - The following changes were made: ShaolinAssassin: GUI layout fix: compatibility with lang files restored (NOTE: partial merge, not all changes were added to the OPL Daily Builds repo). uyjulian: clang-format again. uyjulian: Fix readme to be in markdown format. uyjulian: consise templates.. doctorxyz: GSM Core gardening. uyjulian: fix spacing, links, and wording in readme. Jay-Jay-OPL: a few custom changes to some files and also lang updates for OPL Daily Builds repo. - Mon Oct 31 11:33:56 2016 -0700 rev972 - Jay-Jay-OPL - A Few fixes... * doctorxyz commited: GSM core - Screen garbage fix for God of War I (SCUS_973.99) & Sega Genesis Collection (SLUS_215.42) - This patch is applied only once, each time Hook_SetGsCrt is called; it makes DISPLAY2 appears, while DISPLAY1 not - by setting its value to zero. - PS: Sega Genesis Collection (SLUS_215.42) does not repeatedly write to GS Priviledge Registers, but God of War I (SCUS_973.99) does it. - Thu Oct 27 15:28:16 2016 -0700 diff --git a/src/ethsupport.c b/src/ethsupport.c index e7aa17881..eb6379277 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -785,20 +785,20 @@ int ethGetNetConfig(u8 *ip_address, u8 *netmask, u8 *gateway) int result; if ((result = ps2ip_getconfig("sm0", &ip_info)) >= 0) { - ip_address[0] = ip4_addr1((struct ip_addr *)&ip_info.ipaddr); - ip_address[1] = ip4_addr2((struct ip_addr *)&ip_info.ipaddr); - ip_address[2] = ip4_addr3((struct ip_addr *)&ip_info.ipaddr); - ip_address[3] = ip4_addr4((struct ip_addr *)&ip_info.ipaddr); - - netmask[0] = ip4_addr1((struct ip_addr *)&ip_info.netmask); - netmask[1] = ip4_addr2((struct ip_addr *)&ip_info.netmask); - netmask[2] = ip4_addr3((struct ip_addr *)&ip_info.netmask); - netmask[3] = ip4_addr4((struct ip_addr *)&ip_info.netmask); - - gateway[0] = ip4_addr1((struct ip_addr *)&ip_info.gw); - gateway[1] = ip4_addr2((struct ip_addr *)&ip_info.gw); - gateway[2] = ip4_addr3((struct ip_addr *)&ip_info.gw); - gateway[3] = ip4_addr4((struct ip_addr *)&ip_info.gw); + ip_address[0] = ip4_addr1((struct ip4_addr *)&ip_info.ipaddr); + ip_address[1] = ip4_addr2((struct ip4_addr *)&ip_info.ipaddr); + ip_address[2] = ip4_addr3((struct ip4_addr *)&ip_info.ipaddr); + ip_address[3] = ip4_addr4((struct ip4_addr *)&ip_info.ipaddr); + + netmask[0] = ip4_addr1((struct ip4_addr *)&ip_info.netmask); + netmask[1] = ip4_addr2((struct ip4_addr *)&ip_info.netmask); + netmask[2] = ip4_addr3((struct ip4_addr *)&ip_info.netmask); + netmask[3] = ip4_addr4((struct ip4_addr *)&ip_info.netmask); + + gateway[0] = ip4_addr1((struct ip4_addr *)&ip_info.gw); + gateway[1] = ip4_addr2((struct ip4_addr *)&ip_info.gw); + gateway[2] = ip4_addr3((struct ip4_addr *)&ip_info.gw); + gateway[3] = ip4_addr4((struct ip4_addr *)&ip_info.gw); } else { memset(ip_address, 0, 4); memset(netmask, 0, 4); @@ -847,7 +847,7 @@ static int ethGetNetIFLinkStatus(void) int ethApplyIPConfig(void) { t_ip_info ip_info; - struct ip_addr ipaddr, netmask, gw, dns, dns_curr; + struct ip4_addr ipaddr, netmask, gw, dns, dns_curr; int result; if ((result = ps2ip_getconfig("sm0", &ip_info)) >= 0) { @@ -859,21 +859,21 @@ int ethApplyIPConfig(void) //Check if it's the same. Otherwise, apply the new configuration. if ((ps2_ip_use_dhcp != ip_info.dhcp_enabled) || (!ps2_ip_use_dhcp && - (!ip_addr_cmp(&ipaddr, (struct ip_addr *)&ip_info.ipaddr) || - !ip_addr_cmp(&netmask, (struct ip_addr *)&ip_info.netmask) || - !ip_addr_cmp(&gw, (struct ip_addr *)&ip_info.gw) || + (!ip_addr_cmp(&ipaddr, (struct ip4_addr *)&ip_info.ipaddr) || + !ip_addr_cmp(&netmask, (struct ip4_addr *)&ip_info.netmask) || + !ip_addr_cmp(&gw, (struct ip4_addr *)&ip_info.gw) || !ip_addr_cmp(&dns, &dns_curr)))) { if (ps2_ip_use_dhcp) { - IP4_ADDR((struct ip_addr *)&ip_info.ipaddr, 169, 254, 0, 1); - IP4_ADDR((struct ip_addr *)&ip_info.netmask, 255, 255, 0, 0); - IP4_ADDR((struct ip_addr *)&ip_info.gw, 0, 0, 0, 0); + IP4_ADDR((struct ip4_addr *)&ip_info.ipaddr, 169, 254, 0, 1); + IP4_ADDR((struct ip4_addr *)&ip_info.netmask, 255, 255, 0, 0); + IP4_ADDR((struct ip4_addr *)&ip_info.gw, 0, 0, 0, 0); IP4_ADDR(&dns, 0, 0, 0, 0); ip_info.dhcp_enabled = 1; } else { - ip_addr_set((struct ip_addr *)&ip_info.ipaddr, &ipaddr); - ip_addr_set((struct ip_addr *)&ip_info.netmask, &netmask); - ip_addr_set((struct ip_addr *)&ip_info.gw, &gw); + ip_addr_set((struct ip4_addr *)&ip_info.ipaddr, &ipaddr); + ip_addr_set((struct ip4_addr *)&ip_info.netmask, &netmask); + ip_addr_set((struct ip4_addr *)&ip_info.gw, &gw); ip_info.dhcp_enabled = 0; } @@ -894,7 +894,7 @@ int ethGetDHCPStatus(void) if ((result = ps2ip_getconfig("sm0", &ip_info)) >= 0) { if (ip_info.dhcp_enabled) { - result = (ip_info.dhcp_status == DHCP_BOUND || (ip_info.dhcp_status == DHCP_OFF)); + result = (ip_info.dhcp_status == DHCP_STATE_BOUND || (ip_info.dhcp_status == DHCP_STATE_OFF)); } else result = -1; } From 7780b43463321a6474fa643c0b12a74e923d2ebb Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 15 Jan 2017 21:57:13 -0800 Subject: [PATCH 016/269] General cleanup (#27) * Remove unused lanman * Makefile cleanup * Fix README file name and url to forums * clang-formatted files that weren't before --- .gitignore | 1 + DETAILED_CHANGELOG | 1 + Makefile | 590 +++++++++++--------- README | 108 ---- README.md | 109 +++- docs/README | 10 - labs/lanlab/Makefile | 42 -- labs/lanlab/lanlab.c | 127 ----- modules/iopcore/cdvdman/Makefile | 105 ++++ modules/iopcore/cdvdman/Makefile.hdd | 35 -- modules/iopcore/cdvdman/Makefile.hdd.hdpro | 36 -- modules/iopcore/cdvdman/Makefile.smb | 35 -- modules/iopcore/cdvdman/Makefile.usb | 46 -- modules/iopcore/cdvdman/Rules.make | 62 +++ modules/mcemu/{Makefile.smb => Makefile} | 34 +- modules/mcemu/Makefile.hdd | 31 -- modules/mcemu/Makefile.usb | 31 -- modules/mcemu/Rules.make | 62 +++ modules/usb/usbhdfsd/usb_driver.c | 13 +- modules/wip/lanman/Makefile | 24 - modules/wip/lanman/README | 17 - modules/wip/lanman/arp.c | 128 ----- modules/wip/lanman/arp.h | 39 -- modules/wip/lanman/eth.h | 19 - modules/wip/lanman/imports.lst | 53 -- modules/wip/lanman/inet.h | 22 - modules/wip/lanman/inet.s | 356 ------------ modules/wip/lanman/ip.h | 32 -- modules/wip/lanman/irx_imports.h | 28 - modules/wip/lanman/lanman.c | 48 -- modules/wip/lanman/lanman.h | 26 - modules/wip/lanman/smap.c | 595 --------------------- modules/wip/lanman/smap.h | 14 - modules/wip/lanman/smsutils.h | 26 - modules/wip/lanman/tcp.c | 231 -------- modules/wip/lanman/tcp.h | 47 -- modules/wip/lanman/udp.h | 31 -- modules/wip/lanman/udptty.c | 187 ------- modules/wip/lanman/udptty.h | 13 - 39 files changed, 711 insertions(+), 2703 deletions(-) delete mode 100755 README delete mode 100644 docs/README delete mode 100755 labs/lanlab/Makefile delete mode 100644 labs/lanlab/lanlab.c create mode 100644 modules/iopcore/cdvdman/Makefile delete mode 100755 modules/iopcore/cdvdman/Makefile.hdd delete mode 100755 modules/iopcore/cdvdman/Makefile.hdd.hdpro delete mode 100755 modules/iopcore/cdvdman/Makefile.smb delete mode 100755 modules/iopcore/cdvdman/Makefile.usb create mode 100644 modules/iopcore/cdvdman/Rules.make rename modules/mcemu/{Makefile.smb => Makefile} (58%) mode change 100755 => 100644 delete mode 100755 modules/mcemu/Makefile.hdd delete mode 100755 modules/mcemu/Makefile.usb create mode 100644 modules/mcemu/Rules.make delete mode 100755 modules/wip/lanman/Makefile delete mode 100755 modules/wip/lanman/README delete mode 100644 modules/wip/lanman/arp.c delete mode 100644 modules/wip/lanman/arp.h delete mode 100644 modules/wip/lanman/eth.h delete mode 100755 modules/wip/lanman/imports.lst delete mode 100755 modules/wip/lanman/inet.h delete mode 100755 modules/wip/lanman/inet.s delete mode 100644 modules/wip/lanman/ip.h delete mode 100755 modules/wip/lanman/irx_imports.h delete mode 100644 modules/wip/lanman/lanman.c delete mode 100644 modules/wip/lanman/lanman.h delete mode 100644 modules/wip/lanman/smap.c delete mode 100755 modules/wip/lanman/smap.h delete mode 100644 modules/wip/lanman/smsutils.h delete mode 100644 modules/wip/lanman/tcp.c delete mode 100644 modules/wip/lanman/tcp.h delete mode 100644 modules/wip/lanman/udp.h delete mode 100644 modules/wip/lanman/udptty.c delete mode 100755 modules/wip/lanman/udptty.h diff --git a/.gitignore b/.gitignore index 242bb508e..e23faf994 100755 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ libfreetype.a pc/iso2usbld/bin/iso2usbld +IOPRP_img.c diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index b82cacb94..5c4cd62b4 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev976 - Jay-Jay-OPL - Updated to support LWIP v2.0.0. by sp193 - Sat Dec 24 02:21:24 2016 -0800 rev975 - Jay-Jay-OPL - * NOTE: Updating and rebuilding gsKit is required. - by @rickgaiser * Adapt for changes in gsKit - by @rickgaiser - Hacks are no longer needed for 576P and centering the screen. - by @rickgaiser * Add settings for display X and Y offset - by @rickgaiser - Thu Dec 15 18:02:59 2016 -0800 rev974 - Jay-Jay-OPL - Optimized makefiles. (#24) * Optimized makefiles. Synced with mainstream ps2sdk: * Clear USB Mass Storage Device status to 0 at initialization-time (8997094) * Changed UsbMassRegisterCallback to call the callback once if a device is connected (cf385c0) * Test travis * Test travis 2 - Wed Nov 23 20:49:41 2016 -0800 rev973 - Jay-Jay-OPL - The following changes were made: ShaolinAssassin: GUI layout fix: compatibility with lang files restored (NOTE: partial merge, not all changes were added to the OPL Daily Builds repo). uyjulian: clang-format again. uyjulian: Fix readme to be in markdown format. uyjulian: consise templates.. doctorxyz: GSM Core gardening. uyjulian: fix spacing, links, and wording in readme. Jay-Jay-OPL: a few custom changes to some files and also lang updates for OPL Daily Builds repo. - Mon Oct 31 11:33:56 2016 -0700 diff --git a/Makefile b/Makefile index d5b44853c..fe337f0e3 100755 --- a/Makefile +++ b/Makefile @@ -16,41 +16,42 @@ EXTRAVERSION = Beta # Type "make childproof" to build one. # Non-childproof features like GSM will not be available. -# I want to put my name in my custom build! How i can do it? +# I want to put my name in my custom build! How can I do it? # Type "make LOCALVERSION=-foobar" # ======== START OF CONFIGURABLE SECTION ======== # You can adjust the variables in this section to meet your needs. # To enable a feature, set its variable's value to 1. To disable, change it to 0. # Do not COMMENT out the variables!! +# You can also specify variables when executing make: "make VMC=1 RTL=1 GSM=1 IGS=1 CHEAT=1" #Enables/disables Virtual Memory Card (VMC) support -VMC = 0 +VMC ?= 0 #Enables/disables Right-To-Left (RTL) language support -RTL = 0 +RTL ?= 0 #Enables/disables Graphics Synthesizer Mode (GSM) selector -GSM = 0 +GSM ?= 0 #Enables/disables In Game Screenshot (IGS). NB: It depends on GSM and IGR to work -IGS = 0 +IGS ?= 0 #Enables/disables the cheat engine (PS2RD) -CHEAT = 0 +CHEAT ?= 0 #Enables/disables building of an edition of OPL that will support the DTL-T10000 (SDK v2.3+) -DTL_T10000 = 0 +DTL_T10000 ?= 0 #Nor stripping neither compressing binary ELF after compiling. -NOT_PACKED = 0 +NOT_PACKED ?= 0 # ======== END OF CONFIGURABLE SECTION. DO NOT MODIFY VARIABLES AFTER THIS POINT!! ======== -DEBUG = 0 -EESIO_DEBUG = 0 -INGAME_DEBUG = 0 -DECI2_DEBUG = 0 -CHILDPROOF = 0 +DEBUG ?= 0 +EESIO_DEBUG ?= 0 +INGAME_DEBUG ?= 0 +DECI2_DEBUG ?= 0 +CHILDPROOF ?= 0 # ======== DO NOT MODIFY VALUES AFTER THIS POINT! UNLESS YOU KNOW WHAT YOU ARE DOING ======== REVISION = $(shell expr $$(cat DETAILED_CHANGELOG | grep "rev" | head -1 | cut -d " " -f 1 | cut -c 4-) + 1) @@ -59,11 +60,11 @@ GIT_HASH = $(shell git rev-parse --short=7 HEAD 2>/dev/null) ifeq ($(shell git diff --quiet; echo $$?),1) DIRTY = -dirty endif -ifneq ($(shell test -d .git; echo $?),0) +ifneq ($(shell test -d .git; echo $$?),0) DIRTY = -dirty endif -OPL_VERSION = $(VERSION).$(SUBVERSION).$(PATCHLEVEL).$(REVISION)$(if $(EXTRAVERSION),-$(EXTRAVERSION))$(if $(GIT_HASH),-$(GIT_HASH))$(if $(DIRTY),-$(DIRTY))$(if $(LOCALVERSION),-$(LOCALVERSION)) +OPL_VERSION = $(VERSION).$(SUBVERSION).$(PATCHLEVEL).$(REVISION)$(if $(EXTRAVERSION),-$(EXTRAVERSION))$(if $(GIT_HASH),-$(GIT_HASH))$(if $(DIRTY),$(DIRTY))$(if $(LOCALVERSION),-$(LOCALVERSION)) FRONTEND_OBJS = pad.o fntsys.o renderman.o menusys.o OSDHistory.o system.o lang.o config.o hdd.o dialogs.o \ dia.o ioman.o texcache.o themes.o supportbase.o usbsupport.o ethsupport.o hddsupport.o \ @@ -89,7 +90,8 @@ EECORE_OBJS = ee_core.o ioprp.o util.o \ ingame_smstcpip.o smap_ingame.o smbman.o smbinit.o EE_BIN = opl.elf -EE_BIN_PKD = OPNPS2LD.ELF +EE_BIN_STRIPPED = opl_stripped.elf +EE_BIN_PACKED = OPNPS2LD.ELF EE_VPKD = OPNPS2LD-$(OPL_VERSION) EE_SRC_DIR = src/ EE_OBJS_DIR = obj/ @@ -125,8 +127,12 @@ ifeq ($(DTL_T10000),1) EECORE_EXTRA_FLAGS += DTL_T10000=1 IOP_OBJS += sio2man.o padman.o mcman.o mcserv.o EE_LIBS += -lpadx + UDNL_SRC = modules/iopcore/udnl-t300 + UDNL_OUT = modules/iopcore/udnl-t300/udnl.irx else EE_LIBS += -lpad + UDNL_SRC = modules/iopcore/udnl + UDNL_OUT = modules/iopcore/udnl/udnl.irx endif ifeq ($(CHILDPROOF),1) @@ -194,36 +200,26 @@ else endif EE_CFLAGS += -DOPL_VERSION=\"$(OPL_VERSION)\" -EE_OBJS = $(FRONTEND_OBJS) $(GFX_OBJS) $(MISC_OBJS) $(EECORE_OBJS) $(IOP_OBJS) +EE_OBJS += $(FRONTEND_OBJS) $(GFX_OBJS) $(MISC_OBJS) $(EECORE_OBJS) $(IOP_OBJS) EE_OBJS := $(EE_OBJS:%=$(EE_OBJS_DIR)%) .SILENT: + +.PHONY: all release childproof debug iopcore_debug eesio_debug ingame_debug deci2_debug clean rebuild pc_tools pc_tools_win32 oplversion + all: - @mkdir -p $(EE_OBJS_DIR) - @mkdir -p $(EE_ASM_DIR) - echo "Building Open PS2 Loader $(OPL_VERSION)..." echo "-Interface" +ifneq ($(NOT_PACKED),1) + $(MAKE) $(EE_BIN_PACKED) +else $(MAKE) $(EE_BIN) - -ifneq ($(DEBUG),1) - ifneq ($(NOT_PACKED),1) - echo "Stripping..." - $(EE_STRIP) $(EE_BIN) - - echo "Compressing..." - ps2-packer $(EE_BIN) $(EE_BIN_PKD) > /dev/null - - ifeq ($(RELEASE),1) - cp $(EE_BIN_PKD) $(EE_VPKD).ELF - zip -r $(EE_VPKD).zip $(EE_VPKD).ELF CREDITS *DETAILED_CHANGELOG LICENSE README - echo "Package Complete: $(EE_VPKD).zip" - endif - endif endif release: - $(MAKE) VMC=1 GSM=1 IGS=1 CHEAT=1 RELEASE=1 all + echo "Building Open PS2 Loader $(OPL_VERSION)..." + echo "-Interface" + $(MAKE) VMC=1 GSM=1 IGS=1 CHEAT=1 $(EE_VPKD).ZIP childproof: $(MAKE) CHILDPROOF=1 all @@ -246,7 +242,7 @@ deci2_debug: clean: echo "Cleaning..." echo "-Interface" - rm -fr $(MAPFILE) $(EE_BIN) $(EE_BIN_PKD) $(EE_VPKD).* $(EE_OBJS_DIR) $(EE_ASM_DIR) + rm -fr $(MAPFILE) $(EE_BIN) $(EE_BIN_PACKED) $(EE_BIN_STRIPPED) $(EE_VPKD).* $(EE_OBJS_DIR) $(EE_ASM_DIR) echo "-EE core" $(MAKE) -C ee_core clean echo "-Elf Loader" @@ -261,10 +257,10 @@ clean: echo " -eesync" $(MAKE) -C modules/iopcore/eesync clean echo " -cdvdman" - $(MAKE) -C modules/iopcore/cdvdman -f Makefile.usb clean - $(MAKE) -C modules/iopcore/cdvdman -f Makefile.smb clean - $(MAKE) -C modules/iopcore/cdvdman -f Makefile.hdd clean - $(MAKE) -C modules/iopcore/cdvdman -f Makefile.hdd.hdpro clean + $(MAKE) -C modules/iopcore/cdvdman USE_USB=1 clean + $(MAKE) -C modules/iopcore/cdvdman USE_SMB=1 clean + $(MAKE) -C modules/iopcore/cdvdman USE_HDD=1 clean + $(MAKE) -C modules/iopcore/cdvdman USE_HDPRO=1 clean echo " -cdvdfsv" $(MAKE) -C modules/iopcore/cdvdfsv clean echo " -isofs" @@ -296,9 +292,9 @@ clean: echo " -ps2fs" $(MAKE) -C modules/hdd/pfs clean echo " -mcemu" - $(MAKE) -C modules/mcemu -f Makefile.usb clean - $(MAKE) -C modules/mcemu -f Makefile.hdd clean - $(MAKE) -C modules/mcemu -f Makefile.smb clean + $(MAKE) -C modules/mcemu USE_USB=1 clean + $(MAKE) -C modules/mcemu USE_HDD=1 clean + $(MAKE) -C modules/mcemu USE_SMB=1 clean echo " -genvmc" $(MAKE) -C modules/vmc/genvmc clean echo " -hdldsvr" @@ -324,336 +320,420 @@ pc_tools_win32: echo "Building WIN32 iso2opl, opl2iso and genvmc..." $(MAKE) _WIN32=1 -C pc -ee_core.s: +$(EE_ASM_DIR): + @mkdir -p $@ + +$(EE_OBJS_DIR): + @mkdir -p $@ + +DETAILED_CHANGELOG: make_changelog.sh + sh make_changelog.sh + +$(EE_BIN_STRIPPED): $(EE_BIN) + echo "Stripping..." + $(EE_STRIP) -o $@ $< + +$(EE_BIN_PACKED): $(EE_BIN_STRIPPED) + echo "Compressing..." + ps2-packer $< $@ > /dev/null + +$(EE_VPKD).ELF: $(EE_BIN_PACKED) + cp -f $< $@ + +$(EE_VPKD).ZIP: $(EE_VPKD).ELF DETAILED_CHANGELOG CREDITS LICENSE README.md + zip -r $@ $^ + echo "Package Complete: $@" + +ee_core/ee_core.elf: ee_core echo "-EE core" - $(MAKE) $(PS2LOGO_FLAGS) $(VMC_FLAGS) $(GSM_FLAGS) $(IGS_FLAGS) $(CHEAT_FLAGS) $(EECORE_EXTRA_FLAGS) -C ee_core - $(BIN2S) ee_core/ee_core.elf $(EE_ASM_DIR)ee_core.s eecore_elf + $(MAKE) $(PS2LOGO_FLAGS) $(VMC_FLAGS) $(GSM_FLAGS) $(IGS_FLAGS) $(CHEAT_FLAGS) $(EECORE_EXTRA_FLAGS) -C $< -elfldr.s: +$(EE_ASM_DIR)ee_core.s: ee_core/ee_core.elf | $(EE_ASM_DIR) + $(BIN2S) $< $@ eecore_elf + +elfldr/elfldr.elf: elfldr echo "-Elf Loader" - $(MAKE) -C elfldr - $(BIN2S) elfldr/elfldr.elf $(EE_ASM_DIR)elfldr.s elfldr_elf - echo "-IOP core" + $(MAKE) -C $< -udnl.s: -ifeq ($(DTL_T10000),1) - echo " -udnl-t300" - $(MAKE) -C modules/iopcore/udnl-t300 - $(BIN2S) modules/iopcore/udnl-t300/udnl.irx $(EE_ASM_DIR)udnl.s udnl_irx -else +$(EE_ASM_DIR)elfldr.s: elfldr/elfldr.elf | $(EE_ASM_DIR) + $(BIN2S) $< $@ elfldr_elf + +$(UDNL_OUT): $(UDNL_SRC) + echo "-IOP core" echo " -udnl" - $(MAKE) -C modules/iopcore/udnl - $(BIN2S) modules/iopcore/udnl/udnl.irx $(EE_ASM_DIR)udnl.s udnl_irx -endif + $(MAKE) -C $< -imgdrv.s: +$(EE_ASM_DIR)udnl.s: $(UDNL_OUT) | $(EE_ASM_DIR) + $(BIN2S) $(UDNL_OUT) $@ udnl_irx + +modules/iopcore/imgdrv/imgdrv.irx: modules/iopcore/imgdrv echo " -imgdrv" - $(MAKE) -C modules/iopcore/imgdrv - $(BIN2S) modules/iopcore/imgdrv/imgdrv.irx $(EE_ASM_DIR)imgdrv.s imgdrv_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)imgdrv.s: modules/iopcore/imgdrv/imgdrv.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ imgdrv_irx -eesync.s: +modules/iopcore/eesync/eesync.irx: modules/iopcore/eesync echo " -eesync" - $(MAKE) -C modules/iopcore/eesync - $(BIN2S) modules/iopcore/eesync/eesync.irx $(EE_ASM_DIR)eesync.s eesync_irx + $(MAKE) -C $< -usb_cdvdman.s: +$(EE_ASM_DIR)eesync.s: modules/iopcore/eesync/eesync.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ eesync_irx + +modules/iopcore/cdvdman/usb_cdvdman.irx: modules/iopcore/cdvdman echo " -usb_cdvdman" - $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) -C modules/iopcore/cdvdman -f Makefile.usb rebuild - $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx $(EE_ASM_DIR)usb_cdvdman.s usb_cdvdman_irx + $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) USE_USB=1 -C $< rebuild + +$(EE_ASM_DIR)usb_cdvdman.s: modules/iopcore/cdvdman/usb_cdvdman.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ usb_cdvdman_irx -smb_cdvdman.s: +modules/iopcore/cdvdman/smb_cdvdman.irx: modules/iopcore/cdvdman echo " -smb_cdvdman" - $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) -C modules/iopcore/cdvdman -f Makefile.smb rebuild - $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx $(EE_ASM_DIR)smb_cdvdman.s smb_cdvdman_irx + $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) USE_SMB=1 -C $< rebuild -hdd_cdvdman.s: +$(EE_ASM_DIR)smb_cdvdman.s: modules/iopcore/cdvdman/smb_cdvdman.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ smb_cdvdman_irx + +modules/iopcore/cdvdman/hdd_cdvdman.irx: modules/iopcore/cdvdman echo " -hdd_cdvdman" - $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) -C modules/iopcore/cdvdman -f Makefile.hdd rebuild - $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx $(EE_ASM_DIR)hdd_cdvdman.s hdd_cdvdman_irx + $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) USE_HDD=1 -C $< rebuild + +$(EE_ASM_DIR)hdd_cdvdman.s: modules/iopcore/cdvdman/hdd_cdvdman.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ hdd_cdvdman_irx -hdd_hdpro_cdvdman.s: +modules/iopcore/cdvdman/hdd_hdpro_cdvdman.irx: modules/iopcore/cdvdman echo " -hdd_hdpro_cdvdman" - $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) -C modules/iopcore/cdvdman -f Makefile.hdd.hdpro rebuild - $(BIN2S) modules/iopcore/cdvdman/cdvdman.irx $(EE_ASM_DIR)hdd_hdpro_cdvdman.s hdd_hdpro_cdvdman_irx + $(MAKE) $(VMC_FLAGS) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) USE_HDPRO=1 -C $< rebuild -cdvdfsv.s: +$(EE_ASM_DIR)hdd_hdpro_cdvdman.s: modules/iopcore/cdvdman/hdd_hdpro_cdvdman.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ hdd_hdpro_cdvdman_irx + +modules/iopcore/cdvdfsv/cdvdfsv.irx: modules/iopcore/cdvdfsv echo " -cdvdfsv" - $(MAKE) -C modules/iopcore/cdvdfsv - $(BIN2S) modules/iopcore/cdvdfsv/cdvdfsv.irx $(EE_ASM_DIR)cdvdfsv.s cdvdfsv_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)cdvdfsv.s: modules/iopcore/cdvdfsv/cdvdfsv.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ cdvdfsv_irx -usb_mcemu.s: +modules/mcemu/usb_mcemu.irx: modules/mcemu echo " -usb_mcemu" - $(MAKE) $(MCEMU_DEBUG_FLAGS) -C modules/mcemu -f Makefile.usb rebuild - $(BIN2S) modules/mcemu/mcemu.irx $(EE_ASM_DIR)usb_mcemu.s usb_mcemu_irx + $(MAKE) $(MCEMU_DEBUG_FLAGS) USE_USB=1 -C $< rebuild -hdd_mcemu.s: +$(EE_ASM_DIR)usb_mcemu.s: modules/mcemu/usb_mcemu.irx + $(BIN2S) $< $@ usb_mcemu_irx + +modules/mcemu/hdd_mcemu.irx: modules/mcemu echo " -hdd_mcemu" - $(MAKE) $(MCEMU_DEBUG_FLAGS) -C modules/mcemu -f Makefile.hdd rebuild - $(BIN2S) modules/mcemu/mcemu.irx $(EE_ASM_DIR)hdd_mcemu.s hdd_mcemu_irx + $(MAKE) $(MCEMU_DEBUG_FLAGS) USE_HDD=1 -C $< rebuild + +$(EE_ASM_DIR)hdd_mcemu.s: modules/mcemu/hdd_mcemu.irx + $(BIN2S) $< $@ hdd_mcemu_irx -smb_mcemu.s: +modules/mcemu/smb_mcemu.irx: modules/mcemu echo " -smb_mcemu" - $(MAKE) $(MCEMU_DEBUG_FLAGS) -C modules/mcemu -f Makefile.smb rebuild - $(BIN2S) modules/mcemu/mcemu.irx $(EE_ASM_DIR)smb_mcemu.s smb_mcemu_irx + $(MAKE) $(MCEMU_DEBUG_FLAGS) USE_SMB=1 -C $< rebuild -isofs.s: +$(EE_ASM_DIR)smb_mcemu.s: modules/mcemu/smb_mcemu.irx + $(BIN2S) $< $@ smb_mcemu_irx + +modules/isofs/isofs.irx: modules/isofs echo " -isofs" - $(MAKE) -C modules/isofs - $(BIN2S) modules/isofs/isofs.irx $(EE_ASM_DIR)isofs.s isofs_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)isofs.s: modules/isofs/isofs.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ isofs_irx -usbd.s: - $(BIN2S) $(PS2SDK)/iop/irx/usbd.irx $(EE_ASM_DIR)usbd.s usbd_irx +$(EE_ASM_DIR)usbd.s: $(PS2SDK)/iop/irx/usbd.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ usbd_irx -usbhdfsd.s: +modules/usb/usbhdfsd/usbhdfsd.irx: modules/usb/usbhdfsd echo " -usbhdfsd" - $(MAKE) -C modules/usb/usbhdfsd - $(BIN2S) modules/usb/usbhdfsd/usbhdfsd.irx $(EE_ASM_DIR)usbhdfsd.s usbhdfsd_irx + $(MAKE) -C $< -usbhdfsdfsv.s: +$(EE_ASM_DIR)usbhdfsd.s: modules/usb/usbhdfsd/usbhdfsd.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ usbhdfsd_irx + +modules/usb/usbhdfsdfsv/usbhdfsdfsv.irx: modules/usb/usbhdfsdfsv echo " -usbhdfsdfsv" - $(MAKE) -C modules/usb/usbhdfsdfsv - $(BIN2S) modules/usb/usbhdfsdfsv/usbhdfsdfsv.irx $(EE_ASM_DIR)usbhdfsdfsv.s usbhdfsdfsv_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)usbhdfsdfsv.s: modules/usb/usbhdfsdfsv/usbhdfsdfsv.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ usbhdfsdfsv_irx -ps2dev9.s: +modules/dev9/ps2dev9.irx: modules/dev9 echo " -ps2dev9" - $(MAKE) -C modules/dev9 - $(BIN2S) modules/dev9/ps2dev9.irx $(EE_ASM_DIR)ps2dev9.s ps2dev9_irx + $(MAKE) -C $< -smsutils.s: +$(EE_ASM_DIR)ps2dev9.s: modules/dev9/ps2dev9.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ps2dev9_irx + +modules/network/SMSUTILS/SMSUTILS.irx: modules/network/SMSUTILS echo " -SMSUTILS" - $(MAKE) -C modules/network/SMSUTILS - $(BIN2S) modules/network/SMSUTILS/SMSUTILS.irx $(EE_ASM_DIR)smsutils.s smsutils_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)smsutils.s: modules/network/SMSUTILS/SMSUTILS.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ smsutils_irx -ps2ip.s: - $(BIN2S) $(PS2SDK)/iop/irx/ps2ip-nm.irx $(EE_ASM_DIR)ps2ip.s ps2ip_irx +$(EE_ASM_DIR)ps2ip.s: $(PS2SDK)/iop/irx/ps2ip-nm.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ps2ip_irx -ingame_smstcpip.s: +modules/network/SMSTCPIP/SMSTCPIP.irx: modules/network/SMSTCPIP echo " -in-game SMSTCPIP" - $(MAKE) $(SMSTCPIP_INGAME_CFLAGS) -C modules/network/SMSTCPIP rebuild - $(BIN2S) modules/network/SMSTCPIP/SMSTCPIP.irx $(EE_ASM_DIR)ingame_smstcpip.s ingame_smstcpip_irx + $(MAKE) $(SMSTCPIP_INGAME_CFLAGS) -C $< rebuild -smap_ingame.s: +$(EE_ASM_DIR)ingame_smstcpip.s: modules/network/SMSTCPIP/SMSTCPIP.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ingame_smstcpip_irx + +modules/network/smap-ingame/smap.irx: modules/network/smap-ingame echo " -in-game SMAP" - $(MAKE) -C modules/network/smap-ingame - $(BIN2S) modules/network/smap-ingame/smap.irx $(EE_ASM_DIR)smap_ingame.s smap_ingame_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)smap_ingame.s: modules/network/smap-ingame/smap.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ smap_ingame_irx -smap.s: - $(BIN2S) $(PS2SDK)/iop/irx/smap.irx $(EE_ASM_DIR)smap.s smap_irx +$(EE_ASM_DIR)smap.s: $(PS2SDK)/iop/irx/smap.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ smap_irx -netman.s: - $(BIN2S) $(PS2SDK)/iop/irx/netman.irx $(EE_ASM_DIR)netman.s netman_irx +$(EE_ASM_DIR)netman.s: $(PS2SDK)/iop/irx/netman.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ netman_irx -ps2ips.s: - $(BIN2S) $(PS2SDK)/iop/irx/ps2ips.irx $(EE_ASM_DIR)ps2ips.s ps2ips_irx +$(EE_ASM_DIR)ps2ips.s: $(PS2SDK)/iop/irx/ps2ips.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ps2ips_irx -smbman.s: - $(BIN2S) $(PS2SDK)/iop/irx/smbman.irx $(EE_ASM_DIR)smbman.s smbman_irx +$(EE_ASM_DIR)smbman.s: $(PS2SDK)/iop/irx/smbman.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ smbman_irx -smbinit.s: +modules/network/smbinit/smbinit.irx: modules/network/smbinit echo " -smbinit" - $(MAKE) -C modules/network/smbinit - $(BIN2S) modules/network/smbinit/smbinit.irx $(EE_ASM_DIR)smbinit.s smbinit_irx + $(MAKE) -C $< -ps2atad.s: +$(EE_ASM_DIR)smbinit.s: modules/network/smbinit/smbinit.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ smbinit_irx + +modules/hdd/atad/ps2atad.irx: modules/hdd/atad echo " -ps2atad" - $(MAKE) -C modules/hdd/atad - $(BIN2S) modules/hdd/atad/ps2atad.irx $(EE_ASM_DIR)ps2atad.s ps2atad_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)ps2atad.s: modules/hdd/atad/ps2atad.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ps2atad_irx -hdpro_atad.s: +modules/hdd/hdpro_atad/hdpro_atad.irx: modules/hdd/hdpro_atad echo " -hdpro_atad" - $(MAKE) -C modules/hdd/hdpro_atad - $(BIN2S) modules/hdd/hdpro_atad/hdpro_atad.irx $(EE_ASM_DIR)hdpro_atad.s hdpro_atad_irx + $(MAKE) -C $< -poweroff.s: - $(BIN2S) $(PS2SDK)/iop/irx/poweroff.irx $(EE_ASM_DIR)poweroff.s poweroff_irx +$(EE_ASM_DIR)hdpro_atad.s: modules/hdd/hdpro_atad/hdpro_atad.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ hdpro_atad_irx -ps2hdd.s: +$(EE_ASM_DIR)poweroff.s: $(PS2SDK)/iop/irx/poweroff.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ poweroff_irx + +modules/hdd/apa/ps2hdd.irx: modules/hdd/apa echo " -ps2hdd" - $(MAKE) -C modules/hdd/apa - $(BIN2S) modules/hdd/apa/ps2hdd.irx $(EE_ASM_DIR)ps2hdd.s ps2hdd_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)ps2hdd.s: modules/hdd/apa/ps2hdd.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ps2hdd_irx -genvmc.s: +modules/vmc/genvmc/genvmc.irx: modules/vmc/genvmc echo " -genvmc" - $(MAKE) $(MOD_DEBUG_FLAGS) -C modules/vmc/genvmc - $(BIN2S) modules/vmc/genvmc/genvmc.irx $(EE_ASM_DIR)genvmc.s genvmc_irx + $(MAKE) $(MOD_DEBUG_FLAGS) -C $< -hdldsvr.s: +$(EE_ASM_DIR)genvmc.s: modules/vmc/genvmc/genvmc.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ genvmc_irx + +modules/hdd/hdldsvr/hdldsvr.irx: modules/hdd/hdldsvr echo " -hdldsvr" - $(MAKE) -C modules/hdd/hdldsvr - $(BIN2S) modules/hdd/hdldsvr/hdldsvr.irx $(EE_ASM_DIR)hdldsvr.s hdldsvr_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)hdldsvr.s: modules/hdd/hdldsvr/hdldsvr.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ hdldsvr_irx -udptty.s: +modules/debug/udptty/udptty.irx: modules/debug/udptty echo " -udptty" - $(MAKE) -C modules/debug/udptty - $(BIN2S) modules/debug/udptty/udptty.irx $(EE_ASM_DIR)udptty.s udptty_irx + $(MAKE) -C $< -udptty-ingame.s: +$(EE_ASM_DIR)udptty.s: modules/debug/udptty/udptty.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ udptty_irx + +modules/debug/udptty-ingame/udptty.irx: modules/debug/udptty-ingame echo " -udptty-ingame" - $(MAKE) -C modules/debug/udptty-ingame - $(BIN2S) modules/debug/udptty-ingame/udptty.irx $(EE_ASM_DIR)udptty-ingame.s udptty_ingame_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)udptty-ingame.s: modules/debug/udptty-ingame/udptty.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ udptty_ingame_irx -ioptrap.s: +modules/debug/ioptrap/ioptrap.irx: modules/debug/ioptrap echo " -ioptrap" - $(MAKE) -C modules/debug/ioptrap - $(BIN2S) modules/debug/ioptrap/ioptrap.irx $(EE_ASM_DIR)ioptrap.s ioptrap_irx + $(MAKE) -C $< -ps2link.s: +$(EE_ASM_DIR)ioptrap.s: modules/debug/ioptrap/ioptrap.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ioptrap_irx + +modules/debug/ps2link/ps2link.irx: modules/debug/ps2link echo " -ps2link" - $(MAKE) -C modules/debug/ps2link - $(BIN2S) modules/debug/ps2link/ps2link.irx $(EE_ASM_DIR)ps2link.s ps2link_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)ps2link.s: modules/debug/ps2link/ps2link.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ps2link_irx -nbns-iop.s: +modules/network/nbns/nbns.irx: modules/network/nbns echo " -nbns" - $(MAKE) -C modules/network/nbns - $(BIN2S) modules/network/nbns/nbns.irx $(EE_ASM_DIR)nbns-iop.s nbns_irx + $(MAKE) -C $< -httpclient-iop.s: +$(EE_ASM_DIR)nbns-iop.s: modules/network/nbns/nbns.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ nbns_irx + +modules/network/httpclient/httpclient.irx: modules/network/httpclient echo " -httpclient" - $(MAKE) -C modules/network/httpclient - $(BIN2S) modules/network/httpclient/httpclient.irx $(EE_ASM_DIR)httpclient-iop.s httpclient_irx - -ps2fs.s: + $(MAKE) -C $< + +$(EE_ASM_DIR)httpclient-iop.s: modules/network/httpclient/httpclient.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ httpclient_irx + +modules/hdd/pfs/ps2fs.irx: modules/hdd/pfs echo " -ps2fs" - $(MAKE) -C modules/hdd/pfs - $(BIN2S) modules/hdd/pfs/ps2fs.irx $(EE_ASM_DIR)ps2fs.s ps2fs_irx + $(MAKE) -C $< + +$(EE_ASM_DIR)ps2fs.s: modules/hdd/pfs/ps2fs.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ps2fs_irx -iomanx.s: - $(BIN2S) $(PS2SDK)/iop/irx/iomanX.irx $(EE_ASM_DIR)iomanx.s iomanx_irx +$(EE_ASM_DIR)iomanx.s: $(PS2SDK)/iop/irx/iomanX.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ iomanx_irx -filexio.s: - $(BIN2S) $(PS2SDK)/iop/irx/fileXio.irx $(EE_ASM_DIR)filexio.s filexio_irx +$(EE_ASM_DIR)filexio.s: $(PS2SDK)/iop/irx/fileXio.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ filexio_irx -sio2man.s: - $(BIN2S) $(PS2SDK)/iop/irx/freesio2.irx $(EE_ASM_DIR)sio2man.s sio2man_irx +$(EE_ASM_DIR)sio2man.s: $(PS2SDK)/iop/irx/freesio2.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ sio2man_irx -padman.s: - $(BIN2S) $(PS2SDK)/iop/irx/freepad.irx $(EE_ASM_DIR)padman.s padman_irx +$(EE_ASM_DIR)padman.s: $(PS2SDK)/iop/irx/freepad.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ padman_irx -mcman.s: - $(BIN2S) $(PS2SDK)/iop/irx/mcman.irx $(EE_ASM_DIR)mcman.s mcman_irx +$(EE_ASM_DIR)mcman.s: $(PS2SDK)/iop/irx/mcman.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ mcman_irx -mcserv.s: - $(BIN2S) $(PS2SDK)/iop/irx/mcserv.irx $(EE_ASM_DIR)mcserv.s mcserv_irx +$(EE_ASM_DIR)mcserv.s: $(PS2SDK)/iop/irx/mcserv.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ mcserv_irx -load0.s: - $(BIN2S) gfx/load0.png $(EE_ASM_DIR)load0.s load0_png +$(EE_ASM_DIR)load0.s: gfx/load0.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ load0_png -load1.s: - $(BIN2S) gfx/load1.png $(EE_ASM_DIR)load1.s load1_png +$(EE_ASM_DIR)load1.s: gfx/load1.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ load1_png -load2.s: - $(BIN2S) gfx/load2.png $(EE_ASM_DIR)load2.s load2_png +$(EE_ASM_DIR)load2.s: gfx/load2.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ load2_png -load3.s: - $(BIN2S) gfx/load3.png $(EE_ASM_DIR)load3.s load3_png +$(EE_ASM_DIR)load3.s: gfx/load3.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ load3_png -load4.s: - $(BIN2S) gfx/load4.png $(EE_ASM_DIR)load4.s load4_png +$(EE_ASM_DIR)load4.s: gfx/load4.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ load4_png -load5.s: - $(BIN2S) gfx/load5.png $(EE_ASM_DIR)load5.s load5_png +$(EE_ASM_DIR)load5.s: gfx/load5.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ load5_png -load6.s: - $(BIN2S) gfx/load6.png $(EE_ASM_DIR)load6.s load6_png +$(EE_ASM_DIR)load6.s: gfx/load6.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ load6_png -load7.s: - $(BIN2S) gfx/load7.png $(EE_ASM_DIR)load7.s load7_png +$(EE_ASM_DIR)load7.s: gfx/load7.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ load7_png -logo.s: - $(BIN2S) gfx/logo.png $(EE_ASM_DIR)logo.s logo_png +$(EE_ASM_DIR)logo.s: gfx/logo.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ logo_png -bg_overlay.s: - $(BIN2S) gfx/bg_overlay.png $(EE_ASM_DIR)bg_overlay.s bg_overlay_png +$(EE_ASM_DIR)bg_overlay.s: gfx/bg_overlay.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ bg_overlay_png -usb_icon.s: - $(BIN2S) gfx/usb.png $(EE_ASM_DIR)usb_icon.s usb_png +$(EE_ASM_DIR)usb_icon.s: gfx/usb.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ usb_png -hdd_icon.s: - $(BIN2S) gfx/hdd.png $(EE_ASM_DIR)hdd_icon.s hdd_png +$(EE_ASM_DIR)hdd_icon.s: gfx/hdd.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ hdd_png -eth_icon.s: - $(BIN2S) gfx/eth.png $(EE_ASM_DIR)eth_icon.s eth_png +$(EE_ASM_DIR)eth_icon.s: gfx/eth.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ eth_png -app_icon.s: - $(BIN2S) gfx/app.png $(EE_ASM_DIR)app_icon.s app_png +$(EE_ASM_DIR)app_icon.s: gfx/app.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ app_png -elm_icon.s: - $(BIN2S) gfx/elm.png $(EE_ASM_DIR)elm_icon.s elm_png +$(EE_ASM_DIR)elm_icon.s: gfx/elm.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ elm_png -cross_icon.s: - $(BIN2S) gfx/cross.png $(EE_ASM_DIR)cross_icon.s cross_png +$(EE_ASM_DIR)cross_icon.s: gfx/cross.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ cross_png -triangle_icon.s: - $(BIN2S) gfx/triangle.png $(EE_ASM_DIR)triangle_icon.s triangle_png +$(EE_ASM_DIR)triangle_icon.s: gfx/triangle.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ triangle_png -circle_icon.s: - $(BIN2S) gfx/circle.png $(EE_ASM_DIR)circle_icon.s circle_png +$(EE_ASM_DIR)circle_icon.s: gfx/circle.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ circle_png -square_icon.s: - $(BIN2S) gfx/square.png $(EE_ASM_DIR)square_icon.s square_png +$(EE_ASM_DIR)square_icon.s: gfx/square.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ square_png -select_icon.s: - $(BIN2S) gfx/select.png $(EE_ASM_DIR)select_icon.s select_png +$(EE_ASM_DIR)select_icon.s: gfx/select.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ select_png -start_icon.s: - $(BIN2S) gfx/start.png $(EE_ASM_DIR)start_icon.s start_png +$(EE_ASM_DIR)start_icon.s: gfx/start.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ start_png -left_icon.s: - $(BIN2S) gfx/left.png $(EE_ASM_DIR)left_icon.s left_png +$(EE_ASM_DIR)left_icon.s: gfx/left.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ left_png -right_icon.s: - $(BIN2S) gfx/right.png $(EE_ASM_DIR)right_icon.s right_png +$(EE_ASM_DIR)right_icon.s: gfx/right.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ right_png -up_icon.s: - $(BIN2S) gfx/up.png $(EE_ASM_DIR)up_icon.s up_png +$(EE_ASM_DIR)up_icon.s: gfx/up.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ up_png -down_icon.s: - $(BIN2S) gfx/down.png $(EE_ASM_DIR)down_icon.s down_png +$(EE_ASM_DIR)down_icon.s: gfx/down.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ down_png -L1_icon.s: - $(BIN2S) gfx/L1.png $(EE_ASM_DIR)L1_icon.s L1_png +$(EE_ASM_DIR)L1_icon.s: gfx/L1.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ L1_png -L2_icon.s: - $(BIN2S) gfx/L2.png $(EE_ASM_DIR)L2_icon.s L2_png +$(EE_ASM_DIR)L2_icon.s: gfx/L2.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ L2_png -R1_icon.s: - $(BIN2S) gfx/R1.png $(EE_ASM_DIR)R1_icon.s R1_png +$(EE_ASM_DIR)R1_icon.s: gfx/R1.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ R1_png -R2_icon.s: - $(BIN2S) gfx/R2.png $(EE_ASM_DIR)R2_icon.s R2_png +$(EE_ASM_DIR)R2_icon.s: gfx/R2.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ R2_png -freesans.s: - $(BIN2S) thirdparty/FreeSans_basic_latin.ttf $(EE_ASM_DIR)freesans.s freesansfont_raw +$(EE_ASM_DIR)freesans.s: thirdparty/FreeSans_basic_latin.ttf | $(EE_ASM_DIR) + $(BIN2S) $< $@ freesansfont_raw -icon_sys.s: - $(BIN2S) gfx/icon.sys $(EE_ASM_DIR)icon_sys.s icon_sys +$(EE_ASM_DIR)icon_sys.s: gfx/icon.sys | $(EE_ASM_DIR) + $(BIN2S) $< $@ icon_sys -icon_icn.s: - $(BIN2S) gfx/opl.icn $(EE_ASM_DIR)icon_icn.s icon_icn +$(EE_ASM_DIR)icon_icn.s: gfx/opl.icn | $(EE_ASM_DIR) + $(BIN2S) $< $@ icon_icn -icon_sys_A.s: - $(BIN2S) misc/icon_A.sys $(EE_ASM_DIR)icon_sys_A.s icon_sys_A +$(EE_ASM_DIR)icon_sys_A.s: misc/icon_A.sys | $(EE_ASM_DIR) + $(BIN2S) $< $@ icon_sys_A -icon_sys_J.s: - $(BIN2S) misc/icon_J.sys $(EE_ASM_DIR)icon_sys_J.s icon_sys_J +$(EE_ASM_DIR)icon_sys_J.s: misc/icon_J.sys | $(EE_ASM_DIR) + $(BIN2S) $< $@ icon_sys_J -IOPRP_img.s: - $(BIN2S) modules/iopcore/IOPRP.img $(EE_ASM_DIR)IOPRP_img.s IOPRP_img +$(EE_ASM_DIR)IOPRP_img.s: modules/iopcore/IOPRP.img | $(EE_ASM_DIR) + $(BIN2S) $< $@ IOPRP_img -drvtif_irx.s: - $(BIN2S) modules/debug/drvtif.irx $(EE_ASM_DIR)drvtif_irx.s drvtif_irx +$(EE_ASM_DIR)drvtif_irx.s: modules/debug/drvtif.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ drvtif_irx -tifinet_irx.s: - $(BIN2S) modules/debug/tifinet.irx $(EE_ASM_DIR)tifinet_irx.s tifinet_irx +$(EE_ASM_DIR)tifinet_irx.s: modules/debug/tifinet.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ tifinet_irx -$(EE_OBJS_DIR)%.o : $(EE_SRC_DIR)%.c +$(EE_OBJS_DIR)%.o: $(EE_SRC_DIR)%.c | $(EE_OBJS_DIR) $(EE_CC) $(EE_CFLAGS) $(EE_INCS) -c $< -o $@ -$(EE_OBJS_DIR)%.o : %.s - $(EE_AS) $(EE_ASFLAGS) $(EE_ASM_DIR)$< -o $@ +$(EE_OBJS_DIR)%.o: $(EE_ASM_DIR)%.s | $(EE_OBJS_DIR) + $(EE_AS) $(EE_ASFLAGS) $< -o $@ oplversion: - @echo $(OPLVERSION) + @echo $(OPL_VERSION) include $(PS2SDK)/samples/Makefile.pref include $(PS2SDK)/samples/Makefile.eeglobal diff --git a/README b/README deleted file mode 100755 index c1156d7e4..000000000 --- a/README +++ /dev/null @@ -1,108 +0,0 @@ -# Open PS2 Loader - -Copyright 2013, Ifcaro & jimmikaelkael -Licenced under Academic Free License version 3.0 -Review LICENSE file for further details. - -## Introduction - -Open PS2 Loader (OPL) is a 100% Open source game and application loader for -the PS2 and PS3 units. It supports three categories of devices : USB mass -storage devices, SMB shares and the PlayStation 2 HDD unit. USB devices and -SMB shares support USBExtreme and \*.ISO formats while PS2 HDD supports HDLoader -format. It's now the most compatible homebrew loader. - -OPL is also developed continuously - anyone can contribute improvements to -the project due to its open source nature. - -You can visit the Open PS2 Loader forum at: - -http://psx-scene.com/forums/official-open-ps2-loader-forum/ - -For updated compatibility list, you can visit OPL-CL site at: - -http://sx.sytes.net/oplcl/games.aspx - -## Release types - -Open PS2 Loader bundle included several types of the same OPL version. These -types come with more or less features included. - -| Type (can be a combination) | Description | -| --------------------------- | --------------------------------------------------------------------------------- | -| "Normal" (No suffixes) | Regular, basic OPL release, without any extra features. Aka vanilla build. | -| "Childproof" | OPL release with some controls disabled (e.g. write operations). | -| "VMC" | OPL release with Virtual Memory Card (VMC) support. | -| "GSM" | OPL release with GSM integrated into it. | -| "PS2RD" | OPL release with PS2RD Cheat Engine built-in feature. | - -## How to use - -OPL uses the following directory tree structure across HDD, SMB, and -USB modes: - -| Folder | Description | Modes | -| ------ | ----------- | ----- | -| "CD" | for games on CD media - i.e. blue-bottom discs | USB and SMB | -| "DVD" | for DVD5 and DVD9 images if using the NTFS file system on USB or SMB ; DVD9 images must be split and placed into the device root if using the FAT32 file system on USB or SMB | USB and SMB | -| "VMC" | for Virtual Memory Card images - from 8MB up to 64MB | all | -| "CFG" | for saving per-game configuration files | all | -| "ART" | for game art images | all | -| "THM" | for themes support | all | -| "CHT" | for cheats files | all | -| "CFG-DEV" | for saving per-game configuration files, when used from a OPL dev build - aka beta build | all | - -OPL will automatically create the above directory structure the first time -you launch it and enable your favourite device. For HDD users, a 128Mb +OPL -partition will be created (you can enlarge it using uLaunchELF if you need to). - -## USB - -Game files on USB must be perfectly defragmented either file by file or -by whole drive, and Dual Layer DVD9 images must be split to avoid the 4GB -limitations of the FAT32 file system. We recommend Auslogics Disk Defrag -for best defragging results. - -http://www.auslogics.com/en/software/disk-defrag/ - -You also need a PC program to convert or split games into USB Advance/Extreme -format, such as USBUtil 2.0. - -## SMB - -For loading games by SMB protocol you need to share a folder (ex: PS2SMB) -on the host machine or NAS device and make sure that it has full read and -write permissions. USB Advance/Extreme format is optional - \*.ISO images -are supported using the folder structure above with the added bonus that -DVD9 images don't have to be split if your SMB device uses the NTFS or -EXT3/4 file system. - -## HDD - -For PS2, 48-bit LBA internal HDDs up to 2TB are supported. They have to be -formatted with either HDLoader or uLaunchELF (uLaunchELF is recommended). - -To launch OPL, you can use any of the existing methods for loading an -executable elf. - -On PS3, you need an original SwapMagic 3.6+ or 3.8 disc (at the moment -there aren't any other options). The steps for loading OPL on a PS3 are: - -1. Rename OPNPS2LD.ELF to SMBOOT0.ELF -2. Make a folder in root of USB device called SWAPMAGIC and copy SMBOOT0.ELF to it. -3. Launch SwapMagic in PS3 and press UP+L1 then Open PS2 Loader should start. - -There are 4 forms for launching elfs in SwapMagic. - -SMBOOT0.ELF = UP + L1 -SMBOOT1.ELF = UP + L2 -SMBOOT2.ELF = UP + R1 -SMBOOT3.ELF = UP + R2 - -Note: on PS3, only USB and SMB modes are supported. - -## Some notes for devs - -Open PS2 Loader needs the latest PS2SDK: - -https://github.com/ps2dev/ps2sdk diff --git a/README.md b/README.md index 100b93820..c1156d7e4 120000 --- a/README.md +++ b/README.md @@ -1 +1,108 @@ -README \ No newline at end of file +# Open PS2 Loader + +Copyright 2013, Ifcaro & jimmikaelkael +Licenced under Academic Free License version 3.0 +Review LICENSE file for further details. + +## Introduction + +Open PS2 Loader (OPL) is a 100% Open source game and application loader for +the PS2 and PS3 units. It supports three categories of devices : USB mass +storage devices, SMB shares and the PlayStation 2 HDD unit. USB devices and +SMB shares support USBExtreme and \*.ISO formats while PS2 HDD supports HDLoader +format. It's now the most compatible homebrew loader. + +OPL is also developed continuously - anyone can contribute improvements to +the project due to its open source nature. + +You can visit the Open PS2 Loader forum at: + +http://psx-scene.com/forums/official-open-ps2-loader-forum/ + +For updated compatibility list, you can visit OPL-CL site at: + +http://sx.sytes.net/oplcl/games.aspx + +## Release types + +Open PS2 Loader bundle included several types of the same OPL version. These +types come with more or less features included. + +| Type (can be a combination) | Description | +| --------------------------- | --------------------------------------------------------------------------------- | +| "Normal" (No suffixes) | Regular, basic OPL release, without any extra features. Aka vanilla build. | +| "Childproof" | OPL release with some controls disabled (e.g. write operations). | +| "VMC" | OPL release with Virtual Memory Card (VMC) support. | +| "GSM" | OPL release with GSM integrated into it. | +| "PS2RD" | OPL release with PS2RD Cheat Engine built-in feature. | + +## How to use + +OPL uses the following directory tree structure across HDD, SMB, and +USB modes: + +| Folder | Description | Modes | +| ------ | ----------- | ----- | +| "CD" | for games on CD media - i.e. blue-bottom discs | USB and SMB | +| "DVD" | for DVD5 and DVD9 images if using the NTFS file system on USB or SMB ; DVD9 images must be split and placed into the device root if using the FAT32 file system on USB or SMB | USB and SMB | +| "VMC" | for Virtual Memory Card images - from 8MB up to 64MB | all | +| "CFG" | for saving per-game configuration files | all | +| "ART" | for game art images | all | +| "THM" | for themes support | all | +| "CHT" | for cheats files | all | +| "CFG-DEV" | for saving per-game configuration files, when used from a OPL dev build - aka beta build | all | + +OPL will automatically create the above directory structure the first time +you launch it and enable your favourite device. For HDD users, a 128Mb +OPL +partition will be created (you can enlarge it using uLaunchELF if you need to). + +## USB + +Game files on USB must be perfectly defragmented either file by file or +by whole drive, and Dual Layer DVD9 images must be split to avoid the 4GB +limitations of the FAT32 file system. We recommend Auslogics Disk Defrag +for best defragging results. + +http://www.auslogics.com/en/software/disk-defrag/ + +You also need a PC program to convert or split games into USB Advance/Extreme +format, such as USBUtil 2.0. + +## SMB + +For loading games by SMB protocol you need to share a folder (ex: PS2SMB) +on the host machine or NAS device and make sure that it has full read and +write permissions. USB Advance/Extreme format is optional - \*.ISO images +are supported using the folder structure above with the added bonus that +DVD9 images don't have to be split if your SMB device uses the NTFS or +EXT3/4 file system. + +## HDD + +For PS2, 48-bit LBA internal HDDs up to 2TB are supported. They have to be +formatted with either HDLoader or uLaunchELF (uLaunchELF is recommended). + +To launch OPL, you can use any of the existing methods for loading an +executable elf. + +On PS3, you need an original SwapMagic 3.6+ or 3.8 disc (at the moment +there aren't any other options). The steps for loading OPL on a PS3 are: + +1. Rename OPNPS2LD.ELF to SMBOOT0.ELF +2. Make a folder in root of USB device called SWAPMAGIC and copy SMBOOT0.ELF to it. +3. Launch SwapMagic in PS3 and press UP+L1 then Open PS2 Loader should start. + +There are 4 forms for launching elfs in SwapMagic. + +SMBOOT0.ELF = UP + L1 +SMBOOT1.ELF = UP + L2 +SMBOOT2.ELF = UP + R1 +SMBOOT3.ELF = UP + R2 + +Note: on PS3, only USB and SMB modes are supported. + +## Some notes for devs + +Open PS2 Loader needs the latest PS2SDK: + +https://github.com/ps2dev/ps2sdk diff --git a/docs/README b/docs/README deleted file mode 100644 index ddfedd4c3..000000000 --- a/docs/README +++ /dev/null @@ -1,10 +0,0 @@ -Open PS2 Loader - Docs ----------------------- - -Here will be a place for provide informations about building, making pull -requests, information about bugs reports and others. - -Please make all docs with 80 chars limit. - -Any contribution is welcome, and we will make possible to put your name at -credits and preserve it forever. diff --git a/labs/lanlab/Makefile b/labs/lanlab/Makefile deleted file mode 100755 index 85e6eea33..000000000 --- a/labs/lanlab/Makefile +++ /dev/null @@ -1,42 +0,0 @@ - -EE_BIN = lanlab.elf -EE_OBJS = lanlab.o poweroff.o ps2dev9.o smsutils.o lanman.o iomanx.o filexio.o - -EE_LIBS = -lfileXio -lpatches -ldebug -lc -lkernel -EE_CFLAGS = -g -EE_LDFLAGS = -s - -all: - $(MAKE) $(EE_BIN) - -clean: - $(MAKE) -C ../../modules/dev9 clean - $(MAKE) -C ../../modules/network/SMSUTILS clean - $(MAKE) -C ../../modules/wip/lanman clean - rm -f *.elf *.o *.a *.s - -rebuild: clean all - -poweroff.s: - bin2s $(PS2SDK)/iop/irx/poweroff.irx poweroff.s poweroff_irx - -ps2dev9.s: - $(MAKE) -C ../../modules/dev9 - bin2s ../../modules/dev9/ps2dev9.irx ps2dev9.s ps2dev9_irx - -smsutils.s: - $(MAKE) -C ../../modules/network/SMSUTILS - bin2s ../../modules/network/SMSUTILS/SMSUTILS.irx smsutils.s smsutils_irx - -lanman.s: - $(MAKE) -C ../../modules/wip/lanman - bin2s ../../modules/wip/lanman/lanman.irx lanman.s lanman_irx - -iomanx.s: - bin2s $(PS2SDK)/iop/irx/iomanX.irx iomanx.s iomanx_irx - -filexio.s: - bin2s $(PS2SDK)/iop/irx/fileXio.irx filexio.s filexio_irx - -include $(PS2SDK)/samples/Makefile.pref -include $(PS2SDK)/samples/Makefile.eeglobal diff --git a/labs/lanlab/lanlab.c b/labs/lanlab/lanlab.c deleted file mode 100644 index e264cd47d..000000000 --- a/labs/lanlab/lanlab.c +++ /dev/null @@ -1,127 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define IP_ADDR "192.168.0.10" -#define NETMASK "255.255.255.0" -#define GATEWAY "192.168.0.1" - -extern void poweroff_irx; -extern int size_poweroff_irx; -extern void ps2dev9_irx; -extern int size_ps2dev9_irx; -extern void smsutils_irx; -extern int size_smsutils_irx; -extern void lanman_irx; -extern int size_lanman_irx; -extern void iomanx_irx; -extern int size_iomanx_irx; -extern void filexio_irx; -extern int size_filexio_irx; - -// for IP config -#define IPCONFIG_MAX_LEN 64 -static char g_ipconfig[IPCONFIG_MAX_LEN] __attribute__((aligned(64))); -static int g_ipconfig_len; - -//-------------------------------------------------------------- -void set_ipconfig(void) -{ - memset(g_ipconfig, 0, IPCONFIG_MAX_LEN); - g_ipconfig_len = 0; - - strncpy(&g_ipconfig[g_ipconfig_len], IP_ADDR, 15); - g_ipconfig_len += strlen(IP_ADDR) + 1; - strncpy(&g_ipconfig[g_ipconfig_len], NETMASK, 15); - g_ipconfig_len += strlen(NETMASK) + 1; - strncpy(&g_ipconfig[g_ipconfig_len], GATEWAY, 15); - g_ipconfig_len += strlen(GATEWAY) + 1; -} - -//-------------------------------------------------------------- -int main(int argc, char *argv[2]) -{ - int ret, id; - - init_scr(); - scr_clear(); - scr_printf("\t lanlab\n\n"); - - SifInitRpc(0); - - scr_printf("\t IOP Reset... "); - - while (!SifIopReset("rom0:UDNL rom0:EELOADCNF", 0)) - ; - while (!SifIopSync()) - ; - ; - fioExit(); - SifExitIopHeap(); - SifLoadFileExit(); - SifExitRpc(); - SifExitCmd(); - - SifInitRpc(0); - FlushCache(0); - FlushCache(2); - - SifLoadFileInit(); - SifInitIopHeap(); - - sbv_patch_enable_lmb(); - sbv_patch_disable_prefix_check(); - - SifLoadModule("rom0:SIO2MAN", 0, 0); - SifLoadModule("rom0:MCMAN", 0, 0); - SifLoadModule("rom0:MCSERV", 0, 0); - SifLoadModule("rom0:PADMAN", 0, 0); - - scr_printf("OK\n"); - - set_ipconfig(); - - scr_printf("\t loading iomanX... "); - id = SifExecModuleBuffer(&iomanx_irx, size_iomanx_irx, 0, NULL, &ret); - scr_printf("ret=%d\n", ret); - - scr_printf("\t loading fileXio... "); - id = SifExecModuleBuffer(&filexio_irx, size_filexio_irx, 0, NULL, &ret); - scr_printf("ret=%d\n", ret); - - scr_printf("\t loading poweroff... "); - id = SifExecModuleBuffer(&poweroff_irx, size_poweroff_irx, 0, NULL, &ret); - scr_printf("ret=%d\n", ret); - - scr_printf("\t loading ps2dev9... "); - id = SifExecModuleBuffer(&ps2dev9_irx, size_ps2dev9_irx, 0, NULL, &ret); - scr_printf("ret=%d\n", ret); - - scr_printf("\t loading smsutils... "); - id = SifExecModuleBuffer(&smsutils_irx, size_smsutils_irx, 0, NULL, &ret); - scr_printf("ret=%d\n", ret); - - scr_printf("\t loading lanman... "); - id = SifExecModuleBuffer(&lanman_irx, size_lanman_irx, 0, NULL, &ret); - scr_printf("ret=%d\n", ret); - - scr_printf("\t modules load OK\n"); - - printf("printf test!\n"); - - SleepThread(); - return 0; -} diff --git a/modules/iopcore/cdvdman/Makefile b/modules/iopcore/cdvdman/Makefile new file mode 100644 index 000000000..d337ef4da --- /dev/null +++ b/modules/iopcore/cdvdman/Makefile @@ -0,0 +1,105 @@ +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# $Id: $ + +IOP_OBJS = cdvdman.o streaming.o ioplib_util.o smsutils.o imports.o exports.o + +ifeq ($(USE_HDD),1) +IOP_BIN = hdd_cdvdman.irx +IOP_OBJNAME = hdd. +IOP_OBJS += device-hdd.o dev9.o atad.o +endif + +ifeq ($(USE_HDPRO),1) +IOP_BIN = hdd_hdpro_cdvdman.irx +IOP_OBJNAME = hdpro. +IOP_OBJS += device-hdd.o hdpro_atad.o +endif + +ifeq ($(USE_SMB),1) +IOP_BIN = smb_cdvdman.irx +IOP_OBJNAME = smb. +IOP_OBJS += device-smb.o dev9.o smb.o +endif + +ifeq ($(USE_USB),1) +IOP_BIN = usb_cdvdman.irx +IOP_OBJNAME = usb. +IOP_OBJS += device-usb.o mass_driver.o +ifeq ($(USE_DEV9),1) +IOP_OBJS += dev9.o +else +ifeq ($(IOPCORE_DEBUG),1) +IOP_OBJS += dev9.o +endif +endif +endif + + +IOP_LIBS = +IOP_INCS = -I../common + +ifeq ($(USE_SMB),1) +IOP_INCS += -I../../network/common +endif + +IOP_CFLAGS += -Wall -fno-builtin-printf + +ifeq ($(USE_HDD),1) +IOP_CFLAGS += -DHDD_DRIVER +endif + +ifeq ($(USE_HDPRO),1) +IOP_CFLAGS += -DHDD_DRIVER -DHD_PRO +endif + +ifeq ($(USE_SMB),1) +IOP_CFLAGS += -DSMB_DRIVER +endif + +ifeq ($(USE_USB),1) +IOP_CFLAGS += -DUSB_DRIVER +endif + +ifeq ($(IOPCORE_DEBUG),1) +IOP_CFLAGS += -D__IOPCORE_DEBUG +endif + +ifeq ($(USE_HDPRO),1) +ifeq ($(IOPCORE_DEBUG),1) +IOP_OBJS += dev9.o +endif +endif +ifeq ($(USE_USB),1) +ifeq ($(USE_DEV9),1) +IOP_CFLAGS += -D__USE_DEV9 +else +ifeq ($(IOPCORE_DEBUG),1) +IOP_CFLAGS += -D__USE_DEV9 +endif +endif +endif + +ifeq ($(VMC),1) +IOP_CFLAGS += -DVMC_DRIVER +endif + +IOP_OBJS := $(IOP_OBJS:%=$(IOP_OBJNAME)%) + +IOP_LDFLAGS += -s + +all: $(IOP_BIN) + +clean: + rm -f $(IOP_BIN) $(IOP_OBJS) cdvdman.map + +rebuild: clean all + +include $(PS2SDK)/Defs.make +include Rules.make diff --git a/modules/iopcore/cdvdman/Makefile.hdd b/modules/iopcore/cdvdman/Makefile.hdd deleted file mode 100755 index 0f8ffa1fd..000000000 --- a/modules/iopcore/cdvdman/Makefile.hdd +++ /dev/null @@ -1,35 +0,0 @@ -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: $ - -IOP_BIN = cdvdman.irx -IOP_OBJS = cdvdman.o streaming.o ioplib_util.o smsutils.o device-hdd.o imports.o exports.o -IOP_OBJS += dev9.o atad.o -IOP_LIBS = - -IOP_INCS += -I../common -IOP_CFLAGS += -Wall -fno-builtin-printf -IOP_CFLAGS += -DHDD_DRIVER -ifeq ($(IOPCORE_DEBUG),1) -IOP_CFLAGS += -D__IOPCORE_DEBUG -endif -ifeq ($(VMC),1) -IOP_CFLAGS += -DVMC_DRIVER -endif -IOP_LDFLAGS += -s - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) cdvdman.map - -rebuild: clean all - -include $(PS2SDK)/Defs.make -include ../../Rules.make diff --git a/modules/iopcore/cdvdman/Makefile.hdd.hdpro b/modules/iopcore/cdvdman/Makefile.hdd.hdpro deleted file mode 100755 index b990218d4..000000000 --- a/modules/iopcore/cdvdman/Makefile.hdd.hdpro +++ /dev/null @@ -1,36 +0,0 @@ -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: $ - -IOP_BIN = cdvdman.irx -IOP_OBJS = cdvdman.o streaming.o ioplib_util.o smsutils.o device-hdd.o imports.o exports.o -IOP_OBJS += hdpro_atad.o -IOP_LIBS = - -IOP_INCS += -I../common -IOP_CFLAGS += -Wall -fno-builtin-printf -IOP_CFLAGS += -DHDD_DRIVER -DHD_PRO -ifeq ($(IOPCORE_DEBUG),1) -IOP_OBJS += dev9.o -IOP_CFLAGS += -D__IOPCORE_DEBUG -endif -ifeq ($(VMC),1) -IOP_CFLAGS += -DVMC_DRIVER -endif -IOP_LDFLAGS += -s - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) cdvdman.map - -rebuild: clean all - -include $(PS2SDK)/Defs.make -include ../../Rules.make diff --git a/modules/iopcore/cdvdman/Makefile.smb b/modules/iopcore/cdvdman/Makefile.smb deleted file mode 100755 index 977da5436..000000000 --- a/modules/iopcore/cdvdman/Makefile.smb +++ /dev/null @@ -1,35 +0,0 @@ -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: $ - -IOP_BIN = cdvdman.irx -IOP_OBJS = cdvdman.o streaming.o ioplib_util.o smsutils.o device-smb.o imports.o exports.o -IOP_OBJS += dev9.o smb.o -IOP_LIBS = - -IOP_INCS += -I../common -I../../network/common -IOP_CFLAGS += -Wall -fno-builtin-printf -IOP_CFLAGS += -DSMB_DRIVER -ifeq ($(IOPCORE_DEBUG),1) -IOP_CFLAGS += -D__IOPCORE_DEBUG -endif -ifeq ($(VMC),1) -IOP_CFLAGS += -DVMC_DRIVER -endif -IOP_LDFLAGS += -s - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) cdvdman.map - -rebuild: clean all - -include $(PS2SDK)/Defs.make -include ../../Rules.make diff --git a/modules/iopcore/cdvdman/Makefile.usb b/modules/iopcore/cdvdman/Makefile.usb deleted file mode 100755 index 47ab4fd91..000000000 --- a/modules/iopcore/cdvdman/Makefile.usb +++ /dev/null @@ -1,46 +0,0 @@ -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: $ - -IOP_BIN = cdvdman.irx -IOP_OBJS = cdvdman.o streaming.o ioplib_util.o smsutils.o device-usb.o imports.o exports.o -IOP_OBJS += mass_driver.o -ifeq ($(USE_DEV9),1) -IOP_OBJS += dev9.o -else -ifeq ($(IOPCORE_DEBUG),1) -IOP_OBJS += dev9.o -endif -endif -IOP_LIBS = - -IOP_INCS += -I../common -IOP_CFLAGS += -Wall -fno-builtin-printf -IOP_CFLAGS += -DUSB_DRIVER -ifeq ($(USE_DEV9),1) -IOP_CFLAGS += -D__USE_DEV9 -else -ifeq ($(IOPCORE_DEBUG),1) -IOP_CFLAGS += -D__USE_DEV9 -D__IOPCORE_DEBUG -endif -endif -ifeq ($(VMC),1) -IOP_CFLAGS += -DVMC_DRIVER -endif -IOP_LDFLAGS += -s - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) cdvdman.map - -rebuild: clean all - -include $(PS2SDK)/Defs.make -include ../../Rules.make diff --git a/modules/iopcore/cdvdman/Rules.make b/modules/iopcore/cdvdman/Rules.make new file mode 100644 index 000000000..1551a788c --- /dev/null +++ b/modules/iopcore/cdvdman/Rules.make @@ -0,0 +1,62 @@ +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# $Id$ + +IOP_CC_VERSION := $(shell $(IOP_CC) --version 2>&1 | sed -n 's/^.*(GCC) //p') + +ASFLAGS_TARGET = -mcpu=r3000 + +ifeq ($(IOP_CC_VERSION),3.2.2) +ASFLAGS_TARGET = -march=r3000 +endif + +ifeq ($(IOP_CC_VERSION),3.2.3) +ASFLAGS_TARGET = -march=r3000 +endif + +IOP_INCS := $(IOP_INCS) -I$(PS2SDK)/iop/include -I$(PS2SDK)/common/include -Iinclude + +IOP_CFLAGS := -D_IOP -fno-builtin -O2 -G0 $(IOP_INCS) $(IOP_CFLAGS) +IOP_ASFLAGS := $(ASFLAGS_TARGET) -EL -G0 $(IOP_ASFLAGS) +IOP_LDFLAGS := -nostdlib $(IOP_LDFLAGS) + +BIN2C = $(PS2SDK)/bin/bin2c +BIN2S = $(PS2SDK)/bin/bin2s +BIN2O = $(PS2SDK)/bin/bin2o + +# Externally defined variables: IOP_BIN, IOP_OBJS, IOP_LIB + +$(IOP_OBJNAME)%.o : %.c + $(IOP_CC) $(IOP_CFLAGS) -c $< -o $@ + +$(IOP_OBJNAME)%.o : %.S + $(IOP_CC) $(IOP_CFLAGS) $(IOP_INCS) -c $< -o $@ + +$(IOP_OBJNAME)%.o : %.s + $(IOP_AS) $(IOP_ASFLAGS) $< -o $@ + +# A rule to build imports.lst. +$(IOP_OBJNAME)%.o : %.lst + $(ECHO) "#include \"irx_imports.h\"" > $(IOP_OBJNAME)build-imports.c + cat $< >> $(IOP_OBJNAME)build-imports.c + $(IOP_CC) $(IOP_CFLAGS) -I. -c $(IOP_OBJNAME)build-imports.c -o $@ + -rm -f $(IOP_OBJNAME)build-imports.c + +# A rule to build exports.tab. +$(IOP_OBJNAME)%.o : %.tab + $(ECHO) "#include \"irx.h\"" > $(IOP_OBJNAME)build-exports.c + cat $< >> $(IOP_OBJNAME)build-exports.c + $(IOP_CC) $(IOP_CFLAGS) -I. -c $(IOP_OBJNAME)build-exports.c -o $@ + -rm -f $(IOP_OBJNAME)build-exports.c + +$(IOP_BIN) : $(IOP_OBJS) + $(IOP_CC) $(IOP_CFLAGS) -o $(IOP_BIN) $(IOP_OBJS) $(IOP_LDFLAGS) $(IOP_LIBS) + +$(IOP_LIB) : $(IOP_OBJS) + $(IOP_AR) cru $(IOP_LIB) $(IOP_OBJS) diff --git a/modules/mcemu/Makefile.smb b/modules/mcemu/Makefile old mode 100755 new mode 100644 similarity index 58% rename from modules/mcemu/Makefile.smb rename to modules/mcemu/Makefile index 666c7bdc6..94371536d --- a/modules/mcemu/Makefile.smb +++ b/modules/mcemu/Makefile @@ -6,17 +6,43 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id: Makefile 1 2007-05-08 16:56:27Z polo $ +# $Id: $ -IOP_BIN = mcemu.irx -IOP_OBJS = mcemu.o mcemu_io.o mcemu_sys.o mcemu_var.o mcemu_rpc.o device-smb.o imports.o +IOP_OBJS = mcemu.o mcemu_io.o mcemu_sys.o mcemu_var.o mcemu_rpc.o imports.o +ifeq ($(USE_HDD),1) +IOP_BIN = hdd_mcemu.irx +IOP_OBJNAME = hdd. +IOP_OBJS += device-hdd.o +endif +ifeq ($(USE_SMB),1) +IOP_BIN = smb_mcemu.irx +IOP_OBJNAME = smb. +IOP_OBJS += device-smb.o +endif +ifeq ($(USE_USB),1) +IOP_BIN = usb_mcemu.irx +IOP_OBJNAME = usb. +IOP_OBJS += device-usb.o +endif + +IOP_OBJS := $(IOP_OBJS:%=$(IOP_OBJNAME)%) ifeq ($(IOPCORE_DEBUG),1) IOP_CFLAGS += -DDEBUG endif IOP_CFLAGS += -Wall -fno-builtin + +ifeq ($(USE_HDD),1) +IOP_CFLAGS += -DHDD_DRIVER +endif +ifeq ($(USE_SMB),1) IOP_CFLAGS += -DSMB_DRIVER +endif +ifeq ($(USE_USB),1) +IOP_CFLAGS += -DUSB_DRIVER +endif + IOP_LDFLAGS += -s IOP_INCS += @@ -28,4 +54,4 @@ clean: -rm -f $(IOP_OBJS) $(IOP_BIN) include $(PS2SDK)/Defs.make -include ../Rules.make +include Rules.make diff --git a/modules/mcemu/Makefile.hdd b/modules/mcemu/Makefile.hdd deleted file mode 100755 index d12097512..000000000 --- a/modules/mcemu/Makefile.hdd +++ /dev/null @@ -1,31 +0,0 @@ -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: Makefile 1 2007-05-08 16:56:27Z polo $ - -IOP_BIN = mcemu.irx -IOP_OBJS = mcemu.o mcemu_io.o mcemu_sys.o mcemu_var.o mcemu_rpc.o device-hdd.o imports.o - -ifeq ($(IOPCORE_DEBUG),1) -IOP_CFLAGS += -DDEBUG -endif - -IOP_CFLAGS += -Wall -fno-builtin -IOP_CFLAGS += -DHDD_DRIVER -IOP_LDFLAGS += -s -IOP_INCS += - -all: $(IOP_BIN) - -rebuild: clean all - -clean: - -rm -f $(IOP_OBJS) $(IOP_BIN) - -include $(PS2SDK)/Defs.make -include ../Rules.make diff --git a/modules/mcemu/Makefile.usb b/modules/mcemu/Makefile.usb deleted file mode 100755 index c20150174..000000000 --- a/modules/mcemu/Makefile.usb +++ /dev/null @@ -1,31 +0,0 @@ -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: Makefile 1 2007-05-08 16:56:27Z polo $ - -IOP_BIN = mcemu.irx -IOP_OBJS = mcemu.o mcemu_io.o mcemu_sys.o mcemu_var.o mcemu_rpc.o device-usb.o imports.o - -ifeq ($(IOPCORE_DEBUG),1) -IOP_CFLAGS += -DDEBUG -endif - -IOP_CFLAGS += -Wall -fno-builtin -IOP_CFLAGS += -DUSB_DRIVER -IOP_LDFLAGS += -s -IOP_INCS += - -all: $(IOP_BIN) - -rebuild: clean all - -clean: - -rm -f $(IOP_OBJS) $(IOP_BIN) - -include $(PS2SDK)/Defs.make -include ../Rules.make diff --git a/modules/mcemu/Rules.make b/modules/mcemu/Rules.make new file mode 100644 index 000000000..1551a788c --- /dev/null +++ b/modules/mcemu/Rules.make @@ -0,0 +1,62 @@ +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# $Id$ + +IOP_CC_VERSION := $(shell $(IOP_CC) --version 2>&1 | sed -n 's/^.*(GCC) //p') + +ASFLAGS_TARGET = -mcpu=r3000 + +ifeq ($(IOP_CC_VERSION),3.2.2) +ASFLAGS_TARGET = -march=r3000 +endif + +ifeq ($(IOP_CC_VERSION),3.2.3) +ASFLAGS_TARGET = -march=r3000 +endif + +IOP_INCS := $(IOP_INCS) -I$(PS2SDK)/iop/include -I$(PS2SDK)/common/include -Iinclude + +IOP_CFLAGS := -D_IOP -fno-builtin -O2 -G0 $(IOP_INCS) $(IOP_CFLAGS) +IOP_ASFLAGS := $(ASFLAGS_TARGET) -EL -G0 $(IOP_ASFLAGS) +IOP_LDFLAGS := -nostdlib $(IOP_LDFLAGS) + +BIN2C = $(PS2SDK)/bin/bin2c +BIN2S = $(PS2SDK)/bin/bin2s +BIN2O = $(PS2SDK)/bin/bin2o + +# Externally defined variables: IOP_BIN, IOP_OBJS, IOP_LIB + +$(IOP_OBJNAME)%.o : %.c + $(IOP_CC) $(IOP_CFLAGS) -c $< -o $@ + +$(IOP_OBJNAME)%.o : %.S + $(IOP_CC) $(IOP_CFLAGS) $(IOP_INCS) -c $< -o $@ + +$(IOP_OBJNAME)%.o : %.s + $(IOP_AS) $(IOP_ASFLAGS) $< -o $@ + +# A rule to build imports.lst. +$(IOP_OBJNAME)%.o : %.lst + $(ECHO) "#include \"irx_imports.h\"" > $(IOP_OBJNAME)build-imports.c + cat $< >> $(IOP_OBJNAME)build-imports.c + $(IOP_CC) $(IOP_CFLAGS) -I. -c $(IOP_OBJNAME)build-imports.c -o $@ + -rm -f $(IOP_OBJNAME)build-imports.c + +# A rule to build exports.tab. +$(IOP_OBJNAME)%.o : %.tab + $(ECHO) "#include \"irx.h\"" > $(IOP_OBJNAME)build-exports.c + cat $< >> $(IOP_OBJNAME)build-exports.c + $(IOP_CC) $(IOP_CFLAGS) -I. -c $(IOP_OBJNAME)build-exports.c -o $@ + -rm -f $(IOP_OBJNAME)build-exports.c + +$(IOP_BIN) : $(IOP_OBJS) + $(IOP_CC) $(IOP_CFLAGS) -o $(IOP_BIN) $(IOP_OBJS) $(IOP_LDFLAGS) $(IOP_LIBS) + +$(IOP_LIB) : $(IOP_OBJS) + $(IOP_AR) cru $(IOP_LIB) $(IOP_OBJS) diff --git a/modules/usb/usbhdfsd/usb_driver.c b/modules/usb/usbhdfsd/usb_driver.c index df4d65ec7..fd45ae10a 100644 --- a/modules/usb/usbhdfsd/usb_driver.c +++ b/modules/usb/usbhdfsd/usb_driver.c @@ -1058,9 +1058,9 @@ int InitUSB(void) int i; int ret = 0; for (i = 0; i < NUM_DEVICES; ++i) { - g_mass_device[i].status = 0; + g_mass_device[i].status = 0; g_mass_device[i].devId = -1; - } + } driver.next = NULL; driver.prev = NULL; @@ -1105,10 +1105,11 @@ int UsbMassRegisterCallback(int device, usbmass_cb_t callback) if (device >= 0 && device < NUM_DEVICES) { g_mass_device[device].callback = callback; result = 0; - if(g_mass_device[device].status & USBMASS_DEV_STAT_CONN) { - //If the device is already connected, let the callback know. - if(callback != NULL) callback(USBMASS_DEV_EV_CONN); - } + if (g_mass_device[device].status & USBMASS_DEV_STAT_CONN) { + //If the device is already connected, let the callback know. + if (callback != NULL) + callback(USBMASS_DEV_EV_CONN); + } } else result = -ENODEV; diff --git a/modules/wip/lanman/Makefile b/modules/wip/lanman/Makefile deleted file mode 100755 index 07b733117..000000000 --- a/modules/wip/lanman/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -IOP_BIN = lanman.irx - -IOP_INCS += -IOP_CFLAGS += -Wall -fno-builtin-printf -IOP_CFLAGS += -DUDPTTY -IOP_LDFLAGS += -s - -IOP_OBJS = lanman.o smap.o arp.o tcp.o inet.o imports.o -IOP_OBJS += udptty.o -IOP_LIBS = - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) - -rebuild: clean all - -run: - ps2client -t 1 execiop host:$(IOP_BIN) - - -include $(PS2SDK)/Defs.make -include ../../Rules.make diff --git a/modules/wip/lanman/README b/modules/wip/lanman/README deleted file mode 100755 index 587b7b944..000000000 --- a/modules/wip/lanman/README +++ /dev/null @@ -1,17 +0,0 @@ - -The goal of LANMAN module is to provide a very minimal TCP/IP stack to -OPL for in-game use. - -Here are some of it's current limitations: - - SMAP code doesn't use any buffering for transmit. - - Only receive ARP / TCP (no IP fragments allowed, so care of MTU - and TCP MSS) packets, dropping all other packets not matching these - criterias. - - The tcp code is ugly, not really TCP and is here just for testing, -it needs a full rewrite using threads. - -And some of its features despite limitations: - - It doesn't need to allocate some IOP memory for outgoing ethernet - frames. - - ... diff --git a/modules/wip/lanman/arp.c b/modules/wip/lanman/arp.c deleted file mode 100644 index 5ba5cf226..000000000 --- a/modules/wip/lanman/arp.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#include -#include -#include -#include -#include -#include - -#include "arp.h" -#include "smsutils.h" -#include "smap.h" -#include "inet.h" - -static g_param_t *g_param; - -// ARP - -static int arp_mutex = -1; -static int arp_reply_flag; -static int wait_arp_reply = 0; - -//------------------------------------------------------------------------- -void arp_init(g_param_t *gparam) -{ - g_param = gparam; - - arp_request(); -} - -//------------------------------------------------------------------------- -static void arp_output(u16 opcode, u8 *target_eth_addr) -{ - arp_pkt_t arp_pkt; - - mips_memset(&arp_pkt, 0, sizeof(arp_pkt_t)); - mips_memcpy(arp_pkt.eth.addr_dst, g_param->eth_addr_dst, 12); - arp_pkt.eth.type = 0x0608; // Network byte order: 0x806 - - arp_pkt.arp_hwtype = 0x0100; // Network byte order: 0x01 - arp_pkt.arp_protocoltype = 0x0008; // Network byte order: 0x800 - arp_pkt.arp_hwsize = 6; - arp_pkt.arp_protocolsize = 4; - arp_pkt.arp_opcode = htons(opcode); - mips_memcpy(arp_pkt.arp_sender_eth_addr, g_param->eth_addr_src, 6); - mips_memcpy(&arp_pkt.arp_sender_ip_addr, &g_param->ip_addr_src, 4); - mips_memcpy(arp_pkt.arp_target_eth_addr, target_eth_addr, 6); - mips_memcpy(&arp_pkt.arp_target_ip_addr, &g_param->ip_addr_dst, 4); - - while (smap_xmit(&arp_pkt, sizeof(arp_pkt_t)) != 0) - ; -} - -//------------------------------------------------------------------------- -void arp_input(void *buf, int size) // !!! Intr Context !!! -{ - arp_pkt_t *arp_pkt = (arp_pkt_t *)buf; - - if (arp_pkt->arp_opcode == 0x0200) { // checking for ARP reply - network byte order - - if (wait_arp_reply) { - mips_memcpy(g_param->eth_addr_dst, &arp_pkt->arp_sender_eth_addr[0], 6); - - arp_reply_flag = 1; - iSignalSema(arp_mutex); - } - } else if (arp_pkt->arp_opcode == 0x0100) { // checking for ARP request - network byte order - int i; - for (i = 0; i < 4; i++) { - u8 *p = (u8 *)&g_param->ip_addr_src; - if (arp_pkt->arp_target_ip_addr.addr[i] != p[i]) - break; - } - if (i == 4) - arp_output(ARP_REPLY, g_param->eth_addr_dst); - } -} - -//------------------------------------------------------------------------- -static unsigned int timer_intr_handler(void *args) -{ - iSignalSema(arp_mutex); - - return (unsigned int)args; -} - -//------------------------------------------------------------------------- -void arp_request(void) -{ - iop_sys_clock_t sysclock; - int oldstate; - - arp_mutex = CreateMutex(IOP_MUTEX_LOCKED); - - CpuSuspendIntr(&oldstate); - wait_arp_reply = 1; - CpuResumeIntr(oldstate); - -send_arp_request: - - // Send an ARP resquest - arp_output(ARP_REQUEST, "\x00\x00\x00\x00\x00\x00"); - - USec2SysClock(3000 * 1000, &sysclock); - SetAlarm(&sysclock, timer_intr_handler, NULL); - - // Wait for ARP reply or timeout - WaitSema(arp_mutex); - - //while (QueryIntrContext()) - // DelayThread(10000); - - CpuSuspendIntr(&oldstate); - CancelAlarm(timer_intr_handler, NULL); - if (arp_reply_flag == 0) { // It was a timeout ? - CpuResumeIntr(oldstate); - goto send_arp_request; // yes, retry... - } - wait_arp_reply = 0; - arp_reply_flag = 0; - CpuResumeIntr(oldstate); - - DeleteSema(arp_mutex); - arp_mutex = -1; -} diff --git a/modules/wip/lanman/arp.h b/modules/wip/lanman/arp.h deleted file mode 100644 index b9b738552..000000000 --- a/modules/wip/lanman/arp.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#ifndef ARP_H -#define ARP_H - -#include - -#include "lanman.h" -#include "eth.h" -#include "ip.h" - -#define ARP_REQUEST 0x01 -#define ARP_REPLY 0x02 - -typedef struct -{ - // Ethernet (14) - eth_hdr_t eth; - - // ARP (28) - u16 arp_hwtype; - u16 arp_protocoltype; - u8 arp_hwsize; - u8 arp_protocolsize; - u16 arp_opcode; - u8 arp_sender_eth_addr[6]; - ip_addr_t arp_sender_ip_addr; - u8 arp_target_eth_addr[6]; - ip_addr_t arp_target_ip_addr; -} arp_pkt_t __attribute__((packed)); - -void arp_init(g_param_t *gparam); -void arp_input(void *buf, int size); -void arp_request(void); - -#endif /* ARP_H */ diff --git a/modules/wip/lanman/eth.h b/modules/wip/lanman/eth.h deleted file mode 100644 index 9ee11a2a5..000000000 --- a/modules/wip/lanman/eth.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#ifndef ETH_H -#define ETH_H - -#include - -typedef struct -{ - // Ethernet header (14) - u8 addr_dst[6]; - u8 addr_src[6]; - u16 type; -} eth_hdr_t; - -#endif /* ETH_H */ diff --git a/modules/wip/lanman/imports.lst b/modules/wip/lanman/imports.lst deleted file mode 100755 index 08ec44bea..000000000 --- a/modules/wip/lanman/imports.lst +++ /dev/null @@ -1,53 +0,0 @@ - -thbase_IMPORTS_start -I_DelayThread -I_CreateThread -I_StartThread -I_SetAlarm -I_iSetAlarm -I_CancelAlarm -I_USec2SysClock -I_GetSystemTime -thbase_IMPORTS_end - -thsemap_IMPORTS_start -I_CreateSema -I_DeleteSema -I_SignalSema -I_iSignalSema -I_WaitSema -thsemap_IMPORTS_end - -dev9_IMPORTS_start -I_dev9IntrDisable -I_dev9IntrEnable -I_dev9RegisterIntrCb -I_dev9GetEEPROM -dev9_IMPORTS_end - -intrman_IMPORTS_start -I_CpuSuspendIntr -I_CpuResumeIntr -I_CpuEnableIntr -I_EnableIntr -I_QueryIntrContext -intrman_IMPORTS_end - -#ifdef UDPTTY -ioman_IMPORTS_start -I_open -I_close -I_AddDrv -I_DelDrv -ioman_IMPORTS_end -#endif - -stdio_IMPORTS_start -I_printf -stdio_IMPORTS_end - -smsutils_IMPORTS_start -I_mips_memset -I_mips_memcpy -smsutils_IMPORTS_end - diff --git a/modules/wip/lanman/inet.h b/modules/wip/lanman/inet.h deleted file mode 100755 index 3a7cfcd44..000000000 --- a/modules/wip/lanman/inet.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#ifndef INET_H -#define INET_H - -#include - -#include "ip.h" - -u16 htons(u16); -u16 ntohs(u16); -u32 htonl(u32); -u32 ntohl(u32); -u32 htona(u8 *); -u32 ntoha(u8 *); -u16 inet_chksum(ip_hdr_t *, u16); -u16 inet_chksum_pseudo(void *, u32 *, u32 *, u16); - -#endif /* INET_H */ diff --git a/modules/wip/lanman/inet.s b/modules/wip/lanman/inet.s deleted file mode 100755 index dff9d46d0..000000000 --- a/modules/wip/lanman/inet.s +++ /dev/null @@ -1,356 +0,0 @@ -# ___ _ _ ___ -# | | | | | -# ___| | | ___| PS2DEV Open Source Project. -#---------------------------------------------------------- -# (c) 2006 Eugene Plotnikov -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -.set noreorder -.set nomacro - -.globl ip_cksum -.globl inet_chksum -.globl inet_chksum_pseudo -.globl htons -.globl ntohs -.globl htonl -.globl ntohl -.globl htona -.globl ntoha - -.section ".bss" -s_Str: .space 16 - -.text - -htons : -ntohs : -_htons: - andi $v1, $a0, 0xFFFF - andi $a1, $v1, 0xFF - sll $v0, $a1, 8 - srl $a0, $v1, 8 - jr $ra - or $v0, $v0, $a0 - -htonl : -_htonl: -ntohl : - andi $t1, $a0, 0xFF00 - sll $t0, $a0, 24 - srl $a3, $a0, 8 - sll $a1, $t1, 8 - or $a2, $t0, $a1 - andi $v1, $a3, 0xFF00 - or $v0, $a2, $v1 - srl $a0, $a0, 24 - jr $ra - or $v0, $v0, $a0 - -htona : -_htona: -ntoha : - lbu $t0, 0($a0) - lbu $t1, 1($a0) - lbu $t2, 2($a0) - lbu $t3, 3($a0) - move $v0, $zero - andi $t0, $t0, 0xFF - or $v0, $v0, $t0 - sll $v0, $v0, 24 - andi $t1, $t1, 0xFF - sll $t1, $t1, 16 - or $v0, $v0, $t1 - andi $t2, $t2, 0xFF - sll $t2, $t2, 8 - or $v0, $v0, $t2 - andi $t3, $t3, 0xFF - jr $ra - or $v0, $v0, $t3 - -ip_cksum : -_ip_cksum: - andi $v0, $a0, 0x3 - move $t0, $a0 - move $t1, $a1 - move $a0, $zero - move $t3, $zero - move $t2, $zero - beqz $v0, 1f - move $t4, $zero - slti $v1, $a1, 3 - bnez $v1, 2f - andi $a1, $t0, 0x1 - bnez $a1, 3f - nop -14: - andi $a3, $t0, 0x2 - beqz $a3, 4f - slti $t6, $t1, 72 - lhu $t5, 0($t0) - addiu $t1, $t1, -2 - addu $t2, $t2, $t5 - addiu $t0, $t0, 2 -1: - slti $t6, $t1, 72 -4: - bnez $t6, 5f - nop - lw $v1, 0($t0) - lw $a3, 4($t0) -6: - lw $a1, 8($t0) - srl $t7, $v1, 16 - addu $t5, $t3, $t7 - lw $t9, 12($t0) - addu $v1, $a0, $v1 - srl $t6, $a3, 16 - addu $a2, $t5, $t6 - addu $t3, $v1, $a3 - lw $t5, 16($t0) - srl $a3, $a1, 16 - addu $v0, $a2, $a3 - addu $t8, $t3, $a1 - srl $a0, $t9, 16 - lw $a1, 20($t0) - addu $t6, $v0, $a0 - addu $v1, $t8, $t9 - srl $t7, $t5, 16 - lw $t9, 24($t0) - addu $a2, $t6, $t7 - addu $t3, $v1, $t5 - srl $a3, $a1, 16 - lw $t5, 28($t0) - addu $v0, $a2, $a3 - addu $t8, $t3, $a1 - srl $a0, $t9, 16 - lw $a1, 32($t0) - addu $t6, $v0, $a0 - addu $v1, $t8, $t9 - srl $t7, $t5, 16 - lw $t9, 36($t0) - addu $a2, $t6, $t7 - addu $t3, $v1, $t5 - srl $a3, $a1, 16 - lw $t5, 40($t0) - addu $v0, $a2, $a3 - addu $t8, $t3, $a1 - srl $a0, $t9, 16 - lw $a1, 44($t0) - addu $t6, $v0, $a0 - addu $v1, $t8, $t9 - srl $t7, $t5, 16 - lw $t9, 48($t0) - addu $a2, $t6, $t7 - addu $t3, $v1, $t5 - srl $a3, $a1, 16 - lw $t5, 52($t0) - addu $v0, $a2, $a3 - addu $t8, $t3, $a1 - srl $a0, $t9, 16 - lw $a1, 56($t0) - addu $v1, $t8, $t9 - addu $t6, $v0, $a0 - lw $t8, 60($t0) - srl $t7, $t5, 16 - addu $t3, $v1, $t5 - addu $a2, $t6, $t7 - srl $a3, $a1, 16 - addiu $t1, $t1, -64 - addu $v0, $a2, $a3 - addu $t9, $t3, $a1 - srl $a0, $t8, 16 - slti $t7, $t1, 72 - addu $t3, $v0, $a0 - lw $v1, 64($t0) - lw $a3, 68($t0) - addu $a0, $t9, $t8 - beqz $t7, 6b - addiu $t0, $t0, 64 - sll $v0, $t3, 16 - subu $t9, $a0, $v0 - addu $t8, $t2, $t9 - addu $t2, $t8, $t3 -5: - slti $a0, $t1, 4 - move $a1, $zero - bnez $a0, 7f - move $a2, $zero -8: - lw $a3, 0($t0) - addiu $t1, $t1, -4 - srl $v1, $a3, 16 - slti $t3, $t1, 4 - addu $a2, $a2, $v1 - addiu $t0, $t0, 4 - beqz $t3, 8b - addu $a1, $a1, $a3 -7: - sll $t6, $a2, 16 - subu $t5, $a1, $t6 - addu $a1, $t2, $t5 - slti $v1, $t1, 2 - b 9f - addu $t2, $a1, $a2 -10: - lhu $a2, 0($t0) - addiu $t1, $t1, -2 - slti $v1, $t1, 2 - addu $t2, $t2, $a2 - addiu $t0, $t0, 2 -9: - beqz $v1, 10b - nop -2: - blez $t1, 11f - addiu $a0, $t1, -1 -12: - lbu $t7, 0($t0) - move $t1, $a0 - addu $t2, $t2, $t7 - addiu $t0, $t0, 1 - bgtz $t1, 12b - addiu $a0, $a0, -1 -11: - srl $v1, $t2, 16 - beqz $t4, 13f - andi $v0, $t2, 0xFFFF - srl $t3, $t2, 16 - andi $a0, $t2, 0xFFFF - addu $v0, $a0, $t3 - srl $t9, $v0, 16 - andi $t8, $v0, 0xFFFF - addu $t4, $t8, $t9 - andi $t0, $t4, 0xFF - srl $t2, $t4, 8 - andi $v0, $t2, 0xFF - sll $v1, $t0, 8 -13: - addu $a1, $v0, $v1 - srl $v1, $a1, 16 - andi $a3, $a1, 0xFFFF - jr $ra - addu $v0, $a3, $v1 -3: - lbu $a2, 0($t0) - addiu $t1, $t1, -1 - sll $t2, $a2, 8 - addiu $t0, $t0, 1 - b 14b - li $t4, 1 - -inet_chksum: - addiu $sp, $sp, -8 - sw $ra, 0($sp) - bal _ip_cksum - andi $a1, $a1, 0xFFFF - b 1f - srl $v1, $v0, 16 -2: - andi $v0, $v0, 0xFFFF - addu $v0, $v0, $v1 - srl $v1, $v0, 16 -1: - bnez $v1, 2b - nop - nor $v1, $zero, $v0 - lw $ra, 0($sp) - andi $v0, $v1, 0xFFFF - jr $ra - addiu $sp, $sp, 8 - -inet_chksum_pseudo: - addiu $sp, $sp, -56 - sw $s7, 44($sp) - sw $s6, 40($sp) - sw $s4, 32($sp) - sw $s3, 28($sp) - sw $s2, 24($sp) - sw $s1, 20($sp) - sw $s0, 16($sp) - sw $ra, 48($sp) - sw $s5, 36($sp) - move $s0, $a0 - move $s3, $a1 - move $s4, $a2 - addiu $s6, $zero, 6 #IP_PROTO_TCP - move $s7, $a3 - andi $s7, $s7, 0xFFFF #tot_len - move $s1, $zero - beqz $a0, 1f - move $s2, $zero - li $s5, 1 -5: - move $a0, $s0 #<-- payload - bal _ip_cksum - move $a1, $s7 #<-- len - b 2f - addu $s1, $s1, $v0 -3: - addu $s1, $v0, $a0 -2: - srl $a0, $s1, 16 - bnez $a0, 3b - andi $v0, $s1, 0xFFFF - move $a0, $s7 #<-- len - nop - andi $v1, $a0, 1 - beqz $v1, 4f - andi $t0, $s1, 0xFF00 - andi $t1, $s1, 0xFF - subu $a1, $s5, $s2 - sll $a3, $t1, 8 - srl $a2, $t0, 8 - or $s1, $a3, $a2 - andi $s2, $a1, 0xFF -4: - beqz $s2, 1f - andi $t4, $s1, 0xFF00 - andi $t5, $s1, 0xFF - sll $t3, $t5, 8 - srl $t2, $t4, 8 - or $s1, $t3, $t2 -1: - lwl $v1, 3($s3) - lwl $ra, 3($s3) - lwr $v1, 0($s3) - lwl $s5, 3($s4) - lwr $ra, 0($s3) - lwl $s2, 3($s4) - andi $v0, $v1, 0xFFFF - lwr $s5, 0($s4) - addu $t8, $s1, $v0 - srl $t9, $ra, 16 - lwr $s2, 0($s4) - addu $s3, $t8, $t9 - andi $s4, $s5, 0xFFFF - addu $t6, $s3, $s4 - srl $t7, $s2, 16 - move $a0, $s6 - bal _htons - addu $s1, $t6, $t7 - move $a0, $s7 - bal _htons - addu $s0, $s1, $v0 - b 6f - addu $v0, $s0, $v0 -7: - addu $v0, $s6, $a0 -6: - srl $a0, $v0, 16 - bnez $a0, 7b - andi $s6, $v0, 0xFFFF - nor $s7, $zero, $v0 - andi $v0, $s7, 0xFFFF - lw $ra, 48($sp) - lw $s7, 44($sp) - lw $s6, 40($sp) - lw $s5, 36($sp) - lw $s4, 32($sp) - lw $s3, 28($sp) - lw $s2, 24($sp) - lw $s1, 20($sp) - lw $s0, 16($sp) - jr $ra - addiu $sp, $sp, 56 diff --git a/modules/wip/lanman/ip.h b/modules/wip/lanman/ip.h deleted file mode 100644 index 7a761d690..000000000 --- a/modules/wip/lanman/ip.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#ifndef IP_H -#define IP_H - -#include - -typedef struct -{ - u8 addr[4]; -} ip_addr_t __attribute__((packed)); - -typedef struct -{ - // IP header (20) - u8 hlen; - u8 tos; - u16 len; - u16 id; - u8 flags; - u8 frag_offset; - u8 ttl; - u8 proto; - u16 csum; - ip_addr_t addr_src; - ip_addr_t addr_dst; -} ip_hdr_t; - -#endif /* IP_H */ diff --git a/modules/wip/lanman/irx_imports.h b/modules/wip/lanman/irx_imports.h deleted file mode 100755 index 35a2cd072..000000000 --- a/modules/wip/lanman/irx_imports.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: irx_imports.h 629 2004-10-11 00:45:00Z mrbrown $ -# Defines all IRX imports. -*/ - -#ifndef IOP_IRX_IMPORTS_H -#define IOP_IRX_IMPORTS_H - -#include "irx.h" - -/* Please keep these in alphabetical order! */ -#include "dev9.h" -#include "ioman.h" -#include "intrman.h" -#include "stdio.h" -#include "smsutils.h" -#include "thbase.h" -#include "thsemap.h" - -#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/wip/lanman/lanman.c b/modules/wip/lanman/lanman.c deleted file mode 100644 index 963b37cf4..000000000 --- a/modules/wip/lanman/lanman.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#include -#include -#include - -#include "lanman.h" -#include "arp.h" -#include "tcp.h" -#include "smap.h" -#include "udptty.h" - -#define MODNAME "lanman" -IRX_ID(MODNAME, 1, 1); - -static g_param_t g_param = { - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // needed for broadcast - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - IP_ADDR(192, 168, 0, 2), - IP_ADDR(192, 168, 0, 10), - IP_PORT(445), - IP_PORT(0x4712)}; - -//------------------------------------------------------------------------- -int _start(int argc, char *argv[]) -{ - // Init SMAP - if (smap_init(&g_param.eth_addr_src[0]) != 0) - return MODULE_NO_RESIDENT_END; - - // Does ARP request and wait reply to get server MAC address - arp_init(&g_param); - -#ifdef UDPTTY - // Init UDP tty - ttyInit(&g_param); -#endif - - // Init TCPIP layer - tcp_init(&g_param); - - tcp_connect(); - - return MODULE_RESIDENT_END; -} diff --git a/modules/wip/lanman/lanman.h b/modules/wip/lanman/lanman.h deleted file mode 100644 index a4b49e91a..000000000 --- a/modules/wip/lanman/lanman.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#ifndef LANMAN_H -#define LANMAN_H - -#include - -/* These automatically convert the address and port to network order. */ -#define IP_ADDR(a, b, c, d) (((d & 0xff) << 24) | ((c & 0xff) << 16) | \ - ((b & 0xff) << 8) | ((a & 0xff))) -#define IP_PORT(port) (((port & 0xff00) >> 8) | ((port & 0xff) << 8)) - -typedef struct -{ - u8 eth_addr_dst[6]; - u8 eth_addr_src[6]; - u32 ip_addr_dst; - u32 ip_addr_src; - u16 ip_port_dst; - u16 ip_port_src; -} g_param_t; - -#endif /* LANMAN_H */ diff --git a/modules/wip/lanman/smap.c b/modules/wip/lanman/smap.c deleted file mode 100644 index 7834b592c..000000000 --- a/modules/wip/lanman/smap.c +++ /dev/null @@ -1,595 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Copyright (c) 2003 Marcus R. Brown - Licenced under Academic Free License version 3.0 - Review OpenPS2Loader README & LICENSE files for further details. - - Code originally based on SMAP driver sources found in UDPTTY driver. - Optimized mips functions from Eugene Plotnikov. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "smsutils.h" -#include "smap.h" -#include "ip.h" -#include "arp.h" -#include "tcp.h" -#include "inet.h" - -#define SMAP_RX_BUFSIZE 16384 -#define SMAP_RX_BASE 0x4000 -#define SMAP_RX_MINSIZE 14 // Ethernet header size -#define SMAP_RX_MAXSIZE (6 + 6 + 2 + 1500 + 4) -#define SMAP_TX_MAXSIZE (6 + 6 + 2 + 1500) - -#define SMAP_BD_NEXT(x) (x) = (x) < (SMAP_BD_MAX_ENTRY - 1) ? (x) + 1 : 0 - -// TX descriptor -typedef struct -{ - u16 txwp_start; - u16 txwp_end; - u8 txbdi_start; - u8 txbdi_end; -} smap_tx_stat_t; - -static smap_tx_stat_t tx_stat; - -// RX descriptor -typedef struct -{ - u8 rxbdi; // Index into current RX BD - u8 pad[3]; -} smap_rx_stat_t; - -static smap_rx_stat_t rx_stat; - -static int smap_xmit_mutex = -1; - -static u8 rcpt_buf[SMAP_RX_MAXSIZE] __attribute__((aligned(64))); - -//------------------------------------------------------------------------- -void smap_CopyToFIFO(u16, u32 *, int); -__asm__( - ".set noreorder\n\t" - ".set nomacro\n\t" - ".set noat\n\t" - ".text\n\t" - "smap_CopyToFIFO:\n\t" - "srl $at, $a2, 4\n\t" - "lui $v1, 0xB000\n\t" - "sh $a0, 4100($v1)\n\t" - "beqz $at, 3f\n\t" - "andi $a2, $a2, 0xF\n\t" - "4:\n\t" - "lwr $t0, 0($a1)\n\t" - "lwl $t0, 3($a1)\n\t" - "lwr $t1, 4($a1)\n\t" - "lwl $t1, 7($a1)\n\t" - "lwr $t2, 8($a1)\n\t" - "lwl $t2, 11($a1)\n\t" - "lwr $t3, 12($a1)\n\t" - "lwl $t3, 15($a1)\n\t" - "addiu $at, $at, -1\n\t" - "sw $t0, 4352($v1)\n\t" - "sw $t1, 4352($v1)\n\t" - "sw $t2, 4352($v1)\n\t" - "addiu $a1, $a1, 16\n\t" - "bgtz $at, 4b\n\t" - "sw $t3, 4352($v1)\n\t" - "3:\n\t" - "beqz $a2, 1f\n\t" - "nop\n\t" - "2:\n\t" - "lwr $v0, 0($a1)\n\t" - "lwl $v0, 3($a1)\n\t" - "addiu $a2, $a2, -4\n\t" - "sw $v0, 4352($v1)\n\t" - "bnez $a2, 2b\n\t" - "addiu $a1, $a1, 4\n\t" - "1:\n\t" - "jr $ra\n\t" - "nop\n\t" - ".set at\n\t" - ".set macro\n\t" - ".set reorder\n\t"); - -//------------------------------------------------------------------------- -void smap_CopyFromFIFO(u16, u32 *, int); -__asm__( - ".set noreorder\n\t" - ".set nomacro\n\t" - ".set noat\n\t" - ".text\n\t" - "smap_CopyFromFIFO:\n\t" - "li $v0, -4\n\t" - "lui $a3, 0xB000\n\t" - "addiu $v1, $a2, 3\n\t" - "and $v1, $v1, $v0\n\t" - "srl $at, $v1, 5\n\t" - "sh $a0, 4148($a3)\n\t" - "beqz $at, 3f\n\t" - "andi $v1, $v1, 0x1F\n\t" - "4:\n\t" - "lw $t0, 4608($a3)\n\t" - "lw $t1, 4608($a3)\n\t" - "lw $t2, 4608($a3)\n\t" - "lw $t3, 4608($a3)\n\t" - "lw $t4, 4608($a3)\n\t" - "lw $t5, 4608($a3)\n\t" - "lw $t6, 4608($a3)\n\t" - "lw $t7, 4608($a3)\n\t" - "addiu $at, $at, -1\n\t" - "sw $t0, 0($a1)\n\t" - "sw $t1, 4($a1)\n\t" - "sw $t2, 8($a1)\n\t" - "sw $t3, 12($a1)\n\t" - "sw $t4, 16($a1)\n\t" - "sw $t5, 20($a1)\n\t" - "sw $t6, 24($a1)\n\t" - "sw $t7, 28($a1)\n\t" - "bgtz $at, 4b\n\t" - "addiu $a1, $a1, 32\n\t" - "3:\n\t" - "beqz $v1, 1f\n\t" - "nop\n\t" - "2:\n\t" - "lw $v0, 4608($a3)\n\t" - "addiu $v1, $v1, -4\n\t" - "sw $v0, 0($a1)\n\t" - "bnez $v1, 2b\n\t" - "addiu $a1, $a1, 4\n\t" - "1:\n\t" - "jr $ra\n\t" - "nop\n\t" - ".set at\n\t" - ".set macro\n\t" - ".set reorder\n\t"); - -//------------------------------------------------------------------------- -static int smap_phy_read(int reg, u16 *data) -{ - USE_SMAP_EMAC3_REGS; - u32 i, val; - - val = SMAP_E3_PHY_READ | (SMAP_DsPHYTER_ADDRESS << SMAP_E3_PHY_ADDR_BITSFT) | - (reg & SMAP_E3_PHY_REG_ADDR_MSK); - SMAP_EMAC3_SET(SMAP_R_EMAC3_STA_CTRL, val); - - // Wait for the read operation to complete - for (i = 0; i < 100; i++) { - if (SMAP_EMAC3_GET(SMAP_R_EMAC3_STA_CTRL) & SMAP_E3_PHY_OP_COMP) - break; - DelayThread(1000); - } - if (i == 100 || !data) - return 1; - - *data = SMAP_EMAC3_GET(SMAP_R_EMAC3_STA_CTRL) >> SMAP_E3_PHY_DATA_BITSFT; - return 0; -} - -//------------------------------------------------------------------------- -static int smap_phy_write(int reg, u16 data) -{ - USE_SMAP_EMAC3_REGS; - u32 i, val; - - val = ((data & SMAP_E3_PHY_DATA_MSK) << SMAP_E3_PHY_DATA_BITSFT) | - SMAP_E3_PHY_WRITE | (SMAP_DsPHYTER_ADDRESS << SMAP_E3_PHY_ADDR_BITSFT) | - (reg & SMAP_E3_PHY_REG_ADDR_MSK); - SMAP_EMAC3_SET(SMAP_R_EMAC3_STA_CTRL, val); - - // Wait for the write operation to complete - for (i = 0; i < 100; i++) { - if (SMAP_EMAC3_GET(SMAP_R_EMAC3_STA_CTRL) & SMAP_E3_PHY_OP_COMP) - break; - DelayThread(1000); - } - return (i == 100); -} - -//------------------------------------------------------------------------- -static int smap_phy_init(void) -{ - USE_SMAP_EMAC3_REGS; - u32 val; - int i; - u16 phydata, idr1, idr2; - - // Reset the PHY - smap_phy_write(SMAP_DsPHYTER_BMCR, SMAP_PHY_BMCR_RST); - // Wait for it to come out of reset - for (i = 9; i; i--) { - smap_phy_read(SMAP_DsPHYTER_BMCR, &phydata); - if (!(phydata & SMAP_PHY_BMCR_RST)) - break; - DelayThread(1000); - } - if (!i) - return 1; - - // Confirm link status - i = 5000; - while (--i) { - smap_phy_read(SMAP_DsPHYTER_BMSR, &phydata); - if (phydata & SMAP_PHY_BMSR_LINK) - break; - DelayThread(1000); - } - - smap_phy_write(SMAP_DsPHYTER_BMCR, SMAP_PHY_BMCR_100M | SMAP_PHY_BMCR_DUPM); - - i = 2000; - while (--i) - DelayThread(1000); - - // Force 100 Mbps full duplex mode - val = SMAP_EMAC3_GET(SMAP_R_EMAC3_MODE1); - val |= (SMAP_E3_FDX_ENABLE | SMAP_E3_FLOWCTRL_ENABLE | SMAP_E3_ALLOW_PF); - val &= ~SMAP_E3_MEDIA_MSK; - val |= SMAP_E3_MEDIA_100M; - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE1, val); - - // DSP setup - smap_phy_read(SMAP_DsPHYTER_PHYIDR1, &idr1); - smap_phy_read(SMAP_DsPHYTER_PHYIDR2, &idr2); - - if (idr1 == SMAP_PHY_IDR1_VAL && - ((idr2 & SMAP_PHY_IDR2_MSK) == SMAP_PHY_IDR2_VAL)) { - smap_phy_read(SMAP_DsPHYTER_PHYSTS, &phydata); - if (phydata & SMAP_PHY_STS_10M) - smap_phy_write(0x1a, 0x104); - - smap_phy_write(0x13, 0x0001); - smap_phy_write(0x19, 0x1898); - smap_phy_write(0x1f, 0x0000); - smap_phy_write(0x1d, 0x5040); - smap_phy_write(0x1e, 0x008c); - smap_phy_write(0x13, 0x0000); - } - - return 0; -} - -//------------------------------------------------------------------------- -int smap_xmit(void *buf, int size) -{ - USE_SMAP_REGS; - USE_SMAP_EMAC3_REGS; - USE_SMAP_TX_BD; - int txlen, r = 0; - - WaitSema(smap_xmit_mutex); - - // Get total length of the packet - if (size > SMAP_TX_MAXSIZE) { - r = 1; - goto ssema; - } - - txlen = (size + 3) & 0xfffc; - - // Get free mem in TX - int txfree = ((tx_stat.txwp_start > tx_stat.txwp_end) ? - (SMAP_TX_BUFSIZE + tx_stat.txwp_end - tx_stat.txwp_start) : - (SMAP_TX_BUFSIZE - tx_stat.txwp_end + tx_stat.txwp_start)); - if (txlen > txfree) { - r = 2; - goto ssema; - } - - // Check EMAC is ready - if (SMAP_EMAC3_GET(SMAP_R_EMAC3_TxMODE0) & SMAP_E3_TX_GNP_0) { - r = 2; - goto ssema; - } - - // Send from mem -> FIFO - smap_CopyToFIFO(tx_stat.txwp_end, buf, txlen); - - // FIFO -> ethernet - tx_bd[tx_stat.txbdi_end].length = size; - tx_bd[tx_stat.txbdi_end].pointer = tx_stat.txwp_end + SMAP_TX_BASE; - SMAP_REG8(SMAP_R_TXFIFO_FRAME_INC) = 1; - tx_bd[tx_stat.txbdi_end].ctrl_stat = SMAP_BD_TX_READY | SMAP_BD_TX_GENFCS | SMAP_BD_TX_GENPAD; - - SMAP_EMAC3_SET(SMAP_R_EMAC3_TxMODE0, SMAP_E3_TX_GNP_0); - - // Update tx pointers - tx_stat.txwp_end = (tx_stat.txwp_end + txlen) % SMAP_TX_BUFSIZE; - SMAP_BD_NEXT(tx_stat.txbdi_end); - -ssema: - SignalSema(smap_xmit_mutex); - - return r; -} - -//------------------------------------------------------------------------- -static int smap_tx_intr(int irq) -{ - USE_SMAP_REGS; - USE_SMAP_TX_BD; - register int txbdi, stat; - register int ret = 1; - - // Clear irq - SMAP_REG16(SMAP_R_INTR_CLR) = irq & SMAP_INTR_BITMSK; - - while (tx_stat.txbdi_start != tx_stat.txbdi_end) { - - txbdi = tx_stat.txbdi_start; - stat = tx_bd[txbdi].ctrl_stat; - - if (stat & SMAP_BD_TX_ERROR) - ret = 0; - - if (stat & SMAP_BD_TX_READY) - goto out; - - tx_stat.txwp_start = (tx_stat.txwp_start + ((tx_bd[txbdi].length + 3) & 0xfffc)) % SMAP_TX_BUFSIZE; - SMAP_BD_NEXT(tx_stat.txbdi_start); - - tx_bd[txbdi].ctrl_stat = 0; - tx_bd[txbdi].reserved = 0; - tx_bd[txbdi].length = 0; - } - - tx_stat.txbdi_start = tx_stat.txbdi_end; - -out: - return ret; -} - -//------------------------------------------------------------------------- -static int smap_rx_intr(int irq) -{ - USE_SMAP_REGS; - USE_SMAP_RX_BD; - u16 len; - register int rxbdi, stat; - register int ret = 1; - - // Clear irq - irq &= SMAP_INTR_RXDNV | SMAP_INTR_RXEND; - SMAP_REG16(SMAP_R_INTR_CLR) = irq & SMAP_INTR_BITMSK; - - while (1) { - - rxbdi = rx_stat.rxbdi; - stat = rx_bd[rxbdi].ctrl_stat; - - if (stat & SMAP_BD_RX_EMPTY) - break; - - len = rx_bd[rxbdi].length; - - // check for BD error and packet size - if ((stat & SMAP_BD_RX_ERROR) || ((len < SMAP_RX_MINSIZE) || (len > SMAP_RX_MAXSIZE))) - ret = 0; - else { - u16 rxrp = ((rx_bd[rxbdi].pointer - SMAP_RX_BASE) % SMAP_RX_BUFSIZE) & 0xfffc; - // FIFO -> memory - smap_CopyFromFIFO(rxrp, (u32 *)rcpt_buf, len); - - eth_hdr_t *eth = (eth_hdr_t *)rcpt_buf; - if (eth->type == 0x0008) { // IP packet - - ip_hdr_t *ip = (ip_hdr_t *)&rcpt_buf[14]; - if ((ip->hlen == 0x45) && (inet_chksum(ip, 20) == 0)) { // Check IPv4 & IP checksum - if ((!(ip->flags & 0x3f)) && (ip->frag_offset == 0)) { // Drop IP fragments - if (ip->proto == 0x06) // Check it's TCP packet - tcp_input(rcpt_buf, len); - } - } - } else if (eth->type == 0x0608) { // ARP packet - arp_input(rcpt_buf, len); - // ARP packet is then dropped - } - } - - SMAP_REG8(SMAP_R_RXFIFO_FRAME_DEC) = 1; - rx_bd[rxbdi].ctrl_stat = SMAP_BD_RX_EMPTY; - SMAP_BD_NEXT(rx_stat.rxbdi); - } - - return ret; -} - -//------------------------------------------------------------------------- -static int smap_emac3_intr(int irq) -{ - USE_SMAP_REGS; - USE_SMAP_EMAC3_REGS; - register u32 stat; - - stat = SMAP_EMAC3_GET(SMAP_R_EMAC3_INTR_STAT); - - SMAP_EMAC3_SET(SMAP_R_EMAC3_INTR_STAT, stat); - - // clear irq - SMAP_REG16(SMAP_R_INTR_CLR) = SMAP_INTR_EMAC3; - SMAP_EMAC3_SET(SMAP_R_EMAC3_INTR_STAT, SMAP_E3_INTR_ALL); - - return 1; -} - -//------------------------------------------------------------------------- -static int smap_intr_handler(int state) -{ - USE_SPD_REGS; - register int irq; - - irq = SPD_REG16(SPD_R_INTR_STAT) & SMAP_INTR_BITMSK; - - if (irq & (SMAP_INTR_TXDNV | SMAP_INTR_TXEND)) { // TX intr - smap_tx_intr(irq & (SMAP_INTR_TXDNV | SMAP_INTR_TXEND)); - irq = SPD_REG16(SPD_R_INTR_STAT) & SMAP_INTR_BITMSK; - } - - if (irq & (SMAP_INTR_RXDNV | SMAP_INTR_RXEND)) // RX intr - smap_rx_intr(irq & (SMAP_INTR_RXDNV | SMAP_INTR_RXEND)); - else if (irq & SMAP_INTR_EMAC3) // EMAC3 intr - smap_emac3_intr(irq & SMAP_INTR_EMAC3); - - return 1; -} - -//------------------------------------------------------------------------- -int smap_init(u8 *eth_addr_src) -{ - USE_SPD_REGS; - USE_DEV9_REGS; - USE_SMAP_REGS; - USE_SMAP_EMAC3_REGS; - USE_SMAP_TX_BD; - USE_SMAP_RX_BD; - u16 MAC[4]; - u16 MACcsum = 0; - u8 hwaddr[6]; - u32 val; - register int i; - - // Check out the SPEED chip revision - if (!(SPD_REG16(SPD_R_REV_3) & SPD_CAPS_SMAP) || SPD_REG16(SPD_R_REV_1) <= 16) - return 1; - - dev9IntrDisable(SMAP_INTR_BITMSK); - EnableIntr(IOP_IRQ_DEV9); - CpuEnableIntr(); - - // PCMCIA Card removed flag - DEV9_REG(DEV9_R_1464) = 0x03; - - // Get HW MAC address and check it - if ((dev9GetEEPROM(&MAC[0]) < 0) || (!MAC[0] && !MAC[1] && !MAC[2])) - return 1; - for (i = 0; i < 3; i++) - MACcsum += MAC[i]; - if (MACcsum != MAC[3]) - return 1; - mips_memcpy(eth_addr_src, &MAC[0], 6); - - // Disable TX/RX - val = SMAP_EMAC3_GET(SMAP_R_EMAC3_MODE0); - val &= ~(SMAP_E3_TXMAC_ENABLE | SMAP_E3_RXMAC_ENABLE); - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE0, val); - - // Disable all EMAC3 interrupts - SMAP_EMAC3_SET(SMAP_R_EMAC3_INTR_ENABLE, 0); - - // Reset the transmit FIFO - SMAP_REG8(SMAP_R_TXFIFO_CTRL) = SMAP_TXFIFO_RESET; - for (i = 9; i; i--) { - if (!(SMAP_REG8(SMAP_R_TXFIFO_CTRL) & SMAP_TXFIFO_RESET)) - break; - DelayThread(1000); - } - if (!i) - return 2; - - // Reset the receive FIFO - SMAP_REG8(SMAP_R_RXFIFO_CTRL) = SMAP_RXFIFO_RESET; - for (i = 9; i; i--) { - if (!(SMAP_REG8(SMAP_R_RXFIFO_CTRL) & SMAP_RXFIFO_RESET)) - break; - DelayThread(1000); - } - if (!i) - return 3; - - // Perform soft reset of EMAC3 - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE0, SMAP_E3_SOFT_RESET); - for (i = 9; i; i--) { - if (!(SMAP_EMAC3_GET(SMAP_R_EMAC3_MODE0) & SMAP_E3_SOFT_RESET)) - break; - DelayThread(1000); - } - if (!i) - return 4; - - SMAP_REG8(SMAP_R_BD_MODE) = 0; - - // Initialize all RX and TX buffer descriptors - for (i = 0; i < SMAP_BD_MAX_ENTRY; i++, tx_bd++) { - tx_bd->ctrl_stat = 0; - tx_bd->reserved = 0; - tx_bd->length = 0; - tx_bd->pointer = 0; - } - for (i = 0; i < SMAP_BD_MAX_ENTRY; i++, rx_bd++) { - rx_bd->ctrl_stat = SMAP_BD_RX_EMPTY; - rx_bd->reserved = 0; - rx_bd->length = 0; - rx_bd->pointer = 0; - } - - // Clear all irq - SMAP_REG16(SMAP_R_INTR_CLR) = SMAP_INTR_BITMSK; - - // EMAC3 operating MODE - val = SMAP_E3_FDX_ENABLE | SMAP_E3_IGNORE_SQE | SMAP_E3_MEDIA_100M | - SMAP_E3_RXFIFO_2K | SMAP_E3_TXFIFO_1K | SMAP_E3_TXREQ0_SINGLE | SMAP_E3_TXREQ1_SINGLE; - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE1, val); - - // TX fifo value for request priority. low = 7*8=56, urgent = 15*8=120. - val = (7 << SMAP_E3_TX_LOW_REQ_BITSFT) | (15 << SMAP_E3_TX_URG_REQ_BITSFT); - SMAP_EMAC3_SET(SMAP_R_EMAC3_TxMODE1, val); - - // RX mode - val = SMAP_E3_RX_STRIP_PAD | SMAP_E3_RX_STRIP_FCS | SMAP_E3_RX_INDIVID_ADDR | SMAP_E3_RX_BCAST; - SMAP_EMAC3_SET(SMAP_R_EMAC3_RxMODE, val); - - // Set HW MAC address - mips_memcpy(hwaddr, eth_addr_src, 6); - val = (u16)((hwaddr[0] << 8) | hwaddr[1]); - SMAP_EMAC3_SET(SMAP_R_EMAC3_ADDR_HI, val); - val = ((hwaddr[2] << 24) | (hwaddr[3] << 16) | (hwaddr[4] << 8) | hwaddr[5]); - SMAP_EMAC3_SET(SMAP_R_EMAC3_ADDR_LO, val); - - // Inter-frame GAP - SMAP_EMAC3_SET(SMAP_R_EMAC3_INTER_FRAME_GAP, 4); - - // TX threshold - val = 12 << SMAP_E3_TX_THRESHLD_BITSFT; - SMAP_EMAC3_SET(SMAP_R_EMAC3_TX_THRESHOLD, val); - - // RX watermark, low = 16*8=128, hi = 128*8=1024 - val = (16 << SMAP_E3_RX_LO_WATER_BITSFT) | (128 << SMAP_E3_RX_HI_WATER_BITSFT); - SMAP_EMAC3_SET(SMAP_R_EMAC3_RX_WATERMARK, val); - - // Enable all EMAC3 interrupts - SMAP_EMAC3_SET(SMAP_R_EMAC3_INTR_ENABLE, SMAP_E3_INTR_ALL); - - // Initialize the PHY - if ((i = smap_phy_init()) != 0) - return -i; - - tx_stat.txwp_start = tx_stat.txwp_end = 0; - tx_stat.txbdi_start = tx_stat.txbdi_end = 0; - rx_stat.rxbdi = 0; - - // Install the smap_intr_handler for all the SMAP interrupts - for (i = 2; i < 7; i++) - dev9RegisterIntrCb(i, smap_intr_handler); - - // Enable TX/RX - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE0, SMAP_E3_TXMAC_ENABLE | SMAP_E3_RXMAC_ENABLE); - DelayThread(10000); - - dev9IntrEnable(SMAP_INTR_BITMSK); - - smap_xmit_mutex = CreateMutex(IOP_MUTEX_UNLOCKED); - - return 0; -} diff --git a/modules/wip/lanman/smap.h b/modules/wip/lanman/smap.h deleted file mode 100755 index 824999e82..000000000 --- a/modules/wip/lanman/smap.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#ifndef SMAP_H -#define SMAP_H - -#include - -int smap_init(u8 *eth_addr_src); -int smap_xmit(void *buf, int size); - -#endif /* SMAP_H */ diff --git a/modules/wip/lanman/smsutils.h b/modules/wip/lanman/smsutils.h deleted file mode 100644 index 6c210a739..000000000 --- a/modules/wip/lanman/smsutils.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -# ___ _ _ ___ -# | | | | | -# ___| | | ___| PS2DEV Open Source Project. -#---------------------------------------------------------- -# (c) 2005 by Eugene Plotnikov -# -# Licensed under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -*/ -#ifndef __SMSUTILS_H -#define __SMSUTILS_H - -#include - -#define smsutils_IMPORTS_start DECLARE_IMPORT_TABLE(smsutils, 1, 1) - -extern void mips_memcpy(void *, const void *, unsigned); -#define I_mips_memcpy DECLARE_IMPORT(4, mips_memcpy) - -extern void mips_memset(void *, int, unsigned); -#define I_mips_memset DECLARE_IMPORT(5, mips_memset) - -#define smsutils_IMPORTS_end END_IMPORT_TABLE - -#endif /* __SMSUTILS_H */ diff --git a/modules/wip/lanman/tcp.c b/modules/wip/lanman/tcp.c deleted file mode 100644 index 62be2bd37..000000000 --- a/modules/wip/lanman/tcp.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#include -#include -#include -#include -#include - -#include "tcp.h" -#include "lanman.h" -#include "smsutils.h" -#include "smap.h" -#include "inet.h" - -static g_param_t *g_param; - -static u8 tcp_sndbuf[1514] __attribute__((aligned(64))); // MTU -static u8 tcp_rcvbuf[4096] __attribute__((aligned(64))); // MTU -static void *p_rcptbuf; -static u16 rcptbuf_size; -static int tcp_mutex = -1; -static int tcp_listen = 0; - -#define FIN 0x00 -#define SYN 0x02 -#define RST 0x04 -#define PSH 0x08 -#define ACK 0x10 - -static u8 TCP_FLAG; -static u32 seq_num; -static u32 next_seqnum; -static u32 ack_num; - -#define TIMEOUT (3000 * 1000) -iop_sys_clock_t timeout_sysclock; -static int timeout_flag = 0; -static int tcp_reply_flag = 0; - -static u16 tcp_port_src = 8209; - -//------------------------------------------------------------------------- -static unsigned int timer_intr_handler(void *args) -{ - if (timeout_flag) - iSignalSema(tcp_mutex); - - iSetAlarm(&timeout_sysclock, timer_intr_handler, NULL); - - return (unsigned int)args; -} - -//------------------------------------------------------------------------- -void tcp_init(g_param_t *gparam) -{ - g_param = gparam; - - tcpip_pkt_t *tcp_pkt = (tcpip_pkt_t *)tcp_sndbuf; - - // Initialize the static elements of our TCP packet - mips_memcpy(tcp_pkt->eth.addr_dst, g_param->eth_addr_dst, 12); // hardware MAC addresses - tcp_pkt->eth.type = 0x0008; // Network byte order: 0x800 - tcp_pkt->ip.hlen = 0x45; // IPv4 - tcp_pkt->ip.tos = 0; - tcp_pkt->ip.id = 0; - tcp_pkt->ip.flags = 0x40; // Don't fragment - tcp_pkt->ip.frag_offset = 0; - tcp_pkt->ip.ttl = TTL; - tcp_pkt->ip.proto = IP_PROTO_TCP; - mips_memcpy(&tcp_pkt->ip.addr_src.addr, &g_param->ip_addr_src, 4); - mips_memcpy(&tcp_pkt->ip.addr_dst.addr, &g_param->ip_addr_dst, 4); - tcp_pkt->tcp_port_src = IP_PORT(tcp_port_src); - tcp_pkt->tcp_port_dst = g_param->ip_port_dst; - tcp_pkt->tcp_wndsize = htons(TCPWND_SIZE); - - // create a mutex - tcp_mutex = CreateMutex(IOP_MUTEX_LOCKED); - - USec2SysClock(TIMEOUT, &timeout_sysclock); - SetAlarm(&timeout_sysclock, timer_intr_handler, NULL); -} - -//------------------------------------------------------------------------- -int tcp_output(void *buf, int size, int hdata_flag) -{ - tcpip_pkt_t *tcp_pkt; - int pktsize; - int oldstate; - - tcp_pkt = (tcpip_pkt_t *)tcp_sndbuf; - pktsize = size + sizeof(tcpip_pkt_t); - - tcp_pkt->ip.len = htons(pktsize - 14); // Subtract the ethernet header - - tcp_pkt->ip.csum = 0; - tcp_pkt->ip.csum = inet_chksum(&tcp_pkt->ip, 20); // Checksum the IP header (20 bytes) - - CpuSuspendIntr(&oldstate); - u32 seqno = htona((u8 *)&seq_num); - mips_memcpy(tcp_pkt->tcp_seq_num, &seqno, 4); - u32 ackno = htona((u8 *)&ack_num); - mips_memcpy(tcp_pkt->tcp_ack_num, &ackno, 4); - CpuResumeIntr(oldstate); - - tcp_pkt->tcp_hdrlen = (hdata_flag ? 20 + size : 20) << 2; - if (buf) - mips_memcpy(&tcp_sndbuf[54], buf, size); - - tcp_pkt->tcp_flags = TCP_FLAG; - tcp_pkt->tcp_csum = 0; - tcp_pkt->tcp_csum = inet_chksum_pseudo(&tcp_sndbuf[34], &g_param->ip_addr_src, &g_param->ip_addr_dst, 20 + size); - - CpuSuspendIntr(&oldstate); - next_seqnum = seq_num + (TCP_FLAG == SYN ? 1 : size); - while (smap_xmit(tcp_pkt, pktsize) != 0) - ; - CpuResumeIntr(oldstate); - - return 1; -} - -//------------------------------------------------------------------------- -int tcp_input(void *buf, int size) /// !!! Intr Context !!! -{ - register u32 ackno; - - if (tcp_listen) { - tcpip_pkt_t *tcp_pkt = (tcpip_pkt_t *)buf; - - if (inet_chksum_pseudo(&tcp_pkt->tcp_port_src, &g_param->ip_addr_dst, &g_param->ip_addr_src, (ntohs(tcp_pkt->ip.len) - 20)) == 0) { // check TCP checksum - if (tcp_pkt->tcp_flags & ACK) { - - ackno = ntoha(tcp_pkt->tcp_ack_num); - if (ackno == next_seqnum) { - // packet is aknowledged - if (ntoha(tcp_pkt->tcp_seq_num) == ack_num - 1) - tcp_send_ack(); // keep alive ack - else { - int len = ntohs(tcp_pkt->ip.len) - 20 - (tcp_pkt->tcp_hdrlen >> 2); - seq_num = ackno; - ack_num = ntoha(tcp_pkt->tcp_seq_num) + len + (tcp_pkt->tcp_flags & SYN ? 1 : 0); - if ((len > 0) || (tcp_pkt->tcp_flags & SYN)) { - // do input buffering - if (tcp_pkt->tcp_flags == (ACK | PSH)) - tcp_send_ack(); - tcp_reply_flag = 1; - p_rcptbuf = buf; - rcptbuf_size = size; - iSignalSema(tcp_mutex); - } - } - } - } - } - } - - return 1; -} - -//------------------------------------------------------------------------- -void tcp_send(void *buf, int size, int hdata_flag) -{ - int oldstate; - tcpip_pkt_t *tcp_sndpkt = (tcpip_pkt_t *)tcp_sndbuf; - -send: - if (TCP_FLAG == SYN) { - // select a port and increment it for retries - tcp_sndpkt->tcp_port_src = IP_PORT(tcp_port_src); - tcp_port_src++; - } - - CpuSuspendIntr(&oldstate); - timeout_flag = 1; - tcp_listen = 1; - CpuResumeIntr(oldstate); - - tcp_output(buf, size, hdata_flag); - - WaitSema(tcp_mutex); - - //while (QueryIntrContext()) - // DelayThread(10000); - - CpuSuspendIntr(&oldstate); - timeout_flag = 0; - tcp_listen = 0; - if (tcp_reply_flag == 0) { // It was a timeout ? - CpuResumeIntr(oldstate); - goto send; // yes, retry... - } - tcp_reply_flag = 0; - mips_memcpy(tcp_rcvbuf, p_rcptbuf, rcptbuf_size); - CpuResumeIntr(oldstate); -} - -//------------------------------------------------------------------------- -void tcp_connect(void) -{ - iop_sys_clock_t sysclock; - u8 options[4]; - - TCP_FLAG = SYN; - - // generate ISN - GetSystemTime(&sysclock); - seq_num = sysclock.lo & 0xffff; - ack_num = 0; - - // Options: MSS=1460 - *((u16 *)&options[0]) = 0x0402; - *((u16 *)&options[2]) = htons(TCP_MSS); - - // send the SYN - tcp_send(options, sizeof(options), 1); - - TCP_FLAG = ACK | PSH; - - tcp_send_ack(); -} - -//------------------------------------------------------------------------- -void tcp_send_ack(void) -{ - TCP_FLAG = ACK; - tcp_output("\0", 0, 0); - TCP_FLAG = ACK | PSH; -} diff --git a/modules/wip/lanman/tcp.h b/modules/wip/lanman/tcp.h deleted file mode 100644 index 79f96bf8f..000000000 --- a/modules/wip/lanman/tcp.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#ifndef TCP_H -#define TCP_H - -#include - -#include "lanman.h" -#include "eth.h" -#include "ip.h" - -#define TTL 255 -#define TCPWND_SIZE 8192 -#define IP_PROTO_TCP 0x06 -#define TCP_MSS 1460 - -typedef struct -{ - // Ethernet (14) - eth_hdr_t eth; - - // IP header (20) - ip_hdr_t ip; - - // TCP header (20) - u16 tcp_port_src; - u16 tcp_port_dst; - u8 tcp_seq_num[4]; - u8 tcp_ack_num[4]; - u8 tcp_hdrlen; - u8 tcp_flags; - u16 tcp_wndsize; - u16 tcp_csum; - u16 tcp_urgp; - - // Data goes here -} tcpip_pkt_t __attribute__((packed)); - -void tcp_init(g_param_t *gparam); -int tcp_input(void *buf, int size); -void tcp_connect(void); -void tcp_send_ack(void); - -#endif /* TCP_H */ diff --git a/modules/wip/lanman/udp.h b/modules/wip/lanman/udp.h deleted file mode 100644 index 8c5957efb..000000000 --- a/modules/wip/lanman/udp.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#ifndef UDP_H -#define UDP_H - -#include - -#include "eth.h" -#include "ip.h" - -typedef struct -{ - /* Ethernet header (14). */ - eth_hdr_t eth; - - /* IP header (20). */ - ip_hdr_t ip; - - /* UDP header (8). */ - u16 udp_port_src; - u16 udp_port_dst; - u16 udp_len; - u16 udp_csum; - - /* Data goes here. */ -} udp_pkt_t __attribute__((packed)); - -#endif /* UDP_H */ diff --git a/modules/wip/lanman/udptty.c b/modules/wip/lanman/udptty.c deleted file mode 100644 index bbfdd8cb3..000000000 --- a/modules/wip/lanman/udptty.c +++ /dev/null @@ -1,187 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: tty.c 629 2004-10-11 00:45:00Z mrbrown $ -# TTY filesystem for UDPTTY. -*/ - -#include -#include -#include -#include -#include - -#include "lanman.h" -#include "smsutils.h" -#include "smap.h" -#include "udp.h" -#include "inet.h" - -#define DEVNAME "tty" - -#ifdef UDPTTY - -static g_param_t *g_param; -static int tty_sema = -1; - -/* The max we'll send is a MTU, 1514 bytes. */ -static u8 pktbuf[1514]; - -static int tty_init(iop_device_t *device); -static int tty_deinit(iop_device_t *device); -static int tty_stdout_fd(void); -static int tty_write(iop_file_t *file, void *buf, size_t size); -static int tty_error(void); - -/* device ops */ -static iop_device_ops_t tty_ops = { - tty_init, - tty_deinit, - (void *)tty_error, - (void *)tty_stdout_fd, - (void *)tty_stdout_fd, - (void *)tty_error, - (void *)tty_write, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error}; - -/* device descriptor */ -static iop_device_t tty_device = { - DEVNAME, - IOP_DT_CHAR | IOP_DT_CONS, - 1, - "TTY via SMAP UDP", - &tty_ops}; - -/* Init TTY */ -void ttyInit(g_param_t *gparam) -{ - g_param = gparam; - - close(0); - close(1); - DelDrv(DEVNAME); - - if (AddDrv(&tty_device) < 0) - return; - - open(DEVNAME "00:", 0x1000 | O_RDWR); - open(DEVNAME "00:", O_WRONLY); -} - -/* UDP */ - -static int udp_init(void) -{ - udp_pkt_t *udp_pkt; - - /* Initialize the static elements of our UDP packet. */ - udp_pkt = (udp_pkt_t *)pktbuf; - - mips_memcpy(udp_pkt->eth.addr_dst, g_param->eth_addr_dst, 12); - udp_pkt->eth.type = 0x0008; /* Network byte order: 0x800 */ - - udp_pkt->ip.hlen = 0x45; - udp_pkt->ip.tos = 0; - udp_pkt->ip.id = 0; - udp_pkt->ip.flags = 0; - udp_pkt->ip.frag_offset = 0; - udp_pkt->ip.ttl = 64; - udp_pkt->ip.proto = 0x11; - mips_memcpy(&udp_pkt->ip.addr_src.addr, &g_param->ip_addr_src, 4); - mips_memcpy(&udp_pkt->ip.addr_dst.addr, &g_param->ip_addr_dst, 4); - - udp_pkt->udp_port_src = g_param->ip_port_src; - udp_pkt->udp_port_dst = IP_PORT(0x4712); - - return 0; -} - -/* Copy the data into place, calculate the various checksums, and send the - final packet. */ -static int udp_send(void *buf, size_t size) -{ - udp_pkt_t *udp_pkt; - size_t pktsize, udpsize; - - if ((size + sizeof(udp_pkt_t)) > sizeof(pktbuf)) - size = sizeof(pktbuf) - sizeof(udp_pkt_t); - - udp_pkt = (udp_pkt_t *)pktbuf; - pktsize = size + sizeof(udp_pkt_t); - - udp_pkt->ip.len = htons(pktsize - 14); /* Subtract the ethernet header. */ - - udp_pkt->ip.csum = 0; - udp_pkt->ip.csum = inet_chksum(&udp_pkt->ip, 20); /* Checksum the IP header (20 bytes). */ - - udpsize = htons(size + 8); /* Size of the UDP header + data. */ - udp_pkt->udp_len = udpsize; - mips_memcpy(pktbuf + sizeof(udp_pkt_t), buf, size); - - udp_pkt->udp_csum = 0; /* Don't bother. */ - - while (smap_xmit(udp_pkt, pktsize) != 0) - ; - - return 0; -} - - -/* TTY driver. */ - -static int tty_init(iop_device_t *device) -{ - int res; - - if ((res = udp_init()) < 0) - return res; - - if ((tty_sema = CreateMutex(IOP_MUTEX_UNLOCKED)) < 0) - return -1; - - return 0; -} - -static int tty_deinit(iop_device_t *device) -{ - DeleteSema(tty_sema); - return 0; -} - -static int tty_stdout_fd(void) -{ - return 1; -} - -static int tty_write(iop_file_t *file, void *buf, size_t size) -{ - int res = 0; - - WaitSema(tty_sema); - res = udp_send(buf, size); - - SignalSema(tty_sema); - return res; -} - -static int tty_error(void) -{ - return -EIO; -} - -#endif diff --git a/modules/wip/lanman/udptty.h b/modules/wip/lanman/udptty.h deleted file mode 100755 index b19583fa5..000000000 --- a/modules/wip/lanman/udptty.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - Copyright (c) 2010 jimmikaelkael - Licenced under Academic Free License version 3.0 -*/ - -#ifndef UDPTTY_H -#define UDPTTY_H - -#include "lanman.h" - -void ttyInit(g_param_t *gparam); - -#endif /* UDPTTY_H */ From 75c8f83b560e6f4a48741c8bbbd3f6e9268cba1e Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 15 Jan 2017 22:20:14 -0800 Subject: [PATCH 017/269] Fix Travis reverting test #26 by Dr-Q --- .travis.yml | 28 +++++++++++++++++++++------- DETAILED_CHANGELOG | 1 + 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index d492b79fa..b153a29ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,31 +4,41 @@ # - izdubar@psx-scene and jimmikaelkael@psx-scene # # - doctorxyz@ps2home -# +# # - and a lot of people around internet :) sudo: required language: c -services: - - docker - before_install: ## Save current dir, go to previous dir and save it too - export opl_build_dir=$(pwd) - cd ../ - export travis_build_dir=$(pwd) +install: +## OPL Building Dependencies +- sudo apt-get install -yqq gcc-4.4 patch wget make git libc6-dev zlib1g zlib1g-dev libucl1 libucl-dev + before_script: ## Make cleanup, just for prevent anything - cd ${travis_build_dir}/ -- rm -rf gsKit/ ps2eth/ ps2-packer/ ps2sdk-ports/ +- rm -rf gsKit/ ps2eth/ ps2toolchain/ ps2-packer/ ps2sdk-ports/ ## Set up the environment. +- export PS2DEV=${travis_build_dir}/ps2dev +- export PS2SDK=${PS2DEV}/ps2sdk +- export PATH=${PATH}:${PS2DEV}/bin:${PS2DEV}/ee/bin:${PS2DEV}/iop/bin:${PS2DEV}/dvp/bin:${PS2SDK}/bin - export PS2ETH=${PS2DEV}/ps2eth - export GSKIT=${PS2DEV}/gsKit - export LANG=C - export LC_ALL=C +## ps2dev/PS2Toolchain +- cd ${travis_build_dir}/ +- git clone --quiet https://github.com/ps2dev/ps2toolchain.git ${travis_build_dir}/ps2toolchain/ +- cd ${travis_build_dir}/ps2toolchain/ +- ./toolchain.sh + ## ps2dev/PS2SDKPorts - cd ${travis_build_dir}/ - git clone --quiet https://github.com/ps2dev/ps2sdk-ports.git ${travis_build_dir}/ps2sdk-ports/ @@ -76,10 +86,14 @@ before_script: script: ## Let's build Open PS2 Loader Release! -- docker run -it --rm -v ${opl_build_dir}/ mlafeldt/ps2dev make +- cd ${opl_build_dir}/ +- . make_changelog.sh +- git add DETAILED_CHANGELOG +- make clean +- make release ## Build Lang Pack and Latest Changelog -- docker run -it --rm -v ${opl_build_dir}/ mlafeldt/ps2dev ./lng_pack.sh +- . lng_pack.sh ## [TEMPLATE] Deploy OPL to Github Releases # 1. Clone this repository diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 5c4cd62b4..9946a9191 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev977 - Jay-Jay-OPL - General cleanup (#27) * Remove unused lanman * Makefile cleanup * Fix README file name and url to forums * clang-formatted files that weren't before - Sun Jan 15 21:57:13 2017 -0800 rev976 - Jay-Jay-OPL - Updated to support LWIP v2.0.0. by sp193 - Sat Dec 24 02:21:24 2016 -0800 rev975 - Jay-Jay-OPL - * NOTE: Updating and rebuilding gsKit is required. - by @rickgaiser * Adapt for changes in gsKit - by @rickgaiser - Hacks are no longer needed for 576P and centering the screen. - by @rickgaiser * Add settings for display X and Y offset - by @rickgaiser - Thu Dec 15 18:02:59 2016 -0800 rev974 - Jay-Jay-OPL - Optimized makefiles. (#24) * Optimized makefiles. Synced with mainstream ps2sdk: * Clear USB Mass Storage Device status to 0 at initialization-time (8997094) * Changed UsbMassRegisterCallback to call the callback once if a device is connected (cf385c0) * Test travis * Test travis 2 - Wed Nov 23 20:49:41 2016 -0800 From 5ad2eddcf6f9b4b6fa7a68e265330dab2372e79c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 16 Jan 2017 08:50:15 -0800 Subject: [PATCH 018/269] Update dialogs.c by ShaolinAssassin X and Y Offset will use the same string as X and Y Offset (Hint text) from GSM menu. --- DETAILED_CHANGELOG | 1 + src/dialogs.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 9946a9191..20aae0d54 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev978 - Jay-Jay-OPL - Fix Travis reverting test #26 by Dr-Q - Sun Jan 15 22:20:14 2017 -0800 rev977 - Jay-Jay-OPL - General cleanup (#27) * Remove unused lanman * Makefile cleanup * Fix README file name and url to forums * clang-formatted files that weren't before - Sun Jan 15 21:57:13 2017 -0800 rev976 - Jay-Jay-OPL - Updated to support LWIP v2.0.0. by sp193 - Sat Dec 24 02:21:24 2016 -0800 rev975 - Jay-Jay-OPL - * NOTE: Updating and rebuilding gsKit is required. - by @rickgaiser * Adapt for changes in gsKit - by @rickgaiser - Hacks are no longer needed for 576P and centering the screen. - by @rickgaiser * Add settings for display X and Y offset - by @rickgaiser - Thu Dec 15 18:02:59 2016 -0800 diff --git a/src/dialogs.c b/src/dialogs.c index 6edcf18a5..50602b33c 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -413,12 +413,12 @@ struct UIItem diaUIConfig[] = { {UI_ENUM, UICFG_VMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {"X-Offset", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_HINT_XOFFSET}}}, {UI_SPACER}, {UI_INT, UICFG_XOFF, 1, 1, -1, 0, 0, {.intvalue = {0, 0, -300, 300}}}, {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {"Y-Offset", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_HINT_YOFFSET}}}, {UI_SPACER}, {UI_INT, UICFG_YOFF, 1, 1, -1, 0, 0, {.intvalue = {0, 0, -300, 300}}}, {UI_BREAK}, From 732915fca43ae0b99bb96cd7377e6f1e70f00822 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 16 Jan 2017 11:09:29 -0800 Subject: [PATCH 019/269] update Lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Danish.lng | 214 +++++++++++++++++++++++++++++++++++++++++ lng/lang_Hungarian.lng | 214 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 429 insertions(+) create mode 100644 lng/lang_Danish.lng create mode 100644 lng/lang_Hungarian.lng diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 20aae0d54..f2503b84b 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev979 - Jay-Jay-OPL - Update dialogs.c by ShaolinAssassin X and Y Offset will use the same string as X and Y Offset (Hint text) from GSM menu. - Mon Jan 16 08:50:15 2017 -0800 rev978 - Jay-Jay-OPL - Fix Travis reverting test #26 by Dr-Q - Sun Jan 15 22:20:14 2017 -0800 rev977 - Jay-Jay-OPL - General cleanup (#27) * Remove unused lanman * Makefile cleanup * Fix README file name and url to forums * clang-formatted files that weren't before - Sun Jan 15 21:57:13 2017 -0800 rev976 - Jay-Jay-OPL - Updated to support LWIP v2.0.0. by sp193 - Sat Dec 24 02:21:24 2016 -0800 diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng new file mode 100644 index 000000000..87304026f --- /dev/null +++ b/lng/lang_Danish.lng @@ -0,0 +1,214 @@ +# Translation by BongKris +# Last update: 01/10/2017 +# Updated for OPL_r963_DB [b7e6f26] +# official thread: http://ps2home.freeforums.net/post/1966/thread +Danish +OPL %s +Gem indstillinger +Tilbage +Netværksindstillinger +Avancerede indstillinger + +Indstillinger gemt... +Fejl ved lagering af indstillinger! +Afslut +Indstillinger +Menu +USB-spil +HDD-spil +ETH-spil +Programmer +Tema +Sprog +Systemet slukkes. +Vend tilbage til Browser/OSDSYS? +Annuller opdatering? +%d: Inget harddisk drev fundet +%d: Harddisk drevet er ikke formateret +%d: Netværksopstart fejl +%d: Ingen netværksadapter fundet +%d: Kan ikke oprette forbindelse til SMB-serveren +%d: Kan ikke logge på SMB-server +%d: Kan ikke åbne SMB-mappe +%d: Kan ikke liste SMB-mapper +%d: Kan ikke liste spil +%d: DHCP-serveren er ikke tilgængelig +%d: Ingen netværksforbindelse +Til +Fra +OK +Vælg +Annuller +Cirkel +Kryds +Spil liste +Spil indst. +Nulstil alle indstillinger +Spil indstillinger nulstillet +Scrolling +Langsom +Medium +Hurtig +Standardmenu +Indlæs fra disk +Vent venligst +Fejl ved indlæsning af spil ID +Automatisk sortering +Fejl ved indlæsning af sprogfil +Deaktivér fejlfindingsfarver +Ingen controller registreret, venter... +Aktivér Cover Art +Bredskærmsformat +Sluk +Indlæser indstillinger +Gemmer indstillinger +Start enhed +Genindlæs +USB-enhed starttilstand +HDD-enhed starttilstand +ETH-enhed starttilstand +Programmenu visningstilstand +Automatisk +Manuel +Start HDL-server +HDL-server starter... +HDL-server aktiv... +Kunne ikke starte HDL-server. +HDL-server lukker ned... +IGR-sti +Baggrundsfarve +Tekstfarve +- PS2 - +- SMB-server - +IP-metode +Statisk +DHCP +IP-adresse +Adresse +Undernetmaske +Gateway +DNS-server +Port +Mappe +Brugernavn +Adgangskode + +Adressetype +IP +NetBIOS +Acceptér +Elementet vil slettets permanent, fortsæt? +Omdøb +Slet +Kør +Skærmindstillinger +Aktivér skrive operationer +Kontrollér USB-spil fragmentering +Husk sidst spillede spil +Vælgeknap +Fejl: spillet er fragmenteret +Fejl: kunne ikke køre elementet +Test +Efterlad tom for gæste konto +Korrekt læsning +Synkroniseringstilstand +Frigiv syscalls +Skip videoer +Emulere DVD-DL +Deaktivere IGR +High module lagering +Skjul DEV9-modul +Ændring af størrelsen vil omformatere VMC +Opret +Start +Modificer +Afbryd +Nulstil +Brug generisk +Konfigurér VMC +Navn +Størrelse +Status +Fremskridt +VMC-fil eksisterer allerede +Ugyldig VMC-fil, størrelse er ukorrekt +VMC-fil skal oprettes +Fejl med VMC %s, fortsæt med fysisk MC (port %d) ? +Automatisk opdatering +Om +Kodere +Kvalitetstestere +USB-præfiks sti +Starter brugerdefineret ELF efter en IGR +Værdi i minuttet(r), 0 for at deaktivere spindown +Automatisk harddisk spindown +Videotilstand +Dialogfarve +Markeringsfarve +Vis infoside +Info +Brugerdefinerede ELF +Farvevalg +Genopret forbindelse +Efterlad tom for at liste mapper +ETH-præfiks sti +Tilbage +Mellemrum +Indtast +Tilstand +VMC-port 1 +VMC-port 2 +Spil ID +DMA-tilstand +V-Sync +Mode 1 +Mode 2 +Mode 3 +Mode 4 +Mode 5 +Mode 6 +Mode 7 +Mode 8 +Konfigurér GSM +Ethernet hastighed og duplex +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex +GSM-indstillinger +Aktivér GSM +Slå GSM Til eller Fra +Videotilstand +Tvungen brugerdefinerede skærmtilstand +Horisontal position +Horisontal justering +Vertikal position +Vertikal justering +Vis ikke FMV +Springer over Full Motion Videos +Snydeindstillinger +Aktivér PS2RD Cheat Engine +Tillad PS2RD Cheat Engine at patche dine spil +PS2RD Cheat Engine tilstand +Auto-vælg eller Vælg spil snydekoder +Auto-vælg spil snydekoder +Vælg spil snydekoder +Fejl: kunne ikke indlæses fil med snydekoder +Ingen snydekoder fundet +Hent standardindstillinger +Netværksopdatering +Hent eksisterende arkiv? +Opdatering mislykkedes. +Kan ikke oprette forbindes til server. +Opdatering fuldendt. +Opdatering annulleret. +Hent indstillinger fra netværket? +Brugerdefinerede indstillinger +Hent standardindstillinger +Auto-start om %i s... +Auto-start +Værdi i sekunder(s), 0 for at deaktivere auto start +PS2-Logo +Vises kun med et gyldigt disk logo, som matcher konsollens region +ELF-Loader Menu +ELF-Loader Menu visningstilstand \ No newline at end of file diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng new file mode 100644 index 000000000..197c7e328 --- /dev/null +++ b/lng/lang_Hungarian.lng @@ -0,0 +1,214 @@ +# Translation by co5oos +# Last update: 01/02/2017 +# Updated for OPL_r963_DB [b7e6f26] +# official thread: http://ps2home.freeforums.net/post/1966/thread +Hungarian +OPL %s +Változtatások mentése +Vissza +Hálózat konfigurálás +Haladó beállítások + +Beállítások mentve... +Hiba a beállítások írásában! +Kilépés +Beállítások +Menü +USB Játékok +HDD Játékok +ETH Játékok +Alkalmazások +Téma +Nyelv +A rendszer le fog állni. +Kilépés a böngészőbe/OSDSYS-be? +Frissítés visszavonása? +%d: Merevlemez nem található +%d: Merevlemez nincs leformázva +%d: Hálózat indítási hiba +%d: Nem található hálózati adapter +%d: Nem sikerült csatlakozni az SMB szerverhez +%d: Nem sikerült bejelentkezni az SMB szerverbe +%d: Nem sikerült megnyitni az SMB megosztást +%d: Nem sikerült listázni az SMB megosztásokat +%d: Nem sikerült listázni a játékokat +%d: DHCP szerver nem elérhető +%d: Nincs hálózati kapcsolat +Be +Ki +OK +Kiválaszt +Vissza +Kör +Kereszt +Játék Lista +Játékbeállítások +Összes beállítás eltávolítása +Játékhoz tartozó összes kulcs eltávolítva +Görgetés +Lassú +Közepes +Gyors +Alapértelmezett menü +Lemezről való beolvasás +Kérem várjon +Hiba a Játék ID betöltése közben +Automatikus rendezés +Hiba a nyelv fájl betöltésnél +Hibakeresési színek letiltása +Nem található kontroller, várakozás... +Lemezborító engedélyezése +Szélesvásznú +Kikapcsolás +Konfiguráció betöltése +Konfiguráció mentése +Eszköz indítása +Frissítés +USB eszköz indítási mód +HDD eszköz indítási mód +ETH eszköz indítási mód +Alkalmazások menü megjelenítési mód +Automatikus +Manuális +HDL szerver indítása +HDL Szerver Elindul... +HDL Szerver Fut... +Failed to start HDL Server. +HDL Server Unloading... +IGR path +Background color +Szöveg szín +- PS2 - +- SMB Szerver - +IP Cím típus +Statikus +DHCP +IP Cím +Cím +Maszk +Alapértelmezett átjáró +DNS Szerver +Port +Megosztás +Felhasználó +Jelszó + +Cím típus +IP +NetBIOS +Elfogad +Az elem véglegesen törlésre kerül, folytatja? +Átnevezés +Törlés +Futtatás +Képernyő Beállítások +Írási műveletek engedélyezése +USB játék töredezettség ellenőrzése +Emlékezz a legutóbbi játékra +Select Gomb +Hiba, a játék töredezett +Hiba, az elem futtatása sikertelen +Teszt +Hagyja üresen VENDÉG hitelesítéshez +Postos Olvasás +Egyidejű Mód +Syscalls kiakasztás +Videók átugrása +DVD-DL emulálás +IGR letiltása +Magas modul tárhely +DEV9 modul elrejtése +A méretváltoztatás leformázza a VMC-t +Létrehoz +Indít +Módosít +Megszakít +Visszaállítás +Generikus használata +VMC konfiguráció +Név +Méret +Állapot +Folyamat +VMC fájl létezik +Érvénytelen VMC fájl, helytelen méret +VMC fájl létrehozása szükséges +Hiba a VMC-vel %s, folytatás a fizikai MC-vel (foglalat %d) ? +Automatikus frissítés +Névjegy +Kódolók +Minőségbiztosítás +USB előtag elérési út +Testreszabott ELF bootolása egy IGR után +Érték perc(ek)ben, 0 a kikapcsolás letiltására +Automatikus Merevlemez kikapcsolás +Videó mód +Párbeszédablak színe +Kiválasztott színe +Információ oldal megjelenítése +Infó +Testreszabott ELF +Szín szelekció +Újracsatlakozás +Leave empty to list shares +ETH előtag elérési út +Backspace +Szóköz +Enter +Mód +VMC Foglalat 1 +VMC Foglalat 2 +Játék ID +DMA Mód +V-Sync +Mód 1 +Mód 2 +Mód 3 +Mód 4 +Mód 5 +Mód 6 +Mód 7 +Mód 8 +GSM Konfiguráció +Ethernet kapcsolat módja +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex +GSM Beállítások +GSM Engedélyezése +KI vagy BE kapcsolja a GSM-t +VMODE +Kényzerített Testreszabott Megjelenítési Mód +Vízszintes-Pozíció +Vízszintes Szabályozás +Függőleges-Pozíció +Függőleges Szabályozás +FMV Átugrása +Átugorja a Full Motion Videókat +Csalás Beállítások +PS2RD Csalás Motor engedélyezése +Engedd a PS2RD Csalás motornak, hogy patch-elje a játékodat. +PS2RD Csalás Motor Mód +Auto-kiválaszt vagy játékcsalások Kiválasztása +Auto-kiválaszt csalásokat +Játékcsalások Kiválasztása +Hiba: A Csalás Fájl betöltése sikertelen +Nem találhatóak csalások +Alapértelmezett letöltése +Hálózat frissítés +Újra-letölti a meglévő feljegyzéseket? +Frissítés Sikertelen. +Nem sikerült csatlakozni a frissítő szerverhez. +Frissítés befejezve. +Frissítés visszavonva. +Beállítások letöltése a hálózatról? +Testreszabott Beállítások +Letöltött alapértelmezések +Automatikus indítás %i s belül... +Automatikus indítás +Érték másodperc(ek)ben, 0 az Automatikus indítás letiltásához +PS2 Logó +Csak egy érvényes lemez logónál jelenik meg, amely egyezik a konzol régiójával +ELF Futtató Menü +ELF Futtató Menü megjelenítési mód \ No newline at end of file From 9d85f312952d312b1a7f7c02ffd93ba0819a7114 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 17 Jan 2017 07:56:04 -0800 Subject: [PATCH 020/269] Update dialogs.c - better strings for x & y offset #33 by ShaolinAssassin --- DETAILED_CHANGELOG | 1 + src/dialogs.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index f2503b84b..8e9aee316 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev980 - Jay-Jay-OPL - update Lang files - Mon Jan 16 11:09:29 2017 -0800 rev979 - Jay-Jay-OPL - Update dialogs.c by ShaolinAssassin X and Y Offset will use the same string as X and Y Offset (Hint text) from GSM menu. - Mon Jan 16 08:50:15 2017 -0800 rev978 - Jay-Jay-OPL - Fix Travis reverting test #26 by Dr-Q - Sun Jan 15 22:20:14 2017 -0800 rev977 - Jay-Jay-OPL - General cleanup (#27) * Remove unused lanman * Makefile cleanup * Fix README file name and url to forums * clang-formatted files that weren't before - Sun Jan 15 21:57:13 2017 -0800 diff --git a/src/dialogs.c b/src/dialogs.c index 50602b33c..200839779 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -413,12 +413,12 @@ struct UIItem diaUIConfig[] = { {UI_ENUM, UICFG_VMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_HINT_XOFFSET}}}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_XOFFSET}}}, {UI_SPACER}, {UI_INT, UICFG_XOFF, 1, 1, -1, 0, 0, {.intvalue = {0, 0, -300, 300}}}, {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_HINT_YOFFSET}}}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_YOFFSET}}}, {UI_SPACER}, {UI_INT, UICFG_YOFF, 1, 1, -1, 0, 0, {.intvalue = {0, 0, -300, 300}}}, {UI_BREAK}, From fe8a238a00f6c966a195121f9df03c79ac459f1b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 21 Jan 2017 17:19:08 -0800 Subject: [PATCH 021/269] Updated to compile error and warning-free with the head PS2SDK by SP193. HDD and PFS drivers were also updated. (#35) * Updated ISOFS, MCEMU and USBHDFSD to be compatible with the new PS2SDK changes. ISOFS and USBHDFSD: updated definition for I/O functions. MCEMU: removed unused import of KprintfSet(). * Updated HDD and PFS drivers. --- DETAILED_CHANGELOG | 1 + modules/hdd/apa/Makefile | 2 +- modules/hdd/apa/apa-opt.h | 30 +- modules/hdd/apa/hdd.c | 430 +++--- modules/hdd/apa/hdd.h | 30 +- modules/hdd/apa/hdd_fio.c | 1630 ++++++++++++----------- modules/hdd/apa/hdd_fio.h | 4 +- modules/hdd/apa/imports.lst | 1 + modules/hdd/libapa/include/libapa.h | 175 +-- modules/hdd/libapa/src/apa.c | 779 +++++------ modules/hdd/libapa/src/cache.c | 265 ++-- modules/hdd/libapa/src/free.c | 81 ++ modules/hdd/libapa/src/journal.c | 89 +- modules/hdd/libapa/src/misc.c | 72 +- modules/hdd/libapa/src/password.c | 518 ++++++++ modules/hdd/libpfs/include/libpfs.h | 382 +++--- modules/hdd/libpfs/src/bitmap.c | 600 +++++---- modules/hdd/libpfs/src/block.c | 97 +- modules/hdd/libpfs/src/blockWrite.c | 202 +-- modules/hdd/libpfs/src/cache.c | 335 +++-- modules/hdd/libpfs/src/dir.c | 1083 ++++++++------- modules/hdd/libpfs/src/inode.c | 126 +- modules/hdd/libpfs/src/journal.c | 171 +-- modules/hdd/libpfs/src/misc.c | 273 ++-- modules/hdd/libpfs/src/super.c | 28 +- modules/hdd/libpfs/src/superWrite.c | 399 +++--- modules/hdd/pfs/pfs-opt.h | 14 +- modules/hdd/pfs/pfs.c | 294 ++-- modules/hdd/pfs/pfs.h | 46 +- modules/hdd/pfs/pfs_fio.c | 1923 ++++++++++++++------------- modules/hdd/pfs/pfs_fio.h | 38 +- modules/hdd/pfs/pfs_fioctl.c | 586 ++++---- modules/hdd/pfs/pfs_fioctl.h | 6 +- modules/isofs/isofs.c | 2 +- modules/mcemu/imports.lst | 1 - modules/usb/usbhdfsd/fs_driver.c | 4 +- src/hddsupport.c | 2 +- 37 files changed, 5772 insertions(+), 4947 deletions(-) create mode 100644 modules/hdd/libapa/src/free.c create mode 100644 modules/hdd/libapa/src/password.c diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 8e9aee316..05092f0d8 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev981 - Jay-Jay-OPL - Update dialogs.c - better strings for x & y offset #33 by ShaolinAssassin - Tue Jan 17 07:56:04 2017 -0800 rev980 - Jay-Jay-OPL - update Lang files - Mon Jan 16 11:09:29 2017 -0800 rev979 - Jay-Jay-OPL - Update dialogs.c by ShaolinAssassin X and Y Offset will use the same string as X and Y Offset (Hint text) from GSM menu. - Mon Jan 16 08:50:15 2017 -0800 rev978 - Jay-Jay-OPL - Fix Travis reverting test #26 by Dr-Q - Sun Jan 15 22:20:14 2017 -0800 diff --git a/modules/hdd/apa/Makefile b/modules/hdd/apa/Makefile index d1111de23..d9b4267cb 100644 --- a/modules/hdd/apa/Makefile +++ b/modules/hdd/apa/Makefile @@ -2,7 +2,7 @@ LIBAPA_PATH = ../libapa LIBAPA_SRC_DIR = $(LIBAPA_PATH)/src/ IOP_BIN = ps2hdd.irx -APA_OBJS = misc.o cache.o apa.o journal.o +APA_OBJS = misc.o cache.o apa.o journal.o free.o password.o IOP_OBJS = hdd_fio.o hdd.o imports.o $(APA_OBJS) IOP_INCS += -I$(CURDIR) -I$(LIBAPA_PATH)/include -I../common diff --git a/modules/hdd/apa/apa-opt.h b/modules/hdd/apa/apa-opt.h index c12bc8862..db2868fd3 100644 --- a/modules/hdd/apa/apa-opt.h +++ b/modules/hdd/apa/apa-opt.h @@ -1,7 +1,23 @@ -#ifndef _APA_OPT_H -#define _APA_OPT_H - -#define APA_PRINTF(format, ...) printf(format, ##__VA_ARGS__) -#define APA_DRV_NAME "hdd" - -#endif +#ifndef _APA_OPT_H +#define _APA_OPT_H + +#define APA_PRINTF(format,...) printf(format, ##__VA_ARGS__) +#define APA_DRV_NAME "hdd" + +/* Define (in your Makefile!) to build an OSD version, which will: + 1. When formatting, do not create any partitions other than __mbr. + 2. __mbr will be formatted with its password. + 3. All partitions can be accessed, even without the right password. + 4. The starting LBA of the partition will be returned in + the private_5 field of the stat structure (returned by getstat and dread). */ +//#define APA_OSD_VER 1 + +#ifdef APA_OSD_VER +#define APA_STAT_RETURN_PART_LBA 1 +#define APA_FORMAT_LOCK_MBR 1 +#else +#define APA_ENABLE_PASSWORDS 1 +#define APA_FORMAT_MAKE_PARTITIONS 1 +#endif + +#endif diff --git a/modules/hdd/apa/hdd.c b/modules/hdd/apa/hdd.c index ddbf8a2bc..65d7b69a1 100644 --- a/modules/hdd/apa/hdd.c +++ b/modules/hdd/apa/hdd.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # Start Up routines */ @@ -24,273 +23,244 @@ #include #include "hdd.h" #include "hdd_fio.h" +#include "opl-hdd-ioctl.h" IRX_ID("hdd_driver", APA_MODVER_MAJOR, APA_MODVER_MINOR); -static iop_device_ops_t hddOps = { - hddInit, - hddDeinit, - hddFormat, - hddOpen, - hddClose, - hddRead, - hddWrite, - hddLseek, - (void *)hddUnsupported, - hddRemove, - (void *)hddUnsupported, - (void *)hddUnsupported, - hddDopen, - hddClose, - hddDread, - hddGetStat, - (void *)hddUnsupported, - hddReName, - (void *)hddUnsupported, - (void *)hddUnsupported, - (void *)hddUnsupported, - (void *)hddUnsupported, - (void *)hddUnsupported, - hddDevctl, - (void *)hddUnsupported, - (void *)hddUnsupported, - hddIoctl2, +static iop_device_ops_t hddOps={ + hddInit, + hddDeinit, + hddFormat, + hddOpen, + hddClose, + hddRead, + hddWrite, + hddLseek, + (void*)hddUnsupported, + hddRemove, + (void*)hddUnsupported, + (void*)hddUnsupported, + hddDopen, + hddClose, + hddDread, + hddGetStat, + (void*)hddUnsupported, + hddReName, + (void*)hddUnsupported, + (void*)hddUnsupported, + (void*)hddUnsupported, + (void*)hddUnsupported, + (void*)hddUnsupported, + hddDevctl, + (void*)hddUnsupported, + (void*)hddUnsupported, + hddIoctl2, }; -static iop_device_t hddFioDev = { - "hdd", - IOP_DT_BLOCK | IOP_DT_FSEXT, - 1, - "HDD", - (struct _iop_device_ops *)&hddOps, +static iop_device_t hddFioDev={ + "hdd", + IOP_DT_BLOCK | IOP_DT_FSEXT, + 1, + "HDD", + (struct _iop_device_ops *)&hddOps, }; -hdd_device_t hddDevices[2] = { - {0, 0, 0, 3}, - {0, 0, 0, 3}}; +apa_device_t hddDevices[2]={ + {0, 0, 0, 3}, + {0, 0, 0, 3} +}; extern u32 apaMaxOpen; extern hdd_file_slot_t *hddFileSlots; static int inputError(char *input); -static int unlockDrive(u32 device); - -int hddCheckPartitionMax(s32 device, s32 size) -{ - return (hddDevices[device].partitionMaxSize >= size) ? 0 : -EINVAL; -} +static int unlockDrive(s32 device); -apa_cache_t *hddAddPartitionHere(s32 device, apa_params_t *params, u32 *emptyBlocks, - u32 sector, int *err) +int hddCheckPartitionMax(s32 device, u32 size) { - apa_cache_t *clink_this; - apa_cache_t *clink_next; - apa_cache_t *clink_new; - apa_header_t *header; - u32 i; - u32 tmp, some_size, part_end; - u32 tempSize; - - // walk empty blocks in case can use one :) - for (i = 0; i < 32; i++) { - if ((1 << i) >= params->size && emptyBlocks[i] != 0) - return apaInsertPartition(device, params, emptyBlocks[i], err); - } - clink_this = apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err); - header = clink_this->header; - part_end = header->start + header->length; - some_size = (part_end % params->size); - tmp = some_size ? params->size - some_size : 0; - - if (hddDevices[device].totalLBA < (part_end + params->size + tmp)) { - *err = -ENOSPC; - apaCacheFree(clink_this); - return NULL; - } - - if ((clink_next = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, err)) == NULL) { - apaCacheFree(clink_this); - return NULL; - } - - tempSize = params->size; - while (part_end % params->size) { - tempSize = params->size >> 1; - while (0x3FFFF < tempSize) { - if (!(part_end % tempSize)) { - clink_new = apaRemovePartition(device, part_end, 0, - clink_this->header->start, tempSize); - clink_this->header->next = part_end; - clink_this->flags |= APA_CACHE_FLAG_DIRTY; - clink_next->header->prev = clink_new->header->start; - part_end += tempSize; - clink_next->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink_this); - clink_this = clink_new; - break; - } - tempSize >>= 1; - } - } - if ((clink_new = apaFillHeader(device, params, part_end, 0, clink_this->header->start, - params->size, err)) != NULL) { - clink_this->header->next = part_end; - clink_this->flags |= APA_CACHE_FLAG_DIRTY; - clink_next->header->prev = clink_new->header->start; - clink_next->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - } - apaCacheFree(clink_this); - apaCacheFree(clink_next); - return clink_new; -} - -static void hddCalculateFreeSpace(u32 *free, u32 sectors) -{ - if (0x1FFFFF < sectors) { - *free += sectors; - return; - } - - if ((*free & sectors) == 0) { - *free |= sectors; - return; - } - - for (sectors >>= 1; 0x3FFFF < sectors; sectors >>= 1) - *free |= sectors; + return (hddDevices[device].partitionMaxSize >= size) ? 0 : -EINVAL; } -int hddGetFreeSectors(s32 device, u32 *free, hdd_device_t *deviceinfo) +apa_cache_t *hddAddPartitionHere(s32 device, const apa_params_t *params, u32 *emptyBlocks, + u32 sector, int *err) { - u32 sectors, partMax; - int rv; - apa_cache_t *clink; + apa_cache_t *clink_this; + apa_cache_t *clink_next; + apa_cache_t *clink_new; + apa_header_t *header; + u32 i; + u32 tmp, some_size, part_end; + u32 tempSize; - sectors = 0; - if ((clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv)) != NULL) { - do { - if (clink->header->type == 0) - hddCalculateFreeSpace(free, clink->header->length); - sectors += clink->header->length; - } while ((clink = apaGetNextHeader(clink, &rv)) != NULL); - } + // walk empty blocks in case can use one :) + for(i=0;i< 32;i++) + { + if((1 << i) >= params->size && emptyBlocks[i]!=0) + return apaInsertPartition(device, params, emptyBlocks[i], err); + } + clink_this=apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err); + header=clink_this->header; + part_end=header->start+header->length; + some_size=(part_end%params->size); + tmp = some_size ? params->size - some_size : 0; - if (rv == 0) { - for (partMax = deviceinfo[device].partitionMaxSize; 0x0003FFFF < partMax; partMax >>= 1) { - if ((sectors % deviceinfo[device].partitionMaxSize == 0) && (sectors + deviceinfo[device].partitionMaxSize < deviceinfo[device].totalLBA)) { - hddCalculateFreeSpace(free, deviceinfo[device].partitionMaxSize); - sectors += deviceinfo[device].partitionMaxSize; - break; - } - } + if(hddDevices[device].totalLBA < (part_end + params->size + tmp) + //Non-SONY: when dealing with large disks, this check may overflow (therefore, check for overflows!). + || (part_end < sector)) + { + *err=-ENOSPC; + apaCacheFree(clink_this); + return NULL; + } - APA_PRINTF(APA_DRV_NAME ": total = %08lx sectors, installable = %08lx sectors.\n", sectors, *free); - } + if((clink_next=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, err))==NULL) + { + apaCacheFree(clink_this); + return NULL; + } - return rv; + tempSize=params->size; + while(part_end%params->size) + { + tempSize=params->size>>1; + while(0x3FFFFheader->start, tempSize); + clink_this->header->next=part_end; + clink_this->flags|=APA_CACHE_FLAG_DIRTY; + clink_next->header->prev=clink_new->header->start; + part_end+=tempSize; + clink_next->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + apaCacheFree(clink_this); + clink_this=clink_new; + break; + } + tempSize>>=1; + } + } + if((clink_new=apaFillHeader(device, params, part_end, 0, clink_this->header->start, + params->size, err))!=NULL) + { + clink_this->header->next=part_end; + clink_this->flags|=APA_CACHE_FLAG_DIRTY; + clink_next->header->prev=clink_new->header->start; + clink_next->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + } + apaCacheFree(clink_this); + apaCacheFree(clink_next); + return clink_new; } static int inputError(char *input) { - APA_PRINTF(APA_DRV_NAME ": Error: Usage: %s [-o ] [-n ]\n", input); - return 1; + APA_PRINTF(APA_DRV_NAME": Error: Usage: %s [-o ] [-n ]\n", input); + return 1; } static void printStartup(void) { - APA_PRINTF(APA_DRV_NAME ": PS2 APA Driver v%d.%d (c) 2003 Vector\n", APA_MODVER_MAJOR, APA_MODVER_MINOR); - return; + APA_PRINTF(APA_DRV_NAME": PS2 APA Driver v%d.%d (c) 2003 Vector\n", APA_MODVER_MAJOR, APA_MODVER_MINOR); + return; } -static int unlockDrive(u32 device) +static int unlockDrive(s32 device) { - u8 id[32]; - int rv; - if ((rv = apaGetIlinkID(id)) == 0) - return ata_device_sce_sec_unlock(device, id); - return rv; + u8 id[32]; + int rv; + if((rv=apaGetIlinkID(id))==0) + return ata_device_sce_sec_unlock(device, id); + return rv; } int _start(int argc, char **argv) { - int i; - char *input; - int cacheSize = 3; - apa_ps2time_t tm; - ata_devinfo_t *hddInfo; + int i; + char *input; + int cacheSize=3; + apa_ps2time_t tm; + ata_devinfo_t *hddInfo; - printStartup(); + printStartup(); - if ((input = strrchr(argv[0], '/'))) - input++; - else - input = argv[0]; + if((input=strrchr(argv[0], '/'))) + input++; + else + input=argv[0]; - argc--; - argv++; - while (argc) { - if (argv[0][0] != '-') - break; - if (strcmp("-o", argv[0]) == 0) { - argc--; - argv++; - if (!argc) - return inputError(input); - i = strtol(argv[0], 0, 10); - if (i - 1 < 32) - apaMaxOpen = i; - } else if (strcmp("-n", argv[0]) == 0) { - argc--; - argv++; - if (!argc) - return inputError(input); - i = strtol(*argv, 0, 10); - if (cacheSize < i) - cacheSize = i; - } - argc--; - argv++; - } + argc--; argv++; + while(argc) + { + if(argv[0][0] != '-') + break; + if(strcmp("-o", argv[0])==0) + { + argc--; argv++; + if(!argc) + return inputError(input); + i=strtol(argv[0], 0, 10); + if(i-1<32) + apaMaxOpen=i; + } + else if(strcmp("-n", argv[0])==0) + { + argc--; argv++; + if(!argc) + return inputError(input); + i=strtol(*argv, 0, 10); + if(cacheSizeexists != 0 && hddInfo->has_packet == 0) { - hddDevices[i].status--; - hddDevices[i].totalLBA = hddInfo->total_sectors; - hddDevices[i].partitionMaxSize = apaGetPartitionMax(hddInfo->total_sectors); - if (unlockDrive(i) == 0) - hddDevices[i].status--; - APA_PRINTF(APA_DRV_NAME ": disk%d: 0x%08lx sectors, max 0x%08lx\n", i, - hddDevices[i].totalLBA, hddDevices[i].partitionMaxSize); - } - } - hddFileSlots = apaAllocMem(apaMaxOpen * sizeof(hdd_file_slot_t)); - if (hddFileSlots) - memset(hddFileSlots, 0, apaMaxOpen * sizeof(hdd_file_slot_t)); + APA_PRINTF(APA_DRV_NAME": max open = %ld, %d buffers\n", apaMaxOpen, cacheSize); + apaGetTime(&tm); + APA_PRINTF(APA_DRV_NAME": %02d:%02d:%02d %02d/%02d/%d\n", + tm.hour, tm.min, tm.sec, tm.month, tm.day, tm.year); + for(i=0;i < 2;i++) + { + if(!(hddInfo=ata_get_devinfo(i))) + { + APA_PRINTF(APA_DRV_NAME": Error: ata initialization failed.\n"); + return 0; + } + if(hddInfo->exists!=0 && hddInfo->has_packet==0) + { + hddDevices[i].status--; + hddDevices[i].totalLBA=hddInfo->total_sectors; + hddDevices[i].partitionMaxSize=apaGetPartitionMax(hddInfo->total_sectors); + if(unlockDrive(i)==0) + hddDevices[i].status--; + APA_PRINTF(APA_DRV_NAME": disk%d: 0x%08lx sectors, max 0x%08lx\n", i, + hddDevices[i].totalLBA, hddDevices[i].partitionMaxSize); + } + } + hddFileSlots=apaAllocMem(apaMaxOpen*sizeof(hdd_file_slot_t)); + if(hddFileSlots) + memset(hddFileSlots, 0, apaMaxOpen*sizeof(hdd_file_slot_t)); - apaCacheInit(cacheSize); - for (i = 0; i < 2; i++) { - if (hddDevices[i].status < 2) { - if (apaJournalRestore(i) != 0) - return 1; - if (apaGetFormat(i, (int *)&hddDevices[i].format)) - hddDevices[i].status--; - APA_PRINTF(APA_DRV_NAME ": drive status %ld, format version %08lx\n", - hddDevices[i].status, hddDevices[i].format); - } - } - DelDrv("hdd"); - if (AddDrv(&hddFioDev) == 0) { - APA_PRINTF(APA_DRV_NAME ": driver start.\n"); - return MODULE_RESIDENT_END; - } - return MODULE_NO_RESIDENT_END; + apaCacheInit(cacheSize); + for(i=0;i < 2;i++) + { + if(hddDevices[i].status<2) + { + if(apaJournalRestore(i)!=0) + return 1; + if(apaGetFormat(i, &hddDevices[i].format)) + hddDevices[i].status--; + APA_PRINTF(APA_DRV_NAME": drive status %d, format version %08x\n", + hddDevices[i].status, hddDevices[i].format); + } + } + DelDrv("hdd"); + if(AddDrv(&hddFioDev)==0) + { + APA_PRINTF(APA_DRV_NAME": driver start.\n"); + return MODULE_RESIDENT_END; + } + return MODULE_NO_RESIDENT_END; } diff --git a/modules/hdd/apa/hdd.h b/modules/hdd/apa/hdd.h index 6f8607823..e41db41c9 100644 --- a/modules/hdd/apa/hdd.h +++ b/modules/hdd/apa/hdd.h @@ -7,8 +7,7 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ -# Main APA Header file +# HDD.IRX APA Header file */ #ifndef _HDD_H @@ -16,26 +15,17 @@ typedef struct { - u32 totalLBA; - u32 partitionMaxSize; - u32 format; - u32 status; -} hdd_device_t; - -typedef struct -{ - iop_file_t *f; // used to see if open... - u32 post; // offset/post.... - u16 nsub; - u16 type; - char id[APA_IDMAX]; - apa_sub_t parts[APA_MAXSUB + 1]; // Partition data (0 = main partition, 1+ = sub-partition) + iop_file_t *f; // used to see if open... + u32 post; // offset/post.... + u16 nsub; + u16 type; + char id[APA_IDMAX]; + apa_sub_t parts[APA_MAXSUB+1]; // Partition data (0 = main partition, 1+ = sub-partition) } hdd_file_slot_t; /////////////////////////////////////////////////////////////////////////////// -// Function declerations -int hddCheckPartitionMax(s32 device, s32 size); -apa_cache_t *hddAddPartitionHere(s32 device, apa_params_t *params, u32 *EmptyBlocks, u32 sector, int *err); -int hddGetFreeSectors(s32 device, u32 *free, hdd_device_t *deviceinfo); +// Function declarations +int hddCheckPartitionMax(s32 device, u32 size); +apa_cache_t *hddAddPartitionHere(s32 device, const apa_params_t *params, u32 *EmptyBlocks, u32 sector, int *err); #endif diff --git a/modules/hdd/apa/hdd_fio.c b/modules/hdd/apa/hdd_fio.c index 3a93bf5c8..09fb0a671 100644 --- a/modules/hdd/apa/hdd_fio.c +++ b/modules/hdd/apa/hdd_fio.c @@ -7,15 +7,13 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # APA File System routines */ #include #include -#include "atad.h" +#include #include -#include #include #include #include @@ -29,19 +27,23 @@ #include "hdd.h" #include "hdd_fio.h" -hdd_file_slot_t *hddFileSlots; -int fioSema; -u32 apaMaxOpen = 1; +hdd_file_slot_t *hddFileSlots; +int fioSema; +u32 apaMaxOpen=1; extern const char apaMBRMagic[]; -extern hdd_device_t hddDevices[]; +extern apa_device_t hddDevices[]; -static const char *formatPartList[] = { - "__net", "__system", "__sysconf", "__common", NULL}; +#ifdef APA_FORMAT_MAKE_PARTITIONS +static const char *formatPartList[]={ + "__net", "__system", "__sysconf", "__common", NULL +}; +#endif #define APA_NUMBER_OF_SIZES 9 -static const char *sizeList[APA_NUMBER_OF_SIZES] = { - "128M", "256M", "512M", "1G", "2G", "4G", "8G", "16G", "32G"}; +static const char *sizeList[APA_NUMBER_OF_SIZES]={ + "128M", "256M", "512M", "1G", "2G", "4G", "8G", "16G", "32G" +}; /////////////////////////////////////////////////////////////////////////////// // Function declarations @@ -49,483 +51,603 @@ static int fioPartitionSizeLookUp(char *str); static int fioInputBreaker(char const **arg, char *outBuf, int maxout); static int fioDataTransfer(iop_file_t *f, void *buf, int size, int mode); static int getFileSlot(apa_params_t *params, hdd_file_slot_t **fileSlot); -static int ioctl2Transfer(u32 device, hdd_file_slot_t *fileSlot, hddIoctl2Transfer_t *arg); +static int ioctl2Transfer(s32 device, hdd_file_slot_t *fileSlot, hddIoctl2Transfer_t *arg); static void fioGetStatFiller(apa_cache_t *clink1, iox_stat_t *stat); static int ioctl2AddSub(hdd_file_slot_t *fileSlot, char *argp); static int ioctl2DeleteLastSub(hdd_file_slot_t *fileSlot); -static int devctlSwapTemp(u32 device, char *argp); +static int devctlSwapTemp(s32 device, char *argp); static int fioPartitionSizeLookUp(char *str) { - int i; - - for (i = 0; i < APA_NUMBER_OF_SIZES; i++) { - if (strcmp(str, sizeList[i]) == 0) - return (256 * 1024) << i; - } - APA_PRINTF(APA_DRV_NAME ": Error: Invalid partition size, %s.\n", str); - return -EINVAL; + int i; + + for(i=0;iid, APA_IDMAX)) != 0) - return rv; - if ((params->id[0] == 0) || (arg[0] == 0)) - return 0; - - memset(szBuf, 0, sizeof(szBuf)); - if ((rv = fioInputBreaker(&arg, szBuf, sizeof(szBuf))) != 0) - return rv; - - if ((rv = fioPartitionSizeLookUp(szBuf)) < 0) - return rv; - params->size = rv; - - // Filesystem type is fixed to PFS! - params->type = APA_TYPE_PFS; - return rv; + char argBuf[32]; + int rv=0, i; + static const struct apaFsType fsTypes[]={ + {"PFS", APA_TYPE_PFS}, + {"CFS", APA_TYPE_CFS}, + {"EXT2", APA_TYPE_EXT2}, + {"EXT2SWAP", APA_TYPE_EXT2SWAP} + }; + + if(params==NULL) + return -EINVAL; + memset(params, 0, sizeof(apa_params_t)); + + while(arg[0]==' ') arg++; + + if(arg[0]==0 || arg[0]==',') + return -EINVAL; + if((rv=fioInputBreaker(&arg, params->id, APA_IDMAX))!=0) + return rv; + if(arg[0] == '\0') // Return if there are no further parameters. + return 0; + + if((rv=fioInputBreaker(&arg, params->fpwd, APA_PASSMAX))!=0) + return rv; + + if(params->fpwd[0] != '\0') + apaEncryptPassword(params->id, params->fpwd, params->fpwd); + + if(arg[0] == '\0') // Return if there are no further parameters. + return 0; + + if((rv=fioInputBreaker(&arg, params->rpwd, APA_PASSMAX))!=0) + return rv; + + if(params->rpwd[0] != '\0') + apaEncryptPassword(params->id, params->rpwd, params->rpwd); + + if(arg[0] == '\0') // Return if there are no further parameters. + return 0; + + memset(argBuf, 0, sizeof(argBuf)); + if((rv=fioInputBreaker(&arg, argBuf, sizeof(argBuf)))!=0) + return rv; + + if((rv=fioPartitionSizeLookUp(argBuf))<0) + return rv; + params->size=rv; + + memset(argBuf, 0, sizeof(argBuf)); + if((rv=fioInputBreaker(&arg, argBuf, sizeof(argBuf)))!=0) + return rv; + + for(i = 0; i < 4; i++) + { + if(!strcmp(argBuf, fsTypes[i].desc)) + { + params->type = fsTypes[i].type; + break; + } + } + + if(i == 4) + { + printf("hdd: error: Invalid fstype, %s.\n", argBuf); + return -EINVAL; + } + + return rv; } static int getFileSlot(apa_params_t *params, hdd_file_slot_t **fileSlot) { - int i; - - for (i = 0; i < apaMaxOpen; i++) { - if (hddFileSlots[i].f) - if (memcmp(hddFileSlots[i].id, ¶ms->id, APA_IDMAX) == 0) - return -EBUSY; // file is open - } - for (i = 0; i < apaMaxOpen; i++) { - if (!hddFileSlots[i].f) { - *fileSlot = &hddFileSlots[i]; - return 0; - } - } - return -EMFILE; // no file slots free :( + int i; + + for(i=0;iid, APA_IDMAX)==0) + return -EBUSY;// file is open + } + for(i=0;iprivdata; - - if ((size & 0x1FF)) - return -EINVAL; - size >>= 9; // size/512 - - if (fileSlot->post + size >= 0x1FF9) // no over reading - size = 0x1FF8 - fileSlot->post; - - if (size != 0) { - int rv = 0; - - WaitSema(fioSema); - if (ata_device_sector_io(f->unit, buf, fileSlot->post + fileSlot->parts[0].start + 8, size, mode)) - rv = -EIO; - SignalSema(fioSema); - if (rv == 0) { - fileSlot->post += size; - return size << 9; - } - } - return 0; + hdd_file_slot_t *fileSlot=(hdd_file_slot_t *)f->privdata; + + if((size & 0x1FF)) + return -EINVAL; + size>>=9; // size/512 + + if(fileSlot->post+size>=0x1FF9)// no over reading + size=0x1FF8-fileSlot->post; + + if(size!=0) { + int rv=0; + + WaitSema(fioSema); + if(ata_device_sector_io(f->unit, buf, fileSlot->post+fileSlot->parts[0].start+8, size, mode)) + rv=-EIO; + SignalSema(fioSema); + if(rv==0) + { + fileSlot->post+=size; + return size<<9; + } + + return rv; + } + return 0; } -static int ioctl2Transfer(u32 device, hdd_file_slot_t *fileSlot, hddIoctl2Transfer_t *arg) +static int ioctl2Transfer(s32 device, hdd_file_slot_t *fileSlot, hddIoctl2Transfer_t *arg) { - if (fileSlot->nsub < arg->sub) - return -ENODEV; + if(fileSlot->nsubsub) + return -ENODEV; - // main partitions can only be read starting from the 4MB offset. - if (arg->sub == 0 && (arg->sector < 0x2000)) - return -EINVAL; - // sub-partitions can only be read starting from after the header. - if (arg->sub != 0 && (arg->sector < 2)) - return -EINVAL; + // main partitions can only be read starting from the 4MB offset. + if(arg->sub==0 && (arg->sector < 0x2000)) + return -EINVAL; + // sub-partitions can only be read starting from after the header. + if(arg->sub!=0 && (arg->sector < 2)) + return -EINVAL; - if (fileSlot->parts[arg->sub].length < arg->sector + arg->size) - return -ENXIO; + if(fileSlot->parts[arg->sub].lengthsector+arg->size) + return -ENXIO; - if (ata_device_sector_io(device, arg->buffer, - fileSlot->parts[arg->sub].start + arg->sector, arg->size, arg->mode)) - return -EIO; + if(ata_device_sector_io(device, arg->buffer, + fileSlot->parts[arg->sub].start+arg->sector, arg->size, arg->mode)) + return -EIO; - return 0; -} - -static void hddPowerOffHandler(void *data) -{ - APA_PRINTF("hdd flush cache\n"); - ata_device_flush_cache(0); + return 0; } int hddInit(iop_device_t *f) { - iop_sema_t sema; + iop_sema_t sema; - sema.attr = 1; - sema.initial = 1; - sema.max = 1; - sema.option = 0; - fioSema = CreateSema(&sema); + sema.attr=1; + sema.initial=1; + sema.max=1; + sema.option=0; + fioSema=CreateSema(&sema); - AddPowerOffHandler(&hddPowerOffHandler, NULL); - return 0; + return 0; } int hddDeinit(iop_device_t *f) { - DeleteSema(fioSema); - return 0; + DeleteSema(fioSema); + return 0; } -int hddFormat(iop_file_t *f, const char *dev, const char *blockdev, void *arg, size_t arglen) +int hddFormat(iop_file_t *f, const char *dev, const char *blockdev, void *arg, int arglen) { - int rv = 0; - apa_cache_t *clink; - int i; - apa_params_t params; - u32 emptyBlocks[32]; - - if (f->unit >= 2) - return -ENXIO; - - // clear all errors on hdd - clink = apaCacheAlloc(); - memset(clink->header, 0, sizeof(apa_header_t)); - if (ata_device_sector_io(f->unit, clink->header, APA_SECTOR_SECTOR_ERROR, 1, ATA_DIR_WRITE)) { - apaCacheFree(clink); - return -EIO; - } - if (ata_device_sector_io(f->unit, clink->header, APA_SECTOR_PART_ERROR, 1, ATA_DIR_WRITE)) { - apaCacheFree(clink); - return -EIO; - } - // clear apa headers - for (i = 1024 * 8; i < hddDevices[f->unit].totalLBA; i += (1024 * 256)) { - ata_device_sector_io(f->unit, clink->header, i, sizeof(apa_header_t) / 512, - ATA_DIR_WRITE); - } - apaCacheFree(clink); - if ((rv = apaJournalReset(f->unit)) != 0) - return rv; - - // set up mbr :) - if ((clink = apaCacheGetHeader(f->unit, 0, APA_IO_MODE_WRITE, &rv))) { - apa_header_t *header = clink->header; - memset(header, 0, sizeof(apa_header_t)); - header->magic = APA_MAGIC; - header->length = (1024 * 256); // 128MB - header->type = APA_TYPE_MBR; - strcpy(header->id, "__mbr"); - memcpy(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic)); - - header->mbr.version = APA_MBR_VERSION; - header->mbr.nsector = 0; - apaGetTime(&header->created); - apaGetTime(&header->mbr.created); - header->checksum = apaCheckSum(header); - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushDirty(clink); - ata_device_flush_cache(f->unit); - apaCacheFree(clink); - hddDevices[f->unit].status = 0; - hddDevices[f->unit].format = APA_MBR_VERSION; - } - memset(&emptyBlocks, 0, sizeof(emptyBlocks)); - memset(¶ms, 0, sizeof(apa_params_t)); - params.size = (1024 * 256); - params.type = APA_TYPE_PFS; - - // add __net, __system.... - for (i = 0; formatPartList[i]; i++) { - memset(params.id, 0, APA_IDMAX); - strcpy(params.id, formatPartList[i]); - if (!(clink = hddAddPartitionHere(f->unit, ¶ms, emptyBlocks, i ? clink->sector : 0, &rv))) - return rv; - apaCacheFree(clink); - - params.size <<= 1; - if (hddDevices[f->unit].partitionMaxSize < params.size) - params.size = hddDevices[f->unit].partitionMaxSize; - } - return rv; + int rv=0; + apa_cache_t *clink; + u32 i; +#ifdef APA_FORMAT_MAKE_PARTITIONS + apa_params_t params; + u32 emptyBlocks[32]; +#endif + + if(f->unit >= 2) + return -ENXIO; + + // clear all errors on hdd + clink=apaCacheAlloc(); + memset(clink->header, 0, sizeof(apa_header_t)); + if(ata_device_sector_io(f->unit, clink->header, APA_SECTOR_SECTOR_ERROR, 1, ATA_DIR_WRITE)){ + apaCacheFree(clink); + return -EIO; + } + if(ata_device_sector_io(f->unit, clink->header, APA_SECTOR_PART_ERROR, 1, ATA_DIR_WRITE)){ + apaCacheFree(clink); + return -EIO; + } + // clear apa headers + for(i=1024*8;iunit].totalLBA;i+=(1024*256)) + { + ata_device_sector_io(f->unit, clink->header, i, sizeof(apa_header_t)/512, + ATA_DIR_WRITE); + } + apaCacheFree(clink); + if((rv=apaJournalReset(f->unit))!=0) + return rv; + + // set up mbr :) + if((clink=apaCacheGetHeader(f->unit, 0, APA_IO_MODE_WRITE, &rv))){ + apa_header_t *header=clink->header; + memset(header, 0, sizeof(apa_header_t)); + header->magic=APA_MAGIC; + header->length=(1024*256); // 128MB + header->type=APA_TYPE_MBR; + strcpy(header->id,"__mbr"); +#ifdef APA_FORMAT_LOCK_MBR + apaEncryptPassword(header->id, header->fpwd, "sce_mbr"); + apaEncryptPassword(header->id, header->rpwd, "sce_mbr"); +#endif + memcpy(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic)); + + header->mbr.version=APA_MBR_VERSION; + header->mbr.nsector=0; + apaGetTime(&header->created); + apaGetTime(&header->mbr.created); + header->checksum=apaCheckSum(header); + clink->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushDirty(clink); + ata_device_flush_cache(f->unit); + apaCacheFree(clink); + hddDevices[f->unit].status=0; + hddDevices[f->unit].format=APA_MBR_VERSION; + } +#ifdef APA_FORMAT_MAKE_PARTITIONS + memset(&emptyBlocks, 0, sizeof(emptyBlocks)); + memset(¶ms, 0, sizeof(apa_params_t)); + params.size=(1024*256); + params.type=APA_TYPE_PFS; + + // add __net, __system.... + for(i=0;formatPartList[i];i++) + { + memset(params.id, 0, APA_IDMAX); + strcpy(params.id, formatPartList[i]); + if(!(clink=hddAddPartitionHere(f->unit, ¶ms, emptyBlocks, i ? clink->sector : 0, &rv))) + return rv; + apaCacheFree(clink); + + params.size<<=1; + if(hddDevices[f->unit].partitionMaxSize < params.size) + params.size=hddDevices[f->unit].partitionMaxSize; + } +#endif + return rv; } -static int apaOpen(u32 device, hdd_file_slot_t *fileSlot, apa_params_t *params, int mode) +static int apaOpen(s32 device, hdd_file_slot_t *fileSlot, apa_params_t *params, int mode) { - int rv = 0; - u32 emptyBlocks[32]; - apa_cache_t *clink; - apa_cache_t *clink2; - u32 sector = 0; - - - // walk all looking for any empty blocks & look for partition - clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv); - memset(&emptyBlocks, 0, sizeof(emptyBlocks)); - while (clink) { - sector = clink->sector; - if (!(clink->header->flags & APA_FLAG_SUB)) { - if (memcmp(clink->header->id, params->id, APA_IDMAX) == 0) - break; // found :) - } - addEmptyBlock(clink->header, emptyBlocks); - clink = apaGetNextHeader(clink, &rv); - } - - if (rv != 0) - return rv; - rv = -ENOENT; - - if (clink == NULL && (mode & O_CREAT)) { - if ((rv = hddCheckPartitionMax(device, params->size)) >= 0) { - if ((clink = hddAddPartitionHere(device, params, emptyBlocks, sector, &rv)) != NULL) { - sector = clink->header->start; - clink2 = apaCacheAlloc(); - memset(clink2->header, 0, sizeof(apa_header_t)); - ata_device_sector_io(device, clink2->header, sector + 8, 2, ATA_DIR_WRITE); - ata_device_sector_io(device, clink2->header, sector + 0x2000, 2, ATA_DIR_WRITE); - apaCacheFree(clink2); - } - } - } - if (clink == NULL) - return rv; - fileSlot->parts[0].start = clink->header->start; - fileSlot->parts[0].length = clink->header->length; - memcpy(&fileSlot->parts[1], &clink->header->subs, APA_MAXSUB * sizeof(apa_sub_t)); - fileSlot->type = clink->header->type; - fileSlot->nsub = clink->header->nsub; - memcpy(&fileSlot->id, &clink->header->id, APA_IDMAX); - apaCacheFree(clink); - rv = 0; - if (apaPassCmp(clink->header->fpwd, NULL) != 0) - rv = -EACCES; - return rv; + int rv=0; + u32 emptyBlocks[32]; + apa_cache_t *clink; + apa_cache_t *clink2; + u32 sector=0; + + // walk all looking for any empty blocks & look for partition + clink=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv); + memset(&emptyBlocks, 0, sizeof(emptyBlocks)); + while(clink) + { + sector=clink->sector; + if(!(clink->header->flags & APA_FLAG_SUB)) { + if(memcmp(clink->header->id, params->id, APA_IDMAX) == 0) + break; // found :) + } + apaAddEmptyBlock(clink->header, emptyBlocks); + clink=apaGetNextHeader(clink, &rv); + } + + if(rv!=0) + return rv; + rv=-ENOENT; + + if(clink==NULL && (mode & O_CREAT)) + { + if((rv=hddCheckPartitionMax(device, params->size))>=0) { + if((clink=hddAddPartitionHere(device, params, emptyBlocks, sector, &rv))!=NULL) + { + sector=clink->header->start; + clink2=apaCacheAlloc(); + memset(clink2->header, 0, sizeof(apa_header_t)); + ata_device_sector_io(device, clink2->header, sector+8 , 2, ATA_DIR_WRITE); + ata_device_sector_io(device, clink2->header, sector+0x2000, 2, ATA_DIR_WRITE); + apaCacheFree(clink2); + } + } + } + if(clink==NULL) + return rv; + fileSlot->parts[0].start=clink->header->start; + fileSlot->parts[0].length=clink->header->length; + memcpy(&fileSlot->parts[1], &clink->header->subs, APA_MAXSUB*sizeof(apa_sub_t)); + fileSlot->type=clink->header->type; + fileSlot->nsub=clink->header->nsub; + memcpy(&fileSlot->id, &clink->header->id, APA_IDMAX); + apaCacheFree(clink); + if(apaPassCmp(clink->header->fpwd, params->fpwd)!=0) + { + rv = (!(mode & O_WRONLY)) ? apaPassCmp(clink->header->rpwd, params->rpwd) : -EACCES; + } else + rv = 0; + + return rv; } -static int apaRemove(u32 device, char *id) +static int apaRemove(s32 device, const char *id, const char *fpwd) { - int i; - u32 nsub; - apa_cache_t *clink; - apa_cache_t *clink2; - int rv; - - for (i = 0; i < apaMaxOpen; i++) // look to see if open - { - if (hddFileSlots[i].f != 0) { - if (memcmp(hddFileSlots[i].id, id, APA_IDMAX) == 0) - return -EBUSY; - } - } - if (id[0] == '_' && id[1] == '_') - return -EACCES; - if ((clink = apaFindPartition(device, id, &rv)) == NULL) - return rv; - if (apaPassCmp(clink->header->fpwd, NULL)) { - apaCacheFree(clink); - return -EACCES; - } - // remove all subs frist... - nsub = clink->header->nsub; - clink->header->nsub = 0; - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - for (i = nsub - 1; i != -1; i--) { - if ((clink2 = apaCacheGetHeader(device, clink->header->subs[i].start, APA_IO_MODE_READ, &rv))) { - if ((rv = apaDelete(clink2))) { - apaCacheFree(clink); - return rv; - } - } - } - if (rv == 0) - return apaDelete(clink); - - apaCacheFree(clink); - return rv; + u32 nsub, i; + apa_cache_t *clink; + apa_cache_t *clink2; + int rv; + + for(i=0;iheader->fpwd, fpwd)) + { + apaCacheFree(clink); + return -EACCES; + } + // remove all subs frist... + nsub=clink->header->nsub; + clink->header->nsub=0; + clink->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + for(i=nsub-1;i!=-1;i--) + { + if((clink2=apaCacheGetHeader(device, clink->header->subs[i].start, APA_IO_MODE_READ, &rv))){ + if((rv=apaDelete(clink2))){ + apaCacheFree(clink); + return rv; + } + } + } + if(rv==0) + return apaDelete(clink); + + apaCacheFree(clink); + return rv; +} + +// Unofficial helper for renaming APA partitions. +static int apaRename(s32 device, const apa_params_t *oldParams, const apa_params_t *newParams) +{ + apa_cache_t *clink; + int i, rv; + + // look to see if can make(newname) or not... + if((clink = apaFindPartition(device, newParams->id, &rv)) != NULL) + { + apaCacheFree(clink); + SignalSema(fioSema); + return -EEXIST; // File exists + } + + // look to see if open(oldname) + for(i=0;iid, APA_IDMAX)==0) + { + SignalSema(fioSema); + return -EBUSY; + } + } + } + + // Do not allow system partitions (__*) to be renamed. + if(oldParams->id[0]=='_' && oldParams->id[1]=='_') + return -EACCES; + + // find :) + if((clink = apaFindPartition(device, oldParams->id, &rv)) == NULL) + { + SignalSema(fioSema); + return rv; + } + + // Check for access rights. + if(apaPassCmp(clink->header->fpwd, oldParams->fpwd) != 0) + { + apaCacheFree(clink); + return -EACCES; + } + + // do the renaming :) note: subs have no names!! + memcpy(clink->header->id, newParams->id, APA_IDMAX); + + // Update passwords + memcpy(clink->header->rpwd, newParams->rpwd, APA_PASSMAX); + memcpy(clink->header->fpwd, newParams->fpwd, APA_PASSMAX); + + clink->flags|=APA_CACHE_FLAG_DIRTY; + + apaCacheFlushAllDirty(device); + apaCacheFree(clink); + + return 0; } int hddRemove(iop_file_t *f, const char *name) { - int rv; - apa_params_t params; + int rv; + apa_params_t params; - if ((rv = fioGetInput(name, ¶ms)) < 0) - return rv; + if((rv=fioGetInput(name, ¶ms)) < 0) + return rv; - WaitSema(fioSema); - rv = apaRemove(f->unit, params.id); - SignalSema(fioSema); + WaitSema(fioSema); + rv = apaRemove(f->unit, params.id, params.fpwd); + SignalSema(fioSema); - return rv; + return rv; } int hddOpen(iop_file_t *f, const char *name, int flags, int mode) { - int rv; - apa_params_t params; - hdd_file_slot_t *fileSlot; - - if (f->unit >= 2 || hddDevices[f->unit].status != 0) - return -ENODEV; - - if (!(f->mode & O_DIROPEN)) - if ((rv = fioGetInput(name, ¶ms)) < 0) - return rv; - - WaitSema(fioSema); - if ((rv = getFileSlot(¶ms, &fileSlot)) == 0) { - if (!(f->mode & O_DIROPEN)) { - if ((rv = apaOpen(f->unit, fileSlot, ¶ms, flags)) == 0) { - fileSlot->f = f; - f->privdata = fileSlot; - } - } else { - fileSlot->f = f; - f->privdata = fileSlot; - } - } - SignalSema(fioSema); - return rv; + int rv; + apa_params_t params; + hdd_file_slot_t *fileSlot; + + if(f->unit >= 2 || hddDevices[f->unit].status!=0) + return -ENODEV; + + if(!(f->mode & O_DIROPEN)) + if((rv=fioGetInput(name, ¶ms)) < 0) + return rv; + + WaitSema(fioSema); + if((rv=getFileSlot(¶ms, &fileSlot))==0) { + if(!(f->mode & O_DIROPEN)) { + if((rv=apaOpen(f->unit, fileSlot, ¶ms, flags))==0){ + fileSlot->f=f; + f->privdata=fileSlot; + } + } + else + { + fileSlot->f=f; + f->privdata=fileSlot; + } + } + SignalSema(fioSema); + return rv; } int hddClose(iop_file_t *f) { - WaitSema(fioSema); - memset(f->privdata, 0, sizeof(hdd_file_slot_t)); - SignalSema(fioSema); - return 0; + WaitSema(fioSema); + memset(f->privdata, 0, sizeof(hdd_file_slot_t)); + SignalSema(fioSema); + return 0; } int hddRead(iop_file_t *f, void *buf, int size) { - return fioDataTransfer(f, buf, size, ATA_DIR_READ); + return fioDataTransfer(f, buf, size, ATA_DIR_READ); } int hddWrite(iop_file_t *f, void *buf, int size) { - if (!(f->mode & O_WRONLY)) - return -EACCES; - return fioDataTransfer(f, buf, size, ATA_DIR_WRITE); + if(!(f->mode & O_WRONLY)) + return -EACCES; + return fioDataTransfer(f, buf, size, ATA_DIR_WRITE); } int hddLseek(iop_file_t *f, int post, int whence) { - int rv = 0; - hdd_file_slot_t *fileSlot; - - // test input( no seeking to end point less :P ) - if (whence == SEEK_END) - return -EINVAL; - if ((post & 0x1FF)) - return -EINVAL; - - post >>= 9; // post/512 - - WaitSema(fioSema); - fileSlot = f->privdata; - if (whence == SEEK_CUR) { - if ((fileSlot->post + post) < 0 || (fileSlot->post + post) >= 0x1FF9) - rv = -EINVAL; - else { - fileSlot->post += post; - rv = fileSlot->post << 9; - } - } else if (whence == SEEK_SET) { - if (post < 0 || post >= 0x1FF9) - rv = -EINVAL; - else { - fileSlot->post = post; - rv = fileSlot->post << 9; - } - } - SignalSema(fioSema); - return rv; + int rv=0; + hdd_file_slot_t *fileSlot; + + // test input( no seeking to end point less :P ) + if(whence==SEEK_END) + return -EINVAL; + if((post & 0x1FF)) + return -EINVAL; + + post>>=9;// post/512 + + WaitSema(fioSema); + fileSlot=f->privdata; + if(whence==SEEK_CUR) + { + if((fileSlot->post+post) < 0 || (fileSlot->post+post)>=0x1FF9) + rv=-EINVAL; + else + { + fileSlot->post+=post; + rv=fileSlot->post<<9; + } + } + else if(whence==SEEK_SET) + { + if(post < 0 || post>=0x1FF9) + rv=-EINVAL; + else + { + fileSlot->post=post; + rv=fileSlot->post<<9; + } + + } + SignalSema(fioSema); + return rv; } -void fioGetStatFiller(apa_cache_t *clink, iox_stat_t *stat) +static void fioGetStatFiller(apa_cache_t *clink, iox_stat_t *stat) { - apa_header_t *header; - u64 size; - - stat->mode = clink->header->type; - stat->attr = clink->header->flags; - stat->hisize = 0; - size = clink->header->length; - size *= 512; - stat->size = size & 0xFFFFFFFF; - size >>= 32; - stat->hisize = size & 0xFFFFFFFF; - header = clink->header; - memcpy(&stat->ctime, &clink->header->created, sizeof(apa_ps2time_t)); - memcpy(&stat->atime, &clink->header->created, sizeof(apa_ps2time_t)); - memcpy(&stat->mtime, &clink->header->created, sizeof(apa_ps2time_t)); - if (clink->header->flags & APA_FLAG_SUB) - stat->private_0 = clink->header->number; - else - stat->private_0 = clink->header->nsub; - stat->private_1 = 0; - stat->private_2 = 0; - stat->private_3 = 0; - stat->private_4 = 0; - //stat->private_5=0;// game ver - stat->private_5 = clink->header->start; // sony ver + stat->mode=clink->header->type; + stat->attr=clink->header->flags; + stat->hisize=0; + stat->size=clink->header->length; + memcpy(&stat->ctime, &clink->header->created, sizeof(apa_ps2time_t)); + memcpy(&stat->atime, &clink->header->created, sizeof(apa_ps2time_t)); + memcpy(&stat->mtime, &clink->header->created, sizeof(apa_ps2time_t)); + if(clink->header->flags & APA_FLAG_SUB) + stat->private_0=clink->header->number; + else + stat->private_0=clink->header->nsub; + stat->private_1=0; + stat->private_2=0; + stat->private_3=0; + stat->private_4=0; +#ifndef APA_STAT_RETURN_PART_LBA + stat->private_5=0;// game ver +#else + stat->private_5=clink->header->start;// SONY ver (return start LBA of the partition) +#endif } int hddGetStat(iop_file_t *f, const char *name, iox_stat_t *stat) { - apa_cache_t *clink; - apa_params_t params; - int rv; - - if ((rv = fioGetInput(name, ¶ms)) < 0) - return rv; - - WaitSema(fioSema); - if ((clink = apaFindPartition(f->unit, params.id, &rv))) { - if ((rv = apaPassCmp(clink->header->rpwd, NULL)) == 0) - fioGetStatFiller(clink, stat); - apaCacheFree(clink); - } - SignalSema(fioSema); - return rv; + apa_cache_t *clink; + apa_params_t params; + int rv; + + if((rv=fioGetInput(name, ¶ms))<0) + return rv; + + WaitSema(fioSema); + if((clink=apaFindPartition(f->unit, params.id, &rv))){ + if((rv=apaPassCmp(clink->header->fpwd, params.fpwd))==0 || (rv=apaPassCmp(clink->header->rpwd, params.rpwd))==0) + fioGetStatFiller(clink, stat); + apaCacheFree(clink); + } + SignalSema(fioSema); + return rv; } int hddDopen(iop_file_t *f, const char *name) @@ -535,385 +657,373 @@ int hddDopen(iop_file_t *f, const char *name) int hddDread(iop_file_t *f, iox_dirent_t *dirent) { - int rv; - hdd_file_slot_t *fileSlot = f->privdata; - apa_cache_t *clink; - - if (!(f->mode & O_DIROPEN)) - return -ENOTDIR; - - if (fileSlot->parts[0].start == -1) - return 0; // end :) - - WaitSema(fioSema); - if ((clink = apaCacheGetHeader(f->unit, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv)) && - clink->header->length) { - if (clink->header->flags & APA_FLAG_SUB) { - // if sub get id from main header... - apa_cache_t *cmain = apaCacheGetHeader(f->unit, clink->header->main, APA_IO_MODE_READ, &rv); - if (cmain != NULL) { - rv = strlen(cmain->header->id); - strcpy(dirent->name, cmain->header->id); - apaCacheFree(cmain); - } - } else { - rv = strlen(clink->header->id); - strcpy(dirent->name, clink->header->id); - } - fioGetStatFiller(clink, &dirent->stat); - if (clink->header->next == 0) - fileSlot->parts[0].start = -1; // mark end - else - fileSlot->parts[0].start = clink->header->next; // set next - apaCacheFree(clink); - } - SignalSema(fioSema); - return rv; + int rv; + hdd_file_slot_t *fileSlot=f->privdata; + apa_cache_t *clink; + + if(!(f->mode & O_DIROPEN)) + return -ENOTDIR; + + if(fileSlot->parts[0].start==-1) + return 0;// end :) + + WaitSema(fioSema); + if((clink=apaCacheGetHeader(f->unit, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv)) && + clink->header->length) + { + if(clink->header->flags & APA_FLAG_SUB) { + // if sub get id from main header... + apa_cache_t *cmain=apaCacheGetHeader(f->unit, clink->header->main, APA_IO_MODE_READ, &rv); + if(cmain!=NULL){ + /* This was the SONY original, which didn't do bounds-checking: + rv=strlen(cmain->header->id); + strcpy(dirent->name, cmain->header->id); */ + strncpy(dirent->name, cmain->header->id, APA_IDMAX); + dirent->name[APA_IDMAX] = '\0'; + rv=strlen(dirent->name); + + apaCacheFree(cmain); + } + } + else { + /* This was the SONY original, which didn't do bounds-checking: + rv=strlen(clink->header->id); + strcpy(dirent->name, clink->header->id); */ + strncpy(dirent->name, clink->header->id, APA_IDMAX); + dirent->name[APA_IDMAX] = '\0'; + rv=strlen(dirent->name); + } + fioGetStatFiller(clink, &dirent->stat); + if(clink->header->next==0) + fileSlot->parts[0].start=-1; // mark end + else + fileSlot->parts[0].start=clink->header->next;// set next + apaCacheFree(clink); + } + SignalSema(fioSema); + return rv; } +/* Originally, SONY provided no function for renaming partitions. + Syntax: rename , , + + The full-access password (fpwd) is required. + System partitions (__*) cannot be renamed. */ int hddReName(iop_file_t *f, const char *oldname, const char *newname) { - int i, rv; - apa_cache_t *clink; - char tmpBuf[APA_IDMAX]; - - if (f->unit >= 2 || hddDevices[f->unit].status != 0) - return -ENODEV; // No such device - - WaitSema(fioSema); - // look to see if can make(newname) or not... - memset(tmpBuf, 0, APA_IDMAX); - strncpy(tmpBuf, newname, APA_IDMAX - 1); - tmpBuf[APA_IDMAX - 1] = '\0'; - if ((clink = apaFindPartition(f->unit, tmpBuf, &rv))) { - apaCacheFree(clink); - SignalSema(fioSema); - return -EEXIST; // File exists - } - - // look to see if open(oldname) - memset(tmpBuf, 0, APA_IDMAX); - strncpy(tmpBuf, oldname, APA_IDMAX - 1); - tmpBuf[APA_IDMAX - 1] = '\0'; - for (i = 0; i < apaMaxOpen; i++) { - if (hddFileSlots[i].f != 0) - if (hddFileSlots[i].f->unit == f->unit) - if (memcmp(hddFileSlots[i].id, oldname, APA_IDMAX) == 0) { - SignalSema(fioSema); - return -EBUSY; - } - } - - // find :) - if (!(clink = apaFindPartition(f->unit, tmpBuf, &rv))) { - SignalSema(fioSema); - return -ENOENT; - } - - // do the renaming :) note: subs have no names!! - memset(clink->header->id, 0, APA_IDMAX); // all cmp are done with memcmp! - strncpy(clink->header->id, newname, APA_IDMAX - 1); - clink->header->id[APA_IDMAX - 1] = '\0'; - clink->flags |= APA_CACHE_FLAG_DIRTY; - - apaCacheFlushAllDirty(f->unit); - apaCacheFree(clink); - SignalSema(fioSema); - return 0; + apa_params_t oldParams; + apa_params_t newParams; + int rv; + + if((rv=fioGetInput(oldname, &oldParams))<0) + return rv; + if((rv=fioGetInput(newname, &newParams))<0) + return rv; + + WaitSema(fioSema); + rv = apaRename(f->unit, &oldParams, &newParams); + SignalSema(fioSema); + + return rv; } static int ioctl2AddSub(hdd_file_slot_t *fileSlot, char *argp) { - int rv; - u32 device = fileSlot->f->unit; - apa_params_t params; - u32 emptyBlocks[32]; - apa_cache_t *clink; - u32 sector = 0; - u32 length; - - if (!(fileSlot->f->mode & O_WRONLY)) - return -EACCES; - - if (!(fileSlot->nsub < APA_MAXSUB)) - return -EFBIG; - - memset(¶ms, 0, sizeof(apa_params_t)); - - if ((rv = fioPartitionSizeLookUp(argp)) < 0) - return rv; - - params.size = rv; - params.flags = APA_FLAG_SUB; - params.type = fileSlot->type; - params.main = fileSlot->parts[0].start; - params.number = fileSlot->nsub + 1; - if ((rv = hddCheckPartitionMax(device, params.size)) < 0) - return rv; - - // walk all looking for any empty blocks - memset(&emptyBlocks, 0, sizeof(emptyBlocks)); - clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv); - while (clink) { - sector = clink->sector; - addEmptyBlock(clink->header, emptyBlocks); - clink = apaGetNextHeader(clink, &rv); - } - if (rv != 0) - return rv; - - if (!(clink = hddAddPartitionHere(device, ¶ms, emptyBlocks, sector, &rv))) - return rv; - - sector = clink->header->start; - length = clink->header->length; - apaCacheFree(clink); - if (!(clink = apaCacheGetHeader(device, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv))) - return rv; - - clink->header->subs[clink->header->nsub].start = sector; - clink->header->subs[clink->header->nsub].length = length; - clink->header->nsub++; - fileSlot->nsub++; - fileSlot->parts[fileSlot->nsub].start = sector; - fileSlot->parts[fileSlot->nsub].length = length; - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink); - return rv; + int rv; + u32 device=fileSlot->f->unit; + apa_params_t params; + u32 emptyBlocks[32]; + apa_cache_t *clink; + u32 sector=0; + u32 length; + + if(!(fileSlot->f->mode & O_WRONLY)) + return -EACCES; + + if(!(fileSlot->nsub < APA_MAXSUB)) + return -EFBIG; + + memset(¶ms, 0, sizeof(apa_params_t)); + + if((rv=fioPartitionSizeLookUp(argp)) < 0) + return rv; + + params.size=rv; + params.flags=APA_FLAG_SUB; + params.type=fileSlot->type; + params.main=fileSlot->parts[0].start; + params.number=fileSlot->nsub+1; + if((rv=hddCheckPartitionMax(device, params.size)) < 0) + return rv; + + // walk all looking for any empty blocks + memset(&emptyBlocks, 0, sizeof(emptyBlocks)); + clink=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv); + while(clink){ + sector=clink->sector; + apaAddEmptyBlock(clink->header, emptyBlocks); + clink=apaGetNextHeader(clink, &rv); + } + if(rv!=0) + return rv; + + if(!(clink=hddAddPartitionHere(device, ¶ms, emptyBlocks, sector, &rv))) + return rv; + + sector=clink->header->start; + length=clink->header->length; + apaCacheFree(clink); + if(!(clink=apaCacheGetHeader(device, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv))) + return rv; + + clink->header->subs[clink->header->nsub].start=sector; + clink->header->subs[clink->header->nsub].length=length; + clink->header->nsub++; + fileSlot->nsub++; + fileSlot->parts[fileSlot->nsub].start=sector; + fileSlot->parts[fileSlot->nsub].length=length; + clink->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + apaCacheFree(clink); + return rv; } static int ioctl2DeleteLastSub(hdd_file_slot_t *fileSlot) { - int rv; - u32 device = fileSlot->f->unit; - apa_cache_t *mainPart; - apa_cache_t *subPart; - - if (!(fileSlot->f->mode & O_WRONLY)) - return -EACCES; - - if (fileSlot->nsub == 0) - return -ENOENT; - - if (!(mainPart = apaCacheGetHeader(device, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv))) - return rv; - - if ((subPart = apaCacheGetHeader(device, - mainPart->header->subs[mainPart->header->nsub - 1].start, APA_IO_MODE_READ, &rv))) { - fileSlot->nsub--; - mainPart->header->nsub--; - mainPart->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - rv = apaDelete(subPart); - } - apaCacheFree(mainPart); - return rv; + int rv; + u32 device=fileSlot->f->unit; + apa_cache_t *mainPart; + apa_cache_t *subPart; + + if(!(fileSlot->f->mode & O_WRONLY)) + return -EACCES; + + if(fileSlot->nsub==0) + return -ENOENT; + + if(!(mainPart=apaCacheGetHeader(device, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv))) + return rv; + + if((subPart=apaCacheGetHeader(device, + mainPart->header->subs[mainPart->header->nsub-1].start, APA_IO_MODE_READ, &rv))) { + fileSlot->nsub--; + mainPart->header->nsub--; + mainPart->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + rv=apaDelete(subPart); + } + apaCacheFree(mainPart); + return rv; } int hddIoctl2(iop_file_t *f, int req, void *argp, unsigned int arglen, - void *bufp, unsigned int buflen) + void *bufp, unsigned int buflen) { - u32 rv = 0; - hdd_file_slot_t *fileSlot = f->privdata; - - WaitSema(fioSema); - switch (req) { - // cmd set 1 - case APA_IOCTL2_ADD_SUB: - rv = ioctl2AddSub(fileSlot, (char *)argp); - break; - - case APA_IOCTL2_DELETE_LAST_SUB: - rv = ioctl2DeleteLastSub(fileSlot); - break; - - case APA_IOCTL2_NUMBER_OF_SUBS: - rv = fileSlot->nsub; - break; - - case APA_IOCTL2_FLUSH_CACHE: - ata_device_flush_cache(f->unit); - break; - - // cmd set 2 - case APA_IOCTL2_TRANSFER_DATA: - rv = ioctl2Transfer(f->unit, fileSlot, argp); - break; - - case APA_IOCTL2_GETSIZE: - rv = fileSlot->parts[*(u32 *)argp].length; - break; - - case APA_IOCTL2_SET_PART_ERROR: - apaSetPartErrorSector(f->unit, fileSlot->parts[0].start); - rv = 0; - break; - - case APA_IOCTL2_GET_PART_ERROR: - if ((rv = apaGetPartErrorSector(f->unit, APA_SECTOR_PART_ERROR, bufp)) > 0) { - if (*(u32 *)bufp == fileSlot->parts[0].start) { - rv = 0; - apaSetPartErrorSector(f->unit, 0); // clear last error :) - } - } - break; - - //Custom IOCTL2 commands for OPL + u32 rv=0, err_lba; + hdd_file_slot_t *fileSlot=f->privdata; + + WaitSema(fioSema); + switch(req) + { + // cmd set 1 + case HIOCADDSUB: + rv=ioctl2AddSub(fileSlot, (char *)argp); + break; + + case HIOCDELSUB: + rv=ioctl2DeleteLastSub(fileSlot); + break; + + case HIOCNSUB: + rv=fileSlot->nsub; + break; + + case HIOCFLUSH: + ata_device_flush_cache(f->unit); + break; + + // cmd set 2 + case HIOCTRANSFER: + rv=ioctl2Transfer(f->unit, fileSlot, argp); + break; + + case HIOCGETSIZE: + rv=fileSlot->parts[*(u32 *)argp].length; + break; + + case HIOCSETPARTERROR: + apaSetPartErrorSector(f->unit, fileSlot->parts[0].start); rv=0; + break; + + case HIOCGETPARTERROR: + if((rv=apaGetPartErrorSector(f->unit, APA_SECTOR_PART_ERROR, &err_lba)) > 0) { + if(err_lba==fileSlot->parts[0].start) { + rv=0; apaSetPartErrorSector(f->unit, 0);// clear last error :) + } + } + break; + + //Custom IOCTL2 commands(s) for OPL case APA_IOCTL2_GETHEADER: if (ata_device_sector_io(f->unit, bufp, fileSlot->parts[0].start, sizeof(apa_header_t) / 512, ATA_DIR_READ)) rv = -EIO; rv = sizeof(apa_header_t); break; - default: - rv = -EINVAL; - break; - } - SignalSema(fioSema); - return rv; + default: + rv=-EINVAL; + break; + } + SignalSema(fioSema); + return rv; } -static int devctlSwapTemp(u32 device, char *argp) +static int devctlSwapTemp(s32 device, char *argp) { - int rv; - apa_params_t params; - char szBuf[APA_IDMAX]; - apa_cache_t *partTemp; - apa_cache_t *partNew; - - - if ((rv = fioGetInput(argp, ¶ms)) < 0) - return rv; - - if (*(u16 *)(params.id) == (u16)0x5F5F) // test for '__' system partition - return -EINVAL; - - memset(szBuf, 0, APA_IDMAX); - strcpy(szBuf, "_tmp"); - if (!(partTemp = apaFindPartition(device, szBuf, &rv))) - return rv; - - if ((partNew = apaFindPartition(device, params.id, &rv))) { - if ((rv = apaPassCmp(partNew->header->fpwd, NULL)) == 0) { - memcpy(partTemp->header->id, partNew->header->id, APA_IDMAX); - memcpy(partTemp->header->rpwd, partNew->header->rpwd, APA_PASSMAX); - memcpy(partTemp->header->fpwd, partNew->header->fpwd, APA_PASSMAX); - //memset(partNew->header->id, 0, 8);// BUG! can make it so can not open!! - memset(partNew->header->id, 0, APA_IDMAX); - strcpy(partNew->header->id, "_tmp"); - memset(partNew->header->rpwd, 0, APA_PASSMAX); - memset(partNew->header->fpwd, 0, APA_PASSMAX); - partTemp->flags |= APA_CACHE_FLAG_DIRTY; - partNew->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - } - apaCacheFree(partNew); - } - apaCacheFree(partTemp); - return rv; + int rv; + apa_params_t params; + char szBuf[APA_IDMAX]; + apa_cache_t *partTemp; + apa_cache_t *partNew; + + + if((rv=fioGetInput(argp, ¶ms)) < 0) + return rv; + + if(params.id[0] == '_' && params.id[1] == '_')// test for '__' system partition + return -EINVAL; + + memset(szBuf, 0, APA_IDMAX); + strcpy(szBuf, "_tmp"); + if(!(partTemp=apaFindPartition(device, szBuf, &rv))) + return rv; + + if((partNew=apaFindPartition(device, params.id, &rv))) { + if((rv=apaPassCmp(partNew->header->fpwd, params.fpwd))==0) { + memcpy(partTemp->header->id, partNew->header->id, APA_IDMAX); + memcpy(partTemp->header->rpwd, partNew->header->rpwd, APA_PASSMAX); + memcpy(partTemp->header->fpwd, partNew->header->fpwd, APA_PASSMAX); + //memset(partNew->header->id, 0, 8);// BUG! can make it so can not open!! + memset(partNew->header->id, 0, APA_IDMAX); + strcpy(partNew->header->id, "_tmp"); + memset(partNew->header->rpwd, 0, APA_PASSMAX); + memset(partNew->header->fpwd, 0, APA_PASSMAX); + partTemp->flags|=APA_CACHE_FLAG_DIRTY; + partNew->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + } + apaCacheFree(partNew); + } + apaCacheFree(partTemp); + return rv; } -int devctlSetOsdMBR(u32 device, hddSetOsdMBR_t *mbrInfo) +static int devctlSetOsdMBR(s32 device, hddSetOsdMBR_t *mbrInfo) { - int rv; - apa_cache_t *clink; - - if (!(clink = apaCacheGetHeader(device, APA_SECTOR_MBR, APA_IO_MODE_READ, &rv))) - return rv; - - APA_PRINTF(APA_DRV_NAME ": mbr start: %ld\n" APA_DRV_NAME ": mbr size : %ld\n", mbrInfo->start, mbrInfo->size); - clink->header->mbr.osdStart = mbrInfo->start; - clink->header->mbr.osdSize = mbrInfo->size; - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink); - return rv; + int rv; + apa_cache_t *clink; + + if(!(clink=apaCacheGetHeader(device, APA_SECTOR_MBR, APA_IO_MODE_READ, &rv))) + return rv; + + APA_PRINTF( APA_DRV_NAME": mbr start: %ld\n" + APA_DRV_NAME": mbr size : %ld\n", mbrInfo->start, mbrInfo->size); + clink->header->mbr.osdStart=mbrInfo->start; + clink->header->mbr.osdSize=mbrInfo->size; + clink->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + apaCacheFree(clink); + return rv; } int hddDevctl(iop_file_t *f, const char *devname, int cmd, void *arg, - unsigned int arglen, void *bufp, unsigned int buflen) + unsigned int arglen, void *bufp, unsigned int buflen) { - int rv = 0; - - WaitSema(fioSema); - switch (cmd) { - // cmd set 1 - case APA_DEVCTL_DEV9_SHUTDOWN: - ata_device_smart_save_attr(f->unit); - dev9Shutdown(); - break; - - case APA_DEVCTL_IDLE: - rv = ata_device_idle(f->unit, *(char *)arg); - break; - - case APA_DEVCTL_MAX_SECTORS: - rv = hddDevices[f->unit].partitionMaxSize; - break; - - case APA_DEVCTL_TOTAL_SECTORS: - rv = hddDevices[f->unit].totalLBA; - break; - - case APA_DEVCTL_FLUSH_CACHE: - if (ata_device_flush_cache(f->unit)) - rv = -EIO; - break; - - case APA_DEVCTL_SWAP_TMP: - rv = devctlSwapTemp(f->unit, (char *)arg); - break; - - case APA_DEVCTL_SMART_STAT: - rv = ata_device_smart_get_status(f->unit); - break; - - case APA_DEVCTL_STATUS: - rv = hddDevices[f->unit].status; - break; - - case APA_DEVCTL_FORMAT: - rv = hddDevices[f->unit].format; - break; - - case APA_DEVCTL_FREE_SECTORS: - rv = hddGetFreeSectors(f->unit, bufp, hddDevices); - break; - - // cmd set 2 :) - case APA_DEVCTL_GETTIME: - rv = apaGetTime((apa_ps2time_t *)bufp); - break; - - case APA_DEVCTL_SET_OSDMBR: - rv = devctlSetOsdMBR(f->unit, (hddSetOsdMBR_t *)arg); - break; - - case APA_DEVCTL_GET_SECTOR_ERROR: - rv = apaGetPartErrorSector(f->unit, APA_SECTOR_SECTOR_ERROR, 0); - break; - - case APA_DEVCTL_GET_ERROR_PART_NAME: - rv = apaGetPartErrorName(f->unit, (char *)bufp); - break; - - case APA_DEVCTL_ATA_READ: - rv = ata_device_sector_io(f->unit, (void *)bufp, ((hddAtaTransfer_t *)arg)->lba, - ((hddAtaTransfer_t *)arg)->size, ATA_DIR_READ); - break; - - case APA_DEVCTL_ATA_WRITE: - rv = ata_device_sector_io(f->unit, ((hddAtaTransfer_t *)arg)->data, - ((hddAtaTransfer_t *)arg)->lba, ((hddAtaTransfer_t *)arg)->size, - ATA_DIR_WRITE); - break; - - case APA_DEVCTL_SCE_IDENTIFY_DRIVE: - rv = ata_device_sce_identify_drive(f->unit, (u16 *)bufp); - break; - - //Custom DEVCTL commands for OPL + int rv=0; + + WaitSema(fioSema); + switch(cmd) + { + // Command set 1 ('H') + case HDIOC_DEV9OFF: + ata_device_smart_save_attr(f->unit); + dev9Shutdown(); + break; + + case HDIOC_IDLE: + rv=ata_device_idle(f->unit, *(char *)arg); + break; + + case HDIOC_MAXSECTOR: + rv=hddDevices[f->unit].partitionMaxSize; + break; + + case HDIOC_TOTALSECTOR: + rv=hddDevices[f->unit].totalLBA; + break; + + case HDIOC_FLUSH: + if(ata_device_flush_cache(f->unit)) + rv=-EIO; + break; + + case HDIOC_SWAPTMP: + rv=devctlSwapTemp(f->unit, (char *)arg); + break; + + case HDIOC_SMARTSTAT: + rv=ata_device_smart_get_status(f->unit); + break; + + case HDIOC_STATUS: + rv=hddDevices[f->unit].status; + break; + + case HDIOC_FORMATVER: + rv=hddDevices[f->unit].format; + break; + + case HDIOC_FREESECTOR: + rv=apaGetFreeSectors(f->unit, bufp, hddDevices); + break; + + case HDIOC_IDLEIMM: + rv=ata_device_idle_immediate(f->unit); + break; + + // Command set 2 ('h') + case HDIOC_GETTIME: + rv=apaGetTime((apa_ps2time_t *)bufp); + break; + + case HDIOC_SETOSDMBR: + rv=devctlSetOsdMBR(f->unit, (hddSetOsdMBR_t *)arg); + break; + + case HDIOC_GETSECTORERROR: + rv=apaGetPartErrorSector(f->unit, APA_SECTOR_SECTOR_ERROR, 0); + break; + + case HDIOC_GETERRORPARTNAME: + rv=apaGetPartErrorName(f->unit, (char *)bufp); + break; + + case HDIOC_READSECTOR: + rv=ata_device_sector_io(f->unit, (void *)bufp, ((hddAtaTransfer_t *)arg)->lba, + ((hddAtaTransfer_t *)arg)->size, ATA_DIR_READ); + break; + + case HDIOC_WRITESECTOR: + rv=ata_device_sector_io(f->unit, ((hddAtaTransfer_t *)arg)->data, + ((hddAtaTransfer_t *)arg)->lba, ((hddAtaTransfer_t *)arg)->size, + ATA_DIR_WRITE); + break; + + case HDIOC_SCEIDENTIFY: + rv=ata_device_sce_identify_drive(f->unit, (u16 *)bufp); + break; + + //Custom DEVCTL command(s) for OPL case APA_DEVCTL_IS_48BIT: rv = ata_device_is_48bit(f->unit); break; @@ -927,13 +1037,13 @@ int hddDevctl(iop_file_t *f, const char *devname, int cmd, void *arg, ((hddAtaIOPTransfer_t *)arg)->lba, ((hddAtaIOPTransfer_t *)arg)->size, ATA_DIR_WRITE); - default: - rv = -EINVAL; - break; - } - SignalSema(fioSema); + default: + rv=-EINVAL; + break; + } + SignalSema(fioSema); - return rv; + return rv; } -int hddUnsupported(iop_file_t *f) { return -1; } +int hddUnsupported(iop_file_t *f){return -1;} diff --git a/modules/hdd/apa/hdd_fio.h b/modules/hdd/apa/hdd_fio.h index b5d87a1e4..e15d9efb8 100644 --- a/modules/hdd/apa/hdd_fio.h +++ b/modules/hdd/apa/hdd_fio.h @@ -6,8 +6,6 @@ # Copyright 2001-2004, ps2dev - http://www.ps2dev.org # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. -# -# $Id$ */ #ifndef _HDD_FIO_H @@ -16,7 +14,7 @@ // I/O functions int hddInit(iop_device_t *f); int hddDeinit(iop_device_t *f); -int hddFormat(iop_file_t *f, const char *dev, const char *blockdev, void *arg, size_t arglen); +int hddFormat(iop_file_t *f, const char *dev, const char *blockdev, void *arg, int arglen); int hddOpen(iop_file_t *f, const char *name, int flags, int mode); int hddClose(iop_file_t *f); int hddRead(iop_file_t *f, void *buf, int size); diff --git a/modules/hdd/apa/imports.lst b/modules/hdd/apa/imports.lst index 1aac604e5..ed710cefa 100644 --- a/modules/hdd/apa/imports.lst +++ b/modules/hdd/apa/imports.lst @@ -10,6 +10,7 @@ I_ata_device_smart_save_attr I_ata_device_flush_cache I_ata_device_is_48bit I_ata_device_set_transfer_mode +I_ata_device_idle_immediate atad_IMPORTS_end cdvdman_IMPORTS_start diff --git a/modules/hdd/libapa/include/libapa.h b/modules/hdd/libapa/include/libapa.h index dc9fda66e..59af75f9f 100644 --- a/modules/hdd/libapa/include/libapa.h +++ b/modules/hdd/libapa/include/libapa.h @@ -6,112 +6,113 @@ # Copyright 2001-2004, ps2dev - http://www.ps2dev.org # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. -# -# $Id$ */ #ifndef _LIBAPA_H #define _LIBAPA_H // Sectors for this and that ;) -#define APA_SECTOR_MBR 0 -#define APA_SECTOR_SECTOR_ERROR 6 // use for last sector that had a error... -#define APA_SECTOR_PART_ERROR 7 // use for last partition that had a error... -#define APA_SECTOR_APAL 8 -#define APA_SECTOR_APAL_HEADERS 10 // 10-262 +#define APA_SECTOR_MBR 0 +#define APA_SECTOR_SECTOR_ERROR 6// use for last sector that had a error... +#define APA_SECTOR_PART_ERROR 7// use for last partition that had a error... +#define APA_SECTOR_APAL 8 +#define APA_SECTOR_APAL_HEADERS 10 // 10-262 // APA Partition -#define APA_MAGIC 0x00415041 // 'APA\0' -#define APA_MBR_VERSION 2 - -#define APA_MODVER_MAJOR 2 -#define APA_MODVER_MINOR 1 -#define APA_MODVER ((APA_MODVER_MAJOR << 8) | APA_MODVER_MINOR) - -typedef struct -{ - u8 unused; - u8 sec; - u8 min; - u8 hour; - u8 day; - u8 month; - u16 year; +#define APA_MAGIC 0x00415041 // 'APA\0' +#define APA_MBR_VERSION 2 + +#define APA_MODVER_MAJOR 2 +#define APA_MODVER_MINOR 1 +#define APA_MODVER ((APA_MODVER_MAJOR << 8) | APA_MODVER_MINOR) + +typedef struct { + u8 unused; + u8 sec; + u8 min; + u8 hour; + u8 day; + u8 month; + u16 year; } apa_ps2time_t; // // MAIN APA defines/struct // -typedef struct -{ - u32 start; // Sector address - u32 length; // Sector count +typedef struct { + u32 start; // Sector address + u32 length; // Sector count } apa_sub_t; typedef struct { - u32 checksum; - u32 magic; // APA_MAGIC - u32 next; - u32 prev; - char id[APA_IDMAX]; - char rpwd[APA_PASSMAX]; - char fpwd[APA_PASSMAX]; - u32 start; - u32 length; - u16 type; - u16 flags; - u32 nsub; - apa_ps2time_t created; - u32 main; - u32 number; - u32 modver; - u32 pading1[7]; - char pading2[128]; - struct - { - char magic[32]; - u32 version; - u32 nsector; - apa_ps2time_t created; - u32 osdStart; - u32 osdSize; - char pading3[200]; - } mbr; - apa_sub_t subs[APA_MAXSUB]; + u32 checksum; + u32 magic; // APA_MAGIC + u32 next; + u32 prev; + char id[APA_IDMAX]; + char rpwd[APA_PASSMAX]; + char fpwd[APA_PASSMAX]; + u32 start; + u32 length; + u16 type; + u16 flags; + u32 nsub; + apa_ps2time_t created; + u32 main; + u32 number; + u32 modver; + u32 pading1[7]; + char pading2[128]; + struct { + char magic[32]; + u32 version; + u32 nsector; + apa_ps2time_t created; + u32 osdStart; + u32 osdSize; + char pading3[200]; + } mbr; + apa_sub_t subs[APA_MAXSUB]; } apa_header_t; #define APA_CACHE_FLAG_DIRTY 0x01 typedef struct sapa_cache { - struct sapa_cache *next; - struct sapa_cache *tail; - u16 flags; - u16 nused; - s32 device; - u32 sector; - apa_header_t *header; + struct sapa_cache *next; + struct sapa_cache *tail; + u16 flags; + u16 nused; + s32 device; + u32 sector; + union + { + apa_header_t *header; + u32 *error_lba; + }; } apa_cache_t; typedef struct { - char id[APA_IDMAX]; - u32 size; - u16 type; - u16 flags; - u32 main; - u32 number; + char id[APA_IDMAX]; + char fpwd[APA_PASSMAX]; + char rpwd[APA_PASSMAX]; + u32 size; + u16 type; + u16 flags; + u32 main; + u32 number; } apa_params_t; void apaSaveError(s32 device, void *buffer, u32 lba, u32 err_lba); void apaSetPartErrorSector(s32 device, u32 lba); -int apaGetPartErrorSector(s32 device, u32 lba, int *lba_out); +int apaGetPartErrorSector(s32 device, u32 lba, u32 *lba_out); int apaGetPartErrorName(s32 device, char *name); -apa_cache_t *apaFillHeader(s32 device, apa_params_t *params, int start, int next, int prev, int length, int *err); -apa_cache_t *apaInsertPartition(s32 device, apa_params_t *params, u32 sector, int *err); -apa_cache_t *apaFindPartition(s32 device, char *id, int *err); -void addEmptyBlock(apa_header_t *header, u32 *EmptyBlocks); +apa_cache_t *apaFillHeader(s32 device, const apa_params_t *params, u32 start, u32 next, u32 prev, u32 length, int *err); +apa_cache_t *apaInsertPartition(s32 device, const apa_params_t *params, u32 sector, int *err); +apa_cache_t *apaFindPartition(s32 device, const char *id, int *err); +void apaAddEmptyBlock(apa_header_t *header, u32 *emptyBlocks); apa_cache_t *apaRemovePartition(s32 device, u32 start, u32 next, u32 prev, u32 length); void apaMakeEmpty(apa_cache_t *clink); apa_cache_t *apaDeleteFixPrev(apa_cache_t *clink1, int *err); @@ -121,7 +122,7 @@ int apaCheckSum(apa_header_t *header); int apaReadHeader(s32 device, apa_header_t *header, u32 lba); int apaWriteHeader(s32 device, apa_header_t *header, u32 lba); int apaGetFormat(s32 device, int *format); -int apaGetPartitionMax(int totalLBA); +u32 apaGetPartitionMax(u32 totalLBA); apa_cache_t *apaGetNextHeader(apa_cache_t *clink, int *err); /////////////////////////////////////////////////////////////////////////////// @@ -138,12 +139,12 @@ apa_cache_t *apaCacheAlloc(void); /////////////////////////////////////////////////////////////////////////////// -#define APAL_MAGIC 0x4150414C // 'APAL' +#define APAL_MAGIC 0x4150414C // 'APAL' typedef struct { - u32 magic; // APAL_MAGIC - s32 num; - u32 sectors[126]; + u32 magic; // APAL_MAGIC + s32 num; + u32 sectors[126]; } apa_journal_t; #define journalCheckSum(header) apaCheckSum((apa_header_t *)header) @@ -157,7 +158,21 @@ int apaJournalRestore(s32 device); void *apaAllocMem(int size); void apaFreeMem(void *ptr); int apaGetTime(apa_ps2time_t *tm); -int apaPassCmp(char *password1, char *password2); int apaGetIlinkID(u8 *idbuf); +/////////////////////////////////////////////////////////////////////////////// +int apaPassCmp(const char *password1, const char *password2); +void apaEncryptPassword(const char *id, char *password_out, const char *password_in); + +/////////////////////////////////////////////////////////////////////////////// +typedef struct +{ + u32 totalLBA; + u32 partitionMaxSize; + int format; + int status; +} apa_device_t; + +int apaGetFreeSectors(s32 device, u32 *free, apa_device_t *deviceinfo); + #endif /* _LIBAPA_H */ diff --git a/modules/hdd/libapa/src/apa.c b/modules/hdd/libapa/src/apa.c index cc9c62cb5..d0a035697 100644 --- a/modules/hdd/libapa/src/apa.c +++ b/modules/hdd/libapa/src/apa.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # Main APA related routines */ @@ -21,452 +20,476 @@ #include "apa-opt.h" #include "libapa.h" -char apaDefaultPassword[APA_PASSMAX] = {0}; - -const char apaMBRMagic[] = "Sony Computer Entertainment Inc."; +const char apaMBRMagic[]="Sony Computer Entertainment Inc."; void apaSaveError(s32 device, void *buffer, u32 lba, u32 err_lba) { - memset(buffer, 0, 512); - *(u32 *)buffer = err_lba; - ata_device_sector_io(device, buffer, lba, 1, ATA_DIR_WRITE); - ata_device_flush_cache(device); + memset(buffer, 0, 512); + *(u32 *)buffer=err_lba; + ata_device_sector_io(device, buffer, lba, 1, ATA_DIR_WRITE); + ata_device_flush_cache(device); } void apaSetPartErrorSector(s32 device, u32 lba) -{ // used to set the lba of a partition that has a error... - apa_cache_t *clink; - clink = apaCacheAlloc(); - apaSaveError(device, clink->header, APA_SECTOR_PART_ERROR, lba); - apaCacheFree(clink); +{// used to set the lba of a partition that has a error... + apa_cache_t *clink; + clink=apaCacheAlloc(); + apaSaveError(device, clink->header, APA_SECTOR_PART_ERROR, lba); + apaCacheFree(clink); } -int apaGetPartErrorSector(s32 device, u32 lba, int *lba_out) +int apaGetPartErrorSector(s32 device, u32 lba, u32 *lba_out) { - apa_cache_t *clink; - int rv = 0; + apa_cache_t *clink; + int rv=0; - if (!(clink = apaCacheAlloc())) - return -ENOMEM; + if(!(clink=apaCacheAlloc())) + return -ENOMEM; - if (ata_device_sector_io(device, clink->header, lba, 1, ATA_DIR_READ)) - return -EIO; + if(ata_device_sector_io(device, clink->header, lba, 1, ATA_DIR_READ)) + return -EIO; - if (lba_out) - *lba_out = ((u32 *)(clink->header))[0]; - if (((u32 *)(clink->header))[0]) - rv = 1; // error is set ;) - apaCacheFree(clink); - return rv; + if(lba_out) + *lba_out=*clink->error_lba; + if(*clink->error_lba) + rv=1;// error is set ;) + apaCacheFree(clink); + return rv; } int apaGetPartErrorName(s32 device, char *name) { - int lba; - int rv = 0; - apa_cache_t *clink; - - if ((rv = apaGetPartErrorSector(device, APA_SECTOR_PART_ERROR, &lba)) <= 0) - return rv; - if (!(clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv))) - return rv; - - while (clink) { - if (clink->header->type != APA_TYPE_FREE && - !(clink->header->flags & APA_CACHE_FLAG_DIRTY) && - clink->header->start == lba) { - if (name) { - strncpy(name, clink->header->id, APA_IDMAX - 1); - name[APA_IDMAX - 1] = '\0'; - } - apaCacheFree(clink); - return 1; - } - clink = apaGetNextHeader(clink, &rv); - } - - // clear error if no errors and partitions was not found... - if (rv == 0) - apaSetPartErrorSector(device, 0); - return rv; + u32 lba; + int rv=0; + apa_cache_t *clink; + + if((rv=apaGetPartErrorSector(device, APA_SECTOR_PART_ERROR, &lba)) <= 0) + return rv; + if(!(clink=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv))) + return rv; + + while(clink) + { + if(clink->header->type!=APA_TYPE_FREE && + !(clink->header->flags & APA_CACHE_FLAG_DIRTY) && + clink->header->start==lba) + { + if(name) + { + strncpy(name, clink->header->id, APA_IDMAX - 1); + name[APA_IDMAX - 1] = '\0'; + } + apaCacheFree(clink); + return 1; + } + clink=apaGetNextHeader(clink, &rv); + } + + // clear error if no errors and partitions was not found... + if(rv==0) + apaSetPartErrorSector(device, 0); + return rv; } -apa_cache_t *apaFillHeader(s32 device, apa_params_t *params, int start, int next, - int prev, int length, int *err) -{ // used for making a new partition - apa_cache_t *clink; - - if (!(clink = apaCacheGetHeader(device, start, APA_IO_MODE_WRITE, err))) - return NULL; - memset(clink->header, 0, sizeof(apa_header_t)); - clink->header->magic = APA_MAGIC; - clink->header->start = start; - clink->header->next = next; - clink->header->prev = prev; - clink->header->length = length; - clink->header->type = params->type; - clink->header->flags = params->flags; - clink->header->modver = APA_MODVER; - memcpy(&clink->header->id, ¶ms->id, APA_IDMAX); - if (params->flags & APA_FLAG_SUB) { - clink->header->main = params->main; - clink->header->number = params->number; - } else { - if (strncmp(clink->header->id, "_tmp", APA_IDMAX) != 0) { - memcpy(clink->header->rpwd, apaDefaultPassword, APA_PASSMAX); - memcpy(clink->header->fpwd, apaDefaultPassword, APA_PASSMAX); - } - } - apaGetTime(&clink->header->created); - clink->flags |= APA_CACHE_FLAG_DIRTY; - return clink; +apa_cache_t *apaFillHeader(s32 device, const apa_params_t *params, u32 start, u32 next, + u32 prev, u32 length, int *err) +{ // used for making a new partition + apa_cache_t *clink; + + if(!(clink=apaCacheGetHeader(device, start, APA_IO_MODE_WRITE, err))) + return NULL; + memset(clink->header, 0, sizeof(apa_header_t)); + clink->header->magic=APA_MAGIC; + clink->header->start=start; + clink->header->next=next; + clink->header->prev=prev; + clink->header->length=length; + clink->header->type=params->type; + clink->header->flags=params->flags; + clink->header->modver=APA_MODVER; + memcpy(clink->header->id, params->id, APA_IDMAX); + if(params->flags & APA_FLAG_SUB) + { + clink->header->main=params->main; + clink->header->number=params->number; + } + else + { + if(strncmp(clink->header->id, "_tmp", APA_IDMAX)!=0) + { + memcpy(clink->header->rpwd, params->rpwd, APA_PASSMAX); + memcpy(clink->header->fpwd, params->fpwd, APA_PASSMAX); + } + } + apaGetTime(&clink->header->created); + clink->flags|=APA_CACHE_FLAG_DIRTY; + return clink; } -apa_cache_t *apaInsertPartition(s32 device, apa_params_t *params, u32 sector, int *err) -{ // add's a new partition useing a empty block... - apa_cache_t *clink_empty; - apa_cache_t *clink_this; - apa_cache_t *clink_next; - - if ((clink_this = apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err)) == 0) - return 0; - while (clink_this->header->length != params->size) { - if ((clink_next = apaCacheGetHeader(device, clink_this->header->next, APA_IO_MODE_READ, err)) == NULL) { // get next - apaCacheFree(clink_this); - return 0; - } - clink_this->header->length >>= 1; - clink_empty = apaRemovePartition(device, (clink_this->header->start + clink_this->header->length), - clink_this->header->next, clink_this->header->start, clink_this->header->length); - clink_this->header->next = clink_empty->header->start; - clink_this->flags |= APA_CACHE_FLAG_DIRTY; - clink_next->header->prev = clink_empty->header->start; - clink_next->flags |= APA_CACHE_FLAG_DIRTY; - - apaCacheFlushAllDirty(device); - apaCacheFree(clink_empty); - apaCacheFree(clink_next); - } - apaCacheFree(clink_this); - clink_this = apaFillHeader(device, params, clink_this->header->start, clink_this->header->next, - clink_this->header->prev, params->size, err); - apaCacheFlushAllDirty(device); - return clink_this; +apa_cache_t *apaInsertPartition(s32 device, const apa_params_t *params, u32 sector, int *err) +{ // Adds a new partition using an empty block. + apa_cache_t *clink_empty; + apa_cache_t *clink_this; + apa_cache_t *clink_next; + + if((clink_this=apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err))==0) + return 0; + + while(clink_this->header->length!=params->size) + { + if((clink_next=apaCacheGetHeader(device, clink_this->header->next, APA_IO_MODE_READ, err))==NULL) + { // Get next partition + apaCacheFree(clink_this); + return 0; + } + clink_this->header->length>>=1; + clink_empty=apaRemovePartition(device, (clink_this->header->start+clink_this->header->length), + clink_this->header->next, clink_this->header->start, clink_this->header->length); + clink_this->header->next=clink_empty->header->start; + clink_this->flags|=APA_CACHE_FLAG_DIRTY; + clink_next->header->prev=clink_empty->header->start; + clink_next->flags|=APA_CACHE_FLAG_DIRTY; + + apaCacheFlushAllDirty(device); + apaCacheFree(clink_empty); + apaCacheFree(clink_next); + } + apaCacheFree(clink_this); + clink_this=apaFillHeader(device, params, clink_this->header->start, clink_this->header->next, + clink_this->header->prev, params->size, err); + apaCacheFlushAllDirty(device); + return clink_this; } -apa_cache_t *apaFindPartition(s32 device, char *id, int *err) +apa_cache_t *apaFindPartition(s32 device, const char *id, int *err) { - apa_cache_t *clink; - - clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, err); - while (clink) { - if (!(clink->header->flags & APA_FLAG_SUB)) { - if (memcmp(clink->header->id, id, APA_IDMAX) == 0) - return clink; // found - } - clink = apaGetNextHeader(clink, (int *)err); - } - if (*err == 0) { - *err = -ENOENT; - return NULL; - //return (apa_cache_t *)-ENOENT; // <-- BUG code tests for NULL only - } - *err = 0; - return NULL; + apa_cache_t *clink; + + clink=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, err); + while(clink) + { + if(!(clink->header->flags & APA_FLAG_SUB)) { + if(memcmp(clink->header->id, id, APA_IDMAX)==0) + return clink; // found + } + clink=apaGetNextHeader(clink, (int *)err); + } + if(*err==0) { + *err=-ENOENT; + return NULL; + //return (apa_cache_t *)-ENOENT; // <-- BUG code tests for NULL only + } + *err=0; + return NULL; } -void addEmptyBlock(apa_header_t *header, u32 *emptyBlocks) -{ // small helper.... to track empty blocks.. - int i; - - if (header->type == APA_TYPE_FREE) { - for (i = 0; i < 32; i++) { - if (header->length == (1 << i)) { - if (emptyBlocks[i] == APA_TYPE_FREE) { - emptyBlocks[i] = header->start; - return; - } - } - } - } +void apaAddEmptyBlock(apa_header_t *header, u32 *emptyBlocks) +{ // small helper.... to track empty blocks.. + u32 i; + + if(header->type==APA_TYPE_FREE) { + for(i=0;i<32;i++) + { + if(header->length==(1 << i)) { + if(emptyBlocks[i]==APA_TYPE_FREE) { + emptyBlocks[i]=header->start; + return; + } + } + } + } } apa_cache_t *apaRemovePartition(s32 device, u32 start, u32 next, u32 prev, - u32 length) + u32 length) { - apa_cache_t *clink; - u32 err; - - if ((clink = apaCacheGetHeader(device, start, APA_IO_MODE_WRITE, (int *)&err)) == NULL) - return NULL; - memset(clink->header, 0, sizeof(apa_header_t)); - clink->header->magic = APA_MAGIC; - clink->header->start = start; - clink->header->next = next; - clink->header->prev = prev; - clink->header->length = length; - strcpy(clink->header->id, "__empty"); - apaGetTime(&clink->header->created); - clink->flags |= APA_CACHE_FLAG_DIRTY; - return clink; + apa_cache_t *clink; + int err; + + if((clink=apaCacheGetHeader(device, start, APA_IO_MODE_WRITE, &err))==NULL) + return NULL; + memset(clink->header, 0, sizeof(apa_header_t)); + clink->header->magic=APA_MAGIC; + clink->header->start=start; + clink->header->next=next; + clink->header->prev=prev; + clink->header->length=length; + strcpy(clink->header->id, "__empty"); + apaGetTime(&clink->header->created); + clink->flags|=APA_CACHE_FLAG_DIRTY; + return clink; } void apaMakeEmpty(apa_cache_t *clink) { - u32 saved_start; - u32 saved_next; - u32 saved_prev; - u32 saved_length; - - saved_start = clink->header->start; - saved_next = clink->header->next; - saved_prev = clink->header->prev; - saved_length = clink->header->length; - memset(clink->header, 0, sizeof(apa_header_t)); - clink->header->magic = APA_MAGIC; - clink->header->start = saved_start; - clink->header->next = saved_next; - clink->header->prev = saved_prev; - clink->header->length = saved_length; - apaGetTime(&clink->header->created); - strcpy(clink->header->id, "__empty"); - clink->flags |= APA_CACHE_FLAG_DIRTY; + u32 saved_start; + u32 saved_next; + u32 saved_prev; + u32 saved_length; + + saved_start = clink->header->start; + saved_next = clink->header->next; + saved_prev = clink->header->prev; + saved_length = clink->header->length; + memset(clink->header, 0, sizeof(apa_header_t)); + clink->header->magic = APA_MAGIC; + clink->header->start = saved_start; + clink->header->next = saved_next; + clink->header->prev = saved_prev; + clink->header->length = saved_length; + apaGetTime(&clink->header->created); + strcpy(clink->header->id, "__empty"); + clink->flags|=APA_CACHE_FLAG_DIRTY; } apa_cache_t *apaDeleteFixPrev(apa_cache_t *clink, int *err) { - apa_cache_t *clink2 = clink; - apa_header_t *header = clink2->header; - u32 device = clink->device; - u32 length = clink->header->length; - u32 saved_next = clink->header->next; - u32 saved_length = clink->header->length; - u32 tmp; - - - while (header->start) { - if (!(clink2 = apaCacheGetHeader(device, header->prev, APA_IO_MODE_READ, err))) { - apaCacheFree(clink); - return NULL; - } - header = clink2->header; - tmp = header->length + length; - if (header->type != 0) { - apaCacheFree(clink2); - break; - } - if ((header->start % tmp) || (tmp & (tmp - 1))) { - apaCacheFree(clink2); - break; - } - length = tmp; - apaCacheFree(clink); - clink = clink2; - } - if (length != saved_length) { - if (!(clink2 = apaCacheGetHeader(device, saved_next, APA_IO_MODE_READ, err))) { - apaCacheFree(clink); - return NULL; - } - clink->header->length = length; - clink->header->next = clink->header->start + length; - clink2->header->prev = clink->header->start; - clink2->flags |= APA_CACHE_FLAG_DIRTY; - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink2); - } - return clink; + apa_cache_t *clink2=clink; + apa_header_t *header=clink2->header; + u32 device=clink->device; + u32 length=clink->header->length; + u32 saved_next=clink->header->next; + u32 saved_length=clink->header->length; + u32 tmp; + + while(header->start) + { + if(!(clink2=apaCacheGetHeader(device, header->prev, APA_IO_MODE_READ, err))) + { + apaCacheFree(clink); + return NULL; + } + header=clink2->header; + tmp=header->length+length; + if(header->type!=0) { + apaCacheFree(clink2); + break; + } + if((header->start%tmp) || (tmp & (tmp-1))) { + apaCacheFree(clink2); + break; + } + length=tmp; + apaCacheFree(clink); + clink=clink2; + } + if(length!=saved_length) + { + if(!(clink2=apaCacheGetHeader(device, saved_next, APA_IO_MODE_READ, err))) + { + apaCacheFree(clink); + return NULL; + } + clink->header->length=length; + clink->header->next=clink->header->start+length; + clink2->header->prev=clink->header->start; + clink2->flags|=APA_CACHE_FLAG_DIRTY; + clink->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + apaCacheFree(clink2); + } + return clink; } apa_cache_t *apaDeleteFixNext(apa_cache_t *clink, int *err) { - apa_header_t *header = clink->header; - u32 length = header->length; - u32 saved_length = header->length; - u32 lnext = header->next; - apa_cache_t *clink1; - apa_cache_t *clink2; - u32 device = clink->device; - u32 tmp; - - while (lnext != 0) { - if (!(clink1 = apaCacheGetHeader(device, lnext, APA_IO_MODE_READ, err))) { - apaCacheFree(clink); - return 0; - } - header = clink1->header; - tmp = header->length + length; - if (header->type != 0) { - apaCacheFree(clink1); - break; - } - if ((clink->header->start % tmp) != 0 || ((tmp - 1) & tmp)) { - apaCacheFree(clink1); - break; - } - length = tmp; - apaCacheFree(clink1); - lnext = header->next; - } - if (length != saved_length) { - if (!(clink2 = apaCacheGetHeader(device, lnext, APA_IO_MODE_READ, err))) { - apaCacheFree(clink); - return NULL; - } - clink->header->length = length; - clink->header->next = lnext; - apaMakeEmpty(clink); - clink2->header->prev = clink->header->start; - clink2->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink2); - } - return clink; + apa_header_t *header=clink->header; + u32 length=header->length; + u32 saved_length=header->length; + u32 lnext=header->next; + apa_cache_t *clink1; + apa_cache_t *clink2; + u32 device=clink->device; + u32 tmp; + + while(lnext!=0) + { + if(!(clink1=apaCacheGetHeader(device, lnext, APA_IO_MODE_READ, err))) + { + apaCacheFree(clink); + return 0; + } + header=clink1->header; + tmp=header->length+length; + if(header->type!=0) + { + apaCacheFree(clink1); + break; + } + if((clink->header->start%tmp)!=0 || ((tmp-1) & tmp)) + { + apaCacheFree(clink1); + break; + } + length=tmp; + apaCacheFree(clink1); + lnext=header->next; + } + if(length!=saved_length) + { + if(!(clink2=apaCacheGetHeader(device, lnext, APA_IO_MODE_READ, err))) + { + apaCacheFree(clink); + return NULL; + } + clink->header->length=length; + clink->header->next=lnext; + apaMakeEmpty(clink); + clink2->header->prev=clink->header->start; + clink2->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + apaCacheFree(clink2); + } + return clink; } int apaDelete(apa_cache_t *clink) { - int rv = 0; - apa_cache_t *clink_mbr; - u32 device = clink->device; - u32 start = clink->header->start; - int i; - - if (!start) { - apaCacheFree(clink); - return -EACCES; - } - - if (clink->header->next == 0) { - if ((clink_mbr = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv)) == NULL) { - apaCacheFree(clink); - return rv; - } - do { - apaCacheFree(clink); - if ((clink = apaCacheGetHeader(clink->device, clink->header->prev, APA_IO_MODE_READ, &rv)) == NULL) - return 0; - clink->header->next = 0; - clink->flags |= APA_CACHE_FLAG_DIRTY; - clink_mbr->header->prev = clink->header->start; - clink_mbr->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - } while (clink->header->type == 0); - apaCacheFree(clink_mbr); - } else { - u32 length = clink->header->length; - - for (i = 0; i < 2; i++) { - if ((clink = apaDeleteFixPrev(clink, &rv)) == NULL) - return 0; - if ((clink = apaDeleteFixNext(clink, &rv)) == NULL) - return 0; - } - if (clink->header->start == start && clink->header->length == length) { - apaMakeEmpty(clink); - apaCacheFlushAllDirty(clink->device); - } - } - apaCacheFree(clink); - return rv; + int rv=0; + apa_cache_t *clink_mbr; + u32 device=clink->device; + u32 start=clink->header->start; + int i; + + if(!start) { + apaCacheFree(clink); + return -EACCES; + } + + if(clink->header->next==0) + { + if((clink_mbr=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv))==NULL) + { + apaCacheFree(clink); + return rv; + } + do { + apaCacheFree(clink); + if((clink=apaCacheGetHeader(clink->device, clink->header->prev, APA_IO_MODE_READ, &rv))==NULL) + return 0; + clink->header->next=0; + clink->flags|=APA_CACHE_FLAG_DIRTY; + clink_mbr->header->prev=clink->header->start; + clink_mbr->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + } while(clink->header->type==0); + apaCacheFree(clink_mbr); + } else { + u32 length=clink->header->length; + + for(i=0;i < 2;i++){ + if((clink=apaDeleteFixPrev(clink, &rv))==NULL) + return 0; + if((clink=apaDeleteFixNext(clink, &rv))==NULL) + return 0; + } + if(clink->header->start==start && clink->header->length==length) + { + apaMakeEmpty(clink); + apaCacheFlushAllDirty(clink->device); + } + } + apaCacheFree(clink); + return rv; } int apaCheckSum(apa_header_t *header) { - u32 *ptr = (u32 *)header; - u32 sum = 0; - int i; + u32 *ptr=(u32 *)header; + u32 sum, i; - for (i = 1; i < 256; i++) //sizeof(header)/4 = 256, start at offset +4 to omit the checksum field. - sum += ptr[i]; - return sum; + for(sum=0,i=1; i < 256; i++) //sizeof(header)/4 = 256, start at offset +4 to omit the checksum field. + sum+=ptr[i]; + return sum; } int apaReadHeader(s32 device, apa_header_t *header, u32 lba) { - if (ata_device_sector_io(device, header, lba, 2, ATA_DIR_READ) != 0) - return -EIO; - if (header->magic != APA_MAGIC) - return -EIO; - if (apaCheckSum(header) != header->checksum) - return -EIO; - if (lba == APA_SECTOR_MBR) { - if (strncmp(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic)) == 0) - return 0; - APA_PRINTF(APA_DRV_NAME ": error: invalid partition table or version newer than I know.\n"); - return -EIO; - } - return 0; + if(ata_device_sector_io(device, header, lba, 2, ATA_DIR_READ)!=0) + return -EIO; + if(header->magic!=APA_MAGIC) + return -EIO; + if(apaCheckSum(header)!=header->checksum) + return -EIO; + if(lba==APA_SECTOR_MBR) + { + if(strncmp(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic))==0) + return 0; + APA_PRINTF(APA_DRV_NAME": error: invalid partition table or version newer than I know.\n"); + return -EIO; + } + return 0; } int apaWriteHeader(s32 device, apa_header_t *header, u32 lba) { - if (ata_device_sector_io(device, header, lba, 2, ATA_DIR_WRITE)) - return -EIO; - return 0; + if(ata_device_sector_io(device, header, lba, 2, ATA_DIR_WRITE)) + return -EIO; + return 0; } int apaGetFormat(s32 device, int *format) { - apa_cache_t *clink; - int rv = 0; - u32 *pDW; - int i; - - clink = apaCacheAlloc(); - *format = 0; - if ((rv = apaReadHeader(device, clink->header, 0)) == 0) { - *format = clink->header->mbr.version; - if (ata_device_sector_io(device, clink->header, APA_SECTOR_SECTOR_ERROR, 2, ATA_DIR_READ)) - rv = -EIO; // return -EIO; - if (rv == 0) { - pDW = (u32 *)clink->header; - for (i = 0; i < 256; i++) { - if ((i & 0x7F) && pDW[i] != 0) - rv = 1; - } - } - } - apaCacheFree(clink); - return rv == 0; + apa_cache_t *clink; + int rv=0; + u32 *pDW, i; + + clink=apaCacheAlloc(); + *format=0; + if((rv=apaReadHeader(device, clink->header, 0))==0) + { + *format=clink->header->mbr.version; + if(ata_device_sector_io(device, clink->header, APA_SECTOR_SECTOR_ERROR, 2, ATA_DIR_READ)) + rv=-EIO; // return -EIO; + if(rv==0){ + pDW=(u32 *)clink->header; + for(i=0;i < 256; i++) + { + if((i & 0x7F) && pDW[i]!=0) + rv=1; + } + } + } + apaCacheFree(clink); + return rv==0; } -int apaGetPartitionMax(int totalLBA) +u32 apaGetPartitionMax(u32 totalLBA) { - int i; - int size; - - totalLBA >>= 6; // totalLBA/64 - size = (1 << 0x1F); - for (i = 31; i != 0; i--) { - size = 1 << i; - if (size & totalLBA) - break; - } - if (size < totalLBA) - i++; - return (1 << i); + u32 i, size; + + totalLBA>>=6; // totalLBA/64 + size=(1<<0x1F); + for(i=31;i!=0;i--) + { + size=1<header->start; - - apaCacheFree(clink); - if (!clink->header->next) - return NULL; - - if (!(clink = apaCacheGetHeader(clink->device, clink->header->next, APA_IO_MODE_READ, err))) - return NULL; - - if (start != clink->header->prev) { - APA_PRINTF(APA_DRV_NAME ": Warning: Invalid partition information. start != prev\n"); - clink->header->prev = start; - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(clink->device); - } - return clink; + u32 start=clink->header->start; + + apaCacheFree(clink); + if(!clink->header->next) + return NULL; + + if(!(clink=apaCacheGetHeader(clink->device, clink->header->next, APA_IO_MODE_READ, err))) + return NULL; + + if(start!=clink->header->prev) { + APA_PRINTF(APA_DRV_NAME": Warning: Invalid partition information. start != prev\n"); + clink->header->prev=start; + clink->flags|=APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(clink->device); + } + return clink; + } diff --git a/modules/hdd/libapa/src/cache.c b/modules/hdd/libapa/src/cache.c index a616b8e81..267281dbc 100644 --- a/modules/hdd/libapa/src/cache.c +++ b/modules/hdd/libapa/src/cache.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # APA cache manipulation routines */ @@ -26,165 +25,171 @@ static int cacheSize; int apaCacheInit(u32 size) { - apa_header_t *header; - int i; - - cacheSize = size; // save size ;) - if ((header = (apa_header_t *)apaAllocMem(size * sizeof(apa_header_t)))) { - cacheBuf = apaAllocMem((size + 1) * sizeof(apa_cache_t)); - if (cacheBuf == NULL) - return -ENOMEM; - } else - return -ENOMEM; - // setup cache header... - memset(cacheBuf, 0, (size + 1) * sizeof(apa_cache_t)); - cacheBuf->next = cacheBuf; - cacheBuf->tail = cacheBuf; - for (i = 1; i < size + 1; i++, header++) { - cacheBuf[i].header = header; - cacheBuf[i].device = -1; - apaCacheLink(cacheBuf->tail, &cacheBuf[i]); - } - return 0; + apa_header_t *header; + int i; + + cacheSize=size; // save size ;) + if((header=(apa_header_t *)apaAllocMem(size*sizeof(apa_header_t)))){ + cacheBuf=apaAllocMem((size+1)*sizeof(apa_cache_t)); + if(cacheBuf==NULL) + return -ENOMEM; + } + else + return -ENOMEM; + // setup cache header... + memset(cacheBuf, 0, (size+1)*sizeof(apa_cache_t)); + cacheBuf->next=cacheBuf; + cacheBuf->tail=cacheBuf; + for(i=1; itail, &cacheBuf[i]); + } + return 0; } void apaCacheLink(apa_cache_t *clink, apa_cache_t *cnew) { - cnew->tail = clink; - cnew->next = clink->next; - clink->next->tail = cnew; - clink->next = cnew; + cnew->tail=clink; + cnew->next=clink->next; + clink->next->tail=cnew; + clink->next=cnew; } apa_cache_t *apaCacheUnLink(apa_cache_t *clink) { - clink->tail->next = clink->next; - clink->next->tail = clink->tail; - return clink; + clink->tail->next=clink->next; + clink->next->tail=clink->tail; + return clink; } int apaCacheTransfer(apa_cache_t *clink, int type) { - int err; - if (type) - err = apaWriteHeader(clink->device, clink->header, clink->sector); - else // 0 - err = apaReadHeader(clink->device, clink->header, clink->sector); - - if (err) { - APA_PRINTF(APA_DRV_NAME ": error: disk err %d on device %ld, sector %ld, type %d\n", - err, clink->device, clink->sector, type); - if (type == 0) // save any read error's.. - apaSaveError(clink->device, clink->header, APA_SECTOR_SECTOR_ERROR, clink->sector); - } - clink->flags &= ~APA_CACHE_FLAG_DIRTY; - return err; + int err; + if(type) + err=apaWriteHeader(clink->device, clink->header, clink->sector); + else// 0 + err=apaReadHeader(clink->device, clink->header, clink->sector); + + if(err) + { + APA_PRINTF(APA_DRV_NAME": error: disk err %d on device %ld, sector %ld, type %d\n", + err, clink->device, clink->sector, type); + if(type==0)// save any read error's.. + apaSaveError(clink->device, clink->header, APA_SECTOR_SECTOR_ERROR, clink->sector); + } + clink->flags&=~APA_CACHE_FLAG_DIRTY; + return err; } void apaCacheFlushDirty(apa_cache_t *clink) { - if (clink->flags & APA_CACHE_FLAG_DIRTY) - apaCacheTransfer(clink, APA_IO_MODE_WRITE); + if(clink->flags&APA_CACHE_FLAG_DIRTY) + apaCacheTransfer(clink, APA_IO_MODE_WRITE); } int apaCacheFlushAllDirty(s32 device) { - u32 i; - // flush apal - for (i = 1; i < cacheSize + 1; i++) { - if ((cacheBuf[i].flags & APA_CACHE_FLAG_DIRTY) && cacheBuf[i].device == device) - apaJournalWrite(&cacheBuf[i]); - } - apaJournalFlush(device); - // flush apa - for (i = 1; i < cacheSize + 1; i++) { - if ((cacheBuf[i].flags & APA_CACHE_FLAG_DIRTY) && cacheBuf[i].device == device) - apaCacheTransfer(&cacheBuf[i], APA_IO_MODE_WRITE); - } - return apaJournalReset(device); + u32 i; + // flush apal + for(i=1;inused == 0) - clink = apaCacheUnLink(clink); - clink->nused++; - return clink; - } - if ((cacheBuf->tail == cacheBuf) && - (cacheBuf->tail == cacheBuf->tail->next)) { - APA_PRINTF(APA_DRV_NAME ": error: free buffer empty\n"); - } else { - clink = cacheBuf->next; - if (clink->flags & APA_CACHE_FLAG_DIRTY) - APA_PRINTF(APA_DRV_NAME ": error: dirty buffer allocated\n"); - clink->flags = 0; - clink->nused = 1; - clink->device = device; - clink->sector = sector; - clink = apaCacheUnLink(clink); - } - if (clink == NULL) { - *result = -ENOMEM; - return NULL; - } - if (!mode) { - if ((*result = apaCacheTransfer(clink, APA_IO_MODE_READ)) < 0) { - clink->nused = 0; - clink->device = -1; - apaCacheLink(cacheBuf, clink); - clink = NULL; - } - } - return clink; + apa_cache_t *clink=NULL; + int i; + + *result=0; + for(i=1;inused==0) + clink=apaCacheUnLink(clink); + clink->nused++; + return clink; + } + if((cacheBuf->tail==cacheBuf) && + (cacheBuf->tail==cacheBuf->tail->next)){ + APA_PRINTF(APA_DRV_NAME": error: free buffer empty\n"); + } + else + { + clink=cacheBuf->next; + if(clink->flags & APA_CACHE_FLAG_DIRTY) + APA_PRINTF(APA_DRV_NAME": error: dirty buffer allocated\n"); + clink->flags=0; + clink->nused=1; + clink->device=device; + clink->sector=sector; + clink=apaCacheUnLink(clink); + } + if(clink==NULL) + { + *result=-ENOMEM; + return NULL; + } + if(!mode) + { + if((*result=apaCacheTransfer(clink, APA_IO_MODE_READ))<0){ + clink->nused=0; + clink->device=-1; + apaCacheLink(cacheBuf, clink); + clink=NULL; + } + } + return clink; } void apaCacheFree(apa_cache_t *clink) { - if (clink == NULL) { - APA_PRINTF(APA_DRV_NAME ": error: null buffer returned\n"); - return; - } - if (clink->nused == 0) { - APA_PRINTF(APA_DRV_NAME ": error: unused cache returned\n"); - return; - } - if (clink->flags & APA_CACHE_FLAG_DIRTY) - APA_PRINTF(APA_DRV_NAME ": error: dirty buffer returned\n"); - clink->nused--; - if (clink->nused == 0) - apaCacheLink(cacheBuf->tail, clink); - return; + if(clink==NULL){ + APA_PRINTF(APA_DRV_NAME": error: null buffer returned\n"); + return; + } + if(clink->nused==0){ + APA_PRINTF(APA_DRV_NAME": error: unused cache returned\n"); + return; + } + if(clink->flags & APA_CACHE_FLAG_DIRTY) + APA_PRINTF(APA_DRV_NAME": error: dirty buffer returned\n"); + clink->nused--; + if(clink->nused==0) + apaCacheLink(cacheBuf->tail, clink); + return; } apa_cache_t *apaCacheAlloc(void) { - apa_cache_t *cnext; - - if ((cacheBuf->tail == cacheBuf) && - (cacheBuf->tail == cacheBuf->tail->next)) { - APA_PRINTF(APA_DRV_NAME ": error: free buffer empty\n"); - return NULL; - } - cnext = cacheBuf->next; - if (cnext->flags & APA_CACHE_FLAG_DIRTY) - APA_PRINTF(APA_DRV_NAME ": error: dirty buffer allocated\n"); - cnext->nused = 1; - cnext->flags = 0; - cnext->device = -1; - cnext->sector = -1; - return apaCacheUnLink(cnext); + apa_cache_t *cnext; + + if((cacheBuf->tail==cacheBuf) && + (cacheBuf->tail==cacheBuf->tail->next)){ + APA_PRINTF(APA_DRV_NAME": error: free buffer empty\n"); + return NULL; + } + cnext=cacheBuf->next; + if(cnext->flags & APA_CACHE_FLAG_DIRTY) + APA_PRINTF(APA_DRV_NAME": error: dirty buffer allocated\n"); + cnext->nused=1; + cnext->flags=0; + cnext->device=-1; + cnext->sector=-1; + return apaCacheUnLink(cnext); } diff --git a/modules/hdd/libapa/src/free.c b/modules/hdd/libapa/src/free.c new file mode 100644 index 000000000..3c90d0900 --- /dev/null +++ b/modules/hdd/libapa/src/free.c @@ -0,0 +1,81 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# Free space calculation routines +*/ + +#include +#include +#include +#include +#include +#include + +#include "apa-opt.h" +#include "libapa.h" + +static void apaCalculateFreeSpace(u32 *free, u32 sectors) +{ + if(0x1FFFFF < sectors) + { + *free += sectors; + return; + } + + if((*free & sectors) == 0) + { + *free |= sectors; + return; + } + + for(sectors /= 2; 0x3FFFF < sectors; sectors /= 2) + *free |= sectors; +} + +int apaGetFreeSectors(s32 device, u32 *free, apa_device_t *deviceinfo) +{ + u32 sectors, partMax; + int rv; + apa_cache_t *clink; + + sectors = 0; + *free = 0; + if((clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv)) != NULL) + { + do{ + if(clink->header->type == 0) + apaCalculateFreeSpace(free, clink->header->length); + sectors += clink->header->length; + }while((clink = apaGetNextHeader(clink, &rv)) != NULL); + } + + if(rv == 0) + { + for(partMax = deviceinfo[device].partitionMaxSize; 0x0003FFFF < partMax; partMax = deviceinfo[device].partitionMaxSize) + { //As weird as it looks, this was how it was done in the original HDD.IRX. + for( ; 0x0003FFFF < partMax; partMax /= 2) + { + //Non-SONY: Perform 64-bit arithmetic here to avoid overflows when dealing with large disks. + if((sectors % partMax == 0) && ((u64)sectors + partMax < deviceinfo[device].totalLBA)) + { + apaCalculateFreeSpace(free, partMax); + sectors += partMax; + break; + } + } + + if(0x0003FFFF >= partMax) + break; + } + + APA_PRINTF(APA_DRV_NAME": total = %08lx sectors, installable = %08lx sectors.\n", sectors, *free); + } + + return rv; +} diff --git a/modules/hdd/libapa/src/journal.c b/modules/hdd/libapa/src/journal.c index ed108cbd3..e1d7f7e4c 100644 --- a/modules/hdd/libapa/src/journal.c +++ b/modules/hdd/libapa/src/journal.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # APA journal related routines */ @@ -25,59 +24,61 @@ static apa_journal_t journalBuf; int apaJournalFlush(s32 device) -{ // this write any thing that in are journal buffer :) - if (ata_device_flush_cache(device)) - return -EIO; - if (ata_device_sector_io(device, &journalBuf, APA_SECTOR_APAL, 1, ATA_DIR_WRITE)) - return -EIO; - if (ata_device_flush_cache(device)) - return -EIO; - return 0; +{// this write any thing that in are journal buffer :) + if(ata_device_flush_cache(device)) + return -EIO; + if(ata_device_sector_io(device, &journalBuf, APA_SECTOR_APAL, 1, ATA_DIR_WRITE)) + return -EIO; + if(ata_device_flush_cache(device)) + return -EIO; + return 0; } int apaJournalReset(s32 device) { - memset(&journalBuf, 0, sizeof(apa_journal_t)); - journalBuf.magic = APAL_MAGIC; - return apaJournalFlush(device); + memset(&journalBuf, 0, sizeof(apa_journal_t)); + journalBuf.magic=APAL_MAGIC; + return apaJournalFlush(device); } int apaJournalWrite(apa_cache_t *clink) { - clink->header->checksum = journalCheckSum(clink->header); - if (ata_device_sector_io(clink->device, clink->header, - (journalBuf.num << 1) + APA_SECTOR_APAL_HEADERS, 2, ATA_DIR_WRITE)) - return -EIO; - journalBuf.sectors[journalBuf.num] = clink->sector; - journalBuf.num++; - return 0; + clink->header->checksum=journalCheckSum(clink->header); + if(ata_device_sector_io(clink->device, clink->header, + (journalBuf.num << 1)+APA_SECTOR_APAL_HEADERS, 2, ATA_DIR_WRITE)) + return -EIO; + journalBuf.sectors[journalBuf.num]=clink->sector; + journalBuf.num++; + return 0; } int apaJournalRestore(s32 device) -{ // copys apa headers from apal to apa system - int i; - u32 sector; - apa_cache_t *clink; +{ // copys apa headers from apal to apa system + int i; + u32 sector; + apa_cache_t *clink; - APA_PRINTF(APA_DRV_NAME ": checking log...\n"); - if (ata_device_sector_io(device, &journalBuf, APA_SECTOR_APAL, sizeof(apa_journal_t) / 512, ATA_DIR_READ)) { - apaJournalReset(device); - return -EIO; - } - if (journalBuf.magic == APAL_MAGIC) { - if (journalBuf.num == 0) - return 0; - clink = apaCacheAlloc(); - for (i = 0, sector = APA_SECTOR_APAL_HEADERS; i < journalBuf.num; i++, sector += 2) { - if (ata_device_sector_io(device, clink->header, sector, 2, ATA_DIR_READ)) - break; - if (ata_device_sector_io(device, clink->header, journalBuf.sectors[i], 2, ATA_DIR_WRITE)) - break; - } - apaCacheFree(clink); - return apaJournalReset(device); // only do if journal.. - } - memset(&journalBuf, 0, sizeof(apa_journal_t)); // safe e - journalBuf.magic = APAL_MAGIC; - return 0; //-EINVAL; + APA_PRINTF(APA_DRV_NAME": checking log...\n"); + if(ata_device_sector_io(device, &journalBuf, APA_SECTOR_APAL, sizeof(apa_journal_t)/512, ATA_DIR_READ)){ + apaJournalReset(device); + return -EIO; + } + if(journalBuf.magic==APAL_MAGIC) + { + if(journalBuf.num==0) + return 0; + clink=apaCacheAlloc(); + for(i=0, sector=APA_SECTOR_APAL_HEADERS;iheader, sector, 2, ATA_DIR_READ)) + break; + if(ata_device_sector_io(device, clink->header, journalBuf.sectors[i], 2, ATA_DIR_WRITE)) + break; + } + apaCacheFree(clink); + return apaJournalReset(device);// only do if journal.. + } + memset(&journalBuf, 0, sizeof(apa_journal_t));// safe e + journalBuf.magic=APAL_MAGIC; + return 0;//-EINVAL; } diff --git a/modules/hdd/libapa/src/misc.c b/modules/hdd/libapa/src/misc.c index 0739fac19..9d7977382 100644 --- a/modules/hdd/libapa/src/misc.c +++ b/modules/hdd/libapa/src/misc.c @@ -7,10 +7,10 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # Miscellaneous routines */ +#include #include #include #include @@ -22,63 +22,53 @@ #include "apa-opt.h" #include "libapa.h" -extern char apaDefaultPassword[APA_PASSMAX]; - void *apaAllocMem(int size) { - int intrStat; - void *mem; + int intrStat; + void *mem; - CpuSuspendIntr(&intrStat); - mem = AllocSysMemory(ALLOC_FIRST, size, NULL); - CpuResumeIntr(intrStat); + CpuSuspendIntr(&intrStat); + mem = AllocSysMemory(ALLOC_FIRST, size, NULL); + CpuResumeIntr(intrStat); - return mem; + return mem; } void apaFreeMem(void *ptr) { - int intrStat; + int intrStat; - CpuSuspendIntr(&intrStat); - FreeSysMemory(ptr); - CpuResumeIntr(intrStat); + CpuSuspendIntr(&intrStat); + FreeSysMemory(ptr); + CpuResumeIntr(intrStat); } int apaGetTime(apa_ps2time_t *tm) { - sceCdCLOCK cdtime; - apa_ps2time_t timeBuf = {0, 7, 6, 5, 4, 3, 2000}; - - if (sceCdReadClock(&cdtime) != 0 && cdtime.stat == 0) { - timeBuf.sec = btoi(cdtime.second); - timeBuf.min = btoi(cdtime.minute); - timeBuf.hour = btoi(cdtime.hour); - timeBuf.day = btoi(cdtime.day); - timeBuf.month = btoi(cdtime.month & 0x7F); //The old CDVDMAN sceCdReadClock() function does not automatically file off the highest bit. - timeBuf.year = btoi(cdtime.year) + 2000; - } - memcpy(tm, &timeBuf, sizeof(apa_ps2time_t)); - return 0; -} + sceCdCLOCK cdtime; + apa_ps2time_t timeBuf={ 0, 7, 6, 5, 4, 3, 2000 }; -int apaPassCmp(char *pw1, char *pw2) -{ - //Passwords are not supported, hence this check should always pass. - /* return memcmp(pw1, (pw2==NULL)?apaDefaultPassword:pw2, APA_PASSMAX) ? -EACCES : 0; */ - return 0; + if(sceCdReadClock(&cdtime)!=0 && cdtime.stat==0) + { + timeBuf.sec=btoi(cdtime.second); + timeBuf.min=btoi(cdtime.minute); + timeBuf.hour=btoi(cdtime.hour); + timeBuf.day=btoi(cdtime.day); + timeBuf.month=btoi(cdtime.month & 0x7F); //The old CDVDMAN sceCdReadClock() function does not automatically file off the highest bit. + timeBuf.year=btoi(cdtime.year)+2000; + } + memcpy(tm, &timeBuf, sizeof(apa_ps2time_t)); + return 0; } int apaGetIlinkID(u8 *idbuf) { - u32 err = 0; - - memset(idbuf, 0, 32); - - if (sceCdRI(idbuf, &err)) - if (err) - APA_PRINTF(APA_DRV_NAME ": Error when reading ilink id\n"); + u32 err=0; - // Return all ok for compatibility - return 0; + memset(idbuf, 0, 32); + if(sceCdRI(idbuf, &err)) + if(err==0) + return 0; + APA_PRINTF(APA_DRV_NAME": Error: cannot get ilink id\n"); + return -EIO; } diff --git a/modules/hdd/libapa/src/password.c b/modules/hdd/libapa/src/password.c new file mode 100644 index 000000000..05dd32ea7 --- /dev/null +++ b/modules/hdd/libapa/src/password.c @@ -0,0 +1,518 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# Password-handling routines +*/ + +#include +#include +#include +#include +#include +#include + +#include "apa-opt.h" +#include "libapa.h" + +int apaPassCmp(const char *pw1, const char *pw2) +{ +#ifdef APA_ENABLE_PASSWORDS + return memcmp(pw1, pw2, APA_PASSMAX) ? -EACCES : 0; +#else + //Passwords are not supported, hence this check should always pass. + return 0; +#endif +} + +static void DESEncryptPassword(u32 id_lo, u32 id_hi, char *password_out, const char *password); + +void apaEncryptPassword(const char *id, char *password_out, const char *password_in) +{ + char password[APA_PASSMAX]; + memcpy(password, password_in, APA_PASSMAX); + DESEncryptPassword(*(u32*)(id), *(u32*)(id + 4), password_out, password); +} + +struct KeyPair{ + u32 lo, hi; +}; + +//This is a standard DES-ECB implementation. It encrypts the partition ID with the password. +static void DESEncryptPassword(u32 id_lo, u32 id_hi, char *password_out, const char *password) +{ + //Left + static const u8 PC1[]={ 0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, + 0x01, 0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, + 0x0a, 0x02, 0x3b, 0x33, 0x2b, 0x23, 0x1b, + 0x13, 0x0b, 0x03, 0x3c, 0x34, 0x2c, 0x24, + //Right + 0x3f, 0x37, 0x2f, 0x27, 0x1f, 0x17, 0x0f, + 0x07, 0x3e, 0x36, 0x2e, 0x26, 0x1e, 0x16, + 0x0e, 0x06, 0x3d, 0x35, 0x2d, 0x25, 0x1d, + 0x15, 0x0d, 0x05, 0x1c, 0x14, 0x0c, 0x04 }; + static const u8 Rotations[]={ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + static const u8 PC2[]={ 0x0e, 0x11, 0x0b, 0x18, 0x01, 0x05, + 0x03, 0x1c, 0x0f, 0x06, 0x15, 0x0a, + 0x17, 0x13, 0x0c, 0x04, 0x1a, 0x08, + 0x10, 0x07, 0x1b, 0x14, 0x0d, 0x02, + 0x29, 0x34, 0x1f, 0x25, 0x2f, 0x37, + 0x1e, 0x28, 0x33, 0x2d, 0x21, 0x30, + 0x2c, 0x31, 0x27, 0x38, 0x22, 0x35, + 0x2e, 0x2a, 0x32, 0x24, 0x1d, 0x20 }; + static const u8 IP[]={ 0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, 0x0a, 0x02, 0x3c, 0x34, 0x2c, 0x24, 0x1c, 0x14, 0x0c, 0x04, + 0x3e, 0x36, 0x2e, 0x26, 0x1e, 0x16, 0x0e, 0x06, 0x40, 0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x08, + + 0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, 0x01, 0x3b, 0x33, 0x2b, 0x23, 0x1b, 0x13, 0x0b, 0x03, + 0x3d, 0x35, 0x2d, 0x25, 0x1d, 0x15, 0x0d, 0x05, 0x3f, 0x37, 0x2f, 0x27, 0x1f, 0x17, 0x0f, 0x07 }; + static const u8 Expansion[]={ 0x20, 0x01, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x01 }; + static const u8 sbox[][64]={ { 0x0e, 0x04, 0x0d, 0x01, 0x02, 0x0f, 0x0b, 0x08, 0x03, 0x0a, 0x06, 0x0c, 0x05, 0x09, 0x00, 0x07, + 0x00, 0x0f, 0x07, 0x04, 0x0e, 0x02, 0x0d, 0x01, 0x0a, 0x06, 0x0c, 0x0b, 0x09, 0x05, 0x03, 0x08, + 0x04, 0x01, 0x0e, 0x08, 0x0d, 0x06, 0x02, 0x0b, 0x0f, 0x0c, 0x09, 0x07, 0x03, 0x0a, 0x05, 0x00, + 0x0f, 0x0c, 0x08, 0x02, 0x04, 0x09, 0x01, 0x07, 0x05, 0x0b, 0x03, 0x0e, 0x0a, 0x00, 0x06, 0x0d }, + { 0x0f, 0x01, 0x08, 0x0e, 0x06, 0x0b, 0x03, 0x04, 0x09, 0x07, 0x02, 0x0d, 0x0c, 0x00, 0x05, 0x0a, + 0x03, 0x0d, 0x04, 0x07, 0x0f, 0x02, 0x08, 0x0e, 0x0c, 0x00, 0x01, 0x0a, 0x06, 0x09, 0x0b, 0x05, + 0x00, 0x0e, 0x07, 0x0b, 0x0a, 0x04, 0x0d, 0x01, 0x05, 0x08, 0x0c, 0x06, 0x09, 0x03, 0x02, 0x0f, + 0x0d, 0x08, 0x0a, 0x01, 0x03, 0x0f, 0x04, 0x02, 0x0b, 0x06, 0x07, 0x0c, 0x00, 0x05, 0x0e, 0x09 }, + { 0x0a, 0x00, 0x09, 0x0e, 0x06, 0x03, 0x0f, 0x05, 0x01, 0x0d, 0x0c, 0x07, 0x0b, 0x04, 0x02, 0x08, + 0x0d, 0x07, 0x00, 0x09, 0x03, 0x04, 0x06, 0x0a, 0x02, 0x08, 0x05, 0x0e, 0x0c, 0x0b, 0x0f, 0x01, + 0x0d, 0x06, 0x04, 0x09, 0x08, 0x0f, 0x03, 0x00, 0x0b, 0x01, 0x02, 0x0c, 0x05, 0x0a, 0x0e, 0x07, + 0x01, 0x0a, 0x0d, 0x00, 0x06, 0x09, 0x08, 0x07, 0x04, 0x0f, 0x0e, 0x03, 0x0b, 0x05, 0x02, 0x0c }, + { 0x07, 0x0d, 0x0e, 0x03, 0x00, 0x06, 0x09, 0x0a, 0x01, 0x02, 0x08, 0x05, 0x0b, 0x0c, 0x04, 0x0f, + 0x0d, 0x08, 0x0b, 0x05, 0x06, 0x0f, 0x00, 0x03, 0x04, 0x07, 0x02, 0x0c, 0x01, 0x0a, 0x0e, 0x09, + 0x0a, 0x06, 0x09, 0x00, 0x0c, 0x0b, 0x07, 0x0d, 0x0f, 0x01, 0x03, 0x0e, 0x05, 0x02, 0x08, 0x04, + 0x03, 0x0f, 0x00, 0x06, 0x0a, 0x01, 0x0d, 0x08, 0x09, 0x04, 0x05, 0x0b, 0x0c, 0x07, 0x02, 0x0e }, + { 0x02, 0x0c, 0x04, 0x01, 0x07, 0x0a, 0x0b, 0x06, 0x08, 0x05, 0x03, 0x0f, 0x0d, 0x00, 0x0e, 0x09, + 0x0e, 0x0b, 0x02, 0x0c, 0x04, 0x07, 0x0d, 0x01, 0x05, 0x00, 0x0f, 0x0a, 0x03, 0x09, 0x08, 0x06, + 0x04, 0x02, 0x01, 0x0b, 0x0a, 0x0d, 0x07, 0x08, 0x0f, 0x09, 0x0c, 0x05, 0x06, 0x03, 0x00, 0x0e, + 0x0b, 0x08, 0x0c, 0x07, 0x01, 0x0e, 0x02, 0x0d, 0x06, 0x0f, 0x00, 0x09, 0x0a, 0x04, 0x05, 0x03 }, + { 0x0c, 0x01, 0x0a, 0x0f, 0x09, 0x02, 0x06, 0x08, 0x00, 0x0d, 0x03, 0x04, 0x0e, 0x07, 0x05, 0x0b, + 0x0a, 0x0f, 0x04, 0x02, 0x07, 0x0c, 0x09, 0x05, 0x06, 0x01, 0x0d, 0x0e, 0x00, 0x0b, 0x03, 0x08, + 0x09, 0x0e, 0x0f, 0x05, 0x02, 0x08, 0x0c, 0x03, 0x07, 0x00, 0x04, 0x0a, 0x01, 0x0d, 0x0b, 0x06, + 0x04, 0x03, 0x02, 0x0c, 0x09, 0x05, 0x0f, 0x0a, 0x0b, 0x0e, 0x01, 0x07, 0x06, 0x00, 0x08, 0x0d }, + { 0x04, 0x0b, 0x02, 0x0e, 0x0f, 0x00, 0x08, 0x0d, 0x03, 0x0c, 0x09, 0x07, 0x05, 0x0a, 0x06, 0x01, + 0x0d, 0x00, 0x0b, 0x07, 0x04, 0x09, 0x01, 0x0a, 0x0e, 0x03, 0x05, 0x0c, 0x02, 0x0f, 0x08, 0x06, + 0x01, 0x04, 0x0b, 0x0d, 0x0c, 0x03, 0x07, 0x0e, 0x0a, 0x0f, 0x06, 0x08, 0x00, 0x05, 0x09, 0x02, + 0x06, 0x0b, 0x0d, 0x08, 0x01, 0x04, 0x0a, 0x07, 0x09, 0x05, 0x00, 0x0f, 0x0e, 0x02, 0x03, 0x0c }, + { 0x0d, 0x02, 0x08, 0x04, 0x06, 0x0f, 0x0b, 0x01, 0x0a, 0x09, 0x03, 0x0e, 0x05, 0x00, 0x0c, 0x07, + 0x01, 0x0f, 0x0d, 0x08, 0x0a, 0x03, 0x07, 0x04, 0x0c, 0x05, 0x06, 0x0b, 0x00, 0x0e, 0x09, 0x02, + 0x07, 0x0b, 0x04, 0x01, 0x09, 0x0c, 0x0e, 0x02, 0x00, 0x06, 0x0a, 0x0d, 0x0f, 0x03, 0x05, 0x08, + 0x02, 0x01, 0x0e, 0x07, 0x04, 0x0a, 0x08, 0x0d, 0x0f, 0x0c, 0x09, 0x00, 0x03, 0x05, 0x06, 0x0b }}; + static const u8 Permutation[]={ 0x10, 0x07, 0x14, 0x15, 0x1d, 0x0c, 0x1c, 0x11, 0x01, 0x0f, 0x17, 0x1a, 0x05, 0x12, 0x1f, 0x0a, + 0x02, 0x08, 0x18, 0x0e, 0x20, 0x1b, 0x03, 0x09, 0x13, 0x0d, 0x1e, 0x06, 0x16, 0x0b, 0x04, 0x19 }; + static const u8 FP[]={ 0x28, 0x08, 0x30, 0x10, 0x38, 0x18, 0x40, 0x20, 0x27, 0x07, 0x2f, 0x0f, 0x37, 0x17, 0x3f, 0x1f, + 0x26, 0x06, 0x2e, 0x0e, 0x36, 0x16, 0x3e, 0x1e, 0x25, 0x05, 0x2d, 0x0d, 0x35, 0x15, 0x3d, 0x1d, + 0x24, 0x04, 0x2c, 0x0c, 0x34, 0x14, 0x3c, 0x1c, 0x23, 0x03, 0x2b, 0x0b, 0x33, 0x13, 0x3b, 0x1b, + 0x22, 0x02, 0x2a, 0x0a, 0x32, 0x12, 0x3a, 0x1a, 0x21, 0x01, 0x29, 0x09, 0x31, 0x11, 0x39, 0x19 }; + u32 BitMask_hi, BitMask_lo; + u32 PermutedKeyMask_lo, PermutedKeyMask_hi, Rot2Mask_lo, Rot1Mask_lo, Rot2Mask_hi, Rot1Mask_hi; + u32 BitPerm_lo, BitPerm_hi; + u32 password_lo, password_hi; + u32 key1, key2, key3, key4, input_lo, input_hi; + u32 PermutedKey_lo, PermutedKey_hi, kVal_lo, kVal_hi, PermutedInput_lo, PermutedInput_hi, eVal_lo, eVal_hi, sVal_lo, sVal_hi, pVal_lo, pVal_hi, output_lo, output_hi; + struct KeyPair pairC[17], pairD[17], pairK[17], pairL[17], pairR[17]; + struct KeyPair *pPairC, *pPairD, *pPairK, *pPairL, *pPairR; + unsigned int i, j, k; + int shift; + + //Phase 1 (Permute KEY with Permuted Choice 1) + PermutedKey_lo = 0; + PermutedKey_hi = 0; + BitMask_lo = 0; + BitMask_hi = 0x80000000; + BitPerm_lo = 0; + BitPerm_hi = 0x80000000; + + password_lo = *(const u32*)password; + password_hi = *(const u32*)(password + 4); + + for(i = 0; i < 56; i++) + { + shift = PC1[i] - 1; + + if((shift << 26) >= 0) + { //0 to 31-bit shift + if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key2 = 0; + key1 = BitMask_hi >> shift; + } + + //If bit (shift) is set, set the current bit. + if(((password_lo & key1) | (password_hi & key2)) != 0) + { + PermutedKey_lo |= BitPerm_lo; + PermutedKey_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); + BitPerm_hi >>= 1; + } + + //Phase 2 (Key Schedule Calculation) + //This mask is used to extract the lower 28-bits of a key. + PermutedKeyMask_lo = 0x0FFFFFFF; + PermutedKeyMask_hi = 0x00000000; + + Rot2Mask_lo = 3; + Rot2Mask_hi = 0x00000000; + Rot1Mask_lo = 1; + Rot1Mask_hi = 0x00000000; + + //C-bits, upper 28-bits of Permuted Key + pairC[0].lo = PermutedKey_hi >> 4; + pairC[0].hi = 0; + + //D-bits, lower 28-bits of Permuted Key + pairD[0].lo = ((PermutedKey_lo >> 8) | (PermutedKey_hi << 24)) & PermutedKeyMask_lo; + pairD[0].hi = ((PermutedKey_hi >> 8) & PermutedKeyMask_hi); + + //Calculate all Cn and Dn. + for(i = 0; i < 16; i++) + { + if(Rotations[i] != 1) + { //Rotate left twice + //hi 26:0 | lo 31:26 + key1 = ((pairC[i].hi << 6) | (pairC[i].lo >> 26)) & Rot2Mask_lo; + //lo 29:0 + //key1|key 4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLXX, where X is from key1 + key4 = pairC[i].lo << 2; + //hi 31:26 + //This part is discarded. + key2 = (pairC[i].hi >> 26) & Rot2Mask_hi; + //hi 29:2 | lo 31:30 + //key2|key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHLL + key3 = (pairC[i].hi << 2) | (pairC[i].lo >> 30); + } else { //Rotate left once + //hi 27:0 | lo 31:27 + key1 = ((pairC[i].hi << 5) | (pairC[i].lo >> 27)) & Rot1Mask_lo; + //lo 30:0 + //key1|key4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLX, where X is from key1 + key4 = pairC[i].lo << 1; + //hi 31:27 + //This part is discarded. + key2 = (pairC[i].hi >> 27) & Rot1Mask_hi; + //hi 30:0 | lo 31:31 + //key2:key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHL + key3 = (pairC[i].hi << 1) | (pairC[i].lo >> 31); + } + + //Merge the two rotated parts together, for the hi and low pair. + //Note: hi contains nothing. + pairC[i + 1].lo = (key1 | key4) & PermutedKeyMask_lo; + pairC[i + 1].hi = (key2 | key3) & PermutedKeyMask_hi; + + if(Rotations[i] != 1) + { //Rotate left twice + //hi 26:0 | lo 31:26 + key1 = ((pairD[i].hi << 6) | (pairD[i].lo >> 26)) & Rot2Mask_lo; + //lo 29:0 + //key1|key 4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLXX, where X is from key1 + key4 = pairD[i].lo << 2; + //hi 31:26 + //This part is discarded. + key2 = (pairD[i].hi >> 26) & Rot2Mask_hi; + //hi 29:2 | lo 31:30 + //key2|key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHLL + key3 = (pairD[i].hi << 2) | (pairD[i].lo >> 30); + } else { //Rotate left once + //hi 27:0 | lo 31:27 + key1 = ((pairD[i].hi << 5) | (pairD[i].lo >> 27)) & Rot1Mask_lo; + //lo 30:0 + //key1|key4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLX, where X is from key1 + key4 = pairD[i].lo << 1; + //hi 31:27 + //This part is discarded. + key2 = (pairD[i].hi >> 27) & Rot1Mask_hi; + //hi 30:0 | lo 31:31 + //key2:key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHL + key3 = (pairD[i].hi << 1) | (pairD[i].lo >> 31); + } + + //Merge the two rotated parts together, for the hi and low pair. + //Note: hi contains nothing. + pairD[i + 1].lo = (key1 | key4) & PermutedKeyMask_lo; + pairD[i + 1].hi = (key2 | key3) & PermutedKeyMask_hi; + } + + //Phase 3 + BitMask_lo = 0x00000000; + BitMask_hi = 0x80000000; + + // Determine all K, through the Permutation of CnDn by PC-2 + for(pPairC = &pairC[1],pPairD = &pairD[1],pPairK = &pairK[1]; pPairK < &pairK[17]; pPairC++,pPairD++,pPairK++) + { + kVal_lo = 0; + kVal_hi = 0; + BitPerm_lo = 0x00000000; + BitPerm_hi = 0x80000000; + + /* Calculate CnDn: + Note: hi of both Cn and Dn are assumed to, and actually contain nothing. + lo: (D lo 23:0) | (0 7:0) + D lo 23:0 LLLLLLLLLLLLLLLLLLLLLLLL00000000 + 0 7:0 00000000000000000000000000000000 + hi: (C hi 27:0) | (D hi 23:0) | (D lo 31:24) + C lo 27:0 llllllllllllllllllllllllllll0000 + D hi 23:0 HHHHHHHHHHHHHHHHHHHHHHHH00000000 All zero + D lo 31:24 000000000000000000000000XXXXLLLL + + l = C lo L = D lo + h = C hi H = D hi X = unused bits (28/32-bit value) */ + input_lo = 0 | (pPairD->lo << 8); + input_hi = (pPairC->lo << 4) | (pPairD->hi << 8) | (pPairD->lo >> 24); + + for(i = 0; i < 48; i++) + { + shift = PC2[i] - 1; + + if((shift << 26) >= 0) + { //0 to 31-bit shift + if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key2 = 0; + key1 = BitMask_hi >> shift; + } + + //If bit (shift) is set, set the current bit. + if(((input_lo & key1) | (input_hi & key2)) != 0) + { + kVal_lo |= BitPerm_lo; + kVal_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_hi << 31) | (BitPerm_lo >> 1); + BitPerm_hi >>= 1; + } + + pPairK->lo = kVal_lo; + pPairK->hi = kVal_hi; + } + + //Phase 4 (Enciphering) + BitMask_lo = 0x00000000; + BitMask_hi = 0x80000000; + BitPerm_lo = 0x00000000; + BitPerm_hi = 0x80000000; + PermutedInput_lo = 0; + PermutedInput_hi = 0; + + //Initial Permutation (IP) + for(i = 0; i < 64; i++) + { + shift = IP[i] - 1; + + if((shift << 26) >= 0) + { //0 to 31-bit shift + if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key2 = 0; + key1 = BitMask_hi >> shift; + } + + //If bit (shift) is set, set the current bit. + if(((id_lo & key1) | (id_hi & key2)) != 0) + { + PermutedInput_lo |= BitPerm_lo; + PermutedInput_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); + BitPerm_hi >>= 1; + } + + //Phase 5 (Key-dependent Computation) + BitMask_lo = 0x00000000; + BitMask_hi = 0x80000000; + + //L0 and R0 make up the permuted input block. + //The lo values are not used. + pairL[0].lo = PermutedInput_lo & 0x00000000; + pairL[0].hi = PermutedInput_hi & 0xFFFFFFFF; + pairR[0].lo = 0x00000000; + pairR[0].hi = PermutedInput_lo << 0; + + for (j = 0, k = 1, pPairL = &pairL[1], pPairR = &pairR[1]; pPairR < &pairR[17]; j++, k++, pPairR++, pPairL++) + { + eVal_lo = 0; + eVal_hi = 0; + BitPerm_lo = 0x00000000; + BitPerm_hi = 0x80000000; + + //Ln' = Rn + pPairL->lo = input_lo = pairR[j].lo; + pPairL->hi = input_hi = pairR[j].hi; + + //Calculate E(Rn) + for(i = 0; i < 48; i++) + { + shift = Expansion[i] - 1; + if((shift << 26) >= 0) + { //0 to 31-bit shift + if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key2 = 0; + key1 = BitMask_hi >> shift; + } + + //If bit (shift) is set, set the current bit. + if(((input_lo & key1) | (input_hi & key2)) != 0) + { + eVal_lo |= BitPerm_lo; + eVal_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_hi << 31) | (BitPerm_lo >> 1); + BitPerm_hi >>= 1; + } + + //Phase 6 (Substitution Boxes) + sVal_lo = 0; + sVal_hi = 0; + //Calculate Bn = Kn ^ E(Rn) + //Also, shift the 48-bit Expansion value forward towards position 0. + eVal_lo = (eVal_lo ^ pairK[k].lo) >> 16; + eVal_hi = eVal_hi ^ pairK[k].hi; + eVal_lo |= (eVal_hi << 16); + eVal_hi >>= 16; + + //Calculate Sn(Bn), which is stored in the upper 32-bits of the result. + for(i = 0, shift = 32; i < 8; i++, shift += 4) + { + input_lo = sbox[7 - i][((eVal_lo & 0x20) | ((eVal_lo & 0x3F) >> 1 & 0xF) | ((eVal_lo & 0x3F) << 4 & 0x10))]; + //Shift to the next 6-bit B-block + eVal_lo = (eVal_lo >> 6) | (eVal_hi << 26); + eVal_hi >>= 6; + + input_hi = 0; + if((shift << 26) >= 0) + { //0 to 31-bit shift + if((shift << 26) > 0) //Shift all bits right by shift (hi,lo >> shift) + key3 = (input_hi << shift) | (input_lo >> (-shift)); + else //0-bit shift, which should not happen. + key3 = input_hi << shift; + + key4 = input_lo << shift; + } else { //>31-bit shift + key3 = input_lo << shift; + key4 = 0; + } + + sVal_lo |= key4; + sVal_hi |= key3; + } + + //Phase 7 (Permutation with function P) + pVal_lo = 0; + pVal_hi = 0; + BitPerm_lo = 0x00000000; + BitPerm_hi = 0x80000000; + + //Calculate P(Sn(K ^ E(Rn))) + for(i = 0; i < 32; i++) + { + shift = Permutation[i] - 1; + if((shift << 26) >= 0) + { //0 to 31-bit shift + if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key1 = BitMask_hi >> shift; + key2 = 0; + } + + //If bit (shift) is set, set the current bit. + if(((sVal_lo & key1) | (sVal_hi & key2)) != 0) + { + pVal_lo |= BitPerm_lo; + pVal_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); + BitPerm_hi >>= 1; + } + + //0x00003bc4 - Rn' = Ln ^ f(Rn,Kn) + pPairR->lo = pairL[j].lo ^ pVal_lo; + pPairR->hi = pairL[j].hi ^ pVal_hi; + } + + //Phase 8 (Final Permutation) + output_lo = 0; + output_hi = 0; + BitMask_lo = BitPerm_lo = 0x00000000; + BitMask_hi = BitPerm_hi = 0x80000000; + //Retrieve preoutput blocks + //Ln and Rn lo do not contain anything, hence they are discarded. + input_lo = pairR[16].lo | (pairL[16].hi >> 0); + input_hi = pairR[16].hi | 0; + + //Subject the preoutput to the Final Permutation + for(i = 0; i < 64; i++) + { + shift = FP[i] - 1; + if((shift << 26) >= 0) + { //0 to 31-bit shift + if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key1 = BitMask_hi >> shift; + key2 = 0; + } + + //If bit (shift) is set, set the current bit. + if(((input_lo & key1) | (input_hi & key2)) != 0) + { + output_lo |= BitPerm_lo; + output_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); + BitPerm_hi >>= 1; + } + + //Encrypted output + *(u32*)password_out = output_lo; + *(u32*)(password_out + 4) = output_hi; +} diff --git a/modules/hdd/libpfs/include/libpfs.h b/modules/hdd/libpfs/include/libpfs.h index 7b475db22..625145712 100644 --- a/modules/hdd/libpfs/include/libpfs.h +++ b/modules/hdd/libpfs/include/libpfs.h @@ -7,221 +7,207 @@ # Copyright 2001-2004, ps2dev - http://www.ps2dev.org # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. -# -# $Id$ */ #ifndef _LIBPFS_H #define _LIBPFS_H // General constants -#define PFS_BLOCKSIZE 0x2000 -#define PFS_SUPER_MAGIC 0x50465300 // "PFS\0" aka Playstation Filesystem -#define PFS_JOUNRNAL_MAGIC 0x5046534C // "PFSL" aka PFS Log -#define PFS_SEGD_MAGIC 0x53454744 // "SEGD" aka segment descriptor direct -#define PFS_SEGI_MAGIC 0x53454749 // "SEGI" aka segment descriptor indirect -#define PFS_MAX_SUBPARTS 64 -#define PFS_NAME_LEN 255 -#define PFS_VERSION 4 +#define PFS_BLOCKSIZE 0x2000 +#define PFS_SUPER_MAGIC 0x50465300 // "PFS\0" aka Playstation Filesystem +#define PFS_JOUNRNAL_MAGIC 0x5046534C // "PFSL" aka PFS Log +#define PFS_SEGD_MAGIC 0x53454744 // "SEGD" aka segment descriptor direct +#define PFS_SEGI_MAGIC 0x53454749 // "SEGI" aka segment descriptor indirect +#define PFS_MAX_SUBPARTS 64 +#define PFS_NAME_LEN 255 +#define PFS_VERSION 4 // attribute flags -#define PFS_FIO_ATTR_READABLE 0x0001 -#define PFS_FIO_ATTR_WRITEABLE 0x0002 -#define PFS_FIO_ATTR_EXECUTABLE 0x0004 -#define PFS_FIO_ATTR_COPYPROTECT 0x0008 -#define PFS_FIO_ATTR_UNK0010 0x0010 -#define PFS_FIO_ATTR_SUBDIR 0x0020 -#define PFS_FIO_ATTR_UNK0040 0x0040 -#define PFS_FIO_ATTR_CLOSED 0x0080 -#define PFS_FIO_ATTR_UNK0100 0x0100 -#define PFS_FIO_ATTR_UNK0200 0x0200 -#define PFS_FIO_ATTR_UNK0400 0x0400 -#define PFS_FIO_ATTR_PDA 0x0800 -#define PFS_FIO_ATTR_PSX 0x1000 -#define PFS_FIO_ATTR_UNK2000 0x2000 -#define PFS_FIO_ATTR_HIDDEN 0x4000 +#define PFS_FIO_ATTR_READABLE 0x0001 +#define PFS_FIO_ATTR_WRITEABLE 0x0002 +#define PFS_FIO_ATTR_EXECUTABLE 0x0004 +#define PFS_FIO_ATTR_COPYPROTECT 0x0008 +#define PFS_FIO_ATTR_UNK0010 0x0010 +#define PFS_FIO_ATTR_SUBDIR 0x0020 +#define PFS_FIO_ATTR_UNK0040 0x0040 +#define PFS_FIO_ATTR_CLOSED 0x0080 +#define PFS_FIO_ATTR_UNK0100 0x0100 +#define PFS_FIO_ATTR_UNK0200 0x0200 +#define PFS_FIO_ATTR_UNK0400 0x0400 +#define PFS_FIO_ATTR_PDA 0x0800 +#define PFS_FIO_ATTR_PSX 0x1000 +#define PFS_FIO_ATTR_UNK2000 0x2000 +#define PFS_FIO_ATTR_HIDDEN 0x4000 // cache flags (status) -#define PFS_CACHE_FLAG_DIRTY 0x01 -#define PFS_CACHE_FLAG_NOLOAD 0x02 -#define PFS_CACHE_FLAG_MASKSTATUS 0x0F +#define PFS_CACHE_FLAG_DIRTY 0x01 +#define PFS_CACHE_FLAG_NOLOAD 0x02 +#define PFS_CACHE_FLAG_MASKSTATUS 0x0F // cache flags (types) -#define PFS_CACHE_FLAG_NOTHING 0x00 -#define PFS_CACHE_FLAG_SEGD 0x10 -#define PFS_CACHE_FLAG_SEGI 0x20 -#define PFS_CACHE_FLAG_BITMAP 0x40 -#define PFS_CACHE_FLAG_MASKTYPE 0xF0 +#define PFS_CACHE_FLAG_NOTHING 0x00 +#define PFS_CACHE_FLAG_SEGD 0x10 +#define PFS_CACHE_FLAG_SEGI 0x20 +#define PFS_CACHE_FLAG_BITMAP 0x40 +#define PFS_CACHE_FLAG_MASKTYPE 0xF0 // fsck stats -#define PFS_FSCK_STAT_OK 0x00 -#define PFS_FSCK_STAT_WRITE_ERROR 0x01 -#define PFS_FSCK_STAT_ERROR_0x02 0x02 +#define PFS_FSCK_STAT_OK 0x00 +#define PFS_FSCK_STAT_WRITE_ERROR 0x01 +#define PFS_FSCK_STAT_ERRORS_FIXED 0x02 // odd and end -#define PFS_MODE_SET_FLAG 0x00 -#define PFS_MODE_REMOVE_FLAG 0x01 -#define PFS_MODE_CHECK_FLAG 0x02 +#define PFS_MODE_SET_FLAG 0x00 +#define PFS_MODE_REMOVE_FLAG 0x01 +#define PFS_MODE_CHECK_FLAG 0x02 // journal/log -typedef struct -{ - u32 magic; // =PFS_JOUNRNAL_MAGIC - u16 num; // - u16 checksum; // - struct - { - u32 sector; // block/sector for partition - u16 sub; // main(0)/sub(+1) partition - u16 logSector; // block/sector offset in journal area - } log[127]; +typedef struct { + u32 magic; // =PFS_JOUNRNAL_MAGIC + u16 num; // + u16 checksum; // + struct{ + u32 sector; // block/sector for partition + u16 sub; // main(0)/sub(+1) partition + u16 logSector; // block/sector offset in journal area + } log[127]; } pfs_journal_t; -typedef struct -{ - u8 kLen; // key len/used for offset in to str for value - u8 vLen; // value len - u16 aLen; // allocated length == ((kLen+vLen+7) & ~3) - char str[3]; // size = 3 so sizeof pfs_aentry_t=7 :P +typedef struct{ + u8 kLen; // key len/used for offset in to str for value + u8 vLen; // value len + u16 aLen; // allocated length == ((kLen+vLen+7) & ~3) + char str[3]; // size = 3 so sizeof pfs_aentry_t=7 :P } pfs_aentry_t; -typedef struct -{ - u32 inode; - u8 sub; - u8 pLen; // path length - u16 aLen; // allocated length == ((pLen+8+3) & ~3) - char path[512 - 8]; -} pfs_dentry; +typedef struct { + u32 inode; + u8 sub; + u8 pLen; // path length + u16 aLen; // allocated length == ((pLen+8+3) & ~3) + char path[512-8]; +} pfs_dentry_t; // Block number/count pair (used in inodes) -typedef struct -{ - u32 number; // - u16 subpart; // - u16 count; // -} pfs_blockinfo; +typedef struct { + u32 number; // + u16 subpart; // + u16 count; // +} pfs_blockinfo_t; // Date/time descriptor -typedef struct -{ - u8 unused; // - u8 sec; // - u8 min; // - u8 hour; // - u8 day; // - u8 month; // - u16 year; // -} pfs_datetime; +typedef struct { + u8 unused; // + u8 sec; // + u8 min; // + u8 hour; // + u8 day; // + u8 month; // + u16 year; // +} pfs_datetime_t; // Superblock structure -typedef struct -{ - u32 magic; // - u32 version; // - u32 unknown1; // - u32 pfsFsckStat; // - u32 zone_size; // - u32 num_subs; // number of subs attached to filesystem - pfs_blockinfo log; // block info for metadata log - pfs_blockinfo root; // block info for root directory -} pfs_super_block; +typedef struct { + u32 magic; // + u32 version; // + u32 unknown1; // + u32 pfsFsckStat; // + u32 zone_size; // + u32 num_subs; // number of subs attached to filesystem + pfs_blockinfo_t log; // block info for metadata log + pfs_blockinfo_t root; // block info for root directory +} pfs_super_block_t; // Inode structure -typedef struct -{ - u32 checksum; // Sum of all other words in the inode - u32 magic; // - pfs_blockinfo inode_block; // start block of inode - pfs_blockinfo next_segment; // next segment descriptor inode - pfs_blockinfo last_segment; // last segment descriptor inode - pfs_blockinfo unused; // - pfs_blockinfo data[114]; // - u16 mode; // file mode - u16 attr; // file attributes - u16 uid; // - u16 gid; // - pfs_datetime atime; // - pfs_datetime ctime; // - pfs_datetime mtime; // - u64 size; // - u32 number_blocks; // number of blocks/zones used by file - u32 number_data; // number of used entries in data array - u32 number_segdesg; // number of "indirect blocks"/next segment descriptor's - u32 subpart; // subpart of inode - u32 reserved[4]; // -} pfs_inode; - -typedef struct -{ - char *devName; - int (*transfer)(int fd, void *buffer, /*u16*/ u32 sub, u32 sector, u32 size, u32 mode); - u32 (*getSubNumber)(int fd); - u32 (*getSize)(int fd, /*u16*/ u32 sub /*0=main 1+=subs*/); - void (*setPartitionError)(int fd); // set open partition as having an error - int (*flushCache)(int fd); +typedef struct { + u32 checksum; // Sum of all other words in the inode + u32 magic; // + pfs_blockinfo_t inode_block; // start block of inode + pfs_blockinfo_t next_segment; // next segment descriptor inode + pfs_blockinfo_t last_segment; // last segment descriptor inode + pfs_blockinfo_t unused; // + pfs_blockinfo_t data[114]; // + u16 mode; // file mode + u16 attr; // file attributes + u16 uid; // + u16 gid; // + pfs_datetime_t atime; // + pfs_datetime_t ctime; // + pfs_datetime_t mtime; // + u64 size; // + u32 number_blocks; // number of blocks/zones used by file + u32 number_data; // number of used entries in data array + u32 number_segdesg; // number of "indirect blocks"/next segment descriptor's + u32 subpart; // subpart of inode + u32 reserved[4]; // +} pfs_inode_t; + +typedef struct { + char *devName; + int (*transfer)(int fd, void *buffer, /*u16*/u32 sub, u32 sector, u32 size, u32 mode); + u32 (*getSubNumber)(int fd); + u32 (*getSize)(int fd, /*u16*/u32 sub/*0=main 1+=subs*/); + void (*setPartitionError)(int fd); // set open partition as having an error + int (*flushCache)(int fd); } pfs_block_device_t; -typedef struct -{ - pfs_block_device_t *blockDev; // call table for hdd(hddCallTable) - int fd; // - u32 flags; // rename to attr ones checked - u32 total_sector; // number of sectors in the filesystem - u32 zfree; // zone free - u32 sector_scale; // - u32 inode_scale; // - u32 zsize; // zone size - u32 num_subs; // number of sub partitions in the filesystem - pfs_blockinfo root_dir; // block info for root directory - pfs_blockinfo log; // block info for the log - pfs_blockinfo current_dir; // block info for current directory - u32 lastError; // 0 if no error :) - u16 uid; // - u16 gid; // - u32 free_zone[65]; // free zones in each partition (1 main + 64 possible subs) +typedef struct { + pfs_block_device_t *blockDev; // call table for hdd(hddCallTable) + int fd; // + u32 flags; // rename to attr ones checked + u32 total_sector; // number of sectors in the filesystem + u32 zfree; // zone free + u32 sector_scale; // + u32 inode_scale; // + u32 zsize; // zone size + u32 num_subs; // number of sub partitions in the filesystem + pfs_blockinfo_t root_dir; // block info for root directory + pfs_blockinfo_t log; // block info for the log + pfs_blockinfo_t current_dir; // block info for current directory + u32 lastError; // 0 if no error :) + u16 uid; // + u16 gid; // + u32 free_zone[65]; // free zones in each partition (1 main + 64 possible subs) } pfs_mount_t; -typedef struct pfs_cache_s -{ - struct pfs_cache_s *next; // - struct pfs_cache_s *prev; // - u16 flags; // - u16 nused; // - pfs_mount_t *pfsMount; // - u32 sub; // main(0)/sub(+1) partition - u32 sector; // block/sector for partition - union - { // - void *data; - pfs_inode *inode; - pfs_aentry_t *aentry; - pfs_dentry *dentry; - pfs_super_block *superblock; - u32 *bitmap; - } u; +typedef struct pfs_cache_s { + struct pfs_cache_s *next; // + struct pfs_cache_s *prev; // + u16 flags; // + u16 nused; // + pfs_mount_t *pfsMount; // + u32 sub; // main(0)/sub(+1) partition + u32 sector; // block/sector for partition + union{ // + void *data; + pfs_inode_t *inode; + pfs_aentry_t *aentry; + pfs_dentry_t *dentry; + pfs_super_block_t *superblock; + u32 *bitmap; + } u; } pfs_cache_t; typedef struct { - pfs_cache_t *inode; - u32 block_segment; // index into data array in inode structure for current zone segment - u32 block_offset; // block offset from start of current zone segment - u32 byte_offset; // byte offset into current zone + pfs_cache_t *inode; + u32 block_segment; // index into data array in inode structure for current zone segment + u32 block_offset; // block offset from start of current zone segment + u32 byte_offset; // byte offset into current zone } pfs_blockpos_t; /////////////////////////////////////////////////////////////////////////////// // Super Block functions -#define PFS_SUPER_SECTOR 8192 -#define PFS_SUPER_BACKUP_SECTOR 8193 +#define PFS_SUPER_SECTOR 8192 +#define PFS_SUPER_BACKUP_SECTOR 8193 int pfsCheckZoneSize(u32 zone_size); u32 pfsGetBitmapSizeSectors(int zoneScale, u32 partSize); u32 pfsGetBitmapSizeBlocks(int scale, u32 mainsize); int pfsFormatSub(pfs_block_device_t *blockDev, int fd, u32 sub, u32 reserved, u32 scale, u32 fragment); int pfsFormat(pfs_block_device_t *blockDev, int fd, int zonesize, int fragment); -int pfsUpdateSuperBlock(pfs_mount_t *pfsMount, pfs_super_block *superblock, u32 sub); +int pfsUpdateSuperBlock(pfs_mount_t *pfsMount, pfs_super_block_t *superblock, u32 sub); int pfsMountSuperBlock(pfs_mount_t *pfsMount); /////////////////////////////////////////////////////////////////////////////// @@ -231,12 +217,12 @@ void pfsCacheFree(pfs_cache_t *clink); void pfsCacheLink(pfs_cache_t *clink, pfs_cache_t *cnew); pfs_cache_t *pfsCacheUnLink(pfs_cache_t *clink); pfs_cache_t *pfsCacheUsedAdd(pfs_cache_t *clink); -int pfsCacheTransfer(pfs_cache_t *clink, int mode); +int pfsCacheTransfer(pfs_cache_t* clink, int mode); void pfsCacheFlushAllDirty(pfs_mount_t *pfsMount); pfs_cache_t *pfsCacheAlloc(pfs_mount_t *pfsMount, u16 sub, u32 scale, int flags, int *result); pfs_cache_t *pfsCacheGetData(pfs_mount_t *pfsMount, u16 sub, u32 scale, int flags, int *result); pfs_cache_t *pfsCacheAllocClean(int *result); -int pfsCacheIsFull(); +int pfsCacheIsFull(void); int pfsCacheInit(u32 numBuf, u32 bufSize); void pfsCacheClose(pfs_mount_t *pfsMount); void pfsCacheMarkClean(pfs_mount_t *pfsMount, u32 subpart, u32 sectorStart, u32 sectorEnd); @@ -244,24 +230,24 @@ void pfsCacheMarkClean(pfs_mount_t *pfsMount, u32 subpart, u32 sectorStart, u32 /////////////////////////////////////////////////////////////////////////////// // Bitmap functions -#define PFS_BITMAP_ALLOC 0 -#define PFS_BITMAP_FREE 1 +#define PFS_BITMAP_ALLOC 0 +#define PFS_BITMAP_FREE 1 typedef struct { - u32 chunk; - u32 index; - u32 bit; - u32 partitionChunks; - u32 partitionRemainder; + u32 chunk; + u32 index; + u32 bit; + u32 partitionChunks; + u32 partitionRemainder; } pfs_bitmapInfo_t; void pfsBitmapSetupInfo(pfs_mount_t *pfsMount, pfs_bitmapInfo_t *info, u32 subpart, u32 number); void pfsBitmapAllocFree(pfs_cache_t *clink, u32 operation, u32 subpart, u32 chunk, u32 index, u32 _bit, u32 count); -int pfsBitmapAllocateAdditionalZones(pfs_mount_t *pfsMount, pfs_blockinfo *bi, u32 count); -int pfsBitmapAllocZones(pfs_mount_t *pfsMount, pfs_blockinfo *bi, u32 amount); -int pfsBitmapSearchFreeZone(pfs_mount_t *pfsMount, pfs_blockinfo *bi, u32 max_count); -void pfsBitmapFreeBlockSegment(pfs_mount_t *pfsMount, pfs_blockinfo *bi); +int pfsBitmapAllocateAdditionalZones(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 count); +int pfsBitmapAllocZones(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 amount); +int pfsBitmapSearchFreeZone(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 max_count); +void pfsBitmapFreeBlockSegment(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi); int pfsBitmapCalcFreeZones(pfs_mount_t *pfsMount, int sub); void pfsBitmapShow(pfs_mount_t *pfsMount); void pfsBitmapFreeInodeBlocks(pfs_cache_t *clink); @@ -274,36 +260,39 @@ u32 pfsBlockSyncPos(pfs_blockpos_t *blockpos, u64 size); int pfsBlockInitPos(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u64 position); int pfsBlockExpandSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 count); int pfsBlockAllocNewSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 blocks); -pfs_blockinfo *pfsBlockGetCurrent(pfs_blockpos_t *blockpos); +pfs_blockinfo_t* pfsBlockGetCurrent(pfs_blockpos_t *blockpos); pfs_cache_t *pfsBlockGetNextSegment(pfs_cache_t *clink, int *result); pfs_cache_t *pfsBlockGetLastSegmentDescriptorInode(pfs_cache_t *clink, int *result); /////////////////////////////////////////////////////////////////////////////// // Directory-Entry (DEntry) inode functions -pfs_cache_t *pfsGetDentry(pfs_cache_t *clink, char *path, pfs_dentry **dentry, u32 *size, int option); -int pfsGetNextDentry(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 *position, char *name, pfs_blockinfo *bi); -pfs_cache_t *pfsFillDentry(pfs_cache_t *clink, pfs_dentry *dentry, char *path1, pfs_blockinfo *bi, u32 len, u16 mode); -pfs_cache_t *pfsDirAddEntry(pfs_cache_t *dir, char *filename, pfs_blockinfo *bi, u16 mode, int *result); +pfs_cache_t *pfsGetDentry(pfs_cache_t *clink, char *path, pfs_dentry_t **dentry, u32 *size, int option); +int pfsGetNextDentry(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 *position, char *name, pfs_blockinfo_t *bi); +pfs_cache_t *pfsFillDentry(pfs_cache_t *clink, pfs_dentry_t *dentry, char *path1, pfs_blockinfo_t *bi, u32 len, u16 mode); +pfs_cache_t *pfsDirAddEntry(pfs_cache_t *dir, char *filename, pfs_blockinfo_t *bi, u16 mode, int *result); pfs_cache_t *pfsDirRemoveEntry(pfs_cache_t *clink, char *path); int pfsCheckDirForFiles(pfs_cache_t *clink); -void pfsFillSelfAndParentDentries(pfs_cache_t *clink, pfs_blockinfo *self, pfs_blockinfo *parent); -pfs_cache_t *pfsSetDentryParent(pfs_cache_t *clink, pfs_blockinfo *bi, int *result); +void pfsFillSelfAndParentDentries(pfs_cache_t *clink, pfs_blockinfo_t *self, pfs_blockinfo_t *parent); +pfs_cache_t* pfsSetDentryParent(pfs_cache_t *clink, pfs_blockinfo_t *bi, int *result); pfs_cache_t *pfsInodeGetFileInDir(pfs_cache_t *dirInode, char *path, int *result); pfs_cache_t *pfsInodeGetFile(pfs_mount_t *pfsMount, pfs_cache_t *clink, const char *name, int *result); -void pfsInodeFill(pfs_cache_t *ci, pfs_blockinfo *bi, u16 mode, u16 uid, u16 gid); +void pfsInodeFill(pfs_cache_t *ci, pfs_blockinfo_t *bi, u16 mode, u16 uid, u16 gid); int pfsInodeRemove(pfs_cache_t *parent, pfs_cache_t *inode, char *path); pfs_cache_t *pfsInodeGetParent(pfs_mount_t *pfsMount, pfs_cache_t *clink, const char *filename, char *path, int *result); pfs_cache_t *pfsInodeCreate(pfs_cache_t *clink, u16 mode, u16 uid, u16 gid, int *result); int pfsCheckAccess(pfs_cache_t *clink, int flags); -char *pfsSplitPath(char *filename, char *path, int *result); +char* pfsSplitPath(char *filename, char *path, int *result); u16 pfsGetMaxIndex(pfs_mount_t *pfsMount); +int pfsAllocZones(pfs_cache_t *clink, int msize, int mode); +void pfsFreeZones(pfs_cache_t *pfree); + /////////////////////////////////////////////////////////////////////////////// // Inode functions -void pfsInodePrint(pfs_inode *inode); -int pfsInodeCheckSum(pfs_inode *inode); +void pfsInodePrint(pfs_inode_t *inode); +int pfsInodeCheckSum(pfs_inode_t *inode); void pfsInodeSetTime(pfs_cache_t *clink); pfs_cache_t *pfsInodeGetData(pfs_mount_t *pfsMount, u16 sub, u32 inode, int *result); int pfsInodeSync(pfs_blockpos_t *blockpos, u64 size, u32 used_segments); @@ -323,22 +312,15 @@ int pfsJournalResetThis(pfs_block_device_t *blockDev, int fd, u32 sector); /////////////////////////////////////////////////////////////////////////////// // Function declerations -int pfsFsckStat(pfs_mount_t *pfsMount, pfs_super_block *superblock, u32 stat, int mode); +int pfsFsckStat(pfs_mount_t *pfsMount, pfs_super_block_t *superblock, u32 stat, int mode); void *pfsAllocMem(int size); void pfsFreeMem(void *buffer); -int pfsGetTime(pfs_datetime *tm); -void pfsPrintBitmap(u32 *bitmap); +int pfsGetTime(pfs_datetime_t *tm); +void pfsPrintBitmap(const u32 *bitmap); pfs_block_device_t *pfsGetBlockDeviceTable(const char *name); int pfsGetScale(int num, int size); u32 pfsFixIndex(u32 index); -int pfsHddTransfer(int fd, void *buffer, u32 sub /*0=main 1+=subs*/, u32 sector, - u32 size /* in sectors*/, u32 mode); -u32 pfsHddGetSubCount(int fd); -u32 pfsHddGetPartSize(int fd, u32 sub /*0=main 1+=subs*/); -void pfsHddSetPartError(int fd); -int pfsHddFlushCache(int fd); - #endif /* _LIBPFS_H */ diff --git a/modules/hdd/libpfs/src/bitmap.c b/modules/hdd/libpfs/src/bitmap.c index 6efff05e5..6e8e6f7e6 100644 --- a/modules/hdd/libpfs/src/bitmap.c +++ b/modules/hdd/libpfs/src/bitmap.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS bitmap manipulation routines */ @@ -24,334 +23,359 @@ u32 pfsBitsPerBitmapChunk = 8192; // number of bitmap bits in each bitmap data c void pfsBitmapSetupInfo(pfs_mount_t *pfsMount, pfs_bitmapInfo_t *info, u32 subpart, u32 number) { - u32 size; + u32 size; - size = pfsMount->blockDev->getSize(pfsMount->fd, subpart) >> pfsMount->sector_scale; + size = pfsMount->blockDev->getSize(pfsMount->fd, subpart) >> pfsMount->sector_scale; - info->chunk = number / pfsBitsPerBitmapChunk; - info->bit = number & 31; - info->index = (number % pfsBitsPerBitmapChunk) / 32; - info->partitionChunks = size / pfsBitsPerBitmapChunk; - info->partitionRemainder = size % pfsBitsPerBitmapChunk; + info->chunk = number / pfsBitsPerBitmapChunk; + info->bit = number & 31; + info->index = (number % pfsBitsPerBitmapChunk) / 32; + info->partitionChunks = size / pfsBitsPerBitmapChunk; + info->partitionRemainder = size % pfsBitsPerBitmapChunk; } // Allocates or frees (depending on operation) the bitmap area starting at chunk/index/bit, of size count void pfsBitmapAllocFree(pfs_cache_t *clink, u32 operation, u32 subpart, u32 chunk, u32 index, u32 _bit, u32 count) { - int result; - u32 sector, bit; - - while (clink) { - for (; index < (pfsMetaSize / 4) && count; index++, _bit = 0) { - for (bit = _bit; bit < 32 && count; bit++, count--) { - if (operation == PFS_BITMAP_ALLOC) { - if (clink->u.bitmap[index] & (1 << bit)) - PFS_PRINTF(PFS_DRV_NAME ": Error: Tried to allocate used block!\n"); - - clink->u.bitmap[index] |= (1 << bit); - } else { - if ((clink->u.bitmap[index] & (1 << bit)) == 0) - PFS_PRINTF(PFS_DRV_NAME ": Error: Tried to free unused block!\n"); - - clink->u.bitmap[index] &= ~(1 << bit); - } - } - } - - index = 0; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(clink); - - if (count == 0) - break; - - chunk++; - - sector = (1 << clink->pfsMount->inode_scale) + chunk; - if (subpart == 0) - sector += 0x2000 >> pfsBlockSize; - - clink = pfsCacheGetData(clink->pfsMount, subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - } + int result; + u32 sector, bit; + + while (clink) + { + for ( ; index < (pfsMetaSize / 4) && count; index++, _bit = 0) + { + for (bit = _bit; bit < 32 && count; bit++, count--) + { + if(operation == PFS_BITMAP_ALLOC) + { + if (clink->u.bitmap[index] & (1 << bit)) + PFS_PRINTF(PFS_DRV_NAME": Error: Tried to allocate used block!\n"); + + clink->u.bitmap[index] |= (1 << bit); + } + else + { + if ((clink->u.bitmap[index] & (1 << bit))==0) + PFS_PRINTF(PFS_DRV_NAME": Error: Tried to free unused block!\n"); + + clink->u.bitmap[index] &= ~(1 << bit); + } + } + } + + index = 0; + clink->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(clink); + + if (count==0) + break; + + chunk++; + + sector = (1 << clink->pfsMount->inode_scale) + chunk; + if(subpart==0) + sector += 0x2000 >> pfsBlockSize; + + clink = pfsCacheGetData(clink->pfsMount, subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); + } } // Attempts to allocate 'count' more continuous zones for 'bi' -int pfsBitmapAllocateAdditionalZones(pfs_mount_t *pfsMount, pfs_blockinfo *bi, u32 count) +int pfsBitmapAllocateAdditionalZones(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 count) { - int result; - pfs_bitmapInfo_t info; - pfs_cache_t *c; - int res = 0; - - pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number + bi->count); - - // Make sure we're not trying to allocate more than is possible - if (65535 - bi->count < count) - count = 65535 - bi->count; - - // Loop over each bitmap chunk (each is 1024 bytes in size) until either we have allocated - // the requested amount of blocks, or until we have run out of space on the current partition - while ((((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks)) || - ((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1))) && - count) { - u32 sector = (1 << pfsMount->inode_scale) + info.chunk; - - // if main partition, add offset (in units of blocks) - if (bi->subpart == 0) - sector += 0x2000 >> pfsBlockSize; - - // Read the bitmap chunk from the hdd - c = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - if (c == 0) - break; - - // Loop over each 32-bit word in the current bitmap chunk until - // we find a used zone or we've allocated all the zones we need - while ((info.index < (info.chunk == info.partitionChunks ? info.partitionRemainder / 32 : pfsMetaSize / 4)) && count) { - // Loop over each of the 32 bits in the current word from the current bitmap chunk, - // trying to allocate the requested number of zones - for (; (info.bit < 32) && count; count--) { - // We only want to allocate a continuous area, so if we come - // accross a used zone bail - if (c->u.bitmap[info.index] & (1 << info.bit)) { - pfsCacheFree(c); - goto exit; - } - - // If the current bit in the bitmap is marked as free, mark it was used - res++; - c->u.bitmap[info.index] |= 1 << info.bit; - info.bit++; - c->flags |= PFS_CACHE_FLAG_DIRTY; - } - - info.index++; - info.bit = 0; - } - pfsCacheFree(c); - info.index = 0; - info.chunk++; - } + int result; + pfs_bitmapInfo_t info; + pfs_cache_t *c; + int res=0; + + pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number+bi->count); + + // Make sure we're not trying to allocate more than is possible + if (65535-bi->count < count) + count=65535-bi->count; + + // Loop over each bitmap chunk (each is 1024 bytes in size) until either we have allocated + // the requested amount of blocks, or until we have run out of space on the current partition + while ((((info.partitionRemainder==0) && (info.chunk < info.partitionChunks )) || + ((info.partitionRemainder!=0) && (info.chunk < info.partitionChunks+1))) && count) + { + u32 sector=(1<inode_scale) + info.chunk; + + // if main partition, add offset (in units of blocks) + if (bi->subpart==0) + sector += 0x2000 >> pfsBlockSize; + + // Read the bitmap chunk from the hdd + c=pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); + if (c==0)break; + + // Loop over each 32-bit word in the current bitmap chunk until + // we find a used zone or we've allocated all the zones we need + while ((info.index < (info.chunk==info.partitionChunks ? info.partitionRemainder / 32 : pfsMetaSize / 4)) && count) + { + // Loop over each of the 32 bits in the current word from the current bitmap chunk, + // trying to allocate the requested number of zones + for ( ; (info.bit < 32) && count; count--) + { + // We only want to allocate a continuous area, so if we come + // accross a used zone bail + if (c->u.bitmap[info.index] & (1<u.bitmap[info.index] |= 1<flags |= PFS_CACHE_FLAG_DIRTY; + } + + info.index++; + info.bit=0; + } + pfsCacheFree(c); + info.index=0; + info.chunk++; + } exit: - // Adjust global free zone counts - pfsMount->free_zone[bi->subpart] -= res; - pfsMount->zfree -= res; - return res; + // Adjust global free zone counts + pfsMount->free_zone[bi->subpart]-=res; + pfsMount->zfree-=res; + return res; } // Searches for 'amount' free zones, starting from the position specified in 'bi'. // Returns 1 if allocation was successful, otherwise 0. -int pfsBitmapAllocZones(pfs_mount_t *pfsMount, pfs_blockinfo *bi, u32 amount) +int pfsBitmapAllocZones(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 amount) { - pfs_bitmapInfo_t info; - int result; - u32 startBit = 0, startPos = 0, startChunk = 0, count = 0; - u32 sector; - pfs_cache_t *bitmap; - u32 *bitmapEnd, *bitmapWord; - u32 i; - - pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number); - - for (; ((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks)) || - ((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1)); - info.chunk++) { - - sector = info.chunk + (1 << pfsMount->inode_scale); - if (bi->subpart == 0) - sector += 0x2000 >> pfsBlockSize; - - // read in the bitmap chunk - bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - if (bitmap == 0) - return 0; - - bitmapEnd = bitmap->u.bitmap + - (info.chunk == info.partitionChunks ? info.partitionRemainder / 32 : pfsMetaSize / 4); - - for (bitmapWord = bitmap->u.bitmap + info.index; bitmapWord < bitmapEnd; info.bit = 0, bitmapWord++) { - for (i = info.bit; i < 32; i++) { - // if this bit is marked as free.. - if (((*bitmapWord >> i) & 1) == 0) { - if (count == 0) { - startBit = i; - startChunk = info.chunk; - startPos = bitmapWord - bitmap->u.bitmap; - } - if (++count == amount) { - bi->number = (startPos * 32) + (startChunk * pfsBitsPerBitmapChunk) + startBit; - if (count < bi->count) - bi->count = count; - - if (bitmap->sector != (startChunk + (1 << pfsMount->inode_scale))) { - pfsCacheFree(bitmap); - sector = (1 << pfsMount->inode_scale) + startChunk; - if (bi->subpart == 0) - sector += 0x2000 >> pfsBlockSize; - - bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - } - - pfsBitmapAllocFree(bitmap, PFS_BITMAP_ALLOC, bi->subpart, startChunk, startPos, startBit, bi->count); - return 1; - } - } else - count = 0; - } - } - pfsCacheFree(bitmap); - info.index = 0; - } - return 0; + pfs_bitmapInfo_t info; + int result; + u32 startBit = 0, startPos = 0, startChunk = 0, count = 0; + u32 sector; + pfs_cache_t *bitmap; + u32 *bitmapEnd, *bitmapWord; + u32 i; + + pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number); + + for ( ; ((info.partitionRemainder==0) && (info.chunk < info.partitionChunks))|| + ((info.partitionRemainder!=0) && (info.chunk < info.partitionChunks+1)); info.chunk++){ + + sector = info.chunk + (1 << pfsMount->inode_scale); + if(bi->subpart==0) + sector += 0x2000 >> pfsBlockSize; + + // read in the bitmap chunk + bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); + if(bitmap==0) + return 0; + + bitmapEnd=bitmap->u.bitmap + + (info.chunk == info.partitionChunks ? info.partitionRemainder / 32 : pfsMetaSize / 4); + + for (bitmapWord=bitmap->u.bitmap + info.index; bitmapWord < bitmapEnd; info.bit=0, bitmapWord++) + { + for (i=info.bit; i < 32; i++) + { + // if this bit is marked as free.. + if (((*bitmapWord >> i) & 1)==0) + { + if (count==0) + { + startBit = i; + startChunk = info.chunk; + startPos = bitmapWord - bitmap->u.bitmap; + } + if (++count == amount) + { + bi->number = (startPos * 32) + (startChunk * pfsBitsPerBitmapChunk) + startBit; + if (count < bi->count) + bi->count=count; + + if (bitmap->sector != (startChunk + (1 << pfsMount->inode_scale))) + { + pfsCacheFree(bitmap); + sector = (1 << pfsMount->inode_scale) + startChunk; + if(bi->subpart==0) + sector += 0x2000 >> pfsBlockSize; + + bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); + } + + pfsBitmapAllocFree(bitmap, PFS_BITMAP_ALLOC, bi->subpart, startChunk, startPos, startBit, bi->count); + return 1; + } + } + else + count=0; + } + } + pfsCacheFree(bitmap); + info.index=0; + } + return 0; } // Searches for 'max_count' free zones over all the partitions, and // allocates them. Returns 0 on success, -ENOSPC if the zones could // not be allocated. -int pfsBitmapSearchFreeZone(pfs_mount_t *pfsMount, pfs_blockinfo *bi, u32 max_count) +int pfsBitmapSearchFreeZone(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 max_count) { - u32 num, count, n; - - num = pfsMount->num_subs + 1; - - if (bi->subpart > pfsMount->num_subs) - bi->subpart = 0; - if (bi->number) - num = pfsMount->num_subs + 2; - - count = max_count < 33 ? max_count : 32; //min(max_count, 32) - count = count < bi->count ? bi->count : count; //max(count, bi->count) - // => count = bound(bi->count, 32); - for (; num >= 0; num--) { - for (n = count; n; n /= 2) { - if ((pfsMount->free_zone[bi->subpart] >= n) && - pfsBitmapAllocZones(pfsMount, bi, n)) { - pfsMount->free_zone[bi->subpart] -= bi->count; - pfsMount->zfree -= bi->count; - return 0; // the good exit ;) - } - } - - bi->number = 0; - bi->subpart++; - - if (bi->subpart == pfsMount->num_subs + 1) - bi->subpart = 0; - } - return -ENOSPC; + u32 num, count, n; + + num = pfsMount->num_subs + 1; + + if (bi->subpart > pfsMount->num_subs) + bi->subpart = 0; + if (bi->number) + num = pfsMount->num_subs + 2; + + count = max_count < 33 ? max_count : 32; //min(max_count, 32) + count = count < bi->count ? bi->count : count; //max(count, bi->count) + // => count = bound(bi->count, 32); + for(; num >= 0; num--) + { + for (n = count; n; n /= 2) + { + if ((pfsMount->free_zone[bi->subpart] >= n) && + pfsBitmapAllocZones(pfsMount, bi, n)) + { + pfsMount->free_zone[bi->subpart] -= bi->count; + pfsMount->zfree -= bi->count; + return 0; // the good exit ;) + } + } + + bi->number=0; + bi->subpart++; + + if(bi->subpart == pfsMount->num_subs + 1) + bi->subpart=0; + } + return -ENOSPC; } // De-allocates the block segment 'bi' in the bitmaps -void pfsBitmapFreeBlockSegment(pfs_mount_t *pfsMount, pfs_blockinfo *bi) +void pfsBitmapFreeBlockSegment(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi) { - pfs_bitmapInfo_t info; - pfs_cache_t *clink; - u32 sector; - int rv; - - pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number); - - sector = (1 << pfsMount->inode_scale) + info.chunk; - if (bi->subpart == 0) - sector += 0x2000 >> pfsBlockSize; - - if ((clink = pfsCacheGetData(pfsMount, (u16)bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &rv)) != NULL) { - pfsBitmapAllocFree(clink, PFS_BITMAP_FREE, bi->subpart, info.chunk, info.index, info.bit, bi->count); - pfsMount->free_zone[(u16)bi->subpart] += bi->count; - pfsMount->zfree += bi->count; - } + pfs_bitmapInfo_t info; + pfs_cache_t *clink; + u32 sector; + int rv; + + pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number); + + sector = (1 << pfsMount->inode_scale) + info.chunk; + if(bi->subpart==0) + sector += 0x2000 >> pfsBlockSize; + + if((clink=pfsCacheGetData(pfsMount, (u16)bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &rv)) != NULL) + { + pfsBitmapAllocFree(clink, PFS_BITMAP_FREE, bi->subpart, info.chunk, info.index, info.bit, bi->count); + pfsMount->free_zone[(u16)bi->subpart]+=bi->count; + pfsMount->zfree+=bi->count; + } } // Returns the number of free zones for the partition 'sub' int pfsBitmapCalcFreeZones(pfs_mount_t *pfsMount, int sub) { - // "Free zone" map. Used to get number of free zone in bitmap, 4-bits at a time - u32 pfsFreeZoneBitmap[16] = {4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; - int result; - pfs_bitmapInfo_t info; - pfs_cache_t *clink; - u32 i, bitmapSize, zoneFree = 0, sector; - - pfsBitmapSetupInfo(pfsMount, &info, sub, 0); - - while (((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1)) || - ((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks))) { - bitmapSize = info.chunk == info.partitionChunks ? info.partitionRemainder >> 3 : pfsMetaSize; - - sector = (1 << pfsMount->inode_scale) + info.chunk; - if (sub == 0) - sector += 0x2000 >> pfsBlockSize; - - if ((clink = pfsCacheGetData(pfsMount, sub, sector, PFS_CACHE_FLAG_BITMAP, &result))) { - for (i = 0; i < bitmapSize; i++) { - zoneFree += pfsFreeZoneBitmap[((u8 *)clink->u.bitmap)[i] & 0xF] + pfsFreeZoneBitmap[((u8 *)clink->u.bitmap)[i] >> 4]; - } - - pfsCacheFree(clink); - } - info.chunk++; - } - - return zoneFree; + // "Free zone" map. Used to get number of free zone in bitmap, 4-bits at a time + u32 pfsFreeZoneBitmap[16]={4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; + int result; + pfs_bitmapInfo_t info; + pfs_cache_t *clink; + u32 i, bitmapSize, zoneFree=0, sector; + + pfsBitmapSetupInfo(pfsMount, &info, sub, 0); + + while (((info.partitionRemainder!=0) && (info.chunk>3 : pfsMetaSize; + + sector = (1<inode_scale) + info.chunk; + if (sub==0) + sector +=0x2000>>pfsBlockSize; + + if ((clink=pfsCacheGetData(pfsMount, sub, sector, PFS_CACHE_FLAG_BITMAP, &result))) + { + for (i=0; iu.bitmap)[i] & 0xF] + +pfsFreeZoneBitmap[((u8*)clink->u.bitmap)[i] >> 4]; + } + + pfsCacheFree(clink); + } + info.chunk++; + } + + return zoneFree; } // Debugging function, prints bitmap information void pfsBitmapShow(pfs_mount_t *pfsMount) { - int result; - pfs_bitmapInfo_t info; - u32 pn, bitcnt; - - for (pn = 0; pn < pfsMount->num_subs + 1; pn++) { - bitcnt = pfsBitsPerBitmapChunk; - pfsBitmapSetupInfo(pfsMount, &info, pn, 0); - - while (((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1)) || - ((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks))) { - pfs_cache_t *clink; - u32 sector = (1 << pfsMount->inode_scale) + info.chunk; - u32 i; - - if (pn == 0) - sector += 0x2000 >> pfsBlockSize; - clink = pfsCacheGetData(pfsMount, pn, sector, PFS_CACHE_FLAG_BITMAP, &result); - - if (info.chunk == info.partitionChunks) - bitcnt = info.partitionRemainder; - - PFS_PRINTF(PFS_DRV_NAME ": Zone show: pn %ld, bn %ld, bitcnt %ld\n", pn, info.chunk, bitcnt); - - for (i = 0; (i < (1 << pfsBlockSize)) && ((i * 512) < (bitcnt / 8)); i++) - pfsPrintBitmap(clink->u.bitmap + 128 * i); - - pfsCacheFree(clink); - info.chunk++; - } - } + int result; + pfs_bitmapInfo_t info; + u32 pn, bitcnt; + + for (pn=0; pn < pfsMount->num_subs+1; pn++) + { + bitcnt=pfsBitsPerBitmapChunk; + pfsBitmapSetupInfo(pfsMount, &info, pn, 0); + + while (((info.partitionRemainder!=0) && (info.chunkinode_scale) + info.chunk; + u32 i; + + if(pn==0) + sector += 0x2000 >> pfsBlockSize; + clink=pfsCacheGetData(pfsMount, pn, sector, PFS_CACHE_FLAG_BITMAP, &result); + + if (info.chunk == info.partitionChunks) + bitcnt=info.partitionRemainder; + + PFS_PRINTF(PFS_DRV_NAME": Zone show: pn %ld, bn %ld, bitcnt %ld\n", pn, info.chunk, bitcnt); + + for(i=0; (i < (1<u.bitmap+128*i); + + pfsCacheFree(clink); + info.chunk++; + } + } } // Free's all blocks allocated to an inode void pfsBitmapFreeInodeBlocks(pfs_cache_t *clink) { - pfs_mount_t *pfsMount = clink->pfsMount; - u32 i; - - pfsCacheUsedAdd(clink); - for (i = 0; i < clink->u.inode->number_data; i++) { - u32 index = pfsFixIndex(i); - pfs_blockinfo *bi = &clink->u.inode->data[index]; - int err; - - if (i != 0) { - if (index == 0) - if ((clink = pfsBlockGetNextSegment(clink, &err)) == NULL) - return; - } - - pfsBitmapFreeBlockSegment(pfsMount, bi); - pfsCacheMarkClean(pfsMount, (u16)bi->subpart, bi->number << pfsMount->inode_scale, - (bi->number + bi->count) << pfsMount->inode_scale); - } - pfsCacheFree(clink); + pfs_mount_t *pfsMount=clink->pfsMount; + u32 i; + + pfsCacheUsedAdd(clink); + for(i=0;i < clink->u.inode->number_data; i++) + { + u32 index = pfsFixIndex(i); + pfs_blockinfo_t *bi=&clink->u.inode->data[index]; + int err; + + if(i!=0) { + if(index==0) + if((clink = pfsBlockGetNextSegment(clink, &err))==NULL) + return; + } + + pfsBitmapFreeBlockSegment(pfsMount, bi); + pfsCacheMarkClean(pfsMount, (u16)bi->subpart, bi->number << pfsMount->inode_scale, + (bi->number + bi->count) << pfsMount->inode_scale); + } + pfsCacheFree(clink); } diff --git a/modules/hdd/libpfs/src/block.c b/modules/hdd/libpfs/src/block.c index 874c56be8..c67e6c8f5 100644 --- a/modules/hdd/libpfs/src/block.c +++ b/modules/hdd/libpfs/src/block.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS block/zone related routines */ @@ -21,72 +20,76 @@ // Returns the next block descriptor inode pfs_cache_t *pfsBlockGetNextSegment(pfs_cache_t *clink, int *result) { - pfsCacheFree(clink); + pfsCacheFree(clink); - if (clink->u.inode->next_segment.number) - return pfsCacheGetData(clink->pfsMount, - clink->u.inode->next_segment.subpart, - clink->u.inode->next_segment.number << clink->pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGI, result); + if (clink->u.inode->next_segment.number) + return pfsCacheGetData(clink->pfsMount, + clink->u.inode->next_segment.subpart, + clink->u.inode->next_segment.number << clink->pfsMount->inode_scale, + PFS_CACHE_FLAG_SEGI, result); - PFS_PRINTF(PFS_DRV_NAME ": Error: There is no next segment descriptor\n"); - *result = -EINVAL; - return NULL; + PFS_PRINTF(PFS_DRV_NAME": Error: There is no next segment descriptor\n"); + *result=-EINVAL; + return NULL; } // Sets 'blockpos' to point to the next block segment for the inode (and moves onto the // next block descriptor inode if necessary) int pfsBlockSeekNextSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos) { - pfs_cache_t *nextSegment; - int result = 0; + pfs_cache_t *nextSegment; + int result=0; - if (blockpos->byte_offset) { - PFS_PRINTF(PFS_DRV_NAME ": Panic: This is a bug!\n"); - return -1; - } + if (blockpos->byte_offset) + { + PFS_PRINTF(PFS_DRV_NAME": Panic: This is a bug!\n"); + return -1; + } - // If we're at the end of the block descriptor array for the current - // inode, then move onto the next inode - if (pfsFixIndex(blockpos->block_segment + 1) == 0) { - if ((nextSegment = pfsBlockGetNextSegment(pfsCacheUsedAdd(blockpos->inode), &result)) == NULL) - return result; - pfsCacheFree(blockpos->inode); - blockpos->inode = nextSegment; - if (clink->u.inode->number_data - 1 == ++blockpos->block_segment) - return -EINVAL; - } + // If we're at the end of the block descriptor array for the current + // inode, then move onto the next inode + if (pfsFixIndex(blockpos->block_segment+1)==0) + { + if ((nextSegment=pfsBlockGetNextSegment(pfsCacheUsedAdd(blockpos->inode), &result)) == NULL) + return result; + pfsCacheFree(blockpos->inode); + blockpos->inode=nextSegment; + if (clink->u.inode->number_data-1 == ++blockpos->block_segment) + return -EINVAL; + } - blockpos->block_offset = 0; - blockpos->block_segment++; - return result; + blockpos->block_offset=0; + blockpos->block_segment++; + return result; } u32 pfsBlockSyncPos(pfs_blockpos_t *blockpos, u64 size) { - u32 i; + u32 i; - i = (u32)(size / blockpos->inode->pfsMount->zsize); - blockpos->byte_offset += size % blockpos->inode->pfsMount->zsize; + i = (u32)(size / blockpos->inode->pfsMount->zsize); + blockpos->byte_offset += size % blockpos->inode->pfsMount->zsize; - if (blockpos->byte_offset >= blockpos->inode->pfsMount->zsize) { - blockpos->byte_offset -= blockpos->inode->pfsMount->zsize; - i++; - } - return i; + if (blockpos->byte_offset >= blockpos->inode->pfsMount->zsize) + { + blockpos->byte_offset -= blockpos->inode->pfsMount->zsize; + i++; + } + return i; } int pfsBlockInitPos(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u64 position) { - blockpos->inode = pfsCacheUsedAdd(clink); - blockpos->byte_offset = 0; + blockpos->inode=pfsCacheUsedAdd(clink); + blockpos->byte_offset=0; - if (clink->u.inode->size) { - blockpos->block_segment = 1; - blockpos->block_offset = 0; - } else { - blockpos->block_segment = 0; - blockpos->block_offset = 1; - } - return pfsInodeSync(blockpos, position, clink->u.inode->number_data); + if (clink->u.inode->size) + { + blockpos->block_segment=1; + blockpos->block_offset=0; + }else{ + blockpos->block_segment=0; + blockpos->block_offset=1; + } + return pfsInodeSync(blockpos, position, clink->u.inode->number_data); } diff --git a/modules/hdd/libpfs/src/blockWrite.c b/modules/hdd/libpfs/src/blockWrite.c index 6e2a663a5..d31c3a4b2 100644 --- a/modules/hdd/libpfs/src/blockWrite.c +++ b/modules/hdd/libpfs/src/blockWrite.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS block/zone (write) related routines */ @@ -21,122 +20,123 @@ // Attempt to expand the block segment 'blockpos' by 'count' blocks int pfsBlockExpandSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 count) { - int ret; - pfs_blockinfo *bi; + int ret; + pfs_blockinfo_t *bi; - if (pfsFixIndex(blockpos->block_segment) == 0) - return 0; + if(pfsFixIndex(blockpos->block_segment)==0) + return 0; - bi = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; + bi = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; - if ((ret = pfsBitmapAllocateAdditionalZones(clink->pfsMount, bi, count))) { - bi->count += ret; - clink->u.inode->number_blocks += ret; - blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - } + if ((ret = pfsBitmapAllocateAdditionalZones(clink->pfsMount, bi, count))) + { + bi->count+=ret; + clink->u.inode->number_blocks+=ret; + blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; + clink->flags |= PFS_CACHE_FLAG_DIRTY; + } - return ret; + return ret; } // Attempts to allocate 'blocks' new blocks for an inode int pfsBlockAllocNewSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 blocks) { - pfs_blockinfo bi, *bi2; - int result = 0; - pfs_mount_t *pfsMount = clink->pfsMount; - u32 i, old_blocks = blocks; - - if (pfsCacheIsFull()) - return -ENOMEM; - - // create "indirect segment descriptor" if necessary - if (pfsFixIndex(clink->u.inode->number_data) == 0) { - pfs_cache_t *clink2; - - bi2 = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; - bi.subpart = bi2->subpart; - bi.count = 1; - bi.number = bi2->number + bi2->count; - result = pfsBitmapSearchFreeZone(pfsMount, &bi, clink->u.inode->number_blocks); - if (result < 0) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Couldnt allocate zone! (1)\n"); - return result; - } - - clink2 = pfsCacheGetData(pfsMount, bi.subpart, bi.number << pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGI | PFS_CACHE_FLAG_NOLOAD, &result); - memset(clink2->u.inode, 0, sizeof(pfs_inode)); - clink2->u.inode->magic = PFS_SEGI_MAGIC; - - memcpy(&clink2->u.inode->inode_block, &clink->u.inode->inode_block, sizeof(pfs_blockinfo)); - memcpy(&clink2->u.inode->last_segment, &blockpos->inode->u.inode->data[0], sizeof(pfs_blockinfo)); - memcpy(&clink2->u.inode->data[0], &bi, sizeof(pfs_blockinfo)); - - clink2->flags |= PFS_CACHE_FLAG_DIRTY; - - clink->u.inode->number_blocks += bi.count; - clink->u.inode->number_data++; - - memcpy(&clink->u.inode->last_segment, &bi, sizeof(pfs_blockinfo)); - - clink->u.inode->number_segdesg++; - - clink->flags |= PFS_CACHE_FLAG_DIRTY; - blockpos->block_segment++; - blockpos->block_offset = 0; - - memcpy(&blockpos->inode->u.inode->next_segment, &bi, sizeof(pfs_blockinfo)); - - blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(blockpos->inode); - blockpos->inode = clink2; - } - - bi2 = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; - bi.subpart = bi2->subpart; - bi.count = blocks; - bi.number = bi2->number + bi2->count; - - result = pfsBitmapSearchFreeZone(pfsMount, &bi, clink->u.inode->number_blocks); - if (result < 0) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Couldnt allocate zone! (2)\n"); - return result; - } - - clink->u.inode->number_blocks += bi.count; - clink->u.inode->number_data++; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - blockpos->block_offset = 0; - blockpos->block_segment++; - - i = pfsFixIndex(clink->u.inode->number_data - 1); - memcpy(&blockpos->inode->u.inode->data[i], &bi, sizeof(pfs_blockinfo)); - - blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; - blocks -= bi.count; - if (blocks) - blocks -= pfsBlockExpandSegment(clink, blockpos, blocks); - - return old_blocks - blocks; + pfs_blockinfo_t bi, *bi2; + int result=0; + pfs_mount_t *pfsMount=clink->pfsMount; + u32 i, old_blocks = blocks; + + if (pfsCacheIsFull()) + return -ENOMEM; + + // create "indirect segment descriptor" if necessary + if (pfsFixIndex(clink->u.inode->number_data) == 0) + { + pfs_cache_t *clink2; + + bi2 = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; + bi.subpart=bi2->subpart; + bi.count=1; + bi.number=bi2->number+bi2->count; + result=pfsBitmapSearchFreeZone(pfsMount, &bi, clink->u.inode->number_blocks); + if (result<0) + { + PFS_PRINTF(PFS_DRV_NAME": Error: Couldnt allocate zone! (1)\n"); + return result; + } + + clink2=pfsCacheGetData(pfsMount, bi.subpart, bi.number << pfsMount->inode_scale, + PFS_CACHE_FLAG_SEGI | PFS_CACHE_FLAG_NOLOAD, &result); + memset(clink2->u.inode, 0, sizeof(pfs_inode_t)); + clink2->u.inode->magic=PFS_SEGI_MAGIC; + + memcpy(&clink2->u.inode->inode_block, &clink->u.inode->inode_block, sizeof(pfs_blockinfo_t)); + memcpy(&clink2->u.inode->last_segment, blockpos->inode->u.inode->data, sizeof(pfs_blockinfo_t)); + memcpy(clink2->u.inode->data, &bi, sizeof(pfs_blockinfo_t)); + + clink2->flags |= PFS_CACHE_FLAG_DIRTY; + + clink->u.inode->number_blocks+=bi.count; + clink->u.inode->number_data++; + + memcpy(&clink->u.inode->last_segment, &bi, sizeof(pfs_blockinfo_t)); + + clink->u.inode->number_segdesg++; + + clink->flags |= PFS_CACHE_FLAG_DIRTY; + blockpos->block_segment++; + blockpos->block_offset=0; + + memcpy(&blockpos->inode->u.inode->next_segment, &bi, sizeof(pfs_blockinfo_t)); + + blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(blockpos->inode); + blockpos->inode=clink2; + } + + bi2 = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; + bi.subpart = bi2->subpart; + bi.count = blocks; + bi.number = bi2->number + bi2->count; + + result = pfsBitmapSearchFreeZone(pfsMount, &bi, clink->u.inode->number_blocks); + if(result < 0) + { + PFS_PRINTF(PFS_DRV_NAME": Error: Couldnt allocate zone! (2)\n"); + return result; + } + + clink->u.inode->number_blocks += bi.count; + clink->u.inode->number_data++; + clink->flags |= PFS_CACHE_FLAG_DIRTY; + blockpos->block_offset=0; + blockpos->block_segment++; + + i = pfsFixIndex(clink->u.inode->number_data-1); + memcpy(&blockpos->inode->u.inode->data[i], &bi, sizeof(pfs_blockinfo_t)); + + blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; + blocks -= bi.count; + if (blocks) + blocks -= pfsBlockExpandSegment(clink, blockpos, blocks); + + return old_blocks - blocks; } // Returns the block info for the block segment corresponding to the // files current position. -pfs_blockinfo *pfsBlockGetCurrent(pfs_blockpos_t *blockpos) +pfs_blockinfo_t* pfsBlockGetCurrent(pfs_blockpos_t *blockpos) { - return &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; + return &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; } pfs_cache_t *pfsBlockGetLastSegmentDescriptorInode(pfs_cache_t *clink, int *result) { - return pfsCacheGetData(clink->pfsMount, clink->u.inode->last_segment.subpart, - clink->u.inode->last_segment.number << clink->pfsMount->inode_scale, - (clink->u.inode->last_segment.subpart == - clink->u.inode->inode_block.subpart) && - (clink->u.inode->last_segment.number == - clink->u.inode->inode_block.number) ? - 16 : - 32, - result); + return pfsCacheGetData(clink->pfsMount, clink->u.inode->last_segment.subpart, + clink->u.inode->last_segment.number<pfsMount->inode_scale, + (clink->u.inode->last_segment.subpart== + clink->u.inode->inode_block.subpart)&& + (clink->u.inode->last_segment.number== + clink->u.inode->inode_block.number) ? 16 : 32, result); } diff --git a/modules/hdd/libpfs/src/cache.c b/modules/hdd/libpfs/src/cache.c index 4469f5f65..bc5d64597 100644 --- a/modules/hdd/libpfs/src/cache.c +++ b/modules/hdd/libpfs/src/cache.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS metadata cache manipulation routines */ @@ -26,230 +25,228 @@ u32 pfsCacheNumBuffers; void pfsCacheFree(pfs_cache_t *clink) { - if (clink == NULL) { - PFS_PRINTF(PFS_DRV_NAME ": Warning: NULL buffer returned\n"); - return; - } - - if (clink->nused == 0) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Unused cache returned\n"); - return; - } - - clink->nused--; - if (clink->pfsMount != NULL) { - if (clink->nused != 0) - return; - pfsCacheLink(pfsCacheBuf->prev, clink); - return; - } - if (clink->nused != 0) { - PFS_PRINTF(PFS_DRV_NAME ": Warning: Invalidated buffer is in use\n"); - return; - } - pfsCacheLink(pfsCacheBuf, clink); + if(clink==NULL) { + PFS_PRINTF(PFS_DRV_NAME": Warning: NULL buffer returned\n"); + return; + } + + if(clink->nused==0){ + PFS_PRINTF(PFS_DRV_NAME": Error: Unused cache returned\n"); + return; + } + + clink->nused--; + if(clink->pfsMount!=NULL) { + if(clink->nused!=0) + return; + pfsCacheLink(pfsCacheBuf->prev, clink); + return; + } + if(clink->nused!=0) { + PFS_PRINTF(PFS_DRV_NAME": Warning: Invalidated buffer is in use\n"); + return; + } + pfsCacheLink(pfsCacheBuf, clink); } void pfsCacheLink(pfs_cache_t *clink, pfs_cache_t *cnew) { - cnew->prev = clink; - cnew->next = clink->next; - clink->next->prev = cnew; - clink->next = cnew; + cnew->prev=clink; + cnew->next=clink->next; + clink->next->prev=cnew; + clink->next=cnew; } pfs_cache_t *pfsCacheUnLink(pfs_cache_t *clink) { - clink->prev->next = clink->next; - clink->next->prev = clink->prev; - return clink; + clink->prev->next=clink->next; + clink->next->prev=clink->prev; + return clink; } pfs_cache_t *pfsCacheUsedAdd(pfs_cache_t *clink) { - clink->nused++; - return clink; + clink->nused++; + return clink; } -int pfsCacheTransfer(pfs_cache_t *clink, int mode) +int pfsCacheTransfer(pfs_cache_t* clink, int mode) { - pfs_mount_t *pfsMount = clink->pfsMount; - int err; - - if (pfsMount->lastError == 0) { // no error - if ((err = pfsMount->blockDev->transfer(pfsMount->fd, clink->u.inode, clink->sub, - clink->sector << pfsBlockSize, 1 << pfsBlockSize, mode)) == 0) { - if (mode == PFS_IO_MODE_READ) { - if (clink->flags & PFS_CACHE_FLAG_SEGD && ((pfs_inode *)clink->u.inode)->magic != PFS_SEGD_MAGIC) - err = -EIO; - if (clink->flags & PFS_CACHE_FLAG_SEGI && ((pfs_inode *)clink->u.inode)->magic != PFS_SEGI_MAGIC) - err = -EIO; - if (clink->flags & (PFS_CACHE_FLAG_SEGD | PFS_CACHE_FLAG_SEGI)) { - if (((pfs_inode *)clink->u.inode)->checksum != pfsInodeCheckSum(clink->u.inode)) - err = -EIO; - } - } - } - if (err != 0) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Disk error partition %ld, block %ld, err %d\n", - clink->sub, clink->sector, err); + pfs_mount_t *pfsMount=clink->pfsMount; + int err; + + if(pfsMount->lastError == 0) { // no error + if((err=pfsMount->blockDev->transfer(pfsMount->fd, clink->u.inode, clink->sub, + clink->sector << pfsBlockSize, 1 << pfsBlockSize, mode))==0) { + if(mode==PFS_IO_MODE_READ) { + if(clink->flags & PFS_CACHE_FLAG_SEGD && ((pfs_inode_t *)clink->u.inode)->magic!=PFS_SEGD_MAGIC) + err=-EIO; + if(clink->flags & PFS_CACHE_FLAG_SEGI && ((pfs_inode_t *)clink->u.inode)->magic!=PFS_SEGI_MAGIC) + err=-EIO; + if(clink->flags & (PFS_CACHE_FLAG_SEGD|PFS_CACHE_FLAG_SEGI)) { + if(((pfs_inode_t *)clink->u.inode)->checksum!=pfsInodeCheckSum(clink->u.inode)) + err=-EIO; + } + } + } + if(err!=0) { + PFS_PRINTF(PFS_DRV_NAME": Error: Disk error partition %ld, block %ld, err %d\n", + clink->sub, clink->sector, err); #ifndef PFS_NO_WRITE_ERROR_STAT - pfsMount->blockDev->setPartitionError(pfsMount->fd); - pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_WRITE_ERROR, PFS_MODE_SET_FLAG); - pfsMount->lastError = err; + pfsMount->blockDev->setPartitionError(pfsMount->fd); + pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_WRITE_ERROR, PFS_MODE_SET_FLAG); + pfsMount->lastError=err; #endif - } - } - clink->flags &= ~PFS_CACHE_FLAG_DIRTY; // clear dirty :) - return pfsMount->lastError; + } + } + clink->flags&=~PFS_CACHE_FLAG_DIRTY; // clear dirty :) + return pfsMount->lastError; } void pfsCacheFlushAllDirty(pfs_mount_t *pfsMount) { - u32 i; - int found = 0; - - for (i = 1; i < pfsCacheNumBuffers + 1; i++) { - if (pfsCacheBuf[i].pfsMount == pfsMount && - pfsCacheBuf[i].flags & PFS_CACHE_FLAG_DIRTY) - found = 1; - } - if (found) { - pfsJournalWrite(pfsMount, pfsCacheBuf + 1, pfsCacheNumBuffers); - for (i = 1; i < pfsCacheNumBuffers + 1; i++) { - if (pfsCacheBuf[i].pfsMount == pfsMount && - pfsCacheBuf[i].flags & PFS_CACHE_FLAG_DIRTY) - pfsCacheTransfer(&pfsCacheBuf[i], 1); - } - pfsJournalReset(pfsMount); - } + u32 i; + int found=0; + + for(i=1;iprev == pfsCacheBuf && pfsCacheBuf->prev->next == pfsCacheBuf->prev) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Free buffer list is empty\n"); - *result = -ENOMEM; - return NULL; - } - allocated = pfsCacheBuf->next; - if (pfsCacheBuf->next == NULL) - PFS_PRINTF(PFS_DRV_NAME ": Panic: Null pointer allocated\n"); - if (allocated->pfsMount && (allocated->flags & PFS_CACHE_FLAG_DIRTY)) - pfsCacheFlushAllDirty(allocated->pfsMount); - allocated->flags = flags & PFS_CACHE_FLAG_MASKTYPE; - allocated->pfsMount = pfsMount; - allocated->sub = sub; - allocated->sector = scale; - allocated->nused = 1; - return pfsCacheUnLink(allocated); + pfs_cache_t *allocated; + + if (pfsCacheBuf->prev==pfsCacheBuf && pfsCacheBuf->prev->next==pfsCacheBuf->prev) { + PFS_PRINTF(PFS_DRV_NAME": Error: Free buffer list is empty\n"); + *result=-ENOMEM; + return NULL; + } + allocated=pfsCacheBuf->next; + if (pfsCacheBuf->next==NULL) + PFS_PRINTF(PFS_DRV_NAME": Panic: Null pointer allocated\n"); + if (allocated->pfsMount && (allocated->flags & PFS_CACHE_FLAG_DIRTY)) + pfsCacheFlushAllDirty(allocated->pfsMount); + allocated->flags = flags & PFS_CACHE_FLAG_MASKTYPE; + allocated->pfsMount = pfsMount; + allocated->sub = sub; + allocated->sector = scale; + allocated->nused = 1; + return pfsCacheUnLink(allocated); } pfs_cache_t *pfsCacheGetData(pfs_mount_t *pfsMount, u16 sub, u32 sector, - int flags, int *result) + int flags, int *result) { - u32 i; - pfs_cache_t *clink; - - *result = 0; - - for (i = 1; i < pfsCacheNumBuffers + 1; i++) - if (pfsCacheBuf[i].pfsMount && - (pfsCacheBuf[i].pfsMount == pfsMount) && - (pfsCacheBuf[i].sector == sector)) - if (pfsCacheBuf[i].sub == sub) { - pfsCacheBuf[i].flags &= PFS_CACHE_FLAG_MASKSTATUS; - pfsCacheBuf[i].flags |= flags & PFS_CACHE_FLAG_MASKTYPE; - if (pfsCacheBuf[i].nused == 0) - pfsCacheUnLink(&pfsCacheBuf[i]); - pfsCacheBuf[i].nused++; - return &pfsCacheBuf[i]; - } - - clink = pfsCacheAlloc(pfsMount, sub, sector, flags, result); - - if (clink) { - if (flags & PFS_CACHE_FLAG_NOLOAD) - return clink; - - if ((*result = pfsCacheTransfer(clink, PFS_IO_MODE_READ)) >= 0) - return clink; - - clink->pfsMount = NULL; - pfsCacheFree(clink); - } - return NULL; + u32 i; + pfs_cache_t *clink; + + *result=0; + + for (i=1; i < pfsCacheNumBuffers + 1; i++) + if ( pfsCacheBuf[i].pfsMount && + (pfsCacheBuf[i].pfsMount==pfsMount) && + (pfsCacheBuf[i].sector == sector)) + if (pfsCacheBuf[i].sub==sub){ + pfsCacheBuf[i].flags &= PFS_CACHE_FLAG_MASKSTATUS; + pfsCacheBuf[i].flags |= flags & PFS_CACHE_FLAG_MASKTYPE; + if (pfsCacheBuf[i].nused == 0) + pfsCacheUnLink(&pfsCacheBuf[i]); + pfsCacheBuf[i].nused++; + return &pfsCacheBuf[i]; + } + + clink=pfsCacheAlloc(pfsMount, sub, sector, flags, result); + + if (clink){ + if (flags & PFS_CACHE_FLAG_NOLOAD) + return clink; + + if ((*result=pfsCacheTransfer(clink, PFS_IO_MODE_READ))>=0) + return clink; + + clink->pfsMount=NULL; + pfsCacheFree(clink); + } + return NULL; } pfs_cache_t *pfsCacheAllocClean(int *result) { - *result = 0; - return pfsCacheAlloc(NULL, 0, 0, 0, result); + *result = 0; + return pfsCacheAlloc(NULL, 0, 0, 0, result); } // checks if the pfsCacheBuf list has some room int pfsCacheIsFull(void) { - if (pfsCacheBuf->prev != pfsCacheBuf) - return 0; - return pfsCacheBuf->prev->next == pfsCacheBuf->prev; + if (pfsCacheBuf->prev != pfsCacheBuf) return 0; + return pfsCacheBuf->prev->next == pfsCacheBuf->prev; } int pfsCacheInit(u32 numBuf, u32 bufSize) { - char *cacheData; - u32 i; + char *cacheData; + u32 i; - if (numBuf > 127) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Number of buffers larger than 127.\n"); - return -EINVAL; - } + if(numBuf > 127) { + PFS_PRINTF(PFS_DRV_NAME": Error: Number of buffers larger than 127.\n"); + return -EINVAL; + } - cacheData = pfsAllocMem(numBuf * bufSize); + cacheData = pfsAllocMem(numBuf * bufSize); - if (!cacheData || !(pfsCacheBuf = pfsAllocMem((numBuf + 1) * sizeof(pfs_cache_t)))) - return -ENOMEM; + if(!cacheData || !(pfsCacheBuf = pfsAllocMem((numBuf + 1) * sizeof(pfs_cache_t)))) + return -ENOMEM; - pfsCacheNumBuffers = numBuf; - memset(pfsCacheBuf, 0, (numBuf + 1) * sizeof(pfs_cache_t)); + pfsCacheNumBuffers = numBuf; + memset(pfsCacheBuf, 0, (numBuf + 1) * sizeof(pfs_cache_t)); - pfsCacheBuf->next = pfsCacheBuf; - pfsCacheBuf->prev = pfsCacheBuf; + pfsCacheBuf->next = pfsCacheBuf; + pfsCacheBuf->prev = pfsCacheBuf; - for (i = 1; i < numBuf + 1; i++) { - pfsCacheBuf[i].u.data = cacheData; - pfsCacheLink(pfsCacheBuf->prev, &pfsCacheBuf[i]); - cacheData += bufSize; - } + for(i = 1; i < numBuf + 1; i++) + { + pfsCacheBuf[i].u.data = cacheData; + pfsCacheLink(pfsCacheBuf->prev, &pfsCacheBuf[i]); + cacheData += bufSize; + } - return 0; + return 0; } void pfsCacheClose(pfs_mount_t *pfsMount) { - unsigned int i; + unsigned int i; - pfsCacheFlushAllDirty(pfsMount); - for (i = 1; i < pfsCacheNumBuffers + 1; i++) { - if (pfsCacheBuf[i].pfsMount == pfsMount) - pfsCacheBuf[i].pfsMount = NULL; - } - - //Not done for FSCK. - pfsHddFlushCache(pfsMount->fd); + pfsCacheFlushAllDirty(pfsMount); + for(i=1; i < pfsCacheNumBuffers+1;i++){ + if(pfsCacheBuf[i].pfsMount==pfsMount) + pfsCacheBuf[i].pfsMount=NULL; + } } void pfsCacheMarkClean(pfs_mount_t *pfsMount, u32 subpart, u32 sectorStart, u32 sectorEnd) { - u32 i; - - for (i = 1; i < pfsCacheNumBuffers + 1; i++) { - if (pfsCacheBuf[i].pfsMount == pfsMount && pfsCacheBuf[i].sub == subpart) { - if (pfsCacheBuf[i].sector >= sectorStart && pfsCacheBuf[i].sector < sectorEnd) - pfsCacheBuf[i].flags &= ~PFS_CACHE_FLAG_DIRTY; - } - } + u32 i; + + for(i=1; i< pfsCacheNumBuffers+1;i++){ + if(pfsCacheBuf[i].pfsMount==pfsMount && pfsCacheBuf[i].sub==subpart) { + if(pfsCacheBuf[i].sector >= sectorStart && pfsCacheBuf[i].sector < sectorEnd) + pfsCacheBuf[i].flags&=~PFS_CACHE_FLAG_DIRTY; + } + } } diff --git a/modules/hdd/libpfs/src/dir.c b/modules/hdd/libpfs/src/dir.c index 3eb33c01d..258258394 100644 --- a/modules/hdd/libpfs/src/dir.c +++ b/modules/hdd/libpfs/src/dir.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS directory parsing routines */ @@ -18,347 +17,355 @@ #include "pfs-opt.h" #include "libpfs.h" -#include "pfs_fioctl.h" extern u32 pfsMetaSize; // Gets a dir entry from the inode specified by clink -pfs_cache_t *pfsGetDentry(pfs_cache_t *clink, char *path, pfs_dentry **dentry, u32 *size, int option) +pfs_cache_t *pfsGetDentry(pfs_cache_t *clink, char *path, pfs_dentry_t **dentry, u32 *size, int option) { - pfs_blockpos_t block_pos; - u32 result; - pfs_dentry *d; - u16 aLen; - pfs_dentry *d2; - pfs_cache_t *dentCache; - u32 dentryLen = 0; - int len = 0; - - if (path) { - len = strlen(path); - dentryLen = (len + 8 + 3) & ~4; - } - *size = 0; - - block_pos.inode = pfsCacheUsedAdd(clink); - block_pos.block_segment = 1; - block_pos.block_offset = 0; - block_pos.byte_offset = 0; - dentCache = pfsGetDentriesChunk(&block_pos, (int *)&result); - - if (dentCache) { - d2 = d = dentCache->u.dentry; - while (*size < clink->u.inode->size) { - // Read another dentry chunk if we need to - if ((int)d2 >= ((int)dentCache->u.inode + pfsMetaSize)) { - if (pfsInodeSync(&block_pos, pfsMetaSize, clink->u.inode->number_data)) - break; - pfsCacheFree(dentCache); - - if ((dentCache = pfsGetDentriesChunk(&block_pos, (int *)&result)) == 0) - break; - d = dentCache->u.dentry; - } - - for (d2 = (pfs_dentry *)((int)d + 512); d < d2; (int)d += aLen) { - aLen = (d->aLen & 0xFFF); - - if (aLen & 3) { - PFS_PRINTF(PFS_DRV_NAME ": Error: dir-entry allocated length/4 != 0\n"); - goto _exit; - } - if (aLen < ((d->pLen + 8 + 3) & 0x1FC)) { - PFS_PRINTF(PFS_DRV_NAME ": Error: dir-entry is too small\n"); - goto _exit; - } - if ((u32)d2 < ((u32)d + aLen)) { - PFS_PRINTF(PFS_DRV_NAME ": Error: dir-entry across sectors\n"); - goto _exit; - } - - // decide if the current dentry meets the required criteria, based on 'option' - switch (option) { - case 0: // result = 1 when paths are equal - result = (len == d->pLen) && (memcmp(path, d->path, d->pLen) == 0); - break; - case 1: // hrm.. - result = ((d->inode) || (aLen < dentryLen)) ? ((aLen - ((d->pLen + 8 + 3) & 0x1FC)) > dentryLen) : 1; - break; - case 2: // result = 1 when dir path is not empty, "." or ".." - result = d->pLen && strcmp(d->path, ".") && strcmp(d->path, ".."); - break; - default: - goto _exit; - } - - if (result) { - *dentry = d; - pfsCacheFree(block_pos.inode); - return dentCache; - } - *size += aLen; - } - } - _exit: - pfsCacheFree(dentCache); - } - pfsCacheFree(block_pos.inode); - return NULL; + pfs_blockpos_t block_pos; + pfs_dentry_t *d; + u16 aLen; + pfs_dentry_t *d2; + pfs_cache_t *dentCache; + u32 new_dentryLen=0,dentryLen; + int len=0, result; + + if (path) + { + len = strlen(path); + new_dentryLen = (len+8+3) &~3; + } + *size = 0; + + block_pos.inode = pfsCacheUsedAdd(clink); + block_pos.block_segment = 1; + block_pos.block_offset = 0; + block_pos.byte_offset = 0; + dentCache = pfsGetDentriesChunk(&block_pos, &result); + + if (dentCache != NULL) + { + d2=d=dentCache->u.dentry; + while(*size < clink->u.inode->size) + { + // Read another dentry chunk if we need to + if (d2 >= (pfs_dentry_t*)((u8*)dentCache->u.inode + pfsMetaSize)) + { + if (pfsInodeSync(&block_pos, pfsMetaSize, clink->u.inode->number_data)) + break; + pfsCacheFree(dentCache); + + if ((dentCache=pfsGetDentriesChunk(&block_pos, &result))==0) + break; + d=dentCache->u.dentry; + } + + for (d2=(pfs_dentry_t*)((int)d+512); d < d2; d=(pfs_dentry_t *)((int)d + aLen)) + { + aLen=(d->aLen & 0xFFF); + + if (aLen & 3){ + PFS_PRINTF(PFS_DRV_NAME": Error: dir-entry allocated length/4 != 0\n"); + goto _exit; + } + dentryLen = (d->pLen + 8 + 3) & 0x1FC; + if (aLen < dentryLen){ + PFS_PRINTF(PFS_DRV_NAME": Error: dir-entry is too small\n"); + goto _exit; + } + if (d2 < (pfs_dentry_t*)((u8*)d + aLen)){ + PFS_PRINTF(PFS_DRV_NAME": Error: dir-entry across sectors\n"); + goto _exit; + } + + // decide if the current dentry meets the required criteria, based on 'option' + switch(option) + { + case 0: // result = 1 when paths are equal + result = (len==d->pLen) && (memcmp(path, d->path, d->pLen)==0); + break; + case 1: // result = 1 when either there is no inode or if there is enough space remaining in the inode. + result = ((d->inode) || (aLen < new_dentryLen)) ? (aLen - dentryLen + >= new_dentryLen) : 1; + break; + case 2: // result = 1 when dir path is not empty, "." or ".." + result = d->pLen && strcmp(d->path, ".") && strcmp(d->path, ".."); + break; + default: + goto _exit; + } + + if (result) + { + *dentry=d; + pfsCacheFree(block_pos.inode); + return dentCache; + } + *size+=aLen; + } + } +_exit: pfsCacheFree(dentCache); + } + pfsCacheFree(block_pos.inode); + return NULL; } -int pfsGetNextDentry(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 *position, char *name, pfs_blockinfo *bi) +int pfsGetNextDentry(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 *position, char *name, pfs_blockinfo_t *bi) { - int result; - pfs_cache_t *dcache; - pfs_dentry *dentry; - u32 len = 0; + int result; + pfs_cache_t *dcache; + pfs_dentry_t *dentry; + u32 len=0; - // loop until a non-empty entry is found or until the end of the dentry chunk is reached - while ((len == 0) && (*position < clink->u.inode->size)) { + // loop until a non-empty entry is found or until the end of the dentry chunk is reached + while((len == 0) && (*position < clink->u.inode->size)) + { - if (!(dcache = pfsGetDentriesChunk(blockpos, &result))) { - PFS_PRINTF(PFS_DRV_NAME ": couldnt get dentries chunk for dread!\n"); - break; - } + if (!(dcache=pfsGetDentriesChunk(blockpos, &result))) + { + PFS_PRINTF(PFS_DRV_NAME": couldnt get dentries chunk for dread!\n"); + break; + } - dentry = (pfs_dentry *)((u32)dcache->u.data + (blockpos->byte_offset % pfsMetaSize)); + dentry = (pfs_dentry_t*)((u8*)dcache->u.data + (blockpos->byte_offset % pfsMetaSize)); - len = dentry->pLen; - memcpy(name, dentry->path, len); - name[len] = '\0'; + len = dentry->pLen; + memcpy(name, dentry->path, len); + name[len] = '\0'; - bi->subpart = dentry->sub; - bi->number = dentry->inode; - pfsCacheFree(dcache); + bi->subpart = dentry->sub; + bi->number = dentry->inode; + pfsCacheFree(dcache); - *position += dentry->aLen & 0xFFF; + *position += dentry->aLen & 0xFFF; - // update blockpos - if (pfsInodeSync(blockpos, dentry->aLen & 0xFFF, clink->u.inode->number_data)) - break; - } + // update blockpos + if (pfsInodeSync(blockpos, dentry->aLen & 0xFFF, clink->u.inode->number_data)) + break; + } - return len; + return len; } -pfs_cache_t *pfsFillDentry(pfs_cache_t *clink, pfs_dentry *dentry, char *path1, pfs_blockinfo *bi, u32 len, u16 mode) +pfs_cache_t *pfsFillDentry(pfs_cache_t *clink, pfs_dentry_t *dentry, char *path1, pfs_blockinfo_t *bi, u32 len, u16 mode) { - dentry->inode = bi->number; - dentry->sub = (u8)bi->subpart; - dentry->pLen = strlen(path1); - dentry->aLen = len | (mode & FIO_S_IFMT); - memcpy(dentry->path, path1, dentry->pLen & 0xFF); + dentry->inode=bi->number; + dentry->sub=(u8)bi->subpart; + dentry->pLen=strlen(path1); + dentry->aLen=len | (mode & FIO_S_IFMT); + memcpy(dentry->path, path1, dentry->pLen & 0xFF); - return clink; + return clink; } -pfs_cache_t *pfsDirAddEntry(pfs_cache_t *dir, char *filename, pfs_blockinfo *bi, u16 mode, int *result) +pfs_cache_t *pfsDirAddEntry(pfs_cache_t *dir, char *filename, pfs_blockinfo_t *bi, u16 mode, int *result) { - pfs_dentry *dentry; - u32 size; - u32 len; - pfs_cache_t *dcache; - - dcache = pfsGetDentry(dir, filename, &dentry, &size, 1); - if (dcache) { - len = dentry->aLen & 0xFFF; - if (dentry->pLen) - len -= (dentry->pLen + 11) & 0x1FC; - dentry->aLen = (dentry->aLen & FIO_S_IFMT) | ((dentry->aLen & 0xFFF) - len); - (u32) dentry += dentry->aLen & 0xFFF; - } else { - int offset; - - if ((*result = pfsFioIoctl2Alloc(dir, sizeof(pfs_dentry), 0)) < 0) - return NULL; - dcache = pfsGetDentriesAtPos(dir, dir->u.inode->size, &offset, result); - if (dcache == NULL) - return NULL; - - dir->u.inode->size += sizeof(pfs_dentry); - - dentry = (pfs_dentry *)((u32)dcache->u.dentry + offset); - len = sizeof(pfs_dentry); - } - return pfsFillDentry(dcache, dentry, filename, bi, len, mode); + pfs_dentry_t *dentry; + u32 size; + u32 len; + pfs_cache_t *dcache; + + dcache=pfsGetDentry(dir, filename, &dentry, &size, 1); + if (dcache){ + len=dentry->aLen & 0xFFF; + if (dentry->pLen) + len-=(dentry->pLen + 11) & 0x1FC; + dentry->aLen=(dentry->aLen & FIO_S_IFMT) | ((dentry->aLen & 0xFFF) - len); + dentry=(pfs_dentry_t *)((u8*)dentry + (dentry->aLen & 0xFFF)); + }else{ + int offset; + + if ((*result=pfsAllocZones(dir, sizeof(pfs_dentry_t), 0))<0) + return NULL; + dcache=pfsGetDentriesAtPos(dir, dir->u.inode->size, &offset, result); + if (dcache==NULL) + return NULL; + + dir->u.inode->size += sizeof(pfs_dentry_t); + + dentry=(pfs_dentry_t*)((u8*)dcache->u.dentry+offset); + len=sizeof(pfs_dentry_t); + } + return pfsFillDentry(dcache, dentry, filename, bi, len, mode); } pfs_cache_t *pfsDirRemoveEntry(pfs_cache_t *clink, char *path) { - pfs_dentry *dentry; - u32 size; - int i = 0, val; - pfs_dentry *dlast = NULL, *dnext; - pfs_cache_t *c; - - if ((c = pfsGetDentry(clink, path, &dentry, &size, 0))) { - val = (int)dentry - (int)c->u.dentry; - if (val < 0) - val += 511; - val /= 512; - val *= 512; - dnext = (pfs_dentry *)((int)c->u.dentry + val); - do { - if (dnext == dentry) { - if (dlast) - dlast->aLen = (dlast->aLen & FIO_S_IFMT) | ((dlast->aLen & 0xFFF) + (dnext->aLen & 0xFFF)); - else { - dnext->pLen = dnext->inode = 0; - - if ((clink->u.inode->size) && - (0 >= dnext) && ((dnext == 0) || //strange?!?; - (size + (dnext->aLen & 0xFFF) >= clink->u.inode->size))) { - clink->u.inode->size -= dnext->aLen & 0xFFF; - } - } - return c; - } - i += dnext->aLen & 0xFFF; - dlast = dnext; - (u32) dnext += dnext->aLen & 0xFFF; - } while (i < 512); - } - return NULL; + pfs_dentry_t *dentry; + u32 size; + u16 aLen; + int i=0, val; + pfs_dentry_t *dlast=NULL, *dnext; + pfs_cache_t *c; + + if ((c=pfsGetDentry(clink, path, &dentry, &size, 0))){ + val=(int)dentry-(int)c->u.dentry; + if (val<0) val +=511; + val /=512; val *=512; + dnext=(pfs_dentry_t*)((int)c->u.dentry+val); + do{ + aLen = dnext->aLen & 0xFFF; + + if (dnext==dentry){ + if (dlast) + dlast->aLen=(dlast->aLen & FIO_S_IFMT) | ((dlast->aLen & 0xFFF) + aLen); + else{ + dnext->pLen=dnext->inode=0; + + if (size+aLen >= clink->u.inode->size) + clink->u.inode->size -= aLen; + } + return c; + } + i+=aLen; + dlast=dnext; + dnext=(pfs_dentry_t *)((u8*)dnext + aLen); + }while (i<512); + } + return NULL; } int pfsCheckDirForFiles(pfs_cache_t *clink) { - pfs_dentry *dentry; - pfs_cache_t *dcache; - u32 size; - - if ((dcache = pfsGetDentry(clink, NULL, &dentry, &size, 2))) { - pfsCacheFree(dcache); - return 0; - } - return 1; + pfs_dentry_t *dentry; + pfs_cache_t *dcache; + u32 size; + + if((dcache=pfsGetDentry(clink, NULL, &dentry, &size, 2))){ + pfsCacheFree(dcache); + return 0; + } + return 1; } -void pfsFillSelfAndParentDentries(pfs_cache_t *clink, pfs_blockinfo *self, pfs_blockinfo *parent) +void pfsFillSelfAndParentDentries(pfs_cache_t *clink, pfs_blockinfo_t *self, pfs_blockinfo_t *parent) { - pfs_dentry *dentry = clink->u.dentry; - - memset(dentry, 0, pfsMetaSize); - dentry->inode = self->number; - *(u32 *)dentry->path = '.'; - dentry->sub = (u8)self->subpart; - dentry->pLen = 1; - dentry->aLen = 12 | FIO_S_IFDIR; - - (u32) dentry += 12; - - dentry->inode = parent->number; - *(u32 *)dentry->path = ('.' << 8) + '.'; - dentry->sub = (u8)parent->subpart; - dentry->pLen = 2; - dentry->aLen = 500 | FIO_S_IFDIR; + pfs_dentry_t *dentry=clink->u.dentry; + + memset(dentry, 0, pfsMetaSize); + dentry->inode=self->number; + dentry->path[0]='.'; + dentry->path[1]='\0'; + dentry->sub=(u8)self->subpart; + dentry->pLen=1; + dentry->aLen=12 | FIO_S_IFDIR; + + dentry=(pfs_dentry_t *)((u8*)dentry + 12); + + dentry->inode=parent->number; + dentry->path[0]='.'; + dentry->path[1]='.'; + dentry->path[2]='\0'; + dentry->sub=(u8)parent->subpart; + dentry->pLen=2; + dentry->aLen=500 | FIO_S_IFDIR; } -pfs_cache_t *pfsSetDentryParent(pfs_cache_t *clink, pfs_blockinfo *bi, int *result) +pfs_cache_t* pfsSetDentryParent(pfs_cache_t *clink, pfs_blockinfo_t *bi, int *result) { - int offset; - pfs_cache_t *dcache; - - dcache = pfsGetDentriesAtPos(clink, 0, &offset, result); - if (dcache) { - pfs_dentry *d = (pfs_dentry *)(12 + (u32)dcache->u.data); - d->inode = bi->number; - d->sub = (u8)bi->subpart; - } - return dcache; + int offset; + pfs_cache_t *dcache; + + dcache=pfsGetDentriesAtPos(clink, 0, &offset, result); + if (dcache){ + pfs_dentry_t *d=(pfs_dentry_t*)(12+(u8*)dcache->u.data); + d->inode=bi->number; + d->sub =(u8)bi->subpart; + } + return dcache; } // Returns the cached inode for the file (dir) in the directory pointed // to by the dir inode. pfs_cache_t *pfsInodeGetFileInDir(pfs_cache_t *dirInode, char *path, int *result) { - pfs_dentry *dentry; - u32 size; - pfs_cache_t *clink; - - if (path[0] == 0) - return pfsCacheUsedAdd(dirInode); - - // If we're in the root dir, don't do anything for ".." - if ((dirInode->sector == - dirInode->pfsMount->root_dir.number << dirInode->pfsMount->inode_scale) && - (dirInode->sub == dirInode->pfsMount->root_dir.subpart) && - (strcmp(path, "..") == 0)) - return pfsCacheUsedAdd(dirInode); - - if ((*result = pfsCheckAccess(dirInode, 1)) < 0) - return NULL; - - // Get dentry of file/dir specified by path from the dir pointed to - // by the inode (dirInode). Then return the cached inode for that dentry. - if ((clink = pfsGetDentry(dirInode, path, &dentry, &size, 0))) { - pfsCacheFree(clink); - return pfsInodeGetData(dirInode->pfsMount, - dentry->sub, dentry->inode, result); - } - - *result = -ENOENT; - return NULL; + pfs_dentry_t *dentry; + u32 size; + pfs_cache_t *clink; + + if (path[0]==0) + return pfsCacheUsedAdd(dirInode); + + // If we're in the root dir, don't do anything for ".." + if ((dirInode->sector == + dirInode->pfsMount->root_dir.number << dirInode->pfsMount->inode_scale) && + (dirInode->sub == dirInode->pfsMount->root_dir.subpart) && + (strcmp(path, "..") == 0)) + return pfsCacheUsedAdd(dirInode); + + if ((*result=pfsCheckAccess(dirInode, 1)) < 0) + return NULL; + + // Get dentry of file/dir specified by path from the dir pointed to + // by the inode (dirInode). Then return the cached inode for that dentry. + if ((clink=pfsGetDentry(dirInode, path, &dentry, &size, 0))){ + pfsCacheFree(clink); + return pfsInodeGetData(dirInode->pfsMount, + dentry->sub, dentry->inode, result); + } + + *result=-ENOENT; + return NULL; } pfs_cache_t *pfsInodeGetFile(pfs_mount_t *pfsMount, pfs_cache_t *clink, - const char *name, int *result) -{ - char path[256]; - pfs_cache_t *c; - - c = pfsInodeGetParent(pfsMount, clink, name, path, result); - if (c) { - c = pfsInodeGetFileInDir(c, path, result); - pfsCacheFree(c); - return c; - } - return NULL; + const char *name, int *result) { + char path[256]; + pfs_cache_t *c; + + c=pfsInodeGetParent(pfsMount, clink, name, path, result); + if (c){ + c=pfsInodeGetFileInDir(c, path, result); + pfsCacheFree(c); + return c; + } + return NULL; } -void pfsInodeFill(pfs_cache_t *ci, pfs_blockinfo *bi, u16 mode, u16 uid, u16 gid) +void pfsInodeFill(pfs_cache_t *ci, pfs_blockinfo_t *bi, u16 mode, u16 uid, u16 gid) { - u32 val; + u32 val; - memset(ci->u.inode, 0, pfsMetaSize); + memset(ci->u.inode, 0, pfsMetaSize); - ci->u.inode->magic = PFS_SEGD_MAGIC; + ci->u.inode->magic=PFS_SEGD_MAGIC; - ci->u.inode->inode_block.number = bi->number; - ci->u.inode->inode_block.subpart = bi->subpart; - ci->u.inode->inode_block.count = bi->count; + ci->u.inode->inode_block.number=bi->number; + ci->u.inode->inode_block.subpart=bi->subpart; + ci->u.inode->inode_block.count=bi->count; - ci->u.inode->last_segment.number = bi->number; - ci->u.inode->last_segment.subpart = bi->subpart; - ci->u.inode->last_segment.count = bi->count; + ci->u.inode->last_segment.number=bi->number; + ci->u.inode->last_segment.subpart=bi->subpart; + ci->u.inode->last_segment.count=bi->count; - ci->u.inode->mode = mode; - ci->u.inode->uid = uid; - ci->u.inode->gid = gid; + ci->u.inode->mode=mode; + ci->u.inode->uid=uid; + ci->u.inode->gid=gid; - if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) { - ci->u.inode->attr = 0xA0; - ci->u.inode->size = sizeof(pfs_dentry); - val = 2; - } else { - ci->u.inode->size = 0; - val = 1; - } - ci->u.inode->number_data = ci->u.inode->number_blocks = val; + if ((mode & FIO_S_IFMT) == FIO_S_IFDIR){ + ci->u.inode->attr=0xA0; + ci->u.inode->size=sizeof(pfs_dentry_t); + val=2; + }else{ + ci->u.inode->size=0; + val=1; + } + ci->u.inode->number_data=ci->u.inode->number_blocks=val; - pfsGetTime(&ci->u.inode->ctime); - memcpy(&ci->u.inode->atime, &ci->u.inode->ctime, sizeof(pfs_datetime)); - memcpy(&ci->u.inode->mtime, &ci->u.inode->ctime, sizeof(pfs_datetime)); + pfsGetTime(&ci->u.inode->ctime); + memcpy(&ci->u.inode->atime, &ci->u.inode->ctime, sizeof(pfs_datetime_t)); + memcpy(&ci->u.inode->mtime, &ci->u.inode->ctime, sizeof(pfs_datetime_t)); - ci->u.inode->number_segdesg = 1; - ci->u.inode->data[0].number = bi->number; - ci->u.inode->data[0].subpart = bi->subpart; - ci->u.inode->data[0].count = bi->count; + ci->u.inode->number_segdesg=1; + ci->u.inode->data[0].number =bi->number; + ci->u.inode->data[0].subpart=bi->subpart; + ci->u.inode->data[0].count =bi->count; - ci->u.inode->subpart = bi->subpart; + ci->u.inode->subpart=bi->subpart; - ci->flags |= PFS_CACHE_FLAG_DIRTY; + ci->flags |= PFS_CACHE_FLAG_DIRTY; } @@ -366,225 +373,335 @@ void pfsInodeFill(pfs_cache_t *ci, pfs_blockinfo *bi, u16 mode, u16 uid, u16 gid // the file (dir) specified by the filename. // // ie: if filename = /usr/local/ps2/games then it will return the inode for /usr/local/ps2 -pfs_cache_t *pfsInodeGetParent(pfs_mount_t *pfsMount, pfs_cache_t *clink, const char *filename, - char *path, int *result) +pfs_cache_t* pfsInodeGetParent(pfs_mount_t *pfsMount, pfs_cache_t *clink, const char *filename, + char *path, int *result) { - static int pfsSymbolicLinks = 0; - pfs_cache_t *link, *inode; - char *filename2 = (char *)filename; - - if (filename2[0] == 0) { - *result = -ENOENT; - if (clink) - pfsCacheFree(clink); - return NULL; - } - - if (filename2[0] == '/') { - - // Get inode for root dir - - if (clink) - pfsCacheFree(clink); - if ((clink = pfsInodeGetData(pfsMount, pfsMount->root_dir.subpart, - pfsMount->root_dir.number, result)) == 0) - return NULL; - } else if (clink == NULL) { - - // Otherwise if relative path, get inode for current dir - - if ((clink = pfsInodeGetData(pfsMount, pfsMount->current_dir.subpart, - pfsMount->current_dir.number, result)) == 0) - return NULL; - } - - do { - filename2 = pfsSplitPath(filename2, path, result); - if (filename2 == NULL) - return NULL; - - // If we've reached the end of the path, then we want to return - // the cached inode for the directory which holds the file/dir in path - if (filename2[0] == 0) { - if ((clink->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) - return clink; - - pfsCacheFree(clink); - *result = -ENOTDIR; // not a directory - return NULL; - } - - inode = pfsInodeGetFileInDir(clink, path, result); - - if (inode && ((inode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK)) { - if (pfsSymbolicLinks >= 4) { - *result = -ELOOP; // too many symbolic links - pfsCacheFree(clink); - pfsCacheFree(inode); - return NULL; - } - - pfsSymbolicLinks++; - link = pfsInodeGetFile(pfsMount, clink, (char *)&inode->u.inode->data[1], result); - pfsSymbolicLinks--; - - clink = inode; - if (link == 0) { - pfsCacheFree(inode); - return NULL; - } - inode = link; - } - pfsCacheFree(clink); - clink = inode; - - } while (inode); - - return NULL; + static int pfsSymbolicLinks = 0; + pfs_cache_t *link, *inode; + char *filename2=(char*)filename; + + if (filename2[0]==0) + { + *result=-ENOENT; + if (clink) pfsCacheFree(clink); + return NULL; + } + + if (filename2[0] == '/') + { + + // Get inode for root dir + + if (clink) pfsCacheFree(clink); + if ((clink=pfsInodeGetData(pfsMount, pfsMount->root_dir.subpart, + pfsMount->root_dir.number, result))==0) + return NULL; + } + else if (clink==NULL) + { + + // Otherwise if relative path, get inode for current dir + + if ((clink=pfsInodeGetData(pfsMount, pfsMount->current_dir.subpart, + pfsMount->current_dir.number, result))==0) + return NULL; + } + + do + { + filename2=pfsSplitPath(filename2, path, result); + if (filename2==NULL) return NULL; + + // If we've reached the end of the path, then we want to return + // the cached inode for the directory which holds the file/dir in path + if (filename2[0]==0) + { + if ((clink->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) + return clink; + + pfsCacheFree(clink); + *result=-ENOTDIR; // not a directory + return NULL; + } + + inode=pfsInodeGetFileInDir(clink, path, result); + + if (inode && ((inode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK)) + { + if (pfsSymbolicLinks >= 4) + { + *result=-ELOOP; // too many symbolic links + pfsCacheFree(clink); + pfsCacheFree(inode); + return NULL; + } + + pfsSymbolicLinks++; + link=pfsInodeGetFile(pfsMount, clink, (char*)&inode->u.inode->data[1], result); + pfsSymbolicLinks--; + + clink=inode; + if (link==0) + { + pfsCacheFree(inode); + return NULL; + } + inode=link; + } + pfsCacheFree(clink); + clink=inode; + + } while (inode); + + return NULL; } int pfsInodeRemove(pfs_cache_t *parent, pfs_cache_t *inode, char *path) { - pfs_cache_t *entry; - int rv = 0; - - if ((entry = pfsDirRemoveEntry(parent, path)) != NULL) { - pfsInodeSetTime(parent); - entry->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(entry); - } else - rv = -ENOENT; - - pfsCacheFree(parent); - if (rv == 0) { - inode->flags &= ~PFS_CACHE_FLAG_DIRTY; - pfsBitmapFreeInodeBlocks(inode); - if (parent->pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(parent->pfsMount); - } - - pfsCacheFree(inode); - return rv; + pfs_cache_t *entry; + int rv=0; + + if((entry=pfsDirRemoveEntry(parent, path))!=NULL) + { + pfsInodeSetTime(parent); + entry->flags|=PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(entry); + } + else + rv=-ENOENT; + + pfsCacheFree(parent); + if(rv==0) + { + inode->flags&=~PFS_CACHE_FLAG_DIRTY; + pfsBitmapFreeInodeBlocks(inode); + if(parent->pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(parent->pfsMount); + } + + pfsCacheFree(inode); + return rv; } pfs_cache_t *pfsInodeCreate(pfs_cache_t *clink, u16 mode, u16 uid, u16 gid, int *result) { - pfs_blockinfo a, b; - - pfs_mount_t *pfsMount = clink->pfsMount; - u32 j; - u32 i; - pfs_cache_t *inode; - - if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) { - if (pfsMount->num_subs > clink->u.inode->subpart) - clink->u.inode->subpart++; - else - clink->u.inode->subpart = 0; - a.number = 0; - a.subpart = clink->u.inode->subpart; - j = (pfsMount->zfree * (u64)100) / pfsMount->total_sector; - i = (pfsMount->free_zone[a.subpart] * (u64)100) / - (pfsMount->blockDev->getSize(pfsMount->fd, a.subpart) >> pfsMount->sector_scale); - if ((i < j) && ((j - i) >= 11)) - a.subpart = pfsGetMaxIndex(pfsMount); - } else { - a.number = clink->u.inode->inode_block.number; - a.subpart = clink->u.inode->inode_block.subpart; - a.count = clink->u.inode->inode_block.count; - } - a.count = 1; - - // Search for a free zone, starting from parent dir inode block - *result = pfsBitmapSearchFreeZone(pfsMount, &a, 2); - if (*result < 0) - return 0; - inode = pfsCacheGetData(pfsMount, a.subpart, a.number << pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGD | PFS_CACHE_FLAG_NOLOAD, result); - if (inode == NULL) - return NULL; - - // Initialise the inode (which has been allocate blocks specified by a) - pfsInodeFill(inode, (pfs_blockinfo *)&a, mode, uid, gid); - if ((mode & FIO_S_IFMT) != FIO_S_IFDIR) - return inode; - - b.number = a.number; - b.subpart = a.subpart; - b.count = a.count; - - *result = pfsBitmapSearchFreeZone(pfsMount, (pfs_blockinfo *)&a, 0); - if (*result < 0) { - pfsCacheFree(inode); - pfsBitmapFreeBlockSegment(pfsMount, (pfs_blockinfo *)&b); - return NULL; - } - - inode->u.inode->data[1].number = a.number; - inode->u.inode->data[1].subpart = a.subpart; - inode->u.inode->data[1].count = a.count; - - return inode; + pfs_blockinfo_t a, b; + + pfs_mount_t *pfsMount=clink->pfsMount; + u32 j; + u32 i; + pfs_cache_t *inode; + + if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) + { + if (pfsMount->num_subs > clink->u.inode->subpart) + clink->u.inode->subpart++; + else + clink->u.inode->subpart=0; + a.number =0; + a.subpart=clink->u.inode->subpart; + j= (pfsMount->zfree * (u64)100) / pfsMount->total_sector; + i= (pfsMount->free_zone[a.subpart] * (u64)100) / + (pfsMount->blockDev->getSize(pfsMount->fd, a.subpart) >> pfsMount->sector_scale); + if ((i < j) && ((j-i) >= 11)) + a.subpart=pfsGetMaxIndex(pfsMount); + }else{ + a.number=clink->u.inode->inode_block.number; + a.subpart=clink->u.inode->inode_block.subpart; + a.count=clink->u.inode->inode_block.count; + } + a.count=1; + + // Search for a free zone, starting from parent dir inode block + *result=pfsBitmapSearchFreeZone(pfsMount, &a, 2); + if (*result<0) return 0; + inode=pfsCacheGetData(pfsMount, a.subpart, a.number << pfsMount->inode_scale, + PFS_CACHE_FLAG_SEGD | PFS_CACHE_FLAG_NOLOAD, result); + if (inode == NULL) + return NULL; + + // Initialise the inode (which has been allocate blocks specified by a) + pfsInodeFill(inode, (pfs_blockinfo_t*)&a, mode, uid, gid); + if ((mode & FIO_S_IFMT) != FIO_S_IFDIR) + return inode; + + b.number=a.number; + b.subpart=a.subpart; + b.count=a.count; + + *result=pfsBitmapSearchFreeZone(pfsMount, (pfs_blockinfo_t*)&a, 0); + if (*result<0){ + pfsCacheFree(inode); + pfsBitmapFreeBlockSegment(pfsMount, (pfs_blockinfo_t*)&b); + return NULL; + } + + inode->u.inode->data[1].number=a.number; + inode->u.inode->data[1].subpart=a.subpart; + inode->u.inode->data[1].count =a.count; + + return inode; } int pfsCheckAccess(pfs_cache_t *clink, int flags) { - int mode; - - // Bail if trying to write to read-only mount - if ((clink->pfsMount->flags & FIO_MT_RDONLY) && (flags & O_WRONLY)) - return -EROFS; - - if (((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) && - ((clink->u.inode->mode & 0111) == 0)) - mode = 6; - else - mode = 7; - return ((mode & flags) & 7) == flags ? 0 : -EACCES; + int mode; + + // Bail if trying to write to read-only mount + if ((clink->pfsMount->flags & FIO_MT_RDONLY) && (flags & O_WRONLY)) + return -EROFS; + + if (((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) && + ((clink->u.inode->mode & 0111) == 0)) + mode=6; + else + mode=7; + return ((mode & flags) & 7) == flags ? 0 : -EACCES; } -char *pfsSplitPath(char *filename, char *path, int *result) +char* pfsSplitPath(char *filename, char *path, int *result) { - int i = 0; - int j = 0; - - for (i = 0; filename[i] == '/'; i++) - ; - - for (; i < 1024 && filename[i] != '/'; i++) { - if (filename[i] == 0) - break; - if (j < 255) - path[j++] = filename[i]; - } - - if (j < 256) - path[j] = 0; - - while (filename[i] == '/') - if (i < 1024) - i++; - else - break; - if (i < 1024) - return &filename[i]; - - *result = -ENAMETOOLONG; - return 0; + int i=0; + int j=0; + + for (i=0; filename[i] == '/'; i++) + ; + + for (; i<1024 && filename[i] != '/'; i++){ + if (filename[i] == 0) break; + if (j < 255) + path[j++] = filename[i]; + } + + if (j<256) + path[j]=0; + + while (filename[i] == '/') + if (i<1024) + i++; + else + break; + if (i<1024) + return &filename[i]; + + *result=-ENAMETOOLONG; + return 0; } u16 pfsGetMaxIndex(pfs_mount_t *pfsMount) { - u32 max = 0, maxI = 0, i, v; - - for (i = 0; i < pfsMount->num_subs + 1; i++) //enumerate all subs - { - v = (pfsMount->free_zone[i] * (u64)100) / - (pfsMount->blockDev->getSize(pfsMount->fd, i) >> pfsMount->sector_scale); - if (max < v) { - max = v; - maxI = i; - } - } - return maxI; + u32 max=0, maxI=0, i, v; + + for (i=0; i < pfsMount->num_subs + 1; i++) //enumerate all subs + { + v = (pfsMount->free_zone[i] * (u64)100) / + (pfsMount->blockDev->getSize(pfsMount->fd, i) >> pfsMount->sector_scale); + if (max < v) + { + max=v; + maxI=i; + } + } + return maxI; +} + +int pfsAllocZones(pfs_cache_t *clink, int msize, int mode) +{ + pfs_blockpos_t blockpos; + int result=0; + u32 val; + int zsize; + + zsize=clink->pfsMount->zsize; + val=((msize-1 + zsize) & (-zsize)) / zsize; + + if(mode==0) + if (((clink->u.inode->number_blocks-clink->u.inode->number_segdesg) *(u64)zsize) + >= (clink->u.inode->size + msize)) + return 0; + + if((blockpos.inode = pfsBlockGetLastSegmentDescriptorInode(clink, &result))) + { + blockpos.block_offset=blockpos.byte_offset=0; + blockpos.block_segment=clink->u.inode->number_data-1; + val-=pfsBlockExpandSegment(clink, &blockpos, val); + while (val && ((result=pfsBlockAllocNewSegment(clink, &blockpos, val))>=0)){ + val-=result; + result=0; + } + pfsCacheFree(blockpos.inode); + } + return result; +} + +void pfsFreeZones(pfs_cache_t *pfree) +{ + pfs_blockinfo_t b; + int result; + pfs_mount_t *pfsMount = pfree->pfsMount; + pfs_inode_t *inode = pfree->u.inode; + u32 nextsegdesc = 1, limit = inode->number_data, i, j = 0, zones; + pfs_blockinfo_t *bi; + pfs_cache_t *clink; + + zones = (u32)(inode->size / pfsMount->zsize); + if(inode->size % pfsMount->zsize) + zones++; + if(inode->number_segdesg + zones == inode->number_blocks) + return; + + j = zones; + b.number = 0; + clink = pfsCacheUsedAdd(pfree); + + // iterate through each of the block segments used by the inode + for (i = 1; i < limit && j; i++) + { + if(pfsFixIndex(i) == 0) + { + if ((clink = pfsBlockGetNextSegment(clink, &result)) == 0) + return; + + nextsegdesc++; + } + else + if(j < clink->u.inode->data[pfsFixIndex(i)].count) + { + clink->u.inode->data[pfsFixIndex(i)].count -= j; + b.subpart = clink->u.inode->data[pfsFixIndex(i)].subpart; + b.count = j; + b.number = clink->u.inode->data[pfsFixIndex(i)].number + + clink->u.inode->data[pfsFixIndex(i)].count; + j = 0; + clink->flags |= PFS_CACHE_FLAG_DIRTY; + } + else + j -= clink->u.inode->data[pfsFixIndex(i)].count; + } + + pfree->u.inode->number_data = i; + pfree->u.inode->number_blocks = zones + nextsegdesc; + pfree->u.inode->number_segdesg = nextsegdesc; + pfree->u.inode->last_segment.number = clink->u.inode->data[0].number; + pfree->u.inode->last_segment.subpart= clink->u.inode->data[0].subpart; + pfree->u.inode->last_segment.count = clink->u.inode->data[0].count; + pfree->flags |= PFS_CACHE_FLAG_DIRTY; + + if (b.number) + pfsBitmapFreeBlockSegment(pfsMount, &b); + + while(i < limit) + { + if (pfsFixIndex(i) == 0) + { + if((clink = pfsBlockGetNextSegment(clink, &result)) == 0) + return; + } + bi = &clink->u.inode->data[pfsFixIndex(i++)]; + pfsBitmapFreeBlockSegment(pfsMount, bi); + pfsCacheMarkClean(pfsMount, bi->subpart, bi->number<inode_scale, + (bi->number+bi->count)<inode_scale); + } + + pfsCacheFree(clink); } diff --git a/modules/hdd/libpfs/src/inode.c b/modules/hdd/libpfs/src/inode.c index b59aaa9d6..49b4a6bbc 100644 --- a/modules/hdd/libpfs/src/inode.c +++ b/modules/hdd/libpfs/src/inode.c @@ -7,14 +7,12 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS low-level inode manipulation routines */ #include #include #include -#include #include "pfs-opt.h" #include "libpfs.h" @@ -24,104 +22,104 @@ extern u32 pfsMetaSize; /////////////////////////////////////////////////////////////////////////////// // Function definitions -void pfsInodePrint(pfs_inode *inode) +void pfsInodePrint(pfs_inode_t *inode) { - PFS_PRINTF(PFS_DRV_NAME ": pfsInodePrint: Checksum = 0x%lX, Magic = 0x%lX\n", inode->checksum, inode->magic); - PFS_PRINTF(PFS_DRV_NAME ": Mode = 0x%X, attr = 0x%X\n", inode->mode, inode->attr); - PFS_PRINTF(PFS_DRV_NAME ": size = 0x%08lX%08lX\n", (u32)(inode->size >> 32), (u32)(inode->size)); + PFS_PRINTF(PFS_DRV_NAME": pfsInodePrint: Checksum = 0x%lX, Magic = 0x%lX\n", inode->checksum, inode->magic); + PFS_PRINTF(PFS_DRV_NAME": Mode = 0x%X, attr = 0x%X\n", inode->mode, inode->attr); + PFS_PRINTF(PFS_DRV_NAME": size = 0x%08lX%08lX\n", (u32)(inode->size >> 32), (u32)(inode->size)); } -int pfsInodeCheckSum(pfs_inode *inode) +int pfsInodeCheckSum(pfs_inode_t *inode) { - u32 *ptr = (u32 *)inode; - u32 sum = 0; - int i; + u32 *ptr=(u32 *)inode; + u32 sum=0; + int i; - for (i = 1; i < 256; i++) - sum += ptr[i]; - return sum; + for(i=1; i < 256; i++) + sum+=ptr[i]; + return sum; } pfs_cache_t *pfsInodeGetData(pfs_mount_t *pfsMount, u16 sub, u32 inode, int *result) { - return pfsCacheGetData(pfsMount, sub, inode << pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGD, result); + return pfsCacheGetData(pfsMount, sub, inode << pfsMount->inode_scale, + PFS_CACHE_FLAG_SEGD, result); } void pfsInodeSetTime(pfs_cache_t *clink) -{ // set the inode time's in cache - pfsGetTime(&clink->u.inode->mtime); - memcpy(&clink->u.inode->ctime, &clink->u.inode->mtime, sizeof(pfs_datetime)); - memcpy(&clink->u.inode->atime, &clink->u.inode->mtime, sizeof(pfs_datetime)); - clink->flags |= PFS_CACHE_FLAG_DIRTY; +{ // set the inode time's in cache + pfsGetTime(&clink->u.inode->mtime); + memcpy(&clink->u.inode->ctime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); + memcpy(&clink->u.inode->atime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); + clink->flags|=PFS_CACHE_FLAG_DIRTY; } int pfsInodeSync(pfs_blockpos_t *blockpos, u64 size, u32 used_segments) { - int result = 0; - u32 i; - u16 count; + int result=0; + u32 i; + u16 count; - for (i = pfsBlockSyncPos(blockpos, size); i;) { - count = blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)].count; + for(i=pfsBlockSyncPos(blockpos, size); i; ) + { + count=blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)].count; - i += blockpos->block_offset; + i+=blockpos->block_offset; - if (i < count) { - blockpos->block_offset = i; - break; - } + if (i < count){ + blockpos->block_offset=i; + break; + } - i -= count; + i-=count; - if (blockpos->block_segment + 1 == used_segments) { - blockpos->block_offset = count; - if (i || blockpos->byte_offset) { - PFS_PRINTF(PFS_DRV_NAME ": panic: fp exceeds file.\n"); - return -EINVAL; - } - } else { - blockpos->block_offset = 0; - blockpos->block_segment++; - } + if (blockpos->block_segment + 1 == used_segments) + { + blockpos->block_offset=count; + if (i || blockpos->byte_offset){ + PFS_PRINTF(PFS_DRV_NAME": panic: fp exceeds file.\n"); + return -EINVAL; + } + }else{ + blockpos->block_offset=0; + blockpos->block_segment++; + } - if (pfsFixIndex(blockpos->block_segment)) - continue; + if (pfsFixIndex(blockpos->block_segment)) + continue; - if ((blockpos->inode = pfsBlockGetNextSegment(blockpos->inode, &result)) == 0) - break; + if ((blockpos->inode = pfsBlockGetNextSegment(blockpos->inode, &result)) == 0) + break; - i++; - } + i++; + } - return result; + return result; } pfs_cache_t *pfsGetDentriesChunk(pfs_blockpos_t *position, int *result) { - pfs_blockinfo *bi; - pfs_mount_t *pfsMount = position->inode->pfsMount; + pfs_blockinfo_t *bi; + pfs_mount_t *pfsMount=position->inode->pfsMount; - bi = &position->inode->u.inode->data[pfsFixIndex(position->block_segment)]; + bi = &position->inode->u.inode->data[pfsFixIndex(position->block_segment)]; - return pfsCacheGetData(pfsMount, bi->subpart, - ((bi->number + position->block_offset) << pfsMount->inode_scale) + - position->byte_offset / pfsMetaSize, - PFS_CACHE_FLAG_NOTHING, result); + return pfsCacheGetData(pfsMount, bi->subpart, + ((bi->number + position->block_offset) << pfsMount->inode_scale) + + position->byte_offset / pfsMetaSize, PFS_CACHE_FLAG_NOTHING, result); } pfs_cache_t *pfsGetDentriesAtPos(pfs_cache_t *clink, u64 position, int *offset, int *result) { - pfs_blockpos_t blockpos; - pfs_cache_t *r; - *result = pfsBlockInitPos(clink, &blockpos, position); - if (*result) - return 0; + pfs_blockpos_t blockpos; + pfs_cache_t *r; + *result=pfsBlockInitPos(clink, &blockpos, position); + if (*result) return 0; - *offset = blockpos.byte_offset % pfsMetaSize; + *offset=blockpos.byte_offset % pfsMetaSize; - r = pfsGetDentriesChunk(&blockpos, result); - pfsCacheFree(blockpos.inode); + r=pfsGetDentriesChunk(&blockpos, result); + pfsCacheFree(blockpos.inode); - return r; + return r; } diff --git a/modules/hdd/libpfs/src/journal.c b/modules/hdd/libpfs/src/journal.c index 8f9c83fef..c72d2babb 100644 --- a/modules/hdd/libpfs/src/journal.c +++ b/modules/hdd/libpfs/src/journal.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS metadata journal related routines */ @@ -30,114 +29,118 @@ pfs_journal_t pfsJournalBuf; int pfsJournalChecksum(void *header) { - u32 *ptr = (u32 *)header; - u32 sum = 0; - int i; - for (i = 2; i < 256; i++) - sum += ptr[i]; - return sum & 0xFFFF; + u32 *ptr=(u32 *)header; + u32 sum=0; + int i; + for(i=2; i < 256; i++) + sum+=ptr[i]; + return sum & 0xFFFF; } void pfsJournalWrite(pfs_mount_t *pfsMount, pfs_cache_t *clink, u32 pfsCacheNumBuffers) { - u32 i = 0; - u32 logSector = 2; - - for (i = 0; i < pfsCacheNumBuffers; i++) { - if ((clink[i].flags & PFS_CACHE_FLAG_DIRTY) && clink[i].pfsMount == pfsMount) { - if (clink[i].flags & (PFS_CACHE_FLAG_SEGD | PFS_CACHE_FLAG_SEGI)) - clink[i].u.inode->checksum = pfsInodeCheckSum(clink[i].u.inode); - pfsJournalBuf.log[pfsJournalBuf.num].sector = clink[i].sector << pfsBlockSize; - pfsJournalBuf.log[pfsJournalBuf.num].sub = clink[i].sub; - pfsJournalBuf.log[pfsJournalBuf.num].logSector = logSector; - pfsJournalBuf.num += 1; - } - logSector += 2; - } - - if (pfsMount->blockDev->transfer(pfsMount->fd, clink->u.inode, 0, - (pfsMount->log.number << pfsMount->sector_scale) + 2, pfsCacheNumBuffers * 2, - PFS_IO_MODE_WRITE) >= 0) - pfsJournalFlush(pfsMount); + u32 i=0; + u32 logSector=2; + + for(i=0; i checksum=pfsInodeCheckSum(clink[i].u.inode); + pfsJournalBuf.log[pfsJournalBuf.num].sector = clink[i].sector << pfsBlockSize; + pfsJournalBuf.log[pfsJournalBuf.num].sub = clink[i].sub; + pfsJournalBuf.log[pfsJournalBuf.num].logSector = logSector; + pfsJournalBuf.num+=1; + } + logSector+=2; + } + + if(pfsMount->blockDev->transfer(pfsMount->fd, clink->u.inode, 0, + (pfsMount->log.number << pfsMount->sector_scale) + 2, pfsCacheNumBuffers*2, + PFS_IO_MODE_WRITE)>=0) + pfsJournalFlush(pfsMount); } int pfsJournalReset(pfs_mount_t *pfsMount) { - int rv; + int rv; - memset(&pfsJournalBuf, 0, sizeof(pfs_journal_t)); - pfsJournalBuf.magic = PFS_JOUNRNAL_MAGIC; + memset(&pfsJournalBuf, 0, sizeof(pfs_journal_t)); + pfsJournalBuf.magic=PFS_JOUNRNAL_MAGIC; - pfsMount->blockDev->flushCache(pfsMount->fd); + pfsMount->blockDev->flushCache(pfsMount->fd); - rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, - (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE); + rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, + (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE); - pfsMount->blockDev->flushCache(pfsMount->fd); - return rv; + pfsMount->blockDev->flushCache(pfsMount->fd); + return rv; } int pfsJournalResetThis(pfs_block_device_t *blockDev, int fd, u32 sector) { - memset(&pfsJournalBuf, 0, sizeof(pfs_journal_t)); - pfsJournalBuf.magic = PFS_JOUNRNAL_MAGIC; - return blockDev->transfer(fd, &pfsJournalBuf, 0, sector, 2, 1); + memset(&pfsJournalBuf, 0, sizeof(pfs_journal_t)); + pfsJournalBuf.magic=PFS_JOUNRNAL_MAGIC; + return blockDev->transfer(fd, &pfsJournalBuf, 0, sector, 2, 1); } int pfsJournalFlush(pfs_mount_t *pfsMount) -{ // this write any thing that in are journal buffer :) - int rv; +{// this write any thing that in are journal buffer :) + int rv; - pfsMount->blockDev->flushCache(pfsMount->fd); + pfsMount->blockDev->flushCache(pfsMount->fd); - pfsJournalBuf.checksum = pfsJournalChecksum(&pfsJournalBuf); + pfsJournalBuf.checksum=pfsJournalChecksum(&pfsJournalBuf); - rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, - (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE); + rv=pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, + (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE); - pfsMount->blockDev->flushCache(pfsMount->fd); - return rv; + pfsMount->blockDev->flushCache(pfsMount->fd); + return rv; } int pfsJournalRestore(pfs_mount_t *pfsMount) { - int rv; - int result; - pfs_cache_t *clink; - u32 i; - - // Read journal buffer from disk - rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, - (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_READ); - - if (rv || (pfsJournalBuf.magic != PFS_JOUNRNAL_MAGIC) || - (pfsJournalBuf.checksum != (u16)pfsJournalChecksum(&pfsJournalBuf))) { - PFS_PRINTF(PFS_DRV_NAME ": Error: cannot read log/invalid log\n"); - return pfsJournalReset(pfsMount); - } - - if (pfsJournalBuf.num == 0) { - return pfsJournalReset(pfsMount); - } - - clink = pfsCacheAllocClean(&result); - if (!clink) - return result; - - for (i = 0; i < pfsJournalBuf.num; i++) { - PFS_PRINTF(PFS_DRV_NAME ": Log overwrite %d:%08lx\n", pfsJournalBuf.log[i].sub, pfsJournalBuf.log[i].sector); - - // Read data in from log section on disk into cache buffer - rv = pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, 0, - (pfsMount->log.number << pfsMount->sector_scale) + pfsJournalBuf.log[i].logSector, 2, - PFS_IO_MODE_READ); - - // Write from cache buffer into destination location on disk - if (!rv) - pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, pfsJournalBuf.log[i].sub, - pfsJournalBuf.log[i].sector, 2, PFS_IO_MODE_WRITE); - } - - pfsCacheFree(clink); - return pfsJournalReset(pfsMount); + int rv; + int result; + pfs_cache_t *clink; + u32 i; + + // Read journal buffer from disk + rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, + (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_READ); + + if(rv || (pfsJournalBuf.magic != PFS_JOUNRNAL_MAGIC) || + (pfsJournalBuf.checksum != (u16)pfsJournalChecksum(&pfsJournalBuf))) + { + PFS_PRINTF(PFS_DRV_NAME": Error: cannot read log/invalid log\n"); + return pfsJournalReset(pfsMount); + } + + if(pfsJournalBuf.num == 0) + { + return pfsJournalReset(pfsMount); + } + + clink = pfsCacheAllocClean(&result); + if(!clink) + return result; + + for(i = 0; i < pfsJournalBuf.num; i++) + { + PFS_PRINTF(PFS_DRV_NAME": Log overwrite %d:%08lx\n", pfsJournalBuf.log[i].sub, pfsJournalBuf.log[i].sector); + + // Read data in from log section on disk into cache buffer + rv = pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, 0, + (pfsMount->log.number << pfsMount->sector_scale) + pfsJournalBuf.log[i].logSector, 2, + PFS_IO_MODE_READ); + + // Write from cache buffer into destination location on disk + if(!rv) + pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, pfsJournalBuf.log[i].sub, + pfsJournalBuf.log[i].sector, 2, PFS_IO_MODE_WRITE); + } + + pfsCacheFree(clink); + return pfsJournalReset(pfsMount); } diff --git a/modules/hdd/libpfs/src/misc.c b/modules/hdd/libpfs/src/misc.c index 6ab9757be..b3a59b16f 100644 --- a/modules/hdd/libpfs/src/misc.c +++ b/modules/hdd/libpfs/src/misc.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # Miscellaneous routines */ @@ -17,6 +16,7 @@ #include #include #include +#include #include #include @@ -28,185 +28,194 @@ void *pfsAllocMem(int size) { - int intrStat; - void *mem; + int intrStat; + void *mem; - CpuSuspendIntr(&intrStat); - mem = AllocSysMemory(ALLOC_FIRST, size, NULL); - CpuResumeIntr(intrStat); + CpuSuspendIntr(&intrStat); + mem = AllocSysMemory(ALLOC_FIRST, size, NULL); + CpuResumeIntr(intrStat); - return mem; + return mem; } void pfsFreeMem(void *buffer) { - int OldState; + int OldState; - CpuSuspendIntr(&OldState); - FreeSysMemory(buffer); - CpuResumeIntr(OldState); + CpuSuspendIntr(&OldState); + FreeSysMemory(buffer); + CpuResumeIntr(OldState); } -int pfsGetTime(pfs_datetime *tm) +int pfsGetTime(pfs_datetime_t *tm) { - sceCdCLOCK cdtime; - static pfs_datetime timeBuf = { - 0, 0x0D, 0x0E, 0x0A, 0x0D, 1, 2003 // used if can not get time... - }; - - if (sceCdReadClock(&cdtime) != 0 && cdtime.stat == 0) { - timeBuf.sec = btoi(cdtime.second); - timeBuf.min = btoi(cdtime.minute); - timeBuf.hour = btoi(cdtime.hour); - timeBuf.day = btoi(cdtime.day); - timeBuf.month = btoi(cdtime.month & 0x7F); //The old CDVDMAN sceCdReadClock() function does not automatically file off the highest bit. - timeBuf.year = btoi(cdtime.year) + 2000; - } - memcpy(tm, &timeBuf, sizeof(pfs_datetime)); - return 0; + sceCdCLOCK cdtime; + static pfs_datetime_t timeBuf={ + 0, 0x0D, 0x0E, 0x0A, 0x0D, 1, 2003 // used if can not get time... + }; + + if(sceCdReadClock(&cdtime)!=0 && cdtime.stat==0) + { + timeBuf.sec=btoi(cdtime.second); + timeBuf.min=btoi(cdtime.minute); + timeBuf.hour=btoi(cdtime.hour); + timeBuf.day=btoi(cdtime.day); + timeBuf.month=btoi(cdtime.month & 0x7F); //The old CDVDMAN sceCdReadClock() function does not automatically file off the highest bit. + timeBuf.year=btoi(cdtime.year) + 2000; + } + memcpy(tm, &timeBuf, sizeof(pfs_datetime_t)); + return 0; } -int pfsFsckStat(pfs_mount_t *pfsMount, pfs_super_block *superblock, - u32 stat, int mode) -{ // mode 0=set flag, 1=remove flag, else check stat - - if (pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_BLOCKSIZE, 1, - PFS_IO_MODE_READ) == 0) { - switch (mode) { - case PFS_MODE_SET_FLAG: - superblock->pfsFsckStat |= stat; - break; - case PFS_MODE_REMOVE_FLAG: - superblock->pfsFsckStat &= ~stat; - break; - default /*PFS_MODE_CHECK_FLAG*/: - return 0 < (superblock->pfsFsckStat & stat); - } - pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_BLOCKSIZE, 1, - PFS_IO_MODE_WRITE); - pfsMount->blockDev->flushCache(pfsMount->fd); - } - return 0; +int pfsFsckStat(pfs_mount_t *pfsMount, pfs_super_block_t *superblock, + u32 stat, int mode) +{ // mode 0=set flag, 1=remove flag, else check stat + + if(pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, + PFS_IO_MODE_READ)==0) + { + switch(mode) + { + case PFS_MODE_SET_FLAG: + superblock->pfsFsckStat|=stat; + break; + case PFS_MODE_REMOVE_FLAG: + superblock->pfsFsckStat&=~stat; + break; + default/*PFS_MODE_CHECK_FLAG*/: + return 0 < (superblock->pfsFsckStat & stat); + } + pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, + PFS_IO_MODE_WRITE); + pfsMount->blockDev->flushCache(pfsMount->fd); + } + return 0; } -void pfsPrintBitmap(u32 *bitmap) -{ - u32 i, j; - char a[48 + 1], b[16 + 1]; - - b[16] = 0; - for (i = 0; i < 32; i++) { - memset(a, 0, 49); - for (j = 0; j < 16; j++) { - char *c = (char *)bitmap + j + i * 16; - - sprintf(a + j * 3, "%02x ", *c); - b[j] = ((*c >= 0) && (look_ctype_table(*c) & 0x17)) ? - *c : - '.'; - } - PFS_PRINTF("%s%s\n", a, b); - } +void pfsPrintBitmap(const u32 *bitmap) { + u32 i, j; + char a[48+1], b[16+1]; + + b[16]=0; + for (i=0; i < 32; i++){ + memset(a, 0, 49); + for (j=0; j < 16; j++){ + const char *c=(const char*)bitmap+j+i*16; + + sprintf(a+j*3, "%02x ", *c); + b[j] = ((*c>=0) && (isgraph(*c))) ? + *c : '.'; + } + PFS_PRINTF("%s%s\n", a, b); + } } int pfsGetScale(int num, int size) { - int scale = 0; + int scale = 0; - while ((size << scale) != num) - scale++; + while((size << scale) != num) + scale++; - return scale; + return scale; } u32 pfsFixIndex(u32 index) { - if (index < 114) - return index; + if(index < 114) + return index; - index -= 114; - return index % 123; + index -= 114; + return index % 123; } /////////////////////////////////////////////////////////////////////////////// // Functions to work with hdd.irx -#define NUM_SUPPORTED_DEVICES 1 +static int pfsHddTransfer(int fd, void *buffer, u32 sub/*0=main 1+=subs*/, u32 sector, + u32 size/* in sectors*/, u32 mode); +static u32 pfsHddGetSubCount(int fd); +static u32 pfsHddGetPartSize(int fd, u32 sub/*0=main 1+=subs*/); +static void pfsHddSetPartError(int fd); +static int pfsHddFlushCache(int fd); + +#define NUM_SUPPORTED_DEVICES 1 pfs_block_device_t pfsBlockDeviceCallTable[NUM_SUPPORTED_DEVICES] = { - { - "hdd", - pfsHddTransfer, - pfsHddGetSubCount, - pfsHddGetPartSize, - pfsHddSetPartError, - pfsHddFlushCache, - }}; + { + "hdd", + &pfsHddTransfer, + &pfsHddGetSubCount, + &pfsHddGetPartSize, + &pfsHddSetPartError, + &pfsHddFlushCache, + } +}; pfs_block_device_t *pfsGetBlockDeviceTable(const char *name) { - char *end; - char devname[32]; - char *tmp; - u32 len; - int i; - - while (name[0] == ' ') - name++; - - end = strchr(name, ':'); - if (!end) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Unknown block device '%s'\n", name); - return NULL; - } - - len = (u32)end - (u32)name; - strncpy(devname, name, len); - devname[len] = '\0'; - - // Loop until digit is found, then terminate string at that digit. - // Should then have just the device name left, minus any front spaces or trailing digits. - tmp = devname; - while (!(look_ctype_table(tmp[0]) & 0x04)) - tmp++; - tmp[0] = '\0'; - - for (i = 0; i < NUM_SUPPORTED_DEVICES; i++) - if (!strcmp(pfsBlockDeviceCallTable[i].devName, devname)) - return &pfsBlockDeviceCallTable[i]; - - return NULL; + char *end; + char devname[32]; + char *tmp; + u32 len; + int i; + + while(name[0] == ' ') + name++; + + end = strchr(name, ':'); + if(!end) { + PFS_PRINTF(PFS_DRV_NAME": Error: Unknown block device '%s'\n", name); + return NULL; + } + + len = (u32)end - (u32)name; + strncpy(devname, name, len); + devname[len] = '\0'; + + // Loop until digit is found, then terminate string at that digit. + // Should then have just the device name left, minus any front spaces or trailing digits. + tmp = devname; + while(!(isdigit(tmp[0]))) + tmp++; + tmp[0] = '\0'; + + for(i = 0; i < NUM_SUPPORTED_DEVICES; i++) + if(!strcmp(pfsBlockDeviceCallTable[i].devName, devname)) + return &pfsBlockDeviceCallTable[i]; + + return NULL; } -int pfsHddTransfer(int fd, void *buffer, u32 sub /*0=main 1+=subs*/, u32 sector, - u32 size /* in sectors*/, u32 mode) +static int pfsHddTransfer(int fd, void *buffer, u32 sub/*0=main 1+=subs*/, u32 sector, + u32 size/* in sectors*/, u32 mode) { - hddIoctl2Transfer_t t; + hddIoctl2Transfer_t t; - t.sub = sub; - t.sector = sector; - t.size = size; - t.mode = mode; - t.buffer = buffer; + t.sub=sub; + t.sector=sector; + t.size=size; + t.mode=mode; + t.buffer=buffer; - return ioctl2(fd, APA_IOCTL2_TRANSFER_DATA, &t, 0, NULL, 0); + return ioctl2(fd, HIOCTRANSFER, &t, 0, NULL, 0); } -u32 pfsHddGetSubCount(int fd) +static u32 pfsHddGetSubCount(int fd) { - return ioctl2(fd, APA_IOCTL2_NUMBER_OF_SUBS, NULL, 0, NULL, 0); + return ioctl2(fd, HIOCNSUB, NULL, 0, NULL, 0); } -u32 pfsHddGetPartSize(int fd, u32 sub /*0=main 1+=subs*/) -{ // of a partition - return ioctl2(fd, APA_IOCTL2_GETSIZE, &sub, 0, NULL, 0); +static u32 pfsHddGetPartSize(int fd, u32 sub/*0=main 1+=subs*/) +{ // of a partition + return ioctl2(fd, HIOCGETSIZE, &sub, 0, NULL, 0); } -void pfsHddSetPartError(int fd) +static void pfsHddSetPartError(int fd) { - ioctl2(fd, APA_IOCTL2_SET_PART_ERROR, NULL, 0, NULL, 0); + ioctl2(fd, HIOCSETPARTERROR, NULL, 0, NULL, 0); } -int pfsHddFlushCache(int fd) +static int pfsHddFlushCache(int fd) { - return ioctl2(fd, APA_IOCTL2_FLUSH_CACHE, NULL, 0, NULL, 0); + return ioctl2(fd,HIOCFLUSH, NULL, 0, NULL, 0); } diff --git a/modules/hdd/libpfs/src/super.c b/modules/hdd/libpfs/src/super.c index d065b71f9..f71c01f17 100644 --- a/modules/hdd/libpfs/src/super.c +++ b/modules/hdd/libpfs/src/super.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS superblock manipulation routines */ @@ -19,35 +18,36 @@ #include "pfs-opt.h" #include "libpfs.h" -int pfsBlockSize = 1; // block size(in sectors(512) ) +int pfsBlockSize = 1;// block size(in sectors(512) ) u32 pfsMetaSize = 1024; // size of each metadata structure int pfsCheckZoneSize(u32 zone_size) { - if ((zone_size & (zone_size - 1)) || (zone_size < (2 * 1024)) || (zone_size > (128 * 1024))) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Invalid zone size\n"); - return 0; - } + if((zone_size & (zone_size - 1)) || (zone_size < (2 * 1024)) || (zone_size > (128 * 1024))) + { + PFS_PRINTF(PFS_DRV_NAME": Error: Invalid zone size\n"); + return 0; + } - return 1; + return 1; } // Returns the number of sectors (512 byte units) which will be used // for bitmaps, given the zone size and partition size u32 pfsGetBitmapSizeSectors(int zoneScale, u32 partSize) { - int w, zones = partSize / (1 << zoneScale); + int w, zones = partSize / (1 << zoneScale); - w = (zones & 7); - zones = zones / 8 + w; + w = (zones & 7); + zones = zones / 8 + w; - w = (zones & 511); - return zones / 512 + w; + w = (zones & 511); + return zones / 512 + w; } // Returns the number of blocks/zones which will be used for bitmaps u32 pfsGetBitmapSizeBlocks(int scale, u32 mainsize) { - u32 a = pfsGetBitmapSizeSectors(scale, mainsize); - return a / (1 << scale) + ((a % (1 << scale)) > 0); + u32 a=pfsGetBitmapSizeSectors(scale, mainsize); + return a / (1<0); } diff --git a/modules/hdd/libpfs/src/superWrite.c b/modules/hdd/libpfs/src/superWrite.c index 5d39b4831..4a5343cda 100644 --- a/modules/hdd/libpfs/src/superWrite.c +++ b/modules/hdd/libpfs/src/superWrite.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS superblock (write) manipulation routines */ @@ -25,220 +24,230 @@ extern u32 pfsMetaSize; // Formats a partition (main or sub) by filling with fragment pattern and setting the bitmap accordingly int pfsFormatSub(pfs_block_device_t *blockDev, int fd, u32 sub, u32 reserved, u32 scale, u32 fragment) { - pfs_cache_t *cache; - int i; - u32 sector, count, size, *b; - int result = 0; - - size = blockDev->getSize(fd, sub); - sector = 1 << scale; - count = pfsGetBitmapSizeSectors(scale, size); - if (reserved >= 2) - sector += 0x2000; - reserved += pfsGetBitmapSizeBlocks(scale, size); - - if ((cache = pfsCacheAllocClean(&result))) { - // fill with fragment pattern - for (i = 127; i >= 0; i--) - cache->u.bitmap[i] = fragment; - - // set as allocated the sectors up to reserved, for the first part of the bitmap - // this will mark the area the bitmaps themselves occupy as used - for (i = 0, b = cache->u.bitmap; i < reserved; i++) { - if (i && ((i & 0x1F) == 0)) - b++; - *b |= 1 << (i & 0x1F); - } - - PFS_PRINTF(PFS_DRV_NAME ": Format sub: sub = %ld, sector start = %ld, ", sub, sector); - - // set the rest of the bitmap to the fragment - while (count-- && ((result = blockDev->transfer(fd, cache->u.bitmap, sub, sector++, 1, 1)) >= 0)) - for (i = 127; i >= 0; i--) - cache->u.bitmap[i] = fragment; - - PFS_PRINTF("sector end = %ld\n", sector - 1); - - pfsCacheFree(cache); - } - return result; + pfs_cache_t *cache; + int i; + u32 sector, count, size, *b; + int result = 0; + + size = blockDev->getSize(fd, sub); + sector = 1 << scale; + count = pfsGetBitmapSizeSectors(scale, size); + if (reserved>=2) + sector+=0x2000; + reserved += pfsGetBitmapSizeBlocks(scale, size); + + if((cache = pfsCacheAllocClean(&result))) + { + // fill with fragment pattern + for (i=127; i>=0; i--) + cache->u.bitmap[i]=fragment; + + // set as allocated the sectors up to reserved, for the first part of the bitmap + // this will mark the area the bitmaps themselves occupy as used + for (i=0, b=cache->u.bitmap; itransfer(fd, cache->u.bitmap, sub, sector++, 1, 1))>=0)) + for (i=127; i>=0; i--) + cache->u.bitmap[i]=fragment; + + PFS_PRINTF("sector end = %ld\n", sector - 1); + + pfsCacheFree(cache); + } + return result; } // Formats a partition and all sub-partitions with PFS int pfsFormat(pfs_block_device_t *blockDev, int fd, int zonesize, int fragment) { - int result, result2; - pfs_cache_t *clink, *cache; - pfs_super_block *sb; - int scale; - u32 i, mainsize, subnumber = blockDev->getSubNumber(fd); - - mainsize = blockDev->getSize(fd, 0); - if (pfsCheckZoneSize(zonesize) == 0) - return -EINVAL; - - scale = pfsGetScale(zonesize, 512); - - if ((clink = pfsCacheAllocClean(&result))) { - sb = clink->u.superblock; - memset(sb, 0, pfsMetaSize); - sb->magic = PFS_SUPER_MAGIC; - sb->version = 3; - sb->unknown1 = 0x201; - sb->zone_size = zonesize; - sb->num_subs = subnumber; - sb->log.number = pfsGetBitmapSizeBlocks(scale, mainsize) + (0x2000 >> scale) + 1; - sb->log.count = 0x20000 / zonesize ? 0x20000 / zonesize : 1; - - PFS_PRINTF(PFS_DRV_NAME ": Format: log.number = %ld, log.count = %d\n", sb->log.number << scale, sb->log.count); - - sb->root.count = 1; - sb->root.number = sb->log.number + sb->log.count; - if ((result = pfsJournalResetThis(blockDev, fd, sb->log.number << scale)) >= 0) { - if ((cache = pfsCacheAllocClean(&result2))) { - pfsFillSelfAndParentDentries(cache, &sb->root, &sb->root); - result2 = blockDev->transfer(fd, cache->u.dentry, 0, (sb->root.number + 1) << scale, - 1 << pfsBlockSize, 1); - if (result2 == 0) { - // setup root directory - pfsInodeFill(cache, &sb->root, 0x11FF, 0, 0); - cache->u.inode->data[1].subpart = 0; - cache->u.inode->data[1].number = sb->root.number + 1; - cache->u.inode->data[1].count = 1; - cache->u.inode->checksum = pfsInodeCheckSum(cache->u.inode); - - result2 = blockDev->transfer(fd, cache->u.inode, 0, sb->root.number << scale, - 1 << pfsBlockSize, 1); - } - - pfsCacheFree(cache); - } - - if ((result = result2) >= 0) { - for (i = 0; i < subnumber + 1; i++) - if ((result = pfsFormatSub(blockDev, fd, i, i ? 1 : (0x2000 >> scale) + sb->log.count + 3, scale, fragment)) < 0) - break; - - if ((result == 0) && ((result = blockDev->transfer(fd, sb, 0, PFS_SUPER_BACKUP_SECTOR, 1, 1)) == 0)) - result = blockDev->transfer(fd, sb, 0, PFS_SUPER_SECTOR, 1, 1); - } - } - - pfsCacheFree(clink); - blockDev->flushCache(fd); - } - return result; + int result, result2; + pfs_cache_t *clink, *cache; + pfs_super_block_t *sb; + int scale; + u32 i, mainsize, subnumber = blockDev->getSubNumber(fd); + + mainsize=blockDev->getSize(fd, 0); + if(pfsCheckZoneSize(zonesize) == 0) + return -EINVAL; + + scale = pfsGetScale(zonesize, 512); + + if((clink=pfsCacheAllocClean(&result))) + { + sb = clink->u.superblock; + memset(sb, 0, pfsMetaSize); + sb->magic = PFS_SUPER_MAGIC; + sb->version = 3; + sb->unknown1 = 0x201; + sb->zone_size = zonesize; + sb->num_subs = subnumber; + sb->log.number = pfsGetBitmapSizeBlocks(scale, mainsize) + (0x2000 >> scale) + 1; + sb->log.count = 0x20000 / zonesize ? 0x20000 / zonesize : 1; + + PFS_PRINTF(PFS_DRV_NAME": Format: log.number = %ld, log.count = %d\n", sb->log.number << scale, sb->log.count); + + sb->root.count = 1; + sb->root.number = sb->log.number + sb->log.count; + if((result = pfsJournalResetThis(blockDev, fd, sb->log.number<= 0) + { + if((cache = pfsCacheAllocClean(&result2))) + { + pfsFillSelfAndParentDentries(cache, &sb->root, &sb->root); + result2 = blockDev->transfer(fd, cache->u.dentry, 0, (sb->root.number+1) << scale, + 1 << pfsBlockSize, 1); + if(result2 == 0) + { + // setup root directory + pfsInodeFill(cache, &sb->root, 0x11FF, 0, 0); + cache->u.inode->data[1].subpart = 0; + cache->u.inode->data[1].number = sb->root.number + 1; + cache->u.inode->data[1].count = 1; + cache->u.inode->checksum = pfsInodeCheckSum(cache->u.inode); + + result2=blockDev->transfer(fd, cache->u.inode, 0, sb->root.number << scale, + 1 << pfsBlockSize, 1); + } + + pfsCacheFree(cache); + } + + if((result = result2) >= 0) + { + for (i=0; i < subnumber+1; i++) + if((result=pfsFormatSub(blockDev, fd, i, i ? 1 : (0x2000 >> scale) + + sb->log.count + 3, scale, fragment))<0) + break; + + if((result == 0) && ((result = blockDev->transfer(fd, sb, 0, PFS_SUPER_BACKUP_SECTOR, 1, 1))==0)) + result = blockDev->transfer(fd, sb, 0, PFS_SUPER_SECTOR, 1, 1); + } + } + + pfsCacheFree(clink); + blockDev->flushCache(fd); + } + return result; } // Formats sub partitions which are added to the main partition after it is initially // formatted with PFS -int pfsUpdateSuperBlock(pfs_mount_t *pfsMount, pfs_super_block *superblock, u32 sub) +int pfsUpdateSuperBlock(pfs_mount_t *pfsMount, pfs_super_block_t *superblock, u32 sub) { - u32 scale; - u32 i; - u32 count; - int rv; + u32 scale; + u32 i; + u32 count; + int rv; - scale = pfsGetScale(superblock->zone_size, 512); - count = superblock->num_subs + sub + 1; + scale = pfsGetScale(superblock->zone_size, 512); + count = superblock->num_subs + sub + 1; - for (i = superblock->num_subs + 1; i < count; i++) { - rv = pfsFormatSub(pfsMount->blockDev, pfsMount->fd, i, 1, scale, 0); - if (rv < 0) - return rv; - } + for(i = superblock->num_subs + 1; i < count; i++) + { + rv = pfsFormatSub(pfsMount->blockDev, pfsMount->fd, i, 1, scale, 0); + if(rv < 0) + return rv; + } - superblock->num_subs = sub; + superblock->num_subs = sub; - // Write superblock, then write backup - rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_WRITE); - if (!rv) - rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_BACKUP_SECTOR, 1, PFS_IO_MODE_WRITE); + // Write superblock, then write backup + rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_WRITE); + if(!rv) + rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_BACKUP_SECTOR, 1, PFS_IO_MODE_WRITE); - pfsMount->blockDev->flushCache(pfsMount->fd); + pfsMount->blockDev->flushCache(pfsMount->fd); - return rv; + return rv; } int pfsMountSuperBlock(pfs_mount_t *pfsMount) { - int result; - pfs_cache_t *clink; - pfs_super_block *superblock; - u32 sub; - u32 i; - - - // Get number of sub partitions attached to the main partition - sub = pfsMount->blockDev->getSubNumber(pfsMount->fd); - - // Allocate a cache entry for the superblock - clink = pfsCacheAllocClean(&result); - if (!clink) - return result; - - superblock = clink->u.superblock; - - // Read the suprerblock from the main partition - result = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_READ); - if (result) - goto error; - - if ((superblock->magic != PFS_SUPER_MAGIC) || (superblock->version >= PFS_VERSION)) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Invalid magic/version\n"); - pfsCacheFree(clink); - return -EIO; - } - - if (!pfsCheckZoneSize(superblock->zone_size)) - result = -EIO; - - if ((superblock->pfsFsckStat & PFS_FSCK_STAT_WRITE_ERROR) && (pfsMount->flags & PFS_FIO_ATTR_EXECUTABLE)) - result = -EIO; - - if (sub < superblock->num_subs) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Filesystem larger than partition\n"); - result = -EIO; - } - - if (result) - goto error; - - // If new subs have been added, update filesystem - if (superblock->num_subs < sub) { - PFS_PRINTF(PFS_DRV_NAME ": New subs added, updating filesystem..\n"); - result = pfsUpdateSuperBlock(pfsMount, superblock, sub); - } - - if (result) - goto error; - - pfsMount->zsize = superblock->zone_size; - pfsMount->sector_scale = pfsGetScale(pfsMount->zsize, 512); - pfsMount->inode_scale = pfsGetScale(pfsMount->zsize, pfsMetaSize); - pfsMount->num_subs = superblock->num_subs; - memcpy(&pfsMount->root_dir, &superblock->root, sizeof(pfs_blockinfo)); - memcpy(&pfsMount->log, &superblock->log, sizeof(pfs_blockinfo)); - memcpy(&pfsMount->current_dir, &superblock->root, sizeof(pfs_blockinfo)); - pfsMount->total_sector = 0; - pfsMount->uid = 0; - pfsMount->gid = 0; - - // Do a journal restore (in case of un-clean unmount) - pfsJournalRestore(pfsMount); - - // Calculate free space and total size - for (i = 0; i < (pfsMount->num_subs + 1); i++) { - int free; - - pfsMount->total_sector += pfsMount->blockDev->getSize(pfsMount->fd, i) >> pfsMount->sector_scale; - - free = pfsBitmapCalcFreeZones(pfsMount, i); - pfsMount->free_zone[i] = free; - pfsMount->zfree += free; - } + int result; + pfs_cache_t *clink; + pfs_super_block_t *superblock; + u32 sub; + u32 i; + + + // Get number of sub partitions attached to the main partition + sub = pfsMount->blockDev->getSubNumber(pfsMount->fd); + + // Allocate a cache entry for the superblock + clink = pfsCacheAllocClean(&result); + if(!clink) + return result; + + superblock = clink->u.superblock; + + // Read the suprerblock from the main partition + result = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_READ); + if(result) goto error; + + if((superblock->magic != PFS_SUPER_MAGIC) || (superblock->version >= PFS_VERSION)) + { + PFS_PRINTF(PFS_DRV_NAME": Error: Invalid magic/version\n"); + pfsCacheFree(clink); + return -EIO; + } + + if(!pfsCheckZoneSize(superblock->zone_size)) + result = -EIO; + + if((superblock->pfsFsckStat & PFS_FSCK_STAT_WRITE_ERROR) && (pfsMount->flags & PFS_FIO_ATTR_EXECUTABLE)) + result = -EIO; + + if(sub < superblock->num_subs) + { + PFS_PRINTF(PFS_DRV_NAME": Error: Filesystem larger than partition\n"); + result = -EIO; + } + + if(result) goto error; + + // If new subs have been added, update filesystem + if(superblock->num_subs < sub) + { + PFS_PRINTF(PFS_DRV_NAME": New subs added, updating filesystem..\n"); + result = pfsUpdateSuperBlock(pfsMount, superblock, sub); + } + + if(result) goto error; + + pfsMount->zsize = superblock->zone_size; + pfsMount->sector_scale = pfsGetScale(pfsMount->zsize, 512); + pfsMount->inode_scale = pfsGetScale(pfsMount->zsize, pfsMetaSize); + pfsMount->num_subs = superblock->num_subs; + memcpy(&pfsMount->root_dir, &superblock->root, sizeof(pfs_blockinfo_t)); + memcpy(&pfsMount->log, &superblock->log, sizeof(pfs_blockinfo_t)); + memcpy(&pfsMount->current_dir, &superblock->root, sizeof(pfs_blockinfo_t)); + pfsMount->total_sector = 0; + pfsMount->uid = 0; + pfsMount->gid = 0; + + // Do a journal restore (in case of un-clean unmount) + pfsJournalRestore(pfsMount); + + // Calculate free space and total size + for(i = 0; i < (pfsMount->num_subs + 1); i++) + { + int free; + + pfsMount->total_sector += pfsMount->blockDev->getSize(pfsMount->fd, i) >> pfsMount->sector_scale; + + free = pfsBitmapCalcFreeZones(pfsMount, i); + pfsMount->free_zone[i] = free; + pfsMount->zfree += free; + } error: - pfsCacheFree(clink); - return result; + pfsCacheFree(clink); + return result; } diff --git a/modules/hdd/pfs/pfs-opt.h b/modules/hdd/pfs/pfs-opt.h index 9e69d7d34..d43b7b87d 100644 --- a/modules/hdd/pfs/pfs-opt.h +++ b/modules/hdd/pfs/pfs-opt.h @@ -1,7 +1,7 @@ -#ifndef _PFS_OPT_H -#define _PFS_OPT_H - -#define PFS_PRINTF(format, ...) printf(format, ##__VA_ARGS__) -#define PFS_DRV_NAME "pfs" - -#endif +#ifndef _PFS_OPT_H +#define _PFS_OPT_H + +#define PFS_PRINTF(format,...) printf(format, ##__VA_ARGS__) +#define PFS_DRV_NAME "pfs" + +#endif diff --git a/modules/hdd/pfs/pfs.c b/modules/hdd/pfs/pfs.c index 95e9b353a..d6b7c0058 100644 --- a/modules/hdd/pfs/pfs.c +++ b/modules/hdd/pfs/pfs.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS startup and misc code */ @@ -32,42 +31,44 @@ IRX_ID("pfs_driver", PFS_MAJOR, PFS_MINOR); // Globals iop_device_ops_t pfsOps = { - pfsFioInit, - pfsFioDeinit, - pfsFioFormat, - pfsFioOpen, - pfsFioClose, - pfsFioRead, - pfsFioWrite, - pfsFioLseek, - pfsFioIoctl, - pfsFioRemove, - pfsFioMkdir, - pfsFioRmdir, - pfsFioDopen, - pfsFioClose, - pfsFioDread, - pfsFioGetstat, - pfsFioChstat, - pfsFioRename, - pfsFioChdir, - pfsFioSync, - pfsFioMount, - pfsFioUmount, - (void *)pfsFioUnsupported /*pfsFioLseek64*/, - pfsFioDevctl, - (void *)pfsFioUnsupported /*pfsFioSymlink*/, - (void *)pfsFioUnsupported /*pfsFioReadlink*/, - pfsFioIoctl2}; + pfsFioInit, + pfsFioDeinit, + pfsFioFormat, + pfsFioOpen, + pfsFioClose, + pfsFioRead, + pfsFioWrite, + pfsFioLseek, + pfsFioIoctl, + pfsFioRemove, + pfsFioMkdir, + pfsFioRmdir, + pfsFioDopen, + pfsFioClose, + pfsFioDread, + pfsFioGetstat, + pfsFioChstat, + pfsFioRename, + pfsFioChdir, + pfsFioSync, + pfsFioMount, + pfsFioUmount, + (void*)pfsFioUnsupported /*pfsFioLseek64*/, + pfsFioDevctl, + (void*)pfsFioUnsupported /*pfsFioSymlink*/, + (void*)pfsFioUnsupported /*pfsFioReadlink*/, + pfsFioIoctl2 +}; iop_device_t pfsFioDev = { - "pfs", - (IOP_DT_FS | IOP_DT_FSEXT), - 1, - "PFS", - &pfsOps}; - -pfs_config_t pfsConfig = {1, 2}; + "pfs", + (IOP_DT_FS | IOP_DT_FSEXT), + 1, + "PFS", + &pfsOps +}; + +pfs_config_t pfsConfig = { 1, 2 }; pfs_mount_t *pfsMountBuf; char *pfsFilename = NULL; @@ -86,132 +87,139 @@ static int allocateMountBuffer(int size); static int printPfsArgError(void) { - PFS_PRINTF(PFS_DRV_NAME " ERROR: Usage: %s [-m ] [-o ] [-n ]\n", pfsFilename); + PFS_PRINTF(PFS_DRV_NAME" ERROR: Usage: %s [-m ] [-o ] [-n ]\n", pfsFilename); - return MODULE_NO_RESIDENT_END; + return MODULE_NO_RESIDENT_END; } static int allocateMountBuffer(int size) { - int tsize = size * sizeof(pfs_mount_t); + int tsize = size * sizeof(pfs_mount_t); - pfsMountBuf = pfsAllocMem(tsize); - if (!pfsMountBuf) - return -ENOMEM; + pfsMountBuf = pfsAllocMem(tsize); + if(!pfsMountBuf) + return -ENOMEM; - memset(pfsMountBuf, 0, tsize); + memset(pfsMountBuf, 0, tsize); - return 0; + return 0; } void pfsClearMount(pfs_mount_t *pfsMount) { - memset(pfsMount, 0, sizeof(pfs_mount_t)); + memset(pfsMount, 0, sizeof(pfs_mount_t)); } -pfs_mount_t *pfsGetMountedUnit(u32 unit) -{ // get mounted unit - if (unit >= pfsConfig.maxMount) - return NULL; +pfs_mount_t *pfsGetMountedUnit(s32 unit) +{ // get mounted unit + if(unit>=pfsConfig.maxMount) + return NULL; - if (!(pfsMountBuf[unit].flags & PFS_MOUNT_BUSY)) - return NULL; + if(!(pfsMountBuf[unit].flags & PFS_MOUNT_BUSY)) + return NULL; - return &pfsMountBuf[unit]; + return &pfsMountBuf[unit]; } int _start(int argc, char *argv[]) { - char *filename; - int number; - int numBuf = 8; - int reqBuf; - int size; - - PFS_PRINTF(PFS_DRV_NAME " Playstation Filesystem Driver v%d.%d\nps2fs: (c) 2003 Sjeep, Vector and Florin Sasu\n", PFS_MAJOR, PFS_MINOR); - - // Get filename of IRX - filename = strrchr(argv[0], '/'); - if (filename++) - pfsFilename = filename; - else - pfsFilename = argv[0]; - - argc--; - argv++; - - // Parse arguments - while (argc > 0) { - if (argv[0][0] != '-') - break; - - if (!strcmp(argv[0], "-m")) { - if (--argc <= 0) - return printPfsArgError(); - argv++; - - number = strtol(argv[0], 0, 10); - - if (number <= 32) - pfsConfig.maxMount = number; - } else if (!strcmp(argv[0], "-o")) { - if (--argc <= 0) - return printPfsArgError(); - argv++; - - number = strtol(argv[0], NULL, 10); - - if (number <= 32) - pfsConfig.maxOpen = number; - } else if (!strcmp(argv[0], "-n")) { - if (--argc <= 0) - return printPfsArgError(); - argv++; - - number = strtol(argv[0], NULL, 10); - - if (number > numBuf) - numBuf = number; - - if (numBuf > 127) { - PFS_PRINTF(PFS_DRV_NAME " ERROR: Number of buffers is larger than 127!\n"); - return -EINVAL; - } - } else - return printPfsArgError(); - - argc--; - argv++; - } - - PFS_PRINTF(PFS_DRV_NAME " Max mount: %ld, Max open: %ld, Number of buffers: %d\n", pfsConfig.maxMount, - pfsConfig.maxOpen, numBuf); - - // Do we have enough buffers ? - reqBuf = (pfsConfig.maxOpen * 2) + 8; - if (numBuf < reqBuf) - PFS_PRINTF(PFS_DRV_NAME " Warning: %d buffers may be needed, but only %d buffers are allocated\n", reqBuf, numBuf); - - if (allocateMountBuffer(pfsConfig.maxMount) < 0) - return MODULE_NO_RESIDENT_END; - - // Allocate and zero memory for file slots - size = pfsConfig.maxOpen * sizeof(pfs_file_slot_t); - pfsFileSlots = pfsAllocMem(size); - if (!pfsFileSlots) { - PFS_PRINTF(PFS_DRV_NAME " Error: Failed to allocate memory!\n"); - return MODULE_NO_RESIDENT_END; - } - - memset(pfsFileSlots, 0, size); - - if (pfsCacheInit(numBuf, pfsMetaSize) < 0) - return MODULE_NO_RESIDENT_END; - - DelDrv("pfs"); - AddDrv(&pfsFioDev); - - PFS_PRINTF(PFS_DRV_NAME " Driver start.\n"); - - return MODULE_RESIDENT_END; + char *filename; + int number; + int numBuf = 8; + int reqBuf; + int size; + + PFS_PRINTF(PFS_DRV_NAME" Playstation Filesystem Driver v%d.%d\nps2fs: (c) 2003 Sjeep, Vector and Florin Sasu\n", PFS_MAJOR, PFS_MINOR); + + // Get filename of IRX + filename = strrchr(argv[0], '/'); + if(filename++) + pfsFilename = filename; + else + pfsFilename = argv[0]; + + argc--; + argv++; + + // Parse arguments + while(argc > 0) + { + if(argv[0][0] != '-') + break; + + if(!strcmp(argv[0], "-m")) + { + if(--argc <= 0) + return printPfsArgError(); + argv++; + + number = strtol(argv[0], 0, 10); + + if(number <= 32) + pfsConfig.maxMount = number; + } + else if(!strcmp(argv[0], "-o")) + { + if(--argc <= 0) + return printPfsArgError(); + argv++; + + number = strtol(argv[0], NULL, 10); + + if(number <= 32) + pfsConfig.maxOpen = number; + } + else if(!strcmp(argv[0], "-n")) + { + if(--argc <= 0) + return printPfsArgError(); + argv++; + + number = strtol(argv[0], NULL, 10); + + if(number > numBuf) + numBuf = number; + + if(numBuf > 127) { + PFS_PRINTF(PFS_DRV_NAME" ERROR: Number of buffers is larger than 127!\n"); + return -EINVAL; + } + } + else + return printPfsArgError(); + + argc--; + argv++; + } + + PFS_PRINTF(PFS_DRV_NAME" Max mount: %ld, Max open: %ld, Number of buffers: %d\n", pfsConfig.maxMount, + pfsConfig.maxOpen, numBuf); + + // Do we have enough buffers ? + reqBuf = (pfsConfig.maxOpen * 2) + 8; + if(numBuf < reqBuf) + PFS_PRINTF(PFS_DRV_NAME" Warning: %d buffers may be needed, but only %d buffers are allocated\n", reqBuf, numBuf); + + if(allocateMountBuffer(pfsConfig.maxMount) < 0) + return MODULE_NO_RESIDENT_END; + + // Allocate and zero memory for file slots + size = pfsConfig.maxOpen * sizeof(pfs_file_slot_t); + pfsFileSlots = pfsAllocMem(size); + if(!pfsFileSlots) { + PFS_PRINTF(PFS_DRV_NAME" Error: Failed to allocate memory!\n"); + return MODULE_NO_RESIDENT_END; + } + + memset(pfsFileSlots, 0, size); + + if(pfsCacheInit(numBuf, pfsMetaSize) < 0) + return MODULE_NO_RESIDENT_END; + + DelDrv("pfs"); + AddDrv(&pfsFioDev); + + PFS_PRINTF(PFS_DRV_NAME" Driver start.\n"); + + return MODULE_RESIDENT_END; } diff --git a/modules/hdd/pfs/pfs.h b/modules/hdd/pfs/pfs.h index ab5963211..e00d86771 100644 --- a/modules/hdd/pfs/pfs.h +++ b/modules/hdd/pfs/pfs.h @@ -6,63 +6,59 @@ # Copyright 2001-2004, ps2dev - http://www.ps2dev.org # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. -# -# $Id$ */ #ifndef _PFS_H #define _PFS_H #ifndef min -#define min(a, b) ((a) < (b) ? (a) : (b)) +#define min(a, b) ((a) < (b) ? (a) : (b)) #endif -#define PFS_MAJOR 1 -#define PFS_MINOR 4 +#define PFS_MAJOR 1 +#define PFS_MINOR 4 /////////////////////////////////////////////////////////////////////////////// // Global types typedef struct { - u16 dirty; // - u16 sub; // Sub/main partition - u32 sector; // Sector + u16 dirty; // + u16 sub; // Sub/main partition + u32 sector; // Sector } pfs_restsInfo_t; typedef struct { - char key[256]; - char value[256]; + char key[256]; + char value[256]; } pfs_ioctl2attr_t; -typedef struct -{ - iop_file_t *fd; // - pfs_cache_t *clink; // - u32 aentryOffset; // used for read offset - u64 position; // - pfs_blockpos_t block_pos; // current position into file - pfs_restsInfo_t restsInfo; // - u8 restsBuffer[512]; // used for reading mis-aligned/remainder data +typedef struct { + iop_file_t *fd; // + pfs_cache_t *clink; // + u32 aentryOffset; // used for read offset + u64 position; // + pfs_blockpos_t block_pos; // current position into file + pfs_restsInfo_t restsInfo; // + u8 restsBuffer[512]; // used for reading mis-aligned/remainder data } pfs_file_slot_t; -typedef struct -{ - u32 maxMount; - u32 maxOpen; +typedef struct { + u32 maxMount; + u32 maxOpen; } pfs_config_t; /////////////////////////////////////////////////////////////////////////////// // Global defines // mount flags -#define PFS_MOUNT_BUSY 0x8000 +#define PFS_MOUNT_BUSY 0x8000 /////////////////////////////////////////////////////////////////////////////// // Function declarations -pfs_mount_t *pfsGetMountedUnit(u32 unit); +pfs_mount_t *pfsGetMountedUnit(s32 unit); void pfsClearMount(pfs_mount_t *pfsMount); #endif /* _PFS_H */ diff --git a/modules/hdd/pfs/pfs_fio.c b/modules/hdd/pfs/pfs_fio.c index a1c6fedb4..1dd1f4287 100644 --- a/modules/hdd/pfs/pfs_fio.c +++ b/modules/hdd/pfs/pfs_fio.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS I/O manager related routines */ @@ -16,7 +15,6 @@ #include #include #include -#include #include #include "pfs-opt.h" @@ -28,7 +26,7 @@ /////////////////////////////////////////////////////////////////////////////// // Globals -static const u8 openFlagArray[] = {0, 4, 2, 6, 0, 0, 0, 0}; +static const u8 openFlagArray[] = { 0, 4, 2, 6, 0, 0, 0, 0 }; int pfsFioSema = 0; pfs_file_slot_t *pfsFileSlots; @@ -54,707 +52,747 @@ static void _sync(void); int pfsFioCheckForLastError(pfs_mount_t *pfsMount, int rv) { - return pfsMount->lastError ? pfsMount->lastError : rv; + return pfsMount->lastError ? pfsMount->lastError : rv; } int pfsFioCheckFileSlot(pfs_file_slot_t *fileSlot) { - WaitSema(pfsFioSema); + WaitSema(pfsFioSema); - if (fileSlot->clink == NULL) { - SignalSema(pfsFioSema); - return -EBADF; - } + if(fileSlot->clink==NULL) + { + SignalSema(pfsFioSema); + return -EBADF; + } - return 0; + return 0; } void pfsFioCloseFileSlot(pfs_file_slot_t *fileSlot) { - pfs_mount_t *pfsMount = fileSlot->clink->pfsMount; - - if (fileSlot->fd->mode & O_WRONLY) { - if (fileSlot->restsInfo.dirty != 0) { - pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, - fileSlot->restsInfo.sub, fileSlot->restsInfo.sector, 1, PFS_IO_MODE_WRITE); - } - pfsInodeSetTime(fileSlot->clink); // set time :P - fileSlot->clink->u.inode->attr |= PFS_FIO_ATTR_CLOSED; - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - pfsCacheFree(fileSlot->block_pos.inode); - pfsCacheFree(fileSlot->clink); - memset(fileSlot, 0, sizeof(pfs_file_slot_t)); + pfs_mount_t *pfsMount=fileSlot->clink->pfsMount; + + if(fileSlot->fd->mode & O_WRONLY) + { + if(fileSlot->restsInfo.dirty!=0) + { + pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, + fileSlot->restsInfo.sub, fileSlot->restsInfo.sector, 1, PFS_IO_MODE_WRITE); + } + pfsInodeSetTime(fileSlot->clink); // set time :P + fileSlot->clink->u.inode->attr|=PFS_FIO_ATTR_CLOSED; + if(pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); + } + pfsCacheFree(fileSlot->block_pos.inode); + pfsCacheFree(fileSlot->clink); + memset(fileSlot, 0, sizeof(pfs_file_slot_t)); } pfs_mount_t *pfsFioGetMountedUnit(int unit) { - pfs_mount_t *pfsMount; + pfs_mount_t *pfsMount; - WaitSema(pfsFioSema); - if ((pfsMount = pfsGetMountedUnit(unit)) == NULL) - SignalSema(pfsFioSema); - return pfsMount; + WaitSema(pfsFioSema); + if((pfsMount=pfsGetMountedUnit(unit))==NULL) + SignalSema(pfsFioSema); + return pfsMount; } static int mountDevice(pfs_block_device_t *blockDev, int fd, int unit, int flag) { - u32 i; - int rv; + u32 i; + int rv; - if ((u32)unit >= pfsConfig.maxMount) - return -EMFILE; + if((u32)unit >= pfsConfig.maxMount) + return -EMFILE; - if (pfsMountBuf[unit].flags & PFS_MOUNT_BUSY) - return -EBUSY; + if(pfsMountBuf[unit].flags & PFS_MOUNT_BUSY) + return -EBUSY; - for (i = 0; i < pfsConfig.maxMount; i++) - if ((pfsMountBuf[i].flags & PFS_MOUNT_BUSY) && - (blockDev == pfsMountBuf[i].blockDev) && - (fd == pfsMountBuf[i].fd)) // Cant mount the same partition more than once - return -EBUSY; + for(i = 0; i < pfsConfig.maxMount; i++) + if((pfsMountBuf[i].flags & PFS_MOUNT_BUSY) && + (blockDev == pfsMountBuf[i].blockDev) && + (fd == pfsMountBuf[i].fd)) // Cant mount the same partition more than once + return -EBUSY; - pfsMountBuf[unit].blockDev = blockDev; - pfsMountBuf[unit].fd = fd; - pfsMountBuf[unit].flags = flag; + pfsMountBuf[unit].blockDev = blockDev; + pfsMountBuf[unit].fd = fd; + pfsMountBuf[unit].flags = flag; - rv = pfsMountSuperBlock(&pfsMountBuf[unit]); - if (rv < 0) - return rv; + rv = pfsMountSuperBlock(&pfsMountBuf[unit]); + if(rv < 0) + return rv; - pfsMountBuf[unit].flags |= PFS_MOUNT_BUSY; + pfsMountBuf[unit].flags |= PFS_MOUNT_BUSY; - return 0; + return 0; } static int openFile(pfs_mount_t *pfsMount, pfs_file_slot_t *freeSlot, const char *filename, int openFlags, int mode) { - char file[256]; - int result, result2, result3, result4; - pfs_cache_t *parentInode, *fileInode, *cached; - - - result = 0; //no error - // Get the inode for the directory which contains the file (dir) in filename - // After this call, 'file' will contain the name of the file we're operating on. - if ((parentInode = pfsInodeGetParent(pfsMount, NULL, filename, file, &result)) == 0) { - return result; - } - - // Get the inode for the actual file/directory contained in the parent dir - fileInode = pfsInodeGetFileInDir(parentInode, file, &result); - - // If file already exists.. - if (fileInode) { - u32 flags; - u32 count; - - // Setup flags - flags = openFlagArray[openFlags & O_RDWR]; - if (openFlags & O_TRUNC) - flags |= 2; - if (openFlags & PFS_FDIRO) - flags |= 4; - if ((mode & 0x10000) || - ((openFlags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))) { - result = -EEXIST; - } else { - count = 0; - - // Resolve actual file from a symlink - while ((fileInode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK) { - if (count++ >= 4) { - result = -ELOOP; - goto label; - } - - parentInode = pfsInodeGetParent(pfsMount, parentInode, (char *)&fileInode->u.inode->data[1], - file, &result); - pfsCacheFree(fileInode); - if ((parentInode == 0) || - ((fileInode = pfsInodeGetFileInDir(parentInode, file, &result)) == 0)) - goto label; - } - - // Make sure that if a file is being opened, then inode does not point - // to a directory, and vice versa. - if ((openFlags & PFS_FDIRO) == 0) { - if ((fileInode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) - result = -EISDIR; - } else { - if ((fileInode->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - result = -ENOTDIR; - } - - // Truncate file if required - if ((result == 0) && - ((result = pfsCheckAccess(fileInode, flags & 0xFFFF)) == 0) && - (openFlags & O_TRUNC)) { - cached = pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->sector + 1, PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result2); - if (cached) { - memset(cached->u.aentry, 0, sizeof(pfs_inode)); //1024 - cached->u.aentry->aLen = sizeof(pfs_inode); - cached->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - if (result2 == 0) { - fileInode->u.inode->size = 0; - fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED; //~0x80==0xFF7F - fileInode->flags |= PFS_CACHE_FLAG_DIRTY; - pfsFioIoctl2Free(fileInode); - } - } - } - - // Otherwise, if file doesnt already exist.. - } else { - if ((openFlags & O_CREAT) && (result == -ENOENT) && - ((result = pfsCheckAccess(parentInode, 2)) == 0) && - (fileInode = pfsInodeCreate(parentInode, mode, pfsMount->uid, - pfsMount->gid, &result))) { - if ((mode & FIO_S_IFMT) == FIO_S_IFLNK) { - strcpy((char *)&fileInode->u.inode->data[1], (char *)freeSlot); - freeSlot = NULL; - } - - // If new file is a directory, the fill self and parent entries - if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) { - cached = pfsCacheGetData(fileInode->pfsMount, fileInode->u.inode->data[1].subpart, - fileInode->u.inode->data[1].number << fileInode->pfsMount->inode_scale, - PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result3); - if (cached) { - pfsFillSelfAndParentDentries(cached, - &fileInode->u.inode->inode_block, - &parentInode->u.inode->inode_block); - cached->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - result = result3; - // Otherwise if its just a regular file, just zero its attribute entry - } else { - cached = pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->sector + 1, - PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result4); - if (cached) { - memset(cached->u.aentry, 0, sizeof(pfs_inode)); - cached->u.aentry->aLen = sizeof(pfs_inode); - cached->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - result = result4; - } - - // Link new file with parent directory - if ((result == 0) && (cached = pfsDirAddEntry(parentInode, file, &fileInode->u.inode->inode_block, - mode, &result))) { - pfsInodeSetTime(parentInode); - cached->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - } - } + char file[256]; + int result, result2, result3, result4; + pfs_cache_t *parentInode, *fileInode, *cached; + + + result = 0; //no error + // Get the inode for the directory which contains the file (dir) in filename + // After this call, 'file' will contain the name of the file we're operating on. + if ((parentInode=pfsInodeGetParent(pfsMount, NULL, filename, file, &result))==0) + { + return result; + } + + // Get the inode for the actual file/directory contained in the parent dir + fileInode=pfsInodeGetFileInDir(parentInode, file, &result); + + // If file already exists.. + if (fileInode) + { + u32 flags; + u32 count; + + // Setup flags + flags=openFlagArray[openFlags & O_RDWR]; + if (openFlags & O_TRUNC) flags |= 2; + if (openFlags & PFS_FDIRO) flags |= 4; + if ((mode & 0x10000) || + ((openFlags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL))){ + result=-EEXIST; + } + else + { + count = 0; + + // Resolve actual file from a symlink + while ((fileInode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK) + { + if (count++>=4) + { + result=-ELOOP; + goto label; + } + + parentInode=pfsInodeGetParent(pfsMount, parentInode, (char*)&fileInode->u.inode->data[1], + file, &result); + pfsCacheFree(fileInode); + if ((parentInode==0) || + ((fileInode=pfsInodeGetFileInDir(parentInode, file, &result))==0)) + goto label; + } + + // Make sure that if a file is being opened, then inode does not point + // to a directory, and vice versa. + if ((openFlags & PFS_FDIRO) == 0) + { + if ((fileInode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) + result=-EISDIR; + }else{ + if ((fileInode->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) + result=-ENOTDIR; + } + + // Truncate file if required + if ((result==0) && + ((result=pfsCheckAccess(fileInode, flags & 0xFFFF))==0) && + (openFlags & O_TRUNC)) + { + cached=pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->sector+1, PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result2); + if (cached) + { + memset(cached->u.aentry, 0, sizeof(pfs_inode_t)); //1024 + cached->u.aentry->aLen=sizeof(pfs_inode_t); + cached->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(cached); + } + if (result2 == 0) + { + fileInode->u.inode->size = 0; + fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED; //~0x80==0xFF7F + fileInode->flags |= PFS_CACHE_FLAG_DIRTY; + pfsFreeZones(fileInode); + } + } + } + + // Otherwise, if file doesnt already exist.. + }else{ + if ((openFlags & O_CREAT) && (result==-ENOENT) && + ((result=pfsCheckAccess(parentInode, 2))==0) && + (fileInode=pfsInodeCreate(parentInode, mode, pfsMount->uid, + pfsMount->gid, &result))) + { + if ((mode & FIO_S_IFMT) == FIO_S_IFLNK) + { + strcpy((char*)&fileInode->u.inode->data[1], (char*)freeSlot); + freeSlot=NULL; + } + + // If new file is a directory, the fill self and parent entries + if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) + { + cached=pfsCacheGetData(fileInode->pfsMount, fileInode->u.inode->data[1].subpart, + fileInode->u.inode->data[1].number << fileInode->pfsMount->inode_scale, + PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result3); + if (cached) + { + pfsFillSelfAndParentDentries(cached, + &fileInode->u.inode->inode_block, + &parentInode->u.inode->inode_block); + cached->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(cached); + } + result=result3; + // Otherwise if its just a regular file, just zero its attribute entry + }else{ + cached=pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->sector+1, + PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result4); + if (cached) + { + memset(cached->u.aentry, 0, sizeof(pfs_inode_t)); + cached->u.aentry->aLen=sizeof(pfs_inode_t); + cached->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(cached); + } + result=result4; + } + + // Link new file with parent directory + if ((result==0) && (cached=pfsDirAddEntry(parentInode, file, &fileInode->u.inode->inode_block, + mode, &result))) + { + pfsInodeSetTime(parentInode); + cached->flags|=PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(cached); + } + } + } label: - pfsCacheFree(parentInode); - if ((result == 0) && freeSlot && fileInode) { - freeSlot->clink = fileInode; - if (openFlags & O_APPEND) - freeSlot->position = fileInode->u.inode->size; - else - freeSlot->position = 0; - - result = pfsBlockInitPos(freeSlot->clink, &freeSlot->block_pos, freeSlot->position); - if (result == 0) { - if ((openFlags & O_WRONLY) && - (fileInode->u.inode->attr & PFS_FIO_ATTR_CLOSED)) { - fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED; - fileInode->flags |= PFS_CACHE_FLAG_DIRTY; - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - if ((result = pfsFioCheckForLastError(pfsMount, result)) == 0) - return 0; - } - freeSlot->clink = NULL; - } - - if (fileInode) - pfsCacheFree(fileInode); - - return pfsFioCheckForLastError(pfsMount, result); + pfsCacheFree(parentInode); + if ((result==0) && freeSlot && fileInode) + { + freeSlot->clink=fileInode; + if (openFlags & O_APPEND) + freeSlot->position = fileInode->u.inode->size; + else + freeSlot->position = 0; + + result=pfsBlockInitPos(freeSlot->clink, &freeSlot->block_pos, freeSlot->position); + if (result==0) + { + if ((openFlags & O_WRONLY) && + (fileInode->u.inode->attr & PFS_FIO_ATTR_CLOSED)){ + fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED; + fileInode->flags |= PFS_CACHE_FLAG_DIRTY; + if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); + } + if ((result=pfsFioCheckForLastError(pfsMount, result))==0) + return 0; + } + freeSlot->clink=NULL; + } + + if(fileInode) pfsCacheFree(fileInode); + + return pfsFioCheckForLastError(pfsMount, result); } // Reads unaligned data, or remainder data (size < 512) static int fileTransferRemainder(pfs_file_slot_t *fileSlot, void *buf, int size, int operation) { - u32 sector, pos; - int result; - pfs_blockpos_t *blockpos = &fileSlot->block_pos; - pfs_mount_t *pfsMount = fileSlot->clink->pfsMount; - pfs_restsInfo_t *info = &fileSlot->restsInfo; - pfs_blockinfo *bi = pfsBlockGetCurrent(blockpos); - - sector = ((bi->number + blockpos->block_offset) << pfsMount->sector_scale) + - (blockpos->byte_offset >> 9); - pos = blockpos->byte_offset & 0x1FF; - - if ((info->sector != sector) || (info->sub != bi->subpart)) { - if (fileSlot->restsInfo.dirty) { - result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, info->sector, 1, 1); - if (result) - return result; - fileSlot->restsInfo.dirty = 0; - } - - info->sub = bi->subpart; - info->sector = sector; - - if (pos || (fileSlot->position != fileSlot->clink->u.inode->size)) { - result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, info->sector, 1, 0); - if (result) - return result | 0x10000; - } - } - - if (operation == 0) - memcpy(buf, fileSlot->restsBuffer + pos, size = min(size, 512 - (int)pos)); - else - memcpy(fileSlot->restsBuffer + pos, buf, size = min(size, 512 - (int)pos)); - - if (operation == 1) { - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) { - if ((result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, - info->sector, operation, operation))) - return result; - } else - info->dirty = operation; - } - return size; + u32 sector, pos; + int result; + pfs_blockpos_t *blockpos = &fileSlot->block_pos; + pfs_mount_t *pfsMount = fileSlot->clink->pfsMount; + pfs_restsInfo_t *info = &fileSlot->restsInfo; + pfs_blockinfo_t *bi = pfsBlockGetCurrent(blockpos); + + sector = ((bi->number+blockpos->block_offset) << pfsMount->sector_scale) + + (blockpos->byte_offset >> 9); + pos = blockpos->byte_offset & 0x1FF; + + if((info->sector != sector) || (info->sub!=bi->subpart)) + { + if (fileSlot->restsInfo.dirty) + { + result=pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, info->sector, 1, 1); + if(result) + return result; + fileSlot->restsInfo.dirty=0; + } + + info->sub=bi->subpart; + info->sector=sector; + + if(pos || (fileSlot->position != fileSlot->clink->u.inode->size)) + { + result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, info->sector, 1, 0); + if(result) + return result | 0x10000; + } + } + + if (operation==0) + memcpy(buf, fileSlot->restsBuffer+pos, size=min(size, 512-(int)pos)); + else + memcpy(fileSlot->restsBuffer+pos, buf, size=min(size, 512-(int)pos)); + + if (operation == 1) + { + if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + { + if ((result=pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, + info->sector, operation, operation))) + return result; + } + else + info->dirty=operation; + } + return size; } // Does actual read/write of data from file static int fileTransfer(pfs_file_slot_t *fileSlot, u8 *buf, int size, int operation) { - int result = 0; - pfs_blockpos_t *blockpos = &fileSlot->block_pos; - pfs_mount_t *pfsMount = fileSlot->clink->pfsMount; - u32 bytes_remain; - u32 total = 0; - - // If we're writing and there is less free space in the last allocated block segment - // than can hold the data being written, then try and expand the block segment - if ((operation == 1) && - (fileSlot->clink->u.inode->number_data - 1 == blockpos->block_segment)) { - bytes_remain = (pfsBlockGetCurrent(blockpos)->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; //u32 - - if (bytes_remain < size) { - pfsBlockExpandSegment(fileSlot->clink, blockpos, - ((size - bytes_remain + pfsMount->zsize - 1) & (~(pfsMount->zsize - 1))) / pfsMount->zsize); - } - } - - while (size) { - pfs_blockinfo *bi; - u32 sectors; - - // Get block info for current file position - bi = pfsBlockGetCurrent(blockpos); - - // Get amount of remaining data in current block - bytes_remain = (bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; - - // If there is no space/data left in the current block segment, then we need to move onto the next - if (bytes_remain == 0) { - // If we're at the end of allocated block segments, then allocate a new block segment - if (blockpos->block_segment == fileSlot->clink->u.inode->number_data - 1) { - if (operation == 0) { - PFS_PRINTF(PFS_DRV_NAME " Panic: This is a bug!\n"); - return 0; - } - - result = pfsBlockAllocNewSegment(fileSlot->clink, blockpos, - (size - 1 + pfsMount->zsize) / pfsMount->zsize); - if (result < 0) - break; - - // Otherwise, move to the next block segment - } else if ((result = pfsBlockSeekNextSegment(fileSlot->clink, blockpos))) { - return result; - } - - bi = pfsBlockGetCurrent(blockpos); - bytes_remain = (bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; - } - - if (bytes_remain == 0) { - PFS_PRINTF(PFS_DRV_NAME " Panic: There is no zone.\n"); - return 0; - } - - // If we are transferring size not a multiple of 512, under 512, or to - // an unaligned buffer we need to use a special function rather than - // just doing a ATA sector transfer. - if ((blockpos->byte_offset & 0x1FF) || (size < 512) || ((u32)buf & 3)) { - if ((result = fileTransferRemainder(fileSlot, buf, size, operation)) < 0) - break; - } else { - sectors = bytes_remain / 512; - if ((size / 512) < sectors) - sectors = size / 512; //sectors=min(size/512, sectors) - - // Do the ATA sector transfer - result = pfsMount->blockDev->transfer(pfsMount->fd, buf, bi->subpart, - ((bi->number + blockpos->block_offset) << pfsMount->sector_scale) + (blockpos->byte_offset / 512), - sectors, operation); - if (result < 0) { - result |= 0x10000; // TODO: EIO define - break; - } - result = sectors * 512; - } - - size -= result; - fileSlot->position += result; - buf += result; - total += result; - - // If file has grown, need to mark inode as dirty - if (fileSlot->clink->u.inode->size < fileSlot->position) { - fileSlot->clink->u.inode->size = fileSlot->position; - fileSlot->clink->flags |= PFS_CACHE_FLAG_DIRTY; - } - - blockpos->block_offset += pfsBlockSyncPos(blockpos, result); - } - return result < 0 ? result : total; + int result=0; + pfs_blockpos_t *blockpos=&fileSlot->block_pos; + pfs_mount_t *pfsMount=fileSlot->clink->pfsMount; + u32 bytes_remain; + u32 total = 0; + + // If we're writing and there is less free space in the last allocated block segment + // than can hold the data being written, then try and expand the block segment + if ((operation==1) && + (fileSlot->clink->u.inode->number_data - 1 == blockpos->block_segment)) + { + bytes_remain = (pfsBlockGetCurrent(blockpos)->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset;//u32 + + if (bytes_remain < size) + { + pfsBlockExpandSegment(fileSlot->clink, blockpos, + ((size-bytes_remain+pfsMount->zsize-1) & (~(pfsMount->zsize-1))) / pfsMount->zsize); + } + } + + while (size) + { + pfs_blockinfo_t *bi; + u32 sectors; + + // Get block info for current file position + bi=pfsBlockGetCurrent(blockpos); + + // Get amount of remaining data in current block + bytes_remain=(bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; + + // If there is no space/data left in the current block segment, then we need to move onto the next + if (bytes_remain==0) + { + // If we're at the end of allocated block segments, then allocate a new block segment + if (blockpos->block_segment == fileSlot->clink->u.inode->number_data-1){ + if (operation==0){ + PFS_PRINTF(PFS_DRV_NAME" Panic: This is a bug!\n"); + return 0; + } + + result = pfsBlockAllocNewSegment(fileSlot->clink, blockpos, + (size - 1 + pfsMount->zsize) / pfsMount->zsize); + if(result<0) + break; + + // Otherwise, move to the next block segment + }else + if ((result=pfsBlockSeekNextSegment(fileSlot->clink, blockpos))) + { + return result; + } + + bi=pfsBlockGetCurrent(blockpos); + bytes_remain=(bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; + } + + if (bytes_remain==0) + { + PFS_PRINTF(PFS_DRV_NAME" Panic: There is no zone.\n"); + return 0; + } + + // If we are transferring size not a multiple of 512, under 512, or to + // an unaligned buffer we need to use a special function rather than + // just doing a ATA sector transfer. + if ((blockpos->byte_offset & 0x1FF) || (size < 512) || ((u32)buf & 3)) + { + if ((result=fileTransferRemainder(fileSlot, buf, size, operation)) < 0) + break; + } + else + { + sectors = bytes_remain / 512; + if ((size / 512) < sectors) sectors = size / 512; //sectors=min(size/512, sectors) + + // Do the ATA sector transfer + result=pfsMount->blockDev->transfer(pfsMount->fd, buf, bi->subpart, + ((bi->number + blockpos->block_offset) << pfsMount->sector_scale)+(blockpos->byte_offset / 512), + sectors, operation); + if (result < 0) + { + result |= 0x10000; // TODO: EIO define + break; + } + result = sectors * 512; + } + + size -= result; + fileSlot->position += result; + buf += result; + total += result; + + // If file has grown, need to mark inode as dirty + if(fileSlot->clink->u.inode->size < fileSlot->position) + { + fileSlot->clink->u.inode->size = fileSlot->position; + fileSlot->clink->flags |= PFS_CACHE_FLAG_DIRTY; + } + + blockpos->block_offset+=pfsBlockSyncPos(blockpos, result); + } + return result < 0 ? result : total; } -static void pfsPowerOffHandler(void *data) +int pfsFioInit(iop_device_t *f) { - PFS_PRINTF("pfs close all\n"); - pfsFioDevctlCloseAll(); -} - -int pfsFioInit(iop_device_t *f) -{ - iop_sema_t sema; + iop_sema_t sema; - sema.attr = 1; - sema.option = 0; - sema.initial = 1; - sema.max = 1; + sema.attr = 1; + sema.option = 0; + sema.initial = 1; + sema.max = 1; - pfsFioSema = CreateSema(&sema); + pfsFioSema = CreateSema(&sema); - AddPowerOffHandler(&pfsPowerOffHandler, NULL); - return 0; + return 0; } -int pfsFioDeinit(iop_device_t *f) +int pfsFioDeinit(iop_device_t *f) { - pfsFioDevctlCloseAll(); + pfsFioDevctlCloseAll(); - DeleteSema(pfsFioSema); + DeleteSema(pfsFioSema); - return 0; + return 0; } -int pfsFioFormat(iop_file_t *t, const char *dev, const char *blockdev, void *args, size_t arglen) +int pfsFioFormat(iop_file_t *t, const char *dev, const char *blockdev, void *args, int arglen) { - int *arg = (int *)args; - int fragment = 0; - int fd; - pfs_block_device_t *blockDev; - int rv; + int *arg = (int *)args; + int fragment = 0; + int fd; + pfs_block_device_t *blockDev; + int rv; - // Has a fragment bit pattern been specified ? - if ((arglen == (3 * sizeof(int))) && (arg[1] == 0x2D66)) - fragment = arg[2]; + // Has a fragment bit pattern been specified ? + if((arglen == (3 * sizeof(int))) && (arg[1] == 0x2D66)) //arg[1] == "-f" + fragment = arg[2]; - if ((blockDev = pfsGetBlockDeviceTable(blockdev)) == 0) - return -ENXIO; + if((blockDev = pfsGetBlockDeviceTable(blockdev)) == 0) + return -ENXIO; - WaitSema(pfsFioSema); + WaitSema(pfsFioSema); - fd = open(blockdev, O_RDWR, 0644); + fd = open(blockdev, O_RDWR, 0644); - if (fd < 0) - rv = fd; - else { - rv = pfsFormat(blockDev, fd, arg[0], fragment); - close(fd); - } + if(fd < 0) + rv = fd; + else { + rv = pfsFormat(blockDev, fd, arg[0], fragment); + close(fd); + } - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } -int pfsFioOpen(iop_file_t *f, const char *name, int flags, int mode) +int pfsFioOpen(iop_file_t *f, const char *name, int flags, int mode) { - int rv = 0; - u32 i; - pfs_file_slot_t *freeSlot; - pfs_mount_t *pfsMount; - - if (!name) - return -ENOENT; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) { - return -ENODEV; - } - - // Find free file slot - for (i = 0; i < pfsConfig.maxOpen; i++) { - if (!pfsFileSlots[i].fd) { - freeSlot = &pfsFileSlots[i]; - goto pfsOpen_slotFound; - } - } - - PFS_PRINTF(PFS_DRV_NAME " Error: There are no free file slots!\n"); - freeSlot = NULL; + int rv = 0; + u32 i; + pfs_file_slot_t *freeSlot; + pfs_mount_t *pfsMount; + + if(!name) + return -ENOENT; + + if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) + { + return -ENODEV; + } + + // Find free file slot + for(i = 0; i < pfsConfig.maxOpen; i++) + { + if(!pfsFileSlots[i].fd) { + freeSlot = &pfsFileSlots[i]; + goto pfsOpen_slotFound; + } + } + + PFS_PRINTF(PFS_DRV_NAME" Error: There are no free file slots!\n"); + freeSlot = NULL; pfsOpen_slotFound: - if (!freeSlot) { - rv = -EMFILE; - goto pfsOpen_end; - } + if(!freeSlot) { + rv = -EMFILE; + goto pfsOpen_end; + } - // Do actual open - if ((rv = openFile(pfsMount, freeSlot, name, f->mode, (mode & 0xfff) | FIO_S_IFREG))) - goto pfsOpen_end; + // Do actual open + if((rv = openFile(pfsMount, freeSlot, name, f->mode, (mode & 0xfff) | FIO_S_IFREG))) + goto pfsOpen_end; - freeSlot->fd = f; - f->privdata = freeSlot; + freeSlot->fd = f; + f->privdata = freeSlot; pfsOpen_end: - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } -int pfsFioClose(iop_file_t *f) +int pfsFioClose(iop_file_t *f) { - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - int rv; + pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; + int rv; - rv = pfsFioCheckFileSlot(fileSlot); - if (rv) - return rv; + rv = pfsFioCheckFileSlot(fileSlot); + if(rv) + return rv; - pfsFioCloseFileSlot(fileSlot); + pfsFioCloseFileSlot(fileSlot); - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } int pfsFioRead(iop_file_t *f, void *buf, int size) { - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - int result = pfsFioCheckFileSlot(fileSlot); + pfs_file_slot_t *fileSlot = (pfs_file_slot_t*)f->privdata; + int result = pfsFioCheckFileSlot(fileSlot); - if (result) { - return result; - } + if (result) + { + return result; + } - // Check bounds, adjust size if necessary - if (fileSlot->clink->u.inode->size < (fileSlot->position + size)) - size = fileSlot->clink->u.inode->size - fileSlot->position; + // Check bounds, adjust size if necessary + if(fileSlot->clink->u.inode->size < (fileSlot->position + size)) + size = fileSlot->clink->u.inode->size - fileSlot->position; - result = size ? fileTransfer(fileSlot, buf, size, 0) : 0; - result = pfsFioCheckForLastError(fileSlot->clink->pfsMount, result); + result = size ? fileTransfer(fileSlot, buf, size, 0) : 0; + result = pfsFioCheckForLastError(fileSlot->clink->pfsMount, result); - SignalSema(pfsFioSema); - return result; + SignalSema(pfsFioSema); + return result; } int pfsFioWrite(iop_file_t *f, void *buf, int size) { - pfs_mount_t *pfsMount; - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - int result = pfsFioCheckFileSlot(fileSlot); + pfs_mount_t *pfsMount; + pfs_file_slot_t *fileSlot = (pfs_file_slot_t*)f->privdata; + int result = pfsFioCheckFileSlot(fileSlot); - if (result) - return result; + if(result) + return result; - pfsMount = fileSlot->clink->pfsMount; + pfsMount = fileSlot->clink->pfsMount; - result = fileTransfer(fileSlot, buf, size, 1); + result = fileTransfer(fileSlot, buf, size, 1); - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); + if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); - result = pfsFioCheckForLastError(pfsMount, result); - SignalSema(pfsFioSema); - return result; + result = pfsFioCheckForLastError(pfsMount, result); + SignalSema(pfsFioSema); + return result; } static s64 _seek(pfs_file_slot_t *fileSlot, s64 offset, int whence, int mode) { - int rv; - s64 startPos, newPos; - - if (mode & O_DIROPEN) { - return -EISDIR; - } - - switch (whence) { - case SEEK_SET: - startPos = 0; - break; - case SEEK_CUR: - startPos = fileSlot->position; - break; - case SEEK_END: - startPos = fileSlot->clink->u.inode->size; - break; - default: - return -EINVAL; - } - newPos = startPos + offset; - - if (((offset < 0) && (startPos < newPos)) || - ((offset > 0) && (startPos > newPos)) || - (fileSlot->clink->u.inode->size < newPos)) { - return -EINVAL; - } - - pfsCacheFree(fileSlot->block_pos.inode); - rv = pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, newPos); - if (rv == 0) - fileSlot->position = newPos; - else { - fileSlot->position = 0; - pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, 0); - } - - if (rv) { - return rv; - } - - return newPos; + int rv; + s64 startPos, newPos; + + if (mode & O_DIROPEN) + { + return -EISDIR; + } + + switch (whence) + { + case SEEK_SET: + startPos = 0; + break; + case SEEK_CUR: + startPos= fileSlot->position; + break; + case SEEK_END: + startPos = fileSlot->clink->u.inode->size; + break; + default: + return -EINVAL; + } + newPos = startPos + offset; + + if (((offset < 0) && (startPos < newPos)) || + ((offset > 0) && (startPos > newPos)) || + (fileSlot->clink->u.inode->size < newPos)) + { + return -EINVAL; + } + + pfsCacheFree(fileSlot->block_pos.inode); + rv=pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, newPos); + if (rv==0) + fileSlot->position = newPos; + else { + fileSlot->position = 0; + pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, 0); + } + + if (rv) + { + return rv; + } + + return newPos; } int pfsFioLseek(iop_file_t *f, int pos, int whence) { - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - int result = pfsFioCheckFileSlot(fileSlot); + pfs_file_slot_t *fileSlot = (pfs_file_slot_t*)f->privdata; + int result = pfsFioCheckFileSlot(fileSlot); - if (result) - return result; + if (result) + return result; - result = (u32)_seek(fileSlot, (s64)pos, whence, f->mode); + result = (u32)_seek(fileSlot, (s64)pos, whence, f->mode); - SignalSema(pfsFioSema); - return result; + SignalSema(pfsFioSema); + return result; } s64 pfsFioLseek64(iop_file_t *f, s64 offset, int whence) { - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - u64 rv; - - rv = pfsFioCheckFileSlot(fileSlot); - if (!rv) { - rv = _seek(fileSlot, offset, whence, f->mode); - SignalSema(pfsFioSema); - } - return rv; + pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; + u64 rv; + + rv=pfsFioCheckFileSlot(fileSlot); + if(!rv) + { + rv=_seek(fileSlot, offset, whence, f->mode); + SignalSema(pfsFioSema); + } + return rv; } static int _remove(pfs_mount_t *pfsMount, const char *path, int mode) { - char szPath[256]; - int rv = 0; - pfs_cache_t *parent; - pfs_cache_t *file; - - if ((parent = pfsInodeGetParent(pfsMount, NULL, path, szPath, &rv)) == NULL) - return rv; - - if ((file = pfsInodeGetFileInDir(parent, szPath, &rv)) != NULL) { - if (mode != 0) { // remove dir - if ((file->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - rv = -ENOTDIR; - else if (pfsCheckDirForFiles(file) == 0) - rv = -ENOTEMPTY; - else if (((u16)file->u.inode->inode_block.number == pfsMount->root_dir.number) && - ((u16)file->u.inode->inode_block.subpart == pfsMount->root_dir.subpart)) - rv = -EBUSY; - else if (((u16)file->u.inode->inode_block.number == pfsMount->current_dir.number) && - ((u16)file->u.inode->inode_block.subpart == pfsMount->current_dir.subpart)) - rv = -EBUSY; - } else // just a file - if ((file->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) - rv = -EISDIR; - - if (rv == 0) { - if (file->u.inode->uid != 0) - rv = pfsCheckAccess(file, 2); - if (file->nused >= 2) - rv = -EBUSY; - if (rv == 0) - return pfsInodeRemove(parent, file, szPath); - } - pfsCacheFree(file); - } - pfsCacheFree(parent); - return pfsFioCheckForLastError(pfsMount, rv); + char szPath[256]; + int rv=0; + pfs_cache_t *parent; + pfs_cache_t *file; + + if((parent=pfsInodeGetParent(pfsMount, NULL, path, szPath, &rv))==NULL) + return rv; + + if((file=pfsInodeGetFileInDir(parent, szPath, &rv))!=NULL) + { + if(mode!=0) + {// remove dir + if((file->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) + rv=-ENOTDIR; + else if(pfsCheckDirForFiles(file)==0) + rv=-ENOTEMPTY; + else if(((u16)file->u.inode->inode_block.number==pfsMount->root_dir.number) && + ((u16)file->u.inode->inode_block.subpart==pfsMount->root_dir.subpart)) + rv=-EBUSY; + else if(((u16)file->u.inode->inode_block.number==pfsMount->current_dir.number) && + ((u16)file->u.inode->inode_block.subpart==pfsMount->current_dir.subpart)) + rv=-EBUSY; + } + else// just a file + if((file->u.inode->mode & FIO_S_IFMT)==FIO_S_IFDIR) + rv=-EISDIR; + + if(rv==0) + { + if(file->u.inode->uid!=0) + rv=pfsCheckAccess(file, 2); + if(file->nused>=2) + rv=-EBUSY; + if(rv==0) + return pfsInodeRemove(parent, file, szPath); + } + pfsCacheFree(file); + } + pfsCacheFree(parent); + return pfsFioCheckForLastError(pfsMount, rv); } -int pfsFioRemove(iop_file_t *f, const char *name) +int pfsFioRemove(iop_file_t *f, const char *name) { - pfs_mount_t *pfsMount; - int rv; + pfs_mount_t *pfsMount; + int rv; - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - rv = _remove(pfsMount, name, 0); + rv = _remove(pfsMount, name, 0); - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } -int pfsFioMkdir(iop_file_t *f, const char *path, int mode) +int pfsFioMkdir(iop_file_t *f, const char *path, int mode) { - pfs_mount_t *pfsMount; - int rv; + pfs_mount_t *pfsMount; + int rv; - mode = (mode & 0xfff) | 0x10000 | FIO_S_IFDIR; // TODO: change to some constant/macro + mode = (mode & 0xfff) | 0x10000 | FIO_S_IFDIR; // TODO: change to some constant/macro - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - rv = openFile(pfsMount, NULL, path, O_CREAT | O_WRONLY, mode); + rv = openFile(pfsMount, NULL, path, O_CREAT | O_WRONLY, mode); - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } -int pfsFioRmdir(iop_file_t *f, const char *path) +int pfsFioRmdir(iop_file_t *f, const char *path) { - pfs_mount_t *pfsMount; - const char *temp; - int rv; + pfs_mount_t *pfsMount; + const char *temp; + int rv; - temp = path + strlen(path); - if (*temp == '.') - return -EINVAL; + temp = path + strlen(path); + if(*temp == '.') + return -EINVAL; - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - rv = _remove(pfsMount, path, 0x01); // TODO: constant for 0x01 ? + rv = _remove(pfsMount, path, 0x01); // TODO: constant for 0x01 ? - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } int pfsFioDopen(iop_file_t *f, const char *name) @@ -762,439 +800,444 @@ int pfsFioDopen(iop_file_t *f, const char *name) return pfsFioOpen(f, name, 0, 0); } -int pfsFioDread(iop_file_t *f, iox_dirent_t *dirent) +int pfsFioDread(iop_file_t *f, iox_dirent_t *dirent) { - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - pfs_blockinfo bi; - int result; - int rv; - - rv = pfsFioCheckFileSlot(fileSlot); - if (rv < 0) - return rv; - - pfsMount = fileSlot->clink->pfsMount; - - if ((fileSlot->clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) { - rv = -ENOTDIR; - } else if ((rv = pfsGetNextDentry(fileSlot->clink, &fileSlot->block_pos, (u32 *)&fileSlot->position, - dirent->name, &bi)) > 0) { - - clink = pfsInodeGetData(pfsMount, bi.subpart, bi.number, &result); - if (clink != NULL) { - fioStatFiller(clink, &dirent->stat); - pfsCacheFree(clink); - } - - if (result) - rv = result; - } - - rv = pfsFioCheckForLastError(pfsMount, rv); - SignalSema(pfsFioSema); - - return rv; + pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; + pfs_mount_t *pfsMount; + pfs_cache_t *clink; + pfs_blockinfo_t bi; + int result; + int rv; + + rv = pfsFioCheckFileSlot(fileSlot); + if(rv < 0) + return rv; + + pfsMount = fileSlot->clink->pfsMount; + + if((fileSlot->clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) + { + rv = -ENOTDIR; + } + else + if((rv = pfsGetNextDentry(fileSlot->clink, &fileSlot->block_pos, (u32 *)&fileSlot->position, + dirent->name, &bi)) > 0) + { + + clink = pfsInodeGetData(pfsMount, bi.subpart, bi.number, &result); + if(clink != NULL) + { + fioStatFiller(clink, &dirent->stat); + pfsCacheFree(clink); + } + + if(result) + rv = result; + } + + rv = pfsFioCheckForLastError(pfsMount, rv); + SignalSema(pfsFioSema); + + return rv; } static void fioStatFiller(pfs_cache_t *clink, iox_stat_t *stat) { - stat->mode = clink->u.inode->mode; - stat->attr = clink->u.inode->attr; - stat->size = (u32)clink->u.inode->size; - stat->hisize = (u32)(clink->u.inode->size >> 32); - memcpy(&stat->ctime, &clink->u.inode->ctime, sizeof(pfs_datetime)); - memcpy(&stat->atime, &clink->u.inode->atime, sizeof(pfs_datetime)); - memcpy(&stat->mtime, &clink->u.inode->mtime, sizeof(pfs_datetime)); - stat->private_0 = clink->u.inode->uid; - stat->private_1 = clink->u.inode->gid; - stat->private_2 = clink->u.inode->number_blocks; - stat->private_3 = clink->u.inode->number_data; - stat->private_4 = 0; - stat->private_5 = 0; + stat->mode = clink->u.inode->mode; + stat->attr = clink->u.inode->attr; + stat->size = (u32)clink->u.inode->size; + stat->hisize = (u32)(clink->u.inode->size >> 32); + memcpy(&stat->ctime, &clink->u.inode->ctime, sizeof(pfs_datetime_t)); + memcpy(&stat->atime, &clink->u.inode->atime, sizeof(pfs_datetime_t)); + memcpy(&stat->mtime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); + stat->private_0 = clink->u.inode->uid; + stat->private_1 = clink->u.inode->gid; + stat->private_2 = clink->u.inode->number_blocks; + stat->private_3 = clink->u.inode->number_data; + stat->private_4 = 0; + stat->private_5 = 0; } -int pfsFioGetstat(iop_file_t *f, const char *name, iox_stat_t *stat) +int pfsFioGetstat(iop_file_t *f, const char *name, iox_stat_t *stat) { - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - int rv = 0; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - clink = pfsInodeGetFile(pfsMount, NULL, name, &rv); - if (clink != NULL) { - fioStatFiller(clink, stat); - pfsCacheFree(clink); - } - - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, rv); + pfs_mount_t *pfsMount; + pfs_cache_t *clink; + int rv=0; + + if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; + + clink=pfsInodeGetFile(pfsMount, NULL, name, &rv); + if(clink!=NULL) + { + fioStatFiller(clink, stat); + pfsCacheFree(clink); + } + + SignalSema(pfsFioSema); + return pfsFioCheckForLastError(pfsMount, rv); } -int pfsFioChstat(iop_file_t *f, const char *name, iox_stat_t *stat, unsigned int statmask) +int pfsFioChstat(iop_file_t *f, const char *name, iox_stat_t *stat, unsigned int statmask) { - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - int rv = 0; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - clink = pfsInodeGetFile(pfsMount, NULL, name, &rv); - if (clink != NULL) { - - rv = pfsCheckAccess(clink, 0x02); - if (rv == 0) { - - clink->flags |= 0x01; - - if ((statmask & FIO_CST_MODE) && ((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFLNK)) - clink->u.inode->mode = (clink->u.inode->mode & FIO_S_IFMT) | (stat->mode & 0xfff); - if (statmask & FIO_CST_ATTR) - clink->u.inode->attr = (clink->u.inode->attr & 0xA0) | (stat->attr & 0xFF5F); - if (statmask & FIO_CST_SIZE) - rv = -EACCES; - if (statmask & FIO_CST_CT) - memcpy(&clink->u.inode->ctime, stat->ctime, sizeof(pfs_datetime)); - if (statmask & FIO_CST_AT) - memcpy(&clink->u.inode->atime, stat->atime, sizeof(pfs_datetime)); - if (statmask & FIO_CST_MT) - memcpy(&clink->u.inode->mtime, stat->mtime, sizeof(pfs_datetime)); - if (statmask & FIO_CST_PRVT) { - clink->u.inode->uid = stat->private_0; - clink->u.inode->gid = stat->private_1; - } - - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - - pfsCacheFree(clink); - } - - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, rv); + pfs_mount_t *pfsMount; + pfs_cache_t *clink; + int rv = 0; + + if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; + + clink = pfsInodeGetFile(pfsMount, NULL, name, &rv); + if(clink != NULL) { + + rv = pfsCheckAccess(clink, 0x02); + if(rv == 0) { + + clink->flags |= PFS_CACHE_FLAG_DIRTY; + + if((statmask & FIO_CST_MODE) && ((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFLNK)) + clink->u.inode->mode = (clink->u.inode->mode & FIO_S_IFMT) | (stat->mode & 0xfff); + if(statmask & FIO_CST_ATTR) + clink->u.inode->attr = (clink->u.inode->attr & 0xA0) | (stat->attr & 0xFF5F); + if(statmask & FIO_CST_SIZE) + rv = -EACCES; + if(statmask & FIO_CST_CT) + memcpy(&clink->u.inode->ctime, stat->ctime, sizeof(pfs_datetime_t)); + if(statmask & FIO_CST_AT) + memcpy(&clink->u.inode->atime, stat->atime, sizeof(pfs_datetime_t)); + if(statmask & FIO_CST_MT) + memcpy(&clink->u.inode->mtime, stat->mtime, sizeof(pfs_datetime_t)); + if(statmask & FIO_CST_PRVT) { + clink->u.inode->uid = stat->private_0; + clink->u.inode->gid = stat->private_1; + } + + if(pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); + } + + pfsCacheFree(clink); + + } + + SignalSema(pfsFioSema); + return pfsFioCheckForLastError(pfsMount, rv); } int pfsFioRename(iop_file_t *ff, const char *old, const char *new) { - char path1[256], path2[256]; - int result = 0; - pfs_mount_t *pfsMount; - int f; - pfs_cache_t *parentOld = NULL, *parentNew = NULL; - pfs_cache_t *removeOld = NULL, *removeNew = NULL; - pfs_cache_t *iFileOld = NULL, *iFileNew = NULL; - pfs_cache_t *newParent = NULL, *addNew = NULL; - - pfsMount = pfsFioGetMountedUnit(ff->unit); - if (pfsMount == 0) - return -ENODEV; - - parentOld = pfsInodeGetParent(pfsMount, NULL, old, path1, &result); - if (parentOld) { - u32 nused = parentOld->nused; - - if (nused != 1) { - result = -EBUSY; - goto exit; - } - - if ((iFileOld = pfsInodeGetFileInDir(parentOld, path1, &result)) == 0) - goto exit; - - if ((parentNew = pfsInodeGetParent(pfsMount, NULL, new, path2, &result)) == 0) - goto exit; - - f = (iFileOld->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR; - - if ((parentNew->nused != nused) && ((parentOld != parentNew) || (parentNew->nused != 2))) { - result = -EBUSY; - goto exit; - } - - iFileNew = pfsInodeGetFileInDir(parentNew, path2, &result); - if (iFileNew) { - if (f) { - if ((iFileNew->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - result = -ENOTDIR; - else if (pfsCheckDirForFiles(iFileNew)) { - if (iFileNew->nused >= 2) - result = -EBUSY; - else { - if (iFileOld == iFileNew) - goto exit; - } - } else - result = -ENOTEMPTY; - } else if ((iFileNew->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) - result = -EISDIR; - else if (iFileNew->nused >= 2) - result = -EBUSY; - else { - if (iFileOld == iFileNew) - goto exit; - } - } else if (result == -ENOENT) - result = 0; - - if (result) - goto exit; - - if (f && (parentOld != parentNew)) { - pfs_cache_t *parent; - - parent = pfsCacheUsedAdd(parentNew); - do { - pfs_cache_t *tmp; - - if (parent == iFileOld) { - result = -EINVAL; - break; - } - tmp = pfsInodeGetFileInDir(parent, "..", &result); - pfsCacheFree(parent); - if (tmp == parent) - break; - parent = tmp; - } while (parent); - pfsCacheFree(parent); - } - - if (result == 0) { - if (strcmp(path1, ".") && strcmp(path1, "..") && - strcmp(path2, ".") && strcmp(path2, "..")) { - result = pfsCheckAccess(parentOld, 3); - if (result == 0) - result = pfsCheckAccess(parentNew, 3); - } else - result = -EINVAL; - - if (result == 0) { - if (iFileNew && ((removeNew = pfsDirRemoveEntry(parentNew, path2)) == NULL)) - result = -ENOENT; - else { - removeOld = pfsDirRemoveEntry(parentOld, path1); - if (removeOld == 0) - result = -ENOENT; - else { - addNew = pfsDirAddEntry(parentNew, path2, &iFileOld->u.inode->inode_block, iFileOld->u.inode->mode, &result); - if (addNew && f && (parentOld != parentNew)) - newParent = pfsSetDentryParent(iFileOld, &parentNew->u.inode->inode_block, &result); - } - } - } - } - - if (result) { - if (removeNew) - removeNew->pfsMount = NULL; - if (removeOld) - removeOld->pfsMount = NULL; - if (addNew) - addNew->pfsMount = NULL; - if (iFileNew) - iFileNew->pfsMount = NULL; - parentOld->pfsMount = NULL; - parentNew->pfsMount = NULL; - } else { - if (parentOld == parentNew) { - if (removeOld != addNew) - removeOld->flags |= PFS_CACHE_FLAG_DIRTY; - } else { - pfsInodeSetTime(parentOld); - removeOld->flags |= PFS_CACHE_FLAG_DIRTY; - } - pfsInodeSetTime(parentNew); - addNew->flags |= PFS_CACHE_FLAG_DIRTY; - - if (newParent) { - pfsInodeSetTime(iFileOld); - newParent->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(newParent); - } - - if (iFileNew) { - iFileNew->flags &= ~PFS_CACHE_FLAG_DIRTY; - pfsBitmapFreeInodeBlocks(iFileNew); - } - - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - if (removeOld) - pfsCacheFree(removeOld); - if (addNew) - pfsCacheFree(addNew); - if (removeNew) - pfsCacheFree(removeNew); - exit: - if (iFileNew) - pfsCacheFree(iFileNew); - pfsCacheFree(iFileOld); - pfsCacheFree(parentOld); - pfsCacheFree(parentNew); - } - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, result); + char path1[256], path2[256]; + int result=0; + pfs_mount_t *pfsMount; + int f; + pfs_cache_t *parentOld=NULL, *parentNew=NULL; + pfs_cache_t *removeOld=NULL, *removeNew=NULL; + pfs_cache_t *iFileOld=NULL, *iFileNew=NULL; + pfs_cache_t *newParent=NULL,*addNew=NULL; + + pfsMount=pfsFioGetMountedUnit(ff->unit); + if (pfsMount==0) return -ENODEV; + + parentOld=pfsInodeGetParent(pfsMount, NULL, old, path1, &result); + if (parentOld){ + u32 nused=parentOld->nused; + + if (nused != 1){ + result=-EBUSY; + goto exit; + } + + if ((iFileOld=pfsInodeGetFileInDir(parentOld, path1, &result))==0) goto exit; + + if ((parentNew=pfsInodeGetParent(pfsMount, NULL, new, path2, &result))==0) goto exit; + + f=(iFileOld->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR; + + if ((parentNew->nused != nused) && ((parentOld!=parentNew) || (parentNew->nused!=2))){ + result=-EBUSY; + goto exit; + } + + iFileNew=pfsInodeGetFileInDir(parentNew, path2, &result); + if (iFileNew){ + if (f){ + if ((iFileNew->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) + result=-ENOTDIR; + else + if (pfsCheckDirForFiles(iFileNew)){ + if (iFileNew->nused >= 2) + result=-EBUSY; + else{ + if (iFileOld==iFileNew) + goto exit; + } + }else + result=-ENOTEMPTY; + }else + if ((iFileNew->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) + result=-EISDIR; + else + if (iFileNew->nused >= 2) + result=-EBUSY; + else{ + if (iFileOld==iFileNew) + goto exit; + } + }else + if (result==-ENOENT) + result=0; + + if (result) goto exit; + + if (f && (parentOld!=parentNew)){ + pfs_cache_t *parent; + + parent=pfsCacheUsedAdd(parentNew); + do{ + pfs_cache_t *tmp; + + if (parent==iFileOld){ + result=-EINVAL; + break; + } + tmp=pfsInodeGetFileInDir(parent, "..", &result); + pfsCacheFree(parent); + if (tmp==parent)break; + parent=tmp; + }while(parent); + pfsCacheFree(parent); + } + + if (result==0){ + if (strcmp(path1, ".") && strcmp(path1, "..") && + strcmp(path2, ".") && strcmp(path2, "..")){ + result=pfsCheckAccess(parentOld, 3); + if (result==0) + result=pfsCheckAccess(parentNew, 3); + }else + result=-EINVAL; + + if (result==0){ + if (iFileNew && ((removeNew=pfsDirRemoveEntry(parentNew, path2))==NULL)) + result=-ENOENT; + else{ + removeOld=pfsDirRemoveEntry(parentOld, path1); + if (removeOld==0) + result=-ENOENT; + else{ + addNew=pfsDirAddEntry(parentNew, path2, &iFileOld->u.inode->inode_block, iFileOld->u.inode->mode, &result); + if (addNew && f && (parentOld!=parentNew)) + newParent=pfsSetDentryParent(iFileOld, &parentNew->u.inode->inode_block, &result); + } + } + } + } + + if (result){ + if (removeNew) removeNew->pfsMount=NULL; + if (removeOld) removeOld->pfsMount=NULL; + if (addNew) addNew->pfsMount=NULL; + if (iFileNew) iFileNew->pfsMount=NULL; + parentOld->pfsMount=NULL; + parentNew->pfsMount=NULL; + }else{ + if (parentOld==parentNew){ + if (removeOld!=addNew) + removeOld->flags |= PFS_CACHE_FLAG_DIRTY; + }else + { + pfsInodeSetTime(parentOld); + removeOld->flags|=PFS_CACHE_FLAG_DIRTY; + } + pfsInodeSetTime(parentNew); + addNew->flags|=PFS_CACHE_FLAG_DIRTY; + + if (newParent){ + pfsInodeSetTime(iFileOld); + newParent->flags|=PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(newParent); + } + + if (iFileNew){ + iFileNew->flags &= ~PFS_CACHE_FLAG_DIRTY; + pfsBitmapFreeInodeBlocks(iFileNew); + } + + if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); + } + if (removeOld) pfsCacheFree(removeOld); + if (addNew) pfsCacheFree(addNew); + if (removeNew) pfsCacheFree(removeNew); +exit: + if (iFileNew) pfsCacheFree(iFileNew); + pfsCacheFree(iFileOld); + pfsCacheFree(parentOld); + pfsCacheFree(parentNew); + } + SignalSema(pfsFioSema); + return pfsFioCheckForLastError(pfsMount, result); } int pfsFioChdir(iop_file_t *f, const char *name) { - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - int result = 0; + pfs_mount_t *pfsMount; + pfs_cache_t *clink; + int result = 0; - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - clink = pfsInodeGetFile(pfsMount, 0, name, &result); - if (clink != NULL) { - if ((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - result = -ENOTDIR; - else { + clink = pfsInodeGetFile(pfsMount, 0, name, &result); + if(clink != NULL) { + if((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) + result = -ENOTDIR; + else { - result = pfsCheckAccess(clink, 0x01); + result = pfsCheckAccess(clink, 0x01); - if (result == 0) - memcpy(&pfsMount->current_dir, &clink->u.inode->inode_block, sizeof(pfs_blockinfo)); - } + if(result == 0) + memcpy(&pfsMount->current_dir, &clink->u.inode->inode_block, sizeof(pfs_blockinfo_t)); + } - pfsCacheFree(clink); - } + pfsCacheFree(clink); + } - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, result); + SignalSema(pfsFioSema); + return pfsFioCheckForLastError(pfsMount, result); } static void _sync(void) { - u32 i; - for (i = 0; i < pfsConfig.maxOpen; i++) { - pfs_restsInfo_t *info = &pfsFileSlots[i].restsInfo; - if (info->dirty) { - pfs_mount_t *pfsMount = pfsFileSlots[i].clink->pfsMount; - pfsMount->blockDev->transfer(pfsMount->fd, &pfsFileSlots[i].restsBuffer, - info->sub, info->sector, 1, PFS_IO_MODE_WRITE); - pfsFileSlots[i].restsInfo.dirty = 0; - } - } + u32 i; + for(i=0;idirty) { + pfs_mount_t *pfsMount=pfsFileSlots[i].clink->pfsMount; + pfsMount->blockDev->transfer(pfsMount->fd, &pfsFileSlots[i].restsBuffer, + info->sub, info->sector, 1, PFS_IO_MODE_WRITE); + pfsFileSlots[i].restsInfo.dirty=0; + } + } } int pfsFioSync(iop_file_t *f, const char *dev, int flag) { - pfs_mount_t *pfsMount; + pfs_mount_t *pfsMount; - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - _sync(); - pfsCacheFlushAllDirty(pfsMount); - pfsHddFlushCache(pfsMount->fd); + _sync(); + pfsCacheFlushAllDirty(pfsMount); - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, 0); + SignalSema(pfsFioSema); + return pfsFioCheckForLastError(pfsMount, 0); } -int pfsFioMount(iop_file_t *f, const char *fsname, const char *devname, int flag, void *arg, size_t arglen) +int pfsFioMount(iop_file_t *f, const char *fsname, const char *devname, int flag, void *arg, int arglen) { - int rv; - int fd; - pfs_block_device_t *blockDev; - - if (!(blockDev = pfsGetBlockDeviceTable(devname))) - return -ENXIO; - - WaitSema(pfsFioSema); - - fd = open(devname, (flag & FIO_MT_RDONLY) ? O_RDONLY : O_RDWR, 0644); // ps2hdd.irx fd - if (fd < 0) - rv = fd; - else { - if ((rv = mountDevice(blockDev, fd, f->unit, flag)) < 0) - close(fd); - } - SignalSema(pfsFioSema); - return rv; + int rv; + int fd; + pfs_block_device_t *blockDev; + + if(!(blockDev = pfsGetBlockDeviceTable(devname))) + return -ENXIO; + + WaitSema(pfsFioSema); + + fd = open(devname, (flag & FIO_MT_RDONLY) ? O_RDONLY : O_RDWR, 0644); // ps2hdd.irx fd + if(fd < 0) + rv = fd; + else { + if((rv=mountDevice(blockDev, fd, f->unit, flag)) < 0) + close(fd); + } + SignalSema(pfsFioSema); + return rv; } int pfsFioUmount(iop_file_t *f, const char *fsname) { - u32 i; - int rv = 0; - int busy_flag = 0; - pfs_mount_t *pfsMount; - - if ((pfsMount = pfsFioGetMountedUnit(f->unit)) == NULL) - return -ENODEV; - - for (i = 0; i < pfsConfig.maxOpen; i++) { - if ((pfsFileSlots[i].clink != NULL) && (pfsFileSlots[i].clink->pfsMount == pfsMount)) { - busy_flag = 1; - break; - } - } - if (busy_flag == 0) { - pfsCacheClose(pfsMount); - close(pfsMount->fd); - pfsClearMount(pfsMount); - } else - rv = -EBUSY; // Mount device busy - - SignalSema(pfsFioSema); - return rv; + u32 i; + int rv=0; + int busy_flag=0; + pfs_mount_t *pfsMount; + + if((pfsMount = pfsFioGetMountedUnit(f->unit))==NULL) + return -ENODEV; + + for(i = 0; i < pfsConfig.maxOpen; i++) + { + if((pfsFileSlots[i].clink!=NULL) && (pfsFileSlots[i].clink->pfsMount==pfsMount)) + { + busy_flag=1; + break; + } + } + if(busy_flag==0) + { + pfsCacheClose(pfsMount); + close(pfsMount->fd); + pfsClearMount(pfsMount); + } + else + rv=-EBUSY; // Mount device busy + + SignalSema(pfsFioSema); + return rv; } int pfsFioSymlink(iop_file_t *f, const char *old, const char *new) { - int rv; - pfs_mount_t *pfsMount; - int mode = 0x141FF; + int rv; + pfs_mount_t *pfsMount; + int mode=0x141FF; - if (old == NULL || new == NULL) - return -ENOENT; + if(old==NULL || new==NULL) + return -ENOENT; - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if(!(pfsMount=pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - rv = openFile(pfsMount, (pfs_file_slot_t *)old, (const char *)new, O_CREAT | O_WRONLY, mode); - SignalSema(pfsFioSema); - return rv; + rv = openFile(pfsMount, (pfs_file_slot_t *)old, (const char *)new, O_CREAT|O_WRONLY, mode); + SignalSema(pfsFioSema); + return rv; } int pfsFioReadlink(iop_file_t *f, const char *path, char *buf, int buflen) { - int rv = 0; - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - - if (buflen < 0) - return -EINVAL; - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - if ((clink = pfsInodeGetFile(pfsMount, NULL, path, &rv)) != NULL) { - if ((clink->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK) - rv = -EINVAL; - else { - rv = strlen((char *)&clink->u.inode->data[1]); - if (buflen < rv) - rv = buflen; - memcpy(buf, &clink->u.inode->data[1], rv); - } - pfsCacheFree(clink); - } - SignalSema(pfsFioSema); - - return pfsFioCheckForLastError(pfsMount, rv); + int rv=0; + pfs_mount_t *pfsMount; + pfs_cache_t *clink; + + if(buflen < 0) + return -EINVAL; + if(!(pfsMount=pfsFioGetMountedUnit(f->unit))) + return -ENODEV; + + if((clink=pfsInodeGetFile(pfsMount, NULL, path, &rv))!=NULL) + { + if((clink->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK) + rv=-EINVAL; + else + { + rv=strlen((char *)&clink->u.inode->data[1]); + if(buflen < rv) + rv=buflen; + memcpy(buf, &clink->u.inode->data[1], rv); + } + pfsCacheFree(clink); + } + SignalSema(pfsFioSema); + + return pfsFioCheckForLastError(pfsMount, rv); } int pfsFioUnsupported(void) { - PFS_PRINTF(PFS_DRV_NAME " Error: Operation currently unsupported.\n"); + PFS_PRINTF(PFS_DRV_NAME" Error: Operation currently unsupported.\n"); - return -1; + return -1; } diff --git a/modules/hdd/pfs/pfs_fio.h b/modules/hdd/pfs/pfs_fio.h index 005aca088..e5580ebb7 100644 --- a/modules/hdd/pfs/pfs_fio.h +++ b/modules/hdd/pfs/pfs_fio.h @@ -6,14 +6,12 @@ # Copyright 2001-2004, ps2dev - http://www.ps2dev.org # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. -# -# $Id$ */ #ifndef _PFS_FIO_H #define _PFS_FIO_H -#define PFS_FDIRO (0x0008) /* internal use for dopen */ +#define PFS_FDIRO (0x0008) /* internal use for dopen */ /////////////////////////////////////////////////////////////////////////////// // Function declarations @@ -26,26 +24,26 @@ void pfsFioCloseFileSlot(pfs_file_slot_t *fileSlot); /////////////////////////////////////////////////////////////////////////////// // I/O functions -int pfsFioInit(iop_device_t *f); -int pfsFioDeinit(iop_device_t *f); -int pfsFioFormat(iop_file_t *, const char *dev, const char *blockdev, void *arg, size_t arglen); -int pfsFioOpen(iop_file_t *f, const char *name, int flags, int mode); -int pfsFioClose(iop_file_t *f); -int pfsFioRead(iop_file_t *f, void *buf, int size); -int pfsFioWrite(iop_file_t *f, void *buf, int size); -int pfsFioLseek(iop_file_t *f, int pos, int whence); -int pfsFioRemove(iop_file_t *f, const char *name); -int pfsFioMkdir(iop_file_t *f, const char *path, int mode); -int pfsFioRmdir(iop_file_t *f, const char *path); -int pfsFioDopen(iop_file_t *f, const char *name); -int pfsFioDclose(iop_file_t *f); -int pfsFioDread(iop_file_t *f, iox_dirent_t *buf); -int pfsFioGetstat(iop_file_t *f, const char *name, iox_stat_t *stat); -int pfsFioChstat(iop_file_t *f, const char *name, iox_stat_t *stat, unsigned int statmask); +int pfsFioInit(iop_device_t *f); +int pfsFioDeinit(iop_device_t *f); +int pfsFioFormat(iop_file_t *, const char *dev, const char *blockdev, void *arg, int arglen); +int pfsFioOpen(iop_file_t *f, const char *name, int flags, int mode); +int pfsFioClose(iop_file_t *f); +int pfsFioRead(iop_file_t *f, void *buf, int size); +int pfsFioWrite(iop_file_t *f, void *buf, int size); +int pfsFioLseek(iop_file_t *f, int pos, int whence); +int pfsFioRemove(iop_file_t *f, const char *name); +int pfsFioMkdir(iop_file_t *f, const char *path, int mode); +int pfsFioRmdir(iop_file_t *f, const char *path); +int pfsFioDopen(iop_file_t *f, const char *name); +int pfsFioDclose(iop_file_t *f); +int pfsFioDread(iop_file_t *f, iox_dirent_t *buf); +int pfsFioGetstat(iop_file_t *f, const char *name, iox_stat_t *stat); +int pfsFioChstat(iop_file_t *f, const char *name, iox_stat_t *stat, unsigned int statmask); int pfsFioRename(iop_file_t *f, const char *old, const char *new); int pfsFioChdir(iop_file_t *f, const char *name); int pfsFioSync(iop_file_t *f, const char *dev, int flag); -int pfsFioMount(iop_file_t *f, const char *fsname, const char *devname, int flag, void *arg, size_t arglen); +int pfsFioMount(iop_file_t *f, const char *fsname, const char *devname, int flag, void *arg, int arglen); int pfsFioUmount(iop_file_t *f, const char *fsname); s64 pfsFioLseek64(iop_file_t *f, s64 offset, int whence); int pfsFioSymlink(iop_file_t *f, const char *old, const char *new); diff --git a/modules/hdd/pfs/pfs_fioctl.c b/modules/hdd/pfs/pfs_fioctl.c index e3eabd156..690a40b17 100644 --- a/modules/hdd/pfs/pfs_fioctl.c +++ b/modules/hdd/pfs/pfs_fioctl.c @@ -7,7 +7,6 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id$ # PFS ioctl and devctl related routines */ @@ -41,394 +40,319 @@ static int ioctl2AttrDelete(pfs_cache_t *clink, void *arg); static int ioctl2AttrLoopUp(pfs_cache_t *clink, char *key, char *value); static int ioctl2AttrRead(pfs_cache_t *clink, pfs_ioctl2attr_t *attr, u32 *unkbuf); -int pfsFioIoctl(iop_file_t *f, unsigned long arg, void *param) +int pfsFioIoctl(iop_file_t *f, int cmd, void *param) { - return -1; + return -1; } int pfsFioDevctl(iop_file_t *f, const char *name, int cmd, void *arg, size_t arglen, void *buf, size_t buflen) { - pfs_mount_t *pfsMount; - int rv = 0; + pfs_mount_t *pfsMount; + int rv=0; - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if(!(pfsMount=pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - switch (cmd) { - case PFS_DEVCTL_GET_ZONE_SIZE: - rv = pfsMount->zsize; - break; - - case PFS_DEVCTL_GET_ZONE_FREE: - rv = pfsMount->zfree; - break; + switch(cmd) + { + case PDIOC_ZONESZ: + rv=pfsMount->zsize; + break; - case PFS_DEVCTL_CLOSE_ALL: - pfsFioDevctlCloseAll(); - pfsHddFlushCache(pfsMount->fd); - break; + case PDIOC_ZONEFREE: + rv=pfsMount->zfree; + break; - case PFS_DEVCTL_CLEAR_STAT: - rv = devctlFsckStat(pfsMount, PFS_MODE_REMOVE_FLAG); - break; + case PDIOC_CLOSEALL: + pfsFioDevctlCloseAll(); + break; - case PFS_DEVCTL_GET_STAT: - rv = devctlFsckStat(pfsMount, PFS_MODE_CHECK_FLAG); - break; + case PDIOC_CLRFSCKSTAT: + rv=devctlFsckStat(pfsMount, PFS_MODE_REMOVE_FLAG); + break; - case PFS_DEVCTL_SET_UID: - pfsMount->uid = *(u16 *)(arg); - break; + case PDIOC_GETFSCKSTAT: + rv=devctlFsckStat(pfsMount, PFS_MODE_CHECK_FLAG); + break; -#if PFS_DEVCTL_SET_UID != PFS_DEVCTL_SET_GID - case PFS_DEVCTL_SET_GID: - pfsMount->gid = *(u16 *)(arg); - break; -#endif - case PFS_DEVCTL_SHOW_BITMAP: - pfsBitmapShow(pfsMount); - break; + case PDIOC_SETUID: + pfsMount->uid=*(u16 *)(arg); + break; - default: - rv = -EINVAL; - break; - } - SignalSema(pfsFioSema); + case PDIOC_SETGID: + pfsMount->gid=*(u16 *)(arg); + break; - return rv; -} + case PDIOC_SHOWBITMAP: + pfsBitmapShow(pfsMount); + break; -int pfsFioIoctl2(iop_file_t *f, int cmd, void *arg, size_t arglen, void *buf, size_t buflen) -{ - int rv; - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - pfs_mount_t *pfsMount; - - if (f->mode & O_DIROPEN) - if (cmd == PFS_IOCTL2_ATTR_READ) - return -EISDIR; - - if (!(f->mode & O_WRONLY)) { - if (cmd != PFS_IOCTL2_ATTR_LOOKUP) - if (cmd != PFS_IOCTL2_ATTR_READ) - return -EACCES; - } - if ((rv = pfsFioCheckFileSlot(fileSlot)) < 0) - return rv; - pfsMount = fileSlot->clink->pfsMount; - - switch (cmd) { - case PFS_IOCTL2_ALLOC: - rv = pfsFioIoctl2Alloc(fileSlot->clink, *(int *)(arg), 1); - break; + default: + rv=-EINVAL; + break; - case PFS_IOCTL2_FREE: - pfsFioIoctl2Free(fileSlot->clink); - break; + } + SignalSema(pfsFioSema); - case PFS_IOCTL2_ATTR_ADD: - case PFS_IOCTL2_ATTR_DEL: - case PFS_IOCTL2_ATTR_LOOKUP: - case PFS_IOCTL2_ATTR_READ: - rv = ioctl2Attr(fileSlot->clink, cmd, arg, buf, &fileSlot->aentryOffset); - break; + return rv; +} +int pfsFioIoctl2(iop_file_t *f, int cmd, void *arg, size_t arglen, void *buf, size_t buflen) +{ + int rv; + pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; + pfs_mount_t *pfsMount; + + if(f->mode & O_DIROPEN) + if(cmd==PIOCATTRREAD) + return -EISDIR; + + if(!(f->mode & O_WRONLY)) { + if(cmd!=PIOCATTRLOOKUP) + if(cmd!=PIOCATTRREAD) + return -EACCES; + } + if((rv=pfsFioCheckFileSlot(fileSlot))<0) + return rv; + pfsMount=fileSlot->clink->pfsMount; + + switch(cmd) + { + case PIOCALLOC: + rv=pfsAllocZones(fileSlot->clink, *(int *)(arg), 1); + break; + + case PIOCFREE: + pfsFreeZones(fileSlot->clink); + break; + + case PIOCATTRADD: + case PIOCATTRDEL: + case PIOCATTRLOOKUP: + case PIOCATTRREAD: + rv=ioctl2Attr(fileSlot->clink, cmd, arg, buf, &fileSlot->aentryOffset); + break; + + // Custom IOCTL2 command(s) for OPL case PFS_IOCTL2_GET_INODE: - memcpy(buf, fileSlot->clink->u.inode, sizeof(pfs_inode)); - rv = sizeof(pfs_inode); + memcpy(buf, fileSlot->clink->u.inode, sizeof(pfs_inode_t)); + rv = sizeof(pfs_inode_t); break; - default: - rv = -EINVAL; - break; - } + default: + rv=-EINVAL; + break; + } - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - rv = pfsFioCheckForLastError(pfsMount, rv); - SignalSema(pfsFioSema); + if(pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); + rv=pfsFioCheckForLastError(pfsMount, rv); + SignalSema(pfsFioSema); - return rv; + return rv; } static int ioctl2Attr(pfs_cache_t *clink, int cmd, void *arg, void *outbuf, u32 *offset) -{ // attr set, attr delete, attr lookup, attr read cmds - int rv; - pfs_cache_t *flink; +{ // attr set, attr delete, attr lookup, attr read cmds + int rv; + pfs_cache_t *flink; - if ((flink = pfsCacheGetData(clink->pfsMount, clink->sub, clink->sector + 1, PFS_CACHE_FLAG_NOTHING, &rv)) == NULL) - return rv; + if((flink=pfsCacheGetData(clink->pfsMount, clink->sub, clink->sector+1 + ,PFS_CACHE_FLAG_NOTHING, &rv))==NULL) + return rv; - switch (cmd) { - case PFS_IOCTL2_ATTR_ADD: - rv = ioctl2AttrAdd(flink, arg); - break; + switch(cmd) + { + case PIOCATTRADD: + rv=ioctl2AttrAdd(flink, arg); + break; - case PFS_IOCTL2_ATTR_DEL: - rv = ioctl2AttrDelete(flink, arg); - break; + case PIOCATTRDEL: + rv=ioctl2AttrDelete(flink, arg); + break; - case PFS_IOCTL2_ATTR_LOOKUP: - rv = ioctl2AttrLoopUp(flink, arg, outbuf); - break; + case PIOCATTRLOOKUP: + rv=ioctl2AttrLoopUp(flink, arg, outbuf); + break; - case PFS_IOCTL2_ATTR_READ: - rv = ioctl2AttrRead(flink, outbuf, offset); - break; - } - pfsCacheFree(flink); + case PIOCATTRREAD: + rv=ioctl2AttrRead(flink, outbuf, offset); + break; - return rv; + } + pfsCacheFree(flink); + + return rv; } void pfsFioDevctlCloseAll(void) { - u32 i; - - for (i = 0; i < pfsConfig.maxOpen; i++) { - if (pfsFileSlots[i].fd) - pfsFioCloseFileSlot(&pfsFileSlots[i]); - } - for (i = 0; i < pfsConfig.maxOpen; i++) { - pfs_mount_t *pfsMount; - if ((pfsMount = pfsGetMountedUnit(i)) != NULL) - pfsCacheFlushAllDirty(pfsMount); - } + u32 i; + + for(i=0;i < pfsConfig.maxOpen;i++) + { + if(pfsFileSlots[i].fd) + pfsFioCloseFileSlot(&pfsFileSlots[i]); + } + for(i=0;i < pfsConfig.maxOpen;i++) + { + pfs_mount_t *pfsMount; + if((pfsMount=pfsGetMountedUnit(i))!=NULL) + pfsCacheFlushAllDirty(pfsMount); + + } } static int devctlFsckStat(pfs_mount_t *pfsMount, int mode) { - int rv; - pfs_cache_t *clink; - - if ((clink = pfsCacheAllocClean(&rv)) != NULL) { - rv = pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_ERROR_0x02, mode); - pfsCacheFree(clink); - } - return rv; + int rv; + pfs_cache_t *clink; + + if((clink=pfsCacheAllocClean(&rv))!=NULL){ + rv=pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_ERRORS_FIXED, mode); + pfsCacheFree(clink); + } + return rv; } static pfs_aentry_t *getAentry(pfs_cache_t *clink, char *key, char *value, int mode) -{ // mode 0=lookup, 1=add, 2=delete - int kLen, fullsize; - pfs_aentry_t *aentry = clink->u.aentry; - pfs_aentry_t *aentryLast = NULL; - u32 end; - - kLen = strlen(key); - fullsize = (kLen + strlen(value) + 7) & ~3; - for (end = (u32)aentry + 1024; (u32)end < (u32)(aentry); (char *)aentry += aentry->aLen) { - if (aentry->aLen & 3) - PFS_PRINTF(PFS_DRV_NAME " Error: attrib-entry allocated length/4 != 0\n"); - if (aentry->aLen < ((aentry->kLen + aentry->vLen + 7) & ~3)) { - PFS_PRINTF(PFS_DRV_NAME " Panic: attrib-entry is too small\n"); - return NULL; - } - if ((u32)end < (u32)aentry + aentry->aLen) - PFS_PRINTF(PFS_DRV_NAME " Error: attrib-emtru too big\n"); - - switch (mode) { - case 0: // lookup - if (kLen == aentry->kLen) - if (memcmp(key, aentry->str, kLen) == 0) - return aentry; - break; - - case 1: // add - if (aentry->kLen == 0) { - if (aentry->aLen >= fullsize) - return aentry; - } - if (aentry->aLen - ((aentry->kLen + aentry->vLen + 7) & ~3) < fullsize) - continue; - return aentry; - - default: // delete - if (kLen == aentry->kLen) { - if (memcmp(key, aentry->str, kLen) == 0) { - if (aentryLast != NULL) { - aentryLast->aLen += aentry->aLen; - return aentry; - } - // delete it :P - aentry->kLen = 0; - aentry->vLen = 0; - return aentry; - } - } - aentryLast = aentry; - break; - } - } - return NULL; +{ // mode 0=lookup, 1=add, 2=delete + int kLen, fullsize; + pfs_aentry_t *aentry=clink->u.aentry; + pfs_aentry_t *aentryLast=NULL; + pfs_aentry_t *end; + + kLen=strlen(key); + fullsize=(kLen+strlen(value)+7) & ~3; + for(end=(pfs_aentry_t *)((u8*)aentry+1024);end < aentry; aentry=(pfs_aentry_t *)((u8*)aentry+aentry->aLen)) + { + if(aentry->aLen & 3) + PFS_PRINTF(PFS_DRV_NAME" Error: attrib-entry allocated length/4 != 0\n"); + if(aentry->aLen < ((aentry->kLen+aentry->vLen+7) & ~3)) + { + PFS_PRINTF(PFS_DRV_NAME" Panic: attrib-entry is too small\n"); + return NULL; + } + if(end < (pfs_aentry_t*)((u8*)aentry+aentry->aLen)) + PFS_PRINTF(PFS_DRV_NAME" Error: attrib-entry too big\n"); + + switch(mode) + { + case 0:// lookup + if(kLen==aentry->kLen) + if(memcmp(key, aentry->str, kLen)==0) + return aentry; + break; + + case 1:// add + if(aentry->kLen==0) + { + if(aentry->aLen>=fullsize) + return aentry; + } + if(aentry->aLen - ((aentry->kLen+aentry->vLen+7) & ~3) < fullsize) + continue; + return aentry; + + default:// delete + if(kLen==aentry->kLen) + { + if(memcmp(key, aentry->str, kLen)==0) + { + if(aentryLast!=NULL) + { + aentryLast->aLen+=aentry->aLen; + return aentry; + } + // delete it :P + aentry->kLen=0; + aentry->vLen=0; + return aentry; + } + } + aentryLast=aentry; + break; + + } + } + return NULL; } static int ioctl2AttrAdd(pfs_cache_t *clink, pfs_ioctl2attr_t *attr) { - u32 kLen, vLen; - pfs_aentry_t *aentry; - u32 tmp; - - // input check - kLen = strlen(attr->key); - vLen = strlen(attr->value); - if (kLen >= 256 || vLen >= 256) // max size safe e check - return -EINVAL; - - if (kLen == 0 || vLen == 0) // no input check - return -EINVAL; - - if (getAentry(clink, attr->key, NULL, 0)) - return -EEXIST; - if (!(aentry = getAentry(clink, attr->key, attr->value, 1))) - return -ENOSPC; - - if (aentry->kLen == 0) - tmp = aentry->aLen; - else - tmp = aentry->aLen - ((aentry->kLen + (aentry->vLen + 7)) & ~3); - - aentry->aLen -= tmp; - aentry = (pfs_aentry_t *)((u8 *)aentry + aentry->aLen); - aentry->kLen = kLen; - aentry->vLen = vLen; - aentry->aLen = tmp; - memcpy(&aentry->str[0], attr->key, aentry->kLen); - memcpy(&aentry->str[aentry->kLen], attr->value, aentry->vLen); - clink->flags |= PFS_CACHE_FLAG_DIRTY; - - return 0; + u32 kLen, vLen; + pfs_aentry_t *aentry; + u32 tmp; + + // input check + kLen=strlen(attr->key); + vLen=strlen(attr->value); + if(kLen>=256 || vLen>=256) // max size safe e check + return -EINVAL; + + if(kLen==0 || vLen==0) // no input check + return -EINVAL; + + if(getAentry(clink, attr->key, NULL, 0)) + return -EEXIST; + if(!(aentry=getAentry(clink, attr->key, attr->value, 1))) + return -ENOSPC; + + if(aentry->kLen==0) + tmp=aentry->aLen; + else + tmp=aentry->aLen-((aentry->kLen+(aentry->vLen + 7)) & ~3); + + aentry->aLen-=tmp; + aentry = (pfs_aentry_t*)((u8 *)aentry + aentry->aLen); + aentry->kLen=kLen; + aentry->vLen=vLen; + aentry->aLen=tmp; + memcpy(&aentry->str[0], attr->key, aentry->kLen); + memcpy(&aentry->str[aentry->kLen], attr->value, aentry->vLen); + clink->flags|=PFS_CACHE_FLAG_DIRTY; + + return 0; } static int ioctl2AttrDelete(pfs_cache_t *clink, void *arg) { - pfs_aentry_t *aentry; + pfs_aentry_t *aentry; - if ((aentry = getAentry(clink, arg, 0, 2)) == NULL) - return -ENOENT; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - return 0; + if((aentry=getAentry(clink, arg, 0, 2))==NULL) + return -ENOENT; + clink->flags|=PFS_CACHE_FLAG_DIRTY; + return 0; } static int ioctl2AttrLoopUp(pfs_cache_t *clink, char *key, char *value) { - pfs_aentry_t *aentry; - - if ((aentry = getAentry(clink, key, 0, 0))) { - memcpy(value, &aentry->str[aentry->kLen], aentry->vLen); - value[aentry->vLen] = 0; - return aentry->vLen; - } - return -ENOENT; + pfs_aentry_t *aentry; + + if((aentry=getAentry(clink, key, 0, 0))){ + memcpy(value, &aentry->str[aentry->kLen], aentry->vLen); + value[aentry->vLen]=0; + return aentry->vLen; + } + return -ENOENT; } static int ioctl2AttrRead(pfs_cache_t *clink, pfs_ioctl2attr_t *attr, u32 *offset) { - pfs_aentry_t *aentry; - - if (*offset >= 1024) - return 0; - do { - aentry = (pfs_aentry_t *)((u32)(clink->u.inode) + *offset); - memcpy(attr->key, &aentry->str[0], aentry->kLen); - attr->key[aentry->kLen] = 0; - memcpy(attr->value, &aentry->str[aentry->kLen], aentry->vLen); - attr->value[aentry->vLen] = 0; - *offset += aentry->aLen; // next - if (aentry->kLen != 0) - break; - } while (*offset < 1024); - - return aentry->kLen; -} - -int pfsFioIoctl2Alloc(pfs_cache_t *clink, int msize, int mode) -{ - pfs_blockpos_t blockpos; - int result = 0; - u32 val; - int zsize; - - zsize = clink->pfsMount->zsize; - val = ((msize - 1 + zsize) & (-zsize)) / zsize; - - if (mode == 0) - if (((clink->u.inode->number_blocks - clink->u.inode->number_segdesg) * (u64)zsize) >= (clink->u.inode->size + msize)) - return 0; - - if ((blockpos.inode = pfsBlockGetLastSegmentDescriptorInode(clink, &result))) { - blockpos.block_offset = blockpos.byte_offset = 0; - blockpos.block_segment = clink->u.inode->number_data - 1; - val -= pfsBlockExpandSegment(clink, &blockpos, val); - while (val && ((result = pfsBlockAllocNewSegment(clink, &blockpos, val)) >= 0)) { - val -= result; - result = 0; - } - pfsCacheFree(blockpos.inode); - } - return result; -} - -void pfsFioIoctl2Free(pfs_cache_t *pfree) -{ - pfs_blockinfo b; - int result; - pfs_mount_t *pfsMount = pfree->pfsMount; - pfs_inode *inode = pfree->u.inode; - u32 nextsegdesc = 1, limit = inode->number_data, i, j = 0, zones; - pfs_blockinfo *bi; - pfs_cache_t *clink; - - zones = (u32)(inode->size / pfsMount->zsize); - if (inode->size % pfsMount->zsize) - zones++; - if (inode->number_segdesg + zones == inode->number_blocks) - return; - - j = zones; - b.number = 0; - clink = pfsCacheUsedAdd(pfree); - - // iterate through each of the block segments used by the inode - for (i = 1; i < limit && j; i++) { - if (pfsFixIndex(i) == 0) { - if ((clink = pfsBlockGetNextSegment(clink, &result)) == 0) - return; - - nextsegdesc++; - } else if (j < clink->u.inode->data[pfsFixIndex(i)].count) { - clink->u.inode->data[pfsFixIndex(i)].count -= j; - b.subpart = clink->u.inode->data[pfsFixIndex(i)].subpart; - b.count = j; - b.number = clink->u.inode->data[pfsFixIndex(i)].number + - clink->u.inode->data[pfsFixIndex(i)].count; - j = 0; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - } else - j -= clink->u.inode->data[pfsFixIndex(i)].count; - } - - pfree->u.inode->number_data = i; - pfree->u.inode->number_blocks = zones + nextsegdesc; - pfree->u.inode->number_segdesg = nextsegdesc; - pfree->u.inode->last_segment.number = clink->u.inode->data[0].number; - pfree->u.inode->last_segment.subpart = clink->u.inode->data[0].subpart; - pfree->u.inode->last_segment.count = clink->u.inode->data[0].count; - pfree->flags |= PFS_CACHE_FLAG_DIRTY; - - if (b.number) - pfsBitmapFreeBlockSegment(pfsMount, &b); - - while (i < limit) { - if (pfsFixIndex(i) == 0) { - if ((clink = pfsBlockGetNextSegment(clink, &result)) == 0) - return; - } - bi = &clink->u.inode->data[pfsFixIndex(i++)]; - pfsBitmapFreeBlockSegment(pfsMount, bi); - pfsCacheMarkClean(pfsMount, bi->subpart, bi->number << pfsMount->inode_scale, - (bi->number + bi->count) << pfsMount->inode_scale); - } - - pfsCacheFree(clink); + pfs_aentry_t *aentry; + + if(*offset >= 1024) + return 0; + do { + aentry=(pfs_aentry_t *)((u8*)clink->u.inode+*offset); + memcpy(attr->key, &aentry->str[0], aentry->kLen); + attr->key[aentry->kLen]=0; + memcpy(attr->value, &aentry->str[aentry->kLen], aentry->vLen); + attr->value[aentry->vLen]=0; + *offset+=aentry->aLen; // next + if(aentry->kLen!=0) + break; + } while(*offset < 1024); + + return aentry->kLen; } diff --git a/modules/hdd/pfs/pfs_fioctl.h b/modules/hdd/pfs/pfs_fioctl.h index 58c66d99b..8455ce180 100644 --- a/modules/hdd/pfs/pfs_fioctl.h +++ b/modules/hdd/pfs/pfs_fioctl.h @@ -6,8 +6,6 @@ # Copyright 2001-2004, ps2dev - http://www.ps2dev.org # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. -# -# $Id$ */ #ifndef _PFS_FIOCTL_H @@ -16,12 +14,10 @@ /////////////////////////////////////////////////////////////////////////////// // Function declarations -int pfsFioIoctl(iop_file_t *f, unsigned long arg, void *param); +int pfsFioIoctl(iop_file_t *f, int cmd, void *param); int pfsFioIoctl2(iop_file_t *f, int cmd, void *arg, size_t arglen, void *buf, size_t buflen); int pfsFioDevctl(iop_file_t *f, const char *name, int cmd, void *arg, size_t arglen, void *buf, size_t buflen); void pfsFioDevctlCloseAll(void); -int pfsFioIoctl2Alloc(pfs_cache_t *clink, int msize, int mode); -void pfsFioIoctl2Free(pfs_cache_t *pfree); #endif /* _PFS_FIOCTL_H */ diff --git a/modules/isofs/isofs.c b/modules/isofs/isofs.c index 1cf5ed237..3b349b69d 100644 --- a/modules/isofs/isofs.c +++ b/modules/isofs/isofs.c @@ -486,7 +486,7 @@ static int ProbeISO9660(int fd, unsigned int sector, layer_info_t *layer_info) return result; } -static int IsofsMount(iop_file_t *f, const char *fsname, const char *devname, int flags, void *arg, unsigned int arglen) +static int IsofsMount(iop_file_t *f, const char *fsname, const char *devname, int flags, void *arg, int arglen) { int fd, result; diff --git a/modules/mcemu/imports.lst b/modules/mcemu/imports.lst index eeebb0a2c..982419862 100755 --- a/modules/mcemu/imports.lst +++ b/modules/mcemu/imports.lst @@ -64,7 +64,6 @@ sysclib_IMPORTS_end sysmem_IMPORTS_start I_AllocSysMemory I_FreeSysMemory -I_Kprintf_set sysmem_IMPORTS_end thbase_IMPORTS_start diff --git a/modules/usb/usbhdfsd/fs_driver.c b/modules/usb/usbhdfsd/fs_driver.c index c727221ac..9edac156b 100644 --- a/modules/usb/usbhdfsd/fs_driver.c +++ b/modules/usb/usbhdfsd/fs_driver.c @@ -736,7 +736,7 @@ static int fs_getstat(iop_file_t *fd, const char *name, iox_stat_t *stat) //--------------------------------------------------------------------------- -int fs_ioctl(iop_file_t *fd, u32 request, void *data) +int fs_ioctl(iop_file_t *fd, int cmd, void *data) { fat_driver *fatd; struct fs_dirent *dirent = (struct fs_dirent *)fd->privdata; //Remember to re-cast this to the right structure (either fs_rec or fs_dir)! @@ -753,7 +753,7 @@ int fs_ioctl(iop_file_t *fd, u32 request, void *data) return -ENODEV; } - switch (request) { + switch (cmd) { case USBMASS_IOCTL_RENAME: ret = fat_renameFile(fatd, &dirent->fatdir, data); //No need to re-cast since this inner structure is a common one. FLUSH_SECTORS(fatd); diff --git a/src/hddsupport.c b/src/hddsupport.c index 5ac1c190a..1fc7adf41 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -120,7 +120,7 @@ static int CreateOPLPartition(const char *oplPart, const char *mountpoint) int fd, result; char cmd[43]; - sprintf(cmd, "%s,128M", oplPart); + sprintf(cmd, "%s,,,128M", oplPart); if ((fd = fileXioOpen(cmd, O_CREAT | O_TRUNC | O_RDWR, 0644)) >= 0) { fileXioClose(fd); result = fileXioFormat(mountpoint, oplPart, (const char *)&formatArg, sizeof(formatArg)); From 35cc1d24fedb2eb9532a422570816082fc33a68b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 23 Jan 2017 14:18:59 -0800 Subject: [PATCH 022/269] Following changes were made: **************************** (1) by Dr-Q: lng_pack.sh: Make it more simple and less hack-ish TravisCI: Fix some things * revert test changes, they not work * fix make_changelog.sh * reorganize cloning * rename variables * fix -dirty flag and add hack for it TravisCI: Fix libtool: link: only absolute run-paths are allowed TravisCI: Temporary upload to transfer.sh * We can store it for 14 days * But someone need to pickup it and post TravisCI: Fix style and after_success TravisCI: Use Ubuntu 14.04 (Trusty Tahr) TravisCI: Suppress output with travis_wait TravisCI: Redirect otput to /dev/null * i dont wanted to make it, but the log is spamming all! * its a workaround by now, anyway im not sure if it will work TravisCI: Remove all travis_wait and go back to ps2dev **************************** (2) by Caio99BR: TravisCI/DETAILED_CHANGELOG/Scripts: Fix all old issues lng_pack: Add falling back to old method Signed-off-by: Caio Oliveira lng_pack/.gitignore: Fix chmod and ignore all .ZIP Signed-off-by: Caio Oliveira make_changelog: Fix issues when calling via sh Signed-off-by: Caio Oliveira TravisCI/DETAILED_CHANGELOG: Fix issue with latest changes TravisCI: Optimize @Dr-Q changes Signed-off-by: Caio Oliveira TravisCI: Remove not working uploading of log Signed-off-by: Caio Oliveira TravisCI: Update to latest changes in Makefile Signed-off-by: Caio Oliveira TravisCI: Convert '/' to '-' Signed-off-by: Caio Oliveira TravisCI: Use only the name Signed-off-by: Caio Oliveira TravisCI: Add tag to TravisCI build, and remove Deploy section * Why I removed Deploy Section? This is simple, Official builds have custom changes and we are using transfer.sh to upload TravisCI builds But Official builds, need more than custom changes I think. Also @ElPatas, make upload of Beta Releases in a new tag, see 3937113 * Fix export of variables in TravisCI Signed-off-by: Caio Oliveira TravisCI: We need to debug PS2Toolchain issues Signed-off-by: Caio Oliveira TravisCI: Fix problems with upload zip's Signed-off-by: Caio Oliveira .gitignore: Optimize it Signed-off-by: Caio Oliveira **************************** (3) by Caio99BR: TravisCI: Decrease time of builds with ccache and upload builds to my gh-page (#2) * TravisCI: It's Okay if we upload latest build to my gh-page? * add upload commands to gh-page, so I can control access Signed-off-by: Caio Oliveira * TravisCI: Enable ccache to speed up build of ps2sdk Signed-off-by: Caio Oliveira --- .gitignore | 27 +++++- .travis.yml | 223 ++++++++++++++++++++++++--------------------- DETAILED_CHANGELOG | 81 ++++++++-------- lng_pack.sh | 62 +++++++++---- make_changelog.sh | 8 +- 5 files changed, 227 insertions(+), 174 deletions(-) diff --git a/.gitignore b/.gitignore index e23faf994..e35edd4ae 100755 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,32 @@ -*.o -*.s +# +# NOTE! Please use 'git ls-files -i --exclude-standard' +# command after changing this file, to see if there are +# any tracked files which get ignored after the change. +# +# Normal rules +# +*.a +*.diff *.elf *.ELF *.erl -*.irx *.exe +*.irx *.map +*.o *.patch -*.diff +*.rej +*.s *.zip -libfreetype.a +*.ZIP + +# +# git files that we don't want to ignore even it they are dot-files +# +!.gitignore +# +# Generated source files +# pc/iso2usbld/bin/iso2usbld IOPRP_img.c diff --git a/.travis.yml b/.travis.yml index b153a29ff..2971b738e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,118 +3,133 @@ ## Thanks to: # - izdubar@psx-scene and jimmikaelkael@psx-scene # -# - doctorxyz@ps2home -# +# - Bat Rastard@psx-scene and doctorxyz@psx-scene +# # - and a lot of people around internet :) + +dist: trusty sudo: required language: c +cache: ccache + +## Fix make_changelog.sh +git: + depth: 9999999 before_install: -## Save current dir, go to previous dir and save it too -- export opl_build_dir=$(pwd) -- cd ../ -- export travis_build_dir=$(pwd) + ## Save env dir + - cd ../ + - export TRAVIS_ENV_DIR=$(pwd) + + ## Save repo name + - export NEW_REPO_SLUG=$(echo ${TRAVIS_REPO_SLUG} | cut -f 1 -d "/") + + ## Make CCache good to us + - export PATH="/usr/lib/ccache:${PATH}" install: -## OPL Building Dependencies -- sudo apt-get install -yqq gcc-4.4 patch wget make git libc6-dev zlib1g zlib1g-dev libucl1 libucl-dev + ## Dependencies + - sudo apt-get install -yqqq gcc-4.4 patch wget make git libc6-dev zlib1g zlib1g-dev libucl1 libucl-dev ccache before_script: -## Make cleanup, just for prevent anything -- cd ${travis_build_dir}/ -- rm -rf gsKit/ ps2eth/ ps2toolchain/ ps2-packer/ ps2sdk-ports/ - -## Set up the environment. -- export PS2DEV=${travis_build_dir}/ps2dev -- export PS2SDK=${PS2DEV}/ps2sdk -- export PATH=${PATH}:${PS2DEV}/bin:${PS2DEV}/ee/bin:${PS2DEV}/iop/bin:${PS2DEV}/dvp/bin:${PS2SDK}/bin -- export PS2ETH=${PS2DEV}/ps2eth -- export GSKIT=${PS2DEV}/gsKit -- export LANG=C -- export LC_ALL=C - -## ps2dev/PS2Toolchain -- cd ${travis_build_dir}/ -- git clone --quiet https://github.com/ps2dev/ps2toolchain.git ${travis_build_dir}/ps2toolchain/ -- cd ${travis_build_dir}/ps2toolchain/ -- ./toolchain.sh - -## ps2dev/PS2SDKPorts -- cd ${travis_build_dir}/ -- git clone --quiet https://github.com/ps2dev/ps2sdk-ports.git ${travis_build_dir}/ps2sdk-ports/ - -## ps2dev/PS2SDKPorts/zlib -- cd ${travis_build_dir}/ps2sdk-ports/zlib/ -- make -- make install - -## ps2dev/PS2SDKPorts/libpng -- cd ${travis_build_dir}/ps2sdk-ports/libpng/ -- make -- make install - -## ps2dev/PS2SDKPorts/libjpeg -- cd ${travis_build_dir}/ps2sdk-ports/libjpeg/ -- make -- make install - -## ps2dev/PS2SDKPorts/freetype -- cd ${travis_build_dir}/ps2sdk-ports/freetype-2.4.12/ -- source SetupPS2.sh - -## ps2dev/PS2ETH -- cd ${travis_build_dir}/ -- git clone --quiet https://github.com/ps2dev/ps2eth ${travis_build_dir}/ps2eth/ -- cd ${travis_build_dir}/ps2eth/ -- make -- sudo mkdir -p /usr/lib/ps2dev/ps2eth -- sudo tar c $(find . -name \*irx) | sudo tar x -C /usr/lib/ps2dev/ps2eth - -## ps2dev/gsKit -- cd ${travis_build_dir}/ -- git clone --quiet https://github.com/ps2dev/gsKit.git ${travis_build_dir}/gsKit/ -- cd ${travis_build_dir}/gsKit/ -- make -- make install - -## ps2dev/PS2Packer -- cd ${travis_build_dir}/ -- git clone --quiet https://github.com/ps2dev/ps2-packer.git ${travis_build_dir}/ps2-packer/ -- cd ${travis_build_dir}/ps2-packer/ -- make -- make install + ## Make cleanup, just for prevent anything + - rm -rf ${TRAVIS_ENV_DIR}/gsKit/ ${TRAVIS_ENV_DIR}/ps2eth/ ${TRAVIS_ENV_DIR}/ps2toolchain/ ${TRAVIS_ENV_DIR}/ps2-packer/ ${TRAVIS_ENV_DIR}/ps2sdk-ports/ + + ## Set up the environment + - export PS2DEV=${TRAVIS_ENV_DIR}/ps2dev + - export PS2SDK=${PS2DEV}/ps2sdk + - export PATH=${PATH}:${PS2DEV}/bin:${PS2DEV}/ee/bin:${PS2DEV}/iop/bin:${PS2DEV}/dvp/bin:${PS2SDK}/bin + - export PS2ETH=${PS2DEV}/ps2eth + - export GSKIT=${PS2DEV}/gsKit + - export LANG=C + - export LC_ALL=C + + ## Clone all + - git clone --quiet https://github.com/ps2dev/ps2toolchain.git ${TRAVIS_ENV_DIR}/ps2toolchain/ + - git clone --quiet https://github.com/ps2dev/ps2sdk-ports.git ${TRAVIS_ENV_DIR}/ps2sdk-ports/ + - git clone --quiet https://github.com/ps2dev/ps2eth ${TRAVIS_ENV_DIR}/ps2eth/ + - git clone --quiet https://github.com/ps2dev/gsKit.git ${TRAVIS_ENV_DIR}/gsKit/ + - git clone --quiet https://github.com/ps2dev/ps2-packer.git ${TRAVIS_ENV_DIR}/ps2-packer/ + - chmod +x $(find . -name \*sh) + + ## ps2dev/PS2Toolchain + - cd ${TRAVIS_ENV_DIR}/ps2toolchain/ + - bash ./toolchain.sh > /tmp/OPNPS2LD-PS2TOOLCHAIN.log 2>&1 + - curl --upload-file /tmp/OPNPS2LD-PS2TOOLCHAIN.log https://transfer.sh/OPNPS2LD-PS2TOOLCHAIN-${NEW_REPO_SLUG}-NIGHTLY${TRAVIS_BUILD_NUMBER}.log + + ## ps2dev/PS2SDKPorts/zlib + - cd ${TRAVIS_ENV_DIR}/ps2sdk-ports/zlib/ + - make + - make install + + ## ps2dev/PS2SDKPorts/libpng + - cd ${TRAVIS_ENV_DIR}/ps2sdk-ports/libpng/ + - make + - make install + + ## ps2dev/PS2SDKPorts/libjpeg + - cd ${TRAVIS_ENV_DIR}/ps2sdk-ports/libjpeg/ + - make + - make install + + ## ps2dev/PS2SDKPorts/freetype + - cd ${TRAVIS_ENV_DIR}/ps2sdk-ports/freetype-2.4.12/ + - bash ./SetupPS2.sh + + ## ps2dev/PS2ETH + - cd ${TRAVIS_ENV_DIR}/ps2eth/ + - make + - sudo mkdir -p /usr/lib/ps2dev/ps2eth + - sudo tar c $(find . -name \*irx) | sudo tar x -C /usr/lib/ps2dev/ps2eth + + ## ps2dev/gsKit + - cd ${TRAVIS_ENV_DIR}/gsKit/ + - make + - make install + + ## ps2dev/PS2Packer + - cd ${TRAVIS_ENV_DIR}/ps2-packer/ + - make + - make install script: -## Let's build Open PS2 Loader Release! -- cd ${opl_build_dir}/ -- . make_changelog.sh -- git add DETAILED_CHANGELOG -- make clean -- make release - -## Build Lang Pack and Latest Changelog -- . lng_pack.sh - -## [TEMPLATE] Deploy OPL to Github Releases -# 1. Clone this repository -# 2. Copy '.travis.yml' to '.travis-original.yml' (you will need it after) -# 3. Install Travis Client -# 4. Run command: $(travis setup releases) -# After follow all previous steps, pickup ONLY the "secure" line -# and change it on '.travis-original.yml' -# 5. Move '.travis-original.yml' to '.travis.yml' -# 6. Commit it -## NOTE: You need to configure TravisCI before anything - -## Deploy OPL to Github Releases -deploy: - provider: releases - skip_cleanup: true -# api_key: -# secure: [PUT YOUR NEW SECURE API KEY HERE] - file_glob: true - file: - - "${opl_build_dir}/OPNPS2LD-*.zip" - - "${opl_build_dir}/OPNPS2LD_LANGS-*.zip" - on: - tags: true + ## Go back to opl dir + - cd ${TRAVIS_BUILD_DIR}/ + + ## BUG: If we not call './make_changelog.sh' before 'make', it will always + ## build OPL with old REVISION, and make things confuse + ## + ## Make a new changelog + - bash ./make_changelog.sh + + ## Hack to prevent '-dirty' flag + - git add -A + + ## Let's build Open PS2 Loader Release! + - make release LOCALVERSION=${NEW_REPO_SLUG} + + ## Make the lang pack + - bash ./lng_pack.sh + +after_success: + ## Export some variables + - export OPL_VERSION=$(make oplversion) + - export OPL_UP_LAST_BUILD=$(curl --upload-file ${TRAVIS_BUILD_DIR}/OPNPS2LD-${OPL_VERSION}-${NEW_REPO_SLUG}.ZIP https://transfer.sh/OPNPS2LD-${OPL_VERSION}-${NEW_REPO_SLUG}-NIGHTLY${TRAVIS_BUILD_NUMBER}.zip) + - export OPL_LANG_UP_LAST_BUILD=$(curl --upload-file ${TRAVIS_BUILD_DIR}/OPNPS2LD_LANGS-${OPL_VERSION}.zip https://transfer.sh/OPNPS2LD_LANGS-${OPL_VERSION}-NIGHTLY${TRAVIS_BUILD_NUMBER}.zip) + - export OPL_DATE=$(date +%d'/'%m'/'%Y) + + ## Configure TravisCI git + - git config --global user.email "builds@travis-ci.org" + - git config --global user.name "Travis-CI" + + ## Clone my gh-page + - git clone --quiet --branch=gh-pages https://${GH_TOKEN}@github.com/Caio99BR/Open-PS2-Loader ${TRAVIS_ENV_DIR}/gh-pages/ > /dev/null + - cd ${TRAVIS_ENV_DIR}/gh-pages/ + + ## Let's upload latest build to gh-page! + - bash ${TRAVIS_ENV_DIR}/gh-pages/index-download-make.sh + +env: + global: + secure: "4WrTvtqz76DWeeUqiL76rBr71HNswnvvE1T3SQxR3gWq2i89wrM0jJXeS6zsmXGDN/q4knblvuSoMFJH41AMAnKY0fHOxPZmTcN1W5BVbi8AvkrfEMbenqCzP2cWI4IsvPzeii4OaqrmLzdcuOKjqEE9m3Gbg1cvf3pPt8IgKJoDq1S5Wp+cRWv8QTf2T8sX0HK90MUkvvuELE8kWEb3CZgZCjzL7U2Sav2xE6JQh8mICIeH0yvPzoAiFg2LfhqVzH0qtDW/75DxktZBkYPIxdcZhQiykCXK1Lr6ak2E8RNHMhoPo4pYKXDZhTpT1MzjCRlTnqDbvzXdbZ3hsU7B5/oU9P6GJbSOkU3fN/HjJhzwMSAt0/dvwimGQ4mDV7KYqwHV3XbAXsjkYBzIrVhjcdO6vk6ZZkHUIaXlom+2j9RYMRsR8gy4H5broiH38bFJYQCdCjPel3A7Y/vHvQhV/ZjA+YcC4pnohSpkU9kzzAHLPKmjMCHucjd/xbDrBv99Z4TlFUegGBRC5DmSr3YItalaGsq0aaRNIruNHrD1BcD4g8nSVHNTHJYaYHD7mpsnjb7iRlYsao+zVG4eWUpds1qz2rNym/wa5Fq4SZJc1nbC+jIAH2Ek8j+bCs2hFWb5SjrQUoWrMQiSuszM8/RB6Ex6ZlpO9RCxcLY6E+wz97o=" + diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 05092f0d8..5d12accbc 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,44 +10,43 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: -rev981 - Jay-Jay-OPL - Update dialogs.c - better strings for x & y offset #33 by ShaolinAssassin - Tue Jan 17 07:56:04 2017 -0800 -rev980 - Jay-Jay-OPL - update Lang files - Mon Jan 16 11:09:29 2017 -0800 -rev979 - Jay-Jay-OPL - Update dialogs.c by ShaolinAssassin X and Y Offset will use the same string as X and Y Offset (Hint text) from GSM menu. - Mon Jan 16 08:50:15 2017 -0800 -rev978 - Jay-Jay-OPL - Fix Travis reverting test #26 by Dr-Q - Sun Jan 15 22:20:14 2017 -0800 -rev977 - Jay-Jay-OPL - General cleanup (#27) * Remove unused lanman * Makefile cleanup * Fix README file name and url to forums * clang-formatted files that weren't before - Sun Jan 15 21:57:13 2017 -0800 -rev976 - Jay-Jay-OPL - Updated to support LWIP v2.0.0. by sp193 - Sat Dec 24 02:21:24 2016 -0800 -rev975 - Jay-Jay-OPL - * NOTE: Updating and rebuilding gsKit is required. - by @rickgaiser * Adapt for changes in gsKit - by @rickgaiser - Hacks are no longer needed for 576P and centering the screen. - by @rickgaiser * Add settings for display X and Y offset - by @rickgaiser - Thu Dec 15 18:02:59 2016 -0800 -rev974 - Jay-Jay-OPL - Optimized makefiles. (#24) * Optimized makefiles. Synced with mainstream ps2sdk: * Clear USB Mass Storage Device status to 0 at initialization-time (8997094) * Changed UsbMassRegisterCallback to call the callback once if a device is connected (cf385c0) * Test travis * Test travis 2 - Wed Nov 23 20:49:41 2016 -0800 -rev973 - Jay-Jay-OPL - The following changes were made: ShaolinAssassin: GUI layout fix: compatibility with lang files restored (NOTE: partial merge, not all changes were added to the OPL Daily Builds repo). uyjulian: clang-format again. uyjulian: Fix readme to be in markdown format. uyjulian: consise templates.. doctorxyz: GSM Core gardening. uyjulian: fix spacing, links, and wording in readme. Jay-Jay-OPL: a few custom changes to some files and also lang updates for OPL Daily Builds repo. - Mon Oct 31 11:33:56 2016 -0700 -rev972 - Jay-Jay-OPL - A Few fixes... * doctorxyz commited: GSM core - Screen garbage fix for God of War I (SCUS_973.99) & Sega Genesis Collection (SLUS_215.42) - This patch is applied only once, each time Hook_SetGsCrt is called; it makes DISPLAY2 appears, while DISPLAY1 not - by setting its value to zero. - PS: Sega Genesis Collection (SLUS_215.42) does not repeatedly write to GS Priviledge Registers, but God of War I (SCUS_973.99) does it. - Thu Oct 27 15:28:16 2016 -0700 -rev971 - Jay-Jay-OPL - doctorxyz commited: Per-Game Cheat Engine - fix for ETH and HDD Modes - Tue Oct 25 11:53:37 2016 -0700 -rev970 - Jay-Jay-OPL - OPL: Fix some shits - Tue Oct 25 11:41:07 2016 -0700 -rev969 - Jay-Jay-OPL - SP193: Change in the PS2SDK about libpwroff. - In one commit last year, I changed its design (along with AUDSRV) to use SIFRPC instead because of the change in design of the user SIFCMD buffer. - Unfortunately, i didn't add proper re-initialization code to the new design of libpwroff. - So when OPL starts the HDLDump server the old libpwroff SIFRPC server is contacted and the EE crashes. - Server was broken in r878, and this change was made in 09-27-2016, working well again in r930. - Adjusted the HDLDump server thread priorities for proper functionality of the transfer data. - Update README. - Mon Oct 24 18:55:31 2016 -0700 -rev968 - Jay-Jay-OPL - Added several features and tweaks by the following developers: * BatRastard: Per Game CHEATS should be good now * Caio99BR: OPL - Last commit about revision, i hate it now - Mon Oct 24 10:52:51 2016 -0700 -rev967 - Jay-Jay-OPL - update lang files - Sun Oct 23 18:34:27 2016 -0700 -rev966 - Jay-Jay-OPL - .github: Add some templates * pickup from https://github.com/a2o/snoopy/tree/master/.github * Thanks a lot @bostjan :) - Sun Oct 23 16:28:53 2016 -0700 -rev965 - Jay-Jay-OPL - fix Changelogs - Sun Oct 23 09:01:40 2016 -0700 -rev964 - Jay-Jay - Merge pull request #2 from ifcaro/master - Sun Oct 23 08:42:58 2016 -0700 -rev963 - Caio Oliveira - src/dialogs: Fix chars overpassing of screen - Sun Oct 23 12:37:29 2016 -0200 -rev962 - Jay-Jay-OPL - Oops! Fixed a tiny typo mistake in the previous commit. :) - Sun Oct 23 07:23:09 2016 -0700 -rev961 - Jay-Jay-OPL - Update all changes from OPL Daily Builds from BitBucket Repo https://bitbucket.org/Jay-Jay/opl-daily-builds/commits/ : * added ELF Launcher Menu (aka: ELM) -- it's a clone version of the APPS page in OPL, * added changes so both ELM and APPS support CFG data for INFO PAGE, * added a new Attribute feature where selected MODES can also be displayed on INFO PAGE, * updated LANG files, * plus a few miscellaneous tweaks (browse the OPL Daily Builds repo from BitBucket to learn more...). - Sun Oct 23 06:58:03 2016 -0700 -rev960 - Jay-Jay-OPL - change gfx files - Sun Oct 23 02:37:33 2016 -0700 -rev959 - Jay-Jay - Merge pull request #1 from ifcaro/master - Sun Oct 23 02:06:52 2016 -0700 -rev958 - Caio Oliveira - Makefile: Fix REVISION reported by @ElPatas and reforced by @ShaolinAssasin - Sat Oct 22 21:55:40 2016 -0200 -rev957 - Caio Oliveira - src/dialogs: Rework some minor issues - Sat Oct 22 21:55:40 2016 -0200 -rev956 - Caio Oliveira - make_changelog.sh: Rework revision (see NOTE) - Sat Oct 22 21:55:40 2016 -0200 -rev955 - Caio Oliveira - OLD_DETAILED_CHANGELOG: Bring BitBucket changelog - Sat Oct 22 21:55:40 2016 -0200 -rev954 - Caio Oliveira - OPL: Fix GIT revision (see NOTE below) - Fri Oct 21 05:27:04 2016 -0200 -rev953 - doctorxyz - Makefile: Git REVISION number via shell git log command - Thu Oct 20 13:48:36 2016 -0200 -rev952 - Caio Oliveira - OPL: Update versioning to new scheme - Thu Oct 20 13:44:31 2016 -0200 -rev951 - uyjulian - run clang-format on all .c and .h files - Wed Oct 19 20:32:12 2016 -0200 -rev950 - uyjulian - add .clang-format configuration file - Wed Oct 19 20:32:12 2016 -0200 -rev949 - Caio Oliveira - .gitignore: Change from .hgignore and add more entries - Wed Oct 19 11:00:18 2016 -0200 -rev948 - Caio Oliveira - TravisCI: Initial Template - Wed Oct 19 11:00:18 2016 -0200 -rev947 - Caio Oliveira - lng_pack: Add script to pack all Langs in a zip - Wed Oct 19 11:00:18 2016 -0200 -rev946 - Caio Oliveira - make_changelog: Update it to GIT format - Wed Oct 19 11:00:18 2016 -0200 -rev945 - Caio Oliveira - README: Create a symlink need by GitHub - Wed Oct 19 09:47:19 2016 -0200 -rev944 - Caio Oliveira - CREDITS: Make same style in whole file - Wed Oct 19 09:47:19 2016 -0200 -rev943 - doctorxyz - Skip Videos: Three methods (0 PSS/sceMpegIsEnd/BIK) on a single place Now Skip Videos (a.k.a. 0 PSS) not only skips PSS files (by zeroing their sizes) but also skips Bink .BIK (new technique) and sceMpegIsEnd based ones - All of them from a single place: Game Settings->Customized Settings->Mode 4(Skip Videos) - sceMpegIsEnd and BIK approaches has been implemented on ee_core's patches, while 0 PSS code has been kept intact (on iopcore's cdvdman) - Renamed '0 PSS' for 'Skip Videos' according to each language (NB: Basic Google translation. Native speakers can improve it) - Removed now-redundant GSM's Skip Videos sceMpegIsEnd related stuff (ontheflypatcher) - Since sceMpegIsEnd isn't GSM-dependant anymore - Wed Oct 19 08:53:05 2016 -0200 -rev942 - doctorxyz - BLURT output (for debugging purposes) It accumulates and shows the line sequence of code executed (or not) on OPL's GUI. To use it, simply add 'BLURT;' macros in the start of lines you want (preferably the ones from the same file) and compile OPL as usual. To enable it on GUI, go to [Settings]->[Disable Debug Colors] and set it to [Off] - Tue Oct 11 10:28:29 2016 -0300 -rev941 - +rev980 - Jay-Jay-OPL - Updated to compile error and warning-free with the head PS2SDK by SP193. HDD and PFS drivers were also updated. (#35) * Updated ISOFS, MCEMU and USBHDFSD to be compatible with the new PS2SDK changes. ISOFS and USBHDFSD: updated definition for I/O functions. MCEMU: removed unused import of KprintfSet(). * Updated HDD and PFS drivers. - Sat Jan 21 17:19:08 2017 -0800 +rev979 - Jay-Jay-OPL - Update dialogs.c - better strings for x & y offset #33 by ShaolinAssassin - Tue Jan 17 07:56:04 2017 -0800 +rev978 - Jay-Jay-OPL - update Lang files - Mon Jan 16 11:09:29 2017 -0800 +rev977 - Jay-Jay-OPL - Update dialogs.c by ShaolinAssassin X and Y Offset will use the same string as X and Y Offset (Hint text) from GSM menu. - Mon Jan 16 08:50:15 2017 -0800 +rev976 - Jay-Jay-OPL - Fix Travis reverting test #26 by Dr-Q - Sun Jan 15 22:20:14 2017 -0800 +rev975 - Jay-Jay-OPL - General cleanup (#27) * Remove unused lanman * Makefile cleanup * Fix README file name and url to forums * clang-formatted files that weren't before - Sun Jan 15 21:57:13 2017 -0800 +rev974 - Jay-Jay-OPL - Updated to support LWIP v2.0.0. by sp193 - Sat Dec 24 02:21:24 2016 -0800 +rev973 - Jay-Jay-OPL - * NOTE: Updating and rebuilding gsKit is required. - by @rickgaiser * Adapt for changes in gsKit - by @rickgaiser - Hacks are no longer needed for 576P and centering the screen. - by @rickgaiser * Add settings for display X and Y offset - by @rickgaiser - Thu Dec 15 18:02:59 2016 -0800 +rev972 - Jay-Jay-OPL - Optimized makefiles. (#24) * Optimized makefiles. Synced with mainstream ps2sdk: * Clear USB Mass Storage Device status to 0 at initialization-time (8997094) * Changed UsbMassRegisterCallback to call the callback once if a device is connected (cf385c0) * Test travis * Test travis 2 - Wed Nov 23 20:49:41 2016 -0800 +rev971 - Jay-Jay-OPL - The following changes were made: ShaolinAssassin: GUI layout fix: compatibility with lang files restored (NOTE: partial merge, not all changes were added to the OPL Daily Builds repo). uyjulian: clang-format again. uyjulian: Fix readme to be in markdown format. uyjulian: consise templates.. doctorxyz: GSM Core gardening. uyjulian: fix spacing, links, and wording in readme. Jay-Jay-OPL: a few custom changes to some files and also lang updates for OPL Daily Builds repo. - Mon Oct 31 11:33:56 2016 -0700 +rev970 - Jay-Jay-OPL - A Few fixes... * doctorxyz commited: GSM core - Screen garbage fix for God of War I (SCUS_973.99) & Sega Genesis Collection (SLUS_215.42) - This patch is applied only once, each time Hook_SetGsCrt is called; it makes DISPLAY2 appears, while DISPLAY1 not - by setting its value to zero. - PS: Sega Genesis Collection (SLUS_215.42) does not repeatedly write to GS Priviledge Registers, but God of War I (SCUS_973.99) does it. - Thu Oct 27 15:28:16 2016 -0700 +rev969 - Jay-Jay-OPL - doctorxyz commited: Per-Game Cheat Engine - fix for ETH and HDD Modes - Tue Oct 25 11:53:37 2016 -0700 +rev968 - Jay-Jay-OPL - OPL: Fix some shits - Tue Oct 25 11:41:07 2016 -0700 +rev967 - Jay-Jay-OPL - SP193: Change in the PS2SDK about libpwroff. - In one commit last year, I changed its design (along with AUDSRV) to use SIFRPC instead because of the change in design of the user SIFCMD buffer. - Unfortunately, i didn't add proper re-initialization code to the new design of libpwroff. - So when OPL starts the HDLDump server the old libpwroff SIFRPC server is contacted and the EE crashes. - Server was broken in r878, and this change was made in 09-27-2016, working well again in r930. - Adjusted the HDLDump server thread priorities for proper functionality of the transfer data. - Update README. - Mon Oct 24 18:55:31 2016 -0700 +rev966 - Jay-Jay-OPL - Added several features and tweaks by the following developers: * BatRastard: Per Game CHEATS should be good now * Caio99BR: OPL - Last commit about revision, i hate it now - Mon Oct 24 10:52:51 2016 -0700 +rev965 - Jay-Jay-OPL - update lang files - Sun Oct 23 18:34:27 2016 -0700 +rev964 - Jay-Jay-OPL - .github: Add some templates * pickup from https://github.com/a2o/snoopy/tree/master/.github * Thanks a lot @bostjan :) - Sun Oct 23 16:28:53 2016 -0700 +rev963 - Jay-Jay-OPL - fix Changelogs - Sun Oct 23 09:01:40 2016 -0700 +rev962 - Jay-Jay - Merge pull request #2 from ifcaro/master - Sun Oct 23 08:42:58 2016 -0700 +rev961 - Caio Oliveira - src/dialogs: Fix chars overpassing of screen - Sun Oct 23 12:37:29 2016 -0200 +rev960 - Jay-Jay-OPL - Oops! Fixed a tiny typo mistake in the previous commit. :) - Sun Oct 23 07:23:09 2016 -0700 +rev959 - Jay-Jay-OPL - Update all changes from OPL Daily Builds from BitBucket Repo https://bitbucket.org/Jay-Jay/opl-daily-builds/commits/ : * added ELF Launcher Menu (aka: ELM) -- it's a clone version of the APPS page in OPL, * added changes so both ELM and APPS support CFG data for INFO PAGE, * added a new Attribute feature where selected MODES can also be displayed on INFO PAGE, * updated LANG files, * plus a few miscellaneous tweaks (browse the OPL Daily Builds repo from BitBucket to learn more...). - Sun Oct 23 06:58:03 2016 -0700 +rev958 - Jay-Jay-OPL - change gfx files - Sun Oct 23 02:37:33 2016 -0700 +rev957 - Jay-Jay - Merge pull request #1 from ifcaro/master - Sun Oct 23 02:06:52 2016 -0700 +rev956 - Caio Oliveira - Makefile: Fix REVISION reported by @ElPatas and reforced by @ShaolinAssasin - Sat Oct 22 21:55:40 2016 -0200 +rev955 - Caio Oliveira - src/dialogs: Rework some minor issues - Sat Oct 22 21:55:40 2016 -0200 +rev954 - Caio Oliveira - make_changelog.sh: Rework revision (see NOTE) - Sat Oct 22 21:55:40 2016 -0200 +rev953 - Caio Oliveira - OLD_DETAILED_CHANGELOG: Bring BitBucket changelog - Sat Oct 22 21:55:40 2016 -0200 +rev952 - Caio Oliveira - OPL: Fix GIT revision (see NOTE below) - Fri Oct 21 05:27:04 2016 -0200 +rev951 - doctorxyz - Makefile: Git REVISION number via shell git log command - Thu Oct 20 13:48:36 2016 -0200 +rev950 - Caio Oliveira - OPL: Update versioning to new scheme - Thu Oct 20 13:44:31 2016 -0200 +rev949 - uyjulian - run clang-format on all .c and .h files - Wed Oct 19 20:32:12 2016 -0200 +rev948 - uyjulian - add .clang-format configuration file - Wed Oct 19 20:32:12 2016 -0200 +rev947 - Caio Oliveira - .gitignore: Change from .hgignore and add more entries - Wed Oct 19 11:00:18 2016 -0200 +rev946 - Caio Oliveira - TravisCI: Initial Template - Wed Oct 19 11:00:18 2016 -0200 +rev945 - Caio Oliveira - lng_pack: Add script to pack all Langs in a zip - Wed Oct 19 11:00:18 2016 -0200 +rev944 - Caio Oliveira - make_changelog: Update it to GIT format - Wed Oct 19 11:00:18 2016 -0200 +rev943 - Caio Oliveira - README: Create a symlink need by GitHub - Wed Oct 19 09:47:19 2016 -0200 +rev942 - Caio Oliveira - CREDITS: Make same style in whole file - Wed Oct 19 09:47:19 2016 -0200 +rev941 - doctorxyz - Skip Videos: Three methods (0 PSS/sceMpegIsEnd/BIK) on a single place Now Skip Videos (a.k.a. 0 PSS) not only skips PSS files (by zeroing their sizes) but also skips Bink .BIK (new technique) and sceMpegIsEnd based ones - All of them from a single place: Game Settings->Customized Settings->Mode 4(Skip Videos) - sceMpegIsEnd and BIK approaches has been implemented on ee_core's patches, while 0 PSS code has been kept intact (on iopcore's cdvdman) - Renamed '0 PSS' for 'Skip Videos' according to each language (NB: Basic Google translation. Native speakers can improve it) - Removed now-redundant GSM's Skip Videos sceMpegIsEnd related stuff (ontheflypatcher) - Since sceMpegIsEnd isn't GSM-dependant anymore - Wed Oct 19 08:53:05 2016 -0200 diff --git a/lng_pack.sh b/lng_pack.sh index d4936f7f5..347a625c1 100644 --- a/lng_pack.sh +++ b/lng_pack.sh @@ -1,28 +1,44 @@ #!/bin/bash -# Lang Packer for Open-PS2-Loader by Caio99BR +# Lang Packer for Open-PS2-Loader +# Made by Caio99BR +# Reworked by Doctor Q # Set variables -_dir=$(pwd) -_bdir="/tmp/opl_lng" -opl_revision=$(($(cat ${_dir}/DETAILED_CHANGELOG | grep "rev" | head -1 | cut -d " " -f 1 | cut -c 4-) + 1)) -opl_git=$(git -C ${_dir}/ rev-parse --short=7 HEAD 2>/dev/null) -if [ ${opl_git} ]; then export opl_git=-${opl_git}; fi +CURRENT_DIR=$(pwd) +BUILD_DIR="/tmp/OPL_LANG" +LANG_LIST="/tmp/OPL_LANG_LIST" +make oplversion 2>/dev/null +if [ $? == "0" ] +then + export OPL_VERSION=$(make oplversion) +else + echo "Falling back to old OPL Lang Pack" + VERSION=$(cat ${CURRENT_DIR}/Makefile | grep "VERSION =" | head -1 | cut -d " " -f 3) + SUBVERSION=$(cat ${CURRENT_DIR}/Makefile | grep "SUBVERSION =" | head -1 | cut -d " " -f 3) + PATCHLEVEL=$(cat ${CURRENT_DIR}/Makefile | grep "PATCHLEVEL =" | head -1 | cut -d " " -f 3) + REVISION=$(($(cat ${CURRENT_DIR}/DETAILED_CHANGELOG | grep "rev" | head -1 | cut -d " " -f 1 | cut -c 4-) + 1)) + EXTRAVERSION=$(cat ${CURRENT_DIR}/Makefile | grep "EXTRAVERSION =" | head -1 | cut -d " " -f 3) + if [ ${EXTRAVERSION} != "" ]; then EXTRAVERSION=-${EXTRAVERSION}; fi + GIT_HASH=$(git -C ${CURRENT_DIR}/ rev-parse --short=7 HEAD 2>/dev/null) + if [ ${GIT_HASH} != "" ]; then GIT_HASH=-${GIT_HASH}; fi + export OPL_VERSION=${VERSION}.${SUBVERSION}.${PATCHLEVEL}.${REVISION}${EXTRAVERSION}${GIT_HASH} +fi # Print a list -ls ${_dir}/lng/ | cut -c 6- | rev | cut -c 5- | rev > /tmp/opl_lng_list +printf "$(ls ${CURRENT_DIR}/lng/ | cut -c 6- | rev | cut -c 5- | rev)" > ${LANG_LIST} -# Copy like Jay-Jay format -while IFS= read -r file +# Copy format +while IFS= read -r CURRENT_FILE do - mkdir -p ${_bdir}/${file}-${opl_revision}/ - cp ${_dir}/lng/lang_${file}.lng ${_bdir}/${file}-${opl_revision}/lang_${file}.lng - if [ -e thirdparty/font_${file}.ttf ] + mkdir -p ${BUILD_DIR}/${CURRENT_FILE}-${OPL_VERSION}/ + cp ${CURRENT_DIR}/lng/lang_${CURRENT_FILE}.lng ${BUILD_DIR}/${CURRENT_FILE}-${OPL_VERSION}/lang_${CURRENT_FILE}.lng + if [ -e thirdparty/font_${CURRENT_FILE}.ttf ] then - cp ${_dir}/thirdparty/font_${file}.ttf ${_bdir}/${file}-${opl_revision}/font_${file}.ttf + cp ${CURRENT_DIR}/thirdparty/font_${CURRENT_FILE}.ttf ${BUILD_DIR}/${CURRENT_FILE}-${OPL_VERSION}/font_${CURRENT_FILE}.ttf fi -done < /tmp/opl_lng_list +done < ${LANG_LIST} -(cat << EOF) > ${_bdir}/README +(cat << EOF) > ${BUILD_DIR}/README ----------------------------------------------------------------------------- Copyright 2009-2010, Ifcaro & jimmikaelkael @@ -31,6 +47,8 @@ done < /tmp/opl_lng_list ----------------------------------------------------------------------------- +Open PS2 Loader Official Translations (25 August 2016) + HOW TO INSTALL: 1. make sure you are running latest OPL 2. transfer both the the LANGUAGE FILE (.lng) and the FONT FILE (.ttf) into your OPL directory of your memory card @@ -46,10 +64,14 @@ HOW TO INSTALL: EOF # Lets pack it! -cd ${_bdir}/ -zip -r ${_dir}/OPNPS2LD_LANGS-${opl_revision}${opl_git}.zip * +cd ${BUILD_DIR}/ +zip -r ${CURRENT_DIR}/OPNPS2LD_LANGS-${OPL_VERSION}.zip * +if [ -f "${CURRENT_DIR}/OPNPS2LD_LANGS-${OPL_VERSION}.zip" ] + then echo "OPL Lang Package Complete: OPNPS2LD_LANGS-${OPL_VERSION}.zip" + else echo "OPL Lang Package not found!" +fi # Cleanup -cd ${_dir} -rm -rf ${_bdir}/ /tmp/opl_lng_list -unset _dir _bdir opl_revision +cd ${CURRENT_DIR} +rm -rf ${BUILD_DIR}/ ${LANG_LIST} +unset CURRENT_DIR BUILD_DIR LANG_LIST OPL_VERSION CURRENT_FILE diff --git a/make_changelog.sh b/make_changelog.sh index f6c396c29..c3ea66f08 100755 --- a/make_changelog.sh +++ b/make_changelog.sh @@ -28,14 +28,14 @@ fi # Store author, commit and date on temp file git log --pretty=format:"%an - %s - %cd" > /tmp/commit_summary -if ! [ "${?}" == "0" ] +if [ "${?}" != "0" ] then echo "Git command failed, exiting..." break fi # Hack for fix first commit not showed -echo -e '\n' >> /tmp/commit_summary +printf '\n' >> /tmp/commit_summary # Store number of commits old_number_commits=$(($(cat OLD_DETAILED_CHANGELOG | grep "rev" | head -1 | cut -d " " -f 1 | cut -c 4-))) @@ -47,14 +47,14 @@ echo "Current Revision ${number_commits} (Of BitBucket r${old_number_commits} + # Store author, commit and date on temp file git log -${new_number_commits} --pretty=format:"%an - %s - %cd" > /tmp/commit_summary -if ! [ "${?}" == "0" ] +if [ "${?}" != "0" ] then echo "Git command failed, exiting..." break fi # Hack for fix first commit not showed -echo -e '\n' >> /tmp/commit_summary +printf '\n' >> /tmp/commit_summary # Reverse commit history gawk '{ L[n++] = $0 } END { while(n--) print L[n] }' /tmp/commit_summary > /tmp/commit_summary_reverse From 6be6bdc534afe6fb92b1486b94d79808ea88a581 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 23 Jan 2017 14:32:32 -0800 Subject: [PATCH 023/269] small update so I can move up one revision--since at ps2-home.com we were already at r981. --- DETAILED_CHANGELOG | 1 + README.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 5d12accbc..6f568fb97 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev981 - Jay-Jay-OPL - Following changes were made: **************************** (1) by Dr-Q: lng_pack.sh: Make it more simple and less hack-ish - Mon Jan 23 14:18:59 2017 -0800 rev980 - Jay-Jay-OPL - Updated to compile error and warning-free with the head PS2SDK by SP193. HDD and PFS drivers were also updated. (#35) * Updated ISOFS, MCEMU and USBHDFSD to be compatible with the new PS2SDK changes. ISOFS and USBHDFSD: updated definition for I/O functions. MCEMU: removed unused import of KprintfSet(). * Updated HDD and PFS drivers. - Sat Jan 21 17:19:08 2017 -0800 rev979 - Jay-Jay-OPL - Update dialogs.c - better strings for x & y offset #33 by ShaolinAssassin - Tue Jan 17 07:56:04 2017 -0800 rev978 - Jay-Jay-OPL - update Lang files - Mon Jan 16 11:09:29 2017 -0800 diff --git a/README.md b/README.md index c1156d7e4..23ffafcd7 120000 --- a/README.md +++ b/README.md @@ -19,6 +19,8 @@ You can visit the Open PS2 Loader forum at: http://psx-scene.com/forums/official-open-ps2-loader-forum/ +http://www.ps2-home.com/forum/viewforum.php?f=13 + For updated compatibility list, you can visit OPL-CL site at: http://sx.sytes.net/oplcl/games.aspx From 7f7e9af0c286e116060a1dac42ed0e124d6dc086 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 24 Jan 2017 14:56:58 -0800 Subject: [PATCH 024/269] the following changes were made: * @uyjulian commited: Quick fixes (#37) * @uyjulian commited: Add Dualshock 3 support over USB and Bluetooth (#36) Based off https://bitbucket.org/belek666/open-ps2-loader-ds3 Thanks to @belek666 --- .gitignore | 2 +- DETAILED_CHANGELOG | 1 + Makefile | 63 +- ee_core/Makefile | 5 +- ee_core/include/ee_core.h | 5 + ee_core/include/modules.h | 2 + ee_core/src/iopmgr.c | 21 +- ee_core/src/main.c | 7 + ee_core/src/padhook.c | 24 + include/config.h | 3 + include/dialogs.h | 20 +- include/lang.h | 23 +- include/opl.h | 7 + modules/ds3bt/Makefile | 11 + modules/ds3bt/ee/Makefile | 15 + modules/ds3bt/ee/libds3bt.c | 127 ++ modules/ds3bt/ee/libds3bt.h | 18 + modules/ds3bt/iop/Makefile | 18 + modules/ds3bt/iop/README | 115 ++ modules/ds3bt/iop/ds3bt.c | 1610 ++++++++++++++++++ modules/ds3bt/iop/ds3bt.h | 279 ++++ modules/ds3bt/iop/imports.lst | 57 + modules/ds3bt/iop/irx_imports.h | 37 + modules/ds3usb/Makefile | 11 + modules/ds3usb/ee/Makefile | 15 + modules/ds3usb/ee/libds3usb.c | 136 ++ modules/ds3usb/ee/libds3usb.h | 18 + modules/ds3usb/iop/Makefile | 18 + modules/ds3usb/iop/ds3usb.c | 533 ++++++ modules/ds3usb/iop/ds3usb.h | 126 ++ modules/ds3usb/iop/imports.lst | 57 + modules/ds3usb/iop/irx_imports.h | 37 + modules/hdd/apa/apa-opt.h | 14 +- modules/hdd/apa/hdd.c | 394 +++-- modules/hdd/apa/hdd.h | 12 +- modules/hdd/apa/hdd_fio.c | 1613 +++++++++--------- modules/hdd/libapa/include/libapa.h | 159 +- modules/hdd/libapa/src/apa.c | 761 +++++---- modules/hdd/libapa/src/cache.c | 264 ++- modules/hdd/libapa/src/free.c | 83 +- modules/hdd/libapa/src/journal.c | 88 +- modules/hdd/libapa/src/misc.c | 59 +- modules/hdd/libapa/src/password.c | 908 +++++----- modules/hdd/libpfs/include/libpfs.h | 324 ++-- modules/hdd/libpfs/src/bitmap.c | 591 ++++--- modules/hdd/libpfs/src/block.c | 96 +- modules/hdd/libpfs/src/blockWrite.c | 201 ++- modules/hdd/libpfs/src/cache.c | 332 ++-- modules/hdd/libpfs/src/dir.c | 1147 +++++++------ modules/hdd/libpfs/src/inode.c | 120 +- modules/hdd/libpfs/src/journal.c | 170 +- modules/hdd/libpfs/src/misc.c | 260 ++- modules/hdd/libpfs/src/super.c | 27 +- modules/hdd/libpfs/src/superWrite.c | 396 +++-- modules/hdd/pfs/pfs-opt.h | 4 +- modules/hdd/pfs/pfs.c | 291 ++-- modules/hdd/pfs/pfs.h | 42 +- modules/hdd/pfs/pfs_fio.c | 1911 +++++++++++----------- modules/hdd/pfs/pfs_fio.h | 34 +- modules/hdd/pfs/pfs_fioctl.c | 485 +++--- modules/iopcore/cdvdman/streaming.c | 858 +++++----- modules/iopcore/udnl-t300/udnl_asm.s | 358 ++-- modules/mcemu/mcemu.c | 22 +- modules/network/httpclient/Makefile | 28 +- modules/network/httpclient/exports.tab | 22 +- modules/network/httpclient/httpclient.c | 584 +++---- modules/network/httpclient/imports.lst | 118 +- modules/network/httpclient/irx_imports.h | 20 +- modules/network/nbns/Makefile | 28 +- modules/network/nbns/exports.tab | 18 +- modules/network/nbns/imports.lst | 102 +- modules/network/nbns/irx_imports.h | 18 +- modules/pademu/Makefile | 29 + modules/pademu/README | 115 ++ modules/pademu/Rules.make | 62 + modules/pademu/ds3bt.c | 1437 ++++++++++++++++ modules/pademu/ds3bt.h | 273 ++++ modules/pademu/ds3usb.c | 383 +++++ modules/pademu/ds3usb.h | 116 ++ modules/pademu/exports.tab | 4 + modules/pademu/imports.lst | 74 + modules/pademu/irx_imports.h | 39 + modules/pademu/pademu.c | 448 +++++ modules/pademu/pademu.h | 59 + modules/pademu/sys_utils.c | 94 ++ modules/pademu/sys_utils.h | 30 + src/dia.c | 2 +- src/dialogs.c | 66 + src/gui.c | 166 ++ src/lang.c | 22 + src/pad.c | 24 +- src/renderman.c | 12 +- src/supportbase.c | 8 + src/system.c | 72 +- 94 files changed, 13303 insertions(+), 6615 deletions(-) create mode 100644 modules/ds3bt/Makefile create mode 100644 modules/ds3bt/ee/Makefile create mode 100644 modules/ds3bt/ee/libds3bt.c create mode 100644 modules/ds3bt/ee/libds3bt.h create mode 100644 modules/ds3bt/iop/Makefile create mode 100644 modules/ds3bt/iop/README create mode 100644 modules/ds3bt/iop/ds3bt.c create mode 100644 modules/ds3bt/iop/ds3bt.h create mode 100644 modules/ds3bt/iop/imports.lst create mode 100644 modules/ds3bt/iop/irx_imports.h create mode 100644 modules/ds3usb/Makefile create mode 100644 modules/ds3usb/ee/Makefile create mode 100644 modules/ds3usb/ee/libds3usb.c create mode 100644 modules/ds3usb/ee/libds3usb.h create mode 100644 modules/ds3usb/iop/Makefile create mode 100644 modules/ds3usb/iop/ds3usb.c create mode 100644 modules/ds3usb/iop/ds3usb.h create mode 100644 modules/ds3usb/iop/imports.lst create mode 100644 modules/ds3usb/iop/irx_imports.h create mode 100644 modules/pademu/Makefile create mode 100644 modules/pademu/README create mode 100644 modules/pademu/Rules.make create mode 100644 modules/pademu/ds3bt.c create mode 100644 modules/pademu/ds3bt.h create mode 100644 modules/pademu/ds3usb.c create mode 100644 modules/pademu/ds3usb.h create mode 100644 modules/pademu/exports.tab create mode 100644 modules/pademu/imports.lst create mode 100644 modules/pademu/irx_imports.h create mode 100644 modules/pademu/pademu.c create mode 100644 modules/pademu/pademu.h create mode 100644 modules/pademu/sys_utils.c create mode 100644 modules/pademu/sys_utils.h diff --git a/.gitignore b/.gitignore index e35edd4ae..b5eca8fe5 100755 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,7 @@ *.rej *.s *.zip -*.ZIP +*.a # # git files that we don't want to ignore even it they are dot-files diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 6f568fb97..33d98dc2d 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev982 - Jay-Jay-OPL - small update so I can move up one revision--since at ps2-home.com we were already at r981. - Mon Jan 23 14:32:32 2017 -0800 rev981 - Jay-Jay-OPL - Following changes were made: **************************** (1) by Dr-Q: lng_pack.sh: Make it more simple and less hack-ish - Mon Jan 23 14:18:59 2017 -0800 rev980 - Jay-Jay-OPL - Updated to compile error and warning-free with the head PS2SDK by SP193. HDD and PFS drivers were also updated. (#35) * Updated ISOFS, MCEMU and USBHDFSD to be compatible with the new PS2SDK changes. ISOFS and USBHDFSD: updated definition for I/O functions. MCEMU: removed unused import of KprintfSet(). * Updated HDD and PFS drivers. - Sat Jan 21 17:19:08 2017 -0800 rev979 - Jay-Jay-OPL - Update dialogs.c - better strings for x & y offset #33 by ShaolinAssassin - Tue Jan 17 07:56:04 2017 -0800 diff --git a/Makefile b/Makefile index fe337f0e3..cf251cbf3 100755 --- a/Makefile +++ b/Makefile @@ -37,6 +37,9 @@ GSM ?= 0 #Enables/disables In Game Screenshot (IGS). NB: It depends on GSM and IGR to work IGS ?= 0 +#Enables/disables pad emulator +PADEMU ?= 0 + #Enables/disables the cheat engine (PS2RD) CHEAT ?= 0 @@ -166,6 +169,15 @@ else endif endif +ifeq ($(PADEMU),1) + IOP_OBJS += bt_pademu.o usb_pademu.o ds3usb.o ds3bt.o libds3usb.a libds3bt.a + EE_CFLAGS += -DPADEMU + EE_INCS += -Imodules/ds3bt/ee -Imodules/ds3usb/ee + PADEMU_FLAGS = PADEMU=1 +else + PADEMU_FLAGS = PADEMU=0 +endif + ifeq ($(DEBUG),1) EE_CFLAGS += -D__DEBUG -g EE_OBJS += debug.o udptty.o ioptrap.o ps2link.o @@ -219,7 +231,7 @@ endif release: echo "Building Open PS2 Loader $(OPL_VERSION)..." echo "-Interface" - $(MAKE) VMC=1 GSM=1 IGS=1 CHEAT=1 $(EE_VPKD).ZIP + $(MAKE) VMC=1 GSM=1 IGS=1 PADEMU=1 CHEAT=1 $(EE_VPKD).ZIP childproof: $(MAKE) CHILDPROOF=1 all @@ -307,6 +319,13 @@ clean: $(MAKE) -C modules/debug/ioptrap clean echo " -ps2link" $(MAKE) -C modules/debug/ps2link clean + echo " -ds3usb" + $(MAKE) -C modules/ds3usb clean + echo " -ds3bt" + $(MAKE) -C modules/ds3bt clean + echo " -pademu" + $(MAKE) -C modules/pademu USE_BT=1 clean + $(MAKE) -C modules/pademu USE_USB=1 clean echo "-pc tools" $(MAKE) -C pc clean @@ -346,7 +365,7 @@ $(EE_VPKD).ZIP: $(EE_VPKD).ELF DETAILED_CHANGELOG CREDITS LICENSE README.md ee_core/ee_core.elf: ee_core echo "-EE core" - $(MAKE) $(PS2LOGO_FLAGS) $(VMC_FLAGS) $(GSM_FLAGS) $(IGS_FLAGS) $(CHEAT_FLAGS) $(EECORE_EXTRA_FLAGS) -C $< + $(MAKE) $(PS2LOGO_FLAGS) $(VMC_FLAGS) $(GSM_FLAGS) $(IGS_FLAGS) $(CHEAT_FLAGS) $(PADEMU_FLAGS) $(EECORE_EXTRA_FLAGS) -C $< $(EE_ASM_DIR)ee_core.s: ee_core/ee_core.elf | $(EE_ASM_DIR) $(BIN2S) $< $@ eecore_elf @@ -450,6 +469,46 @@ modules/usb/usbhdfsd/usbhdfsd.irx: modules/usb/usbhdfsd echo " -usbhdfsd" $(MAKE) -C $< +$(EE_OBJS_DIR)libds3bt.a: modules/ds3bt/ee/libds3bt.a + cp $< $@ + +modules/ds3bt/ee/libds3bt.a: modules/ds3bt/ee + $(MAKE) -C $< + +modules/ds3bt/iop/ds3bt.irx: modules/ds3bt/iop + echo " -ds3bt" + $(MAKE) -C $< + +$(EE_ASM_DIR)ds3bt.s: modules/ds3bt/iop/ds3bt.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ds3bt_irx + +$(EE_OBJS_DIR)libds3usb.a: modules/ds3usb/ee/libds3usb.a + cp $< $@ + +modules/ds3usb/ee/libds3usb.a: modules/ds3usb/ee + $(MAKE) -C $< + +modules/ds3usb/iop/ds3usb.irx: modules/ds3usb/iop + echo " -ds3usb" + $(MAKE) -C $< + +$(EE_ASM_DIR)ds3usb.s: modules/ds3usb/iop/ds3usb.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ds3usb_irx + +modules/pademu/bt_pademu.irx: modules/pademu + echo " -bt_pademu" + $(MAKE) -C $< USE_BT=1 + +$(EE_ASM_DIR)bt_pademu.s: modules/pademu/bt_pademu.irx + $(BIN2S) $< $@ bt_pademu_irx + +modules/pademu/usb_pademu.irx: modules/pademu + echo " -usb_pademu" + $(MAKE) -C $< USE_USB=1 + +$(EE_ASM_DIR)usb_pademu.s: modules/pademu/usb_pademu.irx + $(BIN2S) $< $@ usb_pademu_irx + $(EE_ASM_DIR)usbhdfsd.s: modules/usb/usbhdfsd/usbhdfsd.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ usbhdfsd_irx diff --git a/ee_core/Makefile b/ee_core/Makefile index a4811078e..d39289e00 100755 --- a/ee_core/Makefile +++ b/ee_core/Makefile @@ -68,13 +68,16 @@ EE_LDFLAGS = -nostartfiles -Tlinkfile -L$(PS2SDK)/ee/lib -s -Wl,-Map,$(MAPFILE) endif EE_LIBS += -lpatches +ifeq ($(PADEMU),1) +EE_CFLAGS += -DPADEMU +endif + ifeq ($(EESIO_DEBUG),1) EE_LIBS += -lc endif EE_LIBS += -lkernel - $(EE_OBJS_DIR)%.o : $(EE_SRC_DIR)%.c @mkdir -p $(EE_OBJS_DIR) $(EE_CC) $(EE_CFLAGS) $(EE_INCS) -c $< -o $@ diff --git a/ee_core/include/ee_core.h b/ee_core/include/ee_core.h index 3b8196905..6578a42f7 100644 --- a/ee_core/include/ee_core.h +++ b/ee_core/include/ee_core.h @@ -77,6 +77,11 @@ char ExitPath[32]; int HDDSpindown; int EnableGSMOp; int EnableCheatOp; +#ifdef PADEMU +int EnablePadEmuOp; +int PadEmuSettings; +int pademu_reset(); +#endif int DisableDebug; int PS2Logo; diff --git a/ee_core/include/modules.h b/ee_core/include/modules.h index 4bab53ce7..8a826b40c 100644 --- a/ee_core/include/modules.h +++ b/ee_core/include/modules.h @@ -15,6 +15,8 @@ enum OPL_MODULE_ID { //VMC module OPL_MODULE_ID_MCEMU, + OPL_MODULE_ID_PADEMU, + //Debugging modules OPL_MODULE_ID_UDPTTY, OPL_MODULE_ID_IOPTRAP, diff --git a/ee_core/src/iopmgr.c b/ee_core/src/iopmgr.c index 8982a2fef..8d9c2e383 100644 --- a/ee_core/src/iopmgr.c +++ b/ee_core/src/iopmgr.c @@ -79,9 +79,15 @@ static void ResetIopSpecial(const char *args, unsigned int arglen) sbv_patch_enable_lmb(); DPRINTF("Loading extra IOP modules...\n"); - if (GameMode == USB_MODE) { +#ifdef PADEMU +#define PADEMU_ARG || EnablePadEmuOp +#else +#define PADEMU_ARG +#endif + if (GameMode == USB_MODE PADEMU_ARG) { LoadOPLModule(OPL_MODULE_ID_USBD, 0, 11, "thpri=15,16"); - } else if (GameMode == ETH_MODE) { + } + if (GameMode == ETH_MODE) { LoadOPLModule(OPL_MODULE_ID_SMSTCPIP, 0, 0, NULL); LoadOPLModule(OPL_MODULE_ID_SMAP, 0, g_ipconfig_len, g_ipconfig); LoadOPLModule(OPL_MODULE_ID_SMBINIT, 0, 0, NULL); @@ -115,6 +121,11 @@ int New_Reset_Iop(const char *arg, int arglen) iop_reboot_count++; +#ifdef PADEMU + if (iop_reboot_count >= 3 && EnablePadEmuOp) { + pademu_reset(); + } +#endif // Reseting IOP. while (!Reset_Iop(NULL, 0)) { ; @@ -138,6 +149,12 @@ int New_Reset_Iop(const char *arg, int arglen) GS_BGCOLOUR = 0x00FFFF; //Yellow } +#ifdef PADEMU + if (iop_reboot_count >= 2 && EnablePadEmuOp) { + LoadOPLModule(OPL_MODULE_ID_PADEMU, 0, 4, (char *)&PadEmuSettings); + } +#endif + #ifdef VMC if (iop_reboot_count >= 2) { LoadOPLModule(OPL_MODULE_ID_MCEMU, 0, 0, NULL); diff --git a/ee_core/src/main.c b/ee_core/src/main.c index 44a6ab15c..fb508520b 100644 --- a/ee_core/src/main.c +++ b/ee_core/src/main.c @@ -81,6 +81,13 @@ int main(int argc, char **argv) DPRINTF("GSM = %s\n", EnableGSMOp == 0 ? "Disabled" : "Enabled"); #endif +#ifdef PADEMU + EnablePadEmuOp = _strtoi(_strtok(NULL, " ")); + DPRINTF("PADEMU = %s\n", EnablePadEmuOp == 0 ? "Disabled" : "Enabled"); + + PadEmuSettings = _strtoi(_strtok(NULL, " ")); +#endif + i++; ModStorageStart = (void *)_strtoui(_strtok(argv[i], " ")); diff --git a/ee_core/src/padhook.c b/ee_core/src/padhook.c index d0a5e3148..2c9a01496 100644 --- a/ee_core/src/padhook.c +++ b/ee_core/src/padhook.c @@ -183,6 +183,10 @@ static void IGR_Thread(void *arg) if (!DisableDebug) GS_BGCOLOUR = 0xFFFFFF; // White +#ifdef PADEMU + if (EnablePadEmuOp) + pademu_reset(); +#endif // Re-Init RPC & CMD SifInitRpc(0); @@ -624,3 +628,23 @@ int Install_PadOpen_Hook(u32 mem_start, u32 mem_end, int mode) return patched; } +#ifdef PADEMU + +#define PADEMU_RESET 1 +#define PADEMU_BIND_RPC_ID 0x18E3878D + +static SifRpcClientData_t pademu; + +int pademu_reset() +{ + pademu.server = NULL; + + do { + if (SifBindRpc(&pademu, PADEMU_BIND_RPC_ID, 0) < 0) + return -1; + nopdelay(); + } while (!pademu.server); + + return SifCallRpc(&pademu, PADEMU_RESET, 0, NULL, 0, NULL, 0, NULL, NULL); +} +#endif diff --git a/include/config.h b/include/config.h index 145d2b731..0d9fc039c 100644 --- a/include/config.h +++ b/include/config.h @@ -49,6 +49,9 @@ enum CONFIG_INDEX { #define CONFIG_ITEM_ENABLECHEAT "$EnableCheat" #define CONFIG_ITEM_CHEATMODE "$CheatMode" +#define CONFIG_ITEM_ENABLEPADEMU "$EnablePadEmu" +#define CONFIG_ITEM_PADEMUSETTINGS "$PadEmuSettings" + //OPL config keys #define CONFIG_OPL_THEME "theme" #define CONFIG_OPL_LANGUAGE "language_text" diff --git a/include/dialogs.h b/include/dialogs.h index f0df53944..a7a7f2a58 100644 --- a/include/dialogs.h +++ b/include/dialogs.h @@ -120,7 +120,20 @@ enum UI_ITEMS { NETUPD_PROGRESS, NETUPD_BTN_START, NETUPD_BTN_CANCEL, - +#ifdef PADEMU + PADCFG_PADEMU_CONFIG, + PADCFG_PADEMU_ENABLE, + PADCFG_PADEMU_MODE, + PADCFG_PADEMU_PORT, + PADCFG_PADEMU_VIB, + PADCFG_PADPORT, + PADCFG_USBDG_MAC, + PADCFG_USBDG_MAC_STR, + PADCFG_PAD_MAC, + PADCFG_PAD_MAC_STR, + PADCFG_PAIR, + PADCFG_PAIR_STR, +#endif COMPAT_MODE_BASE = 200, }; @@ -134,6 +147,11 @@ enum UI_ITEMS { #define COMPAT_VMC1_DEFINE (COMPAT_VMC1_DEFINE_ID | COMPAT_NOEXIT) #define COMPAT_VMC2_DEFINE (COMPAT_VMC2_DEFINE_ID | COMPAT_NOEXIT) #endif +#ifdef PADEMU +#define COMPAT_PADEMUCONFIG (PADCFG_PADEMU_CONFIG | COMPAT_NOEXIT) + +extern struct UIItem diaPadEmuConfig[]; +#endif extern struct UIItem diaNetConfig[]; extern struct UIItem diaCompatConfig[]; diff --git a/include/lang.h b/include/lang.h index 3ea9036cd..73125d67f 100644 --- a/include/lang.h +++ b/include/lang.h @@ -211,9 +211,30 @@ enum _STR_IDS { _STR_HINT_AUTOSTARTLAST, _STR_PS2LOGO, _STR_HINT_PS2LOGO, +#ifdef PADEMU + _STR_PADEMUCONFIG, + _STR_PADEMU_SETTINGS, + _STR_PADEMU_ENABLE, + _STR_HINT_PADEMU_ENABLE, + _STR_PADEMU_MODE, + _STR_HINT_PADEMU_MODE, + _STR_DS3USB_MODE, + _STR_DS3BT_MODE, + _STR_PADPORT, + _STR_HINT_PAD_PORT, + _STR_PADEMU_PORT, + _STR_HINT_PADEMU_PORT, + _STR_PADEMU_VIB, + _STR_HINT_PADEMU_VIB, + _STR_USBDG_MAC, + _STR_PAD_MAC, + _STR_PAIR, + _STR_PAIR_PAD, + _STR_HINT_PAIRPAD, + _STR_NOT_CONNECTED, +#endif _STR_ELM, _STR_ELMMODE, - LANG_STR_COUNT }; diff --git a/include/opl.h b/include/opl.h index 8ea14a634..7c2dab46d 100644 --- a/include/opl.h +++ b/include/opl.h @@ -118,6 +118,13 @@ int gSelectButton; // ------------------------------------------------------------------------------------------------------------------------ +#ifdef PADEMU +int gEnablePadEmu; +int gPadEmuSettings; +#endif + +// ------------------------------------------------------------------------------------------------------------------------ + // 0,1,2 scrolling speed int gScrollSpeed; // Exit path diff --git a/modules/ds3bt/Makefile b/modules/ds3bt/Makefile new file mode 100644 index 000000000..839f9e495 --- /dev/null +++ b/modules/ds3bt/Makefile @@ -0,0 +1,11 @@ +all: + $(MAKE) -C iop + $(MAKE) -C ee + +clean: + $(MAKE) -C iop clean + $(MAKE) -C ee clean + +rebuild: + $(MAKE) -C iop rebuild + $(MAKE) -C ee rebuild \ No newline at end of file diff --git a/modules/ds3bt/ee/Makefile b/modules/ds3bt/ee/Makefile new file mode 100644 index 000000000..24127b4f9 --- /dev/null +++ b/modules/ds3bt/ee/Makefile @@ -0,0 +1,15 @@ +EE_LIB = libds3bt.a + +EE_OBJS = libds3bt.o +EE_LIBS = -lc +EE_CFLAGS=-Wall + +all: $(EE_LIB) + +clean: + rm -f -r $(EE_OBJS) $(EE_LIB) + +rebuild: clean all + +include $(PS2SDK)/samples/Makefile.pref +include $(PS2SDK)/samples/Makefile.eeglobal diff --git a/modules/ds3bt/ee/libds3bt.c b/modules/ds3bt/ee/libds3bt.c new file mode 100644 index 000000000..20f2b1b2c --- /dev/null +++ b/modules/ds3bt/ee/libds3bt.c @@ -0,0 +1,127 @@ +#include +#include +#include + +#define DS3BT_INIT 1 +#define DS3BT_INIT_CHARGING 2 +#define DS3BT_GET_STATUS 3 +#define DS3BT_GET_BDADDR 4 +#define DS3BT_SET_RUMBLE 5 +#define DS3BT_SET_LED 6 +#define DS3BT_GET_DATA 7 +#define DS3BT_RESET 8 + +#define DS3BT_BIND_RPC_ID 0x18E3878F + +static SifRpcClientData_t ds3bt; + +static u8 rpcbuf[64] __attribute__((aligned(64))); + +static u8 ds3bt_inited = 0; + +int ds3bt_init() +{ + ds3bt.server = NULL; + + do { + if (SifBindRpc(&ds3bt, DS3BT_BIND_RPC_ID, 0) < 0) + return -1; + + nopdelay(); + } while (!ds3bt.server); + + ds3bt_inited = 1; + + return 1; +} + +int ds3bt_reinit_ports(u8 ports) +{ + if (!ds3bt_inited) + return -1; + + rpcbuf[0] = ports; + return SifCallRpc(&ds3bt, DS3BT_INIT, 0, rpcbuf, 1, NULL, 0, NULL, NULL); +} + +int ds3bt_init_charging() +{ + if (!ds3bt_inited) + return -1; + + return SifCallRpc(&ds3bt, DS3BT_INIT_CHARGING, 0, NULL, 0, NULL, 0, NULL, NULL); +} + +int ds3bt_get_status(int port) +{ + if (!ds3bt_inited) + return -1; + + rpcbuf[0] = port; + + SifCallRpc(&ds3bt, DS3BT_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL); + + return rpcbuf[0]; +} + +int ds3bt_get_bdaddr(u8 *bdaddr) +{ + int i, ret; + + if (!ds3bt_inited) + return -1; + + ret = SifCallRpc(&ds3bt, DS3BT_GET_BDADDR, 0, NULL, 0, rpcbuf, 6, NULL, NULL); + + for (i = 0; i < 6; i++) + bdaddr[i] = rpcbuf[i]; + + return ret; +} + +int ds3bt_set_rumble(int port, u8 lrum, u8 rrum) +{ + if (!ds3bt_inited) + return -1; + + rpcbuf[0] = port; + rpcbuf[1] = lrum; + rpcbuf[2] = rrum; + + return SifCallRpc(&ds3bt, DS3BT_SET_RUMBLE, 0, rpcbuf, 3, NULL, 0, NULL, NULL); +} + +int ds3bt_set_led(int port, u8 led) +{ + if (!ds3bt_inited) + return -1; + + rpcbuf[0] = port; + rpcbuf[1] = led; + + return SifCallRpc(&ds3bt, DS3BT_SET_LED, 0, rpcbuf, 2, NULL, 0, NULL, NULL); +} + +int ds3bt_get_data(int port, u8 *data) +{ + int ret; + + if (!ds3bt_inited) + return -1; + + rpcbuf[0] = port; + + ret = SifCallRpc(&ds3bt, DS3BT_GET_DATA, 0, rpcbuf, 1, rpcbuf, 18, NULL, NULL); + + memcpy(data, rpcbuf, 18); + + return ret; +} + +int ds3bt_reset() +{ + if (!ds3bt_inited) + return -1; + + return SifCallRpc(&ds3bt, DS3BT_RESET, 0, NULL, 0, NULL, 0, NULL, NULL); +} diff --git a/modules/ds3bt/ee/libds3bt.h b/modules/ds3bt/ee/libds3bt.h new file mode 100644 index 000000000..6597dbb48 --- /dev/null +++ b/modules/ds3bt/ee/libds3bt.h @@ -0,0 +1,18 @@ + +enum eDS3BTStatus { + DS3BT_STATE_USB_DISCONNECTED = 0x00, + DS3BT_STATE_USB_AUTHORIZED = 0x01, + DS3BT_STATE_USB_CONFIGURED = 0x02, + DS3BT_STATE_CONNECTED = 0x04, + DS3BT_STATE_RUNNING = 0x08, +}; + +int ds3bt_init(); +int ds3bt_reinit_ports(u8 ports); +int ds3bt_init_charging(); +int ds3bt_get_status(int port); +int ds3bt_get_bdaddr(u8 *bdaddr); +int ds3bt_set_rumble(int port, u8 lrum, u8 rrum); +int ds3bt_set_led(int port, u8 led); +int ds3bt_get_data(int port, u8 *data); +int ds3bt_reset(); diff --git a/modules/ds3bt/iop/Makefile b/modules/ds3bt/iop/Makefile new file mode 100644 index 000000000..a0ae37ed9 --- /dev/null +++ b/modules/ds3bt/iop/Makefile @@ -0,0 +1,18 @@ +IOP_BIN = ds3bt.irx + +IOP_INCS += +IOP_CFLAGS += -Wall +IOP_LDFLAGS += -s + +IOP_OBJS = ds3bt.o smsutils.o imports.o +IOP_LIBS = + +all: $(IOP_BIN) + +clean: + rm -f $(IOP_BIN) $(IOP_OBJS) + +rebuild: clean all + +include $(PS2SDK)/Defs.make +include $(PS2SDK)/samples/Makefile.iopglobal diff --git a/modules/ds3bt/iop/README b/modules/ds3bt/iop/README new file mode 100644 index 000000000..3429ba7c9 --- /dev/null +++ b/modules/ds3bt/iop/README @@ -0,0 +1,115 @@ +== First of all == +PS Remote Controller Bluetooth stack for Arduino with USB Host Shield / Arduino MEGA ADK +Copyright (C) 2010 Tomo Tanaka - Original written WiiRemote Stack adapted for using with PS3 Controller +Copyright (C) 2011 Ion Agorria - PS3 adaptation + +This program is based on which is developed by Richard Ibbotson. +This program also needs MAX3421E and USB libraries for Arduino written by Oleg Mazurov. +This program is based on WiiRemote code from https://github.com/moyuchin/WiiRemote_on_Arduino + +This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see . + +== Hardware Requirement == + Case 1: + * Arduino + * USB Host Shield + Case 2: + * Arduino Mega ADK (USB Host included) + + * USB Bluetooth Device + + +== Software Requirement == + Case 1: + * MAX3421E and USB library for Arduino written by Oleg Mazurov + The source codes can be grabbed from https://github.com/felis/USB_Host_Shield + + Case 2: + *Same Libraries adapted for Arduino Mega ADK: + http://labs.arduino.cc/uploads/ADK/GettingStarted/arduino_bundle_ADB.zip + + Open Downloaded Library and copy these files to a folder with PSRemote files: + * Max3421e_constants.h + * Max3421e.h + * Max3421e.cpp + * ch9.h + * Usb.h + * Usb.cpp + + So it must look something like this + +== Files == + Folder/ + | + +- Example.pde + +- PSRemote.h + +- PSRemote.cpp + +- README.txt + +- Max3421e_constants.h + +- Max3421e.h + +- Max3421e.cpp + +- ch9.h + +- Usb.h + +- Usb.cpp + + +== Usage == +Same as USB version library +getBDADDR() and setBDADDR() are just for compatibility, they do nothing +rename header and constructor to "PSRemote" or see the example! + +Added Functions: + +getPSADDR(): gets connected PS bt address +LED(): sets LED only without affecting rumble +Rumble(): set Rumble without changing LEDs + +=== Modify USB Device Descriptors === +The values of CSR_VID and CSR_PID described in PSRemote.h need to be modified +to match descriptors of USB Bluetooth Device to be used. + +Default is configured for CSR chips (like mine) + + +== Hint == +--Hints from PS3 and Wiimote game controllers thread in Circuit@Home. + - Bluetooth 1.x seems not work on this library. + +--Bluetooth Docs: + +HCI, L2CAP,... Doc: https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=40560 + +BT HID profile Doc: https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=7108 + +--Sixaxis/DualShock3 Info: + +Windows Driver/Pairing: MotionInJoy +Linux Pairing: sixaxis.c source file +Mac: I dont know but i seem some + +http://www.pabr.org/sixlinux/sixlinux.en.html +http://wiki.ps2dev.org/ps3:hardware:sixaxis +http://wiibrew.org/wiki/Sixaxis + +== ACKNOWLEDGEMENT & INFO == +I appreciate the gread codes developed by Oleg, Richard and Tomo :-) + +--What Does?-- + +-HCI Waits for PS Remote (Remenber to Pair with your BT Dongle!!!) +Then Accepts connect Req and goes to L2CAP + +-L2CAP responses two Connection Req from PSRemote (HID Control and HID Interrupt) +Then configures it and then passed to HID + +-Initializates PS Controller and lights all Leds + +-??? + +-Profit + +I started this because noone has taken initiative with PS (unlike Wii) diff --git a/modules/ds3bt/iop/ds3bt.c b/modules/ds3bt/iop/ds3bt.c new file mode 100644 index 000000000..de9da1a70 --- /dev/null +++ b/modules/ds3bt/iop/ds3bt.c @@ -0,0 +1,1610 @@ + +/* bt code ported from: https://github.com/IonAgorria/Arduino-PSRemote see README */ +/* usb code based on usbhdfsd module from ps2sdk */ + +#include "types.h" +#include "ioman.h" +#include "intrman.h" +#include "loadcore.h" +#include "stdio.h" +#include "sifcmd.h" +#include "sifrpc.h" +#include "sysclib.h" +#include "sysmem.h" +#include "usbd.h" +#include "usbd_macro.h" +#include "thbase.h" +#include "thevent.h" +#include "thsemap.h" +#include "sifman.h" +#include "vblank.h" +#include "ds3bt.h" + +//#define DPRINTF(x...) printf(x) +#define DPRINTF(x...) + +#define USB_CLASS_WIRELESS_CONTROLLER 0xE0 +#define USB_SUBCLASS_RF_CONTROLLER 0x01 +#define USB_PROTOCOL_BLUETOOTH_PROG 0x01 + +int bt_probe(int devId); +int bt_connect(int devId); +int bt_disconnect(int devId); + +UsbDriver bt_driver = {NULL, NULL, "ds3bt", bt_probe, bt_connect, bt_disconnect}; + +typedef struct _bt_dev +{ + int devId; + int hci_sema; + int l2cap_sema; + int controlEndp; + int eventEndp; + int inEndp; + int outEndp; + uint8_t status; +} bt_device; + +bt_device bt_dev = {-1, -1, -1, -1, -1, -1, -1, DS3BT_STATE_USB_DISCONNECTED}; + +static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint); +static void bt_config_set(int result, int count, void *arg); +static void bt_release(); + +int bt_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + UsbConfigDescriptor *config = NULL; + UsbInterfaceDescriptor *intf = NULL; + + DPRINTF("BT: probe: devId=%i\n", devId); + + if ((bt_dev.devId > 0) && (bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) { + DPRINTF("BT: Error - only one device allowed !\n"); + return 0; + } + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("BT: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->bNumConfigurations < 1) + return 0; + + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + if (config == NULL) { + DPRINTF("BT: Error - Couldn't get configuration descriptor\n"); + return 0; + } + + + if ((config->bNumInterfaces < 1) || (config->wTotalLength < (sizeof(UsbConfigDescriptor) + sizeof(UsbInterfaceDescriptor)))) { + DPRINTF("BT: Error - No interfaces available\n"); + return 0; + } + + intf = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + DPRINTF("BT: bInterfaceClass %X bInterfaceSubClass %X bInterfaceProtocol %X\n", + intf->bInterfaceClass, intf->bInterfaceSubClass, intf->bInterfaceProtocol); + + if ((intf->bInterfaceClass != USB_CLASS_WIRELESS_CONTROLLER) || + (intf->bInterfaceSubClass != USB_SUBCLASS_RF_CONTROLLER) || + (intf->bInterfaceProtocol != USB_PROTOCOL_BLUETOOTH_PROG) || + (intf->bNumEndpoints < 3)) { + return 0; + } + + return 1; +} + +int bt_connect(int devId) +{ + int i; + int epCount; + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + UsbInterfaceDescriptor *interface; + UsbEndpointDescriptor *endpoint; + iop_sema_t SemaData; + + DPRINTF("BT: connect: devId=%i\n", devId); + + if (bt_dev.devId != -1) { + DPRINTF("BT: Error - only one device allowed !\n"); + return 1; + } + + bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; + + bt_dev.eventEndp = -1; + bt_dev.inEndp = -1; + bt_dev.outEndp = -1; + + bt_dev.controlEndp = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + + interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + epCount = interface->bNumEndpoints; + + DPRINTF("BT: Endpoint Count %d \n", epCount); + + endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); + usb_probeEndpoint(devId, endpoint); + + for (i = 1; i < epCount; i++) { + endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); + usb_probeEndpoint(devId, endpoint); + } + + if (bt_dev.eventEndp < 0 || bt_dev.inEndp < 0 || bt_dev.outEndp < 0) { + bt_release(); + DPRINTF("BT: Error - connect failed: not enough endpoints! \n"); + return -1; + } + + SemaData.initial = 1; + SemaData.max = 1; + SemaData.option = 0; + SemaData.attr = 0; + + if ((bt_dev.hci_sema = CreateSema(&SemaData)) < 0) { + DPRINTF("BT: Failed to allocate I/O semaphore.\n"); + return -1; + } + + if ((bt_dev.l2cap_sema = CreateSema(&SemaData)) < 0) { + DPRINTF("BT: Failed to allocate I/O semaphore.\n"); + return -1; + } + + bt_dev.devId = devId; + + bt_dev.status = DS3BT_STATE_USB_AUTHORIZED; + + UsbSetDeviceConfiguration(bt_dev.controlEndp, config->bConfigurationValue, bt_config_set, NULL); + + return 0; +} + +int bt_disconnect(int devId) +{ + DPRINTF("BT: disconnect: devId=%i\n", devId); + + if (bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) { + bt_release(); + + bt_dev.devId = -1; + bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; + } + + return 0; +} + +static void bt_release() +{ + if (bt_dev.eventEndp >= 0) + UsbCloseEndpoint(bt_dev.eventEndp); + + if (bt_dev.inEndp >= 0) + UsbCloseEndpoint(bt_dev.inEndp); + + if (bt_dev.outEndp >= 0) + UsbCloseEndpoint(bt_dev.outEndp); + + DeleteSema(bt_dev.hci_sema); + DeleteSema(bt_dev.l2cap_sema); + + bt_dev.eventEndp = -1; + bt_dev.inEndp = -1; + bt_dev.outEndp = -1; + bt_dev.controlEndp = -1; +} + +static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint) +{ + if (endpoint->bmAttributes == USB_ENDPOINT_XFER_BULK) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && bt_dev.outEndp < 0) { + bt_dev.outEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("BT: register Output endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.outEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } else + + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.inEndp < 0) { + bt_dev.inEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("BT: register Input endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.inEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + } else if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.eventEndp < 0) { + bt_dev.eventEndp = UsbOpenEndpoint(devId, endpoint); + DPRINTF("BT: register Event endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.eventEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + } +} + +static int chrg_dev = -1; +static int chrg_end = -1; + +int chrg_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + + DPRINTF("CHRG: probe: devId=%i\n", devId); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("CHRG: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->idVendor == 0x054C && device->idProduct == 0x0268) + return 1; + + return 0; +} + +int chrg_connect(int devId) +{ + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + + DPRINTF("CHRG: connect: devId=%i\n", devId); + + if (chrg_dev != -1) { + DPRINTF("CHRG: Error - only one device allowed !\n"); + return 1; + } + + chrg_dev = devId; + + chrg_end = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + + UsbSetDeviceConfiguration(chrg_end, config->bConfigurationValue, NULL, NULL); + + return 0; +} + +int chrg_disconnect(int devId) +{ + DPRINTF("CHRG: disconnect: devId=%i\n", devId); + + if (chrg_dev == devId) { + if (chrg_end >= 0) + UsbCloseEndpoint(chrg_end); + + chrg_dev = -1; + chrg_end = -1; + } + + return 0; +} + +UsbDriver chrg_driver = {NULL, NULL, "chrg", chrg_probe, chrg_connect, chrg_disconnect}; + +/* PS Remote Reports */ +static uint8_t feature_F4_report[] = + { + 0x42, 0x03, 0x00, 0x00}; + +static uint8_t output_01_report[] = + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; + +// Taken from nefarius' SCPToolkit +// https://github.com/nefarius/ScpToolkit/blob/master/ScpControl/ScpControl.ini +// Valid MAC addresses used by Sony +static uint8_t GenuineMacAddress[][3] = + { + // Bluetooth chips by ALPS ELECTRIC CO., LTD + {0x00, 0x02, 0xC7}, + {0x00, 0x06, 0xF5}, + {0x00, 0x06, 0xF7}, + {0x00, 0x07, 0x04}, + {0x00, 0x16, 0xFE}, + {0x00, 0x19, 0xC1}, + {0x00, 0x1B, 0xFB}, + {0x00, 0x1E, 0x3D}, + {0x00, 0x21, 0x4F}, + {0x00, 0x23, 0x06}, + {0x00, 0x24, 0x33}, + {0x00, 0x26, 0x43}, + {0x00, 0xA0, 0x79}, + {0x04, 0x76, 0x6E}, + {0x04, 0x98, 0xF3}, + {0x28, 0xA1, 0x83}, + {0x34, 0xC7, 0x31}, + {0x38, 0xC0, 0x96}, + {0x60, 0x38, 0x0E}, + {0x64, 0xD4, 0xBD}, + {0xAC, 0x7A, 0x4D}, + {0xE0, 0x75, 0x0A}, + {0xE0, 0xAE, 0x5E}, + {0xFC, 0x62, 0xB9}, + // Bluetooth chips by AzureWave Technology Inc. + {0xE0, 0xB9, 0xA5}, + {0xDC, 0x85, 0xDE}, + {0xD0, 0xE7, 0x82}, + {0xB0, 0xEE, 0x45}, + {0xAC, 0x89, 0x95}, + {0xA8, 0x1D, 0x16}, + {0x94, 0xDB, 0xC9}, + {0x80, 0xD2, 0x1D}, + {0x80, 0xA5, 0x89}, + {0x78, 0x18, 0x81}, + {0x74, 0xF0, 0x6D}, + {0x74, 0xC6, 0x3B}, + {0x74, 0x2F, 0x68}, + {0x6C, 0xAD, 0xF8}, + {0x6C, 0x71, 0xD9}, + {0x60, 0x5B, 0xB4}, + {0x5C, 0x96, 0x56}, + {0x54, 0x27, 0x1E}, + {0x4C, 0xAA, 0x16}, + {0x48, 0x5D, 0x60}, + {0x44, 0xD8, 0x32}, + {0x40, 0xE2, 0x30}, + {0x38, 0x4F, 0xF0}, + {0x28, 0xC2, 0xDD}, + {0x24, 0x0A, 0x64}, + {0x1C, 0x4B, 0xD6}, + {0x08, 0xA9, 0x5A}, + {0x00, 0x25, 0xD3}, + {0x00, 0x24, 0x23}, + {0x00, 0x22, 0x43}, + {0x00, 0x15, 0xAF}, + //fake with AirohaTechnologyCorp's Chip + {0x0C, 0xFC, 0x83}}; + +/* variables used by high level HCI task */ +static uint16_t hci_counter_; // counter used for bluetooth HCI loops + +/* variables filled from HCI event management */ +static volatile uint8_t hci_event_flag_; // flag of received bluetooth events + +/* variables used by L2CAP */ +static volatile uint8_t l2cap_event_status_; +static uint8_t l2cap_txid_; // packet id increments for each packet sent +/* L2CAP CID name space: 0x0040-0xffff dynamically allocated */ +static uint16_t command_scid_; // Channel endpoint on command source +static uint16_t interrupt_scid_; // Channel endpoint on interrupt source + +/* variables used by Bluetooth HID */ +static uint8_t hid_flags_; +static uint8_t ds3bt_bdaddr_[6]; +static uint8_t dg_bdaddr[6]; + +static uint8_t hci_reset(); +static uint8_t hci_write_scan_enable(uint8_t conf); +static uint8_t hci_accept_connection(uint8_t *bdaddr); +static uint8_t hci_reject_connection(uint8_t *bdaddr); +static uint8_t hci_disconnect(uint16_t handle); +static uint8_t hci_change_connection_type(uint8_t pad); +static uint8_t hci_read_bdaddr(); +static uint8_t HCI_Command(uint16_t nbytes, uint8_t *dataptr); + +static uint8_t l2cap_connect_response(uint8_t rxid, uint16_t dcid, uint16_t scid, uint8_t pad); +static uint8_t l2cap_configure(uint16_t dcid, uint8_t pad); +static uint8_t l2cap_config_response(uint8_t rxid, uint16_t dcid, uint8_t pad); +static uint8_t l2cap_disconnect_response(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad); +static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad); + +static uint8_t initPSController(int pad); +static void readReport(uint8_t *data, int bytes, int pad); +static uint8_t writeReport(uint8_t *data, uint8_t length, int pad); + +static void HCI_task(uint8_t pad); +static void L2CAP_task(uint8_t pad); +static uint8_t HCI_event_task(int result); +static uint8_t L2CAP_event_task(int result, int bytes); + +static uint8_t hci_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; +static uint8_t l2cap_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; +static uint8_t hci_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; +static uint8_t l2cap_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; + +static void DS3BT_init(); +static uint8_t LED(uint8_t led, int pad); +static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad); +static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); + +static uint8_t current_pad; +static uint8_t enable_pad; +static uint8_t press_emu; + +typedef struct +{ + uint16_t hci_handle_; //connection handle + uint16_t command_dcid_; // Channel endpoint on command destination + uint16_t interrupt_dcid_; // Channel endpoint on interrupt destination + uint8_t hci_state_; // current state of bluetooth HCI connection + uint8_t l2cap_state_; // current state of L2CAP connection + uint8_t status_; + uint8_t oldled; + uint8_t oldlrumble; + uint8_t oldrrumble; + uint8_t enabled; + uint8_t type; + uint8_t data[18]; +} ds3bt_pad_t; + +#define MAX_PADS 2 + +ds3bt_pad_t ds3pad[MAX_PADS]; + +static void DS3BT_init() +{ + uint8_t i; + + l2cap_txid_ = 1; + command_scid_ = 0x0040; // L2CAP local CID for HID_Control + interrupt_scid_ = 0x0041; // L2CAP local CID for HID_Interrupt + + hid_flags_ = 0; + + for (i = 0; i < MAX_PADS; i++) { + ds3pad[i].hci_handle_ = 0x0FFF; + ds3pad[i].status_ = bt_dev.status; + ds3pad[i].status_ |= DS3BT_STATE_USB_CONFIGURED; + ds3pad[i].hci_state_ = HCI_RESET_STATE; + ds3pad[i].l2cap_state_ = L2CAP_DOWN_STATE; + + ds3pad[i].data[0] = 0xFF; + ds3pad[i].data[1] = 0xFF; + ds3pad[i].enabled = (enable_pad >> i) & 1; + ds3pad[i].type = 0; + + mips_memset(&ds3pad[i].data[2], 0x7F, 4); + mips_memset(&ds3pad[i].data[6], 0x00, 12); + } + + hci_counter_ = 10; + current_pad = 0; + press_emu = 0; + + hci_reset(); +} + +static void hci_event_cb(int resultCode, int bytes, void *arg) +{ + uint8_t pad; + + PollSema(bt_dev.hci_sema); + + //DPRINTF("hci_event_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + pad = HCI_event_task(resultCode); + HCI_task(pad); + + SignalSema(bt_dev.hci_sema); + UsbInterruptTransfer(bt_dev.eventEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, arg); +} + +static void l2cap_event_cb(int resultCode, int bytes, void *arg) +{ + uint8_t pad; + + PollSema(bt_dev.l2cap_sema); + + //DPRINTF("l2cap_event_cb: res %d, bytes %d, arg %p arg %x\n", resultCode, bytes, arg, *(uint8_t *)arg); + + pad = L2CAP_event_task(resultCode, bytes); + L2CAP_task(pad); + + if (pad >= MAX_PADS) + pad = current_pad; + + if (arg != NULL) { + if (pad != (int)arg && (int)arg < MAX_PADS) { + if ((ds3pad[(int)arg].status_ & DS3BT_STATE_RUNNING)) { + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + return; + } + } + } + + SignalSema(bt_dev.l2cap_sema); + + if (ds3pad[pad].l2cap_state_ != L2CAP_READY_STATE) { + DelayThread(14000); //fix for some bt adapters + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + } +} + +static void l2cap_cmd_cb(int resultCode, int bytes, void *arg) +{ + //DPRINTF("l2cap_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + if (ds3pad[(int)arg].status_ & DS3BT_STATE_RUNNING) + SignalSema(bt_dev.l2cap_sema); +} + +static void bt_config_set(int result, int count, void *arg) +{ + UsbInterruptTransfer(bt_dev.eventEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, NULL); + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); + + DS3BT_init(); +} + +static uint8_t HCI_event_task(int result) +{ + uint8_t i, pad; + + pad = current_pad; + + if (!result) { + /* buf[0] = Event Code */ + /* buf[1] = Parameter Total Length */ + /* buf[n] = Event Parameters based on each event */ + DPRINTF("HCI event = 0x%x\n", hci_buf[0]); + switch (hci_buf[0]) { // switch on event type + case HCI_EVENT_COMMAND_COMPLETE: + hci_event_flag_ |= HCI_FLAG_COMMAND_COMPLETE; + + DPRINTF("Command OK = 0x%x", hci_buf[3]); + DPRINTF(" Returned = 0x%x\n", hci_buf[5]); + + if ((hci_buf[3] == 0x09) && (hci_buf[4] == 0x10)) { + for (i = 0; i < 6; i++) + dg_bdaddr[i] = hci_buf[6 + i]; + + hci_event_flag_ |= HCI_FLAG_READ_BDADDR; + } + + break; + + case HCI_EVENT_COMMAND_STATUS: + hci_event_flag_ |= HCI_FLAG_COMMAND_STATUS; + + if (hci_buf[2]) // show status on serial if not OK + { + DPRINTF("HCI Command Failed: \n"); + DPRINTF("\tStatus = %x\n", hci_buf[2]); + DPRINTF("\tCommand_OpCode(OGF) = %x\n", ((hci_buf[5] & 0xFC) >> 2)); + DPRINTF("\tCommand_OpCode(OCF) = %x%x\n", (hci_buf[5] & 0x03), hci_buf[4]); + } + + break; + + case HCI_EVENT_CONNECT_COMPLETE: + if (!hci_buf[2]) // check if connected OK + { + // store the handle for the ACL connection + ds3pad[pad].hci_handle_ = hci_buf[3] | ((hci_buf[4] & 0x0F) << 8); //pad = current_pad + + DPRINTF("HCI event Connect Complete = 0x%x\n", ds3pad[pad].hci_handle_); + hci_event_flag_ |= HCI_FLAG_CONNECT_COMPLETE; + } else { + DPRINTF("Error on Connect Complete = 0x%x\n", hci_buf[2]); + } + break; + + case HCI_EVENT_NUM_COMPLETED_PKT: + + DPRINTF("HCI Number Of Completed Packets Event: \n"); + DPRINTF("\tNumber_of_Handles = 0x%x\n", hci_buf[2]); + for (i = 0; i < hci_buf[2]; i++) { + DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[3 + i] | ((hci_buf[4 + i] & 0x0F) << 8))); + } + + if (hci_buf[2] == 1) { + for (i = 0; i < MAX_PADS; i++) //detect pad + { + if (ds3pad[i].hci_handle_ == (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))) { + pad = i; + break; + } + } + } + + break; + + case HCI_EVENT_QOS_SETUP_COMPLETE: + break; + + case HCI_EVENT_DISCONN_COMPLETE: + hci_event_flag_ |= HCI_FLAG_DISCONN_COMPLETE; + DPRINTF("HCI Disconnection Complete Event: \n"); + DPRINTF("\tStatus = 0x%x\n", hci_buf[2]); + DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))); + DPRINTF("\tReason = 0x%x\n", hci_buf[5]); + + for (i = 0; i < MAX_PADS; i++) //detect pad + { + if (ds3pad[i].hci_handle_ == (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))) { + pad = i; + break; + } + } + + break; + + case HCI_EVENT_CONNECT_REQUEST: + hci_event_flag_ |= HCI_FLAG_INCOMING_REQUEST; + DPRINTF("Connection Requested by BD_ADDR: \n"); + for (i = 0; i < 6; i++) { + ds3bt_bdaddr_[i] = (unsigned char)hci_buf[2 + i]; + DPRINTF("%x", ds3bt_bdaddr_[i]); + if (i < 5) + DPRINTF(":"); + } + + DPRINTF(" LINK: 0x%x\n", hci_buf[11]); + + for (i = 0; i < MAX_PADS; i++) //find free slot + { + if (!(ds3pad[i].status_ & DS3BT_STATE_RUNNING) && ds3pad[i].enabled) { + if (ds3pad[i].status_ & DS3BT_STATE_CONNECTED) { + if (ds3pad[i].l2cap_state_ == L2CAP_DISCONNECT_STATE) //if we're waiting for hci disconnect event + continue; + else + hci_disconnect(ds3pad[i].hci_handle_); //try to disconnect + } + + current_pad = i; + break; + } + } + + if (i >= MAX_PADS) //no free slot + { + hci_reject_connection(ds3bt_bdaddr_); + current_pad = pad; + return MAX_PADS; + } + + pad = current_pad; + + ds3pad[pad].type = 0xA2; //fake ds3 + + for (i = 0; i < sizeof(GenuineMacAddress) / 3; i++) //check if ds3 is genuine + { + if (ds3bt_bdaddr_[5] == GenuineMacAddress[i][0] && + ds3bt_bdaddr_[4] == GenuineMacAddress[i][1] && + ds3bt_bdaddr_[3] == GenuineMacAddress[i][2]) { + ds3pad[pad].type = HID_THDR_SET_REPORT_OUTPUT; + break; + } + } + + ds3pad[pad].hci_state_ = HCI_CONNECT_IN_STATE; + ds3pad[pad].l2cap_state_ = L2CAP_INIT_STATE; + ds3pad[pad].status_ &= ~DS3BT_STATE_CONNECTED; + ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; + + l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONNECTED; + + break; + + case HCI_EVENT_ROLE_CHANGED: + + DPRINTF("Role Change STATUS: 0x%x\n", hci_buf[2]); + + DPRINTF(" BD_ADDR: "); + for (i = 0; i < 6; i++) { + DPRINTF("%x", (unsigned char)hci_buf[3 + i]); + if (i < 5) + DPRINTF(":"); + } + + DPRINTF(" ROLE: 0x%x\n", hci_buf[9]); + + break; + case HCI_EVENT_MAX_SLOT_CHANGE: + + DPRINTF("Max Slot Change: \n"); + DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[2] | ((hci_buf[3] & 0x0F) << 8))); + DPRINTF("\tLMP Max Slots = 0x%x\n", hci_buf[5]); + break; + + case HCI_EVENT_CHANGED_CONNECTION_TYPE: + + DPRINTF("Packet Type Changed STATUS: 0x%x \n", hci_buf[2]); + DPRINTF(" TYPE: %x \n", (hci_buf[5] | (hci_buf[6] << 8))); + + break; + + case HCI_EVENT_PAGE_SR_CHANGED: + break; + + default: + DPRINTF("Unmanaged Event: 0x%x\n", hci_buf[0]); + break; + } // switch (buf[0]) + } + + return pad; +} + +static void HCI_task(uint8_t pad) +{ + uint8_t i; + + if (pad >= MAX_PADS) + return; + + switch (ds3pad[pad].hci_state_) { + case HCI_INIT_STATE: + // wait until we have looped 10 times to clear any old events + if (hci_timeout) { + for (i = 0; i < MAX_PADS; i++) { + if (ds3pad[i].status_ & DS3BT_STATE_RUNNING) + break; + } + + if (i == MAX_PADS) { + ds3pad[pad].hci_state_ = HCI_RESET_STATE; + hci_reset(); + } + + hci_counter_ = 10; + } + break; + + case HCI_RESET_STATE: + if (hci_command_complete) { + DPRINTF("HCI Reset complete\n"); + hci_write_scan_enable(SCAN_ENABLE_NOINQ_ENPAG); + ds3pad[pad].hci_state_ = HCI_CONNECT_IN_STATE; + hci_event_flag_ &= ~HCI_FLAG_INCOMING_REQUEST; + } + if (hci_timeout) { + DPRINTF("No response to HCI Reset\n"); + ds3pad[pad].hci_state_ = HCI_INIT_STATE; + hci_counter_ = 10; + } + break; + + case HCI_CONNECT_IN_STATE: + if (hci_incoming_connect_request) { + hci_accept_connection(ds3bt_bdaddr_); + DPRINTF("PS Remote Connected\n"); + ds3pad[pad].hci_state_ = HCI_CHANGE_CONNECTION; + hci_event_flag_ &= ~HCI_FLAG_CONNECT_COMPLETE; + } + break; + + case HCI_CHANGE_CONNECTION: + if (hci_connect_complete) { + hci_change_connection_type(pad); + + ds3pad[pad].hci_state_ = HCI_CONNECTED_STATE; + + ds3pad[pad].status_ |= DS3BT_STATE_CONNECTED; + hci_event_flag_ &= ~HCI_FLAG_DISCONN_COMPLETE; + } + break; + + case HCI_CONNECTED_STATE: + if (hci_disconn_complete) { + DPRINTF("PS Remote Disconnected pad %d\n", pad); + + hci_event_flag_ &= ~HCI_FLAG_DISCONN_COMPLETE; + + ds3pad[pad].status_ &= ~DS3BT_STATE_CONNECTED; + ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; + + hci_counter_ = 10; + + if (ds3pad[pad].type != HID_THDR_SET_REPORT_OUTPUT) { + ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + } + } + break; + + default: + break; + } // switch (hci_state_) +} + +/************************************************************/ +/* HCI Commands */ +/************************************************************/ + +static uint8_t hci_reset() +{ + hci_event_flag_ = 0; // clear all the flags + + hci_cmd_buf[0] = HCI_OCF_RESET; + hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; + hci_cmd_buf[2] = 0x00; // Parameter Total Length = 0 + + return HCI_Command(3, hci_cmd_buf); +} + +static uint8_t hci_write_scan_enable(uint8_t conf) +{ + hci_event_flag_ &= ~HCI_FLAG_COMMAND_COMPLETE; + + hci_cmd_buf[0] = HCI_OCF_WRITE_SCAN_ENABLE; + hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; + hci_cmd_buf[2] = 0x01; + hci_cmd_buf[3] = conf; + return HCI_Command(4, hci_cmd_buf); +} + +static uint8_t hci_accept_connection(uint8_t *bdaddr) +{ + hci_event_flag_ &= ~(HCI_FLAG_INCOMING_REQUEST); + + hci_cmd_buf[0] = HCI_OCF_ACCEPT_CONNECTION; // HCI OCF = 9 + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x07; // parameter length 7 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + hci_cmd_buf[9] = 1; //switch role to slave + + return HCI_Command(10, hci_cmd_buf); +} + +static uint8_t hci_reject_connection(uint8_t *bdaddr) +{ + hci_event_flag_ &= ~(HCI_FLAG_INCOMING_REQUEST); + + hci_cmd_buf[0] = HCI_OCF_REJECT_CONNECTION; // HCI OCF = A + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x07; // parameter length 7 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + hci_cmd_buf[9] = 0x09; //reason max connection + + return HCI_Command(10, hci_cmd_buf); +} + +static uint8_t hci_disconnect(uint16_t handle) +{ + hci_cmd_buf[0] = 0x06; // HCI OCF = 6 + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x03; // parameter length = 3 + hci_cmd_buf[3] = (uint8_t)(handle & 0xFF); //connection handle - low byte + hci_cmd_buf[4] = (uint8_t)((handle >> 8) & 0x0F); //connection handle - high byte + hci_cmd_buf[5] = 0x13; // reason + + return HCI_Command(6, hci_cmd_buf); +} + +static uint8_t hci_change_connection_type(uint8_t pad) +{ + hci_event_flag_ &= ~HCI_FLAG_COMMAND_COMPLETE; + + hci_cmd_buf[0] = HCI_OCF_CHANGE_CONNECTION_TYPE; + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; + hci_cmd_buf[2] = 0x04; // parameter length 4 + hci_cmd_buf[3] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag + hci_cmd_buf[4] = (uint8_t)(ds3pad[pad].hci_handle_ >> 8); + hci_cmd_buf[5] = 0x18; // Packet Type: 0xcc18 + hci_cmd_buf[6] = 0xcc; + + return HCI_Command(7, hci_cmd_buf); +} + +static uint8_t hci_read_bdaddr() +{ + hci_event_flag_ &= ~HCI_FLAG_READ_BDADDR; + + hci_cmd_buf[0] = HCI_OCF_ACCEPT_CONNECTION; // HCI OCF = 9 + hci_cmd_buf[1] = HCI_OGF_INFO_PARAM; // HCI OGF = 4 + hci_cmd_buf[2] = 0x00; + + return HCI_Command(3, hci_cmd_buf); +} + +/* perform HCI Command */ +static uint8_t HCI_Command(uint16_t nbytes, uint8_t *dataptr) +{ + return UsbControlTransfer(bt_dev.controlEndp, bmREQ_HCI_OUT, HCI_COMMAND_REQ, 0, 0, nbytes, dataptr, NULL, NULL); +} + +static uint8_t L2CAP_event_task(int result, int bytes) +{ + uint8_t pad = 0xFF; + + if (!result) { + for (pad = 0; pad < MAX_PADS; pad++) { + if (acl_handle_ok(ds3pad[pad].hci_handle_)) + break; + } + + if (pad >= MAX_PADS) { + DPRINTF("L2CAP Wrong Handle = 0x%x\n", ((l2cap_buf[0] | (l2cap_buf[1] << 8)))); + return pad; + } + + if (acl_handle_ok(ds3pad[pad].hci_handle_)) { + if (l2cap_control) { + DPRINTF("L2CAP Signaling Command = 0x%x pad %d\n", l2cap_buf[8], pad); + if (l2cap_command_reject) { + DPRINTF("ID = 0x%x", l2cap_buf[9]); + DPRINTF(" Reason = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF(" DATA = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + } else if (l2cap_connection_request) { + DPRINTF("Connection Request ID = 0x%x", l2cap_buf[9]); + DPRINTF(" PSM = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF(" SCID = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_WRITE) { + ds3pad[pad].command_dcid_ = l2cap_buf[14] | (l2cap_buf[15] << 8); + l2cap_connect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); + l2cap_event_status_ |= L2CAP_EV_COMMAND_CONNECTED; + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_READ) { + ds3pad[pad].interrupt_dcid_ = l2cap_buf[14] | (l2cap_buf[15] << 8); + l2cap_connect_response(l2cap_buf[9], interrupt_scid_, ds3pad[pad].interrupt_dcid_, pad); + l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONNECTED; + } + } else if (l2cap_configuration_request) { + + DPRINTF("Conf Request ID = 0x%x\n", l2cap_buf[9]); + DPRINTF(" LEN = 0x%x", (l2cap_buf[10] | (l2cap_buf[11] << 8))); + DPRINTF(" SCID = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF(" FLAG = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { + l2cap_event_status_ |= L2CAP_EV_COMMAND_CONFIG_REQ; + l2cap_config_response(l2cap_buf[9], ds3pad[pad].command_dcid_, pad); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { + l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONFIG_REQ; + l2cap_config_response(l2cap_buf[9], ds3pad[pad].interrupt_dcid_, pad); + } + } else if (l2cap_configuration_response) { + + DPRINTF("Conf Response ID = 0x%x\n", l2cap_buf[9]); + DPRINTF(" LEN = 0x%x", (l2cap_buf[10] | (l2cap_buf[11] << 8))); + DPRINTF(" SCID = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF(" FLAG = 0x%x", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + DPRINTF(" RESULT = 0x%x\n", (l2cap_buf[16] | (l2cap_buf[17] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { + l2cap_event_status_ |= L2CAP_EV_COMMAND_CONFIGURED; + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { + l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONFIGURED; + } + } else if (l2cap_disconnect_request) { + DPRINTF("Disconnect Req SCID = 0x%x\n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + + ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { + l2cap_event_status_ |= L2CAP_EV_COMMAND_DISCONNECT_REQ; + l2cap_disconnect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { + l2cap_event_status_ |= L2CAP_EV_INTERRUPT_DISCONNECT_REQ; + l2cap_disconnect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); + } + } + } else if (l2cap_interrupt) { + readReport(l2cap_buf, bytes, pad); + } else if (l2cap_command) { + if (hid_handshake_success) { + hid_flags_ |= HID_FLAG_COMMAND_SUCCESS; + } + } + } // acl_handle_ok + } // !rcode + + return pad; +} + +static void L2CAP_task(uint8_t pad) +{ + if (pad >= MAX_PADS) + return; + + switch (ds3pad[pad].l2cap_state_) { + case L2CAP_INIT_STATE: + DPRINTF("L2CAP_I\n"); + l2cap_event_status_ &= ~L2CAP_EV_COMMAND_DISCONNECT_REQ; + l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_DISCONNECT_REQ; + ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_CONNECTING_STATE; + + case L2CAP_CONTROL_CONNECTING_STATE: + DPRINTF("L2CAP_C1 \n"); + if (l2cap_command_connected) { + l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONFIG_REQ; + ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_REQUEST_STATE; + } + break; + + case L2CAP_CONTROL_REQUEST_STATE: + DPRINTF("L2CAP_C2\n"); + if (l2cap_command_request) { + l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONFIGURED; + l2cap_configure(ds3pad[pad].command_dcid_, pad); + ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_CONFIGURING_STATE; + } + break; + + case L2CAP_CONTROL_CONFIGURING_STATE: + DPRINTF("L2CAP_C3\n"); + if (l2cap_command_configured) { + l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONNECTED; + ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_CONNECTING_STATE; + } + break; + + + case L2CAP_INTERRUPT_CONNECTING_STATE: + DPRINTF("L2CAP_I1\n"); + if (l2cap_interrupt_connected) { + l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONFIG_REQ; + l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONFIGURED; + ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_REQUEST_STATE; + } + break; + + case L2CAP_INTERRUPT_REQUEST_STATE: + DPRINTF("L2CAP_I2\n"); + if (l2cap_interrupt_request) { + l2cap_configure(ds3pad[pad].interrupt_dcid_, pad); + ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_CONFIGURING_STATE; + } + break; + + case L2CAP_INTERRUPT_CONFIGURING_STATE: + DPRINTF("L2CAP_I3\n"); + if (l2cap_interrupt_configured) { + ds3pad[pad].l2cap_state_ = L2CAP_CONNECTED_STATE; + } else + break; + + /* Established L2CAP */ + case L2CAP_CONNECTED_STATE: + DPRINTF("L2CAP_S\n"); + hid_flags_ = 0; + + initPSController(pad); + ds3pad[pad].l2cap_state_ = L2CAP_LED_STATE; + break; + + case L2CAP_LED_STATE: + if (hid_command_success) { + LED((pad + 1) << 1, pad); + ds3pad[pad].l2cap_state_ = L2CAP_READY_STATE; + ds3pad[pad].status_ |= DS3BT_STATE_RUNNING; + } + break; + + case L2CAP_READY_STATE: + break; + + case L2CAP_DISCONNECT_STATE: + DPRINTF("L2CAP_D\n"); + if (l2cap_interrupt_disconnected || l2cap_command_disconnected) { + ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; + } + break; + + default: + break; + } +} + +/************************************************************/ +/* L2CAP Commands */ +/************************************************************/ +static uint8_t l2cap_connect_response(uint8_t rxid, uint16_t dcid, uint16_t scid, uint8_t pad) +{ + uint8_t cmd_buf[12]; + + cmd_buf[0] = L2CAP_CMD_CONNECTION_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x08; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID (Our) + cmd_buf[5] = (uint8_t)(dcid >> 8); + cmd_buf[6] = (uint8_t)(scid & 0xff); // Source CID (PS Remote) + cmd_buf[7] = (uint8_t)(scid >> 8); + cmd_buf[8] = 0x00; // Result + cmd_buf[9] = 0x00; + cmd_buf[10] = 0x00; // Status + cmd_buf[11] = 0x00; + + return L2CAP_Command((uint8_t *)cmd_buf, 12, pad); +} + +static uint8_t l2cap_configure(uint16_t dcid, uint8_t pad) +{ + uint8_t cmd_buf[12]; + + cmd_buf[0] = L2CAP_CMD_CONFIG_REQUEST; // Code + cmd_buf[1] = (uint8_t)(l2cap_txid_++); // Identifier + cmd_buf[2] = 0x08; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID + cmd_buf[5] = (uint8_t)(dcid >> 8); + cmd_buf[6] = 0x00; // Flags + cmd_buf[7] = 0x00; + cmd_buf[8] = 0x01; // Config Opt: type = MTU (Maximum Transmission Unit) + cmd_buf[9] = 0x02; // Config Opt: length + cmd_buf[10] = 0x40; // Config Opt: data = maximum SDU size is 672 octets + cmd_buf[11] = 0x00; + + return L2CAP_Command((uint8_t *)cmd_buf, 12, pad); +} + +static uint8_t l2cap_config_response(uint8_t rxid, uint16_t dcid, uint8_t pad) +{ + uint8_t cmd_buf[10]; + + cmd_buf[0] = L2CAP_CMD_CONFIG_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x06; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (uint8_t)(dcid & 0xff); // Source CID + cmd_buf[5] = (uint8_t)(dcid >> 8); + cmd_buf[6] = 0x00; // Result + cmd_buf[7] = 0x00; + cmd_buf[8] = 0x00; // Config + cmd_buf[9] = 0x00; + + return L2CAP_Command((uint8_t *)cmd_buf, 10, pad); +} + +static uint8_t l2cap_disconnect_response(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad) +{ + uint8_t cmd_buf[8]; + + cmd_buf[0] = L2CAP_CMD_DISCONNECT_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x04; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID + cmd_buf[5] = (uint8_t)(dcid >> 8); + cmd_buf[6] = (uint8_t)(scid & 0xff); // Source CID + cmd_buf[7] = (uint8_t)(scid >> 8); + + return L2CAP_Command((uint8_t *)cmd_buf, 8, pad); +} + +static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) +{ + l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag + l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); + l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length + l2cap_cmd_buf[3] = (uint8_t)((4 + length) >> 8); + l2cap_cmd_buf[4] = (uint8_t)(length & 0xff); // L2CAP header: Length + l2cap_cmd_buf[5] = (uint8_t)(length >> 8); + l2cap_cmd_buf[6] = 0x01; // L2CAP header: Channel ID + l2cap_cmd_buf[7] = 0x00; // L2CAP Signalling channel over ACL-U logical link + + mips_memcpy(&l2cap_cmd_buf[8], data, length); + + // output on endpoint 2 + return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), NULL, NULL); +} + +/************************************************************/ +/* HID Commands */ +/************************************************************/ + +static uint8_t initPSController(int pad) +{ + uint8_t header = 2; + uint8_t init_buf[header + PS3_F4_REPORT_LEN]; + uint8_t i; + init_buf[0] = HID_THDR_SET_REPORT_FEATURE; // THdr + init_buf[1] = PS3_F4_REPORT_ID; // Report ID + + for (i = 0; i < PS3_F4_REPORT_LEN; i++) { + init_buf[header + i] = (uint8_t)feature_F4_report[i]; + } + + return writeReport((uint8_t *)init_buf, header + PS3_F4_REPORT_LEN, pad); +} + +#define DATA_START 11 + +static void readReport(uint8_t *data, int bytes, int pad) +{ + if (hid_input_report) { + ds3pad[pad].data[0] = ~data[DATA_START + ButtonStateL]; + ds3pad[pad].data[1] = ~data[DATA_START + ButtonStateH]; + + ds3pad[pad].data[2] = data[DATA_START + RightStickX]; //rx + ds3pad[pad].data[3] = data[DATA_START + RightStickY]; //ry + ds3pad[pad].data[4] = data[DATA_START + LeftStickX]; //lx + ds3pad[pad].data[5] = data[DATA_START + LeftStickY]; //ly + + if (bytes == 21 && !press_emu) + press_emu = 1; + + if (press_emu) //needs emulating pressure buttons + { + ds3pad[pad].data[6] = ((data[DATA_START + ButtonStateL] >> 5) & 1) * 255; //right + ds3pad[pad].data[7] = ((data[DATA_START + ButtonStateL] >> 7) & 1) * 255; //left + ds3pad[pad].data[8] = ((data[DATA_START + ButtonStateL] >> 4) & 1) * 255; //up + ds3pad[pad].data[9] = ((data[DATA_START + ButtonStateL] >> 6) & 1) * 255; //down + + ds3pad[pad].data[10] = ((data[DATA_START + ButtonStateH] >> 4) & 1) * 255; //triangle + ds3pad[pad].data[11] = ((data[DATA_START + ButtonStateH] >> 5) & 1) * 255; //circle + ds3pad[pad].data[12] = ((data[DATA_START + ButtonStateH] >> 6) & 1) * 255; //cross + ds3pad[pad].data[13] = ((data[DATA_START + ButtonStateH] >> 7) & 1) * 255; //square + + ds3pad[pad].data[14] = ((data[DATA_START + ButtonStateH] >> 2) & 1) * 255; //L1 + ds3pad[pad].data[15] = ((data[DATA_START + ButtonStateH] >> 3) & 1) * 255; //R1 + ds3pad[pad].data[16] = ((data[DATA_START + ButtonStateH] >> 0) & 1) * 255; //L2 + ds3pad[pad].data[17] = ((data[DATA_START + ButtonStateH] >> 1) & 1) * 255; //R2 + } else { + ds3pad[pad].data[6] = data[DATA_START + PressureRight]; //right + ds3pad[pad].data[7] = data[DATA_START + PressureLeft]; //left + ds3pad[pad].data[8] = data[DATA_START + PressureUp]; //up + ds3pad[pad].data[9] = data[DATA_START + PressureDown]; //down + + ds3pad[pad].data[10] = data[DATA_START + PressureTriangle]; //triangle + ds3pad[pad].data[11] = data[DATA_START + PressureCircle]; //circle + ds3pad[pad].data[12] = data[DATA_START + PressureCross]; //cross + ds3pad[pad].data[13] = data[DATA_START + PressureSquare]; //square + + ds3pad[pad].data[14] = data[DATA_START + PressureL1]; //L1 + ds3pad[pad].data[15] = data[DATA_START + PressureR1]; //R1 + ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 + ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 + + if (data[DATA_START + PSButtonState]) //display battery level + ds3pad[pad].oldled = ~(1 << data[DATA_START + Power]) & 0x1E; + else + ds3pad[pad].oldled = (pad + 1) << 1; + + if (data[DATA_START + Power] == 0xEE) //charging + ds3pad[pad].oldled |= 0x80; + else + ds3pad[pad].oldled &= 0x7F; + } + } else { + DPRINTF("Unmanaged Input Report: THDR 0x%x ", data[8]); + DPRINTF(" ID 0x%x\n", data[9]); + } +} // readReport + +static uint8_t writeReport(uint8_t *data, uint8_t length, int pad) +{ + l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag + l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); + l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length + l2cap_cmd_buf[3] = (uint8_t)((4 + length) >> 8); + l2cap_cmd_buf[4] = (uint8_t)(length & 0xff); // L2CAP header: Length + l2cap_cmd_buf[5] = (uint8_t)(length >> 8); + l2cap_cmd_buf[6] = (uint8_t)(ds3pad[pad].command_dcid_ & 0xff); // L2CAP header: Channel ID + l2cap_cmd_buf[7] = (uint8_t)(ds3pad[pad].command_dcid_ >> 8); + + mips_memcpy(&l2cap_cmd_buf[8], data, length); + + hid_flags_ &= ~HID_FLAG_COMMAND_SUCCESS; + + // output on endpoint 2 + return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), l2cap_cmd_cb, (void *)pad); +} // writeReport + +static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) +{ + uint8_t led_buf[PS3_01_REPORT_LEN + 2]; + + led_buf[0] = ds3pad[pad].type; // THdr + led_buf[1] = PS3_01_REPORT_ID; // Report ID + + mips_memcpy(&led_buf[2], output_01_report, sizeof(output_01_report)); // PS3_01_REPORT_LEN); + + led_buf[2 + 1] = 0xFE; //rt + led_buf[2 + 2] = rrum; //rp + led_buf[2 + 3] = 0xFE; //lt + led_buf[2 + 4] = lrum; //lp + + led_buf[2 + 9] = led & 0x7F; //LED Conf + + if (led & 0x80) //msb means charging, so blink + { + led_buf[2 + 13] = 0x32; + led_buf[2 + 18] = 0x32; + led_buf[2 + 23] = 0x32; + led_buf[2 + 28] = 0x32; + } + + ds3pad[pad].oldled = led; + ds3pad[pad].oldlrumble = lrum; + ds3pad[pad].oldrrumble = rrum; + + return writeReport((uint8_t *)led_buf, sizeof(output_01_report) /*PS3_01_REPORT_LEN*/ + 2, pad); +} +/************************************************************/ +/* DS3BT Commands */ +/************************************************************/ + +static uint8_t LED(uint8_t led, int pad) +{ + return LEDRumble(led, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); +} + +static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad) +{ + uint8_t ret; + + ret = LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); + WaitSema(bt_dev.l2cap_sema); + if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); + WaitSema(bt_dev.l2cap_sema); + } + return ret; +} + +void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port) +{ + if (port >= MAX_PADS) + return; + + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) + return; + + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + + Rumble(lrum, rrum, port); + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); +} + +void ds3bt_set_led(uint8_t led, int port) +{ + if (port >= MAX_PADS) + return; + + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) + return; + + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + + LED(led, port); + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); +} + +void ds3bt_get_bdaddr(uint8_t *data) +{ + uint8_t i; + + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) + return; + + WaitSema(bt_dev.hci_sema); + + hci_read_bdaddr(); + + WaitSema(bt_dev.hci_sema); + + for (i = 0; i < 10; i++) { + if (hci_read_bdaddr_complete) { + mips_memcpy(data, dg_bdaddr, 6); + break; + } + + DelayThread(100); + } + + SignalSema(bt_dev.hci_sema); +} + +void ds3bt_get_data(char *dst, int size, int port) +{ + if (port >= MAX_PADS) + return; + + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) + return; + + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)port); + + WaitSema(bt_dev.l2cap_sema); + + mips_memcpy(dst, ds3pad[port].data, size); + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); +} + +void ds3bt_reset() +{ + uint8_t i; + + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) + return; + + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + + for (i = 0; i < MAX_PADS; i++) { + if ((ds3pad[i].status_ & DS3BT_STATE_CONNECTED) || (ds3pad[i].status_ & DS3BT_STATE_RUNNING)) { + ds3pad[i].status_ &= ~DS3BT_STATE_RUNNING; + ds3pad[i].l2cap_state_ = L2CAP_DOWN_STATE; + + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + hci_disconnect(ds3pad[i].hci_handle_); + WaitSema(bt_dev.hci_sema); + } + } + + hci_reset(); + + WaitSema(bt_dev.hci_sema); + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); + + DelayThread(1000000); +} + +int ds3bt_get_status(int port) +{ + int status = bt_dev.status; + + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) + return status; + + if (port >= MAX_PADS) + return status; + + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + + status |= ds3pad[port].status_; + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); + + return status; +} + +int ds3bt_init(uint8_t pads) +{ + enable_pad = pads; + + ds3bt_reset(); + + return 1; +} + +static uint8_t chrg_inited = 0; + +void ds3bt_init_charging() +{ + if (!chrg_inited) + UsbRegisterDriver(&chrg_driver); + + chrg_inited = 1; +} + +static void rpc_thread(void *data); +static void *rpc_sf(int cmd, void *data, int size); + +static SifRpcDataQueue_t rpc_que __attribute__((aligned(16))); +static SifRpcServerData_t rpc_svr __attribute__((aligned(16))); + +static int rpc_buf[64] __attribute((aligned(16))); + +#define DS3BT_INIT 1 +#define DS3BT_INIT_CHARGING 2 +#define DS3BT_GET_STATUS 3 +#define DS3BT_GET_BDADDR 4 +#define DS3BT_SET_RUMBLE 5 +#define DS3BT_SET_LED 6 +#define DS3BT_GET_DATA 7 +#define DS3BT_RESET 8 + +#define DS3BT_BIND_RPC_ID 0x18E3878F + +void rpc_thread(void *data) +{ + if (sceSifCheckInit() == 0) { + DPRINTF("DS3BT: Sif not initialized \n"); + sceSifInit(); + } + + SifInitRpc(0); + SifSetRpcQueue(&rpc_que, GetThreadId()); + SifRegisterRpc(&rpc_svr, DS3BT_BIND_RPC_ID, rpc_sf, rpc_buf, NULL, NULL, &rpc_que); + SifRpcLoop(&rpc_que); +} + +void *rpc_sf(int cmd, void *data, int size) +{ + switch (cmd) { + case DS3BT_INIT: + ds3bt_init(*(uint8_t *)data); + break; + case DS3BT_INIT_CHARGING: + ds3bt_init_charging(); + break; + case DS3BT_GET_STATUS: + *(uint8_t *)data = ds3bt_get_status(*(uint8_t *)data); + break; + case DS3BT_GET_BDADDR: + ds3bt_get_bdaddr((uint8_t *)data); + break; + case DS3BT_SET_RUMBLE: + ds3bt_set_rumble(*(uint8_t *)(data + 1), *(uint8_t *)(data + 2), *(uint8_t *)data); + break; + case DS3BT_SET_LED: + ds3bt_set_led(*(uint8_t *)(data + 1), *(uint8_t *)data); + break; + case DS3BT_GET_DATA: + ds3bt_get_data((uint8_t *)data, 18, *(uint8_t *)data); + break; + case DS3BT_RESET: + ds3bt_reset(); + break; + default: + break; + } + + return data; +} + +int _start(int argc, char *argv[]) +{ + uint8_t enable = 0xFF; + + if (argc > 1) { + enable = argv[1][0]; + } + + enable_pad = enable; + + int ret = UsbRegisterDriver(&bt_driver); + + if (ret != USB_RC_OK) { + DPRINTF("DS3BT: Error registering BT devices\n"); + return MODULE_NO_RESIDENT_END; + } + + iop_thread_t rpc_th; + + rpc_th.attr = TH_C; + rpc_th.thread = rpc_thread; + rpc_th.priority = 40; + rpc_th.stacksize = 0x800; + rpc_th.option = 0; + + int thid = CreateThread(&rpc_th); + + if (thid > 0) { + StartThread(thid, NULL); + return MODULE_RESIDENT_END; + } + + return MODULE_NO_RESIDENT_END; +} diff --git a/modules/ds3bt/iop/ds3bt.h b/modules/ds3bt/iop/ds3bt.h new file mode 100644 index 000000000..9f0705674 --- /dev/null +++ b/modules/ds3bt/iop/ds3bt.h @@ -0,0 +1,279 @@ +#ifndef _DS3BT_H_ +#define _DS3BT_H_ + +#include "types.h" +#include "usbd.h" + +typedef u8 uint8_t; +typedef u16 uint16_t; + +void mips_memcpy(void *, const void *, unsigned); +void mips_memset(void *, int, unsigned); + +enum eHCI { + // {{{ + /* Bluetooth HCI states for HCI_task() */ + HCI_INIT_STATE = 0, + HCI_RESET_STATE, + HCI_CONNECT_IN_STATE, + HCI_CHANGE_CONNECTION, + HCI_READ_REMOTE_SUPPORTED_FEATURES, + HCI_CONNECTED_STATE, + + /* HCI OpCode Group Field (OGF) */ + HCI_OGF_LINK_CNTRL = (0x01 << 2), // OGF: Link Control Commands + HCI_OGF_LINK_POLICY = (0x02 << 2), // OGF: Link Policy Commands + HCI_OGF_CTRL_BBAND = (0x03 << 2), // OGF: Controller & Baseband Commands + HCI_OGF_INFO_PARAM = (0x04 << 2), // OGF: Informational Parameters + + /* HCI OpCode Command Field (OCF) */ + HCI_OCF_ACCEPT_CONNECTION = 0x09, // OGF = 0x01 + HCI_OCF_REJECT_CONNECTION = 0x0A, // OGF = 0x01 + HCI_OCF_CHANGE_CONNECTION_TYPE = 0x0F, // OGF = 0x01 + HCI_OCF_RESET = 0x03, // OGF = 0x03 + HCI_OCF_WRITE_ACCEPT_TIMEOUT = 0x16, // OGF = 0x03 + HCI_OCF_WRITE_SCAN_ENABLE = 0x1A, // OGF = 0x03 + + /* HCI events managed */ + HCI_EVENT_CONNECT_COMPLETE = 0x03, + HCI_EVENT_CONNECT_REQUEST = 0x04, + HCI_EVENT_DISCONN_COMPLETE = 0x05, + HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE = 0x0B, + HCI_EVENT_QOS_SETUP_COMPLETE = 0x0d, // do nothing + HCI_EVENT_COMMAND_COMPLETE = 0x0e, + HCI_EVENT_COMMAND_STATUS = 0x0f, + HCI_EVENT_ROLE_CHANGED = 0x12, + HCI_EVENT_NUM_COMPLETED_PKT = 0x13, // do nothing + HCI_EVENT_CHANGED_CONNECTION_TYPE = 0x1D, + HCI_EVENT_PAGE_SR_CHANGED = 0x20, + HCI_EVENT_MAX_SLOT_CHANGE = 0x1B, //Max Slots Change event + + /* HCI event flags for hci_event_flag */ + HCI_FLAG_COMMAND_COMPLETE = 0x01, + HCI_FLAG_COMMAND_STATUS = 0x02, + HCI_FLAG_CONNECT_COMPLETE = 0x04, + HCI_FLAG_DISCONN_COMPLETE = 0x08, + HCI_FLAG_INCOMING_REQUEST = 0x10, + HCI_FLAG_READ_BDADDR = 0x20, + + /* HCI Scan Enable Parameters */ + SCAN_ENABLE_NOINQ_NOPAG = 0x00, + SCAN_ENABLE_ENINQ_NOPAG = 0x01, + SCAN_ENABLE_NOINQ_ENPAG = 0x02, + SCAN_ENABLE_ENINQ_ENPAG = 0x03, + + // used in control endpoint header for HCI Commands + bmREQ_HCI_OUT = (USB_DIR_OUT | + USB_TYPE_CLASS | + USB_RECIP_DEVICE), + HCI_COMMAND_REQ = 0, + // }}} +}; + +enum eL2CAP { + // {{{ + /* Bluetooth L2CAP PSM */ + L2CAP_PSM_WRITE = 0x11, // HID_Control + L2CAP_PSM_READ = 0x13, // HID_Interrupt + + /* Bluetooth L2CAP states for L2CAP_task() */ + L2CAP_DOWN_STATE = 0, + L2CAP_INIT_STATE, + L2CAP_CONTROL_CONNECTING_STATE, + L2CAP_CONTROL_REQUEST_STATE, + L2CAP_CONTROL_CONFIGURING_STATE, + L2CAP_INTERRUPT_CONNECTING_STATE, + L2CAP_INTERRUPT_REQUEST_STATE, + L2CAP_INTERRUPT_CONFIGURING_STATE, + L2CAP_CONNECTED_STATE, + L2CAP_LED_STATE, + L2CAP_READY_STATE, + L2CAP_DISCONNECT_STATE, + + /* L2CAP event flags */ + L2CAP_EV_COMMAND_CONNECTED = 0x01, + L2CAP_EV_COMMAND_CONFIG_REQ = 0x02, + L2CAP_EV_COMMAND_CONFIGURED = 0x04, + L2CAP_EV_COMMAND_DISCONNECT_REQ = 0x08, + L2CAP_EV_INTERRUPT_CONNECTED = 0x10, + L2CAP_EV_INTERRUPT_CONFIG_REQ = 0x20, + L2CAP_EV_INTERRUPT_CONFIGURED = 0x40, + L2CAP_EV_INTERRUPT_DISCONNECT_REQ = 0x80, + + /* L2CAP signaling command */ + L2CAP_CMD_COMMAND_REJECT = 0x01, + L2CAP_CMD_CONNECTION_REQUEST = 0x02, + L2CAP_CMD_CONNECTION_RESPONSE = 0x03, + L2CAP_CMD_CONFIG_REQUEST = 0x04, + L2CAP_CMD_CONFIG_RESPONSE = 0x05, + L2CAP_CMD_DISCONNECT_REQUEST = 0x06, + L2CAP_CMD_DISCONNECT_RESPONSE = 0x07, + + /* HCI ACL Data Packet + * + * buf[0] buf[1] buf[2] buf[3] + * 0 4 8 11 12 16 24 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | HCI Handle |PB |BC | Data Total Length | HCI ACL Data Packet + * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * + * buf[4] buf[5] buf[6] buf[7] + * 0 8 16 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | Length | Channel ID | Basic L2CAP header + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * + * buf[8] buf[9] buf[10] buf[11] + * 0 8 16 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | Code | Identifier | Length | Control frame (C-frame) + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. (signaling packet format) + */ + // }}} +}; + +enum eHID { + // {{{ + /* HID event flag */ + HID_FLAG_STATUS_REPORTED = 0x01, + HID_FLAG_BUTTONS_CHANGED = 0x02, + HID_FLAG_EXTENSION = 0x04, + HID_FLAG_COMMAND_SUCCESS = 0x08, + + /* Bluetooth HID Transaction Header (THdr) */ + HID_THDR_GET_REPORT_FEATURE = 0x43, + HID_THDR_SET_REPORT_OUTPUT = 0x52, + HID_THDR_SET_REPORT_FEATURE = 0x53, + HID_THDR_DATA_INPUT = 0xa1, + + /* Defines of various parameters for PS3 Game controller reports */ + PS3_F4_REPORT_ID = 0xF4, + PS3_F4_REPORT_LEN = 0x04, + + PS3_01_REPORT_ID = 0x01, + PS3_01_REPORT_LEN = 0x30, + // }}} +}; + +enum eDS3BTLEDRumble { + psLEDN = 0x00, + psLED1 = 0x02, + psLED2 = 0x04, + psLED3 = 0x08, + psLED4 = 0x0F, + psLEDA = 0x10, +}; + +enum eDS3BTStatus { + DS3BT_STATE_USB_DISCONNECTED = 0x00, + DS3BT_STATE_USB_AUTHORIZED = 0x01, + DS3BT_STATE_USB_CONFIGURED = 0x02, + DS3BT_STATE_CONNECTED = 0x04, + DS3BT_STATE_RUNNING = 0x08, +}; + +//Structure which describes the type 01 input report +enum TYPE_01_REPORT { + ButtonStateL = 0, // Main buttons Low + ButtonStateH, // Main buttons High + PSButtonState, // PS button + Reserved1, // Unknown + LeftStickX, // left Joystick X axis 0 - 255, 128 is mid + LeftStickY, // left Joystick Y axis 0 - 255, 128 is mid + RightStickX, // right Joystick X axis 0 - 255, 128 is mid + RightStickY, // right Joystick Y axis 0 - 255, 128 is mid + Reserved2, // Unknown + Reserved3, // Unknown + Reserved4, // Unknown + Reserved5, // Unknown + PressureUp, // digital Pad Up button Pressure 0 - 255 + PressureRight, // digital Pad Right button Pressure 0 - 255 + PressureDown, // digital Pad Down button Pressure 0 - 255 + PressureLeft, // digital Pad Left button Pressure 0 - 255 + PressureL2, // digital Pad L2 button Pressure 0 - 255 + PressureR2, // digital Pad R2 button Pressure 0 - 255 + PressureL1, // digital Pad L1 button Pressure 0 - 255 + PressureR1, // digital Pad R1 button Pressure 0 - 255 + PressureTriangle, // digital Pad Triangle button Pressure 0 - 255 + PressureCircle, // digital Pad Circle button Pressure 0 - 255 + PressureCross, // digital Pad Cross button Pressure 0 - 255 + PressureSquare, // digital Pad Square button Pressure 0 - 255 + Reserved6, // Unknown + Reserved7, // Unknown + Reserved8, // Unknown + Charge, // charging status ? 02 = charge, 03 = normal + Power, // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging + Connection, // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble + Reserved9, // Unknown + Reserved10, // Unknown + Reserved11, // Unknown + Reserved12, // Unknown + Reserved13, // Unknown + Reserved14, // Unknown + Reserved15, // Unknown + Reserved16, // Unknown + Reserved17, // Unknown + AccelXH, // X axis accelerometer Big Endian 0 - 1023 + AccelXL, // Low + AccelYH, // Y axis accelerometer Big Endian 0 - 1023 + AccelYL, // Low + AccelZH, // Z Accelerometer Big Endian 0 - 1023 + AccelZL, // Low + GyroZH, // Z axis Gyro Big Endian 0 - 1023 + GyroZL, // Low +}; + +enum eBUF_SIZE { + MAX_BUFFER_SIZE = 64, // Size of general purpose data buffer +}; + +/* HCI macro */ +#define hci_timeout (hci_counter_-- == 0) + +/* Macros for HCI event flag tests */ +#define hci_command_complete (hci_event_flag_ & HCI_FLAG_COMMAND_COMPLETE) +#define hci_command_status (hci_event_flag_ & HCI_FLAG_COMMAND_STATUS) +#define hci_connect_complete (hci_event_flag_ & HCI_FLAG_CONNECT_COMPLETE) +#define hci_disconn_complete (hci_event_flag_ & HCI_FLAG_DISCONN_COMPLETE) +#define hci_incoming_connect_request (hci_event_flag_ & HCI_FLAG_INCOMING_REQUEST) +#define hci_read_bdaddr_complete (hci_event_flag_ & HCI_FLAG_READ_BDADDR) + +/* Macros for L2CAP event flag tests */ +#define l2cap_command_connected (l2cap_event_status_ & L2CAP_EV_COMMAND_CONNECTED) +#define l2cap_command_request (l2cap_event_status_ & L2CAP_EV_COMMAND_CONFIG_REQ) +#define l2cap_command_configured (l2cap_event_status_ & L2CAP_EV_COMMAND_CONFIGURED) +#define l2cap_command_disconnected (l2cap_event_status_ & L2CAP_EV_COMMAND_DISCONNECT_REQ) +#define l2cap_interrupt_connected (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONNECTED) +#define l2cap_interrupt_request (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONFIG_REQ) +#define l2cap_interrupt_configured (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONFIGURED) +#define l2cap_interrupt_disconnected (l2cap_event_status_ & L2CAP_EV_INTERRUPT_DISCONNECT_REQ) + +/* Macros for L2CAP event task tests */ +#define acl_handle_ok(handle) ((l2cap_buf[0] | (l2cap_buf[1] << 8)) == ((handle & 0x0FFF) | 0x2000)) +#define l2cap_control ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == 0x0001) // Channel ID for ACL-U +#define l2cap_interrupt ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == interrupt_scid_) +#define l2cap_command ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == command_scid_) +#define l2cap_command_reject (l2cap_buf[8] == L2CAP_CMD_COMMAND_REJECT) +#define l2cap_connection_request (l2cap_buf[8] == L2CAP_CMD_CONNECTION_REQUEST) +#define l2cap_configuration_request (l2cap_buf[8] == L2CAP_CMD_CONFIG_REQUEST) +#define l2cap_configuration_response (l2cap_buf[8] == L2CAP_CMD_CONFIG_RESPONSE) +#define l2cap_configuration_success ((l2cap_buf[16] | (l2cap_buf[17] << 8)) == 0x0000) +#define l2cap_disconnect_request (l2cap_buf[8] == L2CAP_CMD_DISCONNECT_REQUEST) + +/* Macros for HID event flag tests */ +#define hid_buttons_changed (hid_flags_ & HID_FLAG_BUTTONS_CHANGED) +#define hid_extension (hid_flags_ & HID_FLAG_EXTENSION) +#define hid_command_success (hid_flags_ & HID_FLAG_COMMAND_SUCCESS) +#define hid_handshake_success (l2cap_buf[8] == 0) +#define hid_input_report ((data[8] == HID_THDR_DATA_INPUT) & (data[9] == PS3_01_REPORT_ID)) + +int ds3bt_init(uint8_t pads); +void ds3bt_init_charging(); +int ds3bt_get_status(int port); +void ds3bt_reset(); +void ds3bt_get_data(char *dst, int size, int port); +void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port); +void ds3bt_set_led(uint8_t led, int port); +void ds3bt_get_bdaddr(uint8_t *data); + +#endif diff --git a/modules/ds3bt/iop/imports.lst b/modules/ds3bt/iop/imports.lst new file mode 100644 index 000000000..a33c04873 --- /dev/null +++ b/modules/ds3bt/iop/imports.lst @@ -0,0 +1,57 @@ + +#include "ioman_mod.h" + +sifcmd_IMPORTS_start +I_sceSifInitRpc +I_sceSifSetRpcQueue +I_sceSifRegisterRpc +I_sceSifRpcLoop +sifcmd_IMPORTS_end + +stdio_IMPORTS_start +I_printf +stdio_IMPORTS_end + +thsemap_IMPORTS_start +I_CreateSema +I_SignalSema +I_WaitSema +I_PollSema +I_DeleteSema +thsemap_IMPORTS_end + +thbase_IMPORTS_start +I_StartThread +I_CreateThread +I_DeleteThread +I_DelayThread +I_GetThreadId +thbase_IMPORTS_end + +intrman_IMPORTS_start +I_CpuSuspendIntr +I_CpuResumeIntr +intrman_IMPORTS_end + +sifman_IMPORTS_start +I_sceSifCheckInit +I_sceSifInit +I_sceSifSetDma +I_sceSifDmaStat +sifman_IMPORTS_end + +usbd_IMPORTS_start +I_UsbGetDeviceStaticDescriptor +I_UsbOpenEndpoint +I_UsbCloseEndpoint +I_UsbOpenEndpointAligned +I_UsbSetDevicePrivateData +I_UsbTransfer +I_UsbRegisterDriver +usbd_IMPORTS_end + +sysclib_IMPORTS_start +I_prnt +I_strncmp +I_strncpy +sysclib_IMPORTS_end diff --git a/modules/ds3bt/iop/irx_imports.h b/modules/ds3bt/iop/irx_imports.h new file mode 100644 index 000000000..d7fe695d6 --- /dev/null +++ b/modules/ds3bt/iop/irx_imports.h @@ -0,0 +1,37 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# $Id$ +# Defines all IRX imports. +*/ + +#ifndef IOP_IRX_IMPORTS_H +#define IOP_IRX_IMPORTS_H + +#include "irx.h" + +/* Please keep these in alphabetical order! */ +#include "dmacman.h" +#include "intrman.h" +#include "iomanX.h" +#include "libsd.h" +#include "loadcore.h" +#include "sifcmd.h" +#include "sifman.h" +#include "stdio.h" +#include "sysclib.h" +#include "sysmem.h" +#include "thbase.h" +#include "thevent.h" +#include "thmsgbx.h" +#include "thsemap.h" +#include "usbd.h" +#include "vblank.h" + +#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/ds3usb/Makefile b/modules/ds3usb/Makefile new file mode 100644 index 000000000..839f9e495 --- /dev/null +++ b/modules/ds3usb/Makefile @@ -0,0 +1,11 @@ +all: + $(MAKE) -C iop + $(MAKE) -C ee + +clean: + $(MAKE) -C iop clean + $(MAKE) -C ee clean + +rebuild: + $(MAKE) -C iop rebuild + $(MAKE) -C ee rebuild \ No newline at end of file diff --git a/modules/ds3usb/ee/Makefile b/modules/ds3usb/ee/Makefile new file mode 100644 index 000000000..b96280ece --- /dev/null +++ b/modules/ds3usb/ee/Makefile @@ -0,0 +1,15 @@ +EE_LIB = libds3usb.a + +EE_OBJS = libds3usb.o +EE_LIBS = -lc +EE_CFLAGS = -Wall + +all: $(EE_LIB) + +clean: + rm -f -r $(EE_OBJS) $(EE_LIB) + +rebuild: clean all + +include $(PS2SDK)/samples/Makefile.pref +include $(PS2SDK)/samples/Makefile.eeglobal diff --git a/modules/ds3usb/ee/libds3usb.c b/modules/ds3usb/ee/libds3usb.c new file mode 100644 index 000000000..a44b7130b --- /dev/null +++ b/modules/ds3usb/ee/libds3usb.c @@ -0,0 +1,136 @@ +#include +#include +#include + +#define DS3USB_INIT 1 +#define DS3USB_GET_STATUS 2 +#define DS3USB_GET_BDADDR 3 +#define DS3USB_SET_BDADDR 4 +#define DS3USB_SET_RUMBLE 5 +#define DS3USB_SET_LED 6 +#define DS3USB_GET_DATA 7 +#define DS3USB_RESET 8 + +#define DS3USB_BIND_RPC_ID 0x18E3878E + +static SifRpcClientData_t ds3usb; + +static u8 rpcbuf[64] __attribute__((aligned(64))); + +static u8 ds3usb_inited = 0; + +int ds3usb_init() +{ + ds3usb.server = NULL; + + do { + if (SifBindRpc(&ds3usb, DS3USB_BIND_RPC_ID, 0) < 0) + return -1; + + nopdelay(); + } while (!ds3usb.server); + + ds3usb_inited = 1; + + return 1; +} + +int ds3usb_reinit_ports(u8 ports) +{ + if (!ds3usb_inited) + return -1; + + rpcbuf[0] = ports; + return SifCallRpc(&ds3usb, DS3USB_INIT, 0, rpcbuf, 1, NULL, 0, NULL, NULL); +} + +int ds3usb_get_status(int port) +{ + if (!ds3usb_inited) + return -1; + + rpcbuf[0] = port; + + SifCallRpc(&ds3usb, DS3USB_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL); + + return rpcbuf[0]; +} + +int ds3usb_get_bdaddr(int port, u8 *bdaddr) +{ + int i, ret; + + if (!ds3usb_inited) + return -1; + + rpcbuf[0] = port; + + ret = SifCallRpc(&ds3usb, DS3USB_GET_BDADDR, 0, rpcbuf, 1, rpcbuf, 6, NULL, NULL); + + for (i = 0; i < 6; i++) + bdaddr[i] = rpcbuf[i]; + + return ret; +} + +int ds3usb_set_bdaddr(int port, u8 *bdaddr) +{ + int i; + + if (!ds3usb_inited) + return -1; + + rpcbuf[0] = port; + + for (i = 0; i < 6; i++) + rpcbuf[i + 1] = bdaddr[i]; + + return SifCallRpc(&ds3usb, DS3USB_SET_BDADDR, 0, rpcbuf, 7, NULL, 0, NULL, NULL); +} + +int ds3usb_set_rumble(int port, u8 lrum, u8 rrum) +{ + if (!ds3usb_inited) + return -1; + + rpcbuf[0] = port; + rpcbuf[1] = lrum; + rpcbuf[2] = rrum; + + return SifCallRpc(&ds3usb, DS3USB_SET_RUMBLE, 0, rpcbuf, 3, NULL, 0, NULL, NULL); +} + +int ds3usb_set_led(int port, u8 led) +{ + if (!ds3usb_inited) + return -1; + + rpcbuf[0] = port; + rpcbuf[1] = led; + + return SifCallRpc(&ds3usb, DS3USB_SET_LED, 0, rpcbuf, 2, NULL, 0, NULL, NULL); +} + +int ds3usb_get_data(int port, u8 *data) +{ + int ret; + + if (!ds3usb_inited) + return -1; + + rpcbuf[0] = port; + + ret = SifCallRpc(&ds3usb, DS3USB_GET_DATA, 0, rpcbuf, 1, rpcbuf, 18, NULL, NULL); + + memcpy(data, rpcbuf, 18); + + return ret; +} + +int ds3usb_reset() +{ + if (!ds3usb_inited) + return -1; + + return SifCallRpc(&ds3usb, DS3USB_RESET, 0, NULL, 0, NULL, 0, NULL, NULL); +} diff --git a/modules/ds3usb/ee/libds3usb.h b/modules/ds3usb/ee/libds3usb.h new file mode 100644 index 000000000..46562dd00 --- /dev/null +++ b/modules/ds3usb/ee/libds3usb.h @@ -0,0 +1,18 @@ + +enum eDS3USBStatus { + DS3USB_STATE_DISCONNECTED = 0x00, + DS3USB_STATE_AUTHORIZED = 0x01, + DS3USB_STATE_CONFIGURED = 0x02, + DS3USB_STATE_CONNECTED = 0x04, + DS3USB_STATE_RUNNING = 0x08, +}; + +int ds3usb_init(); +int ds3usb_reinit_ports(u8 ports); +int ds3usb_get_status(int port); +int ds3usb_get_bdaddr(int port, u8 *bdaddr); +int ds3usb_set_bdaddr(int port, u8 *bdaddr); +int ds3usb_set_rumble(int port, u8 lrum, u8 rrum); +int ds3usb_set_led(int port, u8 led); +int ds3usb_get_data(int port, u8 *data); +int ds3usb_reset(); diff --git a/modules/ds3usb/iop/Makefile b/modules/ds3usb/iop/Makefile new file mode 100644 index 000000000..45fc1efb3 --- /dev/null +++ b/modules/ds3usb/iop/Makefile @@ -0,0 +1,18 @@ +IOP_BIN = ds3usb.irx + +IOP_INCS += +IOP_CFLAGS += -Wall +IOP_LDFLAGS += -s + +IOP_OBJS = ds3usb.o smsutils.o imports.o +IOP_LIBS = + +all: $(IOP_BIN) + +clean: + rm -f $(IOP_BIN) $(IOP_OBJS) + +rebuild: clean all + +include $(PS2SDK)/Defs.make +include $(PS2SDK)/samples/Makefile.iopglobal diff --git a/modules/ds3usb/iop/ds3usb.c b/modules/ds3usb/iop/ds3usb.c new file mode 100644 index 000000000..a6b000efa --- /dev/null +++ b/modules/ds3usb/iop/ds3usb.c @@ -0,0 +1,533 @@ +#include "types.h" +#include "ioman.h" +#include "intrman.h" +#include "loadcore.h" +#include "stdio.h" +#include "sifcmd.h" +#include "sifrpc.h" +#include "sysclib.h" +#include "sysmem.h" +#include "usbd.h" +#include "usbd_macro.h" +#include "thbase.h" +#include "thevent.h" +#include "thsemap.h" +#include "sifman.h" +#include "vblank.h" +#include "ds3usb.h" + +//#define DPRINTF(x...) printf(x) +#define DPRINTF(x...) + +#define MAX_PADS 2 + +static uint8_t output_01_report[] = + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; + +static uint8_t usb_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; + +int usb_probe(int devId); +int usb_connect(int devId); +int usb_disconnect(int devId); + +static void usb_release(int pad); +static void usb_config_set(int result, int count, void *arg); + +UsbDriver usb_driver = {NULL, NULL, "ds3usb", usb_probe, usb_connect, usb_disconnect}; + +static void DS3USB_init(int pad); +static void readReport(uint8_t *data, int pad); +static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); +static uint8_t LED(uint8_t led, int pad); +static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad); + +typedef struct _usb_ds3 +{ + int devId; + int sema; + int controlEndp; + int eventEndp; + uint8_t status; + uint8_t oldled; + uint8_t oldlrumble; + uint8_t oldrrumble; + uint8_t data[18]; + uint8_t enabled; +} ds3usb_device; + +ds3usb_device ds3pad[MAX_PADS]; + +int usb_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + + DPRINTF("DS3USB: probe: devId=%i\n", devId); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("DS3USB: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->idVendor == 0x054C && device->idProduct == 0x0268) + return 1; + + return 0; +} + +int usb_connect(int devId) +{ + int pad, epCount; + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + UsbInterfaceDescriptor *interface; + UsbEndpointDescriptor *endpoint; + iop_sema_t SemaData; + + DPRINTF("DS3USB: connect: devId=%i\n", devId); + + for (pad = 0; pad < MAX_PADS; pad++) { + if (ds3pad[pad].devId == -1 && ds3pad[pad].enabled) + break; + } + + if (pad >= MAX_PADS) { + DPRINTF("DS3USB: Error - only %d device allowed !\n", MAX_PADS); + return 1; + } + + ds3pad[pad].devId = devId; + + ds3pad[pad].status = DS3USB_STATE_AUTHORIZED; + + ds3pad[pad].controlEndp = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + epCount = interface->bNumEndpoints - 1; + + endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); + + do { + + if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && ds3pad[pad].eventEndp < 0) { + ds3pad[pad].eventEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("BT: register Event endpoint id =%i addr=%02X packetSize=%i\n", ds3pad[pad].eventEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + break; + } + } + + endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); + + } while (epCount--); + + if (ds3pad[pad].eventEndp < 0) { + usb_release(pad); + return 1; + } + + SemaData.initial = 1; + SemaData.max = 1; + SemaData.option = 0; + SemaData.attr = 0; + + if ((ds3pad[pad].sema = CreateSema(&SemaData)) < 0) { + DPRINTF("DS3USB: Failed to allocate I/O semaphore.\n"); + return -1; + } + + ds3pad[pad].status |= DS3USB_STATE_CONNECTED; + + UsbSetDeviceConfiguration(ds3pad[pad].controlEndp, config->bConfigurationValue, usb_config_set, (void *)pad); + + return 0; +} + +int usb_disconnect(int devId) +{ + uint8_t pad; + + DPRINTF("DS3USB: disconnect: devId=%i\n", devId); + + for (pad = 0; pad < MAX_PADS; pad++) { + if (ds3pad[pad].devId == devId) + break; + } + + if (pad < MAX_PADS && (ds3pad[pad].status & DS3USB_STATE_AUTHORIZED)) + usb_release(pad); + + return 0; +} + +static void usb_release(int pad) +{ + if (ds3pad[pad].eventEndp >= 0) + UsbCloseEndpoint(ds3pad[pad].eventEndp); + + if (ds3pad[pad].sema >= 0) + DeleteSema(ds3pad[pad].sema); + + ds3pad[pad].controlEndp = -1; + ds3pad[pad].eventEndp = -1; + ds3pad[pad].devId = -1; + ds3pad[pad].status = DS3USB_STATE_DISCONNECTED; +} + +static void usb_data_cb(int resultCode, int bytes, void *arg) +{ + int pad = (int)arg; + + //DPRINTF("usb_data_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + if (!resultCode) + readReport(usb_buf, pad); + + SignalSema(ds3pad[pad].sema); +} + +static void usb_cmd_cb(int resultCode, int bytes, void *arg) +{ + int pad = (int)arg; + + //DPRINTF("usb_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + SignalSema(ds3pad[pad].sema); +} + +static void usb_config_set(int result, int count, void *arg) +{ + int pad = (int)arg; + + ds3pad[pad].status |= DS3USB_STATE_CONFIGURED; + + DS3USB_init(pad); + + DelayThread(10000); + + LED((pad + 1) << 1, pad); + + ds3pad[pad].status |= DS3USB_STATE_RUNNING; +} + +static void DS3USB_init(int pad) +{ + usb_buf[0] = 0x42; + usb_buf[1] = 0x0c; + usb_buf[2] = 0x00; + usb_buf[3] = 0x00; + + UsbControlTransfer(ds3pad[pad].controlEndp, bmREQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF4, 0, 4, usb_buf, NULL, NULL); +} + +#define DATA_START 2 + +static void readReport(uint8_t *data, int pad) +{ + if (data[0]) { + ds3pad[pad].data[0] = ~data[DATA_START + ButtonStateL]; + ds3pad[pad].data[1] = ~data[DATA_START + ButtonStateH]; + + ds3pad[pad].data[2] = data[DATA_START + RightStickX]; //rx + ds3pad[pad].data[3] = data[DATA_START + RightStickY]; //ry + ds3pad[pad].data[4] = data[DATA_START + LeftStickX]; //lx + ds3pad[pad].data[5] = data[DATA_START + LeftStickY]; //ly + + ds3pad[pad].data[6] = data[DATA_START + PressureRight]; //right + ds3pad[pad].data[7] = data[DATA_START + PressureLeft]; //left + ds3pad[pad].data[8] = data[DATA_START + PressureUp]; //up + ds3pad[pad].data[9] = data[DATA_START + PressureDown]; //down + + ds3pad[pad].data[10] = data[DATA_START + PressureTriangle]; //triangle + ds3pad[pad].data[11] = data[DATA_START + PressureCircle]; //circle + ds3pad[pad].data[12] = data[DATA_START + PressureCross]; //cross + ds3pad[pad].data[13] = data[DATA_START + PressureSquare]; //square + + ds3pad[pad].data[14] = data[DATA_START + PressureL1]; //L1 + ds3pad[pad].data[15] = data[DATA_START + PressureR1]; //R1 + ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 + ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 + + if (data[DATA_START + PSButtonState]) //display battery level + ds3pad[pad].oldled = ~(1 << data[DATA_START + Power]) & 0x1E; + else + ds3pad[pad].oldled = (pad + 1) << 1; + + if (data[DATA_START + Power] == 0xEE) //charging + ds3pad[pad].oldled |= 0x80; + else + ds3pad[pad].oldled &= 0x7F; + } +} + +static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) +{ + mips_memcpy(usb_buf, output_01_report, sizeof(output_01_report)); + + usb_buf[1] = 0xFE; //rt + usb_buf[2] = rrum; //rp + usb_buf[3] = 0xFE; //lt + usb_buf[4] = lrum; //lp + + usb_buf[9] = led & 0x7F; //LED Conf + + if (led & 0x80) //msb means charging, so blink + { + usb_buf[13] = 0x32; + usb_buf[18] = 0x32; + usb_buf[23] = 0x32; + usb_buf[28] = 0x32; + } + + ds3pad[pad].oldled = led; + ds3pad[pad].oldlrumble = lrum; + ds3pad[pad].oldrrumble = rrum; + + return UsbControlTransfer(ds3pad[pad].controlEndp, bmREQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_SET_REPORT_OUTPUT << 8) | 0x01, 0, sizeof(output_01_report), usb_buf, usb_cmd_cb, (void *)pad); +} + +static uint8_t LED(uint8_t led, int pad) +{ + return LEDRumble(led, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); +} + +static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad) +{ + return LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); +} + +void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port) +{ + if (port >= MAX_PADS) + return; + + WaitSema(ds3pad[port].sema); + + Rumble(lrum, rrum, port); + + WaitSema(ds3pad[port].sema); + + SignalSema(ds3pad[port].sema); +} + +void ds3usb_set_led(uint8_t led, int port) +{ + if (port >= MAX_PADS) + return; + + WaitSema(ds3pad[port].sema); + + LED(led, port); + + WaitSema(ds3pad[port].sema); + + SignalSema(ds3pad[port].sema); +} + +void ds3usb_get_data(char *dst, int size, int port) +{ + if (port >= MAX_PADS) + return; + + WaitSema(ds3pad[port].sema); + + UsbInterruptTransfer(ds3pad[port].eventEndp, usb_buf, MAX_BUFFER_SIZE, usb_data_cb, (void *)port); + + WaitSema(ds3pad[port].sema); + + mips_memcpy(dst, ds3pad[port].data, size); + + SignalSema(ds3pad[port].sema); +} + +void ds3usb_get_bdaddr(uint8_t *data, int port) +{ + int i; + + if (port >= MAX_PADS) + return; + + WaitSema(ds3pad[port].sema); + + UsbControlTransfer(ds3pad[port].controlEndp, bmREQ_USB_IN, USB_REQ_GET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF5, 0, 8, usb_buf, usb_cmd_cb, (void *)port); + + WaitSema(ds3pad[port].sema); + + for (i = 0; i < 6; i++) + data[5 - i] = usb_buf[2 + i]; + + SignalSema(ds3pad[port].sema); +} + +void ds3usb_set_bdaddr(uint8_t *data, int port) +{ + int i; + + WaitSema(ds3pad[port].sema); + + usb_buf[0] = 0x01; + usb_buf[1] = 0x00; + + for (i = 0; i < 6; i++) + usb_buf[i + 2] = data[5 - i]; + + UsbControlTransfer(ds3pad[port].controlEndp, bmREQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF5, 0, 8, usb_buf, usb_cmd_cb, (void *)port); + + WaitSema(ds3pad[port].sema); + + SignalSema(ds3pad[port].sema); +} + +void ds3usb_reset() +{ + int pad; + + for (pad = 0; pad < MAX_PADS; pad++) + usb_release(pad); +} + +int ds3usb_get_status(int port) +{ + return ds3pad[port].status; +} + +void ds3usb_init(uint8_t pads) +{ + uint8_t pad; + + for (pad = 0; pad < MAX_PADS; pad++) { + usb_release(pad); + + ds3pad[pad].status = 0; + ds3pad[pad].devId = -1; + ds3pad[pad].oldled = 0; + ds3pad[pad].oldlrumble = 0; + ds3pad[pad].oldrrumble = 0; + ds3pad[pad].sema = -1; + ds3pad[pad].controlEndp = -1; + ds3pad[pad].eventEndp = -1; + ds3pad[pad].enabled = (pads >> pad) & 1; + + ds3pad[pad].data[0] = 0xFF; + ds3pad[pad].data[1] = 0xFF; + + mips_memset(&ds3pad[pad].data[2], 0x7F, 4); + mips_memset(&ds3pad[pad].data[6], 0x00, 12); + } +} + +static void rpc_thread(void *data); +static void *rpc_sf(int cmd, void *data, int size); + +static SifRpcDataQueue_t rpc_que __attribute__((aligned(16))); +static SifRpcServerData_t rpc_svr __attribute__((aligned(16))); + +static int rpc_buf[64] __attribute((aligned(16))); + +#define DS3USB_INIT 1 +#define DS3USB_GET_STATUS 2 +#define DS3USB_GET_BDADDR 3 +#define DS3USB_SET_BDADDR 4 +#define DS3USB_SET_RUMBLE 5 +#define DS3USB_SET_LED 6 +#define DS3USB_GET_DATA 7 +#define DS3USB_RESET 8 + +#define DS3USB_BIND_RPC_ID 0x18E3878E + +void rpc_thread(void *data) +{ + if (sceSifCheckInit() == 0) { + DPRINTF("DS3USB: Sif not initialized \n"); + sceSifInit(); + } + + SifInitRpc(0); + SifSetRpcQueue(&rpc_que, GetThreadId()); + SifRegisterRpc(&rpc_svr, DS3USB_BIND_RPC_ID, rpc_sf, rpc_buf, NULL, NULL, &rpc_que); + SifRpcLoop(&rpc_que); +} + +void *rpc_sf(int cmd, void *data, int size) +{ + switch (cmd) { + case DS3USB_INIT: + ds3usb_init(*(uint8_t *)data); + break; + case DS3USB_GET_STATUS: + *(uint8_t *)data = ds3usb_get_status(*(uint8_t *)data); + break; + case DS3USB_GET_BDADDR: + ds3usb_get_bdaddr((uint8_t *)data, *(uint8_t *)data); + break; + case DS3USB_SET_BDADDR: + ds3usb_set_bdaddr((uint8_t *)(data + 1), *(uint8_t *)data); + break; + case DS3USB_SET_RUMBLE: + ds3usb_set_rumble(*(uint8_t *)(data + 1), *(uint8_t *)(data + 2), *(uint8_t *)data); + break; + case DS3USB_SET_LED: + ds3usb_set_led(*(uint8_t *)(data + 1), *(uint8_t *)data); + break; + case DS3USB_GET_DATA: + ds3usb_get_data((uint8_t *)data, 18, *(uint8_t *)data); + break; + case DS3USB_RESET: + ds3usb_reset(); + break; + default: + break; + } + + return data; +} + +int _start(int argc, char *argv[]) +{ + uint8_t enable = 0xFF; + + if (argc > 1) { + enable = argv[1][0]; + } + + ds3usb_init(enable); + + int ret = UsbRegisterDriver(&usb_driver); + + if (ret != USB_RC_OK) { + DPRINTF("DS3USB: Error registering USB devices\n"); + return MODULE_NO_RESIDENT_END; + } + + iop_thread_t rpc_th; + + rpc_th.attr = TH_C; + rpc_th.thread = rpc_thread; + rpc_th.priority = 40; + rpc_th.stacksize = 0x800; + rpc_th.option = 0; + + int thid = CreateThread(&rpc_th); + + if (thid > 0) { + StartThread(thid, NULL); + return MODULE_RESIDENT_END; + } + + return MODULE_NO_RESIDENT_END; +} diff --git a/modules/ds3usb/iop/ds3usb.h b/modules/ds3usb/iop/ds3usb.h new file mode 100644 index 000000000..ad056efe9 --- /dev/null +++ b/modules/ds3usb/iop/ds3usb.h @@ -0,0 +1,126 @@ +#ifndef _DS3USB_H_ +#define _DS3USB_H_ + +#include "types.h" +#include "usbd.h" + +typedef u8 uint8_t; +typedef u16 uint16_t; + +void mips_memcpy(void *, const void *, unsigned); +void mips_memset(void *, int, unsigned); + +enum eHID { + // {{{ + /* HID event flag */ + HID_FLAG_STATUS_REPORTED = 0x01, + HID_FLAG_BUTTONS_CHANGED = 0x02, + HID_FLAG_EXTENSION = 0x04, + HID_FLAG_COMMAND_SUCCESS = 0x08, + + /* USB HID Transaction Header (THdr) */ + HID_USB_GET_REPORT_FEATURE = 0x03, + HID_USB_SET_REPORT_OUTPUT = 0x02, + HID_USB_DATA_INPUT = 0x01, + + /* Defines of various parameters for PS3 Game controller reports */ + PS3_F4_REPORT_ID = 0xF4, + PS3_F4_REPORT_LEN = 0x04, + + PS3_01_REPORT_ID = 0x01, + PS3_01_REPORT_LEN = 0x30, + // }}} + + bmREQ_USB_OUT = (USB_DIR_OUT | + USB_TYPE_CLASS | + USB_RECIP_INTERFACE), + + bmREQ_USB_IN = (USB_DIR_IN | + USB_TYPE_CLASS | + USB_RECIP_INTERFACE), + +}; + + +enum eDS3USBLEDRumble { + psLEDN = 0x00, + psLED1 = 0x02, + psLED2 = 0x04, + psLED3 = 0x08, + psLED4 = 0x0F, + psLEDA = 0x10, +}; + +enum eDS3USBStatus { + DS3USB_STATE_DISCONNECTED = 0x00, + DS3USB_STATE_AUTHORIZED = 0x01, + DS3USB_STATE_CONFIGURED = 0x02, + DS3USB_STATE_CONNECTED = 0x04, + DS3USB_STATE_RUNNING = 0x08, +}; + +//Structure which describes the type 01 input report +enum TYPE_01_REPORT { + ButtonStateL = 0, // Main buttons Low + ButtonStateH, // Main buttons High + PSButtonState, // PS button + Reserved1, // Unknown + LeftStickX, // left Joystick X axis 0 - 255, 128 is mid + LeftStickY, // left Joystick Y axis 0 - 255, 128 is mid + RightStickX, // right Joystick X axis 0 - 255, 128 is mid + RightStickY, // right Joystick Y axis 0 - 255, 128 is mid + Reserved2, // Unknown + Reserved3, // Unknown + Reserved4, // Unknown + Reserved5, // Unknown + PressureUp, // digital Pad Up button Pressure 0 - 255 + PressureRight, // digital Pad Right button Pressure 0 - 255 + PressureDown, // digital Pad Down button Pressure 0 - 255 + PressureLeft, // digital Pad Left button Pressure 0 - 255 + PressureL2, // digital Pad L2 button Pressure 0 - 255 + PressureR2, // digital Pad R2 button Pressure 0 - 255 + PressureL1, // digital Pad L1 button Pressure 0 - 255 + PressureR1, // digital Pad R1 button Pressure 0 - 255 + PressureTriangle, // digital Pad Triangle button Pressure 0 - 255 + PressureCircle, // digital Pad Circle button Pressure 0 - 255 + PressureCross, // digital Pad Cross button Pressure 0 - 255 + PressureSquare, // digital Pad Square button Pressure 0 - 255 + Reserved6, // Unknown + Reserved7, // Unknown + Reserved8, // Unknown + Charge, // charging status ? 02 = charge, 03 = normal + Power, // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging + Connection, // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble + Reserved9, // Unknown + Reserved10, // Unknown + Reserved11, // Unknown + Reserved12, // Unknown + Reserved13, // Unknown + Reserved14, // Unknown + Reserved15, // Unknown + Reserved16, // Unknown + Reserved17, // Unknown + AccelXH, // X axis accelerometer Big Endian 0 - 1023 + AccelXL, // Low + AccelYH, // Y axis accelerometer Big Endian 0 - 1023 + AccelYL, // Low + AccelZH, // Z Accelerometer Big Endian 0 - 1023 + AccelZL, // Low + GyroZH, // Z axis Gyro Big Endian 0 - 1023 + GyroZL, // Low +}; + +enum eBUF_SIZE { + MAX_BUFFER_SIZE = 64, // Size of general purpose data buffer +}; + +void ds3usb_init(uint8_t pads); +int ds3usb_get_status(int port); +void ds3usb_reset(); +void ds3usb_get_data(char *dst, int size, int port); +void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port); +void ds3usb_set_led(uint8_t led, int port); +void ds3usb_get_bdaddr(uint8_t *data, int port); +void ds3usb_set_bdaddr(uint8_t *data, int port); + +#endif diff --git a/modules/ds3usb/iop/imports.lst b/modules/ds3usb/iop/imports.lst new file mode 100644 index 000000000..a33c04873 --- /dev/null +++ b/modules/ds3usb/iop/imports.lst @@ -0,0 +1,57 @@ + +#include "ioman_mod.h" + +sifcmd_IMPORTS_start +I_sceSifInitRpc +I_sceSifSetRpcQueue +I_sceSifRegisterRpc +I_sceSifRpcLoop +sifcmd_IMPORTS_end + +stdio_IMPORTS_start +I_printf +stdio_IMPORTS_end + +thsemap_IMPORTS_start +I_CreateSema +I_SignalSema +I_WaitSema +I_PollSema +I_DeleteSema +thsemap_IMPORTS_end + +thbase_IMPORTS_start +I_StartThread +I_CreateThread +I_DeleteThread +I_DelayThread +I_GetThreadId +thbase_IMPORTS_end + +intrman_IMPORTS_start +I_CpuSuspendIntr +I_CpuResumeIntr +intrman_IMPORTS_end + +sifman_IMPORTS_start +I_sceSifCheckInit +I_sceSifInit +I_sceSifSetDma +I_sceSifDmaStat +sifman_IMPORTS_end + +usbd_IMPORTS_start +I_UsbGetDeviceStaticDescriptor +I_UsbOpenEndpoint +I_UsbCloseEndpoint +I_UsbOpenEndpointAligned +I_UsbSetDevicePrivateData +I_UsbTransfer +I_UsbRegisterDriver +usbd_IMPORTS_end + +sysclib_IMPORTS_start +I_prnt +I_strncmp +I_strncpy +sysclib_IMPORTS_end diff --git a/modules/ds3usb/iop/irx_imports.h b/modules/ds3usb/iop/irx_imports.h new file mode 100644 index 000000000..d7fe695d6 --- /dev/null +++ b/modules/ds3usb/iop/irx_imports.h @@ -0,0 +1,37 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# $Id$ +# Defines all IRX imports. +*/ + +#ifndef IOP_IRX_IMPORTS_H +#define IOP_IRX_IMPORTS_H + +#include "irx.h" + +/* Please keep these in alphabetical order! */ +#include "dmacman.h" +#include "intrman.h" +#include "iomanX.h" +#include "libsd.h" +#include "loadcore.h" +#include "sifcmd.h" +#include "sifman.h" +#include "stdio.h" +#include "sysclib.h" +#include "sysmem.h" +#include "thbase.h" +#include "thevent.h" +#include "thmsgbx.h" +#include "thsemap.h" +#include "usbd.h" +#include "vblank.h" + +#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/hdd/apa/apa-opt.h b/modules/hdd/apa/apa-opt.h index db2868fd3..0d3855886 100644 --- a/modules/hdd/apa/apa-opt.h +++ b/modules/hdd/apa/apa-opt.h @@ -1,8 +1,8 @@ #ifndef _APA_OPT_H #define _APA_OPT_H -#define APA_PRINTF(format,...) printf(format, ##__VA_ARGS__) -#define APA_DRV_NAME "hdd" +#define APA_PRINTF(format, ...) printf(format, ##__VA_ARGS__) +#define APA_DRV_NAME "hdd" /* Define (in your Makefile!) to build an OSD version, which will: 1. When formatting, do not create any partitions other than __mbr. @@ -10,14 +10,14 @@ 3. All partitions can be accessed, even without the right password. 4. The starting LBA of the partition will be returned in the private_5 field of the stat structure (returned by getstat and dread). */ -//#define APA_OSD_VER 1 +#define APA_OSD_VER 1 #ifdef APA_OSD_VER -#define APA_STAT_RETURN_PART_LBA 1 -#define APA_FORMAT_LOCK_MBR 1 +#define APA_STAT_RETURN_PART_LBA 1 +#define APA_FORMAT_LOCK_MBR 1 #else -#define APA_ENABLE_PASSWORDS 1 -#define APA_FORMAT_MAKE_PARTITIONS 1 +#define APA_ENABLE_PASSWORDS 1 +#define APA_FORMAT_MAKE_PARTITIONS 1 #endif #endif diff --git a/modules/hdd/apa/hdd.c b/modules/hdd/apa/hdd.c index 65d7b69a1..820c93ccf 100644 --- a/modules/hdd/apa/hdd.c +++ b/modules/hdd/apa/hdd.c @@ -27,47 +27,46 @@ IRX_ID("hdd_driver", APA_MODVER_MAJOR, APA_MODVER_MINOR); -static iop_device_ops_t hddOps={ - hddInit, - hddDeinit, - hddFormat, - hddOpen, - hddClose, - hddRead, - hddWrite, - hddLseek, - (void*)hddUnsupported, - hddRemove, - (void*)hddUnsupported, - (void*)hddUnsupported, - hddDopen, - hddClose, - hddDread, - hddGetStat, - (void*)hddUnsupported, - hddReName, - (void*)hddUnsupported, - (void*)hddUnsupported, - (void*)hddUnsupported, - (void*)hddUnsupported, - (void*)hddUnsupported, - hddDevctl, - (void*)hddUnsupported, - (void*)hddUnsupported, - hddIoctl2, +static iop_device_ops_t hddOps = { + hddInit, + hddDeinit, + hddFormat, + hddOpen, + hddClose, + hddRead, + hddWrite, + hddLseek, + (void *)hddUnsupported, + hddRemove, + (void *)hddUnsupported, + (void *)hddUnsupported, + hddDopen, + hddClose, + hddDread, + hddGetStat, + (void *)hddUnsupported, + hddReName, + (void *)hddUnsupported, + (void *)hddUnsupported, + (void *)hddUnsupported, + (void *)hddUnsupported, + (void *)hddUnsupported, + hddDevctl, + (void *)hddUnsupported, + (void *)hddUnsupported, + hddIoctl2, }; -static iop_device_t hddFioDev={ - "hdd", - IOP_DT_BLOCK | IOP_DT_FSEXT, - 1, - "HDD", - (struct _iop_device_ops *)&hddOps, +static iop_device_t hddFioDev = { + "hdd", + IOP_DT_BLOCK | IOP_DT_FSEXT, + 1, + "HDD", + (struct _iop_device_ops *)&hddOps, }; -apa_device_t hddDevices[2]={ - {0, 0, 0, 3}, - {0, 0, 0, 3} -}; +apa_device_t hddDevices[2] = { + {0, 0, 0, 3}, + {0, 0, 0, 3}}; extern u32 apaMaxOpen; extern hdd_file_slot_t *hddFileSlots; @@ -77,190 +76,177 @@ static int unlockDrive(s32 device); int hddCheckPartitionMax(s32 device, u32 size) { - return (hddDevices[device].partitionMaxSize >= size) ? 0 : -EINVAL; + return (hddDevices[device].partitionMaxSize >= size) ? 0 : -EINVAL; } apa_cache_t *hddAddPartitionHere(s32 device, const apa_params_t *params, u32 *emptyBlocks, - u32 sector, int *err) + u32 sector, int *err) { - apa_cache_t *clink_this; - apa_cache_t *clink_next; - apa_cache_t *clink_new; - apa_header_t *header; - u32 i; - u32 tmp, some_size, part_end; - u32 tempSize; - - // walk empty blocks in case can use one :) - for(i=0;i< 32;i++) - { - if((1 << i) >= params->size && emptyBlocks[i]!=0) - return apaInsertPartition(device, params, emptyBlocks[i], err); - } - clink_this=apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err); - header=clink_this->header; - part_end=header->start+header->length; - some_size=(part_end%params->size); - tmp = some_size ? params->size - some_size : 0; - - if(hddDevices[device].totalLBA < (part_end + params->size + tmp) - //Non-SONY: when dealing with large disks, this check may overflow (therefore, check for overflows!). - || (part_end < sector)) - { - *err=-ENOSPC; - apaCacheFree(clink_this); - return NULL; - } - - if((clink_next=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, err))==NULL) - { - apaCacheFree(clink_this); - return NULL; - } - - tempSize=params->size; - while(part_end%params->size) - { - tempSize=params->size>>1; - while(0x3FFFFheader->start, tempSize); - clink_this->header->next=part_end; - clink_this->flags|=APA_CACHE_FLAG_DIRTY; - clink_next->header->prev=clink_new->header->start; - part_end+=tempSize; - clink_next->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink_this); - clink_this=clink_new; - break; - } - tempSize>>=1; - } - } - if((clink_new=apaFillHeader(device, params, part_end, 0, clink_this->header->start, - params->size, err))!=NULL) - { - clink_this->header->next=part_end; - clink_this->flags|=APA_CACHE_FLAG_DIRTY; - clink_next->header->prev=clink_new->header->start; - clink_next->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - } - apaCacheFree(clink_this); - apaCacheFree(clink_next); - return clink_new; + apa_cache_t *clink_this; + apa_cache_t *clink_next; + apa_cache_t *clink_new; + apa_header_t *header; + u32 i; + u32 tmp, some_size, part_end; + u32 tempSize; + + // walk empty blocks in case can use one :) + for (i = 0; i < 32; i++) { + if ((1 << i) >= params->size && emptyBlocks[i] != 0) + return apaInsertPartition(device, params, emptyBlocks[i], err); + } + clink_this = apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err); + header = clink_this->header; + part_end = header->start + header->length; + some_size = (part_end % params->size); + tmp = some_size ? params->size - some_size : 0; + + if (hddDevices[device].totalLBA < (part_end + params->size + tmp) + //Non-SONY: when dealing with large disks, this check may overflow (therefore, check for overflows!). + || (part_end < sector)) { + *err = -ENOSPC; + apaCacheFree(clink_this); + return NULL; + } + + if ((clink_next = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, err)) == NULL) { + apaCacheFree(clink_this); + return NULL; + } + + tempSize = params->size; + while (part_end % params->size) { + tempSize = params->size >> 1; + while (0x3FFFF < tempSize) { + if (!(part_end % tempSize)) { + clink_new = apaRemovePartition(device, part_end, 0, + clink_this->header->start, tempSize); + clink_this->header->next = part_end; + clink_this->flags |= APA_CACHE_FLAG_DIRTY; + clink_next->header->prev = clink_new->header->start; + part_end += tempSize; + clink_next->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + apaCacheFree(clink_this); + clink_this = clink_new; + break; + } + tempSize >>= 1; + } + } + if ((clink_new = apaFillHeader(device, params, part_end, 0, clink_this->header->start, + params->size, err)) != NULL) { + clink_this->header->next = part_end; + clink_this->flags |= APA_CACHE_FLAG_DIRTY; + clink_next->header->prev = clink_new->header->start; + clink_next->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + } + apaCacheFree(clink_this); + apaCacheFree(clink_next); + return clink_new; } static int inputError(char *input) { - APA_PRINTF(APA_DRV_NAME": Error: Usage: %s [-o ] [-n ]\n", input); - return 1; + APA_PRINTF(APA_DRV_NAME ": Error: Usage: %s [-o ] [-n ]\n", input); + return 1; } static void printStartup(void) { - APA_PRINTF(APA_DRV_NAME": PS2 APA Driver v%d.%d (c) 2003 Vector\n", APA_MODVER_MAJOR, APA_MODVER_MINOR); - return; + APA_PRINTF(APA_DRV_NAME ": PS2 APA Driver v%d.%d (c) 2003 Vector\n", APA_MODVER_MAJOR, APA_MODVER_MINOR); + return; } static int unlockDrive(s32 device) { - u8 id[32]; - int rv; - if((rv=apaGetIlinkID(id))==0) - return ata_device_sce_sec_unlock(device, id); - return rv; + u8 id[32]; + int rv; + if ((rv = apaGetIlinkID(id)) == 0) + return ata_device_sce_sec_unlock(device, id); + return rv; } int _start(int argc, char **argv) { - int i; - char *input; - int cacheSize=3; - apa_ps2time_t tm; - ata_devinfo_t *hddInfo; - - printStartup(); - - if((input=strrchr(argv[0], '/'))) - input++; - else - input=argv[0]; - - argc--; argv++; - while(argc) - { - if(argv[0][0] != '-') - break; - if(strcmp("-o", argv[0])==0) - { - argc--; argv++; - if(!argc) - return inputError(input); - i=strtol(argv[0], 0, 10); - if(i-1<32) - apaMaxOpen=i; - } - else if(strcmp("-n", argv[0])==0) - { - argc--; argv++; - if(!argc) - return inputError(input); - i=strtol(*argv, 0, 10); - if(cacheSizeexists!=0 && hddInfo->has_packet==0) - { - hddDevices[i].status--; - hddDevices[i].totalLBA=hddInfo->total_sectors; - hddDevices[i].partitionMaxSize=apaGetPartitionMax(hddInfo->total_sectors); - if(unlockDrive(i)==0) - hddDevices[i].status--; - APA_PRINTF(APA_DRV_NAME": disk%d: 0x%08lx sectors, max 0x%08lx\n", i, - hddDevices[i].totalLBA, hddDevices[i].partitionMaxSize); - } - } - hddFileSlots=apaAllocMem(apaMaxOpen*sizeof(hdd_file_slot_t)); - if(hddFileSlots) - memset(hddFileSlots, 0, apaMaxOpen*sizeof(hdd_file_slot_t)); - - apaCacheInit(cacheSize); - for(i=0;i < 2;i++) - { - if(hddDevices[i].status<2) - { - if(apaJournalRestore(i)!=0) - return 1; - if(apaGetFormat(i, &hddDevices[i].format)) - hddDevices[i].status--; - APA_PRINTF(APA_DRV_NAME": drive status %d, format version %08x\n", - hddDevices[i].status, hddDevices[i].format); - } - } - DelDrv("hdd"); - if(AddDrv(&hddFioDev)==0) - { - APA_PRINTF(APA_DRV_NAME": driver start.\n"); - return MODULE_RESIDENT_END; - } - return MODULE_NO_RESIDENT_END; + int i; + char *input; + int cacheSize = 3; + apa_ps2time_t tm; + ata_devinfo_t *hddInfo; + + printStartup(); + + if ((input = strrchr(argv[0], '/'))) + input++; + else + input = argv[0]; + + argc--; + argv++; + while (argc) { + if (argv[0][0] != '-') + break; + if (strcmp("-o", argv[0]) == 0) { + argc--; + argv++; + if (!argc) + return inputError(input); + i = strtol(argv[0], 0, 10); + if (i - 1 < 32) + apaMaxOpen = i; + } else if (strcmp("-n", argv[0]) == 0) { + argc--; + argv++; + if (!argc) + return inputError(input); + i = strtol(*argv, 0, 10); + if (cacheSize < i) + cacheSize = i; + } + argc--; + argv++; + } + + APA_PRINTF(APA_DRV_NAME ": max open = %ld, %d buffers\n", apaMaxOpen, cacheSize); + apaGetTime(&tm); + APA_PRINTF(APA_DRV_NAME ": %02d:%02d:%02d %02d/%02d/%d\n", + tm.hour, tm.min, tm.sec, tm.month, tm.day, tm.year); + for (i = 0; i < 2; i++) { + if (!(hddInfo = ata_get_devinfo(i))) { + APA_PRINTF(APA_DRV_NAME ": Error: ata initialization failed.\n"); + return 0; + } + if (hddInfo->exists != 0 && hddInfo->has_packet == 0) { + hddDevices[i].status--; + hddDevices[i].totalLBA = hddInfo->total_sectors; + hddDevices[i].partitionMaxSize = apaGetPartitionMax(hddInfo->total_sectors); + if (unlockDrive(i) == 0) + hddDevices[i].status--; + APA_PRINTF(APA_DRV_NAME ": disk%d: 0x%08lx sectors, max 0x%08lx\n", i, + hddDevices[i].totalLBA, hddDevices[i].partitionMaxSize); + } + } + hddFileSlots = apaAllocMem(apaMaxOpen * sizeof(hdd_file_slot_t)); + if (hddFileSlots) + memset(hddFileSlots, 0, apaMaxOpen * sizeof(hdd_file_slot_t)); + + apaCacheInit(cacheSize); + for (i = 0; i < 2; i++) { + if (hddDevices[i].status < 2) { + if (apaJournalRestore(i) != 0) + return 1; + if (apaGetFormat(i, &hddDevices[i].format)) + hddDevices[i].status--; + APA_PRINTF(APA_DRV_NAME ": drive status %d, format version %08x\n", + hddDevices[i].status, hddDevices[i].format); + } + } + DelDrv("hdd"); + if (AddDrv(&hddFioDev) == 0) { + APA_PRINTF(APA_DRV_NAME ": driver start.\n"); + return MODULE_RESIDENT_END; + } + return MODULE_NO_RESIDENT_END; } diff --git a/modules/hdd/apa/hdd.h b/modules/hdd/apa/hdd.h index e41db41c9..d30998727 100644 --- a/modules/hdd/apa/hdd.h +++ b/modules/hdd/apa/hdd.h @@ -15,12 +15,12 @@ typedef struct { - iop_file_t *f; // used to see if open... - u32 post; // offset/post.... - u16 nsub; - u16 type; - char id[APA_IDMAX]; - apa_sub_t parts[APA_MAXSUB+1]; // Partition data (0 = main partition, 1+ = sub-partition) + iop_file_t *f; // used to see if open... + u32 post; // offset/post.... + u16 nsub; + u16 type; + char id[APA_IDMAX]; + apa_sub_t parts[APA_MAXSUB + 1]; // Partition data (0 = main partition, 1+ = sub-partition) } hdd_file_slot_t; /////////////////////////////////////////////////////////////////////////////// diff --git a/modules/hdd/apa/hdd_fio.c b/modules/hdd/apa/hdd_fio.c index 09fb0a671..09a14d44f 100644 --- a/modules/hdd/apa/hdd_fio.c +++ b/modules/hdd/apa/hdd_fio.c @@ -27,23 +27,21 @@ #include "hdd.h" #include "hdd_fio.h" -hdd_file_slot_t *hddFileSlots; -int fioSema; -u32 apaMaxOpen=1; +hdd_file_slot_t *hddFileSlots; +int fioSema; +u32 apaMaxOpen = 1; extern const char apaMBRMagic[]; extern apa_device_t hddDevices[]; #ifdef APA_FORMAT_MAKE_PARTITIONS -static const char *formatPartList[]={ - "__net", "__system", "__sysconf", "__common", NULL -}; +static const char *formatPartList[] = { + "__net", "__system", "__sysconf", "__common", NULL}; #endif #define APA_NUMBER_OF_SIZES 9 -static const char *sizeList[APA_NUMBER_OF_SIZES]={ - "128M", "256M", "512M", "1G", "2G", "4G", "8G", "16G", "32G" -}; +static const char *sizeList[APA_NUMBER_OF_SIZES] = { + "128M", "256M", "512M", "1G", "2G", "4G", "8G", "16G", "32G"}; /////////////////////////////////////////////////////////////////////////////// // Function declarations @@ -59,595 +57,569 @@ static int devctlSwapTemp(s32 device, char *argp); static int fioPartitionSizeLookUp(char *str) { - int i; - - for(i=0;iid, APA_IDMAX))!=0) - return rv; - if(arg[0] == '\0') // Return if there are no further parameters. - return 0; - - if((rv=fioInputBreaker(&arg, params->fpwd, APA_PASSMAX))!=0) - return rv; - - if(params->fpwd[0] != '\0') - apaEncryptPassword(params->id, params->fpwd, params->fpwd); - - if(arg[0] == '\0') // Return if there are no further parameters. - return 0; - - if((rv=fioInputBreaker(&arg, params->rpwd, APA_PASSMAX))!=0) - return rv; - - if(params->rpwd[0] != '\0') - apaEncryptPassword(params->id, params->rpwd, params->rpwd); - - if(arg[0] == '\0') // Return if there are no further parameters. - return 0; - - memset(argBuf, 0, sizeof(argBuf)); - if((rv=fioInputBreaker(&arg, argBuf, sizeof(argBuf)))!=0) - return rv; - - if((rv=fioPartitionSizeLookUp(argBuf))<0) - return rv; - params->size=rv; - - memset(argBuf, 0, sizeof(argBuf)); - if((rv=fioInputBreaker(&arg, argBuf, sizeof(argBuf)))!=0) - return rv; - - for(i = 0; i < 4; i++) - { - if(!strcmp(argBuf, fsTypes[i].desc)) - { - params->type = fsTypes[i].type; - break; - } - } - - if(i == 4) - { - printf("hdd: error: Invalid fstype, %s.\n", argBuf); - return -EINVAL; - } - - return rv; + char argBuf[32]; + int rv = 0, i; + static const struct apaFsType fsTypes[] = { + {"PFS", APA_TYPE_PFS}, + {"CFS", APA_TYPE_CFS}, + {"EXT2", APA_TYPE_EXT2}, + {"EXT2SWAP", APA_TYPE_EXT2SWAP}}; + + if (params == NULL) + return -EINVAL; + memset(params, 0, sizeof(apa_params_t)); + + while (arg[0] == ' ') + arg++; + + if (arg[0] == 0 || arg[0] == ',') + return -EINVAL; + if ((rv = fioInputBreaker(&arg, params->id, APA_IDMAX)) != 0) + return rv; + if (arg[0] == '\0') // Return if there are no further parameters. + return 0; + + if ((rv = fioInputBreaker(&arg, params->fpwd, APA_PASSMAX)) != 0) + return rv; + + if (params->fpwd[0] != '\0') + apaEncryptPassword(params->id, params->fpwd, params->fpwd); + + if (arg[0] == '\0') // Return if there are no further parameters. + return 0; + + if ((rv = fioInputBreaker(&arg, params->rpwd, APA_PASSMAX)) != 0) + return rv; + + if (params->rpwd[0] != '\0') + apaEncryptPassword(params->id, params->rpwd, params->rpwd); + + if (arg[0] == '\0') // Return if there are no further parameters. + return 0; + + memset(argBuf, 0, sizeof(argBuf)); + if ((rv = fioInputBreaker(&arg, argBuf, sizeof(argBuf))) != 0) + return rv; + + if ((rv = fioPartitionSizeLookUp(argBuf)) < 0) + return rv; + params->size = rv; + + memset(argBuf, 0, sizeof(argBuf)); + if ((rv = fioInputBreaker(&arg, argBuf, sizeof(argBuf))) != 0) + return rv; + + for (i = 0; i < 4; i++) { + if (!strcmp(argBuf, fsTypes[i].desc)) { + params->type = fsTypes[i].type; + break; + } + } + + if (i == 4) { + printf("hdd: error: Invalid fstype, %s.\n", argBuf); + return -EINVAL; + } + + return rv; } static int getFileSlot(apa_params_t *params, hdd_file_slot_t **fileSlot) { - int i; - - for(i=0;iid, APA_IDMAX)==0) - return -EBUSY;// file is open - } - for(i=0;iid, APA_IDMAX) == 0) + return -EBUSY; // file is open + } + for (i = 0; i < apaMaxOpen; i++) { + if (!hddFileSlots[i].f) { + *fileSlot = &hddFileSlots[i]; + return 0; + } + } + return -EMFILE; // no file slots free :( } static int fioDataTransfer(iop_file_t *f, void *buf, int size, int mode) { - hdd_file_slot_t *fileSlot=(hdd_file_slot_t *)f->privdata; - - if((size & 0x1FF)) - return -EINVAL; - size>>=9; // size/512 - - if(fileSlot->post+size>=0x1FF9)// no over reading - size=0x1FF8-fileSlot->post; - - if(size!=0) { - int rv=0; - - WaitSema(fioSema); - if(ata_device_sector_io(f->unit, buf, fileSlot->post+fileSlot->parts[0].start+8, size, mode)) - rv=-EIO; - SignalSema(fioSema); - if(rv==0) - { - fileSlot->post+=size; - return size<<9; - } - - return rv; - } - return 0; + hdd_file_slot_t *fileSlot = (hdd_file_slot_t *)f->privdata; + + if ((size & 0x1FF)) + return -EINVAL; + size >>= 9; // size/512 + + if (fileSlot->post + size >= 0x1FF9) // no over reading + size = 0x1FF8 - fileSlot->post; + + if (size != 0) { + int rv = 0; + + WaitSema(fioSema); + if (ata_device_sector_io(f->unit, buf, fileSlot->post + fileSlot->parts[0].start + 8, size, mode)) + rv = -EIO; + SignalSema(fioSema); + if (rv == 0) { + fileSlot->post += size; + return size << 9; + } + + return rv; + } + return 0; } static int ioctl2Transfer(s32 device, hdd_file_slot_t *fileSlot, hddIoctl2Transfer_t *arg) { - if(fileSlot->nsubsub) - return -ENODEV; + if (fileSlot->nsub < arg->sub) + return -ENODEV; - // main partitions can only be read starting from the 4MB offset. - if(arg->sub==0 && (arg->sector < 0x2000)) - return -EINVAL; - // sub-partitions can only be read starting from after the header. - if(arg->sub!=0 && (arg->sector < 2)) - return -EINVAL; + // main partitions can only be read starting from the 4MB offset. + if (arg->sub == 0 && (arg->sector < 0x2000)) + return -EINVAL; + // sub-partitions can only be read starting from after the header. + if (arg->sub != 0 && (arg->sector < 2)) + return -EINVAL; - if(fileSlot->parts[arg->sub].lengthsector+arg->size) - return -ENXIO; + if (fileSlot->parts[arg->sub].length < arg->sector + arg->size) + return -ENXIO; - if(ata_device_sector_io(device, arg->buffer, - fileSlot->parts[arg->sub].start+arg->sector, arg->size, arg->mode)) - return -EIO; + if (ata_device_sector_io(device, arg->buffer, + fileSlot->parts[arg->sub].start + arg->sector, arg->size, arg->mode)) + return -EIO; - return 0; + return 0; } int hddInit(iop_device_t *f) { - iop_sema_t sema; + iop_sema_t sema; - sema.attr=1; - sema.initial=1; - sema.max=1; - sema.option=0; - fioSema=CreateSema(&sema); + sema.attr = 1; + sema.initial = 1; + sema.max = 1; + sema.option = 0; + fioSema = CreateSema(&sema); - return 0; + return 0; } int hddDeinit(iop_device_t *f) { - DeleteSema(fioSema); - return 0; + DeleteSema(fioSema); + return 0; } int hddFormat(iop_file_t *f, const char *dev, const char *blockdev, void *arg, int arglen) { - int rv=0; - apa_cache_t *clink; - u32 i; + int rv = 0; + apa_cache_t *clink; + u32 i; #ifdef APA_FORMAT_MAKE_PARTITIONS - apa_params_t params; - u32 emptyBlocks[32]; + apa_params_t params; + u32 emptyBlocks[32]; #endif - if(f->unit >= 2) - return -ENXIO; - - // clear all errors on hdd - clink=apaCacheAlloc(); - memset(clink->header, 0, sizeof(apa_header_t)); - if(ata_device_sector_io(f->unit, clink->header, APA_SECTOR_SECTOR_ERROR, 1, ATA_DIR_WRITE)){ - apaCacheFree(clink); - return -EIO; - } - if(ata_device_sector_io(f->unit, clink->header, APA_SECTOR_PART_ERROR, 1, ATA_DIR_WRITE)){ - apaCacheFree(clink); - return -EIO; - } - // clear apa headers - for(i=1024*8;iunit].totalLBA;i+=(1024*256)) - { - ata_device_sector_io(f->unit, clink->header, i, sizeof(apa_header_t)/512, - ATA_DIR_WRITE); - } - apaCacheFree(clink); - if((rv=apaJournalReset(f->unit))!=0) - return rv; - - // set up mbr :) - if((clink=apaCacheGetHeader(f->unit, 0, APA_IO_MODE_WRITE, &rv))){ - apa_header_t *header=clink->header; - memset(header, 0, sizeof(apa_header_t)); - header->magic=APA_MAGIC; - header->length=(1024*256); // 128MB - header->type=APA_TYPE_MBR; - strcpy(header->id,"__mbr"); + if (f->unit >= 2) + return -ENXIO; + + // clear all errors on hdd + clink = apaCacheAlloc(); + memset(clink->header, 0, sizeof(apa_header_t)); + if (ata_device_sector_io(f->unit, clink->header, APA_SECTOR_SECTOR_ERROR, 1, ATA_DIR_WRITE)) { + apaCacheFree(clink); + return -EIO; + } + if (ata_device_sector_io(f->unit, clink->header, APA_SECTOR_PART_ERROR, 1, ATA_DIR_WRITE)) { + apaCacheFree(clink); + return -EIO; + } + // clear apa headers + for (i = 1024 * 8; i < hddDevices[f->unit].totalLBA; i += (1024 * 256)) { + ata_device_sector_io(f->unit, clink->header, i, sizeof(apa_header_t) / 512, + ATA_DIR_WRITE); + } + apaCacheFree(clink); + if ((rv = apaJournalReset(f->unit)) != 0) + return rv; + + // set up mbr :) + if ((clink = apaCacheGetHeader(f->unit, 0, APA_IO_MODE_WRITE, &rv))) { + apa_header_t *header = clink->header; + memset(header, 0, sizeof(apa_header_t)); + header->magic = APA_MAGIC; + header->length = (1024 * 256); // 128MB + header->type = APA_TYPE_MBR; + strcpy(header->id, "__mbr"); #ifdef APA_FORMAT_LOCK_MBR - apaEncryptPassword(header->id, header->fpwd, "sce_mbr"); - apaEncryptPassword(header->id, header->rpwd, "sce_mbr"); + apaEncryptPassword(header->id, header->fpwd, "sce_mbr"); + apaEncryptPassword(header->id, header->rpwd, "sce_mbr"); #endif - memcpy(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic)); - - header->mbr.version=APA_MBR_VERSION; - header->mbr.nsector=0; - apaGetTime(&header->created); - apaGetTime(&header->mbr.created); - header->checksum=apaCheckSum(header); - clink->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushDirty(clink); - ata_device_flush_cache(f->unit); - apaCacheFree(clink); - hddDevices[f->unit].status=0; - hddDevices[f->unit].format=APA_MBR_VERSION; - } + memcpy(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic)); + + header->mbr.version = APA_MBR_VERSION; + header->mbr.nsector = 0; + apaGetTime(&header->created); + apaGetTime(&header->mbr.created); + header->checksum = apaCheckSum(header); + clink->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushDirty(clink); + ata_device_flush_cache(f->unit); + apaCacheFree(clink); + hddDevices[f->unit].status = 0; + hddDevices[f->unit].format = APA_MBR_VERSION; + } #ifdef APA_FORMAT_MAKE_PARTITIONS - memset(&emptyBlocks, 0, sizeof(emptyBlocks)); - memset(¶ms, 0, sizeof(apa_params_t)); - params.size=(1024*256); - params.type=APA_TYPE_PFS; - - // add __net, __system.... - for(i=0;formatPartList[i];i++) - { - memset(params.id, 0, APA_IDMAX); - strcpy(params.id, formatPartList[i]); - if(!(clink=hddAddPartitionHere(f->unit, ¶ms, emptyBlocks, i ? clink->sector : 0, &rv))) - return rv; - apaCacheFree(clink); - - params.size<<=1; - if(hddDevices[f->unit].partitionMaxSize < params.size) - params.size=hddDevices[f->unit].partitionMaxSize; - } + memset(&emptyBlocks, 0, sizeof(emptyBlocks)); + memset(¶ms, 0, sizeof(apa_params_t)); + params.size = (1024 * 256); + params.type = APA_TYPE_PFS; + + // add __net, __system.... + for (i = 0; formatPartList[i]; i++) { + memset(params.id, 0, APA_IDMAX); + strcpy(params.id, formatPartList[i]); + if (!(clink = hddAddPartitionHere(f->unit, ¶ms, emptyBlocks, i ? clink->sector : 0, &rv))) + return rv; + apaCacheFree(clink); + + params.size <<= 1; + if (hddDevices[f->unit].partitionMaxSize < params.size) + params.size = hddDevices[f->unit].partitionMaxSize; + } #endif - return rv; + return rv; } static int apaOpen(s32 device, hdd_file_slot_t *fileSlot, apa_params_t *params, int mode) { - int rv=0; - u32 emptyBlocks[32]; - apa_cache_t *clink; - apa_cache_t *clink2; - u32 sector=0; - - // walk all looking for any empty blocks & look for partition - clink=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv); - memset(&emptyBlocks, 0, sizeof(emptyBlocks)); - while(clink) - { - sector=clink->sector; - if(!(clink->header->flags & APA_FLAG_SUB)) { - if(memcmp(clink->header->id, params->id, APA_IDMAX) == 0) - break; // found :) - } - apaAddEmptyBlock(clink->header, emptyBlocks); - clink=apaGetNextHeader(clink, &rv); - } - - if(rv!=0) - return rv; - rv=-ENOENT; - - if(clink==NULL && (mode & O_CREAT)) - { - if((rv=hddCheckPartitionMax(device, params->size))>=0) { - if((clink=hddAddPartitionHere(device, params, emptyBlocks, sector, &rv))!=NULL) - { - sector=clink->header->start; - clink2=apaCacheAlloc(); - memset(clink2->header, 0, sizeof(apa_header_t)); - ata_device_sector_io(device, clink2->header, sector+8 , 2, ATA_DIR_WRITE); - ata_device_sector_io(device, clink2->header, sector+0x2000, 2, ATA_DIR_WRITE); - apaCacheFree(clink2); - } - } - } - if(clink==NULL) - return rv; - fileSlot->parts[0].start=clink->header->start; - fileSlot->parts[0].length=clink->header->length; - memcpy(&fileSlot->parts[1], &clink->header->subs, APA_MAXSUB*sizeof(apa_sub_t)); - fileSlot->type=clink->header->type; - fileSlot->nsub=clink->header->nsub; - memcpy(&fileSlot->id, &clink->header->id, APA_IDMAX); - apaCacheFree(clink); - if(apaPassCmp(clink->header->fpwd, params->fpwd)!=0) - { - rv = (!(mode & O_WRONLY)) ? apaPassCmp(clink->header->rpwd, params->rpwd) : -EACCES; - } else - rv = 0; - - return rv; + int rv = 0; + u32 emptyBlocks[32]; + apa_cache_t *clink; + apa_cache_t *clink2; + u32 sector = 0; + + // walk all looking for any empty blocks & look for partition + clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv); + memset(&emptyBlocks, 0, sizeof(emptyBlocks)); + while (clink) { + sector = clink->sector; + if (!(clink->header->flags & APA_FLAG_SUB)) { + if (memcmp(clink->header->id, params->id, APA_IDMAX) == 0) + break; // found :) + } + apaAddEmptyBlock(clink->header, emptyBlocks); + clink = apaGetNextHeader(clink, &rv); + } + + if (rv != 0) + return rv; + rv = -ENOENT; + + if (clink == NULL && (mode & O_CREAT)) { + if ((rv = hddCheckPartitionMax(device, params->size)) >= 0) { + if ((clink = hddAddPartitionHere(device, params, emptyBlocks, sector, &rv)) != NULL) { + sector = clink->header->start; + clink2 = apaCacheAlloc(); + memset(clink2->header, 0, sizeof(apa_header_t)); + ata_device_sector_io(device, clink2->header, sector + 8, 2, ATA_DIR_WRITE); + ata_device_sector_io(device, clink2->header, sector + 0x2000, 2, ATA_DIR_WRITE); + apaCacheFree(clink2); + } + } + } + if (clink == NULL) + return rv; + fileSlot->parts[0].start = clink->header->start; + fileSlot->parts[0].length = clink->header->length; + memcpy(&fileSlot->parts[1], &clink->header->subs, APA_MAXSUB * sizeof(apa_sub_t)); + fileSlot->type = clink->header->type; + fileSlot->nsub = clink->header->nsub; + memcpy(&fileSlot->id, &clink->header->id, APA_IDMAX); + apaCacheFree(clink); + if (apaPassCmp(clink->header->fpwd, params->fpwd) != 0) { + rv = (!(mode & O_WRONLY)) ? apaPassCmp(clink->header->rpwd, params->rpwd) : -EACCES; + } else + rv = 0; + + return rv; } static int apaRemove(s32 device, const char *id, const char *fpwd) { - u32 nsub, i; - apa_cache_t *clink; - apa_cache_t *clink2; - int rv; - - for(i=0;iheader->fpwd, fpwd)) - { - apaCacheFree(clink); - return -EACCES; - } - // remove all subs frist... - nsub=clink->header->nsub; - clink->header->nsub=0; - clink->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - for(i=nsub-1;i!=-1;i--) - { - if((clink2=apaCacheGetHeader(device, clink->header->subs[i].start, APA_IO_MODE_READ, &rv))){ - if((rv=apaDelete(clink2))){ - apaCacheFree(clink); - return rv; - } - } - } - if(rv==0) - return apaDelete(clink); - - apaCacheFree(clink); - return rv; + u32 nsub, i; + apa_cache_t *clink; + apa_cache_t *clink2; + int rv; + + for (i = 0; i < apaMaxOpen; i++) // look to see if open + { + if (hddFileSlots[i].f != 0) { + if (memcmp(hddFileSlots[i].id, id, APA_IDMAX) == 0) + return -EBUSY; + } + } + if (id[0] == '_' && id[1] == '_') + return -EACCES; + if ((clink = apaFindPartition(device, id, &rv)) == NULL) + return rv; + if (apaPassCmp(clink->header->fpwd, fpwd)) { + apaCacheFree(clink); + return -EACCES; + } + // remove all subs frist... + nsub = clink->header->nsub; + clink->header->nsub = 0; + clink->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + for (i = nsub - 1; i != -1; i--) { + if ((clink2 = apaCacheGetHeader(device, clink->header->subs[i].start, APA_IO_MODE_READ, &rv))) { + if ((rv = apaDelete(clink2))) { + apaCacheFree(clink); + return rv; + } + } + } + if (rv == 0) + return apaDelete(clink); + + apaCacheFree(clink); + return rv; } // Unofficial helper for renaming APA partitions. static int apaRename(s32 device, const apa_params_t *oldParams, const apa_params_t *newParams) { - apa_cache_t *clink; - int i, rv; - - // look to see if can make(newname) or not... - if((clink = apaFindPartition(device, newParams->id, &rv)) != NULL) - { - apaCacheFree(clink); - SignalSema(fioSema); - return -EEXIST; // File exists - } - - // look to see if open(oldname) - for(i=0;iid, APA_IDMAX)==0) - { - SignalSema(fioSema); - return -EBUSY; - } - } - } - - // Do not allow system partitions (__*) to be renamed. - if(oldParams->id[0]=='_' && oldParams->id[1]=='_') - return -EACCES; - - // find :) - if((clink = apaFindPartition(device, oldParams->id, &rv)) == NULL) - { - SignalSema(fioSema); - return rv; - } - - // Check for access rights. - if(apaPassCmp(clink->header->fpwd, oldParams->fpwd) != 0) - { - apaCacheFree(clink); - return -EACCES; - } - - // do the renaming :) note: subs have no names!! - memcpy(clink->header->id, newParams->id, APA_IDMAX); - - // Update passwords - memcpy(clink->header->rpwd, newParams->rpwd, APA_PASSMAX); - memcpy(clink->header->fpwd, newParams->fpwd, APA_PASSMAX); - - clink->flags|=APA_CACHE_FLAG_DIRTY; - - apaCacheFlushAllDirty(device); - apaCacheFree(clink); - - return 0; + apa_cache_t *clink; + int i, rv; + + // look to see if can make(newname) or not... + if ((clink = apaFindPartition(device, newParams->id, &rv)) != NULL) { + apaCacheFree(clink); + SignalSema(fioSema); + return -EEXIST; // File exists + } + + // look to see if open(oldname) + for (i = 0; i < apaMaxOpen; i++) { + if (hddFileSlots[i].f != NULL) { + if (memcmp(hddFileSlots[i].id, oldParams->id, APA_IDMAX) == 0) { + SignalSema(fioSema); + return -EBUSY; + } + } + } + + // Do not allow system partitions (__*) to be renamed. + if (oldParams->id[0] == '_' && oldParams->id[1] == '_') + return -EACCES; + + // find :) + if ((clink = apaFindPartition(device, oldParams->id, &rv)) == NULL) { + SignalSema(fioSema); + return rv; + } + + // Check for access rights. + if (apaPassCmp(clink->header->fpwd, oldParams->fpwd) != 0) { + apaCacheFree(clink); + return -EACCES; + } + + // do the renaming :) note: subs have no names!! + memcpy(clink->header->id, newParams->id, APA_IDMAX); + + // Update passwords + memcpy(clink->header->rpwd, newParams->rpwd, APA_PASSMAX); + memcpy(clink->header->fpwd, newParams->fpwd, APA_PASSMAX); + + clink->flags |= APA_CACHE_FLAG_DIRTY; + + apaCacheFlushAllDirty(device); + apaCacheFree(clink); + + return 0; } int hddRemove(iop_file_t *f, const char *name) { - int rv; - apa_params_t params; + int rv; + apa_params_t params; - if((rv=fioGetInput(name, ¶ms)) < 0) - return rv; + if ((rv = fioGetInput(name, ¶ms)) < 0) + return rv; - WaitSema(fioSema); - rv = apaRemove(f->unit, params.id, params.fpwd); - SignalSema(fioSema); + WaitSema(fioSema); + rv = apaRemove(f->unit, params.id, params.fpwd); + SignalSema(fioSema); - return rv; + return rv; } int hddOpen(iop_file_t *f, const char *name, int flags, int mode) { - int rv; - apa_params_t params; - hdd_file_slot_t *fileSlot; - - if(f->unit >= 2 || hddDevices[f->unit].status!=0) - return -ENODEV; - - if(!(f->mode & O_DIROPEN)) - if((rv=fioGetInput(name, ¶ms)) < 0) - return rv; - - WaitSema(fioSema); - if((rv=getFileSlot(¶ms, &fileSlot))==0) { - if(!(f->mode & O_DIROPEN)) { - if((rv=apaOpen(f->unit, fileSlot, ¶ms, flags))==0){ - fileSlot->f=f; - f->privdata=fileSlot; - } - } - else - { - fileSlot->f=f; - f->privdata=fileSlot; - } - } - SignalSema(fioSema); - return rv; + int rv; + apa_params_t params; + hdd_file_slot_t *fileSlot; + + if (f->unit >= 2 || hddDevices[f->unit].status != 0) + return -ENODEV; + + if (!(f->mode & O_DIROPEN)) + if ((rv = fioGetInput(name, ¶ms)) < 0) + return rv; + + WaitSema(fioSema); + if ((rv = getFileSlot(¶ms, &fileSlot)) == 0) { + if (!(f->mode & O_DIROPEN)) { + if ((rv = apaOpen(f->unit, fileSlot, ¶ms, flags)) == 0) { + fileSlot->f = f; + f->privdata = fileSlot; + } + } else { + fileSlot->f = f; + f->privdata = fileSlot; + } + } + SignalSema(fioSema); + return rv; } int hddClose(iop_file_t *f) { - WaitSema(fioSema); - memset(f->privdata, 0, sizeof(hdd_file_slot_t)); - SignalSema(fioSema); - return 0; + WaitSema(fioSema); + memset(f->privdata, 0, sizeof(hdd_file_slot_t)); + SignalSema(fioSema); + return 0; } int hddRead(iop_file_t *f, void *buf, int size) { - return fioDataTransfer(f, buf, size, ATA_DIR_READ); + return fioDataTransfer(f, buf, size, ATA_DIR_READ); } int hddWrite(iop_file_t *f, void *buf, int size) { - if(!(f->mode & O_WRONLY)) - return -EACCES; - return fioDataTransfer(f, buf, size, ATA_DIR_WRITE); + if (!(f->mode & O_WRONLY)) + return -EACCES; + return fioDataTransfer(f, buf, size, ATA_DIR_WRITE); } int hddLseek(iop_file_t *f, int post, int whence) { - int rv=0; - hdd_file_slot_t *fileSlot; - - // test input( no seeking to end point less :P ) - if(whence==SEEK_END) - return -EINVAL; - if((post & 0x1FF)) - return -EINVAL; - - post>>=9;// post/512 - - WaitSema(fioSema); - fileSlot=f->privdata; - if(whence==SEEK_CUR) - { - if((fileSlot->post+post) < 0 || (fileSlot->post+post)>=0x1FF9) - rv=-EINVAL; - else - { - fileSlot->post+=post; - rv=fileSlot->post<<9; - } - } - else if(whence==SEEK_SET) - { - if(post < 0 || post>=0x1FF9) - rv=-EINVAL; - else - { - fileSlot->post=post; - rv=fileSlot->post<<9; - } - - } - SignalSema(fioSema); - return rv; + int rv = 0; + hdd_file_slot_t *fileSlot; + + // test input( no seeking to end point less :P ) + if (whence == SEEK_END) + return -EINVAL; + if ((post & 0x1FF)) + return -EINVAL; + + post >>= 9; // post/512 + + WaitSema(fioSema); + fileSlot = f->privdata; + if (whence == SEEK_CUR) { + if ((fileSlot->post + post) < 0 || (fileSlot->post + post) >= 0x1FF9) + rv = -EINVAL; + else { + fileSlot->post += post; + rv = fileSlot->post << 9; + } + } else if (whence == SEEK_SET) { + if (post < 0 || post >= 0x1FF9) + rv = -EINVAL; + else { + fileSlot->post = post; + rv = fileSlot->post << 9; + } + } + SignalSema(fioSema); + return rv; } static void fioGetStatFiller(apa_cache_t *clink, iox_stat_t *stat) { - stat->mode=clink->header->type; - stat->attr=clink->header->flags; - stat->hisize=0; - stat->size=clink->header->length; - memcpy(&stat->ctime, &clink->header->created, sizeof(apa_ps2time_t)); - memcpy(&stat->atime, &clink->header->created, sizeof(apa_ps2time_t)); - memcpy(&stat->mtime, &clink->header->created, sizeof(apa_ps2time_t)); - if(clink->header->flags & APA_FLAG_SUB) - stat->private_0=clink->header->number; - else - stat->private_0=clink->header->nsub; - stat->private_1=0; - stat->private_2=0; - stat->private_3=0; - stat->private_4=0; + stat->mode = clink->header->type; + stat->attr = clink->header->flags; + stat->hisize = 0; + stat->size = clink->header->length; + memcpy(&stat->ctime, &clink->header->created, sizeof(apa_ps2time_t)); + memcpy(&stat->atime, &clink->header->created, sizeof(apa_ps2time_t)); + memcpy(&stat->mtime, &clink->header->created, sizeof(apa_ps2time_t)); + if (clink->header->flags & APA_FLAG_SUB) + stat->private_0 = clink->header->number; + else + stat->private_0 = clink->header->nsub; + stat->private_1 = 0; + stat->private_2 = 0; + stat->private_3 = 0; + stat->private_4 = 0; #ifndef APA_STAT_RETURN_PART_LBA - stat->private_5=0;// game ver + stat->private_5 = 0; // game ver #else - stat->private_5=clink->header->start;// SONY ver (return start LBA of the partition) + stat->private_5 = clink->header->start; // SONY ver (return start LBA of the partition) #endif } int hddGetStat(iop_file_t *f, const char *name, iox_stat_t *stat) { - apa_cache_t *clink; - apa_params_t params; - int rv; - - if((rv=fioGetInput(name, ¶ms))<0) - return rv; - - WaitSema(fioSema); - if((clink=apaFindPartition(f->unit, params.id, &rv))){ - if((rv=apaPassCmp(clink->header->fpwd, params.fpwd))==0 || (rv=apaPassCmp(clink->header->rpwd, params.rpwd))==0) - fioGetStatFiller(clink, stat); - apaCacheFree(clink); - } - SignalSema(fioSema); - return rv; + apa_cache_t *clink; + apa_params_t params; + int rv; + + if ((rv = fioGetInput(name, ¶ms)) < 0) + return rv; + + WaitSema(fioSema); + if ((clink = apaFindPartition(f->unit, params.id, &rv))) { + if ((rv = apaPassCmp(clink->header->fpwd, params.fpwd)) == 0 || (rv = apaPassCmp(clink->header->rpwd, params.rpwd)) == 0) + fioGetStatFiller(clink, stat); + apaCacheFree(clink); + } + SignalSema(fioSema); + return rv; } int hddDopen(iop_file_t *f, const char *name) @@ -657,51 +629,49 @@ int hddDopen(iop_file_t *f, const char *name) int hddDread(iop_file_t *f, iox_dirent_t *dirent) { - int rv; - hdd_file_slot_t *fileSlot=f->privdata; - apa_cache_t *clink; - - if(!(f->mode & O_DIROPEN)) - return -ENOTDIR; - - if(fileSlot->parts[0].start==-1) - return 0;// end :) - - WaitSema(fioSema); - if((clink=apaCacheGetHeader(f->unit, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv)) && - clink->header->length) - { - if(clink->header->flags & APA_FLAG_SUB) { - // if sub get id from main header... - apa_cache_t *cmain=apaCacheGetHeader(f->unit, clink->header->main, APA_IO_MODE_READ, &rv); - if(cmain!=NULL){ - /* This was the SONY original, which didn't do bounds-checking: + int rv; + hdd_file_slot_t *fileSlot = f->privdata; + apa_cache_t *clink; + + if (!(f->mode & O_DIROPEN)) + return -ENOTDIR; + + if (fileSlot->parts[0].start == -1) + return 0; // end :) + + WaitSema(fioSema); + if ((clink = apaCacheGetHeader(f->unit, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv)) && + clink->header->length) { + if (clink->header->flags & APA_FLAG_SUB) { + // if sub get id from main header... + apa_cache_t *cmain = apaCacheGetHeader(f->unit, clink->header->main, APA_IO_MODE_READ, &rv); + if (cmain != NULL) { + /* This was the SONY original, which didn't do bounds-checking: rv=strlen(cmain->header->id); strcpy(dirent->name, cmain->header->id); */ - strncpy(dirent->name, cmain->header->id, APA_IDMAX); - dirent->name[APA_IDMAX] = '\0'; - rv=strlen(dirent->name); - - apaCacheFree(cmain); - } - } - else { - /* This was the SONY original, which didn't do bounds-checking: + strncpy(dirent->name, cmain->header->id, APA_IDMAX); + dirent->name[APA_IDMAX] = '\0'; + rv = strlen(dirent->name); + + apaCacheFree(cmain); + } + } else { + /* This was the SONY original, which didn't do bounds-checking: rv=strlen(clink->header->id); strcpy(dirent->name, clink->header->id); */ - strncpy(dirent->name, clink->header->id, APA_IDMAX); - dirent->name[APA_IDMAX] = '\0'; - rv=strlen(dirent->name); - } - fioGetStatFiller(clink, &dirent->stat); - if(clink->header->next==0) - fileSlot->parts[0].start=-1; // mark end - else - fileSlot->parts[0].start=clink->header->next;// set next - apaCacheFree(clink); - } - SignalSema(fioSema); - return rv; + strncpy(dirent->name, clink->header->id, APA_IDMAX); + dirent->name[APA_IDMAX] = '\0'; + rv = strlen(dirent->name); + } + fioGetStatFiller(clink, &dirent->stat); + if (clink->header->next == 0) + fileSlot->parts[0].start = -1; // mark end + else + fileSlot->parts[0].start = clink->header->next; // set next + apaCacheFree(clink); + } + SignalSema(fioSema); + return rv; } /* Originally, SONY provided no function for renaming partitions. @@ -711,157 +681,158 @@ int hddDread(iop_file_t *f, iox_dirent_t *dirent) System partitions (__*) cannot be renamed. */ int hddReName(iop_file_t *f, const char *oldname, const char *newname) { - apa_params_t oldParams; - apa_params_t newParams; - int rv; + apa_params_t oldParams; + apa_params_t newParams; + int rv; - if((rv=fioGetInput(oldname, &oldParams))<0) - return rv; - if((rv=fioGetInput(newname, &newParams))<0) - return rv; + if ((rv = fioGetInput(oldname, &oldParams)) < 0) + return rv; + if ((rv = fioGetInput(newname, &newParams)) < 0) + return rv; - WaitSema(fioSema); - rv = apaRename(f->unit, &oldParams, &newParams); - SignalSema(fioSema); + WaitSema(fioSema); + rv = apaRename(f->unit, &oldParams, &newParams); + SignalSema(fioSema); - return rv; + return rv; } static int ioctl2AddSub(hdd_file_slot_t *fileSlot, char *argp) { - int rv; - u32 device=fileSlot->f->unit; - apa_params_t params; - u32 emptyBlocks[32]; - apa_cache_t *clink; - u32 sector=0; - u32 length; - - if(!(fileSlot->f->mode & O_WRONLY)) - return -EACCES; - - if(!(fileSlot->nsub < APA_MAXSUB)) - return -EFBIG; - - memset(¶ms, 0, sizeof(apa_params_t)); - - if((rv=fioPartitionSizeLookUp(argp)) < 0) - return rv; - - params.size=rv; - params.flags=APA_FLAG_SUB; - params.type=fileSlot->type; - params.main=fileSlot->parts[0].start; - params.number=fileSlot->nsub+1; - if((rv=hddCheckPartitionMax(device, params.size)) < 0) - return rv; - - // walk all looking for any empty blocks - memset(&emptyBlocks, 0, sizeof(emptyBlocks)); - clink=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv); - while(clink){ - sector=clink->sector; - apaAddEmptyBlock(clink->header, emptyBlocks); - clink=apaGetNextHeader(clink, &rv); - } - if(rv!=0) - return rv; - - if(!(clink=hddAddPartitionHere(device, ¶ms, emptyBlocks, sector, &rv))) - return rv; - - sector=clink->header->start; - length=clink->header->length; - apaCacheFree(clink); - if(!(clink=apaCacheGetHeader(device, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv))) - return rv; - - clink->header->subs[clink->header->nsub].start=sector; - clink->header->subs[clink->header->nsub].length=length; - clink->header->nsub++; - fileSlot->nsub++; - fileSlot->parts[fileSlot->nsub].start=sector; - fileSlot->parts[fileSlot->nsub].length=length; - clink->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink); - return rv; + int rv; + u32 device = fileSlot->f->unit; + apa_params_t params; + u32 emptyBlocks[32]; + apa_cache_t *clink; + u32 sector = 0; + u32 length; + + if (!(fileSlot->f->mode & O_WRONLY)) + return -EACCES; + + if (!(fileSlot->nsub < APA_MAXSUB)) + return -EFBIG; + + memset(¶ms, 0, sizeof(apa_params_t)); + + if ((rv = fioPartitionSizeLookUp(argp)) < 0) + return rv; + + params.size = rv; + params.flags = APA_FLAG_SUB; + params.type = fileSlot->type; + params.main = fileSlot->parts[0].start; + params.number = fileSlot->nsub + 1; + if ((rv = hddCheckPartitionMax(device, params.size)) < 0) + return rv; + + // walk all looking for any empty blocks + memset(&emptyBlocks, 0, sizeof(emptyBlocks)); + clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv); + while (clink) { + sector = clink->sector; + apaAddEmptyBlock(clink->header, emptyBlocks); + clink = apaGetNextHeader(clink, &rv); + } + if (rv != 0) + return rv; + + if (!(clink = hddAddPartitionHere(device, ¶ms, emptyBlocks, sector, &rv))) + return rv; + + sector = clink->header->start; + length = clink->header->length; + apaCacheFree(clink); + if (!(clink = apaCacheGetHeader(device, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv))) + return rv; + + clink->header->subs[clink->header->nsub].start = sector; + clink->header->subs[clink->header->nsub].length = length; + clink->header->nsub++; + fileSlot->nsub++; + fileSlot->parts[fileSlot->nsub].start = sector; + fileSlot->parts[fileSlot->nsub].length = length; + clink->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + apaCacheFree(clink); + return rv; } static int ioctl2DeleteLastSub(hdd_file_slot_t *fileSlot) { - int rv; - u32 device=fileSlot->f->unit; - apa_cache_t *mainPart; - apa_cache_t *subPart; - - if(!(fileSlot->f->mode & O_WRONLY)) - return -EACCES; - - if(fileSlot->nsub==0) - return -ENOENT; - - if(!(mainPart=apaCacheGetHeader(device, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv))) - return rv; - - if((subPart=apaCacheGetHeader(device, - mainPart->header->subs[mainPart->header->nsub-1].start, APA_IO_MODE_READ, &rv))) { - fileSlot->nsub--; - mainPart->header->nsub--; - mainPart->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - rv=apaDelete(subPart); - } - apaCacheFree(mainPart); - return rv; + int rv; + u32 device = fileSlot->f->unit; + apa_cache_t *mainPart; + apa_cache_t *subPart; + + if (!(fileSlot->f->mode & O_WRONLY)) + return -EACCES; + + if (fileSlot->nsub == 0) + return -ENOENT; + + if (!(mainPart = apaCacheGetHeader(device, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv))) + return rv; + + if ((subPart = apaCacheGetHeader(device, + mainPart->header->subs[mainPart->header->nsub - 1].start, APA_IO_MODE_READ, &rv))) { + fileSlot->nsub--; + mainPart->header->nsub--; + mainPart->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + rv = apaDelete(subPart); + } + apaCacheFree(mainPart); + return rv; } int hddIoctl2(iop_file_t *f, int req, void *argp, unsigned int arglen, - void *bufp, unsigned int buflen) + void *bufp, unsigned int buflen) { - u32 rv=0, err_lba; - hdd_file_slot_t *fileSlot=f->privdata; - - WaitSema(fioSema); - switch(req) - { - // cmd set 1 - case HIOCADDSUB: - rv=ioctl2AddSub(fileSlot, (char *)argp); - break; - - case HIOCDELSUB: - rv=ioctl2DeleteLastSub(fileSlot); - break; - - case HIOCNSUB: - rv=fileSlot->nsub; - break; - - case HIOCFLUSH: - ata_device_flush_cache(f->unit); - break; - - // cmd set 2 - case HIOCTRANSFER: - rv=ioctl2Transfer(f->unit, fileSlot, argp); - break; - - case HIOCGETSIZE: - rv=fileSlot->parts[*(u32 *)argp].length; - break; - - case HIOCSETPARTERROR: - apaSetPartErrorSector(f->unit, fileSlot->parts[0].start); rv=0; - break; - - case HIOCGETPARTERROR: - if((rv=apaGetPartErrorSector(f->unit, APA_SECTOR_PART_ERROR, &err_lba)) > 0) { - if(err_lba==fileSlot->parts[0].start) { - rv=0; apaSetPartErrorSector(f->unit, 0);// clear last error :) - } - } - break; + u32 rv = 0, err_lba; + hdd_file_slot_t *fileSlot = f->privdata; + + WaitSema(fioSema); + switch (req) { + // cmd set 1 + case HIOCADDSUB: + rv = ioctl2AddSub(fileSlot, (char *)argp); + break; + + case HIOCDELSUB: + rv = ioctl2DeleteLastSub(fileSlot); + break; + + case HIOCNSUB: + rv = fileSlot->nsub; + break; + + case HIOCFLUSH: + ata_device_flush_cache(f->unit); + break; + + // cmd set 2 + case HIOCTRANSFER: + rv = ioctl2Transfer(f->unit, fileSlot, argp); + break; + + case HIOCGETSIZE: + rv = fileSlot->parts[*(u32 *)argp].length; + break; + + case HIOCSETPARTERROR: + apaSetPartErrorSector(f->unit, fileSlot->parts[0].start); + rv = 0; + break; + + case HIOCGETPARTERROR: + if ((rv = apaGetPartErrorSector(f->unit, APA_SECTOR_PART_ERROR, &err_lba)) > 0) { + if (err_lba == fileSlot->parts[0].start) { + rv = 0; + apaSetPartErrorSector(f->unit, 0); // clear last error :) + } + } + break; //Custom IOCTL2 commands(s) for OPL case APA_IOCTL2_GETHEADER: @@ -870,158 +841,156 @@ int hddIoctl2(iop_file_t *f, int req, void *argp, unsigned int arglen, rv = sizeof(apa_header_t); break; - default: - rv=-EINVAL; - break; - } - SignalSema(fioSema); - return rv; + default: + rv = -EINVAL; + break; + } + SignalSema(fioSema); + return rv; } static int devctlSwapTemp(s32 device, char *argp) { - int rv; - apa_params_t params; - char szBuf[APA_IDMAX]; - apa_cache_t *partTemp; - apa_cache_t *partNew; - - - if((rv=fioGetInput(argp, ¶ms)) < 0) - return rv; - - if(params.id[0] == '_' && params.id[1] == '_')// test for '__' system partition - return -EINVAL; - - memset(szBuf, 0, APA_IDMAX); - strcpy(szBuf, "_tmp"); - if(!(partTemp=apaFindPartition(device, szBuf, &rv))) - return rv; - - if((partNew=apaFindPartition(device, params.id, &rv))) { - if((rv=apaPassCmp(partNew->header->fpwd, params.fpwd))==0) { - memcpy(partTemp->header->id, partNew->header->id, APA_IDMAX); - memcpy(partTemp->header->rpwd, partNew->header->rpwd, APA_PASSMAX); - memcpy(partTemp->header->fpwd, partNew->header->fpwd, APA_PASSMAX); - //memset(partNew->header->id, 0, 8);// BUG! can make it so can not open!! - memset(partNew->header->id, 0, APA_IDMAX); - strcpy(partNew->header->id, "_tmp"); - memset(partNew->header->rpwd, 0, APA_PASSMAX); - memset(partNew->header->fpwd, 0, APA_PASSMAX); - partTemp->flags|=APA_CACHE_FLAG_DIRTY; - partNew->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - } - apaCacheFree(partNew); - } - apaCacheFree(partTemp); - return rv; + int rv; + apa_params_t params; + char szBuf[APA_IDMAX]; + apa_cache_t *partTemp; + apa_cache_t *partNew; + + + if ((rv = fioGetInput(argp, ¶ms)) < 0) + return rv; + + if (params.id[0] == '_' && params.id[1] == '_') // test for '__' system partition + return -EINVAL; + + memset(szBuf, 0, APA_IDMAX); + strcpy(szBuf, "_tmp"); + if (!(partTemp = apaFindPartition(device, szBuf, &rv))) + return rv; + + if ((partNew = apaFindPartition(device, params.id, &rv))) { + if ((rv = apaPassCmp(partNew->header->fpwd, params.fpwd)) == 0) { + memcpy(partTemp->header->id, partNew->header->id, APA_IDMAX); + memcpy(partTemp->header->rpwd, partNew->header->rpwd, APA_PASSMAX); + memcpy(partTemp->header->fpwd, partNew->header->fpwd, APA_PASSMAX); + //memset(partNew->header->id, 0, 8);// BUG! can make it so can not open!! + memset(partNew->header->id, 0, APA_IDMAX); + strcpy(partNew->header->id, "_tmp"); + memset(partNew->header->rpwd, 0, APA_PASSMAX); + memset(partNew->header->fpwd, 0, APA_PASSMAX); + partTemp->flags |= APA_CACHE_FLAG_DIRTY; + partNew->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + } + apaCacheFree(partNew); + } + apaCacheFree(partTemp); + return rv; } static int devctlSetOsdMBR(s32 device, hddSetOsdMBR_t *mbrInfo) { - int rv; - apa_cache_t *clink; - - if(!(clink=apaCacheGetHeader(device, APA_SECTOR_MBR, APA_IO_MODE_READ, &rv))) - return rv; - - APA_PRINTF( APA_DRV_NAME": mbr start: %ld\n" - APA_DRV_NAME": mbr size : %ld\n", mbrInfo->start, mbrInfo->size); - clink->header->mbr.osdStart=mbrInfo->start; - clink->header->mbr.osdSize=mbrInfo->size; - clink->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink); - return rv; + int rv; + apa_cache_t *clink; + + if (!(clink = apaCacheGetHeader(device, APA_SECTOR_MBR, APA_IO_MODE_READ, &rv))) + return rv; + + APA_PRINTF(APA_DRV_NAME ": mbr start: %ld\n" APA_DRV_NAME ": mbr size : %ld\n", mbrInfo->start, mbrInfo->size); + clink->header->mbr.osdStart = mbrInfo->start; + clink->header->mbr.osdSize = mbrInfo->size; + clink->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + apaCacheFree(clink); + return rv; } int hddDevctl(iop_file_t *f, const char *devname, int cmd, void *arg, - unsigned int arglen, void *bufp, unsigned int buflen) + unsigned int arglen, void *bufp, unsigned int buflen) { - int rv=0; - - WaitSema(fioSema); - switch(cmd) - { - // Command set 1 ('H') - case HDIOC_DEV9OFF: - ata_device_smart_save_attr(f->unit); - dev9Shutdown(); - break; - - case HDIOC_IDLE: - rv=ata_device_idle(f->unit, *(char *)arg); - break; - - case HDIOC_MAXSECTOR: - rv=hddDevices[f->unit].partitionMaxSize; - break; - - case HDIOC_TOTALSECTOR: - rv=hddDevices[f->unit].totalLBA; - break; - - case HDIOC_FLUSH: - if(ata_device_flush_cache(f->unit)) - rv=-EIO; - break; - - case HDIOC_SWAPTMP: - rv=devctlSwapTemp(f->unit, (char *)arg); - break; - - case HDIOC_SMARTSTAT: - rv=ata_device_smart_get_status(f->unit); - break; - - case HDIOC_STATUS: - rv=hddDevices[f->unit].status; - break; - - case HDIOC_FORMATVER: - rv=hddDevices[f->unit].format; - break; - - case HDIOC_FREESECTOR: - rv=apaGetFreeSectors(f->unit, bufp, hddDevices); - break; - - case HDIOC_IDLEIMM: - rv=ata_device_idle_immediate(f->unit); - break; - - // Command set 2 ('h') - case HDIOC_GETTIME: - rv=apaGetTime((apa_ps2time_t *)bufp); - break; - - case HDIOC_SETOSDMBR: - rv=devctlSetOsdMBR(f->unit, (hddSetOsdMBR_t *)arg); - break; - - case HDIOC_GETSECTORERROR: - rv=apaGetPartErrorSector(f->unit, APA_SECTOR_SECTOR_ERROR, 0); - break; - - case HDIOC_GETERRORPARTNAME: - rv=apaGetPartErrorName(f->unit, (char *)bufp); - break; - - case HDIOC_READSECTOR: - rv=ata_device_sector_io(f->unit, (void *)bufp, ((hddAtaTransfer_t *)arg)->lba, - ((hddAtaTransfer_t *)arg)->size, ATA_DIR_READ); - break; - - case HDIOC_WRITESECTOR: - rv=ata_device_sector_io(f->unit, ((hddAtaTransfer_t *)arg)->data, - ((hddAtaTransfer_t *)arg)->lba, ((hddAtaTransfer_t *)arg)->size, - ATA_DIR_WRITE); - break; - - case HDIOC_SCEIDENTIFY: - rv=ata_device_sce_identify_drive(f->unit, (u16 *)bufp); - break; + int rv = 0; + + WaitSema(fioSema); + switch (cmd) { + // Command set 1 ('H') + case HDIOC_DEV9OFF: + ata_device_smart_save_attr(f->unit); + dev9Shutdown(); + break; + + case HDIOC_IDLE: + rv = ata_device_idle(f->unit, *(char *)arg); + break; + + case HDIOC_MAXSECTOR: + rv = hddDevices[f->unit].partitionMaxSize; + break; + + case HDIOC_TOTALSECTOR: + rv = hddDevices[f->unit].totalLBA; + break; + + case HDIOC_FLUSH: + if (ata_device_flush_cache(f->unit)) + rv = -EIO; + break; + + case HDIOC_SWAPTMP: + rv = devctlSwapTemp(f->unit, (char *)arg); + break; + + case HDIOC_SMARTSTAT: + rv = ata_device_smart_get_status(f->unit); + break; + + case HDIOC_STATUS: + rv = hddDevices[f->unit].status; + break; + + case HDIOC_FORMATVER: + rv = hddDevices[f->unit].format; + break; + + case HDIOC_FREESECTOR: + rv = apaGetFreeSectors(f->unit, bufp, hddDevices); + break; + + case HDIOC_IDLEIMM: + rv = ata_device_idle_immediate(f->unit); + break; + + // Command set 2 ('h') + case HDIOC_GETTIME: + rv = apaGetTime((apa_ps2time_t *)bufp); + break; + + case HDIOC_SETOSDMBR: + rv = devctlSetOsdMBR(f->unit, (hddSetOsdMBR_t *)arg); + break; + + case HDIOC_GETSECTORERROR: + rv = apaGetPartErrorSector(f->unit, APA_SECTOR_SECTOR_ERROR, 0); + break; + + case HDIOC_GETERRORPARTNAME: + rv = apaGetPartErrorName(f->unit, (char *)bufp); + break; + + case HDIOC_READSECTOR: + rv = ata_device_sector_io(f->unit, (void *)bufp, ((hddAtaTransfer_t *)arg)->lba, + ((hddAtaTransfer_t *)arg)->size, ATA_DIR_READ); + break; + + case HDIOC_WRITESECTOR: + rv = ata_device_sector_io(f->unit, ((hddAtaTransfer_t *)arg)->data, + ((hddAtaTransfer_t *)arg)->lba, ((hddAtaTransfer_t *)arg)->size, + ATA_DIR_WRITE); + break; + + case HDIOC_SCEIDENTIFY: + rv = ata_device_sce_identify_drive(f->unit, (u16 *)bufp); + break; //Custom DEVCTL command(s) for OPL case APA_DEVCTL_IS_48BIT: @@ -1037,13 +1006,13 @@ int hddDevctl(iop_file_t *f, const char *devname, int cmd, void *arg, ((hddAtaIOPTransfer_t *)arg)->lba, ((hddAtaIOPTransfer_t *)arg)->size, ATA_DIR_WRITE); - default: - rv=-EINVAL; - break; - } - SignalSema(fioSema); + default: + rv = -EINVAL; + break; + } + SignalSema(fioSema); - return rv; + return rv; } -int hddUnsupported(iop_file_t *f){return -1;} +int hddUnsupported(iop_file_t *f) { return -1; } diff --git a/modules/hdd/libapa/include/libapa.h b/modules/hdd/libapa/include/libapa.h index 59af75f9f..8c26ac579 100644 --- a/modules/hdd/libapa/include/libapa.h +++ b/modules/hdd/libapa/include/libapa.h @@ -12,96 +12,99 @@ #define _LIBAPA_H // Sectors for this and that ;) -#define APA_SECTOR_MBR 0 -#define APA_SECTOR_SECTOR_ERROR 6// use for last sector that had a error... -#define APA_SECTOR_PART_ERROR 7// use for last partition that had a error... -#define APA_SECTOR_APAL 8 -#define APA_SECTOR_APAL_HEADERS 10 // 10-262 +#define APA_SECTOR_MBR 0 +#define APA_SECTOR_SECTOR_ERROR 6 // use for last sector that had a error... +#define APA_SECTOR_PART_ERROR 7 // use for last partition that had a error... +#define APA_SECTOR_APAL 8 +#define APA_SECTOR_APAL_HEADERS 10 // 10-262 // APA Partition -#define APA_MAGIC 0x00415041 // 'APA\0' -#define APA_MBR_VERSION 2 - -#define APA_MODVER_MAJOR 2 -#define APA_MODVER_MINOR 1 -#define APA_MODVER ((APA_MODVER_MAJOR << 8) | APA_MODVER_MINOR) - -typedef struct { - u8 unused; - u8 sec; - u8 min; - u8 hour; - u8 day; - u8 month; - u16 year; +#define APA_MAGIC 0x00415041 // 'APA\0' +#define APA_MBR_VERSION 2 + +#define APA_MODVER_MAJOR 2 +#define APA_MODVER_MINOR 1 +#define APA_MODVER ((APA_MODVER_MAJOR << 8) | APA_MODVER_MINOR) + +typedef struct +{ + u8 unused; + u8 sec; + u8 min; + u8 hour; + u8 day; + u8 month; + u16 year; } apa_ps2time_t; // // MAIN APA defines/struct // -typedef struct { - u32 start; // Sector address - u32 length; // Sector count +typedef struct +{ + u32 start; // Sector address + u32 length; // Sector count } apa_sub_t; typedef struct { - u32 checksum; - u32 magic; // APA_MAGIC - u32 next; - u32 prev; - char id[APA_IDMAX]; - char rpwd[APA_PASSMAX]; - char fpwd[APA_PASSMAX]; - u32 start; - u32 length; - u16 type; - u16 flags; - u32 nsub; - apa_ps2time_t created; - u32 main; - u32 number; - u32 modver; - u32 pading1[7]; - char pading2[128]; - struct { - char magic[32]; - u32 version; - u32 nsector; - apa_ps2time_t created; - u32 osdStart; - u32 osdSize; - char pading3[200]; - } mbr; - apa_sub_t subs[APA_MAXSUB]; + u32 checksum; + u32 magic; // APA_MAGIC + u32 next; + u32 prev; + char id[APA_IDMAX]; + char rpwd[APA_PASSMAX]; + char fpwd[APA_PASSMAX]; + u32 start; + u32 length; + u16 type; + u16 flags; + u32 nsub; + apa_ps2time_t created; + u32 main; + u32 number; + u32 modver; + u32 pading1[7]; + char pading2[128]; + struct + { + char magic[32]; + u32 version; + u32 nsector; + apa_ps2time_t created; + u32 osdStart; + u32 osdSize; + char pading3[200]; + } mbr; + apa_sub_t subs[APA_MAXSUB]; } apa_header_t; #define APA_CACHE_FLAG_DIRTY 0x01 typedef struct sapa_cache { - struct sapa_cache *next; - struct sapa_cache *tail; - u16 flags; - u16 nused; - s32 device; - u32 sector; - union - { - apa_header_t *header; - u32 *error_lba; - }; + struct sapa_cache *next; + struct sapa_cache *tail; + u16 flags; + u16 nused; + s32 device; + u32 sector; + union + { + apa_header_t *header; + u32 *error_lba; + }; } apa_cache_t; typedef struct { - char id[APA_IDMAX]; - char fpwd[APA_PASSMAX]; - char rpwd[APA_PASSMAX]; - u32 size; - u16 type; - u16 flags; - u32 main; - u32 number; + char id[APA_IDMAX]; + char fpwd[APA_PASSMAX]; + char rpwd[APA_PASSMAX]; + u32 size; + u16 type; + u16 flags; + u32 main; + u32 number; } apa_params_t; void apaSaveError(s32 device, void *buffer, u32 lba, u32 err_lba); @@ -139,12 +142,12 @@ apa_cache_t *apaCacheAlloc(void); /////////////////////////////////////////////////////////////////////////////// -#define APAL_MAGIC 0x4150414C // 'APAL' +#define APAL_MAGIC 0x4150414C // 'APAL' typedef struct { - u32 magic; // APAL_MAGIC - s32 num; - u32 sectors[126]; + u32 magic; // APAL_MAGIC + s32 num; + u32 sectors[126]; } apa_journal_t; #define journalCheckSum(header) apaCheckSum((apa_header_t *)header) @@ -167,10 +170,10 @@ void apaEncryptPassword(const char *id, char *password_out, const char *password /////////////////////////////////////////////////////////////////////////////// typedef struct { - u32 totalLBA; - u32 partitionMaxSize; - int format; - int status; + u32 totalLBA; + u32 partitionMaxSize; + int format; + int status; } apa_device_t; int apaGetFreeSectors(s32 device, u32 *free, apa_device_t *deviceinfo); diff --git a/modules/hdd/libapa/src/apa.c b/modules/hdd/libapa/src/apa.c index d0a035697..4ccc3487a 100644 --- a/modules/hdd/libapa/src/apa.c +++ b/modules/hdd/libapa/src/apa.c @@ -20,476 +20,447 @@ #include "apa-opt.h" #include "libapa.h" -const char apaMBRMagic[]="Sony Computer Entertainment Inc."; +const char apaMBRMagic[] = "Sony Computer Entertainment Inc."; void apaSaveError(s32 device, void *buffer, u32 lba, u32 err_lba) { - memset(buffer, 0, 512); - *(u32 *)buffer=err_lba; - ata_device_sector_io(device, buffer, lba, 1, ATA_DIR_WRITE); - ata_device_flush_cache(device); + memset(buffer, 0, 512); + *(u32 *)buffer = err_lba; + ata_device_sector_io(device, buffer, lba, 1, ATA_DIR_WRITE); + ata_device_flush_cache(device); } void apaSetPartErrorSector(s32 device, u32 lba) -{// used to set the lba of a partition that has a error... - apa_cache_t *clink; - clink=apaCacheAlloc(); - apaSaveError(device, clink->header, APA_SECTOR_PART_ERROR, lba); - apaCacheFree(clink); +{ // used to set the lba of a partition that has a error... + apa_cache_t *clink; + clink = apaCacheAlloc(); + apaSaveError(device, clink->header, APA_SECTOR_PART_ERROR, lba); + apaCacheFree(clink); } int apaGetPartErrorSector(s32 device, u32 lba, u32 *lba_out) { - apa_cache_t *clink; - int rv=0; + apa_cache_t *clink; + int rv = 0; - if(!(clink=apaCacheAlloc())) - return -ENOMEM; + if (!(clink = apaCacheAlloc())) + return -ENOMEM; - if(ata_device_sector_io(device, clink->header, lba, 1, ATA_DIR_READ)) - return -EIO; + if (ata_device_sector_io(device, clink->header, lba, 1, ATA_DIR_READ)) + return -EIO; - if(lba_out) - *lba_out=*clink->error_lba; - if(*clink->error_lba) - rv=1;// error is set ;) - apaCacheFree(clink); - return rv; + if (lba_out) + *lba_out = *clink->error_lba; + if (*clink->error_lba) + rv = 1; // error is set ;) + apaCacheFree(clink); + return rv; } int apaGetPartErrorName(s32 device, char *name) { - u32 lba; - int rv=0; - apa_cache_t *clink; - - if((rv=apaGetPartErrorSector(device, APA_SECTOR_PART_ERROR, &lba)) <= 0) - return rv; - if(!(clink=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv))) - return rv; - - while(clink) - { - if(clink->header->type!=APA_TYPE_FREE && - !(clink->header->flags & APA_CACHE_FLAG_DIRTY) && - clink->header->start==lba) - { - if(name) - { - strncpy(name, clink->header->id, APA_IDMAX - 1); - name[APA_IDMAX - 1] = '\0'; - } - apaCacheFree(clink); - return 1; - } - clink=apaGetNextHeader(clink, &rv); - } - - // clear error if no errors and partitions was not found... - if(rv==0) - apaSetPartErrorSector(device, 0); - return rv; + u32 lba; + int rv = 0; + apa_cache_t *clink; + + if ((rv = apaGetPartErrorSector(device, APA_SECTOR_PART_ERROR, &lba)) <= 0) + return rv; + if (!(clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv))) + return rv; + + while (clink) { + if (clink->header->type != APA_TYPE_FREE && + !(clink->header->flags & APA_CACHE_FLAG_DIRTY) && + clink->header->start == lba) { + if (name) { + strncpy(name, clink->header->id, APA_IDMAX - 1); + name[APA_IDMAX - 1] = '\0'; + } + apaCacheFree(clink); + return 1; + } + clink = apaGetNextHeader(clink, &rv); + } + + // clear error if no errors and partitions was not found... + if (rv == 0) + apaSetPartErrorSector(device, 0); + return rv; } apa_cache_t *apaFillHeader(s32 device, const apa_params_t *params, u32 start, u32 next, - u32 prev, u32 length, int *err) -{ // used for making a new partition - apa_cache_t *clink; - - if(!(clink=apaCacheGetHeader(device, start, APA_IO_MODE_WRITE, err))) - return NULL; - memset(clink->header, 0, sizeof(apa_header_t)); - clink->header->magic=APA_MAGIC; - clink->header->start=start; - clink->header->next=next; - clink->header->prev=prev; - clink->header->length=length; - clink->header->type=params->type; - clink->header->flags=params->flags; - clink->header->modver=APA_MODVER; - memcpy(clink->header->id, params->id, APA_IDMAX); - if(params->flags & APA_FLAG_SUB) - { - clink->header->main=params->main; - clink->header->number=params->number; - } - else - { - if(strncmp(clink->header->id, "_tmp", APA_IDMAX)!=0) - { - memcpy(clink->header->rpwd, params->rpwd, APA_PASSMAX); - memcpy(clink->header->fpwd, params->fpwd, APA_PASSMAX); - } - } - apaGetTime(&clink->header->created); - clink->flags|=APA_CACHE_FLAG_DIRTY; - return clink; + u32 prev, u32 length, int *err) +{ // used for making a new partition + apa_cache_t *clink; + + if (!(clink = apaCacheGetHeader(device, start, APA_IO_MODE_WRITE, err))) + return NULL; + memset(clink->header, 0, sizeof(apa_header_t)); + clink->header->magic = APA_MAGIC; + clink->header->start = start; + clink->header->next = next; + clink->header->prev = prev; + clink->header->length = length; + clink->header->type = params->type; + clink->header->flags = params->flags; + clink->header->modver = APA_MODVER; + memcpy(clink->header->id, params->id, APA_IDMAX); + if (params->flags & APA_FLAG_SUB) { + clink->header->main = params->main; + clink->header->number = params->number; + } else { + if (strncmp(clink->header->id, "_tmp", APA_IDMAX) != 0) { + memcpy(clink->header->rpwd, params->rpwd, APA_PASSMAX); + memcpy(clink->header->fpwd, params->fpwd, APA_PASSMAX); + } + } + apaGetTime(&clink->header->created); + clink->flags |= APA_CACHE_FLAG_DIRTY; + return clink; } apa_cache_t *apaInsertPartition(s32 device, const apa_params_t *params, u32 sector, int *err) -{ // Adds a new partition using an empty block. - apa_cache_t *clink_empty; - apa_cache_t *clink_this; - apa_cache_t *clink_next; - - if((clink_this=apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err))==0) - return 0; - - while(clink_this->header->length!=params->size) - { - if((clink_next=apaCacheGetHeader(device, clink_this->header->next, APA_IO_MODE_READ, err))==NULL) - { // Get next partition - apaCacheFree(clink_this); - return 0; - } - clink_this->header->length>>=1; - clink_empty=apaRemovePartition(device, (clink_this->header->start+clink_this->header->length), - clink_this->header->next, clink_this->header->start, clink_this->header->length); - clink_this->header->next=clink_empty->header->start; - clink_this->flags|=APA_CACHE_FLAG_DIRTY; - clink_next->header->prev=clink_empty->header->start; - clink_next->flags|=APA_CACHE_FLAG_DIRTY; - - apaCacheFlushAllDirty(device); - apaCacheFree(clink_empty); - apaCacheFree(clink_next); - } - apaCacheFree(clink_this); - clink_this=apaFillHeader(device, params, clink_this->header->start, clink_this->header->next, - clink_this->header->prev, params->size, err); - apaCacheFlushAllDirty(device); - return clink_this; +{ // Adds a new partition using an empty block. + apa_cache_t *clink_empty; + apa_cache_t *clink_this; + apa_cache_t *clink_next; + + if ((clink_this = apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err)) == 0) + return 0; + + while (clink_this->header->length != params->size) { + if ((clink_next = apaCacheGetHeader(device, clink_this->header->next, APA_IO_MODE_READ, err)) == NULL) { // Get next partition + apaCacheFree(clink_this); + return 0; + } + clink_this->header->length >>= 1; + clink_empty = apaRemovePartition(device, (clink_this->header->start + clink_this->header->length), + clink_this->header->next, clink_this->header->start, clink_this->header->length); + clink_this->header->next = clink_empty->header->start; + clink_this->flags |= APA_CACHE_FLAG_DIRTY; + clink_next->header->prev = clink_empty->header->start; + clink_next->flags |= APA_CACHE_FLAG_DIRTY; + + apaCacheFlushAllDirty(device); + apaCacheFree(clink_empty); + apaCacheFree(clink_next); + } + apaCacheFree(clink_this); + clink_this = apaFillHeader(device, params, clink_this->header->start, clink_this->header->next, + clink_this->header->prev, params->size, err); + apaCacheFlushAllDirty(device); + return clink_this; } apa_cache_t *apaFindPartition(s32 device, const char *id, int *err) { - apa_cache_t *clink; - - clink=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, err); - while(clink) - { - if(!(clink->header->flags & APA_FLAG_SUB)) { - if(memcmp(clink->header->id, id, APA_IDMAX)==0) - return clink; // found - } - clink=apaGetNextHeader(clink, (int *)err); - } - if(*err==0) { - *err=-ENOENT; - return NULL; - //return (apa_cache_t *)-ENOENT; // <-- BUG code tests for NULL only - } - *err=0; - return NULL; + apa_cache_t *clink; + + clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, err); + while (clink) { + if (!(clink->header->flags & APA_FLAG_SUB)) { + if (memcmp(clink->header->id, id, APA_IDMAX) == 0) + return clink; // found + } + clink = apaGetNextHeader(clink, (int *)err); + } + if (*err == 0) { + *err = -ENOENT; + return NULL; + //return (apa_cache_t *)-ENOENT; // <-- BUG code tests for NULL only + } + *err = 0; + return NULL; } void apaAddEmptyBlock(apa_header_t *header, u32 *emptyBlocks) -{ // small helper.... to track empty blocks.. - u32 i; - - if(header->type==APA_TYPE_FREE) { - for(i=0;i<32;i++) - { - if(header->length==(1 << i)) { - if(emptyBlocks[i]==APA_TYPE_FREE) { - emptyBlocks[i]=header->start; - return; - } - } - } - } +{ // small helper.... to track empty blocks.. + u32 i; + + if (header->type == APA_TYPE_FREE) { + for (i = 0; i < 32; i++) { + if (header->length == (1 << i)) { + if (emptyBlocks[i] == APA_TYPE_FREE) { + emptyBlocks[i] = header->start; + return; + } + } + } + } } apa_cache_t *apaRemovePartition(s32 device, u32 start, u32 next, u32 prev, - u32 length) + u32 length) { - apa_cache_t *clink; - int err; - - if((clink=apaCacheGetHeader(device, start, APA_IO_MODE_WRITE, &err))==NULL) - return NULL; - memset(clink->header, 0, sizeof(apa_header_t)); - clink->header->magic=APA_MAGIC; - clink->header->start=start; - clink->header->next=next; - clink->header->prev=prev; - clink->header->length=length; - strcpy(clink->header->id, "__empty"); - apaGetTime(&clink->header->created); - clink->flags|=APA_CACHE_FLAG_DIRTY; - return clink; + apa_cache_t *clink; + int err; + + if ((clink = apaCacheGetHeader(device, start, APA_IO_MODE_WRITE, &err)) == NULL) + return NULL; + memset(clink->header, 0, sizeof(apa_header_t)); + clink->header->magic = APA_MAGIC; + clink->header->start = start; + clink->header->next = next; + clink->header->prev = prev; + clink->header->length = length; + strcpy(clink->header->id, "__empty"); + apaGetTime(&clink->header->created); + clink->flags |= APA_CACHE_FLAG_DIRTY; + return clink; } void apaMakeEmpty(apa_cache_t *clink) { - u32 saved_start; - u32 saved_next; - u32 saved_prev; - u32 saved_length; - - saved_start = clink->header->start; - saved_next = clink->header->next; - saved_prev = clink->header->prev; - saved_length = clink->header->length; - memset(clink->header, 0, sizeof(apa_header_t)); - clink->header->magic = APA_MAGIC; - clink->header->start = saved_start; - clink->header->next = saved_next; - clink->header->prev = saved_prev; - clink->header->length = saved_length; - apaGetTime(&clink->header->created); - strcpy(clink->header->id, "__empty"); - clink->flags|=APA_CACHE_FLAG_DIRTY; + u32 saved_start; + u32 saved_next; + u32 saved_prev; + u32 saved_length; + + saved_start = clink->header->start; + saved_next = clink->header->next; + saved_prev = clink->header->prev; + saved_length = clink->header->length; + memset(clink->header, 0, sizeof(apa_header_t)); + clink->header->magic = APA_MAGIC; + clink->header->start = saved_start; + clink->header->next = saved_next; + clink->header->prev = saved_prev; + clink->header->length = saved_length; + apaGetTime(&clink->header->created); + strcpy(clink->header->id, "__empty"); + clink->flags |= APA_CACHE_FLAG_DIRTY; } apa_cache_t *apaDeleteFixPrev(apa_cache_t *clink, int *err) { - apa_cache_t *clink2=clink; - apa_header_t *header=clink2->header; - u32 device=clink->device; - u32 length=clink->header->length; - u32 saved_next=clink->header->next; - u32 saved_length=clink->header->length; - u32 tmp; - - while(header->start) - { - if(!(clink2=apaCacheGetHeader(device, header->prev, APA_IO_MODE_READ, err))) - { - apaCacheFree(clink); - return NULL; - } - header=clink2->header; - tmp=header->length+length; - if(header->type!=0) { - apaCacheFree(clink2); - break; - } - if((header->start%tmp) || (tmp & (tmp-1))) { - apaCacheFree(clink2); - break; - } - length=tmp; - apaCacheFree(clink); - clink=clink2; - } - if(length!=saved_length) - { - if(!(clink2=apaCacheGetHeader(device, saved_next, APA_IO_MODE_READ, err))) - { - apaCacheFree(clink); - return NULL; - } - clink->header->length=length; - clink->header->next=clink->header->start+length; - clink2->header->prev=clink->header->start; - clink2->flags|=APA_CACHE_FLAG_DIRTY; - clink->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink2); - } - return clink; + apa_cache_t *clink2 = clink; + apa_header_t *header = clink2->header; + u32 device = clink->device; + u32 length = clink->header->length; + u32 saved_next = clink->header->next; + u32 saved_length = clink->header->length; + u32 tmp; + + while (header->start) { + if (!(clink2 = apaCacheGetHeader(device, header->prev, APA_IO_MODE_READ, err))) { + apaCacheFree(clink); + return NULL; + } + header = clink2->header; + tmp = header->length + length; + if (header->type != 0) { + apaCacheFree(clink2); + break; + } + if ((header->start % tmp) || (tmp & (tmp - 1))) { + apaCacheFree(clink2); + break; + } + length = tmp; + apaCacheFree(clink); + clink = clink2; + } + if (length != saved_length) { + if (!(clink2 = apaCacheGetHeader(device, saved_next, APA_IO_MODE_READ, err))) { + apaCacheFree(clink); + return NULL; + } + clink->header->length = length; + clink->header->next = clink->header->start + length; + clink2->header->prev = clink->header->start; + clink2->flags |= APA_CACHE_FLAG_DIRTY; + clink->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + apaCacheFree(clink2); + } + return clink; } apa_cache_t *apaDeleteFixNext(apa_cache_t *clink, int *err) { - apa_header_t *header=clink->header; - u32 length=header->length; - u32 saved_length=header->length; - u32 lnext=header->next; - apa_cache_t *clink1; - apa_cache_t *clink2; - u32 device=clink->device; - u32 tmp; - - while(lnext!=0) - { - if(!(clink1=apaCacheGetHeader(device, lnext, APA_IO_MODE_READ, err))) - { - apaCacheFree(clink); - return 0; - } - header=clink1->header; - tmp=header->length+length; - if(header->type!=0) - { - apaCacheFree(clink1); - break; - } - if((clink->header->start%tmp)!=0 || ((tmp-1) & tmp)) - { - apaCacheFree(clink1); - break; - } - length=tmp; - apaCacheFree(clink1); - lnext=header->next; - } - if(length!=saved_length) - { - if(!(clink2=apaCacheGetHeader(device, lnext, APA_IO_MODE_READ, err))) - { - apaCacheFree(clink); - return NULL; - } - clink->header->length=length; - clink->header->next=lnext; - apaMakeEmpty(clink); - clink2->header->prev=clink->header->start; - clink2->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink2); - } - return clink; + apa_header_t *header = clink->header; + u32 length = header->length; + u32 saved_length = header->length; + u32 lnext = header->next; + apa_cache_t *clink1; + apa_cache_t *clink2; + u32 device = clink->device; + u32 tmp; + + while (lnext != 0) { + if (!(clink1 = apaCacheGetHeader(device, lnext, APA_IO_MODE_READ, err))) { + apaCacheFree(clink); + return 0; + } + header = clink1->header; + tmp = header->length + length; + if (header->type != 0) { + apaCacheFree(clink1); + break; + } + if ((clink->header->start % tmp) != 0 || ((tmp - 1) & tmp)) { + apaCacheFree(clink1); + break; + } + length = tmp; + apaCacheFree(clink1); + lnext = header->next; + } + if (length != saved_length) { + if (!(clink2 = apaCacheGetHeader(device, lnext, APA_IO_MODE_READ, err))) { + apaCacheFree(clink); + return NULL; + } + clink->header->length = length; + clink->header->next = lnext; + apaMakeEmpty(clink); + clink2->header->prev = clink->header->start; + clink2->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + apaCacheFree(clink2); + } + return clink; } int apaDelete(apa_cache_t *clink) { - int rv=0; - apa_cache_t *clink_mbr; - u32 device=clink->device; - u32 start=clink->header->start; - int i; - - if(!start) { - apaCacheFree(clink); - return -EACCES; - } - - if(clink->header->next==0) - { - if((clink_mbr=apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv))==NULL) - { - apaCacheFree(clink); - return rv; - } - do { - apaCacheFree(clink); - if((clink=apaCacheGetHeader(clink->device, clink->header->prev, APA_IO_MODE_READ, &rv))==NULL) - return 0; - clink->header->next=0; - clink->flags|=APA_CACHE_FLAG_DIRTY; - clink_mbr->header->prev=clink->header->start; - clink_mbr->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - } while(clink->header->type==0); - apaCacheFree(clink_mbr); - } else { - u32 length=clink->header->length; - - for(i=0;i < 2;i++){ - if((clink=apaDeleteFixPrev(clink, &rv))==NULL) - return 0; - if((clink=apaDeleteFixNext(clink, &rv))==NULL) - return 0; - } - if(clink->header->start==start && clink->header->length==length) - { - apaMakeEmpty(clink); - apaCacheFlushAllDirty(clink->device); - } - } - apaCacheFree(clink); - return rv; + int rv = 0; + apa_cache_t *clink_mbr; + u32 device = clink->device; + u32 start = clink->header->start; + int i; + + if (!start) { + apaCacheFree(clink); + return -EACCES; + } + + if (clink->header->next == 0) { + if ((clink_mbr = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv)) == NULL) { + apaCacheFree(clink); + return rv; + } + do { + apaCacheFree(clink); + if ((clink = apaCacheGetHeader(clink->device, clink->header->prev, APA_IO_MODE_READ, &rv)) == NULL) + return 0; + clink->header->next = 0; + clink->flags |= APA_CACHE_FLAG_DIRTY; + clink_mbr->header->prev = clink->header->start; + clink_mbr->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(device); + } while (clink->header->type == 0); + apaCacheFree(clink_mbr); + } else { + u32 length = clink->header->length; + + for (i = 0; i < 2; i++) { + if ((clink = apaDeleteFixPrev(clink, &rv)) == NULL) + return 0; + if ((clink = apaDeleteFixNext(clink, &rv)) == NULL) + return 0; + } + if (clink->header->start == start && clink->header->length == length) { + apaMakeEmpty(clink); + apaCacheFlushAllDirty(clink->device); + } + } + apaCacheFree(clink); + return rv; } int apaCheckSum(apa_header_t *header) { - u32 *ptr=(u32 *)header; - u32 sum, i; + u32 *ptr = (u32 *)header; + u32 sum, i; - for(sum=0,i=1; i < 256; i++) //sizeof(header)/4 = 256, start at offset +4 to omit the checksum field. - sum+=ptr[i]; - return sum; + for (sum = 0, i = 1; i < 256; i++) //sizeof(header)/4 = 256, start at offset +4 to omit the checksum field. + sum += ptr[i]; + return sum; } int apaReadHeader(s32 device, apa_header_t *header, u32 lba) { - if(ata_device_sector_io(device, header, lba, 2, ATA_DIR_READ)!=0) - return -EIO; - if(header->magic!=APA_MAGIC) - return -EIO; - if(apaCheckSum(header)!=header->checksum) - return -EIO; - if(lba==APA_SECTOR_MBR) - { - if(strncmp(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic))==0) - return 0; - APA_PRINTF(APA_DRV_NAME": error: invalid partition table or version newer than I know.\n"); - return -EIO; - } - return 0; + if (ata_device_sector_io(device, header, lba, 2, ATA_DIR_READ) != 0) + return -EIO; + if (header->magic != APA_MAGIC) + return -EIO; + if (apaCheckSum(header) != header->checksum) + return -EIO; + if (lba == APA_SECTOR_MBR) { + if (strncmp(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic)) == 0) + return 0; + APA_PRINTF(APA_DRV_NAME ": error: invalid partition table or version newer than I know.\n"); + return -EIO; + } + return 0; } int apaWriteHeader(s32 device, apa_header_t *header, u32 lba) { - if(ata_device_sector_io(device, header, lba, 2, ATA_DIR_WRITE)) - return -EIO; - return 0; + if (ata_device_sector_io(device, header, lba, 2, ATA_DIR_WRITE)) + return -EIO; + return 0; } int apaGetFormat(s32 device, int *format) { - apa_cache_t *clink; - int rv=0; - u32 *pDW, i; - - clink=apaCacheAlloc(); - *format=0; - if((rv=apaReadHeader(device, clink->header, 0))==0) - { - *format=clink->header->mbr.version; - if(ata_device_sector_io(device, clink->header, APA_SECTOR_SECTOR_ERROR, 2, ATA_DIR_READ)) - rv=-EIO; // return -EIO; - if(rv==0){ - pDW=(u32 *)clink->header; - for(i=0;i < 256; i++) - { - if((i & 0x7F) && pDW[i]!=0) - rv=1; - } - } - } - apaCacheFree(clink); - return rv==0; + apa_cache_t *clink; + int rv = 0; + u32 *pDW, i; + + clink = apaCacheAlloc(); + *format = 0; + if ((rv = apaReadHeader(device, clink->header, 0)) == 0) { + *format = clink->header->mbr.version; + if (ata_device_sector_io(device, clink->header, APA_SECTOR_SECTOR_ERROR, 2, ATA_DIR_READ)) + rv = -EIO; // return -EIO; + if (rv == 0) { + pDW = (u32 *)clink->header; + for (i = 0; i < 256; i++) { + if ((i & 0x7F) && pDW[i] != 0) + rv = 1; + } + } + } + apaCacheFree(clink); + return rv == 0; } u32 apaGetPartitionMax(u32 totalLBA) { - u32 i, size; - - totalLBA>>=6; // totalLBA/64 - size=(1<<0x1F); - for(i=31;i!=0;i--) - { - size=1<>= 6; // totalLBA/64 + size = (1 << 0x1F); + for (i = 31; i != 0; i--) { + size = 1 << i; + if (size & totalLBA) + break; + } + if (size < totalLBA) + i++; + return (1 << i); } apa_cache_t *apaGetNextHeader(apa_cache_t *clink, int *err) { - u32 start=clink->header->start; - - apaCacheFree(clink); - if(!clink->header->next) - return NULL; - - if(!(clink=apaCacheGetHeader(clink->device, clink->header->next, APA_IO_MODE_READ, err))) - return NULL; - - if(start!=clink->header->prev) { - APA_PRINTF(APA_DRV_NAME": Warning: Invalid partition information. start != prev\n"); - clink->header->prev=start; - clink->flags|=APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(clink->device); - } - return clink; - + u32 start = clink->header->start; + + apaCacheFree(clink); + if (!clink->header->next) + return NULL; + + if (!(clink = apaCacheGetHeader(clink->device, clink->header->next, APA_IO_MODE_READ, err))) + return NULL; + + if (start != clink->header->prev) { + APA_PRINTF(APA_DRV_NAME ": Warning: Invalid partition information. start != prev\n"); + clink->header->prev = start; + clink->flags |= APA_CACHE_FLAG_DIRTY; + apaCacheFlushAllDirty(clink->device); + } + return clink; } diff --git a/modules/hdd/libapa/src/cache.c b/modules/hdd/libapa/src/cache.c index 267281dbc..ab2856eb3 100644 --- a/modules/hdd/libapa/src/cache.c +++ b/modules/hdd/libapa/src/cache.c @@ -25,171 +25,165 @@ static int cacheSize; int apaCacheInit(u32 size) { - apa_header_t *header; - int i; - - cacheSize=size; // save size ;) - if((header=(apa_header_t *)apaAllocMem(size*sizeof(apa_header_t)))){ - cacheBuf=apaAllocMem((size+1)*sizeof(apa_cache_t)); - if(cacheBuf==NULL) - return -ENOMEM; - } - else - return -ENOMEM; - // setup cache header... - memset(cacheBuf, 0, (size+1)*sizeof(apa_cache_t)); - cacheBuf->next=cacheBuf; - cacheBuf->tail=cacheBuf; - for(i=1; itail, &cacheBuf[i]); - } - return 0; + apa_header_t *header; + int i; + + cacheSize = size; // save size ;) + if ((header = (apa_header_t *)apaAllocMem(size * sizeof(apa_header_t)))) { + cacheBuf = apaAllocMem((size + 1) * sizeof(apa_cache_t)); + if (cacheBuf == NULL) + return -ENOMEM; + } else + return -ENOMEM; + // setup cache header... + memset(cacheBuf, 0, (size + 1) * sizeof(apa_cache_t)); + cacheBuf->next = cacheBuf; + cacheBuf->tail = cacheBuf; + for (i = 1; i < size + 1; i++, header++) { + cacheBuf[i].header = header; + cacheBuf[i].device = -1; + apaCacheLink(cacheBuf->tail, &cacheBuf[i]); + } + return 0; } void apaCacheLink(apa_cache_t *clink, apa_cache_t *cnew) { - cnew->tail=clink; - cnew->next=clink->next; - clink->next->tail=cnew; - clink->next=cnew; + cnew->tail = clink; + cnew->next = clink->next; + clink->next->tail = cnew; + clink->next = cnew; } apa_cache_t *apaCacheUnLink(apa_cache_t *clink) { - clink->tail->next=clink->next; - clink->next->tail=clink->tail; - return clink; + clink->tail->next = clink->next; + clink->next->tail = clink->tail; + return clink; } int apaCacheTransfer(apa_cache_t *clink, int type) { - int err; - if(type) - err=apaWriteHeader(clink->device, clink->header, clink->sector); - else// 0 - err=apaReadHeader(clink->device, clink->header, clink->sector); - - if(err) - { - APA_PRINTF(APA_DRV_NAME": error: disk err %d on device %ld, sector %ld, type %d\n", - err, clink->device, clink->sector, type); - if(type==0)// save any read error's.. - apaSaveError(clink->device, clink->header, APA_SECTOR_SECTOR_ERROR, clink->sector); - } - clink->flags&=~APA_CACHE_FLAG_DIRTY; - return err; + int err; + if (type) + err = apaWriteHeader(clink->device, clink->header, clink->sector); + else // 0 + err = apaReadHeader(clink->device, clink->header, clink->sector); + + if (err) { + APA_PRINTF(APA_DRV_NAME ": error: disk err %d on device %ld, sector %ld, type %d\n", + err, clink->device, clink->sector, type); + if (type == 0) // save any read error's.. + apaSaveError(clink->device, clink->header, APA_SECTOR_SECTOR_ERROR, clink->sector); + } + clink->flags &= ~APA_CACHE_FLAG_DIRTY; + return err; } void apaCacheFlushDirty(apa_cache_t *clink) { - if(clink->flags&APA_CACHE_FLAG_DIRTY) - apaCacheTransfer(clink, APA_IO_MODE_WRITE); + if (clink->flags & APA_CACHE_FLAG_DIRTY) + apaCacheTransfer(clink, APA_IO_MODE_WRITE); } int apaCacheFlushAllDirty(s32 device) { - u32 i; - // flush apal - for(i=1;inused==0) - clink=apaCacheUnLink(clink); - clink->nused++; - return clink; - } - if((cacheBuf->tail==cacheBuf) && - (cacheBuf->tail==cacheBuf->tail->next)){ - APA_PRINTF(APA_DRV_NAME": error: free buffer empty\n"); - } - else - { - clink=cacheBuf->next; - if(clink->flags & APA_CACHE_FLAG_DIRTY) - APA_PRINTF(APA_DRV_NAME": error: dirty buffer allocated\n"); - clink->flags=0; - clink->nused=1; - clink->device=device; - clink->sector=sector; - clink=apaCacheUnLink(clink); - } - if(clink==NULL) - { - *result=-ENOMEM; - return NULL; - } - if(!mode) - { - if((*result=apaCacheTransfer(clink, APA_IO_MODE_READ))<0){ - clink->nused=0; - clink->device=-1; - apaCacheLink(cacheBuf, clink); - clink=NULL; - } - } - return clink; + apa_cache_t *clink = NULL; + int i; + + *result = 0; + for (i = 1; i < cacheSize + 1; i++) { + if (cacheBuf[i].sector == sector && + cacheBuf[i].device == device) { + clink = &cacheBuf[i]; + break; + } + } + if (clink != NULL) { + // cached ver was found :) + if (clink->nused == 0) + clink = apaCacheUnLink(clink); + clink->nused++; + return clink; + } + if ((cacheBuf->tail == cacheBuf) && + (cacheBuf->tail == cacheBuf->tail->next)) { + APA_PRINTF(APA_DRV_NAME ": error: free buffer empty\n"); + } else { + clink = cacheBuf->next; + if (clink->flags & APA_CACHE_FLAG_DIRTY) + APA_PRINTF(APA_DRV_NAME ": error: dirty buffer allocated\n"); + clink->flags = 0; + clink->nused = 1; + clink->device = device; + clink->sector = sector; + clink = apaCacheUnLink(clink); + } + if (clink == NULL) { + *result = -ENOMEM; + return NULL; + } + if (!mode) { + if ((*result = apaCacheTransfer(clink, APA_IO_MODE_READ)) < 0) { + clink->nused = 0; + clink->device = -1; + apaCacheLink(cacheBuf, clink); + clink = NULL; + } + } + return clink; } void apaCacheFree(apa_cache_t *clink) { - if(clink==NULL){ - APA_PRINTF(APA_DRV_NAME": error: null buffer returned\n"); - return; - } - if(clink->nused==0){ - APA_PRINTF(APA_DRV_NAME": error: unused cache returned\n"); - return; - } - if(clink->flags & APA_CACHE_FLAG_DIRTY) - APA_PRINTF(APA_DRV_NAME": error: dirty buffer returned\n"); - clink->nused--; - if(clink->nused==0) - apaCacheLink(cacheBuf->tail, clink); - return; + if (clink == NULL) { + APA_PRINTF(APA_DRV_NAME ": error: null buffer returned\n"); + return; + } + if (clink->nused == 0) { + APA_PRINTF(APA_DRV_NAME ": error: unused cache returned\n"); + return; + } + if (clink->flags & APA_CACHE_FLAG_DIRTY) + APA_PRINTF(APA_DRV_NAME ": error: dirty buffer returned\n"); + clink->nused--; + if (clink->nused == 0) + apaCacheLink(cacheBuf->tail, clink); + return; } apa_cache_t *apaCacheAlloc(void) { - apa_cache_t *cnext; - - if((cacheBuf->tail==cacheBuf) && - (cacheBuf->tail==cacheBuf->tail->next)){ - APA_PRINTF(APA_DRV_NAME": error: free buffer empty\n"); - return NULL; - } - cnext=cacheBuf->next; - if(cnext->flags & APA_CACHE_FLAG_DIRTY) - APA_PRINTF(APA_DRV_NAME": error: dirty buffer allocated\n"); - cnext->nused=1; - cnext->flags=0; - cnext->device=-1; - cnext->sector=-1; - return apaCacheUnLink(cnext); + apa_cache_t *cnext; + + if ((cacheBuf->tail == cacheBuf) && + (cacheBuf->tail == cacheBuf->tail->next)) { + APA_PRINTF(APA_DRV_NAME ": error: free buffer empty\n"); + return NULL; + } + cnext = cacheBuf->next; + if (cnext->flags & APA_CACHE_FLAG_DIRTY) + APA_PRINTF(APA_DRV_NAME ": error: dirty buffer allocated\n"); + cnext->nused = 1; + cnext->flags = 0; + cnext->device = -1; + cnext->sector = -1; + return apaCacheUnLink(cnext); } diff --git a/modules/hdd/libapa/src/free.c b/modules/hdd/libapa/src/free.c index 3c90d0900..fd49c4606 100644 --- a/modules/hdd/libapa/src/free.c +++ b/modules/hdd/libapa/src/free.c @@ -22,60 +22,53 @@ static void apaCalculateFreeSpace(u32 *free, u32 sectors) { - if(0x1FFFFF < sectors) - { - *free += sectors; - return; - } + if (0x1FFFFF < sectors) { + *free += sectors; + return; + } - if((*free & sectors) == 0) - { - *free |= sectors; - return; - } + if ((*free & sectors) == 0) { + *free |= sectors; + return; + } - for(sectors /= 2; 0x3FFFF < sectors; sectors /= 2) - *free |= sectors; + for (sectors /= 2; 0x3FFFF < sectors; sectors /= 2) + *free |= sectors; } int apaGetFreeSectors(s32 device, u32 *free, apa_device_t *deviceinfo) { - u32 sectors, partMax; - int rv; - apa_cache_t *clink; + u32 sectors, partMax; + int rv; + apa_cache_t *clink; - sectors = 0; - *free = 0; - if((clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv)) != NULL) - { - do{ - if(clink->header->type == 0) - apaCalculateFreeSpace(free, clink->header->length); - sectors += clink->header->length; - }while((clink = apaGetNextHeader(clink, &rv)) != NULL); - } + sectors = 0; + *free = 0; + if ((clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv)) != NULL) { + do { + if (clink->header->type == 0) + apaCalculateFreeSpace(free, clink->header->length); + sectors += clink->header->length; + } while ((clink = apaGetNextHeader(clink, &rv)) != NULL); + } - if(rv == 0) - { - for(partMax = deviceinfo[device].partitionMaxSize; 0x0003FFFF < partMax; partMax = deviceinfo[device].partitionMaxSize) - { //As weird as it looks, this was how it was done in the original HDD.IRX. - for( ; 0x0003FFFF < partMax; partMax /= 2) - { - //Non-SONY: Perform 64-bit arithmetic here to avoid overflows when dealing with large disks. - if((sectors % partMax == 0) && ((u64)sectors + partMax < deviceinfo[device].totalLBA)) - { - apaCalculateFreeSpace(free, partMax); - sectors += partMax; - break; - } - } + if (rv == 0) { + for (partMax = deviceinfo[device].partitionMaxSize; 0x0003FFFF < partMax; partMax = deviceinfo[device].partitionMaxSize) { //As weird as it looks, this was how it was done in the original HDD.IRX. + for (; 0x0003FFFF < partMax; partMax /= 2) { + //Non-SONY: Perform 64-bit arithmetic here to avoid overflows when dealing with large disks. + if ((sectors % partMax == 0) && ((u64)sectors + partMax < deviceinfo[device].totalLBA)) { + apaCalculateFreeSpace(free, partMax); + sectors += partMax; + break; + } + } - if(0x0003FFFF >= partMax) - break; - } + if (0x0003FFFF >= partMax) + break; + } - APA_PRINTF(APA_DRV_NAME": total = %08lx sectors, installable = %08lx sectors.\n", sectors, *free); - } + APA_PRINTF(APA_DRV_NAME ": total = %08lx sectors, installable = %08lx sectors.\n", sectors, *free); + } - return rv; + return rv; } diff --git a/modules/hdd/libapa/src/journal.c b/modules/hdd/libapa/src/journal.c index e1d7f7e4c..ae5e299d6 100644 --- a/modules/hdd/libapa/src/journal.c +++ b/modules/hdd/libapa/src/journal.c @@ -24,61 +24,59 @@ static apa_journal_t journalBuf; int apaJournalFlush(s32 device) -{// this write any thing that in are journal buffer :) - if(ata_device_flush_cache(device)) - return -EIO; - if(ata_device_sector_io(device, &journalBuf, APA_SECTOR_APAL, 1, ATA_DIR_WRITE)) - return -EIO; - if(ata_device_flush_cache(device)) - return -EIO; - return 0; +{ // this write any thing that in are journal buffer :) + if (ata_device_flush_cache(device)) + return -EIO; + if (ata_device_sector_io(device, &journalBuf, APA_SECTOR_APAL, 1, ATA_DIR_WRITE)) + return -EIO; + if (ata_device_flush_cache(device)) + return -EIO; + return 0; } int apaJournalReset(s32 device) { - memset(&journalBuf, 0, sizeof(apa_journal_t)); - journalBuf.magic=APAL_MAGIC; - return apaJournalFlush(device); + memset(&journalBuf, 0, sizeof(apa_journal_t)); + journalBuf.magic = APAL_MAGIC; + return apaJournalFlush(device); } int apaJournalWrite(apa_cache_t *clink) { - clink->header->checksum=journalCheckSum(clink->header); - if(ata_device_sector_io(clink->device, clink->header, - (journalBuf.num << 1)+APA_SECTOR_APAL_HEADERS, 2, ATA_DIR_WRITE)) - return -EIO; - journalBuf.sectors[journalBuf.num]=clink->sector; - journalBuf.num++; - return 0; + clink->header->checksum = journalCheckSum(clink->header); + if (ata_device_sector_io(clink->device, clink->header, + (journalBuf.num << 1) + APA_SECTOR_APAL_HEADERS, 2, ATA_DIR_WRITE)) + return -EIO; + journalBuf.sectors[journalBuf.num] = clink->sector; + journalBuf.num++; + return 0; } int apaJournalRestore(s32 device) -{ // copys apa headers from apal to apa system - int i; - u32 sector; - apa_cache_t *clink; +{ // copys apa headers from apal to apa system + int i; + u32 sector; + apa_cache_t *clink; - APA_PRINTF(APA_DRV_NAME": checking log...\n"); - if(ata_device_sector_io(device, &journalBuf, APA_SECTOR_APAL, sizeof(apa_journal_t)/512, ATA_DIR_READ)){ - apaJournalReset(device); - return -EIO; - } - if(journalBuf.magic==APAL_MAGIC) - { - if(journalBuf.num==0) - return 0; - clink=apaCacheAlloc(); - for(i=0, sector=APA_SECTOR_APAL_HEADERS;iheader, sector, 2, ATA_DIR_READ)) - break; - if(ata_device_sector_io(device, clink->header, journalBuf.sectors[i], 2, ATA_DIR_WRITE)) - break; - } - apaCacheFree(clink); - return apaJournalReset(device);// only do if journal.. - } - memset(&journalBuf, 0, sizeof(apa_journal_t));// safe e - journalBuf.magic=APAL_MAGIC; - return 0;//-EINVAL; + APA_PRINTF(APA_DRV_NAME ": checking log...\n"); + if (ata_device_sector_io(device, &journalBuf, APA_SECTOR_APAL, sizeof(apa_journal_t) / 512, ATA_DIR_READ)) { + apaJournalReset(device); + return -EIO; + } + if (journalBuf.magic == APAL_MAGIC) { + if (journalBuf.num == 0) + return 0; + clink = apaCacheAlloc(); + for (i = 0, sector = APA_SECTOR_APAL_HEADERS; i < journalBuf.num; i++, sector += 2) { + if (ata_device_sector_io(device, clink->header, sector, 2, ATA_DIR_READ)) + break; + if (ata_device_sector_io(device, clink->header, journalBuf.sectors[i], 2, ATA_DIR_WRITE)) + break; + } + apaCacheFree(clink); + return apaJournalReset(device); // only do if journal.. + } + memset(&journalBuf, 0, sizeof(apa_journal_t)); // safe e + journalBuf.magic = APAL_MAGIC; + return 0; //-EINVAL; } diff --git a/modules/hdd/libapa/src/misc.c b/modules/hdd/libapa/src/misc.c index 9d7977382..3bf1e9e31 100644 --- a/modules/hdd/libapa/src/misc.c +++ b/modules/hdd/libapa/src/misc.c @@ -24,51 +24,50 @@ void *apaAllocMem(int size) { - int intrStat; - void *mem; + int intrStat; + void *mem; - CpuSuspendIntr(&intrStat); - mem = AllocSysMemory(ALLOC_FIRST, size, NULL); - CpuResumeIntr(intrStat); + CpuSuspendIntr(&intrStat); + mem = AllocSysMemory(ALLOC_FIRST, size, NULL); + CpuResumeIntr(intrStat); - return mem; + return mem; } void apaFreeMem(void *ptr) { - int intrStat; + int intrStat; - CpuSuspendIntr(&intrStat); - FreeSysMemory(ptr); - CpuResumeIntr(intrStat); + CpuSuspendIntr(&intrStat); + FreeSysMemory(ptr); + CpuResumeIntr(intrStat); } int apaGetTime(apa_ps2time_t *tm) { - sceCdCLOCK cdtime; - apa_ps2time_t timeBuf={ 0, 7, 6, 5, 4, 3, 2000 }; + sceCdCLOCK cdtime; + apa_ps2time_t timeBuf = {0, 7, 6, 5, 4, 3, 2000}; - if(sceCdReadClock(&cdtime)!=0 && cdtime.stat==0) - { - timeBuf.sec=btoi(cdtime.second); - timeBuf.min=btoi(cdtime.minute); - timeBuf.hour=btoi(cdtime.hour); - timeBuf.day=btoi(cdtime.day); - timeBuf.month=btoi(cdtime.month & 0x7F); //The old CDVDMAN sceCdReadClock() function does not automatically file off the highest bit. - timeBuf.year=btoi(cdtime.year)+2000; - } - memcpy(tm, &timeBuf, sizeof(apa_ps2time_t)); - return 0; + if (sceCdReadClock(&cdtime) != 0 && cdtime.stat == 0) { + timeBuf.sec = btoi(cdtime.second); + timeBuf.min = btoi(cdtime.minute); + timeBuf.hour = btoi(cdtime.hour); + timeBuf.day = btoi(cdtime.day); + timeBuf.month = btoi(cdtime.month & 0x7F); //The old CDVDMAN sceCdReadClock() function does not automatically file off the highest bit. + timeBuf.year = btoi(cdtime.year) + 2000; + } + memcpy(tm, &timeBuf, sizeof(apa_ps2time_t)); + return 0; } int apaGetIlinkID(u8 *idbuf) { - u32 err=0; + u32 err = 0; - memset(idbuf, 0, 32); - if(sceCdRI(idbuf, &err)) - if(err==0) - return 0; - APA_PRINTF(APA_DRV_NAME": Error: cannot get ilink id\n"); - return -EIO; + memset(idbuf, 0, 32); + if (sceCdRI(idbuf, &err)) + if (err == 0) + return 0; + APA_PRINTF(APA_DRV_NAME ": Error: cannot get ilink id\n"); + return -EIO; } diff --git a/modules/hdd/libapa/src/password.c b/modules/hdd/libapa/src/password.c index 05dd32ea7..b7637d2df 100644 --- a/modules/hdd/libapa/src/password.c +++ b/modules/hdd/libapa/src/password.c @@ -23,10 +23,10 @@ int apaPassCmp(const char *pw1, const char *pw2) { #ifdef APA_ENABLE_PASSWORDS - return memcmp(pw1, pw2, APA_PASSMAX) ? -EACCES : 0; + return memcmp(pw1, pw2, APA_PASSMAX) ? -EACCES : 0; #else - //Passwords are not supported, hence this check should always pass. - return 0; + //Passwords are not supported, hence this check should always pass. + return 0; #endif } @@ -34,233 +34,227 @@ static void DESEncryptPassword(u32 id_lo, u32 id_hi, char *password_out, const c void apaEncryptPassword(const char *id, char *password_out, const char *password_in) { - char password[APA_PASSMAX]; - memcpy(password, password_in, APA_PASSMAX); - DESEncryptPassword(*(u32*)(id), *(u32*)(id + 4), password_out, password); + char password[APA_PASSMAX]; + memcpy(password, password_in, APA_PASSMAX); + DESEncryptPassword(*(u32 *)(id), *(u32 *)(id + 4), password_out, password); } -struct KeyPair{ - u32 lo, hi; +struct KeyPair +{ + u32 lo, hi; }; //This is a standard DES-ECB implementation. It encrypts the partition ID with the password. static void DESEncryptPassword(u32 id_lo, u32 id_hi, char *password_out, const char *password) { - //Left - static const u8 PC1[]={ 0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, - 0x01, 0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, - 0x0a, 0x02, 0x3b, 0x33, 0x2b, 0x23, 0x1b, - 0x13, 0x0b, 0x03, 0x3c, 0x34, 0x2c, 0x24, - //Right - 0x3f, 0x37, 0x2f, 0x27, 0x1f, 0x17, 0x0f, - 0x07, 0x3e, 0x36, 0x2e, 0x26, 0x1e, 0x16, - 0x0e, 0x06, 0x3d, 0x35, 0x2d, 0x25, 0x1d, - 0x15, 0x0d, 0x05, 0x1c, 0x14, 0x0c, 0x04 }; - static const u8 Rotations[]={ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; - static const u8 PC2[]={ 0x0e, 0x11, 0x0b, 0x18, 0x01, 0x05, - 0x03, 0x1c, 0x0f, 0x06, 0x15, 0x0a, - 0x17, 0x13, 0x0c, 0x04, 0x1a, 0x08, - 0x10, 0x07, 0x1b, 0x14, 0x0d, 0x02, - 0x29, 0x34, 0x1f, 0x25, 0x2f, 0x37, - 0x1e, 0x28, 0x33, 0x2d, 0x21, 0x30, - 0x2c, 0x31, 0x27, 0x38, 0x22, 0x35, - 0x2e, 0x2a, 0x32, 0x24, 0x1d, 0x20 }; - static const u8 IP[]={ 0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, 0x0a, 0x02, 0x3c, 0x34, 0x2c, 0x24, 0x1c, 0x14, 0x0c, 0x04, - 0x3e, 0x36, 0x2e, 0x26, 0x1e, 0x16, 0x0e, 0x06, 0x40, 0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x08, - - 0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, 0x01, 0x3b, 0x33, 0x2b, 0x23, 0x1b, 0x13, 0x0b, 0x03, - 0x3d, 0x35, 0x2d, 0x25, 0x1d, 0x15, 0x0d, 0x05, 0x3f, 0x37, 0x2f, 0x27, 0x1f, 0x17, 0x0f, 0x07 }; - static const u8 Expansion[]={ 0x20, 0x01, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x14, 0x15, - 0x16, 0x17, 0x18, 0x19, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x01 }; - static const u8 sbox[][64]={ { 0x0e, 0x04, 0x0d, 0x01, 0x02, 0x0f, 0x0b, 0x08, 0x03, 0x0a, 0x06, 0x0c, 0x05, 0x09, 0x00, 0x07, - 0x00, 0x0f, 0x07, 0x04, 0x0e, 0x02, 0x0d, 0x01, 0x0a, 0x06, 0x0c, 0x0b, 0x09, 0x05, 0x03, 0x08, - 0x04, 0x01, 0x0e, 0x08, 0x0d, 0x06, 0x02, 0x0b, 0x0f, 0x0c, 0x09, 0x07, 0x03, 0x0a, 0x05, 0x00, - 0x0f, 0x0c, 0x08, 0x02, 0x04, 0x09, 0x01, 0x07, 0x05, 0x0b, 0x03, 0x0e, 0x0a, 0x00, 0x06, 0x0d }, - { 0x0f, 0x01, 0x08, 0x0e, 0x06, 0x0b, 0x03, 0x04, 0x09, 0x07, 0x02, 0x0d, 0x0c, 0x00, 0x05, 0x0a, - 0x03, 0x0d, 0x04, 0x07, 0x0f, 0x02, 0x08, 0x0e, 0x0c, 0x00, 0x01, 0x0a, 0x06, 0x09, 0x0b, 0x05, - 0x00, 0x0e, 0x07, 0x0b, 0x0a, 0x04, 0x0d, 0x01, 0x05, 0x08, 0x0c, 0x06, 0x09, 0x03, 0x02, 0x0f, - 0x0d, 0x08, 0x0a, 0x01, 0x03, 0x0f, 0x04, 0x02, 0x0b, 0x06, 0x07, 0x0c, 0x00, 0x05, 0x0e, 0x09 }, - { 0x0a, 0x00, 0x09, 0x0e, 0x06, 0x03, 0x0f, 0x05, 0x01, 0x0d, 0x0c, 0x07, 0x0b, 0x04, 0x02, 0x08, - 0x0d, 0x07, 0x00, 0x09, 0x03, 0x04, 0x06, 0x0a, 0x02, 0x08, 0x05, 0x0e, 0x0c, 0x0b, 0x0f, 0x01, - 0x0d, 0x06, 0x04, 0x09, 0x08, 0x0f, 0x03, 0x00, 0x0b, 0x01, 0x02, 0x0c, 0x05, 0x0a, 0x0e, 0x07, - 0x01, 0x0a, 0x0d, 0x00, 0x06, 0x09, 0x08, 0x07, 0x04, 0x0f, 0x0e, 0x03, 0x0b, 0x05, 0x02, 0x0c }, - { 0x07, 0x0d, 0x0e, 0x03, 0x00, 0x06, 0x09, 0x0a, 0x01, 0x02, 0x08, 0x05, 0x0b, 0x0c, 0x04, 0x0f, - 0x0d, 0x08, 0x0b, 0x05, 0x06, 0x0f, 0x00, 0x03, 0x04, 0x07, 0x02, 0x0c, 0x01, 0x0a, 0x0e, 0x09, - 0x0a, 0x06, 0x09, 0x00, 0x0c, 0x0b, 0x07, 0x0d, 0x0f, 0x01, 0x03, 0x0e, 0x05, 0x02, 0x08, 0x04, - 0x03, 0x0f, 0x00, 0x06, 0x0a, 0x01, 0x0d, 0x08, 0x09, 0x04, 0x05, 0x0b, 0x0c, 0x07, 0x02, 0x0e }, - { 0x02, 0x0c, 0x04, 0x01, 0x07, 0x0a, 0x0b, 0x06, 0x08, 0x05, 0x03, 0x0f, 0x0d, 0x00, 0x0e, 0x09, - 0x0e, 0x0b, 0x02, 0x0c, 0x04, 0x07, 0x0d, 0x01, 0x05, 0x00, 0x0f, 0x0a, 0x03, 0x09, 0x08, 0x06, - 0x04, 0x02, 0x01, 0x0b, 0x0a, 0x0d, 0x07, 0x08, 0x0f, 0x09, 0x0c, 0x05, 0x06, 0x03, 0x00, 0x0e, - 0x0b, 0x08, 0x0c, 0x07, 0x01, 0x0e, 0x02, 0x0d, 0x06, 0x0f, 0x00, 0x09, 0x0a, 0x04, 0x05, 0x03 }, - { 0x0c, 0x01, 0x0a, 0x0f, 0x09, 0x02, 0x06, 0x08, 0x00, 0x0d, 0x03, 0x04, 0x0e, 0x07, 0x05, 0x0b, - 0x0a, 0x0f, 0x04, 0x02, 0x07, 0x0c, 0x09, 0x05, 0x06, 0x01, 0x0d, 0x0e, 0x00, 0x0b, 0x03, 0x08, - 0x09, 0x0e, 0x0f, 0x05, 0x02, 0x08, 0x0c, 0x03, 0x07, 0x00, 0x04, 0x0a, 0x01, 0x0d, 0x0b, 0x06, - 0x04, 0x03, 0x02, 0x0c, 0x09, 0x05, 0x0f, 0x0a, 0x0b, 0x0e, 0x01, 0x07, 0x06, 0x00, 0x08, 0x0d }, - { 0x04, 0x0b, 0x02, 0x0e, 0x0f, 0x00, 0x08, 0x0d, 0x03, 0x0c, 0x09, 0x07, 0x05, 0x0a, 0x06, 0x01, - 0x0d, 0x00, 0x0b, 0x07, 0x04, 0x09, 0x01, 0x0a, 0x0e, 0x03, 0x05, 0x0c, 0x02, 0x0f, 0x08, 0x06, - 0x01, 0x04, 0x0b, 0x0d, 0x0c, 0x03, 0x07, 0x0e, 0x0a, 0x0f, 0x06, 0x08, 0x00, 0x05, 0x09, 0x02, - 0x06, 0x0b, 0x0d, 0x08, 0x01, 0x04, 0x0a, 0x07, 0x09, 0x05, 0x00, 0x0f, 0x0e, 0x02, 0x03, 0x0c }, - { 0x0d, 0x02, 0x08, 0x04, 0x06, 0x0f, 0x0b, 0x01, 0x0a, 0x09, 0x03, 0x0e, 0x05, 0x00, 0x0c, 0x07, - 0x01, 0x0f, 0x0d, 0x08, 0x0a, 0x03, 0x07, 0x04, 0x0c, 0x05, 0x06, 0x0b, 0x00, 0x0e, 0x09, 0x02, - 0x07, 0x0b, 0x04, 0x01, 0x09, 0x0c, 0x0e, 0x02, 0x00, 0x06, 0x0a, 0x0d, 0x0f, 0x03, 0x05, 0x08, - 0x02, 0x01, 0x0e, 0x07, 0x04, 0x0a, 0x08, 0x0d, 0x0f, 0x0c, 0x09, 0x00, 0x03, 0x05, 0x06, 0x0b }}; - static const u8 Permutation[]={ 0x10, 0x07, 0x14, 0x15, 0x1d, 0x0c, 0x1c, 0x11, 0x01, 0x0f, 0x17, 0x1a, 0x05, 0x12, 0x1f, 0x0a, - 0x02, 0x08, 0x18, 0x0e, 0x20, 0x1b, 0x03, 0x09, 0x13, 0x0d, 0x1e, 0x06, 0x16, 0x0b, 0x04, 0x19 }; - static const u8 FP[]={ 0x28, 0x08, 0x30, 0x10, 0x38, 0x18, 0x40, 0x20, 0x27, 0x07, 0x2f, 0x0f, 0x37, 0x17, 0x3f, 0x1f, - 0x26, 0x06, 0x2e, 0x0e, 0x36, 0x16, 0x3e, 0x1e, 0x25, 0x05, 0x2d, 0x0d, 0x35, 0x15, 0x3d, 0x1d, - 0x24, 0x04, 0x2c, 0x0c, 0x34, 0x14, 0x3c, 0x1c, 0x23, 0x03, 0x2b, 0x0b, 0x33, 0x13, 0x3b, 0x1b, - 0x22, 0x02, 0x2a, 0x0a, 0x32, 0x12, 0x3a, 0x1a, 0x21, 0x01, 0x29, 0x09, 0x31, 0x11, 0x39, 0x19 }; - u32 BitMask_hi, BitMask_lo; - u32 PermutedKeyMask_lo, PermutedKeyMask_hi, Rot2Mask_lo, Rot1Mask_lo, Rot2Mask_hi, Rot1Mask_hi; - u32 BitPerm_lo, BitPerm_hi; - u32 password_lo, password_hi; - u32 key1, key2, key3, key4, input_lo, input_hi; - u32 PermutedKey_lo, PermutedKey_hi, kVal_lo, kVal_hi, PermutedInput_lo, PermutedInput_hi, eVal_lo, eVal_hi, sVal_lo, sVal_hi, pVal_lo, pVal_hi, output_lo, output_hi; - struct KeyPair pairC[17], pairD[17], pairK[17], pairL[17], pairR[17]; - struct KeyPair *pPairC, *pPairD, *pPairK, *pPairL, *pPairR; - unsigned int i, j, k; - int shift; - - //Phase 1 (Permute KEY with Permuted Choice 1) - PermutedKey_lo = 0; - PermutedKey_hi = 0; - BitMask_lo = 0; - BitMask_hi = 0x80000000; - BitPerm_lo = 0; - BitPerm_hi = 0x80000000; - - password_lo = *(const u32*)password; - password_hi = *(const u32*)(password + 4); - - for(i = 0; i < 56; i++) - { - shift = PC1[i] - 1; - - if((shift << 26) >= 0) - { //0 to 31-bit shift - if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key2 = 0; - key1 = BitMask_hi >> shift; - } - - //If bit (shift) is set, set the current bit. - if(((password_lo & key1) | (password_hi & key2)) != 0) - { - PermutedKey_lo |= BitPerm_lo; - PermutedKey_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); - BitPerm_hi >>= 1; - } - - //Phase 2 (Key Schedule Calculation) - //This mask is used to extract the lower 28-bits of a key. - PermutedKeyMask_lo = 0x0FFFFFFF; - PermutedKeyMask_hi = 0x00000000; - - Rot2Mask_lo = 3; - Rot2Mask_hi = 0x00000000; - Rot1Mask_lo = 1; - Rot1Mask_hi = 0x00000000; - - //C-bits, upper 28-bits of Permuted Key - pairC[0].lo = PermutedKey_hi >> 4; - pairC[0].hi = 0; - - //D-bits, lower 28-bits of Permuted Key - pairD[0].lo = ((PermutedKey_lo >> 8) | (PermutedKey_hi << 24)) & PermutedKeyMask_lo; - pairD[0].hi = ((PermutedKey_hi >> 8) & PermutedKeyMask_hi); - - //Calculate all Cn and Dn. - for(i = 0; i < 16; i++) - { - if(Rotations[i] != 1) - { //Rotate left twice - //hi 26:0 | lo 31:26 - key1 = ((pairC[i].hi << 6) | (pairC[i].lo >> 26)) & Rot2Mask_lo; - //lo 29:0 - //key1|key 4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLXX, where X is from key1 - key4 = pairC[i].lo << 2; - //hi 31:26 - //This part is discarded. - key2 = (pairC[i].hi >> 26) & Rot2Mask_hi; - //hi 29:2 | lo 31:30 - //key2|key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHLL - key3 = (pairC[i].hi << 2) | (pairC[i].lo >> 30); - } else { //Rotate left once - //hi 27:0 | lo 31:27 - key1 = ((pairC[i].hi << 5) | (pairC[i].lo >> 27)) & Rot1Mask_lo; - //lo 30:0 - //key1|key4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLX, where X is from key1 - key4 = pairC[i].lo << 1; - //hi 31:27 - //This part is discarded. - key2 = (pairC[i].hi >> 27) & Rot1Mask_hi; - //hi 30:0 | lo 31:31 - //key2:key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHL - key3 = (pairC[i].hi << 1) | (pairC[i].lo >> 31); - } - - //Merge the two rotated parts together, for the hi and low pair. - //Note: hi contains nothing. - pairC[i + 1].lo = (key1 | key4) & PermutedKeyMask_lo; - pairC[i + 1].hi = (key2 | key3) & PermutedKeyMask_hi; - - if(Rotations[i] != 1) - { //Rotate left twice - //hi 26:0 | lo 31:26 - key1 = ((pairD[i].hi << 6) | (pairD[i].lo >> 26)) & Rot2Mask_lo; - //lo 29:0 - //key1|key 4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLXX, where X is from key1 - key4 = pairD[i].lo << 2; - //hi 31:26 - //This part is discarded. - key2 = (pairD[i].hi >> 26) & Rot2Mask_hi; - //hi 29:2 | lo 31:30 - //key2|key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHLL - key3 = (pairD[i].hi << 2) | (pairD[i].lo >> 30); - } else { //Rotate left once - //hi 27:0 | lo 31:27 - key1 = ((pairD[i].hi << 5) | (pairD[i].lo >> 27)) & Rot1Mask_lo; - //lo 30:0 - //key1|key4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLX, where X is from key1 - key4 = pairD[i].lo << 1; - //hi 31:27 - //This part is discarded. - key2 = (pairD[i].hi >> 27) & Rot1Mask_hi; - //hi 30:0 | lo 31:31 - //key2:key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHL - key3 = (pairD[i].hi << 1) | (pairD[i].lo >> 31); - } - - //Merge the two rotated parts together, for the hi and low pair. - //Note: hi contains nothing. - pairD[i + 1].lo = (key1 | key4) & PermutedKeyMask_lo; - pairD[i + 1].hi = (key2 | key3) & PermutedKeyMask_hi; - } - - //Phase 3 - BitMask_lo = 0x00000000; - BitMask_hi = 0x80000000; - - // Determine all K, through the Permutation of CnDn by PC-2 - for(pPairC = &pairC[1],pPairD = &pairD[1],pPairK = &pairK[1]; pPairK < &pairK[17]; pPairC++,pPairD++,pPairK++) - { - kVal_lo = 0; - kVal_hi = 0; - BitPerm_lo = 0x00000000; - BitPerm_hi = 0x80000000; - - /* Calculate CnDn: + //Left + static const u8 PC1[] = {0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, + 0x01, 0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, + 0x0a, 0x02, 0x3b, 0x33, 0x2b, 0x23, 0x1b, + 0x13, 0x0b, 0x03, 0x3c, 0x34, 0x2c, 0x24, + //Right + 0x3f, 0x37, 0x2f, 0x27, 0x1f, 0x17, 0x0f, + 0x07, 0x3e, 0x36, 0x2e, 0x26, 0x1e, 0x16, + 0x0e, 0x06, 0x3d, 0x35, 0x2d, 0x25, 0x1d, + 0x15, 0x0d, 0x05, 0x1c, 0x14, 0x0c, 0x04}; + static const u8 Rotations[] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}; + static const u8 PC2[] = {0x0e, 0x11, 0x0b, 0x18, 0x01, 0x05, + 0x03, 0x1c, 0x0f, 0x06, 0x15, 0x0a, + 0x17, 0x13, 0x0c, 0x04, 0x1a, 0x08, + 0x10, 0x07, 0x1b, 0x14, 0x0d, 0x02, + 0x29, 0x34, 0x1f, 0x25, 0x2f, 0x37, + 0x1e, 0x28, 0x33, 0x2d, 0x21, 0x30, + 0x2c, 0x31, 0x27, 0x38, 0x22, 0x35, + 0x2e, 0x2a, 0x32, 0x24, 0x1d, 0x20}; + static const u8 IP[] = {0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, 0x0a, 0x02, 0x3c, 0x34, 0x2c, 0x24, 0x1c, 0x14, 0x0c, 0x04, + 0x3e, 0x36, 0x2e, 0x26, 0x1e, 0x16, 0x0e, 0x06, 0x40, 0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x08, + + 0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, 0x01, 0x3b, 0x33, 0x2b, 0x23, 0x1b, 0x13, 0x0b, 0x03, + 0x3d, 0x35, 0x2d, 0x25, 0x1d, 0x15, 0x0d, 0x05, 0x3f, 0x37, 0x2f, 0x27, 0x1f, 0x17, 0x0f, 0x07}; + static const u8 Expansion[] = {0x20, 0x01, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x01}; + static const u8 sbox[][64] = {{0x0e, 0x04, 0x0d, 0x01, 0x02, 0x0f, 0x0b, 0x08, 0x03, 0x0a, 0x06, 0x0c, 0x05, 0x09, 0x00, 0x07, + 0x00, 0x0f, 0x07, 0x04, 0x0e, 0x02, 0x0d, 0x01, 0x0a, 0x06, 0x0c, 0x0b, 0x09, 0x05, 0x03, 0x08, + 0x04, 0x01, 0x0e, 0x08, 0x0d, 0x06, 0x02, 0x0b, 0x0f, 0x0c, 0x09, 0x07, 0x03, 0x0a, 0x05, 0x00, + 0x0f, 0x0c, 0x08, 0x02, 0x04, 0x09, 0x01, 0x07, 0x05, 0x0b, 0x03, 0x0e, 0x0a, 0x00, 0x06, 0x0d}, + {0x0f, 0x01, 0x08, 0x0e, 0x06, 0x0b, 0x03, 0x04, 0x09, 0x07, 0x02, 0x0d, 0x0c, 0x00, 0x05, 0x0a, + 0x03, 0x0d, 0x04, 0x07, 0x0f, 0x02, 0x08, 0x0e, 0x0c, 0x00, 0x01, 0x0a, 0x06, 0x09, 0x0b, 0x05, + 0x00, 0x0e, 0x07, 0x0b, 0x0a, 0x04, 0x0d, 0x01, 0x05, 0x08, 0x0c, 0x06, 0x09, 0x03, 0x02, 0x0f, + 0x0d, 0x08, 0x0a, 0x01, 0x03, 0x0f, 0x04, 0x02, 0x0b, 0x06, 0x07, 0x0c, 0x00, 0x05, 0x0e, 0x09}, + {0x0a, 0x00, 0x09, 0x0e, 0x06, 0x03, 0x0f, 0x05, 0x01, 0x0d, 0x0c, 0x07, 0x0b, 0x04, 0x02, 0x08, + 0x0d, 0x07, 0x00, 0x09, 0x03, 0x04, 0x06, 0x0a, 0x02, 0x08, 0x05, 0x0e, 0x0c, 0x0b, 0x0f, 0x01, + 0x0d, 0x06, 0x04, 0x09, 0x08, 0x0f, 0x03, 0x00, 0x0b, 0x01, 0x02, 0x0c, 0x05, 0x0a, 0x0e, 0x07, + 0x01, 0x0a, 0x0d, 0x00, 0x06, 0x09, 0x08, 0x07, 0x04, 0x0f, 0x0e, 0x03, 0x0b, 0x05, 0x02, 0x0c}, + {0x07, 0x0d, 0x0e, 0x03, 0x00, 0x06, 0x09, 0x0a, 0x01, 0x02, 0x08, 0x05, 0x0b, 0x0c, 0x04, 0x0f, + 0x0d, 0x08, 0x0b, 0x05, 0x06, 0x0f, 0x00, 0x03, 0x04, 0x07, 0x02, 0x0c, 0x01, 0x0a, 0x0e, 0x09, + 0x0a, 0x06, 0x09, 0x00, 0x0c, 0x0b, 0x07, 0x0d, 0x0f, 0x01, 0x03, 0x0e, 0x05, 0x02, 0x08, 0x04, + 0x03, 0x0f, 0x00, 0x06, 0x0a, 0x01, 0x0d, 0x08, 0x09, 0x04, 0x05, 0x0b, 0x0c, 0x07, 0x02, 0x0e}, + {0x02, 0x0c, 0x04, 0x01, 0x07, 0x0a, 0x0b, 0x06, 0x08, 0x05, 0x03, 0x0f, 0x0d, 0x00, 0x0e, 0x09, + 0x0e, 0x0b, 0x02, 0x0c, 0x04, 0x07, 0x0d, 0x01, 0x05, 0x00, 0x0f, 0x0a, 0x03, 0x09, 0x08, 0x06, + 0x04, 0x02, 0x01, 0x0b, 0x0a, 0x0d, 0x07, 0x08, 0x0f, 0x09, 0x0c, 0x05, 0x06, 0x03, 0x00, 0x0e, + 0x0b, 0x08, 0x0c, 0x07, 0x01, 0x0e, 0x02, 0x0d, 0x06, 0x0f, 0x00, 0x09, 0x0a, 0x04, 0x05, 0x03}, + {0x0c, 0x01, 0x0a, 0x0f, 0x09, 0x02, 0x06, 0x08, 0x00, 0x0d, 0x03, 0x04, 0x0e, 0x07, 0x05, 0x0b, + 0x0a, 0x0f, 0x04, 0x02, 0x07, 0x0c, 0x09, 0x05, 0x06, 0x01, 0x0d, 0x0e, 0x00, 0x0b, 0x03, 0x08, + 0x09, 0x0e, 0x0f, 0x05, 0x02, 0x08, 0x0c, 0x03, 0x07, 0x00, 0x04, 0x0a, 0x01, 0x0d, 0x0b, 0x06, + 0x04, 0x03, 0x02, 0x0c, 0x09, 0x05, 0x0f, 0x0a, 0x0b, 0x0e, 0x01, 0x07, 0x06, 0x00, 0x08, 0x0d}, + {0x04, 0x0b, 0x02, 0x0e, 0x0f, 0x00, 0x08, 0x0d, 0x03, 0x0c, 0x09, 0x07, 0x05, 0x0a, 0x06, 0x01, + 0x0d, 0x00, 0x0b, 0x07, 0x04, 0x09, 0x01, 0x0a, 0x0e, 0x03, 0x05, 0x0c, 0x02, 0x0f, 0x08, 0x06, + 0x01, 0x04, 0x0b, 0x0d, 0x0c, 0x03, 0x07, 0x0e, 0x0a, 0x0f, 0x06, 0x08, 0x00, 0x05, 0x09, 0x02, + 0x06, 0x0b, 0x0d, 0x08, 0x01, 0x04, 0x0a, 0x07, 0x09, 0x05, 0x00, 0x0f, 0x0e, 0x02, 0x03, 0x0c}, + {0x0d, 0x02, 0x08, 0x04, 0x06, 0x0f, 0x0b, 0x01, 0x0a, 0x09, 0x03, 0x0e, 0x05, 0x00, 0x0c, 0x07, + 0x01, 0x0f, 0x0d, 0x08, 0x0a, 0x03, 0x07, 0x04, 0x0c, 0x05, 0x06, 0x0b, 0x00, 0x0e, 0x09, 0x02, + 0x07, 0x0b, 0x04, 0x01, 0x09, 0x0c, 0x0e, 0x02, 0x00, 0x06, 0x0a, 0x0d, 0x0f, 0x03, 0x05, 0x08, + 0x02, 0x01, 0x0e, 0x07, 0x04, 0x0a, 0x08, 0x0d, 0x0f, 0x0c, 0x09, 0x00, 0x03, 0x05, 0x06, 0x0b}}; + static const u8 Permutation[] = {0x10, 0x07, 0x14, 0x15, 0x1d, 0x0c, 0x1c, 0x11, 0x01, 0x0f, 0x17, 0x1a, 0x05, 0x12, 0x1f, 0x0a, + 0x02, 0x08, 0x18, 0x0e, 0x20, 0x1b, 0x03, 0x09, 0x13, 0x0d, 0x1e, 0x06, 0x16, 0x0b, 0x04, 0x19}; + static const u8 FP[] = {0x28, 0x08, 0x30, 0x10, 0x38, 0x18, 0x40, 0x20, 0x27, 0x07, 0x2f, 0x0f, 0x37, 0x17, 0x3f, 0x1f, + 0x26, 0x06, 0x2e, 0x0e, 0x36, 0x16, 0x3e, 0x1e, 0x25, 0x05, 0x2d, 0x0d, 0x35, 0x15, 0x3d, 0x1d, + 0x24, 0x04, 0x2c, 0x0c, 0x34, 0x14, 0x3c, 0x1c, 0x23, 0x03, 0x2b, 0x0b, 0x33, 0x13, 0x3b, 0x1b, + 0x22, 0x02, 0x2a, 0x0a, 0x32, 0x12, 0x3a, 0x1a, 0x21, 0x01, 0x29, 0x09, 0x31, 0x11, 0x39, 0x19}; + u32 BitMask_hi, BitMask_lo; + u32 PermutedKeyMask_lo, PermutedKeyMask_hi, Rot2Mask_lo, Rot1Mask_lo, Rot2Mask_hi, Rot1Mask_hi; + u32 BitPerm_lo, BitPerm_hi; + u32 password_lo, password_hi; + u32 key1, key2, key3, key4, input_lo, input_hi; + u32 PermutedKey_lo, PermutedKey_hi, kVal_lo, kVal_hi, PermutedInput_lo, PermutedInput_hi, eVal_lo, eVal_hi, sVal_lo, sVal_hi, pVal_lo, pVal_hi, output_lo, output_hi; + struct KeyPair pairC[17], pairD[17], pairK[17], pairL[17], pairR[17]; + struct KeyPair *pPairC, *pPairD, *pPairK, *pPairL, *pPairR; + unsigned int i, j, k; + int shift; + + //Phase 1 (Permute KEY with Permuted Choice 1) + PermutedKey_lo = 0; + PermutedKey_hi = 0; + BitMask_lo = 0; + BitMask_hi = 0x80000000; + BitPerm_lo = 0; + BitPerm_hi = 0x80000000; + + password_lo = *(const u32 *)password; + password_hi = *(const u32 *)(password + 4); + + for (i = 0; i < 56; i++) { + shift = PC1[i] - 1; + + if ((shift << 26) >= 0) { //0 to 31-bit shift + if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key2 = 0; + key1 = BitMask_hi >> shift; + } + + //If bit (shift) is set, set the current bit. + if (((password_lo & key1) | (password_hi & key2)) != 0) { + PermutedKey_lo |= BitPerm_lo; + PermutedKey_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); + BitPerm_hi >>= 1; + } + + //Phase 2 (Key Schedule Calculation) + //This mask is used to extract the lower 28-bits of a key. + PermutedKeyMask_lo = 0x0FFFFFFF; + PermutedKeyMask_hi = 0x00000000; + + Rot2Mask_lo = 3; + Rot2Mask_hi = 0x00000000; + Rot1Mask_lo = 1; + Rot1Mask_hi = 0x00000000; + + //C-bits, upper 28-bits of Permuted Key + pairC[0].lo = PermutedKey_hi >> 4; + pairC[0].hi = 0; + + //D-bits, lower 28-bits of Permuted Key + pairD[0].lo = ((PermutedKey_lo >> 8) | (PermutedKey_hi << 24)) & PermutedKeyMask_lo; + pairD[0].hi = ((PermutedKey_hi >> 8) & PermutedKeyMask_hi); + + //Calculate all Cn and Dn. + for (i = 0; i < 16; i++) { + if (Rotations[i] != 1) { //Rotate left twice + //hi 26:0 | lo 31:26 + key1 = ((pairC[i].hi << 6) | (pairC[i].lo >> 26)) & Rot2Mask_lo; + //lo 29:0 + //key1|key 4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLXX, where X is from key1 + key4 = pairC[i].lo << 2; + //hi 31:26 + //This part is discarded. + key2 = (pairC[i].hi >> 26) & Rot2Mask_hi; + //hi 29:2 | lo 31:30 + //key2|key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHLL + key3 = (pairC[i].hi << 2) | (pairC[i].lo >> 30); + } else { //Rotate left once + //hi 27:0 | lo 31:27 + key1 = ((pairC[i].hi << 5) | (pairC[i].lo >> 27)) & Rot1Mask_lo; + //lo 30:0 + //key1|key4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLX, where X is from key1 + key4 = pairC[i].lo << 1; + //hi 31:27 + //This part is discarded. + key2 = (pairC[i].hi >> 27) & Rot1Mask_hi; + //hi 30:0 | lo 31:31 + //key2:key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHL + key3 = (pairC[i].hi << 1) | (pairC[i].lo >> 31); + } + + //Merge the two rotated parts together, for the hi and low pair. + //Note: hi contains nothing. + pairC[i + 1].lo = (key1 | key4) & PermutedKeyMask_lo; + pairC[i + 1].hi = (key2 | key3) & PermutedKeyMask_hi; + + if (Rotations[i] != 1) { //Rotate left twice + //hi 26:0 | lo 31:26 + key1 = ((pairD[i].hi << 6) | (pairD[i].lo >> 26)) & Rot2Mask_lo; + //lo 29:0 + //key1|key 4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLXX, where X is from key1 + key4 = pairD[i].lo << 2; + //hi 31:26 + //This part is discarded. + key2 = (pairD[i].hi >> 26) & Rot2Mask_hi; + //hi 29:2 | lo 31:30 + //key2|key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHLL + key3 = (pairD[i].hi << 2) | (pairD[i].lo >> 30); + } else { //Rotate left once + //hi 27:0 | lo 31:27 + key1 = ((pairD[i].hi << 5) | (pairD[i].lo >> 27)) & Rot1Mask_lo; + //lo 30:0 + //key1|key4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLX, where X is from key1 + key4 = pairD[i].lo << 1; + //hi 31:27 + //This part is discarded. + key2 = (pairD[i].hi >> 27) & Rot1Mask_hi; + //hi 30:0 | lo 31:31 + //key2:key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHL + key3 = (pairD[i].hi << 1) | (pairD[i].lo >> 31); + } + + //Merge the two rotated parts together, for the hi and low pair. + //Note: hi contains nothing. + pairD[i + 1].lo = (key1 | key4) & PermutedKeyMask_lo; + pairD[i + 1].hi = (key2 | key3) & PermutedKeyMask_hi; + } + + //Phase 3 + BitMask_lo = 0x00000000; + BitMask_hi = 0x80000000; + + // Determine all K, through the Permutation of CnDn by PC-2 + for (pPairC = &pairC[1], pPairD = &pairD[1], pPairK = &pairK[1]; pPairK < &pairK[17]; pPairC++, pPairD++, pPairK++) { + kVal_lo = 0; + kVal_hi = 0; + BitPerm_lo = 0x00000000; + BitPerm_hi = 0x80000000; + + /* Calculate CnDn: Note: hi of both Cn and Dn are assumed to, and actually contain nothing. lo: (D lo 23:0) | (0 7:0) D lo 23:0 LLLLLLLLLLLLLLLLLLLLLLLL00000000 @@ -272,247 +266,229 @@ static void DESEncryptPassword(u32 id_lo, u32 id_hi, char *password_out, const c l = C lo L = D lo h = C hi H = D hi X = unused bits (28/32-bit value) */ - input_lo = 0 | (pPairD->lo << 8); - input_hi = (pPairC->lo << 4) | (pPairD->hi << 8) | (pPairD->lo >> 24); - - for(i = 0; i < 48; i++) - { - shift = PC2[i] - 1; - - if((shift << 26) >= 0) - { //0 to 31-bit shift - if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key2 = 0; - key1 = BitMask_hi >> shift; - } - - //If bit (shift) is set, set the current bit. - if(((input_lo & key1) | (input_hi & key2)) != 0) - { - kVal_lo |= BitPerm_lo; - kVal_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_hi << 31) | (BitPerm_lo >> 1); - BitPerm_hi >>= 1; - } - - pPairK->lo = kVal_lo; - pPairK->hi = kVal_hi; - } - - //Phase 4 (Enciphering) - BitMask_lo = 0x00000000; - BitMask_hi = 0x80000000; - BitPerm_lo = 0x00000000; - BitPerm_hi = 0x80000000; - PermutedInput_lo = 0; - PermutedInput_hi = 0; - - //Initial Permutation (IP) - for(i = 0; i < 64; i++) - { - shift = IP[i] - 1; - - if((shift << 26) >= 0) - { //0 to 31-bit shift - if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key2 = 0; - key1 = BitMask_hi >> shift; - } - - //If bit (shift) is set, set the current bit. - if(((id_lo & key1) | (id_hi & key2)) != 0) - { - PermutedInput_lo |= BitPerm_lo; - PermutedInput_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); - BitPerm_hi >>= 1; - } - - //Phase 5 (Key-dependent Computation) - BitMask_lo = 0x00000000; - BitMask_hi = 0x80000000; - - //L0 and R0 make up the permuted input block. - //The lo values are not used. - pairL[0].lo = PermutedInput_lo & 0x00000000; - pairL[0].hi = PermutedInput_hi & 0xFFFFFFFF; - pairR[0].lo = 0x00000000; - pairR[0].hi = PermutedInput_lo << 0; - - for (j = 0, k = 1, pPairL = &pairL[1], pPairR = &pairR[1]; pPairR < &pairR[17]; j++, k++, pPairR++, pPairL++) - { - eVal_lo = 0; - eVal_hi = 0; - BitPerm_lo = 0x00000000; - BitPerm_hi = 0x80000000; - - //Ln' = Rn - pPairL->lo = input_lo = pairR[j].lo; - pPairL->hi = input_hi = pairR[j].hi; - - //Calculate E(Rn) - for(i = 0; i < 48; i++) - { - shift = Expansion[i] - 1; - if((shift << 26) >= 0) - { //0 to 31-bit shift - if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key2 = 0; - key1 = BitMask_hi >> shift; - } - - //If bit (shift) is set, set the current bit. - if(((input_lo & key1) | (input_hi & key2)) != 0) - { - eVal_lo |= BitPerm_lo; - eVal_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_hi << 31) | (BitPerm_lo >> 1); - BitPerm_hi >>= 1; - } - - //Phase 6 (Substitution Boxes) - sVal_lo = 0; - sVal_hi = 0; - //Calculate Bn = Kn ^ E(Rn) - //Also, shift the 48-bit Expansion value forward towards position 0. - eVal_lo = (eVal_lo ^ pairK[k].lo) >> 16; - eVal_hi = eVal_hi ^ pairK[k].hi; - eVal_lo |= (eVal_hi << 16); - eVal_hi >>= 16; - - //Calculate Sn(Bn), which is stored in the upper 32-bits of the result. - for(i = 0, shift = 32; i < 8; i++, shift += 4) - { - input_lo = sbox[7 - i][((eVal_lo & 0x20) | ((eVal_lo & 0x3F) >> 1 & 0xF) | ((eVal_lo & 0x3F) << 4 & 0x10))]; - //Shift to the next 6-bit B-block - eVal_lo = (eVal_lo >> 6) | (eVal_hi << 26); - eVal_hi >>= 6; - - input_hi = 0; - if((shift << 26) >= 0) - { //0 to 31-bit shift - if((shift << 26) > 0) //Shift all bits right by shift (hi,lo >> shift) - key3 = (input_hi << shift) | (input_lo >> (-shift)); - else //0-bit shift, which should not happen. - key3 = input_hi << shift; - - key4 = input_lo << shift; - } else { //>31-bit shift - key3 = input_lo << shift; - key4 = 0; - } - - sVal_lo |= key4; - sVal_hi |= key3; - } - - //Phase 7 (Permutation with function P) - pVal_lo = 0; - pVal_hi = 0; - BitPerm_lo = 0x00000000; - BitPerm_hi = 0x80000000; - - //Calculate P(Sn(K ^ E(Rn))) - for(i = 0; i < 32; i++) - { - shift = Permutation[i] - 1; - if((shift << 26) >= 0) - { //0 to 31-bit shift - if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key1 = BitMask_hi >> shift; - key2 = 0; - } - - //If bit (shift) is set, set the current bit. - if(((sVal_lo & key1) | (sVal_hi & key2)) != 0) - { - pVal_lo |= BitPerm_lo; - pVal_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); - BitPerm_hi >>= 1; - } - - //0x00003bc4 - Rn' = Ln ^ f(Rn,Kn) - pPairR->lo = pairL[j].lo ^ pVal_lo; - pPairR->hi = pairL[j].hi ^ pVal_hi; - } - - //Phase 8 (Final Permutation) - output_lo = 0; - output_hi = 0; - BitMask_lo = BitPerm_lo = 0x00000000; - BitMask_hi = BitPerm_hi = 0x80000000; - //Retrieve preoutput blocks - //Ln and Rn lo do not contain anything, hence they are discarded. - input_lo = pairR[16].lo | (pairL[16].hi >> 0); - input_hi = pairR[16].hi | 0; - - //Subject the preoutput to the Final Permutation - for(i = 0; i < 64; i++) - { - shift = FP[i] - 1; - if((shift << 26) >= 0) - { //0 to 31-bit shift - if((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key1 = BitMask_hi >> shift; - key2 = 0; - } - - //If bit (shift) is set, set the current bit. - if(((input_lo & key1) | (input_hi & key2)) != 0) - { - output_lo |= BitPerm_lo; - output_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); - BitPerm_hi >>= 1; - } - - //Encrypted output - *(u32*)password_out = output_lo; - *(u32*)(password_out + 4) = output_hi; + input_lo = 0 | (pPairD->lo << 8); + input_hi = (pPairC->lo << 4) | (pPairD->hi << 8) | (pPairD->lo >> 24); + + for (i = 0; i < 48; i++) { + shift = PC2[i] - 1; + + if ((shift << 26) >= 0) { //0 to 31-bit shift + if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key2 = 0; + key1 = BitMask_hi >> shift; + } + + //If bit (shift) is set, set the current bit. + if (((input_lo & key1) | (input_hi & key2)) != 0) { + kVal_lo |= BitPerm_lo; + kVal_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_hi << 31) | (BitPerm_lo >> 1); + BitPerm_hi >>= 1; + } + + pPairK->lo = kVal_lo; + pPairK->hi = kVal_hi; + } + + //Phase 4 (Enciphering) + BitMask_lo = 0x00000000; + BitMask_hi = 0x80000000; + BitPerm_lo = 0x00000000; + BitPerm_hi = 0x80000000; + PermutedInput_lo = 0; + PermutedInput_hi = 0; + + //Initial Permutation (IP) + for (i = 0; i < 64; i++) { + shift = IP[i] - 1; + + if ((shift << 26) >= 0) { //0 to 31-bit shift + if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key2 = 0; + key1 = BitMask_hi >> shift; + } + + //If bit (shift) is set, set the current bit. + if (((id_lo & key1) | (id_hi & key2)) != 0) { + PermutedInput_lo |= BitPerm_lo; + PermutedInput_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); + BitPerm_hi >>= 1; + } + + //Phase 5 (Key-dependent Computation) + BitMask_lo = 0x00000000; + BitMask_hi = 0x80000000; + + //L0 and R0 make up the permuted input block. + //The lo values are not used. + pairL[0].lo = PermutedInput_lo & 0x00000000; + pairL[0].hi = PermutedInput_hi & 0xFFFFFFFF; + pairR[0].lo = 0x00000000; + pairR[0].hi = PermutedInput_lo << 0; + + for (j = 0, k = 1, pPairL = &pairL[1], pPairR = &pairR[1]; pPairR < &pairR[17]; j++, k++, pPairR++, pPairL++) { + eVal_lo = 0; + eVal_hi = 0; + BitPerm_lo = 0x00000000; + BitPerm_hi = 0x80000000; + + //Ln' = Rn + pPairL->lo = input_lo = pairR[j].lo; + pPairL->hi = input_hi = pairR[j].hi; + + //Calculate E(Rn) + for (i = 0; i < 48; i++) { + shift = Expansion[i] - 1; + if ((shift << 26) >= 0) { //0 to 31-bit shift + if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key2 = 0; + key1 = BitMask_hi >> shift; + } + + //If bit (shift) is set, set the current bit. + if (((input_lo & key1) | (input_hi & key2)) != 0) { + eVal_lo |= BitPerm_lo; + eVal_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_hi << 31) | (BitPerm_lo >> 1); + BitPerm_hi >>= 1; + } + + //Phase 6 (Substitution Boxes) + sVal_lo = 0; + sVal_hi = 0; + //Calculate Bn = Kn ^ E(Rn) + //Also, shift the 48-bit Expansion value forward towards position 0. + eVal_lo = (eVal_lo ^ pairK[k].lo) >> 16; + eVal_hi = eVal_hi ^ pairK[k].hi; + eVal_lo |= (eVal_hi << 16); + eVal_hi >>= 16; + + //Calculate Sn(Bn), which is stored in the upper 32-bits of the result. + for (i = 0, shift = 32; i < 8; i++, shift += 4) { + input_lo = sbox[7 - i][((eVal_lo & 0x20) | ((eVal_lo & 0x3F) >> 1 & 0xF) | ((eVal_lo & 0x3F) << 4 & 0x10))]; + //Shift to the next 6-bit B-block + eVal_lo = (eVal_lo >> 6) | (eVal_hi << 26); + eVal_hi >>= 6; + + input_hi = 0; + if ((shift << 26) >= 0) { //0 to 31-bit shift + if ((shift << 26) > 0) //Shift all bits right by shift (hi,lo >> shift) + key3 = (input_hi << shift) | (input_lo >> (-shift)); + else //0-bit shift, which should not happen. + key3 = input_hi << shift; + + key4 = input_lo << shift; + } else { //>31-bit shift + key3 = input_lo << shift; + key4 = 0; + } + + sVal_lo |= key4; + sVal_hi |= key3; + } + + //Phase 7 (Permutation with function P) + pVal_lo = 0; + pVal_hi = 0; + BitPerm_lo = 0x00000000; + BitPerm_hi = 0x80000000; + + //Calculate P(Sn(K ^ E(Rn))) + for (i = 0; i < 32; i++) { + shift = Permutation[i] - 1; + if ((shift << 26) >= 0) { //0 to 31-bit shift + if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key1 = BitMask_hi >> shift; + key2 = 0; + } + + //If bit (shift) is set, set the current bit. + if (((sVal_lo & key1) | (sVal_hi & key2)) != 0) { + pVal_lo |= BitPerm_lo; + pVal_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); + BitPerm_hi >>= 1; + } + + //0x00003bc4 - Rn' = Ln ^ f(Rn,Kn) + pPairR->lo = pairL[j].lo ^ pVal_lo; + pPairR->hi = pairL[j].hi ^ pVal_hi; + } + + //Phase 8 (Final Permutation) + output_lo = 0; + output_hi = 0; + BitMask_lo = BitPerm_lo = 0x00000000; + BitMask_hi = BitPerm_hi = 0x80000000; + //Retrieve preoutput blocks + //Ln and Rn lo do not contain anything, hence they are discarded. + input_lo = pairR[16].lo | (pairL[16].hi >> 0); + input_hi = pairR[16].hi | 0; + + //Subject the preoutput to the Final Permutation + for (i = 0; i < 64; i++) { + shift = FP[i] - 1; + if ((shift << 26) >= 0) { //0 to 31-bit shift + if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) + key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); + else //0-bit shift, which should not happen. + key1 = BitMask_lo >> shift; + + key2 = BitMask_hi >> shift; + } else { //>31-bit shift + key1 = BitMask_hi >> shift; + key2 = 0; + } + + //If bit (shift) is set, set the current bit. + if (((input_lo & key1) | (input_hi & key2)) != 0) { + output_lo |= BitPerm_lo; + output_hi |= BitPerm_hi; + } + + //Shift all bits left by 1 (hi,lo >> 1) + BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); + BitPerm_hi >>= 1; + } + + //Encrypted output + *(u32 *)password_out = output_lo; + *(u32 *)(password_out + 4) = output_hi; } diff --git a/modules/hdd/libpfs/include/libpfs.h b/modules/hdd/libpfs/include/libpfs.h index 625145712..349390533 100644 --- a/modules/hdd/libpfs/include/libpfs.h +++ b/modules/hdd/libpfs/include/libpfs.h @@ -13,194 +13,206 @@ #define _LIBPFS_H // General constants -#define PFS_BLOCKSIZE 0x2000 -#define PFS_SUPER_MAGIC 0x50465300 // "PFS\0" aka Playstation Filesystem -#define PFS_JOUNRNAL_MAGIC 0x5046534C // "PFSL" aka PFS Log -#define PFS_SEGD_MAGIC 0x53454744 // "SEGD" aka segment descriptor direct -#define PFS_SEGI_MAGIC 0x53454749 // "SEGI" aka segment descriptor indirect -#define PFS_MAX_SUBPARTS 64 -#define PFS_NAME_LEN 255 -#define PFS_VERSION 4 +#define PFS_BLOCKSIZE 0x2000 +#define PFS_SUPER_MAGIC 0x50465300 // "PFS\0" aka Playstation Filesystem +#define PFS_JOUNRNAL_MAGIC 0x5046534C // "PFSL" aka PFS Log +#define PFS_SEGD_MAGIC 0x53454744 // "SEGD" aka segment descriptor direct +#define PFS_SEGI_MAGIC 0x53454749 // "SEGI" aka segment descriptor indirect +#define PFS_MAX_SUBPARTS 64 +#define PFS_NAME_LEN 255 +#define PFS_VERSION 4 // attribute flags -#define PFS_FIO_ATTR_READABLE 0x0001 -#define PFS_FIO_ATTR_WRITEABLE 0x0002 -#define PFS_FIO_ATTR_EXECUTABLE 0x0004 -#define PFS_FIO_ATTR_COPYPROTECT 0x0008 -#define PFS_FIO_ATTR_UNK0010 0x0010 -#define PFS_FIO_ATTR_SUBDIR 0x0020 -#define PFS_FIO_ATTR_UNK0040 0x0040 -#define PFS_FIO_ATTR_CLOSED 0x0080 -#define PFS_FIO_ATTR_UNK0100 0x0100 -#define PFS_FIO_ATTR_UNK0200 0x0200 -#define PFS_FIO_ATTR_UNK0400 0x0400 -#define PFS_FIO_ATTR_PDA 0x0800 -#define PFS_FIO_ATTR_PSX 0x1000 -#define PFS_FIO_ATTR_UNK2000 0x2000 -#define PFS_FIO_ATTR_HIDDEN 0x4000 +#define PFS_FIO_ATTR_READABLE 0x0001 +#define PFS_FIO_ATTR_WRITEABLE 0x0002 +#define PFS_FIO_ATTR_EXECUTABLE 0x0004 +#define PFS_FIO_ATTR_COPYPROTECT 0x0008 +#define PFS_FIO_ATTR_UNK0010 0x0010 +#define PFS_FIO_ATTR_SUBDIR 0x0020 +#define PFS_FIO_ATTR_UNK0040 0x0040 +#define PFS_FIO_ATTR_CLOSED 0x0080 +#define PFS_FIO_ATTR_UNK0100 0x0100 +#define PFS_FIO_ATTR_UNK0200 0x0200 +#define PFS_FIO_ATTR_UNK0400 0x0400 +#define PFS_FIO_ATTR_PDA 0x0800 +#define PFS_FIO_ATTR_PSX 0x1000 +#define PFS_FIO_ATTR_UNK2000 0x2000 +#define PFS_FIO_ATTR_HIDDEN 0x4000 // cache flags (status) -#define PFS_CACHE_FLAG_DIRTY 0x01 -#define PFS_CACHE_FLAG_NOLOAD 0x02 -#define PFS_CACHE_FLAG_MASKSTATUS 0x0F +#define PFS_CACHE_FLAG_DIRTY 0x01 +#define PFS_CACHE_FLAG_NOLOAD 0x02 +#define PFS_CACHE_FLAG_MASKSTATUS 0x0F // cache flags (types) -#define PFS_CACHE_FLAG_NOTHING 0x00 -#define PFS_CACHE_FLAG_SEGD 0x10 -#define PFS_CACHE_FLAG_SEGI 0x20 -#define PFS_CACHE_FLAG_BITMAP 0x40 -#define PFS_CACHE_FLAG_MASKTYPE 0xF0 +#define PFS_CACHE_FLAG_NOTHING 0x00 +#define PFS_CACHE_FLAG_SEGD 0x10 +#define PFS_CACHE_FLAG_SEGI 0x20 +#define PFS_CACHE_FLAG_BITMAP 0x40 +#define PFS_CACHE_FLAG_MASKTYPE 0xF0 // fsck stats -#define PFS_FSCK_STAT_OK 0x00 -#define PFS_FSCK_STAT_WRITE_ERROR 0x01 -#define PFS_FSCK_STAT_ERRORS_FIXED 0x02 +#define PFS_FSCK_STAT_OK 0x00 +#define PFS_FSCK_STAT_WRITE_ERROR 0x01 +#define PFS_FSCK_STAT_ERRORS_FIXED 0x02 // odd and end -#define PFS_MODE_SET_FLAG 0x00 -#define PFS_MODE_REMOVE_FLAG 0x01 -#define PFS_MODE_CHECK_FLAG 0x02 +#define PFS_MODE_SET_FLAG 0x00 +#define PFS_MODE_REMOVE_FLAG 0x01 +#define PFS_MODE_CHECK_FLAG 0x02 // journal/log -typedef struct { - u32 magic; // =PFS_JOUNRNAL_MAGIC - u16 num; // - u16 checksum; // - struct{ - u32 sector; // block/sector for partition - u16 sub; // main(0)/sub(+1) partition - u16 logSector; // block/sector offset in journal area - } log[127]; +typedef struct +{ + u32 magic; // =PFS_JOUNRNAL_MAGIC + u16 num; // + u16 checksum; // + struct + { + u32 sector; // block/sector for partition + u16 sub; // main(0)/sub(+1) partition + u16 logSector; // block/sector offset in journal area + } log[127]; } pfs_journal_t; -typedef struct{ - u8 kLen; // key len/used for offset in to str for value - u8 vLen; // value len - u16 aLen; // allocated length == ((kLen+vLen+7) & ~3) - char str[3]; // size = 3 so sizeof pfs_aentry_t=7 :P +typedef struct +{ + u8 kLen; // key len/used for offset in to str for value + u8 vLen; // value len + u16 aLen; // allocated length == ((kLen+vLen+7) & ~3) + char str[3]; // size = 3 so sizeof pfs_aentry_t=7 :P } pfs_aentry_t; -typedef struct { - u32 inode; - u8 sub; - u8 pLen; // path length - u16 aLen; // allocated length == ((pLen+8+3) & ~3) - char path[512-8]; +typedef struct +{ + u32 inode; + u8 sub; + u8 pLen; // path length + u16 aLen; // allocated length == ((pLen+8+3) & ~3) + char path[512 - 8]; } pfs_dentry_t; // Block number/count pair (used in inodes) -typedef struct { - u32 number; // - u16 subpart; // - u16 count; // +typedef struct +{ + u32 number; // + u16 subpart; // + u16 count; // } pfs_blockinfo_t; // Date/time descriptor -typedef struct { - u8 unused; // - u8 sec; // - u8 min; // - u8 hour; // - u8 day; // - u8 month; // - u16 year; // +typedef struct +{ + u8 unused; // + u8 sec; // + u8 min; // + u8 hour; // + u8 day; // + u8 month; // + u16 year; // } pfs_datetime_t; // Superblock structure -typedef struct { - u32 magic; // - u32 version; // - u32 unknown1; // - u32 pfsFsckStat; // - u32 zone_size; // - u32 num_subs; // number of subs attached to filesystem - pfs_blockinfo_t log; // block info for metadata log - pfs_blockinfo_t root; // block info for root directory +typedef struct +{ + u32 magic; // + u32 version; // + u32 unknown1; // + u32 pfsFsckStat; // + u32 zone_size; // + u32 num_subs; // number of subs attached to filesystem + pfs_blockinfo_t log; // block info for metadata log + pfs_blockinfo_t root; // block info for root directory } pfs_super_block_t; // Inode structure -typedef struct { - u32 checksum; // Sum of all other words in the inode - u32 magic; // - pfs_blockinfo_t inode_block; // start block of inode - pfs_blockinfo_t next_segment; // next segment descriptor inode - pfs_blockinfo_t last_segment; // last segment descriptor inode - pfs_blockinfo_t unused; // - pfs_blockinfo_t data[114]; // - u16 mode; // file mode - u16 attr; // file attributes - u16 uid; // - u16 gid; // - pfs_datetime_t atime; // - pfs_datetime_t ctime; // - pfs_datetime_t mtime; // - u64 size; // - u32 number_blocks; // number of blocks/zones used by file - u32 number_data; // number of used entries in data array - u32 number_segdesg; // number of "indirect blocks"/next segment descriptor's - u32 subpart; // subpart of inode - u32 reserved[4]; // +typedef struct +{ + u32 checksum; // Sum of all other words in the inode + u32 magic; // + pfs_blockinfo_t inode_block; // start block of inode + pfs_blockinfo_t next_segment; // next segment descriptor inode + pfs_blockinfo_t last_segment; // last segment descriptor inode + pfs_blockinfo_t unused; // + pfs_blockinfo_t data[114]; // + u16 mode; // file mode + u16 attr; // file attributes + u16 uid; // + u16 gid; // + pfs_datetime_t atime; // + pfs_datetime_t ctime; // + pfs_datetime_t mtime; // + u64 size; // + u32 number_blocks; // number of blocks/zones used by file + u32 number_data; // number of used entries in data array + u32 number_segdesg; // number of "indirect blocks"/next segment descriptor's + u32 subpart; // subpart of inode + u32 reserved[4]; // } pfs_inode_t; -typedef struct { - char *devName; - int (*transfer)(int fd, void *buffer, /*u16*/u32 sub, u32 sector, u32 size, u32 mode); - u32 (*getSubNumber)(int fd); - u32 (*getSize)(int fd, /*u16*/u32 sub/*0=main 1+=subs*/); - void (*setPartitionError)(int fd); // set open partition as having an error - int (*flushCache)(int fd); +typedef struct +{ + char *devName; + int (*transfer)(int fd, void *buffer, /*u16*/ u32 sub, u32 sector, u32 size, u32 mode); + u32 (*getSubNumber)(int fd); + u32 (*getSize)(int fd, /*u16*/ u32 sub /*0=main 1+=subs*/); + void (*setPartitionError)(int fd); // set open partition as having an error + int (*flushCache)(int fd); } pfs_block_device_t; -typedef struct { - pfs_block_device_t *blockDev; // call table for hdd(hddCallTable) - int fd; // - u32 flags; // rename to attr ones checked - u32 total_sector; // number of sectors in the filesystem - u32 zfree; // zone free - u32 sector_scale; // - u32 inode_scale; // - u32 zsize; // zone size - u32 num_subs; // number of sub partitions in the filesystem - pfs_blockinfo_t root_dir; // block info for root directory - pfs_blockinfo_t log; // block info for the log - pfs_blockinfo_t current_dir; // block info for current directory - u32 lastError; // 0 if no error :) - u16 uid; // - u16 gid; // - u32 free_zone[65]; // free zones in each partition (1 main + 64 possible subs) +typedef struct +{ + pfs_block_device_t *blockDev; // call table for hdd(hddCallTable) + int fd; // + u32 flags; // rename to attr ones checked + u32 total_sector; // number of sectors in the filesystem + u32 zfree; // zone free + u32 sector_scale; // + u32 inode_scale; // + u32 zsize; // zone size + u32 num_subs; // number of sub partitions in the filesystem + pfs_blockinfo_t root_dir; // block info for root directory + pfs_blockinfo_t log; // block info for the log + pfs_blockinfo_t current_dir; // block info for current directory + u32 lastError; // 0 if no error :) + u16 uid; // + u16 gid; // + u32 free_zone[65]; // free zones in each partition (1 main + 64 possible subs) } pfs_mount_t; -typedef struct pfs_cache_s { - struct pfs_cache_s *next; // - struct pfs_cache_s *prev; // - u16 flags; // - u16 nused; // - pfs_mount_t *pfsMount; // - u32 sub; // main(0)/sub(+1) partition - u32 sector; // block/sector for partition - union{ // - void *data; - pfs_inode_t *inode; - pfs_aentry_t *aentry; - pfs_dentry_t *dentry; - pfs_super_block_t *superblock; - u32 *bitmap; - } u; +typedef struct pfs_cache_s +{ + struct pfs_cache_s *next; // + struct pfs_cache_s *prev; // + u16 flags; // + u16 nused; // + pfs_mount_t *pfsMount; // + u32 sub; // main(0)/sub(+1) partition + u32 sector; // block/sector for partition + union + { // + void *data; + pfs_inode_t *inode; + pfs_aentry_t *aentry; + pfs_dentry_t *dentry; + pfs_super_block_t *superblock; + u32 *bitmap; + } u; } pfs_cache_t; typedef struct { - pfs_cache_t *inode; - u32 block_segment; // index into data array in inode structure for current zone segment - u32 block_offset; // block offset from start of current zone segment - u32 byte_offset; // byte offset into current zone + pfs_cache_t *inode; + u32 block_segment; // index into data array in inode structure for current zone segment + u32 block_offset; // block offset from start of current zone segment + u32 byte_offset; // byte offset into current zone } pfs_blockpos_t; /////////////////////////////////////////////////////////////////////////////// // Super Block functions -#define PFS_SUPER_SECTOR 8192 -#define PFS_SUPER_BACKUP_SECTOR 8193 +#define PFS_SUPER_SECTOR 8192 +#define PFS_SUPER_BACKUP_SECTOR 8193 int pfsCheckZoneSize(u32 zone_size); u32 pfsGetBitmapSizeSectors(int zoneScale, u32 partSize); @@ -217,7 +229,7 @@ void pfsCacheFree(pfs_cache_t *clink); void pfsCacheLink(pfs_cache_t *clink, pfs_cache_t *cnew); pfs_cache_t *pfsCacheUnLink(pfs_cache_t *clink); pfs_cache_t *pfsCacheUsedAdd(pfs_cache_t *clink); -int pfsCacheTransfer(pfs_cache_t* clink, int mode); +int pfsCacheTransfer(pfs_cache_t *clink, int mode); void pfsCacheFlushAllDirty(pfs_mount_t *pfsMount); pfs_cache_t *pfsCacheAlloc(pfs_mount_t *pfsMount, u16 sub, u32 scale, int flags, int *result); pfs_cache_t *pfsCacheGetData(pfs_mount_t *pfsMount, u16 sub, u32 scale, int flags, int *result); @@ -230,16 +242,16 @@ void pfsCacheMarkClean(pfs_mount_t *pfsMount, u32 subpart, u32 sectorStart, u32 /////////////////////////////////////////////////////////////////////////////// // Bitmap functions -#define PFS_BITMAP_ALLOC 0 -#define PFS_BITMAP_FREE 1 +#define PFS_BITMAP_ALLOC 0 +#define PFS_BITMAP_FREE 1 typedef struct { - u32 chunk; - u32 index; - u32 bit; - u32 partitionChunks; - u32 partitionRemainder; + u32 chunk; + u32 index; + u32 bit; + u32 partitionChunks; + u32 partitionRemainder; } pfs_bitmapInfo_t; void pfsBitmapSetupInfo(pfs_mount_t *pfsMount, pfs_bitmapInfo_t *info, u32 subpart, u32 number); @@ -260,7 +272,7 @@ u32 pfsBlockSyncPos(pfs_blockpos_t *blockpos, u64 size); int pfsBlockInitPos(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u64 position); int pfsBlockExpandSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 count); int pfsBlockAllocNewSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 blocks); -pfs_blockinfo_t* pfsBlockGetCurrent(pfs_blockpos_t *blockpos); +pfs_blockinfo_t *pfsBlockGetCurrent(pfs_blockpos_t *blockpos); pfs_cache_t *pfsBlockGetNextSegment(pfs_cache_t *clink, int *result); pfs_cache_t *pfsBlockGetLastSegmentDescriptorInode(pfs_cache_t *clink, int *result); @@ -274,7 +286,7 @@ pfs_cache_t *pfsDirAddEntry(pfs_cache_t *dir, char *filename, pfs_blockinfo_t *b pfs_cache_t *pfsDirRemoveEntry(pfs_cache_t *clink, char *path); int pfsCheckDirForFiles(pfs_cache_t *clink); void pfsFillSelfAndParentDentries(pfs_cache_t *clink, pfs_blockinfo_t *self, pfs_blockinfo_t *parent); -pfs_cache_t* pfsSetDentryParent(pfs_cache_t *clink, pfs_blockinfo_t *bi, int *result); +pfs_cache_t *pfsSetDentryParent(pfs_cache_t *clink, pfs_blockinfo_t *bi, int *result); pfs_cache_t *pfsInodeGetFileInDir(pfs_cache_t *dirInode, char *path, int *result); pfs_cache_t *pfsInodeGetFile(pfs_mount_t *pfsMount, pfs_cache_t *clink, const char *name, int *result); void pfsInodeFill(pfs_cache_t *ci, pfs_blockinfo_t *bi, u16 mode, u16 uid, u16 gid); @@ -282,7 +294,7 @@ int pfsInodeRemove(pfs_cache_t *parent, pfs_cache_t *inode, char *path); pfs_cache_t *pfsInodeGetParent(pfs_mount_t *pfsMount, pfs_cache_t *clink, const char *filename, char *path, int *result); pfs_cache_t *pfsInodeCreate(pfs_cache_t *clink, u16 mode, u16 uid, u16 gid, int *result); int pfsCheckAccess(pfs_cache_t *clink, int flags); -char* pfsSplitPath(char *filename, char *path, int *result); +char *pfsSplitPath(char *filename, char *path, int *result); u16 pfsGetMaxIndex(pfs_mount_t *pfsMount); int pfsAllocZones(pfs_cache_t *clink, int msize, int mode); diff --git a/modules/hdd/libpfs/src/bitmap.c b/modules/hdd/libpfs/src/bitmap.c index 6e8e6f7e6..e9e3b20c3 100644 --- a/modules/hdd/libpfs/src/bitmap.c +++ b/modules/hdd/libpfs/src/bitmap.c @@ -23,200 +23,186 @@ u32 pfsBitsPerBitmapChunk = 8192; // number of bitmap bits in each bitmap data c void pfsBitmapSetupInfo(pfs_mount_t *pfsMount, pfs_bitmapInfo_t *info, u32 subpart, u32 number) { - u32 size; + u32 size; - size = pfsMount->blockDev->getSize(pfsMount->fd, subpart) >> pfsMount->sector_scale; + size = pfsMount->blockDev->getSize(pfsMount->fd, subpart) >> pfsMount->sector_scale; - info->chunk = number / pfsBitsPerBitmapChunk; - info->bit = number & 31; - info->index = (number % pfsBitsPerBitmapChunk) / 32; - info->partitionChunks = size / pfsBitsPerBitmapChunk; - info->partitionRemainder = size % pfsBitsPerBitmapChunk; + info->chunk = number / pfsBitsPerBitmapChunk; + info->bit = number & 31; + info->index = (number % pfsBitsPerBitmapChunk) / 32; + info->partitionChunks = size / pfsBitsPerBitmapChunk; + info->partitionRemainder = size % pfsBitsPerBitmapChunk; } // Allocates or frees (depending on operation) the bitmap area starting at chunk/index/bit, of size count void pfsBitmapAllocFree(pfs_cache_t *clink, u32 operation, u32 subpart, u32 chunk, u32 index, u32 _bit, u32 count) { - int result; - u32 sector, bit; - - while (clink) - { - for ( ; index < (pfsMetaSize / 4) && count; index++, _bit = 0) - { - for (bit = _bit; bit < 32 && count; bit++, count--) - { - if(operation == PFS_BITMAP_ALLOC) - { - if (clink->u.bitmap[index] & (1 << bit)) - PFS_PRINTF(PFS_DRV_NAME": Error: Tried to allocate used block!\n"); - - clink->u.bitmap[index] |= (1 << bit); - } - else - { - if ((clink->u.bitmap[index] & (1 << bit))==0) - PFS_PRINTF(PFS_DRV_NAME": Error: Tried to free unused block!\n"); - - clink->u.bitmap[index] &= ~(1 << bit); - } - } - } - - index = 0; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(clink); - - if (count==0) - break; - - chunk++; - - sector = (1 << clink->pfsMount->inode_scale) + chunk; - if(subpart==0) - sector += 0x2000 >> pfsBlockSize; - - clink = pfsCacheGetData(clink->pfsMount, subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - } + int result; + u32 sector, bit; + + while (clink) { + for (; index < (pfsMetaSize / 4) && count; index++, _bit = 0) { + for (bit = _bit; bit < 32 && count; bit++, count--) { + if (operation == PFS_BITMAP_ALLOC) { + if (clink->u.bitmap[index] & (1 << bit)) + PFS_PRINTF(PFS_DRV_NAME ": Error: Tried to allocate used block!\n"); + + clink->u.bitmap[index] |= (1 << bit); + } else { + if ((clink->u.bitmap[index] & (1 << bit)) == 0) + PFS_PRINTF(PFS_DRV_NAME ": Error: Tried to free unused block!\n"); + + clink->u.bitmap[index] &= ~(1 << bit); + } + } + } + + index = 0; + clink->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(clink); + + if (count == 0) + break; + + chunk++; + + sector = (1 << clink->pfsMount->inode_scale) + chunk; + if (subpart == 0) + sector += 0x2000 >> pfsBlockSize; + + clink = pfsCacheGetData(clink->pfsMount, subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); + } } // Attempts to allocate 'count' more continuous zones for 'bi' int pfsBitmapAllocateAdditionalZones(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 count) { - int result; - pfs_bitmapInfo_t info; - pfs_cache_t *c; - int res=0; - - pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number+bi->count); - - // Make sure we're not trying to allocate more than is possible - if (65535-bi->count < count) - count=65535-bi->count; - - // Loop over each bitmap chunk (each is 1024 bytes in size) until either we have allocated - // the requested amount of blocks, or until we have run out of space on the current partition - while ((((info.partitionRemainder==0) && (info.chunk < info.partitionChunks )) || - ((info.partitionRemainder!=0) && (info.chunk < info.partitionChunks+1))) && count) - { - u32 sector=(1<inode_scale) + info.chunk; - - // if main partition, add offset (in units of blocks) - if (bi->subpart==0) - sector += 0x2000 >> pfsBlockSize; - - // Read the bitmap chunk from the hdd - c=pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - if (c==0)break; - - // Loop over each 32-bit word in the current bitmap chunk until - // we find a used zone or we've allocated all the zones we need - while ((info.index < (info.chunk==info.partitionChunks ? info.partitionRemainder / 32 : pfsMetaSize / 4)) && count) - { - // Loop over each of the 32 bits in the current word from the current bitmap chunk, - // trying to allocate the requested number of zones - for ( ; (info.bit < 32) && count; count--) - { - // We only want to allocate a continuous area, so if we come - // accross a used zone bail - if (c->u.bitmap[info.index] & (1<u.bitmap[info.index] |= 1<flags |= PFS_CACHE_FLAG_DIRTY; - } - - info.index++; - info.bit=0; - } - pfsCacheFree(c); - info.index=0; - info.chunk++; - } + int result; + pfs_bitmapInfo_t info; + pfs_cache_t *c; + int res = 0; + + pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number + bi->count); + + // Make sure we're not trying to allocate more than is possible + if (65535 - bi->count < count) + count = 65535 - bi->count; + + // Loop over each bitmap chunk (each is 1024 bytes in size) until either we have allocated + // the requested amount of blocks, or until we have run out of space on the current partition + while ((((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks)) || + ((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1))) && + count) { + u32 sector = (1 << pfsMount->inode_scale) + info.chunk; + + // if main partition, add offset (in units of blocks) + if (bi->subpart == 0) + sector += 0x2000 >> pfsBlockSize; + + // Read the bitmap chunk from the hdd + c = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); + if (c == 0) + break; + + // Loop over each 32-bit word in the current bitmap chunk until + // we find a used zone or we've allocated all the zones we need + while ((info.index < (info.chunk == info.partitionChunks ? info.partitionRemainder / 32 : pfsMetaSize / 4)) && count) { + // Loop over each of the 32 bits in the current word from the current bitmap chunk, + // trying to allocate the requested number of zones + for (; (info.bit < 32) && count; count--) { + // We only want to allocate a continuous area, so if we come + // accross a used zone bail + if (c->u.bitmap[info.index] & (1 << info.bit)) { + pfsCacheFree(c); + goto exit; + } + + // If the current bit in the bitmap is marked as free, mark it was used + res++; + c->u.bitmap[info.index] |= 1 << info.bit; + info.bit++; + c->flags |= PFS_CACHE_FLAG_DIRTY; + } + + info.index++; + info.bit = 0; + } + pfsCacheFree(c); + info.index = 0; + info.chunk++; + } exit: - // Adjust global free zone counts - pfsMount->free_zone[bi->subpart]-=res; - pfsMount->zfree-=res; - return res; + // Adjust global free zone counts + pfsMount->free_zone[bi->subpart] -= res; + pfsMount->zfree -= res; + return res; } // Searches for 'amount' free zones, starting from the position specified in 'bi'. // Returns 1 if allocation was successful, otherwise 0. int pfsBitmapAllocZones(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 amount) { - pfs_bitmapInfo_t info; - int result; - u32 startBit = 0, startPos = 0, startChunk = 0, count = 0; - u32 sector; - pfs_cache_t *bitmap; - u32 *bitmapEnd, *bitmapWord; - u32 i; - - pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number); - - for ( ; ((info.partitionRemainder==0) && (info.chunk < info.partitionChunks))|| - ((info.partitionRemainder!=0) && (info.chunk < info.partitionChunks+1)); info.chunk++){ - - sector = info.chunk + (1 << pfsMount->inode_scale); - if(bi->subpart==0) - sector += 0x2000 >> pfsBlockSize; - - // read in the bitmap chunk - bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - if(bitmap==0) - return 0; - - bitmapEnd=bitmap->u.bitmap + - (info.chunk == info.partitionChunks ? info.partitionRemainder / 32 : pfsMetaSize / 4); - - for (bitmapWord=bitmap->u.bitmap + info.index; bitmapWord < bitmapEnd; info.bit=0, bitmapWord++) - { - for (i=info.bit; i < 32; i++) - { - // if this bit is marked as free.. - if (((*bitmapWord >> i) & 1)==0) - { - if (count==0) - { - startBit = i; - startChunk = info.chunk; - startPos = bitmapWord - bitmap->u.bitmap; - } - if (++count == amount) - { - bi->number = (startPos * 32) + (startChunk * pfsBitsPerBitmapChunk) + startBit; - if (count < bi->count) - bi->count=count; - - if (bitmap->sector != (startChunk + (1 << pfsMount->inode_scale))) - { - pfsCacheFree(bitmap); - sector = (1 << pfsMount->inode_scale) + startChunk; - if(bi->subpart==0) - sector += 0x2000 >> pfsBlockSize; - - bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - } - - pfsBitmapAllocFree(bitmap, PFS_BITMAP_ALLOC, bi->subpart, startChunk, startPos, startBit, bi->count); - return 1; - } - } - else - count=0; - } - } - pfsCacheFree(bitmap); - info.index=0; - } - return 0; + pfs_bitmapInfo_t info; + int result; + u32 startBit = 0, startPos = 0, startChunk = 0, count = 0; + u32 sector; + pfs_cache_t *bitmap; + u32 *bitmapEnd, *bitmapWord; + u32 i; + + pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number); + + for (; ((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks)) || + ((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1)); + info.chunk++) { + + sector = info.chunk + (1 << pfsMount->inode_scale); + if (bi->subpart == 0) + sector += 0x2000 >> pfsBlockSize; + + // read in the bitmap chunk + bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); + if (bitmap == 0) + return 0; + + bitmapEnd = bitmap->u.bitmap + + (info.chunk == info.partitionChunks ? info.partitionRemainder / 32 : pfsMetaSize / 4); + + for (bitmapWord = bitmap->u.bitmap + info.index; bitmapWord < bitmapEnd; info.bit = 0, bitmapWord++) { + for (i = info.bit; i < 32; i++) { + // if this bit is marked as free.. + if (((*bitmapWord >> i) & 1) == 0) { + if (count == 0) { + startBit = i; + startChunk = info.chunk; + startPos = bitmapWord - bitmap->u.bitmap; + } + if (++count == amount) { + bi->number = (startPos * 32) + (startChunk * pfsBitsPerBitmapChunk) + startBit; + if (count < bi->count) + bi->count = count; + + if (bitmap->sector != (startChunk + (1 << pfsMount->inode_scale))) { + pfsCacheFree(bitmap); + sector = (1 << pfsMount->inode_scale) + startChunk; + if (bi->subpart == 0) + sector += 0x2000 >> pfsBlockSize; + + bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); + } + + pfsBitmapAllocFree(bitmap, PFS_BITMAP_ALLOC, bi->subpart, startChunk, startPos, startBit, bi->count); + return 1; + } + } else + count = 0; + } + } + pfsCacheFree(bitmap); + info.index = 0; + } + return 0; } // Searches for 'max_count' free zones over all the partitions, and @@ -224,158 +210,147 @@ int pfsBitmapAllocZones(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 amount) // not be allocated. int pfsBitmapSearchFreeZone(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 max_count) { - u32 num, count, n; - - num = pfsMount->num_subs + 1; - - if (bi->subpart > pfsMount->num_subs) - bi->subpart = 0; - if (bi->number) - num = pfsMount->num_subs + 2; - - count = max_count < 33 ? max_count : 32; //min(max_count, 32) - count = count < bi->count ? bi->count : count; //max(count, bi->count) - // => count = bound(bi->count, 32); - for(; num >= 0; num--) - { - for (n = count; n; n /= 2) - { - if ((pfsMount->free_zone[bi->subpart] >= n) && - pfsBitmapAllocZones(pfsMount, bi, n)) - { - pfsMount->free_zone[bi->subpart] -= bi->count; - pfsMount->zfree -= bi->count; - return 0; // the good exit ;) - } - } - - bi->number=0; - bi->subpart++; - - if(bi->subpart == pfsMount->num_subs + 1) - bi->subpart=0; - } - return -ENOSPC; + u32 num, count, n; + + num = pfsMount->num_subs + 1; + + if (bi->subpart > pfsMount->num_subs) + bi->subpart = 0; + if (bi->number) + num = pfsMount->num_subs + 2; + + count = max_count < 33 ? max_count : 32; //min(max_count, 32) + count = count < bi->count ? bi->count : count; //max(count, bi->count) + // => count = bound(bi->count, 32); + for (; num >= 0; num--) { + for (n = count; n; n /= 2) { + if ((pfsMount->free_zone[bi->subpart] >= n) && + pfsBitmapAllocZones(pfsMount, bi, n)) { + pfsMount->free_zone[bi->subpart] -= bi->count; + pfsMount->zfree -= bi->count; + return 0; // the good exit ;) + } + } + + bi->number = 0; + bi->subpart++; + + if (bi->subpart == pfsMount->num_subs + 1) + bi->subpart = 0; + } + return -ENOSPC; } // De-allocates the block segment 'bi' in the bitmaps void pfsBitmapFreeBlockSegment(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi) { - pfs_bitmapInfo_t info; - pfs_cache_t *clink; - u32 sector; - int rv; - - pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number); - - sector = (1 << pfsMount->inode_scale) + info.chunk; - if(bi->subpart==0) - sector += 0x2000 >> pfsBlockSize; - - if((clink=pfsCacheGetData(pfsMount, (u16)bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &rv)) != NULL) - { - pfsBitmapAllocFree(clink, PFS_BITMAP_FREE, bi->subpart, info.chunk, info.index, info.bit, bi->count); - pfsMount->free_zone[(u16)bi->subpart]+=bi->count; - pfsMount->zfree+=bi->count; - } + pfs_bitmapInfo_t info; + pfs_cache_t *clink; + u32 sector; + int rv; + + pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number); + + sector = (1 << pfsMount->inode_scale) + info.chunk; + if (bi->subpart == 0) + sector += 0x2000 >> pfsBlockSize; + + if ((clink = pfsCacheGetData(pfsMount, (u16)bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &rv)) != NULL) { + pfsBitmapAllocFree(clink, PFS_BITMAP_FREE, bi->subpart, info.chunk, info.index, info.bit, bi->count); + pfsMount->free_zone[(u16)bi->subpart] += bi->count; + pfsMount->zfree += bi->count; + } } // Returns the number of free zones for the partition 'sub' int pfsBitmapCalcFreeZones(pfs_mount_t *pfsMount, int sub) { - // "Free zone" map. Used to get number of free zone in bitmap, 4-bits at a time - u32 pfsFreeZoneBitmap[16]={4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; - int result; - pfs_bitmapInfo_t info; - pfs_cache_t *clink; - u32 i, bitmapSize, zoneFree=0, sector; - - pfsBitmapSetupInfo(pfsMount, &info, sub, 0); - - while (((info.partitionRemainder!=0) && (info.chunk>3 : pfsMetaSize; - - sector = (1<inode_scale) + info.chunk; - if (sub==0) - sector +=0x2000>>pfsBlockSize; - - if ((clink=pfsCacheGetData(pfsMount, sub, sector, PFS_CACHE_FLAG_BITMAP, &result))) - { - for (i=0; iu.bitmap)[i] & 0xF] - +pfsFreeZoneBitmap[((u8*)clink->u.bitmap)[i] >> 4]; - } - - pfsCacheFree(clink); - } - info.chunk++; - } - - return zoneFree; + // "Free zone" map. Used to get number of free zone in bitmap, 4-bits at a time + u32 pfsFreeZoneBitmap[16] = {4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; + int result; + pfs_bitmapInfo_t info; + pfs_cache_t *clink; + u32 i, bitmapSize, zoneFree = 0, sector; + + pfsBitmapSetupInfo(pfsMount, &info, sub, 0); + + while (((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1)) || + ((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks))) { + bitmapSize = info.chunk == info.partitionChunks ? info.partitionRemainder >> 3 : pfsMetaSize; + + sector = (1 << pfsMount->inode_scale) + info.chunk; + if (sub == 0) + sector += 0x2000 >> pfsBlockSize; + + if ((clink = pfsCacheGetData(pfsMount, sub, sector, PFS_CACHE_FLAG_BITMAP, &result))) { + for (i = 0; i < bitmapSize; i++) { + zoneFree += pfsFreeZoneBitmap[((u8 *)clink->u.bitmap)[i] & 0xF] + pfsFreeZoneBitmap[((u8 *)clink->u.bitmap)[i] >> 4]; + } + + pfsCacheFree(clink); + } + info.chunk++; + } + + return zoneFree; } // Debugging function, prints bitmap information void pfsBitmapShow(pfs_mount_t *pfsMount) { - int result; - pfs_bitmapInfo_t info; - u32 pn, bitcnt; - - for (pn=0; pn < pfsMount->num_subs+1; pn++) - { - bitcnt=pfsBitsPerBitmapChunk; - pfsBitmapSetupInfo(pfsMount, &info, pn, 0); - - while (((info.partitionRemainder!=0) && (info.chunkinode_scale) + info.chunk; - u32 i; - - if(pn==0) - sector += 0x2000 >> pfsBlockSize; - clink=pfsCacheGetData(pfsMount, pn, sector, PFS_CACHE_FLAG_BITMAP, &result); - - if (info.chunk == info.partitionChunks) - bitcnt=info.partitionRemainder; - - PFS_PRINTF(PFS_DRV_NAME": Zone show: pn %ld, bn %ld, bitcnt %ld\n", pn, info.chunk, bitcnt); - - for(i=0; (i < (1<u.bitmap+128*i); - - pfsCacheFree(clink); - info.chunk++; - } - } + int result; + pfs_bitmapInfo_t info; + u32 pn, bitcnt; + + for (pn = 0; pn < pfsMount->num_subs + 1; pn++) { + bitcnt = pfsBitsPerBitmapChunk; + pfsBitmapSetupInfo(pfsMount, &info, pn, 0); + + while (((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1)) || + ((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks))) { + pfs_cache_t *clink; + u32 sector = (1 << pfsMount->inode_scale) + info.chunk; + u32 i; + + if (pn == 0) + sector += 0x2000 >> pfsBlockSize; + clink = pfsCacheGetData(pfsMount, pn, sector, PFS_CACHE_FLAG_BITMAP, &result); + + if (info.chunk == info.partitionChunks) + bitcnt = info.partitionRemainder; + + PFS_PRINTF(PFS_DRV_NAME ": Zone show: pn %ld, bn %ld, bitcnt %ld\n", pn, info.chunk, bitcnt); + + for (i = 0; (i < (1 << pfsBlockSize)) && ((i * 512) < (bitcnt / 8)); i++) + pfsPrintBitmap(clink->u.bitmap + 128 * i); + + pfsCacheFree(clink); + info.chunk++; + } + } } // Free's all blocks allocated to an inode void pfsBitmapFreeInodeBlocks(pfs_cache_t *clink) { - pfs_mount_t *pfsMount=clink->pfsMount; - u32 i; - - pfsCacheUsedAdd(clink); - for(i=0;i < clink->u.inode->number_data; i++) - { - u32 index = pfsFixIndex(i); - pfs_blockinfo_t *bi=&clink->u.inode->data[index]; - int err; - - if(i!=0) { - if(index==0) - if((clink = pfsBlockGetNextSegment(clink, &err))==NULL) - return; - } - - pfsBitmapFreeBlockSegment(pfsMount, bi); - pfsCacheMarkClean(pfsMount, (u16)bi->subpart, bi->number << pfsMount->inode_scale, - (bi->number + bi->count) << pfsMount->inode_scale); - } - pfsCacheFree(clink); + pfs_mount_t *pfsMount = clink->pfsMount; + u32 i; + + pfsCacheUsedAdd(clink); + for (i = 0; i < clink->u.inode->number_data; i++) { + u32 index = pfsFixIndex(i); + pfs_blockinfo_t *bi = &clink->u.inode->data[index]; + int err; + + if (i != 0) { + if (index == 0) + if ((clink = pfsBlockGetNextSegment(clink, &err)) == NULL) + return; + } + + pfsBitmapFreeBlockSegment(pfsMount, bi); + pfsCacheMarkClean(pfsMount, (u16)bi->subpart, bi->number << pfsMount->inode_scale, + (bi->number + bi->count) << pfsMount->inode_scale); + } + pfsCacheFree(clink); } diff --git a/modules/hdd/libpfs/src/block.c b/modules/hdd/libpfs/src/block.c index c67e6c8f5..7e8e367df 100644 --- a/modules/hdd/libpfs/src/block.c +++ b/modules/hdd/libpfs/src/block.c @@ -20,76 +20,72 @@ // Returns the next block descriptor inode pfs_cache_t *pfsBlockGetNextSegment(pfs_cache_t *clink, int *result) { - pfsCacheFree(clink); + pfsCacheFree(clink); - if (clink->u.inode->next_segment.number) - return pfsCacheGetData(clink->pfsMount, - clink->u.inode->next_segment.subpart, - clink->u.inode->next_segment.number << clink->pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGI, result); + if (clink->u.inode->next_segment.number) + return pfsCacheGetData(clink->pfsMount, + clink->u.inode->next_segment.subpart, + clink->u.inode->next_segment.number << clink->pfsMount->inode_scale, + PFS_CACHE_FLAG_SEGI, result); - PFS_PRINTF(PFS_DRV_NAME": Error: There is no next segment descriptor\n"); - *result=-EINVAL; - return NULL; + PFS_PRINTF(PFS_DRV_NAME ": Error: There is no next segment descriptor\n"); + *result = -EINVAL; + return NULL; } // Sets 'blockpos' to point to the next block segment for the inode (and moves onto the // next block descriptor inode if necessary) int pfsBlockSeekNextSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos) { - pfs_cache_t *nextSegment; - int result=0; + pfs_cache_t *nextSegment; + int result = 0; - if (blockpos->byte_offset) - { - PFS_PRINTF(PFS_DRV_NAME": Panic: This is a bug!\n"); - return -1; - } + if (blockpos->byte_offset) { + PFS_PRINTF(PFS_DRV_NAME ": Panic: This is a bug!\n"); + return -1; + } - // If we're at the end of the block descriptor array for the current - // inode, then move onto the next inode - if (pfsFixIndex(blockpos->block_segment+1)==0) - { - if ((nextSegment=pfsBlockGetNextSegment(pfsCacheUsedAdd(blockpos->inode), &result)) == NULL) - return result; - pfsCacheFree(blockpos->inode); - blockpos->inode=nextSegment; - if (clink->u.inode->number_data-1 == ++blockpos->block_segment) - return -EINVAL; - } + // If we're at the end of the block descriptor array for the current + // inode, then move onto the next inode + if (pfsFixIndex(blockpos->block_segment + 1) == 0) { + if ((nextSegment = pfsBlockGetNextSegment(pfsCacheUsedAdd(blockpos->inode), &result)) == NULL) + return result; + pfsCacheFree(blockpos->inode); + blockpos->inode = nextSegment; + if (clink->u.inode->number_data - 1 == ++blockpos->block_segment) + return -EINVAL; + } - blockpos->block_offset=0; - blockpos->block_segment++; - return result; + blockpos->block_offset = 0; + blockpos->block_segment++; + return result; } u32 pfsBlockSyncPos(pfs_blockpos_t *blockpos, u64 size) { - u32 i; + u32 i; - i = (u32)(size / blockpos->inode->pfsMount->zsize); - blockpos->byte_offset += size % blockpos->inode->pfsMount->zsize; + i = (u32)(size / blockpos->inode->pfsMount->zsize); + blockpos->byte_offset += size % blockpos->inode->pfsMount->zsize; - if (blockpos->byte_offset >= blockpos->inode->pfsMount->zsize) - { - blockpos->byte_offset -= blockpos->inode->pfsMount->zsize; - i++; - } - return i; + if (blockpos->byte_offset >= blockpos->inode->pfsMount->zsize) { + blockpos->byte_offset -= blockpos->inode->pfsMount->zsize; + i++; + } + return i; } int pfsBlockInitPos(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u64 position) { - blockpos->inode=pfsCacheUsedAdd(clink); - blockpos->byte_offset=0; + blockpos->inode = pfsCacheUsedAdd(clink); + blockpos->byte_offset = 0; - if (clink->u.inode->size) - { - blockpos->block_segment=1; - blockpos->block_offset=0; - }else{ - blockpos->block_segment=0; - blockpos->block_offset=1; - } - return pfsInodeSync(blockpos, position, clink->u.inode->number_data); + if (clink->u.inode->size) { + blockpos->block_segment = 1; + blockpos->block_offset = 0; + } else { + blockpos->block_segment = 0; + blockpos->block_offset = 1; + } + return pfsInodeSync(blockpos, position, clink->u.inode->number_data); } diff --git a/modules/hdd/libpfs/src/blockWrite.c b/modules/hdd/libpfs/src/blockWrite.c index d31c3a4b2..ca63314e9 100644 --- a/modules/hdd/libpfs/src/blockWrite.c +++ b/modules/hdd/libpfs/src/blockWrite.c @@ -20,123 +20,122 @@ // Attempt to expand the block segment 'blockpos' by 'count' blocks int pfsBlockExpandSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 count) { - int ret; - pfs_blockinfo_t *bi; + int ret; + pfs_blockinfo_t *bi; - if(pfsFixIndex(blockpos->block_segment)==0) - return 0; + if (pfsFixIndex(blockpos->block_segment) == 0) + return 0; - bi = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; + bi = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; - if ((ret = pfsBitmapAllocateAdditionalZones(clink->pfsMount, bi, count))) - { - bi->count+=ret; - clink->u.inode->number_blocks+=ret; - blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - } + if ((ret = pfsBitmapAllocateAdditionalZones(clink->pfsMount, bi, count))) { + bi->count += ret; + clink->u.inode->number_blocks += ret; + blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; + clink->flags |= PFS_CACHE_FLAG_DIRTY; + } - return ret; + return ret; } // Attempts to allocate 'blocks' new blocks for an inode int pfsBlockAllocNewSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 blocks) { - pfs_blockinfo_t bi, *bi2; - int result=0; - pfs_mount_t *pfsMount=clink->pfsMount; - u32 i, old_blocks = blocks; - - if (pfsCacheIsFull()) - return -ENOMEM; - - // create "indirect segment descriptor" if necessary - if (pfsFixIndex(clink->u.inode->number_data) == 0) - { - pfs_cache_t *clink2; - - bi2 = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; - bi.subpart=bi2->subpart; - bi.count=1; - bi.number=bi2->number+bi2->count; - result=pfsBitmapSearchFreeZone(pfsMount, &bi, clink->u.inode->number_blocks); - if (result<0) - { - PFS_PRINTF(PFS_DRV_NAME": Error: Couldnt allocate zone! (1)\n"); - return result; - } - - clink2=pfsCacheGetData(pfsMount, bi.subpart, bi.number << pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGI | PFS_CACHE_FLAG_NOLOAD, &result); - memset(clink2->u.inode, 0, sizeof(pfs_inode_t)); - clink2->u.inode->magic=PFS_SEGI_MAGIC; - - memcpy(&clink2->u.inode->inode_block, &clink->u.inode->inode_block, sizeof(pfs_blockinfo_t)); - memcpy(&clink2->u.inode->last_segment, blockpos->inode->u.inode->data, sizeof(pfs_blockinfo_t)); - memcpy(clink2->u.inode->data, &bi, sizeof(pfs_blockinfo_t)); - - clink2->flags |= PFS_CACHE_FLAG_DIRTY; - - clink->u.inode->number_blocks+=bi.count; - clink->u.inode->number_data++; - - memcpy(&clink->u.inode->last_segment, &bi, sizeof(pfs_blockinfo_t)); - - clink->u.inode->number_segdesg++; - - clink->flags |= PFS_CACHE_FLAG_DIRTY; - blockpos->block_segment++; - blockpos->block_offset=0; - - memcpy(&blockpos->inode->u.inode->next_segment, &bi, sizeof(pfs_blockinfo_t)); - - blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(blockpos->inode); - blockpos->inode=clink2; - } - - bi2 = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; - bi.subpart = bi2->subpart; - bi.count = blocks; - bi.number = bi2->number + bi2->count; - - result = pfsBitmapSearchFreeZone(pfsMount, &bi, clink->u.inode->number_blocks); - if(result < 0) - { - PFS_PRINTF(PFS_DRV_NAME": Error: Couldnt allocate zone! (2)\n"); - return result; - } - - clink->u.inode->number_blocks += bi.count; - clink->u.inode->number_data++; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - blockpos->block_offset=0; - blockpos->block_segment++; - - i = pfsFixIndex(clink->u.inode->number_data-1); - memcpy(&blockpos->inode->u.inode->data[i], &bi, sizeof(pfs_blockinfo_t)); - - blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; - blocks -= bi.count; - if (blocks) - blocks -= pfsBlockExpandSegment(clink, blockpos, blocks); - - return old_blocks - blocks; + pfs_blockinfo_t bi, *bi2; + int result = 0; + pfs_mount_t *pfsMount = clink->pfsMount; + u32 i, old_blocks = blocks; + + if (pfsCacheIsFull()) + return -ENOMEM; + + // create "indirect segment descriptor" if necessary + if (pfsFixIndex(clink->u.inode->number_data) == 0) { + pfs_cache_t *clink2; + + bi2 = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; + bi.subpart = bi2->subpart; + bi.count = 1; + bi.number = bi2->number + bi2->count; + result = pfsBitmapSearchFreeZone(pfsMount, &bi, clink->u.inode->number_blocks); + if (result < 0) { + PFS_PRINTF(PFS_DRV_NAME ": Error: Couldnt allocate zone! (1)\n"); + return result; + } + + clink2 = pfsCacheGetData(pfsMount, bi.subpart, bi.number << pfsMount->inode_scale, + PFS_CACHE_FLAG_SEGI | PFS_CACHE_FLAG_NOLOAD, &result); + memset(clink2->u.inode, 0, sizeof(pfs_inode_t)); + clink2->u.inode->magic = PFS_SEGI_MAGIC; + + memcpy(&clink2->u.inode->inode_block, &clink->u.inode->inode_block, sizeof(pfs_blockinfo_t)); + memcpy(&clink2->u.inode->last_segment, blockpos->inode->u.inode->data, sizeof(pfs_blockinfo_t)); + memcpy(clink2->u.inode->data, &bi, sizeof(pfs_blockinfo_t)); + + clink2->flags |= PFS_CACHE_FLAG_DIRTY; + + clink->u.inode->number_blocks += bi.count; + clink->u.inode->number_data++; + + memcpy(&clink->u.inode->last_segment, &bi, sizeof(pfs_blockinfo_t)); + + clink->u.inode->number_segdesg++; + + clink->flags |= PFS_CACHE_FLAG_DIRTY; + blockpos->block_segment++; + blockpos->block_offset = 0; + + memcpy(&blockpos->inode->u.inode->next_segment, &bi, sizeof(pfs_blockinfo_t)); + + blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(blockpos->inode); + blockpos->inode = clink2; + } + + bi2 = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; + bi.subpart = bi2->subpart; + bi.count = blocks; + bi.number = bi2->number + bi2->count; + + result = pfsBitmapSearchFreeZone(pfsMount, &bi, clink->u.inode->number_blocks); + if (result < 0) { + PFS_PRINTF(PFS_DRV_NAME ": Error: Couldnt allocate zone! (2)\n"); + return result; + } + + clink->u.inode->number_blocks += bi.count; + clink->u.inode->number_data++; + clink->flags |= PFS_CACHE_FLAG_DIRTY; + blockpos->block_offset = 0; + blockpos->block_segment++; + + i = pfsFixIndex(clink->u.inode->number_data - 1); + memcpy(&blockpos->inode->u.inode->data[i], &bi, sizeof(pfs_blockinfo_t)); + + blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; + blocks -= bi.count; + if (blocks) + blocks -= pfsBlockExpandSegment(clink, blockpos, blocks); + + return old_blocks - blocks; } // Returns the block info for the block segment corresponding to the // files current position. -pfs_blockinfo_t* pfsBlockGetCurrent(pfs_blockpos_t *blockpos) +pfs_blockinfo_t *pfsBlockGetCurrent(pfs_blockpos_t *blockpos) { - return &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; + return &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; } pfs_cache_t *pfsBlockGetLastSegmentDescriptorInode(pfs_cache_t *clink, int *result) { - return pfsCacheGetData(clink->pfsMount, clink->u.inode->last_segment.subpart, - clink->u.inode->last_segment.number<pfsMount->inode_scale, - (clink->u.inode->last_segment.subpart== - clink->u.inode->inode_block.subpart)&& - (clink->u.inode->last_segment.number== - clink->u.inode->inode_block.number) ? 16 : 32, result); + return pfsCacheGetData(clink->pfsMount, clink->u.inode->last_segment.subpart, + clink->u.inode->last_segment.number << clink->pfsMount->inode_scale, + (clink->u.inode->last_segment.subpart == + clink->u.inode->inode_block.subpart) && + (clink->u.inode->last_segment.number == + clink->u.inode->inode_block.number) ? + 16 : + 32, + result); } diff --git a/modules/hdd/libpfs/src/cache.c b/modules/hdd/libpfs/src/cache.c index bc5d64597..403d10f1e 100644 --- a/modules/hdd/libpfs/src/cache.c +++ b/modules/hdd/libpfs/src/cache.c @@ -25,228 +25,228 @@ u32 pfsCacheNumBuffers; void pfsCacheFree(pfs_cache_t *clink) { - if(clink==NULL) { - PFS_PRINTF(PFS_DRV_NAME": Warning: NULL buffer returned\n"); - return; - } - - if(clink->nused==0){ - PFS_PRINTF(PFS_DRV_NAME": Error: Unused cache returned\n"); - return; - } - - clink->nused--; - if(clink->pfsMount!=NULL) { - if(clink->nused!=0) - return; - pfsCacheLink(pfsCacheBuf->prev, clink); - return; - } - if(clink->nused!=0) { - PFS_PRINTF(PFS_DRV_NAME": Warning: Invalidated buffer is in use\n"); - return; - } - pfsCacheLink(pfsCacheBuf, clink); + if (clink == NULL) { + PFS_PRINTF(PFS_DRV_NAME ": Warning: NULL buffer returned\n"); + return; + } + + if (clink->nused == 0) { + PFS_PRINTF(PFS_DRV_NAME ": Error: Unused cache returned\n"); + return; + } + + clink->nused--; + if (clink->pfsMount != NULL) { + if (clink->nused != 0) + return; + pfsCacheLink(pfsCacheBuf->prev, clink); + return; + } + if (clink->nused != 0) { + PFS_PRINTF(PFS_DRV_NAME ": Warning: Invalidated buffer is in use\n"); + return; + } + pfsCacheLink(pfsCacheBuf, clink); } void pfsCacheLink(pfs_cache_t *clink, pfs_cache_t *cnew) { - cnew->prev=clink; - cnew->next=clink->next; - clink->next->prev=cnew; - clink->next=cnew; + cnew->prev = clink; + cnew->next = clink->next; + clink->next->prev = cnew; + clink->next = cnew; } pfs_cache_t *pfsCacheUnLink(pfs_cache_t *clink) { - clink->prev->next=clink->next; - clink->next->prev=clink->prev; - return clink; + clink->prev->next = clink->next; + clink->next->prev = clink->prev; + return clink; } pfs_cache_t *pfsCacheUsedAdd(pfs_cache_t *clink) { - clink->nused++; - return clink; + clink->nused++; + return clink; } -int pfsCacheTransfer(pfs_cache_t* clink, int mode) +int pfsCacheTransfer(pfs_cache_t *clink, int mode) { - pfs_mount_t *pfsMount=clink->pfsMount; - int err; - - if(pfsMount->lastError == 0) { // no error - if((err=pfsMount->blockDev->transfer(pfsMount->fd, clink->u.inode, clink->sub, - clink->sector << pfsBlockSize, 1 << pfsBlockSize, mode))==0) { - if(mode==PFS_IO_MODE_READ) { - if(clink->flags & PFS_CACHE_FLAG_SEGD && ((pfs_inode_t *)clink->u.inode)->magic!=PFS_SEGD_MAGIC) - err=-EIO; - if(clink->flags & PFS_CACHE_FLAG_SEGI && ((pfs_inode_t *)clink->u.inode)->magic!=PFS_SEGI_MAGIC) - err=-EIO; - if(clink->flags & (PFS_CACHE_FLAG_SEGD|PFS_CACHE_FLAG_SEGI)) { - if(((pfs_inode_t *)clink->u.inode)->checksum!=pfsInodeCheckSum(clink->u.inode)) - err=-EIO; - } - } - } - if(err!=0) { - PFS_PRINTF(PFS_DRV_NAME": Error: Disk error partition %ld, block %ld, err %d\n", - clink->sub, clink->sector, err); + pfs_mount_t *pfsMount = clink->pfsMount; + int err; + + if (pfsMount->lastError == 0) { // no error + if ((err = pfsMount->blockDev->transfer(pfsMount->fd, clink->u.inode, clink->sub, + clink->sector << pfsBlockSize, 1 << pfsBlockSize, mode)) == 0) { + if (mode == PFS_IO_MODE_READ) { + if (clink->flags & PFS_CACHE_FLAG_SEGD && ((pfs_inode_t *)clink->u.inode)->magic != PFS_SEGD_MAGIC) + err = -EIO; + if (clink->flags & PFS_CACHE_FLAG_SEGI && ((pfs_inode_t *)clink->u.inode)->magic != PFS_SEGI_MAGIC) + err = -EIO; + if (clink->flags & (PFS_CACHE_FLAG_SEGD | PFS_CACHE_FLAG_SEGI)) { + if (((pfs_inode_t *)clink->u.inode)->checksum != pfsInodeCheckSum(clink->u.inode)) + err = -EIO; + } + } + } + if (err != 0) { + PFS_PRINTF(PFS_DRV_NAME ": Error: Disk error partition %ld, block %ld, err %d\n", + clink->sub, clink->sector, err); #ifndef PFS_NO_WRITE_ERROR_STAT - pfsMount->blockDev->setPartitionError(pfsMount->fd); - pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_WRITE_ERROR, PFS_MODE_SET_FLAG); - pfsMount->lastError=err; + pfsMount->blockDev->setPartitionError(pfsMount->fd); + pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_WRITE_ERROR, PFS_MODE_SET_FLAG); + pfsMount->lastError = err; #endif - } - } - clink->flags&=~PFS_CACHE_FLAG_DIRTY; // clear dirty :) - return pfsMount->lastError; + } + } + clink->flags &= ~PFS_CACHE_FLAG_DIRTY; // clear dirty :) + return pfsMount->lastError; } void pfsCacheFlushAllDirty(pfs_mount_t *pfsMount) { - u32 i; - int found=0; - - for(i=1;iprev==pfsCacheBuf && pfsCacheBuf->prev->next==pfsCacheBuf->prev) { - PFS_PRINTF(PFS_DRV_NAME": Error: Free buffer list is empty\n"); - *result=-ENOMEM; - return NULL; - } - allocated=pfsCacheBuf->next; - if (pfsCacheBuf->next==NULL) - PFS_PRINTF(PFS_DRV_NAME": Panic: Null pointer allocated\n"); - if (allocated->pfsMount && (allocated->flags & PFS_CACHE_FLAG_DIRTY)) - pfsCacheFlushAllDirty(allocated->pfsMount); - allocated->flags = flags & PFS_CACHE_FLAG_MASKTYPE; - allocated->pfsMount = pfsMount; - allocated->sub = sub; - allocated->sector = scale; - allocated->nused = 1; - return pfsCacheUnLink(allocated); + pfs_cache_t *allocated; + + if (pfsCacheBuf->prev == pfsCacheBuf && pfsCacheBuf->prev->next == pfsCacheBuf->prev) { + PFS_PRINTF(PFS_DRV_NAME ": Error: Free buffer list is empty\n"); + *result = -ENOMEM; + return NULL; + } + allocated = pfsCacheBuf->next; + if (pfsCacheBuf->next == NULL) + PFS_PRINTF(PFS_DRV_NAME ": Panic: Null pointer allocated\n"); + if (allocated->pfsMount && (allocated->flags & PFS_CACHE_FLAG_DIRTY)) + pfsCacheFlushAllDirty(allocated->pfsMount); + allocated->flags = flags & PFS_CACHE_FLAG_MASKTYPE; + allocated->pfsMount = pfsMount; + allocated->sub = sub; + allocated->sector = scale; + allocated->nused = 1; + return pfsCacheUnLink(allocated); } pfs_cache_t *pfsCacheGetData(pfs_mount_t *pfsMount, u16 sub, u32 sector, - int flags, int *result) + int flags, int *result) { - u32 i; - pfs_cache_t *clink; - - *result=0; - - for (i=1; i < pfsCacheNumBuffers + 1; i++) - if ( pfsCacheBuf[i].pfsMount && - (pfsCacheBuf[i].pfsMount==pfsMount) && - (pfsCacheBuf[i].sector == sector)) - if (pfsCacheBuf[i].sub==sub){ - pfsCacheBuf[i].flags &= PFS_CACHE_FLAG_MASKSTATUS; - pfsCacheBuf[i].flags |= flags & PFS_CACHE_FLAG_MASKTYPE; - if (pfsCacheBuf[i].nused == 0) - pfsCacheUnLink(&pfsCacheBuf[i]); - pfsCacheBuf[i].nused++; - return &pfsCacheBuf[i]; - } - - clink=pfsCacheAlloc(pfsMount, sub, sector, flags, result); - - if (clink){ - if (flags & PFS_CACHE_FLAG_NOLOAD) - return clink; - - if ((*result=pfsCacheTransfer(clink, PFS_IO_MODE_READ))>=0) - return clink; - - clink->pfsMount=NULL; - pfsCacheFree(clink); - } - return NULL; + u32 i; + pfs_cache_t *clink; + + *result = 0; + + for (i = 1; i < pfsCacheNumBuffers + 1; i++) + if (pfsCacheBuf[i].pfsMount && + (pfsCacheBuf[i].pfsMount == pfsMount) && + (pfsCacheBuf[i].sector == sector)) + if (pfsCacheBuf[i].sub == sub) { + pfsCacheBuf[i].flags &= PFS_CACHE_FLAG_MASKSTATUS; + pfsCacheBuf[i].flags |= flags & PFS_CACHE_FLAG_MASKTYPE; + if (pfsCacheBuf[i].nused == 0) + pfsCacheUnLink(&pfsCacheBuf[i]); + pfsCacheBuf[i].nused++; + return &pfsCacheBuf[i]; + } + + clink = pfsCacheAlloc(pfsMount, sub, sector, flags, result); + + if (clink) { + if (flags & PFS_CACHE_FLAG_NOLOAD) + return clink; + + if ((*result = pfsCacheTransfer(clink, PFS_IO_MODE_READ)) >= 0) + return clink; + + clink->pfsMount = NULL; + pfsCacheFree(clink); + } + return NULL; } pfs_cache_t *pfsCacheAllocClean(int *result) { - *result = 0; - return pfsCacheAlloc(NULL, 0, 0, 0, result); + *result = 0; + return pfsCacheAlloc(NULL, 0, 0, 0, result); } // checks if the pfsCacheBuf list has some room int pfsCacheIsFull(void) { - if (pfsCacheBuf->prev != pfsCacheBuf) return 0; - return pfsCacheBuf->prev->next == pfsCacheBuf->prev; + if (pfsCacheBuf->prev != pfsCacheBuf) + return 0; + return pfsCacheBuf->prev->next == pfsCacheBuf->prev; } int pfsCacheInit(u32 numBuf, u32 bufSize) { - char *cacheData; - u32 i; + char *cacheData; + u32 i; - if(numBuf > 127) { - PFS_PRINTF(PFS_DRV_NAME": Error: Number of buffers larger than 127.\n"); - return -EINVAL; - } + if (numBuf > 127) { + PFS_PRINTF(PFS_DRV_NAME ": Error: Number of buffers larger than 127.\n"); + return -EINVAL; + } - cacheData = pfsAllocMem(numBuf * bufSize); + cacheData = pfsAllocMem(numBuf * bufSize); - if(!cacheData || !(pfsCacheBuf = pfsAllocMem((numBuf + 1) * sizeof(pfs_cache_t)))) - return -ENOMEM; + if (!cacheData || !(pfsCacheBuf = pfsAllocMem((numBuf + 1) * sizeof(pfs_cache_t)))) + return -ENOMEM; - pfsCacheNumBuffers = numBuf; - memset(pfsCacheBuf, 0, (numBuf + 1) * sizeof(pfs_cache_t)); + pfsCacheNumBuffers = numBuf; + memset(pfsCacheBuf, 0, (numBuf + 1) * sizeof(pfs_cache_t)); - pfsCacheBuf->next = pfsCacheBuf; - pfsCacheBuf->prev = pfsCacheBuf; + pfsCacheBuf->next = pfsCacheBuf; + pfsCacheBuf->prev = pfsCacheBuf; - for(i = 1; i < numBuf + 1; i++) - { - pfsCacheBuf[i].u.data = cacheData; - pfsCacheLink(pfsCacheBuf->prev, &pfsCacheBuf[i]); - cacheData += bufSize; - } + for (i = 1; i < numBuf + 1; i++) { + pfsCacheBuf[i].u.data = cacheData; + pfsCacheLink(pfsCacheBuf->prev, &pfsCacheBuf[i]); + cacheData += bufSize; + } - return 0; + return 0; } void pfsCacheClose(pfs_mount_t *pfsMount) { - unsigned int i; + unsigned int i; - pfsCacheFlushAllDirty(pfsMount); - for(i=1; i < pfsCacheNumBuffers+1;i++){ - if(pfsCacheBuf[i].pfsMount==pfsMount) - pfsCacheBuf[i].pfsMount=NULL; - } + pfsCacheFlushAllDirty(pfsMount); + for (i = 1; i < pfsCacheNumBuffers + 1; i++) { + if (pfsCacheBuf[i].pfsMount == pfsMount) + pfsCacheBuf[i].pfsMount = NULL; + } } void pfsCacheMarkClean(pfs_mount_t *pfsMount, u32 subpart, u32 sectorStart, u32 sectorEnd) { - u32 i; - - for(i=1; i< pfsCacheNumBuffers+1;i++){ - if(pfsCacheBuf[i].pfsMount==pfsMount && pfsCacheBuf[i].sub==subpart) { - if(pfsCacheBuf[i].sector >= sectorStart && pfsCacheBuf[i].sector < sectorEnd) - pfsCacheBuf[i].flags&=~PFS_CACHE_FLAG_DIRTY; - } - } + u32 i; + + for (i = 1; i < pfsCacheNumBuffers + 1; i++) { + if (pfsCacheBuf[i].pfsMount == pfsMount && pfsCacheBuf[i].sub == subpart) { + if (pfsCacheBuf[i].sector >= sectorStart && pfsCacheBuf[i].sector < sectorEnd) + pfsCacheBuf[i].flags &= ~PFS_CACHE_FLAG_DIRTY; + } + } } diff --git a/modules/hdd/libpfs/src/dir.c b/modules/hdd/libpfs/src/dir.c index 258258394..6eb7d80ed 100644 --- a/modules/hdd/libpfs/src/dir.c +++ b/modules/hdd/libpfs/src/dir.c @@ -23,349 +23,343 @@ extern u32 pfsMetaSize; // Gets a dir entry from the inode specified by clink pfs_cache_t *pfsGetDentry(pfs_cache_t *clink, char *path, pfs_dentry_t **dentry, u32 *size, int option) { - pfs_blockpos_t block_pos; - pfs_dentry_t *d; - u16 aLen; - pfs_dentry_t *d2; - pfs_cache_t *dentCache; - u32 new_dentryLen=0,dentryLen; - int len=0, result; - - if (path) - { - len = strlen(path); - new_dentryLen = (len+8+3) &~3; - } - *size = 0; - - block_pos.inode = pfsCacheUsedAdd(clink); - block_pos.block_segment = 1; - block_pos.block_offset = 0; - block_pos.byte_offset = 0; - dentCache = pfsGetDentriesChunk(&block_pos, &result); - - if (dentCache != NULL) - { - d2=d=dentCache->u.dentry; - while(*size < clink->u.inode->size) - { - // Read another dentry chunk if we need to - if (d2 >= (pfs_dentry_t*)((u8*)dentCache->u.inode + pfsMetaSize)) - { - if (pfsInodeSync(&block_pos, pfsMetaSize, clink->u.inode->number_data)) - break; - pfsCacheFree(dentCache); - - if ((dentCache=pfsGetDentriesChunk(&block_pos, &result))==0) - break; - d=dentCache->u.dentry; - } - - for (d2=(pfs_dentry_t*)((int)d+512); d < d2; d=(pfs_dentry_t *)((int)d + aLen)) - { - aLen=(d->aLen & 0xFFF); - - if (aLen & 3){ - PFS_PRINTF(PFS_DRV_NAME": Error: dir-entry allocated length/4 != 0\n"); - goto _exit; - } - dentryLen = (d->pLen + 8 + 3) & 0x1FC; - if (aLen < dentryLen){ - PFS_PRINTF(PFS_DRV_NAME": Error: dir-entry is too small\n"); - goto _exit; - } - if (d2 < (pfs_dentry_t*)((u8*)d + aLen)){ - PFS_PRINTF(PFS_DRV_NAME": Error: dir-entry across sectors\n"); - goto _exit; - } - - // decide if the current dentry meets the required criteria, based on 'option' - switch(option) - { - case 0: // result = 1 when paths are equal - result = (len==d->pLen) && (memcmp(path, d->path, d->pLen)==0); - break; - case 1: // result = 1 when either there is no inode or if there is enough space remaining in the inode. - result = ((d->inode) || (aLen < new_dentryLen)) ? (aLen - dentryLen - >= new_dentryLen) : 1; - break; - case 2: // result = 1 when dir path is not empty, "." or ".." - result = d->pLen && strcmp(d->path, ".") && strcmp(d->path, ".."); - break; - default: - goto _exit; - } - - if (result) - { - *dentry=d; - pfsCacheFree(block_pos.inode); - return dentCache; - } - *size+=aLen; - } - } -_exit: pfsCacheFree(dentCache); - } - pfsCacheFree(block_pos.inode); - return NULL; + pfs_blockpos_t block_pos; + pfs_dentry_t *d; + u16 aLen; + pfs_dentry_t *d2; + pfs_cache_t *dentCache; + u32 new_dentryLen = 0, dentryLen; + int len = 0, result; + + if (path) { + len = strlen(path); + new_dentryLen = (len + 8 + 3) & ~3; + } + *size = 0; + + block_pos.inode = pfsCacheUsedAdd(clink); + block_pos.block_segment = 1; + block_pos.block_offset = 0; + block_pos.byte_offset = 0; + dentCache = pfsGetDentriesChunk(&block_pos, &result); + + if (dentCache != NULL) { + d2 = d = dentCache->u.dentry; + while (*size < clink->u.inode->size) { + // Read another dentry chunk if we need to + if (d2 >= (pfs_dentry_t *)((u8 *)dentCache->u.inode + pfsMetaSize)) { + if (pfsInodeSync(&block_pos, pfsMetaSize, clink->u.inode->number_data)) + break; + pfsCacheFree(dentCache); + + if ((dentCache = pfsGetDentriesChunk(&block_pos, &result)) == 0) + break; + d = dentCache->u.dentry; + } + + for (d2 = (pfs_dentry_t *)((int)d + 512); d < d2; d = (pfs_dentry_t *)((int)d + aLen)) { + aLen = (d->aLen & 0xFFF); + + if (aLen & 3) { + PFS_PRINTF(PFS_DRV_NAME ": Error: dir-entry allocated length/4 != 0\n"); + goto _exit; + } + dentryLen = (d->pLen + 8 + 3) & 0x1FC; + if (aLen < dentryLen) { + PFS_PRINTF(PFS_DRV_NAME ": Error: dir-entry is too small\n"); + goto _exit; + } + if (d2 < (pfs_dentry_t *)((u8 *)d + aLen)) { + PFS_PRINTF(PFS_DRV_NAME ": Error: dir-entry across sectors\n"); + goto _exit; + } + + // decide if the current dentry meets the required criteria, based on 'option' + switch (option) { + case 0: // result = 1 when paths are equal + result = (len == d->pLen) && (memcmp(path, d->path, d->pLen) == 0); + break; + case 1: // result = 1 when either there is no inode or if there is enough space remaining in the inode. + result = ((d->inode) || (aLen < new_dentryLen)) ? (aLen - dentryLen >= new_dentryLen) : 1; + break; + case 2: // result = 1 when dir path is not empty, "." or ".." + result = d->pLen && strcmp(d->path, ".") && strcmp(d->path, ".."); + break; + default: + goto _exit; + } + + if (result) { + *dentry = d; + pfsCacheFree(block_pos.inode); + return dentCache; + } + *size += aLen; + } + } + _exit: + pfsCacheFree(dentCache); + } + pfsCacheFree(block_pos.inode); + return NULL; } int pfsGetNextDentry(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 *position, char *name, pfs_blockinfo_t *bi) { - int result; - pfs_cache_t *dcache; - pfs_dentry_t *dentry; - u32 len=0; + int result; + pfs_cache_t *dcache; + pfs_dentry_t *dentry; + u32 len = 0; - // loop until a non-empty entry is found or until the end of the dentry chunk is reached - while((len == 0) && (*position < clink->u.inode->size)) - { + // loop until a non-empty entry is found or until the end of the dentry chunk is reached + while ((len == 0) && (*position < clink->u.inode->size)) { - if (!(dcache=pfsGetDentriesChunk(blockpos, &result))) - { - PFS_PRINTF(PFS_DRV_NAME": couldnt get dentries chunk for dread!\n"); - break; - } + if (!(dcache = pfsGetDentriesChunk(blockpos, &result))) { + PFS_PRINTF(PFS_DRV_NAME ": couldnt get dentries chunk for dread!\n"); + break; + } - dentry = (pfs_dentry_t*)((u8*)dcache->u.data + (blockpos->byte_offset % pfsMetaSize)); + dentry = (pfs_dentry_t *)((u8 *)dcache->u.data + (blockpos->byte_offset % pfsMetaSize)); - len = dentry->pLen; - memcpy(name, dentry->path, len); - name[len] = '\0'; + len = dentry->pLen; + memcpy(name, dentry->path, len); + name[len] = '\0'; - bi->subpart = dentry->sub; - bi->number = dentry->inode; - pfsCacheFree(dcache); + bi->subpart = dentry->sub; + bi->number = dentry->inode; + pfsCacheFree(dcache); - *position += dentry->aLen & 0xFFF; + *position += dentry->aLen & 0xFFF; - // update blockpos - if (pfsInodeSync(blockpos, dentry->aLen & 0xFFF, clink->u.inode->number_data)) - break; - } + // update blockpos + if (pfsInodeSync(blockpos, dentry->aLen & 0xFFF, clink->u.inode->number_data)) + break; + } - return len; + return len; } pfs_cache_t *pfsFillDentry(pfs_cache_t *clink, pfs_dentry_t *dentry, char *path1, pfs_blockinfo_t *bi, u32 len, u16 mode) { - dentry->inode=bi->number; - dentry->sub=(u8)bi->subpart; - dentry->pLen=strlen(path1); - dentry->aLen=len | (mode & FIO_S_IFMT); - memcpy(dentry->path, path1, dentry->pLen & 0xFF); + dentry->inode = bi->number; + dentry->sub = (u8)bi->subpart; + dentry->pLen = strlen(path1); + dentry->aLen = len | (mode & FIO_S_IFMT); + memcpy(dentry->path, path1, dentry->pLen & 0xFF); - return clink; + return clink; } pfs_cache_t *pfsDirAddEntry(pfs_cache_t *dir, char *filename, pfs_blockinfo_t *bi, u16 mode, int *result) { - pfs_dentry_t *dentry; - u32 size; - u32 len; - pfs_cache_t *dcache; - - dcache=pfsGetDentry(dir, filename, &dentry, &size, 1); - if (dcache){ - len=dentry->aLen & 0xFFF; - if (dentry->pLen) - len-=(dentry->pLen + 11) & 0x1FC; - dentry->aLen=(dentry->aLen & FIO_S_IFMT) | ((dentry->aLen & 0xFFF) - len); - dentry=(pfs_dentry_t *)((u8*)dentry + (dentry->aLen & 0xFFF)); - }else{ - int offset; - - if ((*result=pfsAllocZones(dir, sizeof(pfs_dentry_t), 0))<0) - return NULL; - dcache=pfsGetDentriesAtPos(dir, dir->u.inode->size, &offset, result); - if (dcache==NULL) - return NULL; - - dir->u.inode->size += sizeof(pfs_dentry_t); - - dentry=(pfs_dentry_t*)((u8*)dcache->u.dentry+offset); - len=sizeof(pfs_dentry_t); - } - return pfsFillDentry(dcache, dentry, filename, bi, len, mode); + pfs_dentry_t *dentry; + u32 size; + u32 len; + pfs_cache_t *dcache; + + dcache = pfsGetDentry(dir, filename, &dentry, &size, 1); + if (dcache) { + len = dentry->aLen & 0xFFF; + if (dentry->pLen) + len -= (dentry->pLen + 11) & 0x1FC; + dentry->aLen = (dentry->aLen & FIO_S_IFMT) | ((dentry->aLen & 0xFFF) - len); + dentry = (pfs_dentry_t *)((u8 *)dentry + (dentry->aLen & 0xFFF)); + } else { + int offset; + + if ((*result = pfsAllocZones(dir, sizeof(pfs_dentry_t), 0)) < 0) + return NULL; + dcache = pfsGetDentriesAtPos(dir, dir->u.inode->size, &offset, result); + if (dcache == NULL) + return NULL; + + dir->u.inode->size += sizeof(pfs_dentry_t); + + dentry = (pfs_dentry_t *)((u8 *)dcache->u.dentry + offset); + len = sizeof(pfs_dentry_t); + } + return pfsFillDentry(dcache, dentry, filename, bi, len, mode); } pfs_cache_t *pfsDirRemoveEntry(pfs_cache_t *clink, char *path) { - pfs_dentry_t *dentry; - u32 size; - u16 aLen; - int i=0, val; - pfs_dentry_t *dlast=NULL, *dnext; - pfs_cache_t *c; - - if ((c=pfsGetDentry(clink, path, &dentry, &size, 0))){ - val=(int)dentry-(int)c->u.dentry; - if (val<0) val +=511; - val /=512; val *=512; - dnext=(pfs_dentry_t*)((int)c->u.dentry+val); - do{ - aLen = dnext->aLen & 0xFFF; - - if (dnext==dentry){ - if (dlast) - dlast->aLen=(dlast->aLen & FIO_S_IFMT) | ((dlast->aLen & 0xFFF) + aLen); - else{ - dnext->pLen=dnext->inode=0; - - if (size+aLen >= clink->u.inode->size) - clink->u.inode->size -= aLen; - } - return c; - } - i+=aLen; - dlast=dnext; - dnext=(pfs_dentry_t *)((u8*)dnext + aLen); - }while (i<512); - } - return NULL; + pfs_dentry_t *dentry; + u32 size; + u16 aLen; + int i = 0, val; + pfs_dentry_t *dlast = NULL, *dnext; + pfs_cache_t *c; + + if ((c = pfsGetDentry(clink, path, &dentry, &size, 0))) { + val = (int)dentry - (int)c->u.dentry; + if (val < 0) + val += 511; + val /= 512; + val *= 512; + dnext = (pfs_dentry_t *)((int)c->u.dentry + val); + do { + aLen = dnext->aLen & 0xFFF; + + if (dnext == dentry) { + if (dlast) + dlast->aLen = (dlast->aLen & FIO_S_IFMT) | ((dlast->aLen & 0xFFF) + aLen); + else { + dnext->pLen = dnext->inode = 0; + + if (size + aLen >= clink->u.inode->size) + clink->u.inode->size -= aLen; + } + return c; + } + i += aLen; + dlast = dnext; + dnext = (pfs_dentry_t *)((u8 *)dnext + aLen); + } while (i < 512); + } + return NULL; } int pfsCheckDirForFiles(pfs_cache_t *clink) { - pfs_dentry_t *dentry; - pfs_cache_t *dcache; - u32 size; - - if((dcache=pfsGetDentry(clink, NULL, &dentry, &size, 2))){ - pfsCacheFree(dcache); - return 0; - } - return 1; + pfs_dentry_t *dentry; + pfs_cache_t *dcache; + u32 size; + + if ((dcache = pfsGetDentry(clink, NULL, &dentry, &size, 2))) { + pfsCacheFree(dcache); + return 0; + } + return 1; } void pfsFillSelfAndParentDentries(pfs_cache_t *clink, pfs_blockinfo_t *self, pfs_blockinfo_t *parent) { - pfs_dentry_t *dentry=clink->u.dentry; - - memset(dentry, 0, pfsMetaSize); - dentry->inode=self->number; - dentry->path[0]='.'; - dentry->path[1]='\0'; - dentry->sub=(u8)self->subpart; - dentry->pLen=1; - dentry->aLen=12 | FIO_S_IFDIR; - - dentry=(pfs_dentry_t *)((u8*)dentry + 12); - - dentry->inode=parent->number; - dentry->path[0]='.'; - dentry->path[1]='.'; - dentry->path[2]='\0'; - dentry->sub=(u8)parent->subpart; - dentry->pLen=2; - dentry->aLen=500 | FIO_S_IFDIR; + pfs_dentry_t *dentry = clink->u.dentry; + + memset(dentry, 0, pfsMetaSize); + dentry->inode = self->number; + dentry->path[0] = '.'; + dentry->path[1] = '\0'; + dentry->sub = (u8)self->subpart; + dentry->pLen = 1; + dentry->aLen = 12 | FIO_S_IFDIR; + + dentry = (pfs_dentry_t *)((u8 *)dentry + 12); + + dentry->inode = parent->number; + dentry->path[0] = '.'; + dentry->path[1] = '.'; + dentry->path[2] = '\0'; + dentry->sub = (u8)parent->subpart; + dentry->pLen = 2; + dentry->aLen = 500 | FIO_S_IFDIR; } -pfs_cache_t* pfsSetDentryParent(pfs_cache_t *clink, pfs_blockinfo_t *bi, int *result) +pfs_cache_t *pfsSetDentryParent(pfs_cache_t *clink, pfs_blockinfo_t *bi, int *result) { - int offset; - pfs_cache_t *dcache; - - dcache=pfsGetDentriesAtPos(clink, 0, &offset, result); - if (dcache){ - pfs_dentry_t *d=(pfs_dentry_t*)(12+(u8*)dcache->u.data); - d->inode=bi->number; - d->sub =(u8)bi->subpart; - } - return dcache; + int offset; + pfs_cache_t *dcache; + + dcache = pfsGetDentriesAtPos(clink, 0, &offset, result); + if (dcache) { + pfs_dentry_t *d = (pfs_dentry_t *)(12 + (u8 *)dcache->u.data); + d->inode = bi->number; + d->sub = (u8)bi->subpart; + } + return dcache; } // Returns the cached inode for the file (dir) in the directory pointed // to by the dir inode. pfs_cache_t *pfsInodeGetFileInDir(pfs_cache_t *dirInode, char *path, int *result) { - pfs_dentry_t *dentry; - u32 size; - pfs_cache_t *clink; - - if (path[0]==0) - return pfsCacheUsedAdd(dirInode); - - // If we're in the root dir, don't do anything for ".." - if ((dirInode->sector == - dirInode->pfsMount->root_dir.number << dirInode->pfsMount->inode_scale) && - (dirInode->sub == dirInode->pfsMount->root_dir.subpart) && - (strcmp(path, "..") == 0)) - return pfsCacheUsedAdd(dirInode); - - if ((*result=pfsCheckAccess(dirInode, 1)) < 0) - return NULL; - - // Get dentry of file/dir specified by path from the dir pointed to - // by the inode (dirInode). Then return the cached inode for that dentry. - if ((clink=pfsGetDentry(dirInode, path, &dentry, &size, 0))){ - pfsCacheFree(clink); - return pfsInodeGetData(dirInode->pfsMount, - dentry->sub, dentry->inode, result); - } - - *result=-ENOENT; - return NULL; + pfs_dentry_t *dentry; + u32 size; + pfs_cache_t *clink; + + if (path[0] == 0) + return pfsCacheUsedAdd(dirInode); + + // If we're in the root dir, don't do anything for ".." + if ((dirInode->sector == + dirInode->pfsMount->root_dir.number << dirInode->pfsMount->inode_scale) && + (dirInode->sub == dirInode->pfsMount->root_dir.subpart) && + (strcmp(path, "..") == 0)) + return pfsCacheUsedAdd(dirInode); + + if ((*result = pfsCheckAccess(dirInode, 1)) < 0) + return NULL; + + // Get dentry of file/dir specified by path from the dir pointed to + // by the inode (dirInode). Then return the cached inode for that dentry. + if ((clink = pfsGetDentry(dirInode, path, &dentry, &size, 0))) { + pfsCacheFree(clink); + return pfsInodeGetData(dirInode->pfsMount, + dentry->sub, dentry->inode, result); + } + + *result = -ENOENT; + return NULL; } pfs_cache_t *pfsInodeGetFile(pfs_mount_t *pfsMount, pfs_cache_t *clink, - const char *name, int *result) { - char path[256]; - pfs_cache_t *c; - - c=pfsInodeGetParent(pfsMount, clink, name, path, result); - if (c){ - c=pfsInodeGetFileInDir(c, path, result); - pfsCacheFree(c); - return c; - } - return NULL; + const char *name, int *result) +{ + char path[256]; + pfs_cache_t *c; + + c = pfsInodeGetParent(pfsMount, clink, name, path, result); + if (c) { + c = pfsInodeGetFileInDir(c, path, result); + pfsCacheFree(c); + return c; + } + return NULL; } void pfsInodeFill(pfs_cache_t *ci, pfs_blockinfo_t *bi, u16 mode, u16 uid, u16 gid) { - u32 val; + u32 val; - memset(ci->u.inode, 0, pfsMetaSize); + memset(ci->u.inode, 0, pfsMetaSize); - ci->u.inode->magic=PFS_SEGD_MAGIC; + ci->u.inode->magic = PFS_SEGD_MAGIC; - ci->u.inode->inode_block.number=bi->number; - ci->u.inode->inode_block.subpart=bi->subpart; - ci->u.inode->inode_block.count=bi->count; + ci->u.inode->inode_block.number = bi->number; + ci->u.inode->inode_block.subpart = bi->subpart; + ci->u.inode->inode_block.count = bi->count; - ci->u.inode->last_segment.number=bi->number; - ci->u.inode->last_segment.subpart=bi->subpart; - ci->u.inode->last_segment.count=bi->count; + ci->u.inode->last_segment.number = bi->number; + ci->u.inode->last_segment.subpart = bi->subpart; + ci->u.inode->last_segment.count = bi->count; - ci->u.inode->mode=mode; - ci->u.inode->uid=uid; - ci->u.inode->gid=gid; + ci->u.inode->mode = mode; + ci->u.inode->uid = uid; + ci->u.inode->gid = gid; - if ((mode & FIO_S_IFMT) == FIO_S_IFDIR){ - ci->u.inode->attr=0xA0; - ci->u.inode->size=sizeof(pfs_dentry_t); - val=2; - }else{ - ci->u.inode->size=0; - val=1; - } - ci->u.inode->number_data=ci->u.inode->number_blocks=val; + if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) { + ci->u.inode->attr = 0xA0; + ci->u.inode->size = sizeof(pfs_dentry_t); + val = 2; + } else { + ci->u.inode->size = 0; + val = 1; + } + ci->u.inode->number_data = ci->u.inode->number_blocks = val; - pfsGetTime(&ci->u.inode->ctime); - memcpy(&ci->u.inode->atime, &ci->u.inode->ctime, sizeof(pfs_datetime_t)); - memcpy(&ci->u.inode->mtime, &ci->u.inode->ctime, sizeof(pfs_datetime_t)); + pfsGetTime(&ci->u.inode->ctime); + memcpy(&ci->u.inode->atime, &ci->u.inode->ctime, sizeof(pfs_datetime_t)); + memcpy(&ci->u.inode->mtime, &ci->u.inode->ctime, sizeof(pfs_datetime_t)); - ci->u.inode->number_segdesg=1; - ci->u.inode->data[0].number =bi->number; - ci->u.inode->data[0].subpart=bi->subpart; - ci->u.inode->data[0].count =bi->count; + ci->u.inode->number_segdesg = 1; + ci->u.inode->data[0].number = bi->number; + ci->u.inode->data[0].subpart = bi->subpart; + ci->u.inode->data[0].count = bi->count; - ci->u.inode->subpart=bi->subpart; + ci->u.inode->subpart = bi->subpart; - ci->flags |= PFS_CACHE_FLAG_DIRTY; + ci->flags |= PFS_CACHE_FLAG_DIRTY; } @@ -373,335 +367,316 @@ void pfsInodeFill(pfs_cache_t *ci, pfs_blockinfo_t *bi, u16 mode, u16 uid, u16 g // the file (dir) specified by the filename. // // ie: if filename = /usr/local/ps2/games then it will return the inode for /usr/local/ps2 -pfs_cache_t* pfsInodeGetParent(pfs_mount_t *pfsMount, pfs_cache_t *clink, const char *filename, - char *path, int *result) +pfs_cache_t *pfsInodeGetParent(pfs_mount_t *pfsMount, pfs_cache_t *clink, const char *filename, + char *path, int *result) { - static int pfsSymbolicLinks = 0; - pfs_cache_t *link, *inode; - char *filename2=(char*)filename; - - if (filename2[0]==0) - { - *result=-ENOENT; - if (clink) pfsCacheFree(clink); - return NULL; - } - - if (filename2[0] == '/') - { - - // Get inode for root dir - - if (clink) pfsCacheFree(clink); - if ((clink=pfsInodeGetData(pfsMount, pfsMount->root_dir.subpart, - pfsMount->root_dir.number, result))==0) - return NULL; - } - else if (clink==NULL) - { - - // Otherwise if relative path, get inode for current dir - - if ((clink=pfsInodeGetData(pfsMount, pfsMount->current_dir.subpart, - pfsMount->current_dir.number, result))==0) - return NULL; - } - - do - { - filename2=pfsSplitPath(filename2, path, result); - if (filename2==NULL) return NULL; - - // If we've reached the end of the path, then we want to return - // the cached inode for the directory which holds the file/dir in path - if (filename2[0]==0) - { - if ((clink->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) - return clink; - - pfsCacheFree(clink); - *result=-ENOTDIR; // not a directory - return NULL; - } - - inode=pfsInodeGetFileInDir(clink, path, result); - - if (inode && ((inode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK)) - { - if (pfsSymbolicLinks >= 4) - { - *result=-ELOOP; // too many symbolic links - pfsCacheFree(clink); - pfsCacheFree(inode); - return NULL; - } - - pfsSymbolicLinks++; - link=pfsInodeGetFile(pfsMount, clink, (char*)&inode->u.inode->data[1], result); - pfsSymbolicLinks--; - - clink=inode; - if (link==0) - { - pfsCacheFree(inode); - return NULL; - } - inode=link; - } - pfsCacheFree(clink); - clink=inode; - - } while (inode); - - return NULL; + static int pfsSymbolicLinks = 0; + pfs_cache_t *link, *inode; + char *filename2 = (char *)filename; + + if (filename2[0] == 0) { + *result = -ENOENT; + if (clink) + pfsCacheFree(clink); + return NULL; + } + + if (filename2[0] == '/') { + + // Get inode for root dir + + if (clink) + pfsCacheFree(clink); + if ((clink = pfsInodeGetData(pfsMount, pfsMount->root_dir.subpart, + pfsMount->root_dir.number, result)) == 0) + return NULL; + } else if (clink == NULL) { + + // Otherwise if relative path, get inode for current dir + + if ((clink = pfsInodeGetData(pfsMount, pfsMount->current_dir.subpart, + pfsMount->current_dir.number, result)) == 0) + return NULL; + } + + do { + filename2 = pfsSplitPath(filename2, path, result); + if (filename2 == NULL) + return NULL; + + // If we've reached the end of the path, then we want to return + // the cached inode for the directory which holds the file/dir in path + if (filename2[0] == 0) { + if ((clink->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) + return clink; + + pfsCacheFree(clink); + *result = -ENOTDIR; // not a directory + return NULL; + } + + inode = pfsInodeGetFileInDir(clink, path, result); + + if (inode && ((inode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK)) { + if (pfsSymbolicLinks >= 4) { + *result = -ELOOP; // too many symbolic links + pfsCacheFree(clink); + pfsCacheFree(inode); + return NULL; + } + + pfsSymbolicLinks++; + link = pfsInodeGetFile(pfsMount, clink, (char *)&inode->u.inode->data[1], result); + pfsSymbolicLinks--; + + clink = inode; + if (link == 0) { + pfsCacheFree(inode); + return NULL; + } + inode = link; + } + pfsCacheFree(clink); + clink = inode; + + } while (inode); + + return NULL; } int pfsInodeRemove(pfs_cache_t *parent, pfs_cache_t *inode, char *path) { - pfs_cache_t *entry; - int rv=0; - - if((entry=pfsDirRemoveEntry(parent, path))!=NULL) - { - pfsInodeSetTime(parent); - entry->flags|=PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(entry); - } - else - rv=-ENOENT; - - pfsCacheFree(parent); - if(rv==0) - { - inode->flags&=~PFS_CACHE_FLAG_DIRTY; - pfsBitmapFreeInodeBlocks(inode); - if(parent->pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(parent->pfsMount); - } - - pfsCacheFree(inode); - return rv; + pfs_cache_t *entry; + int rv = 0; + + if ((entry = pfsDirRemoveEntry(parent, path)) != NULL) { + pfsInodeSetTime(parent); + entry->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(entry); + } else + rv = -ENOENT; + + pfsCacheFree(parent); + if (rv == 0) { + inode->flags &= ~PFS_CACHE_FLAG_DIRTY; + pfsBitmapFreeInodeBlocks(inode); + if (parent->pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(parent->pfsMount); + } + + pfsCacheFree(inode); + return rv; } pfs_cache_t *pfsInodeCreate(pfs_cache_t *clink, u16 mode, u16 uid, u16 gid, int *result) { - pfs_blockinfo_t a, b; - - pfs_mount_t *pfsMount=clink->pfsMount; - u32 j; - u32 i; - pfs_cache_t *inode; - - if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) - { - if (pfsMount->num_subs > clink->u.inode->subpart) - clink->u.inode->subpart++; - else - clink->u.inode->subpart=0; - a.number =0; - a.subpart=clink->u.inode->subpart; - j= (pfsMount->zfree * (u64)100) / pfsMount->total_sector; - i= (pfsMount->free_zone[a.subpart] * (u64)100) / - (pfsMount->blockDev->getSize(pfsMount->fd, a.subpart) >> pfsMount->sector_scale); - if ((i < j) && ((j-i) >= 11)) - a.subpart=pfsGetMaxIndex(pfsMount); - }else{ - a.number=clink->u.inode->inode_block.number; - a.subpart=clink->u.inode->inode_block.subpart; - a.count=clink->u.inode->inode_block.count; - } - a.count=1; - - // Search for a free zone, starting from parent dir inode block - *result=pfsBitmapSearchFreeZone(pfsMount, &a, 2); - if (*result<0) return 0; - inode=pfsCacheGetData(pfsMount, a.subpart, a.number << pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGD | PFS_CACHE_FLAG_NOLOAD, result); - if (inode == NULL) - return NULL; - - // Initialise the inode (which has been allocate blocks specified by a) - pfsInodeFill(inode, (pfs_blockinfo_t*)&a, mode, uid, gid); - if ((mode & FIO_S_IFMT) != FIO_S_IFDIR) - return inode; - - b.number=a.number; - b.subpart=a.subpart; - b.count=a.count; - - *result=pfsBitmapSearchFreeZone(pfsMount, (pfs_blockinfo_t*)&a, 0); - if (*result<0){ - pfsCacheFree(inode); - pfsBitmapFreeBlockSegment(pfsMount, (pfs_blockinfo_t*)&b); - return NULL; - } - - inode->u.inode->data[1].number=a.number; - inode->u.inode->data[1].subpart=a.subpart; - inode->u.inode->data[1].count =a.count; - - return inode; + pfs_blockinfo_t a, b; + + pfs_mount_t *pfsMount = clink->pfsMount; + u32 j; + u32 i; + pfs_cache_t *inode; + + if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) { + if (pfsMount->num_subs > clink->u.inode->subpart) + clink->u.inode->subpart++; + else + clink->u.inode->subpart = 0; + a.number = 0; + a.subpart = clink->u.inode->subpart; + j = (pfsMount->zfree * (u64)100) / pfsMount->total_sector; + i = (pfsMount->free_zone[a.subpart] * (u64)100) / + (pfsMount->blockDev->getSize(pfsMount->fd, a.subpart) >> pfsMount->sector_scale); + if ((i < j) && ((j - i) >= 11)) + a.subpart = pfsGetMaxIndex(pfsMount); + } else { + a.number = clink->u.inode->inode_block.number; + a.subpart = clink->u.inode->inode_block.subpart; + a.count = clink->u.inode->inode_block.count; + } + a.count = 1; + + // Search for a free zone, starting from parent dir inode block + *result = pfsBitmapSearchFreeZone(pfsMount, &a, 2); + if (*result < 0) + return 0; + inode = pfsCacheGetData(pfsMount, a.subpart, a.number << pfsMount->inode_scale, + PFS_CACHE_FLAG_SEGD | PFS_CACHE_FLAG_NOLOAD, result); + if (inode == NULL) + return NULL; + + // Initialise the inode (which has been allocate blocks specified by a) + pfsInodeFill(inode, (pfs_blockinfo_t *)&a, mode, uid, gid); + if ((mode & FIO_S_IFMT) != FIO_S_IFDIR) + return inode; + + b.number = a.number; + b.subpart = a.subpart; + b.count = a.count; + + *result = pfsBitmapSearchFreeZone(pfsMount, (pfs_blockinfo_t *)&a, 0); + if (*result < 0) { + pfsCacheFree(inode); + pfsBitmapFreeBlockSegment(pfsMount, (pfs_blockinfo_t *)&b); + return NULL; + } + + inode->u.inode->data[1].number = a.number; + inode->u.inode->data[1].subpart = a.subpart; + inode->u.inode->data[1].count = a.count; + + return inode; } int pfsCheckAccess(pfs_cache_t *clink, int flags) { - int mode; - - // Bail if trying to write to read-only mount - if ((clink->pfsMount->flags & FIO_MT_RDONLY) && (flags & O_WRONLY)) - return -EROFS; - - if (((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) && - ((clink->u.inode->mode & 0111) == 0)) - mode=6; - else - mode=7; - return ((mode & flags) & 7) == flags ? 0 : -EACCES; + int mode; + + // Bail if trying to write to read-only mount + if ((clink->pfsMount->flags & FIO_MT_RDONLY) && (flags & O_WRONLY)) + return -EROFS; + + if (((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) && + ((clink->u.inode->mode & 0111) == 0)) + mode = 6; + else + mode = 7; + return ((mode & flags) & 7) == flags ? 0 : -EACCES; } -char* pfsSplitPath(char *filename, char *path, int *result) +char *pfsSplitPath(char *filename, char *path, int *result) { - int i=0; - int j=0; - - for (i=0; filename[i] == '/'; i++) - ; - - for (; i<1024 && filename[i] != '/'; i++){ - if (filename[i] == 0) break; - if (j < 255) - path[j++] = filename[i]; - } - - if (j<256) - path[j]=0; - - while (filename[i] == '/') - if (i<1024) - i++; - else - break; - if (i<1024) - return &filename[i]; - - *result=-ENAMETOOLONG; - return 0; + int i = 0; + int j = 0; + + for (i = 0; filename[i] == '/'; i++) + ; + + for (; i < 1024 && filename[i] != '/'; i++) { + if (filename[i] == 0) + break; + if (j < 255) + path[j++] = filename[i]; + } + + if (j < 256) + path[j] = 0; + + while (filename[i] == '/') + if (i < 1024) + i++; + else + break; + if (i < 1024) + return &filename[i]; + + *result = -ENAMETOOLONG; + return 0; } u16 pfsGetMaxIndex(pfs_mount_t *pfsMount) { - u32 max=0, maxI=0, i, v; - - for (i=0; i < pfsMount->num_subs + 1; i++) //enumerate all subs - { - v = (pfsMount->free_zone[i] * (u64)100) / - (pfsMount->blockDev->getSize(pfsMount->fd, i) >> pfsMount->sector_scale); - if (max < v) - { - max=v; - maxI=i; - } - } - return maxI; + u32 max = 0, maxI = 0, i, v; + + for (i = 0; i < pfsMount->num_subs + 1; i++) //enumerate all subs + { + v = (pfsMount->free_zone[i] * (u64)100) / + (pfsMount->blockDev->getSize(pfsMount->fd, i) >> pfsMount->sector_scale); + if (max < v) { + max = v; + maxI = i; + } + } + return maxI; } int pfsAllocZones(pfs_cache_t *clink, int msize, int mode) { - pfs_blockpos_t blockpos; - int result=0; - u32 val; - int zsize; - - zsize=clink->pfsMount->zsize; - val=((msize-1 + zsize) & (-zsize)) / zsize; - - if(mode==0) - if (((clink->u.inode->number_blocks-clink->u.inode->number_segdesg) *(u64)zsize) - >= (clink->u.inode->size + msize)) - return 0; - - if((blockpos.inode = pfsBlockGetLastSegmentDescriptorInode(clink, &result))) - { - blockpos.block_offset=blockpos.byte_offset=0; - blockpos.block_segment=clink->u.inode->number_data-1; - val-=pfsBlockExpandSegment(clink, &blockpos, val); - while (val && ((result=pfsBlockAllocNewSegment(clink, &blockpos, val))>=0)){ - val-=result; - result=0; - } - pfsCacheFree(blockpos.inode); - } - return result; + pfs_blockpos_t blockpos; + int result = 0; + u32 val; + int zsize; + + zsize = clink->pfsMount->zsize; + val = ((msize - 1 + zsize) & (-zsize)) / zsize; + + if (mode == 0) + if (((clink->u.inode->number_blocks - clink->u.inode->number_segdesg) * (u64)zsize) >= (clink->u.inode->size + msize)) + return 0; + + if ((blockpos.inode = pfsBlockGetLastSegmentDescriptorInode(clink, &result))) { + blockpos.block_offset = blockpos.byte_offset = 0; + blockpos.block_segment = clink->u.inode->number_data - 1; + val -= pfsBlockExpandSegment(clink, &blockpos, val); + while (val && ((result = pfsBlockAllocNewSegment(clink, &blockpos, val)) >= 0)) { + val -= result; + result = 0; + } + pfsCacheFree(blockpos.inode); + } + return result; } void pfsFreeZones(pfs_cache_t *pfree) { - pfs_blockinfo_t b; - int result; - pfs_mount_t *pfsMount = pfree->pfsMount; - pfs_inode_t *inode = pfree->u.inode; - u32 nextsegdesc = 1, limit = inode->number_data, i, j = 0, zones; - pfs_blockinfo_t *bi; - pfs_cache_t *clink; - - zones = (u32)(inode->size / pfsMount->zsize); - if(inode->size % pfsMount->zsize) - zones++; - if(inode->number_segdesg + zones == inode->number_blocks) - return; - - j = zones; - b.number = 0; - clink = pfsCacheUsedAdd(pfree); - - // iterate through each of the block segments used by the inode - for (i = 1; i < limit && j; i++) - { - if(pfsFixIndex(i) == 0) - { - if ((clink = pfsBlockGetNextSegment(clink, &result)) == 0) - return; - - nextsegdesc++; - } - else - if(j < clink->u.inode->data[pfsFixIndex(i)].count) - { - clink->u.inode->data[pfsFixIndex(i)].count -= j; - b.subpart = clink->u.inode->data[pfsFixIndex(i)].subpart; - b.count = j; - b.number = clink->u.inode->data[pfsFixIndex(i)].number + - clink->u.inode->data[pfsFixIndex(i)].count; - j = 0; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - } - else - j -= clink->u.inode->data[pfsFixIndex(i)].count; - } - - pfree->u.inode->number_data = i; - pfree->u.inode->number_blocks = zones + nextsegdesc; - pfree->u.inode->number_segdesg = nextsegdesc; - pfree->u.inode->last_segment.number = clink->u.inode->data[0].number; - pfree->u.inode->last_segment.subpart= clink->u.inode->data[0].subpart; - pfree->u.inode->last_segment.count = clink->u.inode->data[0].count; - pfree->flags |= PFS_CACHE_FLAG_DIRTY; - - if (b.number) - pfsBitmapFreeBlockSegment(pfsMount, &b); - - while(i < limit) - { - if (pfsFixIndex(i) == 0) - { - if((clink = pfsBlockGetNextSegment(clink, &result)) == 0) - return; - } - bi = &clink->u.inode->data[pfsFixIndex(i++)]; - pfsBitmapFreeBlockSegment(pfsMount, bi); - pfsCacheMarkClean(pfsMount, bi->subpart, bi->number<inode_scale, - (bi->number+bi->count)<inode_scale); - } - - pfsCacheFree(clink); + pfs_blockinfo_t b; + int result; + pfs_mount_t *pfsMount = pfree->pfsMount; + pfs_inode_t *inode = pfree->u.inode; + u32 nextsegdesc = 1, limit = inode->number_data, i, j = 0, zones; + pfs_blockinfo_t *bi; + pfs_cache_t *clink; + + zones = (u32)(inode->size / pfsMount->zsize); + if (inode->size % pfsMount->zsize) + zones++; + if (inode->number_segdesg + zones == inode->number_blocks) + return; + + j = zones; + b.number = 0; + clink = pfsCacheUsedAdd(pfree); + + // iterate through each of the block segments used by the inode + for (i = 1; i < limit && j; i++) { + if (pfsFixIndex(i) == 0) { + if ((clink = pfsBlockGetNextSegment(clink, &result)) == 0) + return; + + nextsegdesc++; + } else if (j < clink->u.inode->data[pfsFixIndex(i)].count) { + clink->u.inode->data[pfsFixIndex(i)].count -= j; + b.subpart = clink->u.inode->data[pfsFixIndex(i)].subpart; + b.count = j; + b.number = clink->u.inode->data[pfsFixIndex(i)].number + + clink->u.inode->data[pfsFixIndex(i)].count; + j = 0; + clink->flags |= PFS_CACHE_FLAG_DIRTY; + } else + j -= clink->u.inode->data[pfsFixIndex(i)].count; + } + + pfree->u.inode->number_data = i; + pfree->u.inode->number_blocks = zones + nextsegdesc; + pfree->u.inode->number_segdesg = nextsegdesc; + pfree->u.inode->last_segment.number = clink->u.inode->data[0].number; + pfree->u.inode->last_segment.subpart = clink->u.inode->data[0].subpart; + pfree->u.inode->last_segment.count = clink->u.inode->data[0].count; + pfree->flags |= PFS_CACHE_FLAG_DIRTY; + + if (b.number) + pfsBitmapFreeBlockSegment(pfsMount, &b); + + while (i < limit) { + if (pfsFixIndex(i) == 0) { + if ((clink = pfsBlockGetNextSegment(clink, &result)) == 0) + return; + } + bi = &clink->u.inode->data[pfsFixIndex(i++)]; + pfsBitmapFreeBlockSegment(pfsMount, bi); + pfsCacheMarkClean(pfsMount, bi->subpart, bi->number << pfsMount->inode_scale, + (bi->number + bi->count) << pfsMount->inode_scale); + } + + pfsCacheFree(clink); } diff --git a/modules/hdd/libpfs/src/inode.c b/modules/hdd/libpfs/src/inode.c index 49b4a6bbc..bd753eb9b 100644 --- a/modules/hdd/libpfs/src/inode.c +++ b/modules/hdd/libpfs/src/inode.c @@ -24,102 +24,102 @@ extern u32 pfsMetaSize; void pfsInodePrint(pfs_inode_t *inode) { - PFS_PRINTF(PFS_DRV_NAME": pfsInodePrint: Checksum = 0x%lX, Magic = 0x%lX\n", inode->checksum, inode->magic); - PFS_PRINTF(PFS_DRV_NAME": Mode = 0x%X, attr = 0x%X\n", inode->mode, inode->attr); - PFS_PRINTF(PFS_DRV_NAME": size = 0x%08lX%08lX\n", (u32)(inode->size >> 32), (u32)(inode->size)); + PFS_PRINTF(PFS_DRV_NAME ": pfsInodePrint: Checksum = 0x%lX, Magic = 0x%lX\n", inode->checksum, inode->magic); + PFS_PRINTF(PFS_DRV_NAME ": Mode = 0x%X, attr = 0x%X\n", inode->mode, inode->attr); + PFS_PRINTF(PFS_DRV_NAME ": size = 0x%08lX%08lX\n", (u32)(inode->size >> 32), (u32)(inode->size)); } int pfsInodeCheckSum(pfs_inode_t *inode) { - u32 *ptr=(u32 *)inode; - u32 sum=0; - int i; + u32 *ptr = (u32 *)inode; + u32 sum = 0; + int i; - for(i=1; i < 256; i++) - sum+=ptr[i]; - return sum; + for (i = 1; i < 256; i++) + sum += ptr[i]; + return sum; } pfs_cache_t *pfsInodeGetData(pfs_mount_t *pfsMount, u16 sub, u32 inode, int *result) { - return pfsCacheGetData(pfsMount, sub, inode << pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGD, result); + return pfsCacheGetData(pfsMount, sub, inode << pfsMount->inode_scale, + PFS_CACHE_FLAG_SEGD, result); } void pfsInodeSetTime(pfs_cache_t *clink) -{ // set the inode time's in cache - pfsGetTime(&clink->u.inode->mtime); - memcpy(&clink->u.inode->ctime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); - memcpy(&clink->u.inode->atime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); - clink->flags|=PFS_CACHE_FLAG_DIRTY; +{ // set the inode time's in cache + pfsGetTime(&clink->u.inode->mtime); + memcpy(&clink->u.inode->ctime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); + memcpy(&clink->u.inode->atime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); + clink->flags |= PFS_CACHE_FLAG_DIRTY; } int pfsInodeSync(pfs_blockpos_t *blockpos, u64 size, u32 used_segments) { - int result=0; - u32 i; - u16 count; + int result = 0; + u32 i; + u16 count; - for(i=pfsBlockSyncPos(blockpos, size); i; ) - { - count=blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)].count; + for (i = pfsBlockSyncPos(blockpos, size); i;) { + count = blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)].count; - i+=blockpos->block_offset; + i += blockpos->block_offset; - if (i < count){ - blockpos->block_offset=i; - break; - } + if (i < count) { + blockpos->block_offset = i; + break; + } - i-=count; + i -= count; - if (blockpos->block_segment + 1 == used_segments) - { - blockpos->block_offset=count; - if (i || blockpos->byte_offset){ - PFS_PRINTF(PFS_DRV_NAME": panic: fp exceeds file.\n"); - return -EINVAL; - } - }else{ - blockpos->block_offset=0; - blockpos->block_segment++; - } + if (blockpos->block_segment + 1 == used_segments) { + blockpos->block_offset = count; + if (i || blockpos->byte_offset) { + PFS_PRINTF(PFS_DRV_NAME ": panic: fp exceeds file.\n"); + return -EINVAL; + } + } else { + blockpos->block_offset = 0; + blockpos->block_segment++; + } - if (pfsFixIndex(blockpos->block_segment)) - continue; + if (pfsFixIndex(blockpos->block_segment)) + continue; - if ((blockpos->inode = pfsBlockGetNextSegment(blockpos->inode, &result)) == 0) - break; + if ((blockpos->inode = pfsBlockGetNextSegment(blockpos->inode, &result)) == 0) + break; - i++; - } + i++; + } - return result; + return result; } pfs_cache_t *pfsGetDentriesChunk(pfs_blockpos_t *position, int *result) { - pfs_blockinfo_t *bi; - pfs_mount_t *pfsMount=position->inode->pfsMount; + pfs_blockinfo_t *bi; + pfs_mount_t *pfsMount = position->inode->pfsMount; - bi = &position->inode->u.inode->data[pfsFixIndex(position->block_segment)]; + bi = &position->inode->u.inode->data[pfsFixIndex(position->block_segment)]; - return pfsCacheGetData(pfsMount, bi->subpart, - ((bi->number + position->block_offset) << pfsMount->inode_scale) + - position->byte_offset / pfsMetaSize, PFS_CACHE_FLAG_NOTHING, result); + return pfsCacheGetData(pfsMount, bi->subpart, + ((bi->number + position->block_offset) << pfsMount->inode_scale) + + position->byte_offset / pfsMetaSize, + PFS_CACHE_FLAG_NOTHING, result); } pfs_cache_t *pfsGetDentriesAtPos(pfs_cache_t *clink, u64 position, int *offset, int *result) { - pfs_blockpos_t blockpos; - pfs_cache_t *r; - *result=pfsBlockInitPos(clink, &blockpos, position); - if (*result) return 0; + pfs_blockpos_t blockpos; + pfs_cache_t *r; + *result = pfsBlockInitPos(clink, &blockpos, position); + if (*result) + return 0; - *offset=blockpos.byte_offset % pfsMetaSize; + *offset = blockpos.byte_offset % pfsMetaSize; - r=pfsGetDentriesChunk(&blockpos, result); - pfsCacheFree(blockpos.inode); + r = pfsGetDentriesChunk(&blockpos, result); + pfsCacheFree(blockpos.inode); - return r; + return r; } diff --git a/modules/hdd/libpfs/src/journal.c b/modules/hdd/libpfs/src/journal.c index c72d2babb..d40f35a81 100644 --- a/modules/hdd/libpfs/src/journal.c +++ b/modules/hdd/libpfs/src/journal.c @@ -29,118 +29,114 @@ pfs_journal_t pfsJournalBuf; int pfsJournalChecksum(void *header) { - u32 *ptr=(u32 *)header; - u32 sum=0; - int i; - for(i=2; i < 256; i++) - sum+=ptr[i]; - return sum & 0xFFFF; + u32 *ptr = (u32 *)header; + u32 sum = 0; + int i; + for (i = 2; i < 256; i++) + sum += ptr[i]; + return sum & 0xFFFF; } void pfsJournalWrite(pfs_mount_t *pfsMount, pfs_cache_t *clink, u32 pfsCacheNumBuffers) { - u32 i=0; - u32 logSector=2; - - for(i=0; i checksum=pfsInodeCheckSum(clink[i].u.inode); - pfsJournalBuf.log[pfsJournalBuf.num].sector = clink[i].sector << pfsBlockSize; - pfsJournalBuf.log[pfsJournalBuf.num].sub = clink[i].sub; - pfsJournalBuf.log[pfsJournalBuf.num].logSector = logSector; - pfsJournalBuf.num+=1; - } - logSector+=2; - } - - if(pfsMount->blockDev->transfer(pfsMount->fd, clink->u.inode, 0, - (pfsMount->log.number << pfsMount->sector_scale) + 2, pfsCacheNumBuffers*2, - PFS_IO_MODE_WRITE)>=0) - pfsJournalFlush(pfsMount); + u32 i = 0; + u32 logSector = 2; + + for (i = 0; i < pfsCacheNumBuffers; i++) { + if ((clink[i].flags & PFS_CACHE_FLAG_DIRTY) && clink[i].pfsMount == pfsMount) { + if (clink[i].flags & (PFS_CACHE_FLAG_SEGD | PFS_CACHE_FLAG_SEGI)) + clink[i].u.inode->checksum = pfsInodeCheckSum(clink[i].u.inode); + pfsJournalBuf.log[pfsJournalBuf.num].sector = clink[i].sector << pfsBlockSize; + pfsJournalBuf.log[pfsJournalBuf.num].sub = clink[i].sub; + pfsJournalBuf.log[pfsJournalBuf.num].logSector = logSector; + pfsJournalBuf.num += 1; + } + logSector += 2; + } + + if (pfsMount->blockDev->transfer(pfsMount->fd, clink->u.inode, 0, + (pfsMount->log.number << pfsMount->sector_scale) + 2, pfsCacheNumBuffers * 2, + PFS_IO_MODE_WRITE) >= 0) + pfsJournalFlush(pfsMount); } int pfsJournalReset(pfs_mount_t *pfsMount) { - int rv; + int rv; - memset(&pfsJournalBuf, 0, sizeof(pfs_journal_t)); - pfsJournalBuf.magic=PFS_JOUNRNAL_MAGIC; + memset(&pfsJournalBuf, 0, sizeof(pfs_journal_t)); + pfsJournalBuf.magic = PFS_JOUNRNAL_MAGIC; - pfsMount->blockDev->flushCache(pfsMount->fd); + pfsMount->blockDev->flushCache(pfsMount->fd); - rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, - (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE); + rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, + (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE); - pfsMount->blockDev->flushCache(pfsMount->fd); - return rv; + pfsMount->blockDev->flushCache(pfsMount->fd); + return rv; } int pfsJournalResetThis(pfs_block_device_t *blockDev, int fd, u32 sector) { - memset(&pfsJournalBuf, 0, sizeof(pfs_journal_t)); - pfsJournalBuf.magic=PFS_JOUNRNAL_MAGIC; - return blockDev->transfer(fd, &pfsJournalBuf, 0, sector, 2, 1); + memset(&pfsJournalBuf, 0, sizeof(pfs_journal_t)); + pfsJournalBuf.magic = PFS_JOUNRNAL_MAGIC; + return blockDev->transfer(fd, &pfsJournalBuf, 0, sector, 2, 1); } int pfsJournalFlush(pfs_mount_t *pfsMount) -{// this write any thing that in are journal buffer :) - int rv; +{ // this write any thing that in are journal buffer :) + int rv; - pfsMount->blockDev->flushCache(pfsMount->fd); + pfsMount->blockDev->flushCache(pfsMount->fd); - pfsJournalBuf.checksum=pfsJournalChecksum(&pfsJournalBuf); + pfsJournalBuf.checksum = pfsJournalChecksum(&pfsJournalBuf); - rv=pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, - (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE); + rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, + (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE); - pfsMount->blockDev->flushCache(pfsMount->fd); - return rv; + pfsMount->blockDev->flushCache(pfsMount->fd); + return rv; } int pfsJournalRestore(pfs_mount_t *pfsMount) { - int rv; - int result; - pfs_cache_t *clink; - u32 i; - - // Read journal buffer from disk - rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, - (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_READ); - - if(rv || (pfsJournalBuf.magic != PFS_JOUNRNAL_MAGIC) || - (pfsJournalBuf.checksum != (u16)pfsJournalChecksum(&pfsJournalBuf))) - { - PFS_PRINTF(PFS_DRV_NAME": Error: cannot read log/invalid log\n"); - return pfsJournalReset(pfsMount); - } - - if(pfsJournalBuf.num == 0) - { - return pfsJournalReset(pfsMount); - } - - clink = pfsCacheAllocClean(&result); - if(!clink) - return result; - - for(i = 0; i < pfsJournalBuf.num; i++) - { - PFS_PRINTF(PFS_DRV_NAME": Log overwrite %d:%08lx\n", pfsJournalBuf.log[i].sub, pfsJournalBuf.log[i].sector); - - // Read data in from log section on disk into cache buffer - rv = pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, 0, - (pfsMount->log.number << pfsMount->sector_scale) + pfsJournalBuf.log[i].logSector, 2, - PFS_IO_MODE_READ); - - // Write from cache buffer into destination location on disk - if(!rv) - pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, pfsJournalBuf.log[i].sub, - pfsJournalBuf.log[i].sector, 2, PFS_IO_MODE_WRITE); - } - - pfsCacheFree(clink); - return pfsJournalReset(pfsMount); + int rv; + int result; + pfs_cache_t *clink; + u32 i; + + // Read journal buffer from disk + rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, + (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_READ); + + if (rv || (pfsJournalBuf.magic != PFS_JOUNRNAL_MAGIC) || + (pfsJournalBuf.checksum != (u16)pfsJournalChecksum(&pfsJournalBuf))) { + PFS_PRINTF(PFS_DRV_NAME ": Error: cannot read log/invalid log\n"); + return pfsJournalReset(pfsMount); + } + + if (pfsJournalBuf.num == 0) { + return pfsJournalReset(pfsMount); + } + + clink = pfsCacheAllocClean(&result); + if (!clink) + return result; + + for (i = 0; i < pfsJournalBuf.num; i++) { + PFS_PRINTF(PFS_DRV_NAME ": Log overwrite %d:%08lx\n", pfsJournalBuf.log[i].sub, pfsJournalBuf.log[i].sector); + + // Read data in from log section on disk into cache buffer + rv = pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, 0, + (pfsMount->log.number << pfsMount->sector_scale) + pfsJournalBuf.log[i].logSector, 2, + PFS_IO_MODE_READ); + + // Write from cache buffer into destination location on disk + if (!rv) + pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, pfsJournalBuf.log[i].sub, + pfsJournalBuf.log[i].sector, 2, PFS_IO_MODE_WRITE); + } + + pfsCacheFree(clink); + return pfsJournalReset(pfsMount); } diff --git a/modules/hdd/libpfs/src/misc.c b/modules/hdd/libpfs/src/misc.c index b3a59b16f..340b414ca 100644 --- a/modules/hdd/libpfs/src/misc.c +++ b/modules/hdd/libpfs/src/misc.c @@ -28,194 +28,192 @@ void *pfsAllocMem(int size) { - int intrStat; - void *mem; + int intrStat; + void *mem; - CpuSuspendIntr(&intrStat); - mem = AllocSysMemory(ALLOC_FIRST, size, NULL); - CpuResumeIntr(intrStat); + CpuSuspendIntr(&intrStat); + mem = AllocSysMemory(ALLOC_FIRST, size, NULL); + CpuResumeIntr(intrStat); - return mem; + return mem; } void pfsFreeMem(void *buffer) { - int OldState; + int OldState; - CpuSuspendIntr(&OldState); - FreeSysMemory(buffer); - CpuResumeIntr(OldState); + CpuSuspendIntr(&OldState); + FreeSysMemory(buffer); + CpuResumeIntr(OldState); } int pfsGetTime(pfs_datetime_t *tm) { - sceCdCLOCK cdtime; - static pfs_datetime_t timeBuf={ - 0, 0x0D, 0x0E, 0x0A, 0x0D, 1, 2003 // used if can not get time... - }; - - if(sceCdReadClock(&cdtime)!=0 && cdtime.stat==0) - { - timeBuf.sec=btoi(cdtime.second); - timeBuf.min=btoi(cdtime.minute); - timeBuf.hour=btoi(cdtime.hour); - timeBuf.day=btoi(cdtime.day); - timeBuf.month=btoi(cdtime.month & 0x7F); //The old CDVDMAN sceCdReadClock() function does not automatically file off the highest bit. - timeBuf.year=btoi(cdtime.year) + 2000; - } - memcpy(tm, &timeBuf, sizeof(pfs_datetime_t)); - return 0; + sceCdCLOCK cdtime; + static pfs_datetime_t timeBuf = { + 0, 0x0D, 0x0E, 0x0A, 0x0D, 1, 2003 // used if can not get time... + }; + + if (sceCdReadClock(&cdtime) != 0 && cdtime.stat == 0) { + timeBuf.sec = btoi(cdtime.second); + timeBuf.min = btoi(cdtime.minute); + timeBuf.hour = btoi(cdtime.hour); + timeBuf.day = btoi(cdtime.day); + timeBuf.month = btoi(cdtime.month & 0x7F); //The old CDVDMAN sceCdReadClock() function does not automatically file off the highest bit. + timeBuf.year = btoi(cdtime.year) + 2000; + } + memcpy(tm, &timeBuf, sizeof(pfs_datetime_t)); + return 0; } int pfsFsckStat(pfs_mount_t *pfsMount, pfs_super_block_t *superblock, - u32 stat, int mode) -{ // mode 0=set flag, 1=remove flag, else check stat - - if(pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, - PFS_IO_MODE_READ)==0) - { - switch(mode) - { - case PFS_MODE_SET_FLAG: - superblock->pfsFsckStat|=stat; - break; - case PFS_MODE_REMOVE_FLAG: - superblock->pfsFsckStat&=~stat; - break; - default/*PFS_MODE_CHECK_FLAG*/: - return 0 < (superblock->pfsFsckStat & stat); - } - pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, - PFS_IO_MODE_WRITE); - pfsMount->blockDev->flushCache(pfsMount->fd); - } - return 0; + u32 stat, int mode) +{ // mode 0=set flag, 1=remove flag, else check stat + + if (pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, + PFS_IO_MODE_READ) == 0) { + switch (mode) { + case PFS_MODE_SET_FLAG: + superblock->pfsFsckStat |= stat; + break; + case PFS_MODE_REMOVE_FLAG: + superblock->pfsFsckStat &= ~stat; + break; + default /*PFS_MODE_CHECK_FLAG*/: + return 0 < (superblock->pfsFsckStat & stat); + } + pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, + PFS_IO_MODE_WRITE); + pfsMount->blockDev->flushCache(pfsMount->fd); + } + return 0; } -void pfsPrintBitmap(const u32 *bitmap) { - u32 i, j; - char a[48+1], b[16+1]; - - b[16]=0; - for (i=0; i < 32; i++){ - memset(a, 0, 49); - for (j=0; j < 16; j++){ - const char *c=(const char*)bitmap+j+i*16; - - sprintf(a+j*3, "%02x ", *c); - b[j] = ((*c>=0) && (isgraph(*c))) ? - *c : '.'; - } - PFS_PRINTF("%s%s\n", a, b); - } +void pfsPrintBitmap(const u32 *bitmap) +{ + u32 i, j; + char a[48 + 1], b[16 + 1]; + + b[16] = 0; + for (i = 0; i < 32; i++) { + memset(a, 0, 49); + for (j = 0; j < 16; j++) { + const char *c = (const char *)bitmap + j + i * 16; + + sprintf(a + j * 3, "%02x ", *c); + b[j] = ((*c >= 0) && (isgraph(*c))) ? + *c : + '.'; + } + PFS_PRINTF("%s%s\n", a, b); + } } int pfsGetScale(int num, int size) { - int scale = 0; + int scale = 0; - while((size << scale) != num) - scale++; + while ((size << scale) != num) + scale++; - return scale; + return scale; } u32 pfsFixIndex(u32 index) { - if(index < 114) - return index; + if (index < 114) + return index; - index -= 114; - return index % 123; + index -= 114; + return index % 123; } /////////////////////////////////////////////////////////////////////////////// // Functions to work with hdd.irx -static int pfsHddTransfer(int fd, void *buffer, u32 sub/*0=main 1+=subs*/, u32 sector, - u32 size/* in sectors*/, u32 mode); +static int pfsHddTransfer(int fd, void *buffer, u32 sub /*0=main 1+=subs*/, u32 sector, + u32 size /* in sectors*/, u32 mode); static u32 pfsHddGetSubCount(int fd); -static u32 pfsHddGetPartSize(int fd, u32 sub/*0=main 1+=subs*/); +static u32 pfsHddGetPartSize(int fd, u32 sub /*0=main 1+=subs*/); static void pfsHddSetPartError(int fd); static int pfsHddFlushCache(int fd); -#define NUM_SUPPORTED_DEVICES 1 +#define NUM_SUPPORTED_DEVICES 1 pfs_block_device_t pfsBlockDeviceCallTable[NUM_SUPPORTED_DEVICES] = { - { - "hdd", - &pfsHddTransfer, - &pfsHddGetSubCount, - &pfsHddGetPartSize, - &pfsHddSetPartError, - &pfsHddFlushCache, - } -}; + { + "hdd", + &pfsHddTransfer, + &pfsHddGetSubCount, + &pfsHddGetPartSize, + &pfsHddSetPartError, + &pfsHddFlushCache, + }}; pfs_block_device_t *pfsGetBlockDeviceTable(const char *name) { - char *end; - char devname[32]; - char *tmp; - u32 len; - int i; - - while(name[0] == ' ') - name++; - - end = strchr(name, ':'); - if(!end) { - PFS_PRINTF(PFS_DRV_NAME": Error: Unknown block device '%s'\n", name); - return NULL; - } - - len = (u32)end - (u32)name; - strncpy(devname, name, len); - devname[len] = '\0'; - - // Loop until digit is found, then terminate string at that digit. - // Should then have just the device name left, minus any front spaces or trailing digits. - tmp = devname; - while(!(isdigit(tmp[0]))) - tmp++; - tmp[0] = '\0'; - - for(i = 0; i < NUM_SUPPORTED_DEVICES; i++) - if(!strcmp(pfsBlockDeviceCallTable[i].devName, devname)) - return &pfsBlockDeviceCallTable[i]; - - return NULL; + char *end; + char devname[32]; + char *tmp; + u32 len; + int i; + + while (name[0] == ' ') + name++; + + end = strchr(name, ':'); + if (!end) { + PFS_PRINTF(PFS_DRV_NAME ": Error: Unknown block device '%s'\n", name); + return NULL; + } + + len = (u32)end - (u32)name; + strncpy(devname, name, len); + devname[len] = '\0'; + + // Loop until digit is found, then terminate string at that digit. + // Should then have just the device name left, minus any front spaces or trailing digits. + tmp = devname; + while (!(isdigit(tmp[0]))) + tmp++; + tmp[0] = '\0'; + + for (i = 0; i < NUM_SUPPORTED_DEVICES; i++) + if (!strcmp(pfsBlockDeviceCallTable[i].devName, devname)) + return &pfsBlockDeviceCallTable[i]; + + return NULL; } -static int pfsHddTransfer(int fd, void *buffer, u32 sub/*0=main 1+=subs*/, u32 sector, - u32 size/* in sectors*/, u32 mode) +static int pfsHddTransfer(int fd, void *buffer, u32 sub /*0=main 1+=subs*/, u32 sector, + u32 size /* in sectors*/, u32 mode) { - hddIoctl2Transfer_t t; + hddIoctl2Transfer_t t; - t.sub=sub; - t.sector=sector; - t.size=size; - t.mode=mode; - t.buffer=buffer; + t.sub = sub; + t.sector = sector; + t.size = size; + t.mode = mode; + t.buffer = buffer; - return ioctl2(fd, HIOCTRANSFER, &t, 0, NULL, 0); + return ioctl2(fd, HIOCTRANSFER, &t, 0, NULL, 0); } static u32 pfsHddGetSubCount(int fd) { - return ioctl2(fd, HIOCNSUB, NULL, 0, NULL, 0); + return ioctl2(fd, HIOCNSUB, NULL, 0, NULL, 0); } -static u32 pfsHddGetPartSize(int fd, u32 sub/*0=main 1+=subs*/) -{ // of a partition - return ioctl2(fd, HIOCGETSIZE, &sub, 0, NULL, 0); +static u32 pfsHddGetPartSize(int fd, u32 sub /*0=main 1+=subs*/) +{ // of a partition + return ioctl2(fd, HIOCGETSIZE, &sub, 0, NULL, 0); } static void pfsHddSetPartError(int fd) { - ioctl2(fd, HIOCSETPARTERROR, NULL, 0, NULL, 0); + ioctl2(fd, HIOCSETPARTERROR, NULL, 0, NULL, 0); } static int pfsHddFlushCache(int fd) { - return ioctl2(fd,HIOCFLUSH, NULL, 0, NULL, 0); + return ioctl2(fd, HIOCFLUSH, NULL, 0, NULL, 0); } diff --git a/modules/hdd/libpfs/src/super.c b/modules/hdd/libpfs/src/super.c index f71c01f17..b3bab8c06 100644 --- a/modules/hdd/libpfs/src/super.c +++ b/modules/hdd/libpfs/src/super.c @@ -18,36 +18,35 @@ #include "pfs-opt.h" #include "libpfs.h" -int pfsBlockSize = 1;// block size(in sectors(512) ) +int pfsBlockSize = 1; // block size(in sectors(512) ) u32 pfsMetaSize = 1024; // size of each metadata structure int pfsCheckZoneSize(u32 zone_size) { - if((zone_size & (zone_size - 1)) || (zone_size < (2 * 1024)) || (zone_size > (128 * 1024))) - { - PFS_PRINTF(PFS_DRV_NAME": Error: Invalid zone size\n"); - return 0; - } + if ((zone_size & (zone_size - 1)) || (zone_size < (2 * 1024)) || (zone_size > (128 * 1024))) { + PFS_PRINTF(PFS_DRV_NAME ": Error: Invalid zone size\n"); + return 0; + } - return 1; + return 1; } // Returns the number of sectors (512 byte units) which will be used // for bitmaps, given the zone size and partition size u32 pfsGetBitmapSizeSectors(int zoneScale, u32 partSize) { - int w, zones = partSize / (1 << zoneScale); + int w, zones = partSize / (1 << zoneScale); - w = (zones & 7); - zones = zones / 8 + w; + w = (zones & 7); + zones = zones / 8 + w; - w = (zones & 511); - return zones / 512 + w; + w = (zones & 511); + return zones / 512 + w; } // Returns the number of blocks/zones which will be used for bitmaps u32 pfsGetBitmapSizeBlocks(int scale, u32 mainsize) { - u32 a=pfsGetBitmapSizeSectors(scale, mainsize); - return a / (1<0); + u32 a = pfsGetBitmapSizeSectors(scale, mainsize); + return a / (1 << scale) + ((a % (1 << scale)) > 0); } diff --git a/modules/hdd/libpfs/src/superWrite.c b/modules/hdd/libpfs/src/superWrite.c index 4a5343cda..d81139bd0 100644 --- a/modules/hdd/libpfs/src/superWrite.c +++ b/modules/hdd/libpfs/src/superWrite.c @@ -24,230 +24,220 @@ extern u32 pfsMetaSize; // Formats a partition (main or sub) by filling with fragment pattern and setting the bitmap accordingly int pfsFormatSub(pfs_block_device_t *blockDev, int fd, u32 sub, u32 reserved, u32 scale, u32 fragment) { - pfs_cache_t *cache; - int i; - u32 sector, count, size, *b; - int result = 0; - - size = blockDev->getSize(fd, sub); - sector = 1 << scale; - count = pfsGetBitmapSizeSectors(scale, size); - if (reserved>=2) - sector+=0x2000; - reserved += pfsGetBitmapSizeBlocks(scale, size); - - if((cache = pfsCacheAllocClean(&result))) - { - // fill with fragment pattern - for (i=127; i>=0; i--) - cache->u.bitmap[i]=fragment; - - // set as allocated the sectors up to reserved, for the first part of the bitmap - // this will mark the area the bitmaps themselves occupy as used - for (i=0, b=cache->u.bitmap; itransfer(fd, cache->u.bitmap, sub, sector++, 1, 1))>=0)) - for (i=127; i>=0; i--) - cache->u.bitmap[i]=fragment; - - PFS_PRINTF("sector end = %ld\n", sector - 1); - - pfsCacheFree(cache); - } - return result; + pfs_cache_t *cache; + int i; + u32 sector, count, size, *b; + int result = 0; + + size = blockDev->getSize(fd, sub); + sector = 1 << scale; + count = pfsGetBitmapSizeSectors(scale, size); + if (reserved >= 2) + sector += 0x2000; + reserved += pfsGetBitmapSizeBlocks(scale, size); + + if ((cache = pfsCacheAllocClean(&result))) { + // fill with fragment pattern + for (i = 127; i >= 0; i--) + cache->u.bitmap[i] = fragment; + + // set as allocated the sectors up to reserved, for the first part of the bitmap + // this will mark the area the bitmaps themselves occupy as used + for (i = 0, b = cache->u.bitmap; i < reserved; i++) { + if (i && ((i & 0x1F) == 0)) + b++; + *b |= 1 << (i & 0x1F); + } + + PFS_PRINTF(PFS_DRV_NAME ": Format sub: sub = %ld, sector start = %ld, ", sub, sector); + + // set the rest of the bitmap to the fragment + while (count-- && ((result = blockDev->transfer(fd, cache->u.bitmap, sub, sector++, 1, 1)) >= 0)) + for (i = 127; i >= 0; i--) + cache->u.bitmap[i] = fragment; + + PFS_PRINTF("sector end = %ld\n", sector - 1); + + pfsCacheFree(cache); + } + return result; } // Formats a partition and all sub-partitions with PFS int pfsFormat(pfs_block_device_t *blockDev, int fd, int zonesize, int fragment) { - int result, result2; - pfs_cache_t *clink, *cache; - pfs_super_block_t *sb; - int scale; - u32 i, mainsize, subnumber = blockDev->getSubNumber(fd); - - mainsize=blockDev->getSize(fd, 0); - if(pfsCheckZoneSize(zonesize) == 0) - return -EINVAL; - - scale = pfsGetScale(zonesize, 512); - - if((clink=pfsCacheAllocClean(&result))) - { - sb = clink->u.superblock; - memset(sb, 0, pfsMetaSize); - sb->magic = PFS_SUPER_MAGIC; - sb->version = 3; - sb->unknown1 = 0x201; - sb->zone_size = zonesize; - sb->num_subs = subnumber; - sb->log.number = pfsGetBitmapSizeBlocks(scale, mainsize) + (0x2000 >> scale) + 1; - sb->log.count = 0x20000 / zonesize ? 0x20000 / zonesize : 1; - - PFS_PRINTF(PFS_DRV_NAME": Format: log.number = %ld, log.count = %d\n", sb->log.number << scale, sb->log.count); - - sb->root.count = 1; - sb->root.number = sb->log.number + sb->log.count; - if((result = pfsJournalResetThis(blockDev, fd, sb->log.number<= 0) - { - if((cache = pfsCacheAllocClean(&result2))) - { - pfsFillSelfAndParentDentries(cache, &sb->root, &sb->root); - result2 = blockDev->transfer(fd, cache->u.dentry, 0, (sb->root.number+1) << scale, - 1 << pfsBlockSize, 1); - if(result2 == 0) - { - // setup root directory - pfsInodeFill(cache, &sb->root, 0x11FF, 0, 0); - cache->u.inode->data[1].subpart = 0; - cache->u.inode->data[1].number = sb->root.number + 1; - cache->u.inode->data[1].count = 1; - cache->u.inode->checksum = pfsInodeCheckSum(cache->u.inode); - - result2=blockDev->transfer(fd, cache->u.inode, 0, sb->root.number << scale, - 1 << pfsBlockSize, 1); - } - - pfsCacheFree(cache); - } - - if((result = result2) >= 0) - { - for (i=0; i < subnumber+1; i++) - if((result=pfsFormatSub(blockDev, fd, i, i ? 1 : (0x2000 >> scale) + - sb->log.count + 3, scale, fragment))<0) - break; - - if((result == 0) && ((result = blockDev->transfer(fd, sb, 0, PFS_SUPER_BACKUP_SECTOR, 1, 1))==0)) - result = blockDev->transfer(fd, sb, 0, PFS_SUPER_SECTOR, 1, 1); - } - } - - pfsCacheFree(clink); - blockDev->flushCache(fd); - } - return result; + int result, result2; + pfs_cache_t *clink, *cache; + pfs_super_block_t *sb; + int scale; + u32 i, mainsize, subnumber = blockDev->getSubNumber(fd); + + mainsize = blockDev->getSize(fd, 0); + if (pfsCheckZoneSize(zonesize) == 0) + return -EINVAL; + + scale = pfsGetScale(zonesize, 512); + + if ((clink = pfsCacheAllocClean(&result))) { + sb = clink->u.superblock; + memset(sb, 0, pfsMetaSize); + sb->magic = PFS_SUPER_MAGIC; + sb->version = 3; + sb->unknown1 = 0x201; + sb->zone_size = zonesize; + sb->num_subs = subnumber; + sb->log.number = pfsGetBitmapSizeBlocks(scale, mainsize) + (0x2000 >> scale) + 1; + sb->log.count = 0x20000 / zonesize ? 0x20000 / zonesize : 1; + + PFS_PRINTF(PFS_DRV_NAME ": Format: log.number = %ld, log.count = %d\n", sb->log.number << scale, sb->log.count); + + sb->root.count = 1; + sb->root.number = sb->log.number + sb->log.count; + if ((result = pfsJournalResetThis(blockDev, fd, sb->log.number << scale)) >= 0) { + if ((cache = pfsCacheAllocClean(&result2))) { + pfsFillSelfAndParentDentries(cache, &sb->root, &sb->root); + result2 = blockDev->transfer(fd, cache->u.dentry, 0, (sb->root.number + 1) << scale, + 1 << pfsBlockSize, 1); + if (result2 == 0) { + // setup root directory + pfsInodeFill(cache, &sb->root, 0x11FF, 0, 0); + cache->u.inode->data[1].subpart = 0; + cache->u.inode->data[1].number = sb->root.number + 1; + cache->u.inode->data[1].count = 1; + cache->u.inode->checksum = pfsInodeCheckSum(cache->u.inode); + + result2 = blockDev->transfer(fd, cache->u.inode, 0, sb->root.number << scale, + 1 << pfsBlockSize, 1); + } + + pfsCacheFree(cache); + } + + if ((result = result2) >= 0) { + for (i = 0; i < subnumber + 1; i++) + if ((result = pfsFormatSub(blockDev, fd, i, i ? 1 : (0x2000 >> scale) + sb->log.count + 3, scale, fragment)) < 0) + break; + + if ((result == 0) && ((result = blockDev->transfer(fd, sb, 0, PFS_SUPER_BACKUP_SECTOR, 1, 1)) == 0)) + result = blockDev->transfer(fd, sb, 0, PFS_SUPER_SECTOR, 1, 1); + } + } + + pfsCacheFree(clink); + blockDev->flushCache(fd); + } + return result; } // Formats sub partitions which are added to the main partition after it is initially // formatted with PFS int pfsUpdateSuperBlock(pfs_mount_t *pfsMount, pfs_super_block_t *superblock, u32 sub) { - u32 scale; - u32 i; - u32 count; - int rv; + u32 scale; + u32 i; + u32 count; + int rv; - scale = pfsGetScale(superblock->zone_size, 512); - count = superblock->num_subs + sub + 1; + scale = pfsGetScale(superblock->zone_size, 512); + count = superblock->num_subs + sub + 1; - for(i = superblock->num_subs + 1; i < count; i++) - { - rv = pfsFormatSub(pfsMount->blockDev, pfsMount->fd, i, 1, scale, 0); - if(rv < 0) - return rv; - } + for (i = superblock->num_subs + 1; i < count; i++) { + rv = pfsFormatSub(pfsMount->blockDev, pfsMount->fd, i, 1, scale, 0); + if (rv < 0) + return rv; + } - superblock->num_subs = sub; + superblock->num_subs = sub; - // Write superblock, then write backup - rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_WRITE); - if(!rv) - rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_BACKUP_SECTOR, 1, PFS_IO_MODE_WRITE); + // Write superblock, then write backup + rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_WRITE); + if (!rv) + rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_BACKUP_SECTOR, 1, PFS_IO_MODE_WRITE); - pfsMount->blockDev->flushCache(pfsMount->fd); + pfsMount->blockDev->flushCache(pfsMount->fd); - return rv; + return rv; } int pfsMountSuperBlock(pfs_mount_t *pfsMount) { - int result; - pfs_cache_t *clink; - pfs_super_block_t *superblock; - u32 sub; - u32 i; - - - // Get number of sub partitions attached to the main partition - sub = pfsMount->blockDev->getSubNumber(pfsMount->fd); - - // Allocate a cache entry for the superblock - clink = pfsCacheAllocClean(&result); - if(!clink) - return result; - - superblock = clink->u.superblock; - - // Read the suprerblock from the main partition - result = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_READ); - if(result) goto error; - - if((superblock->magic != PFS_SUPER_MAGIC) || (superblock->version >= PFS_VERSION)) - { - PFS_PRINTF(PFS_DRV_NAME": Error: Invalid magic/version\n"); - pfsCacheFree(clink); - return -EIO; - } - - if(!pfsCheckZoneSize(superblock->zone_size)) - result = -EIO; - - if((superblock->pfsFsckStat & PFS_FSCK_STAT_WRITE_ERROR) && (pfsMount->flags & PFS_FIO_ATTR_EXECUTABLE)) - result = -EIO; - - if(sub < superblock->num_subs) - { - PFS_PRINTF(PFS_DRV_NAME": Error: Filesystem larger than partition\n"); - result = -EIO; - } - - if(result) goto error; - - // If new subs have been added, update filesystem - if(superblock->num_subs < sub) - { - PFS_PRINTF(PFS_DRV_NAME": New subs added, updating filesystem..\n"); - result = pfsUpdateSuperBlock(pfsMount, superblock, sub); - } - - if(result) goto error; - - pfsMount->zsize = superblock->zone_size; - pfsMount->sector_scale = pfsGetScale(pfsMount->zsize, 512); - pfsMount->inode_scale = pfsGetScale(pfsMount->zsize, pfsMetaSize); - pfsMount->num_subs = superblock->num_subs; - memcpy(&pfsMount->root_dir, &superblock->root, sizeof(pfs_blockinfo_t)); - memcpy(&pfsMount->log, &superblock->log, sizeof(pfs_blockinfo_t)); - memcpy(&pfsMount->current_dir, &superblock->root, sizeof(pfs_blockinfo_t)); - pfsMount->total_sector = 0; - pfsMount->uid = 0; - pfsMount->gid = 0; - - // Do a journal restore (in case of un-clean unmount) - pfsJournalRestore(pfsMount); - - // Calculate free space and total size - for(i = 0; i < (pfsMount->num_subs + 1); i++) - { - int free; - - pfsMount->total_sector += pfsMount->blockDev->getSize(pfsMount->fd, i) >> pfsMount->sector_scale; - - free = pfsBitmapCalcFreeZones(pfsMount, i); - pfsMount->free_zone[i] = free; - pfsMount->zfree += free; - } + int result; + pfs_cache_t *clink; + pfs_super_block_t *superblock; + u32 sub; + u32 i; + + + // Get number of sub partitions attached to the main partition + sub = pfsMount->blockDev->getSubNumber(pfsMount->fd); + + // Allocate a cache entry for the superblock + clink = pfsCacheAllocClean(&result); + if (!clink) + return result; + + superblock = clink->u.superblock; + + // Read the suprerblock from the main partition + result = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_READ); + if (result) + goto error; + + if ((superblock->magic != PFS_SUPER_MAGIC) || (superblock->version >= PFS_VERSION)) { + PFS_PRINTF(PFS_DRV_NAME ": Error: Invalid magic/version\n"); + pfsCacheFree(clink); + return -EIO; + } + + if (!pfsCheckZoneSize(superblock->zone_size)) + result = -EIO; + + if ((superblock->pfsFsckStat & PFS_FSCK_STAT_WRITE_ERROR) && (pfsMount->flags & PFS_FIO_ATTR_EXECUTABLE)) + result = -EIO; + + if (sub < superblock->num_subs) { + PFS_PRINTF(PFS_DRV_NAME ": Error: Filesystem larger than partition\n"); + result = -EIO; + } + + if (result) + goto error; + + // If new subs have been added, update filesystem + if (superblock->num_subs < sub) { + PFS_PRINTF(PFS_DRV_NAME ": New subs added, updating filesystem..\n"); + result = pfsUpdateSuperBlock(pfsMount, superblock, sub); + } + + if (result) + goto error; + + pfsMount->zsize = superblock->zone_size; + pfsMount->sector_scale = pfsGetScale(pfsMount->zsize, 512); + pfsMount->inode_scale = pfsGetScale(pfsMount->zsize, pfsMetaSize); + pfsMount->num_subs = superblock->num_subs; + memcpy(&pfsMount->root_dir, &superblock->root, sizeof(pfs_blockinfo_t)); + memcpy(&pfsMount->log, &superblock->log, sizeof(pfs_blockinfo_t)); + memcpy(&pfsMount->current_dir, &superblock->root, sizeof(pfs_blockinfo_t)); + pfsMount->total_sector = 0; + pfsMount->uid = 0; + pfsMount->gid = 0; + + // Do a journal restore (in case of un-clean unmount) + pfsJournalRestore(pfsMount); + + // Calculate free space and total size + for (i = 0; i < (pfsMount->num_subs + 1); i++) { + int free; + + pfsMount->total_sector += pfsMount->blockDev->getSize(pfsMount->fd, i) >> pfsMount->sector_scale; + + free = pfsBitmapCalcFreeZones(pfsMount, i); + pfsMount->free_zone[i] = free; + pfsMount->zfree += free; + } error: - pfsCacheFree(clink); - return result; + pfsCacheFree(clink); + return result; } diff --git a/modules/hdd/pfs/pfs-opt.h b/modules/hdd/pfs/pfs-opt.h index d43b7b87d..bf64011eb 100644 --- a/modules/hdd/pfs/pfs-opt.h +++ b/modules/hdd/pfs/pfs-opt.h @@ -1,7 +1,7 @@ #ifndef _PFS_OPT_H #define _PFS_OPT_H -#define PFS_PRINTF(format,...) printf(format, ##__VA_ARGS__) -#define PFS_DRV_NAME "pfs" +#define PFS_PRINTF(format, ...) printf(format, ##__VA_ARGS__) +#define PFS_DRV_NAME "pfs" #endif diff --git a/modules/hdd/pfs/pfs.c b/modules/hdd/pfs/pfs.c index d6b7c0058..ec0830364 100644 --- a/modules/hdd/pfs/pfs.c +++ b/modules/hdd/pfs/pfs.c @@ -31,44 +31,42 @@ IRX_ID("pfs_driver", PFS_MAJOR, PFS_MINOR); // Globals iop_device_ops_t pfsOps = { - pfsFioInit, - pfsFioDeinit, - pfsFioFormat, - pfsFioOpen, - pfsFioClose, - pfsFioRead, - pfsFioWrite, - pfsFioLseek, - pfsFioIoctl, - pfsFioRemove, - pfsFioMkdir, - pfsFioRmdir, - pfsFioDopen, - pfsFioClose, - pfsFioDread, - pfsFioGetstat, - pfsFioChstat, - pfsFioRename, - pfsFioChdir, - pfsFioSync, - pfsFioMount, - pfsFioUmount, - (void*)pfsFioUnsupported /*pfsFioLseek64*/, - pfsFioDevctl, - (void*)pfsFioUnsupported /*pfsFioSymlink*/, - (void*)pfsFioUnsupported /*pfsFioReadlink*/, - pfsFioIoctl2 -}; + pfsFioInit, + pfsFioDeinit, + pfsFioFormat, + pfsFioOpen, + pfsFioClose, + pfsFioRead, + pfsFioWrite, + pfsFioLseek, + pfsFioIoctl, + pfsFioRemove, + pfsFioMkdir, + pfsFioRmdir, + pfsFioDopen, + pfsFioClose, + pfsFioDread, + pfsFioGetstat, + pfsFioChstat, + pfsFioRename, + pfsFioChdir, + pfsFioSync, + pfsFioMount, + pfsFioUmount, + (void *)pfsFioUnsupported /*pfsFioLseek64*/, + pfsFioDevctl, + (void *)pfsFioUnsupported /*pfsFioSymlink*/, + (void *)pfsFioUnsupported /*pfsFioReadlink*/, + pfsFioIoctl2}; iop_device_t pfsFioDev = { - "pfs", - (IOP_DT_FS | IOP_DT_FSEXT), - 1, - "PFS", - &pfsOps -}; - -pfs_config_t pfsConfig = { 1, 2 }; + "pfs", + (IOP_DT_FS | IOP_DT_FSEXT), + 1, + "PFS", + &pfsOps}; + +pfs_config_t pfsConfig = {1, 2}; pfs_mount_t *pfsMountBuf; char *pfsFilename = NULL; @@ -87,139 +85,132 @@ static int allocateMountBuffer(int size); static int printPfsArgError(void) { - PFS_PRINTF(PFS_DRV_NAME" ERROR: Usage: %s [-m ] [-o ] [-n ]\n", pfsFilename); + PFS_PRINTF(PFS_DRV_NAME " ERROR: Usage: %s [-m ] [-o ] [-n ]\n", pfsFilename); - return MODULE_NO_RESIDENT_END; + return MODULE_NO_RESIDENT_END; } static int allocateMountBuffer(int size) { - int tsize = size * sizeof(pfs_mount_t); + int tsize = size * sizeof(pfs_mount_t); - pfsMountBuf = pfsAllocMem(tsize); - if(!pfsMountBuf) - return -ENOMEM; + pfsMountBuf = pfsAllocMem(tsize); + if (!pfsMountBuf) + return -ENOMEM; - memset(pfsMountBuf, 0, tsize); + memset(pfsMountBuf, 0, tsize); - return 0; + return 0; } void pfsClearMount(pfs_mount_t *pfsMount) { - memset(pfsMount, 0, sizeof(pfs_mount_t)); + memset(pfsMount, 0, sizeof(pfs_mount_t)); } pfs_mount_t *pfsGetMountedUnit(s32 unit) -{ // get mounted unit - if(unit>=pfsConfig.maxMount) - return NULL; +{ // get mounted unit + if (unit >= pfsConfig.maxMount) + return NULL; - if(!(pfsMountBuf[unit].flags & PFS_MOUNT_BUSY)) - return NULL; + if (!(pfsMountBuf[unit].flags & PFS_MOUNT_BUSY)) + return NULL; - return &pfsMountBuf[unit]; + return &pfsMountBuf[unit]; } int _start(int argc, char *argv[]) { - char *filename; - int number; - int numBuf = 8; - int reqBuf; - int size; - - PFS_PRINTF(PFS_DRV_NAME" Playstation Filesystem Driver v%d.%d\nps2fs: (c) 2003 Sjeep, Vector and Florin Sasu\n", PFS_MAJOR, PFS_MINOR); - - // Get filename of IRX - filename = strrchr(argv[0], '/'); - if(filename++) - pfsFilename = filename; - else - pfsFilename = argv[0]; - - argc--; - argv++; - - // Parse arguments - while(argc > 0) - { - if(argv[0][0] != '-') - break; - - if(!strcmp(argv[0], "-m")) - { - if(--argc <= 0) - return printPfsArgError(); - argv++; - - number = strtol(argv[0], 0, 10); - - if(number <= 32) - pfsConfig.maxMount = number; - } - else if(!strcmp(argv[0], "-o")) - { - if(--argc <= 0) - return printPfsArgError(); - argv++; - - number = strtol(argv[0], NULL, 10); - - if(number <= 32) - pfsConfig.maxOpen = number; - } - else if(!strcmp(argv[0], "-n")) - { - if(--argc <= 0) - return printPfsArgError(); - argv++; - - number = strtol(argv[0], NULL, 10); - - if(number > numBuf) - numBuf = number; - - if(numBuf > 127) { - PFS_PRINTF(PFS_DRV_NAME" ERROR: Number of buffers is larger than 127!\n"); - return -EINVAL; - } - } - else - return printPfsArgError(); - - argc--; - argv++; - } - - PFS_PRINTF(PFS_DRV_NAME" Max mount: %ld, Max open: %ld, Number of buffers: %d\n", pfsConfig.maxMount, - pfsConfig.maxOpen, numBuf); - - // Do we have enough buffers ? - reqBuf = (pfsConfig.maxOpen * 2) + 8; - if(numBuf < reqBuf) - PFS_PRINTF(PFS_DRV_NAME" Warning: %d buffers may be needed, but only %d buffers are allocated\n", reqBuf, numBuf); - - if(allocateMountBuffer(pfsConfig.maxMount) < 0) - return MODULE_NO_RESIDENT_END; - - // Allocate and zero memory for file slots - size = pfsConfig.maxOpen * sizeof(pfs_file_slot_t); - pfsFileSlots = pfsAllocMem(size); - if(!pfsFileSlots) { - PFS_PRINTF(PFS_DRV_NAME" Error: Failed to allocate memory!\n"); - return MODULE_NO_RESIDENT_END; - } - - memset(pfsFileSlots, 0, size); - - if(pfsCacheInit(numBuf, pfsMetaSize) < 0) - return MODULE_NO_RESIDENT_END; - - DelDrv("pfs"); - AddDrv(&pfsFioDev); - - PFS_PRINTF(PFS_DRV_NAME" Driver start.\n"); - - return MODULE_RESIDENT_END; + char *filename; + int number; + int numBuf = 8; + int reqBuf; + int size; + + PFS_PRINTF(PFS_DRV_NAME " Playstation Filesystem Driver v%d.%d\nps2fs: (c) 2003 Sjeep, Vector and Florin Sasu\n", PFS_MAJOR, PFS_MINOR); + + // Get filename of IRX + filename = strrchr(argv[0], '/'); + if (filename++) + pfsFilename = filename; + else + pfsFilename = argv[0]; + + argc--; + argv++; + + // Parse arguments + while (argc > 0) { + if (argv[0][0] != '-') + break; + + if (!strcmp(argv[0], "-m")) { + if (--argc <= 0) + return printPfsArgError(); + argv++; + + number = strtol(argv[0], 0, 10); + + if (number <= 32) + pfsConfig.maxMount = number; + } else if (!strcmp(argv[0], "-o")) { + if (--argc <= 0) + return printPfsArgError(); + argv++; + + number = strtol(argv[0], NULL, 10); + + if (number <= 32) + pfsConfig.maxOpen = number; + } else if (!strcmp(argv[0], "-n")) { + if (--argc <= 0) + return printPfsArgError(); + argv++; + + number = strtol(argv[0], NULL, 10); + + if (number > numBuf) + numBuf = number; + + if (numBuf > 127) { + PFS_PRINTF(PFS_DRV_NAME " ERROR: Number of buffers is larger than 127!\n"); + return -EINVAL; + } + } else + return printPfsArgError(); + + argc--; + argv++; + } + + PFS_PRINTF(PFS_DRV_NAME " Max mount: %ld, Max open: %ld, Number of buffers: %d\n", pfsConfig.maxMount, + pfsConfig.maxOpen, numBuf); + + // Do we have enough buffers ? + reqBuf = (pfsConfig.maxOpen * 2) + 8; + if (numBuf < reqBuf) + PFS_PRINTF(PFS_DRV_NAME " Warning: %d buffers may be needed, but only %d buffers are allocated\n", reqBuf, numBuf); + + if (allocateMountBuffer(pfsConfig.maxMount) < 0) + return MODULE_NO_RESIDENT_END; + + // Allocate and zero memory for file slots + size = pfsConfig.maxOpen * sizeof(pfs_file_slot_t); + pfsFileSlots = pfsAllocMem(size); + if (!pfsFileSlots) { + PFS_PRINTF(PFS_DRV_NAME " Error: Failed to allocate memory!\n"); + return MODULE_NO_RESIDENT_END; + } + + memset(pfsFileSlots, 0, size); + + if (pfsCacheInit(numBuf, pfsMetaSize) < 0) + return MODULE_NO_RESIDENT_END; + + DelDrv("pfs"); + AddDrv(&pfsFioDev); + + PFS_PRINTF(PFS_DRV_NAME " Driver start.\n"); + + return MODULE_RESIDENT_END; } diff --git a/modules/hdd/pfs/pfs.h b/modules/hdd/pfs/pfs.h index e00d86771..dd4d82122 100644 --- a/modules/hdd/pfs/pfs.h +++ b/modules/hdd/pfs/pfs.h @@ -12,48 +12,50 @@ #define _PFS_H #ifndef min -#define min(a, b) ((a) < (b) ? (a) : (b)) +#define min(a, b) ((a) < (b) ? (a) : (b)) #endif -#define PFS_MAJOR 1 -#define PFS_MINOR 4 +#define PFS_MAJOR 1 +#define PFS_MINOR 4 /////////////////////////////////////////////////////////////////////////////// // Global types typedef struct { - u16 dirty; // - u16 sub; // Sub/main partition - u32 sector; // Sector + u16 dirty; // + u16 sub; // Sub/main partition + u32 sector; // Sector } pfs_restsInfo_t; typedef struct { - char key[256]; - char value[256]; + char key[256]; + char value[256]; } pfs_ioctl2attr_t; -typedef struct { - iop_file_t *fd; // - pfs_cache_t *clink; // - u32 aentryOffset; // used for read offset - u64 position; // - pfs_blockpos_t block_pos; // current position into file - pfs_restsInfo_t restsInfo; // - u8 restsBuffer[512]; // used for reading mis-aligned/remainder data +typedef struct +{ + iop_file_t *fd; // + pfs_cache_t *clink; // + u32 aentryOffset; // used for read offset + u64 position; // + pfs_blockpos_t block_pos; // current position into file + pfs_restsInfo_t restsInfo; // + u8 restsBuffer[512]; // used for reading mis-aligned/remainder data } pfs_file_slot_t; -typedef struct { - u32 maxMount; - u32 maxOpen; +typedef struct +{ + u32 maxMount; + u32 maxOpen; } pfs_config_t; /////////////////////////////////////////////////////////////////////////////// // Global defines // mount flags -#define PFS_MOUNT_BUSY 0x8000 +#define PFS_MOUNT_BUSY 0x8000 /////////////////////////////////////////////////////////////////////////////// // Function declarations diff --git a/modules/hdd/pfs/pfs_fio.c b/modules/hdd/pfs/pfs_fio.c index 1dd1f4287..81711c4d7 100644 --- a/modules/hdd/pfs/pfs_fio.c +++ b/modules/hdd/pfs/pfs_fio.c @@ -26,7 +26,7 @@ /////////////////////////////////////////////////////////////////////////////// // Globals -static const u8 openFlagArray[] = { 0, 4, 2, 6, 0, 0, 0, 0 }; +static const u8 openFlagArray[] = {0, 4, 2, 6, 0, 0, 0, 0}; int pfsFioSema = 0; pfs_file_slot_t *pfsFileSlots; @@ -52,747 +52,700 @@ static void _sync(void); int pfsFioCheckForLastError(pfs_mount_t *pfsMount, int rv) { - return pfsMount->lastError ? pfsMount->lastError : rv; + return pfsMount->lastError ? pfsMount->lastError : rv; } int pfsFioCheckFileSlot(pfs_file_slot_t *fileSlot) { - WaitSema(pfsFioSema); + WaitSema(pfsFioSema); - if(fileSlot->clink==NULL) - { - SignalSema(pfsFioSema); - return -EBADF; - } + if (fileSlot->clink == NULL) { + SignalSema(pfsFioSema); + return -EBADF; + } - return 0; + return 0; } void pfsFioCloseFileSlot(pfs_file_slot_t *fileSlot) { - pfs_mount_t *pfsMount=fileSlot->clink->pfsMount; - - if(fileSlot->fd->mode & O_WRONLY) - { - if(fileSlot->restsInfo.dirty!=0) - { - pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, - fileSlot->restsInfo.sub, fileSlot->restsInfo.sector, 1, PFS_IO_MODE_WRITE); - } - pfsInodeSetTime(fileSlot->clink); // set time :P - fileSlot->clink->u.inode->attr|=PFS_FIO_ATTR_CLOSED; - if(pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - pfsCacheFree(fileSlot->block_pos.inode); - pfsCacheFree(fileSlot->clink); - memset(fileSlot, 0, sizeof(pfs_file_slot_t)); + pfs_mount_t *pfsMount = fileSlot->clink->pfsMount; + + if (fileSlot->fd->mode & O_WRONLY) { + if (fileSlot->restsInfo.dirty != 0) { + pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, + fileSlot->restsInfo.sub, fileSlot->restsInfo.sector, 1, PFS_IO_MODE_WRITE); + } + pfsInodeSetTime(fileSlot->clink); // set time :P + fileSlot->clink->u.inode->attr |= PFS_FIO_ATTR_CLOSED; + if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); + } + pfsCacheFree(fileSlot->block_pos.inode); + pfsCacheFree(fileSlot->clink); + memset(fileSlot, 0, sizeof(pfs_file_slot_t)); } pfs_mount_t *pfsFioGetMountedUnit(int unit) { - pfs_mount_t *pfsMount; + pfs_mount_t *pfsMount; - WaitSema(pfsFioSema); - if((pfsMount=pfsGetMountedUnit(unit))==NULL) - SignalSema(pfsFioSema); - return pfsMount; + WaitSema(pfsFioSema); + if ((pfsMount = pfsGetMountedUnit(unit)) == NULL) + SignalSema(pfsFioSema); + return pfsMount; } static int mountDevice(pfs_block_device_t *blockDev, int fd, int unit, int flag) { - u32 i; - int rv; + u32 i; + int rv; - if((u32)unit >= pfsConfig.maxMount) - return -EMFILE; + if ((u32)unit >= pfsConfig.maxMount) + return -EMFILE; - if(pfsMountBuf[unit].flags & PFS_MOUNT_BUSY) - return -EBUSY; + if (pfsMountBuf[unit].flags & PFS_MOUNT_BUSY) + return -EBUSY; - for(i = 0; i < pfsConfig.maxMount; i++) - if((pfsMountBuf[i].flags & PFS_MOUNT_BUSY) && - (blockDev == pfsMountBuf[i].blockDev) && - (fd == pfsMountBuf[i].fd)) // Cant mount the same partition more than once - return -EBUSY; + for (i = 0; i < pfsConfig.maxMount; i++) + if ((pfsMountBuf[i].flags & PFS_MOUNT_BUSY) && + (blockDev == pfsMountBuf[i].blockDev) && + (fd == pfsMountBuf[i].fd)) // Cant mount the same partition more than once + return -EBUSY; - pfsMountBuf[unit].blockDev = blockDev; - pfsMountBuf[unit].fd = fd; - pfsMountBuf[unit].flags = flag; + pfsMountBuf[unit].blockDev = blockDev; + pfsMountBuf[unit].fd = fd; + pfsMountBuf[unit].flags = flag; - rv = pfsMountSuperBlock(&pfsMountBuf[unit]); - if(rv < 0) - return rv; + rv = pfsMountSuperBlock(&pfsMountBuf[unit]); + if (rv < 0) + return rv; - pfsMountBuf[unit].flags |= PFS_MOUNT_BUSY; + pfsMountBuf[unit].flags |= PFS_MOUNT_BUSY; - return 0; + return 0; } static int openFile(pfs_mount_t *pfsMount, pfs_file_slot_t *freeSlot, const char *filename, int openFlags, int mode) { - char file[256]; - int result, result2, result3, result4; - pfs_cache_t *parentInode, *fileInode, *cached; - - - result = 0; //no error - // Get the inode for the directory which contains the file (dir) in filename - // After this call, 'file' will contain the name of the file we're operating on. - if ((parentInode=pfsInodeGetParent(pfsMount, NULL, filename, file, &result))==0) - { - return result; - } - - // Get the inode for the actual file/directory contained in the parent dir - fileInode=pfsInodeGetFileInDir(parentInode, file, &result); - - // If file already exists.. - if (fileInode) - { - u32 flags; - u32 count; - - // Setup flags - flags=openFlagArray[openFlags & O_RDWR]; - if (openFlags & O_TRUNC) flags |= 2; - if (openFlags & PFS_FDIRO) flags |= 4; - if ((mode & 0x10000) || - ((openFlags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL))){ - result=-EEXIST; - } - else - { - count = 0; - - // Resolve actual file from a symlink - while ((fileInode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK) - { - if (count++>=4) - { - result=-ELOOP; - goto label; - } - - parentInode=pfsInodeGetParent(pfsMount, parentInode, (char*)&fileInode->u.inode->data[1], - file, &result); - pfsCacheFree(fileInode); - if ((parentInode==0) || - ((fileInode=pfsInodeGetFileInDir(parentInode, file, &result))==0)) - goto label; - } - - // Make sure that if a file is being opened, then inode does not point - // to a directory, and vice versa. - if ((openFlags & PFS_FDIRO) == 0) - { - if ((fileInode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) - result=-EISDIR; - }else{ - if ((fileInode->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - result=-ENOTDIR; - } - - // Truncate file if required - if ((result==0) && - ((result=pfsCheckAccess(fileInode, flags & 0xFFFF))==0) && - (openFlags & O_TRUNC)) - { - cached=pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->sector+1, PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result2); - if (cached) - { - memset(cached->u.aentry, 0, sizeof(pfs_inode_t)); //1024 - cached->u.aentry->aLen=sizeof(pfs_inode_t); - cached->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - if (result2 == 0) - { - fileInode->u.inode->size = 0; - fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED; //~0x80==0xFF7F - fileInode->flags |= PFS_CACHE_FLAG_DIRTY; - pfsFreeZones(fileInode); - } - } - } - - // Otherwise, if file doesnt already exist.. - }else{ - if ((openFlags & O_CREAT) && (result==-ENOENT) && - ((result=pfsCheckAccess(parentInode, 2))==0) && - (fileInode=pfsInodeCreate(parentInode, mode, pfsMount->uid, - pfsMount->gid, &result))) - { - if ((mode & FIO_S_IFMT) == FIO_S_IFLNK) - { - strcpy((char*)&fileInode->u.inode->data[1], (char*)freeSlot); - freeSlot=NULL; - } - - // If new file is a directory, the fill self and parent entries - if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) - { - cached=pfsCacheGetData(fileInode->pfsMount, fileInode->u.inode->data[1].subpart, - fileInode->u.inode->data[1].number << fileInode->pfsMount->inode_scale, - PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result3); - if (cached) - { - pfsFillSelfAndParentDentries(cached, - &fileInode->u.inode->inode_block, - &parentInode->u.inode->inode_block); - cached->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - result=result3; - // Otherwise if its just a regular file, just zero its attribute entry - }else{ - cached=pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->sector+1, - PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result4); - if (cached) - { - memset(cached->u.aentry, 0, sizeof(pfs_inode_t)); - cached->u.aentry->aLen=sizeof(pfs_inode_t); - cached->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - result=result4; - } - - // Link new file with parent directory - if ((result==0) && (cached=pfsDirAddEntry(parentInode, file, &fileInode->u.inode->inode_block, - mode, &result))) - { - pfsInodeSetTime(parentInode); - cached->flags|=PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - } - } + char file[256]; + int result, result2, result3, result4; + pfs_cache_t *parentInode, *fileInode, *cached; + + + result = 0; //no error + // Get the inode for the directory which contains the file (dir) in filename + // After this call, 'file' will contain the name of the file we're operating on. + if ((parentInode = pfsInodeGetParent(pfsMount, NULL, filename, file, &result)) == 0) { + return result; + } + + // Get the inode for the actual file/directory contained in the parent dir + fileInode = pfsInodeGetFileInDir(parentInode, file, &result); + + // If file already exists.. + if (fileInode) { + u32 flags; + u32 count; + + // Setup flags + flags = openFlagArray[openFlags & O_RDWR]; + if (openFlags & O_TRUNC) + flags |= 2; + if (openFlags & PFS_FDIRO) + flags |= 4; + if ((mode & 0x10000) || + ((openFlags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))) { + result = -EEXIST; + } else { + count = 0; + + // Resolve actual file from a symlink + while ((fileInode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK) { + if (count++ >= 4) { + result = -ELOOP; + goto label; + } + + parentInode = pfsInodeGetParent(pfsMount, parentInode, (char *)&fileInode->u.inode->data[1], + file, &result); + pfsCacheFree(fileInode); + if ((parentInode == 0) || + ((fileInode = pfsInodeGetFileInDir(parentInode, file, &result)) == 0)) + goto label; + } + + // Make sure that if a file is being opened, then inode does not point + // to a directory, and vice versa. + if ((openFlags & PFS_FDIRO) == 0) { + if ((fileInode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) + result = -EISDIR; + } else { + if ((fileInode->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) + result = -ENOTDIR; + } + + // Truncate file if required + if ((result == 0) && + ((result = pfsCheckAccess(fileInode, flags & 0xFFFF)) == 0) && + (openFlags & O_TRUNC)) { + cached = pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->sector + 1, PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result2); + if (cached) { + memset(cached->u.aentry, 0, sizeof(pfs_inode_t)); //1024 + cached->u.aentry->aLen = sizeof(pfs_inode_t); + cached->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(cached); + } + if (result2 == 0) { + fileInode->u.inode->size = 0; + fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED; //~0x80==0xFF7F + fileInode->flags |= PFS_CACHE_FLAG_DIRTY; + pfsFreeZones(fileInode); + } + } + } + + // Otherwise, if file doesnt already exist.. + } else { + if ((openFlags & O_CREAT) && (result == -ENOENT) && + ((result = pfsCheckAccess(parentInode, 2)) == 0) && + (fileInode = pfsInodeCreate(parentInode, mode, pfsMount->uid, + pfsMount->gid, &result))) { + if ((mode & FIO_S_IFMT) == FIO_S_IFLNK) { + strcpy((char *)&fileInode->u.inode->data[1], (char *)freeSlot); + freeSlot = NULL; + } + + // If new file is a directory, the fill self and parent entries + if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) { + cached = pfsCacheGetData(fileInode->pfsMount, fileInode->u.inode->data[1].subpart, + fileInode->u.inode->data[1].number << fileInode->pfsMount->inode_scale, + PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result3); + if (cached) { + pfsFillSelfAndParentDentries(cached, + &fileInode->u.inode->inode_block, + &parentInode->u.inode->inode_block); + cached->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(cached); + } + result = result3; + // Otherwise if its just a regular file, just zero its attribute entry + } else { + cached = pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->sector + 1, + PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result4); + if (cached) { + memset(cached->u.aentry, 0, sizeof(pfs_inode_t)); + cached->u.aentry->aLen = sizeof(pfs_inode_t); + cached->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(cached); + } + result = result4; + } + + // Link new file with parent directory + if ((result == 0) && (cached = pfsDirAddEntry(parentInode, file, &fileInode->u.inode->inode_block, + mode, &result))) { + pfsInodeSetTime(parentInode); + cached->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(cached); + } + } + } label: - pfsCacheFree(parentInode); - if ((result==0) && freeSlot && fileInode) - { - freeSlot->clink=fileInode; - if (openFlags & O_APPEND) - freeSlot->position = fileInode->u.inode->size; - else - freeSlot->position = 0; - - result=pfsBlockInitPos(freeSlot->clink, &freeSlot->block_pos, freeSlot->position); - if (result==0) - { - if ((openFlags & O_WRONLY) && - (fileInode->u.inode->attr & PFS_FIO_ATTR_CLOSED)){ - fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED; - fileInode->flags |= PFS_CACHE_FLAG_DIRTY; - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - if ((result=pfsFioCheckForLastError(pfsMount, result))==0) - return 0; - } - freeSlot->clink=NULL; - } - - if(fileInode) pfsCacheFree(fileInode); - - return pfsFioCheckForLastError(pfsMount, result); + pfsCacheFree(parentInode); + if ((result == 0) && freeSlot && fileInode) { + freeSlot->clink = fileInode; + if (openFlags & O_APPEND) + freeSlot->position = fileInode->u.inode->size; + else + freeSlot->position = 0; + + result = pfsBlockInitPos(freeSlot->clink, &freeSlot->block_pos, freeSlot->position); + if (result == 0) { + if ((openFlags & O_WRONLY) && + (fileInode->u.inode->attr & PFS_FIO_ATTR_CLOSED)) { + fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED; + fileInode->flags |= PFS_CACHE_FLAG_DIRTY; + if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); + } + if ((result = pfsFioCheckForLastError(pfsMount, result)) == 0) + return 0; + } + freeSlot->clink = NULL; + } + + if (fileInode) + pfsCacheFree(fileInode); + + return pfsFioCheckForLastError(pfsMount, result); } // Reads unaligned data, or remainder data (size < 512) static int fileTransferRemainder(pfs_file_slot_t *fileSlot, void *buf, int size, int operation) { - u32 sector, pos; - int result; - pfs_blockpos_t *blockpos = &fileSlot->block_pos; - pfs_mount_t *pfsMount = fileSlot->clink->pfsMount; - pfs_restsInfo_t *info = &fileSlot->restsInfo; - pfs_blockinfo_t *bi = pfsBlockGetCurrent(blockpos); - - sector = ((bi->number+blockpos->block_offset) << pfsMount->sector_scale) + - (blockpos->byte_offset >> 9); - pos = blockpos->byte_offset & 0x1FF; - - if((info->sector != sector) || (info->sub!=bi->subpart)) - { - if (fileSlot->restsInfo.dirty) - { - result=pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, info->sector, 1, 1); - if(result) - return result; - fileSlot->restsInfo.dirty=0; - } - - info->sub=bi->subpart; - info->sector=sector; - - if(pos || (fileSlot->position != fileSlot->clink->u.inode->size)) - { - result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, info->sector, 1, 0); - if(result) - return result | 0x10000; - } - } - - if (operation==0) - memcpy(buf, fileSlot->restsBuffer+pos, size=min(size, 512-(int)pos)); - else - memcpy(fileSlot->restsBuffer+pos, buf, size=min(size, 512-(int)pos)); - - if (operation == 1) - { - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - { - if ((result=pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, - info->sector, operation, operation))) - return result; - } - else - info->dirty=operation; - } - return size; + u32 sector, pos; + int result; + pfs_blockpos_t *blockpos = &fileSlot->block_pos; + pfs_mount_t *pfsMount = fileSlot->clink->pfsMount; + pfs_restsInfo_t *info = &fileSlot->restsInfo; + pfs_blockinfo_t *bi = pfsBlockGetCurrent(blockpos); + + sector = ((bi->number + blockpos->block_offset) << pfsMount->sector_scale) + + (blockpos->byte_offset >> 9); + pos = blockpos->byte_offset & 0x1FF; + + if ((info->sector != sector) || (info->sub != bi->subpart)) { + if (fileSlot->restsInfo.dirty) { + result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, info->sector, 1, 1); + if (result) + return result; + fileSlot->restsInfo.dirty = 0; + } + + info->sub = bi->subpart; + info->sector = sector; + + if (pos || (fileSlot->position != fileSlot->clink->u.inode->size)) { + result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, info->sector, 1, 0); + if (result) + return result | 0x10000; + } + } + + if (operation == 0) + memcpy(buf, fileSlot->restsBuffer + pos, size = min(size, 512 - (int)pos)); + else + memcpy(fileSlot->restsBuffer + pos, buf, size = min(size, 512 - (int)pos)); + + if (operation == 1) { + if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) { + if ((result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, + info->sector, operation, operation))) + return result; + } else + info->dirty = operation; + } + return size; } // Does actual read/write of data from file static int fileTransfer(pfs_file_slot_t *fileSlot, u8 *buf, int size, int operation) { - int result=0; - pfs_blockpos_t *blockpos=&fileSlot->block_pos; - pfs_mount_t *pfsMount=fileSlot->clink->pfsMount; - u32 bytes_remain; - u32 total = 0; - - // If we're writing and there is less free space in the last allocated block segment - // than can hold the data being written, then try and expand the block segment - if ((operation==1) && - (fileSlot->clink->u.inode->number_data - 1 == blockpos->block_segment)) - { - bytes_remain = (pfsBlockGetCurrent(blockpos)->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset;//u32 - - if (bytes_remain < size) - { - pfsBlockExpandSegment(fileSlot->clink, blockpos, - ((size-bytes_remain+pfsMount->zsize-1) & (~(pfsMount->zsize-1))) / pfsMount->zsize); - } - } - - while (size) - { - pfs_blockinfo_t *bi; - u32 sectors; - - // Get block info for current file position - bi=pfsBlockGetCurrent(blockpos); - - // Get amount of remaining data in current block - bytes_remain=(bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; - - // If there is no space/data left in the current block segment, then we need to move onto the next - if (bytes_remain==0) - { - // If we're at the end of allocated block segments, then allocate a new block segment - if (blockpos->block_segment == fileSlot->clink->u.inode->number_data-1){ - if (operation==0){ - PFS_PRINTF(PFS_DRV_NAME" Panic: This is a bug!\n"); - return 0; - } - - result = pfsBlockAllocNewSegment(fileSlot->clink, blockpos, - (size - 1 + pfsMount->zsize) / pfsMount->zsize); - if(result<0) - break; - - // Otherwise, move to the next block segment - }else - if ((result=pfsBlockSeekNextSegment(fileSlot->clink, blockpos))) - { - return result; - } - - bi=pfsBlockGetCurrent(blockpos); - bytes_remain=(bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; - } - - if (bytes_remain==0) - { - PFS_PRINTF(PFS_DRV_NAME" Panic: There is no zone.\n"); - return 0; - } - - // If we are transferring size not a multiple of 512, under 512, or to - // an unaligned buffer we need to use a special function rather than - // just doing a ATA sector transfer. - if ((blockpos->byte_offset & 0x1FF) || (size < 512) || ((u32)buf & 3)) - { - if ((result=fileTransferRemainder(fileSlot, buf, size, operation)) < 0) - break; - } - else - { - sectors = bytes_remain / 512; - if ((size / 512) < sectors) sectors = size / 512; //sectors=min(size/512, sectors) - - // Do the ATA sector transfer - result=pfsMount->blockDev->transfer(pfsMount->fd, buf, bi->subpart, - ((bi->number + blockpos->block_offset) << pfsMount->sector_scale)+(blockpos->byte_offset / 512), - sectors, operation); - if (result < 0) - { - result |= 0x10000; // TODO: EIO define - break; - } - result = sectors * 512; - } - - size -= result; - fileSlot->position += result; - buf += result; - total += result; - - // If file has grown, need to mark inode as dirty - if(fileSlot->clink->u.inode->size < fileSlot->position) - { - fileSlot->clink->u.inode->size = fileSlot->position; - fileSlot->clink->flags |= PFS_CACHE_FLAG_DIRTY; - } - - blockpos->block_offset+=pfsBlockSyncPos(blockpos, result); - } - return result < 0 ? result : total; + int result = 0; + pfs_blockpos_t *blockpos = &fileSlot->block_pos; + pfs_mount_t *pfsMount = fileSlot->clink->pfsMount; + u32 bytes_remain; + u32 total = 0; + + // If we're writing and there is less free space in the last allocated block segment + // than can hold the data being written, then try and expand the block segment + if ((operation == 1) && + (fileSlot->clink->u.inode->number_data - 1 == blockpos->block_segment)) { + bytes_remain = (pfsBlockGetCurrent(blockpos)->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; //u32 + + if (bytes_remain < size) { + pfsBlockExpandSegment(fileSlot->clink, blockpos, + ((size - bytes_remain + pfsMount->zsize - 1) & (~(pfsMount->zsize - 1))) / pfsMount->zsize); + } + } + + while (size) { + pfs_blockinfo_t *bi; + u32 sectors; + + // Get block info for current file position + bi = pfsBlockGetCurrent(blockpos); + + // Get amount of remaining data in current block + bytes_remain = (bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; + + // If there is no space/data left in the current block segment, then we need to move onto the next + if (bytes_remain == 0) { + // If we're at the end of allocated block segments, then allocate a new block segment + if (blockpos->block_segment == fileSlot->clink->u.inode->number_data - 1) { + if (operation == 0) { + PFS_PRINTF(PFS_DRV_NAME " Panic: This is a bug!\n"); + return 0; + } + + result = pfsBlockAllocNewSegment(fileSlot->clink, blockpos, + (size - 1 + pfsMount->zsize) / pfsMount->zsize); + if (result < 0) + break; + + // Otherwise, move to the next block segment + } else if ((result = pfsBlockSeekNextSegment(fileSlot->clink, blockpos))) { + return result; + } + + bi = pfsBlockGetCurrent(blockpos); + bytes_remain = (bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; + } + + if (bytes_remain == 0) { + PFS_PRINTF(PFS_DRV_NAME " Panic: There is no zone.\n"); + return 0; + } + + // If we are transferring size not a multiple of 512, under 512, or to + // an unaligned buffer we need to use a special function rather than + // just doing a ATA sector transfer. + if ((blockpos->byte_offset & 0x1FF) || (size < 512) || ((u32)buf & 3)) { + if ((result = fileTransferRemainder(fileSlot, buf, size, operation)) < 0) + break; + } else { + sectors = bytes_remain / 512; + if ((size / 512) < sectors) + sectors = size / 512; //sectors=min(size/512, sectors) + + // Do the ATA sector transfer + result = pfsMount->blockDev->transfer(pfsMount->fd, buf, bi->subpart, + ((bi->number + blockpos->block_offset) << pfsMount->sector_scale) + (blockpos->byte_offset / 512), + sectors, operation); + if (result < 0) { + result |= 0x10000; // TODO: EIO define + break; + } + result = sectors * 512; + } + + size -= result; + fileSlot->position += result; + buf += result; + total += result; + + // If file has grown, need to mark inode as dirty + if (fileSlot->clink->u.inode->size < fileSlot->position) { + fileSlot->clink->u.inode->size = fileSlot->position; + fileSlot->clink->flags |= PFS_CACHE_FLAG_DIRTY; + } + + blockpos->block_offset += pfsBlockSyncPos(blockpos, result); + } + return result < 0 ? result : total; } -int pfsFioInit(iop_device_t *f) +int pfsFioInit(iop_device_t *f) { - iop_sema_t sema; + iop_sema_t sema; - sema.attr = 1; - sema.option = 0; - sema.initial = 1; - sema.max = 1; + sema.attr = 1; + sema.option = 0; + sema.initial = 1; + sema.max = 1; - pfsFioSema = CreateSema(&sema); + pfsFioSema = CreateSema(&sema); - return 0; + return 0; } -int pfsFioDeinit(iop_device_t *f) +int pfsFioDeinit(iop_device_t *f) { - pfsFioDevctlCloseAll(); + pfsFioDevctlCloseAll(); - DeleteSema(pfsFioSema); + DeleteSema(pfsFioSema); - return 0; + return 0; } -int pfsFioFormat(iop_file_t *t, const char *dev, const char *blockdev, void *args, int arglen) +int pfsFioFormat(iop_file_t *t, const char *dev, const char *blockdev, void *args, int arglen) { - int *arg = (int *)args; - int fragment = 0; - int fd; - pfs_block_device_t *blockDev; - int rv; + int *arg = (int *)args; + int fragment = 0; + int fd; + pfs_block_device_t *blockDev; + int rv; - // Has a fragment bit pattern been specified ? - if((arglen == (3 * sizeof(int))) && (arg[1] == 0x2D66)) //arg[1] == "-f" - fragment = arg[2]; + // Has a fragment bit pattern been specified ? + if ((arglen == (3 * sizeof(int))) && (arg[1] == 0x2D66)) //arg[1] == "-f" + fragment = arg[2]; - if((blockDev = pfsGetBlockDeviceTable(blockdev)) == 0) - return -ENXIO; + if ((blockDev = pfsGetBlockDeviceTable(blockdev)) == 0) + return -ENXIO; - WaitSema(pfsFioSema); + WaitSema(pfsFioSema); - fd = open(blockdev, O_RDWR, 0644); + fd = open(blockdev, O_RDWR, 0644); - if(fd < 0) - rv = fd; - else { - rv = pfsFormat(blockDev, fd, arg[0], fragment); - close(fd); - } + if (fd < 0) + rv = fd; + else { + rv = pfsFormat(blockDev, fd, arg[0], fragment); + close(fd); + } - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } -int pfsFioOpen(iop_file_t *f, const char *name, int flags, int mode) +int pfsFioOpen(iop_file_t *f, const char *name, int flags, int mode) { - int rv = 0; - u32 i; - pfs_file_slot_t *freeSlot; - pfs_mount_t *pfsMount; - - if(!name) - return -ENOENT; - - if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) - { - return -ENODEV; - } - - // Find free file slot - for(i = 0; i < pfsConfig.maxOpen; i++) - { - if(!pfsFileSlots[i].fd) { - freeSlot = &pfsFileSlots[i]; - goto pfsOpen_slotFound; - } - } - - PFS_PRINTF(PFS_DRV_NAME" Error: There are no free file slots!\n"); - freeSlot = NULL; + int rv = 0; + u32 i; + pfs_file_slot_t *freeSlot; + pfs_mount_t *pfsMount; + + if (!name) + return -ENOENT; + + if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) { + return -ENODEV; + } + + // Find free file slot + for (i = 0; i < pfsConfig.maxOpen; i++) { + if (!pfsFileSlots[i].fd) { + freeSlot = &pfsFileSlots[i]; + goto pfsOpen_slotFound; + } + } + + PFS_PRINTF(PFS_DRV_NAME " Error: There are no free file slots!\n"); + freeSlot = NULL; pfsOpen_slotFound: - if(!freeSlot) { - rv = -EMFILE; - goto pfsOpen_end; - } + if (!freeSlot) { + rv = -EMFILE; + goto pfsOpen_end; + } - // Do actual open - if((rv = openFile(pfsMount, freeSlot, name, f->mode, (mode & 0xfff) | FIO_S_IFREG))) - goto pfsOpen_end; + // Do actual open + if ((rv = openFile(pfsMount, freeSlot, name, f->mode, (mode & 0xfff) | FIO_S_IFREG))) + goto pfsOpen_end; - freeSlot->fd = f; - f->privdata = freeSlot; + freeSlot->fd = f; + f->privdata = freeSlot; pfsOpen_end: - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } -int pfsFioClose(iop_file_t *f) +int pfsFioClose(iop_file_t *f) { - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - int rv; + pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; + int rv; - rv = pfsFioCheckFileSlot(fileSlot); - if(rv) - return rv; + rv = pfsFioCheckFileSlot(fileSlot); + if (rv) + return rv; - pfsFioCloseFileSlot(fileSlot); + pfsFioCloseFileSlot(fileSlot); - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } int pfsFioRead(iop_file_t *f, void *buf, int size) { - pfs_file_slot_t *fileSlot = (pfs_file_slot_t*)f->privdata; - int result = pfsFioCheckFileSlot(fileSlot); + pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; + int result = pfsFioCheckFileSlot(fileSlot); - if (result) - { - return result; - } + if (result) { + return result; + } - // Check bounds, adjust size if necessary - if(fileSlot->clink->u.inode->size < (fileSlot->position + size)) - size = fileSlot->clink->u.inode->size - fileSlot->position; + // Check bounds, adjust size if necessary + if (fileSlot->clink->u.inode->size < (fileSlot->position + size)) + size = fileSlot->clink->u.inode->size - fileSlot->position; - result = size ? fileTransfer(fileSlot, buf, size, 0) : 0; - result = pfsFioCheckForLastError(fileSlot->clink->pfsMount, result); + result = size ? fileTransfer(fileSlot, buf, size, 0) : 0; + result = pfsFioCheckForLastError(fileSlot->clink->pfsMount, result); - SignalSema(pfsFioSema); - return result; + SignalSema(pfsFioSema); + return result; } int pfsFioWrite(iop_file_t *f, void *buf, int size) { - pfs_mount_t *pfsMount; - pfs_file_slot_t *fileSlot = (pfs_file_slot_t*)f->privdata; - int result = pfsFioCheckFileSlot(fileSlot); + pfs_mount_t *pfsMount; + pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; + int result = pfsFioCheckFileSlot(fileSlot); - if(result) - return result; + if (result) + return result; - pfsMount = fileSlot->clink->pfsMount; + pfsMount = fileSlot->clink->pfsMount; - result = fileTransfer(fileSlot, buf, size, 1); + result = fileTransfer(fileSlot, buf, size, 1); - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); + if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); - result = pfsFioCheckForLastError(pfsMount, result); - SignalSema(pfsFioSema); - return result; + result = pfsFioCheckForLastError(pfsMount, result); + SignalSema(pfsFioSema); + return result; } static s64 _seek(pfs_file_slot_t *fileSlot, s64 offset, int whence, int mode) { - int rv; - s64 startPos, newPos; - - if (mode & O_DIROPEN) - { - return -EISDIR; - } - - switch (whence) - { - case SEEK_SET: - startPos = 0; - break; - case SEEK_CUR: - startPos= fileSlot->position; - break; - case SEEK_END: - startPos = fileSlot->clink->u.inode->size; - break; - default: - return -EINVAL; - } - newPos = startPos + offset; - - if (((offset < 0) && (startPos < newPos)) || - ((offset > 0) && (startPos > newPos)) || - (fileSlot->clink->u.inode->size < newPos)) - { - return -EINVAL; - } - - pfsCacheFree(fileSlot->block_pos.inode); - rv=pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, newPos); - if (rv==0) - fileSlot->position = newPos; - else { - fileSlot->position = 0; - pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, 0); - } - - if (rv) - { - return rv; - } - - return newPos; + int rv; + s64 startPos, newPos; + + if (mode & O_DIROPEN) { + return -EISDIR; + } + + switch (whence) { + case SEEK_SET: + startPos = 0; + break; + case SEEK_CUR: + startPos = fileSlot->position; + break; + case SEEK_END: + startPos = fileSlot->clink->u.inode->size; + break; + default: + return -EINVAL; + } + newPos = startPos + offset; + + if (((offset < 0) && (startPos < newPos)) || + ((offset > 0) && (startPos > newPos)) || + (fileSlot->clink->u.inode->size < newPos)) { + return -EINVAL; + } + + pfsCacheFree(fileSlot->block_pos.inode); + rv = pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, newPos); + if (rv == 0) + fileSlot->position = newPos; + else { + fileSlot->position = 0; + pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, 0); + } + + if (rv) { + return rv; + } + + return newPos; } int pfsFioLseek(iop_file_t *f, int pos, int whence) { - pfs_file_slot_t *fileSlot = (pfs_file_slot_t*)f->privdata; - int result = pfsFioCheckFileSlot(fileSlot); + pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; + int result = pfsFioCheckFileSlot(fileSlot); - if (result) - return result; + if (result) + return result; - result = (u32)_seek(fileSlot, (s64)pos, whence, f->mode); + result = (u32)_seek(fileSlot, (s64)pos, whence, f->mode); - SignalSema(pfsFioSema); - return result; + SignalSema(pfsFioSema); + return result; } s64 pfsFioLseek64(iop_file_t *f, s64 offset, int whence) { - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - u64 rv; - - rv=pfsFioCheckFileSlot(fileSlot); - if(!rv) - { - rv=_seek(fileSlot, offset, whence, f->mode); - SignalSema(pfsFioSema); - } - return rv; + pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; + u64 rv; + + rv = pfsFioCheckFileSlot(fileSlot); + if (!rv) { + rv = _seek(fileSlot, offset, whence, f->mode); + SignalSema(pfsFioSema); + } + return rv; } static int _remove(pfs_mount_t *pfsMount, const char *path, int mode) { - char szPath[256]; - int rv=0; - pfs_cache_t *parent; - pfs_cache_t *file; - - if((parent=pfsInodeGetParent(pfsMount, NULL, path, szPath, &rv))==NULL) - return rv; - - if((file=pfsInodeGetFileInDir(parent, szPath, &rv))!=NULL) - { - if(mode!=0) - {// remove dir - if((file->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - rv=-ENOTDIR; - else if(pfsCheckDirForFiles(file)==0) - rv=-ENOTEMPTY; - else if(((u16)file->u.inode->inode_block.number==pfsMount->root_dir.number) && - ((u16)file->u.inode->inode_block.subpart==pfsMount->root_dir.subpart)) - rv=-EBUSY; - else if(((u16)file->u.inode->inode_block.number==pfsMount->current_dir.number) && - ((u16)file->u.inode->inode_block.subpart==pfsMount->current_dir.subpart)) - rv=-EBUSY; - } - else// just a file - if((file->u.inode->mode & FIO_S_IFMT)==FIO_S_IFDIR) - rv=-EISDIR; - - if(rv==0) - { - if(file->u.inode->uid!=0) - rv=pfsCheckAccess(file, 2); - if(file->nused>=2) - rv=-EBUSY; - if(rv==0) - return pfsInodeRemove(parent, file, szPath); - } - pfsCacheFree(file); - } - pfsCacheFree(parent); - return pfsFioCheckForLastError(pfsMount, rv); + char szPath[256]; + int rv = 0; + pfs_cache_t *parent; + pfs_cache_t *file; + + if ((parent = pfsInodeGetParent(pfsMount, NULL, path, szPath, &rv)) == NULL) + return rv; + + if ((file = pfsInodeGetFileInDir(parent, szPath, &rv)) != NULL) { + if (mode != 0) { // remove dir + if ((file->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) + rv = -ENOTDIR; + else if (pfsCheckDirForFiles(file) == 0) + rv = -ENOTEMPTY; + else if (((u16)file->u.inode->inode_block.number == pfsMount->root_dir.number) && + ((u16)file->u.inode->inode_block.subpart == pfsMount->root_dir.subpart)) + rv = -EBUSY; + else if (((u16)file->u.inode->inode_block.number == pfsMount->current_dir.number) && + ((u16)file->u.inode->inode_block.subpart == pfsMount->current_dir.subpart)) + rv = -EBUSY; + } else // just a file + if ((file->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) + rv = -EISDIR; + + if (rv == 0) { + if (file->u.inode->uid != 0) + rv = pfsCheckAccess(file, 2); + if (file->nused >= 2) + rv = -EBUSY; + if (rv == 0) + return pfsInodeRemove(parent, file, szPath); + } + pfsCacheFree(file); + } + pfsCacheFree(parent); + return pfsFioCheckForLastError(pfsMount, rv); } -int pfsFioRemove(iop_file_t *f, const char *name) +int pfsFioRemove(iop_file_t *f, const char *name) { - pfs_mount_t *pfsMount; - int rv; + pfs_mount_t *pfsMount; + int rv; - if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - rv = _remove(pfsMount, name, 0); + rv = _remove(pfsMount, name, 0); - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } -int pfsFioMkdir(iop_file_t *f, const char *path, int mode) +int pfsFioMkdir(iop_file_t *f, const char *path, int mode) { - pfs_mount_t *pfsMount; - int rv; + pfs_mount_t *pfsMount; + int rv; - mode = (mode & 0xfff) | 0x10000 | FIO_S_IFDIR; // TODO: change to some constant/macro + mode = (mode & 0xfff) | 0x10000 | FIO_S_IFDIR; // TODO: change to some constant/macro - if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - rv = openFile(pfsMount, NULL, path, O_CREAT | O_WRONLY, mode); + rv = openFile(pfsMount, NULL, path, O_CREAT | O_WRONLY, mode); - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } -int pfsFioRmdir(iop_file_t *f, const char *path) +int pfsFioRmdir(iop_file_t *f, const char *path) { - pfs_mount_t *pfsMount; - const char *temp; - int rv; + pfs_mount_t *pfsMount; + const char *temp; + int rv; - temp = path + strlen(path); - if(*temp == '.') - return -EINVAL; + temp = path + strlen(path); + if (*temp == '.') + return -EINVAL; - if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - rv = _remove(pfsMount, path, 0x01); // TODO: constant for 0x01 ? + rv = _remove(pfsMount, path, 0x01); // TODO: constant for 0x01 ? - SignalSema(pfsFioSema); + SignalSema(pfsFioSema); - return rv; + return rv; } int pfsFioDopen(iop_file_t *f, const char *name) @@ -800,444 +753,438 @@ int pfsFioDopen(iop_file_t *f, const char *name) return pfsFioOpen(f, name, 0, 0); } -int pfsFioDread(iop_file_t *f, iox_dirent_t *dirent) +int pfsFioDread(iop_file_t *f, iox_dirent_t *dirent) { - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - pfs_blockinfo_t bi; - int result; - int rv; - - rv = pfsFioCheckFileSlot(fileSlot); - if(rv < 0) - return rv; - - pfsMount = fileSlot->clink->pfsMount; - - if((fileSlot->clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - { - rv = -ENOTDIR; - } - else - if((rv = pfsGetNextDentry(fileSlot->clink, &fileSlot->block_pos, (u32 *)&fileSlot->position, - dirent->name, &bi)) > 0) - { - - clink = pfsInodeGetData(pfsMount, bi.subpart, bi.number, &result); - if(clink != NULL) - { - fioStatFiller(clink, &dirent->stat); - pfsCacheFree(clink); - } - - if(result) - rv = result; - } - - rv = pfsFioCheckForLastError(pfsMount, rv); - SignalSema(pfsFioSema); - - return rv; + pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; + pfs_mount_t *pfsMount; + pfs_cache_t *clink; + pfs_blockinfo_t bi; + int result; + int rv; + + rv = pfsFioCheckFileSlot(fileSlot); + if (rv < 0) + return rv; + + pfsMount = fileSlot->clink->pfsMount; + + if ((fileSlot->clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) { + rv = -ENOTDIR; + } else if ((rv = pfsGetNextDentry(fileSlot->clink, &fileSlot->block_pos, (u32 *)&fileSlot->position, + dirent->name, &bi)) > 0) { + + clink = pfsInodeGetData(pfsMount, bi.subpart, bi.number, &result); + if (clink != NULL) { + fioStatFiller(clink, &dirent->stat); + pfsCacheFree(clink); + } + + if (result) + rv = result; + } + + rv = pfsFioCheckForLastError(pfsMount, rv); + SignalSema(pfsFioSema); + + return rv; } static void fioStatFiller(pfs_cache_t *clink, iox_stat_t *stat) { - stat->mode = clink->u.inode->mode; - stat->attr = clink->u.inode->attr; - stat->size = (u32)clink->u.inode->size; - stat->hisize = (u32)(clink->u.inode->size >> 32); - memcpy(&stat->ctime, &clink->u.inode->ctime, sizeof(pfs_datetime_t)); - memcpy(&stat->atime, &clink->u.inode->atime, sizeof(pfs_datetime_t)); - memcpy(&stat->mtime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); - stat->private_0 = clink->u.inode->uid; - stat->private_1 = clink->u.inode->gid; - stat->private_2 = clink->u.inode->number_blocks; - stat->private_3 = clink->u.inode->number_data; - stat->private_4 = 0; - stat->private_5 = 0; + stat->mode = clink->u.inode->mode; + stat->attr = clink->u.inode->attr; + stat->size = (u32)clink->u.inode->size; + stat->hisize = (u32)(clink->u.inode->size >> 32); + memcpy(&stat->ctime, &clink->u.inode->ctime, sizeof(pfs_datetime_t)); + memcpy(&stat->atime, &clink->u.inode->atime, sizeof(pfs_datetime_t)); + memcpy(&stat->mtime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); + stat->private_0 = clink->u.inode->uid; + stat->private_1 = clink->u.inode->gid; + stat->private_2 = clink->u.inode->number_blocks; + stat->private_3 = clink->u.inode->number_data; + stat->private_4 = 0; + stat->private_5 = 0; } -int pfsFioGetstat(iop_file_t *f, const char *name, iox_stat_t *stat) +int pfsFioGetstat(iop_file_t *f, const char *name, iox_stat_t *stat) { - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - int rv=0; - - if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - clink=pfsInodeGetFile(pfsMount, NULL, name, &rv); - if(clink!=NULL) - { - fioStatFiller(clink, stat); - pfsCacheFree(clink); - } - - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, rv); + pfs_mount_t *pfsMount; + pfs_cache_t *clink; + int rv = 0; + + if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; + + clink = pfsInodeGetFile(pfsMount, NULL, name, &rv); + if (clink != NULL) { + fioStatFiller(clink, stat); + pfsCacheFree(clink); + } + + SignalSema(pfsFioSema); + return pfsFioCheckForLastError(pfsMount, rv); } -int pfsFioChstat(iop_file_t *f, const char *name, iox_stat_t *stat, unsigned int statmask) +int pfsFioChstat(iop_file_t *f, const char *name, iox_stat_t *stat, unsigned int statmask) { - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - int rv = 0; - - if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - clink = pfsInodeGetFile(pfsMount, NULL, name, &rv); - if(clink != NULL) { - - rv = pfsCheckAccess(clink, 0x02); - if(rv == 0) { - - clink->flags |= PFS_CACHE_FLAG_DIRTY; - - if((statmask & FIO_CST_MODE) && ((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFLNK)) - clink->u.inode->mode = (clink->u.inode->mode & FIO_S_IFMT) | (stat->mode & 0xfff); - if(statmask & FIO_CST_ATTR) - clink->u.inode->attr = (clink->u.inode->attr & 0xA0) | (stat->attr & 0xFF5F); - if(statmask & FIO_CST_SIZE) - rv = -EACCES; - if(statmask & FIO_CST_CT) - memcpy(&clink->u.inode->ctime, stat->ctime, sizeof(pfs_datetime_t)); - if(statmask & FIO_CST_AT) - memcpy(&clink->u.inode->atime, stat->atime, sizeof(pfs_datetime_t)); - if(statmask & FIO_CST_MT) - memcpy(&clink->u.inode->mtime, stat->mtime, sizeof(pfs_datetime_t)); - if(statmask & FIO_CST_PRVT) { - clink->u.inode->uid = stat->private_0; - clink->u.inode->gid = stat->private_1; - } - - if(pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - - pfsCacheFree(clink); - - } - - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, rv); + pfs_mount_t *pfsMount; + pfs_cache_t *clink; + int rv = 0; + + if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; + + clink = pfsInodeGetFile(pfsMount, NULL, name, &rv); + if (clink != NULL) { + + rv = pfsCheckAccess(clink, 0x02); + if (rv == 0) { + + clink->flags |= PFS_CACHE_FLAG_DIRTY; + + if ((statmask & FIO_CST_MODE) && ((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFLNK)) + clink->u.inode->mode = (clink->u.inode->mode & FIO_S_IFMT) | (stat->mode & 0xfff); + if (statmask & FIO_CST_ATTR) + clink->u.inode->attr = (clink->u.inode->attr & 0xA0) | (stat->attr & 0xFF5F); + if (statmask & FIO_CST_SIZE) + rv = -EACCES; + if (statmask & FIO_CST_CT) + memcpy(&clink->u.inode->ctime, stat->ctime, sizeof(pfs_datetime_t)); + if (statmask & FIO_CST_AT) + memcpy(&clink->u.inode->atime, stat->atime, sizeof(pfs_datetime_t)); + if (statmask & FIO_CST_MT) + memcpy(&clink->u.inode->mtime, stat->mtime, sizeof(pfs_datetime_t)); + if (statmask & FIO_CST_PRVT) { + clink->u.inode->uid = stat->private_0; + clink->u.inode->gid = stat->private_1; + } + + if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); + } + + pfsCacheFree(clink); + } + + SignalSema(pfsFioSema); + return pfsFioCheckForLastError(pfsMount, rv); } int pfsFioRename(iop_file_t *ff, const char *old, const char *new) { - char path1[256], path2[256]; - int result=0; - pfs_mount_t *pfsMount; - int f; - pfs_cache_t *parentOld=NULL, *parentNew=NULL; - pfs_cache_t *removeOld=NULL, *removeNew=NULL; - pfs_cache_t *iFileOld=NULL, *iFileNew=NULL; - pfs_cache_t *newParent=NULL,*addNew=NULL; - - pfsMount=pfsFioGetMountedUnit(ff->unit); - if (pfsMount==0) return -ENODEV; - - parentOld=pfsInodeGetParent(pfsMount, NULL, old, path1, &result); - if (parentOld){ - u32 nused=parentOld->nused; - - if (nused != 1){ - result=-EBUSY; - goto exit; - } - - if ((iFileOld=pfsInodeGetFileInDir(parentOld, path1, &result))==0) goto exit; - - if ((parentNew=pfsInodeGetParent(pfsMount, NULL, new, path2, &result))==0) goto exit; - - f=(iFileOld->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR; - - if ((parentNew->nused != nused) && ((parentOld!=parentNew) || (parentNew->nused!=2))){ - result=-EBUSY; - goto exit; - } - - iFileNew=pfsInodeGetFileInDir(parentNew, path2, &result); - if (iFileNew){ - if (f){ - if ((iFileNew->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - result=-ENOTDIR; - else - if (pfsCheckDirForFiles(iFileNew)){ - if (iFileNew->nused >= 2) - result=-EBUSY; - else{ - if (iFileOld==iFileNew) - goto exit; - } - }else - result=-ENOTEMPTY; - }else - if ((iFileNew->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) - result=-EISDIR; - else - if (iFileNew->nused >= 2) - result=-EBUSY; - else{ - if (iFileOld==iFileNew) - goto exit; - } - }else - if (result==-ENOENT) - result=0; - - if (result) goto exit; - - if (f && (parentOld!=parentNew)){ - pfs_cache_t *parent; - - parent=pfsCacheUsedAdd(parentNew); - do{ - pfs_cache_t *tmp; - - if (parent==iFileOld){ - result=-EINVAL; - break; - } - tmp=pfsInodeGetFileInDir(parent, "..", &result); - pfsCacheFree(parent); - if (tmp==parent)break; - parent=tmp; - }while(parent); - pfsCacheFree(parent); - } - - if (result==0){ - if (strcmp(path1, ".") && strcmp(path1, "..") && - strcmp(path2, ".") && strcmp(path2, "..")){ - result=pfsCheckAccess(parentOld, 3); - if (result==0) - result=pfsCheckAccess(parentNew, 3); - }else - result=-EINVAL; - - if (result==0){ - if (iFileNew && ((removeNew=pfsDirRemoveEntry(parentNew, path2))==NULL)) - result=-ENOENT; - else{ - removeOld=pfsDirRemoveEntry(parentOld, path1); - if (removeOld==0) - result=-ENOENT; - else{ - addNew=pfsDirAddEntry(parentNew, path2, &iFileOld->u.inode->inode_block, iFileOld->u.inode->mode, &result); - if (addNew && f && (parentOld!=parentNew)) - newParent=pfsSetDentryParent(iFileOld, &parentNew->u.inode->inode_block, &result); - } - } - } - } - - if (result){ - if (removeNew) removeNew->pfsMount=NULL; - if (removeOld) removeOld->pfsMount=NULL; - if (addNew) addNew->pfsMount=NULL; - if (iFileNew) iFileNew->pfsMount=NULL; - parentOld->pfsMount=NULL; - parentNew->pfsMount=NULL; - }else{ - if (parentOld==parentNew){ - if (removeOld!=addNew) - removeOld->flags |= PFS_CACHE_FLAG_DIRTY; - }else - { - pfsInodeSetTime(parentOld); - removeOld->flags|=PFS_CACHE_FLAG_DIRTY; - } - pfsInodeSetTime(parentNew); - addNew->flags|=PFS_CACHE_FLAG_DIRTY; - - if (newParent){ - pfsInodeSetTime(iFileOld); - newParent->flags|=PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(newParent); - } - - if (iFileNew){ - iFileNew->flags &= ~PFS_CACHE_FLAG_DIRTY; - pfsBitmapFreeInodeBlocks(iFileNew); - } - - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - if (removeOld) pfsCacheFree(removeOld); - if (addNew) pfsCacheFree(addNew); - if (removeNew) pfsCacheFree(removeNew); -exit: - if (iFileNew) pfsCacheFree(iFileNew); - pfsCacheFree(iFileOld); - pfsCacheFree(parentOld); - pfsCacheFree(parentNew); - } - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, result); + char path1[256], path2[256]; + int result = 0; + pfs_mount_t *pfsMount; + int f; + pfs_cache_t *parentOld = NULL, *parentNew = NULL; + pfs_cache_t *removeOld = NULL, *removeNew = NULL; + pfs_cache_t *iFileOld = NULL, *iFileNew = NULL; + pfs_cache_t *newParent = NULL, *addNew = NULL; + + pfsMount = pfsFioGetMountedUnit(ff->unit); + if (pfsMount == 0) + return -ENODEV; + + parentOld = pfsInodeGetParent(pfsMount, NULL, old, path1, &result); + if (parentOld) { + u32 nused = parentOld->nused; + + if (nused != 1) { + result = -EBUSY; + goto exit; + } + + if ((iFileOld = pfsInodeGetFileInDir(parentOld, path1, &result)) == 0) + goto exit; + + if ((parentNew = pfsInodeGetParent(pfsMount, NULL, new, path2, &result)) == 0) + goto exit; + + f = (iFileOld->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR; + + if ((parentNew->nused != nused) && ((parentOld != parentNew) || (parentNew->nused != 2))) { + result = -EBUSY; + goto exit; + } + + iFileNew = pfsInodeGetFileInDir(parentNew, path2, &result); + if (iFileNew) { + if (f) { + if ((iFileNew->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) + result = -ENOTDIR; + else if (pfsCheckDirForFiles(iFileNew)) { + if (iFileNew->nused >= 2) + result = -EBUSY; + else { + if (iFileOld == iFileNew) + goto exit; + } + } else + result = -ENOTEMPTY; + } else if ((iFileNew->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) + result = -EISDIR; + else if (iFileNew->nused >= 2) + result = -EBUSY; + else { + if (iFileOld == iFileNew) + goto exit; + } + } else if (result == -ENOENT) + result = 0; + + if (result) + goto exit; + + if (f && (parentOld != parentNew)) { + pfs_cache_t *parent; + + parent = pfsCacheUsedAdd(parentNew); + do { + pfs_cache_t *tmp; + + if (parent == iFileOld) { + result = -EINVAL; + break; + } + tmp = pfsInodeGetFileInDir(parent, "..", &result); + pfsCacheFree(parent); + if (tmp == parent) + break; + parent = tmp; + } while (parent); + pfsCacheFree(parent); + } + + if (result == 0) { + if (strcmp(path1, ".") && strcmp(path1, "..") && + strcmp(path2, ".") && strcmp(path2, "..")) { + result = pfsCheckAccess(parentOld, 3); + if (result == 0) + result = pfsCheckAccess(parentNew, 3); + } else + result = -EINVAL; + + if (result == 0) { + if (iFileNew && ((removeNew = pfsDirRemoveEntry(parentNew, path2)) == NULL)) + result = -ENOENT; + else { + removeOld = pfsDirRemoveEntry(parentOld, path1); + if (removeOld == 0) + result = -ENOENT; + else { + addNew = pfsDirAddEntry(parentNew, path2, &iFileOld->u.inode->inode_block, iFileOld->u.inode->mode, &result); + if (addNew && f && (parentOld != parentNew)) + newParent = pfsSetDentryParent(iFileOld, &parentNew->u.inode->inode_block, &result); + } + } + } + } + + if (result) { + if (removeNew) + removeNew->pfsMount = NULL; + if (removeOld) + removeOld->pfsMount = NULL; + if (addNew) + addNew->pfsMount = NULL; + if (iFileNew) + iFileNew->pfsMount = NULL; + parentOld->pfsMount = NULL; + parentNew->pfsMount = NULL; + } else { + if (parentOld == parentNew) { + if (removeOld != addNew) + removeOld->flags |= PFS_CACHE_FLAG_DIRTY; + } else { + pfsInodeSetTime(parentOld); + removeOld->flags |= PFS_CACHE_FLAG_DIRTY; + } + pfsInodeSetTime(parentNew); + addNew->flags |= PFS_CACHE_FLAG_DIRTY; + + if (newParent) { + pfsInodeSetTime(iFileOld); + newParent->flags |= PFS_CACHE_FLAG_DIRTY; + pfsCacheFree(newParent); + } + + if (iFileNew) { + iFileNew->flags &= ~PFS_CACHE_FLAG_DIRTY; + pfsBitmapFreeInodeBlocks(iFileNew); + } + + if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); + } + if (removeOld) + pfsCacheFree(removeOld); + if (addNew) + pfsCacheFree(addNew); + if (removeNew) + pfsCacheFree(removeNew); + exit: + if (iFileNew) + pfsCacheFree(iFileNew); + pfsCacheFree(iFileOld); + pfsCacheFree(parentOld); + pfsCacheFree(parentNew); + } + SignalSema(pfsFioSema); + return pfsFioCheckForLastError(pfsMount, result); } int pfsFioChdir(iop_file_t *f, const char *name) { - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - int result = 0; + pfs_mount_t *pfsMount; + pfs_cache_t *clink; + int result = 0; - if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - clink = pfsInodeGetFile(pfsMount, 0, name, &result); - if(clink != NULL) { - if((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - result = -ENOTDIR; - else { + clink = pfsInodeGetFile(pfsMount, 0, name, &result); + if (clink != NULL) { + if ((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) + result = -ENOTDIR; + else { - result = pfsCheckAccess(clink, 0x01); + result = pfsCheckAccess(clink, 0x01); - if(result == 0) - memcpy(&pfsMount->current_dir, &clink->u.inode->inode_block, sizeof(pfs_blockinfo_t)); - } + if (result == 0) + memcpy(&pfsMount->current_dir, &clink->u.inode->inode_block, sizeof(pfs_blockinfo_t)); + } - pfsCacheFree(clink); - } + pfsCacheFree(clink); + } - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, result); + SignalSema(pfsFioSema); + return pfsFioCheckForLastError(pfsMount, result); } static void _sync(void) { - u32 i; - for(i=0;idirty) { - pfs_mount_t *pfsMount=pfsFileSlots[i].clink->pfsMount; - pfsMount->blockDev->transfer(pfsMount->fd, &pfsFileSlots[i].restsBuffer, - info->sub, info->sector, 1, PFS_IO_MODE_WRITE); - pfsFileSlots[i].restsInfo.dirty=0; - } - } + u32 i; + for (i = 0; i < pfsConfig.maxOpen; i++) { + pfs_restsInfo_t *info = &pfsFileSlots[i].restsInfo; + if (info->dirty) { + pfs_mount_t *pfsMount = pfsFileSlots[i].clink->pfsMount; + pfsMount->blockDev->transfer(pfsMount->fd, &pfsFileSlots[i].restsBuffer, + info->sub, info->sector, 1, PFS_IO_MODE_WRITE); + pfsFileSlots[i].restsInfo.dirty = 0; + } + } } int pfsFioSync(iop_file_t *f, const char *dev, int flag) { - pfs_mount_t *pfsMount; + pfs_mount_t *pfsMount; - if(!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - _sync(); - pfsCacheFlushAllDirty(pfsMount); + _sync(); + pfsCacheFlushAllDirty(pfsMount); - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, 0); + SignalSema(pfsFioSema); + return pfsFioCheckForLastError(pfsMount, 0); } int pfsFioMount(iop_file_t *f, const char *fsname, const char *devname, int flag, void *arg, int arglen) { - int rv; - int fd; - pfs_block_device_t *blockDev; - - if(!(blockDev = pfsGetBlockDeviceTable(devname))) - return -ENXIO; - - WaitSema(pfsFioSema); - - fd = open(devname, (flag & FIO_MT_RDONLY) ? O_RDONLY : O_RDWR, 0644); // ps2hdd.irx fd - if(fd < 0) - rv = fd; - else { - if((rv=mountDevice(blockDev, fd, f->unit, flag)) < 0) - close(fd); - } - SignalSema(pfsFioSema); - return rv; + int rv; + int fd; + pfs_block_device_t *blockDev; + + if (!(blockDev = pfsGetBlockDeviceTable(devname))) + return -ENXIO; + + WaitSema(pfsFioSema); + + fd = open(devname, (flag & FIO_MT_RDONLY) ? O_RDONLY : O_RDWR, 0644); // ps2hdd.irx fd + if (fd < 0) + rv = fd; + else { + if ((rv = mountDevice(blockDev, fd, f->unit, flag)) < 0) + close(fd); + } + SignalSema(pfsFioSema); + return rv; } int pfsFioUmount(iop_file_t *f, const char *fsname) { - u32 i; - int rv=0; - int busy_flag=0; - pfs_mount_t *pfsMount; - - if((pfsMount = pfsFioGetMountedUnit(f->unit))==NULL) - return -ENODEV; - - for(i = 0; i < pfsConfig.maxOpen; i++) - { - if((pfsFileSlots[i].clink!=NULL) && (pfsFileSlots[i].clink->pfsMount==pfsMount)) - { - busy_flag=1; - break; - } - } - if(busy_flag==0) - { - pfsCacheClose(pfsMount); - close(pfsMount->fd); - pfsClearMount(pfsMount); - } - else - rv=-EBUSY; // Mount device busy - - SignalSema(pfsFioSema); - return rv; + u32 i; + int rv = 0; + int busy_flag = 0; + pfs_mount_t *pfsMount; + + if ((pfsMount = pfsFioGetMountedUnit(f->unit)) == NULL) + return -ENODEV; + + for (i = 0; i < pfsConfig.maxOpen; i++) { + if ((pfsFileSlots[i].clink != NULL) && (pfsFileSlots[i].clink->pfsMount == pfsMount)) { + busy_flag = 1; + break; + } + } + if (busy_flag == 0) { + pfsCacheClose(pfsMount); + close(pfsMount->fd); + pfsClearMount(pfsMount); + } else + rv = -EBUSY; // Mount device busy + + SignalSema(pfsFioSema); + return rv; } int pfsFioSymlink(iop_file_t *f, const char *old, const char *new) { - int rv; - pfs_mount_t *pfsMount; - int mode=0x141FF; + int rv; + pfs_mount_t *pfsMount; + int mode = 0x141FF; - if(old==NULL || new==NULL) - return -ENOENT; + if (old == NULL || new == NULL) + return -ENOENT; - if(!(pfsMount=pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - rv = openFile(pfsMount, (pfs_file_slot_t *)old, (const char *)new, O_CREAT|O_WRONLY, mode); - SignalSema(pfsFioSema); - return rv; + rv = openFile(pfsMount, (pfs_file_slot_t *)old, (const char *)new, O_CREAT | O_WRONLY, mode); + SignalSema(pfsFioSema); + return rv; } int pfsFioReadlink(iop_file_t *f, const char *path, char *buf, int buflen) { - int rv=0; - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - - if(buflen < 0) - return -EINVAL; - if(!(pfsMount=pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - if((clink=pfsInodeGetFile(pfsMount, NULL, path, &rv))!=NULL) - { - if((clink->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK) - rv=-EINVAL; - else - { - rv=strlen((char *)&clink->u.inode->data[1]); - if(buflen < rv) - rv=buflen; - memcpy(buf, &clink->u.inode->data[1], rv); - } - pfsCacheFree(clink); - } - SignalSema(pfsFioSema); - - return pfsFioCheckForLastError(pfsMount, rv); + int rv = 0; + pfs_mount_t *pfsMount; + pfs_cache_t *clink; + + if (buflen < 0) + return -EINVAL; + if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; + + if ((clink = pfsInodeGetFile(pfsMount, NULL, path, &rv)) != NULL) { + if ((clink->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK) + rv = -EINVAL; + else { + rv = strlen((char *)&clink->u.inode->data[1]); + if (buflen < rv) + rv = buflen; + memcpy(buf, &clink->u.inode->data[1], rv); + } + pfsCacheFree(clink); + } + SignalSema(pfsFioSema); + + return pfsFioCheckForLastError(pfsMount, rv); } int pfsFioUnsupported(void) { - PFS_PRINTF(PFS_DRV_NAME" Error: Operation currently unsupported.\n"); + PFS_PRINTF(PFS_DRV_NAME " Error: Operation currently unsupported.\n"); - return -1; + return -1; } diff --git a/modules/hdd/pfs/pfs_fio.h b/modules/hdd/pfs/pfs_fio.h index e5580ebb7..c0dafa921 100644 --- a/modules/hdd/pfs/pfs_fio.h +++ b/modules/hdd/pfs/pfs_fio.h @@ -11,7 +11,7 @@ #ifndef _PFS_FIO_H #define _PFS_FIO_H -#define PFS_FDIRO (0x0008) /* internal use for dopen */ +#define PFS_FDIRO (0x0008) /* internal use for dopen */ /////////////////////////////////////////////////////////////////////////////// // Function declarations @@ -24,22 +24,22 @@ void pfsFioCloseFileSlot(pfs_file_slot_t *fileSlot); /////////////////////////////////////////////////////////////////////////////// // I/O functions -int pfsFioInit(iop_device_t *f); -int pfsFioDeinit(iop_device_t *f); -int pfsFioFormat(iop_file_t *, const char *dev, const char *blockdev, void *arg, int arglen); -int pfsFioOpen(iop_file_t *f, const char *name, int flags, int mode); -int pfsFioClose(iop_file_t *f); -int pfsFioRead(iop_file_t *f, void *buf, int size); -int pfsFioWrite(iop_file_t *f, void *buf, int size); -int pfsFioLseek(iop_file_t *f, int pos, int whence); -int pfsFioRemove(iop_file_t *f, const char *name); -int pfsFioMkdir(iop_file_t *f, const char *path, int mode); -int pfsFioRmdir(iop_file_t *f, const char *path); -int pfsFioDopen(iop_file_t *f, const char *name); -int pfsFioDclose(iop_file_t *f); -int pfsFioDread(iop_file_t *f, iox_dirent_t *buf); -int pfsFioGetstat(iop_file_t *f, const char *name, iox_stat_t *stat); -int pfsFioChstat(iop_file_t *f, const char *name, iox_stat_t *stat, unsigned int statmask); +int pfsFioInit(iop_device_t *f); +int pfsFioDeinit(iop_device_t *f); +int pfsFioFormat(iop_file_t *, const char *dev, const char *blockdev, void *arg, int arglen); +int pfsFioOpen(iop_file_t *f, const char *name, int flags, int mode); +int pfsFioClose(iop_file_t *f); +int pfsFioRead(iop_file_t *f, void *buf, int size); +int pfsFioWrite(iop_file_t *f, void *buf, int size); +int pfsFioLseek(iop_file_t *f, int pos, int whence); +int pfsFioRemove(iop_file_t *f, const char *name); +int pfsFioMkdir(iop_file_t *f, const char *path, int mode); +int pfsFioRmdir(iop_file_t *f, const char *path); +int pfsFioDopen(iop_file_t *f, const char *name); +int pfsFioDclose(iop_file_t *f); +int pfsFioDread(iop_file_t *f, iox_dirent_t *buf); +int pfsFioGetstat(iop_file_t *f, const char *name, iox_stat_t *stat); +int pfsFioChstat(iop_file_t *f, const char *name, iox_stat_t *stat, unsigned int statmask); int pfsFioRename(iop_file_t *f, const char *old, const char *new); int pfsFioChdir(iop_file_t *f, const char *name); int pfsFioSync(iop_file_t *f, const char *dev, int flag); diff --git a/modules/hdd/pfs/pfs_fioctl.c b/modules/hdd/pfs/pfs_fioctl.c index 690a40b17..cd3a7b6d9 100644 --- a/modules/hdd/pfs/pfs_fioctl.c +++ b/modules/hdd/pfs/pfs_fioctl.c @@ -42,317 +42,300 @@ static int ioctl2AttrRead(pfs_cache_t *clink, pfs_ioctl2attr_t *attr, u32 *unkbu int pfsFioIoctl(iop_file_t *f, int cmd, void *param) { - return -1; + return -1; } int pfsFioDevctl(iop_file_t *f, const char *name, int cmd, void *arg, size_t arglen, void *buf, size_t buflen) { - pfs_mount_t *pfsMount; - int rv=0; + pfs_mount_t *pfsMount; + int rv = 0; - if(!(pfsMount=pfsFioGetMountedUnit(f->unit))) - return -ENODEV; + if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) + return -ENODEV; - switch(cmd) - { - case PDIOC_ZONESZ: - rv=pfsMount->zsize; - break; - - case PDIOC_ZONEFREE: - rv=pfsMount->zfree; - break; + switch (cmd) { + case PDIOC_ZONESZ: + rv = pfsMount->zsize; + break; - case PDIOC_CLOSEALL: - pfsFioDevctlCloseAll(); - break; + case PDIOC_ZONEFREE: + rv = pfsMount->zfree; + break; - case PDIOC_CLRFSCKSTAT: - rv=devctlFsckStat(pfsMount, PFS_MODE_REMOVE_FLAG); - break; + case PDIOC_CLOSEALL: + pfsFioDevctlCloseAll(); + break; - case PDIOC_GETFSCKSTAT: - rv=devctlFsckStat(pfsMount, PFS_MODE_CHECK_FLAG); - break; + case PDIOC_CLRFSCKSTAT: + rv = devctlFsckStat(pfsMount, PFS_MODE_REMOVE_FLAG); + break; - case PDIOC_SETUID: - pfsMount->uid=*(u16 *)(arg); - break; + case PDIOC_GETFSCKSTAT: + rv = devctlFsckStat(pfsMount, PFS_MODE_CHECK_FLAG); + break; - case PDIOC_SETGID: - pfsMount->gid=*(u16 *)(arg); - break; + case PDIOC_SETUID: + pfsMount->uid = *(u16 *)(arg); + break; - case PDIOC_SHOWBITMAP: - pfsBitmapShow(pfsMount); - break; + case PDIOC_SETGID: + pfsMount->gid = *(u16 *)(arg); + break; - default: - rv=-EINVAL; - break; + case PDIOC_SHOWBITMAP: + pfsBitmapShow(pfsMount); + break; - } - SignalSema(pfsFioSema); + default: + rv = -EINVAL; + break; + } + SignalSema(pfsFioSema); - return rv; + return rv; } -int pfsFioIoctl2(iop_file_t *f, int cmd, void *arg, size_t arglen, void *buf, size_t buflen) +int pfsFioIoctl2(iop_file_t *f, int cmd, void *arg, size_t arglen, void *buf, size_t buflen) { - int rv; - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - pfs_mount_t *pfsMount; - - if(f->mode & O_DIROPEN) - if(cmd==PIOCATTRREAD) - return -EISDIR; - - if(!(f->mode & O_WRONLY)) { - if(cmd!=PIOCATTRLOOKUP) - if(cmd!=PIOCATTRREAD) - return -EACCES; - } - if((rv=pfsFioCheckFileSlot(fileSlot))<0) - return rv; - pfsMount=fileSlot->clink->pfsMount; - - switch(cmd) - { - case PIOCALLOC: - rv=pfsAllocZones(fileSlot->clink, *(int *)(arg), 1); - break; - - case PIOCFREE: - pfsFreeZones(fileSlot->clink); - break; - - case PIOCATTRADD: - case PIOCATTRDEL: - case PIOCATTRLOOKUP: - case PIOCATTRREAD: - rv=ioctl2Attr(fileSlot->clink, cmd, arg, buf, &fileSlot->aentryOffset); - break; - - // Custom IOCTL2 command(s) for OPL + int rv; + pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; + pfs_mount_t *pfsMount; + + if (f->mode & O_DIROPEN) + if (cmd == PIOCATTRREAD) + return -EISDIR; + + if (!(f->mode & O_WRONLY)) { + if (cmd != PIOCATTRLOOKUP) + if (cmd != PIOCATTRREAD) + return -EACCES; + } + if ((rv = pfsFioCheckFileSlot(fileSlot)) < 0) + return rv; + pfsMount = fileSlot->clink->pfsMount; + + switch (cmd) { + case PIOCALLOC: + rv = pfsAllocZones(fileSlot->clink, *(int *)(arg), 1); + break; + + case PIOCFREE: + pfsFreeZones(fileSlot->clink); + break; + + case PIOCATTRADD: + case PIOCATTRDEL: + case PIOCATTRLOOKUP: + case PIOCATTRREAD: + rv = ioctl2Attr(fileSlot->clink, cmd, arg, buf, &fileSlot->aentryOffset); + break; + + // Custom IOCTL2 command(s) for OPL case PFS_IOCTL2_GET_INODE: memcpy(buf, fileSlot->clink->u.inode, sizeof(pfs_inode_t)); rv = sizeof(pfs_inode_t); break; - default: - rv=-EINVAL; - break; - } + default: + rv = -EINVAL; + break; + } - if(pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - rv=pfsFioCheckForLastError(pfsMount, rv); - SignalSema(pfsFioSema); + if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) + pfsCacheFlushAllDirty(pfsMount); + rv = pfsFioCheckForLastError(pfsMount, rv); + SignalSema(pfsFioSema); - return rv; + return rv; } static int ioctl2Attr(pfs_cache_t *clink, int cmd, void *arg, void *outbuf, u32 *offset) -{ // attr set, attr delete, attr lookup, attr read cmds - int rv; - pfs_cache_t *flink; - - if((flink=pfsCacheGetData(clink->pfsMount, clink->sub, clink->sector+1 - ,PFS_CACHE_FLAG_NOTHING, &rv))==NULL) - return rv; +{ // attr set, attr delete, attr lookup, attr read cmds + int rv; + pfs_cache_t *flink; - switch(cmd) - { - case PIOCATTRADD: - rv=ioctl2AttrAdd(flink, arg); - break; + if ((flink = pfsCacheGetData(clink->pfsMount, clink->sub, clink->sector + 1, PFS_CACHE_FLAG_NOTHING, &rv)) == NULL) + return rv; - case PIOCATTRDEL: - rv=ioctl2AttrDelete(flink, arg); - break; + switch (cmd) { + case PIOCATTRADD: + rv = ioctl2AttrAdd(flink, arg); + break; - case PIOCATTRLOOKUP: - rv=ioctl2AttrLoopUp(flink, arg, outbuf); - break; + case PIOCATTRDEL: + rv = ioctl2AttrDelete(flink, arg); + break; - case PIOCATTRREAD: - rv=ioctl2AttrRead(flink, outbuf, offset); - break; + case PIOCATTRLOOKUP: + rv = ioctl2AttrLoopUp(flink, arg, outbuf); + break; - } - pfsCacheFree(flink); + case PIOCATTRREAD: + rv = ioctl2AttrRead(flink, outbuf, offset); + break; + } + pfsCacheFree(flink); - return rv; + return rv; } void pfsFioDevctlCloseAll(void) { - u32 i; - - for(i=0;i < pfsConfig.maxOpen;i++) - { - if(pfsFileSlots[i].fd) - pfsFioCloseFileSlot(&pfsFileSlots[i]); - } - for(i=0;i < pfsConfig.maxOpen;i++) - { - pfs_mount_t *pfsMount; - if((pfsMount=pfsGetMountedUnit(i))!=NULL) - pfsCacheFlushAllDirty(pfsMount); - - } + u32 i; + + for (i = 0; i < pfsConfig.maxOpen; i++) { + if (pfsFileSlots[i].fd) + pfsFioCloseFileSlot(&pfsFileSlots[i]); + } + for (i = 0; i < pfsConfig.maxOpen; i++) { + pfs_mount_t *pfsMount; + if ((pfsMount = pfsGetMountedUnit(i)) != NULL) + pfsCacheFlushAllDirty(pfsMount); + } } static int devctlFsckStat(pfs_mount_t *pfsMount, int mode) { - int rv; - pfs_cache_t *clink; - - if((clink=pfsCacheAllocClean(&rv))!=NULL){ - rv=pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_ERRORS_FIXED, mode); - pfsCacheFree(clink); - } - return rv; + int rv; + pfs_cache_t *clink; + + if ((clink = pfsCacheAllocClean(&rv)) != NULL) { + rv = pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_ERRORS_FIXED, mode); + pfsCacheFree(clink); + } + return rv; } static pfs_aentry_t *getAentry(pfs_cache_t *clink, char *key, char *value, int mode) -{ // mode 0=lookup, 1=add, 2=delete - int kLen, fullsize; - pfs_aentry_t *aentry=clink->u.aentry; - pfs_aentry_t *aentryLast=NULL; - pfs_aentry_t *end; - - kLen=strlen(key); - fullsize=(kLen+strlen(value)+7) & ~3; - for(end=(pfs_aentry_t *)((u8*)aentry+1024);end < aentry; aentry=(pfs_aentry_t *)((u8*)aentry+aentry->aLen)) - { - if(aentry->aLen & 3) - PFS_PRINTF(PFS_DRV_NAME" Error: attrib-entry allocated length/4 != 0\n"); - if(aentry->aLen < ((aentry->kLen+aentry->vLen+7) & ~3)) - { - PFS_PRINTF(PFS_DRV_NAME" Panic: attrib-entry is too small\n"); - return NULL; - } - if(end < (pfs_aentry_t*)((u8*)aentry+aentry->aLen)) - PFS_PRINTF(PFS_DRV_NAME" Error: attrib-entry too big\n"); - - switch(mode) - { - case 0:// lookup - if(kLen==aentry->kLen) - if(memcmp(key, aentry->str, kLen)==0) - return aentry; - break; - - case 1:// add - if(aentry->kLen==0) - { - if(aentry->aLen>=fullsize) - return aentry; - } - if(aentry->aLen - ((aentry->kLen+aentry->vLen+7) & ~3) < fullsize) - continue; - return aentry; - - default:// delete - if(kLen==aentry->kLen) - { - if(memcmp(key, aentry->str, kLen)==0) - { - if(aentryLast!=NULL) - { - aentryLast->aLen+=aentry->aLen; - return aentry; - } - // delete it :P - aentry->kLen=0; - aentry->vLen=0; - return aentry; - } - } - aentryLast=aentry; - break; - - } - } - return NULL; +{ // mode 0=lookup, 1=add, 2=delete + int kLen, fullsize; + pfs_aentry_t *aentry = clink->u.aentry; + pfs_aentry_t *aentryLast = NULL; + pfs_aentry_t *end; + + kLen = strlen(key); + fullsize = (kLen + strlen(value) + 7) & ~3; + for (end = (pfs_aentry_t *)((u8 *)aentry + 1024); end < aentry; aentry = (pfs_aentry_t *)((u8 *)aentry + aentry->aLen)) { + if (aentry->aLen & 3) + PFS_PRINTF(PFS_DRV_NAME " Error: attrib-entry allocated length/4 != 0\n"); + if (aentry->aLen < ((aentry->kLen + aentry->vLen + 7) & ~3)) { + PFS_PRINTF(PFS_DRV_NAME " Panic: attrib-entry is too small\n"); + return NULL; + } + if (end < (pfs_aentry_t *)((u8 *)aentry + aentry->aLen)) + PFS_PRINTF(PFS_DRV_NAME " Error: attrib-entry too big\n"); + + switch (mode) { + case 0: // lookup + if (kLen == aentry->kLen) + if (memcmp(key, aentry->str, kLen) == 0) + return aentry; + break; + + case 1: // add + if (aentry->kLen == 0) { + if (aentry->aLen >= fullsize) + return aentry; + } + if (aentry->aLen - ((aentry->kLen + aentry->vLen + 7) & ~3) < fullsize) + continue; + return aentry; + + default: // delete + if (kLen == aentry->kLen) { + if (memcmp(key, aentry->str, kLen) == 0) { + if (aentryLast != NULL) { + aentryLast->aLen += aentry->aLen; + return aentry; + } + // delete it :P + aentry->kLen = 0; + aentry->vLen = 0; + return aentry; + } + } + aentryLast = aentry; + break; + } + } + return NULL; } static int ioctl2AttrAdd(pfs_cache_t *clink, pfs_ioctl2attr_t *attr) { - u32 kLen, vLen; - pfs_aentry_t *aentry; - u32 tmp; - - // input check - kLen=strlen(attr->key); - vLen=strlen(attr->value); - if(kLen>=256 || vLen>=256) // max size safe e check - return -EINVAL; - - if(kLen==0 || vLen==0) // no input check - return -EINVAL; - - if(getAentry(clink, attr->key, NULL, 0)) - return -EEXIST; - if(!(aentry=getAentry(clink, attr->key, attr->value, 1))) - return -ENOSPC; - - if(aentry->kLen==0) - tmp=aentry->aLen; - else - tmp=aentry->aLen-((aentry->kLen+(aentry->vLen + 7)) & ~3); - - aentry->aLen-=tmp; - aentry = (pfs_aentry_t*)((u8 *)aentry + aentry->aLen); - aentry->kLen=kLen; - aentry->vLen=vLen; - aentry->aLen=tmp; - memcpy(&aentry->str[0], attr->key, aentry->kLen); - memcpy(&aentry->str[aentry->kLen], attr->value, aentry->vLen); - clink->flags|=PFS_CACHE_FLAG_DIRTY; - - return 0; + u32 kLen, vLen; + pfs_aentry_t *aentry; + u32 tmp; + + // input check + kLen = strlen(attr->key); + vLen = strlen(attr->value); + if (kLen >= 256 || vLen >= 256) // max size safe e check + return -EINVAL; + + if (kLen == 0 || vLen == 0) // no input check + return -EINVAL; + + if (getAentry(clink, attr->key, NULL, 0)) + return -EEXIST; + if (!(aentry = getAentry(clink, attr->key, attr->value, 1))) + return -ENOSPC; + + if (aentry->kLen == 0) + tmp = aentry->aLen; + else + tmp = aentry->aLen - ((aentry->kLen + (aentry->vLen + 7)) & ~3); + + aentry->aLen -= tmp; + aentry = (pfs_aentry_t *)((u8 *)aentry + aentry->aLen); + aentry->kLen = kLen; + aentry->vLen = vLen; + aentry->aLen = tmp; + memcpy(&aentry->str[0], attr->key, aentry->kLen); + memcpy(&aentry->str[aentry->kLen], attr->value, aentry->vLen); + clink->flags |= PFS_CACHE_FLAG_DIRTY; + + return 0; } static int ioctl2AttrDelete(pfs_cache_t *clink, void *arg) { - pfs_aentry_t *aentry; + pfs_aentry_t *aentry; - if((aentry=getAentry(clink, arg, 0, 2))==NULL) - return -ENOENT; - clink->flags|=PFS_CACHE_FLAG_DIRTY; - return 0; + if ((aentry = getAentry(clink, arg, 0, 2)) == NULL) + return -ENOENT; + clink->flags |= PFS_CACHE_FLAG_DIRTY; + return 0; } static int ioctl2AttrLoopUp(pfs_cache_t *clink, char *key, char *value) { - pfs_aentry_t *aentry; - - if((aentry=getAentry(clink, key, 0, 0))){ - memcpy(value, &aentry->str[aentry->kLen], aentry->vLen); - value[aentry->vLen]=0; - return aentry->vLen; - } - return -ENOENT; + pfs_aentry_t *aentry; + + if ((aentry = getAentry(clink, key, 0, 0))) { + memcpy(value, &aentry->str[aentry->kLen], aentry->vLen); + value[aentry->vLen] = 0; + return aentry->vLen; + } + return -ENOENT; } static int ioctl2AttrRead(pfs_cache_t *clink, pfs_ioctl2attr_t *attr, u32 *offset) { - pfs_aentry_t *aentry; - - if(*offset >= 1024) - return 0; - do { - aentry=(pfs_aentry_t *)((u8*)clink->u.inode+*offset); - memcpy(attr->key, &aentry->str[0], aentry->kLen); - attr->key[aentry->kLen]=0; - memcpy(attr->value, &aentry->str[aentry->kLen], aentry->vLen); - attr->value[aentry->vLen]=0; - *offset+=aentry->aLen; // next - if(aentry->kLen!=0) - break; - } while(*offset < 1024); - - return aentry->kLen; + pfs_aentry_t *aentry; + + if (*offset >= 1024) + return 0; + do { + aentry = (pfs_aentry_t *)((u8 *)clink->u.inode + *offset); + memcpy(attr->key, &aentry->str[0], aentry->kLen); + attr->key[aentry->kLen] = 0; + memcpy(attr->value, &aentry->str[aentry->kLen], aentry->vLen); + attr->value[aentry->vLen] = 0; + *offset += aentry->aLen; // next + if (aentry->kLen != 0) + break; + } while (*offset < 1024); + + return aentry->kLen; } diff --git a/modules/iopcore/cdvdman/streaming.c b/modules/iopcore/cdvdman/streaming.c index dc245f877..b1afe7dff 100644 --- a/modules/iopcore/cdvdman/streaming.c +++ b/modules/iopcore/cdvdman/streaming.c @@ -1,429 +1,429 @@ -#include "smsutils.h" -#include "ioplib_util.h" -#include "cdvdman.h" -#include "cdvd_config.h" -#include "internal.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -extern cdvdman_status_t cdvdman_stat; - -static int AllocBank(void **pointer); -static int ReadSectors(int maxcount, void *buffer); -static int StFillStreamBuffer(void); -static void StStartFillStreamBuffer(void); - -static unsigned int StmScheduleCb(void *arg) -{ - return ((StFillStreamBuffer() >= 0) ? 0 : 0x00704000); -} - -static void StmCallback(void) -{ - int OldState; - - //Only update parameters if the streaming system was reading. Otherwise, this callback might have been triggered by the game reading data (BUG!) - if (cdvdman_stat.StreamingData.StIsReading) { - CpuSuspendIntr(&OldState); - cdvdman_stat.StreamingData.Stlsn += cdvdman_stat.StreamingData.StBanksize; - cdvdman_stat.StreamingData.StStreamed += cdvdman_stat.StreamingData.StBanksize; - cdvdman_stat.StreamingData.StWritePtr += cdvdman_stat.StreamingData.StBanksize; - if (cdvdman_stat.StreamingData.StWritePtr >= cdvdman_stat.StreamingData.StBufmax) - cdvdman_stat.StreamingData.StWritePtr = 0; - cdvdman_stat.StreamingData.StIsReading = 0; - CpuResumeIntr(OldState); - } - - DPRINTF("StmCallback: %08lx, wr: %u, rd: %u, streamed: %u\n", cdvdman_stat.StreamingData.Stlsn, cdvdman_stat.StreamingData.StWritePtr, cdvdman_stat.StreamingData.StReadPtr, cdvdman_stat.StreamingData.StStreamed); - - StStartFillStreamBuffer(); -} - -static void StReset(void) -{ - cdvdman_stat.StreamingData.StWritePtr = 0; - cdvdman_stat.StreamingData.StReadPtr = 0; - cdvdman_stat.StreamingData.StStreamed = 0; - cdvdman_stat.StreamingData.StIsReading = 0; -} - -// 0 = OK. <0 = error in sceCdRead. >0 = full buffer. -static int StFillStreamBuffer(void) -{ - int result, OldState; - void *ptr; - - /* NOTE: When this function is called by the timer callback (when a fill request is rescheduled), - this critical section here might not be protected properly because CpuSuspendIntr only prevents thread-switching (hardware interrupts are disabled differently). - SCEI used a similar design, but their implementation uses a bitmap to mark the filled/empty banks instead - (which is probably immune to race conditions, but we are interested in saving memory). - I don't think that there will be a problem because the important critical section (AllocBank) is probably far enough beneath this mechanism. - If deemed necessary, please replace the rescheduling mechanism with one that is thread-based. */ - CpuSuspendIntr(&OldState); - - if (cdvdman_stat.StreamingData.StIsReading) { - CpuResumeIntr(OldState); - return 0; - } - - CancelAlarm(&StmScheduleCb, &cdvdman_stat.StreamingData); - cdvdman_stat.StreamingData.StIsReading = 1; - - //Determine how much more to read. - result = AllocBank(&ptr); - - CpuResumeIntr(OldState); - - if (result == 0) { - // iDPRINTF("Stream fill buffer: Stream lsn 0x%08x - %u sectors:%p\n", cdvdman_stat.StreamingData.Stlsn, cdvdman_stat.StreamingData.StBanksize, ptr); - if (cdvdman_AsyncRead(cdvdman_stat.StreamingData.Stlsn, cdvdman_stat.StreamingData.StBanksize, ptr) == 0) { - //Failed to start reading. - cdvdman_stat.StreamingData.StIsReading = 0; - result = -1; - } else { - result = 0; - } - } else { - iDPRINTF("Stream fill buffer: Stream full.\n"); - //Nothing else to read. - cdvdman_stat.StreamingData.StIsReading = 0; - result = 1; - } - - return result; -} - -static void StStartFillStreamBuffer(void) -{ - iop_sys_clock_t StmScheduleClock; - - if (StFillStreamBuffer() < 0) { - DPRINTF("StmCallback: Rescheduling read.\n"); - StmScheduleClock.lo = 0x00704000; - StmScheduleClock.hi = 0; - SetAlarm(&StmScheduleClock, &StmScheduleCb, &cdvdman_stat.StreamingData); - } -} - -int sceCdStInit(u32 bufmax, u32 bankmax, void *iop_bufaddr) -{ - int OldState; - - cdvdman_stat.err = CDVD_ERR_NO; - - CancelAlarm(&StmScheduleCb, &cdvdman_stat.StreamingData); - - CpuSuspendIntr(&OldState); - cdvdman_stat.StreamingData.StBankmax = bankmax; - cdvdman_stat.StreamingData.StBanksize = bufmax / bankmax; - cdvdman_stat.StreamingData.StBufmax = cdvdman_stat.StreamingData.StBanksize * cdvdman_stat.StreamingData.StBankmax; - cdvdman_stat.StreamingData.StIOP_bufaddr = iop_bufaddr; - StReset(); - - CpuResumeIntr(OldState); - - DPRINTF("sceCdStInit bufmax: %u (%lu), bankmax: %lu, banksize: %u, buffer: %p\n", cdvdman_stat.StreamingData.StBufmax, bufmax, bankmax, cdvdman_stat.StreamingData.StBanksize, iop_bufaddr); - - return 1; -} - -//Must be called from an interrupt-disabled state. -static int AllocBank(void **pointer) -{ - int result; - - if (cdvdman_stat.StreamingData.StBufmax - cdvdman_stat.StreamingData.StStreamed >= cdvdman_stat.StreamingData.StBanksize) { - *pointer = cdvdman_stat.StreamingData.StIOP_bufaddr + cdvdman_stat.StreamingData.StWritePtr * 2048; - result = 0; - } else { - *pointer = NULL; - result = -ENOMEM; - } - - // iDPRINTF("AllocBank: wrptr: %u, rdptr: %u, streamed: %u\n", cdvdman_stat.StreamingData.StWritePtr, cdvdman_stat.StreamingData.StReadPtr, cdvdman_stat.StreamingData.StStreamed); - - return result; -} - -static int ReadSectorsEE(int maxcount, void *buffer) -{ - int OldState, result, dmat_id, dmat_count; - unsigned short int SectorsToCopy, rdptr; - SifDmaTransfer_t dmat[2]; - void *ptr; - - // DPRINTF("ReadSectors EE: wr: %u, rd: %u, streamed: %u\n", cdvdman_stat.StreamingData.StWritePtr, cdvdman_stat.StreamingData.StReadPtr, cdvdman_stat.StreamingData.StStreamed); - - result = 0; - ptr = buffer; - dmat_count = 0; - dmat_id = 0; - - CpuSuspendIntr(&OldState); - rdptr = cdvdman_stat.StreamingData.StReadPtr; - - //When Wr <= Rd, the buffer is either full or empty. Check StStreamed. - if (cdvdman_stat.StreamingData.StWritePtr <= rdptr && cdvdman_stat.StreamingData.StStreamed > 0) { - SectorsToCopy = cdvdman_stat.StreamingData.StBufmax - rdptr; - if (SectorsToCopy > maxcount) - SectorsToCopy = maxcount; - if (SectorsToCopy > 0) { - dmat[0].src = cdvdman_stat.StreamingData.StIOP_bufaddr + rdptr * 2048; - dmat[0].dest = buffer; - dmat[0].size = SectorsToCopy * 2048; - dmat[0].attr = 0; - dmat_count = 1; - ptr += SectorsToCopy * 2048; - rdptr += SectorsToCopy; - if (rdptr >= cdvdman_stat.StreamingData.StBufmax) - rdptr = 0; - result += SectorsToCopy; - } - } - //When Rd < Wr, there are sectors in the buffer. - if (result < maxcount && rdptr < cdvdman_stat.StreamingData.StWritePtr) { - SectorsToCopy = cdvdman_stat.StreamingData.StWritePtr - rdptr; - if (SectorsToCopy > maxcount - result) - SectorsToCopy = maxcount - result; - if (SectorsToCopy > 0) { - dmat[dmat_count].src = cdvdman_stat.StreamingData.StIOP_bufaddr + rdptr * 2048; - dmat[dmat_count].dest = ptr; - dmat[dmat_count].size = SectorsToCopy * 2048; - dmat[dmat_count].attr = 0; - dmat_count++; - rdptr += SectorsToCopy; - if (rdptr >= cdvdman_stat.StreamingData.StBufmax) - rdptr = 0; - result += SectorsToCopy; - } - } - - if (dmat_count > 0) - while ((dmat_id = sceSifSetDma(dmat, dmat_count)) == 0) { - }; - - CpuResumeIntr(OldState); - - if (dmat_count > 0) //Only if there is data to copy - { - while (sceSifDmaStat(dmat_id) >= 0) { - }; - - //Finally, update variables. - CpuSuspendIntr(&OldState); - cdvdman_stat.StreamingData.StReadPtr = rdptr; - cdvdman_stat.StreamingData.StStreamed -= result; - CpuResumeIntr(OldState); - } - - return result; -} - -static int ReadSectors(int maxcount, void *buffer) -{ - int OldState, result; - unsigned short int SectorsToCopy; - void *ptr; - - // DPRINTF("ReadSectors: wr: %u, rd: %u, streamed: %u\n", cdvdman_stat.StreamingData.StWritePtr, cdvdman_stat.StreamingData.StReadPtr, cdvdman_stat.StreamingData.StStreamed); - - result = 0; - ptr = buffer; - CpuSuspendIntr(&OldState); - - //When Wr <= Rd, the buffer is either full or empty. Check StStreamed. - if (cdvdman_stat.StreamingData.StWritePtr <= cdvdman_stat.StreamingData.StReadPtr && cdvdman_stat.StreamingData.StStreamed > 0) { - SectorsToCopy = cdvdman_stat.StreamingData.StBufmax - cdvdman_stat.StreamingData.StReadPtr; - if (SectorsToCopy > maxcount) - SectorsToCopy = maxcount; - if (SectorsToCopy > 0) { - mips_memcpy(buffer, cdvdman_stat.StreamingData.StIOP_bufaddr + cdvdman_stat.StreamingData.StReadPtr * 2048, SectorsToCopy * 2048); - ptr += SectorsToCopy * 2048; - cdvdman_stat.StreamingData.StReadPtr += SectorsToCopy; - if (cdvdman_stat.StreamingData.StReadPtr >= cdvdman_stat.StreamingData.StBufmax) - cdvdman_stat.StreamingData.StReadPtr = 0; - cdvdman_stat.StreamingData.StStreamed -= SectorsToCopy; - result += SectorsToCopy; - } - } - //When Rd < Wr, there are sectors in the buffer. - if (result < maxcount && cdvdman_stat.StreamingData.StReadPtr < cdvdman_stat.StreamingData.StWritePtr) { - SectorsToCopy = cdvdman_stat.StreamingData.StWritePtr - cdvdman_stat.StreamingData.StReadPtr; - if (SectorsToCopy > maxcount - result) - SectorsToCopy = maxcount - result; - if (SectorsToCopy > 0) { - mips_memcpy(ptr, cdvdman_stat.StreamingData.StIOP_bufaddr + cdvdman_stat.StreamingData.StReadPtr * 2048, SectorsToCopy * 2048); - cdvdman_stat.StreamingData.StReadPtr += SectorsToCopy; - if (cdvdman_stat.StreamingData.StReadPtr >= cdvdman_stat.StreamingData.StBufmax) - cdvdman_stat.StreamingData.StReadPtr = 0; - cdvdman_stat.StreamingData.StStreamed -= SectorsToCopy; - result += SectorsToCopy; - } - } - - CpuResumeIntr(OldState); - - return result; -} - -int sceCdStStart(u32 lsn, cd_read_mode_t *mode) -{ - int OldState; - - DPRINTF("StStart called. lsn: 0x%08lx\n", lsn); - - sceCdStStop(); - - CpuSuspendIntr(&OldState); - - cdvdman_stat.StreamingData.Stlsn = lsn; - cdvdman_stat.StreamingData.StStat = 1; - StReset(); - SetStm0Callback(&StmCallback); - CpuResumeIntr(OldState); - - cdvdman_stat.err = CDVD_ERR_NO; - cdvdman_stat.status = CDVD_STAT_PAUSE; - StStartFillStreamBuffer(); - - return 1; -} - -int sceCdStStat(void) -{ - DPRINTF("StStat called: %u\n", cdvdman_stat.StreamingData.StStreamed); - cdvdman_stat.err = CDVD_ERR_NO; - return cdvdman_stat.StreamingData.StStreamed; -} - -int sceCdStStop(void) -{ - int OldState; - - DPRINTF("StStop called. Stat: 0x%x\n", cdvdman_stat.StreamingData.StStat); - - cdvdman_stat.err = CDVD_ERR_NO; - cdvdman_stat.status = CDVD_STAT_PAUSE; - if (cdvdman_stat.StreamingData.StStat) { - CancelAlarm(&StmScheduleCb, &cdvdman_stat.StreamingData); - - CpuSuspendIntr(&OldState); - - //Stop. - SetStm0Callback(NULL); - cdvdman_stat.StreamingData.StStreamed = 0; - cdvdman_stat.StreamingData.StStat = 0; - StReset(); - - CpuResumeIntr(OldState); - - sceCdSync(0); - } - - return 1; -} - -int sceCdStPause(void) -{ - int OldState; - - DPRINTF("StPause called. Stat: 0x%x\n", cdvdman_stat.StreamingData.StStat); - - cdvdman_stat.err = CDVD_ERR_NO; - cdvdman_stat.status = CDVD_STAT_PAUSE; - if (cdvdman_stat.StreamingData.StStat) { - CancelAlarm(&StmScheduleCb, &cdvdman_stat.StreamingData); - - CpuSuspendIntr(&OldState); - //Pause. - SetStm0Callback(NULL); - CpuResumeIntr(OldState); - - sceCdSync(0); - - return 1; - } else { - return 0; - } -} - -int sceCdStResume(void) -{ - int OldState; - - DPRINTF("StResume called. Stat: 0x%x\n", cdvdman_stat.StreamingData.StStat); - - cdvdman_stat.err = CDVD_ERR_NO; - cdvdman_stat.status = CDVD_STAT_PAUSE; - if (cdvdman_stat.StreamingData.StStat) { - CpuSuspendIntr(&OldState); - //Resume - SetStm0Callback(&StmCallback); - CpuResumeIntr(OldState); - - StStartFillStreamBuffer(); - - return 1; - } else { - return 0; - } -} - -int sceCdStSeek(u32 lsn) -{ - DPRINTF("StSeek: %lu\n", lsn); - - cdvdman_stat.err = CDVD_ERR_NO; - cdvdman_stat.status = CDVD_STAT_PAUSE; - if (cdvdman_stat.StreamingData.StStat) { - return sceCdStStart(lsn, NULL); - } else { - return 0; - } -} - -int sceCdStRead(u32 sectors, void *buffer, u32 mode, u32 *error) -{ - int SectorsRead, SectorsToRead, result; - void *ptr; - - DPRINTF("StRead called: sectors %lu:%p, mode: %lu, stat: %u,%u\n", sectors, buffer, mode, cdvdman_stat.StreamingData.StStat, cdvdman_stat.StreamingData.StIsReading); - - cdvdman_stat.err = CDVD_ERR_NO; - if (cdvdman_stat.StreamingData.StStat) { - SetEventFlag(cdvdman_stat.intr_ef, 8); - for (SectorsToRead = sectors, result = 0, SectorsRead = 0, ptr = (void *)((u32)buffer & ~0x80000000); result < sectors; SectorsToRead -= SectorsRead, ptr += SectorsRead * 2048) { - WaitEventFlag(cdvdman_stat.intr_ef, 8, WEF_AND, NULL); - ClearEventFlag(cdvdman_stat.intr_ef, ~8); - - // DPRINTF("Sectors: %u:%p, mode: %lu", SectorsToRead, ptr, mode); - if ((u32)buffer & 0x80000000) - SectorsRead = ReadSectorsEE(SectorsToRead, ptr); - else - SectorsRead = ReadSectors(SectorsToRead, ptr); - // DPRINTF(", Read: %u\n", SectorsRead); - - if (SectorsRead == 0) - DPRINTF("StRead: buffer underrun. %u/%lu read.\n", result, sectors); - - result += SectorsRead; - //if(mode == STMNBLK) break; - if (mode == 0) - break; - } - *error = sceCdGetError(); - - StStartFillStreamBuffer(); - } else { - result = 0; - } - - return result; -} +#include "smsutils.h" +#include "ioplib_util.h" +#include "cdvdman.h" +#include "cdvd_config.h" +#include "internal.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +extern cdvdman_status_t cdvdman_stat; + +static int AllocBank(void **pointer); +static int ReadSectors(int maxcount, void *buffer); +static int StFillStreamBuffer(void); +static void StStartFillStreamBuffer(void); + +static unsigned int StmScheduleCb(void *arg) +{ + return ((StFillStreamBuffer() >= 0) ? 0 : 0x00704000); +} + +static void StmCallback(void) +{ + int OldState; + + //Only update parameters if the streaming system was reading. Otherwise, this callback might have been triggered by the game reading data (BUG!) + if (cdvdman_stat.StreamingData.StIsReading) { + CpuSuspendIntr(&OldState); + cdvdman_stat.StreamingData.Stlsn += cdvdman_stat.StreamingData.StBanksize; + cdvdman_stat.StreamingData.StStreamed += cdvdman_stat.StreamingData.StBanksize; + cdvdman_stat.StreamingData.StWritePtr += cdvdman_stat.StreamingData.StBanksize; + if (cdvdman_stat.StreamingData.StWritePtr >= cdvdman_stat.StreamingData.StBufmax) + cdvdman_stat.StreamingData.StWritePtr = 0; + cdvdman_stat.StreamingData.StIsReading = 0; + CpuResumeIntr(OldState); + } + + DPRINTF("StmCallback: %08lx, wr: %u, rd: %u, streamed: %u\n", cdvdman_stat.StreamingData.Stlsn, cdvdman_stat.StreamingData.StWritePtr, cdvdman_stat.StreamingData.StReadPtr, cdvdman_stat.StreamingData.StStreamed); + + StStartFillStreamBuffer(); +} + +static void StReset(void) +{ + cdvdman_stat.StreamingData.StWritePtr = 0; + cdvdman_stat.StreamingData.StReadPtr = 0; + cdvdman_stat.StreamingData.StStreamed = 0; + cdvdman_stat.StreamingData.StIsReading = 0; +} + +// 0 = OK. <0 = error in sceCdRead. >0 = full buffer. +static int StFillStreamBuffer(void) +{ + int result, OldState; + void *ptr; + + /* NOTE: When this function is called by the timer callback (when a fill request is rescheduled), + this critical section here might not be protected properly because CpuSuspendIntr only prevents thread-switching (hardware interrupts are disabled differently). + SCEI used a similar design, but their implementation uses a bitmap to mark the filled/empty banks instead + (which is probably immune to race conditions, but we are interested in saving memory). + I don't think that there will be a problem because the important critical section (AllocBank) is probably far enough beneath this mechanism. + If deemed necessary, please replace the rescheduling mechanism with one that is thread-based. */ + CpuSuspendIntr(&OldState); + + if (cdvdman_stat.StreamingData.StIsReading) { + CpuResumeIntr(OldState); + return 0; + } + + CancelAlarm(&StmScheduleCb, &cdvdman_stat.StreamingData); + cdvdman_stat.StreamingData.StIsReading = 1; + + //Determine how much more to read. + result = AllocBank(&ptr); + + CpuResumeIntr(OldState); + + if (result == 0) { + // iDPRINTF("Stream fill buffer: Stream lsn 0x%08x - %u sectors:%p\n", cdvdman_stat.StreamingData.Stlsn, cdvdman_stat.StreamingData.StBanksize, ptr); + if (cdvdman_AsyncRead(cdvdman_stat.StreamingData.Stlsn, cdvdman_stat.StreamingData.StBanksize, ptr) == 0) { + //Failed to start reading. + cdvdman_stat.StreamingData.StIsReading = 0; + result = -1; + } else { + result = 0; + } + } else { + iDPRINTF("Stream fill buffer: Stream full.\n"); + //Nothing else to read. + cdvdman_stat.StreamingData.StIsReading = 0; + result = 1; + } + + return result; +} + +static void StStartFillStreamBuffer(void) +{ + iop_sys_clock_t StmScheduleClock; + + if (StFillStreamBuffer() < 0) { + DPRINTF("StmCallback: Rescheduling read.\n"); + StmScheduleClock.lo = 0x00704000; + StmScheduleClock.hi = 0; + SetAlarm(&StmScheduleClock, &StmScheduleCb, &cdvdman_stat.StreamingData); + } +} + +int sceCdStInit(u32 bufmax, u32 bankmax, void *iop_bufaddr) +{ + int OldState; + + cdvdman_stat.err = CDVD_ERR_NO; + + CancelAlarm(&StmScheduleCb, &cdvdman_stat.StreamingData); + + CpuSuspendIntr(&OldState); + cdvdman_stat.StreamingData.StBankmax = bankmax; + cdvdman_stat.StreamingData.StBanksize = bufmax / bankmax; + cdvdman_stat.StreamingData.StBufmax = cdvdman_stat.StreamingData.StBanksize * cdvdman_stat.StreamingData.StBankmax; + cdvdman_stat.StreamingData.StIOP_bufaddr = iop_bufaddr; + StReset(); + + CpuResumeIntr(OldState); + + DPRINTF("sceCdStInit bufmax: %u (%lu), bankmax: %lu, banksize: %u, buffer: %p\n", cdvdman_stat.StreamingData.StBufmax, bufmax, bankmax, cdvdman_stat.StreamingData.StBanksize, iop_bufaddr); + + return 1; +} + +//Must be called from an interrupt-disabled state. +static int AllocBank(void **pointer) +{ + int result; + + if (cdvdman_stat.StreamingData.StBufmax - cdvdman_stat.StreamingData.StStreamed >= cdvdman_stat.StreamingData.StBanksize) { + *pointer = cdvdman_stat.StreamingData.StIOP_bufaddr + cdvdman_stat.StreamingData.StWritePtr * 2048; + result = 0; + } else { + *pointer = NULL; + result = -ENOMEM; + } + + // iDPRINTF("AllocBank: wrptr: %u, rdptr: %u, streamed: %u\n", cdvdman_stat.StreamingData.StWritePtr, cdvdman_stat.StreamingData.StReadPtr, cdvdman_stat.StreamingData.StStreamed); + + return result; +} + +static int ReadSectorsEE(int maxcount, void *buffer) +{ + int OldState, result, dmat_id, dmat_count; + unsigned short int SectorsToCopy, rdptr; + SifDmaTransfer_t dmat[2]; + void *ptr; + + // DPRINTF("ReadSectors EE: wr: %u, rd: %u, streamed: %u\n", cdvdman_stat.StreamingData.StWritePtr, cdvdman_stat.StreamingData.StReadPtr, cdvdman_stat.StreamingData.StStreamed); + + result = 0; + ptr = buffer; + dmat_count = 0; + dmat_id = 0; + + CpuSuspendIntr(&OldState); + rdptr = cdvdman_stat.StreamingData.StReadPtr; + + //When Wr <= Rd, the buffer is either full or empty. Check StStreamed. + if (cdvdman_stat.StreamingData.StWritePtr <= rdptr && cdvdman_stat.StreamingData.StStreamed > 0) { + SectorsToCopy = cdvdman_stat.StreamingData.StBufmax - rdptr; + if (SectorsToCopy > maxcount) + SectorsToCopy = maxcount; + if (SectorsToCopy > 0) { + dmat[0].src = cdvdman_stat.StreamingData.StIOP_bufaddr + rdptr * 2048; + dmat[0].dest = buffer; + dmat[0].size = SectorsToCopy * 2048; + dmat[0].attr = 0; + dmat_count = 1; + ptr += SectorsToCopy * 2048; + rdptr += SectorsToCopy; + if (rdptr >= cdvdman_stat.StreamingData.StBufmax) + rdptr = 0; + result += SectorsToCopy; + } + } + //When Rd < Wr, there are sectors in the buffer. + if (result < maxcount && rdptr < cdvdman_stat.StreamingData.StWritePtr) { + SectorsToCopy = cdvdman_stat.StreamingData.StWritePtr - rdptr; + if (SectorsToCopy > maxcount - result) + SectorsToCopy = maxcount - result; + if (SectorsToCopy > 0) { + dmat[dmat_count].src = cdvdman_stat.StreamingData.StIOP_bufaddr + rdptr * 2048; + dmat[dmat_count].dest = ptr; + dmat[dmat_count].size = SectorsToCopy * 2048; + dmat[dmat_count].attr = 0; + dmat_count++; + rdptr += SectorsToCopy; + if (rdptr >= cdvdman_stat.StreamingData.StBufmax) + rdptr = 0; + result += SectorsToCopy; + } + } + + if (dmat_count > 0) + while ((dmat_id = sceSifSetDma(dmat, dmat_count)) == 0) { + }; + + CpuResumeIntr(OldState); + + if (dmat_count > 0) //Only if there is data to copy + { + while (sceSifDmaStat(dmat_id) >= 0) { + }; + + //Finally, update variables. + CpuSuspendIntr(&OldState); + cdvdman_stat.StreamingData.StReadPtr = rdptr; + cdvdman_stat.StreamingData.StStreamed -= result; + CpuResumeIntr(OldState); + } + + return result; +} + +static int ReadSectors(int maxcount, void *buffer) +{ + int OldState, result; + unsigned short int SectorsToCopy; + void *ptr; + + // DPRINTF("ReadSectors: wr: %u, rd: %u, streamed: %u\n", cdvdman_stat.StreamingData.StWritePtr, cdvdman_stat.StreamingData.StReadPtr, cdvdman_stat.StreamingData.StStreamed); + + result = 0; + ptr = buffer; + CpuSuspendIntr(&OldState); + + //When Wr <= Rd, the buffer is either full or empty. Check StStreamed. + if (cdvdman_stat.StreamingData.StWritePtr <= cdvdman_stat.StreamingData.StReadPtr && cdvdman_stat.StreamingData.StStreamed > 0) { + SectorsToCopy = cdvdman_stat.StreamingData.StBufmax - cdvdman_stat.StreamingData.StReadPtr; + if (SectorsToCopy > maxcount) + SectorsToCopy = maxcount; + if (SectorsToCopy > 0) { + mips_memcpy(buffer, cdvdman_stat.StreamingData.StIOP_bufaddr + cdvdman_stat.StreamingData.StReadPtr * 2048, SectorsToCopy * 2048); + ptr += SectorsToCopy * 2048; + cdvdman_stat.StreamingData.StReadPtr += SectorsToCopy; + if (cdvdman_stat.StreamingData.StReadPtr >= cdvdman_stat.StreamingData.StBufmax) + cdvdman_stat.StreamingData.StReadPtr = 0; + cdvdman_stat.StreamingData.StStreamed -= SectorsToCopy; + result += SectorsToCopy; + } + } + //When Rd < Wr, there are sectors in the buffer. + if (result < maxcount && cdvdman_stat.StreamingData.StReadPtr < cdvdman_stat.StreamingData.StWritePtr) { + SectorsToCopy = cdvdman_stat.StreamingData.StWritePtr - cdvdman_stat.StreamingData.StReadPtr; + if (SectorsToCopy > maxcount - result) + SectorsToCopy = maxcount - result; + if (SectorsToCopy > 0) { + mips_memcpy(ptr, cdvdman_stat.StreamingData.StIOP_bufaddr + cdvdman_stat.StreamingData.StReadPtr * 2048, SectorsToCopy * 2048); + cdvdman_stat.StreamingData.StReadPtr += SectorsToCopy; + if (cdvdman_stat.StreamingData.StReadPtr >= cdvdman_stat.StreamingData.StBufmax) + cdvdman_stat.StreamingData.StReadPtr = 0; + cdvdman_stat.StreamingData.StStreamed -= SectorsToCopy; + result += SectorsToCopy; + } + } + + CpuResumeIntr(OldState); + + return result; +} + +int sceCdStStart(u32 lsn, cd_read_mode_t *mode) +{ + int OldState; + + DPRINTF("StStart called. lsn: 0x%08lx\n", lsn); + + sceCdStStop(); + + CpuSuspendIntr(&OldState); + + cdvdman_stat.StreamingData.Stlsn = lsn; + cdvdman_stat.StreamingData.StStat = 1; + StReset(); + SetStm0Callback(&StmCallback); + CpuResumeIntr(OldState); + + cdvdman_stat.err = CDVD_ERR_NO; + cdvdman_stat.status = CDVD_STAT_PAUSE; + StStartFillStreamBuffer(); + + return 1; +} + +int sceCdStStat(void) +{ + DPRINTF("StStat called: %u\n", cdvdman_stat.StreamingData.StStreamed); + cdvdman_stat.err = CDVD_ERR_NO; + return cdvdman_stat.StreamingData.StStreamed; +} + +int sceCdStStop(void) +{ + int OldState; + + DPRINTF("StStop called. Stat: 0x%x\n", cdvdman_stat.StreamingData.StStat); + + cdvdman_stat.err = CDVD_ERR_NO; + cdvdman_stat.status = CDVD_STAT_PAUSE; + if (cdvdman_stat.StreamingData.StStat) { + CancelAlarm(&StmScheduleCb, &cdvdman_stat.StreamingData); + + CpuSuspendIntr(&OldState); + + //Stop. + SetStm0Callback(NULL); + cdvdman_stat.StreamingData.StStreamed = 0; + cdvdman_stat.StreamingData.StStat = 0; + StReset(); + + CpuResumeIntr(OldState); + + sceCdSync(0); + } + + return 1; +} + +int sceCdStPause(void) +{ + int OldState; + + DPRINTF("StPause called. Stat: 0x%x\n", cdvdman_stat.StreamingData.StStat); + + cdvdman_stat.err = CDVD_ERR_NO; + cdvdman_stat.status = CDVD_STAT_PAUSE; + if (cdvdman_stat.StreamingData.StStat) { + CancelAlarm(&StmScheduleCb, &cdvdman_stat.StreamingData); + + CpuSuspendIntr(&OldState); + //Pause. + SetStm0Callback(NULL); + CpuResumeIntr(OldState); + + sceCdSync(0); + + return 1; + } else { + return 0; + } +} + +int sceCdStResume(void) +{ + int OldState; + + DPRINTF("StResume called. Stat: 0x%x\n", cdvdman_stat.StreamingData.StStat); + + cdvdman_stat.err = CDVD_ERR_NO; + cdvdman_stat.status = CDVD_STAT_PAUSE; + if (cdvdman_stat.StreamingData.StStat) { + CpuSuspendIntr(&OldState); + //Resume + SetStm0Callback(&StmCallback); + CpuResumeIntr(OldState); + + StStartFillStreamBuffer(); + + return 1; + } else { + return 0; + } +} + +int sceCdStSeek(u32 lsn) +{ + DPRINTF("StSeek: %lu\n", lsn); + + cdvdman_stat.err = CDVD_ERR_NO; + cdvdman_stat.status = CDVD_STAT_PAUSE; + if (cdvdman_stat.StreamingData.StStat) { + return sceCdStStart(lsn, NULL); + } else { + return 0; + } +} + +int sceCdStRead(u32 sectors, void *buffer, u32 mode, u32 *error) +{ + int SectorsRead, SectorsToRead, result; + void *ptr; + + DPRINTF("StRead called: sectors %lu:%p, mode: %lu, stat: %u,%u\n", sectors, buffer, mode, cdvdman_stat.StreamingData.StStat, cdvdman_stat.StreamingData.StIsReading); + + cdvdman_stat.err = CDVD_ERR_NO; + if (cdvdman_stat.StreamingData.StStat) { + SetEventFlag(cdvdman_stat.intr_ef, 8); + for (SectorsToRead = sectors, result = 0, SectorsRead = 0, ptr = (void *)((u32)buffer & ~0x80000000); result < sectors; SectorsToRead -= SectorsRead, ptr += SectorsRead * 2048) { + WaitEventFlag(cdvdman_stat.intr_ef, 8, WEF_AND, NULL); + ClearEventFlag(cdvdman_stat.intr_ef, ~8); + + // DPRINTF("Sectors: %u:%p, mode: %lu", SectorsToRead, ptr, mode); + if ((u32)buffer & 0x80000000) + SectorsRead = ReadSectorsEE(SectorsToRead, ptr); + else + SectorsRead = ReadSectors(SectorsToRead, ptr); + // DPRINTF(", Read: %u\n", SectorsRead); + + if (SectorsRead == 0) + DPRINTF("StRead: buffer underrun. %u/%lu read.\n", result, sectors); + + result += SectorsRead; + //if(mode == STMNBLK) break; + if (mode == 0) + break; + } + *error = sceCdGetError(); + + StStartFillStreamBuffer(); + } else { + result = 0; + } + + return result; +} diff --git a/modules/iopcore/udnl-t300/udnl_asm.s b/modules/iopcore/udnl-t300/udnl_asm.s index 194c093e6..df7fbb79a 100644 --- a/modules/iopcore/udnl-t300/udnl_asm.s +++ b/modules/iopcore/udnl-t300/udnl_asm.s @@ -1,179 +1,179 @@ -.set noat -.set noreorder - -.text - -.globl CpuExecuteKmode -.ent CpuExecuteKmode -CpuExecuteKmode: - li $v0, 0x0C - syscall - jr $ra - nop -.end CpuExecuteKmode - -.globl func_00001b38 -.ent func_00001b38 -func_00001b38: - mfc0 $t0, $12 - nop - la $t4, func_00001b38_main - lui $at, 0xA000 - or $t4, $t4, $at - jr $t4 - mtc0 $zero, $12 -func_00001b38_main: - nop - lui $at, 0xFFFE - sw $a0, 0x0130($at) - lui $at, 0xFFFE - lw $zero, 0x0130($at) - nop - mtc0 $t0, $12 - nop - jr $ra - nop -.end func_00001b38 - -.globl func_00001930 -.ent func_00001930 -func_00001930: - mfc0 $t0, $12 - nop - la $t4, func_00001930_main - lui $at, 0xA000 - or $t4, $t4, $at - jr $t4 -func_00001930_main: - mtc0 $zero, $12 - nop - nop - lui $t6, 0xbf80 - lw $t6, 0x1450($t6) - nop - addiu $t7, $zero, 0xfffe - and $t1, $t6, $t7 - lui $at, 0xbf80 - sw $t1, 0x1450($at) - lui $at, 0xbf80 - lw $zero, 0x1450($at) - lui $t7, 0xbf80 - lw $t7, 0x1578($t7) - lui $at, 0xbf80 - sw $zero, 0x1578($at) - lui $at, 0xbf80 - lw $zero, 0x1578($at) - lui $t5, 0xfffe - lw $t5, 0x0130($t5) - addiu $t1, $zero, 0x0c04 - lui $at, 0xfffe - sw $t1, 0x0130($at) - lui $t4, 0x0001 - mtc0 $t4, $12 - nop - nop - addiu $t2, $zero, 0x0000 - addiu $t3, $zero, 0x0f80 -func_00001930_loop: - sw $zero, 0x0000($t2) - sw $zero, 0x0010($t2) - sw $zero, 0x0020($t2) - sw $zero, 0x0030($t2) - sw $zero, 0x0040($t2) - sw $zero, 0x0050($t2) - sw $zero, 0x0060($t2) - sw $zero, 0x0070($t2) - bne $t2, $t3, func_00001930_loop - addi $t2, $t2, 0x0080 - mtc0 $zero, $12 - nop - lui $at, 0xfffe - sw $t5, 0x0130($at) - lui $at, 0xfffe - lw $zero, 0x0130($at) - nop - lui $at, 0xbf80 - sw $t7, 0x1578($at) - lui $at, 0xbf80 - lw $zero, 0x1578($at) - lui $at, 0xbf80 - sw $t6, 0x1450($at) - lui $at, 0xbf80 - lw $zero, 0x1450($at) - mtc0 $t0, $12 - nop - jr $ra - nop -.end func_00001930 - -#Note: This doesn't seem to be used. -#.globl func_00001a34 -#.ent func_00001a34 -#func_00001a34: -# mfc0 $t0, $12 -# nop -# la $t4, func_00001a34_main -# lui $at, 0xa000 -# or $t4, $t4, $at -# jr $t4 -#func_00001a34_main: -# mtc0 $zero, $12 -# nop -# nop -# lui $t6, 0xbf80 -# lw $t6, 0x1450($t6) -# nop -# addiu $t7, $zero, 0xfffe -# and $t1, $t6, $t7 -# lui $at, 0xbf80 -# sw $t1, 0x1450($at) -# lui $at, 0xbf80 -# lw $zero, 0x1450($at) -# lui $t7, 0xbf80 -# lw $t7, 0x1578($t7) -# lui $at, 0xbf80 -# sw $zero, 0x1578($at) -# lui $at, 0xbf80 -# lw $zero, 0x1578($at) -# lui $t5, 0xfffe -# lw $t5, 0x0130($t5) -# addiu $t1, $zero, 0x00c4 -# lui $at, 0xfffe -# sw $t1, 0x0130($at) -# lui $t4, 0x0001 -# mtc0 $t4, $12 -# nop -# nop -# addiu $t2, $zero, 0x0000 -# addiu $t3, $zero, 0x0380 -#func_00001a34_loop: -# sw $zero, 0x0000($t2) -# sw $zero, 0x0010($t2) -# sw $zero, 0x0020($t2) -# sw $zero, 0x0030($t2) -# sw $zero, 0x0040($t2) -# sw $zero, 0x0050($t2) -# sw $zero, 0x0060($t2) -# sw $zero, 0x0070($t2) -# bne $t2, $t3, func_00001a34_loop -# addi $t2, $t2, 0x0080 -# mtc0 $zero, $12 -# nop -# lui $at, 0xfffe -# sw $t5, 0x0130($at) -# lui $at, 0xfffe -# lw $zero, 0x0130($at) -# nop -# lui $at, 0xbf80 -# sw $t7, 0x1578($at) -# lui $at, 0xbf80 -# lw $zero, 0x1578($at) -# lui $at, 0xbf80 -# sw $t6, 0x1450($at) -# lui $at, 0xbf80 -# lw $zero, 0x1450($at) -# mtc0 $t0, $12 -# nop -# jr $ra -# nop -#.end func_00001a34 +.set noat +.set noreorder + +.text + +.globl CpuExecuteKmode +.ent CpuExecuteKmode +CpuExecuteKmode: + li $v0, 0x0C + syscall + jr $ra + nop +.end CpuExecuteKmode + +.globl func_00001b38 +.ent func_00001b38 +func_00001b38: + mfc0 $t0, $12 + nop + la $t4, func_00001b38_main + lui $at, 0xA000 + or $t4, $t4, $at + jr $t4 + mtc0 $zero, $12 +func_00001b38_main: + nop + lui $at, 0xFFFE + sw $a0, 0x0130($at) + lui $at, 0xFFFE + lw $zero, 0x0130($at) + nop + mtc0 $t0, $12 + nop + jr $ra + nop +.end func_00001b38 + +.globl func_00001930 +.ent func_00001930 +func_00001930: + mfc0 $t0, $12 + nop + la $t4, func_00001930_main + lui $at, 0xA000 + or $t4, $t4, $at + jr $t4 +func_00001930_main: + mtc0 $zero, $12 + nop + nop + lui $t6, 0xbf80 + lw $t6, 0x1450($t6) + nop + addiu $t7, $zero, 0xfffe + and $t1, $t6, $t7 + lui $at, 0xbf80 + sw $t1, 0x1450($at) + lui $at, 0xbf80 + lw $zero, 0x1450($at) + lui $t7, 0xbf80 + lw $t7, 0x1578($t7) + lui $at, 0xbf80 + sw $zero, 0x1578($at) + lui $at, 0xbf80 + lw $zero, 0x1578($at) + lui $t5, 0xfffe + lw $t5, 0x0130($t5) + addiu $t1, $zero, 0x0c04 + lui $at, 0xfffe + sw $t1, 0x0130($at) + lui $t4, 0x0001 + mtc0 $t4, $12 + nop + nop + addiu $t2, $zero, 0x0000 + addiu $t3, $zero, 0x0f80 +func_00001930_loop: + sw $zero, 0x0000($t2) + sw $zero, 0x0010($t2) + sw $zero, 0x0020($t2) + sw $zero, 0x0030($t2) + sw $zero, 0x0040($t2) + sw $zero, 0x0050($t2) + sw $zero, 0x0060($t2) + sw $zero, 0x0070($t2) + bne $t2, $t3, func_00001930_loop + addi $t2, $t2, 0x0080 + mtc0 $zero, $12 + nop + lui $at, 0xfffe + sw $t5, 0x0130($at) + lui $at, 0xfffe + lw $zero, 0x0130($at) + nop + lui $at, 0xbf80 + sw $t7, 0x1578($at) + lui $at, 0xbf80 + lw $zero, 0x1578($at) + lui $at, 0xbf80 + sw $t6, 0x1450($at) + lui $at, 0xbf80 + lw $zero, 0x1450($at) + mtc0 $t0, $12 + nop + jr $ra + nop +.end func_00001930 + +#Note: This doesn't seem to be used. +#.globl func_00001a34 +#.ent func_00001a34 +#func_00001a34: +# mfc0 $t0, $12 +# nop +# la $t4, func_00001a34_main +# lui $at, 0xa000 +# or $t4, $t4, $at +# jr $t4 +#func_00001a34_main: +# mtc0 $zero, $12 +# nop +# nop +# lui $t6, 0xbf80 +# lw $t6, 0x1450($t6) +# nop +# addiu $t7, $zero, 0xfffe +# and $t1, $t6, $t7 +# lui $at, 0xbf80 +# sw $t1, 0x1450($at) +# lui $at, 0xbf80 +# lw $zero, 0x1450($at) +# lui $t7, 0xbf80 +# lw $t7, 0x1578($t7) +# lui $at, 0xbf80 +# sw $zero, 0x1578($at) +# lui $at, 0xbf80 +# lw $zero, 0x1578($at) +# lui $t5, 0xfffe +# lw $t5, 0x0130($t5) +# addiu $t1, $zero, 0x00c4 +# lui $at, 0xfffe +# sw $t1, 0x0130($at) +# lui $t4, 0x0001 +# mtc0 $t4, $12 +# nop +# nop +# addiu $t2, $zero, 0x0000 +# addiu $t3, $zero, 0x0380 +#func_00001a34_loop: +# sw $zero, 0x0000($t2) +# sw $zero, 0x0010($t2) +# sw $zero, 0x0020($t2) +# sw $zero, 0x0030($t2) +# sw $zero, 0x0040($t2) +# sw $zero, 0x0050($t2) +# sw $zero, 0x0060($t2) +# sw $zero, 0x0070($t2) +# bne $t2, $t3, func_00001a34_loop +# addi $t2, $t2, 0x0080 +# mtc0 $zero, $12 +# nop +# lui $at, 0xfffe +# sw $t5, 0x0130($at) +# lui $at, 0xfffe +# lw $zero, 0x0130($at) +# nop +# lui $at, 0xbf80 +# sw $t7, 0x1578($at) +# lui $at, 0xbf80 +# lw $zero, 0x1578($at) +# lui $at, 0xbf80 +# sw $t6, 0x1450($at) +# lui $at, 0xbf80 +# lw $zero, 0x1450($at) +# mtc0 $t0, $12 +# nop +# jr $ra +# nop +#.end func_00001a34 diff --git a/modules/mcemu/mcemu.c b/modules/mcemu/mcemu.c index f4c5741f7..7241d3cca 100644 --- a/modules/mcemu/mcemu.c +++ b/modules/mcemu/mcemu.c @@ -10,7 +10,14 @@ static int readyToGo = -1; void StartNow(void *param); +#ifdef PADEMU +void(pademu_hookSio2man *)(Sio2Packet *sd, Sio2McProc sio2proc); +void no_pademu(Sio2Packet *sd, Sio2McProc sio2proc) +{ + sioproc(sd); +} +#endif //--------------------------------------------------------------------------- // Entry point @@ -79,6 +86,15 @@ void StartNow(void *param) DPRINTF("SECRMAN exports not found.\n"); } +#ifdef PADEMU + exp = GetExportTable("pademu", 0x101); + if (exp != NULL) { + pademu_hookSio2man = GetExportEntry(exp, 0); + } else { + pademu_hookSio2man = no_pademu; + } +#endif + readyToGo = MODULE_RESIDENT_END; } //------------------------------ @@ -291,8 +307,12 @@ void hookSio2man(Sio2Packet *sd, Sio2McProc sio2proc) sio2proc = Sio2McEmu; } - /* calling original SIO2MAN routine */ +/* calling original SIO2MAN routine */ +#ifdef PADEMU + pademu_hookSio2man(sd, sio2proc); +#else sio2proc(sd); +#endif } //------------------------------ //endfunc diff --git a/modules/network/httpclient/Makefile b/modules/network/httpclient/Makefile index 43e6ff356..be540c317 100755 --- a/modules/network/httpclient/Makefile +++ b/modules/network/httpclient/Makefile @@ -1,14 +1,14 @@ -IOP_BIN = httpclient.irx -IOP_OBJS = main.o httpclient.o imports.o exports.o - -IOP_INCS += -I../common -IOP_CFLAGS += -Wall -fno-builtin -D_IOP -mno-gpopt -G0 -IOP_LDFLAGS += -s - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) - -include $(PS2SDK)/Defs.make -include ../../Rules.make +IOP_BIN = httpclient.irx +IOP_OBJS = main.o httpclient.o imports.o exports.o + +IOP_INCS += -I../common +IOP_CFLAGS += -Wall -fno-builtin -D_IOP -mno-gpopt -G0 +IOP_LDFLAGS += -s + +all: $(IOP_BIN) + +clean: + rm -f $(IOP_BIN) $(IOP_OBJS) + +include $(PS2SDK)/Defs.make +include ../../Rules.make diff --git a/modules/network/httpclient/exports.tab b/modules/network/httpclient/exports.tab index 1f62eae27..ab5b47d66 100755 --- a/modules/network/httpclient/exports.tab +++ b/modules/network/httpclient/exports.tab @@ -1,11 +1,11 @@ -void _funcret(){}; - -DECLARE_EXPORT_TABLE(httpc, 1, 1) - DECLARE_EXPORT(_start) - DECLARE_EXPORT(_exit) - DECLARE_EXPORT(_funcret) - DECLARE_EXPORT(_funcret) - DECLARE_EXPORT(HttpEstabConnection) - DECLARE_EXPORT(HttpCloseConnection) - DECLARE_EXPORT(HttpSendGetRequest) -END_EXPORT_TABLE +void _funcret(){}; + +DECLARE_EXPORT_TABLE(httpc, 1, 1) + DECLARE_EXPORT(_start) + DECLARE_EXPORT(_exit) + DECLARE_EXPORT(_funcret) + DECLARE_EXPORT(_funcret) + DECLARE_EXPORT(HttpEstabConnection) + DECLARE_EXPORT(HttpCloseConnection) + DECLARE_EXPORT(HttpSendGetRequest) +END_EXPORT_TABLE diff --git a/modules/network/httpclient/httpclient.c b/modules/network/httpclient/httpclient.c index 104986152..fdf85e538 100644 --- a/modules/network/httpclient/httpclient.c +++ b/modules/network/httpclient/httpclient.c @@ -1,292 +1,292 @@ -/* Simple HTTP client for retrieving files. - Support for the "chunked" encoding has not been implemented. */ - -#include -#include -#include -#include - -#include "httpclient.h" - -void HttpCloseConnection(s32 HttpSocket) -{ - shutdown(HttpSocket, SHUT_RDWR); - closesocket(HttpSocket); -} - -static int EstablishConnection(struct in_addr *server, unsigned short int port) -{ - struct sockaddr_in SockAddr; - int HostSocket; - - HostSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - - SockAddr.sin_family = AF_INET; - SockAddr.sin_addr.s_addr = server->s_addr; - SockAddr.sin_port = htons(port); - if (connect(HostSocket, (struct sockaddr *)&SockAddr, sizeof(SockAddr)) != 0) { - HttpCloseConnection(HostSocket); - HostSocket = -1; - } - - return HostSocket; -} - -static int SendData(int socket, char *buffer, int length) -{ - char *pointer; - int remaining, result; - - for (remaining = length, pointer = buffer; remaining > 0; remaining -= result, pointer += result) { - if ((result = send(socket, pointer, remaining, 0)) < 1) - break; - } - - return length - remaining; -} - -static int GetData(int socket, char *buffer, int length) -{ - struct timeval timeout; - fd_set readfds; - char *pointer; - int remaining, ToRead, result; - - for (remaining = length, pointer = buffer; remaining > 0;) { - ToRead = remaining; - - //This safeguards against a deadlock, if the TCP connection gets broken for long enough. Long enough for the RST packet from the other side gets lost. - timeout.tv_sec = 10; - timeout.tv_usec = 0; - FD_ZERO(&readfds); - FD_SET(socket, &readfds); - if (select(socket + 1, &readfds, NULL, NULL, &timeout) <= 0) { - result = -EPIPE; - break; - } - - if ((result = recv(socket, pointer, ToRead, 0)) < 1) - break; - remaining -= result; - pointer += result; - if (result != ToRead) //No further data at the moment. - break; - } - - return length - remaining; -} - -#define HTTP_WORK_BUFFER_SIZE 256 //Not a really great design, but this must be long enough for the longest line in the HTTP entity. - -enum TRANFER_ENCODING { - TRANFER_ENCODING_PLAIN, - TRANFER_ENCODING_CHUNKED -}; - -static int ContentLength; -static short int StatusCode; -static unsigned short int HeaderLineNumber; -//static char TransferEncoding; -static char ConnectionMode; - -static void HttpParseEntityLine(const char *line) -{ - char *pColon; - - if ((pColon = strchr(line, ':')) != NULL) { - for (pColon++; *pColon != '\0'; pColon++) { - if (look_ctype_table(*pColon) & 2) - *pColon = tolower(*pColon); - } - } - - //printf("%u\t%s\n", HeaderLineNumber, line); - - if (HeaderLineNumber == 0 && strncmp(line, "HTTP/1.1 ", 9) == 0) - StatusCode = strtoul(line + 9, NULL, 10); - - if (strncmp(line, "Content-Length: ", 16) == 0) - ContentLength = strtoul(line + 15, NULL, 10); - /* if(strncmp(line, "Transfer-Encoding: ", 19) == 0) - { - ContentLength = -1; - if(strcmp(line + 19, "chunked") == 0) - TransferEncoding = TRANFER_ENCODING_CHUNKED; - } */ - if (strcmp(line, "Connection: close") == 0) - ConnectionMode = HTTP_CMODE_CLOSED; - - HeaderLineNumber++; -} - -static int HttpGetResponse(s32 socket, s8 *mode, s8 *buffer, u16 *length) -{ - char work[HTTP_WORK_BUFFER_SIZE + 1], EndOfEntity, *ptr, *next_ptr, *PayloadPtr; - int result, DataAvailable, PayloadAmount; - - //TransferEncoding = TRANFER_ENCODING_PLAIN; - ConnectionMode = *mode; - ContentLength = -1; - StatusCode = -1; - HeaderLineNumber = 0; - PayloadPtr = buffer; - PayloadAmount = 0; - EndOfEntity = 0; - ptr = work; - DataAvailable = 0; - work[HTTP_WORK_BUFFER_SIZE] = '\0'; - do { - if ((result = GetData(socket, ptr, HTTP_WORK_BUFFER_SIZE - DataAvailable)) > 0) { - DataAvailable += result; - ptr = work; - while ((next_ptr = strstr(ptr, "\r\n")) != NULL) { - *next_ptr = '\0'; - //Parse line - HttpParseEntityLine(ptr); - DataAvailable -= (next_ptr + 2 - ptr); - ptr = next_ptr + 2; //skip CRLN - if (strncmp(ptr, "\r\n", 2) == 0) { - EndOfEntity = 1; - DataAvailable -= 2; - ptr += 2; - break; - } - } - - //At this point, the final line (preceding NULL terminator) has been reached. Move any outstanding characters to the start of the buffer. - if (!EndOfEntity) { - if (DataAvailable > 0) { - memmove(work, ptr, DataAvailable); - work[DataAvailable] = '\0'; - ptr = &work[DataAvailable]; - } else - ptr = work; - } - } else { - //No more data. Connection lost? - // printf("DEBUG: connection lost?\n"); - break; - } - } while (!EndOfEntity); - - //Receive data normally (plain). - if (DataAvailable > 0) //Move leftover data into the output buffer. - { - memcpy(buffer, ptr, DataAvailable); - buffer[DataAvailable] = '\0'; - PayloadPtr = buffer + DataAvailable; - PayloadAmount = DataAvailable; - } - - if (ContentLength < 0 || PayloadAmount < ContentLength) { - if (ContentLength > *length) - ContentLength = *length; - if ((result = GetData(socket, PayloadPtr, ContentLength - PayloadAmount)) > 0) - *length = PayloadAmount + result; - else - *length = PayloadAmount; - } else - *length = PayloadAmount; - - result = StatusCode; - if (ContentLength > 0 && ContentLength > *length) { - result = -EPIPE; //Incomplete transfer. - //printf("Pipe broken: %d/%d\n", *length, ContentLength); - } - - *mode = ConnectionMode; - - return result; -} - -static int ResolveHostname(char *hostname, struct in_addr *ip) -{ - struct hostent *HostEntry; - struct in_addr **addr_list; - - if ((HostEntry = gethostbyname(hostname)) == NULL) - return 1; - - for (addr_list = (struct in_addr **)HostEntry->h_addr_list; addr_list != NULL; addr_list++) { - ip->s_addr = (*addr_list)->s_addr; - return 0; - } - - return 1; -} - -int HttpEstabConnection(s8 *server, u16 port) -{ - struct in_addr ip; - int result; - - if (ResolveHostname(server, &ip) == 0) { - result = EstablishConnection(&ip, port); - } else { - result = -ENXIO; - } - - return result; -} - -static const char *GetDayInWeek(const unsigned char *mtime) -{ - static const unsigned char daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - static const char *dayLabels[7] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; - unsigned short int DaysInYear; - unsigned char LeapDays, month; - unsigned int days; - - LeapDays = mtime[0] / 4; //Number of leap days, in the years elasped. - for (month = 0, DaysInYear = 0; month < mtime[1]; DaysInYear += daysInMonth[month], month++) - ; //Number of days, within the months elasped within the past year. - if (mtime[0] % 4 == 0) { - if (mtime[1] > 1) - DaysInYear++; //Account for this year's leap day, if applicable. - } else - LeapDays++; //Account for the leap day, of the leap year that just passed. - days = mtime[0] * 365 + LeapDays + DaysInYear + mtime[2]; - - return dayLabels[(5 + days) % 7]; //2000/1/1 was a Saturday (5). -} - -int HttpSendGetRequest(s32 HttpSocket, const s8 *UserAgent, const s8 *host, s8 *mode, const u8 *mtime, const s8 *uri, u8 *output, u16 *out_len) -{ - const char *months[] = { - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec"}; - char buffer[512]; - int result, length; - - sprintf(buffer, "GET %s HTTP/1.1\r\n" - "Accept: text/html, */*\r\n" - "User-Agent: %s\r\n" - "Host: %s\r\n", - uri, UserAgent, host); - - if (*mode == HTTP_CMODE_PERSISTENT) - strcat(buffer, "Proxy-Connection: Keep-Alive\r\n"); - if (mtime != NULL) - sprintf(&buffer[strlen(buffer)], "If-Modified-Since: %s, %02u %s %04u %02u:%02u:%02u GMT\r\n", GetDayInWeek(mtime), mtime[2] + 1, months[mtime[1]], 2000 + mtime[0], mtime[3], mtime[4], mtime[5]); - strcat(buffer, "\r\n"); - - length = strlen(buffer); - - if (SendData(HttpSocket, buffer, length) == length) { - result = HttpGetResponse(HttpSocket, mode, output, out_len); - } else { - result = -1; - } - - return result; -} +/* Simple HTTP client for retrieving files. + Support for the "chunked" encoding has not been implemented. */ + +#include +#include +#include +#include + +#include "httpclient.h" + +void HttpCloseConnection(s32 HttpSocket) +{ + shutdown(HttpSocket, SHUT_RDWR); + closesocket(HttpSocket); +} + +static int EstablishConnection(struct in_addr *server, unsigned short int port) +{ + struct sockaddr_in SockAddr; + int HostSocket; + + HostSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + + SockAddr.sin_family = AF_INET; + SockAddr.sin_addr.s_addr = server->s_addr; + SockAddr.sin_port = htons(port); + if (connect(HostSocket, (struct sockaddr *)&SockAddr, sizeof(SockAddr)) != 0) { + HttpCloseConnection(HostSocket); + HostSocket = -1; + } + + return HostSocket; +} + +static int SendData(int socket, char *buffer, int length) +{ + char *pointer; + int remaining, result; + + for (remaining = length, pointer = buffer; remaining > 0; remaining -= result, pointer += result) { + if ((result = send(socket, pointer, remaining, 0)) < 1) + break; + } + + return length - remaining; +} + +static int GetData(int socket, char *buffer, int length) +{ + struct timeval timeout; + fd_set readfds; + char *pointer; + int remaining, ToRead, result; + + for (remaining = length, pointer = buffer; remaining > 0;) { + ToRead = remaining; + + //This safeguards against a deadlock, if the TCP connection gets broken for long enough. Long enough for the RST packet from the other side gets lost. + timeout.tv_sec = 10; + timeout.tv_usec = 0; + FD_ZERO(&readfds); + FD_SET(socket, &readfds); + if (select(socket + 1, &readfds, NULL, NULL, &timeout) <= 0) { + result = -EPIPE; + break; + } + + if ((result = recv(socket, pointer, ToRead, 0)) < 1) + break; + remaining -= result; + pointer += result; + if (result != ToRead) //No further data at the moment. + break; + } + + return length - remaining; +} + +#define HTTP_WORK_BUFFER_SIZE 256 //Not a really great design, but this must be long enough for the longest line in the HTTP entity. + +enum TRANFER_ENCODING { + TRANFER_ENCODING_PLAIN, + TRANFER_ENCODING_CHUNKED +}; + +static int ContentLength; +static short int StatusCode; +static unsigned short int HeaderLineNumber; +//static char TransferEncoding; +static char ConnectionMode; + +static void HttpParseEntityLine(const char *line) +{ + char *pColon; + + if ((pColon = strchr(line, ':')) != NULL) { + for (pColon++; *pColon != '\0'; pColon++) { + if (look_ctype_table(*pColon) & 2) + *pColon = tolower(*pColon); + } + } + + //printf("%u\t%s\n", HeaderLineNumber, line); + + if (HeaderLineNumber == 0 && strncmp(line, "HTTP/1.1 ", 9) == 0) + StatusCode = strtoul(line + 9, NULL, 10); + + if (strncmp(line, "Content-Length: ", 16) == 0) + ContentLength = strtoul(line + 15, NULL, 10); + /* if(strncmp(line, "Transfer-Encoding: ", 19) == 0) + { + ContentLength = -1; + if(strcmp(line + 19, "chunked") == 0) + TransferEncoding = TRANFER_ENCODING_CHUNKED; + } */ + if (strcmp(line, "Connection: close") == 0) + ConnectionMode = HTTP_CMODE_CLOSED; + + HeaderLineNumber++; +} + +static int HttpGetResponse(s32 socket, s8 *mode, s8 *buffer, u16 *length) +{ + char work[HTTP_WORK_BUFFER_SIZE + 1], EndOfEntity, *ptr, *next_ptr, *PayloadPtr; + int result, DataAvailable, PayloadAmount; + + //TransferEncoding = TRANFER_ENCODING_PLAIN; + ConnectionMode = *mode; + ContentLength = -1; + StatusCode = -1; + HeaderLineNumber = 0; + PayloadPtr = buffer; + PayloadAmount = 0; + EndOfEntity = 0; + ptr = work; + DataAvailable = 0; + work[HTTP_WORK_BUFFER_SIZE] = '\0'; + do { + if ((result = GetData(socket, ptr, HTTP_WORK_BUFFER_SIZE - DataAvailable)) > 0) { + DataAvailable += result; + ptr = work; + while ((next_ptr = strstr(ptr, "\r\n")) != NULL) { + *next_ptr = '\0'; + //Parse line + HttpParseEntityLine(ptr); + DataAvailable -= (next_ptr + 2 - ptr); + ptr = next_ptr + 2; //skip CRLN + if (strncmp(ptr, "\r\n", 2) == 0) { + EndOfEntity = 1; + DataAvailable -= 2; + ptr += 2; + break; + } + } + + //At this point, the final line (preceding NULL terminator) has been reached. Move any outstanding characters to the start of the buffer. + if (!EndOfEntity) { + if (DataAvailable > 0) { + memmove(work, ptr, DataAvailable); + work[DataAvailable] = '\0'; + ptr = &work[DataAvailable]; + } else + ptr = work; + } + } else { + //No more data. Connection lost? + // printf("DEBUG: connection lost?\n"); + break; + } + } while (!EndOfEntity); + + //Receive data normally (plain). + if (DataAvailable > 0) //Move leftover data into the output buffer. + { + memcpy(buffer, ptr, DataAvailable); + buffer[DataAvailable] = '\0'; + PayloadPtr = buffer + DataAvailable; + PayloadAmount = DataAvailable; + } + + if (ContentLength < 0 || PayloadAmount < ContentLength) { + if (ContentLength > *length) + ContentLength = *length; + if ((result = GetData(socket, PayloadPtr, ContentLength - PayloadAmount)) > 0) + *length = PayloadAmount + result; + else + *length = PayloadAmount; + } else + *length = PayloadAmount; + + result = StatusCode; + if (ContentLength > 0 && ContentLength > *length) { + result = -EPIPE; //Incomplete transfer. + //printf("Pipe broken: %d/%d\n", *length, ContentLength); + } + + *mode = ConnectionMode; + + return result; +} + +static int ResolveHostname(char *hostname, struct in_addr *ip) +{ + struct hostent *HostEntry; + struct in_addr **addr_list; + + if ((HostEntry = gethostbyname(hostname)) == NULL) + return 1; + + for (addr_list = (struct in_addr **)HostEntry->h_addr_list; addr_list != NULL; addr_list++) { + ip->s_addr = (*addr_list)->s_addr; + return 0; + } + + return 1; +} + +int HttpEstabConnection(s8 *server, u16 port) +{ + struct in_addr ip; + int result; + + if (ResolveHostname(server, &ip) == 0) { + result = EstablishConnection(&ip, port); + } else { + result = -ENXIO; + } + + return result; +} + +static const char *GetDayInWeek(const unsigned char *mtime) +{ + static const unsigned char daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + static const char *dayLabels[7] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; + unsigned short int DaysInYear; + unsigned char LeapDays, month; + unsigned int days; + + LeapDays = mtime[0] / 4; //Number of leap days, in the years elasped. + for (month = 0, DaysInYear = 0; month < mtime[1]; DaysInYear += daysInMonth[month], month++) + ; //Number of days, within the months elasped within the past year. + if (mtime[0] % 4 == 0) { + if (mtime[1] > 1) + DaysInYear++; //Account for this year's leap day, if applicable. + } else + LeapDays++; //Account for the leap day, of the leap year that just passed. + days = mtime[0] * 365 + LeapDays + DaysInYear + mtime[2]; + + return dayLabels[(5 + days) % 7]; //2000/1/1 was a Saturday (5). +} + +int HttpSendGetRequest(s32 HttpSocket, const s8 *UserAgent, const s8 *host, s8 *mode, const u8 *mtime, const s8 *uri, u8 *output, u16 *out_len) +{ + const char *months[] = { + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec"}; + char buffer[512]; + int result, length; + + sprintf(buffer, "GET %s HTTP/1.1\r\n" + "Accept: text/html, */*\r\n" + "User-Agent: %s\r\n" + "Host: %s\r\n", + uri, UserAgent, host); + + if (*mode == HTTP_CMODE_PERSISTENT) + strcat(buffer, "Proxy-Connection: Keep-Alive\r\n"); + if (mtime != NULL) + sprintf(&buffer[strlen(buffer)], "If-Modified-Since: %s, %02u %s %04u %02u:%02u:%02u GMT\r\n", GetDayInWeek(mtime), mtime[2] + 1, months[mtime[1]], 2000 + mtime[0], mtime[3], mtime[4], mtime[5]); + strcat(buffer, "\r\n"); + + length = strlen(buffer); + + if (SendData(HttpSocket, buffer, length) == length) { + result = HttpGetResponse(HttpSocket, mode, output, out_len); + } else { + result = -1; + } + + return result; +} diff --git a/modules/network/httpclient/imports.lst b/modules/network/httpclient/imports.lst index c3bd9db4d..b92a9dc0a 100755 --- a/modules/network/httpclient/imports.lst +++ b/modules/network/httpclient/imports.lst @@ -1,59 +1,59 @@ -intrman_IMPORTS_start -I_CpuSuspendIntr -I_CpuResumeIntr -intrman_IMPORTS_end - -loadcore_IMPORTS_start -I_RegisterLibraryEntries -I_ReleaseLibraryEntries -loadcore_IMPORTS_end - -ps2ip_IMPORTS_start -I_lwip_socket -I_lwip_connect -I_lwip_send -I_lwip_recv -I_lwip_select -I_lwip_close -I_lwip_shutdown -I_lwip_gethostbyname -ps2ip_IMPORTS_end - -sifcmd_IMPORTS_start -I_sceSifSetRpcQueue -I_sceSifRegisterRpc -I_sceSifRpcLoop -sifcmd_IMPORTS_end - -sifman_IMPORTS_start -I_sceSifSetDma -sifman_IMPORTS_end - -stdio_IMPORTS_start -I_printf -stdio_IMPORTS_end - -sysclib_IMPORTS_start -I_look_ctype_table -I_memcpy -I_memset -I_memmove -I_strcpy -I_strcmp -I_strncmp -I_strlen -I_strcat -I_sprintf -I_strtoul -I_strchr -I_strstr -I_tolower -sysclib_IMPORTS_end - -thbase_IMPORTS_start -I_GetThreadId -I_CreateThread -I_DeleteThread -I_StartThread -I_TerminateThread -thbase_IMPORTS_end +intrman_IMPORTS_start +I_CpuSuspendIntr +I_CpuResumeIntr +intrman_IMPORTS_end + +loadcore_IMPORTS_start +I_RegisterLibraryEntries +I_ReleaseLibraryEntries +loadcore_IMPORTS_end + +ps2ip_IMPORTS_start +I_lwip_socket +I_lwip_connect +I_lwip_send +I_lwip_recv +I_lwip_select +I_lwip_close +I_lwip_shutdown +I_lwip_gethostbyname +ps2ip_IMPORTS_end + +sifcmd_IMPORTS_start +I_sceSifSetRpcQueue +I_sceSifRegisterRpc +I_sceSifRpcLoop +sifcmd_IMPORTS_end + +sifman_IMPORTS_start +I_sceSifSetDma +sifman_IMPORTS_end + +stdio_IMPORTS_start +I_printf +stdio_IMPORTS_end + +sysclib_IMPORTS_start +I_look_ctype_table +I_memcpy +I_memset +I_memmove +I_strcpy +I_strcmp +I_strncmp +I_strlen +I_strcat +I_sprintf +I_strtoul +I_strchr +I_strstr +I_tolower +sysclib_IMPORTS_end + +thbase_IMPORTS_start +I_GetThreadId +I_CreateThread +I_DeleteThread +I_StartThread +I_TerminateThread +thbase_IMPORTS_end diff --git a/modules/network/httpclient/irx_imports.h b/modules/network/httpclient/irx_imports.h index f9b3f57d8..d037da2f0 100755 --- a/modules/network/httpclient/irx_imports.h +++ b/modules/network/httpclient/irx_imports.h @@ -1,10 +1,10 @@ -#include - -#include -#include -#include -#include -#include -#include -#include -#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/modules/network/nbns/Makefile b/modules/network/nbns/Makefile index 2bfa260fb..dbb8a4524 100755 --- a/modules/network/nbns/Makefile +++ b/modules/network/nbns/Makefile @@ -1,14 +1,14 @@ -IOP_BIN = nbns.irx -IOP_OBJS = main.o nbns.o imports.o exports.o - -IOP_INCS += -I../../../include -IOP_CFLAGS += -Wall -fno-builtin -D_IOP -mno-gpopt -G0 -IOP_LDFLAGS += -s - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) - -include $(PS2SDK)/Defs.make -include ../../Rules.make +IOP_BIN = nbns.irx +IOP_OBJS = main.o nbns.o imports.o exports.o + +IOP_INCS += -I../../../include +IOP_CFLAGS += -Wall -fno-builtin -D_IOP -mno-gpopt -G0 +IOP_LDFLAGS += -s + +all: $(IOP_BIN) + +clean: + rm -f $(IOP_BIN) $(IOP_OBJS) + +include $(PS2SDK)/Defs.make +include ../../Rules.make diff --git a/modules/network/nbns/exports.tab b/modules/network/nbns/exports.tab index 3b1a2e4c2..d89af5491 100755 --- a/modules/network/nbns/exports.tab +++ b/modules/network/nbns/exports.tab @@ -1,9 +1,9 @@ -void _funcret(){}; - -DECLARE_EXPORT_TABLE(nbnsman, 1, 1) - DECLARE_EXPORT(_start) - DECLARE_EXPORT(_exit) - DECLARE_EXPORT(_funcret) - DECLARE_EXPORT(_funcret) - DECLARE_EXPORT(nbnsFindName) -END_EXPORT_TABLE +void _funcret(){}; + +DECLARE_EXPORT_TABLE(nbnsman, 1, 1) + DECLARE_EXPORT(_start) + DECLARE_EXPORT(_exit) + DECLARE_EXPORT(_funcret) + DECLARE_EXPORT(_funcret) + DECLARE_EXPORT(nbnsFindName) +END_EXPORT_TABLE diff --git a/modules/network/nbns/imports.lst b/modules/network/nbns/imports.lst index e04a97566..b000fc338 100755 --- a/modules/network/nbns/imports.lst +++ b/modules/network/nbns/imports.lst @@ -1,51 +1,51 @@ -intrman_IMPORTS_start -I_CpuSuspendIntr -I_CpuResumeIntr -intrman_IMPORTS_end - -loadcore_IMPORTS_start -I_RegisterLibraryEntries -I_ReleaseLibraryEntries -loadcore_IMPORTS_end - -ps2ip_IMPORTS_start -I_lwip_socket -I_lwip_connect -I_lwip_bind -I_lwip_send -I_lwip_sendto -I_lwip_recv -I_lwip_close -I_lwip_shutdown -ps2ip_IMPORTS_end - -sifcmd_IMPORTS_start -I_sceSifSetRpcQueue -I_sceSifRegisterRpc -I_sceSifRpcLoop -sifcmd_IMPORTS_end - -stdio_IMPORTS_start -I_printf -stdio_IMPORTS_end - -sysclib_IMPORTS_start -I_memset -I_memcpy -I_strcpy -I_strcmp -sysclib_IMPORTS_end - -thbase_IMPORTS_start -I_GetThreadId -I_CreateThread -I_DeleteThread -I_StartThread -I_SleepThread -I_DelayThread -I_WakeupThread -I_iWakeupThread -I_SetAlarm -I_CancelAlarm -I_ReferThreadStatus -thbase_IMPORTS_end +intrman_IMPORTS_start +I_CpuSuspendIntr +I_CpuResumeIntr +intrman_IMPORTS_end + +loadcore_IMPORTS_start +I_RegisterLibraryEntries +I_ReleaseLibraryEntries +loadcore_IMPORTS_end + +ps2ip_IMPORTS_start +I_lwip_socket +I_lwip_connect +I_lwip_bind +I_lwip_send +I_lwip_sendto +I_lwip_recv +I_lwip_close +I_lwip_shutdown +ps2ip_IMPORTS_end + +sifcmd_IMPORTS_start +I_sceSifSetRpcQueue +I_sceSifRegisterRpc +I_sceSifRpcLoop +sifcmd_IMPORTS_end + +stdio_IMPORTS_start +I_printf +stdio_IMPORTS_end + +sysclib_IMPORTS_start +I_memset +I_memcpy +I_strcpy +I_strcmp +sysclib_IMPORTS_end + +thbase_IMPORTS_start +I_GetThreadId +I_CreateThread +I_DeleteThread +I_StartThread +I_SleepThread +I_DelayThread +I_WakeupThread +I_iWakeupThread +I_SetAlarm +I_CancelAlarm +I_ReferThreadStatus +thbase_IMPORTS_end diff --git a/modules/network/nbns/irx_imports.h b/modules/network/nbns/irx_imports.h index a58987425..8e08a836d 100755 --- a/modules/network/nbns/irx_imports.h +++ b/modules/network/nbns/irx_imports.h @@ -1,9 +1,9 @@ -#include - -#include -#include -#include -#include -#include -#include -#include +#include + +#include +#include +#include +#include +#include +#include +#include diff --git a/modules/pademu/Makefile b/modules/pademu/Makefile new file mode 100644 index 000000000..ecb89e290 --- /dev/null +++ b/modules/pademu/Makefile @@ -0,0 +1,29 @@ + +IOP_OBJS = pademu.o sys_utils.o imports.o exports.o +ifeq ($(USE_USB),1) +IOP_BIN = usb_pademu.irx +IOP_CFLAGS += -DUSB +IOP_OBJNAME = usb. +IOP_OBJS += ds3usb.o +endif +ifeq ($(USE_BT),1) +IOP_BIN = bt_pademu.irx +IOP_CFLAGS += -DBT +IOP_OBJNAME = bt. +IOP_OBJS += ds3bt.o +endif + +IOP_OBJS := $(IOP_OBJS:%=$(IOP_OBJNAME)%) + +IOP_CFLAGS += -Wall -fno-builtin +IOP_LDFLAGS += -s + +all: $(IOP_BIN) + +clean: + rm -f $(IOP_BIN) $(IOP_OBJS) + +rebuild: clean all + +include $(PS2SDK)/Defs.make +include Rules.make diff --git a/modules/pademu/README b/modules/pademu/README new file mode 100644 index 000000000..3429ba7c9 --- /dev/null +++ b/modules/pademu/README @@ -0,0 +1,115 @@ +== First of all == +PS Remote Controller Bluetooth stack for Arduino with USB Host Shield / Arduino MEGA ADK +Copyright (C) 2010 Tomo Tanaka - Original written WiiRemote Stack adapted for using with PS3 Controller +Copyright (C) 2011 Ion Agorria - PS3 adaptation + +This program is based on which is developed by Richard Ibbotson. +This program also needs MAX3421E and USB libraries for Arduino written by Oleg Mazurov. +This program is based on WiiRemote code from https://github.com/moyuchin/WiiRemote_on_Arduino + +This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see . + +== Hardware Requirement == + Case 1: + * Arduino + * USB Host Shield + Case 2: + * Arduino Mega ADK (USB Host included) + + * USB Bluetooth Device + + +== Software Requirement == + Case 1: + * MAX3421E and USB library for Arduino written by Oleg Mazurov + The source codes can be grabbed from https://github.com/felis/USB_Host_Shield + + Case 2: + *Same Libraries adapted for Arduino Mega ADK: + http://labs.arduino.cc/uploads/ADK/GettingStarted/arduino_bundle_ADB.zip + + Open Downloaded Library and copy these files to a folder with PSRemote files: + * Max3421e_constants.h + * Max3421e.h + * Max3421e.cpp + * ch9.h + * Usb.h + * Usb.cpp + + So it must look something like this + +== Files == + Folder/ + | + +- Example.pde + +- PSRemote.h + +- PSRemote.cpp + +- README.txt + +- Max3421e_constants.h + +- Max3421e.h + +- Max3421e.cpp + +- ch9.h + +- Usb.h + +- Usb.cpp + + +== Usage == +Same as USB version library +getBDADDR() and setBDADDR() are just for compatibility, they do nothing +rename header and constructor to "PSRemote" or see the example! + +Added Functions: + +getPSADDR(): gets connected PS bt address +LED(): sets LED only without affecting rumble +Rumble(): set Rumble without changing LEDs + +=== Modify USB Device Descriptors === +The values of CSR_VID and CSR_PID described in PSRemote.h need to be modified +to match descriptors of USB Bluetooth Device to be used. + +Default is configured for CSR chips (like mine) + + +== Hint == +--Hints from PS3 and Wiimote game controllers thread in Circuit@Home. + - Bluetooth 1.x seems not work on this library. + +--Bluetooth Docs: + +HCI, L2CAP,... Doc: https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=40560 + +BT HID profile Doc: https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=7108 + +--Sixaxis/DualShock3 Info: + +Windows Driver/Pairing: MotionInJoy +Linux Pairing: sixaxis.c source file +Mac: I dont know but i seem some + +http://www.pabr.org/sixlinux/sixlinux.en.html +http://wiki.ps2dev.org/ps3:hardware:sixaxis +http://wiibrew.org/wiki/Sixaxis + +== ACKNOWLEDGEMENT & INFO == +I appreciate the gread codes developed by Oleg, Richard and Tomo :-) + +--What Does?-- + +-HCI Waits for PS Remote (Remenber to Pair with your BT Dongle!!!) +Then Accepts connect Req and goes to L2CAP + +-L2CAP responses two Connection Req from PSRemote (HID Control and HID Interrupt) +Then configures it and then passed to HID + +-Initializates PS Controller and lights all Leds + +-??? + +-Profit + +I started this because noone has taken initiative with PS (unlike Wii) diff --git a/modules/pademu/Rules.make b/modules/pademu/Rules.make new file mode 100644 index 000000000..1551a788c --- /dev/null +++ b/modules/pademu/Rules.make @@ -0,0 +1,62 @@ +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# $Id$ + +IOP_CC_VERSION := $(shell $(IOP_CC) --version 2>&1 | sed -n 's/^.*(GCC) //p') + +ASFLAGS_TARGET = -mcpu=r3000 + +ifeq ($(IOP_CC_VERSION),3.2.2) +ASFLAGS_TARGET = -march=r3000 +endif + +ifeq ($(IOP_CC_VERSION),3.2.3) +ASFLAGS_TARGET = -march=r3000 +endif + +IOP_INCS := $(IOP_INCS) -I$(PS2SDK)/iop/include -I$(PS2SDK)/common/include -Iinclude + +IOP_CFLAGS := -D_IOP -fno-builtin -O2 -G0 $(IOP_INCS) $(IOP_CFLAGS) +IOP_ASFLAGS := $(ASFLAGS_TARGET) -EL -G0 $(IOP_ASFLAGS) +IOP_LDFLAGS := -nostdlib $(IOP_LDFLAGS) + +BIN2C = $(PS2SDK)/bin/bin2c +BIN2S = $(PS2SDK)/bin/bin2s +BIN2O = $(PS2SDK)/bin/bin2o + +# Externally defined variables: IOP_BIN, IOP_OBJS, IOP_LIB + +$(IOP_OBJNAME)%.o : %.c + $(IOP_CC) $(IOP_CFLAGS) -c $< -o $@ + +$(IOP_OBJNAME)%.o : %.S + $(IOP_CC) $(IOP_CFLAGS) $(IOP_INCS) -c $< -o $@ + +$(IOP_OBJNAME)%.o : %.s + $(IOP_AS) $(IOP_ASFLAGS) $< -o $@ + +# A rule to build imports.lst. +$(IOP_OBJNAME)%.o : %.lst + $(ECHO) "#include \"irx_imports.h\"" > $(IOP_OBJNAME)build-imports.c + cat $< >> $(IOP_OBJNAME)build-imports.c + $(IOP_CC) $(IOP_CFLAGS) -I. -c $(IOP_OBJNAME)build-imports.c -o $@ + -rm -f $(IOP_OBJNAME)build-imports.c + +# A rule to build exports.tab. +$(IOP_OBJNAME)%.o : %.tab + $(ECHO) "#include \"irx.h\"" > $(IOP_OBJNAME)build-exports.c + cat $< >> $(IOP_OBJNAME)build-exports.c + $(IOP_CC) $(IOP_CFLAGS) -I. -c $(IOP_OBJNAME)build-exports.c -o $@ + -rm -f $(IOP_OBJNAME)build-exports.c + +$(IOP_BIN) : $(IOP_OBJS) + $(IOP_CC) $(IOP_CFLAGS) -o $(IOP_BIN) $(IOP_OBJS) $(IOP_LDFLAGS) $(IOP_LIBS) + +$(IOP_LIB) : $(IOP_OBJS) + $(IOP_AR) cru $(IOP_LIB) $(IOP_OBJS) diff --git a/modules/pademu/ds3bt.c b/modules/pademu/ds3bt.c new file mode 100644 index 000000000..3e8182a64 --- /dev/null +++ b/modules/pademu/ds3bt.c @@ -0,0 +1,1437 @@ + +/* bt code ported from: https://github.com/IonAgorria/Arduino-PSRemote see README */ +/* usb code based on usbhdfsd module from ps2sdk */ + +#include "types.h" +#include "ioman.h" +#include "intrman.h" +#include "loadcore.h" +#include "stdio.h" +#include "sifcmd.h" +#include "sifrpc.h" +#include "sysclib.h" +#include "sysmem.h" +#include "usbd.h" +#include "usbd_macro.h" +#include "thbase.h" +#include "thevent.h" +#include "thsemap.h" +#include "sifman.h" +#include "vblank.h" +#include "ds3bt.h" +#include "sys_utils.h" + +//#define DPRINTF(x...) printf(x) +#define DPRINTF(x...) + +#define USB_CLASS_WIRELESS_CONTROLLER 0xE0 +#define USB_SUBCLASS_RF_CONTROLLER 0x01 +#define USB_PROTOCOL_BLUETOOTH_PROG 0x01 + +int bt_probe(int devId); +int bt_connect(int devId); +int bt_disconnect(int devId); + +UsbDriver bt_driver = {NULL, NULL, "ds3bt", bt_probe, bt_connect, bt_disconnect}; + +typedef struct _bt_dev +{ + int devId; + int hci_sema; + int l2cap_sema; + int controlEndp; + int eventEndp; + int inEndp; + int outEndp; + uint8_t status; +} bt_device; + +bt_device bt_dev = {-1, -1, -1, -1, -1, -1, -1, DS3BT_STATE_USB_DISCONNECTED}; + +static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint); +static void bt_config_set(int result, int count, void *arg); +static void bt_release(); + +int bt_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + UsbConfigDescriptor *config = NULL; + UsbInterfaceDescriptor *intf = NULL; + + DPRINTF("BT: probe: devId=%i\n", devId); + + if ((bt_dev.devId > 0) && (bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) { + DPRINTF("BT: Error - only one device allowed !\n"); + return 0; + } + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("BT: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->bNumConfigurations < 1) + return 0; + + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + if (config == NULL) { + DPRINTF("BT: Error - Couldn't get configuration descriptor\n"); + return 0; + } + + + if ((config->bNumInterfaces < 1) || (config->wTotalLength < (sizeof(UsbConfigDescriptor) + sizeof(UsbInterfaceDescriptor)))) { + DPRINTF("BT: Error - No interfaces available\n"); + return 0; + } + + intf = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + DPRINTF("BT: bInterfaceClass %X bInterfaceSubClass %X bInterfaceProtocol %X\n", + intf->bInterfaceClass, intf->bInterfaceSubClass, intf->bInterfaceProtocol); + + if ((intf->bInterfaceClass != USB_CLASS_WIRELESS_CONTROLLER) || + (intf->bInterfaceSubClass != USB_SUBCLASS_RF_CONTROLLER) || + (intf->bInterfaceProtocol != USB_PROTOCOL_BLUETOOTH_PROG) || + (intf->bNumEndpoints < 3)) { + return 0; + } + + return 1; +} + +int bt_connect(int devId) +{ + int i; + int epCount; + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + UsbInterfaceDescriptor *interface; + UsbEndpointDescriptor *endpoint; + iop_sema_t SemaData; + + DPRINTF("BT: connect: devId=%i\n", devId); + + if (bt_dev.devId != -1) { + DPRINTF("BT: Error - only one device allowed !\n"); + return 1; + } + + bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; + + bt_dev.eventEndp = -1; + bt_dev.inEndp = -1; + bt_dev.outEndp = -1; + + bt_dev.controlEndp = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + + interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + epCount = interface->bNumEndpoints; + + DPRINTF("BT: Endpoint Count %d \n", epCount); + + endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); + usb_probeEndpoint(devId, endpoint); + + for (i = 1; i < epCount; i++) { + endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); + usb_probeEndpoint(devId, endpoint); + } + + if (bt_dev.eventEndp < 0 || bt_dev.inEndp < 0 || bt_dev.outEndp < 0) { + bt_release(); + DPRINTF("BT: Error - connect failed: not enough endpoints! \n"); + return -1; + } + + SemaData.initial = 1; + SemaData.max = 1; + SemaData.option = 0; + SemaData.attr = 0; + + if ((bt_dev.hci_sema = CreateSema(&SemaData)) < 0) { + DPRINTF("BT: Failed to allocate I/O semaphore.\n"); + return -1; + } + + if ((bt_dev.l2cap_sema = CreateSema(&SemaData)) < 0) { + DPRINTF("BT: Failed to allocate I/O semaphore.\n"); + return -1; + } + + bt_dev.devId = devId; + + bt_dev.status = DS3BT_STATE_USB_AUTHORIZED; + + UsbSetDeviceConfiguration(bt_dev.controlEndp, config->bConfigurationValue, bt_config_set, NULL); + + return 0; +} + +int bt_disconnect(int devId) +{ + DPRINTF("BT: disconnect: devId=%i\n", devId); + + if (bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) { + bt_release(); + + bt_dev.devId = -1; + bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; + } + + return 0; +} + +static void bt_release() +{ + if (bt_dev.eventEndp >= 0) + UsbCloseEndpoint(bt_dev.eventEndp); + + if (bt_dev.inEndp >= 0) + UsbCloseEndpoint(bt_dev.inEndp); + + if (bt_dev.outEndp >= 0) + UsbCloseEndpoint(bt_dev.outEndp); + + DeleteSema(bt_dev.hci_sema); + DeleteSema(bt_dev.l2cap_sema); + + bt_dev.eventEndp = -1; + bt_dev.inEndp = -1; + bt_dev.outEndp = -1; + bt_dev.controlEndp = -1; +} + +static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint) +{ + if (endpoint->bmAttributes == USB_ENDPOINT_XFER_BULK) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && bt_dev.outEndp < 0) { + bt_dev.outEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("BT: register Output endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.outEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } else + + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.inEndp < 0) { + bt_dev.inEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("BT: register Input endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.inEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + } else if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.eventEndp < 0) { + bt_dev.eventEndp = UsbOpenEndpoint(devId, endpoint); + DPRINTF("BT: register Event endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.eventEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + } +} + +static int chrg_dev = -1; +static int chrg_end = -1; + +int chrg_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + + DPRINTF("CHRG: probe: devId=%i\n", devId); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("CHRG: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->idVendor == 0x054C && device->idProduct == 0x0268) + return 1; + + return 0; +} + +int chrg_connect(int devId) +{ + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + + DPRINTF("CHRG: connect: devId=%i\n", devId); + + if (chrg_dev != -1) { + DPRINTF("CHRG: Error - only one device allowed !\n"); + return 1; + } + + chrg_dev = devId; + + chrg_end = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + + UsbSetDeviceConfiguration(chrg_end, config->bConfigurationValue, NULL, NULL); + + return 0; +} + +int chrg_disconnect(int devId) +{ + DPRINTF("CHRG: disconnect: devId=%i\n", devId); + + if (chrg_dev == devId) { + if (chrg_end >= 0) + UsbCloseEndpoint(chrg_end); + + chrg_dev = -1; + chrg_end = -1; + } + + return 0; +} + +UsbDriver chrg_driver = {NULL, NULL, "chrg", chrg_probe, chrg_connect, chrg_disconnect}; + +/* PS Remote Reports */ +static uint8_t feature_F4_report[] = + { + 0x42, 0x03, 0x00, 0x00}; + +static uint8_t output_01_report[] = + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; + +// Taken from nefarius' SCPToolkit +// https://github.com/nefarius/ScpToolkit/blob/master/ScpControl/ScpControl.ini +// Valid MAC addresses used by Sony +static uint8_t GenuineMacAddress[][3] = + { + // Bluetooth chips by ALPS ELECTRIC CO., LTD + {0x00, 0x02, 0xC7}, + {0x00, 0x06, 0xF5}, + {0x00, 0x06, 0xF7}, + {0x00, 0x07, 0x04}, + {0x00, 0x16, 0xFE}, + {0x00, 0x19, 0xC1}, + {0x00, 0x1B, 0xFB}, + {0x00, 0x1E, 0x3D}, + {0x00, 0x21, 0x4F}, + {0x00, 0x23, 0x06}, + {0x00, 0x24, 0x33}, + {0x00, 0x26, 0x43}, + {0x00, 0xA0, 0x79}, + {0x04, 0x76, 0x6E}, + {0x04, 0x98, 0xF3}, + {0x28, 0xA1, 0x83}, + {0x34, 0xC7, 0x31}, + {0x38, 0xC0, 0x96}, + {0x60, 0x38, 0x0E}, + {0x64, 0xD4, 0xBD}, + {0xAC, 0x7A, 0x4D}, + {0xE0, 0x75, 0x0A}, + {0xE0, 0xAE, 0x5E}, + {0xFC, 0x62, 0xB9}, + // Bluetooth chips by AzureWave Technology Inc. + {0xE0, 0xB9, 0xA5}, + {0xDC, 0x85, 0xDE}, + {0xD0, 0xE7, 0x82}, + {0xB0, 0xEE, 0x45}, + {0xAC, 0x89, 0x95}, + {0xA8, 0x1D, 0x16}, + {0x94, 0xDB, 0xC9}, + {0x80, 0xD2, 0x1D}, + {0x80, 0xA5, 0x89}, + {0x78, 0x18, 0x81}, + {0x74, 0xF0, 0x6D}, + {0x74, 0xC6, 0x3B}, + {0x74, 0x2F, 0x68}, + {0x6C, 0xAD, 0xF8}, + {0x6C, 0x71, 0xD9}, + {0x60, 0x5B, 0xB4}, + {0x5C, 0x96, 0x56}, + {0x54, 0x27, 0x1E}, + {0x4C, 0xAA, 0x16}, + {0x48, 0x5D, 0x60}, + {0x44, 0xD8, 0x32}, + {0x40, 0xE2, 0x30}, + {0x38, 0x4F, 0xF0}, + {0x28, 0xC2, 0xDD}, + {0x24, 0x0A, 0x64}, + {0x1C, 0x4B, 0xD6}, + {0x08, 0xA9, 0x5A}, + {0x00, 0x25, 0xD3}, + {0x00, 0x24, 0x23}, + {0x00, 0x22, 0x43}, + {0x00, 0x15, 0xAF}, + //fake with AirohaTechnologyCorp's Chip + {0x0C, 0xFC, 0x83}}; + +/* variables used by high level HCI task */ +static uint16_t hci_counter_; // counter used for bluetooth HCI loops + +/* variables filled from HCI event management */ +static volatile uint8_t hci_event_flag_; // flag of received bluetooth events + +/* variables used by L2CAP */ +static volatile uint8_t l2cap_event_status_; +static uint8_t l2cap_txid_; // packet id increments for each packet sent +/* L2CAP CID name space: 0x0040-0xffff dynamically allocated */ +static uint16_t command_scid_; // Channel endpoint on command source +static uint16_t interrupt_scid_; // Channel endpoint on interrupt source + +/* variables used by Bluetooth HID */ +static uint8_t hid_flags_; +static uint8_t ds3bt_bdaddr_[6]; + +static uint8_t hci_reset(); +static uint8_t hci_write_scan_enable(uint8_t conf); +static uint8_t hci_accept_connection(uint8_t *bdaddr); +static uint8_t hci_reject_connection(uint8_t *bdaddr); +static uint8_t hci_disconnect(uint16_t handle); +static uint8_t hci_change_connection_type(uint8_t pad); +static uint8_t HCI_Command(uint16_t nbytes, uint8_t *dataptr); + +static uint8_t l2cap_connect_response(uint8_t rxid, uint16_t dcid, uint16_t scid, uint8_t pad); +static uint8_t l2cap_configure(uint16_t dcid, uint8_t pad); +static uint8_t l2cap_config_response(uint8_t rxid, uint16_t dcid, uint8_t pad); +static uint8_t l2cap_disconnect_response(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad); +static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad); + +static uint8_t initPSController(int pad); +static void readReport(uint8_t *data, int bytes, int pad); +static uint8_t writeReport(uint8_t *data, uint8_t length, int pad); + +static void HCI_task(uint8_t pad); +static void L2CAP_task(uint8_t pad); +static uint8_t HCI_event_task(int result); +static uint8_t L2CAP_event_task(int result, int bytes); + +static uint8_t hci_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; +static uint8_t l2cap_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; +static uint8_t hci_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; +static uint8_t l2cap_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; + +static void DS3BT_init(); +static uint8_t LED(uint8_t led, int pad); +static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad); +static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); + +static uint8_t current_pad; +static uint8_t enable_pad; +static uint8_t press_emu; + +typedef struct +{ + uint16_t hci_handle_; //connection handle + uint16_t command_dcid_; // Channel endpoint on command destination + uint16_t interrupt_dcid_; // Channel endpoint on interrupt destination + uint8_t hci_state_; // current state of bluetooth HCI connection + uint8_t l2cap_state_; // current state of L2CAP connection + uint8_t status_; + uint8_t oldled; + uint8_t oldlrumble; + uint8_t oldrrumble; + uint8_t enabled; + uint8_t type; + uint8_t data[18]; +} ds3bt_pad_t; + +#define MAX_PADS 2 + +ds3bt_pad_t ds3pad[MAX_PADS]; + +static void DS3BT_init() +{ + uint8_t i; + + l2cap_txid_ = 1; + command_scid_ = 0x0040; // L2CAP local CID for HID_Control + interrupt_scid_ = 0x0041; // L2CAP local CID for HID_Interrupt + + hid_flags_ = 0; + + for (i = 0; i < MAX_PADS; i++) { + ds3pad[i].hci_handle_ = 0x0FFF; + ds3pad[i].status_ = bt_dev.status; + ds3pad[i].status_ |= DS3BT_STATE_USB_CONFIGURED; + ds3pad[i].hci_state_ = HCI_RESET_STATE; + ds3pad[i].l2cap_state_ = L2CAP_DOWN_STATE; + + ds3pad[i].data[0] = 0xFF; + ds3pad[i].data[1] = 0xFF; + ds3pad[i].enabled = (enable_pad >> i) & 1; + ds3pad[i].type = 0; + + mips_memset(&ds3pad[i].data[2], 0x7F, 4); + mips_memset(&ds3pad[i].data[6], 0x00, 12); + } + + hci_counter_ = 10; + current_pad = 0; + press_emu = 0; + + hci_reset(); +} + +static void hci_event_cb(int resultCode, int bytes, void *arg) +{ + uint8_t pad; + + PollSema(bt_dev.hci_sema); + + //DPRINTF("hci_event_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + pad = HCI_event_task(resultCode); + HCI_task(pad); + + SignalSema(bt_dev.hci_sema); + + UsbInterruptTransfer(bt_dev.eventEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, arg); +} + +static void l2cap_event_cb(int resultCode, int bytes, void *arg) +{ + uint8_t pad; + + PollSema(bt_dev.l2cap_sema); + + //DPRINTF("l2cap_event_cb: res %d, bytes %d, arg %p arg %x\n", resultCode, bytes, arg, *(uint8_t *)arg); + + pad = L2CAP_event_task(resultCode, bytes); + L2CAP_task(pad); + + if (pad >= MAX_PADS) + pad = current_pad; + + if (arg != NULL) { + if (pad != (int)arg && (int)arg < MAX_PADS) { + if ((ds3pad[(int)arg].status_ & DS3BT_STATE_RUNNING)) { + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + return; + } + } + } + + SignalSema(bt_dev.l2cap_sema); + + if (ds3pad[pad].l2cap_state_ != L2CAP_READY_STATE) { + DelayThread(14000); //fix for some bt adapters + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + } +} + +static void l2cap_cmd_cb(int resultCode, int bytes, void *arg) +{ + //DPRINTF("l2cap_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + if (ds3pad[(int)arg].status_ & DS3BT_STATE_RUNNING) + SignalSema(bt_dev.l2cap_sema); +} + +static void bt_config_set(int result, int count, void *arg) +{ + UsbInterruptTransfer(bt_dev.eventEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, NULL); + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); + + DS3BT_init(); +} + +static uint8_t HCI_event_task(int result) +{ + uint8_t i, pad; + + pad = current_pad; + + if (!result) { + /* buf[0] = Event Code */ + /* buf[1] = Parameter Total Length */ + /* buf[n] = Event Parameters based on each event */ + DPRINTF("HCI event = 0x%x\n", hci_buf[0]); + switch (hci_buf[0]) { // switch on event type + case HCI_EVENT_COMMAND_COMPLETE: + hci_event_flag_ |= HCI_FLAG_COMMAND_COMPLETE; + + DPRINTF("Command OK = 0x%x", hci_buf[3]); + DPRINTF(" Returned = 0x%x\n", hci_buf[5]); + break; + + case HCI_EVENT_COMMAND_STATUS: + hci_event_flag_ |= HCI_FLAG_COMMAND_STATUS; + + if (hci_buf[2]) // show status on serial if not OK + { + DPRINTF("HCI Command Failed: \n"); + DPRINTF("\tStatus = %x\n", hci_buf[2]); + DPRINTF("\tCommand_OpCode(OGF) = %x\n", ((hci_buf[5] & 0xFC) >> 2)); + DPRINTF("\tCommand_OpCode(OCF) = %x%x\n", (hci_buf[5] & 0x03), hci_buf[4]); + } + + break; + + case HCI_EVENT_CONNECT_COMPLETE: + if (!hci_buf[2]) // check if connected OK + { + // store the handle for the ACL connection + ds3pad[pad].hci_handle_ = hci_buf[3] | ((hci_buf[4] & 0x0F) << 8); //pad = current_pad + + DPRINTF("HCI event Connect Complete = 0x%x\n", ds3pad[pad].hci_handle_); + hci_event_flag_ |= HCI_FLAG_CONNECT_COMPLETE; + } else { + DPRINTF("Error on Connect Complete = 0x%x\n", hci_buf[2]); + } + break; + + case HCI_EVENT_NUM_COMPLETED_PKT: + + DPRINTF("HCI Number Of Completed Packets Event: \n"); + DPRINTF("\tNumber_of_Handles = 0x%x\n", hci_buf[2]); + for (i = 0; i < hci_buf[2]; i++) { + DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[3 + i] | ((hci_buf[4 + i] & 0x0F) << 8))); + } + + if (hci_buf[2] == 1) { + for (i = 0; i < MAX_PADS; i++) //detect pad + { + if (ds3pad[i].hci_handle_ == (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))) { + pad = i; + break; + } + } + } + + break; + + case HCI_EVENT_QOS_SETUP_COMPLETE: + break; + + case HCI_EVENT_DISCONN_COMPLETE: + hci_event_flag_ |= HCI_FLAG_DISCONN_COMPLETE; + DPRINTF("HCI Disconnection Complete Event: \n"); + DPRINTF("\tStatus = 0x%x\n", hci_buf[2]); + DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))); + DPRINTF("\tReason = 0x%x\n", hci_buf[5]); + + for (i = 0; i < MAX_PADS; i++) //detect pad + { + if (ds3pad[i].hci_handle_ == (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))) { + pad = i; + break; + } + } + + break; + + case HCI_EVENT_CONNECT_REQUEST: + hci_event_flag_ |= HCI_FLAG_INCOMING_REQUEST; + DPRINTF("Connection Requested by BD_ADDR: \n"); + for (i = 0; i < 6; i++) { + ds3bt_bdaddr_[i] = (unsigned char)hci_buf[2 + i]; + DPRINTF("%x", ds3bt_bdaddr_[i]); + if (i < 5) + DPRINTF(":"); + } + + DPRINTF(" LINK: 0x%x\n", hci_buf[11]); + + for (i = 0; i < MAX_PADS; i++) //find free slot + { + if (!(ds3pad[i].status_ & DS3BT_STATE_RUNNING) && ds3pad[i].enabled) { + if (ds3pad[i].status_ & DS3BT_STATE_CONNECTED) { + if (ds3pad[i].l2cap_state_ == L2CAP_DISCONNECT_STATE) //if we're waiting for hci disconnect event + continue; + else + hci_disconnect(ds3pad[i].hci_handle_); //try to disconnect + } + + current_pad = i; + break; + } + } + + if (i >= MAX_PADS) //no free slot + { + hci_reject_connection(ds3bt_bdaddr_); + current_pad = pad; + return MAX_PADS; + } + + pad = current_pad; + + ds3pad[pad].type = 0xA2; //fake ds3 + + for (i = 0; i < sizeof(GenuineMacAddress) / 3; i++) //check if ds3 is genuine + { + if (ds3bt_bdaddr_[5] == GenuineMacAddress[i][0] && + ds3bt_bdaddr_[4] == GenuineMacAddress[i][1] && + ds3bt_bdaddr_[3] == GenuineMacAddress[i][2]) { + ds3pad[pad].type = HID_THDR_SET_REPORT_OUTPUT; + break; + } + } + + ds3pad[pad].hci_state_ = HCI_CONNECT_IN_STATE; + ds3pad[pad].l2cap_state_ = L2CAP_INIT_STATE; + ds3pad[pad].status_ &= ~DS3BT_STATE_CONNECTED; + ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; + + l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONNECTED; + + break; + + case HCI_EVENT_ROLE_CHANGED: + + DPRINTF("Role Change STATUS: 0x%x\n", hci_buf[2]); + + DPRINTF(" BD_ADDR: "); + for (i = 0; i < 6; i++) { + DPRINTF("%x", (unsigned char)hci_buf[3 + i]); + if (i < 5) + DPRINTF(":"); + } + + DPRINTF(" ROLE: 0x%x\n", hci_buf[9]); + + break; + case HCI_EVENT_MAX_SLOT_CHANGE: + + DPRINTF("Max Slot Change: \n"); + DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[2] | ((hci_buf[3] & 0x0F) << 8))); + DPRINTF("\tLMP Max Slots = 0x%x\n", hci_buf[5]); + break; + + case HCI_EVENT_CHANGED_CONNECTION_TYPE: + + DPRINTF("Packet Type Changed STATUS: 0x%x \n", hci_buf[2]); + DPRINTF(" TYPE: %x \n", (hci_buf[5] | (hci_buf[6] << 8))); + + break; + + case HCI_EVENT_PAGE_SR_CHANGED: + break; + + default: + DPRINTF("Unmanaged Event: 0x%x\n", hci_buf[0]); + break; + } // switch (buf[0]) + } + + return pad; +} + +static void HCI_task(uint8_t pad) +{ + uint8_t i; + + if (pad >= MAX_PADS) + return; + + switch (ds3pad[pad].hci_state_) { + case HCI_INIT_STATE: + // wait until we have looped 10 times to clear any old events + if (hci_timeout) { + for (i = 0; i < MAX_PADS; i++) { + if (ds3pad[i].status_ & DS3BT_STATE_RUNNING) + break; + } + + if (i == MAX_PADS) { + ds3pad[pad].hci_state_ = HCI_RESET_STATE; + hci_reset(); + } + + hci_counter_ = 10; + } + break; + + case HCI_RESET_STATE: + if (hci_command_complete) { + DPRINTF("HCI Reset complete\n"); + hci_write_scan_enable(SCAN_ENABLE_NOINQ_ENPAG); + ds3pad[pad].hci_state_ = HCI_CONNECT_IN_STATE; + hci_event_flag_ &= ~HCI_FLAG_INCOMING_REQUEST; + } + if (hci_timeout) { + DPRINTF("No response to HCI Reset\n"); + ds3pad[pad].hci_state_ = HCI_INIT_STATE; + hci_counter_ = 10; + } + break; + + case HCI_CONNECT_IN_STATE: + if (hci_incoming_connect_request) { + hci_accept_connection(ds3bt_bdaddr_); + DPRINTF("PS Remote Connected\n"); + ds3pad[pad].hci_state_ = HCI_CHANGE_CONNECTION; + hci_event_flag_ &= ~HCI_FLAG_CONNECT_COMPLETE; + } + break; + + case HCI_CHANGE_CONNECTION: + if (hci_connect_complete) { + hci_change_connection_type(pad); + + ds3pad[pad].hci_state_ = HCI_CONNECTED_STATE; + + ds3pad[pad].status_ |= DS3BT_STATE_CONNECTED; + hci_event_flag_ &= ~HCI_FLAG_DISCONN_COMPLETE; + } + break; + + case HCI_CONNECTED_STATE: + if (hci_disconn_complete) { + DPRINTF("PS Remote Disconnected pad %d\n", pad); + + hci_event_flag_ &= ~HCI_FLAG_DISCONN_COMPLETE; + + ds3pad[pad].status_ &= ~DS3BT_STATE_CONNECTED; + ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; + + hci_counter_ = 10; + + if (ds3pad[pad].type != HID_THDR_SET_REPORT_OUTPUT) { + ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + } + } + break; + + default: + break; + } // switch (hci_state_) +} + +/************************************************************/ +/* HCI Commands */ +/************************************************************/ + +static uint8_t hci_reset() +{ + hci_event_flag_ = 0; // clear all the flags + + hci_cmd_buf[0] = HCI_OCF_RESET; + hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; + hci_cmd_buf[2] = 0x00; // Parameter Total Length = 0 + + return HCI_Command(3, hci_cmd_buf); +} + +static uint8_t hci_write_scan_enable(uint8_t conf) +{ + hci_event_flag_ &= ~HCI_FLAG_COMMAND_COMPLETE; + + hci_cmd_buf[0] = HCI_OCF_WRITE_SCAN_ENABLE; + hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; + hci_cmd_buf[2] = 0x01; + hci_cmd_buf[3] = conf; + return HCI_Command(4, hci_cmd_buf); +} + +static uint8_t hci_accept_connection(uint8_t *bdaddr) +{ + hci_event_flag_ &= ~(HCI_FLAG_INCOMING_REQUEST); + + hci_cmd_buf[0] = HCI_OCF_ACCEPT_CONNECTION; // HCI OCF = 9 + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x07; // parameter length 7 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + hci_cmd_buf[9] = 1; //switch role to slave + + return HCI_Command(10, hci_cmd_buf); +} + +static uint8_t hci_reject_connection(uint8_t *bdaddr) +{ + hci_event_flag_ &= ~(HCI_FLAG_INCOMING_REQUEST); + + hci_cmd_buf[0] = HCI_OCF_REJECT_CONNECTION; // HCI OCF = A + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x07; // parameter length 7 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + hci_cmd_buf[9] = 0x09; //reason max connection + + return HCI_Command(10, hci_cmd_buf); +} + +static uint8_t hci_disconnect(uint16_t handle) +{ + hci_cmd_buf[0] = 0x06; // HCI OCF = 6 + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x03; // parameter length = 3 + hci_cmd_buf[3] = (uint8_t)(handle & 0xFF); //connection handle - low byte + hci_cmd_buf[4] = (uint8_t)((handle >> 8) & 0x0F); //connection handle - high byte + hci_cmd_buf[5] = 0x13; // reason + + return HCI_Command(6, hci_cmd_buf); +} + +static uint8_t hci_change_connection_type(uint8_t pad) +{ + hci_event_flag_ &= ~HCI_FLAG_COMMAND_COMPLETE; + + hci_cmd_buf[0] = HCI_OCF_CHANGE_CONNECTION_TYPE; + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; + hci_cmd_buf[2] = 0x04; // parameter length 4 + hci_cmd_buf[3] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag + hci_cmd_buf[4] = (uint8_t)(ds3pad[pad].hci_handle_ >> 8); + hci_cmd_buf[5] = 0x18; // Packet Type: 0xcc18 + hci_cmd_buf[6] = 0xcc; + + return HCI_Command(7, hci_cmd_buf); +} +/* perform HCI Command */ +static uint8_t HCI_Command(uint16_t nbytes, uint8_t *dataptr) +{ + return UsbControlTransfer(bt_dev.controlEndp, bmREQ_HCI_OUT, HCI_COMMAND_REQ, 0, 0, nbytes, dataptr, NULL, NULL); +} + +static uint8_t L2CAP_event_task(int result, int bytes) +{ + uint8_t pad = 0xFF; + + if (!result) { + for (pad = 0; pad < MAX_PADS; pad++) { + if (acl_handle_ok(ds3pad[pad].hci_handle_)) + break; + } + + if (pad >= MAX_PADS) { + DPRINTF("L2CAP Wrong Handle = 0x%x\n", ((l2cap_buf[0] | (l2cap_buf[1] << 8)))); + return pad; + } + + if (acl_handle_ok(ds3pad[pad].hci_handle_)) { + if (l2cap_control) { + DPRINTF("L2CAP Signaling Command = 0x%x pad %d\n", l2cap_buf[8], pad); + if (l2cap_command_reject) { + DPRINTF("ID = 0x%x", l2cap_buf[9]); + DPRINTF(" Reason = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF(" DATA = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + } else if (l2cap_connection_request) { + DPRINTF("Connection Request ID = 0x%x", l2cap_buf[9]); + DPRINTF(" PSM = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF(" SCID = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_WRITE) { + ds3pad[pad].command_dcid_ = l2cap_buf[14] | (l2cap_buf[15] << 8); + l2cap_connect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); + l2cap_event_status_ |= L2CAP_EV_COMMAND_CONNECTED; + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_READ) { + ds3pad[pad].interrupt_dcid_ = l2cap_buf[14] | (l2cap_buf[15] << 8); + l2cap_connect_response(l2cap_buf[9], interrupt_scid_, ds3pad[pad].interrupt_dcid_, pad); + l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONNECTED; + } + } else if (l2cap_configuration_request) { + + DPRINTF("Conf Request ID = 0x%x\n", l2cap_buf[9]); + DPRINTF(" LEN = 0x%x", (l2cap_buf[10] | (l2cap_buf[11] << 8))); + DPRINTF(" SCID = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF(" FLAG = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { + l2cap_event_status_ |= L2CAP_EV_COMMAND_CONFIG_REQ; + l2cap_config_response(l2cap_buf[9], ds3pad[pad].command_dcid_, pad); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { + l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONFIG_REQ; + l2cap_config_response(l2cap_buf[9], ds3pad[pad].interrupt_dcid_, pad); + } + } else if (l2cap_configuration_response) { + + DPRINTF("Conf Response ID = 0x%x\n", l2cap_buf[9]); + DPRINTF(" LEN = 0x%x", (l2cap_buf[10] | (l2cap_buf[11] << 8))); + DPRINTF(" SCID = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF(" FLAG = 0x%x", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + DPRINTF(" RESULT = 0x%x\n", (l2cap_buf[16] | (l2cap_buf[17] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { + l2cap_event_status_ |= L2CAP_EV_COMMAND_CONFIGURED; + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { + l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONFIGURED; + } + } else if (l2cap_disconnect_request) { + DPRINTF("Disconnect Req SCID = 0x%x\n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + + ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { + l2cap_event_status_ |= L2CAP_EV_COMMAND_DISCONNECT_REQ; + l2cap_disconnect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { + l2cap_event_status_ |= L2CAP_EV_INTERRUPT_DISCONNECT_REQ; + l2cap_disconnect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); + } + } + } else if (l2cap_interrupt) { + readReport(l2cap_buf, bytes, pad); + } else if (l2cap_command) { + if (hid_handshake_success) { + hid_flags_ |= HID_FLAG_COMMAND_SUCCESS; + } + } + } // acl_handle_ok + } // !rcode + + return pad; +} + +static void L2CAP_task(uint8_t pad) +{ + if (pad >= MAX_PADS) + return; + + switch (ds3pad[pad].l2cap_state_) { + case L2CAP_INIT_STATE: + DPRINTF("L2CAP_I\n"); + l2cap_event_status_ &= ~L2CAP_EV_COMMAND_DISCONNECT_REQ; + l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_DISCONNECT_REQ; + ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_CONNECTING_STATE; + + case L2CAP_CONTROL_CONNECTING_STATE: + DPRINTF("L2CAP_C1 \n"); + if (l2cap_command_connected) { + l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONFIG_REQ; + ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_REQUEST_STATE; + } + break; + + case L2CAP_CONTROL_REQUEST_STATE: + DPRINTF("L2CAP_C2\n"); + if (l2cap_command_request) { + l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONFIGURED; + l2cap_configure(ds3pad[pad].command_dcid_, pad); + ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_CONFIGURING_STATE; + } + break; + + case L2CAP_CONTROL_CONFIGURING_STATE: + DPRINTF("L2CAP_C3\n"); + if (l2cap_command_configured) { + l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONNECTED; + ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_CONNECTING_STATE; + } + break; + + + case L2CAP_INTERRUPT_CONNECTING_STATE: + DPRINTF("L2CAP_I1\n"); + if (l2cap_interrupt_connected) { + l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONFIG_REQ; + l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONFIGURED; + ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_REQUEST_STATE; + } + break; + + case L2CAP_INTERRUPT_REQUEST_STATE: + DPRINTF("L2CAP_I2\n"); + if (l2cap_interrupt_request) { + l2cap_configure(ds3pad[pad].interrupt_dcid_, pad); + ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_CONFIGURING_STATE; + } + break; + + case L2CAP_INTERRUPT_CONFIGURING_STATE: + DPRINTF("L2CAP_I3\n"); + if (l2cap_interrupt_configured) { + ds3pad[pad].l2cap_state_ = L2CAP_CONNECTED_STATE; + } else + break; + + /* Established L2CAP */ + case L2CAP_CONNECTED_STATE: + DPRINTF("L2CAP_S\n"); + hid_flags_ = 0; + + initPSController(pad); + ds3pad[pad].l2cap_state_ = L2CAP_LED_STATE; + break; + + case L2CAP_LED_STATE: + if (hid_command_success) { + LED((pad + 1) << 1, pad); + ds3pad[pad].l2cap_state_ = L2CAP_READY_STATE; + ds3pad[pad].status_ |= DS3BT_STATE_RUNNING; + } + break; + + case L2CAP_READY_STATE: + break; + + case L2CAP_DISCONNECT_STATE: + DPRINTF("L2CAP_D\n"); + if (l2cap_interrupt_disconnected || l2cap_command_disconnected) { + ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; + } + break; + + default: + break; + } +} + +/************************************************************/ +/* L2CAP Commands */ +/************************************************************/ +static uint8_t l2cap_connect_response(uint8_t rxid, uint16_t dcid, uint16_t scid, uint8_t pad) +{ + uint8_t cmd_buf[12]; + + cmd_buf[0] = L2CAP_CMD_CONNECTION_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x08; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID (Our) + cmd_buf[5] = (uint8_t)(dcid >> 8); + cmd_buf[6] = (uint8_t)(scid & 0xff); // Source CID (PS Remote) + cmd_buf[7] = (uint8_t)(scid >> 8); + cmd_buf[8] = 0x00; // Result + cmd_buf[9] = 0x00; + cmd_buf[10] = 0x00; // Status + cmd_buf[11] = 0x00; + + return L2CAP_Command((uint8_t *)cmd_buf, 12, pad); +} + +static uint8_t l2cap_configure(uint16_t dcid, uint8_t pad) +{ + uint8_t cmd_buf[12]; + + cmd_buf[0] = L2CAP_CMD_CONFIG_REQUEST; // Code + cmd_buf[1] = (uint8_t)(l2cap_txid_++); // Identifier + cmd_buf[2] = 0x08; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID + cmd_buf[5] = (uint8_t)(dcid >> 8); + cmd_buf[6] = 0x00; // Flags + cmd_buf[7] = 0x00; + cmd_buf[8] = 0x01; // Config Opt: type = MTU (Maximum Transmission Unit) + cmd_buf[9] = 0x02; // Config Opt: length + cmd_buf[10] = 0x40; // Config Opt: data = maximum SDU size is 672 octets + cmd_buf[11] = 0x00; + + return L2CAP_Command((uint8_t *)cmd_buf, 12, pad); +} + +static uint8_t l2cap_config_response(uint8_t rxid, uint16_t dcid, uint8_t pad) +{ + uint8_t cmd_buf[10]; + + cmd_buf[0] = L2CAP_CMD_CONFIG_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x06; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (uint8_t)(dcid & 0xff); // Source CID + cmd_buf[5] = (uint8_t)(dcid >> 8); + cmd_buf[6] = 0x00; // Result + cmd_buf[7] = 0x00; + cmd_buf[8] = 0x00; // Config + cmd_buf[9] = 0x00; + + return L2CAP_Command((uint8_t *)cmd_buf, 10, pad); +} + +static uint8_t l2cap_disconnect_response(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad) +{ + uint8_t cmd_buf[8]; + + cmd_buf[0] = L2CAP_CMD_DISCONNECT_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x04; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID + cmd_buf[5] = (uint8_t)(dcid >> 8); + cmd_buf[6] = (uint8_t)(scid & 0xff); // Source CID + cmd_buf[7] = (uint8_t)(scid >> 8); + + return L2CAP_Command((uint8_t *)cmd_buf, 8, pad); +} + +static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) +{ + l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag + l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); + l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length + l2cap_cmd_buf[3] = (uint8_t)((4 + length) >> 8); + l2cap_cmd_buf[4] = (uint8_t)(length & 0xff); // L2CAP header: Length + l2cap_cmd_buf[5] = (uint8_t)(length >> 8); + l2cap_cmd_buf[6] = 0x01; // L2CAP header: Channel ID + l2cap_cmd_buf[7] = 0x00; // L2CAP Signalling channel over ACL-U logical link + + mips_memcpy(&l2cap_cmd_buf[8], data, length); + + // output on endpoint 2 + return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), NULL, NULL); +} + +/************************************************************/ +/* HID Commands */ +/************************************************************/ + +static uint8_t initPSController(int pad) +{ + uint8_t header = 2; + uint8_t init_buf[header + PS3_F4_REPORT_LEN]; + uint8_t i; + init_buf[0] = HID_THDR_SET_REPORT_FEATURE; // THdr + init_buf[1] = PS3_F4_REPORT_ID; // Report ID + + for (i = 0; i < PS3_F4_REPORT_LEN; i++) { + init_buf[header + i] = (uint8_t)feature_F4_report[i]; + } + + return writeReport((uint8_t *)init_buf, header + PS3_F4_REPORT_LEN, pad); +} + +#define DATA_START 11 + +static void readReport(uint8_t *data, int bytes, int pad) +{ + if (hid_input_report) { + ds3pad[pad].data[0] = ~data[DATA_START + ButtonStateL]; + ds3pad[pad].data[1] = ~data[DATA_START + ButtonStateH]; + + ds3pad[pad].data[2] = data[DATA_START + RightStickX]; //rx + ds3pad[pad].data[3] = data[DATA_START + RightStickY]; //ry + ds3pad[pad].data[4] = data[DATA_START + LeftStickX]; //lx + ds3pad[pad].data[5] = data[DATA_START + LeftStickY]; //ly + + if (bytes == 21 && !press_emu) + press_emu = 1; + + if (press_emu) //needs emulating pressure buttons + { + ds3pad[pad].data[6] = ((data[DATA_START + ButtonStateL] >> 5) & 1) * 255; //right + ds3pad[pad].data[7] = ((data[DATA_START + ButtonStateL] >> 7) & 1) * 255; //left + ds3pad[pad].data[8] = ((data[DATA_START + ButtonStateL] >> 4) & 1) * 255; //up + ds3pad[pad].data[9] = ((data[DATA_START + ButtonStateL] >> 6) & 1) * 255; //down + + ds3pad[pad].data[10] = ((data[DATA_START + ButtonStateH] >> 4) & 1) * 255; //triangle + ds3pad[pad].data[11] = ((data[DATA_START + ButtonStateH] >> 5) & 1) * 255; //circle + ds3pad[pad].data[12] = ((data[DATA_START + ButtonStateH] >> 6) & 1) * 255; //cross + ds3pad[pad].data[13] = ((data[DATA_START + ButtonStateH] >> 7) & 1) * 255; //square + + ds3pad[pad].data[14] = ((data[DATA_START + ButtonStateH] >> 2) & 1) * 255; //L1 + ds3pad[pad].data[15] = ((data[DATA_START + ButtonStateH] >> 3) & 1) * 255; //R1 + ds3pad[pad].data[16] = ((data[DATA_START + ButtonStateH] >> 0) & 1) * 255; //L2 + ds3pad[pad].data[17] = ((data[DATA_START + ButtonStateH] >> 1) & 1) * 255; //R2 + } else { + ds3pad[pad].data[6] = data[DATA_START + PressureRight]; //right + ds3pad[pad].data[7] = data[DATA_START + PressureLeft]; //left + ds3pad[pad].data[8] = data[DATA_START + PressureUp]; //up + ds3pad[pad].data[9] = data[DATA_START + PressureDown]; //down + + ds3pad[pad].data[10] = data[DATA_START + PressureTriangle]; //triangle + ds3pad[pad].data[11] = data[DATA_START + PressureCircle]; //circle + ds3pad[pad].data[12] = data[DATA_START + PressureCross]; //cross + ds3pad[pad].data[13] = data[DATA_START + PressureSquare]; //square + + ds3pad[pad].data[14] = data[DATA_START + PressureL1]; //L1 + ds3pad[pad].data[15] = data[DATA_START + PressureR1]; //R1 + ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 + ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 + + if (data[DATA_START + PSButtonState]) //display battery level + ds3pad[pad].oldled = ~(1 << data[DATA_START + Power]) & 0x1E; + else + ds3pad[pad].oldled = (pad + 1) << 1; + + if (data[DATA_START + Power] == 0xEE) //charging + ds3pad[pad].oldled |= 0x80; + else + ds3pad[pad].oldled &= 0x7F; + } + } else { + DPRINTF("Unmanaged Input Report: THDR 0x%x ", data[8]); + DPRINTF(" ID 0x%x\n", data[9]); + } +} // readReport + +static uint8_t writeReport(uint8_t *data, uint8_t length, int pad) +{ + l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag + l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); + l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length + l2cap_cmd_buf[3] = (uint8_t)((4 + length) >> 8); + l2cap_cmd_buf[4] = (uint8_t)(length & 0xff); // L2CAP header: Length + l2cap_cmd_buf[5] = (uint8_t)(length >> 8); + l2cap_cmd_buf[6] = (uint8_t)(ds3pad[pad].command_dcid_ & 0xff); // L2CAP header: Channel ID + l2cap_cmd_buf[7] = (uint8_t)(ds3pad[pad].command_dcid_ >> 8); + + mips_memcpy(&l2cap_cmd_buf[8], data, length); + + hid_flags_ &= ~HID_FLAG_COMMAND_SUCCESS; + + // output on endpoint 2 + return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), l2cap_cmd_cb, (void *)pad); +} // writeReport + +static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) +{ + uint8_t led_buf[PS3_01_REPORT_LEN + 2]; + + led_buf[0] = ds3pad[pad].type; // THdr + led_buf[1] = PS3_01_REPORT_ID; // Report ID + + mips_memcpy(&led_buf[2], output_01_report, sizeof(output_01_report)); // PS3_01_REPORT_LEN); + + led_buf[2 + 1] = 0xFE; //rt + led_buf[2 + 2] = rrum; //rp + led_buf[2 + 3] = 0xFE; //lt + led_buf[2 + 4] = lrum; //lp + + led_buf[2 + 9] = led & 0x7F; //LED Conf + + if (led & 0x80) //msb means charging, so blink + { + led_buf[2 + 13] = 0x32; + led_buf[2 + 18] = 0x32; + led_buf[2 + 23] = 0x32; + led_buf[2 + 28] = 0x32; + } + + ds3pad[pad].oldled = led; + ds3pad[pad].oldlrumble = lrum; + ds3pad[pad].oldrrumble = rrum; + + return writeReport((uint8_t *)led_buf, sizeof(output_01_report) /*PS3_01_REPORT_LEN*/ + 2, pad); +} +/************************************************************/ +/* DS3BT Commands */ +/************************************************************/ + +static uint8_t LED(uint8_t led, int pad) +{ + return LEDRumble(led, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); +} + +static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad) +{ + uint8_t ret; + + ret = LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); + WaitSema(bt_dev.l2cap_sema); + if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); + WaitSema(bt_dev.l2cap_sema); + } + return ret; +} + +void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port) +{ + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) + return; + + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + + Rumble(lrum, rrum, port); + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); +} + +void ds3bt_get_data(char *dst, int size, int port) +{ + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) + return; + + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)port); + + WaitSema(bt_dev.l2cap_sema); + + mips_memcpy(dst, ds3pad[port].data, size); + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); +} + +void ds3bt_reset() +{ + uint8_t i; + + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) + return; + + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + + for (i = 0; i < MAX_PADS; i++) { + if ((ds3pad[i].status_ & DS3BT_STATE_CONNECTED) || (ds3pad[i].status_ & DS3BT_STATE_RUNNING)) { + ds3pad[i].status_ &= ~DS3BT_STATE_RUNNING; + ds3pad[i].l2cap_state_ = L2CAP_DOWN_STATE; + + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + hci_disconnect(ds3pad[i].hci_handle_); + WaitSema(bt_dev.hci_sema); + } + } + + hci_reset(); + + WaitSema(bt_dev.hci_sema); + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); + + DelayThread(1000000); +} + +int ds3bt_get_status(int port) +{ + int status = bt_dev.status; + + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) + return status; + + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + + status |= ds3pad[port].status_; + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); + + return status; +} + +int ds3bt_init(uint8_t pads) +{ + int ret; + + enable_pad = pads; + + ret = UsbRegisterDriver(&bt_driver); + + if (ret != USB_RC_OK) { + DPRINTF("BT: Error registering USB devices\n"); + return 0; + } + + UsbRegisterDriver(&chrg_driver); + + return 1; +} diff --git a/modules/pademu/ds3bt.h b/modules/pademu/ds3bt.h new file mode 100644 index 000000000..3ca481c0b --- /dev/null +++ b/modules/pademu/ds3bt.h @@ -0,0 +1,273 @@ +#ifndef _DS3BT_H_ +#define _DS3BT_H_ + +#include "types.h" +#include "usbd.h" + +typedef u8 uint8_t; +typedef u16 uint16_t; + +enum eHCI { + // {{{ + /* Bluetooth HCI states for HCI_task() */ + HCI_INIT_STATE = 0, + HCI_RESET_STATE, + HCI_CONNECT_IN_STATE, + HCI_CHANGE_CONNECTION, + HCI_READ_REMOTE_SUPPORTED_FEATURES, + HCI_CONNECTED_STATE, + + /* HCI OpCode Group Field (OGF) */ + HCI_OGF_LINK_CNTRL = (0x01 << 2), // OGF: Link Control Commands + HCI_OGF_LINK_POLICY = (0x02 << 2), // OGF: Link Policy Commands + HCI_OGF_CTRL_BBAND = (0x03 << 2), // OGF: Controller & Baseband Commands + HCI_OGF_INFO_PARAM = (0x04 << 2), // OGF: Informational Parameters + + /* HCI OpCode Command Field (OCF) */ + HCI_OCF_ACCEPT_CONNECTION = 0x09, // OGF = 0x01 + HCI_OCF_REJECT_CONNECTION = 0x0A, // OGF = 0x01 + HCI_OCF_CHANGE_CONNECTION_TYPE = 0x0F, // OGF = 0x01 + HCI_OCF_RESET = 0x03, // OGF = 0x03 + HCI_OCF_WRITE_ACCEPT_TIMEOUT = 0x16, // OGF = 0x03 + HCI_OCF_WRITE_SCAN_ENABLE = 0x1A, // OGF = 0x03 + + /* HCI events managed */ + HCI_EVENT_CONNECT_COMPLETE = 0x03, + HCI_EVENT_CONNECT_REQUEST = 0x04, + HCI_EVENT_DISCONN_COMPLETE = 0x05, + HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE = 0x0B, + HCI_EVENT_QOS_SETUP_COMPLETE = 0x0d, // do nothing + HCI_EVENT_COMMAND_COMPLETE = 0x0e, + HCI_EVENT_COMMAND_STATUS = 0x0f, + HCI_EVENT_ROLE_CHANGED = 0x12, + HCI_EVENT_NUM_COMPLETED_PKT = 0x13, // do nothing + HCI_EVENT_CHANGED_CONNECTION_TYPE = 0x1D, + HCI_EVENT_PAGE_SR_CHANGED = 0x20, + HCI_EVENT_MAX_SLOT_CHANGE = 0x1B, //Max Slots Change event + + /* HCI event flags for hci_event_flag */ + HCI_FLAG_COMMAND_COMPLETE = 0x01, + HCI_FLAG_COMMAND_STATUS = 0x02, + HCI_FLAG_CONNECT_COMPLETE = 0x04, + HCI_FLAG_DISCONN_COMPLETE = 0x08, + HCI_FLAG_INCOMING_REQUEST = 0x10, + HCI_FLAG_READ_BDADDR = 0x20, + + /* HCI Scan Enable Parameters */ + SCAN_ENABLE_NOINQ_NOPAG = 0x00, + SCAN_ENABLE_ENINQ_NOPAG = 0x01, + SCAN_ENABLE_NOINQ_ENPAG = 0x02, + SCAN_ENABLE_ENINQ_ENPAG = 0x03, + + // used in control endpoint header for HCI Commands + bmREQ_HCI_OUT = (USB_DIR_OUT | + USB_TYPE_CLASS | + USB_RECIP_DEVICE), + HCI_COMMAND_REQ = 0, + // }}} +}; + +enum eL2CAP { + // {{{ + /* Bluetooth L2CAP PSM */ + L2CAP_PSM_WRITE = 0x11, // HID_Control + L2CAP_PSM_READ = 0x13, // HID_Interrupt + + /* Bluetooth L2CAP states for L2CAP_task() */ + L2CAP_DOWN_STATE = 0, + L2CAP_INIT_STATE, + L2CAP_CONTROL_CONNECTING_STATE, + L2CAP_CONTROL_REQUEST_STATE, + L2CAP_CONTROL_CONFIGURING_STATE, + L2CAP_INTERRUPT_CONNECTING_STATE, + L2CAP_INTERRUPT_REQUEST_STATE, + L2CAP_INTERRUPT_CONFIGURING_STATE, + L2CAP_CONNECTED_STATE, + L2CAP_LED_STATE, + L2CAP_READY_STATE, + L2CAP_DISCONNECT_STATE, + + /* L2CAP event flags */ + L2CAP_EV_COMMAND_CONNECTED = 0x01, + L2CAP_EV_COMMAND_CONFIG_REQ = 0x02, + L2CAP_EV_COMMAND_CONFIGURED = 0x04, + L2CAP_EV_COMMAND_DISCONNECT_REQ = 0x08, + L2CAP_EV_INTERRUPT_CONNECTED = 0x10, + L2CAP_EV_INTERRUPT_CONFIG_REQ = 0x20, + L2CAP_EV_INTERRUPT_CONFIGURED = 0x40, + L2CAP_EV_INTERRUPT_DISCONNECT_REQ = 0x80, + + /* L2CAP signaling command */ + L2CAP_CMD_COMMAND_REJECT = 0x01, + L2CAP_CMD_CONNECTION_REQUEST = 0x02, + L2CAP_CMD_CONNECTION_RESPONSE = 0x03, + L2CAP_CMD_CONFIG_REQUEST = 0x04, + L2CAP_CMD_CONFIG_RESPONSE = 0x05, + L2CAP_CMD_DISCONNECT_REQUEST = 0x06, + L2CAP_CMD_DISCONNECT_RESPONSE = 0x07, + + /* HCI ACL Data Packet + * + * buf[0] buf[1] buf[2] buf[3] + * 0 4 8 11 12 16 24 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | HCI Handle |PB |BC | Data Total Length | HCI ACL Data Packet + * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * + * buf[4] buf[5] buf[6] buf[7] + * 0 8 16 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | Length | Channel ID | Basic L2CAP header + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * + * buf[8] buf[9] buf[10] buf[11] + * 0 8 16 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | Code | Identifier | Length | Control frame (C-frame) + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. (signaling packet format) + */ + // }}} +}; + +enum eHID { + // {{{ + /* HID event flag */ + HID_FLAG_STATUS_REPORTED = 0x01, + HID_FLAG_BUTTONS_CHANGED = 0x02, + HID_FLAG_EXTENSION = 0x04, + HID_FLAG_COMMAND_SUCCESS = 0x08, + + /* Bluetooth HID Transaction Header (THdr) */ + HID_THDR_GET_REPORT_FEATURE = 0x43, + HID_THDR_SET_REPORT_OUTPUT = 0x52, + HID_THDR_SET_REPORT_FEATURE = 0x53, + HID_THDR_DATA_INPUT = 0xa1, + + /* Defines of various parameters for PS3 Game controller reports */ + PS3_F4_REPORT_ID = 0xF4, + PS3_F4_REPORT_LEN = 0x04, + + PS3_01_REPORT_ID = 0x01, + PS3_01_REPORT_LEN = 0x30, + // }}} +}; + +enum eDS3BTLEDRumble { + psLEDN = 0x00, + psLED1 = 0x02, + psLED2 = 0x04, + psLED3 = 0x08, + psLED4 = 0x0F, + psLEDA = 0x10, +}; + +enum eDS3BTStatus { + DS3BT_STATE_USB_DISCONNECTED = 0x00, + DS3BT_STATE_USB_AUTHORIZED = 0x01, + DS3BT_STATE_USB_CONFIGURED = 0x02, + DS3BT_STATE_CONNECTED = 0x04, + DS3BT_STATE_RUNNING = 0x08, +}; + +//Structure which describes the type 01 input report +enum TYPE_01_REPORT { + ButtonStateL = 0, // Main buttons Low + ButtonStateH, // Main buttons High + PSButtonState, // PS button + Reserved1, // Unknown + LeftStickX, // left Joystick X axis 0 - 255, 128 is mid + LeftStickY, // left Joystick Y axis 0 - 255, 128 is mid + RightStickX, // right Joystick X axis 0 - 255, 128 is mid + RightStickY, // right Joystick Y axis 0 - 255, 128 is mid + Reserved2, // Unknown + Reserved3, // Unknown + Reserved4, // Unknown + Reserved5, // Unknown + PressureUp, // digital Pad Up button Pressure 0 - 255 + PressureRight, // digital Pad Right button Pressure 0 - 255 + PressureDown, // digital Pad Down button Pressure 0 - 255 + PressureLeft, // digital Pad Left button Pressure 0 - 255 + PressureL2, // digital Pad L2 button Pressure 0 - 255 + PressureR2, // digital Pad R2 button Pressure 0 - 255 + PressureL1, // digital Pad L1 button Pressure 0 - 255 + PressureR1, // digital Pad R1 button Pressure 0 - 255 + PressureTriangle, // digital Pad Triangle button Pressure 0 - 255 + PressureCircle, // digital Pad Circle button Pressure 0 - 255 + PressureCross, // digital Pad Cross button Pressure 0 - 255 + PressureSquare, // digital Pad Square button Pressure 0 - 255 + Reserved6, // Unknown + Reserved7, // Unknown + Reserved8, // Unknown + Charge, // charging status ? 02 = charge, 03 = normal + Power, // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging + Connection, // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble + Reserved9, // Unknown + Reserved10, // Unknown + Reserved11, // Unknown + Reserved12, // Unknown + Reserved13, // Unknown + Reserved14, // Unknown + Reserved15, // Unknown + Reserved16, // Unknown + Reserved17, // Unknown + AccelXH, // X axis accelerometer Big Endian 0 - 1023 + AccelXL, // Low + AccelYH, // Y axis accelerometer Big Endian 0 - 1023 + AccelYL, // Low + AccelZH, // Z Accelerometer Big Endian 0 - 1023 + AccelZL, // Low + GyroZH, // Z axis Gyro Big Endian 0 - 1023 + GyroZL, // Low +}; + +enum eBUF_SIZE { + MAX_BUFFER_SIZE = 64, // Size of general purpose data buffer +}; + +/* HCI macro */ +#define hci_timeout (hci_counter_-- == 0) + +/* Macros for HCI event flag tests */ +#define hci_command_complete (hci_event_flag_ & HCI_FLAG_COMMAND_COMPLETE) +#define hci_command_status (hci_event_flag_ & HCI_FLAG_COMMAND_STATUS) +#define hci_connect_complete (hci_event_flag_ & HCI_FLAG_CONNECT_COMPLETE) +#define hci_disconn_complete (hci_event_flag_ & HCI_FLAG_DISCONN_COMPLETE) +#define hci_incoming_connect_request (hci_event_flag_ & HCI_FLAG_INCOMING_REQUEST) +#define hci_read_bdaddr_complete (hci_event_flag_ & HCI_FLAG_READ_BDADDR) + +/* Macros for L2CAP event flag tests */ +#define l2cap_command_connected (l2cap_event_status_ & L2CAP_EV_COMMAND_CONNECTED) +#define l2cap_command_request (l2cap_event_status_ & L2CAP_EV_COMMAND_CONFIG_REQ) +#define l2cap_command_configured (l2cap_event_status_ & L2CAP_EV_COMMAND_CONFIGURED) +#define l2cap_command_disconnected (l2cap_event_status_ & L2CAP_EV_COMMAND_DISCONNECT_REQ) +#define l2cap_interrupt_connected (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONNECTED) +#define l2cap_interrupt_request (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONFIG_REQ) +#define l2cap_interrupt_configured (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONFIGURED) +#define l2cap_interrupt_disconnected (l2cap_event_status_ & L2CAP_EV_INTERRUPT_DISCONNECT_REQ) + +/* Macros for L2CAP event task tests */ +#define acl_handle_ok(handle) ((l2cap_buf[0] | (l2cap_buf[1] << 8)) == ((handle & 0x0FFF) | 0x2000)) +#define l2cap_control ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == 0x0001) // Channel ID for ACL-U +#define l2cap_interrupt ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == interrupt_scid_) +#define l2cap_command ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == command_scid_) +#define l2cap_command_reject (l2cap_buf[8] == L2CAP_CMD_COMMAND_REJECT) +#define l2cap_connection_request (l2cap_buf[8] == L2CAP_CMD_CONNECTION_REQUEST) +#define l2cap_configuration_request (l2cap_buf[8] == L2CAP_CMD_CONFIG_REQUEST) +#define l2cap_configuration_response (l2cap_buf[8] == L2CAP_CMD_CONFIG_RESPONSE) +#define l2cap_configuration_success ((l2cap_buf[16] | (l2cap_buf[17] << 8)) == 0x0000) +#define l2cap_disconnect_request (l2cap_buf[8] == L2CAP_CMD_DISCONNECT_REQUEST) + +/* Macros for HID event flag tests */ +#define hid_buttons_changed (hid_flags_ & HID_FLAG_BUTTONS_CHANGED) +#define hid_extension (hid_flags_ & HID_FLAG_EXTENSION) +#define hid_command_success (hid_flags_ & HID_FLAG_COMMAND_SUCCESS) +#define hid_handshake_success (l2cap_buf[8] == 0) +#define hid_input_report ((data[8] == HID_THDR_DATA_INPUT) & (data[9] == PS3_01_REPORT_ID)) + +int ds3bt_init(uint8_t pads); +int ds3bt_get_status(int port); +void ds3bt_reset(); +void ds3bt_get_data(char *dst, int size, int port); +void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port); + +#endif diff --git a/modules/pademu/ds3usb.c b/modules/pademu/ds3usb.c new file mode 100644 index 000000000..6813686bd --- /dev/null +++ b/modules/pademu/ds3usb.c @@ -0,0 +1,383 @@ +#include "types.h" +#include "ioman.h" +#include "intrman.h" +#include "loadcore.h" +#include "stdio.h" +#include "sifcmd.h" +#include "sifrpc.h" +#include "sysclib.h" +#include "sysmem.h" +#include "usbd.h" +#include "usbd_macro.h" +#include "thbase.h" +#include "thevent.h" +#include "thsemap.h" +#include "sifman.h" +#include "vblank.h" +#include "ds3usb.h" +#include "sys_utils.h" + +//#define DPRINTF(x...) printf(x) +#define DPRINTF(x...) + +#define MAX_PADS 2 + +static uint8_t output_01_report[] = + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; + +static uint8_t usb_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; + +int usb_probe(int devId); +int usb_connect(int devId); +int usb_disconnect(int devId); + +static void usb_release(int pad); +static void usb_config_set(int result, int count, void *arg); + +UsbDriver usb_driver = {NULL, NULL, "ds3usb", usb_probe, usb_connect, usb_disconnect}; + +static void DS3USB_init(int pad); +static void readReport(uint8_t *data, int pad); +static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); +static uint8_t LED(uint8_t led, int pad); +static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad); + +typedef struct _usb_ds3 +{ + int devId; + int sema; + int controlEndp; + int eventEndp; + uint8_t status; + uint8_t oldled; + uint8_t oldlrumble; + uint8_t oldrrumble; + uint8_t data[18]; + uint8_t enabled; +} ds3usb_device; + +ds3usb_device ds3pad[MAX_PADS]; + +int usb_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + + DPRINTF("DS3USB: probe: devId=%i\n", devId); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("DS3USB: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->idVendor == 0x054C && device->idProduct == 0x0268) + return 1; + + return 0; +} + +int usb_connect(int devId) +{ + int pad, epCount; + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + UsbInterfaceDescriptor *interface; + UsbEndpointDescriptor *endpoint; + iop_sema_t SemaData; + + DPRINTF("DS3USB: connect: devId=%i\n", devId); + + for (pad = 0; pad < MAX_PADS; pad++) { + if (ds3pad[pad].devId == -1 && ds3pad[pad].enabled) + break; + } + + if (pad >= MAX_PADS) { + DPRINTF("DS3USB: Error - only %d device allowed !\n", MAX_PADS); + return 1; + } + + ds3pad[pad].devId = devId; + + ds3pad[pad].status = DS3USB_STATE_AUTHORIZED; + + ds3pad[pad].controlEndp = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + epCount = interface->bNumEndpoints - 1; + + endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); + + do { + + if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && ds3pad[pad].eventEndp < 0) { + ds3pad[pad].eventEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("BT: register Event endpoint id =%i addr=%02X packetSize=%i\n", ds3pad[pad].eventEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + break; + } + } + + endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); + + } while (epCount--); + + if (ds3pad[pad].eventEndp < 0) { + usb_release(pad); + return 1; + } + + SemaData.initial = 1; + SemaData.max = 1; + SemaData.option = 0; + SemaData.attr = 0; + + if ((ds3pad[pad].sema = CreateSema(&SemaData)) < 0) { + DPRINTF("DS3USB: Failed to allocate I/O semaphore.\n"); + return -1; + } + + ds3pad[pad].status |= DS3USB_STATE_CONNECTED; + + UsbSetDeviceConfiguration(ds3pad[pad].controlEndp, config->bConfigurationValue, usb_config_set, (void *)pad); + + return 0; +} + +int usb_disconnect(int devId) +{ + uint8_t pad; + + DPRINTF("DS3USB: disconnect: devId=%i\n", devId); + + for (pad = 0; pad < MAX_PADS; pad++) { + if (ds3pad[pad].devId == devId) + break; + } + + if (pad < MAX_PADS && (ds3pad[pad].status & DS3USB_STATE_AUTHORIZED)) + usb_release(pad); + + return 0; +} + +static void usb_release(int pad) +{ + if (ds3pad[pad].eventEndp >= 0) + UsbCloseEndpoint(ds3pad[pad].eventEndp); + + if (ds3pad[pad].sema >= 0) + DeleteSema(ds3pad[pad].sema); + + ds3pad[pad].controlEndp = -1; + ds3pad[pad].eventEndp = -1; + ds3pad[pad].devId = -1; + ds3pad[pad].status = DS3USB_STATE_DISCONNECTED; +} + +static void usb_data_cb(int resultCode, int bytes, void *arg) +{ + int pad = (int)arg; + + //DPRINTF("usb_data_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + if (!resultCode) + readReport(usb_buf, pad); + + SignalSema(ds3pad[pad].sema); +} + +static void usb_cmd_cb(int resultCode, int bytes, void *arg) +{ + int pad = (int)arg; + + //DPRINTF("usb_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + SignalSema(ds3pad[pad].sema); +} + +static void usb_config_set(int result, int count, void *arg) +{ + int pad = (int)arg; + + ds3pad[pad].status |= DS3USB_STATE_CONFIGURED; + + DS3USB_init(pad); + + DelayThread(10000); + + LED((pad + 1) << 1, pad); + + ds3pad[pad].status |= DS3USB_STATE_RUNNING; +} + +static void DS3USB_init(int pad) +{ + usb_buf[0] = 0x42; + usb_buf[1] = 0x0c; + usb_buf[2] = 0x00; + usb_buf[3] = 0x00; + + UsbControlTransfer(ds3pad[pad].controlEndp, bmREQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF4, 0, 4, usb_buf, NULL, NULL); +} + +#define DATA_START 2 + +static void readReport(uint8_t *data, int pad) +{ + if (data[0]) { + ds3pad[pad].data[0] = ~data[DATA_START + ButtonStateL]; + ds3pad[pad].data[1] = ~data[DATA_START + ButtonStateH]; + + ds3pad[pad].data[2] = data[DATA_START + RightStickX]; //rx + ds3pad[pad].data[3] = data[DATA_START + RightStickY]; //ry + ds3pad[pad].data[4] = data[DATA_START + LeftStickX]; //lx + ds3pad[pad].data[5] = data[DATA_START + LeftStickY]; //ly + + ds3pad[pad].data[6] = data[DATA_START + PressureRight]; //right + ds3pad[pad].data[7] = data[DATA_START + PressureLeft]; //left + ds3pad[pad].data[8] = data[DATA_START + PressureUp]; //up + ds3pad[pad].data[9] = data[DATA_START + PressureDown]; //down + + ds3pad[pad].data[10] = data[DATA_START + PressureTriangle]; //triangle + ds3pad[pad].data[11] = data[DATA_START + PressureCircle]; //circle + ds3pad[pad].data[12] = data[DATA_START + PressureCross]; //cross + ds3pad[pad].data[13] = data[DATA_START + PressureSquare]; //square + + ds3pad[pad].data[14] = data[DATA_START + PressureL1]; //L1 + ds3pad[pad].data[15] = data[DATA_START + PressureR1]; //R1 + ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 + ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 + + if (data[DATA_START + PSButtonState]) //display battery level + ds3pad[pad].oldled = ~(1 << data[DATA_START + Power]) & 0x1E; + else + ds3pad[pad].oldled = (pad + 1) << 1; + + if (data[DATA_START + Power] == 0xEE) //charging + ds3pad[pad].oldled |= 0x80; + else + ds3pad[pad].oldled &= 0x7F; + } +} + +static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) +{ + mips_memcpy(usb_buf, output_01_report, sizeof(output_01_report)); + + usb_buf[1] = 0xFE; //rt + usb_buf[2] = rrum; //rp + usb_buf[3] = 0xFE; //lt + usb_buf[4] = lrum; //lp + + usb_buf[9] = led & 0x7F; //LED Conf + + if (led & 0x80) //msb means charging, so blink + { + usb_buf[13] = 0x32; + usb_buf[18] = 0x32; + usb_buf[23] = 0x32; + usb_buf[28] = 0x32; + } + + ds3pad[pad].oldled = led; + ds3pad[pad].oldlrumble = lrum; + ds3pad[pad].oldrrumble = rrum; + + return UsbControlTransfer(ds3pad[pad].controlEndp, bmREQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_SET_REPORT_OUTPUT << 8) | 0x01, 0, sizeof(output_01_report), usb_buf, usb_cmd_cb, (void *)pad); +} + +static uint8_t LED(uint8_t led, int pad) +{ + return LEDRumble(led, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); +} + +static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad) +{ + return LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); +} + +void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port) +{ + WaitSema(ds3pad[port].sema); + + Rumble(lrum, rrum, port); + + WaitSema(ds3pad[port].sema); + + SignalSema(ds3pad[port].sema); +} + +void ds3usb_get_data(char *dst, int size, int port) +{ + WaitSema(ds3pad[port].sema); + + UsbInterruptTransfer(ds3pad[port].eventEndp, usb_buf, MAX_BUFFER_SIZE, usb_data_cb, (void *)port); + + WaitSema(ds3pad[port].sema); + + mips_memcpy(dst, ds3pad[port].data, size); + + SignalSema(ds3pad[port].sema); +} + +void ds3usb_reset() +{ + int pad; + + for (pad = 0; pad < MAX_PADS; pad++) + usb_release(pad); +} + +int ds3usb_get_status(int port) +{ + return ds3pad[port].status; +} + +int ds3usb_init(uint8_t pads) +{ + int ret; + uint8_t pad; + + for (pad = 0; pad < MAX_PADS; pad++) { + ds3pad[pad].status = 0; + ds3pad[pad].devId = -1; + ds3pad[pad].oldled = 0; + ds3pad[pad].oldlrumble = 0; + ds3pad[pad].oldrrumble = 0; + ds3pad[pad].sema = -1; + ds3pad[pad].controlEndp = -1; + ds3pad[pad].eventEndp = -1; + ds3pad[pad].enabled = (pads >> pad) & 1; + + ds3pad[pad].data[0] = 0xFF; + ds3pad[pad].data[1] = 0xFF; + + mips_memset(&ds3pad[pad].data[2], 0x7F, 4); + mips_memset(&ds3pad[pad].data[6], 0x00, 12); + } + + ret = UsbRegisterDriver(&usb_driver); + + if (ret != USB_RC_OK) { + DPRINTF("DS3USB: Error registering USB devices\n"); + return 0; + } + + return 1; +} diff --git a/modules/pademu/ds3usb.h b/modules/pademu/ds3usb.h new file mode 100644 index 000000000..71dff5d0f --- /dev/null +++ b/modules/pademu/ds3usb.h @@ -0,0 +1,116 @@ +#ifndef _DS3USB_H_ +#define _DS3USB_H_ + +#include "types.h" +#include "usbd.h" + +typedef u8 uint8_t; +typedef u16 uint16_t; + +enum eHID { + // {{{ + /* HID event flag */ + HID_FLAG_STATUS_REPORTED = 0x01, + HID_FLAG_BUTTONS_CHANGED = 0x02, + HID_FLAG_EXTENSION = 0x04, + HID_FLAG_COMMAND_SUCCESS = 0x08, + + /* USB HID Transaction Header (THdr) */ + HID_USB_GET_REPORT_FEATURE = 0x03, + HID_USB_SET_REPORT_OUTPUT = 0x02, + HID_USB_DATA_INPUT = 0x01, + + /* Defines of various parameters for PS3 Game controller reports */ + PS3_F4_REPORT_ID = 0xF4, + PS3_F4_REPORT_LEN = 0x04, + + PS3_01_REPORT_ID = 0x01, + PS3_01_REPORT_LEN = 0x30, + // }}} + + bmREQ_USB_OUT = (USB_DIR_OUT | + USB_TYPE_CLASS | + USB_RECIP_INTERFACE), + +}; + + +enum eDS3USBLEDRumble { + psLEDN = 0x00, + psLED1 = 0x02, + psLED2 = 0x04, + psLED3 = 0x08, + psLED4 = 0x0F, + psLEDA = 0x10, +}; + +enum eDS3USBStatus { + DS3USB_STATE_DISCONNECTED = 0x00, + DS3USB_STATE_AUTHORIZED = 0x01, + DS3USB_STATE_CONFIGURED = 0x02, + DS3USB_STATE_CONNECTED = 0x04, + DS3USB_STATE_RUNNING = 0x08, +}; + +//Structure which describes the type 01 input report +enum TYPE_01_REPORT { + ButtonStateL = 0, // Main buttons Low + ButtonStateH, // Main buttons High + PSButtonState, // PS button + Reserved1, // Unknown + LeftStickX, // left Joystick X axis 0 - 255, 128 is mid + LeftStickY, // left Joystick Y axis 0 - 255, 128 is mid + RightStickX, // right Joystick X axis 0 - 255, 128 is mid + RightStickY, // right Joystick Y axis 0 - 255, 128 is mid + Reserved2, // Unknown + Reserved3, // Unknown + Reserved4, // Unknown + Reserved5, // Unknown + PressureUp, // digital Pad Up button Pressure 0 - 255 + PressureRight, // digital Pad Right button Pressure 0 - 255 + PressureDown, // digital Pad Down button Pressure 0 - 255 + PressureLeft, // digital Pad Left button Pressure 0 - 255 + PressureL2, // digital Pad L2 button Pressure 0 - 255 + PressureR2, // digital Pad R2 button Pressure 0 - 255 + PressureL1, // digital Pad L1 button Pressure 0 - 255 + PressureR1, // digital Pad R1 button Pressure 0 - 255 + PressureTriangle, // digital Pad Triangle button Pressure 0 - 255 + PressureCircle, // digital Pad Circle button Pressure 0 - 255 + PressureCross, // digital Pad Cross button Pressure 0 - 255 + PressureSquare, // digital Pad Square button Pressure 0 - 255 + Reserved6, // Unknown + Reserved7, // Unknown + Reserved8, // Unknown + Charge, // charging status ? 02 = charge, 03 = normal + Power, // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging + Connection, // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble + Reserved9, // Unknown + Reserved10, // Unknown + Reserved11, // Unknown + Reserved12, // Unknown + Reserved13, // Unknown + Reserved14, // Unknown + Reserved15, // Unknown + Reserved16, // Unknown + Reserved17, // Unknown + AccelXH, // X axis accelerometer Big Endian 0 - 1023 + AccelXL, // Low + AccelYH, // Y axis accelerometer Big Endian 0 - 1023 + AccelYL, // Low + AccelZH, // Z Accelerometer Big Endian 0 - 1023 + AccelZL, // Low + GyroZH, // Z axis Gyro Big Endian 0 - 1023 + GyroZL, // Low +}; + +enum eBUF_SIZE { + MAX_BUFFER_SIZE = 64, // Size of general purpose data buffer +}; + +int ds3usb_init(uint8_t pads); +int ds3usb_get_status(int port); +void ds3usb_reset(); +void ds3usb_get_data(char *dst, int size, int port); +void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port); + +#endif diff --git a/modules/pademu/exports.tab b/modules/pademu/exports.tab new file mode 100644 index 000000000..114fadaa4 --- /dev/null +++ b/modules/pademu/exports.tab @@ -0,0 +1,4 @@ + +DECLARE_EXPORT_TABLE(pademu, 1, 1) + DECLARE_EXPORT(pademu_hookSio2man) +END_EXPORT_TABLE diff --git a/modules/pademu/imports.lst b/modules/pademu/imports.lst new file mode 100644 index 000000000..3f971a1c0 --- /dev/null +++ b/modules/pademu/imports.lst @@ -0,0 +1,74 @@ + +#include "ioman_mod.h" + +sifcmd_IMPORTS_start +I_sceSifInitRpc +I_sceSifSetRpcQueue +I_sceSifRegisterRpc +I_sceSifRpcLoop +sifcmd_IMPORTS_end + +stdio_IMPORTS_start +I_printf +stdio_IMPORTS_end + +thsemap_IMPORTS_start +I_CreateSema +I_SignalSema +I_WaitSema +I_PollSema +I_DeleteSema +thsemap_IMPORTS_end + +thbase_IMPORTS_start +I_StartThread +I_CreateThread +I_DeleteThread +I_DelayThread +I_GetThreadId +thbase_IMPORTS_end + +intrman_IMPORTS_start +I_CpuSuspendIntr +I_CpuResumeIntr +intrman_IMPORTS_end + +sifman_IMPORTS_start +I_sceSifCheckInit +I_sceSifInit +I_sceSifSetDma +I_sceSifDmaStat +sifman_IMPORTS_end + +usbd_IMPORTS_start +I_UsbGetDeviceStaticDescriptor +I_UsbOpenEndpoint +I_UsbCloseEndpoint +I_UsbOpenEndpointAligned +I_UsbSetDevicePrivateData +I_UsbTransfer +I_UsbRegisterDriver +usbd_IMPORTS_end + +vblank_IMPORTS_start +I_WaitVblankStart +I_RegisterVblankHandler +vblank_IMPORTS_end + +smsutils_IMPORTS_start +I_mips_memset +I_mips_memcpy +smsutils_IMPORTS_end + +sysclib_IMPORTS_start +I_prnt +I_strncmp +I_strncpy +sysclib_IMPORTS_end + +loadcore_IMPORTS_start +I_GetLoadcoreInternalData +I_QueryLibraryEntryTable +I_FlushIcache +I_FlushDcache +loadcore_IMPORTS_end diff --git a/modules/pademu/irx_imports.h b/modules/pademu/irx_imports.h new file mode 100644 index 000000000..5caf8911c --- /dev/null +++ b/modules/pademu/irx_imports.h @@ -0,0 +1,39 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# $Id$ +# Defines all IRX imports. +*/ + +#ifndef IOP_IRX_IMPORTS_H +#define IOP_IRX_IMPORTS_H + +#include "irx.h" + +/* Please keep these in alphabetical order! */ +#include "dmacman.h" +#include "intrman.h" +#include "iomanX.h" +#include "libsd.h" +#include "loadcore.h" +#include "sifcmd.h" +#include "sifman.h" +#include "stdio.h" +#include "sysclib.h" +#include "sysmem.h" +#include "thbase.h" +#include "thevent.h" +#include "thmsgbx.h" +#include "thsemap.h" +#include "usbd.h" +#include "vblank.h" + +#include "sys_utils.h" + +#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/pademu/pademu.c b/modules/pademu/pademu.c new file mode 100644 index 000000000..0ded1de89 --- /dev/null +++ b/modules/pademu/pademu.c @@ -0,0 +1,448 @@ +//sio2man hook code taken from opl mcemu: +/* + Copyright 2006-2008, Romz + Copyright 2010, Polo + Licenced under Academic Free License version 3.0 + Review OpenUsbLd README & LICENSE files for further details. +*/ + +#include "pademu.h" + +#ifdef BT + +#include "ds3bt.h" + +#define PAD_INIT ds3bt_init +#define PAD_GET_STATUS ds3bt_get_status +#define PAD_RESET ds3bt_reset +#define PAD_GET_DATA ds3bt_get_data +#define PAD_SET_RUMBLE ds3bt_set_rumble + +#elif defined(USB) + +#include "ds3usb.h" + +#define PAD_INIT ds3usb_init +#define PAD_GET_STATUS ds3usb_get_status +#define PAD_RESET ds3usb_reset +#define PAD_GET_DATA ds3usb_get_data +#define PAD_SET_RUMBLE ds3usb_set_rumble + +#else +#error "must define mode" +#endif + +//#define DPRINTF(x...) printf(x) +#define DPRINTF(x...) + +typedef struct +{ + uint8_t config_mode; + uint8_t mode; + uint8_t enabled; + uint8_t vibration; + uint8_t mask[4]; + uint8_t actalign[6]; +} pad_status_t; + +#define DIGITAL_MODE 0x41 +#define ANALOG_MODE 0x73 +#define ANALOGP_MODE 0x79 +#define CONFIG_MODE 0xF3 + +#define MAX_PORTS 2 + +#define PAD_STATE_RUNNING 0x08 + +IRX_ID("pademu", 1, 1); + +#define PADEMU_BIND_RPC_ID 0x18E3878D +#define PADEMU_RESET 1 + +//#define OLD_PADMAN + +PtrRegisterLibraryEntires pRegisterLibraryEntires; /* Pointer to RegisterLibraryEntires routine */ +Sio2McProc pSio2man25, pSio2man51; /* Pointers to SIO2MAN routines */ +pad_status_t pad[MAX_PORTS]; + +#ifdef OLD_PADMAN +void (*pSio2man23)(); +void hookSio2man23(); +#endif + +int install_sio2hook(); + +int hookRegisterLibraryEntires(iop_library_t *lib); +void hookSio2man25(sio2_transfer_data_t *sd); +void hookSio2man51(sio2_transfer_data_t *sd); +void InstallSio2manHook(void *exp); + +void pademu_hookSio2man(sio2_transfer_data_t *td, Sio2McProc sio2proc); +void pademu_setup(uint8_t ports, uint8_t vib); +void pademu(sio2_transfer_data_t *td); +void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size); +void pademu_reset(); + +static void rpc_thread(void *data); +static void *rpc_sf(int cmd, void *data, int size); + +static SifRpcDataQueue_t rpc_que __attribute__((aligned(16))); +static SifRpcServerData_t rpc_svr __attribute__((aligned(16))); + +//static int rpc_buf[64] __attribute((aligned(16))); + +void rpc_thread(void *data) +{ + if (sceSifCheckInit() == 0) { + DPRINTF("BT: Sif not initialized \n"); + sceSifInit(); + } + + SifInitRpc(0); + SifSetRpcQueue(&rpc_que, GetThreadId()); + SifRegisterRpc(&rpc_svr, PADEMU_BIND_RPC_ID, rpc_sf, NULL, NULL, NULL, &rpc_que); + SifRpcLoop(&rpc_que); +} + +void *rpc_sf(int cmd, void *data, int size) +{ + if (cmd == PADEMU_RESET) + pademu_reset(); + + return data; +} + +int _start(int argc, char *argv[]) +{ + uint8_t enable = 0xFF, vibration = 0xFF; + + if (argc > 1) { + enable = argv[1][0]; + vibration = argv[1][1]; + } + + if (!PAD_INIT(enable)) { + return MODULE_NO_RESIDENT_END; + } + +#ifndef VMC + if (!install_sio2hook()) { + return MODULE_NO_RESIDENT_END; + } +#endif + + pademu_setup(enable, vibration); + + iop_thread_t rpc_th; + + rpc_th.attr = TH_C; + rpc_th.thread = rpc_thread; + rpc_th.priority = 40; + rpc_th.stacksize = 0x800; + rpc_th.option = 0; + + int thid = CreateThread(&rpc_th); + + if (thid > 0) { + StartThread(thid, NULL); + return MODULE_RESIDENT_END; + } + + return MODULE_NO_RESIDENT_END; +} + +int install_sio2hook() +{ + register void *exp; + + /* looking for LOADCORE's library entry table */ + exp = GetExportTable("loadcore", 0x100); + if (exp == NULL) { + DPRINTF("Unable to find loadcore exports.\n"); + return 0; + } + + /* hooking LOADCORE's RegisterLibraryEntires routine */ + pRegisterLibraryEntires = (PtrRegisterLibraryEntires)HookExportEntry(exp, 6, hookRegisterLibraryEntires); + + /* searching for a SIO2MAN export table */ + exp = GetExportTable("sio2man", 0x201); + if (exp != NULL) { + /* hooking SIO2MAN's routines */ + InstallSio2manHook(exp); + } else { + DPRINTF("SIO2MAN exports not found.\n"); + } + + return 1; +} + +void InstallSio2manHook(void *exp) +{ + /* hooking SIO2MAN entry #25 (used by MCMAN and old PADMAN) */ + pSio2man25 = HookExportEntry(exp, 25, hookSio2man25); + /* hooking SIO2MAN entry #51 (used by MC2_* modules and PADMAN) */ + pSio2man51 = HookExportEntry(exp, 51, hookSio2man51); +#ifdef OLD_PADMAN + pSio2man23 = HookExportEntry(exp, 23, hookSio2man23); +#endif +} + +/* Hook for the LOADCORE's RegisterLibraryEntires call */ +int hookRegisterLibraryEntires(iop_library_t *lib) +{ + if (!strncmp(lib->name, "sio2man", 8)) { + /* hooking SIO2MAN's routines */ + InstallSio2manHook(&lib[1]); + } + + DPRINTF("registering library %s\n", lib->name); + + return pRegisterLibraryEntires(lib); +} + +/* Hook for SIO2MAN entry #25 */ +void hookSio2man25(sio2_transfer_data_t *sd) +{ + pademu_hookSio2man(sd, pSio2man25); +} + +/* Hook for SIO2MAN entry #51 */ +void hookSio2man51(sio2_transfer_data_t *sd) +{ + pademu_hookSio2man(sd, pSio2man51); +} + +#ifdef OLD_PADMAN +void hookSio2man23() +{ + return; +} +#endif + +void pademu_hookSio2man(sio2_transfer_data_t *td, Sio2McProc sio2proc) +{ + register u32 ctrl, port1, port2; + + ctrl = td->regdata[0]; + port1 = td->regdata[0] & 0x03; + port2 = td->regdata[1] & 0x03; + + if ((ctrl & 0xF0) == 0x40 && td->in[0] == 0x01 && td->port_ctrl2[port1] != 0x00030064) { + + if (port2 == 1) //2 pads at once + { + if (pad[0].enabled && pad[1].enabled) //emulating 2 pads + { + sio2proc = pademu; + } else if (pad[0].enabled || pad[1].enabled) // only one + { +#ifdef OLD_PADMAN + pSio2man23(); +#endif + sio2proc(td); + sio2proc = pademu; + } else { +#ifdef OLD_PADMAN + pSio2man23(); +#endif + } + } else { + if (pad[port1].enabled) //emulating this port + sio2proc = pademu; +#ifdef OLD_PADMAN + else + pSio2man23(); +#endif + } + } + + sio2proc(td); +} + +void pademu_setup(uint8_t ports, uint8_t vib) +{ + uint8_t i; + + for (i = 0; i < MAX_PORTS; i++) { + pad[i].config_mode = 0; + pad[i].mode = DIGITAL_MODE; + pad[i].enabled = ((ports >> i) & 1); + pad[i].vibration = ((vib >> i) & 1); + + mips_memset(pad[i].actalign, 0xFF, 6); + + pad[i].mask[0] = 0xFF; + pad[i].mask[1] = 0xFF; + pad[i].mask[2] = 0x03; + pad[i].mask[3] = 0x00; + } +} + +uint8_t pademu_data[6][6] = + { + {0x00, 0x00, 0x02, 0x00, 0x00, 0x5A}, + {0x03, 0x02, 0x00, 0x02, 0x01, 0x00}, + {0x00, 0x00, 0x01, 0x02, 0x00, 0x0A}, + {0x00, 0x00, 0x01, 0x01, 0x01, 0x14}, + {0x00, 0x00, 0x02, 0x00, 0x01, 0x00}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}; + +void pademu(sio2_transfer_data_t *td) +{ + int port; + uint8_t port1, port2, cmd_size; + uint8_t *in, *out; + + port1 = td->regdata[0] & 0x03; + port2 = td->regdata[1] & 0x03; + + td->stat6c = 0x1100; //? + td->stat70 = 0x0F; //? + + if (port2 == 1) { + //find next cmd + for (cmd_size = 5; cmd_size < td->in_size - 3; cmd_size++) { + if (td->in[cmd_size] == 0x01 && (td->in[cmd_size + 1] & 0xF0) == 0x40 && td->in[cmd_size + 2] == 0x00) { + if (cmd_size != 5 && cmd_size != 9 && cmd_size != 21) + continue; + else + break; + } + } + + if (cmd_size + 3 == td->in_size) { + DPRINTF("Second cmd not found!\n"); + return; + } + + if (pad[0].enabled) { + in = td->in; + out = td->out; + port = 0; + + if (pad[1].enabled) //emulating ports 0 & 1 + { + pademu_cmd(1, (uint8_t *)&td->in[cmd_size], (uint8_t *)&td->out[cmd_size], td->in_size - cmd_size); + } + } else //emulating only port 1 + { + in = (uint8_t *)&td->in[cmd_size]; + out = (uint8_t *)&td->out[cmd_size]; + port = 1; + cmd_size = td->in_size - cmd_size; + } + } else { + in = td->in; + out = td->out; + port = port1; + cmd_size = td->in_size; + } + + pademu_cmd(port, in, out, cmd_size); +} + +void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) +{ + uint8_t rrum = 0, lrum = 0; + uint8_t i; + + mips_memset(out, 0x00, out_size); + + if (!(PAD_GET_STATUS(port) & PAD_STATE_RUNNING)) { + return; + } + + out[0] = 0xFF; + out[1] = pad[port].config_mode ? CONFIG_MODE : pad[port].mode; + out[2] = 0x5A; + + switch (in[1]) { + case 0x40: //set vref param + mips_memcpy(&out[3], &pademu_data[0], 6); + break; + + case 0x41: //query button mask + if (pad[port].mode != DIGITAL_MODE) { + out[3] = pad[port].mask[0]; + out[4] = pad[port].mask[1]; + out[5] = pad[port].mask[2]; + out[6] = pad[port].mask[3]; + out[7] = 0x00; + out[8] = 0x5A; + } + break; + + case 0x42: //read data + PAD_GET_DATA(&out[3], out_size - 3, port); + + if (pad[port].vibration) //disable/enable vibration + { + for (i = 0; i < 6; i++) //vibration + { + if (pad[port].actalign[i] == 0x00) + rrum = in[i + 3]; + + if (pad[port].actalign[i] == 0x01) + lrum = in[i + 3]; + } + PAD_SET_RUMBLE(lrum, rrum, port); + } + + break; + + case 0x43: //enter/exit config mode + pad[port].config_mode = (in[3] == 0x01); + break; + + case 0x44: //set mode and lock + pad[port].mode = (in[3] == 0x01) ? ANALOG_MODE : DIGITAL_MODE; + break; + + case 0x45: //query model and mode + mips_memcpy(&out[3], &pademu_data[1], 6); + out[5] = (pad[port].mode & 0xF) != 1; + break; + + case 0x46: //query act + if (in[3] == 0x00) + mips_memcpy(&out[3], &pademu_data[2], 6); + else + mips_memcpy(&out[3], &pademu_data[3], 6); + + break; + + case 0x47: //query comb + mips_memcpy(&out[3], &pademu_data[4], 6); + break; + + case 0x4C: //query mode + if (in[3] == 0x00) + out[6] = 0x04; + else + out[6] = 0x07; + + break; + + case 0x4D: //set act align + mips_memcpy(pad[port].actalign, &in[3], 6); + mips_memcpy(&out[3], &pademu_data[5], 6); + break; + + case 0x4F: //set button info + pad[port].mode = ANALOGP_MODE; + + out[8] = 0x5A; + + pad[port].mask[0] = in[3]; + pad[port].mask[1] = in[4]; + pad[port].mask[2] = in[5]; + pad[port].mask[3] = in[6]; + break; + } +} + +void pademu_reset() +{ + PAD_RESET(); +} diff --git a/modules/pademu/pademu.h b/modules/pademu/pademu.h new file mode 100644 index 000000000..aa7d19a5e --- /dev/null +++ b/modules/pademu/pademu.h @@ -0,0 +1,59 @@ +/* + Copyright 2006-2008, Romz + Copyright 2010, Polo + Licenced under Academic Free License version 3.0 + Review OpenUsbLd README & LICENSE files for further details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sys_utils.h" + +/* type for a pointer to LOADCORE's entry RegisterLibraryEntires */ +typedef int (*PtrRegisterLibraryEntires)(iop_library_t *lib); + +struct _sio2_dma_arg +{ // size 12 + void *addr; + int size; + int count; +}; + +typedef struct +{ + u32 stat6c; + + u32 port_ctrl1[4]; + u32 port_ctrl2[4]; + + u32 stat70; + + u32 regdata[16]; + + u32 stat74; + + u32 in_size; + u32 out_size; + u8 *in; + u8 *out; + + struct _sio2_dma_arg in_dma; + struct _sio2_dma_arg out_dma; +} sio2_transfer_data_t; + +typedef void (*Sio2McProc)(sio2_transfer_data_t *arg); + +void *GetExportTable(char *libname, int version); +u32 GetExportTableSize(void *table); +void *GetExportEntry(void *table, u32 entry); +void *HookExportEntry(void *table, u32 entry, void *func); diff --git a/modules/pademu/sys_utils.c b/modules/pademu/sys_utils.c new file mode 100644 index 000000000..6fb76d10c --- /dev/null +++ b/modules/pademu/sys_utils.c @@ -0,0 +1,94 @@ +//sio2man hook code taken from opl mcemu: +/* + Copyright 2006-2008, Romz + Copyright 2010, Polo + Licenced under Academic Free License version 3.0 + Review OpenUsbLd README & LICENSE files for further details. +*/ + +#include "pademu.h" + +/* prototype for LOADCORE's function */ +void *QueryLibraryEntryTable(iop_library_t *lib); + +//--------------------------------------------------------------------------- +/* Returns a pointer to a library entry table */ +void *GetExportTable(char *libname, int version) +{ + if (libname != NULL) { + iop_library_t lib; + register int i; + register char *psrc; + + mips_memset(&lib, 0, sizeof(iop_library_t)); + lib.version = version; + + for (i = 0, psrc = libname; (i < 8) && (*psrc); i++, psrc++) + lib.name[i] = *psrc; + + return QueryLibraryEntryTable(&lib); + } + + return NULL; +} +//------------------------------ +//endfunc +//--------------------------------------------------------------------------- +/* Returns number of entries in the export table */ +u32 GetExportTableSize(void *table) +{ + register void **exp; + register u32 size; + + exp = (void **)table; + size = 0; + + if (exp != NULL) + while (*exp++ != NULL) + size++; + + return size; +} +//------------------------------ +//endfunc +//--------------------------------------------------------------------------- +/* Returns an entry from the export table */ +void *GetExportEntry(void *table, u32 entry) +{ + if (entry < GetExportTableSize(table)) { + register void **exp; + + exp = (void **)table; + + return exp[entry]; + } + + return NULL; +} +//------------------------------ +//endfunc +//--------------------------------------------------------------------------- +/* Replaces an entry in the export table */ +void *HookExportEntry(void *table, u32 entry, void *func) +{ + if (entry < GetExportTableSize(table)) { + int oldstate; + register void **exp, *temp; + + exp = (void **)table; + exp = &exp[entry]; + + CpuSuspendIntr(&oldstate); + temp = *exp; + *exp = func; + func = temp; + CpuResumeIntr(oldstate); + + return func; + } + + return NULL; +} +//------------------------------ +//endfunc +//--------------------------------------------------------------------------- diff --git a/modules/pademu/sys_utils.h b/modules/pademu/sys_utils.h new file mode 100644 index 000000000..df9859e42 --- /dev/null +++ b/modules/pademu/sys_utils.h @@ -0,0 +1,30 @@ +/* + Copyright 2006-2008, Romz + Copyright 2010, Polo + Licenced under Academic Free License version 3.0 + Review OpenUsbLd README & LICENSE files for further details. + */ + +#ifndef __SYS_UTILS_H +#define __SYS_UTILS_H + +#include + +typedef struct +{ + int version; + void **exports; +} modinfo_t; + +/* SMS Utils Imports */ +#define smsutils_IMPORTS_start DECLARE_IMPORT_TABLE(smsutils, 1, 1) + +void mips_memcpy(void *, const void *, unsigned); +#define I_mips_memcpy DECLARE_IMPORT(4, mips_memcpy) + +void mips_memset(void *, int, unsigned); +#define I_mips_memset DECLARE_IMPORT(5, mips_memset) + +#define smsutils_IMPORTS_end END_IMPORT_TABLE + +#endif /* __MCEMU_UTILS_H */ diff --git a/src/dia.c b/src/dia.c index 94e46aa4b..333f87d06 100644 --- a/src/dia.c +++ b/src/dia.c @@ -617,7 +617,7 @@ static int diaHandleInput(struct UIItem *item, int *modified) if (item->intvalue.current < item->intvalue.max) item->intvalue.current++; else - item->intvalue.current = 0; + item->intvalue.current = item->intvalue.min; //was "= 0;" } else if (getKey(KEY_DOWN)) { if (item->intvalue.current > item->intvalue.min) item->intvalue.current--; diff --git a/src/dialogs.c b/src/dialogs.c index 200839779..6992f4633 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -186,6 +186,11 @@ struct UIItem diaCompatConfig[] = { {UI_SPLITTER}, #endif +#ifdef PADEMU + {UI_BUTTON, COMPAT_PADEMUCONFIG, 1, 1, -1, 0, 0, {.label = {NULL, _STR_PADEMUCONFIG}}}, + {UI_BREAK}, +#endif + {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_DMA_MODE}}}, {UI_SPACER}, {UI_ENUM, COMPAT_DMA, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, @@ -469,6 +474,67 @@ struct UIItem diaGSConfig[] = { {UI_TERMINATOR}}; #endif +#ifdef PADEMU +struct UIItem diaPadEmuConfig[] = { + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_PADEMU_SETTINGS}}}, {UI_SPACER}, + + {UI_SPLITTER}, + + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_PADEMU_ENABLE}}}, + {UI_SPACER}, + {UI_BOOL, PADCFG_PADEMU_ENABLE, 1, 1, _STR_HINT_PADEMU_ENABLE, 0, 0, {.intvalue = {1, 1}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_PADEMU_MODE}}}, + {UI_SPACER}, + {UI_ENUM, PADCFG_PADEMU_MODE, 1, 1, _STR_HINT_PADEMU_MODE, 0, 0, {.intvalue = {1, 1}}}, + {UI_BREAK}, + + {UI_BREAK}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_PADPORT}}}, + {UI_SPACER}, + {UI_INT, PADCFG_PADPORT, 1, 1, _STR_HINT_PAD_PORT, 0, 0, {.intvalue = {1, 1, 1, 2}}}, + {UI_BREAK}, + + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_PADEMU_PORT}}}, + {UI_SPACER}, + {UI_BOOL, PADCFG_PADEMU_PORT, 1, 1, _STR_HINT_PADEMU_PORT, 0, 0, {.intvalue = {1, 1}}}, + {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_PADEMU_VIB}}}, + {UI_SPACER}, + {UI_BOOL, PADCFG_PADEMU_VIB, 1, 1, _STR_HINT_PADEMU_VIB, 0, 0, {.intvalue = {1, 1}}}, + {UI_BREAK}, + + {UI_BREAK}, + {UI_SPLITTER}, + {UI_BREAK}, + + {UI_LABEL, PADCFG_USBDG_MAC_STR, 1, 1, -1, -45, 0, {.label = {NULL, _STR_USBDG_MAC}}}, + {UI_SPACER}, + {UI_LABEL, PADCFG_USBDG_MAC, 1, 1, -1, 0, 0, {.label = {"", -1}}}, + {UI_BREAK}, + {UI_LABEL, PADCFG_PAD_MAC_STR, 1, 1, -1, -45, 0, {.label = {NULL, _STR_PAD_MAC}}}, + {UI_SPACER}, + {UI_LABEL, PADCFG_PAD_MAC, 1, 1, -1, 0, 0, {.label = {"", -1}}}, + {UI_BREAK}, + + {UI_BREAK}, + + {UI_LABEL, PADCFG_PAIR_STR, 1, 1, -1, -45, 0, {.label = {NULL, _STR_PAIR_PAD}}}, + {UI_SPACER}, + {UI_BUTTON, PADCFG_PAIR, 1, 1, _STR_HINT_PAIRPAD, 0, 0, {.label = {NULL, _STR_PAIR}}}, + {UI_BREAK}, + + {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, + + // end of dialog + {UI_TERMINATOR}}; +#endif + // Per Game Settings > Cheat Menu --Bat-- #ifdef CHEAT struct UIItem diaCheatConfig[] = { diff --git a/src/gui.c b/src/gui.c index 6bfa8e209..a4a69e0d4 100644 --- a/src/gui.c +++ b/src/gui.c @@ -24,6 +24,10 @@ #ifdef CHEAT #include "include/pgcht.h" #endif +#ifdef PADEMU +#include +#include +#endif #include #include @@ -628,6 +632,135 @@ void guiShowCheatConfig(void) } #endif +#ifdef PADEMU + +static u8 ds3_mac[6]; +static u8 dg_mac[6]; +static char ds3_str[18]; +static char dg_str[18]; +static int ds3macset = 0; +static int dgmacset = 0; + +static int PadEmuSettings = 0; + +static char *bdaddr_to_str(u8 *bdaddr, char *addstr) +{ + int i; + + memset(addstr, 0, sizeof(addstr)); + + for (i = 0; i < 6; i++) { + sprintf(addstr, "%s%02X", addstr, bdaddr[i]); + + if (i < 5) + sprintf(addstr, "%s:", addstr); + } + + return addstr; +} + +static int guiPadEmuUpdater(int modified) +{ + int PadEmuEnable, PadEmuMode, PadPort, PadEmuVib, PadEmuPort; + static int oldPadPort; + + diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_ENABLE, &PadEmuEnable); + diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_MODE, &PadEmuMode); + diaGetInt(diaPadEmuConfig, PADCFG_PADPORT, &PadPort); + diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_PORT, &PadEmuPort); + diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_VIB, &PadEmuVib); + + diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_MODE, PadEmuEnable); + + diaSetEnabled(diaPadEmuConfig, PADCFG_PADPORT, PadEmuEnable); + diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_PORT, PadEmuEnable); + diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_VIB, PadEmuPort & PadEmuEnable); + + diaSetVisible(diaPadEmuConfig, PADCFG_USBDG_MAC, PadEmuMode & PadEmuEnable); + diaSetVisible(diaPadEmuConfig, PADCFG_PAD_MAC, PadEmuMode & PadEmuEnable); + diaSetVisible(diaPadEmuConfig, PADCFG_PAIR, PadEmuMode & PadEmuEnable); + + diaSetVisible(diaPadEmuConfig, PADCFG_USBDG_MAC_STR, PadEmuMode & PadEmuEnable); + diaSetVisible(diaPadEmuConfig, PADCFG_PAD_MAC_STR, PadEmuMode & PadEmuEnable); + diaSetVisible(diaPadEmuConfig, PADCFG_PAIR_STR, PadEmuMode & PadEmuEnable); + + if (modified) { + if (PadPort != oldPadPort) { + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_PORT, (PadEmuSettings >> (8 + PadPort - 1)) & 1); + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_VIB, (PadEmuSettings >> (16 + PadPort - 1)) & 1); + + oldPadPort = PadPort; + } + } + + PadEmuSettings |= PadEmuMode | (PadEmuPort << (8 + PadPort - 1)) | (PadEmuVib << (16 + PadPort - 1)); + PadEmuSettings &= (~(!PadEmuMode) & ~(!PadEmuPort << (8 + PadPort - 1)) & ~(!PadEmuVib << (16 + PadPort - 1))); + + if (PadEmuMode) { + if (ds3bt_get_status(0) & DS3BT_STATE_USB_CONFIGURED) { + if (!dgmacset) { + if (!ds3bt_get_bdaddr(dg_mac)) { + dgmacset = 1; + diaSetLabel(diaPadEmuConfig, PADCFG_USBDG_MAC, bdaddr_to_str(dg_mac, dg_str)); + } else { + dgmacset = 0; + } + } + } else { + diaSetLabel(diaPadEmuConfig, PADCFG_USBDG_MAC, _l(_STR_NOT_CONNECTED)); + dgmacset = 0; + } + + if (ds3usb_get_status(0) & DS3USB_STATE_RUNNING) { + if (!ds3macset) { + if (!ds3usb_get_bdaddr(0, ds3_mac)) { + ds3macset = 1; + diaSetLabel(diaPadEmuConfig, PADCFG_PAD_MAC, bdaddr_to_str(ds3_mac, ds3_str)); + } else { + ds3macset = 0; + } + } + } else { + diaSetLabel(diaPadEmuConfig, PADCFG_PAD_MAC, _l(_STR_NOT_CONNECTED)); + ds3macset = 0; + } + } + + return 0; +} + +static void guiShowPadEmuConfig(void) +{ + const char *PadEmuModes[] = {_l(_STR_DS3USB_MODE), _l(_STR_DS3BT_MODE), NULL}; + + diaSetEnum(diaPadEmuConfig, PADCFG_PADEMU_MODE, PadEmuModes); + + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_MODE, PadEmuSettings & 0xFF); + + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_PORT, (PadEmuSettings >> 8) & 1); + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_VIB, (PadEmuSettings >> 16) & 1); + + int result = -1; + + while (result != 0) { + result = diaExecuteDialog(diaPadEmuConfig, result, 1, &guiPadEmuUpdater); + + if (result == PADCFG_PAIR) { + if (ds3macset && dgmacset) { + if (ds3usb_get_status(0) & DS3USB_STATE_RUNNING) { + if (!ds3usb_set_bdaddr(0, dg_mac)) + ds3macset = 0; + } + } + } + + if (result == UIID_BTN_OK) + break; + } +} + +#endif + static int netConfigUpdater(int modified) { int showAdvancedOptions, isNetBIOS, isDHCPEnabled, i; @@ -1020,6 +1153,16 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) #endif /* CHEAT */ +#ifdef PADEMU + int EnablePadEmu = 0; + configGetInt(configSet, CONFIG_ITEM_ENABLEPADEMU, &EnablePadEmu); + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_ENABLE, EnablePadEmu); + + PadEmuSettings = 0; + + configGetInt(configSet, CONFIG_ITEM_PADEMUSETTINGS, &PadEmuSettings); +#endif + // Find out the current game ID char hexid[32]; configGetStrCopy(configSet, CONFIG_ITEM_DNAS, hexid, sizeof(hexid)); @@ -1059,6 +1202,11 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) guiShowGSConfig(); } #endif +#ifdef PADEMU + if (result == COMPAT_PADEMUCONFIG) { + guiShowPadEmuConfig(); + } +#endif #ifdef CHEAT if (result == COMPAT_CHEATCONFIG) { guiShowCheatConfig(); @@ -1110,6 +1258,10 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_ENABLECHEAT); configRemoveKey(configSet, CONFIG_ITEM_CHEATMODE); #endif +#ifdef PADEMU + configRemoveKey(configSet, CONFIG_ITEM_ENABLEPADEMU); + configRemoveKey(configSet, CONFIG_ITEM_PADEMUSETTINGS); +#endif #ifdef VMC configRemoveVMC(configSet, 0); configRemoveVMC(configSet, 1); @@ -1187,6 +1339,20 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_CHEATMODE); #endif +#ifdef PADEMU + diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_ENABLE, &EnablePadEmu); + + if (EnablePadEmu != 0) + configSetInt(configSet, CONFIG_ITEM_ENABLEPADEMU, EnablePadEmu); + else + configRemoveKey(configSet, CONFIG_ITEM_ENABLEPADEMU); + + if (PadEmuSettings != 0) + configSetInt(configSet, CONFIG_ITEM_PADEMUSETTINGS, PadEmuSettings); + else + configRemoveKey(configSet, CONFIG_ITEM_PADEMUSETTINGS); +#endif + diaGetString(diaCompatConfig, COMPAT_GAMEID, hexid, sizeof(hexid)); if (hexid[0] != '\0') configSetStr(configSet, CONFIG_ITEM_DNAS, hexid); diff --git a/src/lang.c b/src/lang.c index a0cde0303..590211fa9 100644 --- a/src/lang.c +++ b/src/lang.c @@ -219,6 +219,28 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Value in second(s), 0 to disable auto start", "PS2 Logo", "(Only displayed for a valid disc logo which matches the console's region)", +#ifdef PADEMU + "Configure PADEMU", + "Pad Emulator Settings", + "Enable Pad Emulator", + "Turns on/off PadEmulator for selected game.", + "Pad Emulator mode", + "Select Pad Emulator mode.", + "DualShock3 USB", + "DualShock3 BT", + "Settings for port:", + "Select Pad Emulator port for settings.", + "Enable emulation", + "Turns on/off Pad Emulator for selected port.", + "Enable vibration", + "Turns on/off vibration for Pad Emulator selected port.", + "Usb bluetooth adapter mac address:", + "DS3 Controller paired to mac address:", + "Pair", + "Pair DS3 controller", + "Pair DS3 controller with bluetooth adapter mac address.", + "Not connected", +#endif "ELF Loader Menu", "ELF Loader Menu display mode", }; diff --git a/src/pad.c b/src/pad.c index b75791d29..e7aa82222 100644 --- a/src/pad.c +++ b/src/pad.c @@ -11,6 +11,11 @@ #include #include +#ifdef PADEMU +#include +#include +#endif + #define MAX_PADS 4 // Cpu ticks per one milisecond @@ -181,12 +186,29 @@ static int initializePad(struct pad_data_t *pad) static int readPad(struct pad_data_t *pad) { int rcode = 0; +#ifdef PADEMU + u32 newpdata = 0; int ret = padRead(pad->port, pad->slot, &pad->buttons); // port, slot, buttons + newpdata = 0xffff ^ pad->buttons.btns; + + if (ds3bt_get_status(pad->port) & DS3BT_STATE_RUNNING) { + ret = !ds3bt_get_data(pad->port, (u8 *)&pad->buttons.btns); + newpdata |= 0xffff ^ pad->buttons.btns; + } + + if (ds3usb_get_status(pad->port) & DS3USB_STATE_RUNNING) { + ret = !ds3usb_get_data(pad->port, (u8 *)&pad->buttons.btns); + newpdata |= 0xffff ^ pad->buttons.btns; + } if (ret != 0) { - u32 newpdata = 0xffff ^ pad->buttons.btns; +#else + int ret = padRead(pad->port, pad->slot, &pad->buttons); // port, slot, buttons + if (ret != 0) { + u32 newpdata = 0xffff ^ pad->buttons.btns; +#endif if (newpdata != 0x0) // something rcode = 1; else diff --git a/src/renderman.c b/src/renderman.c index 9d6862a22..c1398f7a7 100644 --- a/src/renderman.c +++ b/src/renderman.c @@ -42,12 +42,12 @@ struct rm_mode }; static struct rm_mode rm_mode_table[NUM_RM_VMODES] = { - {-1, 16, -1, -1}, // AUTO - {GS_MODE_PAL, 16, 512, 4}, // PAL@50Hz - {GS_MODE_NTSC, 16, 448, 4}, // NTSC@60Hz - {GS_MODE_DTV_480P, 31, 448, 2}, // DTV480P@60Hz - {GS_MODE_DTV_576P, 31, 512, 2}, // DTV576P@50Hz - {GS_MODE_VGA_640_60, 31, 480, 2}, // VGA640x480@60Hz + {-1, 16, -1, -1}, // AUTO + {GS_MODE_PAL, 16, 512, 4}, // PAL@50Hz + {GS_MODE_NTSC, 16, 448, 4}, // NTSC@60Hz + {GS_MODE_DTV_480P, 31, 448, 2}, // DTV480P@60Hz + {GS_MODE_DTV_576P, 31, 512, 2}, // DTV576P@50Hz + {GS_MODE_VGA_640_60, 31, 480, 2}, // VGA640x480@60Hz }; static float aspectWidth; diff --git a/src/supportbase.c b/src/supportbase.c index 332c76dfa..157d7fcd8 100644 --- a/src/supportbase.c +++ b/src/supportbase.c @@ -411,6 +411,14 @@ int sbPrepare(base_game_info_t *game, config_set_t *configSet, int size_cdvdman, } #endif +#ifdef PADEMU + gEnablePadEmu = 0; + configGetInt(configSet, CONFIG_ITEM_ENABLEPADEMU, &gEnablePadEmu); + + gPadEmuSettings = 0; + configGetInt(configSet, CONFIG_ITEM_PADEMUSETTINGS, &gPadEmuSettings); +#endif + *patchindex = i; // game id diff --git a/src/system.c b/src/system.c index c8f0552c0..ba8b7c685 100644 --- a/src/system.c +++ b/src/system.c @@ -15,6 +15,12 @@ #include "include/OSDHistory.h" #include "include/renderman.h" #include "../ee_core/include/modules.h" + +#ifdef PADEMU +#include +#include +#endif + #ifdef VMC typedef struct { @@ -106,6 +112,20 @@ extern int size_elfldr_elf; extern void *pusbd_irx; extern int size_pusbd_irx; +#ifdef PADEMU +extern void *ds3bt_irx; +extern int size_ds3bt_irx; + +extern void *ds3usb_irx; +extern int size_ds3usb_irx; + +extern void *bt_pademu_irx; +extern int size_bt_pademu_irx; + +extern void *usb_pademu_irx; +extern int size_usb_pademu_irx; +#endif + #ifdef __INGAME_DEBUG extern void *udptty_ingame_irx; extern int size_udptty_ingame_irx; @@ -287,6 +307,16 @@ void sysReset(int modload_mask) sysLoadModuleBuffer(&genvmc_irx, size_genvmc_irx, 0, NULL); #endif +#ifdef PADEMU + int ds3pads = 1; //only one pad enabled + + sysLoadModuleBuffer(&ds3usb_irx, size_ds3usb_irx, 4, (char *)&ds3pads); + sysLoadModuleBuffer(&ds3bt_irx, size_ds3bt_irx, 4, (char *)&ds3pads); + + ds3usb_init(); + ds3bt_init(); +#endif + fileXioInit(); poweroffInit(); } @@ -414,7 +444,12 @@ static unsigned int sendIrxKernelRAM(unsigned int modules, void *ModuleStorage, irxptr_tab[modcount].info = size_imgdrv_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_IMGDRV); irxptr_tab[modcount++].ptr = (void *)&imgdrv_irx; - if (modules & CORE_IRX_USB) { +#ifdef PADEMU +#define PADEMU_ARG || gEnablePadEmu +#else +#define PADEMU_ARG +#endif + if ((modules & CORE_IRX_USB)PADEMU_ARG) { irxptr_tab[modcount].info = size_pusbd_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_USBD); irxptr_tab[modcount++].ptr = pusbd_irx; } @@ -438,6 +473,18 @@ static unsigned int sendIrxKernelRAM(unsigned int modules, void *ModuleStorage, } #endif +#ifdef PADEMU + if (gEnablePadEmu) { + if (gPadEmuSettings & 0xFF) { + irxptr_tab[modcount].info = size_bt_pademu_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_PADEMU); + irxptr_tab[modcount++].ptr = (void *)&bt_pademu_irx; + } else { + irxptr_tab[modcount].info = size_usb_pademu_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_PADEMU); + irxptr_tab[modcount++].ptr = (void *)&usb_pademu_irx; + } + } +#endif + #ifdef __INGAME_DEBUG #ifdef __DECI2_DEBUG if (modules & CORE_IRX_DECI2) { @@ -620,7 +667,12 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo #else #define CHEAT_ARGS 0 #endif - char *argv[4 + GSM_ARGS + CHEAT_ARGS]; +#ifdef PADEMU +#define PADEMU_ARGS 2 +#else +#define PADEMU_ARGS 0 +#endif + char *argv[4 + GSM_ARGS + CHEAT_ARGS + PADEMU_ARGS]; char ModStorageConfig[32]; char config_str[256]; #ifdef GSM @@ -712,16 +764,24 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo #else #define GSM_SPECIFIER #define GSM_ARGUMENT +#endif + +#ifdef PADEMU +#define PADEMU_SPECIFIER " %d, %d" +#define PADEMU_ARGUMENT , gEnablePadEmu, (gPadEmuSettings >> 8) +#else +#define PADEMU_SPECIFIER +#define PADEMU_ARGUMENT #endif i = 0; - sprintf(config_str, "%s %d %d %s %d %u.%u.%u.%u %u.%u.%u.%u %u.%u.%u.%u %d" CHEAT_SPECIFIER GSM_SPECIFIER, + sprintf(config_str, "%s %d %d %s %d %u.%u.%u.%u %u.%u.%u.%u %u.%u.%u.%u %d" CHEAT_SPECIFIER GSM_SPECIFIER PADEMU_SPECIFIER, mode_str, gDisableDebug, EnablePS2Logo, gExitPath, gHDDSpindown, local_ip_address[0], local_ip_address[1], local_ip_address[2], local_ip_address[3], local_netmask[0], local_netmask[1], local_netmask[2], local_netmask[3], local_gateway[0], local_gateway[1], local_gateway[2], local_gateway[3], gETHOpMode - CHEAT_ARGUMENT GSM_ARGUMENT); + CHEAT_ARGUMENT GSM_ARGUMENT PADEMU_ARGUMENT); argv[i] = config_str; i++; @@ -754,6 +814,10 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo rmEnd(); } +#ifdef PADEMU + ds3usb_reset(); + ds3bt_reset(); +#endif // Let's go. fileXioExit(); SifExitRpc(); From 047451e50dabf57e3eabb6b80d7b841844f80a5a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 25 Jan 2017 23:24:40 -0800 Subject: [PATCH 025/269] update Langs --- DETAILED_CHANGELOG | 1 + lng/lang_English.lng | 20 ++++++++++++++++++++ lng/lang_Hungarian.lng | 26 +++++++++++++++++++++++--- lng/lang_Portuguese.lng | 26 +++++++++++++++++++++++--- lng/lang_Russian.lng | 26 +++++++++++++++++++++++--- lng/lang_Spanish.lng | 26 +++++++++++++++++++++++--- lng/lang_Swedish.lng | 26 +++++++++++++++++++++++--- 7 files changed, 136 insertions(+), 15 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 33d98dc2d..10ecf4812 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev983 - Jay-Jay-OPL - the following changes were made: * @uyjulian commited: Quick fixes (#37) * @uyjulian commited: Add Dualshock 3 support over USB and Bluetooth (#36) Based off https://bitbucket.org/belek666/open-ps2-loader-ds3 Thanks to @belek666 - Tue Jan 24 14:56:58 2017 -0800 rev982 - Jay-Jay-OPL - small update so I can move up one revision--since at ps2-home.com we were already at r981. - Mon Jan 23 14:32:32 2017 -0800 rev981 - Jay-Jay-OPL - Following changes were made: **************************** (1) by Dr-Q: lng_pack.sh: Make it more simple and less hack-ish - Mon Jan 23 14:18:59 2017 -0800 rev980 - Jay-Jay-OPL - Updated to compile error and warning-free with the head PS2SDK by SP193. HDD and PFS drivers were also updated. (#35) * Updated ISOFS, MCEMU and USBHDFSD to be compatible with the new PS2SDK changes. ISOFS and USBHDFSD: updated definition for I/O functions. MCEMU: removed unused import of KprintfSet(). * Updated HDD and PFS drivers. - Sat Jan 21 17:19:08 2017 -0800 diff --git a/lng/lang_English.lng b/lng/lang_English.lng index d4414d380..7c7261a7d 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -228,5 +228,25 @@ Auto start Value in second(s), 0 to disable auto start PS2 Logo Only displayed for a valid disc logo which matches the console's region +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 197c7e328..b3e12b46e 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,7 +1,7 @@ # Translation by co5oos -# Last update: 01/02/2017 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Hungarian OPL %s Változtatások mentése @@ -210,5 +210,25 @@ Automatikus indítás Érték másodperc(ek)ben, 0 az Automatikus indítás letiltásához PS2 Logó Csak egy érvényes lemez logónál jelenik meg, amely egyezik a konzol régiójával +PADEMU konfigurálás +Pad Emulator Beállítások +Pad Emulátor engedélyezése +Be/ki kapcsolja a PadEmulátor-t a kiválaszott játékhoz. +Pad Emulátor mód +Válassza ki a Pad Emulátor módját. +DualShock3 USB +DualShock3 BT +Port beállítások: +Válassza ki a Pad Emulátor portot a beállításokhoz. +Emuláció engedélyezése +Be/ki kapcsolja a Pad Emulátor-t a kiválasztott porthoz. +Rezgés engedélyezése +Be/ki kapcsolja a rezgést a Pad Emulátor kiválasztott portjához. +Usb bluetooth adapter mac címe: +DS3 Kontroller párosítva erre a mac címre : +Párosítás +DS3 kontroller párosítása +DS3 kontroller párosítása bluetooth adapter mac címmel. +Nincs csatlakoztatva ELF Futtató Menü ELF Futtató Menü megjelenítési mód \ No newline at end of file diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 12fe956da..8973792b1 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,7 +1,7 @@ # Translation by danielb -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Portuguese OPL %s Salvar alterações @@ -210,5 +210,25 @@ Auto iniciar Valor em segundos, 0 para desativar Logo PS2 Apenas é exibido para um disco válido e que seja da mesma região da consola +Configurar PADEMU +Definições do Emulador de Comando +Ativar Emulador de Comando +Ligar/Desligar o emulador para o jogo selecionado. +Modo do Emulador de Comando +Selecione o modo do Emulador de Comando. +DualShock3 USB +DualShock3 BT +Definições para a porta: +Selecione a porta do Emulador de Comando para as definições. +Ativar emulação +Ligar/Desligar o emulador para a porta selecionada. +Ativar vibração. +Ligar/Desligar vibração na porta selecionada. +Endereço MAC do adaptador Bluetooth USB: +Endereço MAC do comando DS3 emparelhado: +Emparelhar +Emparelhar comando DS3 +Emparelhar comando DS3 com o seguinte endereço MAC: +Não ligado Menu do Iniciador ELF Modo de exibição do iniciador de ELF \ No newline at end of file diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 7fa99eed9..9cb4ff405 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,7 +1,7 @@ # Translated by druchapucha and frodosumkin -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Russian OPL %s Сохранить настройки @@ -210,5 +210,25 @@ PS2RD Cheat Engine пропатчит вашу игру Значение в секундах(ы), 0 чтобы выключить автопуск.. PS2 логотип Отображается экран, который запускается при запуске игрового диска +Настроить PADEMU +Настройки Pad эмулятора +Включить Pad эмулятор +Вкл/вык Pad эмулятор для выбранной игры. +Режим Pad эмулятора +Выбрать режим Pad эмулятора. +DualShock3 USB +DualShock3 BT +Настройки для порта: +Выбрать настройки для порта Pad эмулятора. +Включить эмуляцию +Вкл/вык Pad эмулятор для выбранного порта. +Включить вибрацию +Вкл/вык вибрацию в выбранном порте Pad эмулятора. +Usb bluetooth адаптер МАК адрес: +DS3 контроллер подключился к МАК адресу: +Подключение +Подключение DS3 контроллер +Подключение DS3 с bluetooth адаптер МАК адрес. +Не подключено Меню ELF Загрузчика Отобразить меню ELF Загрузчика \ No newline at end of file diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index d9e90d63b..4ee0268ec 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,7 +1,7 @@ # Translation by lauchon22 -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Spanish OPL %s Guardar cambios @@ -210,5 +210,25 @@ Inicio automático Valor en segundos, 0 para desactivar el inicio automático PS2 Logo Solo se muestra con un disco válido en una consola de la misma región +Configurar PADEMU +Configurar el mando del emulador +Activar mando del emulador +Activar/apagar el mando del emulador para el juego elegido +Modo del mando del emulador +Seleccione el modo del mando del emulador +DualShock3 USB +DualShock3 BlueTooth +Configuración del puerto +Seleccione el mando del emulador para ajustes +Activar emulación +Activar/apagar el mando del emulador en el puerto elegido +Activar vibración +Activar/apagar vibracion en el puerto elegido +Dirección MAC del mando BlueTooth USB: +Dirección MAC del mando DS3 emparejado +Emparejar +Emparejar mando DS3 +Emparejar mando DS3 con la siguiente dirección MAC: +No conectado ELF Loader Menu Modo inicio de menú de ELF Loader \ No newline at end of file diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 6edcc72aa..b5d5e8494 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,7 +1,7 @@ # Translation by Lord_Flaya -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Swedish OPL %s Spara ändringar @@ -210,5 +210,25 @@ Autostart Värde i sekund(er), 0 inaktiverar Autostart PS2 Logo Visas bara när skivavbilden matchar konsolens region +Konfigurera PADEMU +Pad Emulator Inställningar +Aktivera Pad Emulator +Slå av/på PadEmulator för valt spel. +Pad Emulator läge +Vlj Pad Emulator läge. +DualShock3 USB +DualShock3 BT +Inställningar för port: +Välj Pad Emulator port för inställningar. +Aktivera emulation +Slå av/på Pad Emulator för vald port. +Aktivera vibration +Slå av/på vibration för Pad Emulator vald port. +Usb bluetooth adapter mac address: +DS3 Controller parkopplad till mac address: +Parkoppla +Parkoppla DS3 controller +Parkoppla DS3 controller till bluetooth adapter mac address. +Ej ansluten ELF launcher meny ELF loader meny visningsläge \ No newline at end of file From bdf0c4d4497069467213fd7753e670c6052bd54c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 26 Jan 2017 13:53:25 -0800 Subject: [PATCH 026/269] @belek666 committed: Fixes displaying settings for pademu port 2 --- DETAILED_CHANGELOG | 1 + src/gui.c | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 10ecf4812..5279eab79 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev984 - Jay-Jay-OPL - update Langs - Wed Jan 25 23:24:40 2017 -0800 rev983 - Jay-Jay-OPL - the following changes were made: * @uyjulian commited: Quick fixes (#37) * @uyjulian commited: Add Dualshock 3 support over USB and Bluetooth (#36) Based off https://bitbucket.org/belek666/open-ps2-loader-ds3 Thanks to @belek666 - Tue Jan 24 14:56:58 2017 -0800 rev982 - Jay-Jay-OPL - small update so I can move up one revision--since at ps2-home.com we were already at r981. - Mon Jan 23 14:32:32 2017 -0800 rev981 - Jay-Jay-OPL - Following changes were made: **************************** (1) by Dr-Q: lng_pack.sh: Make it more simple and less hack-ish - Mon Jan 23 14:18:59 2017 -0800 diff --git a/src/gui.c b/src/gui.c index a4a69e0d4..c61b1696f 100644 --- a/src/gui.c +++ b/src/gui.c @@ -732,13 +732,16 @@ static int guiPadEmuUpdater(int modified) static void guiShowPadEmuConfig(void) { const char *PadEmuModes[] = {_l(_STR_DS3USB_MODE), _l(_STR_DS3BT_MODE), NULL}; - + int PadPort; + diaSetEnum(diaPadEmuConfig, PADCFG_PADEMU_MODE, PadEmuModes); diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_MODE, PadEmuSettings & 0xFF); - diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_PORT, (PadEmuSettings >> 8) & 1); - diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_VIB, (PadEmuSettings >> 16) & 1); + diaGetInt(diaPadEmuConfig, PADCFG_PADPORT, &PadPort); + + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_PORT, (PadEmuSettings >> (8 + PadPort - 1)) & 1); + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_VIB, (PadEmuSettings >> (16 + PadPort - 1)) & 1); int result = -1; From 6d5b6fd13fd62bc57ab4ba9f57e358946591d736 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 27 Jan 2017 00:54:07 -0800 Subject: [PATCH 027/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_German.lng | 26 +++++++++++++++++++++++--- lng/lang_Portuguese_BR.lng | 28 ++++++++++++++++++++++++---- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 5279eab79..936cef4ed 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev985 - Jay-Jay-OPL - @belek666 committed: Fixes displaying settings for pademu port 2 - Thu Jan 26 13:53:25 2017 -0800 rev984 - Jay-Jay-OPL - update Langs - Wed Jan 25 23:24:40 2017 -0800 rev983 - Jay-Jay-OPL - the following changes were made: * @uyjulian commited: Quick fixes (#37) * @uyjulian commited: Add Dualshock 3 support over USB and Bluetooth (#36) Based off https://bitbucket.org/belek666/open-ps2-loader-ds3 Thanks to @belek666 - Tue Jan 24 14:56:58 2017 -0800 rev982 - Jay-Jay-OPL - small update so I can move up one revision--since at ps2-home.com we were already at r981. - Mon Jan 23 14:32:32 2017 -0800 diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 7b18c355d..63992f925 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,7 +1,7 @@ # German Translation by ps2guy and lopotri -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/26/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 German OPL %s Änderungen speichern @@ -210,5 +210,25 @@ Automatischer Start Wert in Sekunden (sek), 0 um Auto-start zu deaktivieren PS2 Logo Wird nur bei gültigem Disc Logo angezeigt, welches mit der Region der Konsole übereinstimmen muss +PADEMU konfigurieren +Pad Emulator Einstellungen +Pad Emulator aktivieren +Aktiviere/deaktiviere den Pad Emulator für das ausgewählte Spiel. +Pad Emulator Modus +Wähle Pad Emulator Modus +DualShock3 USB +DualShock3 BT +Einstellungen für Anschluss: +Wähle Pad Emulator Anschluss für die Einstellungen. +Emulation aktivieren +Aktiviert/deaktiviert den Pad Emulator für den ausgewählten Anschluss. +Vibration aktivieren +Aktiviert/deaktiviert die Vibration für den ausgewählten Anschluss. +USB Bluetooth-Aadapter MAC-Adresse: +DS3 Controller verbunden zur MAC-Adresse: +Verbinden +Verbinde DS3 Controller +Verbinde DS3 Controller mit Bluetooth-Adapter MAC-Adresse. +Nicht verbunden ELF-starter Menü ELF-starter Menü Anzeigen \ No newline at end of file diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 964013cc8..493f9b097 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,7 +1,7 @@ -# Translation by Colossus and tonyhoro -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Translation by Colossus, tonyhoro, and joseri +# Last update: 01/26/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Brazilian Portuguese OPL %s Guardar Configurações @@ -210,5 +210,25 @@ Auto iniciar Valor em segundo(s), 0 para desativar Logotipo do PS2 Aparece apenas se houver um logotipo válido que seja da mesma região que o console +Configurar PADEMU +Configurações do Emulador de Controles +Ativar Emulador de Controles +Liga/desliga o Emulador de Controles para o jogo selecionado. +Modo Emulador de Controles +Selecione o modo do Emulador de Controles. +DualShock3 USB +DualShock3 BT +Configurações da porta: +Selecione a porta que será configurada. +Ativar emulação +Liga/desliga a emulação na porta selecionada. +Ativar vibração +Liga/desliga a vibração na porta selecionada. +Endereço MAC do adaptador Bluetooth USB: +Endereço MAC do Controle DS3 emparelhado: +Emparelhar +Emparelhar Controle DS3: +Emparelha o Controle DS3 com o MAC do adaptador Bluetooth. +Não conectado ELF Loader Menu Modo de inicio do ELF Loader Menu \ No newline at end of file From 77b3f764a9fc8aa6ab88912219966f296c51d25c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 30 Jan 2017 18:51:01 -0800 Subject: [PATCH 028/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Danish.lng | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 936cef4ed..2e04230ac 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev986 - Jay-Jay-OPL - update lang files - Fri Jan 27 00:54:07 2017 -0800 rev985 - Jay-Jay-OPL - @belek666 committed: Fixes displaying settings for pademu port 2 - Thu Jan 26 13:53:25 2017 -0800 rev984 - Jay-Jay-OPL - update Langs - Wed Jan 25 23:24:40 2017 -0800 rev983 - Jay-Jay-OPL - the following changes were made: * @uyjulian commited: Quick fixes (#37) * @uyjulian commited: Add Dualshock 3 support over USB and Bluetooth (#36) Based off https://bitbucket.org/belek666/open-ps2-loader-ds3 Thanks to @belek666 - Tue Jan 24 14:56:58 2017 -0800 diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index 87304026f..c96248615 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -210,5 +210,25 @@ Auto-start Værdi i sekunder(s), 0 for at deaktivere auto start PS2-Logo Vises kun med et gyldigt disk logo, som matcher konsollens region +Konfigurér PADEMU +Pad Emulator indstillinger +Aktivér Pad Emulator +Slå Pad Emulator Til/Fra for valgte spil. +Pad Emulator tilstand +Vælg Pad Emulator tilstand. +DualShock 3 USB +DualShock 3 BT +indstillinger for port: +Vælg Pad Emulator port for indstillinger. +Aktivér emulering +Slå Pad Emulator Til/Fra for valgte port. +Aktivér vibration +Slå vibration Til/Fra for valgte Pad Emulator port. +USB-bluetooth adapter MAC-adresse: +DS3-controller parret til MAC-adresse: +Parring +Pardan DS3 controller +Pardan DS3 controller med bluetooth adapters MAC-adresse. +Ikke tilsluttet ELF-Loader Menu ELF-Loader Menu visningstilstand \ No newline at end of file From 755522acd6716c87a204ace70b204ad99ad4c504 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 30 Jan 2017 19:22:06 -0800 Subject: [PATCH 029/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Arabic.lng | 26 ++- lng/lang_Bulgarian.lng | 26 ++- lng/lang_Czech.lng | 26 ++- lng/lang_Danish.lng | 6 +- lng/lang_Filipino.lng | 26 ++- lng/lang_French.lng | 26 ++- lng/lang_Greek.lng | 26 ++- lng/lang_Indonesian.lng | 26 ++- lng/lang_Italian.lng | 26 ++- lng/lang_Korean.lng | 446 +++++++++++++++++++++------------------- lng/lang_Laotian.lng | 26 ++- lng/lang_Polish.lng | 26 ++- lng/lang_TChinese.lng | 446 +++++++++++++++++++++------------------- lng/lang_Turkish.lng | 26 ++- 15 files changed, 723 insertions(+), 462 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 2e04230ac..5df17a92a 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev987 - Jay-Jay-OPL - update lang files - Mon Jan 30 18:51:01 2017 -0800 rev986 - Jay-Jay-OPL - update lang files - Fri Jan 27 00:54:07 2017 -0800 rev985 - Jay-Jay-OPL - @belek666 committed: Fixes displaying settings for pademu port 2 - Thu Jan 26 13:53:25 2017 -0800 rev984 - Jay-Jay-OPL - update Langs - Wed Jan 25 23:24:40 2017 -0800 diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index a4138ff62..744ccd4c0 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,7 +1,7 @@ # translation by alimadhi -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Arabic OPL %s حفظ التغييرات @@ -210,5 +210,25 @@ FMV اجتياز القيمة في الثانية (s)، صفر لتعطيل التشغيل التلقائي PS2 Logo Only displayed for a valid disc logo which matches the console's region +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected قائمة مشغلات ELF مخصص ELF \ No newline at end of file diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 293ae40ec..4ef0556c7 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,7 +1,7 @@ # translation by vsub and wisi -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Bulgarian OPL %s Запазване на промените @@ -210,5 +210,25 @@ Cheats по избор Стойност в секунди, 0 за деактивиране. PS2 Logo Активно само при валидно лого на диска, съвпадащо с региона на конзолата. +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index cdfc202db..12094c26d 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,7 +1,7 @@ # Translated by jimmysmith -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Czech OPL %s Uložit změny @@ -210,5 +210,25 @@ Auto start Hodnota v sekundách, zadej 0 pro vypnutí auto startu PS2 Logo Zobrazováno pouze u validního loga disku, který má stejný region jako konzole +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected ELF Loader Menu ELF Loader Menu mód \ No newline at end of file diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index c96248615..ab47d5068 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,7 +1,7 @@ # Translation by BongKris -# Last update: 01/10/2017 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/30/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Danish OPL %s Gem indstillinger diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 92a9af73e..8ff5b2b94 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,7 +1,7 @@ # Translation by Ceed Lorenzo -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Filipino OPL %s I-save ang mga pagbabago @@ -210,5 +210,25 @@ Auto start Value in second(s), 0 to disable auto start PS2 Logo Only displayed for a valid disc logo which matches the console's region +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 434fa80e6..202250c6a 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,7 +1,7 @@ # Translation by machiavel -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 French OPL %s Sauvegarder @@ -210,5 +210,25 @@ Démarrage auto. Valeur en seconde(s), 0 pour désactiver le démarrage auto Logo PS2 S'affiche uniquement si le logo du disque est compatible avec la région de votre console +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected Menu lanceur d'ELF Mode d'affichage du menu lanceur d'ELF \ No newline at end of file diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 5e938240c..273b1713a 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,7 +1,7 @@ # Greek Translation by RivalK93 -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Greek OPL %s Αποθήκευση αλλαγών @@ -210,5 +210,25 @@ Patchάρισμα των παιχνιδιών από το PS2RD Τιμή σε δευτερόλεπτα, 0 για μη αυτόματη εκκίνηση PS2 Logo Only displayed for a valid disc logo which matches the console's region +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected Μενού ELF Loader Εμφάνιση μενού ELF Loader \ No newline at end of file diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 46342fc62..cb60d2b6c 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,7 +1,7 @@ # translated by verislasher -# Last update: 10/26/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Indonesian OPL %s Simpan Perubahan @@ -210,5 +210,25 @@ Mulai otomatis Nilai dalam detik, 0 mencegah mulai otomatis Logo PS2 Hanya ditampilkan untuk logo disc yang valid yang cocok dengan region konsol +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected Menu peluncur ELF Mode Tampilan Menu Pemuat ELF \ No newline at end of file diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index d6d70d404..df1cbb15f 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,7 +1,7 @@ # Translation by jauffre and andre95d -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Italian OPL %s Salva modifiche @@ -210,5 +210,25 @@ Avvio automatico Valore in secondi, 0 per disabilitare l'avvio automatico PS2 Logo Mostrato soltanto con un logo del disco valido e compatibile con la regione della console +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected Menu ELF Loader Caricamento menu ELF Loader \ No newline at end of file diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index e704d6af9..20f711d67 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,214 +1,234 @@ -# Translated by DDinghoya -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread -Korean -OPL %s -저장 변경 -뒤로 -네트워크 구성 -고급 옵션 -<값 없음> -설정 저장… -설정 기록 중 에러! -종료 -설정 -메뉴 -USB 게임 -HDD 게임 -ETH 게임 -응용프로그램 -테마 -언어 -시스템 전원이 꺼집니다. -Browser/OSDSYS 종료합니까? -업데이트 취소합니까? -%d: HDD를 검색할 수 없습니다 -%d: HDD가 포맷되지 않았습니다 -%d: 네트워크 시작 에러 -%d: 네트워크 아답터 감지 안됩니다 -%d: SMB 서버에 접속할 수 없습니다 -%d: SMB 서버에 로그인할 수 없습니다 -%d: SMB 공유를 열 수 없습니다 -%d: SMB 공유 목록을 나열할 수 없습니다 -%d: 게임 목록을 나열 할 수 없습니다 -%d: DHCP 서버가 존재하지 않습니다 -%d: 네트워크에 접속할 수 없습니다 -켜기 -끄기 -확인 -선택 -취소 -O -X -게임 목록 -게임 설정 -모든 설정 제거 -설정된 게임 키 제거 -스크롤 속도 -느림 -보통 -빠름 -기본 메뉴 -디스크 읽기 -기다리세요 -게임 ID 불러오는 중 오류 -자동 정렬 -언어 파일 불러오는 중 오류 -디버그 색상 비활성 -컨트롤러가 없습니다. 대기 중… -표지 보기 -와이드 화면 -전원 끄기 -불러오기 설정 -저장 설정 -장치 시작 -새로 고침 -USB 장치 시작 모드 -HDD 장치 시작 모드 -ETH 장치 시작 모드 -응용프로그램 시작 모드 -자동 -수동 -HDL 서버 시작 -HDL 서버 시작 중… -HDL 서버 가동 중… -HDL 서버 시작 실패 -HDL 서버 업로딩 중… -IGR 경로 -배경 색상 -문자 색상 -- PS2 - -- SMB 서버 - -IP 주소 형식 -Static -DHCP -IP 주소 -주소 -마스크 -게이트웨이 -DNS 서버 -포트 -공유 -유저 -비밀번호 -<설정 안됨> -주소 형식 -IP -NetBIOS -허용 -항목은 영구적으로 삭제됩니다, 계속합니까? -이름변경 -삭제 -실행 -디스플레이 설정 -쓰기 작업 활성 -USB 게임 손상 검사 -마지막에 실행한 게임 기억 -버튼 선택 -오류, 게임이 손상 되었습니다. -오류, 항목을 실행할 수 없습니다 -테스트 -게스트 권한을 위해 지움 -정밀하게 읽음 -동기화 모드 -시스템 호출 해제 -동영상 건너 뛰기 -DV-DL 에뮬레이트 -IGR 비활성 -고성능 모듈 스토리지 -DEV9 모듈 숨기기 -크기 변경 시 VMC 재포멧 됩니다. -생성 -시작 -수정 -포기 -재설정 -일반적 사용 -VMC 구성 -이름 -크기 -현황 -진행 -VMC 파일 존재 -잘못된 VMC 파일, 크기가 다릅니다. -VMC 파일이 생성되야 합니다. -VMC %s 에러, 메모리카드(슬롯 %d)에서 계속합니까? -자동 새로 고침 -오픈 PS2 로더에 관하여 -개발자 -품질 보증 -USB prefix 경로 -IGR 후 사용자 정의 ELF 부팅 -분 입력, 회전 멈추지 않으려면 0으로 설정 -자동 HDD 회전 멈춤 -비디오 모드 -대화상자 색상 -선택한 색상 -정보 페이지 표시 -정보 -사용자 정의 ELF -색상 선택 -재접속 -목록 공유를 위해 지움 -ETH prefix 경로 -백스페이스 -스페이스 -입력 -모드 -VMC 슬롯 1 -VMC 슬롯 2 -게임 ID -DMA 모드 -V-Sync -모드 1 -모드 2 -모드 3 -모드 4 -모드 5 -모드 6 -모드 7 -모드 8 -GSM 구성 -이더넷 링크 모드 -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex -GSM 설정 -GSM 활성 -GSM 켜기 또는 끄기 -VMODE -강제 사용자 지정 디스플레이 모드 -H-POS -수평 조정 -V-POS -수직 조정 -FMV 건너뛰기 -풀 모션 비디오 건너뛰기 -치트 설정 -PS2RD 치트 엔진 활성 -PS2RD 치트 엔진 패치 적용 -PS2RD 치트 엔진 모드 -게임 치트 자동 선택 또는 선택 -치트 자동 선택 -게임 치트 선택 -오류: 치트 파일 불러오기 실패 -치트를 찾을 수 없음 -다운로드 기본값 -네트워크 업데이트 -기존 데이터에서 다시 다운로드 합니까? -업데이트 실패. -업데이트 서버에 연결 실패. -업데이트 완료. -업데이트 취소. -네트워크에서 설정을 다운로드 합니까? -사용자 정의 설정 -다운로드 받은 기본값 -%i 자동 시작… -자동 시작 -초 입력, 자동 시작하지 않으려면 0으로 설정 -PS2 로고 -콘솔의 지역과 일치하는 유효한 디스크 로고만 표시 -ELF 로더 메뉴 +# Translated by DDinghoya +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +Korean +OPL %s +저장 변경 +뒤로 +네트워크 구성 +고급 옵션 +<값 없음> +설정 저장… +설정 기록 중 에러! +종료 +설정 +메뉴 +USB 게임 +HDD 게임 +ETH 게임 +응용프로그램 +테마 +언어 +시스템 전원이 꺼집니다. +Browser/OSDSYS 종료합니까? +업데이트 취소합니까? +%d: HDD를 검색할 수 없습니다 +%d: HDD가 포맷되지 않았습니다 +%d: 네트워크 시작 에러 +%d: 네트워크 아답터 감지 안됩니다 +%d: SMB 서버에 접속할 수 없습니다 +%d: SMB 서버에 로그인할 수 없습니다 +%d: SMB 공유를 열 수 없습니다 +%d: SMB 공유 목록을 나열할 수 없습니다 +%d: 게임 목록을 나열 할 수 없습니다 +%d: DHCP 서버가 존재하지 않습니다 +%d: 네트워크에 접속할 수 없습니다 +켜기 +끄기 +확인 +선택 +취소 +O +X +게임 목록 +게임 설정 +모든 설정 제거 +설정된 게임 키 제거 +스크롤 속도 +느림 +보통 +빠름 +기본 메뉴 +디스크 읽기 +기다리세요 +게임 ID 불러오는 중 오류 +자동 정렬 +언어 파일 불러오는 중 오류 +디버그 색상 비활성 +컨트롤러가 없습니다. 대기 중… +표지 보기 +와이드 화면 +전원 끄기 +불러오기 설정 +저장 설정 +장치 시작 +새로 고침 +USB 장치 시작 모드 +HDD 장치 시작 모드 +ETH 장치 시작 모드 +응용프로그램 시작 모드 +자동 +수동 +HDL 서버 시작 +HDL 서버 시작 중… +HDL 서버 가동 중… +HDL 서버 시작 실패 +HDL 서버 업로딩 중… +IGR 경로 +배경 색상 +문자 색상 +- PS2 - +- SMB 서버 - +IP 주소 형식 +Static +DHCP +IP 주소 +주소 +마스크 +게이트웨이 +DNS 서버 +포트 +공유 +유저 +비밀번호 +<설정 안됨> +주소 형식 +IP +NetBIOS +허용 +항목은 영구적으로 삭제됩니다, 계속합니까? +이름변경 +삭제 +실행 +디스플레이 설정 +쓰기 작업 활성 +USB 게임 손상 검사 +마지막에 실행한 게임 기억 +버튼 선택 +오류, 게임이 손상 되었습니다. +오류, 항목을 실행할 수 없습니다 +테스트 +게스트 권한을 위해 지움 +정밀하게 읽음 +동기화 모드 +시스템 호출 해제 +동영상 건너 뛰기 +DV-DL 에뮬레이트 +IGR 비활성 +고성능 모듈 스토리지 +DEV9 모듈 숨기기 +크기 변경 시 VMC 재포멧 됩니다. +생성 +시작 +수정 +포기 +재설정 +일반적 사용 +VMC 구성 +이름 +크기 +현황 +진행 +VMC 파일 존재 +잘못된 VMC 파일, 크기가 다릅니다. +VMC 파일이 생성되야 합니다. +VMC %s 에러, 메모리카드(슬롯 %d)에서 계속합니까? +자동 새로 고침 +오픈 PS2 로더에 관하여 +개발자 +품질 보증 +USB prefix 경로 +IGR 후 사용자 정의 ELF 부팅 +분 입력, 회전 멈추지 않으려면 0으로 설정 +자동 HDD 회전 멈춤 +비디오 모드 +대화상자 색상 +선택한 색상 +정보 페이지 표시 +정보 +사용자 정의 ELF +색상 선택 +재접속 +목록 공유를 위해 지움 +ETH prefix 경로 +백스페이스 +스페이스 +입력 +모드 +VMC 슬롯 1 +VMC 슬롯 2 +게임 ID +DMA 모드 +V-Sync +모드 1 +모드 2 +모드 3 +모드 4 +모드 5 +모드 6 +모드 7 +모드 8 +GSM 구성 +이더넷 링크 모드 +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex +GSM 설정 +GSM 활성 +GSM 켜기 또는 끄기 +VMODE +강제 사용자 지정 디스플레이 모드 +H-POS +수평 조정 +V-POS +수직 조정 +FMV 건너뛰기 +풀 모션 비디오 건너뛰기 +치트 설정 +PS2RD 치트 엔진 활성 +PS2RD 치트 엔진 패치 적용 +PS2RD 치트 엔진 모드 +게임 치트 자동 선택 또는 선택 +치트 자동 선택 +게임 치트 선택 +오류: 치트 파일 불러오기 실패 +치트를 찾을 수 없음 +다운로드 기본값 +네트워크 업데이트 +기존 데이터에서 다시 다운로드 합니까? +업데이트 실패. +업데이트 서버에 연결 실패. +업데이트 완료. +업데이트 취소. +네트워크에서 설정을 다운로드 합니까? +사용자 정의 설정 +다운로드 받은 기본값 +%i 자동 시작… +자동 시작 +초 입력, 자동 시작하지 않으려면 0으로 설정 +PS2 로고 +콘솔의 지역과 일치하는 유효한 디스크 로고만 표시 +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected +ELF 로더 메뉴 ELF 로더 메뉴 디스플레이 모드 \ No newline at end of file diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index b059fb235..e55526cc1 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,7 +1,7 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Laotian OPL %s ບັນທຶກການປ່ຽນແປງ @@ -210,5 +210,25 @@ V-POS ຕັ້ງຄ່າຫົວໜ່ວຍ ວິນາທີ, ໃສ່ 0 ເພື່ອປິດການເປີດໃຊ້ແບບໂອໂຕ PS2 Logo ຈະຖືກສະແດງຜົນ ກໍຕໍ່ເມື່ອໂລໂກ້ຂອງແຜ່ນຖືກຕ້ອງ ແລະ ສອດຄ່ອງຕາມໂຊນຂອງເຄື່ອງ +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected ເມນູສຳລັບຈັດການ ELF ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index 542155acf..22dfdfe22 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,7 +1,7 @@ # Translation by yohokaru -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Polish OPL %s Zapisz zmiany @@ -210,5 +210,25 @@ Auto start Wartość w sekundach, 0 wyłącza auto start Logo PS2 Pokaże się tylko jeśli region gry jest zgodny z regionem posiadanej konsoli. +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese.lng index a2e2c6366..120bddce7 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese.lng @@ -1,214 +1,234 @@ -# Translated by kane159 -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread -Traditional Chinese -OPL %s -保存設置 -返回 -網絡設置 -進階設置 -<無數值> -設置已保存... -寫入設置錯誤! -離開 -設置 -選單 -USB 遊戲 -HDD 遊戲 -ETH 遊戲 -應用程式 -主題 -語言 -系統電源將會關閉. -Exit to Browser/OSDSYS? -取消更新? -%d: 偵測不到硬碟 -%d: 硬碟沒有格式化 -%d: 啟動網絡錯誤 -%d: 偵測不到網卡 -%d: 無法連接 SMB 伺服器 -%d: 無法登入 SMB 伺服器 -%d: 無法開啟 SMB 共享 -%d: 無法羅列 SMB 共享清單 -%d: 無法列出遊戲清單 -%d: DHCP 伺服器不存在 -%d: 無網絡連接 -開啟 -關閉 -確定 -選擇 -取消 -圓圈 -叉叉 -遊戲清單 -遊戲設置 -移除所有設置 -移除遊戲所有的設置 -滾動 -較慢 -中等 -較快 -預設選單 -從光碟中讀取 -請稍後 -讀取 Game ID 時出錯 -自動滾動 -讀取語言文件時出錯 -禁用 Debug Colors -無偵測到搖桿, 等待中... -啟用圖示封面 -寬螢幕 -關機 -設置讀取中 -設置儲存中 -啟動裝置 -重新整理 -USB 裝置啟動模式 -HDD 裝置啟動模式 -ETH 裝置啟動模式 -應用程式啟動模式 -自動 -手動 -啟動 HDL 服務 -HDL 服務啟動中... -HDL 服務正在運行... -啟動 HDL 服務時出錯. -HDL 服務未能讀取... -IGR 位置 -背景顏色 -文字顏色 -- PS2 - -- SMB 伺服器 - -IP 位置模式 -靜態 -DHCP -IP 位置 -位置 -子網路遮罩 -閘道 -DNS 伺服器 -端口 -共享 -使用者 -密碼 -<無設置> -位置格式 -IP -NetBIOS -允許 -項目將被永久刪除, 繼續嗎? -重新命名 -刪除 -運行 -顯示設置 -啟用刪除與重新命名功能 -檢查 USB 遊戲碎片 -記住最後一個玩的遊戲 -選定鍵 -錯誤, 遊戲有碎片 -錯誤, 無法運行該項目 -測試 -GUEST驗證留空. -精確讀取 -同步模式 -脫開系統調用 -跳过视频 -模擬 DVD-DL -禁用 IGR -隱藏模式內存 -隱藏 DEV9 模式 -改變大小將會重新格式化 VMC -生成 -開始 -變更 -放棄 -重置 -使用通用 -設置 VMC -名稱 -大小 -狀態 -進度 -VMC 檔案已存在 -無效的 VMC 檔案, 大小有誤 -需要建立VMC 檔案 -VMC %s 出錯, 繼續使用物理記憶卡嗎 (slot %d) ? -自動重新整理 -關於 -Coders -Quality Assurance -USB 前墜路徑 -Boots Custom ELF after an IGR -數值以分鐘計,設為 0 禁用降速 -自動 HDD 降速 -影片模式 -對話框顏色 -被選定顏色 -顯示資訊業面 -資訊 -自定義 ELF -顏色選項 -重新連線 -留空列出共享清單 -ETH 前墜位置 -退格 -空格 -Enter -模式 -VMC 插槽 1 -VMC 插槽 2 -Game ID -DMA 模式 -V-Sync -模式 1 -模式 2 -模式 3 -模式 4 -模式 5 -模式 6 -模式 7 -模式 8 -配置 GSM -以太網鏈接模式 -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex -GSM 設置 -啟用 GSM -切換 GSM 開或關 -VMODE -強制自定義顯示模式 -H-POS -水平調整 -V-POS -垂直調整 -跳過 FMV -跳過全動態視頻 -金手指設置 -啟用 PS2RD 金手指引擎 -允許 PS2RD 金手指引擎對你的遊戲進行補丁 -PS2RD 金手指引擎模式 -自動選擇或選擇遊戲金手指 -自動選擇金手指 -選擇遊戲金手指 -錯誤: 讀取金手指文件出錯 -無發現金手指文件 -下載預設值 -網絡更新 -重新下載現有記錄? -更新失敗. -連結更新伺服器失敗. -更新已完成. -更新已取消. -從網絡上下載設置? -自定義設置 -已下載預設值 -將自動於 %i 秒後啟動... -自動啟動 -以秒為單位,設為 0 來禁用自動啟動 -PS2 Logo -Only displayed for a valid disc logo which matches the console's region -ELF Loader Menu +# Translated by kane159 +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +Traditional Chinese +OPL %s +保存設置 +返回 +網絡設置 +進階設置 +<無數值> +設置已保存... +寫入設置錯誤! +離開 +設置 +選單 +USB 遊戲 +HDD 遊戲 +ETH 遊戲 +應用程式 +主題 +語言 +系統電源將會關閉. +Exit to Browser/OSDSYS? +取消更新? +%d: 偵測不到硬碟 +%d: 硬碟沒有格式化 +%d: 啟動網絡錯誤 +%d: 偵測不到網卡 +%d: 無法連接 SMB 伺服器 +%d: 無法登入 SMB 伺服器 +%d: 無法開啟 SMB 共享 +%d: 無法羅列 SMB 共享清單 +%d: 無法列出遊戲清單 +%d: DHCP 伺服器不存在 +%d: 無網絡連接 +開啟 +關閉 +確定 +選擇 +取消 +圓圈 +叉叉 +遊戲清單 +遊戲設置 +移除所有設置 +移除遊戲所有的設置 +滾動 +較慢 +中等 +較快 +預設選單 +從光碟中讀取 +請稍後 +讀取 Game ID 時出錯 +自動滾動 +讀取語言文件時出錯 +禁用 Debug Colors +無偵測到搖桿, 等待中... +啟用圖示封面 +寬螢幕 +關機 +設置讀取中 +設置儲存中 +啟動裝置 +重新整理 +USB 裝置啟動模式 +HDD 裝置啟動模式 +ETH 裝置啟動模式 +應用程式啟動模式 +自動 +手動 +啟動 HDL 服務 +HDL 服務啟動中... +HDL 服務正在運行... +啟動 HDL 服務時出錯. +HDL 服務未能讀取... +IGR 位置 +背景顏色 +文字顏色 +- PS2 - +- SMB 伺服器 - +IP 位置模式 +靜態 +DHCP +IP 位置 +位置 +子網路遮罩 +閘道 +DNS 伺服器 +端口 +共享 +使用者 +密碼 +<無設置> +位置格式 +IP +NetBIOS +允許 +項目將被永久刪除, 繼續嗎? +重新命名 +刪除 +運行 +顯示設置 +啟用刪除與重新命名功能 +檢查 USB 遊戲碎片 +記住最後一個玩的遊戲 +選定鍵 +錯誤, 遊戲有碎片 +錯誤, 無法運行該項目 +測試 +GUEST驗證留空. +精確讀取 +同步模式 +脫開系統調用 +跳过视频 +模擬 DVD-DL +禁用 IGR +隱藏模式內存 +隱藏 DEV9 模式 +改變大小將會重新格式化 VMC +生成 +開始 +變更 +放棄 +重置 +使用通用 +設置 VMC +名稱 +大小 +狀態 +進度 +VMC 檔案已存在 +無效的 VMC 檔案, 大小有誤 +需要建立VMC 檔案 +VMC %s 出錯, 繼續使用物理記憶卡嗎 (slot %d) ? +自動重新整理 +關於 +Coders +Quality Assurance +USB 前墜路徑 +Boots Custom ELF after an IGR +數值以分鐘計,設為 0 禁用降速 +自動 HDD 降速 +影片模式 +對話框顏色 +被選定顏色 +顯示資訊業面 +資訊 +自定義 ELF +顏色選項 +重新連線 +留空列出共享清單 +ETH 前墜位置 +退格 +空格 +Enter +模式 +VMC 插槽 1 +VMC 插槽 2 +Game ID +DMA 模式 +V-Sync +模式 1 +模式 2 +模式 3 +模式 4 +模式 5 +模式 6 +模式 7 +模式 8 +配置 GSM +以太網鏈接模式 +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex +GSM 設置 +啟用 GSM +切換 GSM 開或關 +VMODE +強制自定義顯示模式 +H-POS +水平調整 +V-POS +垂直調整 +跳過 FMV +跳過全動態視頻 +金手指設置 +啟用 PS2RD 金手指引擎 +允許 PS2RD 金手指引擎對你的遊戲進行補丁 +PS2RD 金手指引擎模式 +自動選擇或選擇遊戲金手指 +自動選擇金手指 +選擇遊戲金手指 +錯誤: 讀取金手指文件出錯 +無發現金手指文件 +下載預設值 +網絡更新 +重新下載現有記錄? +更新失敗. +連結更新伺服器失敗. +更新已完成. +更新已取消. +從網絡上下載設置? +自定義設置 +已下載預設值 +將自動於 %i 秒後啟動... +自動啟動 +以秒為單位,設為 0 來禁用自動啟動 +PS2 Logo +Only displayed for a valid disc logo which matches the console's region +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected +ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index f0e43fa28..a2c133fa4 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,7 +1,7 @@ # Translation by Gürkan DEMİR aka: dante -# Last update: 10/23/2016 -# Updated for OPL_r963_DB [b7e6f26] -# official thread: http://ps2home.freeforums.net/post/1966/thread +# Last update: 01/25/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Turkish OPL %s Değişiklikleri kaydet @@ -210,5 +210,25 @@ Auto start Value in second(s), 0 to disable auto start PS2 Logo Only displayed for a valid disc logo which matches the console's region +Configure PADEMU +Pad Emulator Settings +Enable Pad Emulator +Turns on/off PadEmulator for selected game. +Pad Emulator mode +Select Pad Emulator mode. +DualShock3 USB +DualShock3 BT +Settings for port: +Select Pad Emulator port for settings. +Enable emulation +Turns on/off Pad Emulator for selected port. +Enable vibration +Turns on/off vibration for Pad Emulator selected port. +Usb bluetooth adapter mac address: +DS3 Controller paired to mac address: +Pair +Pair DS3 controller +Pair DS3 controller with bluetooth adapter mac address. +Not connected ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file From 49fd30998dceeb983fc8f9b3a094c342debda1df Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 31 Jan 2017 13:08:15 -0800 Subject: [PATCH 030/269] update langs --- DETAILED_CHANGELOG | 1 + lng/lang_Indonesian.lng | 40 ++++++++++++++++++++-------------------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 5df17a92a..c74b76a1d 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev988 - Jay-Jay-OPL - update lang files - Mon Jan 30 19:22:06 2017 -0800 rev987 - Jay-Jay-OPL - update lang files - Mon Jan 30 18:51:01 2017 -0800 rev986 - Jay-Jay-OPL - update lang files - Fri Jan 27 00:54:07 2017 -0800 rev985 - Jay-Jay-OPL - @belek666 committed: Fixes displaying settings for pademu port 2 - Thu Jan 26 13:53:25 2017 -0800 diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index cb60d2b6c..fdcb55aa3 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,5 +1,5 @@ -# translated by verislasher -# Last update: 01/25/2017 +# translated by verislasher and jbliz +# Last update: 01/31/2017 # Updated for OPL_983_DB [7f7e9af] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Indonesian @@ -210,25 +210,25 @@ Mulai otomatis Nilai dalam detik, 0 mencegah mulai otomatis Logo PS2 Hanya ditampilkan untuk logo disc yang valid yang cocok dengan region konsol -Configure PADEMU -Pad Emulator Settings -Enable Pad Emulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode -Select Pad Emulator mode. +Konfigurasi PADEMU +Konfigurasi Emulasi Pad +Aktifkan Emulasi Pad +Nyalakan/Matikan Emulasi Pad dipermainan terpilih. +Mode Emulasi Pad +Pilih Mode Emulasi Pad. DualShock3 USB DualShock3 BT -Settings for port: -Select Pad Emulator port for settings. -Enable emulation -Turns on/off Pad Emulator for selected port. -Enable vibration -Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: -Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. -Not connected +Pengaturan untuk port: +Pilih port Emulasi Pad untuk diatur. +Aktifkan emulasi +Nyalakan/Matikan Emulasi Pad diport terpilih. +Aktifkan getaran +Nyalakan/Matikan getaran untuk Emulasi Pad diport terpilih. +Alamat Mac Adaptor USB Bluetooth: +Kontrol DS3 terpasang pada alamat mac: +Pasang +Pasang Kontrol DS3 +Pasang Kontrol DS3 dengan alamat mac bluetooth. +Tidak terhubung Menu peluncur ELF Mode Tampilan Menu Pemuat ELF \ No newline at end of file From 05f9b19f5708ac8319315095d3b72dc4b28a9f5e Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 2 Feb 2017 17:42:04 -0800 Subject: [PATCH 031/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Indonesian.lng | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index c74b76a1d..a7b4210ab 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev989 - Jay-Jay-OPL - update langs - Tue Jan 31 13:08:15 2017 -0800 rev988 - Jay-Jay-OPL - update lang files - Mon Jan 30 19:22:06 2017 -0800 rev987 - Jay-Jay-OPL - update lang files - Mon Jan 30 18:51:01 2017 -0800 rev986 - Jay-Jay-OPL - update lang files - Fri Jan 27 00:54:07 2017 -0800 diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index fdcb55aa3..1e62cefc7 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,5 +1,5 @@ -# translated by verislasher and jbliz -# Last update: 01/31/2017 +# translated by verislasher and jbliz +# Last update: 02/02/2017 # Updated for OPL_983_DB [7f7e9af] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Indonesian @@ -211,13 +211,13 @@ Nilai dalam detik, 0 mencegah mulai otomatis Logo PS2 Hanya ditampilkan untuk logo disc yang valid yang cocok dengan region konsol Konfigurasi PADEMU -Konfigurasi Emulasi Pad -Aktifkan Emulasi Pad -Nyalakan/Matikan Emulasi Pad dipermainan terpilih. -Mode Emulasi Pad -Pilih Mode Emulasi Pad. -DualShock3 USB -DualShock3 BT +Pengaturan Stik Emulator +Aktifkan Stik Emulator +Hidup/matikan StikEmulator game dipilih. +Mode Stik Emulator +Pilih mode Stik Emulator. +USB DualShock3 +BT DualShock3 Pengaturan untuk port: Pilih port Emulasi Pad untuk diatur. Aktifkan emulasi From f3ef7e5306ce20c0803815a4bf33bcf42fab78d6 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 2 Feb 2017 18:56:18 -0800 Subject: [PATCH 032/269] @AKuHAK committed the following changes: Synced with mainstream ps2sdk: * Corrected the use of mixed-sign arithmetic, corrected the transfer limit for ata_device_sector_io(), changed ATAD to use the typedefs for fixed-sized values (i.e. u16 instead of unsigned short) to ensure correctness. (56f0335) Note: 48-bit changes didnt ported into HD Pro ATAD module -Corrected l-value assignment in udnl modules. -Synced with mainstream ps2sdk: * (IOP modules, except for memory card and padman) Corrected l-value assignment, strict-aliasing, unused value and sign-mismatched errors/warnings.(5a015a8) Note: usbhdfsd needs to be synced later with this commit. --- DETAILED_CHANGELOG | 1 + modules/debug/ps2link/net_fio.c | 4 ++ modules/hdd/atad/ps2atad.c | 86 ++++++++++++----------- modules/hdd/common/atad.h | 12 ++-- modules/hdd/hdpro_atad/hdproatad.c | 100 ++++++++++++++------------- modules/iopcore/cdvdman/atad.c | 61 ++++++++-------- modules/iopcore/cdvdman/atad.h | 10 +-- modules/iopcore/cdvdman/hdpro_atad.c | 80 +++++++++++---------- modules/iopcore/cdvdman/smb.c | 64 +++++++++-------- modules/iopcore/udnl-t300/udnl.c | 8 +-- modules/iopcore/udnl/udnl.c | 8 +-- modules/network/smap-ingame/xfer.c | 2 +- modules/network/smap-ingame/xfer.h | 2 +- modules/network/smbinit/des.c | 6 +- modules/network/smbinit/des.h | 2 +- modules/network/smbinit/md4.c | 25 ++++--- modules/network/smbinit/smbauth.c | 10 +-- 17 files changed, 257 insertions(+), 224 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index a7b4210ab..105472e58 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev990 - Jay-Jay-OPL - update lang files - Thu Feb 2 17:42:04 2017 -0800 rev989 - Jay-Jay-OPL - update langs - Tue Jan 31 13:08:15 2017 -0800 rev988 - Jay-Jay-OPL - update lang files - Mon Jan 30 19:22:06 2017 -0800 rev987 - Jay-Jay-OPL - update lang files - Mon Jan 30 18:51:01 2017 -0800 diff --git a/modules/debug/ps2link/net_fio.c b/modules/debug/ps2link/net_fio.c index 68e71b85e..47cca4e72 100644 --- a/modules/debug/ps2link/net_fio.c +++ b/modules/debug/ps2link/net_fio.c @@ -111,7 +111,9 @@ int pko_accept_pkt(int sock, char *buf, int len, int pkt_type) { int length; pko_pkt_hdr *hdr; +#ifdef DEBUG unsigned int hcmd; +#endif unsigned short hlen; @@ -128,7 +130,9 @@ int pko_accept_pkt(int sock, char *buf, int len, int pkt_type) } hdr = (pko_pkt_hdr *)buf; +#ifdef DEBUG hcmd = ntohl(hdr->cmd); +#endif hlen = ntohs(hdr->len); if (hcmd != pkt_type) { diff --git a/modules/hdd/atad/ps2atad.c b/modules/hdd/atad/ps2atad.c index ac69819d5..b00929969 100644 --- a/modules/hdd/atad/ps2atad.c +++ b/modules/hdd/atad/ps2atad.c @@ -42,22 +42,22 @@ static int ata_devinfo_init = 0; static int ata_evflg = -1; /* Used for indicating 48-bit LBA support. */ -static unsigned char lba_48bit[2] = {0, 0}; +static u8 lba_48bit[2] = {0, 0}; -static unsigned char Disable48bitLBA = 0; //Please read the comments in _start(). +static u8 Disable48bitLBA = 0; //Please read the comments in _start(). /* Local device info kept for drives 0 and 1. */ static ata_devinfo_t atad_devinfo[2]; /* Data returned from DEVICE IDENTIFY is kept here. Also, this is used by the security commands to set and unlock the password. */ -static unsigned short int ata_param[256]; +static u16 ata_param[256]; /* ATA command info. */ typedef struct _ata_cmd_info { - unsigned char command; - unsigned char type; + u8 command; + u8 type; } ata_cmd_info_t; static const ata_cmd_info_t ata_cmd_table[] = { @@ -139,10 +139,14 @@ static const ata_cmd_info_t smart_cmd_table[] = { /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ typedef struct _ata_cmd_state { - int type; /* The ata_cmd_info_t type field. */ - void *buf; - unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ + s32 type; /* The ata_cmd_info_t type field. */ + union { + void *buf; + u8 *buf8; + u16 *buf16; + }; + u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ + s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -328,7 +332,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, const ata_cmd_info_t *cmd_table; int i, res, type, cmd_table_size; int using_timeout, device = (select >> 4) & 1; - unsigned char searchcmd; + u8 searchcmd; ClearEventFlag(ata_evflg, 0); @@ -445,9 +449,10 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) { USE_ATA_REGS; - void *buf; + u8 *buf8; + u16 *buf16; int i, type; - unsigned short int status = ata_hwport->r_status & 0xff; + u16 status = ata_hwport->r_status & 0xff; if (status & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); @@ -462,23 +467,24 @@ static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) if (type == 3 || type == 8) { /* PIO data out */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; for (i = 0; i < 256; i++) { - ata_hwport->r_data = *(unsigned short int *)buf; - cmd_state->buf = ++((unsigned short int *)buf); + ata_hwport->r_data = *buf16; + cmd_state->buf16 = ++buf16; } + buf8 = cmd_state->buf8; if (cmd_state->type == 8) { for (i = 0; i < 4; i++) { - ata_hwport->r_data = *(u8 *)buf; - cmd_state->buf = ++((u8 *)buf); + ata_hwport->r_data = *buf8; + cmd_state->buf8 = ++buf8; } } } else if (type == 2) { /* PIO data in */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; for (i = 0; i < 256; i++) { - *(unsigned short int *)buf = ata_hwport->r_data; - cmd_state->buf = ++((unsigned short int *)buf); + *buf16 = ata_hwport->r_data; + cmd_state->buf16 = ++buf16; } } @@ -486,14 +492,13 @@ static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) } /* Complete a DMA transfer, to or from the device. */ -static inline int ata_dma_complete(void *buf, int blkcount, int dir) +static inline int ata_dma_complete(void *buf, u32 blkcount, int dir) { USE_ATA_REGS; USE_SPD_REGS; - unsigned int count, nbytes; - u32 bits; + u32 bits, count, nbytes; int i, res; - unsigned short int dma_stat; + u16 dma_stat; while (blkcount) { for (i = 0; i < 20; i++) @@ -531,7 +536,7 @@ static inline int ata_dma_complete(void *buf, int blkcount, int dir) if ((res = dev9DmaTransfer(0, buf, (nbytes << 9) | 32, dir)) < 0) return res; - (u8 *)buf += nbytes; + buf = (void*)((u8 *)buf + nbytes); blkcount -= count; } @@ -546,7 +551,7 @@ int ata_io_finish(void) ata_cmd_state_t *cmd_state = &atad_cmd_state; u32 bits; int i, res = 0, type = cmd_state->type; - unsigned short int stat; + u16 stat; if (type == 1 || type == 6) { /* Non-data commands. */ WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); @@ -763,7 +768,7 @@ int ata_device_set_transfer_mode(int device, int type, int mode) int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) { int res = 0; - unsigned short int sector, lcyl, hcyl, select, command, len; + u16 sector, lcyl, hcyl, select, command, len; while (nsectors > 0) { ata_set_dir(dir); @@ -773,8 +778,10 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) hcyl = (lba >> 16) & 0xff; if (lba_48bit[device]) { - /* Setup for 48-bit LBA. */ - len = (nsectors > 65536) ? 65536 : nsectors; + /* Setup for 48-bit LBA. + While ATA-6 allows for the transfer of up to 65536 sectors, + the DMAC allows only up to 65536 x 128 / 512 = 16384 sectors. */ + len = (nsectors > 16384) ? 16384 : nsectors; /* Combine bits 24-31 and bits 0-7 of lba into sector. */ sector = ((lba >> 16) & 0xff00) | (lba & 0xff); @@ -795,7 +802,7 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) if ((res = ata_io_finish()) != 0) return res; - (u8 *)buf += (len * 512); + buf = (void*)((u8 *)buf + len * 512); lba += len; nsectors -= len; } @@ -803,7 +810,7 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) return res; } -static void ata_get_security_status(int device, ata_devinfo_t *devinfo, unsigned short int *param) +static void ata_get_security_status(int device, ata_devinfo_t *devinfo, u16 *param) { if (ata_device_identify(device, param) == 0) devinfo[device].security_status = param[ATA_ID_SECURITY_STATUS]; @@ -813,7 +820,7 @@ static void ata_get_security_status(int device, ata_devinfo_t *devinfo, unsigned int ata_device_sce_sec_set_password(int device, void *password) { ata_devinfo_t *devinfo = atad_devinfo; - unsigned short int *param = ata_param; + u16 *param = ata_param; int res; if (devinfo[device].security_status & ATA_F_SEC_ENABLED) @@ -834,7 +841,7 @@ int ata_device_sce_sec_set_password(int device, void *password) int ata_device_sce_sec_unlock(int device, void *password) { ata_devinfo_t *devinfo = atad_devinfo; - unsigned short int *param = ata_param; + u16 *param = ata_param; int res; if (!(devinfo[device].security_status & ATA_F_SEC_LOCKED)) @@ -860,7 +867,6 @@ int ata_device_sce_sec_unlock(int device, void *password) int ata_device_sce_sec_erase(int device) { ata_devinfo_t *devinfo = atad_devinfo; - unsigned short int *param = NULL; int res; if (!(devinfo[device].security_status & ATA_F_SEC_ENABLED) || !(devinfo[device].security_status & ATA_F_SEC_LOCKED)) @@ -876,14 +882,14 @@ int ata_device_sce_sec_erase(int device) res = ata_io_finish(); finish: - ata_get_security_status(device, devinfo, param); + ata_get_security_status(device, devinfo, NULL); return res; } static void ata_device_probe(ata_devinfo_t *devinfo) { USE_ATA_REGS; - unsigned short int nsector, sector, lcyl, hcyl, select; + u16 nsector, sector, lcyl, hcyl, select; devinfo->exists = 0; devinfo->has_packet = 0; @@ -994,7 +1000,7 @@ ata_devinfo_t *ata_get_devinfo(int device) static void ata_set_dir(int dir) { USE_SPD_REGS; - unsigned short int val; + u16 val; SPD_REG16(0x38) = 3; val = SPD_REG16(SPD_R_IF_CTRL) & 1; @@ -1006,7 +1012,7 @@ static void ata_set_dir(int dir) static void ata_pio_mode(int mode) { USE_SPD_REGS; - unsigned short int val; + u16 val; switch (mode) { case 1: @@ -1031,7 +1037,7 @@ static void ata_pio_mode(int mode) static void ata_multiword_dma_mode(int mode) { USE_SPD_REGS; - unsigned short int val; + u16 val; switch (mode) { case 1: @@ -1051,7 +1057,7 @@ static void ata_multiword_dma_mode(int mode) static void ata_ultra_dma_mode(int mode) { USE_SPD_REGS; - unsigned short int val; + u16 val; switch (mode) { case 1: diff --git a/modules/hdd/common/atad.h b/modules/hdd/common/atad.h index ee73d1078..f79918d02 100644 --- a/modules/hdd/common/atad.h +++ b/modules/hdd/common/atad.h @@ -27,10 +27,10 @@ typedef struct _ata_devinfo { - int exists; /* Was successfully probed. */ - int has_packet; /* Supports the PACKET command set. */ - unsigned int total_sectors; /* Total number of user sectors. */ - unsigned int security_status; /* Word 0x100 of the identify info. */ + s32 exists; /* Was successfully probed. */ + s32 has_packet; /* Supports the PACKET command set. */ + u32 total_sectors; /* Total number of user sectors. */ + u32 security_status; /* Word 0x100 of the identify info. */ } ata_devinfo_t; #define atad_IMPORTS_start DECLARE_IMPORT_TABLE(atad, 1, 3) @@ -42,7 +42,7 @@ ata_devinfo_t *ata_get_devinfo(int device); int ata_reset_devices(void); #define I_ata_reset_devices DECLARE_IMPORT(5, ata_reset_devices) -int ata_io_start(void *buf, unsigned int blkcount, unsigned short int feature, unsigned short int nsector, unsigned short int sector, unsigned short int lcyl, unsigned short int hcyl, unsigned short int select, unsigned short int command); +int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command); #define I_ata_io_start DECLARE_IMPORT(6, ata_io_start) int ata_io_finish(void); #define I_ata_io_finish DECLARE_IMPORT(7, ata_io_finish) @@ -50,7 +50,7 @@ int ata_io_finish(void); int ata_get_error(void); #define I_ata_get_error DECLARE_IMPORT(8, ata_get_error) -int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir); +int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir); #define I_ata_device_sector_io DECLARE_IMPORT(9, ata_device_sector_io) //DRM functions that were meant to keep users from sharing disks (and hence the contained content). Supported by only Sony-modified HDDs (e.g. the SCPH-20400). diff --git a/modules/hdd/hdpro_atad/hdproatad.c b/modules/hdd/hdpro_atad/hdproatad.c index 2b01534b7..e4879c1d3 100644 --- a/modules/hdd/hdpro_atad/hdproatad.c +++ b/modules/hdd/hdpro_atad/hdproatad.c @@ -37,10 +37,10 @@ IRX_ID(MODNAME, 1, 1); // HD Pro Kit is mapping the 1st word in ROM0 seg as a main ATA controller, // The pseudo ATA controller registers are accessed (input/ouput) by writing // an id to the main ATA controller (id specific to HDpro, see registers id below). -#define HDPROreg_IO8 (*(volatile unsigned char *)0xBFC00000) -#define HDPROreg_IO32 (*(volatile unsigned int *)0xBFC00000) +#define HDPROreg_IO8 (*(volatile u8 *)0xBFC00000) +#define HDPROreg_IO32 (*(volatile u32 *)0xBFC00000) -#define CDVDreg_STATUS (*(volatile unsigned char *)0xBF40200A) +#define CDVDreg_STATUS (*(volatile u8 *)0xBF40200A) // Pseudo ATA controller registers id - Output #define ATAreg_CONTROL_RD 0x68 @@ -66,29 +66,29 @@ IRX_ID(MODNAME, 1, 1); typedef struct _ata_devinfo { - int exists; /* Was successfully probed. */ - int has_packet; /* Supports the PACKET command set. */ - unsigned int total_sectors; /* Total number of user sectors. */ - unsigned int security_status; /* Word 0x100 of the identify info. */ + s32 exists; /* Was successfully probed. */ + s32 has_packet; /* Supports the PACKET command set. */ + u32 total_sectors; /* Total number of user sectors. */ + u32 security_status; /* Word 0x100 of the identify info. */ } ata_devinfo_t; static int ata_evflg = -1; /* Used for indicating 48-bit LBA support. */ -static unsigned char lba_48bit[2] = {0, 0}; +static u8 lba_48bit[2] = {0, 0}; /* Local device info kept for drives 0 and 1. */ static ata_devinfo_t atad_devinfo[2]; /* Data returned from DEVICE IDENTIFY is kept here. Also, this is used by the security commands to set and unlock the password. */ -static unsigned short int ata_param[256]; +static u16 ata_param[256]; /* ATA command info. */ typedef struct _ata_cmd_info { - unsigned char command; - unsigned char type; + u8 command; + u8 type; } ata_cmd_info_t; static const ata_cmd_info_t ata_cmd_table[] = { @@ -161,10 +161,14 @@ static const ata_cmd_info_t smart_cmd_table[] = { /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ typedef struct _ata_cmd_state { - int type; /* The ata_cmd_info_t type field. */ - void *buf; - unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ + s32 type; /* The ata_cmd_info_t type field. */ + union { + void *buf; + u8 *buf8; + u16 *buf16; + }; + u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ + s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -220,7 +224,7 @@ static int hdpro_io_start(void) CDVDreg_STATUS = 0; HDPROreg_IO8 = 0x61; CDVDreg_STATUS = 0; - unsigned int res = HDPROreg_IO8; + u32 res = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); @@ -253,7 +257,7 @@ static int hdpro_io_finish(void) return hdpro_io_active ^ 1; } -static void hdpro_io_write(unsigned char cmd, unsigned short int val) +static void hdpro_io_write(u8 cmd, u16 val) { suspend_intr(); @@ -268,16 +272,16 @@ static void hdpro_io_write(unsigned char cmd, unsigned short int val) resume_intr(); } -static int hdpro_io_read(unsigned char cmd) +static int hdpro_io_read(u8 cmd) { suspend_intr(); // IO read from HD Pro HDPROreg_IO8 = cmd; CDVDreg_STATUS = 0; - unsigned int res0 = HDPROreg_IO8; + u32 res0 = HDPROreg_IO8; CDVDreg_STATUS = 0; - unsigned int res1 = HDPROreg_IO8; + u32 res1 = HDPROreg_IO8; CDVDreg_STATUS = 0; res0 = (res0 & 0xff) | (res1 << 8); @@ -383,7 +387,7 @@ static int ata_wait_busy(int bits) hdpro_io_start(); - unsigned short int r_control = hdpro_io_read(ATAreg_CONTROL_RD); + u16 r_control = hdpro_io_read(ATAreg_CONTROL_RD); hdpro_io_finish(); @@ -441,13 +445,13 @@ static int ata_device_select(int device) } /* Export 6 */ -int ata_io_start(void *buf, unsigned int blkcount, unsigned short int feature, unsigned short int nsector, unsigned short int sector, unsigned short int lcyl, unsigned short int hcyl, unsigned short int select, unsigned short int command) +int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command) { iop_sys_clock_t cmd_timeout; const ata_cmd_info_t *cmd_table; int i, res, type, cmd_table_size; int using_timeout, device = (select >> 4) & 1; - unsigned int searchcmd; + u32 searchcmd; ClearEventFlag(ata_evflg, 0); @@ -523,7 +527,7 @@ int ata_io_start(void *buf, unsigned int blkcount, unsigned short int feature, u suspend_intr(); HDPROreg_IO8 = 0x21; CDVDreg_STATUS = 0; - unsigned int dummy = HDPROreg_IO8; + u32 dummy = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); dummy = 0; @@ -558,10 +562,11 @@ int ata_io_start(void *buf, unsigned int blkcount, unsigned short int feature, u /* Do a PIO transfer, to or from the device. */ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) { - void *buf; + u8 *buf8; + u16 *buf16; int i, type; int res = 0, chk = 0; - unsigned short int status = hdpro_io_read(ATAreg_STATUS_RD); + u16 status = hdpro_io_read(ATAreg_STATUS_RD); if (status & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); @@ -576,32 +581,33 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) if (type == 3 || type == 8) { /* PIO data out */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; HDPROreg_IO8 = 0x43; CDVDreg_STATUS = 0; for (i = 0; i < 256; i++) { - unsigned short int r_data = *(unsigned short int *)buf; + u16 r_data = *buf16; hdpro_io_write(ATAreg_DATA_WR, r_data); chk ^= r_data + i; - cmd_state->buf = ++((unsigned short int *)buf); + cmd_state->buf = ++buf16; } - unsigned short int out = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; + u16 out = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; if (out != (chk & 0xffff)) return -504; if (cmd_state->type == 8) { + buf8 = cmd_state->buf8; for (i = 0; i < 4; i++) { - hdpro_io_write(ATAreg_DATA_WR, *(unsigned char *)buf); - cmd_state->buf = ++((unsigned char *)buf); + hdpro_io_write(ATAreg_DATA_WR, *buf8); + cmd_state->buf = ++buf8; } } } else if (type == 2) { /* PIO data in */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; suspend_intr(); @@ -611,16 +617,16 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) for (i = 0; i < 256; i++) { - unsigned int res0 = HDPROreg_IO8; + u32 res0 = HDPROreg_IO8; CDVDreg_STATUS = 0; - unsigned int res1 = HDPROreg_IO8; + u32 res1 = HDPROreg_IO8; CDVDreg_STATUS = 0; res0 = (res0 & 0xff) | (res1 << 8); chk ^= res0 + i; - *(unsigned short int *)buf = res0 & 0xffff; - cmd_state->buf = ++((unsigned short int *)buf); + *buf16 = res0 & 0xffff; + cmd_state->buf16 = ++buf16; } HDPROreg_IO8 = 0x51; @@ -629,7 +635,7 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) resume_intr(); - unsigned short int r_data = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; + u16 r_data = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; if (r_data != (chk & 0xffff)) return -504; } @@ -656,7 +662,7 @@ int ata_reset_devices(void) static void ata_device_probe(ata_devinfo_t *devinfo) { - unsigned short int nsector, sector, lcyl, hcyl, select; + u16 nsector, lcyl, hcyl;//sector, select; unused devinfo->exists = 0; devinfo->has_packet = 0; @@ -665,10 +671,10 @@ static void ata_device_probe(ata_devinfo_t *devinfo) return; nsector = hdpro_io_read(ATAreg_NSECTOR_RD) & 0xff; - sector = hdpro_io_read(ATAreg_SECTOR_RD) & 0xff; + //sector = hdpro_io_read(ATAreg_SECTOR_RD) & 0xff; unused lcyl = hdpro_io_read(ATAreg_LCYL_RD) & 0xff; hcyl = hdpro_io_read(ATAreg_HCYL_RD) & 0xff; - select = hdpro_io_read(ATAreg_SELECT_RD) & 0xff; + //select = hdpro_io_read(ATAreg_SELECT_RD) & 0xff; unused if (nsector != 1) return; @@ -804,7 +810,7 @@ int ata_io_finish(void) ata_cmd_state_t *cmd_state = &atad_cmd_state; u32 bits; int res = 0, type = cmd_state->type; - unsigned short int stat; + u16 stat; if (type == 1 || type == 6) { /* Non-data commands. */ @@ -813,7 +819,7 @@ int ata_io_finish(void) HDPROreg_IO8 = 0x21; CDVDreg_STATUS = 0; - unsigned int ret = HDPROreg_IO8; + u32 ret = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); @@ -865,11 +871,10 @@ int ata_io_finish(void) } /* Export 9 */ -int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir) +int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) { int res = 0; - unsigned int nbytes; - unsigned short int sector, lcyl, hcyl, select, command, len; + u16 sector, lcyl, hcyl, select, command, len; if (!hdpro_io_start()) return -1; @@ -902,8 +907,7 @@ int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int n if ((res = ata_io_finish()) != 0) continue; - nbytes = len * 512; - (u8 *)buf += nbytes; + buf = (void*)((u8 *)buf + len * 512); lba += len; nsectors -= len; } diff --git a/modules/iopcore/cdvdman/atad.c b/modules/iopcore/cdvdman/atad.c index 129be84dd..e4ee70f5a 100644 --- a/modules/iopcore/cdvdman/atad.c +++ b/modules/iopcore/cdvdman/atad.c @@ -88,10 +88,14 @@ static const ata_cmd_info_t smart_cmd_table[] = { /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ typedef struct _ata_cmd_state { - int type; /* The ata_cmd_info_t type field. */ - void *buf; - unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ + s32 type; /* The ata_cmd_info_t type field. */ + union { + void *buf; + u8 *buf8; + u16 *buf16; + }; + u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ + s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -265,7 +269,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, const ata_cmd_info_t *cmd_table; int i, res, type, cmd_table_size; int using_timeout, device = (select >> 4) & 1; - unsigned char searchcmd; + u8 searchcmd; ClearEventFlag(ata_evflg, 0); @@ -379,9 +383,10 @@ static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) return 0; USE_ATA_REGS; - void *buf; + u8 *buf8; + u16 *buf16; int i, type; - unsigned short int status = ata_hwport->r_status & 0xff; + u16 status = ata_hwport->r_status & 0xff; if (status & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); @@ -396,23 +401,24 @@ static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) if (type == 3 || type == 8) { /* PIO data out */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; for (i = 0; i < 256; i++) { - ata_hwport->r_data = *(unsigned short int *)buf; - cmd_state->buf = ++((unsigned short int *)buf); + ata_hwport->r_data = *buf16; + cmd_state->buf16 = ++buf16; } + buf8 = cmd_state->buf8; if (cmd_state->type == 8) { for (i = 0; i < 4; i++) { - ata_hwport->r_data = *(u8 *)buf; - cmd_state->buf = ++((u8 *)buf); + ata_hwport->r_data = *buf8; + cmd_state->buf8 = ++buf8; } } } else if (type == 2) { /* PIO data in */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; for (i = 0; i < 256; i++) { - *(unsigned short int *)buf = ata_hwport->r_data; - cmd_state->buf = ++((unsigned short int *)buf); + *buf16 = ata_hwport->r_data; + cmd_state->buf16 = ++buf16; } } @@ -420,14 +426,13 @@ static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) } /* Complete a DMA transfer, to or from the device. */ -static inline int ata_dma_complete(void *buf, int blkcount, int dir) +static inline int ata_dma_complete(void *buf, u32 blkcount, int dir) { USE_ATA_REGS; USE_SPD_REGS; - unsigned int count, nbytes; - u32 bits; + u32 bits, count, nbytes; int i, res; - unsigned short int dma_stat; + u16 dma_stat; while (blkcount) { for (i = 0; i < 20; i++) @@ -468,7 +473,7 @@ static inline int ata_dma_complete(void *buf, int blkcount, int dir) if ((res = dev9DmaTransfer(0, buf, (nbytes << 9) | 32, dir)) < 0) return res; - (u8 *)buf += nbytes; + buf = (void*)((u8 *)buf + nbytes); blkcount -= count; } @@ -483,7 +488,7 @@ int ata_io_finish(void) ata_cmd_state_t *cmd_state = &atad_cmd_state; u32 bits; int i, res = 0, type = cmd_state->type; - unsigned short int stat; + u16 stat; if (type == 1 || type == 6) { /* Non-data commands. */ WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); @@ -542,10 +547,10 @@ int ata_io_finish(void) } /* Export 9 */ -int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir) +int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) { int res = 0; - unsigned short int sector, lcyl, hcyl, select, command, len; + u16 sector, lcyl, hcyl, select, command, len; WAITIOSEMA(io_sema); @@ -557,8 +562,10 @@ int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int n hcyl = (lba >> 16) & 0xff; if (lba_48bit) { - /* Setup for 48-bit LBA. */ - len = (nsectors > 65536) ? 65536 : nsectors; + /* Setup for 48-bit LBA. + While ATA-6 allows for the transfer of up to 65536 sectors, + the DMAC allows only up to 65536 x 128 / 512 = 16384 sectors. */ + len = (nsectors > 16384) ? 16384 : nsectors; /* Combine bits 24-31 and bits 0-7 of lba into sector. */ sector = ((lba >> 16) & 0xff00) | (lba & 0xff); @@ -583,7 +590,7 @@ int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int n return res; } - (u8 *)buf += (len * 512); + buf = (void*)((u8 *)buf + len * 512); lba += len; nsectors -= len; } @@ -602,7 +609,7 @@ ata_devinfo_t *ata_get_devinfo(int device) static void ata_set_dir(int dir) { USE_SPD_REGS; - unsigned short int val; + u16 val; SPD_REG16(0x38) = 3; val = SPD_REG16(SPD_R_IF_CTRL) & 1; diff --git a/modules/iopcore/cdvdman/atad.h b/modules/iopcore/cdvdman/atad.h index 4a5244f61..491b7bb3d 100644 --- a/modules/iopcore/cdvdman/atad.h +++ b/modules/iopcore/cdvdman/atad.h @@ -27,10 +27,10 @@ typedef struct _ata_devinfo { - int exists; /* Was successfully probed. */ - int has_packet; /* Supports the PACKET command set. */ - unsigned int total_sectors; /* Total number of user sectors. */ - unsigned int security_status; /* Word 0x100 of the identify info. */ + s32 exists; /* Was successfully probed. */ + s32 has_packet; /* Supports the PACKET command set. */ + u32 total_sectors; /* Total number of user sectors. */ + u32 security_status; /* Word 0x100 of the identify info. */ } ata_devinfo_t; int atad_start(void); @@ -38,7 +38,7 @@ ata_devinfo_t *ata_get_devinfo(int device); int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command); int ata_io_finish(void); int ata_get_error(void); -int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir); +int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir); // APA Partition #define APA_MAGIC 0x00415041 // 'APA\0' diff --git a/modules/iopcore/cdvdman/hdpro_atad.c b/modules/iopcore/cdvdman/hdpro_atad.c index ac6617a15..f558716fe 100644 --- a/modules/iopcore/cdvdman/hdpro_atad.c +++ b/modules/iopcore/cdvdman/hdpro_atad.c @@ -40,10 +40,10 @@ // HD Pro Kit is mapping the 1st word in ROM0 seg as a main ATA controller, // The pseudo ATA controller registers are accessed (input/ouput) by writing // an id to the main ATA controller (id specific to HDpro, see registers id below). -#define HDPROreg_IO8 (*(volatile unsigned char *)0xBFC00000) -#define HDPROreg_IO32 (*(volatile unsigned int *)0xBFC00000) +#define HDPROreg_IO8 (*(volatile u8 *)0xBFC00000) +#define HDPROreg_IO32 (*(volatile u32 *)0xBFC00000) -#define CDVDreg_STATUS (*(volatile unsigned char *)0xBF40200A) +#define CDVDreg_STATUS (*(volatile u8 *)0xBF40200A) // Pseudo ATA controller registers id - Output #define ATAreg_CONTROL_RD 0x68 @@ -92,8 +92,8 @@ static ata_devinfo_t atad_devinfo; /* ATA command info. */ typedef struct _ata_cmd_info { - unsigned char command; - unsigned char type; + u8 command; + u8 type; } ata_cmd_info_t; static const ata_cmd_info_t ata_cmd_table[] = { @@ -119,10 +119,14 @@ static const ata_cmd_info_t smart_cmd_table[] = { /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ typedef struct _ata_cmd_state { - int type; /* The ata_cmd_info_t type field. */ - void *buf; - unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ + s32 type; /* The ata_cmd_info_t type field. */ + union { + void *buf; + u8 *buf8; + u16 *buf16; + }; + u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ + s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -173,7 +177,7 @@ static int hdpro_io_start(void) CDVDreg_STATUS = 0; HDPROreg_IO8 = 0x61; CDVDreg_STATUS = 0; - unsigned int res = HDPROreg_IO8; + u32 res = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); @@ -206,7 +210,7 @@ static int hdpro_io_finish(void) return hdpro_io_active ^ 1; } -static void hdpro_io_write(unsigned char cmd, unsigned short int val) +static void hdpro_io_write(u8 cmd, u16 val) { suspend_intr(); @@ -221,16 +225,16 @@ static void hdpro_io_write(unsigned char cmd, unsigned short int val) resume_intr(); } -static int hdpro_io_read(unsigned char cmd) +static int hdpro_io_read(u8 cmd) { suspend_intr(); // IO read from HD Pro HDPROreg_IO8 = cmd; CDVDreg_STATUS = 0; - unsigned int res0 = HDPROreg_IO8; + u32 res0 = HDPROreg_IO8; CDVDreg_STATUS = 0; - unsigned int res1 = HDPROreg_IO8; + u32 res1 = HDPROreg_IO8; CDVDreg_STATUS = 0; res0 = (res0 & 0xff) | (res1 << 8); @@ -322,7 +326,7 @@ static int ata_wait_busy(int bits) hdpro_io_start(); - unsigned short int r_control = hdpro_io_read(ATAreg_CONTROL_RD); + u16 r_control = hdpro_io_read(ATAreg_CONTROL_RD); hdpro_io_finish(); @@ -386,7 +390,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, const ata_cmd_info_t *cmd_table; int i, res, type, cmd_table_size; int using_timeout, device = (select >> 4) & 1; - unsigned int searchcmd; + u32 searchcmd; ClearEventFlag(ata_evflg, 0); @@ -462,7 +466,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, suspend_intr(); HDPROreg_IO8 = 0x21; CDVDreg_STATUS = 0; - unsigned int dummy = HDPROreg_IO8; + u32 dummy = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); dummy = 0; @@ -497,10 +501,11 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, /* Do a PIO transfer, to or from the device. */ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) { - void *buf; + u8 *buf8; + u16 *buf16; int i, type; int res = 0, chk = 0; - unsigned short int status = hdpro_io_read(ATAreg_STATUS_RD); + u16 status = hdpro_io_read(ATAreg_STATUS_RD); if (status & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); @@ -515,32 +520,33 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) if (type == 3 || type == 8) { /* PIO data out */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; HDPROreg_IO8 = 0x43; CDVDreg_STATUS = 0; for (i = 0; i < 256; i++) { - unsigned short int r_data = *(unsigned short int *)buf; + u16 r_data = *buf16; hdpro_io_write(ATAreg_DATA_WR, r_data); chk ^= r_data + i; - cmd_state->buf = ++((unsigned short int *)buf); + cmd_state->buf = ++buf16; } - unsigned short int out = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; + u16 out = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; if (out != (chk & 0xffff)) return -504; if (cmd_state->type == 8) { + buf8 = cmd_state->buf8; for (i = 0; i < 4; i++) { - hdpro_io_write(ATAreg_DATA_WR, *(unsigned char *)buf); - cmd_state->buf = ++((unsigned char *)buf); + hdpro_io_write(ATAreg_DATA_WR, *buf8); + cmd_state->buf = ++buf8; } } } else if (type == 2) { /* PIO data in */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; suspend_intr(); @@ -550,16 +556,16 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) for (i = 0; i < 256; i++) { - unsigned int res0 = HDPROreg_IO8; + u32 res0 = HDPROreg_IO8; CDVDreg_STATUS = 0; - unsigned int res1 = HDPROreg_IO8; + u32 res1 = HDPROreg_IO8; CDVDreg_STATUS = 0; res0 = (res0 & 0xff) | (res1 << 8); chk ^= res0 + i; - *(unsigned short int *)buf = res0 & 0xffff; - cmd_state->buf = ++((unsigned short int *)buf); + *buf16 = res0 & 0xffff; + cmd_state->buf16 = ++buf16; } HDPROreg_IO8 = 0x51; @@ -568,7 +574,7 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) resume_intr(); - unsigned short int r_data = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; + u16 r_data = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; if (r_data != (chk & 0xffff)) return -504; } @@ -582,7 +588,7 @@ int ata_io_finish(void) ata_cmd_state_t *cmd_state = &atad_cmd_state; u32 bits; int res = 0, type = cmd_state->type; - unsigned short int stat; + u16 stat; if (type == 1 || type == 6) { /* Non-data commands. */ @@ -591,7 +597,7 @@ int ata_io_finish(void) HDPROreg_IO8 = 0x21; CDVDreg_STATUS = 0; - unsigned int ret = HDPROreg_IO8; + u32 ret = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); @@ -644,11 +650,10 @@ int ata_io_finish(void) } /* Export 9 */ -int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir) +int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) { int res = 0; - unsigned int nbytes; - unsigned short int sector, lcyl, hcyl, select, command, len; + u16 sector, lcyl, hcyl, select, command, len; WAITIOSEMA(io_sema); @@ -683,8 +688,7 @@ int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int n if ((res = ata_io_finish()) != 0) continue; - nbytes = len * 512; - (u8 *)buf += nbytes; + buf = (void*)((u8 *)buf + len * 512); lba += len; nsectors -= len; } diff --git a/modules/iopcore/cdvdman/smb.c b/modules/iopcore/cdvdman/smb.c index 99dc45c42..5f11ef05a 100644 --- a/modules/iopcore/cdvdman/smb.c +++ b/modules/iopcore/cdvdman/smb.c @@ -285,16 +285,20 @@ static struct WriteAndXRequest_t smb_Write_Request = { static u16 UID, TID; static int main_socket; -static u8 SMB_buf[1024]; - +static union { + u8 u8buff[1024]; + u16 u16buff[1024 / sizeof(u16)]; + s16 s16buff[1024 / sizeof(s16)]; +} SMB_buf; + //------------------------------------------------------------------------- int rawTCP_SetSessionHeader(u32 size) // Write Session Service header: careful it's raw TCP transport here and not NBT transport { // maximum for raw TCP transport (24 bits) !!! - SMB_buf[0] = 0; - SMB_buf[1] = (size >> 16) & 0xff; - SMB_buf[2] = (size >> 8) & 0xff; - SMB_buf[3] = size; + SMB_buf.u8buff[0] = 0; + SMB_buf.u8buff[1] = (size >> 16) & 0xff; + SMB_buf.u8buff[2] = (size >> 8) & 0xff; + SMB_buf.u8buff[3] = size; return (int)size; } @@ -305,9 +309,9 @@ int rawTCP_GetSessionHeader(void) // Read Session Service header: careful it's r register u32 size; // maximum for raw TCP transport (24 bits) !!! - size = SMB_buf[3]; - size |= SMB_buf[2] << 8; - size |= SMB_buf[1] << 16; + size = SMB_buf.u8buff[3]; + size |= SMB_buf.u8buff[2] << 8; + size |= SMB_buf.u8buff[1] << 16; return (int)size; } @@ -343,23 +347,23 @@ int GetSMBServerReply(void) { register int rcv_size, totalpkt_size, pkt_size; - rcv_size = plwip_send(main_socket, SMB_buf, rawTCP_GetSessionHeader() + 4, 0); + rcv_size = plwip_send(main_socket, SMB_buf.u8buff, rawTCP_GetSessionHeader() + 4, 0); if (rcv_size <= 0) return -1; receive: - rcv_size = plwip_recvfrom(main_socket, NULL, 0, SMB_buf, sizeof(SMB_buf), 0, NULL, NULL); + rcv_size = plwip_recvfrom(main_socket, NULL, 0, SMB_buf.u8buff, sizeof(SMB_buf.u8buff), 0, NULL, NULL); if (rcv_size <= 0) return -2; - if (SMB_buf[0] != 0) // dropping NBSS Session Keep alive + if (SMB_buf.u8buff[0] != 0) // dropping NBSS Session Keep alive goto receive; // Handle fragmented packets totalpkt_size = rawTCP_GetSessionHeader() + 4; while (rcv_size < totalpkt_size) { - pkt_size = plwip_recvfrom(main_socket, NULL, 0, &SMB_buf[rcv_size], sizeof(SMB_buf) - rcv_size, 0, NULL, NULL); + pkt_size = plwip_recvfrom(main_socket, NULL, 0, &SMB_buf.u8buff[rcv_size], sizeof(SMB_buf.u8buff) - rcv_size, 0, NULL, NULL); if (pkt_size <= 0) return -2; rcv_size += pkt_size; @@ -372,7 +376,7 @@ int GetSMBServerReply(void) int smb_NegotiateProtocol(char *SMBServerIP, int SMBServerPort, char *Username, char *Password, u32 *capabilities, OplSmbPwHashFunc_t hash_callback) { char *dialect = "NT LM 0.12"; - struct NegociateProtocolRequest_t *NPR = (struct NegociateProtocolRequest_t *)SMB_buf; + struct NegociateProtocolRequest_t *NPR = (struct NegociateProtocolRequest_t *)SMB_buf.u8buff; register int length; struct in_addr dst_addr; #ifdef VMC_DRIVER @@ -391,7 +395,7 @@ int smb_NegotiateProtocol(char *SMBServerIP, int SMBServerPort, char *Username, negociate_retry: - mips_memset(SMB_buf, 0, sizeof(SMB_buf)); + mips_memset(SMB_buf.u8buff, 0, sizeof(SMB_buf.u8buff)); NPR->smbH.Magic = SMB_MAGIC; NPR->smbH.Cmd = SMB_COM_NEGOCIATE; @@ -405,7 +409,7 @@ int smb_NegotiateProtocol(char *SMBServerIP, int SMBServerPort, char *Username, rawTCP_SetSessionHeader(37 + length); GetSMBServerReply(); - struct NegociateProtocolResponse_t *NPRsp = (struct NegociateProtocolResponse_t *)SMB_buf; + struct NegociateProtocolResponse_t *NPRsp = (struct NegociateProtocolResponse_t *)SMB_buf.u8buff; // check sanity of SMB header if (NPRsp->smbH.Magic != SMB_MAGIC) @@ -455,13 +459,13 @@ int smb_NegotiateProtocol(char *SMBServerIP, int SMBServerPort, char *Username, //------------------------------------------------------------------------- int smb_SessionSetupAndX(u32 capabilities) { - struct SessionSetupAndXRequest_t *SSR = (struct SessionSetupAndXRequest_t *)SMB_buf; + struct SessionSetupAndXRequest_t *SSR = (struct SessionSetupAndXRequest_t *)SMB_buf.u8buff; register int i, offset, CF; int AuthType = NTLM_AUTH; int password_len = 0; lbl_session_setup: - mips_memset(SMB_buf, 0, sizeof(SMB_buf)); + mips_memset(SMB_buf.u8buff, 0, sizeof(SMB_buf.u8buff)); CF = server_specs.StringsCF; @@ -517,7 +521,7 @@ int smb_SessionSetupAndX(u32 capabilities) rawTCP_SetSessionHeader(sizeof(struct SessionSetupAndXRequest_t) - 4 + offset); GetSMBServerReply(); - struct SessionSetupAndXResponse_t *SSRsp = (struct SessionSetupAndXResponse_t *)SMB_buf; + struct SessionSetupAndXResponse_t *SSRsp = (struct SessionSetupAndXResponse_t *)SMB_buf.u8buff; // check sanity of SMB header if (SSRsp->smbH.Magic != SMB_MAGIC) @@ -542,12 +546,12 @@ int smb_SessionSetupAndX(u32 capabilities) //------------------------------------------------------------------------- int smb_TreeConnectAndX(char *ShareName) { - struct TreeConnectAndXRequest_t *TCR = (struct TreeConnectAndXRequest_t *)SMB_buf; + struct TreeConnectAndXRequest_t *TCR = (struct TreeConnectAndXRequest_t *)SMB_buf.u8buff; register int i, offset, CF; int AuthType = NTLM_AUTH; int password_len = 0; - mips_memset(SMB_buf, 0, sizeof(SMB_buf)); + mips_memset(SMB_buf.u8buff, 0, sizeof(SMB_buf.u8buff)); CF = server_specs.StringsCF; @@ -590,7 +594,7 @@ int smb_TreeConnectAndX(char *ShareName) rawTCP_SetSessionHeader(sizeof(struct TreeConnectAndXRequest_t) - 4 + offset); GetSMBServerReply(); - struct TreeConnectAndXResponse_t *TCRsp = (struct TreeConnectAndXResponse_t *)SMB_buf; + struct TreeConnectAndXResponse_t *TCRsp = (struct TreeConnectAndXResponse_t *)SMB_buf.u8buff; // check sanity of SMB header if (TCRsp->smbH.Magic != SMB_MAGIC) @@ -609,12 +613,12 @@ int smb_TreeConnectAndX(char *ShareName) //------------------------------------------------------------------------- int smb_OpenAndX(char *filename, u16 *FID, int Write) { - struct OpenAndXRequest_t *OR = (struct OpenAndXRequest_t *)SMB_buf; + struct OpenAndXRequest_t *OR = (struct OpenAndXRequest_t *)SMB_buf.u8buff; register int i, offset, CF; WAITIOSEMA(io_sema); - mips_memset(SMB_buf, 0, sizeof(SMB_buf)); + mips_memset(SMB_buf.u8buff, 0, sizeof(SMB_buf.u8buff)); CF = server_specs.StringsCF; @@ -647,7 +651,7 @@ int smb_OpenAndX(char *filename, u16 *FID, int Write) rawTCP_SetSessionHeader(66 + offset); GetSMBServerReply(); - struct OpenAndXResponse_t *ORsp = (struct OpenAndXResponse_t *)SMB_buf; + struct OpenAndXResponse_t *ORsp = (struct OpenAndXResponse_t *)SMB_buf.u8buff; // check sanity of SMB header if (ORsp->smbH.Magic != SMB_MAGIC) @@ -690,15 +694,15 @@ int smb_ReadFile(u16 FID, u32 offsetlow, u32 offsethigh, void *readbuf, u16 nbyt plwip_send(main_socket, RR, sizeof(struct ReadAndXRequest_t), 0); receive: //offset 49 is the offset of the DataOffset field within the ReadAndXResponse structure. - rcv_size = plwip_recvfrom(main_socket, SMB_buf, 49, readbuf, nbytes, 0, NULL, NULL); + rcv_size = plwip_recvfrom(main_socket, SMB_buf.u8buff, 49, readbuf, nbytes, 0, NULL, NULL); expected_size = rawTCP_GetSessionHeader() + 4; - if (SMB_buf[0] != 0) // dropping NBSS Session Keep alive + if (SMB_buf.u8buff[0] != 0) // dropping NBSS Session Keep alive goto receive; // Handle fragmented packets while (rcv_size < expected_size) { - pkt_size = plwip_recvfrom(main_socket, NULL, 0, &((u8 *)readbuf)[rcv_size - SMB_buf[49] - 4], expected_size - rcv_size, 0, NULL, NULL); // - rcv_size + pkt_size = plwip_recvfrom(main_socket, NULL, 0, &((u8 *)readbuf)[rcv_size - SMB_buf.u8buff[49] - 4], expected_size - rcv_size, 0, NULL, NULL); // - rcv_size rcv_size += pkt_size; } @@ -711,7 +715,7 @@ int smb_ReadFile(u16 FID, u32 offsetlow, u32 offsethigh, void *readbuf, u16 nbyt //------------------------------------------------------------------------- int smb_WriteFile(u16 FID, u32 offsetlow, u32 offsethigh, void *writebuf, u16 nbytes) { - struct WriteAndXRequest_t *WR = (struct WriteAndXRequest_t *)SMB_buf; + struct WriteAndXRequest_t *WR = (struct WriteAndXRequest_t *)SMB_buf.u8buff; WAITIOSEMA(io_sema); @@ -725,7 +729,7 @@ int smb_WriteFile(u16 FID, u32 offsetlow, u32 offsethigh, void *writebuf, u16 nb WR->ByteCount = nbytes; //DataOffset points to the location of the data within the buffer, from right after sessionHeader, which Microsoft doesn't consider as being part of the SMB header. - mips_memcpy((void *)(&SMB_buf[4 + WR->DataOffset]), writebuf, nbytes); + mips_memcpy((void *)(&SMB_buf.u8buff[4 + WR->DataOffset]), writebuf, nbytes); rawTCP_SetSessionHeader(sizeof(struct WriteAndXRequest_t) - 4 + nbytes); GetSMBServerReply(); diff --git a/modules/iopcore/udnl-t300/udnl.c b/modules/iopcore/udnl-t300/udnl.c index 8b8da6f3f..21e05588e 100644 --- a/modules/iopcore/udnl-t300/udnl.c +++ b/modules/iopcore/udnl-t300/udnl.c @@ -479,11 +479,11 @@ static void LoadIRXModule(const void *module, struct ModuleInfo *ModuleInfo) ELF_hdr = (elf_header_t *)module; ELF_phdr = (elf_pheader_t *)((unsigned int)module + ELF_hdr->phoff); - (unsigned int)ModuleInfo->gp += (unsigned int)ModuleInfo->text_start; - (unsigned int)ModuleInfo->EntryPoint += (unsigned int)ModuleInfo->text_start; + ModuleInfo->gp = ModuleInfo->gp + (unsigned int)ModuleInfo->text_start; + ModuleInfo->EntryPoint = ModuleInfo->EntryPoint +(unsigned int)ModuleInfo->text_start; if (ModuleInfo->mod_id + 1 != 0) { - (unsigned int)ModuleInfo->mod_id += (unsigned int)ModuleInfo->text_start; + ModuleInfo->mod_id = ModuleInfo->mod_id + (unsigned int)ModuleInfo->text_start; } ELF_shdr = (elf_shdr_t *)((unsigned int)module + ELF_hdr->shoff); @@ -714,7 +714,7 @@ static const struct ExtInfoField *GetFileInfo(const struct RomdirFileStat *stat, return ExtInfoField; } - (unsigned char *)ExtInfoField += ((ExtInfoHeader >> 16 & 0xFC) + 4); + ExtInfoField = ExtInfoField + ((ExtInfoHeader >> 16 & 0xFC) + 4); } return NULL; diff --git a/modules/iopcore/udnl/udnl.c b/modules/iopcore/udnl/udnl.c index 772861961..f769e24d7 100644 --- a/modules/iopcore/udnl/udnl.c +++ b/modules/iopcore/udnl/udnl.c @@ -391,11 +391,11 @@ static void LoadIRXModule(const void *module, struct ModuleInfo *ModuleInfo) ELF_hdr = (elf_header_t *)module; ELF_phdr = (elf_pheader_t *)((unsigned int)module + ELF_hdr->phoff); - (unsigned int)ModuleInfo->gp += (unsigned int)ModuleInfo->text_start; - (unsigned int)ModuleInfo->EntryPoint += (unsigned int)ModuleInfo->text_start; + ModuleInfo->gp = ModuleInfo->gp + (unsigned int)ModuleInfo->text_start; + ModuleInfo->EntryPoint = ModuleInfo->EntryPoint +(unsigned int)ModuleInfo->text_start; if (ModuleInfo->mod_id + 1 != 0) { - (unsigned int)ModuleInfo->mod_id += (unsigned int)ModuleInfo->text_start; + ModuleInfo->mod_id = ModuleInfo->mod_id + (unsigned int)ModuleInfo->text_start; } ELF_shdr = (elf_shdr_t *)((unsigned int)module + ELF_hdr->shoff); @@ -620,7 +620,7 @@ static const struct ExtInfoField *GetFileInfo(const struct RomdirFileStat *stat, return ExtInfoField; } - (unsigned char *)ExtInfoField += ((ExtInfoHeader >> 16 & 0xFC) + 4); + ExtInfoField = ExtInfoField + ((ExtInfoHeader >> 16 & 0xFC) + 4); } return NULL; diff --git a/modules/network/smap-ingame/xfer.c b/modules/network/smap-ingame/xfer.c index 973c623ca..b5ddcc7e5 100644 --- a/modules/network/smap-ingame/xfer.c +++ b/modules/network/smap-ingame/xfer.c @@ -132,7 +132,7 @@ static inline void CopyFromFIFO(volatile u8 *smap_regbase, void *buffer, unsigne : "at", "v0", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"); } -inline int HandleRxIntr(struct SmapDriverData *SmapDrivPrivData) +int HandleRxIntr(struct SmapDriverData *SmapDrivPrivData) { USE_SMAP_RX_BD; int NumPacketsReceived; diff --git a/modules/network/smap-ingame/xfer.h b/modules/network/smap-ingame/xfer.h index 3f77c2989..f3f053f04 100644 --- a/modules/network/smap-ingame/xfer.h +++ b/modules/network/smap-ingame/xfer.h @@ -1,2 +1,2 @@ -inline int HandleRxIntr(struct SmapDriverData *SmapDrivPrivData); +int HandleRxIntr(struct SmapDriverData *SmapDrivPrivData); int SMAPSendPacket(const void *data, unsigned int length); diff --git a/modules/network/smbinit/des.c b/modules/network/smbinit/des.c index 3458cab1b..66217607c 100644 --- a/modules/network/smbinit/des.c +++ b/modules/network/smbinit/des.c @@ -417,7 +417,7 @@ static const unsigned int des_skb[8][64] = { (a) ^= ((t) << (n))) -static unsigned char *key7TOkey8(unsigned char *key7, unsigned char *key8) +static unsigned char *key7TOkey8(const unsigned char *key7, unsigned char *key8) { int i; @@ -441,7 +441,7 @@ static unsigned char *key7TOkey8(unsigned char *key7, unsigned char *key8) * des_create_keys: take 64bit user key (key) as input and outputs * 16 48bit keys (keys) */ -static unsigned char *DES_createkeys(unsigned char *key) +static unsigned char *DES_createkeys(const unsigned char *key) { unsigned int c, d, t, s; unsigned char *in; @@ -505,7 +505,7 @@ static unsigned char *DES_createkeys(unsigned char *key) return (unsigned char *)DES_Keys; } -unsigned char *DES(unsigned char *key, unsigned char *message, unsigned char *cipher) +unsigned char *DES(const unsigned char *key, const unsigned char *message, unsigned char *cipher) { unsigned int l, r, t, u; int i; diff --git a/modules/network/smbinit/des.h b/modules/network/smbinit/des.h index b19c9886b..9f549d9df 100755 --- a/modules/network/smbinit/des.h +++ b/modules/network/smbinit/des.h @@ -10,6 +10,6 @@ #ifndef DES_H #define DES_H -unsigned char *DES(unsigned char *key, unsigned char *message, unsigned char *cipher); +unsigned char *DES(const unsigned char *key, const unsigned char *message, unsigned char *cipher); #endif /* DES */ diff --git a/modules/network/smbinit/md4.c b/modules/network/smbinit/md4.c index ac3381961..228d05ab1 100644 --- a/modules/network/smbinit/md4.c +++ b/modules/network/smbinit/md4.c @@ -141,29 +141,32 @@ static void engineReset() */ unsigned char *MD4(unsigned char *message, int len, unsigned char *cipher) { - unsigned char buffer[128]; + union { + unsigned char ucbuff[128]; + unsigned int uibuff[128/sizeof(unsigned int)]; + } buffer; unsigned int b = len * 8; engineReset(); while (len > 64) { - memcpy(buffer, message, 64); - transform(buffer); + memcpy(buffer.ucbuff, message, 64); + transform(buffer.ucbuff); message += 64; len -= 64; } - memset(buffer, 0, 128); - memcpy(buffer, message, len); - buffer[len] = 0x80; + memset(buffer.ucbuff, 0, 128); + memcpy(buffer.ucbuff, message, len); + buffer.ucbuff[len] = 0x80; if (len < 56) { - *((unsigned int *)&buffer[56]) = b; - transform(buffer); + buffer.uibuff[56/sizeof(unsigned int)] = b; + transform(buffer.ucbuff); } else { - *((unsigned int *)&buffer[120]) = b; - transform(buffer); - transform(&buffer[64]); + buffer.uibuff[120/sizeof(unsigned int)] = b; + transform(buffer.ucbuff); + transform(&buffer.ucbuff[64]); } *((unsigned int *)&cipher[0]) = context[0]; diff --git a/modules/network/smbinit/smbauth.c b/modules/network/smbinit/smbauth.c index 9479ce7f1..9dd5f442b 100644 --- a/modules/network/smbinit/smbauth.c +++ b/modules/network/smbinit/smbauth.c @@ -26,7 +26,7 @@ static unsigned char *LM_Password_Hash(const unsigned char *password, unsigned c int i; /* keep only 14 bytes of the password (padded with nul bytes) */ - strncpy(tmp_pass, password, 14); + strncpy((char*)tmp_pass, (const char*)password, 14); /* turn the password to uppercase */ for (i = 0; i < 14; i++) { @@ -38,10 +38,10 @@ static unsigned char *LM_Password_Hash(const unsigned char *password, unsigned c memcpy(K2, &tmp_pass[7], 7); /* encrypt the magic string with the keys */ - DES(K1, "KGS!@#$%", &cipher[0]); - DES(K2, "KGS!@#$%", &cipher[8]); + DES(K1, (const unsigned char*)"KGS!@#$%", &cipher[0]); + DES(K2, (const unsigned char*)"KGS!@#$%", &cipher[8]); - return (unsigned char *)cipher; + return cipher; } /* @@ -55,7 +55,7 @@ static unsigned char *NTLM_Password_Hash(const unsigned char *password, unsigned memset(passwd_buf, 0, sizeof(passwd_buf)); /* turn the password to unicode */ - for (i = 0, j = 0; i < strlen(password); i++, j += 2) + for (i = 0, j = 0; i < strlen((const char*)password); i++, j += 2) passwd_buf[j] = password[i]; /* get the message digest */ From 73ad5fde2839e0c21b03edc31a7c2953d1164732 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 3 Feb 2017 19:05:07 -0800 Subject: [PATCH 033/269] revert changes made to core files in r991 --- DETAILED_CHANGELOG | 1 + modules/debug/ps2link/net_fio.c | 4 -- modules/hdd/atad/ps2atad.c | 86 +++++++++++------------ modules/hdd/common/atad.h | 12 ++-- modules/hdd/hdpro_atad/hdproatad.c | 100 +++++++++++++-------------- modules/iopcore/cdvdman/atad.c | 61 ++++++++-------- modules/iopcore/cdvdman/atad.h | 10 +-- modules/iopcore/cdvdman/hdpro_atad.c | 80 ++++++++++----------- modules/iopcore/cdvdman/smb.c | 64 ++++++++--------- modules/iopcore/udnl-t300/udnl.c | 8 +-- modules/iopcore/udnl/udnl.c | 8 +-- modules/network/smap-ingame/xfer.c | 2 +- modules/network/smap-ingame/xfer.h | 2 +- modules/network/smbinit/des.c | 6 +- modules/network/smbinit/des.h | 2 +- modules/network/smbinit/md4.c | 25 +++---- modules/network/smbinit/smbauth.c | 10 +-- 17 files changed, 225 insertions(+), 256 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 105472e58..7e901e4d1 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev991 - Jay-Jay-OPL - @AKuHAK committed the following changes: Synced with mainstream ps2sdk: * Corrected the use of mixed-sign arithmetic, corrected the transfer limit for ata_device_sector_io(), changed ATAD to use the typedefs for fixed-sized values (i.e. u16 instead of unsigned short) to ensure correctness. (56f0335) Note: 48-bit changes didnt ported into HD Pro ATAD module - Thu Feb 2 18:56:18 2017 -0800 rev990 - Jay-Jay-OPL - update lang files - Thu Feb 2 17:42:04 2017 -0800 rev989 - Jay-Jay-OPL - update langs - Tue Jan 31 13:08:15 2017 -0800 rev988 - Jay-Jay-OPL - update lang files - Mon Jan 30 19:22:06 2017 -0800 diff --git a/modules/debug/ps2link/net_fio.c b/modules/debug/ps2link/net_fio.c index 47cca4e72..68e71b85e 100644 --- a/modules/debug/ps2link/net_fio.c +++ b/modules/debug/ps2link/net_fio.c @@ -111,9 +111,7 @@ int pko_accept_pkt(int sock, char *buf, int len, int pkt_type) { int length; pko_pkt_hdr *hdr; -#ifdef DEBUG unsigned int hcmd; -#endif unsigned short hlen; @@ -130,9 +128,7 @@ int pko_accept_pkt(int sock, char *buf, int len, int pkt_type) } hdr = (pko_pkt_hdr *)buf; -#ifdef DEBUG hcmd = ntohl(hdr->cmd); -#endif hlen = ntohs(hdr->len); if (hcmd != pkt_type) { diff --git a/modules/hdd/atad/ps2atad.c b/modules/hdd/atad/ps2atad.c index b00929969..ac69819d5 100644 --- a/modules/hdd/atad/ps2atad.c +++ b/modules/hdd/atad/ps2atad.c @@ -42,22 +42,22 @@ static int ata_devinfo_init = 0; static int ata_evflg = -1; /* Used for indicating 48-bit LBA support. */ -static u8 lba_48bit[2] = {0, 0}; +static unsigned char lba_48bit[2] = {0, 0}; -static u8 Disable48bitLBA = 0; //Please read the comments in _start(). +static unsigned char Disable48bitLBA = 0; //Please read the comments in _start(). /* Local device info kept for drives 0 and 1. */ static ata_devinfo_t atad_devinfo[2]; /* Data returned from DEVICE IDENTIFY is kept here. Also, this is used by the security commands to set and unlock the password. */ -static u16 ata_param[256]; +static unsigned short int ata_param[256]; /* ATA command info. */ typedef struct _ata_cmd_info { - u8 command; - u8 type; + unsigned char command; + unsigned char type; } ata_cmd_info_t; static const ata_cmd_info_t ata_cmd_table[] = { @@ -139,14 +139,10 @@ static const ata_cmd_info_t smart_cmd_table[] = { /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ typedef struct _ata_cmd_state { - s32 type; /* The ata_cmd_info_t type field. */ - union { - void *buf; - u8 *buf8; - u16 *buf16; - }; - u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ + int type; /* The ata_cmd_info_t type field. */ + void *buf; + unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ + int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -332,7 +328,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, const ata_cmd_info_t *cmd_table; int i, res, type, cmd_table_size; int using_timeout, device = (select >> 4) & 1; - u8 searchcmd; + unsigned char searchcmd; ClearEventFlag(ata_evflg, 0); @@ -449,10 +445,9 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) { USE_ATA_REGS; - u8 *buf8; - u16 *buf16; + void *buf; int i, type; - u16 status = ata_hwport->r_status & 0xff; + unsigned short int status = ata_hwport->r_status & 0xff; if (status & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); @@ -467,24 +462,23 @@ static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) if (type == 3 || type == 8) { /* PIO data out */ - buf16 = cmd_state->buf16; + buf = cmd_state->buf; for (i = 0; i < 256; i++) { - ata_hwport->r_data = *buf16; - cmd_state->buf16 = ++buf16; + ata_hwport->r_data = *(unsigned short int *)buf; + cmd_state->buf = ++((unsigned short int *)buf); } - buf8 = cmd_state->buf8; if (cmd_state->type == 8) { for (i = 0; i < 4; i++) { - ata_hwport->r_data = *buf8; - cmd_state->buf8 = ++buf8; + ata_hwport->r_data = *(u8 *)buf; + cmd_state->buf = ++((u8 *)buf); } } } else if (type == 2) { /* PIO data in */ - buf16 = cmd_state->buf16; + buf = cmd_state->buf; for (i = 0; i < 256; i++) { - *buf16 = ata_hwport->r_data; - cmd_state->buf16 = ++buf16; + *(unsigned short int *)buf = ata_hwport->r_data; + cmd_state->buf = ++((unsigned short int *)buf); } } @@ -492,13 +486,14 @@ static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) } /* Complete a DMA transfer, to or from the device. */ -static inline int ata_dma_complete(void *buf, u32 blkcount, int dir) +static inline int ata_dma_complete(void *buf, int blkcount, int dir) { USE_ATA_REGS; USE_SPD_REGS; - u32 bits, count, nbytes; + unsigned int count, nbytes; + u32 bits; int i, res; - u16 dma_stat; + unsigned short int dma_stat; while (blkcount) { for (i = 0; i < 20; i++) @@ -536,7 +531,7 @@ static inline int ata_dma_complete(void *buf, u32 blkcount, int dir) if ((res = dev9DmaTransfer(0, buf, (nbytes << 9) | 32, dir)) < 0) return res; - buf = (void*)((u8 *)buf + nbytes); + (u8 *)buf += nbytes; blkcount -= count; } @@ -551,7 +546,7 @@ int ata_io_finish(void) ata_cmd_state_t *cmd_state = &atad_cmd_state; u32 bits; int i, res = 0, type = cmd_state->type; - u16 stat; + unsigned short int stat; if (type == 1 || type == 6) { /* Non-data commands. */ WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); @@ -768,7 +763,7 @@ int ata_device_set_transfer_mode(int device, int type, int mode) int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) { int res = 0; - u16 sector, lcyl, hcyl, select, command, len; + unsigned short int sector, lcyl, hcyl, select, command, len; while (nsectors > 0) { ata_set_dir(dir); @@ -778,10 +773,8 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) hcyl = (lba >> 16) & 0xff; if (lba_48bit[device]) { - /* Setup for 48-bit LBA. - While ATA-6 allows for the transfer of up to 65536 sectors, - the DMAC allows only up to 65536 x 128 / 512 = 16384 sectors. */ - len = (nsectors > 16384) ? 16384 : nsectors; + /* Setup for 48-bit LBA. */ + len = (nsectors > 65536) ? 65536 : nsectors; /* Combine bits 24-31 and bits 0-7 of lba into sector. */ sector = ((lba >> 16) & 0xff00) | (lba & 0xff); @@ -802,7 +795,7 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) if ((res = ata_io_finish()) != 0) return res; - buf = (void*)((u8 *)buf + len * 512); + (u8 *)buf += (len * 512); lba += len; nsectors -= len; } @@ -810,7 +803,7 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) return res; } -static void ata_get_security_status(int device, ata_devinfo_t *devinfo, u16 *param) +static void ata_get_security_status(int device, ata_devinfo_t *devinfo, unsigned short int *param) { if (ata_device_identify(device, param) == 0) devinfo[device].security_status = param[ATA_ID_SECURITY_STATUS]; @@ -820,7 +813,7 @@ static void ata_get_security_status(int device, ata_devinfo_t *devinfo, u16 *par int ata_device_sce_sec_set_password(int device, void *password) { ata_devinfo_t *devinfo = atad_devinfo; - u16 *param = ata_param; + unsigned short int *param = ata_param; int res; if (devinfo[device].security_status & ATA_F_SEC_ENABLED) @@ -841,7 +834,7 @@ int ata_device_sce_sec_set_password(int device, void *password) int ata_device_sce_sec_unlock(int device, void *password) { ata_devinfo_t *devinfo = atad_devinfo; - u16 *param = ata_param; + unsigned short int *param = ata_param; int res; if (!(devinfo[device].security_status & ATA_F_SEC_LOCKED)) @@ -867,6 +860,7 @@ int ata_device_sce_sec_unlock(int device, void *password) int ata_device_sce_sec_erase(int device) { ata_devinfo_t *devinfo = atad_devinfo; + unsigned short int *param = NULL; int res; if (!(devinfo[device].security_status & ATA_F_SEC_ENABLED) || !(devinfo[device].security_status & ATA_F_SEC_LOCKED)) @@ -882,14 +876,14 @@ int ata_device_sce_sec_erase(int device) res = ata_io_finish(); finish: - ata_get_security_status(device, devinfo, NULL); + ata_get_security_status(device, devinfo, param); return res; } static void ata_device_probe(ata_devinfo_t *devinfo) { USE_ATA_REGS; - u16 nsector, sector, lcyl, hcyl, select; + unsigned short int nsector, sector, lcyl, hcyl, select; devinfo->exists = 0; devinfo->has_packet = 0; @@ -1000,7 +994,7 @@ ata_devinfo_t *ata_get_devinfo(int device) static void ata_set_dir(int dir) { USE_SPD_REGS; - u16 val; + unsigned short int val; SPD_REG16(0x38) = 3; val = SPD_REG16(SPD_R_IF_CTRL) & 1; @@ -1012,7 +1006,7 @@ static void ata_set_dir(int dir) static void ata_pio_mode(int mode) { USE_SPD_REGS; - u16 val; + unsigned short int val; switch (mode) { case 1: @@ -1037,7 +1031,7 @@ static void ata_pio_mode(int mode) static void ata_multiword_dma_mode(int mode) { USE_SPD_REGS; - u16 val; + unsigned short int val; switch (mode) { case 1: @@ -1057,7 +1051,7 @@ static void ata_multiword_dma_mode(int mode) static void ata_ultra_dma_mode(int mode) { USE_SPD_REGS; - u16 val; + unsigned short int val; switch (mode) { case 1: diff --git a/modules/hdd/common/atad.h b/modules/hdd/common/atad.h index f79918d02..ee73d1078 100644 --- a/modules/hdd/common/atad.h +++ b/modules/hdd/common/atad.h @@ -27,10 +27,10 @@ typedef struct _ata_devinfo { - s32 exists; /* Was successfully probed. */ - s32 has_packet; /* Supports the PACKET command set. */ - u32 total_sectors; /* Total number of user sectors. */ - u32 security_status; /* Word 0x100 of the identify info. */ + int exists; /* Was successfully probed. */ + int has_packet; /* Supports the PACKET command set. */ + unsigned int total_sectors; /* Total number of user sectors. */ + unsigned int security_status; /* Word 0x100 of the identify info. */ } ata_devinfo_t; #define atad_IMPORTS_start DECLARE_IMPORT_TABLE(atad, 1, 3) @@ -42,7 +42,7 @@ ata_devinfo_t *ata_get_devinfo(int device); int ata_reset_devices(void); #define I_ata_reset_devices DECLARE_IMPORT(5, ata_reset_devices) -int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command); +int ata_io_start(void *buf, unsigned int blkcount, unsigned short int feature, unsigned short int nsector, unsigned short int sector, unsigned short int lcyl, unsigned short int hcyl, unsigned short int select, unsigned short int command); #define I_ata_io_start DECLARE_IMPORT(6, ata_io_start) int ata_io_finish(void); #define I_ata_io_finish DECLARE_IMPORT(7, ata_io_finish) @@ -50,7 +50,7 @@ int ata_io_finish(void); int ata_get_error(void); #define I_ata_get_error DECLARE_IMPORT(8, ata_get_error) -int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir); +int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir); #define I_ata_device_sector_io DECLARE_IMPORT(9, ata_device_sector_io) //DRM functions that were meant to keep users from sharing disks (and hence the contained content). Supported by only Sony-modified HDDs (e.g. the SCPH-20400). diff --git a/modules/hdd/hdpro_atad/hdproatad.c b/modules/hdd/hdpro_atad/hdproatad.c index e4879c1d3..2b01534b7 100644 --- a/modules/hdd/hdpro_atad/hdproatad.c +++ b/modules/hdd/hdpro_atad/hdproatad.c @@ -37,10 +37,10 @@ IRX_ID(MODNAME, 1, 1); // HD Pro Kit is mapping the 1st word in ROM0 seg as a main ATA controller, // The pseudo ATA controller registers are accessed (input/ouput) by writing // an id to the main ATA controller (id specific to HDpro, see registers id below). -#define HDPROreg_IO8 (*(volatile u8 *)0xBFC00000) -#define HDPROreg_IO32 (*(volatile u32 *)0xBFC00000) +#define HDPROreg_IO8 (*(volatile unsigned char *)0xBFC00000) +#define HDPROreg_IO32 (*(volatile unsigned int *)0xBFC00000) -#define CDVDreg_STATUS (*(volatile u8 *)0xBF40200A) +#define CDVDreg_STATUS (*(volatile unsigned char *)0xBF40200A) // Pseudo ATA controller registers id - Output #define ATAreg_CONTROL_RD 0x68 @@ -66,29 +66,29 @@ IRX_ID(MODNAME, 1, 1); typedef struct _ata_devinfo { - s32 exists; /* Was successfully probed. */ - s32 has_packet; /* Supports the PACKET command set. */ - u32 total_sectors; /* Total number of user sectors. */ - u32 security_status; /* Word 0x100 of the identify info. */ + int exists; /* Was successfully probed. */ + int has_packet; /* Supports the PACKET command set. */ + unsigned int total_sectors; /* Total number of user sectors. */ + unsigned int security_status; /* Word 0x100 of the identify info. */ } ata_devinfo_t; static int ata_evflg = -1; /* Used for indicating 48-bit LBA support. */ -static u8 lba_48bit[2] = {0, 0}; +static unsigned char lba_48bit[2] = {0, 0}; /* Local device info kept for drives 0 and 1. */ static ata_devinfo_t atad_devinfo[2]; /* Data returned from DEVICE IDENTIFY is kept here. Also, this is used by the security commands to set and unlock the password. */ -static u16 ata_param[256]; +static unsigned short int ata_param[256]; /* ATA command info. */ typedef struct _ata_cmd_info { - u8 command; - u8 type; + unsigned char command; + unsigned char type; } ata_cmd_info_t; static const ata_cmd_info_t ata_cmd_table[] = { @@ -161,14 +161,10 @@ static const ata_cmd_info_t smart_cmd_table[] = { /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ typedef struct _ata_cmd_state { - s32 type; /* The ata_cmd_info_t type field. */ - union { - void *buf; - u8 *buf8; - u16 *buf16; - }; - u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ + int type; /* The ata_cmd_info_t type field. */ + void *buf; + unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ + int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -224,7 +220,7 @@ static int hdpro_io_start(void) CDVDreg_STATUS = 0; HDPROreg_IO8 = 0x61; CDVDreg_STATUS = 0; - u32 res = HDPROreg_IO8; + unsigned int res = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); @@ -257,7 +253,7 @@ static int hdpro_io_finish(void) return hdpro_io_active ^ 1; } -static void hdpro_io_write(u8 cmd, u16 val) +static void hdpro_io_write(unsigned char cmd, unsigned short int val) { suspend_intr(); @@ -272,16 +268,16 @@ static void hdpro_io_write(u8 cmd, u16 val) resume_intr(); } -static int hdpro_io_read(u8 cmd) +static int hdpro_io_read(unsigned char cmd) { suspend_intr(); // IO read from HD Pro HDPROreg_IO8 = cmd; CDVDreg_STATUS = 0; - u32 res0 = HDPROreg_IO8; + unsigned int res0 = HDPROreg_IO8; CDVDreg_STATUS = 0; - u32 res1 = HDPROreg_IO8; + unsigned int res1 = HDPROreg_IO8; CDVDreg_STATUS = 0; res0 = (res0 & 0xff) | (res1 << 8); @@ -387,7 +383,7 @@ static int ata_wait_busy(int bits) hdpro_io_start(); - u16 r_control = hdpro_io_read(ATAreg_CONTROL_RD); + unsigned short int r_control = hdpro_io_read(ATAreg_CONTROL_RD); hdpro_io_finish(); @@ -445,13 +441,13 @@ static int ata_device_select(int device) } /* Export 6 */ -int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command) +int ata_io_start(void *buf, unsigned int blkcount, unsigned short int feature, unsigned short int nsector, unsigned short int sector, unsigned short int lcyl, unsigned short int hcyl, unsigned short int select, unsigned short int command) { iop_sys_clock_t cmd_timeout; const ata_cmd_info_t *cmd_table; int i, res, type, cmd_table_size; int using_timeout, device = (select >> 4) & 1; - u32 searchcmd; + unsigned int searchcmd; ClearEventFlag(ata_evflg, 0); @@ -527,7 +523,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, suspend_intr(); HDPROreg_IO8 = 0x21; CDVDreg_STATUS = 0; - u32 dummy = HDPROreg_IO8; + unsigned int dummy = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); dummy = 0; @@ -562,11 +558,10 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, /* Do a PIO transfer, to or from the device. */ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) { - u8 *buf8; - u16 *buf16; + void *buf; int i, type; int res = 0, chk = 0; - u16 status = hdpro_io_read(ATAreg_STATUS_RD); + unsigned short int status = hdpro_io_read(ATAreg_STATUS_RD); if (status & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); @@ -581,33 +576,32 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) if (type == 3 || type == 8) { /* PIO data out */ - buf16 = cmd_state->buf16; + buf = cmd_state->buf; HDPROreg_IO8 = 0x43; CDVDreg_STATUS = 0; for (i = 0; i < 256; i++) { - u16 r_data = *buf16; + unsigned short int r_data = *(unsigned short int *)buf; hdpro_io_write(ATAreg_DATA_WR, r_data); chk ^= r_data + i; - cmd_state->buf = ++buf16; + cmd_state->buf = ++((unsigned short int *)buf); } - u16 out = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; + unsigned short int out = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; if (out != (chk & 0xffff)) return -504; if (cmd_state->type == 8) { - buf8 = cmd_state->buf8; for (i = 0; i < 4; i++) { - hdpro_io_write(ATAreg_DATA_WR, *buf8); - cmd_state->buf = ++buf8; + hdpro_io_write(ATAreg_DATA_WR, *(unsigned char *)buf); + cmd_state->buf = ++((unsigned char *)buf); } } } else if (type == 2) { /* PIO data in */ - buf16 = cmd_state->buf16; + buf = cmd_state->buf; suspend_intr(); @@ -617,16 +611,16 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) for (i = 0; i < 256; i++) { - u32 res0 = HDPROreg_IO8; + unsigned int res0 = HDPROreg_IO8; CDVDreg_STATUS = 0; - u32 res1 = HDPROreg_IO8; + unsigned int res1 = HDPROreg_IO8; CDVDreg_STATUS = 0; res0 = (res0 & 0xff) | (res1 << 8); chk ^= res0 + i; - *buf16 = res0 & 0xffff; - cmd_state->buf16 = ++buf16; + *(unsigned short int *)buf = res0 & 0xffff; + cmd_state->buf = ++((unsigned short int *)buf); } HDPROreg_IO8 = 0x51; @@ -635,7 +629,7 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) resume_intr(); - u16 r_data = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; + unsigned short int r_data = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; if (r_data != (chk & 0xffff)) return -504; } @@ -662,7 +656,7 @@ int ata_reset_devices(void) static void ata_device_probe(ata_devinfo_t *devinfo) { - u16 nsector, lcyl, hcyl;//sector, select; unused + unsigned short int nsector, sector, lcyl, hcyl, select; devinfo->exists = 0; devinfo->has_packet = 0; @@ -671,10 +665,10 @@ static void ata_device_probe(ata_devinfo_t *devinfo) return; nsector = hdpro_io_read(ATAreg_NSECTOR_RD) & 0xff; - //sector = hdpro_io_read(ATAreg_SECTOR_RD) & 0xff; unused + sector = hdpro_io_read(ATAreg_SECTOR_RD) & 0xff; lcyl = hdpro_io_read(ATAreg_LCYL_RD) & 0xff; hcyl = hdpro_io_read(ATAreg_HCYL_RD) & 0xff; - //select = hdpro_io_read(ATAreg_SELECT_RD) & 0xff; unused + select = hdpro_io_read(ATAreg_SELECT_RD) & 0xff; if (nsector != 1) return; @@ -810,7 +804,7 @@ int ata_io_finish(void) ata_cmd_state_t *cmd_state = &atad_cmd_state; u32 bits; int res = 0, type = cmd_state->type; - u16 stat; + unsigned short int stat; if (type == 1 || type == 6) { /* Non-data commands. */ @@ -819,7 +813,7 @@ int ata_io_finish(void) HDPROreg_IO8 = 0x21; CDVDreg_STATUS = 0; - u32 ret = HDPROreg_IO8; + unsigned int ret = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); @@ -871,10 +865,11 @@ int ata_io_finish(void) } /* Export 9 */ -int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) +int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir) { int res = 0; - u16 sector, lcyl, hcyl, select, command, len; + unsigned int nbytes; + unsigned short int sector, lcyl, hcyl, select, command, len; if (!hdpro_io_start()) return -1; @@ -907,7 +902,8 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) if ((res = ata_io_finish()) != 0) continue; - buf = (void*)((u8 *)buf + len * 512); + nbytes = len * 512; + (u8 *)buf += nbytes; lba += len; nsectors -= len; } diff --git a/modules/iopcore/cdvdman/atad.c b/modules/iopcore/cdvdman/atad.c index e4ee70f5a..129be84dd 100644 --- a/modules/iopcore/cdvdman/atad.c +++ b/modules/iopcore/cdvdman/atad.c @@ -88,14 +88,10 @@ static const ata_cmd_info_t smart_cmd_table[] = { /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ typedef struct _ata_cmd_state { - s32 type; /* The ata_cmd_info_t type field. */ - union { - void *buf; - u8 *buf8; - u16 *buf16; - }; - u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ + int type; /* The ata_cmd_info_t type field. */ + void *buf; + unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ + int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -269,7 +265,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, const ata_cmd_info_t *cmd_table; int i, res, type, cmd_table_size; int using_timeout, device = (select >> 4) & 1; - u8 searchcmd; + unsigned char searchcmd; ClearEventFlag(ata_evflg, 0); @@ -383,10 +379,9 @@ static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) return 0; USE_ATA_REGS; - u8 *buf8; - u16 *buf16; + void *buf; int i, type; - u16 status = ata_hwport->r_status & 0xff; + unsigned short int status = ata_hwport->r_status & 0xff; if (status & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); @@ -401,24 +396,23 @@ static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) if (type == 3 || type == 8) { /* PIO data out */ - buf16 = cmd_state->buf16; + buf = cmd_state->buf; for (i = 0; i < 256; i++) { - ata_hwport->r_data = *buf16; - cmd_state->buf16 = ++buf16; + ata_hwport->r_data = *(unsigned short int *)buf; + cmd_state->buf = ++((unsigned short int *)buf); } - buf8 = cmd_state->buf8; if (cmd_state->type == 8) { for (i = 0; i < 4; i++) { - ata_hwport->r_data = *buf8; - cmd_state->buf8 = ++buf8; + ata_hwport->r_data = *(u8 *)buf; + cmd_state->buf = ++((u8 *)buf); } } } else if (type == 2) { /* PIO data in */ - buf16 = cmd_state->buf16; + buf = cmd_state->buf; for (i = 0; i < 256; i++) { - *buf16 = ata_hwport->r_data; - cmd_state->buf16 = ++buf16; + *(unsigned short int *)buf = ata_hwport->r_data; + cmd_state->buf = ++((unsigned short int *)buf); } } @@ -426,13 +420,14 @@ static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) } /* Complete a DMA transfer, to or from the device. */ -static inline int ata_dma_complete(void *buf, u32 blkcount, int dir) +static inline int ata_dma_complete(void *buf, int blkcount, int dir) { USE_ATA_REGS; USE_SPD_REGS; - u32 bits, count, nbytes; + unsigned int count, nbytes; + u32 bits; int i, res; - u16 dma_stat; + unsigned short int dma_stat; while (blkcount) { for (i = 0; i < 20; i++) @@ -473,7 +468,7 @@ static inline int ata_dma_complete(void *buf, u32 blkcount, int dir) if ((res = dev9DmaTransfer(0, buf, (nbytes << 9) | 32, dir)) < 0) return res; - buf = (void*)((u8 *)buf + nbytes); + (u8 *)buf += nbytes; blkcount -= count; } @@ -488,7 +483,7 @@ int ata_io_finish(void) ata_cmd_state_t *cmd_state = &atad_cmd_state; u32 bits; int i, res = 0, type = cmd_state->type; - u16 stat; + unsigned short int stat; if (type == 1 || type == 6) { /* Non-data commands. */ WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); @@ -547,10 +542,10 @@ int ata_io_finish(void) } /* Export 9 */ -int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) +int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir) { int res = 0; - u16 sector, lcyl, hcyl, select, command, len; + unsigned short int sector, lcyl, hcyl, select, command, len; WAITIOSEMA(io_sema); @@ -562,10 +557,8 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) hcyl = (lba >> 16) & 0xff; if (lba_48bit) { - /* Setup for 48-bit LBA. - While ATA-6 allows for the transfer of up to 65536 sectors, - the DMAC allows only up to 65536 x 128 / 512 = 16384 sectors. */ - len = (nsectors > 16384) ? 16384 : nsectors; + /* Setup for 48-bit LBA. */ + len = (nsectors > 65536) ? 65536 : nsectors; /* Combine bits 24-31 and bits 0-7 of lba into sector. */ sector = ((lba >> 16) & 0xff00) | (lba & 0xff); @@ -590,7 +583,7 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) return res; } - buf = (void*)((u8 *)buf + len * 512); + (u8 *)buf += (len * 512); lba += len; nsectors -= len; } @@ -609,7 +602,7 @@ ata_devinfo_t *ata_get_devinfo(int device) static void ata_set_dir(int dir) { USE_SPD_REGS; - u16 val; + unsigned short int val; SPD_REG16(0x38) = 3; val = SPD_REG16(SPD_R_IF_CTRL) & 1; diff --git a/modules/iopcore/cdvdman/atad.h b/modules/iopcore/cdvdman/atad.h index 491b7bb3d..4a5244f61 100644 --- a/modules/iopcore/cdvdman/atad.h +++ b/modules/iopcore/cdvdman/atad.h @@ -27,10 +27,10 @@ typedef struct _ata_devinfo { - s32 exists; /* Was successfully probed. */ - s32 has_packet; /* Supports the PACKET command set. */ - u32 total_sectors; /* Total number of user sectors. */ - u32 security_status; /* Word 0x100 of the identify info. */ + int exists; /* Was successfully probed. */ + int has_packet; /* Supports the PACKET command set. */ + unsigned int total_sectors; /* Total number of user sectors. */ + unsigned int security_status; /* Word 0x100 of the identify info. */ } ata_devinfo_t; int atad_start(void); @@ -38,7 +38,7 @@ ata_devinfo_t *ata_get_devinfo(int device); int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command); int ata_io_finish(void); int ata_get_error(void); -int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir); +int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir); // APA Partition #define APA_MAGIC 0x00415041 // 'APA\0' diff --git a/modules/iopcore/cdvdman/hdpro_atad.c b/modules/iopcore/cdvdman/hdpro_atad.c index f558716fe..ac6617a15 100644 --- a/modules/iopcore/cdvdman/hdpro_atad.c +++ b/modules/iopcore/cdvdman/hdpro_atad.c @@ -40,10 +40,10 @@ // HD Pro Kit is mapping the 1st word in ROM0 seg as a main ATA controller, // The pseudo ATA controller registers are accessed (input/ouput) by writing // an id to the main ATA controller (id specific to HDpro, see registers id below). -#define HDPROreg_IO8 (*(volatile u8 *)0xBFC00000) -#define HDPROreg_IO32 (*(volatile u32 *)0xBFC00000) +#define HDPROreg_IO8 (*(volatile unsigned char *)0xBFC00000) +#define HDPROreg_IO32 (*(volatile unsigned int *)0xBFC00000) -#define CDVDreg_STATUS (*(volatile u8 *)0xBF40200A) +#define CDVDreg_STATUS (*(volatile unsigned char *)0xBF40200A) // Pseudo ATA controller registers id - Output #define ATAreg_CONTROL_RD 0x68 @@ -92,8 +92,8 @@ static ata_devinfo_t atad_devinfo; /* ATA command info. */ typedef struct _ata_cmd_info { - u8 command; - u8 type; + unsigned char command; + unsigned char type; } ata_cmd_info_t; static const ata_cmd_info_t ata_cmd_table[] = { @@ -119,14 +119,10 @@ static const ata_cmd_info_t smart_cmd_table[] = { /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ typedef struct _ata_cmd_state { - s32 type; /* The ata_cmd_info_t type field. */ - union { - void *buf; - u8 *buf8; - u16 *buf16; - }; - u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ + int type; /* The ata_cmd_info_t type field. */ + void *buf; + unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ + int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -177,7 +173,7 @@ static int hdpro_io_start(void) CDVDreg_STATUS = 0; HDPROreg_IO8 = 0x61; CDVDreg_STATUS = 0; - u32 res = HDPROreg_IO8; + unsigned int res = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); @@ -210,7 +206,7 @@ static int hdpro_io_finish(void) return hdpro_io_active ^ 1; } -static void hdpro_io_write(u8 cmd, u16 val) +static void hdpro_io_write(unsigned char cmd, unsigned short int val) { suspend_intr(); @@ -225,16 +221,16 @@ static void hdpro_io_write(u8 cmd, u16 val) resume_intr(); } -static int hdpro_io_read(u8 cmd) +static int hdpro_io_read(unsigned char cmd) { suspend_intr(); // IO read from HD Pro HDPROreg_IO8 = cmd; CDVDreg_STATUS = 0; - u32 res0 = HDPROreg_IO8; + unsigned int res0 = HDPROreg_IO8; CDVDreg_STATUS = 0; - u32 res1 = HDPROreg_IO8; + unsigned int res1 = HDPROreg_IO8; CDVDreg_STATUS = 0; res0 = (res0 & 0xff) | (res1 << 8); @@ -326,7 +322,7 @@ static int ata_wait_busy(int bits) hdpro_io_start(); - u16 r_control = hdpro_io_read(ATAreg_CONTROL_RD); + unsigned short int r_control = hdpro_io_read(ATAreg_CONTROL_RD); hdpro_io_finish(); @@ -390,7 +386,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, const ata_cmd_info_t *cmd_table; int i, res, type, cmd_table_size; int using_timeout, device = (select >> 4) & 1; - u32 searchcmd; + unsigned int searchcmd; ClearEventFlag(ata_evflg, 0); @@ -466,7 +462,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, suspend_intr(); HDPROreg_IO8 = 0x21; CDVDreg_STATUS = 0; - u32 dummy = HDPROreg_IO8; + unsigned int dummy = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); dummy = 0; @@ -501,11 +497,10 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, /* Do a PIO transfer, to or from the device. */ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) { - u8 *buf8; - u16 *buf16; + void *buf; int i, type; int res = 0, chk = 0; - u16 status = hdpro_io_read(ATAreg_STATUS_RD); + unsigned short int status = hdpro_io_read(ATAreg_STATUS_RD); if (status & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); @@ -520,33 +515,32 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) if (type == 3 || type == 8) { /* PIO data out */ - buf16 = cmd_state->buf16; + buf = cmd_state->buf; HDPROreg_IO8 = 0x43; CDVDreg_STATUS = 0; for (i = 0; i < 256; i++) { - u16 r_data = *buf16; + unsigned short int r_data = *(unsigned short int *)buf; hdpro_io_write(ATAreg_DATA_WR, r_data); chk ^= r_data + i; - cmd_state->buf = ++buf16; + cmd_state->buf = ++((unsigned short int *)buf); } - u16 out = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; + unsigned short int out = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; if (out != (chk & 0xffff)) return -504; if (cmd_state->type == 8) { - buf8 = cmd_state->buf8; for (i = 0; i < 4; i++) { - hdpro_io_write(ATAreg_DATA_WR, *buf8); - cmd_state->buf = ++buf8; + hdpro_io_write(ATAreg_DATA_WR, *(unsigned char *)buf); + cmd_state->buf = ++((unsigned char *)buf); } } } else if (type == 2) { /* PIO data in */ - buf16 = cmd_state->buf16; + buf = cmd_state->buf; suspend_intr(); @@ -556,16 +550,16 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) for (i = 0; i < 256; i++) { - u32 res0 = HDPROreg_IO8; + unsigned int res0 = HDPROreg_IO8; CDVDreg_STATUS = 0; - u32 res1 = HDPROreg_IO8; + unsigned int res1 = HDPROreg_IO8; CDVDreg_STATUS = 0; res0 = (res0 & 0xff) | (res1 << 8); chk ^= res0 + i; - *buf16 = res0 & 0xffff; - cmd_state->buf16 = ++buf16; + *(unsigned short int *)buf = res0 & 0xffff; + cmd_state->buf = ++((unsigned short int *)buf); } HDPROreg_IO8 = 0x51; @@ -574,7 +568,7 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) resume_intr(); - u16 r_data = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; + unsigned short int r_data = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; if (r_data != (chk & 0xffff)) return -504; } @@ -588,7 +582,7 @@ int ata_io_finish(void) ata_cmd_state_t *cmd_state = &atad_cmd_state; u32 bits; int res = 0, type = cmd_state->type; - u16 stat; + unsigned short int stat; if (type == 1 || type == 6) { /* Non-data commands. */ @@ -597,7 +591,7 @@ int ata_io_finish(void) HDPROreg_IO8 = 0x21; CDVDreg_STATUS = 0; - u32 ret = HDPROreg_IO8; + unsigned int ret = HDPROreg_IO8; CDVDreg_STATUS = 0; resume_intr(); @@ -650,10 +644,11 @@ int ata_io_finish(void) } /* Export 9 */ -int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) +int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir) { int res = 0; - u16 sector, lcyl, hcyl, select, command, len; + unsigned int nbytes; + unsigned short int sector, lcyl, hcyl, select, command, len; WAITIOSEMA(io_sema); @@ -688,7 +683,8 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) if ((res = ata_io_finish()) != 0) continue; - buf = (void*)((u8 *)buf + len * 512); + nbytes = len * 512; + (u8 *)buf += nbytes; lba += len; nsectors -= len; } diff --git a/modules/iopcore/cdvdman/smb.c b/modules/iopcore/cdvdman/smb.c index 5f11ef05a..99dc45c42 100644 --- a/modules/iopcore/cdvdman/smb.c +++ b/modules/iopcore/cdvdman/smb.c @@ -285,20 +285,16 @@ static struct WriteAndXRequest_t smb_Write_Request = { static u16 UID, TID; static int main_socket; -static union { - u8 u8buff[1024]; - u16 u16buff[1024 / sizeof(u16)]; - s16 s16buff[1024 / sizeof(s16)]; -} SMB_buf; - +static u8 SMB_buf[1024]; + //------------------------------------------------------------------------- int rawTCP_SetSessionHeader(u32 size) // Write Session Service header: careful it's raw TCP transport here and not NBT transport { // maximum for raw TCP transport (24 bits) !!! - SMB_buf.u8buff[0] = 0; - SMB_buf.u8buff[1] = (size >> 16) & 0xff; - SMB_buf.u8buff[2] = (size >> 8) & 0xff; - SMB_buf.u8buff[3] = size; + SMB_buf[0] = 0; + SMB_buf[1] = (size >> 16) & 0xff; + SMB_buf[2] = (size >> 8) & 0xff; + SMB_buf[3] = size; return (int)size; } @@ -309,9 +305,9 @@ int rawTCP_GetSessionHeader(void) // Read Session Service header: careful it's r register u32 size; // maximum for raw TCP transport (24 bits) !!! - size = SMB_buf.u8buff[3]; - size |= SMB_buf.u8buff[2] << 8; - size |= SMB_buf.u8buff[1] << 16; + size = SMB_buf[3]; + size |= SMB_buf[2] << 8; + size |= SMB_buf[1] << 16; return (int)size; } @@ -347,23 +343,23 @@ int GetSMBServerReply(void) { register int rcv_size, totalpkt_size, pkt_size; - rcv_size = plwip_send(main_socket, SMB_buf.u8buff, rawTCP_GetSessionHeader() + 4, 0); + rcv_size = plwip_send(main_socket, SMB_buf, rawTCP_GetSessionHeader() + 4, 0); if (rcv_size <= 0) return -1; receive: - rcv_size = plwip_recvfrom(main_socket, NULL, 0, SMB_buf.u8buff, sizeof(SMB_buf.u8buff), 0, NULL, NULL); + rcv_size = plwip_recvfrom(main_socket, NULL, 0, SMB_buf, sizeof(SMB_buf), 0, NULL, NULL); if (rcv_size <= 0) return -2; - if (SMB_buf.u8buff[0] != 0) // dropping NBSS Session Keep alive + if (SMB_buf[0] != 0) // dropping NBSS Session Keep alive goto receive; // Handle fragmented packets totalpkt_size = rawTCP_GetSessionHeader() + 4; while (rcv_size < totalpkt_size) { - pkt_size = plwip_recvfrom(main_socket, NULL, 0, &SMB_buf.u8buff[rcv_size], sizeof(SMB_buf.u8buff) - rcv_size, 0, NULL, NULL); + pkt_size = plwip_recvfrom(main_socket, NULL, 0, &SMB_buf[rcv_size], sizeof(SMB_buf) - rcv_size, 0, NULL, NULL); if (pkt_size <= 0) return -2; rcv_size += pkt_size; @@ -376,7 +372,7 @@ int GetSMBServerReply(void) int smb_NegotiateProtocol(char *SMBServerIP, int SMBServerPort, char *Username, char *Password, u32 *capabilities, OplSmbPwHashFunc_t hash_callback) { char *dialect = "NT LM 0.12"; - struct NegociateProtocolRequest_t *NPR = (struct NegociateProtocolRequest_t *)SMB_buf.u8buff; + struct NegociateProtocolRequest_t *NPR = (struct NegociateProtocolRequest_t *)SMB_buf; register int length; struct in_addr dst_addr; #ifdef VMC_DRIVER @@ -395,7 +391,7 @@ int smb_NegotiateProtocol(char *SMBServerIP, int SMBServerPort, char *Username, negociate_retry: - mips_memset(SMB_buf.u8buff, 0, sizeof(SMB_buf.u8buff)); + mips_memset(SMB_buf, 0, sizeof(SMB_buf)); NPR->smbH.Magic = SMB_MAGIC; NPR->smbH.Cmd = SMB_COM_NEGOCIATE; @@ -409,7 +405,7 @@ int smb_NegotiateProtocol(char *SMBServerIP, int SMBServerPort, char *Username, rawTCP_SetSessionHeader(37 + length); GetSMBServerReply(); - struct NegociateProtocolResponse_t *NPRsp = (struct NegociateProtocolResponse_t *)SMB_buf.u8buff; + struct NegociateProtocolResponse_t *NPRsp = (struct NegociateProtocolResponse_t *)SMB_buf; // check sanity of SMB header if (NPRsp->smbH.Magic != SMB_MAGIC) @@ -459,13 +455,13 @@ int smb_NegotiateProtocol(char *SMBServerIP, int SMBServerPort, char *Username, //------------------------------------------------------------------------- int smb_SessionSetupAndX(u32 capabilities) { - struct SessionSetupAndXRequest_t *SSR = (struct SessionSetupAndXRequest_t *)SMB_buf.u8buff; + struct SessionSetupAndXRequest_t *SSR = (struct SessionSetupAndXRequest_t *)SMB_buf; register int i, offset, CF; int AuthType = NTLM_AUTH; int password_len = 0; lbl_session_setup: - mips_memset(SMB_buf.u8buff, 0, sizeof(SMB_buf.u8buff)); + mips_memset(SMB_buf, 0, sizeof(SMB_buf)); CF = server_specs.StringsCF; @@ -521,7 +517,7 @@ int smb_SessionSetupAndX(u32 capabilities) rawTCP_SetSessionHeader(sizeof(struct SessionSetupAndXRequest_t) - 4 + offset); GetSMBServerReply(); - struct SessionSetupAndXResponse_t *SSRsp = (struct SessionSetupAndXResponse_t *)SMB_buf.u8buff; + struct SessionSetupAndXResponse_t *SSRsp = (struct SessionSetupAndXResponse_t *)SMB_buf; // check sanity of SMB header if (SSRsp->smbH.Magic != SMB_MAGIC) @@ -546,12 +542,12 @@ int smb_SessionSetupAndX(u32 capabilities) //------------------------------------------------------------------------- int smb_TreeConnectAndX(char *ShareName) { - struct TreeConnectAndXRequest_t *TCR = (struct TreeConnectAndXRequest_t *)SMB_buf.u8buff; + struct TreeConnectAndXRequest_t *TCR = (struct TreeConnectAndXRequest_t *)SMB_buf; register int i, offset, CF; int AuthType = NTLM_AUTH; int password_len = 0; - mips_memset(SMB_buf.u8buff, 0, sizeof(SMB_buf.u8buff)); + mips_memset(SMB_buf, 0, sizeof(SMB_buf)); CF = server_specs.StringsCF; @@ -594,7 +590,7 @@ int smb_TreeConnectAndX(char *ShareName) rawTCP_SetSessionHeader(sizeof(struct TreeConnectAndXRequest_t) - 4 + offset); GetSMBServerReply(); - struct TreeConnectAndXResponse_t *TCRsp = (struct TreeConnectAndXResponse_t *)SMB_buf.u8buff; + struct TreeConnectAndXResponse_t *TCRsp = (struct TreeConnectAndXResponse_t *)SMB_buf; // check sanity of SMB header if (TCRsp->smbH.Magic != SMB_MAGIC) @@ -613,12 +609,12 @@ int smb_TreeConnectAndX(char *ShareName) //------------------------------------------------------------------------- int smb_OpenAndX(char *filename, u16 *FID, int Write) { - struct OpenAndXRequest_t *OR = (struct OpenAndXRequest_t *)SMB_buf.u8buff; + struct OpenAndXRequest_t *OR = (struct OpenAndXRequest_t *)SMB_buf; register int i, offset, CF; WAITIOSEMA(io_sema); - mips_memset(SMB_buf.u8buff, 0, sizeof(SMB_buf.u8buff)); + mips_memset(SMB_buf, 0, sizeof(SMB_buf)); CF = server_specs.StringsCF; @@ -651,7 +647,7 @@ int smb_OpenAndX(char *filename, u16 *FID, int Write) rawTCP_SetSessionHeader(66 + offset); GetSMBServerReply(); - struct OpenAndXResponse_t *ORsp = (struct OpenAndXResponse_t *)SMB_buf.u8buff; + struct OpenAndXResponse_t *ORsp = (struct OpenAndXResponse_t *)SMB_buf; // check sanity of SMB header if (ORsp->smbH.Magic != SMB_MAGIC) @@ -694,15 +690,15 @@ int smb_ReadFile(u16 FID, u32 offsetlow, u32 offsethigh, void *readbuf, u16 nbyt plwip_send(main_socket, RR, sizeof(struct ReadAndXRequest_t), 0); receive: //offset 49 is the offset of the DataOffset field within the ReadAndXResponse structure. - rcv_size = plwip_recvfrom(main_socket, SMB_buf.u8buff, 49, readbuf, nbytes, 0, NULL, NULL); + rcv_size = plwip_recvfrom(main_socket, SMB_buf, 49, readbuf, nbytes, 0, NULL, NULL); expected_size = rawTCP_GetSessionHeader() + 4; - if (SMB_buf.u8buff[0] != 0) // dropping NBSS Session Keep alive + if (SMB_buf[0] != 0) // dropping NBSS Session Keep alive goto receive; // Handle fragmented packets while (rcv_size < expected_size) { - pkt_size = plwip_recvfrom(main_socket, NULL, 0, &((u8 *)readbuf)[rcv_size - SMB_buf.u8buff[49] - 4], expected_size - rcv_size, 0, NULL, NULL); // - rcv_size + pkt_size = plwip_recvfrom(main_socket, NULL, 0, &((u8 *)readbuf)[rcv_size - SMB_buf[49] - 4], expected_size - rcv_size, 0, NULL, NULL); // - rcv_size rcv_size += pkt_size; } @@ -715,7 +711,7 @@ int smb_ReadFile(u16 FID, u32 offsetlow, u32 offsethigh, void *readbuf, u16 nbyt //------------------------------------------------------------------------- int smb_WriteFile(u16 FID, u32 offsetlow, u32 offsethigh, void *writebuf, u16 nbytes) { - struct WriteAndXRequest_t *WR = (struct WriteAndXRequest_t *)SMB_buf.u8buff; + struct WriteAndXRequest_t *WR = (struct WriteAndXRequest_t *)SMB_buf; WAITIOSEMA(io_sema); @@ -729,7 +725,7 @@ int smb_WriteFile(u16 FID, u32 offsetlow, u32 offsethigh, void *writebuf, u16 nb WR->ByteCount = nbytes; //DataOffset points to the location of the data within the buffer, from right after sessionHeader, which Microsoft doesn't consider as being part of the SMB header. - mips_memcpy((void *)(&SMB_buf.u8buff[4 + WR->DataOffset]), writebuf, nbytes); + mips_memcpy((void *)(&SMB_buf[4 + WR->DataOffset]), writebuf, nbytes); rawTCP_SetSessionHeader(sizeof(struct WriteAndXRequest_t) - 4 + nbytes); GetSMBServerReply(); diff --git a/modules/iopcore/udnl-t300/udnl.c b/modules/iopcore/udnl-t300/udnl.c index 21e05588e..8b8da6f3f 100644 --- a/modules/iopcore/udnl-t300/udnl.c +++ b/modules/iopcore/udnl-t300/udnl.c @@ -479,11 +479,11 @@ static void LoadIRXModule(const void *module, struct ModuleInfo *ModuleInfo) ELF_hdr = (elf_header_t *)module; ELF_phdr = (elf_pheader_t *)((unsigned int)module + ELF_hdr->phoff); - ModuleInfo->gp = ModuleInfo->gp + (unsigned int)ModuleInfo->text_start; - ModuleInfo->EntryPoint = ModuleInfo->EntryPoint +(unsigned int)ModuleInfo->text_start; + (unsigned int)ModuleInfo->gp += (unsigned int)ModuleInfo->text_start; + (unsigned int)ModuleInfo->EntryPoint += (unsigned int)ModuleInfo->text_start; if (ModuleInfo->mod_id + 1 != 0) { - ModuleInfo->mod_id = ModuleInfo->mod_id + (unsigned int)ModuleInfo->text_start; + (unsigned int)ModuleInfo->mod_id += (unsigned int)ModuleInfo->text_start; } ELF_shdr = (elf_shdr_t *)((unsigned int)module + ELF_hdr->shoff); @@ -714,7 +714,7 @@ static const struct ExtInfoField *GetFileInfo(const struct RomdirFileStat *stat, return ExtInfoField; } - ExtInfoField = ExtInfoField + ((ExtInfoHeader >> 16 & 0xFC) + 4); + (unsigned char *)ExtInfoField += ((ExtInfoHeader >> 16 & 0xFC) + 4); } return NULL; diff --git a/modules/iopcore/udnl/udnl.c b/modules/iopcore/udnl/udnl.c index f769e24d7..772861961 100644 --- a/modules/iopcore/udnl/udnl.c +++ b/modules/iopcore/udnl/udnl.c @@ -391,11 +391,11 @@ static void LoadIRXModule(const void *module, struct ModuleInfo *ModuleInfo) ELF_hdr = (elf_header_t *)module; ELF_phdr = (elf_pheader_t *)((unsigned int)module + ELF_hdr->phoff); - ModuleInfo->gp = ModuleInfo->gp + (unsigned int)ModuleInfo->text_start; - ModuleInfo->EntryPoint = ModuleInfo->EntryPoint +(unsigned int)ModuleInfo->text_start; + (unsigned int)ModuleInfo->gp += (unsigned int)ModuleInfo->text_start; + (unsigned int)ModuleInfo->EntryPoint += (unsigned int)ModuleInfo->text_start; if (ModuleInfo->mod_id + 1 != 0) { - ModuleInfo->mod_id = ModuleInfo->mod_id + (unsigned int)ModuleInfo->text_start; + (unsigned int)ModuleInfo->mod_id += (unsigned int)ModuleInfo->text_start; } ELF_shdr = (elf_shdr_t *)((unsigned int)module + ELF_hdr->shoff); @@ -620,7 +620,7 @@ static const struct ExtInfoField *GetFileInfo(const struct RomdirFileStat *stat, return ExtInfoField; } - ExtInfoField = ExtInfoField + ((ExtInfoHeader >> 16 & 0xFC) + 4); + (unsigned char *)ExtInfoField += ((ExtInfoHeader >> 16 & 0xFC) + 4); } return NULL; diff --git a/modules/network/smap-ingame/xfer.c b/modules/network/smap-ingame/xfer.c index b5ddcc7e5..973c623ca 100644 --- a/modules/network/smap-ingame/xfer.c +++ b/modules/network/smap-ingame/xfer.c @@ -132,7 +132,7 @@ static inline void CopyFromFIFO(volatile u8 *smap_regbase, void *buffer, unsigne : "at", "v0", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"); } -int HandleRxIntr(struct SmapDriverData *SmapDrivPrivData) +inline int HandleRxIntr(struct SmapDriverData *SmapDrivPrivData) { USE_SMAP_RX_BD; int NumPacketsReceived; diff --git a/modules/network/smap-ingame/xfer.h b/modules/network/smap-ingame/xfer.h index f3f053f04..3f77c2989 100644 --- a/modules/network/smap-ingame/xfer.h +++ b/modules/network/smap-ingame/xfer.h @@ -1,2 +1,2 @@ -int HandleRxIntr(struct SmapDriverData *SmapDrivPrivData); +inline int HandleRxIntr(struct SmapDriverData *SmapDrivPrivData); int SMAPSendPacket(const void *data, unsigned int length); diff --git a/modules/network/smbinit/des.c b/modules/network/smbinit/des.c index 66217607c..3458cab1b 100644 --- a/modules/network/smbinit/des.c +++ b/modules/network/smbinit/des.c @@ -417,7 +417,7 @@ static const unsigned int des_skb[8][64] = { (a) ^= ((t) << (n))) -static unsigned char *key7TOkey8(const unsigned char *key7, unsigned char *key8) +static unsigned char *key7TOkey8(unsigned char *key7, unsigned char *key8) { int i; @@ -441,7 +441,7 @@ static unsigned char *key7TOkey8(const unsigned char *key7, unsigned char *key8) * des_create_keys: take 64bit user key (key) as input and outputs * 16 48bit keys (keys) */ -static unsigned char *DES_createkeys(const unsigned char *key) +static unsigned char *DES_createkeys(unsigned char *key) { unsigned int c, d, t, s; unsigned char *in; @@ -505,7 +505,7 @@ static unsigned char *DES_createkeys(const unsigned char *key) return (unsigned char *)DES_Keys; } -unsigned char *DES(const unsigned char *key, const unsigned char *message, unsigned char *cipher) +unsigned char *DES(unsigned char *key, unsigned char *message, unsigned char *cipher) { unsigned int l, r, t, u; int i; diff --git a/modules/network/smbinit/des.h b/modules/network/smbinit/des.h index 9f549d9df..b19c9886b 100755 --- a/modules/network/smbinit/des.h +++ b/modules/network/smbinit/des.h @@ -10,6 +10,6 @@ #ifndef DES_H #define DES_H -unsigned char *DES(const unsigned char *key, const unsigned char *message, unsigned char *cipher); +unsigned char *DES(unsigned char *key, unsigned char *message, unsigned char *cipher); #endif /* DES */ diff --git a/modules/network/smbinit/md4.c b/modules/network/smbinit/md4.c index 228d05ab1..ac3381961 100644 --- a/modules/network/smbinit/md4.c +++ b/modules/network/smbinit/md4.c @@ -141,32 +141,29 @@ static void engineReset() */ unsigned char *MD4(unsigned char *message, int len, unsigned char *cipher) { - union { - unsigned char ucbuff[128]; - unsigned int uibuff[128/sizeof(unsigned int)]; - } buffer; + unsigned char buffer[128]; unsigned int b = len * 8; engineReset(); while (len > 64) { - memcpy(buffer.ucbuff, message, 64); - transform(buffer.ucbuff); + memcpy(buffer, message, 64); + transform(buffer); message += 64; len -= 64; } - memset(buffer.ucbuff, 0, 128); - memcpy(buffer.ucbuff, message, len); - buffer.ucbuff[len] = 0x80; + memset(buffer, 0, 128); + memcpy(buffer, message, len); + buffer[len] = 0x80; if (len < 56) { - buffer.uibuff[56/sizeof(unsigned int)] = b; - transform(buffer.ucbuff); + *((unsigned int *)&buffer[56]) = b; + transform(buffer); } else { - buffer.uibuff[120/sizeof(unsigned int)] = b; - transform(buffer.ucbuff); - transform(&buffer.ucbuff[64]); + *((unsigned int *)&buffer[120]) = b; + transform(buffer); + transform(&buffer[64]); } *((unsigned int *)&cipher[0]) = context[0]; diff --git a/modules/network/smbinit/smbauth.c b/modules/network/smbinit/smbauth.c index 9dd5f442b..9479ce7f1 100644 --- a/modules/network/smbinit/smbauth.c +++ b/modules/network/smbinit/smbauth.c @@ -26,7 +26,7 @@ static unsigned char *LM_Password_Hash(const unsigned char *password, unsigned c int i; /* keep only 14 bytes of the password (padded with nul bytes) */ - strncpy((char*)tmp_pass, (const char*)password, 14); + strncpy(tmp_pass, password, 14); /* turn the password to uppercase */ for (i = 0; i < 14; i++) { @@ -38,10 +38,10 @@ static unsigned char *LM_Password_Hash(const unsigned char *password, unsigned c memcpy(K2, &tmp_pass[7], 7); /* encrypt the magic string with the keys */ - DES(K1, (const unsigned char*)"KGS!@#$%", &cipher[0]); - DES(K2, (const unsigned char*)"KGS!@#$%", &cipher[8]); + DES(K1, "KGS!@#$%", &cipher[0]); + DES(K2, "KGS!@#$%", &cipher[8]); - return cipher; + return (unsigned char *)cipher; } /* @@ -55,7 +55,7 @@ static unsigned char *NTLM_Password_Hash(const unsigned char *password, unsigned memset(passwd_buf, 0, sizeof(passwd_buf)); /* turn the password to unicode */ - for (i = 0, j = 0; i < strlen((const char*)password); i++, j += 2) + for (i = 0, j = 0; i < strlen(password); i++, j += 2) passwd_buf[j] = password[i]; /* get the message digest */ From a0b6888bac8d1da9c51387277e6beafcd62d9a54 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 4 Feb 2017 20:21:23 -0800 Subject: [PATCH 034/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_English.lng | 6 +++--- lng/lang_Korean.lng | 42 +++++++++++++++++++++--------------------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 7e901e4d1..f4a567cb3 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev992 - Jay-Jay-OPL - revert changes made to core files in r991 - Fri Feb 3 19:05:07 2017 -0800 rev991 - Jay-Jay-OPL - @AKuHAK committed the following changes: Synced with mainstream ps2sdk: * Corrected the use of mixed-sign arithmetic, corrected the transfer limit for ata_device_sector_io(), changed ATAD to use the typedefs for fixed-sized values (i.e. u16 instead of unsigned short) to ensure correctness. (56f0335) Note: 48-bit changes didnt ported into HD Pro ATAD module - Thu Feb 2 18:56:18 2017 -0800 rev990 - Jay-Jay-OPL - update lang files - Thu Feb 2 17:42:04 2017 -0800 rev989 - Jay-Jay-OPL - update langs - Tue Jan 31 13:08:15 2017 -0800 diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 7c7261a7d..6a357732f 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -242,11 +242,11 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: +USB bluetooth adapter MAC address: +DS3 Controller paired to MAC address: Pair Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. +Pair DS3 controller with bluetooth adapter MAC address. Not connected ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 20f711d67..4600d6619 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,5 +1,5 @@ # Translated by DDinghoya -# Last update: 01/25/2017 +# Last update: 02/04/2017 # Updated for OPL_983_DB [7f7e9af] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Korean @@ -210,25 +210,25 @@ PS2RD 치트 엔진 모드 초 입력, 자동 시작하지 않으려면 0으로 설정 PS2 로고 콘솔의 지역과 일치하는 유효한 디스크 로고만 표시 -Configure PADEMU -Pad Emulator Settings -Enable Pad Emulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode -Select Pad Emulator mode. -DualShock3 USB -DualShock3 BT -Settings for port: -Select Pad Emulator port for settings. -Enable emulation -Turns on/off Pad Emulator for selected port. -Enable vibration -Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: -Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. -Not connected +PADEMU 구성 +패드 에뮬레이터 설정 +패드 에뮬레이터 활성화 +선택된 게임 패드에뮬레이터 켬/끔. +패드 에뮬레이터 모드 +패드 에뮬레이터 모드 선택 +듀얼쇼크3 USB +듀얼쇼크3 BT +포트 설정: +설정용 패드 에뮬레이터 포트 활성화. +에뮬레이션 활성화 +선택된 포트 패드에뮬레이터 켬/끔. +진동 활성화 +패드 에뮬레이터에 선택된 포트 진동 켬/끔 +USB 블루투스 어답터 맥 주소: +DS3 컨트롤러 맥 주소와 페어링: +페어 +DS3 컨트롤러 페어링 +블루투스 어댑터 맥 주소가 있는 DS3 컨트롤러 페어 +연결되지 않음 ELF 로더 메뉴 ELF 로더 메뉴 디스플레이 모드 \ No newline at end of file From 21a9a7bb3a09e2d58a131c61412cdbb2624cdc58 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 7 Feb 2017 00:50:23 -0800 Subject: [PATCH 035/269] remove README.md --- DETAILED_CHANGELOG | 1 + README.md | 110 --------------------------------------------- 2 files changed, 1 insertion(+), 110 deletions(-) delete mode 120000 README.md diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index f4a567cb3..b1742e52b 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev993 - Jay-Jay-OPL - update lang files - Sat Feb 4 20:21:23 2017 -0800 rev992 - Jay-Jay-OPL - revert changes made to core files in r991 - Fri Feb 3 19:05:07 2017 -0800 rev991 - Jay-Jay-OPL - @AKuHAK committed the following changes: Synced with mainstream ps2sdk: * Corrected the use of mixed-sign arithmetic, corrected the transfer limit for ata_device_sector_io(), changed ATAD to use the typedefs for fixed-sized values (i.e. u16 instead of unsigned short) to ensure correctness. (56f0335) Note: 48-bit changes didnt ported into HD Pro ATAD module - Thu Feb 2 18:56:18 2017 -0800 rev990 - Jay-Jay-OPL - update lang files - Thu Feb 2 17:42:04 2017 -0800 diff --git a/README.md b/README.md deleted file mode 120000 index 23ffafcd7..000000000 --- a/README.md +++ /dev/null @@ -1,110 +0,0 @@ -# Open PS2 Loader - -Copyright 2013, Ifcaro & jimmikaelkael -Licenced under Academic Free License version 3.0 -Review LICENSE file for further details. - -## Introduction - -Open PS2 Loader (OPL) is a 100% Open source game and application loader for -the PS2 and PS3 units. It supports three categories of devices : USB mass -storage devices, SMB shares and the PlayStation 2 HDD unit. USB devices and -SMB shares support USBExtreme and \*.ISO formats while PS2 HDD supports HDLoader -format. It's now the most compatible homebrew loader. - -OPL is also developed continuously - anyone can contribute improvements to -the project due to its open source nature. - -You can visit the Open PS2 Loader forum at: - -http://psx-scene.com/forums/official-open-ps2-loader-forum/ - -http://www.ps2-home.com/forum/viewforum.php?f=13 - -For updated compatibility list, you can visit OPL-CL site at: - -http://sx.sytes.net/oplcl/games.aspx - -## Release types - -Open PS2 Loader bundle included several types of the same OPL version. These -types come with more or less features included. - -| Type (can be a combination) | Description | -| --------------------------- | --------------------------------------------------------------------------------- | -| "Normal" (No suffixes) | Regular, basic OPL release, without any extra features. Aka vanilla build. | -| "Childproof" | OPL release with some controls disabled (e.g. write operations). | -| "VMC" | OPL release with Virtual Memory Card (VMC) support. | -| "GSM" | OPL release with GSM integrated into it. | -| "PS2RD" | OPL release with PS2RD Cheat Engine built-in feature. | - -## How to use - -OPL uses the following directory tree structure across HDD, SMB, and -USB modes: - -| Folder | Description | Modes | -| ------ | ----------- | ----- | -| "CD" | for games on CD media - i.e. blue-bottom discs | USB and SMB | -| "DVD" | for DVD5 and DVD9 images if using the NTFS file system on USB or SMB ; DVD9 images must be split and placed into the device root if using the FAT32 file system on USB or SMB | USB and SMB | -| "VMC" | for Virtual Memory Card images - from 8MB up to 64MB | all | -| "CFG" | for saving per-game configuration files | all | -| "ART" | for game art images | all | -| "THM" | for themes support | all | -| "CHT" | for cheats files | all | -| "CFG-DEV" | for saving per-game configuration files, when used from a OPL dev build - aka beta build | all | - -OPL will automatically create the above directory structure the first time -you launch it and enable your favourite device. For HDD users, a 128Mb +OPL -partition will be created (you can enlarge it using uLaunchELF if you need to). - -## USB - -Game files on USB must be perfectly defragmented either file by file or -by whole drive, and Dual Layer DVD9 images must be split to avoid the 4GB -limitations of the FAT32 file system. We recommend Auslogics Disk Defrag -for best defragging results. - -http://www.auslogics.com/en/software/disk-defrag/ - -You also need a PC program to convert or split games into USB Advance/Extreme -format, such as USBUtil 2.0. - -## SMB - -For loading games by SMB protocol you need to share a folder (ex: PS2SMB) -on the host machine or NAS device and make sure that it has full read and -write permissions. USB Advance/Extreme format is optional - \*.ISO images -are supported using the folder structure above with the added bonus that -DVD9 images don't have to be split if your SMB device uses the NTFS or -EXT3/4 file system. - -## HDD - -For PS2, 48-bit LBA internal HDDs up to 2TB are supported. They have to be -formatted with either HDLoader or uLaunchELF (uLaunchELF is recommended). - -To launch OPL, you can use any of the existing methods for loading an -executable elf. - -On PS3, you need an original SwapMagic 3.6+ or 3.8 disc (at the moment -there aren't any other options). The steps for loading OPL on a PS3 are: - -1. Rename OPNPS2LD.ELF to SMBOOT0.ELF -2. Make a folder in root of USB device called SWAPMAGIC and copy SMBOOT0.ELF to it. -3. Launch SwapMagic in PS3 and press UP+L1 then Open PS2 Loader should start. - -There are 4 forms for launching elfs in SwapMagic. - -SMBOOT0.ELF = UP + L1 -SMBOOT1.ELF = UP + L2 -SMBOOT2.ELF = UP + R1 -SMBOOT3.ELF = UP + R2 - -Note: on PS3, only USB and SMB modes are supported. - -## Some notes for devs - -Open PS2 Loader needs the latest PS2SDK: - -https://github.com/ps2dev/ps2sdk From 1fd66daac6e1406a90caa63a4e2380aef9d78c82 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 7 Feb 2017 00:52:53 -0800 Subject: [PATCH 036/269] replace README.md --- DETAILED_CHANGELOG | 1 + README.md | 108 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 README.md diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index b1742e52b..505999dee 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev994 - Jay-Jay-OPL - remove README.md - Tue Feb 7 00:50:23 2017 -0800 rev993 - Jay-Jay-OPL - update lang files - Sat Feb 4 20:21:23 2017 -0800 rev992 - Jay-Jay-OPL - revert changes made to core files in r991 - Fri Feb 3 19:05:07 2017 -0800 rev991 - Jay-Jay-OPL - @AKuHAK committed the following changes: Synced with mainstream ps2sdk: * Corrected the use of mixed-sign arithmetic, corrected the transfer limit for ata_device_sector_io(), changed ATAD to use the typedefs for fixed-sized values (i.e. u16 instead of unsigned short) to ensure correctness. (56f0335) Note: 48-bit changes didnt ported into HD Pro ATAD module - Thu Feb 2 18:56:18 2017 -0800 diff --git a/README.md b/README.md new file mode 100644 index 000000000..c1156d7e4 --- /dev/null +++ b/README.md @@ -0,0 +1,108 @@ +# Open PS2 Loader + +Copyright 2013, Ifcaro & jimmikaelkael +Licenced under Academic Free License version 3.0 +Review LICENSE file for further details. + +## Introduction + +Open PS2 Loader (OPL) is a 100% Open source game and application loader for +the PS2 and PS3 units. It supports three categories of devices : USB mass +storage devices, SMB shares and the PlayStation 2 HDD unit. USB devices and +SMB shares support USBExtreme and \*.ISO formats while PS2 HDD supports HDLoader +format. It's now the most compatible homebrew loader. + +OPL is also developed continuously - anyone can contribute improvements to +the project due to its open source nature. + +You can visit the Open PS2 Loader forum at: + +http://psx-scene.com/forums/official-open-ps2-loader-forum/ + +For updated compatibility list, you can visit OPL-CL site at: + +http://sx.sytes.net/oplcl/games.aspx + +## Release types + +Open PS2 Loader bundle included several types of the same OPL version. These +types come with more or less features included. + +| Type (can be a combination) | Description | +| --------------------------- | --------------------------------------------------------------------------------- | +| "Normal" (No suffixes) | Regular, basic OPL release, without any extra features. Aka vanilla build. | +| "Childproof" | OPL release with some controls disabled (e.g. write operations). | +| "VMC" | OPL release with Virtual Memory Card (VMC) support. | +| "GSM" | OPL release with GSM integrated into it. | +| "PS2RD" | OPL release with PS2RD Cheat Engine built-in feature. | + +## How to use + +OPL uses the following directory tree structure across HDD, SMB, and +USB modes: + +| Folder | Description | Modes | +| ------ | ----------- | ----- | +| "CD" | for games on CD media - i.e. blue-bottom discs | USB and SMB | +| "DVD" | for DVD5 and DVD9 images if using the NTFS file system on USB or SMB ; DVD9 images must be split and placed into the device root if using the FAT32 file system on USB or SMB | USB and SMB | +| "VMC" | for Virtual Memory Card images - from 8MB up to 64MB | all | +| "CFG" | for saving per-game configuration files | all | +| "ART" | for game art images | all | +| "THM" | for themes support | all | +| "CHT" | for cheats files | all | +| "CFG-DEV" | for saving per-game configuration files, when used from a OPL dev build - aka beta build | all | + +OPL will automatically create the above directory structure the first time +you launch it and enable your favourite device. For HDD users, a 128Mb +OPL +partition will be created (you can enlarge it using uLaunchELF if you need to). + +## USB + +Game files on USB must be perfectly defragmented either file by file or +by whole drive, and Dual Layer DVD9 images must be split to avoid the 4GB +limitations of the FAT32 file system. We recommend Auslogics Disk Defrag +for best defragging results. + +http://www.auslogics.com/en/software/disk-defrag/ + +You also need a PC program to convert or split games into USB Advance/Extreme +format, such as USBUtil 2.0. + +## SMB + +For loading games by SMB protocol you need to share a folder (ex: PS2SMB) +on the host machine or NAS device and make sure that it has full read and +write permissions. USB Advance/Extreme format is optional - \*.ISO images +are supported using the folder structure above with the added bonus that +DVD9 images don't have to be split if your SMB device uses the NTFS or +EXT3/4 file system. + +## HDD + +For PS2, 48-bit LBA internal HDDs up to 2TB are supported. They have to be +formatted with either HDLoader or uLaunchELF (uLaunchELF is recommended). + +To launch OPL, you can use any of the existing methods for loading an +executable elf. + +On PS3, you need an original SwapMagic 3.6+ or 3.8 disc (at the moment +there aren't any other options). The steps for loading OPL on a PS3 are: + +1. Rename OPNPS2LD.ELF to SMBOOT0.ELF +2. Make a folder in root of USB device called SWAPMAGIC and copy SMBOOT0.ELF to it. +3. Launch SwapMagic in PS3 and press UP+L1 then Open PS2 Loader should start. + +There are 4 forms for launching elfs in SwapMagic. + +SMBOOT0.ELF = UP + L1 +SMBOOT1.ELF = UP + L2 +SMBOOT2.ELF = UP + R1 +SMBOOT3.ELF = UP + R2 + +Note: on PS3, only USB and SMB modes are supported. + +## Some notes for devs + +Open PS2 Loader needs the latest PS2SDK: + +https://github.com/ps2dev/ps2sdk From e07419d46b4f0c3d94c638565c38544ebbfa24f5 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 4 Mar 2017 18:50:40 -0800 Subject: [PATCH 037/269] the following changes were done by Developer SP193: Fix for HDD size calculation, new poweroff processing mechanism, fixed PBUF allocation for Ethernet ARP request, new option for SMSTCPIP to save more RAM. (#44) * Corrected HDD partition size calculation (change in homebrew specs to align with the official documentation; size is now in 512-byte HDD sectors). * (ingame SMSTCPIP) Fixed pbuf allocation for Ethernet ARP request and changed SMAPSendPacket to assume that all PBUFs are aligned. etharp_query requests PBUF_LINK from pbuf_alloc(), but does not reveal the Ethernet header. It is possible that this also writes beyond the end of the PBUF. * Changed GUI power-off to deinitialize the UI and to switch off DEV9, before power off. * Added new MEM_LIBC_MALLOC option to mem.c and enabled it. It functions like the official option from newer LWIP versions. --- DETAILED_CHANGELOG | 1 + modules/network/SMSTCPIP/etharp.c | 5 +- .../network/SMSTCPIP/include/arch/sys_arch.h | 11 ++ modules/network/SMSTCPIP/include/lwip/opt.h | 9 ++ modules/network/SMSTCPIP/include/lwipopts.h | 7 ++ modules/network/SMSTCPIP/mem.c | 101 +++++++++++++++--- modules/network/SMSTCPIP/ps2ip.c | 38 +++++++ modules/network/smap-ingame/xfer.c | 17 ++- src/hdd.c | 2 +- src/system.c | 2 + 10 files changed, 168 insertions(+), 25 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 505999dee..be5db839d 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev995 - Jay-Jay-OPL - replace README.md - Tue Feb 7 00:52:53 2017 -0800 rev994 - Jay-Jay-OPL - remove README.md - Tue Feb 7 00:50:23 2017 -0800 rev993 - Jay-Jay-OPL - update lang files - Sat Feb 4 20:21:23 2017 -0800 rev992 - Jay-Jay-OPL - revert changes made to core files in r991 - Fri Feb 3 19:05:07 2017 -0800 diff --git a/modules/network/SMSTCPIP/etharp.c b/modules/network/SMSTCPIP/etharp.c index 189b314ad..51178bfce 100644 --- a/modules/network/SMSTCPIP/etharp.c +++ b/modules/network/SMSTCPIP/etharp.c @@ -759,7 +759,10 @@ err_t etharp_query(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q) if (perform_arp_request) { struct pbuf *p; /* allocate a pbuf for the outgoing ARP request packet */ - p = pbuf_alloc(PBUF_LINK, sizeof(struct etharp_hdr), PBUF_RAM); + /* SP193: the original used PBUF_LINK, but doesn't reveal the Ethernet header with pbuf_header(). + So other than causing alignment problems when the frame is sent to linkoutput(), + I guess it could possibly write beyond the end of the PBUF. */ + p = pbuf_alloc(PBUF_RAW, sizeof(struct etharp_hdr), PBUF_RAM); /* could allocate pbuf? */ if (p != NULL) { u8_t j; diff --git a/modules/network/SMSTCPIP/include/arch/sys_arch.h b/modules/network/SMSTCPIP/include/arch/sys_arch.h index b34222510..838cd27e6 100644 --- a/modules/network/SMSTCPIP/include/arch/sys_arch.h +++ b/modules/network/SMSTCPIP/include/arch/sys_arch.h @@ -8,4 +8,15 @@ typedef int sys_thread_t; #define SYS_MBOX_NULL NULL #define SYS_SEM_NULL 0 + +#if MEM_LIBC_MALLOC +void *ps2ip_mem_malloc(int size); +void ps2ip_mem_free(void *rmem); +void *ps2ip_mem_realloc(void *rmem, int newsize); + +#define mem_clib_free ps2ip_mem_free +#define mem_clib_malloc ps2ip_mem_malloc +#define mem_clib_realloc ps2ip_mem_realloc +#endif + #endif /* __SYS_ARCH_H__ */ diff --git a/modules/network/SMSTCPIP/include/lwip/opt.h b/modules/network/SMSTCPIP/include/lwip/opt.h index d28da0c86..6f2d2efc2 100644 --- a/modules/network/SMSTCPIP/include/lwip/opt.h +++ b/modules/network/SMSTCPIP/include/lwip/opt.h @@ -53,6 +53,15 @@ #define NO_SYS 0 #endif /* ---------- Memory options ---------- */ +/** + * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library + * instead of the lwip internal allocator. Can save code size if you + * already use it. + */ +#if !defined MEM_LIBC_MALLOC +#define MEM_LIBC_MALLOC 0 +#endif + /* MEM_ALIGNMENT: should be set to the alignment of the CPU for which lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2 byte alignment -> define MEM_ALIGNMENT to 2. */ diff --git a/modules/network/SMSTCPIP/include/lwipopts.h b/modules/network/SMSTCPIP/include/lwipopts.h index 7484a12fd..d7304115e 100644 --- a/modules/network/SMSTCPIP/include/lwipopts.h +++ b/modules/network/SMSTCPIP/include/lwipopts.h @@ -3,6 +3,13 @@ #define LWIP_CALLBACK_API 1 /* ---------- Memory options ---------- */ +/** + * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library + * instead of the lwip internal allocator. Can save code size if you + * already use it. + */ +#define MEM_LIBC_MALLOC 1 + /* MEM_ALIGNMENT: should be set to the alignment of the CPU for which lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2 byte alignment -> define MEM_ALIGNMENT to 2. */ diff --git a/modules/network/SMSTCPIP/mem.c b/modules/network/SMSTCPIP/mem.c index 2f4ceb30b..4efa94fdb 100644 --- a/modules/network/SMSTCPIP/mem.c +++ b/modules/network/SMSTCPIP/mem.c @@ -51,6 +51,79 @@ #include "smsutils.h" +#if MEM_LIBC_MALLOC +/** mem_init is not used when using C library malloc(). + */ +void +mem_init(void) +{ +} + +/* lwIP heap implemented using C library malloc() */ + +/* in case C library malloc() needs extra protection, + * allow these defines to be overridden. + */ +#ifndef mem_clib_free +#define mem_clib_free free +#endif +#ifndef mem_clib_malloc +#define mem_clib_malloc malloc +#endif +#ifndef mem_clib_realloc +#define mem_clib_realloc realloc +#endif + +/** + * Allocate a block of memory with a minimum of 'size' bytes. + * + * @param size is the minimum size of the requested block in bytes. + * @return pointer to allocated memory or NULL if no free memory was found. + * + * Note that the returned value must always be aligned (as defined by MEM_ALIGNMENT). + */ +void * +mem_malloc(mem_size_t size) +{ + void* ret = mem_clib_malloc(size); + if (ret == NULL) { +#if MEM_STATS + ++lwip_stats.mem.err; +#endif /* MEM_STATS */ + } else { + LWIP_ASSERT("malloc() must return aligned memory", LWIP_MEM_ALIGN(ret) == ret); + } + return ret; +} + +/** Put memory back on the heap + * + * @param rmem is the pointer as returned by a previous call to mem_malloc() + */ +void +mem_free(void *rmem) +{ + LWIP_ASSERT("rmem != NULL", (rmem != NULL)); + LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem))); + mem_clib_free(rmem); +} + +void * +mem_realloc(void *rmem, mem_size_t newsize) +{ + void* ret = mem_clib_realloc(rmem, newsize); + if (ret == NULL) { +#if MEM_STATS + ++lwip_stats.mem.err; +#endif /* MEM_STATS */ + } else { + LWIP_ASSERT("realloc() must return aligned memory", LWIP_MEM_ALIGN(ret) == ret); + } + return ret; +} + +#else + struct mem { mem_size_t next, prev; @@ -177,18 +250,6 @@ void mem_free(void *rmem) plug_holes(mem); SYS_ARCH_UNPROTECT(old_level); } -void * -mem_reallocm(void *rmem, mem_size_t newsize) -{ - void *nmem; - nmem = mem_malloc(newsize); - if (nmem == NULL) { - return mem_realloc(rmem, newsize); - } - mips_memcpy(nmem, rmem, newsize); - mem_free(rmem); - return nmem; -} void * mem_realloc(void *rmem, mem_size_t newsize) @@ -242,6 +303,7 @@ mem_realloc(void *rmem, mem_size_t newsize) SYS_ARCH_UNPROTECT(old_level); return rmem; } + void * mem_malloc(mem_size_t size) { @@ -315,3 +377,18 @@ mem_malloc(mem_size_t size) SYS_ARCH_UNPROTECT(old_level); return NULL; } + +#endif /* MEM_LIBC_MALLOC */ + +void * +mem_reallocm(void *rmem, mem_size_t newsize) +{ + void *nmem; + nmem = mem_malloc(newsize); + if (nmem == NULL) { + return mem_realloc(rmem, newsize); + } + mips_memcpy(nmem, rmem, newsize); + mem_free(rmem); + return nmem; +} diff --git a/modules/network/SMSTCPIP/ps2ip.c b/modules/network/SMSTCPIP/ps2ip.c index ddc324179..4d2a239ab 100644 --- a/modules/network/SMSTCPIP/ps2ip.c +++ b/modules/network/SMSTCPIP/ps2ip.c @@ -566,3 +566,41 @@ void sys_sem_free(sys_sem_t aSema) DeleteSema(aSema); } /* end sys_sem_free */ + +#if MEM_LIBC_MALLOC +void *ps2ip_mem_malloc(int size) +{ + int OldState; + void* ret; + + CpuSuspendIntr(&OldState); + ret = AllocSysMemory(ALLOC_LAST, size, NULL); + CpuResumeIntr(OldState); + + return ret; +} + +void ps2ip_mem_free(void *rmem) +{ + int OldState; + + CpuSuspendIntr(&OldState); + FreeSysMemory(rmem); + CpuResumeIntr(OldState); +} + +/* Only pbuf_realloc() uses mem_realloc(), which uses this function. + As pbuf_realloc can only shrink PBUFs, I don't think SYSMEM will fail to allocate a smaller region. */ +void *ps2ip_mem_realloc(void *rmem, int newsize) +{ + int OldState; + void* ret; + + CpuSuspendIntr(&OldState); + FreeSysMemory(rmem); + ret = AllocSysMemory(ALLOC_ADDRESS, newsize, rmem); + CpuResumeIntr(OldState); + + return ret; +} +#endif diff --git a/modules/network/smap-ingame/xfer.c b/modules/network/smap-ingame/xfer.c index 973c623ca..8ac34da58 100644 --- a/modules/network/smap-ingame/xfer.c +++ b/modules/network/smap-ingame/xfer.c @@ -29,7 +29,7 @@ static inline int CopyToFIFOWithDMA(volatile u8 *smap_regbase, void *buffer, int int NumBlocks; int result; - if (((unsigned int)buffer & 3) == 0 && (NumBlocks = length >> 7) > 0) { + if ((NumBlocks = length >> 7) > 0) { if (dev9DmaTransfer(1, buffer, NumBlocks << 16 | 0x20, DMAC_FROM_MEM) >= 0) { result = NumBlocks << 7; } else @@ -205,14 +205,10 @@ int SMAPSendPacket(const void *data, unsigned int length) "beqz $at, 3f\n\t" "andi %1, %1, 0xF\n\t" "4:\n\t" - "lwr $t0, 0(%0)\n\t" - "lwl $t0, 3(%0)\n\t" - "lwr $t1, 4(%0)\n\t" - "lwl $t1, 7(%0)\n\t" - "lwr $t2, 8(%0)\n\t" - "lwl $t2, 11(%0)\n\t" - "lwr $t3, 12(%0)\n\t" - "lwl $t3, 15(%0)\n\t" + "lw $t0, 0(%0)\n\t" + "lw $t1, 4(%0)\n\t" + "lw $t2, 8(%0)\n\t" + "lw $t3, 12(%0)\n\t" "addiu $at, $at, -1\n\t" "sw $t0, 4352($v1)\n\t" "sw $t1, 4352($v1)\n\t" @@ -224,8 +220,7 @@ int SMAPSendPacket(const void *data, unsigned int length) "beqz %1, 1f\n\t" "nop\n\t" "2:\n\t" - "lwr $v0, 0(%0)\n\t" - "lwl $v0, 3(%0)\n\t" + "lw $v0, 0(%0)\n\t" "addiu %1, %1, -4\n\t" "sw $v0, 4352($v1)\n\t" "bnez %1, 2b\n\t" diff --git a/src/hdd.c b/src/hdd.c index 0557d78c4..3eeb2ddc0 100644 --- a/src/hdd.c +++ b/src/hdd.c @@ -212,7 +212,7 @@ int hddGetHDLGamelist(hdl_games_list_t *game_list) pGameEntry->lba = dirent.stat.private_5 + (HDL_GAME_DATA_OFFSET + 4096) / 512; } - pGameEntry->size += (dirent.stat.hisize << 21) | (dirent.stat.size >> 11); //size in bytes / 2048 + pGameEntry->size += (dirent.stat.size / 4); //size in sectors * (512 / 2048) } } diff --git a/src/system.c b/src/system.c index ba8b7c685..2e3bbf680 100644 --- a/src/system.c +++ b/src/system.c @@ -323,6 +323,8 @@ void sysReset(int modload_mask) void sysPowerOff(void) { + deinit(NO_EXCEPTION); + fileXioDevctl("dev9x:", DDIOC_OFF, NULL, 0, NULL, 0); poweroffShutdown(); } From 1578672a8145fcee9b8ff85b4133bfa5d63a80ee Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 10 Mar 2017 02:00:30 -0800 Subject: [PATCH 038/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Arabic.lng | 42 +++++++++++++++++++++--------------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index be5db839d..941043f72 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev996 - Jay-Jay-OPL - the following changes were done by Developer SP193: - Sat Mar 4 18:50:40 2017 -0800 rev995 - Jay-Jay-OPL - replace README.md - Tue Feb 7 00:52:53 2017 -0800 rev994 - Jay-Jay-OPL - remove README.md - Tue Feb 7 00:50:23 2017 -0800 rev993 - Jay-Jay-OPL - update lang files - Sat Feb 4 20:21:23 2017 -0800 diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 744ccd4c0..e3a75990e 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,5 +1,5 @@ # translation by alimadhi -# Last update: 01/25/2017 +# Last update: 03/10/2017 # Updated for OPL_983_DB [7f7e9af] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Arabic @@ -114,7 +114,7 @@ IP قراءات دقيقة وضع التزامن Unhook Syscalls -تخطي فيديو +اجتياز الفيديو محاكي DVD-DL تعطيل IGR ارتفاع حدة التخزين @@ -209,26 +209,26 @@ FMV اجتياز تشغيل تلقائي القيمة في الثانية (s)، صفر لتعطيل التشغيل التلقائي PS2 Logo -Only displayed for a valid disc logo which matches the console's region -Configure PADEMU -Pad Emulator Settings -Enable Pad Emulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode -Select Pad Emulator mode. +عرض شعار القرص فقط الساري المفعول والمطابق لمنطة الجهاز +تكوين PADEMU +اعدادات محاكي اليدة +تمكين محاكي اليدة +تشغيل/ايقاف محاكي اليدة لتحديد لعبة +وضع محاكي اليدة +اختيار وضع محاكي اليدة DualShock3 USB DualShock3 BT -Settings for port: -Select Pad Emulator port for settings. -Enable emulation -Turns on/off Pad Emulator for selected port. -Enable vibration -Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: -Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. -Not connected +اعدادات المخرج: +تحديد مخرج محاكي اليدة للاعدادات. +تمكين المحاكي +تشغيل/ايقاف محاكي اليدة لتحديد المخرج +تمكيل الاهتزاز +تشغيل/ايقاف الاهتزاز لاختيار مخرج محاكي اليدة +عنوان الماك لمحول اليواسبي البلوتوث +اقتران DS3التحكم بال العنوان الماك +اقتران +اقتران التحكم DS3 +اقتران التحكممع البلوتوث +غير متصل قائمة مشغلات ELF مخصص ELF \ No newline at end of file From ff71aadff2394c5c80216546d02cf68f9d15bd1c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 19 Mar 2017 20:39:39 -0700 Subject: [PATCH 039/269] thanks to changes made by Krah we can now adjust itemsList to be centered on main page of OPL in custom themes by using the following decorator property: aligned=1 --- DETAILED_CHANGELOG | 1 + src/themes.c | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 941043f72..651e00c8f 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev997 - Jay-Jay-OPL - update lang files - Fri Mar 10 02:00:30 2017 -0800 rev996 - Jay-Jay-OPL - the following changes were done by Developer SP193: - Sat Mar 4 18:50:40 2017 -0800 rev995 - Jay-Jay-OPL - replace README.md - Tue Feb 7 00:52:53 2017 -0800 rev994 - Jay-Jay-OPL - remove README.md - Tue Feb 7 00:50:23 2017 -0800 diff --git a/src/themes.c b/src/themes.c index 0c4eac466..81e7b392d 100644 --- a/src/themes.c +++ b/src/themes.c @@ -708,14 +708,14 @@ static void drawItemsList(struct menu_list *menu, struct submenu_list *item, con if (itemsList->decoratorImage) { GSTEXTURE *itemIconTex = getGameImageTexture(itemsList->decoratorImage->cache, menu->item->userdata, &ps->item); if (itemIconTex && itemIconTex->Mem) - rmDrawPixmap(itemIconTex, posX, posY, ALIGN_NONE, DECORATOR_SIZE, DECORATOR_SIZE, elem->scaled, gDefaultCol); + rmDrawPixmap(itemIconTex, posX, posY, elem->aligned, DECORATOR_SIZE, DECORATOR_SIZE, elem->scaled, gDefaultCol); else { if (itemsList->decoratorImage->defaultTexture) - rmDrawPixmap(&itemsList->decoratorImage->defaultTexture->source, posX, posY, ALIGN_NONE, DECORATOR_SIZE, DECORATOR_SIZE, elem->scaled, gDefaultCol); + rmDrawPixmap(&itemsList->decoratorImage->defaultTexture->source, posX, posY, elem->aligned, DECORATOR_SIZE, DECORATOR_SIZE, elem->scaled, gDefaultCol); } - fntRenderString(elem->font, posX + DECORATOR_SIZE, posY, ALIGN_NONE, elem->width, elem->height, submenuItemGetText(&ps->item), color); + fntRenderString(elem->font, elem->posX + DECORATOR_SIZE, posY, elem->aligned, elem->width, elem->height, submenuItemGetText(&ps->item), color); } else - fntRenderString(elem->font, posX, posY, ALIGN_NONE, elem->width, elem->height, submenuItemGetText(&ps->item), color); + fntRenderString(elem->font, elem->posX, posY, elem->aligned, elem->width, elem->height, submenuItemGetText(&ps->item), color); posY += MENU_ITEM_HEIGHT; ps = ps->next; From f4371df417e0bd5bec4a3d6c89ecc4a83812696a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 27 Mar 2017 13:48:20 -0700 Subject: [PATCH 040/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Japanese.lng | 234 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 235 insertions(+) create mode 100644 lng/lang_Japanese.lng diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 651e00c8f..8de17a3a7 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev998 - Jay-Jay-OPL - thanks to changes made by Krah we can now adjust itemsList to be centered on main page of OPL in custom themes by using the following decorator property: aligned=1 - Sun Mar 19 20:39:39 2017 -0700 rev997 - Jay-Jay-OPL - update lang files - Fri Mar 10 02:00:30 2017 -0800 rev996 - Jay-Jay-OPL - the following changes were done by Developer SP193: - Sat Mar 4 18:50:40 2017 -0800 rev995 - Jay-Jay-OPL - replace README.md - Tue Feb 7 00:52:53 2017 -0800 diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng new file mode 100644 index 000000000..e1d191903 --- /dev/null +++ b/lng/lang_Japanese.lng @@ -0,0 +1,234 @@ +# Japanese Translation by yamamotonew +# Last update: 03/27/2017 +# Updated for OPL_983_DB [7f7e9af] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +Japanese +OPL %s +設定を保存する +戻る +ネットワーク設定 +詳細オプション +<未設定> +設定が保存されました +設定保存中にエラーが発生しました +終了 +設定 +メニュー +USBゲーム +HDDゲーム +ETHゲーム +アプリ +テーマ +言語 +システムを終了し電源を切ります +ブラウザ/OSDSYSに戻りますか? +変更をキャンセルしますか? +%d: HDDが接続されていません +%d: HDDがフォーマットされていません +%d: ネットワーク設定エラー +%d: ネットワークアダプタが接続されていません +%d: SMBサーバに接続できません +%d: SMBサーバにログインできません +%d: SMBフォルダを開けません +%d: SMBゲームが見つかりません +%d: ゲームが見つかりません +%d: DHCPサーバが見つかりません +%d: ネットワーク接続が見つかりません +オン +オフ +OK +セレクト +キャンセル +○ +☓ +ゲームリスト +ゲーム設定 +設定を初期化 +キー設定を初期化 +画面スクロール +遅い +普通 +速い +初期メニュー +ディスクからロード +お待ちください +ゲームIDをロード中にエラーが発生しました +自動的に並べ替え +言語設定をロード中にエラーが発生しました +デバッグカラーを無効化 +コントローラーが見つかりません。お待ちください +カバーアートを表示 +ワイドスクリーン +電源を切る +設定をロードします +設定を保存します +デバイスを開始 +リフレッシュ +USBデバイス表示モード +HDDデバイス表示モード +ETHデバイス表示モード +アプリ表示モード +自動 +手動 +HDLサーバを開始 +HDLサーバを開始します +HDLサーバは開始しました +HDLサーバ開始に失敗しました +HDLサーバを取消 +IGRパス +背景色 +文字色 +- PS2 - +- SMBサーバ - +IPアドレスタイプ +Static +DHCP +IPアドレス +アドレス +マスク +ゲートウェイ +DNSサーバ +ポート +共有名 +ユーザー名 +パスワード +<未設定> +アドレスタイプ +IP +NetBIOS +OK +削除すると元に戻せません。よろしいですか? +名前変更 +削除 +実行 +表示設定 +VMCメニュー等で書換えを有効化 +USBゲームのデフラグ状態を常にチェックする +最後にプレイしたゲームを記憶する +セレクト・ボタン +ゲームがデフラグされていません +ゲーム(アプリ)を開始できませんでした +テスト +GUESTでログインする場合は空欄 +読み込み速度の補正 +データ読み込みをシンクロ化 +Syscallの解除 +一部のムービーをスキップ +二層ディスク(DVD9)用設定 +IGRを無効化 +メモリ解放 +ネットワーク機能(DEV9)無効化 +サイズを変更するとVMCはフォーマットされます +VMCファイルを作成 +開始 +変更 +中止 +リセット +簡易VMC作成 +VMC設定 +ファイル名 +サイズ +状態 +進行 +VMCファイル作成済 +VMCファイルのサイズが正しくありません +VMCファイル未作成 +VMC %s でエラーが発生しました。スロット %d のメモリカードを使いますか? +自動リフレッシュ +OPLについて +コーディング +QAテスター +USBプリフィクスパス +IGR後に指定されたカスタムELFを実行します +秒数指定。0で無効化 +自動HDDスピンダウン +画面モード +ダイアログの色 +選択時の色 +インフォページを表示 +インフォ +カスタムELF +表示色設定 +再接続 +全ての共有を表示する場合は空欄 +ETHプリフィクスパス +一文字消去 +スベース +決定 +モード +VMCスロット 1 +VMCスロット 2 +ゲームID +DMAモード +V-Sync +モード 1 +モード 2 +モード 3 +モード 4 +モード 5 +モード 6 +モード 7 +モード 8 +GSM設定 +ETHリンクモード +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex +GSM設定 +GSM有効化 +GSM設定をオン/オフ +画面モード +指定されたモードを常に有効化 +水平調整 +水平方向の表示位置を微調整 +垂直調整 +垂直方向の表示位置を微調整 +FMVスキップ +フルモーションムービーをスキップ +チート設定 +PS2RDチートを有効化 +PS2RDチートをゲーム毎に指定 +PS2RDチートモード +自動/手動チート選択 +自動チート選択 +手動チート選択 +チートファイルを適用できませんでした +チートファイルが見つかりません +デフォルト設定をダウンロード +ネットワークアップデート +設定を再ダウンロードしますか? +アップデートが失敗しました +アップデートサーバに接続できませんでした +アップデート完了 +アップデートは中止されました +ネットワークから設定をダウンロードしますか? +カスタム設定 +デフォルト設定をダウンロード +あと %i 秒で自動的にスタートします +自動スタート +開始までの秒数を指定。0で無効化 +PS2ロゴ +本体リージョンとディスクが一致した場合のみ表示されます +PADEMUの設定 +PADEMUの設定 +PADEMU有効化 +ゲーム毎にPADEMUの有効/無効を指定 +PADEMUモード +モードを選択 +DualShock3 USB +DualShock3 BT +ポート番号: +PADEMUを適用するポートを指定 +ポート毎設定 +ポート毎にPADEMUを適用 +振動の有効化 +ポート毎に振動の有効/無効を指定 +USB BluetoothアダプタのMACアドレス: +DS3コントローラーがペア設定されているMACアドレス: +ペア設定 +DS3コントローラーをペア設定 +BluetoothのMACアドレスを指定してDS3コントローラーをペア設定 +接続されていません +ELFローダーメニュー +ELFローダー 表示モード \ No newline at end of file From d14884989d2a0bc1043745277ba75f757254a945 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 28 Mar 2017 18:47:40 -0700 Subject: [PATCH 041/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Japanese.lng | 50 +++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 8de17a3a7..0e4378a53 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev999 - Jay-Jay-OPL - update lang files - Mon Mar 27 13:48:20 2017 -0700 rev998 - Jay-Jay-OPL - thanks to changes made by Krah we can now adjust itemsList to be centered on main page of OPL in custom themes by using the following decorator property: aligned=1 - Sun Mar 19 20:39:39 2017 -0700 rev997 - Jay-Jay-OPL - update lang files - Fri Mar 10 02:00:30 2017 -0800 rev996 - Jay-Jay-OPL - the following changes were done by Developer SP193: - Sat Mar 4 18:50:40 2017 -0800 diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index e1d191903..f896c6c1f 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,5 +1,5 @@ # Japanese Translation by yamamotonew -# Last update: 03/27/2017 +# Last update: 03/28/2017 # Updated for OPL_983_DB [7f7e9af] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Japanese @@ -25,7 +25,7 @@ ETHゲーム 変更をキャンセルしますか? %d: HDDが接続されていません %d: HDDがフォーマットされていません -%d: ネットワーク設定エラー +%d: ネットワーク開始エラー %d: ネットワークアダプタが接続されていません %d: SMBサーバに接続できません %d: SMBサーバにログインできません @@ -37,10 +37,10 @@ ETHゲーム オン オフ OK -セレクト +選択 キャンセル -○ -☓ +O +X ゲームリスト ゲーム設定 設定を初期化 @@ -56,25 +56,25 @@ OK 自動的に並べ替え 言語設定をロード中にエラーが発生しました デバッグカラーを無効化 -コントローラーが見つかりません。お待ちください +コントローラーが見つかりません。お待ちください… カバーアートを表示 ワイドスクリーン 電源を切る -設定をロードします -設定を保存します +設定をロード中 +設定を保存中 デバイスを開始 リフレッシュ -USBデバイス表示モード -HDDデバイス表示モード -ETHデバイス表示モード -アプリ表示モード +USBデバイス開始モード +HDDデバイス開始モード +ETHデバイス開始モード +アプリメニュー表示モード 自動 手動 HDLサーバを開始 -HDLサーバを開始します +HDLサーバを開始します… HDLサーバは開始しました HDLサーバ開始に失敗しました -HDLサーバを取消 +HDLサーバを取消中… IGRパス 背景色 文字色 @@ -102,10 +102,10 @@ OK 削除 実行 表示設定 -VMCメニュー等で書換えを有効化 -USBゲームのデフラグ状態を常にチェックする +高度なメニューで書換えを有効化 +USBゲームのデフラグを常にチェック 最後にプレイしたゲームを記憶する -セレクト・ボタン +セレクトボタン ゲームがデフラグされていません ゲーム(アプリ)を開始できませんでした テスト @@ -133,7 +133,7 @@ VMC設定 VMCファイル作成済 VMCファイルのサイズが正しくありません VMCファイル未作成 -VMC %s でエラーが発生しました。スロット %d のメモリカードを使いますか? +VMC %s でエラー。スロット %d のメモリカードを使いますか? 自動リフレッシュ OPLについて コーディング @@ -153,11 +153,11 @@ IGR後に指定されたカスタムELFを実行します 全ての共有を表示する場合は空欄 ETHプリフィクスパス 一文字消去 -スベース +スペース 決定 モード -VMCスロット 1 -VMCスロット 2 +VMCスロット1 +VMCスロット2 ゲームID DMAモード V-Sync @@ -197,7 +197,7 @@ PS2RDチートモード チートファイルが見つかりません デフォルト設定をダウンロード ネットワークアップデート -設定を再ダウンロードしますか? +設定を再ダウンロード アップデートが失敗しました アップデートサーバに接続できませんでした アップデート完了 @@ -224,11 +224,11 @@ PADEMUを適用するポートを指定 ポート毎にPADEMUを適用 振動の有効化 ポート毎に振動の有効/無効を指定 -USB BluetoothアダプタのMACアドレス: -DS3コントローラーがペア設定されているMACアドレス: +BluetoothアダプタのMACアドレス: +DS3のペア設定MACアドレス    : ペア設定 DS3コントローラーをペア設定 BluetoothのMACアドレスを指定してDS3コントローラーをペア設定 接続されていません ELFローダーメニュー -ELFローダー 表示モード \ No newline at end of file +ELFローダー表示モード \ No newline at end of file From 479f1a1aa48c3cdfa40ccb6d8b4d2a7e586037a6 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 5 May 2017 00:54:37 -0700 Subject: [PATCH 042/269] update lang file --- DETAILED_CHANGELOG | 1 + lng/lang_Greek.lng | 137 +++++++++++++++++++++++---------------------- 2 files changed, 70 insertions(+), 68 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 0e4378a53..530abb2af 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1000 - Jay-Jay-OPL - update lang files - Tue Mar 28 18:47:40 2017 -0700 rev999 - Jay-Jay-OPL - update lang files - Mon Mar 27 13:48:20 2017 -0700 rev998 - Jay-Jay-OPL - thanks to changes made by Krah we can now adjust itemsList to be centered on main page of OPL in custom themes by using the following decorator property: aligned=1 - Sun Mar 19 20:39:39 2017 -0700 rev997 - Jay-Jay-OPL - update lang files - Fri Mar 10 02:00:30 2017 -0800 diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 273b1713a..c8491cbab 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,5 +1,6 @@ # Greek Translation by RivalK93 -# Last update: 01/25/2017 +# Recommended font: Roboto Condensed +# Last update: 05/05/2017 # Updated for OPL_983_DB [7f7e9af] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Greek @@ -21,8 +22,8 @@ OPL %s Θέμα Γλώσσα Το σύστημα θα απενεργοποιηθεί. -Έξοδος στο Browser/OSDSYS -Ακύρωση ενημέρωσης +Έξοδος στο Browser/OSDSYS; +Ακύρωση ενημέρωσης; %d: Δεν εντοπίστηκε Σκληρός Δίσκος. %d: Ο Σκληρός Δίσκος δεν έχει διαμορφωθεί. %d: Σφάλμα εκκίνησης Δικτύου. @@ -30,21 +31,21 @@ OPL %s %d: Αδυναμία σύνδεσης με τον SMB Server. %d: Αδυναμία login στον SMB Server. %d: Αδυναμία ανοίγματος κοινής χρήσης SMB. -%d: Αδυναμία απαρίθμισης κοινόχρηστων SMB. -%d: Αδυναμία απαρίθμισης παιχνιδιών. +%d: Αδυναμία απαρίθμησης κοινόχρηστων SMB. +%d: Αδυναμία απαρίθμησης παιχνιδιών. %d: Ο DHCP Server δεν είναι διαθέσιμος. %d: Δεν υπάρχει σύνδεση δικτύου. Ναι Όχι OK -Επιλ. +Επιλογή Άκυρο Ο Χ Λίστα Παιχνιδιών Ρυθμίσεις Κατάργηση όλων των ρυθμίσεων -Καταργήθηκαν όλα τα πλήκτρα για το παιχνίδι +Καταργήθηκαν όλα τα πλήκτρα για το παιχνίδι. Scrolling Αργό Κανονικό @@ -67,15 +68,15 @@ Widescreen Εκκίνηση λειτουργίας USB Εκκίνηση λειτουργίας HDD Εκκίνηση λειτουργίας ETH -Εμφάνιση μενού Εφαρμογών +Εκκίνηση μενού Εφαρμογών Αυτόματα -Χειροκίνητα +Μη αυτόματα Εκκίνηση HDL Server Γίνεται εκκίνηση HDL Server... -Λειτουγία HDL Server... +Λειτουργία HDL Server... Αποτυχία εκκίνησης HDL Server. Αποφόρτωση HDL Server... -Θέση IGR +Θέση In-Game-Reset (IGR) Χρώμα στο φόντο Χρώμα γραμματοσειράς - PS2 - @@ -88,7 +89,7 @@ DHCP Μάσκα υποδικτύου Gateway DNS Server -Port +Θύρα Κοινόχρηστο Χρήστης Κωδικός @@ -97,28 +98,28 @@ Port IP NetBIOS Αποδοχή -Το αρχείο θα διαγραφεί οριστικά, συνέχεια +Το αρχείο θα διαγραφεί οριστικά, συνέχεια; Μετ/σία -Διαγρ. +Διαγραφή Εκκίνηση Ρυθμίσεις οθόνης Λειτουργίες εγγραφής Έλεγχος κατακερματισμού USB Απομνημόνευση τελευταίου παιχν. Πλήκτρο επιλογής -Σφάλμα, το παιχνίδι είναι κατακερματισμένο -Σφάλμα, αδυναμία εκκίνησης του αρχείου +Σφάλμα, το παιχνίδι είναι κατακερματισμένο. +Σφάλμα, αδυναμία εκκίνησης του αρχείου. Δοκιμή -Αφήστε το κενό για δικαιώματα GUEST -Ακριβής ανάγνωση -Συγχρονισμένη λειτουργία -Αποκοπή Syscalls -Μετάβαση Βίντεο -Εξομοίωση DVD-DL -Απενεργοποίηση IGR -Μονάδα μνήμης -Απόκρυψη ενότητας DEV9 -Αλλάζοντας το μέγεθος θα αναδιαμορφώστε τη VMC +Αφήστε το κενό για δικαιώματα GUEST. +Ακριβής ανάγνωση. +Συγχρονισμένη λειτουργία ανάγνωσης. +Αποκοπή Syscalls. +Παράλειψη των videos. +Προσομοίωση DVD-DoubleLayer δίσκου. +Απενεργοποίηση In-Game-Reset(IGR). +High Module Storage. +Απόκρυψη του DEV9 module. +Αλλάζοντας το μέγεθος θα αναδιαμορφώστε τη VMC. Δημιουργία Εκκίνηση Τροποποίηση @@ -133,24 +134,24 @@ VMC γενικής χρήσης Το αρχείο VMC υπάρχει ήδη Μη έγκυρο αρχείο VMC, το μέγεθος είναι λάθος Πρέπει να δημιουργηθεί αρχείο VMC -Σφάλμα VMC %s, συνέχεια με την κανονική MC (Κάρτα Μνήμης %d) +Σφάλμα VMC %s, συνέχεια με την κανονική MC (Κάρτα Μνήμης %d) ; Αυτόματη ανανέωση Σχετικά Προγραμματιστές Διασφάλιση ποιότητας Προεπιλεγμένη θέση USB Εκκίνηση συγκεκριμένου ELF μετά το IGR. -Τιμή σε λεπτά, 0 για απενεργοποίηση του spin down -Αυτόματο spin down του HDD +Τιμή σε λεπτά, 0 για απενεργοποίηση του Spin-down. +Αυτόματο Spin-down του HDD Λειτουργία βίντεο Χρώμα μηνυμάτων Χρώμα επιλεγμένου Εμφάνιση σελίδας πληροφοριών -Πληρ. +Πληροφ. Προσαρμοσμένο ELF Επιλογή χρώματος Επανασύνδεση -Αφήστε το κενό για απαρίθμηση κοινόχρηστων +Αφήστε το κενό για απαρίθμηση κοινόχρηστων. Προεπιλεγμένη θέση ETH Σβήσιμο Κενό @@ -177,58 +178,58 @@ Mode 8 10Mbit half-duplex Ρυθμίσεις GSM Ενεργοποίηση GSM -Ενεργοποιεί/απενεργοποιεί το GSM +Ενεργοποιεί/απενεργοποιεί το GSM. VMODE -Αναγκαστική Προσαρμοσμένη λειτουργία οθόνης +Εξαναγκασμένη προσαρμογή λειτουργίας οθόνης. H-POS -Οριζόντια ρύθμιση +Οριζόντια ρύθμιση οθόνης. V-POS -Κάθετη ρύθμιση -Παράληψη FMV -Παράληψη των βίντεο Full Motion +Κάθετη ρύθμιση οθόνης. +Παράλειψη FMV +Παράλειψη των βίντεο Full Motion Ρυθμίσεις Cheats PS2RD Cheat Engine -Patchάρισμα των παιχνιδιών από το PS2RD +Patchάρισμα των παιχνιδιών από το PS2RD. Λειτουργία PS2RD -Αυτόματη επιλογή cheats ή Επιλογή cheats παιχνιδιών +Αυτόματη/Μη αυτόματη επιλογή cheats των παιχνιδιών. Αυτόματη επιλογή cheats -Επιλογή cheats παιχνιδιών +Μη αυτόματη επιλογή cheats Σφάλμα: Αποτυχία φόρτωσης αρχείου Cheat -Δε βρέθηκαν cheats +Δε βρέθηκαν cheats. Λήψη προεπιλεγμένων Ενημέρωση δικτύου -Εκ νέου λήψη υπαρχόντων αρχείων +Εκ νέου λήψη υπαρχόντων αρχείων; Η ενημέρωση απέτυχε. Αποτυχία σύνδεσης σε Server ενημέρωσης. Η ενημέρωση ολοκληρώθηκε. Η ενημέρωση ακυρώθηκε. -Λήψη ρυθμίσεων από το δίκτυο +Λήψη ρυθμίσεων από το δίκτυο; Προσαρμοσμένες ρυθμίσεις -Έγινε λήψη των προεπιλεγμένων -Αυτόματη εκκίνηση σε %i "... +Έγινε λήψη των προεπιλεγμένων. +Αυτόματη εκκίνηση σε %i"... Αυτόματη εκκίνηση Τιμή σε δευτερόλεπτα, 0 για μη αυτόματη εκκίνηση -PS2 Logo -Only displayed for a valid disc logo which matches the console's region -Configure PADEMU -Pad Emulator Settings -Enable Pad Emulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode -Select Pad Emulator mode. +Λογότυπο PS2 +Εμφάνιση μόνο για συμβατά λογότυπα δίσκων που ταιριάζουν με το console region. +Προσομοίωση Χειριστηρίου +Ρυθμίσεις προσομοιωτή Χειριστηρίου +Ενεργοποίηση προσομοιωτή +Ενεργοποιεί/απενεργοποιεί τον προσομοιωτή για το συγκεκριμένο παιχνίδι. +Τύπος προσομοίωσης +Επιλέξτε τον τύπο προσομοίωσης του χειριστηρίου. DualShock3 USB -DualShock3 BT -Settings for port: -Select Pad Emulator port for settings. -Enable emulation -Turns on/off Pad Emulator for selected port. -Enable vibration -Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: -Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. -Not connected -Μενού ELF Loader -Εμφάνιση μενού ELF Loader \ No newline at end of file +DualShock3 BlueTooth +Ρυθμίσεις για θύρα: +Επιλέξτε θύρα προς ρύθμιση. +Ενεργοποίηση προσομοίωσης +Ενεργοποιεί/απενεργοποιεί την προσομοίωση για τη συγκεκριμένη θύρα. +Ενεργοποίηση δόνησης +Ενεργοποιεί/απενεργοποιεί τη δόνηση για τη συγκεκριμένη θύρα. +Διεύθυνση mac του προσαρμογέα BT: +Διεύθυνση mac του χειριστηρίου DS3: +Σύζευξη +Σύζευξη με χειριστήριο DualShock3 +Σύζευξη του προσαρμογέα BlueTooth με το χειριστήριο DualShock3. +Μη συνδεδεμένο +ELF Loader +Εκκίνηση μενού ELF Loader \ No newline at end of file From dbf65977b512589c1860926e628a1278aacff89c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 30 May 2017 13:02:18 -0700 Subject: [PATCH 043/269] drop using CFG-DEV, return using CFG --- DETAILED_CHANGELOG | 1 + include/opl.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 530abb2af..c73dc3496 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1001 - Jay-Jay-OPL - update lang file - Fri May 5 00:54:37 2017 -0700 rev1000 - Jay-Jay-OPL - update lang files - Tue Mar 28 18:47:40 2017 -0700 rev999 - Jay-Jay-OPL - update lang files - Mon Mar 27 13:48:20 2017 -0700 rev998 - Jay-Jay-OPL - thanks to changes made by Krah we can now adjust itemsList to be centered on main page of OPL in custom themes by using the following decorator property: aligned=1 - Sun Mar 19 20:39:39 2017 -0700 diff --git a/include/opl.h b/include/opl.h index 7c2dab46d..e837d1dfa 100644 --- a/include/opl.h +++ b/include/opl.h @@ -38,7 +38,7 @@ // Last Played Auto Start #include -#define OPL_IS_DEV_BUILD 1 //Define if this build is a development build. +//#define OPL_IS_DEV_BUILD 1 //Define if this build is a development build. //IO type IDs #define IO_CUSTOM_SIMPLEACTION 1 // handler for parameter-less actions From 92010fc1590da651eafb7b3ce1eb3094802fb72e Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 30 May 2017 23:03:36 -0700 Subject: [PATCH 044/269] SP193 commit: (ATAD) Fixed Makefile include paths so that the custom atad.h header will be used. Fixed atad.h to have fitting declarations for ata_io_start and ata_device_sector_io. --- DETAILED_CHANGELOG | 1 + modules/hdd/atad/Makefile | 2 +- modules/hdd/common/atad.h | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index c73dc3496..c6afca194 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1002 - Jay-Jay-OPL - drop using CFG-DEV, return using CFG - Tue May 30 13:02:18 2017 -0700 rev1001 - Jay-Jay-OPL - update lang file - Fri May 5 00:54:37 2017 -0700 rev1000 - Jay-Jay-OPL - update lang files - Tue Mar 28 18:47:40 2017 -0700 rev999 - Jay-Jay-OPL - update lang files - Mon Mar 27 13:48:20 2017 -0700 diff --git a/modules/hdd/atad/Makefile b/modules/hdd/atad/Makefile index a6e44fd39..418c1bd8c 100755 --- a/modules/hdd/atad/Makefile +++ b/modules/hdd/atad/Makefile @@ -1,6 +1,6 @@ IOP_BIN = ps2atad.irx -IOP_INCS += +IOP_INCS += -I../common IOP_CFLAGS += -Wall -fno-builtin-printf IOP_LDFLAGS += -s diff --git a/modules/hdd/common/atad.h b/modules/hdd/common/atad.h index ee73d1078..501c493c8 100644 --- a/modules/hdd/common/atad.h +++ b/modules/hdd/common/atad.h @@ -42,7 +42,7 @@ ata_devinfo_t *ata_get_devinfo(int device); int ata_reset_devices(void); #define I_ata_reset_devices DECLARE_IMPORT(5, ata_reset_devices) -int ata_io_start(void *buf, unsigned int blkcount, unsigned short int feature, unsigned short int nsector, unsigned short int sector, unsigned short int lcyl, unsigned short int hcyl, unsigned short int select, unsigned short int command); +int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command); #define I_ata_io_start DECLARE_IMPORT(6, ata_io_start) int ata_io_finish(void); #define I_ata_io_finish DECLARE_IMPORT(7, ata_io_finish) @@ -50,7 +50,7 @@ int ata_io_finish(void); int ata_get_error(void); #define I_ata_get_error DECLARE_IMPORT(8, ata_get_error) -int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir); +int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir); #define I_ata_device_sector_io DECLARE_IMPORT(9, ata_device_sector_io) //DRM functions that were meant to keep users from sharing disks (and hence the contained content). Supported by only Sony-modified HDDs (e.g. the SCPH-20400). From c1935c3c9ba03257d5828c2951f18fe9b14c5f47 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 30 May 2017 23:11:06 -0700 Subject: [PATCH 045/269] small edit to credits. --- DETAILED_CHANGELOG | 1 + src/dialogs.c | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index c6afca194..b89e69dbe 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1003 - Jay-Jay-OPL - SP193 commit: (ATAD) Fixed Makefile include paths so that the custom atad.h header will be used. Fixed atad.h to have fitting declarations for ata_io_start and ata_device_sector_io. - Tue May 30 23:03:36 2017 -0700 rev1002 - Jay-Jay-OPL - drop using CFG-DEV, return using CFG - Tue May 30 13:02:18 2017 -0700 rev1001 - Jay-Jay-OPL - update lang file - Fri May 5 00:54:37 2017 -0700 rev1000 - Jay-Jay-OPL - update lang files - Tue Mar 28 18:47:40 2017 -0700 diff --git a/src/dialogs.c b/src/dialogs.c index 6992f4633..f95b4e67e 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -574,7 +574,7 @@ struct UIItem diaAbout[] = { {UI_BREAK}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"izdubar, Jay-Jay, jimmikaelkael, misfire, Polo35, reprep, SP193, volca", -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"izdubar, Jay-Jay, jimmikaelkael, misfire, Polo35, reprep, SP193, volca,", -1}}}, {UI_BREAK}, {UI_SPACER}, @@ -587,11 +587,11 @@ struct UIItem diaAbout[] = { {UI_BREAK}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"algol, Berion, El_Patas, EP, gledson999, lee4, LocalH, RandQalan", -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"algol, Berion, El_Patas, EP, gledson999, lee4, LocalH, RandQalan,", -1}}}, {UI_BREAK}, {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"ShaolinAssassin, yoshi314 and zero35", -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"ShaolinAssassin, yoshi314, and zero35.", -1}}}, {UI_BREAK}, {UI_SPLITTER}, From 344c625e4ba8cced4018a8e95ba2bc1143efc07a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 23 Jun 2017 22:07:32 -0700 Subject: [PATCH 046/269] belek66 did the following changes: - use module export table to reset ds3 (remove pademu rpc in ee_core) - use thread to read data/set vibration in ds3bt module (can be disabled in Makefile) - emulating analog button (changing pad mode by pressing PS+START buttons) - option to compile pademu modules without using sms_utils (remove -DUSE_SMSUTILS in Makefile) to make them usable in others apps - in gui: saving bt adapter mac address, now pairing DS3 is posible without connected bt adapter --- DETAILED_CHANGELOG | 1 + ee_core/include/ee_core.h | 1 - ee_core/include/igs_api.h | 368 ++++++++++++------------ ee_core/src/iopmgr.c | 5 - ee_core/src/padhook.c | 23 -- modules/debug/udptty-ingame/imports.lst | 2 +- modules/debug/udptty-ingame/udptty.c | 2 +- modules/debug/udptty/imports.lst | 2 +- modules/debug/udptty/udptty.c | 2 +- modules/ds3bt/ee/libds3bt.c | 32 +-- modules/ds3usb/ee/libds3usb.c | 32 +-- modules/mcemu/mcemu.c | 2 +- modules/pademu/Makefile | 4 +- modules/pademu/ds3bt.c | 192 +++++++++++-- modules/pademu/ds3bt.h | 3 +- modules/pademu/ds3usb.c | 76 ++++- modules/pademu/ds3usb.h | 3 +- modules/pademu/exports.tab | 6 + modules/pademu/imports.lst | 50 ++-- modules/pademu/pademu.c | 160 +++++------ modules/pademu/sys_utils.h | 5 + src/gui.c | 20 +- src/httpclient.c | 158 +++++----- src/nbns.c | 78 ++--- src/pad.c | 4 +- 25 files changed, 706 insertions(+), 525 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index b89e69dbe..9ee8a57e7 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1004 - Jay-Jay-OPL - small edit to credits. - Tue May 30 23:11:06 2017 -0700 rev1003 - Jay-Jay-OPL - SP193 commit: (ATAD) Fixed Makefile include paths so that the custom atad.h header will be used. Fixed atad.h to have fitting declarations for ata_io_start and ata_device_sector_io. - Tue May 30 23:03:36 2017 -0700 rev1002 - Jay-Jay-OPL - drop using CFG-DEV, return using CFG - Tue May 30 13:02:18 2017 -0700 rev1001 - Jay-Jay-OPL - update lang file - Fri May 5 00:54:37 2017 -0700 diff --git a/ee_core/include/ee_core.h b/ee_core/include/ee_core.h index 6578a42f7..6539ed52e 100644 --- a/ee_core/include/ee_core.h +++ b/ee_core/include/ee_core.h @@ -80,7 +80,6 @@ int EnableCheatOp; #ifdef PADEMU int EnablePadEmuOp; int PadEmuSettings; -int pademu_reset(); #endif int DisableDebug; diff --git a/ee_core/include/igs_api.h b/ee_core/include/igs_api.h index ed033c0eb..486c932cb 100644 --- a/ee_core/include/igs_api.h +++ b/ee_core/include/igs_api.h @@ -1,184 +1,184 @@ -/* - * PS2 IGS (InGame Screenshot) - * - * Copyright (C) 2010-2014 maximus32 - * Copyright (C) 2014,2015,2016 doctorxyz - * - * This file is part of PS2 IGS Feature. - * - * PS2 IGS Feature is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * PS2 IGS Feature is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with PS2 IGS. If not, see . - * - * $Id$ - */ - -#ifndef _IGSAPI_H_ -#define _IGSAPI_H_ - -#include "fileio.h" -#include "ee_core.h" -#include -#include "iopmgr.h" -#include "modmgr.h" -#include "util.h" -#include -#include - -#define GS_BITBLTBUF 0x50 -#define GS_TRXPOS 0x51 -#define GS_TRXREG 0x52 -#define GS_TRXDIR 0x53 -#define GS_FINISH 0x61 - -//Pixel storage format -#define GS_PSM_CT32 0x00 //32 bits = 4 bytes Example: SLUS_202.73 (Namco Museum 50th Anniversary) -#define GS_PSM_CT24 0x01 //24 bits = 3 bytes Example: SLPS_250.88 (Final Fantasy X International) -#define GS_PSM_CT16 0x02 //16 bits = 2 bytes Example: SLUS_215.56 (Konami Kids Playground: Dinosaurs Shapes & Colors) -#define GS_PSM_CT16S 0x0A //16 bits = 2 bytes Example: SLUS_215.41 (Ratatouille) - -//Channel #1 (VIF1) -#define GS_VIF1_STAT ((volatile u32 *)(0x10003c00)) // VIF Status Register -#define GS_VIF1_STAT_FDR (1 << 23) // VIF1-FIFO transfer direction: VIF1 -> Main memory/SPRAM" -#define GS_VIF1_MSKPATH3(mask) ((u32)(mask) | ((u32)0x06 << 24)) -#define GS_VIF1_NOP 0 -#define GS_VIF1_FLUSHA (((u32)0x13 << 24)) -#define GS_VIF1_DIRECT(count) ((u32)(count) | ((u32)(0x50) << 24)) -#define GS_VIF1_FIFO ((volatile u128 *)(0x10005000)) - -//DMA CH1 REGISTERS (Linked to VIF1) -#define GS_D1_CHCR ((volatile u32 *)(0x10009000)) -#define GS_D1_MADR ((volatile u32 *)(0x10009010)) -#define GS_D1_QWC ((volatile u32 *)(0x10009020)) -#define GS_D1_TADR ((volatile u32 *)(0x10009030)) -#define GS_D1_ASR0 ((volatile u32 *)(0x10009040)) -#define GS_D1_ASR1 ((volatile u32 *)(0x10009050)) - -//Channel #2 (GIF) -#define GS_GIF_AD 0x0e - -#define GS_GIFTAG(NLOOP, EOP, PRE, PRIM, FLG, NREG) \ - ((u64)(NLOOP) << 0) | \ - ((u64)(EOP) << 15) | \ - ((u64)(PRE) << 46) | \ - ((u64)(PRIM) << 47) | \ - ((u64)(FLG) << 58) | \ - ((u64)(NREG) << 60) - -//GS Registers -#define GS_GSBITBLTBUF_SET(sbp, sbw, spsm, dbp, dbw, dpsm) \ - ((u64)(sbp) | ((u64)(sbw) << 16) | \ - ((u64)(spsm) << 24) | ((u64)(dbp) << 32) | \ - ((u64)(dbw) << 48) | ((u64)(dpsm) << 56)) - -#define GS_GSTRXREG_SET(rrw, rrh) \ - ((u64)(rrw) | ((u64)(rrh) << 32)) - -#define GS_GSTRXPOS_SET(ssax, ssay, dsax, dsay, dir) \ - ((u64)(ssax) | ((u64)(ssay) << 16) | \ - ((u64)(dsax) << 32) | ((u64)(dsay) << 48) | \ - ((u64)(dir) << 59)) - -#define GS_GSTRXDIR_SET(xdr) ((u64)(xdr)) - -#define GS_GSBITBLTBUF 0x50 -#define GS_GSFINISH 0x61 -#define GS_GSTRXPOS 0x51 -#define GS_GSTRXREG 0x52 -#define GS_GSTRXDIR 0x53 - -//GS Priviledge Registers -#define GS_CSR_FINISH (1 << 1) -#define GS_CSR (volatile u64 *)0x12001000 // GS CSR (GS System Status) Register -#define GS_IMR (volatile u64 *)0x12001010 // GS IMR (GS Interrupt Mask) Register -#define GS_BUSDIR (volatile u64 *)0x12001040 // GS BUSDIR (GS Bus Direction) Register - -#define GET_PMODE_EN1(x) (u8)((x >> 0) & 0x1) -#define GET_PMODE_EN2(x) (u8)((x >> 1) & 0x1) -#define GET_SMODE2_INT(x) (u8)((x >> 0) & 0x1) -#define GET_SMODE2_FFMD(x) (u8)((x >> 1) & 0x1) -#define GET_SMODE2_DPMS(x) (u8)((x >> 2) & 0x3) -#define GET_SMODE2_INTFFMD(x) (u8)((x >> 0) & 0x3) -#define GET_DISPFB_FBP(x) (u16)((x >> 0) & 0x1FF) -#define GET_DISPFB_FBW(x) (u8)((x >> 9) & 0x3F) -#define GET_DISPFB_PSM(x) (u8)((x >> 15) & 0x1F) -#define GET_DISPFB_DBX(x) (u16)((x >> 32) & 0x7FF) -#define GET_DISPFB_DBY(x) (u16)((x >> 43) & 0x7FF) -#define GET_DISPLAY_DH(x) (u16)((x >> 44) & 0x7FF) - -#define GS_WRITEBACK_DCACHE 0 - -//GSM Stuff -struct GSMSourceSetGsCrt -{ - unsigned int interlace; - unsigned int mode; - unsigned int ffmd; -}; - -struct GSMSourceGSRegs -{ - u64 pmode; - u64 smode1; - u64 smode2; - u64 srfsh; - u64 synch1; - u64 synch2; - u64 syncv; - u64 dispfb1; - u64 display1; - u64 dispfb2; - u64 display2; -}; - -extern struct GSMSourceSetGsCrt GSMSourceSetGsCrt; -extern struct GSMSourceGSRegs GSMSourceGSRegs; - -// BMP File Structure and example -// https://www.siggraph.org/education/materials/HyperVis/asp_data/compimag/bmpfile.htm -// http://paulbourke.net/dataformats/bmp/ -// http://atlc.sourceforge.net/bmp.html -// Example: 24bit 16 x 8 An ordinay Logo (An Yellow "M" Word Surrounded by Red) - -typedef struct -{ - /* 42 4D = "BM" */ - u32 filesize; /* B6 01 00 00 = 438 bytes = 384 bytes (image) + 54 bytes (header) */ - u32 reserved; /* 00 00 00 00 */ - u32 headersize; /* 36 00 00 00 = 54 bytes */ - u32 infoSize; /* 28 00 00 00 = 40 bytes = 54 bytes (header size) - 14 bytes */ - u32 width; /* 10 00 00 00 = 16 pixels */ - u32 depth; /* 08 00 00 00 = 8 pixels */ - u16 biPlanes; /* 01 00 = 1 (for 24 bit images) */ - u16 bits; /* 18 00 = 24 (for 24 bit images) */ - u32 biCompression; /* 00 00 00 00 = 0 (no compression) */ - u32 biSizeImage; /* 80 01 00 00 = Image Size = width x (bits/8) x height = 16 x 8 x 3 = 384 bytes */ - u32 biXPelsPerMeter; /* 00 00 00 00 */ - u32 biYPelsPerMeter; /* 00 00 00 00 */ - u32 biClrUsed; /* 00 00 00 00 */ - u32 biClrImportant; /* 00 00 00 00 */ -} BmpHeader; -/* Image example */ -/* 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED */ -/* 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED */ -/* 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED */ -/* 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED */ -/* 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED */ -/* 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 24 1C ED 00 F2 FF 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED */ -/* 24 1C ED 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED 24 1C ED */ -/* 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED */ - -#define _IGS_ENGINE_ __attribute__((section(".igs_engine"))) - -int InGameScreenshot(void) _IGS_ENGINE_; - -#endif /* _IGSAPI_H_ */ +/* + * PS2 IGS (InGame Screenshot) + * + * Copyright (C) 2010-2014 maximus32 + * Copyright (C) 2014,2015,2016 doctorxyz + * + * This file is part of PS2 IGS Feature. + * + * PS2 IGS Feature is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PS2 IGS Feature is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PS2 IGS. If not, see . + * + * $Id$ + */ + +#ifndef _IGSAPI_H_ +#define _IGSAPI_H_ + +#include "fileio.h" +#include "ee_core.h" +#include +#include "iopmgr.h" +#include "modmgr.h" +#include "util.h" +#include +#include + +#define GS_BITBLTBUF 0x50 +#define GS_TRXPOS 0x51 +#define GS_TRXREG 0x52 +#define GS_TRXDIR 0x53 +#define GS_FINISH 0x61 + +//Pixel storage format +#define GS_PSM_CT32 0x00 //32 bits = 4 bytes Example: SLUS_202.73 (Namco Museum 50th Anniversary) +#define GS_PSM_CT24 0x01 //24 bits = 3 bytes Example: SLPS_250.88 (Final Fantasy X International) +#define GS_PSM_CT16 0x02 //16 bits = 2 bytes Example: SLUS_215.56 (Konami Kids Playground: Dinosaurs Shapes & Colors) +#define GS_PSM_CT16S 0x0A //16 bits = 2 bytes Example: SLUS_215.41 (Ratatouille) + +//Channel #1 (VIF1) +#define GS_VIF1_STAT ((volatile u32 *)(0x10003c00)) // VIF Status Register +#define GS_VIF1_STAT_FDR (1 << 23) // VIF1-FIFO transfer direction: VIF1 -> Main memory/SPRAM" +#define GS_VIF1_MSKPATH3(mask) ((u32)(mask) | ((u32)0x06 << 24)) +#define GS_VIF1_NOP 0 +#define GS_VIF1_FLUSHA (((u32)0x13 << 24)) +#define GS_VIF1_DIRECT(count) ((u32)(count) | ((u32)(0x50) << 24)) +#define GS_VIF1_FIFO ((volatile u128 *)(0x10005000)) + +//DMA CH1 REGISTERS (Linked to VIF1) +#define GS_D1_CHCR ((volatile u32 *)(0x10009000)) +#define GS_D1_MADR ((volatile u32 *)(0x10009010)) +#define GS_D1_QWC ((volatile u32 *)(0x10009020)) +#define GS_D1_TADR ((volatile u32 *)(0x10009030)) +#define GS_D1_ASR0 ((volatile u32 *)(0x10009040)) +#define GS_D1_ASR1 ((volatile u32 *)(0x10009050)) + +//Channel #2 (GIF) +#define GS_GIF_AD 0x0e + +#define GS_GIFTAG(NLOOP, EOP, PRE, PRIM, FLG, NREG) \ + ((u64)(NLOOP) << 0) | \ + ((u64)(EOP) << 15) | \ + ((u64)(PRE) << 46) | \ + ((u64)(PRIM) << 47) | \ + ((u64)(FLG) << 58) | \ + ((u64)(NREG) << 60) + +//GS Registers +#define GS_GSBITBLTBUF_SET(sbp, sbw, spsm, dbp, dbw, dpsm) \ + ((u64)(sbp) | ((u64)(sbw) << 16) | \ + ((u64)(spsm) << 24) | ((u64)(dbp) << 32) | \ + ((u64)(dbw) << 48) | ((u64)(dpsm) << 56)) + +#define GS_GSTRXREG_SET(rrw, rrh) \ + ((u64)(rrw) | ((u64)(rrh) << 32)) + +#define GS_GSTRXPOS_SET(ssax, ssay, dsax, dsay, dir) \ + ((u64)(ssax) | ((u64)(ssay) << 16) | \ + ((u64)(dsax) << 32) | ((u64)(dsay) << 48) | \ + ((u64)(dir) << 59)) + +#define GS_GSTRXDIR_SET(xdr) ((u64)(xdr)) + +#define GS_GSBITBLTBUF 0x50 +#define GS_GSFINISH 0x61 +#define GS_GSTRXPOS 0x51 +#define GS_GSTRXREG 0x52 +#define GS_GSTRXDIR 0x53 + +//GS Priviledge Registers +#define GS_CSR_FINISH (1 << 1) +#define GS_CSR (volatile u64 *)0x12001000 // GS CSR (GS System Status) Register +#define GS_IMR (volatile u64 *)0x12001010 // GS IMR (GS Interrupt Mask) Register +#define GS_BUSDIR (volatile u64 *)0x12001040 // GS BUSDIR (GS Bus Direction) Register + +#define GET_PMODE_EN1(x) (u8)((x >> 0) & 0x1) +#define GET_PMODE_EN2(x) (u8)((x >> 1) & 0x1) +#define GET_SMODE2_INT(x) (u8)((x >> 0) & 0x1) +#define GET_SMODE2_FFMD(x) (u8)((x >> 1) & 0x1) +#define GET_SMODE2_DPMS(x) (u8)((x >> 2) & 0x3) +#define GET_SMODE2_INTFFMD(x) (u8)((x >> 0) & 0x3) +#define GET_DISPFB_FBP(x) (u16)((x >> 0) & 0x1FF) +#define GET_DISPFB_FBW(x) (u8)((x >> 9) & 0x3F) +#define GET_DISPFB_PSM(x) (u8)((x >> 15) & 0x1F) +#define GET_DISPFB_DBX(x) (u16)((x >> 32) & 0x7FF) +#define GET_DISPFB_DBY(x) (u16)((x >> 43) & 0x7FF) +#define GET_DISPLAY_DH(x) (u16)((x >> 44) & 0x7FF) + +#define GS_WRITEBACK_DCACHE 0 + +//GSM Stuff +struct GSMSourceSetGsCrt +{ + unsigned int interlace; + unsigned int mode; + unsigned int ffmd; +}; + +struct GSMSourceGSRegs +{ + u64 pmode; + u64 smode1; + u64 smode2; + u64 srfsh; + u64 synch1; + u64 synch2; + u64 syncv; + u64 dispfb1; + u64 display1; + u64 dispfb2; + u64 display2; +}; + +extern struct GSMSourceSetGsCrt GSMSourceSetGsCrt; +extern struct GSMSourceGSRegs GSMSourceGSRegs; + +// BMP File Structure and example +// https://www.siggraph.org/education/materials/HyperVis/asp_data/compimag/bmpfile.htm +// http://paulbourke.net/dataformats/bmp/ +// http://atlc.sourceforge.net/bmp.html +// Example: 24bit 16 x 8 An ordinay Logo (An Yellow "M" Word Surrounded by Red) + +typedef struct +{ + /* 42 4D = "BM" */ + u32 filesize; /* B6 01 00 00 = 438 bytes = 384 bytes (image) + 54 bytes (header) */ + u32 reserved; /* 00 00 00 00 */ + u32 headersize; /* 36 00 00 00 = 54 bytes */ + u32 infoSize; /* 28 00 00 00 = 40 bytes = 54 bytes (header size) - 14 bytes */ + u32 width; /* 10 00 00 00 = 16 pixels */ + u32 depth; /* 08 00 00 00 = 8 pixels */ + u16 biPlanes; /* 01 00 = 1 (for 24 bit images) */ + u16 bits; /* 18 00 = 24 (for 24 bit images) */ + u32 biCompression; /* 00 00 00 00 = 0 (no compression) */ + u32 biSizeImage; /* 80 01 00 00 = Image Size = width x (bits/8) x height = 16 x 8 x 3 = 384 bytes */ + u32 biXPelsPerMeter; /* 00 00 00 00 */ + u32 biYPelsPerMeter; /* 00 00 00 00 */ + u32 biClrUsed; /* 00 00 00 00 */ + u32 biClrImportant; /* 00 00 00 00 */ +} BmpHeader; +/* Image example */ +/* 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED */ +/* 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED */ +/* 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED */ +/* 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED */ +/* 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 24 1C ED 24 1C ED */ +/* 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 24 1C ED 00 F2 FF 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED */ +/* 24 1C ED 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED 24 1C ED 24 1C ED 00 F2 FF 00 F2 FF 24 1C ED 24 1C ED 24 1C ED */ +/* 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED 24 1C ED */ + +#define _IGS_ENGINE_ __attribute__((section(".igs_engine"))) + +int InGameScreenshot(void) _IGS_ENGINE_; + +#endif /* _IGSAPI_H_ */ diff --git a/ee_core/src/iopmgr.c b/ee_core/src/iopmgr.c index 8d9c2e383..66e719ddd 100644 --- a/ee_core/src/iopmgr.c +++ b/ee_core/src/iopmgr.c @@ -121,11 +121,6 @@ int New_Reset_Iop(const char *arg, int arglen) iop_reboot_count++; -#ifdef PADEMU - if (iop_reboot_count >= 3 && EnablePadEmuOp) { - pademu_reset(); - } -#endif // Reseting IOP. while (!Reset_Iop(NULL, 0)) { ; diff --git a/ee_core/src/padhook.c b/ee_core/src/padhook.c index 2c9a01496..edb95fa7c 100644 --- a/ee_core/src/padhook.c +++ b/ee_core/src/padhook.c @@ -183,10 +183,6 @@ static void IGR_Thread(void *arg) if (!DisableDebug) GS_BGCOLOUR = 0xFFFFFF; // White -#ifdef PADEMU - if (EnablePadEmuOp) - pademu_reset(); -#endif // Re-Init RPC & CMD SifInitRpc(0); @@ -628,23 +624,4 @@ int Install_PadOpen_Hook(u32 mem_start, u32 mem_end, int mode) return patched; } -#ifdef PADEMU - -#define PADEMU_RESET 1 -#define PADEMU_BIND_RPC_ID 0x18E3878D - -static SifRpcClientData_t pademu; - -int pademu_reset() -{ - pademu.server = NULL; - - do { - if (SifBindRpc(&pademu, PADEMU_BIND_RPC_ID, 0) < 0) - return -1; - nopdelay(); - } while (!pademu.server); - return SifCallRpc(&pademu, PADEMU_RESET, 0, NULL, 0, NULL, 0, NULL, NULL); -} -#endif diff --git a/modules/debug/udptty-ingame/imports.lst b/modules/debug/udptty-ingame/imports.lst index 2245cb4e7..307a66b25 100755 --- a/modules/debug/udptty-ingame/imports.lst +++ b/modules/debug/udptty-ingame/imports.lst @@ -36,7 +36,7 @@ I_strncmp sysclib_IMPORTS_end sysmem_IMPORTS_start -I_Kprintf_set +I_KprintfSet sysmem_IMPORTS_end ps2ip_IMPORTS_start diff --git a/modules/debug/udptty-ingame/udptty.c b/modules/debug/udptty-ingame/udptty.c index 719ae9233..00967f208 100644 --- a/modules/debug/udptty-ingame/udptty.c +++ b/modules/debug/udptty-ingame/udptty.c @@ -181,7 +181,7 @@ void kprtty_init(void) thid = CreateThread(&thp); StartThread(thid, (void *)kpa); - Kprintf_set((kprintf_handler_func_t *)Kprintf_Handler, (u32)kpa); + KprintfSet((KprintfHandler_t *)Kprintf_Handler, (u32*)kpa); } #endif diff --git a/modules/debug/udptty/imports.lst b/modules/debug/udptty/imports.lst index 2245cb4e7..307a66b25 100755 --- a/modules/debug/udptty/imports.lst +++ b/modules/debug/udptty/imports.lst @@ -36,7 +36,7 @@ I_strncmp sysclib_IMPORTS_end sysmem_IMPORTS_start -I_Kprintf_set +I_KprintfSet sysmem_IMPORTS_end ps2ip_IMPORTS_start diff --git a/modules/debug/udptty/udptty.c b/modules/debug/udptty/udptty.c index 0881bdd3d..12f0e8a9b 100644 --- a/modules/debug/udptty/udptty.c +++ b/modules/debug/udptty/udptty.c @@ -181,7 +181,7 @@ void kprtty_init(void) thid = CreateThread(&thp); StartThread(thid, (void *)kpa); - Kprintf_set((kprintf_handler_func_t *)Kprintf_Handler, (u32)kpa); + KprintfSet((KprintfHandler_t *)Kprintf_Handler, (u32*)kpa); } #endif diff --git a/modules/ds3bt/ee/libds3bt.c b/modules/ds3bt/ee/libds3bt.c index 20f2b1b2c..98c63c7ba 100644 --- a/modules/ds3bt/ee/libds3bt.c +++ b/modules/ds3bt/ee/libds3bt.c @@ -25,7 +25,7 @@ int ds3bt_init() do { if (SifBindRpc(&ds3bt, DS3BT_BIND_RPC_ID, 0) < 0) - return -1; + return 0; nopdelay(); } while (!ds3bt.server); @@ -38,24 +38,24 @@ int ds3bt_init() int ds3bt_reinit_ports(u8 ports) { if (!ds3bt_inited) - return -1; + return 0; rpcbuf[0] = ports; - return SifCallRpc(&ds3bt, DS3BT_INIT, 0, rpcbuf, 1, NULL, 0, NULL, NULL); + return (SifCallRpc(&ds3bt, DS3BT_INIT, 0, rpcbuf, 1, NULL, 0, NULL, NULL) == 0); } int ds3bt_init_charging() { if (!ds3bt_inited) - return -1; + return 0; - return SifCallRpc(&ds3bt, DS3BT_INIT_CHARGING, 0, NULL, 0, NULL, 0, NULL, NULL); + return (SifCallRpc(&ds3bt, DS3BT_INIT_CHARGING, 0, NULL, 0, NULL, 0, NULL, NULL) == 0); } int ds3bt_get_status(int port) { if (!ds3bt_inited) - return -1; + return 0; rpcbuf[0] = port; @@ -69,9 +69,9 @@ int ds3bt_get_bdaddr(u8 *bdaddr) int i, ret; if (!ds3bt_inited) - return -1; + return 0; - ret = SifCallRpc(&ds3bt, DS3BT_GET_BDADDR, 0, NULL, 0, rpcbuf, 6, NULL, NULL); + ret = (SifCallRpc(&ds3bt, DS3BT_GET_BDADDR, 0, NULL, 0, rpcbuf, 6, NULL, NULL) == 0); for (i = 0; i < 6; i++) bdaddr[i] = rpcbuf[i]; @@ -82,24 +82,24 @@ int ds3bt_get_bdaddr(u8 *bdaddr) int ds3bt_set_rumble(int port, u8 lrum, u8 rrum) { if (!ds3bt_inited) - return -1; + return 0; rpcbuf[0] = port; rpcbuf[1] = lrum; rpcbuf[2] = rrum; - return SifCallRpc(&ds3bt, DS3BT_SET_RUMBLE, 0, rpcbuf, 3, NULL, 0, NULL, NULL); + return (SifCallRpc(&ds3bt, DS3BT_SET_RUMBLE, 0, rpcbuf, 3, NULL, 0, NULL, NULL) == 0); } int ds3bt_set_led(int port, u8 led) { if (!ds3bt_inited) - return -1; + return 0; rpcbuf[0] = port; rpcbuf[1] = led; - return SifCallRpc(&ds3bt, DS3BT_SET_LED, 0, rpcbuf, 2, NULL, 0, NULL, NULL); + return (SifCallRpc(&ds3bt, DS3BT_SET_LED, 0, rpcbuf, 2, NULL, 0, NULL, NULL) == 0); } int ds3bt_get_data(int port, u8 *data) @@ -107,11 +107,11 @@ int ds3bt_get_data(int port, u8 *data) int ret; if (!ds3bt_inited) - return -1; + return 0; rpcbuf[0] = port; - ret = SifCallRpc(&ds3bt, DS3BT_GET_DATA, 0, rpcbuf, 1, rpcbuf, 18, NULL, NULL); + ret = (SifCallRpc(&ds3bt, DS3BT_GET_DATA, 0, rpcbuf, 1, rpcbuf, 18, NULL, NULL) == 0); memcpy(data, rpcbuf, 18); @@ -121,7 +121,7 @@ int ds3bt_get_data(int port, u8 *data) int ds3bt_reset() { if (!ds3bt_inited) - return -1; + return 0; - return SifCallRpc(&ds3bt, DS3BT_RESET, 0, NULL, 0, NULL, 0, NULL, NULL); + return (SifCallRpc(&ds3bt, DS3BT_RESET, 0, NULL, 0, NULL, 0, NULL, NULL) == 0); } diff --git a/modules/ds3usb/ee/libds3usb.c b/modules/ds3usb/ee/libds3usb.c index a44b7130b..c016e2c10 100644 --- a/modules/ds3usb/ee/libds3usb.c +++ b/modules/ds3usb/ee/libds3usb.c @@ -25,7 +25,7 @@ int ds3usb_init() do { if (SifBindRpc(&ds3usb, DS3USB_BIND_RPC_ID, 0) < 0) - return -1; + return 0; nopdelay(); } while (!ds3usb.server); @@ -38,16 +38,16 @@ int ds3usb_init() int ds3usb_reinit_ports(u8 ports) { if (!ds3usb_inited) - return -1; + return 0; rpcbuf[0] = ports; - return SifCallRpc(&ds3usb, DS3USB_INIT, 0, rpcbuf, 1, NULL, 0, NULL, NULL); + return (SifCallRpc(&ds3usb, DS3USB_INIT, 0, rpcbuf, 1, NULL, 0, NULL, NULL) == 0); } int ds3usb_get_status(int port) { if (!ds3usb_inited) - return -1; + return 0; rpcbuf[0] = port; @@ -61,11 +61,11 @@ int ds3usb_get_bdaddr(int port, u8 *bdaddr) int i, ret; if (!ds3usb_inited) - return -1; + return 0; rpcbuf[0] = port; - ret = SifCallRpc(&ds3usb, DS3USB_GET_BDADDR, 0, rpcbuf, 1, rpcbuf, 6, NULL, NULL); + ret = (SifCallRpc(&ds3usb, DS3USB_GET_BDADDR, 0, rpcbuf, 1, rpcbuf, 6, NULL, NULL) == 0); for (i = 0; i < 6; i++) bdaddr[i] = rpcbuf[i]; @@ -78,37 +78,37 @@ int ds3usb_set_bdaddr(int port, u8 *bdaddr) int i; if (!ds3usb_inited) - return -1; + return 0; rpcbuf[0] = port; for (i = 0; i < 6; i++) rpcbuf[i + 1] = bdaddr[i]; - return SifCallRpc(&ds3usb, DS3USB_SET_BDADDR, 0, rpcbuf, 7, NULL, 0, NULL, NULL); + return (SifCallRpc(&ds3usb, DS3USB_SET_BDADDR, 0, rpcbuf, 7, NULL, 0, NULL, NULL) == 0); } int ds3usb_set_rumble(int port, u8 lrum, u8 rrum) { if (!ds3usb_inited) - return -1; + return 0; rpcbuf[0] = port; rpcbuf[1] = lrum; rpcbuf[2] = rrum; - return SifCallRpc(&ds3usb, DS3USB_SET_RUMBLE, 0, rpcbuf, 3, NULL, 0, NULL, NULL); + return (SifCallRpc(&ds3usb, DS3USB_SET_RUMBLE, 0, rpcbuf, 3, NULL, 0, NULL, NULL) == 0); } int ds3usb_set_led(int port, u8 led) { if (!ds3usb_inited) - return -1; + return 0; rpcbuf[0] = port; rpcbuf[1] = led; - return SifCallRpc(&ds3usb, DS3USB_SET_LED, 0, rpcbuf, 2, NULL, 0, NULL, NULL); + return (SifCallRpc(&ds3usb, DS3USB_SET_LED, 0, rpcbuf, 2, NULL, 0, NULL, NULL) == 0); } int ds3usb_get_data(int port, u8 *data) @@ -116,11 +116,11 @@ int ds3usb_get_data(int port, u8 *data) int ret; if (!ds3usb_inited) - return -1; + return 0; rpcbuf[0] = port; - ret = SifCallRpc(&ds3usb, DS3USB_GET_DATA, 0, rpcbuf, 1, rpcbuf, 18, NULL, NULL); + ret = (SifCallRpc(&ds3usb, DS3USB_GET_DATA, 0, rpcbuf, 1, rpcbuf, 18, NULL, NULL) == 0); memcpy(data, rpcbuf, 18); @@ -130,7 +130,7 @@ int ds3usb_get_data(int port, u8 *data) int ds3usb_reset() { if (!ds3usb_inited) - return -1; + return 0; - return SifCallRpc(&ds3usb, DS3USB_RESET, 0, NULL, 0, NULL, 0, NULL, NULL); + return (SifCallRpc(&ds3usb, DS3USB_RESET, 0, NULL, 0, NULL, 0, NULL, NULL) == 0); } diff --git a/modules/mcemu/mcemu.c b/modules/mcemu/mcemu.c index 7241d3cca..74b373dff 100644 --- a/modules/mcemu/mcemu.c +++ b/modules/mcemu/mcemu.c @@ -89,7 +89,7 @@ void StartNow(void *param) #ifdef PADEMU exp = GetExportTable("pademu", 0x101); if (exp != NULL) { - pademu_hookSio2man = GetExportEntry(exp, 0); + pademu_hookSio2man = GetExportEntry(exp, 4); } else { pademu_hookSio2man = no_pademu; } diff --git a/modules/pademu/Makefile b/modules/pademu/Makefile index ecb89e290..cd95782f4 100644 --- a/modules/pademu/Makefile +++ b/modules/pademu/Makefile @@ -8,14 +8,14 @@ IOP_OBJS += ds3usb.o endif ifeq ($(USE_BT),1) IOP_BIN = bt_pademu.irx -IOP_CFLAGS += -DBT +IOP_CFLAGS += -DBT -DUSE_THREAD IOP_OBJNAME = bt. IOP_OBJS += ds3bt.o endif IOP_OBJS := $(IOP_OBJS:%=$(IOP_OBJNAME)%) -IOP_CFLAGS += -Wall -fno-builtin +IOP_CFLAGS += -Wall -fno-builtin -DUSE_SMSUTILS IOP_LDFLAGS += -s all: $(IOP_BIN) diff --git a/modules/pademu/ds3bt.c b/modules/pademu/ds3bt.c index 3e8182a64..e9ce0dd32 100644 --- a/modules/pademu/ds3bt.c +++ b/modules/pademu/ds3bt.c @@ -310,6 +310,19 @@ static uint8_t output_01_report[] = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static uint8_t led_patterns[][2] = +{ + { 0x1C, 0x02 }, + { 0x1A, 0x04 }, + { 0x16, 0x08 }, + { 0x0E, 0x10 }, +}; + +static uint8_t power_level[] = +{ + 0x00, 0x02, 0x06, 0x0E, 0x1E +}; + // Taken from nefarius' SCPToolkit // https://github.com/nefarius/ScpToolkit/blob/master/ScpControl/ScpControl.ini // Valid MAC addresses used by Sony @@ -443,6 +456,7 @@ typedef struct uint8_t enabled; uint8_t type; uint8_t data[18]; + uint8_t analog_btn; } ds3bt_pad_t; #define MAX_PADS 2 @@ -473,6 +487,7 @@ static void DS3BT_init() mips_memset(&ds3pad[i].data[2], 0x7F, 4); mips_memset(&ds3pad[i].data[6], 0x00, 12); + ds3pad[i].analog_btn = 0; } hci_counter_ = 10; @@ -555,8 +570,8 @@ static uint8_t HCI_event_task(int result) pad = current_pad; if (!result) { - /* buf[0] = Event Code */ - /* buf[1] = Parameter Total Length */ + /* buf[0] = Event Code */ + /* buf[1] = Parameter Total Length */ /* buf[n] = Event Parameters based on each event */ DPRINTF("HCI event = 0x%x\n", hci_buf[0]); switch (hci_buf[0]) { // switch on event type @@ -813,7 +828,7 @@ static void HCI_task(uint8_t pad) } /************************************************************/ -/* HCI Commands */ +/* HCI Commands */ /************************************************************/ static uint8_t hci_reset() @@ -1090,7 +1105,7 @@ static void L2CAP_task(uint8_t pad) } /************************************************************/ -/* L2CAP Commands */ +/* L2CAP Commands */ /************************************************************/ static uint8_t l2cap_connect_response(uint8_t rxid, uint16_t dcid, uint16_t scid, uint8_t pad) { @@ -1184,7 +1199,7 @@ static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) } /************************************************************/ -/* HID Commands */ +/* HID Commands */ /************************************************************/ static uint8_t initPSController(int pad) @@ -1234,6 +1249,8 @@ static void readReport(uint8_t *data, int bytes, int pad) ds3pad[pad].data[15] = ((data[DATA_START + ButtonStateH] >> 3) & 1) * 255; //R1 ds3pad[pad].data[16] = ((data[DATA_START + ButtonStateH] >> 0) & 1) * 255; //L2 ds3pad[pad].data[17] = ((data[DATA_START + ButtonStateH] >> 1) & 1) * 255; //R2 + + data[DATA_START + Power] = 0x05; } else { ds3pad[pad].data[6] = data[DATA_START + PressureRight]; //right ds3pad[pad].data[7] = data[DATA_START + PressureLeft]; //left @@ -1249,17 +1266,26 @@ static void readReport(uint8_t *data, int bytes, int pad) ds3pad[pad].data[15] = data[DATA_START + PressureR1]; //R1 ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 - - if (data[DATA_START + PSButtonState]) //display battery level - ds3pad[pad].oldled = ~(1 << data[DATA_START + Power]) & 0x1E; - else - ds3pad[pad].oldled = (pad + 1) << 1; - - if (data[DATA_START + Power] == 0xEE) //charging - ds3pad[pad].oldled |= 0x80; - else - ds3pad[pad].oldled &= 0x7F; } + + if (data[DATA_START + PSButtonState]) { //display battery level + if(data[DATA_START + ButtonStateL] == 0x01) { //PS + SELECT + if(ds3pad[pad].analog_btn < 2) //unlocked mode + ds3pad[pad].analog_btn = !ds3pad[pad].analog_btn; + + ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; + } + else if(data[DATA_START + Power] != 0xEE) + ds3pad[pad].oldled = power_level[data[DATA_START + Power] - 1]; + } + else + ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; + + if (data[DATA_START + Power] == 0xEE) //charging + ds3pad[pad].oldled |= 0x80; + else + ds3pad[pad].oldled &= 0x7F; + } else { DPRINTF("Unmanaged Input Report: THDR 0x%x ", data[8]); DPRINTF(" ID 0x%x\n", data[9]); @@ -1294,6 +1320,11 @@ static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) mips_memcpy(&led_buf[2], output_01_report, sizeof(output_01_report)); // PS3_01_REPORT_LEN); + if (ds3pad[pad].type == 0xA2) { + if(rrum < 5) + rrum = 0; + } + led_buf[2 + 1] = 0xFE; //rt led_buf[2 + 2] = rrum; //rp led_buf[2 + 3] = 0xFE; //lt @@ -1316,7 +1347,7 @@ static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) return writeReport((uint8_t *)led_buf, sizeof(output_01_report) /*PS3_01_REPORT_LEN*/ + 2, pad); } /************************************************************/ -/* DS3BT Commands */ +/* DS3BT Commands */ /************************************************************/ static uint8_t LED(uint8_t led, int pad) @@ -1337,11 +1368,75 @@ static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad) return ret; } +#ifdef USE_THREAD +static uint8_t update_rum = 0, update_lrum = 0, update_rrum = 0; +static int update_port, update_thread_id, update_sema; + void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port) { - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) - return; + WaitSema(update_sema); + + update_rum = 1; + update_lrum = lrum; + update_rrum = rrum; + + SignalSema(update_sema); +} + +int ds3bt_get_data(char *dst, int size, int port) +{ + int ret; + + WaitSema(update_sema); + + mips_memcpy(dst, ds3pad[port].data, size); + update_port = port; + ret = ds3pad[port].analog_btn & 1; + + WakeupThread(update_thread_id); + + return ret; +} + +void ds3bt_set_mode(int mode, int lock, int port) +{ + WaitSema(update_sema); + + if (lock == 3) + ds3pad[port].analog_btn = 3; + else + ds3pad[port].analog_btn = mode; + + SignalSema(update_sema); +} + +static void update_thread(void *param) +{ + while(1) + { + SleepThread(); + + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + if (update_rum) { + Rumble(update_lrum, update_rrum, update_port); + update_rum = 0; + } + + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)update_port); + + WaitSema(bt_dev.l2cap_sema); + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); + + SignalSema(update_sema); + } +} +#else +void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port) +{ WaitSema(bt_dev.hci_sema); WaitSema(bt_dev.l2cap_sema); @@ -1351,10 +1446,9 @@ void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port) SignalSema(bt_dev.l2cap_sema); } -void ds3bt_get_data(char *dst, int size, int port) +int ds3bt_get_data(char *dst, int size, int port) { - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) - return; + int ret; WaitSema(bt_dev.hci_sema); WaitSema(bt_dev.l2cap_sema); @@ -1364,11 +1458,28 @@ void ds3bt_get_data(char *dst, int size, int port) WaitSema(bt_dev.l2cap_sema); mips_memcpy(dst, ds3pad[port].data, size); + ret = ds3pad[port].analog_btn & 1; SignalSema(bt_dev.hci_sema); SignalSema(bt_dev.l2cap_sema); + + return ret; } +void ds3bt_set_mode(int mode, int lock, int port) +{ + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + + if (lock == 3) + ds3pad[port].analog_btn = 3; + else + ds3pad[port].analog_btn = mode; + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); +} +#endif void ds3bt_reset() { uint8_t i; @@ -1396,8 +1507,16 @@ void ds3bt_reset() SignalSema(bt_dev.hci_sema); SignalSema(bt_dev.l2cap_sema); +#ifdef USE_THREAD + WaitSema(update_sema); + TerminateThread(update_thread_id); + DeleteThread(update_thread_id); + DeleteSema(update_sema); +#endif DelayThread(1000000); + + //bt_release(); } int ds3bt_get_status(int port) @@ -1421,7 +1540,7 @@ int ds3bt_get_status(int port) int ds3bt_init(uint8_t pads) { int ret; - + enable_pad = pads; ret = UsbRegisterDriver(&bt_driver); @@ -1432,6 +1551,35 @@ int ds3bt_init(uint8_t pads) } UsbRegisterDriver(&chrg_driver); +#ifdef USE_THREAD + iop_thread_t param; + iop_sema_t sema; + + sema.initial = 1; + sema.max = 1; + sema.option = 0; + sema.attr = 0; + + update_sema = CreateSema(&sema); + if (update_sema < 0) { + return 0; + } + + param.attr = TH_C; + param.thread = update_thread; + param.priority = 0x4f; + param.stacksize = 0xB00; + param.option = 0; + update_thread_id = CreateThread(¶m); + + if (update_thread_id > 0) { + StartThread(update_thread_id, 0); + return 1; + } + + return 0; +#else return 1; +#endif } diff --git a/modules/pademu/ds3bt.h b/modules/pademu/ds3bt.h index 3ca481c0b..6a4828300 100644 --- a/modules/pademu/ds3bt.h +++ b/modules/pademu/ds3bt.h @@ -267,7 +267,8 @@ enum eBUF_SIZE { int ds3bt_init(uint8_t pads); int ds3bt_get_status(int port); void ds3bt_reset(); -void ds3bt_get_data(char *dst, int size, int port); +int ds3bt_get_data(char *dst, int size, int port); void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port); +void ds3bt_set_mode(int mode, int lock, int port); #endif diff --git a/modules/pademu/ds3usb.c b/modules/pademu/ds3usb.c index 6813686bd..d4b0987f8 100644 --- a/modules/pademu/ds3usb.c +++ b/modules/pademu/ds3usb.c @@ -37,6 +37,19 @@ static uint8_t output_01_report[] = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static uint8_t led_patterns[][2] = +{ + { 0x1C, 0x02 }, + { 0x1A, 0x04 }, + { 0x16, 0x08 }, + { 0x0E, 0x10 }, +}; + +static uint8_t power_level[] = +{ + 0x00, 0x02, 0x06, 0x0E, 0x1E +}; + static uint8_t usb_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; int usb_probe(int devId); @@ -66,6 +79,7 @@ typedef struct _usb_ds3 uint8_t oldrrumble; uint8_t data[18]; uint8_t enabled; + uint8_t analog_btn; } ds3usb_device; ds3usb_device ds3pad[MAX_PADS]; @@ -178,6 +192,9 @@ int usb_disconnect(int devId) static void usb_release(int pad) { + if (ds3pad[pad].sema >= 0) + WaitSema(ds3pad[pad].sema); + if (ds3pad[pad].eventEndp >= 0) UsbCloseEndpoint(ds3pad[pad].eventEndp); @@ -193,7 +210,8 @@ static void usb_release(int pad) static void usb_data_cb(int resultCode, int bytes, void *arg) { int pad = (int)arg; - + + PollSema(ds3pad[pad].sema); //DPRINTF("usb_data_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); if (!resultCode) @@ -264,10 +282,18 @@ static void readReport(uint8_t *data, int pad) ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 - if (data[DATA_START + PSButtonState]) //display battery level - ds3pad[pad].oldled = ~(1 << data[DATA_START + Power]) & 0x1E; + if (data[DATA_START + PSButtonState]) { //display battery level + if(data[DATA_START + ButtonStateL] == 0x01) { //PS + SELECT + if(ds3pad[pad].analog_btn < 2) //unlocked mode + ds3pad[pad].analog_btn = !ds3pad[pad].analog_btn; + + ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; + } + else if(data[DATA_START + Power] != 0xEE) + ds3pad[pad].oldled = power_level[data[DATA_START + Power] - 1]; + } else - ds3pad[pad].oldled = (pad + 1) << 1; + ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; if (data[DATA_START + Power] == 0xEE) //charging ds3pad[pad].oldled |= 0x80; @@ -309,7 +335,12 @@ static uint8_t LED(uint8_t led, int pad) static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad) { - return LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); + uint8_t ret; + + ret = LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); + WaitSema(ds3pad[pad].sema); + + return ret; } void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port) @@ -318,13 +349,13 @@ void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port) Rumble(lrum, rrum, port); - WaitSema(ds3pad[port].sema); - SignalSema(ds3pad[port].sema); } -void ds3usb_get_data(char *dst, int size, int port) +int ds3usb_get_data(char *dst, int size, int port) { + int ret; + WaitSema(ds3pad[port].sema); UsbInterruptTransfer(ds3pad[port].eventEndp, usb_buf, MAX_BUFFER_SIZE, usb_data_cb, (void *)port); @@ -332,6 +363,21 @@ void ds3usb_get_data(char *dst, int size, int port) WaitSema(ds3pad[port].sema); mips_memcpy(dst, ds3pad[port].data, size); + ret = ds3pad[port].analog_btn & 1; + + SignalSema(ds3pad[port].sema); + + return ret; +} + +void ds3usb_set_mode(int mode, int lock, int port) +{ + WaitSema(ds3pad[port].sema); + + if (lock == 3) + ds3pad[port].analog_btn = 3; + else + ds3pad[port].analog_btn = mode; SignalSema(ds3pad[port].sema); } @@ -346,7 +392,18 @@ void ds3usb_reset() int ds3usb_get_status(int port) { - return ds3pad[port].status; + int status; + + if (ds3pad[port].sema >= 0) { + WaitSema(ds3pad[port].sema); + status = ds3pad[port].status; + SignalSema(ds3pad[port].sema); + } + else { + return ds3pad[port].status; + } + + return status; } int ds3usb_init(uint8_t pads) @@ -367,6 +424,7 @@ int ds3usb_init(uint8_t pads) ds3pad[pad].data[0] = 0xFF; ds3pad[pad].data[1] = 0xFF; + ds3pad[pad].analog_btn = 0; mips_memset(&ds3pad[pad].data[2], 0x7F, 4); mips_memset(&ds3pad[pad].data[6], 0x00, 12); diff --git a/modules/pademu/ds3usb.h b/modules/pademu/ds3usb.h index 71dff5d0f..4e04d121e 100644 --- a/modules/pademu/ds3usb.h +++ b/modules/pademu/ds3usb.h @@ -110,7 +110,8 @@ enum eBUF_SIZE { int ds3usb_init(uint8_t pads); int ds3usb_get_status(int port); void ds3usb_reset(); -void ds3usb_get_data(char *dst, int size, int port); +int ds3usb_get_data(char *dst, int size, int port); void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port); +void ds3usb_set_mode(int mode, int lock, int port); #endif diff --git a/modules/pademu/exports.tab b/modules/pademu/exports.tab index 114fadaa4..40c6386e9 100644 --- a/modules/pademu/exports.tab +++ b/modules/pademu/exports.tab @@ -1,4 +1,10 @@ DECLARE_EXPORT_TABLE(pademu, 1, 1) + DECLARE_EXPORT(_start) + DECLARE_EXPORT(_retonly) + DECLARE_EXPORT(_exit) + DECLARE_EXPORT(_retonly) DECLARE_EXPORT(pademu_hookSio2man) END_EXPORT_TABLE + +void _retonly() {} diff --git a/modules/pademu/imports.lst b/modules/pademu/imports.lst index 3f971a1c0..052af8da9 100644 --- a/modules/pademu/imports.lst +++ b/modules/pademu/imports.lst @@ -1,12 +1,8 @@ - -#include "ioman_mod.h" - -sifcmd_IMPORTS_start -I_sceSifInitRpc -I_sceSifSetRpcQueue -I_sceSifRegisterRpc -I_sceSifRpcLoop -sifcmd_IMPORTS_end +loadcore_IMPORTS_start +I_RegisterLibraryEntries +I_GetLoadcoreInternalData +I_QueryLibraryEntryTable +loadcore_IMPORTS_end stdio_IMPORTS_start I_printf @@ -26,6 +22,9 @@ I_CreateThread I_DeleteThread I_DelayThread I_GetThreadId +I_SleepThread +I_WakeupThread +I_TerminateThread thbase_IMPORTS_end intrman_IMPORTS_start @@ -33,13 +32,6 @@ I_CpuSuspendIntr I_CpuResumeIntr intrman_IMPORTS_end -sifman_IMPORTS_start -I_sceSifCheckInit -I_sceSifInit -I_sceSifSetDma -I_sceSifDmaStat -sifman_IMPORTS_end - usbd_IMPORTS_start I_UsbGetDeviceStaticDescriptor I_UsbOpenEndpoint @@ -50,25 +42,17 @@ I_UsbTransfer I_UsbRegisterDriver usbd_IMPORTS_end -vblank_IMPORTS_start -I_WaitVblankStart -I_RegisterVblankHandler -vblank_IMPORTS_end +sysclib_IMPORTS_start +I_strncmp +#ifndef USE_SMSUTILS +I_memset +I_memcpy +#endif +sysclib_IMPORTS_end +#ifdef USE_SMSUTILS smsutils_IMPORTS_start I_mips_memset I_mips_memcpy smsutils_IMPORTS_end - -sysclib_IMPORTS_start -I_prnt -I_strncmp -I_strncpy -sysclib_IMPORTS_end - -loadcore_IMPORTS_start -I_GetLoadcoreInternalData -I_QueryLibraryEntryTable -I_FlushIcache -I_FlushDcache -loadcore_IMPORTS_end +#endif diff --git a/modules/pademu/pademu.c b/modules/pademu/pademu.c index 0ded1de89..3668018ad 100644 --- a/modules/pademu/pademu.c +++ b/modules/pademu/pademu.c @@ -17,6 +17,7 @@ #define PAD_RESET ds3bt_reset #define PAD_GET_DATA ds3bt_get_data #define PAD_SET_RUMBLE ds3bt_set_rumble +#define PAD_SET_MODE ds3bt_set_mode #elif defined(USB) @@ -27,6 +28,7 @@ #define PAD_RESET ds3usb_reset #define PAD_GET_DATA ds3usb_get_data #define PAD_SET_RUMBLE ds3usb_set_rumble +#define PAD_SET_MODE ds3usb_set_mode #else #error "must define mode" @@ -37,12 +39,16 @@ typedef struct { - uint8_t config_mode; uint8_t mode; + uint8_t mode_p; + uint8_t mode_id; + uint8_t mode_cfg; + uint8_t mode_lock; uint8_t enabled; uint8_t vibration; + uint8_t lrum; + uint8_t rrum; uint8_t mask[4]; - uint8_t actalign[6]; } pad_status_t; #define DIGITAL_MODE 0x41 @@ -56,9 +62,6 @@ typedef struct IRX_ID("pademu", 1, 1); -#define PADEMU_BIND_RPC_ID 0x18E3878D -#define PADEMU_RESET 1 - //#define OLD_PADMAN PtrRegisterLibraryEntires pRegisterLibraryEntires; /* Pointer to RegisterLibraryEntires routine */ @@ -81,36 +84,8 @@ void pademu_hookSio2man(sio2_transfer_data_t *td, Sio2McProc sio2proc); void pademu_setup(uint8_t ports, uint8_t vib); void pademu(sio2_transfer_data_t *td); void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size); -void pademu_reset(); - -static void rpc_thread(void *data); -static void *rpc_sf(int cmd, void *data, int size); - -static SifRpcDataQueue_t rpc_que __attribute__((aligned(16))); -static SifRpcServerData_t rpc_svr __attribute__((aligned(16))); - -//static int rpc_buf[64] __attribute((aligned(16))); - -void rpc_thread(void *data) -{ - if (sceSifCheckInit() == 0) { - DPRINTF("BT: Sif not initialized \n"); - sceSifInit(); - } - - SifInitRpc(0); - SifSetRpcQueue(&rpc_que, GetThreadId()); - SifRegisterRpc(&rpc_svr, PADEMU_BIND_RPC_ID, rpc_sf, NULL, NULL, NULL, &rpc_que); - SifRpcLoop(&rpc_que); -} -void *rpc_sf(int cmd, void *data, int size) -{ - if (cmd == PADEMU_RESET) - pademu_reset(); - - return data; -} +extern struct irx_export_table _exp_pademu; int _start(int argc, char *argv[]) { @@ -125,6 +100,10 @@ int _start(int argc, char *argv[]) return MODULE_NO_RESIDENT_END; } + if (RegisterLibraryEntries(&_exp_pademu) != 0) { + return MODULE_NO_RESIDENT_END; + } + #ifndef VMC if (!install_sio2hook()) { return MODULE_NO_RESIDENT_END; @@ -133,22 +112,12 @@ int _start(int argc, char *argv[]) pademu_setup(enable, vibration); - iop_thread_t rpc_th; - - rpc_th.attr = TH_C; - rpc_th.thread = rpc_thread; - rpc_th.priority = 40; - rpc_th.stacksize = 0x800; - rpc_th.option = 0; - - int thid = CreateThread(&rpc_th); - - if (thid > 0) { - StartThread(thid, NULL); - return MODULE_RESIDENT_END; - } + return MODULE_RESIDENT_END; +} - return MODULE_NO_RESIDENT_END; +void _exit(int mode) +{ + PAD_RESET(); } int install_sio2hook() @@ -265,17 +234,22 @@ void pademu_setup(uint8_t ports, uint8_t vib) uint8_t i; for (i = 0; i < MAX_PORTS; i++) { - pad[i].config_mode = 0; - pad[i].mode = DIGITAL_MODE; + pad[i].mode = 0; + pad[i].mode_p = 0; + pad[i].mode_id = DIGITAL_MODE; + pad[i].mode_cfg = 0; + pad[i].mode_lock = 0; + pad[i].enabled = ((ports >> i) & 1); pad[i].vibration = ((vib >> i) & 1); - mips_memset(pad[i].actalign, 0xFF, 6); - pad[i].mask[0] = 0xFF; pad[i].mask[1] = 0xFF; pad[i].mask[2] = 0x03; pad[i].mask[3] = 0x00; + + pad[i].lrum = 2; + pad[i].rrum = 2; } } @@ -344,17 +318,18 @@ void pademu(sio2_transfer_data_t *td) void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) { - uint8_t rrum = 0, lrum = 0; uint8_t i; mips_memset(out, 0x00, out_size); if (!(PAD_GET_STATUS(port) & PAD_STATE_RUNNING)) { + pad[port].lrum = 2; + pad[port].rrum = 2; return; } out[0] = 0xFF; - out[1] = pad[port].config_mode ? CONFIG_MODE : pad[port].mode; + out[1] = CONFIG_MODE; out[2] = 0x5A; switch (in[1]) { @@ -363,7 +338,7 @@ void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) break; case 0x41: //query button mask - if (pad[port].mode != DIGITAL_MODE) { + if (pad[port].mode_id != DIGITAL_MODE) { out[3] = pad[port].mask[0]; out[4] = pad[port].mask[1]; out[5] = pad[port].mask[2]; @@ -373,35 +348,56 @@ void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) } break; + case 0x43: //enter/exit config mode + if (pad[port].mode_cfg) { + pad[port].mode_cfg = in[3]; + break; + } + + pad[port].mode_cfg = in[3]; case 0x42: //read data - PAD_GET_DATA(&out[3], out_size - 3, port); - - if (pad[port].vibration) //disable/enable vibration - { - for (i = 0; i < 6; i++) //vibration - { - if (pad[port].actalign[i] == 0x00) - rrum = in[i + 3]; - - if (pad[port].actalign[i] == 0x01) - lrum = in[i + 3]; + if (in[1] == 0x42) { + if (pad[port].vibration) { //disable/enable vibration + PAD_SET_RUMBLE(in[pad[port].lrum], in[pad[port].rrum], port); } - PAD_SET_RUMBLE(lrum, rrum, port); } - break; + i = PAD_GET_DATA(&out[3], out_size - 3, port); + + if (pad[port].mode_lock == 0) { //mode unlocked + if (pad[port].mode != i) { + pad[port].mode = i; - case 0x43: //enter/exit config mode - pad[port].config_mode = (in[3] == 0x01); + if (pad[port].mode) + pad[port].mode_id = ANALOG_MODE; + else + pad[port].mode_id = DIGITAL_MODE; + } + } + + out[1] = pad[port].mode_id; break; case 0x44: //set mode and lock - pad[port].mode = (in[3] == 0x01) ? ANALOG_MODE : DIGITAL_MODE; + pad[port].mode = in[3]; + pad[port].mode_lock = in[4]; + if (pad[port].mode) { + if (pad[port].mode_p) { + pad[port].mode_id = ANALOGP_MODE; + } + else { + pad[port].mode_id = ANALOG_MODE; + } + } + else { + pad[port].mode_id = DIGITAL_MODE; + } + PAD_SET_MODE(pad[port].mode, pad[port].mode_lock, port); break; case 0x45: //query model and mode mips_memcpy(&out[3], &pademu_data[1], 6); - out[5] = (pad[port].mode & 0xF) != 1; + out[5] = pad[port].mode; break; case 0x46: //query act @@ -425,12 +421,21 @@ void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) break; case 0x4D: //set act align - mips_memcpy(pad[port].actalign, &in[3], 6); mips_memcpy(&out[3], &pademu_data[5], 6); + + for (i = 0; i < 6; i++) //vibration + { + if (in[3 + i] == 0x00) + pad[port].rrum = i + 3; + + if (in[3 + i] == 0x01) + pad[port].lrum = i + 3; + } break; case 0x4F: //set button info - pad[port].mode = ANALOGP_MODE; + pad[port].mode_id = ANALOGP_MODE; + pad[port].mode_p = 1; out[8] = 0x5A; @@ -441,8 +446,3 @@ void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) break; } } - -void pademu_reset() -{ - PAD_RESET(); -} diff --git a/modules/pademu/sys_utils.h b/modules/pademu/sys_utils.h index df9859e42..66ff9cd26 100644 --- a/modules/pademu/sys_utils.h +++ b/modules/pademu/sys_utils.h @@ -16,6 +16,7 @@ typedef struct void **exports; } modinfo_t; +#ifdef USE_SMSUTILS /* SMS Utils Imports */ #define smsutils_IMPORTS_start DECLARE_IMPORT_TABLE(smsutils, 1, 1) @@ -26,5 +27,9 @@ void mips_memset(void *, int, unsigned); #define I_mips_memset DECLARE_IMPORT(5, mips_memset) #define smsutils_IMPORTS_end END_IMPORT_TABLE +#else +#define mips_memset memset +#define mips_memcpy memcpy +#endif #endif /* __MCEMU_UTILS_H */ diff --git a/src/gui.c b/src/gui.c index c61b1696f..799e72611 100644 --- a/src/gui.c +++ b/src/gui.c @@ -633,13 +633,13 @@ void guiShowCheatConfig(void) #endif #ifdef PADEMU - static u8 ds3_mac[6]; static u8 dg_mac[6]; static char ds3_str[18]; static char dg_str[18]; static int ds3macset = 0; static int dgmacset = 0; +static int dg_discon = 0; static int PadEmuSettings = 0; @@ -698,8 +698,12 @@ static int guiPadEmuUpdater(int modified) if (PadEmuMode) { if (ds3bt_get_status(0) & DS3BT_STATE_USB_CONFIGURED) { + if (dg_discon) { + dgmacset = 0; + dg_discon = 0; + } if (!dgmacset) { - if (!ds3bt_get_bdaddr(dg_mac)) { + if (ds3bt_get_bdaddr(dg_mac)) { dgmacset = 1; diaSetLabel(diaPadEmuConfig, PADCFG_USBDG_MAC, bdaddr_to_str(dg_mac, dg_str)); } else { @@ -707,13 +711,16 @@ static int guiPadEmuUpdater(int modified) } } } else { + dg_discon = 1; + } + + if (!dgmacset) { diaSetLabel(diaPadEmuConfig, PADCFG_USBDG_MAC, _l(_STR_NOT_CONNECTED)); - dgmacset = 0; } if (ds3usb_get_status(0) & DS3USB_STATE_RUNNING) { if (!ds3macset) { - if (!ds3usb_get_bdaddr(0, ds3_mac)) { + if (ds3usb_get_bdaddr(0, ds3_mac)) { ds3macset = 1; diaSetLabel(diaPadEmuConfig, PADCFG_PAD_MAC, bdaddr_to_str(ds3_mac, ds3_str)); } else { @@ -733,7 +740,7 @@ static void guiShowPadEmuConfig(void) { const char *PadEmuModes[] = {_l(_STR_DS3USB_MODE), _l(_STR_DS3BT_MODE), NULL}; int PadPort; - + diaSetEnum(diaPadEmuConfig, PADCFG_PADEMU_MODE, PadEmuModes); diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_MODE, PadEmuSettings & 0xFF); @@ -751,7 +758,7 @@ static void guiShowPadEmuConfig(void) if (result == PADCFG_PAIR) { if (ds3macset && dgmacset) { if (ds3usb_get_status(0) & DS3USB_STATE_RUNNING) { - if (!ds3usb_set_bdaddr(0, dg_mac)) + if (ds3usb_set_bdaddr(0, dg_mac)) ds3macset = 0; } } @@ -761,7 +768,6 @@ static void guiShowPadEmuConfig(void) break; } } - #endif static int netConfigUpdater(int modified) diff --git a/src/httpclient.c b/src/httpclient.c index 14865f736..148e8eecd 100644 --- a/src/httpclient.c +++ b/src/httpclient.c @@ -1,79 +1,79 @@ -#include -#include -#include -#include - -#include "httpclient.h" - -static SifRpcClientData_t SifRpcClient; -static unsigned char RpcTxBuffer[256] ALIGNED(64); -static unsigned char RpcRxBuffer[64] ALIGNED(64); - -int HttpInit(void) -{ - while (SifBindRpc(&SifRpcClient, 0x00001B14, 0) < 0 || SifRpcClient.server == NULL) { - printf("libhttpclient: bind failed\n"); - nopdelay(); - } - - return 0; -} - -void HttpDeinit(void) -{ - memset(&SifRpcClient, 0, sizeof(SifRpcClientData_t)); -} - -int HttpEstabConnection(s8 *server, u16 port) -{ - int result; - - strncpy(((struct HttpClientConnEstabArgs *)RpcTxBuffer)->server, server, HTTP_CLIENT_SERVER_NAME_MAX - 1); - ((struct HttpClientConnEstabArgs *)RpcTxBuffer)->server[HTTP_CLIENT_SERVER_NAME_MAX - 1] = '\0'; - ((struct HttpClientConnEstabArgs *)RpcTxBuffer)->port = port; - - if ((result = SifCallRpc(&SifRpcClient, HTTP_CLIENT_CMD_CONN_ESTAB, 0, RpcTxBuffer, sizeof(struct HttpClientConnEstabArgs), RpcRxBuffer, sizeof(s32), NULL, NULL)) >= 0) - result = *(s32 *)RpcRxBuffer; - - return result; -} - -void HttpCloseConnection(s32 HttpSocket) -{ - ((struct HttpClientConnCloseArgs *)RpcTxBuffer)->socket = HttpSocket; - SifCallRpc(&SifRpcClient, HTTP_CLIENT_CMD_CONN_CLOSE, 0, RpcTxBuffer, sizeof(struct HttpClientConnCloseArgs), NULL, 0, NULL, NULL); -} - -int HttpSendGetRequest(s32 HttpSocket, const s8 *UserAgent, const s8 *host, s8 *mode, const u8 *mtime, const s8 *uri, u8 *output, u16 *out_len) -{ - int result; - - ((struct HttpClientSendGetArgs *)RpcTxBuffer)->socket = HttpSocket; - strncpy(((struct HttpClientSendGetArgs *)RpcTxBuffer)->UserAgent, UserAgent, HTTP_CLIENT_USER_AGENT_MAX - 1); - ((struct HttpClientSendGetArgs *)RpcTxBuffer)->UserAgent[HTTP_CLIENT_USER_AGENT_MAX - 1] = '\0'; - strncpy(((struct HttpClientSendGetArgs *)RpcTxBuffer)->host, host, HTTP_CLIENT_SERVER_NAME_MAX - 1); - ((struct HttpClientSendGetArgs *)RpcTxBuffer)->host[HTTP_CLIENT_SERVER_NAME_MAX - 1] = '\0'; - ((struct HttpClientSendGetArgs *)RpcTxBuffer)->mode = *mode; - if (mtime != NULL) { - memcpy(((struct HttpClientSendGetArgs *)RpcTxBuffer)->mtime, mtime, sizeof(((struct HttpClientSendGetArgs *)RpcTxBuffer)->mtime)); - ((struct HttpClientSendGetArgs *)RpcTxBuffer)->hasMtime = 1; - } else { - memset(((struct HttpClientSendGetArgs *)RpcTxBuffer)->mtime, 0, sizeof(((struct HttpClientSendGetArgs *)RpcTxBuffer)->mtime)); - ((struct HttpClientSendGetArgs *)RpcTxBuffer)->hasMtime = 0; - } - strncpy(((struct HttpClientSendGetArgs *)RpcTxBuffer)->uri, uri, HTTP_CLIENT_URI_MAX - 1); - ((struct HttpClientSendGetArgs *)RpcTxBuffer)->uri[HTTP_CLIENT_URI_MAX - 1] = '\0'; - ((struct HttpClientSendGetArgs *)RpcTxBuffer)->output = output; - ((struct HttpClientSendGetArgs *)RpcTxBuffer)->out_len = *out_len; - - if (!IS_UNCACHED_SEG(output)) - SifWriteBackDCache(output, *out_len); - - if ((result = SifCallRpc(&SifRpcClient, HTTP_CLIENT_CMD_SEND_GET_REQ, 0, RpcTxBuffer, sizeof(struct HttpClientSendGetArgs), RpcRxBuffer, sizeof(struct HttpClientSendGetResult), NULL, NULL)) >= 0) { - result = ((struct HttpClientSendGetResult *)RpcRxBuffer)->result; - *mode = ((struct HttpClientSendGetResult *)RpcRxBuffer)->mode; - *out_len = ((struct HttpClientSendGetResult *)RpcRxBuffer)->out_len; - } - - return result; -} +#include +#include +#include +#include + +#include "httpclient.h" + +static SifRpcClientData_t SifRpcClient; +static unsigned char RpcTxBuffer[256] ALIGNED(64); +static unsigned char RpcRxBuffer[64] ALIGNED(64); + +int HttpInit(void) +{ + while (SifBindRpc(&SifRpcClient, 0x00001B14, 0) < 0 || SifRpcClient.server == NULL) { + printf("libhttpclient: bind failed\n"); + nopdelay(); + } + + return 0; +} + +void HttpDeinit(void) +{ + memset(&SifRpcClient, 0, sizeof(SifRpcClientData_t)); +} + +int HttpEstabConnection(s8 *server, u16 port) +{ + int result; + + strncpy(((struct HttpClientConnEstabArgs *)RpcTxBuffer)->server, server, HTTP_CLIENT_SERVER_NAME_MAX - 1); + ((struct HttpClientConnEstabArgs *)RpcTxBuffer)->server[HTTP_CLIENT_SERVER_NAME_MAX - 1] = '\0'; + ((struct HttpClientConnEstabArgs *)RpcTxBuffer)->port = port; + + if ((result = SifCallRpc(&SifRpcClient, HTTP_CLIENT_CMD_CONN_ESTAB, 0, RpcTxBuffer, sizeof(struct HttpClientConnEstabArgs), RpcRxBuffer, sizeof(s32), NULL, NULL)) >= 0) + result = *(s32 *)RpcRxBuffer; + + return result; +} + +void HttpCloseConnection(s32 HttpSocket) +{ + ((struct HttpClientConnCloseArgs *)RpcTxBuffer)->socket = HttpSocket; + SifCallRpc(&SifRpcClient, HTTP_CLIENT_CMD_CONN_CLOSE, 0, RpcTxBuffer, sizeof(struct HttpClientConnCloseArgs), NULL, 0, NULL, NULL); +} + +int HttpSendGetRequest(s32 HttpSocket, const s8 *UserAgent, const s8 *host, s8 *mode, const u8 *mtime, const s8 *uri, u8 *output, u16 *out_len) +{ + int result; + + ((struct HttpClientSendGetArgs *)RpcTxBuffer)->socket = HttpSocket; + strncpy(((struct HttpClientSendGetArgs *)RpcTxBuffer)->UserAgent, UserAgent, HTTP_CLIENT_USER_AGENT_MAX - 1); + ((struct HttpClientSendGetArgs *)RpcTxBuffer)->UserAgent[HTTP_CLIENT_USER_AGENT_MAX - 1] = '\0'; + strncpy(((struct HttpClientSendGetArgs *)RpcTxBuffer)->host, host, HTTP_CLIENT_SERVER_NAME_MAX - 1); + ((struct HttpClientSendGetArgs *)RpcTxBuffer)->host[HTTP_CLIENT_SERVER_NAME_MAX - 1] = '\0'; + ((struct HttpClientSendGetArgs *)RpcTxBuffer)->mode = *mode; + if (mtime != NULL) { + memcpy(((struct HttpClientSendGetArgs *)RpcTxBuffer)->mtime, mtime, sizeof(((struct HttpClientSendGetArgs *)RpcTxBuffer)->mtime)); + ((struct HttpClientSendGetArgs *)RpcTxBuffer)->hasMtime = 1; + } else { + memset(((struct HttpClientSendGetArgs *)RpcTxBuffer)->mtime, 0, sizeof(((struct HttpClientSendGetArgs *)RpcTxBuffer)->mtime)); + ((struct HttpClientSendGetArgs *)RpcTxBuffer)->hasMtime = 0; + } + strncpy(((struct HttpClientSendGetArgs *)RpcTxBuffer)->uri, uri, HTTP_CLIENT_URI_MAX - 1); + ((struct HttpClientSendGetArgs *)RpcTxBuffer)->uri[HTTP_CLIENT_URI_MAX - 1] = '\0'; + ((struct HttpClientSendGetArgs *)RpcTxBuffer)->output = output; + ((struct HttpClientSendGetArgs *)RpcTxBuffer)->out_len = *out_len; + + if (!IS_UNCACHED_SEG(output)) + SifWriteBackDCache(output, *out_len); + + if ((result = SifCallRpc(&SifRpcClient, HTTP_CLIENT_CMD_SEND_GET_REQ, 0, RpcTxBuffer, sizeof(struct HttpClientSendGetArgs), RpcRxBuffer, sizeof(struct HttpClientSendGetResult), NULL, NULL)) >= 0) { + result = ((struct HttpClientSendGetResult *)RpcRxBuffer)->result; + *mode = ((struct HttpClientSendGetResult *)RpcRxBuffer)->mode; + *out_len = ((struct HttpClientSendGetResult *)RpcRxBuffer)->out_len; + } + + return result; +} diff --git a/src/nbns.c b/src/nbns.c index be710a645..4e955f335 100644 --- a/src/nbns.c +++ b/src/nbns.c @@ -1,39 +1,39 @@ -#include -#include -#include -#include - -#include "nbns.h" - -static SifRpcClientData_t SifRpcClient; -static unsigned char RpcBuffer[64] ALIGNED(64); - -int nbnsInit(void) -{ - while (SifBindRpc(&SifRpcClient, 0x00001B13, 0) < 0 || SifRpcClient.server == NULL) { - printf("libnbns: bind failed\n"); - nopdelay(); - } - - return 0; -} - -void nbnsDeinit(void) -{ - memset(&SifRpcClient, 0, sizeof(SifRpcClientData_t)); -} - -int nbnsFindName(const char *name, unsigned char *ip_address) -{ - int result; - - strncpy(RpcBuffer, name, 16); - RpcBuffer[16] = '\0'; - - if ((result = SifCallRpc(&SifRpcClient, NBNS_RPC_ID_FIND_NAME, 0, RpcBuffer, 17, RpcBuffer, sizeof(struct nbnsFindNameResult), NULL, NULL)) >= 0) { - result = ((struct nbnsFindNameResult *)RpcBuffer)->result; - memcpy(ip_address, ((struct nbnsFindNameResult *)RpcBuffer)->address, 4); - } - - return result; -} +#include +#include +#include +#include + +#include "nbns.h" + +static SifRpcClientData_t SifRpcClient; +static unsigned char RpcBuffer[64] ALIGNED(64); + +int nbnsInit(void) +{ + while (SifBindRpc(&SifRpcClient, 0x00001B13, 0) < 0 || SifRpcClient.server == NULL) { + printf("libnbns: bind failed\n"); + nopdelay(); + } + + return 0; +} + +void nbnsDeinit(void) +{ + memset(&SifRpcClient, 0, sizeof(SifRpcClientData_t)); +} + +int nbnsFindName(const char *name, unsigned char *ip_address) +{ + int result; + + strncpy(RpcBuffer, name, 16); + RpcBuffer[16] = '\0'; + + if ((result = SifCallRpc(&SifRpcClient, NBNS_RPC_ID_FIND_NAME, 0, RpcBuffer, 17, RpcBuffer, sizeof(struct nbnsFindNameResult), NULL, NULL)) >= 0) { + result = ((struct nbnsFindNameResult *)RpcBuffer)->result; + memcpy(ip_address, ((struct nbnsFindNameResult *)RpcBuffer)->address, 4); + } + + return result; +} diff --git a/src/pad.c b/src/pad.c index e7aa82222..38715b63d 100644 --- a/src/pad.c +++ b/src/pad.c @@ -193,12 +193,12 @@ static int readPad(struct pad_data_t *pad) newpdata = 0xffff ^ pad->buttons.btns; if (ds3bt_get_status(pad->port) & DS3BT_STATE_RUNNING) { - ret = !ds3bt_get_data(pad->port, (u8 *)&pad->buttons.btns); + ret = ds3bt_get_data(pad->port, (u8 *)&pad->buttons.btns); newpdata |= 0xffff ^ pad->buttons.btns; } if (ds3usb_get_status(pad->port) & DS3USB_STATE_RUNNING) { - ret = !ds3usb_get_data(pad->port, (u8 *)&pad->buttons.btns); + ret = ds3usb_get_data(pad->port, (u8 *)&pad->buttons.btns); newpdata |= 0xffff ^ pad->buttons.btns; } From 2f790ef2de36c07996161141767b0e0801d330d3 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 11 Jul 2017 18:44:42 -0700 Subject: [PATCH 047/269] define DB custom changes --- DETAILED_CHANGELOG | 1 + include/config.h | 8 +++++++ include/dialogs.h | 2 ++ include/ethsupport.h | 2 ++ include/hddsupport.h | 2 ++ include/iosupport.h | 2 ++ include/lang.h | 2 ++ include/opl.h | 4 ++++ include/textures.h | 2 ++ include/usbsupport.h | 2 ++ src/appsupport.c | 12 +++++++++- src/config.c | 2 ++ src/dialogs.c | 57 ++++++++++++++++++++++++++++++++++++++++++++ src/ethsupport.c | 2 ++ src/gui.c | 14 +++++++++++ src/hddsupport.c | 2 ++ src/lang.c | 6 +++++ src/menusys.c | 2 ++ src/opl.c | 16 +++++++++++++ src/textures.c | 4 ++++ src/themes.c | 2 ++ src/usbsupport.c | 2 ++ 22 files changed, 147 insertions(+), 1 deletion(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 9ee8a57e7..efcf70714 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1005 - Jay-Jay-OPL - belek66 did the following changes: - use module export table to reset ds3 (remove pademu rpc in ee_core) - use thread to read data/set vibration in ds3bt module (can be disabled in Makefile) - emulating analog button (changing pad mode by pressing PS+START buttons) - option to compile pademu modules without using sms_utils (remove -DUSE_SMSUTILS in Makefile) to make them usable in others apps - in gui: saving bt adapter mac address, now pairing DS3 is posible without connected bt adapter - Fri Jun 23 22:07:32 2017 -0700 rev1004 - Jay-Jay-OPL - small edit to credits. - Tue May 30 23:11:06 2017 -0700 rev1003 - Jay-Jay-OPL - SP193 commit: (ATAD) Fixed Makefile include paths so that the custom atad.h header will be used. Fixed atad.h to have fitting declarations for ata_io_start and ata_device_sector_io. - Tue May 30 23:03:36 2017 -0700 rev1002 - Jay-Jay-OPL - drop using CFG-DEV, return using CFG - Tue May 30 13:02:18 2017 -0700 diff --git a/include/config.h b/include/config.h index 0d9fc039c..edbb2bc71 100644 --- a/include/config.h +++ b/include/config.h @@ -6,7 +6,9 @@ enum CONFIG_INDEX { CONFIG_INDEX_OPL = 0, CONFIG_INDEX_LAST, CONFIG_INDEX_APPS, +//START of OPL_DB tweaks CONFIG_INDEX_ELM, +//END of OPL_DB tweaks CONFIG_INDEX_NETWORK, CONFIG_INDEX_COUNT @@ -16,7 +18,9 @@ enum CONFIG_INDEX { #define CONFIG_OPL (1 << CONFIG_INDEX_OPL) #define CONFIG_LAST (1 << CONFIG_INDEX_LAST) #define CONFIG_APPS (1 << CONFIG_INDEX_APPS) +//START of OPL_DB tweaks #define CONFIG_ELM (1 << CONFIG_INDEX_ELM) +//END of OPL_DB tweaks #define CONFIG_NETWORK (1 << CONFIG_INDEX_NETWORK) #define CONFIG_ALL 0xFF @@ -34,7 +38,9 @@ enum CONFIG_INDEX { #define CONFIG_ITEM_ALTSTARTUP "$AltStartup" #define CONFIG_ITEM_VMC "$VMC" #define CONFIG_ITEM_COMPAT "$Compatibility" +//START of OPL_DB tweaks #define CONFIG_ITEM_MODES "Modes" +//END of OPL_DB tweaks #define CONFIG_ITEM_DMA "$DMA" #define CONFIG_ITEM_DNAS "$DNAS" #define CONFIG_ITEM_CONFIGSOURCE "$ConfigSource" @@ -83,7 +89,9 @@ enum CONFIG_INDEX { #define CONFIG_OPL_HDD_MODE "hdd_mode" #define CONFIG_OPL_ETH_MODE "eth_mode" #define CONFIG_OPL_APP_MODE "app_mode" +//START of OPL_DB tweaks #define CONFIG_OPL_ELM_MODE "elm_mode" +//END of OPL_DB tweaks #define CONFIG_OPL_SWAP_SEL_BUTTON "swap_select_btn" //Network config keys diff --git a/include/dialogs.h b/include/dialogs.h index a7a7f2a58..5ab3f38be 100644 --- a/include/dialogs.h +++ b/include/dialogs.h @@ -31,7 +31,9 @@ enum UI_ITEMS { CFG_HDDMODE, CFG_ETHMODE, CFG_APPMODE, +//START of OPL_DB tweaks CFG_ELMMODE, +//END of OPL_DB tweaks CFG_CHECKUSBFRAG, CFG_LASTPLAYED, CFG_LBL_AUTOSTARTLAST, diff --git a/include/ethsupport.h b/include/ethsupport.h index e07be55b7..f91508094 100644 --- a/include/ethsupport.h +++ b/include/ethsupport.h @@ -17,7 +17,9 @@ typedef struct } smb_vmc_infos_t; #endif +//START of OPL_DB tweaks char* ethGetPrefix(void); +//END of OPL_DB tweaks void ethInit(void); //Full initialization (Start ETH + SMB and apply configuration). GUI must be already initialized, used by GUI to start SMB mode. void ethDeinitModules(void); //Module-only deinitialization, without the GUI's knowledge (for specific reasons, otherwise unused). int ethLoadInitModules(void); //Initializes Ethernet and applies configuration. diff --git a/include/hddsupport.h b/include/hddsupport.h index 5eee52c0c..105fd1445 100644 --- a/include/hddsupport.h +++ b/include/hddsupport.h @@ -130,7 +130,9 @@ typedef struct } hdd_vmc_infos_t; #endif +//START of OPL_DB tweaks char* hddGetPrefix(void); +//END of OPL_DB tweaks int hddCheck(void); u32 hddGetTotalSectors(void); int hddIs48bit(void); diff --git a/include/iosupport.h b/include/iosupport.h index c72763086..402d981fd 100644 --- a/include/iosupport.h +++ b/include/iosupport.h @@ -8,7 +8,9 @@ enum IO_MODES { ETH_MODE, HDD_MODE, APP_MODE, +//START of OPL_DB tweaks ELM_MODE, +//END of OPL_DB tweaks MODE_COUNT }; diff --git a/include/lang.h b/include/lang.h index 73125d67f..6ca55e150 100644 --- a/include/lang.h +++ b/include/lang.h @@ -233,8 +233,10 @@ enum _STR_IDS { _STR_HINT_PAIRPAD, _STR_NOT_CONNECTED, #endif +//START of OPL_DB tweaks _STR_ELM, _STR_ELMMODE, +//END of OPL_DB tweaks LANG_STR_COUNT }; diff --git a/include/opl.h b/include/opl.h index e837d1dfa..3d0e94423 100644 --- a/include/opl.h +++ b/include/opl.h @@ -38,7 +38,9 @@ // Last Played Auto Start #include +//START of OPL_DB tweaks //#define OPL_IS_DEV_BUILD 1 //Define if this build is a development build. +//END of OPL_DB tweaks //IO type IDs #define IO_CUSTOM_SIMPLEACTION 1 // handler for parameter-less actions @@ -100,7 +102,9 @@ int gUSBStartMode; int gHDDStartMode; int gETHStartMode; int gAPPStartMode; +//START of OPL_DB tweaks int gELMStartMode; +//END of OPL_DB tweaks int gAutosort; int gAutoRefresh; diff --git a/include/textures.h b/include/textures.h index f3b6c0af3..b3c2de512 100644 --- a/include/textures.h +++ b/include/textures.h @@ -14,7 +14,9 @@ enum INTERNAL_TEXTURE { HDD_ICON, ETH_ICON, APP_ICON, +//START of OPL_DB tweaks ELM_ICON, +//END of OPL_DB tweaks LEFT_ICON, RIGHT_ICON, UP_ICON, diff --git a/include/usbsupport.h b/include/usbsupport.h index 4aa594687..e70175916 100644 --- a/include/usbsupport.h +++ b/include/usbsupport.h @@ -17,7 +17,9 @@ typedef struct } usb_vmc_infos_t; #endif +//START of OPL_DB tweaks char* usbGetPrefix(void); +//END of OPL_DB tweaks void usbInit(); item_list_t *usbGetObject(int initOnly); int usbFindPartition(char *target, char *name); diff --git a/src/appsupport.c b/src/appsupport.c index ea1f05652..4ffe17566 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -9,7 +9,9 @@ #include "include/usbsupport.h" #include "include/ethsupport.h" #include "include/hddsupport.h" +//START of OPL_DB tweaks #include "include/supportbase.h" +//END of OPL_DB tweaks static int appForceUpdate = 1; static int appItemCount = 0; @@ -69,6 +71,7 @@ static int appNeedsUpdate(void) return 0; } +//START of OPL_DB tweaks static int appUpdateItemList(void) { char path[256]; static item_list_t *listSupport = NULL; @@ -115,7 +118,8 @@ static int appUpdateItemList(void) { } //Count apps - if (configApps->head) { + //END of OPL_DB tweaks + if (configApps->head) { struct config_value_t *cur = configApps->head; while (cur) { cur = cur->next; @@ -192,6 +196,7 @@ static void appLaunchItem(int id, config_set_t *configSet) guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL); } +//START of OPL_DB tweaks static config_set_t* appGetConfig(int id) { config_set_t* config = NULL; static item_list_t *listSupport = NULL; @@ -248,18 +253,23 @@ static config_set_t* appGetConfig(int id) { config = configAlloc(1, NULL, NULL); } +//END of OPL_DB tweaks configSetStr(config, CONFIG_ITEM_NAME, appGetELFName(cur->val)); configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); +//START of OPL_DB tweaks configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); +//END of OPL_DB tweaks return config; } static int appGetImage(char *folder, int isRelative, char *value, char *suffix, GSTEXTURE *resultTex, short psm) { +//START of OPL_DB tweaks //value = appGetELFName(value); // Search every device from fastest to slowest (HDD > ETH > USB) +//END of OPL_DB tweaks static item_list_t *listSupport = NULL; if ((listSupport = hddGetObject(1))) { if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) diff --git a/src/config.c b/src/config.c index 2e4b842ad..bc1175944 100644 --- a/src/config.c +++ b/src/config.c @@ -160,8 +160,10 @@ void configInit(char *prefix) configAlloc(CONFIG_LAST, &configFiles[CONFIG_INDEX_LAST], path); snprintf(path, sizeof(path), "%s/conf_apps.cfg", prefix); configAlloc(CONFIG_APPS, &configFiles[CONFIG_INDEX_APPS], path); +//START of OPL_DB tweaks snprintf(path, sizeof(path), "%s/conf_elm.cfg", prefix); configAlloc(CONFIG_ELM, &configFiles[CONFIG_INDEX_ELM], path); +//END of OPL_DB tweaks snprintf(path, sizeof(path), "%s/conf_network.cfg", prefix); configAlloc(CONFIG_NETWORK, &configFiles[CONFIG_INDEX_NETWORK], path); } diff --git a/src/dialogs.c b/src/dialogs.c index f95b4e67e..736a476bf 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -19,8 +19,12 @@ struct UIItem diaNetConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_ETH_OPMODE}}}, {UI_SPACER}, {UI_ENUM, NETCFG_ETHOPMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, +//START of OPL_DB tweaks + // {UI_BREAK}, + // {UI_BREAK}, {UI_SPLITTER}, +//END of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_CAT_PS2}}}, {UI_BREAK}, @@ -105,6 +109,10 @@ struct UIItem diaNetConfig[] = { {UI_INT, NETCFG_SHARE_PORT, 1, 1, -1, 0, 0, {.intvalue = {445, 445, 0, 1024}}}, {UI_BREAK}, +//START of OPL_DB tweaks + // {UI_BREAK}, + +//END of OPL_DB tweaks // ---- SMB share name ---- {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_SHARE}}}, {UI_SPACER}, @@ -119,9 +127,15 @@ struct UIItem diaNetConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_PASSWORD}}}, {UI_SPACER}, {UI_PASSWORD, NETCFG_SHARE_PASSWORD, 1, 1, _STR_HINT_GUEST, 0, 0, {.stringvalue = {"", "", NULL}}}, +//START of OPL_DB tweaks + // {UI_BREAK}, {UI_SPLITTER}, +//END of OPL_DB tweaks // buttons +//START of OPL_DB tweaks + // {UI_BREAK}, +//END of OPL_DB tweaks {UI_BUTTON, NETCFG_OK, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, {UI_SPACER}, {UI_BUTTON, NETCFG_RECONNECT, 1, 1, -1, 0, 0, {.label = {NULL, _STR_RECONNECT}}}, @@ -224,7 +238,10 @@ struct UIItem diaCompatConfig[] = { {UI_STRING, COMPAT_GAMEID, 1, 1, -1, 0, 0, {.stringvalue = {"", "", NULL}}}, {UI_SPACER}, {UI_BUTTON, COMPAT_LOADFROMDISC, 1, 1, -1, 0, 0, {.label = {NULL, _STR_LOAD_FROM_DISC}}}, +//START of OPL_DB tweaks + // {UI_SPLITTER}, {UI_BREAK}, +//END of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_ALTSTARTUP}}}, {UI_SPACER}, @@ -338,15 +355,20 @@ struct UIItem diaConfig[] = { {UI_ENUM, CFG_APPMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, +//START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_ELMMODE}}}, {UI_SPACER}, {UI_ENUM, CFG_ELMMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, +//END of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_DEFDEVICE}}}, {UI_SPACER}, {UI_ENUM, CFG_DEFDEVICE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, +//START of OPL_DB tweaks + // {UI_BREAK}, {UI_SPLITTER}, +//END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -431,7 +453,10 @@ struct UIItem diaUIConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_WIDE_SCREEN}}}, {UI_SPACER}, {UI_BOOL, UICFG_WIDESCREEN, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, +//START of OPL_DB tweaks + // {UI_BREAK}, {UI_SPLITTER}, +//END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -464,7 +489,10 @@ struct UIItem diaGSConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_YOFFSET}}}, {UI_SPACER}, {UI_INT, GSMCFG_GSMYOFFSET, 1, 1, _STR_HINT_YOFFSET, -5, 0, {.intvalue = {0, 0, -100, 100}}}, +//START of OPL_DB tweaks + // {UI_BREAK}, {UI_SPLITTER}, +//END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -562,7 +590,9 @@ struct UIItem diaCheatConfig[] = { // About Menu struct UIItem diaAbout[] = { {UI_LABEL, 1, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, +//START of OPL_DB tweaks {UI_BREAK}, +//END of OPL_DB tweaks {UI_SPLITTER}, // Coders @@ -570,38 +600,59 @@ struct UIItem diaAbout[] = { {UI_BREAK}, {UI_SPACER}, +//START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"BatRastard, crazyc, danielb, dlanor, doctorxyz, hominem.te.esse, ifcaro,", -1}}}, +//END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, +//START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"izdubar, Jay-Jay, jimmikaelkael, misfire, Polo35, reprep, SP193, volca,", -1}}}, +//END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, +//START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"... and the anonymous ...", -1}}}, +//END of OPL_DB tweaks {UI_BREAK}, +//START of OPL_DB tweaks {UI_SPLITTER}, +//END of OPL_DB tweaks + // Quality Assurance +//START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_QANDA}}}, +//END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, +//START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"algol, Berion, El_Patas, EP, gledson999, lee4, LocalH, RandQalan,", -1}}}, +//END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, +//START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"ShaolinAssassin, yoshi314, and zero35.", -1}}}, +//END of OPL_DB tweaks {UI_BREAK}, +//START of OPL_DB tweaks {UI_SPLITTER}, +//END of OPL_DB tweaks // Network update +//START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_NET_UPDATE}}}, +//END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, {UI_LABEL, 0, 1, 1, -1, 0, 15, {.label = {"icyson55", -1}}}, +//START of OPL_DB tweaks {UI_SPLITTER}, +//END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -624,7 +675,9 @@ struct UIItem diaVMC[] = { {UI_LABEL, 0, 1, 1, -1, -20, 0, {.label = {NULL, _STR_VMC_SIZE}}}, {UI_SPACER}, {UI_ENUM, VMC_SIZE, 1, 1, _STR_HINT_VMC_SIZE, 0, 0, {.intvalue = {0, 0}}}, +//START of OPL_DB tweaks {UI_SPLITTER}, +//END of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, -20, 0, {.label = {NULL, _STR_VMC_STATUS}}}, {UI_SPACER}, @@ -635,7 +688,9 @@ struct UIItem diaVMC[] = { {UI_SPACER}, {UI_INT, VMC_PROGRESS, 0, 1, -1, 0, 0, {.intvalue = {0, 0, 0, 100}}}, {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {"%", -1}}}, +//START of OPL_DB tweaks {UI_SPLITTER}, +//END of OPL_DB tweaks // buttons {UI_BUTTON, VMC_BUTTON_CREATE, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, @@ -661,7 +716,9 @@ struct UIItem diaNetCompatUpdate[] = { {UI_SPACER}, {UI_INT, NETUPD_PROGRESS, 0, 1, -1, 0, 0, {.intvalue = {0, 0, 0, 100}}}, {UI_LABEL, NETUPD_PROGRESS_PERC_LBL, 1, 1, -1, 0, 0, {.label = {"%", -1}}}, +//START of OPL_DB tweaks {UI_SPLITTER}, +//END of OPL_DB tweaks // buttons {UI_BUTTON, NETUPD_BTN_START, 1, 1, -1, 0, 0, {.label = {NULL, _STR_START}}}, diff --git a/src/ethsupport.c b/src/ethsupport.c index eb6379277..0e958c3b9 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -64,10 +64,12 @@ static int ethGetNetIFLinkStatus(void); static int ethInitSemaID = -1; +//START of OPL_DB tweaks char* ethGetPrefix(void){ return ethPrefix; } +//END of OPL_DB tweaks //Initializes locking semaphore for network support (not for just SMB support, but for the network subsystem). static int ethInitSema(void) { diff --git a/src/gui.c b/src/gui.c index 799e72611..da6a3cd4d 100644 --- a/src/gui.c +++ b/src/gui.c @@ -386,7 +386,9 @@ void guiShowConfig() diaSetEnum(diaConfig, CFG_HDDMODE, deviceModes); diaSetEnum(diaConfig, CFG_ETHMODE, deviceModes); diaSetEnum(diaConfig, CFG_APPMODE, deviceModes); +//START of OPL_DB tweaks diaSetEnum(diaConfig, CFG_ELMMODE, deviceModes); +//END of OPL_DB tweaks diaSetInt(diaConfig, CFG_DEBUG, gDisableDebug); diaSetInt(diaConfig, CFG_PS2LOGO, gPS2Logo); @@ -407,7 +409,9 @@ void guiShowConfig() diaSetInt(diaConfig, CFG_HDDMODE, gHDDStartMode); diaSetInt(diaConfig, CFG_ETHMODE, gETHStartMode); diaSetInt(diaConfig, CFG_APPMODE, gAPPStartMode); +//START of OPL_DB tweaks diaSetInt(diaConfig, CFG_ELMMODE, gELMStartMode); +//END of OPL_DB tweaks int ret = diaExecuteDialog(diaConfig, -1, 1, &guiUpdater); if (ret) { @@ -431,7 +435,9 @@ void guiShowConfig() diaGetInt(diaConfig, CFG_HDDMODE, &gHDDStartMode); diaGetInt(diaConfig, CFG_ETHMODE, &gETHStartMode); diaGetInt(diaConfig, CFG_APPMODE, &gAPPStartMode); +//START of OPL_DB tweaks diaGetInt(diaConfig, CFG_ELMMODE, &gELMStartMode); +//END of OPL_DB tweaks applyConfig(-1, -1); } @@ -1254,7 +1260,9 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_CONFIGSOURCE); configRemoveKey(configSet, CONFIG_ITEM_DMA); configRemoveKey(configSet, CONFIG_ITEM_COMPAT); +//START of OPL_DB tweaks configRemoveKey(configSet, CONFIG_ITEM_MODES); +//END of OPL_DB tweaks configRemoveKey(configSet, CONFIG_ITEM_DNAS); configRemoveKey(configSet, CONFIG_ITEM_ALTSTARTUP); #ifdef GSM @@ -1278,18 +1286,22 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) menuSaveConfig(); } else if (result > 0) { // test button pressed or save button compatMode = 0; +//START of OPL_DB tweaks char modesBuf[16];//(1+2+3+4+5+6+7+8)= 15 +1 null int modesBufPos = 0; for (i = 0; i < COMPAT_MODE_COUNT; ++i) { +//END of OPL_DB tweaks int mdpart; diaGetInt(diaCompatConfig, COMPAT_MODE_BASE + i, &mdpart); compatMode |= (mdpart ? 1 : 0) << i; +//START of OPL_DB tweaks if (mdpart){ if(modesBufPos == 0) modesBufPos+=sprintf(modesBuf + modesBufPos, "%d", i+1); else modesBufPos+=sprintf(modesBuf + modesBufPos, "+%d", i+1); } +//END of OPL_DB tweaks } if (support->flags & MODE_FLAG_COMPAT_DMA) { @@ -1300,6 +1312,7 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_DMA); } +//START of OPL_DB tweaks if (compatMode != 0){ configSetInt(configSet, CONFIG_ITEM_COMPAT, compatMode); configSetStr(configSet, CONFIG_ITEM_MODES, modesBuf); @@ -1307,6 +1320,7 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_COMPAT); configRemoveKey(configSet, CONFIG_ITEM_MODES); } +//END of OPL_DB tweaks #ifdef GSM diaGetInt(diaGSConfig, GSMCFG_ENABLEGSM, &EnableGSM); diff --git a/src/hddsupport.c b/src/hddsupport.c index 1fc7adf41..14b581812 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -53,10 +53,12 @@ const char *oplPart = "hdd0:+OPL"; // forward declaration static item_list_t hddGameList; +//START of OPL_DB tweaks char* hddGetPrefix(void){ return hddPrefix; } +//END of OPL_DB tweaks static void hddInitModules(void) { diff --git a/src/lang.c b/src/lang.c index 590211fa9..060e702a6 100644 --- a/src/lang.c +++ b/src/lang.c @@ -12,7 +12,9 @@ // Language support static char *internalEnglish[LANG_STR_COUNT] = { "English (internal)", +//START of OPL_DB tweaks "OPL %s", +//END of OPL_DB tweaks "Save changes", "Back", "Network config", @@ -76,7 +78,9 @@ static char *internalEnglish[LANG_STR_COUNT] = { "USB device start mode", "HDD device start mode", "ETH device start mode", +//START of OPL_DB tweaks "Applications menu display mode", +//END of OPL_DB tweaks "Auto", "Manual", "Start HDL Server", @@ -241,8 +245,10 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Pair DS3 controller with bluetooth adapter mac address.", "Not connected", #endif +//START of OPL_DB tweaks "ELF Loader Menu", "ELF Loader Menu display mode", +//END of OPL_DB tweaks }; static int guiLangID = 0; diff --git a/src/menusys.c b/src/menusys.c index f3b1be33c..7a7ffb845 100644 --- a/src/menusys.c +++ b/src/menusys.c @@ -628,7 +628,9 @@ void menuHandleInputMenu() if (getKeyOn(KEY_START) || getKeyOn(gSelectButton == KEY_CIRCLE ? KEY_CROSS : KEY_CIRCLE)) { //Check if there is anything to show the user, at all. +//START of OPL_DB tweaks if (gAPPStartMode || gELMStartMode || gETHStartMode || gUSBStartMode || gHDDStartMode) +//END of OPL_DB tweaks guiSwitchScreen(GUI_SCREEN_MAIN, TRANSITION_LEFT); } } diff --git a/src/opl.c b/src/opl.c index e0793fe48..d66a51980 100644 --- a/src/opl.c +++ b/src/opl.c @@ -28,7 +28,9 @@ #include "include/ethsupport.h" #include "include/hddsupport.h" #include "include/appsupport.h" +//START of OPL_DB tweaks #include "include/elmsupport.h" +//END of OPL_DB tweaks #ifdef CHEAT #include "include/pgcht.h" @@ -334,7 +336,9 @@ static void initAllSupport(int force_reinit) initSupport(ethGetObject(0), gETHStartMode, ETH_MODE, force_reinit || (gNetworkStartup >= ERROR_ETH_SMB_CONN)); initSupport(hddGetObject(0), gHDDStartMode, HDD_MODE, force_reinit); initSupport(appGetObject(0), gAPPStartMode, APP_MODE, force_reinit); +//START of OPL_DB tweaks initSupport(elmGetObject(0), gELMStartMode, ELM_MODE, force_reinit); +//END of OPL_DB tweaks } static void deinitAllSupport(int exception) @@ -343,7 +347,9 @@ static void deinitAllSupport(int exception) moduleCleanup(&list_support[ETH_MODE], exception); moduleCleanup(&list_support[HDD_MODE], exception); moduleCleanup(&list_support[APP_MODE], exception); +//START of OPL_DB tweaks moduleCleanup(&list_support[ELM_MODE], exception); +//END of OPL_DB tweaks } // ---------------------------------------------------------- @@ -575,7 +581,9 @@ static void _loadConfig() configGetInt(configOPL, CONFIG_OPL_HDD_MODE, &gHDDStartMode); configGetInt(configOPL, CONFIG_OPL_ETH_MODE, &gETHStartMode); configGetInt(configOPL, CONFIG_OPL_APP_MODE, &gAPPStartMode); +//START of OPL_DB tweaks configGetInt(configOPL, CONFIG_OPL_ELM_MODE, &gELMStartMode); +//END of OPL_DB tweaks } } @@ -655,8 +663,10 @@ static void _saveConfig() configSetInt(configOPL, CONFIG_OPL_HDD_MODE, gHDDStartMode); configSetInt(configOPL, CONFIG_OPL_ETH_MODE, gETHStartMode); configSetInt(configOPL, CONFIG_OPL_APP_MODE, gAPPStartMode); +//START of OPL_DB tweaks configSetInt(configOPL, CONFIG_OPL_ELM_MODE, gELMStartMode); +//END of OPL_DB tweaks configSetInt(configOPL, CONFIG_OPL_SWAP_SEL_BUTTON, gSelectButton == KEY_CIRCLE ? 0 : 1); } @@ -718,7 +728,9 @@ void applyConfig(int themeID, int langID) moduleUpdateMenu(ETH_MODE, changed); moduleUpdateMenu(HDD_MODE, changed); moduleUpdateMenu(APP_MODE, changed); +//START of OPL_DB tweaks moduleUpdateMenu(ELM_MODE, changed); +//END of OPL_DB tweaks } int loadConfig(int types) @@ -1147,7 +1159,9 @@ static void setDefaults(void) clearIOModuleT(&list_support[ETH_MODE]); clearIOModuleT(&list_support[HDD_MODE]); clearIOModuleT(&list_support[APP_MODE]); +//START of OPL_DB tweaks clearIOModuleT(&list_support[ELM_MODE]); +//END of OPL_DB tweaks gBaseMCDir = "mc?:OPL"; @@ -1203,11 +1217,13 @@ static void setDefaults(void) gHDDStartMode = START_MODE_DISABLED; gETHStartMode = START_MODE_DISABLED; gAPPStartMode = START_MODE_DISABLED; +//START of OPL_DB tweaks gELMStartMode = START_MODE_DISABLED; gDefaultBgColor[0] = 0x030; gDefaultBgColor[1] = 0x030; gDefaultBgColor[2] = 0x030; +//END of OPL_DB tweaks gDefaultTextColor[0] = 0x0ff; gDefaultTextColor[1] = 0x0ff; diff --git a/src/textures.c b/src/textures.c index 5df82b4a1..0523689b6 100644 --- a/src/textures.c +++ b/src/textures.c @@ -17,7 +17,9 @@ extern void *usb_png; extern void *hdd_png; extern void *eth_png; extern void *app_png; +//START of OPL_DB tweaks extern void *elm_png; +//END of OPL_DB tweaks extern void *cross_png; extern void *triangle_png; @@ -61,7 +63,9 @@ static texture_t internalDefault[TEXTURES_COUNT] = { {HDD_ICON, "hdd", &hdd_png}, {ETH_ICON, "eth", ð_png}, {APP_ICON, "app", &app_png}, +//START of OPL_DB tweaks {ELM_ICON, "elm", &elm_png}, +//END of OPL_DB tweaks {LEFT_ICON, "left", &left_png}, {RIGHT_ICON, "right", &right_png}, {UP_ICON, "up", &up_png}, diff --git a/src/themes.c b/src/themes.c index 81e7b392d..a883fc898 100644 --- a/src/themes.c +++ b/src/themes.c @@ -708,6 +708,7 @@ static void drawItemsList(struct menu_list *menu, struct submenu_list *item, con if (itemsList->decoratorImage) { GSTEXTURE *itemIconTex = getGameImageTexture(itemsList->decoratorImage->cache, menu->item->userdata, &ps->item); if (itemIconTex && itemIconTex->Mem) +//START of OPL_DB tweaks rmDrawPixmap(itemIconTex, posX, posY, elem->aligned, DECORATOR_SIZE, DECORATOR_SIZE, elem->scaled, gDefaultCol); else { if (itemsList->decoratorImage->defaultTexture) @@ -716,6 +717,7 @@ static void drawItemsList(struct menu_list *menu, struct submenu_list *item, con fntRenderString(elem->font, elem->posX + DECORATOR_SIZE, posY, elem->aligned, elem->width, elem->height, submenuItemGetText(&ps->item), color); } else fntRenderString(elem->font, elem->posX, posY, elem->aligned, elem->width, elem->height, submenuItemGetText(&ps->item), color); +//END of OPL_DB tweaks posY += MENU_ITEM_HEIGHT; ps = ps->next; diff --git a/src/usbsupport.c b/src/usbsupport.c index 3ed78cdec..968f7ae34 100644 --- a/src/usbsupport.c +++ b/src/usbsupport.c @@ -44,10 +44,12 @@ static base_game_info_t *usbGames; // forward declaration static item_list_t usbGameList; +//START of OPL_DB tweaks char* usbGetPrefix(void){ return usbPrefix; } +//END of OPL_DB tweaks //Identifies the partition that the specified file is stored on and generates a full path to it. int usbFindPartition(char *target, char *name) { From c753caad2381f9cc172721ab6c3c4cb864d707a7 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 12 Jul 2017 02:09:51 -0700 Subject: [PATCH 048/269] Following changes were made: SP193: Fix for HDD deinit, avoid linking to thread and TLB patches and updated IOP reboot code. (#51) * Close all files upon deinit of HDD support, to prevent potential risks of corrupting the HDD. * Updated calls to Exit, LoadExecPS2 and ExecPS2, and added custom kernel syscall definitions to avoid linking to the new kernel patches. * Updated SifIopReset to not use NULL as an argument and to support the new SIFCMD header. SP193: Updated IGR to support the new PS2SDK thread patch. (#52) SP193: (IGR fix) Added missing update to Reset_Iop within padhook. (#53) belek666: Updates and fixes for pademu/mcemu and other small changes (#54) Changes in files: *Makefile - bugfix: pass vmc flags/pademu flags to pademu/mcemu modules so they can be properly build *ee_core/src/iopmgr.c - letting know pademu if mcemu was loaded *elfldr/elfldr.c - when app was started from hdd pass partition name to the elfs argument *modules/ds3bt & modules/ds3usb - cleanups - ds3bt: more proper disconnetion command - add functions to deinit libraries *modules/mcemu - bugfix: add pademu flags - get pademu exported function in hooked RegisterLibraryEntires call - in hookRegisterLibraryEntires function: first call original RegisterLibraryEntires and check if it returns any error, if ok unregister library, hook library calls and call RegisterLibraryEntires function again (fix for vmc/pademu in games which try to load sio2man/mcman modules twice or more, e.g. Lemmings, Worms3D) *modules/pademu - bugfix: add vmc flags - changes in hookRegisterLibraryEntires, same as in mcemu - in usb_pademu: in some games usb transfer may hangs causing ds3 to not responsing, timeout was added to workaround that - in usb_pademu/bt_pademu: add simple delay when changing pad mode - cleanups *src/gui.c - add pademu string to about screen *src/system.c - in IOP Usage screen: add VMC string only when mcemu module will be used, add pademu string - add ds3usb/ds3bt resets, do not load them when usbd module was not loaded SP193: Module update: refactored custom IOP module code to allow OPL to use the PS2SDK's DEV9, ATAD, HDPro ATAD and USBHDFSD modules directly. Updated in-game DEV9, SMAP, ATAD and HDPro ATAD. (#55) * (Phase 1A - HDD support in UI) Removed custom HDD modules, moving platform-specific code into xhdd.irx. * (Phase 1B - USB support in UI) Removed custom USBHDFSD module and updated to use new USBHDFSD API. * (Phase 2A - in-game DEV9) Updated ingame dev9 code to not use the custom ioman header, use SA_THPRI for sema attr and to undo my old customizations to dev9. * (Phase 2B - in-game ATAD) Updated in-game ATAD module to have the modern ATAD module design. * (Phase 2D - In-game SMAP) Updated SMAP code to use the new EMAC3_GET32/SET32 macros and to improve code for clarity.. * (Phase 2C - in-game HDPro ATAD) Updated HDPro in-game code to share the same properties as the atad code. * (Phase 3) Cleaned up HDD support code: * hddsupport uses hddCheck instead of its own check on the HDD status. * Updated DEVCTL function call names. * Updated to use the argument structures, rather than arrays. * Removed unmount/re-mount operation around the code that gets the VMC partition information. --- DETAILED_CHANGELOG | 1 + Makefile | 73 +- ee_core/Makefile | 6 +- ee_core/include/iopmgr.h | 12 - ee_core/include/syscallnr_custom.h | 9 + ee_core/src/asm.S | 2 +- ee_core/src/iopmgr.c | 32 +- ee_core/src/main.c | 4 +- ee_core/src/padhook.c | 14 +- ee_core/src/syshook.c | 14 +- elfldr/Makefile | 7 +- elfldr/elfldr.c | 41 +- elfldr/syscallnr_custom.h | 9 + include/hdd.h | 89 + include/hddsupport.h | 82 +- include/opl.h | 1 + include/supportbase.h | 1 + include/usb-ioctl.h | 3 +- labs/genvmclab/genvmclab.c | 2 +- labs/hdldsvrlab/hdldsvrlab.c | 2 +- labs/smblab/smblab.c | 2 +- modules/dev9/README | 2 - modules/dev9/dev9.h | 55 - modules/dev9/exports.tab | 20 - modules/dev9/imports.lst | 55 - modules/dev9/ioman_add.h | 46 - modules/dev9/irx_imports.h | 35 - modules/dev9/ps2dev9.c | 1161 --------- modules/ds3bt/ee/libds3bt.c | 21 +- modules/ds3bt/ee/libds3bt.h | 1 + modules/ds3bt/iop/ds3bt.c | 258 +- modules/ds3bt/iop/ds3bt.h | 3 +- modules/ds3bt/iop/imports.lst | 21 - modules/ds3usb/ee/libds3usb.c | 11 +- modules/ds3usb/ee/libds3usb.h | 1 + modules/ds3usb/iop/ds3usb.c | 49 +- modules/ds3usb/iop/imports.lst | 21 - modules/hdd/apa/Makefile | 23 - modules/hdd/apa/apa-opt.h | 23 - modules/hdd/apa/hdd.c | 252 -- modules/hdd/apa/hdd.h | 31 - modules/hdd/apa/hdd_fio.c | 1018 -------- modules/hdd/apa/hdd_fio.h | 33 - modules/hdd/apa/imports.lst | 67 - modules/hdd/apa/irx_imports.h | 31 - modules/hdd/atad/Makefile | 22 - modules/hdd/atad/exports.tab | 29 - modules/hdd/atad/imports.lst | 34 - modules/hdd/atad/irx_imports.h | 27 - modules/hdd/atad/ps2atad.c | 1092 --------- modules/hdd/common/atad.h | 81 - modules/hdd/common/opl-hdd-ioctl.h | 20 +- modules/hdd/hdldsvr/hdldsvr.c | 63 +- modules/hdd/hdldsvr/imports.lst | 16 +- modules/hdd/hdldsvr/irx_imports.h | 4 +- modules/hdd/hdpro_atad/Makefile | 22 - modules/hdd/hdpro_atad/exports.tab | 38 - modules/hdd/hdpro_atad/hdproatad.c | 927 ------- modules/hdd/hdpro_atad/imports.lst | 32 - modules/hdd/hdpro_atad/irx_imports.h | 27 - modules/hdd/libapa/include/libapa.h | 181 -- modules/hdd/libapa/src/apa.c | 466 ---- modules/hdd/libapa/src/cache.c | 189 -- modules/hdd/libapa/src/free.c | 74 - modules/hdd/libapa/src/journal.c | 82 - modules/hdd/libapa/src/misc.c | 73 - modules/hdd/libapa/src/password.c | 494 ---- modules/hdd/libpfs/include/libpfs.h | 338 --- modules/hdd/libpfs/src/bitmap.c | 356 --- modules/hdd/libpfs/src/block.c | 91 - modules/hdd/libpfs/src/blockWrite.c | 141 -- modules/hdd/libpfs/src/cache.c | 252 -- modules/hdd/libpfs/src/dir.c | 682 ------ modules/hdd/libpfs/src/inode.c | 125 - modules/hdd/libpfs/src/journal.c | 142 -- modules/hdd/libpfs/src/misc.c | 219 -- modules/hdd/libpfs/src/super.c | 52 - modules/hdd/libpfs/src/superWrite.c | 243 -- modules/hdd/pfs/Makefile | 24 - modules/hdd/pfs/imports.lst | 54 - modules/hdd/pfs/irx_imports.h | 29 - modules/hdd/pfs/pfs-opt.h | 7 - modules/hdd/pfs/pfs.c | 216 -- modules/hdd/pfs/pfs.h | 66 - modules/hdd/pfs/pfs_fio.c | 1190 --------- modules/hdd/pfs/pfs_fio.h | 54 - modules/hdd/pfs/pfs_fioctl.c | 341 --- modules/hdd/pfs/pfs_fioctl.h | 23 - modules/{dev9 => hdd/xhdd}/Makefile | 20 +- modules/hdd/xhdd/hdpro.c | 11 + modules/hdd/xhdd/imports.lst | 13 + modules/hdd/xhdd/irx_imports.h | 10 + modules/hdd/xhdd/xatad.c | 80 + modules/hdd/xhdd/xhdd.c | 94 + modules/hdd/xhdd/xhdd.h | 2 + modules/iopcore/cdvdman/atad.c | 221 +- modules/iopcore/cdvdman/atad.h | 24 +- modules/iopcore/cdvdman/dev9.c | 63 +- modules/iopcore/cdvdman/dev9.h | 2 + modules/iopcore/cdvdman/hdpro_atad.c | 320 +-- modules/iopcore/cdvdman/imports.lst | 7 +- modules/mcemu/Makefile | 4 + modules/mcemu/imports.lst | 1 + modules/mcemu/mcemu.c | 56 +- modules/network/smap-ingame/smap.c | 129 +- modules/network/smap-ingame/xfer.c | 4 +- modules/pademu/Makefile | 3 + modules/pademu/ds3bt.c | 182 +- modules/pademu/ds3usb.c | 109 +- modules/pademu/imports.lst | 7 + modules/pademu/pademu.c | 28 +- modules/usb/usbhdfsd/LICENSE | 166 -- modules/usb/usbhdfsd/Makefile | 38 - modules/usb/usbhdfsd/doc/README.TXT | 22 - modules/usb/usbhdfsd/doc/usb_mass/README.TXT | 125 - modules/usb/usbhdfsd/exports.tab | 12 - modules/usb/usbhdfsd/fat.h | 160 -- modules/usb/usbhdfsd/fat_driver.c | 1054 -------- modules/usb/usbhdfsd/fat_driver.h | 110 - modules/usb/usbhdfsd/fat_write.c | 2296 ------------------ modules/usb/usbhdfsd/fat_write.h | 15 - modules/usb/usbhdfsd/fs_driver.c | 865 ------- modules/usb/usbhdfsd/imports.lst | 55 - modules/usb/usbhdfsd/irx_imports.h | 26 - modules/usb/usbhdfsd/mass_debug.h | 10 - modules/usb/usbhdfsd/mass_stor.h | 29 - modules/usb/usbhdfsd/part_driver.c | 128 - modules/usb/usbhdfsd/part_driver.h | 7 - modules/usb/usbhdfsd/scache.c | 362 --- modules/usb/usbhdfsd/scache.h | 14 - modules/usb/usbhdfsd/usb_driver.c | 1117 --------- modules/usb/usbhdfsd/usbhd_common.h | 36 - modules/usb/usbhdfsd/usbhdfsd.c | 76 - modules/usb/usbhdfsd/usbhdfsd.h | 7 - modules/usb/usbhdfsdfsv/Makefile | 2 +- modules/usb/usbhdfsdfsv/imports.lst | 6 + modules/usb/usbhdfsdfsv/irx_imports.h | 1 + modules/usb/usbhdfsdfsv/main.c | 117 +- src/gui.c | 3 + src/hdd.c | 108 +- src/hddsupport.c | 75 +- src/opl.c | 16 +- src/supportbase.c | 2 +- src/system.c | 32 +- src/usbsupport.c | 79 +- 145 files changed, 1677 insertions(+), 19166 deletions(-) create mode 100644 ee_core/include/syscallnr_custom.h create mode 100644 elfldr/syscallnr_custom.h delete mode 100755 modules/dev9/README delete mode 100755 modules/dev9/dev9.h delete mode 100755 modules/dev9/exports.tab delete mode 100755 modules/dev9/imports.lst delete mode 100644 modules/dev9/ioman_add.h delete mode 100755 modules/dev9/irx_imports.h delete mode 100644 modules/dev9/ps2dev9.c delete mode 100644 modules/hdd/apa/Makefile delete mode 100644 modules/hdd/apa/apa-opt.h delete mode 100644 modules/hdd/apa/hdd.c delete mode 100644 modules/hdd/apa/hdd.h delete mode 100644 modules/hdd/apa/hdd_fio.c delete mode 100644 modules/hdd/apa/hdd_fio.h delete mode 100644 modules/hdd/apa/imports.lst delete mode 100644 modules/hdd/apa/irx_imports.h delete mode 100755 modules/hdd/atad/Makefile delete mode 100755 modules/hdd/atad/exports.tab delete mode 100755 modules/hdd/atad/imports.lst delete mode 100755 modules/hdd/atad/irx_imports.h delete mode 100644 modules/hdd/atad/ps2atad.c delete mode 100644 modules/hdd/common/atad.h delete mode 100755 modules/hdd/hdpro_atad/Makefile delete mode 100755 modules/hdd/hdpro_atad/exports.tab delete mode 100644 modules/hdd/hdpro_atad/hdproatad.c delete mode 100755 modules/hdd/hdpro_atad/imports.lst delete mode 100755 modules/hdd/hdpro_atad/irx_imports.h delete mode 100644 modules/hdd/libapa/include/libapa.h delete mode 100644 modules/hdd/libapa/src/apa.c delete mode 100644 modules/hdd/libapa/src/cache.c delete mode 100644 modules/hdd/libapa/src/free.c delete mode 100644 modules/hdd/libapa/src/journal.c delete mode 100644 modules/hdd/libapa/src/misc.c delete mode 100644 modules/hdd/libapa/src/password.c delete mode 100644 modules/hdd/libpfs/include/libpfs.h delete mode 100644 modules/hdd/libpfs/src/bitmap.c delete mode 100644 modules/hdd/libpfs/src/block.c delete mode 100644 modules/hdd/libpfs/src/blockWrite.c delete mode 100644 modules/hdd/libpfs/src/cache.c delete mode 100644 modules/hdd/libpfs/src/dir.c delete mode 100644 modules/hdd/libpfs/src/inode.c delete mode 100644 modules/hdd/libpfs/src/journal.c delete mode 100644 modules/hdd/libpfs/src/misc.c delete mode 100644 modules/hdd/libpfs/src/super.c delete mode 100644 modules/hdd/libpfs/src/superWrite.c delete mode 100644 modules/hdd/pfs/Makefile delete mode 100644 modules/hdd/pfs/imports.lst delete mode 100644 modules/hdd/pfs/irx_imports.h delete mode 100644 modules/hdd/pfs/pfs-opt.h delete mode 100644 modules/hdd/pfs/pfs.c delete mode 100644 modules/hdd/pfs/pfs.h delete mode 100644 modules/hdd/pfs/pfs_fio.c delete mode 100644 modules/hdd/pfs/pfs_fio.h delete mode 100644 modules/hdd/pfs/pfs_fioctl.c delete mode 100644 modules/hdd/pfs/pfs_fioctl.h rename modules/{dev9 => hdd/xhdd}/Makefile (55%) mode change 100755 => 100644 create mode 100644 modules/hdd/xhdd/hdpro.c create mode 100644 modules/hdd/xhdd/imports.lst create mode 100644 modules/hdd/xhdd/irx_imports.h create mode 100644 modules/hdd/xhdd/xatad.c create mode 100644 modules/hdd/xhdd/xhdd.c create mode 100644 modules/hdd/xhdd/xhdd.h delete mode 100755 modules/usb/usbhdfsd/LICENSE delete mode 100755 modules/usb/usbhdfsd/Makefile delete mode 100755 modules/usb/usbhdfsd/doc/README.TXT delete mode 100755 modules/usb/usbhdfsd/doc/usb_mass/README.TXT delete mode 100644 modules/usb/usbhdfsd/exports.tab delete mode 100644 modules/usb/usbhdfsd/fat.h delete mode 100644 modules/usb/usbhdfsd/fat_driver.c delete mode 100644 modules/usb/usbhdfsd/fat_driver.h delete mode 100644 modules/usb/usbhdfsd/fat_write.c delete mode 100644 modules/usb/usbhdfsd/fat_write.h delete mode 100644 modules/usb/usbhdfsd/fs_driver.c delete mode 100644 modules/usb/usbhdfsd/imports.lst delete mode 100644 modules/usb/usbhdfsd/irx_imports.h delete mode 100644 modules/usb/usbhdfsd/mass_debug.h delete mode 100644 modules/usb/usbhdfsd/mass_stor.h delete mode 100644 modules/usb/usbhdfsd/part_driver.c delete mode 100644 modules/usb/usbhdfsd/part_driver.h delete mode 100644 modules/usb/usbhdfsd/scache.c delete mode 100644 modules/usb/usbhdfsd/scache.h delete mode 100644 modules/usb/usbhdfsd/usb_driver.c delete mode 100644 modules/usb/usbhdfsd/usbhd_common.h delete mode 100644 modules/usb/usbhdfsd/usbhdfsd.c delete mode 100644 modules/usb/usbhdfsd/usbhdfsd.h diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index efcf70714..368e9d9ca 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1006 - Jay-Jay-OPL - define DB custom changes - Tue Jul 11 18:44:42 2017 -0700 rev1005 - Jay-Jay-OPL - belek66 did the following changes: - use module export table to reset ds3 (remove pademu rpc in ee_core) - use thread to read data/set vibration in ds3bt module (can be disabled in Makefile) - emulating analog button (changing pad mode by pressing PS+START buttons) - option to compile pademu modules without using sms_utils (remove -DUSE_SMSUTILS in Makefile) to make them usable in others apps - in gui: saving bt adapter mac address, now pairing DS3 is posible without connected bt adapter - Fri Jun 23 22:07:32 2017 -0700 rev1004 - Jay-Jay-OPL - small edit to credits. - Tue May 30 23:11:06 2017 -0700 rev1003 - Jay-Jay-OPL - SP193 commit: (ATAD) Fixed Makefile include paths so that the custom atad.h header will be used. Fixed atad.h to have fitting declarations for ata_io_start and ata_device_sector_io. - Tue May 30 23:03:36 2017 -0700 diff --git a/Makefile b/Makefile index cf251cbf3..69a06d819 100755 --- a/Makefile +++ b/Makefile @@ -69,6 +69,7 @@ endif OPL_VERSION = $(VERSION).$(SUBVERSION).$(PATCHLEVEL).$(REVISION)$(if $(EXTRAVERSION),-$(EXTRAVERSION))$(if $(GIT_HASH),-$(GIT_HASH))$(if $(DIRTY),$(DIRTY))$(if $(LOCALVERSION),-$(LOCALVERSION)) +#START of OPL_DB tweaks FRONTEND_OBJS = pad.o fntsys.o renderman.o menusys.o OSDHistory.o system.o lang.o config.o hdd.o dialogs.o \ dia.o ioman.o texcache.o themes.o supportbase.o usbsupport.o ethsupport.o hddsupport.o \ appsupport.o elmsupport.o gui.o textures.o opl.o atlas.o nbns.o httpclient.o @@ -79,10 +80,11 @@ GFX_OBJS = usb_icon.o hdd_icon.o eth_icon.o app_icon.o elm_icon.o \ load0.o load1.o load2.o load3.o load4.o load5.o load6.o load7.o logo.o bg_overlay.o freesans.o \ icon_sys.o icon_icn.o +#END of OPL_DB tweaks MISC_OBJS = icon_sys_A.o icon_sys_J.o IOP_OBJS = iomanx.o filexio.o ps2fs.o usbd.o usbhdfsd.o usbhdfsdfsv.o \ - ps2atad.o hdpro_atad.o poweroff.o ps2hdd.o genvmc.o hdldsvr.o \ + ps2atad.o hdpro_atad.o poweroff.o ps2hdd.o xhdd.o genvmc.o hdldsvr.o \ ps2dev9.o smsutils.o ps2ip.o smap.o isofs.o nbns-iop.o \ httpclient-iop.o netman.o ps2ips.o @@ -277,12 +279,8 @@ clean: $(MAKE) -C modules/iopcore/cdvdfsv clean echo " -isofs" $(MAKE) -C modules/isofs clean - echo " -usbhdfsd" - $(MAKE) -C modules/usb/usbhdfsd clean echo " -usbhdfsdfsv" $(MAKE) -C modules/usb/usbhdfsdfsv clean - echo " -ps2dev9" - $(MAKE) -C modules/dev9 clean echo " -SMSUTILS" $(MAKE) -C modules/network/SMSUTILS clean echo " -SMSTCPIP" @@ -295,14 +293,8 @@ clean: $(MAKE) -C modules/network/nbns clean echo " -httpclient" $(MAKE) -C modules/network/httpclient clean - echo " -ps2atad" - $(MAKE) -C modules/hdd/atad clean - echo " -hdpro_atad" - $(MAKE) -C modules/hdd/hdpro_atad clean - echo " -ps2hdd" - $(MAKE) -C modules/hdd/apa clean - echo " -ps2fs" - $(MAKE) -C modules/hdd/pfs clean + echo " -xhdd" + $(MAKE) -C modules/hdd/xhdd clean echo " -mcemu" $(MAKE) -C modules/mcemu USE_USB=1 clean $(MAKE) -C modules/mcemu USE_HDD=1 clean @@ -436,21 +428,21 @@ $(EE_ASM_DIR)cdvdfsv.s: modules/iopcore/cdvdfsv/cdvdfsv.irx | $(EE_ASM_DIR) modules/mcemu/usb_mcemu.irx: modules/mcemu echo " -usb_mcemu" - $(MAKE) $(MCEMU_DEBUG_FLAGS) USE_USB=1 -C $< rebuild + $(MAKE) $(MCEMU_DEBUG_FLAGS) $(PADEMU_FLAGS) USE_USB=1 -C $< rebuild $(EE_ASM_DIR)usb_mcemu.s: modules/mcemu/usb_mcemu.irx $(BIN2S) $< $@ usb_mcemu_irx modules/mcemu/hdd_mcemu.irx: modules/mcemu echo " -hdd_mcemu" - $(MAKE) $(MCEMU_DEBUG_FLAGS) USE_HDD=1 -C $< rebuild + $(MAKE) $(MCEMU_DEBUG_FLAGS) $(PADEMU_FLAGS) USE_HDD=1 -C $< rebuild $(EE_ASM_DIR)hdd_mcemu.s: modules/mcemu/hdd_mcemu.irx $(BIN2S) $< $@ hdd_mcemu_irx modules/mcemu/smb_mcemu.irx: modules/mcemu echo " -smb_mcemu" - $(MAKE) $(MCEMU_DEBUG_FLAGS) USE_SMB=1 -C $< rebuild + $(MAKE) $(MCEMU_DEBUG_FLAGS) $(PADEMU_FLAGS) USE_SMB=1 -C $< rebuild $(EE_ASM_DIR)smb_mcemu.s: modules/mcemu/smb_mcemu.irx $(BIN2S) $< $@ smb_mcemu_irx @@ -465,10 +457,6 @@ $(EE_ASM_DIR)isofs.s: modules/isofs/isofs.irx | $(EE_ASM_DIR) $(EE_ASM_DIR)usbd.s: $(PS2SDK)/iop/irx/usbd.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ usbd_irx -modules/usb/usbhdfsd/usbhdfsd.irx: modules/usb/usbhdfsd - echo " -usbhdfsd" - $(MAKE) -C $< - $(EE_OBJS_DIR)libds3bt.a: modules/ds3bt/ee/libds3bt.a cp $< $@ @@ -497,19 +485,19 @@ $(EE_ASM_DIR)ds3usb.s: modules/ds3usb/iop/ds3usb.irx | $(EE_ASM_DIR) modules/pademu/bt_pademu.irx: modules/pademu echo " -bt_pademu" - $(MAKE) -C $< USE_BT=1 + $(MAKE) -C $< $(VMC_FLAGS) USE_BT=1 $(EE_ASM_DIR)bt_pademu.s: modules/pademu/bt_pademu.irx $(BIN2S) $< $@ bt_pademu_irx modules/pademu/usb_pademu.irx: modules/pademu echo " -usb_pademu" - $(MAKE) -C $< USE_USB=1 + $(MAKE) -C $< $(VMC_FLAGS) USE_USB=1 $(EE_ASM_DIR)usb_pademu.s: modules/pademu/usb_pademu.irx $(BIN2S) $< $@ usb_pademu_irx -$(EE_ASM_DIR)usbhdfsd.s: modules/usb/usbhdfsd/usbhdfsd.irx | $(EE_ASM_DIR) +$(EE_ASM_DIR)usbhdfsd.s: $(PS2SDK)/iop/irx/usbhdfsd.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ usbhdfsd_irx modules/usb/usbhdfsdfsv/usbhdfsdfsv.irx: modules/usb/usbhdfsdfsv @@ -519,11 +507,7 @@ modules/usb/usbhdfsdfsv/usbhdfsdfsv.irx: modules/usb/usbhdfsdfsv $(EE_ASM_DIR)usbhdfsdfsv.s: modules/usb/usbhdfsdfsv/usbhdfsdfsv.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ usbhdfsdfsv_irx -modules/dev9/ps2dev9.irx: modules/dev9 - echo " -ps2dev9" - $(MAKE) -C $< - -$(EE_ASM_DIR)ps2dev9.s: modules/dev9/ps2dev9.irx | $(EE_ASM_DIR) +$(EE_ASM_DIR)ps2dev9.s: $(PS2SDK)/iop/irx/ps2dev9.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ ps2dev9_irx modules/network/SMSUTILS/SMSUTILS.irx: modules/network/SMSUTILS @@ -569,30 +553,28 @@ modules/network/smbinit/smbinit.irx: modules/network/smbinit $(EE_ASM_DIR)smbinit.s: modules/network/smbinit/smbinit.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ smbinit_irx -modules/hdd/atad/ps2atad.irx: modules/hdd/atad - echo " -ps2atad" - $(MAKE) -C $< - -$(EE_ASM_DIR)ps2atad.s: modules/hdd/atad/ps2atad.irx | $(EE_ASM_DIR) +$(EE_ASM_DIR)ps2atad.s: $(PS2SDK)/iop/irx/ps2atad.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ ps2atad_irx -modules/hdd/hdpro_atad/hdpro_atad.irx: modules/hdd/hdpro_atad - echo " -hdpro_atad" - $(MAKE) -C $< - -$(EE_ASM_DIR)hdpro_atad.s: modules/hdd/hdpro_atad/hdpro_atad.irx | $(EE_ASM_DIR) +$(EE_ASM_DIR)hdpro_atad.s: $(PS2SDK)/iop/irx/hdproatad.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ hdpro_atad_irx $(EE_ASM_DIR)poweroff.s: $(PS2SDK)/iop/irx/poweroff.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ poweroff_irx -modules/hdd/apa/ps2hdd.irx: modules/hdd/apa - echo " -ps2hdd" +modules/hdd/xhdd/xhdd.irx: modules/hdd/xhdd + echo " -xhdd" $(MAKE) -C $< -$(EE_ASM_DIR)ps2hdd.s: modules/hdd/apa/ps2hdd.irx | $(EE_ASM_DIR) +$(EE_ASM_DIR)xhdd.s: modules/hdd/xhdd/xhdd.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ xhdd_irx + +$(EE_ASM_DIR)ps2hdd.s: $(PS2SDK)/iop/irx/ps2hdd-osd.irx $(BIN2S) $< $@ ps2hdd_irx +$(EE_ASM_DIR)ps2fs.s: $(PS2SDK)/iop/irx/ps2fs-osd.irx + $(BIN2S) $< $@ ps2fs_irx + modules/vmc/genvmc/genvmc.irx: modules/vmc/genvmc echo " -genvmc" $(MAKE) $(MOD_DEBUG_FLAGS) -C $< @@ -649,13 +631,6 @@ modules/network/httpclient/httpclient.irx: modules/network/httpclient $(EE_ASM_DIR)httpclient-iop.s: modules/network/httpclient/httpclient.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ httpclient_irx -modules/hdd/pfs/ps2fs.irx: modules/hdd/pfs - echo " -ps2fs" - $(MAKE) -C $< - -$(EE_ASM_DIR)ps2fs.s: modules/hdd/pfs/ps2fs.irx | $(EE_ASM_DIR) - $(BIN2S) $< $@ ps2fs_irx - $(EE_ASM_DIR)iomanx.s: $(PS2SDK)/iop/irx/iomanX.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ iomanx_irx @@ -716,8 +691,10 @@ $(EE_ASM_DIR)eth_icon.s: gfx/eth.png | $(EE_ASM_DIR) $(EE_ASM_DIR)app_icon.s: gfx/app.png | $(EE_ASM_DIR) $(BIN2S) $< $@ app_png +#START of OPL_DB tweaks $(EE_ASM_DIR)elm_icon.s: gfx/elm.png | $(EE_ASM_DIR) $(BIN2S) $< $@ elm_png +#END of OPL_DB tweaks $(EE_ASM_DIR)cross_icon.s: gfx/cross.png | $(EE_ASM_DIR) $(BIN2S) $< $@ cross_png diff --git a/ee_core/Makefile b/ee_core/Makefile index d39289e00..a4210c206 100755 --- a/ee_core/Makefile +++ b/ee_core/Makefile @@ -16,9 +16,10 @@ EE_OBJS_DIR = obj/ GSMCORE_EE_OBJS = gsm_engine.o gsm_api.o IGSCORE_EE_OBJS = igs_api.o CHEATCORE_EE_OBJS = cheat_engine.o cheat_api.o +KERNEL_OBJS = iWakeupThread.o #iWakeupThread is used by SIFRPC. This prevents the thread patch from libkernel from being linked to. EE_OBJS = main.o syshook.o iopmgr.o modmgr.o util.o patches.o patches_asm.o \ - padhook.o spu.o tlb.o asm.o crt0.o + padhook.o spu.o tlb.o asm.o crt0.o $(KERNEL_OBJS) MAPFILE = ee_core.map EE_INCS := -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -Iinclude -I. @@ -102,5 +103,8 @@ clean: clean_all: rm -f -r $(EE_OBJS_DIR) $(EE_BIN) $(MAPFILE) +$(KERNEL_OBJS:%=$(EE_OBJS_DIR)%): $(EE_SRC_DIR)kernel_custom.S + @mkdir -p $(EE_OBJS_DIR) + $(EE_CC) $(EE_CFLAGS) -DF_$(*:$(EE_OBJS_DIR)%=%) $< -c -o $@ include $(PS2SDK)/samples/Makefile.pref diff --git a/ee_core/include/iopmgr.h b/ee_core/include/iopmgr.h index 1c37a8ce8..68c42ca94 100644 --- a/ee_core/include/iopmgr.h +++ b/ee_core/include/iopmgr.h @@ -10,18 +10,6 @@ #ifndef IOPMGR_H #define IOPMGR_H -#define RESET_ARG_MAX 79 - -struct _iop_reset_pkt -{ - struct t_SifCmdHeader header; - int arglen; - int mode; - char arg[RESET_ARG_MAX + 1]; -} ALIGNED(16); - -void InitSIF0(void); -void SyncSIF0(void); int New_Reset_Iop(const char *arg, int arglen); int Reset_Iop(const char *arg, int flag); diff --git a/ee_core/include/syscallnr_custom.h b/ee_core/include/syscallnr_custom.h new file mode 100644 index 000000000..63d43cf02 --- /dev/null +++ b/ee_core/include/syscallnr_custom.h @@ -0,0 +1,9 @@ +#ifndef _SYSCALLNR_H_ +#define _SYSCALLNR_H_ + +/* + * This file contains the system call numbers, similar to asm/unistd.h on Linux. + */ +#define __NR_iWakeupThread (-0x34) + +#endif /* _SYSCALLNR_H_ */ diff --git a/ee_core/src/asm.S b/ee_core/src/asm.S index e8d7d7104..16a1eb28c 100755 --- a/ee_core/src/asm.S +++ b/ee_core/src/asm.S @@ -217,7 +217,7 @@ _LoadExecPS2: daddu $a1, $zero, $zero daddu $a2, $zero, $zero daddu $a3, $zero, $zero - addiu $v1, $zero, __NR_ExecPS2 + addiu $v1, $zero, __NR__ExecPS2 syscall nop diff --git a/ee_core/src/iopmgr.c b/ee_core/src/iopmgr.c index 66e719ddd..95988ea3f 100644 --- a/ee_core/src/iopmgr.c +++ b/ee_core/src/iopmgr.c @@ -122,7 +122,7 @@ int New_Reset_Iop(const char *arg, int arglen) iop_reboot_count++; // Reseting IOP. - while (!Reset_Iop(NULL, 0)) { + while (!Reset_Iop("", 0)) { ; } while (!SifIopSync()) { @@ -144,15 +144,19 @@ int New_Reset_Iop(const char *arg, int arglen) GS_BGCOLOUR = 0x00FFFF; //Yellow } +#ifdef VMC + if (iop_reboot_count >= 2) { #ifdef PADEMU - if (iop_reboot_count >= 2 && EnablePadEmuOp) { - LoadOPLModule(OPL_MODULE_ID_PADEMU, 0, 4, (char *)&PadEmuSettings); + PadEmuSettings |= (LoadOPLModule(OPL_MODULE_ID_MCEMU, 0, 0, NULL) > 0) << 24; +#else + LoadOPLModule(OPL_MODULE_ID_MCEMU, 0, 0, NULL); +#endif } #endif -#ifdef VMC - if (iop_reboot_count >= 2) { - LoadOPLModule(OPL_MODULE_ID_MCEMU, 0, 0, NULL); +#ifdef PADEMU + if (iop_reboot_count >= 2 && EnablePadEmuOp) { + LoadOPLModule(OPL_MODULE_ID_PADEMU, 0, 4, (char *)&PadEmuSettings); } #endif @@ -183,8 +187,9 @@ int New_Reset_Iop(const char *arg, int arglen) /*----------------------------------------------------------------------------------------*/ int Reset_Iop(const char *arg, int mode) { - struct _iop_reset_pkt reset_pkt; /* Implicitly aligned. */ + static SifCmdResetData_t reset_pkt __attribute__((aligned(64))); struct t_SifDmaTransfer dmat; + int arglen; _iop_reboot_count++; // increment reboot counter to allow RPC clients to detect unbinding! @@ -200,18 +205,13 @@ int Reset_Iop(const char *arg, int mode) That caused SifSetDChain() to be run ASAP, which re-enables SIF0. I don't find that a good workaround because it may result in a timing problem. */ - memset(&reset_pkt, 0, sizeof reset_pkt); + for(arglen = 0; arg[arglen] != '\0'; arglen++) + reset_pkt.arg[arglen] = arg[arglen]; - reset_pkt.header.size = sizeof reset_pkt; + reset_pkt.header.psize = sizeof reset_pkt; //dsize is not initialized (and not processed, even on the IOP). reset_pkt.header.cid = SIF_CMD_RESET_CMD; - + reset_pkt.arglen = arglen; reset_pkt.mode = mode; - if (arg != NULL) { - strncpy(reset_pkt.arg, arg, RESET_ARG_MAX); - reset_pkt.arg[RESET_ARG_MAX] = '\0'; - - reset_pkt.arglen = strlen(reset_pkt.arg) + 1; - } dmat.src = &reset_pkt; dmat.dest = (void *)SifGetReg(SIF_SYSREG_SUBADDR); diff --git a/ee_core/src/main.c b/ee_core/src/main.c index fb508520b..faa036d40 100644 --- a/ee_core/src/main.c +++ b/ee_core/src/main.c @@ -154,9 +154,9 @@ int main(int argc, char **argv) char *argvs[1]; argvs[0] = ElfPath; argvs[1] = NULL; - LoadExecPS2("rom0:PS2LOGO", 1, argvs); + _LoadExecPS2("rom0:PS2LOGO", 1, argvs); } else { - LoadExecPS2(ElfPath, 0, NULL); + _LoadExecPS2(ElfPath, 0, NULL); } if (!DisableDebug) diff --git a/ee_core/src/padhook.c b/ee_core/src/padhook.c index edb95fa7c..2ff75c40b 100644 --- a/ee_core/src/padhook.c +++ b/ee_core/src/padhook.c @@ -134,7 +134,7 @@ static void t_loadElf(void) GS_BGCOLOUR = 0x0080FF; // Orange // Execute BOOT.ELF - ExecPS2((void *)elf.epc, (void *)elf.gp, 1, argv); + _ExecPS2((void *)elf.epc, (void *)elf.gp, 1, argv); } if (!DisableDebug) { @@ -143,7 +143,7 @@ static void t_loadElf(void) } // Return to PS2 Browser - Exit(0); + _Exit(0); } // Poweroff PlayStation 2 @@ -196,7 +196,7 @@ static void IGR_Thread(void *arg) GS_BGCOLOUR = 0x0000FF; // Red // Reset IO Processor - while (!Reset_Iop(NULL, 0)) { + while (!Reset_Iop("", 0)) { ; } @@ -273,10 +273,10 @@ static void IGR_Thread(void *arg) // Execute home loader if (ExitPath[0] != '\0') - ExecPS2(t_loadElf, &_gp, 0, NULL); + _ExecPS2(t_loadElf, &_gp, 0, NULL); // Return to PS2 Browser - Exit(0); + _Exit(0); } // If combo is R3 + L3 or Reset failed, Poweroff PS2 @@ -370,7 +370,7 @@ static int IGR_Intc_Handler(int cause) for (i = 1; i < 256; i++) { if (i != IGR_Thread_ID) { // Suspend all threads - iSuspendThread(i); + _iSuspendThread(i); iChangeThreadPriority(i, 127); } } @@ -378,7 +378,7 @@ static int IGR_Intc_Handler(int cause) DPRINTF("IGR: trying to wake IGR thread...\n"); iChangeThreadPriority(IGR_Thread_ID, 0); // WakeUp IGR thread - iWakeupThread(IGR_Thread_ID); + _iWakeupThread(IGR_Thread_ID); } ExitHandler(); diff --git a/ee_core/src/syshook.c b/ee_core/src/syshook.c index 2af60f51b..650df5e1a 100644 --- a/ee_core/src/syshook.c +++ b/ee_core/src/syshook.c @@ -133,7 +133,7 @@ void t_loadElf(void) disable_padOpen_hook = 0; DPRINTF("t_loadElf: executing...\n"); - ExecPS2((void *)elf.epc, (void *)elf.gp, g_argc, g_argv); + _ExecPS2((void *)elf.epc, (void *)elf.gp, g_argc, g_argv); } DPRINTF(" failed\n"); @@ -155,16 +155,16 @@ void Install_Kernel_Hooks(void) Old_SifSetReg = GetSyscallHandler(__NR_SifSetReg); SetSyscall(__NR_SifSetReg, &Hook_SifSetReg); - Old_LoadExecPS2 = GetSyscallHandler(__NR_LoadExecPS2); - SetSyscall(__NR_LoadExecPS2, &Hook_LoadExecPS2); + Old_LoadExecPS2 = GetSyscallHandler(__NR__LoadExecPS2); + SetSyscall(__NR__LoadExecPS2, &Hook_LoadExecPS2); // If IGR is enabled hook ExecPS2 & CreateThread syscalls if (!(g_compat_mask & COMPAT_MODE_6)) { Old_CreateThread = GetSyscallHandler(__NR_CreateThread); SetSyscall(__NR_CreateThread, &Hook_CreateThread); - Old_ExecPS2 = GetSyscallHandler(__NR_ExecPS2); - SetSyscall(__NR_ExecPS2, &Hook_ExecPS2); + Old_ExecPS2 = GetSyscallHandler(__NR__ExecPS2); + SetSyscall(__NR__ExecPS2, &Hook_ExecPS2); } } @@ -176,11 +176,11 @@ void Remove_Kernel_Hooks(void) { SetSyscall(__NR_SifSetDma, Old_SifSetDma); SetSyscall(__NR_SifSetReg, Old_SifSetReg); - SetSyscall(__NR_LoadExecPS2, Old_LoadExecPS2); + SetSyscall(__NR__LoadExecPS2, Old_LoadExecPS2); // If IGR is enabled unhook ExecPS2 & CreateThread syscalls if (!(g_compat_mask & COMPAT_MODE_6)) { SetSyscall(__NR_CreateThread, Old_CreateThread); - SetSyscall(__NR_ExecPS2, Old_ExecPS2); + SetSyscall(__NR__ExecPS2, Old_ExecPS2); } } diff --git a/elfldr/Makefile b/elfldr/Makefile index 8f0277b67..342320a48 100755 --- a/elfldr/Makefile +++ b/elfldr/Makefile @@ -1,5 +1,6 @@ EE_BIN = elfldr.elf -EE_OBJS = elfldr.o crt0.o +KERNEL_OBJS = iWakeupThread.o #iWakeupThread is used by SIFRPC. This prevents the thread patch from libkernel from being linked to. +EE_OBJS = elfldr.o crt0.o $(KERNEL_OBJS) EE_INCS := -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -I. EE_CFLAGS := -D_EE -O2 -mgpopt -G8192 -Wall $(EE_INCS) @@ -16,10 +17,12 @@ EE_LIBS += -lkernel $(EE_BIN) : $(EE_OBJS) $(EE_CC) $(EE_CFLAGS) $(EE_LDFLAGS) -o $(EE_BIN) $(EE_OBJS) $(EE_LIBS) -Xlinker -Map -Xlinker elfldr.map - all: $(EE_BIN) clean: rm -f $(EE_BIN) $(EE_OBJS) elfldr.map +$(KERNEL_OBJS:%=$(EE_OBJS_DIR)%): $(EE_SRC_DIR)kernel_custom.S + $(EE_CC) $(EE_CFLAGS) -DF_$(*:$(EE_OBJS_DIR)%=%) $< -c -o $@ + include $(PS2SDK)/samples/Makefile.pref diff --git a/elfldr/elfldr.c b/elfldr/elfldr.c index f43efd7aa..332753853 100644 --- a/elfldr/elfldr.c +++ b/elfldr/elfldr.c @@ -14,13 +14,39 @@ #include #include +static inline void _strcpy(char *dst, const char *src) +{ + strncpy(dst, src, strlen(src) + 1); +} + +static inline void _strcat(char *dst, const char *src) +{ + _strcpy(&dst[strlen(dst)], src); +} + +static int _strncmp(const char *s1, const char *s2, int length) +{ + const char *a = s1; + const char *b = s2; + + while (length > 0) { + if ((*a == 0) || (*b == 0)) + return -1; + if (*a++ != *b++) + return 1; + length--; + } + + return 0; +} + static inline void BootError(char *filename) { char *argv[2]; argv[0] = "BootError"; argv[1] = filename; - ExecOSD(2, argv); + _ExecOSD(2, argv); } static inline void InitializeUserMemory(unsigned int start, unsigned int end) @@ -57,7 +83,7 @@ int main(int argc, char *argv[]) if (result == 0 && exd.epc != 0) { //Final IOP reset, to fill the IOP with the default modules. - while (!SifIopReset(NULL, 0)) { + while (!SifIopReset("", 0)) { }; FlushCache(0); @@ -66,7 +92,6 @@ int main(int argc, char *argv[]) while (!SifIopSync()) { }; - //Sync with the SIF library on the IOP, or it may crash the IOP kernel during the next reset (Depending on the how the next program initializes the IOP). SifInitRpc(0); //Load modules. SifLoadFileInit(); @@ -76,7 +101,15 @@ int main(int argc, char *argv[]) SifLoadFileExit(); SifExitRpc(); - ExecPS2((void *)exd.epc, (void *)exd.gp, argc, argv); + if (_strncmp(argv[0], "pfs", 3) == 0) { + static char _argv[256]; + _strcpy(_argv, "hdd0:+OPL:"); + _strcat(_argv, argv[0]); + + argv[0] = _argv; + } + + _ExecPS2((void *)exd.epc, (void *)exd.gp, argc, argv); } else { SifExitRpc(); } diff --git a/elfldr/syscallnr_custom.h b/elfldr/syscallnr_custom.h new file mode 100644 index 000000000..63d43cf02 --- /dev/null +++ b/elfldr/syscallnr_custom.h @@ -0,0 +1,9 @@ +#ifndef _SYSCALLNR_H_ +#define _SYSCALLNR_H_ + +/* + * This file contains the system call numbers, similar to asm/unistd.h on Linux. + */ +#define __NR_iWakeupThread (-0x34) + +#endif /* _SYSCALLNR_H_ */ diff --git a/include/hdd.h b/include/hdd.h index f22f21024..de79fc9a5 100644 --- a/include/hdd.h +++ b/include/hdd.h @@ -1,6 +1,95 @@ #ifndef __HDD_H #define __HDD_H +typedef struct +{ + u32 start; // Sector address + u32 length; // Sector count +} apa_sub_t; + +typedef struct +{ + u8 unused; + u8 sec; + u8 min; + u8 hour; + u8 day; + u8 month; + u16 year; +} ps2time_t; + +typedef struct +{ + u32 checksum; + u32 magic; // APA_MAGIC + u32 next; + u32 prev; + char id[APA_IDMAX]; + char rpwd[APA_PASSMAX]; + char fpwd[APA_PASSMAX]; + u32 start; + u32 length; + u16 type; + u16 flags; + u32 nsub; + ps2time_t created; + u32 main; + u32 number; + u32 modver; + u32 pading1[7]; + char pading2[128]; + struct + { + char magic[32]; + u32 version; + u32 nsector; + ps2time_t created; + u32 osdStart; + u32 osdSize; + char pading3[200]; + } mbr; + apa_sub_t subs[APA_MAXSUB]; +} apa_header_t; + +#define PFS_INODE_MAX_BLOCKS 114 + +typedef struct +{ + u32 number; + u16 subpart; + u16 count; +} pfs_blockinfo_t; + +typedef struct +{ + u32 checksum; + u32 magic; + pfs_blockinfo_t inode_block; + pfs_blockinfo_t next_segment; + pfs_blockinfo_t last_segment; + pfs_blockinfo_t unused; + pfs_blockinfo_t data[PFS_INODE_MAX_BLOCKS]; + u16 mode; + u16 attr; + u16 uid; + u16 gid; + ps2time_t atime; + ps2time_t ctime; + ps2time_t mtime; + u64 size; + u32 number_blocks; + u32 number_data; + u32 number_segdesg; + u32 subpart; + u32 reserved[4]; +} pfs_inode_t; + int hddReadSectors(u32 lba, u32 nsectors, void *buf); +//Array should be APA_MAXSUB+1 entries. +int hddGetPartitionInfo(const char *name, apa_sub_t *parts); + +//Array should be max entries. +int hddGetFileBlockInfo(const char *name, const apa_sub_t *subs, pfs_blockinfo_t *blocks, int max); + #endif diff --git a/include/hddsupport.h b/include/hddsupport.h index 105fd1445..d2e4640a1 100644 --- a/include/hddsupport.h +++ b/include/hddsupport.h @@ -2,6 +2,7 @@ #define __HDD_SUPPORT_H #include "include/iosupport.h" +#include "include/hdd.h" #define HDD_MODE_UPDATE_DELAY MENU_UPD_DELAY_NOUPDATE @@ -31,87 +32,6 @@ typedef struct hdl_game_info_t *games; } hdl_games_list_t; -typedef struct -{ - u8 unused; - u8 sec; - u8 min; - u8 hour; - u8 day; - u8 month; - u16 year; -} ps2time_t; - -typedef struct -{ - u32 start; // Sector address - u32 length; // Sector count -} apa_sub_t; - -typedef struct -{ - u32 checksum; - u32 magic; // APA_MAGIC - u32 next; - u32 prev; - char id[APA_IDMAX]; - char rpwd[APA_PASSMAX]; - char fpwd[APA_PASSMAX]; - u32 start; - u32 length; - u16 type; - u16 flags; - u32 nsub; - ps2time_t created; - u32 main; - u32 number; - u32 modver; - u32 pading1[7]; - char pading2[128]; - struct - { - char magic[32]; - u32 version; - u32 nsector; - ps2time_t created; - u32 osdStart; - u32 osdSize; - char pading3[200]; - } mbr; - apa_sub_t subs[APA_MAXSUB]; -} apa_header_t; - -typedef struct -{ - u32 number; - u16 subpart; - u16 count; -} pfs_blockinfo_t; - -typedef struct -{ - u32 checksum; - u32 magic; - pfs_blockinfo_t inode_block; - pfs_blockinfo_t next_segment; - pfs_blockinfo_t last_segment; - pfs_blockinfo_t unused; - pfs_blockinfo_t data[114]; - u16 mode; - u16 attr; - u16 uid; - u16 gid; - ps2time_t atime; - ps2time_t ctime; - ps2time_t mtime; - u64 size; - u32 number_blocks; - u32 number_data; - u32 number_segdesg; - u32 subpart; - u32 reserved[4]; -} pfs_inode_t; - typedef struct { u32 start; diff --git a/include/opl.h b/include/opl.h index 3d0e94423..05febb365 100644 --- a/include/opl.h +++ b/include/opl.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include diff --git a/include/supportbase.h b/include/supportbase.h index cd2666f2e..695f6b29e 100644 --- a/include/supportbase.h +++ b/include/supportbase.h @@ -38,6 +38,7 @@ int sbCreateSemaphore(void); int sbReadList(base_game_info_t **list, const char *prefix, int *fsize, int *gamecount); int sbPrepare(base_game_info_t *game, config_set_t *configSet, int size_cdvdman, void **cdvdman_irx, int *patchindex); void sbUnprepare(void *pCommon); +void sbRebuildULCfg(base_game_info_t **list, const char *prefix, int gamecount, int excludeID); void sbDelete(base_game_info_t **list, const char *prefix, const char *sep, int gamecount, int id); void sbRename(base_game_info_t **list, const char *prefix, const char *sep, int gamecount, int id, char *newname); config_set_t *sbPopulateConfig(base_game_info_t *game, const char *prefix, const char *sep); diff --git a/include/usb-ioctl.h b/include/usb-ioctl.h index 716c9183f..c4d97a9f1 100644 --- a/include/usb-ioctl.h +++ b/include/usb-ioctl.h @@ -1,2 +1 @@ -#define USBHDFSD_IOCTL_GETSECTOR 0x1000 //jimmikaelkael: Ioctl request code => get file start sector -#define USBHDFSD_IOCTL_CHECKCHAIN 0x1100 //polo: Ioctl request code => Check cluster chain +#define XUSBHDFSD_CHECK_CLUSTER_CHAIN 0x1100 //polo: Ioctl request code => Check cluster chain diff --git a/labs/genvmclab/genvmclab.c b/labs/genvmclab/genvmclab.c index 09088f0f2..6d0bcd011 100644 --- a/labs/genvmclab/genvmclab.c +++ b/labs/genvmclab/genvmclab.c @@ -99,7 +99,7 @@ int main(int argc, char *argv[2]) DPRINTF("IOP Reset... "); - while (!SifIopReset("rom0:UDNL rom0:EELOADCNF", 0)) + while (!SifIopReset("", 0)) ; while (!SifIopSync()) ; diff --git a/labs/hdldsvrlab/hdldsvrlab.c b/labs/hdldsvrlab/hdldsvrlab.c index a18e00600..869ec3b28 100644 --- a/labs/hdldsvrlab/hdldsvrlab.c +++ b/labs/hdldsvrlab/hdldsvrlab.c @@ -82,7 +82,7 @@ int main(int argc, char *argv[2]) scr_printf("\t IOP Reset... "); - while (!SifIopReset("rom0:UDNL rom0:EELOADCNF", 0)) + while (!SifIopReset("", 0)) ; while (!SifIopSync()) ; diff --git a/labs/smblab/smblab.c b/labs/smblab/smblab.c index 4e8402290..c039cb506 100644 --- a/labs/smblab/smblab.c +++ b/labs/smblab/smblab.c @@ -137,7 +137,7 @@ int main(int argc, char *argv[2]) DPRINTF("IOP Reset... "); - while (!SifIopReset("rom0:UDNL rom0:EELOADCNF", 0)) + while (!SifIopReset("", 0)) ; while (!SifIopSync()) ; diff --git a/modules/dev9/README b/modules/dev9/README deleted file mode 100755 index c8cd00282..000000000 --- a/modules/dev9/README +++ /dev/null @@ -1,2 +0,0 @@ -This is the DEV9 device driver by Marcus R. Brown w/o poweroff support. -It is covered by the AFL version 2.0. diff --git a/modules/dev9/dev9.h b/modules/dev9/dev9.h deleted file mode 100755 index 854e75a8c..000000000 --- a/modules/dev9/dev9.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id$ -# DEV9 Device Driver definitions and imports. -*/ - -#ifndef IOP_DEV9_H -#define IOP_DEV9_H - -#include -#include - -typedef int (*dev9_intr_cb_t)(int flag); -typedef void (*dev9_shutdown_cb_t)(void); -typedef void (*dev9_dma_cb_t)(int bcr, int dir); - -#define dev9_IMPORTS_start DECLARE_IMPORT_TABLE(dev9, 1, 1) -#define dev9_IMPORTS_end END_IMPORT_TABLE - -void dev9RegisterIntrCb(int intr, dev9_intr_cb_t cb); -#define I_dev9RegisterIntrCb DECLARE_IMPORT(4, dev9RegisterIntrCb) - -int dev9DmaTransfer(int ctrl, void *buf, int bcr, int dir); -#define I_dev9DmaTransfer DECLARE_IMPORT(5, dev9DmaTransfer) - -void dev9Shutdown(void); -#define I_dev9Shutdown DECLARE_IMPORT(6, dev9Shutdown) -void dev9IntrEnable(int mask); -#define I_dev9IntrEnable DECLARE_IMPORT(7, dev9IntrEnable) -void dev9IntrDisable(int mask); -#define I_dev9IntrDisable DECLARE_IMPORT(8, dev9IntrDisable) - -int dev9GetEEPROM(u16 *buf); -#define I_dev9GetEEPROM DECLARE_IMPORT(9, dev9GetEEPROM) - -void dev9LEDCtl(int ctl); -#define I_dev9LEDCtl DECLARE_IMPORT(10, dev9LEDCtl) - -int dev9RegisterShutdownCb(int idx, dev9_shutdown_cb_t cb); -#define I_dev9RegisterShutdownCb DECLARE_IMPORT(11, dev9RegisterShutdownCb) - -void dev9RegisterPreDmaCb(int ctrl, dev9_dma_cb_t cb); -#define I_dev9RegisterPreDmaCb DECLARE_IMPORT(12, dev9RegisterPreDmaCb) - -void dev9RegisterPostDmaCb(int ctrl, dev9_dma_cb_t cb); -#define I_dev9RegisterPostDmaCb DECLARE_IMPORT(13, dev9RegisterPostDmaCb) - -#endif /* IOP_PS2DEV9_H */ diff --git a/modules/dev9/exports.tab b/modules/dev9/exports.tab deleted file mode 100755 index b8d217a80..000000000 --- a/modules/dev9/exports.tab +++ /dev/null @@ -1,20 +0,0 @@ -DECLARE_EXPORT_TABLE(dev9, 1, 1) - DECLARE_EXPORT(_start) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(_exit) - DECLARE_EXPORT(_retonly) - - /* 4 */ - DECLARE_EXPORT(dev9RegisterIntrCb) - DECLARE_EXPORT(dev9DmaTransfer) - DECLARE_EXPORT(dev9Shutdown) - DECLARE_EXPORT(dev9IntrEnable) - DECLARE_EXPORT(dev9IntrDisable) - DECLARE_EXPORT(dev9GetEEPROM) - DECLARE_EXPORT(dev9LEDCtl) - DECLARE_EXPORT(dev9RegisterShutdownCb) - DECLARE_EXPORT(dev9RegisterPreDmaCb) - DECLARE_EXPORT(dev9RegisterPostDmaCb) -END_EXPORT_TABLE - -void _retonly() {} diff --git a/modules/dev9/imports.lst b/modules/dev9/imports.lst deleted file mode 100755 index 74e3ace88..000000000 --- a/modules/dev9/imports.lst +++ /dev/null @@ -1,55 +0,0 @@ - -dmacman_IMPORTS_start -I_dmac_enable -I_dmac_transfer -I_dmac_request -I_dmac_ch_get_chcr -dmacman_IMPORTS_end - -intrman_IMPORTS_start -I_RegisterIntrHandler -I_EnableIntr -I_DisableIntr -I_CpuSuspendIntr -I_CpuResumeIntr -intrman_IMPORTS_end - -loadcore_IMPORTS_start -I_RegisterLibraryEntries -#ifdef PCMCIA -I_QueryBootMode -#endif -#ifdef CHECK_LOADED -I_GetLoadcoreInternalData -#endif -loadcore_IMPORTS_end - -#ifdef DEV9X_DEV -ioman_IMPORTS_start -I_AddDrv -I_DelDrv -ioman_IMPORTS_end -#endif - -#ifdef POWEROFF -poweroff_IMPORTS_start -I_AddPowerOffHandler -poweroff_IMPORTS_end -#endif - -#ifdef DEBUG -stdio_IMPORTS_start -I_printf -stdio_IMPORTS_end -#endif - -thbase_IMPORTS_start -I_DelayThread -thbase_IMPORTS_end - -thsemap_IMPORTS_start -I_CreateSema -I_SignalSema -I_iSignalSema -I_WaitSema -thsemap_IMPORTS_end diff --git a/modules/dev9/ioman_add.h b/modules/dev9/ioman_add.h deleted file mode 100644 index 660ed8542..000000000 --- a/modules/dev9/ioman_add.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef _IOMAN_ADD_H_ -#define _IOMAN_ADD_H_ - -typedef struct _iop_ext_device -{ - const char *name; - unsigned int type; - unsigned int version; /* Not so sure about this one. */ - const char *desc; - struct _iop_ext_device_ops *ops; -} iop_ext_device_t; - -typedef struct _iop_ext_device_ops -{ - int (*init)(iop_device_t *); - int (*deinit)(iop_device_t *); - int (*format)(iop_file_t *); - int (*open)(iop_file_t *, const char *, int); - int (*close)(iop_file_t *); - int (*read)(iop_file_t *, void *, int); - int (*write)(iop_file_t *, void *, int); - int (*lseek)(iop_file_t *, unsigned long, int); - int (*ioctl)(iop_file_t *, unsigned long, void *); - int (*remove)(iop_file_t *, const char *); - int (*mkdir)(iop_file_t *, const char *); - int (*rmdir)(iop_file_t *, const char *); - int (*dopen)(iop_file_t *, const char *); - int (*dclose)(iop_file_t *); - int (*dread)(iop_file_t *, fio_dirent_t *); - int (*getstat)(iop_file_t *, const char *, fio_stat_t *); - int (*chstat)(iop_file_t *, const char *, fio_stat_t *, unsigned int); - /* Extended ops start here. */ - int (*rename)(iop_file_t *, const char *, const char *); - int (*chdir)(iop_file_t *, const char *); - int (*sync)(iop_file_t *, const char *, int); - int (*mount)(iop_file_t *, const char *, const char *, int, void *, unsigned int); - int (*umount)(iop_file_t *, const char *); - int (*lseek64)(iop_file_t *, long long, int); - int (*devctl)(iop_file_t *, const char *, int, void *, unsigned int, void *, unsigned int); - int (*symlink)(iop_file_t *, const char *, const char *); - int (*readlink)(iop_file_t *, const char *, char *, unsigned int); - int (*ioctl2)(iop_file_t *, int, void *, unsigned int, void *, unsigned int); - -} iop_ext_device_ops_t; - -#endif diff --git a/modules/dev9/irx_imports.h b/modules/dev9/irx_imports.h deleted file mode 100755 index 473938f4f..000000000 --- a/modules/dev9/irx_imports.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: irx_imports.h 1421 2007-07-07 01:56:53Z radad $ -# Defines all IRX imports. -*/ - -#ifndef IOP_IRX_IMPORTS_H -#define IOP_IRX_IMPORTS_H - -#include "irx.h" - -/* Please keep these in alphabetical order! */ -#include "dmacman.h" -#include "intrman.h" -#ifdef DEV9X_DEV -#include "ioman.h" -#endif -#include "loadcore.h" -#ifdef POWEROFF -#include "poweroff.h" -#endif -#ifdef DEBUG -#include "stdio.h" -#endif -#include "thbase.h" -#include "thsemap.h" - -#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/dev9/ps2dev9.c b/modules/dev9/ps2dev9.c deleted file mode 100644 index 8c3a072f3..000000000 --- a/modules/dev9/ps2dev9.c +++ /dev/null @@ -1,1161 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id$ -# DEV9 Device Driver. -*/ - -#include -#include -#include -#include -#include -#include -#include -#ifdef DEBUG -#include -#endif -#include -#ifdef POWEROFF -#include -#endif -#ifdef DEV9X_DEV -#include -#include "ioman_add.h" -#endif - -//#define INIT_SMAP 1 //Disabled to avoid breaking compatibility with clone/compatible adaptors. - -#include -#include -#include -#include - -#define MODNAME "dev9_driver" -#define DRIVERNAME "dev9" -IRX_ID(MODNAME, 1, 1); - -#ifdef DEBUG -#define M_PRINTF(format, args...) \ - printf(MODNAME ": " format, ##args) -#else -#define M_PRINTF(format, args...) \ - do { \ - } while (0) -#endif - -#define VERSION "1.0" -#define BANNER "\nDEV9 device driver v%s - Copyright (c) 2003 Marcus R. Brown\n\n" - -/* SSBUS registers. */ -#define SSBUS_R_1418 0xbf801418 -#define SSBUS_R_141c 0xbf80141c -#define SSBUS_R_1420 0xbf801420 - -static int dev9type = -1; /* 0 for PCMCIA, 1 for expansion bay */ -#ifdef PCMCIA -static int using_aif = 0; /* 1 if using AIF on a T10K */ -#endif - -static void (*p_dev9_intr_cb)(int flag) = NULL; -static int dma_lock_sem = -1; /* used to arbitrate DMA */ - -#ifdef PCMCIA -static int pcic_cardtype; /* Translated value of bits 0-1 of 0xbf801462 */ -static int pcic_voltage; /* Translated value of bits 2-3 of 0xbf801462 */ -#endif - -static s16 eeprom_data[5]; /* 2-byte EEPROM status (0/-1 = invalid, 1 = valid), - 6-byte MAC address, - 2-byte MAC address checksum. */ - -/* Each driver can register callbacks that correspond to each bit of the - SMAP interrupt status register (0xbx000028). */ -static dev9_intr_cb_t dev9_intr_cbs[16]; - -static dev9_shutdown_cb_t dev9_shutdown_cbs[16]; - -static dev9_dma_cb_t dev9_predma_cbs[4], dev9_postdma_cbs[4]; - -static int dev9_intr_dispatch(int flag); - -#ifdef POWEROFF -static void dev9x_on_shutdown(void *); -#endif - -static void dev9_set_stat(int stat); -static int read_eeprom_data(void); - -static int dev9_device_probe(void); -static int dev9_device_reset(void); -static int dev9_init(void); -static int speed_device_init(void); - -#ifdef PCMCIA -static void pcmcia_set_stat(int stat); -static int pcic_ssbus_mode(int mode); -static int pcmcia_device_probe(void); -static int pcmcia_device_reset(void); -static int card_find_manfid(u32 manfid); -static int pcmcia_init(void); -#endif - -static void expbay_set_stat(int stat); -static int expbay_device_probe(void); -static int expbay_device_reset(void); -static int expbay_init(void); - -struct irx_export_table _exp_dev9; - -#ifdef DEV9X_DEV -static int dev9x_dummy(void) -{ - return 0; -} -static int dev9x_devctl(iop_file_t *f, const char *name, int cmd, void *args, int arglen, void *buf, int buflen) -{ - if (cmd == 0x4401) - return dev9type; - - return 0; -} - -/* driver ops func tab */ -static void *dev9x_ops[27] = { - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_devctl, - (void *)dev9x_dummy, - (void *)dev9x_dummy, - (void *)dev9x_dummy}; - -/* driver descriptor */ -static iop_ext_device_t dev9x_dev = { - "dev9x", - IOP_DT_FS | 0x10000000, /* EXT FS */ - 1, - "DEV9", - (struct _iop_ext_device_ops *)&dev9x_ops}; -#endif - -int _start(int argc, char **argv) -{ - USE_DEV9_REGS; - int idx, res = 1; - u16 dev9hw; - - M_PRINTF(BANNER, VERSION); - -#ifdef CHECK_LOADED - iop_library_t *libptr; - libptr = GetLoadcoreInternalData()->let_next; - while ((libptr != 0)) { - int i; - for (i = 0; i <= sizeof(DRIVERNAME); i++) { - if (libptr->name[i] != DRIVERNAME[i]) - break; - } - if (i > sizeof(DRIVERNAME)) { - M_PRINTF("Driver already loaded.\n"); - return 1; - } - libptr = libptr->prev; - } -#endif - - for (idx = 0; idx < 16; idx++) - dev9_shutdown_cbs[idx] = NULL; - - dev9hw = DEV9_REG(DEV9_R_REV) & 0xf0; - if (dev9hw == 0x20) { /* CXD9566 (PCMCIA) */ - dev9type = 0; -#ifdef PCMCIA - res = pcmcia_init(); -#else - return 1; -#endif - } else if (dev9hw == 0x30) { /* CXD9611 (Expansion Bay) */ - dev9type = 1; - res = expbay_init(); - } - - if (res) - return res; - -#ifdef DEV9X_DEV - DelDrv("dev9x"); - AddDrv((iop_device_t *)&dev9x_dev); -#endif - - if (RegisterLibraryEntries(&_exp_dev9) != 0) { - return 1; - } -#ifdef POWEROFF - AddPowerOffHandler(dev9x_on_shutdown, 0); -#endif - /* Normal termination. */ - M_PRINTF("Dev9 loaded.\n"); - - return 0; -} - -int _exit(void) { return 0; } - -/* Export 4 */ -void dev9RegisterIntrCb(int intr, dev9_intr_cb_t cb) -{ - dev9_intr_cbs[intr] = cb; -} - -/* Export 12 */ -void dev9RegisterPreDmaCb(int ctrl, dev9_dma_cb_t cb) -{ - dev9_predma_cbs[ctrl] = cb; -} - -/* Export 13 */ -void dev9RegisterPostDmaCb(int ctrl, dev9_dma_cb_t cb) -{ - dev9_postdma_cbs[ctrl] = cb; -} - -/* flag is 1 if a card (pcmcia) was removed or added */ -static int dev9_intr_dispatch(int flag) -{ - USE_SPD_REGS; - int i, bit; - - if (flag) { - for (i = 0; i < 16; i++) - if (dev9_intr_cbs[i] != NULL) - dev9_intr_cbs[i](flag); - } - - while (SPD_REG16(SPD_R_INTR_STAT) & SPD_REG16(SPD_R_INTR_MASK)) { - for (i = 0; i < 16; i++) { - if (dev9_intr_cbs[i] != NULL) { - bit = (SPD_REG16(SPD_R_INTR_STAT) & - SPD_REG16(SPD_R_INTR_MASK)) >> - i; - if (bit & 0x01) - dev9_intr_cbs[i](flag); - } - } - } - - return 0; -} - -static void dev9_set_stat(int stat) -{ - if (dev9type == 0) -#ifdef PCMCIA - pcmcia_set_stat(stat); -#else - return; -#endif - else if (dev9type == 1) - expbay_set_stat(stat); -} - -static int dev9_device_probe(void) -{ - if (dev9type == 0) -#ifdef PCMCIA - return pcmcia_device_probe(); -#else - return -1; -#endif - else if (dev9type == 1) - return expbay_device_probe(); - - return -1; -} - -static int dev9_device_reset(void) -{ - if (dev9type == 0) -#ifdef PCMCIA - return pcmcia_device_reset(); -#else - return -1; -#endif - else if (dev9type == 1) - return expbay_device_reset(); - - return -1; -} - -/* Export 6 */ -void dev9Shutdown(void) -{ - int idx; - USE_DEV9_REGS; - - for (idx = 0; idx < 16; idx++) - if (dev9_shutdown_cbs[idx]) - dev9_shutdown_cbs[idx](); - - if (dev9type == 0) { /* PCMCIA */ -#ifdef PCMCIA - DEV9_REG(DEV9_R_POWER) = 0; - DEV9_REG(DEV9_R_1474) = 0; -#endif - } else if (dev9type == 1) { - DEV9_REG(DEV9_R_1466) = 1; - DEV9_REG(DEV9_R_1464) = 0; - DEV9_REG(DEV9_R_1460) = DEV9_REG(DEV9_R_1464); - DEV9_REG(DEV9_R_POWER) = DEV9_REG(DEV9_R_POWER) & ~4; - DEV9_REG(DEV9_R_POWER) = DEV9_REG(DEV9_R_POWER) & ~1; - } - DelayThread(1000000); -} - -/* Export 7 */ -void dev9IntrEnable(int mask) -{ - USE_SPD_REGS; - int flags; - - CpuSuspendIntr(&flags); - SPD_REG16(SPD_R_INTR_MASK) = SPD_REG16(SPD_R_INTR_MASK) | mask; - CpuResumeIntr(flags); -} - -/* Export 8 */ -void dev9IntrDisable(int mask) -{ - USE_SPD_REGS; - int flags; - - CpuSuspendIntr(&flags); - SPD_REG16(SPD_R_INTR_MASK) = SPD_REG16(SPD_R_INTR_MASK) & ~mask; - CpuResumeIntr(flags); -} - -/* Export 5 */ -int dev9DmaTransfer(int ctrl, void *buf, int bcr, int dir) -{ - USE_SPD_REGS; - int res = 0, dmactrl; - - switch (ctrl) { - case 0: - case 1: - dmactrl = ctrl; - break; - - case 2: - case 3: - if (dev9_predma_cbs[ctrl] == NULL) - return -1; - if (dev9_postdma_cbs[ctrl] == NULL) - return -1; - dmactrl = (4 << ctrl); - break; - - default: - return -1; - } - - if ((res = WaitSema(dma_lock_sem)) < 0) - return res; - - SPD_REG16(SPD_R_DMA_CTRL) = (SPD_REG16(SPD_R_REV_1) < 17) ? (dmactrl & 0x03) | 0x04 : (dmactrl & 0x01) | 0x06; - - if (dev9_predma_cbs[ctrl]) - dev9_predma_cbs[ctrl](bcr, dir); - - dmac_request(IOP_DMAC_DEV9, buf, bcr & 0xFFFF, bcr >> 16, dir); - dmac_transfer(IOP_DMAC_DEV9); - - /* Wait for DMA to complete. Do not use a semaphore as thread switching hurts throughput greatly. */ - while (dmac_ch_get_chcr(IOP_DMAC_DEV9) & DMAC_CHCR_TR) { - } - res = 0; - - if (dev9_postdma_cbs[ctrl]) - dev9_postdma_cbs[ctrl](bcr, dir); - - SignalSema(dma_lock_sem); - return res; -} - -static int read_eeprom_data(void) -{ - USE_SPD_REGS; - int i, j, res = -2; - u8 val; - - if (eeprom_data[0] < 0) - goto out; - - SPD_REG8(SPD_R_PIO_DIR) = 0xe1; - DelayThread(1); - SPD_REG8(SPD_R_PIO_DATA) = 0x80; - DelayThread(1); - - for (i = 0; i < 2; i++) { - SPD_REG8(SPD_R_PIO_DATA) = 0xa0; - DelayThread(1); - SPD_REG8(SPD_R_PIO_DATA) = 0xe0; - DelayThread(1); - } - for (i = 0; i < 7; i++) { - SPD_REG8(SPD_R_PIO_DATA) = 0x80; - DelayThread(1); - SPD_REG8(SPD_R_PIO_DATA) = 0xc0; - DelayThread(1); - } - SPD_REG8(SPD_R_PIO_DATA) = 0xc0; - DelayThread(1); - - val = SPD_REG8(SPD_R_PIO_DATA); - DelayThread(1); - if (val & 0x10) { /* Error. */ - SPD_REG8(SPD_R_PIO_DATA) = 0; - DelayThread(1); - res = -1; - eeprom_data[0] = 0; - goto out; - } - - SPD_REG8(SPD_R_PIO_DATA) = 0x80; - DelayThread(1); - - /* Read the MAC address and checksum from the EEPROM. */ - for (i = 0; i < 4; i++) { - eeprom_data[i + 1] = 0; - - for (j = 15; j >= 0; j--) { - SPD_REG8(SPD_R_PIO_DATA) = 0xc0; - DelayThread(1); - val = SPD_REG8(SPD_R_PIO_DATA); - if (val & 0x10) - eeprom_data[i + 1] |= (1 << j); - SPD_REG8(SPD_R_PIO_DATA) = 0x80; - DelayThread(1); - } - } - - SPD_REG8(SPD_R_PIO_DATA) = 0; - DelayThread(1); - eeprom_data[0] = 1; /* The EEPROM data is valid. */ - res = 0; - -out: - SPD_REG8(SPD_R_PIO_DIR) = 1; - return res; -} - -/* Export 9 */ -int dev9GetEEPROM(u16 *buf) -{ - int i; - - if (!eeprom_data[0]) - return -1; - if (eeprom_data[0] < 0) - return -2; - - /* We only return the MAC address and checksum. */ - for (i = 0; i < 4; i++) - buf[i] = eeprom_data[i + 1]; - - return 0; -} - -/* Export 10 */ -void dev9LEDCtl(int ctl) -{ - USE_SPD_REGS; - SPD_REG8(SPD_R_PIO_DATA) = (ctl == 0); -} - -/* Export 11 */ -int dev9RegisterShutdownCb(int idx, dev9_shutdown_cb_t cb) -{ - if (idx < 16) { - dev9_shutdown_cbs[idx] = cb; - return 0; - } - return -1; -} - -static int dev9_init(void) -{ - int i; - - if ((dma_lock_sem = CreateMutex(IOP_MUTEX_UNLOCKED)) < 0) - return -1; - - /* Enable the DEV9 DMAC channel. */ - dmac_enable(IOP_DMAC_DEV9); - - /* Not quite sure what this enables yet. */ - dev9_set_stat(0x103); - - /* Disable all device interrupts. */ - dev9IntrDisable(0xffff); - - p_dev9_intr_cb = (void *)dev9_intr_dispatch; - - /* Reset the SMAP interrupt callback table. */ - for (i = 0; i < 16; i++) - dev9_intr_cbs[i] = NULL; - - for (i = 0; i < 4; i++) { - dev9_predma_cbs[i] = NULL; - dev9_postdma_cbs[i] = NULL; - } - - /* Read in the MAC address. */ - read_eeprom_data(); - /* Turn the LED off. */ - dev9LEDCtl(0); - return 0; -} - -#ifdef INIT_SMAP -static int dev9_smap_read_phy(volatile u8 *emac3_regbase, unsigned int address, unsigned int *data) -{ - unsigned int i, PHYRegisterValue; - int result; - - PHYRegisterValue = (address & SMAP_E3_PHY_REG_ADDR_MSK) | SMAP_E3_PHY_READ | ((SMAP_DsPHYTER_ADDRESS & SMAP_E3_PHY_ADDR_MSK) << SMAP_E3_PHY_ADDR_BITSFT); - - i = 0; - result = 0; - SMAP_EMAC3_SET(SMAP_R_EMAC3_STA_CTRL, PHYRegisterValue); - - do { - if (SMAP_EMAC3_GET(SMAP_R_EMAC3_STA_CTRL) & SMAP_E3_PHY_OP_COMP) { - if (SMAP_EMAC3_GET(SMAP_R_EMAC3_STA_CTRL) & SMAP_E3_PHY_OP_COMP) { - if ((result = SMAP_EMAC3_GET(SMAP_R_EMAC3_STA_CTRL)) & SMAP_E3_PHY_OP_COMP) { - result >>= SMAP_E3_PHY_DATA_BITSFT; - break; - } - } - } - - DelayThread(1000); - i++; - } while (i < 100); - - if (i >= 100) { - return 1; - } else { - *data = result; - return 0; - } -} - -static int dev9_smap_write_phy(volatile u8 *emac3_regbase, unsigned char address, unsigned short int value) -{ - unsigned int i, PHYRegisterValue; - - PHYRegisterValue = (address & SMAP_E3_PHY_REG_ADDR_MSK) | SMAP_E3_PHY_WRITE | ((SMAP_DsPHYTER_ADDRESS & SMAP_E3_PHY_ADDR_MSK) << SMAP_E3_PHY_ADDR_BITSFT); - PHYRegisterValue |= ((unsigned int)value) << SMAP_E3_PHY_DATA_BITSFT; - - i = 0; - SMAP_EMAC3_SET(SMAP_R_EMAC3_STA_CTRL, PHYRegisterValue); - - for (; !(SMAP_EMAC3_GET(SMAP_R_EMAC3_STA_CTRL) & SMAP_E3_PHY_OP_COMP); i++) { - DelayThread(1000); - if (i >= 100) - break; - } - - return ((i >= 100) ? 1 : 0); -} - -static int dev9_smap_init(void) -{ - unsigned int value; - USE_SPD_REGS; - USE_SMAP_REGS; - USE_SMAP_EMAC3_REGS; - USE_SMAP_TX_BD; - USE_SMAP_RX_BD; - int i; - - //Do not perform SMAP initialization if the SPEED device does not have such an interface. - if (!(SPD_REG16(SPD_R_REV_3) & SPD_CAPS_SMAP)) - return 0; - - SMAP_REG8(SMAP_R_TXFIFO_CTRL) = SMAP_TXFIFO_RESET; - for (i = 9; SMAP_REG8(SMAP_R_TXFIFO_CTRL) & SMAP_TXFIFO_RESET; i--) { - if (i <= 0) - return 1; - DelayThread(1000); - } - - SMAP_REG8(SMAP_R_RXFIFO_CTRL) = SMAP_RXFIFO_RESET; - for (i = 9; SMAP_REG8(SMAP_R_RXFIFO_CTRL) & SMAP_RXFIFO_RESET; i--) { - if (i <= 0) - return 1; - DelayThread(1000); - } - - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE0, SMAP_E3_SOFT_RESET); - for (i = 9; SMAP_EMAC3_GET(SMAP_R_EMAC3_MODE0) & SMAP_E3_SOFT_RESET; i--) { - if (i <= 0) - return 3; - DelayThread(1000); - } - - if (SPD_REG16(SPD_R_REV_1) >= 0x11) - SMAP_REG8(SMAP_R_BD_MODE) = SMAP_BD_SWAP; - - for (i = 0; i < SMAP_BD_MAX_ENTRY; i++) { - tx_bd[i].ctrl_stat = 0; - tx_bd[i].reserved = 0; - tx_bd[i].length = 0; - tx_bd[i].pointer = 0; - } - - for (i = 0; i < SMAP_BD_MAX_ENTRY; i++) { - rx_bd[i].ctrl_stat = 0x80; //SMAP_BD_RX_EMPTY - rx_bd[i].reserved = 0; - rx_bd[i].length = 0; - rx_bd[i].pointer = 0; - } - - SMAP_REG16(SMAP_R_INTR_CLR) = SMAP_INTR_BITMSK; - if (SPD_REG16(SPD_R_REV_1) < 0x11) - SPD_REG8(0x100) = 1; - - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE1, SMAP_E3_FDX_ENABLE | SMAP_E3_IGNORE_SQE | SMAP_E3_MEDIA_100M | SMAP_E3_RXFIFO_2K | SMAP_E3_TXFIFO_1K | SMAP_E3_TXREQ0_MULTI | SMAP_E3_TXREQ1_SINGLE); - SMAP_EMAC3_SET(SMAP_R_EMAC3_TxMODE1, 7 << SMAP_E3_TX_LOW_REQ_BITSFT | 0xF << SMAP_E3_TX_URG_REQ_BITSFT); - SMAP_EMAC3_SET(SMAP_R_EMAC3_RxMODE, SMAP_E3_RX_RX_RUNT_FRAME | SMAP_E3_RX_RX_FCS_ERR | SMAP_E3_RX_RX_TOO_LONG_ERR | SMAP_E3_RX_RX_IN_RANGE_ERR | SMAP_E3_RX_PROP_PF | SMAP_E3_RX_PROMISC); - SMAP_EMAC3_SET(SMAP_R_EMAC3_INTR_STAT, SMAP_E3_INTR_TX_ERR_0 | SMAP_E3_INTR_SQE_ERR_0 | SMAP_E3_INTR_DEAD_0); - SMAP_EMAC3_SET(SMAP_R_EMAC3_INTR_ENABLE, SMAP_E3_INTR_TX_ERR_0 | SMAP_E3_INTR_SQE_ERR_0 | SMAP_E3_INTR_DEAD_0); - SMAP_EMAC3_SET(SMAP_R_EMAC3_ADDR_HI, 0); - SMAP_EMAC3_SET(SMAP_R_EMAC3_ADDR_LO, 0); - SMAP_EMAC3_SET(SMAP_R_EMAC3_PAUSE_TIMER, 0xFFFF); - SMAP_EMAC3_SET(SMAP_R_EMAC3_INTER_FRAME_GAP, 4); - SMAP_EMAC3_SET(SMAP_R_EMAC3_TX_THRESHOLD, 0xC << SMAP_E3_TX_THRESHLD_BITSFT); - SMAP_EMAC3_SET(SMAP_R_EMAC3_RX_WATERMARK, 0x8 << SMAP_E3_RX_LO_WATER_BITSFT | 0x40 << SMAP_E3_RX_HI_WATER_BITSFT); - - dev9_smap_write_phy(emac3_regbase, SMAP_DsPHYTER_BMCR, SMAP_PHY_BMCR_RST); - for (i = 9;; i--) { - if (dev9_smap_read_phy(emac3_regbase, SMAP_DsPHYTER_BMCR, &value)) - return 4; - if (!(value & SMAP_PHY_BMCR_RST)) - break; - if (i <= 0) - return 5; - } - - dev9_smap_write_phy(emac3_regbase, SMAP_DsPHYTER_BMCR, SMAP_PHY_BMCR_LPBK | SMAP_PHY_BMCR_100M | SMAP_PHY_BMCR_DUPM); - DelayThread(10000); - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE0, SMAP_E3_TXMAC_ENABLE | SMAP_E3_RXMAC_ENABLE); - value = SMAP_REG16(SMAP_R_TXFIFO_WR_PTR) + SMAP_TX_BASE; - - for (i = 0; i < 0x5EA; i += 4) - SMAP_REG32(SMAP_R_TXFIFO_DATA) = i; - - tx_bd[0].length = 0xEA05; - tx_bd[0].pointer = (value >> 8) | (value << 8); - SMAP_REG8(SMAP_R_TXFIFO_FRAME_INC) = 0; - tx_bd[0].ctrl_stat = 0x83; //SMAP_BD_TX_READY|SMAP_BD_TX_GENFCS|SMAP_BD_TX_GENPAD - - SMAP_EMAC3_SET(SMAP_R_EMAC3_TxMODE0, SMAP_E3_TX_GNP_0); - for (i = 9;; i--) { - value = SPD_REG16(SPD_R_INTR_STAT); - - if ((value & (SMAP_INTR_RXEND | SMAP_INTR_TXEND | SMAP_INTR_TXDNV)) == (SMAP_INTR_RXEND | SMAP_INTR_TXEND | SMAP_INTR_TXDNV)) - break; - if (i <= 0) - return 6; - DelayThread(1000); - } - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE0, SMAP_E3_SOFT_RESET); - - return 0; -} -#endif - -static int speed_device_init(void) -{ -#ifdef DEBUG - USE_SPD_REGS; - const char *spdnames[] = {"(unknown)", "TS", "ES1", "ES2"}; - int idx; - u16 spdrev; -#endif - int res; -#ifdef INIT_SMAP - int InitCount; -#endif - - eeprom_data[0] = 0; - -#ifdef INIT_SMAP - for (InitCount = 0; InitCount < 8; InitCount++) { -#endif - if (dev9_device_probe() < 0) { - M_PRINTF("PC card or expansion device isn't connected.\n"); - return -1; - } - - dev9_device_reset(); - -#ifdef PCMCIA - /* Locate the SPEED Lite chip and get the bus ready for the - PCMCIA device. */ - if (dev9type == 0) { - if ((res = card_find_manfid(0xf15300))) - M_PRINTF("SPEED Lite not found.\n"); - - if (!res && (res = pcic_ssbus_mode(5))) - M_PRINTF("Unable to change SSBUS mode.\n"); - - if (res) { - dev9Shutdown(); - return -1; - } - } -#endif - -#ifdef INIT_SMAP - if ((res = dev9_smap_init()) == 0) { - break; - } - - dev9Shutdown(); - DelayThread(4500000); - } - - if (res) { -#ifdef DEBUG - M_PRINTF("SMAP initialization failed: %d\n", res); -#endif - eeprom_data[0] = -1; - } -#endif - -#ifdef DEBUG - /* Print out the SPEED chip revision. */ - spdrev = SPD_REG16(SPD_R_REV_1); - idx = (spdrev & 0xffff) - 14; - if (spdrev == 9) - idx = 1; /* TS */ - else if (spdrev < 9 || (spdrev < 16 || spdrev > 17)) - idx = 0; /* Unknown revision */ - - M_PRINTF("SPEED chip '%s', revision 0x%0X\n", spdnames[idx], spdrev); -#endif - - return 0; -} - -#ifdef PCMCIA -static int pcic_get_cardtype(void) -{ - USE_DEV9_REGS; - u16 val = DEV9_REG(DEV9_R_1462) & 0x03; - - if (val == 0) - return 1; /* 16-bit */ - else if (val < 3) - return 2; /* CardBus */ - return 0; -} - -static int pcic_get_voltage(void) -{ - USE_DEV9_REGS; - u16 val = DEV9_REG(DEV9_R_1462) & 0x0c; - - if (val == 0x04) - return 3; - if (val == 0 || val == 0x08) - return 1; - if (val == 0x0c) - return 2; - return 0; -} - -static int pcic_power(int voltage, int flag) -{ - USE_DEV9_REGS; - u16 cstc1, cstc2; - u16 val = (voltage == 1) << 2; - - DEV9_REG(DEV9_R_POWER) = 0; - - if (voltage == 2) - val |= 0x08; - if (flag == 1) - val |= 0x10; - - DEV9_REG(DEV9_R_POWER) = val; - DelayThread(22000); - - if (DEV9_REG(DEV9_R_1462) & 0x100) - return 0; - - DEV9_REG(DEV9_R_POWER) = 0; - DEV9_REG(DEV9_R_1464) = cstc1 = DEV9_REG(DEV9_R_1464); - DEV9_REG(DEV9_R_1466) = cstc2 = DEV9_REG(DEV9_R_1466); - return -1; -} - -static void pcmcia_set_stat(int stat) -{ - USE_DEV9_REGS; - u16 val = stat & 0x01; - - if (stat & 0x10) - val = 1; - if (stat & 0x02) - val |= 0x02; - if (stat & 0x20) - val |= 0x02; - if (stat & 0x04) - val |= 0x08; - if (stat & 0x08) - val |= 0x10; - if (stat & 0x200) - val |= 0x20; - if (stat & 0x100) - val |= 0x40; - if (stat & 0x400) - val |= 0x80; - if (stat & 0x800) - val |= 0x04; - DEV9_REG(DEV9_R_1476) = val & 0xff; -} - -static int pcic_ssbus_mode(int mode) -{ - USE_DEV9_REGS; - USE_SPD_REGS; - u16 stat = DEV9_REG(DEV9_R_1474) & 7; - - if (mode != 3 && mode != 5) - return -1; - - DEV9_REG(DEV9_R_1460) = 2; - if (stat) - return -1; - - if (mode == 3) { - DEV9_REG(DEV9_R_1474) = 1; - DEV9_REG(DEV9_R_1460) = 1; - SPD_REG8(0x20) = 1; - DEV9_REG(DEV9_R_1474) = mode; - } else if (mode == 5) { - DEV9_REG(DEV9_R_1474) = mode; - DEV9_REG(DEV9_R_1460) = 1; - SPD_REG8(0x20) = 1; - DEV9_REG(DEV9_R_1474) = 7; - } - _sw(0xe01a3043, SSBUS_R_1418); - - DelayThread(5000); - DEV9_REG(DEV9_R_POWER) = DEV9_REG(DEV9_R_POWER) & ~1; - return 0; -} - -static int pcmcia_device_probe(void) -{ -#ifdef DEBUG - const char *pcic_ct_names[] = {"No", "16-bit", "CardBus"}; -#endif - int voltage; - - pcic_voltage = pcic_get_voltage(); - pcic_cardtype = pcic_get_cardtype(); - voltage = (pcic_voltage == 2 ? 5 : (pcic_voltage == 1 ? 3 : 0)); - - M_PRINTF("%s PCMCIA card detected. Vcc = %dV\n", - pcic_ct_names[pcic_cardtype], voltage); - - if (pcic_voltage == 3 || pcic_cardtype != 1) - return -1; - - return 0; -} - -static int pcmcia_device_reset(void) -{ - USE_DEV9_REGS; - u16 cstc1, cstc2; - - /* The card must be 16-bit (type 2?) */ - if (pcic_cardtype != 1) - return -1; - - DEV9_REG(DEV9_R_147E) = 1; - if (pcic_power(pcic_voltage, 1) < 0) - return -1; - - DEV9_REG(DEV9_R_POWER) = DEV9_REG(DEV9_R_POWER) | 0x02; - DelayThread(500000); - - DEV9_REG(DEV9_R_POWER) = DEV9_REG(DEV9_R_POWER) | 0x01; - DEV9_REG(DEV9_R_1464) = cstc1 = DEV9_REG(DEV9_R_1464); - DEV9_REG(DEV9_R_1466) = cstc2 = DEV9_REG(DEV9_R_1466); - return 0; -} - -static int card_find_manfid(u32 manfid) -{ - USE_DEV9_REGS; - USE_SPD_REGS; - u32 spdaddr, spdend, next, tuple; - u8 hdr, ofs; - - DEV9_REG(DEV9_R_1460) = 2; - _sw(0x1a00bb, SSBUS_R_1418); - - /* Scan the card for the MANFID tuple. */ - spdaddr = 0; - spdend = 0x1000; - /* I hate this code, and it hates me. */ - while (spdaddr < spdend) { - hdr = SPD_REG8(spdaddr) & 0xff; - spdaddr += 2; - if (!hdr) - continue; - if (hdr == 0xff) - break; - if (spdaddr >= spdend) - goto error; - - ofs = SPD_REG8(spdaddr) & 0xff; - spdaddr += 2; - if (ofs == 0xff) - break; - - next = spdaddr + (ofs * 2); - if (next >= spdend) - goto error; - - if (hdr == 0x20) { - if ((spdaddr + 8) >= spdend) - goto error; - - tuple = (SPD_REG8(spdaddr + 2) << 24) | - (SPD_REG8(spdaddr) << 16) | - (SPD_REG8(spdaddr + 6) << 8) | - SPD_REG8(spdaddr + 4); - if (manfid == tuple) - return 0; - M_PRINTF("MANFID 0x%08lx doesn't match expected 0x%08lx\n", - tuple, manfid); - return -1; - } - spdaddr = next; - } - - M_PRINTF("MANFID 0x%08lx not found.\n", manfid); - return -1; -error: - M_PRINTF("Invalid tuples at offset 0x%08lx.\n", spdaddr - SPD_REGBASE); - return -1; -} - -static int pcmcia_intr(void *unused) -{ - USE_AIF_REGS; - USE_DEV9_REGS; - u16 cstc1, cstc2; - - cstc1 = DEV9_REG(DEV9_R_1464); - cstc2 = DEV9_REG(DEV9_R_1466); - - if (using_aif) { - if (aif_regs[AIF_INTSR] & AIF_INTR_PCMCIA) - aif_regs[AIF_INTCL] = AIF_INTR_PCMCIA; - else - return 0; /* Unknown interrupt. */ - } - - /* Acknowledge the interrupt. */ - DEV9_REG(DEV9_R_1464) = cstc1; - DEV9_REG(DEV9_R_1466) = cstc2; - if (cstc1 & 0x03 || cstc2 & 0x03) { /* Card removed or added? */ - if (p_dev9_intr_cb) - p_dev9_intr_cb(1); - - /* Shutdown the card. */ - DEV9_REG(DEV9_R_POWER) = 0; - DEV9_REG(DEV9_R_1474) = 0; - - pcmcia_device_probe(); - } - if (cstc1 & 0x80 || cstc2 & 0x80) { - if (p_dev9_intr_cb) - p_dev9_intr_cb(0); - } - - DEV9_REG(DEV9_R_147E) = 1; - DEV9_REG(DEV9_R_147E) = 0; - return 1; -} - -static int pcmcia_init(void) -{ - USE_DEV9_REGS; - USE_AIF_REGS; - int *mode; - u16 cstc1, cstc2; - - _sw(0x51011, SSBUS_R_1420); - _sw(0x1a00bb, SSBUS_R_1418); - _sw(0xef1a3043, SSBUS_R_141c); - - /* If we are a T10K, then we go through AIF. */ - if ((mode = QueryBootMode(6)) != NULL) { - if ((*(u16 *)mode & 0xfe) == 0x60) { - M_PRINTF("T10K detected.\n"); - - if (aif_regs[AIF_IDENT] == 0xa1) { - aif_regs[AIF_INTEN] = AIF_INTR_PCMCIA; - using_aif = 1; - } else { - M_PRINTF("AIF not detected.\n"); - return 1; - } - } - } - - if (DEV9_REG(DEV9_R_POWER) == 0) { - DEV9_REG(DEV9_R_POWER) = 0; - DEV9_REG(DEV9_R_147E) = 1; - DEV9_REG(DEV9_R_1460) = 0; - DEV9_REG(DEV9_R_1474) = 0; - DEV9_REG(DEV9_R_1464) = cstc1 = DEV9_REG(DEV9_R_1464); - DEV9_REG(DEV9_R_1466) = cstc2 = DEV9_REG(DEV9_R_1466); - DEV9_REG(DEV9_R_1468) = 0x10; - DEV9_REG(DEV9_R_146A) = 0x90; - DEV9_REG(DEV9_R_147C) = 1; - DEV9_REG(DEV9_R_147A) = DEV9_REG(DEV9_R_147C); - - pcic_voltage = pcic_get_voltage(); - pcic_cardtype = pcic_get_cardtype(); - - if (speed_device_init() != 0) - return 1; - } else { - _sw(0xe01a3043, SSBUS_R_1418); - } - - if (dev9_init() != 0) - return 1; - - RegisterIntrHandler(IOP_IRQ_DEV9, 1, &pcmcia_intr, NULL); - EnableIntr(IOP_IRQ_DEV9); - - DEV9_REG(DEV9_R_147E) = 0; - M_PRINTF("CXD9566 (PCMCIA type) initialized.\n"); - return 0; -} -#endif - -static void expbay_set_stat(int stat) -{ - USE_DEV9_REGS; - DEV9_REG(DEV9_R_1464) = stat & 0x3f; -} - -static int expbay_device_probe(void) -{ - USE_DEV9_REGS; - return (DEV9_REG(DEV9_R_1462) & 0x01) ? -1 : 0; -} - -static int expbay_device_reset(void) -{ - USE_DEV9_REGS; - - if (expbay_device_probe() < 0) - return -1; - - DEV9_REG(DEV9_R_POWER) = (DEV9_REG(DEV9_R_POWER) & ~1) | 0x04; /* power on */ - DelayThread(500000); - - DEV9_REG(DEV9_R_1460) = DEV9_REG(DEV9_R_1460) | 0x01; - DEV9_REG(DEV9_R_POWER) = DEV9_REG(DEV9_R_POWER) | 0x01; - DelayThread(500000); - return 0; -} - -static int expbay_intr(void *unused) -{ - USE_DEV9_REGS; - - if (p_dev9_intr_cb) - p_dev9_intr_cb(0); - - DEV9_REG(DEV9_R_1466) = 1; - DEV9_REG(DEV9_R_1466) = 0; - return 1; -} - -static int expbay_init(void) -{ - USE_DEV9_REGS; - - _sw(0x51011, SSBUS_R_1420); - _sw(0xe01a3043, SSBUS_R_1418); - _sw(0xef1a3043, SSBUS_R_141c); - - if ((DEV9_REG(DEV9_R_POWER) & 0x04) == 0) { /* if not already powered */ - DEV9_REG(DEV9_R_1466) = 1; - DEV9_REG(DEV9_R_1464) = 0; - DEV9_REG(DEV9_R_1460) = DEV9_REG(DEV9_R_1464); - - if (speed_device_init() != 0) - return 1; - } - - if (dev9_init() != 0) - return 1; - - RegisterIntrHandler(IOP_IRQ_DEV9, 1, expbay_intr, NULL); - EnableIntr(IOP_IRQ_DEV9); - - DEV9_REG(DEV9_R_1466) = 0; - M_PRINTF("CXD9611 (Expansion Bay type) initialized.\n"); - return 0; -} - -#ifdef POWEROFF -static void dev9x_on_shutdown(void *p) -{ - M_PRINTF("shutdown\n"); - dev9IntrDisable(-1); - dev9Shutdown(); -} -#endif diff --git a/modules/ds3bt/ee/libds3bt.c b/modules/ds3bt/ee/libds3bt.c index 98c63c7ba..49042ba14 100644 --- a/modules/ds3bt/ee/libds3bt.c +++ b/modules/ds3bt/ee/libds3bt.c @@ -35,6 +35,12 @@ int ds3bt_init() return 1; } +int ds3bt_deinit() +{ + ds3bt_inited = 0; + return 1; +} + int ds3bt_reinit_ports(u8 ports) { if (!ds3bt_inited) @@ -59,22 +65,25 @@ int ds3bt_get_status(int port) rpcbuf[0] = port; - SifCallRpc(&ds3bt, DS3BT_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL); + if (SifCallRpc(&ds3bt, DS3BT_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL) == 0) + return rpcbuf[0]; - return rpcbuf[0]; + return 0; } int ds3bt_get_bdaddr(u8 *bdaddr) { - int i, ret; + int i, ret = 0; if (!ds3bt_inited) return 0; - ret = (SifCallRpc(&ds3bt, DS3BT_GET_BDADDR, 0, NULL, 0, rpcbuf, 6, NULL, NULL) == 0); + if (SifCallRpc(&ds3bt, DS3BT_GET_BDADDR, 0, NULL, 0, rpcbuf, 7, NULL, NULL) == 0) { + for (i = 0; i < 6; i++) + bdaddr[i] = rpcbuf[i]; - for (i = 0; i < 6; i++) - bdaddr[i] = rpcbuf[i]; + ret = rpcbuf[6]; + } return ret; } diff --git a/modules/ds3bt/ee/libds3bt.h b/modules/ds3bt/ee/libds3bt.h index 6597dbb48..9e26d85a1 100644 --- a/modules/ds3bt/ee/libds3bt.h +++ b/modules/ds3bt/ee/libds3bt.h @@ -8,6 +8,7 @@ enum eDS3BTStatus { }; int ds3bt_init(); +int ds3bt_deinit(); int ds3bt_reinit_ports(u8 ports); int ds3bt_init_charging(); int ds3bt_get_status(int port); diff --git a/modules/ds3bt/iop/ds3bt.c b/modules/ds3bt/iop/ds3bt.c index de9da1a70..95f72a512 100644 --- a/modules/ds3bt/iop/ds3bt.c +++ b/modules/ds3bt/iop/ds3bt.c @@ -20,6 +20,8 @@ #include "vblank.h" #include "ds3bt.h" +IRX_ID("ds3bt", 1, 1); + //#define DPRINTF(x...) printf(x) #define DPRINTF(x...) @@ -213,9 +215,7 @@ static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint) if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && bt_dev.outEndp < 0) { bt_dev.outEndp = UsbOpenEndpointAligned(devId, endpoint); DPRINTF("BT: register Output endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.outEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - } else - - if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.inEndp < 0) { + } else if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.inEndp < 0) { bt_dev.inEndp = UsbOpenEndpointAligned(devId, endpoint); DPRINTF("BT: register Input endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.inEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); } @@ -291,88 +291,96 @@ UsbDriver chrg_driver = {NULL, NULL, "chrg", chrg_probe, chrg_connect, chrg_disc /* PS Remote Reports */ static uint8_t feature_F4_report[] = - { - 0x42, 0x03, 0x00, 0x00}; +{ + 0x42, 0x03, 0x00, 0x00 +}; static uint8_t output_01_report[] = - { - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00}; +{ + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 +}; + +static uint8_t power_level[] = +{ + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E +}; // Taken from nefarius' SCPToolkit // https://github.com/nefarius/ScpToolkit/blob/master/ScpControl/ScpControl.ini // Valid MAC addresses used by Sony static uint8_t GenuineMacAddress[][3] = - { - // Bluetooth chips by ALPS ELECTRIC CO., LTD - {0x00, 0x02, 0xC7}, - {0x00, 0x06, 0xF5}, - {0x00, 0x06, 0xF7}, - {0x00, 0x07, 0x04}, - {0x00, 0x16, 0xFE}, - {0x00, 0x19, 0xC1}, - {0x00, 0x1B, 0xFB}, - {0x00, 0x1E, 0x3D}, - {0x00, 0x21, 0x4F}, - {0x00, 0x23, 0x06}, - {0x00, 0x24, 0x33}, - {0x00, 0x26, 0x43}, - {0x00, 0xA0, 0x79}, - {0x04, 0x76, 0x6E}, - {0x04, 0x98, 0xF3}, - {0x28, 0xA1, 0x83}, - {0x34, 0xC7, 0x31}, - {0x38, 0xC0, 0x96}, - {0x60, 0x38, 0x0E}, - {0x64, 0xD4, 0xBD}, - {0xAC, 0x7A, 0x4D}, - {0xE0, 0x75, 0x0A}, - {0xE0, 0xAE, 0x5E}, - {0xFC, 0x62, 0xB9}, - // Bluetooth chips by AzureWave Technology Inc. - {0xE0, 0xB9, 0xA5}, - {0xDC, 0x85, 0xDE}, - {0xD0, 0xE7, 0x82}, - {0xB0, 0xEE, 0x45}, - {0xAC, 0x89, 0x95}, - {0xA8, 0x1D, 0x16}, - {0x94, 0xDB, 0xC9}, - {0x80, 0xD2, 0x1D}, - {0x80, 0xA5, 0x89}, - {0x78, 0x18, 0x81}, - {0x74, 0xF0, 0x6D}, - {0x74, 0xC6, 0x3B}, - {0x74, 0x2F, 0x68}, - {0x6C, 0xAD, 0xF8}, - {0x6C, 0x71, 0xD9}, - {0x60, 0x5B, 0xB4}, - {0x5C, 0x96, 0x56}, - {0x54, 0x27, 0x1E}, - {0x4C, 0xAA, 0x16}, - {0x48, 0x5D, 0x60}, - {0x44, 0xD8, 0x32}, - {0x40, 0xE2, 0x30}, - {0x38, 0x4F, 0xF0}, - {0x28, 0xC2, 0xDD}, - {0x24, 0x0A, 0x64}, - {0x1C, 0x4B, 0xD6}, - {0x08, 0xA9, 0x5A}, - {0x00, 0x25, 0xD3}, - {0x00, 0x24, 0x23}, - {0x00, 0x22, 0x43}, - {0x00, 0x15, 0xAF}, - //fake with AirohaTechnologyCorp's Chip - {0x0C, 0xFC, 0x83}}; +{ + // Bluetooth chips by ALPS ELECTRIC CO., LTD + {0x00, 0x02, 0xC7}, + {0x00, 0x06, 0xF5}, + {0x00, 0x06, 0xF7}, + {0x00, 0x07, 0x04}, + {0x00, 0x16, 0xFE}, + {0x00, 0x19, 0xC1}, + {0x00, 0x1B, 0xFB}, + {0x00, 0x1E, 0x3D}, + {0x00, 0x21, 0x4F}, + {0x00, 0x23, 0x06}, + {0x00, 0x24, 0x33}, + {0x00, 0x26, 0x43}, + {0x00, 0xA0, 0x79}, + {0x04, 0x76, 0x6E}, + {0x04, 0x98, 0xF3}, + {0x28, 0xA1, 0x83}, + {0x34, 0xC7, 0x31}, + {0x38, 0xC0, 0x96}, + {0x60, 0x38, 0x0E}, + {0x64, 0xD4, 0xBD}, + {0xAC, 0x7A, 0x4D}, + {0xE0, 0x75, 0x0A}, + {0xE0, 0xAE, 0x5E}, + {0xFC, 0x62, 0xB9}, + // Bluetooth chips by AzureWave Technology Inc. + {0xE0, 0xB9, 0xA5}, + {0xDC, 0x85, 0xDE}, + {0xD0, 0xE7, 0x82}, + {0xB0, 0xEE, 0x45}, + {0xAC, 0x89, 0x95}, + {0xA8, 0x1D, 0x16}, + {0x94, 0xDB, 0xC9}, + {0x80, 0xD2, 0x1D}, + {0x80, 0xA5, 0x89}, + {0x78, 0x18, 0x81}, + {0x74, 0xF0, 0x6D}, + {0x74, 0xC6, 0x3B}, + {0x74, 0x2F, 0x68}, + {0x6C, 0xAD, 0xF8}, + {0x6C, 0x71, 0xD9}, + {0x60, 0x5B, 0xB4}, + {0x5C, 0x96, 0x56}, + {0x54, 0x27, 0x1E}, + {0x4C, 0xAA, 0x16}, + {0x48, 0x5D, 0x60}, + {0x44, 0xD8, 0x32}, + {0x40, 0xE2, 0x30}, + {0x38, 0x4F, 0xF0}, + {0x28, 0xC2, 0xDD}, + {0x24, 0x0A, 0x64}, + {0x1C, 0x4B, 0xD6}, + {0x08, 0xA9, 0x5A}, + {0x00, 0x25, 0xD3}, + {0x00, 0x24, 0x23}, + {0x00, 0x22, 0x43}, + {0x00, 0x15, 0xAF}, + //fake with AirohaTechnologyCorp's Chip + {0x0C, 0xFC, 0x83} +}; /* variables used by high level HCI task */ static uint16_t hci_counter_; // counter used for bluetooth HCI loops @@ -405,6 +413,7 @@ static uint8_t l2cap_connect_response(uint8_t rxid, uint16_t dcid, uint16_t scid static uint8_t l2cap_configure(uint16_t dcid, uint8_t pad); static uint8_t l2cap_config_response(uint8_t rxid, uint16_t dcid, uint8_t pad); static uint8_t l2cap_disconnect_response(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad); +static uint8_t l2cap_disconnection_request(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad); static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad); static uint8_t initPSController(int pad); @@ -555,8 +564,8 @@ static uint8_t HCI_event_task(int result) pad = current_pad; if (!result) { - /* buf[0] = Event Code */ - /* buf[1] = Parameter Total Length */ + /* buf[0] = Event Code */ + /* buf[1] = Parameter Total Length */ /* buf[n] = Event Parameters based on each event */ DPRINTF("HCI event = 0x%x\n", hci_buf[0]); switch (hci_buf[0]) { // switch on event type @@ -821,7 +830,7 @@ static void HCI_task(uint8_t pad) } /************************************************************/ -/* HCI Commands */ +/* HCI Commands */ /************************************************************/ static uint8_t hci_reset() @@ -1001,6 +1010,18 @@ static uint8_t L2CAP_event_task(int result, int bytes) l2cap_event_status_ |= L2CAP_EV_INTERRUPT_DISCONNECT_REQ; l2cap_disconnect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); } + } else if (l2cap_disconnect_response) { + DPRINTF("Disconnect Res DCID = 0x%x\n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + + ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == ds3pad[pad].command_dcid_) { + l2cap_event_status_ |= L2CAP_EV_COMMAND_DISCONNECT_REQ; + hci_disconnect(ds3pad[pad].hci_handle_); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == ds3pad[pad].interrupt_dcid_) { + l2cap_event_status_ |= L2CAP_EV_INTERRUPT_DISCONNECT_REQ; + l2cap_disconnection_request((uint8_t)(l2cap_txid_++), command_scid_, ds3pad[pad].command_dcid_, pad); + } } } else if (l2cap_interrupt) { readReport(l2cap_buf, bytes, pad); @@ -1110,7 +1131,7 @@ static void L2CAP_task(uint8_t pad) } /************************************************************/ -/* L2CAP Commands */ +/* L2CAP Commands */ /************************************************************/ static uint8_t l2cap_connect_response(uint8_t rxid, uint16_t dcid, uint16_t scid, uint8_t pad) { @@ -1186,6 +1207,22 @@ static uint8_t l2cap_disconnect_response(uint8_t rxid, uint16_t scid, uint16_t d return L2CAP_Command((uint8_t *)cmd_buf, 8, pad); } +static uint8_t l2cap_disconnection_request(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad) +{ + uint8_t cmd_buf[8]; + + cmd_buf[0] = L2CAP_CMD_DISCONNECT_REQUEST; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x04; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID + cmd_buf[5] = (uint8_t)(dcid >> 8); + cmd_buf[6] = (uint8_t)(scid & 0xff); // Source CID + cmd_buf[7] = (uint8_t)(scid >> 8); + + return L2CAP_Command((uint8_t *)cmd_buf, 8, pad); +} + static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) { l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag @@ -1204,7 +1241,7 @@ static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) } /************************************************************/ -/* HID Commands */ +/* HID Commands */ /************************************************************/ static uint8_t initPSController(int pad) @@ -1254,6 +1291,8 @@ static void readReport(uint8_t *data, int bytes, int pad) ds3pad[pad].data[15] = ((data[DATA_START + ButtonStateH] >> 3) & 1) * 255; //R1 ds3pad[pad].data[16] = ((data[DATA_START + ButtonStateH] >> 0) & 1) * 255; //L2 ds3pad[pad].data[17] = ((data[DATA_START + ButtonStateH] >> 1) & 1) * 255; //R2 + + data[DATA_START + Power] = 0x05; } else { ds3pad[pad].data[6] = data[DATA_START + PressureRight]; //right ds3pad[pad].data[7] = data[DATA_START + PressureLeft]; //left @@ -1270,8 +1309,8 @@ static void readReport(uint8_t *data, int bytes, int pad) ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 - if (data[DATA_START + PSButtonState]) //display battery level - ds3pad[pad].oldled = ~(1 << data[DATA_START + Power]) & 0x1E; + if (data[DATA_START + PSButtonState] && (data[DATA_START + Power] != 0xEE)) //display battery level + ds3pad[pad].oldled = power_level[data[DATA_START + Power]]; else ds3pad[pad].oldled = (pad + 1) << 1; @@ -1336,7 +1375,7 @@ static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) return writeReport((uint8_t *)led_buf, sizeof(output_01_report) /*PS3_01_REPORT_LEN*/ + 2, pad); } /************************************************************/ -/* DS3BT Commands */ +/* DS3BT Commands */ /************************************************************/ static uint8_t LED(uint8_t led, int pad) @@ -1391,12 +1430,13 @@ void ds3bt_set_led(uint8_t led, int port) SignalSema(bt_dev.l2cap_sema); } -void ds3bt_get_bdaddr(uint8_t *data) +int ds3bt_get_bdaddr(uint8_t *data) { uint8_t i; + int ret = 0; - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) - return; + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) || (ds3pad[0].status_ & DS3BT_STATE_RUNNING)) + return 0; WaitSema(bt_dev.hci_sema); @@ -1407,6 +1447,7 @@ void ds3bt_get_bdaddr(uint8_t *data) for (i = 0; i < 10; i++) { if (hci_read_bdaddr_complete) { mips_memcpy(data, dg_bdaddr, 6); + ret = 1; break; } @@ -1414,6 +1455,8 @@ void ds3bt_get_bdaddr(uint8_t *data) } SignalSema(bt_dev.hci_sema); + + return ret; } void ds3bt_get_data(char *dst, int size, int port) @@ -1444,27 +1487,35 @@ void ds3bt_reset() if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) return; - WaitSema(bt_dev.hci_sema); - WaitSema(bt_dev.l2cap_sema); - for (i = 0; i < MAX_PADS; i++) { + WaitSema(bt_dev.hci_sema); + WaitSema(bt_dev.l2cap_sema); + if ((ds3pad[i].status_ & DS3BT_STATE_CONNECTED) || (ds3pad[i].status_ & DS3BT_STATE_RUNNING)) { ds3pad[i].status_ &= ~DS3BT_STATE_RUNNING; ds3pad[i].l2cap_state_ = L2CAP_DOWN_STATE; UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); - hci_disconnect(ds3pad[i].hci_handle_); + if (ds3pad[i].type == HID_THDR_SET_REPORT_OUTPUT) { + l2cap_disconnection_request((uint8_t)(l2cap_txid_++), interrupt_scid_, ds3pad[i].interrupt_dcid_, i); + WaitSema(bt_dev.l2cap_sema); + WaitSema(bt_dev.l2cap_sema); + } + else { + hci_disconnect(ds3pad[i].hci_handle_); + } + WaitSema(bt_dev.hci_sema); } + + SignalSema(bt_dev.hci_sema); + SignalSema(bt_dev.l2cap_sema); } - hci_reset(); + DS3BT_init(); WaitSema(bt_dev.hci_sema); - - SignalSema(bt_dev.hci_sema); - SignalSema(bt_dev.l2cap_sema); - + DelayThread(1000000); } @@ -1529,11 +1580,6 @@ static int rpc_buf[64] __attribute((aligned(16))); void rpc_thread(void *data) { - if (sceSifCheckInit() == 0) { - DPRINTF("DS3BT: Sif not initialized \n"); - sceSifInit(); - } - SifInitRpc(0); SifSetRpcQueue(&rpc_que, GetThreadId()); SifRegisterRpc(&rpc_svr, DS3BT_BIND_RPC_ID, rpc_sf, rpc_buf, NULL, NULL, &rpc_que); @@ -1553,7 +1599,7 @@ void *rpc_sf(int cmd, void *data, int size) *(uint8_t *)data = ds3bt_get_status(*(uint8_t *)data); break; case DS3BT_GET_BDADDR: - ds3bt_get_bdaddr((uint8_t *)data); + *(uint8_t *)(data + 6) = ds3bt_get_bdaddr((uint8_t *)data); break; case DS3BT_SET_RUMBLE: ds3bt_set_rumble(*(uint8_t *)(data + 1), *(uint8_t *)(data + 2), *(uint8_t *)data); @@ -1584,9 +1630,7 @@ int _start(int argc, char *argv[]) enable_pad = enable; - int ret = UsbRegisterDriver(&bt_driver); - - if (ret != USB_RC_OK) { + if (UsbRegisterDriver(&bt_driver) != USB_RC_OK) { DPRINTF("DS3BT: Error registering BT devices\n"); return MODULE_NO_RESIDENT_END; } diff --git a/modules/ds3bt/iop/ds3bt.h b/modules/ds3bt/iop/ds3bt.h index 9f0705674..97cd8161e 100644 --- a/modules/ds3bt/iop/ds3bt.h +++ b/modules/ds3bt/iop/ds3bt.h @@ -259,6 +259,7 @@ enum eBUF_SIZE { #define l2cap_configuration_response (l2cap_buf[8] == L2CAP_CMD_CONFIG_RESPONSE) #define l2cap_configuration_success ((l2cap_buf[16] | (l2cap_buf[17] << 8)) == 0x0000) #define l2cap_disconnect_request (l2cap_buf[8] == L2CAP_CMD_DISCONNECT_REQUEST) +#define l2cap_disconnection_response (l2cap_buf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) /* Macros for HID event flag tests */ #define hid_buttons_changed (hid_flags_ & HID_FLAG_BUTTONS_CHANGED) @@ -274,6 +275,6 @@ void ds3bt_reset(); void ds3bt_get_data(char *dst, int size, int port); void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port); void ds3bt_set_led(uint8_t led, int port); -void ds3bt_get_bdaddr(uint8_t *data); +int ds3bt_get_bdaddr(uint8_t *data); #endif diff --git a/modules/ds3bt/iop/imports.lst b/modules/ds3bt/iop/imports.lst index a33c04873..bf4df641d 100644 --- a/modules/ds3bt/iop/imports.lst +++ b/modules/ds3bt/iop/imports.lst @@ -1,6 +1,3 @@ - -#include "ioman_mod.h" - sifcmd_IMPORTS_start I_sceSifInitRpc I_sceSifSetRpcQueue @@ -28,18 +25,6 @@ I_DelayThread I_GetThreadId thbase_IMPORTS_end -intrman_IMPORTS_start -I_CpuSuspendIntr -I_CpuResumeIntr -intrman_IMPORTS_end - -sifman_IMPORTS_start -I_sceSifCheckInit -I_sceSifInit -I_sceSifSetDma -I_sceSifDmaStat -sifman_IMPORTS_end - usbd_IMPORTS_start I_UsbGetDeviceStaticDescriptor I_UsbOpenEndpoint @@ -49,9 +34,3 @@ I_UsbSetDevicePrivateData I_UsbTransfer I_UsbRegisterDriver usbd_IMPORTS_end - -sysclib_IMPORTS_start -I_prnt -I_strncmp -I_strncpy -sysclib_IMPORTS_end diff --git a/modules/ds3usb/ee/libds3usb.c b/modules/ds3usb/ee/libds3usb.c index c016e2c10..11bd84551 100644 --- a/modules/ds3usb/ee/libds3usb.c +++ b/modules/ds3usb/ee/libds3usb.c @@ -35,6 +35,12 @@ int ds3usb_init() return 1; } +int ds3usb_deinit() +{ + ds3usb_inited = 0; + return 1; +} + int ds3usb_reinit_ports(u8 ports) { if (!ds3usb_inited) @@ -51,9 +57,10 @@ int ds3usb_get_status(int port) rpcbuf[0] = port; - SifCallRpc(&ds3usb, DS3USB_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL); + if (SifCallRpc(&ds3usb, DS3USB_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL) == 0) + return rpcbuf[0]; - return rpcbuf[0]; + return 0; } int ds3usb_get_bdaddr(int port, u8 *bdaddr) diff --git a/modules/ds3usb/ee/libds3usb.h b/modules/ds3usb/ee/libds3usb.h index 46562dd00..ffbc45574 100644 --- a/modules/ds3usb/ee/libds3usb.h +++ b/modules/ds3usb/ee/libds3usb.h @@ -8,6 +8,7 @@ enum eDS3USBStatus { }; int ds3usb_init(); +int ds3usb_deinit(); int ds3usb_reinit_ports(u8 ports); int ds3usb_get_status(int port); int ds3usb_get_bdaddr(int port, u8 *bdaddr); diff --git a/modules/ds3usb/iop/ds3usb.c b/modules/ds3usb/iop/ds3usb.c index a6b000efa..506df5410 100644 --- a/modules/ds3usb/iop/ds3usb.c +++ b/modules/ds3usb/iop/ds3usb.c @@ -16,25 +16,33 @@ #include "vblank.h" #include "ds3usb.h" +IRX_ID("ds3usb", 1, 1); + //#define DPRINTF(x...) printf(x) #define DPRINTF(x...) #define MAX_PADS 2 static uint8_t output_01_report[] = - { - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00}; +{ + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 +}; + +static uint8_t power_level[] = +{ + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E +}; static uint8_t usb_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; @@ -177,12 +185,12 @@ int usb_disconnect(int devId) static void usb_release(int pad) { - if (ds3pad[pad].eventEndp >= 0) - UsbCloseEndpoint(ds3pad[pad].eventEndp); - if (ds3pad[pad].sema >= 0) DeleteSema(ds3pad[pad].sema); + if (ds3pad[pad].eventEndp >= 0) + UsbCloseEndpoint(ds3pad[pad].eventEndp); + ds3pad[pad].controlEndp = -1; ds3pad[pad].eventEndp = -1; ds3pad[pad].devId = -1; @@ -263,8 +271,8 @@ static void readReport(uint8_t *data, int pad) ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 - if (data[DATA_START + PSButtonState]) //display battery level - ds3pad[pad].oldled = ~(1 << data[DATA_START + Power]) & 0x1E; + if (data[DATA_START + PSButtonState] && (data[DATA_START + Power] != 0xEE)) //display battery level + ds3pad[pad].oldled = power_level[data[DATA_START + Power]]; else ds3pad[pad].oldled = (pad + 1) << 1; @@ -452,11 +460,6 @@ static int rpc_buf[64] __attribute((aligned(16))); void rpc_thread(void *data) { - if (sceSifCheckInit() == 0) { - DPRINTF("DS3USB: Sif not initialized \n"); - sceSifInit(); - } - SifInitRpc(0); SifSetRpcQueue(&rpc_que, GetThreadId()); SifRegisterRpc(&rpc_svr, DS3USB_BIND_RPC_ID, rpc_sf, rpc_buf, NULL, NULL, &rpc_que); diff --git a/modules/ds3usb/iop/imports.lst b/modules/ds3usb/iop/imports.lst index a33c04873..bf4df641d 100644 --- a/modules/ds3usb/iop/imports.lst +++ b/modules/ds3usb/iop/imports.lst @@ -1,6 +1,3 @@ - -#include "ioman_mod.h" - sifcmd_IMPORTS_start I_sceSifInitRpc I_sceSifSetRpcQueue @@ -28,18 +25,6 @@ I_DelayThread I_GetThreadId thbase_IMPORTS_end -intrman_IMPORTS_start -I_CpuSuspendIntr -I_CpuResumeIntr -intrman_IMPORTS_end - -sifman_IMPORTS_start -I_sceSifCheckInit -I_sceSifInit -I_sceSifSetDma -I_sceSifDmaStat -sifman_IMPORTS_end - usbd_IMPORTS_start I_UsbGetDeviceStaticDescriptor I_UsbOpenEndpoint @@ -49,9 +34,3 @@ I_UsbSetDevicePrivateData I_UsbTransfer I_UsbRegisterDriver usbd_IMPORTS_end - -sysclib_IMPORTS_start -I_prnt -I_strncmp -I_strncpy -sysclib_IMPORTS_end diff --git a/modules/hdd/apa/Makefile b/modules/hdd/apa/Makefile deleted file mode 100644 index d9b4267cb..000000000 --- a/modules/hdd/apa/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -LIBAPA_PATH = ../libapa -LIBAPA_SRC_DIR = $(LIBAPA_PATH)/src/ - -IOP_BIN = ps2hdd.irx -APA_OBJS = misc.o cache.o apa.o journal.o free.o password.o -IOP_OBJS = hdd_fio.o hdd.o imports.o $(APA_OBJS) - -IOP_INCS += -I$(CURDIR) -I$(LIBAPA_PATH)/include -I../common -IOP_CFLAGS += -Wall -fno-builtin-printf -IOP_LDFLAGS += -s - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) - -rebuild: clean all - -$(IOP_OBJS_DIR)%.o : $(LIBAPA_SRC_DIR)%.c - $(IOP_CC) $(IOP_CFLAGS) -c $< -o $@ - -include $(PS2SDK)/Defs.make -include ../../Rules.make diff --git a/modules/hdd/apa/apa-opt.h b/modules/hdd/apa/apa-opt.h deleted file mode 100644 index 0d3855886..000000000 --- a/modules/hdd/apa/apa-opt.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _APA_OPT_H -#define _APA_OPT_H - -#define APA_PRINTF(format, ...) printf(format, ##__VA_ARGS__) -#define APA_DRV_NAME "hdd" - -/* Define (in your Makefile!) to build an OSD version, which will: - 1. When formatting, do not create any partitions other than __mbr. - 2. __mbr will be formatted with its password. - 3. All partitions can be accessed, even without the right password. - 4. The starting LBA of the partition will be returned in - the private_5 field of the stat structure (returned by getstat and dread). */ -#define APA_OSD_VER 1 - -#ifdef APA_OSD_VER -#define APA_STAT_RETURN_PART_LBA 1 -#define APA_FORMAT_LOCK_MBR 1 -#else -#define APA_ENABLE_PASSWORDS 1 -#define APA_FORMAT_MAKE_PARTITIONS 1 -#endif - -#endif diff --git a/modules/hdd/apa/hdd.c b/modules/hdd/apa/hdd.c deleted file mode 100644 index 820c93ccf..000000000 --- a/modules/hdd/apa/hdd.c +++ /dev/null @@ -1,252 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# Start Up routines -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "apa-opt.h" -#include -#include "hdd.h" -#include "hdd_fio.h" -#include "opl-hdd-ioctl.h" - -IRX_ID("hdd_driver", APA_MODVER_MAJOR, APA_MODVER_MINOR); - -static iop_device_ops_t hddOps = { - hddInit, - hddDeinit, - hddFormat, - hddOpen, - hddClose, - hddRead, - hddWrite, - hddLseek, - (void *)hddUnsupported, - hddRemove, - (void *)hddUnsupported, - (void *)hddUnsupported, - hddDopen, - hddClose, - hddDread, - hddGetStat, - (void *)hddUnsupported, - hddReName, - (void *)hddUnsupported, - (void *)hddUnsupported, - (void *)hddUnsupported, - (void *)hddUnsupported, - (void *)hddUnsupported, - hddDevctl, - (void *)hddUnsupported, - (void *)hddUnsupported, - hddIoctl2, -}; -static iop_device_t hddFioDev = { - "hdd", - IOP_DT_BLOCK | IOP_DT_FSEXT, - 1, - "HDD", - (struct _iop_device_ops *)&hddOps, -}; - -apa_device_t hddDevices[2] = { - {0, 0, 0, 3}, - {0, 0, 0, 3}}; - -extern u32 apaMaxOpen; -extern hdd_file_slot_t *hddFileSlots; - -static int inputError(char *input); -static int unlockDrive(s32 device); - -int hddCheckPartitionMax(s32 device, u32 size) -{ - return (hddDevices[device].partitionMaxSize >= size) ? 0 : -EINVAL; -} - -apa_cache_t *hddAddPartitionHere(s32 device, const apa_params_t *params, u32 *emptyBlocks, - u32 sector, int *err) -{ - apa_cache_t *clink_this; - apa_cache_t *clink_next; - apa_cache_t *clink_new; - apa_header_t *header; - u32 i; - u32 tmp, some_size, part_end; - u32 tempSize; - - // walk empty blocks in case can use one :) - for (i = 0; i < 32; i++) { - if ((1 << i) >= params->size && emptyBlocks[i] != 0) - return apaInsertPartition(device, params, emptyBlocks[i], err); - } - clink_this = apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err); - header = clink_this->header; - part_end = header->start + header->length; - some_size = (part_end % params->size); - tmp = some_size ? params->size - some_size : 0; - - if (hddDevices[device].totalLBA < (part_end + params->size + tmp) - //Non-SONY: when dealing with large disks, this check may overflow (therefore, check for overflows!). - || (part_end < sector)) { - *err = -ENOSPC; - apaCacheFree(clink_this); - return NULL; - } - - if ((clink_next = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, err)) == NULL) { - apaCacheFree(clink_this); - return NULL; - } - - tempSize = params->size; - while (part_end % params->size) { - tempSize = params->size >> 1; - while (0x3FFFF < tempSize) { - if (!(part_end % tempSize)) { - clink_new = apaRemovePartition(device, part_end, 0, - clink_this->header->start, tempSize); - clink_this->header->next = part_end; - clink_this->flags |= APA_CACHE_FLAG_DIRTY; - clink_next->header->prev = clink_new->header->start; - part_end += tempSize; - clink_next->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink_this); - clink_this = clink_new; - break; - } - tempSize >>= 1; - } - } - if ((clink_new = apaFillHeader(device, params, part_end, 0, clink_this->header->start, - params->size, err)) != NULL) { - clink_this->header->next = part_end; - clink_this->flags |= APA_CACHE_FLAG_DIRTY; - clink_next->header->prev = clink_new->header->start; - clink_next->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - } - apaCacheFree(clink_this); - apaCacheFree(clink_next); - return clink_new; -} - -static int inputError(char *input) -{ - APA_PRINTF(APA_DRV_NAME ": Error: Usage: %s [-o ] [-n ]\n", input); - return 1; -} - -static void printStartup(void) -{ - APA_PRINTF(APA_DRV_NAME ": PS2 APA Driver v%d.%d (c) 2003 Vector\n", APA_MODVER_MAJOR, APA_MODVER_MINOR); - return; -} - -static int unlockDrive(s32 device) -{ - u8 id[32]; - int rv; - if ((rv = apaGetIlinkID(id)) == 0) - return ata_device_sce_sec_unlock(device, id); - return rv; -} - -int _start(int argc, char **argv) -{ - int i; - char *input; - int cacheSize = 3; - apa_ps2time_t tm; - ata_devinfo_t *hddInfo; - - printStartup(); - - if ((input = strrchr(argv[0], '/'))) - input++; - else - input = argv[0]; - - argc--; - argv++; - while (argc) { - if (argv[0][0] != '-') - break; - if (strcmp("-o", argv[0]) == 0) { - argc--; - argv++; - if (!argc) - return inputError(input); - i = strtol(argv[0], 0, 10); - if (i - 1 < 32) - apaMaxOpen = i; - } else if (strcmp("-n", argv[0]) == 0) { - argc--; - argv++; - if (!argc) - return inputError(input); - i = strtol(*argv, 0, 10); - if (cacheSize < i) - cacheSize = i; - } - argc--; - argv++; - } - - APA_PRINTF(APA_DRV_NAME ": max open = %ld, %d buffers\n", apaMaxOpen, cacheSize); - apaGetTime(&tm); - APA_PRINTF(APA_DRV_NAME ": %02d:%02d:%02d %02d/%02d/%d\n", - tm.hour, tm.min, tm.sec, tm.month, tm.day, tm.year); - for (i = 0; i < 2; i++) { - if (!(hddInfo = ata_get_devinfo(i))) { - APA_PRINTF(APA_DRV_NAME ": Error: ata initialization failed.\n"); - return 0; - } - if (hddInfo->exists != 0 && hddInfo->has_packet == 0) { - hddDevices[i].status--; - hddDevices[i].totalLBA = hddInfo->total_sectors; - hddDevices[i].partitionMaxSize = apaGetPartitionMax(hddInfo->total_sectors); - if (unlockDrive(i) == 0) - hddDevices[i].status--; - APA_PRINTF(APA_DRV_NAME ": disk%d: 0x%08lx sectors, max 0x%08lx\n", i, - hddDevices[i].totalLBA, hddDevices[i].partitionMaxSize); - } - } - hddFileSlots = apaAllocMem(apaMaxOpen * sizeof(hdd_file_slot_t)); - if (hddFileSlots) - memset(hddFileSlots, 0, apaMaxOpen * sizeof(hdd_file_slot_t)); - - apaCacheInit(cacheSize); - for (i = 0; i < 2; i++) { - if (hddDevices[i].status < 2) { - if (apaJournalRestore(i) != 0) - return 1; - if (apaGetFormat(i, &hddDevices[i].format)) - hddDevices[i].status--; - APA_PRINTF(APA_DRV_NAME ": drive status %d, format version %08x\n", - hddDevices[i].status, hddDevices[i].format); - } - } - DelDrv("hdd"); - if (AddDrv(&hddFioDev) == 0) { - APA_PRINTF(APA_DRV_NAME ": driver start.\n"); - return MODULE_RESIDENT_END; - } - return MODULE_NO_RESIDENT_END; -} diff --git a/modules/hdd/apa/hdd.h b/modules/hdd/apa/hdd.h deleted file mode 100644 index d30998727..000000000 --- a/modules/hdd/apa/hdd.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# HDD.IRX APA Header file -*/ - -#ifndef _HDD_H -#define _HDD_H - -typedef struct -{ - iop_file_t *f; // used to see if open... - u32 post; // offset/post.... - u16 nsub; - u16 type; - char id[APA_IDMAX]; - apa_sub_t parts[APA_MAXSUB + 1]; // Partition data (0 = main partition, 1+ = sub-partition) -} hdd_file_slot_t; - -/////////////////////////////////////////////////////////////////////////////// -// Function declarations -int hddCheckPartitionMax(s32 device, u32 size); -apa_cache_t *hddAddPartitionHere(s32 device, const apa_params_t *params, u32 *EmptyBlocks, u32 sector, int *err); - -#endif diff --git a/modules/hdd/apa/hdd_fio.c b/modules/hdd/apa/hdd_fio.c deleted file mode 100644 index 09a14d44f..000000000 --- a/modules/hdd/apa/hdd_fio.c +++ /dev/null @@ -1,1018 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# APA File System routines -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "opl-hdd-ioctl.h" - -#include "apa-opt.h" -#include -#include "hdd.h" -#include "hdd_fio.h" - -hdd_file_slot_t *hddFileSlots; -int fioSema; -u32 apaMaxOpen = 1; - -extern const char apaMBRMagic[]; -extern apa_device_t hddDevices[]; - -#ifdef APA_FORMAT_MAKE_PARTITIONS -static const char *formatPartList[] = { - "__net", "__system", "__sysconf", "__common", NULL}; -#endif - -#define APA_NUMBER_OF_SIZES 9 -static const char *sizeList[APA_NUMBER_OF_SIZES] = { - "128M", "256M", "512M", "1G", "2G", "4G", "8G", "16G", "32G"}; - -/////////////////////////////////////////////////////////////////////////////// -// Function declarations -static int fioPartitionSizeLookUp(char *str); -static int fioInputBreaker(char const **arg, char *outBuf, int maxout); -static int fioDataTransfer(iop_file_t *f, void *buf, int size, int mode); -static int getFileSlot(apa_params_t *params, hdd_file_slot_t **fileSlot); -static int ioctl2Transfer(s32 device, hdd_file_slot_t *fileSlot, hddIoctl2Transfer_t *arg); -static void fioGetStatFiller(apa_cache_t *clink1, iox_stat_t *stat); -static int ioctl2AddSub(hdd_file_slot_t *fileSlot, char *argp); -static int ioctl2DeleteLastSub(hdd_file_slot_t *fileSlot); -static int devctlSwapTemp(s32 device, char *argp); - -static int fioPartitionSizeLookUp(char *str) -{ - int i; - - for (i = 0; i < APA_NUMBER_OF_SIZES; i++) { - if (strcmp(str, sizeList[i]) == 0) - return (256 * 1024) << i; - } - APA_PRINTF(APA_DRV_NAME ": Error: Invalid partition size, %s.\n", str); - return -EINVAL; -} - -static int fioInputBreaker(char const **arg, char *outBuf, int maxout) -{ - u32 len; - char *p; - - if ((p = strchr(arg[0], ','))) { - if (maxout < (len = p - arg[0])) - return -EINVAL; - memcpy(outBuf, arg[0], len); - arg[0] = p + 1; - while (arg[0][0] == ' ') - arg[0] += 1; - return 0; - } // else - if (maxout < (len = strlen(arg[0]))) - return -EINVAL; - memcpy(outBuf, arg[0], len); - arg[0] += len; - return 0; -} - -struct apaFsType -{ - const char *desc; - u16 type; -}; - -static int fioGetInput(const char *arg, apa_params_t *params) -{ - char argBuf[32]; - int rv = 0, i; - static const struct apaFsType fsTypes[] = { - {"PFS", APA_TYPE_PFS}, - {"CFS", APA_TYPE_CFS}, - {"EXT2", APA_TYPE_EXT2}, - {"EXT2SWAP", APA_TYPE_EXT2SWAP}}; - - if (params == NULL) - return -EINVAL; - memset(params, 0, sizeof(apa_params_t)); - - while (arg[0] == ' ') - arg++; - - if (arg[0] == 0 || arg[0] == ',') - return -EINVAL; - if ((rv = fioInputBreaker(&arg, params->id, APA_IDMAX)) != 0) - return rv; - if (arg[0] == '\0') // Return if there are no further parameters. - return 0; - - if ((rv = fioInputBreaker(&arg, params->fpwd, APA_PASSMAX)) != 0) - return rv; - - if (params->fpwd[0] != '\0') - apaEncryptPassword(params->id, params->fpwd, params->fpwd); - - if (arg[0] == '\0') // Return if there are no further parameters. - return 0; - - if ((rv = fioInputBreaker(&arg, params->rpwd, APA_PASSMAX)) != 0) - return rv; - - if (params->rpwd[0] != '\0') - apaEncryptPassword(params->id, params->rpwd, params->rpwd); - - if (arg[0] == '\0') // Return if there are no further parameters. - return 0; - - memset(argBuf, 0, sizeof(argBuf)); - if ((rv = fioInputBreaker(&arg, argBuf, sizeof(argBuf))) != 0) - return rv; - - if ((rv = fioPartitionSizeLookUp(argBuf)) < 0) - return rv; - params->size = rv; - - memset(argBuf, 0, sizeof(argBuf)); - if ((rv = fioInputBreaker(&arg, argBuf, sizeof(argBuf))) != 0) - return rv; - - for (i = 0; i < 4; i++) { - if (!strcmp(argBuf, fsTypes[i].desc)) { - params->type = fsTypes[i].type; - break; - } - } - - if (i == 4) { - printf("hdd: error: Invalid fstype, %s.\n", argBuf); - return -EINVAL; - } - - return rv; -} - -static int getFileSlot(apa_params_t *params, hdd_file_slot_t **fileSlot) -{ - int i; - - for (i = 0; i < apaMaxOpen; i++) { - if (hddFileSlots[i].f) - if (memcmp(hddFileSlots[i].id, ¶ms->id, APA_IDMAX) == 0) - return -EBUSY; // file is open - } - for (i = 0; i < apaMaxOpen; i++) { - if (!hddFileSlots[i].f) { - *fileSlot = &hddFileSlots[i]; - return 0; - } - } - return -EMFILE; // no file slots free :( -} - -static int fioDataTransfer(iop_file_t *f, void *buf, int size, int mode) -{ - hdd_file_slot_t *fileSlot = (hdd_file_slot_t *)f->privdata; - - if ((size & 0x1FF)) - return -EINVAL; - size >>= 9; // size/512 - - if (fileSlot->post + size >= 0x1FF9) // no over reading - size = 0x1FF8 - fileSlot->post; - - if (size != 0) { - int rv = 0; - - WaitSema(fioSema); - if (ata_device_sector_io(f->unit, buf, fileSlot->post + fileSlot->parts[0].start + 8, size, mode)) - rv = -EIO; - SignalSema(fioSema); - if (rv == 0) { - fileSlot->post += size; - return size << 9; - } - - return rv; - } - return 0; -} - -static int ioctl2Transfer(s32 device, hdd_file_slot_t *fileSlot, hddIoctl2Transfer_t *arg) -{ - if (fileSlot->nsub < arg->sub) - return -ENODEV; - - // main partitions can only be read starting from the 4MB offset. - if (arg->sub == 0 && (arg->sector < 0x2000)) - return -EINVAL; - // sub-partitions can only be read starting from after the header. - if (arg->sub != 0 && (arg->sector < 2)) - return -EINVAL; - - if (fileSlot->parts[arg->sub].length < arg->sector + arg->size) - return -ENXIO; - - if (ata_device_sector_io(device, arg->buffer, - fileSlot->parts[arg->sub].start + arg->sector, arg->size, arg->mode)) - return -EIO; - - return 0; -} - -int hddInit(iop_device_t *f) -{ - iop_sema_t sema; - - sema.attr = 1; - sema.initial = 1; - sema.max = 1; - sema.option = 0; - fioSema = CreateSema(&sema); - - return 0; -} - -int hddDeinit(iop_device_t *f) -{ - DeleteSema(fioSema); - return 0; -} - -int hddFormat(iop_file_t *f, const char *dev, const char *blockdev, void *arg, int arglen) -{ - int rv = 0; - apa_cache_t *clink; - u32 i; -#ifdef APA_FORMAT_MAKE_PARTITIONS - apa_params_t params; - u32 emptyBlocks[32]; -#endif - - if (f->unit >= 2) - return -ENXIO; - - // clear all errors on hdd - clink = apaCacheAlloc(); - memset(clink->header, 0, sizeof(apa_header_t)); - if (ata_device_sector_io(f->unit, clink->header, APA_SECTOR_SECTOR_ERROR, 1, ATA_DIR_WRITE)) { - apaCacheFree(clink); - return -EIO; - } - if (ata_device_sector_io(f->unit, clink->header, APA_SECTOR_PART_ERROR, 1, ATA_DIR_WRITE)) { - apaCacheFree(clink); - return -EIO; - } - // clear apa headers - for (i = 1024 * 8; i < hddDevices[f->unit].totalLBA; i += (1024 * 256)) { - ata_device_sector_io(f->unit, clink->header, i, sizeof(apa_header_t) / 512, - ATA_DIR_WRITE); - } - apaCacheFree(clink); - if ((rv = apaJournalReset(f->unit)) != 0) - return rv; - - // set up mbr :) - if ((clink = apaCacheGetHeader(f->unit, 0, APA_IO_MODE_WRITE, &rv))) { - apa_header_t *header = clink->header; - memset(header, 0, sizeof(apa_header_t)); - header->magic = APA_MAGIC; - header->length = (1024 * 256); // 128MB - header->type = APA_TYPE_MBR; - strcpy(header->id, "__mbr"); -#ifdef APA_FORMAT_LOCK_MBR - apaEncryptPassword(header->id, header->fpwd, "sce_mbr"); - apaEncryptPassword(header->id, header->rpwd, "sce_mbr"); -#endif - memcpy(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic)); - - header->mbr.version = APA_MBR_VERSION; - header->mbr.nsector = 0; - apaGetTime(&header->created); - apaGetTime(&header->mbr.created); - header->checksum = apaCheckSum(header); - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushDirty(clink); - ata_device_flush_cache(f->unit); - apaCacheFree(clink); - hddDevices[f->unit].status = 0; - hddDevices[f->unit].format = APA_MBR_VERSION; - } -#ifdef APA_FORMAT_MAKE_PARTITIONS - memset(&emptyBlocks, 0, sizeof(emptyBlocks)); - memset(¶ms, 0, sizeof(apa_params_t)); - params.size = (1024 * 256); - params.type = APA_TYPE_PFS; - - // add __net, __system.... - for (i = 0; formatPartList[i]; i++) { - memset(params.id, 0, APA_IDMAX); - strcpy(params.id, formatPartList[i]); - if (!(clink = hddAddPartitionHere(f->unit, ¶ms, emptyBlocks, i ? clink->sector : 0, &rv))) - return rv; - apaCacheFree(clink); - - params.size <<= 1; - if (hddDevices[f->unit].partitionMaxSize < params.size) - params.size = hddDevices[f->unit].partitionMaxSize; - } -#endif - return rv; -} - -static int apaOpen(s32 device, hdd_file_slot_t *fileSlot, apa_params_t *params, int mode) -{ - int rv = 0; - u32 emptyBlocks[32]; - apa_cache_t *clink; - apa_cache_t *clink2; - u32 sector = 0; - - // walk all looking for any empty blocks & look for partition - clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv); - memset(&emptyBlocks, 0, sizeof(emptyBlocks)); - while (clink) { - sector = clink->sector; - if (!(clink->header->flags & APA_FLAG_SUB)) { - if (memcmp(clink->header->id, params->id, APA_IDMAX) == 0) - break; // found :) - } - apaAddEmptyBlock(clink->header, emptyBlocks); - clink = apaGetNextHeader(clink, &rv); - } - - if (rv != 0) - return rv; - rv = -ENOENT; - - if (clink == NULL && (mode & O_CREAT)) { - if ((rv = hddCheckPartitionMax(device, params->size)) >= 0) { - if ((clink = hddAddPartitionHere(device, params, emptyBlocks, sector, &rv)) != NULL) { - sector = clink->header->start; - clink2 = apaCacheAlloc(); - memset(clink2->header, 0, sizeof(apa_header_t)); - ata_device_sector_io(device, clink2->header, sector + 8, 2, ATA_DIR_WRITE); - ata_device_sector_io(device, clink2->header, sector + 0x2000, 2, ATA_DIR_WRITE); - apaCacheFree(clink2); - } - } - } - if (clink == NULL) - return rv; - fileSlot->parts[0].start = clink->header->start; - fileSlot->parts[0].length = clink->header->length; - memcpy(&fileSlot->parts[1], &clink->header->subs, APA_MAXSUB * sizeof(apa_sub_t)); - fileSlot->type = clink->header->type; - fileSlot->nsub = clink->header->nsub; - memcpy(&fileSlot->id, &clink->header->id, APA_IDMAX); - apaCacheFree(clink); - if (apaPassCmp(clink->header->fpwd, params->fpwd) != 0) { - rv = (!(mode & O_WRONLY)) ? apaPassCmp(clink->header->rpwd, params->rpwd) : -EACCES; - } else - rv = 0; - - return rv; -} - -static int apaRemove(s32 device, const char *id, const char *fpwd) -{ - u32 nsub, i; - apa_cache_t *clink; - apa_cache_t *clink2; - int rv; - - for (i = 0; i < apaMaxOpen; i++) // look to see if open - { - if (hddFileSlots[i].f != 0) { - if (memcmp(hddFileSlots[i].id, id, APA_IDMAX) == 0) - return -EBUSY; - } - } - if (id[0] == '_' && id[1] == '_') - return -EACCES; - if ((clink = apaFindPartition(device, id, &rv)) == NULL) - return rv; - if (apaPassCmp(clink->header->fpwd, fpwd)) { - apaCacheFree(clink); - return -EACCES; - } - // remove all subs frist... - nsub = clink->header->nsub; - clink->header->nsub = 0; - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - for (i = nsub - 1; i != -1; i--) { - if ((clink2 = apaCacheGetHeader(device, clink->header->subs[i].start, APA_IO_MODE_READ, &rv))) { - if ((rv = apaDelete(clink2))) { - apaCacheFree(clink); - return rv; - } - } - } - if (rv == 0) - return apaDelete(clink); - - apaCacheFree(clink); - return rv; -} - -// Unofficial helper for renaming APA partitions. -static int apaRename(s32 device, const apa_params_t *oldParams, const apa_params_t *newParams) -{ - apa_cache_t *clink; - int i, rv; - - // look to see if can make(newname) or not... - if ((clink = apaFindPartition(device, newParams->id, &rv)) != NULL) { - apaCacheFree(clink); - SignalSema(fioSema); - return -EEXIST; // File exists - } - - // look to see if open(oldname) - for (i = 0; i < apaMaxOpen; i++) { - if (hddFileSlots[i].f != NULL) { - if (memcmp(hddFileSlots[i].id, oldParams->id, APA_IDMAX) == 0) { - SignalSema(fioSema); - return -EBUSY; - } - } - } - - // Do not allow system partitions (__*) to be renamed. - if (oldParams->id[0] == '_' && oldParams->id[1] == '_') - return -EACCES; - - // find :) - if ((clink = apaFindPartition(device, oldParams->id, &rv)) == NULL) { - SignalSema(fioSema); - return rv; - } - - // Check for access rights. - if (apaPassCmp(clink->header->fpwd, oldParams->fpwd) != 0) { - apaCacheFree(clink); - return -EACCES; - } - - // do the renaming :) note: subs have no names!! - memcpy(clink->header->id, newParams->id, APA_IDMAX); - - // Update passwords - memcpy(clink->header->rpwd, newParams->rpwd, APA_PASSMAX); - memcpy(clink->header->fpwd, newParams->fpwd, APA_PASSMAX); - - clink->flags |= APA_CACHE_FLAG_DIRTY; - - apaCacheFlushAllDirty(device); - apaCacheFree(clink); - - return 0; -} - -int hddRemove(iop_file_t *f, const char *name) -{ - int rv; - apa_params_t params; - - if ((rv = fioGetInput(name, ¶ms)) < 0) - return rv; - - WaitSema(fioSema); - rv = apaRemove(f->unit, params.id, params.fpwd); - SignalSema(fioSema); - - return rv; -} - -int hddOpen(iop_file_t *f, const char *name, int flags, int mode) -{ - int rv; - apa_params_t params; - hdd_file_slot_t *fileSlot; - - if (f->unit >= 2 || hddDevices[f->unit].status != 0) - return -ENODEV; - - if (!(f->mode & O_DIROPEN)) - if ((rv = fioGetInput(name, ¶ms)) < 0) - return rv; - - WaitSema(fioSema); - if ((rv = getFileSlot(¶ms, &fileSlot)) == 0) { - if (!(f->mode & O_DIROPEN)) { - if ((rv = apaOpen(f->unit, fileSlot, ¶ms, flags)) == 0) { - fileSlot->f = f; - f->privdata = fileSlot; - } - } else { - fileSlot->f = f; - f->privdata = fileSlot; - } - } - SignalSema(fioSema); - return rv; -} - -int hddClose(iop_file_t *f) -{ - WaitSema(fioSema); - memset(f->privdata, 0, sizeof(hdd_file_slot_t)); - SignalSema(fioSema); - return 0; -} - -int hddRead(iop_file_t *f, void *buf, int size) -{ - return fioDataTransfer(f, buf, size, ATA_DIR_READ); -} - -int hddWrite(iop_file_t *f, void *buf, int size) -{ - if (!(f->mode & O_WRONLY)) - return -EACCES; - return fioDataTransfer(f, buf, size, ATA_DIR_WRITE); -} - -int hddLseek(iop_file_t *f, int post, int whence) -{ - int rv = 0; - hdd_file_slot_t *fileSlot; - - // test input( no seeking to end point less :P ) - if (whence == SEEK_END) - return -EINVAL; - if ((post & 0x1FF)) - return -EINVAL; - - post >>= 9; // post/512 - - WaitSema(fioSema); - fileSlot = f->privdata; - if (whence == SEEK_CUR) { - if ((fileSlot->post + post) < 0 || (fileSlot->post + post) >= 0x1FF9) - rv = -EINVAL; - else { - fileSlot->post += post; - rv = fileSlot->post << 9; - } - } else if (whence == SEEK_SET) { - if (post < 0 || post >= 0x1FF9) - rv = -EINVAL; - else { - fileSlot->post = post; - rv = fileSlot->post << 9; - } - } - SignalSema(fioSema); - return rv; -} - -static void fioGetStatFiller(apa_cache_t *clink, iox_stat_t *stat) -{ - stat->mode = clink->header->type; - stat->attr = clink->header->flags; - stat->hisize = 0; - stat->size = clink->header->length; - memcpy(&stat->ctime, &clink->header->created, sizeof(apa_ps2time_t)); - memcpy(&stat->atime, &clink->header->created, sizeof(apa_ps2time_t)); - memcpy(&stat->mtime, &clink->header->created, sizeof(apa_ps2time_t)); - if (clink->header->flags & APA_FLAG_SUB) - stat->private_0 = clink->header->number; - else - stat->private_0 = clink->header->nsub; - stat->private_1 = 0; - stat->private_2 = 0; - stat->private_3 = 0; - stat->private_4 = 0; -#ifndef APA_STAT_RETURN_PART_LBA - stat->private_5 = 0; // game ver -#else - stat->private_5 = clink->header->start; // SONY ver (return start LBA of the partition) -#endif -} - -int hddGetStat(iop_file_t *f, const char *name, iox_stat_t *stat) -{ - apa_cache_t *clink; - apa_params_t params; - int rv; - - if ((rv = fioGetInput(name, ¶ms)) < 0) - return rv; - - WaitSema(fioSema); - if ((clink = apaFindPartition(f->unit, params.id, &rv))) { - if ((rv = apaPassCmp(clink->header->fpwd, params.fpwd)) == 0 || (rv = apaPassCmp(clink->header->rpwd, params.rpwd)) == 0) - fioGetStatFiller(clink, stat); - apaCacheFree(clink); - } - SignalSema(fioSema); - return rv; -} - -int hddDopen(iop_file_t *f, const char *name) -{ - return hddOpen(f, name, 0, 0); -} - -int hddDread(iop_file_t *f, iox_dirent_t *dirent) -{ - int rv; - hdd_file_slot_t *fileSlot = f->privdata; - apa_cache_t *clink; - - if (!(f->mode & O_DIROPEN)) - return -ENOTDIR; - - if (fileSlot->parts[0].start == -1) - return 0; // end :) - - WaitSema(fioSema); - if ((clink = apaCacheGetHeader(f->unit, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv)) && - clink->header->length) { - if (clink->header->flags & APA_FLAG_SUB) { - // if sub get id from main header... - apa_cache_t *cmain = apaCacheGetHeader(f->unit, clink->header->main, APA_IO_MODE_READ, &rv); - if (cmain != NULL) { - /* This was the SONY original, which didn't do bounds-checking: - rv=strlen(cmain->header->id); - strcpy(dirent->name, cmain->header->id); */ - strncpy(dirent->name, cmain->header->id, APA_IDMAX); - dirent->name[APA_IDMAX] = '\0'; - rv = strlen(dirent->name); - - apaCacheFree(cmain); - } - } else { - /* This was the SONY original, which didn't do bounds-checking: - rv=strlen(clink->header->id); - strcpy(dirent->name, clink->header->id); */ - strncpy(dirent->name, clink->header->id, APA_IDMAX); - dirent->name[APA_IDMAX] = '\0'; - rv = strlen(dirent->name); - } - fioGetStatFiller(clink, &dirent->stat); - if (clink->header->next == 0) - fileSlot->parts[0].start = -1; // mark end - else - fileSlot->parts[0].start = clink->header->next; // set next - apaCacheFree(clink); - } - SignalSema(fioSema); - return rv; -} - -/* Originally, SONY provided no function for renaming partitions. - Syntax: rename , , - - The full-access password (fpwd) is required. - System partitions (__*) cannot be renamed. */ -int hddReName(iop_file_t *f, const char *oldname, const char *newname) -{ - apa_params_t oldParams; - apa_params_t newParams; - int rv; - - if ((rv = fioGetInput(oldname, &oldParams)) < 0) - return rv; - if ((rv = fioGetInput(newname, &newParams)) < 0) - return rv; - - WaitSema(fioSema); - rv = apaRename(f->unit, &oldParams, &newParams); - SignalSema(fioSema); - - return rv; -} - -static int ioctl2AddSub(hdd_file_slot_t *fileSlot, char *argp) -{ - int rv; - u32 device = fileSlot->f->unit; - apa_params_t params; - u32 emptyBlocks[32]; - apa_cache_t *clink; - u32 sector = 0; - u32 length; - - if (!(fileSlot->f->mode & O_WRONLY)) - return -EACCES; - - if (!(fileSlot->nsub < APA_MAXSUB)) - return -EFBIG; - - memset(¶ms, 0, sizeof(apa_params_t)); - - if ((rv = fioPartitionSizeLookUp(argp)) < 0) - return rv; - - params.size = rv; - params.flags = APA_FLAG_SUB; - params.type = fileSlot->type; - params.main = fileSlot->parts[0].start; - params.number = fileSlot->nsub + 1; - if ((rv = hddCheckPartitionMax(device, params.size)) < 0) - return rv; - - // walk all looking for any empty blocks - memset(&emptyBlocks, 0, sizeof(emptyBlocks)); - clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv); - while (clink) { - sector = clink->sector; - apaAddEmptyBlock(clink->header, emptyBlocks); - clink = apaGetNextHeader(clink, &rv); - } - if (rv != 0) - return rv; - - if (!(clink = hddAddPartitionHere(device, ¶ms, emptyBlocks, sector, &rv))) - return rv; - - sector = clink->header->start; - length = clink->header->length; - apaCacheFree(clink); - if (!(clink = apaCacheGetHeader(device, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv))) - return rv; - - clink->header->subs[clink->header->nsub].start = sector; - clink->header->subs[clink->header->nsub].length = length; - clink->header->nsub++; - fileSlot->nsub++; - fileSlot->parts[fileSlot->nsub].start = sector; - fileSlot->parts[fileSlot->nsub].length = length; - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink); - return rv; -} - -static int ioctl2DeleteLastSub(hdd_file_slot_t *fileSlot) -{ - int rv; - u32 device = fileSlot->f->unit; - apa_cache_t *mainPart; - apa_cache_t *subPart; - - if (!(fileSlot->f->mode & O_WRONLY)) - return -EACCES; - - if (fileSlot->nsub == 0) - return -ENOENT; - - if (!(mainPart = apaCacheGetHeader(device, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv))) - return rv; - - if ((subPart = apaCacheGetHeader(device, - mainPart->header->subs[mainPart->header->nsub - 1].start, APA_IO_MODE_READ, &rv))) { - fileSlot->nsub--; - mainPart->header->nsub--; - mainPart->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - rv = apaDelete(subPart); - } - apaCacheFree(mainPart); - return rv; -} - -int hddIoctl2(iop_file_t *f, int req, void *argp, unsigned int arglen, - void *bufp, unsigned int buflen) -{ - u32 rv = 0, err_lba; - hdd_file_slot_t *fileSlot = f->privdata; - - WaitSema(fioSema); - switch (req) { - // cmd set 1 - case HIOCADDSUB: - rv = ioctl2AddSub(fileSlot, (char *)argp); - break; - - case HIOCDELSUB: - rv = ioctl2DeleteLastSub(fileSlot); - break; - - case HIOCNSUB: - rv = fileSlot->nsub; - break; - - case HIOCFLUSH: - ata_device_flush_cache(f->unit); - break; - - // cmd set 2 - case HIOCTRANSFER: - rv = ioctl2Transfer(f->unit, fileSlot, argp); - break; - - case HIOCGETSIZE: - rv = fileSlot->parts[*(u32 *)argp].length; - break; - - case HIOCSETPARTERROR: - apaSetPartErrorSector(f->unit, fileSlot->parts[0].start); - rv = 0; - break; - - case HIOCGETPARTERROR: - if ((rv = apaGetPartErrorSector(f->unit, APA_SECTOR_PART_ERROR, &err_lba)) > 0) { - if (err_lba == fileSlot->parts[0].start) { - rv = 0; - apaSetPartErrorSector(f->unit, 0); // clear last error :) - } - } - break; - - //Custom IOCTL2 commands(s) for OPL - case APA_IOCTL2_GETHEADER: - if (ata_device_sector_io(f->unit, bufp, fileSlot->parts[0].start, sizeof(apa_header_t) / 512, ATA_DIR_READ)) - rv = -EIO; - rv = sizeof(apa_header_t); - break; - - default: - rv = -EINVAL; - break; - } - SignalSema(fioSema); - return rv; -} - -static int devctlSwapTemp(s32 device, char *argp) -{ - int rv; - apa_params_t params; - char szBuf[APA_IDMAX]; - apa_cache_t *partTemp; - apa_cache_t *partNew; - - - if ((rv = fioGetInput(argp, ¶ms)) < 0) - return rv; - - if (params.id[0] == '_' && params.id[1] == '_') // test for '__' system partition - return -EINVAL; - - memset(szBuf, 0, APA_IDMAX); - strcpy(szBuf, "_tmp"); - if (!(partTemp = apaFindPartition(device, szBuf, &rv))) - return rv; - - if ((partNew = apaFindPartition(device, params.id, &rv))) { - if ((rv = apaPassCmp(partNew->header->fpwd, params.fpwd)) == 0) { - memcpy(partTemp->header->id, partNew->header->id, APA_IDMAX); - memcpy(partTemp->header->rpwd, partNew->header->rpwd, APA_PASSMAX); - memcpy(partTemp->header->fpwd, partNew->header->fpwd, APA_PASSMAX); - //memset(partNew->header->id, 0, 8);// BUG! can make it so can not open!! - memset(partNew->header->id, 0, APA_IDMAX); - strcpy(partNew->header->id, "_tmp"); - memset(partNew->header->rpwd, 0, APA_PASSMAX); - memset(partNew->header->fpwd, 0, APA_PASSMAX); - partTemp->flags |= APA_CACHE_FLAG_DIRTY; - partNew->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - } - apaCacheFree(partNew); - } - apaCacheFree(partTemp); - return rv; -} - -static int devctlSetOsdMBR(s32 device, hddSetOsdMBR_t *mbrInfo) -{ - int rv; - apa_cache_t *clink; - - if (!(clink = apaCacheGetHeader(device, APA_SECTOR_MBR, APA_IO_MODE_READ, &rv))) - return rv; - - APA_PRINTF(APA_DRV_NAME ": mbr start: %ld\n" APA_DRV_NAME ": mbr size : %ld\n", mbrInfo->start, mbrInfo->size); - clink->header->mbr.osdStart = mbrInfo->start; - clink->header->mbr.osdSize = mbrInfo->size; - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink); - return rv; -} - -int hddDevctl(iop_file_t *f, const char *devname, int cmd, void *arg, - unsigned int arglen, void *bufp, unsigned int buflen) -{ - int rv = 0; - - WaitSema(fioSema); - switch (cmd) { - // Command set 1 ('H') - case HDIOC_DEV9OFF: - ata_device_smart_save_attr(f->unit); - dev9Shutdown(); - break; - - case HDIOC_IDLE: - rv = ata_device_idle(f->unit, *(char *)arg); - break; - - case HDIOC_MAXSECTOR: - rv = hddDevices[f->unit].partitionMaxSize; - break; - - case HDIOC_TOTALSECTOR: - rv = hddDevices[f->unit].totalLBA; - break; - - case HDIOC_FLUSH: - if (ata_device_flush_cache(f->unit)) - rv = -EIO; - break; - - case HDIOC_SWAPTMP: - rv = devctlSwapTemp(f->unit, (char *)arg); - break; - - case HDIOC_SMARTSTAT: - rv = ata_device_smart_get_status(f->unit); - break; - - case HDIOC_STATUS: - rv = hddDevices[f->unit].status; - break; - - case HDIOC_FORMATVER: - rv = hddDevices[f->unit].format; - break; - - case HDIOC_FREESECTOR: - rv = apaGetFreeSectors(f->unit, bufp, hddDevices); - break; - - case HDIOC_IDLEIMM: - rv = ata_device_idle_immediate(f->unit); - break; - - // Command set 2 ('h') - case HDIOC_GETTIME: - rv = apaGetTime((apa_ps2time_t *)bufp); - break; - - case HDIOC_SETOSDMBR: - rv = devctlSetOsdMBR(f->unit, (hddSetOsdMBR_t *)arg); - break; - - case HDIOC_GETSECTORERROR: - rv = apaGetPartErrorSector(f->unit, APA_SECTOR_SECTOR_ERROR, 0); - break; - - case HDIOC_GETERRORPARTNAME: - rv = apaGetPartErrorName(f->unit, (char *)bufp); - break; - - case HDIOC_READSECTOR: - rv = ata_device_sector_io(f->unit, (void *)bufp, ((hddAtaTransfer_t *)arg)->lba, - ((hddAtaTransfer_t *)arg)->size, ATA_DIR_READ); - break; - - case HDIOC_WRITESECTOR: - rv = ata_device_sector_io(f->unit, ((hddAtaTransfer_t *)arg)->data, - ((hddAtaTransfer_t *)arg)->lba, ((hddAtaTransfer_t *)arg)->size, - ATA_DIR_WRITE); - break; - - case HDIOC_SCEIDENTIFY: - rv = ata_device_sce_identify_drive(f->unit, (u16 *)bufp); - break; - - //Custom DEVCTL command(s) for OPL - case APA_DEVCTL_IS_48BIT: - rv = ata_device_is_48bit(f->unit); - break; - - case APA_DEVCTL_SET_TRANSFER_MODE: - rv = ata_device_set_transfer_mode(f->unit, ((hddAtaSetMode_t *)arg)->type, ((hddAtaSetMode_t *)arg)->mode); - break; - - case APA_DEVCTL_ATA_IOP_WRITE: - rv = ata_device_sector_io(f->unit, ((hddAtaIOPTransfer_t *)arg)->data, - ((hddAtaIOPTransfer_t *)arg)->lba, ((hddAtaIOPTransfer_t *)arg)->size, - ATA_DIR_WRITE); - - default: - rv = -EINVAL; - break; - } - SignalSema(fioSema); - - return rv; -} - -int hddUnsupported(iop_file_t *f) { return -1; } diff --git a/modules/hdd/apa/hdd_fio.h b/modules/hdd/apa/hdd_fio.h deleted file mode 100644 index e15d9efb8..000000000 --- a/modules/hdd/apa/hdd_fio.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -*/ - -#ifndef _HDD_FIO_H -#define _HDD_FIO_H - -// I/O functions -int hddInit(iop_device_t *f); -int hddDeinit(iop_device_t *f); -int hddFormat(iop_file_t *f, const char *dev, const char *blockdev, void *arg, int arglen); -int hddOpen(iop_file_t *f, const char *name, int flags, int mode); -int hddClose(iop_file_t *f); -int hddRead(iop_file_t *f, void *buf, int size); -int hddWrite(iop_file_t *f, void *buf, int size); -int hddLseek(iop_file_t *f, int post, int whence); -int hddIoctl2(iop_file_t *f, int request, void *argp, unsigned int arglen, void *bufp, unsigned intbuflen); -int hddRemove(iop_file_t *f, const char *name); -int hddDopen(iop_file_t *f, const char *name); -int hddDread(iop_file_t *f, iox_dirent_t *dirent); -int hddGetStat(iop_file_t *f, const char *name, iox_stat_t *stat); -int hddReName(iop_file_t *f, const char *oldname, const char *newname); -int hddDevctl(iop_file_t *f, const char *devname, int cmd, void *arg, unsigned int arglen, void *bufp, unsigned int buflen); - -int hddUnsupported(iop_file_t *f); - -#endif /* _HDD_FIO_H */ diff --git a/modules/hdd/apa/imports.lst b/modules/hdd/apa/imports.lst deleted file mode 100644 index ed710cefa..000000000 --- a/modules/hdd/apa/imports.lst +++ /dev/null @@ -1,67 +0,0 @@ - -atad_IMPORTS_start -I_ata_get_devinfo -I_ata_device_sector_io -I_ata_device_sce_sec_unlock -I_ata_device_idle -I_ata_device_sce_identify_drive -I_ata_device_smart_get_status -I_ata_device_smart_save_attr -I_ata_device_flush_cache -I_ata_device_is_48bit -I_ata_device_set_transfer_mode -I_ata_device_idle_immediate -atad_IMPORTS_end - -cdvdman_IMPORTS_start -I_sceCdReadClock -I_sceCdRI -cdvdman_IMPORTS_end - -dev9_IMPORTS_start -I_dev9Shutdown -dev9_IMPORTS_end - -intrman_IMPORTS_start -I_CpuSuspendIntr -I_CpuResumeIntr -intrman_IMPORTS_end - -iomanX_IMPORTS_start -I_AddDrv -I_DelDrv -iomanX_IMPORTS_end - -poweroff_IMPORTS_start -I_AddPowerOffHandler -poweroff_IMPORTS_end - -stdio_IMPORTS_start -I_printf -stdio_IMPORTS_end - -sysclib_IMPORTS_start -I_memcmp -I_memcpy -I_memset -I_strchr -I_strcmp -I_strcpy -I_strlen -I_strncmp -I_strncpy -I_strrchr -I_strtol -sysclib_IMPORTS_end - -sysmem_IMPORTS_start -I_AllocSysMemory -I_FreeSysMemory -sysmem_IMPORTS_end - -thsemap_IMPORTS_start -I_CreateSema -I_DeleteSema -I_SignalSema -I_WaitSema -thsemap_IMPORTS_end diff --git a/modules/hdd/apa/irx_imports.h b/modules/hdd/apa/irx_imports.h deleted file mode 100644 index 61cd47759..000000000 --- a/modules/hdd/apa/irx_imports.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: irx_imports.h 629 2004-10-11 00:45:00Z mrbrown $ -# Defines all IRX imports. -*/ - -#ifndef IOP_IRX_IMPORTS_H -#define IOP_IRX_IMPORTS_H - -#include - -/* Please keep these in alphabetical order! */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/hdd/atad/Makefile b/modules/hdd/atad/Makefile deleted file mode 100755 index 418c1bd8c..000000000 --- a/modules/hdd/atad/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -IOP_BIN = ps2atad.irx - -IOP_INCS += -I../common -IOP_CFLAGS += -Wall -fno-builtin-printf -IOP_LDFLAGS += -s - -IOP_OBJS = ps2atad.o exports.o imports.o -IOP_LIBS = - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) - -rebuild: clean all - -run: - ps2client -t 1 execiop host:$(IOP_BIN) - - -include $(PS2SDK)/Defs.make -include ../../Rules.make diff --git a/modules/hdd/atad/exports.tab b/modules/hdd/atad/exports.tab deleted file mode 100755 index 0b0289177..000000000 --- a/modules/hdd/atad/exports.tab +++ /dev/null @@ -1,29 +0,0 @@ -/* We conform to the 1.3 version of atad.irx exports. */ - -DECLARE_EXPORT_TABLE(atad, 1, 3) - DECLARE_EXPORT(_start) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(_exit) - DECLARE_EXPORT(_retonly) - - DECLARE_EXPORT(ata_get_devinfo) -/*05*/ DECLARE_EXPORT(ata_reset_devices) - DECLARE_EXPORT(ata_io_start) - DECLARE_EXPORT(ata_io_finish) - DECLARE_EXPORT(ata_get_error) - DECLARE_EXPORT(ata_device_sector_io) -/*10*/ DECLARE_EXPORT(ata_device_sce_sec_set_password) - DECLARE_EXPORT(ata_device_sce_sec_unlock) - DECLARE_EXPORT(ata_device_sce_sec_erase) - DECLARE_EXPORT(ata_device_idle) - DECLARE_EXPORT(ata_device_sce_identify_drive) -/*15*/ DECLARE_EXPORT(ata_device_smart_get_status) - DECLARE_EXPORT(ata_device_smart_save_attr) - DECLARE_EXPORT(ata_device_flush_cache) - DECLARE_EXPORT(ata_device_idle_immediate) - DECLARE_EXPORT(ata_device_is_48bit) - DECLARE_EXPORT(ata_device_set_transfer_mode) - -END_EXPORT_TABLE - -void _retonly() {} diff --git a/modules/hdd/atad/imports.lst b/modules/hdd/atad/imports.lst deleted file mode 100755 index 29277947d..000000000 --- a/modules/hdd/atad/imports.lst +++ /dev/null @@ -1,34 +0,0 @@ -loadcore_IMPORTS_start -I_RegisterLibraryEntries -loadcore_IMPORTS_end - -thbase_IMPORTS_start -I_DelayThread -I_SetAlarm -I_CancelAlarm -I_USec2SysClock -thbase_IMPORTS_end - -thevent_IMPORTS_start -I_CreateEventFlag -I_iSetEventFlag -I_ClearEventFlag -I_WaitEventFlag -thevent_IMPORTS_end - -stdio_IMPORTS_start -I_printf -stdio_IMPORTS_end - -sysclib_IMPORTS_start -I_memcpy -I_memset -sysclib_IMPORTS_end - -dev9_IMPORTS_start -I_dev9RegisterIntrCb -I_dev9DmaTransfer -I_dev9IntrEnable -I_dev9IntrDisable -I_dev9LEDCtl -dev9_IMPORTS_end diff --git a/modules/hdd/atad/irx_imports.h b/modules/hdd/atad/irx_imports.h deleted file mode 100755 index 4b5a33765..000000000 --- a/modules/hdd/atad/irx_imports.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id$ -# Defines all IRX imports. -*/ - -#ifndef IOP_IRX_IMPORTS_H -#define IOP_IRX_IMPORTS_H - -#include - -/* Please keep these in alphabetical order! */ -#include -#include -#include -#include -#include -#include - -#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/hdd/atad/ps2atad.c b/modules/hdd/atad/ps2atad.c deleted file mode 100644 index ac69819d5..000000000 --- a/modules/hdd/atad/ps2atad.c +++ /dev/null @@ -1,1092 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id$ -# ATA device driver. -# This module provides the low-level ATA support for hard disk drives. It is -# 100% compatible with its proprietary counterpart called atad.irx. -# -# This module also include support for 48-bit feature set (done by Clement). -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "atad.h" - -#include -#include - -#define MODNAME "atad" -IRX_ID(MODNAME, 2, 4); - -#define M_PRINTF(format, args...) \ - printf(MODNAME ": " format, ##args) - -#define BANNER "ATA device driver %s - Copyright (c) 2003 Marcus R. Brown\n" -#define VERSION "v1.2" - -static int ata_devinfo_init = 0; -static int ata_evflg = -1; - -/* Used for indicating 48-bit LBA support. */ -static unsigned char lba_48bit[2] = {0, 0}; - -static unsigned char Disable48bitLBA = 0; //Please read the comments in _start(). - -/* Local device info kept for drives 0 and 1. */ -static ata_devinfo_t atad_devinfo[2]; - -/* Data returned from DEVICE IDENTIFY is kept here. Also, this is used by the - security commands to set and unlock the password. */ -static unsigned short int ata_param[256]; - -/* ATA command info. */ -typedef struct _ata_cmd_info -{ - unsigned char command; - unsigned char type; -} ata_cmd_info_t; - -static const ata_cmd_info_t ata_cmd_table[] = { - {ATA_C_NOP, 1}, - {ATA_C_CFA_REQUEST_EXTENDED_ERROR_CODE, 1}, - {ATA_C_DEVICE_RESET, 5}, - {ATA_C_READ_SECTOR, 2}, - {ATA_C_READ_DMA_EXT, 0x84}, - {ATA_C_WRITE_SECTOR, 3}, - {ATA_C_WRITE_LONG, 8}, //??? This seems to be WRITE_LONG, but the READ_LONG command isn't present (Why would Sony have only one of these two commands?). Both are obsolete too. - {ATA_C_WRITE_DMA_EXT, 0x84}, - {ATA_C_CFA_WRITE_SECTORS_WITHOUT_ERASE, 3}, - {ATA_C_READ_VERIFY_SECTOR, 1}, - {ATA_C_READ_VERIFY_SECTOR_EXT, 0x81}, - {ATA_C_SEEK, 1}, - {ATA_C_CFA_TRANSLATE_SECTOR, 2}, - {ATA_C_SCE_SECURITY_CONTROL, 7}, - {ATA_C_EXECUTE_DEVICE_DIAGNOSTIC, 6}, - {ATA_C_INITIALIZE_DEVICE_PARAMETERS, 1}, - {ATA_C_DOWNLOAD_MICROCODE, 3}, - {ATA_C_IDENTIFY_PACKET_DEVICE, 2}, - {ATA_C_SMART, 7}, - {ATA_C_CFA_ERASE_SECTORS, 1}, - {ATA_C_READ_MULTIPLE, 2}, - {ATA_C_WRITE_MULTIPLE, 3}, - {ATA_C_SET_MULTIPLE_MODE, 1}, - {ATA_C_READ_DMA, 4}, - {ATA_C_WRITE_DMA, 4}, - {ATA_C_CFA_WRITE_MULTIPLE_WITHOUT_ERASE, 3}, - {ATA_C_GET_MEDIA_STATUS, 1}, - {ATA_C_MEDIA_LOCK, 1}, - {ATA_C_MEDIA_UNLOCK, 1}, - {ATA_C_STANDBY_IMMEDIATE, 1}, - {ATA_C_IDLE_IMMEDIATE, 1}, - {ATA_C_STANDBY, 1}, - {ATA_C_IDLE, 1}, - {ATA_C_READ_BUFFER, 2}, - {ATA_C_CHECK_POWER_MODE, 1}, - {ATA_C_SLEEP, 1}, - {ATA_C_FLUSH_CACHE, 1}, - {ATA_C_WRITE_BUFFER, 3}, - {ATA_C_FLUSH_CACHE_EXT, 1}, - {ATA_C_IDENTIFY_DEVICE, 2}, - {ATA_C_MEDIA_EJECT, 1}, - {ATA_C_SET_FEATURES, 1}, - {ATA_C_SECURITY_SET_PASSWORD, 3}, - {ATA_C_SECURITY_UNLOCK, 3}, - {ATA_C_SECURITY_ERASE_PREPARE, 1}, - {ATA_C_SECURITY_ERASE_UNIT, 3}, - {ATA_C_SECURITY_FREEZE_LOCK, 1}, - {ATA_C_SECURITY_DISABLE_PASSWORD, 3}, - {ATA_C_READ_NATIVE_MAX_ADDRESS, 1}, - {ATA_C_SET_MAX_ADDRESS, 1}}; -#define ATA_CMD_TABLE_SIZE (sizeof ata_cmd_table / sizeof(ata_cmd_info_t)) - -static const ata_cmd_info_t sec_ctrl_cmd_table[] = { - {ATA_SCE_IDENTIFY_DRIVE, 2}, - {ATA_SCE_SECURITY_ERASE_PREPARE, 1}, - {ATA_SCE_SECURITY_ERASE_UNIT, 1}, - {ATA_SCE_SECURITY_FREEZE_LOCK, 1}, - {ATA_SCE_SECURITY_SET_PASSWORD, 3}, - {ATA_SCE_SECURITY_UNLOCK, 3}, - {ATA_SCE_SECURITY_WRITE_ID, 3}, - {ATA_SCE_SECURITY_READ_ID, 2}}; -#define SEC_CTRL_CMD_TABLE_SIZE (sizeof sec_ctrl_cmd_table / sizeof(ata_cmd_info_t)) - -static const ata_cmd_info_t smart_cmd_table[] = { - {ATA_S_SMART_READ_DATA, 2}, - {ATA_S_SMART_ENABLE_DISABLE_AUTOSAVE, 1}, - {ATA_S_SMART_SAVE_ATTRIBUTE_VALUES, 1}, - {ATA_S_SMART_EXECUTE_OFF_LINE, 1}, - {ATA_S_SMART_READ_LOG, 2}, - {ATA_S_SMART_WRITE_LOG, 3}, - {ATA_S_SMART_ENABLE_OPERATIONS, 1}, - {ATA_S_SMART_DISABLE_OPERATIONS, 1}, - {ATA_S_SMART_RETURN_STATUS, 1}}; -#define SMART_CMD_TABLE_SIZE (sizeof smart_cmd_table / sizeof(ata_cmd_info_t)) - -/* This is the state info tracked between ata_io_start() and ata_io_finish(). */ -typedef struct _ata_cmd_state -{ - int type; /* The ata_cmd_info_t type field. */ - void *buf; - unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ -} ata_cmd_state_t; - -static ata_cmd_state_t atad_cmd_state; - -static int ata_intr_cb(int flag); -static unsigned int ata_alarm_cb(void *unused); - -static void ata_set_dir(int dir); - -static void ata_pio_mode(int mode); -static void ata_multiword_dma_mode(int mode); -static void ata_ultra_dma_mode(int mode); - -struct irx_export_table _exp_atad; - -/* In a modern ATAD.IRX module, the DMA ENabled bit should be set and unset from the pre and post DMA callbacks. - However, some of the clone adaptors don't support this properly. Since some users out there cannot tell the difference - between such a clone adaptor and a genuine Sony adaptor, it's probably just best to go with the design of the older ATAD modules. - - Older ATAD modules have this bit set within ata_set_dir() instead. */ -/* static void AtadPreDmaCb(int bcr, int dir){ - USE_SPD_REGS; - - SPD_REG16(SPD_R_XFR_CTRL)|=0x80; -} - -static void AtadPostDmaCb(int bcr, int dir){ - USE_SPD_REGS; - - SPD_REG16(SPD_R_XFR_CTRL)&=~0x80; -} */ - -int _start(int argc, char *argv[]) -{ - USE_SPD_REGS; - iop_event_t event; - int res = 1; - - printf(BANNER, VERSION); - - if (!(SPD_REG16(SPD_R_REV_3) & SPD_CAPS_ATA) || !(SPD_REG16(SPD_R_REV_8) & 0x02)) { - M_PRINTF("HDD is not connected, exiting.\n"); - goto out; - } - - /* - The PSX (Not the PlayStation or PSOne, but a PS2 with a DVR unit) has got an extra processor (Fujitsu MB91302A, aka the "DVRP") that seems to be emulating the console's PS2 ATA interface. - The stock disks of all PSX units are definitely 48-bit LBA compliant because of their capacities, but the DVRP's emulation seems to have a design problem: - 1. It indicates that 48-bit LBA is supported. - 2. The 48-bit LBA capacity fields show the true capacity of the disk. - 3. Accesses to beyond the 28-bit LBA capacity (Which is 40.000GB by default) will result in I/O errors. - 4. (For some PSX units like the DESR-7500): Double-writes to the ATA registers seem to cause the ATA interface to stall. - - The problem is obviously in the DVRP's firmware, but we currently have no way to fix these bugs because the DVRP is even more heavily secured that the IOP. - In the eyes of Sony, there isn't a problem because none of their retail PlayStation 2 software ever supported 48-bit LBA. - - The obvious workaround here would be to totally kill 48-bit LBA support when ATAD is loaded on a PSX. - */ - Disable48bitLBA = ((SPD_REG16(SPD_R_REV_3) & SPD_CAPS_DVR) && (SPD_REG16(SPD_R_REV_1) != 0xFF)) ? 1 : 0; //The check for revision 0xFF is to workaround the problem that the Chinese SATA network adaptor has: it reports 0xFF for a lot of fields (including the capabilities field), which unfortunately triggers off the workaround for the PSX. It reports 0xFF as its revision too, which can be used to identify it. - - if ((res = RegisterLibraryEntries(&_exp_atad)) != 0) { - M_PRINTF("Library is already registered, exiting.\n"); - goto out; - } - - event.attr = 0; - event.bits = 0; - if ((ata_evflg = CreateEventFlag(&event)) < 0) { - M_PRINTF("Couldn't create event flag, exiting.\n"); - res = 1; - goto out; - } - - dev9RegisterIntrCb(1, &ata_intr_cb); - dev9RegisterIntrCb(0, &ata_intr_cb); - //Read the comment above about these callbacks. - /* dev9RegisterPreDmaCb(0, &AtadPreDmaCb); - dev9RegisterPostDmaCb(0, &AtadPostDmaCb); */ - - res = 0; - M_PRINTF("Driver loaded.\n"); -out: - return res; -} - -int _exit(void) { return 0; } - -static int ata_intr_cb(int flag) -{ - if (flag == 1) { /* New card, invalidate device info. */ - memset(atad_devinfo, 0, sizeof atad_devinfo); - } else { - dev9IntrDisable(SPD_INTR_ATA); - iSetEventFlag(ata_evflg, 0x02); - } - - return 1; -} - -static unsigned int ata_alarm_cb(void *unused) -{ - iSetEventFlag(ata_evflg, 0x01); - return 0; -} - -/* Export 8 */ -int ata_get_error(void) -{ - USE_ATA_REGS; - return ata_hwport->r_error & 0xff; -} - -/* 0x80 for busy, 0x88 for bus busy. */ -static int ata_wait_busy(int bits) -{ - USE_ATA_REGS; - int i, didx, delay; - - for (i = 0; i < 80; i++) { - if (!(ata_hwport->r_control & bits)) - return 0; - - didx = i / 10; - switch (didx) { - case 0: - continue; - case 1: - delay = 100; - break; - case 2: - delay = 1000; - break; - case 3: - delay = 10000; - break; - case 4: - delay = 100000; - break; - default: - delay = 1000000; - } - - DelayThread(delay); - } - - M_PRINTF("Timeout while waiting on busy (0x%02x).\n", bits); - return -502; -} - -static int ata_device_select(int device) -{ - USE_ATA_REGS; - int res; - - if ((res = ata_wait_busy(0x88)) < 0) - return res; - - /* If the device was already selected, nothing to do. */ - if (((ata_hwport->r_select >> 4) & 1) == device) - return 0; - - /* Select the device. */ - ata_hwport->r_select = (device & 1) << 4; - res = ata_hwport->r_control; - - return ata_wait_busy(0x88); -} - -/* Export 6 */ -/* - 28-bit LBA: - sector (7:0) -> LBA (7:0) - lcyl (7:0) -> LBA (15:8) - hcyl (7:0) -> LBA (23:16) - device (3:0) -> LBA (27:24) - - 48-bit LBA just involves writing the upper 24 bits in the format above into each respective register on the first write pass, before writing the lower 24 bits in the 2nd write pass. The LBA bits within the device field are not used in either write pass. -*/ -int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command) -{ - USE_ATA_REGS; - iop_sys_clock_t cmd_timeout; - const ata_cmd_info_t *cmd_table; - int i, res, type, cmd_table_size; - int using_timeout, device = (select >> 4) & 1; - unsigned char searchcmd; - - ClearEventFlag(ata_evflg, 0); - - if (!atad_devinfo[device].exists) - return -505; - - if ((res = ata_device_select(device)) != 0) - return res; - - /* For the SCE and SMART commands, we need to search on the subcommand - specified in the feature register. */ - if (command == ATA_C_SCE_SECURITY_CONTROL) { - cmd_table = sec_ctrl_cmd_table; - cmd_table_size = SEC_CTRL_CMD_TABLE_SIZE; - searchcmd = feature; - } else if (command == ATA_C_SMART) { - cmd_table = smart_cmd_table; - cmd_table_size = SMART_CMD_TABLE_SIZE; - searchcmd = feature; - } else { - cmd_table = ata_cmd_table; - cmd_table_size = ATA_CMD_TABLE_SIZE; - searchcmd = command & 0xff; - } - - type = 0; - for (i = 0; i < cmd_table_size; i++) { - if (searchcmd == cmd_table[i].command) { - type = cmd_table[i].type; - break; - } - } - - if (!(atad_cmd_state.type = type & 0x7F)) - return -506; - - atad_cmd_state.buf = buf; - atad_cmd_state.blkcount = blkcount; - - /* Check that the device is ready if this the appropiate command. */ - if (!(ata_hwport->r_control & 0x40)) { - switch (command) { - case 0x08: - case 0x90: - case 0x91: - case 0xa0: - case 0xa1: - break; - default: - M_PRINTF("Error: Device %d is not ready.\n", device); - return -501; - } - } - - /* Does this command need a timeout? */ - using_timeout = 0; - switch (type & 0x7F) { - case 1: - case 6: - using_timeout = 1; - break; - case 4: - atad_cmd_state.dir = (command != ATA_C_READ_DMA && command != ATA_C_READ_DMA_EXT); - using_timeout = 1; - break; - } - - if (using_timeout) { - cmd_timeout.lo = 0x41eb0000; - cmd_timeout.hi = 0; - - /* SECURITY ERASE UNIT needs a bit more time. */ - if (command == ATA_C_SCE_SECURITY_CONTROL && feature == ATA_SCE_SECURITY_ERASE_UNIT) - USec2SysClock(180000000, &cmd_timeout); - - if ((res = SetAlarm(&cmd_timeout, &ata_alarm_cb, NULL)) < 0) - return res; - } - - /* Enable the command completion interrupt. */ - if ((type & 0x7F) == 1) - dev9IntrEnable(SPD_INTR_ATA0); - - /* Finally! We send off the ATA command with arguments. */ - ata_hwport->r_control = (using_timeout == 0) << 1; - - if (type & 0x80) { //For the sake of achieving (greatly) improved performance, write the registers twice only if required! This is also required for compatibility with the buggy firmware of certain PSX units. - /* 48-bit LBA requires writing to the address registers twice, - 24 bits of the LBA address is written each time. - Writing to registers twice does not affect 28-bit LBA since - only the latest data stored in address registers is used. */ - ata_hwport->r_feature = (feature >> 8) & 0xff; - ata_hwport->r_nsector = (nsector >> 8) & 0xff; - ata_hwport->r_sector = (sector >> 8) & 0xff; - ata_hwport->r_lcyl = (lcyl >> 8) & 0xff; - ata_hwport->r_hcyl = (hcyl >> 8) & 0xff; - } - - ata_hwport->r_feature = feature & 0xff; - ata_hwport->r_nsector = nsector & 0xff; - ata_hwport->r_sector = sector & 0xff; - ata_hwport->r_lcyl = lcyl & 0xff; - ata_hwport->r_hcyl = hcyl & 0xff; - ata_hwport->r_select = select & 0xff; - ata_hwport->r_command = command & 0xff; - - /* Turn on the LED. */ - dev9LEDCtl(1); - - return 0; -} - -/* Do a PIO transfer, to or from the device. */ -static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) -{ - USE_ATA_REGS; - void *buf; - int i, type; - unsigned short int status = ata_hwport->r_status & 0xff; - - if (status & ATA_STAT_ERR) { - M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); - return -503; - } - - /* DRQ must be set (data request). */ - if (!(status & ATA_STAT_DRQ)) - return -504; - - type = cmd_state->type; - - if (type == 3 || type == 8) { - /* PIO data out */ - buf = cmd_state->buf; - for (i = 0; i < 256; i++) { - ata_hwport->r_data = *(unsigned short int *)buf; - cmd_state->buf = ++((unsigned short int *)buf); - } - if (cmd_state->type == 8) { - for (i = 0; i < 4; i++) { - ata_hwport->r_data = *(u8 *)buf; - cmd_state->buf = ++((u8 *)buf); - } - } - } else if (type == 2) { - /* PIO data in */ - buf = cmd_state->buf; - for (i = 0; i < 256; i++) { - *(unsigned short int *)buf = ata_hwport->r_data; - cmd_state->buf = ++((unsigned short int *)buf); - } - } - - return 0; -} - -/* Complete a DMA transfer, to or from the device. */ -static inline int ata_dma_complete(void *buf, int blkcount, int dir) -{ - USE_ATA_REGS; - USE_SPD_REGS; - unsigned int count, nbytes; - u32 bits; - int i, res; - unsigned short int dma_stat; - - while (blkcount) { - for (i = 0; i < 20; i++) - if ((dma_stat = SPD_REG16(0x38) & 0x1f)) - goto next_transfer; - - if (dma_stat) - goto next_transfer; - - dev9IntrEnable(SPD_INTR_ATA); - /* Wait for the previous transfer to complete or a timeout. */ - WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); - - if (bits & 0x01) { /* Timeout. */ - M_PRINTF("Error: DMA timeout.\n"); - return -502; - } - /* No DMA completion bit? Spurious interrupt. */ - if (!(SPD_REG16(SPD_R_INTR_STAT) & 0x02)) { - if (ata_hwport->r_control & 0x01) { - M_PRINTF("Error: Command error while doing DMA.\n"); - M_PRINTF("Error: Command error status 0x%02x, error 0x%02x.\n", ata_hwport->r_status, ata_get_error()); - return -503; - } else { - M_PRINTF("Warning: Got command interrupt, but not an error.\n"); - continue; - } - } - - dma_stat = SPD_REG16(0x38) & 0x1f; - - next_transfer: - count = (blkcount < dma_stat) ? blkcount : dma_stat; - nbytes = count * 512; - if ((res = dev9DmaTransfer(0, buf, (nbytes << 9) | 32, dir)) < 0) - return res; - - (u8 *)buf += nbytes; - blkcount -= count; - } - - return 0; -} - -/* Export 7 */ -int ata_io_finish(void) -{ - USE_SPD_REGS; - USE_ATA_REGS; - ata_cmd_state_t *cmd_state = &atad_cmd_state; - u32 bits; - int i, res = 0, type = cmd_state->type; - unsigned short int stat; - - if (type == 1 || type == 6) { /* Non-data commands. */ - WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); - if (bits & 0x01) { /* Timeout. */ - M_PRINTF("Error: ATA timeout on a non-data command.\n"); - return -502; - } - } else if (type == 4) { /* DMA. */ - if ((res = ata_dma_complete(cmd_state->buf, cmd_state->blkcount, - cmd_state->dir)) < 0) - goto finish; - - for (i = 0; i < 100; i++) - if ((stat = SPD_REG16(SPD_R_INTR_STAT) & 0x01)) - break; - if (!stat) { - dev9IntrEnable(SPD_INTR_ATA0); - WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); - if (bits & 0x01) { - M_PRINTF("Error: ATA timeout on DMA completion.\n"); - res = -502; - } - } - } else { /* PIO transfers. */ - stat = ata_hwport->r_control; - if ((res = ata_wait_busy(0x80)) < 0) - goto finish; - - /* Transfer each PIO data block. */ - while (--cmd_state->blkcount != -1) { - if ((res = ata_pio_transfer(cmd_state)) < 0) - goto finish; - if ((res = ata_wait_busy(0x80)) < 0) - goto finish; - } - } - - if (res) - goto finish; - - /* Wait until the device isn't busy. */ - if (ata_hwport->r_status & ATA_STAT_BUSY) - res = ata_wait_busy(0x80); - if ((stat = ata_hwport->r_status) & ATA_STAT_ERR) { - M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", stat, ata_get_error()); - res = -503; - } - -finish: - /* The command has completed (with an error or not), so clean things up. */ - CancelAlarm(&ata_alarm_cb, NULL); - /* Turn off the LED. */ - dev9LEDCtl(0); - - return res; -} - -/* Reset the ATA controller/bus. */ -static inline int ata_bus_reset(void) -{ - USE_SPD_REGS; - SPD_REG16(SPD_R_IF_CTRL) = SPD_IF_ATA_RESET; - DelayThread(100); - SPD_REG16(SPD_R_IF_CTRL) = 0x48; - DelayThread(3000); - return ata_wait_busy(0x80); -} - -/* Export 5 */ -int ata_reset_devices(void) -{ - USE_ATA_REGS; - - if (ata_hwport->r_control & 0x80) - return -501; - - /* Disables device interrupt assertion and asserts SRST. */ - ata_hwport->r_control = 6; - DelayThread(100); - - /* Disable ATA interrupts. */ - ata_hwport->r_control = 2; - DelayThread(3000); - - return ata_wait_busy(0x80); -} - -/* Export 17 */ -int ata_device_flush_cache(int device) -{ - int res; - - if (!(res = ata_io_start(NULL, 1, 0, 0, 0, 0, 0, (device << 4) & 0xffff, lba_48bit[device] ? ATA_C_FLUSH_CACHE_EXT : ATA_C_FLUSH_CACHE))) - res = ata_io_finish(); - - return res; -} - -/* Export 13 */ -int ata_device_idle(int device, int period) -{ - int res; - - if (!(res = ata_io_start(NULL, 1, 0, period & 0xff, 0, 0, 0, (device << 4) & 0xffff, ATA_C_IDLE))) - res = ata_io_finish(); - - return res; -} - -static int ata_device_identify(int device, void *info) -{ - int res; - - if (!(res = ata_io_start(info, 1, 0, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_IDENTIFY_DEVICE))) - res = ata_io_finish(); - - return res; -} - -static int ata_device_pkt_identify(int device, void *info) -{ - int res; - - res = ata_io_start(info, 1, 0, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_IDENTIFY_PACKET_DEVICE); - if (!res) - return ata_io_finish(); - return res; -} - -/* Export 14 */ -int ata_device_sce_identify_drive(int device, void *data) -{ - int res; - - if (!(res = ata_io_start(data, 1, ATA_SCE_IDENTIFY_DRIVE, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SCE_SECURITY_CONTROL))) - res = ata_io_finish(); - - return res; -} - -static int ata_device_smart_enable(int device) -{ - int res; - - if (!(res = ata_io_start(NULL, 1, ATA_S_SMART_ENABLE_OPERATIONS, 0, 0, 0x4f, 0xc2, (device << 4) & 0xffff, ATA_C_SMART))) - res = ata_io_finish(); - - return res; -} - -/* Export 16 */ -int ata_device_smart_save_attr(int device) -{ - int res; - - if (!(res = ata_io_start(NULL, 1, ATA_S_SMART_SAVE_ATTRIBUTE_VALUES, 0, 0, 0x4f, 0xc2, (device << 4) & 0xffff, ATA_C_SMART))) - res = ata_io_finish(); - - return res; -} - -/* Export 15 */ -int ata_device_smart_get_status(int device) -{ - USE_ATA_REGS; - int res; - - res = ata_io_start(NULL, 1, ATA_S_SMART_RETURN_STATUS, 0, 0, 0x4f, 0xc2, (device << 4) & 0xffff, ATA_C_SMART); - if (res) - return res; - - res = ata_io_finish(); - if (res) - return res; - - /* Check to see if the report exceeded the threshold. */ - if (((ata_hwport->r_lcyl & 0xFF) != 0x4f) || ((ata_hwport->r_hcyl & 0xFF) != 0xc2)) { - M_PRINTF("Error: SMART report exceeded threshold.\n"); - return 1; - } - - return res; -} - -/* Set features - set transfer mode. */ -int ata_device_set_transfer_mode(int device, int type, int mode) -{ - int res; - - res = ata_io_start(NULL, 1, 3, (type | mode) & 0xff, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SET_FEATURES); - if (res) - return res; - - res = ata_io_finish(); - if (res) - return res; - - switch (type) { - case ATAD_XFER_MODE_MDMA: - ata_multiword_dma_mode(mode); - break; - case ATAD_XFER_MODE_UDMA: - ata_ultra_dma_mode(mode); - break; - case ATAD_XFER_MODE_PIO: - ata_pio_mode(mode); - break; - } - - return 0; -} - -/* Export 9 */ -int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) -{ - int res = 0; - unsigned short int sector, lcyl, hcyl, select, command, len; - - while (nsectors > 0) { - ata_set_dir(dir); - - /* Variable lba is only 32 bits so no change for lcyl and hcyl. */ - lcyl = (lba >> 8) & 0xff; - hcyl = (lba >> 16) & 0xff; - - if (lba_48bit[device]) { - /* Setup for 48-bit LBA. */ - len = (nsectors > 65536) ? 65536 : nsectors; - - /* Combine bits 24-31 and bits 0-7 of lba into sector. */ - sector = ((lba >> 16) & 0xff00) | (lba & 0xff); - /* 0x40 enables LBA. */ - select = ((device << 4) | 0x40) & 0xffff; - command = (dir == 1) ? ATA_C_WRITE_DMA_EXT : ATA_C_READ_DMA_EXT; - } else { - /* Setup for 28-bit LBA. */ - len = (nsectors > 256) ? 256 : nsectors; - sector = lba & 0xff; - /* 0x40 enables LBA. */ - select = ((device << 4) | ((lba >> 24) & 0xf) | 0x40) & 0xffff; - command = (dir == 1) ? ATA_C_WRITE_DMA : ATA_C_READ_DMA; - } - - if ((res = ata_io_start(buf, len, 0, len, sector, lcyl, hcyl, select, command)) != 0) - return res; - if ((res = ata_io_finish()) != 0) - return res; - - (u8 *)buf += (len * 512); - lba += len; - nsectors -= len; - } - - return res; -} - -static void ata_get_security_status(int device, ata_devinfo_t *devinfo, unsigned short int *param) -{ - if (ata_device_identify(device, param) == 0) - devinfo[device].security_status = param[ATA_ID_SECURITY_STATUS]; -} - -/* Export 10 */ -int ata_device_sce_sec_set_password(int device, void *password) -{ - ata_devinfo_t *devinfo = atad_devinfo; - unsigned short int *param = ata_param; - int res; - - if (devinfo[device].security_status & ATA_F_SEC_ENABLED) - return 0; - - memset(param, 0, 512); - memcpy(param + 1, password, 32); - - res = ata_io_start(param, 1, ATA_SCE_SECURITY_SET_PASSWORD, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SCE_SECURITY_CONTROL); - if (res == 0) - res = ata_io_finish(); - - ata_get_security_status(device, devinfo, param); - return res; -} - -/* Export 11 */ -int ata_device_sce_sec_unlock(int device, void *password) -{ - ata_devinfo_t *devinfo = atad_devinfo; - unsigned short int *param = ata_param; - int res; - - if (!(devinfo[device].security_status & ATA_F_SEC_LOCKED)) - return 0; - - memset(param, 0, 512); - memcpy(param + 1, password, 32); - - if ((res = ata_io_start(param, 1, ATA_SCE_SECURITY_UNLOCK, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SCE_SECURITY_CONTROL)) != 0) - return res; - if ((res = ata_io_finish()) != 0) - return res; - - /* Check to see if the drive was actually unlocked. */ - ata_get_security_status(device, devinfo, param); - if (devinfo[device].security_status & ATA_F_SEC_LOCKED) - return -509; - - return 0; -} - -/* Export 12 */ -int ata_device_sce_sec_erase(int device) -{ - ata_devinfo_t *devinfo = atad_devinfo; - unsigned short int *param = NULL; - int res; - - if (!(devinfo[device].security_status & ATA_F_SEC_ENABLED) || !(devinfo[device].security_status & ATA_F_SEC_LOCKED)) - return 0; - - /* First send the mandatory ERASE PREPARE command. */ - if ((res = ata_io_start(NULL, 1, ATA_SCE_SECURITY_ERASE_PREPARE, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SCE_SECURITY_CONTROL)) != 0) - goto finish; - if ((res = ata_io_finish()) != 0) - goto finish; - - if ((res = ata_io_start(NULL, 1, ATA_SCE_SECURITY_ERASE_UNIT, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SCE_SECURITY_CONTROL)) == 0) - res = ata_io_finish(); - -finish: - ata_get_security_status(device, devinfo, param); - return res; -} - -static void ata_device_probe(ata_devinfo_t *devinfo) -{ - USE_ATA_REGS; - unsigned short int nsector, sector, lcyl, hcyl, select; - - devinfo->exists = 0; - devinfo->has_packet = 0; - - if (ata_hwport->r_control & 0x88) - return; - - nsector = ata_hwport->r_nsector & 0xff; - sector = ata_hwport->r_sector & 0xff; - lcyl = ata_hwport->r_lcyl & 0xff; - hcyl = ata_hwport->r_hcyl & 0xff; - select = ata_hwport->r_select; - - if ((nsector != 1) || (sector != 1)) - return; - devinfo->exists = 1; - - if ((lcyl == 0x14) && (hcyl == 0xeb)) - devinfo->has_packet = 1; -} - -static int ata_init_devices(ata_devinfo_t *devinfo) -{ - USE_ATA_REGS; - int i, res; - - ata_reset_devices(); - - ata_device_probe(&devinfo[0]); - if (!devinfo[0].exists) { - M_PRINTF("Error: Unable to detect HDD 0.\n"); - devinfo[1].exists = 0; - return 0; - } - - /* If there is a device 1, grab it's info too. */ - if ((res = ata_device_select(1)) != 0) - return res; - if (ata_hwport->r_control & 0xff) - ata_device_probe(&devinfo[1]); - else - devinfo[1].exists = 0; - - ata_pio_mode(0); - - for (i = 0; i < 2; i++) { - if (!devinfo[i].exists) - continue; - - /* Send the IDENTIFY DEVICE command. if it doesn't succeed - devinfo is disabled. */ - if (!devinfo[i].has_packet) { - res = ata_device_identify(i, ata_param); - devinfo[i].exists = (res == 0); - } else { - /* If it's a packet device, send the IDENTIFY PACKET - DEVICE command. */ - res = ata_device_pkt_identify(i, ata_param); - devinfo[i].exists = (res == 0); - } - - /* This next section is HDD-specific: if no device or it's a - packet (ATAPI) device, we're done. */ - if (!devinfo[i].exists || devinfo[i].has_packet) - continue; - - /* This section is to detect whether the HDD supports 48-bit LBA - (IDENITFY DEVICE bit 10 word 83) and get the total sectors from - either words(61:60) for 28-bit or words(103:100) for 48-bit. */ - if (!Disable48bitLBA && (ata_param[ATA_ID_COMMAND_SETS_SUPPORTED] & 0x0400)) { - lba_48bit[i] = 1; - /* I don't think anyone would use a >2TB HDD but just in case. */ - if (ata_param[ATA_ID_48BIT_SECTOTAL_HI]) { - devinfo[i].total_sectors = 0xffffffff; - } else { - devinfo[i].total_sectors = - (ata_param[ATA_ID_48BIT_SECTOTAL_MI] << 16) | - ata_param[ATA_ID_48BIT_SECTOTAL_LO]; - } - } else { - lba_48bit[i] = 0; - devinfo[i].total_sectors = (ata_param[ATA_ID_SECTOTAL_HI] << 16) | - ata_param[ATA_ID_SECTOTAL_LO]; - } - devinfo[i].security_status = ata_param[ATA_ID_SECURITY_STATUS]; - - /* Ultra DMA mode 4. */ - ata_device_set_transfer_mode(i, ATAD_XFER_MODE_UDMA, 4); - ata_device_smart_enable(i); - /* Set idle timeout period to 21min 15s. */ - ata_device_idle(i, 0xff); - } - return 0; -} - -/* Export 4 */ -ata_devinfo_t *ata_get_devinfo(int device) -{ - if (!ata_devinfo_init) { - if (ata_bus_reset() || ata_init_devices(atad_devinfo)) - return NULL; - ata_devinfo_init = 1; - } - - return &atad_devinfo[device]; -} - -static void ata_set_dir(int dir) -{ - USE_SPD_REGS; - unsigned short int val; - - SPD_REG16(0x38) = 3; - val = SPD_REG16(SPD_R_IF_CTRL) & 1; - val |= (dir == ATA_DIR_WRITE) ? 0x4c : 0x4e; - SPD_REG16(SPD_R_IF_CTRL) = val; - SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x86; //In a modern ATAD module, the DMA EN bit (0x80) is set and cleared from the pre and post DMA callbacks instead. Read the comment above about this. -} - -static void ata_pio_mode(int mode) -{ - USE_SPD_REGS; - unsigned short int val; - - switch (mode) { - case 1: - val = 0x72; - break; - case 2: - val = 0x32; - break; - case 3: - val = 0x24; - break; - case 4: - val = 0x23; - break; - default: - val = 0x92; - } - - SPD_REG16(SPD_R_PIO_MODE) = val; -} - -static void ata_multiword_dma_mode(int mode) -{ - USE_SPD_REGS; - unsigned short int val; - - switch (mode) { - case 1: - val = 0x45; - break; - case 2: - val = 0x24; - break; - default: - val = 0xff; - } - - SPD_REG16(SPD_R_MWDMA_MODE) = val; - SPD_REG16(SPD_R_IF_CTRL) = (SPD_REG16(SPD_R_IF_CTRL) & 0xfffe) | 0x48; -} - -static void ata_ultra_dma_mode(int mode) -{ - USE_SPD_REGS; - unsigned short int val; - - switch (mode) { - case 1: - val = 0x85; - break; - case 2: - val = 0x63; - break; - case 3: - val = 0x62; - break; - case 4: - val = 0x61; - break; - default: - val = 0xa7; - } - - SPD_REG16(SPD_R_UDMA_MODE) = val; - SPD_REG16(SPD_R_IF_CTRL) |= 0x49; -} - -/* Export 18 */ -int ata_device_idle_immediate(int device) -{ - int res; - - if (!(res = ata_io_start(NULL, 1, 0, 0, 0, 0, 0, (device << 4) & 0xFFFF, ATA_C_IDLE_IMMEDIATE))) - res = ata_io_finish(); - - return res; -} - -/* Export 19 */ -int ata_device_is_48bit(int device) -{ - return lba_48bit[device]; -} diff --git a/modules/hdd/common/atad.h b/modules/hdd/common/atad.h deleted file mode 100644 index 501c493c8..000000000 --- a/modules/hdd/common/atad.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id$ -# ATA Device Driver definitions and imports. -*/ - -#ifndef IOP_ATAD_H -#define IOP_ATAD_H - -#include -#include - -/* These are used with the dir parameter of ata_device_sector_io(). */ -#define ATA_DIR_READ 0 -#define ATA_DIR_WRITE 1 - -#define ATAD_XFER_MODE_PIO 0x08 -#define ATAD_XFER_MODE_MDMA 0x20 -#define ATAD_XFER_MODE_UDMA 0x40 - -typedef struct _ata_devinfo -{ - int exists; /* Was successfully probed. */ - int has_packet; /* Supports the PACKET command set. */ - unsigned int total_sectors; /* Total number of user sectors. */ - unsigned int security_status; /* Word 0x100 of the identify info. */ -} ata_devinfo_t; - -#define atad_IMPORTS_start DECLARE_IMPORT_TABLE(atad, 1, 3) -#define atad_IMPORTS_end END_IMPORT_TABLE - -ata_devinfo_t *ata_get_devinfo(int device); -#define I_ata_get_devinfo DECLARE_IMPORT(4, ata_get_devinfo) - -int ata_reset_devices(void); -#define I_ata_reset_devices DECLARE_IMPORT(5, ata_reset_devices) - -int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command); -#define I_ata_io_start DECLARE_IMPORT(6, ata_io_start) -int ata_io_finish(void); -#define I_ata_io_finish DECLARE_IMPORT(7, ata_io_finish) - -int ata_get_error(void); -#define I_ata_get_error DECLARE_IMPORT(8, ata_get_error) - -int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir); -#define I_ata_device_sector_io DECLARE_IMPORT(9, ata_device_sector_io) - -//DRM functions that were meant to keep users from sharing disks (and hence the contained content). Supported by only Sony-modified HDDs (e.g. the SCPH-20400). -int ata_device_sce_sec_set_password(int device, void *password); -#define I_ata_device_sce_sec_set_password DECLARE_IMPORT(10, ata_device_sce_sec_set_password) -int ata_device_sce_sec_unlock(int device, void *password); -#define I_ata_device_sce_sec_unlock DECLARE_IMPORT(11, ata_device_sce_sec_unlock) -int ata_device_sce_sec_erase(int device); -#define I_ata_device_sce_sec_erase DECLARE_IMPORT(12, ata_device_sce_sec_erase) - -int ata_device_idle(int device, int period); -#define I_ata_device_idle DECLARE_IMPORT(13, ata_device_idle) -int ata_device_sce_identify_drive(int device, void *data); -#define I_ata_device_sce_identify_drive DECLARE_IMPORT(14, ata_device_sce_identify_drive) -int ata_device_smart_get_status(int device); -#define I_ata_device_smart_get_status DECLARE_IMPORT(15, ata_device_smart_get_status) -int ata_device_smart_save_attr(int device); -#define I_ata_device_smart_save_attr DECLARE_IMPORT(16, ata_device_smart_save_attr) -int ata_device_flush_cache(int device); -#define I_ata_device_flush_cache DECLARE_IMPORT(17, ata_device_flush_cache) -int ata_device_idle_immediate(int device); -#define I_ata_device_idle_immediate DECLARE_IMPORT(18, ata_device_idle_immediate) -int ata_device_is_48bit(int device); -#define I_ata_device_is_48bit DECLARE_IMPORT(19, ata_device_is_48bit) -int ata_device_set_transfer_mode(int device, int type, int mode); -#define I_ata_device_set_transfer_mode DECLARE_IMPORT(20, ata_device_set_transfer_mode) - -#endif /* IOP_ATAD_H */ diff --git a/modules/hdd/common/opl-hdd-ioctl.h b/modules/hdd/common/opl-hdd-ioctl.h index b9dff6dc3..375b8155e 100644 --- a/modules/hdd/common/opl-hdd-ioctl.h +++ b/modules/hdd/common/opl-hdd-ioctl.h @@ -1,29 +1,19 @@ #ifndef OPL_HDD_IOCTL_H #define OPL_HDD_IOCTL_H -// Commands and structures for HDD.IRX -#define APA_DEVCTL_IS_48BIT 0x6840 -#define APA_DEVCTL_SET_TRANSFER_MODE 0x6841 -#define APA_DEVCTL_ATA_IOP_WRITE 0x6842 +// Commands and structures for XATAD.IRX +#define ATA_DEVCTL_IS_48BIT 0x6840 +#define ATA_DEVCTL_SET_TRANSFER_MODE 0x6841 -#define APA_IOCTL2_GETHEADER 0x6836 +#define ATA_XFER_MODE_MDMA 0x20 +#define ATA_XFER_MODE_UDMA 0x40 // structs for DEVCTL commands -typedef struct -{ - u32 lba; - u32 size; - u8 *data; -} hddAtaIOPTransfer_t; - typedef struct { int type; int mode; } hddAtaSetMode_t; -// Commands and structures for PFS.IRX -#define PFS_IOCTL2_GET_INODE 0x7007 - #endif diff --git a/modules/hdd/hdldsvr/hdldsvr.c b/modules/hdd/hdldsvr/hdldsvr.c index e947c0eb5..d255c66a1 100644 --- a/modules/hdd/hdldsvr/hdldsvr.c +++ b/modules/hdd/hdldsvr/hdldsvr.c @@ -6,8 +6,10 @@ #include #include -#include +#include +#include #include +#include #include #include #include @@ -44,27 +46,6 @@ struct irx_export_table _exp_hdldsvr; #define SETBIT(mask, bit) (mask)[(bit) / 32] |= 1 << ((bit) % 32) #define GETBIT(mask, bit) ((mask)[(bit) / 32] & (1 << ((bit) % 32))) -#define APA_DEVCTL_MAX_SECTORS 0x00004801 // max partition size(in sectors) -#define APA_DEVCTL_TOTAL_SECTORS 0x00004802 -#define APA_DEVCTL_IDLE 0x00004803 -#define APA_DEVCTL_FLUSH_CACHE 0x00004804 -#define APA_DEVCTL_SWAP_TMP 0x00004805 -#define APA_DEVCTL_DEV9_SHUTDOWN 0x00004806 -#define APA_DEVCTL_STATUS 0x00004807 -#define APA_DEVCTL_FORMAT 0x00004808 -#define APA_DEVCTL_SMART_STAT 0x00004809 -#define APA_DEVCTL_GETTIME 0x00006832 -#define APA_DEVCTL_SET_OSDMBR 0x00006833 // arg = hddSetOsdMBR_t -#define APA_DEVCTL_GET_SECTOR_ERROR 0x00006834 -#define APA_DEVCTL_GET_ERROR_PART_NAME 0x00006835 // bufp = namebuffer[0x20] -#define APA_DEVCTL_ATA_READ 0x00006836 // arg = hddAtaTransfer_t -#define APA_DEVCTL_ATA_WRITE 0x00006837 // arg = hddAtaTransfer_t -#define APA_DEVCTL_SCE_IDENTIFY_DRIVE 0x00006838 // bufp = buffer for atadSceIdentifyDrive -#define APA_DEVCTL_IS_48BIT 0x00006840 -#define APA_DEVCTL_SET_TRANSFER_MODE 0x00006841 -#define APA_DEVCTL_ATA_IOP_WRITE 0x00006842 - - void tcp_server_thread(void *args); void udp_server_thread(void *args); @@ -185,7 +166,7 @@ static void reject_tcp_command(int sock, char *error_string) gstats.status = STATUS_AVAIL; - devctl("hdd0:", APA_DEVCTL_FLUSH_CACHE, NULL, 0, NULL, 0); + ata_device_flush_cache(0); } //------------------------------------------------------------------------- @@ -217,7 +198,7 @@ static int check_datas(u32 command, u32 start_sector, u32 num_sectors) static int handle_tcp_client(int tcp_client_socket) { register int r, i, size; - u8 args[16]; + ata_devinfo_t *devinfo; tcp_packet_t *pkt = (tcp_packet_t *)tcp_buf; while (1) { @@ -299,15 +280,10 @@ static int handle_tcp_client(int tcp_client_socket) #ifdef FAKE_WRITES // fake write, we read instead - *(u32 *)&args[0] = pkt->hdr.start_sector; - *(u32 *)&args[4] = pkt->hdr.num_sectors; - devctl("hdd0:", APA_DEVCTL_ATA_READ, args, 8, gstats.data, pkt->hdr.num_sectors * HDD_SECTOR_SIZE); + ata_device_sector_io(0, gstats.data, pkt->hdr.start_sector, pkt->hdr.num_sectors, ATA_DIR_READ); #else // !!! real writes !!! - *(u32 *)&args[0] = pkt->hdr.start_sector; - *(u32 *)&args[4] = pkt->hdr.num_sectors; - *(u32 *)&args[8] = (u32)gstats.data; - devctl("hdd0:", APA_DEVCTL_ATA_IOP_WRITE, args, 8 + (pkt->hdr.num_sectors * HDD_SECTOR_SIZE), NULL, 0); + ata_device_sector_io(0, gstats.data, pkt->hdr.start_sector, pkt->hdr.num_sectors, ATA_DIR_WRITE); #endif ack_tcp_command(tcp_client_socket, &tcp_buf[0], sizeof(struct tcp_packet_header)); } @@ -318,11 +294,10 @@ static int handle_tcp_client(int tcp_client_socket) // 'stat' command // ------------------------------------------------ case CMD_STAT: - r = devctl("hdd0:", APA_DEVCTL_TOTAL_SECTORS, NULL, 0, NULL, 0); - if (r < 0) + if((devinfo = ata_get_devinfo(0)) == NULL) pkt->hdr.result = -1; else - pkt->hdr.result = r >> 1; + pkt->hdr.result = devinfo->total_sectors >> 1; ack_tcp_command(tcp_client_socket, &tcp_buf[0], sizeof(struct tcp_packet_header)); break; @@ -335,12 +310,9 @@ static int handle_tcp_client(int tcp_client_socket) // set up buffer gstats.data = (u8 *)(((long)&gstats.buffer + HDD_SECTOR_SIZE - 1) & ~(HDD_SECTOR_SIZE - 1)); - *(u32 *)&args[0] = pkt->hdr.start_sector; - *(u32 *)&args[4] = pkt->hdr.num_sectors; - if (pkt->hdr.num_sectors > 2) { - r = devctl("hdd0:", APA_DEVCTL_ATA_READ, args, 8, gstats.data, pkt->hdr.num_sectors * HDD_SECTOR_SIZE); - if (r < 0) + r = ata_device_sector_io(0, gstats.data, pkt->hdr.start_sector, pkt->hdr.num_sectors, ATA_DIR_READ); + if (r != 0) pkt->hdr.result = -1; else pkt->hdr.result = pkt->hdr.num_sectors; @@ -349,8 +321,8 @@ static int handle_tcp_client(int tcp_client_socket) if (r == 0) ack_tcp_command(tcp_client_socket, gstats.data, pkt->hdr.num_sectors * HDD_SECTOR_SIZE); } else { - r = devctl("hdd0:", APA_DEVCTL_ATA_READ, args, 8, pkt->data, pkt->hdr.num_sectors * HDD_SECTOR_SIZE); - if (r < 0) + r = ata_device_sector_io(0, pkt->data, pkt->hdr.start_sector, pkt->hdr.num_sectors, ATA_DIR_READ); + if (r != 0) pkt->hdr.result = -1; else pkt->hdr.result = pkt->hdr.num_sectors; @@ -365,7 +337,7 @@ static int handle_tcp_client(int tcp_client_socket) // 'flsh' command // ------------------------------------------------ case CMD_FLSH: - devctl("hdd0:", APA_DEVCTL_FLUSH_CACHE, NULL, 0, NULL, 0); + ata_device_flush_cache(0); break; @@ -374,10 +346,9 @@ static int handle_tcp_client(int tcp_client_socket) // 'powx' command // ------------------------------------------------ case CMD_POWX: - devctl("hdd0:", APA_DEVCTL_FLUSH_CACHE, NULL, 0, NULL, 0); - devctl("hdd0:", APA_DEVCTL_DEV9_SHUTDOWN, NULL, 0, NULL, 0); - *((volatile u8 *)0xbf402017) = 0x00; - *((volatile u8 *)0xbf402016) = 0x0f; + ata_device_flush_cache(0); + dev9Shutdown(); + PoweroffShutdown(); break; diff --git a/modules/hdd/hdldsvr/imports.lst b/modules/hdd/hdldsvr/imports.lst index 371b1abbb..4f65b804d 100755 --- a/modules/hdd/hdldsvr/imports.lst +++ b/modules/hdd/hdldsvr/imports.lst @@ -1,12 +1,22 @@ -iomanX_IMPORTS_start -I_devctl -iomanX_IMPORTS_end +atad_IMPORTS_start +I_ata_get_devinfo +I_ata_device_sector_io +I_ata_device_flush_cache +atad_IMPORTS_end + +dev9_IMPORTS_start +I_dev9Shutdown +dev9_IMPORTS_end loadcore_IMPORTS_start I_RegisterLibraryEntries loadcore_IMPORTS_end +poweroff_IMPORTS_start +I_PoweroffShutdown +poweroff_IMPORTS_end + ps2ip_IMPORTS_start I_lwip_recv I_lwip_send diff --git a/modules/hdd/hdldsvr/irx_imports.h b/modules/hdd/hdldsvr/irx_imports.h index e83a035b4..7d0edf855 100755 --- a/modules/hdd/hdldsvr/irx_imports.h +++ b/modules/hdd/hdldsvr/irx_imports.h @@ -3,8 +3,10 @@ #include -#include +#include +#include #include +#include #include #include "smsutils.h" #include diff --git a/modules/hdd/hdpro_atad/Makefile b/modules/hdd/hdpro_atad/Makefile deleted file mode 100755 index 53cce10ae..000000000 --- a/modules/hdd/hdpro_atad/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -IOP_BIN = hdpro_atad.irx - -IOP_INCS += -IOP_CFLAGS += -Wall -fno-builtin-printf -IOP_LDFLAGS += -s - -IOP_OBJS = hdproatad.o exports.o imports.o -IOP_LIBS = - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) - -rebuild: clean all - -run: - ps2client -t 1 execiop host:$(IOP_BIN) - - -include $(PS2SDK)/Defs.make -include ../../Rules.make diff --git a/modules/hdd/hdpro_atad/exports.tab b/modules/hdd/hdpro_atad/exports.tab deleted file mode 100755 index dc68ad13c..000000000 --- a/modules/hdd/hdpro_atad/exports.tab +++ /dev/null @@ -1,38 +0,0 @@ -/* We conform to the 1.2 version of atad.irx exports. */ - -DECLARE_EXPORT_TABLE(atad, 1, 2) - DECLARE_EXPORT(_start) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(shutdown) - DECLARE_EXPORT(_retonly) - - DECLARE_EXPORT(ata_get_devinfo) -/*05*/ DECLARE_EXPORT(ata_reset_devices) - DECLARE_EXPORT(ata_io_start) - DECLARE_EXPORT(ata_io_finish) - DECLARE_EXPORT(ata_get_error) - DECLARE_EXPORT(ata_device_sector_io) -/*10*/ DECLARE_EXPORT(_ret1) - DECLARE_EXPORT(_ret0) - DECLARE_EXPORT(_ret1) - DECLARE_EXPORT(_ret0) - DECLARE_EXPORT(_ret1) -/*15*/ DECLARE_EXPORT(_ret1) - DECLARE_EXPORT(_ret1) - DECLARE_EXPORT(ata_device_flush_cache) - DECLARE_EXPORT(_ret0) - DECLARE_EXPORT(ata_device_is_48bit) - DECLARE_EXPORT(_ret0) - -END_EXPORT_TABLE - -void _retonly() {} - -int _ret0(void) { - return 0; -} - -int _ret1(void) { - return 1; -} - diff --git a/modules/hdd/hdpro_atad/hdproatad.c b/modules/hdd/hdpro_atad/hdproatad.c deleted file mode 100644 index 2b01534b7..000000000 --- a/modules/hdd/hdpro_atad/hdproatad.c +++ /dev/null @@ -1,927 +0,0 @@ -/* - Copyright 2011, jimmikaelkael - Licenced under Academic Free License version 3.0 - - ATA Driver for the HD Pro Kit, based on original ATAD form ps2sdk: - - Copyright (c) 2003 Marcus R. Brown - Licenced under Academic Free License version 2.0 - Review ps2sdk README & LICENSE files for further details. - - $Id: ps2atad.c 1455 2007-11-04 23:46:27Z roman_ps2dev $ - ATA device driver. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define MODNAME "atad" -IRX_ID(MODNAME, 1, 1); - -#define M_PRINTF(format, args...) \ - printf(MODNAME ": " format, ##args) - -#define BANNER "ATA device driver for HD Pro Kit %s\n" -#define VERSION "v1.0" - - -// HD Pro Kit is mapping the 1st word in ROM0 seg as a main ATA controller, -// The pseudo ATA controller registers are accessed (input/ouput) by writing -// an id to the main ATA controller (id specific to HDpro, see registers id below). -#define HDPROreg_IO8 (*(volatile unsigned char *)0xBFC00000) -#define HDPROreg_IO32 (*(volatile unsigned int *)0xBFC00000) - -#define CDVDreg_STATUS (*(volatile unsigned char *)0xBF40200A) - -// Pseudo ATA controller registers id - Output -#define ATAreg_CONTROL_RD 0x68 -#define ATAreg_SELECT_RD 0x70 -#define ATAreg_STATUS_RD 0xf0 -#define ATAreg_ERROR_RD 0x90 -#define ATAreg_NSECTOR_RD 0x50 -#define ATAreg_SECTOR_RD 0xd0 -#define ATAreg_LCYL_RD 0x30 -#define ATAreg_HCYL_RD 0xb0 -#define ATAreg_DATA_RD 0x41 - -// Pseudo ATA controller registers id - Input -#define ATAreg_CONTROL_WR 0x6a -#define ATAreg_SELECT_WR 0x72 -#define ATAreg_COMMAND_WR 0xf2 -#define ATAreg_FEATURE_WR 0x92 -#define ATAreg_NSECTOR_WR 0x52 -#define ATAreg_SECTOR_WR 0xd2 -#define ATAreg_LCYL_WR 0x32 -#define ATAreg_HCYL_WR 0xb2 -#define ATAreg_DATA_WR 0x12 - -typedef struct _ata_devinfo -{ - int exists; /* Was successfully probed. */ - int has_packet; /* Supports the PACKET command set. */ - unsigned int total_sectors; /* Total number of user sectors. */ - unsigned int security_status; /* Word 0x100 of the identify info. */ -} ata_devinfo_t; - -static int ata_evflg = -1; - -/* Used for indicating 48-bit LBA support. */ -static unsigned char lba_48bit[2] = {0, 0}; - -/* Local device info kept for drives 0 and 1. */ -static ata_devinfo_t atad_devinfo[2]; - -/* Data returned from DEVICE IDENTIFY is kept here. Also, this is used by the - security commands to set and unlock the password. */ -static unsigned short int ata_param[256]; - -/* ATA command info. */ -typedef struct _ata_cmd_info -{ - unsigned char command; - unsigned char type; -} ata_cmd_info_t; - -static const ata_cmd_info_t ata_cmd_table[] = { - {ATA_C_NOP, 1}, - {ATA_C_CFA_REQUEST_EXTENDED_ERROR_CODE, 1}, - {ATA_C_DEVICE_RESET, 5}, - {ATA_C_READ_SECTOR, 2}, - {ATA_C_READ_SECTOR_EXT, 0x83}, - {ATA_C_READ_DMA_EXT, 0x84}, - {ATA_C_WRITE_SECTOR, 3}, - {ATA_C_WRITE_LONG, 8}, //??? This seems to be WRITE_LONG, but the READ_LONG command isn't present (Why would ). Both are obsolete too. - {ATA_C_WRITE_SECTOR_EXT, 0x83}, - {ATA_C_WRITE_DMA_EXT, 0x84}, - {ATA_C_CFA_WRITE_SECTORS_WITHOUT_ERASE, 3}, - {ATA_C_READ_VERIFY_SECTOR, 1}, - {ATA_C_READ_VERIFY_SECTOR_EXT, 0x81}, - {ATA_C_SEEK, 1}, - {ATA_C_CFA_TRANSLATE_SECTOR, 2}, - {ATA_C_SCE_SECURITY_CONTROL, 7}, - {ATA_C_EXECUTE_DEVICE_DIAGNOSTIC, 6}, - {ATA_C_INITIALIZE_DEVICE_PARAMETERS, 1}, - {ATA_C_DOWNLOAD_MICROCODE, 3}, - {ATA_C_IDENTIFY_PACKET_DEVICE, 2}, - {ATA_C_SMART, 7}, - {ATA_C_CFA_ERASE_SECTORS, 1}, - {ATA_C_READ_MULTIPLE, 2}, - {ATA_C_WRITE_MULTIPLE, 3}, - {ATA_C_SET_MULTIPLE_MODE, 1}, - {ATA_C_READ_DMA, 4}, - {ATA_C_WRITE_DMA, 4}, - {ATA_C_CFA_WRITE_MULTIPLE_WITHOUT_ERASE, 3}, - {ATA_C_GET_MEDIA_STATUS, 1}, - {ATA_C_MEDIA_LOCK, 1}, - {ATA_C_MEDIA_UNLOCK, 1}, - {ATA_C_STANDBY_IMMEDIATE, 1}, - {ATA_C_IDLE_IMMEDIATE, 1}, - {ATA_C_STANDBY, 1}, - {ATA_C_IDLE, 1}, - {ATA_C_READ_BUFFER, 2}, - {ATA_C_CHECK_POWER_MODE, 1}, - {ATA_C_SLEEP, 1}, - {ATA_C_FLUSH_CACHE, 1}, - {ATA_C_WRITE_BUFFER, 3}, - {ATA_C_FLUSH_CACHE_EXT, 1}, - {ATA_C_IDENTIFY_DEVICE, 2}, - {ATA_C_MEDIA_EJECT, 1}, - {ATA_C_SET_FEATURES, 1}, - {ATA_C_SECURITY_SET_PASSWORD, 3}, - {ATA_C_SECURITY_UNLOCK, 3}, - {ATA_C_SECURITY_ERASE_PREPARE, 1}, - {ATA_C_SECURITY_ERASE_UNIT, 3}, - {ATA_C_SECURITY_FREEZE_LOCK, 1}, - {ATA_C_SECURITY_DISABLE_PASSWORD, 3}, - {ATA_C_READ_NATIVE_MAX_ADDRESS, 1}, - {ATA_C_SET_MAX_ADDRESS, 1}}; -#define ATA_CMD_TABLE_SIZE (sizeof ata_cmd_table / sizeof(ata_cmd_info_t)) - -static const ata_cmd_info_t smart_cmd_table[] = { - {ATA_S_SMART_READ_DATA, 2}, - {ATA_S_SMART_ENABLE_DISABLE_AUTOSAVE, 1}, - {ATA_S_SMART_SAVE_ATTRIBUTE_VALUES, 1}, - {ATA_S_SMART_EXECUTE_OFF_LINE, 1}, - {ATA_S_SMART_READ_LOG, 2}, - {ATA_S_SMART_WRITE_LOG, 3}, - {ATA_S_SMART_ENABLE_OPERATIONS, 1}, - {ATA_S_SMART_DISABLE_OPERATIONS, 1}, - {ATA_S_SMART_RETURN_STATUS, 1}}; -#define SMART_CMD_TABLE_SIZE (sizeof smart_cmd_table / sizeof(ata_cmd_info_t)) - -/* This is the state info tracked between ata_io_start() and ata_io_finish(). */ -typedef struct _ata_cmd_state -{ - int type; /* The ata_cmd_info_t type field. */ - void *buf; - unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ -} ata_cmd_state_t; - -static ata_cmd_state_t atad_cmd_state; - -static int hdpro_io_active = 0; -static int intr_suspended = 0; -static int intr_state; - -static int ata_init_devices(ata_devinfo_t *devinfo); -static int ata_wait_busy(int bits); -int ata_io_finish(void); -int ata_device_flush_cache(int device); - -struct irx_export_table _exp_atad; - -static unsigned int ata_alarm_cb(void *unused) -{ - iSetEventFlag(ata_evflg, 0x01); - return 0; -} - -static void suspend_intr(void) -{ - if (!intr_suspended) { - CpuSuspendIntr(&intr_state); - - intr_suspended = 1; - } -} - -static void resume_intr(void) -{ - if (intr_suspended) { - CpuResumeIntr(intr_state); - - intr_suspended = 0; - } -} - -static int hdpro_io_start(void) -{ - if (hdpro_io_active) - return 0; - - hdpro_io_active = 0; - - suspend_intr(); - - // HD Pro IO start commands sequence - HDPROreg_IO8 = 0x72; - CDVDreg_STATUS = 0; - HDPROreg_IO8 = 0x34; - CDVDreg_STATUS = 0; - HDPROreg_IO8 = 0x61; - CDVDreg_STATUS = 0; - unsigned int res = HDPROreg_IO8; - CDVDreg_STATUS = 0; - - resume_intr(); - - // check result - if ((res & 0xff) == 0xe7) - hdpro_io_active = 1; - - return hdpro_io_active; -} - -static int hdpro_io_finish(void) -{ - if (!hdpro_io_active) - return 0; - - suspend_intr(); - - // HD Pro IO finish commands sequence - HDPROreg_IO8 = 0xf3; - CDVDreg_STATUS = 0; - - resume_intr(); - - DelayThread(200); - - if (HDPROreg_IO32 == 0x401a7800) // check the 1st in ROM0 seg get - hdpro_io_active = 0; // back to it's original state - - return hdpro_io_active ^ 1; -} - -static void hdpro_io_write(unsigned char cmd, unsigned short int val) -{ - suspend_intr(); - - // IO write to HD Pro - HDPROreg_IO8 = cmd; - CDVDreg_STATUS = 0; - HDPROreg_IO8 = val; - CDVDreg_STATUS = 0; - HDPROreg_IO8 = (val & 0xffff) >> 8; - CDVDreg_STATUS = 0; - - resume_intr(); -} - -static int hdpro_io_read(unsigned char cmd) -{ - suspend_intr(); - - // IO read from HD Pro - HDPROreg_IO8 = cmd; - CDVDreg_STATUS = 0; - unsigned int res0 = HDPROreg_IO8; - CDVDreg_STATUS = 0; - unsigned int res1 = HDPROreg_IO8; - CDVDreg_STATUS = 0; - res0 = (res0 & 0xff) | (res1 << 8); - - resume_intr(); - - return res0 & 0xffff; -} - -static int hdpro_io_init(void) -{ - suspend_intr(); - - // HD Pro IO initialization commands sequence - HDPROreg_IO8 = 0x13; - CDVDreg_STATUS = 0; - HDPROreg_IO8 = 0x00; - CDVDreg_STATUS = 0; - - resume_intr(); - - DelayThread(100); - - suspend_intr(); - - HDPROreg_IO8 = 0x13; - CDVDreg_STATUS = 0; - HDPROreg_IO8 = 0x01; - CDVDreg_STATUS = 0; - - resume_intr(); - - DelayThread(3000); - - return ata_wait_busy(0x80); -} - -int _start(int argc, char *argv[]) -{ - int res = MODULE_NO_RESIDENT_END; - iop_event_t event; - - printf(BANNER, VERSION); - - event.attr = 0; - event.bits = 0; - if ((ata_evflg = CreateEventFlag(&event)) < 0) { - M_PRINTF("Couldn't create event flag, exiting.\n"); - goto out; - } - - if (!hdpro_io_start()) { - M_PRINTF("Failed to detect HD Pro, exiting.\n"); - goto out; - } - - HDPROreg_IO8 = 0xe3; - CDVDreg_STATUS = 0; - - if (hdpro_io_init() != 0) { - M_PRINTF("Failed to init HD Pro, exiting.\n"); - goto out; - } - - if (ata_init_devices(atad_devinfo) != 0) { - M_PRINTF("Failed to init device, exiting.\n"); - goto out; - } - - if ((res = RegisterLibraryEntries(&_exp_atad)) != 0) { - M_PRINTF("Library is already registered, exiting.\n"); - goto out; - } - - res = MODULE_RESIDENT_END; - M_PRINTF("Driver loaded.\n"); - -out: - hdpro_io_finish(); - return res; -} - -int shutdown(void) -{ - ata_device_flush_cache(0); - hdpro_io_finish(); - - return 0; -} - -/* Export 8 */ -int ata_get_error(void) -{ - return hdpro_io_read(ATAreg_ERROR_RD) & 0xff; -} - -/* 0x80 for busy, 0x88 for bus busy. */ -static int ata_wait_busy(int bits) -{ - int i, didx, delay; - int res = 0; - - for (i = 0; i < 80; i++) { - - hdpro_io_start(); - - unsigned short int r_control = hdpro_io_read(ATAreg_CONTROL_RD); - - hdpro_io_finish(); - - if (!((r_control & 0xffff) & bits)) - goto out; - - didx = i / 10; - switch (didx) { - case 0: - continue; - case 1: - delay = 100; - break; - case 2: - delay = 1000; - break; - case 3: - delay = 10000; - break; - case 4: - delay = 100000; - break; - default: - delay = 1000000; - } - - DelayThread(delay); - } - - res = -502; - M_PRINTF("Timeout while waiting on busy (0x%02x).\n", bits); - -out: - hdpro_io_start(); - - return res; -} - -static int ata_device_select(int device) -{ - int res; - - if ((res = ata_wait_busy(0x88)) < 0) - return res; - - /* If the device was already selected, nothing to do. */ - if (((hdpro_io_read(ATAreg_SELECT_RD) >> 4) & 1) == device) - return 0; - - /* Select the device. */ - hdpro_io_write(ATAreg_SELECT_WR, (device & 1) << 4); - res = hdpro_io_read(ATAreg_CONTROL_RD); - - return ata_wait_busy(0x88); -} - -/* Export 6 */ -int ata_io_start(void *buf, unsigned int blkcount, unsigned short int feature, unsigned short int nsector, unsigned short int sector, unsigned short int lcyl, unsigned short int hcyl, unsigned short int select, unsigned short int command) -{ - iop_sys_clock_t cmd_timeout; - const ata_cmd_info_t *cmd_table; - int i, res, type, cmd_table_size; - int using_timeout, device = (select >> 4) & 1; - unsigned int searchcmd; - - ClearEventFlag(ata_evflg, 0); - - if (!atad_devinfo[device & 1].exists) - return -505; - - if ((res = ata_device_select(device & 1)) != 0) - return res; - - /* For the SMART commands, we need to search on the subcommand - specified in the feature register. */ - if (command == ATA_C_SMART) { - cmd_table = smart_cmd_table; - cmd_table_size = SMART_CMD_TABLE_SIZE; - searchcmd = feature; - } else { - cmd_table = ata_cmd_table; - cmd_table_size = ATA_CMD_TABLE_SIZE; - searchcmd = command; - } - - type = 0; - for (i = 0; i < cmd_table_size; i++) { - if ((searchcmd & 0xff) == cmd_table[i].command) { - type = cmd_table[i].type; - break; - } - } - - if (!(atad_cmd_state.type = type & 0x7F)) - return -506; - - atad_cmd_state.buf = buf; - atad_cmd_state.blkcount = blkcount; - - /* Check that the device is ready if this the appropiate command. */ - if (!(hdpro_io_read(ATAreg_CONTROL_RD) & 0x40)) { - switch (command) { - case 0x08: - case 0x90: - case 0x91: - case 0xa0: - case 0xa1: - break; - default: - M_PRINTF("Error: Device %d is not ready.\n", device); - return -501; - } - } - - /* Does this command need a timeout? */ - using_timeout = 0; - switch (type & 0x7F) { - case 1: - case 6: - using_timeout = 1; - break; - case 4: - atad_cmd_state.dir = (command != ATA_C_READ_DMA && command != ATA_C_READ_DMA_EXT); - using_timeout = 1; - break; - } - - if (using_timeout) { - cmd_timeout.lo = 0x41eb0000; - cmd_timeout.hi = 0; - - if ((res = SetAlarm(&cmd_timeout, &ata_alarm_cb, NULL)) < 0) - return res; - } - - /* Enable the command completion interrupt. */ - suspend_intr(); - HDPROreg_IO8 = 0x21; - CDVDreg_STATUS = 0; - unsigned int dummy = HDPROreg_IO8; - CDVDreg_STATUS = 0; - resume_intr(); - dummy = 0; - - /* Finally! We send off the ATA command with arguments. */ - hdpro_io_write(ATAreg_CONTROL_WR, (using_timeout == 0) << 1); - - if (type & 0x80) { //For the sake of achieving (greatly) improved performance, write the registers twice only if required! - /* 48-bit LBA requires writing to the address registers twice, - 24 bits of the LBA address is written each time. - Writing to registers twice does not affect 28-bit LBA since - only the latest data stored in address registers is used. */ - hdpro_io_write(ATAreg_FEATURE_WR, (feature & 0xffff) >> 8); - hdpro_io_write(ATAreg_NSECTOR_WR, (nsector & 0xffff) >> 8); - hdpro_io_write(ATAreg_SECTOR_WR, (sector & 0xffff) >> 8); - hdpro_io_write(ATAreg_LCYL_WR, (lcyl & 0xffff) >> 8); - hdpro_io_write(ATAreg_HCYL_WR, (hcyl & 0xffff) >> 8); - } - - hdpro_io_write(ATAreg_FEATURE_WR, feature & 0xff); - hdpro_io_write(ATAreg_NSECTOR_WR, nsector & 0xff); - hdpro_io_write(ATAreg_SECTOR_WR, sector & 0xff); - hdpro_io_write(ATAreg_LCYL_WR, lcyl & 0xff); - hdpro_io_write(ATAreg_HCYL_WR, hcyl & 0xff); - - hdpro_io_write(ATAreg_SELECT_WR, select & 0xff); - hdpro_io_write(ATAreg_COMMAND_WR, command & 0xff); - - return 0; -} - -/* Do a PIO transfer, to or from the device. */ -static int ata_pio_transfer(ata_cmd_state_t *cmd_state) -{ - void *buf; - int i, type; - int res = 0, chk = 0; - unsigned short int status = hdpro_io_read(ATAreg_STATUS_RD); - - if (status & ATA_STAT_ERR) { - M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); - return -503; - } - - /* DRQ must be set (data request). */ - if (!(status & ATA_STAT_DRQ)) - return -504; - - type = cmd_state->type; - - if (type == 3 || type == 8) { - /* PIO data out */ - buf = cmd_state->buf; - - HDPROreg_IO8 = 0x43; - CDVDreg_STATUS = 0; - - for (i = 0; i < 256; i++) { - unsigned short int r_data = *(unsigned short int *)buf; - hdpro_io_write(ATAreg_DATA_WR, r_data); - chk ^= r_data + i; - cmd_state->buf = ++((unsigned short int *)buf); - } - - unsigned short int out = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; - if (out != (chk & 0xffff)) - return -504; - - if (cmd_state->type == 8) { - for (i = 0; i < 4; i++) { - hdpro_io_write(ATAreg_DATA_WR, *(unsigned char *)buf); - cmd_state->buf = ++((unsigned char *)buf); - } - } - - } else if (type == 2) { - /* PIO data in */ - buf = cmd_state->buf; - - suspend_intr(); - - HDPROreg_IO8 = 0x53; - CDVDreg_STATUS = 0; - CDVDreg_STATUS = 0; - - for (i = 0; i < 256; i++) { - - unsigned int res0 = HDPROreg_IO8; - CDVDreg_STATUS = 0; - unsigned int res1 = HDPROreg_IO8; - CDVDreg_STATUS = 0; - - res0 = (res0 & 0xff) | (res1 << 8); - chk ^= res0 + i; - - *(unsigned short int *)buf = res0 & 0xffff; - cmd_state->buf = ++((unsigned short int *)buf); - } - - HDPROreg_IO8 = 0x51; - CDVDreg_STATUS = 0; - CDVDreg_STATUS = 0; - - resume_intr(); - - unsigned short int r_data = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; - if (r_data != (chk & 0xffff)) - return -504; - } - - return res; -} - -/* Export 5 */ -int ata_reset_devices(void) -{ - if (hdpro_io_read(ATAreg_CONTROL_RD) & 0x80) - return -501; - - /* Disables device interrupt assertion and asserts SRST. */ - hdpro_io_write(ATAreg_CONTROL_WR, 6); - DelayThread(100); - - /* Disable ATA interrupts. */ - hdpro_io_write(ATAreg_CONTROL_WR, 2); - DelayThread(3000); - - return ata_wait_busy(0x80); -} - -static void ata_device_probe(ata_devinfo_t *devinfo) -{ - unsigned short int nsector, sector, lcyl, hcyl, select; - - devinfo->exists = 0; - devinfo->has_packet = 0; - - if (hdpro_io_read(ATAreg_CONTROL_RD) & 0x88) - return; - - nsector = hdpro_io_read(ATAreg_NSECTOR_RD) & 0xff; - sector = hdpro_io_read(ATAreg_SECTOR_RD) & 0xff; - lcyl = hdpro_io_read(ATAreg_LCYL_RD) & 0xff; - hcyl = hdpro_io_read(ATAreg_HCYL_RD) & 0xff; - select = hdpro_io_read(ATAreg_SELECT_RD) & 0xff; - - if (nsector != 1) - return; - - devinfo->exists = 1; - - if ((lcyl == 0x14) && (hcyl == 0xeb)) - devinfo->has_packet = 1; -} - -/* Export 17 */ -int ata_device_flush_cache(int device) -{ - int res; - - if (!hdpro_io_start()) - return -1; - - if (!(res = ata_io_start(NULL, 1, 0, 0, 0, 0, 0, (device << 4) & 0xffff, lba_48bit[device] ? ATA_C_FLUSH_CACHE_EXT : ATA_C_FLUSH_CACHE))) - res = ata_io_finish(); - - if (!hdpro_io_finish()) - return -2; - - return res; -} - -/* Export 13 */ -int ata_device_idle(int device, int period) -{ - int res; - - res = ata_io_start(NULL, 1, 0, period & 0xff, 0, 0, 0, (device << 4) & 0xffff, ATA_C_IDLE); - if (res) - return res; - - return ata_io_finish(); -} - -/* Set features - set transfer mode. */ -int ata_device_set_transfer_mode(int device, int type, int mode) -{ - int res; - - res = ata_io_start(NULL, 1, 3, (type | mode) & 0xff, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SET_FEATURES); - if (res) - return res; - - res = ata_io_finish(); - if (res) - return res; - - return 0; -} - -static int ata_device_identify(int device, void *info) -{ - int res; - - res = ata_io_start(info, 1, 0, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_IDENTIFY_DEVICE); - if (res) - return res; - - return ata_io_finish(); -} - -static int ata_init_devices(ata_devinfo_t *devinfo) -{ - int i, res; - - ata_reset_devices(); - - ata_device_probe(&devinfo[0]); - if (!devinfo[0].exists) { - M_PRINTF("Error: Unable to detect HDD 0.\n"); - devinfo[1].exists = 0; - return 0; - } - - /* If there is a device 1, grab it's info too. */ - if ((res = ata_device_select(1)) != 0) - return res; - if (hdpro_io_read(ATAreg_CONTROL_RD) & 0xff) - ata_device_probe(&devinfo[1]); - else - devinfo[1].exists = 0; - - for (i = 0; i < 2; i++) { - if (!devinfo[i].exists) - continue; - - /* Send the IDENTIFY DEVICE command. if it doesn't succeed - devinfo is disabled. */ - if (!devinfo[i].has_packet) { - res = ata_device_identify(i, ata_param); - devinfo[i].exists = (res == 0); - } - - /* This next section is HDD-specific: if no device or it's a - packet (ATAPI) device, we're done. */ - if (!devinfo[i].exists || devinfo[i].has_packet) - continue; - - /* This section is to detect whether the HDD supports 48-bit LBA - (IDENITFY DEVICE bit 10 word 83) and get the total sectors from - either words(61:60) for 28-bit or words(103:100) for 48-bit. */ - if (ata_param[ATA_ID_COMMAND_SETS_SUPPORTED] & 0x0400) { - lba_48bit[i] = 1; - /* I don't think anyone would use a >2TB HDD but just in case. */ - if (ata_param[ATA_ID_48BIT_SECTOTAL_HI]) { - devinfo[i].total_sectors = 0xffffffff; - } else { - devinfo[i].total_sectors = - (ata_param[ATA_ID_48BIT_SECTOTAL_MI] << 16) | - ata_param[ATA_ID_48BIT_SECTOTAL_LO]; - } - } else { - lba_48bit[i] = 0; - devinfo[i].total_sectors = (ata_param[ATA_ID_SECTOTAL_HI] << 16) | - ata_param[ATA_ID_SECTOTAL_LO]; - } - devinfo[i].security_status = ata_param[ATA_ID_SECURITY_STATUS]; - - ata_device_set_transfer_mode(i, 8, 0); /* PIO (flow control). */ - ata_device_idle(i, 0); - } - return 0; -} - -/* Export 7 */ -int ata_io_finish(void) -{ - ata_cmd_state_t *cmd_state = &atad_cmd_state; - u32 bits; - int res = 0, type = cmd_state->type; - unsigned short int stat; - - if (type == 1 || type == 6) { /* Non-data commands. */ - - retry: - suspend_intr(); - - HDPROreg_IO8 = 0x21; - CDVDreg_STATUS = 0; - unsigned int ret = HDPROreg_IO8; - CDVDreg_STATUS = 0; - - resume_intr(); - - if (((ret & 0xff) & 1) == 0) { - WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); - if (bits & 0x01) { /* Timeout. */ - M_PRINTF("Error: ATA timeout on a non-data command.\n"); - return -502; - } - - DelayThread(500); - goto retry; - } - - } else if (type == 4) { /* DMA. */ - M_PRINTF("Error: DMA mode not implemented.\n"); - res = -502; - } else { /* PIO transfers. */ - stat = hdpro_io_read(ATAreg_CONTROL_RD); - if ((res = ata_wait_busy(0x80)) < 0) - goto finish; - - /* Transfer each PIO data block. */ - while (--cmd_state->blkcount != -1) { - if ((res = ata_pio_transfer(cmd_state)) < 0) - goto finish; - if ((res = ata_wait_busy(0x80)) < 0) - goto finish; - } - } - - if (res) - goto finish; - - /* Wait until the device isn't busy. */ - if (hdpro_io_read(ATAreg_STATUS_RD) & ATA_STAT_BUSY) - res = ata_wait_busy(0x80); - if ((stat = hdpro_io_read(ATAreg_STATUS_RD)) & ATA_STAT_ERR) { - M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", stat, ata_get_error()); - res = -503; - } - -finish: - /* The command has completed (with an error or not), so clean things up. */ - CancelAlarm(&ata_alarm_cb, NULL); - - return res; -} - -/* Export 9 */ -int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir) -{ - int res = 0; - unsigned int nbytes; - unsigned short int sector, lcyl, hcyl, select, command, len; - - if (!hdpro_io_start()) - return -1; - - while (nsectors) { - len = (nsectors > 256) ? 256 : nsectors; - - /* Variable lba is only 32 bits so no change for lcyl and hcyl. */ - lcyl = (lba >> 8) & 0xff; - hcyl = (lba >> 16) & 0xff; - - if (lba_48bit[device]) { - /* Setup for 48-bit LBA. */ - /* Combine bits 24-31 and bits 0-7 of lba into sector. */ - sector = ((lba >> 16) & 0xff00) | (lba & 0xff); - /* 0x40 enables LBA. */ - select = ((device << 4) | 0x40) & 0xffff; - command = (dir == 1) ? ATA_C_WRITE_SECTOR_EXT : ATA_C_READ_SECTOR_EXT; - } else { - /* Setup for 28-bit LBA. */ - sector = lba & 0xff; - /* 0x40 enables LBA. */ - select = ((device << 4) | ((lba >> 24) & 0xf) | 0x40) & 0xffff; - command = (dir == 1) ? ATA_C_WRITE_SECTOR : ATA_C_READ_SECTOR; - } - - if ((res = ata_io_start(buf, len, 0, len, sector, lcyl, - hcyl, select, command)) != 0) - continue; - if ((res = ata_io_finish()) != 0) - continue; - - nbytes = len * 512; - (u8 *)buf += nbytes; - lba += len; - nsectors -= len; - } - - if (!hdpro_io_finish()) - return -2; - - return res; -} - -/* Export 4 */ -ata_devinfo_t *ata_get_devinfo(int device) -{ - return &atad_devinfo[device]; -} - -/* Export 19 */ -int ata_device_is_48bit(int device) -{ - return lba_48bit[device]; -} diff --git a/modules/hdd/hdpro_atad/imports.lst b/modules/hdd/hdpro_atad/imports.lst deleted file mode 100755 index 26623d90c..000000000 --- a/modules/hdd/hdpro_atad/imports.lst +++ /dev/null @@ -1,32 +0,0 @@ - -loadcore_IMPORTS_start -I_RegisterLibraryEntries -loadcore_IMPORTS_end - -thbase_IMPORTS_start -I_DelayThread -I_SetAlarm -I_CancelAlarm -I_USec2SysClock -thbase_IMPORTS_end - -thevent_IMPORTS_start -I_CreateEventFlag -I_iSetEventFlag -I_ClearEventFlag -I_WaitEventFlag -thevent_IMPORTS_end - -stdio_IMPORTS_start -I_printf -stdio_IMPORTS_end - -sysclib_IMPORTS_start -I_memcpy -I_memset -sysclib_IMPORTS_end - -intrman_IMPORTS_start -I_CpuSuspendIntr -I_CpuResumeIntr -intrman_IMPORTS_end diff --git a/modules/hdd/hdpro_atad/irx_imports.h b/modules/hdd/hdpro_atad/irx_imports.h deleted file mode 100755 index 3272b86d6..000000000 --- a/modules/hdd/hdpro_atad/irx_imports.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: irx_imports.h 629 2004-10-11 00:45:00Z mrbrown $ -# Defines all IRX imports. -*/ - -#ifndef IOP_IRX_IMPORTS_H -#define IOP_IRX_IMPORTS_H - -#include "irx.h" - -/* Please keep these in alphabetical order! */ -#include "intrman.h" -#include "loadcore.h" -#include "stdio.h" -#include "sysclib.h" -#include "thbase.h" -#include "thevent.h" - -#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/hdd/libapa/include/libapa.h b/modules/hdd/libapa/include/libapa.h deleted file mode 100644 index 8c26ac579..000000000 --- a/modules/hdd/libapa/include/libapa.h +++ /dev/null @@ -1,181 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -*/ - -#ifndef _LIBAPA_H -#define _LIBAPA_H - -// Sectors for this and that ;) -#define APA_SECTOR_MBR 0 -#define APA_SECTOR_SECTOR_ERROR 6 // use for last sector that had a error... -#define APA_SECTOR_PART_ERROR 7 // use for last partition that had a error... -#define APA_SECTOR_APAL 8 -#define APA_SECTOR_APAL_HEADERS 10 // 10-262 - -// APA Partition -#define APA_MAGIC 0x00415041 // 'APA\0' -#define APA_MBR_VERSION 2 - -#define APA_MODVER_MAJOR 2 -#define APA_MODVER_MINOR 1 -#define APA_MODVER ((APA_MODVER_MAJOR << 8) | APA_MODVER_MINOR) - -typedef struct -{ - u8 unused; - u8 sec; - u8 min; - u8 hour; - u8 day; - u8 month; - u16 year; -} apa_ps2time_t; - -// -// MAIN APA defines/struct -// -typedef struct -{ - u32 start; // Sector address - u32 length; // Sector count -} apa_sub_t; - -typedef struct -{ - u32 checksum; - u32 magic; // APA_MAGIC - u32 next; - u32 prev; - char id[APA_IDMAX]; - char rpwd[APA_PASSMAX]; - char fpwd[APA_PASSMAX]; - u32 start; - u32 length; - u16 type; - u16 flags; - u32 nsub; - apa_ps2time_t created; - u32 main; - u32 number; - u32 modver; - u32 pading1[7]; - char pading2[128]; - struct - { - char magic[32]; - u32 version; - u32 nsector; - apa_ps2time_t created; - u32 osdStart; - u32 osdSize; - char pading3[200]; - } mbr; - apa_sub_t subs[APA_MAXSUB]; -} apa_header_t; - -#define APA_CACHE_FLAG_DIRTY 0x01 -typedef struct sapa_cache -{ - struct sapa_cache *next; - struct sapa_cache *tail; - u16 flags; - u16 nused; - s32 device; - u32 sector; - union - { - apa_header_t *header; - u32 *error_lba; - }; -} apa_cache_t; - -typedef struct -{ - char id[APA_IDMAX]; - char fpwd[APA_PASSMAX]; - char rpwd[APA_PASSMAX]; - u32 size; - u16 type; - u16 flags; - u32 main; - u32 number; -} apa_params_t; - -void apaSaveError(s32 device, void *buffer, u32 lba, u32 err_lba); -void apaSetPartErrorSector(s32 device, u32 lba); -int apaGetPartErrorSector(s32 device, u32 lba, u32 *lba_out); -int apaGetPartErrorName(s32 device, char *name); - -apa_cache_t *apaFillHeader(s32 device, const apa_params_t *params, u32 start, u32 next, u32 prev, u32 length, int *err); -apa_cache_t *apaInsertPartition(s32 device, const apa_params_t *params, u32 sector, int *err); -apa_cache_t *apaFindPartition(s32 device, const char *id, int *err); -void apaAddEmptyBlock(apa_header_t *header, u32 *emptyBlocks); -apa_cache_t *apaRemovePartition(s32 device, u32 start, u32 next, u32 prev, u32 length); -void apaMakeEmpty(apa_cache_t *clink); -apa_cache_t *apaDeleteFixPrev(apa_cache_t *clink1, int *err); -apa_cache_t *apaDeleteFixNext(apa_cache_t *clink, int *err); -int apaDelete(apa_cache_t *clink); -int apaCheckSum(apa_header_t *header); -int apaReadHeader(s32 device, apa_header_t *header, u32 lba); -int apaWriteHeader(s32 device, apa_header_t *header, u32 lba); -int apaGetFormat(s32 device, int *format); -u32 apaGetPartitionMax(u32 totalLBA); -apa_cache_t *apaGetNextHeader(apa_cache_t *clink, int *err); - -/////////////////////////////////////////////////////////////////////////////// - -int apaCacheInit(u32 size); -void apaCacheLink(apa_cache_t *clink, apa_cache_t *cnew); -apa_cache_t *apaCacheUnLink(apa_cache_t *clink); -int apaCacheTransfer(apa_cache_t *clink, int type); -void apaCacheFlushDirty(apa_cache_t *clink); -int apaCacheFlushAllDirty(s32 device); -apa_cache_t *apaCacheGetHeader(s32 device, u32 sector, u32 mode, int *err); -void apaCacheFree(apa_cache_t *clink); -apa_cache_t *apaCacheAlloc(void); - -/////////////////////////////////////////////////////////////////////////////// - -#define APAL_MAGIC 0x4150414C // 'APAL' -typedef struct -{ - u32 magic; // APAL_MAGIC - s32 num; - u32 sectors[126]; -} apa_journal_t; - -#define journalCheckSum(header) apaCheckSum((apa_header_t *)header) -int apaJournalReset(s32 device); -int apaJournalFlush(s32 device); -int apaJournalWrite(apa_cache_t *clink); -int apaJournalRestore(s32 device); - -/////////////////////////////////////////////////////////////////////////////// - -void *apaAllocMem(int size); -void apaFreeMem(void *ptr); -int apaGetTime(apa_ps2time_t *tm); -int apaGetIlinkID(u8 *idbuf); - -/////////////////////////////////////////////////////////////////////////////// -int apaPassCmp(const char *password1, const char *password2); -void apaEncryptPassword(const char *id, char *password_out, const char *password_in); - -/////////////////////////////////////////////////////////////////////////////// -typedef struct -{ - u32 totalLBA; - u32 partitionMaxSize; - int format; - int status; -} apa_device_t; - -int apaGetFreeSectors(s32 device, u32 *free, apa_device_t *deviceinfo); - -#endif /* _LIBAPA_H */ diff --git a/modules/hdd/libapa/src/apa.c b/modules/hdd/libapa/src/apa.c deleted file mode 100644 index 4ccc3487a..000000000 --- a/modules/hdd/libapa/src/apa.c +++ /dev/null @@ -1,466 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# Main APA related routines -*/ - -#include -#include -#include -#include -#include -#include - -#include "apa-opt.h" -#include "libapa.h" - -const char apaMBRMagic[] = "Sony Computer Entertainment Inc."; - -void apaSaveError(s32 device, void *buffer, u32 lba, u32 err_lba) -{ - memset(buffer, 0, 512); - *(u32 *)buffer = err_lba; - ata_device_sector_io(device, buffer, lba, 1, ATA_DIR_WRITE); - ata_device_flush_cache(device); -} - -void apaSetPartErrorSector(s32 device, u32 lba) -{ // used to set the lba of a partition that has a error... - apa_cache_t *clink; - clink = apaCacheAlloc(); - apaSaveError(device, clink->header, APA_SECTOR_PART_ERROR, lba); - apaCacheFree(clink); -} - -int apaGetPartErrorSector(s32 device, u32 lba, u32 *lba_out) -{ - apa_cache_t *clink; - int rv = 0; - - if (!(clink = apaCacheAlloc())) - return -ENOMEM; - - if (ata_device_sector_io(device, clink->header, lba, 1, ATA_DIR_READ)) - return -EIO; - - if (lba_out) - *lba_out = *clink->error_lba; - if (*clink->error_lba) - rv = 1; // error is set ;) - apaCacheFree(clink); - return rv; -} - -int apaGetPartErrorName(s32 device, char *name) -{ - u32 lba; - int rv = 0; - apa_cache_t *clink; - - if ((rv = apaGetPartErrorSector(device, APA_SECTOR_PART_ERROR, &lba)) <= 0) - return rv; - if (!(clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv))) - return rv; - - while (clink) { - if (clink->header->type != APA_TYPE_FREE && - !(clink->header->flags & APA_CACHE_FLAG_DIRTY) && - clink->header->start == lba) { - if (name) { - strncpy(name, clink->header->id, APA_IDMAX - 1); - name[APA_IDMAX - 1] = '\0'; - } - apaCacheFree(clink); - return 1; - } - clink = apaGetNextHeader(clink, &rv); - } - - // clear error if no errors and partitions was not found... - if (rv == 0) - apaSetPartErrorSector(device, 0); - return rv; -} - -apa_cache_t *apaFillHeader(s32 device, const apa_params_t *params, u32 start, u32 next, - u32 prev, u32 length, int *err) -{ // used for making a new partition - apa_cache_t *clink; - - if (!(clink = apaCacheGetHeader(device, start, APA_IO_MODE_WRITE, err))) - return NULL; - memset(clink->header, 0, sizeof(apa_header_t)); - clink->header->magic = APA_MAGIC; - clink->header->start = start; - clink->header->next = next; - clink->header->prev = prev; - clink->header->length = length; - clink->header->type = params->type; - clink->header->flags = params->flags; - clink->header->modver = APA_MODVER; - memcpy(clink->header->id, params->id, APA_IDMAX); - if (params->flags & APA_FLAG_SUB) { - clink->header->main = params->main; - clink->header->number = params->number; - } else { - if (strncmp(clink->header->id, "_tmp", APA_IDMAX) != 0) { - memcpy(clink->header->rpwd, params->rpwd, APA_PASSMAX); - memcpy(clink->header->fpwd, params->fpwd, APA_PASSMAX); - } - } - apaGetTime(&clink->header->created); - clink->flags |= APA_CACHE_FLAG_DIRTY; - return clink; -} - -apa_cache_t *apaInsertPartition(s32 device, const apa_params_t *params, u32 sector, int *err) -{ // Adds a new partition using an empty block. - apa_cache_t *clink_empty; - apa_cache_t *clink_this; - apa_cache_t *clink_next; - - if ((clink_this = apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err)) == 0) - return 0; - - while (clink_this->header->length != params->size) { - if ((clink_next = apaCacheGetHeader(device, clink_this->header->next, APA_IO_MODE_READ, err)) == NULL) { // Get next partition - apaCacheFree(clink_this); - return 0; - } - clink_this->header->length >>= 1; - clink_empty = apaRemovePartition(device, (clink_this->header->start + clink_this->header->length), - clink_this->header->next, clink_this->header->start, clink_this->header->length); - clink_this->header->next = clink_empty->header->start; - clink_this->flags |= APA_CACHE_FLAG_DIRTY; - clink_next->header->prev = clink_empty->header->start; - clink_next->flags |= APA_CACHE_FLAG_DIRTY; - - apaCacheFlushAllDirty(device); - apaCacheFree(clink_empty); - apaCacheFree(clink_next); - } - apaCacheFree(clink_this); - clink_this = apaFillHeader(device, params, clink_this->header->start, clink_this->header->next, - clink_this->header->prev, params->size, err); - apaCacheFlushAllDirty(device); - return clink_this; -} - -apa_cache_t *apaFindPartition(s32 device, const char *id, int *err) -{ - apa_cache_t *clink; - - clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, err); - while (clink) { - if (!(clink->header->flags & APA_FLAG_SUB)) { - if (memcmp(clink->header->id, id, APA_IDMAX) == 0) - return clink; // found - } - clink = apaGetNextHeader(clink, (int *)err); - } - if (*err == 0) { - *err = -ENOENT; - return NULL; - //return (apa_cache_t *)-ENOENT; // <-- BUG code tests for NULL only - } - *err = 0; - return NULL; -} - -void apaAddEmptyBlock(apa_header_t *header, u32 *emptyBlocks) -{ // small helper.... to track empty blocks.. - u32 i; - - if (header->type == APA_TYPE_FREE) { - for (i = 0; i < 32; i++) { - if (header->length == (1 << i)) { - if (emptyBlocks[i] == APA_TYPE_FREE) { - emptyBlocks[i] = header->start; - return; - } - } - } - } -} - -apa_cache_t *apaRemovePartition(s32 device, u32 start, u32 next, u32 prev, - u32 length) -{ - apa_cache_t *clink; - int err; - - if ((clink = apaCacheGetHeader(device, start, APA_IO_MODE_WRITE, &err)) == NULL) - return NULL; - memset(clink->header, 0, sizeof(apa_header_t)); - clink->header->magic = APA_MAGIC; - clink->header->start = start; - clink->header->next = next; - clink->header->prev = prev; - clink->header->length = length; - strcpy(clink->header->id, "__empty"); - apaGetTime(&clink->header->created); - clink->flags |= APA_CACHE_FLAG_DIRTY; - return clink; -} - -void apaMakeEmpty(apa_cache_t *clink) -{ - u32 saved_start; - u32 saved_next; - u32 saved_prev; - u32 saved_length; - - saved_start = clink->header->start; - saved_next = clink->header->next; - saved_prev = clink->header->prev; - saved_length = clink->header->length; - memset(clink->header, 0, sizeof(apa_header_t)); - clink->header->magic = APA_MAGIC; - clink->header->start = saved_start; - clink->header->next = saved_next; - clink->header->prev = saved_prev; - clink->header->length = saved_length; - apaGetTime(&clink->header->created); - strcpy(clink->header->id, "__empty"); - clink->flags |= APA_CACHE_FLAG_DIRTY; -} - -apa_cache_t *apaDeleteFixPrev(apa_cache_t *clink, int *err) -{ - apa_cache_t *clink2 = clink; - apa_header_t *header = clink2->header; - u32 device = clink->device; - u32 length = clink->header->length; - u32 saved_next = clink->header->next; - u32 saved_length = clink->header->length; - u32 tmp; - - while (header->start) { - if (!(clink2 = apaCacheGetHeader(device, header->prev, APA_IO_MODE_READ, err))) { - apaCacheFree(clink); - return NULL; - } - header = clink2->header; - tmp = header->length + length; - if (header->type != 0) { - apaCacheFree(clink2); - break; - } - if ((header->start % tmp) || (tmp & (tmp - 1))) { - apaCacheFree(clink2); - break; - } - length = tmp; - apaCacheFree(clink); - clink = clink2; - } - if (length != saved_length) { - if (!(clink2 = apaCacheGetHeader(device, saved_next, APA_IO_MODE_READ, err))) { - apaCacheFree(clink); - return NULL; - } - clink->header->length = length; - clink->header->next = clink->header->start + length; - clink2->header->prev = clink->header->start; - clink2->flags |= APA_CACHE_FLAG_DIRTY; - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink2); - } - return clink; -} - - -apa_cache_t *apaDeleteFixNext(apa_cache_t *clink, int *err) -{ - apa_header_t *header = clink->header; - u32 length = header->length; - u32 saved_length = header->length; - u32 lnext = header->next; - apa_cache_t *clink1; - apa_cache_t *clink2; - u32 device = clink->device; - u32 tmp; - - while (lnext != 0) { - if (!(clink1 = apaCacheGetHeader(device, lnext, APA_IO_MODE_READ, err))) { - apaCacheFree(clink); - return 0; - } - header = clink1->header; - tmp = header->length + length; - if (header->type != 0) { - apaCacheFree(clink1); - break; - } - if ((clink->header->start % tmp) != 0 || ((tmp - 1) & tmp)) { - apaCacheFree(clink1); - break; - } - length = tmp; - apaCacheFree(clink1); - lnext = header->next; - } - if (length != saved_length) { - if (!(clink2 = apaCacheGetHeader(device, lnext, APA_IO_MODE_READ, err))) { - apaCacheFree(clink); - return NULL; - } - clink->header->length = length; - clink->header->next = lnext; - apaMakeEmpty(clink); - clink2->header->prev = clink->header->start; - clink2->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - apaCacheFree(clink2); - } - return clink; -} - - -int apaDelete(apa_cache_t *clink) -{ - int rv = 0; - apa_cache_t *clink_mbr; - u32 device = clink->device; - u32 start = clink->header->start; - int i; - - if (!start) { - apaCacheFree(clink); - return -EACCES; - } - - if (clink->header->next == 0) { - if ((clink_mbr = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv)) == NULL) { - apaCacheFree(clink); - return rv; - } - do { - apaCacheFree(clink); - if ((clink = apaCacheGetHeader(clink->device, clink->header->prev, APA_IO_MODE_READ, &rv)) == NULL) - return 0; - clink->header->next = 0; - clink->flags |= APA_CACHE_FLAG_DIRTY; - clink_mbr->header->prev = clink->header->start; - clink_mbr->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(device); - } while (clink->header->type == 0); - apaCacheFree(clink_mbr); - } else { - u32 length = clink->header->length; - - for (i = 0; i < 2; i++) { - if ((clink = apaDeleteFixPrev(clink, &rv)) == NULL) - return 0; - if ((clink = apaDeleteFixNext(clink, &rv)) == NULL) - return 0; - } - if (clink->header->start == start && clink->header->length == length) { - apaMakeEmpty(clink); - apaCacheFlushAllDirty(clink->device); - } - } - apaCacheFree(clink); - return rv; -} - -int apaCheckSum(apa_header_t *header) -{ - u32 *ptr = (u32 *)header; - u32 sum, i; - - for (sum = 0, i = 1; i < 256; i++) //sizeof(header)/4 = 256, start at offset +4 to omit the checksum field. - sum += ptr[i]; - return sum; -} - -int apaReadHeader(s32 device, apa_header_t *header, u32 lba) -{ - if (ata_device_sector_io(device, header, lba, 2, ATA_DIR_READ) != 0) - return -EIO; - if (header->magic != APA_MAGIC) - return -EIO; - if (apaCheckSum(header) != header->checksum) - return -EIO; - if (lba == APA_SECTOR_MBR) { - if (strncmp(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic)) == 0) - return 0; - APA_PRINTF(APA_DRV_NAME ": error: invalid partition table or version newer than I know.\n"); - return -EIO; - } - return 0; -} - -int apaWriteHeader(s32 device, apa_header_t *header, u32 lba) -{ - if (ata_device_sector_io(device, header, lba, 2, ATA_DIR_WRITE)) - return -EIO; - return 0; -} - -int apaGetFormat(s32 device, int *format) -{ - apa_cache_t *clink; - int rv = 0; - u32 *pDW, i; - - clink = apaCacheAlloc(); - *format = 0; - if ((rv = apaReadHeader(device, clink->header, 0)) == 0) { - *format = clink->header->mbr.version; - if (ata_device_sector_io(device, clink->header, APA_SECTOR_SECTOR_ERROR, 2, ATA_DIR_READ)) - rv = -EIO; // return -EIO; - if (rv == 0) { - pDW = (u32 *)clink->header; - for (i = 0; i < 256; i++) { - if ((i & 0x7F) && pDW[i] != 0) - rv = 1; - } - } - } - apaCacheFree(clink); - return rv == 0; -} - -u32 apaGetPartitionMax(u32 totalLBA) -{ - u32 i, size; - - totalLBA >>= 6; // totalLBA/64 - size = (1 << 0x1F); - for (i = 31; i != 0; i--) { - size = 1 << i; - if (size & totalLBA) - break; - } - if (size < totalLBA) - i++; - return (1 << i); -} - -apa_cache_t *apaGetNextHeader(apa_cache_t *clink, int *err) -{ - u32 start = clink->header->start; - - apaCacheFree(clink); - if (!clink->header->next) - return NULL; - - if (!(clink = apaCacheGetHeader(clink->device, clink->header->next, APA_IO_MODE_READ, err))) - return NULL; - - if (start != clink->header->prev) { - APA_PRINTF(APA_DRV_NAME ": Warning: Invalid partition information. start != prev\n"); - clink->header->prev = start; - clink->flags |= APA_CACHE_FLAG_DIRTY; - apaCacheFlushAllDirty(clink->device); - } - return clink; -} diff --git a/modules/hdd/libapa/src/cache.c b/modules/hdd/libapa/src/cache.c deleted file mode 100644 index ab2856eb3..000000000 --- a/modules/hdd/libapa/src/cache.c +++ /dev/null @@ -1,189 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# APA cache manipulation routines -*/ - -#include -#include -#include -#include -#include - -#include "apa-opt.h" -#include "libapa.h" - -// Globals -static apa_cache_t *cacheBuf; -static int cacheSize; - -int apaCacheInit(u32 size) -{ - apa_header_t *header; - int i; - - cacheSize = size; // save size ;) - if ((header = (apa_header_t *)apaAllocMem(size * sizeof(apa_header_t)))) { - cacheBuf = apaAllocMem((size + 1) * sizeof(apa_cache_t)); - if (cacheBuf == NULL) - return -ENOMEM; - } else - return -ENOMEM; - // setup cache header... - memset(cacheBuf, 0, (size + 1) * sizeof(apa_cache_t)); - cacheBuf->next = cacheBuf; - cacheBuf->tail = cacheBuf; - for (i = 1; i < size + 1; i++, header++) { - cacheBuf[i].header = header; - cacheBuf[i].device = -1; - apaCacheLink(cacheBuf->tail, &cacheBuf[i]); - } - return 0; -} - -void apaCacheLink(apa_cache_t *clink, apa_cache_t *cnew) -{ - cnew->tail = clink; - cnew->next = clink->next; - clink->next->tail = cnew; - clink->next = cnew; -} - -apa_cache_t *apaCacheUnLink(apa_cache_t *clink) -{ - clink->tail->next = clink->next; - clink->next->tail = clink->tail; - return clink; -} - -int apaCacheTransfer(apa_cache_t *clink, int type) -{ - int err; - if (type) - err = apaWriteHeader(clink->device, clink->header, clink->sector); - else // 0 - err = apaReadHeader(clink->device, clink->header, clink->sector); - - if (err) { - APA_PRINTF(APA_DRV_NAME ": error: disk err %d on device %ld, sector %ld, type %d\n", - err, clink->device, clink->sector, type); - if (type == 0) // save any read error's.. - apaSaveError(clink->device, clink->header, APA_SECTOR_SECTOR_ERROR, clink->sector); - } - clink->flags &= ~APA_CACHE_FLAG_DIRTY; - return err; -} - -void apaCacheFlushDirty(apa_cache_t *clink) -{ - if (clink->flags & APA_CACHE_FLAG_DIRTY) - apaCacheTransfer(clink, APA_IO_MODE_WRITE); -} - -int apaCacheFlushAllDirty(s32 device) -{ - u32 i; - // flush apal - for (i = 1; i < cacheSize + 1; i++) { - if ((cacheBuf[i].flags & APA_CACHE_FLAG_DIRTY) && cacheBuf[i].device == device) - apaJournalWrite(&cacheBuf[i]); - } - apaJournalFlush(device); - // flush apa - for (i = 1; i < cacheSize + 1; i++) { - if ((cacheBuf[i].flags & APA_CACHE_FLAG_DIRTY) && cacheBuf[i].device == device) - apaCacheTransfer(&cacheBuf[i], APA_IO_MODE_WRITE); - } - return apaJournalReset(device); -} - -apa_cache_t *apaCacheGetHeader(s32 device, u32 sector, u32 mode, int *result) -{ - apa_cache_t *clink = NULL; - int i; - - *result = 0; - for (i = 1; i < cacheSize + 1; i++) { - if (cacheBuf[i].sector == sector && - cacheBuf[i].device == device) { - clink = &cacheBuf[i]; - break; - } - } - if (clink != NULL) { - // cached ver was found :) - if (clink->nused == 0) - clink = apaCacheUnLink(clink); - clink->nused++; - return clink; - } - if ((cacheBuf->tail == cacheBuf) && - (cacheBuf->tail == cacheBuf->tail->next)) { - APA_PRINTF(APA_DRV_NAME ": error: free buffer empty\n"); - } else { - clink = cacheBuf->next; - if (clink->flags & APA_CACHE_FLAG_DIRTY) - APA_PRINTF(APA_DRV_NAME ": error: dirty buffer allocated\n"); - clink->flags = 0; - clink->nused = 1; - clink->device = device; - clink->sector = sector; - clink = apaCacheUnLink(clink); - } - if (clink == NULL) { - *result = -ENOMEM; - return NULL; - } - if (!mode) { - if ((*result = apaCacheTransfer(clink, APA_IO_MODE_READ)) < 0) { - clink->nused = 0; - clink->device = -1; - apaCacheLink(cacheBuf, clink); - clink = NULL; - } - } - return clink; -} - -void apaCacheFree(apa_cache_t *clink) -{ - if (clink == NULL) { - APA_PRINTF(APA_DRV_NAME ": error: null buffer returned\n"); - return; - } - if (clink->nused == 0) { - APA_PRINTF(APA_DRV_NAME ": error: unused cache returned\n"); - return; - } - if (clink->flags & APA_CACHE_FLAG_DIRTY) - APA_PRINTF(APA_DRV_NAME ": error: dirty buffer returned\n"); - clink->nused--; - if (clink->nused == 0) - apaCacheLink(cacheBuf->tail, clink); - return; -} - -apa_cache_t *apaCacheAlloc(void) -{ - apa_cache_t *cnext; - - if ((cacheBuf->tail == cacheBuf) && - (cacheBuf->tail == cacheBuf->tail->next)) { - APA_PRINTF(APA_DRV_NAME ": error: free buffer empty\n"); - return NULL; - } - cnext = cacheBuf->next; - if (cnext->flags & APA_CACHE_FLAG_DIRTY) - APA_PRINTF(APA_DRV_NAME ": error: dirty buffer allocated\n"); - cnext->nused = 1; - cnext->flags = 0; - cnext->device = -1; - cnext->sector = -1; - return apaCacheUnLink(cnext); -} diff --git a/modules/hdd/libapa/src/free.c b/modules/hdd/libapa/src/free.c deleted file mode 100644 index fd49c4606..000000000 --- a/modules/hdd/libapa/src/free.c +++ /dev/null @@ -1,74 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# Free space calculation routines -*/ - -#include -#include -#include -#include -#include -#include - -#include "apa-opt.h" -#include "libapa.h" - -static void apaCalculateFreeSpace(u32 *free, u32 sectors) -{ - if (0x1FFFFF < sectors) { - *free += sectors; - return; - } - - if ((*free & sectors) == 0) { - *free |= sectors; - return; - } - - for (sectors /= 2; 0x3FFFF < sectors; sectors /= 2) - *free |= sectors; -} - -int apaGetFreeSectors(s32 device, u32 *free, apa_device_t *deviceinfo) -{ - u32 sectors, partMax; - int rv; - apa_cache_t *clink; - - sectors = 0; - *free = 0; - if ((clink = apaCacheGetHeader(device, 0, APA_IO_MODE_READ, &rv)) != NULL) { - do { - if (clink->header->type == 0) - apaCalculateFreeSpace(free, clink->header->length); - sectors += clink->header->length; - } while ((clink = apaGetNextHeader(clink, &rv)) != NULL); - } - - if (rv == 0) { - for (partMax = deviceinfo[device].partitionMaxSize; 0x0003FFFF < partMax; partMax = deviceinfo[device].partitionMaxSize) { //As weird as it looks, this was how it was done in the original HDD.IRX. - for (; 0x0003FFFF < partMax; partMax /= 2) { - //Non-SONY: Perform 64-bit arithmetic here to avoid overflows when dealing with large disks. - if ((sectors % partMax == 0) && ((u64)sectors + partMax < deviceinfo[device].totalLBA)) { - apaCalculateFreeSpace(free, partMax); - sectors += partMax; - break; - } - } - - if (0x0003FFFF >= partMax) - break; - } - - APA_PRINTF(APA_DRV_NAME ": total = %08lx sectors, installable = %08lx sectors.\n", sectors, *free); - } - - return rv; -} diff --git a/modules/hdd/libapa/src/journal.c b/modules/hdd/libapa/src/journal.c deleted file mode 100644 index ae5e299d6..000000000 --- a/modules/hdd/libapa/src/journal.c +++ /dev/null @@ -1,82 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# APA journal related routines -*/ - -#include -#include -#include -#include -#include -#include - -#include "apa-opt.h" -#include "libapa.h" - -// Globals -static apa_journal_t journalBuf; - -int apaJournalFlush(s32 device) -{ // this write any thing that in are journal buffer :) - if (ata_device_flush_cache(device)) - return -EIO; - if (ata_device_sector_io(device, &journalBuf, APA_SECTOR_APAL, 1, ATA_DIR_WRITE)) - return -EIO; - if (ata_device_flush_cache(device)) - return -EIO; - return 0; -} - -int apaJournalReset(s32 device) -{ - memset(&journalBuf, 0, sizeof(apa_journal_t)); - journalBuf.magic = APAL_MAGIC; - return apaJournalFlush(device); -} - -int apaJournalWrite(apa_cache_t *clink) -{ - clink->header->checksum = journalCheckSum(clink->header); - if (ata_device_sector_io(clink->device, clink->header, - (journalBuf.num << 1) + APA_SECTOR_APAL_HEADERS, 2, ATA_DIR_WRITE)) - return -EIO; - journalBuf.sectors[journalBuf.num] = clink->sector; - journalBuf.num++; - return 0; -} - -int apaJournalRestore(s32 device) -{ // copys apa headers from apal to apa system - int i; - u32 sector; - apa_cache_t *clink; - - APA_PRINTF(APA_DRV_NAME ": checking log...\n"); - if (ata_device_sector_io(device, &journalBuf, APA_SECTOR_APAL, sizeof(apa_journal_t) / 512, ATA_DIR_READ)) { - apaJournalReset(device); - return -EIO; - } - if (journalBuf.magic == APAL_MAGIC) { - if (journalBuf.num == 0) - return 0; - clink = apaCacheAlloc(); - for (i = 0, sector = APA_SECTOR_APAL_HEADERS; i < journalBuf.num; i++, sector += 2) { - if (ata_device_sector_io(device, clink->header, sector, 2, ATA_DIR_READ)) - break; - if (ata_device_sector_io(device, clink->header, journalBuf.sectors[i], 2, ATA_DIR_WRITE)) - break; - } - apaCacheFree(clink); - return apaJournalReset(device); // only do if journal.. - } - memset(&journalBuf, 0, sizeof(apa_journal_t)); // safe e - journalBuf.magic = APAL_MAGIC; - return 0; //-EINVAL; -} diff --git a/modules/hdd/libapa/src/misc.c b/modules/hdd/libapa/src/misc.c deleted file mode 100644 index 3bf1e9e31..000000000 --- a/modules/hdd/libapa/src/misc.c +++ /dev/null @@ -1,73 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# Miscellaneous routines -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "apa-opt.h" -#include "libapa.h" - -void *apaAllocMem(int size) -{ - int intrStat; - void *mem; - - CpuSuspendIntr(&intrStat); - mem = AllocSysMemory(ALLOC_FIRST, size, NULL); - CpuResumeIntr(intrStat); - - return mem; -} - -void apaFreeMem(void *ptr) -{ - int intrStat; - - CpuSuspendIntr(&intrStat); - FreeSysMemory(ptr); - CpuResumeIntr(intrStat); -} - -int apaGetTime(apa_ps2time_t *tm) -{ - sceCdCLOCK cdtime; - apa_ps2time_t timeBuf = {0, 7, 6, 5, 4, 3, 2000}; - - if (sceCdReadClock(&cdtime) != 0 && cdtime.stat == 0) { - timeBuf.sec = btoi(cdtime.second); - timeBuf.min = btoi(cdtime.minute); - timeBuf.hour = btoi(cdtime.hour); - timeBuf.day = btoi(cdtime.day); - timeBuf.month = btoi(cdtime.month & 0x7F); //The old CDVDMAN sceCdReadClock() function does not automatically file off the highest bit. - timeBuf.year = btoi(cdtime.year) + 2000; - } - memcpy(tm, &timeBuf, sizeof(apa_ps2time_t)); - return 0; -} - -int apaGetIlinkID(u8 *idbuf) -{ - u32 err = 0; - - memset(idbuf, 0, 32); - if (sceCdRI(idbuf, &err)) - if (err == 0) - return 0; - APA_PRINTF(APA_DRV_NAME ": Error: cannot get ilink id\n"); - return -EIO; -} diff --git a/modules/hdd/libapa/src/password.c b/modules/hdd/libapa/src/password.c deleted file mode 100644 index b7637d2df..000000000 --- a/modules/hdd/libapa/src/password.c +++ /dev/null @@ -1,494 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# Password-handling routines -*/ - -#include -#include -#include -#include -#include -#include - -#include "apa-opt.h" -#include "libapa.h" - -int apaPassCmp(const char *pw1, const char *pw2) -{ -#ifdef APA_ENABLE_PASSWORDS - return memcmp(pw1, pw2, APA_PASSMAX) ? -EACCES : 0; -#else - //Passwords are not supported, hence this check should always pass. - return 0; -#endif -} - -static void DESEncryptPassword(u32 id_lo, u32 id_hi, char *password_out, const char *password); - -void apaEncryptPassword(const char *id, char *password_out, const char *password_in) -{ - char password[APA_PASSMAX]; - memcpy(password, password_in, APA_PASSMAX); - DESEncryptPassword(*(u32 *)(id), *(u32 *)(id + 4), password_out, password); -} - -struct KeyPair -{ - u32 lo, hi; -}; - -//This is a standard DES-ECB implementation. It encrypts the partition ID with the password. -static void DESEncryptPassword(u32 id_lo, u32 id_hi, char *password_out, const char *password) -{ - //Left - static const u8 PC1[] = {0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, - 0x01, 0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, - 0x0a, 0x02, 0x3b, 0x33, 0x2b, 0x23, 0x1b, - 0x13, 0x0b, 0x03, 0x3c, 0x34, 0x2c, 0x24, - //Right - 0x3f, 0x37, 0x2f, 0x27, 0x1f, 0x17, 0x0f, - 0x07, 0x3e, 0x36, 0x2e, 0x26, 0x1e, 0x16, - 0x0e, 0x06, 0x3d, 0x35, 0x2d, 0x25, 0x1d, - 0x15, 0x0d, 0x05, 0x1c, 0x14, 0x0c, 0x04}; - static const u8 Rotations[] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}; - static const u8 PC2[] = {0x0e, 0x11, 0x0b, 0x18, 0x01, 0x05, - 0x03, 0x1c, 0x0f, 0x06, 0x15, 0x0a, - 0x17, 0x13, 0x0c, 0x04, 0x1a, 0x08, - 0x10, 0x07, 0x1b, 0x14, 0x0d, 0x02, - 0x29, 0x34, 0x1f, 0x25, 0x2f, 0x37, - 0x1e, 0x28, 0x33, 0x2d, 0x21, 0x30, - 0x2c, 0x31, 0x27, 0x38, 0x22, 0x35, - 0x2e, 0x2a, 0x32, 0x24, 0x1d, 0x20}; - static const u8 IP[] = {0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, 0x0a, 0x02, 0x3c, 0x34, 0x2c, 0x24, 0x1c, 0x14, 0x0c, 0x04, - 0x3e, 0x36, 0x2e, 0x26, 0x1e, 0x16, 0x0e, 0x06, 0x40, 0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x08, - - 0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, 0x01, 0x3b, 0x33, 0x2b, 0x23, 0x1b, 0x13, 0x0b, 0x03, - 0x3d, 0x35, 0x2d, 0x25, 0x1d, 0x15, 0x0d, 0x05, 0x3f, 0x37, 0x2f, 0x27, 0x1f, 0x17, 0x0f, 0x07}; - static const u8 Expansion[] = {0x20, 0x01, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x14, 0x15, - 0x16, 0x17, 0x18, 0x19, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x01}; - static const u8 sbox[][64] = {{0x0e, 0x04, 0x0d, 0x01, 0x02, 0x0f, 0x0b, 0x08, 0x03, 0x0a, 0x06, 0x0c, 0x05, 0x09, 0x00, 0x07, - 0x00, 0x0f, 0x07, 0x04, 0x0e, 0x02, 0x0d, 0x01, 0x0a, 0x06, 0x0c, 0x0b, 0x09, 0x05, 0x03, 0x08, - 0x04, 0x01, 0x0e, 0x08, 0x0d, 0x06, 0x02, 0x0b, 0x0f, 0x0c, 0x09, 0x07, 0x03, 0x0a, 0x05, 0x00, - 0x0f, 0x0c, 0x08, 0x02, 0x04, 0x09, 0x01, 0x07, 0x05, 0x0b, 0x03, 0x0e, 0x0a, 0x00, 0x06, 0x0d}, - {0x0f, 0x01, 0x08, 0x0e, 0x06, 0x0b, 0x03, 0x04, 0x09, 0x07, 0x02, 0x0d, 0x0c, 0x00, 0x05, 0x0a, - 0x03, 0x0d, 0x04, 0x07, 0x0f, 0x02, 0x08, 0x0e, 0x0c, 0x00, 0x01, 0x0a, 0x06, 0x09, 0x0b, 0x05, - 0x00, 0x0e, 0x07, 0x0b, 0x0a, 0x04, 0x0d, 0x01, 0x05, 0x08, 0x0c, 0x06, 0x09, 0x03, 0x02, 0x0f, - 0x0d, 0x08, 0x0a, 0x01, 0x03, 0x0f, 0x04, 0x02, 0x0b, 0x06, 0x07, 0x0c, 0x00, 0x05, 0x0e, 0x09}, - {0x0a, 0x00, 0x09, 0x0e, 0x06, 0x03, 0x0f, 0x05, 0x01, 0x0d, 0x0c, 0x07, 0x0b, 0x04, 0x02, 0x08, - 0x0d, 0x07, 0x00, 0x09, 0x03, 0x04, 0x06, 0x0a, 0x02, 0x08, 0x05, 0x0e, 0x0c, 0x0b, 0x0f, 0x01, - 0x0d, 0x06, 0x04, 0x09, 0x08, 0x0f, 0x03, 0x00, 0x0b, 0x01, 0x02, 0x0c, 0x05, 0x0a, 0x0e, 0x07, - 0x01, 0x0a, 0x0d, 0x00, 0x06, 0x09, 0x08, 0x07, 0x04, 0x0f, 0x0e, 0x03, 0x0b, 0x05, 0x02, 0x0c}, - {0x07, 0x0d, 0x0e, 0x03, 0x00, 0x06, 0x09, 0x0a, 0x01, 0x02, 0x08, 0x05, 0x0b, 0x0c, 0x04, 0x0f, - 0x0d, 0x08, 0x0b, 0x05, 0x06, 0x0f, 0x00, 0x03, 0x04, 0x07, 0x02, 0x0c, 0x01, 0x0a, 0x0e, 0x09, - 0x0a, 0x06, 0x09, 0x00, 0x0c, 0x0b, 0x07, 0x0d, 0x0f, 0x01, 0x03, 0x0e, 0x05, 0x02, 0x08, 0x04, - 0x03, 0x0f, 0x00, 0x06, 0x0a, 0x01, 0x0d, 0x08, 0x09, 0x04, 0x05, 0x0b, 0x0c, 0x07, 0x02, 0x0e}, - {0x02, 0x0c, 0x04, 0x01, 0x07, 0x0a, 0x0b, 0x06, 0x08, 0x05, 0x03, 0x0f, 0x0d, 0x00, 0x0e, 0x09, - 0x0e, 0x0b, 0x02, 0x0c, 0x04, 0x07, 0x0d, 0x01, 0x05, 0x00, 0x0f, 0x0a, 0x03, 0x09, 0x08, 0x06, - 0x04, 0x02, 0x01, 0x0b, 0x0a, 0x0d, 0x07, 0x08, 0x0f, 0x09, 0x0c, 0x05, 0x06, 0x03, 0x00, 0x0e, - 0x0b, 0x08, 0x0c, 0x07, 0x01, 0x0e, 0x02, 0x0d, 0x06, 0x0f, 0x00, 0x09, 0x0a, 0x04, 0x05, 0x03}, - {0x0c, 0x01, 0x0a, 0x0f, 0x09, 0x02, 0x06, 0x08, 0x00, 0x0d, 0x03, 0x04, 0x0e, 0x07, 0x05, 0x0b, - 0x0a, 0x0f, 0x04, 0x02, 0x07, 0x0c, 0x09, 0x05, 0x06, 0x01, 0x0d, 0x0e, 0x00, 0x0b, 0x03, 0x08, - 0x09, 0x0e, 0x0f, 0x05, 0x02, 0x08, 0x0c, 0x03, 0x07, 0x00, 0x04, 0x0a, 0x01, 0x0d, 0x0b, 0x06, - 0x04, 0x03, 0x02, 0x0c, 0x09, 0x05, 0x0f, 0x0a, 0x0b, 0x0e, 0x01, 0x07, 0x06, 0x00, 0x08, 0x0d}, - {0x04, 0x0b, 0x02, 0x0e, 0x0f, 0x00, 0x08, 0x0d, 0x03, 0x0c, 0x09, 0x07, 0x05, 0x0a, 0x06, 0x01, - 0x0d, 0x00, 0x0b, 0x07, 0x04, 0x09, 0x01, 0x0a, 0x0e, 0x03, 0x05, 0x0c, 0x02, 0x0f, 0x08, 0x06, - 0x01, 0x04, 0x0b, 0x0d, 0x0c, 0x03, 0x07, 0x0e, 0x0a, 0x0f, 0x06, 0x08, 0x00, 0x05, 0x09, 0x02, - 0x06, 0x0b, 0x0d, 0x08, 0x01, 0x04, 0x0a, 0x07, 0x09, 0x05, 0x00, 0x0f, 0x0e, 0x02, 0x03, 0x0c}, - {0x0d, 0x02, 0x08, 0x04, 0x06, 0x0f, 0x0b, 0x01, 0x0a, 0x09, 0x03, 0x0e, 0x05, 0x00, 0x0c, 0x07, - 0x01, 0x0f, 0x0d, 0x08, 0x0a, 0x03, 0x07, 0x04, 0x0c, 0x05, 0x06, 0x0b, 0x00, 0x0e, 0x09, 0x02, - 0x07, 0x0b, 0x04, 0x01, 0x09, 0x0c, 0x0e, 0x02, 0x00, 0x06, 0x0a, 0x0d, 0x0f, 0x03, 0x05, 0x08, - 0x02, 0x01, 0x0e, 0x07, 0x04, 0x0a, 0x08, 0x0d, 0x0f, 0x0c, 0x09, 0x00, 0x03, 0x05, 0x06, 0x0b}}; - static const u8 Permutation[] = {0x10, 0x07, 0x14, 0x15, 0x1d, 0x0c, 0x1c, 0x11, 0x01, 0x0f, 0x17, 0x1a, 0x05, 0x12, 0x1f, 0x0a, - 0x02, 0x08, 0x18, 0x0e, 0x20, 0x1b, 0x03, 0x09, 0x13, 0x0d, 0x1e, 0x06, 0x16, 0x0b, 0x04, 0x19}; - static const u8 FP[] = {0x28, 0x08, 0x30, 0x10, 0x38, 0x18, 0x40, 0x20, 0x27, 0x07, 0x2f, 0x0f, 0x37, 0x17, 0x3f, 0x1f, - 0x26, 0x06, 0x2e, 0x0e, 0x36, 0x16, 0x3e, 0x1e, 0x25, 0x05, 0x2d, 0x0d, 0x35, 0x15, 0x3d, 0x1d, - 0x24, 0x04, 0x2c, 0x0c, 0x34, 0x14, 0x3c, 0x1c, 0x23, 0x03, 0x2b, 0x0b, 0x33, 0x13, 0x3b, 0x1b, - 0x22, 0x02, 0x2a, 0x0a, 0x32, 0x12, 0x3a, 0x1a, 0x21, 0x01, 0x29, 0x09, 0x31, 0x11, 0x39, 0x19}; - u32 BitMask_hi, BitMask_lo; - u32 PermutedKeyMask_lo, PermutedKeyMask_hi, Rot2Mask_lo, Rot1Mask_lo, Rot2Mask_hi, Rot1Mask_hi; - u32 BitPerm_lo, BitPerm_hi; - u32 password_lo, password_hi; - u32 key1, key2, key3, key4, input_lo, input_hi; - u32 PermutedKey_lo, PermutedKey_hi, kVal_lo, kVal_hi, PermutedInput_lo, PermutedInput_hi, eVal_lo, eVal_hi, sVal_lo, sVal_hi, pVal_lo, pVal_hi, output_lo, output_hi; - struct KeyPair pairC[17], pairD[17], pairK[17], pairL[17], pairR[17]; - struct KeyPair *pPairC, *pPairD, *pPairK, *pPairL, *pPairR; - unsigned int i, j, k; - int shift; - - //Phase 1 (Permute KEY with Permuted Choice 1) - PermutedKey_lo = 0; - PermutedKey_hi = 0; - BitMask_lo = 0; - BitMask_hi = 0x80000000; - BitPerm_lo = 0; - BitPerm_hi = 0x80000000; - - password_lo = *(const u32 *)password; - password_hi = *(const u32 *)(password + 4); - - for (i = 0; i < 56; i++) { - shift = PC1[i] - 1; - - if ((shift << 26) >= 0) { //0 to 31-bit shift - if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key2 = 0; - key1 = BitMask_hi >> shift; - } - - //If bit (shift) is set, set the current bit. - if (((password_lo & key1) | (password_hi & key2)) != 0) { - PermutedKey_lo |= BitPerm_lo; - PermutedKey_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); - BitPerm_hi >>= 1; - } - - //Phase 2 (Key Schedule Calculation) - //This mask is used to extract the lower 28-bits of a key. - PermutedKeyMask_lo = 0x0FFFFFFF; - PermutedKeyMask_hi = 0x00000000; - - Rot2Mask_lo = 3; - Rot2Mask_hi = 0x00000000; - Rot1Mask_lo = 1; - Rot1Mask_hi = 0x00000000; - - //C-bits, upper 28-bits of Permuted Key - pairC[0].lo = PermutedKey_hi >> 4; - pairC[0].hi = 0; - - //D-bits, lower 28-bits of Permuted Key - pairD[0].lo = ((PermutedKey_lo >> 8) | (PermutedKey_hi << 24)) & PermutedKeyMask_lo; - pairD[0].hi = ((PermutedKey_hi >> 8) & PermutedKeyMask_hi); - - //Calculate all Cn and Dn. - for (i = 0; i < 16; i++) { - if (Rotations[i] != 1) { //Rotate left twice - //hi 26:0 | lo 31:26 - key1 = ((pairC[i].hi << 6) | (pairC[i].lo >> 26)) & Rot2Mask_lo; - //lo 29:0 - //key1|key 4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLXX, where X is from key1 - key4 = pairC[i].lo << 2; - //hi 31:26 - //This part is discarded. - key2 = (pairC[i].hi >> 26) & Rot2Mask_hi; - //hi 29:2 | lo 31:30 - //key2|key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHLL - key3 = (pairC[i].hi << 2) | (pairC[i].lo >> 30); - } else { //Rotate left once - //hi 27:0 | lo 31:27 - key1 = ((pairC[i].hi << 5) | (pairC[i].lo >> 27)) & Rot1Mask_lo; - //lo 30:0 - //key1|key4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLX, where X is from key1 - key4 = pairC[i].lo << 1; - //hi 31:27 - //This part is discarded. - key2 = (pairC[i].hi >> 27) & Rot1Mask_hi; - //hi 30:0 | lo 31:31 - //key2:key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHL - key3 = (pairC[i].hi << 1) | (pairC[i].lo >> 31); - } - - //Merge the two rotated parts together, for the hi and low pair. - //Note: hi contains nothing. - pairC[i + 1].lo = (key1 | key4) & PermutedKeyMask_lo; - pairC[i + 1].hi = (key2 | key3) & PermutedKeyMask_hi; - - if (Rotations[i] != 1) { //Rotate left twice - //hi 26:0 | lo 31:26 - key1 = ((pairD[i].hi << 6) | (pairD[i].lo >> 26)) & Rot2Mask_lo; - //lo 29:0 - //key1|key 4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLXX, where X is from key1 - key4 = pairD[i].lo << 2; - //hi 31:26 - //This part is discarded. - key2 = (pairD[i].hi >> 26) & Rot2Mask_hi; - //hi 29:2 | lo 31:30 - //key2|key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHLL - key3 = (pairD[i].hi << 2) | (pairD[i].lo >> 30); - } else { //Rotate left once - //hi 27:0 | lo 31:27 - key1 = ((pairD[i].hi << 5) | (pairD[i].lo >> 27)) & Rot1Mask_lo; - //lo 30:0 - //key1|key4 results in: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLX, where X is from key1 - key4 = pairD[i].lo << 1; - //hi 31:27 - //This part is discarded. - key2 = (pairD[i].hi >> 27) & Rot1Mask_hi; - //hi 30:0 | lo 31:31 - //key2:key3 results in: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHL - key3 = (pairD[i].hi << 1) | (pairD[i].lo >> 31); - } - - //Merge the two rotated parts together, for the hi and low pair. - //Note: hi contains nothing. - pairD[i + 1].lo = (key1 | key4) & PermutedKeyMask_lo; - pairD[i + 1].hi = (key2 | key3) & PermutedKeyMask_hi; - } - - //Phase 3 - BitMask_lo = 0x00000000; - BitMask_hi = 0x80000000; - - // Determine all K, through the Permutation of CnDn by PC-2 - for (pPairC = &pairC[1], pPairD = &pairD[1], pPairK = &pairK[1]; pPairK < &pairK[17]; pPairC++, pPairD++, pPairK++) { - kVal_lo = 0; - kVal_hi = 0; - BitPerm_lo = 0x00000000; - BitPerm_hi = 0x80000000; - - /* Calculate CnDn: - Note: hi of both Cn and Dn are assumed to, and actually contain nothing. - lo: (D lo 23:0) | (0 7:0) - D lo 23:0 LLLLLLLLLLLLLLLLLLLLLLLL00000000 - 0 7:0 00000000000000000000000000000000 - hi: (C hi 27:0) | (D hi 23:0) | (D lo 31:24) - C lo 27:0 llllllllllllllllllllllllllll0000 - D hi 23:0 HHHHHHHHHHHHHHHHHHHHHHHH00000000 All zero - D lo 31:24 000000000000000000000000XXXXLLLL - - l = C lo L = D lo - h = C hi H = D hi X = unused bits (28/32-bit value) */ - input_lo = 0 | (pPairD->lo << 8); - input_hi = (pPairC->lo << 4) | (pPairD->hi << 8) | (pPairD->lo >> 24); - - for (i = 0; i < 48; i++) { - shift = PC2[i] - 1; - - if ((shift << 26) >= 0) { //0 to 31-bit shift - if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key2 = 0; - key1 = BitMask_hi >> shift; - } - - //If bit (shift) is set, set the current bit. - if (((input_lo & key1) | (input_hi & key2)) != 0) { - kVal_lo |= BitPerm_lo; - kVal_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_hi << 31) | (BitPerm_lo >> 1); - BitPerm_hi >>= 1; - } - - pPairK->lo = kVal_lo; - pPairK->hi = kVal_hi; - } - - //Phase 4 (Enciphering) - BitMask_lo = 0x00000000; - BitMask_hi = 0x80000000; - BitPerm_lo = 0x00000000; - BitPerm_hi = 0x80000000; - PermutedInput_lo = 0; - PermutedInput_hi = 0; - - //Initial Permutation (IP) - for (i = 0; i < 64; i++) { - shift = IP[i] - 1; - - if ((shift << 26) >= 0) { //0 to 31-bit shift - if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key2 = 0; - key1 = BitMask_hi >> shift; - } - - //If bit (shift) is set, set the current bit. - if (((id_lo & key1) | (id_hi & key2)) != 0) { - PermutedInput_lo |= BitPerm_lo; - PermutedInput_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); - BitPerm_hi >>= 1; - } - - //Phase 5 (Key-dependent Computation) - BitMask_lo = 0x00000000; - BitMask_hi = 0x80000000; - - //L0 and R0 make up the permuted input block. - //The lo values are not used. - pairL[0].lo = PermutedInput_lo & 0x00000000; - pairL[0].hi = PermutedInput_hi & 0xFFFFFFFF; - pairR[0].lo = 0x00000000; - pairR[0].hi = PermutedInput_lo << 0; - - for (j = 0, k = 1, pPairL = &pairL[1], pPairR = &pairR[1]; pPairR < &pairR[17]; j++, k++, pPairR++, pPairL++) { - eVal_lo = 0; - eVal_hi = 0; - BitPerm_lo = 0x00000000; - BitPerm_hi = 0x80000000; - - //Ln' = Rn - pPairL->lo = input_lo = pairR[j].lo; - pPairL->hi = input_hi = pairR[j].hi; - - //Calculate E(Rn) - for (i = 0; i < 48; i++) { - shift = Expansion[i] - 1; - if ((shift << 26) >= 0) { //0 to 31-bit shift - if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key2 = 0; - key1 = BitMask_hi >> shift; - } - - //If bit (shift) is set, set the current bit. - if (((input_lo & key1) | (input_hi & key2)) != 0) { - eVal_lo |= BitPerm_lo; - eVal_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_hi << 31) | (BitPerm_lo >> 1); - BitPerm_hi >>= 1; - } - - //Phase 6 (Substitution Boxes) - sVal_lo = 0; - sVal_hi = 0; - //Calculate Bn = Kn ^ E(Rn) - //Also, shift the 48-bit Expansion value forward towards position 0. - eVal_lo = (eVal_lo ^ pairK[k].lo) >> 16; - eVal_hi = eVal_hi ^ pairK[k].hi; - eVal_lo |= (eVal_hi << 16); - eVal_hi >>= 16; - - //Calculate Sn(Bn), which is stored in the upper 32-bits of the result. - for (i = 0, shift = 32; i < 8; i++, shift += 4) { - input_lo = sbox[7 - i][((eVal_lo & 0x20) | ((eVal_lo & 0x3F) >> 1 & 0xF) | ((eVal_lo & 0x3F) << 4 & 0x10))]; - //Shift to the next 6-bit B-block - eVal_lo = (eVal_lo >> 6) | (eVal_hi << 26); - eVal_hi >>= 6; - - input_hi = 0; - if ((shift << 26) >= 0) { //0 to 31-bit shift - if ((shift << 26) > 0) //Shift all bits right by shift (hi,lo >> shift) - key3 = (input_hi << shift) | (input_lo >> (-shift)); - else //0-bit shift, which should not happen. - key3 = input_hi << shift; - - key4 = input_lo << shift; - } else { //>31-bit shift - key3 = input_lo << shift; - key4 = 0; - } - - sVal_lo |= key4; - sVal_hi |= key3; - } - - //Phase 7 (Permutation with function P) - pVal_lo = 0; - pVal_hi = 0; - BitPerm_lo = 0x00000000; - BitPerm_hi = 0x80000000; - - //Calculate P(Sn(K ^ E(Rn))) - for (i = 0; i < 32; i++) { - shift = Permutation[i] - 1; - if ((shift << 26) >= 0) { //0 to 31-bit shift - if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key1 = BitMask_hi >> shift; - key2 = 0; - } - - //If bit (shift) is set, set the current bit. - if (((sVal_lo & key1) | (sVal_hi & key2)) != 0) { - pVal_lo |= BitPerm_lo; - pVal_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); - BitPerm_hi >>= 1; - } - - //0x00003bc4 - Rn' = Ln ^ f(Rn,Kn) - pPairR->lo = pairL[j].lo ^ pVal_lo; - pPairR->hi = pairL[j].hi ^ pVal_hi; - } - - //Phase 8 (Final Permutation) - output_lo = 0; - output_hi = 0; - BitMask_lo = BitPerm_lo = 0x00000000; - BitMask_hi = BitPerm_hi = 0x80000000; - //Retrieve preoutput blocks - //Ln and Rn lo do not contain anything, hence they are discarded. - input_lo = pairR[16].lo | (pairL[16].hi >> 0); - input_hi = pairR[16].hi | 0; - - //Subject the preoutput to the Final Permutation - for (i = 0; i < 64; i++) { - shift = FP[i] - 1; - if ((shift << 26) >= 0) { //0 to 31-bit shift - if ((shift << 26) > 0) //Shift all bits left by shift (hi,lo >> shift) - key1 = (BitMask_lo >> shift) | (BitMask_hi << (-shift)); - else //0-bit shift, which should not happen. - key1 = BitMask_lo >> shift; - - key2 = BitMask_hi >> shift; - } else { //>31-bit shift - key1 = BitMask_hi >> shift; - key2 = 0; - } - - //If bit (shift) is set, set the current bit. - if (((input_lo & key1) | (input_hi & key2)) != 0) { - output_lo |= BitPerm_lo; - output_hi |= BitPerm_hi; - } - - //Shift all bits left by 1 (hi,lo >> 1) - BitPerm_lo = (BitPerm_lo >> 1) | (BitPerm_hi << 31); - BitPerm_hi >>= 1; - } - - //Encrypted output - *(u32 *)password_out = output_lo; - *(u32 *)(password_out + 4) = output_hi; -} diff --git a/modules/hdd/libpfs/include/libpfs.h b/modules/hdd/libpfs/include/libpfs.h deleted file mode 100644 index 349390533..000000000 --- a/modules/hdd/libpfs/include/libpfs.h +++ /dev/null @@ -1,338 +0,0 @@ - -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -*/ - -#ifndef _LIBPFS_H -#define _LIBPFS_H - -// General constants -#define PFS_BLOCKSIZE 0x2000 -#define PFS_SUPER_MAGIC 0x50465300 // "PFS\0" aka Playstation Filesystem -#define PFS_JOUNRNAL_MAGIC 0x5046534C // "PFSL" aka PFS Log -#define PFS_SEGD_MAGIC 0x53454744 // "SEGD" aka segment descriptor direct -#define PFS_SEGI_MAGIC 0x53454749 // "SEGI" aka segment descriptor indirect -#define PFS_MAX_SUBPARTS 64 -#define PFS_NAME_LEN 255 -#define PFS_VERSION 4 - -// attribute flags -#define PFS_FIO_ATTR_READABLE 0x0001 -#define PFS_FIO_ATTR_WRITEABLE 0x0002 -#define PFS_FIO_ATTR_EXECUTABLE 0x0004 -#define PFS_FIO_ATTR_COPYPROTECT 0x0008 -#define PFS_FIO_ATTR_UNK0010 0x0010 -#define PFS_FIO_ATTR_SUBDIR 0x0020 -#define PFS_FIO_ATTR_UNK0040 0x0040 -#define PFS_FIO_ATTR_CLOSED 0x0080 -#define PFS_FIO_ATTR_UNK0100 0x0100 -#define PFS_FIO_ATTR_UNK0200 0x0200 -#define PFS_FIO_ATTR_UNK0400 0x0400 -#define PFS_FIO_ATTR_PDA 0x0800 -#define PFS_FIO_ATTR_PSX 0x1000 -#define PFS_FIO_ATTR_UNK2000 0x2000 -#define PFS_FIO_ATTR_HIDDEN 0x4000 - -// cache flags (status) -#define PFS_CACHE_FLAG_DIRTY 0x01 -#define PFS_CACHE_FLAG_NOLOAD 0x02 -#define PFS_CACHE_FLAG_MASKSTATUS 0x0F - -// cache flags (types) -#define PFS_CACHE_FLAG_NOTHING 0x00 -#define PFS_CACHE_FLAG_SEGD 0x10 -#define PFS_CACHE_FLAG_SEGI 0x20 -#define PFS_CACHE_FLAG_BITMAP 0x40 -#define PFS_CACHE_FLAG_MASKTYPE 0xF0 - -// fsck stats -#define PFS_FSCK_STAT_OK 0x00 -#define PFS_FSCK_STAT_WRITE_ERROR 0x01 -#define PFS_FSCK_STAT_ERRORS_FIXED 0x02 - -// odd and end -#define PFS_MODE_SET_FLAG 0x00 -#define PFS_MODE_REMOVE_FLAG 0x01 -#define PFS_MODE_CHECK_FLAG 0x02 - -// journal/log -typedef struct -{ - u32 magic; // =PFS_JOUNRNAL_MAGIC - u16 num; // - u16 checksum; // - struct - { - u32 sector; // block/sector for partition - u16 sub; // main(0)/sub(+1) partition - u16 logSector; // block/sector offset in journal area - } log[127]; -} pfs_journal_t; - -typedef struct -{ - u8 kLen; // key len/used for offset in to str for value - u8 vLen; // value len - u16 aLen; // allocated length == ((kLen+vLen+7) & ~3) - char str[3]; // size = 3 so sizeof pfs_aentry_t=7 :P -} pfs_aentry_t; - -typedef struct -{ - u32 inode; - u8 sub; - u8 pLen; // path length - u16 aLen; // allocated length == ((pLen+8+3) & ~3) - char path[512 - 8]; -} pfs_dentry_t; - -// Block number/count pair (used in inodes) -typedef struct -{ - u32 number; // - u16 subpart; // - u16 count; // -} pfs_blockinfo_t; - -// Date/time descriptor -typedef struct -{ - u8 unused; // - u8 sec; // - u8 min; // - u8 hour; // - u8 day; // - u8 month; // - u16 year; // -} pfs_datetime_t; - -// Superblock structure -typedef struct -{ - u32 magic; // - u32 version; // - u32 unknown1; // - u32 pfsFsckStat; // - u32 zone_size; // - u32 num_subs; // number of subs attached to filesystem - pfs_blockinfo_t log; // block info for metadata log - pfs_blockinfo_t root; // block info for root directory -} pfs_super_block_t; - -// Inode structure -typedef struct -{ - u32 checksum; // Sum of all other words in the inode - u32 magic; // - pfs_blockinfo_t inode_block; // start block of inode - pfs_blockinfo_t next_segment; // next segment descriptor inode - pfs_blockinfo_t last_segment; // last segment descriptor inode - pfs_blockinfo_t unused; // - pfs_blockinfo_t data[114]; // - u16 mode; // file mode - u16 attr; // file attributes - u16 uid; // - u16 gid; // - pfs_datetime_t atime; // - pfs_datetime_t ctime; // - pfs_datetime_t mtime; // - u64 size; // - u32 number_blocks; // number of blocks/zones used by file - u32 number_data; // number of used entries in data array - u32 number_segdesg; // number of "indirect blocks"/next segment descriptor's - u32 subpart; // subpart of inode - u32 reserved[4]; // -} pfs_inode_t; - -typedef struct -{ - char *devName; - int (*transfer)(int fd, void *buffer, /*u16*/ u32 sub, u32 sector, u32 size, u32 mode); - u32 (*getSubNumber)(int fd); - u32 (*getSize)(int fd, /*u16*/ u32 sub /*0=main 1+=subs*/); - void (*setPartitionError)(int fd); // set open partition as having an error - int (*flushCache)(int fd); -} pfs_block_device_t; - -typedef struct -{ - pfs_block_device_t *blockDev; // call table for hdd(hddCallTable) - int fd; // - u32 flags; // rename to attr ones checked - u32 total_sector; // number of sectors in the filesystem - u32 zfree; // zone free - u32 sector_scale; // - u32 inode_scale; // - u32 zsize; // zone size - u32 num_subs; // number of sub partitions in the filesystem - pfs_blockinfo_t root_dir; // block info for root directory - pfs_blockinfo_t log; // block info for the log - pfs_blockinfo_t current_dir; // block info for current directory - u32 lastError; // 0 if no error :) - u16 uid; // - u16 gid; // - u32 free_zone[65]; // free zones in each partition (1 main + 64 possible subs) -} pfs_mount_t; - -typedef struct pfs_cache_s -{ - struct pfs_cache_s *next; // - struct pfs_cache_s *prev; // - u16 flags; // - u16 nused; // - pfs_mount_t *pfsMount; // - u32 sub; // main(0)/sub(+1) partition - u32 sector; // block/sector for partition - union - { // - void *data; - pfs_inode_t *inode; - pfs_aentry_t *aentry; - pfs_dentry_t *dentry; - pfs_super_block_t *superblock; - u32 *bitmap; - } u; -} pfs_cache_t; - -typedef struct -{ - pfs_cache_t *inode; - u32 block_segment; // index into data array in inode structure for current zone segment - u32 block_offset; // block offset from start of current zone segment - u32 byte_offset; // byte offset into current zone -} pfs_blockpos_t; - -/////////////////////////////////////////////////////////////////////////////// -// Super Block functions - -#define PFS_SUPER_SECTOR 8192 -#define PFS_SUPER_BACKUP_SECTOR 8193 - -int pfsCheckZoneSize(u32 zone_size); -u32 pfsGetBitmapSizeSectors(int zoneScale, u32 partSize); -u32 pfsGetBitmapSizeBlocks(int scale, u32 mainsize); -int pfsFormatSub(pfs_block_device_t *blockDev, int fd, u32 sub, u32 reserved, u32 scale, u32 fragment); -int pfsFormat(pfs_block_device_t *blockDev, int fd, int zonesize, int fragment); -int pfsUpdateSuperBlock(pfs_mount_t *pfsMount, pfs_super_block_t *superblock, u32 sub); -int pfsMountSuperBlock(pfs_mount_t *pfsMount); - -/////////////////////////////////////////////////////////////////////////////// -// Cache functions - -void pfsCacheFree(pfs_cache_t *clink); -void pfsCacheLink(pfs_cache_t *clink, pfs_cache_t *cnew); -pfs_cache_t *pfsCacheUnLink(pfs_cache_t *clink); -pfs_cache_t *pfsCacheUsedAdd(pfs_cache_t *clink); -int pfsCacheTransfer(pfs_cache_t *clink, int mode); -void pfsCacheFlushAllDirty(pfs_mount_t *pfsMount); -pfs_cache_t *pfsCacheAlloc(pfs_mount_t *pfsMount, u16 sub, u32 scale, int flags, int *result); -pfs_cache_t *pfsCacheGetData(pfs_mount_t *pfsMount, u16 sub, u32 scale, int flags, int *result); -pfs_cache_t *pfsCacheAllocClean(int *result); -int pfsCacheIsFull(void); -int pfsCacheInit(u32 numBuf, u32 bufSize); -void pfsCacheClose(pfs_mount_t *pfsMount); -void pfsCacheMarkClean(pfs_mount_t *pfsMount, u32 subpart, u32 sectorStart, u32 sectorEnd); - -/////////////////////////////////////////////////////////////////////////////// -// Bitmap functions - -#define PFS_BITMAP_ALLOC 0 -#define PFS_BITMAP_FREE 1 - -typedef struct -{ - u32 chunk; - u32 index; - u32 bit; - u32 partitionChunks; - u32 partitionRemainder; -} pfs_bitmapInfo_t; - -void pfsBitmapSetupInfo(pfs_mount_t *pfsMount, pfs_bitmapInfo_t *info, u32 subpart, u32 number); -void pfsBitmapAllocFree(pfs_cache_t *clink, u32 operation, u32 subpart, u32 chunk, u32 index, u32 _bit, u32 count); -int pfsBitmapAllocateAdditionalZones(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 count); -int pfsBitmapAllocZones(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 amount); -int pfsBitmapSearchFreeZone(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 max_count); -void pfsBitmapFreeBlockSegment(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi); -int pfsBitmapCalcFreeZones(pfs_mount_t *pfsMount, int sub); -void pfsBitmapShow(pfs_mount_t *pfsMount); -void pfsBitmapFreeInodeBlocks(pfs_cache_t *clink); - -/////////////////////////////////////////////////////////////////////////////// -// Block functions - -int pfsBlockSeekNextSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos); -u32 pfsBlockSyncPos(pfs_blockpos_t *blockpos, u64 size); -int pfsBlockInitPos(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u64 position); -int pfsBlockExpandSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 count); -int pfsBlockAllocNewSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 blocks); -pfs_blockinfo_t *pfsBlockGetCurrent(pfs_blockpos_t *blockpos); -pfs_cache_t *pfsBlockGetNextSegment(pfs_cache_t *clink, int *result); -pfs_cache_t *pfsBlockGetLastSegmentDescriptorInode(pfs_cache_t *clink, int *result); - -/////////////////////////////////////////////////////////////////////////////// -// Directory-Entry (DEntry) inode functions - -pfs_cache_t *pfsGetDentry(pfs_cache_t *clink, char *path, pfs_dentry_t **dentry, u32 *size, int option); -int pfsGetNextDentry(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 *position, char *name, pfs_blockinfo_t *bi); -pfs_cache_t *pfsFillDentry(pfs_cache_t *clink, pfs_dentry_t *dentry, char *path1, pfs_blockinfo_t *bi, u32 len, u16 mode); -pfs_cache_t *pfsDirAddEntry(pfs_cache_t *dir, char *filename, pfs_blockinfo_t *bi, u16 mode, int *result); -pfs_cache_t *pfsDirRemoveEntry(pfs_cache_t *clink, char *path); -int pfsCheckDirForFiles(pfs_cache_t *clink); -void pfsFillSelfAndParentDentries(pfs_cache_t *clink, pfs_blockinfo_t *self, pfs_blockinfo_t *parent); -pfs_cache_t *pfsSetDentryParent(pfs_cache_t *clink, pfs_blockinfo_t *bi, int *result); -pfs_cache_t *pfsInodeGetFileInDir(pfs_cache_t *dirInode, char *path, int *result); -pfs_cache_t *pfsInodeGetFile(pfs_mount_t *pfsMount, pfs_cache_t *clink, const char *name, int *result); -void pfsInodeFill(pfs_cache_t *ci, pfs_blockinfo_t *bi, u16 mode, u16 uid, u16 gid); -int pfsInodeRemove(pfs_cache_t *parent, pfs_cache_t *inode, char *path); -pfs_cache_t *pfsInodeGetParent(pfs_mount_t *pfsMount, pfs_cache_t *clink, const char *filename, char *path, int *result); -pfs_cache_t *pfsInodeCreate(pfs_cache_t *clink, u16 mode, u16 uid, u16 gid, int *result); -int pfsCheckAccess(pfs_cache_t *clink, int flags); -char *pfsSplitPath(char *filename, char *path, int *result); -u16 pfsGetMaxIndex(pfs_mount_t *pfsMount); - -int pfsAllocZones(pfs_cache_t *clink, int msize, int mode); -void pfsFreeZones(pfs_cache_t *pfree); - -/////////////////////////////////////////////////////////////////////////////// -// Inode functions - -void pfsInodePrint(pfs_inode_t *inode); -int pfsInodeCheckSum(pfs_inode_t *inode); -void pfsInodeSetTime(pfs_cache_t *clink); -pfs_cache_t *pfsInodeGetData(pfs_mount_t *pfsMount, u16 sub, u32 inode, int *result); -int pfsInodeSync(pfs_blockpos_t *blockpos, u64 size, u32 used_segments); -pfs_cache_t *pfsGetDentriesChunk(pfs_blockpos_t *position, int *result); -pfs_cache_t *pfsGetDentriesAtPos(pfs_cache_t *clink, u64 position, int *offset, int *result); - -/////////////////////////////////////////////////////////////////////////////// -// Journal functions - -int pfsJournalChecksum(void *header); -void pfsJournalWrite(pfs_mount_t *pfsMount, pfs_cache_t *clink, u32 pfsCacheNumBuffers); -int pfsJournalReset(pfs_mount_t *pfsMount); -int pfsJournalFlush(pfs_mount_t *pfsMount); -int pfsJournalRestore(pfs_mount_t *pfsMount); -int pfsJournalResetThis(pfs_block_device_t *blockDev, int fd, u32 sector); - -/////////////////////////////////////////////////////////////////////////////// -// Function declerations - -int pfsFsckStat(pfs_mount_t *pfsMount, pfs_super_block_t *superblock, u32 stat, int mode); - -void *pfsAllocMem(int size); -void pfsFreeMem(void *buffer); -int pfsGetTime(pfs_datetime_t *tm); -void pfsPrintBitmap(const u32 *bitmap); - -pfs_block_device_t *pfsGetBlockDeviceTable(const char *name); -int pfsGetScale(int num, int size); -u32 pfsFixIndex(u32 index); - -#endif /* _LIBPFS_H */ diff --git a/modules/hdd/libpfs/src/bitmap.c b/modules/hdd/libpfs/src/bitmap.c deleted file mode 100644 index e9e3b20c3..000000000 --- a/modules/hdd/libpfs/src/bitmap.c +++ /dev/null @@ -1,356 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS bitmap manipulation routines -*/ - -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" - -extern u32 pfsMetaSize; -extern int pfsBlockSize; - -u32 pfsBitsPerBitmapChunk = 8192; // number of bitmap bits in each bitmap data chunk (1024 bytes) - -void pfsBitmapSetupInfo(pfs_mount_t *pfsMount, pfs_bitmapInfo_t *info, u32 subpart, u32 number) -{ - u32 size; - - size = pfsMount->blockDev->getSize(pfsMount->fd, subpart) >> pfsMount->sector_scale; - - info->chunk = number / pfsBitsPerBitmapChunk; - info->bit = number & 31; - info->index = (number % pfsBitsPerBitmapChunk) / 32; - info->partitionChunks = size / pfsBitsPerBitmapChunk; - info->partitionRemainder = size % pfsBitsPerBitmapChunk; -} - -// Allocates or frees (depending on operation) the bitmap area starting at chunk/index/bit, of size count -void pfsBitmapAllocFree(pfs_cache_t *clink, u32 operation, u32 subpart, u32 chunk, u32 index, u32 _bit, u32 count) -{ - int result; - u32 sector, bit; - - while (clink) { - for (; index < (pfsMetaSize / 4) && count; index++, _bit = 0) { - for (bit = _bit; bit < 32 && count; bit++, count--) { - if (operation == PFS_BITMAP_ALLOC) { - if (clink->u.bitmap[index] & (1 << bit)) - PFS_PRINTF(PFS_DRV_NAME ": Error: Tried to allocate used block!\n"); - - clink->u.bitmap[index] |= (1 << bit); - } else { - if ((clink->u.bitmap[index] & (1 << bit)) == 0) - PFS_PRINTF(PFS_DRV_NAME ": Error: Tried to free unused block!\n"); - - clink->u.bitmap[index] &= ~(1 << bit); - } - } - } - - index = 0; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(clink); - - if (count == 0) - break; - - chunk++; - - sector = (1 << clink->pfsMount->inode_scale) + chunk; - if (subpart == 0) - sector += 0x2000 >> pfsBlockSize; - - clink = pfsCacheGetData(clink->pfsMount, subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - } -} - -// Attempts to allocate 'count' more continuous zones for 'bi' -int pfsBitmapAllocateAdditionalZones(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 count) -{ - int result; - pfs_bitmapInfo_t info; - pfs_cache_t *c; - int res = 0; - - pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number + bi->count); - - // Make sure we're not trying to allocate more than is possible - if (65535 - bi->count < count) - count = 65535 - bi->count; - - // Loop over each bitmap chunk (each is 1024 bytes in size) until either we have allocated - // the requested amount of blocks, or until we have run out of space on the current partition - while ((((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks)) || - ((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1))) && - count) { - u32 sector = (1 << pfsMount->inode_scale) + info.chunk; - - // if main partition, add offset (in units of blocks) - if (bi->subpart == 0) - sector += 0x2000 >> pfsBlockSize; - - // Read the bitmap chunk from the hdd - c = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - if (c == 0) - break; - - // Loop over each 32-bit word in the current bitmap chunk until - // we find a used zone or we've allocated all the zones we need - while ((info.index < (info.chunk == info.partitionChunks ? info.partitionRemainder / 32 : pfsMetaSize / 4)) && count) { - // Loop over each of the 32 bits in the current word from the current bitmap chunk, - // trying to allocate the requested number of zones - for (; (info.bit < 32) && count; count--) { - // We only want to allocate a continuous area, so if we come - // accross a used zone bail - if (c->u.bitmap[info.index] & (1 << info.bit)) { - pfsCacheFree(c); - goto exit; - } - - // If the current bit in the bitmap is marked as free, mark it was used - res++; - c->u.bitmap[info.index] |= 1 << info.bit; - info.bit++; - c->flags |= PFS_CACHE_FLAG_DIRTY; - } - - info.index++; - info.bit = 0; - } - pfsCacheFree(c); - info.index = 0; - info.chunk++; - } -exit: - - // Adjust global free zone counts - pfsMount->free_zone[bi->subpart] -= res; - pfsMount->zfree -= res; - return res; -} - -// Searches for 'amount' free zones, starting from the position specified in 'bi'. -// Returns 1 if allocation was successful, otherwise 0. -int pfsBitmapAllocZones(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 amount) -{ - pfs_bitmapInfo_t info; - int result; - u32 startBit = 0, startPos = 0, startChunk = 0, count = 0; - u32 sector; - pfs_cache_t *bitmap; - u32 *bitmapEnd, *bitmapWord; - u32 i; - - pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number); - - for (; ((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks)) || - ((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1)); - info.chunk++) { - - sector = info.chunk + (1 << pfsMount->inode_scale); - if (bi->subpart == 0) - sector += 0x2000 >> pfsBlockSize; - - // read in the bitmap chunk - bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - if (bitmap == 0) - return 0; - - bitmapEnd = bitmap->u.bitmap + - (info.chunk == info.partitionChunks ? info.partitionRemainder / 32 : pfsMetaSize / 4); - - for (bitmapWord = bitmap->u.bitmap + info.index; bitmapWord < bitmapEnd; info.bit = 0, bitmapWord++) { - for (i = info.bit; i < 32; i++) { - // if this bit is marked as free.. - if (((*bitmapWord >> i) & 1) == 0) { - if (count == 0) { - startBit = i; - startChunk = info.chunk; - startPos = bitmapWord - bitmap->u.bitmap; - } - if (++count == amount) { - bi->number = (startPos * 32) + (startChunk * pfsBitsPerBitmapChunk) + startBit; - if (count < bi->count) - bi->count = count; - - if (bitmap->sector != (startChunk + (1 << pfsMount->inode_scale))) { - pfsCacheFree(bitmap); - sector = (1 << pfsMount->inode_scale) + startChunk; - if (bi->subpart == 0) - sector += 0x2000 >> pfsBlockSize; - - bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result); - } - - pfsBitmapAllocFree(bitmap, PFS_BITMAP_ALLOC, bi->subpart, startChunk, startPos, startBit, bi->count); - return 1; - } - } else - count = 0; - } - } - pfsCacheFree(bitmap); - info.index = 0; - } - return 0; -} - -// Searches for 'max_count' free zones over all the partitions, and -// allocates them. Returns 0 on success, -ENOSPC if the zones could -// not be allocated. -int pfsBitmapSearchFreeZone(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi, u32 max_count) -{ - u32 num, count, n; - - num = pfsMount->num_subs + 1; - - if (bi->subpart > pfsMount->num_subs) - bi->subpart = 0; - if (bi->number) - num = pfsMount->num_subs + 2; - - count = max_count < 33 ? max_count : 32; //min(max_count, 32) - count = count < bi->count ? bi->count : count; //max(count, bi->count) - // => count = bound(bi->count, 32); - for (; num >= 0; num--) { - for (n = count; n; n /= 2) { - if ((pfsMount->free_zone[bi->subpart] >= n) && - pfsBitmapAllocZones(pfsMount, bi, n)) { - pfsMount->free_zone[bi->subpart] -= bi->count; - pfsMount->zfree -= bi->count; - return 0; // the good exit ;) - } - } - - bi->number = 0; - bi->subpart++; - - if (bi->subpart == pfsMount->num_subs + 1) - bi->subpart = 0; - } - return -ENOSPC; -} - -// De-allocates the block segment 'bi' in the bitmaps -void pfsBitmapFreeBlockSegment(pfs_mount_t *pfsMount, pfs_blockinfo_t *bi) -{ - pfs_bitmapInfo_t info; - pfs_cache_t *clink; - u32 sector; - int rv; - - pfsBitmapSetupInfo(pfsMount, &info, bi->subpart, bi->number); - - sector = (1 << pfsMount->inode_scale) + info.chunk; - if (bi->subpart == 0) - sector += 0x2000 >> pfsBlockSize; - - if ((clink = pfsCacheGetData(pfsMount, (u16)bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &rv)) != NULL) { - pfsBitmapAllocFree(clink, PFS_BITMAP_FREE, bi->subpart, info.chunk, info.index, info.bit, bi->count); - pfsMount->free_zone[(u16)bi->subpart] += bi->count; - pfsMount->zfree += bi->count; - } -} - -// Returns the number of free zones for the partition 'sub' -int pfsBitmapCalcFreeZones(pfs_mount_t *pfsMount, int sub) -{ - // "Free zone" map. Used to get number of free zone in bitmap, 4-bits at a time - u32 pfsFreeZoneBitmap[16] = {4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; - int result; - pfs_bitmapInfo_t info; - pfs_cache_t *clink; - u32 i, bitmapSize, zoneFree = 0, sector; - - pfsBitmapSetupInfo(pfsMount, &info, sub, 0); - - while (((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1)) || - ((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks))) { - bitmapSize = info.chunk == info.partitionChunks ? info.partitionRemainder >> 3 : pfsMetaSize; - - sector = (1 << pfsMount->inode_scale) + info.chunk; - if (sub == 0) - sector += 0x2000 >> pfsBlockSize; - - if ((clink = pfsCacheGetData(pfsMount, sub, sector, PFS_CACHE_FLAG_BITMAP, &result))) { - for (i = 0; i < bitmapSize; i++) { - zoneFree += pfsFreeZoneBitmap[((u8 *)clink->u.bitmap)[i] & 0xF] + pfsFreeZoneBitmap[((u8 *)clink->u.bitmap)[i] >> 4]; - } - - pfsCacheFree(clink); - } - info.chunk++; - } - - return zoneFree; -} - -// Debugging function, prints bitmap information -void pfsBitmapShow(pfs_mount_t *pfsMount) -{ - int result; - pfs_bitmapInfo_t info; - u32 pn, bitcnt; - - for (pn = 0; pn < pfsMount->num_subs + 1; pn++) { - bitcnt = pfsBitsPerBitmapChunk; - pfsBitmapSetupInfo(pfsMount, &info, pn, 0); - - while (((info.partitionRemainder != 0) && (info.chunk < info.partitionChunks + 1)) || - ((info.partitionRemainder == 0) && (info.chunk < info.partitionChunks))) { - pfs_cache_t *clink; - u32 sector = (1 << pfsMount->inode_scale) + info.chunk; - u32 i; - - if (pn == 0) - sector += 0x2000 >> pfsBlockSize; - clink = pfsCacheGetData(pfsMount, pn, sector, PFS_CACHE_FLAG_BITMAP, &result); - - if (info.chunk == info.partitionChunks) - bitcnt = info.partitionRemainder; - - PFS_PRINTF(PFS_DRV_NAME ": Zone show: pn %ld, bn %ld, bitcnt %ld\n", pn, info.chunk, bitcnt); - - for (i = 0; (i < (1 << pfsBlockSize)) && ((i * 512) < (bitcnt / 8)); i++) - pfsPrintBitmap(clink->u.bitmap + 128 * i); - - pfsCacheFree(clink); - info.chunk++; - } - } -} - -// Free's all blocks allocated to an inode -void pfsBitmapFreeInodeBlocks(pfs_cache_t *clink) -{ - pfs_mount_t *pfsMount = clink->pfsMount; - u32 i; - - pfsCacheUsedAdd(clink); - for (i = 0; i < clink->u.inode->number_data; i++) { - u32 index = pfsFixIndex(i); - pfs_blockinfo_t *bi = &clink->u.inode->data[index]; - int err; - - if (i != 0) { - if (index == 0) - if ((clink = pfsBlockGetNextSegment(clink, &err)) == NULL) - return; - } - - pfsBitmapFreeBlockSegment(pfsMount, bi); - pfsCacheMarkClean(pfsMount, (u16)bi->subpart, bi->number << pfsMount->inode_scale, - (bi->number + bi->count) << pfsMount->inode_scale); - } - pfsCacheFree(clink); -} diff --git a/modules/hdd/libpfs/src/block.c b/modules/hdd/libpfs/src/block.c deleted file mode 100644 index 7e8e367df..000000000 --- a/modules/hdd/libpfs/src/block.c +++ /dev/null @@ -1,91 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS block/zone related routines -*/ - -#include -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" - -// Returns the next block descriptor inode -pfs_cache_t *pfsBlockGetNextSegment(pfs_cache_t *clink, int *result) -{ - pfsCacheFree(clink); - - if (clink->u.inode->next_segment.number) - return pfsCacheGetData(clink->pfsMount, - clink->u.inode->next_segment.subpart, - clink->u.inode->next_segment.number << clink->pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGI, result); - - PFS_PRINTF(PFS_DRV_NAME ": Error: There is no next segment descriptor\n"); - *result = -EINVAL; - return NULL; -} - -// Sets 'blockpos' to point to the next block segment for the inode (and moves onto the -// next block descriptor inode if necessary) -int pfsBlockSeekNextSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos) -{ - pfs_cache_t *nextSegment; - int result = 0; - - if (blockpos->byte_offset) { - PFS_PRINTF(PFS_DRV_NAME ": Panic: This is a bug!\n"); - return -1; - } - - // If we're at the end of the block descriptor array for the current - // inode, then move onto the next inode - if (pfsFixIndex(blockpos->block_segment + 1) == 0) { - if ((nextSegment = pfsBlockGetNextSegment(pfsCacheUsedAdd(blockpos->inode), &result)) == NULL) - return result; - pfsCacheFree(blockpos->inode); - blockpos->inode = nextSegment; - if (clink->u.inode->number_data - 1 == ++blockpos->block_segment) - return -EINVAL; - } - - blockpos->block_offset = 0; - blockpos->block_segment++; - return result; -} - -u32 pfsBlockSyncPos(pfs_blockpos_t *blockpos, u64 size) -{ - u32 i; - - i = (u32)(size / blockpos->inode->pfsMount->zsize); - blockpos->byte_offset += size % blockpos->inode->pfsMount->zsize; - - if (blockpos->byte_offset >= blockpos->inode->pfsMount->zsize) { - blockpos->byte_offset -= blockpos->inode->pfsMount->zsize; - i++; - } - return i; -} - -int pfsBlockInitPos(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u64 position) -{ - blockpos->inode = pfsCacheUsedAdd(clink); - blockpos->byte_offset = 0; - - if (clink->u.inode->size) { - blockpos->block_segment = 1; - blockpos->block_offset = 0; - } else { - blockpos->block_segment = 0; - blockpos->block_offset = 1; - } - return pfsInodeSync(blockpos, position, clink->u.inode->number_data); -} diff --git a/modules/hdd/libpfs/src/blockWrite.c b/modules/hdd/libpfs/src/blockWrite.c deleted file mode 100644 index ca63314e9..000000000 --- a/modules/hdd/libpfs/src/blockWrite.c +++ /dev/null @@ -1,141 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS block/zone (write) related routines -*/ - -#include -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" - -// Attempt to expand the block segment 'blockpos' by 'count' blocks -int pfsBlockExpandSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 count) -{ - int ret; - pfs_blockinfo_t *bi; - - if (pfsFixIndex(blockpos->block_segment) == 0) - return 0; - - bi = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; - - if ((ret = pfsBitmapAllocateAdditionalZones(clink->pfsMount, bi, count))) { - bi->count += ret; - clink->u.inode->number_blocks += ret; - blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - } - - return ret; -} - -// Attempts to allocate 'blocks' new blocks for an inode -int pfsBlockAllocNewSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 blocks) -{ - pfs_blockinfo_t bi, *bi2; - int result = 0; - pfs_mount_t *pfsMount = clink->pfsMount; - u32 i, old_blocks = blocks; - - if (pfsCacheIsFull()) - return -ENOMEM; - - // create "indirect segment descriptor" if necessary - if (pfsFixIndex(clink->u.inode->number_data) == 0) { - pfs_cache_t *clink2; - - bi2 = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; - bi.subpart = bi2->subpart; - bi.count = 1; - bi.number = bi2->number + bi2->count; - result = pfsBitmapSearchFreeZone(pfsMount, &bi, clink->u.inode->number_blocks); - if (result < 0) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Couldnt allocate zone! (1)\n"); - return result; - } - - clink2 = pfsCacheGetData(pfsMount, bi.subpart, bi.number << pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGI | PFS_CACHE_FLAG_NOLOAD, &result); - memset(clink2->u.inode, 0, sizeof(pfs_inode_t)); - clink2->u.inode->magic = PFS_SEGI_MAGIC; - - memcpy(&clink2->u.inode->inode_block, &clink->u.inode->inode_block, sizeof(pfs_blockinfo_t)); - memcpy(&clink2->u.inode->last_segment, blockpos->inode->u.inode->data, sizeof(pfs_blockinfo_t)); - memcpy(clink2->u.inode->data, &bi, sizeof(pfs_blockinfo_t)); - - clink2->flags |= PFS_CACHE_FLAG_DIRTY; - - clink->u.inode->number_blocks += bi.count; - clink->u.inode->number_data++; - - memcpy(&clink->u.inode->last_segment, &bi, sizeof(pfs_blockinfo_t)); - - clink->u.inode->number_segdesg++; - - clink->flags |= PFS_CACHE_FLAG_DIRTY; - blockpos->block_segment++; - blockpos->block_offset = 0; - - memcpy(&blockpos->inode->u.inode->next_segment, &bi, sizeof(pfs_blockinfo_t)); - - blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(blockpos->inode); - blockpos->inode = clink2; - } - - bi2 = &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; - bi.subpart = bi2->subpart; - bi.count = blocks; - bi.number = bi2->number + bi2->count; - - result = pfsBitmapSearchFreeZone(pfsMount, &bi, clink->u.inode->number_blocks); - if (result < 0) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Couldnt allocate zone! (2)\n"); - return result; - } - - clink->u.inode->number_blocks += bi.count; - clink->u.inode->number_data++; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - blockpos->block_offset = 0; - blockpos->block_segment++; - - i = pfsFixIndex(clink->u.inode->number_data - 1); - memcpy(&blockpos->inode->u.inode->data[i], &bi, sizeof(pfs_blockinfo_t)); - - blockpos->inode->flags |= PFS_CACHE_FLAG_DIRTY; - blocks -= bi.count; - if (blocks) - blocks -= pfsBlockExpandSegment(clink, blockpos, blocks); - - return old_blocks - blocks; -} - -// Returns the block info for the block segment corresponding to the -// files current position. -pfs_blockinfo_t *pfsBlockGetCurrent(pfs_blockpos_t *blockpos) -{ - return &blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)]; -} - -pfs_cache_t *pfsBlockGetLastSegmentDescriptorInode(pfs_cache_t *clink, int *result) -{ - return pfsCacheGetData(clink->pfsMount, clink->u.inode->last_segment.subpart, - clink->u.inode->last_segment.number << clink->pfsMount->inode_scale, - (clink->u.inode->last_segment.subpart == - clink->u.inode->inode_block.subpart) && - (clink->u.inode->last_segment.number == - clink->u.inode->inode_block.number) ? - 16 : - 32, - result); -} diff --git a/modules/hdd/libpfs/src/cache.c b/modules/hdd/libpfs/src/cache.c deleted file mode 100644 index 403d10f1e..000000000 --- a/modules/hdd/libpfs/src/cache.c +++ /dev/null @@ -1,252 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS metadata cache manipulation routines -*/ - -#include -#include -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" - -extern int pfsBlockSize; - -pfs_cache_t *pfsCacheBuf; -u32 pfsCacheNumBuffers; - -void pfsCacheFree(pfs_cache_t *clink) -{ - if (clink == NULL) { - PFS_PRINTF(PFS_DRV_NAME ": Warning: NULL buffer returned\n"); - return; - } - - if (clink->nused == 0) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Unused cache returned\n"); - return; - } - - clink->nused--; - if (clink->pfsMount != NULL) { - if (clink->nused != 0) - return; - pfsCacheLink(pfsCacheBuf->prev, clink); - return; - } - if (clink->nused != 0) { - PFS_PRINTF(PFS_DRV_NAME ": Warning: Invalidated buffer is in use\n"); - return; - } - pfsCacheLink(pfsCacheBuf, clink); -} - -void pfsCacheLink(pfs_cache_t *clink, pfs_cache_t *cnew) -{ - cnew->prev = clink; - cnew->next = clink->next; - clink->next->prev = cnew; - clink->next = cnew; -} - -pfs_cache_t *pfsCacheUnLink(pfs_cache_t *clink) -{ - clink->prev->next = clink->next; - clink->next->prev = clink->prev; - return clink; -} - -pfs_cache_t *pfsCacheUsedAdd(pfs_cache_t *clink) -{ - clink->nused++; - return clink; -} - -int pfsCacheTransfer(pfs_cache_t *clink, int mode) -{ - pfs_mount_t *pfsMount = clink->pfsMount; - int err; - - if (pfsMount->lastError == 0) { // no error - if ((err = pfsMount->blockDev->transfer(pfsMount->fd, clink->u.inode, clink->sub, - clink->sector << pfsBlockSize, 1 << pfsBlockSize, mode)) == 0) { - if (mode == PFS_IO_MODE_READ) { - if (clink->flags & PFS_CACHE_FLAG_SEGD && ((pfs_inode_t *)clink->u.inode)->magic != PFS_SEGD_MAGIC) - err = -EIO; - if (clink->flags & PFS_CACHE_FLAG_SEGI && ((pfs_inode_t *)clink->u.inode)->magic != PFS_SEGI_MAGIC) - err = -EIO; - if (clink->flags & (PFS_CACHE_FLAG_SEGD | PFS_CACHE_FLAG_SEGI)) { - if (((pfs_inode_t *)clink->u.inode)->checksum != pfsInodeCheckSum(clink->u.inode)) - err = -EIO; - } - } - } - if (err != 0) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Disk error partition %ld, block %ld, err %d\n", - clink->sub, clink->sector, err); -#ifndef PFS_NO_WRITE_ERROR_STAT - pfsMount->blockDev->setPartitionError(pfsMount->fd); - pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_WRITE_ERROR, PFS_MODE_SET_FLAG); - pfsMount->lastError = err; -#endif - } - } - clink->flags &= ~PFS_CACHE_FLAG_DIRTY; // clear dirty :) - return pfsMount->lastError; -} - -void pfsCacheFlushAllDirty(pfs_mount_t *pfsMount) -{ - u32 i; - int found = 0; - - for (i = 1; i < pfsCacheNumBuffers + 1; i++) { - if (pfsCacheBuf[i].pfsMount == pfsMount && - pfsCacheBuf[i].flags & PFS_CACHE_FLAG_DIRTY) - found = 1; - } - if (found) { - pfsJournalWrite(pfsMount, pfsCacheBuf + 1, pfsCacheNumBuffers); - for (i = 1; i < pfsCacheNumBuffers + 1; i++) { - if (pfsCacheBuf[i].pfsMount == pfsMount && - pfsCacheBuf[i].flags & PFS_CACHE_FLAG_DIRTY) - pfsCacheTransfer(&pfsCacheBuf[i], 1); - } - } - - pfsJournalReset(pfsMount); -} - -pfs_cache_t *pfsCacheAlloc(pfs_mount_t *pfsMount, u16 sub, u32 scale, - int flags, int *result) -{ - pfs_cache_t *allocated; - - if (pfsCacheBuf->prev == pfsCacheBuf && pfsCacheBuf->prev->next == pfsCacheBuf->prev) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Free buffer list is empty\n"); - *result = -ENOMEM; - return NULL; - } - allocated = pfsCacheBuf->next; - if (pfsCacheBuf->next == NULL) - PFS_PRINTF(PFS_DRV_NAME ": Panic: Null pointer allocated\n"); - if (allocated->pfsMount && (allocated->flags & PFS_CACHE_FLAG_DIRTY)) - pfsCacheFlushAllDirty(allocated->pfsMount); - allocated->flags = flags & PFS_CACHE_FLAG_MASKTYPE; - allocated->pfsMount = pfsMount; - allocated->sub = sub; - allocated->sector = scale; - allocated->nused = 1; - return pfsCacheUnLink(allocated); -} - -pfs_cache_t *pfsCacheGetData(pfs_mount_t *pfsMount, u16 sub, u32 sector, - int flags, int *result) -{ - u32 i; - pfs_cache_t *clink; - - *result = 0; - - for (i = 1; i < pfsCacheNumBuffers + 1; i++) - if (pfsCacheBuf[i].pfsMount && - (pfsCacheBuf[i].pfsMount == pfsMount) && - (pfsCacheBuf[i].sector == sector)) - if (pfsCacheBuf[i].sub == sub) { - pfsCacheBuf[i].flags &= PFS_CACHE_FLAG_MASKSTATUS; - pfsCacheBuf[i].flags |= flags & PFS_CACHE_FLAG_MASKTYPE; - if (pfsCacheBuf[i].nused == 0) - pfsCacheUnLink(&pfsCacheBuf[i]); - pfsCacheBuf[i].nused++; - return &pfsCacheBuf[i]; - } - - clink = pfsCacheAlloc(pfsMount, sub, sector, flags, result); - - if (clink) { - if (flags & PFS_CACHE_FLAG_NOLOAD) - return clink; - - if ((*result = pfsCacheTransfer(clink, PFS_IO_MODE_READ)) >= 0) - return clink; - - clink->pfsMount = NULL; - pfsCacheFree(clink); - } - return NULL; -} - -pfs_cache_t *pfsCacheAllocClean(int *result) -{ - *result = 0; - return pfsCacheAlloc(NULL, 0, 0, 0, result); -} - -// checks if the pfsCacheBuf list has some room -int pfsCacheIsFull(void) -{ - if (pfsCacheBuf->prev != pfsCacheBuf) - return 0; - return pfsCacheBuf->prev->next == pfsCacheBuf->prev; -} - -int pfsCacheInit(u32 numBuf, u32 bufSize) -{ - char *cacheData; - u32 i; - - if (numBuf > 127) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Number of buffers larger than 127.\n"); - return -EINVAL; - } - - cacheData = pfsAllocMem(numBuf * bufSize); - - if (!cacheData || !(pfsCacheBuf = pfsAllocMem((numBuf + 1) * sizeof(pfs_cache_t)))) - return -ENOMEM; - - pfsCacheNumBuffers = numBuf; - memset(pfsCacheBuf, 0, (numBuf + 1) * sizeof(pfs_cache_t)); - - pfsCacheBuf->next = pfsCacheBuf; - pfsCacheBuf->prev = pfsCacheBuf; - - for (i = 1; i < numBuf + 1; i++) { - pfsCacheBuf[i].u.data = cacheData; - pfsCacheLink(pfsCacheBuf->prev, &pfsCacheBuf[i]); - cacheData += bufSize; - } - - return 0; -} - -void pfsCacheClose(pfs_mount_t *pfsMount) -{ - unsigned int i; - - pfsCacheFlushAllDirty(pfsMount); - for (i = 1; i < pfsCacheNumBuffers + 1; i++) { - if (pfsCacheBuf[i].pfsMount == pfsMount) - pfsCacheBuf[i].pfsMount = NULL; - } -} - -void pfsCacheMarkClean(pfs_mount_t *pfsMount, u32 subpart, u32 sectorStart, u32 sectorEnd) -{ - u32 i; - - for (i = 1; i < pfsCacheNumBuffers + 1; i++) { - if (pfsCacheBuf[i].pfsMount == pfsMount && pfsCacheBuf[i].sub == subpart) { - if (pfsCacheBuf[i].sector >= sectorStart && pfsCacheBuf[i].sector < sectorEnd) - pfsCacheBuf[i].flags &= ~PFS_CACHE_FLAG_DIRTY; - } - } -} diff --git a/modules/hdd/libpfs/src/dir.c b/modules/hdd/libpfs/src/dir.c deleted file mode 100644 index 6eb7d80ed..000000000 --- a/modules/hdd/libpfs/src/dir.c +++ /dev/null @@ -1,682 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS directory parsing routines -*/ - -#include -#include -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" - -extern u32 pfsMetaSize; - -// Gets a dir entry from the inode specified by clink -pfs_cache_t *pfsGetDentry(pfs_cache_t *clink, char *path, pfs_dentry_t **dentry, u32 *size, int option) -{ - pfs_blockpos_t block_pos; - pfs_dentry_t *d; - u16 aLen; - pfs_dentry_t *d2; - pfs_cache_t *dentCache; - u32 new_dentryLen = 0, dentryLen; - int len = 0, result; - - if (path) { - len = strlen(path); - new_dentryLen = (len + 8 + 3) & ~3; - } - *size = 0; - - block_pos.inode = pfsCacheUsedAdd(clink); - block_pos.block_segment = 1; - block_pos.block_offset = 0; - block_pos.byte_offset = 0; - dentCache = pfsGetDentriesChunk(&block_pos, &result); - - if (dentCache != NULL) { - d2 = d = dentCache->u.dentry; - while (*size < clink->u.inode->size) { - // Read another dentry chunk if we need to - if (d2 >= (pfs_dentry_t *)((u8 *)dentCache->u.inode + pfsMetaSize)) { - if (pfsInodeSync(&block_pos, pfsMetaSize, clink->u.inode->number_data)) - break; - pfsCacheFree(dentCache); - - if ((dentCache = pfsGetDentriesChunk(&block_pos, &result)) == 0) - break; - d = dentCache->u.dentry; - } - - for (d2 = (pfs_dentry_t *)((int)d + 512); d < d2; d = (pfs_dentry_t *)((int)d + aLen)) { - aLen = (d->aLen & 0xFFF); - - if (aLen & 3) { - PFS_PRINTF(PFS_DRV_NAME ": Error: dir-entry allocated length/4 != 0\n"); - goto _exit; - } - dentryLen = (d->pLen + 8 + 3) & 0x1FC; - if (aLen < dentryLen) { - PFS_PRINTF(PFS_DRV_NAME ": Error: dir-entry is too small\n"); - goto _exit; - } - if (d2 < (pfs_dentry_t *)((u8 *)d + aLen)) { - PFS_PRINTF(PFS_DRV_NAME ": Error: dir-entry across sectors\n"); - goto _exit; - } - - // decide if the current dentry meets the required criteria, based on 'option' - switch (option) { - case 0: // result = 1 when paths are equal - result = (len == d->pLen) && (memcmp(path, d->path, d->pLen) == 0); - break; - case 1: // result = 1 when either there is no inode or if there is enough space remaining in the inode. - result = ((d->inode) || (aLen < new_dentryLen)) ? (aLen - dentryLen >= new_dentryLen) : 1; - break; - case 2: // result = 1 when dir path is not empty, "." or ".." - result = d->pLen && strcmp(d->path, ".") && strcmp(d->path, ".."); - break; - default: - goto _exit; - } - - if (result) { - *dentry = d; - pfsCacheFree(block_pos.inode); - return dentCache; - } - *size += aLen; - } - } - _exit: - pfsCacheFree(dentCache); - } - pfsCacheFree(block_pos.inode); - return NULL; -} - -int pfsGetNextDentry(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u32 *position, char *name, pfs_blockinfo_t *bi) -{ - int result; - pfs_cache_t *dcache; - pfs_dentry_t *dentry; - u32 len = 0; - - // loop until a non-empty entry is found or until the end of the dentry chunk is reached - while ((len == 0) && (*position < clink->u.inode->size)) { - - if (!(dcache = pfsGetDentriesChunk(blockpos, &result))) { - PFS_PRINTF(PFS_DRV_NAME ": couldnt get dentries chunk for dread!\n"); - break; - } - - dentry = (pfs_dentry_t *)((u8 *)dcache->u.data + (blockpos->byte_offset % pfsMetaSize)); - - len = dentry->pLen; - memcpy(name, dentry->path, len); - name[len] = '\0'; - - bi->subpart = dentry->sub; - bi->number = dentry->inode; - pfsCacheFree(dcache); - - *position += dentry->aLen & 0xFFF; - - // update blockpos - if (pfsInodeSync(blockpos, dentry->aLen & 0xFFF, clink->u.inode->number_data)) - break; - } - - return len; -} - -pfs_cache_t *pfsFillDentry(pfs_cache_t *clink, pfs_dentry_t *dentry, char *path1, pfs_blockinfo_t *bi, u32 len, u16 mode) -{ - dentry->inode = bi->number; - dentry->sub = (u8)bi->subpart; - dentry->pLen = strlen(path1); - dentry->aLen = len | (mode & FIO_S_IFMT); - memcpy(dentry->path, path1, dentry->pLen & 0xFF); - - return clink; -} - -pfs_cache_t *pfsDirAddEntry(pfs_cache_t *dir, char *filename, pfs_blockinfo_t *bi, u16 mode, int *result) -{ - pfs_dentry_t *dentry; - u32 size; - u32 len; - pfs_cache_t *dcache; - - dcache = pfsGetDentry(dir, filename, &dentry, &size, 1); - if (dcache) { - len = dentry->aLen & 0xFFF; - if (dentry->pLen) - len -= (dentry->pLen + 11) & 0x1FC; - dentry->aLen = (dentry->aLen & FIO_S_IFMT) | ((dentry->aLen & 0xFFF) - len); - dentry = (pfs_dentry_t *)((u8 *)dentry + (dentry->aLen & 0xFFF)); - } else { - int offset; - - if ((*result = pfsAllocZones(dir, sizeof(pfs_dentry_t), 0)) < 0) - return NULL; - dcache = pfsGetDentriesAtPos(dir, dir->u.inode->size, &offset, result); - if (dcache == NULL) - return NULL; - - dir->u.inode->size += sizeof(pfs_dentry_t); - - dentry = (pfs_dentry_t *)((u8 *)dcache->u.dentry + offset); - len = sizeof(pfs_dentry_t); - } - return pfsFillDentry(dcache, dentry, filename, bi, len, mode); -} - -pfs_cache_t *pfsDirRemoveEntry(pfs_cache_t *clink, char *path) -{ - pfs_dentry_t *dentry; - u32 size; - u16 aLen; - int i = 0, val; - pfs_dentry_t *dlast = NULL, *dnext; - pfs_cache_t *c; - - if ((c = pfsGetDentry(clink, path, &dentry, &size, 0))) { - val = (int)dentry - (int)c->u.dentry; - if (val < 0) - val += 511; - val /= 512; - val *= 512; - dnext = (pfs_dentry_t *)((int)c->u.dentry + val); - do { - aLen = dnext->aLen & 0xFFF; - - if (dnext == dentry) { - if (dlast) - dlast->aLen = (dlast->aLen & FIO_S_IFMT) | ((dlast->aLen & 0xFFF) + aLen); - else { - dnext->pLen = dnext->inode = 0; - - if (size + aLen >= clink->u.inode->size) - clink->u.inode->size -= aLen; - } - return c; - } - i += aLen; - dlast = dnext; - dnext = (pfs_dentry_t *)((u8 *)dnext + aLen); - } while (i < 512); - } - return NULL; -} - -int pfsCheckDirForFiles(pfs_cache_t *clink) -{ - pfs_dentry_t *dentry; - pfs_cache_t *dcache; - u32 size; - - if ((dcache = pfsGetDentry(clink, NULL, &dentry, &size, 2))) { - pfsCacheFree(dcache); - return 0; - } - return 1; -} - -void pfsFillSelfAndParentDentries(pfs_cache_t *clink, pfs_blockinfo_t *self, pfs_blockinfo_t *parent) -{ - pfs_dentry_t *dentry = clink->u.dentry; - - memset(dentry, 0, pfsMetaSize); - dentry->inode = self->number; - dentry->path[0] = '.'; - dentry->path[1] = '\0'; - dentry->sub = (u8)self->subpart; - dentry->pLen = 1; - dentry->aLen = 12 | FIO_S_IFDIR; - - dentry = (pfs_dentry_t *)((u8 *)dentry + 12); - - dentry->inode = parent->number; - dentry->path[0] = '.'; - dentry->path[1] = '.'; - dentry->path[2] = '\0'; - dentry->sub = (u8)parent->subpart; - dentry->pLen = 2; - dentry->aLen = 500 | FIO_S_IFDIR; -} - -pfs_cache_t *pfsSetDentryParent(pfs_cache_t *clink, pfs_blockinfo_t *bi, int *result) -{ - int offset; - pfs_cache_t *dcache; - - dcache = pfsGetDentriesAtPos(clink, 0, &offset, result); - if (dcache) { - pfs_dentry_t *d = (pfs_dentry_t *)(12 + (u8 *)dcache->u.data); - d->inode = bi->number; - d->sub = (u8)bi->subpart; - } - return dcache; -} - -// Returns the cached inode for the file (dir) in the directory pointed -// to by the dir inode. -pfs_cache_t *pfsInodeGetFileInDir(pfs_cache_t *dirInode, char *path, int *result) -{ - pfs_dentry_t *dentry; - u32 size; - pfs_cache_t *clink; - - if (path[0] == 0) - return pfsCacheUsedAdd(dirInode); - - // If we're in the root dir, don't do anything for ".." - if ((dirInode->sector == - dirInode->pfsMount->root_dir.number << dirInode->pfsMount->inode_scale) && - (dirInode->sub == dirInode->pfsMount->root_dir.subpart) && - (strcmp(path, "..") == 0)) - return pfsCacheUsedAdd(dirInode); - - if ((*result = pfsCheckAccess(dirInode, 1)) < 0) - return NULL; - - // Get dentry of file/dir specified by path from the dir pointed to - // by the inode (dirInode). Then return the cached inode for that dentry. - if ((clink = pfsGetDentry(dirInode, path, &dentry, &size, 0))) { - pfsCacheFree(clink); - return pfsInodeGetData(dirInode->pfsMount, - dentry->sub, dentry->inode, result); - } - - *result = -ENOENT; - return NULL; -} - -pfs_cache_t *pfsInodeGetFile(pfs_mount_t *pfsMount, pfs_cache_t *clink, - const char *name, int *result) -{ - char path[256]; - pfs_cache_t *c; - - c = pfsInodeGetParent(pfsMount, clink, name, path, result); - if (c) { - c = pfsInodeGetFileInDir(c, path, result); - pfsCacheFree(c); - return c; - } - return NULL; -} - -void pfsInodeFill(pfs_cache_t *ci, pfs_blockinfo_t *bi, u16 mode, u16 uid, u16 gid) -{ - u32 val; - - memset(ci->u.inode, 0, pfsMetaSize); - - ci->u.inode->magic = PFS_SEGD_MAGIC; - - ci->u.inode->inode_block.number = bi->number; - ci->u.inode->inode_block.subpart = bi->subpart; - ci->u.inode->inode_block.count = bi->count; - - ci->u.inode->last_segment.number = bi->number; - ci->u.inode->last_segment.subpart = bi->subpart; - ci->u.inode->last_segment.count = bi->count; - - ci->u.inode->mode = mode; - ci->u.inode->uid = uid; - ci->u.inode->gid = gid; - - if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) { - ci->u.inode->attr = 0xA0; - ci->u.inode->size = sizeof(pfs_dentry_t); - val = 2; - } else { - ci->u.inode->size = 0; - val = 1; - } - ci->u.inode->number_data = ci->u.inode->number_blocks = val; - - - pfsGetTime(&ci->u.inode->ctime); - memcpy(&ci->u.inode->atime, &ci->u.inode->ctime, sizeof(pfs_datetime_t)); - memcpy(&ci->u.inode->mtime, &ci->u.inode->ctime, sizeof(pfs_datetime_t)); - - ci->u.inode->number_segdesg = 1; - ci->u.inode->data[0].number = bi->number; - ci->u.inode->data[0].subpart = bi->subpart; - ci->u.inode->data[0].count = bi->count; - - ci->u.inode->subpart = bi->subpart; - - ci->flags |= PFS_CACHE_FLAG_DIRTY; -} - - -// Given a path, this function will return the inode for the directory which holds -// the file (dir) specified by the filename. -// -// ie: if filename = /usr/local/ps2/games then it will return the inode for /usr/local/ps2 -pfs_cache_t *pfsInodeGetParent(pfs_mount_t *pfsMount, pfs_cache_t *clink, const char *filename, - char *path, int *result) -{ - static int pfsSymbolicLinks = 0; - pfs_cache_t *link, *inode; - char *filename2 = (char *)filename; - - if (filename2[0] == 0) { - *result = -ENOENT; - if (clink) - pfsCacheFree(clink); - return NULL; - } - - if (filename2[0] == '/') { - - // Get inode for root dir - - if (clink) - pfsCacheFree(clink); - if ((clink = pfsInodeGetData(pfsMount, pfsMount->root_dir.subpart, - pfsMount->root_dir.number, result)) == 0) - return NULL; - } else if (clink == NULL) { - - // Otherwise if relative path, get inode for current dir - - if ((clink = pfsInodeGetData(pfsMount, pfsMount->current_dir.subpart, - pfsMount->current_dir.number, result)) == 0) - return NULL; - } - - do { - filename2 = pfsSplitPath(filename2, path, result); - if (filename2 == NULL) - return NULL; - - // If we've reached the end of the path, then we want to return - // the cached inode for the directory which holds the file/dir in path - if (filename2[0] == 0) { - if ((clink->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) - return clink; - - pfsCacheFree(clink); - *result = -ENOTDIR; // not a directory - return NULL; - } - - inode = pfsInodeGetFileInDir(clink, path, result); - - if (inode && ((inode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK)) { - if (pfsSymbolicLinks >= 4) { - *result = -ELOOP; // too many symbolic links - pfsCacheFree(clink); - pfsCacheFree(inode); - return NULL; - } - - pfsSymbolicLinks++; - link = pfsInodeGetFile(pfsMount, clink, (char *)&inode->u.inode->data[1], result); - pfsSymbolicLinks--; - - clink = inode; - if (link == 0) { - pfsCacheFree(inode); - return NULL; - } - inode = link; - } - pfsCacheFree(clink); - clink = inode; - - } while (inode); - - return NULL; -} - -int pfsInodeRemove(pfs_cache_t *parent, pfs_cache_t *inode, char *path) -{ - pfs_cache_t *entry; - int rv = 0; - - if ((entry = pfsDirRemoveEntry(parent, path)) != NULL) { - pfsInodeSetTime(parent); - entry->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(entry); - } else - rv = -ENOENT; - - pfsCacheFree(parent); - if (rv == 0) { - inode->flags &= ~PFS_CACHE_FLAG_DIRTY; - pfsBitmapFreeInodeBlocks(inode); - if (parent->pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(parent->pfsMount); - } - - pfsCacheFree(inode); - return rv; -} - -pfs_cache_t *pfsInodeCreate(pfs_cache_t *clink, u16 mode, u16 uid, u16 gid, int *result) -{ - pfs_blockinfo_t a, b; - - pfs_mount_t *pfsMount = clink->pfsMount; - u32 j; - u32 i; - pfs_cache_t *inode; - - if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) { - if (pfsMount->num_subs > clink->u.inode->subpart) - clink->u.inode->subpart++; - else - clink->u.inode->subpart = 0; - a.number = 0; - a.subpart = clink->u.inode->subpart; - j = (pfsMount->zfree * (u64)100) / pfsMount->total_sector; - i = (pfsMount->free_zone[a.subpart] * (u64)100) / - (pfsMount->blockDev->getSize(pfsMount->fd, a.subpart) >> pfsMount->sector_scale); - if ((i < j) && ((j - i) >= 11)) - a.subpart = pfsGetMaxIndex(pfsMount); - } else { - a.number = clink->u.inode->inode_block.number; - a.subpart = clink->u.inode->inode_block.subpart; - a.count = clink->u.inode->inode_block.count; - } - a.count = 1; - - // Search for a free zone, starting from parent dir inode block - *result = pfsBitmapSearchFreeZone(pfsMount, &a, 2); - if (*result < 0) - return 0; - inode = pfsCacheGetData(pfsMount, a.subpart, a.number << pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGD | PFS_CACHE_FLAG_NOLOAD, result); - if (inode == NULL) - return NULL; - - // Initialise the inode (which has been allocate blocks specified by a) - pfsInodeFill(inode, (pfs_blockinfo_t *)&a, mode, uid, gid); - if ((mode & FIO_S_IFMT) != FIO_S_IFDIR) - return inode; - - b.number = a.number; - b.subpart = a.subpart; - b.count = a.count; - - *result = pfsBitmapSearchFreeZone(pfsMount, (pfs_blockinfo_t *)&a, 0); - if (*result < 0) { - pfsCacheFree(inode); - pfsBitmapFreeBlockSegment(pfsMount, (pfs_blockinfo_t *)&b); - return NULL; - } - - inode->u.inode->data[1].number = a.number; - inode->u.inode->data[1].subpart = a.subpart; - inode->u.inode->data[1].count = a.count; - - return inode; -} - -int pfsCheckAccess(pfs_cache_t *clink, int flags) -{ - int mode; - - // Bail if trying to write to read-only mount - if ((clink->pfsMount->flags & FIO_MT_RDONLY) && (flags & O_WRONLY)) - return -EROFS; - - if (((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) && - ((clink->u.inode->mode & 0111) == 0)) - mode = 6; - else - mode = 7; - return ((mode & flags) & 7) == flags ? 0 : -EACCES; -} - -char *pfsSplitPath(char *filename, char *path, int *result) -{ - int i = 0; - int j = 0; - - for (i = 0; filename[i] == '/'; i++) - ; - - for (; i < 1024 && filename[i] != '/'; i++) { - if (filename[i] == 0) - break; - if (j < 255) - path[j++] = filename[i]; - } - - if (j < 256) - path[j] = 0; - - while (filename[i] == '/') - if (i < 1024) - i++; - else - break; - if (i < 1024) - return &filename[i]; - - *result = -ENAMETOOLONG; - return 0; -} - -u16 pfsGetMaxIndex(pfs_mount_t *pfsMount) -{ - u32 max = 0, maxI = 0, i, v; - - for (i = 0; i < pfsMount->num_subs + 1; i++) //enumerate all subs - { - v = (pfsMount->free_zone[i] * (u64)100) / - (pfsMount->blockDev->getSize(pfsMount->fd, i) >> pfsMount->sector_scale); - if (max < v) { - max = v; - maxI = i; - } - } - return maxI; -} - -int pfsAllocZones(pfs_cache_t *clink, int msize, int mode) -{ - pfs_blockpos_t blockpos; - int result = 0; - u32 val; - int zsize; - - zsize = clink->pfsMount->zsize; - val = ((msize - 1 + zsize) & (-zsize)) / zsize; - - if (mode == 0) - if (((clink->u.inode->number_blocks - clink->u.inode->number_segdesg) * (u64)zsize) >= (clink->u.inode->size + msize)) - return 0; - - if ((blockpos.inode = pfsBlockGetLastSegmentDescriptorInode(clink, &result))) { - blockpos.block_offset = blockpos.byte_offset = 0; - blockpos.block_segment = clink->u.inode->number_data - 1; - val -= pfsBlockExpandSegment(clink, &blockpos, val); - while (val && ((result = pfsBlockAllocNewSegment(clink, &blockpos, val)) >= 0)) { - val -= result; - result = 0; - } - pfsCacheFree(blockpos.inode); - } - return result; -} - -void pfsFreeZones(pfs_cache_t *pfree) -{ - pfs_blockinfo_t b; - int result; - pfs_mount_t *pfsMount = pfree->pfsMount; - pfs_inode_t *inode = pfree->u.inode; - u32 nextsegdesc = 1, limit = inode->number_data, i, j = 0, zones; - pfs_blockinfo_t *bi; - pfs_cache_t *clink; - - zones = (u32)(inode->size / pfsMount->zsize); - if (inode->size % pfsMount->zsize) - zones++; - if (inode->number_segdesg + zones == inode->number_blocks) - return; - - j = zones; - b.number = 0; - clink = pfsCacheUsedAdd(pfree); - - // iterate through each of the block segments used by the inode - for (i = 1; i < limit && j; i++) { - if (pfsFixIndex(i) == 0) { - if ((clink = pfsBlockGetNextSegment(clink, &result)) == 0) - return; - - nextsegdesc++; - } else if (j < clink->u.inode->data[pfsFixIndex(i)].count) { - clink->u.inode->data[pfsFixIndex(i)].count -= j; - b.subpart = clink->u.inode->data[pfsFixIndex(i)].subpart; - b.count = j; - b.number = clink->u.inode->data[pfsFixIndex(i)].number + - clink->u.inode->data[pfsFixIndex(i)].count; - j = 0; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - } else - j -= clink->u.inode->data[pfsFixIndex(i)].count; - } - - pfree->u.inode->number_data = i; - pfree->u.inode->number_blocks = zones + nextsegdesc; - pfree->u.inode->number_segdesg = nextsegdesc; - pfree->u.inode->last_segment.number = clink->u.inode->data[0].number; - pfree->u.inode->last_segment.subpart = clink->u.inode->data[0].subpart; - pfree->u.inode->last_segment.count = clink->u.inode->data[0].count; - pfree->flags |= PFS_CACHE_FLAG_DIRTY; - - if (b.number) - pfsBitmapFreeBlockSegment(pfsMount, &b); - - while (i < limit) { - if (pfsFixIndex(i) == 0) { - if ((clink = pfsBlockGetNextSegment(clink, &result)) == 0) - return; - } - bi = &clink->u.inode->data[pfsFixIndex(i++)]; - pfsBitmapFreeBlockSegment(pfsMount, bi); - pfsCacheMarkClean(pfsMount, bi->subpart, bi->number << pfsMount->inode_scale, - (bi->number + bi->count) << pfsMount->inode_scale); - } - - pfsCacheFree(clink); -} diff --git a/modules/hdd/libpfs/src/inode.c b/modules/hdd/libpfs/src/inode.c deleted file mode 100644 index bd753eb9b..000000000 --- a/modules/hdd/libpfs/src/inode.c +++ /dev/null @@ -1,125 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS low-level inode manipulation routines -*/ - -#include -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" - -extern u32 pfsMetaSize; - -/////////////////////////////////////////////////////////////////////////////// -// Function definitions - -void pfsInodePrint(pfs_inode_t *inode) -{ - PFS_PRINTF(PFS_DRV_NAME ": pfsInodePrint: Checksum = 0x%lX, Magic = 0x%lX\n", inode->checksum, inode->magic); - PFS_PRINTF(PFS_DRV_NAME ": Mode = 0x%X, attr = 0x%X\n", inode->mode, inode->attr); - PFS_PRINTF(PFS_DRV_NAME ": size = 0x%08lX%08lX\n", (u32)(inode->size >> 32), (u32)(inode->size)); -} - -int pfsInodeCheckSum(pfs_inode_t *inode) -{ - u32 *ptr = (u32 *)inode; - u32 sum = 0; - int i; - - for (i = 1; i < 256; i++) - sum += ptr[i]; - return sum; -} - -pfs_cache_t *pfsInodeGetData(pfs_mount_t *pfsMount, u16 sub, u32 inode, int *result) -{ - return pfsCacheGetData(pfsMount, sub, inode << pfsMount->inode_scale, - PFS_CACHE_FLAG_SEGD, result); -} - -void pfsInodeSetTime(pfs_cache_t *clink) -{ // set the inode time's in cache - pfsGetTime(&clink->u.inode->mtime); - memcpy(&clink->u.inode->ctime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); - memcpy(&clink->u.inode->atime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); - clink->flags |= PFS_CACHE_FLAG_DIRTY; -} - -int pfsInodeSync(pfs_blockpos_t *blockpos, u64 size, u32 used_segments) -{ - int result = 0; - u32 i; - u16 count; - - for (i = pfsBlockSyncPos(blockpos, size); i;) { - count = blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)].count; - - i += blockpos->block_offset; - - if (i < count) { - blockpos->block_offset = i; - break; - } - - i -= count; - - if (blockpos->block_segment + 1 == used_segments) { - blockpos->block_offset = count; - if (i || blockpos->byte_offset) { - PFS_PRINTF(PFS_DRV_NAME ": panic: fp exceeds file.\n"); - return -EINVAL; - } - } else { - blockpos->block_offset = 0; - blockpos->block_segment++; - } - - if (pfsFixIndex(blockpos->block_segment)) - continue; - - if ((blockpos->inode = pfsBlockGetNextSegment(blockpos->inode, &result)) == 0) - break; - - i++; - } - - return result; -} - -pfs_cache_t *pfsGetDentriesChunk(pfs_blockpos_t *position, int *result) -{ - pfs_blockinfo_t *bi; - pfs_mount_t *pfsMount = position->inode->pfsMount; - - bi = &position->inode->u.inode->data[pfsFixIndex(position->block_segment)]; - - return pfsCacheGetData(pfsMount, bi->subpart, - ((bi->number + position->block_offset) << pfsMount->inode_scale) + - position->byte_offset / pfsMetaSize, - PFS_CACHE_FLAG_NOTHING, result); -} - -pfs_cache_t *pfsGetDentriesAtPos(pfs_cache_t *clink, u64 position, int *offset, int *result) -{ - pfs_blockpos_t blockpos; - pfs_cache_t *r; - *result = pfsBlockInitPos(clink, &blockpos, position); - if (*result) - return 0; - - *offset = blockpos.byte_offset % pfsMetaSize; - - r = pfsGetDentriesChunk(&blockpos, result); - pfsCacheFree(blockpos.inode); - - return r; -} diff --git a/modules/hdd/libpfs/src/journal.c b/modules/hdd/libpfs/src/journal.c deleted file mode 100644 index d40f35a81..000000000 --- a/modules/hdd/libpfs/src/journal.c +++ /dev/null @@ -1,142 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS metadata journal related routines -*/ - -#include -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" - -extern int pfsBlockSize; - -/////////////////////////////////////////////////////////////////////////////// -// Globals - -pfs_journal_t pfsJournalBuf; - -/////////////////////////////////////////////////////////////////////////////// -// Function defenitions - -int pfsJournalChecksum(void *header) -{ - u32 *ptr = (u32 *)header; - u32 sum = 0; - int i; - for (i = 2; i < 256; i++) - sum += ptr[i]; - return sum & 0xFFFF; -} - -void pfsJournalWrite(pfs_mount_t *pfsMount, pfs_cache_t *clink, u32 pfsCacheNumBuffers) -{ - u32 i = 0; - u32 logSector = 2; - - for (i = 0; i < pfsCacheNumBuffers; i++) { - if ((clink[i].flags & PFS_CACHE_FLAG_DIRTY) && clink[i].pfsMount == pfsMount) { - if (clink[i].flags & (PFS_CACHE_FLAG_SEGD | PFS_CACHE_FLAG_SEGI)) - clink[i].u.inode->checksum = pfsInodeCheckSum(clink[i].u.inode); - pfsJournalBuf.log[pfsJournalBuf.num].sector = clink[i].sector << pfsBlockSize; - pfsJournalBuf.log[pfsJournalBuf.num].sub = clink[i].sub; - pfsJournalBuf.log[pfsJournalBuf.num].logSector = logSector; - pfsJournalBuf.num += 1; - } - logSector += 2; - } - - if (pfsMount->blockDev->transfer(pfsMount->fd, clink->u.inode, 0, - (pfsMount->log.number << pfsMount->sector_scale) + 2, pfsCacheNumBuffers * 2, - PFS_IO_MODE_WRITE) >= 0) - pfsJournalFlush(pfsMount); -} - -int pfsJournalReset(pfs_mount_t *pfsMount) -{ - int rv; - - memset(&pfsJournalBuf, 0, sizeof(pfs_journal_t)); - pfsJournalBuf.magic = PFS_JOUNRNAL_MAGIC; - - pfsMount->blockDev->flushCache(pfsMount->fd); - - rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, - (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE); - - pfsMount->blockDev->flushCache(pfsMount->fd); - return rv; -} - -int pfsJournalResetThis(pfs_block_device_t *blockDev, int fd, u32 sector) -{ - memset(&pfsJournalBuf, 0, sizeof(pfs_journal_t)); - pfsJournalBuf.magic = PFS_JOUNRNAL_MAGIC; - return blockDev->transfer(fd, &pfsJournalBuf, 0, sector, 2, 1); -} - -int pfsJournalFlush(pfs_mount_t *pfsMount) -{ // this write any thing that in are journal buffer :) - int rv; - - pfsMount->blockDev->flushCache(pfsMount->fd); - - pfsJournalBuf.checksum = pfsJournalChecksum(&pfsJournalBuf); - - rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, - (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE); - - pfsMount->blockDev->flushCache(pfsMount->fd); - return rv; -} - -int pfsJournalRestore(pfs_mount_t *pfsMount) -{ - int rv; - int result; - pfs_cache_t *clink; - u32 i; - - // Read journal buffer from disk - rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0, - (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_READ); - - if (rv || (pfsJournalBuf.magic != PFS_JOUNRNAL_MAGIC) || - (pfsJournalBuf.checksum != (u16)pfsJournalChecksum(&pfsJournalBuf))) { - PFS_PRINTF(PFS_DRV_NAME ": Error: cannot read log/invalid log\n"); - return pfsJournalReset(pfsMount); - } - - if (pfsJournalBuf.num == 0) { - return pfsJournalReset(pfsMount); - } - - clink = pfsCacheAllocClean(&result); - if (!clink) - return result; - - for (i = 0; i < pfsJournalBuf.num; i++) { - PFS_PRINTF(PFS_DRV_NAME ": Log overwrite %d:%08lx\n", pfsJournalBuf.log[i].sub, pfsJournalBuf.log[i].sector); - - // Read data in from log section on disk into cache buffer - rv = pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, 0, - (pfsMount->log.number << pfsMount->sector_scale) + pfsJournalBuf.log[i].logSector, 2, - PFS_IO_MODE_READ); - - // Write from cache buffer into destination location on disk - if (!rv) - pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, pfsJournalBuf.log[i].sub, - pfsJournalBuf.log[i].sector, 2, PFS_IO_MODE_WRITE); - } - - pfsCacheFree(clink); - return pfsJournalReset(pfsMount); -} diff --git a/modules/hdd/libpfs/src/misc.c b/modules/hdd/libpfs/src/misc.c deleted file mode 100644 index 340b414ca..000000000 --- a/modules/hdd/libpfs/src/misc.c +++ /dev/null @@ -1,219 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# Miscellaneous routines -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" - -/////////////////////////////////////////////////////////////////////////////// -// Function definitions - -void *pfsAllocMem(int size) -{ - int intrStat; - void *mem; - - CpuSuspendIntr(&intrStat); - mem = AllocSysMemory(ALLOC_FIRST, size, NULL); - CpuResumeIntr(intrStat); - - return mem; -} - -void pfsFreeMem(void *buffer) -{ - int OldState; - - CpuSuspendIntr(&OldState); - FreeSysMemory(buffer); - CpuResumeIntr(OldState); -} - -int pfsGetTime(pfs_datetime_t *tm) -{ - sceCdCLOCK cdtime; - static pfs_datetime_t timeBuf = { - 0, 0x0D, 0x0E, 0x0A, 0x0D, 1, 2003 // used if can not get time... - }; - - if (sceCdReadClock(&cdtime) != 0 && cdtime.stat == 0) { - timeBuf.sec = btoi(cdtime.second); - timeBuf.min = btoi(cdtime.minute); - timeBuf.hour = btoi(cdtime.hour); - timeBuf.day = btoi(cdtime.day); - timeBuf.month = btoi(cdtime.month & 0x7F); //The old CDVDMAN sceCdReadClock() function does not automatically file off the highest bit. - timeBuf.year = btoi(cdtime.year) + 2000; - } - memcpy(tm, &timeBuf, sizeof(pfs_datetime_t)); - return 0; -} - -int pfsFsckStat(pfs_mount_t *pfsMount, pfs_super_block_t *superblock, - u32 stat, int mode) -{ // mode 0=set flag, 1=remove flag, else check stat - - if (pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, - PFS_IO_MODE_READ) == 0) { - switch (mode) { - case PFS_MODE_SET_FLAG: - superblock->pfsFsckStat |= stat; - break; - case PFS_MODE_REMOVE_FLAG: - superblock->pfsFsckStat &= ~stat; - break; - default /*PFS_MODE_CHECK_FLAG*/: - return 0 < (superblock->pfsFsckStat & stat); - } - pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, - PFS_IO_MODE_WRITE); - pfsMount->blockDev->flushCache(pfsMount->fd); - } - return 0; -} - -void pfsPrintBitmap(const u32 *bitmap) -{ - u32 i, j; - char a[48 + 1], b[16 + 1]; - - b[16] = 0; - for (i = 0; i < 32; i++) { - memset(a, 0, 49); - for (j = 0; j < 16; j++) { - const char *c = (const char *)bitmap + j + i * 16; - - sprintf(a + j * 3, "%02x ", *c); - b[j] = ((*c >= 0) && (isgraph(*c))) ? - *c : - '.'; - } - PFS_PRINTF("%s%s\n", a, b); - } -} - -int pfsGetScale(int num, int size) -{ - int scale = 0; - - while ((size << scale) != num) - scale++; - - return scale; -} - -u32 pfsFixIndex(u32 index) -{ - if (index < 114) - return index; - - index -= 114; - return index % 123; -} - -/////////////////////////////////////////////////////////////////////////////// -// Functions to work with hdd.irx - -static int pfsHddTransfer(int fd, void *buffer, u32 sub /*0=main 1+=subs*/, u32 sector, - u32 size /* in sectors*/, u32 mode); -static u32 pfsHddGetSubCount(int fd); -static u32 pfsHddGetPartSize(int fd, u32 sub /*0=main 1+=subs*/); -static void pfsHddSetPartError(int fd); -static int pfsHddFlushCache(int fd); - -#define NUM_SUPPORTED_DEVICES 1 -pfs_block_device_t pfsBlockDeviceCallTable[NUM_SUPPORTED_DEVICES] = { - { - "hdd", - &pfsHddTransfer, - &pfsHddGetSubCount, - &pfsHddGetPartSize, - &pfsHddSetPartError, - &pfsHddFlushCache, - }}; - -pfs_block_device_t *pfsGetBlockDeviceTable(const char *name) -{ - char *end; - char devname[32]; - char *tmp; - u32 len; - int i; - - while (name[0] == ' ') - name++; - - end = strchr(name, ':'); - if (!end) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Unknown block device '%s'\n", name); - return NULL; - } - - len = (u32)end - (u32)name; - strncpy(devname, name, len); - devname[len] = '\0'; - - // Loop until digit is found, then terminate string at that digit. - // Should then have just the device name left, minus any front spaces or trailing digits. - tmp = devname; - while (!(isdigit(tmp[0]))) - tmp++; - tmp[0] = '\0'; - - for (i = 0; i < NUM_SUPPORTED_DEVICES; i++) - if (!strcmp(pfsBlockDeviceCallTable[i].devName, devname)) - return &pfsBlockDeviceCallTable[i]; - - return NULL; -} - -static int pfsHddTransfer(int fd, void *buffer, u32 sub /*0=main 1+=subs*/, u32 sector, - u32 size /* in sectors*/, u32 mode) -{ - hddIoctl2Transfer_t t; - - t.sub = sub; - t.sector = sector; - t.size = size; - t.mode = mode; - t.buffer = buffer; - - return ioctl2(fd, HIOCTRANSFER, &t, 0, NULL, 0); -} - -static u32 pfsHddGetSubCount(int fd) -{ - return ioctl2(fd, HIOCNSUB, NULL, 0, NULL, 0); -} - -static u32 pfsHddGetPartSize(int fd, u32 sub /*0=main 1+=subs*/) -{ // of a partition - return ioctl2(fd, HIOCGETSIZE, &sub, 0, NULL, 0); -} - -static void pfsHddSetPartError(int fd) -{ - ioctl2(fd, HIOCSETPARTERROR, NULL, 0, NULL, 0); -} - -static int pfsHddFlushCache(int fd) -{ - return ioctl2(fd, HIOCFLUSH, NULL, 0, NULL, 0); -} diff --git a/modules/hdd/libpfs/src/super.c b/modules/hdd/libpfs/src/super.c deleted file mode 100644 index b3bab8c06..000000000 --- a/modules/hdd/libpfs/src/super.c +++ /dev/null @@ -1,52 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS superblock manipulation routines -*/ - -#include -#include -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" - -int pfsBlockSize = 1; // block size(in sectors(512) ) -u32 pfsMetaSize = 1024; // size of each metadata structure - -int pfsCheckZoneSize(u32 zone_size) -{ - if ((zone_size & (zone_size - 1)) || (zone_size < (2 * 1024)) || (zone_size > (128 * 1024))) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Invalid zone size\n"); - return 0; - } - - return 1; -} - -// Returns the number of sectors (512 byte units) which will be used -// for bitmaps, given the zone size and partition size -u32 pfsGetBitmapSizeSectors(int zoneScale, u32 partSize) -{ - int w, zones = partSize / (1 << zoneScale); - - w = (zones & 7); - zones = zones / 8 + w; - - w = (zones & 511); - return zones / 512 + w; -} - -// Returns the number of blocks/zones which will be used for bitmaps -u32 pfsGetBitmapSizeBlocks(int scale, u32 mainsize) -{ - u32 a = pfsGetBitmapSizeSectors(scale, mainsize); - return a / (1 << scale) + ((a % (1 << scale)) > 0); -} diff --git a/modules/hdd/libpfs/src/superWrite.c b/modules/hdd/libpfs/src/superWrite.c deleted file mode 100644 index d81139bd0..000000000 --- a/modules/hdd/libpfs/src/superWrite.c +++ /dev/null @@ -1,243 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS superblock (write) manipulation routines -*/ - -#include -#include -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" - -extern int pfsBlockSize; -extern u32 pfsMetaSize; - -// Formats a partition (main or sub) by filling with fragment pattern and setting the bitmap accordingly -int pfsFormatSub(pfs_block_device_t *blockDev, int fd, u32 sub, u32 reserved, u32 scale, u32 fragment) -{ - pfs_cache_t *cache; - int i; - u32 sector, count, size, *b; - int result = 0; - - size = blockDev->getSize(fd, sub); - sector = 1 << scale; - count = pfsGetBitmapSizeSectors(scale, size); - if (reserved >= 2) - sector += 0x2000; - reserved += pfsGetBitmapSizeBlocks(scale, size); - - if ((cache = pfsCacheAllocClean(&result))) { - // fill with fragment pattern - for (i = 127; i >= 0; i--) - cache->u.bitmap[i] = fragment; - - // set as allocated the sectors up to reserved, for the first part of the bitmap - // this will mark the area the bitmaps themselves occupy as used - for (i = 0, b = cache->u.bitmap; i < reserved; i++) { - if (i && ((i & 0x1F) == 0)) - b++; - *b |= 1 << (i & 0x1F); - } - - PFS_PRINTF(PFS_DRV_NAME ": Format sub: sub = %ld, sector start = %ld, ", sub, sector); - - // set the rest of the bitmap to the fragment - while (count-- && ((result = blockDev->transfer(fd, cache->u.bitmap, sub, sector++, 1, 1)) >= 0)) - for (i = 127; i >= 0; i--) - cache->u.bitmap[i] = fragment; - - PFS_PRINTF("sector end = %ld\n", sector - 1); - - pfsCacheFree(cache); - } - return result; -} - -// Formats a partition and all sub-partitions with PFS -int pfsFormat(pfs_block_device_t *blockDev, int fd, int zonesize, int fragment) -{ - int result, result2; - pfs_cache_t *clink, *cache; - pfs_super_block_t *sb; - int scale; - u32 i, mainsize, subnumber = blockDev->getSubNumber(fd); - - mainsize = blockDev->getSize(fd, 0); - if (pfsCheckZoneSize(zonesize) == 0) - return -EINVAL; - - scale = pfsGetScale(zonesize, 512); - - if ((clink = pfsCacheAllocClean(&result))) { - sb = clink->u.superblock; - memset(sb, 0, pfsMetaSize); - sb->magic = PFS_SUPER_MAGIC; - sb->version = 3; - sb->unknown1 = 0x201; - sb->zone_size = zonesize; - sb->num_subs = subnumber; - sb->log.number = pfsGetBitmapSizeBlocks(scale, mainsize) + (0x2000 >> scale) + 1; - sb->log.count = 0x20000 / zonesize ? 0x20000 / zonesize : 1; - - PFS_PRINTF(PFS_DRV_NAME ": Format: log.number = %ld, log.count = %d\n", sb->log.number << scale, sb->log.count); - - sb->root.count = 1; - sb->root.number = sb->log.number + sb->log.count; - if ((result = pfsJournalResetThis(blockDev, fd, sb->log.number << scale)) >= 0) { - if ((cache = pfsCacheAllocClean(&result2))) { - pfsFillSelfAndParentDentries(cache, &sb->root, &sb->root); - result2 = blockDev->transfer(fd, cache->u.dentry, 0, (sb->root.number + 1) << scale, - 1 << pfsBlockSize, 1); - if (result2 == 0) { - // setup root directory - pfsInodeFill(cache, &sb->root, 0x11FF, 0, 0); - cache->u.inode->data[1].subpart = 0; - cache->u.inode->data[1].number = sb->root.number + 1; - cache->u.inode->data[1].count = 1; - cache->u.inode->checksum = pfsInodeCheckSum(cache->u.inode); - - result2 = blockDev->transfer(fd, cache->u.inode, 0, sb->root.number << scale, - 1 << pfsBlockSize, 1); - } - - pfsCacheFree(cache); - } - - if ((result = result2) >= 0) { - for (i = 0; i < subnumber + 1; i++) - if ((result = pfsFormatSub(blockDev, fd, i, i ? 1 : (0x2000 >> scale) + sb->log.count + 3, scale, fragment)) < 0) - break; - - if ((result == 0) && ((result = blockDev->transfer(fd, sb, 0, PFS_SUPER_BACKUP_SECTOR, 1, 1)) == 0)) - result = blockDev->transfer(fd, sb, 0, PFS_SUPER_SECTOR, 1, 1); - } - } - - pfsCacheFree(clink); - blockDev->flushCache(fd); - } - return result; -} - -// Formats sub partitions which are added to the main partition after it is initially -// formatted with PFS -int pfsUpdateSuperBlock(pfs_mount_t *pfsMount, pfs_super_block_t *superblock, u32 sub) -{ - u32 scale; - u32 i; - u32 count; - int rv; - - scale = pfsGetScale(superblock->zone_size, 512); - count = superblock->num_subs + sub + 1; - - for (i = superblock->num_subs + 1; i < count; i++) { - rv = pfsFormatSub(pfsMount->blockDev, pfsMount->fd, i, 1, scale, 0); - if (rv < 0) - return rv; - } - - superblock->num_subs = sub; - - // Write superblock, then write backup - rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_WRITE); - if (!rv) - rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_BACKUP_SECTOR, 1, PFS_IO_MODE_WRITE); - - pfsMount->blockDev->flushCache(pfsMount->fd); - - return rv; -} - -int pfsMountSuperBlock(pfs_mount_t *pfsMount) -{ - int result; - pfs_cache_t *clink; - pfs_super_block_t *superblock; - u32 sub; - u32 i; - - - // Get number of sub partitions attached to the main partition - sub = pfsMount->blockDev->getSubNumber(pfsMount->fd); - - // Allocate a cache entry for the superblock - clink = pfsCacheAllocClean(&result); - if (!clink) - return result; - - superblock = clink->u.superblock; - - // Read the suprerblock from the main partition - result = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_READ); - if (result) - goto error; - - if ((superblock->magic != PFS_SUPER_MAGIC) || (superblock->version >= PFS_VERSION)) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Invalid magic/version\n"); - pfsCacheFree(clink); - return -EIO; - } - - if (!pfsCheckZoneSize(superblock->zone_size)) - result = -EIO; - - if ((superblock->pfsFsckStat & PFS_FSCK_STAT_WRITE_ERROR) && (pfsMount->flags & PFS_FIO_ATTR_EXECUTABLE)) - result = -EIO; - - if (sub < superblock->num_subs) { - PFS_PRINTF(PFS_DRV_NAME ": Error: Filesystem larger than partition\n"); - result = -EIO; - } - - if (result) - goto error; - - // If new subs have been added, update filesystem - if (superblock->num_subs < sub) { - PFS_PRINTF(PFS_DRV_NAME ": New subs added, updating filesystem..\n"); - result = pfsUpdateSuperBlock(pfsMount, superblock, sub); - } - - if (result) - goto error; - - pfsMount->zsize = superblock->zone_size; - pfsMount->sector_scale = pfsGetScale(pfsMount->zsize, 512); - pfsMount->inode_scale = pfsGetScale(pfsMount->zsize, pfsMetaSize); - pfsMount->num_subs = superblock->num_subs; - memcpy(&pfsMount->root_dir, &superblock->root, sizeof(pfs_blockinfo_t)); - memcpy(&pfsMount->log, &superblock->log, sizeof(pfs_blockinfo_t)); - memcpy(&pfsMount->current_dir, &superblock->root, sizeof(pfs_blockinfo_t)); - pfsMount->total_sector = 0; - pfsMount->uid = 0; - pfsMount->gid = 0; - - // Do a journal restore (in case of un-clean unmount) - pfsJournalRestore(pfsMount); - - // Calculate free space and total size - for (i = 0; i < (pfsMount->num_subs + 1); i++) { - int free; - - pfsMount->total_sector += pfsMount->blockDev->getSize(pfsMount->fd, i) >> pfsMount->sector_scale; - - free = pfsBitmapCalcFreeZones(pfsMount, i); - pfsMount->free_zone[i] = free; - pfsMount->zfree += free; - } - -error: - pfsCacheFree(clink); - return result; -} diff --git a/modules/hdd/pfs/Makefile b/modules/hdd/pfs/Makefile deleted file mode 100644 index e1c3fc69e..000000000 --- a/modules/hdd/pfs/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -LIBPFS_PATH = ../libpfs -LIBPFS_SRC_DIR = $(LIBPFS_PATH)/src/ - -IOP_BIN = ps2fs.irx -PFS_OBJS = bitmap.o dir.o inode.o journal.o misc.o super.o superWrite.o cache.o block.o blockWrite.o -IOP_OBJS = pfs.o pfs_fio.o pfs_fioctl.o imports.o $(PFS_OBJS) - -IOP_CFLAGS += -Wall -fno-builtin-printf -IOP_LDFLAGS += -s -IOP_INCS += -I$(CURDIR) -I$(LIBPFS_PATH)/include -I../common -IOP_LIBS += -lgcc - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) - -rebuild: clean all - -$(IOP_OBJS_DIR)%.o : $(LIBPFS_SRC_DIR)%.c - $(IOP_CC) $(IOP_CFLAGS) -c $< -o $@ - -include $(PS2SDK)/Defs.make -include ../../Rules.make diff --git a/modules/hdd/pfs/imports.lst b/modules/hdd/pfs/imports.lst deleted file mode 100644 index a57e6fbe2..000000000 --- a/modules/hdd/pfs/imports.lst +++ /dev/null @@ -1,54 +0,0 @@ - -cdvdman_IMPORTS_start -I_sceCdReadClock -cdvdman_IMPORTS_end - -intrman_IMPORTS_start -I_CpuSuspendIntr -I_CpuResumeIntr -intrman_IMPORTS_end - -iomanX_IMPORTS_start -I_open -I_close -I_ioctl2 -I_AddDrv -I_DelDrv -iomanX_IMPORTS_end - -poweroff_IMPORTS_start -I_AddPowerOffHandler -poweroff_IMPORTS_end - -stdio_IMPORTS_start -I_printf -stdio_IMPORTS_end - -sysclib_IMPORTS_start -I_memcpy -I_memset -I_strncpy -I_sprintf -I_strlen -I_strcpy -I_memcmp -I_strncmp -I_strrchr -I_strcmp -I_strtol -I_strchr -I_look_ctype_table -sysclib_IMPORTS_end - -sysmem_IMPORTS_start -I_AllocSysMemory -//I_QueryBlockSize -I_FreeSysMemory -sysmem_IMPORTS_end - -thsemap_IMPORTS_start -I_CreateSema -I_DeleteSema -I_SignalSema -I_WaitSema -thsemap_IMPORTS_end diff --git a/modules/hdd/pfs/irx_imports.h b/modules/hdd/pfs/irx_imports.h deleted file mode 100644 index ee326c42f..000000000 --- a/modules/hdd/pfs/irx_imports.h +++ /dev/null @@ -1,29 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: irx_imports.h 1421 2007-07-07 01:56:53Z radad $ -# Defines all IRX imports. -*/ - -#ifndef IOP_IRX_IMPORTS_H -#define IOP_IRX_IMPORTS_H - -#include - -/* Please keep these in alphabetical order! */ -#include -#include -#include -#include -#include -#include -#include -#include - -#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/hdd/pfs/pfs-opt.h b/modules/hdd/pfs/pfs-opt.h deleted file mode 100644 index bf64011eb..000000000 --- a/modules/hdd/pfs/pfs-opt.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _PFS_OPT_H -#define _PFS_OPT_H - -#define PFS_PRINTF(format, ...) printf(format, ##__VA_ARGS__) -#define PFS_DRV_NAME "pfs" - -#endif diff --git a/modules/hdd/pfs/pfs.c b/modules/hdd/pfs/pfs.c deleted file mode 100644 index ec0830364..000000000 --- a/modules/hdd/pfs/pfs.c +++ /dev/null @@ -1,216 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS startup and misc code -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" -#include "pfs.h" -#include "pfs_fio.h" -#include "pfs_fioctl.h" - -IRX_ID("pfs_driver", PFS_MAJOR, PFS_MINOR); - -/////////////////////////////////////////////////////////////////////////////// -// Globals - -iop_device_ops_t pfsOps = { - pfsFioInit, - pfsFioDeinit, - pfsFioFormat, - pfsFioOpen, - pfsFioClose, - pfsFioRead, - pfsFioWrite, - pfsFioLseek, - pfsFioIoctl, - pfsFioRemove, - pfsFioMkdir, - pfsFioRmdir, - pfsFioDopen, - pfsFioClose, - pfsFioDread, - pfsFioGetstat, - pfsFioChstat, - pfsFioRename, - pfsFioChdir, - pfsFioSync, - pfsFioMount, - pfsFioUmount, - (void *)pfsFioUnsupported /*pfsFioLseek64*/, - pfsFioDevctl, - (void *)pfsFioUnsupported /*pfsFioSymlink*/, - (void *)pfsFioUnsupported /*pfsFioReadlink*/, - pfsFioIoctl2}; - -iop_device_t pfsFioDev = { - "pfs", - (IOP_DT_FS | IOP_DT_FSEXT), - 1, - "PFS", - &pfsOps}; - -pfs_config_t pfsConfig = {1, 2}; -pfs_mount_t *pfsMountBuf; -char *pfsFilename = NULL; - -extern u32 pfsMetaSize; -extern pfs_file_slot_t *pfsFileSlots; -extern pfs_config_t pfsConfig; - -/////////////////////////////////////////////////////////////////////////////// -// Local function declerations - -static int printPfsArgError(void); -static int allocateMountBuffer(int size); - -/////////////////////////////////////////////////////////////////////////////// -// Function defenitions - -static int printPfsArgError(void) -{ - PFS_PRINTF(PFS_DRV_NAME " ERROR: Usage: %s [-m ] [-o ] [-n ]\n", pfsFilename); - - return MODULE_NO_RESIDENT_END; -} - -static int allocateMountBuffer(int size) -{ - int tsize = size * sizeof(pfs_mount_t); - - pfsMountBuf = pfsAllocMem(tsize); - if (!pfsMountBuf) - return -ENOMEM; - - memset(pfsMountBuf, 0, tsize); - - return 0; -} - -void pfsClearMount(pfs_mount_t *pfsMount) -{ - memset(pfsMount, 0, sizeof(pfs_mount_t)); -} - -pfs_mount_t *pfsGetMountedUnit(s32 unit) -{ // get mounted unit - if (unit >= pfsConfig.maxMount) - return NULL; - - if (!(pfsMountBuf[unit].flags & PFS_MOUNT_BUSY)) - return NULL; - - return &pfsMountBuf[unit]; -} - -int _start(int argc, char *argv[]) -{ - char *filename; - int number; - int numBuf = 8; - int reqBuf; - int size; - - PFS_PRINTF(PFS_DRV_NAME " Playstation Filesystem Driver v%d.%d\nps2fs: (c) 2003 Sjeep, Vector and Florin Sasu\n", PFS_MAJOR, PFS_MINOR); - - // Get filename of IRX - filename = strrchr(argv[0], '/'); - if (filename++) - pfsFilename = filename; - else - pfsFilename = argv[0]; - - argc--; - argv++; - - // Parse arguments - while (argc > 0) { - if (argv[0][0] != '-') - break; - - if (!strcmp(argv[0], "-m")) { - if (--argc <= 0) - return printPfsArgError(); - argv++; - - number = strtol(argv[0], 0, 10); - - if (number <= 32) - pfsConfig.maxMount = number; - } else if (!strcmp(argv[0], "-o")) { - if (--argc <= 0) - return printPfsArgError(); - argv++; - - number = strtol(argv[0], NULL, 10); - - if (number <= 32) - pfsConfig.maxOpen = number; - } else if (!strcmp(argv[0], "-n")) { - if (--argc <= 0) - return printPfsArgError(); - argv++; - - number = strtol(argv[0], NULL, 10); - - if (number > numBuf) - numBuf = number; - - if (numBuf > 127) { - PFS_PRINTF(PFS_DRV_NAME " ERROR: Number of buffers is larger than 127!\n"); - return -EINVAL; - } - } else - return printPfsArgError(); - - argc--; - argv++; - } - - PFS_PRINTF(PFS_DRV_NAME " Max mount: %ld, Max open: %ld, Number of buffers: %d\n", pfsConfig.maxMount, - pfsConfig.maxOpen, numBuf); - - // Do we have enough buffers ? - reqBuf = (pfsConfig.maxOpen * 2) + 8; - if (numBuf < reqBuf) - PFS_PRINTF(PFS_DRV_NAME " Warning: %d buffers may be needed, but only %d buffers are allocated\n", reqBuf, numBuf); - - if (allocateMountBuffer(pfsConfig.maxMount) < 0) - return MODULE_NO_RESIDENT_END; - - // Allocate and zero memory for file slots - size = pfsConfig.maxOpen * sizeof(pfs_file_slot_t); - pfsFileSlots = pfsAllocMem(size); - if (!pfsFileSlots) { - PFS_PRINTF(PFS_DRV_NAME " Error: Failed to allocate memory!\n"); - return MODULE_NO_RESIDENT_END; - } - - memset(pfsFileSlots, 0, size); - - if (pfsCacheInit(numBuf, pfsMetaSize) < 0) - return MODULE_NO_RESIDENT_END; - - DelDrv("pfs"); - AddDrv(&pfsFioDev); - - PFS_PRINTF(PFS_DRV_NAME " Driver start.\n"); - - return MODULE_RESIDENT_END; -} diff --git a/modules/hdd/pfs/pfs.h b/modules/hdd/pfs/pfs.h deleted file mode 100644 index dd4d82122..000000000 --- a/modules/hdd/pfs/pfs.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -*/ - -#ifndef _PFS_H -#define _PFS_H - -#ifndef min -#define min(a, b) ((a) < (b) ? (a) : (b)) -#endif - -#define PFS_MAJOR 1 -#define PFS_MINOR 4 - -/////////////////////////////////////////////////////////////////////////////// -// Global types - -typedef struct -{ - u16 dirty; // - u16 sub; // Sub/main partition - u32 sector; // Sector -} pfs_restsInfo_t; - -typedef struct -{ - char key[256]; - char value[256]; -} pfs_ioctl2attr_t; - -typedef struct -{ - iop_file_t *fd; // - pfs_cache_t *clink; // - u32 aentryOffset; // used for read offset - u64 position; // - pfs_blockpos_t block_pos; // current position into file - pfs_restsInfo_t restsInfo; // - u8 restsBuffer[512]; // used for reading mis-aligned/remainder data -} pfs_file_slot_t; - -typedef struct -{ - u32 maxMount; - u32 maxOpen; -} pfs_config_t; - -/////////////////////////////////////////////////////////////////////////////// -// Global defines - -// mount flags -#define PFS_MOUNT_BUSY 0x8000 - -/////////////////////////////////////////////////////////////////////////////// -// Function declarations - -pfs_mount_t *pfsGetMountedUnit(s32 unit); -void pfsClearMount(pfs_mount_t *pfsMount); - -#endif /* _PFS_H */ diff --git a/modules/hdd/pfs/pfs_fio.c b/modules/hdd/pfs/pfs_fio.c deleted file mode 100644 index 81711c4d7..000000000 --- a/modules/hdd/pfs/pfs_fio.c +++ /dev/null @@ -1,1190 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS I/O manager related routines -*/ - -#include -#include -#include -#include -#include -#include - -#include "pfs-opt.h" -#include "libpfs.h" -#include "pfs.h" -#include "pfs_fio.h" -#include "pfs_fioctl.h" - -/////////////////////////////////////////////////////////////////////////////// -// Globals - -static const u8 openFlagArray[] = {0, 4, 2, 6, 0, 0, 0, 0}; -int pfsFioSema = 0; -pfs_file_slot_t *pfsFileSlots; - -extern pfs_config_t pfsConfig; -extern pfs_cache_t *pfsCacheBuf; -extern u32 pfsCacheNumBuffers; -extern pfs_mount_t *pfsMountBuf; - -/////////////////////////////////////////////////////////////////////////////// -// Function declarations - -static int openFile(pfs_mount_t *pfsMount, pfs_file_slot_t *freeSlot, const char *filename, int openFlags, int mode); -static int fileTransferRemainder(pfs_file_slot_t *fileSlot, void *buf, int size, int operation); -static int fileTransfer(pfs_file_slot_t *fileSlot, u8 *buf, int size, int operation); -static void fioStatFiller(pfs_cache_t *clink, iox_stat_t *stat); -static s64 _seek(pfs_file_slot_t *fileSlot, s64 offset, int whence, int mode); -static int _remove(pfs_mount_t *pfsMount, const char *path, int mode); -static int mountDevice(pfs_block_device_t *blockDev, int fd, int unit, int flag); -static void _sync(void); - -/////////////////////////////////////////////////////////////////////////////// -// Function definitions - -int pfsFioCheckForLastError(pfs_mount_t *pfsMount, int rv) -{ - return pfsMount->lastError ? pfsMount->lastError : rv; -} - -int pfsFioCheckFileSlot(pfs_file_slot_t *fileSlot) -{ - WaitSema(pfsFioSema); - - if (fileSlot->clink == NULL) { - SignalSema(pfsFioSema); - return -EBADF; - } - - return 0; -} - -void pfsFioCloseFileSlot(pfs_file_slot_t *fileSlot) -{ - pfs_mount_t *pfsMount = fileSlot->clink->pfsMount; - - if (fileSlot->fd->mode & O_WRONLY) { - if (fileSlot->restsInfo.dirty != 0) { - pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, - fileSlot->restsInfo.sub, fileSlot->restsInfo.sector, 1, PFS_IO_MODE_WRITE); - } - pfsInodeSetTime(fileSlot->clink); // set time :P - fileSlot->clink->u.inode->attr |= PFS_FIO_ATTR_CLOSED; - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - pfsCacheFree(fileSlot->block_pos.inode); - pfsCacheFree(fileSlot->clink); - memset(fileSlot, 0, sizeof(pfs_file_slot_t)); -} - -pfs_mount_t *pfsFioGetMountedUnit(int unit) -{ - pfs_mount_t *pfsMount; - - WaitSema(pfsFioSema); - if ((pfsMount = pfsGetMountedUnit(unit)) == NULL) - SignalSema(pfsFioSema); - return pfsMount; -} - -static int mountDevice(pfs_block_device_t *blockDev, int fd, int unit, int flag) -{ - u32 i; - int rv; - - if ((u32)unit >= pfsConfig.maxMount) - return -EMFILE; - - if (pfsMountBuf[unit].flags & PFS_MOUNT_BUSY) - return -EBUSY; - - for (i = 0; i < pfsConfig.maxMount; i++) - if ((pfsMountBuf[i].flags & PFS_MOUNT_BUSY) && - (blockDev == pfsMountBuf[i].blockDev) && - (fd == pfsMountBuf[i].fd)) // Cant mount the same partition more than once - return -EBUSY; - - pfsMountBuf[unit].blockDev = blockDev; - pfsMountBuf[unit].fd = fd; - pfsMountBuf[unit].flags = flag; - - rv = pfsMountSuperBlock(&pfsMountBuf[unit]); - if (rv < 0) - return rv; - - pfsMountBuf[unit].flags |= PFS_MOUNT_BUSY; - - return 0; -} - -static int openFile(pfs_mount_t *pfsMount, pfs_file_slot_t *freeSlot, const char *filename, int openFlags, int mode) -{ - char file[256]; - int result, result2, result3, result4; - pfs_cache_t *parentInode, *fileInode, *cached; - - - result = 0; //no error - // Get the inode for the directory which contains the file (dir) in filename - // After this call, 'file' will contain the name of the file we're operating on. - if ((parentInode = pfsInodeGetParent(pfsMount, NULL, filename, file, &result)) == 0) { - return result; - } - - // Get the inode for the actual file/directory contained in the parent dir - fileInode = pfsInodeGetFileInDir(parentInode, file, &result); - - // If file already exists.. - if (fileInode) { - u32 flags; - u32 count; - - // Setup flags - flags = openFlagArray[openFlags & O_RDWR]; - if (openFlags & O_TRUNC) - flags |= 2; - if (openFlags & PFS_FDIRO) - flags |= 4; - if ((mode & 0x10000) || - ((openFlags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))) { - result = -EEXIST; - } else { - count = 0; - - // Resolve actual file from a symlink - while ((fileInode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK) { - if (count++ >= 4) { - result = -ELOOP; - goto label; - } - - parentInode = pfsInodeGetParent(pfsMount, parentInode, (char *)&fileInode->u.inode->data[1], - file, &result); - pfsCacheFree(fileInode); - if ((parentInode == 0) || - ((fileInode = pfsInodeGetFileInDir(parentInode, file, &result)) == 0)) - goto label; - } - - // Make sure that if a file is being opened, then inode does not point - // to a directory, and vice versa. - if ((openFlags & PFS_FDIRO) == 0) { - if ((fileInode->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) - result = -EISDIR; - } else { - if ((fileInode->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - result = -ENOTDIR; - } - - // Truncate file if required - if ((result == 0) && - ((result = pfsCheckAccess(fileInode, flags & 0xFFFF)) == 0) && - (openFlags & O_TRUNC)) { - cached = pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->sector + 1, PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result2); - if (cached) { - memset(cached->u.aentry, 0, sizeof(pfs_inode_t)); //1024 - cached->u.aentry->aLen = sizeof(pfs_inode_t); - cached->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - if (result2 == 0) { - fileInode->u.inode->size = 0; - fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED; //~0x80==0xFF7F - fileInode->flags |= PFS_CACHE_FLAG_DIRTY; - pfsFreeZones(fileInode); - } - } - } - - // Otherwise, if file doesnt already exist.. - } else { - if ((openFlags & O_CREAT) && (result == -ENOENT) && - ((result = pfsCheckAccess(parentInode, 2)) == 0) && - (fileInode = pfsInodeCreate(parentInode, mode, pfsMount->uid, - pfsMount->gid, &result))) { - if ((mode & FIO_S_IFMT) == FIO_S_IFLNK) { - strcpy((char *)&fileInode->u.inode->data[1], (char *)freeSlot); - freeSlot = NULL; - } - - // If new file is a directory, the fill self and parent entries - if ((mode & FIO_S_IFMT) == FIO_S_IFDIR) { - cached = pfsCacheGetData(fileInode->pfsMount, fileInode->u.inode->data[1].subpart, - fileInode->u.inode->data[1].number << fileInode->pfsMount->inode_scale, - PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result3); - if (cached) { - pfsFillSelfAndParentDentries(cached, - &fileInode->u.inode->inode_block, - &parentInode->u.inode->inode_block); - cached->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - result = result3; - // Otherwise if its just a regular file, just zero its attribute entry - } else { - cached = pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->sector + 1, - PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result4); - if (cached) { - memset(cached->u.aentry, 0, sizeof(pfs_inode_t)); - cached->u.aentry->aLen = sizeof(pfs_inode_t); - cached->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - result = result4; - } - - // Link new file with parent directory - if ((result == 0) && (cached = pfsDirAddEntry(parentInode, file, &fileInode->u.inode->inode_block, - mode, &result))) { - pfsInodeSetTime(parentInode); - cached->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(cached); - } - } - } -label: - pfsCacheFree(parentInode); - if ((result == 0) && freeSlot && fileInode) { - freeSlot->clink = fileInode; - if (openFlags & O_APPEND) - freeSlot->position = fileInode->u.inode->size; - else - freeSlot->position = 0; - - result = pfsBlockInitPos(freeSlot->clink, &freeSlot->block_pos, freeSlot->position); - if (result == 0) { - if ((openFlags & O_WRONLY) && - (fileInode->u.inode->attr & PFS_FIO_ATTR_CLOSED)) { - fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED; - fileInode->flags |= PFS_CACHE_FLAG_DIRTY; - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - if ((result = pfsFioCheckForLastError(pfsMount, result)) == 0) - return 0; - } - freeSlot->clink = NULL; - } - - if (fileInode) - pfsCacheFree(fileInode); - - return pfsFioCheckForLastError(pfsMount, result); -} - -// Reads unaligned data, or remainder data (size < 512) -static int fileTransferRemainder(pfs_file_slot_t *fileSlot, void *buf, int size, int operation) -{ - u32 sector, pos; - int result; - pfs_blockpos_t *blockpos = &fileSlot->block_pos; - pfs_mount_t *pfsMount = fileSlot->clink->pfsMount; - pfs_restsInfo_t *info = &fileSlot->restsInfo; - pfs_blockinfo_t *bi = pfsBlockGetCurrent(blockpos); - - sector = ((bi->number + blockpos->block_offset) << pfsMount->sector_scale) + - (blockpos->byte_offset >> 9); - pos = blockpos->byte_offset & 0x1FF; - - if ((info->sector != sector) || (info->sub != bi->subpart)) { - if (fileSlot->restsInfo.dirty) { - result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, info->sector, 1, 1); - if (result) - return result; - fileSlot->restsInfo.dirty = 0; - } - - info->sub = bi->subpart; - info->sector = sector; - - if (pos || (fileSlot->position != fileSlot->clink->u.inode->size)) { - result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, info->sector, 1, 0); - if (result) - return result | 0x10000; - } - } - - if (operation == 0) - memcpy(buf, fileSlot->restsBuffer + pos, size = min(size, 512 - (int)pos)); - else - memcpy(fileSlot->restsBuffer + pos, buf, size = min(size, 512 - (int)pos)); - - if (operation == 1) { - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) { - if ((result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->restsBuffer, info->sub, - info->sector, operation, operation))) - return result; - } else - info->dirty = operation; - } - return size; -} - -// Does actual read/write of data from file -static int fileTransfer(pfs_file_slot_t *fileSlot, u8 *buf, int size, int operation) -{ - int result = 0; - pfs_blockpos_t *blockpos = &fileSlot->block_pos; - pfs_mount_t *pfsMount = fileSlot->clink->pfsMount; - u32 bytes_remain; - u32 total = 0; - - // If we're writing and there is less free space in the last allocated block segment - // than can hold the data being written, then try and expand the block segment - if ((operation == 1) && - (fileSlot->clink->u.inode->number_data - 1 == blockpos->block_segment)) { - bytes_remain = (pfsBlockGetCurrent(blockpos)->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; //u32 - - if (bytes_remain < size) { - pfsBlockExpandSegment(fileSlot->clink, blockpos, - ((size - bytes_remain + pfsMount->zsize - 1) & (~(pfsMount->zsize - 1))) / pfsMount->zsize); - } - } - - while (size) { - pfs_blockinfo_t *bi; - u32 sectors; - - // Get block info for current file position - bi = pfsBlockGetCurrent(blockpos); - - // Get amount of remaining data in current block - bytes_remain = (bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; - - // If there is no space/data left in the current block segment, then we need to move onto the next - if (bytes_remain == 0) { - // If we're at the end of allocated block segments, then allocate a new block segment - if (blockpos->block_segment == fileSlot->clink->u.inode->number_data - 1) { - if (operation == 0) { - PFS_PRINTF(PFS_DRV_NAME " Panic: This is a bug!\n"); - return 0; - } - - result = pfsBlockAllocNewSegment(fileSlot->clink, blockpos, - (size - 1 + pfsMount->zsize) / pfsMount->zsize); - if (result < 0) - break; - - // Otherwise, move to the next block segment - } else if ((result = pfsBlockSeekNextSegment(fileSlot->clink, blockpos))) { - return result; - } - - bi = pfsBlockGetCurrent(blockpos); - bytes_remain = (bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset; - } - - if (bytes_remain == 0) { - PFS_PRINTF(PFS_DRV_NAME " Panic: There is no zone.\n"); - return 0; - } - - // If we are transferring size not a multiple of 512, under 512, or to - // an unaligned buffer we need to use a special function rather than - // just doing a ATA sector transfer. - if ((blockpos->byte_offset & 0x1FF) || (size < 512) || ((u32)buf & 3)) { - if ((result = fileTransferRemainder(fileSlot, buf, size, operation)) < 0) - break; - } else { - sectors = bytes_remain / 512; - if ((size / 512) < sectors) - sectors = size / 512; //sectors=min(size/512, sectors) - - // Do the ATA sector transfer - result = pfsMount->blockDev->transfer(pfsMount->fd, buf, bi->subpart, - ((bi->number + blockpos->block_offset) << pfsMount->sector_scale) + (blockpos->byte_offset / 512), - sectors, operation); - if (result < 0) { - result |= 0x10000; // TODO: EIO define - break; - } - result = sectors * 512; - } - - size -= result; - fileSlot->position += result; - buf += result; - total += result; - - // If file has grown, need to mark inode as dirty - if (fileSlot->clink->u.inode->size < fileSlot->position) { - fileSlot->clink->u.inode->size = fileSlot->position; - fileSlot->clink->flags |= PFS_CACHE_FLAG_DIRTY; - } - - blockpos->block_offset += pfsBlockSyncPos(blockpos, result); - } - return result < 0 ? result : total; -} - -int pfsFioInit(iop_device_t *f) -{ - iop_sema_t sema; - - sema.attr = 1; - sema.option = 0; - sema.initial = 1; - sema.max = 1; - - pfsFioSema = CreateSema(&sema); - - return 0; -} - -int pfsFioDeinit(iop_device_t *f) -{ - pfsFioDevctlCloseAll(); - - DeleteSema(pfsFioSema); - - return 0; -} - -int pfsFioFormat(iop_file_t *t, const char *dev, const char *blockdev, void *args, int arglen) -{ - int *arg = (int *)args; - int fragment = 0; - int fd; - pfs_block_device_t *blockDev; - int rv; - - // Has a fragment bit pattern been specified ? - if ((arglen == (3 * sizeof(int))) && (arg[1] == 0x2D66)) //arg[1] == "-f" - fragment = arg[2]; - - if ((blockDev = pfsGetBlockDeviceTable(blockdev)) == 0) - return -ENXIO; - - WaitSema(pfsFioSema); - - fd = open(blockdev, O_RDWR, 0644); - - if (fd < 0) - rv = fd; - else { - rv = pfsFormat(blockDev, fd, arg[0], fragment); - close(fd); - } - - SignalSema(pfsFioSema); - - return rv; -} - -int pfsFioOpen(iop_file_t *f, const char *name, int flags, int mode) -{ - int rv = 0; - u32 i; - pfs_file_slot_t *freeSlot; - pfs_mount_t *pfsMount; - - if (!name) - return -ENOENT; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) { - return -ENODEV; - } - - // Find free file slot - for (i = 0; i < pfsConfig.maxOpen; i++) { - if (!pfsFileSlots[i].fd) { - freeSlot = &pfsFileSlots[i]; - goto pfsOpen_slotFound; - } - } - - PFS_PRINTF(PFS_DRV_NAME " Error: There are no free file slots!\n"); - freeSlot = NULL; - -pfsOpen_slotFound: - - if (!freeSlot) { - rv = -EMFILE; - goto pfsOpen_end; - } - - // Do actual open - if ((rv = openFile(pfsMount, freeSlot, name, f->mode, (mode & 0xfff) | FIO_S_IFREG))) - goto pfsOpen_end; - - freeSlot->fd = f; - f->privdata = freeSlot; - -pfsOpen_end: - - SignalSema(pfsFioSema); - - return rv; -} - -int pfsFioClose(iop_file_t *f) -{ - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - int rv; - - rv = pfsFioCheckFileSlot(fileSlot); - if (rv) - return rv; - - pfsFioCloseFileSlot(fileSlot); - - SignalSema(pfsFioSema); - - return rv; -} - -int pfsFioRead(iop_file_t *f, void *buf, int size) -{ - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - int result = pfsFioCheckFileSlot(fileSlot); - - if (result) { - return result; - } - - // Check bounds, adjust size if necessary - if (fileSlot->clink->u.inode->size < (fileSlot->position + size)) - size = fileSlot->clink->u.inode->size - fileSlot->position; - - result = size ? fileTransfer(fileSlot, buf, size, 0) : 0; - result = pfsFioCheckForLastError(fileSlot->clink->pfsMount, result); - - SignalSema(pfsFioSema); - return result; -} - -int pfsFioWrite(iop_file_t *f, void *buf, int size) -{ - pfs_mount_t *pfsMount; - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - int result = pfsFioCheckFileSlot(fileSlot); - - if (result) - return result; - - pfsMount = fileSlot->clink->pfsMount; - - result = fileTransfer(fileSlot, buf, size, 1); - - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - - result = pfsFioCheckForLastError(pfsMount, result); - SignalSema(pfsFioSema); - return result; -} - -static s64 _seek(pfs_file_slot_t *fileSlot, s64 offset, int whence, int mode) -{ - int rv; - s64 startPos, newPos; - - if (mode & O_DIROPEN) { - return -EISDIR; - } - - switch (whence) { - case SEEK_SET: - startPos = 0; - break; - case SEEK_CUR: - startPos = fileSlot->position; - break; - case SEEK_END: - startPos = fileSlot->clink->u.inode->size; - break; - default: - return -EINVAL; - } - newPos = startPos + offset; - - if (((offset < 0) && (startPos < newPos)) || - ((offset > 0) && (startPos > newPos)) || - (fileSlot->clink->u.inode->size < newPos)) { - return -EINVAL; - } - - pfsCacheFree(fileSlot->block_pos.inode); - rv = pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, newPos); - if (rv == 0) - fileSlot->position = newPos; - else { - fileSlot->position = 0; - pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, 0); - } - - if (rv) { - return rv; - } - - return newPos; -} - -int pfsFioLseek(iop_file_t *f, int pos, int whence) -{ - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - int result = pfsFioCheckFileSlot(fileSlot); - - if (result) - return result; - - result = (u32)_seek(fileSlot, (s64)pos, whence, f->mode); - - SignalSema(pfsFioSema); - return result; -} - -s64 pfsFioLseek64(iop_file_t *f, s64 offset, int whence) -{ - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - u64 rv; - - rv = pfsFioCheckFileSlot(fileSlot); - if (!rv) { - rv = _seek(fileSlot, offset, whence, f->mode); - SignalSema(pfsFioSema); - } - return rv; -} - -static int _remove(pfs_mount_t *pfsMount, const char *path, int mode) -{ - char szPath[256]; - int rv = 0; - pfs_cache_t *parent; - pfs_cache_t *file; - - if ((parent = pfsInodeGetParent(pfsMount, NULL, path, szPath, &rv)) == NULL) - return rv; - - if ((file = pfsInodeGetFileInDir(parent, szPath, &rv)) != NULL) { - if (mode != 0) { // remove dir - if ((file->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - rv = -ENOTDIR; - else if (pfsCheckDirForFiles(file) == 0) - rv = -ENOTEMPTY; - else if (((u16)file->u.inode->inode_block.number == pfsMount->root_dir.number) && - ((u16)file->u.inode->inode_block.subpart == pfsMount->root_dir.subpart)) - rv = -EBUSY; - else if (((u16)file->u.inode->inode_block.number == pfsMount->current_dir.number) && - ((u16)file->u.inode->inode_block.subpart == pfsMount->current_dir.subpart)) - rv = -EBUSY; - } else // just a file - if ((file->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) - rv = -EISDIR; - - if (rv == 0) { - if (file->u.inode->uid != 0) - rv = pfsCheckAccess(file, 2); - if (file->nused >= 2) - rv = -EBUSY; - if (rv == 0) - return pfsInodeRemove(parent, file, szPath); - } - pfsCacheFree(file); - } - pfsCacheFree(parent); - return pfsFioCheckForLastError(pfsMount, rv); -} - -int pfsFioRemove(iop_file_t *f, const char *name) -{ - pfs_mount_t *pfsMount; - int rv; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - rv = _remove(pfsMount, name, 0); - - SignalSema(pfsFioSema); - - return rv; -} - -int pfsFioMkdir(iop_file_t *f, const char *path, int mode) -{ - pfs_mount_t *pfsMount; - int rv; - - mode = (mode & 0xfff) | 0x10000 | FIO_S_IFDIR; // TODO: change to some constant/macro - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - rv = openFile(pfsMount, NULL, path, O_CREAT | O_WRONLY, mode); - - SignalSema(pfsFioSema); - - return rv; -} - -int pfsFioRmdir(iop_file_t *f, const char *path) -{ - pfs_mount_t *pfsMount; - const char *temp; - int rv; - - temp = path + strlen(path); - if (*temp == '.') - return -EINVAL; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - rv = _remove(pfsMount, path, 0x01); // TODO: constant for 0x01 ? - - SignalSema(pfsFioSema); - - return rv; -} - -int pfsFioDopen(iop_file_t *f, const char *name) -{ - return pfsFioOpen(f, name, 0, 0); -} - -int pfsFioDread(iop_file_t *f, iox_dirent_t *dirent) -{ - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - pfs_blockinfo_t bi; - int result; - int rv; - - rv = pfsFioCheckFileSlot(fileSlot); - if (rv < 0) - return rv; - - pfsMount = fileSlot->clink->pfsMount; - - if ((fileSlot->clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) { - rv = -ENOTDIR; - } else if ((rv = pfsGetNextDentry(fileSlot->clink, &fileSlot->block_pos, (u32 *)&fileSlot->position, - dirent->name, &bi)) > 0) { - - clink = pfsInodeGetData(pfsMount, bi.subpart, bi.number, &result); - if (clink != NULL) { - fioStatFiller(clink, &dirent->stat); - pfsCacheFree(clink); - } - - if (result) - rv = result; - } - - rv = pfsFioCheckForLastError(pfsMount, rv); - SignalSema(pfsFioSema); - - return rv; -} - -static void fioStatFiller(pfs_cache_t *clink, iox_stat_t *stat) -{ - stat->mode = clink->u.inode->mode; - stat->attr = clink->u.inode->attr; - stat->size = (u32)clink->u.inode->size; - stat->hisize = (u32)(clink->u.inode->size >> 32); - memcpy(&stat->ctime, &clink->u.inode->ctime, sizeof(pfs_datetime_t)); - memcpy(&stat->atime, &clink->u.inode->atime, sizeof(pfs_datetime_t)); - memcpy(&stat->mtime, &clink->u.inode->mtime, sizeof(pfs_datetime_t)); - stat->private_0 = clink->u.inode->uid; - stat->private_1 = clink->u.inode->gid; - stat->private_2 = clink->u.inode->number_blocks; - stat->private_3 = clink->u.inode->number_data; - stat->private_4 = 0; - stat->private_5 = 0; -} - -int pfsFioGetstat(iop_file_t *f, const char *name, iox_stat_t *stat) -{ - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - int rv = 0; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - clink = pfsInodeGetFile(pfsMount, NULL, name, &rv); - if (clink != NULL) { - fioStatFiller(clink, stat); - pfsCacheFree(clink); - } - - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, rv); -} - -int pfsFioChstat(iop_file_t *f, const char *name, iox_stat_t *stat, unsigned int statmask) -{ - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - int rv = 0; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - clink = pfsInodeGetFile(pfsMount, NULL, name, &rv); - if (clink != NULL) { - - rv = pfsCheckAccess(clink, 0x02); - if (rv == 0) { - - clink->flags |= PFS_CACHE_FLAG_DIRTY; - - if ((statmask & FIO_CST_MODE) && ((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFLNK)) - clink->u.inode->mode = (clink->u.inode->mode & FIO_S_IFMT) | (stat->mode & 0xfff); - if (statmask & FIO_CST_ATTR) - clink->u.inode->attr = (clink->u.inode->attr & 0xA0) | (stat->attr & 0xFF5F); - if (statmask & FIO_CST_SIZE) - rv = -EACCES; - if (statmask & FIO_CST_CT) - memcpy(&clink->u.inode->ctime, stat->ctime, sizeof(pfs_datetime_t)); - if (statmask & FIO_CST_AT) - memcpy(&clink->u.inode->atime, stat->atime, sizeof(pfs_datetime_t)); - if (statmask & FIO_CST_MT) - memcpy(&clink->u.inode->mtime, stat->mtime, sizeof(pfs_datetime_t)); - if (statmask & FIO_CST_PRVT) { - clink->u.inode->uid = stat->private_0; - clink->u.inode->gid = stat->private_1; - } - - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - - pfsCacheFree(clink); - } - - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, rv); -} - -int pfsFioRename(iop_file_t *ff, const char *old, const char *new) -{ - char path1[256], path2[256]; - int result = 0; - pfs_mount_t *pfsMount; - int f; - pfs_cache_t *parentOld = NULL, *parentNew = NULL; - pfs_cache_t *removeOld = NULL, *removeNew = NULL; - pfs_cache_t *iFileOld = NULL, *iFileNew = NULL; - pfs_cache_t *newParent = NULL, *addNew = NULL; - - pfsMount = pfsFioGetMountedUnit(ff->unit); - if (pfsMount == 0) - return -ENODEV; - - parentOld = pfsInodeGetParent(pfsMount, NULL, old, path1, &result); - if (parentOld) { - u32 nused = parentOld->nused; - - if (nused != 1) { - result = -EBUSY; - goto exit; - } - - if ((iFileOld = pfsInodeGetFileInDir(parentOld, path1, &result)) == 0) - goto exit; - - if ((parentNew = pfsInodeGetParent(pfsMount, NULL, new, path2, &result)) == 0) - goto exit; - - f = (iFileOld->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR; - - if ((parentNew->nused != nused) && ((parentOld != parentNew) || (parentNew->nused != 2))) { - result = -EBUSY; - goto exit; - } - - iFileNew = pfsInodeGetFileInDir(parentNew, path2, &result); - if (iFileNew) { - if (f) { - if ((iFileNew->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - result = -ENOTDIR; - else if (pfsCheckDirForFiles(iFileNew)) { - if (iFileNew->nused >= 2) - result = -EBUSY; - else { - if (iFileOld == iFileNew) - goto exit; - } - } else - result = -ENOTEMPTY; - } else if ((iFileNew->u.inode->mode & FIO_S_IFMT) == FIO_S_IFDIR) - result = -EISDIR; - else if (iFileNew->nused >= 2) - result = -EBUSY; - else { - if (iFileOld == iFileNew) - goto exit; - } - } else if (result == -ENOENT) - result = 0; - - if (result) - goto exit; - - if (f && (parentOld != parentNew)) { - pfs_cache_t *parent; - - parent = pfsCacheUsedAdd(parentNew); - do { - pfs_cache_t *tmp; - - if (parent == iFileOld) { - result = -EINVAL; - break; - } - tmp = pfsInodeGetFileInDir(parent, "..", &result); - pfsCacheFree(parent); - if (tmp == parent) - break; - parent = tmp; - } while (parent); - pfsCacheFree(parent); - } - - if (result == 0) { - if (strcmp(path1, ".") && strcmp(path1, "..") && - strcmp(path2, ".") && strcmp(path2, "..")) { - result = pfsCheckAccess(parentOld, 3); - if (result == 0) - result = pfsCheckAccess(parentNew, 3); - } else - result = -EINVAL; - - if (result == 0) { - if (iFileNew && ((removeNew = pfsDirRemoveEntry(parentNew, path2)) == NULL)) - result = -ENOENT; - else { - removeOld = pfsDirRemoveEntry(parentOld, path1); - if (removeOld == 0) - result = -ENOENT; - else { - addNew = pfsDirAddEntry(parentNew, path2, &iFileOld->u.inode->inode_block, iFileOld->u.inode->mode, &result); - if (addNew && f && (parentOld != parentNew)) - newParent = pfsSetDentryParent(iFileOld, &parentNew->u.inode->inode_block, &result); - } - } - } - } - - if (result) { - if (removeNew) - removeNew->pfsMount = NULL; - if (removeOld) - removeOld->pfsMount = NULL; - if (addNew) - addNew->pfsMount = NULL; - if (iFileNew) - iFileNew->pfsMount = NULL; - parentOld->pfsMount = NULL; - parentNew->pfsMount = NULL; - } else { - if (parentOld == parentNew) { - if (removeOld != addNew) - removeOld->flags |= PFS_CACHE_FLAG_DIRTY; - } else { - pfsInodeSetTime(parentOld); - removeOld->flags |= PFS_CACHE_FLAG_DIRTY; - } - pfsInodeSetTime(parentNew); - addNew->flags |= PFS_CACHE_FLAG_DIRTY; - - if (newParent) { - pfsInodeSetTime(iFileOld); - newParent->flags |= PFS_CACHE_FLAG_DIRTY; - pfsCacheFree(newParent); - } - - if (iFileNew) { - iFileNew->flags &= ~PFS_CACHE_FLAG_DIRTY; - pfsBitmapFreeInodeBlocks(iFileNew); - } - - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - } - if (removeOld) - pfsCacheFree(removeOld); - if (addNew) - pfsCacheFree(addNew); - if (removeNew) - pfsCacheFree(removeNew); - exit: - if (iFileNew) - pfsCacheFree(iFileNew); - pfsCacheFree(iFileOld); - pfsCacheFree(parentOld); - pfsCacheFree(parentNew); - } - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, result); -} - -int pfsFioChdir(iop_file_t *f, const char *name) -{ - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - int result = 0; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - clink = pfsInodeGetFile(pfsMount, 0, name, &result); - if (clink != NULL) { - if ((clink->u.inode->mode & FIO_S_IFMT) != FIO_S_IFDIR) - result = -ENOTDIR; - else { - - result = pfsCheckAccess(clink, 0x01); - - if (result == 0) - memcpy(&pfsMount->current_dir, &clink->u.inode->inode_block, sizeof(pfs_blockinfo_t)); - } - - pfsCacheFree(clink); - } - - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, result); -} - -static void _sync(void) -{ - u32 i; - for (i = 0; i < pfsConfig.maxOpen; i++) { - pfs_restsInfo_t *info = &pfsFileSlots[i].restsInfo; - if (info->dirty) { - pfs_mount_t *pfsMount = pfsFileSlots[i].clink->pfsMount; - pfsMount->blockDev->transfer(pfsMount->fd, &pfsFileSlots[i].restsBuffer, - info->sub, info->sector, 1, PFS_IO_MODE_WRITE); - pfsFileSlots[i].restsInfo.dirty = 0; - } - } -} - -int pfsFioSync(iop_file_t *f, const char *dev, int flag) -{ - pfs_mount_t *pfsMount; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - _sync(); - pfsCacheFlushAllDirty(pfsMount); - - SignalSema(pfsFioSema); - return pfsFioCheckForLastError(pfsMount, 0); -} - -int pfsFioMount(iop_file_t *f, const char *fsname, const char *devname, int flag, void *arg, int arglen) -{ - int rv; - int fd; - pfs_block_device_t *blockDev; - - if (!(blockDev = pfsGetBlockDeviceTable(devname))) - return -ENXIO; - - WaitSema(pfsFioSema); - - fd = open(devname, (flag & FIO_MT_RDONLY) ? O_RDONLY : O_RDWR, 0644); // ps2hdd.irx fd - if (fd < 0) - rv = fd; - else { - if ((rv = mountDevice(blockDev, fd, f->unit, flag)) < 0) - close(fd); - } - SignalSema(pfsFioSema); - return rv; -} - -int pfsFioUmount(iop_file_t *f, const char *fsname) -{ - u32 i; - int rv = 0; - int busy_flag = 0; - pfs_mount_t *pfsMount; - - if ((pfsMount = pfsFioGetMountedUnit(f->unit)) == NULL) - return -ENODEV; - - for (i = 0; i < pfsConfig.maxOpen; i++) { - if ((pfsFileSlots[i].clink != NULL) && (pfsFileSlots[i].clink->pfsMount == pfsMount)) { - busy_flag = 1; - break; - } - } - if (busy_flag == 0) { - pfsCacheClose(pfsMount); - close(pfsMount->fd); - pfsClearMount(pfsMount); - } else - rv = -EBUSY; // Mount device busy - - SignalSema(pfsFioSema); - return rv; -} - -int pfsFioSymlink(iop_file_t *f, const char *old, const char *new) -{ - int rv; - pfs_mount_t *pfsMount; - int mode = 0x141FF; - - if (old == NULL || new == NULL) - return -ENOENT; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - rv = openFile(pfsMount, (pfs_file_slot_t *)old, (const char *)new, O_CREAT | O_WRONLY, mode); - SignalSema(pfsFioSema); - return rv; -} - -int pfsFioReadlink(iop_file_t *f, const char *path, char *buf, int buflen) -{ - int rv = 0; - pfs_mount_t *pfsMount; - pfs_cache_t *clink; - - if (buflen < 0) - return -EINVAL; - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - if ((clink = pfsInodeGetFile(pfsMount, NULL, path, &rv)) != NULL) { - if ((clink->u.inode->mode & FIO_S_IFMT) == FIO_S_IFLNK) - rv = -EINVAL; - else { - rv = strlen((char *)&clink->u.inode->data[1]); - if (buflen < rv) - rv = buflen; - memcpy(buf, &clink->u.inode->data[1], rv); - } - pfsCacheFree(clink); - } - SignalSema(pfsFioSema); - - return pfsFioCheckForLastError(pfsMount, rv); -} - -int pfsFioUnsupported(void) -{ - PFS_PRINTF(PFS_DRV_NAME " Error: Operation currently unsupported.\n"); - - return -1; -} diff --git a/modules/hdd/pfs/pfs_fio.h b/modules/hdd/pfs/pfs_fio.h deleted file mode 100644 index c0dafa921..000000000 --- a/modules/hdd/pfs/pfs_fio.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -*/ - -#ifndef _PFS_FIO_H -#define _PFS_FIO_H - -#define PFS_FDIRO (0x0008) /* internal use for dopen */ - -/////////////////////////////////////////////////////////////////////////////// -// Function declarations - -int pfsFioCheckForLastError(pfs_mount_t *pfsMount, int rv); -int pfsFioCheckFileSlot(pfs_file_slot_t *fileSlot); -pfs_mount_t *pfsFioGetMountedUnit(int unit); -void pfsFioCloseFileSlot(pfs_file_slot_t *fileSlot); - -/////////////////////////////////////////////////////////////////////////////// -// I/O functions - -int pfsFioInit(iop_device_t *f); -int pfsFioDeinit(iop_device_t *f); -int pfsFioFormat(iop_file_t *, const char *dev, const char *blockdev, void *arg, int arglen); -int pfsFioOpen(iop_file_t *f, const char *name, int flags, int mode); -int pfsFioClose(iop_file_t *f); -int pfsFioRead(iop_file_t *f, void *buf, int size); -int pfsFioWrite(iop_file_t *f, void *buf, int size); -int pfsFioLseek(iop_file_t *f, int pos, int whence); -int pfsFioRemove(iop_file_t *f, const char *name); -int pfsFioMkdir(iop_file_t *f, const char *path, int mode); -int pfsFioRmdir(iop_file_t *f, const char *path); -int pfsFioDopen(iop_file_t *f, const char *name); -int pfsFioDclose(iop_file_t *f); -int pfsFioDread(iop_file_t *f, iox_dirent_t *buf); -int pfsFioGetstat(iop_file_t *f, const char *name, iox_stat_t *stat); -int pfsFioChstat(iop_file_t *f, const char *name, iox_stat_t *stat, unsigned int statmask); -int pfsFioRename(iop_file_t *f, const char *old, const char *new); -int pfsFioChdir(iop_file_t *f, const char *name); -int pfsFioSync(iop_file_t *f, const char *dev, int flag); -int pfsFioMount(iop_file_t *f, const char *fsname, const char *devname, int flag, void *arg, int arglen); -int pfsFioUmount(iop_file_t *f, const char *fsname); -s64 pfsFioLseek64(iop_file_t *f, s64 offset, int whence); -int pfsFioSymlink(iop_file_t *f, const char *old, const char *new); -int pfsFioReadlink(iop_file_t *f, const char *path, char *buf, int buflen); - -int pfsFioUnsupported(void); - -#endif /* _PFS_FIO_H */ diff --git a/modules/hdd/pfs/pfs_fioctl.c b/modules/hdd/pfs/pfs_fioctl.c deleted file mode 100644 index cd3a7b6d9..000000000 --- a/modules/hdd/pfs/pfs_fioctl.c +++ /dev/null @@ -1,341 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# PFS ioctl and devctl related routines -*/ - -#include -#include -#include -#include -#include -#include -#include "opl-hdd-ioctl.h" - -#include "pfs-opt.h" -#include "libpfs.h" -#include "pfs.h" -#include "pfs_fio.h" -#include "pfs_fioctl.h" - -extern pfs_config_t pfsConfig; -extern int pfsFioSema; -extern pfs_file_slot_t *pfsFileSlots; - -/////////////////////////////////////////////////////////////////////////////// -// Function declarations - -static int devctlFsckStat(pfs_mount_t *pfsMount, int mode); - -static int ioctl2Attr(pfs_cache_t *clink, int cmd, void *arg, void *outbuf, u32 *offset); -static pfs_aentry_t *getAentry(pfs_cache_t *clink, char *key, char *value, int mode); -static int ioctl2AttrAdd(pfs_cache_t *clink, pfs_ioctl2attr_t *attr); -static int ioctl2AttrDelete(pfs_cache_t *clink, void *arg); -static int ioctl2AttrLoopUp(pfs_cache_t *clink, char *key, char *value); -static int ioctl2AttrRead(pfs_cache_t *clink, pfs_ioctl2attr_t *attr, u32 *unkbuf); - -int pfsFioIoctl(iop_file_t *f, int cmd, void *param) -{ - return -1; -} - -int pfsFioDevctl(iop_file_t *f, const char *name, int cmd, void *arg, size_t arglen, void *buf, size_t buflen) -{ - pfs_mount_t *pfsMount; - int rv = 0; - - if (!(pfsMount = pfsFioGetMountedUnit(f->unit))) - return -ENODEV; - - switch (cmd) { - case PDIOC_ZONESZ: - rv = pfsMount->zsize; - break; - - case PDIOC_ZONEFREE: - rv = pfsMount->zfree; - break; - - case PDIOC_CLOSEALL: - pfsFioDevctlCloseAll(); - break; - - case PDIOC_CLRFSCKSTAT: - rv = devctlFsckStat(pfsMount, PFS_MODE_REMOVE_FLAG); - break; - - case PDIOC_GETFSCKSTAT: - rv = devctlFsckStat(pfsMount, PFS_MODE_CHECK_FLAG); - break; - - case PDIOC_SETUID: - pfsMount->uid = *(u16 *)(arg); - break; - - case PDIOC_SETGID: - pfsMount->gid = *(u16 *)(arg); - break; - - case PDIOC_SHOWBITMAP: - pfsBitmapShow(pfsMount); - break; - - default: - rv = -EINVAL; - break; - } - SignalSema(pfsFioSema); - - return rv; -} - -int pfsFioIoctl2(iop_file_t *f, int cmd, void *arg, size_t arglen, void *buf, size_t buflen) -{ - int rv; - pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; - pfs_mount_t *pfsMount; - - if (f->mode & O_DIROPEN) - if (cmd == PIOCATTRREAD) - return -EISDIR; - - if (!(f->mode & O_WRONLY)) { - if (cmd != PIOCATTRLOOKUP) - if (cmd != PIOCATTRREAD) - return -EACCES; - } - if ((rv = pfsFioCheckFileSlot(fileSlot)) < 0) - return rv; - pfsMount = fileSlot->clink->pfsMount; - - switch (cmd) { - case PIOCALLOC: - rv = pfsAllocZones(fileSlot->clink, *(int *)(arg), 1); - break; - - case PIOCFREE: - pfsFreeZones(fileSlot->clink); - break; - - case PIOCATTRADD: - case PIOCATTRDEL: - case PIOCATTRLOOKUP: - case PIOCATTRREAD: - rv = ioctl2Attr(fileSlot->clink, cmd, arg, buf, &fileSlot->aentryOffset); - break; - - // Custom IOCTL2 command(s) for OPL - case PFS_IOCTL2_GET_INODE: - memcpy(buf, fileSlot->clink->u.inode, sizeof(pfs_inode_t)); - rv = sizeof(pfs_inode_t); - break; - - default: - rv = -EINVAL; - break; - } - - if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) - pfsCacheFlushAllDirty(pfsMount); - rv = pfsFioCheckForLastError(pfsMount, rv); - SignalSema(pfsFioSema); - - return rv; -} - -static int ioctl2Attr(pfs_cache_t *clink, int cmd, void *arg, void *outbuf, u32 *offset) -{ // attr set, attr delete, attr lookup, attr read cmds - int rv; - pfs_cache_t *flink; - - if ((flink = pfsCacheGetData(clink->pfsMount, clink->sub, clink->sector + 1, PFS_CACHE_FLAG_NOTHING, &rv)) == NULL) - return rv; - - switch (cmd) { - case PIOCATTRADD: - rv = ioctl2AttrAdd(flink, arg); - break; - - case PIOCATTRDEL: - rv = ioctl2AttrDelete(flink, arg); - break; - - case PIOCATTRLOOKUP: - rv = ioctl2AttrLoopUp(flink, arg, outbuf); - break; - - case PIOCATTRREAD: - rv = ioctl2AttrRead(flink, outbuf, offset); - break; - } - pfsCacheFree(flink); - - return rv; -} - -void pfsFioDevctlCloseAll(void) -{ - u32 i; - - for (i = 0; i < pfsConfig.maxOpen; i++) { - if (pfsFileSlots[i].fd) - pfsFioCloseFileSlot(&pfsFileSlots[i]); - } - for (i = 0; i < pfsConfig.maxOpen; i++) { - pfs_mount_t *pfsMount; - if ((pfsMount = pfsGetMountedUnit(i)) != NULL) - pfsCacheFlushAllDirty(pfsMount); - } -} - -static int devctlFsckStat(pfs_mount_t *pfsMount, int mode) -{ - int rv; - pfs_cache_t *clink; - - if ((clink = pfsCacheAllocClean(&rv)) != NULL) { - rv = pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_ERRORS_FIXED, mode); - pfsCacheFree(clink); - } - return rv; -} - -static pfs_aentry_t *getAentry(pfs_cache_t *clink, char *key, char *value, int mode) -{ // mode 0=lookup, 1=add, 2=delete - int kLen, fullsize; - pfs_aentry_t *aentry = clink->u.aentry; - pfs_aentry_t *aentryLast = NULL; - pfs_aentry_t *end; - - kLen = strlen(key); - fullsize = (kLen + strlen(value) + 7) & ~3; - for (end = (pfs_aentry_t *)((u8 *)aentry + 1024); end < aentry; aentry = (pfs_aentry_t *)((u8 *)aentry + aentry->aLen)) { - if (aentry->aLen & 3) - PFS_PRINTF(PFS_DRV_NAME " Error: attrib-entry allocated length/4 != 0\n"); - if (aentry->aLen < ((aentry->kLen + aentry->vLen + 7) & ~3)) { - PFS_PRINTF(PFS_DRV_NAME " Panic: attrib-entry is too small\n"); - return NULL; - } - if (end < (pfs_aentry_t *)((u8 *)aentry + aentry->aLen)) - PFS_PRINTF(PFS_DRV_NAME " Error: attrib-entry too big\n"); - - switch (mode) { - case 0: // lookup - if (kLen == aentry->kLen) - if (memcmp(key, aentry->str, kLen) == 0) - return aentry; - break; - - case 1: // add - if (aentry->kLen == 0) { - if (aentry->aLen >= fullsize) - return aentry; - } - if (aentry->aLen - ((aentry->kLen + aentry->vLen + 7) & ~3) < fullsize) - continue; - return aentry; - - default: // delete - if (kLen == aentry->kLen) { - if (memcmp(key, aentry->str, kLen) == 0) { - if (aentryLast != NULL) { - aentryLast->aLen += aentry->aLen; - return aentry; - } - // delete it :P - aentry->kLen = 0; - aentry->vLen = 0; - return aentry; - } - } - aentryLast = aentry; - break; - } - } - return NULL; -} - -static int ioctl2AttrAdd(pfs_cache_t *clink, pfs_ioctl2attr_t *attr) -{ - u32 kLen, vLen; - pfs_aentry_t *aentry; - u32 tmp; - - // input check - kLen = strlen(attr->key); - vLen = strlen(attr->value); - if (kLen >= 256 || vLen >= 256) // max size safe e check - return -EINVAL; - - if (kLen == 0 || vLen == 0) // no input check - return -EINVAL; - - if (getAentry(clink, attr->key, NULL, 0)) - return -EEXIST; - if (!(aentry = getAentry(clink, attr->key, attr->value, 1))) - return -ENOSPC; - - if (aentry->kLen == 0) - tmp = aentry->aLen; - else - tmp = aentry->aLen - ((aentry->kLen + (aentry->vLen + 7)) & ~3); - - aentry->aLen -= tmp; - aentry = (pfs_aentry_t *)((u8 *)aentry + aentry->aLen); - aentry->kLen = kLen; - aentry->vLen = vLen; - aentry->aLen = tmp; - memcpy(&aentry->str[0], attr->key, aentry->kLen); - memcpy(&aentry->str[aentry->kLen], attr->value, aentry->vLen); - clink->flags |= PFS_CACHE_FLAG_DIRTY; - - return 0; -} - -static int ioctl2AttrDelete(pfs_cache_t *clink, void *arg) -{ - pfs_aentry_t *aentry; - - if ((aentry = getAentry(clink, arg, 0, 2)) == NULL) - return -ENOENT; - clink->flags |= PFS_CACHE_FLAG_DIRTY; - return 0; -} - -static int ioctl2AttrLoopUp(pfs_cache_t *clink, char *key, char *value) -{ - pfs_aentry_t *aentry; - - if ((aentry = getAentry(clink, key, 0, 0))) { - memcpy(value, &aentry->str[aentry->kLen], aentry->vLen); - value[aentry->vLen] = 0; - return aentry->vLen; - } - return -ENOENT; -} - -static int ioctl2AttrRead(pfs_cache_t *clink, pfs_ioctl2attr_t *attr, u32 *offset) -{ - pfs_aentry_t *aentry; - - if (*offset >= 1024) - return 0; - do { - aentry = (pfs_aentry_t *)((u8 *)clink->u.inode + *offset); - memcpy(attr->key, &aentry->str[0], aentry->kLen); - attr->key[aentry->kLen] = 0; - memcpy(attr->value, &aentry->str[aentry->kLen], aentry->vLen); - attr->value[aentry->vLen] = 0; - *offset += aentry->aLen; // next - if (aentry->kLen != 0) - break; - } while (*offset < 1024); - - return aentry->kLen; -} diff --git a/modules/hdd/pfs/pfs_fioctl.h b/modules/hdd/pfs/pfs_fioctl.h deleted file mode 100644 index 8455ce180..000000000 --- a/modules/hdd/pfs/pfs_fioctl.h +++ /dev/null @@ -1,23 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -*/ - -#ifndef _PFS_FIOCTL_H -#define _PFS_FIOCTL_H - -/////////////////////////////////////////////////////////////////////////////// -// Function declarations - -int pfsFioIoctl(iop_file_t *f, int cmd, void *param); -int pfsFioIoctl2(iop_file_t *f, int cmd, void *arg, size_t arglen, void *buf, size_t buflen); -int pfsFioDevctl(iop_file_t *f, const char *name, int cmd, void *arg, size_t arglen, void *buf, size_t buflen); - -void pfsFioDevctlCloseAll(void); - -#endif /* _PFS_FIOCTL_H */ diff --git a/modules/dev9/Makefile b/modules/hdd/xhdd/Makefile old mode 100755 new mode 100644 similarity index 55% rename from modules/dev9/Makefile rename to modules/hdd/xhdd/Makefile index 0d1f3f410..79d16aceb --- a/modules/dev9/Makefile +++ b/modules/hdd/xhdd/Makefile @@ -2,31 +2,23 @@ # ____| | ____| | | |____| # | ___| |____ ___| ____| | \ PS2DEV Open Source Project. #----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. # -# $Id: $ -IOP_BIN = ps2dev9.irx +IOP_BIN = xhdd.irx +IOP_OBJS = xhdd.o xatad.o hdpro.o imports.o -IOP_INCS += -IOP_CFLAGS += -Wall -fno-builtin-printf -DCHECK_LOADED -DDEV9X_DEV -DPOWEROFF -DPCMCIA #-DDEBUG +IOP_CFLAGS += -Wall -fno-builtin $(DEBUG_FLAGS) IOP_LDFLAGS += -s - -IOP_OBJS = ps2dev9.o exports.o imports.o -IOP_LIBS = +IOP_INCS += -I../common all: $(IOP_BIN) clean: - rm -f $(IOP_BIN) $(IOP_OBJS) + -rm -f $(IOP_OBJS) $(IOP_BIN) rebuild: clean all -run: - ps2client -t 1 execiop host:$(IOP_BIN) - - include $(PS2SDK)/Defs.make -include ../Rules.make +include ../../Rules.make diff --git a/modules/hdd/xhdd/hdpro.c b/modules/hdd/xhdd/hdpro.c new file mode 100644 index 000000000..2d056fd2d --- /dev/null +++ b/modules/hdd/xhdd/hdpro.c @@ -0,0 +1,11 @@ +#include +#include +#include + +#include "opl-hdd-ioctl.h" +#include "xhdd.h" + +int hdproata_device_set_transfer_mode(int device, int type, int mode) +{ + return 0; +} diff --git a/modules/hdd/xhdd/imports.lst b/modules/hdd/xhdd/imports.lst new file mode 100644 index 000000000..cb4a4f8ce --- /dev/null +++ b/modules/hdd/xhdd/imports.lst @@ -0,0 +1,13 @@ +atad_IMPORTS_start +I_ata_get_devinfo +I_ata_io_start +I_ata_io_finish +atad_IMPORTS_end + +ioman_IMPORTS_start +I_AddDrv +ioman_IMPORTS_end + +sysclib_IMPORTS_start +I_strcmp +sysclib_IMPORTS_end diff --git a/modules/hdd/xhdd/irx_imports.h b/modules/hdd/xhdd/irx_imports.h new file mode 100644 index 000000000..0621ee3aa --- /dev/null +++ b/modules/hdd/xhdd/irx_imports.h @@ -0,0 +1,10 @@ +#ifndef IOP_IRX_IMPORTS_H +#define IOP_IRX_IMPORTS_H + +#include + +#include +#include +#include + +#endif diff --git a/modules/hdd/xhdd/xatad.c b/modules/hdd/xhdd/xatad.c new file mode 100644 index 000000000..de3ca649c --- /dev/null +++ b/modules/hdd/xhdd/xatad.c @@ -0,0 +1,80 @@ +#include +#include +#include + +#include "opl-hdd-ioctl.h" +#include "xhdd.h" + +static void ata_multiword_dma_mode(int mode) +{ + USE_SPD_REGS; + u16 val; + + switch(mode){ + case 1: + val = 0x45; + break; + case 2: + val = 0x24; + break; + default: + val = 0xff; + } + + SPD_REG16(SPD_R_MWDMA_MODE) = val; + SPD_REG16(SPD_R_IF_CTRL) = (SPD_REG16(SPD_R_IF_CTRL) & 0xfffe)|0x48; +} + +static void ata_ultra_dma_mode(int mode) +{ + USE_SPD_REGS; + u16 val; + + switch (mode) + { + case 1: + val = 0x85; + break; + case 2: + val = 0x63; + break; + case 3: + val = 0x62; + break; + case 4: + val = 0x61; + break; + default: + val = 0xa7; + } + + SPD_REG16(SPD_R_UDMA_MODE) = val; + SPD_REG16(SPD_R_IF_CTRL) |= 0x49; +} + +/* Set features - set transfer mode. */ +int ata_device_set_transfer_mode(int device, int type, int mode) +{ + int res; + + res = ata_io_start(NULL, 1, 3, (type|mode) & 0xff, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SET_FEATURES); + if (res) + return res; + + res = ata_io_finish(); + if (res) + return res; + + //Note: PIO is not supported by ata_device_sector_io. + switch(type) + { + case ATA_XFER_MODE_MDMA: + ata_multiword_dma_mode(mode); + break; + case ATA_XFER_MODE_UDMA: + ata_ultra_dma_mode(mode); + break; + } + + return 0; +} diff --git a/modules/hdd/xhdd/xhdd.c b/modules/hdd/xhdd/xhdd.c new file mode 100644 index 000000000..cdef4a9c6 --- /dev/null +++ b/modules/hdd/xhdd/xhdd.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include +#include + +#include "opl-hdd-ioctl.h" +#include "xhdd.h" + +#define MODNAME "xhdd" +IRX_ID(MODNAME, 1, 1); + +static int isHDPro; + +static int xhddInit(iop_device_t *device) +{ + return 0; +} + +static int xhddUnsupported(void) +{ + return -1; +} + +static int xhddDevctl(iop_file_t *fd, const char *name, int cmd, void *arg, unsigned int arglen, void *buf, unsigned int buflen) +{ + ata_devinfo_t *devinfo; + + if(fd->unit >= 2) + return -ENXIO; + + switch(cmd) + { + case ATA_DEVCTL_IS_48BIT: + return((devinfo = ata_get_devinfo(fd->unit)) != NULL ? devinfo->lba48 : -1); + case ATA_DEVCTL_SET_TRANSFER_MODE: + if(!isHDPro) + return ata_device_set_transfer_mode(fd->unit, ((hddAtaSetMode_t*)arg)->type, ((hddAtaSetMode_t*)arg)->mode); + else + return hdproata_device_set_transfer_mode(fd->unit, ((hddAtaSetMode_t*)arg)->type, ((hddAtaSetMode_t*)arg)->mode); + default: + return -EINVAL; + } +} + +static iop_device_ops_t xhdd_ops={ + &xhddInit, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + (void*)&xhddUnsupported, + &xhddDevctl, +}; + +static iop_device_t xhddDevice = { + "xhdd", + IOP_DT_BLOCK | IOP_DT_FSEXT, + 1, + "XHDD", + &xhdd_ops +}; + +int _start(int argc, char *argv[]) +{ + int i; + + isHDPro = 0; + for(i = 1; i < argc; i++) + { + if(!strcmp(argv[i], "-hdpro")) + isHDPro = 1; + } + + return AddDrv(&xhddDevice) == 0 ? MODULE_RESIDENT_END : MODULE_NO_RESIDENT_END; +} diff --git a/modules/hdd/xhdd/xhdd.h b/modules/hdd/xhdd/xhdd.h new file mode 100644 index 000000000..be69aa21c --- /dev/null +++ b/modules/hdd/xhdd/xhdd.h @@ -0,0 +1,2 @@ +int ata_device_set_transfer_mode(int device, int type, int mode); +int hdproata_device_set_transfer_mode(int device, int type, int mode); diff --git a/modules/iopcore/cdvdman/atad.c b/modules/iopcore/cdvdman/atad.c index 129be84dd..70f59638b 100644 --- a/modules/iopcore/cdvdman/atad.c +++ b/modules/iopcore/cdvdman/atad.c @@ -67,6 +67,9 @@ static int io_sema = -1; #define ATAWRITE 0 #endif +#define ATA_EV_TIMEOUT 1 +#define ATA_EV_COMPLETE 2 + /* Local device info. */ static ata_devinfo_t atad_devinfo; @@ -86,12 +89,15 @@ static const ata_cmd_info_t smart_cmd_table[] = { #define SMART_CMD_TABLE_SIZE (sizeof smart_cmd_table / sizeof(ata_cmd_info_t)) /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ -typedef struct _ata_cmd_state -{ - int type; /* The ata_cmd_info_t type field. */ - void *buf; - unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ +typedef struct _ata_cmd_state { + s32 type; /* The ata_cmd_info_t type field. */ + union { + void *buf; + u8 *buf8; + u16 *buf16; + }; + u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ + s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -101,12 +107,8 @@ static unsigned int ata_alarm_cb(void *unused); static void ata_set_dir(int dir); -/* Based on a modern ATAD.IRX module, the DMA ENabled bit should be set and unset from the pre and post DMA callbacks. - However, some of the clone adaptors don't support this properly. Since some users out there cannot tell the difference - between such a clone adaptor and a genuine Sony adaptor, it's probably just best to go with the design of the older ATAD modules. - - Older ATAD modules have this bit set within ata_set_dir() instead. */ -/* static void AtadPreDmaCb(int bcr, int dir){ +/* In v1.04, DMA was enabled in ata_set_dir() instead. */ +static void AtadPreDmaCb(int bcr, int dir){ USE_SPD_REGS; SPD_REG16(SPD_R_XFR_CTRL)|=0x80; @@ -116,7 +118,18 @@ static void AtadPostDmaCb(int bcr, int dir){ USE_SPD_REGS; SPD_REG16(SPD_R_XFR_CTRL)&=~0x80; -} */ +} + +#ifdef DEV9_DEBUG +static int ata_create_event_flag(void) { + iop_event_t event; + + /* In v1.04, EA_MULTI was specified. */ + event.attr = EA_SINGLE; + event.bits = 0; + return CreateEventFlag(&event); +} +#endif int atad_start(void) { @@ -139,25 +152,25 @@ int atad_start(void) event.bits = 0; ata_evflg = CreateEventFlag(&event); #ifdef DEV9_DEBUG - if (ata_evflg < 0) { + if ((ata_evflg = ata_create_event_flag()) < 0) { M_PRINTF("Couldn't create event flag, exiting.\n"); res = 1; goto out; } #endif + /* In v1.04, PIO mode 0 was set here. In late versions, it is set in ata_init_devices(). */ dev9RegisterIntrCb(1, &ata_intr_cb); dev9RegisterIntrCb(0, &ata_intr_cb); -//Read the comment above about these callbacks. -/* dev9RegisterPreDmaCb(0, &AtadPreDmaCb); - dev9RegisterPostDmaCb(0, &AtadPostDmaCb); */ + dev9RegisterPreDmaCb(0, &AtadPreDmaCb); + dev9RegisterPostDmaCb(0, &AtadPostDmaCb); #ifdef VMC_DRIVER iop_sema_t smp; smp.initial = 1; smp.max = 1; smp.option = 0; - smp.attr = 1; + smp.attr = SA_THPRI; io_sema = CreateSema(&smp); #endif @@ -173,7 +186,7 @@ static int ata_intr_cb(int flag) { if (flag != 1) { /* New card, invalidate device info. */ dev9IntrDisable(SPD_INTR_ATA); - iSetEventFlag(ata_evflg, 0x02); + iSetEventFlag(ata_evflg, ATA_EV_COMPLETE); } return 1; @@ -181,7 +194,7 @@ static int ata_intr_cb(int flag) static unsigned int ata_alarm_cb(void *unused) { - iSetEventFlag(ata_evflg, 0x01); + iSetEventFlag(ata_evflg, ATA_EV_TIMEOUT); return 0; } @@ -192,8 +205,15 @@ int ata_get_error(void) return ata_hwport->r_error & 0xff; } -/* 0x80 for busy, 0x88 for bus busy. */ -static int ata_wait_busy(int bits) +#define ATA_WAIT_BUSY 0x80 +#define ATA_WAIT_BUSBUSY 0x88 + +#define ata_wait_busy() gen_ata_wait_busy(ATA_WAIT_BUSY) +#define ata_wait_bus_busy() gen_ata_wait_busy(ATA_WAIT_BUSBUSY) + +/* 0x80 for busy, 0x88 for bus busy. + In the original ATAD, the busy and bus-busy functions were separate, but similar. */ +static int gen_ata_wait_busy(int bits) { USE_ATA_REGS; int i, didx, delay; @@ -226,7 +246,7 @@ static int ata_wait_busy(int bits) } M_PRINTF("Timeout while waiting on busy (0x%02x).\n", bits); - return -502; + return ATA_RES_ERR_TIMEOUT; } static int ata_device_select(int device) @@ -234,7 +254,7 @@ static int ata_device_select(int device) USE_ATA_REGS; int res; - if ((res = ata_wait_busy(0x88)) < 0) + if ((res = ata_wait_bus_busy()) < 0) return res; /* If the device was already selected, nothing to do. */ @@ -244,8 +264,9 @@ static int ata_device_select(int device) /* Select the device. */ ata_hwport->r_select = (device & 1) << 4; res = ata_hwport->r_control; + res = ata_hwport->r_control; //Only done once in v1.04. - return ata_wait_busy(0x88); + return ata_wait_bus_busy(); } /* Export 6 */ @@ -265,7 +286,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, const ata_cmd_info_t *cmd_table; int i, res, type, cmd_table_size; int using_timeout, device = (select >> 4) & 1; - unsigned char searchcmd; + u8 searchcmd; ClearEventFlag(ata_evflg, 0); @@ -274,26 +295,26 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, /* For the SCE and SMART commands, we need to search on the subcommand specified in the feature register. */ - if ((command & 0xffff) == ATA_C_SMART) { + if (command == ATA_C_SMART) { cmd_table = smart_cmd_table; cmd_table_size = SMART_CMD_TABLE_SIZE; - searchcmd = feature; + searchcmd = (u8)feature; } else { cmd_table = ata_cmd_table; cmd_table_size = ATA_CMD_TABLE_SIZE; - searchcmd = command; + searchcmd = (u8)command; } type = 0; for (i = 0; i < cmd_table_size; i++) { - if ((searchcmd & 0xff) == cmd_table[i].command) { + if (searchcmd == cmd_table[i].command) { type = cmd_table[i].type; break; } } - if (!(atad_cmd_state.type = type & 0x7F)) - return -506; + if (!(atad_cmd_state.type = type & 0x7F)) //Non-SONY: ignore the 48-bit LBA flag. + return ATA_RES_ERR_CMD; atad_cmd_state.buf = buf; atad_cmd_state.blkcount = blkcount; @@ -301,31 +322,27 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, /* Check that the device is ready if this the appropiate command. */ if (!(ata_hwport->r_control & 0x40)) { switch (command) { - case 0x08: - case 0x90: - case 0x91: - case 0xa0: - case 0xa1: + case ATA_C_DEVICE_RESET: + case ATA_C_EXECUTE_DEVICE_DIAGNOSTIC: + case ATA_C_INITIALIZE_DEVICE_PARAMETERS: + case ATA_C_PACKET: + case ATA_C_IDENTIFY_PACKET_DEVICE: break; default: M_PRINTF("Error: Device %d is not ready.\n", device); - return -501; + return ATA_RES_ERR_NOTREADY; } } /* Does this command need a timeout? */ using_timeout = 0; - switch (type & 0x7F) { + switch (type & 0x7F) { //Non-SONY: ignore the 48-bit LBA flag. case 1: case 6: using_timeout = 1; break; case 4: -#ifdef VMC_DRIVER atad_cmd_state.dir = (command != ATA_C_READ_DMA && command != ATA_C_READ_DMA_EXT); -#else - atad_cmd_state.dir = ATA_DIR_READ; -#endif using_timeout = 1; break; } @@ -362,7 +379,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, ata_hwport->r_sector = sector & 0xff; ata_hwport->r_lcyl = lcyl & 0xff; ata_hwport->r_hcyl = hcyl & 0xff; - ata_hwport->r_select = select & 0xff; + ata_hwport->r_select = (select | ATA_SEL_LBA) & 0xff; //In v1.04, LBA was enabled in the ata_device_sector_io function. ata_hwport->r_command = command & 0xff; /* Turn on the LED. */ @@ -379,40 +396,42 @@ static inline int ata_pio_transfer(ata_cmd_state_t *cmd_state) return 0; USE_ATA_REGS; - void *buf; + u8 *buf8; + u16 *buf16; int i, type; - unsigned short int status = ata_hwport->r_status & 0xff; + u16 status = ata_hwport->r_status & 0xff; if (status & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); - return -503; + return ATA_RES_ERR_IO; } /* DRQ must be set (data request). */ if (!(status & ATA_STAT_DRQ)) - return -504; + return ATA_RES_ERR_NODATA; type = cmd_state->type; if (type == 3 || type == 8) { /* PIO data out */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; for (i = 0; i < 256; i++) { - ata_hwport->r_data = *(unsigned short int *)buf; - cmd_state->buf = ++((unsigned short int *)buf); + ata_hwport->r_data = *buf16; + cmd_state->buf16 = ++buf16; } if (cmd_state->type == 8) { + buf8 = cmd_state->buf8; for (i = 0; i < 4; i++) { - ata_hwport->r_data = *(u8 *)buf; - cmd_state->buf = ++((u8 *)buf); + ata_hwport->r_data = *buf8; + cmd_state->buf8 = ++buf8; } } } else if (type == 2) { /* PIO data in */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; for (i = 0; i < 256; i++) { - *(unsigned short int *)buf = ata_hwport->r_data; - cmd_state->buf = ++((unsigned short int *)buf); + *buf16 = ata_hwport->r_data; + cmd_state->buf16 = ++buf16; } } @@ -424,10 +443,10 @@ static inline int ata_dma_complete(void *buf, int blkcount, int dir) { USE_ATA_REGS; USE_SPD_REGS; - unsigned int count, nbytes; + u32 count, nbytes; u32 bits; int i, res; - unsigned short int dma_stat; + u16 dma_stat; while (blkcount) { for (i = 0; i < 20; i++) @@ -439,11 +458,11 @@ static inline int ata_dma_complete(void *buf, int blkcount, int dir) dev9IntrEnable(SPD_INTR_ATA); /* Wait for the previous transfer to complete or a timeout. */ - WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); + WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT|ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits); - if (bits & 0x01) { /* Timeout. */ + if (bits & ATA_EV_TIMEOUT) { /* Timeout. */ M_PRINTF("Error: DMA timeout.\n"); - return -502; + return ATA_RES_ERR_TIMEOUT; } /* No DMA completion bit? Spurious interrupt. */ if (!(SPD_REG16(SPD_R_INTR_STAT) & 0x02)) { @@ -453,7 +472,8 @@ static inline int ata_dma_complete(void *buf, int blkcount, int dir) #ifdef NETLOG_DEBUG pNetlogSend("Error: Command error status 0x%02x, error 0x%02x.\n", ata_hwport->r_status, ata_get_error()); #endif - return -503; + /* In v1.04, there was no check for ICRC. */ + return((ata_get_error() & ATA_ERR_ICRC) ? ATA_RES_ERR_ICRC : ATA_RES_ERR_IO); } else { M_PRINTF("Warning: Got command interrupt, but not an error.\n"); continue; @@ -468,7 +488,7 @@ static inline int ata_dma_complete(void *buf, int blkcount, int dir) if ((res = dev9DmaTransfer(0, buf, (nbytes << 9) | 32, dir)) < 0) return res; - (u8 *)buf += nbytes; + buf = (void*)((u8 *)buf + nbytes); blkcount -= count; } @@ -486,10 +506,10 @@ int ata_io_finish(void) unsigned short int stat; if (type == 1 || type == 6) { /* Non-data commands. */ - WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); - if (bits & 0x01) { /* Timeout. */ + WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT|ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits); + if (bits & ATA_EV_TIMEOUT) { /* Timeout. */ M_PRINTF("Error: ATA timeout on a non-data command.\n"); - return -502; + return ATA_RES_ERR_TIMEOUT; } } else if (type == 4) { /* DMA. */ if ((res = ata_dma_complete(cmd_state->buf, cmd_state->blkcount, @@ -501,22 +521,22 @@ int ata_io_finish(void) break; if (!stat) { dev9IntrEnable(SPD_INTR_ATA0); - WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); - if (bits & 0x01) { + WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT|ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits); + if (bits & ATA_EV_TIMEOUT) { M_PRINTF("Error: ATA timeout on DMA completion.\n"); - res = -502; + res = ATA_RES_ERR_TIMEOUT; } } } else { /* PIO transfers. */ stat = ata_hwport->r_control; - if ((res = ata_wait_busy(0x80)) < 0) + if ((res = ata_wait_busy()) < 0) goto finish; /* Transfer each PIO data block. */ while (--cmd_state->blkcount != -1) { if ((res = ata_pio_transfer(cmd_state)) < 0) goto finish; - if ((res = ata_wait_busy(0x80)) < 0) + if ((res = ata_wait_busy()) < 0) goto finish; } } @@ -526,10 +546,11 @@ int ata_io_finish(void) /* Wait until the device isn't busy. */ if (ata_hwport->r_status & ATA_STAT_BUSY) - res = ata_wait_busy(0x80); + res = ata_wait_busy(); if ((stat = ata_hwport->r_status) & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", stat, ata_get_error()); - res = -503; + /* In v1.04, there was no check for ICRC. */ + res = (ata_get_error() & ATA_ERR_ICRC) ? ATA_RES_ERR_ICRC : ATA_RES_ERR_IO; } finish: @@ -538,52 +559,64 @@ int ata_io_finish(void) /* Turn off the LED. */ dev9LEDCtl(0); + if(res) + M_PRINTF("error: ATA failed, %d\n", res); + return res; } /* Export 9 */ -int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir) +/* Note: this can only support DMA modes, due to the commands issued. */ +int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) { - int res = 0; - unsigned short int sector, lcyl, hcyl, select, command, len; + USE_SPD_REGS; + int res = 0, retries; + u16 sector, lcyl, hcyl, select, command, len; WAITIOSEMA(io_sema); - while (nsectors > 0) { - ata_set_dir(dir); - + while (res == 0 && nsectors > 0) { /* Variable lba is only 32 bits so no change for lcyl and hcyl. */ lcyl = (lba >> 8) & 0xff; hcyl = (lba >> 16) & 0xff; if (lba_48bit) { - /* Setup for 48-bit LBA. */ - len = (nsectors > 65536) ? 65536 : nsectors; + /* Setup for 48-bit LBA. + While ATA-6 allows for the transfer of up to 65536 sectors, + the DMAC allows only up to 65536 x 128 / 512 = 16384 sectors. */ + len = (nsectors > 16384) ? 16384 : nsectors; /* Combine bits 24-31 and bits 0-7 of lba into sector. */ sector = ((lba >> 16) & 0xff00) | (lba & 0xff); - /* 0x40 enables LBA. */ - select = ((device << 4) | 0x40) & 0xffff; + /* In v1.04, LBA was enabled here. */ + select = (device << 4) & 0xffff; command = ((dir == 1) && (ATAWRITE)) ? ATA_C_WRITE_DMA_EXT : ATA_C_READ_DMA_EXT; } else { /* Setup for 28-bit LBA. */ len = (nsectors > 256) ? 256 : nsectors; sector = lba & 0xff; - /* 0x40 enables LBA. */ - select = ((device << 4) | ((lba >> 24) & 0xf) | 0x40) & 0xffff; + /* In v1.04, LBA was enabled here. */ + select = ((device << 4) | ((lba >> 24) & 0xf)) & 0xffff; command = ((dir == 1) && (ATAWRITE)) ? ATA_C_WRITE_DMA : ATA_C_READ_DMA; } - if ((res = ata_io_start(buf, len, 0, len, sector, lcyl, hcyl, select, command)) != 0) { - SIGNALIOSEMA(io_sema); - return res; - } - if ((res = ata_io_finish()) != 0) { - SIGNALIOSEMA(io_sema); - return res; + for(retries = 3; retries > 0; retries--) { + if ((res = ata_io_start(buf, len, 0, len, sector, lcyl, hcyl, select, command)) != 0) + break; + + /* Set up (part of) the transfer here. In v1.04, this was called at the top of the outer loop. */ + ata_set_dir(dir); + + res = ata_io_finish(); + + /* In v1.04, this was not done. Neither was there a mechanism to retry if a non-permanent error occurs. */ + SPD_REG16(SPD_R_IF_CTRL) &= ~SPD_IF_DMA_ENABLE; + + if(res != ATA_RES_ERR_ICRC) + break; } - (u8 *)buf += (len * 512); + buf = (void*)((u8 *)buf + len * 512); lba += len; nsectors -= len; } @@ -608,5 +641,5 @@ static void ata_set_dir(int dir) val = SPD_REG16(SPD_R_IF_CTRL) & 1; val |= (dir == ATA_DIR_WRITE) ? 0x4c : 0x4e; SPD_REG16(SPD_R_IF_CTRL) = val; - SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x86; //In a modern ATAD module, the DMA EN bit (0x80) is set and cleared from the pre and post DMA callbacks instead. Read the comment above about this. + SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x6; //In v1.04, DMA was enabled here (0x86 instead of 0x6) } diff --git a/modules/iopcore/cdvdman/atad.h b/modules/iopcore/cdvdman/atad.h index 4a5244f61..8d095c9d0 100644 --- a/modules/iopcore/cdvdman/atad.h +++ b/modules/iopcore/cdvdman/atad.h @@ -27,18 +27,32 @@ typedef struct _ata_devinfo { - int exists; /* Was successfully probed. */ - int has_packet; /* Supports the PACKET command set. */ - unsigned int total_sectors; /* Total number of user sectors. */ - unsigned int security_status; /* Word 0x100 of the identify info. */ + /** Was successfully probed. */ + s32 exists; + /** Supports the PACKET command set. */ + s32 has_packet; + /** Total number of user sectors. */ + u32 total_sectors; + /** Word 0x100 of the identify info. */ + u32 security_status; } ata_devinfo_t; +/* Error definitions. */ +#define ATA_RES_ERR_NOTREADY -501 +#define ATA_RES_ERR_TIMEOUT -502 +#define ATA_RES_ERR_IO -503 +#define ATA_RES_ERR_NODATA -504 +#define ATA_RES_ERR_NODEV -505 +#define ATA_RES_ERR_CMD -506 +#define ATA_RES_ERR_LOCKED -509 +#define ATA_RES_ERR_ICRC -510 + int atad_start(void); ata_devinfo_t *ata_get_devinfo(int device); int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command); int ata_io_finish(void); int ata_get_error(void); -int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir); +int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir); // APA Partition #define APA_MAGIC 0x00415041 // 'APA\0' diff --git a/modules/iopcore/cdvdman/dev9.c b/modules/iopcore/cdvdman/dev9.c index 3964dd7cb..390ca6971 100644 --- a/modules/iopcore/cdvdman/dev9.c +++ b/modules/iopcore/cdvdman/dev9.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -25,8 +26,6 @@ #include #include "dev9.h" -#include "ioman.h" -#include "ioman_add.h" #ifdef HDD_DRIVER extern char atad_inited; @@ -44,8 +43,6 @@ extern char atad_inited; #define VERSION "1.0" #define BANNER "\nDEV9 device driver v%s - Copyright (c) 2003 Marcus R. Brown\n\n" -#define DEV9_INTR 13 - /* SSBUS registers. */ #define SSBUS_R_1418 0xbf801418 #define SSBUS_R_141c 0xbf80141c @@ -87,14 +84,20 @@ static int expbay_init(void); static int dev9x_dummy(void) { return 0; } static int dev9x_devctl(iop_file_t *f, const char *name, int cmd, void *args, int arglen, void *buf, int buflen) { - if (cmd == 0x4401) - return dev9type; - - return 0; + switch(cmd) + { + case DDIOC_MODEL: + return dev9type; + case DDIOC_OFF: + dev9Shutdown(); + return 0; + default: + return 0; + } } /* driver ops func tab */ -static void *dev9x_ops[27] = { +static iop_device_ops_t dev9x_ops = { (void *)dev9x_dummy, (void *)dev9x_dummy, (void *)dev9x_dummy, @@ -118,18 +121,15 @@ static void *dev9x_ops[27] = { (void *)dev9x_dummy, (void *)dev9x_dummy, (void *)dev9x_dummy, - (void *)dev9x_devctl, - (void *)dev9_init, - (void *)dev9_init, - (void *)dev9_init}; + (void *)dev9x_devctl}; /* driver descriptor */ -static iop_ext_device_t dev9x_dev = { +static iop_device_t dev9x_dev = { "dev9x", - IOP_DT_FS | 0x10000000, /* EXT FS */ + IOP_DT_FS | IOP_DT_FSEXT, 1, "DEV9", - (struct _iop_ext_device_ops *)&dev9x_ops}; + &dev9x_ops}; int dev9d_init(void) { @@ -155,7 +155,7 @@ int dev9d_init(void) return res; DelDrv("dev9x"); - AddDrv((iop_device_t *)&dev9x_dev); + AddDrv(&dev9x_dev); return 0; } @@ -269,6 +269,7 @@ void dev9IntrDisable(int mask) int dev9DmaTransfer(int ctrl, void *buf, int bcr, int dir) { USE_SPD_REGS; + volatile iop_dmac_chan_t *dev9_chan = (iop_dmac_chan_t *)DEV9_DMAC_BASE; int res = 0, dmactrl; switch (ctrl) { @@ -298,11 +299,12 @@ int dev9DmaTransfer(int ctrl, void *buf, int bcr, int dir) if (dev9_predma_cbs[ctrl]) dev9_predma_cbs[ctrl](bcr, dir); - dmac_request(IOP_DMAC_DEV9, buf, bcr & 0xFFFF, bcr >> 16, dir); - dmac_transfer(IOP_DMAC_DEV9); + dev9_chan->madr = (u32)buf; + dev9_chan->bcr = bcr; + dev9_chan->chcr = DMAC_CHCR_30|DMAC_CHCR_TR|DMAC_CHCR_CO|(dir & DMAC_CHCR_DR); /* Wait for DMA to complete. Do not use a semaphore as thread switching hurts throughput greatly. */ - while (dmac_ch_get_chcr(IOP_DMAC_DEV9) & DMAC_CHCR_TR) { + while (dev9_chan->chcr & DMAC_CHCR_TR) { } res = 0; @@ -416,13 +418,19 @@ int dev9RegisterShutdownCb(int idx, dev9_shutdown_cb_t cb) static int dev9_init(void) { - int i; + iop_sema_t sema; + int i, flags; - if ((dma_lock_sem = CreateMutex(IOP_MUTEX_UNLOCKED)) < 0) + sema.attr = SA_THPRI; + sema.initial = 1; + sema.max = 1; + if ((dma_lock_sem = CreateSema(&sema)) < 0) return -1; + CpuSuspendIntr(&flags); /* Enable the DEV9 DMAC channel. */ - dmac_enable(IOP_DMAC_DEV9); + dmac_set_dpcr2(dmac_get_dpcr2() | 0x80); + CpuResumeIntr(flags); /* Not quite sure what this enables yet. */ dev9_set_stat(0x103); @@ -430,6 +438,7 @@ static int dev9_init(void) /* Disable all device interrupts. */ dev9IntrDisable(0xffff); + /* Register interrupt dispatch callback handler. */ p_dev9_intr_cb = (void *)dev9_intr_dispatch; /* Reset the SMAP interrupt callback table. */ @@ -569,7 +578,7 @@ static int pcmcia_init(void) { USE_DEV9_REGS; USE_AIF_REGS; - int *mode; + int *mode, flags; _sw(0x51011, SSBUS_R_1420); _sw(0x1a00bb, SSBUS_R_1418); @@ -596,8 +605,10 @@ static int pcmcia_init(void) if (dev9_init() != 0) return 1; + CpuSuspendIntr(&flags); RegisterIntrHandler(IOP_IRQ_DEV9, 1, &pcmcia_intr, NULL); EnableIntr(IOP_IRQ_DEV9); + CpuResumeIntr(flags); DEV9_REG(DEV9_R_147E) = 0; M_PRINTF("CXD9566 (PCMCIA type) initialized.\n"); @@ -625,6 +636,7 @@ static int expbay_intr(void *unused) static int expbay_init(void) { USE_DEV9_REGS; + int flags; _sw(0x51011, SSBUS_R_1420); _sw(0xe01a3043, SSBUS_R_1418); @@ -635,9 +647,10 @@ static int expbay_init(void) if (dev9_init() != 0) return 1; - ReleaseIntrHandler(IOP_IRQ_DEV9); + CpuSuspendIntr(&flags); RegisterIntrHandler(IOP_IRQ_DEV9, 1, expbay_intr, NULL); EnableIntr(IOP_IRQ_DEV9); + CpuResumeIntr(flags); DEV9_REG(DEV9_R_1466) = 0; M_PRINTF("CXD9611 (Expansion Bay type) initialized.\n"); diff --git a/modules/iopcore/cdvdman/dev9.h b/modules/iopcore/cdvdman/dev9.h index d84b37a9c..58c08ce73 100644 --- a/modules/iopcore/cdvdman/dev9.h +++ b/modules/iopcore/cdvdman/dev9.h @@ -17,6 +17,8 @@ #include "types.h" #include "irx.h" +#include "hdd-ioctl.h" + typedef int (*dev9_intr_cb_t)(int flag); typedef void (*dev9_shutdown_cb_t)(void); typedef void (*dev9_dma_cb_t)(int bcr, int dir); diff --git a/modules/iopcore/cdvdman/hdpro_atad.c b/modules/iopcore/cdvdman/hdpro_atad.c index ac6617a15..c4b0f1387 100644 --- a/modules/iopcore/cdvdman/hdpro_atad.c +++ b/modules/iopcore/cdvdman/hdpro_atad.c @@ -86,14 +86,17 @@ static int io_sema = -1; #define ATAWRITE 0 #endif +#define ATA_EV_TIMEOUT 1 +#define ATA_EV_COMPLETE 2 + /* Local device info. */ static ata_devinfo_t atad_devinfo; /* ATA command info. */ typedef struct _ata_cmd_info { - unsigned char command; - unsigned char type; + u8 command; + u8 type; } ata_cmd_info_t; static const ata_cmd_info_t ata_cmd_table[] = { @@ -117,12 +120,15 @@ static const ata_cmd_info_t smart_cmd_table[] = { #define SMART_CMD_TABLE_SIZE (sizeof smart_cmd_table / sizeof(ata_cmd_info_t)) /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ -typedef struct _ata_cmd_state -{ - int type; /* The ata_cmd_info_t type field. */ - void *buf; - unsigned int blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - int dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ +typedef struct _ata_cmd_state { + s32 type; /* The ata_cmd_info_t type field. */ + union { + void *buf; + u8 *buf8; + u16 *buf16; + }; + u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ + s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -131,11 +137,16 @@ static int hdpro_io_active = 0; static int intr_suspended = 0; static int intr_state; -static int ata_wait_busy(int bits); +static int hdpro_io_start(void); +static int hdpro_io_finish(void); +static void hdpro_io_write(unsigned char cmd, unsigned short int val); +static int hdpro_io_read(unsigned char cmd); +static int hdpro_io_init(void); +static int gen_ata_wait_busy(int bits); static unsigned int ata_alarm_cb(void *unused) { - iSetEventFlag(ata_evflg, 0x01); + iSetEventFlag(ata_evflg, ATA_EV_TIMEOUT); return 0; } @@ -157,6 +168,107 @@ static void resume_intr(void) } } +int atad_start(void) +{ + int res = 1; + iop_event_t event; + + M_PRINTF(BANNER, VERSION); + + event.attr = 0; + event.bits = 0; + if ((ata_evflg = CreateEventFlag(&event)) < 0) { + M_PRINTF("Couldn't create event flag, exiting.\n"); + goto out; + } + + hdpro_io_start(); + + HDPROreg_IO8 = 0xe3; + CDVDreg_STATUS = 0; + + if (hdpro_io_init() != 0) + goto out; + +#ifdef VMC_DRIVER + iop_sema_t smp; + smp.initial = 1; + smp.max = 1; + smp.option = 0; + smp.attr = SA_THPRI; + io_sema = CreateSema(&smp); +#endif + + res = 0; + M_PRINTF("Driver loaded.\n"); + +out: + hdpro_io_finish(); + return res; +} + +/* Export 8 */ +int ata_get_error() +{ + return hdpro_io_read(ATAreg_ERROR_RD) & 0xff; +} + +#define ATA_WAIT_BUSY 0x80 +#define ATA_WAIT_BUSBUSY 0x88 + +#define ata_wait_busy() gen_ata_wait_busy(ATA_WAIT_BUSY) +#define ata_wait_bus_busy() gen_ata_wait_busy(ATA_WAIT_BUSBUSY) + +/* 0x80 for busy, 0x88 for bus busy. + In the original ATAD, the busy and bus-busy functions were separate, but similar. */ +static int gen_ata_wait_busy(int bits) +{ + int i, didx, delay; + int res = 0; + + for (i = 0; i < 80; i++) { + + hdpro_io_start(); + + unsigned short int r_control = hdpro_io_read(ATAreg_CONTROL_RD); + + hdpro_io_finish(); + + if (!((r_control & 0xffff) & bits)) + goto out; + + didx = i / 10; + switch (didx) { + case 0: + continue; + case 1: + delay = 100; + break; + case 2: + delay = 1000; + break; + case 3: + delay = 10000; + break; + case 4: + delay = 100000; + break; + default: + delay = 1000000; + } + + DelayThread(delay); + } + + res = ATA_RES_ERR_TIMEOUT; + M_PRINTF("Timeout while waiting on busy (0x%02x).\n", bits); + +out: + hdpro_io_start(); + + return res; +} + static int hdpro_io_start(void) { if (hdpro_io_active) @@ -264,108 +376,14 @@ static int hdpro_io_init(void) DelayThread(3000); - return ata_wait_busy(0x80); -} - -int atad_start(void) -{ - int res = 1; - iop_event_t event; - - M_PRINTF(BANNER, VERSION); - - event.attr = 0; - event.bits = 0; - if ((ata_evflg = CreateEventFlag(&event)) < 0) { - M_PRINTF("Couldn't create event flag, exiting.\n"); - goto out; - } - - hdpro_io_start(); - - HDPROreg_IO8 = 0xe3; - CDVDreg_STATUS = 0; - - if (hdpro_io_init() != 0) - goto out; - -#ifdef VMC_DRIVER - iop_sema_t smp; - smp.initial = 1; - smp.max = 1; - smp.option = 0; - smp.attr = 1; - io_sema = CreateSema(&smp); -#endif - - res = 0; - M_PRINTF("Driver loaded.\n"); - -out: - hdpro_io_finish(); - return res; -} - -/* Export 8 */ -int ata_get_error() -{ - return hdpro_io_read(ATAreg_ERROR_RD) & 0xff; -} - -/* 0x80 for busy, 0x88 for bus busy. */ -static int ata_wait_busy(int bits) -{ - int i, didx, delay; - int res = 0; - - for (i = 0; i < 80; i++) { - - hdpro_io_start(); - - unsigned short int r_control = hdpro_io_read(ATAreg_CONTROL_RD); - - hdpro_io_finish(); - - if (!((r_control & 0xffff) & bits)) - goto out; - - didx = i / 10; - switch (didx) { - case 0: - continue; - case 1: - delay = 100; - break; - case 2: - delay = 1000; - break; - case 3: - delay = 10000; - break; - case 4: - delay = 100000; - break; - default: - delay = 1000000; - } - - DelayThread(delay); - } - - res = -502; - M_PRINTF("Timeout while waiting on busy (0x%02x).\n", bits); - -out: - hdpro_io_start(); - - return res; + return ata_wait_busy(); } static int ata_device_select(int device) { int res; - if ((res = ata_wait_busy(0x88)) < 0) + if ((res = ata_wait_bus_busy()) < 0) return res; /* If the device was already selected, nothing to do. */ @@ -376,7 +394,7 @@ static int ata_device_select(int device) hdpro_io_write(ATAreg_SELECT_WR, (device & 1) << 4); res = hdpro_io_read(ATAreg_CONTROL_RD); - return ata_wait_busy(0x88); + return ata_wait_bus_busy(); } /* Export 6 */ @@ -386,7 +404,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, const ata_cmd_info_t *cmd_table; int i, res, type, cmd_table_size; int using_timeout, device = (select >> 4) & 1; - unsigned int searchcmd; + u8 searchcmd; ClearEventFlag(ata_evflg, 0); @@ -398,23 +416,23 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, if (command == ATA_C_SMART) { cmd_table = smart_cmd_table; cmd_table_size = SMART_CMD_TABLE_SIZE; - searchcmd = feature; + searchcmd = (u8)feature; } else { cmd_table = ata_cmd_table; cmd_table_size = ATA_CMD_TABLE_SIZE; - searchcmd = command; + searchcmd = (u8)command; } type = 0; for (i = 0; i < cmd_table_size; i++) { - if ((searchcmd & 0xff) == cmd_table[i].command) { + if (searchcmd == cmd_table[i].command) { type = cmd_table[i].type; break; } } if (!(atad_cmd_state.type = type & 0x7F)) - return -506; + return ATA_RES_ERR_CMD; atad_cmd_state.buf = buf; atad_cmd_state.blkcount = blkcount; @@ -422,15 +440,15 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, /* Check that the device is ready if this the appropiate command. */ if (!(hdpro_io_read(ATAreg_CONTROL_RD) & 0x40)) { switch (command) { - case 0x08: - case 0x90: - case 0x91: - case 0xa0: - case 0xa1: + case ATA_C_DEVICE_RESET: + case ATA_C_EXECUTE_DEVICE_DIAGNOSTIC: + case ATA_C_INITIALIZE_DEVICE_PARAMETERS: + case ATA_C_PACKET: + case ATA_C_IDENTIFY_PACKET_DEVICE: break; default: M_PRINTF("Error: Device %d is not ready.\n", device); - return -501; + return ATA_RES_ERR_NOTREADY; } } @@ -488,7 +506,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, hdpro_io_write(ATAreg_LCYL_WR, lcyl & 0xff); hdpro_io_write(ATAreg_HCYL_WR, hcyl & 0xff); - hdpro_io_write(ATAreg_SELECT_WR, select & 0xff); + hdpro_io_write(ATAreg_SELECT_WR, (select | ATA_SEL_LBA) & 0xff); //In v1.04, LBA was enabled in the ata_device_sector_io function. hdpro_io_write(ATAreg_COMMAND_WR, command & 0xff); return 0; @@ -497,50 +515,52 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, /* Do a PIO transfer, to or from the device. */ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) { - void *buf; int i, type; int res = 0, chk = 0; - unsigned short int status = hdpro_io_read(ATAreg_STATUS_RD); + u8 *buf8; + u16 *buf16; + u16 status = hdpro_io_read(ATAreg_STATUS_RD); if (status & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", status, ata_get_error()); - return -503; + return ATA_RES_ERR_IO; } /* DRQ must be set (data request). */ if (!(status & ATA_STAT_DRQ)) - return -504; + return ATA_RES_ERR_NODATA; type = cmd_state->type; if (type == 3 || type == 8) { /* PIO data out */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; HDPROreg_IO8 = 0x43; CDVDreg_STATUS = 0; for (i = 0; i < 256; i++) { - unsigned short int r_data = *(unsigned short int *)buf; + u16 r_data = *buf16; hdpro_io_write(ATAreg_DATA_WR, r_data); chk ^= r_data + i; - cmd_state->buf = ++((unsigned short int *)buf); + cmd_state->buf16 = ++buf16; } - unsigned short int out = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; + u16 out = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; if (out != (chk & 0xffff)) - return -504; + return ATA_RES_ERR_NODATA; if (cmd_state->type == 8) { + buf8 = cmd_state->buf8; for (i = 0; i < 4; i++) { - hdpro_io_write(ATAreg_DATA_WR, *(unsigned char *)buf); - cmd_state->buf = ++((unsigned char *)buf); + hdpro_io_write(ATAreg_DATA_WR, *buf8); + cmd_state->buf8 = ++buf8; } } } else if (type == 2) { /* PIO data in */ - buf = cmd_state->buf; + buf16 = cmd_state->buf16; suspend_intr(); @@ -558,8 +578,8 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) res0 = (res0 & 0xff) | (res1 << 8); chk ^= res0 + i; - *(unsigned short int *)buf = res0 & 0xffff; - cmd_state->buf = ++((unsigned short int *)buf); + *buf16 = res0 & 0xffff; + cmd_state->buf = ++buf16; } HDPROreg_IO8 = 0x51; @@ -568,9 +588,9 @@ static int ata_pio_transfer(ata_cmd_state_t *cmd_state) resume_intr(); - unsigned short int r_data = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; + u16 r_data = hdpro_io_read(ATAreg_DATA_RD) & 0xffff; if (r_data != (chk & 0xffff)) - return -504; + return ATA_RES_ERR_NODATA; } return res; @@ -598,10 +618,10 @@ int ata_io_finish(void) if (((ret & 0xff) & 1) == 0) { - WaitEventFlag(ata_evflg, 0x03, WEF_CLEAR | WEF_OR, &bits); - if (bits & 0x01) { /* Timeout. */ + WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT|ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits); + if (bits & ATA_EV_TIMEOUT) { /* Timeout. */ M_PRINTF("Error: ATA timeout on a non-data command.\n"); - return -502; + return ATA_RES_ERR_TIMEOUT; } DelayThread(500); @@ -610,17 +630,17 @@ int ata_io_finish(void) } else if (type == 4) { /* DMA. */ M_PRINTF("Error: DMA mode not implemented.\n"); - res = -502; + res = ATA_RES_ERR_TIMEOUT; } else { /* PIO transfers. */ stat = hdpro_io_read(ATAreg_CONTROL_RD); - if ((res = ata_wait_busy(0x80)) < 0) + if ((res = ata_wait_busy()) < 0) goto finish; /* Transfer each PIO data block. */ while (--cmd_state->blkcount != -1) { if ((res = ata_pio_transfer(cmd_state)) < 0) goto finish; - if ((res = ata_wait_busy(0x80)) < 0) + if ((res = ata_wait_busy()) < 0) goto finish; } } @@ -630,10 +650,10 @@ int ata_io_finish(void) /* Wait until the device isn't busy. */ if (hdpro_io_read(ATAreg_STATUS_RD) & ATA_STAT_BUSY) - res = ata_wait_busy(0x80); + res = ata_wait_busy(); if ((stat = hdpro_io_read(ATAreg_STATUS_RD)) & ATA_STAT_ERR) { M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", stat, ata_get_error()); - res = -503; + res = ATA_RES_ERR_IO; } finish: @@ -644,11 +664,11 @@ int ata_io_finish(void) } /* Export 9 */ -int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int nsectors, int dir) +int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) { int res = 0; unsigned int nbytes; - unsigned short int sector, lcyl, hcyl, select, command, len; + u16 sector, lcyl, hcyl, select, command, len; WAITIOSEMA(io_sema); @@ -666,14 +686,14 @@ int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int n /* Setup for 48-bit LBA. */ /* Combine bits 24-31 and bits 0-7 of lba into sector. */ sector = ((lba >> 16) & 0xff00) | (lba & 0xff); - /* 0x40 enables LBA. */ - select = ((device << 4) | 0x40) & 0xffff; + /* In v1.04, LBA was enabled here. */ + select = (device << 4) & 0xffff; command = ((dir == 1) && (ATAWRITE)) ? ATA_C_WRITE_SECTOR_EXT : ATA_C_READ_SECTOR_EXT; } else { /* Setup for 28-bit LBA. */ sector = lba & 0xff; - /* 0x40 enables LBA. */ - select = ((device << 4) | ((lba >> 24) & 0xf) | 0x40) & 0xffff; + /* In v1.04, LBA was enabled here. */ + select = ((device << 4) | ((lba >> 24) & 0xf)) & 0xffff; command = ((dir == 1) && (ATAWRITE)) ? ATA_C_WRITE_SECTOR : ATA_C_READ_SECTOR; } @@ -684,7 +704,7 @@ int ata_device_sector_io(int device, void *buf, unsigned int lba, unsigned int n continue; nbytes = len * 512; - (u8 *)buf += nbytes; + buf = (void*)((u8 *)buf + len * 512); lba += len; nsectors -= len; } diff --git a/modules/iopcore/cdvdman/imports.lst b/modules/iopcore/cdvdman/imports.lst index 586a50a9a..156928553 100755 --- a/modules/iopcore/cdvdman/imports.lst +++ b/modules/iopcore/cdvdman/imports.lst @@ -8,10 +8,8 @@ I_printf stdio_IMPORTS_end dmacman_IMPORTS_start -I_dmac_enable -I_dmac_transfer -I_dmac_request -I_dmac_ch_get_chcr +I_dmac_get_dpcr2 +I_dmac_set_dpcr2 dmacman_IMPORTS_end intrman_IMPORTS_start @@ -21,7 +19,6 @@ I_QueryIntrContext I_EnableIntr I_DisableIntr I_RegisterIntrHandler -I_ReleaseIntrHandler intrman_IMPORTS_end sysmem_IMPORTS_start diff --git a/modules/mcemu/Makefile b/modules/mcemu/Makefile index 94371536d..1b5f5291b 100644 --- a/modules/mcemu/Makefile +++ b/modules/mcemu/Makefile @@ -43,6 +43,10 @@ ifeq ($(USE_USB),1) IOP_CFLAGS += -DUSB_DRIVER endif +ifeq ($(PADEMU),1) +IOP_CFLAGS += -DPADEMU +endif + IOP_LDFLAGS += -s IOP_INCS += diff --git a/modules/mcemu/imports.lst b/modules/mcemu/imports.lst index 982419862..2ce9906f1 100755 --- a/modules/mcemu/imports.lst +++ b/modules/mcemu/imports.lst @@ -13,6 +13,7 @@ I_GetLoadcoreInternalData I_QueryLibraryEntryTable I_FlushIcache I_FlushDcache +I_ReleaseLibraryEntries loadcore_IMPORTS_end oplutils_IMPORTS_start diff --git a/modules/mcemu/mcemu.c b/modules/mcemu/mcemu.c index 74b373dff..76942ce66 100644 --- a/modules/mcemu/mcemu.c +++ b/modules/mcemu/mcemu.c @@ -7,16 +7,14 @@ #include "mcemu.h" - static int readyToGo = -1; void StartNow(void *param); #ifdef PADEMU -void(pademu_hookSio2man *)(Sio2Packet *sd, Sio2McProc sio2proc); - void no_pademu(Sio2Packet *sd, Sio2McProc sio2proc) { - sioproc(sd); + sio2proc(sd); } +void (*pademu_hookSio2man)(Sio2Packet *sd, Sio2McProc sio2proc) = no_pademu; #endif //--------------------------------------------------------------------------- @@ -86,15 +84,6 @@ void StartNow(void *param) DPRINTF("SECRMAN exports not found.\n"); } -#ifdef PADEMU - exp = GetExportTable("pademu", 0x101); - if (exp != NULL) { - pademu_hookSio2man = GetExportEntry(exp, 4); - } else { - pademu_hookSio2man = no_pademu; - } -#endif - readyToGo = MODULE_RESIDENT_END; } //------------------------------ @@ -241,16 +230,43 @@ int DummySecrAuthCard(int port, int slot, int cnum) /* Hook for the LOADCORE's RegisterLibraryEntires call */ int hookRegisterLibraryEntires(iop_library_t *lib) { + register int ret; + if (!strncmp(lib->name, "sio2man", 8)) { - /* hooking SIO2MAN's routines */ - InstallSio2manHook(&lib[1]); + ret = pRegisterLibraryEntires(lib); + if (ret == 0) { + ReleaseLibraryEntries((struct irx_export_table *)lib); + /* hooking SIO2MAN's routines */ + InstallSio2manHook(&lib[1]); + } else { + DPRINTF("registering library %s failed, error %d\n", lib->name, ret); + return ret; + } } else if (!strncmp(lib->name, "secrman", 8)) { - /* hooking the SecrAuthCard() calls */ - InstallSecrmanHook(&lib[1]); + ret = pRegisterLibraryEntires(lib); + if (ret == 0) { + ReleaseLibraryEntries((struct irx_export_table *)lib); + /* hooking the SecrAuthCard() calls */ + InstallSecrmanHook(&lib[1]); + } else { + DPRINTF("registering library %s failed, error %d\n", lib->name, ret); + return ret; + } } else if (!strncmp(lib->name, "mcman", 8)) { - /* hooking MCMAN's sceMcReadFast() & sceMcWriteFast() calls */ - if (lib->version >= 0x208) - InstallMcmanHook(&lib[1]); + ret = pRegisterLibraryEntires(lib); + if (ret == 0) { + ReleaseLibraryEntries((struct irx_export_table *)lib); + /* hooking MCMAN's sceMcReadFast() & sceMcWriteFast() calls */ + if (lib->version >= 0x208) + InstallMcmanHook(&lib[1]); + } else { + DPRINTF("registering library %s failed, error %d\n", lib->name, ret); + return ret; + } +#ifdef PADEMU + } else if (!strncmp(lib->name, "pademu", 8)) { + pademu_hookSio2man = GetExportEntry(&lib[1], 4); +#endif } DPRINTF("registering library %s\n", lib->name); diff --git a/modules/network/smap-ingame/smap.c b/modules/network/smap-ingame/smap.c index d0cc439b8..99726d9d3 100644 --- a/modules/network/smap-ingame/smap.c +++ b/modules/network/smap-ingame/smap.c @@ -44,11 +44,11 @@ 4. TX_GNP_0 is written to. */ #define DEV9_SMAP_ALL_INTR_MASK (SMAP_INTR_EMAC3 | SMAP_INTR_RXEND | SMAP_INTR_TXEND | SMAP_INTR_RXDNV | SMAP_INTR_TXDNV) -//Unlike the SONY original, the EMAC3 and RXDNV interrupts are not handled. They didn't even do anything useful in the SONY original. +//Unlike the SONY original, the RXDNV interrupt is not handled as statistics are not recorded. //For the sake of simplicity, Tx channel 0 is operated in single-mode. Do not handle TXDNV. -#define DEV9_SMAP_INTR_MASK (SMAP_INTR_RXEND) +#define DEV9_SMAP_INTR_MASK (SMAP_INTR_EMAC3|SMAP_INTR_RXEND) //The Tx interrupt events are handled separately -#define DEV9_SMAP_INTR_MASK2 (SMAP_INTR_RXEND) +#define DEV9_SMAP_INTR_MASK2 (SMAP_INTR_EMAC3|SMAP_INTR_RXEND) struct SmapDriverData SmapDriverData; @@ -58,41 +58,40 @@ static unsigned int SmapConfiguration = 0x5E0; extern void *_gp; -static void _smap_write_phy(volatile u8 *emac3_regbase, unsigned char address, unsigned short int value) -{ - unsigned int i, PHYRegisterValue; +static void _smap_write_phy(volatile u8 *emac3_regbase, unsigned int address, u16 value){ + u32 PHYRegisterValue; + unsigned int i; - PHYRegisterValue = (address & SMAP_E3_PHY_REG_ADDR_MSK) | SMAP_E3_PHY_WRITE | ((SMAP_DsPHYTER_ADDRESS & SMAP_E3_PHY_ADDR_MSK) << SMAP_E3_PHY_ADDR_BITSFT); - PHYRegisterValue |= ((unsigned int)value) << SMAP_E3_PHY_DATA_BITSFT; + PHYRegisterValue=(address&SMAP_E3_PHY_REG_ADDR_MSK)|SMAP_E3_PHY_WRITE|((SMAP_DsPHYTER_ADDRESS&SMAP_E3_PHY_ADDR_MSK)<= 100) - break; + if(i>=100) break; } - // if(i>=100) printf("smap: %s: > %d ms\n", "_smap_write_phy", i); + //if(i>=100) printf("smap: %s: > %d ms\n", "_smap_write_phy", i); } -static int _smap_read_phy(volatile u8 *emac3_regbase, unsigned int address) -{ - unsigned int i, PHYRegisterValue; - int result; +static u16 _smap_read_phy(volatile u8 *emac3_regbase, unsigned int address){ + unsigned int i; + u32 value, PHYRegisterValue; + u16 result; - PHYRegisterValue = (address & SMAP_E3_PHY_REG_ADDR_MSK) | SMAP_E3_PHY_READ | ((SMAP_DsPHYTER_ADDRESS & SMAP_E3_PHY_ADDR_MSK) << SMAP_E3_PHY_ADDR_BITSFT); + PHYRegisterValue=(address&SMAP_E3_PHY_REG_ADDR_MSK)|SMAP_E3_PHY_READ|((SMAP_DsPHYTER_ADDRESS&SMAP_E3_PHY_ADDR_MSK)<>= SMAP_E3_PHY_DATA_BITSFT; + do{ + if(SMAP_EMAC3_GET32(SMAP_R_EMAC3_STA_CTRL)&SMAP_E3_PHY_OP_COMP){ + if(SMAP_EMAC3_GET32(SMAP_R_EMAC3_STA_CTRL)&SMAP_E3_PHY_OP_COMP){ + if((value=SMAP_EMAC3_GET32(SMAP_R_EMAC3_STA_CTRL))&SMAP_E3_PHY_OP_COMP){ + result = (u16)(value >> SMAP_E3_PHY_DATA_BITSFT); break; } } @@ -100,9 +99,9 @@ static int _smap_read_phy(volatile u8 *emac3_regbase, unsigned int address) DelayThread(1000); i++; - } while (i < 100); + }while(i<100); - // if(i>=100) printf("smap: %s: > %d ms\n", "_smap_read_phy", i); + if(i>=100) printf("smap: %s: > %d ms\n", "_smap_read_phy", i); return result; } @@ -116,8 +115,9 @@ static inline void RestartAutoNegotiation(volatile u8 *emac3_regbase, unsigned s static int InitPHY(struct SmapDriverData *SmapDrivPrivData) { int i, result; - unsigned int value, value2, LinkSpeed100M, LinkFDX, FlowControlEnabled, AutoNegoRetries; - unsigned short int RegDump[6]; + unsigned int LinkSpeed100M, LinkFDX, FlowControlEnabled, AutoNegoRetries; + u32 emac3_value; + u16 RegDump[6], value, value2; volatile u8 *emac3_regbase; LinkSpeed100M = 0; @@ -175,7 +175,7 @@ static int InitPHY(struct SmapDriverData *SmapDrivPrivData) DEBUG_PRINTF("smap: no strap mode (conf=0x%x, bmsr=0x%x)\n", SmapConfiguration, value); - value = _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_ANAR) & 0xFFFF; + value = _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_ANAR); value = (SmapConfiguration & 0x5E0) | (value & 0x1F); DEBUG_PRINTF("smap: anar=0x%x\n", value); _smap_write_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_ANAR, value); @@ -196,7 +196,7 @@ static int InitPHY(struct SmapDriverData *SmapDrivPrivData) return 0; } - value = _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMSR) & 0xFFFF; + value = _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMSR); if ((value & (SMAP_PHY_BMSR_ANCP | 0x10)) == SMAP_PHY_BMSR_ANCP) { /* 0x30: SMAP_PHY_BMSR_ANCP and Remote fault. */ /* This seems to be checking for the link-up status. */ for (i = 0; !(_smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMSR) & SMAP_PHY_BMSR_LINK); i++) { @@ -271,8 +271,8 @@ static int InitPHY(struct SmapDriverData *SmapDrivPrivData) DelayThread(500000); value = _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_FCSCR); value2 = _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_RECR); - if ((value2 & 0xFFFF) != 0 || (value & 0xFFFF) >= 0x11) { - // DEBUG_PRINTF("smap: FCSCR=%d RECR=%d\n", value&0xFFFF, value2&0xFFFF); + if ((value2 != 0) || (value >= 0x11)) { + // DEBUG_PRINTF("smap: FCSCR=%d RECR=%d\n", value, value2); _smap_write_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMCR, 0); goto WaitLink; } @@ -325,12 +325,12 @@ static int InitPHY(struct SmapDriverData *SmapDrivPrivData) DEBUG_PRINTF("smap: %s %s Duplex Mode %s Flow Control\n", LinkSpeed100M ? "100BaseTX" : "10BaseT", LinkFDX ? "Full" : "Half", FlowControlEnabled ? "with" : "without"); emac3_regbase = SmapDrivPrivData->emac3_regbase; - value = SMAP_EMAC3_GET(SMAP_R_EMAC3_MODE1) & 0x67FFFFFF; + emac3_value = SMAP_EMAC3_GET32(SMAP_R_EMAC3_MODE1) & 0x67FFFFFF; if (LinkFDX) - value |= SMAP_E3_FDX_ENABLE; + emac3_value |= SMAP_E3_FDX_ENABLE; if (FlowControlEnabled) - value |= SMAP_E3_FLOWCTRL_ENABLE | SMAP_E3_ALLOW_PF; - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE1, value); + emac3_value |= SMAP_E3_FLOWCTRL_ENABLE | SMAP_E3_ALLOW_PF; + SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE1, emac3_value); return 0; } @@ -363,6 +363,10 @@ static int Dev9IntrCb(int flag) emac3_regbase = SmapDriverData.emac3_regbase; smap_regbase = SmapDriverData.smap_regbase; while ((IntrReg = SPD_REG16(SPD_R_INTR_STAT) & DEV9_SMAP_INTR_MASK) != 0) { + if (IntrReg & SMAP_INTR_EMAC3) { + SMAP_REG16(SMAP_R_INTR_CLR) = SMAP_INTR_EMAC3; + SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTR_STAT, SMAP_E3_INTR_TX_ERR_0|SMAP_E3_INTR_SQE_ERR_0|SMAP_E3_INTR_DEAD_0); + } if (IntrReg & SMAP_INTR_RXEND) { SMAP_REG16(SMAP_R_INTR_CLR) = SMAP_INTR_RXEND; HandleRxIntr(&SmapDriverData); @@ -419,7 +423,7 @@ int SMAPStart(void) //Initialize the PHY, only if there's no valid link status. It should have already been previously initialized successfully by the previous instance of SMAP. result = (!(_smap_read_phy(emac3_regbase, SMAP_DsPHYTER_BMSR) & SMAP_PHY_BMSR_LINK)) ? InitPHY(&SmapDriverData) : 0; if (result == 0 && !SmapDriverData.NetDevStopFlag) { - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE0, SMAP_E3_TXMAC_ENABLE | SMAP_E3_RXMAC_ENABLE); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE0, SMAP_E3_TXMAC_ENABLE | SMAP_E3_RXMAC_ENABLE); DelayThread(10000); SmapDriverData.SmapIsInitialized = 1; @@ -448,7 +452,7 @@ void SMAPStop(void) emac3_regbase = SmapDriverData.emac3_regbase; dev9IntrDisable(DEV9_SMAP_INTR_MASK2); - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE0, 0); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE0, 0); SmapDriverData.NetDevStopFlag = 0; SmapDriverData.SmapIsInitialized = 0; } @@ -557,9 +561,8 @@ int smap_init(int argc, char *argv[]) DelayThread(1000); } - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE0, SMAP_E3_SOFT_RESET); - SMAP_EMAC3_GET(SMAP_R_EMAC3_MODE0); - for (i = 9; SMAP_EMAC3_GET(SMAP_R_EMAC3_MODE0) & SMAP_E3_SOFT_RESET; i--) { + SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE0, SMAP_E3_SOFT_RESET); + for (i = 9; SMAP_EMAC3_GET32(SMAP_R_EMAC3_MODE0) & SMAP_E3_SOFT_RESET; i--) { if (i <= 0) return -4; DelayThread(1000); @@ -596,32 +599,32 @@ int smap_init(int argc, char *argv[]) if (checksum16 != eeprom_data[3]) return -5; - SMAP_EMAC3_SET(SMAP_R_EMAC3_MODE1, SMAP_E3_FDX_ENABLE | SMAP_E3_IGNORE_SQE | SMAP_E3_MEDIA_100M | SMAP_E3_RXFIFO_2K | SMAP_E3_TXFIFO_1K | SMAP_E3_TXREQ0_SINGLE | SMAP_E3_TXREQ1_SINGLE); - SMAP_EMAC3_SET(SMAP_R_EMAC3_TxMODE1, 7 << SMAP_E3_TX_LOW_REQ_BITSFT | 15 << SMAP_E3_TX_URG_REQ_BITSFT); - SMAP_EMAC3_SET(SMAP_R_EMAC3_RxMODE, SMAP_E3_RX_STRIP_PAD | SMAP_E3_RX_STRIP_FCS | SMAP_E3_RX_INDIVID_ADDR | SMAP_E3_RX_BCAST | SMAP_E3_RX_MCAST); - SMAP_EMAC3_SET(SMAP_R_EMAC3_INTR_STAT, SMAP_E3_INTR_TX_ERR_0 | SMAP_E3_INTR_SQE_ERR_0 | SMAP_E3_INTR_DEAD_0); - //Do not handle the EMAC3 interrupts because the SONY original didn't do anything useful with them either. - SMAP_EMAC3_SET(SMAP_R_EMAC3_INTR_ENABLE, 0); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE1, SMAP_E3_FDX_ENABLE | SMAP_E3_IGNORE_SQE | SMAP_E3_MEDIA_100M | SMAP_E3_RXFIFO_2K | SMAP_E3_TXFIFO_1K | SMAP_E3_TXREQ0_SINGLE | SMAP_E3_TXREQ1_SINGLE); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_TxMODE1, 7 << SMAP_E3_TX_LOW_REQ_BITSFT | 15 << SMAP_E3_TX_URG_REQ_BITSFT); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_RxMODE, SMAP_E3_RX_STRIP_PAD | SMAP_E3_RX_STRIP_FCS | SMAP_E3_RX_INDIVID_ADDR | SMAP_E3_RX_BCAST | SMAP_E3_RX_MCAST); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTR_STAT, SMAP_E3_INTR_TX_ERR_0 | SMAP_E3_INTR_SQE_ERR_0 | SMAP_E3_INTR_DEAD_0); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTR_ENABLE, SMAP_E3_INTR_TX_ERR_0|SMAP_E3_INTR_SQE_ERR_0|SMAP_E3_INTR_DEAD_0); mac_address = (u16)(eeprom_data[0] >> 8 | eeprom_data[0] << 8); - SMAP_EMAC3_SET(SMAP_R_EMAC3_ADDR_HI, mac_address); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_ADDR_HI, mac_address); mac_address = ((u16)(eeprom_data[1] >> 8 | eeprom_data[1] << 8) << 16) | (u16)(eeprom_data[2] >> 8 | eeprom_data[2] << 8); - SMAP_EMAC3_SET(SMAP_R_EMAC3_ADDR_LO, mac_address); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_ADDR_LO, mac_address); - SMAP_EMAC3_SET(SMAP_R_EMAC3_PAUSE_TIMER, 0xFFFF); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_PAUSE_TIMER, 0xFFFF); - SMAP_EMAC3_SET(SMAP_R_EMAC3_GROUP_HASH1, 0); - SMAP_EMAC3_SET(SMAP_R_EMAC3_GROUP_HASH2, 0); - SMAP_EMAC3_SET(SMAP_R_EMAC3_GROUP_HASH3, 0); - SMAP_EMAC3_SET(SMAP_R_EMAC3_GROUP_HASH4, 0); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH1, 0); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH2, 0); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH3, 0); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH4, 0); - SMAP_EMAC3_SET(SMAP_R_EMAC3_INTER_FRAME_GAP, 4); - SMAP_EMAC3_SET(SMAP_R_EMAC3_TX_THRESHOLD, 12 << SMAP_E3_TX_THRESHLD_BITSFT); - SMAP_EMAC3_SET(SMAP_R_EMAC3_RX_WATERMARK, 16 << SMAP_E3_RX_LO_WATER_BITSFT | 128 << SMAP_E3_RX_HI_WATER_BITSFT); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTER_FRAME_GAP, 4); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_TX_THRESHOLD, 12 << SMAP_E3_TX_THRESHLD_BITSFT); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_RX_WATERMARK, 16 << SMAP_E3_RX_LO_WATER_BITSFT | 128 << SMAP_E3_RX_HI_WATER_BITSFT); - //Unlike the SONY original, register the interrupt handler for only RXEND. + //Unlike the SONY original, register the interrupt handler for only RXEND and EMAC3. dev9RegisterIntrCb(5, &Dev9IntrCb); /* RXEND */ + dev9RegisterIntrCb(6, &Dev9IntrCb); /* EMAC3 */ dev9RegisterPreDmaCb(1, &Dev9PreDmaCbHandler); dev9RegisterPostDmaCb(1, &Dev9PostDmaCbHandler); @@ -636,8 +639,8 @@ int SMAPGetMACAddress(unsigned char *buffer) emac3_regbase = SmapDriverData.emac3_regbase; - mac_address_hi = SMAP_EMAC3_GET(SMAP_R_EMAC3_ADDR_HI); - mac_address_lo = SMAP_EMAC3_GET(SMAP_R_EMAC3_ADDR_LO); + mac_address_hi = SMAP_EMAC3_GET32(SMAP_R_EMAC3_ADDR_HI); + mac_address_lo = SMAP_EMAC3_GET32(SMAP_R_EMAC3_ADDR_LO); buffer[0] = mac_address_hi >> 8; buffer[1] = mac_address_hi; buffer[2] = mac_address_lo >> 24; diff --git a/modules/network/smap-ingame/xfer.c b/modules/network/smap-ingame/xfer.c index 8ac34da58..513b75af0 100644 --- a/modules/network/smap-ingame/xfer.c +++ b/modules/network/smap-ingame/xfer.c @@ -44,7 +44,7 @@ static inline int CopyFromFIFOWithDMA(volatile u8 *smap_regbase, void *buffer, i { int result; USE_SPD_REGS; - unsigned short int OldDMACtrl; + u16 OldDMACtrl; //Attempt to steal the DMA channel from the DEV9 module. if ((result = length / 128) > 0) { @@ -139,7 +139,7 @@ inline int HandleRxIntr(struct SmapDriverData *SmapDrivPrivData) volatile smap_bd_t *PktBdPtr; volatile u8 *smap_regbase; struct pbuf *pbuf; - unsigned short int ctrl_stat; + u16 ctrl_stat; smap_regbase = SmapDrivPrivData->smap_regbase; diff --git a/modules/pademu/Makefile b/modules/pademu/Makefile index cd95782f4..f9fe04f85 100644 --- a/modules/pademu/Makefile +++ b/modules/pademu/Makefile @@ -12,6 +12,9 @@ IOP_CFLAGS += -DBT -DUSE_THREAD IOP_OBJNAME = bt. IOP_OBJS += ds3bt.o endif +ifeq ($(VMC),1) +IOP_CFLAGS += -DVMC +endif IOP_OBJS := $(IOP_OBJS:%=$(IOP_OBJNAME)%) diff --git a/modules/pademu/ds3bt.c b/modules/pademu/ds3bt.c index e9ce0dd32..7a944026b 100644 --- a/modules/pademu/ds3bt.c +++ b/modules/pademu/ds3bt.c @@ -292,23 +292,25 @@ UsbDriver chrg_driver = {NULL, NULL, "chrg", chrg_probe, chrg_connect, chrg_disc /* PS Remote Reports */ static uint8_t feature_F4_report[] = - { - 0x42, 0x03, 0x00, 0x00}; +{ + 0x42, 0x03, 0x00, 0x00 +}; static uint8_t output_01_report[] = - { - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00}; +{ + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 +}; static uint8_t led_patterns[][2] = { @@ -318,75 +320,76 @@ static uint8_t led_patterns[][2] = { 0x0E, 0x10 }, }; -static uint8_t power_level[] = +static uint8_t power_level[] = { - 0x00, 0x02, 0x06, 0x0E, 0x1E + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E }; // Taken from nefarius' SCPToolkit // https://github.com/nefarius/ScpToolkit/blob/master/ScpControl/ScpControl.ini // Valid MAC addresses used by Sony static uint8_t GenuineMacAddress[][3] = - { - // Bluetooth chips by ALPS ELECTRIC CO., LTD - {0x00, 0x02, 0xC7}, - {0x00, 0x06, 0xF5}, - {0x00, 0x06, 0xF7}, - {0x00, 0x07, 0x04}, - {0x00, 0x16, 0xFE}, - {0x00, 0x19, 0xC1}, - {0x00, 0x1B, 0xFB}, - {0x00, 0x1E, 0x3D}, - {0x00, 0x21, 0x4F}, - {0x00, 0x23, 0x06}, - {0x00, 0x24, 0x33}, - {0x00, 0x26, 0x43}, - {0x00, 0xA0, 0x79}, - {0x04, 0x76, 0x6E}, - {0x04, 0x98, 0xF3}, - {0x28, 0xA1, 0x83}, - {0x34, 0xC7, 0x31}, - {0x38, 0xC0, 0x96}, - {0x60, 0x38, 0x0E}, - {0x64, 0xD4, 0xBD}, - {0xAC, 0x7A, 0x4D}, - {0xE0, 0x75, 0x0A}, - {0xE0, 0xAE, 0x5E}, - {0xFC, 0x62, 0xB9}, - // Bluetooth chips by AzureWave Technology Inc. - {0xE0, 0xB9, 0xA5}, - {0xDC, 0x85, 0xDE}, - {0xD0, 0xE7, 0x82}, - {0xB0, 0xEE, 0x45}, - {0xAC, 0x89, 0x95}, - {0xA8, 0x1D, 0x16}, - {0x94, 0xDB, 0xC9}, - {0x80, 0xD2, 0x1D}, - {0x80, 0xA5, 0x89}, - {0x78, 0x18, 0x81}, - {0x74, 0xF0, 0x6D}, - {0x74, 0xC6, 0x3B}, - {0x74, 0x2F, 0x68}, - {0x6C, 0xAD, 0xF8}, - {0x6C, 0x71, 0xD9}, - {0x60, 0x5B, 0xB4}, - {0x5C, 0x96, 0x56}, - {0x54, 0x27, 0x1E}, - {0x4C, 0xAA, 0x16}, - {0x48, 0x5D, 0x60}, - {0x44, 0xD8, 0x32}, - {0x40, 0xE2, 0x30}, - {0x38, 0x4F, 0xF0}, - {0x28, 0xC2, 0xDD}, - {0x24, 0x0A, 0x64}, - {0x1C, 0x4B, 0xD6}, - {0x08, 0xA9, 0x5A}, - {0x00, 0x25, 0xD3}, - {0x00, 0x24, 0x23}, - {0x00, 0x22, 0x43}, - {0x00, 0x15, 0xAF}, - //fake with AirohaTechnologyCorp's Chip - {0x0C, 0xFC, 0x83}}; +{ + // Bluetooth chips by ALPS ELECTRIC CO., LTD + {0x00, 0x02, 0xC7}, + {0x00, 0x06, 0xF5}, + {0x00, 0x06, 0xF7}, + {0x00, 0x07, 0x04}, + {0x00, 0x16, 0xFE}, + {0x00, 0x19, 0xC1}, + {0x00, 0x1B, 0xFB}, + {0x00, 0x1E, 0x3D}, + {0x00, 0x21, 0x4F}, + {0x00, 0x23, 0x06}, + {0x00, 0x24, 0x33}, + {0x00, 0x26, 0x43}, + {0x00, 0xA0, 0x79}, + {0x04, 0x76, 0x6E}, + {0x04, 0x98, 0xF3}, + {0x28, 0xA1, 0x83}, + {0x34, 0xC7, 0x31}, + {0x38, 0xC0, 0x96}, + {0x60, 0x38, 0x0E}, + {0x64, 0xD4, 0xBD}, + {0xAC, 0x7A, 0x4D}, + {0xE0, 0x75, 0x0A}, + {0xE0, 0xAE, 0x5E}, + {0xFC, 0x62, 0xB9}, + // Bluetooth chips by AzureWave Technology Inc. + {0xE0, 0xB9, 0xA5}, + {0xDC, 0x85, 0xDE}, + {0xD0, 0xE7, 0x82}, + {0xB0, 0xEE, 0x45}, + {0xAC, 0x89, 0x95}, + {0xA8, 0x1D, 0x16}, + {0x94, 0xDB, 0xC9}, + {0x80, 0xD2, 0x1D}, + {0x80, 0xA5, 0x89}, + {0x78, 0x18, 0x81}, + {0x74, 0xF0, 0x6D}, + {0x74, 0xC6, 0x3B}, + {0x74, 0x2F, 0x68}, + {0x6C, 0xAD, 0xF8}, + {0x6C, 0x71, 0xD9}, + {0x60, 0x5B, 0xB4}, + {0x5C, 0x96, 0x56}, + {0x54, 0x27, 0x1E}, + {0x4C, 0xAA, 0x16}, + {0x48, 0x5D, 0x60}, + {0x44, 0xD8, 0x32}, + {0x40, 0xE2, 0x30}, + {0x38, 0x4F, 0xF0}, + {0x28, 0xC2, 0xDD}, + {0x24, 0x0A, 0x64}, + {0x1C, 0x4B, 0xD6}, + {0x08, 0xA9, 0x5A}, + {0x00, 0x25, 0xD3}, + {0x00, 0x24, 0x23}, + {0x00, 0x22, 0x43}, + {0x00, 0x15, 0xAF}, + //fake with AirohaTechnologyCorp's Chip + {0x0C, 0xFC, 0x83} +}; /* variables used by high level HCI task */ static uint16_t hci_counter_; // counter used for bluetooth HCI loops @@ -1218,6 +1221,9 @@ static uint8_t initPSController(int pad) } #define DATA_START 11 +#define MAX_DELAY 10 + +static uint8_t btn_delay = 0; static void readReport(uint8_t *data, int bytes, int pad) { @@ -1249,7 +1255,7 @@ static void readReport(uint8_t *data, int bytes, int pad) ds3pad[pad].data[15] = ((data[DATA_START + ButtonStateH] >> 3) & 1) * 255; //R1 ds3pad[pad].data[16] = ((data[DATA_START + ButtonStateH] >> 0) & 1) * 255; //L2 ds3pad[pad].data[17] = ((data[DATA_START + ButtonStateH] >> 1) & 1) * 255; //R2 - + data[DATA_START + Power] = 0x05; } else { ds3pad[pad].data[6] = data[DATA_START + PressureRight]; //right @@ -1267,25 +1273,29 @@ static void readReport(uint8_t *data, int bytes, int pad) ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 } - + if (data[DATA_START + PSButtonState]) { //display battery level - if(data[DATA_START + ButtonStateL] == 0x01) { //PS + SELECT + if ((data[DATA_START + ButtonStateL] & 1) && (btn_delay == MAX_DELAY)) { //PS + SELECT if(ds3pad[pad].analog_btn < 2) //unlocked mode ds3pad[pad].analog_btn = !ds3pad[pad].analog_btn; ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; + btn_delay = 0; } else if(data[DATA_START + Power] != 0xEE) - ds3pad[pad].oldled = power_level[data[DATA_START + Power] - 1]; + ds3pad[pad].oldled = power_level[data[DATA_START + Power]]; + + if (btn_delay < MAX_DELAY) + btn_delay++; } else ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; - + if (data[DATA_START + Power] == 0xEE) //charging ds3pad[pad].oldled |= 0x80; else ds3pad[pad].oldled &= 0x7F; - + } else { DPRINTF("Unmanaged Input Report: THDR 0x%x ", data[8]); DPRINTF(" ID 0x%x\n", data[9]); @@ -1539,13 +1549,9 @@ int ds3bt_get_status(int port) int ds3bt_init(uint8_t pads) { - int ret; - enable_pad = pads; - ret = UsbRegisterDriver(&bt_driver); - - if (ret != USB_RC_OK) { + if (UsbRegisterDriver(&bt_driver) != USB_RC_OK) { DPRINTF("BT: Error registering USB devices\n"); return 0; } diff --git a/modules/pademu/ds3usb.c b/modules/pademu/ds3usb.c index d4b0987f8..5430e380c 100644 --- a/modules/pademu/ds3usb.c +++ b/modules/pademu/ds3usb.c @@ -23,19 +23,20 @@ #define MAX_PADS 2 static uint8_t output_01_report[] = - { - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00}; +{ + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 +}; static uint8_t led_patterns[][2] = { @@ -45,9 +46,9 @@ static uint8_t led_patterns[][2] = { 0x0E, 0x10 }, }; -static uint8_t power_level[] = +static uint8_t power_level[] = { - 0x00, 0x02, 0x06, 0x0E, 0x1E + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E }; static uint8_t usb_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; @@ -63,9 +64,9 @@ UsbDriver usb_driver = {NULL, NULL, "ds3usb", usb_probe, usb_connect, usb_discon static void DS3USB_init(int pad); static void readReport(uint8_t *data, int pad); -static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); -static uint8_t LED(uint8_t led, int pad); -static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad); +static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); +static int LED(uint8_t led, int pad); +static int Rumble(uint8_t lrum, uint8_t rrum, int pad); typedef struct _usb_ds3 { @@ -184,6 +185,9 @@ int usb_disconnect(int devId) break; } + if (ds3pad[pad].eventEndp >= 0) + UsbCloseEndpoint(ds3pad[pad].eventEndp); + if (pad < MAX_PADS && (ds3pad[pad].status & DS3USB_STATE_AUTHORIZED)) usb_release(pad); @@ -192,12 +196,6 @@ int usb_disconnect(int devId) static void usb_release(int pad) { - if (ds3pad[pad].sema >= 0) - WaitSema(ds3pad[pad].sema); - - if (ds3pad[pad].eventEndp >= 0) - UsbCloseEndpoint(ds3pad[pad].eventEndp); - if (ds3pad[pad].sema >= 0) DeleteSema(ds3pad[pad].sema); @@ -210,8 +208,7 @@ static void usb_release(int pad) static void usb_data_cb(int resultCode, int bytes, void *arg) { int pad = (int)arg; - - PollSema(ds3pad[pad].sema); + //DPRINTF("usb_data_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); if (!resultCode) @@ -255,6 +252,9 @@ static void DS3USB_init(int pad) } #define DATA_START 2 +#define MAX_DELAY 10 + +static uint8_t btn_delay = 0; static void readReport(uint8_t *data, int pad) { @@ -283,14 +283,18 @@ static void readReport(uint8_t *data, int pad) ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 if (data[DATA_START + PSButtonState]) { //display battery level - if(data[DATA_START + ButtonStateL] == 0x01) { //PS + SELECT + if ((data[DATA_START + ButtonStateL] & 1) && (btn_delay == MAX_DELAY)) { //PS + SELECT if(ds3pad[pad].analog_btn < 2) //unlocked mode ds3pad[pad].analog_btn = !ds3pad[pad].analog_btn; ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; + btn_delay = 0; } else if(data[DATA_START + Power] != 0xEE) - ds3pad[pad].oldled = power_level[data[DATA_START + Power] - 1]; + ds3pad[pad].oldled = power_level[data[DATA_START + Power]]; + + if (btn_delay < MAX_DELAY) + btn_delay++; } else ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; @@ -302,7 +306,7 @@ static void readReport(uint8_t *data, int pad) } } -static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) +static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) { mips_memcpy(usb_buf, output_01_report, sizeof(output_01_report)); @@ -328,17 +332,40 @@ static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) return UsbControlTransfer(ds3pad[pad].controlEndp, bmREQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_SET_REPORT_OUTPUT << 8) | 0x01, 0, sizeof(output_01_report), usb_buf, usb_cmd_cb, (void *)pad); } -static uint8_t LED(uint8_t led, int pad) +static unsigned int timeout(void *arg) +{ + int sema = (int)arg; + iSignalSema(sema); + return 0; +} + +static void TransferWait(int sema) +{ + iop_sys_clock_t cmd_timeout; + + cmd_timeout.lo = 200000; + cmd_timeout.hi = 0; + + if (SetAlarm(&cmd_timeout, timeout, (void *)sema) == 0) { + WaitSema(sema); + CancelAlarm(timeout, NULL); + } +} + +static int LED(uint8_t led, int pad) { return LEDRumble(led, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); } -static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad) +static int Rumble(uint8_t lrum, uint8_t rrum, int pad) { - uint8_t ret; + int ret; ret = LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); - WaitSema(ds3pad[pad].sema); + if (ret == USB_RC_OK) + TransferWait(ds3pad[pad].sema); + else + DPRINTF("DS3USB: LEDRumble usb transfer error %d\n", ret); return ret; } @@ -355,12 +382,15 @@ void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port) int ds3usb_get_data(char *dst, int size, int port) { int ret; - + WaitSema(ds3pad[port].sema); - UsbInterruptTransfer(ds3pad[port].eventEndp, usb_buf, MAX_BUFFER_SIZE, usb_data_cb, (void *)port); + ret = UsbInterruptTransfer(ds3pad[port].eventEndp, usb_buf, MAX_BUFFER_SIZE, usb_data_cb, (void *)port); - WaitSema(ds3pad[port].sema); + if (ret == USB_RC_OK) + TransferWait(ds3pad[port].sema); + else + DPRINTF("DS3USB: ds3usb_get_data usb transfer error %d\n", ret); mips_memcpy(dst, ds3pad[port].data, size); ret = ds3pad[port].analog_btn & 1; @@ -408,8 +438,7 @@ int ds3usb_get_status(int port) int ds3usb_init(uint8_t pads) { - int ret; - uint8_t pad; + int pad; for (pad = 0; pad < MAX_PADS; pad++) { ds3pad[pad].status = 0; @@ -430,9 +459,7 @@ int ds3usb_init(uint8_t pads) mips_memset(&ds3pad[pad].data[6], 0x00, 12); } - ret = UsbRegisterDriver(&usb_driver); - - if (ret != USB_RC_OK) { + if (UsbRegisterDriver(&usb_driver) != USB_RC_OK) { DPRINTF("DS3USB: Error registering USB devices\n"); return 0; } diff --git a/modules/pademu/imports.lst b/modules/pademu/imports.lst index 052af8da9..f0e76a165 100644 --- a/modules/pademu/imports.lst +++ b/modules/pademu/imports.lst @@ -1,5 +1,6 @@ loadcore_IMPORTS_start I_RegisterLibraryEntries +I_ReleaseLibraryEntries I_GetLoadcoreInternalData I_QueryLibraryEntryTable loadcore_IMPORTS_end @@ -14,6 +15,7 @@ I_SignalSema I_WaitSema I_PollSema I_DeleteSema +I_iSignalSema thsemap_IMPORTS_end thbase_IMPORTS_start @@ -25,6 +27,8 @@ I_GetThreadId I_SleepThread I_WakeupThread I_TerminateThread +I_SetAlarm +I_CancelAlarm thbase_IMPORTS_end intrman_IMPORTS_start @@ -44,6 +48,9 @@ usbd_IMPORTS_end sysclib_IMPORTS_start I_strncmp +I_sprintf +I_strcpy +I_strcat #ifndef USE_SMSUTILS I_memset I_memcpy diff --git a/modules/pademu/pademu.c b/modules/pademu/pademu.c index 3668018ad..49c9ca4fd 100644 --- a/modules/pademu/pademu.c +++ b/modules/pademu/pademu.c @@ -104,11 +104,16 @@ int _start(int argc, char *argv[]) return MODULE_NO_RESIDENT_END; } -#ifndef VMC - if (!install_sio2hook()) { - return MODULE_NO_RESIDENT_END; - } +#ifdef VMC + uint8_t vmc = 0; + + if (argc > 1) + vmc = argv[1][3]; + + if(!vmc) #endif + if (!install_sio2hook()) + return MODULE_NO_RESIDENT_END; pademu_setup(enable, vibration); @@ -160,9 +165,18 @@ void InstallSio2manHook(void *exp) /* Hook for the LOADCORE's RegisterLibraryEntires call */ int hookRegisterLibraryEntires(iop_library_t *lib) { + register int ret; + if (!strncmp(lib->name, "sio2man", 8)) { - /* hooking SIO2MAN's routines */ - InstallSio2manHook(&lib[1]); + ret = pRegisterLibraryEntires(lib); + if (ret == 0) { + ReleaseLibraryEntries((struct irx_export_table *)lib); + /* hooking SIO2MAN's routines */ + InstallSio2manHook(&lib[1]); + } else { + DPRINTF("registering library %s failed, error %d\n", lib->name, ret); + return ret; + } } DPRINTF("registering library %s\n", lib->name); @@ -349,7 +363,7 @@ void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) break; case 0x43: //enter/exit config mode - if (pad[port].mode_cfg) { + if (pad[port].mode_cfg) { pad[port].mode_cfg = in[3]; break; } diff --git a/modules/usb/usbhdfsd/LICENSE b/modules/usb/usbhdfsd/LICENSE deleted file mode 100755 index ea811ce0e..000000000 --- a/modules/usb/usbhdfsd/LICENSE +++ /dev/null @@ -1,166 +0,0 @@ - - The Academic Free License - v. 2.0 - -This Academic Free License (the "License") applies to any original work -of authorship (the "Original Work") whose owner (the "Licensor") has -placed the following notice immediately following the copyright notice -for the Original Work: - - *Licensed under the Academic Free License version 2.0* - -1) *Grant of Copyright License.* Licensor hereby grants You a -world-wide, royalty-free, non-exclusive, perpetual, sublicenseable -license to do the following: - - a) to reproduce the Original Work in copies; - - b) to prepare derivative works ("Derivative Works") based upon the - Original Work; - - c) to distribute copies of the Original Work and Derivative Works to - the public; - - d) to perform the Original Work publicly; and - - e) to display the Original Work publicly. - -2) *Grant of Patent License.* Licensor hereby grants You a world-wide, -royalty-free, non-exclusive, perpetual, sublicenseable license, under -patent claims owned or controlled by the Licensor that are embodied in -the Original Work as furnished by the Licensor, to make, use, sell and -offer for sale the Original Work and Derivative Works. - -3) *Grant of Source Code License.* The term "Source Code" means the -preferred form of the Original Work for making modifications to it and -all available documentation describing how to modify the Original Work. -Licensor hereby agrees to provide a machine-readable copy of the Source -Code of the Original Work along with each copy of the Original Work that -Licensor distributes. Licensor reserves the right to satisfy this -obligation by placing a machine-readable copy of the Source Code in an -information repository reasonably calculated to permit inexpensive and -convenient access by You for as long as Licensor continues to distribute -the Original Work, and by publishing the address of that information -repository in a notice immediately following the copyright notice that -applies to the Original Work. - -4) *Exclusions From License Grant. *Neither the names of Licensor, nor -the names of any contributors to the Original Work, nor any of their -trademarks or service marks, may be used to endorse or promote products -derived from this Original Work without express prior written permission -of the Licensor. Nothing in this License shall be deemed to grant any -rights to trademarks, copyrights, patents, trade secrets or any other -intellectual property of Licensor except as expressly stated herein. No -patent license is granted to make, use, sell or offer to sell -embodiments of any patent claims other than the licensed claims defined -in Section 2. No right is granted to the trademarks of Licensor even if -such marks are included in the Original Work. Nothing in this License -shall be interpreted to prohibit Licensor from licensing under different -terms from this License any Original Work that Licensor otherwise would -have a right to license. - -5) This section intentionally omitted. - -6) *Attribution Rights.* You must retain, in the Source Code of any -Derivative Works that You create, all copyright, patent or trademark -notices from the Source Code of the Original Work, as well as any -notices of licensing and any descriptive text identified therein as an -"Attribution Notice." You must cause the Source Code for any Derivative -Works that You create to carry a prominent Attribution Notice reasonably -calculated to inform recipients that You have modified the Original Work. - -7) *Warranty of Provenance and Disclaimer of Warranty.* Licensor -warrants that the copyright in and to the Original Work and the patent -rights granted herein by Licensor are owned by the Licensor or are -sublicensed to You under the terms of this License with the permission -of the contributor(s) of those copyrights and patent rights. Except as -expressly stated in the immediately proceeding sentence, the Original -Work is provided under this License on an "AS IS" BASIS and WITHOUT -WARRANTY, either express or implied, including, without limitation, the -warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL -WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential -part of this License. No license to Original Work is granted hereunder -except under this disclaimer. - -8) *Limitation of Liability.* Under no circumstances and under no legal -theory, whether in tort (including negligence), contract, or otherwise, -shall the Licensor be liable to any person for any direct, indirect, -special, incidental, or consequential damages of any character arising -as a result of this License or the use of the Original Work including, -without limitation, damages for loss of goodwill, work stoppage, -computer failure or malfunction, or any and all other commercial damages -or losses. This limitation of liability shall not apply to liability for -death or personal injury resulting from Licensor's negligence to the -extent applicable law prohibits such limitation. Some jurisdictions do -not allow the exclusion or limitation of incidental or consequential -damages, so this exclusion and limitation may not apply to You. - -9) *Acceptance and Termination.* If You distribute copies of the -Original Work or a Derivative Work, You must make a reasonable effort -under the circumstances to obtain the express assent of recipients to -the terms of this License. Nothing else but this License (or another -written agreement between Licensor and You) grants You permission to -create Derivative Works based upon the Original Work or to exercise any -of the rights granted in Section 1 herein, and any attempt to do so -except under the terms of this License (or another written agreement -between Licensor and You) is expressly prohibited by U.S. copyright law, -the equivalent laws of other countries, and by international treaty. -Therefore, by exercising any of the rights granted to You in Section 1 -herein, You indicate Your acceptance of this License and all of its -terms and conditions. - -10) *Termination for Patent Action.* This License shall terminate -automatically and You may no longer exercise any of the rights granted -to You by this License as of the date You commence an action, including -a cross-claim or counterclaim, for patent infringement (i) against -Licensor with respect to a patent applicable to software or (ii) against -any entity with respect to a patent applicable to the Original Work (but -excluding combinations of the Original Work with other software or -hardware). - -11) *Jurisdiction, Venue and Governing Law.* Any action or suit relating -to this License may be brought only in the courts of a jurisdiction -wherein the Licensor resides or in which Licensor conducts its primary -business, and under the laws of that jurisdiction excluding its -conflict-of-law provisions. The application of the United Nations -Convention on Contracts for the International Sale of Goods is expressly -excluded. Any use of the Original Work outside the scope of this License -or after its termination shall be subject to the requirements and -penalties of the U.S. Copyright Act, 17 U.S.C. 101 et seq., the -equivalent laws of other countries, and international treaty. This -section shall survive the termination of this License. - -12) *Attorneys Fees.* In any action to enforce the terms of this License -or seeking damages relating thereto, the prevailing party shall be -entitled to recover its costs and expenses, including, without -limitation, reasonable attorneys' fees and costs incurred in connection -with such action, including any appeal of such action. This section -shall survive the termination of this License. - -13) *Miscellaneous.* This License represents the complete agreement -concerning the subject matter hereof. If any provision of this License -is held to be unenforceable, such provision shall be reformed only to -the extent necessary to make it enforceable. - -14) *Definition of "You" in This License.* "You" throughout this -License, whether in upper or lower case, means an individual or a legal -entity exercising rights under, and complying with all of the terms of, -this License. For legal entities, "You" includes any entity that -controls, is controlled by, or is under common control with you. For -purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether -by contract or otherwise, or (ii) ownership of fifty percent (50%) or -more of the outstanding shares, or (iii) beneficial ownership of such -entity. - -15) *Right to Use.* You may use the Original Work in all ways not -otherwise restricted or conditioned by this License or by law, and -Licensor promises not to interfere with or be responsible for such uses -by You. - -This license is Copyright (C) 2003 Lawrence E. Rosen. All rights -reserved. Permission is hereby granted to copy and distribute this -license without modification. This license may not be modified without -the express written permission of its copyright owner. - diff --git a/modules/usb/usbhdfsd/Makefile b/modules/usb/usbhdfsd/Makefile deleted file mode 100755 index 8152822ef..000000000 --- a/modules/usb/usbhdfsd/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: $ - -IOP_BIN = usbhdfsd.irx -IOP_OBJS = usb_driver.o fs_driver.o part_driver.o fat_driver.o scache.o usbhdfsd.o imports.o exports.o -IOP_LIBS = - -IOP_INCS += -I../../../include/ -IOP_CFLAGS += -Wall -fno-builtin-printf -IOP_LDFLAGS += -s - -WRITE_SUPPORT=1 - -ifeq ($(WRITE_SUPPORT),1) -IOP_CFLAGS += -DWRITE_SUPPORT -IOP_OBJS += fat_write.o -endif - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) - -rebuild: clean all - -run: - ps2client -t 1 execiop host:$(IOP_BIN) - - -include $(PS2SDK)/Defs.make -include ../../Rules.make diff --git a/modules/usb/usbhdfsd/doc/README.TXT b/modules/usb/usbhdfsd/doc/README.TXT deleted file mode 100755 index 6a23c73db..000000000 --- a/modules/usb/usbhdfsd/doc/README.TXT +++ /dev/null @@ -1,22 +0,0 @@ -This project is based directly off the original "USB_MASS" project. I've removed the PC testing stuff like VFAT, etc -and some of the debugging things. I've also removed the RPC server. In addition I split some files up into -more files and renamed other files. - -I don't take credit for this project, see the documents in "docs/usb_mass" for the original readme.txt though some -information in it is no longer valid. The credits have been stripped from the source files, see the bottom of this -document for a list of known contributors if you have contributed to this project, feel free to add to the list. - -This project is, of course, still released under AFL 2.0. My reasoning for creating a new project based on the old -one was that there were too many different strains of USB_MASS floating around and I intend to change the project -design significantly enough that I could forsee problems in the future. - -This module incorporates a number of fixes to bugs which existed in the old USB_MASS project and increases compatability -with devices. It correctly supports directory functions such as dopen/dread/etc. - -- Herben '06 - -Marek Olejnik (ole00@post.cz) - original project author -Hermes (support for sector sizes from 512 to 4096 bytes) -raipsu (fs_dopen, fs_dclose, fs_dread, fs_getstat implementation) -MegaMan(several fixes) -Herben (several fixes, reorganization, etc) diff --git a/modules/usb/usbhdfsd/doc/usb_mass/README.TXT b/modules/usb/usbhdfsd/doc/usb_mass/README.TXT deleted file mode 100755 index 8dce1c833..000000000 --- a/modules/usb/usbhdfsd/doc/usb_mass/README.TXT +++ /dev/null @@ -1,125 +0,0 @@ ------------------------------------------------------------------------------ - USB_MASS - the usb mass storage driver for ps2 - ver. 0.31 ------------------------------------------------------------------------------ - -This is the driver for ps2 that supports usb flash drives and other usb -mass storage devices plugged in the 'black box'. -The basic idea is to plug the usb bar flash disk into ps2 usb port and -be able to access stored files from within the homebrew ps2 programs. - -Supported hardware: - - bulk only devices with scsi command set (I hope that most of the recent - flash disks will work) - Tested with: - * Seitec Usb Bar (1022_128M sticker) - working - * SWEEX (FX300010) 6 In 1 multi pannel - first CF slot working - * ViPowER usb to ide cable (VP-9208 + VP-9054V HDD enclosure) - working - * Ne Way MP3 player 256MB - * MSI Mega Stick 511 (128MB, MP3 player) - working - * iMex-A2U2 external HDD enclosure - working (in case the disk/driver - behaves inreliably - use supplied power cable) - -Supported features: - - fat12, fat16, fat32. First suitable partition is used. - - basic support for long filenames (128 chars in the filename). - - read and write access. - Note: write access is experimental - use at your own risks! - -Missing features: - - multi partition acces - - real unicode decoding and conversion for long filenames - - only one mass device connected is currently supported - - file system error detection - if you plug in disk with corrupted - filesystem then the resluts are unspecified - - and much more :-) Driver is still in development so you may - encounter many bugs. - - -How to use: -The usb_mass driver requires that usbd.irx is loaded. You can use either -usbd.irx that can be found on some games and demo disks or you can use -npm_usbd.irx that is part of the naplink ps2 server side. Then load -the mass_usb.irx and you are ready to acces the "mass:" device by calling -fioOpen("mass:xxx/yyy.txt", O_RDONLY), fioRead etc. When you plug in -the flash disk (the supported one) you should see the message on the -console ("usb_mass: connect ok!") which means that device is recognised -and ready to use. There is an example in the ee directory that lists -directory content of the disk's root directory. - -Performance: -My tests show that file transfer speed is about 500kbytes per second. -If large non fragmented files are accesed (several megabytes) then the -speed jumps at 550kbytes/s. It's not much but when compared to maximum -usb 1.1 tranfer speed it's not that bad (max is about 700kb/s). - -Compilation: -Copy the content to ps2sdk/samples/usb_mass directory and run make -in ee and/or iop subdirectory to get example elf and driver irx. - - -Change log: - -ver 0.32 (EEUG) --------- -- Handle devices without partition table (floppy-like) - -ver 0.31 --------- -- Compatibility improvement in warmup stage by BraveDog - -ver 0.30 --------- -- Write support for fat12, fat16 and fat32 file systems. - The write support is disabled by default because I did'n run - extensive tests, so there is a risk of loosing your data. - If you want to enable it then modify the makefile inside the - iop directory, uncomment the 'WRITE_SUPPORT' variable and recompile. - - !!!! Don't forget to BACKUP YOUR DATA first !!!! - - note: - fioRmdir requires device number in the name (use 'mass0:\xx..'). - - fioRemove bug (calling fioMkdir afterwards) was hack-patched. - - -ver 0.24 --------- -- bugfix - scsi inquiry command asked more data than required -- removed device reset during configuration of the device (caused freeze for - some devices, other devices were able to survive the reset ) - -ver 0.23 --------- -- dopen dclose dread getstat implementation by raipsu - -ver 0.22 --------- -Hermes Notes: --Added support for different sizes of sector (512 to 4096) --Modified scache control and reader to read blocks of 4096 bytes. It use the same memory and run well. --Some changes necessary in fat_driver --Tested in a 128MB Pendrive with FAT16 and 512bytes per sector (4 sector per cluster) --Tested in a Ne Way MP3 player 256MB with FAT16 & FAT32, 2048 bytes per sector (2 sector per cluster) - -ver 0.21 --------- -- ps2sdk compatible - -ver 0.2 -------- -- support for the fat32 filesystem - -ver 0.1 -------- --initial version - - -Credits: (alphabetical order :) -BraveDog,Jonathan Fox (FAT system guide), Hermes, mrbrown, ole, oobles, -Gustvo Scotti, raipsu, TyRaNiD, and the ps2dev scene. - -Thanks: -to all folks who helped me with testing. - -License: -See the file LICENSE included with this distribution for licensing terms. diff --git a/modules/usb/usbhdfsd/exports.tab b/modules/usb/usbhdfsd/exports.tab deleted file mode 100644 index b53bc9093..000000000 --- a/modules/usb/usbhdfsd/exports.tab +++ /dev/null @@ -1,12 +0,0 @@ -/**/ - -DECLARE_EXPORT_TABLE(usbmass, 1, 1) - DECLARE_EXPORT(_start) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(UsbMassGetDeviceInfo) - DECLARE_EXPORT(UsbMassRegisterCallback) -END_EXPORT_TABLE - -void _retonly() {} diff --git a/modules/usb/usbhdfsd/fat.h b/modules/usb/usbhdfsd/fat.h deleted file mode 100644 index ee35c0890..000000000 --- a/modules/usb/usbhdfsd/fat.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * fat.h - USB Mass storage driver for PS2 - * - * (C) 2004, Marek Olejnik (ole00@post.cz) - * - * FAT helper structures - * - * See the file LICENSE included with this distribution for licensing terms. - */ - -/* - FAT References: http://www.igd.fhg.de/~aschaefe/fips/distrib/techinfo.txt - : http://home.freeuk.net/foxy2k/disk/disk1.htm -*/ - -#ifndef _FAT_H -#define _FAT_H 1 - -#define FAT12 0x0C -#define FAT16 0x10 -#define FAT32 0x20 - -#define FAT_MAX_PATH 260 - -/* bios parameter block - bpb - fat12, fat16 */ -typedef struct _fat_raw_bpb -{ - unsigned char jump[3]; //jump instruction ('eb xx 90' or 'e9 xx xx') - unsigned char oem[8]; //OEM name and version - e.g. MSDOS5.0 - unsigned char sectorSize[2]; //bytes per sector - should be 512 - unsigned char clusterSize; //sectors per cluster - power of two - unsigned char resSectors[2]; //reserved sectors - typically 1 (boot sector) - unsigned char fatCount; //number of FATs - must be 2 - unsigned char rootSize[2]; //number of rootdirectory entries - typically 512 - unsigned char sectorCountO[2]; //number of sectors (short) - 0, if BIGDOS partition - unsigned char mediaDesc; //media descriptor - typically f8h - unsigned char fatSize[2]; //sectors per FAT - varies - unsigned char trackSize[2]; //sectors per track - unsigned char headCount[2]; //number of heads - unsigned char hiddenCountL[2]; //number of hidden sectors (low) - - unsigned char hiddenCountH[2]; //number of hidden sectors (high) - unsigned char sectorCount[4]; //number of sectors - - /* extended BPB since DOS 4.0 */ - unsigned char driveNumber; //physical drive number - 80h or 81h - unsigned char reserved; //Current head (not used for this but WinNT stores two flags here). - unsigned char signature; //Signature (must be 28h or 29h to be recognised by NT). - unsigned char serialNumber[4]; //The serial number, the serial number is stored in reverse - //order and is the hex representation of the bytes stored here - unsigned char volumeLabel[11]; //Volume label - unsigned char fatId[8]; //File system ID. "FAT12", "FAT16" or "FAT " -} fat_raw_bpb; - -/* bios parameter block - bpb - fat32 */ -typedef struct _fat32_raw_bpb -{ - unsigned char jump[3]; //jump instruction ('eb xx 90' or 'e9 xx xx') - unsigned char oem[8]; //OEM name and version - e.g. MSDOS5.0 - unsigned char sectorSize[2]; //bytes per sector - should be 512 - unsigned char clusterSize; //sectors per cluster - power of two - unsigned char resSectors[2]; //reserved sectors - typically 1 (boot sector) - unsigned char fatCount; //number of FATs - must be 2 - unsigned char rootSize[2]; //number of rootdirectory entries - typically 512 - unsigned char sectorCountO[2]; //number of sectors (short) - 0, if BIGDOS partition - unsigned char mediaDesc; //media descriptor - typically f8h - unsigned char fatSize[2]; //sectors per FAT - varies - unsigned char trackSize[2]; //sectors per track - unsigned char headCount[2]; //number of heads - unsigned char hiddenCountL[2]; //number of hidden sectors (low) - - unsigned char hiddenCountH[2]; //number of hidden sectors (high) - unsigned char sectorCount[4]; //number of sectors - - /* fat32 specific */ - unsigned char fatSize32[4]; //FAT32 sectors per FAT - unsigned char fatStatus[2]; //If bit 7 is clear then all FAT's are updated other wise bits 0-3 - //give the current active FAT, all other bits are reserved. - unsigned char revision[2]; //High byte is major revision number, low byte is minor revision number, currently both are 0 - unsigned char rootDirCluster[4]; //Root directory starting cluster - unsigned char fsInfoSector[2]; //File system information sector. - unsigned char bootSectorCopy[2]; //If non-zero this gives the sector which holds a copy of the boot record, usually 6 - unsigned char reserved1[12]; //Reserved, set to 0. - unsigned char pdn; //Physical drive number (BIOS system ie 80h is first HDD, 00h is first FDD) - unsigned char reserved2; //Reserved - unsigned char signature; //Signature (must be 28h or 29h to be recognised by NT) - unsigned char serialNumber[4]; //The serial number, the serial number is stored in reverse - //order and is the hex representation of the bytes stored here - unsigned char volumeLabel[11]; //Volume label - unsigned char fatId[8]; //File system ID. "FAT12", "FAT16" or "FAT " - unsigned char machineCode[8]; //Machine code - unsigned char bootSignature[2]; //Boot Signature AA55h. -} fat32_raw_bpb; - -/* directory entry of the short file name */ -typedef struct _fat_direntry_sfn -{ - unsigned char name[8]; //Filename padded with spaces if required. - unsigned char ext[3]; //Filename extension padded with spaces if required. - unsigned char attr; //File Attribute Byte. - - unsigned char reservedNT; //Reserved for use by Windows NT. - unsigned char seconds; //Tenths of a second at time of file creation, 0-199 is valid. - unsigned char timeCreate[2]; //Time when file was created. - unsigned char dateCreate[2]; //Date when file was created. - unsigned char dateAccess[2]; //Date when file was last accessed. - unsigned char clusterH[2]; //High word of cluster number (EA index for FAT12 and FAT16). - - unsigned char timeWrite[2]; //Time of last write to file (last modified or when created). - unsigned char dateWrite[2]; //Date of last write to file (last modified or when created). - unsigned char clusterL[2]; //Starting cluster (Low word). - unsigned char size[4]; //File size (set to zero if a directory). -} fat_direntry_sfn; - -/* directory entry of the long file name - - Each LFN directory entry holds 13 characters of the complete LFN using 16-bit Unicode characters. -*/ -typedef struct _fat_direntry_lfn -{ - unsigned char entrySeq; //Bits 0-5 give the LFN part number, bit 6 is set if this is the last entry for the file. - unsigned char name1[10]; //1st 5 letters of LFN entry. - unsigned char rshv; //?? 0Fh (RSHV attributes set) - - unsigned char reserved1; //Reserved set to 0. - unsigned char checksum; //Checksum generated from SFN. - unsigned char name2[12]; //Next 6 letters of LFN entry. - - unsigned char reserved2[2]; //Reserved set to 0. - unsigned char name3[4]; //Last 2 letters of LFN entry. -} fat_direntry_lfn; - -typedef union _fat_direntry -{ - fat_direntry_sfn sfn; - fat_direntry_lfn lfn; -} fat_direntry; - -typedef struct _fat_direntry_summary -{ - unsigned char attr; //Attributes (bits:5-Archive 4-Directory 3-Volume Label 2-System 1-Hidden 0-Read Only) - unsigned char name[FAT_MAX_NAME]; //Long name (zero terminated) - unsigned char sname[13]; //Short name (zero terminated) - unsigned int size; //file size, 0 for directory - unsigned int cluster; //file start cluster -} fat_direntry_summary; - -//--------------------------------------------------------------------------- -static USBHD_INLINE unsigned int fat_cluster2sector(fat_bpb *partBpb, unsigned int cluster) -{ - return partBpb->dataStart + (partBpb->clusterSize * (cluster - 2)); -} - -unsigned int fat_getClusterRecord12(unsigned char *buf, int type); -int fat_getDirentry(unsigned char fatType, fat_direntry *dir_entry, fat_direntry_summary *dir); -int fat_getDirentrySectorData(fat_driver *fatd, unsigned int *startCluster, unsigned int *startSector, unsigned int *dirSector); -void fat_invalidateLastChainResult(fat_driver *fatd); -void fat_getClusterAtFilePos(fat_driver *fatd, fat_dir *fatDir, unsigned int filePos, unsigned int *cluster, unsigned int *clusterPos); - -#endif /* _FAT_H */ diff --git a/modules/usb/usbhdfsd/fat_driver.c b/modules/usb/usbhdfsd/fat_driver.c deleted file mode 100644 index 65931fece..000000000 --- a/modules/usb/usbhdfsd/fat_driver.c +++ /dev/null @@ -1,1054 +0,0 @@ -//--------------------------------------------------------------------------- -//File name: fat_driver.c -//--------------------------------------------------------------------------- -#include -#include - -#ifdef WIN32 -#include -#include -#include -#else -#include -//#include - -#include -#include -#endif - -#include -#include "usbhd_common.h" -#include "scache.h" -#include "fat_driver.h" -#include "fat.h" -#include "mass_stor.h" - -//#define DEBUG //comment out this line when not debugging - -#include "mass_debug.h" - -#define READ_SECTOR(d, a, b) scache_readSector((d)->cache, (a), (void **)&b) - -#define NUM_DRIVES 10 -static fat_driver *g_fatd[NUM_DRIVES]; - -//--------------------------------------------------------------------------- -int InitFAT(void) -{ - int i; - - for (i = 0; i < NUM_DRIVES; ++i) - g_fatd[i] = NULL; - - return 0; -} - -//--------------------------------------------------------------------------- -int strEqual(const unsigned char *s1, const unsigned char *s2) -{ - unsigned char u1, u2; - for (;;) { - u1 = *s1++; - u2 = *s2++; - if (u1 > 64 && u1 < 91) - u1 += 32; - if (u2 > 64 && u2 < 91) - u2 += 32; - - if (u1 != u2) { - return -1; - } - if (u1 == '\0') { - return 0; - } - } -} - -/* - - 0x321, 0xABC - - byte| byte| byte| - +--+--+--+--+--+--+ - |2 |1 |C |3 |A |B | - +--+--+--+--+--+--+ - -*/ - -//--------------------------------------------------------------------------- -unsigned int fat_getClusterRecord12(unsigned char *buf, int type) -{ - if (type) { //1 - return ((buf[1] << 4) + (buf[0] >> 4)); - } else { // 0 - return (((buf[1] & 0x0F) << 8) + buf[0]); - } -} - -//--------------------------------------------------------------------------- -// Get Cluster chain into buffer -// returns: -// 0 :if buf is full (bufSize entries) and more chain entries exist -// 1-n :number of filled entries of the buf -// -1 :error -//--------------------------------------------------------------------------- -//for fat12 -/* fat12 cluster records can overlap the edge of the sector so we need to detect and maintain - these cases -*/ -static int fat_getClusterChain12(fat_driver *fatd, unsigned int cluster, unsigned int *buf, unsigned int bufSize, int startFlag) -{ - int ret; - unsigned int i, recordOffset, fatSector, lastFatSector; - unsigned char xbuf[4], sectorSpan, cont; - unsigned char *sbuf = NULL; //sector buffer - - cont = 1; - lastFatSector = -1; - i = 0; - if (startFlag) { - buf[i] = cluster; //store first cluster - i++; - } - while (i < bufSize && cont) { - recordOffset = (cluster * 3) / 2; //offset of the cluster record (in bytes) from the FAT start - fatSector = recordOffset / fatd->partBpb.sectorSize; - sectorSpan = 0; - if ((recordOffset % fatd->partBpb.sectorSize) == (fatd->partBpb.sectorSize - 1)) { - sectorSpan = 1; - } - if (lastFatSector != fatSector || sectorSpan) { - ret = READ_SECTOR(fatd->dev, fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat12 sector failed! sector=%u! \n", fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector); - return -EIO; - } - lastFatSector = fatSector; - - if (sectorSpan) { - xbuf[0] = sbuf[fatd->partBpb.sectorSize - 2]; - xbuf[1] = sbuf[fatd->partBpb.sectorSize - 1]; - ret = READ_SECTOR(fatd->dev, fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector + 1, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat12 sector failed sector=%u! \n", fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector + 1); - return -EIO; - } - xbuf[2] = sbuf[0]; - xbuf[3] = sbuf[1]; - } - } - if (sectorSpan) { // use xbuf as source buffer - cluster = fat_getClusterRecord12(xbuf + (recordOffset % fatd->partBpb.sectorSize) - (fatd->partBpb.sectorSize - 2), cluster % 2); - } else { // use sector buffer as source buffer - cluster = fat_getClusterRecord12(sbuf + (recordOffset % fatd->partBpb.sectorSize), cluster % 2); - } - - if ((cluster & 0xFFF) >= 0xFF8) { - cont = 0; //continue = false - } else { - buf[i] = cluster & 0xFFF; - i++; - } - } - return i; -} - - -//--------------------------------------------------------------------------- -//for fat16 -static int fat_getClusterChain16(fat_driver *fatd, unsigned int cluster, unsigned int *buf, unsigned int bufSize, int startFlag) -{ - int ret; - unsigned int i, indexCount, fatSector, lastFatSector; - unsigned char cont; - unsigned char *sbuf = NULL; //sector buffer - - cont = 1; - indexCount = fatd->partBpb.sectorSize / 2; //FAT16->2, FAT32->4 - lastFatSector = -1; - i = 0; - if (startFlag) { - buf[i] = cluster; //store first cluster - i++; - } - while (i < bufSize && cont) { - fatSector = cluster / indexCount; - if (lastFatSector != fatSector) { - ret = READ_SECTOR(fatd->dev, fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat16 sector failed! sector=%u! \n", fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector); - return -EIO; - } - - lastFatSector = fatSector; - } - cluster = getI16(sbuf + ((cluster % indexCount) * 2)); - if ((cluster & 0xFFFF) >= 0xFFF8) { - cont = 0; //continue = false - } else { - buf[i] = cluster & 0xFFFF; - i++; - } - } - return i; -} - -//--------------------------------------------------------------------------- -//for fat32 -static int fat_getClusterChain32(fat_driver *fatd, unsigned int cluster, unsigned int *buf, unsigned int bufSize, int startFlag) -{ - int ret; - unsigned int i, indexCount, fatSector, lastFatSector; - unsigned char cont; - unsigned char *sbuf = NULL; //sector buffer - - cont = 1; - indexCount = fatd->partBpb.sectorSize / 4; //FAT16->2, FAT32->4 - lastFatSector = -1; - i = 0; - if (startFlag) { - buf[i] = cluster; //store first cluster - i++; - } - while (i < bufSize && cont) { - fatSector = cluster / indexCount; - if (lastFatSector != fatSector) { - ret = READ_SECTOR(fatd->dev, fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat32 sector failed sector=%u! \n", fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector); - return -EIO; - } - - lastFatSector = fatSector; - } - cluster = getI32(sbuf + ((cluster % indexCount) * 4)); - if ((cluster & 0xFFFFFFF) >= 0xFFFFFF8) { - cont = 0; //continue = false - } else { - buf[i] = cluster & 0xFFFFFFF; - i++; - } - } - return i; -} - -//--------------------------------------------------------------------------- -int fat_getClusterChain(fat_driver *fatd, unsigned int cluster, unsigned int *buf, unsigned int bufSize, int startFlag) -{ - - if (cluster == fatd->lastChainCluster) { - return fatd->lastChainResult; - } - - switch (fatd->partBpb.fatType) { - case FAT12: - fatd->lastChainResult = fat_getClusterChain12(fatd, cluster, buf, bufSize, startFlag); - break; - case FAT16: - fatd->lastChainResult = fat_getClusterChain16(fatd, cluster, buf, bufSize, startFlag); - break; - case FAT32: - fatd->lastChainResult = fat_getClusterChain32(fatd, cluster, buf, bufSize, startFlag); - break; - } - fatd->lastChainCluster = cluster; - return fatd->lastChainResult; -} - -//--------------------------------------------------------------------------- -void fat_invalidateLastChainResult(fat_driver *fatd) -{ - fatd->lastChainCluster = 0; -} - -//--------------------------------------------------------------------------- -static void fat_determineFatType(fat_bpb *partBpb) -{ - unsigned int sector, clusterCount; - - //get sector of cluster 0 - sector = fat_cluster2sector(partBpb, 0); - //remove partition start sector to get BR+FAT+ROOT_DIR sector count - sector -= partBpb->partStart; - sector = partBpb->sectorCount - sector; - clusterCount = sector / partBpb->clusterSize; - //XPRINTF("USBHDFSD: Data cluster count = %u \n", clusterCount); - - if (clusterCount < 4085) { - partBpb->fatType = FAT12; - } else if (clusterCount < 65525) { - partBpb->fatType = FAT16; - } else { - partBpb->fatType = FAT32; - } -} - -//--------------------------------------------------------------------------- -static int fat_getPartitionBootSector(mass_dev *dev, unsigned int sector, fat_bpb *partBpb) -{ - fat_raw_bpb *bpb_raw; //fat16, fat12 - fat32_raw_bpb *bpb32_raw; //fat32 - int ret; - unsigned char *sbuf = NULL; //sector buffer - - ret = READ_SECTOR(dev, sector, sbuf); //read partition boot sector (first sector on partition) - if (ret < 0) { - XPRINTF("USBHDFSD: Read partition boot sector failed sector=%u! \n", sector); - return -EIO; - } - - bpb_raw = (fat_raw_bpb *)sbuf; - bpb32_raw = (fat32_raw_bpb *)sbuf; - - //set fat common properties - partBpb->sectorSize = getI16(bpb_raw->sectorSize); - partBpb->clusterSize = bpb_raw->clusterSize; - partBpb->resSectors = getI16(bpb_raw->resSectors); - partBpb->fatCount = bpb_raw->fatCount; - partBpb->rootSize = getI16(bpb_raw->rootSize); - partBpb->fatSize = getI16(bpb_raw->fatSize); - partBpb->trackSize = getI16(bpb_raw->trackSize); - partBpb->headCount = getI16(bpb_raw->headCount); - partBpb->sectorCount = getI16(bpb_raw->sectorCountO); - if (partBpb->sectorCount == 0) { - partBpb->sectorCount = getI32(bpb_raw->sectorCount); // large partition - } - partBpb->partStart = sector; - partBpb->rootDirStart = partBpb->partStart + (partBpb->fatCount * partBpb->fatSize) + partBpb->resSectors; - for (ret = 0; ret < 8; ret++) { - partBpb->fatId[ret] = bpb_raw->fatId[ret]; - } - partBpb->fatId[ret] = 0; - partBpb->rootDirCluster = 0; - partBpb->dataStart = partBpb->rootDirStart + (partBpb->rootSize / (partBpb->sectorSize >> 5)); - - fat_determineFatType(partBpb); - - //fat32 specific info - if (partBpb->fatType == FAT32 && partBpb->fatSize == 0) { - partBpb->fatSize = getI32(bpb32_raw->fatSize32); - partBpb->activeFat = getI16(bpb32_raw->fatStatus); - if (partBpb->activeFat & 0x80) { //fat not synced - partBpb->activeFat = (partBpb->activeFat & 0xF); - } else { - partBpb->activeFat = 0; - } - partBpb->rootDirStart = partBpb->partStart + (partBpb->fatCount * partBpb->fatSize) + partBpb->resSectors; - partBpb->rootDirCluster = getI32(bpb32_raw->rootDirCluster); - for (ret = 0; ret < 8; ret++) { - partBpb->fatId[ret] = bpb32_raw->fatId[ret]; - } - partBpb->fatId[ret] = 0; - partBpb->dataStart = partBpb->rootDirStart; - } - - printf("USBHDFSD: Fat type %u Id %s \n", partBpb->fatType, partBpb->fatId); - return 1; -} - -//--------------------------------------------------------------------------- -/* - returns: - 0 - no more dir entries - 1 - short name dir entry found - 2 - long name dir entry found - 3 - deleted dir entry found -*/ -int fat_getDirentry(unsigned char fatType, fat_direntry *dir_entry, fat_direntry_summary *dir) -{ - int i, j; - unsigned int offset; - unsigned char cont; - u16 character; - - //detect last entry - all zeros (slight modification by radad) - if (dir_entry->sfn.name[0] == 0) { - return 0; - } - //detect deleted entry - it will be ignored - if (dir_entry->sfn.name[0] == 0xE5) { - return 3; - } - - //detect long filename - if (dir_entry->lfn.rshv == 0x0F && dir_entry->lfn.reserved1 == 0x00 && dir_entry->lfn.reserved2[0] == 0x00) { - //long filename - almost whole direntry is unicode string - extract it - offset = dir_entry->lfn.entrySeq & 0x3f; - offset--; - offset = offset * 13; - //name - 1st part - cont = 1; - for (i = 0; i < 10 && cont; i += 2) { - character = dir_entry->lfn.name1[i] | (dir_entry->lfn.name1[i + 1] << 8); - - if (character == 0 || offset >= FAT_MAX_NAME) { - dir->name[offset] = 0; //terminate - cont = 0; //stop - } else { - // Handle non-ASCII characters - dir->name[offset] = character < 128 ? dir_entry->lfn.name1[i] : '?'; - offset++; - } - } - //name - 2nd part - for (i = 0; i < 12 && cont; i += 2) { - character = dir_entry->lfn.name2[i] | (dir_entry->lfn.name2[i + 1] << 8); - - if (character == 0 || offset >= FAT_MAX_NAME) { - dir->name[offset] = 0; //terminate - cont = 0; //stop - } else { - // Handle non-ASCII characters - dir->name[offset] = character < 128 ? dir_entry->lfn.name2[i] : '?'; - offset++; - } - } - //name - 3rd part - for (i = 0; i < 4 && cont; i += 2) { - character = dir_entry->lfn.name3[i] | (dir_entry->lfn.name3[i + 1] << 8); - - if (character == 0 || offset >= FAT_MAX_NAME) { - dir->name[offset] = 0; //terminate - cont = 0; //stop - } else { - // Handle non-ASCII characters - dir->name[offset] = character < 128 ? dir_entry->lfn.name3[i] : '?'; - offset++; - } - } - if ((dir_entry->lfn.entrySeq & 0x40)) { //terminate string flag - dir->name[offset] = 0; - } - return 2; - } else { - //short filename - //copy name - for (i = 0; i < 8 && dir_entry->sfn.name[i] != ' '; i++) { - dir->sname[i] = dir_entry->sfn.name[i]; - // NTadaption for LaunchELF - if (dir_entry->sfn.reservedNT & 0x08 && - dir->sname[i] >= 'A' && dir->sname[i] <= 'Z') { - dir->sname[i] += 0x20; //Force standard letters in name to lower case - } - } - for (j = 0; j < 3 && dir_entry->sfn.ext[j] != ' '; j++) { - if (j == 0) { - dir->sname[i] = '.'; - i++; - } - dir->sname[i + j] = dir_entry->sfn.ext[j]; - // NTadaption for LaunchELF - if (dir_entry->sfn.reservedNT & 0x10 && - dir->sname[i + j] >= 'A' && dir->sname[i + j] <= 'Z') { - dir->sname[i + j] += 0x20; //Force standard letters in ext to lower case - } - } - dir->sname[i + j] = 0; //terminate - if (dir->name[0] == 0) { //long name desn't exit - for (i = 0; dir->sname[i] != 0; i++) - dir->name[i] = dir->sname[i]; - dir->name[i] = 0; - } - dir->attr = dir_entry->sfn.attr; - dir->size = getI32(dir_entry->sfn.size); - dir->cluster = (fatType == FAT32) ? getI32_2(dir_entry->sfn.clusterL, dir_entry->sfn.clusterH) : getI16(dir_entry->sfn.clusterL); - - return 1; - } -} - -//--------------------------------------------------------------------------- -//Set chain info (cluster/offset) cache -void fat_setFatDirChain(fat_driver *fatd, fat_dir *fatDir) -{ - int i, j; - unsigned int index, clusterChainStart, fileCluster, fileSize, blockSize; - unsigned char nextChain; - int chainSize; - - XPRINTF("USBHDFSD: reading cluster chain \n"); - fileCluster = fatDir->chain[0].cluster; - - if (fileCluster < 2) { - XPRINTF("USBHDFSD: early exit... \n"); - return; - } - - fileSize = fatDir->size; - blockSize = fileSize / DIR_CHAIN_SIZE; - - nextChain = 1; - clusterChainStart = 0; - j = 1; - fileSize = 0; - index = 0; - - while (nextChain) { - if ((chainSize = fat_getClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, 1)) >= 0) { - if (chainSize >= MAX_DIR_CLUSTER) { //the chain is full, but more chain parts exist - fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1]; - } else { //chain fits in the chain buffer completely - no next chain exist - nextChain = 0; - } - } else { - XPRINTF("USBHDFSD: fat_setFatDirChain(): fat_getClusterChain() failed: %d\n", chainSize); - return; - } - - //process the cluster chain (fatd->cbuf) - for (i = clusterChainStart; i < chainSize; i++) { - fileSize += (fatd->partBpb.clusterSize * fatd->partBpb.sectorSize); - while (fileSize >= (j * blockSize) && j < DIR_CHAIN_SIZE) { - fatDir->chain[j].cluster = fatd->cbuf[i]; - fatDir->chain[j].index = index; - j++; - } //ends "while" - index++; - } //ends "for" - clusterChainStart = 1; - } //ends "while" - fatDir->lastCluster = fatd->cbuf[i - 1]; - -#ifdef DEBUG_EXTREME //dlanor: I patched this because this bloat hid important stuff - //debug - XPRINTF("USBHDFSD: SEEK CLUSTER CHAIN CACHE fileSize=%u blockSize=%u \n", fatDir->size, blockSize); - for (i = 0; i < DIR_CHAIN_SIZE; i++) { - XPRINTF("USBHDFSD: index=%u cluster=%u offset= %u - %u start=%u \n", - fatDir->chain[i].index, fatDir->chain[i].cluster, - fatDir->chain[i].index * fatd->partBpb.clusterSize * fatd->partBpb.sectorSize, - (fatDir->chain[i].index + 1) * fatd->partBpb.clusterSize * fatd->partBpb.sectorSize, - i * blockSize); - } -#endif /* debug */ - XPRINTF("USBHDFSD: read cluster chain done!\n"); -} - -//--------------------------------------------------------------------------- -/* Set base attributes of direntry */ -static void fat_setFatDir(fat_driver *fatd, fat_dir *fatDir, unsigned int parentDirCluster, fat_direntry_sfn *dsfn, fat_direntry_summary *dir, int getClusterInfo) -{ - unsigned int i; - unsigned char *srcName; - - XPRINTF("USBHDFSD: setting fat dir...\n"); - srcName = dir->sname; - if (dir->name[0] != 0) { //long filename not empty - srcName = dir->name; - } - //copy name - for (i = 0; srcName[i] != 0; i++) - fatDir->name[i] = srcName[i]; - fatDir->name[i] = 0; //terminate - - fatDir->attr = dir->attr; - fatDir->size = dir->size; - - //created Date: Day, Month, Year-low, Year-high - fatDir->cdate[0] = (dsfn->dateCreate[0] & 0x1F); - fatDir->cdate[1] = (dsfn->dateCreate[0] >> 5) + ((dsfn->dateCreate[1] & 0x01) << 3); - i = 1980 + (dsfn->dateCreate[1] >> 1); - fatDir->cdate[2] = (i & 0xFF); - fatDir->cdate[3] = ((i & 0xFF00) >> 8); - - //created Time: Hours, Minutes, Seconds - fatDir->ctime[0] = ((dsfn->timeCreate[1] & 0xF8) >> 3); - fatDir->ctime[1] = ((dsfn->timeCreate[1] & 0x07) << 3) + ((dsfn->timeCreate[0] & 0xE0) >> 5); - fatDir->ctime[6] = ((dsfn->timeCreate[0] & 0x1F) << 1); - - //accessed Date: Day, Month, Year-low, Year-high - fatDir->adate[0] = (dsfn->dateAccess[0] & 0x1F); - fatDir->adate[1] = (dsfn->dateAccess[0] >> 5) + ((dsfn->dateAccess[1] & 0x01) << 3); - i = 1980 + (dsfn->dateAccess[1] >> 1); - fatDir->adate[2] = (i & 0xFF); - fatDir->adate[3] = ((i & 0xFF00) >> 8); - - //modified Date: Day, Month, Year-low, Year-high - fatDir->mdate[0] = (dsfn->dateWrite[0] & 0x1F); - fatDir->mdate[1] = (dsfn->dateWrite[0] >> 5) + ((dsfn->dateWrite[1] & 0x01) << 3); - i = 1980 + (dsfn->dateWrite[1] >> 1); - fatDir->mdate[2] = (i & 0xFF); - fatDir->mdate[3] = ((i & 0xFF00) >> 8); - - //modified Time: Hours, Minutes, Seconds - fatDir->mtime[0] = ((dsfn->timeWrite[1] & 0xF8) >> 3); - fatDir->mtime[1] = ((dsfn->timeWrite[1] & 0x07) << 3) + ((dsfn->timeWrite[0] & 0xE0) >> 5); - fatDir->mtime[2] = ((dsfn->timeWrite[0] & 0x1F) << 1); - - fatDir->chain[0].cluster = dir->cluster; - fatDir->chain[0].index = 0; - if (getClusterInfo) { - fat_setFatDirChain(fatd, fatDir); - } - - fatDir->parentDirCluster = parentDirCluster; - fatDir->startCluster = dir->cluster; -} - -//--------------------------------------------------------------------------- -int fat_getDirentrySectorData(fat_driver *fatd, unsigned int *startCluster, unsigned int *startSector, unsigned int *dirSector) -{ - unsigned int chainSize; - - if (*startCluster == 0 && fatd->partBpb.fatType < FAT32) { //Root directory - *startSector = fatd->partBpb.rootDirStart; - *dirSector = fatd->partBpb.rootSize / (fatd->partBpb.sectorSize / 32); - return 0; - } - //other directory or fat 32 - if (*startCluster == 0 && fatd->partBpb.fatType == FAT32) { - *startCluster = fatd->partBpb.rootDirCluster; - } - *startSector = fat_cluster2sector(&fatd->partBpb, *startCluster); - chainSize = fat_getClusterChain(fatd, *startCluster, fatd->cbuf, MAX_DIR_CLUSTER, 1); - if (chainSize >= MAX_DIR_CLUSTER) { - XPRINTF("USBHDFSD: Chain too large\n"); - return -EFAULT; - } else if (chainSize > 0) { - *dirSector = chainSize * fatd->partBpb.clusterSize; - } else { - XPRINTF("USBHDFSD: Error getting cluster chain! startCluster=%u \n", *startCluster); - return -EFAULT; - } - - return chainSize; -} - -//--------------------------------------------------------------------------- -static int fat_getDirentryStartCluster(fat_driver *fatd, unsigned char *dirName, unsigned int *startCluster, fat_dir *fatDir) -{ - fat_direntry_summary dir; - unsigned int i, dirSector, startSector, dirPos; - unsigned char cont; - int ret; -#ifdef DEBUG - mass_dev *mass_device = fatd->dev; -#endif - - cont = 1; - XPRINTF("USBHDFSD: getting cluster for dir entry: %s \n", dirName); - //clear name strings - dir.sname[0] = 0; - dir.name[0] = 0; - - ret = fat_getDirentrySectorData(fatd, startCluster, &startSector, &dirSector); - if (ret < 0) - return ret; - - XPRINTF("USBHDFSD: dirCluster=%u startSector=%u (%u) dirSector=%u \n", *startCluster, startSector, startSector * mass_device->sectorSize, dirSector); - - //go through first directory sector till the max number of directory sectors - //or stop when no more direntries detected - for (i = 0; i < dirSector && cont; i++) { - unsigned char *sbuf = NULL; //sector buffer - - //At cluster borders, get correct sector from cluster chain buffer - if ((*startCluster != 0) && (i % fatd->partBpb.clusterSize == 0)) { - startSector = fat_cluster2sector(&fatd->partBpb, fatd->cbuf[(i / fatd->partBpb.clusterSize)]) - i; - } - - ret = READ_SECTOR(fatd->dev, startSector + i, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: read directory sector failed ! sector=%u\n", startSector + i); - return -EIO; - } - XPRINTF("USBHDFSD: read sector ok, scanning sector for direntries...\n"); - dirPos = 0; - - // go through start of the sector till the end of sector - while (cont && dirPos < fatd->partBpb.sectorSize) { - fat_direntry *dir_entry = (fat_direntry *)(sbuf + dirPos); - cont = fat_getDirentry(fatd->partBpb.fatType, dir_entry, &dir); //get single directory entry from sector buffer - if (cont == 1) { //when short file name entry detected - if (!(dir.attr & FAT_ATTR_VOLUME_LABEL)) { //not volume label - if ((strEqual(dir.sname, dirName) == 0) || - (strEqual(dir.name, dirName) == 0)) { - XPRINTF("USBHDFSD: found! %s\n", dir.name); - if (fatDir != NULL) { //fill the directory properties - fat_setFatDir(fatd, fatDir, *startCluster, &dir_entry->sfn, &dir, 1); - } - *startCluster = dir.cluster; - XPRINTF("USBHDFSD: direntry %s found at cluster: %u \n", dirName, dir.cluster); - return dir.attr; //returns file or directory attr - } - } //ends "if(!(dir.attr & FAT_ATTR_VOLUME_LABEL))" - //clear name strings - dir.sname[0] = 0; - dir.name[0] = 0; - } //ends "if (cont == 1)" - dirPos += sizeof(fat_direntry); - } //ends "while" - } //ends "for" - XPRINTF("USBHDFSD: direntry %s not found! \n", dirName); - return -ENOENT; -} - -//--------------------------------------------------------------------------- -// start cluster should be 0 - if we want to search from root directory -// otherwise the start cluster should be correct cluster of directory -// to search directory - set fatDir as NULL -int fat_getFileStartCluster(fat_driver *fatd, const unsigned char *fname, unsigned int *startCluster, fat_dir *fatDir) -{ - unsigned char tmpName[FAT_MAX_NAME + 1]; - unsigned int i, offset; - unsigned char cont; - int ret; - - XPRINTF("USBHDFSD: Entering fat_getFileStartCluster\n"); - - cont = 1; - offset = 0; - i = 0; - - *startCluster = 0; - if (fatDir != NULL) { - memset(fatDir, 0, sizeof(fat_dir)); - fatDir->attr = FAT_ATTR_DIRECTORY; - } - if (fname[i] == '/') { - i++; - } - - for (; fname[i] != 0; i++) { - if (fname[i] == '/') { //directory separator - tmpName[offset] = 0; //terminate string - ret = fat_getDirentryStartCluster(fatd, tmpName, startCluster, fatDir); - if (ret < 0) { - return -ENOENT; - } - offset = 0; - } else { - tmpName[offset] = fname[i]; - offset++; - } - } //ends "for" - //and the final file - tmpName[offset] = 0; //terminate string - XPRINTF("USBHDFSD: Ready to get cluster for file \"%s\"\n", tmpName); - if (fatDir != NULL) { - //if the last char of the name was slash - the name was already found -exit - if (offset == 0) { - XPRINTF("USBHDFSD: Exiting from fat_getFileStartCluster with a folder\n"); - return 2; - } - ret = fat_getDirentryStartCluster(fatd, tmpName, startCluster, fatDir); - if (ret < 0) { - XPRINTF("USBHDFSD: Exiting from fat_getFileStartCluster with error %i\n", ret); - return ret; - } - XPRINTF("USBHDFSD: file's startCluster found. Name=%s, cluster=%u \n", fname, *startCluster); - } - XPRINTF("USBHDFSD: Exiting from fat_getFileStartCluster with no error.\n"); - return 1; -} - -//--------------------------------------------------------------------------- -void fat_getClusterAtFilePos(fat_driver *fatd, fat_dir *fatDir, unsigned int filePos, unsigned int *cluster, unsigned int *clusterPos) -{ - unsigned int i, j, blockSize; - - blockSize = fatd->partBpb.clusterSize * fatd->partBpb.sectorSize; - - for (i = 0, j = (DIR_CHAIN_SIZE - 1); i < (DIR_CHAIN_SIZE - 1); i++) { - if (fatDir->chain[i].index * blockSize <= filePos && - fatDir->chain[i + 1].index * blockSize > filePos) { - j = i; - break; - } - } - *cluster = fatDir->chain[j].cluster; - *clusterPos = (fatDir->chain[j].index * blockSize); -} - -//--------------------------------------------------------------------------- -int fat_readFile(fat_driver *fatd, fat_dir *fatDir, unsigned int filePos, unsigned char *buffer, unsigned int size) -{ - int ret, chainSize; - unsigned int i, j, startSector, clusterChainStart, bufSize, sectorSkip, clusterSkip, dataSkip; - unsigned char nextChain; - mass_dev *mass_device = fatd->dev; - - unsigned int bufferPos, fileCluster, clusterPos; - - fat_getClusterAtFilePos(fatd, fatDir, filePos, &fileCluster, &clusterPos); - sectorSkip = (filePos - clusterPos) / fatd->partBpb.sectorSize; - clusterSkip = sectorSkip / fatd->partBpb.clusterSize; - sectorSkip %= fatd->partBpb.clusterSize; - dataSkip = filePos % fatd->partBpb.sectorSize; - bufferPos = 0; - - XPRINTF("USBHDFSD: fileCluster = %u, clusterPos= %u clusterSkip=%u, sectorSkip=%u dataSkip=%u \n", - fileCluster, clusterPos, clusterSkip, sectorSkip, dataSkip); - - if (fileCluster < 2) { - return 0; - } - - bufSize = mass_device->sectorSize; - nextChain = 1; - clusterChainStart = 1; - - while (nextChain && size > 0) { - if ((chainSize = fat_getClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, clusterChainStart)) < 0) { - return chainSize; - } - - clusterChainStart = 0; - if (chainSize >= MAX_DIR_CLUSTER) { //the chain is full, but more chain parts exist - fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1]; - } else { //chain fits in the chain buffer completely - no next chain needed - nextChain = 0; - } - while (clusterSkip >= MAX_DIR_CLUSTER) { - chainSize = fat_getClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, clusterChainStart); - clusterChainStart = 0; - if (chainSize >= MAX_DIR_CLUSTER) { //the chain is full, but more chain parts exist - fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1]; - } else { //chain fits in the chain buffer completely - no next chain needed - nextChain = 0; - } - clusterSkip -= MAX_DIR_CLUSTER; - } - - //process the cluster chain (fatd->cbuf) and skip leading clusters if needed - for (i = 0 + clusterSkip; i < chainSize && size > 0; i++) { - //read cluster and save cluster content - startSector = fat_cluster2sector(&fatd->partBpb, fatd->cbuf[i]); - //process all sectors of the cluster (and skip leading sectors if needed) - for (j = 0 + sectorSkip; j < fatd->partBpb.clusterSize && size > 0; j++) { - unsigned char *sbuf = NULL; //sector buffer - - ret = READ_SECTOR(fatd->dev, startSector + j, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read sector failed ! sector=%u\n", startSector + j); - return bufferPos; - } - - //compute exact size of transfered bytes - if (size < bufSize) { - bufSize = size + dataSkip; - } - if (bufSize > mass_device->sectorSize) { - bufSize = mass_device->sectorSize; - } - XPRINTF("USBHDFSD: memcopy dst=%u, src=%u, size=%u bufSize=%u \n", bufferPos, dataSkip, bufSize - dataSkip, bufSize); - memcpy(buffer + bufferPos, sbuf + dataSkip, bufSize - dataSkip); - size -= (bufSize - dataSkip); - bufferPos += (bufSize - dataSkip); - dataSkip = 0; - bufSize = mass_device->sectorSize; - } - sectorSkip = 0; - } - clusterSkip = 0; - } - return bufferPos; -} - -//--------------------------------------------------------------------------- -int fat_getNextDirentry(fat_driver *fatd, fat_dir_list *fatdlist, fat_dir *fatDir) -{ - fat_direntry_summary dir; - int i, ret; - unsigned int startSector, dirSector, dirPos, dirCluster; - unsigned char cont, new_entry; -#ifdef DEBUG - mass_dev *mass_device = fatd->dev; -#endif - - //the getFirst function was not called - if (fatdlist->direntryCluster == 0xFFFFFFFF || fatDir == NULL) { - return -EFAULT; - } - - dirCluster = fatdlist->direntryCluster; - - //clear name strings - dir.sname[0] = 0; - dir.name[0] = 0; - - ret = fat_getDirentrySectorData(fatd, &dirCluster, &startSector, &dirSector); - if (ret < 0) - return ret; - - XPRINTF("USBHDFSD: dirCluster=%u startSector=%u (%u) dirSector=%u \n", dirCluster, startSector, startSector * mass_device->sectorSize, dirSector); - - //go through first directory sector till the max number of directory sectors - //or stop when no more direntries detected - //dlanor: but avoid rescanning same areas redundantly (if possible) - cont = 1; - new_entry = 1; - dirPos = (fatdlist->direntryIndex * 32) % fatd->partBpb.sectorSize; - for (i = ((fatdlist->direntryIndex * 32) / fatd->partBpb.sectorSize); (i < dirSector) && cont; i++) { - unsigned char *sbuf = NULL; //sector buffer - - //At cluster borders, get correct sector from cluster chain buffer - if ((dirCluster != 0) && (new_entry || (i % fatd->partBpb.clusterSize == 0))) { - startSector = fat_cluster2sector(&fatd->partBpb, fatd->cbuf[(i / fatd->partBpb.clusterSize)]) - i + (i % fatd->partBpb.clusterSize); - new_entry = 0; - } - ret = READ_SECTOR(fatd->dev, startSector + i, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read directory sector failed ! sector=%u\n", startSector + i); - return -EIO; - } - - // go through sector from current pos till its end - while (cont && (dirPos < fatd->partBpb.sectorSize)) { - fat_direntry *dir_entry = (fat_direntry *)(sbuf + dirPos); - cont = fat_getDirentry(fatd->partBpb.fatType, dir_entry, &dir); //get a directory entry from sector - fatdlist->direntryIndex++; //Note current entry processed - if (cont == 1) { //when short file name entry detected - fat_setFatDir(fatd, fatDir, dirCluster, &dir_entry->sfn, &dir, 0); -#if 0 - XPRINTF("USBHDFSD: fat_getNextDirentry %c%c%c%c%c%c %x %s %s\n", - (dir.attr & FAT_ATTR_VOLUME_LABEL) ? 'v' : '-', - (dir.attr & FAT_ATTR_DIRECTORY) ? 'd' : '-', - (dir.attr & FAT_ATTR_READONLY) ? 'r' : '-', - (dir.attr & FAT_ATTR_ARCHIVE) ? 'a' : '-', - (dir.attr & FAT_ATTR_SYSTEM) ? 's' : '-', - (dir.attr & FAT_ATTR_HIDDEN) ? 'h' : '-', - dir.attr, - dir.sname, - dir.name); -#endif - return 1; - } - dirPos += sizeof(fat_direntry); - } //ends "while" - dirPos = 0; - } //ends "for" - // when we get this far - reset the direntry cluster - fatdlist->direntryCluster = 0xFFFFFFFF; //no more files - return 0; //indicate that no direntry is avalable -} - -//--------------------------------------------------------------------------- -int fat_getFirstDirentry(fat_driver *fatd, const unsigned char *dirName, fat_dir_list *fatdlist, fat_dir *fatDir_host, fat_dir *fatDir) -{ - int ret; - unsigned int startCluster = 0; - - ret = fat_getFileStartCluster(fatd, dirName, &startCluster, fatDir_host); - if (ret < 0) { //dir name not found - return -ENOENT; - } - //check that direntry is directory - if (!(fatDir_host->attr & FAT_ATTR_DIRECTORY)) { - return -ENOTDIR; //it's a file - exit - } - fatdlist->direntryCluster = startCluster; - fatdlist->direntryIndex = 0; - return fat_getNextDirentry(fatd, fatdlist, fatDir); -} - -//--------------------------------------------------------------------------- -int fat_CheckChain(fat_driver *fatd, fat_dir *fatDir) -{ - int i; - int chainSize; - int nextChain; - - unsigned int fileCluster; - unsigned int clusterPos; - - int clusterChainStart; - - fat_getClusterAtFilePos(fatd, fatDir, 0, &fileCluster, &clusterPos); - - if (fileCluster < 2) - return 1; - - nextChain = 1; - clusterChainStart = 1; - - while (nextChain) { - chainSize = fat_getClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, clusterChainStart); - clusterChainStart = 0; - if (chainSize >= MAX_DIR_CLUSTER) { //the chain is full, but more chain parts exist - fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1]; - } else { //chain fits in the chain buffer completely - no next chain needed - nextChain = 0; - } - - //process the cluster chain (fatd->cbuf) and skip leading clusters if needed - for (i = 0; i < (chainSize - 1); i++) { - if ((fatd->cbuf[i] + 1) != fatd->cbuf[i + 1]) - return 0; - } - } - - return 1; -} - -//--------------------------------------------------------------------------- -int fat_mount(mass_dev *dev, unsigned int start, unsigned int count) -{ - fat_driver *fatd = NULL; - unsigned int i; - for (i = 0; i < NUM_DRIVES && fatd == NULL; ++i) { - if (g_fatd[i] == NULL) { - XPRINTF("USBHDFSD: usb fat: allocate fat_driver %d!\n", sizeof(fat_driver)); - g_fatd[i] = malloc(sizeof(fat_driver)); - if (g_fatd[i] != NULL) { - g_fatd[i]->dev = NULL; - } - fatd = g_fatd[i]; - } else if (g_fatd[i]->dev == NULL) { - fatd = g_fatd[i]; - } - } - - if (fatd == NULL) { - printf("USBHDFSD: usb fat: unable to allocate drive!\n"); - return -1; - } - - if (fatd->dev != NULL) { - printf("USBHDFSD: usb fat: mount ERROR: alread mounted\n"); - fat_forceUnmount(fatd->dev); - } - - if (fat_getPartitionBootSector(dev, start, &fatd->partBpb) < 0) - return -1; - - fatd->dev = dev; - fatd->deIdx = 0; - fatd->clStackIndex = 0; - fatd->clStackLast = 0; - fatd->lastChainCluster = 0xFFFFFFFF; - fatd->lastChainResult = -1; - return 0; -} - -//--------------------------------------------------------------------------- -void fat_forceUnmount(mass_dev *dev) -{ - unsigned int i; - XPRINTF("USBHDFSD: usb fat: forceUnmount devId %i \n", dev->devId); - - for (i = 0; i < NUM_DRIVES; ++i) { - if (g_fatd[i] != NULL && g_fatd[i]->dev == dev) - g_fatd[i] = NULL; - } -} - -//--------------------------------------------------------------------------- -fat_driver *fat_getData(int device) -{ - if (device >= NUM_DRIVES) - return NULL; - - while (g_fatd[device] == NULL || g_fatd[device]->dev == NULL) { - if (mass_stor_configureNextDevice() <= 0) - break; - } - - if (g_fatd[device] == NULL || g_fatd[device]->dev == NULL) - return NULL; - else - return g_fatd[device]; -} - -//--------------------------------------------------------------------------- -//End of file: fat_driver.c -//--------------------------------------------------------------------------- diff --git a/modules/usb/usbhdfsd/fat_driver.h b/modules/usb/usbhdfsd/fat_driver.h deleted file mode 100644 index 787180553..000000000 --- a/modules/usb/usbhdfsd/fat_driver.h +++ /dev/null @@ -1,110 +0,0 @@ -#ifndef _FAT_DRIVER_H -#define _FAT_DRIVER_H 1 - -#define DIR_CHAIN_SIZE 32 - -#define FAT_MAX_NAME 256 - -//attributes (bits:5-Archive 4-Directory 3-Volume Label 2-System 1-Hidden 0-Read Only) -#define FAT_ATTR_READONLY 0x01 -#define FAT_ATTR_HIDDEN 0x02 -#define FAT_ATTR_SYSTEM 0x04 -#define FAT_ATTR_VOLUME_LABEL 0x08 -#define FAT_ATTR_DIRECTORY 0x10 -#define FAT_ATTR_ARCHIVE 0x20 - -typedef struct _fat_bpb -{ - unsigned int sectorSize; //bytes per sector - should be 512 - unsigned char clusterSize; //sectors per cluster - power of two - unsigned int resSectors; //reserved sectors - typically 1 (boot sector) - unsigned char fatCount; //number of FATs - must be 2 - unsigned int rootSize; //number of rootdirectory entries - typically 512 - unsigned int fatSize; //sectors per FAT - varies - unsigned int trackSize; //sectors per track - unsigned int headCount; //number of heads - unsigned int sectorCount; //number of sectors - unsigned int partStart; //sector where partition starts (boot sector) - unsigned int rootDirStart; //sector where root directory starts - unsigned int rootDirCluster; //fat32 - cluster of the root directory - unsigned int activeFat; //fat32 - current active fat number - unsigned char fatType; //12-FAT16, 16-FAT16, 32-FAT32 - unsigned char fatId[9]; //File system ID. "FAT12", "FAT16" or "FAT " - for debug only - unsigned int dataStart; //sector where data starts -} fat_bpb; - -typedef struct _fat_driver -{ - mass_dev *dev; - fat_bpb partBpb; //partition bios parameter block - -// modified by Hermes -#define MAX_DIR_CLUSTER 512 - unsigned int cbuf[MAX_DIR_CLUSTER]; //cluster index buffer // 2048 by Hermes - - unsigned int lastChainCluster; - int lastChainResult; - -/* enough for long filename of length 260 characters (20*13) and one short filename */ -#define MAX_DE_STACK 21 - unsigned int deSec[MAX_DE_STACK]; //direntry sector - int deOfs[MAX_DE_STACK]; //direntry offset - int deIdx; //direntry index - -#define SEQ_MASK_SIZE 2048 //Allow 2K files per directory - u8 seq_mask[SEQ_MASK_SIZE / 8]; //bitmask for consumed seq numbers -#define DIR_MASK_SIZE 2048 * 11 //Allow 2K maxed fullnames per directory - u8 dir_used_mask[DIR_MASK_SIZE / 8]; //bitmask for used directory entries - -#define MAX_CLUSTER_STACK 128 - unsigned int clStack[MAX_CLUSTER_STACK]; //cluster allocation stack - int clStackIndex; - unsigned int clStackLast; // last free cluster of the fat table -} fat_driver; - -typedef struct _fat_dir_list -{ - unsigned int direntryCluster; //the directory cluster requested by getFirstDirentry - int direntryIndex; //index of the directory children -} fat_dir_list; - -typedef struct _fat_dir_chain_record -{ - unsigned int cluster; - unsigned int index; -} fat_dir_chain_record; - -typedef struct _fat_dir -{ - unsigned char attr; //attributes (bits:5-Archive 4-Directory 3-Volume Label 2-System 1-Hidden 0-Read Only) - unsigned char name[FAT_MAX_NAME]; - unsigned char cdate[4]; //D:M:Yl:Yh - unsigned char ctime[3]; //H:M:S - unsigned char adate[4]; //D:M:Yl:Yh - unsigned char atime[3]; //H:M:S - unsigned char mdate[4]; //D:M:Yl:Yh - unsigned char mtime[3]; //H:M:S - unsigned int size; //file size, 0 for directory - unsigned int parentDirCluster; //The cluster number of the parent directory. - unsigned int startCluster; - //Stuff here are used for caching and might not be filled. - unsigned int lastCluster; - fat_dir_chain_record chain[DIR_CHAIN_SIZE]; //cluser/offset cache - for seeking purpose -} fat_dir; - -int strEqual(const unsigned char *s1, const unsigned char *s2); - -int fat_mount(mass_dev *dev, unsigned int start, unsigned int count); -void fat_forceUnmount(mass_dev *dev); -void fat_setFatDirChain(fat_driver *fatd, fat_dir *fatDir); -int fat_readFile(fat_driver *fatd, fat_dir *fatDir, unsigned int filePos, unsigned char *buffer, unsigned int size); -int fat_getFirstDirentry(fat_driver *fatd, const unsigned char *dirName, fat_dir_list *fatdlist, fat_dir *fatDir_host, fat_dir *fatDir); -int fat_getNextDirentry(fat_driver *fatd, fat_dir_list *fatdlist, fat_dir *fatDir); - -fat_driver *fat_getData(int device); -int fat_getFileStartCluster(fat_driver *fatd, const unsigned char *fname, unsigned int *startCluster, fat_dir *fatDir); -int fat_getClusterChain(fat_driver *fatd, unsigned int cluster, unsigned int *buf, unsigned int bufSize, int startFlag); - -int fat_CheckChain(fat_driver *fatd, fat_dir *fatDir); - -#endif diff --git a/modules/usb/usbhdfsd/fat_write.c b/modules/usb/usbhdfsd/fat_write.c deleted file mode 100644 index ae654914c..000000000 --- a/modules/usb/usbhdfsd/fat_write.c +++ /dev/null @@ -1,2296 +0,0 @@ -//--------------------------------------------------------------------------- -//File name: fat_write.c -//--------------------------------------------------------------------------- -/* - * fat_driver.c - USB Mass storage driver for PS2 - * - * (C) 2005, Marek Olejnik (ole00@post.cz) - * - * FAT filesystem layer - write functions - * - * See the file LICENSE included with this distribution for licensing terms. - */ -//--------------------------------------------------------------------------- -#include -#include - -#ifdef WIN32 -#include -#include -#include -#include -#else -#include -#include -#endif - -#include -#include "usbhd_common.h" -#include "fat_driver.h" -#include "fat.h" -#include "scache.h" -#include "mass_stor.h" - -//#define DEBUG //comment out this line when not debugging - -#include "mass_debug.h" - -#define DATE_CREATE 1 -#define DATE_MODIFY 2 - -#define READ_SECTOR(d, a, b) scache_readSector((d)->cache, (a), (void **)&b) -#define ALLOC_SECTOR(d, a, b) scache_allocSector((d)->cache, (a), (void **)&b) -#define WRITE_SECTOR(d, a) scache_writeSector((d)->cache, (a)) -#define FLUSH_SECTORS(d) scache_flushSectors((d)->cache) - -//--------------------------------------------------------------------------- -/* - reorder (swap) the cluster stack records -*/ -static void swapClStack(fat_driver *fatd, int startIndex, int endIndex) -{ - int i; - int size; - int offset1, offset2; - unsigned int tmp; - - size = endIndex - startIndex; - if (size < 2) { - return; - } - - size /= 2; - for (i = 0; i < size; i++) { - offset1 = startIndex + i; - offset2 = endIndex - 1 - i; - tmp = fatd->clStack[offset1]; - fatd->clStack[offset1] = fatd->clStack[offset2]; - fatd->clStack[offset2] = tmp; - } -} - -//--------------------------------------------------------------------------- -/* - scan FAT12 for free clusters and store them to the cluster stack -*/ - -static int fat_readEmptyClusters12(fat_driver *fatd) -{ - int ret; - int i; - int recordOffset; - int sectorSpan; - int fatSector; - int cont; - int lastFatSector; - unsigned int cluster; - unsigned int clusterValue; - unsigned char xbuf[4]; - int oldClStackIndex; - unsigned char *sbuf = NULL; //sector buffer - - oldClStackIndex = fatd->clStackIndex; - - cont = 1; - lastFatSector = -1; - i = 0; - cluster = fatd->clStackLast; - - while (fatd->clStackIndex < MAX_CLUSTER_STACK) { - recordOffset = (cluster * 3) / 2; //offset of the cluster record (in bytes) from the FAT start - fatSector = recordOffset / fatd->partBpb.sectorSize; - sectorSpan = 0; - if ((recordOffset % fatd->partBpb.sectorSize) == (fatd->partBpb.sectorSize - 1)) { - sectorSpan = 1; - } - if (lastFatSector != fatSector || sectorSpan) { - ret = READ_SECTOR(fatd->dev, fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat12 sector failed! sector=%u! \n", fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector); - return -EIO; - } - lastFatSector = fatSector; - - if (sectorSpan) { - xbuf[0] = sbuf[fatd->partBpb.sectorSize - 2]; - xbuf[1] = sbuf[fatd->partBpb.sectorSize - 1]; - ret = READ_SECTOR(fatd->dev, fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector + 1, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat12 sector failed sector=%u! \n", fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector + 1); - return -EIO; - } - xbuf[2] = sbuf[0]; - xbuf[3] = sbuf[1]; - } - } - if (sectorSpan) { // use xbuf as source buffer - clusterValue = fat_getClusterRecord12(xbuf + (recordOffset % fatd->partBpb.sectorSize) - (fatd->partBpb.sectorSize - 2), cluster % 2); - } else { // use sector buffer as source buffer - clusterValue = fat_getClusterRecord12(sbuf + (recordOffset % fatd->partBpb.sectorSize), cluster % 2); - } - if (clusterValue == 0) { - fatd->clStackLast = cluster; - fatd->clStack[fatd->clStackIndex] = cluster; - fatd->clStackIndex++; - } - cluster++; //read next cluster record in the sequence - } - //the stack operates as LIFO but we put in the clusters as FIFO - //we should reverse the cluster order - not necessary - //but it will retain the natural (increasing) order of - //the cluster chain - swapClStack(fatd, oldClStackIndex, fatd->clStackIndex); - return fatd->clStackIndex; -} - - -//--------------------------------------------------------------------------- -/* - scan FAT32 for free clusters and store them to the cluster stack -*/ -static int fat_readEmptyClusters32(fat_driver *fatd) -{ - unsigned int i, j; - int ret; - unsigned int indexCount; - unsigned int fatStartSector; - unsigned int cluster; - unsigned int clusterValue; - int oldClStackIndex; - int sectorSkip; - int recordSkip; - - oldClStackIndex = fatd->clStackIndex; - - //indexCount = numer of cluster indices per sector - indexCount = fatd->partBpb.sectorSize / 4; //FAT16->2, FAT32->4 - //skip areas we have already searched through - sectorSkip = fatd->clStackLast / indexCount; - recordSkip = fatd->clStackLast % indexCount; - - fatStartSector = fatd->partBpb.partStart + fatd->partBpb.resSectors; - - for (i = sectorSkip; i < fatd->partBpb.fatSize && fatd->clStackIndex < MAX_CLUSTER_STACK; i++) { - unsigned char *sbuf = NULL; //sector buffer - - ret = READ_SECTOR(fatd->dev, fatStartSector + i, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat32 sector failed! sector=%u! \n", fatStartSector + i); - return -EIO; - } - for (j = recordSkip; j < indexCount && fatd->clStackIndex < MAX_CLUSTER_STACK; j++) { - cluster = getI32(sbuf + (j * 4)); - if (cluster == 0) { //the cluster is free - clusterValue = (i * indexCount) + j; - if (clusterValue < 0xFFFFFF7) { - fatd->clStackLast = clusterValue; - fatd->clStack[fatd->clStackIndex] = clusterValue; - fatd->clStackIndex++; - } - } - } - recordSkip = 0; - } - //the stack operates as LIFO but we put in the clusters as FIFO - //we should reverse the cluster order - not necessary - //but it will retain the natural (increasing) order of - //the cluster chain - swapClStack(fatd, oldClStackIndex, fatd->clStackIndex); - return fatd->clStackIndex; -} - -//--------------------------------------------------------------------------- -/* - scan FAT16 for free clusters and store them to the cluster stack -*/ -static int fat_readEmptyClusters16(fat_driver *fatd) -{ - unsigned int i, j; - int ret; - unsigned int indexCount; - unsigned int fatStartSector; - unsigned int cluster; - int oldClStackIndex; - int sectorSkip; - int recordSkip; - - oldClStackIndex = fatd->clStackIndex; - //XPRINTF("USBHDFSD: #### Read empty clusters16: clStackIndex=%d MAX=%d\n", clStackIndex, MAX_CLUSTER_STACK); - - //indexCount = numer of cluster indices per sector - indexCount = fatd->partBpb.sectorSize / 2; //FAT16->2, FAT32->4 - - //skip areas we have already searched through - sectorSkip = fatd->clStackLast / indexCount; - recordSkip = fatd->clStackLast % indexCount; - - fatStartSector = fatd->partBpb.partStart + fatd->partBpb.resSectors; - - for (i = sectorSkip; i < fatd->partBpb.fatSize && fatd->clStackIndex < MAX_CLUSTER_STACK; i++) { - unsigned char *sbuf = NULL; //sector buffer - - ret = READ_SECTOR(fatd->dev, fatStartSector + i, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat16 sector failed! sector=%u! \n", fatStartSector + i); - return -EIO; - } - for (j = recordSkip; j < indexCount && fatd->clStackIndex < MAX_CLUSTER_STACK; j++) { - cluster = getI16(sbuf + (j * 2)); - if (cluster == 0) { //the cluster is free - fatd->clStackLast = (i * indexCount) + j; - fatd->clStack[fatd->clStackIndex] = fatd->clStackLast; - XPRINTF("USBHDFSD: %u ", fatd->clStack[fatd->clStackIndex]); - fatd->clStackIndex++; - } - } - recordSkip = 0; - } - XPRINTF("USBHDFSD: \n"); - //the stack operates as LIFO but we put in the clusters as FIFO - //we should reverse the cluster order - not necessary - //but it will retain the natural (increasing) order of - //the cluster chain - swapClStack(fatd, oldClStackIndex, fatd->clStackIndex); - return fatd->clStackIndex; -} - -//--------------------------------------------------------------------------- -/* - scan FAT for free clusters and store them to the cluster stack -*/ -static int fat_readEmptyClusters(fat_driver *fatd) -{ - switch (fatd->partBpb.fatType) { - case FAT12: - return fat_readEmptyClusters12(fatd); - case FAT16: - return fat_readEmptyClusters16(fatd); - case FAT32: - return fat_readEmptyClusters32(fatd); - } - - return (-1); -} - - -//--------------------------------------------------------------------------- -/* - set sinlge cluster record (FAT12)into buffer - - 0x321, 0xABC - - byte0|byte1|byte2| - +--+--+--+--+--+--+ - |2 |1 |C |3 |A |B | - +--+--+--+--+--+--+ - -*/ -static void fat_setClusterRecord12(unsigned char *buf, unsigned int cluster, int type) -{ - - if (type) { //type 1 - buf[0] = (buf[0] & 0x0F) + ((cluster & 0x0F) << 4); - buf[1] = (cluster & 0xFF0) >> 4; - } else { // type 0 - buf[0] = (cluster & 0xFF); - buf[1] = (buf[1] & 0xF0) + ((cluster & 0xF00) >> 8); - } -} - -//--------------------------------------------------------------------------- -static void fat_setClusterRecord12part1(unsigned char *buf, unsigned int cluster, int type) -{ - if (type) { //type 1 - buf[0] = (buf[0] & 0x0F) + ((cluster & 0x0F) << 4); - } else { // type 0 - buf[0] = (cluster & 0xFF); - } -} - -//--------------------------------------------------------------------------- -static void fat_setClusterRecord12part2(unsigned char *buf, unsigned int cluster, int type) -{ - if (type) { //type 1 - buf[0] = (cluster & 0xFF0) >> 4; - } else { // type 0 - buf[0] = (buf[0] & 0xF0) + ((cluster & 0xF00) >> 8); - } -} - -//--------------------------------------------------------------------------- -/* - save value at the cluster record in FAT 12 -*/ -static int fat_saveClusterRecord12(fat_driver *fatd, unsigned int currentCluster, unsigned int value) -{ - int ret; - int sectorSpan; - int recordOffset; - int recordType; - int fatNumber; - unsigned int fatSector; - - ret = -1; - //recordOffset is byte offset of the record from the start of the fat table - recordOffset = (currentCluster * 3) / 2; - - //save both fat tables - for (fatNumber = 0; fatNumber < fatd->partBpb.fatCount; fatNumber++) { - unsigned char *sbuf = NULL; //sector buffer - - fatSector = fatd->partBpb.partStart + fatd->partBpb.resSectors + (fatNumber * fatd->partBpb.fatSize); - fatSector += recordOffset / fatd->partBpb.sectorSize; - sectorSpan = fatd->partBpb.sectorSize - (recordOffset % fatd->partBpb.sectorSize); - if (sectorSpan > 1) { - sectorSpan = 0; - } - recordType = currentCluster % 2; - - ret = READ_SECTOR(fatd->dev, fatSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat16 sector failed! sector=%u! \n", fatSector); - return -EIO; - } - if (!sectorSpan) { // not sector span - the record is copmact and fits in single sector - fat_setClusterRecord12(sbuf + (recordOffset % fatd->partBpb.sectorSize), value, recordType); - ret = WRITE_SECTOR(fatd->dev, fatSector); - if (ret < 0) { - XPRINTF("USBHDFSD: Write fat12 sector failed! sector=%u! \n", fatSector); - return -EIO; - } - } else { // sector span - the record is broken in 2 pieces - each one on different sector - //modify one last byte of the sector buffer - fat_setClusterRecord12part1(sbuf + (recordOffset % fatd->partBpb.sectorSize), value, recordType); - //save current sector - ret = WRITE_SECTOR(fatd->dev, fatSector); - if (ret < 0) { - XPRINTF("USBHDFSD: Write fat12 sector failed! sector=%u! \n", fatSector); - return -EIO; - } - //read next sector from the fat - fatSector++; - ret = READ_SECTOR(fatd->dev, fatSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat16 sector failed! sector=%u! \n", fatSector); - return -EIO; - } - //modify first byte of the sector buffer - fat_setClusterRecord12part2(sbuf, value, recordType); - //save current sector - ret = WRITE_SECTOR(fatd->dev, fatSector); - if (ret < 0) { - XPRINTF("USBHDFSD: Write fat12 sector failed! sector=%u! \n", fatSector); - return -EIO; - } - } - } //end for - return ret; -} - -//--------------------------------------------------------------------------- -/* - save value at the cluster record in FAT 32 -*/ -static int fat_saveClusterRecord16(fat_driver *fatd, unsigned int currentCluster, unsigned int value) -{ - int i; - int ret; - int indexCount; - int fatNumber; - unsigned int fatSector; - - ret = -1; - //indexCount is numer of cluster indices per sector - indexCount = fatd->partBpb.sectorSize / 2; //FAT16->2, FAT32->4 - - //save both fat tables - for (fatNumber = 0; fatNumber < fatd->partBpb.fatCount; fatNumber++) { - unsigned char *sbuf = NULL; //sector buffer - - fatSector = fatd->partBpb.partStart + fatd->partBpb.resSectors + (fatNumber * fatd->partBpb.fatSize); - fatSector += currentCluster / indexCount; - - ret = READ_SECTOR(fatd->dev, fatSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat16 sector failed! sector=%u! \n", fatSector); - return -EIO; - } - i = currentCluster % indexCount; - i *= 2; //fat16 - sbuf[i++] = value & 0xFF; - sbuf[i] = ((value & 0xFF00) >> 8); - ret = WRITE_SECTOR(fatd->dev, fatSector); - if (ret < 0) { - XPRINTF("USBHDFSD: Write fat16 sector failed! sector=%u! \n", fatSector); - return -EIO; - } - } - return ret; -} - -//--------------------------------------------------------------------------- -/* - save value at the cluster record in FAT 16 -*/ -static int fat_saveClusterRecord32(fat_driver *fatd, unsigned int currentCluster, unsigned int value) -{ - int i; - int ret; - int indexCount; - int fatNumber; - unsigned int fatSector; - - ret = -1; - //indexCount is numer of cluster indices per sector - indexCount = fatd->partBpb.sectorSize / 4; //FAT16->2, FAT32->4 - - //save both fat tables - for (fatNumber = 0; fatNumber < fatd->partBpb.fatCount; fatNumber++) { - unsigned char *sbuf = NULL; //sector buffer - - fatSector = fatd->partBpb.partStart + fatd->partBpb.resSectors + (fatNumber * fatd->partBpb.fatSize); - fatSector += currentCluster / indexCount; - - ret = READ_SECTOR(fatd->dev, fatSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read fat32 sector failed! sector=%u! \n", fatSector); - return -EIO; - } - i = currentCluster % indexCount; - i *= 4; //fat32 - sbuf[i++] = value & 0xFF; - sbuf[i++] = ((value & 0xFF00) >> 8); - sbuf[i++] = ((value & 0xFF0000) >> 16); - sbuf[i] = (sbuf[i] & 0xF0) + ((value >> 24) & 0x0F); //preserve the highest nibble intact - - ret = WRITE_SECTOR(fatd->dev, fatSector); - if (ret < 0) { - XPRINTF("USBHDFSD: Write fat32 sector failed! sector=%u! \n", fatSector); - return -EIO; - } - } - return ret; -} - - -//--------------------------------------------------------------------------- -/* - Append (and write) cluster chain to the FAT table. - - currentCluster - current end cluster record. - endCluster - new end cluster record. - - Note: there is no checking wether the currentCluster holds the EOF marker! - - Example - current FAT: - - index 09 10 11 12 - +-----+-----+-----+-----+ - value + 10 | EOF | 0 | 0 | - +-----+-----+-----+-----+ - - - currentcluster = 10, endcluster = 12 - updated FAT (after the function ends): - - index 09 10 11 12 - +-----+-----+-----+-----+ - value + 10 | 12 | 0 | EOF | - +-----+-----+-----+-----+ - -*/ -//--------------------------------------------------------------------------- -static int fat_appendClusterChain(fat_driver *fatd, unsigned int currentCluster, unsigned int endCluster) -{ - int ret; - ret = -1; - switch (fatd->partBpb.fatType) { - case FAT12: - ret = fat_saveClusterRecord12(fatd, currentCluster, endCluster); - if (ret < 0) - return ret; - ret = fat_saveClusterRecord12(fatd, endCluster, 0xFFF); - break; - - case FAT16: - XPRINTF("USBHDFSD: I: appending cluster chain : current=%u end=%u \n", currentCluster, endCluster); - ret = fat_saveClusterRecord16(fatd, currentCluster, endCluster); - if (ret < 0) - return ret; - ret = fat_saveClusterRecord16(fatd, endCluster, 0xFFFF); - break; - - case FAT32: - ret = fat_saveClusterRecord32(fatd, currentCluster, endCluster); - if (ret < 0) - return ret; - ret = fat_saveClusterRecord32(fatd, endCluster, 0xFFFFFFF); - break; - } - return ret; -} - -//--------------------------------------------------------------------------- -/* - create new cluster chain (of size 1 cluster) at the cluster index -*/ -static int fat_createClusterChain(fat_driver *fatd, unsigned int cluster) -{ - switch (fatd->partBpb.fatType) { - case FAT12: - return fat_saveClusterRecord12(fatd, cluster, 0xFFF); - case FAT16: - return fat_saveClusterRecord16(fatd, cluster, 0xFFFF); - case FAT32: - return fat_saveClusterRecord32(fatd, cluster, 0xFFFFFFF); - } - return -EFAULT; -} - -//--------------------------------------------------------------------------- -/* - modify the cluster (in FAT table) at the cluster index -*/ -static int fat_modifyClusterChain(fat_driver *fatd, unsigned int cluster, unsigned int value) -{ - switch (fatd->partBpb.fatType) { - case FAT12: - return fat_saveClusterRecord12(fatd, cluster, value); - case FAT16: - return fat_saveClusterRecord16(fatd, cluster, value); - case FAT32: - return fat_saveClusterRecord32(fatd, cluster, value); - } - return -EFAULT; -} - -//--------------------------------------------------------------------------- -/* - delete cluster chain starting at cluster -*/ -static int fat_deleteClusterChain(fat_driver *fatd, unsigned int cluster) -{ - int ret; - int size; - int cont; - int end; - int i; - - if (cluster < 2) { - return -EFAULT; - } - XPRINTF("USBHDFSD: I: delete cluster chain starting at cluster=%u\n", cluster); - - cont = 1; - - while (cont) { - size = fat_getClusterChain(fatd, cluster, fatd->cbuf, MAX_DIR_CLUSTER, 1); - - end = size - 1; //do not delete last cluster in the chain buffer - - for (i = 0; i < end; i++) { - ret = fat_modifyClusterChain(fatd, fatd->cbuf[i], 0); - if (ret < 0) { - return ret; - } - } - //the cluster chain continues - if (size == MAX_DIR_CLUSTER) { - cluster = fatd->cbuf[end]; - } else { - //no more cluster entries - delete the last cluster entry - ret = fat_modifyClusterChain(fatd, fatd->cbuf[end], 0); - if (ret < 0) { - return ret; - } - cont = 0; - } - fat_invalidateLastChainResult(fatd); //prevent to misuse current (now deleted) fatd->cbuf - } - return 1; -} - -//--------------------------------------------------------------------------- -/* - Get single empty cluster from the clusterStack (cS is small cache of free clusters) - Passed currentCluster is updated in the FAT and the new returned cluster index is - appended at the end of fat chain! -*/ -static unsigned int fat_getFreeCluster(fat_driver *fatd, unsigned int currentCluster) -{ - - int ret; - unsigned int result; - - //cluster stack is empty - find and fill the cS - if (fatd->clStackIndex <= 0) { - fatd->clStackIndex = 0; - ret = fat_readEmptyClusters(fatd); - if (ret <= 0) - return 0; - fatd->clStackIndex = ret; - } - //pop from cluster stack - fatd->clStackIndex--; - result = fatd->clStack[fatd->clStackIndex]; - //append the cluster chain - if (currentCluster) { - ret = fat_appendClusterChain(fatd, currentCluster, result); - } else { //create new cluster chain - ret = fat_createClusterChain(fatd, result); - } - if (ret < 0) - return 0; - return result; -} - -//--------------------------------------------------------------------------- -/* - simple conversion of the char from lower case to upper case -*/ -USBHD_INLINE unsigned char toUpperChar(unsigned char c) -{ - if (c > 96 && c < 123) { - return (c - 32); - } - return c; -} - -//--------------------------------------------------------------------------- -/* -returns number of direntry positions that the name takes -//dlanor: Note that this only includes the long_name entries -*/ -static int getDirentrySize(const unsigned char *lname) -{ - int len; - int result; - len = strlen(lname); - result = len / 13; - if (len % 13 > 0) - result++; - return result; -} - -//--------------------------------------------------------------------------- -/* -compute checksum of the short filename -*/ -static unsigned char computeNameChecksum(const unsigned char *sname) -{ - unsigned char result; - int i; - - result = 0; - for (i = 0; i < 11; i++) { - result = (0x80 * (0x01 & result)) + (result >> 1); //ROR 1 - result += sname[i]; - } - return result; -} - -//--------------------------------------------------------------------------- -/* - fill the LFN (long filename) direntry -*/ -static void setLfnEntry(const unsigned char *lname, int nameSize, unsigned char chsum, fat_direntry_lfn *dlfn, int part, int maxPart) -{ - int i, j; - unsigned char name[26]; //unicode name buffer = 13 characters per 2 bytes - int nameStart; - - nameStart = 13 * (part - 1); - j = nameSize - nameStart; - if (j > 13) { - j = 13; - } - - //fake unicode conversion - for (i = 0; i < j; i++) { - name[i * 2] = lname[nameStart + i]; - name[i * 2 + 1] = 0; - } - - //rest of the name is zero terminated and padded with 0xFF - for (i = j; i < 13; i++) { - if (i == j) { - name[i * 2] = 0; - name[i * 2 + 1] = 0; - } else { - name[i * 2] = 0xFF; - name[i * 2 + 1] = 0xFF; - } - } - - dlfn->entrySeq = part; - if (maxPart == part) - dlfn->entrySeq |= 0x40; - dlfn->checksum = chsum; - //1st part of the name - for (i = 0; i < 10; i++) - dlfn->name1[i] = name[i]; - //2nd part of the name - for (i = 0; i < 12; i++) - dlfn->name2[i] = name[i + 10]; - //3rd part of the name - for (i = 0; i < 4; i++) - dlfn->name3[i] = name[i + 22]; - dlfn->rshv = 0x0f; - dlfn->reserved1 = 0; - dlfn->reserved2[0] = 0; - dlfn->reserved2[1] = 0; -} - -//--------------------------------------------------------------------------- -/* - update the SFN (long filename) direntry - DATE and TIME -*/ -static void setSfnDate(fat_direntry_sfn *dsfn, int mode) -{ - int year, month, day, hour, minute, sec; - unsigned char tmpClk[4]; - -#ifdef WIN32 - year = 0; - month = 0; - day = 0; - hour = 0; - minute = 0; - sec = 0; -#else - //ps2 specific routine to get time and date - sceCdCLOCK cdtime; - s32 tmp; - - if (sceCdReadClock(&cdtime) != 0 && cdtime.stat == 0) { - - tmp = cdtime.second >> 4; - sec = (u32)(((tmp << 2) + tmp) << 1) + (cdtime.second & 0x0F); - - tmp = cdtime.minute >> 4; - minute = (((tmp << 2) + tmp) << 1) + (cdtime.minute & 0x0F); - - tmp = cdtime.hour >> 4; - hour = (((tmp << 2) + tmp) << 1) + (cdtime.hour & 0x0F); - - tmp = cdtime.day >> 4; - day = (((tmp << 2) + tmp) << 1) + (cdtime.day & 0x0F); - - tmp = (cdtime.month & 0x7F) >> 4; - month = (((tmp << 2) + tmp) << 1) + (cdtime.month & 0x0F); - - tmp = cdtime.year >> 4; - year = (((tmp << 2) + tmp) << 1) + (cdtime.year & 0xF) + 2000; - } else { - year = 2005; - month = 1; - day = 6; - hour = 14; - minute = 12; - sec = 10; - } -#endif - - if (dsfn == NULL || mode == 0) { - return; - } - - tmpClk[0] = (sec / 2) & 0x1F; //seconds - tmpClk[0] += (minute & 0x07) << 5; // minute - tmpClk[1] = (minute & 0x38) >> 3; // minute - tmpClk[1] += (hour & 0x1F) << 3; // hour - - tmpClk[2] = (day & 0x1F); //day - tmpClk[2] += (month & 0x07) << 5; // month - tmpClk[3] = (month & 0x08) >> 3; // month - tmpClk[3] += ((year - 1980) & 0x7F) << 1; //year - - XPRINTF("USBHDFSD: year=%d, month=%d, day=%d h=%d m=%d s=%d \n", year, month, day, hour, minute, sec); - //set date & time of creation - if (mode & DATE_CREATE) { - dsfn->timeCreate[0] = tmpClk[0]; - dsfn->timeCreate[1] = tmpClk[1]; - dsfn->dateCreate[0] = tmpClk[2]; - dsfn->dateCreate[1] = tmpClk[3]; - dsfn->dateAccess[0] = tmpClk[2]; - dsfn->dateAccess[1] = tmpClk[3]; - } - //set date & time of modification - if (mode & DATE_MODIFY) { - dsfn->timeWrite[0] = tmpClk[0]; - dsfn->timeWrite[1] = tmpClk[1]; - dsfn->dateWrite[0] = tmpClk[2]; - dsfn->dateWrite[1] = tmpClk[3]; - } -} - -//--------------------------------------------------------------------------- -/* - fill the SFN (short filename) direntry -*/ -static void setSfnEntry(const unsigned char *shortName, char directory, fat_direntry_sfn *dsfn, unsigned int cluster) -{ - int i; - - //name + ext - for (i = 0; i < 8; i++) - dsfn->name[i] = shortName[i]; - for (i = 0; i < 3; i++) - dsfn->ext[i] = shortName[i + 8]; - - if (directory > 0) { - dsfn->attr = FAT_ATTR_DIRECTORY; - } else { - dsfn->attr = FAT_ATTR_ARCHIVE; - } - dsfn->reservedNT = 0; - dsfn->clusterH[0] = (cluster & 0xFF0000) >> 16; - dsfn->clusterH[1] = (cluster & 0xFF000000) >> 24; - dsfn->clusterL[0] = (cluster & 0x00FF); - dsfn->clusterL[1] = (cluster & 0xFF00) >> 8; - - //size is zero - because we don't know the filesize yet - for (i = 0; i < 4; i++) - dsfn->size[i] = 0; - - setSfnDate(dsfn, DATE_CREATE | DATE_MODIFY); -} - -static void setSfnEntryFromOld(const unsigned char *shortName, fat_direntry_sfn *dsfn, const fat_direntry_sfn *orig_dsfn) -{ - int i; - - memcpy(dsfn, orig_dsfn, sizeof(fat_direntry_sfn)); - - //name + ext - for (i = 0; i < 8; i++) - dsfn->name[i] = shortName[i]; - for (i = 0; i < 3; i++) - dsfn->ext[i] = shortName[i + 8]; -} - -//--------------------------------------------------------------------------- -/* - Create short name by squeezing long name into the 8.3 name boundaries - lname - existing long name - sname - buffer where to store short name - - returns: 0 if longname completely fits into the 8.3 boundaries - 1 if long name have to be truncated (ie. INFORM~1.TXT) - <0 if invalid long name detected -*/ -static int createShortNameMask(unsigned char *lname, unsigned char *sname) -{ - int i; - int size; - int j; - int fit; - - if ((lname[0] == '.') && ((lname[1] == 0) || ((lname[1] == '.') && (lname[2] == 0)))) { - return -EINVAL; - } - - fit = 0; - //clean short name by putting space - for (i = 0; i < 11; i++) - sname[i] = ' '; - XPRINTF("USBHDFSD: Clear short name ='%s'\n", sname); - - //detect number of dots and space characters in the long name - j = 0; - for (i = 0; lname[i] != 0; i++) { - if (lname[i] == '.') - j++; - else if (lname[i] == ' ') - j += 2; - } - //long name contains no dot or one dot and no space char - if (j <= 1) - fit++; - //XPRINTF("USBHDFSD: fit1=%d j=%d\n", fit, j); - - //store name - for (i = 0; lname[i] != 0 && lname[i] != '.' && i < 8; i++) { - sname[i] = toUpperChar(lname[i]); - //short name must not contain spaces - replace space by underscore - if (sname[i] == ' ') - sname[i] = '_'; - } - //check wether last char is '.' and the name is shorter than 8 - if (lname[i] == '.' || lname[i] == 0) { - fit++; - } - //XPRINTF("USBHDFSD: fit2=%d\n", fit); - - //find the last dot "." - filename extension - size = strlen(lname); - size--; - - for (i = size; i > 0 && lname[i] != '.'; i--) - ; - if (lname[i] == '.') { - i++; - for (j = 0; lname[i] != 0 && j < 3; i++, j++) { - sname[j + 8] = toUpperChar(lname[i]); - } - //no more than 3 characters of the extension - if (lname[i] == 0) - fit++; - } else { - //no dot detected in the long filename - fit++; - } - // XPRINTF("USBHDFSD: fit3=%d\n", fit); - // XPRINTF("USBHDFSD: Long name=%s Short name=%s \n", lname, sname); - - //all 3 checks passed - the long name fits in the short name without restrictions - if (fit == 3) { - XPRINTF("USBHDFSD: Short name is loseles!\n"); - return 0; - } - - //one of the check failed - the short name have to be 'sequenced' - //do not allow spaces in the short name - for (i = 0; i < 8; i++) { - if (sname[i] == ' ') - sname[i] = '_'; - } - return 1; -} - -//--------------------------------------------------------------------------- -/* - separate path and filename - fname - the source (merged) string (input) - path - separated path (output) - name - separated filename (output) -*/ -static int separatePathAndName(const unsigned char *fname, unsigned char *path, unsigned char *name) -{ - int path_len; - unsigned char *sp, *np; - - if (!(sp = strrchr(fname, '/'))) //if last path separator missing ? - np = (char *)fname; // name starts at start of fname string - else //else last path separator found - np = sp + 1; // name starts after separator - if (strlen(np) >= FAT_MAX_NAME) //if name is too long - return -ENAMETOOLONG; // return error code - strcpy(name, np); //copy name from correct part of fname string - if ((path_len = (np - fname)) >= FAT_MAX_PATH) //if path is too long - return -ENAMETOOLONG; // return error code - strncpy(path, fname, path_len); //copy path from start of fname string - path[path_len] = 0; //terminate path - return 1; -} - -//--------------------------------------------------------------------------- -/* - get the sequence number from existing direntry name -*/ -static int getShortNameSequence(unsigned char *name, unsigned char *ext, const unsigned char *sname) -{ - int i, j; - const unsigned char *tmp; - unsigned char buf[8]; - - //at first: compare extensions - //if extensions differ then filenames are diffrerent and seq is 0 - tmp = sname + 8; - for (i = 0; i < 3; i++) { - if (ext[i] != tmp[i]) - return 0; - } - - //at second: find tilde '~' character (search backward from the end) - for (i = 7; i > 0 && name[i] != '~'; i--) - ; - - if (i == 0) - return 0; // tilde char was not found or is at first character - - //now compare the names - up to '~' position - //if names differ then filenames are different; - for (j = 0; j < i; j++) { - if (name[j] != sname[j]) - return 0; - } - - //if we get to this point we know that extension and name match - //now get the sequence number behind the '~' - for (j = i + 1; j < 8; j++) - buf[j - i - 1] = name[j]; - buf[j - i - 1] = 0; //terminate - - XPRINTF("USBHDFSD: found short name sequence number='%s' \n", buf); - return strtol(buf, NULL, 10); -} - -//--------------------------------------------------------------------------- -/* - set the short name sequence number -*/ -static int setShortNameSequence(fat_driver *fatd, unsigned char *sname) -{ - char number[8]; - unsigned char *buf; - int i, j; - int seq; - unsigned char mask; - - //dlanor: The code below was bugged in several ways, as it treated the high seq - //values stored in long_name records as separate seqs, and also failed to accept - //any valid seq value whose low part (stored in short_name record) was zero. - //I'm now replacing this garbage with a bit-mask oriented scheme - - seq = SEQ_MASK_SIZE; - for (i = 0; (i < (SEQ_MASK_SIZE >> 3)); i++) { //for each mask byte - if ((mask = fatd->seq_mask[i]) != 0xFF) { //if mask byte has any bit free - for (j = 0; j < 8; j++, mask >>= 1) { //for each bit in byte - if ((mask & 1) == 0) { //if free bit found - seq = (i << 3) + j; //set seq value - break; //break bit loop - } //ends "if free bit found" - } //ends "for each bit in byte" - break; //break byte loop - } //ends "if mask byte has any bit free" - } //ends "for each mask byte" - - memset(number, 0, 8); - sprintf(number, "%d", seq); - j = strlen(number); - - buf = sname + 7 - j; - buf[0] = '~'; - buf++; - for (i = 0; i < j; i++) - buf[i] = number[i]; - - return 0; -} - -//--------------------------------------------------------------------------- -/* - find space where to put the direntry -*/ -static int getDirentryStoreOffset(fat_driver *fatd, int entryCount, int direntrySize) -{ - int i; - int tightIndex; - int looseIndex; - int cont; - int id; - int slotStart; - int slotSize; - int mask_ix, mask_sh; - - - //we search for sequence of deleted or empty entries (cleared bits in dir_used_mask) - //1) search the tight slot (that fits completely. ex: size = 3, and slot space is 3 ) - //2) search the suitable (loose) slot (ex: size = 3, slot space is 5) - - slotStart = -1; - slotSize = 0; - tightIndex = -1; - looseIndex = -1; - cont = 1; - //search the entries for entry types - for (i = 0; i < entryCount && cont; i++) { - mask_ix = i >> 3; - mask_sh = i & 7; - id = fatd->dir_used_mask[mask_ix] & (1 << mask_sh); - if (id == 0) { //empty entry - if (slotStart >= 0) { - slotSize++; - } else { - slotStart = i; - slotSize = 1; - XPRINTF("USBHDFSD: *Start slot at index=%d ", slotStart); - } - } else { //occupied entry - if (tightIndex < 0 && slotSize == direntrySize) { - tightIndex = slotStart; - XPRINTF("USBHDFSD: !Set tight index= %d\n", tightIndex); - } - if (looseIndex < 0 && slotSize > direntrySize) { - looseIndex = slotStart + slotSize - direntrySize; - XPRINTF("USBHDFSD: !Set loose index= %d\n", looseIndex); - } - if (tightIndex >= 0 && looseIndex >= 0) { - cont = 0; - } - slotStart = -1; - slotSize = 0; - } - } - XPRINTF("USBHDFSD: \n"); - - // tight index - smaller fragmentation of space, the larger blocks - // are left for larger filenames. - // loose index - more fragmentation of direntry space, but the direntry - // name has space for future enlargement (of the name). - // i.e. no need to reposition the direntry and / or - // to allocate additional fat cluster for direntry space. - - // we prefere tight slot if available, othervise we use the loose slot. - // if there are no tight and no loose slot then we position new direntry - // at the end of current direntry space - if (tightIndex >= 0) { - return tightIndex; - } - if (looseIndex >= 0) { - return looseIndex; - } - //last entry is (most likely) empty - and if so, use it - mask_ix = (entryCount - 1) >> 3; - mask_sh = (entryCount - 1) & 7; - id = fatd->dir_used_mask[mask_ix] & (1 << mask_sh); - if (id == 0) { - return entryCount - 1; - } - - return entryCount; -} - -//--------------------------------------------------------------------------- -/* - scans current directory entries and fills the info records - - lname - long filename (to test wether existing entry match the long name) (input) - sname - short filename ( ditto ^^ ) (input) - startCluster - valid start cluster of the directory or 0 if we scan the root directory (input) - - if file/directory already exist (return code 0) then: - retSector - contains sector number of the direntry (output) - retOffset - contains byte offse of the SFN direntry from start of the sector (output) - the reason is to speed up modification of the SFN (size of the file) -//dlanor: This function has been rewritten to use global bitmask arrays for output -*/ -static int fat_fillDirentryInfo(fat_driver *fatd, const unsigned char *lname, unsigned char *sname, - char directory, unsigned int *startCluster, - unsigned int *retSector, int *retOffset) -{ - fat_direntry_summary dir; - int i, j; - int dirSector; - unsigned int startSector; - unsigned int theSector; - int cont; - int ret; - unsigned int dirPos; - int seq; - int mask_ix, mask_sh; -#ifdef DEBUG - mass_dev *mass_device = fatd->dev; -#endif - - memset(fatd->dir_used_mask, 0, DIR_MASK_SIZE / 8); - memset(fatd->seq_mask, 0, SEQ_MASK_SIZE / 8); - - cont = 1; - //clear name strings - dir.sname[0] = 0; - dir.name[0] = 0; - - j = 0; - if (directory > 0) - directory = FAT_ATTR_DIRECTORY; - - fat_getDirentrySectorData(fatd, startCluster, &startSector, &dirSector); - - XPRINTF("USBHDFSD: dirCluster=%u startSector=%u (%u) dirSector=%u \n", *startCluster, startSector, startSector * mass_device->sectorSize, dirSector); - - //go through first directory sector till the max number of directory sectors - //or stop when no more direntries detected - for (i = 0; i < dirSector && cont; i++) { - unsigned char *sbuf = NULL; //sector buffer - - //At cluster borders, get correct sector from cluster chain buffer - if ((*startCluster != 0) && (i % fatd->partBpb.clusterSize == 0)) { - startSector = fat_cluster2sector(&fatd->partBpb, fatd->cbuf[(i / fatd->partBpb.clusterSize)]) - i; - } - theSector = startSector + i; - ret = READ_SECTOR(fatd->dev, theSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: read directory sector failed ! sector=%u\n", theSector); - return -EIO; - } - XPRINTF("USBHDFSD: read sector ok, scanning sector for direntries...\n"); - dirPos = 0; - - // go through start of the sector till the end of sector - while (cont && (dirPos < fatd->partBpb.sectorSize) && (j < DIR_MASK_SIZE)) { - fat_direntry *dir_entry = (fat_direntry *)(sbuf + dirPos); - cont = fat_getDirentry(fatd->partBpb.fatType, dir_entry, &dir); //get single directory entry from sector buffer - mask_ix = j >> 3; - mask_sh = j & 7; - switch (cont) { - case 1: //short name - fatd->dir_used_mask[mask_ix] |= (1 << mask_sh); - if (!(dir.attr & FAT_ATTR_VOLUME_LABEL)) { //not volume label - if ((strEqual(dir.sname, lname) == 0) || (strEqual(dir.name, lname) == 0)) { - //file we want to create already exist - return the cluster of the file - if ((directory > 0) && ((dir.attr & FAT_ATTR_DIRECTORY) != directory)) { - //found directory but requested is file (and vice veresa) - if (directory) - return -ENOTDIR; - return -EISDIR; - } //ends "if" clause for mismatched file/folder state - XPRINTF("USBHDFSD: I: entry found! %s, %s = %s\n", dir.name, dir.sname, lname); - *retSector = theSector; - *retOffset = dirPos; - *startCluster = dir.cluster; - fatd->deSec[fatd->deIdx] = theSector; - fatd->deOfs[fatd->deIdx] = dirPos; - fatd->deIdx++; - return 0; - } //ends "if" clause for matching name - seq = getShortNameSequence(dir_entry->sfn.name, dir_entry->sfn.ext, sname); - if (seq < SEQ_MASK_SIZE) - fatd->seq_mask[seq >> 3] |= (1 << (seq & 7)); - fatd->deIdx = 0; - //clear name strings - dir.sname[0] = 0; - dir.name[0] = 0; - } //ends "if(!(dir.attr & FAT_ATTR_VOLUME_LABEL))" - else { //dlanor: Volume label - fatd->deIdx = 0; - } - break; - case 2: //long name - fatd->dir_used_mask[mask_ix] |= (1 << mask_sh); - fatd->deSec[fatd->deIdx] = theSector; - fatd->deOfs[fatd->deIdx] = dirPos; - fatd->deIdx++; - break; - case 3: //empty - fatd->deIdx = 0; - break; - } //ends "switch" - dirPos += sizeof(fat_direntry); - j++; - } - } - //indicate inconsistency - if (j >= DIR_MASK_SIZE) { - j++; - } - return j; -} - -//--------------------------------------------------------------------------- -/* - check wether the new direntries (note: one file have at least 2 direntries for 1 SFN and 1..n LFN) - fit into the current directory space. - Enlarges the directory space if needed and possible (note: root dirspace can't be enlarged for fat12 and fat16) - - startCluster - valid start cluster of dirpace or 0 for the root directory - entryCount - number of direntries of the filename (at least 2) - entryIndex - index where to store new direntries - direntrySize - number of all direntries in the directory -*/ - -static int enlargeDirentryClusterSpace(fat_driver *fatd, unsigned int startCluster, int entryCount, int entryIndex, int direntrySize) -{ - int ret; - int dirSector; - unsigned int startSector; - int i; - int maxSector; - int entriesPerSector; - int chainSize; - unsigned int currentCluster; - unsigned int newCluster; - - i = entryIndex + direntrySize; - XPRINTF("USBHDFSD: cur=%d ecount=%d \n", i, entryCount); - //we don't need to enlarge directory cluster space - if (i <= entryCount) - return 0; //direntry fits into current space - - entriesPerSector = fatd->partBpb.sectorSize / 32; - maxSector = i / entriesPerSector; - if (i % entriesPerSector) { - maxSector++; - } - - chainSize = fat_getDirentrySectorData(fatd, &startCluster, &startSector, &dirSector); - - XPRINTF("USBHDFSD: maxSector=%u dirSector=%u\n", maxSector, dirSector); - - if (maxSector <= dirSector) - return 0; - - //Root directory of FAT12 or FAT16 - space can't be enlarged! - if (startCluster == 0 && fatd->partBpb.fatType < FAT32) { - return -EMLINK; //too many direntries in the root directory - } - - //in the fatd->cbuf we have the cluster chain - - //get last cluster of the cluster chain - currentCluster = fatd->cbuf[chainSize - 1]; - XPRINTF("USBHDFSD: current (last) cluster=%u \n", currentCluster); - - //get 1 cluster from cluster stack and append the chain - newCluster = fat_getFreeCluster(fatd, currentCluster); - XPRINTF("USBHDFSD: new cluster=%u \n", newCluster); - fat_invalidateLastChainResult(fatd); //prevent to misuse current (now updated) fatd->cbuf - //if new cluster cannot be allocated - if (newCluster == 0) { - return -ENOSPC; - } - - // now clean the directory space - startSector = fat_cluster2sector(&fatd->partBpb, newCluster); - for (i = 0; i < fatd->partBpb.clusterSize; i++) { - unsigned char *sbuf = NULL; //sector buffer - - ret = ALLOC_SECTOR(fatd->dev, startSector + i, sbuf); - memset(sbuf, 0, fatd->partBpb.sectorSize); //fill whole sector with zeros - ret = WRITE_SECTOR(fatd->dev, startSector + i); - if (ret < 0) - return -EIO; - } - return 1; // 1 cluster allocated -} - -//--------------------------------------------------------------------------- -/* - Create empty directory space with two SFN direntries: - 1) current directory "." - 2) parent directory ".." - -*/ -static int createDirectorySpace(fat_driver *fatd, unsigned int dirCluster, unsigned int parentDirCluster) -{ - int i, j; - int ret; - unsigned int startSector; - - //we do not mess with root directory - if (dirCluster < 2) { - return -EFAULT; - } - - //we create directory space inside one cluster. No need to worry about - //large dir space spread on multiple clusters - startSector = fat_cluster2sector(&fatd->partBpb, dirCluster); - XPRINTF("USBHDFSD: I: create dir space: cluster=%u sector=%u (%u) \n", dirCluster, startSector, startSector * fatd->partBpb.sectorSize); - - //go through all sectors of the cluster - for (i = 0; i < fatd->partBpb.clusterSize; i++) { - unsigned char *sbuf = NULL; //sector buffer - - ret = ALLOC_SECTOR(fatd->dev, startSector + i, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: alloc directory sector failed ! sector=%u\n", startSector + i); - return -EIO; - } - memset(sbuf, 0, fatd->partBpb.sectorSize); //clean the sector - if (i == 0) { - fat_direntry_sfn *dsfn = (fat_direntry_sfn *)sbuf; - unsigned char name[11]; - for (j = 1; j < 11; j++) - name[j] = ' '; - name[0] = '.'; - setSfnEntry(name, 1, dsfn + 0, dirCluster); - name[1] = '.'; - setSfnEntry(name, 1, dsfn + 1, parentDirCluster); - } - ret = WRITE_SECTOR(fatd->dev, startSector + i); - if (ret < 0) { - XPRINTF("USBHDFSD: write directory sector failed ! sector=%u\n", startSector + i); - return -EIO; - } - } - - return (0); -} - - -//--------------------------------------------------------------------------- -/* - Save direntries of the long and short filename to the directory space on the disk - - startCluster - start cluster of the directory space - lname : long name - sname : short name - directory : 0-file, 1-directory - cluster : start cluster of the file/directory - - entrySize - number of direntries to store - entryIndex - index of the direntry start in the directory space - - retSector - contains sector number of the direntry (output) - retOffset - contains byte offse of the SFN direntry from start of the sector (output) - the reason is to speed up modification of the SFN (size of the file) - - note: the filesize set in the direntry is 0 (for both directory and file) -*/ -static int saveDirentry(fat_driver *fatd, unsigned int startCluster, - const unsigned char *lname, const unsigned char *sname, char directory, unsigned int cluster, - int entrySize, int entryIndex, unsigned int *retSector, int *retOffset, const fat_direntry_sfn *orig_dsfn) -{ - int i, j; - int dirSector; - unsigned int startSector; - unsigned int theSector; - int cont; - int ret; - unsigned int dirPos; - int entryEndIndex; - int writeFlag; -#ifdef DEBUG - mass_dev *mass_device = fatd->dev; -#endif - int part = entrySize - 1; - int nameSize; - unsigned char chsum; - - chsum = computeNameChecksum(sname); - nameSize = strlen(lname); - - cont = 1; - //clear name strings - entryEndIndex = entryIndex + entrySize; - - j = 0; - - fat_getDirentrySectorData(fatd, &startCluster, &startSector, &dirSector); - - XPRINTF("USBHDFSD: dirCluster=%u startSector=%u (%u) dirSector=%u \n", startCluster, startSector, startSector * mass_device->sectorSize, dirSector); - - //go through first directory sector till the max number of directory sectors - //or stop when no more direntries detected - for (i = 0; i < dirSector && cont; i++) { - unsigned char *sbuf = NULL; //sector buffer - - //At cluster borders, get correct sector from cluster chain buffer - if ((startCluster != 0) && (i % fatd->partBpb.clusterSize == 0)) { - startSector = fat_cluster2sector(&fatd->partBpb, fatd->cbuf[(i / fatd->partBpb.clusterSize)]) - i; - } - theSector = startSector + i; - ret = READ_SECTOR(fatd->dev, theSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: read directory sector failed ! sector=%u\n", theSector); - return -EIO; - } - XPRINTF("USBHDFSD: read sector ok, scanning sector for direntries...\n"); - dirPos = 0; - writeFlag = 0; - // go through start of the sector till the end of sector - while (dirPos < fatd->partBpb.sectorSize) { - if (j >= entryIndex && j < entryEndIndex) { - fat_direntry *dir_entry = (fat_direntry *)(sbuf + dirPos); - if (part == 0) { - if (orig_dsfn == NULL) - setSfnEntry(sname, directory, &dir_entry->sfn, cluster); - else - setSfnEntryFromOld(sname, &dir_entry->sfn, orig_dsfn); - } else - setLfnEntry(lname, nameSize, chsum, &dir_entry->lfn, part, entrySize - 1); - part--; - writeFlag++; - //SFN is stored - if (j == entryEndIndex - 1) { - *retSector = theSector; - *retOffset = dirPos; - } - } - //sbuf + dirPos - dirPos += sizeof(fat_direntry); - j++; - } //ends "while" - //store modified sector - if (writeFlag) { - ret = WRITE_SECTOR(fatd->dev, theSector); - if (ret < 0) { - XPRINTF("USBHDFSD: write directory sector failed ! sector=%u\n", theSector); - return -EIO; - } - } - if (j >= entryEndIndex) { - cont = 0; //do not continue - } - } - return j; -} - -//--------------------------------------------------------------------------- -/* - - create/convert long name to short name - - analyse directory space - - enlarge directory space - - save direntries - - lname - long name - directory - 0-> create file 1->create directory - escapeNoExist - 0->allways create file 1->early exit if file doesn't exist - startCluster - directory space start cluster (set to zero for root directory) - retSector - SFN sector - sector of the SFN direntry (output) - retOffset - byte offset of the SFN direntry counting from the start of the sector (output) -*/ - -static int fat_modifyDirSpace(fat_driver *fatd, unsigned char *lname, char directory, char escapeNotExist, unsigned int *startCluster, unsigned int *retSector, int *retOffset, const fat_direntry_sfn *orig_dsfn) -{ - unsigned char sname[12]; //short name 8+3 + terminator - unsigned int newCluster, parentDirCluster_tmp; - int ret, entryCount, compressShortName, entryIndex, direntrySize; - - //dlanor: Since each filename may need up to 11 directory entries (MAX_FAT_NAME==128) - //dlanor: I've rewritten the methods of this function to use global bitmasks as this - //dlanor: allows more effective entry handling than most other methods - // - //memo buffer for each direntry - up to 1024 entries in directory - // 7 6 5 4 3 2 | 1 0 - // ------------+----- - // SEQ HI/LO | ID - // ------------------ - // ID : 0 - entry is empty or deleted - // 1 - sfn entry - // 2 - lfn entry - // 3 - other entry (volume label etc.) - // SEQ: sequence number of the short filename. - // if our long filename is "Quitelongname.txt" then - // seq for existing entry: - // ABCD.TXT seq = 0 (no sequence number in name and name doesn't match) - // ABCDEF~1.TXT seq = 0 (because the short names doesn't match) - // QUITELON.TXT seq = 0 (again the short name doesn't match) - // QUITEL~1.JPG seq = 0 (name match but extension desn't match) - // QUITEL~1.TXT seq = 1 (both name and extension match - sequence number 1) - // QUITE~85.TXT seq = 85 ( dtto. ^^^^) - - // If the sfn has sequence it means the filename should be long - // and preceeding entry should be lfn. In this case the preceeding (lfn) - // entry seq holds the high 6 bites of the whole sequence. If preceding - // entry is another sfn direntry then we report error (even if it might be - // (in some rare occasions) correct directory structure). - - - sname[11] = 0; - - //create short name from long name - ret = createShortNameMask(lname, sname); - if (ret < 0) { - XPRINTF("USBHDFSD: E: short name invalid!\n"); - return ret; - } - compressShortName = ret; - - //get information about existing direntries (palcement of the empty/reusable direntries) - //and sequence numbers of the short filenames - parentDirCluster_tmp = *startCluster; - ret = fat_fillDirentryInfo(fatd, lname, sname, directory, - &parentDirCluster_tmp, retSector, retOffset); - if (ret < 0) { - XPRINTF("USBHDFSD: E: direntry data invalid!\n"); - return ret; - } - //ret 0 means that exact filename/directory already exist - if (ret == 0) { - return ret; - } - - //exact filename not exist and we want to report it - if (escapeNotExist) { - return -ENOENT; - } - - - if (ret > DIR_MASK_SIZE) { - XPRINTF("USBHDFSD: W: Direntry count is larger than number of records!\n"); - ret = DIR_MASK_SIZE; - } - entryCount = ret; - XPRINTF("USBHDFSD: I: direntry count=%d\n", entryCount); - - if (compressShortName) { - setShortNameSequence(fatd, sname); - } - XPRINTF("USBHDFSD: I: new short name='%s' \n", sname); - - //direntry size for long name + 1 additional direntry for short name - direntrySize = getDirentrySize(lname) + 1; - XPRINTF("USBHDFSD: Direntry size=%d\n", direntrySize); - - //find the offset (index) of the direntry space where to put this direntry - entryIndex = getDirentryStoreOffset(fatd, entryCount, direntrySize); - XPRINTF("USBHDFSD: I: direntry store offset=%d\n", entryIndex); - - //if the direntry offset excede current space of directory clusters - //we have to add one cluster to directory space - ret = enlargeDirentryClusterSpace(fatd, *startCluster, entryCount, entryIndex, direntrySize); - XPRINTF("USBHDFSD: I: enlarge direntry cluster space ret=%d\n", ret); - if (ret < 0) { - return ret; - } - - if (orig_dsfn == NULL) { - //get new cluster for file/directory - newCluster = fat_getFreeCluster(fatd, 0); - if (newCluster == 0) { - return -ENOSPC; - } - XPRINTF("USBHDFSD: I: new file/dir cluster=%u\n", newCluster); - } else { - newCluster = 0; - } - - //now store direntries into the directory space - ret = saveDirentry(fatd, *startCluster, lname, sname, directory, newCluster, direntrySize, entryIndex, retSector, retOffset, orig_dsfn); - XPRINTF("USBHDFSD: I: save direntry ret=%d\n", ret); - if (ret < 0) { - return ret; - } - - //create empty directory structure - if ((orig_dsfn == NULL) && directory) { - ret = createDirectorySpace(fatd, newCluster, *startCluster); - XPRINTF("USBHDFSD: I: create directory space ret=%d\n", ret); - if (ret < 0) { - return ret; - } - } - - return 1; -} - -//--------------------------------------------------------------------------- -/* - Check whether directory space contain any file or directory - - startCluster - start cluster of the directory space - - returns: 0 - false - directory space contains files or directories (except '.' and '..') - 1 - true - directory space is empty or contains deleted entries - -X - error -*/ -static int checkDirspaceEmpty(fat_driver *fatd, unsigned int startCluster) -{ - int ret; - int i; - unsigned char sname[12]; //short name 8+3 + terminator - int entryCount; - - unsigned int retSector; - int retOffset; - - XPRINTF("USBHDFSD: I: checkDirspaceEmpty directory cluster=%u \n", startCluster); - if (startCluster < 2) { // do not check root directory! - return -EFAULT; - } - - sname[0] = 0; - - - ret = fat_fillDirentryInfo(fatd, sname, sname, 1, - &startCluster, &retSector, &retOffset); - if (ret > DIR_MASK_SIZE) { - XPRINTF("USBHDFSD: W: Direntry count is larger than number of records! directory space cluster =%u maxRecords=%u\n", startCluster, DIR_MASK_SIZE); - ret = DIR_MASK_SIZE; - } - entryCount = ret; - //first two records should be '.' & '..', which don't count as real content - if ((fatd->dir_used_mask[0] & 0xFC) != 0) - goto non_empty; - for (i = 1; i < (entryCount / 8); i++) { - if (fatd->dir_used_mask[i] != 0) { - non_empty: - XPRINTF("USBHDFSD: I: directory not empty!\n"); - return 0; - } //ends "if" - } //ends "for" - XPRINTF("USBHDFSD: I: directory is empty.\n"); - return 1; -} - -//--------------------------------------------------------------------------- -static int fat_wipeDirEntries(fat_driver *fatd) -{ - int ret; - unsigned int i, theSector; - unsigned char *sbuf = NULL; - - //now mark direntries as deleted - theSector = 0; - ret = 0; - for (i = 0; i < fatd->deIdx; i++) { - if (fatd->deSec[i] != theSector) { - if (theSector > 0) { - ret = WRITE_SECTOR(fatd->dev, theSector); - if (ret < 0) { - XPRINTF("USBHDFSD: write directory sector failed ! sector=%u\n", theSector); - ret = -EIO; - break; - } - } - theSector = fatd->deSec[i]; - ret = READ_SECTOR(fatd->dev, theSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: read directory sector failed ! sector=%u\n", theSector); - ret = -EIO; - break; - } - } - sbuf[fatd->deOfs[i]] = 0xE5; //delete marker - } - if (theSector > 0) { - ret = WRITE_SECTOR(fatd->dev, theSector); - if (ret < 0) { - XPRINTF("USBHDFSD: write directory sector failed ! sector=%u\n", theSector); - ret = -EIO; - } - } - - return ret; -} - - -/* - Remove the name (direntries of the file or directory) from the directory space. - - lname - long name (without the path) - directory - 0->delete file 1-delete directory - startCluster - start cluster of the directory space -*/ - -static int fat_clearDirSpace(fat_driver *fatd, unsigned char *lname, char directory, unsigned int *startCluster) -{ - int ret; - unsigned char sname[12]; //short name 8+3 + terminator - unsigned int dirCluster; - unsigned int sfnSector; - int sfnOffset; - - sname[0] = 0; - - - dirCluster = *startCluster; - //get information about existing direntries (palcement of the empty/reusable direntries) - //and find the lname in the directory - //also fill up the dsSec and dsOfs information - ret = fat_fillDirentryInfo(fatd, lname, sname, directory, - startCluster, &sfnSector, &sfnOffset); - if (ret != 0) { - XPRINTF("USBHDFSD: E: direntry not found!\n"); - return -ENOENT; - } - XPRINTF("USBHDFSD: clear dir space: dir found at cluster=%u \n ", *startCluster); - - //Check wether any file or directory exist in te target directory space. - //We should not delete the directory if files/directories exist - //because just clearing the dir doesn't free the fat clusters - //occupied by files. - if (directory) { - //check wether sub-directory is empty - //startCluster now points to subdirectory start cluster - ret = checkDirspaceEmpty(fatd, *startCluster); - if (ret == 0) { //directorty contains some files - return -ENOTEMPTY; - } - //read the direntry info again, because we lost it during subdir check - *startCluster = dirCluster; - - ret = fat_fillDirentryInfo(fatd, lname, sname, directory, - startCluster, &sfnSector, &sfnOffset); - if (ret != 0) { - XPRINTF("USBHDFSD: E: direntry not found!\n"); - return -ENOENT; - } - } - - //now mark direntries as deleted - ret = fat_wipeDirEntries(fatd); - if (ret < 0) { - XPRINTF("USBHDFSD: E: wipe direntries failed!\n"); - return ret; - } - - //now delete whole cluster chain starting at the file's first cluster - ret = fat_deleteClusterChain(fatd, *startCluster); - if (ret < 0) { - XPRINTF("USBHDFSD: E: delete cluster chain failed!\n"); - return ret; - } - return 1; -} - - - -/* ===================================================================== */ - -/* - cluster - start cluster of the file - sfnSector - short filename entry sector - sfnOffset - short filename entry offset from the sector start -*/ -int fat_truncateFile(fat_driver *fatd, unsigned int cluster, unsigned int sfnSector, int sfnOffset) -{ - int ret; - fat_direntry_sfn *dsfn; - unsigned char *sbuf = NULL; //sector buffer - - if (cluster == 0 || sfnSector == 0) { - return -EFAULT; - } - - - //now delete whole cluster chain starting at the file's first cluster - ret = fat_deleteClusterChain(fatd, cluster); - if (ret < 0) { - XPRINTF("USBHDFSD: E: delete cluster chain failed!\n"); - return ret; - } - - //terminate cluster - ret = fat_createClusterChain(fatd, cluster); - if (ret < 0) { - XPRINTF("USBHDFSD: E: truncate cluster chain failed!\n"); - return ret; - } - - ret = READ_SECTOR(fatd->dev, sfnSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: read direntry sector failed ! sector=%u\n", sfnSector); - return -EIO; - } - dsfn = (fat_direntry_sfn *)(sbuf + sfnOffset); - dsfn->size[0] = 0; - dsfn->size[1] = 0; - dsfn->size[2] = 0; - dsfn->size[3] = 0; - - ret = WRITE_SECTOR(fatd->dev, sfnSector); - if (ret < 0) { - XPRINTF("USBHDFSD: write directory sector failed ! sector=%u\n", sfnSector); - return -EIO; - } - return 1; -} - - -//--------------------------------------------------------------------------- -/* - Update size of the SFN entry - - cluster - start cluster of the file - sfnSector - short filename entry sector - sfnOffset - short filename entry offset from the sector start -*/ -int fat_updateSfn(fat_driver *fatd, int size, unsigned int sfnSector, int sfnOffset) -{ - int ret; - fat_direntry_sfn *dsfn; - unsigned char *sbuf = NULL; //sector buffer - - if (sfnSector == 0) { - return -EFAULT; - } - - - ret = READ_SECTOR(fatd->dev, sfnSector, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: read direntry sector failed ! sector=%u\n", sfnSector); - return -EIO; - } - dsfn = (fat_direntry_sfn *)(sbuf + sfnOffset); - dsfn->size[0] = size & 0xFF; - dsfn->size[1] = (size & 0xFF00) >> 8; - dsfn->size[2] = (size & 0xFF0000) >> 16; - dsfn->size[3] = (size & 0xFF000000) >> 24; - - setSfnDate(dsfn, DATE_MODIFY); - - ret = WRITE_SECTOR(fatd->dev, sfnSector); - if (ret < 0) { - XPRINTF("USBHDFSD: write directory sector failed ! sector=%u\n", sfnSector); - return -EIO; - } - XPRINTF("USBHDFSD: I: sfn updated, file size=%d \n", size); - return 1; -} - - -//--------------------------------------------------------------------------- -/* - create file or directory - - fname - path and filename - directory - set to 0 to create file, 1 to create directory - escapeNotExist - set to 1 if you want to report error if file not exist. - Otherwise set to 0 and file/dir will be created. - cluster - start cluster of the directory space - default is 0 -> root directory - sfnSector - sector of the SFN entry (output) - helps to modify direntry (size, date, time) - sfnOffset - offset (in bytes) of the SFN entry (output) -*/ - -int fat_createFile(fat_driver *fatd, const unsigned char *fname, char directory, char escapeNotExist, unsigned int *cluster, unsigned int *sfnSector, int *sfnOffset) -{ - int ret; - unsigned int startCluster; - unsigned int directoryCluster; - unsigned char lname[FAT_MAX_NAME], pathToDirent[FAT_MAX_PATH]; - fat_dir fatdir; - - ret = separatePathAndName(fname, pathToDirent, lname); - if ((ret < 0) //if name invalid to separation routine - || ((lname[0] == 0) //or name is empty string - || ((lname[0] == '.') && ((lname[1] == 0) //or name is single period - || ((lname[1] == '.') && (lname[2] == 0) //or name is two periods - ))))) { - XPRINTF("USBHDFSD: E: file name not exist or not valid!"); - return -ENOENT; - } - - XPRINTF("USBHDFSD: Calling fat_getFileStartCluster from fat_createFile\n"); - //get start cluster of the last sub-directory of the path - startCluster = 0; - ret = fat_getFileStartCluster(fatd, pathToDirent, &startCluster, &fatdir); - if (ret < 0) { - XPRINTF("USBHDFSD: E: directory not found! \n"); - return ret; - } - - if (!(fatdir.attr & FAT_ATTR_DIRECTORY)) { - XPRINTF("USBHDFSD: E: directory not found! \n"); - return -ENOENT; - } - - XPRINTF("USBHDFSD: directory=%s name=%s cluster=%u \n", pathToDirent, lname, startCluster); - - if (fatdir.attr & FAT_ATTR_READONLY) - return -EACCES; - - //modify directory space of the path (cread direntries) - //and/or create new (empty) directory space if directory creation requested - directoryCluster = startCluster; - ret = fat_modifyDirSpace(fatd, lname, directory, escapeNotExist, &startCluster, sfnSector, sfnOffset, NULL); - if (ret < 0) { - XPRINTF("USBHDFSD: E: modifyDirSpace failed!\n"); - return ret; - } - XPRINTF("USBHDFSD: I: SFN info: sector=%u (%u) offset=%u (%u) startCluster=%u\n", *sfnSector, *sfnSector * fatd->partBpb.sectorSize, *sfnOffset, *sfnOffset + (*sfnSector * fatd->partBpb.sectorSize), startCluster); - *cluster = startCluster; - //dlanor: I've repatched the stuff below to improve functionality - //The simple test below was bugged for the case of creating a folder in root - //if (startCluster != directoryCluster) { - //That test (on the line above) fails in root because created folders never - //get a startCluster of 0. That is reserved for root only. - //The test below replaces this with a more complex test that takes all of this - //stuff into proper account, but behaves like the old test for other cases. - //That's mainly because I can't tell how consistent name conflict flagging is - //for those other cases, and it's not really worth the trouble of finding out :) - if ((ret == 0) //if we have a directly flagged name conflict - || ((directoryCluster || !directory) //OR working in non_root, or making a file - && (startCluster != directoryCluster) //AND we get an unexpected startCluster - )) { - XPRINTF("USBHDFSD: I: file already exists at cluster=%u\n", startCluster); - return 2; - } - return 0; -} - - -//--------------------------------------------------------------------------- -int fat_deleteFile(fat_driver *fatd, const unsigned char *fname, char directory) -{ - int ret; - unsigned int startCluster; - unsigned int directoryCluster; - unsigned char lname[FAT_MAX_NAME], pathToDirent[FAT_MAX_PATH]; - fat_dir fatdir; - - ret = separatePathAndName(fname, pathToDirent, lname); - if ((ret < 0) //if name invalid to separation routine - || ((lname[0] == 0) //or name is empty string - || ((lname[0] == '.') && ((lname[1] == 0) //or name is single period - || ((lname[1] == '.') && (lname[2] == 0) //or name is two periods - ))))) { - XPRINTF("USBHDFSD: E: file name not exist or not valid!"); - return -ENOENT; - } - - XPRINTF("USBHDFSD: Calling fat_getFileStartCluster from fat_deleteFile\n"); - //get start cluster of the last sub-directory of the path - startCluster = 0; - ret = fat_getFileStartCluster(fatd, pathToDirent, &startCluster, &fatdir); - if (ret < 0) { - XPRINTF("USBHDFSD: E: directory not found! \n"); - return ret; - } - - if (!(fatdir.attr & FAT_ATTR_DIRECTORY)) { - XPRINTF("USBHDFSD: E: directory not found! \n"); - return -ENOENT; - } - - XPRINTF("USBHDFSD: directory=%s name=%s cluster=%u \n", pathToDirent, lname, startCluster); - - if (fatdir.attr & FAT_ATTR_READONLY) { - XPRINTF("USBHDFSD: E: directory read only! \n"); - return -EACCES; - } - - //delete direntries and modify fat - directoryCluster = startCluster; - ret = fat_clearDirSpace(fatd, lname, directory, &startCluster); - if (ret < 0) { - XPRINTF("USBHDFSD: E: cleanDirSpace failed!\n"); - return ret; - } - if (startCluster != directoryCluster) { - XPRINTF("USBHDFSD: I: file/dir removed from cluster=%u\n", startCluster); - } - return 0; -} - -//--------------------------------------------------------------------------- -//Create a new record that points to the file/directory, before deleting the original one. - -int fat_renameFile(fat_driver *fatd, fat_dir *fatdir, const char *fname) -{ - int ret; - unsigned int sDirCluster; - unsigned int dDirCluster, dParentDirCluster; - unsigned char lname[FAT_MAX_NAME], pathToDirent[FAT_MAX_PATH]; - unsigned int sfnSector, sfnOffset, new_sfnSector, new_sfnOffset; - int directory; - unsigned char sname[12]; //short name 8+3 + terminator - unsigned char *sbuf = NULL; - fat_direntry_sfn OriginalSFN; - - ret = separatePathAndName(fname, pathToDirent, lname); - if ((ret < 0) //if name invalid to separation routine - || ((lname[0] == 0) //or name is empty string - || ((lname[0] == '.') && ((lname[1] == 0) //or name is single period - || ((lname[1] == '.') && (lname[2] == 0) //or name is two periods - ))))) { - XPRINTF("USBHDFSD: E: destination file name not exist or not valid!"); - return -ENOENT; - } - - //Check if the source file exists, and that the new filename is not in use. - sDirCluster = fatdir->parentDirCluster; - dDirCluster = 0; - XPRINTF("USBHDFSD: Calling fat_getFileStartCluster from fat_renameFile\n"); - - ret = fat_getFileStartCluster(fatd, pathToDirent, &dDirCluster, NULL); - if (ret < 0) { - XPRINTF("USBHDFSD: E: destination directory not found! \n"); - return ret; - } - dParentDirCluster = dDirCluster; //Backup dDirCluster, as every call to fat_filleDirentryInfo will update it to point to the scanned file's first cluster. - - sname[0] = 0; - ret = fat_fillDirentryInfo(fatd, lname, sname, -1, &dDirCluster, &new_sfnSector, &new_sfnOffset); - if (ret == 0) { - XPRINTF("USBHDFSD: E: file already exists!\n"); - return -EEXIST; - } - - //Get the SFN sector number and offset, so that the SFN record can be read. - ret = fat_fillDirentryInfo(fatd, fatdir->name, sname, -1, &sDirCluster, &sfnSector, &sfnOffset); - if (ret != 0) { - XPRINTF("USBHDFSD: E: direntry not found! %d\n", ret); - return -ENOENT; - } - - XPRINTF("USBHDFSD: fat_renameFile: dir found at cluster=%u \n ", sDirCluster); - - //Preserve the original SFN entry. - if ((ret = READ_SECTOR(fatd->dev, sfnSector, sbuf)) < 0) { - XPRINTF("USBHDFSD: E: I/O error! %d\n", ret); - return ret; - } - memcpy(&OriginalSFN, (fat_direntry_sfn *)(sbuf + sfnOffset), sizeof(fat_direntry_sfn)); - directory = ((fat_direntry_sfn *)(sbuf + sfnOffset))->attr & FAT_ATTR_DIRECTORY; - - //Insert a new record. - if ((ret = fat_modifyDirSpace(fatd, lname, directory, 0, &dDirCluster, &sfnSector, &sfnOffset, &OriginalSFN)) < 0) { - XPRINTF("USBHDFSD: E: fat_modifyDirSpace failed! %d\n", ret); - return ret; - } - - //Wipe the original entry. - //Fill fatd with a list of the original directory entry records, which can be deleted. - sDirCluster = fatdir->parentDirCluster; - ret = fat_fillDirentryInfo(fatd, fatdir->name, sname, -1, &sDirCluster, &sfnSector, &sfnOffset); - if (ret != 0) { - XPRINTF("USBHDFSD: E: direntry not found! %d\n", ret); - return -ENOENT; - } - - //now mark the original direntries as deleted - ret = fat_wipeDirEntries(fatd); - if (ret < 0) { - XPRINTF("USBHDFSD: E: wipe direntries failed!\n"); - return ret; - } - - fatdir->parentDirCluster = dParentDirCluster; - strcpy(fatdir->name, lname); - - return 0; -} //ends fat_renameFile - -//--------------------------------------------------------------------------- -int fat_writeFile(fat_driver *fatd, fat_dir *fatDir, int *updateClusterIndices, unsigned int filePos, unsigned char *buffer, unsigned int size) -{ - int ret; - int i, j; - int chainSize; - int nextChain; - int startSector; - unsigned int bufSize; - int sectorSkip; - int clusterSkip; - int dataSkip; - - unsigned int bufferPos; - unsigned int fileCluster; - unsigned int clusterPos; - unsigned int endPosFile; - unsigned int endPosCluster; - unsigned int lastCluster; - - int clusterChainStart; - - mass_dev *mass_device = fatd->dev; - - //check wether we have enough clusters allocated - i = fatd->partBpb.clusterSize * fatd->partBpb.sectorSize; //the size (in bytes) of the one cluster - j = fatDir->size / i; - if (fatDir->size % i) { - j++; - } - if (j == 0) - j = 1; //the file have allways at least one cluster allocated - - endPosCluster = j * i; - endPosFile = filePos + size; - - *updateClusterIndices = 0; - - //allocate additional cluster(s) - if (endPosFile > endPosCluster) { - ret = endPosFile - endPosCluster; //additional space needed in bytes - j = ret / i; //additional space needed (given in number of clusters) - if (ret % i) { - j++; - } - lastCluster = fatDir->lastCluster; - XPRINTF("USBHDFSD: I: writeFile: last cluster= %u \n", lastCluster); - - if (lastCluster == 0) - return -ENOSPC; // no more free clusters or data invalid - for (i = 0; i < j; i++) { - lastCluster = fat_getFreeCluster(fatd, lastCluster); - if (lastCluster == 0) - return -ENOSPC; // no more free clusters - } - fatDir->lastCluster = lastCluster; - *updateClusterIndices = j; - fat_invalidateLastChainResult(fatd); //prevent to misuse current (now deleted) fatd->cbuf - - XPRINTF("USBHDFSD: I: writeFile: new clusters allocated = %u new lastCluster=%u \n", j, lastCluster); - } - XPRINTF("USBHDFSD: I: write file: filePos=%d dataSize=%d \n", filePos, size); - - - fat_getClusterAtFilePos(fatd, fatDir, filePos, &fileCluster, &clusterPos); - sectorSkip = (filePos - clusterPos) / fatd->partBpb.sectorSize; - clusterSkip = sectorSkip / fatd->partBpb.clusterSize; - sectorSkip %= fatd->partBpb.clusterSize; - dataSkip = filePos % fatd->partBpb.sectorSize; - bufferPos = 0; - - - XPRINTF("USBHDFSD: fileCluster = %u, clusterPos= %u clusterSkip=%u, sectorSkip=%u dataSkip=%u \n", - fileCluster, clusterPos, clusterSkip, sectorSkip, dataSkip); - - if (fileCluster < 2) { - return -EFAULT; - } - - bufSize = mass_device->sectorSize; - nextChain = 1; - clusterChainStart = 1; - - while (nextChain && size > 0) { - chainSize = fat_getClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, clusterChainStart); - clusterChainStart = 0; - if (chainSize >= MAX_DIR_CLUSTER) { //the chain is full, but more chain parts exist - fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1]; - } else { //chain fits in the chain buffer completely - no next chain needed - nextChain = 0; - } - while (clusterSkip >= MAX_DIR_CLUSTER) { - chainSize = fat_getClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, clusterChainStart); - clusterChainStart = 0; - if (chainSize >= MAX_DIR_CLUSTER) { //the chain is full, but more chain parts exist - fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1]; - } else { //chain fits in the chain buffer completely - no next chain needed - nextChain = 0; - } - clusterSkip -= MAX_DIR_CLUSTER; - } - - //process the cluster chain (fatd->cbuf) and skip leading clusters if needed - for (i = 0 + clusterSkip; i < chainSize && size > 0; i++) { - //read cluster and save cluster content - startSector = fat_cluster2sector(&fatd->partBpb, fatd->cbuf[i]); - //process all sectors of the cluster (and skip leading sectors if needed) - for (j = 0 + sectorSkip; j < fatd->partBpb.clusterSize && size > 0; j++) { - unsigned char *sbuf = NULL; //sector buffer - - //compute exact size of transfered bytes - if (size < bufSize) { - bufSize = size + dataSkip; - } - if (bufSize > mass_device->sectorSize) { - bufSize = mass_device->sectorSize; - } - - /* SP193: By right, the sector's content should be retained if it has already been allocated and is going to be partially written-to. - Since this function wasn't designed to be able to tell allocated sectors from unallocated sectors, assume that all partial writes are to allocated sectors. */ - if ((bufSize - dataSkip) != mass_device->sectorSize) - ret = READ_SECTOR(fatd->dev, startSector + j, sbuf); - else - ret = ALLOC_SECTOR(fatd->dev, startSector + j, sbuf); - if (ret < 0) { - XPRINTF("USBHDFSD: Read sector failed ! sector=%u\n", startSector + j); - return bufferPos; //return number of bytes already written - } - - XPRINTF("USBHDFSD: memcopy dst=%u, src=%u, size=%u bufSize=%u \n", dataSkip, bufferPos, bufSize - dataSkip, bufSize); - memcpy(sbuf + dataSkip, buffer + bufferPos, bufSize - dataSkip); - ret = WRITE_SECTOR(fatd->dev, startSector + j); - if (ret < 0) { - XPRINTF("USBHDFSD: Write sector failed ! sector=%u\n", startSector + j); - return bufferPos; //return number of bytes already written - } - - size -= (bufSize - dataSkip); - bufferPos += (bufSize - dataSkip); - dataSkip = 0; - bufSize = mass_device->sectorSize; - } - sectorSkip = 0; - } - clusterSkip = 0; - } - - return bufferPos; //return number of bytes already written -} - -//--------------------------------------------------------------------------- -int fat_flushSectors(fat_driver *fatd) -{ - FLUSH_SECTORS(fatd->dev); - return (0); -} -//--------------------------------------------------------------------------- -//End of file: fat_write.c -//--------------------------------------------------------------------------- diff --git a/modules/usb/usbhdfsd/fat_write.h b/modules/usb/usbhdfsd/fat_write.h deleted file mode 100644 index a3d3ed692..000000000 --- a/modules/usb/usbhdfsd/fat_write.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _FAT_WRITE_H -#define _FAT_WRITE_H 1 - -unsigned char toUpperChar(unsigned char c); -int fat_createFile(fat_driver *fatd, const unsigned char *fname, char directory, char escapeNotExist, unsigned int *cluster, unsigned int *sfnSector, int *sfnOffset); -int fat_deleteFile(fat_driver *fatd, const unsigned char *fname, char directory); -int fat_truncateFile(fat_driver *fatd, unsigned int cluster, unsigned int sfnSector, int sfnOffset); -int fat_renameFile(fat_driver *fatd, fat_dir *fatdir, const char *fname); -int fat_writeFile(fat_driver *fatd, fat_dir *fatDir, int *updateClusterIndices, unsigned int filePos, unsigned char *buffer, int size); -int fat_updateSfn(fat_driver *fatd, int size, unsigned int sfnSector, int sfnOffset); - -int fat_allocSector(fat_driver *fatd, unsigned int sector, unsigned char **buf); -int fat_writeSector(fat_driver *fatd, unsigned int sector); -int fat_flushSectors(fat_driver *fatd); -#endif /* _FAT_WRITE_H */ diff --git a/modules/usb/usbhdfsd/fs_driver.c b/modules/usb/usbhdfsd/fs_driver.c deleted file mode 100644 index 9edac156b..000000000 --- a/modules/usb/usbhdfsd/fs_driver.c +++ /dev/null @@ -1,865 +0,0 @@ -//--------------------------------------------------------------------------- -//File name: fs_driver.c -//--------------------------------------------------------------------------- -/* - * fat_driver.c - USB Mass storage driver for PS2 - * - * (C) 2004, Marek Olejnik (ole00@post.cz) - * (C) 2004 Hermes (support for sector sizes from 512 to 4096 bytes) - * (C) 2004 raipsu (fs_dopen, fs_dclose, fs_dread, fs_getstat implementation) - * - * FAT filesystem layer - * - * See the file LICENSE included with this distribution for licensing terms. - */ -//--------------------------------------------------------------------------- -#include -#include -#include -#include - -#ifdef WIN32 -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif - -#include -#include "usb-ioctl.h" -#include "usbhd_common.h" -#include "fat_driver.h" -#include "fat_write.h" -#include "fat.h" -#include "mass_stor.h" - -//#define DEBUG //comment out this line when not debugging - -#include "mass_debug.h" - -#define FLUSH_SECTORS fat_flushSectors - -enum FS_FILE_FLAG { - FS_FILE_FLAG_FOLDER = 0, - FS_FILE_FLAG_FILE -}; - -struct fs_dirent -{ //Common structure for both directories and regular files. - //This flag is always 1 for a file, and always 0 for a folder (different typedef) - //Routines that handle both must test it, and then typecast the privdata pointer - //to the type that is appropriate for the given case. (see also fs_dir typedef) - short int file_flag; - short int sizeChange; //flag, used for regular files. Otherwise padding. - fat_dir fatdir; -}; - -typedef struct _fs_rec -{ - struct fs_dirent dirent; - short int sizeChange; //flag - unsigned int filePos; - int mode; //file open mode - unsigned int sfnSector; //short filename sector - write support - int sfnOffset; //short filename offset - write support -} fs_rec; - -typedef struct _fs_dir -{ - struct fs_dirent dirent; - int status; - fat_dir_list fatdlist; - fat_dir current_fatdir; -} fs_dir; - -#define MAX_FILES 16 -static fs_rec fsRec[MAX_FILES]; //file info record - -static void fillStat(iox_stat_t *stat, const fat_dir *fatdir) -{ - stat->mode = FIO_S_IROTH | FIO_S_IXOTH; - if (fatdir->attr & FAT_ATTR_DIRECTORY) { - stat->mode |= FIO_S_IFDIR; - } else { - stat->mode |= FIO_S_IFREG; - } - if (!(fatdir->attr & FAT_ATTR_READONLY)) { - stat->mode |= FIO_S_IWOTH; - } - - stat->size = fatdir->size; - - //set created Date: Day, Month, Year - stat->ctime[4] = fatdir->cdate[0]; - stat->ctime[5] = fatdir->cdate[1]; - stat->ctime[6] = fatdir->cdate[2]; - stat->ctime[7] = fatdir->cdate[3]; - - //set created Time: Hours, Minutes, Seconds - stat->ctime[3] = fatdir->ctime[0]; - stat->ctime[2] = fatdir->ctime[1]; - stat->ctime[1] = fatdir->ctime[2]; - - //set accessed Date: Day, Month, Year - stat->atime[4] = fatdir->adate[0]; - stat->atime[5] = fatdir->adate[1]; - stat->atime[6] = fatdir->adate[2]; - stat->atime[7] = fatdir->adate[3]; - - //set modified Date: Day, Month, Year - stat->mtime[4] = fatdir->mdate[0]; - stat->mtime[5] = fatdir->mdate[1]; - stat->mtime[6] = fatdir->mdate[2]; - stat->mtime[7] = fatdir->mdate[3]; - - //set modified Time: Hours, Minutes, Seconds - stat->mtime[3] = fatdir->mtime[0]; - stat->mtime[2] = fatdir->mtime[1]; - stat->mtime[1] = fatdir->mtime[2]; -} - -/*************************************************************************************/ -/* File IO functions */ -/*************************************************************************************/ - -//--------------------------------------------------------------------------- -static fs_rec *fs_findFreeFileSlot(void) -{ - int i; - for (i = 0; i < MAX_FILES; i++) { - if (fsRec[i].dirent.file_flag < 0) { - return &fsRec[i]; - break; - } - } - return NULL; -} - -//--------------------------------------------------------------------------- -static fs_rec *fs_findFileSlotByCluster(unsigned int startCluster) -{ - int i; - - for (i = 0; i < MAX_FILES; i++) { - if (fsRec[i].dirent.file_flag >= 0 && fsRec[i].dirent.fatdir.startCluster == startCluster) { - return &fsRec[i]; - } - } - return NULL; -} - -//--------------------------------------------------------------------------- -static int _lock_sema_id = -1; - -//--------------------------------------------------------------------------- -static int _fs_init_lock(void) -{ -#ifndef WIN32 - iop_sema_t sp; - - sp.initial = 1; - sp.max = 1; - sp.option = 0; - sp.attr = 0; - if ((_lock_sema_id = CreateSema(&sp)) < 0) { - return (-1); - } -#endif - - return (0); -} - -//--------------------------------------------------------------------------- -static void _fs_lock(void) -{ -#ifndef WIN32 - WaitSema(_lock_sema_id); -#endif -} - -//--------------------------------------------------------------------------- -static void _fs_unlock(void) -{ -#ifndef WIN32 - SignalSema(_lock_sema_id); -#endif -} - -//--------------------------------------------------------------------------- -static void fs_reset(void) -{ - int i; - for (i = 0; i < MAX_FILES; i++) { - fsRec[i].dirent.file_flag = -1; - } -#ifndef WIN32 - if (_lock_sema_id >= 0) { - DeleteSema(_lock_sema_id); - } -#endif - _fs_init_lock(); -} - -//--------------------------------------------------------------------------- -static int fs_inited = 0; - -//--------------------------------------------------------------------------- -static int fs_dummy(void) -{ - return -5; -} - -//--------------------------------------------------------------------------- -static int fs_init(iop_device_t *driver) -{ - if (!fs_inited) { - fs_reset(); - fs_inited = 1; - } - - return 1; -} - -//--------------------------------------------------------------------------- -static int fs_open(iop_file_t *fd, const char *name, int mode, int permissions) -{ - fat_driver *fatd; - fs_rec *rec, *rec2; - int ret; - unsigned int cluster; - char escapeNotExist; - - _fs_lock(); - - XPRINTF("USBHDFSD: fs_open called: %s mode=%X \n", name, mode); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - //check if the slot is free - rec = fs_findFreeFileSlot(); - if (rec == NULL) { - _fs_unlock(); - return -EMFILE; - } - - //find the file - cluster = 0; //allways start from root - XPRINTF("USBHDFSD: Calling fat_getFileStartCluster from fs_open\n"); - ret = fat_getFileStartCluster(fatd, name, &cluster, &rec->dirent.fatdir); - if (ret < 0 && ret != -ENOENT) { - _fs_unlock(); - return ret; - } else { - //File exists. Check if the file is already open - rec2 = fs_findFileSlotByCluster(rec->dirent.fatdir.startCluster); - if (rec2 != NULL) { - if ((mode & O_WRONLY) || //current file is opened for write - (rec2->mode & O_WRONLY)) { //other file is opened for write - _fs_unlock(); - return -EACCES; - } - } - } - - if (mode & O_WRONLY) { //dlanor: corrected bad test condition - cluster = 0; //start from root - - escapeNotExist = 1; - if (mode & O_CREAT) { - XPRINTF("USBHDFSD: FAT I: O_CREAT detected!\n"); - escapeNotExist = 0; - } - - rec->sfnSector = 0; - rec->sfnOffset = 0; - ret = fat_createFile(fatd, name, 0, escapeNotExist, &cluster, &rec->sfnSector, &rec->sfnOffset); - if (ret < 0) { - _fs_unlock(); - return ret; - } - //the file already exist but mode is set to truncate - if (ret == 2 && (mode & O_TRUNC)) { - XPRINTF("USBHDFSD: FAT I: O_TRUNC detected!\n"); - fat_truncateFile(fatd, cluster, rec->sfnSector, rec->sfnOffset); - } - - //find the file - cluster = 0; //allways start from root - XPRINTF("USBHDFSD: Calling fat_getFileStartCluster from fs_open after file creation\n"); - ret = fat_getFileStartCluster(fatd, name, &cluster, &rec->dirent.fatdir); - } - - if (ret < 0) { //At this point, the file should be locatable without any errors. - _fs_unlock(); - return ret; - } - - if ((rec->dirent.fatdir.attr & FAT_ATTR_DIRECTORY) == FAT_ATTR_DIRECTORY) { - // Can't open a directory with fioOpen - _fs_unlock(); - return -EISDIR; - } - - rec->dirent.file_flag = FS_FILE_FLAG_FILE; - rec->mode = mode; - rec->filePos = 0; - rec->sizeChange = 0; - - if ((mode & O_APPEND) && (mode & O_WRONLY)) { - XPRINTF("USBHDFSD: FAT I: O_APPEND detected!\n"); - rec->filePos = rec->dirent.fatdir.size; - } - - //store the slot to user parameters - fd->privdata = rec; - - _fs_unlock(); - return 1; -} - -//--------------------------------------------------------------------------- -static int fs_close(iop_file_t *fd) -{ - fat_driver *fatd; - fs_rec *rec = (fs_rec *)fd->privdata; - - if (rec == NULL) - return -EBADF; - - _fs_lock(); - - if (rec->dirent.file_flag != FS_FILE_FLAG_FILE) { - _fs_unlock(); - return -EISDIR; - } - - rec->dirent.file_flag = -1; - fd->privdata = NULL; - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - if ((rec->mode & O_WRONLY)) { - //update direntry size and time - if (rec->sizeChange) { - fat_updateSfn(fatd, rec->dirent.fatdir.size, rec->sfnSector, rec->sfnOffset); - } - - FLUSH_SECTORS(fatd); - } - - _fs_unlock(); - return 0; -} - -//--------------------------------------------------------------------------- -static int fs_lseek(iop_file_t *fd, int offset, int whence) -{ - fat_driver *fatd; - fs_rec *rec = (fs_rec *)fd->privdata; - - if (rec == NULL) - return -EBADF; - - _fs_lock(); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - if (rec->dirent.file_flag != FS_FILE_FLAG_FILE) { - _fs_unlock(); - return -EISDIR; - } - - switch (whence) { - case SEEK_SET: - rec->filePos = offset; - break; - case SEEK_CUR: - rec->filePos += offset; - break; - case SEEK_END: - rec->filePos = rec->dirent.fatdir.size + offset; - break; - default: - _fs_unlock(); - return -1; - } - if (rec->filePos < 0) { - rec->filePos = 0; - } - if (rec->filePos > rec->dirent.fatdir.size) { - rec->filePos = rec->dirent.fatdir.size; - } - - _fs_unlock(); - return rec->filePos; -} - -//--------------------------------------------------------------------------- -static int fs_write(iop_file_t *fd, void *buffer, int size) -{ - fat_driver *fatd; - fs_rec *rec = (fs_rec *)fd->privdata; - int result; - int updateClusterIndices = 0; - - if (rec == NULL) - return -EBADF; - - _fs_lock(); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - if (rec->dirent.file_flag != FS_FILE_FLAG_FILE) { - _fs_unlock(); - return -EISDIR; - } - - if (!(rec->mode & O_WRONLY)) { - _fs_unlock(); - return -EACCES; - } - - if (size <= 0) { - _fs_unlock(); - return 0; - } - - result = fat_writeFile(fatd, &rec->dirent.fatdir, &updateClusterIndices, rec->filePos, (unsigned char *)buffer, size); - if (result > 0) { //write succesful - rec->filePos += result; - if (rec->filePos > rec->dirent.fatdir.size) { - rec->dirent.fatdir.size = rec->filePos; - rec->sizeChange = 1; - //if new clusters allocated - then update file cluster indices - if (updateClusterIndices) { - fat_setFatDirChain(fatd, &rec->dirent.fatdir); - } - } - } - - _fs_unlock(); - return result; -} - -//--------------------------------------------------------------------------- -static int fs_read(iop_file_t *fd, void *buffer, int size) -{ - fat_driver *fatd; - fs_rec *rec = (fs_rec *)fd->privdata; - int result; - - if (rec == NULL) - return -EBADF; - - _fs_lock(); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - if (rec->dirent.file_flag != FS_FILE_FLAG_FILE) { - _fs_unlock(); - return -EISDIR; - } - - if (!(rec->mode & O_RDONLY)) { - _fs_unlock(); - return -EACCES; - } - - if (size <= 0) { - _fs_unlock(); - return 0; - } - - if ((rec->filePos + size) > rec->dirent.fatdir.size) { - size = rec->dirent.fatdir.size - rec->filePos; - } - - result = fat_readFile(fatd, &rec->dirent.fatdir, rec->filePos, (unsigned char *)buffer, size); - if (result > 0) { //read succesful - rec->filePos += result; - } - - _fs_unlock(); - return result; -} - -//--------------------------------------------------------------------------- -static int fs_remove(iop_file_t *fd, const char *name) -{ - fat_driver *fatd; - fs_rec *rec; - int result; - unsigned int cluster; - fat_dir fatdir; - - _fs_lock(); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - result = -ENODEV; - _fs_unlock(); - return result; - } - - cluster = 0; //allways start from root - XPRINTF("USBHDFSD: Calling fat_getFileStartCluster from fs_remove\n"); - result = fat_getFileStartCluster(fatd, name, &cluster, &fatdir); - if (result < 0) { - _fs_unlock(); - return result; - } - - rec = fs_findFileSlotByCluster(fatdir.startCluster); - - //file is opened - can't delete the file - if (rec != NULL) { - result = -EINVAL; - _fs_unlock(); - return result; - } - - result = fat_deleteFile(fatd, name, 0); - FLUSH_SECTORS(fatd); - - _fs_unlock(); - return result; -} - -//--------------------------------------------------------------------------- -static int fs_mkdir(iop_file_t *fd, const char *name, int permissions) -{ - fat_driver *fatd; - int ret; - int sfnOffset; - unsigned int sfnSector; - unsigned int cluster; - - _fs_lock(); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - XPRINTF("USBHDFSD: fs_mkdir: name=%s \n", name); - ret = fat_createFile(fatd, name, 1, 0, &cluster, &sfnSector, &sfnOffset); - - //directory of the same name already exist - if (ret == 2) { - ret = -EEXIST; - } - FLUSH_SECTORS(fatd); - - _fs_unlock(); - return ret; -} - -//--------------------------------------------------------------------------- -static int fs_rmdir(iop_file_t *fd, const char *name) -{ - fat_driver *fatd; - int ret; - - _fs_lock(); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - ret = fat_deleteFile(fatd, name, 1); - FLUSH_SECTORS(fatd); - _fs_unlock(); - return ret; -} - -//--------------------------------------------------------------------------- -static int fs_dopen(iop_file_t *fd, const char *name) -{ - fat_driver *fatd; - int is_root = 0; - fs_dir *rec; - - _fs_lock(); - - XPRINTF("USBHDFSD: fs_dopen called: unit %d name %s\n", fd->unit, name); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - if (((name[0] == '/') && (name[1] == '\0')) || ((name[0] == '/') && (name[1] == '.') && (name[2] == '\0'))) { - name = "/"; - is_root = 1; - } - - fd->privdata = malloc(sizeof(fs_dir)); - memset(fd->privdata, 0, sizeof(fs_dir)); //NB: also implies "file_flag = FS_FILE_FLAG_FOLDER;" - rec = (fs_dir *)fd->privdata; - - rec->status = fat_getFirstDirentry(fatd, (char *)name, &rec->fatdlist, &rec->dirent.fatdir, &rec->current_fatdir); - - // root directory may have no entries, nothing else may. - if (rec->status == 0 && !is_root) - rec->status = -EFAULT; - - if (rec->status < 0) - free(fd->privdata); - - _fs_unlock(); - return rec->status; -} - -//--------------------------------------------------------------------------- -static int fs_dclose(iop_file_t *fd) -{ - fs_dir *rec = (fs_dir *)fd->privdata; - - if (fd->privdata == NULL) - return -EBADF; - - _fs_lock(); - XPRINTF("USBHDFSD: fs_dclose called: unit %d\n", fd->unit); - if (rec->dirent.file_flag != FS_FILE_FLAG_FOLDER) { - _fs_unlock(); - return -ENOTDIR; - } - - free(fd->privdata); - fd->privdata = NULL; - _fs_unlock(); - return 0; -} - -//--------------------------------------------------------------------------- -static int fs_dread(iop_file_t *fd, iox_dirent_t *buffer) -{ - fat_driver *fatd; - int ret; - fs_dir *rec = (fs_dir *)fd->privdata; - - if (rec == NULL) - return -EBADF; - - _fs_lock(); - - XPRINTF("USBHDFSD: fs_dread called: unit %d\n", fd->unit); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - if (rec->dirent.file_flag != FS_FILE_FLAG_FOLDER) { - _fs_unlock(); - return -ENOTDIR; - } - - while (rec->status > 0 && (rec->current_fatdir.attr & FAT_ATTR_VOLUME_LABEL || ((rec->current_fatdir.attr & (FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM)) == (FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM)))) - rec->status = fat_getNextDirentry(fatd, &rec->fatdlist, &rec->current_fatdir); - - ret = rec->status; - if (rec->status >= 0) { - memset(buffer, 0, sizeof(iox_dirent_t)); - fillStat(&buffer->stat, &rec->current_fatdir); - strcpy(buffer->name, rec->current_fatdir.name); - } - - if (rec->status > 0) - rec->status = fat_getNextDirentry(fatd, &rec->fatdlist, &rec->current_fatdir); - - _fs_unlock(); - return ret; -} - -//--------------------------------------------------------------------------- -static int fs_getstat(iop_file_t *fd, const char *name, iox_stat_t *stat) -{ - fat_driver *fatd; - int ret; - unsigned int cluster = 0; - fat_dir fatdir; - - _fs_lock(); - - XPRINTF("USBHDFSD: fs_getstat called: unit %d name %s\n", fd->unit, name); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - XPRINTF("USBHDFSD: Calling fat_getFileStartCluster from fs_getstat\n"); - ret = fat_getFileStartCluster(fatd, name, &cluster, &fatdir); - if (ret < 0) { - _fs_unlock(); - return ret; - } - - memset(stat, 0, sizeof(iox_stat_t)); - fillStat(stat, &fatdir); - - _fs_unlock(); - return 0; -} - -//--------------------------------------------------------------------------- - -int fs_ioctl(iop_file_t *fd, int cmd, void *data) -{ - fat_driver *fatd; - struct fs_dirent *dirent = (struct fs_dirent *)fd->privdata; //Remember to re-cast this to the right structure (either fs_rec or fs_dir)! - int ret; - - if (dirent == NULL) - return -EBADF; - - _fs_lock(); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - switch (cmd) { - case USBMASS_IOCTL_RENAME: - ret = fat_renameFile(fatd, &dirent->fatdir, data); //No need to re-cast since this inner structure is a common one. - FLUSH_SECTORS(fatd); - break; - case USBHDFSD_IOCTL_GETSECTOR: - ret = fat_cluster2sector(&fatd->partBpb, ((fs_rec *)fd->privdata)->dirent.fatdir.chain[0].cluster); - break; - case USBHDFSD_IOCTL_CHECKCHAIN: - ret = fat_CheckChain(fatd, &((fs_dir *)fd->privdata)->dirent.fatdir); - break; - default: - ret = fs_dummy(); - } - - _fs_unlock(); - return ret; -} - -int fs_rename(iop_file_t *fd, const char *path, const char *newpath) -{ - fat_dir fatdir; - fat_driver *fatd; - fs_rec *rec = NULL; - unsigned int cluster; - struct fs_dirent *dirent = (struct fs_dirent *)fd->privdata; - int ret; - - if (dirent == NULL) - return -EBADF; - - _fs_lock(); - - fatd = fat_getData(fd->unit); - if (fatd == NULL) { - _fs_unlock(); - return -ENODEV; - } - - //find the file - cluster = 0; //allways start from root - XPRINTF("USBHDFSD: Calling fat_getFileStartCluster from fs_rename\n"); - ret = fat_getFileStartCluster(fatd, path, &cluster, &fatdir); - if (ret < 0 && ret != -ENOENT) { - _fs_unlock(); - return ret; - } else { - //File exists. Check if the file is already open - rec = fs_findFileSlotByCluster(fatdir.startCluster); - if (rec != NULL) { - _fs_unlock(); - return -EACCES; - } - } - - ret = fat_renameFile(fatd, &fatdir, newpath); - FLUSH_SECTORS(fatd); - - _fs_unlock(); - return ret; -} - -#ifndef WIN32 -static iop_device_ops_t fs_functarray = { - &fs_init, - (void *)&fs_dummy, - (void *)&fs_dummy, - &fs_open, - &fs_close, - &fs_read, - &fs_write, - &fs_lseek, - &fs_ioctl, - &fs_remove, - &fs_mkdir, - &fs_rmdir, - &fs_dopen, - &fs_dclose, - &fs_dread, - &fs_getstat, - (void *)&fs_dummy, - &fs_rename, - (void *)&fs_dummy, - (void *)&fs_dummy, - (void *)&fs_dummy, - (void *)&fs_dummy, - (void *)&fs_dummy, - (void *)&fs_dummy, - (void *)&fs_dummy, - (void *)&fs_dummy, - (void *)&fs_dummy}; - -static iop_device_t fs_driver = { - "mass", - IOP_DT_FS | IOP_DT_FSEXT, - 2, - "USB mass storage driver", - &fs_functarray}; - -/* init file system driver */ -int InitFS(void) -{ - DelDrv("mass"); - return (AddDrv(&fs_driver) == 0 ? 0 : -1); -} -#endif - -//--------------------------------------------------------------------------- -//End of file: fs_driver.c -//--------------------------------------------------------------------------- diff --git a/modules/usb/usbhdfsd/imports.lst b/modules/usb/usbhdfsd/imports.lst deleted file mode 100644 index 51a0704e5..000000000 --- a/modules/usb/usbhdfsd/imports.lst +++ /dev/null @@ -1,55 +0,0 @@ -cdvdman_IMPORTS_start -I_sceCdReadClock -cdvdman_IMPORTS_end - -intrman_IMPORTS_start -I_CpuSuspendIntr -I_CpuResumeIntr -intrman_IMPORTS_end - -loadcore_IMPORTS_start -I_RegisterLibraryEntries -loadcore_IMPORTS_end - -stdio_IMPORTS_start -I_printf -stdio_IMPORTS_end - -sysclib_IMPORTS_start -I_memset -I_memcmp -I_memcpy -I_strlen -I_strcpy -I_strncpy -I_strtol -I_strrchr -I_sprintf -sysclib_IMPORTS_end - -thsemap_IMPORTS_start -I_CreateSema -I_SignalSema -I_WaitSema -I_DeleteSema -thsemap_IMPORTS_end - -sysmem_IMPORTS_start -I_AllocSysMemory -I_FreeSysMemory -sysmem_IMPORTS_end - -iomanX_IMPORTS_start -I_AddDrv -I_DelDrv -iomanX_IMPORTS_end - -usbd_IMPORTS_start -I_UsbGetDeviceStaticDescriptor -I_UsbOpenEndpoint -I_UsbOpenEndpointAligned -I_UsbCloseEndpoint -I_UsbSetDevicePrivateData -I_UsbTransfer -I_UsbRegisterDriver -usbd_IMPORTS_end diff --git a/modules/usb/usbhdfsd/irx_imports.h b/modules/usb/usbhdfsd/irx_imports.h deleted file mode 100644 index aa8a6c632..000000000 --- a/modules/usb/usbhdfsd/irx_imports.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * irx_imports.h - Defines all IRX imports. - * - * Copyright (c) 2003 Marcus R. Brown - * - * See the file LICENSE included with this distribution for licensing terms. - */ - -#ifndef IOP_IRX_IMPORTS_H -#define IOP_IRX_IMPORTS_H - -#include - -/* Please keep these in alphabetical order! */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/usb/usbhdfsd/mass_debug.h b/modules/usb/usbhdfsd/mass_debug.h deleted file mode 100644 index b1590c10a..000000000 --- a/modules/usb/usbhdfsd/mass_debug.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _MASS_DEBUG_H -#define _MASS_DEBUG_H 1 - -#ifdef DEBUG -#define XPRINTF(args...) printf(args) -#else -#define XPRINTF(args...) -#endif - -#endif /* _MASS_DEBUG_H */ diff --git a/modules/usb/usbhdfsd/mass_stor.h b/modules/usb/usbhdfsd/mass_stor.h deleted file mode 100644 index e8e6e65c2..000000000 --- a/modules/usb/usbhdfsd/mass_stor.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _MASS_STOR_H -#define _MASS_STOR_H 1 - -struct _mass_dev -{ - int controlEp; //config endpoint id - int bulkEpI; //in endpoint id - int bulkEpO; //out endpoint id - int devId; //device id - unsigned char configId; //configuration id - unsigned char status; - unsigned char interfaceNumber; //interface number - unsigned char interfaceAlt; //interface alternate setting - unsigned int sectorSize; // = 512; // store size of sector from usb mass - unsigned int maxLBA; - int ioSema; - cache_set *cache; - usbmass_cb_t callback; -}; - -int InitUSB(void); -int mass_stor_disconnect(int devId); -int mass_stor_connect(int devId); -int mass_stor_probe(int devId); -int mass_stor_readSector(mass_dev *mass_device, unsigned int sector, unsigned char *buffer, unsigned short int count); -int mass_stor_writeSector(mass_dev *mass_device, unsigned int sector, const unsigned char *buffer, unsigned short int count); -int mass_stor_configureNextDevice(void); - -#endif diff --git a/modules/usb/usbhdfsd/part_driver.c b/modules/usb/usbhdfsd/part_driver.c deleted file mode 100644 index 2ee5d76b7..000000000 --- a/modules/usb/usbhdfsd/part_driver.c +++ /dev/null @@ -1,128 +0,0 @@ -//--------------------------------------------------------------------------- -//File name: part_driver.c -//--------------------------------------------------------------------------- -#include -#include - -#include -#include "usbhd_common.h" -#include "scache.h" -#include "part_driver.h" -#include "mass_stor.h" -#include "fat_driver.h" - -//#define DEBUG //comment out this line when not debugging - -#include "mass_debug.h" - -#define READ_SECTOR(d, a, b) scache_readSector((d)->cache, (a), (void **)&b) - -typedef struct _part_record -{ - unsigned char sid; //system id- 4=16bit FAT (16bit sector numbers) - // 5=extended partition - // 6=16bit FAT (32bit sector numbers) - unsigned int start; // start sector of the partition - unsigned int count; // length of the partititon (total number of sectors) -} part_record; - -typedef struct _part_table -{ - part_record record[4]; //maximum of 4 primary partitions -} part_table; - -typedef struct _part_raw_record -{ - unsigned char active; //Set to 80h if this partition is active / bootable - unsigned char startH; //Partition's starting head. - unsigned char startST[2]; //Partition's starting sector and track. - unsigned char sid; //Partition's system ID number. - unsigned char endH; //Partition's ending head. - unsigned char endST[2]; //Partition's ending sector and track. - unsigned char startLBA[4]; //Starting LBA (sector) - unsigned char size[4]; //Partition size in sectors. -} part_raw_record; - -//--------------------------------------------------------------------------- -static USBHD_INLINE void part_getPartitionRecord(part_raw_record *raw, part_record *rec) -{ - rec->sid = raw->sid; - rec->start = getI32(raw->startLBA); - rec->count = getI32(raw->size); -} - -//--------------------------------------------------------------------------- -static int part_getPartitionTable(mass_dev *dev, part_table *part) -{ - part_raw_record *part_raw; - int ret; - unsigned int i; - unsigned char *sbuf; - - ret = READ_SECTOR(dev, 0, sbuf); // read sector 0 - Disk MBR or boot sector - if (ret < 0) { - XPRINTF("USBHDFSD: part_getPartitionTable read failed %d!\n", ret); - return -EIO; - } - - printf("USBHDFSD: boot signature %X %X\n", sbuf[0x1FE], sbuf[0x1FF]); - if (sbuf[0x1FE] == 0x55 && sbuf[0x1FF] == 0xAA) { - for (i = 0; i < 4; i++) { - part_raw = (part_raw_record *)(sbuf + 0x01BE + (i * 16)); - part_getPartitionRecord(part_raw, &part->record[i]); - } - return 4; - } else { - for (i = 0; i < 4; i++) { - part->record[i].sid = 0; - ; - } - return 0; - } -} - -//--------------------------------------------------------------------------- -int part_connect(mass_dev *dev) -{ - part_table partTable; - unsigned int count = 0, i; - XPRINTF("USBHDFSD: part_connect devId %i \n", dev->devId); - - if (part_getPartitionTable(dev, &partTable) < 0) - return -1; - - for (i = 0; i < 4; i++) { - if ( - partTable.record[i].sid == 6 || - partTable.record[i].sid == 4 || - partTable.record[i].sid == 1 || // fat 16, fat 12 - partTable.record[i].sid == 0x0B || - partTable.record[i].sid == 0x0C || // fat 32 - partTable.record[i].sid == 0x0E) // fat 16 LBA - { - XPRINTF("USBHDFSD: mount partition %d\n", i); - if (fat_mount(dev, partTable.record[i].start, partTable.record[i].count) >= 0) - count++; - } - } - - if (count == 0) { // no partition table detected - // try to use "floppy" option - XPRINTF("USBHDFSD: mount drive\n"); - if (fat_mount(dev, 0, dev->maxLBA) < 0) - return -1; - } - - return 0; -} - -//--------------------------------------------------------------------------- -void part_disconnect(mass_dev *dev) -{ - printf("USBHDFSD: part_disconnect devId %i \n", dev->devId); - fat_forceUnmount(dev); -} - -//--------------------------------------------------------------------------- -//End of file: part_driver.c -//--------------------------------------------------------------------------- diff --git a/modules/usb/usbhdfsd/part_driver.h b/modules/usb/usbhdfsd/part_driver.h deleted file mode 100644 index 876989a0d..000000000 --- a/modules/usb/usbhdfsd/part_driver.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _PART_DRIVER_H -#define _PART_DRIVER_H 1 - -int part_connect(mass_dev *dev); -void part_disconnect(mass_dev *dev); - -#endif diff --git a/modules/usb/usbhdfsd/scache.c b/modules/usb/usbhdfsd/scache.c deleted file mode 100644 index 30f4dc2c8..000000000 --- a/modules/usb/usbhdfsd/scache.c +++ /dev/null @@ -1,362 +0,0 @@ -//--------------------------------------------------------------------------- -//File name: scache.c -//--------------------------------------------------------------------------- -/* - * scache.c - USB Mass storage driver for PS2 - * - * (C) 2004, Marek Olejnik (ole00@post.cz) - * (C) 2004 Hermes (support for sector sizes from 512 to 4096 bytes) - * - * Sector cache - * - * See the file LICENSE included with this distribution for licensing terms. - */ -//--------------------------------------------------------------------------- -#include - -#ifdef WIN32 -#include -#include -#include -#include -#else -#include -#include -#endif - -//#define SCACHE_RECORD_STATS 1 - -#include -#include "usbhd_common.h" -#include "mass_stor.h" - -//--------------------------------------------------------------------------- -#define READ_SECTOR mass_stor_readSector -#define WRITE_SECTOR mass_stor_writeSector - -//#define DEBUG //comment out this line when not debugging - -#include "mass_debug.h" - -#define BLOCK_SIZE 4096 - -//number of cache slots (1 slot = block) -#define CACHE_SIZE 32 - -//when the flushCounter reaches FLUSH_TRIGGER then flushSectors is called -//#define FLUSH_TRIGGER 16 - -typedef struct _cache_record -{ - unsigned int sector; - int tax; - char writeDirty; -} cache_record; - -struct _cache_set -{ - mass_dev *dev; - unsigned int sectorSize; - unsigned int indexLimit; - unsigned char *sectorBuf; // = NULL; //sector content - the cache buffer - cache_record rec[CACHE_SIZE]; //cache info record - -#ifdef SCACHE_RECORD_STATS - //statistical information - unsigned int cacheAccess; - unsigned int cacheHits; -#endif - unsigned int writeFlag; -}; - -//--------------------------------------------------------------------------- -static void initRecords(cache_set *cache) -{ - unsigned int i; - - for (i = 0; i < CACHE_SIZE; i++) { - cache->rec[i].sector = 0xFFFFFFF0; - cache->rec[i].tax = 0; - cache->rec[i].writeDirty = 0; - } - - cache->writeFlag = 0; -} - -//--------------------------------------------------------------------------- -/* search cache records for the sector number stored in cache - returns cache record (slot) number - */ -static int getSlot(cache_set *cache, unsigned int sector) -{ - int i; - - for (i = 0; i < CACHE_SIZE; i++) { - if (sector >= cache->rec[i].sector && sector < (cache->rec[i].sector + cache->indexLimit)) { - return i; - } - } - return -1; -} - -//--------------------------------------------------------------------------- -/* search cache records for the sector number stored in cache */ -static int getIndexRead(cache_set *cache, unsigned int sector) -{ - unsigned int i; - int index = -1; - - for (i = 0; i < CACHE_SIZE; i++) { - if (sector >= cache->rec[i].sector && sector < (cache->rec[i].sector + cache->indexLimit)) { - if (cache->rec[i].tax < 0) - cache->rec[i].tax = 0; - cache->rec[i].tax += 2; - index = i; - } - cache->rec[i].tax--; //apply tax penalty - } - if (index < 0) - return index; - else - return ((index * cache->indexLimit) + (sector - cache->rec[index].sector)); -} - -//--------------------------------------------------------------------------- -/* select the best record where to store new sector */ -static int getIndexWrite(cache_set *cache, unsigned int sector) -{ - int ret; - unsigned int minTax = 0x0FFFFFFF; - unsigned int i, index = 0; - - for (i = 0; i < CACHE_SIZE; i++) { - if (cache->rec[i].tax < minTax) { - index = i; - minTax = cache->rec[i].tax; - } - } - - //this sector is dirty - we need to flush it first - if (cache->rec[index].writeDirty) { - XPRINTF("scache: getIndexWrite: sector is dirty : %u index=%d \n", cache->rec[index].sector, index); - ret = WRITE_SECTOR(cache->dev, cache->rec[index].sector, cache->sectorBuf + (index * BLOCK_SIZE), BLOCK_SIZE / cache->sectorSize); - if (ret < 0) { - printf("scache: ERROR writing sector to disk! sector=%u\n", sector); - return ret; - } - - cache->rec[index].writeDirty = 0; - } - cache->rec[index].tax += 2; - cache->rec[index].sector = sector; - - return index * cache->indexLimit; -} - -//--------------------------------------------------------------------------- -/* - flush dirty sectors - */ -int scache_flushSectors(cache_set *cache) -{ - unsigned int i; - int counter = 0, ret; - - XPRINTF("cache: flushSectors devId = %i \n", cache->dev->devId); - - XPRINTF("scache: flushSectors writeFlag=%d\n", cache->writeFlag); - //no write operation occured since last flush - if (cache->writeFlag == 0) { - return 0; - } - - for (i = 0; i < CACHE_SIZE; i++) { - if (cache->rec[i].writeDirty) { - XPRINTF("scache: flushSectors dirty index=%d sector=%u \n", i, cache->rec[i].sector); - ret = WRITE_SECTOR(cache->dev, cache->rec[i].sector, cache->sectorBuf + (i * BLOCK_SIZE), BLOCK_SIZE / cache->sectorSize); - if (ret < 0) { - printf("scache: ERROR writing sector to disk! sector=%u\n", cache->rec[i].sector); - return ret; - } - - cache->rec[i].writeDirty = 0; - counter++; - } - } - cache->writeFlag = 0; - return counter; -} - -//--------------------------------------------------------------------------- -int scache_readSector(cache_set *cache, unsigned int sector, void **buf) -{ - int index; //index is given in single sectors not octal sectors - int ret; - unsigned int alignedSector; - - XPRINTF("cache: readSector devId = %i %p sector = %u \n", cache->dev->devId, cache, sector); - if (cache == NULL) { - printf("cache: devId cache not created = %i \n", cache->dev->devId); - return -1; - } - -#ifdef SCACHE_RECORD_STATS - cache->cacheAccess++; -#endif - index = getIndexRead(cache, sector); - XPRINTF("cache: indexRead=%i \n", index); - if (index >= 0) { //sector found in cache -#ifdef SCACHE_RECORD_STATS - cache->cacheHits++; -#endif - *buf = cache->sectorBuf + (index * cache->sectorSize); - XPRINTF("cache: hit and done reading sector \n"); - - return cache->sectorSize; - } - - //compute alignedSector - to prevent storage of duplicit sectors in slots - alignedSector = (sector / cache->indexLimit) * cache->indexLimit; - index = getIndexWrite(cache, alignedSector); - XPRINTF("cache: indexWrite=%i slot=%d alignedSector=%u\n", index, index / cache->indexLimit, alignedSector); - ret = READ_SECTOR(cache->dev, alignedSector, cache->sectorBuf + (index * cache->sectorSize), BLOCK_SIZE / cache->sectorSize); - - if (ret < 0) { - printf("scache: ERROR reading sector from disk! sector=%u\n", alignedSector); - return ret; - } - *buf = cache->sectorBuf + (index * cache->sectorSize) + ((sector % cache->indexLimit) * cache->sectorSize); - XPRINTF("cache: done reading physical sector \n"); - - //write precaution - //cache->flushCounter++; - //if (cache->flushCounter == FLUSH_TRIGGER) { - //scache_flushSectors(cache); - //} - - return cache->sectorSize; -} - - -//--------------------------------------------------------------------------- -int scache_allocSector(cache_set *cache, unsigned int sector, void **buf) -{ - int index; //index is given in single sectors not octal sectors - //int ret; - unsigned int alignedSector; - - XPRINTF("cache: allocSector devId = %i sector = %u \n", cache->dev->devId, sector); - - index = getIndexRead(cache, sector); - XPRINTF("cache: indexRead=%i \n", index); - if (index >= 0) { //sector found in cache - *buf = cache->sectorBuf + (index * cache->sectorSize); - XPRINTF("cache: hit and done allocating sector \n"); - return cache->sectorSize; - } - - //compute alignedSector - to prevent storage of duplicit sectors in slots - alignedSector = (sector / cache->indexLimit) * cache->indexLimit; - index = getIndexWrite(cache, alignedSector); - XPRINTF("cache: indexWrite=%i \n", index); - *buf = cache->sectorBuf + (index * cache->sectorSize) + ((sector % cache->indexLimit) * cache->sectorSize); - XPRINTF("cache: done allocating sector\n"); - return cache->sectorSize; -} - -//--------------------------------------------------------------------------- -int scache_writeSector(cache_set *cache, unsigned int sector) -{ - int index; //index is given in single sectors not octal sectors - //int ret; - - XPRINTF("cache: writeSector devId = %i sector = %u \n", cache->dev->devId, sector); - - index = getSlot(cache, sector); - if (index < 0) { //sector not found in cache - printf("cache: writeSector: ERROR! the sector is not allocated! \n"); - return -1; - } - XPRINTF("cache: slotFound=%i \n", index); - - //prefere written sectors to stay in cache longer than read sectors - cache->rec[index].tax += 2; - - //set dirty status - cache->rec[index].writeDirty = 1; - cache->writeFlag++; - - XPRINTF("cache: done soft writing sector \n"); - - //write precaution - //cache->flushCounter++; - //if (cache->flushCounter == FLUSH_TRIGGER) { - //scache_flushSectors(devId); - //} - - return cache->sectorSize; -} - -//--------------------------------------------------------------------------- -cache_set *scache_init(mass_dev *dev, int sectSize) -{ - cache_set *cache; - XPRINTF("cache: init devId = %i sectSize = %u \n", dev->devId, sectSize); - - cache = malloc(sizeof(cache_set)); - if (cache == NULL) { - printf("scache init! Sector cache: can't alloate cache!\n"); - return NULL; - } - - XPRINTF("scache init! \n"); - cache->dev = dev; - - cache->sectorBuf = (unsigned char *)malloc(BLOCK_SIZE * CACHE_SIZE); - if (cache->sectorBuf == NULL) { - printf("Sector cache: can't alloate memory of size:%d \n", BLOCK_SIZE * CACHE_SIZE); - free(cache); - return NULL; - } - XPRINTF("Sector cache: allocated memory at:%p of size:%d \n", cache->sectorBuf, BLOCK_SIZE * CACHE_SIZE); - - //added by Hermes - cache->sectorSize = sectSize; - cache->indexLimit = BLOCK_SIZE / cache->sectorSize; //number of sectors per 1 cache slot -#ifdef SCACHE_RECORD_STATS - cache->cacheAccess = 0; - cache->cacheHits = 0; -#endif - initRecords(cache); - return cache; -} - -#ifdef SCACHE_RECORD_STATS -//--------------------------------------------------------------------------- -void scache_getStat(cache_set *cache, unsigned int *access, unsigned int *hits) -{ - *access = cache->cacheAccess; - *hits = cache->cacheHits; -} -#endif - -//--------------------------------------------------------------------------- -void scache_kill(cache_set *cache) //dlanor: added for disconnection events (flush impossible) -{ - XPRINTF("cache: kill devId = %i \n", cache->dev->devId); - if (cache->sectorBuf != NULL) { - free(cache->sectorBuf); - cache->sectorBuf = NULL; - } - free(cache); -} -//--------------------------------------------------------------------------- -void scache_close(cache_set *cache) -{ - XPRINTF("cache: close devId = %i \n", cache->dev->devId); - scache_flushSectors(cache); - scache_kill(cache); -} -//--------------------------------------------------------------------------- -//End of file: scache.c -//--------------------------------------------------------------------------- diff --git a/modules/usb/usbhdfsd/scache.h b/modules/usb/usbhdfsd/scache.h deleted file mode 100644 index 133d987af..000000000 --- a/modules/usb/usbhdfsd/scache.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _SCACHE_H -#define _SCACHE_H 1 - -cache_set *scache_init(mass_dev *dev, int sectorSize); -void scache_close(cache_set *cache); -void scache_kill(cache_set *cache); //dlanor: added for disconnection events (flush impossible) -int scache_allocSector(cache_set *cache, unsigned int sector, void **buf); -int scache_readSector(cache_set *cache, unsigned int sector, void **buf); -int scache_writeSector(cache_set *cache, unsigned int sector); -int scache_flushSectors(cache_set *cache); - -void scache_getStat(cache_set *cache, unsigned int *access, unsigned int *hits); - -#endif diff --git a/modules/usb/usbhdfsd/usb_driver.c b/modules/usb/usbhdfsd/usb_driver.c deleted file mode 100644 index fd45ae10a..000000000 --- a/modules/usb/usbhdfsd/usb_driver.c +++ /dev/null @@ -1,1117 +0,0 @@ -/* - * usb_driver.c - USB Mass Storage Driver - * See usbmass-ufi10.pdf and usbmassbulk_10.pdf - */ - -#include -#include -#include -#include -#include -#include - -//#define DEBUG //comment out this line when not debugging - -#include "mass_debug.h" -#include -#include "usbhd_common.h" -#include "mass_stor.h" -#include "scache.h" -#include "part_driver.h" - -#define getBI32(__buf) ((((u8 *)(__buf))[3] << 0) | (((u8 *)(__buf))[2] << 8) | (((u8 *)(__buf))[1] << 16) | (((u8 *)(__buf))[0] << 24)) - -#define USB_SUBCLASS_MASS_RBC 0x01 -#define USB_SUBCLASS_MASS_ATAPI 0x02 -#define USB_SUBCLASS_MASS_QIC 0x03 -#define USB_SUBCLASS_MASS_UFI 0x04 -#define USB_SUBCLASS_MASS_SFF_8070I 0x05 -#define USB_SUBCLASS_MASS_SCSI 0x06 - -#define USB_PROTOCOL_MASS_CBI 0x00 -#define USB_PROTOCOL_MASS_CBI_NO_CCI 0x01 -#define USB_PROTOCOL_MASS_BULK_ONLY 0x50 - -#define TAG_TEST_UNIT_READY 0 -#define TAG_REQUEST_SENSE 3 -#define TAG_INQUIRY 18 -#define TAG_READ_CAPACITY 37 -#define TAG_READ 40 -#define TAG_START_STOP_UNIT 33 -#define TAG_WRITE 42 - -#define USB_BLK_EP_IN 0 -#define USB_BLK_EP_OUT 1 - -#define USB_XFER_MAX_RETRIES 8 -#define USB_IO_MAX_RETRIES 16 - -#define CBW_TAG 0x43425355 -#define CSW_TAG 0x53425355 - -typedef struct _cbw_packet -{ - unsigned int signature; - unsigned int tag; - unsigned int dataTransferLength; - unsigned char flags; //80->data in, 00->out - unsigned char lun; - unsigned char comLength; //command data length - unsigned char comData[16]; //command data -} cbw_packet __attribute__((packed)); - -typedef struct _csw_packet -{ - unsigned int signature; - unsigned int tag; - unsigned int dataResidue; - unsigned char status; -} csw_packet __attribute__((packed)); - -typedef struct _inquiry_data -{ - u8 peripheral_device_type; // 00h - Direct access (Floppy), 1Fh none (no FDD connected) - u8 removable_media; // 80h - removeable - u8 iso_ecma_ansi; - u8 response_data_format; - u8 additional_length; - u8 res[3]; - u8 vendor[8]; - u8 product[16]; - u8 revision[4]; -} inquiry_data __attribute__((packed)); - -typedef struct _sense_data -{ - u8 error_code; - u8 res1; - u8 sense_key; - u8 information[4]; - u8 add_sense_len; - u8 res3[4]; - u8 add_sense_code; - u8 add_sense_qual; - u8 res4[4]; -} sense_data __attribute__((packed)); - -typedef struct _read_capacity_data -{ - u8 last_lba[4]; - u8 block_length[4]; -} read_capacity_data __attribute__((packed)); - -static UsbDriver driver; - -typedef struct _usb_callback_data -{ - int semh; - int returnCode; - int returnSize; -} usb_callback_data; - -#define NUM_DEVICES 2 -static mass_dev g_mass_device[NUM_DEVICES]; - -static void mass_stor_release(mass_dev *dev); - -static void usb_callback(int resultCode, int bytes, void *arg) -{ - usb_callback_data *data = (usb_callback_data *)arg; - data->returnCode = resultCode; - data->returnSize = bytes; - XPRINTF("USBHDFSD: callback: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - SignalSema(data->semh); -} - -static void usb_set_configuration(mass_dev *dev, int configNumber) -{ - int ret; - usb_callback_data cb_data; - - cb_data.semh = dev->ioSema; - - XPRINTF("USBHDFSD: setting configuration controlEp=%i, confNum=%i \n", dev->controlEp, configNumber); - ret = UsbSetDeviceConfiguration(dev->controlEp, configNumber, usb_callback, (void *)&cb_data); - - if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); - ret = cb_data.returnCode; - } - if (ret != USB_RC_OK) { - XPRINTF("USBHDFSD: Error - sending set_configuration %d\n", ret); - } -} - -static void usb_set_interface(mass_dev *dev, int interface, int altSetting) -{ - int ret; - usb_callback_data cb_data; - - cb_data.semh = dev->ioSema; - - XPRINTF("USBHDFSD: setting interface controlEp=%i, interface=%i altSetting=%i\n", dev->controlEp, interface, altSetting); - ret = UsbSetInterface(dev->controlEp, interface, altSetting, usb_callback, (void *)&cb_data); - - if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); - ret = cb_data.returnCode; - } - if (ret != USB_RC_OK) { - XPRINTF("USBHDFSD: Error - sending set_interface %d\n", ret); - } -} - -static int usb_bulk_clear_halt(mass_dev *dev, int endpoint) -{ - int ret; - usb_callback_data cb_data; - - cb_data.semh = dev->ioSema; - - ret = UsbClearEndpointFeature( - dev->controlEp, //Config pipe - 0, //HALT feature - (endpoint == USB_BLK_EP_IN) ? dev->bulkEpI : dev->bulkEpO, - usb_callback, - (void *)&cb_data); - - if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); - ret = cb_data.returnCode; - } - if (ret != USB_RC_OK) { - XPRINTF("USBHDFSD: Error - sending clear halt %d\n", ret); - } - - return ret; -} - -static void usb_bulk_reset(mass_dev *dev, int mode) -{ - int ret; - usb_callback_data cb_data; - - cb_data.semh = dev->ioSema; - - //Call Bulk only mass storage reset - ret = UsbControlTransfer( - dev->controlEp, //default pipe - 0x21, //bulk reset - 0xFF, - 0, - dev->interfaceNumber, //interface number - 0, //length - NULL, //data - usb_callback, - (void *)&cb_data); - - if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); - ret = cb_data.returnCode; - } - if (ret == USB_RC_OK) { - //clear bulk-in endpoint - if (mode & 0x01) - ret = usb_bulk_clear_halt(dev, USB_BLK_EP_IN); - } - if (ret == USB_RC_OK) { - //clear bulk-out endpoint - if (mode & 0x02) - ret = usb_bulk_clear_halt(dev, USB_BLK_EP_OUT); - } - if (ret != USB_RC_OK) { - XPRINTF("USBHDFSD: Error - sending reset %d to device %d.\n", ret, dev->devId); - dev->status |= USBMASS_DEV_STAT_ERR; - } -} - -static int usb_bulk_status(mass_dev *dev, csw_packet *csw, unsigned int tag) -{ - int ret; - usb_callback_data cb_data; - - cb_data.semh = dev->ioSema; - - csw->signature = CSW_TAG; - csw->tag = tag; - csw->dataResidue = 0; - csw->status = 0; - - ret = UsbBulkTransfer( - dev->bulkEpI, //bulk input pipe - csw, //data ptr - 13, //data length - usb_callback, - (void *)&cb_data); - - if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); - ret = cb_data.returnCode; - -#ifdef DEBUG - if (cb_data.returnSize != 13) - printf("USBHDFSD: bulk csw.status returnSize: %i != 13\n", cb_data.returnSize); - if (csw->dataResidue != 0) - printf("USBHDFSD: bulk csw.status residue: %i\n", csw->dataResidue); - XPRINTF("USBHDFSD: bulk csw result: %d, csw.status: %i\n", ret, csw->status); -#endif - } - - return ret; -} - -/* see flow chart in the usbmassbulk_10.pdf doc (page 15) - - Returned values: - <0 Low-level USBD error. - 0 = Command completed successfully. - 1 = Command failed. - 2 = Phase error. -*/ -static int usb_bulk_manage_status(mass_dev *dev, unsigned int tag) -{ - int ret; - csw_packet csw; - - //XPRINTF("USBHDFSD: usb_bulk_manage_status 1 ...\n"); - ret = usb_bulk_status(dev, &csw, tag); /* Attempt to read CSW from bulk in endpoint */ - if (ret != USB_RC_OK) { /* STALL bulk in -OR- Bulk error */ - usb_bulk_clear_halt(dev, USB_BLK_EP_IN); /* clear the stall condition for bulk in */ - - XPRINTF("USBHDFSD: usb_bulk_manage_status error %d ...\n", ret); - ret = usb_bulk_status(dev, &csw, tag); /* Attempt to read CSW from bulk in endpoint */ - } - - /* CSW not valid or stalled or phase error */ - if (ret != USB_RC_OK || csw.signature != CSW_TAG || csw.tag != tag || csw.status == 2) { - printf("USBHDFSD: usb_bulk_manage_status call reset recovery ...\n"); - usb_bulk_reset(dev, 3); /* Perform reset recovery */ - } - - return ((ret == USB_RC_OK && csw.signature == CSW_TAG && csw.tag == tag) ? csw.status : -1); -} - -static int usb_bulk_get_max_lun(mass_dev *dev) -{ - int ret; - usb_callback_data cb_data; - char max_lun; - - cb_data.semh = dev->ioSema; - - //Call Bulk only mass storage reset - ret = UsbControlTransfer( - dev->controlEp, //default pipe - 0xA1, - 0xFE, - 0, - dev->interfaceNumber, //interface number - 1, //length - &max_lun, //data - usb_callback, - (void *)&cb_data); - - if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); - ret = cb_data.returnCode; - } - if (ret == USB_RC_OK) { - ret = max_lun; - } else { - //Devices that do not support multiple LUNs may STALL this command. - usb_bulk_clear_halt(dev, USB_BLK_EP_IN); - usb_bulk_clear_halt(dev, USB_BLK_EP_OUT); - - ret = -ret; - } - - return ret; -} - -static int usb_bulk_command(mass_dev *dev, cbw_packet *packet) -{ - int ret; - usb_callback_data cb_data; - - if (dev->status & USBMASS_DEV_STAT_ERR) { - printf("USBHDFSD: Rejecting I/O to offline device %d.\n", dev->devId); - return -1; - } - - cb_data.semh = dev->ioSema; - - ret = UsbBulkTransfer( - dev->bulkEpO, //bulk output pipe - packet, //data ptr - 31, //data length - usb_callback, - (void *)&cb_data); - - if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); - ret = cb_data.returnCode; - } - if (ret != USB_RC_OK) { - XPRINTF("USBHDFSD: Error - sending bulk command %d. Calling reset recovery.\n", ret); - usb_bulk_reset(dev, 3); - } - - return ret; -} - -static int usb_bulk_transfer(mass_dev *dev, int direction, void *buffer, unsigned int transferSize) -{ - int ret; - unsigned char *buf = (unsigned char *)buffer; - int blockSize = transferSize; - int offset = 0, pipe; - usb_callback_data cb_data; - - cb_data.semh = dev->ioSema; - - pipe = (direction == USB_BLK_EP_IN) ? dev->bulkEpI : dev->bulkEpO; - while (transferSize > 0) { - if (transferSize < blockSize) { - blockSize = transferSize; - } - - ret = UsbBulkTransfer( - pipe, //bulk pipe epI(Read) epO(Write) - (buf + offset), //data ptr - blockSize, //data length - usb_callback, - (void *)&cb_data); - if (ret != USB_RC_OK) { - cb_data.returnCode = ret; - break; - } else { - WaitSema(cb_data.semh); - //XPRINTF("USBHDFSD: retCode=%i retSize=%i \n", cb_data.returnCode, cb_data.returnSize); - if (cb_data.returnCode != USB_RC_OK) { - break; - } - offset += cb_data.returnSize; - transferSize -= cb_data.returnSize; - } - } - - if (cb_data.returnCode != USB_RC_OK) { - XPRINTF("USBHDFSD: Error - bulk data transfer %d. Clearing HALT state.\n", cb_data.returnCode); - usb_bulk_clear_halt(dev, direction); - } - - return cb_data.returnCode; -} - -static inline int cbw_scsi_test_unit_ready(mass_dev *dev) -{ - int result, retries; - static cbw_packet cbw = { - CBW_TAG, // cbw.signature - -TAG_TEST_UNIT_READY, // cbw.tag - 0, // cbw.dataTransferLength - 0x80, // cbw.flags - 0, // cbw.lun - 12, // cbw.comLength - - /* scsi command packet */ - { - 0x00, // test unit ready operation code - 0, // lun/reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - }}; - - XPRINTF("USBHDFSD: cbw_scsi_test_unit_ready\n"); - - for (result = -EIO, retries = USB_XFER_MAX_RETRIES; retries > 0; retries--) { - if (usb_bulk_command(dev, &cbw) == USB_RC_OK) { - if ((result = usb_bulk_manage_status(dev, -TAG_TEST_UNIT_READY)) >= 0) - break; - } - } - - return result; -} - -static inline int cbw_scsi_request_sense(mass_dev *dev, void *buffer, int size) -{ - int rcode, result, retries; - static cbw_packet cbw = { - CBW_TAG, // cbw.signature - -TAG_REQUEST_SENSE, // cbw.tag - 0, // cbw.dataTransferLength - 0x80, // cbw.flags - 0, // cbw.lun - 12, // cbw.comLength - - /* scsi command packet */ - { - 0x03, // request sense operation code - 0, // lun/reserved - 0, // reserved - 0, // reserved - 0, // allocation length - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - }}; - - cbw.dataTransferLength = size; - cbw.comData[4] = size; - - XPRINTF("USBHDFSD: cbw_scsi_request_sense\n"); - - for (retries = USB_XFER_MAX_RETRIES; retries > 0; retries--) { - if (usb_bulk_command(dev, &cbw) == USB_RC_OK) { - rcode = usb_bulk_transfer(dev, USB_BLK_EP_IN, buffer, size); - result = usb_bulk_manage_status(dev, -TAG_REQUEST_SENSE); - - if (rcode == USB_RC_OK && result == 0) - return 0; - } - } - - return -EIO; -} - -static inline int cbw_scsi_inquiry(mass_dev *dev, void *buffer, int size) -{ - int rcode, result, retries; - static cbw_packet cbw = { - CBW_TAG, // cbw.signature - -TAG_INQUIRY, // cbw.tag - 0, // cbw.dataTransferLength - 0x80, // cbw.flags - 0, // cbw.lun - 12, // cbw.comLength - - /* scsi command packet */ - { - 0x12, // inquiry operation code - 0, // lun/reserved - 0, // reserved - 0, // reserved - 0, // inquiry reply length - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - }}; - - XPRINTF("USBHDFSD: cbw_scsi_inquiry\n"); - - cbw.dataTransferLength = size; //INQUIRY_REPLY_LENGTH - cbw.comData[4] = size; //inquiry reply length - - for (retries = USB_XFER_MAX_RETRIES; retries > 0; retries--) { - if (usb_bulk_command(dev, &cbw) == USB_RC_OK) { - rcode = usb_bulk_transfer(dev, USB_BLK_EP_IN, buffer, size); - result = usb_bulk_manage_status(dev, -TAG_INQUIRY); - - if (rcode == USB_RC_OK && result == 0) - return 0; - } - } - - return -EIO; -} - -static inline int cbw_scsi_start_stop_unit(mass_dev *dev) -{ - int result, retries; - static cbw_packet cbw = { - CBW_TAG, // cbw.signature - -TAG_START_STOP_UNIT, // cbw.tag - 0, // cbw.dataTransferLength - 0x80, // cbw.flags - 0, // cbw.lun - 12, // cbw.comLength - - /* scsi command packet */ - { - 0x1B, // start stop unit operation code - 0, // lun/reserved/immed - 0, // reserved - 0, // reserved - 1, // reserved/LoEj/Start "Start the media and acquire the format type" - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - }}; - - XPRINTF("USBHDFSD: cbw_scsi_start_stop_unit\n"); - - for (result = -EIO, retries = USB_XFER_MAX_RETRIES; retries > 0; retries--) { - if (usb_bulk_command(dev, &cbw) == USB_RC_OK) { - if ((result = usb_bulk_manage_status(dev, -TAG_START_STOP_UNIT)) == 0) - break; - } - } - - return result; -} - -static inline int cbw_scsi_read_capacity(mass_dev *dev, void *buffer, int size) -{ - int rcode, result, retries; - static cbw_packet cbw = { - CBW_TAG, // cbw.signature - -TAG_READ_CAPACITY, // cbw.tag - 0, // cbw.dataTransferLength - 0x80, // cbw.flags - 0, // cbw.lun - 12, // cbw.comLength - - /* scsi command packet */ - { - 0x25, // read capacity operation code - 0, // lun/reserved/RelAdr - 0, // LBA 1 - 0, // LBA 2 - 0, // LBA 3 - 0, // LBA 4 - 0, // reserved - 0, // reserved - 0, // reserved/PMI - 0, // reserved - 0, // reserved - 0, // reserved - }}; - - cbw.dataTransferLength = size; - - XPRINTF("USBHDFSD: cbw_scsi_read_capacity\n"); - - for (retries = USB_XFER_MAX_RETRIES; retries > 0; retries--) { - if (usb_bulk_command(dev, &cbw) == USB_RC_OK) { - rcode = usb_bulk_transfer(dev, USB_BLK_EP_IN, buffer, size); - result = usb_bulk_manage_status(dev, -TAG_READ_CAPACITY); - - if (rcode == USB_RC_OK && result == 0) - return 0; - } - } - - return -EIO; -} - -static inline int cbw_scsi_read_sector(mass_dev *dev, unsigned int lba, void *buffer, unsigned short int sectorCount) -{ - int rcode, result; - static cbw_packet cbw = { - CBW_TAG, // cbw.signature - -TAG_READ, // cbw.tag - 0, // cbw.dataTransferLength - 0x80, // cbw.flags - 0, // cbw.lun - 12, // cbw.comLength - - /* scsi command packet */ - { - 0x28, // Operation code - 0, // LUN/DPO/FUA/Reserved/Reldr - 0, // lba 1 (MSB) - 0, // lba 2 - 0, // lba 3 - 0, // lba 4 (LSB) - 0, // reserved - 0, // Transfer length MSB - 0, // Transfer length LSB - 0, // reserved - 0, // reserved - 0, // reserved - }}; - XPRINTF("USBHDFSD: cbw_scsi_read_sector - 0x%08x %p 0x%04x\n", lba, buffer, sectorCount); - - cbw.dataTransferLength = dev->sectorSize * sectorCount; - - //scsi command packet - cbw.comData[2] = (lba & 0xFF000000) >> 24; //lba 1 (MSB) - cbw.comData[3] = (lba & 0xFF0000) >> 16; //lba 2 - cbw.comData[4] = (lba & 0xFF00) >> 8; //lba 3 - cbw.comData[5] = (lba & 0xFF); //lba 4 (LSB) - cbw.comData[7] = (sectorCount & 0xFF00) >> 8; //Transfer length MSB - cbw.comData[8] = (sectorCount & 0xFF); //Transfer length LSB - - result = -EIO; - if (usb_bulk_command(dev, &cbw) == USB_RC_OK) { - rcode = usb_bulk_transfer(dev, USB_BLK_EP_IN, buffer, dev->sectorSize * sectorCount); - result = usb_bulk_manage_status(dev, -TAG_READ); - - if (rcode != USB_RC_OK) - result = -EIO; - } - - return result; -} - -static inline int cbw_scsi_write_sector(mass_dev *dev, unsigned int lba, const void *buffer, unsigned short int sectorCount) -{ - int rcode, result; - static cbw_packet cbw = { - CBW_TAG, // cbw.signature - -TAG_WRITE, // cbw.tag - 0, // cbw.dataTransferLength - 0, // cbw.flags - 0, // cbw.lun - 12, // cbw.comLength - - /* scsi command packet */ - { - 0x2A, //write operation code - 0, //LUN/DPO/FUA/Reserved/Reldr - 0, //lba 1 (MSB) - 0, //lba 2 - 0, //lba 3 - 0, //lba 4 (LSB) - 0, //Reserved - 0, //Transfer length MSB - 0, //Transfer length LSB - 0, //reserved - 0, //reserved - 0, //reserved - }}; - XPRINTF("USBHDFSD: cbw_scsi_write_sector - 0x%08x %p 0x%04x\n", lba, buffer, sectorCount); - - cbw.dataTransferLength = dev->sectorSize * sectorCount; - - //scsi command packet - cbw.comData[2] = (lba & 0xFF000000) >> 24; //lba 1 (MSB) - cbw.comData[3] = (lba & 0xFF0000) >> 16; //lba 2 - cbw.comData[4] = (lba & 0xFF00) >> 8; //lba 3 - cbw.comData[5] = (lba & 0xFF); //lba 4 (LSB) - cbw.comData[7] = (sectorCount & 0xFF00) >> 8; //Transfer length MSB - cbw.comData[8] = (sectorCount & 0xFF); //Transfer length LSB - - result = -EIO; - if (usb_bulk_command(dev, &cbw) == USB_RC_OK) { - rcode = usb_bulk_transfer(dev, USB_BLK_EP_OUT, (void *)buffer, dev->sectorSize * sectorCount); - result = usb_bulk_manage_status(dev, -TAG_WRITE); - - if (rcode != USB_RC_OK) - result = -EIO; - } - - return result; -} - -static mass_dev *mass_stor_findDevice(int devId, int create) -{ - mass_dev *dev = NULL; - int i; - XPRINTF("USBHDFSD: mass_stor_findDevice devId %i\n", devId); - for (i = 0; i < NUM_DEVICES; ++i) { - if (g_mass_device[i].devId == devId) { - XPRINTF("USBHDFSD: mass_stor_findDevice exists %i\n", i); - dev = &g_mass_device[i]; - break; - } else if (create && dev == NULL && g_mass_device[i].devId == -1) { - dev = &g_mass_device[i]; - break; - } - } - return dev; -} - -/* size should be a multiple of sector size */ -int mass_stor_readSector(mass_dev *mass_device, unsigned int sector, unsigned char *buffer, unsigned short int count) -{ - //assert(size % mass_device->sectorSize == 0); - //assert(sector <= mass_device->maxLBA); - int retries; - - for (retries = USB_IO_MAX_RETRIES; retries > 0; retries--) { - if (cbw_scsi_read_sector(mass_device, sector, buffer, count) == 0) { - return count; - } - } - return -EIO; -} - -/* size should be a multiple of sector size */ -int mass_stor_writeSector(mass_dev *mass_device, unsigned int sector, const unsigned char *buffer, unsigned short int count) -{ - //assert(size % mass_device->sectorSize == 0); - //assert(sector <= mass_device->maxLBA); - int retries; - - for (retries = USB_IO_MAX_RETRIES; retries > 0; retries--) { - if (cbw_scsi_write_sector(mass_device, sector, buffer, count) == 0) { - return count; - } - } - return -EIO; -} - -/* test that endpoint is bulk endpoint and if so, update device info */ -static void usb_bulk_probeEndpoint(int devId, mass_dev *dev, UsbEndpointDescriptor *endpoint) -{ - if (endpoint->bmAttributes == USB_ENDPOINT_XFER_BULK) { - /* out transfer */ - if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && dev->bulkEpO < 0) { - dev->bulkEpO = UsbOpenEndpointAligned(devId, endpoint); - XPRINTF("USBHDFSD: register Output endpoint id =%i addr=%02X packetSize=%i\n", dev->bulkEpO, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - } else - /* in transfer */ - if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && dev->bulkEpI < 0) { - dev->bulkEpI = UsbOpenEndpointAligned(devId, endpoint); - XPRINTF("USBHDFSD: register Input endpoint id =%i addr=%02X packetSize=%i\n", dev->bulkEpI, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - } - } -} - -int mass_stor_probe(int devId) -{ - UsbDeviceDescriptor *device = NULL; - UsbConfigDescriptor *config = NULL; - UsbInterfaceDescriptor *intf = NULL; - - XPRINTF("USBHDFSD: probe: devId=%i\n", devId); - - mass_dev *mass_device = mass_stor_findDevice(devId, 0); - - /* only one device supported */ - if ((mass_device != NULL) && (mass_device->status & USBMASS_DEV_STAT_CONN)) { - printf("USBHDFSD: Error - only one mass storage device allowed ! \n"); - return 0; - } - - /* get device descriptor */ - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - if (device == NULL) { - XPRINTF("USBHDFSD: Error - Couldn't get device descriptor\n"); - return 0; - } - - /* Check if the device has at least one configuration */ - if (device->bNumConfigurations < 1) { - return 0; - } - - /* read configuration */ - config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); - if (config == NULL) { - XPRINTF("USBHDFSD: Error - Couldn't get configuration descriptor\n"); - return 0; - } - /* check that at least one interface exists */ - XPRINTF("USBHDFSD: bNumInterfaces %d\n", config->bNumInterfaces); - if ((config->bNumInterfaces < 1) || - (config->wTotalLength < (sizeof(UsbConfigDescriptor) + sizeof(UsbInterfaceDescriptor)))) { - XPRINTF("USBHDFSD: Error - No interfaces available\n"); - return 0; - } - /* get interface */ - intf = (UsbInterfaceDescriptor *)((char *)config + config->bLength); /* Get first interface */ - XPRINTF("USBHDFSD: bInterfaceClass %X bInterfaceSubClass %X bInterfaceProtocol %X\n", - intf->bInterfaceClass, intf->bInterfaceSubClass, intf->bInterfaceProtocol); - - if ((intf->bInterfaceClass != USB_CLASS_MASS_STORAGE) || - (intf->bInterfaceSubClass != USB_SUBCLASS_MASS_SCSI && - intf->bInterfaceSubClass != USB_SUBCLASS_MASS_SFF_8070I) || - (intf->bInterfaceProtocol != USB_PROTOCOL_MASS_BULK_ONLY) || - (intf->bNumEndpoints < 2)) { //one bulk endpoint is not enough because - return 0; //we send the CBW to te bulk out endpoint - } - return 1; -} - -int mass_stor_connect(int devId) -{ - int i; - int epCount; - UsbDeviceDescriptor *device; - UsbConfigDescriptor *config; - UsbInterfaceDescriptor *interface; - UsbEndpointDescriptor *endpoint; - iop_sema_t SemaData; - mass_dev *dev; - - printf("USBHDFSD: connect: devId=%i\n", devId); - dev = mass_stor_findDevice(devId, 1); - - if (dev == NULL) { - printf("USBHDFSD: Error - unable to allocate space!\n"); - return 1; - } - - /* only one mass device allowed */ - if (dev->devId != -1) { - printf("USBHDFSD: Error - only one mass storage device allowed !\n"); - return 1; - } - - dev->status = 0; - dev->sectorSize = 0; - - dev->bulkEpI = -1; - dev->bulkEpO = -1; - - /* open the config endpoint */ - dev->controlEp = UsbOpenEndpoint(devId, NULL); - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - - config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); - - interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); /* Get first interface */ - - // store interface numbers - dev->interfaceNumber = interface->bInterfaceNumber; - dev->interfaceAlt = interface->bAlternateSetting; - - epCount = interface->bNumEndpoints; - endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); - usb_bulk_probeEndpoint(devId, dev, endpoint); - - for (i = 1; i < epCount; i++) { - endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); - usb_bulk_probeEndpoint(devId, dev, endpoint); - } - - // Bail out if we do NOT have enough bulk endpoints. - if (dev->bulkEpI < 0 || dev->bulkEpO < 0) { - mass_stor_release(dev); - printf("USBHDFSD: Error - connect failed: not enough bulk endpoints! \n"); - return -1; - } - - SemaData.initial = 0; - SemaData.max = 1; - SemaData.option = 0; - SemaData.attr = 0; - if ((dev->ioSema = CreateSema(&SemaData)) < 0) { - printf("USBHDFSD: Failed to allocate I/O semaphore.\n"); - return -1; - } - - /*store current configuration id - can't call set_configuration here */ - dev->devId = devId; - dev->configId = config->bConfigurationValue; - dev->status = USBMASS_DEV_STAT_CONN; - XPRINTF("USBHDFSD: connect ok: epI=%i, epO=%i \n", dev->bulkEpI, dev->bulkEpO); - - if (dev->callback != NULL) - dev->callback(USBMASS_DEV_EV_CONN); - - return 0; -} - -static void mass_stor_release(mass_dev *dev) -{ - if (dev->bulkEpI >= 0) { - UsbCloseEndpoint(dev->bulkEpI); - } - - if (dev->bulkEpO >= 0) { - UsbCloseEndpoint(dev->bulkEpO); - } - - dev->bulkEpI = -1; - dev->bulkEpO = -1; - dev->controlEp = -1; - dev->status = 0; -} - -int mass_stor_disconnect(int devId) -{ - mass_dev *dev; - dev = mass_stor_findDevice(devId, 0); - - printf("USBHDFSD: disconnect: devId=%i\n", devId); - - if (dev == NULL) { - printf("USBHDFSD: Error - disconnect: no device storage!\n"); - return 0; - } - - if (dev->status & USBMASS_DEV_STAT_CONN) { - mass_stor_release(dev); - part_disconnect(dev); - scache_kill(dev->cache); - dev->cache = NULL; - dev->devId = -1; - - DeleteSema(dev->ioSema); - - if (dev->callback != NULL) - dev->callback(USBMASS_DEV_EV_DISCONN); - } - - return 0; -} - -static int mass_stor_warmup(mass_dev *dev) -{ - inquiry_data id; - sense_data sd; - read_capacity_data rcd; - int stat; - - XPRINTF("USBHDFSD: mass_stor_warmup\n"); - - if (!(dev->status & USBMASS_DEV_STAT_CONN)) { - printf("USBHDFSD: Error - no mass storage device found!\n"); - return -1; - } - - stat = usb_bulk_get_max_lun(dev); - XPRINTF("USBHDFSD: usb_bulk_get_max_lun %d\n", stat); - - memset(&id, 0, sizeof(inquiry_data)); - if ((stat = cbw_scsi_inquiry(dev, &id, sizeof(inquiry_data))) < 0) { - printf("USBHDFSD: Error - cbw_scsi_inquiry %d\n", stat); - return -1; - } - - printf("USBHDFSD: Vendor: %.8s\n", id.vendor); - printf("USBHDFSD: Product: %.16s\n", id.product); - printf("USBHDFSD: Revision: %.4s\n", id.revision); - - while ((stat = cbw_scsi_test_unit_ready(dev)) != 0) { - printf("USBHDFSD: Error - cbw_scsi_test_unit_ready %d\n", stat); - - stat = cbw_scsi_request_sense(dev, &sd, sizeof(sense_data)); - if (stat != 0) - printf("USBHDFSD: Error - cbw_scsi_request_sense %d\n", stat); - - if ((sd.error_code == 0x70) && (sd.sense_key != 0x00)) { - printf("USBHDFSD: Sense Data key: %02X code: %02X qual: %02X\n", sd.sense_key, sd.add_sense_code, sd.add_sense_qual); - - if ((sd.sense_key == 0x02) && (sd.add_sense_code == 0x04) && (sd.add_sense_qual == 0x02)) { - printf("USBHDFSD: Error - Additional initalization is required for this device!\n"); - if ((stat = cbw_scsi_start_stop_unit(dev)) != 0) { - printf("USBHDFSD: Error - cbw_scsi_start_stop_unit %d\n", stat); - return -1; - } - } - } - } - - if ((stat = cbw_scsi_read_capacity(dev, &rcd, sizeof(read_capacity_data))) != 0) { - printf("USBHDFSD: Error - cbw_scsi_read_capacity %d\n", stat); - return -1; - } - - dev->sectorSize = getBI32(&rcd.block_length); - dev->maxLBA = getBI32(&rcd.last_lba); - printf("USBHDFSD: sectorSize %u maxLBA %u\n", dev->sectorSize, dev->maxLBA); - - return 0; -} - -int mass_stor_configureNextDevice(void) -{ - int i; - - XPRINTF("USBHDFSD: configuring devices... \n"); - - for (i = 0; i < NUM_DEVICES; ++i) { - mass_dev *dev = &g_mass_device[i]; - if (dev->devId != -1 && (dev->status & USBMASS_DEV_STAT_CONN) && !(dev->status & USBMASS_DEV_STAT_CONF)) { - int ret; - usb_set_configuration(dev, dev->configId); - usb_set_interface(dev, dev->interfaceNumber, dev->interfaceAlt); - dev->status |= USBMASS_DEV_STAT_CONF; - - ret = mass_stor_warmup(dev); - if (ret < 0) { - printf("USBHDFSD: Error - failed to warmup device %d\n", dev->devId); - mass_stor_release(dev); - continue; - } - - dev->cache = scache_init(dev, dev->sectorSize); // modified by Hermes - if (dev->cache == NULL) { - printf("USBHDFSD: Error - scache_init failed \n"); - continue; - } - - return part_connect(dev) >= 0; - } - } - return 0; -} - -int InitUSB(void) -{ - int i; - int ret = 0; - for (i = 0; i < NUM_DEVICES; ++i) { - g_mass_device[i].status = 0; - g_mass_device[i].devId = -1; - } - - driver.next = NULL; - driver.prev = NULL; - driver.name = "mass-stor"; - driver.probe = mass_stor_probe; - driver.connect = mass_stor_connect; - driver.disconnect = mass_stor_disconnect; - - ret = UsbRegisterDriver(&driver); - XPRINTF("USBHDFSD: registerDriver=%i \n", ret); - if (ret < 0) { - printf("USBHDFSD: register driver failed! ret=%d\n", ret); - return (-1); - } - - return (0); -} - -int UsbMassGetDeviceInfo(int device, UsbMassDeviceInfo_t *info) -{ - int result; - mass_dev *pDev; - - if (device >= 0 && device < NUM_DEVICES) { - pDev = &g_mass_device[device]; - - info->status = pDev->status; - info->SectorSize = pDev->sectorSize; - info->MaxLBA = pDev->maxLBA; - - result = 0; - } else - result = -ENODEV; - - return result; -} - -int UsbMassRegisterCallback(int device, usbmass_cb_t callback) -{ - int result; - - if (device >= 0 && device < NUM_DEVICES) { - g_mass_device[device].callback = callback; - result = 0; - if (g_mass_device[device].status & USBMASS_DEV_STAT_CONN) { - //If the device is already connected, let the callback know. - if (callback != NULL) - callback(USBMASS_DEV_EV_CONN); - } - } else - result = -ENODEV; - - return result; -} diff --git a/modules/usb/usbhdfsd/usbhd_common.h b/modules/usb/usbhdfsd/usbhd_common.h deleted file mode 100644 index cb2c9621b..000000000 --- a/modules/usb/usbhdfsd/usbhd_common.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef _USBHD_COMMON_H -#define _USBHD_COMMON_H - -#ifdef WIN32 -#define USBHD_INLINE -typedef unsigned char u8; -#else -#define USBHD_INLINE inline -void *malloc(int size); -void free(void *ptr); -#endif - -struct _cache_set; -typedef struct _cache_set cache_set; -struct _mass_dev; -typedef struct _mass_dev mass_dev; - -//--------------------------------------------------------------------------- -static USBHD_INLINE int getI32(unsigned char *buf) -{ - return (buf[0] + (buf[1] << 8) + (buf[2] << 16) + (buf[3] << 24)); -} - -//--------------------------------------------------------------------------- -static USBHD_INLINE int getI32_2(unsigned char *buf1, unsigned char *buf2) -{ - return (buf1[0] + (buf1[1] << 8) + (buf2[0] << 16) + (buf2[1] << 24)); -} - -//--------------------------------------------------------------------------- -static USBHD_INLINE int getI16(unsigned char *buf) -{ - return (buf[0] + (buf[1] << 8)); -} - -#endif // _USBHD_COMMON_H diff --git a/modules/usb/usbhdfsd/usbhdfsd.c b/modules/usb/usbhdfsd/usbhdfsd.c deleted file mode 100644 index e8caed805..000000000 --- a/modules/usb/usbhdfsd/usbhdfsd.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * usb_mass.c - USB Mass storage driver for PS2 - */ - -#define MAJOR_VER 1 -#define MINOR_VER 6 - -#include -#include -#include -#include -#include - -#include - -IRX_ID("usbhdfsd", MAJOR_VER, MINOR_VER); - -extern int InitFAT(); -extern int InitFS(); -extern int InitUSB(); - -extern struct irx_export_table _exp_usbmass; - -int _start(int argc, char *argv[]) -{ - printf("USB HDD FileSystem Driver v%d.%d\n", MAJOR_VER, MINOR_VER); - - if (RegisterLibraryEntries(&_exp_usbmass) != 0) { - printf("USBHDFSD: Already registered.\n"); - return MODULE_NO_RESIDENT_END; - } - - // initialize the FAT driver - if (InitFAT() != 0) { - printf("USBHDFSD: Error initializing FAT driver!\n"); - return MODULE_NO_RESIDENT_END; - } - - // initialize the USB driver - if (InitUSB() != 0) { - printf("USBHDFSD: Error initializing USB driver!\n"); - return MODULE_NO_RESIDENT_END; - } - - // initialize the file system driver - if (InitFS() != 0) { - printf("USBHDFSD: Error initializing FS driver!\n"); - return MODULE_NO_RESIDENT_END; - } - - // return resident - return MODULE_RESIDENT_END; -} - -#ifndef WIN32 -void *malloc(int size) -{ - void *result; - int OldState; - - CpuSuspendIntr(&OldState); - result = AllocSysMemory(ALLOC_FIRST, size, NULL); - CpuResumeIntr(OldState); - - return result; -} - -void free(void *ptr) -{ - int OldState; - - CpuSuspendIntr(&OldState); - FreeSysMemory(ptr); - CpuResumeIntr(OldState); -} -#endif diff --git a/modules/usb/usbhdfsd/usbhdfsd.h b/modules/usb/usbhdfsd/usbhdfsd.h deleted file mode 100644 index ddcbf408b..000000000 --- a/modules/usb/usbhdfsd/usbhdfsd.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _USBHDFSD_H -#define _USBHDFSD_H - -//IOCTL function codes -#define USBHDFSD_IOCTL_RENAME 0x0000 //Rename opened file. Data input to ioctl() -> new, full filename of file. - -#endif //_USBHDFSD_H diff --git a/modules/usb/usbhdfsdfsv/Makefile b/modules/usb/usbhdfsdfsv/Makefile index 92aa6cd38..f007f541a 100755 --- a/modules/usb/usbhdfsdfsv/Makefile +++ b/modules/usb/usbhdfsdfsv/Makefile @@ -12,7 +12,7 @@ IOP_BIN = usbhdfsdfsv.irx IOP_OBJS = main.o imports.o IOP_LIBS = -IOP_INCS += +IOP_INCS += -I../../../include/ IOP_CFLAGS += -Wall -fno-builtin-printf IOP_LDFLAGS += -s diff --git a/modules/usb/usbhdfsdfsv/imports.lst b/modules/usb/usbhdfsdfsv/imports.lst index 2a789b949..903ee1a8c 100644 --- a/modules/usb/usbhdfsdfsv/imports.lst +++ b/modules/usb/usbhdfsdfsv/imports.lst @@ -1,5 +1,11 @@ +iomanX_IMPORTS_start +I_AddDrv +iomanX_IMPORTS_end + usbmass_IMPORTS_start I_UsbMassRegisterCallback +I_UsbMassFatGetData +I_UsbMassFatGetClusterChain usbmass_IMPORTS_end sifcmd_IMPORTS_start diff --git a/modules/usb/usbhdfsdfsv/irx_imports.h b/modules/usb/usbhdfsdfsv/irx_imports.h index 6121716e1..00d99f110 100644 --- a/modules/usb/usbhdfsdfsv/irx_imports.h +++ b/modules/usb/usbhdfsdfsv/irx_imports.h @@ -12,6 +12,7 @@ #include /* Please keep these in alphabetical order! */ +#include #include #include #include diff --git a/modules/usb/usbhdfsdfsv/main.c b/modules/usb/usbhdfsdfsv/main.c index 0d77c08a6..a69ac8e3d 100644 --- a/modules/usb/usbhdfsdfsv/main.c +++ b/modules/usb/usbhdfsdfsv/main.c @@ -1,3 +1,5 @@ +#include +#include #include #include #include @@ -5,8 +7,113 @@ #include +#include "usb-ioctl.h" + IRX_ID("usbhdfsd_for_EE", 1, 1); +static int xmassInit(iop_device_t *device) +{ + return 0; +} + +static int xmassUnsupported(void) +{ + return -1; +} + +static int fat_CheckChain(fat_driver *fatd, u32 start) +{ + int i, chainSize, nextChain; + + unsigned int fileCluster; + int clusterChainStart; + + fileCluster = start; + + if (fileCluster < 2) + return 0; + + nextChain = 1; + clusterChainStart = 1; + + while (nextChain) + { + chainSize = UsbMassFatGetClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, clusterChainStart); + clusterChainStart = 0; + if (chainSize >= MAX_DIR_CLUSTER) { //the chain is full, but more chain parts exist + fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1]; + } else { //chain fits in the chain buffer completely - no next chain needed + nextChain = 0; + } + + //process the cluster chain (fatd->cbuf) and skip leading clusters if needed + for (i = 0; i < (chainSize - 1); i++) { + if ((fatd->cbuf[i] + 1) != fatd->cbuf[i + 1]) + return 0; + } + } + + return 1; +} + +static int xmassDevctl(iop_file_t *fd, const char *name, int cmd, void *arg, unsigned int arglen, void *buf, unsigned int buflen) +{ + int result; + fat_driver *fatd; + + if(fd->unit >= 2) + return -ENXIO; + + switch(cmd) + { + case XUSBHDFSD_CHECK_CLUSTER_CHAIN: + if((fatd = UsbMassFatGetData(fd->unit)) != NULL) + { + result = fat_CheckChain(fatd, *(u32*)arg); + } else + result = 0; + + return result; + default: + return -EINVAL; + } +} + +static iop_device_ops_t xmass_ops={ + &xmassInit, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + (void*)&xmassUnsupported, + &xmassDevctl, +}; + +static iop_device_t xmassDevice = { + "xmass", + IOP_DT_BLOCK | IOP_DT_FSEXT, + 1, + "XMASS", + &xmass_ops +}; + static void usbmass_cb(int cause) { static SifCmdHeader_t EventCmdData; @@ -17,7 +124,11 @@ static void usbmass_cb(int cause) int _start(int argc, char *argv[]) { - UsbMassRegisterCallback(0, &usbmass_cb); - - return MODULE_RESIDENT_END; + if(AddDrv(&xmassDevice) == 0) + { + UsbMassRegisterCallback(0, &usbmass_cb); + return MODULE_RESIDENT_END; + } else { + return MODULE_NO_RESIDENT_END; + } } diff --git a/src/gui.c b/src/gui.c index da6a3cd4d..bc9106e23 100644 --- a/src/gui.c +++ b/src/gui.c @@ -234,6 +234,9 @@ void guiShowAbout() #ifdef CHEAT strcat(OPLVersion, " PS2RD"); #endif +#ifdef PADEMU + strcat(OPLVersion, " PADEMU"); +#endif diaSetLabel(diaAbout, 1, OPLVersion); diff --git a/src/hdd.c b/src/hdd.c index 3eeb2ddc0..f4b60e555 100644 --- a/src/hdd.c +++ b/src/hdd.c @@ -1,4 +1,5 @@ #include "include/opl.h" +#include "include/hdd.h" #include "include/ioman.h" #include "include/hddsupport.h" @@ -23,15 +24,17 @@ typedef struct // size = 1024 } part_specs[65]; } hdl_apa_header; -#define HDL_GAME_DATA_OFFSET 0x100000 // Sector 0x800 in the user data area. +#define HDL_GAME_DATA_OFFSET 0x100000 // Sector 0x800 in the extended attribute area. #define HDL_FS_MAGIC 0x1337 +static unsigned char IOBuffer[1024] ALIGNED(64); + //------------------------------------------------------------------------- int hddCheck(void) { int ret; - ret = fileXioDevctl("hdd0:", APA_DEVCTL_STATUS, NULL, 0, NULL, 0); + ret = fileXioDevctl("hdd0:", HDIOC_STATUS, NULL, 0, NULL, 0); if ((ret >= 3) || (ret < 0)) return -1; @@ -42,24 +45,24 @@ int hddCheck(void) //------------------------------------------------------------------------- u32 hddGetTotalSectors(void) { - return fileXioDevctl("hdd0:", APA_DEVCTL_TOTAL_SECTORS, NULL, 0, NULL, 0); + return fileXioDevctl("hdd0:", HDIOC_TOTALSECTOR, NULL, 0, NULL, 0); } //------------------------------------------------------------------------- int hddIs48bit(void) { - return fileXioDevctl("hdd0:", APA_DEVCTL_IS_48BIT, NULL, 0, NULL, 0); + return fileXioDevctl("xhdd0:", ATA_DEVCTL_IS_48BIT, NULL, 0, NULL, 0); } //------------------------------------------------------------------------- int hddSetTransferMode(int type, int mode) { - u8 args[16]; + hddAtaSetMode_t *args = (hddAtaSetMode_t*)IOBuffer; - *(u32 *)&args[0] = type; - *(u32 *)&args[4] = mode; + args->type = type; + args->mode = mode; - return fileXioDevctl("hdd0:", APA_DEVCTL_SET_TRANSFER_MODE, args, 8, NULL, 0); + return fileXioDevctl("xhdd0:", ATA_DEVCTL_SET_TRANSFER_MODE, args, sizeof(hddAtaSetMode_t), NULL, 0); } //------------------------------------------------------------------------- @@ -81,18 +84,18 @@ int hddSetIdleTimeout(int timeout) *(u32 *)&args[0] = timeout & 0xff; - return fileXioDevctl("hdd0:", APA_DEVCTL_IDLE, args, 4, NULL, 0); + return fileXioDevctl("hdd0:", HDIOC_IDLE, args, 4, NULL, 0); } //------------------------------------------------------------------------- int hddReadSectors(u32 lba, u32 nsectors, void *buf) { - u8 args[16]; + hddAtaTransfer_t *args = (hddAtaTransfer_t*)IOBuffer; - *(u32 *)&args[0] = lba; - *(u32 *)&args[4] = nsectors; + args->lba = lba; + args->size = nsectors; - if (fileXioDevctl("hdd0:", APA_DEVCTL_ATA_READ, args, 8, buf, nsectors * 512) != 0) + if (fileXioDevctl("hdd0:", HDIOC_READSECTOR, args, sizeof(hddAtaTransfer_t), buf, nsectors * 512) != 0) return -1; return 0; @@ -101,17 +104,20 @@ int hddReadSectors(u32 lba, u32 nsectors, void *buf) //------------------------------------------------------------------------- static int hddWriteSectors(u32 lba, u32 nsectors, const void *buf) { - static u8 WriteBuffer[1088] ALIGNED(64); + static u8 WriteBuffer[2 * 512 + sizeof(hddAtaTransfer_t)] ALIGNED(64); //Has to be a different buffer from IOBuffer (input can be in IOBuffer). int argsz; - u8 *args = (u8 *)WriteBuffer; + hddAtaTransfer_t *args = (hddAtaTransfer_t *)WriteBuffer; - *(u32 *)&args[0] = lba; - *(u32 *)&args[4] = nsectors; - memcpy(&args[8], buf, nsectors * 512); + if(nsectors > 2) //Sanity check + return -ENOMEM; - argsz = 8 + (nsectors * 512); + args->lba = lba; + args->size = nsectors; + memcpy(args->data, buf, nsectors * 512); - if (fileXioDevctl("hdd0:", APA_DEVCTL_ATA_WRITE, args, argsz, NULL, 0) != 0) + argsz = sizeof(hddAtaTransfer_t) + (nsectors * 512); + + if (fileXioDevctl("hdd0:", HDIOC_WRITESECTOR, args, argsz, NULL, 0) != 0) return -1; return 0; @@ -120,12 +126,10 @@ static int hddWriteSectors(u32 lba, u32 nsectors, const void *buf) //------------------------------------------------------------------------- int hddGetFormat(void) { - return fileXioDevctl("hdd0:", APA_DEVCTL_FORMAT, NULL, 0, NULL, 0); + return fileXioDevctl("hdd0:", HDIOC_FORMATVER, NULL, 0, NULL, 0); } //------------------------------------------------------------------------- -static unsigned char IOBuffer[1024] ALIGNED(64); - struct GameDataEntry { u32 lba, size; @@ -290,3 +294,61 @@ int hddDeleteHDLGame(hdl_game_info_t *ginfo) return fileXioRemove(path); } + +//------------------------------------------------------------------------- +int hddGetPartitionInfo(const char *name, apa_sub_t *parts) +{ + u32 lba; + iox_stat_t stat; + apa_header_t *header; + int result, i; + + if((result = fileXioGetStat(name, &stat)) >= 0) + { + lba = stat.private_5; + header = (apa_header_t*)IOBuffer; + + if(hddReadSectors(lba, sizeof(apa_header_t)/512, header) == 0) + { + parts[0].start = header->start; + parts[0].length = header->length; + + for(i = 0; i < header->nsub; i++) + parts[1 + i] = header->subs[i]; + + result = header->nsub + 1; + } + else + result = -EIO; + } + + return result; +} + +//------------------------------------------------------------------------- +int hddGetFileBlockInfo(const char *name, const apa_sub_t *subs, pfs_blockinfo_t *blocks, int max) +{ + u32 lba; + iox_stat_t stat; + pfs_inode_t *inode; + int result; + + if((result = fileXioGetStat(name, &stat)) >= 0) + { + lba = subs[stat.private_4].start + stat.private_5; + inode = (pfs_inode_t*)IOBuffer; + + if(hddReadSectors(lba, sizeof(pfs_inode_t)/512, inode) == 0) + { + if(inode->number_data < max) { + memcpy(blocks, inode->data, max * sizeof (pfs_blockinfo_t)); + result = inode->number_data; + } else + result = -ENOMEM; + } + else + result = -EIO; + } + + return result; +} diff --git a/src/hddsupport.c b/src/hddsupport.c index 14b581812..58f585786 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -33,6 +33,9 @@ extern int size_hdpro_atad_irx; extern void *ps2hdd_irx; extern int size_ps2hdd_irx; +extern void *xhdd_irx; +extern int size_xhdd_irx; + extern void *ps2fs_irx; extern int size_ps2fs_irx; @@ -152,11 +155,13 @@ void hddLoadModules(void) // try to detect HD Pro Kit (not the connected HDD), // if detected it loads the specific ATAD module hddHDProKitDetected = hddCheckHDProKit(); - if (hddHDProKitDetected) + if (hddHDProKitDetected) { ret = sysLoadModuleBuffer(&hdpro_atad_irx, size_hdpro_atad_irx, 0, NULL); - else { + sysLoadModuleBuffer(&xhdd_irx, size_xhdd_irx, 6, "-hdpro"); + } else { sysInitDev9(); ret = sysLoadModuleBuffer(&ps2atad_irx, size_ps2atad_irx, 0, NULL); + sysLoadModuleBuffer(&xhdd_irx, size_xhdd_irx, 0, NULL); } if (ret < 0) { LOG("HDD: No HardDisk Drive detected.\n"); @@ -172,8 +177,7 @@ void hddLoadModules(void) } //Check if a HDD unit is connected - ret = fileXioDevctl("hdd0:", APA_DEVCTL_STATUS, NULL, 0, NULL, 0); - if ((ret >= 3) || (ret < 0)) { + if (hddCheck() < 0) { LOG("HDD: No HardDisk Drive detected.\n"); setErrorMessageWithCode(_STR_HDD_NOT_CONNECTED_ERROR, ERROR_HDD_NOT_DETECTED); return; @@ -284,9 +288,9 @@ static void hddLaunchGame(int id, config_set_t *configSet) struct cdvdman_settings_hdd *settings; #ifdef VMC - apa_header_t part_hdr; + apa_sub_t parts[APA_MAXSUB + 1]; char vmc_name[2][32]; - int fd, part_valid = 0, size_mcemu_irx = 0; + int part_valid = 0, size_mcemu_irx = 0, nparts; hdd_vmc_infos_t hdd_vmc_infos; memset(&hdd_vmc_infos, 0, sizeof(hdd_vmc_infos_t)); @@ -294,34 +298,23 @@ static void hddLaunchGame(int id, config_set_t *configSet) configGetVMC(configSet, vmc_name[1], sizeof(vmc_name[1]), 1); if (vmc_name[0][0] || vmc_name[1][0]) { - fileXioUmount(hddPrefix); - fd = fileXioOpen(oplPart, O_RDONLY, FIO_S_IRUSR | FIO_S_IWUSR | FIO_S_IXUSR | FIO_S_IRGRP | FIO_S_IWGRP | FIO_S_IXGRP | FIO_S_IROTH | FIO_S_IWOTH | FIO_S_IXOTH); - if (fd >= 0) { - if (fileXioIoctl2(fd, APA_IOCTL2_GETHEADER, NULL, 0, (void *)&part_hdr, sizeof(apa_header_t)) == sizeof(apa_header_t)) { - if (part_hdr.nsub <= 4) { - hdd_vmc_infos.parts[0].start = part_hdr.start; - hdd_vmc_infos.parts[0].length = part_hdr.length; - LOG("HDDSUPPORT hdd_vmc_infos.parts[0].start : 0x%X\n", hdd_vmc_infos.parts[0].start); - LOG("HDDSUPPORT hdd_vmc_infos.parts[0].length : 0x%X\n", hdd_vmc_infos.parts[0].length); - for (i = 0; i < part_hdr.nsub; i++) { - hdd_vmc_infos.parts[i + 1].start = part_hdr.subs[i].start; - hdd_vmc_infos.parts[i + 1].length = part_hdr.subs[i].length; - LOG("HDDSUPPORT hdd_vmc_infos.parts[%d].start : 0x%X\n", i + 1, hdd_vmc_infos.parts[i + 1].start); - LOG("HDDSUPPORT hdd_vmc_infos.parts[%d].length : 0x%X\n", i + 1, hdd_vmc_infos.parts[i + 1].length); - } - part_valid = 1; - } + nparts = hddGetPartitionInfo(oplPart, parts); + if (nparts > 0 && nparts <= 5) { + for (i = 0; i < nparts; i++) { + hdd_vmc_infos.parts[i].start = parts[i].start; + hdd_vmc_infos.parts[i].length = parts[i].length; + LOG("HDDSUPPORT hdd_vmc_infos.parts[%d].start : 0x%X\n", i, hdd_vmc_infos.parts[i].start); + LOG("HDDSUPPORT hdd_vmc_infos.parts[%d].length : 0x%X\n", i, hdd_vmc_infos.parts[i].length); } - fileXioClose(fd); + part_valid = 1; } - fileXioMount(hddPrefix, oplPart, FIO_MT_RDWR); // if this fails, something is really screwed up } if (part_valid) { char vmc_path[256]; int vmc_id, have_error = 0; vmc_superblock_t vmc_superblock; - pfs_inode_t pfs_inode; + pfs_blockinfo_t blocks[11]; for (vmc_id = 0; vmc_id < 2; vmc_id++) { if (vmc_name[vmc_id][0]) { @@ -336,22 +329,18 @@ static void hddLaunchGame(int id, config_set_t *configSet) // Check vmc inode block chain (write operation can cause damage) snprintf(vmc_path, sizeof(vmc_path), "%sVMC/%s.bin", hddPrefix, vmc_name[vmc_id]); - fd = fileXioOpen(vmc_path, O_RDWR, FIO_S_IRUSR | FIO_S_IWUSR | FIO_S_IXUSR | FIO_S_IRGRP | FIO_S_IWGRP | FIO_S_IXGRP | FIO_S_IROTH | FIO_S_IWOTH | FIO_S_IXOTH); - if (fileXioIoctl2(fd, PFS_IOCTL2_GET_INODE, NULL, 0, (void *)&pfs_inode, sizeof(pfs_inode_t)) == sizeof(pfs_inode_t)) { - if (pfs_inode.number_data <= 11) { - have_error = 0; - hdd_vmc_infos.active = 1; - for (i = 0; i < pfs_inode.number_data - 1; i++) { - hdd_vmc_infos.blocks[i].number = pfs_inode.data[i + 1].number; - hdd_vmc_infos.blocks[i].subpart = pfs_inode.data[i + 1].subpart; - hdd_vmc_infos.blocks[i].count = pfs_inode.data[i + 1].count; - LOG("HDDSUPPORT hdd_vmc_infos.blocks[%d].number : 0x%X\n", i, hdd_vmc_infos.blocks[i].number); - LOG("HDDSUPPORT hdd_vmc_infos.blocks[%d].subpart : 0x%X\n", i, hdd_vmc_infos.blocks[i].subpart); - LOG("HDDSUPPORT hdd_vmc_infos.blocks[%d].count : 0x%X\n", i, hdd_vmc_infos.blocks[i].count); - } - } // else Vmc file too much fragmented - } - fileXioClose(fd); + if ((nparts = hddGetFileBlockInfo(vmc_path, parts, blocks, 11)) > 0) { + have_error = 0; + hdd_vmc_infos.active = 1; + for (i = 0; i < nparts - 1; i++) { + hdd_vmc_infos.blocks[i].number = blocks[i + 1].number; + hdd_vmc_infos.blocks[i].subpart = blocks[i + 1].subpart; + hdd_vmc_infos.blocks[i].count = blocks[i + 1].count; + LOG("HDDSUPPORT hdd_vmc_infos.blocks[%d].number : 0x%X\n", i, hdd_vmc_infos.blocks[i].number); + LOG("HDDSUPPORT hdd_vmc_infos.blocks[%d].subpart : 0x%X\n", i, hdd_vmc_infos.blocks[i].subpart); + LOG("HDDSUPPORT hdd_vmc_infos.blocks[%d].count : 0x%X\n", i, hdd_vmc_infos.blocks[i].count); + } + } // else Vmc file too much fragmented } if (have_error) { @@ -482,6 +471,8 @@ static void hddCleanUp(int exception) if ((exception & UNMOUNT_EXCEPTION) == 0) fileXioUmount(hddPrefix); + + fileXioDevctl("pfs:", PDIOC_CLOSEALL, NULL, 0, NULL, 0); } hddModulesLoaded = 0; diff --git a/src/opl.c b/src/opl.c index d66a51980..7d3410a17 100644 --- a/src/opl.c +++ b/src/opl.c @@ -1029,13 +1029,6 @@ extern int size_hdldsvr_irx; static int loadHdldSvr(void) { int ret, padStatus; - static char hddarg[] = "-o" - "\0" - "4" - "\0" - "-n" - "\0" - "20"; // block all io ops, wait for the ones still running to finish ioBlockOps(1); @@ -1052,12 +1045,9 @@ static int loadHdldSvr(void) if (ret == 0) { ret = sysLoadModuleBuffer(&ps2atad_irx, size_ps2atad_irx, 0, NULL); if (ret >= 0) { - ret = sysLoadModuleBuffer(&ps2hdd_irx, size_ps2hdd_irx, sizeof(hddarg), hddarg); - if (ret >= 0) { - ret = sysLoadModuleBuffer(&hdldsvr_irx, size_hdldsvr_irx, 0, NULL); - if (ret >= 0) - ret = 0; - } + ret = sysLoadModuleBuffer(&hdldsvr_irx, size_hdldsvr_irx, 0, NULL); + if (ret >= 0) + ret = 0; } } diff --git a/src/supportbase.c b/src/supportbase.c index 157d7fcd8..6f6311fdf 100644 --- a/src/supportbase.c +++ b/src/supportbase.c @@ -432,7 +432,7 @@ void sbUnprepare(void *pCommon) memcpy(pCommon, &cdvdman_settings_common_sample, sizeof(struct cdvdman_settings_common)); } -static void sbRebuildULCfg(base_game_info_t **list, const char *prefix, int gamecount, int excludeID) +void sbRebuildULCfg(base_game_info_t **list, const char *prefix, int gamecount, int excludeID) { char path[256]; USBExtreme_game_entry_t GameEntry; diff --git a/src/system.c b/src/system.c index 2e3bbf680..8079689a8 100644 --- a/src/system.c +++ b/src/system.c @@ -235,7 +235,10 @@ void sysInitDev9(void) void sysReset(int modload_mask) { - +#ifdef PADEMU + ds3usb_reset(); + ds3bt_reset(); +#endif fileXioExit(); SifExitIopHeap(); SifLoadFileExit(); @@ -247,7 +250,7 @@ void sysReset(int modload_mask) while (!SifIopReset("rom0:UDNL", 0)) ; #else - while (!SifIopReset(NULL, 0)) + while (!SifIopReset("", 0)) ; #endif @@ -310,11 +313,16 @@ void sysReset(int modload_mask) #ifdef PADEMU int ds3pads = 1; //only one pad enabled - sysLoadModuleBuffer(&ds3usb_irx, size_ds3usb_irx, 4, (char *)&ds3pads); - sysLoadModuleBuffer(&ds3bt_irx, size_ds3bt_irx, 4, (char *)&ds3pads); + ds3usb_deinit(); + ds3bt_deinit(); + + if (modload_mask & SYS_LOAD_USB_MODULES) { + sysLoadModuleBuffer(&ds3usb_irx, size_ds3usb_irx, 4, (char *)&ds3pads); + sysLoadModuleBuffer(&ds3bt_irx, size_ds3bt_irx, 4, (char *)&ds3pads); - ds3usb_init(); - ds3bt_init(); + ds3usb_init(); + ds3bt_init(); + } #endif fileXioInit(); @@ -407,6 +415,10 @@ int sysGetDiscID(char *hexDiscID) void sysExecExit() { +#ifdef PADEMU + ds3usb_reset(); + ds3bt_reset(); +#endif Exit(0); } @@ -724,7 +736,13 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo snprintf(text, sizeof(text), "IOP Usage:%.2f%%,by %s(CDVDFSV+CDVDMAN)", (float)usage, mode_str); #ifdef VMC - strcat(text, "+VMC"); + if (size_mcemu_irx > 0) + strcat(text, "+VMC"); +#endif + +#ifdef PADEMU + if (gEnablePadEmu) + strcat(text, "+PADEMU"); #endif guiWarning(text, 20); } diff --git a/src/usbsupport.c b/src/usbsupport.c index 968f7ae34..acbdd5f7a 100644 --- a/src/usbsupport.c +++ b/src/usbsupport.c @@ -218,7 +218,53 @@ static void usbDeleteGame(int id) static void usbRenameGame(int id, char *newName) { - sbRename(&usbGames, usbPrefix, "/", usbGameCount, id, newName); + char oldpath[256], newpath[256]; + base_game_info_t *game = &usbGames[id]; + int fd; + + if (game->format != GAME_FORMAT_USBLD) { + if (game->format == GAME_FORMAT_OLD_ISO) { + if (game->media == 0x12) { + snprintf(oldpath, sizeof(oldpath), "%sCD/%s.%s%s", usbPrefix, game->startup, game->name, game->extension); + snprintf(newpath, sizeof(newpath), "%sCD/%s.%s%s", usbPrefix, game->startup, newName, game->extension); + } else { + snprintf(oldpath, sizeof(oldpath), "%sDVD/%s.%s%s", usbPrefix, game->startup, game->name, game->extension); + snprintf(newpath, sizeof(newpath), "%sDVD/%s.%s%s", usbPrefix, game->startup, newName, game->extension); + } + } else { + if (game->media == 0x12) { + snprintf(oldpath, sizeof(oldpath), "%sCD/%s%s", usbPrefix, game->name, game->extension); + snprintf(newpath, sizeof(newpath), "%sCD/%s%s", usbPrefix, newName, game->extension); + } else { + snprintf(oldpath, sizeof(oldpath), "%sDVD/%s%s", usbPrefix, game->name, game->extension); + snprintf(newpath, sizeof(newpath), "%sDVD/%s%s", usbPrefix, newName, game->extension); + } + } + + if((fd = fileXioOpen(oldpath, O_RDONLY)) >= 0) { + fileXioIoctl(fd, USBMASS_IOCTL_RENAME, newpath); + fileXioClose(fd); + } + } else { + const char *pathStr = "%sul.%08X.%s.%02x"; + unsigned int oldcrc = USBA_crc32(game->name); + unsigned int newcrc = USBA_crc32(newName); + int i; + + for (i = 0; i < game->parts; i++) { + snprintf(oldpath, sizeof(oldpath), pathStr, usbPrefix, oldcrc, game->startup, i); + snprintf(newpath, sizeof(newpath), pathStr, usbPrefix, newcrc, game->startup, i); + if((fd = fileXioOpen(oldpath, O_RDONLY)) >= 0) { + fileXioIoctl(fd, USBMASS_IOCTL_RENAME, newpath); + fileXioClose(fd); + } + } + + memset(game->name, 0, UL_GAME_NAME_MAX + 1); + memcpy(game->name, newName, UL_GAME_NAME_MAX); + sbRebuildULCfg(&usbGames, usbPrefix, usbGameCount, -1); + } + usbULSizePrev = -2; } #endif @@ -233,6 +279,7 @@ static void usbLaunchGame(int id, config_set_t *configSet) #ifdef VMC unsigned int start; #endif + unsigned int startCluster; char partname[256], filename[32]; base_game_info_t *game = &usbGames[id]; struct cdvdman_settings_usb *settings; @@ -259,11 +306,13 @@ static void usbLaunchGame(int id, config_set_t *configSet) sprintf(vmc_path, "%sVMC/%s.bin", usbPrefix, vmc_name); - fd = fileXioOpen(vmc_path, O_RDONLY, 0666); + fd = fileXioOpen(vmc_path, O_RDONLY); if (fd >= 0) { - if ((start = fileXioIoctl(fd, USBHDFSD_IOCTL_GETSECTOR, vmc_path)) != 0) { + if ((start = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_LBA, vmc_path)) != 0 + && (startCluster = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_CLUSTER, vmc_path)) != 0) { + // Check VMC cluster chain for fragmentation (write operation can cause damage to the filesystem). - if (fileXioIoctl(fd, USBHDFSD_IOCTL_CHECKCHAIN, vmc_path) != 0) { + if (fileXioDevctl("xmass0:", XUSBHDFSD_CHECK_CLUSTER_CHAIN, &startCluster, 4, NULL, 0) != 0) { LOG("USBSUPPORT Cluster Chain OK\n"); have_error = 0; usb_vmc_infos.active = 1; @@ -314,17 +363,21 @@ static void usbLaunchGame(int id, config_set_t *configSet) sprintf(partname, "%sul.%08X.%s.%02x", usbPrefix, USBA_crc32(game->name), game->startup, i); } - fd = fileXioOpen(partname, O_RDONLY, 0666); + fd = fileXioOpen(partname, O_RDONLY); if (fd >= 0) { - settings->LBAs[i] = fileXioIoctl(fd, USBHDFSD_IOCTL_GETSECTOR, partname); - if (gCheckUSBFragmentation && fileXioIoctl(fd, USBHDFSD_IOCTL_CHECKCHAIN, partname) == 0) { - fileXioClose(fd); - //Game is fragmented. Do not continue. - if (settings != NULL) - sbUnprepare(&settings->common); + settings->LBAs[i] = fileXioIoctl(fd, USBMASS_IOCTL_GET_LBA, partname); + if (gCheckUSBFragmentation) { + if ((startCluster = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_CLUSTER, partname)) == 0 + || fileXioDevctl("xmass0:", XUSBHDFSD_CHECK_CLUSTER_CHAIN, &startCluster, 4, NULL, 0) == 0) { - guiMsgBox(_l(_STR_ERR_FRAGMENTED), 0, NULL); - return; + fileXioClose(fd); + //Game is fragmented. Do not continue. + if (settings != NULL) + sbUnprepare(&settings->common); + + guiMsgBox(_l(_STR_ERR_FRAGMENTED), 0, NULL); + return; + } } if ((gPS2Logo) && (i == 0)) From 61f6b92d925f20a735c5813c7d90dcbd492deac3 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 16 Jul 2017 01:50:21 -0700 Subject: [PATCH 049/269] Developer @rickgaiser made the following changes: (1) dia: separate lines do not scale to higher resolutions - Lines will always be 1 pixel height, so they do not scale well when - upscaling to 1080i. Using rmDrawRect scales well, and is faster too. (2) dia: Fix dark background on keyboard input dialog (3) renderman: pixel perfect texture mapping - This causes texture bleeding for fonts. So add one pixel barrier to font atlas allocation. (4) renderman: use gsKit_prim_sprite instead of gsKit_prim_quad (5) Fix alpha value handling - Alpha values on the GS use 0x80 for solid colors instead of the more standard 0xff. Colors do range from 0 to 0xff. - To make things more difficult, when multiplying a texture color both a color and alpha value of 0x80 represent 1.0. (6) renderman: do not switch primitive contexts --- DETAILED_CHANGELOG | 1 + README.md | 8 +++++-- src/atlas.c | 4 ++-- src/dia.c | 26 ++++++++++---------- src/fntsys.c | 4 ++-- src/gui.c | 23 ++++++++---------- src/renderman.c | 59 +++++++++++++++++++++++++--------------------- src/themes.c | 14 +++++------ 8 files changed, 74 insertions(+), 65 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 368e9d9ca..915893167 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1007 - Jay-Jay-OPL - Following changes were made: SP193: Fix for HDD deinit, avoid linking to thread and TLB patches and updated IOP reboot code. (#51) * Close all files upon deinit of HDD support, to prevent potential risks of corrupting the HDD. * Updated calls to Exit, LoadExecPS2 and ExecPS2, and added custom kernel syscall definitions to avoid linking to the new kernel patches. * Updated SifIopReset to not use NULL as an argument and to support the new SIFCMD header. - Wed Jul 12 02:09:51 2017 -0700 rev1006 - Jay-Jay-OPL - define DB custom changes - Tue Jul 11 18:44:42 2017 -0700 rev1005 - Jay-Jay-OPL - belek66 did the following changes: - use module export table to reset ds3 (remove pademu rpc in ee_core) - use thread to read data/set vibration in ds3bt module (can be disabled in Makefile) - emulating analog button (changing pad mode by pressing PS+START buttons) - option to compile pademu modules without using sms_utils (remove -DUSE_SMSUTILS in Makefile) to make them usable in others apps - in gui: saving bt adapter mac address, now pairing DS3 is posible without connected bt adapter - Fri Jun 23 22:07:32 2017 -0700 rev1004 - Jay-Jay-OPL - small edit to credits. - Tue May 30 23:11:06 2017 -0700 diff --git a/README.md b/README.md index c1156d7e4..cd587cd7e 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,15 @@ format. It's now the most compatible homebrew loader. OPL is also developed continuously - anyone can contribute improvements to the project due to its open source nature. -You can visit the Open PS2 Loader forum at: +You can visit the Open PS2 Loader forums at: + +http://www.ps2-home.com/forum/viewforum.php?f=13 http://psx-scene.com/forums/official-open-ps2-loader-forum/ -For updated compatibility list, you can visit OPL-CL site at: +For updated compatibility lists, you can visit OPL-CL site at: + +http://www.ps2-home.com/forum/page/opl-game-compatibility-list-1 http://sx.sytes.net/oplcl/games.aspx diff --git a/src/atlas.c b/src/atlas.c index 4dfd7eb02..9efa106b4 100644 --- a/src/atlas.c +++ b/src/atlas.c @@ -1,7 +1,7 @@ /* Copyright 2010, Volca Licenced under Academic Free License version 3.0 - Review OpenUsbLd README & LICENSE files for further details. + Review OpenUsbLd README & LICENSE files for further details. */ #include @@ -167,7 +167,7 @@ struct atlas_allocation_t *atlasPlace(atlas_t *atlas, size_t width, size_t heigh if (!surface) return NULL; - struct atlas_allocation_t *al = allocPlace(atlas->allocation, width, height); + struct atlas_allocation_t *al = allocPlace(atlas->allocation, width+1, height+1); if (!al) return NULL; diff --git a/src/dia.c b/src/dia.c index 333f87d06..deae593b2 100644 --- a/src/dia.c +++ b/src/dia.c @@ -39,10 +39,12 @@ static int screenHeight; static void diaDrawBoundingBox(int x, int y, int w, int h, int focus) { - if (focus) - rmDrawRect(x - 5, y, w + 10, h + 10, gTheme->selTextColor & gColFocus); - else - rmDrawRect(x - 5, y, w + 10, h + 10, gTheme->textColor & gColFocus); + u64 color = focus ? gTheme->selTextColor : gTheme->textColor; + + color |= GS_SETREG_RGBA(0, 0, 0, 0xFF); + color &= gColFocus; + + rmDrawRect(x - 5, y, w + 10, h + 10, color); } int diaShowKeyb(char *text, int maxLen, int hide_text) @@ -70,6 +72,8 @@ int diaShowKeyb(char *text, int maxLen, int hide_text) cmdicons[2] = thmGetTexture(START_ICON); cmdicons[3] = thmGetTexture(SELECT_ICON); + rmGetScreenExtents(&screenWidth, &screenHeight); + if (hide_text) { if ((mask_buffer = malloc(maxLen)) != NULL) { memset(mask_buffer, '*', len); @@ -90,8 +94,7 @@ int diaShowKeyb(char *text, int maxLen, int hide_text) fntRenderString(gTheme->fonts[0], 50, 120, ALIGN_NONE, 0, 0, hide_text ? mask_buffer : text, gTheme->textColor); // separating line for simpler orientation - rmDrawLine(25, 138, 615, 138, gColWhite); - rmDrawLine(25, 139, 615, 139, gColWhite); + rmDrawRect(25, 138, 590, 2, gColWhite); for (j = 0; j < KEYB_HEIGHT; j++) { for (i = 0; i < KEYB_WIDTH; i++) { @@ -257,7 +260,7 @@ static int diaShowColSel(unsigned char *r, unsigned char *g, unsigned char *b) rmDrawRect(0, 0, screenWidth, screenHeight, gColDarker); // "Color selection" - fntRenderString(gTheme->fonts[0], 50, 50, ALIGN_NONE, 0, 0, _l(_STR_COLOR_SELECTION), GS_SETREG_RGBA(0x060, 0x060, 0x060, 0x060)); + fntRenderString(gTheme->fonts[0], 50, 50, ALIGN_NONE, 0, 0, _l(_STR_COLOR_SELECTION), GS_SETREG_RGBA(0x60, 0x60, 0x60, 0x80)); // 3 bars representing the colors... size_t co; @@ -273,9 +276,9 @@ static int diaShowColSel(unsigned char *r, unsigned char *g, unsigned char *b) u64 dcol = GS_SETREG_RGBA(cc[0], cc[1], cc[2], 0x80); if (selc == co) - rmDrawRect(x, y, 200, 20, GS_SETREG_RGBA(0x060, 0x060, 0x060, 0x60)); + rmDrawRect(x, y, 200, 20, GS_SETREG_RGBA(0x60, 0x60, 0x60, 0x80)); else - rmDrawRect(x, y, 200, 20, GS_SETREG_RGBA(0x020, 0x020, 0x020, 0x60)); + rmDrawRect(x, y, 200, 20, GS_SETREG_RGBA(0x20, 0x20, 0x20, 0x80)); rmDrawRect(x + 2, y + 2, 190.0f * (cc[co] * 100 / 255) / 100, 16, dcol); } @@ -286,7 +289,7 @@ static int diaShowColSel(unsigned char *r, unsigned char *g, unsigned char *b) x = 300; y = 75; - rmDrawRect(x, y, 70, 70, GS_SETREG_RGBA(0x060, 0x060, 0x060, 0x60)); + rmDrawRect(x, y, 70, 70, GS_SETREG_RGBA(0x60, 0x60, 0x60, 0x80)); rmDrawRect(x + 5, y + 5, 60, 60, dcol); guiDrawIconAndText(gSelectButton == KEY_CIRCLE ? CIRCLE_ICON : CROSS_ICON, _STR_OK, gTheme->fonts[0], 420, 417, gTheme->selTextColor); @@ -411,8 +414,7 @@ static void diaRenderItem(int x, int y, struct UIItem *item, int selected, int h ypos &= ~1; // two lines for lesser eye strain :) - rmDrawLine(x, ypos, x + UI_BREAK_LEN, ypos, gColWhite); - rmDrawLine(x, ypos + 1, x + UI_BREAK_LEN, ypos + 1, gColWhite); + rmDrawRect(x, ypos, UI_BREAK_LEN, 2, gColWhite); break; } diff --git a/src/fntsys.c b/src/fntsys.c index 56c1e481d..f9ac7fc36 100644 --- a/src/fntsys.c +++ b/src/fntsys.c @@ -178,9 +178,9 @@ static void fntPrepareCLUT() size_t i; u32 *clut = fontClut.Clut; for (i = 0; i < 256; ++i) { - u8 alpha = i > 0x080 ? 0x080 : i; + u8 alpha = (i*128)/255; - *clut = alpha << 24 | i << 16 | i << 8 | i; + *clut = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, alpha); clut++; } } diff --git a/src/gui.c b/src/gui.c index bc9106e23..68f4ed26c 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1533,26 +1533,23 @@ static void guiDrawBusy() if (gTheme->loadingIcon) { GSTEXTURE *texture = thmGetTexture(LOAD0_ICON + (guiFrameId >> 1) % gTheme->loadingIconCount); if (texture && texture->Mem) { - u64 mycolor = GS_SETREG_RGBA(0x080, 0x080, 0x080, bfadeout); + u64 mycolor = GS_SETREG_RGBA(0x80, 0x80, 0x80, bfadeout); rmDrawPixmap(texture, gTheme->loadingIcon->posX, gTheme->loadingIcon->posY, gTheme->loadingIcon->aligned, gTheme->loadingIcon->width, gTheme->loadingIcon->height, gTheme->loadingIcon->scaled, mycolor); } } } -static int wfadeout = 0x0150; +static int wfadeout = 0x80; static void guiRenderGreeting() { - int fade = wfadeout > 0xFF ? 0xFF : wfadeout; - u64 mycolor = GS_SETREG_RGBA(0x10, 0x10, 0x10, fade >> 1); + u64 mycolor = GS_SETREG_RGBA(0x00, 0x00, 0x00, wfadeout); rmDrawRect(0, 0, screenWidth, screenHeight, mycolor); GSTEXTURE *logo = thmGetTexture(LOGO_PICTURE); if (logo) { - mycolor = GS_SETREG_RGBA(0x080, 0x080, 0x080, fade >> 1); + mycolor = GS_SETREG_RGBA(0x80, 0x80, 0x80, wfadeout); rmDrawPixmap(logo, screenWidth >> 1, gTheme->usedHeight >> 1, ALIGN_CENTER, logo->Width, logo->Height, SCALING_RATIO, mycolor); } - - return; } static float mix(float a, float b, float t) @@ -1730,13 +1727,13 @@ void guiDrawBGPlasma() for (y = pery; y < ymax; y++) { for (x = 0; x < PLASMA_W; x++) { - u32 fper = guiCalcPerlin((float)(2 * x) / PLASMA_W, (float)(2 * y) / PLASMA_H, perz) * 0x080 + 0x080; + u32 fper = guiCalcPerlin((float)(2 * x) / PLASMA_W, (float)(2 * y) / PLASMA_H, perz) * 0x80 + 0x80; *buf = GS_SETREG_RGBA( (u32)(fper * curbgColor[0]) >> 8, (u32)(fper * curbgColor[1]) >> 8, (u32)(fper * curbgColor[2]) >> 8, - 0x080); + 0x80); ++buf; } @@ -1770,7 +1767,7 @@ static void guiDrawOverlays() else bfadeout = 0x0; } else { - if (bfadeout < 0x080) + if (bfadeout < 0x80) bfadeout += 0x08; } @@ -1786,7 +1783,7 @@ static void guiDrawOverlays() else snprintf(fps, sizeof(fps), "%3d ms ----- FPS", time_render); - fntRenderString(gTheme->fonts[0], screenWidth - 90, 30, ALIGN_CENTER, 0, 0, fps, GS_SETREG_RGBA(0x060, 0x060, 0x060, 0x060)); + fntRenderString(gTheme->fonts[0], screenWidth - 90, 30, ALIGN_CENTER, 0, 0, fps, GS_SETREG_RGBA(0x60, 0x60, 0x60, 0x80)); #endif // Last Played Auto Start @@ -1797,7 +1794,7 @@ static void guiDrawOverlays() CronCurrent = clock() / CLOCKS_PER_SEC; RemainSecs = gAutoStartLastPlayed - (CronCurrent - CronStart); snprintf(strAutoStartInNSecs, sizeof(strAutoStartInNSecs), _l(_STR_AUTO_START_IN_N_SECS), RemainSecs); - fntRenderString(gTheme->fonts[0], screenWidth / 2, screenHeight / 2, ALIGN_CENTER, 0, 0, strAutoStartInNSecs, GS_SETREG_RGBA(0x060, 0x060, 0x060, 0x060)); + fntRenderString(gTheme->fonts[0], screenWidth / 2, screenHeight / 2, ALIGN_CENTER, 0, 0, strAutoStartInNSecs, GS_SETREG_RGBA(0x60, 0x60, 0x60, 0x80)); } } @@ -1856,7 +1853,7 @@ void guiIntroLoop(void) guiReadPads(); - if (wfadeout < 0x0FF) + if (wfadeout < 0x80) guiShow(); if (gInitComplete) diff --git a/src/renderman.c b/src/renderman.c index c1398f7a7..bc93606a0 100644 --- a/src/renderman.c +++ b/src/renderman.c @@ -57,12 +57,12 @@ static float aspectHeight; static float transX = 0; static float transY = 0; -const u64 gColWhite = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, 0x00); -const u64 gColBlack = GS_SETREG_RGBA(0x00, 0x00, 0x00, 0x00); -const u64 gColDarker = GS_SETREG_RGBA(0x00, 0x00, 0x00, 0x60); -const u64 gColFocus = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, 0x50); +const u64 gColWhite = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, 0x80); // Alpha 0x80 -> solid white +const u64 gColBlack = GS_SETREG_RGBA(0x00, 0x00, 0x00, 0x80); // Alpha 0x80 -> solid black +const u64 gColDarker = GS_SETREG_RGBA(0x00, 0x00, 0x00, 0x60); // Alpha 0x60 -> transparent overlay color +const u64 gColFocus = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, 0x50); // Alpha 0x50 -> transparent overlay color -const u64 gDefaultCol = GS_SETREG_RGBA(0x80, 0x80, 0x80, 0x80); +const u64 gDefaultCol = GS_SETREG_RGBA(0x80, 0x80, 0x80, 0x80); // Special color for texture multiplication const u64 gDefaultAlpha = GS_SETREG_ALPHA(0, 1, 0, 1, 0); static float shiftYVal; @@ -278,7 +278,6 @@ void rmEndFrame(void) gsGlobal->Width / 64, gsGlobal->PSM, 0, 0); gsGlobal->ActiveBuffer ^= 1; - gsGlobal->PrimContext ^= 1; } } @@ -357,6 +356,7 @@ int rmSetMode(int force) gsKit_mode_switch(gsGlobal, GS_ONESHOT); gsKit_set_test(gsGlobal, GS_ZTEST_OFF); + gsKit_set_primalpha(gsGlobal, gDefaultAlpha, 0); // reset the contents of the screen to avoid garbage being displayed gsKit_clear(gsGlobal, gColBlack); @@ -436,18 +436,17 @@ void rmDrawQuad(rm_quad_t *q) if (!rmPrepareTexture(q->txt)) // won't render if not ready! return; - if ((q->txt->PSM == GS_PSM_CT32) || (q->txt->Clut && q->txt->ClutPSM == GS_PSM_CT32)) { - gsKit_set_primalpha(gsGlobal, gDefaultAlpha, 0); - } + if ((q->txt->PSM == GS_PSM_CT32) || (q->txt->Clut && q->txt->ClutPSM == GS_PSM_CT32)) + gsGlobal->PrimAlphaEnable = GS_SETTING_ON; + else + gsGlobal->PrimAlphaEnable = GS_SETTING_OFF; gsKit_prim_sprite_texture(gsGlobal, q->txt, - q->ul.x + transX, q->ul.y + transY, - q->ul.u + 0.5f, q->ul.v + 0.5f, - q->br.x + transX, q->br.y + transY, - q->br.u - 0.375f, q->br.v + 0.375f, order, q->color); + q->ul.x + transX - 0.5f, q->ul.y + transY - 0.5f, + q->ul.u, q->ul.v, + q->br.x + transX - 0.5f, q->br.y + transY - 0.5f, + q->br.u, q->br.v, order, q->color); order++; - - gsKit_set_primalpha(gsGlobal, GS_BLEND_BACK2FRONT, 0); } void rmDrawPixmap(GSTEXTURE *txt, int x, int y, short aligned, int w, int h, short scaled, u64 color) @@ -460,37 +459,43 @@ void rmDrawPixmap(GSTEXTURE *txt, int x, int y, short aligned, int w, int h, sho void rmDrawOverlayPixmap(GSTEXTURE *overlay, int x, int y, short aligned, int w, int h, short scaled, u64 color, GSTEXTURE *inlay, int ulx, int uly, int urx, int ury, int blx, int bly, int brx, int bry) { - rm_quad_t quad; rmSetupQuad(overlay, x, y, aligned, w, h, scaled, color, &quad); if (!rmPrepareTexture(inlay)) return; - if (inlay->PSM == GS_PSM_CT32) - gsKit_set_primalpha(gsGlobal, gDefaultAlpha, 0); - - gsKit_prim_quad_texture(gsGlobal, inlay, quad.ul.x + transX + aspectWidth * ulx, quad.ul.y + transY + uly, 0.5f, 0.5f, - quad.ul.x + transX + aspectWidth * urx, quad.ul.y + transY + ury, inlay->Width - 0.375f, 0.5f, - quad.ul.x + transX + aspectWidth * blx, quad.ul.y + transY + bly, 0.5f, inlay->Height - 0.375f, - quad.ul.x + transX + aspectWidth * brx, quad.ul.y + transY + bry, inlay->Width - 0.375f, inlay->Height - 0.375f, order, gDefaultCol); + if ((inlay->PSM == GS_PSM_CT32) || (inlay->Clut && inlay->ClutPSM == GS_PSM_CT32)) + gsGlobal->PrimAlphaEnable = GS_SETTING_ON; + else + gsGlobal->PrimAlphaEnable = GS_SETTING_OFF; + + gsKit_prim_quad_texture(gsGlobal, inlay, + quad.ul.x + transX + aspectWidth * ulx - 0.5f, quad.ul.y + transY + uly - 0.5f, + 0.0f, 0.0f, + quad.ul.x + transX + aspectWidth * urx - 0.5f, quad.ul.y + transY + ury - 0.5f, + inlay->Width, 0.0f, + quad.ul.x + transX + aspectWidth * blx - 0.5f, quad.ul.y + transY + bly - 0.5f, + 0.0f, inlay->Height, + quad.ul.x + transX + aspectWidth * brx - 0.5f, quad.ul.y + transY + bry - 0.5f, + inlay->Width, inlay->Height, order, gDefaultCol); order++; - gsKit_set_primalpha(gsGlobal, GS_BLEND_BACK2FRONT, 0); rmDrawQuad(&quad); } void rmDrawRect(int x, int y, int w, int h, u64 color) { - gsKit_set_primalpha(gsGlobal, GS_SETREG_ALPHA(0, 1, 0, 1, 0), 0); - gsKit_prim_quad(gsGlobal, x + transX, shiftY(y) + transY, x + w + transX, shiftY(y) + transY, x + transX, shiftY(y) + h + transY, x + w + transX, shiftY(y) + h + transY, order, color); + gsGlobal->PrimAlphaEnable = GS_SETTING_ON; + gsKit_prim_sprite(gsGlobal, x + transX, shiftY(y) + transY, x + w + transX, shiftY(y) + h + transY, order, color); order++; - gsKit_set_primalpha(gsGlobal, GS_BLEND_BACK2FRONT, 0); } void rmDrawLine(int x, int y, int x1, int y1, u64 color) { + gsGlobal->PrimAlphaEnable = GS_SETTING_ON; gsKit_prim_line(gsGlobal, x + transX, shiftY(y) + transY, x1 + transX, shiftY(y1) + transY, order, color); + order++; } void rmSetDisplayOffset(int x, int y) diff --git a/src/themes.c b/src/themes.c index a883fc898..6ed189daa 100644 --- a/src/themes.c +++ b/src/themes.c @@ -621,7 +621,7 @@ static theme_element_t *initBasic(const char *themePath, config_set_t *themeConf snprintf(elemProp, sizeof(elemProp), "%s_color", name); if (configGetColor(themeConfig, elemProp, charColor)) - elem->color = GS_SETREG_RGBA(charColor[0], charColor[1], charColor[2], 0xff); + elem->color = GS_SETREG_RGBA(charColor[0], charColor[1], charColor[2], 0x80); else elem->color = color; @@ -1019,9 +1019,9 @@ static int thmLoadResource(int texId, const char *themePath, short psm, int useD static void thmSetColors(theme_t *theme) { memcpy(theme->bgColor, gDefaultBgColor, 3); - theme->textColor = GS_SETREG_RGBA(gDefaultTextColor[0], gDefaultTextColor[1], gDefaultTextColor[2], 0xff); - theme->uiTextColor = GS_SETREG_RGBA(gDefaultUITextColor[0], gDefaultUITextColor[1], gDefaultUITextColor[2], 0xff); - theme->selTextColor = GS_SETREG_RGBA(gDefaultSelTextColor[0], gDefaultSelTextColor[1], gDefaultSelTextColor[2], 0xff); + theme->textColor = GS_SETREG_RGBA(gDefaultTextColor[0], gDefaultTextColor[1], gDefaultTextColor[2], 0x80); + theme->uiTextColor = GS_SETREG_RGBA(gDefaultUITextColor[0], gDefaultUITextColor[1], gDefaultUITextColor[2], 0x80); + theme->selTextColor = GS_SETREG_RGBA(gDefaultSelTextColor[0], gDefaultSelTextColor[1], gDefaultSelTextColor[2], 0x80); theme_element_t *elem = theme->mainElems.first; while (elem) { @@ -1113,13 +1113,13 @@ static void thmLoad(const char *themePath) unsigned char color[3]; if (configGetColor(themeConfig, "text_color", color)) - newT->textColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0xff); + newT->textColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0x80); if (configGetColor(themeConfig, "ui_text_color", color)) - newT->uiTextColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0xff); + newT->uiTextColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0x80); if (configGetColor(themeConfig, "sel_text_color", color)) - newT->selTextColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0xff); + newT->selTextColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0x80); // before loading the element definitions, we have to have the fonts prepared // for that, we load the fonts and a translation table From 0dd6fcec884e93b5f76c4179e4eec0a302a1fa0b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 17 Jul 2017 05:47:18 -0700 Subject: [PATCH 050/269] Developer SP193 made the following changes... - (In-game ATAD) re-added workaround for some clone adaptors. #58 --- DETAILED_CHANGELOG | 1 + modules/iopcore/cdvdman/atad.c | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 915893167..b7765ce6e 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1008 - Jay-Jay-OPL - Developer @rickgaiser made the following changes: (1) dia: separate lines do not scale to higher resolutions - Lines will always be 1 pixel height, so they do not scale well when - upscaling to 1080i. Using rmDrawRect scales well, and is faster too. - Sun Jul 16 01:50:21 2017 -0700 rev1007 - Jay-Jay-OPL - Following changes were made: SP193: Fix for HDD deinit, avoid linking to thread and TLB patches and updated IOP reboot code. (#51) * Close all files upon deinit of HDD support, to prevent potential risks of corrupting the HDD. * Updated calls to Exit, LoadExecPS2 and ExecPS2, and added custom kernel syscall definitions to avoid linking to the new kernel patches. * Updated SifIopReset to not use NULL as an argument and to support the new SIFCMD header. - Wed Jul 12 02:09:51 2017 -0700 rev1006 - Jay-Jay-OPL - define DB custom changes - Tue Jul 11 18:44:42 2017 -0700 rev1005 - Jay-Jay-OPL - belek66 did the following changes: - use module export table to reset ds3 (remove pademu rpc in ee_core) - use thread to read data/set vibration in ds3bt module (can be disabled in Makefile) - emulating analog button (changing pad mode by pressing PS+START buttons) - option to compile pademu modules without using sms_utils (remove -DUSE_SMSUTILS in Makefile) to make them usable in others apps - in gui: saving bt adapter mac address, now pairing DS3 is posible without connected bt adapter - Fri Jun 23 22:07:32 2017 -0700 diff --git a/modules/iopcore/cdvdman/atad.c b/modules/iopcore/cdvdman/atad.c index 70f59638b..65b67b3cc 100644 --- a/modules/iopcore/cdvdman/atad.c +++ b/modules/iopcore/cdvdman/atad.c @@ -108,20 +108,24 @@ static unsigned int ata_alarm_cb(void *unused); static void ata_set_dir(int dir); /* In v1.04, DMA was enabled in ata_set_dir() instead. */ -static void AtadPreDmaCb(int bcr, int dir){ +//Disabled for compatibility with some clone adaptors. +/* static void ata_pre_dma_cb(int bcr, int dir) +{ USE_SPD_REGS; SPD_REG16(SPD_R_XFR_CTRL)|=0x80; } -static void AtadPostDmaCb(int bcr, int dir){ +static void ata_post_dma_cb(int bcr, int dir) +{ USE_SPD_REGS; SPD_REG16(SPD_R_XFR_CTRL)&=~0x80; -} +} */ #ifdef DEV9_DEBUG -static int ata_create_event_flag(void) { +static int ata_create_event_flag(void) +{ iop_event_t event; /* In v1.04, EA_MULTI was specified. */ @@ -162,8 +166,9 @@ int atad_start(void) /* In v1.04, PIO mode 0 was set here. In late versions, it is set in ata_init_devices(). */ dev9RegisterIntrCb(1, &ata_intr_cb); dev9RegisterIntrCb(0, &ata_intr_cb); - dev9RegisterPreDmaCb(0, &AtadPreDmaCb); - dev9RegisterPostDmaCb(0, &AtadPostDmaCb); +/* Disabled for compatibility with some clone adaptors. + dev9RegisterPreDmaCb(0, &ata_pre_dma_cb); + dev9RegisterPostDmaCb(0, &ata_post_dma_cb); */ #ifdef VMC_DRIVER iop_sema_t smp; @@ -641,5 +646,6 @@ static void ata_set_dir(int dir) val = SPD_REG16(SPD_R_IF_CTRL) & 1; val |= (dir == ATA_DIR_WRITE) ? 0x4c : 0x4e; SPD_REG16(SPD_R_IF_CTRL) = val; - SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x6; //In v1.04, DMA was enabled here (0x86 instead of 0x6) +// SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x6; //In v1.04, DMA was enabled here (0x86 instead of 0x6) + SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x86; //Enable DMA here for compatibility with some clone adaptors. } From 9d89addacd5debf5d5a2ecd1b9f0e7b636e3b75b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 28 Jul 2017 13:40:49 -0700 Subject: [PATCH 051/269] resync repo --- DETAILED_CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index b7765ce6e..4796cf323 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1009 - Jay-Jay-OPL - Developer SP193 made the following changes... - (In-game ATAD) re-added workaround for some clone adaptors. #58 - Mon Jul 17 05:47:18 2017 -0700 rev1008 - Jay-Jay-OPL - Developer @rickgaiser made the following changes: (1) dia: separate lines do not scale to higher resolutions - Lines will always be 1 pixel height, so they do not scale well when - upscaling to 1080i. Using rmDrawRect scales well, and is faster too. - Sun Jul 16 01:50:21 2017 -0700 rev1007 - Jay-Jay-OPL - Following changes were made: SP193: Fix for HDD deinit, avoid linking to thread and TLB patches and updated IOP reboot code. (#51) * Close all files upon deinit of HDD support, to prevent potential risks of corrupting the HDD. * Updated calls to Exit, LoadExecPS2 and ExecPS2, and added custom kernel syscall definitions to avoid linking to the new kernel patches. * Updated SifIopReset to not use NULL as an argument and to support the new SIFCMD header. - Wed Jul 12 02:09:51 2017 -0700 rev1006 - Jay-Jay-OPL - define DB custom changes - Tue Jul 11 18:44:42 2017 -0700 From ab70c62bc482acf461656ad44a2feb41796bb513 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 28 Jul 2017 14:25:11 -0700 Subject: [PATCH 052/269] removed the *.s line in the .gitignore file so it stops ignoring any file with the .S extension in the repo -- as soon as I did this, the *.S files were finally noticed and Untracked files. --- .gitignore | 1 - DETAILED_CHANGELOG | 1 + ee_core/src/kernel_custom.S | 91 ++++++++++++++++++ elfldr/kernel_custom.S | 91 ++++++++++++++++++ modules/ds3bt/iop/smsutils.s | 172 ++++++++++++++++++++++++++++++++++ modules/ds3usb/iop/smsutils.s | 172 ++++++++++++++++++++++++++++++++++ 6 files changed, 527 insertions(+), 1 deletion(-) create mode 100644 ee_core/src/kernel_custom.S create mode 100644 elfldr/kernel_custom.S create mode 100644 modules/ds3bt/iop/smsutils.s create mode 100644 modules/ds3usb/iop/smsutils.s diff --git a/.gitignore b/.gitignore index b5eca8fe5..de3322bc1 100755 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,6 @@ *.o *.patch *.rej -*.s *.zip *.a diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 4796cf323..74af5fa95 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1010 - Jay-Jay-OPL - resync repo - Fri Jul 28 13:40:49 2017 -0700 rev1009 - Jay-Jay-OPL - Developer SP193 made the following changes... - (In-game ATAD) re-added workaround for some clone adaptors. #58 - Mon Jul 17 05:47:18 2017 -0700 rev1008 - Jay-Jay-OPL - Developer @rickgaiser made the following changes: (1) dia: separate lines do not scale to higher resolutions - Lines will always be 1 pixel height, so they do not scale well when - upscaling to 1080i. Using rmDrawRect scales well, and is faster too. - Sun Jul 16 01:50:21 2017 -0700 rev1007 - Jay-Jay-OPL - Following changes were made: SP193: Fix for HDD deinit, avoid linking to thread and TLB patches and updated IOP reboot code. (#51) * Close all files upon deinit of HDD support, to prevent potential risks of corrupting the HDD. * Updated calls to Exit, LoadExecPS2 and ExecPS2, and added custom kernel syscall definitions to avoid linking to the new kernel patches. * Updated SifIopReset to not use NULL as an argument and to support the new SIFCMD header. - Wed Jul 12 02:09:51 2017 -0700 diff --git a/ee_core/src/kernel_custom.S b/ee_core/src/kernel_custom.S new file mode 100644 index 000000000..00c7a9294 --- /dev/null +++ b/ee_core/src/kernel_custom.S @@ -0,0 +1,91 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# (C)2001, Gustavo Scotti (gustavo@scotti.com) +# (c) 2003 Marcus R. Brown (mrbrown@0xd6.org) +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +*/ + +/** + * @file + * EE Kernel functions + */ + +#include "syscallnr_custom.h" + + .text + .p2align 3 + +#ifdef USE_KMODE +#define SYSCALL(name) \ + .set push; \ + .set noreorder; \ + .text; \ + .align 4; \ + .globl name; \ + .type name,@function; \ + .ent name,0; \ +name: j __syscall; \ + li $3, __NR_##name;\ + nop; \ + .end name; \ + .size name,.-name; \ + .set pop; +#else +#define SYSCALL(name) \ + .set push; \ + .set noreorder; \ + .text; \ + .align 4; \ + .globl name; \ + .type name,@function; \ + .ent name,0; \ +name: li $3, __NR_##name;\ + syscall; \ + jr $31; \ + nop; \ + .end name; \ + .size name,.-name; \ + .set pop; +#endif + +#ifdef F___syscall +.set push +.set noreorder +.text +.align 4 +.globl __syscall +.type __syscall,@function +.ent __syscall,0 +__syscall: + mfc0 $2, $12 + andi $2, $2, 0x18 + beqz $2, _kMode + slt $2, $3, $0 + syscall + jr $31 + nop +_kMode: + subu $26, $0, $3 + movn $3, $26, $2 + sll $3, $3, 2 + lui $26, 0x8000 + lhu $2, 0x02F0($26) + sll $2, $2, 16 + lh $26, 0x02F8($26) + add $2, $26 + addu $3, $2 + lw $26, 0x00($3) + jr $26 + nop +.end __syscall +.size __syscall,.-__syscall +.set pop +#endif + +#ifdef F_iWakeupThread +SYSCALL(iWakeupThread) +#endif diff --git a/elfldr/kernel_custom.S b/elfldr/kernel_custom.S new file mode 100644 index 000000000..00c7a9294 --- /dev/null +++ b/elfldr/kernel_custom.S @@ -0,0 +1,91 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# (C)2001, Gustavo Scotti (gustavo@scotti.com) +# (c) 2003 Marcus R. Brown (mrbrown@0xd6.org) +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +*/ + +/** + * @file + * EE Kernel functions + */ + +#include "syscallnr_custom.h" + + .text + .p2align 3 + +#ifdef USE_KMODE +#define SYSCALL(name) \ + .set push; \ + .set noreorder; \ + .text; \ + .align 4; \ + .globl name; \ + .type name,@function; \ + .ent name,0; \ +name: j __syscall; \ + li $3, __NR_##name;\ + nop; \ + .end name; \ + .size name,.-name; \ + .set pop; +#else +#define SYSCALL(name) \ + .set push; \ + .set noreorder; \ + .text; \ + .align 4; \ + .globl name; \ + .type name,@function; \ + .ent name,0; \ +name: li $3, __NR_##name;\ + syscall; \ + jr $31; \ + nop; \ + .end name; \ + .size name,.-name; \ + .set pop; +#endif + +#ifdef F___syscall +.set push +.set noreorder +.text +.align 4 +.globl __syscall +.type __syscall,@function +.ent __syscall,0 +__syscall: + mfc0 $2, $12 + andi $2, $2, 0x18 + beqz $2, _kMode + slt $2, $3, $0 + syscall + jr $31 + nop +_kMode: + subu $26, $0, $3 + movn $3, $26, $2 + sll $3, $3, 2 + lui $26, 0x8000 + lhu $2, 0x02F0($26) + sll $2, $2, 16 + lh $26, 0x02F8($26) + add $2, $26 + addu $3, $2 + lw $26, 0x00($3) + jr $26 + nop +.end __syscall +.size __syscall,.-__syscall +.set pop +#endif + +#ifdef F_iWakeupThread +SYSCALL(iWakeupThread) +#endif diff --git a/modules/ds3bt/iop/smsutils.s b/modules/ds3bt/iop/smsutils.s new file mode 100644 index 000000000..11eb997c8 --- /dev/null +++ b/modules/ds3bt/iop/smsutils.s @@ -0,0 +1,172 @@ +/* +# ___ _ _ ___ +# | | | | | +# ___| | | ___| PS2DEV Open Source Project. +#---------------------------------------------------------- +# Highly optimized versions of memcpy/memset. +# Pulled out 'sde' library from MIPS. +# by Eugene Plotnikov +*/ +.set noreorder +.set noat +.set nomacro + +.globl mips_memcpy +.globl mips_memset + +.text +mips_memcpy: + move $v0, $a0 + beqz $a2, 1f + sltiu $t2, $a2, 12 + bnez $t2, 2f + xor $v1, $a1, $a0 + andi $v1, $v1, 3 + negu $a3, $a0 + beqz $v1, 3f + andi $a3, $a3, 3 + beqz $a3, 4f + subu $a2, $a2, $a3 + lwr $v1, 0($a1) + lwl $v1, 3($a1) + addu $a1, $a1, $a3 + swr $v1, 0($a0) + addu $a0, $a0, $a3 +4: + andi $v1, $a2, 15 + subu $a3, $a2, $v1 + beqz $a3, 5f + move $a2, $v1 + addu $a3, $a3, $a1 +6: + lwr $v1, 0($a1) + lwl $v1, 3($a1) + lwr $t0, 4($a1) + lwl $t0, 7($a1) + lwr $t1, 8($a1) + lwl $t1, 11($a1) + lwr $t2, 12($a1) + lwl $t2, 15($a1) + sw $v1, 0($a0) + sw $t0, 4($a0) + sw $t1, 8($a0) + addiu $a1, $a1, 16 + addiu $a0, $a0, 16 + bne $a1, $a3, 6b + sw $t2, -4($a0) +5: + andi $v1, $a2, 3 + subu $a3, $a2, $v1 + beqz $a3, 2f + move $a2, $v1 + addu $a3, $a3, $a1 +7: + lwr $v1, 0($a1) + lwl $v1, 3($a1) + addiu $a1, $a1, 4 + addiu $a0, $a0, 4 + bne $a1, $a3, 7b + sw $v1, -4($a0) + b 2f + nop +3: + beqz $a3, 8f + subu $a2, $a2, $a3 + lwr $v1, 0($a1) + addu $a1, $a1, $a3 + swr $v1, 0($a0) + addu $a0, $a0, $a3 +8: + andi $v1, $a2, 15 + subu $a3, $a2, $v1 + beqz $a3, 9f + move $a2, $v1 + addu $a3, $a3, $a1 +10: + lw $v1, 0($a1) + lw $t0, 4($a1) + lw $t1, 8($a1) + lw $t2, 12($a1) + sw $v1, 0($a0) + sw $t0, 4($a0) + sw $t1, 8($a0) + addiu $a1, $a1, 16 + addiu $a0, $a0, 16 + bne $a1, $a3, 10b + sw $t2, -4($a0) +9: + andi $v1, $a2, 3 + subu $a3, $a2, $v1 + beqz $a3, 2f + move $a2, $v1 + addu $a3, $a3, $a1 +11: + lw $v1, 0($a1) + addiu $a1, $a1, 4 + addiu $a0, $a0, 4 + bne $a1, $a3, 11b + sw $v1, -4($a0) +2: + beqz $a2, 1f + addu $a3, $a2, $a1 +12: + lbu $v1, 0($a1) + addiu $a1, $a1, 1 + addiu $a0, $a0, 1 + bne $a1, $a3, 12b + sb $v1, -1($a0) +1: + jr $ra + +mips_memset: + move $v0, $a0 + beqz $a2, 1f + sltiu $t2, $a2, 16 + bnez $t2, 2f + andi $a1, $a1, 255 + sll $t2, $a1, 8 + or $a1, $a1, $t2 + sll $t2, $a1, 16 + or $a1, $a1, $t2 + andi $v1, $a0, 3 + beqz $v1, 3f + li $a3, 4 + subu $a3, $a3, $v1 + subu $a2, $a2, $a3 + swr $a1, 0($a0) + addu $a0, $a0, $a3 +3: + andi $v1, $a2, 15 + subu $a3, $a2, $v1 + beqz $a3, 4f + move $a2, $v1 + addu $a3, $a3, $a0 +5: + sw $a1, 0($a0) + sw $a1, 4($a0) + sw $a1, 8($a0) + addiu $a0, $a0, 16 + bne $a0, $a3, 5b + sw $a1, -4($a0) +4: + andi $v1, $a2, 3 + subu $a3, $a2, $v1 + beqz $a3, 2f + move $a2, $v1 + addu $a3, $a3, $a0 +6: + addiu $a0, $a0, 4 + bne $a0, $a3, 6b + sw $a1, -4($a0) +2: + beqz $a2, 1f + addu $a3, $a2, $a0 +7: + addiu $a0, $a0, 1 + bne $a0, $a3, 7b + sb $a1, -1($a0) +1: +_dummy: + jr $ra + nop + \ No newline at end of file diff --git a/modules/ds3usb/iop/smsutils.s b/modules/ds3usb/iop/smsutils.s new file mode 100644 index 000000000..11eb997c8 --- /dev/null +++ b/modules/ds3usb/iop/smsutils.s @@ -0,0 +1,172 @@ +/* +# ___ _ _ ___ +# | | | | | +# ___| | | ___| PS2DEV Open Source Project. +#---------------------------------------------------------- +# Highly optimized versions of memcpy/memset. +# Pulled out 'sde' library from MIPS. +# by Eugene Plotnikov +*/ +.set noreorder +.set noat +.set nomacro + +.globl mips_memcpy +.globl mips_memset + +.text +mips_memcpy: + move $v0, $a0 + beqz $a2, 1f + sltiu $t2, $a2, 12 + bnez $t2, 2f + xor $v1, $a1, $a0 + andi $v1, $v1, 3 + negu $a3, $a0 + beqz $v1, 3f + andi $a3, $a3, 3 + beqz $a3, 4f + subu $a2, $a2, $a3 + lwr $v1, 0($a1) + lwl $v1, 3($a1) + addu $a1, $a1, $a3 + swr $v1, 0($a0) + addu $a0, $a0, $a3 +4: + andi $v1, $a2, 15 + subu $a3, $a2, $v1 + beqz $a3, 5f + move $a2, $v1 + addu $a3, $a3, $a1 +6: + lwr $v1, 0($a1) + lwl $v1, 3($a1) + lwr $t0, 4($a1) + lwl $t0, 7($a1) + lwr $t1, 8($a1) + lwl $t1, 11($a1) + lwr $t2, 12($a1) + lwl $t2, 15($a1) + sw $v1, 0($a0) + sw $t0, 4($a0) + sw $t1, 8($a0) + addiu $a1, $a1, 16 + addiu $a0, $a0, 16 + bne $a1, $a3, 6b + sw $t2, -4($a0) +5: + andi $v1, $a2, 3 + subu $a3, $a2, $v1 + beqz $a3, 2f + move $a2, $v1 + addu $a3, $a3, $a1 +7: + lwr $v1, 0($a1) + lwl $v1, 3($a1) + addiu $a1, $a1, 4 + addiu $a0, $a0, 4 + bne $a1, $a3, 7b + sw $v1, -4($a0) + b 2f + nop +3: + beqz $a3, 8f + subu $a2, $a2, $a3 + lwr $v1, 0($a1) + addu $a1, $a1, $a3 + swr $v1, 0($a0) + addu $a0, $a0, $a3 +8: + andi $v1, $a2, 15 + subu $a3, $a2, $v1 + beqz $a3, 9f + move $a2, $v1 + addu $a3, $a3, $a1 +10: + lw $v1, 0($a1) + lw $t0, 4($a1) + lw $t1, 8($a1) + lw $t2, 12($a1) + sw $v1, 0($a0) + sw $t0, 4($a0) + sw $t1, 8($a0) + addiu $a1, $a1, 16 + addiu $a0, $a0, 16 + bne $a1, $a3, 10b + sw $t2, -4($a0) +9: + andi $v1, $a2, 3 + subu $a3, $a2, $v1 + beqz $a3, 2f + move $a2, $v1 + addu $a3, $a3, $a1 +11: + lw $v1, 0($a1) + addiu $a1, $a1, 4 + addiu $a0, $a0, 4 + bne $a1, $a3, 11b + sw $v1, -4($a0) +2: + beqz $a2, 1f + addu $a3, $a2, $a1 +12: + lbu $v1, 0($a1) + addiu $a1, $a1, 1 + addiu $a0, $a0, 1 + bne $a1, $a3, 12b + sb $v1, -1($a0) +1: + jr $ra + +mips_memset: + move $v0, $a0 + beqz $a2, 1f + sltiu $t2, $a2, 16 + bnez $t2, 2f + andi $a1, $a1, 255 + sll $t2, $a1, 8 + or $a1, $a1, $t2 + sll $t2, $a1, 16 + or $a1, $a1, $t2 + andi $v1, $a0, 3 + beqz $v1, 3f + li $a3, 4 + subu $a3, $a3, $v1 + subu $a2, $a2, $a3 + swr $a1, 0($a0) + addu $a0, $a0, $a3 +3: + andi $v1, $a2, 15 + subu $a3, $a2, $v1 + beqz $a3, 4f + move $a2, $v1 + addu $a3, $a3, $a0 +5: + sw $a1, 0($a0) + sw $a1, 4($a0) + sw $a1, 8($a0) + addiu $a0, $a0, 16 + bne $a0, $a3, 5b + sw $a1, -4($a0) +4: + andi $v1, $a2, 3 + subu $a3, $a2, $v1 + beqz $a3, 2f + move $a2, $v1 + addu $a3, $a3, $a0 +6: + addiu $a0, $a0, 4 + bne $a0, $a3, 6b + sw $a1, -4($a0) +2: + beqz $a2, 1f + addu $a3, $a2, $a0 +7: + addiu $a0, $a0, 1 + bne $a0, $a3, 7b + sb $a1, -1($a0) +1: +_dummy: + jr $ra + nop + \ No newline at end of file From c6b40630b739f4e2d008139ff4dd57b9e861fc31 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 28 Jul 2017 15:52:54 -0700 Subject: [PATCH 053/269] removed the *.irx and the duplicated *.a lines in the .gitignore file so it stops ignoring any file with the .irx extension in the repo, plus *.a was already on the list. --- .gitignore | 2 -- DETAILED_CHANGELOG | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index de3322bc1..10a9060c2 100755 --- a/.gitignore +++ b/.gitignore @@ -11,13 +11,11 @@ *.ELF *.erl *.exe -*.irx *.map *.o *.patch *.rej *.zip -*.a # # git files that we don't want to ignore even it they are dot-files diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 74af5fa95..f7c666e71 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1011 - Jay-Jay-OPL - removed the *.s line in the .gitignore file so it stops ignoring any file with the .S extension in the repo -- as soon as I did this, the *.S files were finally noticed and Untracked files. - Fri Jul 28 14:25:11 2017 -0700 rev1010 - Jay-Jay-OPL - resync repo - Fri Jul 28 13:40:49 2017 -0700 rev1009 - Jay-Jay-OPL - Developer SP193 made the following changes... - (In-game ATAD) re-added workaround for some clone adaptors. #58 - Mon Jul 17 05:47:18 2017 -0700 rev1008 - Jay-Jay-OPL - Developer @rickgaiser made the following changes: (1) dia: separate lines do not scale to higher resolutions - Lines will always be 1 pixel height, so they do not scale well when - upscaling to 1080i. Using rmDrawRect scales well, and is faster too. - Sun Jul 16 01:50:21 2017 -0700 From aef1f81abb5a4a0dfd70b1ea6bbf56ea3dfa9b69 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 29 Jul 2017 02:33:50 -0700 Subject: [PATCH 054/269] SP193 did the following changes: - Revert (In-game ATAD) re-added workaround for some clone adaptors. (#58) ElPatas1 did the followin changes: - Update PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 5 ++++- DETAILED_CHANGELOG | 1 + modules/iopcore/cdvdman/atad.c | 20 +++++++------------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 5521b8cf6..2371a5e21 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,7 +4,10 @@ Note: these are not necessarily requirements - [ ] I reformatted the code with clang-format - [ ] I checked to make sure my submission worked -- [ ] I am the author of submission or have permission from the original author. +- [ ] I am the author of submission or have permission from the original author +- [ ] Requires update of the PS2SDK +- [ ] Requires update of the gsKit +- [ ] Others (please specify below) ## Pull Request description diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index f7c666e71..9216e3802 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1012 - Jay-Jay-OPL - removed the *.irx and the duplicated *.a lines in the .gitignore file so it stops ignoring any file with the .irx extension in the repo, plus *.a was already on the list. - Fri Jul 28 15:52:54 2017 -0700 rev1011 - Jay-Jay-OPL - removed the *.s line in the .gitignore file so it stops ignoring any file with the .S extension in the repo -- as soon as I did this, the *.S files were finally noticed and Untracked files. - Fri Jul 28 14:25:11 2017 -0700 rev1010 - Jay-Jay-OPL - resync repo - Fri Jul 28 13:40:49 2017 -0700 rev1009 - Jay-Jay-OPL - Developer SP193 made the following changes... - (In-game ATAD) re-added workaround for some clone adaptors. #58 - Mon Jul 17 05:47:18 2017 -0700 diff --git a/modules/iopcore/cdvdman/atad.c b/modules/iopcore/cdvdman/atad.c index 65b67b3cc..70f59638b 100644 --- a/modules/iopcore/cdvdman/atad.c +++ b/modules/iopcore/cdvdman/atad.c @@ -108,24 +108,20 @@ static unsigned int ata_alarm_cb(void *unused); static void ata_set_dir(int dir); /* In v1.04, DMA was enabled in ata_set_dir() instead. */ -//Disabled for compatibility with some clone adaptors. -/* static void ata_pre_dma_cb(int bcr, int dir) -{ +static void AtadPreDmaCb(int bcr, int dir){ USE_SPD_REGS; SPD_REG16(SPD_R_XFR_CTRL)|=0x80; } -static void ata_post_dma_cb(int bcr, int dir) -{ +static void AtadPostDmaCb(int bcr, int dir){ USE_SPD_REGS; SPD_REG16(SPD_R_XFR_CTRL)&=~0x80; -} */ +} #ifdef DEV9_DEBUG -static int ata_create_event_flag(void) -{ +static int ata_create_event_flag(void) { iop_event_t event; /* In v1.04, EA_MULTI was specified. */ @@ -166,9 +162,8 @@ int atad_start(void) /* In v1.04, PIO mode 0 was set here. In late versions, it is set in ata_init_devices(). */ dev9RegisterIntrCb(1, &ata_intr_cb); dev9RegisterIntrCb(0, &ata_intr_cb); -/* Disabled for compatibility with some clone adaptors. - dev9RegisterPreDmaCb(0, &ata_pre_dma_cb); - dev9RegisterPostDmaCb(0, &ata_post_dma_cb); */ + dev9RegisterPreDmaCb(0, &AtadPreDmaCb); + dev9RegisterPostDmaCb(0, &AtadPostDmaCb); #ifdef VMC_DRIVER iop_sema_t smp; @@ -646,6 +641,5 @@ static void ata_set_dir(int dir) val = SPD_REG16(SPD_R_IF_CTRL) & 1; val |= (dir == ATA_DIR_WRITE) ? 0x4c : 0x4e; SPD_REG16(SPD_R_IF_CTRL) = val; -// SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x6; //In v1.04, DMA was enabled here (0x86 instead of 0x6) - SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x86; //Enable DMA here for compatibility with some clone adaptors. + SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x6; //In v1.04, DMA was enabled here (0x86 instead of 0x6) } From abc81407846525f89a7017a3a88d3727a11e23e4 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 29 Jul 2017 02:52:23 -0700 Subject: [PATCH 055/269] SP193 did the following changes: - (HDPro) fixed HDPro being unable to communicate with the HDPro device: fixed DEV9 not being loaded when HDPro is used (HDD.IRX depends on it), fixed errors in command types for command matrix, removed extra writes in the EE HDPro probe function, replaced WaitEventFlag with PollEventFlag (as per the original) and added a check around PollEventFlag's return value. If desired, the HDPro can be probed for by simply loading hdproatad.irx. If it does not remain resident, then the HDPro device was not found. Special thanks to sonic0467 from psx-place. --- DETAILED_CHANGELOG | 1 + modules/iopcore/cdvdman/hdpro_atad.c | 94 ++++++++++++++-------------- modules/iopcore/cdvdman/imports.lst | 1 + src/hddsupport.c | 6 +- 4 files changed, 51 insertions(+), 51 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 9216e3802..44e84349f 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1013 - Jay-Jay-OPL - SP193 did the following changes: - Revert (In-game ATAD) re-added workaround for some clone adaptors. (#58) - Sat Jul 29 02:33:50 2017 -0700 rev1012 - Jay-Jay-OPL - removed the *.irx and the duplicated *.a lines in the .gitignore file so it stops ignoring any file with the .irx extension in the repo, plus *.a was already on the list. - Fri Jul 28 15:52:54 2017 -0700 rev1011 - Jay-Jay-OPL - removed the *.s line in the .gitignore file so it stops ignoring any file with the .S extension in the repo -- as soon as I did this, the *.S files were finally noticed and Untracked files. - Fri Jul 28 14:25:11 2017 -0700 rev1010 - Jay-Jay-OPL - resync repo - Fri Jul 28 13:40:49 2017 -0700 diff --git a/modules/iopcore/cdvdman/hdpro_atad.c b/modules/iopcore/cdvdman/hdpro_atad.c index c4b0f1387..0ee67e18e 100644 --- a/modules/iopcore/cdvdman/hdpro_atad.c +++ b/modules/iopcore/cdvdman/hdpro_atad.c @@ -3,13 +3,12 @@ Licenced under Academic Free License version 3.0 Review Open PS2 Loader README & LICENSE files for further details. - ATA Driver for the HD Pro Kit, based on original ATAD form ps2sdk: + ATA Driver for the HD Pro Kit, based on original & updated ATAD from ps2sdk: Copyright (c) 2003 Marcus R. Brown Licenced under Academic Free License version 2.0 Review ps2sdk README & LICENSE files for further details. - $Id: ps2atad.c 1455 2007-11-04 23:46:27Z roman_ps2dev $ ATA device driver. */ @@ -40,10 +39,10 @@ // HD Pro Kit is mapping the 1st word in ROM0 seg as a main ATA controller, // The pseudo ATA controller registers are accessed (input/ouput) by writing // an id to the main ATA controller (id specific to HDpro, see registers id below). -#define HDPROreg_IO8 (*(volatile unsigned char *)0xBFC00000) -#define HDPROreg_IO32 (*(volatile unsigned int *)0xBFC00000) +#define HDPROreg_IO8 (*(vu8 *)0xBFC00000) +#define HDPROreg_IO32 (*(vu32 *)0xBFC00000) -#define CDVDreg_STATUS (*(volatile unsigned char *)0xBF40200A) +#define CDVDreg_STATUS (*(vu8 *)0xBF40200A) // Pseudo ATA controller registers id - Output #define ATAreg_CONTROL_RD 0x68 @@ -87,7 +86,7 @@ static int io_sema = -1; #endif #define ATA_EV_TIMEOUT 1 -#define ATA_EV_COMPLETE 2 +#define ATA_EV_COMPLETE 2 //Unused as there is no completion interrupt /* Local device info. */ static ata_devinfo_t atad_devinfo; @@ -100,19 +99,15 @@ typedef struct _ata_cmd_info } ata_cmd_info_t; static const ata_cmd_info_t ata_cmd_table[] = { - {ATA_C_READ_DMA, 0x04}, {ATA_C_IDENTIFY_DEVICE, 0x02}, {ATA_C_IDENTIFY_PACKET_DEVICE, 0x02}, {ATA_C_SMART, 0x07}, {ATA_C_SET_FEATURES, 0x01}, - {ATA_C_READ_DMA_EXT, 0x04}, - {ATA_C_WRITE_DMA, 0x04}, {ATA_C_IDLE, 0x01}, - {ATA_C_WRITE_DMA_EXT, 0x04}, {ATA_C_READ_SECTOR, 0x02}, - {ATA_C_READ_SECTOR_EXT, 0x02}, + {ATA_C_READ_SECTOR_EXT, 0x82}, {ATA_C_WRITE_SECTOR, 0x03}, - {ATA_C_WRITE_SECTOR_EXT, 0x03}}; + {ATA_C_WRITE_SECTOR_EXT, 0x83}}; #define ATA_CMD_TABLE_SIZE (sizeof ata_cmd_table / sizeof(ata_cmd_info_t)) static const ata_cmd_info_t smart_cmd_table[] = { @@ -128,7 +123,6 @@ typedef struct _ata_cmd_state { u16 *buf16; }; u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -139,9 +133,9 @@ static int intr_state; static int hdpro_io_start(void); static int hdpro_io_finish(void); -static void hdpro_io_write(unsigned char cmd, unsigned short int val); -static int hdpro_io_read(unsigned char cmd); -static int hdpro_io_init(void); +static void hdpro_io_write(u8 cmd, u16 val); +static int hdpro_io_read(u8 cmd); +static int ata_bus_reset(void); static int gen_ata_wait_busy(int bits); static unsigned int ata_alarm_cb(void *unused) @@ -175,7 +169,7 @@ int atad_start(void) M_PRINTF(BANNER, VERSION); - event.attr = 0; + event.attr = EA_SINGLE; //In v1.04, EA_MULTI was specified. event.bits = 0; if ((ata_evflg = CreateEventFlag(&event)) < 0) { M_PRINTF("Couldn't create event flag, exiting.\n"); @@ -187,7 +181,7 @@ int atad_start(void) HDPROreg_IO8 = 0xe3; CDVDreg_STATUS = 0; - if (hdpro_io_init() != 0) + if (ata_bus_reset() != 0) goto out; #ifdef VMC_DRIVER @@ -230,10 +224,14 @@ static int gen_ata_wait_busy(int bits) hdpro_io_start(); - unsigned short int r_control = hdpro_io_read(ATAreg_CONTROL_RD); + u16 r_control = hdpro_io_read(ATAreg_CONTROL_RD); hdpro_io_finish(); + //Differs from the normal ATAD here. + if (r_control == 0xffff) + return ATA_RES_ERR_TIMEOUT; + if (!((r_control & 0xffff) & bits)) goto out; @@ -318,7 +316,7 @@ static int hdpro_io_finish(void) return hdpro_io_active ^ 1; } -static void hdpro_io_write(unsigned char cmd, unsigned short int val) +static void hdpro_io_write(u8 cmd, u16 val) { suspend_intr(); @@ -333,7 +331,7 @@ static void hdpro_io_write(unsigned char cmd, unsigned short int val) resume_intr(); } -static int hdpro_io_read(unsigned char cmd) +static int hdpro_io_read(u8 cmd) { suspend_intr(); @@ -351,7 +349,8 @@ static int hdpro_io_read(unsigned char cmd) return res0 & 0xffff; } -static int hdpro_io_init(void) +/* Reset the ATA controller/bus. */ +static int ata_bus_reset(void) { suspend_intr(); @@ -459,13 +458,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, case 6: using_timeout = 1; break; - case 4: -#ifdef VMC_DRIVER - atad_cmd_state.dir = (command != ATA_C_READ_DMA && command != ATA_C_READ_DMA_EXT); -#else - atad_cmd_state.dir = ATA_DIR_READ; -#endif - using_timeout = 1; + //Support for DMA commands (type = 4) is removed because HDPro cannot support DMA. The original HDPro driver still had code for it though. } if (using_timeout) { @@ -487,8 +480,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, /* Finally! We send off the ATA command with arguments. */ hdpro_io_write(ATAreg_CONTROL_WR, (using_timeout == 0) << 1); - - if (type & 0x80) { //For the sake of achieving (greatly) improved performance, write the registers twice only if required! + if (type & 0x80) { //For the sake of achieving improved performance, write the registers twice only if required! /* 48-bit LBA requires writing to the address registers twice, 24 bits of the LBA address is written each time. Writing to registers twice does not affect 28-bit LBA since @@ -602,35 +594,40 @@ int ata_io_finish(void) ata_cmd_state_t *cmd_state = &atad_cmd_state; u32 bits; int res = 0, type = cmd_state->type; - unsigned short int stat; + u16 stat; if (type == 1 || type == 6) { /* Non-data commands. */ - retry: - suspend_intr(); + //Unlike ATAD, poll until the device either completes its command or times out. There is no completion interrupt. + while (1) + { + suspend_intr(); - HDPROreg_IO8 = 0x21; - CDVDreg_STATUS = 0; - unsigned int ret = HDPROreg_IO8; - CDVDreg_STATUS = 0; + HDPROreg_IO8 = 0x21; + CDVDreg_STATUS = 0; + unsigned int ret = HDPROreg_IO8; + CDVDreg_STATUS = 0; - resume_intr(); + resume_intr(); - if (((ret & 0xff) & 1) == 0) { + if (((ret & 0xff) & 1) != 0) + break; - WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT|ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits); - if (bits & ATA_EV_TIMEOUT) { /* Timeout. */ - M_PRINTF("Error: ATA timeout on a non-data command.\n"); - return ATA_RES_ERR_TIMEOUT; + /* The original did not check on the return value of PollEventFlag, + but PollEventFlag does not seem to return the event flag's bits if the wait condition is not satisfied. */ + if (PollEventFlag(ata_evflg, ATA_EV_TIMEOUT|ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits) == 0) + { + if (bits & ATA_EV_TIMEOUT) { /* Timeout. */ + M_PRINTF("Error: ATA timeout on a non-data command.\n"); + return ATA_RES_ERR_TIMEOUT; + } } DelayThread(500); - goto retry; } - } else if (type == 4) { /* DMA. */ - M_PRINTF("Error: DMA mode not implemented.\n"); - res = ATA_RES_ERR_TIMEOUT; + /* Support for DMA commands (type = 4) is removed because HDPro cannot support DMA. + The original would return ATA_RES_ERR_TIMEOUT for type = 4. */ } else { /* PIO transfers. */ stat = hdpro_io_read(ATAreg_CONTROL_RD); if ((res = ata_wait_busy()) < 0) @@ -697,6 +694,7 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) command = ((dir == 1) && (ATAWRITE)) ? ATA_C_WRITE_SECTOR : ATA_C_READ_SECTOR; } + //Unlike ATAD, retry indefinitely until the I/O operation succeeds. if ((res = ata_io_start(buf, len, 0, len, sector, lcyl, hcyl, select, command)) != 0) continue; diff --git a/modules/iopcore/cdvdman/imports.lst b/modules/iopcore/cdvdman/imports.lst index 156928553..a90342bca 100755 --- a/modules/iopcore/cdvdman/imports.lst +++ b/modules/iopcore/cdvdman/imports.lst @@ -78,6 +78,7 @@ I_iClearEventFlag I_SetEventFlag I_iSetEventFlag I_WaitEventFlag +I_PollEventFlag thevent_IMPORTS_end sifman_IMPORTS_start diff --git a/src/hddsupport.c b/src/hddsupport.c index 58f585786..9a9c61ab4 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -99,8 +99,6 @@ static int hddCheckHDProKit(void) // check result if ((res & 0xff) == 0xe7) { - HDPROreg_IO8 = 0xe3; - CDVDreg_STATUS = 0; // HD Pro IO finish commands sequence HDPROreg_IO8 = 0xf3; CDVDreg_STATUS = 0; @@ -152,6 +150,9 @@ void hddLoadModules(void) if (!hddModulesLoaded) { hddModulesLoaded = 1; + //DEV9 must be loaded, as HDD.IRX depends on it. Even if not required by the I/F (i.e. HDPro) + sysInitDev9(); + // try to detect HD Pro Kit (not the connected HDD), // if detected it loads the specific ATAD module hddHDProKitDetected = hddCheckHDProKit(); @@ -159,7 +160,6 @@ void hddLoadModules(void) ret = sysLoadModuleBuffer(&hdpro_atad_irx, size_hdpro_atad_irx, 0, NULL); sysLoadModuleBuffer(&xhdd_irx, size_xhdd_irx, 6, "-hdpro"); } else { - sysInitDev9(); ret = sysLoadModuleBuffer(&ps2atad_irx, size_ps2atad_irx, 0, NULL); sysLoadModuleBuffer(&xhdd_irx, size_xhdd_irx, 0, NULL); } From a116127b6ee64206f1d138951b5f597df1374bb0 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 31 Jul 2017 14:59:00 -0700 Subject: [PATCH 056/269] belek666 made the following changes: ds3bt updates (#62) - more accurate reading, fix data request, add waiting for cmd report --- DETAILED_CHANGELOG | 1 + modules/ds3bt/iop/ds3bt.c | 284 ++++++++++++++++++++----------------- modules/ds3bt/iop/ds3bt.h | 4 +- modules/pademu/ds3bt.c | 271 ++++++++++++++++++----------------- modules/pademu/ds3bt.h | 3 +- modules/pademu/imports.lst | 3 - 6 files changed, 300 insertions(+), 266 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 44e84349f..7e0ed6e5d 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1014 - Jay-Jay-OPL - SP193 did the following changes: - (HDPro) fixed HDPro being unable to communicate with the HDPro device: fixed DEV9 not being loaded when HDPro is used (HDD.IRX depends on it), fixed errors in command types for command matrix, removed extra writes in the EE HDPro probe function, replaced WaitEventFlag with PollEventFlag (as per the original) and added a check around PollEventFlag's return value. - Sat Jul 29 02:54:58 2017 -0700 rev1013 - Jay-Jay-OPL - SP193 did the following changes: - Revert (In-game ATAD) re-added workaround for some clone adaptors. (#58) - Sat Jul 29 02:33:50 2017 -0700 rev1012 - Jay-Jay-OPL - removed the *.irx and the duplicated *.a lines in the .gitignore file so it stops ignoring any file with the .irx extension in the repo, plus *.a was already on the list. - Fri Jul 28 15:52:54 2017 -0700 rev1011 - Jay-Jay-OPL - removed the *.s line in the .gitignore file so it stops ignoring any file with the .S extension in the repo -- as soon as I did this, the *.S files were finally noticed and Untracked files. - Fri Jul 28 14:25:11 2017 -0700 diff --git a/modules/ds3bt/iop/ds3bt.c b/modules/ds3bt/iop/ds3bt.c index 95f72a512..b252da40f 100644 --- a/modules/ds3bt/iop/ds3bt.c +++ b/modules/ds3bt/iop/ds3bt.c @@ -40,6 +40,7 @@ typedef struct _bt_dev int devId; int hci_sema; int l2cap_sema; + int l2cap_cmd_sema; int controlEndp; int eventEndp; int inEndp; @@ -47,7 +48,7 @@ typedef struct _bt_dev uint8_t status; } bt_device; -bt_device bt_dev = {-1, -1, -1, -1, -1, -1, -1, DS3BT_STATE_USB_DISCONNECTED}; +bt_device bt_dev = {-1, -1, -1, -1, -1, -1, -1, -1, DS3BT_STATE_USB_DISCONNECTED}; static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint); static void bt_config_set(int result, int count, void *arg); @@ -166,6 +167,11 @@ int bt_connect(int devId) return -1; } + if ((bt_dev.l2cap_cmd_sema = CreateSema(&SemaData)) < 0) { + DPRINTF("DS3BT: Failed to allocate I/O semaphore.\n"); + return -1; + } + bt_dev.devId = devId; bt_dev.status = DS3BT_STATE_USB_AUTHORIZED; @@ -177,13 +183,19 @@ int bt_connect(int devId) int bt_disconnect(int devId) { - DPRINTF("BT: disconnect: devId=%i\n", devId); + DPRINTF("DS3BT: disconnect: devId=%i\n", devId); if (bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) { - bt_release(); + if (bt_dev.eventEndp >= 0) + UsbCloseEndpoint(bt_dev.eventEndp); - bt_dev.devId = -1; - bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; + if (bt_dev.inEndp >= 0) + UsbCloseEndpoint(bt_dev.inEndp); + + if (bt_dev.outEndp >= 0) + UsbCloseEndpoint(bt_dev.outEndp); + + bt_release(); } return 0; @@ -191,22 +203,16 @@ int bt_disconnect(int devId) static void bt_release() { - if (bt_dev.eventEndp >= 0) - UsbCloseEndpoint(bt_dev.eventEndp); - - if (bt_dev.inEndp >= 0) - UsbCloseEndpoint(bt_dev.inEndp); - - if (bt_dev.outEndp >= 0) - UsbCloseEndpoint(bt_dev.outEndp); - DeleteSema(bt_dev.hci_sema); DeleteSema(bt_dev.l2cap_sema); + DeleteSema(bt_dev.l2cap_cmd_sema); + bt_dev.devId = -1; bt_dev.eventEndp = -1; bt_dev.inEndp = -1; bt_dev.outEndp = -1; bt_dev.controlEndp = -1; + bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; } static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint) @@ -431,9 +437,9 @@ static uint8_t hci_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; static uint8_t l2cap_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; static void DS3BT_init(); -static uint8_t LED(uint8_t led, int pad); -static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad); -static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); +static int LED(uint8_t led, int pad); +static int Rumble(uint8_t lrum, uint8_t rrum, int pad); +static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); static uint8_t current_pad; static uint8_t enable_pad; @@ -509,47 +515,49 @@ static void hci_event_cb(int resultCode, int bytes, void *arg) static void l2cap_event_cb(int resultCode, int bytes, void *arg) { - uint8_t pad; + int pad; + static uint8_t ret_ctr = 0; PollSema(bt_dev.l2cap_sema); - //DPRINTF("l2cap_event_cb: res %d, bytes %d, arg %p arg %x\n", resultCode, bytes, arg, *(uint8_t *)arg); + //DPRINTF("l2cap_event_cb: res %d, bytes %d, arg %p\n", resultCode, bytes, arg); pad = L2CAP_event_task(resultCode, bytes); L2CAP_task(pad); - if (pad >= MAX_PADS) - pad = current_pad; - - if (arg != NULL) { - if (pad != (int)arg && (int)arg < MAX_PADS) { - if ((ds3pad[(int)arg].status_ & DS3BT_STATE_RUNNING)) { - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); - return; - } - } + if (pad >= MAX_PADS) { + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); + return; } - SignalSema(bt_dev.l2cap_sema); - - if (ds3pad[pad].l2cap_state_ != L2CAP_READY_STATE) { + if (ds3pad[pad].l2cap_state_ != L2CAP_READY_STATE) { //ds3 is connecting DelayThread(14000); //fix for some bt adapters - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); + } else { //ds3 is running + if ((int)arg != -1 && pad != (int)arg && (int)arg < MAX_PADS) { //check if we get what was requested + if (ret_ctr == 20) { + ret_ctr = 0; + SignalSema(bt_dev.l2cap_sema); + } else { + ret_ctr++; + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, arg); //try again + } + } else { //we got what we wanted + SignalSema(bt_dev.l2cap_sema); + } } } static void l2cap_cmd_cb(int resultCode, int bytes, void *arg) { //DPRINTF("l2cap_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - - if (ds3pad[(int)arg].status_ & DS3BT_STATE_RUNNING) - SignalSema(bt_dev.l2cap_sema); + SignalSema(bt_dev.l2cap_cmd_sema); } static void bt_config_set(int result, int count, void *arg) { UsbInterruptTransfer(bt_dev.eventEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, NULL); - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); SignalSema(bt_dev.hci_sema); SignalSema(bt_dev.l2cap_sema); @@ -749,7 +757,7 @@ static uint8_t HCI_event_task(int result) static void HCI_task(uint8_t pad) { - uint8_t i; + int i; if (pad >= MAX_PADS) return; @@ -775,9 +783,8 @@ static void HCI_task(uint8_t pad) case HCI_RESET_STATE: if (hci_command_complete) { DPRINTF("HCI Reset complete\n"); - hci_write_scan_enable(SCAN_ENABLE_NOINQ_ENPAG); - ds3pad[pad].hci_state_ = HCI_CONNECT_IN_STATE; - hci_event_flag_ &= ~HCI_FLAG_INCOMING_REQUEST; + hci_read_bdaddr(); + ds3pad[pad].hci_state_ = HCI_READBDADDR_STATE; } if (hci_timeout) { DPRINTF("No response to HCI Reset\n"); @@ -786,6 +793,15 @@ static void HCI_task(uint8_t pad) } break; + case HCI_READBDADDR_STATE: + if (hci_read_bdaddr_complete) { + DPRINTF("HCI read bdaddres complete\n"); + hci_write_scan_enable(SCAN_ENABLE_NOINQ_ENPAG); + ds3pad[pad].hci_state_ = HCI_CONNECT_IN_STATE; + hci_event_flag_ &= ~HCI_FLAG_INCOMING_REQUEST; + } + break; + case HCI_CONNECT_IN_STATE: if (hci_incoming_connect_request) { hci_accept_connection(ds3bt_bdaddr_); @@ -819,8 +835,16 @@ static void HCI_task(uint8_t pad) if (ds3pad[pad].type != HID_THDR_SET_REPORT_OUTPUT) { ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + for (i = 0; i < MAX_PADS; i++) { + if (ds3pad[i].status_ & DS3BT_STATE_RUNNING) + break; + } + + if (i == MAX_PADS) + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); } + + SignalSema(bt_dev.l2cap_sema); } break; @@ -1010,7 +1034,7 @@ static uint8_t L2CAP_event_task(int result, int bytes) l2cap_event_status_ |= L2CAP_EV_INTERRUPT_DISCONNECT_REQ; l2cap_disconnect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); } - } else if (l2cap_disconnect_response) { + } else if (l2cap_disconnection_response) { DPRINTF("Disconnect Res DCID = 0x%x\n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; @@ -1108,8 +1132,21 @@ static void L2CAP_task(uint8_t pad) break; case L2CAP_LED_STATE: + DPRINTF("L2CAP_LED\n"); + if (hid_command_success) { + if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { + ds3pad[pad].l2cap_state_ = L2CAP_LED_STATE_END; + } else { + ds3pad[pad].l2cap_state_ = L2CAP_READY_STATE; + ds3pad[pad].status_ |= DS3BT_STATE_RUNNING; + } + LEDRumble((pad + 1) << 1, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); + } + break; + + case L2CAP_LED_STATE_END: + DPRINTF("L2CAP_LED_END\n"); if (hid_command_success) { - LED((pad + 1) << 1, pad); ds3pad[pad].l2cap_state_ = L2CAP_READY_STATE; ds3pad[pad].status_ |= DS3BT_STATE_RUNNING; } @@ -1225,6 +1262,8 @@ static uint8_t l2cap_disconnection_request(uint8_t rxid, uint16_t scid, uint16_t static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) { + PollSema(bt_dev.l2cap_cmd_sema); + l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length @@ -1237,7 +1276,7 @@ static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) mips_memcpy(&l2cap_cmd_buf[8], data, length); // output on endpoint 2 - return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), NULL, NULL); + return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), l2cap_cmd_cb, NULL); } /************************************************************/ @@ -1246,19 +1285,19 @@ static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) static uint8_t initPSController(int pad) { - uint8_t header = 2; - uint8_t init_buf[header + PS3_F4_REPORT_LEN]; + uint8_t init_buf[2 + PS3_F4_REPORT_LEN]; uint8_t i; init_buf[0] = HID_THDR_SET_REPORT_FEATURE; // THdr init_buf[1] = PS3_F4_REPORT_ID; // Report ID for (i = 0; i < PS3_F4_REPORT_LEN; i++) { - init_buf[header + i] = (uint8_t)feature_F4_report[i]; + init_buf[2 + i] = (uint8_t)feature_F4_report[i]; } - return writeReport((uint8_t *)init_buf, header + PS3_F4_REPORT_LEN, pad); + return writeReport((uint8_t *)init_buf, 2 + PS3_F4_REPORT_LEN, pad); } + #define DATA_START 11 static void readReport(uint8_t *data, int bytes, int pad) @@ -1327,6 +1366,8 @@ static void readReport(uint8_t *data, int bytes, int pad) static uint8_t writeReport(uint8_t *data, uint8_t length, int pad) { + PollSema(bt_dev.l2cap_cmd_sema); + l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length @@ -1344,7 +1385,7 @@ static uint8_t writeReport(uint8_t *data, uint8_t length, int pad) return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), l2cap_cmd_cb, (void *)pad); } // writeReport -static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) +static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) { uint8_t led_buf[PS3_01_REPORT_LEN + 2]; @@ -1353,6 +1394,11 @@ static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) mips_memcpy(&led_buf[2], output_01_report, sizeof(output_01_report)); // PS3_01_REPORT_LEN); + if (ds3pad[pad].type == 0xA2) { + if(rrum < 5) + rrum = 0; + } + led_buf[2 + 1] = 0xFE; //rt led_buf[2 + 2] = rrum; //rp led_buf[2 + 3] = 0xFE; //lt @@ -1372,28 +1418,46 @@ static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) ds3pad[pad].oldlrumble = lrum; ds3pad[pad].oldrrumble = rrum; - return writeReport((uint8_t *)led_buf, sizeof(output_01_report) /*PS3_01_REPORT_LEN*/ + 2, pad); + return writeReport((uint8_t *)led_buf, sizeof(output_01_report) + 2, pad); } /************************************************************/ /* DS3BT Commands */ /************************************************************/ -static uint8_t LED(uint8_t led, int pad) +static int LEDRUM(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) { - return LEDRumble(led, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); + int ret; + + ret = LEDRumble(led, lrum, rrum, pad); + if (ret == USB_RC_OK) { + WaitSema(bt_dev.l2cap_cmd_sema); + if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { + WaitSema(bt_dev.l2cap_sema); + do { + ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); + if (ret == USB_RC_OK) + WaitSema(bt_dev.l2cap_sema); + else + break; + } while (!hid_command_success); + + SignalSema(bt_dev.l2cap_sema); + } + } + else + DPRINTF("DS3BT: LEDRumble usb transfer error %d\n", ret); + + return ret; } -static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad) +static int LED(uint8_t led, int pad) { - uint8_t ret; + return LEDRUM(led, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); +} - ret = LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); - WaitSema(bt_dev.l2cap_sema); - if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); - WaitSema(bt_dev.l2cap_sema); - } - return ret; +static int Rumble(uint8_t lrum, uint8_t rrum, int pad) +{ + return LEDRUM(ds3pad[pad].oldled, lrum, rrum, pad); } void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port) @@ -1404,13 +1468,7 @@ void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port) if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) return; - WaitSema(bt_dev.hci_sema); - WaitSema(bt_dev.l2cap_sema); - Rumble(lrum, rrum, port); - - SignalSema(bt_dev.hci_sema); - SignalSema(bt_dev.l2cap_sema); } void ds3bt_set_led(uint8_t led, int port) @@ -1421,95 +1479,74 @@ void ds3bt_set_led(uint8_t led, int port) if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) return; - WaitSema(bt_dev.hci_sema); - WaitSema(bt_dev.l2cap_sema); - LED(led, port); - - SignalSema(bt_dev.hci_sema); - SignalSema(bt_dev.l2cap_sema); } int ds3bt_get_bdaddr(uint8_t *data) { - uint8_t i; - int ret = 0; - - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) || (ds3pad[0].status_ & DS3BT_STATE_RUNNING)) + if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) return 0; - WaitSema(bt_dev.hci_sema); - - hci_read_bdaddr(); - - WaitSema(bt_dev.hci_sema); - - for (i = 0; i < 10; i++) { - if (hci_read_bdaddr_complete) { - mips_memcpy(data, dg_bdaddr, 6); - ret = 1; - break; - } - - DelayThread(100); + if (hci_read_bdaddr_complete) { + mips_memcpy(data, dg_bdaddr, 6); + return 1; } - SignalSema(bt_dev.hci_sema); - - return ret; + return 0; } void ds3bt_get_data(char *dst, int size, int port) { + int ret; + if (port >= MAX_PADS) return; if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) return; - WaitSema(bt_dev.hci_sema); WaitSema(bt_dev.l2cap_sema); - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)port); + ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)port); - WaitSema(bt_dev.l2cap_sema); + if (ret == USB_RC_OK) + WaitSema(bt_dev.l2cap_sema); + else + DPRINTF("DS3BT: ds3bt_get_data usb transfer error %d\n", ret); mips_memcpy(dst, ds3pad[port].data, size); - SignalSema(bt_dev.hci_sema); SignalSema(bt_dev.l2cap_sema); } void ds3bt_reset() { - uint8_t i; + int pad, ret; if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) return; - for (i = 0; i < MAX_PADS; i++) { - WaitSema(bt_dev.hci_sema); - WaitSema(bt_dev.l2cap_sema); + for (pad = 0; pad < MAX_PADS; pad++) { + if ((ds3pad[pad].status_ & DS3BT_STATE_CONNECTED) || (ds3pad[pad].status_ & DS3BT_STATE_RUNNING)) { + ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; + ds3pad[pad].l2cap_state_ = L2CAP_DOWN_STATE; - if ((ds3pad[i].status_ & DS3BT_STATE_CONNECTED) || (ds3pad[i].status_ & DS3BT_STATE_RUNNING)) { - ds3pad[i].status_ &= ~DS3BT_STATE_RUNNING; - ds3pad[i].l2cap_state_ = L2CAP_DOWN_STATE; + ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); - if (ds3pad[i].type == HID_THDR_SET_REPORT_OUTPUT) { - l2cap_disconnection_request((uint8_t)(l2cap_txid_++), interrupt_scid_, ds3pad[i].interrupt_dcid_, i); - WaitSema(bt_dev.l2cap_sema); + if (ret == USB_RC_OK) WaitSema(bt_dev.l2cap_sema); - } - else { - hci_disconnect(ds3pad[i].hci_handle_); + else + DPRINTF("DS3BT: ds3bt_get_data usb transfer error %d\n", ret); + + if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { + l2cap_disconnection_request((uint8_t)(l2cap_txid_++), interrupt_scid_, ds3pad[pad].interrupt_dcid_, pad); + WaitSema(bt_dev.l2cap_cmd_sema); + } else { + hci_disconnect(ds3pad[pad].hci_handle_); } WaitSema(bt_dev.hci_sema); } - - SignalSema(bt_dev.hci_sema); - SignalSema(bt_dev.l2cap_sema); } DS3BT_init(); @@ -1523,19 +1560,8 @@ int ds3bt_get_status(int port) { int status = bt_dev.status; - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) - return status; - - if (port >= MAX_PADS) - return status; - - WaitSema(bt_dev.hci_sema); - WaitSema(bt_dev.l2cap_sema); - - status |= ds3pad[port].status_; - - SignalSema(bt_dev.hci_sema); - SignalSema(bt_dev.l2cap_sema); + if ((status & DS3BT_STATE_USB_AUTHORIZED) && (port < MAX_PADS)) + status |= ds3pad[port].status_; return status; } diff --git a/modules/ds3bt/iop/ds3bt.h b/modules/ds3bt/iop/ds3bt.h index 97cd8161e..19c833213 100644 --- a/modules/ds3bt/iop/ds3bt.h +++ b/modules/ds3bt/iop/ds3bt.h @@ -15,6 +15,7 @@ enum eHCI { /* Bluetooth HCI states for HCI_task() */ HCI_INIT_STATE = 0, HCI_RESET_STATE, + HCI_READBDADDR_STATE, HCI_CONNECT_IN_STATE, HCI_CHANGE_CONNECTION, HCI_READ_REMOTE_SUPPORTED_FEATURES, @@ -87,6 +88,7 @@ enum eL2CAP { L2CAP_INTERRUPT_CONFIGURING_STATE, L2CAP_CONNECTED_STATE, L2CAP_LED_STATE, + L2CAP_LED_STATE_END, L2CAP_READY_STATE, L2CAP_DISCONNECT_STATE, @@ -249,7 +251,7 @@ enum eBUF_SIZE { #define l2cap_interrupt_disconnected (l2cap_event_status_ & L2CAP_EV_INTERRUPT_DISCONNECT_REQ) /* Macros for L2CAP event task tests */ -#define acl_handle_ok(handle) ((l2cap_buf[0] | (l2cap_buf[1] << 8)) == ((handle & 0x0FFF) | 0x2000)) +#define acl_handle_ok(handle) (((l2cap_buf[0] | (l2cap_buf[1] << 8)) & 0x0FFF) == (handle & 0x0FFF)) #define l2cap_control ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == 0x0001) // Channel ID for ACL-U #define l2cap_interrupt ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == interrupt_scid_) #define l2cap_command ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == command_scid_) diff --git a/modules/pademu/ds3bt.c b/modules/pademu/ds3bt.c index 7a944026b..745111c4c 100644 --- a/modules/pademu/ds3bt.c +++ b/modules/pademu/ds3bt.c @@ -39,6 +39,7 @@ typedef struct _bt_dev int devId; int hci_sema; int l2cap_sema; + int l2cap_cmd_sema; int controlEndp; int eventEndp; int inEndp; @@ -46,7 +47,7 @@ typedef struct _bt_dev uint8_t status; } bt_device; -bt_device bt_dev = {-1, -1, -1, -1, -1, -1, -1, DS3BT_STATE_USB_DISCONNECTED}; +bt_device bt_dev = {-1, -1, -1, -1, -1, -1, -1, -1, DS3BT_STATE_USB_DISCONNECTED}; static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint); static void bt_config_set(int result, int count, void *arg); @@ -58,16 +59,16 @@ int bt_probe(int devId) UsbConfigDescriptor *config = NULL; UsbInterfaceDescriptor *intf = NULL; - DPRINTF("BT: probe: devId=%i\n", devId); + DPRINTF("DS3BT: probe: devId=%i\n", devId); if ((bt_dev.devId > 0) && (bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) { - DPRINTF("BT: Error - only one device allowed !\n"); + DPRINTF("DS3BT: Error - only one device allowed !\n"); return 0; } device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); if (device == NULL) { - DPRINTF("BT: Error - Couldn't get device descriptor\n"); + DPRINTF("DS3BT: Error - Couldn't get device descriptor\n"); return 0; } @@ -80,15 +81,14 @@ int bt_probe(int devId) return 0; } - if ((config->bNumInterfaces < 1) || (config->wTotalLength < (sizeof(UsbConfigDescriptor) + sizeof(UsbInterfaceDescriptor)))) { - DPRINTF("BT: Error - No interfaces available\n"); + DPRINTF("DS3BT: Error - No interfaces available\n"); return 0; } intf = (UsbInterfaceDescriptor *)((char *)config + config->bLength); - DPRINTF("BT: bInterfaceClass %X bInterfaceSubClass %X bInterfaceProtocol %X\n", + DPRINTF("DS3BT: bInterfaceClass %X bInterfaceSubClass %X bInterfaceProtocol %X\n", intf->bInterfaceClass, intf->bInterfaceSubClass, intf->bInterfaceProtocol); if ((intf->bInterfaceClass != USB_CLASS_WIRELESS_CONTROLLER) || @@ -111,10 +111,10 @@ int bt_connect(int devId) UsbEndpointDescriptor *endpoint; iop_sema_t SemaData; - DPRINTF("BT: connect: devId=%i\n", devId); + DPRINTF("DS3BT: connect: devId=%i\n", devId); if (bt_dev.devId != -1) { - DPRINTF("BT: Error - only one device allowed !\n"); + DPRINTF("DS3BT: Error - only one device allowed !\n"); return 1; } @@ -134,7 +134,7 @@ int bt_connect(int devId) epCount = interface->bNumEndpoints; - DPRINTF("BT: Endpoint Count %d \n", epCount); + DPRINTF("DS3BT: Endpoint Count %d \n", epCount); endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); usb_probeEndpoint(devId, endpoint); @@ -146,7 +146,7 @@ int bt_connect(int devId) if (bt_dev.eventEndp < 0 || bt_dev.inEndp < 0 || bt_dev.outEndp < 0) { bt_release(); - DPRINTF("BT: Error - connect failed: not enough endpoints! \n"); + DPRINTF("DS3BT: Error - connect failed: not enough endpoints! \n"); return -1; } @@ -156,12 +156,17 @@ int bt_connect(int devId) SemaData.attr = 0; if ((bt_dev.hci_sema = CreateSema(&SemaData)) < 0) { - DPRINTF("BT: Failed to allocate I/O semaphore.\n"); + DPRINTF("DS3BT: Failed to allocate I/O semaphore.\n"); return -1; } if ((bt_dev.l2cap_sema = CreateSema(&SemaData)) < 0) { - DPRINTF("BT: Failed to allocate I/O semaphore.\n"); + DPRINTF("DS3BT: Failed to allocate I/O semaphore.\n"); + return -1; + } + + if ((bt_dev.l2cap_cmd_sema = CreateSema(&SemaData)) < 0) { + DPRINTF("DS3BT: Failed to allocate I/O semaphore.\n"); return -1; } @@ -176,13 +181,19 @@ int bt_connect(int devId) int bt_disconnect(int devId) { - DPRINTF("BT: disconnect: devId=%i\n", devId); + DPRINTF("DS3BT: disconnect: devId=%i\n", devId); if (bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) { - bt_release(); + if (bt_dev.eventEndp >= 0) + UsbCloseEndpoint(bt_dev.eventEndp); + + if (bt_dev.inEndp >= 0) + UsbCloseEndpoint(bt_dev.inEndp); + + if (bt_dev.outEndp >= 0) + UsbCloseEndpoint(bt_dev.outEndp); - bt_dev.devId = -1; - bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; + bt_release(); } return 0; @@ -190,22 +201,16 @@ int bt_disconnect(int devId) static void bt_release() { - if (bt_dev.eventEndp >= 0) - UsbCloseEndpoint(bt_dev.eventEndp); - - if (bt_dev.inEndp >= 0) - UsbCloseEndpoint(bt_dev.inEndp); - - if (bt_dev.outEndp >= 0) - UsbCloseEndpoint(bt_dev.outEndp); - DeleteSema(bt_dev.hci_sema); DeleteSema(bt_dev.l2cap_sema); + DeleteSema(bt_dev.l2cap_cmd_sema); + bt_dev.devId = -1; bt_dev.eventEndp = -1; bt_dev.inEndp = -1; bt_dev.outEndp = -1; bt_dev.controlEndp = -1; + bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; } static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint) @@ -213,17 +218,15 @@ static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint) if (endpoint->bmAttributes == USB_ENDPOINT_XFER_BULK) { if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && bt_dev.outEndp < 0) { bt_dev.outEndp = UsbOpenEndpointAligned(devId, endpoint); - DPRINTF("BT: register Output endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.outEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - } else - - if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.inEndp < 0) { + DPRINTF("DS3BT: register Output endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.outEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } else if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.inEndp < 0) { bt_dev.inEndp = UsbOpenEndpointAligned(devId, endpoint); - DPRINTF("BT: register Input endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.inEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + DPRINTF("DS3BT: register Input endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.inEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); } } else if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.eventEndp < 0) { bt_dev.eventEndp = UsbOpenEndpoint(devId, endpoint); - DPRINTF("BT: register Event endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.eventEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + DPRINTF("DS3BT: register Event endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.eventEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); } } } @@ -437,9 +440,8 @@ static uint8_t hci_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; static uint8_t l2cap_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; static void DS3BT_init(); -static uint8_t LED(uint8_t led, int pad); -static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad); -static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); +static int Rumble(uint8_t lrum, uint8_t rrum, int pad); +static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); static uint8_t current_pad; static uint8_t enable_pad; @@ -518,47 +520,49 @@ static void hci_event_cb(int resultCode, int bytes, void *arg) static void l2cap_event_cb(int resultCode, int bytes, void *arg) { - uint8_t pad; + int pad; + static uint8_t ret_ctr = 0; PollSema(bt_dev.l2cap_sema); - //DPRINTF("l2cap_event_cb: res %d, bytes %d, arg %p arg %x\n", resultCode, bytes, arg, *(uint8_t *)arg); + //DPRINTF("l2cap_event_cb: res %d, bytes %d, arg %p\n", resultCode, bytes, arg); pad = L2CAP_event_task(resultCode, bytes); L2CAP_task(pad); - if (pad >= MAX_PADS) - pad = current_pad; - - if (arg != NULL) { - if (pad != (int)arg && (int)arg < MAX_PADS) { - if ((ds3pad[(int)arg].status_ & DS3BT_STATE_RUNNING)) { - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); - return; - } - } + if (pad >= MAX_PADS) { + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); + return; } - SignalSema(bt_dev.l2cap_sema); - - if (ds3pad[pad].l2cap_state_ != L2CAP_READY_STATE) { + if (ds3pad[pad].l2cap_state_ != L2CAP_READY_STATE) { //ds3 is connecting DelayThread(14000); //fix for some bt adapters - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); + } else { //ds3 is running + if ((int)arg != -1 && pad != (int)arg && (int)arg < MAX_PADS) { //check if we get what was requested + if (ret_ctr == 20) { + ret_ctr = 0; + SignalSema(bt_dev.l2cap_sema); + } else { + ret_ctr++; + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, arg); //try again + } + } else { //we got what we wanted + SignalSema(bt_dev.l2cap_sema); + } } } static void l2cap_cmd_cb(int resultCode, int bytes, void *arg) { //DPRINTF("l2cap_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - - if (ds3pad[(int)arg].status_ & DS3BT_STATE_RUNNING) - SignalSema(bt_dev.l2cap_sema); + SignalSema(bt_dev.l2cap_cmd_sema); } static void bt_config_set(int result, int count, void *arg) { UsbInterruptTransfer(bt_dev.eventEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, NULL); - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); SignalSema(bt_dev.hci_sema); SignalSema(bt_dev.l2cap_sema); @@ -628,7 +632,6 @@ static uint8_t HCI_event_task(int result) } } } - break; case HCI_EVENT_QOS_SETUP_COMPLETE: @@ -720,8 +723,8 @@ static uint8_t HCI_event_task(int result) } DPRINTF(" ROLE: 0x%x\n", hci_buf[9]); - break; + case HCI_EVENT_MAX_SLOT_CHANGE: DPRINTF("Max Slot Change: \n"); @@ -750,7 +753,7 @@ static uint8_t HCI_event_task(int result) static void HCI_task(uint8_t pad) { - uint8_t i; + int i; if (pad >= MAX_PADS) return; @@ -820,8 +823,16 @@ static void HCI_task(uint8_t pad) if (ds3pad[pad].type != HID_THDR_SET_REPORT_OUTPUT) { ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + for (i = 0; i < MAX_PADS; i++) { + if (ds3pad[i].status_ & DS3BT_STATE_RUNNING) + break; + } + + if (i == MAX_PADS) + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); } + + SignalSema(bt_dev.l2cap_sema); } break; @@ -935,7 +946,7 @@ static uint8_t L2CAP_event_task(int result, int bytes) } if (pad >= MAX_PADS) { - DPRINTF("L2CAP Wrong Handle = 0x%x\n", ((l2cap_buf[0] | (l2cap_buf[1] << 8)))); + DPRINTF("L2CAP Wrong Handle = 0x%x\n", ((l2cap_buf[0] | (l2cap_buf[1] << 8)) & 0x0FFF)); return pad; } @@ -1050,7 +1061,6 @@ static void L2CAP_task(uint8_t pad) } break; - case L2CAP_INTERRUPT_CONNECTING_STATE: DPRINTF("L2CAP_I1\n"); if (l2cap_interrupt_connected) { @@ -1085,8 +1095,21 @@ static void L2CAP_task(uint8_t pad) break; case L2CAP_LED_STATE: + DPRINTF("L2CAP_LED\n"); + if (hid_command_success) { + if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { + ds3pad[pad].l2cap_state_ = L2CAP_LED_STATE_END; + } else { + ds3pad[pad].l2cap_state_ = L2CAP_READY_STATE; + ds3pad[pad].status_ |= DS3BT_STATE_RUNNING; + } + LEDRumble((pad + 1) << 1, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); + } + break; + + case L2CAP_LED_STATE_END: + DPRINTF("L2CAP_LED_END\n"); if (hid_command_success) { - LED((pad + 1) << 1, pad); ds3pad[pad].l2cap_state_ = L2CAP_READY_STATE; ds3pad[pad].status_ |= DS3BT_STATE_RUNNING; } @@ -1186,6 +1209,8 @@ static uint8_t l2cap_disconnect_response(uint8_t rxid, uint16_t scid, uint16_t d static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) { + PollSema(bt_dev.l2cap_cmd_sema); + l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length @@ -1198,7 +1223,7 @@ static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) mips_memcpy(&l2cap_cmd_buf[8], data, length); // output on endpoint 2 - return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), NULL, NULL); + return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), l2cap_cmd_cb, NULL); } /************************************************************/ @@ -1207,17 +1232,16 @@ static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) static uint8_t initPSController(int pad) { - uint8_t header = 2; - uint8_t init_buf[header + PS3_F4_REPORT_LEN]; + uint8_t init_buf[2 + PS3_F4_REPORT_LEN]; uint8_t i; init_buf[0] = HID_THDR_SET_REPORT_FEATURE; // THdr init_buf[1] = PS3_F4_REPORT_ID; // Report ID for (i = 0; i < PS3_F4_REPORT_LEN; i++) { - init_buf[header + i] = (uint8_t)feature_F4_report[i]; + init_buf[2 + i] = (uint8_t)feature_F4_report[i]; } - return writeReport((uint8_t *)init_buf, header + PS3_F4_REPORT_LEN, pad); + return writeReport((uint8_t *)init_buf, 2 + PS3_F4_REPORT_LEN, pad); } #define DATA_START 11 @@ -1304,6 +1328,8 @@ static void readReport(uint8_t *data, int bytes, int pad) static uint8_t writeReport(uint8_t *data, uint8_t length, int pad) { + PollSema(bt_dev.l2cap_cmd_sema); + l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length @@ -1321,7 +1347,7 @@ static uint8_t writeReport(uint8_t *data, uint8_t length, int pad) return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), l2cap_cmd_cb, (void *)pad); } // writeReport -static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) +static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) { uint8_t led_buf[PS3_01_REPORT_LEN + 2]; @@ -1354,27 +1380,35 @@ static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) ds3pad[pad].oldlrumble = lrum; ds3pad[pad].oldrrumble = rrum; - return writeReport((uint8_t *)led_buf, sizeof(output_01_report) /*PS3_01_REPORT_LEN*/ + 2, pad); + return writeReport((uint8_t *)led_buf, sizeof(output_01_report) + 2, pad); } /************************************************************/ /* DS3BT Commands */ /************************************************************/ -static uint8_t LED(uint8_t led, int pad) +static int Rumble(uint8_t lrum, uint8_t rrum, int pad) { - return LEDRumble(led, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); -} - -static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad) -{ - uint8_t ret; + int ret; ret = LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); - WaitSema(bt_dev.l2cap_sema); - if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); - WaitSema(bt_dev.l2cap_sema); + if (ret == USB_RC_OK) { + WaitSema(bt_dev.l2cap_cmd_sema); + if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { + WaitSema(bt_dev.l2cap_sema); + do { + ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); + if (ret == USB_RC_OK) + WaitSema(bt_dev.l2cap_sema); + else + break; + } while (!hid_command_success); + + SignalSema(bt_dev.l2cap_sema); + } } + else + DPRINTF("DS3BT: LEDRumble usb transfer error %d\n", ret); + return ret; } @@ -1422,55 +1456,52 @@ void ds3bt_set_mode(int mode, int lock, int port) static void update_thread(void *param) { + int ret; + while(1) { SleepThread(); - WaitSema(bt_dev.hci_sema); - WaitSema(bt_dev.l2cap_sema); - if (update_rum) { Rumble(update_lrum, update_rrum, update_port); update_rum = 0; } + + WaitSema(bt_dev.l2cap_sema); - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)update_port); + ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)update_port); - WaitSema(bt_dev.l2cap_sema); + if (ret == USB_RC_OK) + WaitSema(bt_dev.l2cap_sema); + else + DPRINTF("DS3BT: ds3bt_get_data usb transfer error %d\n", ret); - SignalSema(bt_dev.hci_sema); SignalSema(bt_dev.l2cap_sema); - SignalSema(update_sema); } } #else void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port) { - WaitSema(bt_dev.hci_sema); - WaitSema(bt_dev.l2cap_sema); - Rumble(lrum, rrum, port); - - SignalSema(bt_dev.hci_sema); - SignalSema(bt_dev.l2cap_sema); } int ds3bt_get_data(char *dst, int size, int port) { int ret; - WaitSema(bt_dev.hci_sema); WaitSema(bt_dev.l2cap_sema); - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)port); + ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)port); - WaitSema(bt_dev.l2cap_sema); + if (ret == USB_RC_OK) + WaitSema(bt_dev.l2cap_sema); + else + DPRINTF("DS3BT: ds3bt_get_data usb transfer error %d\n", ret); mips_memcpy(dst, ds3pad[port].data, size); ret = ds3pad[port].analog_btn & 1; - SignalSema(bt_dev.hci_sema); SignalSema(bt_dev.l2cap_sema); return ret; @@ -1478,71 +1509,47 @@ int ds3bt_get_data(char *dst, int size, int port) void ds3bt_set_mode(int mode, int lock, int port) { - WaitSema(bt_dev.hci_sema); - WaitSema(bt_dev.l2cap_sema); - if (lock == 3) ds3pad[port].analog_btn = 3; else ds3pad[port].analog_btn = mode; - - SignalSema(bt_dev.hci_sema); - SignalSema(bt_dev.l2cap_sema); } #endif void ds3bt_reset() { - uint8_t i; + int pad; if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) return; - WaitSema(bt_dev.hci_sema); - WaitSema(bt_dev.l2cap_sema); + for (pad = 0; pad < MAX_PADS; pad++) { + if ((ds3pad[pad].status_ & DS3BT_STATE_CONNECTED) || (ds3pad[pad].status_ & DS3BT_STATE_RUNNING)) { + ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; + ds3pad[pad].l2cap_state_ = L2CAP_DOWN_STATE; - for (i = 0; i < MAX_PADS; i++) { - if ((ds3pad[i].status_ & DS3BT_STATE_CONNECTED) || (ds3pad[i].status_ & DS3BT_STATE_RUNNING)) { - ds3pad[i].status_ &= ~DS3BT_STATE_RUNNING; - ds3pad[i].l2cap_state_ = L2CAP_DOWN_STATE; - - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); - hci_disconnect(ds3pad[i].hci_handle_); - WaitSema(bt_dev.hci_sema); + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); + hci_disconnect(ds3pad[pad].hci_handle_); } } - hci_reset(); - - WaitSema(bt_dev.hci_sema); + DS3BT_init(); - SignalSema(bt_dev.hci_sema); - SignalSema(bt_dev.l2cap_sema); #ifdef USE_THREAD - WaitSema(update_sema); - TerminateThread(update_thread_id); DeleteThread(update_thread_id); DeleteSema(update_sema); #endif DelayThread(1000000); - //bt_release(); + bt_release(); } int ds3bt_get_status(int port) { int status = bt_dev.status; - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) - return status; - - WaitSema(bt_dev.hci_sema); - WaitSema(bt_dev.l2cap_sema); - - status |= ds3pad[port].status_; - - SignalSema(bt_dev.hci_sema); - SignalSema(bt_dev.l2cap_sema); + if (status & DS3BT_STATE_USB_AUTHORIZED) + status |= ds3pad[port].status_; return status; } diff --git a/modules/pademu/ds3bt.h b/modules/pademu/ds3bt.h index 6a4828300..91f12572f 100644 --- a/modules/pademu/ds3bt.h +++ b/modules/pademu/ds3bt.h @@ -84,6 +84,7 @@ enum eL2CAP { L2CAP_INTERRUPT_CONFIGURING_STATE, L2CAP_CONNECTED_STATE, L2CAP_LED_STATE, + L2CAP_LED_STATE_END, L2CAP_READY_STATE, L2CAP_DISCONNECT_STATE, @@ -246,7 +247,7 @@ enum eBUF_SIZE { #define l2cap_interrupt_disconnected (l2cap_event_status_ & L2CAP_EV_INTERRUPT_DISCONNECT_REQ) /* Macros for L2CAP event task tests */ -#define acl_handle_ok(handle) ((l2cap_buf[0] | (l2cap_buf[1] << 8)) == ((handle & 0x0FFF) | 0x2000)) +#define acl_handle_ok(handle) (((l2cap_buf[0] | (l2cap_buf[1] << 8)) & 0x0FFF) == (handle & 0x0FFF)) #define l2cap_control ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == 0x0001) // Channel ID for ACL-U #define l2cap_interrupt ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == interrupt_scid_) #define l2cap_command ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == command_scid_) diff --git a/modules/pademu/imports.lst b/modules/pademu/imports.lst index f0e76a165..380d07482 100644 --- a/modules/pademu/imports.lst +++ b/modules/pademu/imports.lst @@ -48,9 +48,6 @@ usbd_IMPORTS_end sysclib_IMPORTS_start I_strncmp -I_sprintf -I_strcpy -I_strcat #ifndef USE_SMSUTILS I_memset I_memcpy From 1bf85f3f950541431cb1e391f76c456a44282df3 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 8 Aug 2017 22:03:23 -0700 Subject: [PATCH 057/269] Fix bug in ELM support by rickgaiser (aka Maximus32): Without ELM support there are 4 io modules, with ELM support there are 5 io modules, causing unexpected crashes. --- DETAILED_CHANGELOG | 1 + src/opl.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 7e0ed6e5d..3e85ee12b 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1015 - Jay-Jay-OPL - belek666 made the following changes: ds3bt updates (#62) - more accurate reading, fix data request, add waiting for cmd report - Mon Jul 31 14:59:00 2017 -0700 rev1014 - Jay-Jay-OPL - SP193 did the following changes: - (HDPro) fixed HDPro being unable to communicate with the HDPro device: fixed DEV9 not being loaded when HDPro is used (HDD.IRX depends on it), fixed errors in command types for command matrix, removed extra writes in the EE HDPro probe function, replaced WaitEventFlag with PollEventFlag (as per the original) and added a check around PollEventFlag's return value. - Sat Jul 29 02:54:58 2017 -0700 rev1013 - Jay-Jay-OPL - SP193 did the following changes: - Revert (In-game ATAD) re-added workaround for some clone adaptors. (#58) - Sat Jul 29 02:33:50 2017 -0700 rev1012 - Jay-Jay-OPL - removed the *.irx and the duplicated *.a lines in the .gitignore file so it stops ignoring any file with the .irx extension in the repo, plus *.a was already on the list. - Fri Jul 28 15:52:54 2017 -0700 diff --git a/src/opl.c b/src/opl.c index 7d3410a17..26068a79d 100644 --- a/src/opl.c +++ b/src/opl.c @@ -108,7 +108,9 @@ static unsigned int frameCounter; static char errorMessage[256]; -static opl_io_module_t list_support[4]; +//START of OPL_DB tweaks +static opl_io_module_t list_support[5]; +//END of OPL_DB tweaks void moduleUpdateMenu(int mode, int themeChanged) { From c6b7d8ca910b354872d51ea70760d7442e33f2f6 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 9 Aug 2017 09:36:13 -0700 Subject: [PATCH 058/269] Make OPL compilable with latest PS2SDK (#63) by uyjulian * ioman_add duplicate definition fix * Fix usbd imports * clang-format --- DETAILED_CHANGELOG | 1 + ee_core/include/syscallnr_custom.h | 2 +- ee_core/src/iopmgr.c | 4 +- ee_core/src/padhook.c | 1 - elfldr/syscallnr_custom.h | 2 +- include/hdd.h | 2 +- include/usb-ioctl.h | 2 +- modules/debug/udptty-ingame/udptty.c | 2 +- modules/debug/udptty/udptty.c | 2 +- modules/ds3bt/ee/libds3bt.c | 4 +- modules/ds3bt/iop/ds3bt.c | 173 ++++++++------- modules/ds3bt/iop/imports.lst | 14 +- modules/ds3usb/ee/libds3usb.c | 2 +- modules/ds3usb/iop/ds3usb.c | 32 ++- modules/ds3usb/iop/imports.lst | 14 +- modules/hdd/hdldsvr/hdldsvr.c | 2 +- modules/hdd/xhdd/hdpro.c | 2 +- modules/hdd/xhdd/xatad.c | 104 +++++---- modules/hdd/xhdd/xhdd.c | 109 +++++----- modules/iopcore/cdvdman/atad.c | 77 +++---- modules/iopcore/cdvdman/atad.h | 16 +- modules/iopcore/cdvdman/dev9.c | 7 +- modules/iopcore/cdvdman/hdpro_atad.c | 46 ++-- modules/iopcore/cdvdman/ioman_add.h | 24 --- modules/mcemu/ioman_add.h | 24 --- .../network/SMSTCPIP/include/arch/sys_arch.h | 6 +- modules/network/SMSTCPIP/mem.c | 22 +- modules/network/SMSTCPIP/ps2ip.c | 4 +- modules/network/SMSTCPIP/tcp_out.c | 9 +- modules/network/smap-ingame/smap.c | 44 ++-- modules/pademu/ds3bt.c | 200 +++++++++--------- modules/pademu/ds3usb.c | 61 +++--- modules/pademu/imports.lst | 14 +- modules/pademu/pademu.c | 32 ++- modules/usb/usbhdfsdfsv/main.c | 153 +++++++------- modules/vmc/genvmc/ioman_add.h | 27 --- src/atlas.c | 2 +- src/fntsys.c | 2 +- src/hdd.c | 36 ++-- src/hddsupport.c | 4 +- src/renderman.c | 8 +- src/system.c | 2 +- src/usbsupport.c | 10 +- 43 files changed, 595 insertions(+), 709 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 3e85ee12b..37deafa88 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1016 - Jay-Jay-OPL - Fix bug in ELM support by rickgaiser (aka Maximus32): Without ELM support there are 4 io modules, with ELM support there are 5 io modules, causing unexpected crashes. - Tue Aug 8 22:03:23 2017 -0700 rev1015 - Jay-Jay-OPL - belek666 made the following changes: ds3bt updates (#62) - more accurate reading, fix data request, add waiting for cmd report - Mon Jul 31 14:59:00 2017 -0700 rev1014 - Jay-Jay-OPL - SP193 did the following changes: - (HDPro) fixed HDPro being unable to communicate with the HDPro device: fixed DEV9 not being loaded when HDPro is used (HDD.IRX depends on it), fixed errors in command types for command matrix, removed extra writes in the EE HDPro probe function, replaced WaitEventFlag with PollEventFlag (as per the original) and added a check around PollEventFlag's return value. - Sat Jul 29 02:54:58 2017 -0700 rev1013 - Jay-Jay-OPL - SP193 did the following changes: - Revert (In-game ATAD) re-added workaround for some clone adaptors. (#58) - Sat Jul 29 02:33:50 2017 -0700 diff --git a/ee_core/include/syscallnr_custom.h b/ee_core/include/syscallnr_custom.h index 63d43cf02..b136950df 100644 --- a/ee_core/include/syscallnr_custom.h +++ b/ee_core/include/syscallnr_custom.h @@ -4,6 +4,6 @@ /* * This file contains the system call numbers, similar to asm/unistd.h on Linux. */ -#define __NR_iWakeupThread (-0x34) +#define __NR_iWakeupThread (-0x34) #endif /* _SYSCALLNR_H_ */ diff --git a/ee_core/src/iopmgr.c b/ee_core/src/iopmgr.c index 95988ea3f..3bd91d039 100644 --- a/ee_core/src/iopmgr.c +++ b/ee_core/src/iopmgr.c @@ -205,10 +205,10 @@ int Reset_Iop(const char *arg, int mode) That caused SifSetDChain() to be run ASAP, which re-enables SIF0. I don't find that a good workaround because it may result in a timing problem. */ - for(arglen = 0; arg[arglen] != '\0'; arglen++) + for (arglen = 0; arg[arglen] != '\0'; arglen++) reset_pkt.arg[arglen] = arg[arglen]; - reset_pkt.header.psize = sizeof reset_pkt; //dsize is not initialized (and not processed, even on the IOP). + reset_pkt.header.psize = sizeof reset_pkt; //dsize is not initialized (and not processed, even on the IOP). reset_pkt.header.cid = SIF_CMD_RESET_CMD; reset_pkt.arglen = arglen; reset_pkt.mode = mode; diff --git a/ee_core/src/padhook.c b/ee_core/src/padhook.c index 2ff75c40b..59ad264c7 100644 --- a/ee_core/src/padhook.c +++ b/ee_core/src/padhook.c @@ -624,4 +624,3 @@ int Install_PadOpen_Hook(u32 mem_start, u32 mem_end, int mode) return patched; } - diff --git a/elfldr/syscallnr_custom.h b/elfldr/syscallnr_custom.h index 63d43cf02..b136950df 100644 --- a/elfldr/syscallnr_custom.h +++ b/elfldr/syscallnr_custom.h @@ -4,6 +4,6 @@ /* * This file contains the system call numbers, similar to asm/unistd.h on Linux. */ -#define __NR_iWakeupThread (-0x34) +#define __NR_iWakeupThread (-0x34) #endif /* _SYSCALLNR_H_ */ diff --git a/include/hdd.h b/include/hdd.h index de79fc9a5..8b3b2f52b 100644 --- a/include/hdd.h +++ b/include/hdd.h @@ -51,7 +51,7 @@ typedef struct apa_sub_t subs[APA_MAXSUB]; } apa_header_t; -#define PFS_INODE_MAX_BLOCKS 114 +#define PFS_INODE_MAX_BLOCKS 114 typedef struct { diff --git a/include/usb-ioctl.h b/include/usb-ioctl.h index c4d97a9f1..17dc6c56d 100644 --- a/include/usb-ioctl.h +++ b/include/usb-ioctl.h @@ -1 +1 @@ -#define XUSBHDFSD_CHECK_CLUSTER_CHAIN 0x1100 //polo: Ioctl request code => Check cluster chain +#define XUSBHDFSD_CHECK_CLUSTER_CHAIN 0x1100 //polo: Ioctl request code => Check cluster chain diff --git a/modules/debug/udptty-ingame/udptty.c b/modules/debug/udptty-ingame/udptty.c index 00967f208..1eda857c4 100644 --- a/modules/debug/udptty-ingame/udptty.c +++ b/modules/debug/udptty-ingame/udptty.c @@ -181,7 +181,7 @@ void kprtty_init(void) thid = CreateThread(&thp); StartThread(thid, (void *)kpa); - KprintfSet((KprintfHandler_t *)Kprintf_Handler, (u32*)kpa); + KprintfSet((KprintfHandler_t *)Kprintf_Handler, (u32 *)kpa); } #endif diff --git a/modules/debug/udptty/udptty.c b/modules/debug/udptty/udptty.c index 12f0e8a9b..656adf5e3 100644 --- a/modules/debug/udptty/udptty.c +++ b/modules/debug/udptty/udptty.c @@ -181,7 +181,7 @@ void kprtty_init(void) thid = CreateThread(&thp); StartThread(thid, (void *)kpa); - KprintfSet((KprintfHandler_t *)Kprintf_Handler, (u32*)kpa); + KprintfSet((KprintfHandler_t *)Kprintf_Handler, (u32 *)kpa); } #endif diff --git a/modules/ds3bt/ee/libds3bt.c b/modules/ds3bt/ee/libds3bt.c index 49042ba14..d1ec1463b 100644 --- a/modules/ds3bt/ee/libds3bt.c +++ b/modules/ds3bt/ee/libds3bt.c @@ -65,8 +65,8 @@ int ds3bt_get_status(int port) rpcbuf[0] = port; - if (SifCallRpc(&ds3bt, DS3BT_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL) == 0) - return rpcbuf[0]; + if (SifCallRpc(&ds3bt, DS3BT_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL) == 0) + return rpcbuf[0]; return 0; } diff --git a/modules/ds3bt/iop/ds3bt.c b/modules/ds3bt/iop/ds3bt.c index b252da40f..5c6f132d0 100644 --- a/modules/ds3bt/iop/ds3bt.c +++ b/modules/ds3bt/iop/ds3bt.c @@ -297,96 +297,92 @@ UsbDriver chrg_driver = {NULL, NULL, "chrg", chrg_probe, chrg_connect, chrg_disc /* PS Remote Reports */ static uint8_t feature_F4_report[] = -{ - 0x42, 0x03, 0x00, 0x00 -}; + { + 0x42, 0x03, 0x00, 0x00}; static uint8_t output_01_report[] = -{ - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00 -}; + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; static uint8_t power_level[] = -{ - 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E -}; + { + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; // Taken from nefarius' SCPToolkit // https://github.com/nefarius/ScpToolkit/blob/master/ScpControl/ScpControl.ini // Valid MAC addresses used by Sony static uint8_t GenuineMacAddress[][3] = -{ - // Bluetooth chips by ALPS ELECTRIC CO., LTD - {0x00, 0x02, 0xC7}, - {0x00, 0x06, 0xF5}, - {0x00, 0x06, 0xF7}, - {0x00, 0x07, 0x04}, - {0x00, 0x16, 0xFE}, - {0x00, 0x19, 0xC1}, - {0x00, 0x1B, 0xFB}, - {0x00, 0x1E, 0x3D}, - {0x00, 0x21, 0x4F}, - {0x00, 0x23, 0x06}, - {0x00, 0x24, 0x33}, - {0x00, 0x26, 0x43}, - {0x00, 0xA0, 0x79}, - {0x04, 0x76, 0x6E}, - {0x04, 0x98, 0xF3}, - {0x28, 0xA1, 0x83}, - {0x34, 0xC7, 0x31}, - {0x38, 0xC0, 0x96}, - {0x60, 0x38, 0x0E}, - {0x64, 0xD4, 0xBD}, - {0xAC, 0x7A, 0x4D}, - {0xE0, 0x75, 0x0A}, - {0xE0, 0xAE, 0x5E}, - {0xFC, 0x62, 0xB9}, - // Bluetooth chips by AzureWave Technology Inc. - {0xE0, 0xB9, 0xA5}, - {0xDC, 0x85, 0xDE}, - {0xD0, 0xE7, 0x82}, - {0xB0, 0xEE, 0x45}, - {0xAC, 0x89, 0x95}, - {0xA8, 0x1D, 0x16}, - {0x94, 0xDB, 0xC9}, - {0x80, 0xD2, 0x1D}, - {0x80, 0xA5, 0x89}, - {0x78, 0x18, 0x81}, - {0x74, 0xF0, 0x6D}, - {0x74, 0xC6, 0x3B}, - {0x74, 0x2F, 0x68}, - {0x6C, 0xAD, 0xF8}, - {0x6C, 0x71, 0xD9}, - {0x60, 0x5B, 0xB4}, - {0x5C, 0x96, 0x56}, - {0x54, 0x27, 0x1E}, - {0x4C, 0xAA, 0x16}, - {0x48, 0x5D, 0x60}, - {0x44, 0xD8, 0x32}, - {0x40, 0xE2, 0x30}, - {0x38, 0x4F, 0xF0}, - {0x28, 0xC2, 0xDD}, - {0x24, 0x0A, 0x64}, - {0x1C, 0x4B, 0xD6}, - {0x08, 0xA9, 0x5A}, - {0x00, 0x25, 0xD3}, - {0x00, 0x24, 0x23}, - {0x00, 0x22, 0x43}, - {0x00, 0x15, 0xAF}, - //fake with AirohaTechnologyCorp's Chip - {0x0C, 0xFC, 0x83} -}; + { + // Bluetooth chips by ALPS ELECTRIC CO., LTD + {0x00, 0x02, 0xC7}, + {0x00, 0x06, 0xF5}, + {0x00, 0x06, 0xF7}, + {0x00, 0x07, 0x04}, + {0x00, 0x16, 0xFE}, + {0x00, 0x19, 0xC1}, + {0x00, 0x1B, 0xFB}, + {0x00, 0x1E, 0x3D}, + {0x00, 0x21, 0x4F}, + {0x00, 0x23, 0x06}, + {0x00, 0x24, 0x33}, + {0x00, 0x26, 0x43}, + {0x00, 0xA0, 0x79}, + {0x04, 0x76, 0x6E}, + {0x04, 0x98, 0xF3}, + {0x28, 0xA1, 0x83}, + {0x34, 0xC7, 0x31}, + {0x38, 0xC0, 0x96}, + {0x60, 0x38, 0x0E}, + {0x64, 0xD4, 0xBD}, + {0xAC, 0x7A, 0x4D}, + {0xE0, 0x75, 0x0A}, + {0xE0, 0xAE, 0x5E}, + {0xFC, 0x62, 0xB9}, + // Bluetooth chips by AzureWave Technology Inc. + {0xE0, 0xB9, 0xA5}, + {0xDC, 0x85, 0xDE}, + {0xD0, 0xE7, 0x82}, + {0xB0, 0xEE, 0x45}, + {0xAC, 0x89, 0x95}, + {0xA8, 0x1D, 0x16}, + {0x94, 0xDB, 0xC9}, + {0x80, 0xD2, 0x1D}, + {0x80, 0xA5, 0x89}, + {0x78, 0x18, 0x81}, + {0x74, 0xF0, 0x6D}, + {0x74, 0xC6, 0x3B}, + {0x74, 0x2F, 0x68}, + {0x6C, 0xAD, 0xF8}, + {0x6C, 0x71, 0xD9}, + {0x60, 0x5B, 0xB4}, + {0x5C, 0x96, 0x56}, + {0x54, 0x27, 0x1E}, + {0x4C, 0xAA, 0x16}, + {0x48, 0x5D, 0x60}, + {0x44, 0xD8, 0x32}, + {0x40, 0xE2, 0x30}, + {0x38, 0x4F, 0xF0}, + {0x28, 0xC2, 0xDD}, + {0x24, 0x0A, 0x64}, + {0x1C, 0x4B, 0xD6}, + {0x08, 0xA9, 0x5A}, + {0x00, 0x25, 0xD3}, + {0x00, 0x24, 0x23}, + {0x00, 0x22, 0x43}, + {0x00, 0x15, 0xAF}, + //fake with AirohaTechnologyCorp's Chip + {0x0C, 0xFC, 0x83}}; /* variables used by high level HCI task */ static uint16_t hci_counter_; // counter used for bluetooth HCI loops @@ -531,9 +527,9 @@ static void l2cap_event_cb(int resultCode, int bytes, void *arg) } if (ds3pad[pad].l2cap_state_ != L2CAP_READY_STATE) { //ds3 is connecting - DelayThread(14000); //fix for some bt adapters + DelayThread(14000); //fix for some bt adapters UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); - } else { //ds3 is running + } else { //ds3 is running if ((int)arg != -1 && pad != (int)arg && (int)arg < MAX_PADS) { //check if we get what was requested if (ret_ctr == 20) { ret_ctr = 0; @@ -1249,8 +1245,8 @@ static uint8_t l2cap_disconnection_request(uint8_t rxid, uint16_t scid, uint16_t uint8_t cmd_buf[8]; cmd_buf[0] = L2CAP_CMD_DISCONNECT_REQUEST; // Code - cmd_buf[1] = rxid; // Identifier - cmd_buf[2] = 0x04; // Length + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x04; // Length cmd_buf[3] = 0x00; cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID cmd_buf[5] = (uint8_t)(dcid >> 8); @@ -1395,7 +1391,7 @@ static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) mips_memcpy(&led_buf[2], output_01_report, sizeof(output_01_report)); // PS3_01_REPORT_LEN); if (ds3pad[pad].type == 0xA2) { - if(rrum < 5) + if (rrum < 5) rrum = 0; } @@ -1443,8 +1439,7 @@ static int LEDRUM(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) SignalSema(bt_dev.l2cap_sema); } - } - else + } else DPRINTF("DS3BT: LEDRumble usb transfer error %d\n", ret); return ret; @@ -1552,7 +1547,7 @@ void ds3bt_reset() DS3BT_init(); WaitSema(bt_dev.hci_sema); - + DelayThread(1000000); } diff --git a/modules/ds3bt/iop/imports.lst b/modules/ds3bt/iop/imports.lst index bf4df641d..130a870b7 100644 --- a/modules/ds3bt/iop/imports.lst +++ b/modules/ds3bt/iop/imports.lst @@ -26,11 +26,11 @@ I_GetThreadId thbase_IMPORTS_end usbd_IMPORTS_start -I_UsbGetDeviceStaticDescriptor -I_UsbOpenEndpoint -I_UsbCloseEndpoint -I_UsbOpenEndpointAligned -I_UsbSetDevicePrivateData -I_UsbTransfer -I_UsbRegisterDriver +I_sceUsbdScanStaticDescriptor +I_sceUsbdOpenPipe +I_sceUsbdClosePipe +I_sceUsbdOpenPipeAligned +I_sceUsbdSetPrivateData +I_sceUsbdTransferPipe +I_sceUsbdRegisterLdd usbd_IMPORTS_end diff --git a/modules/ds3usb/ee/libds3usb.c b/modules/ds3usb/ee/libds3usb.c index 11bd84551..03e42dec6 100644 --- a/modules/ds3usb/ee/libds3usb.c +++ b/modules/ds3usb/ee/libds3usb.c @@ -58,7 +58,7 @@ int ds3usb_get_status(int port) rpcbuf[0] = port; if (SifCallRpc(&ds3usb, DS3USB_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL) == 0) - return rpcbuf[0]; + return rpcbuf[0]; return 0; } diff --git a/modules/ds3usb/iop/ds3usb.c b/modules/ds3usb/iop/ds3usb.c index 506df5410..79ef6db54 100644 --- a/modules/ds3usb/iop/ds3usb.c +++ b/modules/ds3usb/iop/ds3usb.c @@ -24,25 +24,23 @@ IRX_ID("ds3usb", 1, 1); #define MAX_PADS 2 static uint8_t output_01_report[] = -{ - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00 -}; + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; static uint8_t power_level[] = -{ - 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E -}; + { + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; static uint8_t usb_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; diff --git a/modules/ds3usb/iop/imports.lst b/modules/ds3usb/iop/imports.lst index bf4df641d..130a870b7 100644 --- a/modules/ds3usb/iop/imports.lst +++ b/modules/ds3usb/iop/imports.lst @@ -26,11 +26,11 @@ I_GetThreadId thbase_IMPORTS_end usbd_IMPORTS_start -I_UsbGetDeviceStaticDescriptor -I_UsbOpenEndpoint -I_UsbCloseEndpoint -I_UsbOpenEndpointAligned -I_UsbSetDevicePrivateData -I_UsbTransfer -I_UsbRegisterDriver +I_sceUsbdScanStaticDescriptor +I_sceUsbdOpenPipe +I_sceUsbdClosePipe +I_sceUsbdOpenPipeAligned +I_sceUsbdSetPrivateData +I_sceUsbdTransferPipe +I_sceUsbdRegisterLdd usbd_IMPORTS_end diff --git a/modules/hdd/hdldsvr/hdldsvr.c b/modules/hdd/hdldsvr/hdldsvr.c index d255c66a1..570ab6e14 100644 --- a/modules/hdd/hdldsvr/hdldsvr.c +++ b/modules/hdd/hdldsvr/hdldsvr.c @@ -294,7 +294,7 @@ static int handle_tcp_client(int tcp_client_socket) // 'stat' command // ------------------------------------------------ case CMD_STAT: - if((devinfo = ata_get_devinfo(0)) == NULL) + if ((devinfo = ata_get_devinfo(0)) == NULL) pkt->hdr.result = -1; else pkt->hdr.result = devinfo->total_sectors >> 1; diff --git a/modules/hdd/xhdd/hdpro.c b/modules/hdd/xhdd/hdpro.c index 2d056fd2d..88f1a2ce9 100644 --- a/modules/hdd/xhdd/hdpro.c +++ b/modules/hdd/xhdd/hdpro.c @@ -7,5 +7,5 @@ int hdproata_device_set_transfer_mode(int device, int type, int mode) { - return 0; + return 0; } diff --git a/modules/hdd/xhdd/xatad.c b/modules/hdd/xhdd/xatad.c index de3ca649c..ae1dd079e 100644 --- a/modules/hdd/xhdd/xatad.c +++ b/modules/hdd/xhdd/xatad.c @@ -7,74 +7,72 @@ static void ata_multiword_dma_mode(int mode) { - USE_SPD_REGS; - u16 val; + USE_SPD_REGS; + u16 val; - switch(mode){ - case 1: - val = 0x45; - break; - case 2: - val = 0x24; - break; - default: - val = 0xff; - } + switch (mode) { + case 1: + val = 0x45; + break; + case 2: + val = 0x24; + break; + default: + val = 0xff; + } - SPD_REG16(SPD_R_MWDMA_MODE) = val; - SPD_REG16(SPD_R_IF_CTRL) = (SPD_REG16(SPD_R_IF_CTRL) & 0xfffe)|0x48; + SPD_REG16(SPD_R_MWDMA_MODE) = val; + SPD_REG16(SPD_R_IF_CTRL) = (SPD_REG16(SPD_R_IF_CTRL) & 0xfffe) | 0x48; } static void ata_ultra_dma_mode(int mode) { - USE_SPD_REGS; - u16 val; + USE_SPD_REGS; + u16 val; - switch (mode) - { - case 1: - val = 0x85; - break; - case 2: - val = 0x63; - break; - case 3: - val = 0x62; - break; - case 4: - val = 0x61; - break; - default: - val = 0xa7; - } + switch (mode) { + case 1: + val = 0x85; + break; + case 2: + val = 0x63; + break; + case 3: + val = 0x62; + break; + case 4: + val = 0x61; + break; + default: + val = 0xa7; + } - SPD_REG16(SPD_R_UDMA_MODE) = val; - SPD_REG16(SPD_R_IF_CTRL) |= 0x49; + SPD_REG16(SPD_R_UDMA_MODE) = val; + SPD_REG16(SPD_R_IF_CTRL) |= 0x49; } /* Set features - set transfer mode. */ int ata_device_set_transfer_mode(int device, int type, int mode) { - int res; + int res; - res = ata_io_start(NULL, 1, 3, (type|mode) & 0xff, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SET_FEATURES); - if (res) - return res; + res = ata_io_start(NULL, 1, 3, (type | mode) & 0xff, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SET_FEATURES); + if (res) + return res; - res = ata_io_finish(); - if (res) - return res; + res = ata_io_finish(); + if (res) + return res; - //Note: PIO is not supported by ata_device_sector_io. - switch(type) - { - case ATA_XFER_MODE_MDMA: - ata_multiword_dma_mode(mode); - break; - case ATA_XFER_MODE_UDMA: - ata_ultra_dma_mode(mode); - break; - } + //Note: PIO is not supported by ata_device_sector_io. + switch (type) { + case ATA_XFER_MODE_MDMA: + ata_multiword_dma_mode(mode); + break; + case ATA_XFER_MODE_UDMA: + ata_ultra_dma_mode(mode); + break; + } - return 0; + return 0; } diff --git a/modules/hdd/xhdd/xhdd.c b/modules/hdd/xhdd/xhdd.c index cdef4a9c6..be4734cc3 100644 --- a/modules/hdd/xhdd/xhdd.c +++ b/modules/hdd/xhdd/xhdd.c @@ -15,80 +15,77 @@ static int isHDPro; static int xhddInit(iop_device_t *device) { - return 0; + return 0; } static int xhddUnsupported(void) { - return -1; + return -1; } static int xhddDevctl(iop_file_t *fd, const char *name, int cmd, void *arg, unsigned int arglen, void *buf, unsigned int buflen) { - ata_devinfo_t *devinfo; + ata_devinfo_t *devinfo; - if(fd->unit >= 2) - return -ENXIO; + if (fd->unit >= 2) + return -ENXIO; - switch(cmd) - { - case ATA_DEVCTL_IS_48BIT: - return((devinfo = ata_get_devinfo(fd->unit)) != NULL ? devinfo->lba48 : -1); - case ATA_DEVCTL_SET_TRANSFER_MODE: - if(!isHDPro) - return ata_device_set_transfer_mode(fd->unit, ((hddAtaSetMode_t*)arg)->type, ((hddAtaSetMode_t*)arg)->mode); - else - return hdproata_device_set_transfer_mode(fd->unit, ((hddAtaSetMode_t*)arg)->type, ((hddAtaSetMode_t*)arg)->mode); - default: - return -EINVAL; - } + switch (cmd) { + case ATA_DEVCTL_IS_48BIT: + return ((devinfo = ata_get_devinfo(fd->unit)) != NULL ? devinfo->lba48 : -1); + case ATA_DEVCTL_SET_TRANSFER_MODE: + if (!isHDPro) + return ata_device_set_transfer_mode(fd->unit, ((hddAtaSetMode_t *)arg)->type, ((hddAtaSetMode_t *)arg)->mode); + else + return hdproata_device_set_transfer_mode(fd->unit, ((hddAtaSetMode_t *)arg)->type, ((hddAtaSetMode_t *)arg)->mode); + default: + return -EINVAL; + } } -static iop_device_ops_t xhdd_ops={ - &xhddInit, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - (void*)&xhddUnsupported, - &xhddDevctl, +static iop_device_ops_t xhdd_ops = { + &xhddInit, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + (void *)&xhddUnsupported, + &xhddDevctl, }; static iop_device_t xhddDevice = { - "xhdd", - IOP_DT_BLOCK | IOP_DT_FSEXT, - 1, - "XHDD", - &xhdd_ops -}; + "xhdd", + IOP_DT_BLOCK | IOP_DT_FSEXT, + 1, + "XHDD", + &xhdd_ops}; int _start(int argc, char *argv[]) { - int i; + int i; - isHDPro = 0; - for(i = 1; i < argc; i++) - { - if(!strcmp(argv[i], "-hdpro")) - isHDPro = 1; - } + isHDPro = 0; + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-hdpro")) + isHDPro = 1; + } - return AddDrv(&xhddDevice) == 0 ? MODULE_RESIDENT_END : MODULE_NO_RESIDENT_END; + return AddDrv(&xhddDevice) == 0 ? MODULE_RESIDENT_END : MODULE_NO_RESIDENT_END; } diff --git a/modules/iopcore/cdvdman/atad.c b/modules/iopcore/cdvdman/atad.c index 70f59638b..263bfb19d 100644 --- a/modules/iopcore/cdvdman/atad.c +++ b/modules/iopcore/cdvdman/atad.c @@ -67,8 +67,8 @@ static int io_sema = -1; #define ATAWRITE 0 #endif -#define ATA_EV_TIMEOUT 1 -#define ATA_EV_COMPLETE 2 +#define ATA_EV_TIMEOUT 1 +#define ATA_EV_COMPLETE 2 /* Local device info. */ static ata_devinfo_t atad_devinfo; @@ -89,15 +89,17 @@ static const ata_cmd_info_t smart_cmd_table[] = { #define SMART_CMD_TABLE_SIZE (sizeof smart_cmd_table / sizeof(ata_cmd_info_t)) /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ -typedef struct _ata_cmd_state { - s32 type; /* The ata_cmd_info_t type field. */ - union { - void *buf; - u8 *buf8; - u16 *buf16; - }; - u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ - s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ +typedef struct _ata_cmd_state +{ + s32 type; /* The ata_cmd_info_t type field. */ + union + { + void *buf; + u8 *buf8; + u16 *buf16; + }; + u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ + s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -108,20 +110,23 @@ static unsigned int ata_alarm_cb(void *unused); static void ata_set_dir(int dir); /* In v1.04, DMA was enabled in ata_set_dir() instead. */ -static void AtadPreDmaCb(int bcr, int dir){ - USE_SPD_REGS; +static void AtadPreDmaCb(int bcr, int dir) +{ + USE_SPD_REGS; - SPD_REG16(SPD_R_XFR_CTRL)|=0x80; + SPD_REG16(SPD_R_XFR_CTRL) |= 0x80; } -static void AtadPostDmaCb(int bcr, int dir){ - USE_SPD_REGS; +static void AtadPostDmaCb(int bcr, int dir) +{ + USE_SPD_REGS; - SPD_REG16(SPD_R_XFR_CTRL)&=~0x80; + SPD_REG16(SPD_R_XFR_CTRL) &= ~0x80; } #ifdef DEV9_DEBUG -static int ata_create_event_flag(void) { +static int ata_create_event_flag(void) +{ iop_event_t event; /* In v1.04, EA_MULTI was specified. */ @@ -205,11 +210,11 @@ int ata_get_error(void) return ata_hwport->r_error & 0xff; } -#define ATA_WAIT_BUSY 0x80 -#define ATA_WAIT_BUSBUSY 0x88 +#define ATA_WAIT_BUSY 0x80 +#define ATA_WAIT_BUSBUSY 0x88 -#define ata_wait_busy() gen_ata_wait_busy(ATA_WAIT_BUSY) -#define ata_wait_bus_busy() gen_ata_wait_busy(ATA_WAIT_BUSBUSY) +#define ata_wait_busy() gen_ata_wait_busy(ATA_WAIT_BUSY) +#define ata_wait_bus_busy() gen_ata_wait_busy(ATA_WAIT_BUSBUSY) /* 0x80 for busy, 0x88 for bus busy. In the original ATAD, the busy and bus-busy functions were separate, but similar. */ @@ -264,7 +269,7 @@ static int ata_device_select(int device) /* Select the device. */ ata_hwport->r_select = (device & 1) << 4; res = ata_hwport->r_control; - res = ata_hwport->r_control; //Only done once in v1.04. + res = ata_hwport->r_control; //Only done once in v1.04. return ata_wait_bus_busy(); } @@ -313,7 +318,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, } } - if (!(atad_cmd_state.type = type & 0x7F)) //Non-SONY: ignore the 48-bit LBA flag. + if (!(atad_cmd_state.type = type & 0x7F)) //Non-SONY: ignore the 48-bit LBA flag. return ATA_RES_ERR_CMD; atad_cmd_state.buf = buf; @@ -336,7 +341,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, /* Does this command need a timeout? */ using_timeout = 0; - switch (type & 0x7F) { //Non-SONY: ignore the 48-bit LBA flag. + switch (type & 0x7F) { //Non-SONY: ignore the 48-bit LBA flag. case 1: case 6: using_timeout = 1; @@ -379,7 +384,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, ata_hwport->r_sector = sector & 0xff; ata_hwport->r_lcyl = lcyl & 0xff; ata_hwport->r_hcyl = hcyl & 0xff; - ata_hwport->r_select = (select | ATA_SEL_LBA) & 0xff; //In v1.04, LBA was enabled in the ata_device_sector_io function. + ata_hwport->r_select = (select | ATA_SEL_LBA) & 0xff; //In v1.04, LBA was enabled in the ata_device_sector_io function. ata_hwport->r_command = command & 0xff; /* Turn on the LED. */ @@ -458,7 +463,7 @@ static inline int ata_dma_complete(void *buf, int blkcount, int dir) dev9IntrEnable(SPD_INTR_ATA); /* Wait for the previous transfer to complete or a timeout. */ - WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT|ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits); + WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT | ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits); if (bits & ATA_EV_TIMEOUT) { /* Timeout. */ M_PRINTF("Error: DMA timeout.\n"); @@ -473,7 +478,7 @@ static inline int ata_dma_complete(void *buf, int blkcount, int dir) pNetlogSend("Error: Command error status 0x%02x, error 0x%02x.\n", ata_hwport->r_status, ata_get_error()); #endif /* In v1.04, there was no check for ICRC. */ - return((ata_get_error() & ATA_ERR_ICRC) ? ATA_RES_ERR_ICRC : ATA_RES_ERR_IO); + return ((ata_get_error() & ATA_ERR_ICRC) ? ATA_RES_ERR_ICRC : ATA_RES_ERR_IO); } else { M_PRINTF("Warning: Got command interrupt, but not an error.\n"); continue; @@ -488,7 +493,7 @@ static inline int ata_dma_complete(void *buf, int blkcount, int dir) if ((res = dev9DmaTransfer(0, buf, (nbytes << 9) | 32, dir)) < 0) return res; - buf = (void*)((u8 *)buf + nbytes); + buf = (void *)((u8 *)buf + nbytes); blkcount -= count; } @@ -506,7 +511,7 @@ int ata_io_finish(void) unsigned short int stat; if (type == 1 || type == 6) { /* Non-data commands. */ - WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT|ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits); + WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT | ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits); if (bits & ATA_EV_TIMEOUT) { /* Timeout. */ M_PRINTF("Error: ATA timeout on a non-data command.\n"); return ATA_RES_ERR_TIMEOUT; @@ -521,7 +526,7 @@ int ata_io_finish(void) break; if (!stat) { dev9IntrEnable(SPD_INTR_ATA0); - WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT|ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits); + WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT | ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits); if (bits & ATA_EV_TIMEOUT) { M_PRINTF("Error: ATA timeout on DMA completion.\n"); res = ATA_RES_ERR_TIMEOUT; @@ -559,7 +564,7 @@ int ata_io_finish(void) /* Turn off the LED. */ dev9LEDCtl(0); - if(res) + if (res) M_PRINTF("error: ATA failed, %d\n", res); return res; @@ -600,7 +605,7 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) command = ((dir == 1) && (ATAWRITE)) ? ATA_C_WRITE_DMA : ATA_C_READ_DMA; } - for(retries = 3; retries > 0; retries--) { + for (retries = 3; retries > 0; retries--) { if ((res = ata_io_start(buf, len, 0, len, sector, lcyl, hcyl, select, command)) != 0) break; @@ -612,11 +617,11 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) /* In v1.04, this was not done. Neither was there a mechanism to retry if a non-permanent error occurs. */ SPD_REG16(SPD_R_IF_CTRL) &= ~SPD_IF_DMA_ENABLE; - if(res != ATA_RES_ERR_ICRC) + if (res != ATA_RES_ERR_ICRC) break; } - buf = (void*)((u8 *)buf + len * 512); + buf = (void *)((u8 *)buf + len * 512); lba += len; nsectors -= len; } @@ -641,5 +646,5 @@ static void ata_set_dir(int dir) val = SPD_REG16(SPD_R_IF_CTRL) & 1; val |= (dir == ATA_DIR_WRITE) ? 0x4c : 0x4e; SPD_REG16(SPD_R_IF_CTRL) = val; - SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x6; //In v1.04, DMA was enabled here (0x86 instead of 0x6) + SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x6; //In v1.04, DMA was enabled here (0x86 instead of 0x6) } diff --git a/modules/iopcore/cdvdman/atad.h b/modules/iopcore/cdvdman/atad.h index 8d095c9d0..c903e7c94 100644 --- a/modules/iopcore/cdvdman/atad.h +++ b/modules/iopcore/cdvdman/atad.h @@ -38,14 +38,14 @@ typedef struct _ata_devinfo } ata_devinfo_t; /* Error definitions. */ -#define ATA_RES_ERR_NOTREADY -501 -#define ATA_RES_ERR_TIMEOUT -502 -#define ATA_RES_ERR_IO -503 -#define ATA_RES_ERR_NODATA -504 -#define ATA_RES_ERR_NODEV -505 -#define ATA_RES_ERR_CMD -506 -#define ATA_RES_ERR_LOCKED -509 -#define ATA_RES_ERR_ICRC -510 +#define ATA_RES_ERR_NOTREADY -501 +#define ATA_RES_ERR_TIMEOUT -502 +#define ATA_RES_ERR_IO -503 +#define ATA_RES_ERR_NODATA -504 +#define ATA_RES_ERR_NODEV -505 +#define ATA_RES_ERR_CMD -506 +#define ATA_RES_ERR_LOCKED -509 +#define ATA_RES_ERR_ICRC -510 int atad_start(void); ata_devinfo_t *ata_get_devinfo(int device); diff --git a/modules/iopcore/cdvdman/dev9.c b/modules/iopcore/cdvdman/dev9.c index 390ca6971..ac7bada56 100644 --- a/modules/iopcore/cdvdman/dev9.c +++ b/modules/iopcore/cdvdman/dev9.c @@ -84,8 +84,7 @@ static int expbay_init(void); static int dev9x_dummy(void) { return 0; } static int dev9x_devctl(iop_file_t *f, const char *name, int cmd, void *args, int arglen, void *buf, int buflen) { - switch(cmd) - { + switch (cmd) { case DDIOC_MODEL: return dev9type; case DDIOC_OFF: @@ -300,8 +299,8 @@ int dev9DmaTransfer(int ctrl, void *buf, int bcr, int dir) dev9_predma_cbs[ctrl](bcr, dir); dev9_chan->madr = (u32)buf; - dev9_chan->bcr = bcr; - dev9_chan->chcr = DMAC_CHCR_30|DMAC_CHCR_TR|DMAC_CHCR_CO|(dir & DMAC_CHCR_DR); + dev9_chan->bcr = bcr; + dev9_chan->chcr = DMAC_CHCR_30 | DMAC_CHCR_TR | DMAC_CHCR_CO | (dir & DMAC_CHCR_DR); /* Wait for DMA to complete. Do not use a semaphore as thread switching hurts throughput greatly. */ while (dev9_chan->chcr & DMAC_CHCR_TR) { diff --git a/modules/iopcore/cdvdman/hdpro_atad.c b/modules/iopcore/cdvdman/hdpro_atad.c index 0ee67e18e..03d32cd19 100644 --- a/modules/iopcore/cdvdman/hdpro_atad.c +++ b/modules/iopcore/cdvdman/hdpro_atad.c @@ -85,8 +85,8 @@ static int io_sema = -1; #define ATAWRITE 0 #endif -#define ATA_EV_TIMEOUT 1 -#define ATA_EV_COMPLETE 2 //Unused as there is no completion interrupt +#define ATA_EV_TIMEOUT 1 +#define ATA_EV_COMPLETE 2 //Unused as there is no completion interrupt /* Local device info. */ static ata_devinfo_t atad_devinfo; @@ -115,14 +115,16 @@ static const ata_cmd_info_t smart_cmd_table[] = { #define SMART_CMD_TABLE_SIZE (sizeof smart_cmd_table / sizeof(ata_cmd_info_t)) /* This is the state info tracked between ata_io_start() and ata_io_finish(). */ -typedef struct _ata_cmd_state { - s32 type; /* The ata_cmd_info_t type field. */ - union { - void *buf; - u8 *buf8; - u16 *buf16; - }; - u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ +typedef struct _ata_cmd_state +{ + s32 type; /* The ata_cmd_info_t type field. */ + union + { + void *buf; + u8 *buf8; + u16 *buf16; + }; + u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */ } ata_cmd_state_t; static ata_cmd_state_t atad_cmd_state; @@ -169,7 +171,7 @@ int atad_start(void) M_PRINTF(BANNER, VERSION); - event.attr = EA_SINGLE; //In v1.04, EA_MULTI was specified. + event.attr = EA_SINGLE; //In v1.04, EA_MULTI was specified. event.bits = 0; if ((ata_evflg = CreateEventFlag(&event)) < 0) { M_PRINTF("Couldn't create event flag, exiting.\n"); @@ -207,11 +209,11 @@ int ata_get_error() return hdpro_io_read(ATAreg_ERROR_RD) & 0xff; } -#define ATA_WAIT_BUSY 0x80 -#define ATA_WAIT_BUSBUSY 0x88 +#define ATA_WAIT_BUSY 0x80 +#define ATA_WAIT_BUSBUSY 0x88 -#define ata_wait_busy() gen_ata_wait_busy(ATA_WAIT_BUSY) -#define ata_wait_bus_busy() gen_ata_wait_busy(ATA_WAIT_BUSBUSY) +#define ata_wait_busy() gen_ata_wait_busy(ATA_WAIT_BUSY) +#define ata_wait_bus_busy() gen_ata_wait_busy(ATA_WAIT_BUSBUSY) /* 0x80 for busy, 0x88 for bus busy. In the original ATAD, the busy and bus-busy functions were separate, but similar. */ @@ -458,7 +460,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, case 6: using_timeout = 1; break; - //Support for DMA commands (type = 4) is removed because HDPro cannot support DMA. The original HDPro driver still had code for it though. + //Support for DMA commands (type = 4) is removed because HDPro cannot support DMA. The original HDPro driver still had code for it though. } if (using_timeout) { @@ -498,7 +500,7 @@ int ata_io_start(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, hdpro_io_write(ATAreg_LCYL_WR, lcyl & 0xff); hdpro_io_write(ATAreg_HCYL_WR, hcyl & 0xff); - hdpro_io_write(ATAreg_SELECT_WR, (select | ATA_SEL_LBA) & 0xff); //In v1.04, LBA was enabled in the ata_device_sector_io function. + hdpro_io_write(ATAreg_SELECT_WR, (select | ATA_SEL_LBA) & 0xff); //In v1.04, LBA was enabled in the ata_device_sector_io function. hdpro_io_write(ATAreg_COMMAND_WR, command & 0xff); return 0; @@ -599,8 +601,7 @@ int ata_io_finish(void) if (type == 1 || type == 6) { /* Non-data commands. */ //Unlike ATAD, poll until the device either completes its command or times out. There is no completion interrupt. - while (1) - { + while (1) { suspend_intr(); HDPROreg_IO8 = 0x21; @@ -615,8 +616,7 @@ int ata_io_finish(void) /* The original did not check on the return value of PollEventFlag, but PollEventFlag does not seem to return the event flag's bits if the wait condition is not satisfied. */ - if (PollEventFlag(ata_evflg, ATA_EV_TIMEOUT|ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits) == 0) - { + if (PollEventFlag(ata_evflg, ATA_EV_TIMEOUT | ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits) == 0) { if (bits & ATA_EV_TIMEOUT) { /* Timeout. */ M_PRINTF("Error: ATA timeout on a non-data command.\n"); return ATA_RES_ERR_TIMEOUT; @@ -626,7 +626,7 @@ int ata_io_finish(void) DelayThread(500); } - /* Support for DMA commands (type = 4) is removed because HDPro cannot support DMA. + /* Support for DMA commands (type = 4) is removed because HDPro cannot support DMA. The original would return ATA_RES_ERR_TIMEOUT for type = 4. */ } else { /* PIO transfers. */ stat = hdpro_io_read(ATAreg_CONTROL_RD); @@ -702,7 +702,7 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) continue; nbytes = len * 512; - buf = (void*)((u8 *)buf + len * 512); + buf = (void *)((u8 *)buf + len * 512); lba += len; nsectors -= len; } diff --git a/modules/iopcore/cdvdman/ioman_add.h b/modules/iopcore/cdvdman/ioman_add.h index 3aaee735d..4eea2adca 100644 --- a/modules/iopcore/cdvdman/ioman_add.h +++ b/modules/iopcore/cdvdman/ioman_add.h @@ -12,30 +12,6 @@ typedef struct _iop_ext_device struct _iop_ext_device_ops *ops; } iop_ext_device_t; -typedef struct -{ - /*00*/ unsigned int mode; - /*04*/ unsigned int attr; - /*08*/ unsigned int size; - /*0c*/ unsigned char ctime[8]; - /*14*/ unsigned char atime[8]; - /*1c*/ unsigned char mtime[8]; - /*24*/ unsigned int hisize; - /*28*/ unsigned int private_0; /* Number of subs (main) / subpart number (sub) */ - /*2c*/ unsigned int private_1; - /*30*/ unsigned int private_2; - /*34*/ unsigned int private_3; - /*38*/ unsigned int private_4; - /*3c*/ unsigned int private_5; /* Sector start. */ -} iox_stat_t; - -typedef struct -{ - iox_stat_t stat; - char name[256]; - unsigned int unknown; -} iox_dirent_t; - typedef struct _iop_ext_device_ops { int (*init)(iop_device_t *); diff --git a/modules/mcemu/ioman_add.h b/modules/mcemu/ioman_add.h index 3eab754b6..d3506e537 100644 --- a/modules/mcemu/ioman_add.h +++ b/modules/mcemu/ioman_add.h @@ -12,30 +12,6 @@ typedef struct _iop_ext_device struct _iop_ext_device_ops *ops; } iop_ext_device_t; -typedef struct -{ - /*00*/ unsigned int mode; - /*04*/ unsigned int attr; - /*08*/ unsigned int size; - /*0c*/ unsigned char ctime[8]; - /*14*/ unsigned char atime[8]; - /*1c*/ unsigned char mtime[8]; - /*24*/ unsigned int hisize; - /*28*/ unsigned int private_0; /* Number of subs (main) / subpart number (sub) */ - /*2c*/ unsigned int private_1; - /*30*/ unsigned int private_2; - /*34*/ unsigned int private_3; - /*38*/ unsigned int private_4; - /*3c*/ unsigned int private_5; /* Sector start. */ -} iox_stat_t; - -typedef struct -{ - iox_stat_t stat; - char name[256]; - unsigned int unknown; -} iox_dirent_t; - typedef struct _iop_ext_device_ops { int (*init)(iop_device_t *); diff --git a/modules/network/SMSTCPIP/include/arch/sys_arch.h b/modules/network/SMSTCPIP/include/arch/sys_arch.h index 838cd27e6..4ec30b634 100644 --- a/modules/network/SMSTCPIP/include/arch/sys_arch.h +++ b/modules/network/SMSTCPIP/include/arch/sys_arch.h @@ -14,9 +14,9 @@ void *ps2ip_mem_malloc(int size); void ps2ip_mem_free(void *rmem); void *ps2ip_mem_realloc(void *rmem, int newsize); -#define mem_clib_free ps2ip_mem_free -#define mem_clib_malloc ps2ip_mem_malloc -#define mem_clib_realloc ps2ip_mem_realloc +#define mem_clib_free ps2ip_mem_free +#define mem_clib_malloc ps2ip_mem_malloc +#define mem_clib_realloc ps2ip_mem_realloc #endif #endif /* __SYS_ARCH_H__ */ diff --git a/modules/network/SMSTCPIP/mem.c b/modules/network/SMSTCPIP/mem.c index 4efa94fdb..b56b94934 100644 --- a/modules/network/SMSTCPIP/mem.c +++ b/modules/network/SMSTCPIP/mem.c @@ -54,8 +54,7 @@ #if MEM_LIBC_MALLOC /** mem_init is not used when using C library malloc(). */ -void -mem_init(void) +void mem_init(void) { } @@ -85,13 +84,13 @@ mem_init(void) void * mem_malloc(mem_size_t size) { - void* ret = mem_clib_malloc(size); + void *ret = mem_clib_malloc(size); if (ret == NULL) { #if MEM_STATS ++lwip_stats.mem.err; #endif /* MEM_STATS */ } else { - LWIP_ASSERT("malloc() must return aligned memory", LWIP_MEM_ALIGN(ret) == ret); + LWIP_ASSERT("malloc() must return aligned memory", LWIP_MEM_ALIGN(ret) == ret); } return ret; } @@ -100,8 +99,7 @@ mem_malloc(mem_size_t size) * * @param rmem is the pointer as returned by a previous call to mem_malloc() */ -void -mem_free(void *rmem) +void mem_free(void *rmem) { LWIP_ASSERT("rmem != NULL", (rmem != NULL)); LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem))); @@ -111,13 +109,13 @@ mem_free(void *rmem) void * mem_realloc(void *rmem, mem_size_t newsize) { - void* ret = mem_clib_realloc(rmem, newsize); + void *ret = mem_clib_realloc(rmem, newsize); if (ret == NULL) { #if MEM_STATS ++lwip_stats.mem.err; #endif /* MEM_STATS */ } else { - LWIP_ASSERT("realloc() must return aligned memory", LWIP_MEM_ALIGN(ret) == ret); + LWIP_ASSERT("realloc() must return aligned memory", LWIP_MEM_ALIGN(ret) == ret); } return ret; } @@ -222,8 +220,7 @@ void mem_free(void *rmem) SYS_ARCH_DECL_PROTECT(old_level); SYS_ARCH_PROTECT(old_level); - LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram && - (u8_t *)rmem < (u8_t *)ram_end); + LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram && (u8_t *)rmem < (u8_t *)ram_end); if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { LWIP_DEBUGF(MEM_DEBUG | 3, ("mem_free: illegal memory\n")); @@ -271,8 +268,7 @@ mem_realloc(void *rmem, mem_size_t newsize) SYS_ARCH_DECL_PROTECT(old_level); SYS_ARCH_PROTECT(old_level); - LWIP_ASSERT("mem_realloc: legal memory", (u8_t *)rmem >= (u8_t *)ram && - (u8_t *)rmem < (u8_t *)ram_end); + LWIP_ASSERT("mem_realloc: legal memory", (u8_t *)rmem >= (u8_t *)ram && (u8_t *)rmem < (u8_t *)ram_end); if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { LWIP_DEBUGF(MEM_DEBUG | 3, ("mem_realloc: illegal memory\n")); @@ -378,7 +374,7 @@ mem_malloc(mem_size_t size) return NULL; } -#endif /* MEM_LIBC_MALLOC */ +#endif /* MEM_LIBC_MALLOC */ void * mem_reallocm(void *rmem, mem_size_t newsize) diff --git a/modules/network/SMSTCPIP/ps2ip.c b/modules/network/SMSTCPIP/ps2ip.c index 4d2a239ab..804641b90 100644 --- a/modules/network/SMSTCPIP/ps2ip.c +++ b/modules/network/SMSTCPIP/ps2ip.c @@ -571,7 +571,7 @@ void sys_sem_free(sys_sem_t aSema) void *ps2ip_mem_malloc(int size) { int OldState; - void* ret; + void *ret; CpuSuspendIntr(&OldState); ret = AllocSysMemory(ALLOC_LAST, size, NULL); @@ -594,7 +594,7 @@ void ps2ip_mem_free(void *rmem) void *ps2ip_mem_realloc(void *rmem, int newsize) { int OldState; - void* ret; + void *ret; CpuSuspendIntr(&OldState); FreeSysMemory(rmem); diff --git a/modules/network/SMSTCPIP/tcp_out.c b/modules/network/SMSTCPIP/tcp_out.c index e5233919d..fb6e9327f 100644 --- a/modules/network/SMSTCPIP/tcp_out.c +++ b/modules/network/SMSTCPIP/tcp_out.c @@ -280,8 +280,7 @@ err_t tcp_enqueue( pcb->snd_queuelen = queuelen; LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: %d (after enqueued)\n", pcb->snd_queuelen)); if (pcb->snd_queuelen != 0) { - LWIP_ASSERT("tcp_enqueue: valid queue length", pcb->unacked != NULL || - pcb->unsent != NULL); + LWIP_ASSERT("tcp_enqueue: valid queue length", pcb->unacked != NULL || pcb->unsent != NULL); } /* Set the PSH flag in the last segment that we enqueued, but only @@ -298,8 +297,7 @@ err_t tcp_enqueue( tcp_segs_free(queue); } if (pcb->snd_queuelen != 0) { - LWIP_ASSERT("tcp_enqueue: valid queue length", pcb->unacked != NULL || - pcb->unsent != NULL); + LWIP_ASSERT("tcp_enqueue: valid queue length", pcb->unacked != NULL || pcb->unsent != NULL); } LWIP_DEBUGF(TCP_QLEN_DEBUG | DBG_STATE, ("tcp_enqueue: %d (with mem err)\n", pcb->snd_queuelen)); return ERR_MEM; @@ -447,8 +445,7 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb) LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_output_segment: rtseq %lu\n", pcb->rtseq)); } LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %lu:%lu\n", - htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) + - seg->len)); + htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) + seg->len)); len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload); diff --git a/modules/network/smap-ingame/smap.c b/modules/network/smap-ingame/smap.c index 99726d9d3..452002fcd 100644 --- a/modules/network/smap-ingame/smap.c +++ b/modules/network/smap-ingame/smap.c @@ -46,9 +46,9 @@ #define DEV9_SMAP_ALL_INTR_MASK (SMAP_INTR_EMAC3 | SMAP_INTR_RXEND | SMAP_INTR_TXEND | SMAP_INTR_RXDNV | SMAP_INTR_TXDNV) //Unlike the SONY original, the RXDNV interrupt is not handled as statistics are not recorded. //For the sake of simplicity, Tx channel 0 is operated in single-mode. Do not handle TXDNV. -#define DEV9_SMAP_INTR_MASK (SMAP_INTR_EMAC3|SMAP_INTR_RXEND) +#define DEV9_SMAP_INTR_MASK (SMAP_INTR_EMAC3 | SMAP_INTR_RXEND) //The Tx interrupt events are handled separately -#define DEV9_SMAP_INTR_MASK2 (SMAP_INTR_EMAC3|SMAP_INTR_RXEND) +#define DEV9_SMAP_INTR_MASK2 (SMAP_INTR_EMAC3 | SMAP_INTR_RXEND) struct SmapDriverData SmapDriverData; @@ -58,39 +58,42 @@ static unsigned int SmapConfiguration = 0x5E0; extern void *_gp; -static void _smap_write_phy(volatile u8 *emac3_regbase, unsigned int address, u16 value){ +static void _smap_write_phy(volatile u8 *emac3_regbase, unsigned int address, u16 value) +{ u32 PHYRegisterValue; unsigned int i; - PHYRegisterValue=(address&SMAP_E3_PHY_REG_ADDR_MSK)|SMAP_E3_PHY_WRITE|((SMAP_DsPHYTER_ADDRESS&SMAP_E3_PHY_ADDR_MSK)<=100) break; + if (i >= 100) + break; } //if(i>=100) printf("smap: %s: > %d ms\n", "_smap_write_phy", i); } -static u16 _smap_read_phy(volatile u8 *emac3_regbase, unsigned int address){ +static u16 _smap_read_phy(volatile u8 *emac3_regbase, unsigned int address) +{ unsigned int i; u32 value, PHYRegisterValue; u16 result; - PHYRegisterValue=(address&SMAP_E3_PHY_REG_ADDR_MSK)|SMAP_E3_PHY_READ|((SMAP_DsPHYTER_ADDRESS&SMAP_E3_PHY_ADDR_MSK)<> SMAP_E3_PHY_DATA_BITSFT); break; } @@ -99,9 +102,10 @@ static u16 _smap_read_phy(volatile u8 *emac3_regbase, unsigned int address){ DelayThread(1000); i++; - }while(i<100); + } while (i < 100); - if(i>=100) printf("smap: %s: > %d ms\n", "_smap_read_phy", i); + if (i >= 100) + printf("smap: %s: > %d ms\n", "_smap_read_phy", i); return result; } @@ -365,7 +369,7 @@ static int Dev9IntrCb(int flag) while ((IntrReg = SPD_REG16(SPD_R_INTR_STAT) & DEV9_SMAP_INTR_MASK) != 0) { if (IntrReg & SMAP_INTR_EMAC3) { SMAP_REG16(SMAP_R_INTR_CLR) = SMAP_INTR_EMAC3; - SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTR_STAT, SMAP_E3_INTR_TX_ERR_0|SMAP_E3_INTR_SQE_ERR_0|SMAP_E3_INTR_DEAD_0); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTR_STAT, SMAP_E3_INTR_TX_ERR_0 | SMAP_E3_INTR_SQE_ERR_0 | SMAP_E3_INTR_DEAD_0); } if (IntrReg & SMAP_INTR_RXEND) { SMAP_REG16(SMAP_R_INTR_CLR) = SMAP_INTR_RXEND; @@ -603,7 +607,7 @@ int smap_init(int argc, char *argv[]) SMAP_EMAC3_SET32(SMAP_R_EMAC3_TxMODE1, 7 << SMAP_E3_TX_LOW_REQ_BITSFT | 15 << SMAP_E3_TX_URG_REQ_BITSFT); SMAP_EMAC3_SET32(SMAP_R_EMAC3_RxMODE, SMAP_E3_RX_STRIP_PAD | SMAP_E3_RX_STRIP_FCS | SMAP_E3_RX_INDIVID_ADDR | SMAP_E3_RX_BCAST | SMAP_E3_RX_MCAST); SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTR_STAT, SMAP_E3_INTR_TX_ERR_0 | SMAP_E3_INTR_SQE_ERR_0 | SMAP_E3_INTR_DEAD_0); - SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTR_ENABLE, SMAP_E3_INTR_TX_ERR_0|SMAP_E3_INTR_SQE_ERR_0|SMAP_E3_INTR_DEAD_0); + SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTR_ENABLE, SMAP_E3_INTR_TX_ERR_0 | SMAP_E3_INTR_SQE_ERR_0 | SMAP_E3_INTR_DEAD_0); mac_address = (u16)(eeprom_data[0] >> 8 | eeprom_data[0] << 8); SMAP_EMAC3_SET32(SMAP_R_EMAC3_ADDR_HI, mac_address); diff --git a/modules/pademu/ds3bt.c b/modules/pademu/ds3bt.c index 745111c4c..201486fda 100644 --- a/modules/pademu/ds3bt.c +++ b/modules/pademu/ds3bt.c @@ -164,7 +164,7 @@ int bt_connect(int devId) DPRINTF("DS3BT: Failed to allocate I/O semaphore.\n"); return -1; } - + if ((bt_dev.l2cap_cmd_sema = CreateSema(&SemaData)) < 0) { DPRINTF("DS3BT: Failed to allocate I/O semaphore.\n"); return -1; @@ -295,104 +295,100 @@ UsbDriver chrg_driver = {NULL, NULL, "chrg", chrg_probe, chrg_connect, chrg_disc /* PS Remote Reports */ static uint8_t feature_F4_report[] = -{ - 0x42, 0x03, 0x00, 0x00 -}; + { + 0x42, 0x03, 0x00, 0x00}; static uint8_t output_01_report[] = -{ - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00 -}; + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; static uint8_t led_patterns[][2] = -{ - { 0x1C, 0x02 }, - { 0x1A, 0x04 }, - { 0x16, 0x08 }, - { 0x0E, 0x10 }, + { + {0x1C, 0x02}, + {0x1A, 0x04}, + {0x16, 0x08}, + {0x0E, 0x10}, }; static uint8_t power_level[] = -{ - 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E -}; + { + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; // Taken from nefarius' SCPToolkit // https://github.com/nefarius/ScpToolkit/blob/master/ScpControl/ScpControl.ini // Valid MAC addresses used by Sony static uint8_t GenuineMacAddress[][3] = -{ - // Bluetooth chips by ALPS ELECTRIC CO., LTD - {0x00, 0x02, 0xC7}, - {0x00, 0x06, 0xF5}, - {0x00, 0x06, 0xF7}, - {0x00, 0x07, 0x04}, - {0x00, 0x16, 0xFE}, - {0x00, 0x19, 0xC1}, - {0x00, 0x1B, 0xFB}, - {0x00, 0x1E, 0x3D}, - {0x00, 0x21, 0x4F}, - {0x00, 0x23, 0x06}, - {0x00, 0x24, 0x33}, - {0x00, 0x26, 0x43}, - {0x00, 0xA0, 0x79}, - {0x04, 0x76, 0x6E}, - {0x04, 0x98, 0xF3}, - {0x28, 0xA1, 0x83}, - {0x34, 0xC7, 0x31}, - {0x38, 0xC0, 0x96}, - {0x60, 0x38, 0x0E}, - {0x64, 0xD4, 0xBD}, - {0xAC, 0x7A, 0x4D}, - {0xE0, 0x75, 0x0A}, - {0xE0, 0xAE, 0x5E}, - {0xFC, 0x62, 0xB9}, - // Bluetooth chips by AzureWave Technology Inc. - {0xE0, 0xB9, 0xA5}, - {0xDC, 0x85, 0xDE}, - {0xD0, 0xE7, 0x82}, - {0xB0, 0xEE, 0x45}, - {0xAC, 0x89, 0x95}, - {0xA8, 0x1D, 0x16}, - {0x94, 0xDB, 0xC9}, - {0x80, 0xD2, 0x1D}, - {0x80, 0xA5, 0x89}, - {0x78, 0x18, 0x81}, - {0x74, 0xF0, 0x6D}, - {0x74, 0xC6, 0x3B}, - {0x74, 0x2F, 0x68}, - {0x6C, 0xAD, 0xF8}, - {0x6C, 0x71, 0xD9}, - {0x60, 0x5B, 0xB4}, - {0x5C, 0x96, 0x56}, - {0x54, 0x27, 0x1E}, - {0x4C, 0xAA, 0x16}, - {0x48, 0x5D, 0x60}, - {0x44, 0xD8, 0x32}, - {0x40, 0xE2, 0x30}, - {0x38, 0x4F, 0xF0}, - {0x28, 0xC2, 0xDD}, - {0x24, 0x0A, 0x64}, - {0x1C, 0x4B, 0xD6}, - {0x08, 0xA9, 0x5A}, - {0x00, 0x25, 0xD3}, - {0x00, 0x24, 0x23}, - {0x00, 0x22, 0x43}, - {0x00, 0x15, 0xAF}, - //fake with AirohaTechnologyCorp's Chip - {0x0C, 0xFC, 0x83} -}; + { + // Bluetooth chips by ALPS ELECTRIC CO., LTD + {0x00, 0x02, 0xC7}, + {0x00, 0x06, 0xF5}, + {0x00, 0x06, 0xF7}, + {0x00, 0x07, 0x04}, + {0x00, 0x16, 0xFE}, + {0x00, 0x19, 0xC1}, + {0x00, 0x1B, 0xFB}, + {0x00, 0x1E, 0x3D}, + {0x00, 0x21, 0x4F}, + {0x00, 0x23, 0x06}, + {0x00, 0x24, 0x33}, + {0x00, 0x26, 0x43}, + {0x00, 0xA0, 0x79}, + {0x04, 0x76, 0x6E}, + {0x04, 0x98, 0xF3}, + {0x28, 0xA1, 0x83}, + {0x34, 0xC7, 0x31}, + {0x38, 0xC0, 0x96}, + {0x60, 0x38, 0x0E}, + {0x64, 0xD4, 0xBD}, + {0xAC, 0x7A, 0x4D}, + {0xE0, 0x75, 0x0A}, + {0xE0, 0xAE, 0x5E}, + {0xFC, 0x62, 0xB9}, + // Bluetooth chips by AzureWave Technology Inc. + {0xE0, 0xB9, 0xA5}, + {0xDC, 0x85, 0xDE}, + {0xD0, 0xE7, 0x82}, + {0xB0, 0xEE, 0x45}, + {0xAC, 0x89, 0x95}, + {0xA8, 0x1D, 0x16}, + {0x94, 0xDB, 0xC9}, + {0x80, 0xD2, 0x1D}, + {0x80, 0xA5, 0x89}, + {0x78, 0x18, 0x81}, + {0x74, 0xF0, 0x6D}, + {0x74, 0xC6, 0x3B}, + {0x74, 0x2F, 0x68}, + {0x6C, 0xAD, 0xF8}, + {0x6C, 0x71, 0xD9}, + {0x60, 0x5B, 0xB4}, + {0x5C, 0x96, 0x56}, + {0x54, 0x27, 0x1E}, + {0x4C, 0xAA, 0x16}, + {0x48, 0x5D, 0x60}, + {0x44, 0xD8, 0x32}, + {0x40, 0xE2, 0x30}, + {0x38, 0x4F, 0xF0}, + {0x28, 0xC2, 0xDD}, + {0x24, 0x0A, 0x64}, + {0x1C, 0x4B, 0xD6}, + {0x08, 0xA9, 0x5A}, + {0x00, 0x25, 0xD3}, + {0x00, 0x24, 0x23}, + {0x00, 0x22, 0x43}, + {0x00, 0x15, 0xAF}, + //fake with AirohaTechnologyCorp's Chip + {0x0C, 0xFC, 0x83}}; /* variables used by high level HCI task */ static uint16_t hci_counter_; // counter used for bluetooth HCI loops @@ -536,9 +532,9 @@ static void l2cap_event_cb(int resultCode, int bytes, void *arg) } if (ds3pad[pad].l2cap_state_ != L2CAP_READY_STATE) { //ds3 is connecting - DelayThread(14000); //fix for some bt adapters + DelayThread(14000); //fix for some bt adapters UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); - } else { //ds3 is running + } else { //ds3 is running if ((int)arg != -1 && pad != (int)arg && (int)arg < MAX_PADS) { //check if we get what was requested if (ret_ctr == 20) { ret_ctr = 0; @@ -1298,21 +1294,19 @@ static void readReport(uint8_t *data, int bytes, int pad) ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 } - if (data[DATA_START + PSButtonState]) { //display battery level + if (data[DATA_START + PSButtonState]) { //display battery level if ((data[DATA_START + ButtonStateL] & 1) && (btn_delay == MAX_DELAY)) { //PS + SELECT - if(ds3pad[pad].analog_btn < 2) //unlocked mode + if (ds3pad[pad].analog_btn < 2) //unlocked mode ds3pad[pad].analog_btn = !ds3pad[pad].analog_btn; - + ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; btn_delay = 0; - } - else if(data[DATA_START + Power] != 0xEE) + } else if (data[DATA_START + Power] != 0xEE) ds3pad[pad].oldled = power_level[data[DATA_START + Power]]; if (btn_delay < MAX_DELAY) btn_delay++; - } - else + } else ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; if (data[DATA_START + Power] == 0xEE) //charging @@ -1357,7 +1351,7 @@ static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) mips_memcpy(&led_buf[2], output_01_report, sizeof(output_01_report)); // PS3_01_REPORT_LEN); if (ds3pad[pad].type == 0xA2) { - if(rrum < 5) + if (rrum < 5) rrum = 0; } @@ -1405,8 +1399,7 @@ static int Rumble(uint8_t lrum, uint8_t rrum, int pad) SignalSema(bt_dev.l2cap_sema); } - } - else + } else DPRINTF("DS3BT: LEDRumble usb transfer error %d\n", ret); return ret; @@ -1446,7 +1439,7 @@ void ds3bt_set_mode(int mode, int lock, int port) { WaitSema(update_sema); - if (lock == 3) + if (lock == 3) ds3pad[port].analog_btn = 3; else ds3pad[port].analog_btn = mode; @@ -1458,15 +1451,14 @@ static void update_thread(void *param) { int ret; - while(1) - { + while (1) { SleepThread(); if (update_rum) { Rumble(update_lrum, update_rrum, update_port); update_rum = 0; } - + WaitSema(bt_dev.l2cap_sema); ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)update_port); @@ -1509,7 +1501,7 @@ int ds3bt_get_data(char *dst, int size, int port) void ds3bt_set_mode(int mode, int lock, int port) { - if (lock == 3) + if (lock == 3) ds3pad[port].analog_btn = 3; else ds3pad[port].analog_btn = mode; diff --git a/modules/pademu/ds3usb.c b/modules/pademu/ds3usb.c index 5430e380c..6fddd6a03 100644 --- a/modules/pademu/ds3usb.c +++ b/modules/pademu/ds3usb.c @@ -23,33 +23,31 @@ #define MAX_PADS 2 static uint8_t output_01_report[] = -{ - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00 -}; + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; static uint8_t led_patterns[][2] = -{ - { 0x1C, 0x02 }, - { 0x1A, 0x04 }, - { 0x16, 0x08 }, - { 0x0E, 0x10 }, + { + {0x1C, 0x02}, + {0x1A, 0x04}, + {0x16, 0x08}, + {0x0E, 0x10}, }; static uint8_t power_level[] = -{ - 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E -}; + { + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; static uint8_t usb_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; @@ -282,21 +280,19 @@ static void readReport(uint8_t *data, int pad) ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 - if (data[DATA_START + PSButtonState]) { //display battery level + if (data[DATA_START + PSButtonState]) { //display battery level if ((data[DATA_START + ButtonStateL] & 1) && (btn_delay == MAX_DELAY)) { //PS + SELECT - if(ds3pad[pad].analog_btn < 2) //unlocked mode + if (ds3pad[pad].analog_btn < 2) //unlocked mode ds3pad[pad].analog_btn = !ds3pad[pad].analog_btn; - + ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; btn_delay = 0; - } - else if(data[DATA_START + Power] != 0xEE) + } else if (data[DATA_START + Power] != 0xEE) ds3pad[pad].oldled = power_level[data[DATA_START + Power]]; if (btn_delay < MAX_DELAY) btn_delay++; - } - else + } else ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; if (data[DATA_START + Power] == 0xEE) //charging @@ -404,7 +400,7 @@ void ds3usb_set_mode(int mode, int lock, int port) { WaitSema(ds3pad[port].sema); - if (lock == 3) + if (lock == 3) ds3pad[port].analog_btn = 3; else ds3pad[port].analog_btn = mode; @@ -428,11 +424,10 @@ int ds3usb_get_status(int port) WaitSema(ds3pad[port].sema); status = ds3pad[port].status; SignalSema(ds3pad[port].sema); - } - else { + } else { return ds3pad[port].status; } - + return status; } diff --git a/modules/pademu/imports.lst b/modules/pademu/imports.lst index 380d07482..ce4ee8f2f 100644 --- a/modules/pademu/imports.lst +++ b/modules/pademu/imports.lst @@ -37,13 +37,13 @@ I_CpuResumeIntr intrman_IMPORTS_end usbd_IMPORTS_start -I_UsbGetDeviceStaticDescriptor -I_UsbOpenEndpoint -I_UsbCloseEndpoint -I_UsbOpenEndpointAligned -I_UsbSetDevicePrivateData -I_UsbTransfer -I_UsbRegisterDriver +I_sceUsbdScanStaticDescriptor +I_sceUsbdOpenPipe +I_sceUsbdClosePipe +I_sceUsbdOpenPipeAligned +I_sceUsbdSetPrivateData +I_sceUsbdTransferPipe +I_sceUsbdRegisterLdd usbd_IMPORTS_end sysclib_IMPORTS_start diff --git a/modules/pademu/pademu.c b/modules/pademu/pademu.c index 49c9ca4fd..6ba3755b3 100644 --- a/modules/pademu/pademu.c +++ b/modules/pademu/pademu.c @@ -106,14 +106,14 @@ int _start(int argc, char *argv[]) #ifdef VMC uint8_t vmc = 0; - + if (argc > 1) vmc = argv[1][3]; - if(!vmc) + if (!vmc) #endif - if (!install_sio2hook()) - return MODULE_NO_RESIDENT_END; + if (!install_sio2hook()) + return MODULE_NO_RESIDENT_END; pademu_setup(enable, vibration); @@ -253,7 +253,7 @@ void pademu_setup(uint8_t ports, uint8_t vib) pad[i].mode_id = DIGITAL_MODE; pad[i].mode_cfg = 0; pad[i].mode_lock = 0; - + pad[i].enabled = ((ports >> i) & 1); pad[i].vibration = ((vib >> i) & 1); @@ -261,7 +261,7 @@ void pademu_setup(uint8_t ports, uint8_t vib) pad[i].mask[1] = 0xFF; pad[i].mask[2] = 0x03; pad[i].mask[3] = 0x00; - + pad[i].lrum = 2; pad[i].rrum = 2; } @@ -363,12 +363,12 @@ void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) break; case 0x43: //enter/exit config mode - if (pad[port].mode_cfg) { - pad[port].mode_cfg = in[3]; - break; - } - + if (pad[port].mode_cfg) { pad[port].mode_cfg = in[3]; + break; + } + + pad[port].mode_cfg = in[3]; case 0x42: //read data if (in[1] == 0x42) { if (pad[port].vibration) { //disable/enable vibration @@ -377,7 +377,7 @@ void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) } i = PAD_GET_DATA(&out[3], out_size - 3, port); - + if (pad[port].mode_lock == 0) { //mode unlocked if (pad[port].mode != i) { pad[port].mode = i; @@ -388,7 +388,7 @@ void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) pad[port].mode_id = DIGITAL_MODE; } } - + out[1] = pad[port].mode_id; break; @@ -398,12 +398,10 @@ void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) if (pad[port].mode) { if (pad[port].mode_p) { pad[port].mode_id = ANALOGP_MODE; - } - else { + } else { pad[port].mode_id = ANALOG_MODE; } - } - else { + } else { pad[port].mode_id = DIGITAL_MODE; } PAD_SET_MODE(pad[port].mode, pad[port].mode_lock, port); diff --git a/modules/usb/usbhdfsdfsv/main.c b/modules/usb/usbhdfsdfsv/main.c index a69ac8e3d..4ad5b8022 100644 --- a/modules/usb/usbhdfsdfsv/main.c +++ b/modules/usb/usbhdfsdfsv/main.c @@ -13,106 +13,102 @@ IRX_ID("usbhdfsd_for_EE", 1, 1); static int xmassInit(iop_device_t *device) { - return 0; + return 0; } static int xmassUnsupported(void) { - return -1; + return -1; } static int fat_CheckChain(fat_driver *fatd, u32 start) { - int i, chainSize, nextChain; + int i, chainSize, nextChain; - unsigned int fileCluster; - int clusterChainStart; + unsigned int fileCluster; + int clusterChainStart; - fileCluster = start; + fileCluster = start; - if (fileCluster < 2) - return 0; + if (fileCluster < 2) + return 0; - nextChain = 1; - clusterChainStart = 1; + nextChain = 1; + clusterChainStart = 1; - while (nextChain) - { - chainSize = UsbMassFatGetClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, clusterChainStart); - clusterChainStart = 0; - if (chainSize >= MAX_DIR_CLUSTER) { //the chain is full, but more chain parts exist - fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1]; - } else { //chain fits in the chain buffer completely - no next chain needed - nextChain = 0; - } + while (nextChain) { + chainSize = UsbMassFatGetClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, clusterChainStart); + clusterChainStart = 0; + if (chainSize >= MAX_DIR_CLUSTER) { //the chain is full, but more chain parts exist + fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1]; + } else { //chain fits in the chain buffer completely - no next chain needed + nextChain = 0; + } - //process the cluster chain (fatd->cbuf) and skip leading clusters if needed - for (i = 0; i < (chainSize - 1); i++) { - if ((fatd->cbuf[i] + 1) != fatd->cbuf[i + 1]) - return 0; - } - } + //process the cluster chain (fatd->cbuf) and skip leading clusters if needed + for (i = 0; i < (chainSize - 1); i++) { + if ((fatd->cbuf[i] + 1) != fatd->cbuf[i + 1]) + return 0; + } + } - return 1; + return 1; } static int xmassDevctl(iop_file_t *fd, const char *name, int cmd, void *arg, unsigned int arglen, void *buf, unsigned int buflen) { - int result; - fat_driver *fatd; - - if(fd->unit >= 2) - return -ENXIO; - - switch(cmd) - { - case XUSBHDFSD_CHECK_CLUSTER_CHAIN: - if((fatd = UsbMassFatGetData(fd->unit)) != NULL) - { - result = fat_CheckChain(fatd, *(u32*)arg); - } else - result = 0; - - return result; - default: - return -EINVAL; - } + int result; + fat_driver *fatd; + + if (fd->unit >= 2) + return -ENXIO; + + switch (cmd) { + case XUSBHDFSD_CHECK_CLUSTER_CHAIN: + if ((fatd = UsbMassFatGetData(fd->unit)) != NULL) { + result = fat_CheckChain(fatd, *(u32 *)arg); + } else + result = 0; + + return result; + default: + return -EINVAL; + } } -static iop_device_ops_t xmass_ops={ - &xmassInit, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - (void*)&xmassUnsupported, - &xmassDevctl, +static iop_device_ops_t xmass_ops = { + &xmassInit, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + (void *)&xmassUnsupported, + &xmassDevctl, }; static iop_device_t xmassDevice = { - "xmass", - IOP_DT_BLOCK | IOP_DT_FSEXT, - 1, - "XMASS", - &xmass_ops -}; + "xmass", + IOP_DT_BLOCK | IOP_DT_FSEXT, + 1, + "XMASS", + &xmass_ops}; static void usbmass_cb(int cause) { @@ -124,11 +120,10 @@ static void usbmass_cb(int cause) int _start(int argc, char *argv[]) { - if(AddDrv(&xmassDevice) == 0) - { + if (AddDrv(&xmassDevice) == 0) { UsbMassRegisterCallback(0, &usbmass_cb); return MODULE_RESIDENT_END; } else { - return MODULE_NO_RESIDENT_END; + return MODULE_NO_RESIDENT_END; } } diff --git a/modules/vmc/genvmc/ioman_add.h b/modules/vmc/genvmc/ioman_add.h index ba5ba5474..d3506e537 100644 --- a/modules/vmc/genvmc/ioman_add.h +++ b/modules/vmc/genvmc/ioman_add.h @@ -12,30 +12,6 @@ typedef struct _iop_ext_device struct _iop_ext_device_ops *ops; } iop_ext_device_t; -typedef struct -{ - /*00*/ unsigned int mode; - /*04*/ unsigned int attr; - /*08*/ unsigned int size; - /*0c*/ unsigned char ctime[8]; - /*14*/ unsigned char atime[8]; - /*1c*/ unsigned char mtime[8]; - /*24*/ unsigned int hisize; - /*28*/ unsigned int private_0; /* Number of subs (main) / subpart number (sub) */ - /*2c*/ unsigned int private_1; - /*30*/ unsigned int private_2; - /*34*/ unsigned int private_3; - /*38*/ unsigned int private_4; - /*3c*/ unsigned int private_5; /* Sector start. */ -} iox_stat_t; - -typedef struct -{ - iox_stat_t stat; - char name[256]; - unsigned int unknown; -} iox_dirent_t; - typedef struct _iop_ext_device_ops { int (*init)(iop_device_t *); @@ -69,7 +45,4 @@ typedef struct _iop_ext_device_ops } iop_ext_device_ops_t; -int remove(const char *name); -#define I_remove DECLARE_IMPORT(10, remove) - #endif diff --git a/src/atlas.c b/src/atlas.c index 9efa106b4..ecfc2930d 100644 --- a/src/atlas.c +++ b/src/atlas.c @@ -167,7 +167,7 @@ struct atlas_allocation_t *atlasPlace(atlas_t *atlas, size_t width, size_t heigh if (!surface) return NULL; - struct atlas_allocation_t *al = allocPlace(atlas->allocation, width+1, height+1); + struct atlas_allocation_t *al = allocPlace(atlas->allocation, width + 1, height + 1); if (!al) return NULL; diff --git a/src/fntsys.c b/src/fntsys.c index f9ac7fc36..8733dc180 100644 --- a/src/fntsys.c +++ b/src/fntsys.c @@ -178,7 +178,7 @@ static void fntPrepareCLUT() size_t i; u32 *clut = fontClut.Clut; for (i = 0; i < 256; ++i) { - u8 alpha = (i*128)/255; + u8 alpha = (i * 128) / 255; *clut = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, alpha); clut++; diff --git a/src/hdd.c b/src/hdd.c index f4b60e555..87a9d4f5c 100644 --- a/src/hdd.c +++ b/src/hdd.c @@ -57,7 +57,7 @@ int hddIs48bit(void) //------------------------------------------------------------------------- int hddSetTransferMode(int type, int mode) { - hddAtaSetMode_t *args = (hddAtaSetMode_t*)IOBuffer; + hddAtaSetMode_t *args = (hddAtaSetMode_t *)IOBuffer; args->type = type; args->mode = mode; @@ -90,7 +90,7 @@ int hddSetIdleTimeout(int timeout) //------------------------------------------------------------------------- int hddReadSectors(u32 lba, u32 nsectors, void *buf) { - hddAtaTransfer_t *args = (hddAtaTransfer_t*)IOBuffer; + hddAtaTransfer_t *args = (hddAtaTransfer_t *)IOBuffer; args->lba = lba; args->size = nsectors; @@ -104,11 +104,11 @@ int hddReadSectors(u32 lba, u32 nsectors, void *buf) //------------------------------------------------------------------------- static int hddWriteSectors(u32 lba, u32 nsectors, const void *buf) { - static u8 WriteBuffer[2 * 512 + sizeof(hddAtaTransfer_t)] ALIGNED(64); //Has to be a different buffer from IOBuffer (input can be in IOBuffer). + static u8 WriteBuffer[2 * 512 + sizeof(hddAtaTransfer_t)] ALIGNED(64); //Has to be a different buffer from IOBuffer (input can be in IOBuffer). int argsz; hddAtaTransfer_t *args = (hddAtaTransfer_t *)WriteBuffer; - if(nsectors > 2) //Sanity check + if (nsectors > 2) //Sanity check return -ENOMEM; args->lba = lba; @@ -303,22 +303,19 @@ int hddGetPartitionInfo(const char *name, apa_sub_t *parts) apa_header_t *header; int result, i; - if((result = fileXioGetStat(name, &stat)) >= 0) - { + if ((result = fileXioGetStat(name, &stat)) >= 0) { lba = stat.private_5; - header = (apa_header_t*)IOBuffer; + header = (apa_header_t *)IOBuffer; - if(hddReadSectors(lba, sizeof(apa_header_t)/512, header) == 0) - { + if (hddReadSectors(lba, sizeof(apa_header_t) / 512, header) == 0) { parts[0].start = header->start; parts[0].length = header->length; - for(i = 0; i < header->nsub; i++) + for (i = 0; i < header->nsub; i++) parts[1 + i] = header->subs[i]; result = header->nsub + 1; - } - else + } else result = -EIO; } @@ -333,20 +330,17 @@ int hddGetFileBlockInfo(const char *name, const apa_sub_t *subs, pfs_blockinfo_t pfs_inode_t *inode; int result; - if((result = fileXioGetStat(name, &stat)) >= 0) - { + if ((result = fileXioGetStat(name, &stat)) >= 0) { lba = subs[stat.private_4].start + stat.private_5; - inode = (pfs_inode_t*)IOBuffer; + inode = (pfs_inode_t *)IOBuffer; - if(hddReadSectors(lba, sizeof(pfs_inode_t)/512, inode) == 0) - { - if(inode->number_data < max) { - memcpy(blocks, inode->data, max * sizeof (pfs_blockinfo_t)); + if (hddReadSectors(lba, sizeof(pfs_inode_t) / 512, inode) == 0) { + if (inode->number_data < max) { + memcpy(blocks, inode->data, max * sizeof(pfs_blockinfo_t)); result = inode->number_data; } else result = -ENOMEM; - } - else + } else result = -EIO; } diff --git a/src/hddsupport.c b/src/hddsupport.c index 9a9c61ab4..c7f9caad7 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -340,7 +340,7 @@ static void hddLaunchGame(int id, config_set_t *configSet) LOG("HDDSUPPORT hdd_vmc_infos.blocks[%d].subpart : 0x%X\n", i, hdd_vmc_infos.blocks[i].subpart); LOG("HDDSUPPORT hdd_vmc_infos.blocks[%d].count : 0x%X\n", i, hdd_vmc_infos.blocks[i].count); } - } // else Vmc file too much fragmented + } // else Vmc file too much fragmented } if (have_error) { @@ -472,7 +472,7 @@ static void hddCleanUp(int exception) if ((exception & UNMOUNT_EXCEPTION) == 0) fileXioUmount(hddPrefix); - fileXioDevctl("pfs:", PDIOC_CLOSEALL, NULL, 0, NULL, 0); + fileXioDevctl("pfs:", PDIOC_CLOSEALL, NULL, 0, NULL, 0); } hddModulesLoaded = 0; diff --git a/src/renderman.c b/src/renderman.c index bc93606a0..2e123977b 100644 --- a/src/renderman.c +++ b/src/renderman.c @@ -57,10 +57,10 @@ static float aspectHeight; static float transX = 0; static float transY = 0; -const u64 gColWhite = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, 0x80); // Alpha 0x80 -> solid white -const u64 gColBlack = GS_SETREG_RGBA(0x00, 0x00, 0x00, 0x80); // Alpha 0x80 -> solid black -const u64 gColDarker = GS_SETREG_RGBA(0x00, 0x00, 0x00, 0x60); // Alpha 0x60 -> transparent overlay color -const u64 gColFocus = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, 0x50); // Alpha 0x50 -> transparent overlay color +const u64 gColWhite = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, 0x80); // Alpha 0x80 -> solid white +const u64 gColBlack = GS_SETREG_RGBA(0x00, 0x00, 0x00, 0x80); // Alpha 0x80 -> solid black +const u64 gColDarker = GS_SETREG_RGBA(0x00, 0x00, 0x00, 0x60); // Alpha 0x60 -> transparent overlay color +const u64 gColFocus = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, 0x50); // Alpha 0x50 -> transparent overlay color const u64 gDefaultCol = GS_SETREG_RGBA(0x80, 0x80, 0x80, 0x80); // Special color for texture multiplication const u64 gDefaultAlpha = GS_SETREG_ALPHA(0, 1, 0, 1, 0); diff --git a/src/system.c b/src/system.c index 8079689a8..e25a1d98a 100644 --- a/src/system.c +++ b/src/system.c @@ -463,7 +463,7 @@ static unsigned int sendIrxKernelRAM(unsigned int modules, void *ModuleStorage, #else #define PADEMU_ARG #endif - if ((modules & CORE_IRX_USB)PADEMU_ARG) { + if ((modules & CORE_IRX_USB) PADEMU_ARG) { irxptr_tab[modcount].info = size_pusbd_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_USBD); irxptr_tab[modcount++].ptr = pusbd_irx; } diff --git a/src/usbsupport.c b/src/usbsupport.c index acbdd5f7a..a190f50c9 100644 --- a/src/usbsupport.c +++ b/src/usbsupport.c @@ -241,7 +241,7 @@ static void usbRenameGame(int id, char *newName) } } - if((fd = fileXioOpen(oldpath, O_RDONLY)) >= 0) { + if ((fd = fileXioOpen(oldpath, O_RDONLY)) >= 0) { fileXioIoctl(fd, USBMASS_IOCTL_RENAME, newpath); fileXioClose(fd); } @@ -254,7 +254,7 @@ static void usbRenameGame(int id, char *newName) for (i = 0; i < game->parts; i++) { snprintf(oldpath, sizeof(oldpath), pathStr, usbPrefix, oldcrc, game->startup, i); snprintf(newpath, sizeof(newpath), pathStr, usbPrefix, newcrc, game->startup, i); - if((fd = fileXioOpen(oldpath, O_RDONLY)) >= 0) { + if ((fd = fileXioOpen(oldpath, O_RDONLY)) >= 0) { fileXioIoctl(fd, USBMASS_IOCTL_RENAME, newpath); fileXioClose(fd); } @@ -308,8 +308,7 @@ static void usbLaunchGame(int id, config_set_t *configSet) fd = fileXioOpen(vmc_path, O_RDONLY); if (fd >= 0) { - if ((start = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_LBA, vmc_path)) != 0 - && (startCluster = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_CLUSTER, vmc_path)) != 0) { + if ((start = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_LBA, vmc_path)) != 0 && (startCluster = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_CLUSTER, vmc_path)) != 0) { // Check VMC cluster chain for fragmentation (write operation can cause damage to the filesystem). if (fileXioDevctl("xmass0:", XUSBHDFSD_CHECK_CLUSTER_CHAIN, &startCluster, 4, NULL, 0) != 0) { @@ -367,8 +366,7 @@ static void usbLaunchGame(int id, config_set_t *configSet) if (fd >= 0) { settings->LBAs[i] = fileXioIoctl(fd, USBMASS_IOCTL_GET_LBA, partname); if (gCheckUSBFragmentation) { - if ((startCluster = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_CLUSTER, partname)) == 0 - || fileXioDevctl("xmass0:", XUSBHDFSD_CHECK_CLUSTER_CHAIN, &startCluster, 4, NULL, 0) == 0) { + if ((startCluster = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_CLUSTER, partname)) == 0 || fileXioDevctl("xmass0:", XUSBHDFSD_CHECK_CLUSTER_CHAIN, &startCluster, 4, NULL, 0) == 0) { fileXioClose(fd); //Game is fragmented. Do not continue. From 80d53509c616391df3358750118d61d3a8af15f1 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 9 Aug 2017 10:57:50 -0700 Subject: [PATCH 059/269] Scaling, overscan and lots of small things (#59) by rickgaiser * renderman: extend rm_mode table * Use new gsKit texture manager * fntsys: scale font to widescreen, and small fixes - Font will now be scaled in widescreen mode - Make the setting visible directly at the settings screen - Fix x/y offset glith when entering the settings screen * renderman: add more resolution options AUTO PAL 640x512i @50Hz 24bit NTSC 640x448i @60Hz 24bit EDTV 640x448p @60Hz 24bit EDTV 640x512p @50Hz 24bit VGA 640x480p @60Hz 24bit PAL 704x576i @50Hz 16bit NTSC 704x480i @60Hz 16bit EDTV 704x480p @60Hz 16bit EDTV 704x576p @50Hz 16bit HDTV 1280x720p @60Hz 16bit scaled HDTV 1920x1080i @60Hz 16bit scaled * Scaling, overscan, alignment Renderman now uses 640x480 as the default (virtual) resolution. Scaling to native resolutions is done by renderman. No more black borders, all pixels used: - 480i/p from 640x448 to 704x480 - 576i/p from 640x512 to 704x576 (16 bit with dithering) Overscan setting added to compensate for the overscan of televisions. Some display settings immetiately visible: - x/y offset - widescreen --- DETAILED_CHANGELOG | 1 + include/config.h | 1 + include/dialogs.h | 1 + include/fntsys.h | 4 +- include/lang.h | 2 + include/opl.h | 1 + include/renderman.h | 79 ++++--- lng/lang_English.lng | 4 +- src/atlas.c | 4 + src/dia.c | 17 +- src/dialogs.c | 5 + src/fntsys.c | 85 +++++--- src/gui.c | 65 ++++-- src/lang.c | 2 + src/opl.c | 6 +- src/renderman.c | 493 ++++++++++++++++--------------------------- src/texcache.c | 5 +- src/themes.c | 11 +- 18 files changed, 380 insertions(+), 406 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 37deafa88..1980aa440 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1017 - Jay-Jay-OPL - Make OPL compilable with latest PS2SDK (#63) by uyjulian - Wed Aug 9 09:36:13 2017 -0700 rev1016 - Jay-Jay-OPL - Fix bug in ELM support by rickgaiser (aka Maximus32): Without ELM support there are 4 io modules, with ELM support there are 5 io modules, causing unexpected crashes. - Tue Aug 8 22:03:23 2017 -0700 rev1015 - Jay-Jay-OPL - belek666 made the following changes: ds3bt updates (#62) - more accurate reading, fix data request, add waiting for cmd report - Mon Jul 31 14:59:00 2017 -0700 rev1014 - Jay-Jay-OPL - SP193 did the following changes: - (HDPro) fixed HDPro being unable to communicate with the HDPro device: fixed DEV9 not being loaded when HDPro is used (HDD.IRX depends on it), fixed errors in command types for command matrix, removed extra writes in the EE HDPro probe function, replaced WaitEventFlag with PollEventFlag (as per the original) and added a check around PollEventFlag's return value. - Sat Jul 29 02:54:58 2017 -0700 diff --git a/include/config.h b/include/config.h index edbb2bc71..4a946b0ba 100644 --- a/include/config.h +++ b/include/config.h @@ -72,6 +72,7 @@ enum CONFIG_INDEX { #define CONFIG_OPL_VMODE "vmode" #define CONFIG_OPL_XOFF "xoff" #define CONFIG_OPL_YOFF "yoff" +#define CONFIG_OPL_OVERSCAN "overscan" #define CONFIG_OPL_DISABLE_DEBUG "disable_debug" #define CONFIG_OPL_PS2LOGO "ps2logo" #define CONFIG_OPL_EXIT_PATH "exit_path" diff --git a/include/dialogs.h b/include/dialogs.h index 5ab3f38be..25a612626 100644 --- a/include/dialogs.h +++ b/include/dialogs.h @@ -21,6 +21,7 @@ enum UI_ITEMS { UICFG_VMODE, UICFG_XOFF, UICFG_YOFF, + UICFG_OVERSCAN, UICFG_INFOPAGE, CFG_DEBUG, diff --git a/include/fntsys.h b/include/fntsys.h index 107e2809d..91677c1ab 100644 --- a/include/fntsys.h +++ b/include/fntsys.h @@ -25,9 +25,9 @@ int fntLoadDefault(char *path); /** Releases a font slot */ void fntRelease(int id); -/** Sets a new aspect ratio +/** Updates to the native display resolution and aspect ratio * @note Invalidates the whole glyph cache for all fonts! */ -void fntSetAspectRatio(float aw, float ah); +void fntUpdateAspectRatio(); /** Renders a text with specified window dimensions */ int fntRenderString(int id, int x, int y, short aligned, size_t width, size_t height, const unsigned char *string, u64 colour); diff --git a/include/lang.h b/include/lang.h index 6ca55e150..b09b00d30 100644 --- a/include/lang.h +++ b/include/lang.h @@ -185,6 +185,8 @@ enum _STR_IDS { _STR_HINT_XOFFSET, _STR_YOFFSET, _STR_HINT_YOFFSET, + _STR_OVERSCAN, + _STR_HINT_OVERSCAN, _STR_GSMSKIPVIDEOS, _STR_HINT_GSMSKIPVIDEOS, _STR_CHEAT_SETTINGS, diff --git a/include/opl.h b/include/opl.h index 05febb365..efb4f031b 100644 --- a/include/opl.h +++ b/include/opl.h @@ -115,6 +115,7 @@ int gWideScreen; int gVMode; // 0 - Auto, 1 - PAL, 2 - NTSC int gXOff; int gYOff; +int gOverscan; int gSelectButton; #ifdef IGS diff --git a/include/renderman.h b/include/renderman.h index 33508bce2..c2cadd180 100644 --- a/include/renderman.h +++ b/include/renderman.h @@ -3,6 +3,19 @@ #include +/* + * Rendering using renderman + * + * Resolution + * The resolution has been standardized to 640x480. This is the only resolution + * that was compatible with legacy themes and used square pixels. All other + * resolutions are scaled by renderman. + * + * Widescreen (anamorphic) + * Widescreen also uses the standard 640x480 resolution, but is scaled + * horizontally. Use rmWideScale to scale any x/width value. + */ + /// DTV 576 Progressive Scan (720x576) #define GS_MODE_DTV_576P 0x53 @@ -11,8 +24,14 @@ #define DIM_UNDEF -1 -#define ALIGN_NONE 0 -#define ALIGN_CENTER 1 +#define ALIGN_TOP (0<<0) +#define ALIGN_BOTTOM (1<<0) +#define ALIGN_VCENTER (2<<0) +#define ALIGN_LEFT (0<<2) +#define ALIGN_RIGHT (1<<2) +#define ALIGN_HCENTER (2<<2) +#define ALIGN_NONE (ALIGN_TOP | ALIGN_LEFT) +#define ALIGN_CENTER (ALIGN_VCENTER | ALIGN_HCENTER) #define SCALING_NONE 0 #define SCALING_RATIO 1 @@ -54,9 +73,16 @@ enum rm_vmode { RM_VMODE_NTSC, RM_VMODE_DTV480P, RM_VMODE_DTV576P, + RM_VMODE_DTV720P, + RM_VMODE_DTV1080I, RM_VMODE_VGA_640_60 }; +enum rm_aratio { + RM_ARATIO_4_3 = 0, + RM_ARATIO_16_9, +}; + /** Initializes the rendering manager */ void rmInit(); @@ -65,25 +91,21 @@ int rmSetMode(int force); void rmEnd(void); -/** Fills the parameters with the screen width and height */ -void rmGetScreenExtents(int *w, int *h); +/** Fills the parameters with the native screen width and height */ +void rmGetScreenExtentsNative(int *w, int *h); -/** Manually prepares a texture for rendering (should not be normally needed). -* txt->Vram will be nonzero on success. -* @param txt The texture to upload (if not uploaded already) -* @return 1 if ok, 0 if error uploading happened (likely too big texture) */ -int rmPrepareTexture(GSTEXTURE *txt); +/** Fills the parameters with the virtual (640x480) screen width and height */ +void rmGetScreenExtents(int *w, int *h); -/** Flushes all rendering buffers - renders the gs queue, removes all textures from GS ram */ -void rmFlush(void); +/** Invalidate a texture so it will be re-transferred to VRAM the next time. +* @param txt The texture to invalidate */ +void rmInvalidateTexture(GSTEXTURE *txt); -/** Issues immediate rendering of the accumulated operations */ -void rmDispatch(void); +/** Unload texture from texture manager, performance optimization */ +void rmUnloadTexture(GSTEXTURE *txt); void rmDrawQuad(rm_quad_t *q); -void rmSetupQuad(GSTEXTURE *txt, int x, int y, short aligned, int w, int h, short scaled, u64 color, rm_quad_t *q); - /** Queues a specified pixmap (tinted with colour) to be rendered on specified position */ void rmDrawPixmap(GSTEXTURE *txt, int x, int y, short aligned, int w, int h, short scaled, u64 color); @@ -94,7 +116,7 @@ void rmDrawOverlayPixmap(GSTEXTURE *overlay, int x, int y, short aligned, int w, void rmDrawRect(int x, int y, int w, int h, u64 color); /** Queues a single color line to be rendered */ -void rmDrawLine(int x, int y, int x1, int y1, u64 color); +void rmDrawLine(int x1, int y1, int x2, int y2, u64 color); /** Starts the frame - first to call every frame */ void rmStartFrame(void); @@ -105,23 +127,30 @@ void rmEndFrame(void); /** Sets the display offset in units of pixels */ void rmSetDisplayOffset(int x, int y); +/** Set overscan in percentage/10 */ +void rmSetOverscan(int overscan); + /** Sets the aspect ratio correction for the upcoming operations. * When set, it will treat all pixmap widths/heights (not positions) as scaled with the ratios provided */ -void rmSetAspectRatio(float width, float height); +void rmSetAspectRatio(enum rm_aratio dar); -/** Resets aspect ratio back to 1:1 */ -void rmResetAspectRatio(); +/** Widescreen scaling */ +int rmWideScale(int x); -/** gets the current aspect ratio */ -void rmGetAspectRatio(float *w, float *h); +/** Get Pixel Aspect Ratio of native resolution */ +float rmGetPAR(); -void rmApplyAspectRatio(int *w, int *h); +/** Scale x from 640 to native resolution */ +int rmScaleX(int x); -void rmSetShiftRatio(float height); +/** Scale y from 480 to native resolution */ +int rmScaleY(int y); -void rmResetShiftRatio(); +/** Scale x from native to 640 resolution */ +int rmUnScaleX(int x); -void rmApplyShiftRatio(int *y); +/** Scale y from native to 480 resolution */ +int rmUnScaleY(int y); /** sets the transposition coordiantes (all content is transposed with these values) */ void rmSetTransposition(float x, float y); diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 6a357732f..d7bcf91d7 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -202,11 +202,13 @@ H-POS Horizontal Adjustment V-POS Vertical Adjustment +Overscan +Overscan Adjustment FMV Skip Skips Full Motion Videos Cheat Settings Enable PS2RD Cheat Engine -Lets PS2RD Cheat Engine patch your games +Let PS2RD Cheat Engine patch your games PS2RD Cheat Engine Mode Auto-select or Select game cheats Auto-select cheats diff --git a/src/atlas.c b/src/atlas.c index ecfc2930d..85681c224 100644 --- a/src/atlas.c +++ b/src/atlas.c @@ -6,6 +6,7 @@ #include #include "include/atlas.h" +#include "include/renderman.h" static inline struct atlas_allocation_t *allocNew(int x, int y, size_t width, size_t height) { @@ -114,6 +115,7 @@ void atlasFree(atlas_t *atlas) allocFree(atlas->allocation); atlas->allocation = NULL; + rmUnloadTexture(&atlas->surface); free(atlas->surface.Mem); atlas->surface.Mem = NULL; @@ -174,5 +176,7 @@ struct atlas_allocation_t *atlasPlace(atlas_t *atlas, size_t width, size_t heigh atlasCopyData(atlas, al, width, height, surface); + rmInvalidateTexture(&atlas->surface); + return al; } diff --git a/src/dia.c b/src/dia.c index deae593b2..d701c8301 100644 --- a/src/dia.c +++ b/src/dia.c @@ -94,7 +94,7 @@ int diaShowKeyb(char *text, int maxLen, int hide_text) fntRenderString(gTheme->fonts[0], 50, 120, ALIGN_NONE, 0, 0, hide_text ? mask_buffer : text, gTheme->textColor); // separating line for simpler orientation - rmDrawRect(25, 138, 590, 2, gColWhite); + rmDrawLine(25, 138, 615, 138, gColWhite); for (j = 0; j < KEYB_HEIGHT; j++) { for (i = 0; i < KEYB_WIDTH; i++) { @@ -413,8 +413,7 @@ static void diaRenderItem(int x, int y, struct UIItem *item, int selected, int h // to ODD lines ypos &= ~1; - // two lines for lesser eye strain :) - rmDrawRect(x, ypos, UI_BREAK_LEN, 2, gColWhite); + rmDrawLine(x, ypos, x + UI_BREAK_LEN, ypos, gColWhite); break; } @@ -487,12 +486,16 @@ static void diaRenderItem(int x, int y, struct UIItem *item, int selected, int h } case UI_COLOUR: { - rmDrawRect(x, y + 3, 25, 17, txtcol); + *w = rmWideScale(25); + *h = 17; + + // Align to the right + x -= *w; + + rmDrawRect(x, y + 3, *w, *h, txtcol); u64 dcol = GS_SETREG_RGBA(item->colourvalue.r, item->colourvalue.g, item->colourvalue.b, 0x80); - rmDrawRect(x + 2, y + 5, 21, 13, dcol); + rmDrawRect(x + 2, y + 5, *w-4, *h-4, dcol); - *w = 25; - *h = 17; break; } } diff --git a/src/dialogs.c b/src/dialogs.c index 736a476bf..420576207 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -450,6 +450,11 @@ struct UIItem diaUIConfig[] = { {UI_INT, UICFG_YOFF, 1, 1, -1, 0, 0, {.intvalue = {0, 0, -300, 300}}}, {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_OVERSCAN}}}, + {UI_SPACER}, + {UI_INT, UICFG_OVERSCAN, 1, 1, -1, 0, 0, {.intvalue = {0, 0, 0, 100}}}, + {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_WIDE_SCREEN}}}, {UI_SPACER}, {UI_BOOL, UICFG_WIDESCREEN, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, diff --git a/src/fntsys.c b/src/fntsys.c index 8733dc180..2e15ca33d 100644 --- a/src/fntsys.c +++ b/src/fntsys.c @@ -23,9 +23,9 @@ extern int size_freesansfont_raw; /// Maximal count of atlases per font #define ATLAS_MAX 4 /// Atlas width in pixels -#define ATLAS_WIDTH 128 +#define ATLAS_WIDTH 256 /// Atlas height in pixels -#define ATLAS_HEIGHT 128 +#define ATLAS_HEIGHT 256 #define FNTSYS_CHAR_SIZE 17 @@ -37,6 +37,8 @@ static ee_sema_t gFontSema; static GSCLUT fontClut; +static const float fDPI = 72.0f; + /** Single entry in the glyph cache */ typedef struct { @@ -253,14 +255,9 @@ static int fntLoadSlot(font_t *font, char *path) return FNT_ERROR; } - error = FT_Set_Pixel_Sizes(font->face, FNTSYS_CHAR_SIZE, FNTSYS_CHAR_SIZE); - if (error) { - LOG("FNTSYS Freetype error setting font pixel size with %x!\n", error); - fntDeleteSlot(font); - return FNT_ERROR; - } - font->isValid = 1; + fntUpdateAspectRatio(); + return 0; } @@ -347,7 +344,7 @@ static atlas_t *fntNewAtlas() atlas_t *atl = atlasNew(ATLAS_WIDTH, ATLAS_HEIGHT, GS_PSM_T8); atl->surface.ClutPSM = GS_PSM_CT32; - atl->surface.Clut = (u32 *)(&fontClut); + atl->surface.Clut = fontClut.Clut; return atl; } @@ -398,7 +395,7 @@ static fnt_glyph_cache_entry_t *fntCacheGlyph(font_t *font, uint32_t gid) return NULL; fnt_glyph_cache_entry_t *page = font->glyphCache[pageid]; - /* Should never happen. + /* Should never happen. if (!page) // safeguard return NULL; */ @@ -428,23 +425,32 @@ static fnt_glyph_cache_entry_t *fntCacheGlyph(font_t *font, uint32_t gid) glyph->shx = slot->advance.x; glyph->shy = slot->advance.y; glyph->ox = slot->bitmap_left; - glyph->oy = FNTSYS_CHAR_SIZE - slot->bitmap_top; + glyph->oy = rmScaleY(FNTSYS_CHAR_SIZE-2) - slot->bitmap_top; glyph->isValid = 1; return glyph; } -void fntSetAspectRatio(float aw, float ah) +void fntUpdateAspectRatio() { int i; + int w, h, wn, hn; + float ws, hs; + + rmGetScreenExtents(&w, &h); + rmGetScreenExtentsNative(&wn, &hn); + // Scale height from virtual resolution (640x480) to the native display resolution + hs = (float)hn/(float)h; + // Scale width according to the PAR (Pixel Aspect Ratio) + ws = hs * rmGetPAR(); // flush cache - it will be invalid after the setting for (i = 0; i < FNT_MAX_COUNT; i++) { if (fonts[i].isValid) { fntCacheFlush(&fonts[i]); //TODO: this seems correct, but the rest of the OPL UI (i.e. spacers) doesn't seem to be correctly scaled. - // FT_Set_Pixel_Sizes(fonts[i].face, FNTSYS_CHAR_SIZE * aw, FNTSYS_CHAR_SIZE * ah); + FT_Set_Char_Size(fonts[i].face, FNTSYS_CHAR_SIZE*64, FNTSYS_CHAR_SIZE*64, fDPI*ws, fDPI*hs); } } } @@ -461,22 +467,19 @@ static void fntRenderGlyph(fnt_glyph_cache_entry_t *glyph, int pen_x, int pen_y) * performance problems under - beginning with rmSetupQuad and continuing into gsKit * - this method would handle the preparation of the quads and GS upload itself, * without the use of prim_quad_texture and rmSetupQuad... - * - * 3. We should use clut to keep the memory allocations sane - we're linear in the 32bit buffers - * anyway, no reason to waste like we do! */ quad.ul.x = pen_x + glyph->ox; - quad.br.x = quad.ul.x + glyph->width; quad.ul.y = pen_y + glyph->oy; - quad.br.y = quad.ul.y + glyph->height; - - // UV is our own, custom thing here - quad.txt = &glyph->atlas->surface; quad.ul.u = glyph->allocation->x; - quad.br.u = quad.ul.u + glyph->width; quad.ul.v = glyph->allocation->y; + + quad.br.x = quad.ul.x + glyph->width; + quad.br.y = quad.ul.y + glyph->height; + quad.br.u = quad.ul.u + glyph->width; quad.br.v = quad.ul.v + glyph->height; + quad.txt = &glyph->atlas->surface; + rmDrawQuad(&quad); } } @@ -490,16 +493,24 @@ int fntRenderString(int id, int x, int y, short aligned, size_t width, size_t he font_t *font = &fonts[id]; SignalSema(gFontSemaId); - if (aligned) { + // Convert to native display resolution + x = rmScaleX(x); + y = rmScaleY(y); + width = rmScaleX(width); + height = rmScaleY(height); + + if (aligned & ALIGN_HCENTER) { if (width) { x -= min(fntCalcDimensions(id, string), width) >> 1; } else { x -= fntCalcDimensions(id, string) >> 1; } - y -= MENU_ITEM_HEIGHT >> 1; } - rmApplyShiftRatio(&y); + if (aligned & ALIGN_VCENTER) { + y -= rmScaleY(FNTSYS_CHAR_SIZE) >> 1; + } + quad.color = colour; int pen_x = x; @@ -539,7 +550,7 @@ int fntRenderString(int id, int x, int y, short aligned, size_t width, size_t he if (width) { if (codepoint == '\n') { pen_x = x; - y += MENU_ITEM_HEIGHT; // hmax is too tight and unordered, generally + y += rmScaleY(MENU_ITEM_HEIGHT); // hmax is too tight and unordered, generally continue; } @@ -556,7 +567,7 @@ int fntRenderString(int id, int x, int y, short aligned, size_t width, size_t he pen_x += glyph->shx >> 6; } - return pen_x; + return rmUnScaleX(pen_x); } #else @@ -606,16 +617,24 @@ int fntRenderString(int id, int x, int y, short aligned, size_t width, size_t he font_t *font = &fonts[id]; SignalSema(gFontSemaId); - if (aligned) { + // Convert to native display resolution + x = rmScaleX(x); + y = rmScaleY(y); + width = rmScaleX(width); + height = rmScaleY(height); + + if (aligned & ALIGN_HCENTER) { if (width) { x -= min(fntCalcDimensions(id, string), width) >> 1; } else { x -= fntCalcDimensions(id, string) >> 1; } - y -= MENU_ITEM_HEIGHT >> 1; } - rmApplyShiftRatio(&y); + if (aligned & ALIGN_VCENTER) { + y -= rmScaleY(FNTSYS_CHAR_SIZE) >> 1; + } + quad.color = colour; int pen_x = x; @@ -655,7 +674,7 @@ int fntRenderString(int id, int x, int y, short aligned, size_t width, size_t he if (width) { if (codepoint == '\n') { pen_x = x; - y += MENU_ITEM_HEIGHT; // hmax is too tight and unordered, generally + y += rmScaleY(MENU_ITEM_HEIGHT); // hmax is too tight and unordered, generally continue; } @@ -692,7 +711,7 @@ int fntRenderString(int id, int x, int y, short aligned, size_t width, size_t he fntRenderSubRTL(font, startRTL, string, glyphRTL, pen_xRTL, y); } - return pen_x; + return rmUnScaleX(pen_x); } #endif diff --git a/src/gui.c b/src/gui.c index 68f4ed26c..db0f9e5c1 100644 --- a/src/gui.c +++ b/src/gui.c @@ -47,7 +47,6 @@ static s32 gGUILockSemaId; static ee_sema_t gQueueSema; static int screenWidth; -static float wideScreenScale; static int screenHeight; // forward decl. @@ -143,8 +142,6 @@ void guiInit(void) gBackgroundTex.VramClut = 0; gBackgroundTex.Clut = NULL; - wideScreenScale = 1.0f; - // Precalculate the values for the perlin noise plasma int i; for (i = 0; i < 256; ++i) { @@ -193,15 +190,13 @@ void guiStartFrame(void) void guiEndFrame(void) { - guiUnlock(); - rmFlush(); - #ifdef __DEBUG u32 newtime = cpu_ticks() / CLOCKS_PER_MILISEC; time_render = newtime - curtime; #endif rmEndFrame(); + guiUnlock(); } void guiShowAbout() @@ -493,7 +488,23 @@ static int guiUIUpdater(int modified) diaGetInt(diaUIConfig, UICFG_XOFF, &x); diaGetInt(diaUIConfig, UICFG_YOFF, &y); - rmSetDisplayOffset(x, y); + if ((x != gXOff) || (y != gYOff)) { + gXOff = x; + gYOff = y; + rmSetDisplayOffset(x, y); + } + diaGetInt(diaUIConfig, UICFG_OVERSCAN, &temp); + if (temp != gOverscan) { + gOverscan = temp; + rmSetOverscan(gOverscan); + guiUpdateScreenScale(); + } + diaGetInt(diaUIConfig, UICFG_WIDESCREEN, &temp); + if (temp != gWideScreen) { + gWideScreen = temp; + rmSetAspectRatio((gWideScreen == 0) ? RM_ARATIO_4_3 : RM_ARATIO_16_9); + guiUpdateScreenScale(); + } } return 0; @@ -505,8 +516,19 @@ void guiShowUIConfig(void) // configure the enumerations const char *scrollSpeeds[] = {_l(_STR_SLOW), _l(_STR_MEDIUM), _l(_STR_FAST), NULL}; - const char *vmodeNames[] = {_l(_STR_AUTO), "PAL", "NTSC", "HDTV 480p @60Hz", "HDTV 576p @50Hz", - "VGA 640x480p @60Hz", NULL}; + const char *vmodeNames[] = {_l(_STR_AUTO) + , "PAL 640x512i @50Hz 24bit" + , "NTSC 640x448i @60Hz 24bit" + , "EDTV 640x448p @60Hz 24bit" + , "EDTV 640x512p @50Hz 24bit" + , "VGA 640x480p @60Hz 24bit" + , "PAL 704x576i @50Hz 16bit" + , "NTSC 704x480i @60Hz 16bit" + , "EDTV 704x480p @60Hz 16bit" + , "EDTV 704x576p @50Hz 16bit" + , "HDTV 1280x720p @60Hz 16bit scaled" + , "HDTV 1920x1080i @60Hz 16bit scaled" + , NULL}; diaSetEnum(diaUIConfig, UICFG_SCROLL, scrollSpeeds); diaSetEnum(diaUIConfig, UICFG_THEME, (const char **)thmGetGuiList()); @@ -515,7 +537,6 @@ void guiShowUIConfig(void) diaSetInt(diaUIConfig, UICFG_SCROLL, gScrollSpeed); diaSetInt(diaUIConfig, UICFG_THEME, thmGetGuiValue()); diaSetInt(diaUIConfig, UICFG_LANG, lngGetGuiValue()); - guiUIUpdater(1); diaSetInt(diaUIConfig, UICFG_AUTOSORT, gAutosort); diaSetInt(diaUIConfig, UICFG_AUTOREFRESH, gAutoRefresh); diaSetInt(diaUIConfig, UICFG_INFOPAGE, gUseInfoScreen); @@ -524,6 +545,8 @@ void guiShowUIConfig(void) diaSetInt(diaUIConfig, UICFG_VMODE, gVMode); diaSetInt(diaUIConfig, UICFG_XOFF, gXOff); diaSetInt(diaUIConfig, UICFG_YOFF, gYOff); + diaSetInt(diaUIConfig, UICFG_OVERSCAN, gOverscan); + guiUIUpdater(1); int ret = diaExecuteDialog(diaUIConfig, -1, 1, guiUIUpdater); if (ret) { @@ -545,6 +568,7 @@ void guiShowUIConfig(void) diaGetInt(diaUIConfig, UICFG_VMODE, &gVMode); diaGetInt(diaUIConfig, UICFG_XOFF, &gXOff); diaGetInt(diaUIConfig, UICFG_YOFF, &gYOff); + diaGetInt(diaUIConfig, UICFG_OVERSCAN, &gOverscan); applyConfig(themeID, langID); } @@ -1740,6 +1764,7 @@ void guiDrawBGPlasma() } pery = ymax; + rmInvalidateTexture(&gBackgroundTex); rmDrawPixmap(&gBackgroundTex, 0, 0, ALIGN_NONE, screenWidth, screenHeight, SCALING_NONE, gDefaultCol); } @@ -1747,11 +1772,16 @@ int guiDrawIconAndText(int iconId, int textId, int font, int x, int y, u64 color { GSTEXTURE *iconTex = thmGetTexture(iconId); if (iconTex && iconTex->Mem) { - rmDrawPixmap(iconTex, x, y, ALIGN_NONE, iconTex->Width, iconTex->Height, SCALING_RATIO, gDefaultCol); - x += iconTex->Width + 2; + y += iconTex->Height >> 1; + rmDrawPixmap(iconTex, x, y, ALIGN_VCENTER, iconTex->Width, iconTex->Height, SCALING_RATIO, gDefaultCol); + x += rmWideScale(iconTex->Width) + 2; + } + else { + // HACK: font is aligned to VCENTER, the default height icon height is 20 + y += 10; } - x = fntRenderString(font, x, y, ALIGN_NONE, 0, 0, _l(textId), color); + x = fntRenderString(font, x, y, ALIGN_VCENTER, 0, 0, _l(textId), color); return x; } @@ -1954,14 +1984,7 @@ void guiUpdateScrollSpeed(void) void guiUpdateScreenScale(void) { - if (gWideScreen) - wideScreenScale = 0.75f; - else - wideScreenScale = 1.0f; - - // apply the scaling to renderman and font rendering - rmSetAspectRatio(wideScreenScale, 1.0f); - fntSetAspectRatio(wideScreenScale, 1.0f); + fntUpdateAspectRatio(); } int guiMsgBox(const char *text, int addAccept, struct UIItem *ui) diff --git a/src/lang.c b/src/lang.c index 060e702a6..74d9bf1ab 100644 --- a/src/lang.c +++ b/src/lang.c @@ -197,6 +197,8 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Horizontal Adjustment", "V-POS", "Vertical Adjustment", + "Overscan", + "Overscan Adjustment", "FMV Skip", "Skips Full Motion Videos", "Cheat Settings", diff --git a/src/opl.c b/src/opl.c index 26068a79d..e254e7a6f 100644 --- a/src/opl.c +++ b/src/opl.c @@ -556,6 +556,7 @@ static void _loadConfig() configGetInt(configOPL, CONFIG_OPL_VMODE, &gVMode); configGetInt(configOPL, CONFIG_OPL_XOFF, &gXOff); configGetInt(configOPL, CONFIG_OPL_YOFF, &gYOff); + configGetInt(configOPL, CONFIG_OPL_OVERSCAN, &gOverscan); if (configGetStr(configOPL, CONFIG_OPL_THEME, &temp)) themeID = thmFindGuiID(temp); @@ -648,6 +649,7 @@ static void _saveConfig() configSetInt(configOPL, CONFIG_OPL_VMODE, gVMode); configSetInt(configOPL, CONFIG_OPL_XOFF, gXOff); configSetInt(configOPL, CONFIG_OPL_YOFF, gYOff); + configSetInt(configOPL, CONFIG_OPL_OVERSCAN, gOverscan); configSetInt(configOPL, CONFIG_OPL_DISABLE_DEBUG, gDisableDebug); configSetInt(configOPL, CONFIG_OPL_PS2LOGO, gPS2Logo); configSetStr(configOPL, CONFIG_OPL_EXIT_PATH, gExitPath); @@ -706,15 +708,16 @@ void applyConfig(int themeID, int langID) gDefaultDevice = APP_MODE; guiUpdateScrollSpeed(); - guiUpdateScreenScale(); guiSetFrameHook(&menuUpdateHook); int changed = rmSetMode(0); if (changed) { // reinit the graphics... + rmSetAspectRatio((gWideScreen == 0) ? RM_ARATIO_4_3 : RM_ARATIO_16_9); thmReloadScreenExtents(); guiReloadScreenExtents(); + guiUpdateScreenScale(); } // theme must be set after color, and lng after theme @@ -1234,6 +1237,7 @@ static void setDefaults(void) gVMode = RM_VMODE_AUTO; gXOff = 0; gYOff = 0; + gOverscan = 0; #ifdef CHEAT memset(gCheatList, 0, sizeof(gCheatList)); diff --git a/src/renderman.c b/src/renderman.c index 2e123977b..40c66bded 100644 --- a/src/renderman.c +++ b/src/renderman.c @@ -17,45 +17,60 @@ GSGLOBAL *gsGlobal; s32 guiThreadID; -/** Helper texture list */ -struct rm_texture_list_t -{ - GSTEXTURE *txt; - GSCLUT *clut; - struct rm_texture_list_t *next; -}; - -static struct rm_texture_list_t *uploadedTextures = NULL; - static int order; static enum rm_vmode vmode = RM_VMODE_AUTO; -#define NUM_RM_VMODES 6 +#define NUM_RM_VMODES 12 // RM Vmode -> GS Vmode conversion table struct rm_mode { char mode; char hsync; //In KHz + short int width; short int height; short int VCK; + short int interlace; + short int field; + short int aratio; + short int PAR1; // Pixel Aspect Ratio 1 (For video modes with non-square pixels, like PAL/NTSC) + short int PAR2; // Pixel Aspect Ratio 2 (For video modes with non-square pixels, like PAL/NTSC) }; static struct rm_mode rm_mode_table[NUM_RM_VMODES] = { - {-1, 16, -1, -1}, // AUTO - {GS_MODE_PAL, 16, 512, 4}, // PAL@50Hz - {GS_MODE_NTSC, 16, 448, 4}, // NTSC@60Hz - {GS_MODE_DTV_480P, 31, 448, 2}, // DTV480P@60Hz - {GS_MODE_DTV_576P, 31, 512, 2}, // DTV576P@50Hz - {GS_MODE_VGA_640_60, 31, 480, 2}, // VGA640x480@60Hz + // 24 bit color mode with black borders + {-1, 16, 640, -1, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 1, 1}, // AUTO + {GS_MODE_PAL, 16, 640, 512, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz + {GS_MODE_NTSC, 16, 640, 448, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz + {GS_MODE_DTV_480P, 31, 640, 448, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz + {GS_MODE_DTV_576P, 31, 640, 512, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz + {GS_MODE_VGA_640_60, 31, 640, 480, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // VGA640x480@60Hz + // 16bit color mode full screen + {GS_MODE_PAL, 16, 704, 576, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz + {GS_MODE_NTSC, 16, 704, 480, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz + {GS_MODE_DTV_480P, 31, 704, 480, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz + {GS_MODE_DTV_576P, 31, 704, 576, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz + {GS_MODE_DTV_720P, 31, 640, 720, 1, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 2}, // HDTV720P@60Hz + {GS_MODE_DTV_1080I, 31, 640, 540, 1, GS_INTERLACED, GS_FIELD, RM_ARATIO_16_9, 2, 3}, // HDTV1080I@60Hz }; -static float aspectWidth; -static float aspectHeight; +// Display Aspect Ratio +static int iAspectWidth = 4; +static enum rm_aratio DAR = RM_ARATIO_4_3; -// Transposition values - all rendering can be transposed (moved on screen) by these -static float transX = 0; -static float transY = 0; +// Display dimensions after overscan compensation +static int iDisplayWidth; +static int iDisplayHeight; +static int iDisplayXOff; +static int iDisplayYOff; + +// Transposition values - all rendering will be transposed (moved on screen) by these +static float transX = 0.0f; +static float transY = 0.0f; + +// Transposition values including overscan compensation +static float fRenderXOff = 0.0f; +static float fRenderYOff = 0.0f; const u64 gColWhite = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, 0x80); // Alpha 0x80 -> solid white const u64 gColBlack = GS_SETREG_RGBA(0x00, 0x00, 0x00, 0x80); // Alpha 0x80 -> solid black @@ -65,207 +80,26 @@ const u64 gColFocus = GS_SETREG_RGBA(0xFF, 0xFF, 0xFF, 0x50); // Alpha 0x50 -> const u64 gDefaultCol = GS_SETREG_RGBA(0x80, 0x80, 0x80, 0x80); // Special color for texture multiplication const u64 gDefaultAlpha = GS_SETREG_ALPHA(0, 1, 0, 1, 0); -static float shiftYVal; -static float (*shiftY)(float posY); - -static float shiftYFunc(float posY) -{ - return (int)(shiftYVal * posY); -} - -static float identityFunc(float posY) -{ - return posY; -} - -static void rmAppendUploadedTextures(GSTEXTURE *txt) -{ - struct rm_texture_list_t *entry = (struct rm_texture_list_t *)malloc(sizeof(struct rm_texture_list_t)); - entry->clut = NULL; - entry->txt = txt; - entry->next = uploadedTextures; - uploadedTextures = entry; -} - -static void rmAppendUploadedCLUTs(GSCLUT *clut) -{ - struct rm_texture_list_t *entry = (struct rm_texture_list_t *)malloc(sizeof(struct rm_texture_list_t)); - entry->txt = NULL; - entry->clut = clut; - entry->next = uploadedTextures; - uploadedTextures = entry; -} - -static int rmClutSize(GSCLUT *clut, u32 *size, u32 *w, u32 *h) -{ - switch (clut->PSM) { - case GS_PSM_T4: - *w = 8; - *h = 2; - break; - case GS_PSM_T8: - *w = 16; - *h = 16; - break; - default: - return 0; - }; - - switch (clut->ClutPSM) { - case GS_PSM_CT32: - *size = (*w) * (*h) * 4; - break; - case GS_PSM_CT24: - *size = (*w) * (*h) * 4; - break; - case GS_PSM_CT16: - *size = (*w) * (*h) * 2; - break; - case GS_PSM_CT16S: - *size = (*w) * (*h) * 2; - break; - default: - return 0; - } - - return 1; -} - -static int rmUploadClut(GSCLUT *clut) -{ - if (clut->VramClut && clut->VramClut != GSKIT_ALLOC_ERROR) // already uploaded - return 1; - - u32 size; - u32 w, h; - - if (!rmClutSize(clut, &size, &w, &h)) - return 0; - - size = (-GS_VRAM_BLOCKSIZE_256) & (size + GS_VRAM_BLOCKSIZE_256 - 1); - - // too large to fit VRAM with the currently allocated space? - if (gsGlobal->CurrentPointer + size >= __VRAM_SIZE) { - if (size >= __VRAM_SIZE) { - // Only log this if the allocation is too large itself - LOG("RENDERMAN Requested clut allocation is bigger than VRAM!\n"); - // We won't allocate this, it's too large - clut->VramClut = GSKIT_ALLOC_ERROR; - return 0; - } - - rmFlush(); - } - - clut->VramClut = gsGlobal->CurrentPointer; - gsGlobal->CurrentPointer += size; - - rmAppendUploadedCLUTs(clut); - - SyncDCache(clut->Clut, (u8 *)(clut->Clut) + size); - gsKit_texture_send_inline(gsGlobal, clut->Clut, w, h, clut->VramClut, clut->ClutPSM, 1, GS_CLUT_PALLETE); - return 1; -} - -static int rmUploadTexture(GSTEXTURE *txt) -{ - // For clut based textures... - if (txt->Clut) { - // upload CLUT first - if (!rmUploadClut((GSCLUT *)txt->Clut)) - return 0; - - // copy the new VramClut - txt->VramClut = ((GSCLUT *)txt->Clut)->VramClut; - } - - u32 size = gsKit_texture_size(txt->Width, txt->Height, txt->PSM); - // alignment of the allocation - size = (-GS_VRAM_BLOCKSIZE_256) & (size + GS_VRAM_BLOCKSIZE_256 - 1); - - // too large to fit VRAM with the currently allocated space? - if (gsGlobal->CurrentPointer + size >= __VRAM_SIZE) { - if (size >= __VRAM_SIZE) { - // Only log this if the allocation is too large itself - LOG("RENDERMAN Requested texture allocation is bigger than VRAM!\n"); - // We won't allocate this, it's too large - txt->Vram = GSKIT_ALLOC_ERROR; - return 0; - } - - rmFlush(); - - // Should not flush CLUT away. If this happenned we have to reupload - if (txt->Clut) { - if (!rmUploadClut((GSCLUT *)txt->Clut)) - return 0; - - txt->VramClut = ((GSCLUT *)txt->Clut)->VramClut; - } - - // only could fit CLUT but not the pixmap with it! - if (gsGlobal->CurrentPointer + size >= __VRAM_SIZE) - return 0; - } - - txt->Vram = gsGlobal->CurrentPointer; - gsGlobal->CurrentPointer += size; - - rmAppendUploadedTextures(txt); - - // We can't do gsKit_texture_upload since it'd assume txt->Clut is the CLUT table directly - // whereas we're using it as a pointer to our structure containg clut data - gsKit_setup_tbw(txt); - SyncDCache(txt->Mem, (u8 *)(txt->Mem) + size); - gsKit_texture_send_inline(gsGlobal, txt->Mem, txt->Width, txt->Height, txt->Vram, txt->PSM, txt->TBW, txt->Clut ? GS_CLUT_TEXTURE : GS_CLUT_NONE); - - return 1; -} - -int rmPrepareTexture(GSTEXTURE *txt) -{ - //Upload, only if not already uploaded. - return ((txt->Vram && txt->Vram != GSKIT_ALLOC_ERROR) ? 1 : rmUploadTexture(txt)); -} - -void rmDispatch(void) +void rmInvalidateTexture(GSTEXTURE *txt) { - gsKit_queue_exec(gsGlobal); + gsKit_TexManager_invalidate(gsGlobal, txt); } -void rmFlush(void) +void rmUnloadTexture(GSTEXTURE *txt) { - rmDispatch(); - - // release all the uploaded textures - gsKit_vram_clear(gsGlobal); - - while (uploadedTextures) { - // free clut and txt if those are filled in - if (uploadedTextures->txt) { - uploadedTextures->txt->Vram = 0; - uploadedTextures->txt->VramClut = 0; - } - - if (uploadedTextures->clut) - uploadedTextures->clut->VramClut = 0; - - struct rm_texture_list_t *entry = uploadedTextures; - uploadedTextures = uploadedTextures->next; - free(entry); - } + gsKit_TexManager_free(gsGlobal, txt); } void rmStartFrame(void) { + gsKit_clear(gsGlobal, gColBlack); order = 0; } void rmEndFrame(void) { gsKit_set_finish(gsGlobal); - - rmFlush(); + gsKit_queue_exec(gsGlobal); // Wait for draw ops to finish gsKit_finish(); @@ -282,6 +116,7 @@ void rmEndFrame(void) } gsKit_setactive(gsGlobal); + gsKit_TexManager_nextFrame(gsGlobal); } static int rmOnVSync(void) @@ -308,15 +143,6 @@ void rmInit() order = 0; - aspectWidth = 1.0f; - aspectHeight = 1.0f; - - shiftYVal = 1.0f; - shiftY = &shiftYFunc; - - transX = 0.0f; - transY = 0.0f; - guiThreadID = GetThreadId(); gsKit_add_vsync_handler(&rmOnVSync); } @@ -332,26 +158,28 @@ int rmSetMode(int force) vmode = gVMode; gsGlobal->Mode = rm_mode_table[vmode].mode; + gsGlobal->Width = rm_mode_table[vmode].width; gsGlobal->Height = rm_mode_table[vmode].height; - - if (vmode == RM_VMODE_DTV480P || vmode == RM_VMODE_DTV576P || vmode == RM_VMODE_VGA_640_60) { - gsGlobal->Interlace = GS_NONINTERLACED; - gsGlobal->Field = GS_FRAME; - } else { - gsGlobal->Interlace = GS_INTERLACED; - gsGlobal->Field = GS_FIELD; - } - gsGlobal->Width = 640; - + gsGlobal->Interlace = rm_mode_table[vmode].interlace; + gsGlobal->Field = rm_mode_table[vmode].field; gsGlobal->PSM = GS_PSM_CT24; + // Higher resolution use too much VRAM + // so automatically switch back to 16bit color depth + if ((gsGlobal->Width * gsGlobal->Height) > (640 * 512)) + gsGlobal->PSM = GS_PSM_CT16S; gsGlobal->PSMZ = GS_PSMZ_16S; gsGlobal->ZBuffering = GS_SETTING_OFF; gsGlobal->PrimAlphaEnable = GS_SETTING_ON; gsGlobal->DoubleBuffering = GS_SETTING_ON; + gsGlobal->Dithering = GS_SETTING_ON; + + if ((gsGlobal->Interlace == GS_INTERLACED) && (gsGlobal->Field == GS_FRAME)) + gsGlobal->Height /= 2; gsKit_init_screen(gsGlobal); rmSetDisplayOffset(gXOff, gYOff); + rmSetOverscan(gOverscan); gsKit_mode_switch(gsGlobal, GS_ONESHOT); @@ -364,64 +192,66 @@ int rmSetMode(int force) LOG("RENDERMAN New vmode: %d, %d x %d\n", vmode, gsGlobal->Width, gsGlobal->Height); } + return changed; } +void rmGetScreenExtentsNative(int *w, int *h) +{ + *w = iDisplayWidth; + *h = iDisplayHeight; +} + void rmGetScreenExtents(int *w, int *h) { - *w = gsGlobal->Width; - *h = gsGlobal->Height; + // Emulate 640x480 (square pixel VGA) + *w = 640; + *h = 480; } void rmEnd(void) { - rmFlush(); + gsKit_deinit_global(gsGlobal); } +#define X_SCALE(x) (((x)*iDisplayWidth) /640) +#define Y_SCALE(y) (((y)*iDisplayHeight)/480) /** If txt is null, don't use DIM_UNDEF size */ -void rmSetupQuad(GSTEXTURE *txt, int x, int y, short aligned, int w, int h, short scaled, u64 color, rm_quad_t *q) -{ - if (aligned) { - float dim; - if (w == DIM_UNDEF) - w = txt->Width; - if (h == DIM_UNDEF) - h = txt->Height; - - if (scaled) - dim = aspectWidth * (w >> 1); - else - dim = w >> 1; - q->ul.x = x - dim; - q->br.x = x + dim; - - if (scaled) - dim = aspectHeight * (h >> 1); - else - dim = h >> 1; - q->ul.y = shiftY(y) - dim; - q->br.y = shiftY(y) + dim; - } else { - if (w == DIM_UNDEF) - w = txt->Width; - if (h == DIM_UNDEF) - h = txt->Height; - +static void rmSetupQuad(GSTEXTURE *txt, int x, int y, short aligned, int w, int h, short scaled, u64 color, rm_quad_t *q) +{ + if (w == DIM_UNDEF) + w = txt->Width; + if (h == DIM_UNDEF) + h = txt->Height; + + // Legacy scaling + x = X_SCALE(x); + y = Y_SCALE(y); + if (scaled & SCALING_RATIO) + w = X_SCALE(w * iAspectWidth) >> 2; + else + w = X_SCALE(w); + h = Y_SCALE(h); + + // Align LEFT/HCENTER/RIGHT + if (aligned & ALIGN_HCENTER) + q->ul.x = x - (w >> 1); + else if (aligned & ALIGN_RIGHT) + q->ul.x = x - w; + else q->ul.x = x; - if (scaled) - q->br.x = x + aspectWidth * w; - else - q->br.x = x + w; - - q->ul.y = shiftY(y); - if (scaled) - q->br.y = shiftY(y) + aspectHeight * h; - else - q->br.y = shiftY(y) + h; - } + q->br.x = q->ul.x + w; - q->color = color; + // Align TOP/VCENTER/BOTTOM + if (aligned & ALIGN_VCENTER) + q->ul.y = y - (h >> 1); + else if (aligned & ALIGN_BOTTOM) + q->ul.y = y - h; + else + q->ul.y = y; + q->br.y = q->ul.y + h; + q->color = color; if (txt) { q->txt = txt; q->ul.u = 0; @@ -432,19 +262,17 @@ void rmSetupQuad(GSTEXTURE *txt, int x, int y, short aligned, int w, int h, shor } void rmDrawQuad(rm_quad_t *q) -{ // NO scaling, NO shift, NO alignment - if (!rmPrepareTexture(q->txt)) // won't render if not ready! - return; - +{ if ((q->txt->PSM == GS_PSM_CT32) || (q->txt->Clut && q->txt->ClutPSM == GS_PSM_CT32)) gsGlobal->PrimAlphaEnable = GS_SETTING_ON; else gsGlobal->PrimAlphaEnable = GS_SETTING_OFF; + gsKit_TexManager_bind(gsGlobal, q->txt); gsKit_prim_sprite_texture(gsGlobal, q->txt, - q->ul.x + transX - 0.5f, q->ul.y + transY - 0.5f, + q->ul.x + fRenderXOff, q->ul.y + fRenderYOff, q->ul.u, q->ul.v, - q->br.x + transX - 0.5f, q->br.y + transY - 0.5f, + q->br.x + fRenderXOff, q->br.y + fRenderYOff, q->br.u, q->br.v, order, q->color); order++; } @@ -461,23 +289,29 @@ void rmDrawOverlayPixmap(GSTEXTURE *overlay, int x, int y, short aligned, int w, { rm_quad_t quad; rmSetupQuad(overlay, x, y, aligned, w, h, scaled, color, &quad); - - if (!rmPrepareTexture(inlay)) - return; + ulx = X_SCALE(ulx * iAspectWidth) >> 2; + urx = X_SCALE(urx * iAspectWidth) >> 2; + blx = X_SCALE(blx * iAspectWidth) >> 2; + brx = X_SCALE(brx * iAspectWidth) >> 2; + uly = Y_SCALE(uly); + ury = Y_SCALE(ury); + bly = Y_SCALE(bly); + bry = Y_SCALE(bry); if ((inlay->PSM == GS_PSM_CT32) || (inlay->Clut && inlay->ClutPSM == GS_PSM_CT32)) gsGlobal->PrimAlphaEnable = GS_SETTING_ON; else gsGlobal->PrimAlphaEnable = GS_SETTING_OFF; + gsKit_TexManager_bind(gsGlobal, inlay); gsKit_prim_quad_texture(gsGlobal, inlay, - quad.ul.x + transX + aspectWidth * ulx - 0.5f, quad.ul.y + transY + uly - 0.5f, + quad.ul.x + ulx + fRenderXOff, quad.ul.y + uly + fRenderYOff, 0.0f, 0.0f, - quad.ul.x + transX + aspectWidth * urx - 0.5f, quad.ul.y + transY + ury - 0.5f, + quad.ul.x + urx + fRenderXOff, quad.ul.y + ury + fRenderYOff, inlay->Width, 0.0f, - quad.ul.x + transX + aspectWidth * blx - 0.5f, quad.ul.y + transY + bly - 0.5f, + quad.ul.x + blx + fRenderXOff, quad.ul.y + bly + fRenderYOff, 0.0f, inlay->Height, - quad.ul.x + transX + aspectWidth * brx - 0.5f, quad.ul.y + transY + bry - 0.5f, + quad.ul.x + brx + fRenderXOff, quad.ul.y + bry + fRenderYOff, inlay->Width, inlay->Height, order, gDefaultCol); order++; @@ -486,15 +320,25 @@ void rmDrawOverlayPixmap(GSTEXTURE *overlay, int x, int y, short aligned, int w, void rmDrawRect(int x, int y, int w, int h, u64 color) { + float fx = X_SCALE(x) + fRenderXOff; + float fy = Y_SCALE(y) + fRenderYOff; + float fw = X_SCALE(w); + float fh = Y_SCALE(h); + gsGlobal->PrimAlphaEnable = GS_SETTING_ON; - gsKit_prim_sprite(gsGlobal, x + transX, shiftY(y) + transY, x + w + transX, shiftY(y) + h + transY, order, color); + gsKit_prim_sprite(gsGlobal, fx, fy, fx + fw, fy + fh, order, color); order++; } -void rmDrawLine(int x, int y, int x1, int y1, u64 color) +void rmDrawLine(int x1, int y1, int x2, int y2, u64 color) { + float fx1 = X_SCALE(x1) + fRenderXOff; + float fy1 = Y_SCALE(y1) + fRenderYOff; + float fx2 = X_SCALE(x2) + fRenderXOff; + float fy2 = Y_SCALE(y2) + fRenderYOff; + gsGlobal->PrimAlphaEnable = GS_SETTING_ON; - gsKit_prim_line(gsGlobal, x + transX, shiftY(y) + transY, x1 + transX, shiftY(y1) + transY, order, color); + gsKit_prim_line(gsGlobal, fx1, fy1, fx2, fy2, order, color); order++; } @@ -503,50 +347,83 @@ void rmSetDisplayOffset(int x, int y) gsKit_set_display_offset(gsGlobal, x * rm_mode_table[vmode].VCK, y); } -void rmSetAspectRatio(float width, float height) +void rmSetAspectRatio(enum rm_aratio dar) { - aspectWidth = width; - aspectHeight = height; + DAR = dar; + + switch(DAR) { + case RM_ARATIO_4_3: + iAspectWidth = 4; // width = width * 4 / 4 + break; + case RM_ARATIO_16_9: + iAspectWidth = 3; // width = width * 3 / 4 + break; + }; +} + +int rmWideScale(int x) +{ + return (x * iAspectWidth) >> 2; +} + +// Get the pixel aspect ratio (how wide or narrow are the pixels?) +float rmGetPAR() +{ + float fPAR = (float)rm_mode_table[vmode].PAR1 / (float)rm_mode_table[vmode].PAR2; + + // In anamorphic mode the pixels are stretched to 16:9 + if ((DAR == RM_ARATIO_16_9) && (rm_mode_table[vmode].aratio == RM_ARATIO_4_3)) + fPAR *= 0.75f; + + // In interlaced frame mode, the pixel are (virtually) twice as high + // FIXME: this looks ugly! + // we need the font to render at 1920x1080 instead of 1920x540 + if ((gsGlobal->Interlace == GS_INTERLACED) && (gsGlobal->Field == GS_FRAME)) + fPAR *= 2.0f; + + return fPAR; } -void rmResetAspectRatio() +int rmScaleX(int x) { - aspectWidth = 1.0f; - aspectHeight = 1.0f; + return X_SCALE(x); } -void rmGetAspectRatio(float *w, float *h) +int rmScaleY(int y) { - *w = aspectWidth; - *h = aspectHeight; + return Y_SCALE(y); } -void rmApplyAspectRatio(int *w, int *h) +int rmUnScaleX(int x) { - *w = *w * aspectWidth; - *h = *h * aspectHeight; + return (x*640)/iDisplayWidth; } -void rmSetShiftRatio(float shiftYRatio) +int rmUnScaleY(int y) { - shiftYVal = shiftYRatio; - shiftY = &shiftYFunc; + return (y*480)/iDisplayHeight; } -void rmResetShiftRatio() +static void rmUpdateRenderOffsets() { - shiftY = &identityFunc; + fRenderXOff = (float)iDisplayXOff + transX - 0.5f; + fRenderYOff = (float)iDisplayYOff + transY - 0.5f; } -void rmApplyShiftRatio(int *y) +void rmSetOverscan(int overscan) { - *y = shiftY(*y); + iDisplayXOff = (gsGlobal->Width * overscan) / (2 * 1000); + iDisplayYOff = (gsGlobal->Height * overscan) / (2 * 1000); + iDisplayWidth = gsGlobal->Width - (2 * iDisplayXOff); + iDisplayHeight = gsGlobal->Height - (2 * iDisplayYOff); + rmUpdateRenderOffsets(); } void rmSetTransposition(float x, float y) { - transX = x; - transY = y; + transX = X_SCALE(x); + transY = Y_SCALE(y); + rmUpdateRenderOffsets(); } unsigned char rmGetHsync(void) diff --git a/src/texcache.c b/src/texcache.c index 0979127ab..341ea11dc 100644 --- a/src/texcache.c +++ b/src/texcache.c @@ -3,6 +3,7 @@ #include "include/ioman.h" #include "include/gui.h" #include "include/util.h" +#include "include/renderman.h" typedef struct { @@ -64,8 +65,10 @@ void cacheEnd() static void cacheClearItem(cache_entry_t *item, int freeTxt) { - if (freeTxt && item->texture.Mem) + if (freeTxt && item->texture.Mem) { + rmUnloadTexture(&item->texture); free(item->texture.Mem); + } memset(item, 0, sizeof(cache_entry_t)); item->texture.Mem = NULL; diff --git a/src/themes.c b/src/themes.c index 6ed189daa..2fd94d199 100644 --- a/src/themes.c +++ b/src/themes.c @@ -262,8 +262,10 @@ static void findDuplicate(theme_element_t *first, const char *cachePattern, cons static void freeImageTexture(image_texture_t *texture) { if (texture) { - if (texture->source.Mem) + if (texture->source.Mem) { + rmUnloadTexture(&texture->source); free(texture->source.Mem); + } free(texture->name); @@ -966,6 +968,7 @@ static void thmFree(theme_t *theme) for (; id < TEXTURES_COUNT; id++) { texture = &theme->textures[id]; if (texture->Mem != NULL) { + rmUnloadTexture(texture); free(texture->Mem); texture->Mem = NULL; } @@ -1142,12 +1145,6 @@ static void thmLoad(const char *themePath) LOG("THEMES Number of cache: %d\n", newT->gameCacheCount); LOG("THEMES Used height: %d\n", newT->usedHeight); - /// Now swap theme and start loading textures - if (newT->usedHeight == screenHeight) - rmResetShiftRatio(); - else - rmSetShiftRatio((float)screenHeight / newT->usedHeight); - int i; // default all to not loaded... for (i = 0; i < TEXTURES_COUNT; i++) { From f57bf5c1c825633c8a953c940862b67f7ea2430a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 9 Aug 2017 12:01:13 -0700 Subject: [PATCH 060/269] Restore original: Fix bug in ELM support by rickgaiser (aka Maximus32): Without ELM support there are 4 io modules, with ELM support there are 5 io modules, causing unexpected crashes. --- DETAILED_CHANGELOG | 1 + src/opl.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 1980aa440..9f8b6203b 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1018 - Jay-Jay-OPL - Scaling, overscan and lots of small things (#59) by rickgaiser - Wed Aug 9 10:57:50 2017 -0700 rev1017 - Jay-Jay-OPL - Make OPL compilable with latest PS2SDK (#63) by uyjulian - Wed Aug 9 09:36:13 2017 -0700 rev1016 - Jay-Jay-OPL - Fix bug in ELM support by rickgaiser (aka Maximus32): Without ELM support there are 4 io modules, with ELM support there are 5 io modules, causing unexpected crashes. - Tue Aug 8 22:03:23 2017 -0700 rev1015 - Jay-Jay-OPL - belek666 made the following changes: ds3bt updates (#62) - more accurate reading, fix data request, add waiting for cmd report - Mon Jul 31 14:59:00 2017 -0700 diff --git a/src/opl.c b/src/opl.c index e254e7a6f..76bec5720 100644 --- a/src/opl.c +++ b/src/opl.c @@ -109,7 +109,7 @@ static unsigned int frameCounter; static char errorMessage[256]; //START of OPL_DB tweaks -static opl_io_module_t list_support[5]; +static opl_io_module_t list_support[MODE_COUNT]; //END of OPL_DB tweaks void moduleUpdateMenu(int mode, int themeChanged) From bf268afe31a0c87be2c9c3051ecc20d25a534004 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 9 Aug 2017 20:39:02 -0700 Subject: [PATCH 061/269] changes by rickgaiser (aka Maximus32) Fix font not visible when video mode set to auto Add initial hires mode --- DETAILED_CHANGELOG | 1 + src/gui.c | 11 ++++--- src/renderman.c | 76 ++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 70 insertions(+), 18 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 9f8b6203b..91af73347 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1019 - Jay-Jay-OPL - Restore original: Fix bug in ELM support by rickgaiser (aka Maximus32): - Wed Aug 9 12:01:13 2017 -0700 rev1018 - Jay-Jay-OPL - Scaling, overscan and lots of small things (#59) by rickgaiser - Wed Aug 9 10:57:50 2017 -0700 rev1017 - Jay-Jay-OPL - Make OPL compilable with latest PS2SDK (#63) by uyjulian - Wed Aug 9 09:36:13 2017 -0700 rev1016 - Jay-Jay-OPL - Fix bug in ELM support by rickgaiser (aka Maximus32): Without ELM support there are 4 io modules, with ELM support there are 5 io modules, causing unexpected crashes. - Tue Aug 8 22:03:23 2017 -0700 diff --git a/src/gui.c b/src/gui.c index db0f9e5c1..436705ea1 100644 --- a/src/gui.c +++ b/src/gui.c @@ -131,6 +131,7 @@ void guiInit(void) gGUILockSemaId = CreateSema(&gQueueSema); guiReloadScreenExtents(); + guiUpdateScreenScale(); // background texture - for perlin gBackgroundTex.Width = PLASMA_W; @@ -522,11 +523,11 @@ void guiShowUIConfig(void) , "EDTV 640x448p @60Hz 24bit" , "EDTV 640x512p @50Hz 24bit" , "VGA 640x480p @60Hz 24bit" - , "PAL 704x576i @50Hz 16bit" - , "NTSC 704x480i @60Hz 16bit" - , "EDTV 704x480p @60Hz 16bit" - , "EDTV 704x576p @50Hz 16bit" - , "HDTV 1280x720p @60Hz 16bit scaled" + , "PAL 704x576i @50Hz 24bit" + , "NTSC 704x480i @60Hz 24bit" + , "EDTV 704x480p @60Hz 24bit" + , "EDTV 704x576p @50Hz 24bit" + , "HDTV 1280x720p @60Hz 16bit" , "HDTV 1920x1080i @60Hz 16bit scaled" , NULL}; diff --git a/src/renderman.c b/src/renderman.c index 40c66bded..fe38c16e0 100644 --- a/src/renderman.c +++ b/src/renderman.c @@ -13,9 +13,12 @@ // Allocateable space in vram, as indicated in GsKit's code #define __VRAM_SIZE 4194304 +#define HIRES_MODE GSGLOBAL *gsGlobal; +#ifndef HIRES_MODE s32 guiThreadID; +#endif static int order; static enum rm_vmode vmode = RM_VMODE_AUTO; @@ -29,6 +32,7 @@ struct rm_mode char hsync; //In KHz short int width; short int height; + short int passes; short int VCK; short int interlace; short int field; @@ -39,19 +43,25 @@ struct rm_mode static struct rm_mode rm_mode_table[NUM_RM_VMODES] = { // 24 bit color mode with black borders - {-1, 16, 640, -1, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 1, 1}, // AUTO - {GS_MODE_PAL, 16, 640, 512, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz - {GS_MODE_NTSC, 16, 640, 448, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz - {GS_MODE_DTV_480P, 31, 640, 448, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz - {GS_MODE_DTV_576P, 31, 640, 512, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz - {GS_MODE_VGA_640_60, 31, 640, 480, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // VGA640x480@60Hz + {-1, 16, 640, -1, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 1, 1}, // AUTO + {GS_MODE_PAL, 16, 640, 512, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz + {GS_MODE_NTSC, 16, 640, 448, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz + {GS_MODE_DTV_480P, 31, 640, 448, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz + {GS_MODE_DTV_576P, 31, 640, 512, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz + {GS_MODE_VGA_640_60, 31, 640, 480, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // VGA640x480@60Hz // 16bit color mode full screen - {GS_MODE_PAL, 16, 704, 576, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz - {GS_MODE_NTSC, 16, 704, 480, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz - {GS_MODE_DTV_480P, 31, 704, 480, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz - {GS_MODE_DTV_576P, 31, 704, 576, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz - {GS_MODE_DTV_720P, 31, 640, 720, 1, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 2}, // HDTV720P@60Hz - {GS_MODE_DTV_1080I, 31, 640, 540, 1, GS_INTERLACED, GS_FIELD, RM_ARATIO_16_9, 2, 3}, // HDTV1080I@60Hz + {GS_MODE_PAL, 16, 704, 576, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz + {GS_MODE_NTSC, 16, 704, 480, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz + {GS_MODE_DTV_480P, 31, 704, 480, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz + {GS_MODE_DTV_576P, 31, 704, 576, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz +#ifdef HIRES_MODE + {GS_MODE_DTV_720P, 31, 1280, 720, 3, 1, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 1}, // HDTV720P@60Hz + //{GS_MODE_DTV_1080I, 31, 1920, 1080, 3, 1, GS_INTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 1}, // HDTV1080I@60Hz + {GS_MODE_DTV_1080I, 31, 960, 1080, 3, 1, GS_INTERLACED, GS_FIELD, RM_ARATIO_16_9, 1, 2}, // HDTV1080I@60Hz +#else + {GS_MODE_DTV_720P, 31, 640, 720, 3, 1, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 2}, // HDTV720P@60Hz + {GS_MODE_DTV_1080I, 31, 640, 540, 3, 1, GS_INTERLACED, GS_FIELD, RM_ARATIO_16_9, 2, 3}, // HDTV1080I@60Hz +#endif }; // Display Aspect Ratio @@ -98,6 +108,10 @@ void rmStartFrame(void) void rmEndFrame(void) { +#ifdef HIRES_MODE + gsKit_hires_sync(gsGlobal); + gsKit_hires_flip(gsGlobal); +#else gsKit_set_finish(gsGlobal); gsKit_queue_exec(gsGlobal); @@ -116,19 +130,26 @@ void rmEndFrame(void) } gsKit_setactive(gsGlobal); +#endif gsKit_TexManager_nextFrame(gsGlobal); } +#ifndef HIRES_MODE static int rmOnVSync(void) { iWakeupThread(guiThreadID); return 0; } +#endif void rmInit() { +#ifdef HIRES_MODE + gsGlobal = gsKit_hires_init_global(); +#else gsGlobal = gsKit_init_global(); +#endif rm_mode_table[RM_VMODE_AUTO].mode = gsGlobal->Mode; rm_mode_table[RM_VMODE_AUTO].height = gsGlobal->Height; @@ -143,8 +164,10 @@ void rmInit() order = 0; +#ifndef HIRES_MODE guiThreadID = GetThreadId(); gsKit_add_vsync_handler(&rmOnVSync); +#endif } int rmSetMode(int force) @@ -155,6 +178,13 @@ int rmSetMode(int force) // we don't want to set the vmode without a reason... int changed = (vmode != gVMode || force); if (changed) { +#ifdef HIRES_MODE + // Hires mode needs to re-initialize if is was previously initialized + if (vmode != RM_VMODE_AUTO) { + gsKit_hires_deinit_global(gsGlobal); + gsGlobal = gsKit_hires_init_global(); + } +#endif vmode = gVMode; gsGlobal->Mode = rm_mode_table[vmode].mode; @@ -165,7 +195,7 @@ int rmSetMode(int force) gsGlobal->PSM = GS_PSM_CT24; // Higher resolution use too much VRAM // so automatically switch back to 16bit color depth - if ((gsGlobal->Width * gsGlobal->Height) > (640 * 512)) + if ((gsGlobal->Width * gsGlobal->Height) > (704 * 576)) gsGlobal->PSM = GS_PSM_CT16S; gsGlobal->PSMZ = GS_PSMZ_16S; gsGlobal->ZBuffering = GS_SETTING_OFF; @@ -176,19 +206,35 @@ int rmSetMode(int force) if ((gsGlobal->Interlace == GS_INTERLACED) && (gsGlobal->Field == GS_FRAME)) gsGlobal->Height /= 2; + // Coordinate space ranges from 0 to 4096 pixels + // Center the buffer in the coordinate space + gsGlobal->OffsetX = ((4096 - gsGlobal->Width) / 2) * 16; + gsGlobal->OffsetY = ((4096 - gsGlobal->Height) / 2) * 16; + +#ifdef HIRES_MODE + gsKit_hires_init_screen(gsGlobal, rm_mode_table[vmode].passes); +#else gsKit_init_screen(gsGlobal); +#endif rmSetDisplayOffset(gXOff, gYOff); rmSetOverscan(gOverscan); +#ifndef HIRES_MODE gsKit_mode_switch(gsGlobal, GS_ONESHOT); +#endif gsKit_set_test(gsGlobal, GS_ZTEST_OFF); gsKit_set_primalpha(gsGlobal, gDefaultAlpha, 0); // reset the contents of the screen to avoid garbage being displayed gsKit_clear(gsGlobal, gColBlack); +#ifdef HIRES_MODE + gsKit_hires_sync(gsGlobal); + gsKit_hires_flip(gsGlobal); +#else gsKit_sync_flip(gsGlobal); +#endif LOG("RENDERMAN New vmode: %d, %d x %d\n", vmode, gsGlobal->Width, gsGlobal->Height); } @@ -211,7 +257,11 @@ void rmGetScreenExtents(int *w, int *h) void rmEnd(void) { +#ifdef HIRES_MODE + gsKit_hires_deinit_global(gsGlobal); +#else gsKit_deinit_global(gsGlobal); +#endif } #define X_SCALE(x) (((x)*iDisplayWidth) /640) From 32a9bd9a356ada03dcf8a29207fe7a6fd73e8e12 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 9 Aug 2017 22:17:55 -0700 Subject: [PATCH 062/269] remove: Add initial mode - experimental code --- DETAILED_CHANGELOG | 1 + src/gui.c | 10 +++--- src/renderman.c | 76 ++++++++-------------------------------------- 3 files changed, 19 insertions(+), 68 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 91af73347..f319f6c05 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1020 - Jay-Jay-OPL - changes by rickgaiser (aka Maximus32) Fix font not visible when video mode set to auto Add initial hires mode - Wed Aug 9 20:39:02 2017 -0700 rev1019 - Jay-Jay-OPL - Restore original: Fix bug in ELM support by rickgaiser (aka Maximus32): - Wed Aug 9 12:01:13 2017 -0700 rev1018 - Jay-Jay-OPL - Scaling, overscan and lots of small things (#59) by rickgaiser - Wed Aug 9 10:57:50 2017 -0700 rev1017 - Jay-Jay-OPL - Make OPL compilable with latest PS2SDK (#63) by uyjulian - Wed Aug 9 09:36:13 2017 -0700 diff --git a/src/gui.c b/src/gui.c index 436705ea1..f5e69a7f2 100644 --- a/src/gui.c +++ b/src/gui.c @@ -523,11 +523,11 @@ void guiShowUIConfig(void) , "EDTV 640x448p @60Hz 24bit" , "EDTV 640x512p @50Hz 24bit" , "VGA 640x480p @60Hz 24bit" - , "PAL 704x576i @50Hz 24bit" - , "NTSC 704x480i @60Hz 24bit" - , "EDTV 704x480p @60Hz 24bit" - , "EDTV 704x576p @50Hz 24bit" - , "HDTV 1280x720p @60Hz 16bit" + , "PAL 704x576i @50Hz 16bit" + , "NTSC 704x480i @60Hz 16bit" + , "EDTV 704x480p @60Hz 16bit" + , "EDTV 704x576p @50Hz 16bit" + , "HDTV 1280x720p @60Hz 16bit scaled" , "HDTV 1920x1080i @60Hz 16bit scaled" , NULL}; diff --git a/src/renderman.c b/src/renderman.c index fe38c16e0..40c66bded 100644 --- a/src/renderman.c +++ b/src/renderman.c @@ -13,12 +13,9 @@ // Allocateable space in vram, as indicated in GsKit's code #define __VRAM_SIZE 4194304 -#define HIRES_MODE GSGLOBAL *gsGlobal; -#ifndef HIRES_MODE s32 guiThreadID; -#endif static int order; static enum rm_vmode vmode = RM_VMODE_AUTO; @@ -32,7 +29,6 @@ struct rm_mode char hsync; //In KHz short int width; short int height; - short int passes; short int VCK; short int interlace; short int field; @@ -43,25 +39,19 @@ struct rm_mode static struct rm_mode rm_mode_table[NUM_RM_VMODES] = { // 24 bit color mode with black borders - {-1, 16, 640, -1, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 1, 1}, // AUTO - {GS_MODE_PAL, 16, 640, 512, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz - {GS_MODE_NTSC, 16, 640, 448, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz - {GS_MODE_DTV_480P, 31, 640, 448, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz - {GS_MODE_DTV_576P, 31, 640, 512, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz - {GS_MODE_VGA_640_60, 31, 640, 480, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // VGA640x480@60Hz + {-1, 16, 640, -1, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 1, 1}, // AUTO + {GS_MODE_PAL, 16, 640, 512, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz + {GS_MODE_NTSC, 16, 640, 448, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz + {GS_MODE_DTV_480P, 31, 640, 448, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz + {GS_MODE_DTV_576P, 31, 640, 512, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz + {GS_MODE_VGA_640_60, 31, 640, 480, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // VGA640x480@60Hz // 16bit color mode full screen - {GS_MODE_PAL, 16, 704, 576, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz - {GS_MODE_NTSC, 16, 704, 480, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz - {GS_MODE_DTV_480P, 31, 704, 480, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz - {GS_MODE_DTV_576P, 31, 704, 576, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz -#ifdef HIRES_MODE - {GS_MODE_DTV_720P, 31, 1280, 720, 3, 1, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 1}, // HDTV720P@60Hz - //{GS_MODE_DTV_1080I, 31, 1920, 1080, 3, 1, GS_INTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 1}, // HDTV1080I@60Hz - {GS_MODE_DTV_1080I, 31, 960, 1080, 3, 1, GS_INTERLACED, GS_FIELD, RM_ARATIO_16_9, 1, 2}, // HDTV1080I@60Hz -#else - {GS_MODE_DTV_720P, 31, 640, 720, 3, 1, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 2}, // HDTV720P@60Hz - {GS_MODE_DTV_1080I, 31, 640, 540, 3, 1, GS_INTERLACED, GS_FIELD, RM_ARATIO_16_9, 2, 3}, // HDTV1080I@60Hz -#endif + {GS_MODE_PAL, 16, 704, 576, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz + {GS_MODE_NTSC, 16, 704, 480, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz + {GS_MODE_DTV_480P, 31, 704, 480, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz + {GS_MODE_DTV_576P, 31, 704, 576, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz + {GS_MODE_DTV_720P, 31, 640, 720, 1, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 2}, // HDTV720P@60Hz + {GS_MODE_DTV_1080I, 31, 640, 540, 1, GS_INTERLACED, GS_FIELD, RM_ARATIO_16_9, 2, 3}, // HDTV1080I@60Hz }; // Display Aspect Ratio @@ -108,10 +98,6 @@ void rmStartFrame(void) void rmEndFrame(void) { -#ifdef HIRES_MODE - gsKit_hires_sync(gsGlobal); - gsKit_hires_flip(gsGlobal); -#else gsKit_set_finish(gsGlobal); gsKit_queue_exec(gsGlobal); @@ -130,26 +116,19 @@ void rmEndFrame(void) } gsKit_setactive(gsGlobal); -#endif gsKit_TexManager_nextFrame(gsGlobal); } -#ifndef HIRES_MODE static int rmOnVSync(void) { iWakeupThread(guiThreadID); return 0; } -#endif void rmInit() { -#ifdef HIRES_MODE - gsGlobal = gsKit_hires_init_global(); -#else gsGlobal = gsKit_init_global(); -#endif rm_mode_table[RM_VMODE_AUTO].mode = gsGlobal->Mode; rm_mode_table[RM_VMODE_AUTO].height = gsGlobal->Height; @@ -164,10 +143,8 @@ void rmInit() order = 0; -#ifndef HIRES_MODE guiThreadID = GetThreadId(); gsKit_add_vsync_handler(&rmOnVSync); -#endif } int rmSetMode(int force) @@ -178,13 +155,6 @@ int rmSetMode(int force) // we don't want to set the vmode without a reason... int changed = (vmode != gVMode || force); if (changed) { -#ifdef HIRES_MODE - // Hires mode needs to re-initialize if is was previously initialized - if (vmode != RM_VMODE_AUTO) { - gsKit_hires_deinit_global(gsGlobal); - gsGlobal = gsKit_hires_init_global(); - } -#endif vmode = gVMode; gsGlobal->Mode = rm_mode_table[vmode].mode; @@ -195,7 +165,7 @@ int rmSetMode(int force) gsGlobal->PSM = GS_PSM_CT24; // Higher resolution use too much VRAM // so automatically switch back to 16bit color depth - if ((gsGlobal->Width * gsGlobal->Height) > (704 * 576)) + if ((gsGlobal->Width * gsGlobal->Height) > (640 * 512)) gsGlobal->PSM = GS_PSM_CT16S; gsGlobal->PSMZ = GS_PSMZ_16S; gsGlobal->ZBuffering = GS_SETTING_OFF; @@ -206,35 +176,19 @@ int rmSetMode(int force) if ((gsGlobal->Interlace == GS_INTERLACED) && (gsGlobal->Field == GS_FRAME)) gsGlobal->Height /= 2; - // Coordinate space ranges from 0 to 4096 pixels - // Center the buffer in the coordinate space - gsGlobal->OffsetX = ((4096 - gsGlobal->Width) / 2) * 16; - gsGlobal->OffsetY = ((4096 - gsGlobal->Height) / 2) * 16; - -#ifdef HIRES_MODE - gsKit_hires_init_screen(gsGlobal, rm_mode_table[vmode].passes); -#else gsKit_init_screen(gsGlobal); -#endif rmSetDisplayOffset(gXOff, gYOff); rmSetOverscan(gOverscan); -#ifndef HIRES_MODE gsKit_mode_switch(gsGlobal, GS_ONESHOT); -#endif gsKit_set_test(gsGlobal, GS_ZTEST_OFF); gsKit_set_primalpha(gsGlobal, gDefaultAlpha, 0); // reset the contents of the screen to avoid garbage being displayed gsKit_clear(gsGlobal, gColBlack); -#ifdef HIRES_MODE - gsKit_hires_sync(gsGlobal); - gsKit_hires_flip(gsGlobal); -#else gsKit_sync_flip(gsGlobal); -#endif LOG("RENDERMAN New vmode: %d, %d x %d\n", vmode, gsGlobal->Width, gsGlobal->Height); } @@ -257,11 +211,7 @@ void rmGetScreenExtents(int *w, int *h) void rmEnd(void) { -#ifdef HIRES_MODE - gsKit_hires_deinit_global(gsGlobal); -#else gsKit_deinit_global(gsGlobal); -#endif } #define X_SCALE(x) (((x)*iDisplayWidth) /640) From 02c54cdf9afc8e1d59d67b99b4d3dc2cd2fc7574 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 11 Aug 2017 23:59:54 -0700 Subject: [PATCH 063/269] BMP support and bugfixes #64 by rickgaiser (Maximus32) (1) Apply settings also when video mode does not change When video mode was set to auto, some settings did not apply: - font not visible - x/y scaling - overscan - widescreen (2) textures: Add bmp support (from gsKit) BMP support enables loading of 8bit textures. This can make textures use 75% less VRAM. (3) themes: fix ALIGN_CENTER (4) Fix font missing when selecting different language (5) Fix error message LANG cannot load font. when font is OK --- DETAILED_CHANGELOG | 1 + include/textures.h | 1 + src/lang.c | 14 ++++++++------ src/opl.c | 4 ++-- src/renderman.c | 8 ++++---- src/textures.c | 34 ++++++++++++++++++++++++++++++---- src/themes.c | 4 ++-- 7 files changed, 48 insertions(+), 18 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index f319f6c05..ad909c84c 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1021 - Jay-Jay-OPL - remove: Add initial mode - experimental code - Wed Aug 9 22:17:55 2017 -0700 rev1020 - Jay-Jay-OPL - changes by rickgaiser (aka Maximus32) Fix font not visible when video mode set to auto Add initial hires mode - Wed Aug 9 20:39:02 2017 -0700 rev1019 - Jay-Jay-OPL - Restore original: Fix bug in ELM support by rickgaiser (aka Maximus32): - Wed Aug 9 12:01:13 2017 -0700 rev1018 - Jay-Jay-OPL - Scaling, overscan and lots of small things (#59) by rickgaiser - Wed Aug 9 10:57:50 2017 -0700 diff --git a/include/textures.h b/include/textures.h index b3c2de512..e77f40647 100644 --- a/include/textures.h +++ b/include/textures.h @@ -48,6 +48,7 @@ enum INTERNAL_TEXTURE { int texLookupInternalTexId(const char *name); int texPngLoad(GSTEXTURE *texture, const char *path, int texId, short psm); int texJpgLoad(GSTEXTURE *texture, const char *path, int texId, short psm); +int texBmpLoad(GSTEXTURE *texture, const char *path, int texId, short psm); void texPrepare(GSTEXTURE *texture, short psm); int texDiscoverLoad(GSTEXTURE *texture, const char *path, int texId, short psm); diff --git a/src/lang.c b/src/lang.c index 74d9bf1ab..db176fa8f 100644 --- a/src/lang.c +++ b/src/lang.c @@ -284,14 +284,16 @@ static void lngFreeFromFile(void) static int lngLoadFont(const char *dir, const char *name) { char path[256]; + snprintf(path, sizeof(path), "%s/font_%s.ttf", dir, name); LOG("LANG Custom TTF font path: %s\n", path); - if (fntLoadDefault(path) != 0) { - snprintf(path, sizeof(path), "%s/font_%s.otf", dir, name); - LOG("LANG Custom OTF font path: %s\n", path); - if (fntLoadDefault(path) == 0) - return 0; - } + if (fntLoadDefault(path) == 0) + return 0; + + snprintf(path, sizeof(path), "%s/font_%s.otf", dir, name); + LOG("LANG Custom OTF font path: %s\n", path); + if (fntLoadDefault(path) == 0) + return 0; LOG("LANG cannot load font.\n"); diff --git a/src/opl.c b/src/opl.c index 76bec5720..d6c876ad6 100644 --- a/src/opl.c +++ b/src/opl.c @@ -714,10 +714,8 @@ void applyConfig(int themeID, int langID) int changed = rmSetMode(0); if (changed) { // reinit the graphics... - rmSetAspectRatio((gWideScreen == 0) ? RM_ARATIO_4_3 : RM_ARATIO_16_9); thmReloadScreenExtents(); guiReloadScreenExtents(); - guiUpdateScreenScale(); } // theme must be set after color, and lng after theme @@ -725,6 +723,8 @@ void applyConfig(int themeID, int langID) if (langID != -1) lngSetGuiValue(langID); + guiUpdateScreenScale(); + initAllSupport(0); menuReinitMainMenu(); diff --git a/src/renderman.c b/src/renderman.c index 40c66bded..30ee83d18 100644 --- a/src/renderman.c +++ b/src/renderman.c @@ -177,10 +177,6 @@ int rmSetMode(int force) gsGlobal->Height /= 2; gsKit_init_screen(gsGlobal); - - rmSetDisplayOffset(gXOff, gYOff); - rmSetOverscan(gOverscan); - gsKit_mode_switch(gsGlobal, GS_ONESHOT); gsKit_set_test(gsGlobal, GS_ZTEST_OFF); @@ -193,6 +189,10 @@ int rmSetMode(int force) LOG("RENDERMAN New vmode: %d, %d x %d\n", vmode, gsGlobal->Width, gsGlobal->Height); } + rmSetDisplayOffset(gXOff, gYOff); + rmSetOverscan(gOverscan); + rmSetAspectRatio((gWideScreen == 0) ? RM_ARATIO_4_3 : RM_ARATIO_16_9); + return changed; } diff --git a/src/textures.c b/src/textures.c index 0523689b6..36c324674 100644 --- a/src/textures.c +++ b/src/textures.c @@ -118,11 +118,15 @@ void texPrepare(GSTEXTURE *texture, short psm) int texDiscoverLoad(GSTEXTURE *texture, const char *path, int texId, short psm) { - int rc = texPngLoad(texture, path, texId, psm); - if (rc >= 0) + if (texPngLoad(texture, path, texId, psm) >= 0) return 0; - else if (psm == GS_PSM_CT24) - return texJpgLoad(texture, path, texId, psm); + + if ((psm == GS_PSM_CT24) && texJpgLoad(texture, path, texId, psm) >= 0) + return 0; + + if (texBmpLoad(texture, path, texId, psm) >= 0) + return 0; + return ERR_BAD_FILE; } @@ -350,3 +354,25 @@ int texJpgLoad(GSTEXTURE *texture, const char *path, int texId, short psm) return result; } + + +/// BMP SUPPORT /////////////////////////////////////////////////////////////////////////////////////// + +extern GSGLOBAL *gsGlobal; +int texBmpLoad(GSTEXTURE *texture, const char *path, int texId, short psm) +{ + texPrepare(texture, GS_PSM_CT24); + int result = ERR_BAD_FILE; + char filePath[256]; + + if (texId != -1) + snprintf(filePath, sizeof(filePath), "%s%s.bmp", path, internalDefault[texId].name); + else + snprintf(filePath, sizeof(filePath), "%s.bmp", path); + + texture->Delayed = 1; + result = gsKit_texture_bmp(gsGlobal, texture, filePath); + texture->Filter = GS_FILTER_LINEAR; + + return result; +} diff --git a/src/themes.c b/src/themes.c index 2fd94d199..624a7f419 100644 --- a/src/themes.c +++ b/src/themes.c @@ -611,13 +611,13 @@ static theme_element_t *initBasic(const char *themePath, config_set_t *themeConf snprintf(elemProp, sizeof(elemProp), "%s_aligned", name); if (configGetInt(themeConfig, elemProp, &intValue)) - elem->aligned = intValue; + elem->aligned = (intValue == 0) ? ALIGN_NONE : ALIGN_CENTER; else elem->aligned = aligned; snprintf(elemProp, sizeof(elemProp), "%s_scaled", name); if (configGetInt(themeConfig, elemProp, &intValue)) - elem->scaled = intValue; + elem->scaled = (intValue == 0) ? SCALING_NONE : SCALING_RATIO; else elem->scaled = scaled; From a2d96554995fb9c660479cc68b7a38ff8b956d43 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 24 Aug 2017 17:30:59 -0700 Subject: [PATCH 064/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Arabic.lng | 12 +- lng/lang_Bulgarian.lng | 6 +- lng/lang_Czech.lng | 6 +- lng/lang_Danish.lng | 6 +- lng/lang_Dutch.lng | 236 +++++++++++++++++++++++++++++++++++++ lng/lang_Filipino.lng | 14 ++- lng/lang_French.lng | 42 +++---- lng/lang_German.lng | 6 +- lng/lang_Greek.lng | 7 +- lng/lang_Hungarian.lng | 6 +- lng/lang_Indonesian.lng | 6 +- lng/lang_Italian.lng | 12 +- lng/lang_Japanese.lng | 6 +- lng/lang_Korean.lng | 6 +- lng/lang_Laotian.lng | 12 +- lng/lang_Polish.lng | 12 +- lng/lang_Portuguese.lng | 6 +- lng/lang_Portuguese_BR.lng | 6 +- lng/lang_Russian.lng | 6 +- lng/lang_Spanish.lng | 6 +- lng/lang_Swedish.lng | 6 +- lng/lang_TChinese.lng | 12 +- lng/lang_Turkish.lng | 12 +- 24 files changed, 365 insertions(+), 85 deletions(-) create mode 100644 lng/lang_Dutch.lng diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index ad909c84c..13f5b9a4b 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1022 - Jay-Jay-OPL - BMP support and bugfixes #64 by rickgaiser (Maximus32) (1) Apply settings also when video mode does not change When video mode was set to auto, some settings did not apply: - font not visible - x/y scaling - overscan - widescreen - Fri Aug 11 23:59:54 2017 -0700 rev1021 - Jay-Jay-OPL - remove: Add initial mode - experimental code - Wed Aug 9 22:17:55 2017 -0700 rev1020 - Jay-Jay-OPL - changes by rickgaiser (aka Maximus32) Fix font not visible when video mode set to auto Add initial hires mode - Wed Aug 9 20:39:02 2017 -0700 rev1019 - Jay-Jay-OPL - Restore original: Fix bug in ELM support by rickgaiser (aka Maximus32): - Wed Aug 9 12:01:13 2017 -0700 diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index e3a75990e..8732f0816 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: 03/10/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/12/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Arabic OPL %s @@ -68,7 +68,6 @@ USB الوضع الافتراضي HDD الوضع الافتراضي ETH الوضع الافتراضي الوضع الافتراضي APPS -وضع عرض قائمة تشغيل التطبيقات تلقائي يدوي بدأ خادم HDL @@ -148,6 +147,7 @@ Unhook Syscalls اللون المحدد عرض معلومات الصحفة معلومات +Custom ELF اختيار اللون إعادة الاتصال ترك فارغة الى قائمة المشاركة @@ -184,6 +184,8 @@ H-POS تعديل افقي V-POS تعديل عامودي +حدود الصورة +تنظيم حدود الصورة FMV اجتياز تخطي كامل لحركة الفيديو اعدادات الغش @@ -208,8 +210,8 @@ FMV اجتياز بدأ تلقائي في %i s... تشغيل تلقائي القيمة في الثانية (s)، صفر لتعطيل التشغيل التلقائي -PS2 Logo -عرض شعار القرص فقط الساري المفعول والمطابق لمنطة الجهاز +شعار بلي2 +يتم عرضها فقط لشعار القرص الصالح للاجهزة المطابقة لنفس المنطقة تكوين PADEMU اعدادات محاكي اليدة تمكين محاكي اليدة diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 4ef0556c7..5f93fab40 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Bulgarian OPL %s @@ -184,6 +184,8 @@ PS2 ще е задължен да го използва Хоризонтално отместване Регулиране по вертикала Вертикалното отместване +Overscan +Overscan Adjustment Пропускане на FMV Прескача видеоклиповете (съвместимост) Cheat настройки diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index 12094c26d..0d9a88898 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Czech OPL %s @@ -184,6 +184,8 @@ H-POS Horizontální úprava V-POS Vertikální úprava +Overscan +Overscan Adjustment Přeskočit FMV Přeskočit Full Motion Videa Nastavení Cheatů diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index ab47d5068..a3a3f13dd 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: 01/30/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Danish OPL %s @@ -184,6 +184,8 @@ Horisontal position Horisontal justering Vertikal position Vertikal justering +Overscan +Overscan Justering Vis ikke FMV Springer over Full Motion Videos Snydeindstillinger diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng new file mode 100644 index 000000000..30c40e053 --- /dev/null +++ b/lng/lang_Dutch.lng @@ -0,0 +1,236 @@ +# Translation by PS2gaming @ ps2-home.com +# Last update: 08/24/2017 +# Updated for OPL_1019_DB [f57bf5c] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +Dutch +OPL %s +Wijzigingen opslaan +Terug +Netwerkconfiguratie +Geavanceerde opties + +Instellingen opgeslagen... +Fout bij schrijven van instellingen! +Sluiten +Instellingen +Menu +USB Spellen +HDD Spellen +ETH Spellen +Apps +Thema's +Taal +Het systeem zal worden uitgeschakeld. +OPL afsluiten? +Updaten annuleren? +%d: Harde schijf niet gedetecteerd +%d: Harde schijf niet geformateerd +%d: Netwerk startfout +%d: Geen netwerkadapter gedetecteerd +%d: Kan niet verbinden met SMB server +%d: Kan niet inloggen bij SMB server +%d: Kan SMB-share niet openen +%d: Kan SMB-shares niet inlijsten +%d: Kan spellen niet inlijsten +%d: DHCP server niet beschikbaar +%d: Geen netwerkconnectie +Aan +Uit +OK +Select. +Annuleer +Cirkel +Kruis +Spellenlijst +Spelinstellingen +Verwijder alle instellingen +Verwijder alle keys voor het spel +Scrollen +Langzaam +Normaal +Snel +Standaard menu +Laad vanuit schijf +Even geduld a.u.b. +Fout tijdens laden van Spel ID +Automatisch sorteren +Fout bij laden van taalbestand +Debug kleuren uitschakelen +Geen controller gedetecteerd, wachtend... +Cover Art inschakelen +Breedbeeld +Uitschakelen +Configuratie laden +Configuratie opslaan +Start apparaat +Vernieuwen +USB-apparaat startmodus +HDD-apparaat startmodus +ETH-apparaat startmodus +Applicaties startmodus +Auto +Handmatig +Start HDL Server +HDL Server starten... +HDL Server uitgevoerd... +Mislukt om HDL Server te starten. +HDL Server lossen... +IGR pad +Achtergrondkleur +Tekstkleur +- PS2 - +- SMB Server - +IP-adres type +Statisch +DHCP +IP-adres +Adres +Mask +Gateway +DNS Server +Poort +Deel +Gebruiker +Wachtwoord + +Adrestype +IP +NetBIOS +Accepteer +Item zal permanent verwijdert worden, doorgaan? +Wijzig naam +Verwijder +Uitvoeren +Beeldinstellingen +Schrijftaken inschakelen +Check USB-spel fragmentatie +Herinner laatst gespeelde spel +Selecteerknop +Foutmelding, het spel is gefragmenteerd +Foutmelding, kan het item niet uitvoeren +Test +Laat leeg voor GUEST auth. +Accurate reads +Synchrone modus +Syscalls loshaken +Videos overslaan +Emuleer DVD-DL +IGR uitschakelen +Hoge module opslag +Verberg DEV9 module +Het wijzigen van de grootte zal VMC formatteren +Creëer +Start +Aanpassen +Afbreken +Reset +Gebruik generieke +Configureer VMC +Naam +Groote +Status +Voortgang +VMC-bestand bestaat +Ongeldige VMC-bestand, grootte is incorrect +VMC-bestand moet gecreëerd worden +Fout met VMC %s, voorzetten met fysieke MC (slot %d) ? +Automatisch vernieuwen +Over +Coders +Kwaliteitsgarantie +USB-prefix pad +Start aangepaste ELF na een IGR +Waarde in minuten, 0 om spin down uit te schakelen +Automatische HDD spin down +Videomodus +Dialoogvensterkleur +Geselecteerde kleur +Toon infopagina +Info +Aangepaste ELF +Kleurselectie +Opnieuw verbinden +Laat leeg om het gedeelde in te lijsten +ETH-prefix pad +Backspace +Space +Enter +Modus +VMC Slot 1 +VMC Slot 2 +Spel ID +DMA Modus +V-Sync +Modus 1 +Modus 2 +Modus 3 +Modus 4 +Modus 5 +Modus 6 +Modus 7 +Modus 8 +Configureer GSM +Ethernet link modus +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex +GSM instellingen +GSM inschakelen +Schakelt GSM AAN of UIT +VMODE +Geforceerde aangepast beeldschermmodus +H-POS +Horizontale aanpassing +V-POS +Verticale aanpassing +Overscan +Overscan aanpassing +FMV overslaan +Slaat Full Motion Videos over +Cheat instellingen +PS2RD Cheat Engine inschakelen +Laat PS2RD Cheat Engine uw spellen patchen +PS2RD Cheat Engine Modus +Auto-selecteer of selecteer spelcheats +Auto-selecteer cheats +Selecteer spelcheats +Foutmelding: mislukt om cheatbestand te laden +Geen cheats gevonden +Download standaardwaarden +Netwerkupdate +Bestaande records herdownloaden? +Update mislukt. +Mislukt om te verbinden met update server. +Update voltooid. +Update geannuleerd. +Download instellingen van het netwerk? +Aangepaste instellingen +Gedownloade standaardwaarden +Auto-start over %i s... +Auto-start +Waarde in seconde(n), 0 om auto-start uit te schakelen +PS2 logo +Alleen getoond voor geldige schijflogo die bij de console-regio past +Configureer PADEMU +Pad-emulator instellingen +Pad-emulator inschakelen +Schakelt Pad-emulator in/uit voor geselecteerde spel +Pad-emulator modus +Selecteer Pad-emulator modus. +DualShock3 USB +DualShock3 BT +Instellingen voor poort: +Selecteer Pad-emulator poort voor instellingen. +Emuleren inschakelen +Schakelt Pad-emulator in/uit voor geselecteerde poort. +Vibratie inschakelen +Schakelt vibratie in/uit voor Pad-emulator geselecteerde poort. +USB-bluetoothadapter mac-adres: +DS3-controller gepaard met mac-adres: +Paar +Paar DS3-controller +Paar DS3-controller met bluetoothadapter mac-adres +Niet verbonden +ELF-lader menu +ELF-lader menu displaymodus \ No newline at end of file diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 8ff5b2b94..c1e2542b0 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Filipino OPL %s @@ -92,7 +92,7 @@ Port magbahagi gumagamit Password - + Address type IP NetBIOS @@ -184,6 +184,8 @@ H-POS Horizontal Adjustment V-POS Vertical Adjustment +Overscan +Overscan Adjustment FMV Skip Skips Full Motion Videos Cheat Settings @@ -224,11 +226,11 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: +USB bluetooth adapter MAC address: +DS3 Controller paired to MAC address: Pair Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. +Pair DS3 controller with bluetooth adapter MAC address. Not connected ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 202250c6a..7acd0fc0c 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 French OPL %s @@ -184,6 +184,8 @@ Pos. H Ajustement horizontal Pos. V Ajustement vertical +Overscan +Ajustement Overscan Passer FMV Passe les FMV Options de cheat @@ -210,25 +212,25 @@ Démarrage auto. Valeur en seconde(s), 0 pour désactiver le démarrage auto Logo PS2 S'affiche uniquement si le logo du disque est compatible avec la région de votre console -Configure PADEMU -Pad Emulator Settings -Enable Pad Emulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode -Select Pad Emulator mode. +Configurer PADEMU +Options de PADEMU +Activer PADEMU +Actve/désactive PADEMU pour ce jeu. +Mode de PADEMU +Sélectionner le mode de PADEMU. DualShock3 USB DualShock3 BT -Settings for port: -Select Pad Emulator port for settings. -Enable emulation -Turns on/off Pad Emulator for selected port. -Enable vibration -Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: -Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. -Not connected +Options du port: +SSélectionner le port PADEMU pour les options. +Activer l'émulation +Active/désactive PADEMU pour ce port. +Activer la vibration +Active/désactive la vibration pour le port PADEMU sélectionné. +Adress MAC de l'adapteur Bluetooth USB: +Contrôleur DS3 apairé à l'adresse MAC: +Apairer +Apairer le contrôleur DS3 +Apairer l'adresse MAC du contrôleur Bluetooth DS3. +Non Connecté Menu lanceur d'ELF Mode d'affichage du menu lanceur d'ELF \ No newline at end of file diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 63992f925..e31b90eda 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and lopotri -# Last update: 01/26/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/13/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 German OPL %s @@ -184,6 +184,8 @@ H-POS Horizontale Justierung V-POS Vertikale Justierung +Überabtastung +Überabtastung anpassen Videosequenzen (FMV) überspringen Überspringe Full Motion Videos Cheat Einstellungen diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index c8491cbab..7f6514012 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,7 +1,6 @@ # Greek Translation by RivalK93 -# Recommended font: Roboto Condensed -# Last update: 05/05/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Greek OPL %s @@ -185,6 +184,8 @@ H-POS Οριζόντια ρύθμιση οθόνης. V-POS Κάθετη ρύθμιση οθόνης. +Overscan +Προσαρμογή του Overscan Παράλειψη FMV Παράλειψη των βίντεο Full Motion Ρυθμίσεις Cheats diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index b3e12b46e..83f0d3e12 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Hungarian OPL %s @@ -184,6 +184,8 @@ Vízszintes-Pozíció Vízszintes Szabályozás Függőleges-Pozíció Függőleges Szabályozás +Overscan +Overscan Beállítása FMV Átugrása Átugorja a Full Motion Videókat Csalás Beállítások diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 1e62cefc7..133f2acb3 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: 02/02/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/11/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Indonesian OPL %s @@ -184,6 +184,8 @@ H-POS Penyesuaian horisontal V-POS Penyesuaian Vertikal +Tampilan berlebih +Penyesuaian Tampilan berlebih Lewati FMV Lompati Video Gerakan Penuh Setingan Cheat diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index df1cbb15f..ec25ed60d 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Italian OPL %s @@ -184,6 +184,8 @@ H-POS Regolazione orizzontale V-POS Regolazione verticale +Overscan +Overscan Adjustment Salta FMV Salta video in full motion Impostazioni cheat @@ -224,11 +226,11 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: +USB bluetooth adapter MAC address: +DS3 Controller paired to MAC address: Pair Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. +Pair DS3 controller with bluetooth adapter MAC address. Not connected Menu ELF Loader Caricamento menu ELF Loader \ No newline at end of file diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index f896c6c1f..e3b06796b 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew -# Last update: 03/28/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Japanese OPL %s @@ -184,6 +184,8 @@ GSM設定をオン/オフ 水平方向の表示位置を微調整 垂直調整 垂直方向の表示位置を微調整 +Overscan +Overscan Adjustment FMVスキップ フルモーションムービーをスキップ チート設定 diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 4600d6619..122f8512e 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: 02/04/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Korean OPL %s @@ -184,6 +184,8 @@ H-POS 수평 조정 V-POS 수직 조정 +Overscan +Overscan Adjustment FMV 건너뛰기 풀 모션 비디오 건너뛰기 치트 설정 diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index e55526cc1..15065b951 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Laotian OPL %s @@ -184,6 +184,8 @@ H-POS ການປັບແຕ່ງຄ່າສະແດງຜົນຕາມແນວນອນ V-POS ການປັບແຕ່ງຄ່າສະແດງຜົນຕາມແນວຕັ້ງ +Overscan +Overscan Adjustment ຂ້າມຂັ້ນຕອນ FMV ຂ້າມຂັ້ນຕອນສະແດງພາບເຄື່ອນໄຫວ Full Video ຕັ້ງຄ່າການໂກງເກມ @@ -224,11 +226,11 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: +USB bluetooth adapter MAC address: +DS3 Controller paired to MAC address: Pair Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. +Pair DS3 controller with bluetooth adapter MAC address. Not connected ເມນູສຳລັບຈັດການ ELF ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index 22dfdfe22..249833918 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Polish OPL %s @@ -184,6 +184,8 @@ Poziom Regulacja w poziomie Pion Regulacja w pionie +Overscan +Overscan Adjustment Pomiń FMV Pomija scenki wideo Ustawienia cheat'ów @@ -224,11 +226,11 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: +USB bluetooth adapter MAC address: +DS3 Controller paired to MAC address: Pair Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. +Pair DS3 controller with bluetooth adapter MAC address. Not connected ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 8973792b1..d10fbb361 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Portuguese OPL %s @@ -184,6 +184,8 @@ Ajuste horizontal Definir compensação horizontal Ajuste vertical Definir compensação vertical +Overscan +Overscan Adjustment Saltar FMV Saltar vídeos Opções de Cheat diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 493f9b097..84c4c13a3 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 01/26/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Brazilian Portuguese OPL %s @@ -184,6 +184,8 @@ Posição Horizontal Ajuste Horizontal Posição Vertical Ajuste Vertical +Tela visível +Define o ajuste da tela visível Pular FMV Pula os vídeos do jogo Opções de Cheats (trapaças) diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 9cb4ff405..4c63c4e1d 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Russian OPL %s @@ -184,6 +184,8 @@ ID игры Горизонтальное положение Отступить вверх или вниз Вертикальное положение +Вылет развёртки +Регулировать вылет развёртки Пропуск FMV Пропускать Full Motion видео Настройка читов diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 4ee0268ec..7c0fce98a 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Spanish OPL %s @@ -184,6 +184,8 @@ Ajuste horizontal Configura la posición horizontal de la pantalla Ajuste vertical Configura la posición vertical de la pantalla +Overscan +Ajustes de Overscan Omitir vídeos FMV Omite escenas Full Motion Vídeos Configuración PS2RD diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index b5d5e8494..dfe8e44f4 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Swedish OPL %s @@ -184,6 +184,8 @@ Horisontell position Ställer Horisontell offset Vertikal position Ställer Vertikal förskjutning +Överskanning +Överskanning justering Skippa FMV Skippar Full Motion Video Inställningar Fusk diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese.lng index 120bddce7..a11363d8b 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese.lng @@ -1,6 +1,6 @@ # Translated by kane159 -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Traditional Chinese OPL %s @@ -184,6 +184,8 @@ H-POS 水平調整 V-POS 垂直調整 +Overscan +Overscan Adjustment 跳過 FMV 跳過全動態視頻 金手指設置 @@ -224,11 +226,11 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: +USB bluetooth adapter MAC address: +DS3 Controller paired to MAC address: Pair Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. +Pair DS3 controller with bluetooth adapter MAC address. Not connected ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index a2c133fa4..987bb2ab6 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante -# Last update: 01/25/2017 -# Updated for OPL_983_DB [7f7e9af] +# Last update: 08/10/2017 +# Updated for OPL_1019_DB [f57bf5c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 Turkish OPL %s @@ -184,6 +184,8 @@ Y-Konum Yatay Ayarlama D-Konum Dikey Ayarlama +Overscan +Overscan Adjustment FMV Atlama Full Motion Videoları atlar Hile Ayarları @@ -224,11 +226,11 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: +USB bluetooth adapter MAC address: +DS3 Controller paired to MAC address: Pair Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. +Pair DS3 controller with bluetooth adapter MAC address. Not connected ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file From 708b17ebaa23391c3b9e9d616f237ba346bdecb1 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 31 Aug 2017 14:31:27 -0700 Subject: [PATCH 065/269] Developer rickgaiser had done the following changes: theme: use real theme file for builtin theme Only change is the cover size is fixed to 140x200 So cover ART of any resolution can now be used. This will make sure the cover is always displayed the same size, even if a higher resolution texture is used. theme: fix warning messages and bg_overlay --- DETAILED_CHANGELOG | 1 + Makefile | 25 ++++++----- misc/conf_theme_OPL.cfg | 29 +++++++++++++ src/themes.c | 91 ++++++++++++++++++++--------------------- 4 files changed, 89 insertions(+), 57 deletions(-) create mode 100644 misc/conf_theme_OPL.cfg diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 13f5b9a4b..c440d6cd7 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1023 - Jay-Jay-OPL - update lang files - Thu Aug 24 17:30:59 2017 -0700 rev1022 - Jay-Jay-OPL - BMP support and bugfixes #64 by rickgaiser (Maximus32) (1) Apply settings also when video mode does not change When video mode was set to auto, some settings did not apply: - font not visible - x/y scaling - overscan - widescreen - Fri Aug 11 23:59:54 2017 -0700 rev1021 - Jay-Jay-OPL - remove: Add initial mode - experimental code - Wed Aug 9 22:17:55 2017 -0700 rev1020 - Jay-Jay-OPL - changes by rickgaiser (aka Maximus32) Fix font not visible when video mode set to auto Add initial hires mode - Wed Aug 9 20:39:02 2017 -0700 diff --git a/Makefile b/Makefile index 69a06d819..6ea5f7234 100755 --- a/Makefile +++ b/Makefile @@ -81,7 +81,7 @@ GFX_OBJS = usb_icon.o hdd_icon.o eth_icon.o app_icon.o elm_icon.o \ icon_sys.o icon_icn.o #END of OPL_DB tweaks -MISC_OBJS = icon_sys_A.o icon_sys_J.o +MISC_OBJS = icon_sys_A.o icon_sys_J.o conf_theme_OPL.o IOP_OBJS = iomanx.o filexio.o ps2fs.o usbd.o usbhdfsd.o usbhdfsdfsv.o \ ps2atad.o hdpro_atad.o poweroff.o ps2hdd.o xhdd.o genvmc.o hdldsvr.o \ @@ -104,7 +104,7 @@ EE_ASM_DIR = asm/ MAPFILE = opl.map EE_LDFLAGS += -Wl,-Map,$(MAPFILE) - + EE_LIBS = -L$(PS2SDK)/ports/lib -L$(GSKIT)/lib -L./lib -lgskit -ldmakit -lgskit_toolkit -lpoweroff -lfileXio -lpatches -ljpeg -lpng -lz -ldebug -lm -lmc -lfreetype -lvux -lcdvd -lnetman -lps2ips EE_INCS += -I$(PS2SDK)/ports/include -I$(GSKIT)/include -I$(GSKIT)/ee/dma/include -I$(GSKIT)/ee/gs/include -I$(GSKIT)/ee/toolkit/include -Imodules/iopcore/common -Imodules/network/common -Imodules/hdd/common -Iinclude @@ -113,10 +113,10 @@ BIN2S = $(PS2SDK)/bin/bin2s BIN2O = $(PS2SDK)/bin/bin2o # WARNING: Only extra spaces are allowed and ignored at the beginning of the conditional directives (ifeq, ifneq, ifdef, ifndef, else and endif) -# but a tab is not allowed; if the line begins with a tab, it will be considered part of a recipe for a rule! +# but a tab is not allowed; if the line begins with a tab, it will be considered part of a recipe for a rule! ifeq ($(VMC),1) - IOP_OBJS += usb_mcemu.o hdd_mcemu.o smb_mcemu.o + IOP_OBJS += usb_mcemu.o hdd_mcemu.o smb_mcemu.o EE_CFLAGS += -DVMC VMC_FLAGS = VMC=1 else @@ -163,7 +163,7 @@ else IGS_FLAGS = IGS=0 endif ifeq ($(CHEAT),1) - FRONTEND_OBJS += cheatman.o + FRONTEND_OBJS += cheatman.o EE_CFLAGS += -DCHEAT CHEAT_FLAGS = CHEAT=1 else @@ -180,7 +180,7 @@ else PADEMU_FLAGS = PADEMU=0 endif -ifeq ($(DEBUG),1) +ifeq ($(DEBUG),1) EE_CFLAGS += -D__DEBUG -g EE_OBJS += debug.o udptty.o ioptrap.o ps2link.o MOD_DEBUG_FLAGS = DEBUG=1 @@ -189,7 +189,7 @@ ifeq ($(DEBUG),1) EECORE_EXTRA_FLAGS = LOAD_DEBUG_MODULES=1 CDVDMAN_DEBUG_FLAGS = IOPCORE_DEBUG=1 MCEMU_DEBUG_FLAGS = IOPCORE_DEBUG=1 - SMSTCPIP_INGAME_CFLAGS = + SMSTCPIP_INGAME_CFLAGS = IOP_OBJS += udptty-ingame.o else ifeq ($(EESIO_DEBUG),1) EE_CFLAGS += -D__EESIO_DEBUG @@ -198,7 +198,7 @@ ifeq ($(DEBUG),1) EE_CFLAGS += -D__INGAME_DEBUG EECORE_EXTRA_FLAGS = LOAD_DEBUG_MODULES=1 CDVDMAN_DEBUG_FLAGS = USE_DEV9=1 - SMSTCPIP_INGAME_CFLAGS = + SMSTCPIP_INGAME_CFLAGS = ifeq ($(DECI2_DEBUG),1) EE_CFLAGS += -D__DECI2_DEBUG EECORE_EXTRA_FLAGS += DECI2_DEBUG=1 @@ -234,7 +234,7 @@ release: echo "Building Open PS2 Loader $(OPL_VERSION)..." echo "-Interface" $(MAKE) VMC=1 GSM=1 IGS=1 PADEMU=1 CHEAT=1 $(EE_VPKD).ZIP - + childproof: $(MAKE) CHILDPROOF=1 all @@ -743,9 +743,9 @@ $(EE_ASM_DIR)freesans.s: thirdparty/FreeSans_basic_latin.ttf | $(EE_ASM_DIR) $(EE_ASM_DIR)icon_sys.s: gfx/icon.sys | $(EE_ASM_DIR) $(BIN2S) $< $@ icon_sys - + $(EE_ASM_DIR)icon_icn.s: gfx/opl.icn | $(EE_ASM_DIR) - $(BIN2S) $< $@ icon_icn + $(BIN2S) $< $@ icon_icn $(EE_ASM_DIR)icon_sys_A.s: misc/icon_A.sys | $(EE_ASM_DIR) $(BIN2S) $< $@ icon_sys_A @@ -753,6 +753,9 @@ $(EE_ASM_DIR)icon_sys_A.s: misc/icon_A.sys | $(EE_ASM_DIR) $(EE_ASM_DIR)icon_sys_J.s: misc/icon_J.sys | $(EE_ASM_DIR) $(BIN2S) $< $@ icon_sys_J +$(EE_ASM_DIR)conf_theme_OPL.s: misc/conf_theme_OPL.cfg | $(EE_ASM_DIR) + $(BIN2S) $< $@ conf_theme_OPL_cfg + $(EE_ASM_DIR)IOPRP_img.s: modules/iopcore/IOPRP.img | $(EE_ASM_DIR) $(BIN2S) $< $@ IOPRP_img diff --git a/misc/conf_theme_OPL.cfg b/misc/conf_theme_OPL.cfg new file mode 100644 index 000000000..3f270fd38 --- /dev/null +++ b/misc/conf_theme_OPL.cfg @@ -0,0 +1,29 @@ +main0: + type=Background + pattern=BG +main1: + type=StaticImage + default=bg_overlay + aligned=0 + scaled=0 + width=DIM_INF + height=DIM_INF +main2: + type=MenuIcon +main3: + type=MenuText +main4: + type=ItemsList +main5: + type=ItemIcon +main6: +# DVD cover size: 129x184mm + type=ItemCover + width=140 + height=200 +main7: + type=ItemText +main8: + type=HintText +main9: + type=LoadingIcon diff --git a/src/themes.c b/src/themes.c index 624a7f419..0c3cf742e 100644 --- a/src/themes.c +++ b/src/themes.c @@ -13,6 +13,9 @@ #define HINT_HEIGHT 32 #define DECORATOR_SIZE 20 +extern const char conf_theme_OPL_cfg; +extern u16 size_conf_theme_OPL_cfg; + theme_t *gTheme; static int screenWidth; @@ -406,11 +409,19 @@ static mutable_image_t *initMutableImage(const char *themePath, config_set_t *th mutableImage->cache = cacheInitCache(theme->gameCacheCount++, "ART", 1, cachePattern, cacheCount); } + if (themePath != NULL) { + if (defaultTexture && !mutableImage->defaultTexture) + mutableImage->defaultTexture = initImageTexture(themePath, themeConfig, name, defaultTexture, 0); + + if (overlayTexture && !mutableImage->overlayTexture) + mutableImage->overlayTexture = initImageTexture(themePath, themeConfig, name, overlayTexture, 1); + } + if (defaultTexture && !mutableImage->defaultTexture) - mutableImage->defaultTexture = initImageTexture(themePath, themeConfig, name, defaultTexture, 0); + mutableImage->defaultTexture = initImageInternalTexture(themeConfig, defaultTexture); if (overlayTexture && !mutableImage->overlayTexture) - mutableImage->overlayTexture = initImageTexture(themePath, themeConfig, name, overlayTexture, 1); + mutableImage->overlayTexture = initImageInternalTexture(themeConfig, overlayTexture); if (!mutableImage->defaultTexture && !mutableImage->overlayTexture) mutableImage->defaultTexture = initImageInternalTexture(themeConfig, name); @@ -1064,6 +1075,7 @@ static void thmLoadFonts(config_set_t *themeConfig, const char *themePath, theme static void thmLoad(const char *themePath) { LOG("THEMES Load theme path=%s\n", themePath); + char path[256]; theme_t *curT = gTheme; theme_t *newT = (theme_t *)malloc(sizeof(theme_t)); memset(newT, 0, sizeof(theme_t)); @@ -1084,60 +1096,48 @@ static void thmLoad(const char *themePath) if (!themePath) { //No theme specified. Prepare and load the default theme. themeConfig = configAlloc(0, NULL, NULL); - configSetInt(themeConfig, "bg_overlay_aligned", ALIGN_NONE); - configSetInt(themeConfig, "bg_overlay_scaled", SCALING_NONE); - configSetStr(themeConfig, "bg_overlay_width", "DIM_INF"); - configSetStr(themeConfig, "bg_overlay_height", "DIM_INF"); - addGUIElem(themePath, themeConfig, newT, &newT->mainElems, elementsType[ELEM_TYPE_STATIC_IMAGE], "bg_overlay"); - addGUIElem(themePath, themeConfig, newT, &newT->mainElems, elementsType[ELEM_TYPE_MENU_ICON], "category_icon"); - addGUIElem(themePath, themeConfig, newT, &newT->mainElems, elementsType[ELEM_TYPE_MENU_TEXT], "category_label"); - addGUIElem(themePath, themeConfig, newT, &newT->mainElems, elementsType[ELEM_TYPE_ITEMS_LIST], "game_list"); - addGUIElem(themePath, themeConfig, newT, &newT->mainElems, elementsType[ELEM_TYPE_ITEM_ICON], "disc_icon"); - addGUIElem(themePath, themeConfig, newT, &newT->mainElems, elementsType[ELEM_TYPE_ITEM_COVER], "game_cover"); - addGUIElem(themePath, themeConfig, newT, &newT->mainElems, elementsType[ELEM_TYPE_ITEM_TEXT], "game_id"); - addGUIElem(themePath, themeConfig, newT, &newT->mainElems, elementsType[ELEM_TYPE_HINT_TEXT], "hint_text"); - addGUIElem(themePath, themeConfig, newT, &newT->mainElems, elementsType[ELEM_TYPE_LOADING_ICON], "loading_icon"); + configReadBuffer(themeConfig, &conf_theme_OPL_cfg, size_conf_theme_OPL_cfg); } else { - char path[256]; snprintf(path, sizeof(path), "%sconf_theme.cfg", themePath); themeConfig = configAlloc(0, NULL, path); configRead(themeConfig); // try to load the theme config file + } - int intValue; - if (configGetInt(themeConfig, "use_default", &intValue)) - newT->useDefault = intValue; + int intValue; + if (configGetInt(themeConfig, "use_default", &intValue)) + newT->useDefault = intValue; - if (configGetInt(themeConfig, "use_real_height", &intValue)) { - if (intValue) - newT->usedHeight = screenHeight; - } + if (configGetInt(themeConfig, "use_real_height", &intValue)) { + if (intValue) + newT->usedHeight = screenHeight; + } - configGetColor(themeConfig, "bg_color", newT->bgColor); + configGetColor(themeConfig, "bg_color", newT->bgColor); - unsigned char color[3]; - if (configGetColor(themeConfig, "text_color", color)) - newT->textColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0x80); + unsigned char color[3]; + if (configGetColor(themeConfig, "text_color", color)) + newT->textColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0x80); - if (configGetColor(themeConfig, "ui_text_color", color)) - newT->uiTextColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0x80); + if (configGetColor(themeConfig, "ui_text_color", color)) + newT->uiTextColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0x80); - if (configGetColor(themeConfig, "sel_text_color", color)) - newT->selTextColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0x80); + if (configGetColor(themeConfig, "sel_text_color", color)) + newT->selTextColor = GS_SETREG_RGBA(color[0], color[1], color[2], 0x80); - // before loading the element definitions, we have to have the fonts prepared - // for that, we load the fonts and a translation table + // before loading the element definitions, we have to have the fonts prepared + // for that, we load the fonts and a translation table + if (themePath) thmLoadFonts(themeConfig, themePath, newT); - int i = 1; - snprintf(path, sizeof(path), "main0"); - while (addGUIElem(themePath, themeConfig, newT, &newT->mainElems, NULL, path)) - snprintf(path, sizeof(path), "main%d", i++); + int i = 1; + snprintf(path, sizeof(path), "main0"); + while (addGUIElem(themePath, themeConfig, newT, &newT->mainElems, NULL, path)) + snprintf(path, sizeof(path), "main%d", i++); - i = 1; - snprintf(path, sizeof(path), "info0"); - while (addGUIElem(themePath, themeConfig, newT, &newT->infoElems, NULL, path)) - snprintf(path, sizeof(path), "info%d", i++); - } + i = 1; + snprintf(path, sizeof(path), "info0"); + while (addGUIElem(themePath, themeConfig, newT, &newT->infoElems, NULL, path)) + snprintf(path, sizeof(path), "info%d", i++); validateGUIElems(themePath, themeConfig, newT); configFree(themeConfig); @@ -1145,7 +1145,6 @@ static void thmLoad(const char *themePath) LOG("THEMES Number of cache: %d\n", newT->gameCacheCount); LOG("THEMES Used height: %d\n", newT->usedHeight); - int i; // default all to not loaded... for (i = 0; i < TEXTURES_COUNT; i++) { newT->textures[i].Mem = NULL; @@ -1158,16 +1157,16 @@ static void thmLoad(const char *themePath) thmFree(curT); // First start with busy icon - const char *path = themePath; + const char *themePath_temp = themePath; int customBusy = 0; for (i = LOAD0_ICON; i <= LOAD7_ICON; i++) { - if (thmLoadResource(i, path, GS_PSM_CT32, gTheme->useDefault) >= 0) + if (thmLoadResource(i, themePath_temp, GS_PSM_CT32, gTheme->useDefault) >= 0) customBusy = 1; else { if (customBusy) break; else - path = NULL; + themePath_temp = NULL; } } gTheme->loadingIconCount = i; From 1def2cde391690a994d98a056fbf09c855b7a4cb Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 3 Sep 2017 18:26:56 -0700 Subject: [PATCH 066/269] SP193 did the following changes: - Partial roll back & rework of c1470b2 for maintainability: removed old hack for preventing the thread patch from being included, in favour of the new libkernel-nopatch library. - Fixed partition creation of +OPL: added PFS filesystem setting, changed open flags to WRONLY and removed unused mode parameter. --- DETAILED_CHANGELOG | 1 + ee_core/Makefile | 9 +-- ee_core/include/syscallnr_custom.h | 9 --- ee_core/src/kernel_custom.S | 91 ------------------------------ ee_core/src/main.c | 4 +- ee_core/src/padhook.c | 12 ++-- ee_core/src/syshook.c | 2 +- elfldr/Makefile | 8 +-- elfldr/elfldr.c | 4 +- elfldr/kernel_custom.S | 91 ------------------------------ elfldr/syscallnr_custom.h | 9 --- src/hddsupport.c | 4 +- 12 files changed, 18 insertions(+), 226 deletions(-) delete mode 100644 ee_core/include/syscallnr_custom.h delete mode 100644 ee_core/src/kernel_custom.S delete mode 100644 elfldr/kernel_custom.S delete mode 100644 elfldr/syscallnr_custom.h diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index c440d6cd7..d3ef49852 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1024 - Jay-Jay-OPL - Developer rickgaiser had done the following changes: theme: use real theme file for builtin theme - Thu Aug 31 14:31:27 2017 -0700 rev1023 - Jay-Jay-OPL - update lang files - Thu Aug 24 17:30:59 2017 -0700 rev1022 - Jay-Jay-OPL - BMP support and bugfixes #64 by rickgaiser (Maximus32) (1) Apply settings also when video mode does not change When video mode was set to auto, some settings did not apply: - font not visible - x/y scaling - overscan - widescreen - Fri Aug 11 23:59:54 2017 -0700 rev1021 - Jay-Jay-OPL - remove: Add initial mode - experimental code - Wed Aug 9 22:17:55 2017 -0700 diff --git a/ee_core/Makefile b/ee_core/Makefile index a4210c206..a5fbd4126 100755 --- a/ee_core/Makefile +++ b/ee_core/Makefile @@ -16,10 +16,9 @@ EE_OBJS_DIR = obj/ GSMCORE_EE_OBJS = gsm_engine.o gsm_api.o IGSCORE_EE_OBJS = igs_api.o CHEATCORE_EE_OBJS = cheat_engine.o cheat_api.o -KERNEL_OBJS = iWakeupThread.o #iWakeupThread is used by SIFRPC. This prevents the thread patch from libkernel from being linked to. EE_OBJS = main.o syshook.o iopmgr.o modmgr.o util.o patches.o patches_asm.o \ - padhook.o spu.o tlb.o asm.o crt0.o $(KERNEL_OBJS) + padhook.o spu.o tlb.o asm.o crt0.o MAPFILE = ee_core.map EE_INCS := -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -Iinclude -I. @@ -77,7 +76,7 @@ ifeq ($(EESIO_DEBUG),1) EE_LIBS += -lc endif -EE_LIBS += -lkernel +EE_LIBS += -lkernel-nopatch $(EE_OBJS_DIR)%.o : $(EE_SRC_DIR)%.c @mkdir -p $(EE_OBJS_DIR) @@ -103,8 +102,4 @@ clean: clean_all: rm -f -r $(EE_OBJS_DIR) $(EE_BIN) $(MAPFILE) -$(KERNEL_OBJS:%=$(EE_OBJS_DIR)%): $(EE_SRC_DIR)kernel_custom.S - @mkdir -p $(EE_OBJS_DIR) - $(EE_CC) $(EE_CFLAGS) -DF_$(*:$(EE_OBJS_DIR)%=%) $< -c -o $@ - include $(PS2SDK)/samples/Makefile.pref diff --git a/ee_core/include/syscallnr_custom.h b/ee_core/include/syscallnr_custom.h deleted file mode 100644 index b136950df..000000000 --- a/ee_core/include/syscallnr_custom.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _SYSCALLNR_H_ -#define _SYSCALLNR_H_ - -/* - * This file contains the system call numbers, similar to asm/unistd.h on Linux. - */ -#define __NR_iWakeupThread (-0x34) - -#endif /* _SYSCALLNR_H_ */ diff --git a/ee_core/src/kernel_custom.S b/ee_core/src/kernel_custom.S deleted file mode 100644 index 00c7a9294..000000000 --- a/ee_core/src/kernel_custom.S +++ /dev/null @@ -1,91 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# (C)2001, Gustavo Scotti (gustavo@scotti.com) -# (c) 2003 Marcus R. Brown (mrbrown@0xd6.org) -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -*/ - -/** - * @file - * EE Kernel functions - */ - -#include "syscallnr_custom.h" - - .text - .p2align 3 - -#ifdef USE_KMODE -#define SYSCALL(name) \ - .set push; \ - .set noreorder; \ - .text; \ - .align 4; \ - .globl name; \ - .type name,@function; \ - .ent name,0; \ -name: j __syscall; \ - li $3, __NR_##name;\ - nop; \ - .end name; \ - .size name,.-name; \ - .set pop; -#else -#define SYSCALL(name) \ - .set push; \ - .set noreorder; \ - .text; \ - .align 4; \ - .globl name; \ - .type name,@function; \ - .ent name,0; \ -name: li $3, __NR_##name;\ - syscall; \ - jr $31; \ - nop; \ - .end name; \ - .size name,.-name; \ - .set pop; -#endif - -#ifdef F___syscall -.set push -.set noreorder -.text -.align 4 -.globl __syscall -.type __syscall,@function -.ent __syscall,0 -__syscall: - mfc0 $2, $12 - andi $2, $2, 0x18 - beqz $2, _kMode - slt $2, $3, $0 - syscall - jr $31 - nop -_kMode: - subu $26, $0, $3 - movn $3, $26, $2 - sll $3, $3, 2 - lui $26, 0x8000 - lhu $2, 0x02F0($26) - sll $2, $2, 16 - lh $26, 0x02F8($26) - add $2, $26 - addu $3, $2 - lw $26, 0x00($3) - jr $26 - nop -.end __syscall -.size __syscall,.-__syscall -.set pop -#endif - -#ifdef F_iWakeupThread -SYSCALL(iWakeupThread) -#endif diff --git a/ee_core/src/main.c b/ee_core/src/main.c index faa036d40..fb508520b 100644 --- a/ee_core/src/main.c +++ b/ee_core/src/main.c @@ -154,9 +154,9 @@ int main(int argc, char **argv) char *argvs[1]; argvs[0] = ElfPath; argvs[1] = NULL; - _LoadExecPS2("rom0:PS2LOGO", 1, argvs); + LoadExecPS2("rom0:PS2LOGO", 1, argvs); } else { - _LoadExecPS2(ElfPath, 0, NULL); + LoadExecPS2(ElfPath, 0, NULL); } if (!DisableDebug) diff --git a/ee_core/src/padhook.c b/ee_core/src/padhook.c index 59ad264c7..15f83387f 100644 --- a/ee_core/src/padhook.c +++ b/ee_core/src/padhook.c @@ -134,7 +134,7 @@ static void t_loadElf(void) GS_BGCOLOUR = 0x0080FF; // Orange // Execute BOOT.ELF - _ExecPS2((void *)elf.epc, (void *)elf.gp, 1, argv); + ExecPS2((void *)elf.epc, (void *)elf.gp, 1, argv); } if (!DisableDebug) { @@ -143,7 +143,7 @@ static void t_loadElf(void) } // Return to PS2 Browser - _Exit(0); + Exit(0); } // Poweroff PlayStation 2 @@ -273,10 +273,10 @@ static void IGR_Thread(void *arg) // Execute home loader if (ExitPath[0] != '\0') - _ExecPS2(t_loadElf, &_gp, 0, NULL); + ExecPS2(t_loadElf, &_gp, 0, NULL); // Return to PS2 Browser - _Exit(0); + Exit(0); } // If combo is R3 + L3 or Reset failed, Poweroff PS2 @@ -370,7 +370,7 @@ static int IGR_Intc_Handler(int cause) for (i = 1; i < 256; i++) { if (i != IGR_Thread_ID) { // Suspend all threads - _iSuspendThread(i); + iSuspendThread(i); iChangeThreadPriority(i, 127); } } @@ -378,7 +378,7 @@ static int IGR_Intc_Handler(int cause) DPRINTF("IGR: trying to wake IGR thread...\n"); iChangeThreadPriority(IGR_Thread_ID, 0); // WakeUp IGR thread - _iWakeupThread(IGR_Thread_ID); + iWakeupThread(IGR_Thread_ID); } ExitHandler(); diff --git a/ee_core/src/syshook.c b/ee_core/src/syshook.c index 650df5e1a..26ec0e1ca 100644 --- a/ee_core/src/syshook.c +++ b/ee_core/src/syshook.c @@ -133,7 +133,7 @@ void t_loadElf(void) disable_padOpen_hook = 0; DPRINTF("t_loadElf: executing...\n"); - _ExecPS2((void *)elf.epc, (void *)elf.gp, g_argc, g_argv); + ExecPS2((void *)elf.epc, (void *)elf.gp, g_argc, g_argv); } DPRINTF(" failed\n"); diff --git a/elfldr/Makefile b/elfldr/Makefile index 342320a48..c1f2c00d4 100755 --- a/elfldr/Makefile +++ b/elfldr/Makefile @@ -1,12 +1,11 @@ EE_BIN = elfldr.elf -KERNEL_OBJS = iWakeupThread.o #iWakeupThread is used by SIFRPC. This prevents the thread patch from libkernel from being linked to. -EE_OBJS = elfldr.o crt0.o $(KERNEL_OBJS) +EE_OBJS = elfldr.o crt0.o EE_INCS := -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -I. EE_CFLAGS := -D_EE -O2 -mgpopt -G8192 -Wall $(EE_INCS) EE_LDFLAGS = -nostartfiles -Tlinkfile -L$(PS2SDK)/ee/lib -s -EE_LIBS += -lkernel +EE_LIBS += -lkernel-nopatch %.o : %.c $(EE_CC) $(EE_CFLAGS) $(EE_INCS) -c $< -o $@ @@ -22,7 +21,4 @@ all: $(EE_BIN) clean: rm -f $(EE_BIN) $(EE_OBJS) elfldr.map -$(KERNEL_OBJS:%=$(EE_OBJS_DIR)%): $(EE_SRC_DIR)kernel_custom.S - $(EE_CC) $(EE_CFLAGS) -DF_$(*:$(EE_OBJS_DIR)%=%) $< -c -o $@ - include $(PS2SDK)/samples/Makefile.pref diff --git a/elfldr/elfldr.c b/elfldr/elfldr.c index 332753853..95c7c6334 100644 --- a/elfldr/elfldr.c +++ b/elfldr/elfldr.c @@ -46,7 +46,7 @@ static inline void BootError(char *filename) argv[0] = "BootError"; argv[1] = filename; - _ExecOSD(2, argv); + ExecOSD(2, argv); } static inline void InitializeUserMemory(unsigned int start, unsigned int end) @@ -109,7 +109,7 @@ int main(int argc, char *argv[]) argv[0] = _argv; } - _ExecPS2((void *)exd.epc, (void *)exd.gp, argc, argv); + ExecPS2((void *)exd.epc, (void *)exd.gp, argc, argv); } else { SifExitRpc(); } diff --git a/elfldr/kernel_custom.S b/elfldr/kernel_custom.S deleted file mode 100644 index 00c7a9294..000000000 --- a/elfldr/kernel_custom.S +++ /dev/null @@ -1,91 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# (C)2001, Gustavo Scotti (gustavo@scotti.com) -# (c) 2003 Marcus R. Brown (mrbrown@0xd6.org) -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -*/ - -/** - * @file - * EE Kernel functions - */ - -#include "syscallnr_custom.h" - - .text - .p2align 3 - -#ifdef USE_KMODE -#define SYSCALL(name) \ - .set push; \ - .set noreorder; \ - .text; \ - .align 4; \ - .globl name; \ - .type name,@function; \ - .ent name,0; \ -name: j __syscall; \ - li $3, __NR_##name;\ - nop; \ - .end name; \ - .size name,.-name; \ - .set pop; -#else -#define SYSCALL(name) \ - .set push; \ - .set noreorder; \ - .text; \ - .align 4; \ - .globl name; \ - .type name,@function; \ - .ent name,0; \ -name: li $3, __NR_##name;\ - syscall; \ - jr $31; \ - nop; \ - .end name; \ - .size name,.-name; \ - .set pop; -#endif - -#ifdef F___syscall -.set push -.set noreorder -.text -.align 4 -.globl __syscall -.type __syscall,@function -.ent __syscall,0 -__syscall: - mfc0 $2, $12 - andi $2, $2, 0x18 - beqz $2, _kMode - slt $2, $3, $0 - syscall - jr $31 - nop -_kMode: - subu $26, $0, $3 - movn $3, $26, $2 - sll $3, $3, 2 - lui $26, 0x8000 - lhu $2, 0x02F0($26) - sll $2, $2, 16 - lh $26, 0x02F8($26) - add $2, $26 - addu $3, $2 - lw $26, 0x00($3) - jr $26 - nop -.end __syscall -.size __syscall,.-__syscall -.set pop -#endif - -#ifdef F_iWakeupThread -SYSCALL(iWakeupThread) -#endif diff --git a/elfldr/syscallnr_custom.h b/elfldr/syscallnr_custom.h deleted file mode 100644 index b136950df..000000000 --- a/elfldr/syscallnr_custom.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _SYSCALLNR_H_ -#define _SYSCALLNR_H_ - -/* - * This file contains the system call numbers, similar to asm/unistd.h on Linux. - */ -#define __NR_iWakeupThread (-0x34) - -#endif /* _SYSCALLNR_H_ */ diff --git a/src/hddsupport.c b/src/hddsupport.c index c7f9caad7..8f5424136 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -123,8 +123,8 @@ static int CreateOPLPartition(const char *oplPart, const char *mountpoint) int fd, result; char cmd[43]; - sprintf(cmd, "%s,,,128M", oplPart); - if ((fd = fileXioOpen(cmd, O_CREAT | O_TRUNC | O_RDWR, 0644)) >= 0) { + sprintf(cmd, "%s,,,128M,PFS", oplPart); + if ((fd = fileXioOpen(cmd, O_CREAT | O_TRUNC | O_WRONLY)) >= 0) { fileXioClose(fd); result = fileXioFormat(mountpoint, oplPart, (const char *)&formatArg, sizeof(formatArg)); } else { From d488f105d9127ce103f4084f848395f0d09f4984 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 7 Sep 2017 14:50:41 -0700 Subject: [PATCH 067/269] rickgaiser did the following changes: - Fix loading PNG files with palette. --- DETAILED_CHANGELOG | 1 + gfx/load0.png | Bin 843 -> 1854 bytes gfx/load1.png | Bin 139 -> 1022 bytes gfx/load2.png | Bin 843 -> 1854 bytes gfx/load3.png | Bin 139 -> 1022 bytes gfx/load4.png | Bin 843 -> 1854 bytes gfx/load5.png | Bin 139 -> 1022 bytes gfx/load6.png | Bin 843 -> 1854 bytes gfx/load7.png | Bin 139 -> 1022 bytes src/textures.c | 27 ++++++++++++++------------- 10 files changed, 15 insertions(+), 13 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index d3ef49852..e38d2181c 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1025 - Jay-Jay-OPL - SP193 did the following changes: - Partial roll back & rework of c1470b2 for maintainability: removed old hack for preventing the thread patch from being included, in favour of the new libkernel-nopatch library. - Fixed partition creation of +OPL: added PFS filesystem setting, changed open flags to WRONLY and removed unused mode parameter. - Sun Sep 3 18:26:56 2017 -0700 rev1024 - Jay-Jay-OPL - Developer rickgaiser had done the following changes: theme: use real theme file for builtin theme - Thu Aug 31 14:31:27 2017 -0700 rev1023 - Jay-Jay-OPL - update lang files - Thu Aug 24 17:30:59 2017 -0700 rev1022 - Jay-Jay-OPL - BMP support and bugfixes #64 by rickgaiser (Maximus32) (1) Apply settings also when video mode does not change When video mode was set to auto, some settings did not apply: - font not visible - x/y scaling - overscan - widescreen - Fri Aug 11 23:59:54 2017 -0700 diff --git a/gfx/load0.png b/gfx/load0.png index 09fa3515d5d5c3994f2e74b09c18e76448d67ded..7b4009e03444c4ea16ee7e1be4f84640e9ffd8f5 100644 GIT binary patch literal 1854 zcmbVNc~BE~6b=(WMe(YDT(X9ah*PrJkOZ<#z>ow8_k=@Q)Vd@~5<;>eyFdhMK}73; zqT;9pL~%wf2uc-EKuQtNdXE``&xM_hz?5 zMFiQ}IN4Ar6kAEKNJ@@?`I&A_zVXb=SLEPGh~tT9EQ!cK^e9Cj#}ZLMqCpg>6h-7~ zQ-4Nz6bdy-6%$Xyhljy3OhZS^HgtnVN1`bdp1(nd$kZqSB%%tHmQQ<8|04}h$@#Pu z>~Kc7PKYX1!I^qAIx`|hmZ_F;=i_PIcp8-q;!~_}S&GCX*Fq;E2eSpb}Myl!M zNw8EDIH^Uh_%tO!=wJ}c$jG2)c+)Yx0))6+u9<_$^dc?1@U>b3F?eZl_bCPuip%sW z9ihUsfSD0V#L@^pjr8PHlNDyN%Hnf}6*Hc|C4Zh?TA?NAsV!ERvejp)yG)EG$ z@t2ULTTACI_8-e{28Xr{IUHJ$pppA4y`2-QWcynmh|idAoW*$^4H15onnnfwx-zI| z?9IB4j**_%Z!>oVf7_2<6Pwp|n^S^!zx+)5`dl>Q+h8>_%=zGw@60(mj z*gC8fR5JB$wF7?LC*mFcI%Q?o+Z@R%a~~Q}F87>`Y`n?&=4FvZQVKaEaEqt*pRcKjjciJ+=3~0h|T%m^&rQV1m893V+AjvIYqb1fsob><;_0+7V!_+ z!q!&lwHD1f>BSilz|5#`_tc#$Ilb_7^-7~%lZQPd@wbE@LVjHKD)XeNT z9KT9uVXC=byL5Wd`1z#)uF@D+)H5r(2AxJw_u6zHe0n*g;wn>T$BxL)aM)IN4?A$K zY7E?7kSxmjY8%fb$o_Wqyq>7+Ipb8aJ@?!u9~=00 z`9Rqx%WckfRjfDV%y&8MJXGxA?o51sDk2w@Q0d3p=NS96U3KFMXspg7<)9zqQtYDIY78+{h6m*;{0N5y7F#FqL&<1qu1K=wq+$OzVHpN*!o^?5-Q&z zb@94b_AGdFcLUm$FD*WjSANrY>*Xks;^2I;h8DVNPuYt{u~cK8Ti5q~CZp#Y>&||v ngc)P8@oq=S6;aqF(88LMuijle;UcI delta 819 zcmV-31I+xs4$B51iBL{Q4GJ0x0000DNk~Le0000V0000V2nGNE03WUvIgueJe**1E zL_t(|+QipQNR&Yw$MJnucV*G)R+J&VDH(L>q)-t>px_~)7ph}HM5m~W2Mh7ky-N}n zcBq3?hD8YxK?vCk78OY^hs18GwZmn z8_1&6U>TlbBv7DIoMpXwG+_X*fA9p4bv^2L@Dz%$236RHDSXy!T*IAQg9o#$=OB$) zOlY)WRO2A7qYIUO1$V6L5_F;sb zcXJ=qB2viU!Qb430VUyD-z`Cz-y=`zI+UTFTj(|S22WYRT`Tw`rvFuNe|y?ZB11~R zm*9?P+Dr6ZkrKJ@$D@{M&4aow*5?hh7kYd3mbCSG04p(!*V*1|iwSP8`GDkH@?G<^ z6+G_}T*S1`{jcDzweG$jCcMRrx&p15ezWG!^==<5RPbW$)tQQUdF;~hDxi0LRByR^ zdfwmV6WkmU8g*i6(~cFif2O=lTWG!N)L}hVqg?NH^XT=X2M_SlyHt*KfLx(Qd$2{* zcop5)s1A}6(kL%$WBH~wd$C&y1g&R&Oy@l_BRBD8ei*J>iqrUrq&r_On4~rPLvl)#ft^h;Ivc~E#fLF^+aK zOZKQ5a915Al*Fi#Fv)bG5h1J1CN!bf8d0x)TZ$uiq3^#c==O#7fedR~hg+CXrZHKV z88eDgsP?qmjB{H5f3tY6pdWAsRo+<6AO0@w#0lNK5giUwdVhy?cJI@p6xExpR*zpP z9^sRx`Z8Y{?@mXHW4!mTd`K7OKMbR xC+o#Se9HRum_u;8gf#tW?R0r{@?k&PDHLkV1icuk?8;c diff --git a/gfx/load1.png b/gfx/load1.png index 8ae9f6831a9c714ee036189d438334a9763bbba9..133bc457c082bb10c86fe416971d702df0c74251 100644 GIT binary patch literal 1022 zcmbVLJ#W)M7&fYeN~MY!rjyH1Bx3uV*r~0U)*lJAL_(BCYR0~4?f*t%>g?gLpBR266}Z^BjCru2=!19oj(198iKGk#Qgyqv>%%xiKU>x zNO_!cwjeZi^E3!2h=F4?!ign*fB!)QII_e;t*x|E7me}$oT7tyrytHIp%IC@4?!b0 zxj>9q0P=X6WM*!O3tf}1i(^>?3kaK7;?k)>y9-=G5zwS+B~%~;x-P+*rt9zlP!*`k z3V-wpteKi_s&%j$BDY4Pq1p3VD_eYLiDSl6QQ zyKyBt>z}4b?xBpF(2(E9aH}Nq++A;|0CI24ClvEb38o$iPhylX-?K#iM~ZM{dWvl~ z9apRE7}aJS!X3?N*|4VTbz7@9l~$>76<2L(&~>41RBJYb&AMaPZ4Ww7b!v|0wv3YN zCm9Qp5S4Z@x4YtM*K$plqJRERLtq~$@FgAGKk6SJJCsP4?5>*?YcQgQ3eSwlt! z1`cM0t@Y0`N{h|pBGW(dVHATbXfF>|_y85}Sb4q9e E00eL#F#rGn diff --git a/gfx/load2.png b/gfx/load2.png index 09fa3515d5d5c3994f2e74b09c18e76448d67ded..7b4009e03444c4ea16ee7e1be4f84640e9ffd8f5 100644 GIT binary patch literal 1854 zcmbVNc~BE~6b=(WMe(YDT(X9ah*PrJkOZ<#z>ow8_k=@Q)Vd@~5<;>eyFdhMK}73; zqT;9pL~%wf2uc-EKuQtNdXE``&xM_hz?5 zMFiQ}IN4Ar6kAEKNJ@@?`I&A_zVXb=SLEPGh~tT9EQ!cK^e9Cj#}ZLMqCpg>6h-7~ zQ-4Nz6bdy-6%$Xyhljy3OhZS^HgtnVN1`bdp1(nd$kZqSB%%tHmQQ<8|04}h$@#Pu z>~Kc7PKYX1!I^qAIx`|hmZ_F;=i_PIcp8-q;!~_}S&GCX*Fq;E2eSpb}Myl!M zNw8EDIH^Uh_%tO!=wJ}c$jG2)c+)Yx0))6+u9<_$^dc?1@U>b3F?eZl_bCPuip%sW z9ihUsfSD0V#L@^pjr8PHlNDyN%Hnf}6*Hc|C4Zh?TA?NAsV!ERvejp)yG)EG$ z@t2ULTTACI_8-e{28Xr{IUHJ$pppA4y`2-QWcynmh|idAoW*$^4H15onnnfwx-zI| z?9IB4j**_%Z!>oVf7_2<6Pwp|n^S^!zx+)5`dl>Q+h8>_%=zGw@60(mj z*gC8fR5JB$wF7?LC*mFcI%Q?o+Z@R%a~~Q}F87>`Y`n?&=4FvZQVKaEaEqt*pRcKjjciJ+=3~0h|T%m^&rQV1m893V+AjvIYqb1fsob><;_0+7V!_+ z!q!&lwHD1f>BSilz|5#`_tc#$Ilb_7^-7~%lZQPd@wbE@LVjHKD)XeNT z9KT9uVXC=byL5Wd`1z#)uF@D+)H5r(2AxJw_u6zHe0n*g;wn>T$BxL)aM)IN4?A$K zY7E?7kSxmjY8%fb$o_Wqyq>7+Ipb8aJ@?!u9~=00 z`9Rqx%WckfRjfDV%y&8MJXGxA?o51sDk2w@Q0d3p=NS96U3KFMXspg7<)9zqQtYDIY78+{h6m*;{0N5y7F#FqL&<1qu1K=wq+$OzVHpN*!o^?5-Q&z zb@94b_AGdFcLUm$FD*WjSANrY>*Xks;^2I;h8DVNPuYt{u~cK8Ti5q~CZp#Y>&||v ngc)P8@oq=S6;aqF(88LMuijle;UcI delta 819 zcmV-31I+xs4$B51iBL{Q4GJ0x0000DNk~Le0000V0000V2nGNE03WUvIgueJe**1E zL_t(|+QipQNR&Yw$MJnucV*G)R+J&VDH(L>q)-t>px_~)7ph}HM5m~W2Mh7ky-N}n zcBq3?hD8YxK?vCk78OY^hs18GwZmn z8_1&6U>TlbBv7DIoMpXwG+_X*fA9p4bv^2L@Dz%$236RHDSXy!T*IAQg9o#$=OB$) zOlY)WRO2A7qYIUO1$V6L5_F;sb zcXJ=qB2viU!Qb430VUyD-z`Cz-y=`zI+UTFTj(|S22WYRT`Tw`rvFuNe|y?ZB11~R zm*9?P+Dr6ZkrKJ@$D@{M&4aow*5?hh7kYd3mbCSG04p(!*V*1|iwSP8`GDkH@?G<^ z6+G_}T*S1`{jcDzweG$jCcMRrx&p15ezWG!^==<5RPbW$)tQQUdF;~hDxi0LRByR^ zdfwmV6WkmU8g*i6(~cFif2O=lTWG!N)L}hVqg?NH^XT=X2M_SlyHt*KfLx(Qd$2{* zcop5)s1A}6(kL%$WBH~wd$C&y1g&R&Oy@l_BRBD8ei*J>iqrUrq&r_On4~rPLvl)#ft^h;Ivc~E#fLF^+aK zOZKQ5a915Al*Fi#Fv)bG5h1J1CN!bf8d0x)TZ$uiq3^#c==O#7fedR~hg+CXrZHKV z88eDgsP?qmjB{H5f3tY6pdWAsRo+<6AO0@w#0lNK5giUwdVhy?cJI@p6xExpR*zpP z9^sRx`Z8Y{?@mXHW4!mTd`K7OKMbR xC+o#Se9HRum_u;8gf#tW?R0r{@?k&PDHLkV1icuk?8;c diff --git a/gfx/load3.png b/gfx/load3.png index 8ae9f6831a9c714ee036189d438334a9763bbba9..133bc457c082bb10c86fe416971d702df0c74251 100644 GIT binary patch literal 1022 zcmbVLJ#W)M7&fYeN~MY!rjyH1Bx3uV*r~0U)*lJAL_(BCYR0~4?f*t%>g?gLpBR266}Z^BjCru2=!19oj(198iKGk#Qgyqv>%%xiKU>x zNO_!cwjeZi^E3!2h=F4?!ign*fB!)QII_e;t*x|E7me}$oT7tyrytHIp%IC@4?!b0 zxj>9q0P=X6WM*!O3tf}1i(^>?3kaK7;?k)>y9-=G5zwS+B~%~;x-P+*rt9zlP!*`k z3V-wpteKi_s&%j$BDY4Pq1p3VD_eYLiDSl6QQ zyKyBt>z}4b?xBpF(2(E9aH}Nq++A;|0CI24ClvEb38o$iPhylX-?K#iM~ZM{dWvl~ z9apRE7}aJS!X3?N*|4VTbz7@9l~$>76<2L(&~>41RBJYb&AMaPZ4Ww7b!v|0wv3YN zCm9Qp5S4Z@x4YtM*K$plqJRERLtq~$@FgAGKk6SJJCsP4?5>*?YcQgQ3eSwlt! z1`cM0t@Y0`N{h|pBGW(dVHATbXfF>|_y85}Sb4q9e E00eL#F#rGn diff --git a/gfx/load4.png b/gfx/load4.png index 09fa3515d5d5c3994f2e74b09c18e76448d67ded..7b4009e03444c4ea16ee7e1be4f84640e9ffd8f5 100644 GIT binary patch literal 1854 zcmbVNc~BE~6b=(WMe(YDT(X9ah*PrJkOZ<#z>ow8_k=@Q)Vd@~5<;>eyFdhMK}73; zqT;9pL~%wf2uc-EKuQtNdXE``&xM_hz?5 zMFiQ}IN4Ar6kAEKNJ@@?`I&A_zVXb=SLEPGh~tT9EQ!cK^e9Cj#}ZLMqCpg>6h-7~ zQ-4Nz6bdy-6%$Xyhljy3OhZS^HgtnVN1`bdp1(nd$kZqSB%%tHmQQ<8|04}h$@#Pu z>~Kc7PKYX1!I^qAIx`|hmZ_F;=i_PIcp8-q;!~_}S&GCX*Fq;E2eSpb}Myl!M zNw8EDIH^Uh_%tO!=wJ}c$jG2)c+)Yx0))6+u9<_$^dc?1@U>b3F?eZl_bCPuip%sW z9ihUsfSD0V#L@^pjr8PHlNDyN%Hnf}6*Hc|C4Zh?TA?NAsV!ERvejp)yG)EG$ z@t2ULTTACI_8-e{28Xr{IUHJ$pppA4y`2-QWcynmh|idAoW*$^4H15onnnfwx-zI| z?9IB4j**_%Z!>oVf7_2<6Pwp|n^S^!zx+)5`dl>Q+h8>_%=zGw@60(mj z*gC8fR5JB$wF7?LC*mFcI%Q?o+Z@R%a~~Q}F87>`Y`n?&=4FvZQVKaEaEqt*pRcKjjciJ+=3~0h|T%m^&rQV1m893V+AjvIYqb1fsob><;_0+7V!_+ z!q!&lwHD1f>BSilz|5#`_tc#$Ilb_7^-7~%lZQPd@wbE@LVjHKD)XeNT z9KT9uVXC=byL5Wd`1z#)uF@D+)H5r(2AxJw_u6zHe0n*g;wn>T$BxL)aM)IN4?A$K zY7E?7kSxmjY8%fb$o_Wqyq>7+Ipb8aJ@?!u9~=00 z`9Rqx%WckfRjfDV%y&8MJXGxA?o51sDk2w@Q0d3p=NS96U3KFMXspg7<)9zqQtYDIY78+{h6m*;{0N5y7F#FqL&<1qu1K=wq+$OzVHpN*!o^?5-Q&z zb@94b_AGdFcLUm$FD*WjSANrY>*Xks;^2I;h8DVNPuYt{u~cK8Ti5q~CZp#Y>&||v ngc)P8@oq=S6;aqF(88LMuijle;UcI delta 819 zcmV-31I+xs4$B51iBL{Q4GJ0x0000DNk~Le0000V0000V2nGNE03WUvIgueJe**1E zL_t(|+QipQNR&Yw$MJnucV*G)R+J&VDH(L>q)-t>px_~)7ph}HM5m~W2Mh7ky-N}n zcBq3?hD8YxK?vCk78OY^hs18GwZmn z8_1&6U>TlbBv7DIoMpXwG+_X*fA9p4bv^2L@Dz%$236RHDSXy!T*IAQg9o#$=OB$) zOlY)WRO2A7qYIUO1$V6L5_F;sb zcXJ=qB2viU!Qb430VUyD-z`Cz-y=`zI+UTFTj(|S22WYRT`Tw`rvFuNe|y?ZB11~R zm*9?P+Dr6ZkrKJ@$D@{M&4aow*5?hh7kYd3mbCSG04p(!*V*1|iwSP8`GDkH@?G<^ z6+G_}T*S1`{jcDzweG$jCcMRrx&p15ezWG!^==<5RPbW$)tQQUdF;~hDxi0LRByR^ zdfwmV6WkmU8g*i6(~cFif2O=lTWG!N)L}hVqg?NH^XT=X2M_SlyHt*KfLx(Qd$2{* zcop5)s1A}6(kL%$WBH~wd$C&y1g&R&Oy@l_BRBD8ei*J>iqrUrq&r_On4~rPLvl)#ft^h;Ivc~E#fLF^+aK zOZKQ5a915Al*Fi#Fv)bG5h1J1CN!bf8d0x)TZ$uiq3^#c==O#7fedR~hg+CXrZHKV z88eDgsP?qmjB{H5f3tY6pdWAsRo+<6AO0@w#0lNK5giUwdVhy?cJI@p6xExpR*zpP z9^sRx`Z8Y{?@mXHW4!mTd`K7OKMbR xC+o#Se9HRum_u;8gf#tW?R0r{@?k&PDHLkV1icuk?8;c diff --git a/gfx/load5.png b/gfx/load5.png index 8ae9f6831a9c714ee036189d438334a9763bbba9..133bc457c082bb10c86fe416971d702df0c74251 100644 GIT binary patch literal 1022 zcmbVLJ#W)M7&fYeN~MY!rjyH1Bx3uV*r~0U)*lJAL_(BCYR0~4?f*t%>g?gLpBR266}Z^BjCru2=!19oj(198iKGk#Qgyqv>%%xiKU>x zNO_!cwjeZi^E3!2h=F4?!ign*fB!)QII_e;t*x|E7me}$oT7tyrytHIp%IC@4?!b0 zxj>9q0P=X6WM*!O3tf}1i(^>?3kaK7;?k)>y9-=G5zwS+B~%~;x-P+*rt9zlP!*`k z3V-wpteKi_s&%j$BDY4Pq1p3VD_eYLiDSl6QQ zyKyBt>z}4b?xBpF(2(E9aH}Nq++A;|0CI24ClvEb38o$iPhylX-?K#iM~ZM{dWvl~ z9apRE7}aJS!X3?N*|4VTbz7@9l~$>76<2L(&~>41RBJYb&AMaPZ4Ww7b!v|0wv3YN zCm9Qp5S4Z@x4YtM*K$plqJRERLtq~$@FgAGKk6SJJCsP4?5>*?YcQgQ3eSwlt! z1`cM0t@Y0`N{h|pBGW(dVHATbXfF>|_y85}Sb4q9e E00eL#F#rGn diff --git a/gfx/load6.png b/gfx/load6.png index 09fa3515d5d5c3994f2e74b09c18e76448d67ded..7b4009e03444c4ea16ee7e1be4f84640e9ffd8f5 100644 GIT binary patch literal 1854 zcmbVNc~BE~6b=(WMe(YDT(X9ah*PrJkOZ<#z>ow8_k=@Q)Vd@~5<;>eyFdhMK}73; zqT;9pL~%wf2uc-EKuQtNdXE``&xM_hz?5 zMFiQ}IN4Ar6kAEKNJ@@?`I&A_zVXb=SLEPGh~tT9EQ!cK^e9Cj#}ZLMqCpg>6h-7~ zQ-4Nz6bdy-6%$Xyhljy3OhZS^HgtnVN1`bdp1(nd$kZqSB%%tHmQQ<8|04}h$@#Pu z>~Kc7PKYX1!I^qAIx`|hmZ_F;=i_PIcp8-q;!~_}S&GCX*Fq;E2eSpb}Myl!M zNw8EDIH^Uh_%tO!=wJ}c$jG2)c+)Yx0))6+u9<_$^dc?1@U>b3F?eZl_bCPuip%sW z9ihUsfSD0V#L@^pjr8PHlNDyN%Hnf}6*Hc|C4Zh?TA?NAsV!ERvejp)yG)EG$ z@t2ULTTACI_8-e{28Xr{IUHJ$pppA4y`2-QWcynmh|idAoW*$^4H15onnnfwx-zI| z?9IB4j**_%Z!>oVf7_2<6Pwp|n^S^!zx+)5`dl>Q+h8>_%=zGw@60(mj z*gC8fR5JB$wF7?LC*mFcI%Q?o+Z@R%a~~Q}F87>`Y`n?&=4FvZQVKaEaEqt*pRcKjjciJ+=3~0h|T%m^&rQV1m893V+AjvIYqb1fsob><;_0+7V!_+ z!q!&lwHD1f>BSilz|5#`_tc#$Ilb_7^-7~%lZQPd@wbE@LVjHKD)XeNT z9KT9uVXC=byL5Wd`1z#)uF@D+)H5r(2AxJw_u6zHe0n*g;wn>T$BxL)aM)IN4?A$K zY7E?7kSxmjY8%fb$o_Wqyq>7+Ipb8aJ@?!u9~=00 z`9Rqx%WckfRjfDV%y&8MJXGxA?o51sDk2w@Q0d3p=NS96U3KFMXspg7<)9zqQtYDIY78+{h6m*;{0N5y7F#FqL&<1qu1K=wq+$OzVHpN*!o^?5-Q&z zb@94b_AGdFcLUm$FD*WjSANrY>*Xks;^2I;h8DVNPuYt{u~cK8Ti5q~CZp#Y>&||v ngc)P8@oq=S6;aqF(88LMuijle;UcI delta 819 zcmV-31I+xs4$B51iBL{Q4GJ0x0000DNk~Le0000V0000V2nGNE03WUvIgueJe**1E zL_t(|+QipQNR&Yw$MJnucV*G)R+J&VDH(L>q)-t>px_~)7ph}HM5m~W2Mh7ky-N}n zcBq3?hD8YxK?vCk78OY^hs18GwZmn z8_1&6U>TlbBv7DIoMpXwG+_X*fA9p4bv^2L@Dz%$236RHDSXy!T*IAQg9o#$=OB$) zOlY)WRO2A7qYIUO1$V6L5_F;sb zcXJ=qB2viU!Qb430VUyD-z`Cz-y=`zI+UTFTj(|S22WYRT`Tw`rvFuNe|y?ZB11~R zm*9?P+Dr6ZkrKJ@$D@{M&4aow*5?hh7kYd3mbCSG04p(!*V*1|iwSP8`GDkH@?G<^ z6+G_}T*S1`{jcDzweG$jCcMRrx&p15ezWG!^==<5RPbW$)tQQUdF;~hDxi0LRByR^ zdfwmV6WkmU8g*i6(~cFif2O=lTWG!N)L}hVqg?NH^XT=X2M_SlyHt*KfLx(Qd$2{* zcop5)s1A}6(kL%$WBH~wd$C&y1g&R&Oy@l_BRBD8ei*J>iqrUrq&r_On4~rPLvl)#ft^h;Ivc~E#fLF^+aK zOZKQ5a915Al*Fi#Fv)bG5h1J1CN!bf8d0x)TZ$uiq3^#c==O#7fedR~hg+CXrZHKV z88eDgsP?qmjB{H5f3tY6pdWAsRo+<6AO0@w#0lNK5giUwdVhy?cJI@p6xExpR*zpP z9^sRx`Z8Y{?@mXHW4!mTd`K7OKMbR xC+o#Se9HRum_u;8gf#tW?R0r{@?k&PDHLkV1icuk?8;c diff --git a/gfx/load7.png b/gfx/load7.png index 8ae9f6831a9c714ee036189d438334a9763bbba9..133bc457c082bb10c86fe416971d702df0c74251 100644 GIT binary patch literal 1022 zcmbVLJ#W)M7&fYeN~MY!rjyH1Bx3uV*r~0U)*lJAL_(BCYR0~4?f*t%>g?gLpBR266}Z^BjCru2=!19oj(198iKGk#Qgyqv>%%xiKU>x zNO_!cwjeZi^E3!2h=F4?!ign*fB!)QII_e;t*x|E7me}$oT7tyrytHIp%IC@4?!b0 zxj>9q0P=X6WM*!O3tf}1i(^>?3kaK7;?k)>y9-=G5zwS+B~%~;x-P+*rt9zlP!*`k z3V-wpteKi_s&%j$BDY4Pq1p3VD_eYLiDSl6QQ zyKyBt>z}4b?xBpF(2(E9aH}Nq++A;|0CI24ClvEb38o$iPhylX-?K#iM~ZM{dWvl~ z9apRE7}aJS!X3?N*|4VTbz7@9l~$>76<2L(&~>41RBJYb&AMaPZ4Ww7b!v|0wv3YN zCm9Qp5S4Z@x4YtM*K$plqJRERLtq~$@FgAGKk6SJJCsP4?5>*?YcQgQ3eSwlt! z1`cM0t@Y0`N{h|pBGW(dVHATbXfF>|_y85}Sb4q9e E00eL#F#rGn diff --git a/src/textures.c b/src/textures.c index 36c324674..484a1dcf2 100644 --- a/src/textures.c +++ b/src/textures.c @@ -273,6 +273,20 @@ int texPngLoad(GSTEXTURE *texture, const char *path, int texId, short psm) return texPngEnd(pngPtr, infoPtr, file, ERR_BAD_DIMENSION); texUpdate(texture, pngWidth, pngHeight); + png_set_strip_16(pngPtr); + + if (colorType == PNG_COLOR_TYPE_PALETTE) + png_set_expand(pngPtr); + + if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) + png_set_expand(pngPtr); + + if (png_get_valid(pngPtr, infoPtr, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(pngPtr); + + png_set_filler(pngPtr, 0xff, PNG_FILLER_AFTER); + png_read_update_info(pngPtr, infoPtr); + void (*texPngReadPixels)(GSTEXTURE * texture, png_bytep * rowPointers); switch (png_get_color_type(pngPtr, infoPtr)) { case PNG_COLOR_TYPE_RGB_ALPHA: @@ -290,19 +304,6 @@ int texPngLoad(GSTEXTURE *texture, const char *path, int texId, short psm) return texPngEnd(pngPtr, infoPtr, file, ERR_BAD_DEPTH); } - png_set_strip_16(pngPtr); - - if (colorType == PNG_COLOR_TYPE_PALETTE) - png_set_expand(pngPtr); - - if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) - png_set_expand(pngPtr); - - if (png_get_valid(pngPtr, infoPtr, PNG_INFO_tRNS)) - png_set_tRNS_to_alpha(pngPtr); - - png_set_filler(pngPtr, 0xff, PNG_FILLER_AFTER); - png_read_update_info(pngPtr, infoPtr); texPngReadData(texture, pngPtr, infoPtr, texPngReadPixels); return texPngEnd(pngPtr, infoPtr, file, 0); From 8105d940588b0b933817160b3965d7c138593202 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 27 Sep 2017 21:04:02 -0700 Subject: [PATCH 068/269] revert changes to elfldr.c to fix an issue with loading APPS from Internal HDDs --- DETAILED_CHANGELOG | 1 + elfldr/elfldr.c | 34 ---------------------------------- 2 files changed, 1 insertion(+), 34 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index e38d2181c..64623d7fe 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1026 - Jay-Jay-OPL - rickgaiser did the following changes: - Fix loading PNG files with palette. - Thu Sep 7 14:50:41 2017 -0700 rev1025 - Jay-Jay-OPL - SP193 did the following changes: - Partial roll back & rework of c1470b2 for maintainability: removed old hack for preventing the thread patch from being included, in favour of the new libkernel-nopatch library. - Fixed partition creation of +OPL: added PFS filesystem setting, changed open flags to WRONLY and removed unused mode parameter. - Sun Sep 3 18:26:56 2017 -0700 rev1024 - Jay-Jay-OPL - Developer rickgaiser had done the following changes: theme: use real theme file for builtin theme - Thu Aug 31 14:31:27 2017 -0700 rev1023 - Jay-Jay-OPL - update lang files - Thu Aug 24 17:30:59 2017 -0700 diff --git a/elfldr/elfldr.c b/elfldr/elfldr.c index 95c7c6334..e8885e7e7 100644 --- a/elfldr/elfldr.c +++ b/elfldr/elfldr.c @@ -14,32 +14,6 @@ #include #include -static inline void _strcpy(char *dst, const char *src) -{ - strncpy(dst, src, strlen(src) + 1); -} - -static inline void _strcat(char *dst, const char *src) -{ - _strcpy(&dst[strlen(dst)], src); -} - -static int _strncmp(const char *s1, const char *s2, int length) -{ - const char *a = s1; - const char *b = s2; - - while (length > 0) { - if ((*a == 0) || (*b == 0)) - return -1; - if (*a++ != *b++) - return 1; - length--; - } - - return 0; -} - static inline void BootError(char *filename) { char *argv[2]; @@ -101,14 +75,6 @@ int main(int argc, char *argv[]) SifLoadFileExit(); SifExitRpc(); - if (_strncmp(argv[0], "pfs", 3) == 0) { - static char _argv[256]; - _strcpy(_argv, "hdd0:+OPL:"); - _strcat(_argv, argv[0]); - - argv[0] = _argv; - } - ExecPS2((void *)exd.epc, (void *)exd.gp, argc, argv); } else { SifExitRpc(); From 67db57e93f7efa527eed8975baa8f73671de23cb Mon Sep 17 00:00:00 2001 From: danielb7390 Date: Sat, 7 Oct 2017 23:30:57 +0100 Subject: [PATCH 069/269] Add the functionality to have different main/info page on ELM page. (#4) * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Make the game list work. BUG: If the theme doesn't provide the mainELM/infoELM the entire theme disappears and only the game list shows in the ELM page. * Fix the last bug with the special ELM theme!!! * Replace tabs with spaces. * Add the comments to changed lines. * Change tabs to spaces! --- include/themes.h | 11 +++++- src/menusys.c | 35 ++++++++++++++++-- src/themes.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 133 insertions(+), 8 deletions(-) diff --git a/include/themes.h b/include/themes.h index c036cd4d8..4523f9792 100644 --- a/include/themes.h +++ b/include/themes.h @@ -110,9 +110,16 @@ typedef struct theme theme_elems_t mainElems; theme_elems_t infoElems; - + + //START of OPL_DB tweaks + theme_elems_t mainElemsELM; + theme_elems_t infoElemsELM; + int inElmPage; + theme_element_t *itemsListELM; + //END of OPL_DB tweaks + int gameCacheCount; - + theme_element_t *itemsList; theme_element_t *loadingIcon; int loadingIconCount; diff --git a/src/menusys.c b/src/menusys.c index 7a7ffb845..3d59b2dd1 100644 --- a/src/menusys.c +++ b/src/menusys.c @@ -638,8 +638,28 @@ void menuHandleInputMenu() void menuRenderMain() { // selected_item can't be NULL here as we only allow to switch to "Main" rendering when there is at least one device activated - theme_element_t *elem = gTheme->mainElems.first; - + //START of OPL_DB tweaks + theme_element_t* elem = NULL; + item_list_t *list = selected_item->item->userdata; + if(list && gTheme->mainElemsELM.first && list->mode == ELM_MODE){ + elem = gTheme->mainElemsELM.first; + if (gTheme->inElmPage == 0){//Switch to ELM + theme_element_t *tmp = gTheme->itemsListELM; + gTheme->itemsListELM = gTheme->itemsList; + gTheme->itemsList = tmp; + } + gTheme->inElmPage = 1; + }else{ + elem = gTheme->mainElems.first; + if (gTheme->inElmPage == 1){//Switch to Normal + theme_element_t *tmp = gTheme->itemsListELM; + gTheme->itemsListELM = gTheme->itemsList; + gTheme->itemsList = tmp; + } + gTheme->inElmPage = 0; + } + //END of OPL_DB tweaks + while (elem) { if (elem->drawElem) elem->drawElem(selected_item, selected_item->item->current, NULL, elem); @@ -711,7 +731,16 @@ void menuRenderInfo() _menuRequestConfig(); WaitSema(menuSemaId); - theme_element_t *elem = gTheme->infoElems.first; + //START of OPL_DB tweaks + theme_element_t* elem = NULL; + item_list_t *list = selected_item->item->userdata; + if(list && gTheme->infoElemsELM.first && list->mode == ELM_MODE){ + elem = gTheme->infoElemsELM.first; + }else{ + elem = gTheme->infoElems.first; + } + //END of OPL_DB tweaks + while (elem) { if (elem->drawElem) elem->drawElem(selected_item, selected_item->item->current, itemConfig, elem); diff --git a/src/themes.c b/src/themes.c index 0c3cf742e..07e1f5754 100644 --- a/src/themes.c +++ b/src/themes.c @@ -401,7 +401,12 @@ static mutable_image_t *initMutableImage(const char *themePath, config_set_t *th findDuplicate(theme->mainElems.first, cachePattern, defaultTexture, overlayTexture, mutableImage); findDuplicate(theme->infoElems.first, cachePattern, defaultTexture, overlayTexture, mutableImage); - + + //START of OPL_DB tweaks + findDuplicate(theme->mainElemsELM.first, cachePattern, defaultTexture, overlayTexture, mutableImage); + findDuplicate(theme->infoElemsELM.first, cachePattern, defaultTexture, overlayTexture, mutableImage); + //END of OPL_DB tweaks + if (cachePattern && !mutableImage->cache) { if (type == ELEM_TYPE_ATTRIBUTE_IMAGE) mutableImage->cache = cacheInitCache(-1, themePath, 0, cachePattern, 1); @@ -811,6 +816,18 @@ static void validateGUIElems(const char *themePath, config_set_t *themeConfig, t backgroundElem->next = theme->mainElems.first; theme->mainElems.first = backgroundElem; } + //START of OPL_DB tweaks + if (theme->mainElemsELM.first != NULL && theme->mainElemsELM.first->type != ELEM_TYPE_BACKGROUND) { + LOG("THEMES No valid background found for mainELM, add default BG_ART\n"); + theme_element_t *backgroundElem = initBasic(themePath, themeConfig, theme, "bg", ELEM_TYPE_BACKGROUND, 0, 0, ALIGN_NONE, screenWidth, screenHeight, SCALING_NONE, gDefaultCol, theme->fonts[0]); + if (themePath) + initBackground(themePath, themeConfig, theme, backgroundElem, "bg", "BG", 1, "background"); + else + initBackground(themePath, themeConfig, theme, backgroundElem, "bg", "BG", 1, NULL); + backgroundElem->next = theme->mainElemsELM.first; + theme->mainElemsELM.first = backgroundElem; + } + //END of OPL_DB tweaks if (theme->infoElems.first) { if (theme->infoElems.first->type != ELEM_TYPE_BACKGROUND) { @@ -824,7 +841,21 @@ static void validateGUIElems(const char *themePath, config_set_t *themeConfig, t theme->infoElems.first = backgroundElem; } } - + //START of OPL_DB tweaks + if (theme->infoElemsELM.first) { + if (theme->infoElemsELM.first->type != ELEM_TYPE_BACKGROUND) { + LOG("THEMES No valid background found for info, add default BG_ART\n"); + theme_element_t *backgroundElem = initBasic(themePath, themeConfig, theme, "bg", ELEM_TYPE_BACKGROUND, 0, 0, ALIGN_NONE, screenWidth, screenHeight, SCALING_NONE, gDefaultCol, theme->fonts[0]); + if (themePath) + initBackground(themePath, themeConfig, theme, backgroundElem, "bg", "BG", 1, "background"); + else + initBackground(themePath, themeConfig, theme, backgroundElem, "bg", "BG", 1, NULL); + backgroundElem->next = theme->infoElemsELM.first; + theme->infoElemsELM.first = backgroundElem; + } + } + //END of OPL_DB tweaks + // 2. check we have a valid ItemsList element, and link its decorator to the target element if (theme->itemsList) { items_list_t *itemsList = (items_list_t *)theme->itemsList->extended; @@ -853,6 +884,35 @@ static void validateGUIElems(const char *themePath, config_set_t *themeConfig, t theme->itemsList->next = theme->mainElems.first->next; // Position the itemsList as second element (right after the Background) theme->mainElems.first->next = theme->itemsList; } + //START of OPL_DB tweaks + if (theme->itemsListELM) { + items_list_t *itemsList = (items_list_t *)theme->itemsListELM->extended; + if (itemsList->decorator) { + // Second pass to find the decorator + theme_element_t *decoratorElem = theme->mainElemsELM.first; + while (decoratorElem) { + if (decoratorElem->type == ELEM_TYPE_GAME_IMAGE) { + mutable_image_t *gameImage = (mutable_image_t *)decoratorElem->extended; + if (!strcmp(itemsList->decorator, gameImage->cache->suffix)) { + // if user want to cache less than displayed items, then disable itemslist icons, if not would load constantly + if (gameImage->cache->count >= itemsList->displayedItems) + itemsList->decoratorImage = gameImage; + break; + } + } + + decoratorElem = decoratorElem->next; + } + itemsList->decorator = NULL; + } + } else if(theme->mainElemsELM.first){ + LOG("THEMES No itemsList found in ELM page, adding a default one\n"); + theme->itemsListELM = initBasic(themePath, themeConfig, theme, "il", ELEM_TYPE_ITEMS_LIST, 150, MENU_POS_V, ALIGN_NONE, DIM_UNDEF, DIM_UNDEF, SCALING_RATIO, theme->textColor, theme->fonts[0]); + initItemsList(themePath, themeConfig, theme, theme->itemsListELM, "il", NULL); + theme->itemsListELM->next = theme->mainElemsELM.first->next; // Position the itemsListELM as second element (right after the Background) + theme->mainElemsELM.first->next = theme->itemsListELM; + } + //END of OPL_DB tweaks } static int addGUIElem(const char *themePath, config_set_t *themeConfig, theme_t *theme, theme_elems_t *elems, const char *type, const char *name) @@ -899,7 +959,13 @@ static int addGUIElem(const char *themePath, config_set_t *themeConfig, theme_t elem = initBasic(themePath, themeConfig, theme, name, ELEM_TYPE_ITEMS_LIST, 150, MENU_POS_V, ALIGN_NONE, DIM_UNDEF, DIM_UNDEF, SCALING_RATIO, theme->textColor, theme->fonts[0]); initItemsList(themePath, themeConfig, theme, elem, name, NULL); theme->itemsList = elem; + //START of OPL_DB tweaks + }else if (!theme->itemsListELM){ + elem = initBasic(themePath, themeConfig, theme, name, ELEM_TYPE_ITEMS_LIST, 150, MENU_POS_V, ALIGN_NONE, DIM_UNDEF, DIM_UNDEF, SCALING_RATIO, theme->textColor, theme->fonts[0]); + initItemsList(themePath, themeConfig, theme, elem, name, NULL); + theme->itemsListELM = elem; } + //END of OPL_DB tweaks } else if (!strcmp(elementsType[ELEM_TYPE_ITEM_ICON], type)) { elem = initBasic(themePath, themeConfig, theme, name, ELEM_TYPE_GAME_IMAGE, 80, theme->usedHeight >> 1, ALIGN_CENTER, DIM_UNDEF, DIM_UNDEF, SCALING_RATIO, gDefaultCol, theme->fonts[0]); initGameImage(themePath, themeConfig, theme, elem, name, "ICO", 20, NULL, NULL); @@ -1087,6 +1153,14 @@ static void thmLoad(const char *themePath) newT->mainElems.last = NULL; newT->infoElems.first = NULL; newT->infoElems.last = NULL; + //START of OPL_DB tweaks + newT->mainElemsELM.first = NULL; + newT->mainElemsELM.last = NULL; + newT->infoElemsELM.first = NULL; + newT->infoElemsELM.last = NULL; + newT->inElmPage = 0; + newT->itemsListELM = NULL; + //END of OPL_DB tweaks newT->gameCacheCount = 0; newT->itemsList = NULL; newT->loadingIcon = NULL; @@ -1138,7 +1212,22 @@ static void thmLoad(const char *themePath) snprintf(path, sizeof(path), "info0"); while (addGUIElem(themePath, themeConfig, newT, &newT->infoElems, NULL, path)) snprintf(path, sizeof(path), "info%d", i++); - + + //START of OPL_DB tweaks + //Special Main ELM page + i = 1; + snprintf(path, sizeof(path), "mainELM0"); + while (addGUIElem(themePath, themeConfig, newT, &newT->mainElemsELM, NULL, path)) + snprintf(path, sizeof(path), "mainELM%d", i++); + + //Special Info ELM page + i = 1; + snprintf(path, sizeof(path), "infoELM0"); + while(addGUIElem(themePath, themeConfig, newT, &newT->infoElemsELM, NULL, path)) + snprintf(path, sizeof(path), "infoELM%d", i++); + + //END of OPL_DB tweaks + validateGUIElems(themePath, themeConfig, newT); configFree(themeConfig); From d60d900df1520883a8afb330868e7f12b989bbd8 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 7 Oct 2017 15:36:10 -0700 Subject: [PATCH 070/269] update changelog in order to git a new OPL revision during compile --- DETAILED_CHANGELOG | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 64623d7fe..c01bb3e51 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,8 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1028 - danielb7390 - Add the functionality to have different main/info page on ELM page. (#4) - Sat Oct 7 15:30:57 2017 -0700 +rev1027 - Jay-Jay-OPL - revert changes to elfldr.c to fix an issue with loading APPS from Internal HDDs - Wed Sep 27 21:04:02 2017 -0700 rev1026 - Jay-Jay-OPL - rickgaiser did the following changes: - Fix loading PNG files with palette. - Thu Sep 7 14:50:41 2017 -0700 rev1025 - Jay-Jay-OPL - SP193 did the following changes: - Partial roll back & rework of c1470b2 for maintainability: removed old hack for preventing the thread patch from being included, in favour of the new libkernel-nopatch library. - Fixed partition creation of +OPL: added PFS filesystem setting, changed open flags to WRONLY and removed unused mode parameter. - Sun Sep 3 18:26:56 2017 -0700 rev1024 - Jay-Jay-OPL - Developer rickgaiser had done the following changes: theme: use real theme file for builtin theme - Thu Aug 31 14:31:27 2017 -0700 From c3257f569bc941302031f625f495e9ad90c0c74b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 17 Oct 2017 14:27:21 -0700 Subject: [PATCH 071/269] belek666 added the following pademu changes: - add ds4 support to ds3 modules - new design for bt modules - multitap emulation changes in gui: - add bluetooth adapter inforamtion screen - add option to disable workaround for fake ds3 controllers --- DETAILED_CHANGELOG | 1 + Makefile | 36 +- include/dialogs.h | 20 +- include/lang.h | 20 +- modules/{ds3bt => ds34bt}/Makefile | 0 modules/{ds3bt => ds34bt}/ee/Makefile | 4 +- modules/ds34bt/ee/libds34bt.c | 173 ++ modules/ds34bt/ee/libds34bt.h | 34 + modules/{ds3bt => ds34bt}/iop/Makefile | 8 +- modules/ds34bt/iop/ds34bt.c | 1704 +++++++++++++++++ modules/ds34bt/iop/ds34bt.h | 371 ++++ modules/{ds3usb => ds34bt}/iop/imports.lst | 7 + modules/{ds3bt => ds34bt}/iop/irx_imports.h | 0 modules/{ds3bt => ds34bt}/iop/smsutils.s | 0 modules/{ds3usb => ds34usb}/Makefile | 0 modules/{ds3usb => ds34usb}/ee/Makefile | 4 +- modules/ds34usb/ee/libds34usb.c | 145 ++ modules/ds34usb/ee/libds34usb.h | 19 + modules/{ds3usb => ds34usb}/iop/Makefile | 4 +- modules/ds34usb/iop/ds34usb.c | 787 ++++++++ modules/ds34usb/iop/ds34usb.h | 182 ++ modules/{ds3bt => ds34usb}/iop/imports.lst | 3 + modules/{ds3usb => ds34usb}/iop/irx_imports.h | 0 modules/{ds3usb => ds34usb}/iop/smsutils.s | 0 modules/ds3bt/ee/libds3bt.c | 136 -- modules/ds3bt/ee/libds3bt.h | 19 - modules/ds3bt/iop/README | 115 -- modules/ds3bt/iop/ds3bt.c | 1675 ---------------- modules/ds3bt/iop/ds3bt.h | 282 --- modules/ds3usb/ee/libds3usb.c | 143 -- modules/ds3usb/ee/libds3usb.h | 19 - modules/ds3usb/iop/ds3usb.c | 534 ------ modules/ds3usb/iop/ds3usb.h | 126 -- modules/mcemu/mcemu.c | 8 +- modules/mcemu/mcemu.h | 2 +- modules/pademu/Makefile | 4 +- modules/pademu/README | 115 -- modules/pademu/ds34bt.c | 1513 +++++++++++++++ modules/pademu/ds34bt.h | 355 ++++ modules/pademu/ds34usb.c | 616 ++++++ modules/pademu/ds34usb.h | 188 ++ modules/pademu/ds3bt.c | 1590 --------------- modules/pademu/ds3bt.h | 275 --- modules/pademu/ds3usb.c | 463 ----- modules/pademu/ds3usb.h | 117 -- modules/pademu/imports.lst | 1 + modules/pademu/irx_imports.h | 1 + modules/pademu/pademu.c | 266 ++- modules/pademu/pademu.h | 1 + src/config.c | 2 +- src/dialogs.c | 211 +- src/elmsupport.c | 10 +- src/gui.c | 194 +- src/lang.c | 28 +- src/pad.c | 14 +- src/system.c | 40 +- 56 files changed, 6765 insertions(+), 5820 deletions(-) rename modules/{ds3bt => ds34bt}/Makefile (100%) rename modules/{ds3bt => ds34bt}/ee/Makefile (81%) create mode 100644 modules/ds34bt/ee/libds34bt.c create mode 100644 modules/ds34bt/ee/libds34bt.h rename modules/{ds3bt => ds34bt}/iop/Makefile (54%) create mode 100644 modules/ds34bt/iop/ds34bt.c create mode 100644 modules/ds34bt/iop/ds34bt.h rename modules/{ds3usb => ds34bt}/iop/imports.lst (86%) rename modules/{ds3bt => ds34bt}/iop/irx_imports.h (100%) rename modules/{ds3bt => ds34bt}/iop/smsutils.s (100%) rename modules/{ds3usb => ds34usb}/Makefile (100%) rename modules/{ds3usb => ds34usb}/ee/Makefile (80%) create mode 100644 modules/ds34usb/ee/libds34usb.c create mode 100644 modules/ds34usb/ee/libds34usb.h rename modules/{ds3usb => ds34usb}/iop/Makefile (76%) create mode 100644 modules/ds34usb/iop/ds34usb.c create mode 100644 modules/ds34usb/iop/ds34usb.h rename modules/{ds3bt => ds34usb}/iop/imports.lst (93%) rename modules/{ds3usb => ds34usb}/iop/irx_imports.h (100%) rename modules/{ds3usb => ds34usb}/iop/smsutils.s (100%) delete mode 100644 modules/ds3bt/ee/libds3bt.c delete mode 100644 modules/ds3bt/ee/libds3bt.h delete mode 100644 modules/ds3bt/iop/README delete mode 100644 modules/ds3bt/iop/ds3bt.c delete mode 100644 modules/ds3bt/iop/ds3bt.h delete mode 100644 modules/ds3usb/ee/libds3usb.c delete mode 100644 modules/ds3usb/ee/libds3usb.h delete mode 100644 modules/ds3usb/iop/ds3usb.c delete mode 100644 modules/ds3usb/iop/ds3usb.h delete mode 100644 modules/pademu/README create mode 100644 modules/pademu/ds34bt.c create mode 100644 modules/pademu/ds34bt.h create mode 100644 modules/pademu/ds34usb.c create mode 100644 modules/pademu/ds34usb.h delete mode 100644 modules/pademu/ds3bt.c delete mode 100644 modules/pademu/ds3bt.h delete mode 100644 modules/pademu/ds3usb.c delete mode 100644 modules/pademu/ds3usb.h diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index c01bb3e51..0dec722ee 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1029 - Jay-Jay-OPL - update changelog in order to git a new OPL revision during compile - Sat Oct 7 15:36:10 2017 -0700 rev1028 - danielb7390 - Add the functionality to have different main/info page on ELM page. (#4) - Sat Oct 7 15:30:57 2017 -0700 rev1027 - Jay-Jay-OPL - revert changes to elfldr.c to fix an issue with loading APPS from Internal HDDs - Wed Sep 27 21:04:02 2017 -0700 rev1026 - Jay-Jay-OPL - rickgaiser did the following changes: - Fix loading PNG files with palette. - Thu Sep 7 14:50:41 2017 -0700 diff --git a/Makefile b/Makefile index 6ea5f7234..865f468d8 100755 --- a/Makefile +++ b/Makefile @@ -172,9 +172,9 @@ else endif ifeq ($(PADEMU),1) - IOP_OBJS += bt_pademu.o usb_pademu.o ds3usb.o ds3bt.o libds3usb.a libds3bt.a + IOP_OBJS += bt_pademu.o usb_pademu.o ds34usb.o ds34bt.o libds34usb.a libds34bt.a EE_CFLAGS += -DPADEMU - EE_INCS += -Imodules/ds3bt/ee -Imodules/ds3usb/ee + EE_INCS += -Imodules/ds34bt/ee -Imodules/ds34usb/ee PADEMU_FLAGS = PADEMU=1 else PADEMU_FLAGS = PADEMU=0 @@ -311,10 +311,10 @@ clean: $(MAKE) -C modules/debug/ioptrap clean echo " -ps2link" $(MAKE) -C modules/debug/ps2link clean - echo " -ds3usb" - $(MAKE) -C modules/ds3usb clean - echo " -ds3bt" - $(MAKE) -C modules/ds3bt clean + echo " -ds34usb" + $(MAKE) -C modules/ds34usb clean + echo " -ds34bt" + $(MAKE) -C modules/ds34bt clean echo " -pademu" $(MAKE) -C modules/pademu USE_BT=1 clean $(MAKE) -C modules/pademu USE_USB=1 clean @@ -457,31 +457,31 @@ $(EE_ASM_DIR)isofs.s: modules/isofs/isofs.irx | $(EE_ASM_DIR) $(EE_ASM_DIR)usbd.s: $(PS2SDK)/iop/irx/usbd.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ usbd_irx -$(EE_OBJS_DIR)libds3bt.a: modules/ds3bt/ee/libds3bt.a +$(EE_OBJS_DIR)libds34bt.a: modules/ds34bt/ee/libds34bt.a cp $< $@ -modules/ds3bt/ee/libds3bt.a: modules/ds3bt/ee +modules/ds34bt/ee/libds34bt.a: modules/ds34bt/ee $(MAKE) -C $< -modules/ds3bt/iop/ds3bt.irx: modules/ds3bt/iop - echo " -ds3bt" +modules/ds34bt/iop/ds34bt.irx: modules/ds34bt/iop + echo " -ds34bt" $(MAKE) -C $< -$(EE_ASM_DIR)ds3bt.s: modules/ds3bt/iop/ds3bt.irx | $(EE_ASM_DIR) - $(BIN2S) $< $@ ds3bt_irx +$(EE_ASM_DIR)ds34bt.s: modules/ds34bt/iop/ds34bt.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ds34bt_irx -$(EE_OBJS_DIR)libds3usb.a: modules/ds3usb/ee/libds3usb.a +$(EE_OBJS_DIR)libds34usb.a: modules/ds34usb/ee/libds34usb.a cp $< $@ -modules/ds3usb/ee/libds3usb.a: modules/ds3usb/ee +modules/ds34usb/ee/libds34usb.a: modules/ds34usb/ee $(MAKE) -C $< -modules/ds3usb/iop/ds3usb.irx: modules/ds3usb/iop - echo " -ds3usb" +modules/ds34usb/iop/ds34usb.irx: modules/ds34usb/iop + echo " -ds34usb" $(MAKE) -C $< -$(EE_ASM_DIR)ds3usb.s: modules/ds3usb/iop/ds3usb.irx | $(EE_ASM_DIR) - $(BIN2S) $< $@ ds3usb_irx +$(EE_ASM_DIR)ds34usb.s: modules/ds34usb/iop/ds34usb.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ ds34usb_irx modules/pademu/bt_pademu.irx: modules/pademu echo " -bt_pademu" diff --git a/include/dialogs.h b/include/dialogs.h index 25a612626..b2ddaefa7 100644 --- a/include/dialogs.h +++ b/include/dialogs.h @@ -136,8 +136,25 @@ enum UI_ITEMS { PADCFG_PAD_MAC_STR, PADCFG_PAIR, PADCFG_PAIR_STR, -#endif + PADCFG_BTINFO, + PADCFG_VID, + PADCFG_PID, + PADCFG_REV, + PADCFG_HCIVER, + PADCFG_LMPVER, + PADCFG_MANID, + PADCFG_FEAT_START, + PADCFG_FEAT_END = PADCFG_FEAT_START + 64, + PADCFG_BT_SUPPORTED, + PADCFG_PADEMU_MTAP, + PADCFG_PADEMU_MTAP_PORT, + PADCFG_PADEMU_WORKAROUND, + PADCFG_PADEMU_WORKAROUND_STR, + + COMPAT_MODE_BASE = 250, +#else COMPAT_MODE_BASE = 200, +#endif }; #define COMPAT_NOEXIT 0x70000000 @@ -154,6 +171,7 @@ enum UI_ITEMS { #define COMPAT_PADEMUCONFIG (PADCFG_PADEMU_CONFIG | COMPAT_NOEXIT) extern struct UIItem diaPadEmuConfig[]; +extern struct UIItem diaPadEmuInfo[]; #endif extern struct UIItem diaNetConfig[]; diff --git a/include/lang.h b/include/lang.h index b09b00d30..2d318d048 100644 --- a/include/lang.h +++ b/include/lang.h @@ -220,8 +220,8 @@ enum _STR_IDS { _STR_HINT_PADEMU_ENABLE, _STR_PADEMU_MODE, _STR_HINT_PADEMU_MODE, - _STR_DS3USB_MODE, - _STR_DS3BT_MODE, + _STR_DS34USB_MODE, + _STR_DS34BT_MODE, _STR_PADPORT, _STR_HINT_PAD_PORT, _STR_PADEMU_PORT, @@ -234,6 +234,22 @@ enum _STR_IDS { _STR_PAIR_PAD, _STR_HINT_PAIRPAD, _STR_NOT_CONNECTED, + _STR_BTINFO, + _STR_HINT_BTINFO, + _STR_HCIVER, + _STR_LMPVER, + _STR_MANUFACTURER, + _STR_SUPFEATURES, + _STR_YES, + _STR_NO, + _STR_BT_SUPPORTED, + _STR_BT_NOTSUPPORTED, + _STR_MTAP_ENABLE, + _STR_HINT_MTAP_ENABLE, + _STR_MTAP_PORT, + _STR_HINT_MTAP_PORT, + _STR_PADEMU_WORKAROUND, + _STR_HINT_PADEMU_WORKAROUND, #endif //START of OPL_DB tweaks _STR_ELM, diff --git a/modules/ds3bt/Makefile b/modules/ds34bt/Makefile similarity index 100% rename from modules/ds3bt/Makefile rename to modules/ds34bt/Makefile diff --git a/modules/ds3bt/ee/Makefile b/modules/ds34bt/ee/Makefile similarity index 81% rename from modules/ds3bt/ee/Makefile rename to modules/ds34bt/ee/Makefile index 24127b4f9..251c7fa15 100644 --- a/modules/ds3bt/ee/Makefile +++ b/modules/ds34bt/ee/Makefile @@ -1,6 +1,6 @@ -EE_LIB = libds3bt.a +EE_LIB = libds34bt.a -EE_OBJS = libds3bt.o +EE_OBJS = libds34bt.o EE_LIBS = -lc EE_CFLAGS=-Wall diff --git a/modules/ds34bt/ee/libds34bt.c b/modules/ds34bt/ee/libds34bt.c new file mode 100644 index 000000000..791b94ea2 --- /dev/null +++ b/modules/ds34bt/ee/libds34bt.c @@ -0,0 +1,173 @@ +#include +#include +#include +#include "libds34bt.h" + +#define DS34BT_INIT 1 +#define DS34BT_INIT_CHARGING 2 +#define DS34BT_GET_STATUS 3 +#define DS34BT_GET_BDADDR 4 +#define DS34BT_SET_RUMBLE 5 +#define DS34BT_SET_LED 6 +#define DS34BT_GET_DATA 7 +#define DS34BT_RESET 8 +#define DS34BT_GET_VERSION 9 +#define DS34BT_GET_FEATURES 10 + +#define DS34BT_BIND_RPC_ID 0x18E3878F + +static SifRpcClientData_t ds34bt; + +static u8 rpcbuf[64] __attribute__((aligned(64))); + +static u8 ds34bt_inited = 0; + +int ds34bt_init() +{ + ds34bt.server = NULL; + + do { + if (SifBindRpc(&ds34bt, DS34BT_BIND_RPC_ID, 0) < 0) + return 0; + + nopdelay(); + } while (!ds34bt.server); + + ds34bt_inited = 1; + + return 1; +} + +int ds34bt_deinit() +{ + ds34bt_inited = 0; + return 1; +} + +int ds34bt_reinit_ports(u8 ports) +{ + if (!ds34bt_inited) + return 0; + + rpcbuf[0] = ports; + return (SifCallRpc(&ds34bt, DS34BT_INIT, 0, rpcbuf, 1, NULL, 0, NULL, NULL) == 0); +} + +int ds34bt_init_charging() +{ + if (!ds34bt_inited) + return 0; + + return (SifCallRpc(&ds34bt, DS34BT_INIT_CHARGING, 0, NULL, 0, NULL, 0, NULL, NULL) == 0); +} + +int ds34bt_get_status(int port) +{ + if (!ds34bt_inited) + return 0; + + rpcbuf[0] = port; + + if (SifCallRpc(&ds34bt, DS34BT_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL) == 0) + return rpcbuf[0]; + + return 0; +} + +int ds34bt_get_bdaddr(u8 *bdaddr) +{ + int ret = 0; + + if (!ds34bt_inited) + return 0; + + if (SifCallRpc(&ds34bt, DS34BT_GET_BDADDR, 0, NULL, 0, rpcbuf, 7, NULL, NULL) == 0) { + memcpy(bdaddr, rpcbuf, 6); + + ret = rpcbuf[6]; + } + + return ret; +} + +int ds34bt_set_rumble(int port, u8 lrum, u8 rrum) +{ + if (!ds34bt_inited) + return 0; + + rpcbuf[0] = port; + rpcbuf[1] = lrum; + rpcbuf[2] = rrum; + + return (SifCallRpc(&ds34bt, DS34BT_SET_RUMBLE, 0, rpcbuf, 3, NULL, 0, NULL, NULL) == 0); +} + +int ds34bt_set_led(int port, u8 *led) +{ + if (!ds34bt_inited) + return 0; + + rpcbuf[0] = port; + rpcbuf[1] = led[0]; + rpcbuf[2] = led[1]; + rpcbuf[3] = led[2]; + rpcbuf[4] = 0; + + return (SifCallRpc(&ds34bt, DS34BT_SET_LED, 0, rpcbuf, 5, NULL, 0, NULL, NULL) == 0); +} + +int ds34bt_get_data(int port, u8 *data) +{ + int ret; + + if (!ds34bt_inited) + return 0; + + rpcbuf[0] = port; + + ret = (SifCallRpc(&ds34bt, DS34BT_GET_DATA, 0, rpcbuf, 1, rpcbuf, 18, NULL, NULL) == 0); + + memcpy(data, rpcbuf, 18); + + return ret; +} + +int ds34bt_reset() +{ + if (!ds34bt_inited) + return 0; + + return (SifCallRpc(&ds34bt, DS34BT_RESET, 0, NULL, 0, NULL, 0, NULL, NULL) == 0); +} + +int ds34bt_get_version(hci_information_t *info) +{ + int ret = 0; + + if (!ds34bt_inited) + return 0; + + if (SifCallRpc(&ds34bt, DS34BT_GET_VERSION, 0, NULL, 0, rpcbuf, 1 + sizeof(hci_information_t), NULL, NULL) == 0) { + memcpy(info, rpcbuf, sizeof(hci_information_t)); + + ret = rpcbuf[sizeof(hci_information_t)]; + } + + return ret; +} + +int ds34bt_get_features(u8 *info) +{ + int ret = 0; + + if (!ds34bt_inited) + return 0; + + if (SifCallRpc(&ds34bt, DS34BT_GET_FEATURES, 0, NULL, 0, rpcbuf, 9, NULL, NULL) == 0) { + memcpy(info, rpcbuf, 8); + + ret = rpcbuf[8]; + } + + return ret; +} diff --git a/modules/ds34bt/ee/libds34bt.h b/modules/ds34bt/ee/libds34bt.h new file mode 100644 index 000000000..9b29f50a8 --- /dev/null +++ b/modules/ds34bt/ee/libds34bt.h @@ -0,0 +1,34 @@ + +enum eDS34BTStatus { + DS34BT_STATE_USB_DISCONNECTED = 0x00, + DS34BT_STATE_USB_AUTHORIZED = 0x01, + DS34BT_STATE_USB_CONFIGURED = 0x02, + DS34BT_STATE_CONNECTED = 0x04, + DS34BT_STATE_RUNNING = 0x08, +}; + +typedef struct +{ + u8 hci_ver; //Version of the Current HCI in the BR/EDR Controller + u16 hci_rev; //Revision of the Current HCI in the BR/EDR Controller + u8 lmp_ver; //Version of the Current LMP or PAL in the Controller + u16 mf_name; //Manufacturer Name of the BR/EDR Controller + u16 lmp_subver; //Subversion of the Current LMP or PAL in the Controller + u16 vid; + u16 pid; + u16 rev; +} __attribute__((packed)) hci_information_t; + +int ds34bt_init(); +int ds34bt_deinit(); +int ds34bt_reinit_ports(u8 ports); +int ds34bt_init_charging(); +int ds34bt_get_status(int port); +int ds34bt_get_bdaddr(u8 *bdaddr); +int ds34bt_set_rumble(int port, u8 lrum, u8 rrum); +int ds34bt_set_led(int port, u8 *led); //rgb for ds4 +int ds34bt_get_data(int port, u8 *data); +int ds34bt_reset(); +int ds34bt_get_version(hci_information_t *info); +int ds34bt_get_features(u8 *info); + diff --git a/modules/ds3bt/iop/Makefile b/modules/ds34bt/iop/Makefile similarity index 54% rename from modules/ds3bt/iop/Makefile rename to modules/ds34bt/iop/Makefile index a0ae37ed9..a3cf72360 100644 --- a/modules/ds3bt/iop/Makefile +++ b/modules/ds34bt/iop/Makefile @@ -1,10 +1,10 @@ -IOP_BIN = ds3bt.irx +IOP_BIN = ds34bt.irx IOP_INCS += -IOP_CFLAGS += -Wall +IOP_CFLAGS += -Wall -fno-builtin IOP_LDFLAGS += -s -IOP_OBJS = ds3bt.o smsutils.o imports.o +IOP_OBJS = ds34bt.o smsutils.o imports.o IOP_LIBS = all: $(IOP_BIN) @@ -15,4 +15,4 @@ clean: rebuild: clean all include $(PS2SDK)/Defs.make -include $(PS2SDK)/samples/Makefile.iopglobal +include ../../Rules.make diff --git a/modules/ds34bt/iop/ds34bt.c b/modules/ds34bt/iop/ds34bt.c new file mode 100644 index 000000000..bf2ad8891 --- /dev/null +++ b/modules/ds34bt/iop/ds34bt.c @@ -0,0 +1,1704 @@ + +/* based on https://github.com/IonAgorria/Arduino-PSRemote */ +/* and https://github.com/felis/USB_Host_Shield_2.0 */ + +#include "types.h" +#include "loadcore.h" +#include "stdio.h" +#include "sifrpc.h" +#include "sysclib.h" +#include "usbd.h" +#include "usbd_macro.h" +#include "thbase.h" +#include "thsemap.h" +#include "ds34bt.h" + +IRX_ID("ds34bt", 1, 1); + +//#define DPRINTF(x...) printf(x) +#define DPRINTF(x...) + +static int bt_probe(int devId); +static int bt_connect(int devId); +static int bt_disconnect(int devId); +static void bt_config_set(int result, int count, void *arg); + +static UsbDriver bt_driver = {NULL, NULL, "ds34bt", bt_probe, bt_connect, bt_disconnect}; +static bt_device bt_dev = {-1, -1, -1, -1, -1, -1, DS34BT_STATE_USB_DISCONNECTED}; + +static int chrg_probe(int devId); +static int chrg_connect(int devId); +static int chrg_disconnect(int devId); +static int chrg_dev = -1; + +static UsbDriver chrg_driver = {NULL, NULL, "ds34chrg", chrg_probe, chrg_connect, chrg_disconnect}; + +static void ds34pad_clear(int pad); +static void ds34pad_init(); + +static int bt_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + UsbConfigDescriptor *config = NULL; + UsbInterfaceDescriptor *intf = NULL; + + DPRINTF("DS34BT: probe: devId=%i\n", devId); + + if ((bt_dev.devId > 0) && (bt_dev.status & DS34BT_STATE_USB_AUTHORIZED)) { + DPRINTF("DS34BT: Error - only one device allowed !\n"); + return 0; + } + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("DS34BT: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->bNumConfigurations < 1) + return 0; + + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + if (config == NULL) { + DPRINTF("DS34BT: Error - Couldn't get configuration descriptor\n"); + return 0; + } + + if ((config->bNumInterfaces < 1) || (config->wTotalLength < (sizeof(UsbConfigDescriptor) + sizeof(UsbInterfaceDescriptor)))) { + DPRINTF("DS34BT: Error - No interfaces available\n"); + return 0; + } + + intf = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + DPRINTF("DS34BT: bInterfaceClass %X bInterfaceSubClass %X bInterfaceProtocol %X\n", intf->bInterfaceClass, intf->bInterfaceSubClass, intf->bInterfaceProtocol); + + if ((intf->bInterfaceClass != USB_CLASS_WIRELESS_CONTROLLER) || + (intf->bInterfaceSubClass != USB_SUBCLASS_RF_CONTROLLER) || + (intf->bInterfaceProtocol != USB_PROTOCOL_BLUETOOTH_PROG) || + (intf->bNumEndpoints < 3)) { + return 0; + } + + return 1; +} + +static int bt_connect(int devId) +{ + int epCount; + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + UsbInterfaceDescriptor *interface; + UsbEndpointDescriptor *endpoint; + + DPRINTF("DS34BT: connect: devId=%i\n", devId); + + if (bt_dev.devId != -1) { + DPRINTF("DS34BT: Error - only one device allowed !\n"); + return 1; + } + + bt_dev.status = DS34BT_STATE_USB_DISCONNECTED; + + bt_dev.interruptEndp = -1; + bt_dev.inEndp = -1; + bt_dev.outEndp = -1; + + bt_dev.controlEndp = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + bt_dev.vid = device->idVendor; + bt_dev.pid = device->idProduct; + bt_dev.rev = device->bcdDevice; + + epCount = interface->bNumEndpoints - 1; + + DPRINTF("DS34BT: Endpoint Count %d \n", epCount + 1); + + endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); + + do { + + if (endpoint->bmAttributes == USB_ENDPOINT_XFER_BULK) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && bt_dev.outEndp < 0) { + bt_dev.outEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("DS34BT: register Output endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.outEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } else if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.inEndp < 0) { + bt_dev.inEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("DS34BT: register Input endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.inEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + } else if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.interruptEndp < 0) { + bt_dev.interruptEndp = UsbOpenEndpoint(devId, endpoint); + DPRINTF("DS34BT: register Interrupt endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.interruptEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + } + + endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); + + } while (epCount--); + + if (bt_dev.interruptEndp < 0 || bt_dev.inEndp < 0 || bt_dev.outEndp < 0) { + DPRINTF("DS34BT: Error - connect failed: not enough endpoints! \n"); + return -1; + } + + bt_dev.devId = devId; + bt_dev.status = DS34BT_STATE_USB_AUTHORIZED; + + UsbSetDeviceConfiguration(bt_dev.controlEndp, config->bConfigurationValue, bt_config_set, NULL); + + return 0; +} + +static int bt_disconnect(int devId) +{ + DPRINTF("DS34BT: disconnect: devId=%i\n", devId); + + if (bt_dev.status & DS34BT_STATE_USB_AUTHORIZED) { + + if (bt_dev.interruptEndp >= 0) + UsbCloseEndpoint(bt_dev.interruptEndp); + + if (bt_dev.inEndp >= 0) + UsbCloseEndpoint(bt_dev.inEndp); + + if (bt_dev.outEndp >= 0) + UsbCloseEndpoint(bt_dev.outEndp); + + bt_dev.devId = -1; + bt_dev.interruptEndp = -1; + bt_dev.inEndp = -1; + bt_dev.outEndp = -1; + bt_dev.controlEndp = -1; + bt_dev.status = DS34BT_STATE_USB_DISCONNECTED; + + ds34pad_init(); + SignalSema(bt_dev.hid_sema); + } + + return 0; +} + +int chrg_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + + DPRINTF("DS34CHRG: probe: devId=%i\n", devId); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("DS34CHRG: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->idVendor == DS34_VID && (device->idProduct == DS3_PID || device->idProduct == DS4_PID || device->idProduct == DS4_PID_SLIM)) + return 1; + + return 0; +} + +int chrg_connect(int devId) +{ + int chrg_end; + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + + DPRINTF("DS34CHRG: connect: devId=%i\n", devId); + + if (chrg_dev != -1) { + DPRINTF("DS34CHRG: Error - only one device allowed !\n"); + return 1; + } + + chrg_dev = devId; + + chrg_end = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + + UsbSetDeviceConfiguration(chrg_end, config->bConfigurationValue, NULL, NULL); + + return 0; +} + +int chrg_disconnect(int devId) +{ + DPRINTF("DS34CHRG: disconnect: devId=%i\n", devId); + + chrg_dev = -1; + + return 0; +} + +static u8 output_01_report[] = + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; + +static u8 led_patterns[][2] = + { + {0x1C, 0x02}, + {0x1A, 0x04}, + {0x16, 0x08}, + {0x0E, 0x10}, +}; + +static u8 power_level[] = + { + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; + +static u8 rgbled_patterns[][2][3] = + { + {{0x00, 0x00, 0x10}, {0x00, 0x00, 0x7F}}, // light blue/blue + {{0x00, 0x10, 0x00}, {0x00, 0x7F, 0x00}}, // light green/green/ + {{0x10, 0x10, 0x00}, {0x7F, 0x7F, 0x00}}, // light yellow/yellow + {{0x00, 0x10, 0x10}, {0x00, 0x7F, 0x7F}}, // light cyan/cyan +}; + +static u8 link_key[] = //for ds4 authorisation + { + 0x56, 0xE8, 0x81, 0x38, 0x08, 0x06, 0x51, 0x41, + 0xC0, 0x7F, 0x12, 0xAA, 0xD9, 0x66, 0x3C, 0xCE +}; + +// Taken from nefarius' SCPToolkit +// https://github.com/nefarius/ScpToolkit/blob/master/ScpControl/ScpControl.ini +// Valid MAC addresses used by Sony +static u8 GenuineMacAddress[][3] = + { + // Bluetooth chips by ALPS ELECTRIC CO., LTD + {0x00, 0x02, 0xC7}, + {0x00, 0x06, 0xF5}, + {0x00, 0x06, 0xF7}, + {0x00, 0x07, 0x04}, + {0x00, 0x16, 0xFE}, + {0x00, 0x19, 0xC1}, + {0x00, 0x1B, 0xFB}, + {0x00, 0x1E, 0x3D}, + {0x00, 0x21, 0x4F}, + {0x00, 0x23, 0x06}, + {0x00, 0x24, 0x33}, + {0x00, 0x26, 0x43}, + {0x00, 0xA0, 0x79}, + {0x04, 0x76, 0x6E}, + {0x04, 0x98, 0xF3}, + {0x28, 0xA1, 0x83}, + {0x34, 0xC7, 0x31}, + {0x38, 0xC0, 0x96}, + {0x60, 0x38, 0x0E}, + {0x64, 0xD4, 0xBD}, + {0xAC, 0x7A, 0x4D}, + {0xE0, 0x75, 0x0A}, + {0xE0, 0xAE, 0x5E}, + {0xFC, 0x62, 0xB9}, + // Bluetooth chips by AzureWave Technology Inc. + {0xE0, 0xB9, 0xA5}, + {0xDC, 0x85, 0xDE}, + {0xD0, 0xE7, 0x82}, + {0xB0, 0xEE, 0x45}, + {0xAC, 0x89, 0x95}, + {0xA8, 0x1D, 0x16}, + {0x94, 0xDB, 0xC9}, + {0x80, 0xD2, 0x1D}, + {0x80, 0xA5, 0x89}, + {0x78, 0x18, 0x81}, + {0x74, 0xF0, 0x6D}, + {0x74, 0xC6, 0x3B}, + {0x74, 0x2F, 0x68}, + {0x6C, 0xAD, 0xF8}, + {0x6C, 0x71, 0xD9}, + {0x60, 0x5B, 0xB4}, + {0x5C, 0x96, 0x56}, + {0x54, 0x27, 0x1E}, + {0x4C, 0xAA, 0x16}, + {0x48, 0x5D, 0x60}, + {0x44, 0xD8, 0x32}, + {0x40, 0xE2, 0x30}, + {0x38, 0x4F, 0xF0}, + {0x28, 0xC2, 0xDD}, + {0x24, 0x0A, 0x64}, + {0x1C, 0x4B, 0xD6}, + {0x08, 0xA9, 0x5A}, + {0x00, 0x25, 0xD3}, + {0x00, 0x24, 0x23}, + {0x00, 0x22, 0x43}, + {0x00, 0x15, 0xAF}, + //fake with AirohaTechnologyCorp's Chip + {0x0C, 0xFC, 0x83}}; + +#define REQ_HCI_OUT (USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_DEVICE) +#define HCI_COMMAND_REQ 0 + +#define MAX_PADS 2 + +static u8 bt_bdaddr[6]; //usb bt adapter mac address +static hci_information_t bt_version; //bt adapter version information +static u8 bt_features[8]; //bt adapter supported features + +static u8 hci_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; +static u8 l2cap_buf[MAX_BUFFER_SIZE + 32] __attribute((aligned(4))) = {0}; +static u8 hci_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; +static u8 l2cap_cmd_buf[MAX_BUFFER_SIZE + 32] __attribute((aligned(4))) = {0}; + +static u8 identifier; +static u8 press_emu; +static u8 disable_fake = 0; + +static ds34bt_pad_t ds34pad[MAX_PADS]; + +static void hci_event_cb(int resultCode, int bytes, void *arg); +static void l2cap_event_cb(int resultCode, int bytes, void *arg); + +static void ds34pad_init(); + +static int hid_initDS34(int pad); +static int hid_LEDRumble(u8 *led, u8 lrum, u8 rrum, int pad); +static void hid_readReport(u8 *data, int bytes, int pad); + +static int l2cap_connection_request(u16 handle, u8 rxid, u16 scid, u16 psm); +static int hci_reset(); + +static void bt_config_set(int result, int count, void *arg) +{ + PollSema(bt_dev.hid_sema); + + UsbInterruptTransfer(bt_dev.interruptEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, NULL); + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + + ds34pad_init(); + hci_reset(); + + SignalSema(bt_dev.hid_sema); +} + +/************************************************************/ +/* HCI Commands */ +/************************************************************/ + +static int HCI_Command(int nbytes, u8 *dataptr) +{ + return UsbControlTransfer(bt_dev.controlEndp, REQ_HCI_OUT, HCI_COMMAND_REQ, 0, 0, nbytes, dataptr, NULL, NULL); +} + +static int hci_reset() +{ + hci_cmd_buf[0] = HCI_OCF_RESET; + hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; + hci_cmd_buf[2] = 0x00; // Parameter Total Length = 0 + + return HCI_Command(3, hci_cmd_buf); +} + +static int hci_write_scan_enable(u8 conf) +{ + hci_cmd_buf[0] = HCI_OCF_WRITE_SCAN_ENABLE; + hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; + hci_cmd_buf[2] = 0x01; + hci_cmd_buf[3] = conf; + + return HCI_Command(4, hci_cmd_buf); +} + +static int hci_accept_connection(u8 *bdaddr) +{ + hci_cmd_buf[0] = HCI_OCF_ACCEPT_CONNECTION; // HCI OCF = 9 + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x07; // parameter length 7 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + hci_cmd_buf[9] = 0x01; //switch role to (slave = 1 / master = 0) + + return HCI_Command(10, hci_cmd_buf); +} + +static int hci_remote_name(u8 *bdaddr) +{ + hci_cmd_buf[0] = HCI_OCF_REMOTE_NAME; // HCI OCF = 19 + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x0A; // parameter length = 10 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + hci_cmd_buf[9] = 0x01; // Page Scan Repetition Mode + hci_cmd_buf[10] = 0x00; // Reserved + hci_cmd_buf[11] = 0x00; // Clock offset - low byte + hci_cmd_buf[12] = 0x00; // Clock offset - high byte + + return HCI_Command(13, hci_cmd_buf); +} + +static int hci_reject_connection(u8 *bdaddr) +{ + hci_cmd_buf[0] = HCI_OCF_REJECT_CONNECTION; // HCI OCF = A + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x07; // parameter length 7 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + hci_cmd_buf[9] = 0x09; //reason max connection + + return HCI_Command(10, hci_cmd_buf); +} + +static int hci_disconnect(u16 handle) +{ + hci_cmd_buf[0] = HCI_OCF_DISCONNECT; // HCI OCF = 6 + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x03; // parameter length = 3 + hci_cmd_buf[3] = (u8)(handle & 0xFF); // connection handle - low byte + hci_cmd_buf[4] = (u8)((handle >> 8) & 0x0F); // connection handle - high byte + hci_cmd_buf[5] = 0x13; // reason + + return HCI_Command(6, hci_cmd_buf); +} + +static int hci_change_connection_type(u16 handle) +{ + hci_cmd_buf[0] = HCI_OCF_CHANGE_CONNECTION_TYPE; + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; + hci_cmd_buf[2] = 0x04; // parameter length 4 + hci_cmd_buf[3] = (u8)(handle & 0xFF); // connection handle - low byte + hci_cmd_buf[4] = (u8)((handle >> 8) & 0x0F); // connection handle - high byte + hci_cmd_buf[5] = 0x18; // Packet Type: 0xcc18 + hci_cmd_buf[6] = 0xcc; + + return HCI_Command(7, hci_cmd_buf); +} + +static int hci_read_bdaddr() +{ + hci_cmd_buf[0] = HCI_OCF_READ_BDADDR; // HCI OCF = 9 + hci_cmd_buf[1] = HCI_OGF_INFO_PARAM; // HCI OGF = 4 + hci_cmd_buf[2] = 0x00; + + return HCI_Command(3, hci_cmd_buf); +} + +static int hci_read_local_version_information() +{ + hci_cmd_buf[0] = HCI_OCF_READ_VERSION; // HCI OCF = 9 + hci_cmd_buf[1] = HCI_OGF_INFO_PARAM; // HCI OGF = 4 + hci_cmd_buf[2] = 0x00; + + return HCI_Command(3, hci_cmd_buf); +} + +static int hci_read_local_supported_features() +{ + hci_cmd_buf[0] = HCI_OCF_READ_FEATURES; // HCI OCF = 9 + hci_cmd_buf[1] = HCI_OGF_INFO_PARAM; // HCI OGF = 4 + hci_cmd_buf[2] = 0x00; + + return HCI_Command(3, hci_cmd_buf); +} + +static int hci_link_key_request_reply(u8 *bdaddr) +{ + hci_cmd_buf[0] = HCI_OCF_LINK_KEY_REQUEST_REPLY; // HCI OCF = 0E + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x06 + sizeof(link_key); // parameter length 6 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + + mips_memcpy(&hci_cmd_buf[9], link_key, sizeof(link_key)); + + return HCI_Command(9 + sizeof(link_key), hci_cmd_buf); +} + +static void HCI_event_task(int result) +{ + int i, pad; + + if (!result) { + /* buf[0] = Event Code */ + /* buf[1] = Parameter Total Length */ + /* buf[n] = Event Parameters based on each event */ + DPRINTF("HCI event = 0x%02X \n", hci_buf[0]); + switch (hci_buf[0]) { // switch on event type + case HCI_EVENT_COMMAND_COMPLETE: + DPRINTF("HCI Command Complete = 0x%02X \n", hci_buf[3]); + DPRINTF("\tReturned = 0x%02X \n", hci_buf[5]); + if ((hci_buf[3] == HCI_OCF_RESET) && (hci_buf[4] == HCI_OGF_CTRL_BBAND)) { + if (hci_buf[5] == 0) { + hci_read_bdaddr(); + } else { + DelayThread(500); + hci_reset(); + } + } else if ((hci_buf[3] == HCI_OCF_READ_BDADDR) && (hci_buf[4] == HCI_OGF_INFO_PARAM)) { + if (hci_buf[5] == 0) { + mips_memcpy(bt_bdaddr, &hci_buf[6], 6); + hci_read_local_version_information(); + } else { + DelayThread(500); + hci_reset(); + } + } else if ((hci_buf[3] == HCI_OCF_READ_VERSION) && (hci_buf[4] == HCI_OGF_INFO_PARAM)) { + if (hci_buf[5] == 0) { + mips_memcpy(&bt_version, &hci_buf[6], sizeof(hci_information_t)); + hci_read_local_supported_features(); + } else { + DelayThread(500); + hci_reset(); + } + } else if ((hci_buf[3] == HCI_OCF_READ_FEATURES) && (hci_buf[4] == HCI_OGF_INFO_PARAM)) { + if (hci_buf[5] == 0) { + mips_memcpy(bt_features, &hci_buf[6], sizeof(bt_features)); + hci_write_scan_enable(SCAN_ENABLE_NOINQ_ENPAG); + } else { + DelayThread(500); + hci_reset(); + } + } else if((hci_buf[3] == HCI_OCF_WRITE_SCAN_ENABLE) && (hci_buf[4] == HCI_OGF_CTRL_BBAND)) { + if (hci_buf[5] == 0) { + bt_dev.status |= DS34BT_STATE_USB_CONFIGURED; + } else { + DelayThread(500); + hci_reset(); + } + } + break; + + case HCI_EVENT_COMMAND_STATUS: + if (hci_buf[2]) // show status on serial if not OK + { + DPRINTF("HCI Command Failed: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + DPRINTF("\t Command_OpCode(OGF) = 0x%02X \n", ((hci_buf[5] & 0xFC) >> 2)); + DPRINTF("\t Command_OpCode(OCF) = 0x%02X 0x%02X \n", (hci_buf[5] & 0x03), hci_buf[4]); + } + break; + + case HCI_EVENT_CONNECT_COMPLETE: + DPRINTF("HCI event Connect Complete: \n"); + if (!hci_buf[2]) // check if connected OK + { + DPRINTF("\t Connection_Handle 0x%02X \n", hci_buf[3] | ((hci_buf[4] & 0x0F) << 8)); + DPRINTF("\t Requested by BD_ADDR: \n\t"); + for (i = 0; i < 6; i++) { + DPRINTF("0x%02X", hci_buf[5 + i]); + if (i < 5) + DPRINTF(":"); + } + DPRINTF("\n"); + for (i = 0; i < MAX_PADS; i++) { + if (strncmp(ds34pad[i].bdaddr, hci_buf + 5, 6) == 0) { + // store the handle for the ACL connection + ds34pad[i].hci_handle = hci_buf[3] | ((hci_buf[4] & 0x0F) << 8); + break; + } + } + if (i >= MAX_PADS) { + break; + } + pad_status_set(DS34BT_STATE_CONNECTED, i); + hci_remote_name(ds34pad[i].bdaddr); + } else { + DPRINTF("\t Error 0x%02X \n", hci_buf[2]); + } + break; + + case HCI_EVENT_NUM_COMPLETED_PKT: + DPRINTF("HCI Number Of Completed Packets Event: \n"); + DPRINTF("\t Number_of_Handles = 0x%02X \n", hci_buf[2]); + for (i = 0; i < hci_buf[2]; i++) { + DPRINTF("\t Connection_Handle = 0x%04X \n", (hci_buf[3 + i] | ((hci_buf[4 + i] & 0x0F) << 8))); + } + break; + + case HCI_EVENT_QOS_SETUP_COMPLETE: + break; + + case HCI_EVENT_DISCONN_COMPLETE: + DPRINTF("HCI Disconnection Complete Event: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + DPRINTF("\t Connection_Handle = 0x%04X \n", (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))); + DPRINTF("\t Reason = 0x%02X \n", hci_buf[5]); + for (i = 0; i < MAX_PADS; i++) { //detect pad + if (ds34pad[i].hci_handle == (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))) { + break; + } + } + ds34pad_clear(i); + break; + + case HCI_EVENT_AUTHENTICATION_COMPLETE: + DPRINTF("HCI Authentication Complete Event: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + DPRINTF("\t Connection_Handle = 0x%04X \n", (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))); + if (!hci_buf[2]) { + DPRINTF("\t Success \n"); + } else { + DPRINTF("\t Failed \n"); + } + break; + + case HCI_EVENT_REMOTE_NAME_COMPLETE: + DPRINTF("HCI Remote Name Requested Complete Event: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + if (!hci_buf[2]) { + for (i = 0; i < MAX_PADS; i++) { + if (strncmp(ds34pad[i].bdaddr, hci_buf + 3, 6) == 0) { + break; + } + } + if (i >= MAX_PADS) { + break; + } + if (strncmp(hci_buf + 9, "Wireless Controller", 19) == 0) { + ds34pad[i].type = DS4; + ds34pad[i].isfake = 0; + DPRINTF("\t Type: Dualshock 4 \n"); + } else { + ds34pad[i].type = DS3; + DPRINTF("\t Type: Dualshock 3 \n"); + } + hci_change_connection_type(ds34pad[i].hci_handle); + if (ds34pad[i].type == DS4) { + identifier++; + l2cap_connection_request(ds34pad[i].hci_handle, identifier, 0x0070, L2CAP_PSM_CTRL); + } + } + break; + + case HCI_EVENT_ENCRYPTION_CHANGE: + DPRINTF("HCI Encryption Change Event: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + DPRINTF("\t Connection_Handle = 0x%04X \n", (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))); + DPRINTF("\t Encryption_Enabled = 0x%02X \n", hci_buf[5]); + break; + + case HCI_EVENT_CONNECT_REQUEST: + DPRINTF("HCI Connection Requested by BD_ADDR: \n\t"); + for (i = 0; i < 6; i++) { + DPRINTF("0x%02X", hci_buf[2 + i]); + if (i < 5) + DPRINTF(":"); + } + DPRINTF("\n\t Link = 0x%02X \n", hci_buf[11]); + DPRINTF("\t Class = 0x%02X 0x%02X 0x%02X \n", hci_buf[8], hci_buf[9], hci_buf[10]); + for (i = 0; i < MAX_PADS; i++) //find free slot + { + if (!pad_status_check(DS34BT_STATE_RUNNING, i) && ds34pad[i].enabled) { + if (pad_status_check(DS34BT_STATE_CONNECTED, i)) { + if (pad_status_check(DS34BT_STATE_DISCONNECTING, i)) //if we're waiting for hci disconnect event + continue; + else + hci_disconnect(ds34pad[i].hci_handle); //try to disconnect + } + break; + } + } + if (i >= MAX_PADS) //no free slot + { + hci_reject_connection(hci_buf + 2); + break; + } + pad = i; + mips_memcpy(ds34pad[pad].bdaddr, hci_buf + 2, 6); + ds34pad[pad].isfake = 0; + if (!disable_fake) { + ds34pad[pad].isfake = 1; //fake ds3 + for (i = 0; i < sizeof(GenuineMacAddress) / 3; i++) //check if ds3 is genuine + { + if (ds34pad[pad].bdaddr[5] == GenuineMacAddress[i][0] && + ds34pad[pad].bdaddr[4] == GenuineMacAddress[i][1] && + ds34pad[pad].bdaddr[3] == GenuineMacAddress[i][2]) { + ds34pad[pad].isfake = 0; + break; + } + } + } + pad_status_clear(DS34BT_STATE_CONNECTED, pad); + pad_status_clear(DS34BT_STATE_RUNNING, pad); + pad_status_clear(DS34BT_STATE_DISCONNECTING, pad); + hci_accept_connection(ds34pad[pad].bdaddr); + break; + + case HCI_EVENT_ROLE_CHANGED: + DPRINTF("HCI Role Change Event: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + DPRINTF("\t BD_ADDR: "); + for (i = 0; i < 6; i++) { + DPRINTF("0x%02X", hci_buf[3 + i]); + if (i < 5) + DPRINTF(":"); + } + DPRINTF("\n\t Role 0x%02X \n", hci_buf[9]); + break; + + case HCI_EVENT_MAX_SLOT_CHANGE: + DPRINTF("HCI Max Slot Change Event: \n"); + DPRINTF("\t Connection_Handle = 0x%x \n", (hci_buf[2] | ((hci_buf[3] & 0x0F) << 8))); + DPRINTF("\t LMP Max Slots = 0x%x \n", hci_buf[5]); + break; + + case HCI_EVENT_PIN_CODE_REQUEST: + DPRINTF("HCI Pin Code Request Event \n"); + break; + + case HCI_EVENT_LINK_KEY_REQUEST: + DPRINTF("HCI Link Key Request Event by BD_ADDR: \n\t"); + for (i = 0; i < 6; i++) { + DPRINTF("0x%02X", hci_buf[2 + i]); + if (i < 5) + DPRINTF(":"); + } + DPRINTF("\n"); + hci_link_key_request_reply(hci_buf + 2); + break; + + case HCI_EVENT_CHANGED_CONNECTION_TYPE: + DPRINTF("Packet Type Changed STATUS: 0x%x \n", hci_buf[2]); + DPRINTF("\t Type = %x \n", (hci_buf[5] | (hci_buf[6] << 8))); + break; + + case HCI_EVENT_PAGE_SR_CHANGED: + break; + + default: + DPRINTF("Unmanaged Event: 0x%02X \n", hci_buf[0]); + break; + } // switch (buf[0]) + } +} + +static void ds34pad_clear(int pad) +{ + if (pad >= MAX_PADS) + return; + + ds34pad[pad].hci_handle = 0x0FFF; + ds34pad[pad].control_scid = 0; + ds34pad[pad].interrupt_scid = 0; + mips_memset(ds34pad[pad].bdaddr, 0, 6); + ds34pad[pad].status = bt_dev.status; + ds34pad[pad].isfake = 0; + ds34pad[pad].type = 0; + ds34pad[pad].data[0] = 0xFF; + ds34pad[pad].data[1] = 0xFF; + mips_memset(&ds34pad[pad].data[2], 0x7F, 4); + mips_memset(&ds34pad[pad].data[6], 0x00, 12); +} + +static void ds34pad_init() +{ + int i; + + for (i = 0; i < MAX_PADS; i++) { + ds34pad_clear(i); + } + + press_emu = 0; + identifier = 0; +} + +static void hci_event_cb(int resultCode, int bytes, void *arg) +{ + PollSema(bt_dev.hid_sema); + HCI_event_task(resultCode); + UsbInterruptTransfer(bt_dev.interruptEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, NULL); + SignalSema(bt_dev.hid_sema); +} + +/************************************************************/ +/* L2CAP Commands */ +/************************************************************/ + +static int L2CAP_Command(u16 handle, u8 *data, u8 length) +{ + l2cap_cmd_buf[0] = (u8)(handle & 0xff); // HCI handle with PB,BC flag + l2cap_cmd_buf[1] = (u8)(((handle >> 8) & 0x0f) | 0x20); + l2cap_cmd_buf[2] = (u8)((4 + length) & 0xff); // HCI ACL total data length + l2cap_cmd_buf[3] = (u8)((4 + length) >> 8); + l2cap_cmd_buf[4] = (u8)(length & 0xff); // L2CAP header: Length + l2cap_cmd_buf[5] = (u8)(length >> 8); + l2cap_cmd_buf[6] = 0x01; // L2CAP header: Channel ID + l2cap_cmd_buf[7] = 0x00; // L2CAP Signalling channel over ACL-U logical link + + mips_memcpy(&l2cap_cmd_buf[8], data, length); + + // output on endpoint 2 + return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), NULL, NULL); +} + +static int l2cap_connection_request(u16 handle, u8 rxid, u16 scid, u16 psm) +{ + u8 cmd_buf[8]; + + cmd_buf[0] = L2CAP_CMD_CONNECTION_REQUEST; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x04; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(psm & 0xff); // PSM + cmd_buf[5] = (u8)(psm >> 8); + cmd_buf[6] = (u8)(scid & 0xff); // Source CID (PS Remote) + cmd_buf[7] = (u8)(scid >> 8); + + return L2CAP_Command(handle, cmd_buf, 8); +} + +static int l2cap_connection_response(u16 handle, u8 rxid, u16 dcid, u16 scid, u8 result) +{ + u8 cmd_buf[12]; + + cmd_buf[0] = L2CAP_CMD_CONNECTION_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x08; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(dcid & 0xff); // Destination CID (Our) + cmd_buf[5] = (u8)(dcid >> 8); + cmd_buf[6] = (u8)(scid & 0xff); // Source CID (PS Remote) + cmd_buf[7] = (u8)(scid >> 8); + cmd_buf[8] = result; // Result + cmd_buf[9] = 0x00; + cmd_buf[10] = 0x00; // Status + cmd_buf[11] = 0x00; + + if (result != 0) + cmd_buf[10] = 0x01; // Authentication pending + + return L2CAP_Command(handle, cmd_buf, 12); +} + +static int l2cap_config_request(u16 handle, u8 rxid, u16 dcid) +{ + u8 cmd_buf[12]; + + cmd_buf[0] = L2CAP_CMD_CONFIG_REQUEST; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x08; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(dcid & 0xff); // Destination CID + cmd_buf[5] = (u8)(dcid >> 8); + cmd_buf[6] = 0x00; // Flags + cmd_buf[7] = 0x00; + cmd_buf[8] = 0x01; // Config Opt: type = MTU (Maximum Transmission Unit) + cmd_buf[9] = 0x02; // Config Opt: length + //cmd_buf[10] = 0x96; // Config Opt: data + //cmd_buf[11] = 0x00; + + //this setting disable hid cmd reports from ds3 + cmd_buf[10] = 0xFF; // Config Opt: data + cmd_buf[11] = 0xFF; + + return L2CAP_Command(handle, cmd_buf, 12); +} + +static int l2cap_config_response(u16 handle, u8 rxid, u16 scid) +{ + u8 cmd_buf[14]; + + cmd_buf[0] = L2CAP_CMD_CONFIG_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x0A; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(scid & 0xff); // Source CID + cmd_buf[5] = (u8)(scid >> 8); + cmd_buf[6] = 0x00; // Result + cmd_buf[7] = 0x00; + cmd_buf[8] = 0x00; // Config + cmd_buf[9] = 0x00; + cmd_buf[10] = 0x01; // Config + cmd_buf[11] = 0x02; + cmd_buf[12] = 0xA0; + cmd_buf[13] = 0x02; + + return L2CAP_Command(handle, cmd_buf, 14); +} + +static int l2cap_disconnection_request(u16 handle, u8 rxid, u16 dcid, u16 scid) +{ + u8 cmd_buf[8]; + + cmd_buf[0] = L2CAP_CMD_DISCONNECT_REQUEST; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x04; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(dcid & 0xff); // Destination CID + cmd_buf[5] = (u8)(dcid >> 8); + cmd_buf[6] = (u8)(scid & 0xff); // Source CID + cmd_buf[7] = (u8)(scid >> 8); + + return L2CAP_Command(handle, cmd_buf, 8); +} + +static int l2cap_disconnection_response(u16 handle, u8 rxid, u16 scid, u16 dcid) +{ + u8 cmd_buf[8]; + + cmd_buf[0] = L2CAP_CMD_DISCONNECT_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x04; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(dcid & 0xff); // Destination CID + cmd_buf[5] = (u8)(dcid >> 8); + cmd_buf[6] = (u8)(scid & 0xff); // Source CID + cmd_buf[7] = (u8)(scid >> 8); + + return L2CAP_Command(handle, cmd_buf, 8); +} + +#define CMD_DELAY 2 + +static int L2CAP_event_task(int result, int bytes) +{ + int pad = -1; + u16 control_dcid = 0x0040; // Channel endpoint on command source + u16 interrupt_dcid = 0x0041; // Channel endpoint on interrupt source + + if (!result) { + for (pad = 0; pad < MAX_PADS; pad++) { + if (l2cap_handle_ok(ds34pad[pad].hci_handle)) + break; + } + + if (pad >= MAX_PADS) { + DPRINTF("L2CAP Wrong Handle = 0x%04X\n", ((l2cap_buf[0] | (l2cap_buf[1] << 8)))); + return pad; + } + + if (l2cap_handle_ok(ds34pad[pad].hci_handle)) { + if (ds34pad[pad].type == DS4) { + control_dcid = 0x0070; + interrupt_dcid = 0x0071; + } + + if (l2cap_control_channel) { + DPRINTF("L2CAP Signaling Command = 0x%02X, pad %d \n", l2cap_buf[8], pad); + + switch (l2cap_buf[8]) { + case L2CAP_CMD_COMMAND_REJECT: + DPRINTF("Command Reject ID = 0x%02X \n", l2cap_buf[9]); + DPRINTF("\t Reason = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF("\t DATA = 0x%04X \n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + break; + + case L2CAP_CMD_CONNECTION_REQUEST: + DPRINTF("Connection Request ID = 0x%02X \n", l2cap_buf[9]); + DPRINTF("\t PSM = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF("\t SCID = 0x%04X \n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_CTRL) { + ds34pad[pad].control_scid = l2cap_buf[14] | (l2cap_buf[15] << 8); + l2cap_connection_response(ds34pad[pad].hci_handle, l2cap_buf[9], control_dcid, ds34pad[pad].control_scid, PENDING); + DelayThread(CMD_DELAY); + l2cap_connection_response(ds34pad[pad].hci_handle, l2cap_buf[9], control_dcid, ds34pad[pad].control_scid, SUCCESSFUL); + DelayThread(CMD_DELAY); + identifier++; + l2cap_config_request(ds34pad[pad].hci_handle, identifier, ds34pad[pad].control_scid); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_INTR) { + ds34pad[pad].interrupt_scid = l2cap_buf[14] | (l2cap_buf[15] << 8); + l2cap_connection_response(ds34pad[pad].hci_handle, l2cap_buf[9], interrupt_dcid, ds34pad[pad].interrupt_scid, PENDING); + DelayThread(CMD_DELAY); + l2cap_connection_response(ds34pad[pad].hci_handle, l2cap_buf[9], interrupt_dcid, ds34pad[pad].interrupt_scid, SUCCESSFUL); + DelayThread(CMD_DELAY); + identifier++; + l2cap_config_request(ds34pad[pad].hci_handle, identifier, ds34pad[pad].interrupt_scid); + } + break; + + case L2CAP_CMD_CONNECTION_RESPONSE: + DPRINTF("Connection Response ID = 0x%02X \n", l2cap_buf[9]); + DPRINTF("\t PSM = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF("\t SCID = 0x%04X \n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + DPRINTF("\t RESULT = 0x%04X \n", (l2cap_buf[16] | (l2cap_buf[17] << 8))); + + if (((l2cap_buf[16] | (l2cap_buf[17] << 8)) == 0x0000) && ((l2cap_buf[18] | (l2cap_buf[19] << 8)) == 0x0000)) { + if ((l2cap_buf[14] | (l2cap_buf[15] << 8)) == control_dcid) { + ds34pad[pad].control_scid = l2cap_buf[12] | (l2cap_buf[13] << 8); + identifier++; + l2cap_config_request(ds34pad[pad].hci_handle, identifier, ds34pad[pad].control_scid); + } else if ((l2cap_buf[14] | (l2cap_buf[15] << 8)) == interrupt_dcid) { + ds34pad[pad].interrupt_scid = l2cap_buf[12] | (l2cap_buf[13] << 8); + identifier++; + l2cap_config_request(ds34pad[pad].hci_handle, identifier, ds34pad[pad].interrupt_scid); + } + } + break; + + case L2CAP_CMD_CONFIG_REQUEST: + DPRINTF("Configuration Request ID = 0x%02X \n", l2cap_buf[9]); + DPRINTF("\t LEN = 0x%04X \n", (l2cap_buf[10] | (l2cap_buf[11] << 8))); + DPRINTF("\t SCID = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF("\t FLAG = 0x%04X \n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == control_dcid) { + l2cap_config_response(ds34pad[pad].hci_handle, l2cap_buf[9], ds34pad[pad].control_scid); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_dcid) { + l2cap_config_response(ds34pad[pad].hci_handle, l2cap_buf[9], ds34pad[pad].interrupt_scid); + } + break; + + case L2CAP_CMD_CONFIG_RESPONSE: + DPRINTF("Configuration Response ID = 0x%02X \n", l2cap_buf[9]); + DPRINTF("\t LEN = 0x%04X \n", (l2cap_buf[10] | (l2cap_buf[11] << 8))); + DPRINTF("\t SCID = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF("\t FLAG = 0x%04X \n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + DPRINTF("\t RESULT = 0x%04X \n", (l2cap_buf[16] | (l2cap_buf[17] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == control_dcid) { + identifier++; + l2cap_connection_request(ds34pad[pad].hci_handle, identifier, interrupt_dcid, L2CAP_PSM_INTR); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_dcid) { + hid_initDS34(pad); + if (ds34pad[pad].type == DS3) { + ds34pad[pad].oldled[0] = led_patterns[pad][1]; + ds34pad[pad].oldled[3] = 0; + } else if (ds34pad[pad].type == DS4) { + ds34pad[pad].oldled[0] = rgbled_patterns[pad][1][0]; + ds34pad[pad].oldled[1] = rgbled_patterns[pad][1][1]; + ds34pad[pad].oldled[2] = rgbled_patterns[pad][1][2]; + ds34pad[pad].oldled[3] = 0; + } + DelayThread(CMD_DELAY); + hid_LEDRumble(ds34pad[pad].oldled, 0, 0, pad); + pad_status_set(DS34BT_STATE_RUNNING, pad); + } + break; + + case L2CAP_CMD_DISCONNECT_REQUEST: + DPRINTF("Disconnect Request SCID = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == control_dcid) { + pad_status_set(DS34BT_STATE_DISCONNECTING, pad); + l2cap_disconnection_response(ds34pad[pad].hci_handle, l2cap_buf[9], control_dcid, ds34pad[pad].control_scid); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_dcid) { + pad_status_set(DS34BT_STATE_DISCONNECTING, pad); + l2cap_disconnection_response(ds34pad[pad].hci_handle, l2cap_buf[9], interrupt_dcid, ds34pad[pad].interrupt_scid); + } + break; + + case L2CAP_CMD_DISCONNECT_RESPONSE: + DPRINTF("Disconnect Response SCID = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == ds34pad[pad].control_scid) { + pad_status_set(DS34BT_STATE_DISCONNECTING, pad); + hci_disconnect(ds34pad[pad].hci_handle); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == ds34pad[pad].interrupt_scid) { + pad_status_set(DS34BT_STATE_DISCONNECTING, pad); + identifier++; + l2cap_disconnection_request(ds34pad[pad].hci_handle, identifier, ds34pad[pad].control_scid, control_dcid); + } + break; + + default: + break; + } + } else if (l2cap_interrupt_channel) { + hid_readReport(l2cap_buf, bytes, pad); + } else if (l2cap_command_channel) { + DPRINTF("HID command status 0x%02X \n", l2cap_buf[8]); + pad = MAX_PADS; + } + } // acl_handle_ok + } // !rcode + + return pad; +} + +static void l2cap_event_cb(int resultCode, int bytes, void *arg) +{ + int ret; + u16 interrupt_dcid = 0x0041; + + PollSema(bt_dev.hid_sema); + + ret = L2CAP_event_task(resultCode, bytes); + + if (ret < MAX_PADS) { + if (pad_status_check(DS34BT_STATE_RUNNING, ret)) { + if (pad_status_check(DS34BT_STATE_DISCONNECT_REQUEST, ret)) { + if (!ds34pad[ret].isfake) { + if (ds34pad[ret].type == DS4) { + interrupt_dcid = 0x0071; + } + identifier++; + l2cap_disconnection_request(ds34pad[ret].hci_handle, identifier, ds34pad[ret].interrupt_scid, interrupt_dcid); + } else { + hci_disconnect(ds34pad[ret].hci_handle); + } + pad_status_clear(DS34BT_STATE_DISCONNECT_REQUEST, ret); + } else if (ds34pad[ret].update_rum) { + hid_LEDRumble(ds34pad[ret].oldled, ds34pad[ret].lrum, ds34pad[ret].rrum, ret); + ds34pad[ret].update_rum = 0; + } + } else { + if (!ds34pad[ret].isfake && ds34pad[ret].type == DS3) + DelayThread(42000); //fix for some bt adapters + } + } + + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, arg); + SignalSema(bt_dev.hid_sema); +} + +/************************************************************/ +/* HID Commands */ +/************************************************************/ + +static int HID_command(u16 handle, u16 scid, u8 *data, u8 length, int pad) +{ + l2cap_cmd_buf[0] = (u8)(handle & 0xff); // HCI handle with PB,BC flag + l2cap_cmd_buf[1] = (u8)(((handle >> 8) & 0x0f) | 0x20); + l2cap_cmd_buf[2] = (u8)((4 + length) & 0xff); // HCI ACL total data length + l2cap_cmd_buf[3] = (u8)((4 + length) >> 8); + l2cap_cmd_buf[4] = (u8)(length & 0xff); // L2CAP header: Length + l2cap_cmd_buf[5] = (u8)(length >> 8); + l2cap_cmd_buf[6] = (u8)(scid & 0xff); // L2CAP header: Channel ID + l2cap_cmd_buf[7] = (u8)(scid >> 8); + + mips_memcpy(&l2cap_cmd_buf[8], data, length); + + // output on endpoint 2 + return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), NULL, NULL); +} + +static int hid_initDS34(int pad) +{ + u8 init_buf[PS3_F4_REPORT_LEN + 2]; + u8 size = 2; + + if (ds34pad[pad].type == DS3) { + init_buf[0] = HID_THDR_SET_REPORT_FEATURE; // THdr + init_buf[1] = PS3_F4_REPORT_ID; // Report ID + init_buf[2] = 0x42; + init_buf[3] = 0x03; + init_buf[4] = 0x00; + init_buf[5] = 0x00; + size += PS3_F4_REPORT_LEN; + } else if(ds34pad[pad].type == DS4) { + init_buf[0] = HID_THDR_GET_REPORT_FEATURE; // THdr + init_buf[1] = PS4_02_REPORT_ID; // Report ID + } + + return HID_command(ds34pad[pad].hci_handle, ds34pad[pad].control_scid, init_buf, size, pad); +} + +static int hid_LEDRumble(u8 *led, u8 lrum, u8 rrum, int pad) +{ + u8 led_buf[PS4_11_REPORT_LEN + 2]; + u8 size = 2; + + if (ds34pad[pad].type == DS3) { + if (ds34pad[pad].isfake) + led_buf[0] = 0xA2; // THdr + else + led_buf[0] = HID_THDR_SET_REPORT_OUTPUT; // THdr + + led_buf[1] = PS3_01_REPORT_ID; // Report ID + + mips_memcpy(&led_buf[2], output_01_report, sizeof(output_01_report)); // PS3_01_REPORT_LEN); + + if (ds34pad[pad].isfake) { + if(rrum < 5) + rrum = 0; + } + + led_buf[3] = 0xFE; //rt + led_buf[4] = rrum; //rp + led_buf[5] = 0xFE; //lt + led_buf[6] = lrum; //lp + + led_buf[11] = led[0] & 0x7F; //LED Conf + + if (led[3]) //means charging, so blink + { + led_buf[15] = 0x32; + led_buf[20] = 0x32; + led_buf[25] = 0x32; + led_buf[30] = 0x32; + } + + size += sizeof(output_01_report); + } else if (ds34pad[pad].type == DS4) { + mips_memset(led_buf, 0, PS3_01_REPORT_LEN + 2); + + led_buf[0] = HID_THDR_SET_REPORT_OUTPUT; // THdr + led_buf[1] = PS4_11_REPORT_ID; // Report ID + led_buf[2] = 0x80; //update rate 1000Hz + led_buf[4] = 0xFF; + + led_buf[7] = rrum; + led_buf[8] = lrum; + + led_buf[9] = led[0]; //r + led_buf[10] = led[1]; //g + led_buf[11] = led[2]; //b + + if (led[3]) //means charging, so blink + { + led_buf[12] = 0x80; // Time to flash bright (255 = 2.5 seconds) + led_buf[13] = 0x80; // Time to flash dark (255 = 2.5 seconds) + } + + size += PS4_11_REPORT_LEN; + } + + ds34pad[pad].oldled[0] = led[0]; + ds34pad[pad].oldled[1] = led[1]; + ds34pad[pad].oldled[2] = led[2]; + ds34pad[pad].oldled[3] = led[3]; + ds34pad[pad].lrum = lrum; + ds34pad[pad].rrum = rrum; + + return HID_command(ds34pad[pad].hci_handle, ds34pad[pad].control_scid, led_buf, size, pad); +} + +static void hid_readReport(u8 *data, int bytes, int pad) +{ + if (data[8] == HID_THDR_DATA_INPUT) { + if (data[9] == PS3_01_REPORT_ID) { + struct ds3report *report; + + report = (struct ds3report *)&data[11]; + + if (report->RightStickX == 0 && report->RightStickY == 0) // ledrumble cmd causes null report sometime + return; + + ds34pad[pad].data[0] = ~report->ButtonStateL; + ds34pad[pad].data[1] = ~report->ButtonStateH; + + ds34pad[pad].data[2] = report->RightStickX; //rx + ds34pad[pad].data[3] = report->RightStickY; //ry + ds34pad[pad].data[4] = report->LeftStickX; //lx + ds34pad[pad].data[5] = report->LeftStickY; //ly + + if (bytes == 21 && !press_emu) + press_emu = 1; + + if (press_emu) { //needs emulating pressure buttons + ds34pad[pad].data[6] = report->Right * 255; //right + ds34pad[pad].data[7] = report->Left * 255; //left + ds34pad[pad].data[8] = report->Up * 255; //up + ds34pad[pad].data[9] = report->Down * 255; //down + + ds34pad[pad].data[10] = report->Triangle * 255; //triangle + ds34pad[pad].data[11] = report->Circle * 255; //circle + ds34pad[pad].data[12] = report->Cross * 255; //cross + ds34pad[pad].data[13] = report->Square * 255; //square + + ds34pad[pad].data[14] = report->L1 * 255; //L1 + ds34pad[pad].data[15] = report->R1 * 255; //R1 + ds34pad[pad].data[16] = report->L2 * 255; //L2 + ds34pad[pad].data[17] = report->R2 * 255; //R2 + + report->Power = 0x05; + } else { + ds34pad[pad].data[6] = report->PressureRight; //right + ds34pad[pad].data[7] = report->PressureLeft; //left + ds34pad[pad].data[8] = report->PressureUp; //up + ds34pad[pad].data[9] = report->PressureDown; //down + + ds34pad[pad].data[10] = report->PressureTriangle; //triangle + ds34pad[pad].data[11] = report->PressureCircle; //circle + ds34pad[pad].data[12] = report->PressureCross; //cross + ds34pad[pad].data[13] = report->PressureSquare; //square + + ds34pad[pad].data[14] = report->PressureL1; //L1 + ds34pad[pad].data[15] = report->PressureR1; //R1 + ds34pad[pad].data[16] = report->PressureL2; //L2 + ds34pad[pad].data[17] = report->PressureR2; //R2 + } + + if (report->PSButtonState && report->Power != 0xEE) //display battery level + ds34pad[pad].oldled[0] = power_level[report->Power]; + else + ds34pad[pad].oldled[0] = led_patterns[pad][1]; + + if (report->Power == 0xEE) //charging + ds34pad[pad].oldled[3] = 1; + else + ds34pad[pad].oldled[3] = 0; + + } else if(data[9] == PS4_11_REPORT_ID) { + struct ds4report *report; + u8 up = 0, down = 0, left = 0, right = 0; + + report = (struct ds4report *)&data[11]; + + switch(report->Dpad) { + case 0: up = 1; + break; + case 1: up = 1; right = 1; + break; + case 2: right = 1; + break; + case 3: down = 1; right = 1; + break; + case 4: down = 1; + break; + case 5: down = 1; left = 1; + break; + case 6: left = 1; + break; + case 7: up = 1; left = 1; + break; + case 8: up = 0; down = 0; left = 0; right = 0; + break; + } + + if (bytes > 63 && report->TPad) { + if (!report->Finger1Active) { + if (report->Finger1X < 960) + report->Share = 1; + else + report->Option = 1; + } + + if (!report->Finger2Active) { + if (report->Finger2X < 960) + report->Share = 1; + else + report->Option = 1; + } + } + + ds34pad[pad].data[0] = ~(report->Share | report->L3 << 1 | report->R3 << 2 | report->Option << 3 | up << 4 | right << 5 | down << 6 | left << 7); + ds34pad[pad].data[1] = ~(report->L2 | report->R2 << 1 | report->L1 << 2 | report->R1 << 3 | report->Triangle << 4 | report->Circle << 5 | report->Cross << 6 | report->Square << 7); + + ds34pad[pad].data[2] = report->RightStickX; //rx + ds34pad[pad].data[3] = report->RightStickY; //ry + ds34pad[pad].data[4] = report->LeftStickX; //lx + ds34pad[pad].data[5] = report->LeftStickY; //ly + + ds34pad[pad].data[6] = right * 255; //right + ds34pad[pad].data[7] = left * 255; //left + ds34pad[pad].data[8] = up * 255; //up + ds34pad[pad].data[9] = down * 255; //down + + ds34pad[pad].data[10] = report->Triangle * 255; //triangle + ds34pad[pad].data[11] = report->Circle * 255; //circle + ds34pad[pad].data[12] = report->Cross * 255; //cross + ds34pad[pad].data[13] = report->Square * 255; //square + + ds34pad[pad].data[14] = report->L1 * 255; //L1 + ds34pad[pad].data[15] = report->R1 * 255; //R1 + ds34pad[pad].data[16] = report->PressureL2; //L2 + ds34pad[pad].data[17] = report->PressureR2; //R2 + + if (report->PSButton) { //display battery level + ds34pad[pad].oldled[0] = report->Battery; + ds34pad[pad].oldled[1] = 0; + ds34pad[pad].oldled[2] = 0; + } else { + ds34pad[pad].oldled[0] = rgbled_patterns[pad][1][0]; + ds34pad[pad].oldled[1] = rgbled_patterns[pad][1][1]; + ds34pad[pad].oldled[2] = rgbled_patterns[pad][1][2]; + } + + if (report->Power != 0xB && report->Usb_plugged) //charging + ds34pad[pad].oldled[3] = 1; + else + ds34pad[pad].oldled[3] = 0; + } + } else { + DPRINTF("Unmanaged Input Report: THDR 0x%02X ", data[8]); + DPRINTF(" ID 0x%02X \n", data[9]); + } +} + +/************************************************************/ +/* DS34BT Commands */ +/************************************************************/ + +void ds34bt_set_rumble(u8 lrum, u8 rrum, int port) +{ + if (port >= MAX_PADS) + return; + + if (!(bt_dev.status & DS34BT_STATE_USB_AUTHORIZED)) + return; + + WaitSema(bt_dev.hid_sema); + + ds34pad[port].update_rum = 1; + ds34pad[port].lrum = lrum; + ds34pad[port].rrum = rrum; + + SignalSema(bt_dev.hid_sema); +} + +void ds34bt_set_led(u8 *led, int port) +{ + if (port >= MAX_PADS) + return; + + if (!(bt_dev.status & DS34BT_STATE_USB_AUTHORIZED)) + return; + + WaitSema(bt_dev.hid_sema); + + ds34pad[port].update_rum = 1; + ds34pad[port].oldled[0] = led[0]; + ds34pad[port].oldled[1] = led[1]; + ds34pad[port].oldled[2] = led[2]; + ds34pad[port].oldled[3] = led[3]; + + SignalSema(bt_dev.hid_sema); +} + +int ds34bt_get_bdaddr(u8 *data) +{ + if (!(bt_dev.status & DS34BT_STATE_USB_CONFIGURED)) + return 0; + + mips_memcpy(data, bt_bdaddr, 6); + + return 1; +} + +int ds34bt_get_ver(u8 *data) +{ + if (!(bt_dev.status & DS34BT_STATE_USB_CONFIGURED)) + return 0; + + bt_version.vid = bt_dev.vid; + bt_version.pid = bt_dev.pid; + bt_version.rev = bt_dev.rev; + + mips_memcpy(data, &bt_version, sizeof(hci_information_t)); + + return 1; +} + +int ds34bt_get_feat(u8 *data) +{ + if (!(bt_dev.status & DS34BT_STATE_USB_CONFIGURED)) + return 0; + + mips_memcpy(data, bt_features, sizeof(bt_features)); + + return 1; +} + +void ds34bt_get_data(char *dst, int size, int port) +{ + if (port >= MAX_PADS) + return; + + if (!(bt_dev.status & DS34BT_STATE_USB_AUTHORIZED)) + return; + + WaitSema(bt_dev.hid_sema); + + mips_memcpy(dst, ds34pad[port].data, size); + + SignalSema(bt_dev.hid_sema); +} + +void ds34bt_reset() +{ + int pad; + + if (!(bt_dev.status & DS34BT_STATE_USB_AUTHORIZED)) + return; + + for (pad = 0; pad < MAX_PADS; pad++) { + WaitSema(bt_dev.hid_sema); + pad_status_set(DS34BT_STATE_DISCONNECT_REQUEST, pad); + SignalSema(bt_dev.hid_sema); + while(1) { + DelayThread(500); + WaitSema(bt_dev.hid_sema); + if (!pad_status_check(DS34BT_STATE_RUNNING, pad)) { + SignalSema(bt_dev.hid_sema); + break; + } + SignalSema(bt_dev.hid_sema); + } + } + + DelayThread(1000000); +} + +int ds34bt_get_status(int port) +{ + int status = bt_dev.status; + + if ((status & DS34BT_STATE_USB_AUTHORIZED) && (port < MAX_PADS)) { + WaitSema(bt_dev.hid_sema); + status |= ds34pad[port].status; + SignalSema(bt_dev.hid_sema); + } + + return status; +} + +int ds34bt_init(u8 pads) +{ + int i; + + WaitSema(bt_dev.hid_sema); + + for(i = 0; i < MAX_PADS; i++) + ds34pad[i].enabled = (pads >> i) & 1; + + ds34pad_init(); + hci_reset(); + + SignalSema(bt_dev.hid_sema); + + return 1; +} + +static u8 chrg_inited = 0; + +void ds34bt_init_charging() +{ + int ret; + + if (!chrg_inited) { + ret = UsbRegisterDriver(&chrg_driver); + if (ret != USB_RC_OK) { + DPRINTF("DS34BT: Error registering charging 0x%02X \n", ret); + chrg_inited = 0; + } else { + chrg_inited = 1; + } + } +} + +static void rpc_thread(void *data); +static void *rpc_sf(int cmd, void *data, int size); + +static SifRpcDataQueue_t rpc_que __attribute__((aligned(16))); +static SifRpcServerData_t rpc_svr __attribute__((aligned(16))); + +static int rpc_buf[64] __attribute((aligned(16))); + +#define DS34BT_INIT 1 +#define DS34BT_INIT_CHARGING 2 +#define DS34BT_GET_STATUS 3 +#define DS34BT_GET_BDADDR 4 +#define DS34BT_SET_RUMBLE 5 +#define DS34BT_SET_LED 6 +#define DS34BT_GET_DATA 7 +#define DS34BT_RESET 8 +#define DS34BT_GET_VERSION 9 +#define DS34BT_GET_FEATURES 10 + +#define DS34BT_BIND_RPC_ID 0x18E3878F + +void rpc_thread(void *data) +{ + SifInitRpc(0); + SifSetRpcQueue(&rpc_que, GetThreadId()); + SifRegisterRpc(&rpc_svr, DS34BT_BIND_RPC_ID, rpc_sf, rpc_buf, NULL, NULL, &rpc_que); + SifRpcLoop(&rpc_que); +} + +void *rpc_sf(int cmd, void *data, int size) +{ + switch (cmd) { + case DS34BT_INIT: + ds34bt_init(*(u8 *)data); + break; + case DS34BT_INIT_CHARGING: + ds34bt_init_charging(); + break; + case DS34BT_GET_STATUS: + *(u8 *)data = ds34bt_get_status(*(u8 *)data); + break; + case DS34BT_GET_BDADDR: + *(u8 *)(data + 6) = ds34bt_get_bdaddr((u8 *)data); + break; + case DS34BT_SET_RUMBLE: + ds34bt_set_rumble(*(u8 *)(data + 1), *(u8 *)(data + 2), *(u8 *)data); + break; + case DS34BT_SET_LED: + ds34bt_set_led((u8 *)(data + 1), *(u8 *)data); + break; + case DS34BT_GET_DATA: + ds34bt_get_data((u8 *)data, 18, *(u8 *)data); + break; + case DS34BT_RESET: + ds34bt_reset(); + break; + case DS34BT_GET_VERSION: + *(u8 *)(data + sizeof(hci_information_t)) = ds34bt_get_ver((u8 *)data); + break; + case DS34BT_GET_FEATURES: + *(u8 *)(data + 8) = ds34bt_get_feat((u8 *)data); + break; + default: + break; + } + + return data; +} + +int _start(int argc, char *argv[]) +{ + int ret, i; + u8 enable = 0xFF; + + if (argc > 1) { + enable = argv[1][0]; + } + + for(i = 0; i < MAX_PADS; i++) + ds34pad[i].enabled = (enable >> i) & 1; + + ds34pad_init(); + + bt_dev.hid_sema = CreateMutex(IOP_MUTEX_UNLOCKED); + + if (bt_dev.hid_sema < 0) { + DPRINTF("DS34BT: Failed to allocate I/O semaphore.\n"); + return MODULE_NO_RESIDENT_END; + } + + ret = UsbRegisterDriver(&bt_driver); + + if (ret != USB_RC_OK) { + DPRINTF("DS34BT: Error registering BT devices 0x%02X \n", ret); + return MODULE_NO_RESIDENT_END; + } + + iop_thread_t rpc_th; + + rpc_th.attr = TH_C; + rpc_th.thread = rpc_thread; + rpc_th.priority = 40; + rpc_th.stacksize = 0x800; + rpc_th.option = 0; + + int thid = CreateThread(&rpc_th); + + if (thid > 0) { + StartThread(thid, NULL); + return MODULE_RESIDENT_END; + } + + return MODULE_NO_RESIDENT_END; +} diff --git a/modules/ds34bt/iop/ds34bt.h b/modules/ds34bt/iop/ds34bt.h new file mode 100644 index 000000000..983a39a72 --- /dev/null +++ b/modules/ds34bt/iop/ds34bt.h @@ -0,0 +1,371 @@ +#ifndef _DS34BT_H_ +#define _DS34BT_H_ + +#include "irx.h" + +#define USB_CLASS_WIRELESS_CONTROLLER 0xE0 +#define USB_SUBCLASS_RF_CONTROLLER 0x01 +#define USB_PROTOCOL_BLUETOOTH_PROG 0x01 + +#define DS34_VID 0x054C // Sony Corporation +#define DS3_PID 0x0268 // PS3 Controller +#define DS4_PID 0x05C4 // PS4 Controller +#define DS4_PID_SLIM 0x09CC // PS4 Slim Controller + +#define DS3 0 +#define DS4 1 + +#define MAX_BUFFER_SIZE 64 // Size of general purpose data buffer + +#define PENDING 1 +#define SUCCESSFUL 0 + +typedef struct +{ + int devId; + int hid_sema; + int controlEndp; + int interruptEndp; + int inEndp; + int outEndp; + u8 status; + u16 vid; + u16 pid; + u16 rev; +} bt_device; + +typedef struct +{ + u16 hci_handle; //hci connection handle + u16 control_scid; // Channel endpoint on command destination + u16 interrupt_scid; // Channel endpoint on interrupt destination + u8 hci_state; // current state of bluetooth HCI connection + u8 bdaddr[6]; + u8 enabled; + u8 status; + u8 isfake; + u8 type; //0 - ds3, 1 - ds4 + u8 oldled[4]; //rgb for ds4 and blink + u8 lrum; + u8 rrum; + u8 update_rum; + u8 data[18]; +} ds34bt_pad_t; + +typedef struct +{ + u8 hci_ver; //Version of the Current HCI in the BR/EDR Controller + u16 hci_rev; //Revision of the Current HCI in the BR/EDR Controller + u8 lmp_ver; //Version of the Current LMP or PAL in the Controller + u16 mf_name; //Manufacturer Name of the BR/EDR Controller + u16 lmp_subver; //Subversion of the Current LMP or PAL in the Controller + u16 vid; + u16 pid; + u16 rev; +} __attribute__((packed)) hci_information_t; + +enum eDS34BTStatus +{ + DS34BT_STATE_USB_DISCONNECTED = 0x00, + DS34BT_STATE_USB_AUTHORIZED = 0x01, + DS34BT_STATE_USB_CONFIGURED = 0x02, + DS34BT_STATE_CONNECTED = 0x04, + DS34BT_STATE_RUNNING = 0x08, + DS34BT_STATE_DISCONNECTING = 0x10, + DS34BT_STATE_DISCONNECT_REQUEST = 0x20, +}; + +#define pad_status_clear(flag, pad) ds34pad[pad].status &= ~flag +#define pad_status_set(flag, pad) ds34pad[pad].status |= flag +#define pad_status_check(flag, pad) (ds34pad[pad].status & flag) + +#define hci_event_flag_clear(flag) hci_event_flag &= ~flag +#define hci_event_flag_set(flag) hci_event_flag |= flag +#define hci_event_flag_check(flag) (hci_event_flag & flag) + +enum eHCI { + // {{{ + /* Bluetooth HCI states for HCI_task() */ + HCI_INIT_STATE = 0, + HCI_RESET_STATE, + HCI_READBDADDR_STATE, + HCI_READVERSION_STATE, + HCI_READFEATURES_STATE, + HCI_CONNECT_IN_STATE, + HCI_REMOTE_NAME_STATE, + HCI_CHANGE_CONNECTION, + HCI_READ_REMOTE_SUPPORTED_FEATURES, + HCI_CONNECTED_STATE, + + /* HCI OpCode Group Field (OGF) */ + HCI_OGF_LINK_CNTRL = (0x01 << 2), // OGF: Link Control Commands + HCI_OGF_LINK_POLICY = (0x02 << 2), // OGF: Link Policy Commands + HCI_OGF_CTRL_BBAND = (0x03 << 2), // OGF: Controller & Baseband Commands + HCI_OGF_INFO_PARAM = (0x04 << 2), // OGF: Informational Parameters + + /* HCI OpCode Command Field (OCF) */ + HCI_OCF_DISCONNECT = 0x06, // OGF = 0x01 + HCI_OCF_ACCEPT_CONNECTION = 0x09, // OGF = 0x01 + HCI_OCF_REJECT_CONNECTION = 0x0A, // OGF = 0x01 + HCI_OCF_CHANGE_CONNECTION_TYPE = 0x0F, // OGF = 0x01 + HCI_OCF_REMOTE_NAME = 0x19, // OGF = 0x01 + HCI_OCF_LINK_KEY_REQUEST_REPLY = 0x0B, // OGF = 0x01 + + HCI_OCF_RESET = 0x03, // OGF = 0x03 + HCI_OCF_WRITE_ACCEPT_TIMEOUT = 0x16, // OGF = 0x03 + HCI_OCF_WRITE_SCAN_ENABLE = 0x1A, // OGF = 0x03 + + HCI_OCF_READ_BDADDR = 0x09, // OGF = 0x04 + HCI_OCF_READ_VERSION = 0x01, // OGF = 0x04 + HCI_OCF_READ_FEATURES = 0x03, // OGF = 0x04 + + /* HCI events managed */ + HCI_EVENT_CONNECT_COMPLETE = 0x03, + HCI_EVENT_CONNECT_REQUEST = 0x04, + HCI_EVENT_DISCONN_COMPLETE = 0x05, + HCI_EVENT_AUTHENTICATION_COMPLETE= 0x06, + HCI_EVENT_REMOTE_NAME_COMPLETE = 0x07, + HCI_EVENT_ENCRYPTION_CHANGE = 0x08, + HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE = 0x0B, + HCI_EVENT_QOS_SETUP_COMPLETE = 0x0d, // do nothing + HCI_EVENT_COMMAND_COMPLETE = 0x0e, + HCI_EVENT_COMMAND_STATUS = 0x0f, + HCI_EVENT_ROLE_CHANGED = 0x12, + HCI_EVENT_NUM_COMPLETED_PKT = 0x13, // do nothing + HCI_EVENT_PIN_CODE_REQUEST = 0x16, + HCI_EVENT_LINK_KEY_REQUEST = 0x17, + HCI_EVENT_CHANGED_CONNECTION_TYPE = 0x1D, + HCI_EVENT_PAGE_SR_CHANGED = 0x20, + HCI_EVENT_MAX_SLOT_CHANGE = 0x1B, //Max Slots Change event + + /* HCI event flags for hci_event_flag */ + HCI_FLAG_COMMAND_COMPLETE = 0x0001, + HCI_FLAG_COMMAND_STATUS = 0x0002, + HCI_FLAG_CONNECT_COMPLETE = 0x0004, + HCI_FLAG_DISCONN_COMPLETE = 0x0008, + HCI_FLAG_INCOMING_REQUEST = 0x0010, + HCI_FLAG_READ_BDADDR = 0x0020, + HCI_FLAG_REMOTE_NAME_COMPLETE = 0x0040, + HCI_FLAG_READ_VERSION = 0x0080, + HCI_FLAG_READ_FEATURES = 0x0100, + + /* HCI Scan Enable Parameters */ + SCAN_ENABLE_NOINQ_NOPAG = 0x00, + SCAN_ENABLE_ENINQ_NOPAG = 0x01, + SCAN_ENABLE_NOINQ_ENPAG = 0x02, + SCAN_ENABLE_ENINQ_ENPAG = 0x03, + // }}} +}; + +enum eL2CAP { + // {{{ + /* Bluetooth L2CAP PSM */ + L2CAP_PSM_SDP = 0x01, + L2CAP_PSM_CTRL = 0x11, // HID_Control + L2CAP_PSM_INTR = 0x13, // HID_Interrupt + + /* Bluetooth L2CAP states for L2CAP_task() */ + L2CAP_DOWN_STATE = 0, + L2CAP_INIT_STATE, + L2CAP_CONTROL_CONNECTING_STATE, + L2CAP_CONTROL_REQUEST_STATE, + L2CAP_CONTROL_CONFIGURING_STATE, + L2CAP_INTERRUPT_CONNECTING_STATE, + L2CAP_INTERRUPT_REQUEST_STATE, + L2CAP_INTERRUPT_CONFIGURING_STATE, + L2CAP_CONNECTED_STATE, + L2CAP_LED_STATE, + L2CAP_LED_STATE_END, + L2CAP_READY_STATE, + L2CAP_DISCONNECT_STATE, + + /* L2CAP event flags */ + L2CAP_EV_COMMAND_CONNECTED = 0x01, + L2CAP_EV_COMMAND_CONFIG_REQ = 0x02, + L2CAP_EV_COMMAND_CONFIGURED = 0x04, + L2CAP_EV_COMMAND_DISCONNECT_REQ = 0x08, + L2CAP_EV_INTERRUPT_CONNECTED = 0x10, + L2CAP_EV_INTERRUPT_CONFIG_REQ = 0x20, + L2CAP_EV_INTERRUPT_CONFIGURED = 0x40, + L2CAP_EV_INTERRUPT_DISCONNECT_REQ = 0x80, + + /* L2CAP signaling command */ + L2CAP_CMD_COMMAND_REJECT = 0x01, + L2CAP_CMD_CONNECTION_REQUEST = 0x02, + L2CAP_CMD_CONNECTION_RESPONSE = 0x03, + L2CAP_CMD_CONFIG_REQUEST = 0x04, + L2CAP_CMD_CONFIG_RESPONSE = 0x05, + L2CAP_CMD_DISCONNECT_REQUEST = 0x06, + L2CAP_CMD_DISCONNECT_RESPONSE = 0x07, + +/* HCI ACL Data Packet + * + * buf[0] buf[1] buf[2] buf[3] + * 0 4 8 11 12 16 24 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | HCI Handle |PB |BC | Data Total Length | HCI ACL Data Packet + * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * + * buf[4] buf[5] buf[6] buf[7] + * 0 8 16 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | Length | Channel ID | Basic L2CAP header + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * + * buf[8] buf[9] buf[10] buf[11] + * 0 8 16 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | Code | Identifier | Length | Control frame (C-frame) + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. (signaling packet format) + */ + // }}} +}; + +#define l2cap_handle_ok(handle) (((u16)(l2cap_buf[0] | (l2cap_buf[1] << 8)) & 0x0FFF) == (u16)(handle & 0x0FFF)) +#define l2cap_control_channel ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == 0x0001) // Channel ID for ACL-U +#define l2cap_interrupt_channel ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == interrupt_dcid) +#define l2cap_command_channel ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == control_dcid) + +enum eHID { + // {{{ + /* HID event flag */ + HID_FLAG_STATUS_REPORTED = 0x01, + HID_FLAG_BUTTONS_CHANGED = 0x02, + HID_FLAG_EXTENSION = 0x04, + HID_FLAG_COMMAND_SUCCESS = 0x08, + + /* Bluetooth HID Transaction Header (THdr) */ + HID_THDR_GET_REPORT_FEATURE = 0x43, + HID_THDR_SET_REPORT_OUTPUT = 0x52, + HID_THDR_SET_REPORT_FEATURE = 0x53, + HID_THDR_DATA_INPUT = 0xa1, + + /* Defines of various parameters for PS3 Game controller reports */ + PS3_F4_REPORT_ID = 0xF4, + PS3_F4_REPORT_LEN = 0x04, + + PS3_01_REPORT_ID = 0x01, + PS3_01_REPORT_LEN = 0x30, + + PS4_02_REPORT_ID = 0x02, + PS4_11_REPORT_ID = 0x11, + PS4_11_REPORT_LEN = 0x4D, + + // }}} +}; + +struct ds3report { + union { + u8 ButtonStateL; // Main buttons Low + struct { + u8 Select : 1; + u8 L3 : 1; + u8 R3 : 1; + u8 Start : 1; + u8 Up : 1; + u8 Right : 1; + u8 Down : 1; + u8 Left : 1; + }; + }; + union { + u8 ButtonStateH; // Main buttons High + struct { + u8 L2 : 1; + u8 R2 : 1; + u8 L1 : 1; + u8 R1 : 1; + u8 Triangle : 1; + u8 Circle : 1; + u8 Cross : 1; + u8 Square : 1; + }; + }; + u8 PSButtonState; // PS button + u8 Reserved1; // Unknown + u8 LeftStickX; // left Joystick X axis 0 - 255, 128 is mid + u8 LeftStickY; // left Joystick Y axis 0 - 255, 128 is mid + u8 RightStickX; // right Joystick X axis 0 - 255, 128 is mid + u8 RightStickY; // right Joystick Y axis 0 - 255, 128 is mid + u8 Reserved2[4]; // Unknown + u8 PressureUp; // digital Pad Up button Pressure 0 - 255 + u8 PressureRight; // digital Pad Right button Pressure 0 - 255 + u8 PressureDown; // digital Pad Down button Pressure 0 - 255 + u8 PressureLeft; // digital Pad Left button Pressure 0 - 255 + u8 PressureL2; // digital Pad L2 button Pressure 0 - 255 + u8 PressureR2; // digital Pad R2 button Pressure 0 - 255 + u8 PressureL1; // digital Pad L1 button Pressure 0 - 255 + u8 PressureR1; // digital Pad R1 button Pressure 0 - 255 + u8 PressureTriangle; // digital Pad Triangle button Pressure 0 - 255 + u8 PressureCircle; // digital Pad Circle button Pressure 0 - 255 + u8 PressureCross; // digital Pad Cross button Pressure 0 - 255 + u8 PressureSquare; // digital Pad Square button Pressure 0 - 255 + u8 Reserved3[3]; // Unknown + u8 Charge; // charging status ? 02 = charge, 03 = normal + u8 Power; // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging + u8 Connection; // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble + u8 Reserved4[9]; // Unknown + s16 AccelX; + s16 AccelY; + s16 AccelZ; + s16 GyroZ; + +} __attribute__((packed)); + +struct ds4report { + u8 ReportID; + u8 LeftStickX; // left Joystick X axis 0 - 255, 128 is mid + u8 LeftStickY; // left Joystick Y axis 0 - 255, 128 is mid + u8 RightStickX; // right Joystick X axis 0 - 255, 128 is mid + u8 RightStickY; // right Joystick Y axis 0 - 255, 128 is mid + u8 Dpad : 4; // hat format, 0x08 is released, 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW + u8 Square : 1; + u8 Cross : 1; + u8 Circle : 1; + u8 Triangle : 1; + u8 L1 : 1; + u8 R1 : 1; + u8 L2 : 1; + u8 R2 : 1; + u8 Share : 1; + u8 Option : 1; + u8 L3 : 1; + u8 R3 : 1; + u8 PSButton : 1; + u8 TPad : 1; + u8 Counter1 : 6; // counts up by 1 per report + u8 PressureL2; // digital Pad L2 button Pressure 0 - 255 + u8 PressureR2; // digital Pad R2 button Pressure 0 - 255 + u8 Counter2; + u8 Counter3; + u8 Battery; // battery level from 0x00 to 0xff + s16 AccelX; + s16 AccelY; + s16 AccelZ; + s16 GyroZ; + s16 GyroY; + s16 GyroX; + u8 Reserved1[5]; // Unknown + u8 Power : 4; // from 0x0 to 0xA - charging, 0xB - charged + u8 Usb_plugged : 1; + u8 Headphones : 1; + u8 Microphone : 1; + u8 Padding : 1; + u8 Reserved2[2]; // Unknown + u8 TPpack; // number of trackpad packets (0x00 to 0x04) + u8 PackCounter; // packet counter + u8 Finger1ID : 7; // counter + u8 Finger1Active : 1; // 0 - active, 1 - unactive + u16 Finger1X : 12; // finger 1 coordinates resolution 1920x943 + u16 Finger1Y : 12; + u8 Finger2ID : 7; + u8 Finger2Active : 1; + u16 Finger2X : 12; // finger 2 coordinates resolution 1920x943 + u16 Finger2Y : 12; + +} __attribute__((packed)); + +void mips_memcpy(void *, const void *, unsigned); +void mips_memset(void *, int, unsigned); + +#endif diff --git a/modules/ds3usb/iop/imports.lst b/modules/ds34bt/iop/imports.lst similarity index 86% rename from modules/ds3usb/iop/imports.lst rename to modules/ds34bt/iop/imports.lst index 130a870b7..0d5ff646d 100644 --- a/modules/ds3usb/iop/imports.lst +++ b/modules/ds34bt/iop/imports.lst @@ -9,12 +9,17 @@ stdio_IMPORTS_start I_printf stdio_IMPORTS_end +sysclib_IMPORTS_start +I_strncmp +sysclib_IMPORTS_end + thsemap_IMPORTS_start I_CreateSema I_SignalSema I_WaitSema I_PollSema I_DeleteSema +I_iSignalSema thsemap_IMPORTS_end thbase_IMPORTS_start @@ -23,6 +28,8 @@ I_CreateThread I_DeleteThread I_DelayThread I_GetThreadId +I_SetAlarm +I_CancelAlarm thbase_IMPORTS_end usbd_IMPORTS_start diff --git a/modules/ds3bt/iop/irx_imports.h b/modules/ds34bt/iop/irx_imports.h similarity index 100% rename from modules/ds3bt/iop/irx_imports.h rename to modules/ds34bt/iop/irx_imports.h diff --git a/modules/ds3bt/iop/smsutils.s b/modules/ds34bt/iop/smsutils.s similarity index 100% rename from modules/ds3bt/iop/smsutils.s rename to modules/ds34bt/iop/smsutils.s diff --git a/modules/ds3usb/Makefile b/modules/ds34usb/Makefile similarity index 100% rename from modules/ds3usb/Makefile rename to modules/ds34usb/Makefile diff --git a/modules/ds3usb/ee/Makefile b/modules/ds34usb/ee/Makefile similarity index 80% rename from modules/ds3usb/ee/Makefile rename to modules/ds34usb/ee/Makefile index b96280ece..31a34b2fe 100644 --- a/modules/ds3usb/ee/Makefile +++ b/modules/ds34usb/ee/Makefile @@ -1,6 +1,6 @@ -EE_LIB = libds3usb.a +EE_LIB = libds34usb.a -EE_OBJS = libds3usb.o +EE_OBJS = libds34usb.o EE_LIBS = -lc EE_CFLAGS = -Wall diff --git a/modules/ds34usb/ee/libds34usb.c b/modules/ds34usb/ee/libds34usb.c new file mode 100644 index 000000000..bc0539745 --- /dev/null +++ b/modules/ds34usb/ee/libds34usb.c @@ -0,0 +1,145 @@ +#include +#include +#include + +#define DS34USB_INIT 1 +#define DS34USB_GET_STATUS 2 +#define DS34USB_GET_BDADDR 3 +#define DS34USB_SET_BDADDR 4 +#define DS34USB_SET_RUMBLE 5 +#define DS34USB_SET_LED 6 +#define DS34USB_GET_DATA 7 +#define DS34USB_RESET 8 + +#define DS34USB_BIND_RPC_ID 0x18E3878E + +static SifRpcClientData_t ds34usb; + +static u8 rpcbuf[64] __attribute__((aligned(64))); + +static u8 ds34usb_inited = 0; + +int ds34usb_init() +{ + ds34usb.server = NULL; + + do { + if (SifBindRpc(&ds34usb, DS34USB_BIND_RPC_ID, 0) < 0) + return 0; + + nopdelay(); + } while (!ds34usb.server); + + ds34usb_inited = 1; + + return 1; +} + +int ds34usb_deinit() +{ + ds34usb_inited = 0; + return 1; +} + +int ds34usb_reinit_ports(u8 ports) +{ + if (!ds34usb_inited) + return 0; + + rpcbuf[0] = ports; + return (SifCallRpc(&ds34usb, DS34USB_INIT, 0, rpcbuf, 1, NULL, 0, NULL, NULL) == 0); +} + +int ds34usb_get_status(int port) +{ + if (!ds34usb_inited) + return 0; + + rpcbuf[0] = port; + + if (SifCallRpc(&ds34usb, DS34USB_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL) == 0) + return rpcbuf[0]; + + return 0; +} + +int ds34usb_get_bdaddr(int port, u8 *bdaddr) +{ + int i, ret; + + if (!ds34usb_inited) + return 0; + + rpcbuf[0] = port; + + ret = (SifCallRpc(&ds34usb, DS34USB_GET_BDADDR, 0, rpcbuf, 1, rpcbuf, 7, NULL, NULL) == 0); + + ret &= rpcbuf[0]; + + for (i = 0; i < 6; i++) + bdaddr[i] = rpcbuf[i + 1]; + + return ret; +} + +int ds34usb_set_bdaddr(int port, u8 *bdaddr) +{ + int i; + + if (!ds34usb_inited) + return 0; + + rpcbuf[0] = port; + + for (i = 0; i < 6; i++) + rpcbuf[i + 1] = bdaddr[i]; + + return (SifCallRpc(&ds34usb, DS34USB_SET_BDADDR, 0, rpcbuf, 7, NULL, 0, NULL, NULL) == 0); +} + +int ds34usb_set_rumble(int port, u8 lrum, u8 rrum) +{ + if (!ds34usb_inited) + return 0; + + rpcbuf[0] = port; + rpcbuf[1] = lrum; + rpcbuf[2] = rrum; + + return (SifCallRpc(&ds34usb, DS34USB_SET_RUMBLE, 0, rpcbuf, 3, NULL, 0, NULL, NULL) == 0); +} + +int ds34usb_set_led(int port, u8 led) +{ + if (!ds34usb_inited) + return 0; + + rpcbuf[0] = port; + rpcbuf[1] = led; + + return (SifCallRpc(&ds34usb, DS34USB_SET_LED, 0, rpcbuf, 2, NULL, 0, NULL, NULL) == 0); +} + +int ds34usb_get_data(int port, u8 *data) +{ + int ret; + + if (!ds34usb_inited) + return 0; + + rpcbuf[0] = port; + + ret = (SifCallRpc(&ds34usb, DS34USB_GET_DATA, 0, rpcbuf, 1, rpcbuf, 18, NULL, NULL) == 0); + + memcpy(data, rpcbuf, 18); + + return ret; +} + +int ds34usb_reset() +{ + if (!ds34usb_inited) + return 0; + + return (SifCallRpc(&ds34usb, DS34USB_RESET, 0, NULL, 0, NULL, 0, NULL, NULL) == 0); +} diff --git a/modules/ds34usb/ee/libds34usb.h b/modules/ds34usb/ee/libds34usb.h new file mode 100644 index 000000000..7def46546 --- /dev/null +++ b/modules/ds34usb/ee/libds34usb.h @@ -0,0 +1,19 @@ + +enum eDS34USBStatus { + DS34USB_STATE_DISCONNECTED = 0x00, + DS34USB_STATE_AUTHORIZED = 0x01, + DS34USB_STATE_CONFIGURED = 0x02, + DS34USB_STATE_CONNECTED = 0x04, + DS34USB_STATE_RUNNING = 0x08, +}; + +int ds34usb_init(); +int ds34usb_deinit(); +int ds34usb_reinit_ports(u8 ports); +int ds34usb_get_status(int port); +int ds34usb_get_bdaddr(int port, u8 *bdaddr); +int ds34usb_set_bdaddr(int port, u8 *bdaddr); +int ds34usb_set_rumble(int port, u8 lrum, u8 rrum); +int ds34usb_set_led(int port, u8 led); +int ds34usb_get_data(int port, u8 *data); +int ds34usb_reset(); diff --git a/modules/ds3usb/iop/Makefile b/modules/ds34usb/iop/Makefile similarity index 76% rename from modules/ds3usb/iop/Makefile rename to modules/ds34usb/iop/Makefile index 45fc1efb3..70539a879 100644 --- a/modules/ds3usb/iop/Makefile +++ b/modules/ds34usb/iop/Makefile @@ -1,10 +1,10 @@ -IOP_BIN = ds3usb.irx +IOP_BIN = ds34usb.irx IOP_INCS += IOP_CFLAGS += -Wall IOP_LDFLAGS += -s -IOP_OBJS = ds3usb.o smsutils.o imports.o +IOP_OBJS = ds34usb.o smsutils.o imports.o IOP_LIBS = all: $(IOP_BIN) diff --git a/modules/ds34usb/iop/ds34usb.c b/modules/ds34usb/iop/ds34usb.c new file mode 100644 index 000000000..e2acc5cf0 --- /dev/null +++ b/modules/ds34usb/iop/ds34usb.c @@ -0,0 +1,787 @@ +#include "types.h" +#include "loadcore.h" +#include "stdio.h" +#include "sifrpc.h" +#include "sysclib.h" +#include "usbd.h" +#include "usbd_macro.h" +#include "thbase.h" +#include "thsemap.h" +#include "ds34usb.h" + +IRX_ID("ds34usb", 1, 1); + +//#define DPRINTF(x...) printf(x) +#define DPRINTF(x...) + +#define REQ_USB_OUT (USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) +#define REQ_USB_IN (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) + +#define MAX_PADS 2 + +static u8 output_01_report[] = + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; + +static u8 led_patterns[][2] = + { + {0x1C, 0x02}, + {0x1A, 0x04}, + {0x16, 0x08}, + {0x0E, 0x10}, +}; + +static u8 power_level[] = + { + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; + +static u8 rgbled_patterns[][2][3] = + { + {{0x00, 0x00, 0x10}, {0x00, 0x00, 0x7F}}, // light blue/blue + {{0x00, 0x10, 0x00}, {0x00, 0x7F, 0x00}}, // light green/green/ + {{0x10, 0x10, 0x00}, {0x7F, 0x7F, 0x00}}, // light yellow/yellow + {{0x00, 0x10, 0x10}, {0x00, 0x7F, 0x7F}}, // light cyan/cyan +}; + +static u8 link_key[] = //for ds4 authorisation + { + 0x56, 0xE8, 0x81, 0x38, 0x08, 0x06, 0x51, 0x41, + 0xC0, 0x7F, 0x12, 0xAA, 0xD9, 0x66, 0x3C, 0xCE +}; + +static u8 usb_buf[MAX_BUFFER_SIZE + 20] __attribute((aligned(4))) = {0}; + +int usb_probe(int devId); +int usb_connect(int devId); +int usb_disconnect(int devId); + +static void usb_release(int pad); +static void usb_config_set(int result, int count, void *arg); + +UsbDriver usb_driver = {NULL, NULL, "ds34usb", usb_probe, usb_connect, usb_disconnect}; + +static void DS3USB_init(int pad); +static void readReport(u8 *data, int pad); +static int LEDRumble(u8 *led, u8 lrum, u8 rrum, int pad); +static int Rumble(u8 lrum, u8 rrum, int pad); + +ds34usb_device ds34pad[MAX_PADS]; + +int usb_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + + DPRINTF("DS34USB: probe: devId=%i\n", devId); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("DS34USB: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->idVendor == DS34_VID && (device->idProduct == DS3_PID || device->idProduct == DS4_PID || device->idProduct == DS4_PID_SLIM)) + return 1; + + return 0; +} + +int usb_connect(int devId) +{ + int pad, epCount; + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + UsbInterfaceDescriptor *interface; + UsbEndpointDescriptor *endpoint; + + DPRINTF("DS34USB: connect: devId=%i\n", devId); + + for (pad = 0; pad < MAX_PADS; pad++) { + if (ds34pad[pad].devId == -1 && ds34pad[pad].enabled) + break; + } + + if (pad >= MAX_PADS) { + DPRINTF("DS34USB: Error - only %d device allowed !\n", MAX_PADS); + return 1; + } + + PollSema(ds34pad[pad].sema); + + ds34pad[pad].devId = devId; + + ds34pad[pad].status = DS34USB_STATE_AUTHORIZED; + + ds34pad[pad].controlEndp = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + if (device->idProduct == DS3_PID) { + ds34pad[pad].type = DS3; + epCount = interface->bNumEndpoints - 1; + } else { + ds34pad[pad].type = DS4; + epCount = 20; // ds4 v2 returns interface->bNumEndpoints as 0 + } + + endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); + + do { + if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && ds34pad[pad].interruptEndp < 0) { + ds34pad[pad].interruptEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("DS34USB: register Event endpoint id =%i addr=%02X packetSize=%i\n", ds34pad[pad].interruptEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && ds34pad[pad].outEndp < 0) { + ds34pad[pad].outEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("DS34USB: register Output endpoint id =%i addr=%02X packetSize=%i\n", ds34pad[pad].outEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + } + + endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); + + } while (epCount--); + + if (ds34pad[pad].interruptEndp < 0 || ds34pad[pad].outEndp < 0) { + usb_release(pad); + return 1; + } + + ds34pad[pad].status |= DS34USB_STATE_CONNECTED; + + UsbSetDeviceConfiguration(ds34pad[pad].controlEndp, config->bConfigurationValue, usb_config_set, (void *)pad); + SignalSema(ds34pad[pad].sema); + + return 0; +} + +int usb_disconnect(int devId) +{ + u8 pad; + + DPRINTF("DS34USB: disconnect: devId=%i\n", devId); + + for (pad = 0; pad < MAX_PADS; pad++) { + if (ds34pad[pad].devId == devId) + break; + } + + if (pad < MAX_PADS) + usb_release(pad); + + return 0; +} + +static void usb_release(int pad) +{ + PollSema(ds34pad[pad].sema); + + if (ds34pad[pad].interruptEndp >= 0) + UsbCloseEndpoint(ds34pad[pad].interruptEndp); + + if (ds34pad[pad].outEndp >= 0) + UsbCloseEndpoint(ds34pad[pad].outEndp); + + ds34pad[pad].controlEndp = -1; + ds34pad[pad].interruptEndp = -1; + ds34pad[pad].outEndp = -1; + ds34pad[pad].devId = -1; + ds34pad[pad].status = DS34USB_STATE_DISCONNECTED; + + SignalSema(ds34pad[pad].sema); +} + +static int usb_resulCode; + +static void usb_data_cb(int resultCode, int bytes, void *arg) +{ + int pad = (int)arg; + + //DPRINTF("DS34USB: usb_data_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + usb_resulCode = resultCode; + + SignalSema(ds34pad[pad].sema); +} + +static void usb_cmd_cb(int resultCode, int bytes, void *arg) +{ + int pad = (int)arg; + + //DPRINTF("DS34USB: usb_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + SignalSema(ds34pad[pad].cmd_sema); +} + +static void usb_config_set(int result, int count, void *arg) +{ + int pad = (int)arg; + u8 led[4]; + + PollSema(ds34pad[pad].sema); + + ds34pad[pad].status |= DS34USB_STATE_CONFIGURED; + + if (ds34pad[pad].type == DS3) { + DS3USB_init(pad); + DelayThread(10000); + led[0] = led_patterns[pad][1]; + led[3] = 0; + } else if(ds34pad[pad].type == DS4) { + led[0] = rgbled_patterns[pad][1][0]; + led[1] = rgbled_patterns[pad][1][1]; + led[2] = rgbled_patterns[pad][1][2]; + led[3] = 0; + } + + LEDRumble(led, 0, 0, pad); + + ds34pad[pad].status |= DS34USB_STATE_RUNNING; + + SignalSema(ds34pad[pad].sema); +} + +static void DS3USB_init(int pad) +{ + usb_buf[0] = 0x42; + usb_buf[1] = 0x0c; + usb_buf[2] = 0x00; + usb_buf[3] = 0x00; + + UsbControlTransfer(ds34pad[pad].controlEndp, REQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF4, 0, 4, usb_buf, NULL, NULL); +} + +static void readReport(u8 *data, int pad) +{ + if (data[0]) { + + if (ds34pad[pad].type == DS3) { + struct ds3report *report; + + report = (struct ds3report *)&data[2]; + + ds34pad[pad].data[0] = ~report->ButtonStateL; + ds34pad[pad].data[1] = ~report->ButtonStateH; + + ds34pad[pad].data[2] = report->RightStickX; //rx + ds34pad[pad].data[3] = report->RightStickY; //ry + ds34pad[pad].data[4] = report->LeftStickX; //lx + ds34pad[pad].data[5] = report->LeftStickY; //ly + + ds34pad[pad].data[6] = report->PressureRight; //right + ds34pad[pad].data[7] = report->PressureLeft; //left + ds34pad[pad].data[8] = report->PressureUp; //up + ds34pad[pad].data[9] = report->PressureDown; //down + + ds34pad[pad].data[10] = report->PressureTriangle; //triangle + ds34pad[pad].data[11] = report->PressureCircle; //circle + ds34pad[pad].data[12] = report->PressureCross; //cross + ds34pad[pad].data[13] = report->PressureSquare; //square + + ds34pad[pad].data[14] = report->PressureL1; //L1 + ds34pad[pad].data[15] = report->PressureR1; //R1 + ds34pad[pad].data[16] = report->PressureL2; //L2 + ds34pad[pad].data[17] = report->PressureR2; //R2 + + if (report->PSButtonState && report->Power != 0xEE) //display battery level + ds34pad[pad].oldled[0] = power_level[report->Power]; + else + ds34pad[pad].oldled[0] = led_patterns[pad][1]; + + if (report->Power == 0xEE) //charging + ds34pad[pad].oldled[3] = 1; + else + ds34pad[pad].oldled[3] = 0; + + } else if (ds34pad[pad].type == DS4) { + struct ds4report *report; + u8 up = 0, down = 0, left = 0, right = 0; + + report = (struct ds4report *)data; + + switch(report->Dpad) { + case 0: up = 1; + break; + case 1: up = 1; right = 1; + break; + case 2: right = 1; + break; + case 3: down = 1; right = 1; + break; + case 4: down = 1; + break; + case 5: down = 1; left = 1; + break; + case 6: left = 1; + break; + case 7: up = 1; left = 1; + break; + case 8: up = 0; down = 0; left = 0; right = 0; + break; + } + + if (report->TPad) { + if (!report->Finger1Active) { + if (report->Finger1X < 960) + report->Share = 1; + else + report->Option = 1; + } + + if (!report->Finger2Active) { + if (report->Finger2X < 960) + report->Share = 1; + else + report->Option = 1; + } + } + + ds34pad[pad].data[0] = ~(report->Share | report->L3 << 1 | report->R3 << 2 | report->Option << 3 | up << 4 | right << 5 | down << 6 | left << 7); + ds34pad[pad].data[1] = ~(report->L2 | report->R2 << 1 | report->L1 << 2 | report->R1 << 3 | report->Triangle << 4 | report->Circle << 5 | report->Cross << 6 | report->Square << 7); + + ds34pad[pad].data[2] = report->RightStickX; //rx + ds34pad[pad].data[3] = report->RightStickY; //ry + ds34pad[pad].data[4] = report->LeftStickX; //lx + ds34pad[pad].data[5] = report->LeftStickY; //ly + + ds34pad[pad].data[6] = right * 255; //right + ds34pad[pad].data[7] = left * 255; //left + ds34pad[pad].data[8] = up * 255; //up + ds34pad[pad].data[9] = down * 255; //down + + ds34pad[pad].data[10] = report->Triangle * 255; //triangle + ds34pad[pad].data[11] = report->Circle * 255; //circle + ds34pad[pad].data[12] = report->Cross * 255; //cross + ds34pad[pad].data[13] = report->Square * 255; //square + + ds34pad[pad].data[14] = report->L1 * 255; //L1 + ds34pad[pad].data[15] = report->R1 * 255; //R1 + ds34pad[pad].data[16] = report->PressureL2; //L2 + ds34pad[pad].data[17] = report->PressureR2; //R2 + + if (report->PSButton) { //display battery level + ds34pad[pad].oldled[0] = report->Battery; + ds34pad[pad].oldled[1] = 0; + ds34pad[pad].oldled[2] = 0; + } else { + ds34pad[pad].oldled[0] = rgbled_patterns[pad][1][0]; + ds34pad[pad].oldled[1] = rgbled_patterns[pad][1][1]; + ds34pad[pad].oldled[2] = rgbled_patterns[pad][1][2]; + } + + if (report->Power != 0xB && report->Usb_plugged) //charging + ds34pad[pad].oldled[3] = 1; + else + ds34pad[pad].oldled[3] = 0; + + } + } +} + +static int LEDRumble(u8 *led, u8 lrum, u8 rrum, int pad) +{ + int ret = 0; + + PollSema(ds34pad[pad].cmd_sema); + + mips_memset(usb_buf, 0, sizeof(usb_buf)); + + if (ds34pad[pad].type == DS3) { + mips_memcpy(usb_buf, output_01_report, sizeof(output_01_report)); + + usb_buf[1] = 0xFE; //rt + usb_buf[2] = rrum; //rp + usb_buf[3] = 0xFE; //lt + usb_buf[4] = lrum; //lp + + usb_buf[9] = led[0] & 0x7F; //LED Conf + + if (led[3]) //means charging, so blink + { + usb_buf[13] = 0x32; + usb_buf[18] = 0x32; + usb_buf[23] = 0x32; + usb_buf[28] = 0x32; + } + + ret = UsbControlTransfer(ds34pad[pad].controlEndp, REQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_SET_REPORT_OUTPUT << 8) | 0x01, 0, sizeof(output_01_report), usb_buf, usb_cmd_cb, (void *)pad); + } else if (ds34pad[pad].type == DS4) { + usb_buf[0] = 0x05; + usb_buf[1] = 0xFF; + + usb_buf[4] = rrum; //ds4 has full control + usb_buf[5] = lrum; + + usb_buf[6] = led[0]; //r + usb_buf[7] = led[1]; //g + usb_buf[8] = led[2]; //b + + if (led[3]) //means charging, so blink + { + usb_buf[9] = 0x80; // Time to flash bright (255 = 2.5 seconds) + usb_buf[10] = 0x80; // Time to flash dark (255 = 2.5 seconds) + } + + ret = UsbInterruptTransfer(ds34pad[pad].outEndp, usb_buf, 32, usb_cmd_cb, (void *)pad); + } + + ds34pad[pad].oldled[0] = led[0]; + ds34pad[pad].oldled[1] = led[1]; + ds34pad[pad].oldled[2] = led[2]; + ds34pad[pad].oldled[3] = led[3]; + + ds34pad[pad].lrum = lrum; + ds34pad[pad].rrum = rrum; + + return ret; +} + +static unsigned int timeout(void *arg) +{ + int sema = (int)arg; + iSignalSema(sema); + return 0; +} + +static void TransferWait(int sema) +{ + iop_sys_clock_t cmd_timeout; + + cmd_timeout.lo = 200000; + cmd_timeout.hi = 0; + + if (SetAlarm(&cmd_timeout, timeout, (void *)sema) == 0) { + WaitSema(sema); + CancelAlarm(timeout, NULL); + } +} + +static int LEDRUM(u8 *led, u8 lrum, u8 rrum, int pad) +{ + int ret = 0; + + WaitSema(ds34pad[pad].sema); + + if (ds34pad[pad].update_rum) { + ret = LEDRumble(led, lrum, rrum, pad); + + if (ret == USB_RC_OK) + TransferWait(ds34pad[pad].cmd_sema); + else + DPRINTF("DS34USB: LEDRUM usb transfer error 0x%02X\n", ret); + } + + SignalSema(ds34pad[pad].sema); + + return ret; +} + +static int LED(u8 *led, int pad) +{ + return LEDRUM(led, ds34pad[pad].lrum, ds34pad[pad].rrum, pad); +} + +static int Rumble(u8 lrum, u8 rrum, int pad) +{ + return LEDRUM(ds34pad[pad].oldled, lrum, rrum, pad); +} + +void ds34usb_set_rumble(u8 lrum, u8 rrum, int port) +{ + if (port >= MAX_PADS) + return; + + Rumble(lrum, rrum, port); +} + +void ds34usb_set_led(u8 *led, int port) +{ + if (port >= MAX_PADS) + return; + + LED(led, port); +} + +void ds34usb_get_data(char *dst, int size, int port) +{ + int ret; + + if (port >= MAX_PADS) + return; + + WaitSema(ds34pad[port].sema); + + PollSema(ds34pad[port].sema); + + ret = UsbInterruptTransfer(ds34pad[port].interruptEndp, usb_buf, MAX_BUFFER_SIZE, usb_data_cb, (void *)port); + + if (ret == USB_RC_OK) { + TransferWait(ds34pad[port].sema); + if (!usb_resulCode) + readReport(usb_buf, port); + + usb_resulCode = 1; + } else { + DPRINTF("DS34USB: ds34usb_get_data usb transfer error %d\n", ret); + } + + mips_memcpy(dst, ds34pad[port].data, size); + + SignalSema(ds34pad[port].sema); +} + +int ds34usb_get_bdaddr(u8 *data, int port) +{ + int i, ret; + + if (port >= MAX_PADS) + return 0; + + if (ds34pad[port].update_rum) { + ds34pad[port].update_rum = 0; + return 0; + } + + WaitSema(ds34pad[port].sema); + + PollSema(ds34pad[port].cmd_sema); + + if (ds34pad[port].type == DS3) { + ret = UsbControlTransfer(ds34pad[port].controlEndp, REQ_USB_IN, USB_REQ_GET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF5, 0, 8, usb_buf, usb_cmd_cb, (void *)port); + + if (ret == USB_RC_OK) { + TransferWait(ds34pad[port].cmd_sema); + + for (i = 0; i < 6; i++) + data[5 - i] = usb_buf[2 + i]; + } else { + DPRINTF("DS34USB: ds3usb_get_bdaddr usb transfer error %d\n", ret); + } + } else { + ret = UsbControlTransfer(ds34pad[port].controlEndp, REQ_USB_IN, USB_REQ_GET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0x12, 0, 16, usb_buf, usb_cmd_cb, (void *)port); + + if (ret == USB_RC_OK) { + TransferWait(ds34pad[port].cmd_sema); + + for (i = 0; i < 6; i++) + data[5 - i] = usb_buf[15 - i]; + } else { + DPRINTF("DS34USB: ds3usb_get_bdaddr usb transfer error %d\n", ret); + } + } + + ds34pad[port].update_rum = 1; + SignalSema(ds34pad[port].sema); + + return 1; +} + +void ds34usb_set_bdaddr(u8 *data, int port) +{ + int i, ret; + + if (port >= MAX_PADS) + return; + + WaitSema(ds34pad[port].sema); + + PollSema(ds34pad[port].cmd_sema); + + if (ds34pad[port].type == DS3) { + usb_buf[0] = 0x01; + usb_buf[1] = 0x00; + + for (i = 0; i < 6; i++) + usb_buf[i + 2] = data[5 - i]; + + ret = UsbControlTransfer(ds34pad[port].controlEndp, REQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF5, 0, 8, usb_buf, usb_cmd_cb, (void *)port); + } else { + usb_buf[0] = 0x13; + + for (i = 0; i < 6; i++) + usb_buf[i + 1] = data[i]; + + for (i = 0; i < sizeof(link_key); i++) + usb_buf[i + 7] = link_key[i]; + + ret = UsbControlTransfer(ds34pad[port].controlEndp, REQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0x13, 0, 24, usb_buf, usb_cmd_cb, (void *)port); + } + + if (ret == USB_RC_OK) + TransferWait(ds34pad[port].cmd_sema); + else + DPRINTF("DS34USB: ds3usb_set_bdaddr usb transfer error %d\n", ret); + + SignalSema(ds34pad[port].sema); +} + +void ds34usb_reset() +{ + int pad; + + for (pad = 0; pad < MAX_PADS; pad++) + usb_release(pad); +} + +int ds34usb_get_status(int port) +{ + int ret; + + if (port >= MAX_PADS) + return 0; + + WaitSema(ds34pad[port].sema); + ret = ds34pad[port].status; + SignalSema(ds34pad[port].sema); + + return ret; +} + +void ds34usb_init(u8 pads) +{ + u8 pad; + + for (pad = 0; pad < MAX_PADS; pad++) { + WaitSema(ds34pad[pad].sema); + ds34pad[pad].enabled = (pads >> pad) & 1; + SignalSema(ds34pad[pad].sema); + } +} + +static void rpc_thread(void *data); +static void *rpc_sf(int cmd, void *data, int size); + +static SifRpcDataQueue_t rpc_que __attribute__((aligned(16))); +static SifRpcServerData_t rpc_svr __attribute__((aligned(16))); + +static int rpc_buf[64] __attribute((aligned(16))); + +#define DS34USB_INIT 1 +#define DS34USB_GET_STATUS 2 +#define DS34USB_GET_BDADDR 3 +#define DS34USB_SET_BDADDR 4 +#define DS34USB_SET_RUMBLE 5 +#define DS34USB_SET_LED 6 +#define DS34USB_GET_DATA 7 +#define DS34USB_RESET 8 + +#define DS34USB_BIND_RPC_ID 0x18E3878E + +void rpc_thread(void *data) +{ + SifInitRpc(0); + SifSetRpcQueue(&rpc_que, GetThreadId()); + SifRegisterRpc(&rpc_svr, DS34USB_BIND_RPC_ID, rpc_sf, rpc_buf, NULL, NULL, &rpc_que); + SifRpcLoop(&rpc_que); +} + +void *rpc_sf(int cmd, void *data, int size) +{ + switch (cmd) { + case DS34USB_INIT: + ds34usb_init(*(u8 *)data); + break; + case DS34USB_GET_STATUS: + *(u8 *)data = ds34usb_get_status(*(u8 *)data); + break; + case DS34USB_GET_BDADDR: + *(u8 *)data = ds34usb_get_bdaddr((u8 *)data + 1, *(u8 *)data); + break; + case DS34USB_SET_BDADDR: + ds34usb_set_bdaddr((u8 *)(data + 1), *(u8 *)data); + break; + case DS34USB_SET_RUMBLE: + ds34usb_set_rumble(*(u8 *)(data + 1), *(u8 *)(data + 2), *(u8 *)data); + break; + case DS34USB_SET_LED: + ds34usb_set_led((u8 *)(data + 1), *(u8 *)data); + break; + case DS34USB_GET_DATA: + ds34usb_get_data((u8 *)data, 18, *(u8 *)data); + break; + case DS34USB_RESET: + ds34usb_reset(); + break; + default: + break; + } + + return data; +} + +int _start(int argc, char *argv[]) +{ + int pad; + u8 enable = 0xFF; + + if (argc > 1) { + enable = argv[1][0]; + } + + for (pad = 0; pad < MAX_PADS; pad++) { + ds34pad[pad].status = 0; + ds34pad[pad].devId = -1; + ds34pad[pad].oldled[0] = 0; + ds34pad[pad].oldled[1] = 0; + ds34pad[pad].oldled[2] = 0; + ds34pad[pad].oldled[3] = 0; + ds34pad[pad].lrum = 0; + ds34pad[pad].rrum = 0; + ds34pad[pad].update_rum = 1; + ds34pad[pad].sema = -1; + ds34pad[pad].cmd_sema = -1; + ds34pad[pad].controlEndp = -1; + ds34pad[pad].interruptEndp = -1; + ds34pad[pad].outEndp = -1; + ds34pad[pad].enabled = (enable >> pad) & 1; + ds34pad[pad].type = 0; + + ds34pad[pad].data[0] = 0xFF; + ds34pad[pad].data[1] = 0xFF; + + mips_memset(&ds34pad[pad].data[2], 0x7F, 4); + mips_memset(&ds34pad[pad].data[6], 0x00, 12); + + ds34pad[pad].sema = CreateMutex(IOP_MUTEX_UNLOCKED); + ds34pad[pad].cmd_sema = CreateMutex(IOP_MUTEX_UNLOCKED); + + if (ds34pad[pad].sema < 0 || ds34pad[pad].cmd_sema < 0) { + DPRINTF("DS34USB: Failed to allocate I/O semaphore.\n"); + return MODULE_NO_RESIDENT_END; + } + } + + if (UsbRegisterDriver(&usb_driver) != USB_RC_OK) { + DPRINTF("DS34USB: Error registering USB devices\n"); + return MODULE_NO_RESIDENT_END; + } + + iop_thread_t rpc_th; + + rpc_th.attr = TH_C; + rpc_th.thread = rpc_thread; + rpc_th.priority = 40; + rpc_th.stacksize = 0x800; + rpc_th.option = 0; + + int thid = CreateThread(&rpc_th); + + if (thid > 0) { + StartThread(thid, NULL); + return MODULE_RESIDENT_END; + } + + return MODULE_NO_RESIDENT_END; +} diff --git a/modules/ds34usb/iop/ds34usb.h b/modules/ds34usb/iop/ds34usb.h new file mode 100644 index 000000000..2c1e19e22 --- /dev/null +++ b/modules/ds34usb/iop/ds34usb.h @@ -0,0 +1,182 @@ +#ifndef _DS34USB_H_ +#define _DS34USB_H_ + +#include "irx.h" + +#define DS34_VID 0x054C // Sony Corporation +#define DS3_PID 0x0268 // PS3 Controller +#define DS4_PID 0x05C4 // PS4 Controller +#define DS4_PID_SLIM 0x09CC // PS4 Slim Controller + +#define DS3 0 +#define DS4 1 + +#define MAX_BUFFER_SIZE 64 // Size of general purpose data buffer + +typedef struct _usb_ds34 +{ + int devId; + int sema; + int cmd_sema; + int controlEndp; + int interruptEndp; + int outEndp; + u8 status; + u8 enabled; + u8 lrum; + u8 rrum; + u8 update_rum; + u8 oldled[4]; //rgb for ds4 and blink + u8 data[18]; + u8 type; +} ds34usb_device; + +enum eDS34USBStatus { + DS34USB_STATE_DISCONNECTED = 0x00, + DS34USB_STATE_AUTHORIZED = 0x01, + DS34USB_STATE_CONFIGURED = 0x02, + DS34USB_STATE_CONNECTED = 0x04, + DS34USB_STATE_RUNNING = 0x08, +}; + +enum eHID { + // {{{ + /* HID event flag */ + HID_FLAG_STATUS_REPORTED = 0x01, + HID_FLAG_BUTTONS_CHANGED = 0x02, + HID_FLAG_EXTENSION = 0x04, + HID_FLAG_COMMAND_SUCCESS = 0x08, + + /* USB HID Transaction Header (THdr) */ + HID_USB_GET_REPORT_FEATURE = 0x03, + HID_USB_SET_REPORT_OUTPUT = 0x02, + HID_USB_DATA_INPUT = 0x01, + + /* Defines of various parameters for PS3 Game controller reports */ + PS3_F4_REPORT_ID = 0xF4, + PS3_F4_REPORT_LEN = 0x04, + + PS3_01_REPORT_ID = 0x01, + PS3_01_REPORT_LEN = 0x30, + + PS4_02_REPORT_ID = 0x02, + PS4_11_REPORT_ID = 0x11, + PS4_11_REPORT_LEN = 0x4D, + // }}} +}; + +struct ds3report { + union { + u8 ButtonStateL; // Main buttons Low + struct { + u8 Select : 1; + u8 L3 : 1; + u8 R3 : 1; + u8 Start : 1; + u8 Up : 1; + u8 Right : 1; + u8 Down : 1; + u8 Left : 1; + }; + }; + union { + u8 ButtonStateH; // Main buttons High + struct { + u8 L2 : 1; + u8 R2 : 1; + u8 L1 : 1; + u8 R1 : 1; + u8 Triangle : 1; + u8 Circle : 1; + u8 Cross : 1; + u8 Square : 1; + }; + }; + u8 PSButtonState; // PS button + u8 Reserved1; // Unknown + u8 LeftStickX; // left Joystick X axis 0 - 255, 128 is mid + u8 LeftStickY; // left Joystick Y axis 0 - 255, 128 is mid + u8 RightStickX; // right Joystick X axis 0 - 255, 128 is mid + u8 RightStickY; // right Joystick Y axis 0 - 255, 128 is mid + u8 Reserved2[4]; // Unknown + u8 PressureUp; // digital Pad Up button Pressure 0 - 255 + u8 PressureRight; // digital Pad Right button Pressure 0 - 255 + u8 PressureDown; // digital Pad Down button Pressure 0 - 255 + u8 PressureLeft; // digital Pad Left button Pressure 0 - 255 + u8 PressureL2; // digital Pad L2 button Pressure 0 - 255 + u8 PressureR2; // digital Pad R2 button Pressure 0 - 255 + u8 PressureL1; // digital Pad L1 button Pressure 0 - 255 + u8 PressureR1; // digital Pad R1 button Pressure 0 - 255 + u8 PressureTriangle; // digital Pad Triangle button Pressure 0 - 255 + u8 PressureCircle; // digital Pad Circle button Pressure 0 - 255 + u8 PressureCross; // digital Pad Cross button Pressure 0 - 255 + u8 PressureSquare; // digital Pad Square button Pressure 0 - 255 + u8 Reserved3[3]; // Unknown + u8 Charge; // charging status ? 02 = charge, 03 = normal + u8 Power; // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging + u8 Connection; // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble + u8 Reserved4[9]; // Unknown + s16 AccelX; + s16 AccelY; + s16 AccelZ; + s16 GyroZ; + +} __attribute__((packed)); + +struct ds4report { + u8 ReportID; + u8 LeftStickX; // left Joystick X axis 0 - 255, 128 is mid + u8 LeftStickY; // left Joystick Y axis 0 - 255, 128 is mid + u8 RightStickX; // right Joystick X axis 0 - 255, 128 is mid + u8 RightStickY; // right Joystick Y axis 0 - 255, 128 is mid + u8 Dpad : 4; // hat format, 0x08 is released, 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW + u8 Square : 1; + u8 Cross : 1; + u8 Circle : 1; + u8 Triangle : 1; + u8 L1 : 1; + u8 R1 : 1; + u8 L2 : 1; + u8 R2 : 1; + u8 Share : 1; + u8 Option : 1; + u8 L3 : 1; + u8 R3 : 1; + u8 PSButton : 1; + u8 TPad : 1; + u8 Counter1 : 6; // counts up by 1 per report + u8 PressureL2; // digital Pad L2 button Pressure 0 - 255 + u8 PressureR2; // digital Pad R2 button Pressure 0 - 255 + u8 Counter2; + u8 Counter3; + u8 Battery; // battery level from 0x00 to 0xff + s16 AccelX; + s16 AccelY; + s16 AccelZ; + s16 GyroZ; + s16 GyroY; + s16 GyroX; + u8 Reserved1[5]; // Unknown + u8 Power : 4; // from 0x0 to 0xA - charging, 0xB - charged + u8 Usb_plugged : 1; + u8 Headphones : 1; + u8 Microphone : 1; + u8 Padding : 1; + u8 Reserved2[2]; // Unknown + u8 TPpack; // number of trackpad packets (0x00 to 0x04) + u8 PackCounter; // packet counter + u8 Finger1ID : 7; // counter + u8 Finger1Active : 1; // 0 - active, 1 - unactive + u16 Finger1X : 12; // finger 1 coordinates resolution 1920x943 + u16 Finger1Y : 12; + u8 Finger2ID : 7; + u8 Finger2Active : 1; + u16 Finger2X : 12; // finger 2 coordinates resolution 1920x943 + u16 Finger2Y : 12; + +} __attribute__((packed)); + +void mips_memcpy(void *, const void *, unsigned); +void mips_memset(void *, int, unsigned); + +#endif diff --git a/modules/ds3bt/iop/imports.lst b/modules/ds34usb/iop/imports.lst similarity index 93% rename from modules/ds3bt/iop/imports.lst rename to modules/ds34usb/iop/imports.lst index 130a870b7..f862657ab 100644 --- a/modules/ds3bt/iop/imports.lst +++ b/modules/ds34usb/iop/imports.lst @@ -15,6 +15,7 @@ I_SignalSema I_WaitSema I_PollSema I_DeleteSema +I_iSignalSema thsemap_IMPORTS_end thbase_IMPORTS_start @@ -23,6 +24,8 @@ I_CreateThread I_DeleteThread I_DelayThread I_GetThreadId +I_SetAlarm +I_CancelAlarm thbase_IMPORTS_end usbd_IMPORTS_start diff --git a/modules/ds3usb/iop/irx_imports.h b/modules/ds34usb/iop/irx_imports.h similarity index 100% rename from modules/ds3usb/iop/irx_imports.h rename to modules/ds34usb/iop/irx_imports.h diff --git a/modules/ds3usb/iop/smsutils.s b/modules/ds34usb/iop/smsutils.s similarity index 100% rename from modules/ds3usb/iop/smsutils.s rename to modules/ds34usb/iop/smsutils.s diff --git a/modules/ds3bt/ee/libds3bt.c b/modules/ds3bt/ee/libds3bt.c deleted file mode 100644 index d1ec1463b..000000000 --- a/modules/ds3bt/ee/libds3bt.c +++ /dev/null @@ -1,136 +0,0 @@ -#include -#include -#include - -#define DS3BT_INIT 1 -#define DS3BT_INIT_CHARGING 2 -#define DS3BT_GET_STATUS 3 -#define DS3BT_GET_BDADDR 4 -#define DS3BT_SET_RUMBLE 5 -#define DS3BT_SET_LED 6 -#define DS3BT_GET_DATA 7 -#define DS3BT_RESET 8 - -#define DS3BT_BIND_RPC_ID 0x18E3878F - -static SifRpcClientData_t ds3bt; - -static u8 rpcbuf[64] __attribute__((aligned(64))); - -static u8 ds3bt_inited = 0; - -int ds3bt_init() -{ - ds3bt.server = NULL; - - do { - if (SifBindRpc(&ds3bt, DS3BT_BIND_RPC_ID, 0) < 0) - return 0; - - nopdelay(); - } while (!ds3bt.server); - - ds3bt_inited = 1; - - return 1; -} - -int ds3bt_deinit() -{ - ds3bt_inited = 0; - return 1; -} - -int ds3bt_reinit_ports(u8 ports) -{ - if (!ds3bt_inited) - return 0; - - rpcbuf[0] = ports; - return (SifCallRpc(&ds3bt, DS3BT_INIT, 0, rpcbuf, 1, NULL, 0, NULL, NULL) == 0); -} - -int ds3bt_init_charging() -{ - if (!ds3bt_inited) - return 0; - - return (SifCallRpc(&ds3bt, DS3BT_INIT_CHARGING, 0, NULL, 0, NULL, 0, NULL, NULL) == 0); -} - -int ds3bt_get_status(int port) -{ - if (!ds3bt_inited) - return 0; - - rpcbuf[0] = port; - - if (SifCallRpc(&ds3bt, DS3BT_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL) == 0) - return rpcbuf[0]; - - return 0; -} - -int ds3bt_get_bdaddr(u8 *bdaddr) -{ - int i, ret = 0; - - if (!ds3bt_inited) - return 0; - - if (SifCallRpc(&ds3bt, DS3BT_GET_BDADDR, 0, NULL, 0, rpcbuf, 7, NULL, NULL) == 0) { - for (i = 0; i < 6; i++) - bdaddr[i] = rpcbuf[i]; - - ret = rpcbuf[6]; - } - - return ret; -} - -int ds3bt_set_rumble(int port, u8 lrum, u8 rrum) -{ - if (!ds3bt_inited) - return 0; - - rpcbuf[0] = port; - rpcbuf[1] = lrum; - rpcbuf[2] = rrum; - - return (SifCallRpc(&ds3bt, DS3BT_SET_RUMBLE, 0, rpcbuf, 3, NULL, 0, NULL, NULL) == 0); -} - -int ds3bt_set_led(int port, u8 led) -{ - if (!ds3bt_inited) - return 0; - - rpcbuf[0] = port; - rpcbuf[1] = led; - - return (SifCallRpc(&ds3bt, DS3BT_SET_LED, 0, rpcbuf, 2, NULL, 0, NULL, NULL) == 0); -} - -int ds3bt_get_data(int port, u8 *data) -{ - int ret; - - if (!ds3bt_inited) - return 0; - - rpcbuf[0] = port; - - ret = (SifCallRpc(&ds3bt, DS3BT_GET_DATA, 0, rpcbuf, 1, rpcbuf, 18, NULL, NULL) == 0); - - memcpy(data, rpcbuf, 18); - - return ret; -} - -int ds3bt_reset() -{ - if (!ds3bt_inited) - return 0; - - return (SifCallRpc(&ds3bt, DS3BT_RESET, 0, NULL, 0, NULL, 0, NULL, NULL) == 0); -} diff --git a/modules/ds3bt/ee/libds3bt.h b/modules/ds3bt/ee/libds3bt.h deleted file mode 100644 index 9e26d85a1..000000000 --- a/modules/ds3bt/ee/libds3bt.h +++ /dev/null @@ -1,19 +0,0 @@ - -enum eDS3BTStatus { - DS3BT_STATE_USB_DISCONNECTED = 0x00, - DS3BT_STATE_USB_AUTHORIZED = 0x01, - DS3BT_STATE_USB_CONFIGURED = 0x02, - DS3BT_STATE_CONNECTED = 0x04, - DS3BT_STATE_RUNNING = 0x08, -}; - -int ds3bt_init(); -int ds3bt_deinit(); -int ds3bt_reinit_ports(u8 ports); -int ds3bt_init_charging(); -int ds3bt_get_status(int port); -int ds3bt_get_bdaddr(u8 *bdaddr); -int ds3bt_set_rumble(int port, u8 lrum, u8 rrum); -int ds3bt_set_led(int port, u8 led); -int ds3bt_get_data(int port, u8 *data); -int ds3bt_reset(); diff --git a/modules/ds3bt/iop/README b/modules/ds3bt/iop/README deleted file mode 100644 index 3429ba7c9..000000000 --- a/modules/ds3bt/iop/README +++ /dev/null @@ -1,115 +0,0 @@ -== First of all == -PS Remote Controller Bluetooth stack for Arduino with USB Host Shield / Arduino MEGA ADK -Copyright (C) 2010 Tomo Tanaka - Original written WiiRemote Stack adapted for using with PS3 Controller -Copyright (C) 2011 Ion Agorria - PS3 adaptation - -This program is based on which is developed by Richard Ibbotson. -This program also needs MAX3421E and USB libraries for Arduino written by Oleg Mazurov. -This program is based on WiiRemote code from https://github.com/moyuchin/WiiRemote_on_Arduino - -This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with this program. If not, see . - -== Hardware Requirement == - Case 1: - * Arduino - * USB Host Shield - Case 2: - * Arduino Mega ADK (USB Host included) - - * USB Bluetooth Device - - -== Software Requirement == - Case 1: - * MAX3421E and USB library for Arduino written by Oleg Mazurov - The source codes can be grabbed from https://github.com/felis/USB_Host_Shield - - Case 2: - *Same Libraries adapted for Arduino Mega ADK: - http://labs.arduino.cc/uploads/ADK/GettingStarted/arduino_bundle_ADB.zip - - Open Downloaded Library and copy these files to a folder with PSRemote files: - * Max3421e_constants.h - * Max3421e.h - * Max3421e.cpp - * ch9.h - * Usb.h - * Usb.cpp - - So it must look something like this - -== Files == - Folder/ - | - +- Example.pde - +- PSRemote.h - +- PSRemote.cpp - +- README.txt - +- Max3421e_constants.h - +- Max3421e.h - +- Max3421e.cpp - +- ch9.h - +- Usb.h - +- Usb.cpp - - -== Usage == -Same as USB version library -getBDADDR() and setBDADDR() are just for compatibility, they do nothing -rename header and constructor to "PSRemote" or see the example! - -Added Functions: - -getPSADDR(): gets connected PS bt address -LED(): sets LED only without affecting rumble -Rumble(): set Rumble without changing LEDs - -=== Modify USB Device Descriptors === -The values of CSR_VID and CSR_PID described in PSRemote.h need to be modified -to match descriptors of USB Bluetooth Device to be used. - -Default is configured for CSR chips (like mine) - - -== Hint == ---Hints from PS3 and Wiimote game controllers thread in Circuit@Home. - - Bluetooth 1.x seems not work on this library. - ---Bluetooth Docs: - -HCI, L2CAP,... Doc: https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=40560 - -BT HID profile Doc: https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=7108 - ---Sixaxis/DualShock3 Info: - -Windows Driver/Pairing: MotionInJoy -Linux Pairing: sixaxis.c source file -Mac: I dont know but i seem some - -http://www.pabr.org/sixlinux/sixlinux.en.html -http://wiki.ps2dev.org/ps3:hardware:sixaxis -http://wiibrew.org/wiki/Sixaxis - -== ACKNOWLEDGEMENT & INFO == -I appreciate the gread codes developed by Oleg, Richard and Tomo :-) - ---What Does?-- - --HCI Waits for PS Remote (Remenber to Pair with your BT Dongle!!!) -Then Accepts connect Req and goes to L2CAP - --L2CAP responses two Connection Req from PSRemote (HID Control and HID Interrupt) -Then configures it and then passed to HID - --Initializates PS Controller and lights all Leds - --??? - --Profit - -I started this because noone has taken initiative with PS (unlike Wii) diff --git a/modules/ds3bt/iop/ds3bt.c b/modules/ds3bt/iop/ds3bt.c deleted file mode 100644 index 5c6f132d0..000000000 --- a/modules/ds3bt/iop/ds3bt.c +++ /dev/null @@ -1,1675 +0,0 @@ - -/* bt code ported from: https://github.com/IonAgorria/Arduino-PSRemote see README */ -/* usb code based on usbhdfsd module from ps2sdk */ - -#include "types.h" -#include "ioman.h" -#include "intrman.h" -#include "loadcore.h" -#include "stdio.h" -#include "sifcmd.h" -#include "sifrpc.h" -#include "sysclib.h" -#include "sysmem.h" -#include "usbd.h" -#include "usbd_macro.h" -#include "thbase.h" -#include "thevent.h" -#include "thsemap.h" -#include "sifman.h" -#include "vblank.h" -#include "ds3bt.h" - -IRX_ID("ds3bt", 1, 1); - -//#define DPRINTF(x...) printf(x) -#define DPRINTF(x...) - -#define USB_CLASS_WIRELESS_CONTROLLER 0xE0 -#define USB_SUBCLASS_RF_CONTROLLER 0x01 -#define USB_PROTOCOL_BLUETOOTH_PROG 0x01 - -int bt_probe(int devId); -int bt_connect(int devId); -int bt_disconnect(int devId); - -UsbDriver bt_driver = {NULL, NULL, "ds3bt", bt_probe, bt_connect, bt_disconnect}; - -typedef struct _bt_dev -{ - int devId; - int hci_sema; - int l2cap_sema; - int l2cap_cmd_sema; - int controlEndp; - int eventEndp; - int inEndp; - int outEndp; - uint8_t status; -} bt_device; - -bt_device bt_dev = {-1, -1, -1, -1, -1, -1, -1, -1, DS3BT_STATE_USB_DISCONNECTED}; - -static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint); -static void bt_config_set(int result, int count, void *arg); -static void bt_release(); - -int bt_probe(int devId) -{ - UsbDeviceDescriptor *device = NULL; - UsbConfigDescriptor *config = NULL; - UsbInterfaceDescriptor *intf = NULL; - - DPRINTF("BT: probe: devId=%i\n", devId); - - if ((bt_dev.devId > 0) && (bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) { - DPRINTF("BT: Error - only one device allowed !\n"); - return 0; - } - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - if (device == NULL) { - DPRINTF("BT: Error - Couldn't get device descriptor\n"); - return 0; - } - - if (device->bNumConfigurations < 1) - return 0; - - config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); - if (config == NULL) { - DPRINTF("BT: Error - Couldn't get configuration descriptor\n"); - return 0; - } - - - if ((config->bNumInterfaces < 1) || (config->wTotalLength < (sizeof(UsbConfigDescriptor) + sizeof(UsbInterfaceDescriptor)))) { - DPRINTF("BT: Error - No interfaces available\n"); - return 0; - } - - intf = (UsbInterfaceDescriptor *)((char *)config + config->bLength); - - DPRINTF("BT: bInterfaceClass %X bInterfaceSubClass %X bInterfaceProtocol %X\n", - intf->bInterfaceClass, intf->bInterfaceSubClass, intf->bInterfaceProtocol); - - if ((intf->bInterfaceClass != USB_CLASS_WIRELESS_CONTROLLER) || - (intf->bInterfaceSubClass != USB_SUBCLASS_RF_CONTROLLER) || - (intf->bInterfaceProtocol != USB_PROTOCOL_BLUETOOTH_PROG) || - (intf->bNumEndpoints < 3)) { - return 0; - } - - return 1; -} - -int bt_connect(int devId) -{ - int i; - int epCount; - UsbDeviceDescriptor *device; - UsbConfigDescriptor *config; - UsbInterfaceDescriptor *interface; - UsbEndpointDescriptor *endpoint; - iop_sema_t SemaData; - - DPRINTF("BT: connect: devId=%i\n", devId); - - if (bt_dev.devId != -1) { - DPRINTF("BT: Error - only one device allowed !\n"); - return 1; - } - - bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; - - bt_dev.eventEndp = -1; - bt_dev.inEndp = -1; - bt_dev.outEndp = -1; - - bt_dev.controlEndp = UsbOpenEndpoint(devId, NULL); - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - - config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); - - interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); - - epCount = interface->bNumEndpoints; - - DPRINTF("BT: Endpoint Count %d \n", epCount); - - endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); - usb_probeEndpoint(devId, endpoint); - - for (i = 1; i < epCount; i++) { - endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); - usb_probeEndpoint(devId, endpoint); - } - - if (bt_dev.eventEndp < 0 || bt_dev.inEndp < 0 || bt_dev.outEndp < 0) { - bt_release(); - DPRINTF("BT: Error - connect failed: not enough endpoints! \n"); - return -1; - } - - SemaData.initial = 1; - SemaData.max = 1; - SemaData.option = 0; - SemaData.attr = 0; - - if ((bt_dev.hci_sema = CreateSema(&SemaData)) < 0) { - DPRINTF("BT: Failed to allocate I/O semaphore.\n"); - return -1; - } - - if ((bt_dev.l2cap_sema = CreateSema(&SemaData)) < 0) { - DPRINTF("BT: Failed to allocate I/O semaphore.\n"); - return -1; - } - - if ((bt_dev.l2cap_cmd_sema = CreateSema(&SemaData)) < 0) { - DPRINTF("DS3BT: Failed to allocate I/O semaphore.\n"); - return -1; - } - - bt_dev.devId = devId; - - bt_dev.status = DS3BT_STATE_USB_AUTHORIZED; - - UsbSetDeviceConfiguration(bt_dev.controlEndp, config->bConfigurationValue, bt_config_set, NULL); - - return 0; -} - -int bt_disconnect(int devId) -{ - DPRINTF("DS3BT: disconnect: devId=%i\n", devId); - - if (bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) { - if (bt_dev.eventEndp >= 0) - UsbCloseEndpoint(bt_dev.eventEndp); - - if (bt_dev.inEndp >= 0) - UsbCloseEndpoint(bt_dev.inEndp); - - if (bt_dev.outEndp >= 0) - UsbCloseEndpoint(bt_dev.outEndp); - - bt_release(); - } - - return 0; -} - -static void bt_release() -{ - DeleteSema(bt_dev.hci_sema); - DeleteSema(bt_dev.l2cap_sema); - DeleteSema(bt_dev.l2cap_cmd_sema); - - bt_dev.devId = -1; - bt_dev.eventEndp = -1; - bt_dev.inEndp = -1; - bt_dev.outEndp = -1; - bt_dev.controlEndp = -1; - bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; -} - -static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint) -{ - if (endpoint->bmAttributes == USB_ENDPOINT_XFER_BULK) { - if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && bt_dev.outEndp < 0) { - bt_dev.outEndp = UsbOpenEndpointAligned(devId, endpoint); - DPRINTF("BT: register Output endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.outEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - } else if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.inEndp < 0) { - bt_dev.inEndp = UsbOpenEndpointAligned(devId, endpoint); - DPRINTF("BT: register Input endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.inEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - } - } else if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { - if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.eventEndp < 0) { - bt_dev.eventEndp = UsbOpenEndpoint(devId, endpoint); - DPRINTF("BT: register Event endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.eventEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - } - } -} - -static int chrg_dev = -1; -static int chrg_end = -1; - -int chrg_probe(int devId) -{ - UsbDeviceDescriptor *device = NULL; - - DPRINTF("CHRG: probe: devId=%i\n", devId); - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - if (device == NULL) { - DPRINTF("CHRG: Error - Couldn't get device descriptor\n"); - return 0; - } - - if (device->idVendor == 0x054C && device->idProduct == 0x0268) - return 1; - - return 0; -} - -int chrg_connect(int devId) -{ - UsbDeviceDescriptor *device; - UsbConfigDescriptor *config; - - DPRINTF("CHRG: connect: devId=%i\n", devId); - - if (chrg_dev != -1) { - DPRINTF("CHRG: Error - only one device allowed !\n"); - return 1; - } - - chrg_dev = devId; - - chrg_end = UsbOpenEndpoint(devId, NULL); - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); - - UsbSetDeviceConfiguration(chrg_end, config->bConfigurationValue, NULL, NULL); - - return 0; -} - -int chrg_disconnect(int devId) -{ - DPRINTF("CHRG: disconnect: devId=%i\n", devId); - - if (chrg_dev == devId) { - if (chrg_end >= 0) - UsbCloseEndpoint(chrg_end); - - chrg_dev = -1; - chrg_end = -1; - } - - return 0; -} - -UsbDriver chrg_driver = {NULL, NULL, "chrg", chrg_probe, chrg_connect, chrg_disconnect}; - -/* PS Remote Reports */ -static uint8_t feature_F4_report[] = - { - 0x42, 0x03, 0x00, 0x00}; - -static uint8_t output_01_report[] = - { - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00}; - -static uint8_t power_level[] = - { - 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; - -// Taken from nefarius' SCPToolkit -// https://github.com/nefarius/ScpToolkit/blob/master/ScpControl/ScpControl.ini -// Valid MAC addresses used by Sony -static uint8_t GenuineMacAddress[][3] = - { - // Bluetooth chips by ALPS ELECTRIC CO., LTD - {0x00, 0x02, 0xC7}, - {0x00, 0x06, 0xF5}, - {0x00, 0x06, 0xF7}, - {0x00, 0x07, 0x04}, - {0x00, 0x16, 0xFE}, - {0x00, 0x19, 0xC1}, - {0x00, 0x1B, 0xFB}, - {0x00, 0x1E, 0x3D}, - {0x00, 0x21, 0x4F}, - {0x00, 0x23, 0x06}, - {0x00, 0x24, 0x33}, - {0x00, 0x26, 0x43}, - {0x00, 0xA0, 0x79}, - {0x04, 0x76, 0x6E}, - {0x04, 0x98, 0xF3}, - {0x28, 0xA1, 0x83}, - {0x34, 0xC7, 0x31}, - {0x38, 0xC0, 0x96}, - {0x60, 0x38, 0x0E}, - {0x64, 0xD4, 0xBD}, - {0xAC, 0x7A, 0x4D}, - {0xE0, 0x75, 0x0A}, - {0xE0, 0xAE, 0x5E}, - {0xFC, 0x62, 0xB9}, - // Bluetooth chips by AzureWave Technology Inc. - {0xE0, 0xB9, 0xA5}, - {0xDC, 0x85, 0xDE}, - {0xD0, 0xE7, 0x82}, - {0xB0, 0xEE, 0x45}, - {0xAC, 0x89, 0x95}, - {0xA8, 0x1D, 0x16}, - {0x94, 0xDB, 0xC9}, - {0x80, 0xD2, 0x1D}, - {0x80, 0xA5, 0x89}, - {0x78, 0x18, 0x81}, - {0x74, 0xF0, 0x6D}, - {0x74, 0xC6, 0x3B}, - {0x74, 0x2F, 0x68}, - {0x6C, 0xAD, 0xF8}, - {0x6C, 0x71, 0xD9}, - {0x60, 0x5B, 0xB4}, - {0x5C, 0x96, 0x56}, - {0x54, 0x27, 0x1E}, - {0x4C, 0xAA, 0x16}, - {0x48, 0x5D, 0x60}, - {0x44, 0xD8, 0x32}, - {0x40, 0xE2, 0x30}, - {0x38, 0x4F, 0xF0}, - {0x28, 0xC2, 0xDD}, - {0x24, 0x0A, 0x64}, - {0x1C, 0x4B, 0xD6}, - {0x08, 0xA9, 0x5A}, - {0x00, 0x25, 0xD3}, - {0x00, 0x24, 0x23}, - {0x00, 0x22, 0x43}, - {0x00, 0x15, 0xAF}, - //fake with AirohaTechnologyCorp's Chip - {0x0C, 0xFC, 0x83}}; - -/* variables used by high level HCI task */ -static uint16_t hci_counter_; // counter used for bluetooth HCI loops - -/* variables filled from HCI event management */ -static volatile uint8_t hci_event_flag_; // flag of received bluetooth events - -/* variables used by L2CAP */ -static volatile uint8_t l2cap_event_status_; -static uint8_t l2cap_txid_; // packet id increments for each packet sent -/* L2CAP CID name space: 0x0040-0xffff dynamically allocated */ -static uint16_t command_scid_; // Channel endpoint on command source -static uint16_t interrupt_scid_; // Channel endpoint on interrupt source - -/* variables used by Bluetooth HID */ -static uint8_t hid_flags_; -static uint8_t ds3bt_bdaddr_[6]; -static uint8_t dg_bdaddr[6]; - -static uint8_t hci_reset(); -static uint8_t hci_write_scan_enable(uint8_t conf); -static uint8_t hci_accept_connection(uint8_t *bdaddr); -static uint8_t hci_reject_connection(uint8_t *bdaddr); -static uint8_t hci_disconnect(uint16_t handle); -static uint8_t hci_change_connection_type(uint8_t pad); -static uint8_t hci_read_bdaddr(); -static uint8_t HCI_Command(uint16_t nbytes, uint8_t *dataptr); - -static uint8_t l2cap_connect_response(uint8_t rxid, uint16_t dcid, uint16_t scid, uint8_t pad); -static uint8_t l2cap_configure(uint16_t dcid, uint8_t pad); -static uint8_t l2cap_config_response(uint8_t rxid, uint16_t dcid, uint8_t pad); -static uint8_t l2cap_disconnect_response(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad); -static uint8_t l2cap_disconnection_request(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad); -static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad); - -static uint8_t initPSController(int pad); -static void readReport(uint8_t *data, int bytes, int pad); -static uint8_t writeReport(uint8_t *data, uint8_t length, int pad); - -static void HCI_task(uint8_t pad); -static void L2CAP_task(uint8_t pad); -static uint8_t HCI_event_task(int result); -static uint8_t L2CAP_event_task(int result, int bytes); - -static uint8_t hci_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; -static uint8_t l2cap_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; -static uint8_t hci_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; -static uint8_t l2cap_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; - -static void DS3BT_init(); -static int LED(uint8_t led, int pad); -static int Rumble(uint8_t lrum, uint8_t rrum, int pad); -static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); - -static uint8_t current_pad; -static uint8_t enable_pad; -static uint8_t press_emu; - -typedef struct -{ - uint16_t hci_handle_; //connection handle - uint16_t command_dcid_; // Channel endpoint on command destination - uint16_t interrupt_dcid_; // Channel endpoint on interrupt destination - uint8_t hci_state_; // current state of bluetooth HCI connection - uint8_t l2cap_state_; // current state of L2CAP connection - uint8_t status_; - uint8_t oldled; - uint8_t oldlrumble; - uint8_t oldrrumble; - uint8_t enabled; - uint8_t type; - uint8_t data[18]; -} ds3bt_pad_t; - -#define MAX_PADS 2 - -ds3bt_pad_t ds3pad[MAX_PADS]; - -static void DS3BT_init() -{ - uint8_t i; - - l2cap_txid_ = 1; - command_scid_ = 0x0040; // L2CAP local CID for HID_Control - interrupt_scid_ = 0x0041; // L2CAP local CID for HID_Interrupt - - hid_flags_ = 0; - - for (i = 0; i < MAX_PADS; i++) { - ds3pad[i].hci_handle_ = 0x0FFF; - ds3pad[i].status_ = bt_dev.status; - ds3pad[i].status_ |= DS3BT_STATE_USB_CONFIGURED; - ds3pad[i].hci_state_ = HCI_RESET_STATE; - ds3pad[i].l2cap_state_ = L2CAP_DOWN_STATE; - - ds3pad[i].data[0] = 0xFF; - ds3pad[i].data[1] = 0xFF; - ds3pad[i].enabled = (enable_pad >> i) & 1; - ds3pad[i].type = 0; - - mips_memset(&ds3pad[i].data[2], 0x7F, 4); - mips_memset(&ds3pad[i].data[6], 0x00, 12); - } - - hci_counter_ = 10; - current_pad = 0; - press_emu = 0; - - hci_reset(); -} - -static void hci_event_cb(int resultCode, int bytes, void *arg) -{ - uint8_t pad; - - PollSema(bt_dev.hci_sema); - - //DPRINTF("hci_event_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - - pad = HCI_event_task(resultCode); - HCI_task(pad); - - SignalSema(bt_dev.hci_sema); - UsbInterruptTransfer(bt_dev.eventEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, arg); -} - -static void l2cap_event_cb(int resultCode, int bytes, void *arg) -{ - int pad; - static uint8_t ret_ctr = 0; - - PollSema(bt_dev.l2cap_sema); - - //DPRINTF("l2cap_event_cb: res %d, bytes %d, arg %p\n", resultCode, bytes, arg); - - pad = L2CAP_event_task(resultCode, bytes); - L2CAP_task(pad); - - if (pad >= MAX_PADS) { - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); - return; - } - - if (ds3pad[pad].l2cap_state_ != L2CAP_READY_STATE) { //ds3 is connecting - DelayThread(14000); //fix for some bt adapters - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); - } else { //ds3 is running - if ((int)arg != -1 && pad != (int)arg && (int)arg < MAX_PADS) { //check if we get what was requested - if (ret_ctr == 20) { - ret_ctr = 0; - SignalSema(bt_dev.l2cap_sema); - } else { - ret_ctr++; - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, arg); //try again - } - } else { //we got what we wanted - SignalSema(bt_dev.l2cap_sema); - } - } -} - -static void l2cap_cmd_cb(int resultCode, int bytes, void *arg) -{ - //DPRINTF("l2cap_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - SignalSema(bt_dev.l2cap_cmd_sema); -} - -static void bt_config_set(int result, int count, void *arg) -{ - UsbInterruptTransfer(bt_dev.eventEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, NULL); - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); - - SignalSema(bt_dev.hci_sema); - SignalSema(bt_dev.l2cap_sema); - - DS3BT_init(); -} - -static uint8_t HCI_event_task(int result) -{ - uint8_t i, pad; - - pad = current_pad; - - if (!result) { - /* buf[0] = Event Code */ - /* buf[1] = Parameter Total Length */ - /* buf[n] = Event Parameters based on each event */ - DPRINTF("HCI event = 0x%x\n", hci_buf[0]); - switch (hci_buf[0]) { // switch on event type - case HCI_EVENT_COMMAND_COMPLETE: - hci_event_flag_ |= HCI_FLAG_COMMAND_COMPLETE; - - DPRINTF("Command OK = 0x%x", hci_buf[3]); - DPRINTF(" Returned = 0x%x\n", hci_buf[5]); - - if ((hci_buf[3] == 0x09) && (hci_buf[4] == 0x10)) { - for (i = 0; i < 6; i++) - dg_bdaddr[i] = hci_buf[6 + i]; - - hci_event_flag_ |= HCI_FLAG_READ_BDADDR; - } - - break; - - case HCI_EVENT_COMMAND_STATUS: - hci_event_flag_ |= HCI_FLAG_COMMAND_STATUS; - - if (hci_buf[2]) // show status on serial if not OK - { - DPRINTF("HCI Command Failed: \n"); - DPRINTF("\tStatus = %x\n", hci_buf[2]); - DPRINTF("\tCommand_OpCode(OGF) = %x\n", ((hci_buf[5] & 0xFC) >> 2)); - DPRINTF("\tCommand_OpCode(OCF) = %x%x\n", (hci_buf[5] & 0x03), hci_buf[4]); - } - - break; - - case HCI_EVENT_CONNECT_COMPLETE: - if (!hci_buf[2]) // check if connected OK - { - // store the handle for the ACL connection - ds3pad[pad].hci_handle_ = hci_buf[3] | ((hci_buf[4] & 0x0F) << 8); //pad = current_pad - - DPRINTF("HCI event Connect Complete = 0x%x\n", ds3pad[pad].hci_handle_); - hci_event_flag_ |= HCI_FLAG_CONNECT_COMPLETE; - } else { - DPRINTF("Error on Connect Complete = 0x%x\n", hci_buf[2]); - } - break; - - case HCI_EVENT_NUM_COMPLETED_PKT: - - DPRINTF("HCI Number Of Completed Packets Event: \n"); - DPRINTF("\tNumber_of_Handles = 0x%x\n", hci_buf[2]); - for (i = 0; i < hci_buf[2]; i++) { - DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[3 + i] | ((hci_buf[4 + i] & 0x0F) << 8))); - } - - if (hci_buf[2] == 1) { - for (i = 0; i < MAX_PADS; i++) //detect pad - { - if (ds3pad[i].hci_handle_ == (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))) { - pad = i; - break; - } - } - } - - break; - - case HCI_EVENT_QOS_SETUP_COMPLETE: - break; - - case HCI_EVENT_DISCONN_COMPLETE: - hci_event_flag_ |= HCI_FLAG_DISCONN_COMPLETE; - DPRINTF("HCI Disconnection Complete Event: \n"); - DPRINTF("\tStatus = 0x%x\n", hci_buf[2]); - DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))); - DPRINTF("\tReason = 0x%x\n", hci_buf[5]); - - for (i = 0; i < MAX_PADS; i++) //detect pad - { - if (ds3pad[i].hci_handle_ == (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))) { - pad = i; - break; - } - } - - break; - - case HCI_EVENT_CONNECT_REQUEST: - hci_event_flag_ |= HCI_FLAG_INCOMING_REQUEST; - DPRINTF("Connection Requested by BD_ADDR: \n"); - for (i = 0; i < 6; i++) { - ds3bt_bdaddr_[i] = (unsigned char)hci_buf[2 + i]; - DPRINTF("%x", ds3bt_bdaddr_[i]); - if (i < 5) - DPRINTF(":"); - } - - DPRINTF(" LINK: 0x%x\n", hci_buf[11]); - - for (i = 0; i < MAX_PADS; i++) //find free slot - { - if (!(ds3pad[i].status_ & DS3BT_STATE_RUNNING) && ds3pad[i].enabled) { - if (ds3pad[i].status_ & DS3BT_STATE_CONNECTED) { - if (ds3pad[i].l2cap_state_ == L2CAP_DISCONNECT_STATE) //if we're waiting for hci disconnect event - continue; - else - hci_disconnect(ds3pad[i].hci_handle_); //try to disconnect - } - - current_pad = i; - break; - } - } - - if (i >= MAX_PADS) //no free slot - { - hci_reject_connection(ds3bt_bdaddr_); - current_pad = pad; - return MAX_PADS; - } - - pad = current_pad; - - ds3pad[pad].type = 0xA2; //fake ds3 - - for (i = 0; i < sizeof(GenuineMacAddress) / 3; i++) //check if ds3 is genuine - { - if (ds3bt_bdaddr_[5] == GenuineMacAddress[i][0] && - ds3bt_bdaddr_[4] == GenuineMacAddress[i][1] && - ds3bt_bdaddr_[3] == GenuineMacAddress[i][2]) { - ds3pad[pad].type = HID_THDR_SET_REPORT_OUTPUT; - break; - } - } - - ds3pad[pad].hci_state_ = HCI_CONNECT_IN_STATE; - ds3pad[pad].l2cap_state_ = L2CAP_INIT_STATE; - ds3pad[pad].status_ &= ~DS3BT_STATE_CONNECTED; - ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; - - l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONNECTED; - - break; - - case HCI_EVENT_ROLE_CHANGED: - - DPRINTF("Role Change STATUS: 0x%x\n", hci_buf[2]); - - DPRINTF(" BD_ADDR: "); - for (i = 0; i < 6; i++) { - DPRINTF("%x", (unsigned char)hci_buf[3 + i]); - if (i < 5) - DPRINTF(":"); - } - - DPRINTF(" ROLE: 0x%x\n", hci_buf[9]); - - break; - case HCI_EVENT_MAX_SLOT_CHANGE: - - DPRINTF("Max Slot Change: \n"); - DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[2] | ((hci_buf[3] & 0x0F) << 8))); - DPRINTF("\tLMP Max Slots = 0x%x\n", hci_buf[5]); - break; - - case HCI_EVENT_CHANGED_CONNECTION_TYPE: - - DPRINTF("Packet Type Changed STATUS: 0x%x \n", hci_buf[2]); - DPRINTF(" TYPE: %x \n", (hci_buf[5] | (hci_buf[6] << 8))); - - break; - - case HCI_EVENT_PAGE_SR_CHANGED: - break; - - default: - DPRINTF("Unmanaged Event: 0x%x\n", hci_buf[0]); - break; - } // switch (buf[0]) - } - - return pad; -} - -static void HCI_task(uint8_t pad) -{ - int i; - - if (pad >= MAX_PADS) - return; - - switch (ds3pad[pad].hci_state_) { - case HCI_INIT_STATE: - // wait until we have looped 10 times to clear any old events - if (hci_timeout) { - for (i = 0; i < MAX_PADS; i++) { - if (ds3pad[i].status_ & DS3BT_STATE_RUNNING) - break; - } - - if (i == MAX_PADS) { - ds3pad[pad].hci_state_ = HCI_RESET_STATE; - hci_reset(); - } - - hci_counter_ = 10; - } - break; - - case HCI_RESET_STATE: - if (hci_command_complete) { - DPRINTF("HCI Reset complete\n"); - hci_read_bdaddr(); - ds3pad[pad].hci_state_ = HCI_READBDADDR_STATE; - } - if (hci_timeout) { - DPRINTF("No response to HCI Reset\n"); - ds3pad[pad].hci_state_ = HCI_INIT_STATE; - hci_counter_ = 10; - } - break; - - case HCI_READBDADDR_STATE: - if (hci_read_bdaddr_complete) { - DPRINTF("HCI read bdaddres complete\n"); - hci_write_scan_enable(SCAN_ENABLE_NOINQ_ENPAG); - ds3pad[pad].hci_state_ = HCI_CONNECT_IN_STATE; - hci_event_flag_ &= ~HCI_FLAG_INCOMING_REQUEST; - } - break; - - case HCI_CONNECT_IN_STATE: - if (hci_incoming_connect_request) { - hci_accept_connection(ds3bt_bdaddr_); - DPRINTF("PS Remote Connected\n"); - ds3pad[pad].hci_state_ = HCI_CHANGE_CONNECTION; - hci_event_flag_ &= ~HCI_FLAG_CONNECT_COMPLETE; - } - break; - - case HCI_CHANGE_CONNECTION: - if (hci_connect_complete) { - hci_change_connection_type(pad); - - ds3pad[pad].hci_state_ = HCI_CONNECTED_STATE; - - ds3pad[pad].status_ |= DS3BT_STATE_CONNECTED; - hci_event_flag_ &= ~HCI_FLAG_DISCONN_COMPLETE; - } - break; - - case HCI_CONNECTED_STATE: - if (hci_disconn_complete) { - DPRINTF("PS Remote Disconnected pad %d\n", pad); - - hci_event_flag_ &= ~HCI_FLAG_DISCONN_COMPLETE; - - ds3pad[pad].status_ &= ~DS3BT_STATE_CONNECTED; - ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; - - hci_counter_ = 10; - - if (ds3pad[pad].type != HID_THDR_SET_REPORT_OUTPUT) { - ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; - for (i = 0; i < MAX_PADS; i++) { - if (ds3pad[i].status_ & DS3BT_STATE_RUNNING) - break; - } - - if (i == MAX_PADS) - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); - } - - SignalSema(bt_dev.l2cap_sema); - } - break; - - default: - break; - } // switch (hci_state_) -} - -/************************************************************/ -/* HCI Commands */ -/************************************************************/ - -static uint8_t hci_reset() -{ - hci_event_flag_ = 0; // clear all the flags - - hci_cmd_buf[0] = HCI_OCF_RESET; - hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; - hci_cmd_buf[2] = 0x00; // Parameter Total Length = 0 - - return HCI_Command(3, hci_cmd_buf); -} - -static uint8_t hci_write_scan_enable(uint8_t conf) -{ - hci_event_flag_ &= ~HCI_FLAG_COMMAND_COMPLETE; - - hci_cmd_buf[0] = HCI_OCF_WRITE_SCAN_ENABLE; - hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; - hci_cmd_buf[2] = 0x01; - hci_cmd_buf[3] = conf; - return HCI_Command(4, hci_cmd_buf); -} - -static uint8_t hci_accept_connection(uint8_t *bdaddr) -{ - hci_event_flag_ &= ~(HCI_FLAG_INCOMING_REQUEST); - - hci_cmd_buf[0] = HCI_OCF_ACCEPT_CONNECTION; // HCI OCF = 9 - hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 - hci_cmd_buf[2] = 0x07; // parameter length 7 - hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address - hci_cmd_buf[4] = *(bdaddr + 1); - hci_cmd_buf[5] = *(bdaddr + 2); - hci_cmd_buf[6] = *(bdaddr + 3); - hci_cmd_buf[7] = *(bdaddr + 4); - hci_cmd_buf[8] = *(bdaddr + 5); - hci_cmd_buf[9] = 1; //switch role to slave - - return HCI_Command(10, hci_cmd_buf); -} - -static uint8_t hci_reject_connection(uint8_t *bdaddr) -{ - hci_event_flag_ &= ~(HCI_FLAG_INCOMING_REQUEST); - - hci_cmd_buf[0] = HCI_OCF_REJECT_CONNECTION; // HCI OCF = A - hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 - hci_cmd_buf[2] = 0x07; // parameter length 7 - hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address - hci_cmd_buf[4] = *(bdaddr + 1); - hci_cmd_buf[5] = *(bdaddr + 2); - hci_cmd_buf[6] = *(bdaddr + 3); - hci_cmd_buf[7] = *(bdaddr + 4); - hci_cmd_buf[8] = *(bdaddr + 5); - hci_cmd_buf[9] = 0x09; //reason max connection - - return HCI_Command(10, hci_cmd_buf); -} - -static uint8_t hci_disconnect(uint16_t handle) -{ - hci_cmd_buf[0] = 0x06; // HCI OCF = 6 - hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 - hci_cmd_buf[2] = 0x03; // parameter length = 3 - hci_cmd_buf[3] = (uint8_t)(handle & 0xFF); //connection handle - low byte - hci_cmd_buf[4] = (uint8_t)((handle >> 8) & 0x0F); //connection handle - high byte - hci_cmd_buf[5] = 0x13; // reason - - return HCI_Command(6, hci_cmd_buf); -} - -static uint8_t hci_change_connection_type(uint8_t pad) -{ - hci_event_flag_ &= ~HCI_FLAG_COMMAND_COMPLETE; - - hci_cmd_buf[0] = HCI_OCF_CHANGE_CONNECTION_TYPE; - hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; - hci_cmd_buf[2] = 0x04; // parameter length 4 - hci_cmd_buf[3] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag - hci_cmd_buf[4] = (uint8_t)(ds3pad[pad].hci_handle_ >> 8); - hci_cmd_buf[5] = 0x18; // Packet Type: 0xcc18 - hci_cmd_buf[6] = 0xcc; - - return HCI_Command(7, hci_cmd_buf); -} - -static uint8_t hci_read_bdaddr() -{ - hci_event_flag_ &= ~HCI_FLAG_READ_BDADDR; - - hci_cmd_buf[0] = HCI_OCF_ACCEPT_CONNECTION; // HCI OCF = 9 - hci_cmd_buf[1] = HCI_OGF_INFO_PARAM; // HCI OGF = 4 - hci_cmd_buf[2] = 0x00; - - return HCI_Command(3, hci_cmd_buf); -} - -/* perform HCI Command */ -static uint8_t HCI_Command(uint16_t nbytes, uint8_t *dataptr) -{ - return UsbControlTransfer(bt_dev.controlEndp, bmREQ_HCI_OUT, HCI_COMMAND_REQ, 0, 0, nbytes, dataptr, NULL, NULL); -} - -static uint8_t L2CAP_event_task(int result, int bytes) -{ - uint8_t pad = 0xFF; - - if (!result) { - for (pad = 0; pad < MAX_PADS; pad++) { - if (acl_handle_ok(ds3pad[pad].hci_handle_)) - break; - } - - if (pad >= MAX_PADS) { - DPRINTF("L2CAP Wrong Handle = 0x%x\n", ((l2cap_buf[0] | (l2cap_buf[1] << 8)))); - return pad; - } - - if (acl_handle_ok(ds3pad[pad].hci_handle_)) { - if (l2cap_control) { - DPRINTF("L2CAP Signaling Command = 0x%x pad %d\n", l2cap_buf[8], pad); - if (l2cap_command_reject) { - DPRINTF("ID = 0x%x", l2cap_buf[9]); - DPRINTF(" Reason = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); - DPRINTF(" DATA = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); - } else if (l2cap_connection_request) { - DPRINTF("Connection Request ID = 0x%x", l2cap_buf[9]); - DPRINTF(" PSM = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); - DPRINTF(" SCID = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); - - if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_WRITE) { - ds3pad[pad].command_dcid_ = l2cap_buf[14] | (l2cap_buf[15] << 8); - l2cap_connect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); - l2cap_event_status_ |= L2CAP_EV_COMMAND_CONNECTED; - } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_READ) { - ds3pad[pad].interrupt_dcid_ = l2cap_buf[14] | (l2cap_buf[15] << 8); - l2cap_connect_response(l2cap_buf[9], interrupt_scid_, ds3pad[pad].interrupt_dcid_, pad); - l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONNECTED; - } - } else if (l2cap_configuration_request) { - - DPRINTF("Conf Request ID = 0x%x\n", l2cap_buf[9]); - DPRINTF(" LEN = 0x%x", (l2cap_buf[10] | (l2cap_buf[11] << 8))); - DPRINTF(" SCID = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); - DPRINTF(" FLAG = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); - - if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { - l2cap_event_status_ |= L2CAP_EV_COMMAND_CONFIG_REQ; - l2cap_config_response(l2cap_buf[9], ds3pad[pad].command_dcid_, pad); - } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { - l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONFIG_REQ; - l2cap_config_response(l2cap_buf[9], ds3pad[pad].interrupt_dcid_, pad); - } - } else if (l2cap_configuration_response) { - - DPRINTF("Conf Response ID = 0x%x\n", l2cap_buf[9]); - DPRINTF(" LEN = 0x%x", (l2cap_buf[10] | (l2cap_buf[11] << 8))); - DPRINTF(" SCID = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); - DPRINTF(" FLAG = 0x%x", (l2cap_buf[14] | (l2cap_buf[15] << 8))); - DPRINTF(" RESULT = 0x%x\n", (l2cap_buf[16] | (l2cap_buf[17] << 8))); - - if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { - l2cap_event_status_ |= L2CAP_EV_COMMAND_CONFIGURED; - } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { - l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONFIGURED; - } - } else if (l2cap_disconnect_request) { - DPRINTF("Disconnect Req SCID = 0x%x\n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); - - ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; - - if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { - l2cap_event_status_ |= L2CAP_EV_COMMAND_DISCONNECT_REQ; - l2cap_disconnect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); - } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { - l2cap_event_status_ |= L2CAP_EV_INTERRUPT_DISCONNECT_REQ; - l2cap_disconnect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); - } - } else if (l2cap_disconnection_response) { - DPRINTF("Disconnect Res DCID = 0x%x\n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); - - ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; - - if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == ds3pad[pad].command_dcid_) { - l2cap_event_status_ |= L2CAP_EV_COMMAND_DISCONNECT_REQ; - hci_disconnect(ds3pad[pad].hci_handle_); - } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == ds3pad[pad].interrupt_dcid_) { - l2cap_event_status_ |= L2CAP_EV_INTERRUPT_DISCONNECT_REQ; - l2cap_disconnection_request((uint8_t)(l2cap_txid_++), command_scid_, ds3pad[pad].command_dcid_, pad); - } - } - } else if (l2cap_interrupt) { - readReport(l2cap_buf, bytes, pad); - } else if (l2cap_command) { - if (hid_handshake_success) { - hid_flags_ |= HID_FLAG_COMMAND_SUCCESS; - } - } - } // acl_handle_ok - } // !rcode - - return pad; -} - -static void L2CAP_task(uint8_t pad) -{ - if (pad >= MAX_PADS) - return; - - switch (ds3pad[pad].l2cap_state_) { - case L2CAP_INIT_STATE: - DPRINTF("L2CAP_I\n"); - l2cap_event_status_ &= ~L2CAP_EV_COMMAND_DISCONNECT_REQ; - l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_DISCONNECT_REQ; - ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_CONNECTING_STATE; - - case L2CAP_CONTROL_CONNECTING_STATE: - DPRINTF("L2CAP_C1 \n"); - if (l2cap_command_connected) { - l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONFIG_REQ; - ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_REQUEST_STATE; - } - break; - - case L2CAP_CONTROL_REQUEST_STATE: - DPRINTF("L2CAP_C2\n"); - if (l2cap_command_request) { - l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONFIGURED; - l2cap_configure(ds3pad[pad].command_dcid_, pad); - ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_CONFIGURING_STATE; - } - break; - - case L2CAP_CONTROL_CONFIGURING_STATE: - DPRINTF("L2CAP_C3\n"); - if (l2cap_command_configured) { - l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONNECTED; - ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_CONNECTING_STATE; - } - break; - - - case L2CAP_INTERRUPT_CONNECTING_STATE: - DPRINTF("L2CAP_I1\n"); - if (l2cap_interrupt_connected) { - l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONFIG_REQ; - l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONFIGURED; - ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_REQUEST_STATE; - } - break; - - case L2CAP_INTERRUPT_REQUEST_STATE: - DPRINTF("L2CAP_I2\n"); - if (l2cap_interrupt_request) { - l2cap_configure(ds3pad[pad].interrupt_dcid_, pad); - ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_CONFIGURING_STATE; - } - break; - - case L2CAP_INTERRUPT_CONFIGURING_STATE: - DPRINTF("L2CAP_I3\n"); - if (l2cap_interrupt_configured) { - ds3pad[pad].l2cap_state_ = L2CAP_CONNECTED_STATE; - } else - break; - - /* Established L2CAP */ - case L2CAP_CONNECTED_STATE: - DPRINTF("L2CAP_S\n"); - hid_flags_ = 0; - - initPSController(pad); - ds3pad[pad].l2cap_state_ = L2CAP_LED_STATE; - break; - - case L2CAP_LED_STATE: - DPRINTF("L2CAP_LED\n"); - if (hid_command_success) { - if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { - ds3pad[pad].l2cap_state_ = L2CAP_LED_STATE_END; - } else { - ds3pad[pad].l2cap_state_ = L2CAP_READY_STATE; - ds3pad[pad].status_ |= DS3BT_STATE_RUNNING; - } - LEDRumble((pad + 1) << 1, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); - } - break; - - case L2CAP_LED_STATE_END: - DPRINTF("L2CAP_LED_END\n"); - if (hid_command_success) { - ds3pad[pad].l2cap_state_ = L2CAP_READY_STATE; - ds3pad[pad].status_ |= DS3BT_STATE_RUNNING; - } - break; - - case L2CAP_READY_STATE: - break; - - case L2CAP_DISCONNECT_STATE: - DPRINTF("L2CAP_D\n"); - if (l2cap_interrupt_disconnected || l2cap_command_disconnected) { - ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; - } - break; - - default: - break; - } -} - -/************************************************************/ -/* L2CAP Commands */ -/************************************************************/ -static uint8_t l2cap_connect_response(uint8_t rxid, uint16_t dcid, uint16_t scid, uint8_t pad) -{ - uint8_t cmd_buf[12]; - - cmd_buf[0] = L2CAP_CMD_CONNECTION_RESPONSE; // Code - cmd_buf[1] = rxid; // Identifier - cmd_buf[2] = 0x08; // Length - cmd_buf[3] = 0x00; - cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID (Our) - cmd_buf[5] = (uint8_t)(dcid >> 8); - cmd_buf[6] = (uint8_t)(scid & 0xff); // Source CID (PS Remote) - cmd_buf[7] = (uint8_t)(scid >> 8); - cmd_buf[8] = 0x00; // Result - cmd_buf[9] = 0x00; - cmd_buf[10] = 0x00; // Status - cmd_buf[11] = 0x00; - - return L2CAP_Command((uint8_t *)cmd_buf, 12, pad); -} - -static uint8_t l2cap_configure(uint16_t dcid, uint8_t pad) -{ - uint8_t cmd_buf[12]; - - cmd_buf[0] = L2CAP_CMD_CONFIG_REQUEST; // Code - cmd_buf[1] = (uint8_t)(l2cap_txid_++); // Identifier - cmd_buf[2] = 0x08; // Length - cmd_buf[3] = 0x00; - cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID - cmd_buf[5] = (uint8_t)(dcid >> 8); - cmd_buf[6] = 0x00; // Flags - cmd_buf[7] = 0x00; - cmd_buf[8] = 0x01; // Config Opt: type = MTU (Maximum Transmission Unit) - cmd_buf[9] = 0x02; // Config Opt: length - cmd_buf[10] = 0x40; // Config Opt: data = maximum SDU size is 672 octets - cmd_buf[11] = 0x00; - - return L2CAP_Command((uint8_t *)cmd_buf, 12, pad); -} - -static uint8_t l2cap_config_response(uint8_t rxid, uint16_t dcid, uint8_t pad) -{ - uint8_t cmd_buf[10]; - - cmd_buf[0] = L2CAP_CMD_CONFIG_RESPONSE; // Code - cmd_buf[1] = rxid; // Identifier - cmd_buf[2] = 0x06; // Length - cmd_buf[3] = 0x00; - cmd_buf[4] = (uint8_t)(dcid & 0xff); // Source CID - cmd_buf[5] = (uint8_t)(dcid >> 8); - cmd_buf[6] = 0x00; // Result - cmd_buf[7] = 0x00; - cmd_buf[8] = 0x00; // Config - cmd_buf[9] = 0x00; - - return L2CAP_Command((uint8_t *)cmd_buf, 10, pad); -} - -static uint8_t l2cap_disconnect_response(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad) -{ - uint8_t cmd_buf[8]; - - cmd_buf[0] = L2CAP_CMD_DISCONNECT_RESPONSE; // Code - cmd_buf[1] = rxid; // Identifier - cmd_buf[2] = 0x04; // Length - cmd_buf[3] = 0x00; - cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID - cmd_buf[5] = (uint8_t)(dcid >> 8); - cmd_buf[6] = (uint8_t)(scid & 0xff); // Source CID - cmd_buf[7] = (uint8_t)(scid >> 8); - - return L2CAP_Command((uint8_t *)cmd_buf, 8, pad); -} - -static uint8_t l2cap_disconnection_request(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad) -{ - uint8_t cmd_buf[8]; - - cmd_buf[0] = L2CAP_CMD_DISCONNECT_REQUEST; // Code - cmd_buf[1] = rxid; // Identifier - cmd_buf[2] = 0x04; // Length - cmd_buf[3] = 0x00; - cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID - cmd_buf[5] = (uint8_t)(dcid >> 8); - cmd_buf[6] = (uint8_t)(scid & 0xff); // Source CID - cmd_buf[7] = (uint8_t)(scid >> 8); - - return L2CAP_Command((uint8_t *)cmd_buf, 8, pad); -} - -static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) -{ - PollSema(bt_dev.l2cap_cmd_sema); - - l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag - l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); - l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length - l2cap_cmd_buf[3] = (uint8_t)((4 + length) >> 8); - l2cap_cmd_buf[4] = (uint8_t)(length & 0xff); // L2CAP header: Length - l2cap_cmd_buf[5] = (uint8_t)(length >> 8); - l2cap_cmd_buf[6] = 0x01; // L2CAP header: Channel ID - l2cap_cmd_buf[7] = 0x00; // L2CAP Signalling channel over ACL-U logical link - - mips_memcpy(&l2cap_cmd_buf[8], data, length); - - // output on endpoint 2 - return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), l2cap_cmd_cb, NULL); -} - -/************************************************************/ -/* HID Commands */ -/************************************************************/ - -static uint8_t initPSController(int pad) -{ - uint8_t init_buf[2 + PS3_F4_REPORT_LEN]; - uint8_t i; - init_buf[0] = HID_THDR_SET_REPORT_FEATURE; // THdr - init_buf[1] = PS3_F4_REPORT_ID; // Report ID - - for (i = 0; i < PS3_F4_REPORT_LEN; i++) { - init_buf[2 + i] = (uint8_t)feature_F4_report[i]; - } - - return writeReport((uint8_t *)init_buf, 2 + PS3_F4_REPORT_LEN, pad); -} - - -#define DATA_START 11 - -static void readReport(uint8_t *data, int bytes, int pad) -{ - if (hid_input_report) { - ds3pad[pad].data[0] = ~data[DATA_START + ButtonStateL]; - ds3pad[pad].data[1] = ~data[DATA_START + ButtonStateH]; - - ds3pad[pad].data[2] = data[DATA_START + RightStickX]; //rx - ds3pad[pad].data[3] = data[DATA_START + RightStickY]; //ry - ds3pad[pad].data[4] = data[DATA_START + LeftStickX]; //lx - ds3pad[pad].data[5] = data[DATA_START + LeftStickY]; //ly - - if (bytes == 21 && !press_emu) - press_emu = 1; - - if (press_emu) //needs emulating pressure buttons - { - ds3pad[pad].data[6] = ((data[DATA_START + ButtonStateL] >> 5) & 1) * 255; //right - ds3pad[pad].data[7] = ((data[DATA_START + ButtonStateL] >> 7) & 1) * 255; //left - ds3pad[pad].data[8] = ((data[DATA_START + ButtonStateL] >> 4) & 1) * 255; //up - ds3pad[pad].data[9] = ((data[DATA_START + ButtonStateL] >> 6) & 1) * 255; //down - - ds3pad[pad].data[10] = ((data[DATA_START + ButtonStateH] >> 4) & 1) * 255; //triangle - ds3pad[pad].data[11] = ((data[DATA_START + ButtonStateH] >> 5) & 1) * 255; //circle - ds3pad[pad].data[12] = ((data[DATA_START + ButtonStateH] >> 6) & 1) * 255; //cross - ds3pad[pad].data[13] = ((data[DATA_START + ButtonStateH] >> 7) & 1) * 255; //square - - ds3pad[pad].data[14] = ((data[DATA_START + ButtonStateH] >> 2) & 1) * 255; //L1 - ds3pad[pad].data[15] = ((data[DATA_START + ButtonStateH] >> 3) & 1) * 255; //R1 - ds3pad[pad].data[16] = ((data[DATA_START + ButtonStateH] >> 0) & 1) * 255; //L2 - ds3pad[pad].data[17] = ((data[DATA_START + ButtonStateH] >> 1) & 1) * 255; //R2 - - data[DATA_START + Power] = 0x05; - } else { - ds3pad[pad].data[6] = data[DATA_START + PressureRight]; //right - ds3pad[pad].data[7] = data[DATA_START + PressureLeft]; //left - ds3pad[pad].data[8] = data[DATA_START + PressureUp]; //up - ds3pad[pad].data[9] = data[DATA_START + PressureDown]; //down - - ds3pad[pad].data[10] = data[DATA_START + PressureTriangle]; //triangle - ds3pad[pad].data[11] = data[DATA_START + PressureCircle]; //circle - ds3pad[pad].data[12] = data[DATA_START + PressureCross]; //cross - ds3pad[pad].data[13] = data[DATA_START + PressureSquare]; //square - - ds3pad[pad].data[14] = data[DATA_START + PressureL1]; //L1 - ds3pad[pad].data[15] = data[DATA_START + PressureR1]; //R1 - ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 - ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 - - if (data[DATA_START + PSButtonState] && (data[DATA_START + Power] != 0xEE)) //display battery level - ds3pad[pad].oldled = power_level[data[DATA_START + Power]]; - else - ds3pad[pad].oldled = (pad + 1) << 1; - - if (data[DATA_START + Power] == 0xEE) //charging - ds3pad[pad].oldled |= 0x80; - else - ds3pad[pad].oldled &= 0x7F; - } - } else { - DPRINTF("Unmanaged Input Report: THDR 0x%x ", data[8]); - DPRINTF(" ID 0x%x\n", data[9]); - } -} // readReport - -static uint8_t writeReport(uint8_t *data, uint8_t length, int pad) -{ - PollSema(bt_dev.l2cap_cmd_sema); - - l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag - l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); - l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length - l2cap_cmd_buf[3] = (uint8_t)((4 + length) >> 8); - l2cap_cmd_buf[4] = (uint8_t)(length & 0xff); // L2CAP header: Length - l2cap_cmd_buf[5] = (uint8_t)(length >> 8); - l2cap_cmd_buf[6] = (uint8_t)(ds3pad[pad].command_dcid_ & 0xff); // L2CAP header: Channel ID - l2cap_cmd_buf[7] = (uint8_t)(ds3pad[pad].command_dcid_ >> 8); - - mips_memcpy(&l2cap_cmd_buf[8], data, length); - - hid_flags_ &= ~HID_FLAG_COMMAND_SUCCESS; - - // output on endpoint 2 - return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), l2cap_cmd_cb, (void *)pad); -} // writeReport - -static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) -{ - uint8_t led_buf[PS3_01_REPORT_LEN + 2]; - - led_buf[0] = ds3pad[pad].type; // THdr - led_buf[1] = PS3_01_REPORT_ID; // Report ID - - mips_memcpy(&led_buf[2], output_01_report, sizeof(output_01_report)); // PS3_01_REPORT_LEN); - - if (ds3pad[pad].type == 0xA2) { - if (rrum < 5) - rrum = 0; - } - - led_buf[2 + 1] = 0xFE; //rt - led_buf[2 + 2] = rrum; //rp - led_buf[2 + 3] = 0xFE; //lt - led_buf[2 + 4] = lrum; //lp - - led_buf[2 + 9] = led & 0x7F; //LED Conf - - if (led & 0x80) //msb means charging, so blink - { - led_buf[2 + 13] = 0x32; - led_buf[2 + 18] = 0x32; - led_buf[2 + 23] = 0x32; - led_buf[2 + 28] = 0x32; - } - - ds3pad[pad].oldled = led; - ds3pad[pad].oldlrumble = lrum; - ds3pad[pad].oldrrumble = rrum; - - return writeReport((uint8_t *)led_buf, sizeof(output_01_report) + 2, pad); -} -/************************************************************/ -/* DS3BT Commands */ -/************************************************************/ - -static int LEDRUM(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) -{ - int ret; - - ret = LEDRumble(led, lrum, rrum, pad); - if (ret == USB_RC_OK) { - WaitSema(bt_dev.l2cap_cmd_sema); - if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { - WaitSema(bt_dev.l2cap_sema); - do { - ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); - if (ret == USB_RC_OK) - WaitSema(bt_dev.l2cap_sema); - else - break; - } while (!hid_command_success); - - SignalSema(bt_dev.l2cap_sema); - } - } else - DPRINTF("DS3BT: LEDRumble usb transfer error %d\n", ret); - - return ret; -} - -static int LED(uint8_t led, int pad) -{ - return LEDRUM(led, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); -} - -static int Rumble(uint8_t lrum, uint8_t rrum, int pad) -{ - return LEDRUM(ds3pad[pad].oldled, lrum, rrum, pad); -} - -void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port) -{ - if (port >= MAX_PADS) - return; - - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) - return; - - Rumble(lrum, rrum, port); -} - -void ds3bt_set_led(uint8_t led, int port) -{ - if (port >= MAX_PADS) - return; - - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) - return; - - LED(led, port); -} - -int ds3bt_get_bdaddr(uint8_t *data) -{ - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) - return 0; - - if (hci_read_bdaddr_complete) { - mips_memcpy(data, dg_bdaddr, 6); - return 1; - } - - return 0; -} - -void ds3bt_get_data(char *dst, int size, int port) -{ - int ret; - - if (port >= MAX_PADS) - return; - - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) && !(ds3pad[port].status_ & DS3BT_STATE_RUNNING)) - return; - - WaitSema(bt_dev.l2cap_sema); - - ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)port); - - if (ret == USB_RC_OK) - WaitSema(bt_dev.l2cap_sema); - else - DPRINTF("DS3BT: ds3bt_get_data usb transfer error %d\n", ret); - - mips_memcpy(dst, ds3pad[port].data, size); - - SignalSema(bt_dev.l2cap_sema); -} - -void ds3bt_reset() -{ - int pad, ret; - - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) - return; - - for (pad = 0; pad < MAX_PADS; pad++) { - if ((ds3pad[pad].status_ & DS3BT_STATE_CONNECTED) || (ds3pad[pad].status_ & DS3BT_STATE_RUNNING)) { - ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; - ds3pad[pad].l2cap_state_ = L2CAP_DOWN_STATE; - - ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); - - if (ret == USB_RC_OK) - WaitSema(bt_dev.l2cap_sema); - else - DPRINTF("DS3BT: ds3bt_get_data usb transfer error %d\n", ret); - - if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { - l2cap_disconnection_request((uint8_t)(l2cap_txid_++), interrupt_scid_, ds3pad[pad].interrupt_dcid_, pad); - WaitSema(bt_dev.l2cap_cmd_sema); - } else { - hci_disconnect(ds3pad[pad].hci_handle_); - } - - WaitSema(bt_dev.hci_sema); - } - } - - DS3BT_init(); - - WaitSema(bt_dev.hci_sema); - - DelayThread(1000000); -} - -int ds3bt_get_status(int port) -{ - int status = bt_dev.status; - - if ((status & DS3BT_STATE_USB_AUTHORIZED) && (port < MAX_PADS)) - status |= ds3pad[port].status_; - - return status; -} - -int ds3bt_init(uint8_t pads) -{ - enable_pad = pads; - - ds3bt_reset(); - - return 1; -} - -static uint8_t chrg_inited = 0; - -void ds3bt_init_charging() -{ - if (!chrg_inited) - UsbRegisterDriver(&chrg_driver); - - chrg_inited = 1; -} - -static void rpc_thread(void *data); -static void *rpc_sf(int cmd, void *data, int size); - -static SifRpcDataQueue_t rpc_que __attribute__((aligned(16))); -static SifRpcServerData_t rpc_svr __attribute__((aligned(16))); - -static int rpc_buf[64] __attribute((aligned(16))); - -#define DS3BT_INIT 1 -#define DS3BT_INIT_CHARGING 2 -#define DS3BT_GET_STATUS 3 -#define DS3BT_GET_BDADDR 4 -#define DS3BT_SET_RUMBLE 5 -#define DS3BT_SET_LED 6 -#define DS3BT_GET_DATA 7 -#define DS3BT_RESET 8 - -#define DS3BT_BIND_RPC_ID 0x18E3878F - -void rpc_thread(void *data) -{ - SifInitRpc(0); - SifSetRpcQueue(&rpc_que, GetThreadId()); - SifRegisterRpc(&rpc_svr, DS3BT_BIND_RPC_ID, rpc_sf, rpc_buf, NULL, NULL, &rpc_que); - SifRpcLoop(&rpc_que); -} - -void *rpc_sf(int cmd, void *data, int size) -{ - switch (cmd) { - case DS3BT_INIT: - ds3bt_init(*(uint8_t *)data); - break; - case DS3BT_INIT_CHARGING: - ds3bt_init_charging(); - break; - case DS3BT_GET_STATUS: - *(uint8_t *)data = ds3bt_get_status(*(uint8_t *)data); - break; - case DS3BT_GET_BDADDR: - *(uint8_t *)(data + 6) = ds3bt_get_bdaddr((uint8_t *)data); - break; - case DS3BT_SET_RUMBLE: - ds3bt_set_rumble(*(uint8_t *)(data + 1), *(uint8_t *)(data + 2), *(uint8_t *)data); - break; - case DS3BT_SET_LED: - ds3bt_set_led(*(uint8_t *)(data + 1), *(uint8_t *)data); - break; - case DS3BT_GET_DATA: - ds3bt_get_data((uint8_t *)data, 18, *(uint8_t *)data); - break; - case DS3BT_RESET: - ds3bt_reset(); - break; - default: - break; - } - - return data; -} - -int _start(int argc, char *argv[]) -{ - uint8_t enable = 0xFF; - - if (argc > 1) { - enable = argv[1][0]; - } - - enable_pad = enable; - - if (UsbRegisterDriver(&bt_driver) != USB_RC_OK) { - DPRINTF("DS3BT: Error registering BT devices\n"); - return MODULE_NO_RESIDENT_END; - } - - iop_thread_t rpc_th; - - rpc_th.attr = TH_C; - rpc_th.thread = rpc_thread; - rpc_th.priority = 40; - rpc_th.stacksize = 0x800; - rpc_th.option = 0; - - int thid = CreateThread(&rpc_th); - - if (thid > 0) { - StartThread(thid, NULL); - return MODULE_RESIDENT_END; - } - - return MODULE_NO_RESIDENT_END; -} diff --git a/modules/ds3bt/iop/ds3bt.h b/modules/ds3bt/iop/ds3bt.h deleted file mode 100644 index 19c833213..000000000 --- a/modules/ds3bt/iop/ds3bt.h +++ /dev/null @@ -1,282 +0,0 @@ -#ifndef _DS3BT_H_ -#define _DS3BT_H_ - -#include "types.h" -#include "usbd.h" - -typedef u8 uint8_t; -typedef u16 uint16_t; - -void mips_memcpy(void *, const void *, unsigned); -void mips_memset(void *, int, unsigned); - -enum eHCI { - // {{{ - /* Bluetooth HCI states for HCI_task() */ - HCI_INIT_STATE = 0, - HCI_RESET_STATE, - HCI_READBDADDR_STATE, - HCI_CONNECT_IN_STATE, - HCI_CHANGE_CONNECTION, - HCI_READ_REMOTE_SUPPORTED_FEATURES, - HCI_CONNECTED_STATE, - - /* HCI OpCode Group Field (OGF) */ - HCI_OGF_LINK_CNTRL = (0x01 << 2), // OGF: Link Control Commands - HCI_OGF_LINK_POLICY = (0x02 << 2), // OGF: Link Policy Commands - HCI_OGF_CTRL_BBAND = (0x03 << 2), // OGF: Controller & Baseband Commands - HCI_OGF_INFO_PARAM = (0x04 << 2), // OGF: Informational Parameters - - /* HCI OpCode Command Field (OCF) */ - HCI_OCF_ACCEPT_CONNECTION = 0x09, // OGF = 0x01 - HCI_OCF_REJECT_CONNECTION = 0x0A, // OGF = 0x01 - HCI_OCF_CHANGE_CONNECTION_TYPE = 0x0F, // OGF = 0x01 - HCI_OCF_RESET = 0x03, // OGF = 0x03 - HCI_OCF_WRITE_ACCEPT_TIMEOUT = 0x16, // OGF = 0x03 - HCI_OCF_WRITE_SCAN_ENABLE = 0x1A, // OGF = 0x03 - - /* HCI events managed */ - HCI_EVENT_CONNECT_COMPLETE = 0x03, - HCI_EVENT_CONNECT_REQUEST = 0x04, - HCI_EVENT_DISCONN_COMPLETE = 0x05, - HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE = 0x0B, - HCI_EVENT_QOS_SETUP_COMPLETE = 0x0d, // do nothing - HCI_EVENT_COMMAND_COMPLETE = 0x0e, - HCI_EVENT_COMMAND_STATUS = 0x0f, - HCI_EVENT_ROLE_CHANGED = 0x12, - HCI_EVENT_NUM_COMPLETED_PKT = 0x13, // do nothing - HCI_EVENT_CHANGED_CONNECTION_TYPE = 0x1D, - HCI_EVENT_PAGE_SR_CHANGED = 0x20, - HCI_EVENT_MAX_SLOT_CHANGE = 0x1B, //Max Slots Change event - - /* HCI event flags for hci_event_flag */ - HCI_FLAG_COMMAND_COMPLETE = 0x01, - HCI_FLAG_COMMAND_STATUS = 0x02, - HCI_FLAG_CONNECT_COMPLETE = 0x04, - HCI_FLAG_DISCONN_COMPLETE = 0x08, - HCI_FLAG_INCOMING_REQUEST = 0x10, - HCI_FLAG_READ_BDADDR = 0x20, - - /* HCI Scan Enable Parameters */ - SCAN_ENABLE_NOINQ_NOPAG = 0x00, - SCAN_ENABLE_ENINQ_NOPAG = 0x01, - SCAN_ENABLE_NOINQ_ENPAG = 0x02, - SCAN_ENABLE_ENINQ_ENPAG = 0x03, - - // used in control endpoint header for HCI Commands - bmREQ_HCI_OUT = (USB_DIR_OUT | - USB_TYPE_CLASS | - USB_RECIP_DEVICE), - HCI_COMMAND_REQ = 0, - // }}} -}; - -enum eL2CAP { - // {{{ - /* Bluetooth L2CAP PSM */ - L2CAP_PSM_WRITE = 0x11, // HID_Control - L2CAP_PSM_READ = 0x13, // HID_Interrupt - - /* Bluetooth L2CAP states for L2CAP_task() */ - L2CAP_DOWN_STATE = 0, - L2CAP_INIT_STATE, - L2CAP_CONTROL_CONNECTING_STATE, - L2CAP_CONTROL_REQUEST_STATE, - L2CAP_CONTROL_CONFIGURING_STATE, - L2CAP_INTERRUPT_CONNECTING_STATE, - L2CAP_INTERRUPT_REQUEST_STATE, - L2CAP_INTERRUPT_CONFIGURING_STATE, - L2CAP_CONNECTED_STATE, - L2CAP_LED_STATE, - L2CAP_LED_STATE_END, - L2CAP_READY_STATE, - L2CAP_DISCONNECT_STATE, - - /* L2CAP event flags */ - L2CAP_EV_COMMAND_CONNECTED = 0x01, - L2CAP_EV_COMMAND_CONFIG_REQ = 0x02, - L2CAP_EV_COMMAND_CONFIGURED = 0x04, - L2CAP_EV_COMMAND_DISCONNECT_REQ = 0x08, - L2CAP_EV_INTERRUPT_CONNECTED = 0x10, - L2CAP_EV_INTERRUPT_CONFIG_REQ = 0x20, - L2CAP_EV_INTERRUPT_CONFIGURED = 0x40, - L2CAP_EV_INTERRUPT_DISCONNECT_REQ = 0x80, - - /* L2CAP signaling command */ - L2CAP_CMD_COMMAND_REJECT = 0x01, - L2CAP_CMD_CONNECTION_REQUEST = 0x02, - L2CAP_CMD_CONNECTION_RESPONSE = 0x03, - L2CAP_CMD_CONFIG_REQUEST = 0x04, - L2CAP_CMD_CONFIG_RESPONSE = 0x05, - L2CAP_CMD_DISCONNECT_REQUEST = 0x06, - L2CAP_CMD_DISCONNECT_RESPONSE = 0x07, - - /* HCI ACL Data Packet - * - * buf[0] buf[1] buf[2] buf[3] - * 0 4 8 11 12 16 24 31 MSB - * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. - * | HCI Handle |PB |BC | Data Total Length | HCI ACL Data Packet - * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. - * - * buf[4] buf[5] buf[6] buf[7] - * 0 8 16 31 MSB - * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. - * | Length | Channel ID | Basic L2CAP header - * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. - * - * buf[8] buf[9] buf[10] buf[11] - * 0 8 16 31 MSB - * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. - * | Code | Identifier | Length | Control frame (C-frame) - * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. (signaling packet format) - */ - // }}} -}; - -enum eHID { - // {{{ - /* HID event flag */ - HID_FLAG_STATUS_REPORTED = 0x01, - HID_FLAG_BUTTONS_CHANGED = 0x02, - HID_FLAG_EXTENSION = 0x04, - HID_FLAG_COMMAND_SUCCESS = 0x08, - - /* Bluetooth HID Transaction Header (THdr) */ - HID_THDR_GET_REPORT_FEATURE = 0x43, - HID_THDR_SET_REPORT_OUTPUT = 0x52, - HID_THDR_SET_REPORT_FEATURE = 0x53, - HID_THDR_DATA_INPUT = 0xa1, - - /* Defines of various parameters for PS3 Game controller reports */ - PS3_F4_REPORT_ID = 0xF4, - PS3_F4_REPORT_LEN = 0x04, - - PS3_01_REPORT_ID = 0x01, - PS3_01_REPORT_LEN = 0x30, - // }}} -}; - -enum eDS3BTLEDRumble { - psLEDN = 0x00, - psLED1 = 0x02, - psLED2 = 0x04, - psLED3 = 0x08, - psLED4 = 0x0F, - psLEDA = 0x10, -}; - -enum eDS3BTStatus { - DS3BT_STATE_USB_DISCONNECTED = 0x00, - DS3BT_STATE_USB_AUTHORIZED = 0x01, - DS3BT_STATE_USB_CONFIGURED = 0x02, - DS3BT_STATE_CONNECTED = 0x04, - DS3BT_STATE_RUNNING = 0x08, -}; - -//Structure which describes the type 01 input report -enum TYPE_01_REPORT { - ButtonStateL = 0, // Main buttons Low - ButtonStateH, // Main buttons High - PSButtonState, // PS button - Reserved1, // Unknown - LeftStickX, // left Joystick X axis 0 - 255, 128 is mid - LeftStickY, // left Joystick Y axis 0 - 255, 128 is mid - RightStickX, // right Joystick X axis 0 - 255, 128 is mid - RightStickY, // right Joystick Y axis 0 - 255, 128 is mid - Reserved2, // Unknown - Reserved3, // Unknown - Reserved4, // Unknown - Reserved5, // Unknown - PressureUp, // digital Pad Up button Pressure 0 - 255 - PressureRight, // digital Pad Right button Pressure 0 - 255 - PressureDown, // digital Pad Down button Pressure 0 - 255 - PressureLeft, // digital Pad Left button Pressure 0 - 255 - PressureL2, // digital Pad L2 button Pressure 0 - 255 - PressureR2, // digital Pad R2 button Pressure 0 - 255 - PressureL1, // digital Pad L1 button Pressure 0 - 255 - PressureR1, // digital Pad R1 button Pressure 0 - 255 - PressureTriangle, // digital Pad Triangle button Pressure 0 - 255 - PressureCircle, // digital Pad Circle button Pressure 0 - 255 - PressureCross, // digital Pad Cross button Pressure 0 - 255 - PressureSquare, // digital Pad Square button Pressure 0 - 255 - Reserved6, // Unknown - Reserved7, // Unknown - Reserved8, // Unknown - Charge, // charging status ? 02 = charge, 03 = normal - Power, // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging - Connection, // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble - Reserved9, // Unknown - Reserved10, // Unknown - Reserved11, // Unknown - Reserved12, // Unknown - Reserved13, // Unknown - Reserved14, // Unknown - Reserved15, // Unknown - Reserved16, // Unknown - Reserved17, // Unknown - AccelXH, // X axis accelerometer Big Endian 0 - 1023 - AccelXL, // Low - AccelYH, // Y axis accelerometer Big Endian 0 - 1023 - AccelYL, // Low - AccelZH, // Z Accelerometer Big Endian 0 - 1023 - AccelZL, // Low - GyroZH, // Z axis Gyro Big Endian 0 - 1023 - GyroZL, // Low -}; - -enum eBUF_SIZE { - MAX_BUFFER_SIZE = 64, // Size of general purpose data buffer -}; - -/* HCI macro */ -#define hci_timeout (hci_counter_-- == 0) - -/* Macros for HCI event flag tests */ -#define hci_command_complete (hci_event_flag_ & HCI_FLAG_COMMAND_COMPLETE) -#define hci_command_status (hci_event_flag_ & HCI_FLAG_COMMAND_STATUS) -#define hci_connect_complete (hci_event_flag_ & HCI_FLAG_CONNECT_COMPLETE) -#define hci_disconn_complete (hci_event_flag_ & HCI_FLAG_DISCONN_COMPLETE) -#define hci_incoming_connect_request (hci_event_flag_ & HCI_FLAG_INCOMING_REQUEST) -#define hci_read_bdaddr_complete (hci_event_flag_ & HCI_FLAG_READ_BDADDR) - -/* Macros for L2CAP event flag tests */ -#define l2cap_command_connected (l2cap_event_status_ & L2CAP_EV_COMMAND_CONNECTED) -#define l2cap_command_request (l2cap_event_status_ & L2CAP_EV_COMMAND_CONFIG_REQ) -#define l2cap_command_configured (l2cap_event_status_ & L2CAP_EV_COMMAND_CONFIGURED) -#define l2cap_command_disconnected (l2cap_event_status_ & L2CAP_EV_COMMAND_DISCONNECT_REQ) -#define l2cap_interrupt_connected (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONNECTED) -#define l2cap_interrupt_request (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONFIG_REQ) -#define l2cap_interrupt_configured (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONFIGURED) -#define l2cap_interrupt_disconnected (l2cap_event_status_ & L2CAP_EV_INTERRUPT_DISCONNECT_REQ) - -/* Macros for L2CAP event task tests */ -#define acl_handle_ok(handle) (((l2cap_buf[0] | (l2cap_buf[1] << 8)) & 0x0FFF) == (handle & 0x0FFF)) -#define l2cap_control ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == 0x0001) // Channel ID for ACL-U -#define l2cap_interrupt ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == interrupt_scid_) -#define l2cap_command ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == command_scid_) -#define l2cap_command_reject (l2cap_buf[8] == L2CAP_CMD_COMMAND_REJECT) -#define l2cap_connection_request (l2cap_buf[8] == L2CAP_CMD_CONNECTION_REQUEST) -#define l2cap_configuration_request (l2cap_buf[8] == L2CAP_CMD_CONFIG_REQUEST) -#define l2cap_configuration_response (l2cap_buf[8] == L2CAP_CMD_CONFIG_RESPONSE) -#define l2cap_configuration_success ((l2cap_buf[16] | (l2cap_buf[17] << 8)) == 0x0000) -#define l2cap_disconnect_request (l2cap_buf[8] == L2CAP_CMD_DISCONNECT_REQUEST) -#define l2cap_disconnection_response (l2cap_buf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) - -/* Macros for HID event flag tests */ -#define hid_buttons_changed (hid_flags_ & HID_FLAG_BUTTONS_CHANGED) -#define hid_extension (hid_flags_ & HID_FLAG_EXTENSION) -#define hid_command_success (hid_flags_ & HID_FLAG_COMMAND_SUCCESS) -#define hid_handshake_success (l2cap_buf[8] == 0) -#define hid_input_report ((data[8] == HID_THDR_DATA_INPUT) & (data[9] == PS3_01_REPORT_ID)) - -int ds3bt_init(uint8_t pads); -void ds3bt_init_charging(); -int ds3bt_get_status(int port); -void ds3bt_reset(); -void ds3bt_get_data(char *dst, int size, int port); -void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port); -void ds3bt_set_led(uint8_t led, int port); -int ds3bt_get_bdaddr(uint8_t *data); - -#endif diff --git a/modules/ds3usb/ee/libds3usb.c b/modules/ds3usb/ee/libds3usb.c deleted file mode 100644 index 03e42dec6..000000000 --- a/modules/ds3usb/ee/libds3usb.c +++ /dev/null @@ -1,143 +0,0 @@ -#include -#include -#include - -#define DS3USB_INIT 1 -#define DS3USB_GET_STATUS 2 -#define DS3USB_GET_BDADDR 3 -#define DS3USB_SET_BDADDR 4 -#define DS3USB_SET_RUMBLE 5 -#define DS3USB_SET_LED 6 -#define DS3USB_GET_DATA 7 -#define DS3USB_RESET 8 - -#define DS3USB_BIND_RPC_ID 0x18E3878E - -static SifRpcClientData_t ds3usb; - -static u8 rpcbuf[64] __attribute__((aligned(64))); - -static u8 ds3usb_inited = 0; - -int ds3usb_init() -{ - ds3usb.server = NULL; - - do { - if (SifBindRpc(&ds3usb, DS3USB_BIND_RPC_ID, 0) < 0) - return 0; - - nopdelay(); - } while (!ds3usb.server); - - ds3usb_inited = 1; - - return 1; -} - -int ds3usb_deinit() -{ - ds3usb_inited = 0; - return 1; -} - -int ds3usb_reinit_ports(u8 ports) -{ - if (!ds3usb_inited) - return 0; - - rpcbuf[0] = ports; - return (SifCallRpc(&ds3usb, DS3USB_INIT, 0, rpcbuf, 1, NULL, 0, NULL, NULL) == 0); -} - -int ds3usb_get_status(int port) -{ - if (!ds3usb_inited) - return 0; - - rpcbuf[0] = port; - - if (SifCallRpc(&ds3usb, DS3USB_GET_STATUS, 0, rpcbuf, 1, rpcbuf, 1, NULL, NULL) == 0) - return rpcbuf[0]; - - return 0; -} - -int ds3usb_get_bdaddr(int port, u8 *bdaddr) -{ - int i, ret; - - if (!ds3usb_inited) - return 0; - - rpcbuf[0] = port; - - ret = (SifCallRpc(&ds3usb, DS3USB_GET_BDADDR, 0, rpcbuf, 1, rpcbuf, 6, NULL, NULL) == 0); - - for (i = 0; i < 6; i++) - bdaddr[i] = rpcbuf[i]; - - return ret; -} - -int ds3usb_set_bdaddr(int port, u8 *bdaddr) -{ - int i; - - if (!ds3usb_inited) - return 0; - - rpcbuf[0] = port; - - for (i = 0; i < 6; i++) - rpcbuf[i + 1] = bdaddr[i]; - - return (SifCallRpc(&ds3usb, DS3USB_SET_BDADDR, 0, rpcbuf, 7, NULL, 0, NULL, NULL) == 0); -} - -int ds3usb_set_rumble(int port, u8 lrum, u8 rrum) -{ - if (!ds3usb_inited) - return 0; - - rpcbuf[0] = port; - rpcbuf[1] = lrum; - rpcbuf[2] = rrum; - - return (SifCallRpc(&ds3usb, DS3USB_SET_RUMBLE, 0, rpcbuf, 3, NULL, 0, NULL, NULL) == 0); -} - -int ds3usb_set_led(int port, u8 led) -{ - if (!ds3usb_inited) - return 0; - - rpcbuf[0] = port; - rpcbuf[1] = led; - - return (SifCallRpc(&ds3usb, DS3USB_SET_LED, 0, rpcbuf, 2, NULL, 0, NULL, NULL) == 0); -} - -int ds3usb_get_data(int port, u8 *data) -{ - int ret; - - if (!ds3usb_inited) - return 0; - - rpcbuf[0] = port; - - ret = (SifCallRpc(&ds3usb, DS3USB_GET_DATA, 0, rpcbuf, 1, rpcbuf, 18, NULL, NULL) == 0); - - memcpy(data, rpcbuf, 18); - - return ret; -} - -int ds3usb_reset() -{ - if (!ds3usb_inited) - return 0; - - return (SifCallRpc(&ds3usb, DS3USB_RESET, 0, NULL, 0, NULL, 0, NULL, NULL) == 0); -} diff --git a/modules/ds3usb/ee/libds3usb.h b/modules/ds3usb/ee/libds3usb.h deleted file mode 100644 index ffbc45574..000000000 --- a/modules/ds3usb/ee/libds3usb.h +++ /dev/null @@ -1,19 +0,0 @@ - -enum eDS3USBStatus { - DS3USB_STATE_DISCONNECTED = 0x00, - DS3USB_STATE_AUTHORIZED = 0x01, - DS3USB_STATE_CONFIGURED = 0x02, - DS3USB_STATE_CONNECTED = 0x04, - DS3USB_STATE_RUNNING = 0x08, -}; - -int ds3usb_init(); -int ds3usb_deinit(); -int ds3usb_reinit_ports(u8 ports); -int ds3usb_get_status(int port); -int ds3usb_get_bdaddr(int port, u8 *bdaddr); -int ds3usb_set_bdaddr(int port, u8 *bdaddr); -int ds3usb_set_rumble(int port, u8 lrum, u8 rrum); -int ds3usb_set_led(int port, u8 led); -int ds3usb_get_data(int port, u8 *data); -int ds3usb_reset(); diff --git a/modules/ds3usb/iop/ds3usb.c b/modules/ds3usb/iop/ds3usb.c deleted file mode 100644 index 79ef6db54..000000000 --- a/modules/ds3usb/iop/ds3usb.c +++ /dev/null @@ -1,534 +0,0 @@ -#include "types.h" -#include "ioman.h" -#include "intrman.h" -#include "loadcore.h" -#include "stdio.h" -#include "sifcmd.h" -#include "sifrpc.h" -#include "sysclib.h" -#include "sysmem.h" -#include "usbd.h" -#include "usbd_macro.h" -#include "thbase.h" -#include "thevent.h" -#include "thsemap.h" -#include "sifman.h" -#include "vblank.h" -#include "ds3usb.h" - -IRX_ID("ds3usb", 1, 1); - -//#define DPRINTF(x...) printf(x) -#define DPRINTF(x...) - -#define MAX_PADS 2 - -static uint8_t output_01_report[] = - { - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00}; - -static uint8_t power_level[] = - { - 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; - -static uint8_t usb_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; - -int usb_probe(int devId); -int usb_connect(int devId); -int usb_disconnect(int devId); - -static void usb_release(int pad); -static void usb_config_set(int result, int count, void *arg); - -UsbDriver usb_driver = {NULL, NULL, "ds3usb", usb_probe, usb_connect, usb_disconnect}; - -static void DS3USB_init(int pad); -static void readReport(uint8_t *data, int pad); -static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); -static uint8_t LED(uint8_t led, int pad); -static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad); - -typedef struct _usb_ds3 -{ - int devId; - int sema; - int controlEndp; - int eventEndp; - uint8_t status; - uint8_t oldled; - uint8_t oldlrumble; - uint8_t oldrrumble; - uint8_t data[18]; - uint8_t enabled; -} ds3usb_device; - -ds3usb_device ds3pad[MAX_PADS]; - -int usb_probe(int devId) -{ - UsbDeviceDescriptor *device = NULL; - - DPRINTF("DS3USB: probe: devId=%i\n", devId); - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - if (device == NULL) { - DPRINTF("DS3USB: Error - Couldn't get device descriptor\n"); - return 0; - } - - if (device->idVendor == 0x054C && device->idProduct == 0x0268) - return 1; - - return 0; -} - -int usb_connect(int devId) -{ - int pad, epCount; - UsbDeviceDescriptor *device; - UsbConfigDescriptor *config; - UsbInterfaceDescriptor *interface; - UsbEndpointDescriptor *endpoint; - iop_sema_t SemaData; - - DPRINTF("DS3USB: connect: devId=%i\n", devId); - - for (pad = 0; pad < MAX_PADS; pad++) { - if (ds3pad[pad].devId == -1 && ds3pad[pad].enabled) - break; - } - - if (pad >= MAX_PADS) { - DPRINTF("DS3USB: Error - only %d device allowed !\n", MAX_PADS); - return 1; - } - - ds3pad[pad].devId = devId; - - ds3pad[pad].status = DS3USB_STATE_AUTHORIZED; - - ds3pad[pad].controlEndp = UsbOpenEndpoint(devId, NULL); - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); - interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); - - epCount = interface->bNumEndpoints - 1; - - endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); - - do { - - if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { - if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && ds3pad[pad].eventEndp < 0) { - ds3pad[pad].eventEndp = UsbOpenEndpointAligned(devId, endpoint); - DPRINTF("BT: register Event endpoint id =%i addr=%02X packetSize=%i\n", ds3pad[pad].eventEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - break; - } - } - - endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); - - } while (epCount--); - - if (ds3pad[pad].eventEndp < 0) { - usb_release(pad); - return 1; - } - - SemaData.initial = 1; - SemaData.max = 1; - SemaData.option = 0; - SemaData.attr = 0; - - if ((ds3pad[pad].sema = CreateSema(&SemaData)) < 0) { - DPRINTF("DS3USB: Failed to allocate I/O semaphore.\n"); - return -1; - } - - ds3pad[pad].status |= DS3USB_STATE_CONNECTED; - - UsbSetDeviceConfiguration(ds3pad[pad].controlEndp, config->bConfigurationValue, usb_config_set, (void *)pad); - - return 0; -} - -int usb_disconnect(int devId) -{ - uint8_t pad; - - DPRINTF("DS3USB: disconnect: devId=%i\n", devId); - - for (pad = 0; pad < MAX_PADS; pad++) { - if (ds3pad[pad].devId == devId) - break; - } - - if (pad < MAX_PADS && (ds3pad[pad].status & DS3USB_STATE_AUTHORIZED)) - usb_release(pad); - - return 0; -} - -static void usb_release(int pad) -{ - if (ds3pad[pad].sema >= 0) - DeleteSema(ds3pad[pad].sema); - - if (ds3pad[pad].eventEndp >= 0) - UsbCloseEndpoint(ds3pad[pad].eventEndp); - - ds3pad[pad].controlEndp = -1; - ds3pad[pad].eventEndp = -1; - ds3pad[pad].devId = -1; - ds3pad[pad].status = DS3USB_STATE_DISCONNECTED; -} - -static void usb_data_cb(int resultCode, int bytes, void *arg) -{ - int pad = (int)arg; - - //DPRINTF("usb_data_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - - if (!resultCode) - readReport(usb_buf, pad); - - SignalSema(ds3pad[pad].sema); -} - -static void usb_cmd_cb(int resultCode, int bytes, void *arg) -{ - int pad = (int)arg; - - //DPRINTF("usb_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - - SignalSema(ds3pad[pad].sema); -} - -static void usb_config_set(int result, int count, void *arg) -{ - int pad = (int)arg; - - ds3pad[pad].status |= DS3USB_STATE_CONFIGURED; - - DS3USB_init(pad); - - DelayThread(10000); - - LED((pad + 1) << 1, pad); - - ds3pad[pad].status |= DS3USB_STATE_RUNNING; -} - -static void DS3USB_init(int pad) -{ - usb_buf[0] = 0x42; - usb_buf[1] = 0x0c; - usb_buf[2] = 0x00; - usb_buf[3] = 0x00; - - UsbControlTransfer(ds3pad[pad].controlEndp, bmREQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF4, 0, 4, usb_buf, NULL, NULL); -} - -#define DATA_START 2 - -static void readReport(uint8_t *data, int pad) -{ - if (data[0]) { - ds3pad[pad].data[0] = ~data[DATA_START + ButtonStateL]; - ds3pad[pad].data[1] = ~data[DATA_START + ButtonStateH]; - - ds3pad[pad].data[2] = data[DATA_START + RightStickX]; //rx - ds3pad[pad].data[3] = data[DATA_START + RightStickY]; //ry - ds3pad[pad].data[4] = data[DATA_START + LeftStickX]; //lx - ds3pad[pad].data[5] = data[DATA_START + LeftStickY]; //ly - - ds3pad[pad].data[6] = data[DATA_START + PressureRight]; //right - ds3pad[pad].data[7] = data[DATA_START + PressureLeft]; //left - ds3pad[pad].data[8] = data[DATA_START + PressureUp]; //up - ds3pad[pad].data[9] = data[DATA_START + PressureDown]; //down - - ds3pad[pad].data[10] = data[DATA_START + PressureTriangle]; //triangle - ds3pad[pad].data[11] = data[DATA_START + PressureCircle]; //circle - ds3pad[pad].data[12] = data[DATA_START + PressureCross]; //cross - ds3pad[pad].data[13] = data[DATA_START + PressureSquare]; //square - - ds3pad[pad].data[14] = data[DATA_START + PressureL1]; //L1 - ds3pad[pad].data[15] = data[DATA_START + PressureR1]; //R1 - ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 - ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 - - if (data[DATA_START + PSButtonState] && (data[DATA_START + Power] != 0xEE)) //display battery level - ds3pad[pad].oldled = power_level[data[DATA_START + Power]]; - else - ds3pad[pad].oldled = (pad + 1) << 1; - - if (data[DATA_START + Power] == 0xEE) //charging - ds3pad[pad].oldled |= 0x80; - else - ds3pad[pad].oldled &= 0x7F; - } -} - -static uint8_t LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) -{ - mips_memcpy(usb_buf, output_01_report, sizeof(output_01_report)); - - usb_buf[1] = 0xFE; //rt - usb_buf[2] = rrum; //rp - usb_buf[3] = 0xFE; //lt - usb_buf[4] = lrum; //lp - - usb_buf[9] = led & 0x7F; //LED Conf - - if (led & 0x80) //msb means charging, so blink - { - usb_buf[13] = 0x32; - usb_buf[18] = 0x32; - usb_buf[23] = 0x32; - usb_buf[28] = 0x32; - } - - ds3pad[pad].oldled = led; - ds3pad[pad].oldlrumble = lrum; - ds3pad[pad].oldrrumble = rrum; - - return UsbControlTransfer(ds3pad[pad].controlEndp, bmREQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_SET_REPORT_OUTPUT << 8) | 0x01, 0, sizeof(output_01_report), usb_buf, usb_cmd_cb, (void *)pad); -} - -static uint8_t LED(uint8_t led, int pad) -{ - return LEDRumble(led, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); -} - -static uint8_t Rumble(uint8_t lrum, uint8_t rrum, int pad) -{ - return LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); -} - -void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port) -{ - if (port >= MAX_PADS) - return; - - WaitSema(ds3pad[port].sema); - - Rumble(lrum, rrum, port); - - WaitSema(ds3pad[port].sema); - - SignalSema(ds3pad[port].sema); -} - -void ds3usb_set_led(uint8_t led, int port) -{ - if (port >= MAX_PADS) - return; - - WaitSema(ds3pad[port].sema); - - LED(led, port); - - WaitSema(ds3pad[port].sema); - - SignalSema(ds3pad[port].sema); -} - -void ds3usb_get_data(char *dst, int size, int port) -{ - if (port >= MAX_PADS) - return; - - WaitSema(ds3pad[port].sema); - - UsbInterruptTransfer(ds3pad[port].eventEndp, usb_buf, MAX_BUFFER_SIZE, usb_data_cb, (void *)port); - - WaitSema(ds3pad[port].sema); - - mips_memcpy(dst, ds3pad[port].data, size); - - SignalSema(ds3pad[port].sema); -} - -void ds3usb_get_bdaddr(uint8_t *data, int port) -{ - int i; - - if (port >= MAX_PADS) - return; - - WaitSema(ds3pad[port].sema); - - UsbControlTransfer(ds3pad[port].controlEndp, bmREQ_USB_IN, USB_REQ_GET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF5, 0, 8, usb_buf, usb_cmd_cb, (void *)port); - - WaitSema(ds3pad[port].sema); - - for (i = 0; i < 6; i++) - data[5 - i] = usb_buf[2 + i]; - - SignalSema(ds3pad[port].sema); -} - -void ds3usb_set_bdaddr(uint8_t *data, int port) -{ - int i; - - WaitSema(ds3pad[port].sema); - - usb_buf[0] = 0x01; - usb_buf[1] = 0x00; - - for (i = 0; i < 6; i++) - usb_buf[i + 2] = data[5 - i]; - - UsbControlTransfer(ds3pad[port].controlEndp, bmREQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF5, 0, 8, usb_buf, usb_cmd_cb, (void *)port); - - WaitSema(ds3pad[port].sema); - - SignalSema(ds3pad[port].sema); -} - -void ds3usb_reset() -{ - int pad; - - for (pad = 0; pad < MAX_PADS; pad++) - usb_release(pad); -} - -int ds3usb_get_status(int port) -{ - return ds3pad[port].status; -} - -void ds3usb_init(uint8_t pads) -{ - uint8_t pad; - - for (pad = 0; pad < MAX_PADS; pad++) { - usb_release(pad); - - ds3pad[pad].status = 0; - ds3pad[pad].devId = -1; - ds3pad[pad].oldled = 0; - ds3pad[pad].oldlrumble = 0; - ds3pad[pad].oldrrumble = 0; - ds3pad[pad].sema = -1; - ds3pad[pad].controlEndp = -1; - ds3pad[pad].eventEndp = -1; - ds3pad[pad].enabled = (pads >> pad) & 1; - - ds3pad[pad].data[0] = 0xFF; - ds3pad[pad].data[1] = 0xFF; - - mips_memset(&ds3pad[pad].data[2], 0x7F, 4); - mips_memset(&ds3pad[pad].data[6], 0x00, 12); - } -} - -static void rpc_thread(void *data); -static void *rpc_sf(int cmd, void *data, int size); - -static SifRpcDataQueue_t rpc_que __attribute__((aligned(16))); -static SifRpcServerData_t rpc_svr __attribute__((aligned(16))); - -static int rpc_buf[64] __attribute((aligned(16))); - -#define DS3USB_INIT 1 -#define DS3USB_GET_STATUS 2 -#define DS3USB_GET_BDADDR 3 -#define DS3USB_SET_BDADDR 4 -#define DS3USB_SET_RUMBLE 5 -#define DS3USB_SET_LED 6 -#define DS3USB_GET_DATA 7 -#define DS3USB_RESET 8 - -#define DS3USB_BIND_RPC_ID 0x18E3878E - -void rpc_thread(void *data) -{ - SifInitRpc(0); - SifSetRpcQueue(&rpc_que, GetThreadId()); - SifRegisterRpc(&rpc_svr, DS3USB_BIND_RPC_ID, rpc_sf, rpc_buf, NULL, NULL, &rpc_que); - SifRpcLoop(&rpc_que); -} - -void *rpc_sf(int cmd, void *data, int size) -{ - switch (cmd) { - case DS3USB_INIT: - ds3usb_init(*(uint8_t *)data); - break; - case DS3USB_GET_STATUS: - *(uint8_t *)data = ds3usb_get_status(*(uint8_t *)data); - break; - case DS3USB_GET_BDADDR: - ds3usb_get_bdaddr((uint8_t *)data, *(uint8_t *)data); - break; - case DS3USB_SET_BDADDR: - ds3usb_set_bdaddr((uint8_t *)(data + 1), *(uint8_t *)data); - break; - case DS3USB_SET_RUMBLE: - ds3usb_set_rumble(*(uint8_t *)(data + 1), *(uint8_t *)(data + 2), *(uint8_t *)data); - break; - case DS3USB_SET_LED: - ds3usb_set_led(*(uint8_t *)(data + 1), *(uint8_t *)data); - break; - case DS3USB_GET_DATA: - ds3usb_get_data((uint8_t *)data, 18, *(uint8_t *)data); - break; - case DS3USB_RESET: - ds3usb_reset(); - break; - default: - break; - } - - return data; -} - -int _start(int argc, char *argv[]) -{ - uint8_t enable = 0xFF; - - if (argc > 1) { - enable = argv[1][0]; - } - - ds3usb_init(enable); - - int ret = UsbRegisterDriver(&usb_driver); - - if (ret != USB_RC_OK) { - DPRINTF("DS3USB: Error registering USB devices\n"); - return MODULE_NO_RESIDENT_END; - } - - iop_thread_t rpc_th; - - rpc_th.attr = TH_C; - rpc_th.thread = rpc_thread; - rpc_th.priority = 40; - rpc_th.stacksize = 0x800; - rpc_th.option = 0; - - int thid = CreateThread(&rpc_th); - - if (thid > 0) { - StartThread(thid, NULL); - return MODULE_RESIDENT_END; - } - - return MODULE_NO_RESIDENT_END; -} diff --git a/modules/ds3usb/iop/ds3usb.h b/modules/ds3usb/iop/ds3usb.h deleted file mode 100644 index ad056efe9..000000000 --- a/modules/ds3usb/iop/ds3usb.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef _DS3USB_H_ -#define _DS3USB_H_ - -#include "types.h" -#include "usbd.h" - -typedef u8 uint8_t; -typedef u16 uint16_t; - -void mips_memcpy(void *, const void *, unsigned); -void mips_memset(void *, int, unsigned); - -enum eHID { - // {{{ - /* HID event flag */ - HID_FLAG_STATUS_REPORTED = 0x01, - HID_FLAG_BUTTONS_CHANGED = 0x02, - HID_FLAG_EXTENSION = 0x04, - HID_FLAG_COMMAND_SUCCESS = 0x08, - - /* USB HID Transaction Header (THdr) */ - HID_USB_GET_REPORT_FEATURE = 0x03, - HID_USB_SET_REPORT_OUTPUT = 0x02, - HID_USB_DATA_INPUT = 0x01, - - /* Defines of various parameters for PS3 Game controller reports */ - PS3_F4_REPORT_ID = 0xF4, - PS3_F4_REPORT_LEN = 0x04, - - PS3_01_REPORT_ID = 0x01, - PS3_01_REPORT_LEN = 0x30, - // }}} - - bmREQ_USB_OUT = (USB_DIR_OUT | - USB_TYPE_CLASS | - USB_RECIP_INTERFACE), - - bmREQ_USB_IN = (USB_DIR_IN | - USB_TYPE_CLASS | - USB_RECIP_INTERFACE), - -}; - - -enum eDS3USBLEDRumble { - psLEDN = 0x00, - psLED1 = 0x02, - psLED2 = 0x04, - psLED3 = 0x08, - psLED4 = 0x0F, - psLEDA = 0x10, -}; - -enum eDS3USBStatus { - DS3USB_STATE_DISCONNECTED = 0x00, - DS3USB_STATE_AUTHORIZED = 0x01, - DS3USB_STATE_CONFIGURED = 0x02, - DS3USB_STATE_CONNECTED = 0x04, - DS3USB_STATE_RUNNING = 0x08, -}; - -//Structure which describes the type 01 input report -enum TYPE_01_REPORT { - ButtonStateL = 0, // Main buttons Low - ButtonStateH, // Main buttons High - PSButtonState, // PS button - Reserved1, // Unknown - LeftStickX, // left Joystick X axis 0 - 255, 128 is mid - LeftStickY, // left Joystick Y axis 0 - 255, 128 is mid - RightStickX, // right Joystick X axis 0 - 255, 128 is mid - RightStickY, // right Joystick Y axis 0 - 255, 128 is mid - Reserved2, // Unknown - Reserved3, // Unknown - Reserved4, // Unknown - Reserved5, // Unknown - PressureUp, // digital Pad Up button Pressure 0 - 255 - PressureRight, // digital Pad Right button Pressure 0 - 255 - PressureDown, // digital Pad Down button Pressure 0 - 255 - PressureLeft, // digital Pad Left button Pressure 0 - 255 - PressureL2, // digital Pad L2 button Pressure 0 - 255 - PressureR2, // digital Pad R2 button Pressure 0 - 255 - PressureL1, // digital Pad L1 button Pressure 0 - 255 - PressureR1, // digital Pad R1 button Pressure 0 - 255 - PressureTriangle, // digital Pad Triangle button Pressure 0 - 255 - PressureCircle, // digital Pad Circle button Pressure 0 - 255 - PressureCross, // digital Pad Cross button Pressure 0 - 255 - PressureSquare, // digital Pad Square button Pressure 0 - 255 - Reserved6, // Unknown - Reserved7, // Unknown - Reserved8, // Unknown - Charge, // charging status ? 02 = charge, 03 = normal - Power, // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging - Connection, // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble - Reserved9, // Unknown - Reserved10, // Unknown - Reserved11, // Unknown - Reserved12, // Unknown - Reserved13, // Unknown - Reserved14, // Unknown - Reserved15, // Unknown - Reserved16, // Unknown - Reserved17, // Unknown - AccelXH, // X axis accelerometer Big Endian 0 - 1023 - AccelXL, // Low - AccelYH, // Y axis accelerometer Big Endian 0 - 1023 - AccelYL, // Low - AccelZH, // Z Accelerometer Big Endian 0 - 1023 - AccelZL, // Low - GyroZH, // Z axis Gyro Big Endian 0 - 1023 - GyroZL, // Low -}; - -enum eBUF_SIZE { - MAX_BUFFER_SIZE = 64, // Size of general purpose data buffer -}; - -void ds3usb_init(uint8_t pads); -int ds3usb_get_status(int port); -void ds3usb_reset(); -void ds3usb_get_data(char *dst, int size, int port); -void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port); -void ds3usb_set_led(uint8_t led, int port); -void ds3usb_get_bdaddr(uint8_t *data, int port); -void ds3usb_set_bdaddr(uint8_t *data, int port); - -#endif diff --git a/modules/mcemu/mcemu.c b/modules/mcemu/mcemu.c index 76942ce66..072d3f624 100644 --- a/modules/mcemu/mcemu.c +++ b/modules/mcemu/mcemu.c @@ -70,7 +70,7 @@ void StartNow(void *param) exp = GetExportTable("sio2man", 0x201); if (exp != NULL) { /* hooking SIO2MAN's routines */ - InstallSio2manHook(exp); + InstallSio2manHook(exp, 1); } else { DPRINTF("SIO2MAN exports not found.\n"); } @@ -109,12 +109,12 @@ void InstallSecrmanHook(void *exp) //endfunc //--------------------------------------------------------------------------- /* Installs handlers for SIO2MAN's routine for enabled virtual memory cards */ -void InstallSio2manHook(void *exp) +void InstallSio2manHook(void *exp, int ver) { /* hooking SIO2MAN entry #25 (used by MCMAN and old PADMAN) */ pSio2man25 = HookExportEntry(exp, 25, hookSio2man25); /* hooking SIO2MAN entry #51 (used by MC2_* modules and PADMAN) */ - pSio2man51 = HookExportEntry(exp, 51, hookSio2man51); + pSio2man51 = HookExportEntry(exp, 49 + (ver * 2), hookSio2man51); pSio2man67 = HookExportEntry(exp, 67, hookSio2man67); } //------------------------------ @@ -237,7 +237,7 @@ int hookRegisterLibraryEntires(iop_library_t *lib) if (ret == 0) { ReleaseLibraryEntries((struct irx_export_table *)lib); /* hooking SIO2MAN's routines */ - InstallSio2manHook(&lib[1]); + InstallSio2manHook(&lib[1], GetExportTableSize(&lib[1]) >= 61); } else { DPRINTF("registering library %s failed, error %d\n", lib->name, ret); return ret; diff --git a/modules/mcemu/mcemu.h b/modules/mcemu/mcemu.h index db7b2486e..299d0efd5 100644 --- a/modules/mcemu/mcemu.h +++ b/modules/mcemu/mcemu.h @@ -153,7 +153,7 @@ void hookSio2man(Sio2Packet *sd, Sio2McProc sio2proc); int hookRegisterLibraryEntires(iop_library_t *lib); void InstallSecrmanHook(void *exp); -void InstallSio2manHook(void *exp); +void InstallSio2manHook(void *exp, int ver); void InstallMcmanHook(void *exp); void SioResponse(MemoryCard *mcd, void *buf, int length); diff --git a/modules/pademu/Makefile b/modules/pademu/Makefile index f9fe04f85..b697d736a 100644 --- a/modules/pademu/Makefile +++ b/modules/pademu/Makefile @@ -4,13 +4,13 @@ ifeq ($(USE_USB),1) IOP_BIN = usb_pademu.irx IOP_CFLAGS += -DUSB IOP_OBJNAME = usb. -IOP_OBJS += ds3usb.o +IOP_OBJS += ds34usb.o endif ifeq ($(USE_BT),1) IOP_BIN = bt_pademu.irx IOP_CFLAGS += -DBT -DUSE_THREAD IOP_OBJNAME = bt. -IOP_OBJS += ds3bt.o +IOP_OBJS += ds34bt.o endif ifeq ($(VMC),1) IOP_CFLAGS += -DVMC diff --git a/modules/pademu/README b/modules/pademu/README deleted file mode 100644 index 3429ba7c9..000000000 --- a/modules/pademu/README +++ /dev/null @@ -1,115 +0,0 @@ -== First of all == -PS Remote Controller Bluetooth stack for Arduino with USB Host Shield / Arduino MEGA ADK -Copyright (C) 2010 Tomo Tanaka - Original written WiiRemote Stack adapted for using with PS3 Controller -Copyright (C) 2011 Ion Agorria - PS3 adaptation - -This program is based on which is developed by Richard Ibbotson. -This program also needs MAX3421E and USB libraries for Arduino written by Oleg Mazurov. -This program is based on WiiRemote code from https://github.com/moyuchin/WiiRemote_on_Arduino - -This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with this program. If not, see . - -== Hardware Requirement == - Case 1: - * Arduino - * USB Host Shield - Case 2: - * Arduino Mega ADK (USB Host included) - - * USB Bluetooth Device - - -== Software Requirement == - Case 1: - * MAX3421E and USB library for Arduino written by Oleg Mazurov - The source codes can be grabbed from https://github.com/felis/USB_Host_Shield - - Case 2: - *Same Libraries adapted for Arduino Mega ADK: - http://labs.arduino.cc/uploads/ADK/GettingStarted/arduino_bundle_ADB.zip - - Open Downloaded Library and copy these files to a folder with PSRemote files: - * Max3421e_constants.h - * Max3421e.h - * Max3421e.cpp - * ch9.h - * Usb.h - * Usb.cpp - - So it must look something like this - -== Files == - Folder/ - | - +- Example.pde - +- PSRemote.h - +- PSRemote.cpp - +- README.txt - +- Max3421e_constants.h - +- Max3421e.h - +- Max3421e.cpp - +- ch9.h - +- Usb.h - +- Usb.cpp - - -== Usage == -Same as USB version library -getBDADDR() and setBDADDR() are just for compatibility, they do nothing -rename header and constructor to "PSRemote" or see the example! - -Added Functions: - -getPSADDR(): gets connected PS bt address -LED(): sets LED only without affecting rumble -Rumble(): set Rumble without changing LEDs - -=== Modify USB Device Descriptors === -The values of CSR_VID and CSR_PID described in PSRemote.h need to be modified -to match descriptors of USB Bluetooth Device to be used. - -Default is configured for CSR chips (like mine) - - -== Hint == ---Hints from PS3 and Wiimote game controllers thread in Circuit@Home. - - Bluetooth 1.x seems not work on this library. - ---Bluetooth Docs: - -HCI, L2CAP,... Doc: https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=40560 - -BT HID profile Doc: https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=7108 - ---Sixaxis/DualShock3 Info: - -Windows Driver/Pairing: MotionInJoy -Linux Pairing: sixaxis.c source file -Mac: I dont know but i seem some - -http://www.pabr.org/sixlinux/sixlinux.en.html -http://wiki.ps2dev.org/ps3:hardware:sixaxis -http://wiibrew.org/wiki/Sixaxis - -== ACKNOWLEDGEMENT & INFO == -I appreciate the gread codes developed by Oleg, Richard and Tomo :-) - ---What Does?-- - --HCI Waits for PS Remote (Remenber to Pair with your BT Dongle!!!) -Then Accepts connect Req and goes to L2CAP - --L2CAP responses two Connection Req from PSRemote (HID Control and HID Interrupt) -Then configures it and then passed to HID - --Initializates PS Controller and lights all Leds - --??? - --Profit - -I started this because noone has taken initiative with PS (unlike Wii) diff --git a/modules/pademu/ds34bt.c b/modules/pademu/ds34bt.c new file mode 100644 index 000000000..3713c9194 --- /dev/null +++ b/modules/pademu/ds34bt.c @@ -0,0 +1,1513 @@ + +/* based on https://github.com/IonAgorria/Arduino-PSRemote */ +/* and https://github.com/felis/USB_Host_Shield_2.0 */ + +#include "types.h" +#include "loadcore.h" +#include "stdio.h" +#include "sifrpc.h" +#include "sysclib.h" +#include "usbd.h" +#include "usbd_macro.h" +#include "thbase.h" +#include "thsemap.h" +#include "ds34bt.h" +#include "sys_utils.h" + +//#define DPRINTF(x...) printf(x) +#define DPRINTF(x...) + +static int bt_probe(int devId); +static int bt_connect(int devId); +static int bt_disconnect(int devId); +static void bt_config_set(int result, int count, void *arg); + +static UsbDriver bt_driver = {NULL, NULL, "ds34bt", bt_probe, bt_connect, bt_disconnect}; +static bt_device bt_dev = {-1, -1, -1, -1, -1, -1, DS34BT_STATE_USB_DISCONNECTED}; + +static int chrg_probe(int devId); +static int chrg_connect(int devId); +static int chrg_disconnect(int devId); +static int chrg_dev = -1; + +static UsbDriver chrg_driver = {NULL, NULL, "ds34chrg", chrg_probe, chrg_connect, chrg_disconnect}; + +static void ds34pad_clear(int pad); +static void ds34pad_init(); + +static int bt_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + UsbConfigDescriptor *config = NULL; + UsbInterfaceDescriptor *intf = NULL; + + DPRINTF("DS34BT: probe: devId=%i\n", devId); + + if ((bt_dev.devId > 0) && (bt_dev.status & DS34BT_STATE_USB_AUTHORIZED)) { + DPRINTF("DS34BT: Error - only one device allowed !\n"); + return 0; + } + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("DS34BT: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->bNumConfigurations < 1) + return 0; + + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + if (config == NULL) { + DPRINTF("DS34BT: Error - Couldn't get configuration descriptor\n"); + return 0; + } + + if ((config->bNumInterfaces < 1) || (config->wTotalLength < (sizeof(UsbConfigDescriptor) + sizeof(UsbInterfaceDescriptor)))) { + DPRINTF("DS34BT: Error - No interfaces available\n"); + return 0; + } + + intf = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + DPRINTF("DS34BT: bInterfaceClass %X bInterfaceSubClass %X bInterfaceProtocol %X\n", intf->bInterfaceClass, intf->bInterfaceSubClass, intf->bInterfaceProtocol); + + if ((intf->bInterfaceClass != USB_CLASS_WIRELESS_CONTROLLER) || + (intf->bInterfaceSubClass != USB_SUBCLASS_RF_CONTROLLER) || + (intf->bInterfaceProtocol != USB_PROTOCOL_BLUETOOTH_PROG) || + (intf->bNumEndpoints < 3)) { + return 0; + } + + return 1; +} + +static int bt_connect(int devId) +{ + int epCount; + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + UsbInterfaceDescriptor *interface; + UsbEndpointDescriptor *endpoint; + + DPRINTF("DS34BT: connect: devId=%i\n", devId); + + if (bt_dev.devId != -1) { + DPRINTF("DS34BT: Error - only one device allowed !\n"); + return 1; + } + + bt_dev.status = DS34BT_STATE_USB_DISCONNECTED; + + bt_dev.interruptEndp = -1; + bt_dev.inEndp = -1; + bt_dev.outEndp = -1; + + bt_dev.controlEndp = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + epCount = interface->bNumEndpoints - 1; + + DPRINTF("DS34BT: Endpoint Count %d \n", epCount + 1); + + endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); + + do { + + if (endpoint->bmAttributes == USB_ENDPOINT_XFER_BULK) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && bt_dev.outEndp < 0) { + bt_dev.outEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("DS34BT: register Output endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.outEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } else if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.inEndp < 0) { + bt_dev.inEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("DS34BT: register Input endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.inEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + } else if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.interruptEndp < 0) { + bt_dev.interruptEndp = UsbOpenEndpoint(devId, endpoint); + DPRINTF("DS34BT: register Interrupt endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.interruptEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + } + + endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); + + } while (epCount--); + + if (bt_dev.interruptEndp < 0 || bt_dev.inEndp < 0 || bt_dev.outEndp < 0) { + DPRINTF("DS34BT: Error - connect failed: not enough endpoints! \n"); + return -1; + } + + bt_dev.devId = devId; + bt_dev.status = DS34BT_STATE_USB_AUTHORIZED; + + UsbSetDeviceConfiguration(bt_dev.controlEndp, config->bConfigurationValue, bt_config_set, NULL); + + return 0; +} + +static int bt_disconnect(int devId) +{ + DPRINTF("DS34BT: disconnect: devId=%i\n", devId); + + if (bt_dev.status & DS34BT_STATE_USB_AUTHORIZED) { + + if (bt_dev.interruptEndp >= 0) + UsbCloseEndpoint(bt_dev.interruptEndp); + + if (bt_dev.inEndp >= 0) + UsbCloseEndpoint(bt_dev.inEndp); + + if (bt_dev.outEndp >= 0) + UsbCloseEndpoint(bt_dev.outEndp); + + bt_dev.devId = -1; + bt_dev.interruptEndp = -1; + bt_dev.inEndp = -1; + bt_dev.outEndp = -1; + bt_dev.controlEndp = -1; + bt_dev.status = DS34BT_STATE_USB_DISCONNECTED; + + ds34pad_init(); + SignalSema(bt_dev.hid_sema); + } + + return 0; +} + +int chrg_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + + DPRINTF("DS34CHRG: probe: devId=%i\n", devId); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("DS34CHRG: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->idVendor == DS34_VID && (device->idProduct == DS3_PID || device->idProduct == DS4_PID || device->idProduct == DS4_PID_SLIM)) + return 1; + + return 0; +} + +int chrg_connect(int devId) +{ + int chrg_end; + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + + DPRINTF("DS34CHRG: connect: devId=%i\n", devId); + + if (chrg_dev != -1) { + DPRINTF("DS34CHRG: Error - only one device allowed !\n"); + return 1; + } + + chrg_dev = devId; + + chrg_end = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + + UsbSetDeviceConfiguration(chrg_end, config->bConfigurationValue, NULL, NULL); + + return 0; +} + +int chrg_disconnect(int devId) +{ + DPRINTF("DS34CHRG: disconnect: devId=%i\n", devId); + + chrg_dev = -1; + + return 0; +} + +static u8 output_01_report[] = + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; + +static u8 led_patterns[][2] = + { + {0x1C, 0x02}, + {0x1A, 0x04}, + {0x16, 0x08}, + {0x0E, 0x10}, +}; + +static u8 power_level[] = + { + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; + +static u8 rgbled_patterns[][2][3] = + { + {{0x00, 0x00, 0x10}, {0x00, 0x00, 0x7F}}, // light blue/blue + {{0x00, 0x10, 0x00}, {0x00, 0x7F, 0x00}}, // light green/green/ + {{0x10, 0x10, 0x00}, {0x7F, 0x7F, 0x00}}, // light yellow/yellow + {{0x00, 0x10, 0x10}, {0x00, 0x7F, 0x7F}}, // light cyan/cyan +}; + +static u8 link_key[] = //for ds4 authorisation + { + 0x56, 0xE8, 0x81, 0x38, 0x08, 0x06, 0x51, 0x41, + 0xC0, 0x7F, 0x12, 0xAA, 0xD9, 0x66, 0x3C, 0xCE +}; + +// Taken from nefarius' SCPToolkit +// https://github.com/nefarius/ScpToolkit/blob/master/ScpControl/ScpControl.ini +// Valid MAC addresses used by Sony +static u8 GenuineMacAddress[][3] = + { + // Bluetooth chips by ALPS ELECTRIC CO., LTD + {0x00, 0x02, 0xC7}, + {0x00, 0x06, 0xF5}, + {0x00, 0x06, 0xF7}, + {0x00, 0x07, 0x04}, + {0x00, 0x16, 0xFE}, + {0x00, 0x19, 0xC1}, + {0x00, 0x1B, 0xFB}, + {0x00, 0x1E, 0x3D}, + {0x00, 0x21, 0x4F}, + {0x00, 0x23, 0x06}, + {0x00, 0x24, 0x33}, + {0x00, 0x26, 0x43}, + {0x00, 0xA0, 0x79}, + {0x04, 0x76, 0x6E}, + {0x04, 0x98, 0xF3}, + {0x28, 0xA1, 0x83}, + {0x34, 0xC7, 0x31}, + {0x38, 0xC0, 0x96}, + {0x60, 0x38, 0x0E}, + {0x64, 0xD4, 0xBD}, + {0xAC, 0x7A, 0x4D}, + {0xE0, 0x75, 0x0A}, + {0xE0, 0xAE, 0x5E}, + {0xFC, 0x62, 0xB9}, + // Bluetooth chips by AzureWave Technology Inc. + {0xE0, 0xB9, 0xA5}, + {0xDC, 0x85, 0xDE}, + {0xD0, 0xE7, 0x82}, + {0xB0, 0xEE, 0x45}, + {0xAC, 0x89, 0x95}, + {0xA8, 0x1D, 0x16}, + {0x94, 0xDB, 0xC9}, + {0x80, 0xD2, 0x1D}, + {0x80, 0xA5, 0x89}, + {0x78, 0x18, 0x81}, + {0x74, 0xF0, 0x6D}, + {0x74, 0xC6, 0x3B}, + {0x74, 0x2F, 0x68}, + {0x6C, 0xAD, 0xF8}, + {0x6C, 0x71, 0xD9}, + {0x60, 0x5B, 0xB4}, + {0x5C, 0x96, 0x56}, + {0x54, 0x27, 0x1E}, + {0x4C, 0xAA, 0x16}, + {0x48, 0x5D, 0x60}, + {0x44, 0xD8, 0x32}, + {0x40, 0xE2, 0x30}, + {0x38, 0x4F, 0xF0}, + {0x28, 0xC2, 0xDD}, + {0x24, 0x0A, 0x64}, + {0x1C, 0x4B, 0xD6}, + {0x08, 0xA9, 0x5A}, + {0x00, 0x25, 0xD3}, + {0x00, 0x24, 0x23}, + {0x00, 0x22, 0x43}, + {0x00, 0x15, 0xAF}, + //fake with AirohaTechnologyCorp's Chip + {0x0C, 0xFC, 0x83}}; + +#define REQ_HCI_OUT (USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_DEVICE) +#define HCI_COMMAND_REQ 0 + +#define MAX_PADS 4 +#define MAX_DELAY 10 + +static u8 hci_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; +static u8 l2cap_buf[MAX_BUFFER_SIZE + 32] __attribute((aligned(4))) = {0}; +static u8 hci_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; +static u8 l2cap_cmd_buf[MAX_BUFFER_SIZE + 32] __attribute((aligned(4))) = {0}; + +static u8 identifier = 0; +static u8 press_emu = 0; +static u8 disable_fake = 0; + +static ds34bt_pad_t ds34pad[MAX_PADS]; + +static void hci_event_cb(int resultCode, int bytes, void *arg); +static void l2cap_event_cb(int resultCode, int bytes, void *arg); + +static int hid_initDS34(int pad); +static int hid_LEDRumble(u8 *led, u8 lrum, u8 rrum, int pad); +static void hid_readReport(u8 *data, int bytes, int pad); + +static int l2cap_connection_request(u16 handle, u8 rxid, u16 scid, u16 psm); +static int hci_reset(); + +static void bt_config_set(int result, int count, void *arg) +{ + PollSema(bt_dev.hid_sema); + + UsbInterruptTransfer(bt_dev.interruptEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, NULL); + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, NULL); + + ds34pad_init(); + hci_reset(); + + SignalSema(bt_dev.hid_sema); +} + +/************************************************************/ +/* HCI Commands */ +/************************************************************/ + +static int HCI_Command(int nbytes, u8 *dataptr) +{ + return UsbControlTransfer(bt_dev.controlEndp, REQ_HCI_OUT, HCI_COMMAND_REQ, 0, 0, nbytes, dataptr, NULL, NULL); +} + +static int hci_reset() +{ + hci_cmd_buf[0] = HCI_OCF_RESET; + hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; + hci_cmd_buf[2] = 0x00; // Parameter Total Length = 0 + + return HCI_Command(3, hci_cmd_buf); +} + +static int hci_write_scan_enable(u8 conf) +{ + hci_cmd_buf[0] = HCI_OCF_WRITE_SCAN_ENABLE; + hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; + hci_cmd_buf[2] = 0x01; + hci_cmd_buf[3] = conf; + + return HCI_Command(4, hci_cmd_buf); +} + +static int hci_accept_connection(u8 *bdaddr) +{ + hci_cmd_buf[0] = HCI_OCF_ACCEPT_CONNECTION; // HCI OCF = 9 + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x07; // parameter length 7 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + hci_cmd_buf[9] = 0x01; //switch role to (slave = 1 / master = 0) + + return HCI_Command(10, hci_cmd_buf); +} + +static int hci_remote_name(u8 *bdaddr) +{ + hci_cmd_buf[0] = HCI_OCF_REMOTE_NAME; // HCI OCF = 19 + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x0A; // parameter length = 10 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + hci_cmd_buf[9] = 0x01; // Page Scan Repetition Mode + hci_cmd_buf[10] = 0x00; // Reserved + hci_cmd_buf[11] = 0x00; // Clock offset - low byte + hci_cmd_buf[12] = 0x00; // Clock offset - high byte + + return HCI_Command(13, hci_cmd_buf); +} + +static int hci_reject_connection(u8 *bdaddr) +{ + hci_cmd_buf[0] = HCI_OCF_REJECT_CONNECTION; // HCI OCF = A + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x07; // parameter length 7 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + hci_cmd_buf[9] = 0x09; //reason max connection + + return HCI_Command(10, hci_cmd_buf); +} + +static int hci_disconnect(u16 handle) +{ + hci_cmd_buf[0] = HCI_OCF_DISCONNECT; // HCI OCF = 6 + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x03; // parameter length = 3 + hci_cmd_buf[3] = (u8)(handle & 0xFF); // connection handle - low byte + hci_cmd_buf[4] = (u8)((handle >> 8) & 0x0F); // connection handle - high byte + hci_cmd_buf[5] = 0x13; // reason + + return HCI_Command(6, hci_cmd_buf); +} + +static int hci_change_connection_type(u16 handle) +{ + hci_cmd_buf[0] = HCI_OCF_CHANGE_CONNECTION_TYPE; + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; + hci_cmd_buf[2] = 0x04; // parameter length 4 + hci_cmd_buf[3] = (u8)(handle & 0xFF); // connection handle - low byte + hci_cmd_buf[4] = (u8)((handle >> 8) & 0x0F); // connection handle - high byte + hci_cmd_buf[5] = 0x18; // Packet Type: 0xcc18 + hci_cmd_buf[6] = 0xcc; + + return HCI_Command(7, hci_cmd_buf); +} + +static int hci_link_key_request_reply(u8 *bdaddr) +{ + hci_cmd_buf[0] = HCI_OCF_LINK_KEY_REQUEST_REPLY; // HCI OCF = 0E + hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 + hci_cmd_buf[2] = 0x06 + sizeof(link_key); // parameter length 6 + hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address + hci_cmd_buf[4] = *(bdaddr + 1); + hci_cmd_buf[5] = *(bdaddr + 2); + hci_cmd_buf[6] = *(bdaddr + 3); + hci_cmd_buf[7] = *(bdaddr + 4); + hci_cmd_buf[8] = *(bdaddr + 5); + + mips_memcpy(&hci_cmd_buf[9], link_key, sizeof(link_key)); + + return HCI_Command(9 + sizeof(link_key), hci_cmd_buf); +} + +static void HCI_event_task(int result) +{ + int i, pad; + + if (!result) { + /* buf[0] = Event Code */ + /* buf[1] = Parameter Total Length */ + /* buf[n] = Event Parameters based on each event */ + DPRINTF("HCI event = 0x%02X \n", hci_buf[0]); + switch (hci_buf[0]) { // switch on event type + case HCI_EVENT_COMMAND_COMPLETE: + DPRINTF("HCI Command Complete = 0x%02X \n", hci_buf[3]); + DPRINTF("\tReturned = 0x%02X \n", hci_buf[5]); + if ((hci_buf[3] == HCI_OCF_RESET) && (hci_buf[4] == HCI_OGF_CTRL_BBAND)) { + if (hci_buf[5] == 0) { + hci_write_scan_enable(SCAN_ENABLE_NOINQ_ENPAG); + } else { + DelayThread(500); + hci_reset(); + } + } else if((hci_buf[3] == HCI_OCF_WRITE_SCAN_ENABLE) && (hci_buf[4] == HCI_OGF_CTRL_BBAND)) { + if (hci_buf[5] == 0) { + bt_dev.status |= DS34BT_STATE_USB_CONFIGURED; + } else { + DelayThread(500); + hci_reset(); + } + } + break; + + case HCI_EVENT_COMMAND_STATUS: + if (hci_buf[2]) // show status on serial if not OK + { + DPRINTF("HCI Command Failed: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + DPRINTF("\t Command_OpCode(OGF) = 0x%02X \n", ((hci_buf[5] & 0xFC) >> 2)); + DPRINTF("\t Command_OpCode(OCF) = 0x%02X 0x%02X \n", (hci_buf[5] & 0x03), hci_buf[4]); + } + break; + + case HCI_EVENT_CONNECT_COMPLETE: + DPRINTF("HCI event Connect Complete: \n"); + if (!hci_buf[2]) // check if connected OK + { + DPRINTF("\t Connection_Handle 0x%02X \n", hci_buf[3] | ((hci_buf[4] & 0x0F) << 8)); + DPRINTF("\t Requested by BD_ADDR: \n\t"); + for (i = 0; i < 6; i++) { + DPRINTF("0x%02X", hci_buf[5 + i]); + if (i < 5) + DPRINTF(":"); + } + DPRINTF("\n"); + for (i = 0; i < MAX_PADS; i++) { + if (strncmp(ds34pad[i].bdaddr, hci_buf + 5, 6) == 0) { + // store the handle for the ACL connection + ds34pad[i].hci_handle = hci_buf[3] | ((hci_buf[4] & 0x0F) << 8); + break; + } + } + if (i >= MAX_PADS) { + break; + } + pad_status_set(DS34BT_STATE_CONNECTED, i); + hci_remote_name(ds34pad[i].bdaddr); + } else { + DPRINTF("\t Error 0x%02X \n", hci_buf[2]); + } + break; + + case HCI_EVENT_NUM_COMPLETED_PKT: + DPRINTF("HCI Number Of Completed Packets Event: \n"); + DPRINTF("\t Number_of_Handles = 0x%02X \n", hci_buf[2]); + for (i = 0; i < hci_buf[2]; i++) { + DPRINTF("\t Connection_Handle = 0x%04X \n", (hci_buf[3 + i] | ((hci_buf[4 + i] & 0x0F) << 8))); + } + break; + + case HCI_EVENT_QOS_SETUP_COMPLETE: + break; + + case HCI_EVENT_DISCONN_COMPLETE: + DPRINTF("HCI Disconnection Complete Event: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + DPRINTF("\t Connection_Handle = 0x%04X \n", (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))); + DPRINTF("\t Reason = 0x%02X \n", hci_buf[5]); + for (i = 0; i < MAX_PADS; i++) { //detect pad + if (ds34pad[i].hci_handle == (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))) { + break; + } + } + ds34pad_clear(i); + break; + + case HCI_EVENT_AUTHENTICATION_COMPLETE: + DPRINTF("HCI Authentication Complete Event: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + DPRINTF("\t Connection_Handle = 0x%04X \n", (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))); + if (!hci_buf[2]) { + DPRINTF("\t Success \n"); + } else { + DPRINTF("\t Failed \n"); + } + break; + + case HCI_EVENT_REMOTE_NAME_COMPLETE: + DPRINTF("HCI Remote Name Requested Complete Event: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + if (!hci_buf[2]) { + for (i = 0; i < MAX_PADS; i++) { + if (strncmp(ds34pad[i].bdaddr, hci_buf + 3, 6) == 0) { + break; + } + } + if (i >= MAX_PADS) { + break; + } + if (strncmp(hci_buf + 9, "Wireless Controller", 19) == 0) { + ds34pad[i].type = DS4; + ds34pad[i].isfake = 0; + DPRINTF("\t Type: Dualshock 4 \n"); + } else { + ds34pad[i].type = DS3; + DPRINTF("\t Type: Dualshock 3 \n"); + } + hci_change_connection_type(ds34pad[i].hci_handle); + if (ds34pad[i].type == DS4) { + identifier++; + l2cap_connection_request(ds34pad[i].hci_handle, identifier, 0x0070, L2CAP_PSM_CTRL); + } + } + break; + + case HCI_EVENT_ENCRYPTION_CHANGE: + DPRINTF("HCI Encryption Change Event: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + DPRINTF("\t Connection_Handle = 0x%04X \n", (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))); + DPRINTF("\t Encryption_Enabled = 0x%02X \n", hci_buf[5]); + break; + + case HCI_EVENT_CONNECT_REQUEST: + DPRINTF("HCI Connection Requested by BD_ADDR: \n\t"); + for (i = 0; i < 6; i++) { + DPRINTF("0x%02X", hci_buf[2 + i]); + if (i < 5) + DPRINTF(":"); + } + DPRINTF("\n\t Link = 0x%02X \n", hci_buf[11]); + DPRINTF("\t Class = 0x%02X 0x%02X 0x%02X \n", hci_buf[8], hci_buf[9], hci_buf[10]); + for (i = 0; i < MAX_PADS; i++) //find free slot + { + if (!pad_status_check(DS34BT_STATE_RUNNING, i) && ds34pad[i].enabled) { + if (pad_status_check(DS34BT_STATE_CONNECTED, i)) { + if (pad_status_check(DS34BT_STATE_DISCONNECTING, i)) //if we're waiting for hci disconnect event + continue; + else + hci_disconnect(ds34pad[i].hci_handle); //try to disconnect + } + break; + } + } + if (i >= MAX_PADS) //no free slot + { + hci_reject_connection(hci_buf + 2); + break; + } + pad = i; + mips_memcpy(ds34pad[pad].bdaddr, hci_buf + 2, 6); + ds34pad[pad].isfake = 0; + if (!disable_fake) { + ds34pad[pad].isfake = 1; //fake ds3 + for (i = 0; i < sizeof(GenuineMacAddress) / 3; i++) //check if ds3 is genuine + { + if (ds34pad[pad].bdaddr[5] == GenuineMacAddress[i][0] && + ds34pad[pad].bdaddr[4] == GenuineMacAddress[i][1] && + ds34pad[pad].bdaddr[3] == GenuineMacAddress[i][2]) { + ds34pad[pad].isfake = 0; + break; + } + } + } + pad_status_clear(DS34BT_STATE_CONNECTED, pad); + pad_status_clear(DS34BT_STATE_RUNNING, pad); + pad_status_clear(DS34BT_STATE_DISCONNECTING, pad); + hci_accept_connection(ds34pad[pad].bdaddr); + break; + + case HCI_EVENT_ROLE_CHANGED: + DPRINTF("HCI Role Change Event: \n"); + DPRINTF("\t Status = 0x%02X \n", hci_buf[2]); + DPRINTF("\t BD_ADDR: "); + for (i = 0; i < 6; i++) { + DPRINTF("0x%02X", hci_buf[3 + i]); + if (i < 5) + DPRINTF(":"); + } + DPRINTF("\n\t Role 0x%02X \n", hci_buf[9]); + break; + + case HCI_EVENT_MAX_SLOT_CHANGE: + DPRINTF("HCI Max Slot Change Event: \n"); + DPRINTF("\t Connection_Handle = 0x%x \n", (hci_buf[2] | ((hci_buf[3] & 0x0F) << 8))); + DPRINTF("\t LMP Max Slots = 0x%x \n", hci_buf[5]); + break; + + case HCI_EVENT_PIN_CODE_REQUEST: + DPRINTF("HCI Pin Code Request Event \n"); + break; + + case HCI_EVENT_LINK_KEY_REQUEST: + DPRINTF("HCI Link Key Request Event by BD_ADDR: \n\t"); + for (i = 0; i < 6; i++) { + DPRINTF("0x%02X", hci_buf[2 + i]); + if (i < 5) + DPRINTF(":"); + } + DPRINTF("\n"); + hci_link_key_request_reply(hci_buf + 2); + break; + + case HCI_EVENT_CHANGED_CONNECTION_TYPE: + DPRINTF("Packet Type Changed STATUS: 0x%x \n", hci_buf[2]); + DPRINTF("\t Type = %x \n", (hci_buf[5] | (hci_buf[6] << 8))); + break; + + case HCI_EVENT_PAGE_SR_CHANGED: + break; + + default: + DPRINTF("Unmanaged Event: 0x%02X \n", hci_buf[0]); + break; + } // switch (buf[0]) + } +} + +static void ds34pad_clear(int pad) +{ + if (pad >= MAX_PADS) + return; + + ds34pad[pad].hci_handle = 0x0FFF; + ds34pad[pad].control_scid = 0; + ds34pad[pad].interrupt_scid = 0; + mips_memset(ds34pad[pad].bdaddr, 0, 6); + ds34pad[pad].status = bt_dev.status; + ds34pad[pad].status |= DS34BT_STATE_USB_CONFIGURED; + ds34pad[pad].isfake = 0; + ds34pad[pad].type = 0; + ds34pad[pad].btn_delay = 0; + ds34pad[pad].data[0] = 0xFF; + ds34pad[pad].data[1] = 0xFF; + mips_memset(&ds34pad[pad].data[2], 0x7F, 4); + mips_memset(&ds34pad[pad].data[6], 0x00, 12); +} + +static void ds34pad_init() +{ + int i; + + for (i = 0; i < MAX_PADS; i++) { + ds34pad_clear(i); + } + + press_emu = 0; + identifier = 0; +} + +static void hci_event_cb(int resultCode, int bytes, void *arg) +{ + PollSema(bt_dev.hid_sema); + HCI_event_task(resultCode); + UsbInterruptTransfer(bt_dev.interruptEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, NULL); + SignalSema(bt_dev.hid_sema); +} + +/************************************************************/ +/* L2CAP Commands */ +/************************************************************/ + +static int L2CAP_Command(u16 handle, u8 *data, u8 length) +{ + l2cap_cmd_buf[0] = (u8)(handle & 0xff); // HCI handle with PB,BC flag + l2cap_cmd_buf[1] = (u8)(((handle >> 8) & 0x0f) | 0x20); + l2cap_cmd_buf[2] = (u8)((4 + length) & 0xff); // HCI ACL total data length + l2cap_cmd_buf[3] = (u8)((4 + length) >> 8); + l2cap_cmd_buf[4] = (u8)(length & 0xff); // L2CAP header: Length + l2cap_cmd_buf[5] = (u8)(length >> 8); + l2cap_cmd_buf[6] = 0x01; // L2CAP header: Channel ID + l2cap_cmd_buf[7] = 0x00; // L2CAP Signalling channel over ACL-U logical link + + mips_memcpy(&l2cap_cmd_buf[8], data, length); + + // output on endpoint 2 + return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), NULL, NULL); +} + +static int l2cap_connection_request(u16 handle, u8 rxid, u16 scid, u16 psm) +{ + u8 cmd_buf[8]; + + cmd_buf[0] = L2CAP_CMD_CONNECTION_REQUEST; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x04; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(psm & 0xff); // PSM + cmd_buf[5] = (u8)(psm >> 8); + cmd_buf[6] = (u8)(scid & 0xff); // Source CID (PS Remote) + cmd_buf[7] = (u8)(scid >> 8); + + return L2CAP_Command(handle, cmd_buf, 8); +} + +static int l2cap_connection_response(u16 handle, u8 rxid, u16 dcid, u16 scid, u8 result) +{ + u8 cmd_buf[12]; + + cmd_buf[0] = L2CAP_CMD_CONNECTION_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x08; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(dcid & 0xff); // Destination CID (Our) + cmd_buf[5] = (u8)(dcid >> 8); + cmd_buf[6] = (u8)(scid & 0xff); // Source CID (PS Remote) + cmd_buf[7] = (u8)(scid >> 8); + cmd_buf[8] = result; // Result + cmd_buf[9] = 0x00; + cmd_buf[10] = 0x00; // Status + cmd_buf[11] = 0x00; + + if (result != 0) + cmd_buf[10] = 0x01; // Authentication pending + + return L2CAP_Command(handle, cmd_buf, 12); +} + +static int l2cap_config_request(u16 handle, u8 rxid, u16 dcid) +{ + u8 cmd_buf[12]; + + cmd_buf[0] = L2CAP_CMD_CONFIG_REQUEST; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x08; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(dcid & 0xff); // Destination CID + cmd_buf[5] = (u8)(dcid >> 8); + cmd_buf[6] = 0x00; // Flags + cmd_buf[7] = 0x00; + cmd_buf[8] = 0x01; // Config Opt: type = MTU (Maximum Transmission Unit) + cmd_buf[9] = 0x02; // Config Opt: length + //cmd_buf[10] = 0x96; // Config Opt: data + //cmd_buf[11] = 0x00; + + //this setting disable hid cmd reports from ds3 + cmd_buf[10] = 0xFF; // Config Opt: data + cmd_buf[11] = 0xFF; + + return L2CAP_Command(handle, cmd_buf, 12); +} + +static int l2cap_config_response(u16 handle, u8 rxid, u16 scid) +{ + u8 cmd_buf[14]; + + cmd_buf[0] = L2CAP_CMD_CONFIG_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x0A; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(scid & 0xff); // Source CID + cmd_buf[5] = (u8)(scid >> 8); + cmd_buf[6] = 0x00; // Result + cmd_buf[7] = 0x00; + cmd_buf[8] = 0x00; // Config + cmd_buf[9] = 0x00; + cmd_buf[10] = 0x01; // Config + cmd_buf[11] = 0x02; + cmd_buf[12] = 0xA0; + cmd_buf[13] = 0x02; + + return L2CAP_Command(handle, cmd_buf, 14); +} + +static int l2cap_disconnection_request(u16 handle, u8 rxid, u16 dcid, u16 scid) +{ + u8 cmd_buf[8]; + + cmd_buf[0] = L2CAP_CMD_DISCONNECT_REQUEST; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x04; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(dcid & 0xff); // Destination CID + cmd_buf[5] = (u8)(dcid >> 8); + cmd_buf[6] = (u8)(scid & 0xff); // Source CID + cmd_buf[7] = (u8)(scid >> 8); + + return L2CAP_Command(handle, cmd_buf, 8); +} + +static int l2cap_disconnection_response(u16 handle, u8 rxid, u16 scid, u16 dcid) +{ + u8 cmd_buf[8]; + + cmd_buf[0] = L2CAP_CMD_DISCONNECT_RESPONSE; // Code + cmd_buf[1] = rxid; // Identifier + cmd_buf[2] = 0x04; // Length + cmd_buf[3] = 0x00; + cmd_buf[4] = (u8)(dcid & 0xff); // Destination CID + cmd_buf[5] = (u8)(dcid >> 8); + cmd_buf[6] = (u8)(scid & 0xff); // Source CID + cmd_buf[7] = (u8)(scid >> 8); + + return L2CAP_Command(handle, cmd_buf, 8); +} + +#define CMD_DELAY 2 + +static int L2CAP_event_task(int result, int bytes) +{ + int pad = -1; + u16 control_dcid = 0x0040; // Channel endpoint on command source + u16 interrupt_dcid = 0x0041; // Channel endpoint on interrupt source + + if (!result) { + for (pad = 0; pad < MAX_PADS; pad++) { + if (l2cap_handle_ok(ds34pad[pad].hci_handle)) + break; + } + + if (pad >= MAX_PADS) { + DPRINTF("L2CAP Wrong Handle = 0x%04X\n", ((l2cap_buf[0] | (l2cap_buf[1] << 8)))); + return pad; + } + + if (l2cap_handle_ok(ds34pad[pad].hci_handle)) { + if (ds34pad[pad].type == DS4) { + control_dcid = 0x0070; + interrupt_dcid = 0x0071; + } + + if (l2cap_control_channel) { + DPRINTF("L2CAP Signaling Command = 0x%02X, pad %d \n", l2cap_buf[8], pad); + + switch (l2cap_buf[8]) { + case L2CAP_CMD_COMMAND_REJECT: + DPRINTF("Command Reject ID = 0x%02X \n", l2cap_buf[9]); + DPRINTF("\t Reason = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF("\t DATA = 0x%04X \n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + break; + + case L2CAP_CMD_CONNECTION_REQUEST: + DPRINTF("Connection Request ID = 0x%02X \n", l2cap_buf[9]); + DPRINTF("\t PSM = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF("\t SCID = 0x%04X \n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_CTRL) { + ds34pad[pad].control_scid = l2cap_buf[14] | (l2cap_buf[15] << 8); + l2cap_connection_response(ds34pad[pad].hci_handle, l2cap_buf[9], control_dcid, ds34pad[pad].control_scid, PENDING); + DelayThread(CMD_DELAY); + l2cap_connection_response(ds34pad[pad].hci_handle, l2cap_buf[9], control_dcid, ds34pad[pad].control_scid, SUCCESSFUL); + DelayThread(CMD_DELAY); + identifier++; + l2cap_config_request(ds34pad[pad].hci_handle, identifier, ds34pad[pad].control_scid); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_INTR) { + ds34pad[pad].interrupt_scid = l2cap_buf[14] | (l2cap_buf[15] << 8); + l2cap_connection_response(ds34pad[pad].hci_handle, l2cap_buf[9], interrupt_dcid, ds34pad[pad].interrupt_scid, PENDING); + DelayThread(CMD_DELAY); + l2cap_connection_response(ds34pad[pad].hci_handle, l2cap_buf[9], interrupt_dcid, ds34pad[pad].interrupt_scid, SUCCESSFUL); + DelayThread(CMD_DELAY); + identifier++; + l2cap_config_request(ds34pad[pad].hci_handle, identifier, ds34pad[pad].interrupt_scid); + } + break; + + case L2CAP_CMD_CONNECTION_RESPONSE: + DPRINTF("Connection Response ID = 0x%02X \n", l2cap_buf[9]); + DPRINTF("\t PSM = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF("\t SCID = 0x%04X \n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + DPRINTF("\t RESULT = 0x%04X \n", (l2cap_buf[16] | (l2cap_buf[17] << 8))); + + if (((l2cap_buf[16] | (l2cap_buf[17] << 8)) == 0x0000) && ((l2cap_buf[18] | (l2cap_buf[19] << 8)) == 0x0000)) { + if ((l2cap_buf[14] | (l2cap_buf[15] << 8)) == control_dcid) { + ds34pad[pad].control_scid = l2cap_buf[12] | (l2cap_buf[13] << 8); + identifier++; + l2cap_config_request(ds34pad[pad].hci_handle, identifier, ds34pad[pad].control_scid); + } else if ((l2cap_buf[14] | (l2cap_buf[15] << 8)) == interrupt_dcid) { + ds34pad[pad].interrupt_scid = l2cap_buf[12] | (l2cap_buf[13] << 8); + identifier++; + l2cap_config_request(ds34pad[pad].hci_handle, identifier, ds34pad[pad].interrupt_scid); + } + } + break; + + case L2CAP_CMD_CONFIG_REQUEST: + DPRINTF("Configuration Request ID = 0x%02X \n", l2cap_buf[9]); + DPRINTF("\t LEN = 0x%04X \n", (l2cap_buf[10] | (l2cap_buf[11] << 8))); + DPRINTF("\t SCID = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF("\t FLAG = 0x%04X \n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == control_dcid) { + l2cap_config_response(ds34pad[pad].hci_handle, l2cap_buf[9], ds34pad[pad].control_scid); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_dcid) { + l2cap_config_response(ds34pad[pad].hci_handle, l2cap_buf[9], ds34pad[pad].interrupt_scid); + } + break; + + case L2CAP_CMD_CONFIG_RESPONSE: + DPRINTF("Configuration Response ID = 0x%02X \n", l2cap_buf[9]); + DPRINTF("\t LEN = 0x%04X \n", (l2cap_buf[10] | (l2cap_buf[11] << 8))); + DPRINTF("\t SCID = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + DPRINTF("\t FLAG = 0x%04X \n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); + DPRINTF("\t RESULT = 0x%04X \n", (l2cap_buf[16] | (l2cap_buf[17] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == control_dcid) { + if (ds34pad[pad].type == DS4) { + identifier++; + l2cap_connection_request(ds34pad[pad].hci_handle, identifier, interrupt_dcid, L2CAP_PSM_INTR); + } + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_dcid) { + hid_initDS34(pad); + if (ds34pad[pad].type == DS3) { + ds34pad[pad].oldled[0] = led_patterns[pad][1]; + ds34pad[pad].oldled[3] = 0; + } else if (ds34pad[pad].type == DS4) { + ds34pad[pad].oldled[0] = rgbled_patterns[pad][1][0]; + ds34pad[pad].oldled[1] = rgbled_patterns[pad][1][1]; + ds34pad[pad].oldled[2] = rgbled_patterns[pad][1][2]; + ds34pad[pad].oldled[3] = 0; + } + DelayThread(CMD_DELAY); + hid_LEDRumble(ds34pad[pad].oldled, 0, 0, pad); + pad_status_set(DS34BT_STATE_RUNNING, pad); + } + ds34pad[pad].btn_delay = 0xFF; + break; + + case L2CAP_CMD_DISCONNECT_REQUEST: + DPRINTF("Disconnect Request SCID = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == control_dcid) { + pad_status_set(DS34BT_STATE_DISCONNECTING, pad); + l2cap_disconnection_response(ds34pad[pad].hci_handle, l2cap_buf[9], control_dcid, ds34pad[pad].control_scid); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_dcid) { + pad_status_set(DS34BT_STATE_DISCONNECTING, pad); + l2cap_disconnection_response(ds34pad[pad].hci_handle, l2cap_buf[9], interrupt_dcid, ds34pad[pad].interrupt_scid); + } + break; + + case L2CAP_CMD_DISCONNECT_RESPONSE: + DPRINTF("Disconnect Response SCID = 0x%04X \n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); + + if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == ds34pad[pad].control_scid) { + pad_status_set(DS34BT_STATE_DISCONNECTING, pad); + hci_disconnect(ds34pad[pad].hci_handle); + } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == ds34pad[pad].interrupt_scid) { + pad_status_set(DS34BT_STATE_DISCONNECTING, pad); + identifier++; + l2cap_disconnection_request(ds34pad[pad].hci_handle, identifier, ds34pad[pad].control_scid, control_dcid); + } + break; + + default: + break; + } + } else if (l2cap_interrupt_channel) { + hid_readReport(l2cap_buf, bytes, pad); + } else if (l2cap_command_channel) { + DPRINTF("HID command status 0x%02X \n", l2cap_buf[8]); + pad = MAX_PADS; + } + } // acl_handle_ok + } // !rcode + + return pad; +} + +static void l2cap_event_cb(int resultCode, int bytes, void *arg) +{ + int ret; + u16 interrupt_dcid = 0x0041; + + PollSema(bt_dev.hid_sema); + + ret = L2CAP_event_task(resultCode, bytes); + + if (ret < MAX_PADS) { + if (pad_status_check(DS34BT_STATE_RUNNING, ret)) { + if (pad_status_check(DS34BT_STATE_DISCONNECT_REQUEST, ret)) { + if (!ds34pad[ret].isfake) { + if (ds34pad[ret].type == DS4) { + interrupt_dcid = 0x0071; + } + identifier++; + l2cap_disconnection_request(ds34pad[ret].hci_handle, identifier, ds34pad[ret].interrupt_scid, interrupt_dcid); + } else { + hci_disconnect(ds34pad[ret].hci_handle); + } + pad_status_clear(DS34BT_STATE_DISCONNECT_REQUEST, ret); + } else if (ds34pad[ret].update_rum) { + hid_LEDRumble(ds34pad[ret].oldled, ds34pad[ret].lrum, ds34pad[ret].rrum, ret); + ds34pad[ret].update_rum = 0; + } + } else { + if (!ds34pad[ret].isfake && ds34pad[ret].type == DS3) + DelayThread(42000); //fix for some bt adapters + } + } + + UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, arg); + SignalSema(bt_dev.hid_sema); +} + +/************************************************************/ +/* HID Commands */ +/************************************************************/ + +static int HID_command(u16 handle, u16 scid, u8 *data, u8 length, int pad) +{ + l2cap_cmd_buf[0] = (u8)(handle & 0xff); // HCI handle with PB,BC flag + l2cap_cmd_buf[1] = (u8)(((handle >> 8) & 0x0f) | 0x20); + l2cap_cmd_buf[2] = (u8)((4 + length) & 0xff); // HCI ACL total data length + l2cap_cmd_buf[3] = (u8)((4 + length) >> 8); + l2cap_cmd_buf[4] = (u8)(length & 0xff); // L2CAP header: Length + l2cap_cmd_buf[5] = (u8)(length >> 8); + l2cap_cmd_buf[6] = (u8)(scid & 0xff); // L2CAP header: Channel ID + l2cap_cmd_buf[7] = (u8)(scid >> 8); + + mips_memcpy(&l2cap_cmd_buf[8], data, length); + + // output on endpoint 2 + return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), NULL, NULL); +} + +static int hid_initDS34(int pad) +{ + u8 init_buf[PS3_F4_REPORT_LEN + 2]; + u8 size = 2; + + if (ds34pad[pad].type == DS3) { + init_buf[0] = HID_THDR_SET_REPORT_FEATURE; // THdr + init_buf[1] = PS3_F4_REPORT_ID; // Report ID + init_buf[2] = 0x42; + init_buf[3] = 0x03; + init_buf[4] = 0x00; + init_buf[5] = 0x00; + size += PS3_F4_REPORT_LEN; + } else if(ds34pad[pad].type == DS4) { + init_buf[0] = HID_THDR_GET_REPORT_FEATURE; // THdr + init_buf[1] = PS4_02_REPORT_ID; // Report ID + } + + return HID_command(ds34pad[pad].hci_handle, ds34pad[pad].control_scid, init_buf, size, pad); +} + +static int hid_LEDRumble(u8 *led, u8 lrum, u8 rrum, int pad) +{ + u8 led_buf[PS4_11_REPORT_LEN + 2]; + u8 size = 2; + + if (ds34pad[pad].type == DS3) { + if (ds34pad[pad].isfake) + led_buf[0] = 0xA2; // THdr + else + led_buf[0] = HID_THDR_SET_REPORT_OUTPUT; // THdr + + led_buf[1] = PS3_01_REPORT_ID; // Report ID + + mips_memcpy(&led_buf[2], output_01_report, sizeof(output_01_report)); // PS3_01_REPORT_LEN); + + if (ds34pad[pad].isfake) { + if(rrum < 5) + rrum = 0; + } + + led_buf[3] = 0xFE; //rt + led_buf[4] = rrum; //rp + led_buf[5] = 0xFE; //lt + led_buf[6] = lrum; //lp + + led_buf[11] = led[0] & 0x7F; //LED Conf + + if (led[3]) //means charging, so blink + { + led_buf[15] = 0x32; + led_buf[20] = 0x32; + led_buf[25] = 0x32; + led_buf[30] = 0x32; + } + + size += sizeof(output_01_report); + } else if (ds34pad[pad].type == DS4) { + mips_memset(led_buf, 0, PS3_01_REPORT_LEN + 2); + + led_buf[0] = HID_THDR_SET_REPORT_OUTPUT; // THdr + led_buf[1] = PS4_11_REPORT_ID; // Report ID + led_buf[2] = 0x80; //update rate 1000Hz + led_buf[4] = 0xFF; + + led_buf[7] = rrum * 255; + led_buf[8] = lrum; + + led_buf[9] = led[0]; //r + led_buf[10] = led[1]; //g + led_buf[11] = led[2]; //b + + if (led[3]) //means charging, so blink + { + led_buf[12] = 0x80; // Time to flash bright (255 = 2.5 seconds) + led_buf[13] = 0x80; // Time to flash dark (255 = 2.5 seconds) + } + + size += PS4_11_REPORT_LEN; + } + + ds34pad[pad].oldled[0] = led[0]; + ds34pad[pad].oldled[1] = led[1]; + ds34pad[pad].oldled[2] = led[2]; + ds34pad[pad].oldled[3] = led[3]; + + return HID_command(ds34pad[pad].hci_handle, ds34pad[pad].control_scid, led_buf, size, pad); +} + +static void hid_readReport(u8 *data, int bytes, int pad) +{ + if (data[8] == HID_THDR_DATA_INPUT) { + if (data[9] == PS3_01_REPORT_ID) { + struct ds3report *report; + + report = (struct ds3report *)&data[11]; + + if (report->RightStickX == 0 && report->RightStickY == 0) // ledrumble cmd causes null report sometime + return; + + ds34pad[pad].data[0] = ~report->ButtonStateL; + ds34pad[pad].data[1] = ~report->ButtonStateH; + + ds34pad[pad].data[2] = report->RightStickX; //rx + ds34pad[pad].data[3] = report->RightStickY; //ry + ds34pad[pad].data[4] = report->LeftStickX; //lx + ds34pad[pad].data[5] = report->LeftStickY; //ly + + if (bytes == 21 && !press_emu) + press_emu = 1; + + if (press_emu) { //needs emulating pressure buttons + ds34pad[pad].data[6] = report->Right * 255; //right + ds34pad[pad].data[7] = report->Left * 255; //left + ds34pad[pad].data[8] = report->Up * 255; //up + ds34pad[pad].data[9] = report->Down * 255; //down + + ds34pad[pad].data[10] = report->Triangle * 255; //triangle + ds34pad[pad].data[11] = report->Circle * 255; //circle + ds34pad[pad].data[12] = report->Cross * 255; //cross + ds34pad[pad].data[13] = report->Square * 255; //square + + ds34pad[pad].data[14] = report->L1 * 255; //L1 + ds34pad[pad].data[15] = report->R1 * 255; //R1 + ds34pad[pad].data[16] = report->L2 * 255; //L2 + ds34pad[pad].data[17] = report->R2 * 255; //R2 + + report->Power = 0x05; + } else { + ds34pad[pad].data[6] = report->PressureRight; //right + ds34pad[pad].data[7] = report->PressureLeft; //left + ds34pad[pad].data[8] = report->PressureUp; //up + ds34pad[pad].data[9] = report->PressureDown; //down + + ds34pad[pad].data[10] = report->PressureTriangle; //triangle + ds34pad[pad].data[11] = report->PressureCircle; //circle + ds34pad[pad].data[12] = report->PressureCross; //cross + ds34pad[pad].data[13] = report->PressureSquare; //square + + ds34pad[pad].data[14] = report->PressureL1; //L1 + ds34pad[pad].data[15] = report->PressureR1; //R1 + ds34pad[pad].data[16] = report->PressureL2; //L2 + ds34pad[pad].data[17] = report->PressureR2; //R2 + } + + if (report->PSButtonState) { //display battery level + if (report->Select && (ds34pad[pad].btn_delay == MAX_DELAY)) { //PS + SELECT + if (ds34pad[pad].analog_btn < 2) //unlocked mode + ds34pad[pad].analog_btn = !ds34pad[pad].analog_btn; + + ds34pad[pad].oldled[0] = led_patterns[pad][(ds34pad[pad].analog_btn & 1)]; + ds34pad[pad].btn_delay = 1; + } else { + if (report->Power != 0xEE) + ds34pad[pad].oldled[0] = power_level[report->Power]; + + if (ds34pad[pad].btn_delay < MAX_DELAY) + ds34pad[pad].btn_delay++; + } + } else { + ds34pad[pad].oldled[0] = led_patterns[pad][(ds34pad[pad].analog_btn & 1)]; + + if (ds34pad[pad].btn_delay > 0) + ds34pad[pad].btn_delay--; + } + + if (report->Power == 0xEE) //charging + ds34pad[pad].oldled[3] = 1; + else + ds34pad[pad].oldled[3] = 0; + + } else if(data[9] == PS4_11_REPORT_ID) { + struct ds4report *report; + u8 up = 0, down = 0, left = 0, right = 0; + + report = (struct ds4report *)&data[11]; + + switch(report->Dpad) { + case 0: up = 1; + break; + case 1: up = 1; right = 1; + break; + case 2: right = 1; + break; + case 3: down = 1; right = 1; + break; + case 4: down = 1; + break; + case 5: down = 1; left = 1; + break; + case 6: left = 1; + break; + case 7: up = 1; left = 1; + break; + case 8: up = 0; down = 0; left = 0; right = 0; + break; + } + + if (bytes > 63 && report->TPad) { + if (!report->Finger1Active) { + if (report->Finger1X < 960) + report->Share = 1; + else + report->Option = 1; + } + + if (!report->Finger2Active) { + if (report->Finger2X < 960) + report->Share = 1; + else + report->Option = 1; + } + } + + ds34pad[pad].data[0] = ~(report->Share | report->L3 << 1 | report->R3 << 2 | report->Option << 3 | up << 4 | right << 5 | down << 6 | left << 7); + ds34pad[pad].data[1] = ~(report->L2 | report->R2 << 1 | report->L1 << 2 | report->R1 << 3 | report->Triangle << 4 | report->Circle << 5 | report->Cross << 6 | report->Square << 7); + + ds34pad[pad].data[2] = report->RightStickX; //rx + ds34pad[pad].data[3] = report->RightStickY; //ry + ds34pad[pad].data[4] = report->LeftStickX; //lx + ds34pad[pad].data[5] = report->LeftStickY; //ly + + ds34pad[pad].data[6] = right * 255; //right + ds34pad[pad].data[7] = left * 255; //left + ds34pad[pad].data[8] = up * 255; //up + ds34pad[pad].data[9] = down * 255; //down + + ds34pad[pad].data[10] = report->Triangle * 255; //triangle + ds34pad[pad].data[11] = report->Circle * 255; //circle + ds34pad[pad].data[12] = report->Cross * 255; //cross + ds34pad[pad].data[13] = report->Square * 255; //square + + ds34pad[pad].data[14] = report->L1 * 255; //L1 + ds34pad[pad].data[15] = report->R1 * 255; //R1 + ds34pad[pad].data[16] = report->PressureL2; //L2 + ds34pad[pad].data[17] = report->PressureR2; //R2 + + if (report->PSButton) { //display battery level + if (report->Share && (ds34pad[pad].btn_delay == MAX_DELAY)) { //PS + Share + if (ds34pad[pad].analog_btn < 2) //unlocked mode + ds34pad[pad].analog_btn = !ds34pad[pad].analog_btn; + + ds34pad[pad].oldled[0] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][0]; + ds34pad[pad].oldled[1] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][1]; + ds34pad[pad].oldled[2] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][2]; + ds34pad[pad].btn_delay = 1; + } else { + ds34pad[pad].oldled[0] = report->Battery; + ds34pad[pad].oldled[1] = 0; + ds34pad[pad].oldled[2] = 0; + + if (ds34pad[pad].btn_delay < MAX_DELAY) + ds34pad[pad].btn_delay++; + } + } else { + ds34pad[pad].oldled[0] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][0]; + ds34pad[pad].oldled[1] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][1]; + ds34pad[pad].oldled[2] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][2]; + + if (ds34pad[pad].btn_delay > 0) + ds34pad[pad].btn_delay--; + } + + if (report->Power != 0xB && report->Usb_plugged) //charging + ds34pad[pad].oldled[3] = 1; + else + ds34pad[pad].oldled[3] = 0; + } + if (ds34pad[pad].btn_delay > 0) { + ds34pad[pad].update_rum = 1; + } + } else { + DPRINTF("Unmanaged Input Report: THDR 0x%02X ", data[8]); + DPRINTF(" ID 0x%02X \n", data[9]); + } +} + +/************************************************************/ +/* DS34BT Commands */ +/************************************************************/ + +void ds34bt_set_rumble(u8 lrum, u8 rrum, int port) +{ + WaitSema(bt_dev.hid_sema); + + ds34pad[port].update_rum = 1; + ds34pad[port].lrum = lrum; + ds34pad[port].rrum = rrum; + + SignalSema(bt_dev.hid_sema); +} + +int ds34bt_get_data(u8 *dst, int size, int port) +{ + int ret; + + WaitSema(bt_dev.hid_sema); + + mips_memcpy(dst, ds34pad[port].data, size); + ret = ds34pad[port].analog_btn & 1; + + SignalSema(bt_dev.hid_sema); + + return ret; +} + +void ds34bt_set_mode(int mode, int lock, int port) +{ + WaitSema(bt_dev.hid_sema); + + if (lock == 3) + ds34pad[port].analog_btn = 3; + else + ds34pad[port].analog_btn = mode; + + SignalSema(bt_dev.hid_sema); +} + +int ds34bt_get_status(int port) +{ + int ret; + + WaitSema(bt_dev.hid_sema); + + ret = ds34pad[port].status; + + SignalSema(bt_dev.hid_sema); + + return ret; +} + +int ds34bt_init(u8 pads, u8 options) +{ + int ret, i; + + for(i = 0; i < MAX_PADS; i++) + ds34pad[i].enabled = (pads >> i) & 1; + + ds34pad_init(); + + disable_fake = options & 1; + + bt_dev.hid_sema = CreateMutex(IOP_MUTEX_UNLOCKED); + + if (bt_dev.hid_sema < 0) { + DPRINTF("DS34BT: Failed to allocate semaphore.\n"); + return 0; + } + + ret = UsbRegisterDriver(&bt_driver); + + if (ret != USB_RC_OK) { + DPRINTF("DS34BT: Error registering USB devices: %02X\n", ret); + return 0; + } + + UsbRegisterDriver(&chrg_driver); + + return 1; +} + +void ds34bt_reset() +{ + int pad; + + if (bt_dev.status & DS34BT_STATE_USB_AUTHORIZED) { + for (pad = 0; pad < MAX_PADS; pad++) { + WaitSema(bt_dev.hid_sema); + pad_status_set(DS34BT_STATE_DISCONNECT_REQUEST, pad); + SignalSema(bt_dev.hid_sema); + while(1) { + DelayThread(500); + WaitSema(bt_dev.hid_sema); + if (!pad_status_check(DS34BT_STATE_RUNNING, pad)) { + SignalSema(bt_dev.hid_sema); + break; + } + SignalSema(bt_dev.hid_sema); + } + } + DelayThread(1000000); + bt_disconnect(bt_dev.devId); + } +} diff --git a/modules/pademu/ds34bt.h b/modules/pademu/ds34bt.h new file mode 100644 index 000000000..487c01d7c --- /dev/null +++ b/modules/pademu/ds34bt.h @@ -0,0 +1,355 @@ +#ifndef _DS34BT_H_ +#define _DS34BT_H_ + +#include "irx.h" + +#define USB_CLASS_WIRELESS_CONTROLLER 0xE0 +#define USB_SUBCLASS_RF_CONTROLLER 0x01 +#define USB_PROTOCOL_BLUETOOTH_PROG 0x01 + +#define DS34_VID 0x054C // Sony Corporation +#define DS3_PID 0x0268 // PS3 Controller +#define DS4_PID 0x05C4 // PS4 Controller +#define DS4_PID_SLIM 0x09CC // PS4 Slim Controller + +#define DS3 0 +#define DS4 1 + +#define MAX_BUFFER_SIZE 64 // Size of general purpose data buffer + +#define PENDING 1 +#define SUCCESSFUL 0 + +typedef struct +{ + int devId; + int hid_sema; + int controlEndp; + int interruptEndp; + int inEndp; + int outEndp; + u8 status; +} bt_device; + +typedef struct +{ + u16 hci_handle; //hci connection handle + u16 control_scid; // Channel endpoint on command destination + u16 interrupt_scid; // Channel endpoint on interrupt destination + u8 bdaddr[6]; + u8 enabled; + u8 status; + u8 isfake; + u8 type; //0 - ds3, 1 - ds4 + u8 oldled[4]; //rgb for ds4 and blink + u8 lrum; + u8 rrum; + u8 update_rum; + u8 data[18]; + u8 analog_btn; + u8 btn_delay; +} ds34bt_pad_t; + +enum eDS34BTStatus +{ + DS34BT_STATE_USB_DISCONNECTED = 0x00, + DS34BT_STATE_USB_AUTHORIZED = 0x01, + DS34BT_STATE_USB_CONFIGURED = 0x02, + DS34BT_STATE_CONNECTED = 0x04, + DS34BT_STATE_RUNNING = 0x08, + DS34BT_STATE_DISCONNECTING = 0x10, + DS34BT_STATE_DISCONNECT_REQUEST = 0x20, +}; + +#define pad_status_clear(flag, pad) ds34pad[pad].status &= ~flag +#define pad_status_set(flag, pad) ds34pad[pad].status |= flag +#define pad_status_check(flag, pad) (ds34pad[pad].status & flag) + +#define hci_event_flag_clear(flag) hci_event_flag &= ~flag +#define hci_event_flag_set(flag) hci_event_flag |= flag +#define hci_event_flag_check(flag) (hci_event_flag & flag) + +enum eHCI { + // {{{ + /* Bluetooth HCI states for HCI_task() */ + HCI_INIT_STATE = 0, + HCI_RESET_STATE, + HCI_READBDADDR_STATE, + HCI_CONNECT_IN_STATE, + HCI_REMOTE_NAME_STATE, + HCI_CHANGE_CONNECTION, + HCI_READ_REMOTE_SUPPORTED_FEATURES, + HCI_CONNECTED_STATE, + + /* HCI OpCode Group Field (OGF) */ + HCI_OGF_LINK_CNTRL = (0x01 << 2), // OGF: Link Control Commands + HCI_OGF_LINK_POLICY = (0x02 << 2), // OGF: Link Policy Commands + HCI_OGF_CTRL_BBAND = (0x03 << 2), // OGF: Controller & Baseband Commands + HCI_OGF_INFO_PARAM = (0x04 << 2), // OGF: Informational Parameters + + /* HCI OpCode Command Field (OCF) */ + HCI_OCF_DISCONNECT = 0x06, // OGF = 0x01 + HCI_OCF_ACCEPT_CONNECTION = 0x09, // OGF = 0x01 + HCI_OCF_REJECT_CONNECTION = 0x0A, // OGF = 0x01 + HCI_OCF_CHANGE_CONNECTION_TYPE = 0x0F, // OGF = 0x01 + HCI_OCF_REMOTE_NAME = 0x19, // OGF = 0x01 + HCI_OCF_LINK_KEY_REQUEST_REPLY = 0x0B, // OGF = 0x01 + + HCI_OCF_RESET = 0x03, // OGF = 0x03 + HCI_OCF_WRITE_ACCEPT_TIMEOUT = 0x16, // OGF = 0x03 + HCI_OCF_WRITE_SCAN_ENABLE = 0x1A, // OGF = 0x03 + + HCI_OCF_READ_BDADDR = 0x09, // OGF = 0x04 + + /* HCI events managed */ + HCI_EVENT_CONNECT_COMPLETE = 0x03, + HCI_EVENT_CONNECT_REQUEST = 0x04, + HCI_EVENT_DISCONN_COMPLETE = 0x05, + HCI_EVENT_AUTHENTICATION_COMPLETE= 0x06, + HCI_EVENT_REMOTE_NAME_COMPLETE = 0x07, + HCI_EVENT_ENCRYPTION_CHANGE = 0x08, + HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE = 0x0B, + HCI_EVENT_QOS_SETUP_COMPLETE = 0x0d, // do nothing + HCI_EVENT_COMMAND_COMPLETE = 0x0e, + HCI_EVENT_COMMAND_STATUS = 0x0f, + HCI_EVENT_ROLE_CHANGED = 0x12, + HCI_EVENT_NUM_COMPLETED_PKT = 0x13, // do nothing + HCI_EVENT_PIN_CODE_REQUEST = 0x16, + HCI_EVENT_LINK_KEY_REQUEST = 0x17, + HCI_EVENT_CHANGED_CONNECTION_TYPE = 0x1D, + HCI_EVENT_PAGE_SR_CHANGED = 0x20, + HCI_EVENT_MAX_SLOT_CHANGE = 0x1B, //Max Slots Change event + + /* HCI event flags for hci_event_flag */ + HCI_FLAG_COMMAND_COMPLETE = 0x01, + HCI_FLAG_COMMAND_STATUS = 0x02, + HCI_FLAG_CONNECT_COMPLETE = 0x04, + HCI_FLAG_DISCONN_COMPLETE = 0x08, + HCI_FLAG_INCOMING_REQUEST = 0x10, + HCI_FLAG_READ_BDADDR = 0x20, + HCI_FLAG_REMOTE_NAME_COMPLETE = 0x40, + + /* HCI Scan Enable Parameters */ + SCAN_ENABLE_NOINQ_NOPAG = 0x00, + SCAN_ENABLE_ENINQ_NOPAG = 0x01, + SCAN_ENABLE_NOINQ_ENPAG = 0x02, + SCAN_ENABLE_ENINQ_ENPAG = 0x03, + // }}} +}; + +enum eL2CAP { + // {{{ + /* Bluetooth L2CAP PSM */ + L2CAP_PSM_SDP = 0x01, + L2CAP_PSM_CTRL = 0x11, // HID_Control + L2CAP_PSM_INTR = 0x13, // HID_Interrupt + + /* Bluetooth L2CAP states for L2CAP_task() */ + L2CAP_DOWN_STATE = 0, + L2CAP_INIT_STATE, + L2CAP_CONTROL_CONNECTING_STATE, + L2CAP_CONTROL_REQUEST_STATE, + L2CAP_CONTROL_CONFIGURING_STATE, + L2CAP_INTERRUPT_CONNECTING_STATE, + L2CAP_INTERRUPT_REQUEST_STATE, + L2CAP_INTERRUPT_CONFIGURING_STATE, + L2CAP_CONNECTED_STATE, + L2CAP_LED_STATE, + L2CAP_LED_STATE_END, + L2CAP_READY_STATE, + L2CAP_DISCONNECT_STATE, + + /* L2CAP event flags */ + L2CAP_EV_COMMAND_CONNECTED = 0x01, + L2CAP_EV_COMMAND_CONFIG_REQ = 0x02, + L2CAP_EV_COMMAND_CONFIGURED = 0x04, + L2CAP_EV_COMMAND_DISCONNECT_REQ = 0x08, + L2CAP_EV_INTERRUPT_CONNECTED = 0x10, + L2CAP_EV_INTERRUPT_CONFIG_REQ = 0x20, + L2CAP_EV_INTERRUPT_CONFIGURED = 0x40, + L2CAP_EV_INTERRUPT_DISCONNECT_REQ = 0x80, + + /* L2CAP signaling command */ + L2CAP_CMD_COMMAND_REJECT = 0x01, + L2CAP_CMD_CONNECTION_REQUEST = 0x02, + L2CAP_CMD_CONNECTION_RESPONSE = 0x03, + L2CAP_CMD_CONFIG_REQUEST = 0x04, + L2CAP_CMD_CONFIG_RESPONSE = 0x05, + L2CAP_CMD_DISCONNECT_REQUEST = 0x06, + L2CAP_CMD_DISCONNECT_RESPONSE = 0x07, + +/* HCI ACL Data Packet + * + * buf[0] buf[1] buf[2] buf[3] + * 0 4 8 11 12 16 24 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | HCI Handle |PB |BC | Data Total Length | HCI ACL Data Packet + * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * + * buf[4] buf[5] buf[6] buf[7] + * 0 8 16 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | Length | Channel ID | Basic L2CAP header + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * + * buf[8] buf[9] buf[10] buf[11] + * 0 8 16 31 MSB + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. + * | Code | Identifier | Length | Control frame (C-frame) + * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. (signaling packet format) + */ + // }}} +}; + +#define l2cap_handle_ok(handle) (((u16)(l2cap_buf[0] | (l2cap_buf[1] << 8)) & 0x0FFF) == (u16)(handle & 0x0FFF)) +#define l2cap_control_channel ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == 0x0001) // Channel ID for ACL-U +#define l2cap_interrupt_channel ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == interrupt_dcid) +#define l2cap_command_channel ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == control_dcid) + +enum eHID { + // {{{ + /* HID event flag */ + HID_FLAG_STATUS_REPORTED = 0x01, + HID_FLAG_BUTTONS_CHANGED = 0x02, + HID_FLAG_EXTENSION = 0x04, + HID_FLAG_COMMAND_SUCCESS = 0x08, + + /* Bluetooth HID Transaction Header (THdr) */ + HID_THDR_GET_REPORT_FEATURE = 0x43, + HID_THDR_SET_REPORT_OUTPUT = 0x52, + HID_THDR_SET_REPORT_FEATURE = 0x53, + HID_THDR_DATA_INPUT = 0xa1, + + /* Defines of various parameters for PS3 Game controller reports */ + PS3_F4_REPORT_ID = 0xF4, + PS3_F4_REPORT_LEN = 0x04, + + PS3_01_REPORT_ID = 0x01, + PS3_01_REPORT_LEN = 0x30, + + PS4_02_REPORT_ID = 0x02, + PS4_11_REPORT_ID = 0x11, + PS4_11_REPORT_LEN = 0x4D, + + // }}} +}; + +struct ds3report { + union { + u8 ButtonStateL; // Main buttons Low + struct { + u8 Select : 1; + u8 L3 : 1; + u8 R3 : 1; + u8 Start : 1; + u8 Up : 1; + u8 Right : 1; + u8 Down : 1; + u8 Left : 1; + }; + }; + union { + u8 ButtonStateH; // Main buttons High + struct { + u8 L2 : 1; + u8 R2 : 1; + u8 L1 : 1; + u8 R1 : 1; + u8 Triangle : 1; + u8 Circle : 1; + u8 Cross : 1; + u8 Square : 1; + }; + }; + u8 PSButtonState; // PS button + u8 Reserved1; // Unknown + u8 LeftStickX; // left Joystick X axis 0 - 255, 128 is mid + u8 LeftStickY; // left Joystick Y axis 0 - 255, 128 is mid + u8 RightStickX; // right Joystick X axis 0 - 255, 128 is mid + u8 RightStickY; // right Joystick Y axis 0 - 255, 128 is mid + u8 Reserved2[4]; // Unknown + u8 PressureUp; // digital Pad Up button Pressure 0 - 255 + u8 PressureRight; // digital Pad Right button Pressure 0 - 255 + u8 PressureDown; // digital Pad Down button Pressure 0 - 255 + u8 PressureLeft; // digital Pad Left button Pressure 0 - 255 + u8 PressureL2; // digital Pad L2 button Pressure 0 - 255 + u8 PressureR2; // digital Pad R2 button Pressure 0 - 255 + u8 PressureL1; // digital Pad L1 button Pressure 0 - 255 + u8 PressureR1; // digital Pad R1 button Pressure 0 - 255 + u8 PressureTriangle; // digital Pad Triangle button Pressure 0 - 255 + u8 PressureCircle; // digital Pad Circle button Pressure 0 - 255 + u8 PressureCross; // digital Pad Cross button Pressure 0 - 255 + u8 PressureSquare; // digital Pad Square button Pressure 0 - 255 + u8 Reserved3[3]; // Unknown + u8 Charge; // charging status ? 02 = charge, 03 = normal + u8 Power; // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging + u8 Connection; // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble + u8 Reserved4[9]; // Unknown + s16 AccelX; + s16 AccelY; + s16 AccelZ; + s16 GyroZ; + +} __attribute__((packed)); + +struct ds4report { + u8 ReportID; + u8 LeftStickX; // left Joystick X axis 0 - 255, 128 is mid + u8 LeftStickY; // left Joystick Y axis 0 - 255, 128 is mid + u8 RightStickX; // right Joystick X axis 0 - 255, 128 is mid + u8 RightStickY; // right Joystick Y axis 0 - 255, 128 is mid + u8 Dpad : 4; // hat format, 0x08 is released, 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW + u8 Square : 1; + u8 Cross : 1; + u8 Circle : 1; + u8 Triangle : 1; + u8 L1 : 1; + u8 R1 : 1; + u8 L2 : 1; + u8 R2 : 1; + u8 Share : 1; + u8 Option : 1; + u8 L3 : 1; + u8 R3 : 1; + u8 PSButton : 1; + u8 TPad : 1; + u8 Counter1 : 6; // counts up by 1 per report + u8 PressureL2; // digital Pad L2 button Pressure 0 - 255 + u8 PressureR2; // digital Pad R2 button Pressure 0 - 255 + u8 Counter2; + u8 Counter3; + u8 Battery; // battery level from 0x00 to 0xff + s16 AccelX; + s16 AccelY; + s16 AccelZ; + s16 GyroZ; + s16 GyroY; + s16 GyroX; + u8 Reserved1[5]; // Unknown + u8 Power : 4; // from 0x0 to 0xA - charging, 0xB - charged + u8 Usb_plugged : 1; + u8 Headphones : 1; + u8 Microphone : 1; + u8 Padding : 1; + u8 Reserved2[2]; // Unknown + u8 TPpack; // number of trackpad packets (0x00 to 0x04) + u8 PackCounter; // packet counter + u8 Finger1ID : 7; // counter + u8 Finger1Active : 1; // 0 - active, 1 - unactive + u16 Finger1X : 12; // finger 1 coordinates resolution 1920x943 + u16 Finger1Y : 12; + u8 Finger2ID : 7; + u8 Finger2Active : 1; + u16 Finger2X : 12; // finger 2 coordinates resolution 1920x943 + u16 Finger2Y : 12; + +} __attribute__((packed)); + +int ds34bt_init(u8 pads, u8 options); +int ds34bt_get_status(int port); +void ds34bt_reset(); +int ds34bt_get_data(u8 *dst, int size, int port); +void ds34bt_set_rumble(u8 lrum, u8 rrum, int port); +void ds34bt_set_mode(int mode, int lock, int port); + +#endif diff --git a/modules/pademu/ds34usb.c b/modules/pademu/ds34usb.c new file mode 100644 index 000000000..5f9975c98 --- /dev/null +++ b/modules/pademu/ds34usb.c @@ -0,0 +1,616 @@ +#include "types.h" +#include "loadcore.h" +#include "stdio.h" +#include "sifrpc.h" +#include "sysclib.h" +#include "usbd.h" +#include "usbd_macro.h" +#include "thbase.h" +#include "thsemap.h" +#include "ds34usb.h" +#include "sys_utils.h" + +//#define DPRINTF(x...) printf(x) +#define DPRINTF(x...) + +#define REQ_USB_OUT (USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) +#define REQ_USB_IN (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) + +#define MAX_PADS 4 + +static u8 output_01_report[] = + { + 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x02, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00}; + +static u8 led_patterns[][2] = + { + {0x1C, 0x02}, + {0x1A, 0x04}, + {0x16, 0x08}, + {0x0E, 0x10}, +}; + +static u8 power_level[] = + { + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; + +static u8 rgbled_patterns[][2][3] = + { + {{0x00, 0x00, 0x10}, {0x00, 0x00, 0x7F}}, // light blue/blue + {{0x00, 0x10, 0x00}, {0x00, 0x7F, 0x00}}, // light green/green + {{0x10, 0x10, 0x00}, {0x7F, 0x7F, 0x00}}, // light yellow/yellow + {{0x00, 0x10, 0x10}, {0x00, 0x7F, 0x7F}}, // light cyan/cyan +}; + +static u8 usb_buf[MAX_BUFFER_SIZE + 20] __attribute((aligned(4))) = {0}; + +int usb_probe(int devId); +int usb_connect(int devId); +int usb_disconnect(int devId); + +static void usb_release(int pad); +static void usb_config_set(int result, int count, void *arg); + +UsbDriver usb_driver = {NULL, NULL, "ds34usb", usb_probe, usb_connect, usb_disconnect}; + +static void DS3USB_init(int pad); +static void readReport(u8 *data, int pad); +static int LEDRumble(u8 *led, u8 lrum, u8 rrum, int pad); + +ds34usb_device ds34pad[MAX_PADS]; + +int usb_probe(int devId) +{ + UsbDeviceDescriptor *device = NULL; + + DPRINTF("DS34USB: probe: devId=%i\n", devId); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + if (device == NULL) { + DPRINTF("DS34USB: Error - Couldn't get device descriptor\n"); + return 0; + } + + if (device->idVendor == DS34_VID && (device->idProduct == DS3_PID || device->idProduct == DS4_PID || device->idProduct == DS4_PID_SLIM)) + return 1; + + return 0; +} + +int usb_connect(int devId) +{ + int pad, epCount; + UsbDeviceDescriptor *device; + UsbConfigDescriptor *config; + UsbInterfaceDescriptor *interface; + UsbEndpointDescriptor *endpoint; + + DPRINTF("DS34USB: connect: devId=%i\n", devId); + + for (pad = 0; pad < MAX_PADS; pad++) { + if (ds34pad[pad].devId == -1 && ds34pad[pad].enabled) + break; + } + + if (pad >= MAX_PADS) { + DPRINTF("DS34USB: Error - only %d device allowed !\n", MAX_PADS); + return 1; + } + + PollSema(ds34pad[pad].sema); + + ds34pad[pad].devId = devId; + + ds34pad[pad].status = DS34USB_STATE_AUTHORIZED; + + ds34pad[pad].controlEndp = UsbOpenEndpoint(devId, NULL); + + device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); + config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); + interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); + + if (device->idProduct == DS3_PID) { + ds34pad[pad].type = DS3; + epCount = interface->bNumEndpoints - 1; + } else { + ds34pad[pad].type = DS4; + epCount = 20; // ds4 v2 returns interface->bNumEndpoints as 0 + } + + endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); + + do { + if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && ds34pad[pad].interruptEndp < 0) { + ds34pad[pad].interruptEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("DS34USB: register Event endpoint id =%i addr=%02X packetSize=%i\n", ds34pad[pad].interruptEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && ds34pad[pad].outEndp < 0) { + ds34pad[pad].outEndp = UsbOpenEndpointAligned(devId, endpoint); + DPRINTF("DS34USB: register Output endpoint id =%i addr=%02X packetSize=%i\n", ds34pad[pad].outEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); + } + } + + endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); + + } while (epCount--); + + if (ds34pad[pad].interruptEndp < 0 || ds34pad[pad].outEndp < 0) { + usb_release(pad); + return 1; + } + + ds34pad[pad].status |= DS34USB_STATE_CONNECTED; + + UsbSetDeviceConfiguration(ds34pad[pad].controlEndp, config->bConfigurationValue, usb_config_set, (void *)pad); + SignalSema(ds34pad[pad].sema); + + return 0; +} + +int usb_disconnect(int devId) +{ + u8 pad; + + DPRINTF("DS34USB: disconnect: devId=%i\n", devId); + + for (pad = 0; pad < MAX_PADS; pad++) { + if (ds34pad[pad].devId == devId) + break; + } + + if (pad < MAX_PADS) + usb_release(pad); + + return 0; +} + +static void usb_release(int pad) +{ + PollSema(ds34pad[pad].sema); + + if (ds34pad[pad].interruptEndp >= 0) + UsbCloseEndpoint(ds34pad[pad].interruptEndp); + + if (ds34pad[pad].outEndp >= 0) + UsbCloseEndpoint(ds34pad[pad].outEndp); + + ds34pad[pad].controlEndp = -1; + ds34pad[pad].interruptEndp = -1; + ds34pad[pad].outEndp = -1; + ds34pad[pad].devId = -1; + ds34pad[pad].status = DS34USB_STATE_DISCONNECTED; + + SignalSema(ds34pad[pad].sema); +} + +static int usb_resulCode; + +static void usb_data_cb(int resultCode, int bytes, void *arg) +{ + int pad = (int)arg; + + //DPRINTF("DS34USB: usb_data_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + usb_resulCode = resultCode; + + SignalSema(ds34pad[pad].sema); +} + +static void usb_cmd_cb(int resultCode, int bytes, void *arg) +{ + int pad = (int)arg; + + //DPRINTF("DS34USB: usb_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); + + SignalSema(ds34pad[pad].cmd_sema); +} + +static void usb_config_set(int result, int count, void *arg) +{ + int pad = (int)arg; + u8 led[4]; + + PollSema(ds34pad[pad].sema); + + ds34pad[pad].status |= DS34USB_STATE_CONFIGURED; + + if (ds34pad[pad].type == DS3) { + DS3USB_init(pad); + DelayThread(10000); + led[0] = led_patterns[pad][1]; + led[3] = 0; + } else if(ds34pad[pad].type == DS4) { + led[0] = rgbled_patterns[pad][1][0]; + led[1] = rgbled_patterns[pad][1][1]; + led[2] = rgbled_patterns[pad][1][2]; + led[3] = 0; + } + + LEDRumble(led, 0, 0, pad); + + ds34pad[pad].status |= DS34USB_STATE_RUNNING; + + SignalSema(ds34pad[pad].sema); +} + +static void DS3USB_init(int pad) +{ + usb_buf[0] = 0x42; + usb_buf[1] = 0x0c; + usb_buf[2] = 0x00; + usb_buf[3] = 0x00; + + UsbControlTransfer(ds34pad[pad].controlEndp, REQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF4, 0, 4, usb_buf, NULL, NULL); +} + +#define MAX_DELAY 10 + +static void readReport(u8 *data, int pad) +{ + if (data[0]) { + + if (ds34pad[pad].type == DS3) { + struct ds3report *report; + + report = (struct ds3report *)&data[2]; + + ds34pad[pad].data[0] = ~report->ButtonStateL; + ds34pad[pad].data[1] = ~report->ButtonStateH; + + ds34pad[pad].data[2] = report->RightStickX; //rx + ds34pad[pad].data[3] = report->RightStickY; //ry + ds34pad[pad].data[4] = report->LeftStickX; //lx + ds34pad[pad].data[5] = report->LeftStickY; //ly + + ds34pad[pad].data[6] = report->PressureRight; //right + ds34pad[pad].data[7] = report->PressureLeft; //left + ds34pad[pad].data[8] = report->PressureUp; //up + ds34pad[pad].data[9] = report->PressureDown; //down + + ds34pad[pad].data[10] = report->PressureTriangle; //triangle + ds34pad[pad].data[11] = report->PressureCircle; //circle + ds34pad[pad].data[12] = report->PressureCross; //cross + ds34pad[pad].data[13] = report->PressureSquare; //square + + ds34pad[pad].data[14] = report->PressureL1; //L1 + ds34pad[pad].data[15] = report->PressureR1; //R1 + ds34pad[pad].data[16] = report->PressureL2; //L2 + ds34pad[pad].data[17] = report->PressureR2; //R2 + + if (report->PSButtonState) { //display battery level + if (report->Select && (ds34pad[pad].btn_delay == MAX_DELAY)) { //PS + SELECT + if (ds34pad[pad].analog_btn < 2) //unlocked mode + ds34pad[pad].analog_btn = !ds34pad[pad].analog_btn; + + ds34pad[pad].oldled[0] = led_patterns[pad][(ds34pad[pad].analog_btn & 1)]; + ds34pad[pad].btn_delay = 1; + } else { + if (report->Power != 0xEE) + ds34pad[pad].oldled[0] = power_level[report->Power]; + + if (ds34pad[pad].btn_delay < MAX_DELAY) + ds34pad[pad].btn_delay++; + } + } else { + ds34pad[pad].oldled[0] = led_patterns[pad][(ds34pad[pad].analog_btn & 1)]; + + if (ds34pad[pad].btn_delay > 0) + ds34pad[pad].btn_delay--; + } + + if (report->Power == 0xEE) //charging + ds34pad[pad].oldled[3] = 1; + else + ds34pad[pad].oldled[3] = 0; + + } else if (ds34pad[pad].type == DS4) { + struct ds4report *report; + u8 up = 0, down = 0, left = 0, right = 0; + + report = (struct ds4report *)data; + + switch(report->Dpad) { + case 0: up = 1; + break; + case 1: up = 1; right = 1; + break; + case 2: right = 1; + break; + case 3: down = 1; right = 1; + break; + case 4: down = 1; + break; + case 5: down = 1; left = 1; + break; + case 6: left = 1; + break; + case 7: up = 1; left = 1; + break; + case 8: up = 0; down = 0; left = 0; right = 0; + break; + } + + if (report->TPad) { + if (!report->Finger1Active) { + if (report->Finger1X < 960) + report->Share = 1; + else + report->Option = 1; + } + + if (!report->Finger2Active) { + if (report->Finger2X < 960) + report->Share = 1; + else + report->Option = 1; + } + } + + ds34pad[pad].data[0] = ~(report->Share | report->L3 << 1 | report->R3 << 2 | report->Option << 3 | up << 4 | right << 5 | down << 6 | left << 7); + ds34pad[pad].data[1] = ~(report->L2 | report->R2 << 1 | report->L1 << 2 | report->R1 << 3 | report->Triangle << 4 | report->Circle << 5 | report->Cross << 6 | report->Square << 7); + + ds34pad[pad].data[2] = report->RightStickX; //rx + ds34pad[pad].data[3] = report->RightStickY; //ry + ds34pad[pad].data[4] = report->LeftStickX; //lx + ds34pad[pad].data[5] = report->LeftStickY; //ly + + ds34pad[pad].data[6] = right * 255; //right + ds34pad[pad].data[7] = left * 255; //left + ds34pad[pad].data[8] = up * 255; //up + ds34pad[pad].data[9] = down * 255; //down + + ds34pad[pad].data[10] = report->Triangle * 255; //triangle + ds34pad[pad].data[11] = report->Circle * 255; //circle + ds34pad[pad].data[12] = report->Cross * 255; //cross + ds34pad[pad].data[13] = report->Square * 255; //square + + ds34pad[pad].data[14] = report->L1 * 255; //L1 + ds34pad[pad].data[15] = report->R1 * 255; //R1 + ds34pad[pad].data[16] = report->PressureL2; //L2 + ds34pad[pad].data[17] = report->PressureR2; //R2 + + if (report->PSButton) { //display battery level + if (report->Share && (ds34pad[pad].btn_delay == MAX_DELAY)) { //PS + Share + if (ds34pad[pad].analog_btn < 2) //unlocked mode + ds34pad[pad].analog_btn = !ds34pad[pad].analog_btn; + + ds34pad[pad].oldled[0] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][0]; + ds34pad[pad].oldled[1] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][1]; + ds34pad[pad].oldled[2] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][2]; + ds34pad[pad].btn_delay = 1; + } else { + ds34pad[pad].oldled[0] = report->Battery; + ds34pad[pad].oldled[1] = 0; + ds34pad[pad].oldled[2] = 0; + + if (ds34pad[pad].btn_delay < MAX_DELAY) + ds34pad[pad].btn_delay++; + } + } else { + ds34pad[pad].oldled[0] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][0]; + ds34pad[pad].oldled[1] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][1]; + ds34pad[pad].oldled[2] = rgbled_patterns[pad][(ds34pad[pad].analog_btn & 1)][2]; + + if (ds34pad[pad].btn_delay > 0) + ds34pad[pad].btn_delay--; + } + + if (report->Power != 0xB && report->Usb_plugged) //charging + ds34pad[pad].oldled[3] = 1; + else + ds34pad[pad].oldled[3] = 0; + + } + if (ds34pad[pad].btn_delay > 0) { + ds34pad[pad].update_rum = 1; + } + } +} + +static int LEDRumble(u8 *led, u8 lrum, u8 rrum, int pad) +{ + int ret = 0; + + PollSema(ds34pad[pad].cmd_sema); + + mips_memset(usb_buf, 0, sizeof(usb_buf)); + + if (ds34pad[pad].type == DS3) { + mips_memcpy(usb_buf, output_01_report, sizeof(output_01_report)); + + usb_buf[1] = 0xFE; //rt + usb_buf[2] = rrum; //rp + usb_buf[3] = 0xFE; //lt + usb_buf[4] = lrum; //lp + + usb_buf[9] = led[0] & 0x7F; //LED Conf + + if (led[3]) //means charging, so blink + { + usb_buf[13] = 0x32; + usb_buf[18] = 0x32; + usb_buf[23] = 0x32; + usb_buf[28] = 0x32; + } + + ret = UsbControlTransfer(ds34pad[pad].controlEndp, REQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_SET_REPORT_OUTPUT << 8) | 0x01, 0, sizeof(output_01_report), usb_buf, usb_cmd_cb, (void *)pad); + } else if (ds34pad[pad].type == DS4) { + usb_buf[0] = 0x05; + usb_buf[1] = 0xFF; + + usb_buf[4] = rrum * 255; //ds4 has full control + usb_buf[5] = lrum; + + usb_buf[6] = led[0]; //r + usb_buf[7] = led[1]; //g + usb_buf[8] = led[2]; //b + + if (led[3]) //means charging, so blink + { + usb_buf[9] = 0x80; // Time to flash bright (255 = 2.5 seconds) + usb_buf[10] = 0x80; // Time to flash dark (255 = 2.5 seconds) + } + + ret = UsbInterruptTransfer(ds34pad[pad].outEndp, usb_buf, 32, usb_cmd_cb, (void *)pad); + } + + ds34pad[pad].oldled[0] = led[0]; + ds34pad[pad].oldled[1] = led[1]; + ds34pad[pad].oldled[2] = led[2]; + ds34pad[pad].oldled[3] = led[3]; + + return ret; +} + +static unsigned int timeout(void *arg) +{ + int sema = (int)arg; + iSignalSema(sema); + return 0; +} + +static void TransferWait(int sema) +{ + iop_sys_clock_t cmd_timeout; + + cmd_timeout.lo = 200000; + cmd_timeout.hi = 0; + + if (SetAlarm(&cmd_timeout, timeout, (void *)sema) == 0) { + WaitSema(sema); + CancelAlarm(timeout, NULL); + } +} + +void ds34usb_set_rumble(u8 lrum, u8 rrum, int port) +{ + WaitSema(ds34pad[port].sema); + + ds34pad[port].update_rum = 1; + ds34pad[port].lrum = lrum; + ds34pad[port].rrum = rrum; + + SignalSema(ds34pad[port].sema); +} + +int ds34usb_get_data(u8 *dst, int size, int port) +{ + int ret = 0; + + WaitSema(ds34pad[port].sema); + + if (ds34pad[port].update_rum) { + ret = LEDRumble(ds34pad[port].oldled, ds34pad[port].lrum, ds34pad[port].rrum, port); + if (ret == USB_RC_OK) + TransferWait(ds34pad[port].cmd_sema); + else + DPRINTF("DS34USB: LEDRumble usb transfer error %d\n", ret); + + ds34pad[port].update_rum = 0; + } + + PollSema(ds34pad[port].sema); + + ret = UsbInterruptTransfer(ds34pad[port].interruptEndp, usb_buf, MAX_BUFFER_SIZE, usb_data_cb, (void *)port); + + if (ret == USB_RC_OK) { + TransferWait(ds34pad[port].sema); + if (!usb_resulCode) + readReport(usb_buf, port); + + usb_resulCode = 1; + } else { + DPRINTF("DS34USB: ds34usb_get_data usb transfer error %d\n", ret); + } + + mips_memcpy(dst, ds34pad[port].data, size); + ret = ds34pad[port].analog_btn & 1; + + SignalSema(ds34pad[port].sema); + + return ret; +} + +void ds34usb_set_mode(int mode, int lock, int port) +{ + if (lock == 3) + ds34pad[port].analog_btn = 3; + else + ds34pad[port].analog_btn = mode; +} + +void ds34usb_reset() +{ + int pad; + + for (pad = 0; pad < MAX_PADS; pad++) + usb_release(pad); +} + +int ds34usb_get_status(int port) +{ + int ret; + + WaitSema(ds34pad[port].sema); + ret = ds34pad[port].status; + SignalSema(ds34pad[port].sema); + + return ret; +} + +int ds34usb_init(u8 pads, u8 options) +{ + int pad; + + for (pad = 0; pad < MAX_PADS; pad++) { + ds34pad[pad].status = 0; + ds34pad[pad].devId = -1; + ds34pad[pad].oldled[0] = 0; + ds34pad[pad].oldled[1] = 0; + ds34pad[pad].oldled[2] = 0; + ds34pad[pad].oldled[3] = 0; + ds34pad[pad].lrum = 0; + ds34pad[pad].rrum = 0; + ds34pad[pad].update_rum = 1; + ds34pad[pad].sema = -1; + ds34pad[pad].cmd_sema = -1; + ds34pad[pad].controlEndp = -1; + ds34pad[pad].interruptEndp = -1; + ds34pad[pad].enabled = (pads >> pad) & 1; + ds34pad[pad].type = 0; + + ds34pad[pad].data[0] = 0xFF; + ds34pad[pad].data[1] = 0xFF; + ds34pad[pad].analog_btn = 0; + + mips_memset(&ds34pad[pad].data[2], 0x7F, 4); + mips_memset(&ds34pad[pad].data[6], 0x00, 12); + + ds34pad[pad].sema = CreateMutex(IOP_MUTEX_UNLOCKED); + ds34pad[pad].cmd_sema = CreateMutex(IOP_MUTEX_UNLOCKED); + + if (ds34pad[pad].sema < 0 || ds34pad[pad].cmd_sema < 0) { + DPRINTF("DS34USB: Failed to allocate I/O semaphore.\n"); + return 0; + } + } + + if (UsbRegisterDriver(&usb_driver) != USB_RC_OK) { + DPRINTF("DS34USB: Error registering USB devices\n"); + return 0; + } + + return 1; +} diff --git a/modules/pademu/ds34usb.h b/modules/pademu/ds34usb.h new file mode 100644 index 000000000..01f58f19b --- /dev/null +++ b/modules/pademu/ds34usb.h @@ -0,0 +1,188 @@ +#ifndef _DS34USB_H_ +#define _DS34USB_H_ + +#include "irx.h" + +#define DS34_VID 0x054C // Sony Corporation +#define DS3_PID 0x0268 // PS3 Controller +#define DS4_PID 0x05C4 // PS4 Controller +#define DS4_PID_SLIM 0x09CC // PS4 Slim Controller + +#define DS3 0 +#define DS4 1 + +#define MAX_BUFFER_SIZE 64 // Size of general purpose data buffer + +typedef struct _usb_ds34 +{ + int devId; + int sema; + int cmd_sema; + int controlEndp; + int interruptEndp; + int outEndp; + u8 enabled; + u8 status; + u8 type; //0 - ds3, 1 - ds4 + u8 oldled[4]; //rgb for ds4 and blink + u8 lrum; + u8 rrum; + u8 update_rum; + u8 data[18]; + u8 analog_btn; + u8 btn_delay; +} ds34usb_device; + +enum eDS34USBStatus { + DS34USB_STATE_DISCONNECTED = 0x00, + DS34USB_STATE_AUTHORIZED = 0x01, + DS34USB_STATE_CONFIGURED = 0x02, + DS34USB_STATE_CONNECTED = 0x04, + DS34USB_STATE_RUNNING = 0x08, +}; + +enum eHID { + // {{{ + /* HID event flag */ + HID_FLAG_STATUS_REPORTED = 0x01, + HID_FLAG_BUTTONS_CHANGED = 0x02, + HID_FLAG_EXTENSION = 0x04, + HID_FLAG_COMMAND_SUCCESS = 0x08, + + /* USB HID Transaction Header (THdr) */ + HID_USB_GET_REPORT_FEATURE = 0x03, + HID_USB_SET_REPORT_OUTPUT = 0x02, + HID_USB_DATA_INPUT = 0x01, + + /* Defines of various parameters for PS3 Game controller reports */ + PS3_F4_REPORT_ID = 0xF4, + PS3_F4_REPORT_LEN = 0x04, + + PS3_01_REPORT_ID = 0x01, + PS3_01_REPORT_LEN = 0x30, + + PS4_02_REPORT_ID = 0x02, + PS4_11_REPORT_ID = 0x11, + PS4_11_REPORT_LEN = 0x4D, + // }}} +}; + +struct ds3report { + union { + u8 ButtonStateL; // Main buttons Low + struct { + u8 Select : 1; + u8 L3 : 1; + u8 R3 : 1; + u8 Start : 1; + u8 Up : 1; + u8 Right : 1; + u8 Down : 1; + u8 Left : 1; + }; + }; + union { + u8 ButtonStateH; // Main buttons High + struct { + u8 L2 : 1; + u8 R2 : 1; + u8 L1 : 1; + u8 R1 : 1; + u8 Triangle : 1; + u8 Circle : 1; + u8 Cross : 1; + u8 Square : 1; + }; + }; + u8 PSButtonState; // PS button + u8 Reserved1; // Unknown + u8 LeftStickX; // left Joystick X axis 0 - 255, 128 is mid + u8 LeftStickY; // left Joystick Y axis 0 - 255, 128 is mid + u8 RightStickX; // right Joystick X axis 0 - 255, 128 is mid + u8 RightStickY; // right Joystick Y axis 0 - 255, 128 is mid + u8 Reserved2[4]; // Unknown + u8 PressureUp; // digital Pad Up button Pressure 0 - 255 + u8 PressureRight; // digital Pad Right button Pressure 0 - 255 + u8 PressureDown; // digital Pad Down button Pressure 0 - 255 + u8 PressureLeft; // digital Pad Left button Pressure 0 - 255 + u8 PressureL2; // digital Pad L2 button Pressure 0 - 255 + u8 PressureR2; // digital Pad R2 button Pressure 0 - 255 + u8 PressureL1; // digital Pad L1 button Pressure 0 - 255 + u8 PressureR1; // digital Pad R1 button Pressure 0 - 255 + u8 PressureTriangle; // digital Pad Triangle button Pressure 0 - 255 + u8 PressureCircle; // digital Pad Circle button Pressure 0 - 255 + u8 PressureCross; // digital Pad Cross button Pressure 0 - 255 + u8 PressureSquare; // digital Pad Square button Pressure 0 - 255 + u8 Reserved3[3]; // Unknown + u8 Charge; // charging status ? 02 = charge, 03 = normal + u8 Power; // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging + u8 Connection; // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble + u8 Reserved4[9]; // Unknown + s16 AccelX; + s16 AccelY; + s16 AccelZ; + s16 GyroZ; + +} __attribute__((packed)); + +struct ds4report { + u8 ReportID; + u8 LeftStickX; // left Joystick X axis 0 - 255, 128 is mid + u8 LeftStickY; // left Joystick Y axis 0 - 255, 128 is mid + u8 RightStickX; // right Joystick X axis 0 - 255, 128 is mid + u8 RightStickY; // right Joystick Y axis 0 - 255, 128 is mid + u8 Dpad : 4; // hat format, 0x08 is released, 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW + u8 Square : 1; + u8 Cross : 1; + u8 Circle : 1; + u8 Triangle : 1; + u8 L1 : 1; + u8 R1 : 1; + u8 L2 : 1; + u8 R2 : 1; + u8 Share : 1; + u8 Option : 1; + u8 L3 : 1; + u8 R3 : 1; + u8 PSButton : 1; + u8 TPad : 1; + u8 Counter1 : 6; // counts up by 1 per report + u8 PressureL2; // digital Pad L2 button Pressure 0 - 255 + u8 PressureR2; // digital Pad R2 button Pressure 0 - 255 + u8 Counter2; + u8 Counter3; + u8 Battery; // battery level from 0x00 to 0xff + s16 AccelX; + s16 AccelY; + s16 AccelZ; + s16 GyroZ; + s16 GyroY; + s16 GyroX; + u8 Reserved1[5]; // Unknown + u8 Power : 4; // from 0x0 to 0xA - charging, 0xB - charged + u8 Usb_plugged : 1; + u8 Headphones : 1; + u8 Microphone : 1; + u8 Padding : 1; + u8 Reserved2[2]; // Unknown + u8 TPpack; // number of trackpad packets (0x00 to 0x04) + u8 PackCounter; // packet counter + u8 Finger1ID : 7; // counter + u8 Finger1Active : 1; // 0 - active, 1 - unactive + u16 Finger1X : 12; // finger 1 coordinates resolution 1920x943 + u16 Finger1Y : 12; + u8 Finger2ID : 7; + u8 Finger2Active : 1; + u16 Finger2X : 12; // finger 2 coordinates resolution 1920x943 + u16 Finger2Y : 12; + +} __attribute__((packed)); + +int ds34usb_init(u8 pads, u8 options); +int ds34usb_get_status(int port); +void ds34usb_reset(); +int ds34usb_get_data(u8 *dst, int size, int port); +void ds34usb_set_rumble(u8 lrum, u8 rrum, int port); +void ds34usb_set_mode(int mode, int lock, int port); + +#endif diff --git a/modules/pademu/ds3bt.c b/modules/pademu/ds3bt.c deleted file mode 100644 index 201486fda..000000000 --- a/modules/pademu/ds3bt.c +++ /dev/null @@ -1,1590 +0,0 @@ - -/* bt code ported from: https://github.com/IonAgorria/Arduino-PSRemote see README */ -/* usb code based on usbhdfsd module from ps2sdk */ - -#include "types.h" -#include "ioman.h" -#include "intrman.h" -#include "loadcore.h" -#include "stdio.h" -#include "sifcmd.h" -#include "sifrpc.h" -#include "sysclib.h" -#include "sysmem.h" -#include "usbd.h" -#include "usbd_macro.h" -#include "thbase.h" -#include "thevent.h" -#include "thsemap.h" -#include "sifman.h" -#include "vblank.h" -#include "ds3bt.h" -#include "sys_utils.h" - -//#define DPRINTF(x...) printf(x) -#define DPRINTF(x...) - -#define USB_CLASS_WIRELESS_CONTROLLER 0xE0 -#define USB_SUBCLASS_RF_CONTROLLER 0x01 -#define USB_PROTOCOL_BLUETOOTH_PROG 0x01 - -int bt_probe(int devId); -int bt_connect(int devId); -int bt_disconnect(int devId); - -UsbDriver bt_driver = {NULL, NULL, "ds3bt", bt_probe, bt_connect, bt_disconnect}; - -typedef struct _bt_dev -{ - int devId; - int hci_sema; - int l2cap_sema; - int l2cap_cmd_sema; - int controlEndp; - int eventEndp; - int inEndp; - int outEndp; - uint8_t status; -} bt_device; - -bt_device bt_dev = {-1, -1, -1, -1, -1, -1, -1, -1, DS3BT_STATE_USB_DISCONNECTED}; - -static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint); -static void bt_config_set(int result, int count, void *arg); -static void bt_release(); - -int bt_probe(int devId) -{ - UsbDeviceDescriptor *device = NULL; - UsbConfigDescriptor *config = NULL; - UsbInterfaceDescriptor *intf = NULL; - - DPRINTF("DS3BT: probe: devId=%i\n", devId); - - if ((bt_dev.devId > 0) && (bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) { - DPRINTF("DS3BT: Error - only one device allowed !\n"); - return 0; - } - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - if (device == NULL) { - DPRINTF("DS3BT: Error - Couldn't get device descriptor\n"); - return 0; - } - - if (device->bNumConfigurations < 1) - return 0; - - config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); - if (config == NULL) { - DPRINTF("BT: Error - Couldn't get configuration descriptor\n"); - return 0; - } - - if ((config->bNumInterfaces < 1) || (config->wTotalLength < (sizeof(UsbConfigDescriptor) + sizeof(UsbInterfaceDescriptor)))) { - DPRINTF("DS3BT: Error - No interfaces available\n"); - return 0; - } - - intf = (UsbInterfaceDescriptor *)((char *)config + config->bLength); - - DPRINTF("DS3BT: bInterfaceClass %X bInterfaceSubClass %X bInterfaceProtocol %X\n", - intf->bInterfaceClass, intf->bInterfaceSubClass, intf->bInterfaceProtocol); - - if ((intf->bInterfaceClass != USB_CLASS_WIRELESS_CONTROLLER) || - (intf->bInterfaceSubClass != USB_SUBCLASS_RF_CONTROLLER) || - (intf->bInterfaceProtocol != USB_PROTOCOL_BLUETOOTH_PROG) || - (intf->bNumEndpoints < 3)) { - return 0; - } - - return 1; -} - -int bt_connect(int devId) -{ - int i; - int epCount; - UsbDeviceDescriptor *device; - UsbConfigDescriptor *config; - UsbInterfaceDescriptor *interface; - UsbEndpointDescriptor *endpoint; - iop_sema_t SemaData; - - DPRINTF("DS3BT: connect: devId=%i\n", devId); - - if (bt_dev.devId != -1) { - DPRINTF("DS3BT: Error - only one device allowed !\n"); - return 1; - } - - bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; - - bt_dev.eventEndp = -1; - bt_dev.inEndp = -1; - bt_dev.outEndp = -1; - - bt_dev.controlEndp = UsbOpenEndpoint(devId, NULL); - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - - config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); - - interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); - - epCount = interface->bNumEndpoints; - - DPRINTF("DS3BT: Endpoint Count %d \n", epCount); - - endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); - usb_probeEndpoint(devId, endpoint); - - for (i = 1; i < epCount; i++) { - endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); - usb_probeEndpoint(devId, endpoint); - } - - if (bt_dev.eventEndp < 0 || bt_dev.inEndp < 0 || bt_dev.outEndp < 0) { - bt_release(); - DPRINTF("DS3BT: Error - connect failed: not enough endpoints! \n"); - return -1; - } - - SemaData.initial = 1; - SemaData.max = 1; - SemaData.option = 0; - SemaData.attr = 0; - - if ((bt_dev.hci_sema = CreateSema(&SemaData)) < 0) { - DPRINTF("DS3BT: Failed to allocate I/O semaphore.\n"); - return -1; - } - - if ((bt_dev.l2cap_sema = CreateSema(&SemaData)) < 0) { - DPRINTF("DS3BT: Failed to allocate I/O semaphore.\n"); - return -1; - } - - if ((bt_dev.l2cap_cmd_sema = CreateSema(&SemaData)) < 0) { - DPRINTF("DS3BT: Failed to allocate I/O semaphore.\n"); - return -1; - } - - bt_dev.devId = devId; - - bt_dev.status = DS3BT_STATE_USB_AUTHORIZED; - - UsbSetDeviceConfiguration(bt_dev.controlEndp, config->bConfigurationValue, bt_config_set, NULL); - - return 0; -} - -int bt_disconnect(int devId) -{ - DPRINTF("DS3BT: disconnect: devId=%i\n", devId); - - if (bt_dev.status & DS3BT_STATE_USB_AUTHORIZED) { - if (bt_dev.eventEndp >= 0) - UsbCloseEndpoint(bt_dev.eventEndp); - - if (bt_dev.inEndp >= 0) - UsbCloseEndpoint(bt_dev.inEndp); - - if (bt_dev.outEndp >= 0) - UsbCloseEndpoint(bt_dev.outEndp); - - bt_release(); - } - - return 0; -} - -static void bt_release() -{ - DeleteSema(bt_dev.hci_sema); - DeleteSema(bt_dev.l2cap_sema); - DeleteSema(bt_dev.l2cap_cmd_sema); - - bt_dev.devId = -1; - bt_dev.eventEndp = -1; - bt_dev.inEndp = -1; - bt_dev.outEndp = -1; - bt_dev.controlEndp = -1; - bt_dev.status = DS3BT_STATE_USB_DISCONNECTED; -} - -static void usb_probeEndpoint(int devId, UsbEndpointDescriptor *endpoint) -{ - if (endpoint->bmAttributes == USB_ENDPOINT_XFER_BULK) { - if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && bt_dev.outEndp < 0) { - bt_dev.outEndp = UsbOpenEndpointAligned(devId, endpoint); - DPRINTF("DS3BT: register Output endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.outEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - } else if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.inEndp < 0) { - bt_dev.inEndp = UsbOpenEndpointAligned(devId, endpoint); - DPRINTF("DS3BT: register Input endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.inEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - } - } else if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { - if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && bt_dev.eventEndp < 0) { - bt_dev.eventEndp = UsbOpenEndpoint(devId, endpoint); - DPRINTF("DS3BT: register Event endpoint id =%i addr=%02X packetSize=%i\n", bt_dev.eventEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - } - } -} - -static int chrg_dev = -1; -static int chrg_end = -1; - -int chrg_probe(int devId) -{ - UsbDeviceDescriptor *device = NULL; - - DPRINTF("CHRG: probe: devId=%i\n", devId); - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - if (device == NULL) { - DPRINTF("CHRG: Error - Couldn't get device descriptor\n"); - return 0; - } - - if (device->idVendor == 0x054C && device->idProduct == 0x0268) - return 1; - - return 0; -} - -int chrg_connect(int devId) -{ - UsbDeviceDescriptor *device; - UsbConfigDescriptor *config; - - DPRINTF("CHRG: connect: devId=%i\n", devId); - - if (chrg_dev != -1) { - DPRINTF("CHRG: Error - only one device allowed !\n"); - return 1; - } - - chrg_dev = devId; - - chrg_end = UsbOpenEndpoint(devId, NULL); - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); - - UsbSetDeviceConfiguration(chrg_end, config->bConfigurationValue, NULL, NULL); - - return 0; -} - -int chrg_disconnect(int devId) -{ - DPRINTF("CHRG: disconnect: devId=%i\n", devId); - - if (chrg_dev == devId) { - if (chrg_end >= 0) - UsbCloseEndpoint(chrg_end); - - chrg_dev = -1; - chrg_end = -1; - } - - return 0; -} - -UsbDriver chrg_driver = {NULL, NULL, "chrg", chrg_probe, chrg_connect, chrg_disconnect}; - -/* PS Remote Reports */ -static uint8_t feature_F4_report[] = - { - 0x42, 0x03, 0x00, 0x00}; - -static uint8_t output_01_report[] = - { - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00}; - -static uint8_t led_patterns[][2] = - { - {0x1C, 0x02}, - {0x1A, 0x04}, - {0x16, 0x08}, - {0x0E, 0x10}, -}; - -static uint8_t power_level[] = - { - 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; - -// Taken from nefarius' SCPToolkit -// https://github.com/nefarius/ScpToolkit/blob/master/ScpControl/ScpControl.ini -// Valid MAC addresses used by Sony -static uint8_t GenuineMacAddress[][3] = - { - // Bluetooth chips by ALPS ELECTRIC CO., LTD - {0x00, 0x02, 0xC7}, - {0x00, 0x06, 0xF5}, - {0x00, 0x06, 0xF7}, - {0x00, 0x07, 0x04}, - {0x00, 0x16, 0xFE}, - {0x00, 0x19, 0xC1}, - {0x00, 0x1B, 0xFB}, - {0x00, 0x1E, 0x3D}, - {0x00, 0x21, 0x4F}, - {0x00, 0x23, 0x06}, - {0x00, 0x24, 0x33}, - {0x00, 0x26, 0x43}, - {0x00, 0xA0, 0x79}, - {0x04, 0x76, 0x6E}, - {0x04, 0x98, 0xF3}, - {0x28, 0xA1, 0x83}, - {0x34, 0xC7, 0x31}, - {0x38, 0xC0, 0x96}, - {0x60, 0x38, 0x0E}, - {0x64, 0xD4, 0xBD}, - {0xAC, 0x7A, 0x4D}, - {0xE0, 0x75, 0x0A}, - {0xE0, 0xAE, 0x5E}, - {0xFC, 0x62, 0xB9}, - // Bluetooth chips by AzureWave Technology Inc. - {0xE0, 0xB9, 0xA5}, - {0xDC, 0x85, 0xDE}, - {0xD0, 0xE7, 0x82}, - {0xB0, 0xEE, 0x45}, - {0xAC, 0x89, 0x95}, - {0xA8, 0x1D, 0x16}, - {0x94, 0xDB, 0xC9}, - {0x80, 0xD2, 0x1D}, - {0x80, 0xA5, 0x89}, - {0x78, 0x18, 0x81}, - {0x74, 0xF0, 0x6D}, - {0x74, 0xC6, 0x3B}, - {0x74, 0x2F, 0x68}, - {0x6C, 0xAD, 0xF8}, - {0x6C, 0x71, 0xD9}, - {0x60, 0x5B, 0xB4}, - {0x5C, 0x96, 0x56}, - {0x54, 0x27, 0x1E}, - {0x4C, 0xAA, 0x16}, - {0x48, 0x5D, 0x60}, - {0x44, 0xD8, 0x32}, - {0x40, 0xE2, 0x30}, - {0x38, 0x4F, 0xF0}, - {0x28, 0xC2, 0xDD}, - {0x24, 0x0A, 0x64}, - {0x1C, 0x4B, 0xD6}, - {0x08, 0xA9, 0x5A}, - {0x00, 0x25, 0xD3}, - {0x00, 0x24, 0x23}, - {0x00, 0x22, 0x43}, - {0x00, 0x15, 0xAF}, - //fake with AirohaTechnologyCorp's Chip - {0x0C, 0xFC, 0x83}}; - -/* variables used by high level HCI task */ -static uint16_t hci_counter_; // counter used for bluetooth HCI loops - -/* variables filled from HCI event management */ -static volatile uint8_t hci_event_flag_; // flag of received bluetooth events - -/* variables used by L2CAP */ -static volatile uint8_t l2cap_event_status_; -static uint8_t l2cap_txid_; // packet id increments for each packet sent -/* L2CAP CID name space: 0x0040-0xffff dynamically allocated */ -static uint16_t command_scid_; // Channel endpoint on command source -static uint16_t interrupt_scid_; // Channel endpoint on interrupt source - -/* variables used by Bluetooth HID */ -static uint8_t hid_flags_; -static uint8_t ds3bt_bdaddr_[6]; - -static uint8_t hci_reset(); -static uint8_t hci_write_scan_enable(uint8_t conf); -static uint8_t hci_accept_connection(uint8_t *bdaddr); -static uint8_t hci_reject_connection(uint8_t *bdaddr); -static uint8_t hci_disconnect(uint16_t handle); -static uint8_t hci_change_connection_type(uint8_t pad); -static uint8_t HCI_Command(uint16_t nbytes, uint8_t *dataptr); - -static uint8_t l2cap_connect_response(uint8_t rxid, uint16_t dcid, uint16_t scid, uint8_t pad); -static uint8_t l2cap_configure(uint16_t dcid, uint8_t pad); -static uint8_t l2cap_config_response(uint8_t rxid, uint16_t dcid, uint8_t pad); -static uint8_t l2cap_disconnect_response(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad); -static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad); - -static uint8_t initPSController(int pad); -static void readReport(uint8_t *data, int bytes, int pad); -static uint8_t writeReport(uint8_t *data, uint8_t length, int pad); - -static void HCI_task(uint8_t pad); -static void L2CAP_task(uint8_t pad); -static uint8_t HCI_event_task(int result); -static uint8_t L2CAP_event_task(int result, int bytes); - -static uint8_t hci_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; -static uint8_t l2cap_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; -static uint8_t hci_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; -static uint8_t l2cap_cmd_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; - -static void DS3BT_init(); -static int Rumble(uint8_t lrum, uint8_t rrum, int pad); -static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); - -static uint8_t current_pad; -static uint8_t enable_pad; -static uint8_t press_emu; - -typedef struct -{ - uint16_t hci_handle_; //connection handle - uint16_t command_dcid_; // Channel endpoint on command destination - uint16_t interrupt_dcid_; // Channel endpoint on interrupt destination - uint8_t hci_state_; // current state of bluetooth HCI connection - uint8_t l2cap_state_; // current state of L2CAP connection - uint8_t status_; - uint8_t oldled; - uint8_t oldlrumble; - uint8_t oldrrumble; - uint8_t enabled; - uint8_t type; - uint8_t data[18]; - uint8_t analog_btn; -} ds3bt_pad_t; - -#define MAX_PADS 2 - -ds3bt_pad_t ds3pad[MAX_PADS]; - -static void DS3BT_init() -{ - uint8_t i; - - l2cap_txid_ = 1; - command_scid_ = 0x0040; // L2CAP local CID for HID_Control - interrupt_scid_ = 0x0041; // L2CAP local CID for HID_Interrupt - - hid_flags_ = 0; - - for (i = 0; i < MAX_PADS; i++) { - ds3pad[i].hci_handle_ = 0x0FFF; - ds3pad[i].status_ = bt_dev.status; - ds3pad[i].status_ |= DS3BT_STATE_USB_CONFIGURED; - ds3pad[i].hci_state_ = HCI_RESET_STATE; - ds3pad[i].l2cap_state_ = L2CAP_DOWN_STATE; - - ds3pad[i].data[0] = 0xFF; - ds3pad[i].data[1] = 0xFF; - ds3pad[i].enabled = (enable_pad >> i) & 1; - ds3pad[i].type = 0; - - mips_memset(&ds3pad[i].data[2], 0x7F, 4); - mips_memset(&ds3pad[i].data[6], 0x00, 12); - ds3pad[i].analog_btn = 0; - } - - hci_counter_ = 10; - current_pad = 0; - press_emu = 0; - - hci_reset(); -} - -static void hci_event_cb(int resultCode, int bytes, void *arg) -{ - uint8_t pad; - - PollSema(bt_dev.hci_sema); - - //DPRINTF("hci_event_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - - pad = HCI_event_task(resultCode); - HCI_task(pad); - - SignalSema(bt_dev.hci_sema); - - UsbInterruptTransfer(bt_dev.eventEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, arg); -} - -static void l2cap_event_cb(int resultCode, int bytes, void *arg) -{ - int pad; - static uint8_t ret_ctr = 0; - - PollSema(bt_dev.l2cap_sema); - - //DPRINTF("l2cap_event_cb: res %d, bytes %d, arg %p\n", resultCode, bytes, arg); - - pad = L2CAP_event_task(resultCode, bytes); - L2CAP_task(pad); - - if (pad >= MAX_PADS) { - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); - return; - } - - if (ds3pad[pad].l2cap_state_ != L2CAP_READY_STATE) { //ds3 is connecting - DelayThread(14000); //fix for some bt adapters - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); - } else { //ds3 is running - if ((int)arg != -1 && pad != (int)arg && (int)arg < MAX_PADS) { //check if we get what was requested - if (ret_ctr == 20) { - ret_ctr = 0; - SignalSema(bt_dev.l2cap_sema); - } else { - ret_ctr++; - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, arg); //try again - } - } else { //we got what we wanted - SignalSema(bt_dev.l2cap_sema); - } - } -} - -static void l2cap_cmd_cb(int resultCode, int bytes, void *arg) -{ - //DPRINTF("l2cap_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - SignalSema(bt_dev.l2cap_cmd_sema); -} - -static void bt_config_set(int result, int count, void *arg) -{ - UsbInterruptTransfer(bt_dev.eventEndp, hci_buf, MAX_BUFFER_SIZE, hci_event_cb, NULL); - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); - - SignalSema(bt_dev.hci_sema); - SignalSema(bt_dev.l2cap_sema); - - DS3BT_init(); -} - -static uint8_t HCI_event_task(int result) -{ - uint8_t i, pad; - - pad = current_pad; - - if (!result) { - /* buf[0] = Event Code */ - /* buf[1] = Parameter Total Length */ - /* buf[n] = Event Parameters based on each event */ - DPRINTF("HCI event = 0x%x\n", hci_buf[0]); - switch (hci_buf[0]) { // switch on event type - case HCI_EVENT_COMMAND_COMPLETE: - hci_event_flag_ |= HCI_FLAG_COMMAND_COMPLETE; - - DPRINTF("Command OK = 0x%x", hci_buf[3]); - DPRINTF(" Returned = 0x%x\n", hci_buf[5]); - break; - - case HCI_EVENT_COMMAND_STATUS: - hci_event_flag_ |= HCI_FLAG_COMMAND_STATUS; - - if (hci_buf[2]) // show status on serial if not OK - { - DPRINTF("HCI Command Failed: \n"); - DPRINTF("\tStatus = %x\n", hci_buf[2]); - DPRINTF("\tCommand_OpCode(OGF) = %x\n", ((hci_buf[5] & 0xFC) >> 2)); - DPRINTF("\tCommand_OpCode(OCF) = %x%x\n", (hci_buf[5] & 0x03), hci_buf[4]); - } - - break; - - case HCI_EVENT_CONNECT_COMPLETE: - if (!hci_buf[2]) // check if connected OK - { - // store the handle for the ACL connection - ds3pad[pad].hci_handle_ = hci_buf[3] | ((hci_buf[4] & 0x0F) << 8); //pad = current_pad - - DPRINTF("HCI event Connect Complete = 0x%x\n", ds3pad[pad].hci_handle_); - hci_event_flag_ |= HCI_FLAG_CONNECT_COMPLETE; - } else { - DPRINTF("Error on Connect Complete = 0x%x\n", hci_buf[2]); - } - break; - - case HCI_EVENT_NUM_COMPLETED_PKT: - - DPRINTF("HCI Number Of Completed Packets Event: \n"); - DPRINTF("\tNumber_of_Handles = 0x%x\n", hci_buf[2]); - for (i = 0; i < hci_buf[2]; i++) { - DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[3 + i] | ((hci_buf[4 + i] & 0x0F) << 8))); - } - - if (hci_buf[2] == 1) { - for (i = 0; i < MAX_PADS; i++) //detect pad - { - if (ds3pad[i].hci_handle_ == (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))) { - pad = i; - break; - } - } - } - break; - - case HCI_EVENT_QOS_SETUP_COMPLETE: - break; - - case HCI_EVENT_DISCONN_COMPLETE: - hci_event_flag_ |= HCI_FLAG_DISCONN_COMPLETE; - DPRINTF("HCI Disconnection Complete Event: \n"); - DPRINTF("\tStatus = 0x%x\n", hci_buf[2]); - DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))); - DPRINTF("\tReason = 0x%x\n", hci_buf[5]); - - for (i = 0; i < MAX_PADS; i++) //detect pad - { - if (ds3pad[i].hci_handle_ == (hci_buf[3] | ((hci_buf[4] & 0x0F) << 8))) { - pad = i; - break; - } - } - - break; - - case HCI_EVENT_CONNECT_REQUEST: - hci_event_flag_ |= HCI_FLAG_INCOMING_REQUEST; - DPRINTF("Connection Requested by BD_ADDR: \n"); - for (i = 0; i < 6; i++) { - ds3bt_bdaddr_[i] = (unsigned char)hci_buf[2 + i]; - DPRINTF("%x", ds3bt_bdaddr_[i]); - if (i < 5) - DPRINTF(":"); - } - - DPRINTF(" LINK: 0x%x\n", hci_buf[11]); - - for (i = 0; i < MAX_PADS; i++) //find free slot - { - if (!(ds3pad[i].status_ & DS3BT_STATE_RUNNING) && ds3pad[i].enabled) { - if (ds3pad[i].status_ & DS3BT_STATE_CONNECTED) { - if (ds3pad[i].l2cap_state_ == L2CAP_DISCONNECT_STATE) //if we're waiting for hci disconnect event - continue; - else - hci_disconnect(ds3pad[i].hci_handle_); //try to disconnect - } - - current_pad = i; - break; - } - } - - if (i >= MAX_PADS) //no free slot - { - hci_reject_connection(ds3bt_bdaddr_); - current_pad = pad; - return MAX_PADS; - } - - pad = current_pad; - - ds3pad[pad].type = 0xA2; //fake ds3 - - for (i = 0; i < sizeof(GenuineMacAddress) / 3; i++) //check if ds3 is genuine - { - if (ds3bt_bdaddr_[5] == GenuineMacAddress[i][0] && - ds3bt_bdaddr_[4] == GenuineMacAddress[i][1] && - ds3bt_bdaddr_[3] == GenuineMacAddress[i][2]) { - ds3pad[pad].type = HID_THDR_SET_REPORT_OUTPUT; - break; - } - } - - ds3pad[pad].hci_state_ = HCI_CONNECT_IN_STATE; - ds3pad[pad].l2cap_state_ = L2CAP_INIT_STATE; - ds3pad[pad].status_ &= ~DS3BT_STATE_CONNECTED; - ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; - - l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONNECTED; - - break; - - case HCI_EVENT_ROLE_CHANGED: - - DPRINTF("Role Change STATUS: 0x%x\n", hci_buf[2]); - - DPRINTF(" BD_ADDR: "); - for (i = 0; i < 6; i++) { - DPRINTF("%x", (unsigned char)hci_buf[3 + i]); - if (i < 5) - DPRINTF(":"); - } - - DPRINTF(" ROLE: 0x%x\n", hci_buf[9]); - break; - - case HCI_EVENT_MAX_SLOT_CHANGE: - - DPRINTF("Max Slot Change: \n"); - DPRINTF("\tConnection_Handle = 0x%x\n", (hci_buf[2] | ((hci_buf[3] & 0x0F) << 8))); - DPRINTF("\tLMP Max Slots = 0x%x\n", hci_buf[5]); - break; - - case HCI_EVENT_CHANGED_CONNECTION_TYPE: - - DPRINTF("Packet Type Changed STATUS: 0x%x \n", hci_buf[2]); - DPRINTF(" TYPE: %x \n", (hci_buf[5] | (hci_buf[6] << 8))); - - break; - - case HCI_EVENT_PAGE_SR_CHANGED: - break; - - default: - DPRINTF("Unmanaged Event: 0x%x\n", hci_buf[0]); - break; - } // switch (buf[0]) - } - - return pad; -} - -static void HCI_task(uint8_t pad) -{ - int i; - - if (pad >= MAX_PADS) - return; - - switch (ds3pad[pad].hci_state_) { - case HCI_INIT_STATE: - // wait until we have looped 10 times to clear any old events - if (hci_timeout) { - for (i = 0; i < MAX_PADS; i++) { - if (ds3pad[i].status_ & DS3BT_STATE_RUNNING) - break; - } - - if (i == MAX_PADS) { - ds3pad[pad].hci_state_ = HCI_RESET_STATE; - hci_reset(); - } - - hci_counter_ = 10; - } - break; - - case HCI_RESET_STATE: - if (hci_command_complete) { - DPRINTF("HCI Reset complete\n"); - hci_write_scan_enable(SCAN_ENABLE_NOINQ_ENPAG); - ds3pad[pad].hci_state_ = HCI_CONNECT_IN_STATE; - hci_event_flag_ &= ~HCI_FLAG_INCOMING_REQUEST; - } - if (hci_timeout) { - DPRINTF("No response to HCI Reset\n"); - ds3pad[pad].hci_state_ = HCI_INIT_STATE; - hci_counter_ = 10; - } - break; - - case HCI_CONNECT_IN_STATE: - if (hci_incoming_connect_request) { - hci_accept_connection(ds3bt_bdaddr_); - DPRINTF("PS Remote Connected\n"); - ds3pad[pad].hci_state_ = HCI_CHANGE_CONNECTION; - hci_event_flag_ &= ~HCI_FLAG_CONNECT_COMPLETE; - } - break; - - case HCI_CHANGE_CONNECTION: - if (hci_connect_complete) { - hci_change_connection_type(pad); - - ds3pad[pad].hci_state_ = HCI_CONNECTED_STATE; - - ds3pad[pad].status_ |= DS3BT_STATE_CONNECTED; - hci_event_flag_ &= ~HCI_FLAG_DISCONN_COMPLETE; - } - break; - - case HCI_CONNECTED_STATE: - if (hci_disconn_complete) { - DPRINTF("PS Remote Disconnected pad %d\n", pad); - - hci_event_flag_ &= ~HCI_FLAG_DISCONN_COMPLETE; - - ds3pad[pad].status_ &= ~DS3BT_STATE_CONNECTED; - ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; - - hci_counter_ = 10; - - if (ds3pad[pad].type != HID_THDR_SET_REPORT_OUTPUT) { - ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; - for (i = 0; i < MAX_PADS; i++) { - if (ds3pad[i].status_ & DS3BT_STATE_RUNNING) - break; - } - - if (i == MAX_PADS) - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)-1); - } - - SignalSema(bt_dev.l2cap_sema); - } - break; - - default: - break; - } // switch (hci_state_) -} - -/************************************************************/ -/* HCI Commands */ -/************************************************************/ - -static uint8_t hci_reset() -{ - hci_event_flag_ = 0; // clear all the flags - - hci_cmd_buf[0] = HCI_OCF_RESET; - hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; - hci_cmd_buf[2] = 0x00; // Parameter Total Length = 0 - - return HCI_Command(3, hci_cmd_buf); -} - -static uint8_t hci_write_scan_enable(uint8_t conf) -{ - hci_event_flag_ &= ~HCI_FLAG_COMMAND_COMPLETE; - - hci_cmd_buf[0] = HCI_OCF_WRITE_SCAN_ENABLE; - hci_cmd_buf[1] = HCI_OGF_CTRL_BBAND; - hci_cmd_buf[2] = 0x01; - hci_cmd_buf[3] = conf; - return HCI_Command(4, hci_cmd_buf); -} - -static uint8_t hci_accept_connection(uint8_t *bdaddr) -{ - hci_event_flag_ &= ~(HCI_FLAG_INCOMING_REQUEST); - - hci_cmd_buf[0] = HCI_OCF_ACCEPT_CONNECTION; // HCI OCF = 9 - hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 - hci_cmd_buf[2] = 0x07; // parameter length 7 - hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address - hci_cmd_buf[4] = *(bdaddr + 1); - hci_cmd_buf[5] = *(bdaddr + 2); - hci_cmd_buf[6] = *(bdaddr + 3); - hci_cmd_buf[7] = *(bdaddr + 4); - hci_cmd_buf[8] = *(bdaddr + 5); - hci_cmd_buf[9] = 1; //switch role to slave - - return HCI_Command(10, hci_cmd_buf); -} - -static uint8_t hci_reject_connection(uint8_t *bdaddr) -{ - hci_event_flag_ &= ~(HCI_FLAG_INCOMING_REQUEST); - - hci_cmd_buf[0] = HCI_OCF_REJECT_CONNECTION; // HCI OCF = A - hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 - hci_cmd_buf[2] = 0x07; // parameter length 7 - hci_cmd_buf[3] = *bdaddr; // 6 octet bluetooth address - hci_cmd_buf[4] = *(bdaddr + 1); - hci_cmd_buf[5] = *(bdaddr + 2); - hci_cmd_buf[6] = *(bdaddr + 3); - hci_cmd_buf[7] = *(bdaddr + 4); - hci_cmd_buf[8] = *(bdaddr + 5); - hci_cmd_buf[9] = 0x09; //reason max connection - - return HCI_Command(10, hci_cmd_buf); -} - -static uint8_t hci_disconnect(uint16_t handle) -{ - hci_cmd_buf[0] = 0x06; // HCI OCF = 6 - hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; // HCI OGF = 1 - hci_cmd_buf[2] = 0x03; // parameter length = 3 - hci_cmd_buf[3] = (uint8_t)(handle & 0xFF); //connection handle - low byte - hci_cmd_buf[4] = (uint8_t)((handle >> 8) & 0x0F); //connection handle - high byte - hci_cmd_buf[5] = 0x13; // reason - - return HCI_Command(6, hci_cmd_buf); -} - -static uint8_t hci_change_connection_type(uint8_t pad) -{ - hci_event_flag_ &= ~HCI_FLAG_COMMAND_COMPLETE; - - hci_cmd_buf[0] = HCI_OCF_CHANGE_CONNECTION_TYPE; - hci_cmd_buf[1] = HCI_OGF_LINK_CNTRL; - hci_cmd_buf[2] = 0x04; // parameter length 4 - hci_cmd_buf[3] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag - hci_cmd_buf[4] = (uint8_t)(ds3pad[pad].hci_handle_ >> 8); - hci_cmd_buf[5] = 0x18; // Packet Type: 0xcc18 - hci_cmd_buf[6] = 0xcc; - - return HCI_Command(7, hci_cmd_buf); -} -/* perform HCI Command */ -static uint8_t HCI_Command(uint16_t nbytes, uint8_t *dataptr) -{ - return UsbControlTransfer(bt_dev.controlEndp, bmREQ_HCI_OUT, HCI_COMMAND_REQ, 0, 0, nbytes, dataptr, NULL, NULL); -} - -static uint8_t L2CAP_event_task(int result, int bytes) -{ - uint8_t pad = 0xFF; - - if (!result) { - for (pad = 0; pad < MAX_PADS; pad++) { - if (acl_handle_ok(ds3pad[pad].hci_handle_)) - break; - } - - if (pad >= MAX_PADS) { - DPRINTF("L2CAP Wrong Handle = 0x%x\n", ((l2cap_buf[0] | (l2cap_buf[1] << 8)) & 0x0FFF)); - return pad; - } - - if (acl_handle_ok(ds3pad[pad].hci_handle_)) { - if (l2cap_control) { - DPRINTF("L2CAP Signaling Command = 0x%x pad %d\n", l2cap_buf[8], pad); - if (l2cap_command_reject) { - DPRINTF("ID = 0x%x", l2cap_buf[9]); - DPRINTF(" Reason = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); - DPRINTF(" DATA = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); - } else if (l2cap_connection_request) { - DPRINTF("Connection Request ID = 0x%x", l2cap_buf[9]); - DPRINTF(" PSM = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); - DPRINTF(" SCID = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); - - if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_WRITE) { - ds3pad[pad].command_dcid_ = l2cap_buf[14] | (l2cap_buf[15] << 8); - l2cap_connect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); - l2cap_event_status_ |= L2CAP_EV_COMMAND_CONNECTED; - } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == L2CAP_PSM_READ) { - ds3pad[pad].interrupt_dcid_ = l2cap_buf[14] | (l2cap_buf[15] << 8); - l2cap_connect_response(l2cap_buf[9], interrupt_scid_, ds3pad[pad].interrupt_dcid_, pad); - l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONNECTED; - } - } else if (l2cap_configuration_request) { - - DPRINTF("Conf Request ID = 0x%x\n", l2cap_buf[9]); - DPRINTF(" LEN = 0x%x", (l2cap_buf[10] | (l2cap_buf[11] << 8))); - DPRINTF(" SCID = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); - DPRINTF(" FLAG = 0x%x\n", (l2cap_buf[14] | (l2cap_buf[15] << 8))); - - if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { - l2cap_event_status_ |= L2CAP_EV_COMMAND_CONFIG_REQ; - l2cap_config_response(l2cap_buf[9], ds3pad[pad].command_dcid_, pad); - } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { - l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONFIG_REQ; - l2cap_config_response(l2cap_buf[9], ds3pad[pad].interrupt_dcid_, pad); - } - } else if (l2cap_configuration_response) { - - DPRINTF("Conf Response ID = 0x%x\n", l2cap_buf[9]); - DPRINTF(" LEN = 0x%x", (l2cap_buf[10] | (l2cap_buf[11] << 8))); - DPRINTF(" SCID = 0x%x", (l2cap_buf[12] | (l2cap_buf[13] << 8))); - DPRINTF(" FLAG = 0x%x", (l2cap_buf[14] | (l2cap_buf[15] << 8))); - DPRINTF(" RESULT = 0x%x\n", (l2cap_buf[16] | (l2cap_buf[17] << 8))); - - if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { - l2cap_event_status_ |= L2CAP_EV_COMMAND_CONFIGURED; - } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { - l2cap_event_status_ |= L2CAP_EV_INTERRUPT_CONFIGURED; - } - } else if (l2cap_disconnect_request) { - DPRINTF("Disconnect Req SCID = 0x%x\n", (l2cap_buf[12] | (l2cap_buf[13] << 8))); - - ds3pad[pad].l2cap_state_ = L2CAP_DISCONNECT_STATE; - - if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == command_scid_) { - l2cap_event_status_ |= L2CAP_EV_COMMAND_DISCONNECT_REQ; - l2cap_disconnect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); - } else if ((l2cap_buf[12] | (l2cap_buf[13] << 8)) == interrupt_scid_) { - l2cap_event_status_ |= L2CAP_EV_INTERRUPT_DISCONNECT_REQ; - l2cap_disconnect_response(l2cap_buf[9], command_scid_, ds3pad[pad].command_dcid_, pad); - } - } - } else if (l2cap_interrupt) { - readReport(l2cap_buf, bytes, pad); - } else if (l2cap_command) { - if (hid_handshake_success) { - hid_flags_ |= HID_FLAG_COMMAND_SUCCESS; - } - } - } // acl_handle_ok - } // !rcode - - return pad; -} - -static void L2CAP_task(uint8_t pad) -{ - if (pad >= MAX_PADS) - return; - - switch (ds3pad[pad].l2cap_state_) { - case L2CAP_INIT_STATE: - DPRINTF("L2CAP_I\n"); - l2cap_event_status_ &= ~L2CAP_EV_COMMAND_DISCONNECT_REQ; - l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_DISCONNECT_REQ; - ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_CONNECTING_STATE; - - case L2CAP_CONTROL_CONNECTING_STATE: - DPRINTF("L2CAP_C1 \n"); - if (l2cap_command_connected) { - l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONFIG_REQ; - ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_REQUEST_STATE; - } - break; - - case L2CAP_CONTROL_REQUEST_STATE: - DPRINTF("L2CAP_C2\n"); - if (l2cap_command_request) { - l2cap_event_status_ &= ~L2CAP_EV_COMMAND_CONFIGURED; - l2cap_configure(ds3pad[pad].command_dcid_, pad); - ds3pad[pad].l2cap_state_ = L2CAP_CONTROL_CONFIGURING_STATE; - } - break; - - case L2CAP_CONTROL_CONFIGURING_STATE: - DPRINTF("L2CAP_C3\n"); - if (l2cap_command_configured) { - l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONNECTED; - ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_CONNECTING_STATE; - } - break; - - case L2CAP_INTERRUPT_CONNECTING_STATE: - DPRINTF("L2CAP_I1\n"); - if (l2cap_interrupt_connected) { - l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONFIG_REQ; - l2cap_event_status_ &= ~L2CAP_EV_INTERRUPT_CONFIGURED; - ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_REQUEST_STATE; - } - break; - - case L2CAP_INTERRUPT_REQUEST_STATE: - DPRINTF("L2CAP_I2\n"); - if (l2cap_interrupt_request) { - l2cap_configure(ds3pad[pad].interrupt_dcid_, pad); - ds3pad[pad].l2cap_state_ = L2CAP_INTERRUPT_CONFIGURING_STATE; - } - break; - - case L2CAP_INTERRUPT_CONFIGURING_STATE: - DPRINTF("L2CAP_I3\n"); - if (l2cap_interrupt_configured) { - ds3pad[pad].l2cap_state_ = L2CAP_CONNECTED_STATE; - } else - break; - - /* Established L2CAP */ - case L2CAP_CONNECTED_STATE: - DPRINTF("L2CAP_S\n"); - hid_flags_ = 0; - - initPSController(pad); - ds3pad[pad].l2cap_state_ = L2CAP_LED_STATE; - break; - - case L2CAP_LED_STATE: - DPRINTF("L2CAP_LED\n"); - if (hid_command_success) { - if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { - ds3pad[pad].l2cap_state_ = L2CAP_LED_STATE_END; - } else { - ds3pad[pad].l2cap_state_ = L2CAP_READY_STATE; - ds3pad[pad].status_ |= DS3BT_STATE_RUNNING; - } - LEDRumble((pad + 1) << 1, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); - } - break; - - case L2CAP_LED_STATE_END: - DPRINTF("L2CAP_LED_END\n"); - if (hid_command_success) { - ds3pad[pad].l2cap_state_ = L2CAP_READY_STATE; - ds3pad[pad].status_ |= DS3BT_STATE_RUNNING; - } - break; - - case L2CAP_READY_STATE: - break; - - case L2CAP_DISCONNECT_STATE: - DPRINTF("L2CAP_D\n"); - if (l2cap_interrupt_disconnected || l2cap_command_disconnected) { - ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; - } - break; - - default: - break; - } -} - -/************************************************************/ -/* L2CAP Commands */ -/************************************************************/ -static uint8_t l2cap_connect_response(uint8_t rxid, uint16_t dcid, uint16_t scid, uint8_t pad) -{ - uint8_t cmd_buf[12]; - - cmd_buf[0] = L2CAP_CMD_CONNECTION_RESPONSE; // Code - cmd_buf[1] = rxid; // Identifier - cmd_buf[2] = 0x08; // Length - cmd_buf[3] = 0x00; - cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID (Our) - cmd_buf[5] = (uint8_t)(dcid >> 8); - cmd_buf[6] = (uint8_t)(scid & 0xff); // Source CID (PS Remote) - cmd_buf[7] = (uint8_t)(scid >> 8); - cmd_buf[8] = 0x00; // Result - cmd_buf[9] = 0x00; - cmd_buf[10] = 0x00; // Status - cmd_buf[11] = 0x00; - - return L2CAP_Command((uint8_t *)cmd_buf, 12, pad); -} - -static uint8_t l2cap_configure(uint16_t dcid, uint8_t pad) -{ - uint8_t cmd_buf[12]; - - cmd_buf[0] = L2CAP_CMD_CONFIG_REQUEST; // Code - cmd_buf[1] = (uint8_t)(l2cap_txid_++); // Identifier - cmd_buf[2] = 0x08; // Length - cmd_buf[3] = 0x00; - cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID - cmd_buf[5] = (uint8_t)(dcid >> 8); - cmd_buf[6] = 0x00; // Flags - cmd_buf[7] = 0x00; - cmd_buf[8] = 0x01; // Config Opt: type = MTU (Maximum Transmission Unit) - cmd_buf[9] = 0x02; // Config Opt: length - cmd_buf[10] = 0x40; // Config Opt: data = maximum SDU size is 672 octets - cmd_buf[11] = 0x00; - - return L2CAP_Command((uint8_t *)cmd_buf, 12, pad); -} - -static uint8_t l2cap_config_response(uint8_t rxid, uint16_t dcid, uint8_t pad) -{ - uint8_t cmd_buf[10]; - - cmd_buf[0] = L2CAP_CMD_CONFIG_RESPONSE; // Code - cmd_buf[1] = rxid; // Identifier - cmd_buf[2] = 0x06; // Length - cmd_buf[3] = 0x00; - cmd_buf[4] = (uint8_t)(dcid & 0xff); // Source CID - cmd_buf[5] = (uint8_t)(dcid >> 8); - cmd_buf[6] = 0x00; // Result - cmd_buf[7] = 0x00; - cmd_buf[8] = 0x00; // Config - cmd_buf[9] = 0x00; - - return L2CAP_Command((uint8_t *)cmd_buf, 10, pad); -} - -static uint8_t l2cap_disconnect_response(uint8_t rxid, uint16_t scid, uint16_t dcid, uint8_t pad) -{ - uint8_t cmd_buf[8]; - - cmd_buf[0] = L2CAP_CMD_DISCONNECT_RESPONSE; // Code - cmd_buf[1] = rxid; // Identifier - cmd_buf[2] = 0x04; // Length - cmd_buf[3] = 0x00; - cmd_buf[4] = (uint8_t)(dcid & 0xff); // Destination CID - cmd_buf[5] = (uint8_t)(dcid >> 8); - cmd_buf[6] = (uint8_t)(scid & 0xff); // Source CID - cmd_buf[7] = (uint8_t)(scid >> 8); - - return L2CAP_Command((uint8_t *)cmd_buf, 8, pad); -} - -static uint8_t L2CAP_Command(uint8_t *data, uint8_t length, uint8_t pad) -{ - PollSema(bt_dev.l2cap_cmd_sema); - - l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag - l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); - l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length - l2cap_cmd_buf[3] = (uint8_t)((4 + length) >> 8); - l2cap_cmd_buf[4] = (uint8_t)(length & 0xff); // L2CAP header: Length - l2cap_cmd_buf[5] = (uint8_t)(length >> 8); - l2cap_cmd_buf[6] = 0x01; // L2CAP header: Channel ID - l2cap_cmd_buf[7] = 0x00; // L2CAP Signalling channel over ACL-U logical link - - mips_memcpy(&l2cap_cmd_buf[8], data, length); - - // output on endpoint 2 - return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), l2cap_cmd_cb, NULL); -} - -/************************************************************/ -/* HID Commands */ -/************************************************************/ - -static uint8_t initPSController(int pad) -{ - uint8_t init_buf[2 + PS3_F4_REPORT_LEN]; - uint8_t i; - init_buf[0] = HID_THDR_SET_REPORT_FEATURE; // THdr - init_buf[1] = PS3_F4_REPORT_ID; // Report ID - - for (i = 0; i < PS3_F4_REPORT_LEN; i++) { - init_buf[2 + i] = (uint8_t)feature_F4_report[i]; - } - - return writeReport((uint8_t *)init_buf, 2 + PS3_F4_REPORT_LEN, pad); -} - -#define DATA_START 11 -#define MAX_DELAY 10 - -static uint8_t btn_delay = 0; - -static void readReport(uint8_t *data, int bytes, int pad) -{ - if (hid_input_report) { - ds3pad[pad].data[0] = ~data[DATA_START + ButtonStateL]; - ds3pad[pad].data[1] = ~data[DATA_START + ButtonStateH]; - - ds3pad[pad].data[2] = data[DATA_START + RightStickX]; //rx - ds3pad[pad].data[3] = data[DATA_START + RightStickY]; //ry - ds3pad[pad].data[4] = data[DATA_START + LeftStickX]; //lx - ds3pad[pad].data[5] = data[DATA_START + LeftStickY]; //ly - - if (bytes == 21 && !press_emu) - press_emu = 1; - - if (press_emu) //needs emulating pressure buttons - { - ds3pad[pad].data[6] = ((data[DATA_START + ButtonStateL] >> 5) & 1) * 255; //right - ds3pad[pad].data[7] = ((data[DATA_START + ButtonStateL] >> 7) & 1) * 255; //left - ds3pad[pad].data[8] = ((data[DATA_START + ButtonStateL] >> 4) & 1) * 255; //up - ds3pad[pad].data[9] = ((data[DATA_START + ButtonStateL] >> 6) & 1) * 255; //down - - ds3pad[pad].data[10] = ((data[DATA_START + ButtonStateH] >> 4) & 1) * 255; //triangle - ds3pad[pad].data[11] = ((data[DATA_START + ButtonStateH] >> 5) & 1) * 255; //circle - ds3pad[pad].data[12] = ((data[DATA_START + ButtonStateH] >> 6) & 1) * 255; //cross - ds3pad[pad].data[13] = ((data[DATA_START + ButtonStateH] >> 7) & 1) * 255; //square - - ds3pad[pad].data[14] = ((data[DATA_START + ButtonStateH] >> 2) & 1) * 255; //L1 - ds3pad[pad].data[15] = ((data[DATA_START + ButtonStateH] >> 3) & 1) * 255; //R1 - ds3pad[pad].data[16] = ((data[DATA_START + ButtonStateH] >> 0) & 1) * 255; //L2 - ds3pad[pad].data[17] = ((data[DATA_START + ButtonStateH] >> 1) & 1) * 255; //R2 - - data[DATA_START + Power] = 0x05; - } else { - ds3pad[pad].data[6] = data[DATA_START + PressureRight]; //right - ds3pad[pad].data[7] = data[DATA_START + PressureLeft]; //left - ds3pad[pad].data[8] = data[DATA_START + PressureUp]; //up - ds3pad[pad].data[9] = data[DATA_START + PressureDown]; //down - - ds3pad[pad].data[10] = data[DATA_START + PressureTriangle]; //triangle - ds3pad[pad].data[11] = data[DATA_START + PressureCircle]; //circle - ds3pad[pad].data[12] = data[DATA_START + PressureCross]; //cross - ds3pad[pad].data[13] = data[DATA_START + PressureSquare]; //square - - ds3pad[pad].data[14] = data[DATA_START + PressureL1]; //L1 - ds3pad[pad].data[15] = data[DATA_START + PressureR1]; //R1 - ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 - ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 - } - - if (data[DATA_START + PSButtonState]) { //display battery level - if ((data[DATA_START + ButtonStateL] & 1) && (btn_delay == MAX_DELAY)) { //PS + SELECT - if (ds3pad[pad].analog_btn < 2) //unlocked mode - ds3pad[pad].analog_btn = !ds3pad[pad].analog_btn; - - ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; - btn_delay = 0; - } else if (data[DATA_START + Power] != 0xEE) - ds3pad[pad].oldled = power_level[data[DATA_START + Power]]; - - if (btn_delay < MAX_DELAY) - btn_delay++; - } else - ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; - - if (data[DATA_START + Power] == 0xEE) //charging - ds3pad[pad].oldled |= 0x80; - else - ds3pad[pad].oldled &= 0x7F; - - } else { - DPRINTF("Unmanaged Input Report: THDR 0x%x ", data[8]); - DPRINTF(" ID 0x%x\n", data[9]); - } -} // readReport - -static uint8_t writeReport(uint8_t *data, uint8_t length, int pad) -{ - PollSema(bt_dev.l2cap_cmd_sema); - - l2cap_cmd_buf[0] = (uint8_t)(ds3pad[pad].hci_handle_ & 0xff); // HCI handle with PB,BC flag - l2cap_cmd_buf[1] = (uint8_t)(((ds3pad[pad].hci_handle_ >> 8) & 0x0f) | 0x20); - l2cap_cmd_buf[2] = (uint8_t)((4 + length) & 0xff); // HCI ACL total data length - l2cap_cmd_buf[3] = (uint8_t)((4 + length) >> 8); - l2cap_cmd_buf[4] = (uint8_t)(length & 0xff); // L2CAP header: Length - l2cap_cmd_buf[5] = (uint8_t)(length >> 8); - l2cap_cmd_buf[6] = (uint8_t)(ds3pad[pad].command_dcid_ & 0xff); // L2CAP header: Channel ID - l2cap_cmd_buf[7] = (uint8_t)(ds3pad[pad].command_dcid_ >> 8); - - mips_memcpy(&l2cap_cmd_buf[8], data, length); - - hid_flags_ &= ~HID_FLAG_COMMAND_SUCCESS; - - // output on endpoint 2 - return UsbBulkTransfer(bt_dev.outEndp, l2cap_cmd_buf, (8 + length), l2cap_cmd_cb, (void *)pad); -} // writeReport - -static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) -{ - uint8_t led_buf[PS3_01_REPORT_LEN + 2]; - - led_buf[0] = ds3pad[pad].type; // THdr - led_buf[1] = PS3_01_REPORT_ID; // Report ID - - mips_memcpy(&led_buf[2], output_01_report, sizeof(output_01_report)); // PS3_01_REPORT_LEN); - - if (ds3pad[pad].type == 0xA2) { - if (rrum < 5) - rrum = 0; - } - - led_buf[2 + 1] = 0xFE; //rt - led_buf[2 + 2] = rrum; //rp - led_buf[2 + 3] = 0xFE; //lt - led_buf[2 + 4] = lrum; //lp - - led_buf[2 + 9] = led & 0x7F; //LED Conf - - if (led & 0x80) //msb means charging, so blink - { - led_buf[2 + 13] = 0x32; - led_buf[2 + 18] = 0x32; - led_buf[2 + 23] = 0x32; - led_buf[2 + 28] = 0x32; - } - - ds3pad[pad].oldled = led; - ds3pad[pad].oldlrumble = lrum; - ds3pad[pad].oldrrumble = rrum; - - return writeReport((uint8_t *)led_buf, sizeof(output_01_report) + 2, pad); -} -/************************************************************/ -/* DS3BT Commands */ -/************************************************************/ - -static int Rumble(uint8_t lrum, uint8_t rrum, int pad) -{ - int ret; - - ret = LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); - if (ret == USB_RC_OK) { - WaitSema(bt_dev.l2cap_cmd_sema); - if (ds3pad[pad].type == HID_THDR_SET_REPORT_OUTPUT) { - WaitSema(bt_dev.l2cap_sema); - do { - ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); - if (ret == USB_RC_OK) - WaitSema(bt_dev.l2cap_sema); - else - break; - } while (!hid_command_success); - - SignalSema(bt_dev.l2cap_sema); - } - } else - DPRINTF("DS3BT: LEDRumble usb transfer error %d\n", ret); - - return ret; -} - -#ifdef USE_THREAD -static uint8_t update_rum = 0, update_lrum = 0, update_rrum = 0; -static int update_port, update_thread_id, update_sema; - -void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port) -{ - WaitSema(update_sema); - - update_rum = 1; - update_lrum = lrum; - update_rrum = rrum; - - SignalSema(update_sema); -} - -int ds3bt_get_data(char *dst, int size, int port) -{ - int ret; - - WaitSema(update_sema); - - mips_memcpy(dst, ds3pad[port].data, size); - update_port = port; - ret = ds3pad[port].analog_btn & 1; - - WakeupThread(update_thread_id); - - return ret; -} - -void ds3bt_set_mode(int mode, int lock, int port) -{ - WaitSema(update_sema); - - if (lock == 3) - ds3pad[port].analog_btn = 3; - else - ds3pad[port].analog_btn = mode; - - SignalSema(update_sema); -} - -static void update_thread(void *param) -{ - int ret; - - while (1) { - SleepThread(); - - if (update_rum) { - Rumble(update_lrum, update_rrum, update_port); - update_rum = 0; - } - - WaitSema(bt_dev.l2cap_sema); - - ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)update_port); - - if (ret == USB_RC_OK) - WaitSema(bt_dev.l2cap_sema); - else - DPRINTF("DS3BT: ds3bt_get_data usb transfer error %d\n", ret); - - SignalSema(bt_dev.l2cap_sema); - SignalSema(update_sema); - } -} -#else -void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port) -{ - Rumble(lrum, rrum, port); -} - -int ds3bt_get_data(char *dst, int size, int port) -{ - int ret; - - WaitSema(bt_dev.l2cap_sema); - - ret = UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)port); - - if (ret == USB_RC_OK) - WaitSema(bt_dev.l2cap_sema); - else - DPRINTF("DS3BT: ds3bt_get_data usb transfer error %d\n", ret); - - mips_memcpy(dst, ds3pad[port].data, size); - ret = ds3pad[port].analog_btn & 1; - - SignalSema(bt_dev.l2cap_sema); - - return ret; -} - -void ds3bt_set_mode(int mode, int lock, int port) -{ - if (lock == 3) - ds3pad[port].analog_btn = 3; - else - ds3pad[port].analog_btn = mode; -} -#endif -void ds3bt_reset() -{ - int pad; - - if (!(bt_dev.status & DS3BT_STATE_USB_AUTHORIZED)) - return; - - for (pad = 0; pad < MAX_PADS; pad++) { - if ((ds3pad[pad].status_ & DS3BT_STATE_CONNECTED) || (ds3pad[pad].status_ & DS3BT_STATE_RUNNING)) { - ds3pad[pad].status_ &= ~DS3BT_STATE_RUNNING; - ds3pad[pad].l2cap_state_ = L2CAP_DOWN_STATE; - - UsbBulkTransfer(bt_dev.inEndp, l2cap_buf, MAX_BUFFER_SIZE, l2cap_event_cb, (void *)pad); - hci_disconnect(ds3pad[pad].hci_handle_); - } - } - - DS3BT_init(); - -#ifdef USE_THREAD - TerminateThread(update_thread_id); - DeleteThread(update_thread_id); - DeleteSema(update_sema); -#endif - DelayThread(1000000); - - bt_release(); -} - -int ds3bt_get_status(int port) -{ - int status = bt_dev.status; - - if (status & DS3BT_STATE_USB_AUTHORIZED) - status |= ds3pad[port].status_; - - return status; -} - -int ds3bt_init(uint8_t pads) -{ - enable_pad = pads; - - if (UsbRegisterDriver(&bt_driver) != USB_RC_OK) { - DPRINTF("BT: Error registering USB devices\n"); - return 0; - } - - UsbRegisterDriver(&chrg_driver); -#ifdef USE_THREAD - iop_thread_t param; - iop_sema_t sema; - - sema.initial = 1; - sema.max = 1; - sema.option = 0; - sema.attr = 0; - - update_sema = CreateSema(&sema); - - if (update_sema < 0) { - return 0; - } - - param.attr = TH_C; - param.thread = update_thread; - param.priority = 0x4f; - param.stacksize = 0xB00; - param.option = 0; - update_thread_id = CreateThread(¶m); - - if (update_thread_id > 0) { - StartThread(update_thread_id, 0); - return 1; - } - - return 0; -#else - return 1; -#endif -} diff --git a/modules/pademu/ds3bt.h b/modules/pademu/ds3bt.h deleted file mode 100644 index 91f12572f..000000000 --- a/modules/pademu/ds3bt.h +++ /dev/null @@ -1,275 +0,0 @@ -#ifndef _DS3BT_H_ -#define _DS3BT_H_ - -#include "types.h" -#include "usbd.h" - -typedef u8 uint8_t; -typedef u16 uint16_t; - -enum eHCI { - // {{{ - /* Bluetooth HCI states for HCI_task() */ - HCI_INIT_STATE = 0, - HCI_RESET_STATE, - HCI_CONNECT_IN_STATE, - HCI_CHANGE_CONNECTION, - HCI_READ_REMOTE_SUPPORTED_FEATURES, - HCI_CONNECTED_STATE, - - /* HCI OpCode Group Field (OGF) */ - HCI_OGF_LINK_CNTRL = (0x01 << 2), // OGF: Link Control Commands - HCI_OGF_LINK_POLICY = (0x02 << 2), // OGF: Link Policy Commands - HCI_OGF_CTRL_BBAND = (0x03 << 2), // OGF: Controller & Baseband Commands - HCI_OGF_INFO_PARAM = (0x04 << 2), // OGF: Informational Parameters - - /* HCI OpCode Command Field (OCF) */ - HCI_OCF_ACCEPT_CONNECTION = 0x09, // OGF = 0x01 - HCI_OCF_REJECT_CONNECTION = 0x0A, // OGF = 0x01 - HCI_OCF_CHANGE_CONNECTION_TYPE = 0x0F, // OGF = 0x01 - HCI_OCF_RESET = 0x03, // OGF = 0x03 - HCI_OCF_WRITE_ACCEPT_TIMEOUT = 0x16, // OGF = 0x03 - HCI_OCF_WRITE_SCAN_ENABLE = 0x1A, // OGF = 0x03 - - /* HCI events managed */ - HCI_EVENT_CONNECT_COMPLETE = 0x03, - HCI_EVENT_CONNECT_REQUEST = 0x04, - HCI_EVENT_DISCONN_COMPLETE = 0x05, - HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE = 0x0B, - HCI_EVENT_QOS_SETUP_COMPLETE = 0x0d, // do nothing - HCI_EVENT_COMMAND_COMPLETE = 0x0e, - HCI_EVENT_COMMAND_STATUS = 0x0f, - HCI_EVENT_ROLE_CHANGED = 0x12, - HCI_EVENT_NUM_COMPLETED_PKT = 0x13, // do nothing - HCI_EVENT_CHANGED_CONNECTION_TYPE = 0x1D, - HCI_EVENT_PAGE_SR_CHANGED = 0x20, - HCI_EVENT_MAX_SLOT_CHANGE = 0x1B, //Max Slots Change event - - /* HCI event flags for hci_event_flag */ - HCI_FLAG_COMMAND_COMPLETE = 0x01, - HCI_FLAG_COMMAND_STATUS = 0x02, - HCI_FLAG_CONNECT_COMPLETE = 0x04, - HCI_FLAG_DISCONN_COMPLETE = 0x08, - HCI_FLAG_INCOMING_REQUEST = 0x10, - HCI_FLAG_READ_BDADDR = 0x20, - - /* HCI Scan Enable Parameters */ - SCAN_ENABLE_NOINQ_NOPAG = 0x00, - SCAN_ENABLE_ENINQ_NOPAG = 0x01, - SCAN_ENABLE_NOINQ_ENPAG = 0x02, - SCAN_ENABLE_ENINQ_ENPAG = 0x03, - - // used in control endpoint header for HCI Commands - bmREQ_HCI_OUT = (USB_DIR_OUT | - USB_TYPE_CLASS | - USB_RECIP_DEVICE), - HCI_COMMAND_REQ = 0, - // }}} -}; - -enum eL2CAP { - // {{{ - /* Bluetooth L2CAP PSM */ - L2CAP_PSM_WRITE = 0x11, // HID_Control - L2CAP_PSM_READ = 0x13, // HID_Interrupt - - /* Bluetooth L2CAP states for L2CAP_task() */ - L2CAP_DOWN_STATE = 0, - L2CAP_INIT_STATE, - L2CAP_CONTROL_CONNECTING_STATE, - L2CAP_CONTROL_REQUEST_STATE, - L2CAP_CONTROL_CONFIGURING_STATE, - L2CAP_INTERRUPT_CONNECTING_STATE, - L2CAP_INTERRUPT_REQUEST_STATE, - L2CAP_INTERRUPT_CONFIGURING_STATE, - L2CAP_CONNECTED_STATE, - L2CAP_LED_STATE, - L2CAP_LED_STATE_END, - L2CAP_READY_STATE, - L2CAP_DISCONNECT_STATE, - - /* L2CAP event flags */ - L2CAP_EV_COMMAND_CONNECTED = 0x01, - L2CAP_EV_COMMAND_CONFIG_REQ = 0x02, - L2CAP_EV_COMMAND_CONFIGURED = 0x04, - L2CAP_EV_COMMAND_DISCONNECT_REQ = 0x08, - L2CAP_EV_INTERRUPT_CONNECTED = 0x10, - L2CAP_EV_INTERRUPT_CONFIG_REQ = 0x20, - L2CAP_EV_INTERRUPT_CONFIGURED = 0x40, - L2CAP_EV_INTERRUPT_DISCONNECT_REQ = 0x80, - - /* L2CAP signaling command */ - L2CAP_CMD_COMMAND_REJECT = 0x01, - L2CAP_CMD_CONNECTION_REQUEST = 0x02, - L2CAP_CMD_CONNECTION_RESPONSE = 0x03, - L2CAP_CMD_CONFIG_REQUEST = 0x04, - L2CAP_CMD_CONFIG_RESPONSE = 0x05, - L2CAP_CMD_DISCONNECT_REQUEST = 0x06, - L2CAP_CMD_DISCONNECT_RESPONSE = 0x07, - - /* HCI ACL Data Packet - * - * buf[0] buf[1] buf[2] buf[3] - * 0 4 8 11 12 16 24 31 MSB - * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. - * | HCI Handle |PB |BC | Data Total Length | HCI ACL Data Packet - * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. - * - * buf[4] buf[5] buf[6] buf[7] - * 0 8 16 31 MSB - * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. - * | Length | Channel ID | Basic L2CAP header - * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. - * - * buf[8] buf[9] buf[10] buf[11] - * 0 8 16 31 MSB - * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. - * | Code | Identifier | Length | Control frame (C-frame) - * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. (signaling packet format) - */ - // }}} -}; - -enum eHID { - // {{{ - /* HID event flag */ - HID_FLAG_STATUS_REPORTED = 0x01, - HID_FLAG_BUTTONS_CHANGED = 0x02, - HID_FLAG_EXTENSION = 0x04, - HID_FLAG_COMMAND_SUCCESS = 0x08, - - /* Bluetooth HID Transaction Header (THdr) */ - HID_THDR_GET_REPORT_FEATURE = 0x43, - HID_THDR_SET_REPORT_OUTPUT = 0x52, - HID_THDR_SET_REPORT_FEATURE = 0x53, - HID_THDR_DATA_INPUT = 0xa1, - - /* Defines of various parameters for PS3 Game controller reports */ - PS3_F4_REPORT_ID = 0xF4, - PS3_F4_REPORT_LEN = 0x04, - - PS3_01_REPORT_ID = 0x01, - PS3_01_REPORT_LEN = 0x30, - // }}} -}; - -enum eDS3BTLEDRumble { - psLEDN = 0x00, - psLED1 = 0x02, - psLED2 = 0x04, - psLED3 = 0x08, - psLED4 = 0x0F, - psLEDA = 0x10, -}; - -enum eDS3BTStatus { - DS3BT_STATE_USB_DISCONNECTED = 0x00, - DS3BT_STATE_USB_AUTHORIZED = 0x01, - DS3BT_STATE_USB_CONFIGURED = 0x02, - DS3BT_STATE_CONNECTED = 0x04, - DS3BT_STATE_RUNNING = 0x08, -}; - -//Structure which describes the type 01 input report -enum TYPE_01_REPORT { - ButtonStateL = 0, // Main buttons Low - ButtonStateH, // Main buttons High - PSButtonState, // PS button - Reserved1, // Unknown - LeftStickX, // left Joystick X axis 0 - 255, 128 is mid - LeftStickY, // left Joystick Y axis 0 - 255, 128 is mid - RightStickX, // right Joystick X axis 0 - 255, 128 is mid - RightStickY, // right Joystick Y axis 0 - 255, 128 is mid - Reserved2, // Unknown - Reserved3, // Unknown - Reserved4, // Unknown - Reserved5, // Unknown - PressureUp, // digital Pad Up button Pressure 0 - 255 - PressureRight, // digital Pad Right button Pressure 0 - 255 - PressureDown, // digital Pad Down button Pressure 0 - 255 - PressureLeft, // digital Pad Left button Pressure 0 - 255 - PressureL2, // digital Pad L2 button Pressure 0 - 255 - PressureR2, // digital Pad R2 button Pressure 0 - 255 - PressureL1, // digital Pad L1 button Pressure 0 - 255 - PressureR1, // digital Pad R1 button Pressure 0 - 255 - PressureTriangle, // digital Pad Triangle button Pressure 0 - 255 - PressureCircle, // digital Pad Circle button Pressure 0 - 255 - PressureCross, // digital Pad Cross button Pressure 0 - 255 - PressureSquare, // digital Pad Square button Pressure 0 - 255 - Reserved6, // Unknown - Reserved7, // Unknown - Reserved8, // Unknown - Charge, // charging status ? 02 = charge, 03 = normal - Power, // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging - Connection, // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble - Reserved9, // Unknown - Reserved10, // Unknown - Reserved11, // Unknown - Reserved12, // Unknown - Reserved13, // Unknown - Reserved14, // Unknown - Reserved15, // Unknown - Reserved16, // Unknown - Reserved17, // Unknown - AccelXH, // X axis accelerometer Big Endian 0 - 1023 - AccelXL, // Low - AccelYH, // Y axis accelerometer Big Endian 0 - 1023 - AccelYL, // Low - AccelZH, // Z Accelerometer Big Endian 0 - 1023 - AccelZL, // Low - GyroZH, // Z axis Gyro Big Endian 0 - 1023 - GyroZL, // Low -}; - -enum eBUF_SIZE { - MAX_BUFFER_SIZE = 64, // Size of general purpose data buffer -}; - -/* HCI macro */ -#define hci_timeout (hci_counter_-- == 0) - -/* Macros for HCI event flag tests */ -#define hci_command_complete (hci_event_flag_ & HCI_FLAG_COMMAND_COMPLETE) -#define hci_command_status (hci_event_flag_ & HCI_FLAG_COMMAND_STATUS) -#define hci_connect_complete (hci_event_flag_ & HCI_FLAG_CONNECT_COMPLETE) -#define hci_disconn_complete (hci_event_flag_ & HCI_FLAG_DISCONN_COMPLETE) -#define hci_incoming_connect_request (hci_event_flag_ & HCI_FLAG_INCOMING_REQUEST) -#define hci_read_bdaddr_complete (hci_event_flag_ & HCI_FLAG_READ_BDADDR) - -/* Macros for L2CAP event flag tests */ -#define l2cap_command_connected (l2cap_event_status_ & L2CAP_EV_COMMAND_CONNECTED) -#define l2cap_command_request (l2cap_event_status_ & L2CAP_EV_COMMAND_CONFIG_REQ) -#define l2cap_command_configured (l2cap_event_status_ & L2CAP_EV_COMMAND_CONFIGURED) -#define l2cap_command_disconnected (l2cap_event_status_ & L2CAP_EV_COMMAND_DISCONNECT_REQ) -#define l2cap_interrupt_connected (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONNECTED) -#define l2cap_interrupt_request (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONFIG_REQ) -#define l2cap_interrupt_configured (l2cap_event_status_ & L2CAP_EV_INTERRUPT_CONFIGURED) -#define l2cap_interrupt_disconnected (l2cap_event_status_ & L2CAP_EV_INTERRUPT_DISCONNECT_REQ) - -/* Macros for L2CAP event task tests */ -#define acl_handle_ok(handle) (((l2cap_buf[0] | (l2cap_buf[1] << 8)) & 0x0FFF) == (handle & 0x0FFF)) -#define l2cap_control ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == 0x0001) // Channel ID for ACL-U -#define l2cap_interrupt ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == interrupt_scid_) -#define l2cap_command ((l2cap_buf[6] | (l2cap_buf[7] << 8)) == command_scid_) -#define l2cap_command_reject (l2cap_buf[8] == L2CAP_CMD_COMMAND_REJECT) -#define l2cap_connection_request (l2cap_buf[8] == L2CAP_CMD_CONNECTION_REQUEST) -#define l2cap_configuration_request (l2cap_buf[8] == L2CAP_CMD_CONFIG_REQUEST) -#define l2cap_configuration_response (l2cap_buf[8] == L2CAP_CMD_CONFIG_RESPONSE) -#define l2cap_configuration_success ((l2cap_buf[16] | (l2cap_buf[17] << 8)) == 0x0000) -#define l2cap_disconnect_request (l2cap_buf[8] == L2CAP_CMD_DISCONNECT_REQUEST) - -/* Macros for HID event flag tests */ -#define hid_buttons_changed (hid_flags_ & HID_FLAG_BUTTONS_CHANGED) -#define hid_extension (hid_flags_ & HID_FLAG_EXTENSION) -#define hid_command_success (hid_flags_ & HID_FLAG_COMMAND_SUCCESS) -#define hid_handshake_success (l2cap_buf[8] == 0) -#define hid_input_report ((data[8] == HID_THDR_DATA_INPUT) & (data[9] == PS3_01_REPORT_ID)) - -int ds3bt_init(uint8_t pads); -int ds3bt_get_status(int port); -void ds3bt_reset(); -int ds3bt_get_data(char *dst, int size, int port); -void ds3bt_set_rumble(uint8_t lrum, uint8_t rrum, int port); -void ds3bt_set_mode(int mode, int lock, int port); - -#endif diff --git a/modules/pademu/ds3usb.c b/modules/pademu/ds3usb.c deleted file mode 100644 index 6fddd6a03..000000000 --- a/modules/pademu/ds3usb.c +++ /dev/null @@ -1,463 +0,0 @@ -#include "types.h" -#include "ioman.h" -#include "intrman.h" -#include "loadcore.h" -#include "stdio.h" -#include "sifcmd.h" -#include "sifrpc.h" -#include "sysclib.h" -#include "sysmem.h" -#include "usbd.h" -#include "usbd_macro.h" -#include "thbase.h" -#include "thevent.h" -#include "thsemap.h" -#include "sifman.h" -#include "vblank.h" -#include "ds3usb.h" -#include "sys_utils.h" - -//#define DPRINTF(x...) printf(x) -#define DPRINTF(x...) - -#define MAX_PADS 2 - -static uint8_t output_01_report[] = - { - 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x02, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0xff, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00}; - -static uint8_t led_patterns[][2] = - { - {0x1C, 0x02}, - {0x1A, 0x04}, - {0x16, 0x08}, - {0x0E, 0x10}, -}; - -static uint8_t power_level[] = - { - 0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E}; - -static uint8_t usb_buf[MAX_BUFFER_SIZE] __attribute((aligned(4))) = {0}; - -int usb_probe(int devId); -int usb_connect(int devId); -int usb_disconnect(int devId); - -static void usb_release(int pad); -static void usb_config_set(int result, int count, void *arg); - -UsbDriver usb_driver = {NULL, NULL, "ds3usb", usb_probe, usb_connect, usb_disconnect}; - -static void DS3USB_init(int pad); -static void readReport(uint8_t *data, int pad); -static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad); -static int LED(uint8_t led, int pad); -static int Rumble(uint8_t lrum, uint8_t rrum, int pad); - -typedef struct _usb_ds3 -{ - int devId; - int sema; - int controlEndp; - int eventEndp; - uint8_t status; - uint8_t oldled; - uint8_t oldlrumble; - uint8_t oldrrumble; - uint8_t data[18]; - uint8_t enabled; - uint8_t analog_btn; -} ds3usb_device; - -ds3usb_device ds3pad[MAX_PADS]; - -int usb_probe(int devId) -{ - UsbDeviceDescriptor *device = NULL; - - DPRINTF("DS3USB: probe: devId=%i\n", devId); - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - if (device == NULL) { - DPRINTF("DS3USB: Error - Couldn't get device descriptor\n"); - return 0; - } - - if (device->idVendor == 0x054C && device->idProduct == 0x0268) - return 1; - - return 0; -} - -int usb_connect(int devId) -{ - int pad, epCount; - UsbDeviceDescriptor *device; - UsbConfigDescriptor *config; - UsbInterfaceDescriptor *interface; - UsbEndpointDescriptor *endpoint; - iop_sema_t SemaData; - - DPRINTF("DS3USB: connect: devId=%i\n", devId); - - for (pad = 0; pad < MAX_PADS; pad++) { - if (ds3pad[pad].devId == -1 && ds3pad[pad].enabled) - break; - } - - if (pad >= MAX_PADS) { - DPRINTF("DS3USB: Error - only %d device allowed !\n", MAX_PADS); - return 1; - } - - ds3pad[pad].devId = devId; - - ds3pad[pad].status = DS3USB_STATE_AUTHORIZED; - - ds3pad[pad].controlEndp = UsbOpenEndpoint(devId, NULL); - - device = (UsbDeviceDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); - config = (UsbConfigDescriptor *)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); - interface = (UsbInterfaceDescriptor *)((char *)config + config->bLength); - - epCount = interface->bNumEndpoints - 1; - - endpoint = (UsbEndpointDescriptor *)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); - - do { - - if (endpoint->bmAttributes == USB_ENDPOINT_XFER_INT) { - if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && ds3pad[pad].eventEndp < 0) { - ds3pad[pad].eventEndp = UsbOpenEndpointAligned(devId, endpoint); - DPRINTF("BT: register Event endpoint id =%i addr=%02X packetSize=%i\n", ds3pad[pad].eventEndp, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB << 8 | endpoint->wMaxPacketSizeLB); - break; - } - } - - endpoint = (UsbEndpointDescriptor *)((char *)endpoint + endpoint->bLength); - - } while (epCount--); - - if (ds3pad[pad].eventEndp < 0) { - usb_release(pad); - return 1; - } - - SemaData.initial = 1; - SemaData.max = 1; - SemaData.option = 0; - SemaData.attr = 0; - - if ((ds3pad[pad].sema = CreateSema(&SemaData)) < 0) { - DPRINTF("DS3USB: Failed to allocate I/O semaphore.\n"); - return -1; - } - - ds3pad[pad].status |= DS3USB_STATE_CONNECTED; - - UsbSetDeviceConfiguration(ds3pad[pad].controlEndp, config->bConfigurationValue, usb_config_set, (void *)pad); - - return 0; -} - -int usb_disconnect(int devId) -{ - uint8_t pad; - - DPRINTF("DS3USB: disconnect: devId=%i\n", devId); - - for (pad = 0; pad < MAX_PADS; pad++) { - if (ds3pad[pad].devId == devId) - break; - } - - if (ds3pad[pad].eventEndp >= 0) - UsbCloseEndpoint(ds3pad[pad].eventEndp); - - if (pad < MAX_PADS && (ds3pad[pad].status & DS3USB_STATE_AUTHORIZED)) - usb_release(pad); - - return 0; -} - -static void usb_release(int pad) -{ - if (ds3pad[pad].sema >= 0) - DeleteSema(ds3pad[pad].sema); - - ds3pad[pad].controlEndp = -1; - ds3pad[pad].eventEndp = -1; - ds3pad[pad].devId = -1; - ds3pad[pad].status = DS3USB_STATE_DISCONNECTED; -} - -static void usb_data_cb(int resultCode, int bytes, void *arg) -{ - int pad = (int)arg; - - //DPRINTF("usb_data_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - - if (!resultCode) - readReport(usb_buf, pad); - - SignalSema(ds3pad[pad].sema); -} - -static void usb_cmd_cb(int resultCode, int bytes, void *arg) -{ - int pad = (int)arg; - - //DPRINTF("usb_cmd_cb: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - - SignalSema(ds3pad[pad].sema); -} - -static void usb_config_set(int result, int count, void *arg) -{ - int pad = (int)arg; - - ds3pad[pad].status |= DS3USB_STATE_CONFIGURED; - - DS3USB_init(pad); - - DelayThread(10000); - - LED((pad + 1) << 1, pad); - - ds3pad[pad].status |= DS3USB_STATE_RUNNING; -} - -static void DS3USB_init(int pad) -{ - usb_buf[0] = 0x42; - usb_buf[1] = 0x0c; - usb_buf[2] = 0x00; - usb_buf[3] = 0x00; - - UsbControlTransfer(ds3pad[pad].controlEndp, bmREQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_GET_REPORT_FEATURE << 8) | 0xF4, 0, 4, usb_buf, NULL, NULL); -} - -#define DATA_START 2 -#define MAX_DELAY 10 - -static uint8_t btn_delay = 0; - -static void readReport(uint8_t *data, int pad) -{ - if (data[0]) { - ds3pad[pad].data[0] = ~data[DATA_START + ButtonStateL]; - ds3pad[pad].data[1] = ~data[DATA_START + ButtonStateH]; - - ds3pad[pad].data[2] = data[DATA_START + RightStickX]; //rx - ds3pad[pad].data[3] = data[DATA_START + RightStickY]; //ry - ds3pad[pad].data[4] = data[DATA_START + LeftStickX]; //lx - ds3pad[pad].data[5] = data[DATA_START + LeftStickY]; //ly - - ds3pad[pad].data[6] = data[DATA_START + PressureRight]; //right - ds3pad[pad].data[7] = data[DATA_START + PressureLeft]; //left - ds3pad[pad].data[8] = data[DATA_START + PressureUp]; //up - ds3pad[pad].data[9] = data[DATA_START + PressureDown]; //down - - ds3pad[pad].data[10] = data[DATA_START + PressureTriangle]; //triangle - ds3pad[pad].data[11] = data[DATA_START + PressureCircle]; //circle - ds3pad[pad].data[12] = data[DATA_START + PressureCross]; //cross - ds3pad[pad].data[13] = data[DATA_START + PressureSquare]; //square - - ds3pad[pad].data[14] = data[DATA_START + PressureL1]; //L1 - ds3pad[pad].data[15] = data[DATA_START + PressureR1]; //R1 - ds3pad[pad].data[16] = data[DATA_START + PressureL2]; //L2 - ds3pad[pad].data[17] = data[DATA_START + PressureR2]; //R2 - - if (data[DATA_START + PSButtonState]) { //display battery level - if ((data[DATA_START + ButtonStateL] & 1) && (btn_delay == MAX_DELAY)) { //PS + SELECT - if (ds3pad[pad].analog_btn < 2) //unlocked mode - ds3pad[pad].analog_btn = !ds3pad[pad].analog_btn; - - ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; - btn_delay = 0; - } else if (data[DATA_START + Power] != 0xEE) - ds3pad[pad].oldled = power_level[data[DATA_START + Power]]; - - if (btn_delay < MAX_DELAY) - btn_delay++; - } else - ds3pad[pad].oldled = led_patterns[pad][(ds3pad[pad].analog_btn & 1)]; - - if (data[DATA_START + Power] == 0xEE) //charging - ds3pad[pad].oldled |= 0x80; - else - ds3pad[pad].oldled &= 0x7F; - } -} - -static int LEDRumble(uint8_t led, uint8_t lrum, uint8_t rrum, int pad) -{ - mips_memcpy(usb_buf, output_01_report, sizeof(output_01_report)); - - usb_buf[1] = 0xFE; //rt - usb_buf[2] = rrum; //rp - usb_buf[3] = 0xFE; //lt - usb_buf[4] = lrum; //lp - - usb_buf[9] = led & 0x7F; //LED Conf - - if (led & 0x80) //msb means charging, so blink - { - usb_buf[13] = 0x32; - usb_buf[18] = 0x32; - usb_buf[23] = 0x32; - usb_buf[28] = 0x32; - } - - ds3pad[pad].oldled = led; - ds3pad[pad].oldlrumble = lrum; - ds3pad[pad].oldrrumble = rrum; - - return UsbControlTransfer(ds3pad[pad].controlEndp, bmREQ_USB_OUT, USB_REQ_SET_REPORT, (HID_USB_SET_REPORT_OUTPUT << 8) | 0x01, 0, sizeof(output_01_report), usb_buf, usb_cmd_cb, (void *)pad); -} - -static unsigned int timeout(void *arg) -{ - int sema = (int)arg; - iSignalSema(sema); - return 0; -} - -static void TransferWait(int sema) -{ - iop_sys_clock_t cmd_timeout; - - cmd_timeout.lo = 200000; - cmd_timeout.hi = 0; - - if (SetAlarm(&cmd_timeout, timeout, (void *)sema) == 0) { - WaitSema(sema); - CancelAlarm(timeout, NULL); - } -} - -static int LED(uint8_t led, int pad) -{ - return LEDRumble(led, ds3pad[pad].oldlrumble, ds3pad[pad].oldrrumble, pad); -} - -static int Rumble(uint8_t lrum, uint8_t rrum, int pad) -{ - int ret; - - ret = LEDRumble(ds3pad[pad].oldled, lrum, rrum, pad); - if (ret == USB_RC_OK) - TransferWait(ds3pad[pad].sema); - else - DPRINTF("DS3USB: LEDRumble usb transfer error %d\n", ret); - - return ret; -} - -void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port) -{ - WaitSema(ds3pad[port].sema); - - Rumble(lrum, rrum, port); - - SignalSema(ds3pad[port].sema); -} - -int ds3usb_get_data(char *dst, int size, int port) -{ - int ret; - - WaitSema(ds3pad[port].sema); - - ret = UsbInterruptTransfer(ds3pad[port].eventEndp, usb_buf, MAX_BUFFER_SIZE, usb_data_cb, (void *)port); - - if (ret == USB_RC_OK) - TransferWait(ds3pad[port].sema); - else - DPRINTF("DS3USB: ds3usb_get_data usb transfer error %d\n", ret); - - mips_memcpy(dst, ds3pad[port].data, size); - ret = ds3pad[port].analog_btn & 1; - - SignalSema(ds3pad[port].sema); - - return ret; -} - -void ds3usb_set_mode(int mode, int lock, int port) -{ - WaitSema(ds3pad[port].sema); - - if (lock == 3) - ds3pad[port].analog_btn = 3; - else - ds3pad[port].analog_btn = mode; - - SignalSema(ds3pad[port].sema); -} - -void ds3usb_reset() -{ - int pad; - - for (pad = 0; pad < MAX_PADS; pad++) - usb_release(pad); -} - -int ds3usb_get_status(int port) -{ - int status; - - if (ds3pad[port].sema >= 0) { - WaitSema(ds3pad[port].sema); - status = ds3pad[port].status; - SignalSema(ds3pad[port].sema); - } else { - return ds3pad[port].status; - } - - return status; -} - -int ds3usb_init(uint8_t pads) -{ - int pad; - - for (pad = 0; pad < MAX_PADS; pad++) { - ds3pad[pad].status = 0; - ds3pad[pad].devId = -1; - ds3pad[pad].oldled = 0; - ds3pad[pad].oldlrumble = 0; - ds3pad[pad].oldrrumble = 0; - ds3pad[pad].sema = -1; - ds3pad[pad].controlEndp = -1; - ds3pad[pad].eventEndp = -1; - ds3pad[pad].enabled = (pads >> pad) & 1; - - ds3pad[pad].data[0] = 0xFF; - ds3pad[pad].data[1] = 0xFF; - ds3pad[pad].analog_btn = 0; - - mips_memset(&ds3pad[pad].data[2], 0x7F, 4); - mips_memset(&ds3pad[pad].data[6], 0x00, 12); - } - - if (UsbRegisterDriver(&usb_driver) != USB_RC_OK) { - DPRINTF("DS3USB: Error registering USB devices\n"); - return 0; - } - - return 1; -} diff --git a/modules/pademu/ds3usb.h b/modules/pademu/ds3usb.h deleted file mode 100644 index 4e04d121e..000000000 --- a/modules/pademu/ds3usb.h +++ /dev/null @@ -1,117 +0,0 @@ -#ifndef _DS3USB_H_ -#define _DS3USB_H_ - -#include "types.h" -#include "usbd.h" - -typedef u8 uint8_t; -typedef u16 uint16_t; - -enum eHID { - // {{{ - /* HID event flag */ - HID_FLAG_STATUS_REPORTED = 0x01, - HID_FLAG_BUTTONS_CHANGED = 0x02, - HID_FLAG_EXTENSION = 0x04, - HID_FLAG_COMMAND_SUCCESS = 0x08, - - /* USB HID Transaction Header (THdr) */ - HID_USB_GET_REPORT_FEATURE = 0x03, - HID_USB_SET_REPORT_OUTPUT = 0x02, - HID_USB_DATA_INPUT = 0x01, - - /* Defines of various parameters for PS3 Game controller reports */ - PS3_F4_REPORT_ID = 0xF4, - PS3_F4_REPORT_LEN = 0x04, - - PS3_01_REPORT_ID = 0x01, - PS3_01_REPORT_LEN = 0x30, - // }}} - - bmREQ_USB_OUT = (USB_DIR_OUT | - USB_TYPE_CLASS | - USB_RECIP_INTERFACE), - -}; - - -enum eDS3USBLEDRumble { - psLEDN = 0x00, - psLED1 = 0x02, - psLED2 = 0x04, - psLED3 = 0x08, - psLED4 = 0x0F, - psLEDA = 0x10, -}; - -enum eDS3USBStatus { - DS3USB_STATE_DISCONNECTED = 0x00, - DS3USB_STATE_AUTHORIZED = 0x01, - DS3USB_STATE_CONFIGURED = 0x02, - DS3USB_STATE_CONNECTED = 0x04, - DS3USB_STATE_RUNNING = 0x08, -}; - -//Structure which describes the type 01 input report -enum TYPE_01_REPORT { - ButtonStateL = 0, // Main buttons Low - ButtonStateH, // Main buttons High - PSButtonState, // PS button - Reserved1, // Unknown - LeftStickX, // left Joystick X axis 0 - 255, 128 is mid - LeftStickY, // left Joystick Y axis 0 - 255, 128 is mid - RightStickX, // right Joystick X axis 0 - 255, 128 is mid - RightStickY, // right Joystick Y axis 0 - 255, 128 is mid - Reserved2, // Unknown - Reserved3, // Unknown - Reserved4, // Unknown - Reserved5, // Unknown - PressureUp, // digital Pad Up button Pressure 0 - 255 - PressureRight, // digital Pad Right button Pressure 0 - 255 - PressureDown, // digital Pad Down button Pressure 0 - 255 - PressureLeft, // digital Pad Left button Pressure 0 - 255 - PressureL2, // digital Pad L2 button Pressure 0 - 255 - PressureR2, // digital Pad R2 button Pressure 0 - 255 - PressureL1, // digital Pad L1 button Pressure 0 - 255 - PressureR1, // digital Pad R1 button Pressure 0 - 255 - PressureTriangle, // digital Pad Triangle button Pressure 0 - 255 - PressureCircle, // digital Pad Circle button Pressure 0 - 255 - PressureCross, // digital Pad Cross button Pressure 0 - 255 - PressureSquare, // digital Pad Square button Pressure 0 - 255 - Reserved6, // Unknown - Reserved7, // Unknown - Reserved8, // Unknown - Charge, // charging status ? 02 = charge, 03 = normal - Power, // Battery status ? 05=full - 02=dying, 01=just before shutdown, EE=charging - Connection, // Connection Type ? 14 when operating by bluetooth, 10 when operating by bluetooth with cable plugged in, 16 when bluetooh and rumble - Reserved9, // Unknown - Reserved10, // Unknown - Reserved11, // Unknown - Reserved12, // Unknown - Reserved13, // Unknown - Reserved14, // Unknown - Reserved15, // Unknown - Reserved16, // Unknown - Reserved17, // Unknown - AccelXH, // X axis accelerometer Big Endian 0 - 1023 - AccelXL, // Low - AccelYH, // Y axis accelerometer Big Endian 0 - 1023 - AccelYL, // Low - AccelZH, // Z Accelerometer Big Endian 0 - 1023 - AccelZL, // Low - GyroZH, // Z axis Gyro Big Endian 0 - 1023 - GyroZL, // Low -}; - -enum eBUF_SIZE { - MAX_BUFFER_SIZE = 64, // Size of general purpose data buffer -}; - -int ds3usb_init(uint8_t pads); -int ds3usb_get_status(int port); -void ds3usb_reset(); -int ds3usb_get_data(char *dst, int size, int port); -void ds3usb_set_rumble(uint8_t lrum, uint8_t rrum, int port); -void ds3usb_set_mode(int mode, int lock, int port); - -#endif diff --git a/modules/pademu/imports.lst b/modules/pademu/imports.lst index ce4ee8f2f..4ee3ecd6d 100644 --- a/modules/pademu/imports.lst +++ b/modules/pademu/imports.lst @@ -3,6 +3,7 @@ I_RegisterLibraryEntries I_ReleaseLibraryEntries I_GetLoadcoreInternalData I_QueryLibraryEntryTable +I_SetRebootTimeLibraryHandlingMode loadcore_IMPORTS_end stdio_IMPORTS_start diff --git a/modules/pademu/irx_imports.h b/modules/pademu/irx_imports.h index 5caf8911c..c58b1a240 100644 --- a/modules/pademu/irx_imports.h +++ b/modules/pademu/irx_imports.h @@ -33,6 +33,7 @@ #include "thsemap.h" #include "usbd.h" #include "vblank.h" +#include "xloadcore.h" #include "sys_utils.h" diff --git a/modules/pademu/pademu.c b/modules/pademu/pademu.c index 6ba3755b3..920ccfcf9 100644 --- a/modules/pademu/pademu.c +++ b/modules/pademu/pademu.c @@ -10,25 +10,25 @@ #ifdef BT -#include "ds3bt.h" +#include "ds34bt.h" -#define PAD_INIT ds3bt_init -#define PAD_GET_STATUS ds3bt_get_status -#define PAD_RESET ds3bt_reset -#define PAD_GET_DATA ds3bt_get_data -#define PAD_SET_RUMBLE ds3bt_set_rumble -#define PAD_SET_MODE ds3bt_set_mode +#define PAD_INIT ds34bt_init +#define PAD_GET_STATUS ds34bt_get_status +#define PAD_RESET ds34bt_reset +#define PAD_GET_DATA ds34bt_get_data +#define PAD_SET_RUMBLE ds34bt_set_rumble +#define PAD_SET_MODE ds34bt_set_mode #elif defined(USB) -#include "ds3usb.h" +#include "ds34usb.h" -#define PAD_INIT ds3usb_init -#define PAD_GET_STATUS ds3usb_get_status -#define PAD_RESET ds3usb_reset -#define PAD_GET_DATA ds3usb_get_data -#define PAD_SET_RUMBLE ds3usb_set_rumble -#define PAD_SET_MODE ds3usb_set_mode +#define PAD_INIT ds34usb_init +#define PAD_GET_STATUS ds34usb_get_status +#define PAD_RESET ds34usb_reset +#define PAD_GET_DATA ds34usb_get_data +#define PAD_SET_RUMBLE ds34usb_set_rumble +#define PAD_SET_MODE ds34usb_set_mode #else #error "must define mode" @@ -39,16 +39,16 @@ typedef struct { - uint8_t mode; - uint8_t mode_p; - uint8_t mode_id; - uint8_t mode_cfg; - uint8_t mode_lock; - uint8_t enabled; - uint8_t vibration; - uint8_t lrum; - uint8_t rrum; - uint8_t mask[4]; + u8 mode; + u8 mode_p; + u8 mode_id; + u8 mode_cfg; + u8 mode_lock; + u8 enabled; + u8 vibration; + u8 lrum; + u8 rrum; + u8 mask[4]; } pad_status_t; #define DIGITAL_MODE 0x41 @@ -56,56 +56,63 @@ typedef struct #define ANALOGP_MODE 0x79 #define CONFIG_MODE 0xF3 -#define MAX_PORTS 2 +#define MAX_PORTS 4 #define PAD_STATE_RUNNING 0x08 IRX_ID("pademu", 1, 1); -//#define OLD_PADMAN - PtrRegisterLibraryEntires pRegisterLibraryEntires; /* Pointer to RegisterLibraryEntires routine */ Sio2McProc pSio2man25, pSio2man51; /* Pointers to SIO2MAN routines */ pad_status_t pad[MAX_PORTS]; -#ifdef OLD_PADMAN -void (*pSio2man23)(); -void hookSio2man23(); -#endif +static u8 pad_inited = 0; +static u8 pad_enable = 0; +static u8 pad_options = 0; + +static u8 mtap_enabled = 0; +static u8 mtap_inited = 0; +static u8 mtap_slot = 0; +static u8 mtap_port = 0; int install_sio2hook(); int hookRegisterLibraryEntires(iop_library_t *lib); void hookSio2man25(sio2_transfer_data_t *sd); void hookSio2man51(sio2_transfer_data_t *sd); -void InstallSio2manHook(void *exp); +void InstallSio2manHook(void *exp, int ver); void pademu_hookSio2man(sio2_transfer_data_t *td, Sio2McProc sio2proc); -void pademu_setup(uint8_t ports, uint8_t vib); +void pademu_setup(u8 ports, u8 vib); void pademu(sio2_transfer_data_t *td); -void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size); +void pademu_cmd(int port, u8 *in, u8 *out, u8 out_size); + +void pademu_mtap(sio2_transfer_data_t *td); extern struct irx_export_table _exp_pademu; int _start(int argc, char *argv[]) { - uint8_t enable = 0xFF, vibration = 0xFF; + u8 pad_vibration = 0xFF; - if (argc > 1) { - enable = argv[1][0]; - vibration = argv[1][1]; - } + pad_enable = 0xFF; - if (!PAD_INIT(enable)) { - return MODULE_NO_RESIDENT_END; + if (argc > 1) { + pad_enable = argv[1][0]; + pad_vibration = argv[1][1]; + mtap_enabled = argv[1][2] & 1; + mtap_port = (argv[1][2] >> 1) & 1; + pad_options = (argv[1][2] >> 2) & 1; //disable workaround for fake ds3 } if (RegisterLibraryEntries(&_exp_pademu) != 0) { return MODULE_NO_RESIDENT_END; } + SetRebootTimeLibraryHandlingMode(&_exp_pademu, 2); + #ifdef VMC - uint8_t vmc = 0; + u8 vmc = 0; if (argc > 1) vmc = argv[1][3]; @@ -115,7 +122,7 @@ int _start(int argc, char *argv[]) if (!install_sio2hook()) return MODULE_NO_RESIDENT_END; - pademu_setup(enable, vibration); + pademu_setup(pad_enable, pad_vibration); return MODULE_RESIDENT_END; } @@ -143,7 +150,7 @@ int install_sio2hook() exp = GetExportTable("sio2man", 0x201); if (exp != NULL) { /* hooking SIO2MAN's routines */ - InstallSio2manHook(exp); + InstallSio2manHook(exp, 1); } else { DPRINTF("SIO2MAN exports not found.\n"); } @@ -151,15 +158,12 @@ int install_sio2hook() return 1; } -void InstallSio2manHook(void *exp) +void InstallSio2manHook(void *exp, int ver) { /* hooking SIO2MAN entry #25 (used by MCMAN and old PADMAN) */ pSio2man25 = HookExportEntry(exp, 25, hookSio2man25); /* hooking SIO2MAN entry #51 (used by MC2_* modules and PADMAN) */ - pSio2man51 = HookExportEntry(exp, 51, hookSio2man51); -#ifdef OLD_PADMAN - pSio2man23 = HookExportEntry(exp, 23, hookSio2man23); -#endif + pSio2man51 = HookExportEntry(exp, 49 + (ver * 2), hookSio2man51); } /* Hook for the LOADCORE's RegisterLibraryEntires call */ @@ -172,7 +176,7 @@ int hookRegisterLibraryEntires(iop_library_t *lib) if (ret == 0) { ReleaseLibraryEntries((struct irx_export_table *)lib); /* hooking SIO2MAN's routines */ - InstallSio2manHook(&lib[1]); + InstallSio2manHook(&lib[1], GetExportTableSize(&lib[1]) >= 61); } else { DPRINTF("registering library %s failed, error %d\n", lib->name, ret); return ret; @@ -196,13 +200,6 @@ void hookSio2man51(sio2_transfer_data_t *sd) pademu_hookSio2man(sd, pSio2man51); } -#ifdef OLD_PADMAN -void hookSio2man23() -{ - return; -} -#endif - void pademu_hookSio2man(sio2_transfer_data_t *td, Sio2McProc sio2proc) { register u32 ctrl, port1, port2; @@ -211,41 +208,44 @@ void pademu_hookSio2man(sio2_transfer_data_t *td, Sio2McProc sio2proc) port1 = td->regdata[0] & 0x03; port2 = td->regdata[1] & 0x03; - if ((ctrl & 0xF0) == 0x40 && td->in[0] == 0x01 && td->port_ctrl2[port1] != 0x00030064) { - - if (port2 == 1) //2 pads at once - { - if (pad[0].enabled && pad[1].enabled) //emulating 2 pads - { - sio2proc = pademu; - } else if (pad[0].enabled || pad[1].enabled) // only one - { -#ifdef OLD_PADMAN - pSio2man23(); -#endif - sio2proc(td); - sio2proc = pademu; + if ((ctrl & 0xF0) == 0x40) { + if (td->port_ctrl2[port1] == 0x00030064 && td->in[0] == 0x21 && mtap_enabled) { + sio2proc = pademu_mtap; + } else if(td->in[0] == 0x01) { + if (port2 == 1) { //2 sio cmds + if (mtap_inited) { + if (pad[0].enabled) { + sio2proc(td); + sio2proc = pademu; + } + } else { + if (pad[0].enabled && pad[1].enabled) { //emulating 2 pads + sio2proc = pademu; + } else if (pad[0].enabled || pad[1].enabled) { //only one + sio2proc(td); + sio2proc = pademu; + } + } } else { -#ifdef OLD_PADMAN - pSio2man23(); -#endif + if (mtap_inited) { + if (mtap_port == port1) { + sio2proc = pademu; + } + } else { + if (pad[port1].enabled) { //emulating this port + sio2proc = pademu; + } + } } - } else { - if (pad[port1].enabled) //emulating this port - sio2proc = pademu; -#ifdef OLD_PADMAN - else - pSio2man23(); -#endif } } sio2proc(td); } -void pademu_setup(uint8_t ports, uint8_t vib) +void pademu_setup(u8 ports, u8 vib) { - uint8_t i; + u8 i; for (i = 0; i < MAX_PORTS; i++) { pad[i].mode = 0; @@ -267,7 +267,7 @@ void pademu_setup(uint8_t ports, uint8_t vib) } } -uint8_t pademu_data[6][6] = +u8 pademu_data[6][6] = { {0x00, 0x00, 0x02, 0x00, 0x00, 0x5A}, {0x03, 0x02, 0x00, 0x02, 0x01, 0x00}, @@ -279,8 +279,8 @@ uint8_t pademu_data[6][6] = void pademu(sio2_transfer_data_t *td) { int port; - uint8_t port1, port2, cmd_size; - uint8_t *in, *out; + u8 port1, port2, cmd_size; + u8 *in, *out; port1 = td->regdata[0] & 0x03; port2 = td->regdata[1] & 0x03; @@ -288,6 +288,10 @@ void pademu(sio2_transfer_data_t *td) td->stat6c = 0x1100; //? td->stat70 = 0x0F; //? + if (!pad_inited) { + pad_inited = PAD_INIT(pad_enable, pad_options); + } + if (port2 == 1) { //find next cmd for (cmd_size = 5; cmd_size < td->in_size - 3; cmd_size++) { @@ -304,35 +308,50 @@ void pademu(sio2_transfer_data_t *td) return; } - if (pad[0].enabled) { - in = td->in; - out = td->out; - port = 0; + if (mtap_inited) { + if (mtap_port == 0) { + in = td->in; + out = td->out; + port = 0; + } else { + in = (u8 *)&td->in[cmd_size]; + out = (u8 *)&td->out[cmd_size]; + port = 0; + cmd_size = td->in_size - cmd_size; + } + } else { + if (pad[0].enabled) { + in = td->in; + out = td->out; + port = 0; - if (pad[1].enabled) //emulating ports 0 & 1 - { - pademu_cmd(1, (uint8_t *)&td->in[cmd_size], (uint8_t *)&td->out[cmd_size], td->in_size - cmd_size); + if (pad[1].enabled) { //emulating ports 0 & 1 + pademu_cmd(1, (u8 *)&td->in[cmd_size], (u8 *)&td->out[cmd_size], td->in_size - cmd_size); + } + } else { //emulating only port 1 + in = (u8 *)&td->in[cmd_size]; + out = (u8 *)&td->out[cmd_size]; + port = 1; + cmd_size = td->in_size - cmd_size; } - } else //emulating only port 1 - { - in = (uint8_t *)&td->in[cmd_size]; - out = (uint8_t *)&td->out[cmd_size]; - port = 1; - cmd_size = td->in_size - cmd_size; } } else { in = td->in; out = td->out; port = port1; cmd_size = td->in_size; + + if (mtap_inited) { + port = mtap_slot; + } } pademu_cmd(port, in, out, cmd_size); } -void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) +void pademu_cmd(int port, u8 *in, u8 *out, u8 out_size) { - uint8_t i; + u8 i; mips_memset(out, 0x00, out_size); @@ -435,8 +454,7 @@ void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) case 0x4D: //set act align mips_memcpy(&out[3], &pademu_data[5], 6); - for (i = 0; i < 6; i++) //vibration - { + for (i = 0; i < 6; i++) { //vibration if (in[3 + i] == 0x00) pad[port].rrum = i + 3; @@ -458,3 +476,45 @@ void pademu_cmd(int port, uint8_t *in, uint8_t *out, uint8_t out_size) break; } } + +static u8 mtap_data[] = { + 0xff, 0x80, 0x5a, 0x00, 0x00, 0x5a +}; + +#define MAX_SLOT 4 + +void pademu_mtap(sio2_transfer_data_t *td) +{ + u8 port1; + + port1 = td->regdata[0] & 0x01; + + mips_memset(td->out, 0x00, td->out_size); + td->stat6c = 0x0001d100; + + if (port1 != mtap_port) { + return; + } + + switch (td->in[1]) { + case 0x12: //returns slot number for pad + mips_memcpy(td->out, &mtap_data, sizeof(mtap_data)); + td->out[3] = MAX_SLOT; + td->stat6c = 0x00001100; + mtap_inited = 1; + break; + + case 0x13: //returns slot number for mc + break; + + case 0x21: //changes slot for pad + mips_memcpy(td->out, &mtap_data, sizeof(mtap_data)); + mtap_slot = td->out[5] = td->in[2]; //slot + td->out[6] = 0x5a; + td->stat6c = 0x00001100; + break; + + case 0x22: //changes slot for mc + break; + } +} diff --git a/modules/pademu/pademu.h b/modules/pademu/pademu.h index aa7d19a5e..0be94e786 100644 --- a/modules/pademu/pademu.h +++ b/modules/pademu/pademu.h @@ -16,6 +16,7 @@ #include #include #include +#include #include "sys_utils.h" diff --git a/src/config.c b/src/config.c index bc1175944..19e94e7bf 100644 --- a/src/config.c +++ b/src/config.c @@ -161,7 +161,7 @@ void configInit(char *prefix) snprintf(path, sizeof(path), "%s/conf_apps.cfg", prefix); configAlloc(CONFIG_APPS, &configFiles[CONFIG_INDEX_APPS], path); //START of OPL_DB tweaks - snprintf(path, sizeof(path), "%s/conf_elm.cfg", prefix); + snprintf(path, sizeof(path), "%s/conf_elms.cfg", prefix); configAlloc(CONFIG_ELM, &configFiles[CONFIG_INDEX_ELM], path); //END of OPL_DB tweaks snprintf(path, sizeof(path), "%s/conf_network.cfg", prefix); diff --git a/src/dialogs.c b/src/dialogs.c index 420576207..fa94eae7d 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -194,15 +194,13 @@ struct UIItem diaCompatConfig[] = { {UI_SPACER}, #endif #ifdef CHEAT - {UI_BUTTON, COMPAT_CHEATCONFIG, 1, 1, -1, 0, 0, {.label = {NULL, _STR_CHEAT_SETTINGS}}}, + {UI_BUTTON, COMPAT_CHEATCONFIG, 1, 1, -1, -30, 0, {.label = {NULL, _STR_CHEAT_SETTINGS}}}, #endif -#if defined(GSM) || defined(CHEAT) - {UI_SPLITTER}, -#endif - #ifdef PADEMU {UI_BUTTON, COMPAT_PADEMUCONFIG, 1, 1, -1, 0, 0, {.label = {NULL, _STR_PADEMUCONFIG}}}, - {UI_BREAK}, +#endif +#if defined(GSM) || defined(CHEAT) || defined(PADEMU) + {UI_SPLITTER}, #endif {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_DMA_MODE}}}, @@ -523,14 +521,20 @@ struct UIItem diaPadEmuConfig[] = { {UI_ENUM, PADCFG_PADEMU_MODE, 1, 1, _STR_HINT_PADEMU_MODE, 0, 0, {.intvalue = {1, 1}}}, {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_MTAP_ENABLE}}}, + {UI_SPACER}, + {UI_BOOL, PADCFG_PADEMU_MTAP, 1, 1, _STR_HINT_MTAP_ENABLE, 0, 0, {.intvalue = {1, 1}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_MTAP_PORT}}}, + {UI_SPACER}, + {UI_INT, PADCFG_PADEMU_MTAP_PORT, 1, 1, _STR_HINT_MTAP_PORT, 0, 0, {.intvalue = {1, 1, 1, 2}}}, {UI_BREAK}, {UI_BREAK}, {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_PADPORT}}}, {UI_SPACER}, - {UI_INT, PADCFG_PADPORT, 1, 1, _STR_HINT_PAD_PORT, 0, 0, {.intvalue = {1, 1, 1, 2}}}, - {UI_BREAK}, - + {UI_ENUM, PADCFG_PADPORT, 1, 1, _STR_HINT_PAD_PORT, 0, 0, {.intvalue = {1, 1}}}, {UI_BREAK}, {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_PADEMU_PORT}}}, @@ -542,7 +546,6 @@ struct UIItem diaPadEmuConfig[] = { {UI_BOOL, PADCFG_PADEMU_VIB, 1, 1, _STR_HINT_PADEMU_VIB, 0, 0, {.intvalue = {1, 1}}}, {UI_BREAK}, - {UI_BREAK}, {UI_SPLITTER}, {UI_BREAK}, @@ -555,13 +558,197 @@ struct UIItem diaPadEmuConfig[] = { {UI_LABEL, PADCFG_PAD_MAC, 1, 1, -1, 0, 0, {.label = {"", -1}}}, {UI_BREAK}, - {UI_BREAK}, - {UI_LABEL, PADCFG_PAIR_STR, 1, 1, -1, -45, 0, {.label = {NULL, _STR_PAIR_PAD}}}, {UI_SPACER}, {UI_BUTTON, PADCFG_PAIR, 1, 1, _STR_HINT_PAIRPAD, 0, 0, {.label = {NULL, _STR_PAIR}}}, {UI_BREAK}, + {UI_LABEL, PADCFG_PADEMU_WORKAROUND_STR, 1, 1, -1, -45, 0, {.label = {NULL, _STR_PADEMU_WORKAROUND}}}, + {UI_SPACER}, + {UI_BOOL, PADCFG_PADEMU_WORKAROUND, 1, 1, _STR_HINT_PADEMU_WORKAROUND, 0, 0, {.intvalue = {1, 1}}}, + {UI_BREAK}, + + {UI_BREAK}, + {UI_BUTTON, PADCFG_BTINFO, 1, 1, _STR_HINT_BTINFO, 0, 0, {.label = {NULL, _STR_BTINFO}}}, + {UI_BREAK}, + + {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, + + // end of dialog + {UI_TERMINATOR}}; + +struct UIItem diaPadEmuInfo[] = { + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_BTINFO}}}, {UI_SPACER}, + + {UI_SPLITTER}, + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {"VID:", -1}}}, + {UI_LABEL, PADCFG_VID, 1, 1, -1, -45, 0, {.label = {"", -1}}}, + {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {"PID:", -1}}}, + {UI_LABEL, PADCFG_PID, 1, 1, -1, -45, 0, {.label = {"", -1}}}, + {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {"REV:", -1}}}, + {UI_LABEL, PADCFG_REV, 1, 1, -1, -45, 0, {.label = {"", -1}}}, + {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_HCIVER}}}, + {UI_LABEL, PADCFG_HCIVER, 1, 1, -1, -45, 0, {.label = {"", -1}}}, + {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_LMPVER}}}, + {UI_LABEL, PADCFG_LMPVER, 1, 1, -1, -45, 0, {.label = {"", -1}}}, + {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_MANUFACTURER}}}, + {UI_LABEL, PADCFG_MANID, 1, 1, -1, -45, 0, {.label = {"", -1}}}, + {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_SUPFEATURES}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"00.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 0, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"08.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 8, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"16.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 16, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"24.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 24, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"32.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 32, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"40.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 40, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"48.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 48, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"56.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 56, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"01.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 1, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"09.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 9, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"17.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 17, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"25.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 25, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"33.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 33, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"41.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 41, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"49.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 49, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"57.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 57, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"02.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 2, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"10.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 10, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"18.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 18, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"26.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 26, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"34.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 34, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"42.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 42, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"50.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 50, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"58.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 58, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"03.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 3, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"11.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 11, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"19.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 19, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"27.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 27, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"35.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 35, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"43.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 43, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"51.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 51, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"59.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 59, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"04.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 4, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"12.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 12, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"20.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 20, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"28.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 28, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"36.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 36, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"44.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 44, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"52.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 52, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"60.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START+ 60, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"05.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 5, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"13.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 13, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"21.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 21, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"29.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 29, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"37.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 37, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"45.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 45, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"53.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 53, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"61.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 61, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"06.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 6, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"14.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 14, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"22.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 22, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"30.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 30, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"38.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 38, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"46.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 46, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"54.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 54, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"62.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 62, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"07.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 7, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"15.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 15, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"23.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 23, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"31.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 31, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"39.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 39, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"47.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 47, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"55.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 55, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_LABEL, 0, 1, 1, -1, -4, 0, {.label = {"63.", -1}}}, + {UI_LABEL, PADCFG_FEAT_START + 63, 0, 1, -1, -7, 0, {.label = {"", -1}}}, + {UI_BREAK}, + {UI_BREAK}, + + {UI_LABEL, PADCFG_BT_SUPPORTED, 1, 1, -1, -45, 0, {.label = {"", -1}}}, + {UI_BREAK}, {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, // end of dialog diff --git a/src/elmsupport.c b/src/elmsupport.c index 820f408dd..085c94a85 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -74,8 +74,8 @@ static int elmUpdateItemList(void) { if (configElm != NULL) configFree(configElm); - //Try MC?:/OPL/conf_elm.cfg - snprintf(path, sizeof(path), "%s/conf_elm.cfg", gBaseMCDir); + //Try MC?:/OPL/conf_elms.cfg + snprintf(path, sizeof(path), "%s/conf_elms.cfg", gBaseMCDir); configElm = configAlloc(CONFIG_ELM, NULL, path); ret = configRead(configElm); @@ -84,7 +84,7 @@ static int elmUpdateItemList(void) { if (configElm != NULL){ configFree(configElm); } - snprintf(path, sizeof(path), "%sconf_elm.cfg", hddGetPrefix()); + snprintf(path, sizeof(path), "%sconf_elms.cfg", hddGetPrefix()); configElm = configAlloc(CONFIG_ELM, NULL, path); ret = configRead(configElm); } @@ -94,7 +94,7 @@ static int elmUpdateItemList(void) { if (configElm != NULL){ configFree(configElm); } - snprintf(path, sizeof(path), "%sconf_elm.cfg", ethGetPrefix()); + snprintf(path, sizeof(path), "%sconf_elms.cfg", ethGetPrefix()); configElm = configAlloc(CONFIG_ELM, NULL, path); ret = configRead(configElm); } @@ -104,7 +104,7 @@ static int elmUpdateItemList(void) { if (configElm != NULL){ configFree(configElm); } - snprintf(path, sizeof(path), "%sconf_elm.cfg", usbGetPrefix()); + snprintf(path, sizeof(path), "%sconf_elms.cfg", usbGetPrefix()); configElm = configAlloc(CONFIG_ELM, NULL, path); ret = configRead(configElm); } diff --git a/src/gui.c b/src/gui.c index f5e69a7f2..403875a4d 100644 --- a/src/gui.c +++ b/src/gui.c @@ -25,8 +25,8 @@ #include "include/pgcht.h" #endif #ifdef PADEMU -#include -#include +#include +#include #endif #include @@ -667,14 +667,41 @@ void guiShowCheatConfig(void) #endif #ifdef PADEMU + +//from https://www.bluetooth.com/specifications/assigned-numbers/host-controller-interface +static char *bt_ver_str[] = { + "1.0b", + "1.1", + "1.2", + "2.0 + EDR", + "2.1 + EDR", + "3.0 + HS", + "4.0", + "4.1", + "4.2", + "5.0", +}; + +static const char *PadEmuPorts_enums[][5] = { + {"1P", "2P", NULL, NULL, NULL}, + {"1A", "1B", "1C", "1D", NULL}, + {"2A", "2B", "2C", "2D", NULL}, +}; + static u8 ds3_mac[6]; static u8 dg_mac[6]; static char ds3_str[18]; static char dg_str[18]; +static char vid_str[4]; +static char pid_str[4]; +static char rev_str[4]; +static char hci_str[26]; +static char lmp_str[26]; +static char man_str[4]; static int ds3macset = 0; static int dgmacset = 0; static int dg_discon = 0; - +static int ver_set = 0, feat_set = 0; static int PadEmuSettings = 0; static char *bdaddr_to_str(u8 *bdaddr, char *addstr) @@ -693,9 +720,26 @@ static char *bdaddr_to_str(u8 *bdaddr, char *addstr) return addstr; } +static char *hex_to_str(u8 *str, u16 hex) +{ + sprintf(str, "%04X", hex); + + return str; +} + +static char *ver_to_str(u8 *str, u8 ma, u16 mi) +{ + if (ma > 9) + ma = 0; + + sprintf(str, "%X.%04X BT %s", ma, mi, bt_ver_str[ma]); + + return str; +} + static int guiPadEmuUpdater(int modified) { - int PadEmuEnable, PadEmuMode, PadPort, PadEmuVib, PadEmuPort; + int PadEmuEnable, PadEmuMode, PadPort, PadEmuVib, PadEmuPort, PadEmuMtap, PadEmuMtapPort, PadEmuWorkaround; static int oldPadPort; diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_ENABLE, &PadEmuEnable); @@ -704,10 +748,16 @@ static int guiPadEmuUpdater(int modified) diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_PORT, &PadEmuPort); diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_VIB, &PadEmuVib); + diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_MTAP, &PadEmuMtap); + diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_MTAP_PORT, &PadEmuMtapPort); + diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_WORKAROUND, &PadEmuWorkaround); + + diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_MTAP, PadEmuEnable); + diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_MTAP_PORT, PadEmuMtap); + diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_MODE, PadEmuEnable); diaSetEnabled(diaPadEmuConfig, PADCFG_PADPORT, PadEmuEnable); - diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_PORT, PadEmuEnable); diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_VIB, PadEmuPort & PadEmuEnable); diaSetVisible(diaPadEmuConfig, PADCFG_USBDG_MAC, PadEmuMode & PadEmuEnable); @@ -718,26 +768,44 @@ static int guiPadEmuUpdater(int modified) diaSetVisible(diaPadEmuConfig, PADCFG_PAD_MAC_STR, PadEmuMode & PadEmuEnable); diaSetVisible(diaPadEmuConfig, PADCFG_PAIR_STR, PadEmuMode & PadEmuEnable); + diaSetVisible(diaPadEmuConfig, PADCFG_BTINFO, PadEmuMode & PadEmuEnable); + diaSetVisible(diaPadEmuConfig, PADCFG_PADEMU_WORKAROUND, PadEmuMode & PadEmuEnable); + diaSetVisible(diaPadEmuConfig, PADCFG_PADEMU_WORKAROUND_STR, PadEmuMode & PadEmuEnable); + if (modified) { + if (PadEmuMtap) { + diaSetEnum(diaPadEmuConfig, PADCFG_PADPORT, PadEmuPorts_enums[PadEmuMtapPort]); + diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_PORT, (PadPort == 0) & PadEmuEnable); + PadEmuSettings |= 0x00000E00; + } else { + diaSetEnum(diaPadEmuConfig, PADCFG_PADPORT, PadEmuPorts_enums[0]); + diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_PORT, PadEmuEnable); + PadEmuSettings &= 0xFFFF03FF; + if (PadPort > 1) { + PadPort = 0; + diaSetInt(diaPadEmuConfig, PADCFG_PADPORT, PadPort); + } + } + if (PadPort != oldPadPort) { - diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_PORT, (PadEmuSettings >> (8 + PadPort - 1)) & 1); - diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_VIB, (PadEmuSettings >> (16 + PadPort - 1)) & 1); + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_PORT, (PadEmuSettings >> (8 + PadPort)) & 1); + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_VIB, (PadEmuSettings >> (16 + PadPort)) & 1); oldPadPort = PadPort; } } - PadEmuSettings |= PadEmuMode | (PadEmuPort << (8 + PadPort - 1)) | (PadEmuVib << (16 + PadPort - 1)); - PadEmuSettings &= (~(!PadEmuMode) & ~(!PadEmuPort << (8 + PadPort - 1)) & ~(!PadEmuVib << (16 + PadPort - 1))); + PadEmuSettings |= PadEmuMode | (PadEmuPort << (8 + PadPort)) | (PadEmuVib << (16 + PadPort)) | (PadEmuMtap << 24) | ((PadEmuMtapPort - 1) << 25) | (PadEmuWorkaround << 26); + PadEmuSettings &= (~(!PadEmuMode) & ~(!PadEmuPort << (8 + PadPort)) & ~(!PadEmuVib << (16 + PadPort)) & ~(!PadEmuMtap << 24) & ~(!(PadEmuMtapPort - 1) << 25) & ~(!PadEmuWorkaround << 26)); if (PadEmuMode) { - if (ds3bt_get_status(0) & DS3BT_STATE_USB_CONFIGURED) { + if (ds34bt_get_status(0) & DS34BT_STATE_USB_CONFIGURED) { if (dg_discon) { dgmacset = 0; dg_discon = 0; } if (!dgmacset) { - if (ds3bt_get_bdaddr(dg_mac)) { + if (ds34bt_get_bdaddr(dg_mac)) { dgmacset = 1; diaSetLabel(diaPadEmuConfig, PADCFG_USBDG_MAC, bdaddr_to_str(dg_mac, dg_str)); } else { @@ -752,9 +820,9 @@ static int guiPadEmuUpdater(int modified) diaSetLabel(diaPadEmuConfig, PADCFG_USBDG_MAC, _l(_STR_NOT_CONNECTED)); } - if (ds3usb_get_status(0) & DS3USB_STATE_RUNNING) { + if (ds34usb_get_status(0) & DS34USB_STATE_RUNNING) { if (!ds3macset) { - if (ds3usb_get_bdaddr(0, ds3_mac)) { + if (ds34usb_get_bdaddr(0, ds3_mac)) { ds3macset = 1; diaSetLabel(diaPadEmuConfig, PADCFG_PAD_MAC, bdaddr_to_str(ds3_mac, ds3_str)); } else { @@ -770,19 +838,89 @@ static int guiPadEmuUpdater(int modified) return 0; } +static int guiPadEmuInfoUpdater(int modified) +{ + hci_information_t info; + u8 feat[8]; + int i, j; + u8 data; + int supported; + + if (ds34bt_get_status(0) & DS34BT_STATE_USB_CONFIGURED) { + if (!ver_set) { + if (ds34bt_get_version(&info)) { + ver_set = 1; + diaSetLabel(diaPadEmuInfo, PADCFG_VID, hex_to_str(vid_str, info.vid)); + diaSetLabel(diaPadEmuInfo, PADCFG_PID, hex_to_str(pid_str, info.pid)); + diaSetLabel(diaPadEmuInfo, PADCFG_REV, hex_to_str(rev_str, info.rev)); + diaSetLabel(diaPadEmuInfo, PADCFG_HCIVER, ver_to_str(hci_str, info.hci_ver, info.hci_rev)); + diaSetLabel(diaPadEmuInfo, PADCFG_LMPVER, ver_to_str(lmp_str, info.lmp_ver, info.lmp_subver)); + diaSetLabel(diaPadEmuInfo, PADCFG_MANID, hex_to_str(man_str, info.mf_name)); + } else { + ver_set = 0; + } + } + + if (!feat_set) { + if (ds34bt_get_features(feat)) { + feat_set = 1; + supported = 0; + for (i = 0, j = 0; i < 64; i++) { + data = (feat[j] >> (i - j * 8)) & 1; + diaSetLabel(diaPadEmuInfo, PADCFG_FEAT_START + i, _l(_STR_NO - data)); + j = (i + 1) / 8; + if (i == 25 || i == 26 || i == 39) { + if (data) + supported++; + } + } + if (supported == 3) + diaSetLabel(diaPadEmuInfo, PADCFG_BT_SUPPORTED, _l(_STR_BT_SUPPORTED)); + else + diaSetLabel(diaPadEmuInfo, PADCFG_BT_SUPPORTED, _l(_STR_BT_NOTSUPPORTED)); + } else { + feat_set = 0; + } + } + } else { + ver_set = 0; + feat_set = 0; + } + + return 0; +} + static void guiShowPadEmuConfig(void) { - const char *PadEmuModes[] = {_l(_STR_DS3USB_MODE), _l(_STR_DS3BT_MODE), NULL}; - int PadPort; + const char *PadEmuModes[] = {_l(_STR_DS34USB_MODE), _l(_STR_DS34BT_MODE), NULL}; + int PadEmuMtap, PadEmuMtapPort, PadEmuEnable, i; diaSetEnum(diaPadEmuConfig, PADCFG_PADEMU_MODE, PadEmuModes); + + PadEmuMtap = (PadEmuSettings >> 24) & 1; + PadEmuMtapPort = ((PadEmuSettings >> 25) & 1) + 1; diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_MODE, PadEmuSettings & 0xFF); - diaGetInt(diaPadEmuConfig, PADCFG_PADPORT, &PadPort); + diaSetInt(diaPadEmuConfig, PADCFG_PADPORT, 0); - diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_PORT, (PadEmuSettings >> (8 + PadPort - 1)) & 1); - diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_VIB, (PadEmuSettings >> (16 + PadPort - 1)) & 1); + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_PORT, (PadEmuSettings >> 8) & 1); + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_VIB, (PadEmuSettings >> 16) & 1); + + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_MTAP, PadEmuMtap); + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_MTAP_PORT, PadEmuMtapPort); + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_WORKAROUND, ((PadEmuSettings >> 26) & 1)); + + diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_ENABLE, &PadEmuEnable); + diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_PORT, PadEmuEnable); + + if (PadEmuMtap) { + diaSetEnum(diaPadEmuConfig, PADCFG_PADPORT, PadEmuPorts_enums[PadEmuMtapPort]); + PadEmuSettings |= 0x00000E00; + } else { + diaSetEnum(diaPadEmuConfig, PADCFG_PADPORT, PadEmuPorts_enums[0]); + PadEmuSettings &= 0xFFFF03FF; + } int result = -1; @@ -791,12 +929,28 @@ static void guiShowPadEmuConfig(void) if (result == PADCFG_PAIR) { if (ds3macset && dgmacset) { - if (ds3usb_get_status(0) & DS3USB_STATE_RUNNING) { - if (ds3usb_set_bdaddr(0, dg_mac)) + if (ds34usb_get_status(0) & DS34USB_STATE_RUNNING) { + if (ds34usb_set_bdaddr(0, dg_mac)) ds3macset = 0; } } } + + if (result == PADCFG_BTINFO) { + for (i = PADCFG_FEAT_START; i < PADCFG_FEAT_END + 1; i++) + diaSetLabel(diaPadEmuInfo, i, _l(_STR_NO)); + + diaSetLabel(diaPadEmuInfo, PADCFG_VID, _l(_STR_NOT_CONNECTED)); + diaSetLabel(diaPadEmuInfo, PADCFG_PID, _l(_STR_NOT_CONNECTED)); + diaSetLabel(diaPadEmuInfo, PADCFG_REV, _l(_STR_NOT_CONNECTED)); + diaSetLabel(diaPadEmuInfo, PADCFG_HCIVER, _l(_STR_NOT_CONNECTED)); + diaSetLabel(diaPadEmuInfo, PADCFG_LMPVER, _l(_STR_NOT_CONNECTED)); + diaSetLabel(diaPadEmuInfo, PADCFG_MANID, _l(_STR_NOT_CONNECTED)); + diaSetLabel(diaPadEmuInfo, PADCFG_BT_SUPPORTED, _l(_STR_NOT_CONNECTED)); + ver_set = 0; + feat_set = 0; + diaExecuteDialog(diaPadEmuInfo, -1, 1, &guiPadEmuInfoUpdater); + } if (result == UIID_BTN_OK) break; diff --git a/src/lang.c b/src/lang.c index db176fa8f..0fef10f36 100644 --- a/src/lang.c +++ b/src/lang.c @@ -228,12 +228,12 @@ static char *internalEnglish[LANG_STR_COUNT] = { #ifdef PADEMU "Configure PADEMU", "Pad Emulator Settings", - "Enable Pad Emulator", + "Enable PadEmulator", "Turns on/off PadEmulator for selected game.", "Pad Emulator mode", "Select Pad Emulator mode.", - "DualShock3 USB", - "DualShock3 BT", + "DualShock3/4 USB", + "DualShock3/4 BT", "Settings for port:", "Select Pad Emulator port for settings.", "Enable emulation", @@ -241,11 +241,27 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Enable vibration", "Turns on/off vibration for Pad Emulator selected port.", "Usb bluetooth adapter mac address:", - "DS3 Controller paired to mac address:", + "DS Controller paired to mac address:", "Pair", - "Pair DS3 controller", - "Pair DS3 controller with bluetooth adapter mac address.", + "Pair DS Controller", + "Pair DS Controller with bluetooth adapter mac address.", "Not connected", + "Bluetooth adapter information", + "Shows more information and supported features", + "HCI Version:", + "LMP Version:", + "Manufacturer ID:", + "Support features:", + "Yes", + "No", + "Bluetooth adapter should be fully compatible with DS3/DS4 controllers.", + "Bluetooth adapter may not work correctly with DS3/DS4 controllers.", + "Enable Multitap emulation", + "Turns on/off Multitap emulation for selected game.", + "Multitap emulator on port", + "Select port for Multitap emulation.", + "Disable workaround for fake ds3", + "Some fake ds3s need workaround, this option will disable it.", #endif //START of OPL_DB tweaks "ELF Loader Menu", diff --git a/src/pad.c b/src/pad.c index 38715b63d..f19d8a9b8 100644 --- a/src/pad.c +++ b/src/pad.c @@ -12,8 +12,8 @@ #include #ifdef PADEMU -#include -#include +#include +#include #endif #define MAX_PADS 4 @@ -192,13 +192,15 @@ static int readPad(struct pad_data_t *pad) int ret = padRead(pad->port, pad->slot, &pad->buttons); // port, slot, buttons newpdata = 0xffff ^ pad->buttons.btns; - if (ds3bt_get_status(pad->port) & DS3BT_STATE_RUNNING) { - ret = ds3bt_get_data(pad->port, (u8 *)&pad->buttons.btns); + if (ds34bt_get_status(pad->port) & DS34BT_STATE_RUNNING) { + ret = ds34bt_get_data(pad->port, (u8 *)&pad->buttons.btns); + ds34bt_set_rumble(pad->port, 0, 0); newpdata |= 0xffff ^ pad->buttons.btns; } - if (ds3usb_get_status(pad->port) & DS3USB_STATE_RUNNING) { - ret = ds3usb_get_data(pad->port, (u8 *)&pad->buttons.btns); + if (ds34usb_get_status(pad->port) & DS34USB_STATE_RUNNING) { + ret = ds34usb_get_data(pad->port, (u8 *)&pad->buttons.btns); + ds34usb_set_rumble(pad->port, 0, 0); newpdata |= 0xffff ^ pad->buttons.btns; } diff --git a/src/system.c b/src/system.c index e25a1d98a..74a125df9 100644 --- a/src/system.c +++ b/src/system.c @@ -17,8 +17,8 @@ #include "../ee_core/include/modules.h" #ifdef PADEMU -#include -#include +#include +#include #endif #ifdef VMC @@ -113,11 +113,11 @@ extern void *pusbd_irx; extern int size_pusbd_irx; #ifdef PADEMU -extern void *ds3bt_irx; -extern int size_ds3bt_irx; +extern void *ds34bt_irx; +extern int size_ds34bt_irx; -extern void *ds3usb_irx; -extern int size_ds3usb_irx; +extern void *ds34usb_irx; +extern int size_ds34usb_irx; extern void *bt_pademu_irx; extern int size_bt_pademu_irx; @@ -236,8 +236,8 @@ void sysInitDev9(void) void sysReset(int modload_mask) { #ifdef PADEMU - ds3usb_reset(); - ds3bt_reset(); + ds34usb_reset(); + ds34bt_reset(); #endif fileXioExit(); SifExitIopHeap(); @@ -313,15 +313,15 @@ void sysReset(int modload_mask) #ifdef PADEMU int ds3pads = 1; //only one pad enabled - ds3usb_deinit(); - ds3bt_deinit(); + ds34usb_deinit(); + ds34bt_deinit(); if (modload_mask & SYS_LOAD_USB_MODULES) { - sysLoadModuleBuffer(&ds3usb_irx, size_ds3usb_irx, 4, (char *)&ds3pads); - sysLoadModuleBuffer(&ds3bt_irx, size_ds3bt_irx, 4, (char *)&ds3pads); + sysLoadModuleBuffer(&ds34usb_irx, size_ds34usb_irx, 4, (char *)&ds3pads); + sysLoadModuleBuffer(&ds34bt_irx, size_ds34bt_irx, 4, (char *)&ds3pads); - ds3usb_init(); - ds3bt_init(); + ds34usb_init(); + ds34bt_init(); } #endif @@ -416,8 +416,8 @@ int sysGetDiscID(char *hexDiscID) void sysExecExit() { #ifdef PADEMU - ds3usb_reset(); - ds3bt_reset(); + ds34usb_reset(); + ds34bt_reset(); #endif Exit(0); } @@ -787,8 +787,8 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo #endif #ifdef PADEMU -#define PADEMU_SPECIFIER " %d, %d" -#define PADEMU_ARGUMENT , gEnablePadEmu, (gPadEmuSettings >> 8) +#define PADEMU_SPECIFIER " %d, %u" +#define PADEMU_ARGUMENT , gEnablePadEmu, (unsigned int)(gPadEmuSettings >> 8) #else #define PADEMU_SPECIFIER #define PADEMU_ARGUMENT @@ -835,8 +835,8 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo } #ifdef PADEMU - ds3usb_reset(); - ds3bt_reset(); + ds34usb_reset(); + ds34bt_reset(); #endif // Let's go. fileXioExit(); From c67797edb56eeadb8d0e82ee08e6d9a657ffbf10 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 11 Jan 2018 18:28:27 -0800 Subject: [PATCH 072/269] AKuHAK/new_sync / Lang Updates --- DETAILED_CHANGELOG | 1 + lng/lang_Arabic.lng | 34 +++- lng/lang_Bulgarian.lng | 36 +++- lng/lang_Czech.lng | 36 +++- lng/lang_Danish.lng | 32 +++- lng/lang_Dutch.lng | 30 ++- lng/lang_English.lng | 28 ++- lng/lang_Filipino.lng | 34 +++- lng/lang_French.lng | 34 +++- lng/lang_German.lng | 32 +++- lng/lang_Greek.lng | 32 +++- lng/lang_Hungarian.lng | 44 +++-- lng/lang_Indonesian.lng | 34 +++- lng/lang_Italian.lng | 32 +++- lng/lang_Japanese.lng | 30 ++- lng/lang_Korean.lng | 32 +++- lng/lang_Laotian.lng | 36 +++- lng/lang_Polish.lng | 36 +++- lng/lang_Portuguese.lng | 36 +++- lng/lang_Portuguese_BR.lng | 282 +++++++++++++++-------------- lng/lang_Russian.lng | 34 +++- lng/lang_Spanish.lng | 34 +++- lng/lang_Swedish.lng | 34 +++- lng/lang_TChinese.lng | 34 +++- lng/lang_Turkish.lng | 36 +++- modules/debug/ps2link/Makefile | 5 - modules/debug/ps2link/cmdHandler.c | 19 +- modules/debug/ps2link/hostlink.h | 12 -- modules/debug/ps2link/net_fio.c | 25 ++- 29 files changed, 736 insertions(+), 388 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 0dec722ee..614bc2011 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1030 - Jay-Jay-OPL - belek666 added the following pademu changes: - add ds4 support to ds3 modules - new design for bt modules - multitap emulation - Tue Oct 17 14:27:21 2017 -0700 rev1029 - Jay-Jay-OPL - update changelog in order to git a new OPL revision during compile - Sat Oct 7 15:36:10 2017 -0700 rev1028 - danielb7390 - Add the functionality to have different main/info page on ELM page. (#4) - Sat Oct 7 15:30:57 2017 -0700 rev1027 - Jay-Jay-OPL - revert changes to elfldr.c to fix an issue with loading APPS from Internal HDDs - Wed Sep 27 21:04:02 2017 -0700 diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 8732f0816..fc1a8519c 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,7 +1,7 @@ # translation by alimadhi -# Last update: 08/12/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/18/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s حفظ التغييرات @@ -214,12 +214,12 @@ FMV اجتياز يتم عرضها فقط لشعار القرص الصالح للاجهزة المطابقة لنفس المنطقة تكوين PADEMU اعدادات محاكي اليدة -تمكين محاكي اليدة +تمكين محاكي تحكم تشغيل/ايقاف محاكي اليدة لتحديد لعبة وضع محاكي اليدة اختيار وضع محاكي اليدة -DualShock3 USB -DualShock3 BT +تحكم بلي ستيشن 3/4 يو-اس-بي +تحكم بلي ستيشن 3/4 بلوتوث اعدادات المخرج: تحديد مخرج محاكي اليدة للاعدادات. تمكين المحاكي @@ -227,10 +227,26 @@ DualShock3 BT تمكيل الاهتزاز تشغيل/ايقاف الاهتزاز لاختيار مخرج محاكي اليدة عنوان الماك لمحول اليواسبي البلوتوث -اقتران DS3التحكم بال العنوان الماك +اقتران التحكم الى عنوان الماك: اقتران -اقتران التحكم DS3 -اقتران التحكممع البلوتوث +تزاوج التحكم +تزاوج التحكم مع عنوان محول البلوتوث غير متصل +معلومات محول البلوتوث +لعرض المزيد من المعلومات والميزات المدعومة +HCI الاصدار: +LMP الاصدار: +صانع الاي دي: +ميزات الدعم: +نعم +لا +يجب أن يكون محول بلوتوث متوافقة تماما مع وحدات التحكم DS3 / DS4. +قد لا يعمل محول بلوتوث بشكل صحيح مع وحدات التحكم DS3 / DS4. +تمكين محاكاة تعدد الإرسال +تشغيل / إيقاف محاكاة متعددة التحركات من اجل لعبة مختارة. +نقر متعدد المحاكي على المنفذ +اختر منفذ من اجل نقر متعدد المحاكي +تعطيل الحل لوحدة التحكم الوهمية +بعض التحكمات تحتاج الى حل، سيؤدي هذا الخيار تعطيله قائمة مشغلات ELF مخصص ELF \ No newline at end of file diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 5f93fab40..2b8baec9d 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,7 +1,7 @@ # translation by vsub and wisi -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s Запазване на промените @@ -214,23 +214,39 @@ PS2 Logo Активно само при валидно лого на диска, съвпадащо с региона на конзолата. Configure PADEMU Pad Emulator Settings -Enable Pad Emulator +Enable PadEmulator Turns on/off PadEmulator for selected game. Pad Emulator mode Select Pad Emulator mode. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Settings for port: Select Pad Emulator port for settings. Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: +USB bluetooth adapter MAC address: +DS Controller paired to MAC address: Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. +Pair DS controller +Pair DS controller with Bluetooth adapter MAC address. Not connected +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index 0d9a88898..01f6191a2 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,7 +1,7 @@ # Translated by jimmysmith -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s Uložit změny @@ -214,23 +214,39 @@ PS2 Logo Zobrazováno pouze u validního loga disku, který má stejný region jako konzole Configure PADEMU Pad Emulator Settings -Enable Pad Emulator +Enable PadEmulator Turns on/off PadEmulator for selected game. Pad Emulator mode Select Pad Emulator mode. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Settings for port: Select Pad Emulator port for settings. Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -Usb bluetooth adapter mac address: -DS3 Controller paired to mac address: +USB bluetooth adapter MAC address: +DS Controller paired to MAC address: Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter mac address. +Pair DS controller +Pair DS controller with Bluetooth adapter MAC address. Not connected +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELF Loader Menu ELF Loader Menu mód \ No newline at end of file diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index a3a3f13dd..4b287ef9c 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,7 +1,7 @@ # Translation by BongKris -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/19/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s Gem indstillinger @@ -218,8 +218,8 @@ Aktivér Pad Emulator Slå Pad Emulator Til/Fra for valgte spil. Pad Emulator tilstand Vælg Pad Emulator tilstand. -DualShock 3 USB -DualShock 3 BT +DualShock3/4 USB +DualShock3/4 BT indstillinger for port: Vælg Pad Emulator port for indstillinger. Aktivér emulering @@ -227,10 +227,26 @@ Slå Pad Emulator Til/Fra for valgte port. Aktivér vibration Slå vibration Til/Fra for valgte Pad Emulator port. USB-bluetooth adapter MAC-adresse: -DS3-controller parret til MAC-adresse: +DS controller parret med MAC-adresse: Parring -Pardan DS3 controller -Pardan DS3 controller med bluetooth adapters MAC-adresse. +Pardan DS controller +Pardan DS controller med bluetooth-adapters MAC-adresse. Ikke tilsluttet +Bluetooth-adapteroplysninger +Viser mere information og understøttede funktioner +HCI Version: +LMP Version: +Fabrikant ID: +Understøttede funktioner: +Ja +Nej +Bluetooth-adapter skal være fuldt kompatibel med DS3/DS4 controllere. +Bluetooth-adapter fungerer muligvis ikke korrekt med DS3/DS4 controllere. +Aktivér Multitap-emulering +Slå Multitap-emulering Til/Fra for valgte spil. +Multitap Emulator på port +Vælg port til Multitap-emulering. +Deaktiver løsning for falsk DS3 +Nogle falske DS3'er har brug for en løsning, dette deaktivere den. ELF-Loader Menu ELF-Loader Menu visningstilstand \ No newline at end of file diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index 30c40e053..e8a6c8d39 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,7 +1,7 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: 08/24/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s Wijzigingen opslaan @@ -218,8 +218,8 @@ Pad-emulator inschakelen Schakelt Pad-emulator in/uit voor geselecteerde spel Pad-emulator modus Selecteer Pad-emulator modus. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Instellingen voor poort: Selecteer Pad-emulator poort voor instellingen. Emuleren inschakelen @@ -229,8 +229,24 @@ Schakelt vibratie in/uit voor Pad-emulator geselecteerde poort. USB-bluetoothadapter mac-adres: DS3-controller gepaard met mac-adres: Paar -Paar DS3-controller -Paar DS3-controller met bluetoothadapter mac-adres +Paar DS-controller +Paar DS-controller met bluetoothadapter mac-adres Niet verbonden +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELF-lader menu ELF-lader menu displaymodus \ No newline at end of file diff --git a/lng/lang_English.lng b/lng/lang_English.lng index d7bcf91d7..9a371d368 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -232,12 +232,12 @@ PS2 Logo Only displayed for a valid disc logo which matches the console's region Configure PADEMU Pad Emulator Settings -Enable Pad Emulator +Enable PadEmulator Turns on/off PadEmulator for selected game. Pad Emulator mode Select Pad Emulator mode. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Settings for port: Select Pad Emulator port for settings. Enable emulation @@ -245,10 +245,26 @@ Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. USB bluetooth adapter MAC address: -DS3 Controller paired to MAC address: +DS Controller paired to MAC address: Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter MAC address. +Pair DS controller +Pair DS controller with Bluetooth adapter MAC address. Not connected +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index c1e2542b0..390f739b1 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,7 +1,7 @@ # Translation by Ceed Lorenzo -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s I-save ang mga pagbabago @@ -214,12 +214,12 @@ PS2 Logo Only displayed for a valid disc logo which matches the console's region Configure PADEMU Pad Emulator Settings -Enable Pad Emulator +Enable PadEmulator Turns on/off PadEmulator for selected game. Pad Emulator mode Select Pad Emulator mode. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Settings for port: Select Pad Emulator port for settings. Enable emulation @@ -227,10 +227,26 @@ Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. USB bluetooth adapter MAC address: -DS3 Controller paired to MAC address: +DS Controller paired to MAC address: Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter MAC address. +Pair DS controller +Pair DS controller with Bluetooth adapter MAC address. Not connected +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 7acd0fc0c..1f961a732 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,7 +1,7 @@ # Translation by machiavel -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/20/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s Sauvegarder @@ -214,12 +214,12 @@ Logo PS2 S'affiche uniquement si le logo du disque est compatible avec la région de votre console Configurer PADEMU Options de PADEMU -Activer PADEMU +Activer PadEmulator Actve/désactive PADEMU pour ce jeu. Mode de PADEMU Sélectionner le mode de PADEMU. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Options du port: SSélectionner le port PADEMU pour les options. Activer l'émulation @@ -227,10 +227,26 @@ Active/désactive PADEMU pour ce port. Activer la vibration Active/désactive la vibration pour le port PADEMU sélectionné. Adress MAC de l'adapteur Bluetooth USB: -Contrôleur DS3 apairé à l'adresse MAC: +Contrôleur DS appairé à l'adresse MAC: Apairer -Apairer le contrôleur DS3 -Apairer l'adresse MAC du contrôleur Bluetooth DS3. +Appairer contrôleur DS +Appairer contrôleur DS avec l'adresse MAC de l'adaptateur Bluetooth. Non Connecté +Informations de l'adaptateur Bluetooth +Montrer plus d'informations et de fonctions supportées +Version HCI: +Version LMP: +ID Fabricant: +Fonctions supportées: +Oui +Non +L'adaptateur Bluetooth devrait être parfaitement compatible avec les contrôleurs DS3/DS4. +L'adaptateur Bluetooth peut ne pas fonctionner correctement avec les contrôleurs DS3/DS4 +Activer l'émulation du Multitap +Active/désactive l'émulation du Multitap pour le jeu sélectionné. +Émulateur Multitap sur le port +Sélectionner le port pour émuler le Multitap +Désactiver correctif des DS3 simulées +Certaines DS3 simulées nécessitent ce correctif, cette option le désactivera. Menu lanceur d'ELF Mode d'affichage du menu lanceur d'ELF \ No newline at end of file diff --git a/lng/lang_German.lng b/lng/lang_German.lng index e31b90eda..e97ab93cc 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,7 +1,7 @@ # German Translation by ps2guy and lopotri -# Last update: 08/13/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s Änderungen speichern @@ -218,8 +218,8 @@ Pad Emulator aktivieren Aktiviere/deaktiviere den Pad Emulator für das ausgewählte Spiel. Pad Emulator Modus Wähle Pad Emulator Modus -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Einstellungen für Anschluss: Wähle Pad Emulator Anschluss für die Einstellungen. Emulation aktivieren @@ -227,10 +227,26 @@ Aktiviert/deaktiviert den Pad Emulator für den ausgewählten Anschluss. Vibration aktivieren Aktiviert/deaktiviert die Vibration für den ausgewählten Anschluss. USB Bluetooth-Aadapter MAC-Adresse: -DS3 Controller verbunden zur MAC-Adresse: +DS Controller verbunden zur MAC-Adresse: Verbinden -Verbinde DS3 Controller -Verbinde DS3 Controller mit Bluetooth-Adapter MAC-Adresse. +Verbinde DS Controller +Verbinde DS Controller mit Bluetooth-Adapter MAC-Adresse. Nicht verbunden +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELF-starter Menü ELF-starter Menü Anzeigen \ No newline at end of file diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 7f6514012..9567936b3 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,7 +1,7 @@ # Greek Translation by RivalK93 -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s Αποθήκευση αλλαγών @@ -218,8 +218,8 @@ Patchάρισμα των παιχνιδιών από το PS2RD. Ενεργοποιεί/απενεργοποιεί τον προσομοιωτή για το συγκεκριμένο παιχνίδι. Τύπος προσομοίωσης Επιλέξτε τον τύπο προσομοίωσης του χειριστηρίου. -DualShock3 USB -DualShock3 BlueTooth +DualShock3/4 USB +DualShock3/4 BlueTooth Ρυθμίσεις για θύρα: Επιλέξτε θύρα προς ρύθμιση. Ενεργοποίηση προσομοίωσης @@ -227,10 +227,26 @@ DualShock3 BlueTooth Ενεργοποίηση δόνησης Ενεργοποιεί/απενεργοποιεί τη δόνηση για τη συγκεκριμένη θύρα. Διεύθυνση mac του προσαρμογέα BT: -Διεύθυνση mac του χειριστηρίου DS3: +Διεύθυνση mac του χειριστηρίου DS: Σύζευξη -Σύζευξη με χειριστήριο DualShock3 -Σύζευξη του προσαρμογέα BlueTooth με το χειριστήριο DualShock3. +Σύζευξη με χειριστήριο DualShock +Σύζευξη του προσαρμογέα BlueTooth με το χειριστήριο DualShock. Μη συνδεδεμένο +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELF Loader Εκκίνηση μενού ELF Loader \ No newline at end of file diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 83f0d3e12..8aefeb943 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,7 +1,7 @@ # Translation by co5oos -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/21/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s Változtatások mentése @@ -73,10 +73,10 @@ Manuális HDL szerver indítása HDL Szerver Elindul... HDL Szerver Fut... -Failed to start HDL Server. -HDL Server Unloading... -IGR path -Background color +Az HDL Szerver elindítása Sikertelen. +Az HDL Szerver kirakodása... +IGR útvonala +Háttér színe Szöveg szín - PS2 - - SMB Szerver - @@ -150,7 +150,7 @@ Infó Testreszabott ELF Szín szelekció Újracsatlakozás -Leave empty to list shares +Hagyja üresen a megosztások listázásához ETH előtag elérési út Backspace Szóköz @@ -214,12 +214,12 @@ PS2 Logó Csak egy érvényes lemez logónál jelenik meg, amely egyezik a konzol régiójával PADEMU konfigurálás Pad Emulator Beállítások -Pad Emulátor engedélyezése +PadEmulator Engedélyezése Be/ki kapcsolja a PadEmulátor-t a kiválaszott játékhoz. Pad Emulátor mód Válassza ki a Pad Emulátor módját. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Port beállítások: Válassza ki a Pad Emulátor portot a beállításokhoz. Emuláció engedélyezése @@ -227,10 +227,26 @@ Be/ki kapcsolja a Pad Emulátor-t a kiválasztott porthoz. Rezgés engedélyezése Be/ki kapcsolja a rezgést a Pad Emulátor kiválasztott portjához. Usb bluetooth adapter mac címe: -DS3 Kontroller párosítva erre a mac címre : +DS Kontroller a következő MAC címhez pároztatva: Párosítás -DS3 kontroller párosítása -DS3 kontroller párosítása bluetooth adapter mac címmel. +DS Kontroller Pároztatása +DS Kontroller Pároztatása Bluetooth adapter MAC címmel. Nincs csatlakoztatva +Bluetooth adapter információ +Több információ és támogatott funkciók mutátása +HCI Verzió: +LMP Verzió: +Gyártó ID: +Támogatási funkciók: +Igen +Nem +A Bluetooth adapternek teljes mértékben kompatibilisnek kell lennie a DS3/DS4 kontrollerekkel. +A Bluetooth adapter nem biztos, hogy megfelelően fog működni DS3/DS4 kontrollerekkel. +Multitap emuláció Engedélyezése +ki/be kapcsolja Multitap emulációt a kiválasztott játékhoz. +Multitap emulátor ezen a porton +Válassza ki a portot a Multitap emulációhoz. +Megkerülés letiltása a hamisítvány DS3-hoz. +Néhány hamis ds3-hoz megkerülés szükséges, ez az opció letiltja ezt. ELF Futtató Menü ELF Futtató Menü megjelenítési mód \ No newline at end of file diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 133f2acb3..2428ab5a2 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,7 +1,7 @@ # translated by verislasher and jbliz -# Last update: 08/11/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/18/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s Simpan Perubahan @@ -214,12 +214,12 @@ Logo PS2 Hanya ditampilkan untuk logo disc yang valid yang cocok dengan region konsol Konfigurasi PADEMU Pengaturan Stik Emulator -Aktifkan Stik Emulator +Aktifkan PadEmulator Hidup/matikan StikEmulator game dipilih. Mode Stik Emulator Pilih mode Stik Emulator. -USB DualShock3 -BT DualShock3 +DualShock3/4 USB +DualShock3/4 BT Pengaturan untuk port: Pilih port Emulasi Pad untuk diatur. Aktifkan emulasi @@ -227,10 +227,26 @@ Nyalakan/Matikan Emulasi Pad diport terpilih. Aktifkan getaran Nyalakan/Matikan getaran untuk Emulasi Pad diport terpilih. Alamat Mac Adaptor USB Bluetooth: -Kontrol DS3 terpasang pada alamat mac: +Pengontrol DS dipasangkan ke Alamat MAC: Pasang -Pasang Kontrol DS3 -Pasang Kontrol DS3 dengan alamat mac bluetooth. +Pasangan Pengontrol DS +Pasangan Pengontrol DS dengan adaptor Alamat MAC Bluetooth. Tidak terhubung +informasi adaptor Bluetooth +Tampilkan informasi lain dan fitur didukung +Versi HCI: +Versi LMP: +ID Pabrikan: +Dukungan fitur: +Ya +Tidak +adapter Bluetooth harus sepenuhnya cocok dengan Pengontrol DS3/DS4. +adapter Bluetooth mungkin tidak bekerja dengan benar dengan Pengontrol DS3/DS4. +Aktifkan emulasi Multitap +Aktifkan/NonAktifkan emulasi Multitap untuk game dipilih. +emulator Multitap pada port +Pilih port untuk emulasi Multitap. +Nonaktifkan solusi untuk DS3 palsu +beberapa ds3s palsu butuh solusi, opsi ini akan nonaktif. Menu peluncur ELF Mode Tampilan Menu Pemuat ELF \ No newline at end of file diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index ec25ed60d..27b4c2bd5 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,7 +1,7 @@ # Translation by jauffre and andre95d -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s Salva modifiche @@ -214,7 +214,7 @@ PS2 Logo Mostrato soltanto con un logo del disco valido e compatibile con la regione della console Configure PADEMU Pad Emulator Settings -Enable Pad Emulator +Enable PadEmulator Turns on/off PadEmulator for selected game. Pad Emulator mode Select Pad Emulator mode. @@ -226,11 +226,27 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -USB bluetooth adapter MAC address: -DS3 Controller paired to MAC address: +USB Bluetooth adapter MAC address: +DS Controller paired to MAC address: Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter MAC address. +Pair DS controller +Pair DS controller with Bluetooth adapter MAC address. Not connected +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. Menu ELF Loader Caricamento menu ELF Loader \ No newline at end of file diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index e3b06796b..8169f1f47 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,7 +1,7 @@ # Japanese Translation by yamamotonew -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s 設定を保存する @@ -218,8 +218,8 @@ PADEMU有効化 ゲーム毎にPADEMUの有効/無効を指定 PADEMUモード モードを選択 -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT ポート番号: PADEMUを適用するポートを指定 ポート毎設定 @@ -227,10 +227,26 @@ PADEMUを適用するポートを指定 振動の有効化 ポート毎に振動の有効/無効を指定 BluetoothアダプタのMACアドレス: -DS3のペア設定MACアドレス    : +DSのペア設定MACアドレス: ペア設定 DS3コントローラーをペア設定 -BluetoothのMACアドレスを指定してDS3コントローラーをペア設定 +BluetoothのMACアドレスを指定してDSコントローラーをペア設定 接続されていません +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELFローダーメニュー ELFローダー表示モード \ No newline at end of file diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 122f8512e..bb504e548 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,7 +1,7 @@ # Translated by DDinghoya -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s 저장 변경 @@ -218,8 +218,8 @@ PADEMU 구성 선택된 게임 패드에뮬레이터 켬/끔. 패드 에뮬레이터 모드 패드 에뮬레이터 모드 선택 -듀얼쇼크3 USB -듀얼쇼크3 BT +듀얼쇼크3/4 USB +듀얼쇼크3/4 BT 포트 설정: 설정용 패드 에뮬레이터 포트 활성화. 에뮬레이션 활성화 @@ -227,10 +227,26 @@ PADEMU 구성 진동 활성화 패드 에뮬레이터에 선택된 포트 진동 켬/끔 USB 블루투스 어답터 맥 주소: -DS3 컨트롤러 맥 주소와 페어링: +DS 컨트롤러 맥 주소와 페어링: 페어 -DS3 컨트롤러 페어링 -블루투스 어댑터 맥 주소가 있는 DS3 컨트롤러 페어 +DS 컨트롤러 페어링 +블루투스 어댑터 맥 주소가 있는 DS 컨트롤러 페어 연결되지 않음 +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELF 로더 메뉴 ELF 로더 메뉴 디스플레이 모드 \ No newline at end of file diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index 15065b951..8914d3ecf 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,7 +1,7 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s ບັນທຶກການປ່ຽນແປງ @@ -214,23 +214,39 @@ PS2 Logo ຈະຖືກສະແດງຜົນ ກໍຕໍ່ເມື່ອໂລໂກ້ຂອງແຜ່ນຖືກຕ້ອງ ແລະ ສອດຄ່ອງຕາມໂຊນຂອງເຄື່ອງ Configure PADEMU Pad Emulator Settings -Enable Pad Emulator +Enable PadEmulator Turns on/off PadEmulator for selected game. Pad Emulator mode Select Pad Emulator mode. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Settings for port: Select Pad Emulator port for settings. Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -USB bluetooth adapter MAC address: -DS3 Controller paired to MAC address: +USB Bluetooth adapter MAC address: +DS Controller paired to MAC address: Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter MAC address. +Pair DS controller +Pair DS controller with Bluetooth adapter MAC address. Not connected +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ເມນູສຳລັບຈັດການ ELF ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index 249833918..44135188d 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,7 +1,7 @@ # Translation by yohokaru -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s Zapisz zmiany @@ -214,23 +214,39 @@ Logo PS2 Pokaże się tylko jeśli region gry jest zgodny z regionem posiadanej konsoli. Configure PADEMU Pad Emulator Settings -Enable Pad Emulator +Enable PadEmulator Turns on/off PadEmulator for selected game. Pad Emulator mode Select Pad Emulator mode. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Settings for port: Select Pad Emulator port for settings. Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -USB bluetooth adapter MAC address: -DS3 Controller paired to MAC address: +USB Bluetooth adapter MAC address: +DS Controller paired to MAC address: Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter MAC address. +Pair DS controller +Pair DS controller with Bluetooth adapter MAC address. Not connected +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index d10fbb361..c727663c4 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,7 +1,7 @@ # Translation by danielb -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/21/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s Salvar alterações @@ -185,7 +185,7 @@ Definir compensação horizontal Ajuste vertical Definir compensação vertical Overscan -Overscan Adjustment +Ajustar Overscan Saltar FMV Saltar vídeos Opções de Cheat @@ -214,12 +214,12 @@ Logo PS2 Apenas é exibido para um disco válido e que seja da mesma região da consola Configurar PADEMU Definições do Emulador de Comando -Ativar Emulador de Comando +Ativar Emulador Comando Ligar/Desligar o emulador para o jogo selecionado. Modo do Emulador de Comando Selecione o modo do Emulador de Comando. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Definições para a porta: Selecione a porta do Emulador de Comando para as definições. Ativar emulação @@ -227,10 +227,26 @@ Ligar/Desligar o emulador para a porta selecionada. Ativar vibração. Ligar/Desligar vibração na porta selecionada. Endereço MAC do adaptador Bluetooth USB: -Endereço MAC do comando DS3 emparelhado: +Comando DS emparelhado ao endereço MAC: Emparelhar -Emparelhar comando DS3 -Emparelhar comando DS3 com o seguinte endereço MAC: +Emparelhar comando DS +Emparelhar comando DS com endereço MAC do adaptador Bluetooth. Não ligado +Informação do adaptador Bluetooth +Mostrar mais informação e recursos suportados +Versão HCI: +Versão LMP: +ID do Fabricante: +Recursos suportados: +Sim +Não +O adaptador Bluetooth deve ser completamente compatível com comandos DS3/DS4. +O adaptador Bluetooth pode não funcionar corretamente com comandos DS3/DS4. +Ativar emulação Multitap +Ligar/Desligar a emulação Multitap para o jogo selecionado +Emulador Multitap na porta +Selecionar porta para o emulador de Multitap. +Desativar workaround para clones DS3 +Alguns clones DS3 precisam de workaround, esta opção irá desativar-lo. Menu do Iniciador ELF Modo de exibição do iniciador de ELF \ No newline at end of file diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 84c4c13a3..7745d1e3c 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,86 +1,86 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/20/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s -Guardar Configurações +Salvar mudanças Voltar -Configurações de Rede +Configurar rede Opções avançadas -Configurações Guardadas -Erro ao guardar configurações! +Configurações salvas... +Erro ao salvar configurações! Sair -Configurações Gerais +Configurações Menu -Jogos em USB +Jogos no USB Jogos no HDD -Jogos na Rede +Jogos em REDE Aplicativos Tema Idioma -O sistema será desligado -Sair para o Navegador do PS2/OSDSYS? -Cancelar atualizações? -%d: O Disco Rígido não foi detectado -%d: O Disco Rígido não está formatado -%d: Erro ao iniciar rede -%d: Nenhum adaptador de rede foi detectado -%d: Não foi possível conectar ao servidor SMB -%d: Não foi possível logar no servidor SMB -%d: Não foi possível abrir o compartilhamento SMB -%d: Impossível listar compartilhamentos SMB -%d: Impossível listar jogos -%d: Servidor DHCP indisponível -%d: Sem conexão de rede -Ativ. -Desativ. -Confirmar -Eleger +O sistema será desligado. +Sair para o Navegador/OSDSYS? +Cancelar atualização? +Erro %d: Nenhum HD detectado. +Erro %d: O HD não está formatado. +Erro %d: Problemas na inicialização da rede. +Erro %d: Nenhum adaptador de rede detectado. +Erro %d: Impossível conexão com servidor SMB. +Erro %d: Impossível logar no servidor SMB. +Erro %d: Impossível abrir compartilhamento SMB. +Erro %d: Impossível listar compartilhamentos SMB. +Erro %d: Impossível listar os jogos. +Erro %d: Servidor DHCP indisponível. +Erro %d: Sem conexão de rede. +Ligado +Desligado +Concordar +Ação Cancelar O X -Lista de Jogos -Configurar -Apagar configurações -As configurações do jogo foram apagadas -Velocidade de rolagem +Lista de jogos +Ajustes +Remover todos os ajustes +Todos os ajustes do jogo foram removidos +Rolagem Lenta Média Rápida Menu padrão -Carregar do disco -Por favor espere +Iniciar a partir do disco +Espere por favor Erro ao carregar ID do jogo -Organizar em ordem alfabética +Ordenação automática Erro ao carregar arquivo de idioma -Desativar cores de depuração -Nenhum controle detectado, esperando... -Habilitar Artes de Capa -Tela Panorâmica -Desligar PS2 +Desativar depuração de cores +Controle não detectado, esperando... +Habilitar artes +Wide screen (Visão panorâmica) +Desligar Carregando configurações... -Guardando configurações... +Salvando configurações... Iniciar dispositivo Atualizar -Modo de inicio do USB -Modo de inicio do HDD -Modo de inicio da Rede -Modo de inicio de Aplicativos +Modo de início do dispositivo USB +Modo de início do dispositivo HDD +Modo de início do dispositivo REDE +Modo de início dos Aplicativos Automático Manual -Iniciar Servidor HDL -O Servidor HDL está sendo iniciado... -O Servidor HDL está sendo executado... -Falha ao iniciar Servidor HDL -O Servidor HDL está sendo encerrado... -Definir saída do IGR -Cor de fundo +Iniciar servidor HDL +Iniciando Servidor HDL... +Servidor HDL conectado... +Falha na inicialização do Servidor HDL. +Fechando servidor HDL... +Sair para +Cor do fundo Cor do texto - PS2 - - Servidor SMB - -Tipo de Endereço IP +Tipo de endereço IP Estático DHCP Endereço IP @@ -89,40 +89,40 @@ Máscara de sub-rede Gateway padrão Servidor DNS Porta -Compartilhamento +Nome do compartilhamento Usuário Senha - -Tipo de Endereço + +Tipo de endereço IP NetBIOS Confirmar -O item será apagado permanentemente! Continuar? +O item será permanentemente apagado! Deseja Continuar? Renomear -Apagar +Excluir Iniciar -Configurações de Tela -Ativar funções Apagar e Renomear -Verificar fragmentação de jogos em USB -Lembrar último jogo jogado -Botão de Seleção -Erro, o jogo está fragmentado +Definições de tela +Ativar ações de gravação +Checar fragmentação dos jogos no USB +Lembrar último jogo executado +Escolha o botão de ação ( X ou O ) +Erro, o jogo está fragmentado! Erro, não foi possível iniciar o item Testar -Deixar vazio para conectar como convidado (GUEST) -Leituras mais precisas -Modo de Sincronia +Deixar vazio para identificação como convidado (GUEST) +Simular precisão de leitura CD/DVD +Modo síncrono Desativar chamadas do sistema -Pular videos +Pular vídeos PSS Emular DVD-DL -Desativar IGR -Armazenamento elevado dos módulos -Esconder módulo DEV9 -Escolha o tamanho do VMC, caso já exista, alterar o tamanho irá reformatá-lo +Desabilitar IGR +Mudar módulo de armazenamento +Ocultar módulo dev9 +Alterar o tamanho (Irá reformatar o VMC!) Criar -Iniciar +Iniciar atualização Modificar -Cancelar +Abortar Resetar Usar genérico Configurar VMC @@ -132,35 +132,35 @@ Estado Progresso Arquivo VMC já existe Arquivo VMC inválido, o tamanho está incorreto -Arquivo VMC precisa ser criado -Erro com o VMC %s, continuar com Memory Card físico (slot %d) ? +Arquivo VMC precisa ser criado! +Erro com VMC %s, continuar com MC físico (entrada %d)? Atualização automática -Sobre +Informações do programa Desenvolvedores -Controle de Qualidade -Prefixo de caminho USB -Iniciar ELF Personalizado depois do IGR -Valor em minuto(s), 0 para desativar -Desligamento automático do HDD -Modo de Vídeo +Controle de qualidade +Prefixar uma pasta no USB +Inicia um ELF personalizado após o IGR +Valor em minuto(s), 0(zero) desabilita o spin down +Desligamento automático do HDD (spin down) +Modo de vídeo Cor do diálogo -Cor selecionada -Mostrar Página de Informação +Cor da seleção +Exibir página de informações Info -ELF personalizado -Seleção de Cor +Customizar ELF principal +Seleção de cor Reconectar -Deixar vazio para listar compartilhamentos -Prefixo de caminho de Rede +Deixe vazio para listar compartilhamentos +Prefixar uma pasta na REDE Apagar Espaço -Confirmar +Aceitar Modo -VMC Slot 1 -VMC Slot 2 -ID do Jogo +VMC entrada 1 +VMC entrada 2 +ID do jogo Modo DMA -Sincronização Vertical +Sincronização vertical da tela Modo 1 Modo 2 Modo 3 @@ -170,56 +170,56 @@ Modo 6 Modo 7 Modo 8 Configurar GSM -Modo de conexão Ethernet +Conexão de rede 100Mbit full-duplex 100Mbit half-duplex 10Mbit full-duplex 10Mbit half-duplex -Configurações do GSM +Configurações GSM Ativar GSM -Ativar ou Desativar o GSM -Modo de Vídeo -Força o Modo de Vídeo escolhido -Posição Horizontal +Autoriza o GSM a forçar o modo de vídeo selecionado abaixo +Selecione o modo de vídeo +Modo de vídeo a ser forçado Ajuste Horizontal -Posição Vertical +Define o ajuste horizontal da imagem na tela Ajuste Vertical +Define o ajuste vertical da imagem na tela Tela visível Define o ajuste da tela visível -Pular FMV -Pula os vídeos do jogo -Opções de Cheats (trapaças) -Ativar PS2RD Cheat Engine -Permitir que o PS2RD Cheat Engine injete códigos nos jogos -Modo do PS2RD Cheat Engine -Auto selecionar ou Selecionar Cheats (trapaças) -Auto selecionar Cheats (trapaças) -Selecionar Cheats (trapaças) -Erro: falha ao carregar arquivo de Cheats (trapaças) -Nenhum cheat (trapaça) encontrado -Baixar configurações -Atualização pela Internet -Baixar dados existentes novamente? -Falha na atualização -Falha ao conectar no servidor de atualização -Atualização concluída -Atualização cancelada -Baixar configurações pela Internet? +Pular vídeos FMV +Ignora vídeos no formato (FMV) +Configurar PS2RD +Ativar PS2RD +Autoriza o PS2RD a usar Cheats(Trapaças) nos seus jogos +Modo PS2RD +Auto seleção(Ativa todos) ou Selecione os Cheats do jogo +Auto seleção +Selecione os Cheats do jogo +Erro: Falha ao carregar o arquivo (Cheat) +Cheats não encontrados ou ilegíveis +Baixar arquivos(cfg) +Atualizar arquivos(cfg) +Baixar novamente os arquivos(cfg) existentes? +Atualização falhou. +Falha na conexão com o servidor(cfg). +Atualização concluída. +Atualização cancelada. +Baixar arquivos(cfg) do servidor? Configurações personalizadas -Configurações baixadas -Auto iniciar em %i s... +Arquivos(cfg) baixados +Auto iniciar em %i segundos Auto iniciar -Valor em segundo(s), 0 para desativar -Logotipo do PS2 -Aparece apenas se houver um logotipo válido que seja da mesma região que o console +Valor em segundo(s), 0(zero) desabilita o auto iniciar +Logo PS2 +(Aparece quando houver uma logo válida que seja da mesma região do PS2) Configurar PADEMU Configurações do Emulador de Controles Ativar Emulador de Controles Liga/desliga o Emulador de Controles para o jogo selecionado. Modo Emulador de Controles Selecione o modo do Emulador de Controles. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Configurações da porta: Selecione a porta que será configurada. Ativar emulação @@ -227,10 +227,26 @@ Liga/desliga a emulação na porta selecionada. Ativar vibração Liga/desliga a vibração na porta selecionada. Endereço MAC do adaptador Bluetooth USB: -Endereço MAC do Controle DS3 emparelhado: +Endereço MAC do Controle DS emparelhado: Emparelhar -Emparelhar Controle DS3: -Emparelha o Controle DS3 com o MAC do adaptador Bluetooth. +Emparelhar Controle DS: +Emparelha o Controle DS com o MAC do adaptador Bluetooth. Não conectado -ELF Loader Menu -Modo de inicio do ELF Loader Menu \ No newline at end of file +Informações do adaptador Bluetooth +Mostra mais informações e recursos suportados +Versão HCI: +Versão LMP: +ID do fabricante: +Recursos suportados: +Sim +Não +O adaptador Bluetooth deve ser totalmente compatível com os controles DS3/4. +O adaptador Bluetooth pode não funcionar corretamente com os controles DS3/4. +Ativar emulação Multitap +Liga/desliga a emulação Multitap para o jogo selecionado. +Emulador Multitap na porta +Selecione a porta para a emulação Multitap. +Desativar solução alternativa para Controle DS3 pirata +Alguns Controles DS3 piratas precisam de solução alternativa, esta opção irá desativá-lo. +Jogos em ELF +Modo de início dos jogos em ELF \ No newline at end of file diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 4c63c4e1d..fe852c20d 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,7 +1,7 @@ # Translated by druchapucha and frodosumkin -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/18/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s Сохранить настройки @@ -214,12 +214,12 @@ PS2 логотип Отображается экран, который запускается при запуске игрового диска Настроить PADEMU Настройки Pad эмулятора -Включить Pad эмулятор +Включить PadEmulator Вкл/вык Pad эмулятор для выбранной игры. Режим Pad эмулятора Выбрать режим Pad эмулятора. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Настройки для порта: Выбрать настройки для порта Pad эмулятора. Включить эмуляцию @@ -227,10 +227,26 @@ DualShock3 BT Включить вибрацию Вкл/вык вибрацию в выбранном порте Pad эмулятора. Usb bluetooth адаптер МАК адрес: -DS3 контроллер подключился к МАК адресу: +DS контроллер подключился к MAC-адресу: Подключение -Подключение DS3 контроллер -Подключение DS3 с bluetooth адаптер МАК адрес. +Подключён DS контроллер +Подключён DS контроллер с Bluetooth адаптером MAC-адрес. Не подключено +Bluetooth адаптер информация +Показать больше информации и поддерживаемые функции +HCI версия: +LMP версия: +ID производителя: +Поддерживаемые функции: +Да +Нет +Bluetooth адаптер должен быть полностью совместим с DS3/DS4 контроллерами. +Bluetooth адаптер может работать неправильно с DS3/DS4 контроллерами. +Включить Multitap эмуляцию +Выключатель вкл/выкл Multitap эмуляция для выбранной игры. +Multitap эмулятор на порте +Выбрать порт для Multitap эмуляции. +Отключить работу для фальшивого DS3 +Эту опцию нужно отключить, если DS3 фальшивый. Меню ELF Загрузчика Отобразить меню ELF Загрузчика \ No newline at end of file diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 7c0fce98a..5f0039b28 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,7 +1,7 @@ # Translation by lauchon22 -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/18/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s Guardar cambios @@ -214,12 +214,12 @@ PS2 Logo Solo se muestra con un disco válido en una consola de la misma región Configurar PADEMU Configurar el mando del emulador -Activar mando del emulador +Habilitar PadEmulator Activar/apagar el mando del emulador para el juego elegido Modo del mando del emulador Seleccione el modo del mando del emulador -DualShock3 USB -DualShock3 BlueTooth +DualShock3/4 USB +DualShock3/4 BT Configuración del puerto Seleccione el mando del emulador para ajustes Activar emulación @@ -227,10 +227,26 @@ Activar/apagar el mando del emulador en el puerto elegido Activar vibración Activar/apagar vibracion en el puerto elegido Dirección MAC del mando BlueTooth USB: -Dirección MAC del mando DS3 emparejado +Controlador DS emparejado a la dirección MAC: Emparejar -Emparejar mando DS3 -Emparejar mando DS3 con la siguiente dirección MAC: +Emparejar el controlador DS +Emparejar el controlador DS con la dirección MAC del adaptador Bluetooth. No conectado +Información del adaptador de Bluetooth +Mostrar más información y características compatibles +Versión de HCI: +Versión LMP: +ID del fabricante: +Características de soporte: +Sí +No +El adaptador Bluetooth debe ser totalmente compatible con los controladores DS3 / DS4. +Es posible que el adaptador Bluetooth no funcione correctamente con los controladores DS3 / DS4. +Habilitar la emulación del multitap +Enciende/apaga la emulación del multitap para el juego seleccionado. +Emulador multitap en el puerto +Seleccione el puerto para la emulación multitap. +Deshabilitar la solución provisional para DS3 falso +Algunos DS3 falsos necesitan solución, esta opción lo deshabilitará. ELF Loader Menu Modo inicio de menú de ELF Loader \ No newline at end of file diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index dfe8e44f4..65a02fc61 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,7 +1,7 @@ # Translation by Lord_Flaya -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s Spara ändringar @@ -214,12 +214,12 @@ PS2 Logo Visas bara när skivavbilden matchar konsolens region Konfigurera PADEMU Pad Emulator Inställningar -Aktivera Pad Emulator +Aktivera PadEmulator Slå av/på PadEmulator för valt spel. Pad Emulator läge Vlj Pad Emulator läge. -DualShock3 USB -DualShock3 BT +DualShock3 / 4 USB +DualShock3 / 4 BT Inställningar för port: Välj Pad Emulator port för inställningar. Aktivera emulation @@ -227,10 +227,26 @@ Slå av/på Pad Emulator för vald port. Aktivera vibration Slå av/på vibration för Pad Emulator vald port. Usb bluetooth adapter mac address: -DS3 Controller parkopplad till mac address: +DS Controller kopplad till MAC-adress: Parkoppla -Parkoppla DS3 controller -Parkoppla DS3 controller till bluetooth adapter mac address. +Para DS Controller +Para DS-kontroller med Bluetooth-adapter MAC-adress. Ej ansluten +Bluetooth-adapterinformation +Visar mer information och funktioner som stöds +HCI-version: +LMP-version: +Tillverkarens ID: +Supportfunktioner: +Ja +Nej +Bluetooth-adaptern ska vara fullt kompatibel med DS3 / DS4-kontroller. +Bluetooth-adaptern kanske inte fungerar korrekt med DS3 / DS4-kontroller. +Aktivera multitapemulering +Slår på / av multitap emulering för valt spel. +Multitap emulator på porten +Välj port för multitap emulering. +Inaktivera lösningen för falska DS3 +Några falska ds3s behöver lösningen, det här alternativet kommer att inaktivera det. ELF launcher meny ELF loader meny visningsläge \ No newline at end of file diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese.lng index a11363d8b..480cfb0da 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese.lng @@ -1,7 +1,7 @@ # Translated by kane159 -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s 保存設置 @@ -214,12 +214,12 @@ PS2 Logo Only displayed for a valid disc logo which matches the console's region Configure PADEMU Pad Emulator Settings -Enable Pad Emulator +Enable PadEmulator Turns on/off PadEmulator for selected game. Pad Emulator mode Select Pad Emulator mode. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Settings for port: Select Pad Emulator port for settings. Enable emulation @@ -227,10 +227,26 @@ Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. USB bluetooth adapter MAC address: -DS3 Controller paired to MAC address: +DS Controller paired to MAC address: Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter MAC address. +Pair DS controller +Pair DS controller with Bluetooth adapter MAC address. Not connected +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index 987bb2ab6..19ea8f392 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,7 +1,7 @@ # Translation by Gürkan DEMİR aka: dante -# Last update: 08/10/2017 -# Updated for OPL_1019_DB [f57bf5c] -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=13&t=3 +# Last update: 10/17/2017 +# Updated for OPL_1030_DB [c3257f5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s Değişiklikleri kaydet @@ -214,23 +214,39 @@ PS2 Logo Only displayed for a valid disc logo which matches the console's region Configure PADEMU Pad Emulator Settings -Enable Pad Emulator +Enable PadEmulator Turns on/off PadEmulator for selected game. Pad Emulator mode Select Pad Emulator mode. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Settings for port: Select Pad Emulator port for settings. Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -USB bluetooth adapter MAC address: -DS3 Controller paired to MAC address: +USB Bluetooth adapter MAC address: +DS Controller paired to MAC address: Pair -Pair DS3 controller -Pair DS3 controller with bluetooth adapter MAC address. +Pair DS controller +Pair DS controller with Bluetooth adapter MAC address. Not connected +Bluetooth adapter information +Shows more information and supported features +HCI Version: +LMP Version: +Manufacturer ID: +Support features: +Yes +No +Bluetooth adapter should be fully compatible with DS3/DS4 controllers. +Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Enable Multitap emulation +Turns on/off Multitap emulation for selected game. +Multitap emulator on port +Select port for Multitap emulation. +Disable workaround for fake DS3 +Some fake ds3s need workaround, this option will disable it. ELF Loader Menu ELF Loader Menu display mode \ No newline at end of file diff --git a/modules/debug/ps2link/Makefile b/modules/debug/ps2link/Makefile index 809e4475f..a2457096d 100755 --- a/modules/debug/ps2link/Makefile +++ b/modules/debug/ps2link/Makefile @@ -28,11 +28,6 @@ ifeq ($(PWOFFONRESET),1) IOP_CFLAGS += -DPWOFFONRESET endif -# Enable screenshot functionality -ifeq ($(SCREENSHOTS),1) -IOP_CFLAGS += -DSCREENSHOTS -endif - all: $(IOP_BIN) diff --git a/modules/debug/ps2link/cmdHandler.c b/modules/debug/ps2link/cmdHandler.c index 7ae8f859c..8d0796723 100644 --- a/modules/debug/ps2link/cmdHandler.c +++ b/modules/debug/ps2link/cmdHandler.c @@ -22,9 +22,6 @@ #include "ps2ip.h" #include "hostlink.h" -#define ntohl(x) htonl(x) -#define ntohs(x) htons(x) - #ifdef DEBUG #define dbgprintf(args...) printf(args) #else @@ -73,7 +70,7 @@ pkoExecIop(char *buf, int len) // Make sure arg vector is null-terminated cmd->argv[PKO_MAX_PATH - 1] = '\0'; - printf("IOP cmd: %d args\n", ntohl(cmd->argc)); + printf("IOP cmd: %ld args\n", ntohl(cmd->argc)); path = &cmd->argv[0]; args = &cmd->argv[strlen(cmd->argv) + 1]; @@ -257,15 +254,6 @@ pkoWriteMem(char *buf, int len) ret = pkoSendSifCmd(PKO_RPC_WRITEMEM, buf, len); }; -#ifdef SCREENSHOTS -static void -pkoScreenShot(char *buf, int len) -{ - int ret; - ret = pkoSendSifCmd(PKO_RPC_SCRSHOT, buf, len); -}; -#endif - ////////////////////////////////////////////////////////////////////////// static void cmdListener(int sock) @@ -337,11 +325,6 @@ cmdListener(int sock) case PKO_WRITE_MEM: pkoWriteMem(recvbuf, len); break; -#ifdef SCREENSHOTS - case PKO_SCRSHOT_CMD: - pkoScreenShot(recvbuf, len); - break; -#endif default: dbgprintf("IOP cmd: Uknown cmd received\n"); break; diff --git a/modules/debug/ps2link/hostlink.h b/modules/debug/ps2link/hostlink.h index 52b8a188c..a76e26381 100644 --- a/modules/debug/ps2link/hostlink.h +++ b/modules/debug/ps2link/hostlink.h @@ -46,7 +46,6 @@ #define PKO_GSEXEC_CMD 0xbabe020b #define PKO_WRITE_MEM 0xbabe020c #define PKO_IOPEXCEP_CMD 0xbabe020d -#define PKO_SCRSHOT_CMD 0xbabe020e #define PKO_RPC_RESET 1 #define PKO_RPC_EXECEE 2 @@ -60,7 +59,6 @@ #define PKO_RPC_GSEXEC 10 #define PKO_RPC_WRITEMEM 11 #define PKO_RPC_IOPEXCEP 12 -#define PKO_RPC_SCRSHOT 13 #define PKO_MAX_PATH 256 @@ -260,15 +258,5 @@ typedef struct unsigned int regs[79]; } __attribute__((packed)) pko_pkt_send_regs; -typedef struct -{ - unsigned int cmd; - unsigned short len; - unsigned int base; - unsigned int width; - unsigned int height; - unsigned short psm; -} __attribute__((packed)) pko_pkt_screenshot; - #define PKO_MAX_WRITE_SEGMENT (1460 - sizeof(pko_pkt_write_req)) #define PKO_MAX_READ_SEGMENT (1460 - sizeof(pko_pkt_read_rly)) diff --git a/modules/debug/ps2link/net_fio.c b/modules/debug/ps2link/net_fio.c index 68e71b85e..a85ccc6a6 100644 --- a/modules/debug/ps2link/net_fio.c +++ b/modules/debug/ps2link/net_fio.c @@ -20,9 +20,6 @@ #include "net_fio.h" #include "hostlink.h" -#define ntohl(x) htonl(x) -#define ntohs(x) htons(x) - unsigned int remote_pc_addr = 0xffffffff; #define PACKET_MAXSIZE 4096 @@ -196,7 +193,7 @@ int pko_open_file(char *path, int flags) openrly = (pko_pkt_file_rly *)recv_packet; - dbgprintf("pko_file: file open reply received (ret %d)\n", ntohl(openrly->retval)); + dbgprintf("pko_file: file open reply received (ret %ld)\n", ntohl(openrly->retval)); return ntohl(openrly->retval); } @@ -233,7 +230,7 @@ int pko_close_file(int fd) return -1; } - dbgprintf("pko_file: pko_close_file: close reply received (ret %d)\n", + dbgprintf("pko_file: pko_close_file: close reply received (ret %ld)\n", ntohl(closerly->retval)); return ntohl(closerly->retval); @@ -272,7 +269,7 @@ int pko_lseek_file(int fd, unsigned int offset, int whence) return -1; } - dbgprintf("pko_file: pko_lseek_file: lseek reply received (ret %d)\n", + dbgprintf("pko_file: pko_lseek_file: lseek reply received (ret %ld)\n", ntohl(lseekrly->retval)); return ntohl(lseekrly->retval); @@ -453,7 +450,7 @@ int pko_remove(char *name) } removerly = (pko_pkt_file_rly *)recv_packet; - dbgprintf("pko_file: file remove reply received (ret %d)\n", ntohl(removerly->retval)); + dbgprintf("pko_file: file remove reply received (ret %ld)\n", ntohl(removerly->retval)); return ntohl(removerly->retval); } @@ -490,7 +487,7 @@ int pko_mkdir(char *name, int mode) } mkdirrly = (pko_pkt_file_rly *)recv_packet; - dbgprintf("pko_file: make dir reply received (ret %d)\n", ntohl(mkdirrly->retval)); + dbgprintf("pko_file: make dir reply received (ret %ld)\n", ntohl(mkdirrly->retval)); return ntohl(mkdirrly->retval); } @@ -526,7 +523,7 @@ int pko_rmdir(char *name) } rmdirrly = (pko_pkt_file_rly *)recv_packet; - dbgprintf("pko_file: remove dir reply received (ret %d)\n", ntohl(rmdirrly->retval)); + dbgprintf("pko_file: remove dir reply received (ret %ld)\n", ntohl(rmdirrly->retval)); return ntohl(rmdirrly->retval); } @@ -564,7 +561,7 @@ int pko_open_dir(char *path) openrly = (pko_pkt_file_rly *)recv_packet; - dbgprintf("pko_file: dir open reply received (ret %d)\n", ntohl(openrly->retval)); + dbgprintf("pko_file: dir open reply received (ret %ld)\n", ntohl(openrly->retval)); return ntohl(openrly->retval); } @@ -602,7 +599,7 @@ int pko_read_dir(int fd, void *buf) dirrly = (pko_pkt_dread_rly *)recv_packet; - dbgprintf("pko_file: dir read reply received (ret %d)\n", ntohl(dirrly->retval)); + dbgprintf("pko_file: dir read reply received (ret %ld)\n", ntohl(dirrly->retval)); dirent = (fio_dirent_t *)buf; // now handle the return buffer translation, to build reply bit @@ -649,7 +646,7 @@ int pko_close_dir(int fd) return -1; } - dbgprintf("pko_file: dir close reply received (ret %d)\n", + dbgprintf("pko_file: dir close reply received (ret %ld)\n", ntohl(closerly->retval)); return ntohl(closerly->retval); @@ -711,8 +708,8 @@ int pko_file_serv(void *argv) continue; } - dbgprintf("Client connected from %x\n", - (int)client_addr.sin_addr.s_addr); + dbgprintf("Client connected from %lx\n", + client_addr.sin_addr.s_addr); remote_pc_addr = client_addr.sin_addr.s_addr; From 1ee6279f4a07ddc36a30072abc3d11172dd8521d Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 11 Jan 2018 18:57:10 -0800 Subject: [PATCH 073/269] sp193 Added workaround for bad GameStar adaptor to in-game ATAD code. --- DETAILED_CHANGELOG | 1 + modules/iopcore/cdvdman/atad.c | 26 ++++++++++++++++++-------- src/config.c | 2 +- src/elmsupport.c | 10 +++++----- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 614bc2011..7e0263d68 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1031 - Jay-Jay-OPL - AKuHAK/new_sync / Lang Updates - Thu Jan 11 18:28:27 2018 -0800 rev1030 - Jay-Jay-OPL - belek666 added the following pademu changes: - add ds4 support to ds3 modules - new design for bt modules - multitap emulation - Tue Oct 17 14:27:21 2017 -0700 rev1029 - Jay-Jay-OPL - update changelog in order to git a new OPL revision during compile - Sat Oct 7 15:36:10 2017 -0700 rev1028 - danielb7390 - Add the functionality to have different main/info page on ELM page. (#4) - Sat Oct 7 15:30:57 2017 -0700 diff --git a/modules/iopcore/cdvdman/atad.c b/modules/iopcore/cdvdman/atad.c index 263bfb19d..9fcad998a 100644 --- a/modules/iopcore/cdvdman/atad.c +++ b/modules/iopcore/cdvdman/atad.c @@ -50,6 +50,7 @@ extern int netlog_inited; #define VERSION "v1.2" extern char lba_48bit; +static u8 ata_gamestar_workaround = 0; static int ata_evflg = -1; @@ -110,14 +111,14 @@ static unsigned int ata_alarm_cb(void *unused); static void ata_set_dir(int dir); /* In v1.04, DMA was enabled in ata_set_dir() instead. */ -static void AtadPreDmaCb(int bcr, int dir) +static void ata_pre_dma_cb(int bcr, int dir) { USE_SPD_REGS; SPD_REG16(SPD_R_XFR_CTRL) |= 0x80; } -static void AtadPostDmaCb(int bcr, int dir) +static void ata_post_dma_cb(int bcr, int dir) { USE_SPD_REGS; @@ -138,9 +139,7 @@ static int ata_create_event_flag(void) int atad_start(void) { -#ifdef DEV9_DEBUG USE_SPD_REGS; -#endif iop_event_t event; int res = 1; @@ -153,6 +152,10 @@ int atad_start(void) } #endif + /* A GameStar masquerades as a SCPH-10281, but malfunctions if transfers are not done according to the old ps2atad design. + All official adaptors appear to have different values for these two registers, but not the GameStar. */ + ata_gamestar_workaround = (SPD_REG16(SPD_R_REV) == SPD_REG16(SPD_R_REV_3)); + event.attr = 0; event.bits = 0; ata_evflg = CreateEventFlag(&event); @@ -167,8 +170,10 @@ int atad_start(void) /* In v1.04, PIO mode 0 was set here. In late versions, it is set in ata_init_devices(). */ dev9RegisterIntrCb(1, &ata_intr_cb); dev9RegisterIntrCb(0, &ata_intr_cb); - dev9RegisterPreDmaCb(0, &AtadPreDmaCb); - dev9RegisterPostDmaCb(0, &AtadPostDmaCb); + if (!ata_gamestar_workaround) { + dev9RegisterPreDmaCb(0, &ata_pre_dma_cb); + dev9RegisterPostDmaCb(0, &ata_post_dma_cb); + } #ifdef VMC_DRIVER iop_sema_t smp; @@ -606,11 +611,16 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) } for (retries = 3; retries > 0; retries--) { + /* Due to the retry loop, put this call (for the GameStar workaround) here instead of the old location. */ + if (ata_gamestar_workaround) + ata_set_dir(dir); + if ((res = ata_io_start(buf, len, 0, len, sector, lcyl, hcyl, select, command)) != 0) break; /* Set up (part of) the transfer here. In v1.04, this was called at the top of the outer loop. */ - ata_set_dir(dir); + if (!ata_gamestar_workaround) + ata_set_dir(dir); res = ata_io_finish(); @@ -646,5 +656,5 @@ static void ata_set_dir(int dir) val = SPD_REG16(SPD_R_IF_CTRL) & 1; val |= (dir == ATA_DIR_WRITE) ? 0x4c : 0x4e; SPD_REG16(SPD_R_IF_CTRL) = val; - SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x6; //In v1.04, DMA was enabled here (0x86 instead of 0x6) + SPD_REG16(SPD_R_XFR_CTRL) = dir | (ata_gamestar_workaround ? 0x86 : 0x6); //In v1.04, DMA was enabled here (0x86 instead of 0x6) } diff --git a/src/config.c b/src/config.c index 19e94e7bf..3045c646d 100644 --- a/src/config.c +++ b/src/config.c @@ -161,7 +161,7 @@ void configInit(char *prefix) snprintf(path, sizeof(path), "%s/conf_apps.cfg", prefix); configAlloc(CONFIG_APPS, &configFiles[CONFIG_INDEX_APPS], path); //START of OPL_DB tweaks - snprintf(path, sizeof(path), "%s/conf_elms.cfg", prefix); + snprintf(path, sizeof(path), "%s/conf_elmz.cfg", prefix); configAlloc(CONFIG_ELM, &configFiles[CONFIG_INDEX_ELM], path); //END of OPL_DB tweaks snprintf(path, sizeof(path), "%s/conf_network.cfg", prefix); diff --git a/src/elmsupport.c b/src/elmsupport.c index 085c94a85..3309f1745 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -74,8 +74,8 @@ static int elmUpdateItemList(void) { if (configElm != NULL) configFree(configElm); - //Try MC?:/OPL/conf_elms.cfg - snprintf(path, sizeof(path), "%s/conf_elms.cfg", gBaseMCDir); + //Try MC?:/OPL/conf_elmz.cfg + snprintf(path, sizeof(path), "%s/conf_elmz.cfg", gBaseMCDir); configElm = configAlloc(CONFIG_ELM, NULL, path); ret = configRead(configElm); @@ -84,7 +84,7 @@ static int elmUpdateItemList(void) { if (configElm != NULL){ configFree(configElm); } - snprintf(path, sizeof(path), "%sconf_elms.cfg", hddGetPrefix()); + snprintf(path, sizeof(path), "%sconf_elmz.cfg", hddGetPrefix()); configElm = configAlloc(CONFIG_ELM, NULL, path); ret = configRead(configElm); } @@ -94,7 +94,7 @@ static int elmUpdateItemList(void) { if (configElm != NULL){ configFree(configElm); } - snprintf(path, sizeof(path), "%sconf_elms.cfg", ethGetPrefix()); + snprintf(path, sizeof(path), "%sconf_elmz.cfg", ethGetPrefix()); configElm = configAlloc(CONFIG_ELM, NULL, path); ret = configRead(configElm); } @@ -104,7 +104,7 @@ static int elmUpdateItemList(void) { if (configElm != NULL){ configFree(configElm); } - snprintf(path, sizeof(path), "%sconf_elms.cfg", usbGetPrefix()); + snprintf(path, sizeof(path), "%sconf_elmz.cfg", usbGetPrefix()); configElm = configAlloc(CONFIG_ELM, NULL, path); ret = configRead(configElm); } From 3ff7f8982bcde677c6c00c92fe733c43188c8ad3 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 13 Jan 2018 15:09:55 -0800 Subject: [PATCH 074/269] revert changes from: sp193 Added workaround for bad GameStar adaptor to in-game ATAD code. --- DETAILED_CHANGELOG | 1 + modules/iopcore/cdvdman/atad.c | 26 ++++++++------------------ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 7e0263d68..71a7dc77b 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1032 - Jay-Jay-OPL - sp193 Added workaround for bad GameStar adaptor to in-game ATAD code. - Thu Jan 11 18:57:10 2018 -0800 rev1031 - Jay-Jay-OPL - AKuHAK/new_sync / Lang Updates - Thu Jan 11 18:28:27 2018 -0800 rev1030 - Jay-Jay-OPL - belek666 added the following pademu changes: - add ds4 support to ds3 modules - new design for bt modules - multitap emulation - Tue Oct 17 14:27:21 2017 -0700 rev1029 - Jay-Jay-OPL - update changelog in order to git a new OPL revision during compile - Sat Oct 7 15:36:10 2017 -0700 diff --git a/modules/iopcore/cdvdman/atad.c b/modules/iopcore/cdvdman/atad.c index 9fcad998a..263bfb19d 100644 --- a/modules/iopcore/cdvdman/atad.c +++ b/modules/iopcore/cdvdman/atad.c @@ -50,7 +50,6 @@ extern int netlog_inited; #define VERSION "v1.2" extern char lba_48bit; -static u8 ata_gamestar_workaround = 0; static int ata_evflg = -1; @@ -111,14 +110,14 @@ static unsigned int ata_alarm_cb(void *unused); static void ata_set_dir(int dir); /* In v1.04, DMA was enabled in ata_set_dir() instead. */ -static void ata_pre_dma_cb(int bcr, int dir) +static void AtadPreDmaCb(int bcr, int dir) { USE_SPD_REGS; SPD_REG16(SPD_R_XFR_CTRL) |= 0x80; } -static void ata_post_dma_cb(int bcr, int dir) +static void AtadPostDmaCb(int bcr, int dir) { USE_SPD_REGS; @@ -139,7 +138,9 @@ static int ata_create_event_flag(void) int atad_start(void) { +#ifdef DEV9_DEBUG USE_SPD_REGS; +#endif iop_event_t event; int res = 1; @@ -152,10 +153,6 @@ int atad_start(void) } #endif - /* A GameStar masquerades as a SCPH-10281, but malfunctions if transfers are not done according to the old ps2atad design. - All official adaptors appear to have different values for these two registers, but not the GameStar. */ - ata_gamestar_workaround = (SPD_REG16(SPD_R_REV) == SPD_REG16(SPD_R_REV_3)); - event.attr = 0; event.bits = 0; ata_evflg = CreateEventFlag(&event); @@ -170,10 +167,8 @@ int atad_start(void) /* In v1.04, PIO mode 0 was set here. In late versions, it is set in ata_init_devices(). */ dev9RegisterIntrCb(1, &ata_intr_cb); dev9RegisterIntrCb(0, &ata_intr_cb); - if (!ata_gamestar_workaround) { - dev9RegisterPreDmaCb(0, &ata_pre_dma_cb); - dev9RegisterPostDmaCb(0, &ata_post_dma_cb); - } + dev9RegisterPreDmaCb(0, &AtadPreDmaCb); + dev9RegisterPostDmaCb(0, &AtadPostDmaCb); #ifdef VMC_DRIVER iop_sema_t smp; @@ -611,16 +606,11 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) } for (retries = 3; retries > 0; retries--) { - /* Due to the retry loop, put this call (for the GameStar workaround) here instead of the old location. */ - if (ata_gamestar_workaround) - ata_set_dir(dir); - if ((res = ata_io_start(buf, len, 0, len, sector, lcyl, hcyl, select, command)) != 0) break; /* Set up (part of) the transfer here. In v1.04, this was called at the top of the outer loop. */ - if (!ata_gamestar_workaround) - ata_set_dir(dir); + ata_set_dir(dir); res = ata_io_finish(); @@ -656,5 +646,5 @@ static void ata_set_dir(int dir) val = SPD_REG16(SPD_R_IF_CTRL) & 1; val |= (dir == ATA_DIR_WRITE) ? 0x4c : 0x4e; SPD_REG16(SPD_R_IF_CTRL) = val; - SPD_REG16(SPD_R_XFR_CTRL) = dir | (ata_gamestar_workaround ? 0x86 : 0x6); //In v1.04, DMA was enabled here (0x86 instead of 0x6) + SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x6; //In v1.04, DMA was enabled here (0x86 instead of 0x6) } From 01ddb89b6d49a42ed5be72412a65abc552e5b63c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 31 Jan 2018 17:07:11 -0800 Subject: [PATCH 075/269] SP193 - Added workaround for bad GameStar adaptor to in-game ATAD code. --- DETAILED_CHANGELOG | 1 + modules/iopcore/cdvdman/atad.c | 26 ++++++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 71a7dc77b..0a8521955 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1033 - Jay-Jay-OPL - revert changes from: sp193 Added workaround for bad GameStar adaptor to in-game ATAD code. - Sat Jan 13 15:09:55 2018 -0800 rev1032 - Jay-Jay-OPL - sp193 Added workaround for bad GameStar adaptor to in-game ATAD code. - Thu Jan 11 18:57:10 2018 -0800 rev1031 - Jay-Jay-OPL - AKuHAK/new_sync / Lang Updates - Thu Jan 11 18:28:27 2018 -0800 rev1030 - Jay-Jay-OPL - belek666 added the following pademu changes: - add ds4 support to ds3 modules - new design for bt modules - multitap emulation - Tue Oct 17 14:27:21 2017 -0700 diff --git a/modules/iopcore/cdvdman/atad.c b/modules/iopcore/cdvdman/atad.c index 263bfb19d..9fcad998a 100644 --- a/modules/iopcore/cdvdman/atad.c +++ b/modules/iopcore/cdvdman/atad.c @@ -50,6 +50,7 @@ extern int netlog_inited; #define VERSION "v1.2" extern char lba_48bit; +static u8 ata_gamestar_workaround = 0; static int ata_evflg = -1; @@ -110,14 +111,14 @@ static unsigned int ata_alarm_cb(void *unused); static void ata_set_dir(int dir); /* In v1.04, DMA was enabled in ata_set_dir() instead. */ -static void AtadPreDmaCb(int bcr, int dir) +static void ata_pre_dma_cb(int bcr, int dir) { USE_SPD_REGS; SPD_REG16(SPD_R_XFR_CTRL) |= 0x80; } -static void AtadPostDmaCb(int bcr, int dir) +static void ata_post_dma_cb(int bcr, int dir) { USE_SPD_REGS; @@ -138,9 +139,7 @@ static int ata_create_event_flag(void) int atad_start(void) { -#ifdef DEV9_DEBUG USE_SPD_REGS; -#endif iop_event_t event; int res = 1; @@ -153,6 +152,10 @@ int atad_start(void) } #endif + /* A GameStar masquerades as a SCPH-10281, but malfunctions if transfers are not done according to the old ps2atad design. + All official adaptors appear to have different values for these two registers, but not the GameStar. */ + ata_gamestar_workaround = (SPD_REG16(SPD_R_REV) == SPD_REG16(SPD_R_REV_3)); + event.attr = 0; event.bits = 0; ata_evflg = CreateEventFlag(&event); @@ -167,8 +170,10 @@ int atad_start(void) /* In v1.04, PIO mode 0 was set here. In late versions, it is set in ata_init_devices(). */ dev9RegisterIntrCb(1, &ata_intr_cb); dev9RegisterIntrCb(0, &ata_intr_cb); - dev9RegisterPreDmaCb(0, &AtadPreDmaCb); - dev9RegisterPostDmaCb(0, &AtadPostDmaCb); + if (!ata_gamestar_workaround) { + dev9RegisterPreDmaCb(0, &ata_pre_dma_cb); + dev9RegisterPostDmaCb(0, &ata_post_dma_cb); + } #ifdef VMC_DRIVER iop_sema_t smp; @@ -606,11 +611,16 @@ int ata_device_sector_io(int device, void *buf, u32 lba, u32 nsectors, int dir) } for (retries = 3; retries > 0; retries--) { + /* Due to the retry loop, put this call (for the GameStar workaround) here instead of the old location. */ + if (ata_gamestar_workaround) + ata_set_dir(dir); + if ((res = ata_io_start(buf, len, 0, len, sector, lcyl, hcyl, select, command)) != 0) break; /* Set up (part of) the transfer here. In v1.04, this was called at the top of the outer loop. */ - ata_set_dir(dir); + if (!ata_gamestar_workaround) + ata_set_dir(dir); res = ata_io_finish(); @@ -646,5 +656,5 @@ static void ata_set_dir(int dir) val = SPD_REG16(SPD_R_IF_CTRL) & 1; val |= (dir == ATA_DIR_WRITE) ? 0x4c : 0x4e; SPD_REG16(SPD_R_IF_CTRL) = val; - SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x6; //In v1.04, DMA was enabled here (0x86 instead of 0x6) + SPD_REG16(SPD_R_XFR_CTRL) = dir | (ata_gamestar_workaround ? 0x86 : 0x6); //In v1.04, DMA was enabled here (0x86 instead of 0x6) } From f311562c0dc025e438ff6fbb1cbeec5098d03d6b Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Wed, 7 Mar 2018 16:00:17 +0000 Subject: [PATCH 076/269] Pops ready (#6) * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Make the game list work. BUG: If the theme doesn't provide the mainELM/infoELM the entire theme disappears and only the game list shows in the ELM page. * Fix the last bug with the special ELM theme!!! * Replace tabs with spaces. * Add the comments to changed lines. * Change tabs to spaces! * Add support to launch VCDs directly from OPL. * Fixed bug in initImageInternalTexture * Add comments. Remove unused includes --- elfldr/elfldr.c | 177 ++++++++++++- include/config.h | 6 - include/lang.h | 4 + include/system.h | 3 + lng/lang_English.lng | 8 +- lng/lang_Portuguese.lng | 8 +- src/config.c | 4 - src/elmsupport.c | 555 ++++++++++++++++++++++++++++++++-------- src/gui.c | 12 +- src/hddsupport.c | 21 +- src/lang.c | 8 +- src/opl.c | 6 +- src/system.c | 50 +++- src/themes.c | 6 +- 14 files changed, 739 insertions(+), 129 deletions(-) diff --git a/elfldr/elfldr.c b/elfldr/elfldr.c index e8885e7e7..a4ced0545 100644 --- a/elfldr/elfldr.c +++ b/elfldr/elfldr.c @@ -14,6 +14,44 @@ #include #include +//START of OPL_DB tweaks +// ELF-loading stuff +#define ELF_MAGIC 0x464c457f +#define ELF_PT_LOAD 1 + + +//------------------------------ +typedef struct +{ + u8 ident[16]; // struct definition for ELF object header + u16 type; + u16 machine; + u32 version; + u32 entry; + u32 phoff; + u32 shoff; + u32 flags; + u16 ehsize; + u16 phentsize; + u16 phnum; + u16 shentsize; + u16 shnum; + u16 shstrndx; +} elf_header_t; +//------------------------------ +typedef struct +{ + u32 type; // struct definition for ELF program section header + u32 offset; + void *vaddr; + u32 paddr; + u32 filesz; + u32 memsz; + u32 flags; + u32 align; +} elf_pheader_t; +//END of OPL_DB tweaks + static inline void BootError(char *filename) { char *argv[2]; @@ -36,8 +74,140 @@ static inline void InitializeUserMemory(unsigned int start, unsigned int end) } } +//START of OPL_DB tweaks +unsigned int _strtoui(const char *p) +{ + if (!p) + return 0; + + int r = 0; + + while (*p) { + if ((*p < '0') || (*p > '9')) + return r; + + r = r * 10 + (*p++ - '0'); + } + + return r; +} + + + +void RunLoaderElf(char *filename,u8 *pElf) +{ + u8 *boot_elf; + elf_header_t *eh; + elf_pheader_t *eph; + void *pdata; + int i; + char *argv[2]; + int elfsize=0; + int boverlap; + int vaddr; + + /* NB: LOADER.ELF is embedded */ + boot_elf = (u8 *)pElf; + eh = (elf_header_t *)boot_elf; + if (_lw((u32)&eh->ident) != ELF_MAGIC) + while (1) + ; + eph = (elf_pheader_t *)(boot_elf + eh->phoff); + + // calc elf size + for (i = 0; i < eh->phnum; i++) { + if (eph[i].type != ELF_PT_LOAD) + continue; + + if( elfsize <(eph[i].offset+eph[i].filesz)){ + elfsize = eph[i].offset+eph[i].filesz; + } + } + // check for overlap + boverlap=0; + for (i = 0; i < eh->phnum; i++) { + if (eph[i].type != ELF_PT_LOAD) + continue; + vaddr = (int)eph[i].vaddr; + if( vaddr <((int)pElf)) { + if(vaddr+eph[i].memsz>((int)pElf)) + boverlap=1; + break; + } + + if( vaddr >((int)pElf)) { + if(vaddr+eph[i].memsz<((int)pElf)) + boverlap=1; + break; + } + } + if(boverlap) + { + u32 u; + u = (u32)pElf; + u = u >>20; + u = u+16; + + u = u&0x1F; + + if(u==0) + u=1; + if(u>24) + u=24; + u = u << 20; + u = u & ( 32*1024*1024-1); + + memcpy((void*)u,pElf,elfsize); + boot_elf = (u8 *)u; + + eh = (elf_header_t *)boot_elf; + if (_lw((u32)&eh->ident) != ELF_MAGIC) + while (1) + ; + eph = (elf_pheader_t *)(boot_elf + eh->phoff); + } + + /* Scan through the ELF's program headers and copy them into RAM, then + zero out any non-loaded regions. */ + for (i = 0; i < eh->phnum; i++) { + if (eph[i].type != ELF_PT_LOAD) + continue; + + pdata = (void *)(boot_elf + eph[i].offset); + memcpy(eph[i].vaddr, pdata, eph[i].filesz); + + if (eph[i].memsz > eph[i].filesz) + memset(eph[i].vaddr + eph[i].filesz, 0, + eph[i].memsz - eph[i].filesz); + } + + + + FlushCache(0); + FlushCache(2); + + argv[0] = filename; + ExecPS2((void *)eh->entry, 0, 1, argv); +} +//END of OPL_DB tweaks + + int main(int argc, char *argv[]) { + //START of OPL_DB tweaks + if(argc>0 && (argv[0][0]=='m') + && (argv[0][1]=='e') + && (argv[0][2]=='m') + && (argv[0][3]==':')) + { + // boot from memaddr ; + unsigned int n=_strtoui(&(argv[0][4])); + RunLoaderElf(argv[1],(void*)n); + BootError(argv[0]); + return 0; + } + //END of OPL_DB tweaks + int result; t_ExecData exd; @@ -57,7 +227,8 @@ int main(int argc, char *argv[]) if (result == 0 && exd.epc != 0) { //Final IOP reset, to fill the IOP with the default modules. - while (!SifIopReset("", 0)) { + + while (!SifIopReset(NULL, 0)) { }; FlushCache(0); @@ -66,13 +237,17 @@ int main(int argc, char *argv[]) while (!SifIopSync()) { }; + //Sync with the SIF library on the IOP, or it may crash the IOP kernel during the next reset (Depending on the how the next program initializes the IOP). SifInitRpc(0); //Load modules. SifLoadFileInit(); SifLoadModule("rom0:SIO2MAN", 0, NULL); SifLoadModule("rom0:MCMAN", 0, NULL); SifLoadModule("rom0:MCSERV", 0, NULL); + + SifLoadFileExit(); + SifExitRpc(); ExecPS2((void *)exd.epc, (void *)exd.gp, argc, argv); diff --git a/include/config.h b/include/config.h index 4a946b0ba..c17747eb0 100644 --- a/include/config.h +++ b/include/config.h @@ -6,9 +6,6 @@ enum CONFIG_INDEX { CONFIG_INDEX_OPL = 0, CONFIG_INDEX_LAST, CONFIG_INDEX_APPS, -//START of OPL_DB tweaks - CONFIG_INDEX_ELM, -//END of OPL_DB tweaks CONFIG_INDEX_NETWORK, CONFIG_INDEX_COUNT @@ -18,9 +15,6 @@ enum CONFIG_INDEX { #define CONFIG_OPL (1 << CONFIG_INDEX_OPL) #define CONFIG_LAST (1 << CONFIG_INDEX_LAST) #define CONFIG_APPS (1 << CONFIG_INDEX_APPS) -//START of OPL_DB tweaks -#define CONFIG_ELM (1 << CONFIG_INDEX_ELM) -//END of OPL_DB tweaks #define CONFIG_NETWORK (1 << CONFIG_INDEX_NETWORK) #define CONFIG_ALL 0xFF diff --git a/include/lang.h b/include/lang.h index 2d318d048..0133310a5 100644 --- a/include/lang.h +++ b/include/lang.h @@ -254,6 +254,10 @@ enum _STR_IDS { //START of OPL_DB tweaks _STR_ELM, _STR_ELMMODE, + _STR_ELM_LAUNCH_POPSTARTER_NOTFOUND, + _STR_ELM_LAUNCH_VCD_NOTFOUND, + _STR_ELM_RENAME_ERROR, + _STR_ELM_DELETE_ERROR, //END of OPL_DB tweaks LANG_STR_COUNT }; diff --git a/include/system.h b/include/system.h index c74663040..52b3547f8 100644 --- a/include/system.h +++ b/include/system.h @@ -26,6 +26,9 @@ void sysPowerOff(void); void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, MCEMU int EnablePS2Logo, unsigned int compatflags); int sysExecElf(char *path); +//START of OPL_DB tweaks +int sysExecElfWithParam(char *path,char *param); +//END of OPL_DB tweaks int sysLoadModuleBuffer(void *buffer, int size, int argc, char *argv); int sysCheckMC(void); #ifdef VMC diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 9a371d368..4a3bd23f3 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -266,5 +266,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ELF Loader Menu -ELF Loader Menu display mode \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error ocurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index c727663c4..44a2567f8 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -248,5 +248,9 @@ Emulador Multitap na porta Selecionar porta para o emulador de Multitap. Desativar workaround para clones DS3 Alguns clones DS3 precisam de workaround, esta opção irá desativar-lo. -Menu do Iniciador ELF -Modo de exibição do iniciador de ELF \ No newline at end of file +Jogos PS1 +Modo de inicio para Jogos PS1 +POPSTARTER.ELF não encontrado em '%s'! +Ficheiro VCD '%s' não encontrado! +Ocorreu um erro ao renomear o ficheiro. +Ocorreu um erro ao apagar o ficheiro \ No newline at end of file diff --git a/src/config.c b/src/config.c index 3045c646d..842fd31cc 100644 --- a/src/config.c +++ b/src/config.c @@ -160,10 +160,6 @@ void configInit(char *prefix) configAlloc(CONFIG_LAST, &configFiles[CONFIG_INDEX_LAST], path); snprintf(path, sizeof(path), "%s/conf_apps.cfg", prefix); configAlloc(CONFIG_APPS, &configFiles[CONFIG_INDEX_APPS], path); -//START of OPL_DB tweaks - snprintf(path, sizeof(path), "%s/conf_elmz.cfg", prefix); - configAlloc(CONFIG_ELM, &configFiles[CONFIG_INDEX_ELM], path); -//END of OPL_DB tweaks snprintf(path, sizeof(path), "%s/conf_network.cfg", prefix); configAlloc(CONFIG_NETWORK, &configFiles[CONFIG_INDEX_NETWORK], path); } diff --git a/src/elmsupport.c b/src/elmsupport.c index 3309f1745..5bb51c893 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -14,38 +14,86 @@ static int elmForceUpdate = 1; static int elmItemCount = 0; -static config_set_t *configElm; - // forward declaration static item_list_t elmItemList; -static struct config_value_t* elmGetConfigValue(int id) { - struct config_value_t* cur = configElm->head; +//Struct that holds information about a game +typedef struct ElmGame ElmGame; +struct ElmGame +{ + char title[ISO_GAME_NAME_MAX - GAME_STARTUP_MAX + 1 ]; + char ID[GAME_STARTUP_MAX + 1]; + char file[ISO_GAME_NAME_MAX + 1 + 50]; + + //Eg: smb0:POPS .. smb0:POPS9 - It's where the VCD is + //Eg: pfs0:POPS/ is where the ELF is and the fake launch path + char pathFolder[50]; + int sizeMB; + ElmGame *next; +}; - while (id--) { - cur = cur->next; +//The pointer to the first game in the list +static ElmGame *elmGameList = NULL; + +//The full path to the POPSTARTER.ELF file. Eg: smb0:POPS/POPSTARTER.ELF +char elmPathElfHdd[256]; +char elmPathElfUsb[256]; +char elmPathElfEth[256]; + +//Last modified for the folder +static unsigned char elmModifiedPrev[8]; + +//Frees the entire game list +static void elmGameListFree(){ + ElmGame* temp = NULL; + while ((temp = elmGameList) != NULL) { + elmGameList = elmGameList->next; + free(temp); } + LOG("elmGameListFree() Complete\n"); +} - return cur; +static void elmGameTitleAppendDevice(ElmGame *tempGame){ + if (!strncmp(tempGame->file,"hdd",3)){ + strcat(tempGame->title," [HDD]"); + }else if (!strncmp(tempGame->file,"mass",4)){ + strcat(tempGame->title," [USB]"); + }else{ + strcat(tempGame->title," [ETH]"); + } } -static char* elmGetELFName(char* name) { - // Looking for the ELF name - char* pos = strrchr(name, '/'); - if (!pos) - pos = strrchr(name, ':'); - if (pos) { - return pos + 1; +static int elmGameDuplicateTitleExists(ElmGame *inGame){ + ElmGame* tempGame = inGame->next; + int count = 0; + while (tempGame != NULL) { + if (strcmp(tempGame->title,inGame->title) == 0){ + elmGameTitleAppendDevice(tempGame); + count ++; + } + tempGame = tempGame->next; } + if (count > 0){ + elmGameTitleAppendDevice(inGame); + } + return count; +} - return name; +static struct ElmGame* elmGetGameInfo(int id) { + struct ElmGame* cur = elmGameList; + + while (id--) { + cur = cur->next; + } + + return cur; } void elmInit(void) { LOG("ELMSUPPORT Init\n"); + memset(elmModifiedPrev, 0, 8); elmForceUpdate = 1; configGetInt(configGetByType(CONFIG_OPL), "elm_frames_delay", &elmItemList.delay); - configElm = configGetByType(CONFIG_ELM); elmItemList.enabled = 1; } @@ -60,61 +108,232 @@ static int elmNeedsUpdate(void) { elmForceUpdate = 0; return 1; } + + if (elmGameList == NULL) + return 1; return 0; } +//Scans for POPSTARTER.ELF and VCD files in the given devPrefix. +static int elmScanVCDs(char* devPrefix){ + int count=0; //Game count + int fd,i; + iox_dirent_t record; + + LOG("elmScanVCDs()\n"); + + char currentPath[30]; + //POPS POPS0 POPS1 ... POPS9 + for (i=-1; i<10; i++){ + if (i == -1){ + snprintf(currentPath, sizeof(currentPath), "%sPOPS/", devPrefix); + }else{ + snprintf(currentPath, sizeof(currentPath), "%sPOPS%d/",devPrefix,i ); + } + LOG("currentPath = %s\n",currentPath); + + //Let's open the folder and search for the VCD files. + if ((fd = fileXioDopen(currentPath)) > 0) { + while (fileXioDread(fd, &record) > 0) { + int filename_len = strlen(record.name); + if (strlen(record.name) > ISO_GAME_NAME_MAX) + continue; //Skip files that cannot be supported properly. + + if (filename_len >= 4 && strcasecmp(record.name + filename_len - 4, ".VCD") == 0) { + LOG("VCD Found: %s\n",record.name); + + if ((filename_len >= (GAME_STARTUP_MAX-1) + 1 + 1 + 4) && (record.name[4] == '_') && (record.name[8] == '.') && (record.name[11] == '.')) {//Game ID found + //Create a new game + ElmGame* newElmGame = (ElmGame*)malloc(sizeof(ElmGame)); + if(newElmGame != NULL){ + //Eg: SLES_123.04.Game Title.VCD + int NameLen = filename_len - GAME_STARTUP_MAX -4; + + //Eg: Game Title + strncpy(newElmGame->title, &record.name[GAME_STARTUP_MAX], NameLen); + newElmGame->title[NameLen] = '\0'; + + //Eg: SLES_123.04 + strncpy(newElmGame->ID, record.name, GAME_STARTUP_MAX - 1); + newElmGame->ID[GAME_STARTUP_MAX - 1] = '\0'; + + //Eg: smb0:POPS/SLES_123.04.Game Title.VCD + snprintf(newElmGame->file,ISO_GAME_NAME_MAX + 1,"%s%s",currentPath,record.name); + newElmGame->sizeMB = (record.stat.size >> 20) | (record.stat.hisize << 12); + + //Eg: smb0:POPS | smb0:POPS9 + strncpy(newElmGame->pathFolder,currentPath,sizeof(newElmGame->pathFolder)); + + newElmGame->next = elmGameList; + elmGameList = newElmGame; + + count++; + LOG("newElmGame->file = %s\n",newElmGame->file); + LOG("newElmGame->pathFolder = %s\n",newElmGame->pathFolder); + LOG("newElmGame->title = %s\n",newElmGame->title); + LOG("newElmGame->ID = %s\n",newElmGame->ID); + LOG("newElmGame->sizeMB = %d\n",newElmGame->sizeMB); + } else { + break;//Out of memory. + } + }else{ + LOG("No ID found in file name!!\n"); + } + }else{ + LOG("Not a .VCD file: %s\n",record.name); + } + } + fileXioDclose(fd); + } + } + return count; +} + +//Scans partitions named __.POPS* and lists the VCD's inside it +static int elmScanVCDsHDD(){ + int fd,fd2,MountFD=0,count=0; + const char *mountPoint = "pfs1:"; + char partition[250]; + iox_dirent_t record; + + if ((fd2 = fileXioDopen("hdd0:")) >= 0) { + while (fileXioDread(fd2, &record) > 0) { + fileXioUmount(mountPoint); + if (strncmp (record.name,"__.POPS",7) == 0){ + sprintf(partition,"hdd0:%s",record.name); + LOG("Mounting '%s' into '%s' \n",partition,mountPoint); + if ((MountFD = fileXioMount(mountPoint, partition, O_RDONLY)) >= 0) { + LOG("MOUNTED %s @ %s\n",partition,mountPoint); + char mountPointSlash[10]; + sprintf(mountPointSlash,"%s/",mountPoint); + LOG("fileXioDopen(%s)\n",mountPointSlash); + if ((fd = fileXioDopen(mountPointSlash)) > 0) { + while (fileXioDread(fd, &record) > 0) { + int filename_len = strlen(record.name); + if (strlen(record.name) > ISO_GAME_NAME_MAX) + continue; //Skip files that cannot be supported properly. + + if (filename_len >= 4 && strcasecmp(record.name + filename_len - 4, ".VCD") == 0) { + LOG("VCD Found: %s\n",record.name); + if ((filename_len >= (GAME_STARTUP_MAX-1) + 1 + 1 + 4) && (record.name[4] == '_') && (record.name[8] == '.') && (record.name[11] == '.')) {//Game ID found + //Create a new game + ElmGame* newElmGame = (ElmGame*)malloc(sizeof(ElmGame)); + if(newElmGame != NULL){ + newElmGame->next = elmGameList; + elmGameList = newElmGame; + + //Eg: SLES_123.04.Game Title.VCD + int NameLen = filename_len - GAME_STARTUP_MAX -4; + + //Eg: Game Title + strncpy(newElmGame->title, &record.name[GAME_STARTUP_MAX], NameLen); + newElmGame->title[NameLen] = '\0'; + + //Eg: SLES_123.04 + strncpy(newElmGame->ID, record.name, GAME_STARTUP_MAX - 1); + newElmGame->ID[GAME_STARTUP_MAX - 1] = '\0'; + + //Eg: hdd0:__POPS3/SLES_123.04.Game Title.VCD + snprintf(newElmGame->file,ISO_GAME_NAME_MAX + 1,"%s/%s",partition,record.name);//!!!!PARTITION + newElmGame->sizeMB = (record.stat.size >> 20) | (record.stat.hisize << 12); + + //Always pfs1: + strcpy(newElmGame->pathFolder,"pfs1:"); + + count++; + LOG("newElmGame->file = %s\n",newElmGame->file); + LOG("newElmGame->pathFolder = %s\n",newElmGame->pathFolder); + LOG("newElmGame->title = %s\n",newElmGame->title); + LOG("newElmGame->ID = %s\n",newElmGame->ID); + LOG("newElmGame->sizeMB = %d\n",newElmGame->sizeMB); + } else { + break;//Out of memory. + } + }else{ + LOG("No ID found in file name!!\n"); + } + } + } + fileXioDclose(fd); + } + fileXioUmount(mountPoint); + }else{ + LOG("MountFD=%d\n",MountFD); + } + } + } + fileXioDclose(fd2); + } else { + LOG("fd2 = %d\n",fd2); + } + + + return count; +} + static int elmUpdateItemList(void) { - char path[256]; - static item_list_t *listSupport = NULL; - int ret=0; //Return from configRead elmItemCount = 0; - //Clear config if already exists - if (configElm != NULL) - configFree(configElm); - - //Try MC?:/OPL/conf_elmz.cfg - snprintf(path, sizeof(path), "%s/conf_elmz.cfg", gBaseMCDir); - configElm = configAlloc(CONFIG_ELM, NULL, path); - ret = configRead(configElm); + //Clear game list first. + if (elmGameList != NULL) + elmGameListFree(); //Try HDD - if ( ret == 0 && (listSupport = hddGetObject(1)) ) { - if (configElm != NULL){ - configFree(configElm); + if (hddGetObject(1)) { + //Eg: pfs0:POPS/POPSTARTER.ELF + snprintf(elmPathElfHdd, sizeof(elmPathElfHdd), "%sPOPS/POPSTARTER.ELF",hddGetPrefix()); + LOG("elmPathElfHdd = %s\n",elmPathElfHdd); + + //Check if POPSTARTER.ELF exists in the folder. + int fdElf = fileXioOpen(elmPathElfHdd, O_RDONLY, 0666); + if (fdElf >= 0) { + fileXioClose(fdElf); + elmItemCount += elmScanVCDsHDD(); + }else{ + LOG("POPSTARTER.ELF not found at %s",elmPathElfHdd); } - snprintf(path, sizeof(path), "%sconf_elmz.cfg", hddGetPrefix()); - configElm = configAlloc(CONFIG_ELM, NULL, path); - ret = configRead(configElm); } - + //Try ETH - if ( ret == 0 && (listSupport = ethGetObject(1)) ) { - if (configElm != NULL){ - configFree(configElm); + if (ethGetObject(1)) { + //Eg: smb0:POPS/POPSTARTER.ELF + snprintf(elmPathElfEth, sizeof(elmPathElfEth), "%sPOPS/POPSTARTER.ELF",ethGetPrefix()); + LOG("elmPathElfEth = %s\n",elmPathElfEth); + + //Check if POPSTARTER.ELF exists in the folder. + int fdElf = fileXioOpen(elmPathElfEth, O_RDONLY, 0666); + if (fdElf >= 0) { + fileXioClose(fdElf); + elmItemCount += elmScanVCDs(ethGetPrefix()); + }else{ + LOG("POPSTARTER.ELF not found at %s",elmPathElfEth); } - snprintf(path, sizeof(path), "%sconf_elmz.cfg", ethGetPrefix()); - configElm = configAlloc(CONFIG_ELM, NULL, path); - ret = configRead(configElm); + } //Try USB - if ( ret == 0 && (listSupport = usbGetObject(1)) ){ - if (configElm != NULL){ - configFree(configElm); + if (usbGetObject(1)){ + //Eg: mass0:POPS/POPSTARTER.ELF + snprintf(elmPathElfUsb, sizeof(elmPathElfUsb), "%sPOPS/POPSTARTER.ELF",usbGetPrefix()); + LOG("elmPathElfUsb = %s\n",elmPathElfUsb); + + //Check if POPSTARTER.ELF exists in the folder. + int fdElf = fileXioOpen(elmPathElfUsb, O_RDONLY, 0666); + if (fdElf >= 0) { + fileXioClose(fdElf); + elmItemCount += elmScanVCDs(usbGetPrefix()); + }else{ + LOG("POPSTARTER.ELF not found at %s",elmPathElfUsb); } - snprintf(path, sizeof(path), "%sconf_elmz.cfg", usbGetPrefix()); - configElm = configAlloc(CONFIG_ELM, NULL, path); - ret = configRead(configElm); } - - //Count elm - if (configElm->head) { - struct config_value_t* cur = configElm->head; + + //Check for duplicates + if (elmGameList) { + ElmGame* cur = elmGameList; while (cur) { + elmGameDuplicateTitleExists(cur); cur = cur->next; - elmItemCount++; } } return elmItemCount; @@ -125,66 +344,201 @@ static int elmGetItemCount(void) { } static char* elmGetItemName(int id) { - struct config_value_t* cur = elmGetConfigValue(id); - return cur->key; + ElmGame* cur = elmGetGameInfo(id); + return cur->title; } static int elmGetItemNameLength(int id) { - return 32; + return ISO_GAME_NAME_MAX +1 - GAME_STARTUP_MAX; } static char* elmGetItemStartup(int id) { - struct config_value_t* cur = elmGetConfigValue(id); - return elmGetELFName(cur->val); + ElmGame* cur = elmGetGameInfo(id); + return cur->ID; } #ifndef __CHILDPROOF static void elmDeleteItem(int id) { - struct config_value_t* cur = elmGetConfigValue(id); - fileXioRemove(cur->val); - cur->key[0] = '\0'; - configElm->modified = 1; - configWrite(configElm); - - elmForceUpdate = 1; + ElmGame* cur = elmGetGameInfo(id); + int ret = -1; + + //Check if it's a HDD game. + if (!strncmp(cur->file,"hdd0:",5)){ + int MountFD; + char partition[10]; + char file[256]; + + //Let's get the partition Eg: hdd0:__.POPS + char *separator = strchr(cur->file, '/'); + strncpy(partition,cur->file,separator - (cur->file)); + partition[separator - (cur->file)] = '\0'; + + //And the file path Eg: pfs1:SLES_123.45.Game.VCD + sprintf(file,"pfs1:%s",separator+1); + + //Make sure it's unmounted + fileXioUmount("pfs1:"); + + LOG("Mounting '%s' into 'pfs1:'\n",partition); + if ((MountFD = fileXioMount("pfs1:", partition, FIO_MT_RDWR)) >= 0) { + ret = fileXioRemove(file); + LOG("fileXioRemove(%s) = %d\n",file,ret); + fileXioUmount("pfs1:"); + }else{ + LOG("Failed to mount. Error %d\n",MountFD); + } + }else{ + LOG("fileXioRemove()\n",cur->file); + ret = fileXioRemove(cur->file); + } + if (ret != 0) { + guiMsgBox(_l(_STR_ELM_DELETE_ERROR), 0, NULL); + }else{ + elmForceUpdate = 1; + } } static void elmRenameItem(int id, char* newName) { - struct config_value_t* cur = elmGetConfigValue(id); - - char value[256]; - strncpy(value, cur->val, sizeof(value)); - configRemoveKey(configElm, cur->key); - configSetStr(configElm, newName, value); - configWrite(configElm); + ElmGame* cur = elmGetGameInfo(id); + char newNameFull[256]; + int ret = -1; + int fd; + snprintf(newNameFull, sizeof(newNameFull),"%s%s.%s.VCD",cur->pathFolder,cur->ID,newName); + LOG("elmRenameItem()\n"); + LOG("cur->file = %s\n",cur->file); + LOG("newNameFull = %s\n",newNameFull); + //Check if it's a HDD game. + if (!strncmp(cur->file,"hdd0:",5)){ + char partition[10]; + char file[256]; + + //Let's get the partition Eg: hdd0:__.POPS + char *separator = strchr(cur->file, '/'); + strncpy(partition,cur->file,separator - (cur->file)); + partition[separator - (cur->file)] = '\0'; + + //And the file path Eg: pfs1:SLES_123.45.Game.VCD + sprintf(file,"pfs1:%s",separator+1); - elmForceUpdate = 1; + //Make sure it's unmounted + fileXioUmount("pfs1:"); + + LOG("Mounting '%s' into 'pfs1:'\n",partition); + if ((fd = fileXioMount("pfs1:", partition, FIO_MT_RDWR)) >= 0) { + ret = fileXioRename(file, newNameFull); + LOG("fileXioRename(%s , %s) = %d\n",file,newNameFull,ret); + fileXioUmount("pfs1:"); + }else{ + LOG("Failed to mount. Error %d\n",fd); + } + }else if (!strncmp(cur->file,"mass",4)){ + LOG("RENAMING MASS\n"); + + if ((fd = fileXioOpen(cur->file, O_RDONLY)) >= 0) { + ret = fileXioIoctl(fd, USBMASS_IOCTL_RENAME, newNameFull); + fileXioClose(fd); + } + LOG("fd = %d\n",fd); + LOG("ret = %d\n",ret); + }else{ + ret = fileXioRename(cur->file, newNameFull); + LOG("fileXioRename(%s , %s) = %d\n",cur->file,newNameFull,ret); + } + + if (ret != 0) { + guiMsgBox(_l(_STR_ELM_RENAME_ERROR), 0, NULL); + }else{ + elmForceUpdate = 1; + } } #endif static void elmLaunchItem(int id, config_set_t* configSet) { - struct config_value_t* cur = elmGetConfigValue(id); - int fd = fileXioOpen(cur->val, O_RDONLY, 0666); - if (fd >= 0) { - fileXioClose(fd); - - int exception = NO_EXCEPTION; - if (strncmp(cur->val, "pfs0:", 5) == 0) - exception = UNMOUNT_EXCEPTION; - - char filename[256]; - sprintf(filename,"%s",cur->val); - deinit(exception); // CAREFUL: deinit will call elmCleanUp, so configElm/cur will be freed - sysExecElf(filename); + ElmGame* cur = elmGetGameInfo(id); + //The path to POPSTARTER.ELF + char elmPathElf[256]; + + //The prefix of the ELF file. Eg: XX./SB./ + char elmElfPrefix[4]; + + //Figure out the path to POPSTARTER and the prefix + if (!strncmp(cur->file,"hdd0",4)){ + strcpy(elmPathElf,elmPathElfHdd); + strcpy(elmElfPrefix, ""); + }else if (!strncmp(cur->file,"mass",4)){ + strcpy(elmPathElf,elmPathElfUsb); + strcpy(elmElfPrefix, "XX."); + }else{ + strcpy(elmPathElf,elmPathElfEth); + strcpy(elmElfPrefix, "SB."); + } + + LOG("elmLaunchItem with %s",elmPathElf); + + int fdElf = fileXioOpen(elmPathElf, O_RDONLY, 0666); + if (fdElf >= 0) { + int fdVcd = 0; + //If we start with hdd0 don't check if the file exists + if (!strncmp(cur->file,"hdd0",4)){ + fdVcd = 1; + }else{ + fdVcd = fileXioOpen(cur->file, O_RDONLY, 0666); + } + + if(fdVcd >=0){ + void *buffer = NULL; + int realSize = fileXioLseek(fdElf, 0, SEEK_END); + fileXioLseek(fdElf, 0, SEEK_SET); + + buffer = malloc(realSize); + if (!buffer) { + LOG("Failed allocation of %d bytes", realSize); + } else { + fileXioRead(fdElf, buffer, realSize); + LOG("Loaded POPSTARTER ELF with size = %d\n",realSize); + } + + fileXioClose(fdElf); + + char memPath[256]; + sprintf(memPath,"mem:%u",(unsigned int)buffer); + + char *fileOnly = strrchr(cur->file, '/'); + if (!fileOnly) + fileOnly = strrchr(cur->file, ':'); + + fileOnly++; + + //char fileWithoutExt[256]; + //strncpy(fileWithoutExt,fileOnly,strlen(fileOnly) -4); + //fileWithoutExt[strlen(fileOnly) -4] = '\0'; + fileOnly[strlen(fileOnly)-4] = '\0'; + + LOG("fileOnly= %s\n",fileOnly); + char params[256]; + sprintf(params,"%s%s%s.ELF",cur->pathFolder,elmElfPrefix,fileOnly); + + LOG("memPath = %s\n",memPath); + LOG("params = %s\n",params); + + deinit(); // CAREFUL: deinit will call elmCleanUp, so configElm/cur will be freed + sysExecElfWithParam(memPath,params); + }else{ + char error[256]; + snprintf(error, sizeof(error), _l(_STR_ELM_LAUNCH_VCD_NOTFOUND), cur->file); + guiMsgBox(error, 0, NULL); + } + }else{ + char error[256]; + snprintf(error, sizeof(error), _l(_STR_ELM_LAUNCH_POPSTARTER_NOTFOUND), elmPathElf); + guiMsgBox(error, 0, NULL); } - else - guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL); } static config_set_t* elmGetConfig(int id) { config_set_t* config = NULL; static item_list_t *listSupport = NULL; - struct config_value_t* cur = elmGetConfigValue(id); + ElmGame* cur = elmGetGameInfo(id); int ret=0; //Search on HDD, SMB, USB for the CFG/GAME.ELF.cfg file. @@ -192,9 +546,9 @@ static config_set_t* elmGetConfig(int id) { if ( (listSupport = hddGetObject(1)) ) { char path[256]; #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), elmGetELFName(cur->val)); + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), cur->ID)); #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), elmGetELFName(cur->val)); + snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), cur->ID); #endif config = configAlloc(1, NULL, path); ret = configRead(config); @@ -207,9 +561,9 @@ static config_set_t* elmGetConfig(int id) { configFree(config); #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), elmGetELFName(cur->val)); + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), cur->ID); #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(),elmGetELFName(cur->val)); + snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(),cur->ID); #endif config = configAlloc(1, NULL, path); ret = configRead(config); @@ -222,9 +576,9 @@ static config_set_t* elmGetConfig(int id) { configFree(config); #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), elmGetELFName(cur->val)); + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), cur->ID); #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), elmGetELFName(cur->val)); + snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), cur->ID); #endif config = configAlloc(1, NULL, path); ret = configRead(config); @@ -237,18 +591,18 @@ static config_set_t* elmGetConfig(int id) { config = configAlloc(1, NULL, NULL); } - configSetStr(config, CONFIG_ITEM_NAME, elmGetELFName(cur->val)); - configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); - configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); - configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); + configSetStr(config, CONFIG_ITEM_NAME, cur->title); + configSetStr(config, CONFIG_ITEM_LONGNAME, cur->title); + configSetStr(config, CONFIG_ITEM_STARTUP, cur->ID); + configSetInt(config, CONFIG_ITEM_SIZE, cur->sizeMB); + configSetStr(config, CONFIG_ITEM_FORMAT, "VCD"); configSetStr(config, CONFIG_ITEM_MEDIA, "ELM"); return config; } static int elmGetImage(char* folder, int isRelative, char* value, char* suffix, GSTEXTURE* resultTex, short psm) { - //value = elmGetELFName(value); // Search every device from fastest to slowest (HDD > ETH > USB) - static item_list_t *listSupport = NULL; + item_list_t *listSupport = NULL; if ( (listSupport = hddGetObject(1)) ) { if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) return 0; @@ -268,11 +622,12 @@ static int elmGetImage(char* folder, int isRelative, char* value, char* suffix, static void elmCleanUp(int exception) { if (elmItemList.enabled) { LOG("ELMSUPPORT CleanUp\n"); + elmGameListFree(); } } static item_list_t elmItemList = { - ELM_MODE, 0, MODE_FLAG_NO_COMPAT|MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "ELF Loader Menu", _STR_ELM, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, + ELM_MODE, 0, MODE_FLAG_NO_COMPAT|MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", _STR_ELM, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, #ifdef __CHILDPROOF &elmGetItemCount, NULL, &elmGetItemName, &elmGetItemNameLength, &elmGetItemStartup, NULL, NULL, &elmLaunchItem, #else diff --git a/src/gui.c b/src/gui.c index 403875a4d..85b2ee799 100644 --- a/src/gui.c +++ b/src/gui.c @@ -376,7 +376,9 @@ void guiShowConfig() // configure the enumerations const char *selectButtons[] = {_l(_STR_CIRCLE), _l(_STR_CROSS), NULL}; - const char *deviceNames[] = {_l(_STR_USB_GAMES), _l(_STR_NET_GAMES), _l(_STR_HDD_GAMES), NULL}; + //START of OPL_DB tweaks + const char *deviceNames[] = {_l(_STR_USB_GAMES), _l(_STR_NET_GAMES), _l(_STR_HDD_GAMES),_l(_STR_APPS),_l(_STR_ELM), NULL}; + //END of OPL_DB tweaks const char *deviceModes[] = {_l(_STR_OFF), _l(_STR_MANUAL), _l(_STR_AUTO), NULL}; diaSetEnum(diaConfig, CFG_SELECTBUTTON, selectButtons); @@ -385,9 +387,9 @@ void guiShowConfig() diaSetEnum(diaConfig, CFG_HDDMODE, deviceModes); diaSetEnum(diaConfig, CFG_ETHMODE, deviceModes); diaSetEnum(diaConfig, CFG_APPMODE, deviceModes); -//START of OPL_DB tweaks + //START of OPL_DB tweaks diaSetEnum(diaConfig, CFG_ELMMODE, deviceModes); -//END of OPL_DB tweaks + //END of OPL_DB tweaks diaSetInt(diaConfig, CFG_DEBUG, gDisableDebug); diaSetInt(diaConfig, CFG_PS2LOGO, gPS2Logo); @@ -408,9 +410,9 @@ void guiShowConfig() diaSetInt(diaConfig, CFG_HDDMODE, gHDDStartMode); diaSetInt(diaConfig, CFG_ETHMODE, gETHStartMode); diaSetInt(diaConfig, CFG_APPMODE, gAPPStartMode); -//START of OPL_DB tweaks + //START of OPL_DB tweaks diaSetInt(diaConfig, CFG_ELMMODE, gELMStartMode); -//END of OPL_DB tweaks + //END of OPL_DB tweaks int ret = diaExecuteDialog(diaConfig, -1, 1, &guiUpdater); if (ret) { diff --git a/src/hddsupport.c b/src/hddsupport.c index 8f5424136..587bac676 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -58,7 +58,7 @@ static item_list_t hddGameList; //START of OPL_DB tweaks char* hddGetPrefix(void){ - return hddPrefix; + return hddPrefix; } //END of OPL_DB tweaks @@ -144,6 +144,20 @@ void hddLoadModules(void) "-n" "\0" "20"; + + //START of OPL_DB tweaks + static char pfsarg[] = "-m" + "\0" + "4" + "\0" + "-o" + "\0" + "10" + "\0" + "-n" + "\0" + "40"; + //END of OPL_DB tweaks LOG("HDDSUPPORT LoadModules\n"); @@ -182,8 +196,9 @@ void hddLoadModules(void) setErrorMessageWithCode(_STR_HDD_NOT_CONNECTED_ERROR, ERROR_HDD_NOT_DETECTED); return; } - - ret = sysLoadModuleBuffer(&ps2fs_irx, size_ps2fs_irx, 0, NULL); + //START of OPL_DB tweaks + ret = sysLoadModuleBuffer(&ps2fs_irx, size_ps2fs_irx, sizeof(pfsarg), pfsarg); + //END of OPL_DB tweaks if (ret < 0) { LOG("HDD: HardDisk Drive not formatted (PFS).\n"); setErrorMessageWithCode(_STR_HDD_NOT_FORMATTED_ERROR, ERROR_HDD_MODULE_PFS_FAILURE); diff --git a/src/lang.c b/src/lang.c index 0fef10f36..b283d73a3 100644 --- a/src/lang.c +++ b/src/lang.c @@ -264,8 +264,12 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Some fake ds3s need workaround, this option will disable it.", #endif //START of OPL_DB tweaks - "ELF Loader Menu", - "ELF Loader Menu display mode", + "PS1 Games", + "PS1 Games display mode", + "POPSTARTER.ELF not found at '%s'!", + "VCD file '%s' not found!", + "An error occurred while renaming the file.", + "An error ocurred while deleting the file." //END of OPL_DB tweaks }; diff --git a/src/opl.c b/src/opl.c index d6c876ad6..1d0d12278 100644 --- a/src/opl.c +++ b/src/opl.c @@ -704,9 +704,11 @@ static void _saveConfig() void applyConfig(int themeID, int langID) { - if (gDefaultDevice < 0 || gDefaultDevice > APP_MODE) + //START of OPL_DB tweaks + if (gDefaultDevice < 0 || gDefaultDevice > MODE_COUNT -1) gDefaultDevice = APP_MODE; - + //END of OPL_DB tweaks + guiUpdateScrollSpeed(); guiSetFrameHook(&menuUpdateHook); diff --git a/src/system.c b/src/system.c index 74a125df9..cab0c713c 100644 --- a/src/system.c +++ b/src/system.c @@ -887,12 +887,60 @@ int sysExecElf(char *path) FlushCache(0); FlushCache(2); - + ExecPS2((void *)eh->entry, 0, 1, elf_argv); return 0; } +//START of OPL_DB tweaks +int sysExecElfWithParam(char *path,char *param) +{ + u8 *boot_elf = NULL; + elf_header_t *eh; + elf_pheader_t *eph; + void *pdata; + int i; + char *elf_argv[2]; + + // NB: ELFLDR.ELF is embedded + boot_elf = (u8 *)&elfldr_elf; + eh = (elf_header_t *)boot_elf; + if (_lw((u32)&eh->ident) != ELF_MAGIC) + while (1) + ; + + eph = (elf_pheader_t *)(boot_elf + eh->phoff); + + // Scan through the ELF's program headers and copy them into RAM, then + // zero out any non-loaded regions. + for (i = 0; i < eh->phnum; i++) { + if (eph[i].type != ELF_PT_LOAD) + continue; + + pdata = (void *)(boot_elf + eph[i].offset); + memcpy(eph[i].vaddr, pdata, eph[i].filesz); + + if (eph[i].memsz > eph[i].filesz) + memset(eph[i].vaddr + eph[i].filesz, 0, eph[i].memsz - eph[i].filesz); + } + + // Let's go. + fileXioExit(); + SifExitRpc(); + + elf_argv[0] = path; + elf_argv[1] = param; + + FlushCache(0); + FlushCache(2); + + ExecPS2((void *)eh->entry, 0, 2, elf_argv); + + return 0; +} +//END of OPL_DB tweaks + int sysCheckMC(void) { int dummy, ret; diff --git a/src/themes.c b/src/themes.c index 07e1f5754..a3376eef1 100644 --- a/src/themes.c +++ b/src/themes.c @@ -330,7 +330,11 @@ static image_texture_t *initImageInternalTexture(config_set_t *themeConfig, cons { image_texture_t *texture = (image_texture_t *)malloc(sizeof(image_texture_t)); texPrepare(&texture->source, GS_PSM_CT24); - texture->name = NULL; + //START of OPL_DB tweaks + int length = strlen(name) + 1; + texture->name = (char *)malloc(length * sizeof(char)); + memcpy(texture->name, name, length); + //END of OPL_DB tweaks int result; if ((result = texLookupInternalTexId(name)) >= 0) { From 926069db9aac81a130980ced80cd0592f737532b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 7 Mar 2018 08:24:16 -0800 Subject: [PATCH 077/269] add new default theme and splash to OPL - 10TH ANNIVERSARY EDITION --- DETAILED_CHANGELOG | 2 + Makefile | 12 +- gfx/L1.png | Bin 460 -> 362 bytes gfx/L2.png | Bin 500 -> 453 bytes gfx/R1.png | Bin 528 -> 480 bytes gfx/R2.png | Bin 566 -> 529 bytes gfx/app.png | Bin 2597 -> 6411 bytes gfx/bg_overlay.png | Bin 29641 -> 40742 bytes gfx/bg_overlay_2.png | Bin 0 -> 41135 bytes gfx/circle.png | Bin 630 -> 453 bytes gfx/config.png | Bin 3611 -> 3492 bytes gfx/cross.png | Bin 593 -> 376 bytes gfx/disc.png | Bin 3853 -> 3269 bytes gfx/down.png | Bin 486 -> 458 bytes gfx/elm.png | Bin 1490 -> 6401 bytes gfx/eth.png | Bin 2201 -> 6413 bytes gfx/exit.png | Bin 1898 -> 3280 bytes gfx/hdd.png | Bin 2735 -> 6397 bytes gfx/info_overlay.png | Bin 0 -> 68331 bytes gfx/left.png | Bin 494 -> 370 bytes gfx/load0.png | Bin 1854 -> 1686 bytes gfx/load1.png | Bin 1022 -> 113 bytes gfx/load2.png | Bin 1854 -> 1686 bytes gfx/load3.png | Bin 1022 -> 113 bytes gfx/load4.png | Bin 1854 -> 1686 bytes gfx/load5.png | Bin 1022 -> 113 bytes gfx/load6.png | Bin 1854 -> 1686 bytes gfx/load7.png | Bin 1022 -> 113 bytes gfx/logo.png | Bin 12463 -> 49950 bytes gfx/right.png | Bin 493 -> 466 bytes gfx/save.png | Bin 1769 -> 2870 bytes gfx/select.png | Bin 562 -> 228 bytes gfx/square.png | Bin 507 -> 357 bytes gfx/start.png | Bin 634 -> 750 bytes gfx/triangle.png | Bin 607 -> 573 bytes gfx/up.png | Bin 494 -> 422 bytes gfx/usb.png | Bin 1241 -> 6424 bytes include/textures.h | 4 + misc/conf_theme_OPL.cfg | 332 +++++++++++++++++++++++++++++++++++++++- src/dialogs.c | 4 +- src/elmsupport.c | 2 +- src/opl.c | 14 +- src/textures.c | 8 + 43 files changed, 365 insertions(+), 13 deletions(-) create mode 100644 gfx/bg_overlay_2.png create mode 100644 gfx/info_overlay.png diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 0a8521955..18b52f7af 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,8 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1035 - Daniel Sousa - Pops ready (#6) - Wed Mar 7 08:00:17 2018 -0800 +rev1034 - Jay-Jay-OPL - SP193 - Added workaround for bad GameStar adaptor to in-game ATAD code. - Wed Jan 31 17:07:11 2018 -0800 rev1033 - Jay-Jay-OPL - revert changes from: sp193 Added workaround for bad GameStar adaptor to in-game ATAD code. - Sat Jan 13 15:09:55 2018 -0800 rev1032 - Jay-Jay-OPL - sp193 Added workaround for bad GameStar adaptor to in-game ATAD code. - Thu Jan 11 18:57:10 2018 -0800 rev1031 - Jay-Jay-OPL - AKuHAK/new_sync / Lang Updates - Thu Jan 11 18:28:27 2018 -0800 diff --git a/Makefile b/Makefile index 865f468d8..9017b5a44 100755 --- a/Makefile +++ b/Makefile @@ -77,8 +77,8 @@ FRONTEND_OBJS = pad.o fntsys.o renderman.o menusys.o OSDHistory.o system.o lang. GFX_OBJS = usb_icon.o hdd_icon.o eth_icon.o app_icon.o elm_icon.o \ cross_icon.o triangle_icon.o circle_icon.o square_icon.o select_icon.o start_icon.o \ left_icon.o right_icon.o up_icon.o down_icon.o L1_icon.o L2_icon.o R1_icon.o R2_icon.o \ - load0.o load1.o load2.o load3.o load4.o load5.o load6.o load7.o logo.o bg_overlay.o freesans.o \ - icon_sys.o icon_icn.o + load0.o load1.o load2.o load3.o load4.o load5.o load6.o load7.o logo.o bg_overlay.o bg_overlay_2.o \ + info_overlay.o freesans.o icon_sys.o icon_icn.o #END of OPL_DB tweaks MISC_OBJS = icon_sys_A.o icon_sys_J.o conf_theme_OPL.o @@ -679,6 +679,14 @@ $(EE_ASM_DIR)logo.s: gfx/logo.png | $(EE_ASM_DIR) $(EE_ASM_DIR)bg_overlay.s: gfx/bg_overlay.png | $(EE_ASM_DIR) $(BIN2S) $< $@ bg_overlay_png +#START of OPL_DB tweaks +$(EE_ASM_DIR)bg_overlay_2.s: gfx/bg_overlay_2.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ bg_overlay_2_png + +$(EE_ASM_DIR)info_overlay.s: gfx/info_overlay.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ info_overlay_png +#END of OPL_DB tweaks + $(EE_ASM_DIR)usb_icon.s: gfx/usb.png | $(EE_ASM_DIR) $(BIN2S) $< $@ usb_png diff --git a/gfx/L1.png b/gfx/L1.png index fb89da6ecca3f9f0261ea4c4ed9f3445b785a012..fd059aa9c981e555b0ea22b7b7cd4f48e65458e8 100644 GIT binary patch literal 362 zcmV-w0hRuVP)GH3%f8@umm$JFt!sDLt8LYum}TVKL~ywBP@t|QSUmw?HerXfX9_6BG|7!O}j5Cmk~HhqIE%jEk$xvtCC z#5y|z2!eom>C{39avXGqMG@tBz7uEsdx9iM zF7X6CgZB+^e{W52Zg%IL&+6MfBw^V$*e>6C>#=Ci+8ZFKIOv#QS=Q+^rfIS`HW)gG z21r2!6|w{-zvK|azlU8M$E0Z*2po2|l9Zzc;zd!s^uu`re~(%UpH#b+q5uE@07*qo IM6N<$g7$EdmH+?% literal 460 zcmV;-0WuopM0*&O)Tx$Vq9 zXU?8kWsC`$HZ^Y|Hoz80fHW$$+p-;~a{8-|y#w!)R)_#y@MI>If`m`EoOtE5##pgF z*A6sQb-@Z4fjC3GSO_{`3?kP3-D%b%w&i(3)>{vpiEU?GaBMB`0q(&Y>wzb-4W7ZP zGjEZ_zKAkg1P@>j+;As;{|h((S7511V1|DX+;T+cU=s`+*Uwahxb+ZRGA7a{M93$7 z40@bzCL&Zu{TqBvy9-_8oerO)x~>c>x?Su7?0{V|a0HE~5v3~x-x@gKB9U_}EyjW5 ziBqs$l5=wJj%Dx&RtqwwEVhu51-~f5X2O^;QkF5V!IA3;)B1rBvJZF*Kvt{O&}cLe$1##5L6-fCC!R~w6j2nx_kA3XN9^}| z5b}$wXdZ?kE|&{ez5q%E#Ns^9<0>`;fSWXTU6%kFD*-5ec@P9B6bdqcn>6Od`{i

)@@DqWS%> v+ith0R4Rmsuv17<5j8ZoZTm|9ysYKVY61kAn#i0v#Tg^JZ*9=Ekgdy7v-1HD-|xPy)BA zVG#)Vl;hAEM_ugIR^!>tNR+@ZsDq$|_a=2k@Cm*|D$QPx&yf5S34PwEtqH}$<17ze zz!iApyL51Xp}nUA{bDW7f=-3054i^O;FMn?*Y?3A(R*$ZI+99t^nnLZ1=HY!>8e_3 z$h<^9Km}}rMX&(wfS=R}uS*BCK*zul-!H%cSOG)eJ*!B#*4X6z5R|EjU8W^7O_=Bv z$ROAQ8(@dR9buGGZ`-E!x4;aT1#{pGZ1T`^umslGbMk3wBH-7piH7E|dA)*V&iVY! z;&1Pcb`>xMj$3p=y|!v~#0b2J=p}N(wL}(|4nL+9`)w{T+mw`oC&FD|m+RS8{!GD@ qMQLSqmFFnfTC>jo|5?$#1sDJ(`t4;l2(DWI000056a<6KG~-X0Fb`lb3I2nBb6H`7 zCwQ*sg7*VC;q1NF-beNtd>ab_5PYMy2n3l-2Dw}g_xl}>#{)s|nV!TwpHJLwHyn>g ztX3<`=W|dbB!Mh`y-Ad6 z7mO!}#bU_k^Kcvog6q2YjSw^p1_R}Z7K;UXy&g1}3CN$EPNz{U7SZi?aXz16f~|W$ zVYyslI-R0Ysel*@2s*LJWP*4+4qD2a9KC?-fR0Y5gF>Oeop>w4MUy>H%&u0e(MP!I z5@75_++c3`cDse=d5YQ51x0{e{Kbd3jPK2EHk%=tOfo>s&Zv8_8W!JdHvjg)`941q Wm^SOIiU-O70000Y%F{kOSQ3IM0^7a3qiCIA3(75R@k^!8gILs<3I2R4)J7T_T~S_lm*MjRumXDd z0Z}FKZ9NfXikobMJY|$59>ESc10&#?iRQoz7yw^M8#B(NnHIRI*eS?@bI<}7!87C1 zNt#0??CKBj0PevJ{qn`5RASfYsfvzhoJnI|QTm{s>tK})+6Ou-IVMSz5EZ7u2{;Dx z-~!wkA5*G!SjAb99iQdBG~EWvGgi&ONTP(C{Wq3EYTiNrt8ui8#*we759LBHb?wLdkMi$?Iln-IBC|L~1Vvv+?B4uEZOlC3IO!8I+pFk$^US6NBQ^#|2 zkX!Mq(<$fN|MzpjxA}wrT)tsjI=FbfUikff9FIqwPA6P0@A;GW&gU}@hXdB@H3owL zy4|j@|5sk5@%?^}-EPNSd_asiVsNX~O6(HpfQQ2Pa=D}f8aCvBF!Rl31Cz<5I^ZD< zbCt_w=wa&P@ff*W4vWPC4u=ErcpNU53#8ZUp;#pt z8VRE$lgXgbXz+Kjrqd~+(I_Oeqh#<3W>Bx!5ex=F(&;qx)M_=9N+lU6mzsfksMhxx znxP?B*NS5IqtJMmR$HM_I=77y5 zZnqnuPzZ%Wfn`ui6NyCVSOjs0Iz^A@_xmFKL?Qt_cDo(PWReXQqbvES2hC;^7K;Ux z6T+R7RH;-jnM`DWuS+D~z%%msJhIs=hQpzleVfgu)SY9@X_GQ@BX+4&iaNrlE-x6? zBB}t(HJi=&FmJ?;DkvQ=icfTijeah6?RFbZr;`_?*cpjlN)3%uI)3zr^9%j~ZpBtQ TIr?~j00000NkvXXu0mjf*;(>X literal 566 zcmV-60?GY}P)-8=W*?m2VLckg|cQYuhss|x%93u^st&9IKO_T7|O9`oN_dj+0yqbLW6 zfVj$;18lZ>-!}Tr57vss=sTZ@2xtZ=koAZ@q?J#`9FS&fk!rSSpG=6qHnSXx&b>_L z;|x-f2GFB9mH;2PXD8P>U+kGJqzNw*CrPjX?v1%gaL6^w;FNnVf?ZHUjTJ3SKYIiH zAj(Xffo*UBUcd?1r{g7xd>y=&^N2ds%^(;8;~Wh~s*SF~uOHt)<9BH>=0pCKNZH2kqMV?gFzcgRS-55*3|g zi?3)CxCJc*ZcK+kgxODWKFF~Ik7dYsJ2J-2Y2KLU6m>pY%XoOa?g{hACNzhc0uPv9 zc0ZLP%YRZ=$*24oY=ALM)xY(WSMi#UnVR_jvicBU0FFEdnzv^%-2eap07*qoM6N<$ Ef(9n|kpKVy diff --git a/gfx/app.png b/gfx/app.png index 25126c570f9e545c46c2836ca6148c697135d212..968e6da98bf6ca35d3865dffad46bfa88a1f7405 100644 GIT binary patch literal 6411 zcmV+m8T96fP)6n} z0ssI23JMB2IX!D^aAjp>o}QgyU}0-(YE@KK(9qE2 z*VYCF1rQGq5fKp!3JX(HQ+|Gae}8{tV`D);M1(nVFfI zo}()-I960xCMq)o1`3dol3ZM5X=-eqq^L(sR2Lc`SXN+BP+Ln$RBv%~rmC*DyurW2 z#~~vqD=I6{(9p%n%}Y;My}i6)U}8Q&N3O519Umlpe}T2NwyUbDB_}FaR#


PMp&#l$of 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 Hu0mjf*hnf6 literal 0 HcmV?d00001 diff --git a/gfx/left.png b/gfx/left.png index 501ab896d0452c11f4bed9996045f18421e59a71..284530ebf70158e1911e2feef8105574f331ed00 100644 GIT binary patch delta 344 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 ngc)P8@oq=S6;aqF(88LMuijle;UcI diff --git a/gfx/load1.png b/gfx/load1.png index 133bc457c082bb10c86fe416971d702df0c74251..a9ffa387b6fed176e68de49bfb3d40a526917758 100644 GIT binary patch literal 113 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 ngc)P8@oq=S6;aqF(88LMuijle;UcI diff --git a/gfx/load3.png b/gfx/load3.png index 133bc457c082bb10c86fe416971d702df0c74251..a9ffa387b6fed176e68de49bfb3d40a526917758 100644 GIT binary patch literal 113 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 ngc)P8@oq=S6;aqF(88LMuijle;UcI diff --git a/gfx/load5.png b/gfx/load5.png index 133bc457c082bb10c86fe416971d702df0c74251..a9ffa387b6fed176e68de49bfb3d40a526917758 100644 GIT binary patch literal 113 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 ngc)P8@oq=S6;aqF(88LMuijle;UcI diff --git a/gfx/load7.png b/gfx/load7.png index 133bc457c082bb10c86fe416971d702df0c74251..a9ffa387b6fed176e68de49bfb3d40a526917758 100644 GIT binary patch literal 113 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�`i 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 Yv!LX2p_|cP73iNyiz|rLh!_U`7qt4+dH?_b literal 12463 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 diff --git a/gfx/right.png b/gfx/right.png index ce91652bfeb7ce18254295afe83336e5599af898..c972b38eaef7fc5057363c6efb6eddd40741c11f 100644 GIT binary patch delta 441 zcmV;q0Y?7q1JVPKBYy#zNklwrtKOJWhQuyjJuBF=sn>Pf%j)m+b-&xsU(r7eLuh;Q-JXm-> zpOEm}?RLZAa6lAA7>~!GXTQT7$3d-D!{u_p`F!TXL?B6$1b_GY9dR6^P$)oRf5MK( zBa0wABxH2SYy16PfeO1`uYwUaFhO~aUGiQ9%9vHFRRbgJc^)L2%?6!L2dmWzjKGpV zq!>F>n2cMq*+i?=!f-f5uh&DVRFZC43VeqdH}m{tGC{lDCTc(m@*X!eBbB4a^zjWx-Pp{Z)C%a z6^3C#gvC9Y?hbY2(vsz+Km!eefC`GmqD&M^Z98Jz$1(zb{Crg^736X`c1uw0XF{yq jZin@H4SK)+!2Uk}ZHRoW8GKyh00000NkvXXu0mjfjStWO delta 468 zcmV;_0W1E}1MLHlBYyxHbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz zk4Z#9RCwB))lVn{Q5?YW8MC{TKVjFOb#QXqa#PEN#Kl#@Rf@vq?BbxLBsn;{agmFg zB1K$Wlu{xoM-JE(*6#Se`i)*|_RZQ?pJw+rGryVl`@OeoyML~08Ab)F;a#MT8Pg3R z!?{N6Ad0NSYO#g2auT+o9mDvN*a-T{O{k{#hHGug59kW2QP2pN_yQ#*tkmkK#y2A6 zCcKlWPRn;2lQ;|N@-q76>0ay+GZ@7I@<>W^R^++?)FTH6&p5VNhqstRQnQL1B+!i` zY@-1oth;~56@S8(eCSaNyg&-)KJg7nkU?5xaiJ1=HFSK+@lvG59dgVUtD)*-3*uUQ z9P_fMJ28t(Y$7Gwv9};sjhFBgOL*7TT^fUUmGgU;KrMNBkF z%)tp3q;_#>;FwQce_4i;32B(4#ip=tN@!Zxwv<6{SWTv2=lpA@xIW#qgZ6SL;9(Kz z=%>W0f_@-OC!gev4z+2jF7KKW+5vw7t%zyURu|vnqu32U0t^6Kw@5>I8XJfJ0000< KMNUMnLSTZT6x=!h diff --git a/gfx/save.png b/gfx/save.png index 600a9d0334389206397febf87a14bd1334978ed6..b2f11e09e2fae93a8cb5ebc17b03f9e0890383ba 100644 GIT binary patch literal 2870 zcmcIm`8N~{7am(-rpUfCC_>g~vSt~gvKB&?6e(MlDA`krEJbz(gRzYnV;E-NjIoC5 zRZ_Ir6%MZn@y+{3eD|DtpL3ocp6A?q&b{Y8cXf6+CM+im0053TUbJ)P;)VZGkdIrd zdeT?9z#nRT#To!W=L7eH1ONa&fa~R}P%i)f3pF*h`1l8Bjf^!kG@fPUG$EQbHBZ~v z*xK0G9Xoa`H1rPC4oW1_1O)|qd;45n+#fznij9rS%E~S&DW%i(Qg+yu5;pj7(!=69omuE-bDY(H0RA*^R|TMn+*USSp3liN>meRUbc2PE2@Y zZf;&&T$-Jo5#8Orm6g?HW#wp8S4l~EeO*%nycyNe)zX4&X=#;| zknBKW`1$$u^z?Pl=#7kwy?Fj|cxa4Bp!D?-8XKF5cxpvOO?i1`U2Oxhy%X1iH!v_% zQBk2#=`<>1WO$rTV-B!}h6YDRh9~fSq@lqv0-ju6R>fqnxP8^s)ODh}>+0&+?4ji3 zlym1G!^0y(gCi^!n?j-GgyY{w|5vC8gcnS_9&T5B@)RrDw9H{M@B}Y z(HI(y!JxC4jDf}m1erunNl8PYI=OQIgH@}lYOvTIUS2+4US2wlMIeya10&oabai#B zs;c$$^!D|VnwnZoP0ggFqy|{SR4ScLXVR$s{mjA6&aSpLBpQV!k*Lkht&NR{{{8_o zGxLrPbZcun5{bfg^>SO_I#yT17>s_deq9}$$zUT8EnOH~Lqij$v!}kkfyrbE2naCf z11&9WTxG5!3|5EhAv85LQz^`DY##wnsjaQ2kQu!=B9TBP5otZ$czhq3kMF!pPo=}MYv&^V~C-6=;7-kAwtR8C4X{M>Gvy}?B556 zj+gS6aw^F78Vwy^w_nD2?o7n_Y=wNEi4)$PPi_V5dQeIh-^J}TZl~cX+dX9Y(yH>k zV0KpwF2Qa2!M(F`NMC*+e0n(J(@NQURiIAV_+ee5CpdEoCxtrUm(nqDCQQSpY2GPO zjh+Ldwl6LHUR+vQoJ~kb2q1w*_xtiv^1TUb4G^#}XIc8r?uM;dUPZNQ>sGKwlQL(C zx`)AtC@d-{E2kdxZXislSn)-t;2Vd-Hk{YjY$Voim#5ra$(oHa@$&j-vx73@d{Q>oE`wyn5Of1TWM9@w zdQr^u4U#~B6r8^mY^j|Vbo;u;an292rf}`5Z0T$CoS6=#$msm}vf#~U3R>&m_Lf%o z0jDf$tj>N9)VXuwD)5P`tSrCC&f^lE&kmCb1pnd$M=Mxy&*;e`X@2W?K2Tuog6V*U z?5PFncm`M2YZbYDn<6Bq&r17%vipos?joOG4~!~kf3Iu#cMMhwO~99bITh!`Sjr=u6wAvdAsKG+W;qDrj4gA@C&k;H~)a zZGy9&3q+(v>EP(wq4ALNvO+e*u#Bmi=_Up9JQ^M-H{fgJY)HKkZ<{hVFOC-{ErWx9y%ATXD20HV*E$YA2PsaC4YJzTK?F&;Hax3HSu(f z9+|hlkKPS0b{W~QFQP%4ueOYr&is;!6zM@a_oHJVMnDBu=*`F>6Cmj3g}`^^G8`Aq z^huugU)IFiV_8o2MP(tF>0uomzZDzB5^bq~j{f^W_fbMr!BsaV(P~$+A8(j4xg2ydBBrPlTsKK7gPnm!m7+dRy2?C z6Z+B({)F2b{_YQjs=>}JR+`~yRMn7nkD<~`ua1!KwS+oN$rHPjq8TW zQ%_HYyAGk7X(av9aO(hq{9o|liytaiqNa+Tn7rM(S9lRFM)wA)imYvXZ+uLdnC6I7M;_6wKLy4!I5?l#Pqf4YM=qbDpL?S$QptGt>uB(&^Gh-+ zPsSocj}DFi&GKs4o1q#akccsu)<0V|Du=5djK$Xr6#JWO`s!ZdT{~|1NmwqcdY`>oR8N9v^PTW3-Fi{BGT6ni`WM9NIkK=#pmDBnEzFkMC KvmMeVFynuJYiZ;F literal 1769 zcmaJ?2~ZPf7~KF0#8Qz<1f^@R+_?`-AW9%aK!Xslq@_hdvXB7TU6PFn!4B6T;8<*n zv}3UtkG6^jb+jC!g{Y+!4_c)yA~N7X9U!8jQ&6nkAYf-&y4Qcqd+$5{*~*0YbxuSt zA^-qRu`xmkK1NtyhlTjJUX|C656iG17TnWl%<0Cq_NgE5~xz}NhxeGO^ilC zN>z+e10@;bljX)7Iafhiy9Nw5@NfY&gvmgIIv3XR41ChGE)Snux2Ys>8iM8UNw1ue ziW9&nL<50r3X?3S(di(EL!q= zV+&vLNlFYuc~q)iuczpl6hxCnrE|Gls|JHX#t~#~K8(o>WLWDvt0085a*YbbR0s@O z6=fNS4&#$>PhW+gM(1QniVNzhYHv<(P}|7JyakP%yNZ@T&IR$ zY?iBd%?+KGYi$KJidz;!8r2p^A<`gfa5`k3YJOi>^XkoT74!STo|j9-ouOI_`;S7; zZsFZyozAr_zL;x#2*$fzgSYiw-=~B4Y55>lC`dN+j@I&(ZUVO-votNrjC}&Pwa(;d ziFCWiexanoRA%xZmMocy3~~RYsMjIecY@F;5;}){mlWpi9%k+kJ@oawqPp7GKT$ZE z%E*OJw(9Y_Y0TWPd;ONIzs83wmur`)cO*tP`fNgj&j4pvwoz?-(_N*+I51c)D)pLh z@G03S=9gte0JUaq0{cc&*T6uy+EHk4XFfKtM*3zD;cR?A)6u6G>GQSF>M!xWUG#)t zA2RSbXCS;lblr#MkY;N?MKsy?nIB{(Z>*?J_nK-P7H+ZKmHMbC5!Ke!`KLPcmyl0% zS7mzlj4wa3Bcp5aLvv8-g0zyF^bX>%TN7NGWa{1EynJX|?Z-fJ>_tmgv2A*1kT~rMuVB3i{g^uEV@AQgABc{5APO0Y?Z+9uvbtd+A*iFG+7aUv$9hzPAKBi+u*8<1S zG(0$eVXLUD++5b|x)0v%U9G$xelXrm=XamB)ZDl~zAS6v66$_5VEDbFZRbSjp+h#F zKE(6UX-<-a8<>(*{V7sJ&-N3W8bT&J;|OEFf9YJ5 z*0=XlfF&;&NbQi^X=6EOgSR``c?6}g#V6N(qpQb&yK82cIeYW%gKC?f*9Qh;0 zvXOX{+>=AD33IXiY0+oJ%oWne>Yl<>%ZpXt+pyxl>Fs%5`A4wvq%?511GJU2OZUsL z%F)DqoHF?~Pwo`j$9=H}pvMwTlY>ugc-t2;?mO!0JS|D^kiW!_TMrx@c16SO31bVo zTt&?XT$XjQ+&|n~twfrSf3?c?i^R!i-Oy|bbRNnOPvQ^%>6Bh9N{j7j> zAHDV1=^mp=wY4ga@cGwQOV)SZDs4D?BPy<`oqrGB3FYPNc)%OAU-xTn_8v~5QeIwl zWph;!@Z!4X>MJj&x{L%%V>h#RyuW2-L+P_-*M{IfZwtxwK%E6BuPL}@q_=@1kJ?++ zktxsmi(3cYO*d5-@{N@m{kCzJHx4JBikf1wB%PK=B{vHR3jq%|V|%D#G~4>~iH(jI J9*;~f`5VA2oD~27 diff --git a/gfx/select.png b/gfx/select.png index 4c6d5609770c17e73dfb77f6d8cfe4d60d28cab6..f46f9a8c83b9c749c1a610273593b39d10cf8836 100644 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<!lvI6<)0X`wF zK>F|BzZx1El9G~!hK9z*#^vSZ*4Ea^$;k!=2LJ#62Py~%2x#KA`~ze$mIV0)GdMiE zkp|>Md%8G=NL)^SaIcrq%pgbWIKwp_Yb%2W^TXSWB@)a$n^uQ0UR-G$Am#B$B&L|H z!*4F*<>d}MCQ}^>S13$47NW^&n9Uo(zN*Z`v8!fFbH>5D3ym)x%wx;B$jHF7QtoJ9 ScNQnm8U{~SKbLh*2~7b0I7PGo literal 562 zcmV-20?qx2P)n-LE`~^1 zh*CB-J`##QKtf6>J4q8IQC4hFEUeg&jTL2WBS}eNujC^OG$IR)88XIPnXbh~HF zt(#^sr+%F~_q^x*I`4V!=$2(^icttm&6}Zv2yir}GSUjRxG6~`mZZ?)tSO%DvLc{; z5OU*04X6Y0G>Y9gkq4SpX;L|n;QZ~86T;4y$_Ycuf{}9~=R{UIVgB*n=g}1vdID~p zcml8B$D@uZn%FULlrn;-q^yVy%*QUM(ZGjICbciss0zSyrcQK$UJwQ=APD+_ zpXuBI)!+qOa!)PynUvcG4`3KHfIV;o#^{v6c@xC!g;@_az$s_~3!nqcFiM@#Pt#~> zbc0E*8_dESm;jH|8RAE51Pn4Wx>HRgxKIVw8EG5S8fWhhbC$mY;`yC2F){?k!6DeC zof}ZeEH0_8=rz481B+lvI@1zjNOhn|#Tejvkk2OnKZtQJ)q`KEB}XS3!8};wd3920 zlxKRvVigA3K@Vk$X;8?VGn-coq6Hj-0ourSazZXlu{cY`BGP5>#&=075XV#w`j~-R zZ~#X6Tga?}3(ghbj5YGf+K8}tGrFSxHhu*d0A#_FQn2?I6#xJL07*qoM6N<$f}kVs AGynhq diff --git a/gfx/square.png b/gfx/square.png index 7c63346a03b9b32acb044eec7d315773bedcdb77..18cebd39ca9eb5e4fe9255c5f3985d4e86d1c3cb 100644 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQaEa{HEjtmSN`?>!lvI6G+bLh2LAw`?JGme|di&AD;@3io4Etg@uK!tgJXVIDCD5<>lp-l$5HytAR#+ zarm;yZPR~;{{aC3J8$j_1`2VP1o;JXa{S3y^g5G&{a1#-@Pgw&;W?fzjv*44ODEps zYf<2F)wVvjV^dV?|NlNm4L2J-U&yJhxkWsKJ4mB<#ncJU1-%x^#C8~3Joz$-SNYhl zng?qYdHhZq^!-fgInlL5<=!>*TK5d@NwW)m_0#_JFmq4)FZprYzvoP)fXbWZ_Um9Cl{`XWO}*mX_C~tHDa-!?VsF#e}mEd Wnfxv5uan(Cf#d1w=d#Wzp$Pz^qeSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00EszL_t(|+N9OLFM~lC!12D-G^C9mOGQjVVj&R{CP{-%3=EwNOg8=n zs}UmuiNT--k;Y_XAW;hg34|z5ie|pLY4IwPy-TsXNvIeOyYTE_kW&KMM zhOuo|7xKVKGofXy;R+V8g%iBP@>#A3X3>c_&dfC&!@QPvaH#9}>5@nuQp7QO(1&G= z{=7IwD5Fdp(|?#iQp;a1Y+cJ3){TDSGTR_oyD_9wbix@~&P87T%lF%q{7AxnH0rka zZ^!_8Q6~x8r4XnsWH8N$1}nVDYQl1+{8;03ojh`CvQjw5t5%jgP5<4v9pOt^%b*rA zsCP*i_EDaA&&e#CbQL2;vV9C_o7cvEGU`r|{%JIh-eo3ckkVzyS9oC!NTLe~9F^ZT zQ5@LS$F$dNBO+KcuBg0TTW>0d4{f{EV;b;F=tv-iJ55;7WdKHUX&^B&AWdO%ATls9Fd#5DIx;yrGBhA9Ff}kRd=FtO00007bV*G` z2igM+4FM=taaw5r000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP0006- zNkl@0hvaw-?ftf?A!kRA9JHcPb!t;Kp^^;tt*{>HLD z0$KrPvsv2hcC=ovX}{l7v)LraacH~U(&6Cq+Zyyid-{i1$o8gy<#L&3vzgzRPN)6y zWHO<_U_hJAhNjc0Dgz!167YEWt6sn?v=HwqfUQ<5@(+nbf|ALkD&uL&Di-*i)oOJF z@4Bvpe^bbu1w3V`RLU<)`1yQJwh6;)NHEEayb-|xTgS8OJi5T57x=cP%vBF$P?1(Xw? zg23dcBSUOneObU4*KW51P$mulVYX-g-xVv?NUZ#) z@C3ZG&|7xB>sBU{q2+R^Ab5L_5SMzg4(pNC)&j&t_rJ@{+tL$%*KzSEw&pqFwjH*= gtlbOdaW7raKf&EVl|Tw>#{d8T07*qoM6N<$f<2E*Pyhe` literal 634 zcmV-=0)_pFP)JBLM$$tHqD-Qd_8>~L z>3if`9O5z<+{rF{m^=63`JMCo{mz&zl}efUKJsPm?Z+0}#t>fMTP1?XmRX52*z5Uc zyuvUB@BpLuQt6fW8U>KUdTcbXF!<{zs6jmU*;IpwkFZ=*rX#C0C}Ot(zrmv@sHgat zW)Q#Ar#Pr^UWHXyhh1JD!(&qyf_s9uX#|lJ)UTDAcJPq81+G-kio58-xX-24;}h?To`QX&c|dbv*o=BF)cn;H z?B|3tyn~z0e6rH}#JC$$pS$LLy!_WY=Dh!Qw4fcIY^|c#LQ0le2lucY4LI+6ZD_P^ z`mK|FZdwcR0X_H;50*;^U>VMuiUPXrg4O8se%^sjq1QmdaSUs{AO6Nx)Zz$sc%D%D zq~i|-jN&v}(d6|Nc!r$cH{%8_;DFbLum{Z;L5tU~p)FyoSxGA~;no|r<)i4ZHS28E zB|f(kGkEWL#_!=@fRncIh}Wx3N8*tb#B!JU9FAjCw2bxUv)=7^$`)?I2Ge#J+pL|U z@6|;uKc~WchfB^Tw9X+5Y7s8_Gu~)%9`v0PSc%IPbH-ww@%&1;_Wmzg^rrv=0P(-_ UB8`Mk_5c6?07*qoM6N<$g8q9l`2YX_ diff --git a/gfx/triangle.png b/gfx/triangle.png index 67b62a250f7c1a38b3d1446ea703200315d8ec2a..bd2b03829c44a0faee17306bfc94a157b97e2e19 100644 GIT binary patch literal 573 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQaEa{HEjtmSN`?>!lvI6-x0(?ST zfi!*~uP!gEEGxE9OnR2Iq=6*Eeg?*Uj249!Ms7w*{YvgJ?n0tMVhh9!-3^u7lsUF= zNX(URNpSHF^OozA<5|b!5#^y*r>EAXrrxQp+^cMtVJALM+%?WsbfKt!puc&cxyT|B zvtl#1ST}Bc!h{Wa8iO=&68}PJ<<}a^)zqfpLXn(~KvHth}-Ih*~Fu3qrv2nh~ z1e=u$C%)gwH}P@RKHjO8hZ<&O{qDv=TG!+5G;;l-}h;Sz_%$6-?3HvN!2?MoOju1|DHs% zx#t?#pKU9g8tnPV`opO|oOiqfEW5Vc5w`JuSl;w!R^;SX%}xB3kK`4$2An#7JVN4F zJm)d?Wie8+ivHqZ;Rp6*KDk)fHgA%xq-WdyHyi&v322L7doy!qTKb8gxr%d3m9peSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00IF?L_t(|+KkoDOH@%9#&PdZ6IqM0glK6BMyr&dKftv_8(Rn#6m1j@ z7m98~X%!WuE~KDEF5K8ES1zPg>o%dKk{D5nNIGLPZ`8FxV4ywjkSLts4{iom}6=0XowH_GmyJIVs{RPU4y}Ozv;%|2|s7 zfLF1l%yMpkwSQhzBZD_C%bd$}5j8&Gc+k;jm&GXVq9MrAPu!IRJck7Z2s=H(d0qRc z$tTN9ZjU{S$U5BA485quo`N>x7Dn_x6O4`Q!hae{3hcAXYPS^Kq?Y9%7Vy?( znb9uVv>IN(lIl>@4mg9Sae8Y(4i-o zv06qtZJO{w9otogoPvclPRe30>^de?^X5O}+}0a%Td!~o_P9G5bEn*1wypKb9S->l zO6uEx)Jkb%B^cK1v0jp2z&_AA?pHd#5;yP~%WmfsbtZnoGh8V*HmdLmu%o};eFA>q fvtC%)b|}CAR>-E|c+)>a00000NkvXXu0mjfg$opr diff --git a/gfx/up.png b/gfx/up.png index 0394c3760edc3f87e7f02e228316cdcbf800f39d..076bfa97e44fcb397ae72a79aa1b4c090e53f190 100644 GIT binary patch delta 397 zcmV;80doHC1EvFzBYy#HNklotn- zd_L)PI??fXq#y`t-ggrK?0i1c<#IuAG_WWNYKwvQ`@M#hWq+_~LydjtvOhLq7?NQaq-h#KilR`S z=QVV{-xCB_l7A%V3XcHu2anwEZ`rnO5<-x!>kRGADFEmUb-i9G%QA|hh*{{6;fKRP zHjoySFCWK5XG1VH9ZAP=$TZCc3K(~WV-CR>_ztS7D!+4d2QXl995ZaJq-9ysbzQky rt!lqqE~OAczWaA7e?bTLeM&#K(=H5DI#J~S00006bB~~(UvGKYW=rse4l<(&ouL9ZTsre?!0;Lw{L#$_kU(B$8jQ+Y*iumd(nz7 zSn|1veBcbVLW5oBZ!4hLG$(9@Z}Ry98}IlwO|T;sZgz<|c0`Tjvh09c5-5sV9N|7} z1uJMnQTnQJfk~_*jd@&S46hiL`vv(yTkyz;}jln<1^lJa~MM-p0pe4kuvB< z2S#xyr(_WOn9$~^R;L!A0-j(AA96#L#v{6sz=mwjG~yV*0(N90+)Yuj&eXFFrso*MFZBCuk?jeIMGg zK{2f_7Eod(1ym=f9tYYhOO@BEDWDbd7tn;H7O*Hq{TVdjM}PqUW%x$~jt+cXxLH0083R;tmcD!NI`*004Y@d}Cu~Z*OnP%E@?ner#-P zZEbDM&CPFbZ((6&k&uy7Q&WhDh;40c;o;!`007d`(EC|ZK|w)fWMz|+lYV}FV`F0v4-ZaGP5=M^OG`@+4-ZsR zQ)p;tR8&+_QBqS5m~wzj^$z8@bSLPbl9jEp%s zJgcj#Jv={GT3gT0&!(oP78VvEAt9Tan=LFXu&}VaySrgwVqITg8yg$V&CE|wQb|fw zSzBB>K1IsO$v;3v$HvA~RaZVnQ!O(*N=r;nQBpibQA9{j!@|N`U0*LRFvj zLPA3~H#apqMNm&rWMgDBG&C?ZKS@YQT3K36PERo~F-%NNL_|bVQBhS?Ra{(LNl8gp zR#!nlK}$pH8npzKVDs3IyyQyH#j{# zJzH8^IXF38TwOamJ3l@?0000wIXOH$JUlx)J32Z&JUlu%IzBxzUN_W{Zt?kQ{*NJwf zCx`hhUvis=OqX%LGtvtfS3yN;aQ^vo{>{xw==o-Gl&3& zc(Swr02N$GL_t(&-tC)ve3RFC$GiLeer>yUZP#^Ob7_+-NfSnzUAv}Rx`seD?bfCV zg~1>sE)W8^Hkg~Sv9WO+V~7a0F-fo`Vem!9*fOz2kT76bmSyW^Nw%!JWORF9z3StU7U}IxrQ+FA>IX0l!7&ZLHz?FZ5$^MaT z^$Rb&uzK}VYt}rs<~iBcfIYPu?1dtOmrt#RZ#=j9=p)aA()1C^HP8J|$~8o}>UUPt zH&M6de;bkvu;#fJzVvgd$3D&8e5!b^it@h`{ssX0S-;139e03X>f7YCWy?5Acn$3Z9vLPnCp z#HsZixMs~4QORRS&lx<`NiDS>2v4b|KNl7-g)QbmhYpTeCM6_K6wBA z^B-Qnbb26;vz3Yffl{DK9CUu@%w>&MqtR%cd@?BL&eYY_wbq#e=bk6PczS_Wk8A&-F)$2-4HxS@KM1(8(8Q&(+YgfXyTL(Qz{`ArU`+> z2QTvW8!>f>*Vo?eoAq&Bp&Mi0O|i5^T#x5F37{|&O16I468)i=18CXpI=j*1i6uOq z>FGowq$kVdd5!@3i$JOq^Fb7xmc}H0hW`){A3U<_wqo^sns{eEEQeT}21=f%fZit_ zbaKmcJcs}S4@!|C3m#;Zl_U*_?#9-G>Mpff?NY0|X2v@JPwSa8GXWZ4Ovyrw zW=xt!;4$X)H*^Pl-jd_TH*Y?^ue~j4I676xBxJVKgHoMznK@g3D3m}8g+e`c3lK?6 z&*^oBxw+VI3~X-N!GxVMAc8iUms8Lp%U>ezTsVBY*meeKJ_z5LgD}J>AmTz`C&7W< zBYYsluEmoqA1HvJYEmVpAk*OB*|TRm-~+6?`)n&%UEO2^7b+{$MM+wMXF?~N>$%Yo z_w92Zr*JmP$)(6S+T$-dIA>`+CV-yg&5Fi3PatdOA=xh~0VMU36Y=eW1 z#0JqC8(ZOXU0q*5VD*+L3xEobGv``okB{s-5Olju+5_$b2TFiYU(6IIN{q3boP*>L zBOXLe=RrIci{1#{6SElf)P)cbS!P`Eplp`ZKYo6m)&&eSw|m>ux0hP|o*)UaLXt+b zm`V8b*y(d0QbLFb@vs0RNt%;r=_n*=IS1iW$!iAzP2*rIvB6e?sjjX&g=tn2nR2uk z5Uqc_yFU^1MM_EzfOQ`)DJj|an!k;+8w8@HW9AhPBFmH%Ks~WgVmdKrci4L%0mbHw zQy5@#o`g|ku~|scP#DA|4it3G?!E)huBzR;=c&WXfZ(aH0+>TUln^pPqkOJkzkYS^ zwNB_RGx$_wKm{fG!OY;ngO|~FE;k+|e;OMvx3=my>?{_Po{M?Xdv{x=N{6dRti_h1^D^Ej{o!ZPJD zk2x(((jI!yJhVYU6IZ`9x^BNxzh~p^-HSA17Cb0RT8nue0A0HN;dx5vJ@^1Tzy|@H zLqNn8!~&p#5{AsF8;1@KUOq_dGPQ$)ttXPWNJYuYJo-Tz>jKO)Z%jmeerR6y#l?on z6DD)S?DzWG0`>t;p!)(;vNF#SiIRit2?#Knf*=PGL{sQNkfd2*U?CRgAnj2=ka)0) zITv?sq*M;G8usepD*WoOoP&m!0)i?wu=nb@>mL$C)ZQiGb^Y9>OSksAIEjX}D9y-# z!b}O4>*^b7?Cl-u9RfQzM6K~uLzEL}tPmv)v1CdvoKQuaq3(tD1=vGG7PKB-t6NxD z@V3udt&{e2mURd)+W-T^Q9$59Si)jGA>uxmpgrh0!^1IygI2LSa!|Z8MGGecHB33^ zynrxX89RL2RcT|w+x^(V3L3I9IF!&4j0G>-%Z|&`ZDwf8o zt0d`EJjImrd_H&a?9hphjuRaxhR}CNH zKEK{HI|3ipHqDSbrJ!X=I>m$p&~zeXG?L=QY;Fz+#d>r|iYDn?Q5B2JPX*kacSh=w z#YTHYzhP}ZqT0Bp{uNrp($vJxVHuFDEC516=P4e_=PG&-HYKP`G7l;!v5NJb=!Gf| zHbmF}sS_u92Ya0$lN2RO(y$evog%-OAN6QQyk0LSMaB~I5wqHE?hK5~&bFB>HtMr! z+*DBy;&2ZEgfcV-^*e?`GzAen7+{d54bu=}2?tSvP|iUqY{E%f3*ohmCLe9cer2j+ z)6;;ZidM7TR@iGKQ79Hd3>$w`X0GkMb?MSM84-K}_c;f2uHL$JYjal$a&0;Xk5iZ_ zR57XqTkJdA(GBenv_Ks?=!QB-Pc(SKl)_ZYlnhXY^!;?xnH#l?`n=wesl=FPLKllo z+Q*H?NZV|i(_%}Jy#|sMBP_&-FrBf55(H2TdLWvD5;O-5$MgoMX0d4p6S5@T$>Ad* zc@HM*JWQQt>y@!1+Yn0?t!5i{=0w(9q?Z6r zZ8Ke_oe-OQwqXf&-RkWJDS|8vuv^ABA`k*lJJv_CL2p}Lt7-48Bcn}bWPFuWLB}#VQA-ek} z)O~#oeGLr_eG?N6ry5S3YG~-_?bgOA9I8|Rk=epK`JAbvuf2U_L>TWMm4Z-yOU8nd zug!X4bjZn(*%o!uStbMz3JnZ6`i;gAC6wstnFct+7E8=-h!GEBbwSz9E9XJZz@8&l zDmG13z4EG3+DUZzAi7A>lgI|A*nNjTV$N||Rv@{2pG9HpC9mX@xx9R@>lWY z$Tl?*n)=?0-4LG^%dlk(HyY4Mv(`)Ype)%hKz-jiy0vuE=#@=dOE;`DZ!_1%^0S(Vhjp^-ndyIMzER!9%c9Lzb809nD)@|Leb;Ff` zO{H7c`868iKZh51I8=HgATO|4_twgdVE}sU#W4-Fxz&@fLOmrwi-M?Ib`$sebx~)@E~g&@JaSg zKt=Bivn(wsRZQ-rJ$6rj%-C;;VHQGz?g!dLBV0(p4rD6UBMWJWMFIiRAc(@wb(Phn zTeoi5aAj)pX4DPkYuAOv93G~J@%#XL5|QlVWI(9^?PkO%J3GZ~oanYYj7Epf%~2&b zdjffw@PiDHwOA=?kdI5 zwOjoL%Z$I1dL0q6J}5;utI;$7N*sKtP7meEt`D)z2JBF$^uu;f>r0J24kMdvpa3X| zQ5~G!x$@AMwN7(QE~(>1!oMz#xvv^CXPV@ z%Otx_xb~6Dd_fs?x?DDs$)+8J`wzF%?RGD^;W|V+t|85&L<l{C|1Q%@uI5~*u;Uk-6tA{ zjAX~41_yz42wWJI67H(ftdq7DE5+dGIMe|l@3d)C3w}RrIn7#)&7?J@ij~ZRFvMtO zAjZWt-IsNyh?fvbt2??!{buU%K!~)&g%Cp_Hj4Hhqs|i2lPxQr;KP};-V?Lv=j>Cu zDF-BJf#ifp0T9VS(DOTQ*1J}2tG7CXygP`8_5uS0bSNQGb>n&k5IOHBo0Od9DA*0- z8~?@Zbv>Spd!qEZ3F`tZlX=h*<^1UQVsxI5@@`Wm02h^Tsfc$CS{p~oCs9fTKpaN^ z@iekC0rw<4lLqzZsJfwhVpO~tfthkevn>F^WlARCa_W>Pk#LanRg2Nlg@xr$pQPA z14&)J? zL-%EIh}a%r5=t&9^F>O2k;lt8xFF64qsh1# zE<(brrX*2_W18hNX|hFu0Y;(qn7nrJ+PE_ikGP>EXy7KC(`w-|7|i7kGogI-940pm zw4~s9B96@nktBp+76$(bvxf=UOMk~!1C{wj$h2T@%68gKk`k;kEXW%bZgk03gLuL` zFOMfb6ajDf!-z*wCh6Tg?#05i2bU*{cR%?YR1<9W*=#v-$3}-_fU@*t8HMydHAC*E zMTz`M0lA*X@D9WSoV-jk4Y4ddAUKhR8&x;8AW#1aLV{c+w>yr&&o97uoch$Ka|gY>yPh6 z`P-`JSKN#6cb@=2ciAsC*EauV(d&nIw6y%R>c`dY2K37{<+b}i{=nB{d*I_`m6er0 zwG4>aFSRt+>~F5!-_*3fX8-=0W6d?qWiS0}bJ@eofQYRsJ9MZ~-F&FFb_Y08ZS#)W zmgbfX6-~!}^6_OrX!jqg99p?`aQ%+*%Ce^F=KZxT``=i$xw0vb55Y5Qd4I4@) zDt5GNDs3sR-CEsL^Dk>(-m&RBE%z@2Li=)aOUqziZFyN`O?e9tD%)RE+fur|xuxmL z%Ye{6Q?ujP+KQI#UFnr&)nn^xH>JC_*Szs>$9B|wW*HFL=c`+qnw!e|yqnvqt8Y|S zU)bC}RSw0hsqAyhfWV&lY)wmZQ&X+!bhmG9WkqF0``Nvkvht>;W6i(!*fJoM>WkI2 zO~($k)NDAuxvugPKmUo!!Oh1js;kS79XeL|#brP$)sy?1fkn+{KUuxL`d8ugFI2DJ z{>hbV%Ya(hlgofqss|87%liB8d+?D@!T%zo`t?se^5Ck6ODkL8-LEbKQmGyS636y` z?)fEeKK6MGyrwTK15&BJ+I;9xdBvSg^H(ZrnvXRtdl1<34;^dXes@dwAh^&&%VnPW m&=)=`89({8AI}u6QvC?Vt~u9Jklx+^0000n@YDg=oTi3gq#DnbMg64CHP#1O-Cf3+0M1xe7AeJhTrmA}V zzufO8lX2$GnYnY%+|JxD`Q_%GnK}2IZ_e`nzL~2>qfsr)mZgQ-Pj)hFQ(z`oX81l0tPaZ*=m=heo~H6fFbvcLeFPj7be=2+ z91r>wm<^UBI6eui4eAu=0N#TdggxCC=-Wj!Lkbpe)Z} z9gULbeMv_Lv`Cg|HuF2_g+7xH2)hH^EP_42XfOyggU8^N&5G@7&cjOwP}sT$j5C#= z1slLig&mU>NqJs5fcD)hpq=2@0x%R5fjUJF_zcdm4k%)AWwZ(wUlj>!AtfkDMbzH5 zN!GPeaP1BUZHc4v=OsaX{SC)0ak2?|lNP|#sYmGuGrwOI1BIKj@eC6!Xx)pp}zG-k87 z8luILq$9v!9`d;f>e&fyrP2XyHXtti5$@6fdl4& z`Cz0)!X%MCp)B$~@IXa0C|c~gd*Fa#hn>C$E`xF{_6*^ds&M$3pllsD;kFSrYfBRg zo#%Xq?=l~F*taC}18y8}fg5F%pAl}{R&brSpg&2piz3Qu-p*)2d&oK@EfON%z;;G6 zIf3Tl6CRq>_%|H3)=TP-?<}flG~G~=ElJ|RNI5TDiL9FM9%YU0bLOa)7rV2jbLnl7 zWrFgwbwFFr4y~{dN1|=&5i3dB$4gB+$}zB1xsY~|gfLSKj)1RGd20}qZT6roj`2bX zUgJoR_Ti~aq0QEqYaw-&n^#h}f#*4K1a#pX;zZW#g_`|?481iwz-aYM4JT1@SkBJj zMJ}SH(esE@H>8=x(F3PC#i)4i!LAxR zyS{C-*dHnALB}c1E;XuZke>PPaL6s=fUrB@p8x{@$68w2+*;L)00000NkvXXu0mjf Dw3ID); configSetInt(config, CONFIG_ITEM_SIZE, cur->sizeMB); configSetStr(config, CONFIG_ITEM_FORMAT, "VCD"); - configSetStr(config, CONFIG_ITEM_MEDIA, "ELM"); + configSetStr(config, CONFIG_ITEM_MEDIA, "PS1"); return config; } diff --git a/src/opl.c b/src/opl.c index 1d0d12278..5f888b18b 100644 --- a/src/opl.c +++ b/src/opl.c @@ -1217,10 +1217,9 @@ static void setDefaults(void) //START of OPL_DB tweaks gELMStartMode = START_MODE_DISABLED; - gDefaultBgColor[0] = 0x030; - gDefaultBgColor[1] = 0x030; - gDefaultBgColor[2] = 0x030; -//END of OPL_DB tweaks + gDefaultBgColor[0] = 0x000; + gDefaultBgColor[1] = 0x000; + gDefaultBgColor[2] = 0x000; gDefaultTextColor[0] = 0x0ff; gDefaultTextColor[1] = 0x0ff; @@ -1230,9 +1229,10 @@ static void setDefaults(void) gDefaultSelTextColor[1] = 0x080; gDefaultSelTextColor[2] = 0x000; - gDefaultUITextColor[0] = 0x040; - gDefaultUITextColor[1] = 0x080; - gDefaultUITextColor[2] = 0x040; + gDefaultUITextColor[0] = 0x032; + gDefaultUITextColor[1] = 0x0ff; + gDefaultUITextColor[2] = 0x030; +//END of OPL_DB tweaks frameCounter = 0; diff --git a/src/textures.c b/src/textures.c index 484a1dcf2..4d03145bd 100644 --- a/src/textures.c +++ b/src/textures.c @@ -38,6 +38,10 @@ extern void *R2_png; extern void *logo_png; extern void *bg_overlay_png; +//START of OPL_DB tweaks +extern void *bg_overlay_2_png; +extern void *info_overlay_png; +//END of OPL_DB tweaks // Not related to screen size, just to limit at some point static int maxWidth = 720; @@ -82,6 +86,10 @@ static texture_t internalDefault[TEXTURES_COUNT] = { {R2_ICON, "R2", &R2_png}, {LOGO_PICTURE, "logo", &logo_png}, {BG_OVERLAY, "bg_overlay", &bg_overlay_png}, +//START of OPL_DB tweaks + {BG_OVERLAY_2, "bg_overlay_2", &bg_overlay_2_png}, + {INFO_OVERLAY, "info_overlay", &info_overlay_png}, +//END of OPL_DB tweaks }; int texLookupInternalTexId(const char *name) From eafc15e90a66d5293dd3891c3028358eebfada48 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 8 Mar 2018 14:45:57 -0800 Subject: [PATCH 078/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Arabic.lng | 12 ++++++---- lng/lang_Bulgarian.lng | 14 +++++++---- lng/lang_Czech.lng | 14 +++++++---- lng/lang_Danish.lng | 12 ++++++---- lng/lang_Dutch.lng | 12 ++++++---- lng/lang_English.lng | 6 ++--- lng/lang_Filipino.lng | 14 +++++++---- lng/lang_French.lng | 12 ++++++---- lng/lang_German.lng | 12 ++++++---- lng/lang_Greek.lng | 48 +++++++++++++++++++++----------------- lng/lang_Hungarian.lng | 12 ++++++---- lng/lang_Indonesian.lng | 12 ++++++---- lng/lang_Italian.lng | 16 ++++++++----- lng/lang_Japanese.lng | 12 ++++++---- lng/lang_Korean.lng | 12 ++++++---- lng/lang_Laotian.lng | 12 ++++++---- lng/lang_Polish.lng | 12 ++++++---- lng/lang_Portuguese.lng | 4 ++-- lng/lang_Portuguese_BR.lng | 12 ++++++---- lng/lang_Russian.lng | 12 ++++++---- lng/lang_Spanish.lng | 12 ++++++---- lng/lang_Swedish.lng | 12 ++++++---- lng/lang_TChinese.lng | 16 ++++++++----- lng/lang_Turkish.lng | 12 ++++++---- src/lang.c | 4 ++-- 26 files changed, 209 insertions(+), 120 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 18b52f7af..98967b144 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1036 - Jay-Jay-OPL - add new default theme and splash to OPL - 10TH ANNIVERSARY EDITION - Wed Mar 7 08:24:16 2018 -0800 rev1035 - Daniel Sousa - Pops ready (#6) - Wed Mar 7 08:00:17 2018 -0800 rev1034 - Jay-Jay-OPL - SP193 - Added workaround for bad GameStar adaptor to in-game ATAD code. - Wed Jan 31 17:07:11 2018 -0800 rev1033 - Jay-Jay-OPL - revert changes from: sp193 Added workaround for bad GameStar adaptor to in-game ATAD code. - Sat Jan 13 15:09:55 2018 -0800 diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index fc1a8519c..8f2ca96a2 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: 10/18/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s @@ -248,5 +248,9 @@ LMP الاصدار: اختر منفذ من اجل نقر متعدد المحاكي تعطيل الحل لوحدة التحكم الوهمية بعض التحكمات تحتاج الى حل، سيؤدي هذا الخيار تعطيله -قائمة مشغلات ELF -مخصص ELF \ No newline at end of file +PS1 العاب +PS1 وضع عرض الالعاب +POPSTARTER.ELF غير موجود في '%s'! +VCD ملف '%s' غير موجود! +حدث خطأ أثناء إعادة تسمية الملف. +حدث خطأ أثناء حذف الملف. \ No newline at end of file diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 2b8baec9d..baa7ba9b7 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -226,7 +226,7 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -USB bluetooth adapter MAC address: +USB Bluetooth adapter MAC address: DS Controller paired to MAC address: Pair Pair DS controller @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ELF Loader Menu -ELF Loader Menu display mode \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index 01f6191a2..f93a8c0bd 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -226,7 +226,7 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -USB bluetooth adapter MAC address: +USB Bluetooth adapter MAC address: DS Controller paired to MAC address: Pair Pair DS controller @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ELF Loader Menu -ELF Loader Menu mód \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index 4b287ef9c..df754f7c8 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: 10/19/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -248,5 +248,9 @@ Multitap Emulator på port Vælg port til Multitap-emulering. Deaktiver løsning for falsk DS3 Nogle falske DS3'er har brug for en løsning, dette deaktivere den. -ELF-Loader Menu -ELF-Loader Menu visningstilstand \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index e8a6c8d39..2df3c0a3f 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ELF-lader menu -ELF-lader menu displaymodus \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 4a3bd23f3..83e4126cc 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -221,7 +221,7 @@ Re-download existing records? Update failed. Failed to connect to update server. Update completed. -Update cancelled. +Update canceled. Download settings from the network? Customized Settings Downloaded Defaults @@ -244,7 +244,7 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -USB bluetooth adapter MAC address: +USB Bluetooth adapter MAC address: DS Controller paired to MAC address: Pair Pair DS controller @@ -271,4 +271,4 @@ PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error ocurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 390f739b1..8d133a3de 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -226,7 +226,7 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -USB bluetooth adapter MAC address: +USB Bluetooth adapter MAC address: DS Controller paired to MAC address: Pair Pair DS controller @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ELF Loader Menu -ELF Loader Menu display mode \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 1f961a732..23c7dddf8 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel -# Last update: 10/20/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -248,5 +248,9 @@ Active/désactive l'émulation du Multitap pour le jeu sélectionné. Sélectionner le port pour émuler le Multitap Désactiver correctif des DS3 simulées Certaines DS3 simulées nécessitent ce correctif, cette option le désactivera. -Menu lanceur d'ELF -Mode d'affichage du menu lanceur d'ELF \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_German.lng b/lng/lang_German.lng index e97ab93cc..84e1a685b 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and lopotri -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ELF-starter Menü -ELF-starter Menü Anzeigen \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 9567936b3..85240ba86 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -147,7 +147,7 @@ VMC γενικής χρήσης Χρώμα επιλεγμένου Εμφάνιση σελίδας πληροφοριών Πληροφ. -Προσαρμοσμένο ELF +Προκαθορισμένο ELF Επιλογή χρώματος Επανασύνδεση Αφήστε το κενό για απαρίθμηση κοινόχρηστων. @@ -212,7 +212,7 @@ Patchάρισμα των παιχνιδιών από το PS2RD. Τιμή σε δευτερόλεπτα, 0 για μη αυτόματη εκκίνηση Λογότυπο PS2 Εμφάνιση μόνο για συμβατά λογότυπα δίσκων που ταιριάζουν με το console region. -Προσομοίωση Χειριστηρίου +Ρυθμίσεις PadEmu Ρυθμίσεις προσομοιωτή Χειριστηρίου Ενεργοποίηση προσομοιωτή Ενεργοποιεί/απενεργοποιεί τον προσομοιωτή για το συγκεκριμένο παιχνίδι. @@ -232,21 +232,25 @@ DualShock3/4 BlueTooth Σύζευξη με χειριστήριο DualShock Σύζευξη του προσαρμογέα BlueTooth με το χειριστήριο DualShock. Μη συνδεδεμένο -Bluetooth adapter information -Shows more information and supported features -HCI Version: -LMP Version: -Manufacturer ID: -Support features: -Yes -No -Bluetooth adapter should be fully compatible with DS3/DS4 controllers. -Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation -Turns on/off Multitap emulation for selected game. -Multitap emulator on port -Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -ELF Loader -Εκκίνηση μενού ELF Loader \ No newline at end of file +Πληροφορίες προσαρμογέα BlueTooth +Εμφανίζει περισσότερες πληροφορίες και υποστηριζόμενες λειτουργίες. +Έκδοση HCI: +Έκδοση LMP: +ID κατασκευαστή: +Λειτουργίες υποστήριξης: +Ναι +Όχι +Ο προσαρμογέας BlueTooth θα πρέπει να είναι πλήρως συμβατός με ελεγκτές DS3/DS4. +Ο προσαρμογέας Bluetooth ενδέχεται να μη λειτουργεί σωστά με τα χειριστήρια DS3/DS4. +Ενεργοποίηση Multitap emulation +Ενεργοποιεί/απενεργοποιεί το Multitap emulation για το παιχνίδι. +Multitap emulator στη θύρα +Επιλέξτε θύρα για εξομοίωση Multitap. +Απενεργ. workaround για ψεύτικα DS3 +Κάποια ψεύτικα DS3s χρειάζονται workaround, αυτή η επιλογή θα το απενεργοποιήσει. +Παιχνίδια PS1 +Εκκίνηση μενού παιχνιδιών PS1 +Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! +Το αρχείο VCD '%s' δε βρέθηκε! +Παρουσιάστηκε σφάλμα κατά τη μετονομασία του αρχείου. +Παρουσιάστηκε σφάλμα κατά τη διαγραφή του αρχείου. \ No newline at end of file diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 8aefeb943..e320bd29e 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: 10/21/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -248,5 +248,9 @@ Multitap emulátor ezen a porton Válassza ki a portot a Multitap emulációhoz. Megkerülés letiltása a hamisítvány DS3-hoz. Néhány hamis ds3-hoz megkerülés szükséges, ez az opció letiltja ezt. -ELF Futtató Menü -ELF Futtató Menü megjelenítési mód \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 2428ab5a2..fa0b9391a 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: 10/18/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -248,5 +248,9 @@ emulator Multitap pada port Pilih port untuk emulasi Multitap. Nonaktifkan solusi untuk DS3 palsu beberapa ds3s palsu butuh solusi, opsi ini akan nonaktif. -Menu peluncur ELF -Mode Tampilan Menu Pemuat ELF \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index 27b4c2bd5..8e8a641b2 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -218,8 +218,8 @@ Enable PadEmulator Turns on/off PadEmulator for selected game. Pad Emulator mode Select Pad Emulator mode. -DualShock3 USB -DualShock3 BT +DualShock3/4 USB +DualShock3/4 BT Settings for port: Select Pad Emulator port for settings. Enable emulation @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -Menu ELF Loader -Caricamento menu ELF Loader \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index 8169f1f47..8544486d7 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ELFローダーメニュー -ELFローダー表示モード \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index bb504e548..91f799933 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ELF 로더 메뉴 -ELF 로더 메뉴 디스플레이 모드 \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index 8914d3ecf..d808c3a90 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ເມນູສຳລັບຈັດການ ELF -ELF Loader Menu display mode \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index 44135188d..71352b8e4 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ELF Loader Menu -ELF Loader Menu display mode \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 44a2567f8..bfb5cf2dc 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: 10/21/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 7745d1e3c..fd4fa70eb 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 10/20/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -248,5 +248,9 @@ Emulador Multitap na porta Selecione a porta para a emulação Multitap. Desativar solução alternativa para Controle DS3 pirata Alguns Controles DS3 piratas precisam de solução alternativa, esta opção irá desativá-lo. -Jogos em ELF -Modo de início dos jogos em ELF \ No newline at end of file +Jogos PS1 +Modo de início dos Jogos PS1 +Arquivo POPSTARTER.ELF não encontrado em '%s'! +O arquivo VCD '%s' não foi encontrado! +Ocorreu um erro ao renomear o arquivo. +Ocorreu um erro ao excluir o arquivo. \ No newline at end of file diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index fe852c20d..d1fcc4a5f 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: 10/18/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -248,5 +248,9 @@ Multitap эмулятор на порте Выбрать порт для Multitap эмуляции. Отключить работу для фальшивого DS3 Эту опцию нужно отключить, если DS3 фальшивый. -Меню ELF Загрузчика -Отобразить меню ELF Загрузчика \ No newline at end of file +PS1 игры +Отображать экран PS1 игр +POPSTARTER.ELF не найден '%ы'! +VCD файл '%ы' не найден! +При переименовании файла произошла ошибка. +При удалении файла произошла ошибка. \ No newline at end of file diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 5f0039b28..c62f4f3be 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: 10/18/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -248,5 +248,9 @@ Emulador multitap en el puerto Seleccione el puerto para la emulación multitap. Deshabilitar la solución provisional para DS3 falso Algunos DS3 falsos necesitan solución, esta opción lo deshabilitará. -ELF Loader Menu -Modo inicio de menú de ELF Loader \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 65a02fc61..e0f1d83d4 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -248,5 +248,9 @@ Multitap emulator på porten Välj port för multitap emulering. Inaktivera lösningen för falska DS3 Några falska ds3s behöver lösningen, det här alternativet kommer att inaktivera det. -ELF launcher meny -ELF loader meny visningsläge \ No newline at end of file +PS1 Spel +Video läge PS1 Spel +POPSTARTER.ELF saknas i '%s! +VCD fil '%s' saknas! +Ett fel inträffade vid namnbyte. +Ett fel inträffade vid radering. \ No newline at end of file diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese.lng index 480cfb0da..5ba69fbc3 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese.lng @@ -1,6 +1,6 @@ -# Translated by kane159 -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Translated by kane159 +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -226,7 +226,7 @@ Enable emulation Turns on/off Pad Emulator for selected port. Enable vibration Turns on/off vibration for Pad Emulator selected port. -USB bluetooth adapter MAC address: +USB Bluetooth adapter MAC address: DS Controller paired to MAC address: Pair Pair DS controller @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ELF Loader Menu -ELF Loader Menu display mode \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index 19ea8f392..cc4b298df 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante -# Last update: 10/17/2017 -# Updated for OPL_1030_DB [c3257f5] +# Last update: 3/7/2018 +# Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -248,5 +248,9 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. -ELF Loader Menu -ELF Loader Menu display mode \ No newline at end of file +PS1 Games +PS1 Games display mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. \ No newline at end of file diff --git a/src/lang.c b/src/lang.c index b283d73a3..3597bffd5 100644 --- a/src/lang.c +++ b/src/lang.c @@ -216,7 +216,7 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Update failed.", "Failed to connect to update server.", "Update completed.", - "Update cancelled.", + "Update canceled.", "Download settings from the network?", "Customized Settings", "Downloaded Defaults", @@ -269,7 +269,7 @@ static char *internalEnglish[LANG_STR_COUNT] = { "POPSTARTER.ELF not found at '%s'!", "VCD file '%s' not found!", "An error occurred while renaming the file.", - "An error ocurred while deleting the file." + "An error occurred while deleting the file." //END of OPL_DB tweaks }; From a544f5a5dd38eb58d814bd5f54727f9b45f6e6f3 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 9 Mar 2018 15:36:00 -0800 Subject: [PATCH 079/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Indonesian.lng | 10 +++++----- lng/lang_Russian.lng | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 98967b144..02740c5e6 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1037 - Jay-Jay-OPL - update lang files - Thu Mar 8 14:45:57 2018 -0800 rev1036 - Jay-Jay-OPL - add new default theme and splash to OPL - 10TH ANNIVERSARY EDITION - Wed Mar 7 08:24:16 2018 -0800 rev1035 - Daniel Sousa - Pops ready (#6) - Wed Mar 7 08:00:17 2018 -0800 rev1034 - Jay-Jay-OPL - SP193 - Added workaround for bad GameStar adaptor to in-game ATAD code. - Wed Jan 31 17:07:11 2018 -0800 diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index fa0b9391a..e1b6de9e8 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -249,8 +249,8 @@ Pilih port untuk emulasi Multitap. Nonaktifkan solusi untuk DS3 palsu beberapa ds3s palsu butuh solusi, opsi ini akan nonaktif. PS1 Games -PS1 Games display mode -POPSTARTER.ELF not found at '%s'! -VCD file '%s' not found! -An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +PS1 Games mode tampilan +POPSTARTER.ELF tak ada di '%s'! +berkas VCD'%s' tak ada! +Terjadi kesalahan mengubah nama berkas. +Terjadi kesalahan menghapus berkas. \ No newline at end of file diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index d1fcc4a5f..e155b1805 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,5 +1,5 @@ # Translated by druchapucha and frodosumkin -# Last update: 3/7/2018 +# Last update: 3/8/2018 # Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian @@ -250,7 +250,7 @@ Multitap эмулятор на порте Эту опцию нужно отключить, если DS3 фальшивый. PS1 игры Отображать экран PS1 игр -POPSTARTER.ELF не найден '%ы'! -VCD файл '%ы' не найден! +POPSTARTER.ELF не найден '%s'! +VCD файл '%s' не найден! При переименовании файла произошла ошибка. При удалении файла произошла ошибка. \ No newline at end of file From 152e6be15f6a1fde5d17a4a8e9fe58e80759de8f Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Mon, 12 Mar 2018 17:58:06 +0000 Subject: [PATCH 080/269] Fix pops prefix (#7) * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Make the game list work. BUG: If the theme doesn't provide the mainELM/infoELM the entire theme disappears and only the game list shows in the ELM page. * Fix the last bug with the special ELM theme!!! * Replace tabs with spaces. * Add the comments to changed lines. * Change tabs to spaces! * Fix the USB Prefix in POPS * Fix previous commit. * Formating fix --- include/usbsupport.h | 1 + src/elmsupport.c | 4 ++-- src/usbsupport.c | 13 +++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/usbsupport.h b/include/usbsupport.h index e70175916..05a78cf45 100644 --- a/include/usbsupport.h +++ b/include/usbsupport.h @@ -19,6 +19,7 @@ typedef struct //START of OPL_DB tweaks char* usbGetPrefix(void); +char* usbGetBase(void); //END of OPL_DB tweaks void usbInit(); item_list_t *usbGetObject(int initOnly); diff --git a/src/elmsupport.c b/src/elmsupport.c index f0a80ef1f..c4e9199eb 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -315,14 +315,14 @@ static int elmUpdateItemList(void) { //Try USB if (usbGetObject(1)){ //Eg: mass0:POPS/POPSTARTER.ELF - snprintf(elmPathElfUsb, sizeof(elmPathElfUsb), "%sPOPS/POPSTARTER.ELF",usbGetPrefix()); + snprintf(elmPathElfUsb, sizeof(elmPathElfUsb), "%sPOPS/POPSTARTER.ELF",usbGetBase()); LOG("elmPathElfUsb = %s\n",elmPathElfUsb); //Check if POPSTARTER.ELF exists in the folder. int fdElf = fileXioOpen(elmPathElfUsb, O_RDONLY, 0666); if (fdElf >= 0) { fileXioClose(fdElf); - elmItemCount += elmScanVCDs(usbGetPrefix()); + elmItemCount += elmScanVCDs(usbGetBase()); }else{ LOG("POPSTARTER.ELF not found at %s",elmPathElfUsb); } diff --git a/src/usbsupport.c b/src/usbsupport.c index a190f50c9..eb481e79e 100644 --- a/src/usbsupport.c +++ b/src/usbsupport.c @@ -35,6 +35,9 @@ void *pusbd_irx = NULL; int size_pusbd_irx = 0; static char usbPrefix[40]; //Contains the full path to the folder where all the games are. +//START of OPL_DB tweaks +static char usbBase[7]; +//END of OPL_DB tweaks static int usbULSizePrev = -2; static unsigned char usbModifiedCDPrev[8]; static unsigned char usbModifiedDVDPrev[8]; @@ -49,7 +52,11 @@ char* usbGetPrefix(void){ return usbPrefix; } +char* usbGetBase(void){ + return usbBase; +} //END of OPL_DB tweaks + //Identifies the partition that the specified file is stored on and generates a full path to it. int usbFindPartition(char *target, char *name) { @@ -68,6 +75,9 @@ int usbFindPartition(char *target, char *name) sprintf(target, "mass%d:%s/", i, gUSBPrefix); else sprintf(target, "mass%d:", i); + //START of OPL_DB tweaks + sprintf(usbBase,"mass%d:",i); + //END of OPL_DB tweaks fileXioClose(fd); return 1; } @@ -78,6 +88,9 @@ int usbFindPartition(char *target, char *name) sprintf(target, "mass0:%s/", gUSBPrefix); else sprintf(target, "mass0:"); + //START of OPL_DB tweaks + sprintf(usbBase, "mass0:"); + //END of OPL_DB tweaks return 0; } From 16af29e1fcb726f4f3e841f3a6f42c85e3e65c23 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Mon, 12 Mar 2018 17:58:26 +0000 Subject: [PATCH 081/269] Fix hdd duplicate games POPS (#8) * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Add different Main/Info page for ELM page! * Make the game list work. BUG: If the theme doesn't provide the mainELM/infoELM the entire theme disappears and only the game list shows in the ELM page. * Fix the last bug with the special ELM theme!!! * Replace tabs with spaces. * Add the comments to changed lines. * Change tabs to spaces! * Fix HDD duplicates in POPS --- src/elmsupport.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/elmsupport.c b/src/elmsupport.c index c4e9199eb..f3eca875d 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -197,10 +197,29 @@ static int elmScanVCDsHDD(){ char partition[250]; iox_dirent_t record; + char scanned[10][9]; + int i; + int skip = 0; + int partitionCount = 0; if ((fd2 = fileXioDopen("hdd0:")) >= 0) { while (fileXioDread(fd2, &record) > 0) { + skip=0; fileXioUmount(mountPoint); if (strncmp (record.name,"__.POPS",7) == 0){ + for(i = 0; i < partitionCount; i++) + { + if(strcmp(scanned[i], record.name) == 0) + { + LOG("%s was already scanned! Skipping!", record.name); + skip = 1; + break; + } + } + if (skip == 1) continue; + + strcpy(scanned[partitionCount],record.name); + partitionCount++; + sprintf(partition,"hdd0:%s",record.name); LOG("Mounting '%s' into '%s' \n",partition,mountPoint); if ((MountFD = fileXioMount(mountPoint, partition, O_RDONLY)) >= 0) { From f1a53814f25f1e3580cb65deb93c4cbff68fc4fc Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 12 Mar 2018 11:01:14 -0700 Subject: [PATCH 082/269] update lang files --- DETAILED_CHANGELOG | 1 + lng/lang_Hungarian.lng | 12 ++++++------ lng/lang_Spanish.lng | 14 +++++++------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 02740c5e6..a83de73e4 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1038 - Jay-Jay-OPL - update lang files - Fri Mar 9 15:36:00 2018 -0800 rev1037 - Jay-Jay-OPL - update lang files - Thu Mar 8 14:45:57 2018 -0800 rev1036 - Jay-Jay-OPL - add new default theme and splash to OPL - 10TH ANNIVERSARY EDITION - Wed Mar 7 08:24:16 2018 -0800 rev1035 - Daniel Sousa - Pops ready (#6) - Wed Mar 7 08:00:17 2018 -0800 diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index e320bd29e..8f72bd494 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -248,9 +248,9 @@ Multitap emulátor ezen a porton Válassza ki a portot a Multitap emulációhoz. Megkerülés letiltása a hamisítvány DS3-hoz. Néhány hamis ds3-hoz megkerülés szükséges, ez az opció letiltja ezt. -PS1 Games -PS1 Games display mode -POPSTARTER.ELF not found at '%s'! -VCD file '%s' not found! -An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +PS1 Játékok +PS1 Játékok megjelenítési módja +POPSTARTER.ELF nem található '%s'-nél! +VCD fájl '%s' nem található! +A fájl átnevezésénél hiba történt. +A fájl törlésénél hiba történt. \ No newline at end of file diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index c62f4f3be..02913d3f4 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,5 +1,5 @@ # Translation by lauchon22 -# Last update: 3/7/2018 +# Last update: 3/9/2018 # Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -248,9 +248,9 @@ Emulador multitap en el puerto Seleccione el puerto para la emulación multitap. Deshabilitar la solución provisional para DS3 falso Algunos DS3 falsos necesitan solución, esta opción lo deshabilitará. -PS1 Games -PS1 Games display mode -POPSTARTER.ELF not found at '%s'! -VCD file '%s' not found! -An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +Juegos de PS1 +Modo de visualización de juegos de PS1 +¡POPSTARTER.ELF no se encuentra en '%s'! +No se encuentra el archivo VCD '%s'! +Se produjo un error al cambiar el nombre del archivo. +Se produjo un error al eliminar el archivo. \ No newline at end of file From 2044ff3ac125aee26256687fba2655dbcf98fc41 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 12 Mar 2018 11:02:54 -0700 Subject: [PATCH 083/269] update changelog --- DETAILED_CHANGELOG | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index a83de73e4..69e4d8943 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,10 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1042 - Jay-Jay-OPL - Merge branch 'master' of https://github.com/Jay-Jay-OPL/OPL-Daily-Builds - Mon Mar 12 11:01:27 2018 -0700 +rev1041 - Jay-Jay-OPL - update lang files - Mon Mar 12 11:01:14 2018 -0700 +rev1040 - Daniel Sousa - Fix hdd duplicate games POPS (#8) - Mon Mar 12 10:58:26 2018 -0700 +rev1039 - Daniel Sousa - Fix pops prefix (#7) - Mon Mar 12 10:58:06 2018 -0700 rev1038 - Jay-Jay-OPL - update lang files - Fri Mar 9 15:36:00 2018 -0800 rev1037 - Jay-Jay-OPL - update lang files - Thu Mar 8 14:45:57 2018 -0800 rev1036 - Jay-Jay-OPL - add new default theme and splash to OPL - 10TH ANNIVERSARY EDITION - Wed Mar 7 08:24:16 2018 -0800 From f1d06928588b4866c93ef819acd68c0e10b70593 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 10 Apr 2018 02:38:46 -0700 Subject: [PATCH 084/269] update lang files and replaced a prototype fix with the finalized fix for GameStar adapters. --- DETAILED_CHANGELOG | 1 + lng/lang_Chinese_Simp.lng | 256 ++++++++++++++++++ ...ang_TChinese.lng => lang_Chinese_Trad.lng} | 98 +++---- modules/iopcore/cdvdman/atad.c | 8 +- 4 files changed, 311 insertions(+), 52 deletions(-) create mode 100644 lng/lang_Chinese_Simp.lng rename lng/{lang_TChinese.lng => lang_Chinese_Trad.lng} (70%) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 69e4d8943..b89b0aa72 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1043 - Jay-Jay-OPL - update changelog - Mon Mar 12 11:02:54 2018 -0700 rev1042 - Jay-Jay-OPL - Merge branch 'master' of https://github.com/Jay-Jay-OPL/OPL-Daily-Builds - Mon Mar 12 11:01:27 2018 -0700 rev1041 - Jay-Jay-OPL - update lang files - Mon Mar 12 11:01:14 2018 -0700 rev1040 - Daniel Sousa - Fix hdd duplicate games POPS (#8) - Mon Mar 12 10:58:26 2018 -0700 diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng new file mode 100644 index 000000000..d2d16b910 --- /dev/null +++ b/lng/lang_Chinese_Simp.lng @@ -0,0 +1,256 @@ +# Translated by kane159 and eyu2007 +# Last update: 3/22/2018 +# Updated for OPL_1036_DB-TA [926069d] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +Traditional Chinese +OPL %s +保存设置 +返回 +网络设置 +进阶设置 +<无数值> +设置已保存... +写入设置错误! +离开 +设置 +选单 +USB 游戏 +HDD 游戏 +ETH 游戏 +应用程序 +主题 +语言 +系统电源将会关闭. +退出到浏览界面/OSDSYS? +取消更新? +%d: 检测不到硬盘 +%d: 硬盘没有格式化 +%d: 启动网络错误 +%d: 检测不到网卡 +%d: 无法连接 SMB 服务器 +%d: 无法登入 SMB 服务器 +%d: 无法开启 SMB 共享 +%d: 无法罗列 SMB 共享清单 +%d: 无法列出游戏清单 +%d: DHCP 服务器不存在 +%d: 无网络连接 +开启 +关闭 +确定 +选择 +取消 +O +X +游戏列表 +游戏设置 +移除所有设置 +移除游戏所有的设置 +滚动 +较慢 +中等 +较快 +默认选单 +从光盘中读取 +请稍后 +读取 游戏 ID 时出错 +自动滚动 +读取语言文件时出错 +禁用调试跳色 +未检测到摇杆, 等待中... +显示游戏封面 +宽屏幕 +关机 +设置读取中 +设置储存中 +启动设备 +重新整理 +USB 设备启动模式 +HDD 设备启动模式 +ETH 设备启动模式 +应用程序启动模式 +自动 +手动 +启动 HDL 服务 +HDL 服务启动中... +HDL 服务正在运行... +启动 HDL 服务时出错. +HDL 服务未能读取... +IGR 位置 +背景颜色 +文字颜色 +- PS2 - +- SMB 服务器 - +IP 地址模式 +静态 +DHCP +IP 地址 +地址 +子网掩码 +网关 +DNS 服务器 +端口 +共享 +使用者 +密码 +<无设置> +地址格式 +IP +NetBIOS +允许 +项目将被永久删除, 继续吗? +重新命名 +删除 +运行 +显示设置 +启用删除与重新命名功能 +检查 USB 游戏碎片 +记住最后一个玩的游戏 +选定键 +错误, 游戏有碎片 +错误, 无法运行该项目 +测试 +GUEST验证留空. +精确读取 +同步模式 +脱开系统调用 +跳过 videos +模拟 DVD-DL +禁用 IGR +隐藏模式内存 +隐藏 DEV9 模式 +改变大小将会重新格式化 VMC +生成 +开始 +变更 +放弃 +重置 +使用通用 +设置 VMC +名称 +大小 +状态 +进度 +VMC 档案已存在 +无效的 VMC 档案, 大小有误 +需要建立VMC 档案 +VMC %s 出错, 继续使用物理记忆卡吗 (slot %d) ? +自动重新整理 +关于 +程序 +测试 +USB 前缀路径 +自定义IGR启动文件 +数值以分钟计,设为 0 禁用降速 +自动 HDD 降速 +影片模式 +对话框颜色 +被选定颜色 +显示讯息页面 +讯息 +自定义 ELF +颜色选项 +重新连接 +留空列出共享清单 +ETH 前缀路径 +退格 +空格 +回车 +模式 +VMC 插槽 1 +VMC 插槽 2 +游戏 ID +DMA 模式 +垂直同步 +模式 1 +模式 2 +模式 3 +模式 4 +模式 5 +模式 6 +模式 7 +模式 8 +配置 GSM +以太网链接模式 +100Mbit 全双工 +100Mbit 半双工 +10Mbit 全双工 +10Mbit 半双工 +GSM 设置 +启用 GSM +切换 GSM 开或关 +VMODE +强制自定义显示模式 +H-POS +水平调整 +V-POS +垂直调整 +过扫 +过扫调节 +跳过 FMV +跳过全动态视频 +金手指设置 +启用 PS2RD 金手指引擎 +允许 PS2RD 金手指引擎对你的游戏进行补丁 +PS2RD 金手指引擎模式 +自动或手动选择游戏金手指 +自动选择金手指 +手动选择金手指 +错误: 读取金手指文件出错 +未发现金手指文件 +下载默认值 +网络更新 +重新下载现有记录? +更新失败. +连结更新服务器失败. +更新已完成. +更新已取消. +从网络上下载设置? +自定义设置 +已下载默认值 +将自动于 %i 秒后启动... +自动启动 +以秒为单位,设为 0 来禁用自动启动 +PS2 Logo +只显示与控制台区域匹配的有效磁盘标识 +配置PADEMU +Pad模拟器设置 +开启Pad模拟器 +为选定的游戏开启/关闭pad模拟调节。 +Pad模拟器模式 +选择Pad模拟器模式。 +有线连接 +蓝牙连接 +设置端口: +选择Pad模拟器端口 +开启模拟 +打开/关闭选定端口的模拟器 +开启振动 +打开/关闭选定端口的振动。 +USB蓝牙适配器MAC地址: +D S 手 柄 MAC地址: +配对 +配对DS手柄 +蓝牙适配器和DS手柄进行MAC地址配对。 +没有连接 +蓝牙适配器信息 +显示更多的信息和支持的特性 +HCI版本: +LMP版本: +制造商ID: +支持的功能: +是 +否 +蓝牙适配器应该完全兼容DS3/DS4手柄 +蓝牙适配器可能无法与DS3/DS4手柄匹配 +开启多重模拟 +打开/关闭这个游戏的多重模拟. +多重模拟端口 +选择进行多重模拟的端口 +禁用仿冒DS3手柄 +这个选项将使一些仿冒的DS3手柄无法工作 +PS1游戏 +PS1游戏启动模式 +POPSTARTER.ELF在'%s'上找不到! +VCD文件'%s'没有找到! +重命名文件时发生错误. +删除文件时发生错误. \ No newline at end of file diff --git a/lng/lang_TChinese.lng b/lng/lang_Chinese_Trad.lng similarity index 70% rename from lng/lang_TChinese.lng rename to lng/lang_Chinese_Trad.lng index 5ba69fbc3..6bbac899f 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,5 +1,5 @@ -# Translated by kane159 -# Last update: 3/7/2018 +# Translated by kane159 and eyu2007 +# Last update: 3/22/2018 # Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese @@ -54,7 +54,7 @@ Exit to Browser/OSDSYS? 請稍後 讀取 Game ID 時出錯 自動滾動 -讀取語言文件時出錯 +讀取語言档案時出錯 禁用 Debug Colors 無偵測到搖桿, 等待中... 啟用圖示封面 @@ -195,8 +195,8 @@ PS2RD 金手指引擎模式 自動選擇或選擇遊戲金手指 自動選擇金手指 選擇遊戲金手指 -錯誤: 讀取金手指文件出錯 -無發現金手指文件 +錯誤: 讀取金手指档案出錯 +無發現金手指档案 下載預設值 網絡更新 重新下載現有記錄? @@ -210,47 +210,47 @@ PS2RD 金手指引擎模式 將自動於 %i 秒後啟動... 自動啟動 以秒為單位,設為 0 來禁用自動啟動 -PS2 Logo -Only displayed for a valid disc logo which matches the console's region -Configure PADEMU -Pad Emulator Settings -Enable PadEmulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode -Select Pad Emulator mode. -DualShock3/4 USB -DualShock3/4 BT -Settings for port: -Select Pad Emulator port for settings. -Enable emulation -Turns on/off Pad Emulator for selected port. -Enable vibration -Turns on/off vibration for Pad Emulator selected port. -USB Bluetooth adapter MAC address: -DS Controller paired to MAC address: -Pair -Pair DS controller -Pair DS controller with Bluetooth adapter MAC address. -Not connected -Bluetooth adapter information -Shows more information and supported features -HCI Version: -LMP Version: -Manufacturer ID: -Support features: -Yes -No -Bluetooth adapter should be fully compatible with DS3/DS4 controllers. -Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation -Turns on/off Multitap emulation for selected game. -Multitap emulator on port -Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -PS1 Games -PS1 Games display mode -POPSTARTER.ELF not found at '%s'! -VCD file '%s' not found! -An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +PS2Logo +僅顯示與控制臺區域疋配的有效磁盤標識 +配置PADEMU +Pad模擬器設置 +開啟Pad模擬器 +為選定的遊戲開啟/關閉pad模擬調節。 +Pad模擬器模式 +選擇Pad模擬器模式。 +有線連接 +藍牙連接 +設置端口: +選擇Pad模擬器端口 +開啟模擬 +打開/關閉選定端口的模擬器 +開啟振動 +打開/關閉選定端口的振動。 +USB藍牙適配器MAC地址: +DS控制器MAC地址: +配對 +配對DS控制器 +藍牙適配器和DS控制器進行MAC地址配對。 +沒有連接 +藍牙適配器資訊 +顯示更多的資訊和支持的特性 +HCI版本: +LMP版本: +制造商ID: +支持的功能: +是 +否 +藍牙適配器應該完全兼容DS3/DS4控制器 +藍牙適配器可能無法與DS3/DS4控制器疋配 +開啟多重模擬 +打開/關閉這個遊戲的多重模擬. +多重模擬端口 +選擇進行多重模擬的端口 +禁用仿冒DS3控制器 +這個選項將使一些仿冒的DS3控制器無法工作 +PS1遊戲 +PS1遊戲啟動模式 +POPSTARTER.ELF在'%s'上找不到! +VCD档案'%s'沒有找到! +重命名档案時發生錯誤 +刪除档案時發生錯誤 \ No newline at end of file diff --git a/modules/iopcore/cdvdman/atad.c b/modules/iopcore/cdvdman/atad.c index 9fcad998a..d42471955 100644 --- a/modules/iopcore/cdvdman/atad.c +++ b/modules/iopcore/cdvdman/atad.c @@ -152,9 +152,11 @@ int atad_start(void) } #endif - /* A GameStar masquerades as a SCPH-10281, but malfunctions if transfers are not done according to the old ps2atad design. - All official adaptors appear to have different values for these two registers, but not the GameStar. */ - ata_gamestar_workaround = (SPD_REG16(SPD_R_REV) == SPD_REG16(SPD_R_REV_3)); + /* Some compatible adaptors may malfunction if transfers are not done according to the old ps2atad design. + Official adaptors appear to have a 0x0001 set for this register, but not compatibles. + While official I/O to this register are 8-bit, some compatibles have a 0x01 for the lower 8-bits, + but the upper 8-bits contain some random value. Hence perform a 16-bit read instead. */ + ata_gamestar_workaround = (SPD_REG16(0x20) != 1); event.attr = 0; event.bits = 0; From c5e10c1ddf44f6fe5b311ce73fe8101d35db1b11 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 6 May 2018 19:41:12 -0700 Subject: [PATCH 085/269] SP193 made following changes: Merge pull request #91 from sp193/lwip_core_locking - Backported various performance-related options to SMSTCPIP and other fixes. Merge pull request #90 from sp193/usbextreme-fix - Fixed computation of offslsn, which was not correctly updated when reading across 2 parts. --- DETAILED_CHANGELOG | 1 + modules/iopcore/cdvdman/atad.c | 10 ---- modules/iopcore/cdvdman/device-smb.c | 1 + modules/iopcore/cdvdman/device-usb.c | 1 + modules/network/SMSTCPIP/icmp.c | 2 + modules/network/SMSTCPIP/include/lwip/opt.h | 57 +++++++++++++++++++ modules/network/SMSTCPIP/include/lwip/tcpip.h | 16 ++++++ modules/network/SMSTCPIP/include/lwipopts.h | 56 +++++++++++++++++- modules/network/SMSTCPIP/ip.c | 3 + modules/network/SMSTCPIP/ps2ip.c | 26 ++++++--- modules/network/SMSTCPIP/tcp_in.c | 3 +- modules/network/SMSTCPIP/tcpip.c | 33 ++++++++++- modules/network/SMSTCPIP/udp.c | 2 + 13 files changed, 187 insertions(+), 24 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index b89b0aa72..62a0aad08 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1044 - Jay-Jay-OPL - update lang files and replaced a prototype fix with the finalized fix for GameStar adapters. - Tue Apr 10 02:38:46 2018 -0700 rev1043 - Jay-Jay-OPL - update changelog - Mon Mar 12 11:02:54 2018 -0700 rev1042 - Jay-Jay-OPL - Merge branch 'master' of https://github.com/Jay-Jay-OPL/OPL-Daily-Builds - Mon Mar 12 11:01:27 2018 -0700 rev1041 - Jay-Jay-OPL - update lang files - Mon Mar 12 11:01:14 2018 -0700 diff --git a/modules/iopcore/cdvdman/atad.c b/modules/iopcore/cdvdman/atad.c index d42471955..0521f28ae 100644 --- a/modules/iopcore/cdvdman/atad.c +++ b/modules/iopcore/cdvdman/atad.c @@ -125,7 +125,6 @@ static void ata_post_dma_cb(int bcr, int dir) SPD_REG16(SPD_R_XFR_CTRL) &= ~0x80; } -#ifdef DEV9_DEBUG static int ata_create_event_flag(void) { iop_event_t event; @@ -135,12 +134,10 @@ static int ata_create_event_flag(void) event.bits = 0; return CreateEventFlag(&event); } -#endif int atad_start(void) { USE_SPD_REGS; - iop_event_t event; int res = 1; M_PRINTF(BANNER, VERSION); @@ -158,16 +155,11 @@ int atad_start(void) but the upper 8-bits contain some random value. Hence perform a 16-bit read instead. */ ata_gamestar_workaround = (SPD_REG16(0x20) != 1); - event.attr = 0; - event.bits = 0; - ata_evflg = CreateEventFlag(&event); -#ifdef DEV9_DEBUG if ((ata_evflg = ata_create_event_flag()) < 0) { M_PRINTF("Couldn't create event flag, exiting.\n"); res = 1; goto out; } -#endif /* In v1.04, PIO mode 0 was set here. In late versions, it is set in ata_init_devices(). */ dev9RegisterIntrCb(1, &ata_intr_cb); @@ -188,9 +180,7 @@ int atad_start(void) res = 0; M_PRINTF("Driver loaded.\n"); -#ifdef DEV9_DEBUG out: -#endif return res; } diff --git a/modules/iopcore/cdvdman/device-smb.c b/modules/iopcore/cdvdman/device-smb.c index b33916bbb..e4f387541 100644 --- a/modules/iopcore/cdvdman/device-smb.c +++ b/modules/iopcore/cdvdman/device-smb.c @@ -143,6 +143,7 @@ int DeviceReadSectors(u32 lsn, void *buffer, unsigned int sectors) smb_ReadCD(offslsn, sectors_to_read, &p[r], i); r += sectors_to_read << 11; + offslsn += sectors_to_read; sectors_to_read = sectors; lsn = nlsn; } diff --git a/modules/iopcore/cdvdman/device-usb.c b/modules/iopcore/cdvdman/device-usb.c index 604c83a39..ea0345451 100644 --- a/modules/iopcore/cdvdman/device-usb.c +++ b/modules/iopcore/cdvdman/device-usb.c @@ -114,6 +114,7 @@ int DeviceReadSectors(u32 lsn, void *buffer, unsigned int sectors) mass_stor_ReadCD(offslsn, sectors_to_read, &p[r], i); r += sectors_to_read << 11; + offslsn += sectors_to_read; sectors_to_read = sectors; lsn = nlsn; } diff --git a/modules/network/SMSTCPIP/icmp.c b/modules/network/SMSTCPIP/icmp.c index 87f048c7c..fd87e4c18 100644 --- a/modules/network/SMSTCPIP/icmp.c +++ b/modules/network/SMSTCPIP/icmp.c @@ -92,6 +92,7 @@ void icmp_input(struct pbuf *p, struct netif *inp) return; } iecho = p->payload; +#if CHECKSUM_CHECK_ICMP if (inet_chksum_pbuf(p) != 0) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n")); pbuf_free(p); @@ -99,6 +100,7 @@ void icmp_input(struct pbuf *p, struct netif *inp) snmp_inc_icmpinerrors(); return; } +#endif tmpaddr.addr = iphdr->src.addr; iphdr->src.addr = iphdr->dest.addr; iphdr->dest.addr = tmpaddr.addr; diff --git a/modules/network/SMSTCPIP/include/lwip/opt.h b/modules/network/SMSTCPIP/include/lwip/opt.h index 6f2d2efc2..283360991 100644 --- a/modules/network/SMSTCPIP/include/lwip/opt.h +++ b/modules/network/SMSTCPIP/include/lwip/opt.h @@ -52,6 +52,30 @@ #ifndef NO_SYS #define NO_SYS 0 #endif +/* ---------- Core locking ---------- */ +/** + * LWIP_TCPIP_CORE_LOCKING + * Creates a global mutex that is held during TCPIP thread operations. + * Can be locked by client code to perform lwIP operations without changing + * into TCPIP thread using callbacks. See LOCK_TCPIP_CORE() and + * UNLOCK_TCPIP_CORE(). + * Your system should provide mutexes supporting priority inversion to use this. + */ +#if !defined LWIP_TCPIP_CORE_LOCKING || defined __DOXYGEN__ +#define LWIP_TCPIP_CORE_LOCKING 1 +#endif + +/** + * LWIP_TCPIP_CORE_LOCKING_INPUT: when LWIP_TCPIP_CORE_LOCKING is enabled, + * this lets tcpip_input() grab the mutex for input packets as well, + * instead of allocating a message and passing it to tcpip_thread. + * + * ATTENTION: this does not work when tcpip_input() is called from + * interrupt context! + */ +#if !defined LWIP_TCPIP_CORE_LOCKING_INPUT || defined __DOXYGEN__ +#define LWIP_TCPIP_CORE_LOCKING_INPUT 0 +#endif /* ---------- Memory options ---------- */ /** * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library @@ -632,4 +656,37 @@ a lot of data that needs to be copied, this should be set high. */ #define DBG_MIN_LEVEL DBG_LEVEL_OFF #endif +/* + -------------------------------------- + ---------- Checksum options ---------- + -------------------------------------- +*/ +/** + * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. + */ +#if !defined CHECKSUM_CHECK_IP +#define CHECKSUM_CHECK_IP 1 +#endif + +/** + * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. + */ +#if !defined CHECKSUM_CHECK_UDP +#define CHECKSUM_CHECK_UDP 1 +#endif + +/** + * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. + */ +#if !defined CHECKSUM_CHECK_TCP +#define CHECKSUM_CHECK_TCP 1 +#endif + +/** + * CHECKSUM_CHECK_ICMP==1: Check checksums in software for incoming ICMP packets. + */ +#if !defined CHECKSUM_CHECK_ICMP +#define CHECKSUM_CHECK_ICMP 1 +#endif + #endif /* __LWIP_OPT_H__ */ diff --git a/modules/network/SMSTCPIP/include/lwip/tcpip.h b/modules/network/SMSTCPIP/include/lwip/tcpip.h index d4250993c..805244d71 100644 --- a/modules/network/SMSTCPIP/include/lwip/tcpip.h +++ b/modules/network/SMSTCPIP/include/lwip/tcpip.h @@ -35,6 +35,18 @@ #include "lwip/api_msg.h" #include "lwip/pbuf.h" +#if LWIP_TCPIP_CORE_LOCKING +/** The global semaphore to lock the stack. */ +extern sys_sem_t lock_tcpip_core; +/** Lock lwIP core mutex (needs @ref LWIP_TCPIP_CORE_LOCKING 1) */ +#define LOCK_TCPIP_CORE() sys_sem_wait(lock_tcpip_core) +/** Unlock lwIP core mutex (needs @ref LWIP_TCPIP_CORE_LOCKING 1) */ +#define UNLOCK_TCPIP_CORE() sys_sem_signal(lock_tcpip_core) +#else /* LWIP_TCPIP_CORE_LOCKING */ +#define LOCK_TCPIP_CORE() +#define UNLOCK_TCPIP_CORE() +#endif /* LWIP_TCPIP_CORE_LOCKING */ + void tcpip_init(void (*tcpip_init_done)(void *), void *arg); void tcpip_apimsg(struct api_msg *apimsg); err_t tcpip_input(struct pbuf *p, struct netif *inp); @@ -43,8 +55,12 @@ err_t tcpip_callback(void (*f)(void)); void tcpip_tcp_timer_needed(void); enum tcpip_msg_type { +#if !LWIP_TCPIP_CORE_LOCKING TCPIP_MSG_API, +#endif +#if !LWIP_TCPIP_CORE_LOCKING_INPUT TCPIP_MSG_INPUT, +#endif TCPIP_MSG_CALLBACK }; diff --git a/modules/network/SMSTCPIP/include/lwipopts.h b/modules/network/SMSTCPIP/include/lwipopts.h index d7304115e..fc2862532 100644 --- a/modules/network/SMSTCPIP/include/lwipopts.h +++ b/modules/network/SMSTCPIP/include/lwipopts.h @@ -2,6 +2,18 @@ #define __LWIPOPTS_H__ #define LWIP_CALLBACK_API 1 + +/* ---------- Core locking ---------- */ +/** + * LWIP_TCPIP_CORE_LOCKING_INPUT: when LWIP_TCPIP_CORE_LOCKING is enabled, + * this lets tcpip_input() grab the mutex for input packets as well, + * instead of allocating a message and passing it to tcpip_thread. + * + * ATTENTION: this does not work when tcpip_input() is called from + * interrupt context! + */ +//#define LWIP_TCPIP_CORE_LOCKING_INPUT 1 //Not supported because of the in-game SMAP driver's design (will deadlock). + /* ---------- Memory options ---------- */ /** * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library @@ -205,9 +217,10 @@ a lot of data that needs to be copied, this should be set high. */ #define LWIP_DHCP 1 -/* 1 if you want to do an ARP check on the offered address - (recommended). */ -#define DHCP_DOES_ARP_CHECK 1 +/** + * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. + */ +#define DHCP_DOES_ARP_CHECK 0 //Don't do the ARP check because an IP address would be first required. #else @@ -294,4 +307,41 @@ a lot of data that needs to be copied, this should be set high. */ // One should check performance penalty or improvement by activating any combination // of these three options. The only one which is standard is TCP_NODELAY. // By default, everything is not active. + +/* + -------------------------------------- + ---------- Checksum options ---------- + -------------------------------------- +*/ +#ifdef INGAME_DRIVER +//Disable all higher-level checksum verification mechanisms for performance, relying on the MAC-level checksum. +/** + * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. + */ +#if !defined CHECKSUM_CHECK_IP +#define CHECKSUM_CHECK_IP 0 +#endif + +/** + * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. + */ +#if !defined CHECKSUM_CHECK_UDP +#define CHECKSUM_CHECK_UDP 0 +#endif + +/** + * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. + */ +#if !defined CHECKSUM_CHECK_TCP +#define CHECKSUM_CHECK_TCP 0 +#endif + +/** + * CHECKSUM_CHECK_ICMP==1: Check checksums in software for incoming ICMP packets. + */ +#if !defined CHECKSUM_CHECK_ICMP +#define CHECKSUM_CHECK_ICMP 0 +#endif +#endif + #endif /* __LWIPOPTS_H__ */ diff --git a/modules/network/SMSTCPIP/ip.c b/modules/network/SMSTCPIP/ip.c index 69a0e510e..fba232612 100644 --- a/modules/network/SMSTCPIP/ip.c +++ b/modules/network/SMSTCPIP/ip.c @@ -230,10 +230,13 @@ err_t ip_input(struct pbuf *p, struct netif *inp) return ERR_OK; } /* end if */ + /* verify checksum */ +#if CHECKSUM_CHECK_IP if (inet_chksum(iphdr, iphdrlen)) { pbuf_free(p); return ERR_OK; } /* end if */ +#endif pbuf_realloc(p, ntohs(IPH_LEN(iphdr))); diff --git a/modules/network/SMSTCPIP/ps2ip.c b/modules/network/SMSTCPIP/ps2ip.c index 804641b90..0b645014e 100644 --- a/modules/network/SMSTCPIP/ps2ip.c +++ b/modules/network/SMSTCPIP/ps2ip.c @@ -58,7 +58,7 @@ struct sys_mbox typedef struct ip_addr IPAddr; #define MODNAME "TCP/IP Stack" -IRX_ID(MODNAME, 1, 3); +IRX_ID(MODNAME, 1, 4); extern struct irx_export_table _exp_ps2ip; @@ -415,8 +415,11 @@ sys_mbox_t sys_mbox_new(void) { sys_mbox_t pMBox; + int OldState; - pMBox = (sys_mbox_t)AllocSysMemory(0, sizeof(struct sys_mbox), 0); + CpuSuspendIntr(&OldState); + pMBox = (sys_mbox_t)AllocSysMemory(ALLOC_FIRST, sizeof(struct sys_mbox), NULL); + CpuResumeIntr(OldState); if (!pMBox) return NULL; @@ -449,6 +452,7 @@ void sys_mbox_post(sys_mbox_t pMBox, void *pvMSG) { sys_prot_t Flags; + sys_sem_t sem; if (!pMBox) return; @@ -470,17 +474,20 @@ void sys_mbox_post(sys_mbox_t pMBox, void *pvMSG) pMBox->apvMSG[pMBox->u16Last] = pvMSG; pMBox->u16Last = GenNextMBoxIndex(pMBox->u16Last); - if (pMBox->iWaitFetch > 0) - SignalSema(pMBox->Mail); + sem = (pMBox->iWaitFetch > 0) ? pMBox->Mail : SYS_SEM_NULL; CpuResumeIntr(Flags); + if (sem != SYS_SEM_NULL) + SignalSema(sem); + } /* end sys_mbox_post */ u32_t sys_arch_mbox_fetch(sys_mbox_t pMBox, void **ppvMSG, u32_t u32Timeout) { sys_prot_t Flags; + sys_sem_t sem = SYS_SEM_NULL; u32_t u32Time = 0; CpuSuspendIntr(&Flags); @@ -507,14 +514,17 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t pMBox, void **ppvMSG, u32_t u32Timeout) } /* end while */ - *ppvMSG = pMBox->apvMSG[pMBox->u16First]; + if (ppvMSG != NULL) //This pointer may be NULL. + *ppvMSG = pMBox->apvMSG[pMBox->u16First]; pMBox->u16First = GenNextMBoxIndex(pMBox->u16First); - if (pMBox->iWaitPost > 0) - SignalSema(pMBox->Mail); + sem = (pMBox->iWaitPost > 0) ? pMBox->Mail : SYS_SEM_NULL; end: CpuResumeIntr(Flags); + if (sem != SYS_SEM_NULL) + SignalSema(sem); + return u32Time; } /* end sys_arch_mbox_fetch */ @@ -522,7 +532,7 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t pMBox, void **ppvMSG, u32_t u32Timeout) sys_sem_t sys_sem_new(u8_t aCount) { - iop_sema_t lSema = {1, 1, aCount, 1}; + iop_sema_t lSema = {SA_THPRI, 1, aCount, 1}; int retVal; retVal = CreateSema(&lSema); diff --git a/modules/network/SMSTCPIP/tcp_in.c b/modules/network/SMSTCPIP/tcp_in.c index 31720b1a4..af1e542a0 100644 --- a/modules/network/SMSTCPIP/tcp_in.c +++ b/modules/network/SMSTCPIP/tcp_in.c @@ -133,6 +133,7 @@ void tcp_input(struct pbuf *p, struct netif *inp) return; } +#if CHECKSUM_CHECK_TCP /* Verify TCP checksum. */ if (inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src), (struct ip_addr *)&(iphdr->dest), @@ -149,7 +150,7 @@ void tcp_input(struct pbuf *p, struct netif *inp) pbuf_free(p); return; } - +#endif /* CHECKSUM_CHECK_TCP */ /* Move the payload pointer in the pbuf so that it points to the TCP data instead of the TCP header. */ diff --git a/modules/network/SMSTCPIP/tcpip.c b/modules/network/SMSTCPIP/tcpip.c index 56e18f8af..38f5a5ce4 100644 --- a/modules/network/SMSTCPIP/tcpip.c +++ b/modules/network/SMSTCPIP/tcpip.c @@ -43,10 +43,17 @@ #include "lwip/tcpip.h" +#include + static void (*tcpip_init_done)(void *arg) = NULL; static void *tcpip_init_done_arg; sys_mbox_t g_TCPIPMBox; +#if LWIP_TCPIP_CORE_LOCKING +/** The global semaphore to lock the stack. */ +sys_sem_t lock_tcpip_core; +#endif /* LWIP_TCPIP_CORE_LOCKING */ + static void tcpip_thread(void *arg) { @@ -61,19 +68,24 @@ static void tcpip_thread(void *arg) #endif /* LWIP_TCP */ tcpip_init_done(tcpip_init_done_arg); + LOCK_TCPIP_CORE(); while (1) { - + UNLOCK_TCPIP_CORE(); sys_mbox_fetch(g_TCPIPMBox, (void *)&msg); + LOCK_TCPIP_CORE(); switch (msg->type) { - +#if !LWIP_TCPIP_CORE_LOCKING case TCPIP_MSG_API: api_msg_input(msg->msg.apimsg); break; +#endif /* !LWIP_TCPIP_CORE_LOCKING */ +#if !LWIP_TCPIP_CORE_LOCKING_INPUT case TCPIP_MSG_INPUT: ip_input(msg->msg.inp.p, msg->msg.inp.netif); break; +#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */ case TCPIP_MSG_CALLBACK: msg->msg.cb.f(msg->msg.cb.ctx); @@ -90,6 +102,13 @@ static void tcpip_thread(void *arg) err_t tcpip_input(struct pbuf *p, struct netif *inp) { +#if LWIP_TCPIP_CORE_LOCKING_INPUT + err_t ret; + LOCK_TCPIP_CORE(); + ret = ip_input(p, inp); + UNLOCK_TCPIP_CORE(); + return ret; +#else /* LWIP_TCPIP_CORE_LOCKING_INPUT */ struct tcpip_msg *msg = memp_malloc(MEMP_TCPIP_MSG); if (msg) { @@ -107,12 +126,18 @@ err_t tcpip_input(struct pbuf *p, struct netif *inp) return ERR_MEM; } /* end else */ +#endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */ } /* end tcpip_input */ void tcpip_apimsg(struct api_msg *apimsg) { +#if LWIP_TCPIP_CORE_LOCKING + LOCK_TCPIP_CORE(); + api_msg_input(apimsg); + UNLOCK_TCPIP_CORE(); +#else /* LWIP_TCPIP_CORE_LOCKING */ struct tcpip_msg *msg = memp_malloc(MEMP_TCPIP_MSG); if (msg) { @@ -123,6 +148,7 @@ void tcpip_apimsg(struct api_msg *apimsg) } else memp_free(MEMP_API_MSG, apimsg); +#endif /* LWIP_TCPIP_CORE_LOCKING */ } /* end tcpip_apimsg */ @@ -133,6 +159,9 @@ void tcpip_init(void (*initfunc)(void *), void *arg) tcpip_init_done_arg = arg; g_TCPIPMBox = sys_mbox_new(); +#if LWIP_TCPIP_CORE_LOCKING + lock_tcpip_core = sys_sem_new(1); +#endif /* LWIP_TCPIP_CORE_LOCKING */ sys_thread_new(tcpip_thread, NULL, TCPIP_THREAD_PRIO); diff --git a/modules/network/SMSTCPIP/udp.c b/modules/network/SMSTCPIP/udp.c index 7cf4ea58f..a64c5608a 100644 --- a/modules/network/SMSTCPIP/udp.c +++ b/modules/network/SMSTCPIP/udp.c @@ -303,6 +303,7 @@ void udp_input(struct pbuf *p, struct netif *inp) if (pcb != NULL || ip_addr_cmp(&inp->ip_addr, &iphdr->dest)) { LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE, ("udp_input: calculating checksum\n")); pbuf_header(p, UDP_HLEN); +#if CHECKSUM_CHECK_UDP #ifdef IPv6 if (iphdr->nexthdr == IP_PROTO_UDPLITE) { #else @@ -334,6 +335,7 @@ void udp_input(struct pbuf *p, struct netif *inp) } } } +#endif /* CHECKSUM_CHECK_UDP */ pbuf_header(p, -UDP_HLEN); if (pcb != NULL) { snmp_inc_udpindatagrams(); From 243213fac3df0140f6b9e1a9f4d24c3a587aa99b Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Thu, 10 May 2018 09:47:19 +0100 Subject: [PATCH 086/269] Fix hdd size calculation (#9) * Fix HDD size calculation --- src/hdd.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/hdd.c b/src/hdd.c index 87a9d4f5c..b3893bfe2 100644 --- a/src/hdd.c +++ b/src/hdd.c @@ -157,7 +157,9 @@ static int hddGetHDLGameInfo(struct GameDataEntry *game, hdl_game_info_t *ginfo) ginfo->layer_break = hdl_header->layer1_start; ginfo->disctype = hdl_header->discType; ginfo->start_sector = game->lba; - ginfo->total_size_in_kb = game->size / 2; //size * 2048 / 1024 = 0.5x + //START of OPL_DB tweaks + ginfo->total_size_in_kb = game->size; + //END of OPL_DB tweaks } else ret = -1; @@ -215,8 +217,9 @@ int hddGetHDLGamelist(hdl_games_list_t *game_list) // Note: The APA specification states that there is a 4KB area used for storing the partition's information, before the extended attribute area. pGameEntry->lba = dirent.stat.private_5 + (HDL_GAME_DATA_OFFSET + 4096) / 512; } - - pGameEntry->size += (dirent.stat.size / 4); //size in sectors * (512 / 2048) + //START of OPL_DB tweaks + pGameEntry->size += (dirent.stat.size / 2); //size in sectors * (512 / 1024) = KB + //END of OPL_DB tweaks } } From 8c29d1f011bc982e04140304bf61eba7080cd0ad Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 10 May 2018 13:11:51 -0700 Subject: [PATCH 087/269] Update Changelog --- DETAILED_CHANGELOG | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 62a0aad08..696e3913e 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,8 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1046 - Daniel Sousa - Fix hdd size calculation (#9) - Thu May 10 09:47:19 2018 +0100 +rev1045 - Jay-Jay-OPL - SP193 made following changes: Merge pull request #91 from sp193/lwip_core_locking - Backported various performance-related options to SMSTCPIP and other fixes. Merge pull request #90 from sp193/usbextreme-fix - Fixed computation of offslsn, which was not correctly updated when reading across 2 parts. - Sun May 6 19:41:12 2018 -0700 rev1044 - Jay-Jay-OPL - update lang files and replaced a prototype fix with the finalized fix for GameStar adapters. - Tue Apr 10 02:38:46 2018 -0700 rev1043 - Jay-Jay-OPL - update changelog - Mon Mar 12 11:02:54 2018 -0700 rev1042 - Jay-Jay-OPL - Merge branch 'master' of https://github.com/Jay-Jay-OPL/OPL-Daily-Builds - Mon Mar 12 11:01:27 2018 -0700 From 319c545dbf5e1f6a0aaae3471b8deb0932680a82 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 21 May 2018 14:28:38 -0700 Subject: [PATCH 088/269] SP193: Fixed game size computation for HDLoader-format games. --- DETAILED_CHANGELOG | 1 + src/hdd.c | 9 +++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG index 696e3913e..e7f94ca8b 100644 --- a/DETAILED_CHANGELOG +++ b/DETAILED_CHANGELOG @@ -10,6 +10,7 @@ Automatically Generated by make_changelog.sh. DO NOT EDIT Open PS2 Loader Detailed ChangeLog: +rev1047 - Jay-Jay-OPL - Update Changelog - Thu May 10 13:11:51 2018 -0700 rev1046 - Daniel Sousa - Fix hdd size calculation (#9) - Thu May 10 09:47:19 2018 +0100 rev1045 - Jay-Jay-OPL - SP193 made following changes: Merge pull request #91 from sp193/lwip_core_locking - Backported various performance-related options to SMSTCPIP and other fixes. Merge pull request #90 from sp193/usbextreme-fix - Fixed computation of offslsn, which was not correctly updated when reading across 2 parts. - Sun May 6 19:41:12 2018 -0700 rev1044 - Jay-Jay-OPL - update lang files and replaced a prototype fix with the finalized fix for GameStar adapters. - Tue Apr 10 02:38:46 2018 -0700 diff --git a/src/hdd.c b/src/hdd.c index b3893bfe2..9e1baa9f4 100644 --- a/src/hdd.c +++ b/src/hdd.c @@ -157,9 +157,7 @@ static int hddGetHDLGameInfo(struct GameDataEntry *game, hdl_game_info_t *ginfo) ginfo->layer_break = hdl_header->layer1_start; ginfo->disctype = hdl_header->discType; ginfo->start_sector = game->lba; - //START of OPL_DB tweaks - ginfo->total_size_in_kb = game->size; - //END of OPL_DB tweaks + ginfo->total_size_in_kb = game->size * 2; //size * 2048 / 1024 = 2x } else ret = -1; @@ -217,9 +215,8 @@ int hddGetHDLGamelist(hdl_games_list_t *game_list) // Note: The APA specification states that there is a 4KB area used for storing the partition's information, before the extended attribute area. pGameEntry->lba = dirent.stat.private_5 + (HDL_GAME_DATA_OFFSET + 4096) / 512; } - //START of OPL_DB tweaks - pGameEntry->size += (dirent.stat.size / 2); //size in sectors * (512 / 1024) = KB - //END of OPL_DB tweaks + + pGameEntry->size += (dirent.stat.size / 4); //size in HDD sectors * (512 / 2048) = 0.25x } } From dfe6fe512a981cafd467c89ca912ce31abe50726 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 21 May 2018 15:06:17 -0700 Subject: [PATCH 089/269] RickGaiser: Graphics improvements and code cleanups #94. --- .gitignore | 1 + DETAILED_CHANGELOG | 119 ------------------------------ Makefile | 14 +++- ee_core/linkfile | 34 +++++---- ee_core/linkfile.igs | 39 +++++----- include/renderman.h | 3 + modules/iopcore/cdvdman/cdvdman.c | 8 +- src/dia.c | 7 +- src/fntsys.c | 26 +++++-- src/gui.c | 19 ++++- src/renderman.c | 103 ++++++++++++++++++++++---- 11 files changed, 189 insertions(+), 184 deletions(-) delete mode 100644 DETAILED_CHANGELOG diff --git a/.gitignore b/.gitignore index 10a9060c2..0907f7349 100755 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ *.patch *.rej *.zip +DETAILED_CHANGELOG # # git files that we don't want to ignore even it they are dot-files diff --git a/DETAILED_CHANGELOG b/DETAILED_CHANGELOG deleted file mode 100644 index e7f94ca8b..000000000 --- a/DETAILED_CHANGELOG +++ /dev/null @@ -1,119 +0,0 @@ -Automatically Generated by make_changelog.sh. DO NOT EDIT - ------------------------------------------------------------------------------ - - Copyright 2009-2010, Ifcaro & jimmikaelkael - Licenced under Academic Free License version 3.0 - Review Open PS2 Loader README & LICENSE files for further details. - ------------------------------------------------------------------------------ - -Open PS2 Loader Detailed ChangeLog: - -rev1047 - Jay-Jay-OPL - Update Changelog - Thu May 10 13:11:51 2018 -0700 -rev1046 - Daniel Sousa - Fix hdd size calculation (#9) - Thu May 10 09:47:19 2018 +0100 -rev1045 - Jay-Jay-OPL - SP193 made following changes: Merge pull request #91 from sp193/lwip_core_locking - Backported various performance-related options to SMSTCPIP and other fixes. Merge pull request #90 from sp193/usbextreme-fix - Fixed computation of offslsn, which was not correctly updated when reading across 2 parts. - Sun May 6 19:41:12 2018 -0700 -rev1044 - Jay-Jay-OPL - update lang files and replaced a prototype fix with the finalized fix for GameStar adapters. - Tue Apr 10 02:38:46 2018 -0700 -rev1043 - Jay-Jay-OPL - update changelog - Mon Mar 12 11:02:54 2018 -0700 -rev1042 - Jay-Jay-OPL - Merge branch 'master' of https://github.com/Jay-Jay-OPL/OPL-Daily-Builds - Mon Mar 12 11:01:27 2018 -0700 -rev1041 - Jay-Jay-OPL - update lang files - Mon Mar 12 11:01:14 2018 -0700 -rev1040 - Daniel Sousa - Fix hdd duplicate games POPS (#8) - Mon Mar 12 10:58:26 2018 -0700 -rev1039 - Daniel Sousa - Fix pops prefix (#7) - Mon Mar 12 10:58:06 2018 -0700 -rev1038 - Jay-Jay-OPL - update lang files - Fri Mar 9 15:36:00 2018 -0800 -rev1037 - Jay-Jay-OPL - update lang files - Thu Mar 8 14:45:57 2018 -0800 -rev1036 - Jay-Jay-OPL - add new default theme and splash to OPL - 10TH ANNIVERSARY EDITION - Wed Mar 7 08:24:16 2018 -0800 -rev1035 - Daniel Sousa - Pops ready (#6) - Wed Mar 7 08:00:17 2018 -0800 -rev1034 - Jay-Jay-OPL - SP193 - Added workaround for bad GameStar adaptor to in-game ATAD code. - Wed Jan 31 17:07:11 2018 -0800 -rev1033 - Jay-Jay-OPL - revert changes from: sp193 Added workaround for bad GameStar adaptor to in-game ATAD code. - Sat Jan 13 15:09:55 2018 -0800 -rev1032 - Jay-Jay-OPL - sp193 Added workaround for bad GameStar adaptor to in-game ATAD code. - Thu Jan 11 18:57:10 2018 -0800 -rev1031 - Jay-Jay-OPL - AKuHAK/new_sync / Lang Updates - Thu Jan 11 18:28:27 2018 -0800 -rev1030 - Jay-Jay-OPL - belek666 added the following pademu changes: - add ds4 support to ds3 modules - new design for bt modules - multitap emulation - Tue Oct 17 14:27:21 2017 -0700 -rev1029 - Jay-Jay-OPL - update changelog in order to git a new OPL revision during compile - Sat Oct 7 15:36:10 2017 -0700 -rev1028 - danielb7390 - Add the functionality to have different main/info page on ELM page. (#4) - Sat Oct 7 15:30:57 2017 -0700 -rev1027 - Jay-Jay-OPL - revert changes to elfldr.c to fix an issue with loading APPS from Internal HDDs - Wed Sep 27 21:04:02 2017 -0700 -rev1026 - Jay-Jay-OPL - rickgaiser did the following changes: - Fix loading PNG files with palette. - Thu Sep 7 14:50:41 2017 -0700 -rev1025 - Jay-Jay-OPL - SP193 did the following changes: - Partial roll back & rework of c1470b2 for maintainability: removed old hack for preventing the thread patch from being included, in favour of the new libkernel-nopatch library. - Fixed partition creation of +OPL: added PFS filesystem setting, changed open flags to WRONLY and removed unused mode parameter. - Sun Sep 3 18:26:56 2017 -0700 -rev1024 - Jay-Jay-OPL - Developer rickgaiser had done the following changes: theme: use real theme file for builtin theme - Thu Aug 31 14:31:27 2017 -0700 -rev1023 - Jay-Jay-OPL - update lang files - Thu Aug 24 17:30:59 2017 -0700 -rev1022 - Jay-Jay-OPL - BMP support and bugfixes #64 by rickgaiser (Maximus32) (1) Apply settings also when video mode does not change When video mode was set to auto, some settings did not apply: - font not visible - x/y scaling - overscan - widescreen - Fri Aug 11 23:59:54 2017 -0700 -rev1021 - Jay-Jay-OPL - remove: Add initial mode - experimental code - Wed Aug 9 22:17:55 2017 -0700 -rev1020 - Jay-Jay-OPL - changes by rickgaiser (aka Maximus32) Fix font not visible when video mode set to auto Add initial hires mode - Wed Aug 9 20:39:02 2017 -0700 -rev1019 - Jay-Jay-OPL - Restore original: Fix bug in ELM support by rickgaiser (aka Maximus32): - Wed Aug 9 12:01:13 2017 -0700 -rev1018 - Jay-Jay-OPL - Scaling, overscan and lots of small things (#59) by rickgaiser - Wed Aug 9 10:57:50 2017 -0700 -rev1017 - Jay-Jay-OPL - Make OPL compilable with latest PS2SDK (#63) by uyjulian - Wed Aug 9 09:36:13 2017 -0700 -rev1016 - Jay-Jay-OPL - Fix bug in ELM support by rickgaiser (aka Maximus32): Without ELM support there are 4 io modules, with ELM support there are 5 io modules, causing unexpected crashes. - Tue Aug 8 22:03:23 2017 -0700 -rev1015 - Jay-Jay-OPL - belek666 made the following changes: ds3bt updates (#62) - more accurate reading, fix data request, add waiting for cmd report - Mon Jul 31 14:59:00 2017 -0700 -rev1014 - Jay-Jay-OPL - SP193 did the following changes: - (HDPro) fixed HDPro being unable to communicate with the HDPro device: fixed DEV9 not being loaded when HDPro is used (HDD.IRX depends on it), fixed errors in command types for command matrix, removed extra writes in the EE HDPro probe function, replaced WaitEventFlag with PollEventFlag (as per the original) and added a check around PollEventFlag's return value. - Sat Jul 29 02:54:58 2017 -0700 -rev1013 - Jay-Jay-OPL - SP193 did the following changes: - Revert (In-game ATAD) re-added workaround for some clone adaptors. (#58) - Sat Jul 29 02:33:50 2017 -0700 -rev1012 - Jay-Jay-OPL - removed the *.irx and the duplicated *.a lines in the .gitignore file so it stops ignoring any file with the .irx extension in the repo, plus *.a was already on the list. - Fri Jul 28 15:52:54 2017 -0700 -rev1011 - Jay-Jay-OPL - removed the *.s line in the .gitignore file so it stops ignoring any file with the .S extension in the repo -- as soon as I did this, the *.S files were finally noticed and Untracked files. - Fri Jul 28 14:25:11 2017 -0700 -rev1010 - Jay-Jay-OPL - resync repo - Fri Jul 28 13:40:49 2017 -0700 -rev1009 - Jay-Jay-OPL - Developer SP193 made the following changes... - (In-game ATAD) re-added workaround for some clone adaptors. #58 - Mon Jul 17 05:47:18 2017 -0700 -rev1008 - Jay-Jay-OPL - Developer @rickgaiser made the following changes: (1) dia: separate lines do not scale to higher resolutions - Lines will always be 1 pixel height, so they do not scale well when - upscaling to 1080i. Using rmDrawRect scales well, and is faster too. - Sun Jul 16 01:50:21 2017 -0700 -rev1007 - Jay-Jay-OPL - Following changes were made: SP193: Fix for HDD deinit, avoid linking to thread and TLB patches and updated IOP reboot code. (#51) * Close all files upon deinit of HDD support, to prevent potential risks of corrupting the HDD. * Updated calls to Exit, LoadExecPS2 and ExecPS2, and added custom kernel syscall definitions to avoid linking to the new kernel patches. * Updated SifIopReset to not use NULL as an argument and to support the new SIFCMD header. - Wed Jul 12 02:09:51 2017 -0700 -rev1006 - Jay-Jay-OPL - define DB custom changes - Tue Jul 11 18:44:42 2017 -0700 -rev1005 - Jay-Jay-OPL - belek66 did the following changes: - use module export table to reset ds3 (remove pademu rpc in ee_core) - use thread to read data/set vibration in ds3bt module (can be disabled in Makefile) - emulating analog button (changing pad mode by pressing PS+START buttons) - option to compile pademu modules without using sms_utils (remove -DUSE_SMSUTILS in Makefile) to make them usable in others apps - in gui: saving bt adapter mac address, now pairing DS3 is posible without connected bt adapter - Fri Jun 23 22:07:32 2017 -0700 -rev1004 - Jay-Jay-OPL - small edit to credits. - Tue May 30 23:11:06 2017 -0700 -rev1003 - Jay-Jay-OPL - SP193 commit: (ATAD) Fixed Makefile include paths so that the custom atad.h header will be used. Fixed atad.h to have fitting declarations for ata_io_start and ata_device_sector_io. - Tue May 30 23:03:36 2017 -0700 -rev1002 - Jay-Jay-OPL - drop using CFG-DEV, return using CFG - Tue May 30 13:02:18 2017 -0700 -rev1001 - Jay-Jay-OPL - update lang file - Fri May 5 00:54:37 2017 -0700 -rev1000 - Jay-Jay-OPL - update lang files - Tue Mar 28 18:47:40 2017 -0700 -rev999 - Jay-Jay-OPL - update lang files - Mon Mar 27 13:48:20 2017 -0700 -rev998 - Jay-Jay-OPL - thanks to changes made by Krah we can now adjust itemsList to be centered on main page of OPL in custom themes by using the following decorator property: aligned=1 - Sun Mar 19 20:39:39 2017 -0700 -rev997 - Jay-Jay-OPL - update lang files - Fri Mar 10 02:00:30 2017 -0800 -rev996 - Jay-Jay-OPL - the following changes were done by Developer SP193: - Sat Mar 4 18:50:40 2017 -0800 -rev995 - Jay-Jay-OPL - replace README.md - Tue Feb 7 00:52:53 2017 -0800 -rev994 - Jay-Jay-OPL - remove README.md - Tue Feb 7 00:50:23 2017 -0800 -rev993 - Jay-Jay-OPL - update lang files - Sat Feb 4 20:21:23 2017 -0800 -rev992 - Jay-Jay-OPL - revert changes made to core files in r991 - Fri Feb 3 19:05:07 2017 -0800 -rev991 - Jay-Jay-OPL - @AKuHAK committed the following changes: Synced with mainstream ps2sdk: * Corrected the use of mixed-sign arithmetic, corrected the transfer limit for ata_device_sector_io(), changed ATAD to use the typedefs for fixed-sized values (i.e. u16 instead of unsigned short) to ensure correctness. (56f0335) Note: 48-bit changes didnt ported into HD Pro ATAD module - Thu Feb 2 18:56:18 2017 -0800 -rev990 - Jay-Jay-OPL - update lang files - Thu Feb 2 17:42:04 2017 -0800 -rev989 - Jay-Jay-OPL - update langs - Tue Jan 31 13:08:15 2017 -0800 -rev988 - Jay-Jay-OPL - update lang files - Mon Jan 30 19:22:06 2017 -0800 -rev987 - Jay-Jay-OPL - update lang files - Mon Jan 30 18:51:01 2017 -0800 -rev986 - Jay-Jay-OPL - update lang files - Fri Jan 27 00:54:07 2017 -0800 -rev985 - Jay-Jay-OPL - @belek666 committed: Fixes displaying settings for pademu port 2 - Thu Jan 26 13:53:25 2017 -0800 -rev984 - Jay-Jay-OPL - update Langs - Wed Jan 25 23:24:40 2017 -0800 -rev983 - Jay-Jay-OPL - the following changes were made: * @uyjulian commited: Quick fixes (#37) * @uyjulian commited: Add Dualshock 3 support over USB and Bluetooth (#36) Based off https://bitbucket.org/belek666/open-ps2-loader-ds3 Thanks to @belek666 - Tue Jan 24 14:56:58 2017 -0800 -rev982 - Jay-Jay-OPL - small update so I can move up one revision--since at ps2-home.com we were already at r981. - Mon Jan 23 14:32:32 2017 -0800 -rev981 - Jay-Jay-OPL - Following changes were made: **************************** (1) by Dr-Q: lng_pack.sh: Make it more simple and less hack-ish - Mon Jan 23 14:18:59 2017 -0800 -rev980 - Jay-Jay-OPL - Updated to compile error and warning-free with the head PS2SDK by SP193. HDD and PFS drivers were also updated. (#35) * Updated ISOFS, MCEMU and USBHDFSD to be compatible with the new PS2SDK changes. ISOFS and USBHDFSD: updated definition for I/O functions. MCEMU: removed unused import of KprintfSet(). * Updated HDD and PFS drivers. - Sat Jan 21 17:19:08 2017 -0800 -rev979 - Jay-Jay-OPL - Update dialogs.c - better strings for x & y offset #33 by ShaolinAssassin - Tue Jan 17 07:56:04 2017 -0800 -rev978 - Jay-Jay-OPL - update Lang files - Mon Jan 16 11:09:29 2017 -0800 -rev977 - Jay-Jay-OPL - Update dialogs.c by ShaolinAssassin X and Y Offset will use the same string as X and Y Offset (Hint text) from GSM menu. - Mon Jan 16 08:50:15 2017 -0800 -rev976 - Jay-Jay-OPL - Fix Travis reverting test #26 by Dr-Q - Sun Jan 15 22:20:14 2017 -0800 -rev975 - Jay-Jay-OPL - General cleanup (#27) * Remove unused lanman * Makefile cleanup * Fix README file name and url to forums * clang-formatted files that weren't before - Sun Jan 15 21:57:13 2017 -0800 -rev974 - Jay-Jay-OPL - Updated to support LWIP v2.0.0. by sp193 - Sat Dec 24 02:21:24 2016 -0800 -rev973 - Jay-Jay-OPL - * NOTE: Updating and rebuilding gsKit is required. - by @rickgaiser * Adapt for changes in gsKit - by @rickgaiser - Hacks are no longer needed for 576P and centering the screen. - by @rickgaiser * Add settings for display X and Y offset - by @rickgaiser - Thu Dec 15 18:02:59 2016 -0800 -rev972 - Jay-Jay-OPL - Optimized makefiles. (#24) * Optimized makefiles. Synced with mainstream ps2sdk: * Clear USB Mass Storage Device status to 0 at initialization-time (8997094) * Changed UsbMassRegisterCallback to call the callback once if a device is connected (cf385c0) * Test travis * Test travis 2 - Wed Nov 23 20:49:41 2016 -0800 -rev971 - Jay-Jay-OPL - The following changes were made: ShaolinAssassin: GUI layout fix: compatibility with lang files restored (NOTE: partial merge, not all changes were added to the OPL Daily Builds repo). uyjulian: clang-format again. uyjulian: Fix readme to be in markdown format. uyjulian: consise templates.. doctorxyz: GSM Core gardening. uyjulian: fix spacing, links, and wording in readme. Jay-Jay-OPL: a few custom changes to some files and also lang updates for OPL Daily Builds repo. - Mon Oct 31 11:33:56 2016 -0700 -rev970 - Jay-Jay-OPL - A Few fixes... * doctorxyz commited: GSM core - Screen garbage fix for God of War I (SCUS_973.99) & Sega Genesis Collection (SLUS_215.42) - This patch is applied only once, each time Hook_SetGsCrt is called; it makes DISPLAY2 appears, while DISPLAY1 not - by setting its value to zero. - PS: Sega Genesis Collection (SLUS_215.42) does not repeatedly write to GS Priviledge Registers, but God of War I (SCUS_973.99) does it. - Thu Oct 27 15:28:16 2016 -0700 -rev969 - Jay-Jay-OPL - doctorxyz commited: Per-Game Cheat Engine - fix for ETH and HDD Modes - Tue Oct 25 11:53:37 2016 -0700 -rev968 - Jay-Jay-OPL - OPL: Fix some shits - Tue Oct 25 11:41:07 2016 -0700 -rev967 - Jay-Jay-OPL - SP193: Change in the PS2SDK about libpwroff. - In one commit last year, I changed its design (along with AUDSRV) to use SIFRPC instead because of the change in design of the user SIFCMD buffer. - Unfortunately, i didn't add proper re-initialization code to the new design of libpwroff. - So when OPL starts the HDLDump server the old libpwroff SIFRPC server is contacted and the EE crashes. - Server was broken in r878, and this change was made in 09-27-2016, working well again in r930. - Adjusted the HDLDump server thread priorities for proper functionality of the transfer data. - Update README. - Mon Oct 24 18:55:31 2016 -0700 -rev966 - Jay-Jay-OPL - Added several features and tweaks by the following developers: * BatRastard: Per Game CHEATS should be good now * Caio99BR: OPL - Last commit about revision, i hate it now - Mon Oct 24 10:52:51 2016 -0700 -rev965 - Jay-Jay-OPL - update lang files - Sun Oct 23 18:34:27 2016 -0700 -rev964 - Jay-Jay-OPL - .github: Add some templates * pickup from https://github.com/a2o/snoopy/tree/master/.github * Thanks a lot @bostjan :) - Sun Oct 23 16:28:53 2016 -0700 -rev963 - Jay-Jay-OPL - fix Changelogs - Sun Oct 23 09:01:40 2016 -0700 -rev962 - Jay-Jay - Merge pull request #2 from ifcaro/master - Sun Oct 23 08:42:58 2016 -0700 -rev961 - Caio Oliveira - src/dialogs: Fix chars overpassing of screen - Sun Oct 23 12:37:29 2016 -0200 -rev960 - Jay-Jay-OPL - Oops! Fixed a tiny typo mistake in the previous commit. :) - Sun Oct 23 07:23:09 2016 -0700 -rev959 - Jay-Jay-OPL - Update all changes from OPL Daily Builds from BitBucket Repo https://bitbucket.org/Jay-Jay/opl-daily-builds/commits/ : * added ELF Launcher Menu (aka: ELM) -- it's a clone version of the APPS page in OPL, * added changes so both ELM and APPS support CFG data for INFO PAGE, * added a new Attribute feature where selected MODES can also be displayed on INFO PAGE, * updated LANG files, * plus a few miscellaneous tweaks (browse the OPL Daily Builds repo from BitBucket to learn more...). - Sun Oct 23 06:58:03 2016 -0700 -rev958 - Jay-Jay-OPL - change gfx files - Sun Oct 23 02:37:33 2016 -0700 -rev957 - Jay-Jay - Merge pull request #1 from ifcaro/master - Sun Oct 23 02:06:52 2016 -0700 -rev956 - Caio Oliveira - Makefile: Fix REVISION reported by @ElPatas and reforced by @ShaolinAssasin - Sat Oct 22 21:55:40 2016 -0200 -rev955 - Caio Oliveira - src/dialogs: Rework some minor issues - Sat Oct 22 21:55:40 2016 -0200 -rev954 - Caio Oliveira - make_changelog.sh: Rework revision (see NOTE) - Sat Oct 22 21:55:40 2016 -0200 -rev953 - Caio Oliveira - OLD_DETAILED_CHANGELOG: Bring BitBucket changelog - Sat Oct 22 21:55:40 2016 -0200 -rev952 - Caio Oliveira - OPL: Fix GIT revision (see NOTE below) - Fri Oct 21 05:27:04 2016 -0200 -rev951 - doctorxyz - Makefile: Git REVISION number via shell git log command - Thu Oct 20 13:48:36 2016 -0200 -rev950 - Caio Oliveira - OPL: Update versioning to new scheme - Thu Oct 20 13:44:31 2016 -0200 -rev949 - uyjulian - run clang-format on all .c and .h files - Wed Oct 19 20:32:12 2016 -0200 -rev948 - uyjulian - add .clang-format configuration file - Wed Oct 19 20:32:12 2016 -0200 -rev947 - Caio Oliveira - .gitignore: Change from .hgignore and add more entries - Wed Oct 19 11:00:18 2016 -0200 -rev946 - Caio Oliveira - TravisCI: Initial Template - Wed Oct 19 11:00:18 2016 -0200 -rev945 - Caio Oliveira - lng_pack: Add script to pack all Langs in a zip - Wed Oct 19 11:00:18 2016 -0200 -rev944 - Caio Oliveira - make_changelog: Update it to GIT format - Wed Oct 19 11:00:18 2016 -0200 -rev943 - Caio Oliveira - README: Create a symlink need by GitHub - Wed Oct 19 09:47:19 2016 -0200 -rev942 - Caio Oliveira - CREDITS: Make same style in whole file - Wed Oct 19 09:47:19 2016 -0200 -rev941 - doctorxyz - Skip Videos: Three methods (0 PSS/sceMpegIsEnd/BIK) on a single place Now Skip Videos (a.k.a. 0 PSS) not only skips PSS files (by zeroing their sizes) but also skips Bink .BIK (new technique) and sceMpegIsEnd based ones - All of them from a single place: Game Settings->Customized Settings->Mode 4(Skip Videos) - sceMpegIsEnd and BIK approaches has been implemented on ee_core's patches, while 0 PSS code has been kept intact (on iopcore's cdvdman) - Renamed '0 PSS' for 'Skip Videos' according to each language (NB: Basic Google translation. Native speakers can improve it) - Removed now-redundant GSM's Skip Videos sceMpegIsEnd related stuff (ontheflypatcher) - Since sceMpegIsEnd isn't GSM-dependant anymore - Wed Oct 19 08:53:05 2016 -0200 diff --git a/Makefile b/Makefile index 9017b5a44..de09f1c86 100755 --- a/Makefile +++ b/Makefile @@ -43,6 +43,9 @@ PADEMU ?= 0 #Enables/disables the cheat engine (PS2RD) CHEAT ?= 0 +#Enables/disables high resolution multi-pass rendering for the OPL GUI +HIRES ?= 0 + #Enables/disables building of an edition of OPL that will support the DTL-T10000 (SDK v2.3+) DTL_T10000 ?= 0 @@ -57,7 +60,7 @@ DECI2_DEBUG ?= 0 CHILDPROOF ?= 0 # ======== DO NOT MODIFY VALUES AFTER THIS POINT! UNLESS YOU KNOW WHAT YOU ARE DOING ======== -REVISION = $(shell expr $$(cat DETAILED_CHANGELOG | grep "rev" | head -1 | cut -d " " -f 1 | cut -c 4-) + 1) +REVISION = $(shell expr $(shell git rev-list --count HEAD) + 2) GIT_HASH = $(shell git rev-parse --short=7 HEAD 2>/dev/null) ifeq ($(shell git diff --quiet; echo $$?),1) @@ -180,6 +183,10 @@ else PADEMU_FLAGS = PADEMU=0 endif +ifeq ($(HIRES),1) + EE_CFLAGS += -DHIRES +endif + ifeq ($(DEBUG),1) EE_CFLAGS += -D__DEBUG -g EE_OBJS += debug.o udptty.o ioptrap.o ps2link.o @@ -233,7 +240,7 @@ endif release: echo "Building Open PS2 Loader $(OPL_VERSION)..." echo "-Interface" - $(MAKE) VMC=1 GSM=1 IGS=1 PADEMU=1 CHEAT=1 $(EE_VPKD).ZIP + $(MAKE) VMC=1 GSM=1 IGS=1 PADEMU=1 CHEAT=1 HIRES=0 $(EE_VPKD).ZIP childproof: $(MAKE) CHILDPROOF=1 all @@ -337,7 +344,8 @@ $(EE_ASM_DIR): $(EE_OBJS_DIR): @mkdir -p $@ -DETAILED_CHANGELOG: make_changelog.sh +.PHONY: DETAILED_CHANGELOG +DETAILED_CHANGELOG: sh make_changelog.sh $(EE_BIN_STRIPPED): $(EE_BIN) diff --git a/ee_core/linkfile b/ee_core/linkfile index a58a1a825..c167e5d04 100755 --- a/ee_core/linkfile +++ b/ee_core/linkfile @@ -13,8 +13,14 @@ ENTRY(_start); +MEMORY { + ram82 : ORIGIN = 0x00082000, LENGTH = 24K /* 0x00082000 - 0x00088000: probably free */ + ram88 : ORIGIN = 0x00088000, LENGTH = 60K /* 0x00088000 - 0x00097000: free */ + ramD0 : ORIGIN = 0x000D0000, LENGTH = 192K /* 0x000D0000 - 0x00100000: probably free */ +} + SECTIONS { - .text 0x00088000: { + .text : { _ftext = . ; *(.text) *(.text.*) @@ -22,12 +28,12 @@ SECTIONS { KEEP(*(.init)) KEEP(*(.fini)) QUAD(0) - } + } >ram88 PROVIDE(_etext = .); PROVIDE(etext = .); - .reginfo : { *(.reginfo) } + .reginfo : { *(.reginfo) } >ram88 /* Global/static constructors and deconstructors. */ .ctors ALIGN(16): { @@ -35,20 +41,20 @@ SECTIONS { KEEP(*(EXCLUDE_FILE(*crtend*.o) .ctors)) KEEP(*(SORT(.ctors.*))) KEEP(*(.ctors)) - } + } >ram88 .dtors ALIGN(16): { KEEP(*crtbegin*.o(.dtors)) KEEP(*(EXCLUDE_FILE(*crtend*.o) .dtors)) KEEP(*(SORT(.dtors.*))) KEEP(*(.dtors)) - } + } >ram88 /* Static data. */ .rodata ALIGN(128): { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) - } + } >ram88 .data ALIGN(128): { _fdata = . ; @@ -56,20 +62,20 @@ SECTIONS { *(.data.*) *(.gnu.linkonce.d*) SORT(CONSTRUCTORS) - } + } >ram88 - .rdata ALIGN(128): { *(.rdata) } - .gcc_except_table ALIGN(128): { *(.gcc_except_table) } + .rdata ALIGN(128): { *(.rdata) } >ram88 + .gcc_except_table ALIGN(128): { *(.gcc_except_table) } >ram88 _gp = ALIGN(128) + 0x7ff0; - .lit4 ALIGN(128): { *(.lit4) } - .lit8 ALIGN(128): { *(.lit8) } + .lit4 ALIGN(128): { *(.lit4) } >ram88 + .lit8 ALIGN(128): { *(.lit8) } >ram88 .sdata ALIGN(128): { *(.sdata) *(.sdata.*) *(.gnu.linkonce.s*) - } + } >ram88 _edata = .; PROVIDE(edata = .); @@ -81,14 +87,14 @@ SECTIONS { *(.sbss.*) *(.gnu.linkonce.sb*) *(.scommon) - } + } >ram88 .bss ALIGN(128) : { *(.bss) *(.bss.*) *(.gnu.linkonce.b*) *(COMMON) - } + } >ram88 _end_bss = .; /* Symbols needed by crt0.s. */ diff --git a/ee_core/linkfile.igs b/ee_core/linkfile.igs index 7f0535ff1..5dd57da10 100755 --- a/ee_core/linkfile.igs +++ b/ee_core/linkfile.igs @@ -13,13 +13,19 @@ ENTRY(_start); +MEMORY { + ram82 : ORIGIN = 0x00082000, LENGTH = 24K /* 0x00082000 - 0x00088000: probably free */ + ram88 : ORIGIN = 0x00088000, LENGTH = 60K /* 0x00088000 - 0x00097000: free */ + ramD0 : ORIGIN = 0x000D0000, LENGTH = 192K /* 0x000D0000 - 0x00100000: probably free */ +} + SECTIONS { - .igs_engine 0x00082000 : { + .igs_engine : { libmc.*(*) igs_api.*(*) - } + } >ram82 - .text 0x00088000: { + .text : { _ftext = . ; *(EXCLUDE_FILE (libmc.*).text) *(EXCLUDE_FILE (libmc.*).text.*) @@ -27,12 +33,12 @@ SECTIONS { KEEP(*(.init)) KEEP(*(.fini)) QUAD(0) - } + } >ram88 PROVIDE(_etext = .); PROVIDE(etext = .); - .reginfo : { *(.reginfo) } + .reginfo : { *(.reginfo) } >ram88 /* Global/static constructors and deconstructors. */ .ctors ALIGN(16): { @@ -40,20 +46,20 @@ SECTIONS { KEEP(*(EXCLUDE_FILE(*crtend*.o) .ctors)) KEEP(*(SORT(.ctors.*))) KEEP(*(.ctors)) - } + } >ram88 .dtors ALIGN(16): { KEEP(*crtbegin*.o(.dtors)) KEEP(*(EXCLUDE_FILE(*crtend*.o) .dtors)) KEEP(*(SORT(.dtors.*))) KEEP(*(.dtors)) - } + } >ram88 /* Static data. */ .rodata ALIGN(128): { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) - } + } >ram88 .data ALIGN(128): { _fdata = . ; @@ -61,20 +67,20 @@ SECTIONS { *(.data.*) *(.gnu.linkonce.d*) SORT(CONSTRUCTORS) - } + } >ram88 - .rdata ALIGN(128): { *(.rdata) } - .gcc_except_table ALIGN(128): { *(.gcc_except_table) } + .rdata ALIGN(128): { *(.rdata) } >ram88 + .gcc_except_table ALIGN(128): { *(.gcc_except_table) } >ram88 _gp = ALIGN(128) + 0x7ff0; - .lit4 ALIGN(128): { *(.lit4) } - .lit8 ALIGN(128): { *(.lit8) } + .lit4 ALIGN(128): { *(.lit4) } >ram88 + .lit8 ALIGN(128): { *(.lit8) } >ram88 .sdata ALIGN(128): { *(.sdata) *(.sdata.*) *(.gnu.linkonce.s*) - } + } >ram88 _edata = .; PROVIDE(edata = .); @@ -86,14 +92,14 @@ SECTIONS { *(.sbss.*) *(.gnu.linkonce.sb*) *(.scommon) - } + } >ram88 .bss ALIGN(128) : { *(.bss) *(.bss.*) *(.gnu.linkonce.b*) *(COMMON) - } + } >ram88 _end_bss = .; /* Symbols needed by crt0.s. */ @@ -103,5 +109,4 @@ SECTIONS { _end = _stack + _stack_size ; PROVIDE(end = _end); - } diff --git a/include/renderman.h b/include/renderman.h index c2cadd180..504330387 100644 --- a/include/renderman.h +++ b/include/renderman.h @@ -140,6 +140,9 @@ int rmWideScale(int x); /** Get Pixel Aspect Ratio of native resolution */ float rmGetPAR(); +/** Get interfaced frame mode */ +int rmGetInterlacedFrameMode(); + /** Scale x from 640 to native resolution */ int rmScaleX(int x); diff --git a/modules/iopcore/cdvdman/cdvdman.c b/modules/iopcore/cdvdman/cdvdman.c index 9ffc30c4e..0b62771c0 100644 --- a/modules/iopcore/cdvdman/cdvdman.c +++ b/modules/iopcore/cdvdman/cdvdman.c @@ -76,11 +76,11 @@ struct cdvdman_settings_usb cdvdman_settings = { #endif //---------------------------------------------------- -struct irx_export_table _exp_cdvdman; -struct irx_export_table _exp_cdvdstm; -struct irx_export_table _exp_smsutils; +extern struct irx_export_table _exp_cdvdman; +extern struct irx_export_table _exp_cdvdstm; +extern struct irx_export_table _exp_smsutils; #ifdef VMC_DRIVER -struct irx_export_table _exp_oplutils; +extern struct irx_export_table _exp_oplutils; #endif struct dirTocEntry diff --git a/src/dia.c b/src/dia.c index d701c8301..6e80ffeb0 100644 --- a/src/dia.c +++ b/src/dia.c @@ -109,8 +109,11 @@ int diaShowKeyb(char *text, int maxLen, int hide_text) // Commands for (i = 0; i < KEYB_HEIGHT; i++) { - if (cmdicons[i]) - rmDrawPixmap(cmdicons[i], 436, 170 + 3 * UI_SPACING_H * i, ALIGN_NONE, cmdicons[i]->Width, cmdicons[i]->Height, SCALING_RATIO, gDefaultCol); + if (cmdicons[i]) { + int w = (cmdicons[i]->Width * 20) / cmdicons[i]->Height; + int h = 20; + rmDrawPixmap(cmdicons[i], 436, 170 + 3 * UI_SPACING_H * i, ALIGN_NONE, w, h, SCALING_RATIO, gDefaultCol); + } x = 477; w = fntRenderString(gTheme->fonts[0], x, 170 + 3 * UI_SPACING_H * i, ALIGN_NONE, 0, 0, commands[i], gTheme->uiTextColor) - x; diff --git a/src/fntsys.c b/src/fntsys.c index 2e15ca33d..c528ac4b7 100644 --- a/src/fntsys.c +++ b/src/fntsys.c @@ -425,7 +425,7 @@ static fnt_glyph_cache_entry_t *fntCacheGlyph(font_t *font, uint32_t gid) glyph->shx = slot->advance.x; glyph->shy = slot->advance.y; glyph->ox = slot->bitmap_left; - glyph->oy = rmScaleY(FNTSYS_CHAR_SIZE-2) - slot->bitmap_top; + glyph->oy = -slot->bitmap_top; glyph->isValid = 1; @@ -445,6 +445,10 @@ void fntUpdateAspectRatio() // Scale width according to the PAR (Pixel Aspect Ratio) ws = hs * rmGetPAR(); + // Supersample height*2 when using interlaced frame mode + if (rmGetInterlacedFrameMode() == 1) + hs *= 2; + // flush cache - it will be invalid after the setting for (i = 0; i < FNT_MAX_COUNT; i++) { if (fonts[i].isValid) { @@ -469,12 +473,18 @@ static void fntRenderGlyph(fnt_glyph_cache_entry_t *glyph, int pen_x, int pen_y) * without the use of prim_quad_texture and rmSetupQuad... */ quad.ul.x = pen_x + glyph->ox; - quad.ul.y = pen_y + glyph->oy; + if (rmGetInterlacedFrameMode() == 0) + quad.ul.y = pen_y + glyph->oy; + else + quad.ul.y = (float)pen_y + ((float)glyph->oy / 2.0f); quad.ul.u = glyph->allocation->x; quad.ul.v = glyph->allocation->y; quad.br.x = quad.ul.x + glyph->width; - quad.br.y = quad.ul.y + glyph->height; + if (rmGetInterlacedFrameMode() == 0) + quad.br.y = quad.ul.y + glyph->height; + else + quad.br.y = quad.ul.y + ((float)glyph->height / 2.0f); quad.br.u = quad.ul.u + glyph->width; quad.br.v = quad.ul.v + glyph->height; @@ -508,7 +518,10 @@ int fntRenderString(int id, int x, int y, short aligned, size_t width, size_t he } if (aligned & ALIGN_VCENTER) { - y -= rmScaleY(FNTSYS_CHAR_SIZE) >> 1; + y += rmScaleY(FNTSYS_CHAR_SIZE-4) >> 1; + } + else { + y += rmScaleY(FNTSYS_CHAR_SIZE-2); } quad.color = colour; @@ -632,7 +645,10 @@ int fntRenderString(int id, int x, int y, short aligned, size_t width, size_t he } if (aligned & ALIGN_VCENTER) { - y -= rmScaleY(FNTSYS_CHAR_SIZE) >> 1; + y += rmScaleY(FNTSYS_CHAR_SIZE-4) >> 1; + } + else { + y += rmScaleY(FNTSYS_CHAR_SIZE-2); } quad.color = colour; diff --git a/src/gui.c b/src/gui.c index 85b2ee799..974d43b05 100644 --- a/src/gui.c +++ b/src/gui.c @@ -131,7 +131,6 @@ void guiInit(void) gGUILockSemaId = CreateSema(&gQueueSema); guiReloadScreenExtents(); - guiUpdateScreenScale(); // background texture - for perlin gBackgroundTex.Width = PLASMA_W; @@ -525,12 +524,21 @@ void guiShowUIConfig(void) , "EDTV 640x448p @60Hz 24bit" , "EDTV 640x512p @50Hz 24bit" , "VGA 640x480p @60Hz 24bit" +#ifdef HIRES + , "PAL 704x576i @50Hz 24bit" + , "NTSC 704x480i @60Hz 24bit" + , "EDTV 704x480p @60Hz 24bit" + , "EDTV 704x576p @50Hz 24bit" + , "HDTV 1280x720p @60Hz 16bit" + , "HDTV 1920x1080i @60Hz 16bit" +#else , "PAL 704x576i @50Hz 16bit" , "NTSC 704x480i @60Hz 16bit" , "EDTV 704x480p @60Hz 16bit" , "EDTV 704x576p @50Hz 16bit" , "HDTV 1280x720p @60Hz 16bit scaled" , "HDTV 1920x1080i @60Hz 16bit scaled" +#endif , NULL}; diaSetEnum(diaUIConfig, UICFG_SCROLL, scrollSpeeds); @@ -1928,10 +1936,13 @@ void guiDrawBGPlasma() int guiDrawIconAndText(int iconId, int textId, int font, int x, int y, u64 color) { GSTEXTURE *iconTex = thmGetTexture(iconId); + int w = (iconTex->Width * 20) / iconTex->Height; + int h = 20; + if (iconTex && iconTex->Mem) { - y += iconTex->Height >> 1; - rmDrawPixmap(iconTex, x, y, ALIGN_VCENTER, iconTex->Width, iconTex->Height, SCALING_RATIO, gDefaultCol); - x += rmWideScale(iconTex->Width) + 2; + y += h >> 1; + rmDrawPixmap(iconTex, x, y, ALIGN_VCENTER, w, h, SCALING_RATIO, gDefaultCol); + x += rmWideScale(w) + 2; } else { // HACK: font is aligned to VCENTER, the default height icon height is 20 diff --git a/src/renderman.c b/src/renderman.c index 30ee83d18..b91c7895d 100644 --- a/src/renderman.c +++ b/src/renderman.c @@ -15,7 +15,9 @@ #define __VRAM_SIZE 4194304 GSGLOBAL *gsGlobal; +#ifndef HIRES s32 guiThreadID; +#endif static int order; static enum rm_vmode vmode = RM_VMODE_AUTO; @@ -29,6 +31,7 @@ struct rm_mode char hsync; //In KHz short int width; short int height; + short int passes; short int VCK; short int interlace; short int field; @@ -39,19 +42,24 @@ struct rm_mode static struct rm_mode rm_mode_table[NUM_RM_VMODES] = { // 24 bit color mode with black borders - {-1, 16, 640, -1, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 1, 1}, // AUTO - {GS_MODE_PAL, 16, 640, 512, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz - {GS_MODE_NTSC, 16, 640, 448, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz - {GS_MODE_DTV_480P, 31, 640, 448, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz - {GS_MODE_DTV_576P, 31, 640, 512, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz - {GS_MODE_VGA_640_60, 31, 640, 480, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // VGA640x480@60Hz + {-1, 16, 640, -1, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 1, 1}, // AUTO + {GS_MODE_PAL, 16, 640, 512, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz + {GS_MODE_NTSC, 16, 640, 448, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz + {GS_MODE_DTV_480P, 31, 640, 448, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz + {GS_MODE_DTV_576P, 31, 640, 512, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz + {GS_MODE_VGA_640_60, 31, 640, 480, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // VGA640x480@60Hz // 16bit color mode full screen - {GS_MODE_PAL, 16, 704, 576, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz - {GS_MODE_NTSC, 16, 704, 480, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz - {GS_MODE_DTV_480P, 31, 704, 480, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz - {GS_MODE_DTV_576P, 31, 704, 576, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz - {GS_MODE_DTV_720P, 31, 640, 720, 1, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 2}, // HDTV720P@60Hz - {GS_MODE_DTV_1080I, 31, 640, 540, 1, GS_INTERLACED, GS_FIELD, RM_ARATIO_16_9, 2, 3}, // HDTV1080I@60Hz + {GS_MODE_PAL, 16, 704, 576, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 11, 10}, // PAL@50Hz + {GS_MODE_NTSC, 16, 704, 480, 2, 4, GS_INTERLACED, GS_FIELD, RM_ARATIO_4_3, 54, 59}, // NTSC@60Hz + {GS_MODE_DTV_480P, 31, 704, 480, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV480P@60Hz + {GS_MODE_DTV_576P, 31, 704, 576, 2, 2, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_4_3, 1, 1}, // DTV576P@50Hz +#ifdef HIRES + {GS_MODE_DTV_720P, 31, 1280, 720, 3, 1, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 1}, // HDTV720P@60Hz + {GS_MODE_DTV_1080I, 31, 1920, 1080, 3, 1, GS_INTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 1}, // HDTV1080I@60Hz +#else + {GS_MODE_DTV_720P, 31, 640, 720, 3, 1, GS_NONINTERLACED, GS_FRAME, RM_ARATIO_16_9, 1, 2}, // HDTV720P@60Hz + {GS_MODE_DTV_1080I, 31, 640, 540, 3, 1, GS_INTERLACED, GS_FIELD, RM_ARATIO_16_9, 2, 3}, // HDTV1080I@60Hz +#endif }; // Display Aspect Ratio @@ -98,6 +106,10 @@ void rmStartFrame(void) void rmEndFrame(void) { +#ifdef HIRES + gsKit_hires_sync(gsGlobal); + gsKit_hires_flip(gsGlobal); +#else gsKit_set_finish(gsGlobal); gsKit_queue_exec(gsGlobal); @@ -116,19 +128,26 @@ void rmEndFrame(void) } gsKit_setactive(gsGlobal); +#endif gsKit_TexManager_nextFrame(gsGlobal); } +#ifndef HIRES static int rmOnVSync(void) { iWakeupThread(guiThreadID); return 0; } +#endif void rmInit() { +#ifdef HIRES + gsGlobal = gsKit_hires_init_global(); +#else gsGlobal = gsKit_init_global(); +#endif rm_mode_table[RM_VMODE_AUTO].mode = gsGlobal->Mode; rm_mode_table[RM_VMODE_AUTO].height = gsGlobal->Height; @@ -143,8 +162,10 @@ void rmInit() order = 0; +#ifndef HIRES guiThreadID = GetThreadId(); gsKit_add_vsync_handler(&rmOnVSync); +#endif } int rmSetMode(int force) @@ -155,6 +176,13 @@ int rmSetMode(int force) // we don't want to set the vmode without a reason... int changed = (vmode != gVMode || force); if (changed) { +#ifdef HIRES + // Hires mode needs to re-initialize if is was previously initialized + if (vmode != RM_VMODE_AUTO) { + gsKit_hires_deinit_global(gsGlobal); + gsGlobal = gsKit_hires_init_global(); + } +#endif vmode = gVMode; gsGlobal->Mode = rm_mode_table[vmode].mode; @@ -165,26 +193,51 @@ int rmSetMode(int force) gsGlobal->PSM = GS_PSM_CT24; // Higher resolution use too much VRAM // so automatically switch back to 16bit color depth +#ifdef HIRES + if ((gsGlobal->Width * gsGlobal->Height) > (704 * 576)) + gsGlobal->PSM = GS_PSM_CT16S; +#else if ((gsGlobal->Width * gsGlobal->Height) > (640 * 512)) gsGlobal->PSM = GS_PSM_CT16S; +#endif gsGlobal->PSMZ = GS_PSMZ_16S; gsGlobal->ZBuffering = GS_SETTING_OFF; gsGlobal->PrimAlphaEnable = GS_SETTING_ON; gsGlobal->DoubleBuffering = GS_SETTING_ON; gsGlobal->Dithering = GS_SETTING_ON; + // Do not draw pixels if they are fully transparent + //gsGlobal->Test->ATE = GS_SETTING_ON; + gsGlobal->Test->ATST = 7; // NOTEQUAL to AREF passes + gsGlobal->Test->AREF = 0x00; + gsGlobal->Test->AFAIL = 0; // KEEP + if ((gsGlobal->Interlace == GS_INTERLACED) && (gsGlobal->Field == GS_FRAME)) gsGlobal->Height /= 2; + // Coordinate space ranges from 0 to 4096 pixels + // Center the buffer in the coordinate space + gsGlobal->OffsetX = ((4096 - gsGlobal->Width) / 2) * 16; + gsGlobal->OffsetY = ((4096 - gsGlobal->Height) / 2) * 16; + +#ifdef HIRES + gsKit_hires_init_screen(gsGlobal, rm_mode_table[vmode].passes); +#else gsKit_init_screen(gsGlobal); gsKit_mode_switch(gsGlobal, GS_ONESHOT); +#endif gsKit_set_test(gsGlobal, GS_ZTEST_OFF); gsKit_set_primalpha(gsGlobal, gDefaultAlpha, 0); +#ifdef HIRES + gsKit_hires_sync(gsGlobal); + gsKit_hires_flip(gsGlobal); +#else // reset the contents of the screen to avoid garbage being displayed gsKit_clear(gsGlobal, gColBlack); gsKit_sync_flip(gsGlobal); +#endif LOG("RENDERMAN New vmode: %d, %d x %d\n", vmode, gsGlobal->Width, gsGlobal->Height); } @@ -211,7 +264,11 @@ void rmGetScreenExtents(int *w, int *h) void rmEnd(void) { +#ifdef HIRES + gsKit_hires_deinit_global(gsGlobal); +#else gsKit_deinit_global(gsGlobal); +#endif } #define X_SCALE(x) (((x)*iDisplayWidth) /640) @@ -263,10 +320,14 @@ static void rmSetupQuad(GSTEXTURE *txt, int x, int y, short aligned, int w, int void rmDrawQuad(rm_quad_t *q) { - if ((q->txt->PSM == GS_PSM_CT32) || (q->txt->Clut && q->txt->ClutPSM == GS_PSM_CT32)) + if ((q->txt->PSM == GS_PSM_CT32) || (q->txt->Clut && q->txt->ClutPSM == GS_PSM_CT32)) { gsGlobal->PrimAlphaEnable = GS_SETTING_ON; - else + gsKit_set_test(gsGlobal, GS_ATEST_ON); + } + else { gsGlobal->PrimAlphaEnable = GS_SETTING_OFF; + gsKit_set_test(gsGlobal, GS_ATEST_OFF); + } gsKit_TexManager_bind(gsGlobal, q->txt); gsKit_prim_sprite_texture(gsGlobal, q->txt, @@ -376,14 +437,21 @@ float rmGetPAR() fPAR *= 0.75f; // In interlaced frame mode, the pixel are (virtually) twice as high - // FIXME: this looks ugly! - // we need the font to render at 1920x1080 instead of 1920x540 if ((gsGlobal->Interlace == GS_INTERLACED) && (gsGlobal->Field == GS_FRAME)) fPAR *= 2.0f; return fPAR; } +// Get interfaced frame mode +int rmGetInterlacedFrameMode() +{ + if ((gsGlobal->Interlace == GS_INTERLACED) && (gsGlobal->Field == GS_FRAME)) + return 1; + + return 0; +} + int rmScaleX(int x) { return X_SCALE(x); @@ -408,6 +476,9 @@ static void rmUpdateRenderOffsets() { fRenderXOff = (float)iDisplayXOff + transX - 0.5f; fRenderYOff = (float)iDisplayYOff + transY - 0.5f; + + if (rmGetInterlacedFrameMode() == 1) + fRenderYOff += 0.25f; } void rmSetOverscan(int overscan) From f93e3d13bb915f0d8e0156716352bbcac4e674de Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 21 May 2018 15:11:27 -0700 Subject: [PATCH 090/269] SP193: (SMAP-ingame) Ported changes from PS2SDK for SMAP #96. --- modules/network/smap-ingame/xfer.c | 40 +++++++++++++++++++----------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/modules/network/smap-ingame/xfer.c b/modules/network/smap-ingame/xfer.c index 513b75af0..8a41511f0 100644 --- a/modules/network/smap-ingame/xfer.c +++ b/modules/network/smap-ingame/xfer.c @@ -29,9 +29,11 @@ static inline int CopyToFIFOWithDMA(volatile u8 *smap_regbase, void *buffer, int int NumBlocks; int result; - if ((NumBlocks = length >> 7) > 0) { - if (dev9DmaTransfer(1, buffer, NumBlocks << 16 | 0x20, DMAC_FROM_MEM) >= 0) { - result = NumBlocks << 7; + /* Non-Sony: the original block size was (32*4 = 128) bytes. + However, that resulted in slightly lower performance due to the IOP needing to copy more data. */ + if ((NumBlocks = length >> 6) > 0) { + if (dev9DmaTransfer(1, buffer, NumBlocks << 16 | 0x10, DMAC_FROM_MEM) >= 0) { + result = NumBlocks << 6; } else result = 0; } else @@ -58,10 +60,11 @@ static inline int CopyFromFIFOWithDMA(volatile u8 *smap_regbase, void *buffer, i SMAP_REG16(SMAP_R_RXFIFO_SIZE) = result; SMAP_REG8(SMAP_R_RXFIFO_CTRL) = SMAP_RXFIFO_DMAEN; - dmac_request(IOP_DMAC_DEV9, buffer, 0x20, result, DMAC_TO_MEM); + //Transfer in 64-byte (16x4) blocks + dmac_request(IOP_DMAC_DEV9, buffer, 0x10, result, DMAC_TO_MEM); dmac_transfer(IOP_DMAC_DEV9); - result *= 128; + result *= 64; /* Wait for DMA to complete. Do not use a semaphore as thread switching hurts throughput greatly. */ while (dmac_ch_get_chcr(IOP_DMAC_DEV9) & DMAC_CHCR_TR) { @@ -139,19 +142,26 @@ inline int HandleRxIntr(struct SmapDriverData *SmapDrivPrivData) volatile smap_bd_t *PktBdPtr; volatile u8 *smap_regbase; struct pbuf *pbuf; - u16 ctrl_stat; + u16 ctrl_stat, length, pointer, LengthRounded; smap_regbase = SmapDrivPrivData->smap_regbase; NumPacketsReceived = 0; - while (1) { - PktBdPtr = &rx_bd[SmapDrivPrivData->RxBDIndex & (SMAP_BD_MAX_ENTRY - 1)]; - if (!((ctrl_stat = PktBdPtr->ctrl_stat) & SMAP_BD_RX_EMPTY)) { - if (ctrl_stat & (SMAP_BD_RX_INRANGE | SMAP_BD_RX_OUTRANGE | SMAP_BD_RX_FRMTOOLONG | SMAP_BD_RX_BADFCS | SMAP_BD_RX_ALIGNERR | SMAP_BD_RX_SHORTEVNT | SMAP_BD_RX_RUNTFRM | SMAP_BD_RX_OVERRUN) || PktBdPtr->length > MAX_FRAME_SIZE) { + /* Non-Sony: Workaround for the hardware BUG whereby the Rx FIFO of the MAL becomes unresponsive or loses frames when under load. + Check that there are frames to process, before accessing the BD registers. */ + while(SMAP_REG8(SMAP_R_RXFIFO_FRAME_CNT) > 0){ + PktBdPtr = &rx_bd[SmapDrivPrivData->RxBDIndex % SMAP_BD_MAX_ENTRY]; + ctrl_stat = PktBdPtr->ctrl_stat; + if (!(ctrl_stat & SMAP_BD_RX_EMPTY)) { + length = PktBdPtr->length; + LengthRounded = (length + 3) & ~3; + pointer = PktBdPtr->pointer; + + if (ctrl_stat & (SMAP_BD_RX_INRANGE | SMAP_BD_RX_OUTRANGE | SMAP_BD_RX_FRMTOOLONG | SMAP_BD_RX_BADFCS | SMAP_BD_RX_ALIGNERR | SMAP_BD_RX_SHORTEVNT | SMAP_BD_RX_RUNTFRM | SMAP_BD_RX_OVERRUN)) { } else { - if ((pbuf = pbuf_alloc(PBUF_RAW, PktBdPtr->length, PBUF_POOL)) != NULL) { - CopyFromFIFO(SmapDrivPrivData->smap_regbase, pbuf->payload, pbuf->len, PktBdPtr->pointer); + if ((pbuf = pbuf_alloc(PBUF_RAW, LengthRounded, PBUF_POOL)) != NULL) { + CopyFromFIFO(SmapDrivPrivData->smap_regbase, pbuf->payload, length, pointer); //Inform ps2ip that we've received data. SMapLowLevelInput(pbuf); @@ -189,11 +199,11 @@ int SMAPSendPacket(const void *data, unsigned int length) }; BD_data_ptr = SMAP_REG16(SMAP_R_TXFIFO_WR_PTR); - BD_ptr = &tx_bd[SmapDriverData.TxBDIndex & 0x3F]; + BD_ptr = &tx_bd[SmapDriverData.TxBDIndex % SMAP_BD_MAX_ENTRY]; if ((result = CopyToFIFOWithDMA(SmapDriverData.smap_regbase, (void *)data, length)) > 0) { SizeRounded -= result; - (unsigned int)data += result; + data = (const void*)((u8*)data + result); } __asm__ __volatile__( @@ -235,7 +245,7 @@ int SMAPSendPacket(const void *data, unsigned int length) BD_ptr->length = length; BD_ptr->pointer = BD_data_ptr; SMAP_REG8(SMAP_R_TXFIFO_FRAME_INC) = 0; - BD_ptr->ctrl_stat = SMAP_BD_TX_READY | SMAP_BD_TX_GENFCS | SMAP_BD_TX_GENPAD; /* 0x8300 */ + BD_ptr->ctrl_stat = SMAP_BD_TX_READY | SMAP_BD_TX_GENFCS | SMAP_BD_TX_GENPAD; SmapDriverData.TxBDIndex++; SMAP_EMAC3_SET(SMAP_R_EMAC3_TxMODE0, SMAP_E3_TX_GNP_0); From 335f1744fce7b2fe3f2c6dc4c020afa2467f8111 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 28 May 2018 10:49:23 -0700 Subject: [PATCH 091/269] SP193 made the following changes: (dev9-ingame) removed code that shuts down DEV9, to fix commit e9a679d. #98 --- modules/iopcore/cdvdman/dev9.c | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/modules/iopcore/cdvdman/dev9.c b/modules/iopcore/cdvdman/dev9.c index ac7bada56..7508fea6d 100644 --- a/modules/iopcore/cdvdman/dev9.c +++ b/modules/iopcore/cdvdman/dev9.c @@ -222,24 +222,7 @@ static void dev9_set_stat(int stat) /* Export 6 */ void dev9Shutdown(void) { - int idx; - USE_DEV9_REGS; - - for (idx = 0; idx < 16; idx++) - if (dev9_shutdown_cbs[idx]) - dev9_shutdown_cbs[idx](); - - if (dev9type == 0) { /* PCMCIA */ - DEV9_REG(DEV9_R_POWER) = 0; - DEV9_REG(DEV9_R_1474) = 0; - } else if (dev9type == 1) { - DEV9_REG(DEV9_R_1466) = 1; - DEV9_REG(DEV9_R_1464) = 0; - DEV9_REG(DEV9_R_1460) = DEV9_REG(DEV9_R_1464); - DEV9_REG(DEV9_R_POWER) = DEV9_REG(DEV9_R_POWER) & ~4; - DEV9_REG(DEV9_R_POWER) = DEV9_REG(DEV9_R_POWER) & ~1; - } - DelayThread(1000000); + //Do not let the DEV9 interface to be switched off. } /* Export 7 */ From 837ff55f2666c6b6166aa478f18235d9a8b6ea2c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 1 Jun 2018 02:02:25 -0700 Subject: [PATCH 092/269] modify About Page to include info on where to get OPL for free. --- include/lang.h | 3 +++ src/dialogs.c | 17 +++++++++++++++-- src/lang.c | 5 ++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/include/lang.h b/include/lang.h index 0133310a5..7c03d5637 100644 --- a/include/lang.h +++ b/include/lang.h @@ -258,6 +258,9 @@ enum _STR_IDS { _STR_ELM_LAUNCH_VCD_NOTFOUND, _STR_ELM_RENAME_ERROR, _STR_ELM_DELETE_ERROR, + _STR_OPL_FREE, + _STR_OPL_IFCARO, + _STR_OPL_DB, //END of OPL_DB tweaks LANG_STR_COUNT }; diff --git a/src/dialogs.c b/src/dialogs.c index 8c9dfb4ed..4266e9ed2 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -807,7 +807,6 @@ struct UIItem diaAbout[] = { //START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"SP193, volca, ... and the anonymous ...", -1}}}, //END of OPL_DB tweaks - {UI_BREAK}, //START of OPL_DB tweaks {UI_SPLITTER}, //END of OPL_DB tweaks @@ -829,7 +828,6 @@ struct UIItem diaAbout[] = { //START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"ShaolinAssassin, yoshi314, and zero35.", -1}}}, //END of OPL_DB tweaks - {UI_BREAK}, //START of OPL_DB tweaks {UI_SPLITTER}, //END of OPL_DB tweaks @@ -846,6 +844,21 @@ struct UIItem diaAbout[] = { {UI_SPLITTER}, //END of OPL_DB tweaks +//START of OPL_DB tweaks + // OPL Free Statement + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OPL_FREE}}}, + {UI_BREAK}, + + {UI_SPACER}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {NULL, _STR_OPL_IFCARO}}}, + {UI_BREAK}, + + {UI_SPACER}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {NULL, _STR_OPL_DB}}}, + {UI_BREAK}, + {UI_SPLITTER}, +//END of OPL_DB tweaks + // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, {UI_BREAK}, diff --git a/src/lang.c b/src/lang.c index 3597bffd5..0df942e4f 100644 --- a/src/lang.c +++ b/src/lang.c @@ -269,7 +269,10 @@ static char *internalEnglish[LANG_STR_COUNT] = { "POPSTARTER.ELF not found at '%s'!", "VCD file '%s' not found!", "An error occurred while renaming the file.", - "An error occurred while deleting the file." + "An error occurred while deleting the file.", + "Never buy OPEN-PS2-LOADER (OPL), instead get it free at:", + "ifcaro OPL version at psx-scene.com", + "OPL Daily Builds (DB) version at ps2-home.com", //END of OPL_DB tweaks }; From f56b9fe0e75ae5052effab1514cab540fe049c5f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 3 Jun 2018 19:56:54 -0700 Subject: [PATCH 093/269] update Lang files --- lng/lang_English.lng | 5 ++++- lng/lang_Korean.lng | 48 ++++++++++++++++++++++---------------------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 83e4126cc..f7cdf5bd5 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -271,4 +271,7 @@ PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 91f799933..a72584364 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -184,8 +184,8 @@ H-POS 수평 조정 V-POS 수직 조정 -Overscan -Overscan Adjustment +오버스캔 +오버스캔 조정 FMV 건너뛰기 풀 모션 비디오 건너뛰기 치트 설정 @@ -232,25 +232,25 @@ DS 컨트롤러 맥 주소와 페어링: DS 컨트롤러 페어링 블루투스 어댑터 맥 주소가 있는 DS 컨트롤러 페어 연결되지 않음 -Bluetooth adapter information -Shows more information and supported features -HCI Version: -LMP Version: -Manufacturer ID: -Support features: -Yes -No -Bluetooth adapter should be fully compatible with DS3/DS4 controllers. -Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation -Turns on/off Multitap emulation for selected game. -Multitap emulator on port -Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -PS1 Games -PS1 Games display mode -POPSTARTER.ELF not found at '%s'! -VCD file '%s' not found! -An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +블루투스 어댑터 정보 +더 많은 정보와 지원되는 기능을 보여줌. +HCI 버전: +LMP 버전: +제조업체 ID: +지원 기능: +예 +아니오 +블루투스 어댑터는 DS3/DS4 컨트롤러와 완벽하게 호환되어야 합니다. +블루투스 어댑터가 DS3/DS4 컨트롤러에서 올바르게 작동하지 않을 수 있습니다. +멀티탭 에뮬레이션 활성화 +선택한 게임을 위한 멀티탭 에뮬레이션 켬/끔. +포트상의 멀티탭 에뮬레이터 +멀티탭 에뮬레이션을 위한 포트를 선택. +Fake DS3에 대한 해결방법 비활성화 +일부 fake ds3s는 해결 방법이 필요합니다. 이 옵션은 옵션을 비활성. +PS1 게임 +PS1 게임 표시 모드 +'%s'에 POPSTARTER.ELF이 없습니다! +VCD 파일 '% s'을(를) 찾을 수 없습니다! +파일 이름을 바꾸는 중 오류가 발생했습니다. +파일을 삭제하는 중 오류가 발생했습니다. \ No newline at end of file From 3e43b85e6e87d29a13b64aca1718938353a720ee Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 3 Jun 2018 21:55:31 -0700 Subject: [PATCH 094/269] update Lang files --- lng/lang_Korean.lng | 2 +- lng/lang_Portuguese_BR.lng | 9 ++++++--- lng/lang_Swedish.lng | 9 ++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index a72584364..b0a39c6f1 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,5 +1,5 @@ # Translated by DDinghoya -# Last update: 3/7/2018 +# Last update: 5/1/2018 # Updated for OPL_1036_DB-TA [926069d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index fd4fa70eb..7111b3db1 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 6/3/2018 +# Updated for OPL_1052_DB-TA [837ff55] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -253,4 +253,7 @@ Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! O arquivo VCD '%s' não foi encontrado! Ocorreu um erro ao renomear o arquivo. -Ocorreu um erro ao excluir o arquivo. \ No newline at end of file +Ocorreu um erro ao excluir o arquivo. +Nunca compre OPEN-PS2-LOADER (OPL), baixe grátis em: +psx-scene.com, OPL versão ifcaro +ps2-home.com, OPL versão Daily Builds (DB) \ No newline at end of file diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index e0f1d83d4..60687ec86 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 6/3/2018 +# Updated for OPL_1052_DB-TA [837ff55] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -253,4 +253,7 @@ Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! VCD fil '%s' saknas! Ett fel inträffade vid namnbyte. -Ett fel inträffade vid radering. \ No newline at end of file +Ett fel inträffade vid radering. +Köp aldrig OPEN-PS2-LOADER (OPL), det finns gratis här: +ifcaro OPL version @ psx-scene.com +OPL Daily Builds (DB) version @ ps2-home.com \ No newline at end of file From b472da27835fa3ebf4e9baa12f94c95aebcb75e1 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 4 Jun 2018 05:21:45 -0700 Subject: [PATCH 095/269] update LANG files --- lng/lang_Portuguese.lng | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index bfb5cf2dc..df3eb4777 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 6/3/2018 +# Updated for OPL_1052_DB-TA [837ff55] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -253,4 +253,7 @@ Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! Ficheiro VCD '%s' não encontrado! Ocorreu um erro ao renomear o ficheiro. -Ocorreu um erro ao apagar o ficheiro \ No newline at end of file +Ocorreu um erro ao apagar o ficheiro +Nunca compre o OPEN-PS2-LOADER (OPL), descarregue grátis em: +OPL versão ifcaro em psx-scene.com +OPL versão Daily Builds (DB) em ps2-home.com \ No newline at end of file From f32c97dd681ff4680f30d14fb767d5ec365375c1 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 4 Jun 2018 08:00:25 -0700 Subject: [PATCH 096/269] update LANG files --- lng/lang_Arabic.lng | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 8f2ca96a2..9413136da 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 6/3/2018 +# Updated for OPL_1052_DB-TA [837ff55] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s @@ -253,4 +253,7 @@ PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! VCD ملف '%s' غير موجود! حدث خطأ أثناء إعادة تسمية الملف. -حدث خطأ أثناء حذف الملف. \ No newline at end of file +حدث خطأ أثناء حذف الملف. +لا تشتري OPEN-PS2-LOADER (OPL) مطلقًا ، احصل عليه مجانًا من: +ifcaro OPL النسخة الموجودة عند psx-scene.com +OPL Daily Builds (DB) النسخة الموجودة عند ps2-home.com \ No newline at end of file From 00fe0d272553f305acf21120572e57e7fef8531f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 4 Jun 2018 19:48:53 -0700 Subject: [PATCH 097/269] update Lang files --- lng/lang_Russian.lng | 9 ++++++--- lng/lang_Spanish.lng | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index e155b1805..1ab148a44 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: 3/8/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 6/3/2018 +# Updated for OPL_1052_DB-TA [837ff55] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -253,4 +253,7 @@ PS1 игры POPSTARTER.ELF не найден '%s'! VCD файл '%s' не найден! При переименовании файла произошла ошибка. -При удалении файла произошла ошибка. \ No newline at end of file +При удалении файла произошла ошибка. +Не покупайте OPEN-PS2-LOADER (OPL), он абсолютно бесплатен: +ifcaro OPL версия на psx-scene.com +OPL Daily Builds (DB) версия на ps2-home.com \ No newline at end of file diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 02913d3f4..eaac97a96 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: 3/9/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 6/3/2018 +# Updated for OPL_1052_DB-TA [837ff55] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -253,4 +253,7 @@ Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! No se encuentra el archivo VCD '%s'! Se produjo un error al cambiar el nombre del archivo. -Se produjo un error al eliminar el archivo. \ No newline at end of file +Se produjo un error al eliminar el archivo. +Nunca compres OPEN-PS2-LOADER (OPL), descargalo gratis desde: +OPL Versión Ifcaro en psx-scene.com +OPL Versión Daily Builds (DB) en ps2-home.com \ No newline at end of file From f2f0d404a5f85acdbcf9d20193deb453ffb46206 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 5 Jun 2018 23:20:59 -0700 Subject: [PATCH 098/269] update LANG files --- lng/lang_Bulgarian.lng | 95 ++++++++++++++++++++++-------------------- lng/lang_English.lng | 2 +- lng/lang_Hungarian.lng | 9 ++-- src/lang.c | 2 +- 4 files changed, 57 insertions(+), 51 deletions(-) diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index baa7ba9b7..b073aeb34 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 6/3/2018 +# Updated for OPL_1052_DB-TA [837ff55] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -113,7 +113,7 @@ NetBIOS Прецизно четене Синхронен режим Откачане на OPL от Syscalls -Напред Видео +0 PSS режим Емулиране на DVD-DL Изключване на IGR Зареждане на модулите във висока памет @@ -139,7 +139,7 @@ VMC файлът трябва да бъде създаден. Програмисти: Качествен контрол от: USB поддиректория -Зареждане на ELF по избор при IGR +Оставете свободно, за изход към PS2 Browser Стойност в минути, 0 за деактивиране Автоматично спиране на HDD след Видео режим @@ -169,8 +169,8 @@ Game ID режим 6 режим 7 режим 8 -Настройки на GSM - избор на видеорежим в игра -Скорост на мрежата и настройки за дуплекс +GSM видеорежим +Скорост на мрежата и режим 100 Mbit пълен дуплекс 100 Mbit полу-дуплекс 10 Mbit пълен дуплекс @@ -184,8 +184,8 @@ PS2 ще е задължен да го използва Хоризонтално отместване Регулиране по вертикала Вертикалното отместване -Overscan -Overscan Adjustment +Компенсация на изрязаната област +Регулиране областта извън видимата част на екрана Пропускане на FMV Прескача видеоклиповете (съвместимост) Cheat настройки @@ -208,49 +208,52 @@ Cheats по избор Потребителски настройки Сваляне по подразбиране Авт.старт след %i -Автостарт +След Стойност в секунди, 0 за деактивиране. -PS2 Logo -Активно само при валидно лого на диска, съвпадащо с региона на конзолата. -Configure PADEMU -Pad Emulator Settings -Enable PadEmulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode -Select Pad Emulator mode. +PS2 Лого +Показва се ако е валидно и съвпада с региона на конзолата +Настройки на PADEMU +Емулатор за контролер - настройки +Включване на PADEMU +Включва/изключва PADEMU за избраната игра +Режим на емулация +Избор на свързно устройство. DualShock3/4 USB DualShock3/4 BT -Settings for port: -Select Pad Emulator port for settings. -Enable emulation -Turns on/off Pad Emulator for selected port. -Enable vibration -Turns on/off vibration for Pad Emulator selected port. -USB Bluetooth adapter MAC address: -DS Controller paired to MAC address: -Pair -Pair DS controller -Pair DS controller with Bluetooth adapter MAC address. -Not connected -Bluetooth adapter information -Shows more information and supported features -HCI Version: -LMP Version: -Manufacturer ID: -Support features: -Yes -No -Bluetooth adapter should be fully compatible with DS3/DS4 controllers. -Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation -Turns on/off Multitap emulation for selected game. -Multitap emulator on port -Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. +Настройки на порта: +Избор на порта, за който да се зададат настройки. +Активиране на емулацията +Включва/изключва емулациятя за този порт. +Активиране на вибрация +Включва/изключва вибрация за този емулиран порт. +USB BlueTooth MAC адрес: +DS контролер MAC адрес: +Свързване +Свързване на DS контролера +Свързване DS контролера към BlueTooth адаптера по MAC адрес +Не е свързан +Информация за BlueTooth адаптера +Показва допълнителни данни и поддържани функции +HCI версия: +LMP версия: +Идентификатор на производителя: +Функции: +да +не +Свързаният BlueTooth адаптер би трябвало да е напълно съвместим с DS3/DS4 контролери. +Свързаният BlueTooth адаптер може да не работи правилно с DS3/DS4 контролери. +Eмулиране на Multitap +Включва/изключва емулацията на Multitap за избраната игра. +Емулация на Multitap за порт +Избор на порт, на който да се емулира Multitap. +Деактивиране на корекция при фалшиви DS3 +Неоригинални DS3 контролери се нуждаят от тази корекция. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_English.lng b/lng/lang_English.lng index f7cdf5bd5..587d2be1a 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -208,7 +208,7 @@ FMV Skip Skips Full Motion Videos Cheat Settings Enable PS2RD Cheat Engine -Let PS2RD Cheat Engine patch your games +Let PS2RD Cheat Engine patch your game PS2RD Cheat Engine Mode Auto-select or Select game cheats Auto-select cheats diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 8f72bd494..a46a4c9da 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 6/5/2018 +# Updated for OPL_1052_DB-TA [837ff55] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -253,4 +253,7 @@ PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! VCD fájl '%s' nem található! A fájl átnevezésénél hiba történt. -A fájl törlésénél hiba történt. \ No newline at end of file +A fájl törlésénél hiba történt. +Soha ne vásárold meg az OPEN-PS2-LOADER (OPL)-t, ehelyett szerezd meg itt: +ifcaro OPL verzió a psx-scene.com oldalon +OPL Daily Builds (DB) verzió a ps2-home.com oldalon \ No newline at end of file diff --git a/src/lang.c b/src/lang.c index 0df942e4f..a3f7bef8a 100644 --- a/src/lang.c +++ b/src/lang.c @@ -203,7 +203,7 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Skips Full Motion Videos", "Cheat Settings", "Enable PS2RD Cheat Engine", - "Lets PS2RD Cheat Engine patch your games", + "Lets PS2RD Cheat Engine patch your game", "PS2RD Cheat Engine Mode", "Auto-select or Select game cheats", "Auto-select cheats", From a50e15064aab701a1f469132b7ce1877688a5f33 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 6 Jun 2018 10:07:59 -0700 Subject: [PATCH 099/269] update LANG files --- lng/lang_Indonesian.lng | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index e1b6de9e8..d247b8106 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 6/6/2018 +# Updated for OPL_1052_DB-TA [837ff55] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -253,4 +253,7 @@ PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! berkas VCD'%s' tak ada! Terjadi kesalahan mengubah nama berkas. -Terjadi kesalahan menghapus berkas. \ No newline at end of file +Terjadi kesalahan menghapus berkas. +Jangan pernah membeli OPEN-PS2-LOADER (OPL), dapatkan secara gratis : +versi OPL ifcaro pada psx-scene.com +Versi OPL Daily Builds (DB) di ps2-home.com \ No newline at end of file From 23b767f781fbeb348eec3053dd6028a74c7b60db Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 7 Jun 2018 19:40:40 -0700 Subject: [PATCH 100/269] update LANG files --- lng/lang_Greek.lng | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 85240ba86..074a1ea05 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 6/7/2018 +# Updated for OPL_1052_DB-TA [837ff55] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -253,4 +253,7 @@ Multitap emulator στη θύρα Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! Το αρχείο VCD '%s' δε βρέθηκε! Παρουσιάστηκε σφάλμα κατά τη μετονομασία του αρχείου. -Παρουσιάστηκε σφάλμα κατά τη διαγραφή του αρχείου. \ No newline at end of file +Παρουσιάστηκε σφάλμα κατά τη διαγραφή του αρχείου. +Ποτέ μην αγοράζετε το OPEN-PS2-LOADER (OPL), αντί αυτού αποκτήστε το δωρεάν: +Έκδοση OPL του ifcaro στο psx-scene.com +Έκδοση OPL Daily Builds (DB) στο ps2-home.com \ No newline at end of file From 7235be943c0a7d87495dc73f3c1790c9806b99d8 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 12 Jun 2018 01:57:12 -0700 Subject: [PATCH 101/269] SP193 did the following changes #99 : * (USB) Improved I/O performance for USB transfers by lifting restrictions on transfer length and allowing the USB callback to continue transfers. ** Special thanks to Rick Gaiser for his sample code and guidance. --- modules/iopcore/cdvdman/mass_driver.c | 285 ++++++++++---------------- modules/iopcore/cdvdman/mass_stor.h | 2 - 2 files changed, 113 insertions(+), 174 deletions(-) diff --git a/modules/iopcore/cdvdman/mass_driver.c b/modules/iopcore/cdvdman/mass_driver.c index 7e6d9d286..5bc6580b8 100644 --- a/modules/iopcore/cdvdman/mass_driver.c +++ b/modules/iopcore/cdvdman/mass_driver.c @@ -38,7 +38,6 @@ extern struct cdvdman_settings_usb cdvdman_settings; #define TAG_TEST_UNIT_READY 0 #define TAG_REQUEST_SENSE 3 -#define TAG_INQUIRY 18 #define TAG_READ_CAPACITY 37 #define TAG_READ 40 #define TAG_START_STOP_UNIT 33 @@ -48,7 +47,6 @@ extern struct cdvdman_settings_usb cdvdman_settings; #define USB_BLK_EP_OUT 1 #define USB_XFER_MAX_RETRIES 16 -#define USB_IO_MAX_RETRIES 32 #define DEVICE_DETECTED 0x01 #define DEVICE_CONFIGURED 0x02 @@ -76,19 +74,6 @@ typedef struct _csw_packet unsigned char status; } csw_packet __attribute__((packed)); -typedef struct _inquiry_data -{ - u8 peripheral_device_type; // 00h - Direct access (Floppy), 1Fh none (no FDD connected) - u8 removable_media; // 80h - removeable - u8 iso_ecma_ansi; - u8 response_data_format; - u8 additional_length; - u8 res[3]; - u8 vendor[8]; - u8 product[16]; - u8 revision[4]; -} inquiry_data __attribute__((packed)); - typedef struct _sense_data { u8 error_code; @@ -122,14 +107,37 @@ static int io_sema; typedef struct _usb_callback_data { - int semh; + int sema; int returnCode; int returnSize; } usb_callback_data; +#define USB_BLOCK_SIZE 4096 //Maximum single USB 1.1 transfer length. + +typedef struct _usb_transfer_callback_data { + int sema; + int pipe; + u8 *buffer; + int returnCode; + unsigned int remaining; +} usb_transfer_callback_data; + static mass_dev g_mass_device; static void *gSectorBuffer; +static void usb_callback(int resultCode, int bytes, void *arg); +static int perform_bulk_transfer(usb_transfer_callback_data* data); +static void usb_transfer_callback(int resultCode, int bytes, void *arg); +static int usb_set_configuration(mass_dev* dev, int configNumber); +static int usb_set_interface(mass_dev* dev, int interface, int altSetting); +static int usb_bulk_clear_halt(mass_dev* dev, int endpoint); +static void usb_bulk_reset(mass_dev* dev, int mode); +static int usb_bulk_status(mass_dev* dev, csw_packet* csw, unsigned int tag); +static int usb_bulk_manage_status(mass_dev* dev, unsigned int tag); +static int usb_bulk_command(mass_dev* dev, cbw_packet* packet ); +static int usb_bulk_transfer(mass_dev* dev, int direction, void* buffer, unsigned int transferSize); + +static int mass_stor_warmup(mass_dev *dev); static void mass_stor_release(mass_dev *dev); static void usb_callback(int resultCode, int bytes, void *arg) @@ -138,45 +146,85 @@ static void usb_callback(int resultCode, int bytes, void *arg) data->returnCode = resultCode; data->returnSize = bytes; XPRINTF("USBHDFSD: callback: res %d, bytes %d, arg %p \n", resultCode, bytes, arg); - SignalSema(data->semh); + SignalSema(data->sema); } -static void usb_set_configuration(mass_dev *dev, int configNumber) +static int perform_bulk_transfer(usb_transfer_callback_data* data) +{ + int ret, len; + + len = data->remaining > USB_BLOCK_SIZE ? USB_BLOCK_SIZE : data->remaining; + ret = UsbBulkTransfer( + data->pipe, //bulk pipe epI (Read) or epO (Write) + data->buffer, //data ptr + len, //data length + &usb_transfer_callback, + (void*)data + ); + return ret; +} + +static void usb_transfer_callback(int resultCode, int bytes, void *arg) +{ + int ret; + usb_transfer_callback_data* data = (usb_transfer_callback_data*)arg; + + data->returnCode = resultCode; + if(resultCode == USB_RC_OK) + { //Update transfer progress if successful. + data->remaining -= bytes; + data->buffer += bytes; + } + + if((resultCode == USB_RC_OK) && (data->remaining > 0)) + { //OK to continue. + ret = perform_bulk_transfer(data); + if (ret != USB_RC_OK) + { + data->returnCode = ret; + SignalSema(data->sema); + } + } + else + { + SignalSema(data->sema); + } +} + +static int usb_set_configuration(mass_dev *dev, int configNumber) { int ret; usb_callback_data cb_data; - cb_data.semh = dev->ioSema; + cb_data.sema = dev->ioSema; XPRINTF("USBHDFSD: setting configuration controlEp=%i, confNum=%i \n", dev->controlEp, configNumber); ret = UsbSetDeviceConfiguration(dev->controlEp, configNumber, usb_callback, (void *)&cb_data); if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); + WaitSema(cb_data.sema); ret = cb_data.returnCode; } - if (ret != USB_RC_OK) { - XPRINTF("USBHDFSD: Error - sending set_configuration %d\n", ret); - } + + return ret; } -static void usb_set_interface(mass_dev *dev, int interface, int altSetting) +static int usb_set_interface(mass_dev *dev, int interface, int altSetting) { int ret; usb_callback_data cb_data; - cb_data.semh = dev->ioSema; + cb_data.sema = dev->ioSema; XPRINTF("USBHDFSD: setting interface controlEp=%i, interface=%i altSetting=%i\n", dev->controlEp, interface, altSetting); ret = UsbSetInterface(dev->controlEp, interface, altSetting, usb_callback, (void *)&cb_data); if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); + WaitSema(cb_data.sema); ret = cb_data.returnCode; } - if (ret != USB_RC_OK) { - XPRINTF("USBHDFSD: Error - sending set_interface %d\n", ret); - } + + return ret; } static int usb_bulk_clear_halt(mass_dev *dev, int endpoint) @@ -184,7 +232,7 @@ static int usb_bulk_clear_halt(mass_dev *dev, int endpoint) int ret; usb_callback_data cb_data; - cb_data.semh = dev->ioSema; + cb_data.sema = dev->ioSema; ret = UsbClearEndpointFeature( dev->controlEp, //Config pipe @@ -194,7 +242,7 @@ static int usb_bulk_clear_halt(mass_dev *dev, int endpoint) (void *)&cb_data); if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); + WaitSema(cb_data.sema); ret = cb_data.returnCode; } if (ret != USB_RC_OK) { @@ -209,7 +257,7 @@ static void usb_bulk_reset(mass_dev *dev, int mode) int ret; usb_callback_data cb_data; - cb_data.semh = dev->ioSema; + cb_data.sema = dev->ioSema; //Call Bulk only mass storage reset ret = UsbControlTransfer( @@ -224,7 +272,7 @@ static void usb_bulk_reset(mass_dev *dev, int mode) (void *)&cb_data); if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); + WaitSema(cb_data.sema); ret = cb_data.returnCode; } if (ret == USB_RC_OK) { @@ -248,7 +296,7 @@ static int usb_bulk_status(mass_dev *dev, csw_packet *csw, unsigned int tag) int ret; usb_callback_data cb_data; - cb_data.semh = dev->ioSema; + cb_data.sema = dev->ioSema; csw->signature = CSW_TAG; csw->tag = tag; @@ -263,7 +311,7 @@ static int usb_bulk_status(mass_dev *dev, csw_packet *csw, unsigned int tag) (void *)&cb_data); if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); + WaitSema(cb_data.sema); ret = cb_data.returnCode; #ifdef DEBUG @@ -312,43 +360,6 @@ static int usb_bulk_manage_status(mass_dev *dev, unsigned int tag) return ((ret == USB_RC_OK && csw.signature == CSW_TAG && csw.tag == tag) ? csw.status : -1); } -static int usb_bulk_get_max_lun(mass_dev *dev) -{ - int ret; - usb_callback_data cb_data; - char max_lun; - - cb_data.semh = dev->ioSema; - - //Call Bulk only mass storage reset - ret = UsbControlTransfer( - dev->controlEp, //default pipe - 0xA1, - 0xFE, - 0, - dev->interfaceNumber, //interface number - 1, //length - &max_lun, //data - usb_callback, - (void *)&cb_data); - - if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); - ret = cb_data.returnCode; - } - if (ret == USB_RC_OK) { - ret = max_lun; - } else { - //Devices that do not support multiple LUNs may STALL this command. - usb_bulk_clear_halt(dev, USB_BLK_EP_IN); - usb_bulk_clear_halt(dev, USB_BLK_EP_OUT); - - ret = -ret; - } - - return ret; -} - static int usb_bulk_command(mass_dev *dev, cbw_packet *packet) { int ret; @@ -359,7 +370,7 @@ static int usb_bulk_command(mass_dev *dev, cbw_packet *packet) return -1; } - cb_data.semh = dev->ioSema; + cb_data.sema = dev->ioSema; ret = UsbBulkTransfer( dev->bulkEpO, //bulk output pipe @@ -369,7 +380,7 @@ static int usb_bulk_command(mass_dev *dev, cbw_packet *packet) (void *)&cb_data); if (ret == USB_RC_OK) { - WaitSema(cb_data.semh); + WaitSema(cb_data.sema); ret = cb_data.returnCode; } if (ret != USB_RC_OK) { @@ -383,48 +394,28 @@ static int usb_bulk_command(mass_dev *dev, cbw_packet *packet) static int usb_bulk_transfer(mass_dev *dev, int direction, void *buffer, unsigned int transferSize) { int ret; - unsigned char *buf = (unsigned char *)buffer; - int blockSize = transferSize; - int offset = 0, pipe; - usb_callback_data cb_data; + usb_transfer_callback_data cb_data; - cb_data.semh = dev->ioSema; + cb_data.sema = dev->ioSema; + cb_data.pipe = (direction==USB_BLK_EP_IN) ? dev->bulkEpI : dev->bulkEpO; + cb_data.buffer = buffer; + cb_data.remaining = transferSize; - pipe = (direction == USB_BLK_EP_IN) ? dev->bulkEpI : dev->bulkEpO; - while (transferSize > 0) { - if (transferSize < blockSize) { - blockSize = transferSize; - } - - ret = UsbBulkTransfer( - pipe, //bulk pipe epI(Read) epO(Write) - (buf + offset), //data ptr - blockSize, //data length - usb_callback, - (void *)&cb_data); - if (ret != USB_RC_OK) { - cb_data.returnCode = ret; - break; - } else { - WaitSema(cb_data.semh); - //XPRINTF("USBHDFSD: retCode=%i retSize=%i \n", cb_data.returnCode, cb_data.returnSize); - if (cb_data.returnCode != USB_RC_OK) { - break; - } - offset += cb_data.returnSize; - transferSize -= cb_data.returnSize; - } + ret = perform_bulk_transfer(&cb_data); + if (ret == USB_RC_OK) { + WaitSema(cb_data.sema); + ret = cb_data.returnCode; } - if (cb_data.returnCode != USB_RC_OK) { + if (ret != USB_RC_OK) { XPRINTF("USBHDFSD: Error - bulk data transfer %d. Clearing HALT state.\n", cb_data.returnCode); usb_bulk_clear_halt(dev, direction); } - return cb_data.returnCode; + return ret; } -static inline int cbw_scsi_test_unit_ready(mass_dev *dev) +static int cbw_scsi_test_unit_ready(mass_dev *dev) { int result, retries; static cbw_packet cbw = { @@ -463,7 +454,7 @@ static inline int cbw_scsi_test_unit_ready(mass_dev *dev) return result; } -static inline int cbw_scsi_request_sense(mass_dev *dev, void *buffer, int size) +static int cbw_scsi_request_sense(mass_dev *dev, void *buffer, int size) { int rcode, result, retries; static cbw_packet cbw = { @@ -508,52 +499,7 @@ static inline int cbw_scsi_request_sense(mass_dev *dev, void *buffer, int size) return -EIO; } -static inline int cbw_scsi_inquiry(mass_dev *dev, void *buffer, int size) -{ - int rcode, result, retries; - static cbw_packet cbw = { - CBW_TAG, // cbw.signature - -TAG_INQUIRY, // cbw.tag - 0, // cbw.dataTransferLength - 0x80, // cbw.flags - 0, // cbw.lun - 12, // cbw.comLength - - /* scsi command packet */ - { - 0x12, // inquiry operation code - 0, // lun/reserved - 0, // reserved - 0, // reserved - 0, // inquiry reply length - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - 0, // reserved - }}; - - XPRINTF("USBHDFSD: cbw_scsi_inquiry\n"); - - cbw.dataTransferLength = size; //INQUIRY_REPLY_LENGTH - cbw.comData[4] = size; //inquiry reply length - - for (retries = USB_XFER_MAX_RETRIES; retries > 0; retries--) { - if (usb_bulk_command(dev, &cbw) == USB_RC_OK) { - rcode = usb_bulk_transfer(dev, USB_BLK_EP_IN, buffer, size); - result = usb_bulk_manage_status(dev, -TAG_INQUIRY); - - if (rcode == USB_RC_OK && result == 0) - return 0; - } - } - - return -EIO; -} - -static inline int cbw_scsi_start_stop_unit(mass_dev *dev) +static int cbw_scsi_start_stop_unit(mass_dev *dev) { int result, retries; static cbw_packet cbw = { @@ -592,7 +538,7 @@ static inline int cbw_scsi_start_stop_unit(mass_dev *dev) return result; } -static inline int cbw_scsi_read_capacity(mass_dev *dev, void *buffer, int size) +static int cbw_scsi_read_capacity(mass_dev *dev, void *buffer, int size) { int rcode, result, retries; static cbw_packet cbw = { @@ -860,6 +806,7 @@ int mass_stor_connect(int devId) SemaData.option = 0; SemaData.attr = 0; if ((dev->ioSema = CreateSema(&SemaData)) < 0) { + mass_stor_release(dev); XPRINTF("USBHDFSD: Failed to allocate I/O semaphore.\n"); return -1; } @@ -916,7 +863,6 @@ int mass_stor_disconnect(int devId) static int mass_stor_warmup(mass_dev *dev) { - inquiry_data id; sense_data sd; read_capacity_data rcd; int stat, OldState; @@ -928,19 +874,6 @@ static int mass_stor_warmup(mass_dev *dev) return -1; } - stat = usb_bulk_get_max_lun(dev); - XPRINTF("USBHDFSD: usb_bulk_get_max_lun %d\n", stat); - - mips_memset(&id, 0, sizeof(inquiry_data)); - if ((stat = cbw_scsi_inquiry(dev, &id, sizeof(inquiry_data))) < 0) { - XPRINTF("USBHDFSD: Error - cbw_scsi_inquiry %d\n", stat); - return -1; - } - - XPRINTF("USBHDFSD: Vendor: %.8s\n", id.vendor); - XPRINTF("USBHDFSD: Product: %.16s\n", id.product); - XPRINTF("USBHDFSD: Revision: %.4s\n", id.revision); - while ((stat = cbw_scsi_test_unit_ready(dev)) != 0) { XPRINTF("USBHDFSD: Error - cbw_scsi_test_unit_ready %d\n", stat); @@ -988,8 +921,18 @@ int mass_stor_configureDevice(void) mass_dev *dev = &g_mass_device; if (dev->devId != -1 && (dev->status & DEVICE_DETECTED) && !(dev->status & DEVICE_CONFIGURED)) { int ret; - usb_set_configuration(dev, dev->configId); - usb_set_interface(dev, dev->interfaceNumber, dev->interfaceAlt); + if ((ret = usb_set_configuration(dev, dev->configId)) != USB_RC_OK) { + XPRINTF("USBHDFSD: Error - sending set_configuration %d\n", ret); + mass_stor_release(dev); + return -1; + } + + if ((ret = usb_set_interface(dev, dev->interfaceNumber, dev->interfaceAlt)) != USB_RC_OK) { + XPRINTF("USBHDFSD: Error - sending set_interface %d\n", ret); + mass_stor_release(dev); + return -1; + } + dev->status |= DEVICE_CONFIGURED; ret = mass_stor_warmup(dev); @@ -1067,8 +1010,6 @@ int mass_stor_ReadCD(unsigned int lsn, unsigned int nsectors, void *buf, int par while (nsectors > 0) { sectors = nsectors; - if (sectors > MAX_USB_SECTORS) - sectors = MAX_USB_SECTORS; nbytes = sectors * 2048; DiskSectorsToRead = nbytes / g_mass_device.sectorSize; diff --git a/modules/iopcore/cdvdman/mass_stor.h b/modules/iopcore/cdvdman/mass_stor.h index fa4b3b450..f2d63596e 100644 --- a/modules/iopcore/cdvdman/mass_stor.h +++ b/modules/iopcore/cdvdman/mass_stor.h @@ -27,6 +27,4 @@ void mass_stor_writeSector(unsigned int lba, unsigned short int nsectors, const int mass_stor_configureDevice(void); int mass_stor_ReadCD(unsigned int lsn, unsigned int nsectors, void *buf, int part_num); -#define MAX_USB_SECTORS 2 - #endif From 03304e0e57536053ead1d1f9d251f4d3e5e14ac0 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 21 Jun 2018 18:55:06 -0700 Subject: [PATCH 102/269] SP193 did the following changes: (SMSTCPIP) Disabled ETHARP_ALWAYS_INSERT because the ARP table may be small. --- modules/network/SMSTCPIP/include/lwipopts.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/network/SMSTCPIP/include/lwipopts.h b/modules/network/SMSTCPIP/include/lwipopts.h index fc2862532..c2cdee46d 100644 --- a/modules/network/SMSTCPIP/include/lwipopts.h +++ b/modules/network/SMSTCPIP/include/lwipopts.h @@ -193,6 +193,15 @@ a lot of data that needs to be copied, this should be set high. */ #endif #define ARP_QUEUEING 1 +/** + * If defined to 1, cache entries are updated or added for every kind of ARP traffic + * or broadcast IP traffic. Recommended for routers. + * If defined to 0, only existing cache entries are updated. Entries are added when + * lwIP is sending to them. Recommended for embedded devices. + */ +//Do not always insert ARP entries, as the ARP table is small. +#define ETHARP_ALWAYS_INSERT 0 + /* ---------- IP options ---------- */ /* Define IP_FORWARD to 1 if you wish to have the ability to forward IP packets across network interfaces. If you are going to run lwIP From 2c2dce5fdc5f0d26949b9429b195355225ca402d Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 25 Jun 2018 11:02:15 -0700 Subject: [PATCH 103/269] SP193 did the following changes: (SMSTCPIP) Fixed timeout callback to always never repeat (and other timer fixes) --- modules/network/SMSTCPIP/ps2ip.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/network/SMSTCPIP/ps2ip.c b/modules/network/SMSTCPIP/ps2ip.c index 0b645014e..8fa801aeb 100644 --- a/modules/network/SMSTCPIP/ps2ip.c +++ b/modules/network/SMSTCPIP/ps2ip.c @@ -544,21 +544,29 @@ sys_sem_t sys_sem_new(u8_t aCount) } /* end sys_sem_new */ +static unsigned int TimeoutHandler(void* pvArg) +{ + iReleaseWaitThread((int)pvArg); + return 0; +} + u32_t sys_arch_sem_wait(sys_sem_t aSema, u32_t aTimeout) { - if (!aTimeout) - return WaitSema(aSema); + if (aTimeout == 0) + return(WaitSema(aSema) == 0 ? 0 : SYS_ARCH_TIMEOUT); + else if (aTimeout == 1) + return(PollSema(aSema) == 0 ? 0 : SYS_ARCH_TIMEOUT); else { iop_sys_clock_t lTimeout; int lTID = GetThreadId(); USec2SysClock(aTimeout * 1024, &lTimeout); - SetAlarm(&lTimeout, (unsigned (*)(void *))iReleaseWaitThread, (void *)lTID); + SetAlarm(&lTimeout, &TimeoutHandler, (void *)lTID); if (!WaitSema(aSema)) { - CancelAlarm((unsigned (*)(void *))iReleaseWaitThread, (void *)lTID); + CancelAlarm(&TimeoutHandler, (void *)lTID); --aTimeout; } else aTimeout = SYS_ARCH_TIMEOUT; From 7be92c899b77c6c953c9d957a17581e109d65aeb Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 30 Jun 2018 17:51:50 -0700 Subject: [PATCH 104/269] RickGaiser made the following changes: -- Cleanups and Fixes #103 There are two fixes in this pr: - Fix text wrapping for HD modes. - Fix speed regression in smap-ingame driver (noticable stuttering in for instance DBZ BT3 is now gone) Additions: - Add HIRES to version string (as requested) - Add my name to list of coders The rest is a lot of code cleanups, making development of opl simpler. Totalling to a very nice 255 additions and 822 deletions. The most notable cleanup is the removal of udptty, that is now part of ps2sdk. So make sure you update ps2sdk before compiling opl. --- Makefile | 10 +- ee_core/Makefile | 9 +- include/extern_irx.h | 161 +++++++++++++++ modules/debug/udptty/Makefile | 22 --- modules/debug/udptty/exports.tab | 9 - modules/debug/udptty/imports.lst | 57 ------ modules/debug/udptty/intrman_add.h | 7 - modules/debug/udptty/irx_imports.h | 32 --- modules/debug/udptty/udptty.c | 275 -------------------------- modules/iopcore/cdvdman/Makefile | 66 ++----- modules/iopcore/cdvdman/cdvdman.c | 18 +- modules/iopcore/cdvdman/device-hdd.c | 16 -- modules/iopcore/cdvdman/device-smb.c | 7 +- modules/iopcore/cdvdman/device-usb.c | 9 - modules/iopcore/cdvdman/exports.tab | 64 +----- modules/iopcore/cdvdman/ioplib_util.c | 30 +-- modules/mcemu/Makefile | 33 ++-- modules/network/smap-ingame/xfer.c | 2 +- modules/pademu/Makefile | 12 +- src/debug.c | 27 +-- src/dialogs.c | 8 +- src/ethsupport.c | 33 +--- src/fntsys.c | 1 + src/gui.c | 15 +- src/hddsupport.c | 27 +-- src/opl.c | 10 +- src/system.c | 101 +--------- src/usbsupport.c | 18 +- 28 files changed, 254 insertions(+), 825 deletions(-) create mode 100644 include/extern_irx.h delete mode 100755 modules/debug/udptty/Makefile delete mode 100755 modules/debug/udptty/exports.tab delete mode 100755 modules/debug/udptty/imports.lst delete mode 100755 modules/debug/udptty/intrman_add.h delete mode 100755 modules/debug/udptty/irx_imports.h delete mode 100644 modules/debug/udptty/udptty.c diff --git a/Makefile b/Makefile index de09f1c86..2b767cb71 100755 --- a/Makefile +++ b/Makefile @@ -204,7 +204,7 @@ ifeq ($(DEBUG),1) else ifeq ($(INGAME_DEBUG),1) EE_CFLAGS += -D__INGAME_DEBUG EECORE_EXTRA_FLAGS = LOAD_DEBUG_MODULES=1 - CDVDMAN_DEBUG_FLAGS = USE_DEV9=1 + CDVDMAN_DEBUG_FLAGS = IOPCORE_DEBUG=1 SMSTCPIP_INGAME_CFLAGS = ifeq ($(DECI2_DEBUG),1) EE_CFLAGS += -D__DECI2_DEBUG @@ -310,8 +310,6 @@ clean: $(MAKE) -C modules/vmc/genvmc clean echo " -hdldsvr" $(MAKE) -C modules/hdd/hdldsvr clean - echo " -udptty" - $(MAKE) -C modules/debug/udptty clean echo " -udptty-ingame" $(MAKE) -C modules/debug/udptty-ingame clean echo " -ioptrap" @@ -597,11 +595,7 @@ modules/hdd/hdldsvr/hdldsvr.irx: modules/hdd/hdldsvr $(EE_ASM_DIR)hdldsvr.s: modules/hdd/hdldsvr/hdldsvr.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ hdldsvr_irx -modules/debug/udptty/udptty.irx: modules/debug/udptty - echo " -udptty" - $(MAKE) -C $< - -$(EE_ASM_DIR)udptty.s: modules/debug/udptty/udptty.irx | $(EE_ASM_DIR) +$(EE_ASM_DIR)udptty.s: $(PS2SDK)/iop/irx/udptty.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ udptty_irx modules/debug/udptty-ingame/udptty.irx: modules/debug/udptty-ingame diff --git a/ee_core/Makefile b/ee_core/Makefile index a5fbd4126..cb9c6b5b8 100755 --- a/ee_core/Makefile +++ b/ee_core/Makefile @@ -24,7 +24,7 @@ MAPFILE = ee_core.map EE_INCS := -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -Iinclude -I. EE_CFLAGS = -D_EE -Os -G0 -Wall $(EE_INCS) -ifeq ($(EESIO_DEBUG),1) +ifeq ($(EESIO_DEBUG),1) EE_CFLAGS += -D__EESIO_DEBUG endif @@ -72,10 +72,6 @@ ifeq ($(PADEMU),1) EE_CFLAGS += -DPADEMU endif -ifeq ($(EESIO_DEBUG),1) -EE_LIBS += -lc -endif - EE_LIBS += -lkernel-nopatch $(EE_OBJS_DIR)%.o : $(EE_SRC_DIR)%.c @@ -93,8 +89,7 @@ $(EE_OBJS_DIR)%.o : $(EE_SRC_DIR)%.s $(EE_BIN) : $(EE_OBJS) $(EE_CC) $(EE_CFLAGS) $(EE_LDFLAGS) -o $(EE_BIN) $(EE_OBJS) $(EE_LIBS) -all: - $(EE_BIN) +all: $(EE_BIN) clean: rm -f -r $(EE_OBJS_DIR) $(EE_BIN) $(MAPFILE) diff --git a/include/extern_irx.h b/include/extern_irx.h new file mode 100644 index 000000000..9106ea992 --- /dev/null +++ b/include/extern_irx.h @@ -0,0 +1,161 @@ +#ifndef EXTERN_IRX_H +#define EXTERN_IRX_H + + +// Try to keep this list alphabetical + +extern void *bt_pademu_irx; +extern int size_bt_pademu_irx; + +extern void *cdvdfsv_irx; +extern int size_cdvdfsv_irx; + +extern void *drvtif_irx; +extern int size_drvtif_irx; + +extern void *ds34bt_irx; +extern int size_ds34bt_irx; + +extern void *ds34usb_irx; +extern int size_ds34usb_irx; + +extern void *filexio_irx; +extern int size_filexio_irx; + +extern void *genvmc_irx; +extern int size_genvmc_irx; + +extern void *hdd_cdvdman_irx; +extern int size_hdd_cdvdman_irx; + +extern void *hdd_hdpro_cdvdman_irx; +extern int size_hdd_hdpro_cdvdman_irx; + +extern void *hdldsvr_irx; +extern int size_hdldsvr_irx; + +extern void *hdd_mcemu_irx; +extern int size_hdd_mcemu_irx; + +extern void *hdpro_atad_irx; +extern int size_hdpro_atad_irx; + +extern void *httpclient_irx; +extern int size_httpclient_irx; + +extern void *imgdrv_irx; +extern int size_imgdrv_irx; + +extern void *ingame_smstcpip_irx; +extern int size_ingame_smstcpip_irx; + +extern void *iomanx_irx; +extern int size_iomanx_irx; + +extern void *ioptrap_irx; +extern int size_ioptrap_irx; + +extern void *isofs_irx; +extern int size_isofs_irx; + +extern void *mcman_irx; +extern int size_mcman_irx; + +extern void *mcserv_irx; +extern int size_mcserv_irx; + +extern void *nbns_irx; +extern int size_nbns_irx; + +extern void *netman_irx; +extern int size_netman_irx; + +extern void *padman_irx; +extern int size_padman_irx; + +extern void *poweroff_irx; +extern int size_poweroff_irx; + +extern void *ps2atad_irx; +extern int size_ps2atad_irx; + +extern void *ps2dev9_irx; +extern int size_ps2dev9_irx; + +extern void *ps2fs_irx; +extern int size_ps2fs_irx; + +extern void *ps2hdd_irx; +extern int size_ps2hdd_irx; + +extern void *ps2ips_irx; +extern int size_ps2ips_irx; + +extern void *ps2ip_irx; +extern int size_ps2ip_irx; + +extern void *ps2link_irx; +extern int size_ps2link_irx; + +extern void *pusbd_irx; +extern int size_pusbd_irx; + +extern void *sio2man_irx; +extern int size_sio2man_irx; + +extern void *smap_irx; +extern int size_smap_irx; + +extern void *smap_ingame_irx; +extern int size_smap_ingame_irx; + +extern void *smb_mcemu_irx; +extern int size_smb_mcemu_irx; + +extern void *smb_cdvdman_irx; +extern int size_smb_cdvdman_irx; + +extern void *smbinit_irx; +extern int size_smbinit_irx; + +extern void *smbman_irx; +extern int size_smbman_irx; + +extern void *smsutils_irx; +extern int size_smsutils_irx; + +extern void *tifinet_irx; +extern int size_tifinet_irx; + +extern void *udptty_irx; +extern int size_udptty_irx; + +extern void *udptty_ingame_irx; +extern int size_udptty_ingame_irx; + +extern void *udnl_irx; +extern int size_udnl_irx; + +extern void *usbd_irx; +extern int size_usbd_irx; + +extern void *usb_cdvdman_irx; +extern int size_usb_cdvdman_irx; + +extern void *usbhdfsd_irx; +extern int size_usbhdfsd_irx; + +extern void *usbhdfsdfsv_irx; +extern int size_usbhdfsdfsv_irx; + +extern void *usb_mcemu_irx; +extern int size_usb_mcemu_irx; + +extern void *usb_pademu_irx; +extern int size_usb_pademu_irx; + +extern void *xhdd_irx; +extern int size_xhdd_irx; + + +#endif diff --git a/modules/debug/udptty/Makefile b/modules/debug/udptty/Makefile deleted file mode 100755 index e80ac82f7..000000000 --- a/modules/debug/udptty/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -IOP_BIN = udptty.irx - -IOP_INCS += -IOP_CFLAGS += -Wall -fno-builtin-printf -DKPRTTY -IOP_LDFLAGS += -s - -IOP_OBJS = udptty.o imports.o exports.o -IOP_LIBS = - -all: $(IOP_BIN) - -clean: - rm -f $(IOP_BIN) $(IOP_OBJS) - -rebuild: clean all - -run: - ps2client -t 1 execiop host:$(IOP_BIN) - - -include $(PS2SDK)/Defs.make -include ../../Rules.make diff --git a/modules/debug/udptty/exports.tab b/modules/debug/udptty/exports.tab deleted file mode 100755 index 4f3033683..000000000 --- a/modules/debug/udptty/exports.tab +++ /dev/null @@ -1,9 +0,0 @@ -void _retonly(void) {} - -DECLARE_EXPORT_TABLE(udptty, 1, 1) - DECLARE_EXPORT(_start) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(_shutdown) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(_retonly) -END_EXPORT_TABLE diff --git a/modules/debug/udptty/imports.lst b/modules/debug/udptty/imports.lst deleted file mode 100755 index 307a66b25..000000000 --- a/modules/debug/udptty/imports.lst +++ /dev/null @@ -1,57 +0,0 @@ - -thsemap_IMPORTS_start -I_CreateSema -I_DeleteSema -I_SignalSema -I_WaitSema -thsemap_IMPORTS_end - -thbase_IMPORTS_start -I_CreateThread -I_StartThread -thbase_IMPORTS_end - -thevent_IMPORTS_start -I_CreateEventFlag -I_WaitEventFlag -I_SetEventFlag -I_iSetEventFlag -thevent_IMPORTS_end - -ioman_IMPORTS_start -I_open -I_write -I_close -I_AddDrv -I_DelDrv -ioman_IMPORTS_end - -stdio_IMPORTS_start -I_printf -stdio_IMPORTS_end - -sysclib_IMPORTS_start -I_prnt -I_strncmp -sysclib_IMPORTS_end - -sysmem_IMPORTS_start -I_KprintfSet -sysmem_IMPORTS_end - -ps2ip_IMPORTS_start -I_inet_addr -I_lwip_socket -I_lwip_close -I_lwip_sendto -ps2ip_IMPORTS_end - -loadcore_IMPORTS_start -I_RegisterLibraryEntries -loadcore_IMPORTS_end - -intrman_IMPORTS_start -I_QueryIntrContext -I_intrman_14 -intrman_IMPORTS_end - diff --git a/modules/debug/udptty/intrman_add.h b/modules/debug/udptty/intrman_add.h deleted file mode 100755 index 5f0e14429..000000000 --- a/modules/debug/udptty/intrman_add.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _INTRMAN_ADD_H_ -#define _INTRMAN_ADD_H_ - -void *intrman_14(void *func, void *arg1, void *arg2, void *arg3); -#define I_intrman_14 DECLARE_IMPORT(14, intrman_14) - -#endif diff --git a/modules/debug/udptty/irx_imports.h b/modules/debug/udptty/irx_imports.h deleted file mode 100755 index 0e2bc504c..000000000 --- a/modules/debug/udptty/irx_imports.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: irx_imports.h 629 2004-10-11 00:45:00Z mrbrown $ -# Defines all IRX imports. -*/ - -#ifndef IOP_IRX_IMPORTS_H -#define IOP_IRX_IMPORTS_H - -#include "irx.h" - -/* Please keep these in alphabetical order! */ -#include "ioman.h" -#include "intrman.h" -#include "intrman_add.h" -#include "loadcore.h" -#include "ps2ip.h" -#include "stdio.h" -#include "sysclib.h" -#include "sysmem.h" -#include "thbase.h" -#include "thevent.h" -#include "thsemap.h" - -#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/debug/udptty/udptty.c b/modules/debug/udptty/udptty.c deleted file mode 100644 index 656adf5e3..000000000 --- a/modules/debug/udptty/udptty.c +++ /dev/null @@ -1,275 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2003 Marcus R. Brown -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# -# $Id: tty.c 629 2004-10-11 00:45:00Z mrbrown $ -# TTY filesystem for UDPTTY. - - modified by jimmikaelkael - -*/ - -#include -#include -#include -#include -#include -#include -#include "intrman_add.h" -#include -#include -#include -#include -#include -#include - -#define MODNAME "udptty" -IRX_ID(MODNAME, 2, 1); - -struct irx_export_table _exp_udptty; - -#define DEVNAME "tty" - -static int udp_socket; -static int tty_sema = -1; - -static int tty_init(iop_device_t *device); -static int tty_deinit(iop_device_t *device); -static int tty_stdout_fd(void); -static int tty_write(iop_file_t *file, void *buf, size_t size); -static int tty_error(void); - -/* device ops */ -static iop_device_ops_t tty_ops = { - tty_init, - tty_deinit, - (void *)tty_error, - (void *)tty_stdout_fd, - (void *)tty_stdout_fd, - (void *)tty_error, - (void *)tty_write, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error, - (void *)tty_error}; - -/* device descriptor */ -static iop_device_t tty_device = { - DEVNAME, - IOP_DT_CHAR | IOP_DT_CONS, - 1, - "TTY via SMAP UDP", - &tty_ops}; - - -/* KPRTTY */ -#ifdef KPRTTY -#define PRNT_IO_BEGIN 0x200 -#define PRNT_IO_END 0x201 - -typedef struct _KprArg -{ - int eflag; - int bsize; - char *kpbuf; - int prpos; - int calls; -} KprArg; - -KprArg g_kprarg; - -#define KPR_BUFFER_SIZE 0x1000 -char kprbuffer[KPR_BUFFER_SIZE]; - - -void PrntFunc(void *common, int chr) -{ - KprArg *kpa = (KprArg *)common; - - switch (chr) { - case 0: - break; - case PRNT_IO_BEGIN: - kpa->calls++; - break; - case PRNT_IO_END: - break; - case '\n': - PrntFunc(common, '\r'); - default: - if (kpa->prpos < kpa->bsize) - kpa->kpbuf[kpa->prpos++] = chr; - break; - } -} - -void *Kprnt(void *common, const char *format, void *arg) -{ - if (format) - prnt((print_callback_t)PrntFunc, common, format, arg); - - return 0; -} - -void *Kprintf_Handler(void *common, const char *format, void *arg) -{ - KprArg *kpa = (KprArg *)common; - void *res; - - res = intrman_14(Kprnt, kpa, (void *)format, arg); - - if (QueryIntrContext()) - iSetEventFlag(kpa->eflag, 1); - else - SetEventFlag(kpa->eflag, 1); - - return res; -} - -void KPRTTY_Thread(void *args) -{ - u32 flags; - KprArg *kpa = (KprArg *)args; - - while (1) { - WaitEventFlag(kpa->eflag, 1, WEF_AND | WEF_CLEAR, &flags); - - if (kpa->prpos) { - if (strncmp(kpa->kpbuf, "WARNING: WaitSema KE_CAN_NOT_WAIT", kpa->prpos - 2)) - write(1, kpa->kpbuf, kpa->prpos); - kpa->prpos = 0; - } - } -} - -void kprtty_init(void) -{ - iop_event_t efp; - iop_thread_t thp; - KprArg *kpa; - int thid; - - kpa = &g_kprarg; - - efp.attr = EA_SINGLE; - efp.option = 0; - efp.bits = 0; - - thp.attr = TH_C; - thp.option = 0; - thp.thread = (void *)KPRTTY_Thread; - thp.stacksize = 0x800; - thp.priority = 8; - - kpa->eflag = CreateEventFlag(&efp); - kpa->bsize = KPR_BUFFER_SIZE; - kpa->kpbuf = kprbuffer; - kpa->prpos = 0; - kpa->calls = 0; - - thid = CreateThread(&thp); - StartThread(thid, (void *)kpa); - - KprintfSet((KprintfHandler_t *)Kprintf_Handler, (u32 *)kpa); -} -#endif - -int _start(int argc, char **argv) -{ - // register exports - RegisterLibraryEntries(&_exp_udptty); - - // create the socket - udp_socket = lwip_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (udp_socket < 0) - return MODULE_NO_RESIDENT_END; - - close(0); - close(1); - DelDrv(DEVNAME); - - if (AddDrv(&tty_device) < 0) - return MODULE_NO_RESIDENT_END; - - open(DEVNAME "00:", 0x1000 | O_RDWR); - open(DEVNAME "00:", O_WRONLY); - - printf("UDPTTY loaded!\n"); - -#ifdef KPRTTY - kprtty_init(); - printf("KPRTTY enabled!\n"); -#endif - - return MODULE_RESIDENT_END; -} - -int _shutdown() -{ - lwip_close(udp_socket); - - return 0; -} - -/* Copy the data into place, calculate the various checksums, and send the - final packet. */ -static int udp_send(void *buf, size_t size) -{ - struct sockaddr_in peer; - - peer.sin_family = AF_INET; - peer.sin_port = htons(18194); - peer.sin_addr.s_addr = inet_addr("255.255.255.255"); - - lwip_sendto(udp_socket, buf, size, 0, (struct sockaddr *)&peer, sizeof(peer)); - - return 0; -} - -/* TTY driver. */ - -static int tty_init(iop_device_t *device) -{ - if ((tty_sema = CreateMutex(IOP_MUTEX_UNLOCKED)) < 0) - return -1; - - return 0; -} - -static int tty_deinit(iop_device_t *device) -{ - DeleteSema(tty_sema); - return 0; -} - -static int tty_stdout_fd(void) -{ - return 1; -} - -static int tty_write(iop_file_t *file, void *buf, size_t size) -{ - int res = 0; - - WaitSema(tty_sema); - res = udp_send(buf, size); - SignalSema(tty_sema); - - return res; -} - -static int tty_error(void) -{ - return -EIO; -} diff --git a/modules/iopcore/cdvdman/Makefile b/modules/iopcore/cdvdman/Makefile index d337ef4da..d691d6887 100644 --- a/modules/iopcore/cdvdman/Makefile +++ b/modules/iopcore/cdvdman/Makefile @@ -12,80 +12,53 @@ IOP_OBJS = cdvdman.o streaming.o ioplib_util.o smsutils.o imports.o exports.o ifeq ($(USE_HDD),1) IOP_BIN = hdd_cdvdman.irx -IOP_OBJNAME = hdd. +IOP_OBJNAME = obj.hdd/ IOP_OBJS += device-hdd.o dev9.o atad.o +IOP_CFLAGS += -DHDD_DRIVER +IOP_CFLAGS += -D__USE_DEV9 endif ifeq ($(USE_HDPRO),1) IOP_BIN = hdd_hdpro_cdvdman.irx -IOP_OBJNAME = hdpro. +IOP_OBJNAME = obj.hdpro/ IOP_OBJS += device-hdd.o hdpro_atad.o +IOP_CFLAGS += -DHDD_DRIVER -DHD_PRO +ifeq ($(IOPCORE_DEBUG),1) +IOP_OBJS += dev9.o +IOP_CFLAGS += -D__USE_DEV9 +endif endif ifeq ($(USE_SMB),1) IOP_BIN = smb_cdvdman.irx -IOP_OBJNAME = smb. +IOP_OBJNAME = obj.smb/ IOP_OBJS += device-smb.o dev9.o smb.o +IOP_CFLAGS += -DSMB_DRIVER +IOP_CFLAGS += -D__USE_DEV9 +IOP_INCS += -I../../network/common endif ifeq ($(USE_USB),1) IOP_BIN = usb_cdvdman.irx -IOP_OBJNAME = usb. +IOP_OBJNAME = obj.usb/ IOP_OBJS += device-usb.o mass_driver.o -ifeq ($(USE_DEV9),1) -IOP_OBJS += dev9.o -else +IOP_CFLAGS += -DUSB_DRIVER ifeq ($(IOPCORE_DEBUG),1) IOP_OBJS += dev9.o -endif +IOP_CFLAGS += -D__USE_DEV9 endif endif IOP_LIBS = -IOP_INCS = -I../common - -ifeq ($(USE_SMB),1) -IOP_INCS += -I../../network/common -endif +IOP_INCS += -I../common IOP_CFLAGS += -Wall -fno-builtin-printf -ifeq ($(USE_HDD),1) -IOP_CFLAGS += -DHDD_DRIVER -endif - -ifeq ($(USE_HDPRO),1) -IOP_CFLAGS += -DHDD_DRIVER -DHD_PRO -endif - -ifeq ($(USE_SMB),1) -IOP_CFLAGS += -DSMB_DRIVER -endif - -ifeq ($(USE_USB),1) -IOP_CFLAGS += -DUSB_DRIVER -endif - ifeq ($(IOPCORE_DEBUG),1) IOP_CFLAGS += -D__IOPCORE_DEBUG endif -ifeq ($(USE_HDPRO),1) -ifeq ($(IOPCORE_DEBUG),1) -IOP_OBJS += dev9.o -endif -endif -ifeq ($(USE_USB),1) -ifeq ($(USE_DEV9),1) -IOP_CFLAGS += -D__USE_DEV9 -else -ifeq ($(IOPCORE_DEBUG),1) -IOP_CFLAGS += -D__USE_DEV9 -endif -endif -endif - ifeq ($(VMC),1) IOP_CFLAGS += -DVMC_DRIVER endif @@ -94,12 +67,15 @@ IOP_OBJS := $(IOP_OBJS:%=$(IOP_OBJNAME)%) IOP_LDFLAGS += -s -all: $(IOP_BIN) +all: OBJ_DIR $(IOP_BIN) clean: rm -f $(IOP_BIN) $(IOP_OBJS) cdvdman.map rebuild: clean all +OBJ_DIR: + mkdir -p $(IOP_OBJNAME) + include $(PS2SDK)/Defs.make include Rules.make diff --git a/modules/iopcore/cdvdman/cdvdman.c b/modules/iopcore/cdvdman/cdvdman.c index 0b62771c0..603d3edba 100644 --- a/modules/iopcore/cdvdman/cdvdman.c +++ b/modules/iopcore/cdvdman/cdvdman.c @@ -82,6 +82,9 @@ extern struct irx_export_table _exp_smsutils; #ifdef VMC_DRIVER extern struct irx_export_table _exp_oplutils; #endif +#ifdef __USE_DEV9 +extern struct irx_export_table _exp_dev9; +#endif struct dirTocEntry { @@ -222,7 +225,7 @@ static unsigned char sync_flag; static unsigned char cdvdman_cdinited = 0; static unsigned int ReadPos = 0; /* Current buffer offset in 2048-byte sectors. */ -#if (defined(HDD_DRIVER) && !defined(HD_PRO)) || defined(SMB_DRIVER) +#ifdef __USE_DEV9 static int POFFThreadID; #endif @@ -264,7 +267,7 @@ static void fs_init(void) } //------------------------------------------------------------------------- -#if (defined(HDD_DRIVER) && !defined(HD_PRO)) || defined(SMB_DRIVER) +#ifdef __USE_DEV9 static void cdvdman_poff_thread(void *arg) { int stat; @@ -277,7 +280,7 @@ static void cdvdman_poff_thread(void *arg) static void cdvdman_init(void) { -#if (defined(HDD_DRIVER) && !defined(HD_PRO)) || defined(SMB_DRIVER) +#ifdef __USE_DEV9 iop_thread_t ThreadData; #endif @@ -286,7 +289,7 @@ static void cdvdman_init(void) fs_init(); -#if (defined(HDD_DRIVER) && !defined(HD_PRO)) || defined(SMB_DRIVER) +#ifdef __USE_DEV9 if (cdvdman_settings.common.flags & IOPCORE_ENABLE_POFF) { ThreadData.attr = TH_C; ThreadData.option = 0xABCD0001; @@ -1784,7 +1787,7 @@ static int intrh_cdrom(void *common) iSetEventFlag(cdvdman_stat.intr_ef, 0x14); //Notify FILEIO and CDVDFSV of the power-off event. //Call power-off callback here. OPL doesn't handle one, so do nothing. -#if (defined(HDD_DRIVER) && !defined(HD_PRO)) || defined(SMB_DRIVER) +#ifdef __USE_DEV9 if (cdvdman_settings.common.flags & IOPCORE_ENABLE_POFF) { //If IGR is disabled, switch off the console. iWakeupThread(POFFThreadID); @@ -1815,6 +1818,11 @@ int _start(int argc, char **argv) RegisterLibraryEntries(&_exp_cdvdstm); RegisterLibraryEntries(&_exp_smsutils); +#ifdef __USE_DEV9 + RegisterLibraryEntries(&_exp_dev9); + dev9d_init(); +#endif + DeviceInit(); #ifdef VMC_DRIVER diff --git a/modules/iopcore/cdvdman/device-hdd.c b/modules/iopcore/cdvdman/device-hdd.c index 5d4eda7ce..f25c53a40 100644 --- a/modules/iopcore/cdvdman/device-hdd.c +++ b/modules/iopcore/cdvdman/device-hdd.c @@ -7,7 +7,6 @@ #include "smsutils.h" #include "mass_common.h" #include "mass_stor.h" -#include "dev9.h" #include "atad.h" #include "ioplib_util.h" #include "cdvdman.h" @@ -33,7 +32,6 @@ extern struct cdvdman_settings_hdd cdvdman_settings; -extern struct irx_export_table _exp_dev9; extern struct irx_export_table _exp_atad; char lba_48bit = 0; @@ -63,22 +61,8 @@ static int cdvdman_get_part_specs(u32 lsn) void DeviceInit(void) { -#ifdef HD_PRO -#ifdef __IOPCORE_DEBUG - RegisterLibraryEntries(&_exp_dev9); -#endif -#else - RegisterLibraryEntries(&_exp_dev9); -#endif RegisterLibraryEntries(&_exp_atad); -#ifdef HD_PRO -#ifdef __IOPCORE_DEBUG - dev9d_init(); -#endif -#else - dev9d_init(); -#endif atad_start(); atad_inited = 1; diff --git a/modules/iopcore/cdvdman/device-smb.c b/modules/iopcore/cdvdman/device-smb.c index e4f387541..dfc9b09a0 100644 --- a/modules/iopcore/cdvdman/device-smb.c +++ b/modules/iopcore/cdvdman/device-smb.c @@ -10,7 +10,6 @@ #include "oplsmb.h" #include "smb.h" #include "smstcpip.h" -#include "dev9.h" #include "atad.h" #include "ioplib_util.h" #include "cdvdman.h" @@ -36,8 +35,7 @@ extern struct cdvdman_settings_smb cdvdman_settings; -struct irx_export_table _exp_dev9; -struct irx_export_table _exp_oplsmb; +extern struct irx_export_table _exp_oplsmb; static void ps2ip_init(void); @@ -74,9 +72,6 @@ void smb_NegotiateProt(OplSmbPwHashFunc_t hash_callback) void DeviceInit(void) { - RegisterLibraryEntries(&_exp_dev9); - dev9d_init(); - RegisterLibraryEntries(&_exp_oplsmb); } diff --git a/modules/iopcore/cdvdman/device-usb.c b/modules/iopcore/cdvdman/device-usb.c index ea0345451..6263e3b7f 100644 --- a/modules/iopcore/cdvdman/device-usb.c +++ b/modules/iopcore/cdvdman/device-usb.c @@ -7,7 +7,6 @@ #include "smsutils.h" #include "mass_common.h" #include "mass_stor.h" -#include "dev9.h" #include "atad.h" #include "ioplib_util.h" #include "cdvdman.h" @@ -34,10 +33,6 @@ extern struct cdvdman_settings_usb cdvdman_settings; -#ifdef __USE_DEV9 -struct irx_export_table _exp_dev9; -#endif - static void usbd_init(void); // !!! usbd exports functions pointers !!! @@ -66,10 +61,6 @@ static void usbd_init(void) void DeviceInit(void) { -#ifdef __USE_DEV9 - RegisterLibraryEntries(&_exp_dev9); - dev9d_init(); -#endif } void DeviceDeinit(void) diff --git a/modules/iopcore/cdvdman/exports.tab b/modules/iopcore/cdvdman/exports.tab index 898e38de8..cacf5c8a0 100755 --- a/modules/iopcore/cdvdman/exports.tab +++ b/modules/iopcore/cdvdman/exports.tab @@ -53,7 +53,7 @@ DECLARE_EXPORT_TABLE(cdvdman, 1, 1) DECLARE_EXPORT(sceCdReadCdda) DECLARE_EXPORT(_dummy) DECLARE_EXPORT(_dummy) - DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(_dummy) DECLARE_EXPORT(sceCdGetReadPos) DECLARE_EXPORT(_dummy) DECLARE_EXPORT(_dummy) @@ -136,67 +136,7 @@ DECLARE_EXPORT_TABLE(cdvdstm, 1, 1) DECLARE_EXPORT(_retonly) END_EXPORT_TABLE -#ifdef SMB_DRIVER -// dev9 export table -DECLARE_EXPORT_TABLE(dev9, 1, 7) - DECLARE_EXPORT(dev9d_init) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(_ret0) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(dev9RegisterIntrCb) - DECLARE_EXPORT(dev9DmaTransfer) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(dev9IntrEnable) - DECLARE_EXPORT(dev9IntrDisable) - DECLARE_EXPORT(dev9GetEEPROM) - DECLARE_EXPORT(dev9LEDCtl) - DECLARE_EXPORT(_ret0) - DECLARE_EXPORT(dev9RegisterPreDmaCb) - DECLARE_EXPORT(dev9RegisterPostDmaCb) -END_EXPORT_TABLE -#endif - #ifdef HDD_DRIVER -#ifdef HD_PRO -#ifdef __IOPCORE_DEBUG -// dev9 export table -DECLARE_EXPORT_TABLE(dev9, 1, 7) - DECLARE_EXPORT(dev9d_init) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(_ret0) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(dev9RegisterIntrCb) - DECLARE_EXPORT(dev9DmaTransfer) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(dev9IntrEnable) - DECLARE_EXPORT(dev9IntrDisable) - DECLARE_EXPORT(dev9GetEEPROM) - DECLARE_EXPORT(dev9LEDCtl) - DECLARE_EXPORT(_ret0) - DECLARE_EXPORT(dev9RegisterPreDmaCb) - DECLARE_EXPORT(dev9RegisterPostDmaCb) -END_EXPORT_TABLE -#endif -#else -// dev9 export table -DECLARE_EXPORT_TABLE(dev9, 1, 7) - DECLARE_EXPORT(dev9d_init) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(_ret0) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(dev9RegisterIntrCb) - DECLARE_EXPORT(dev9DmaTransfer) - DECLARE_EXPORT(_retonly) - DECLARE_EXPORT(dev9IntrEnable) - DECLARE_EXPORT(dev9IntrDisable) - DECLARE_EXPORT(dev9GetEEPROM) - DECLARE_EXPORT(dev9LEDCtl) - DECLARE_EXPORT(_ret0) - DECLARE_EXPORT(dev9RegisterPreDmaCb) - DECLARE_EXPORT(dev9RegisterPostDmaCb) -END_EXPORT_TABLE -#endif - // atad export table DECLARE_EXPORT_TABLE(atad, 1, 3) DECLARE_EXPORT(atad_start) @@ -221,7 +161,6 @@ DECLARE_EXPORT_TABLE(atad, 1, 3) END_EXPORT_TABLE #endif -#ifdef USB_DRIVER #ifdef __USE_DEV9 // dev9 export table DECLARE_EXPORT_TABLE(dev9, 1, 7) @@ -241,7 +180,6 @@ DECLARE_EXPORT_TABLE(dev9, 1, 7) DECLARE_EXPORT(dev9RegisterPostDmaCb) END_EXPORT_TABLE #endif -#endif // smsutils export table DECLARE_EXPORT_TABLE(smsutils, 1, 1) diff --git a/modules/iopcore/cdvdman/ioplib_util.c b/modules/iopcore/cdvdman/ioplib_util.c index 695cb948d..51c76ddf0 100644 --- a/modules/iopcore/cdvdman/ioplib_util.c +++ b/modules/iopcore/cdvdman/ioplib_util.c @@ -30,55 +30,37 @@ static int (*SearchModuleByName)(char *modname); // modules list to fake loading static char *lm_modulefake_list[] = { +#ifdef __USE_DEV9 + "DEV9.IRX", +#endif #ifdef USB_DRIVER "USBD.IRX", - "CDVDSTM.IRX", - NULL #endif #ifdef SMB_DRIVER - "DEV9.IRX", "SMAP.IRX", - "CDVDSTM.IRX", - NULL #endif #ifdef HDD_DRIVER "ATAD.IRX", -#ifdef HDPRO -#ifdef __IOPCORE_DEBUG - "DEV9.IRX", -#endif -#else - "DEV9.IRX", #endif "CDVDSTM.IRX", NULL -#endif }; static char *lmb_modulefake_list[] = { +#ifdef __USE_DEV9 + "dev9", +#endif #ifdef USB_DRIVER "USB_driver", - "cdvd_st_driver", - NULL #endif #ifdef SMB_DRIVER - "dev9", "INET_SMAP_driver", - "cdvd_st_driver", - NULL #endif #ifdef HDD_DRIVER "atad_driver", -#ifdef HDPRO -#ifdef __IOPCORE_DEBUG - "dev9", -#endif -#else - "dev9", #endif "cdvd_st_driver", NULL -#endif }; static int fakemod_flag = 0; diff --git a/modules/mcemu/Makefile b/modules/mcemu/Makefile index 1b5f5291b..93e154a57 100644 --- a/modules/mcemu/Makefile +++ b/modules/mcemu/Makefile @@ -9,20 +9,26 @@ # $Id: $ IOP_OBJS = mcemu.o mcemu_io.o mcemu_sys.o mcemu_var.o mcemu_rpc.o imports.o + ifeq ($(USE_HDD),1) IOP_BIN = hdd_mcemu.irx -IOP_OBJNAME = hdd. +IOP_OBJNAME = obj.hdd/ IOP_OBJS += device-hdd.o +IOP_CFLAGS += -DHDD_DRIVER endif + ifeq ($(USE_SMB),1) IOP_BIN = smb_mcemu.irx -IOP_OBJNAME = smb. +IOP_OBJNAME = obj.smb/ IOP_OBJS += device-smb.o +IOP_CFLAGS += -DSMB_DRIVER endif + ifeq ($(USE_USB),1) IOP_BIN = usb_mcemu.irx -IOP_OBJNAME = usb. +IOP_OBJNAME = obj.usb/ IOP_OBJS += device-usb.o +IOP_CFLAGS += -DUSB_DRIVER endif IOP_OBJS := $(IOP_OBJS:%=$(IOP_OBJNAME)%) @@ -31,17 +37,7 @@ ifeq ($(IOPCORE_DEBUG),1) IOP_CFLAGS += -DDEBUG endif -IOP_CFLAGS += -Wall -fno-builtin - -ifeq ($(USE_HDD),1) -IOP_CFLAGS += -DHDD_DRIVER -endif -ifeq ($(USE_SMB),1) -IOP_CFLAGS += -DSMB_DRIVER -endif -ifeq ($(USE_USB),1) -IOP_CFLAGS += -DUSB_DRIVER -endif +IOP_CFLAGS += -Wall -fno-builtin ifeq ($(PADEMU),1) IOP_CFLAGS += -DPADEMU @@ -50,12 +46,15 @@ endif IOP_LDFLAGS += -s IOP_INCS += -all: $(IOP_BIN) - -rebuild: clean all +all: OBJ_DIR $(IOP_BIN) clean: -rm -f $(IOP_OBJS) $(IOP_BIN) +rebuild: clean all + +OBJ_DIR: + mkdir -p $(IOP_OBJNAME) + include $(PS2SDK)/Defs.make include Rules.make diff --git a/modules/network/smap-ingame/xfer.c b/modules/network/smap-ingame/xfer.c index 8a41511f0..85e4e59cd 100644 --- a/modules/network/smap-ingame/xfer.c +++ b/modules/network/smap-ingame/xfer.c @@ -49,7 +49,7 @@ static inline int CopyFromFIFOWithDMA(volatile u8 *smap_regbase, void *buffer, i u16 OldDMACtrl; //Attempt to steal the DMA channel from the DEV9 module. - if ((result = length / 128) > 0) { + if ((result = length / 64) > 0) { OldDMACtrl = SPD_REG16(SPD_R_DMA_CTRL); while (dmac_ch_get_chcr(IOP_DMAC_DEV9) & DMAC_CHCR_TR) { diff --git a/modules/pademu/Makefile b/modules/pademu/Makefile index b697d736a..73ad4fcbe 100644 --- a/modules/pademu/Makefile +++ b/modules/pademu/Makefile @@ -1,17 +1,20 @@ IOP_OBJS = pademu.o sys_utils.o imports.o exports.o + ifeq ($(USE_USB),1) IOP_BIN = usb_pademu.irx IOP_CFLAGS += -DUSB -IOP_OBJNAME = usb. +IOP_OBJNAME = obj.usb/ IOP_OBJS += ds34usb.o endif + ifeq ($(USE_BT),1) IOP_BIN = bt_pademu.irx IOP_CFLAGS += -DBT -DUSE_THREAD -IOP_OBJNAME = bt. +IOP_OBJNAME = obj.bt/ IOP_OBJS += ds34bt.o endif + ifeq ($(VMC),1) IOP_CFLAGS += -DVMC endif @@ -21,12 +24,15 @@ IOP_OBJS := $(IOP_OBJS:%=$(IOP_OBJNAME)%) IOP_CFLAGS += -Wall -fno-builtin -DUSE_SMSUTILS IOP_LDFLAGS += -s -all: $(IOP_BIN) +all: OBJ_DIR $(IOP_BIN) clean: rm -f $(IOP_BIN) $(IOP_OBJS) rebuild: clean all +OBJ_DIR: + mkdir -p $(IOP_OBJNAME) + include $(PS2SDK)/Defs.make include Rules.make diff --git a/src/debug.c b/src/debug.c index e9b2227aa..850f77c30 100644 --- a/src/debug.c +++ b/src/debug.c @@ -8,33 +8,8 @@ #include "include/ethsupport.h" #include "include/system.h" #include "include/ioman.h" +#include "include/extern_irx.h" -extern void *netman_irx; -extern int size_netman_irx; - -extern void *dns_irx; -extern int size_dns_irx; - -extern void *ps2ips_irx; -extern int size_ps2ips_irx; - -extern void *ps2ip_irx; -extern int size_ps2ip_irx; - -extern void *smap_irx; -extern int size_smap_irx; - -extern void *udptty_irx; -extern int size_udptty_irx; - -extern void *ioptrap_irx; -extern int size_ioptrap_irx; - -extern void *ps2link_irx; -extern int size_ps2link_irx; - -extern void *smsutils_irx; -extern int size_smsutils_irx; int debugSetActive(void) { diff --git a/src/dialogs.c b/src/dialogs.c index 4266e9ed2..13c89f9c0 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -525,7 +525,7 @@ struct UIItem diaPadEmuConfig[] = { {UI_SPACER}, {UI_BOOL, PADCFG_PADEMU_MTAP, 1, 1, _STR_HINT_MTAP_ENABLE, 0, 0, {.intvalue = {1, 1}}}, {UI_BREAK}, - + {UI_LABEL, 0, 1, 1, -1, -45, 0, {.label = {NULL, _STR_MTAP_PORT}}}, {UI_SPACER}, {UI_INT, PADCFG_PADEMU_MTAP_PORT, 1, 1, _STR_HINT_MTAP_PORT, 0, 0, {.intvalue = {1, 1, 1, 2}}}, @@ -576,7 +576,7 @@ struct UIItem diaPadEmuConfig[] = { // end of dialog {UI_TERMINATOR}}; - + struct UIItem diaPadEmuInfo[] = { {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_BTINFO}}}, {UI_SPACER}, @@ -799,13 +799,13 @@ struct UIItem diaAbout[] = { {UI_SPACER}, //START of OPL_DB tweaks - {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"izdubar, Jay-Jay, jimmikaelkael, misfire, Polo35, ps2netbox/ps2usb, reprep,", -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"izdubar, Jay-Jay, jimmikaelkael, Maximus32, misfire, Polo35, ps2netbox/ps2usb,", -1}}}, //END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, //START of OPL_DB tweaks - {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"SP193, volca, ... and the anonymous ...", -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"reprep, SP193, volca, ... and the anonymous ...", -1}}}, //END of OPL_DB tweaks //START of OPL_DB tweaks {UI_SPLITTER}, diff --git a/src/ethsupport.c b/src/ethsupport.c index 0e958c3b9..c29774530 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -9,6 +9,7 @@ #include "include/textures.h" #include "include/ioman.h" #include "include/system.h" +#include "include/extern_irx.h" #ifdef CHEAT #include "include/cheatman.h" #endif @@ -17,38 +18,6 @@ #include "include/nbns.h" #include "httpclient.h" -extern void *smb_cdvdman_irx; -extern int size_smb_cdvdman_irx; - -extern void *smsutils_irx; -extern int size_smsutils_irx; - -extern void *ps2ip_irx; -extern int size_ps2ip_irx; - -extern void *smap_irx; -extern int size_smap_irx; - -extern void *smbman_irx; -extern int size_smbman_irx; - -extern void *nbns_irx; -extern int size_nbns_irx; - -extern void *httpclient_irx; -extern int size_httpclient_irx; - -extern void *netman_irx; -extern int size_netman_irx; - -extern void *ps2ips_irx; -extern int size_ps2ips_irx; - -#ifdef VMC -extern void *smb_mcemu_irx; -extern int size_smb_mcemu_irx; -#endif - static char ethPrefix[40]; //Contains the full path to the folder where all the games are. static char *ethBase; static int ethULSizePrev = -2; diff --git a/src/fntsys.c b/src/fntsys.c index c528ac4b7..26aba1fac 100644 --- a/src/fntsys.c +++ b/src/fntsys.c @@ -737,6 +737,7 @@ void fntFitString(int id, unsigned char *string, size_t width) unsigned char *str = string; size_t spacewidth = fntCalcDimensions(id, " "); unsigned char *psp = NULL; + width = rmScaleX(width); while (*str) { // scan forward to the next whitespace diff --git a/src/gui.c b/src/gui.c index 974d43b05..2081b14ec 100644 --- a/src/gui.c +++ b/src/gui.c @@ -232,6 +232,9 @@ void guiShowAbout() #ifdef PADEMU strcat(OPLVersion, " PADEMU"); #endif +#ifdef HIRES + strcat(OPLVersion, " HIRES"); +#endif diaSetLabel(diaAbout, 1, OPLVersion); @@ -906,7 +909,7 @@ static void guiShowPadEmuConfig(void) int PadEmuMtap, PadEmuMtapPort, PadEmuEnable, i; diaSetEnum(diaPadEmuConfig, PADCFG_PADEMU_MODE, PadEmuModes); - + PadEmuMtap = (PadEmuSettings >> 24) & 1; PadEmuMtapPort = ((PadEmuSettings >> 25) & 1) + 1; @@ -916,14 +919,14 @@ static void guiShowPadEmuConfig(void) diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_PORT, (PadEmuSettings >> 8) & 1); diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_VIB, (PadEmuSettings >> 16) & 1); - + diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_MTAP, PadEmuMtap); diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_MTAP_PORT, PadEmuMtapPort); diaSetInt(diaPadEmuConfig, PADCFG_PADEMU_WORKAROUND, ((PadEmuSettings >> 26) & 1)); - + diaGetInt(diaPadEmuConfig, PADCFG_PADEMU_ENABLE, &PadEmuEnable); diaSetEnabled(diaPadEmuConfig, PADCFG_PADEMU_PORT, PadEmuEnable); - + if (PadEmuMtap) { diaSetEnum(diaPadEmuConfig, PADCFG_PADPORT, PadEmuPorts_enums[PadEmuMtapPort]); PadEmuSettings |= 0x00000E00; @@ -945,11 +948,11 @@ static void guiShowPadEmuConfig(void) } } } - + if (result == PADCFG_BTINFO) { for (i = PADCFG_FEAT_START; i < PADCFG_FEAT_END + 1; i++) diaSetLabel(diaPadEmuInfo, i, _l(_STR_NO)); - + diaSetLabel(diaPadEmuInfo, PADCFG_VID, _l(_STR_NOT_CONNECTED)); diaSetLabel(diaPadEmuInfo, PADCFG_PID, _l(_STR_NOT_CONNECTED)); diaSetLabel(diaPadEmuInfo, PADCFG_REV, _l(_STR_NOT_CONNECTED)); diff --git a/src/hddsupport.c b/src/hddsupport.c index 587bac676..288e58914 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -9,6 +9,7 @@ #include "include/textures.h" #include "include/ioman.h" #include "include/system.h" +#include "include/extern_irx.h" #ifdef CHEAT #include "include/cheatman.h" #endif @@ -18,32 +19,6 @@ #define OPL_HDD_MODE_PS2LOGO_OFFSET 0x17F8 -extern void *hdd_cdvdman_irx; -extern int size_hdd_cdvdman_irx; - -extern void *hdd_hdpro_cdvdman_irx; -extern int size_hdd_hdpro_cdvdman_irx; - -extern void *ps2atad_irx; -extern int size_ps2atad_irx; - -extern void *hdpro_atad_irx; -extern int size_hdpro_atad_irx; - -extern void *ps2hdd_irx; -extern int size_ps2hdd_irx; - -extern void *xhdd_irx; -extern int size_xhdd_irx; - -extern void *ps2fs_irx; -extern int size_ps2fs_irx; - -#ifdef VMC -extern void *hdd_mcemu_irx; -extern int size_hdd_mcemu_irx; -#endif - static unsigned char hddForceUpdate = 1; static unsigned char hddHDProKitDetected = 0; static unsigned char hddModulesLoaded = 0; diff --git a/src/opl.c b/src/opl.c index 5f888b18b..1b2cdd719 100644 --- a/src/opl.c +++ b/src/opl.c @@ -21,6 +21,7 @@ #include "include/config.h" #include "include/util.h" #include "include/compatupd.h" +#include "include/extern_irx.h" #include "httpclient.h" #include "include/supportbase.h" @@ -1024,15 +1025,6 @@ int oplUpdateGameCompatSingle(int id, item_list_t *support, config_set_t *config // ---------------------------------------------------------- // -------------------- HD SRV Support ---------------------- // ---------------------------------------------------------- -extern void *ps2atad_irx; -extern int size_ps2atad_irx; - -extern void *ps2hdd_irx; -extern int size_ps2hdd_irx; - -extern void *hdldsvr_irx; -extern int size_hdldsvr_irx; - static int loadHdldSvr(void) { int ret, padStatus; diff --git a/src/system.c b/src/system.c index cab0c713c..baee059bc 100644 --- a/src/system.c +++ b/src/system.c @@ -14,6 +14,7 @@ #include "include/usbsupport.h" #include "include/OSDHistory.h" #include "include/renderman.h" +#include "include/extern_irx.h" #include "../ee_core/include/modules.h" #ifdef PADEMU @@ -30,9 +31,6 @@ typedef struct int VMC_thread_priority; int VMC_card_slot; } createVMCparam_t; - -extern void *genvmc_irx; -extern int size_genvmc_irx; #endif #ifdef GSM #include "include/pggsm.h" @@ -41,107 +39,12 @@ extern int size_genvmc_irx; #include "include/pgcht.h" #endif -extern void *udnl_irx; -extern int size_udnl_irx; - -extern void *imgdrv_irx; -extern int size_imgdrv_irx; - -extern void *cdvdfsv_irx; -extern int size_cdvdfsv_irx; - -extern void *isofs_irx; -extern int size_isofs_irx; - -extern void *ps2dev9_irx; -extern int size_ps2dev9_irx; - -extern void *smstcpip_irx; -extern int size_smstcpip_irx; - -extern void *ingame_smstcpip_irx; -extern int size_ingame_smstcpip_irx; - -extern void *smap_irx; -extern int size_smap_irx; - -extern void *smap_ingame_irx; -extern int size_smap_ingame_irx; - -extern void *smbinit_irx; -extern int size_smbinit_irx; - -extern void *iomanx_irx; -extern int size_iomanx_irx; - -extern void *filexio_irx; -extern int size_filexio_irx; - -extern void *poweroff_irx; -extern int size_poweroff_irx; - -extern void *ps2atad_irx; -extern int size_ps2atad_irx; - -extern void *ps2hdd_irx; -extern int size_ps2hdd_irx; - -#ifdef _DTL_T10000 -extern void *sio2man_irx; -extern int size_sio2man_irx; - -extern void *padman_irx; -extern int size_padman_irx; - -extern void *mcman_irx; -extern int size_mcman_irx; - -extern void *mcserv_irx; -extern int size_mcserv_irx; -#endif - -extern void *hdldsvr_irx; -extern int size_hdldsvr_irx; - extern void *eecore_elf; extern int size_eecore_elf; extern void *elfldr_elf; extern int size_elfldr_elf; -extern void *pusbd_irx; -extern int size_pusbd_irx; - -#ifdef PADEMU -extern void *ds34bt_irx; -extern int size_ds34bt_irx; - -extern void *ds34usb_irx; -extern int size_ds34usb_irx; - -extern void *bt_pademu_irx; -extern int size_bt_pademu_irx; - -extern void *usb_pademu_irx; -extern int size_usb_pademu_irx; -#endif - -#ifdef __INGAME_DEBUG -extern void *udptty_ingame_irx; -extern int size_udptty_ingame_irx; - -extern void *ioptrap_irx; -extern int size_ioptrap_irx; -#endif - -#ifdef __DECI2_DEBUG -extern void *drvtif_irx; -extern int size_drvtif_irx; - -extern void *tifinet_irx; -extern int size_tifinet_irx; -#endif - extern unsigned char IOPRP_img[]; extern unsigned int size_IOPRP_img; @@ -887,7 +790,7 @@ int sysExecElf(char *path) FlushCache(0); FlushCache(2); - + ExecPS2((void *)eh->entry, 0, 1, elf_argv); return 0; diff --git a/src/usbsupport.c b/src/usbsupport.c index eb481e79e..d7c4decec 100644 --- a/src/usbsupport.c +++ b/src/usbsupport.c @@ -9,28 +9,12 @@ #include "include/textures.h" #include "include/ioman.h" #include "include/system.h" +#include "include/extern_irx.h" #ifdef CHEAT #include "include/cheatman.h" #endif #include "modules/iopcore/common/cdvd_config.h" -extern void *usb_cdvdman_irx; -extern int size_usb_cdvdman_irx; - -extern void *usbd_irx; -extern int size_usbd_irx; - -extern void *usbhdfsd_irx; -extern int size_usbhdfsd_irx; - -extern void *usbhdfsdfsv_irx; -extern int size_usbhdfsdfsv_irx; - -#ifdef VMC -extern void *usb_mcemu_irx; -extern int size_usb_mcemu_irx; -#endif - void *pusbd_irx = NULL; int size_pusbd_irx = 0; From c19469e6cbd026106a1245874d1e314cdc05d210 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 6 Jul 2018 12:10:17 -0700 Subject: [PATCH 105/269] Merge pull request #105 from sp193/smstcpip-timeout Backported timer code from lwIP 1.4.1 to prevent race conditions around the etharp and tcp timers. --- modules/network/SMSTCPIP/Makefile | 2 +- modules/network/SMSTCPIP/imports.lst | 1 + modules/network/SMSTCPIP/include/lwip/opt.h | 2 +- modules/network/SMSTCPIP/include/lwip/sys.h | 14 - modules/network/SMSTCPIP/include/lwip/tcp.h | 7 + modules/network/SMSTCPIP/include/lwip/tcpip.h | 1 + .../network/SMSTCPIP/include/lwip/timers.h | 100 ++++++ modules/network/SMSTCPIP/memp.c | 5 +- modules/network/SMSTCPIP/ps2ip.c | 110 ++----- modules/network/SMSTCPIP/tcpip.c | 6 +- modules/network/SMSTCPIP/timers.c | 296 ++++++++++++++++++ 11 files changed, 442 insertions(+), 102 deletions(-) create mode 100644 modules/network/SMSTCPIP/include/lwip/timers.h create mode 100644 modules/network/SMSTCPIP/timers.c diff --git a/modules/network/SMSTCPIP/Makefile b/modules/network/SMSTCPIP/Makefile index 3ef8d3a60..250b530d6 100755 --- a/modules/network/SMSTCPIP/Makefile +++ b/modules/network/SMSTCPIP/Makefile @@ -1,7 +1,7 @@ IOP_BIN = SMSTCPIP.irx IOP_OBJS = ps2ip.o inet.o ip.o ip_addr.o ip_frag.o etharp.o tcp_in.o tcp_out.o \ tcp.o tcpip.o mem.o api_lib.o api_msg.o sockets.o netif.o udp.o memp.o \ - icmp.o pbuf.o exports.o imports.o + icmp.o pbuf.o timers.o exports.o imports.o IOP_LIBS = IOP_INCS += -Iinclude -I../../iopcore/common diff --git a/modules/network/SMSTCPIP/imports.lst b/modules/network/SMSTCPIP/imports.lst index 89b321ad6..cda967cf6 100755 --- a/modules/network/SMSTCPIP/imports.lst +++ b/modules/network/SMSTCPIP/imports.lst @@ -21,6 +21,7 @@ I_ExitDeleteThread I_StartThread I_iReleaseWaitThread I_USec2SysClock +I_SysClock2USec I_GetThreadId I_GetSystemTime I_SetAlarm diff --git a/modules/network/SMSTCPIP/include/lwip/opt.h b/modules/network/SMSTCPIP/include/lwip/opt.h index 283360991..1843e1406 100644 --- a/modules/network/SMSTCPIP/include/lwip/opt.h +++ b/modules/network/SMSTCPIP/include/lwip/opt.h @@ -135,7 +135,7 @@ a lot of data that needs to be copied, this should be set high. */ /* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. */ #ifndef MEMP_NUM_SYS_TIMEOUT -#define MEMP_NUM_SYS_TIMEOUT 3 +#define MEMP_NUM_SYS_TIMEOUT (LWIP_TCP + LWIP_ARP) #endif /* The following four are used only with the sequential API and can be diff --git a/modules/network/SMSTCPIP/include/lwip/sys.h b/modules/network/SMSTCPIP/include/lwip/sys.h index cf3c1c885..d48efc4bd 100644 --- a/modules/network/SMSTCPIP/include/lwip/sys.h +++ b/modules/network/SMSTCPIP/include/lwip/sys.h @@ -69,20 +69,6 @@ struct sys_timeout /** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */ #define SYS_ARCH_TIMEOUT -418 -typedef void (*sys_timeout_handler)(void *arg); - -struct sys_timeout -{ - struct sys_timeout *next; - u32_t time; - sys_timeout_handler h; - void *arg; -}; - -struct sys_timeouts -{ - struct sys_timeout *next; -}; /* Semaphore functions. */ sys_sem_t sys_sem_new(u8_t count); //void sys_sem_signal(sys_sem_t sem); diff --git a/modules/network/SMSTCPIP/include/lwip/tcp.h b/modules/network/SMSTCPIP/include/lwip/tcp.h index bcd8c4644..71ab736bd 100644 --- a/modules/network/SMSTCPIP/include/lwip/tcp.h +++ b/modules/network/SMSTCPIP/include/lwip/tcp.h @@ -469,6 +469,12 @@ int tcp_pcbs_sane(void); #define tcp_pcbs_sane() 1 #endif /* TCP_DEBUG */ +#if NO_SYS +#define tcp_timer_needed() +#else +void tcp_timer_needed(void); +#endif + /* The TCP PCB lists. */ extern struct tcp_pcb_listen *tcp_listen_pcbs; /* List of all TCP PCBs in LISTEN state. */ extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a @@ -492,6 +498,7 @@ extern struct tcp_pcb *tcp_tmp_pcb; /* Only used for temporary storage. */ do { \ npcb->next = *pcbs; \ *(pcbs) = npcb; \ + tcp_timer_needed(); \ } while (0) #define TCP_RMV(pcbs, npcb) \ do { \ diff --git a/modules/network/SMSTCPIP/include/lwip/tcpip.h b/modules/network/SMSTCPIP/include/lwip/tcpip.h index 805244d71..ff25dcbe8 100644 --- a/modules/network/SMSTCPIP/include/lwip/tcpip.h +++ b/modules/network/SMSTCPIP/include/lwip/tcpip.h @@ -34,6 +34,7 @@ #include "lwip/api_msg.h" #include "lwip/pbuf.h" +#include "lwip/timers.h" #if LWIP_TCPIP_CORE_LOCKING /** The global semaphore to lock the stack. */ diff --git a/modules/network/SMSTCPIP/include/lwip/timers.h b/modules/network/SMSTCPIP/include/lwip/timers.h new file mode 100644 index 000000000..4cd8810d8 --- /dev/null +++ b/modules/network/SMSTCPIP/include/lwip/timers.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * Simon Goldschmidt + * + */ +#ifndef __LWIP_TIMERS_H__ +#define __LWIP_TIMERS_H__ + +#include "lwip/opt.h" + +/* Timers are not supported when NO_SYS==1 and NO_SYS_NO_TIMERS==1 */ +#define LWIP_TIMERS (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS)) + +#if LWIP_TIMERS + +#include "lwip/err.h" +#if !NO_SYS +#include "lwip/sys.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef LWIP_DEBUG_TIMERNAMES +#ifdef LWIP_DEBUG +#define LWIP_DEBUG_TIMERNAMES SYS_DEBUG +#else /* LWIP_DEBUG */ +#define LWIP_DEBUG_TIMERNAMES 0 +#endif /* LWIP_DEBUG*/ +#endif + +/** Function prototype for a timeout callback function. Register such a function + * using sys_timeout(). + * + * @param arg Additional argument to pass to the function - set up by sys_timeout() + */ +typedef void (* sys_timeout_handler)(void *arg); + +struct sys_timeo { + struct sys_timeo *next; + u32_t time; + sys_timeout_handler h; + void *arg; +#if LWIP_DEBUG_TIMERNAMES + const char* handler_name; +#endif /* LWIP_DEBUG_TIMERNAMES */ +}; + +void sys_timeouts_init(void); + +#if LWIP_DEBUG_TIMERNAMES +void sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name); +#define sys_timeout(msecs, handler, arg) sys_timeout_debug(msecs, handler, arg, #handler) +#else /* LWIP_DEBUG_TIMERNAMES */ +void sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg); +#endif /* LWIP_DEBUG_TIMERNAMES */ + +void sys_untimeout(sys_timeout_handler handler, void *arg); +#if NO_SYS +void sys_check_timeouts(void); +void sys_restart_timeouts(void); +#else /* NO_SYS */ +void sys_timeouts_mbox_fetch(sys_mbox_t mbox, void **msg); +#endif /* NO_SYS */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_TIMERS */ +#endif /* __LWIP_TIMERS_H__ */ diff --git a/modules/network/SMSTCPIP/memp.c b/modules/network/SMSTCPIP/memp.c index bd63eacdb..104a32085 100644 --- a/modules/network/SMSTCPIP/memp.c +++ b/modules/network/SMSTCPIP/memp.c @@ -43,6 +43,7 @@ #include "lwip/tcpip.h" #include "lwip/sys.h" +#include "lwip/timers.h" #include "lwip/stats.h" #include @@ -67,7 +68,7 @@ static const u16_t memp_sizes[MEMP_MAX] = { sizeof(struct netconn), sizeof(struct api_msg), sizeof(struct tcpip_msg), - sizeof(struct sys_timeout)}; + sizeof(struct sys_timeo)}; static const u16_t memp_num[MEMP_MAX] = { MEMP_NUM_PBUF, @@ -113,7 +114,7 @@ static u8_t memp_memory[(MEMP_NUM_PBUF * MEM_ALIGN_SIZE(sizeof(struct tcpip_msg) + sizeof(struct memp)) + MEMP_NUM_SYS_TIMEOUT * - MEM_ALIGN_SIZE(sizeof(struct sys_timeout) + + MEM_ALIGN_SIZE(sizeof(struct sys_timeo) + sizeof(struct memp)))]; diff --git a/modules/network/SMSTCPIP/ps2ip.c b/modules/network/SMSTCPIP/ps2ip.c index 8fa801aeb..13c34ebc7 100644 --- a/modules/network/SMSTCPIP/ps2ip.c +++ b/modules/network/SMSTCPIP/ps2ip.c @@ -58,14 +58,10 @@ struct sys_mbox typedef struct ip_addr IPAddr; #define MODNAME "TCP/IP Stack" -IRX_ID(MODNAME, 1, 4); +IRX_ID(MODNAME, 1, 5); extern struct irx_export_table _exp_ps2ip; -#ifdef PS2IP_DHCP -static int iTimerDHCP = 0; -#endif /* PS2IP_DHCP */ - #if LWIP_HAVE_LOOPIF static NetIF LoopIF; #endif /* LWIP_HAVE_LOOPIF */ @@ -153,79 +149,6 @@ int ps2ip_setconfig(t_ip_info *pInfo) } /* end ps2ip_setconfig */ -#define ALARM_TCP 0x00000001 -#define ALARM_ARP 0x00000002 -#define ALARM_MSK (ALARM_TCP | ALARM_ARP) - -typedef struct AlarmData -{ - - int m_EventFlag; - unsigned long m_EventMask; - iop_sys_clock_t m_Clock; - -} AlarmData; - -unsigned int _alarm(void *apArg) -{ - - AlarmData *lpData = (AlarmData *)apArg; - - iSetEventFlag(lpData->m_EventFlag, lpData->m_EventMask); - - return lpData->m_Clock.lo; - -} /* end _alarm */ - -static void TimerThread(void *apArg) -{ - - AlarmData lTCPData; - AlarmData lARPData; - iop_event_t lEvent; - - lEvent.attr = 0; - lEvent.bits = 0; - lTCPData.m_EventFlag = - lARPData.m_EventFlag = CreateEventFlag(&lEvent); - lTCPData.m_EventMask = ALARM_TCP; - lARPData.m_EventMask = ALARM_ARP; - USec2SysClock(TCP_TMR_INTERVAL * 1024, &lTCPData.m_Clock); - USec2SysClock(ARP_TMR_INTERVAL * 1024, &lARPData.m_Clock); - - SetAlarm(&lTCPData.m_Clock, _alarm, &lTCPData); - SetAlarm(&lARPData.m_Clock, _alarm, &lARPData); - - while (1) { - - unsigned long lRes; - - WaitEventFlag(lTCPData.m_EventFlag, ALARM_MSK, WEF_CLEAR | WEF_OR, &lRes); - -#if LWIP_TCP - if (lRes & ALARM_TCP) - tcp_tmr(); -#endif - if (lRes & ALARM_ARP) - etharp_tmr(); - - } /* end while */ - -} /* end TimerThread */ - -static void InitTimer(void) -{ - - iop_thread_t lThread = {TH_C, 0, TimerThread, 0x800, SYS_THREAD_PRIO_BASE}; - int lTID = CreateThread(&lThread); - - if (lTID < 0) - ExitDeleteThread(); - - StartThread(lTID, NULL); - -} /* end InitTimer */ - #ifdef INGAME_DRIVER typedef struct InputMSG { @@ -386,7 +309,6 @@ int _start(int argc, char **argv) #if LWIP_HAVE_LOOPIF AddLoopIF(); #endif /* LWIP_HAVE_LOOPIF */ - InitTimer(); return MODULE_RESIDENT_END; @@ -550,8 +472,23 @@ static unsigned int TimeoutHandler(void* pvArg) return 0; } +static u32_t ComputeTimeDiff(const iop_sys_clock_t* pStart, const iop_sys_clock_t* pEnd) +{ + iop_sys_clock_t Diff; + u32 iSec, iUSec, iDiff; + + Diff.lo = pEnd->lo-pStart->lo; + Diff.hi = pEnd->hi-pStart->hi - (pStart->lo>pEnd->lo); + + SysClock2USec(&Diff, &iSec, &iUSec); + iDiff=(iSec * 1000) + (iUSec / 1000); + + return((iDiff != 0) ? iDiff : 1); +} + u32_t sys_arch_sem_wait(sys_sem_t aSema, u32_t aTimeout) { + u32 WaitTime; if (aTimeout == 0) return(WaitSema(aSema) == 0 ? 0 : SYS_ARCH_TIMEOUT); @@ -560,20 +497,27 @@ u32_t sys_arch_sem_wait(sys_sem_t aSema, u32_t aTimeout) else { iop_sys_clock_t lTimeout; + iop_sys_clock_t Start; + iop_sys_clock_t End; int lTID = GetThreadId(); - USec2SysClock(aTimeout * 1024, &lTimeout); + GetSystemTime(&Start); + USec2SysClock(aTimeout * 1000, &lTimeout); SetAlarm(&lTimeout, &TimeoutHandler, (void *)lTID); if (!WaitSema(aSema)) { CancelAlarm(&TimeoutHandler, (void *)lTID); - --aTimeout; + GetSystemTime(&End); + + WaitTime = ComputeTimeDiff(&Start, &End); + if (WaitTime > aTimeout) + WaitTime = aTimeout; } else - aTimeout = SYS_ARCH_TIMEOUT; + WaitTime = SYS_ARCH_TIMEOUT; } /* end else */ - return aTimeout; + return WaitTime; } /* end sys_arch_sem_wait */ diff --git a/modules/network/SMSTCPIP/tcpip.c b/modules/network/SMSTCPIP/tcpip.c index 38f5a5ce4..75367ddf4 100644 --- a/modules/network/SMSTCPIP/tcpip.c +++ b/modules/network/SMSTCPIP/tcpip.c @@ -66,12 +66,16 @@ static void tcpip_thread(void *arg) #if LWIP_TCP tcp_init(); #endif /* LWIP_TCP */ +#if LWIP_TIMERS + sys_timeouts_init(); +#endif /* LWIP_TIMERS */ + tcpip_init_done(tcpip_init_done_arg); LOCK_TCPIP_CORE(); while (1) { UNLOCK_TCPIP_CORE(); - sys_mbox_fetch(g_TCPIPMBox, (void *)&msg); + sys_timeouts_mbox_fetch(g_TCPIPMBox, (void *)&msg); LOCK_TCPIP_CORE(); switch (msg->type) { diff --git a/modules/network/SMSTCPIP/timers.c b/modules/network/SMSTCPIP/timers.c new file mode 100644 index 000000000..5248eaf83 --- /dev/null +++ b/modules/network/SMSTCPIP/timers.c @@ -0,0 +1,296 @@ +/** + * @file + * Stack-internal timers implementation. + * This file includes timer callbacks for stack-internal timers as well as + * functions to set up or stop timers and check for expired timers. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * Simon Goldschmidt + * + */ + +#include + +#include "lwip/opt.h" + +#include "lwip/timers.h" +#include "lwip/tcp.h" + +#if LWIP_TIMERS + +#include "lwip/def.h" +#include "lwip/memp.h" +#include "lwip/tcpip.h" + +#include "lwip/ip_frag.h" +#include "netif/etharp.h" +#include "lwip/sys.h" +#include "lwip/pbuf.h" + +/** The one and only timeout list */ +static struct sys_timeo *next_timeout; + +#if LWIP_TCP +/** global variable that shows if the tcp timer is currently scheduled or not */ +static int tcpip_tcp_timer_active; + +/** + * Timer callback function that calls tcp_tmr() and reschedules itself. + * + * @param arg unused argument + */ +static void +tcpip_tcp_timer(void *arg) +{ + /* call TCP timer handler */ + tcp_tmr(); + /* timer still needed? */ + if (tcp_active_pcbs || tcp_tw_pcbs) { + /* restart timer */ + sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL); + } else { + /* disable timer */ + tcpip_tcp_timer_active = 0; + } +} + +/** + * Called from TCP_REG when registering a new PCB: + * the reason is to have the TCP timer only running when + * there are active (or time-wait) PCBs. + */ +void +tcp_timer_needed(void) +{ + /* timer is off but needed again? */ + if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) { + /* enable and start timer */ + tcpip_tcp_timer_active = 1; + sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL); + } +} +#endif /* LWIP_TCP */ + +#if LWIP_ARP +/** + * Timer callback function that calls etharp_tmr() and reschedules itself. + * + * @param arg unused argument + */ +static void +arp_timer(void *arg) +{ + LWIP_UNUSED_ARG(arg); + LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: etharp_tmr()\n")); + etharp_tmr(); + sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL); +} +#endif /* LWIP_ARP */ + +/** Initialize this module */ +void sys_timeouts_init(void) +{ +#if LWIP_ARP + sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL); +#endif /* LWIP_ARP */ +} + +/** + * Create a one-shot timer (aka timeout). Timeouts are processed in the + * following cases: + * - while waiting for a message using sys_timeouts_mbox_fetch() + * - by calling sys_check_timeouts() (NO_SYS==1 only) + * + * @param msecs time in milliseconds after that the timer should expire + * @param handler callback function to call when msecs have elapsed + * @param arg argument to pass to the callback function + */ +#if LWIP_DEBUG_TIMERNAMES +void +sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name) +#else /* LWIP_DEBUG_TIMERNAMES */ +void +sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg) +#endif /* LWIP_DEBUG_TIMERNAMES */ +{ + struct sys_timeo *timeout, *t; + + timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT); + if (timeout == NULL) { + LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL); + return; + } + timeout->next = NULL; + timeout->h = handler; + timeout->arg = arg; + timeout->time = msecs; +#if LWIP_DEBUG_TIMERNAMES + timeout->handler_name = handler_name; + LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n", + (void *)timeout, msecs, handler_name, (void *)arg)); +#endif /* LWIP_DEBUG_TIMERNAMES */ + + if (next_timeout == NULL) { + next_timeout = timeout; + return; + } + + if (next_timeout->time > msecs) { + next_timeout->time -= msecs; + timeout->next = next_timeout; + next_timeout = timeout; + } else { + for(t = next_timeout; t != NULL; t = t->next) { + timeout->time -= t->time; + if (t->next == NULL || t->next->time > timeout->time) { + if (t->next != NULL) { + t->next->time -= timeout->time; + } + timeout->next = t->next; + t->next = timeout; + break; + } + } + } +} + +/** + * Go through timeout list (for this task only) and remove the first matching + * entry, even though the timeout has not triggered yet. + * + * @note This function only works as expected if there is only one timeout + * calling 'handler' in the list of timeouts. + * + * @param handler callback function that would be called by the timeout + * @param arg callback argument that would be passed to handler +*/ +void +sys_untimeout(sys_timeout_handler handler, void *arg) +{ + struct sys_timeo *prev_t, *t; + + if (next_timeout == NULL) { + return; + } + + for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) { + if ((t->h == handler) && (t->arg == arg)) { + /* We have a match */ + /* Unlink from previous in list */ + if (prev_t == NULL) { + next_timeout = t->next; + } else { + prev_t->next = t->next; + } + /* If not the last one, add time of this one back to next */ + if (t->next != NULL) { + t->next->time += t->time; + } + memp_free(MEMP_SYS_TIMEOUT, t); + return; + } + } + return; +} + + +/** + * Wait (forever) for a message to arrive in an mbox. + * While waiting, timeouts are processed. + * + * @param mbox the mbox to fetch the message from + * @param msg the place to store the message + */ +void +sys_timeouts_mbox_fetch(sys_mbox_t mbox, void **msg) +{ + u32_t time_needed; + struct sys_timeo *tmptimeout; + sys_timeout_handler handler; + void *arg; + + again: + if (!next_timeout) { + time_needed = sys_arch_mbox_fetch(mbox, msg, 0); + } else { + if (next_timeout->time > 0) { + time_needed = sys_arch_mbox_fetch(mbox, msg, next_timeout->time); + } else { + time_needed = SYS_ARCH_TIMEOUT; + } + + if (time_needed == SYS_ARCH_TIMEOUT) { + /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message + could be fetched. We should now call the timeout handler and + deallocate the memory allocated for the timeout. */ + tmptimeout = next_timeout; + next_timeout = tmptimeout->next; + handler = tmptimeout->h; + arg = tmptimeout->arg; +#if LWIP_DEBUG_TIMERNAMES + if (handler != NULL) { + LWIP_DEBUGF(TIMERS_DEBUG, ("stmf calling h=%s arg=%p\n", + tmptimeout->handler_name, arg)); + } +#endif /* LWIP_DEBUG_TIMERNAMES */ + memp_free(MEMP_SYS_TIMEOUT, tmptimeout); + if (handler != NULL) { + /* For LWIP_TCPIP_CORE_LOCKING, lock the core before calling the + timeout handler function. */ + LOCK_TCPIP_CORE(); + handler(arg); + UNLOCK_TCPIP_CORE(); + } + + /* We try again to fetch a message from the mbox. */ + goto again; + } else { + /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout + occured. The time variable is set to the number of + milliseconds we waited for the message. */ + if (time_needed < next_timeout->time) { + next_timeout->time -= time_needed; + } else { + next_timeout->time = 0; + } + } + } +} + +#else /* LWIP_TIMERS */ +/* Satisfy the TCP code which calls this function */ +void +tcp_timer_needed(void) +{ +} +#endif /* LWIP_TIMERS */ From 01e73e7319ddd3c3a06ede800223e0c38baeea8c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 15 Jul 2018 17:26:35 -0700 Subject: [PATCH 106/269] update memory card icons for 10th Anniversary Edition theme --- gfx/icon.sys | Bin 964 -> 964 bytes gfx/opl.icn | Bin 8224 -> 33688 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/gfx/icon.sys b/gfx/icon.sys index 861ab72295706b21525dbb1a1300b4ff569b9c95..26587674d277255b1e20244a7e8452c037f2b80c 100644 GIT binary patch delta 151 zcmX@YeuSMjAlS%-fkBD^1QI4bRF7XI0=YB0G%HT6q^pj*Flm%0OwEiG`IQo<%=B% zKYH-M1}yvkpWVt8E9}ml@v#H(dwY27K={ys17QB40}l2uJaLcQWI;x)%`A)um;e~w BC?@~_ diff --git a/gfx/opl.icn b/gfx/opl.icn index 3c53b40ebce9de0e9b1e0315419995176d370a9f..5f0cc1d38c2b90b20222a5fe9f2132c18cc59e81 100644 GIT binary patch literal 33688 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 Hb?pBGLNQvA From 16e56f41900992eb5b6a65fc522528961e636038 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 25 Jul 2018 21:40:09 -0700 Subject: [PATCH 107/269] The following updates have been done by developer SP193: Merge pull request #114 from sp193/deci2-fix - Fixed & updated built-in DECI2 support Merge pull request #113 from sp193/new-LoadExecPS2 - EE core will now utilize the original LoadExecPS2 syscall & slimmed down IGS Merge pull request #112 from sp193/iremsnd-fix2 - Added fix for SOS: The Final Escape/Disaster Report/Zettai Zetsumei Toshi Merge pull request #111 from sp193/libc-fix - Changed call to strcmp to _strcmp for .hack fix - avoid linking with libc's strcmp. Merge pull request #109 from sp193/dothack-vmc2 - Added patch for .hack (all PAL releases). Merge pull request #108 from sp193/fatalframe - Improved initialization code within EE core to give games a more standardized boot environment --- Makefile | 14 +- ee_core/Makefile | 7 +- ee_core/include/asm.h | 3 +- ee_core/include/ee_core.h | 2 +- ee_core/include/igs_api.h | 1 - ee_core/include/modmgr.h | 14 +- ee_core/include/modules.h | 3 + ee_core/include/patches.h | 2 +- ee_core/include/syshook.h | 3 +- ee_core/include/util.h | 2 +- ee_core/linkfile | 11 +- ee_core/linkfile.igs | 112 ------ ee_core/src/asm.S | 321 ++++++------------ ee_core/src/crt0.s | 7 + ee_core/src/igs_api.c | 87 ++--- ee_core/src/main.c | 62 ++-- ee_core/src/modmgr.c | 26 +- ee_core/src/padhook.c | 6 +- ee_core/src/patches.c | 157 ++++++++- ee_core/src/syshook.c | 67 ++-- ee_core/src/util.c | 2 +- include/extern_irx.h | 3 + include/system.h | 8 +- modules/debug/tifinet.irx | Bin 3293 -> 3301 bytes modules/iopcore/cdvdman/Makefile | 20 +- modules/iopcore/patches/iremsndpatch/Makefile | 14 + .../iopcore/patches/iremsndpatch/imports.lst | 8 + .../patches/iremsndpatch/irx_imports.h | 23 ++ modules/iopcore/patches/iremsndpatch/main.c | 64 ++++ modules/iopcore/udnl/IOPRP_DECI2.img | Bin 74185 -> 73849 bytes modules/iopcore/udnl/Makefile | 2 +- modules/network/SMSTCPIP/Makefile | 10 + modules/network/SMSTCPIP/ps2ip.c | 4 +- src/ethsupport.c | 4 +- src/hddsupport.c | 2 +- src/system.c | 215 +++++++++--- src/usbsupport.c | 2 +- 37 files changed, 739 insertions(+), 549 deletions(-) delete mode 100755 ee_core/linkfile.igs create mode 100644 modules/iopcore/patches/iremsndpatch/Makefile create mode 100644 modules/iopcore/patches/iremsndpatch/imports.lst create mode 100644 modules/iopcore/patches/iremsndpatch/irx_imports.h create mode 100644 modules/iopcore/patches/iremsndpatch/main.c diff --git a/Makefile b/Makefile index 2b767cb71..580250ef9 100755 --- a/Makefile +++ b/Makefile @@ -89,7 +89,8 @@ MISC_OBJS = icon_sys_A.o icon_sys_J.o conf_theme_OPL.o IOP_OBJS = iomanx.o filexio.o ps2fs.o usbd.o usbhdfsd.o usbhdfsdfsv.o \ ps2atad.o hdpro_atad.o poweroff.o ps2hdd.o xhdd.o genvmc.o hdldsvr.o \ ps2dev9.o smsutils.o ps2ip.o smap.o isofs.o nbns-iop.o \ - httpclient-iop.o netman.o ps2ips.o + httpclient-iop.o netman.o ps2ips.o \ + iremsndpatch.o EECORE_OBJS = ee_core.o ioprp.o util.o \ elfldr.o udnl.o imgdrv.o eesync.o \ @@ -211,6 +212,7 @@ ifeq ($(DEBUG),1) EECORE_EXTRA_FLAGS += DECI2_DEBUG=1 IOP_OBJS += drvtif_irx.o tifinet_irx.o DECI2_DEBUG=1 + CDVDMAN_DEBUG_FLAGS = USE_DEV9=1 #dsidb cannot be used to handle exceptions or set breakpoints, so disable output to save resources. else IOP_OBJS += udptty-ingame.o endif @@ -284,6 +286,9 @@ clean: $(MAKE) -C modules/iopcore/cdvdman USE_HDPRO=1 clean echo " -cdvdfsv" $(MAKE) -C modules/iopcore/cdvdfsv clean + echo " -patches" + echo " -iremsnd" + $(MAKE) -C modules/iopcore/patches/iremsndpatch clean echo " -isofs" $(MAKE) -C modules/isofs clean echo " -usbhdfsdfsv" @@ -432,6 +437,13 @@ modules/iopcore/cdvdfsv/cdvdfsv.irx: modules/iopcore/cdvdfsv $(EE_ASM_DIR)cdvdfsv.s: modules/iopcore/cdvdfsv/cdvdfsv.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ cdvdfsv_irx +modules/iopcore/patches/iremsndpatch/iremsndpatch.irx: modules/iopcore/patches/iremsndpatch + echo " -iremsnd patch" + $(MAKE) -C $< + +$(EE_ASM_DIR)iremsndpatch.s: modules/iopcore/patches/iremsndpatch/iremsndpatch.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ iremsndpatch_irx + modules/mcemu/usb_mcemu.irx: modules/mcemu echo " -usb_mcemu" $(MAKE) $(MCEMU_DEBUG_FLAGS) $(PADEMU_FLAGS) USE_USB=1 -C $< rebuild diff --git a/ee_core/Makefile b/ee_core/Makefile index cb9c6b5b8..85e2a5ad9 100755 --- a/ee_core/Makefile +++ b/ee_core/Makefile @@ -51,7 +51,6 @@ endif ifeq ($(IGS),1) EE_OBJS += $(IGSCORE_EE_OBJS) EE_CFLAGS += -DIGS -EE_LIBS += -lmc endif ifeq ($(CHEAT),1) @@ -61,11 +60,7 @@ endif EE_OBJS := $(EE_OBJS:%=$(EE_OBJS_DIR)%) -ifeq ($(IGS),1) -EE_LDFLAGS = -nostartfiles -Tlinkfile.igs -L$(PS2SDK)/ee/lib -s -Wl,-Map,$(MAPFILE) -else -EE_LDFLAGS = -nostartfiles -Tlinkfile -L$(PS2SDK)/ee/lib -s -Wl,-Map,$(MAPFILE) -endif +EE_LDFLAGS = -nostartfiles -nostdlib -Tlinkfile -L$(PS2SDK)/ee/lib -s -Wl,-Map,$(MAPFILE) EE_LIBS += -lpatches ifeq ($(PADEMU),1) diff --git a/ee_core/include/asm.h b/ee_core/include/asm.h index 16883015e..2d5d87965 100755 --- a/ee_core/include/asm.h +++ b/ee_core/include/asm.h @@ -14,10 +14,11 @@ #include #include -void Hook_LoadExecPS2(const char *filename, int argc, char *argv[]); u32 Hook_SifSetDma(SifDmaTransfer_t *sdd, s32 len); int Hook_SifSetReg(u32 register_num, int register_value); int Hook_ExecPS2(void *entry, void *gp, int num_args, char *args[]); int Hook_CreateThread(ee_thread_t *thread_param); +void CleanExecPS2(void *epc, void *gp, int argc, char **argv); + #endif /* ASM */ diff --git a/ee_core/include/ee_core.h b/ee_core/include/ee_core.h index 6539ed52e..2df93312e 100644 --- a/ee_core/include/ee_core.h +++ b/ee_core/include/ee_core.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -83,7 +84,6 @@ int PadEmuSettings; #endif int DisableDebug; -int PS2Logo; #define GS_BGCOLOUR *((volatile unsigned long int *)0x120000E0) #ifdef CHEAT diff --git a/ee_core/include/igs_api.h b/ee_core/include/igs_api.h index 486c932cb..718307c46 100644 --- a/ee_core/include/igs_api.h +++ b/ee_core/include/igs_api.h @@ -32,7 +32,6 @@ #include "modmgr.h" #include "util.h" #include -#include #define GS_BITBLTBUF 0x50 #define GS_TRXPOS 0x51 diff --git a/ee_core/include/modmgr.h b/ee_core/include/modmgr.h index e9c8a694d..5190c208c 100644 --- a/ee_core/include/modmgr.h +++ b/ee_core/include/modmgr.h @@ -62,11 +62,7 @@ struct _lf_module_buffer_load_arg struct _lf_elf_load_arg { - union - { - u32 epc; - int result; - } p; + u32 epc; u32 gp; char path[LF_PATH_MAX]; char secname[LF_ARG_MAX]; @@ -80,6 +76,14 @@ typedef struct u32 dummy; } t_ExecData; +/* Extended error codes */ +/** Could not bind with RPC server */ +#define SCE_EBINDMISS 0x10000 +/** Could not call the RPC function */ +#define SCE_ECALLMISS 0x10001 +/** ELF/Module load failed */ +#define SCE_ELOADMISS 0x10003 + int LoadFileInit(); void LoadFileExit(); int LoadModule(const char *path, int arg_len, const char *args); diff --git a/ee_core/include/modules.h b/ee_core/include/modules.h index 8a826b40c..8d7e0f4e5 100644 --- a/ee_core/include/modules.h +++ b/ee_core/include/modules.h @@ -23,6 +23,9 @@ enum OPL_MODULE_ID { OPL_MODULE_ID_DRVTIF, OPL_MODULE_ID_TIFINET, + //Special patches + OPL_MODULE_ID_IOP_PATCH, + OPL_MODULE_ID_COUNT }; diff --git a/ee_core/include/patches.h b/ee_core/include/patches.h index e20b2b6b3..0827ce711 100644 --- a/ee_core/include/patches.h +++ b/ee_core/include/patches.h @@ -13,6 +13,6 @@ #define COMPAT_MODE_4 0x08 // Skip Videos -void apply_patches(void); +void apply_patches(const char *path); #endif /* PATCHES */ diff --git a/ee_core/include/syshook.h b/ee_core/include/syshook.h index 98c9c2b74..cd4d821cc 100644 --- a/ee_core/include/syshook.h +++ b/ee_core/include/syshook.h @@ -17,8 +17,9 @@ void Remove_Kernel_Hooks(void); u32 (*Old_SifSetDma)(SifDmaTransfer_t *sdd, s32 len); int (*Old_SifSetReg)(u32 register_num, int register_value); -void (*Old_LoadExecPS2)(const char *filename, int argc, char *argv[]); int (*Old_ExecPS2)(void *entry, void *gp, int num_args, char *args[]); int (*Old_CreateThread)(ee_thread_t *thread_param); +void sysLoadElf(char *filename, int argc, char **argv); + #endif /* SYSHOOK */ diff --git a/ee_core/include/util.h b/ee_core/include/util.h index 95f97ce11..0a44c0c44 100644 --- a/ee_core/include/util.h +++ b/ee_core/include/util.h @@ -29,6 +29,6 @@ unsigned long int _strtoul(const char *p); void set_ipconfig(void); u32 *find_pattern_with_mask(u32 *buf, unsigned int bufsize, const u32 *pattern, const u32 *mask, unsigned int len); void CopyToIop(void *eedata, unsigned int size, void *iopptr); -inline void delay(int count); +void delay(int count); #endif /* UTIL */ diff --git a/ee_core/linkfile b/ee_core/linkfile index c167e5d04..408b389c9 100755 --- a/ee_core/linkfile +++ b/ee_core/linkfile @@ -14,12 +14,17 @@ ENTRY(_start); MEMORY { - ram82 : ORIGIN = 0x00082000, LENGTH = 24K /* 0x00082000 - 0x00088000: probably free */ - ram88 : ORIGIN = 0x00088000, LENGTH = 60K /* 0x00088000 - 0x00097000: free */ - ramD0 : ORIGIN = 0x000D0000, LENGTH = 192K /* 0x000D0000 - 0x00100000: probably free */ + ram86 : ORIGIN = 0x00086000, LENGTH = 8K /* 0x00086000 - 0x00088000: probably free */ + ram88 : ORIGIN = 0x00088000, LENGTH = 60928 /* 0x00088000 - 0x00096E00: free */ + stack : ORIGIN = 0x00096E00, LENGTH = 512 /* 0x00096E00 - 0x00097000: free */ + ramD0 : ORIGIN = 0x000D0000, LENGTH = 192K /* 0x000D0000 - 0x00100000: probably free */ } SECTIONS { + .igs_engine : { + igs_api.*(*) + } >ram86 + .text : { _ftext = . ; *(.text) diff --git a/ee_core/linkfile.igs b/ee_core/linkfile.igs deleted file mode 100755 index 5dd57da10..000000000 --- a/ee_core/linkfile.igs +++ /dev/null @@ -1,112 +0,0 @@ -/* - Copyright 2009-2010, Ifcaro, jimmikaelkael & Polo - Copyright 2006-2008 Polo - Licenced under Academic Free License version 3.0 - Review OPNPS2LD README & LICENSE files for further details. - - Copyright 2001-2004, ps2dev - http://www.ps2dev.org - Licenced under Academic Free License version 2.0 - Review ps2sdk README & LICENSE files for further details. - - Standard linkfile -*/ - -ENTRY(_start); - -MEMORY { - ram82 : ORIGIN = 0x00082000, LENGTH = 24K /* 0x00082000 - 0x00088000: probably free */ - ram88 : ORIGIN = 0x00088000, LENGTH = 60K /* 0x00088000 - 0x00097000: free */ - ramD0 : ORIGIN = 0x000D0000, LENGTH = 192K /* 0x000D0000 - 0x00100000: probably free */ -} - -SECTIONS { - .igs_engine : { - libmc.*(*) - igs_api.*(*) - } >ram82 - - .text : { - _ftext = . ; - *(EXCLUDE_FILE (libmc.*).text) - *(EXCLUDE_FILE (libmc.*).text.*) - *(.gnu.linkonce.t*) - KEEP(*(.init)) - KEEP(*(.fini)) - QUAD(0) - } >ram88 - - PROVIDE(_etext = .); - PROVIDE(etext = .); - - .reginfo : { *(.reginfo) } >ram88 - - /* Global/static constructors and deconstructors. */ - .ctors ALIGN(16): { - KEEP(*crtbegin*.o(.ctors)) - KEEP(*(EXCLUDE_FILE(*crtend*.o) .ctors)) - KEEP(*(SORT(.ctors.*))) - KEEP(*(.ctors)) - } >ram88 - .dtors ALIGN(16): { - KEEP(*crtbegin*.o(.dtors)) - KEEP(*(EXCLUDE_FILE(*crtend*.o) .dtors)) - KEEP(*(SORT(.dtors.*))) - KEEP(*(.dtors)) - } >ram88 - - /* Static data. */ - .rodata ALIGN(128): { - *(.rodata) - *(.rodata.*) - *(.gnu.linkonce.r*) - } >ram88 - - .data ALIGN(128): { - _fdata = . ; - *(.data) - *(.data.*) - *(.gnu.linkonce.d*) - SORT(CONSTRUCTORS) - } >ram88 - - .rdata ALIGN(128): { *(.rdata) } >ram88 - .gcc_except_table ALIGN(128): { *(.gcc_except_table) } >ram88 - - _gp = ALIGN(128) + 0x7ff0; - .lit4 ALIGN(128): { *(.lit4) } >ram88 - .lit8 ALIGN(128): { *(.lit8) } >ram88 - - .sdata ALIGN(128): { - *(.sdata) - *(.sdata.*) - *(.gnu.linkonce.s*) - } >ram88 - - _edata = .; - PROVIDE(edata = .); - - /* Uninitialized data. */ - .sbss ALIGN(128) : { - _fbss = . ; - *(.sbss) - *(.sbss.*) - *(.gnu.linkonce.sb*) - *(.scommon) - } >ram88 - - .bss ALIGN(128) : { - *(.bss) - *(.bss.*) - *(.gnu.linkonce.b*) - *(COMMON) - } >ram88 - _end_bss = .; - - /* Symbols needed by crt0.s. */ - PROVIDE(_heap_size = -1); - PROVIDE(_stack = .); - PROVIDE(_stack_size = 0x00097000 - _stack); /* Any remaining space up to the module storage region, is available for the stack. */ - - _end = _stack + _stack_size ; - PROVIDE(end = _end); -} diff --git a/ee_core/src/asm.S b/ee_core/src/asm.S index 16a1eb28c..9a8aed19c 100755 --- a/ee_core/src/asm.S +++ b/ee_core/src/asm.S @@ -10,9 +10,6 @@ #include #include -#define MAX_ARGS 15 -#define ARGBUF_SIZE 580 - #define COMPAT_MODE_3 0x04 // Unhook Syscalls #define COMPAT_MODE_6 0x20 // Disable IGR @@ -37,11 +34,11 @@ .extern memcpy .extern strlen .extern strncpy + .extern ExecPS2 /* syshook.c */ .extern g_argc .extern g_argv - .extern t_loadElf .extern set_reg_hook .extern iop_reboot_count .extern New_SifSetDma @@ -60,182 +57,11 @@ .extern Install_PadOpen_Hook .globl g_argbuf - .globl Hook_LoadExecPS2 .globl Hook_SifSetDma .globl Hook_SifSetReg .globl Hook_ExecPS2 .globl Hook_CreateThread - - -/* - * _LoadExecPS2: this function preserves args and change stack pointer - * before to execute t_loadElf - */ - .ent _LoadExecPS2 -_LoadExecPS2: - /* Set disable_padOpen_hook */ - la $v1, disable_padOpen_hook - addiu $v0, $zero, 1 - sw $v0, 0x0000($v1) - - /* save args, not needed to preserve sX/ra registers values as we won't return */ - daddu $s0, $a0, $zero /* ELF path */ - daddu $s1, $a1, $zero /* argc */ - daddu $s2, $a2, $zero /* argv */ - - lw $v0, DisableDebug - bne $v0, $zero, 1f - nop - - /* dark blue BG color */ - lui $v0, 0x1200 - ori $v0, $v0, 0x00e0 - lui $v1, 0x0040 - sd $v1, 0x0000($v0) - -1: - /* disable Intr */ - mfc0 $v1, EE_COP0_Status - lui $v0, 0x0010 - and $v1, $v1, $v0 - daddu $a0, $zero, $zero - beq $v1, $zero, 3f - nop -2: - di - sync.p - mfc0 $v1, EE_COP0_Status - nop - and $v1, $v1, $v0 - nop - bne $v1, $zero, 2b - nop -3: - /* entering Kernel mode */ - mfc0 $v0, EE_COP0_Status - lui $v1, 0xffff - ori $v1, $v1, 0xffe7 - and $v0, $v0, $v1 - mtc0 $v0, EE_COP0_Status - sync.p - - /* set g_argc to arg count , or MAX_ARGS if greater */ - slti $v0, $s1, MAX_ARGS+1 - addiu $v1, $zero, MAX_ARGS - movn $v1, $s1, $v0 - la $v0, g_argc - sw $v1, 0x0000($v0) - - /* pointer to g_argbuf */ - la $s3, g_argbuf - - /* clear g_argbuf */ - daddu $a0, $s3, $zero - daddu $a1, $zero, $zero - jal memset - addiu $a2, $zero, ARGBUF_SIZE - - /* copy elfname to argv[0] */ - daddu $a0, $s3, $zero - daddu $a1, $s0, $zero - jal strncpy - addiu $a2, $zero, ARGBUF_SIZE - - /* set g_argv[0] to g_argbuf */ - la $v0, g_argv - sw $s3, 0x0000($v0) - - /* increment arg buffer pointer */ - jal strlen - daddu $a0, $s0, $zero - addiu $v0, $v0, 1 - daddu $s3, $s3, $v0 - - /* increment g_argc */ - la $v1, g_argc - lw $v0, 0x0000($v1) - daddu $s4, $v0, $zero /* g_argc(-1) */ - addiu $v0, $v0, 1 - sw $v0, 0x0000($v1) - - /* copy args from main ELF to args buffer */ - blez $s4, 5f - daddu $s5, $zero, $zero /* counter */ -4: - /* get arg len and increment it */ - daddu $a0, $s2, $zero - sll $v0, $s5, 2 - daddu $a0, $a0, $v0 - jal strlen - lw $a0, 0x0000($a0) - addiu $s6, $v0, 1 /* arg len */ - - /* copy arg to main args buffer */ - daddu $a0, $s3, $zero - daddu $a1, $s2, $zero - sll $v0, $s5, 2 - daddu $a1, $a1, $v0 - lw $a1, 0x0000($a1) - jal memcpy - daddu $a2, $s6, $zero - - /* store arg pointer to g_argv[counter+1] */ - la $v0, g_argv - sll $v1, $s5, 2 - daddu $v0, $v0, $v1 - sw $s3, 0x0004($v0) - - /* increment arg buffer pointer with arg len + 1 */ - daddu $s3, $s3, $s6 - - /* loop on every args */ - addiu $s5, $s5, 1 - slt $v1, $s5, $s4 - bne $v1, $zero, 4b - nop -5: - /* exiting Kernel mode */ - mfc0 $v0, EE_COP0_Status - ori $v0, $v0, 0x0010 - mtc0 $v0, EE_COP0_Status - sync.p - - /* enable Intr */ - ei - - /* change stack pointer to top of user memory */ - lui $v0, 0x0200 - daddu $sp, $v0, $zero - - /* - * ExecPS2() does the following for us: - * - do a soft EE peripheral reset - * - terminate all threads and delete all semaphores - * - set up ELF loader thread and run it - */ - la $a0, t_loadElf - daddu $a1, $zero, $zero - daddu $a2, $zero, $zero - daddu $a3, $zero, $zero - addiu $v1, $zero, __NR__ExecPS2 - syscall - nop - - .end _LoadExecPS2 - -/* - * Hook_LoadExecPS2: exit syscall to _LoadExecPS2 - */ - .ent Hook_LoadExecPS2 -Hook_LoadExecPS2: - - /* exit syscall to _LoadExecPS2 */ - la $v1, _LoadExecPS2 - sw $v1, 8($sp) - jr $ra - nop - - .end Hook_LoadExecPS2 + .globl CleanExecPS2 /* * _SifSetDma: function designed to use our own stack during IOP reboot trap @@ -255,12 +81,9 @@ _SifSetDma: jal New_SifSetDma sd $a2, 0x0008($sp) - /* restore a2 and ra registers */ - ld $a2, 0x0008($sp) + /* restore sp and ra registers */ ld $ra, 0x0000($sp) - - /* restore the original stack pointer */ - daddu $sp, $a2, $zero + ld $sp, 0x0008($sp) jr $ra addiu $v0, $zero, 1 @@ -348,12 +171,9 @@ _Apply_Mode3: addiu $v1, $zero, __NR_FlushCache syscall - /* restore a0 and ra registers */ - ld $a0, 0x0008($sp) + /* restore sp and ra registers */ ld $ra, 0x0000($sp) - - /* restore the original stack pointer */ - daddu $sp, $a0, $zero + ld $sp, 0x0008($sp) jr $ra addiu $v0, $zero, 1 @@ -418,22 +238,21 @@ Hook_SifSetReg: Hook_ExecPS2: /* not needed to preserve sX/ra registers values as ExecPS2 won't return */ - daddu $s0, $a0, $zero - daddu $s1, $a1, $zero - daddu $s2, $a2, $zero - daddu $s3, $a3, $zero /* check entry point is >= 0x00100000 */ lui $v0, 0x0010 - sltu $v0, $s0, $v0 + sltu $v0, $a0, $v0 bne $v0, $zero, 1f - nop + daddu $s0, $a0, $zero #entrypoint + + daddu $s1, $a1, $zero #gp + daddu $s2, $a2, $zero #argc /* check compat mode 6 is disabled */ lw $v0, g_compat_mask andi $v0, $v0, COMPAT_MODE_6 bne $v0, $zero, 1f - nop + daddu $s3, $a3, $zero #argv /* save original stack pointer */ daddu $s4, $sp, $zero @@ -449,16 +268,18 @@ Hook_ExecPS2: la $v1, padOpen_hooked sw $v0, 0x0000($v1) - /* restore stack pointer */ - daddu $sp, $s4, $zero + /* Restore arguments */ + daddu $a0, $s0, $zero #entrypoint + daddu $a1, $s1, $zero #gp + daddu $a2, $s2, $zero #argc + + jal InitRegsExecPS2 + daddu $a3, $s3, $zero #argv 1: /* call ExecPS2 */ - daddu $a0, $s0, $zero - daddu $a1, $s1, $zero - daddu $a2, $s2, $zero lw $v0, Old_ExecPS2 jr $v0 - daddu $a3, $s3, $zero + nop .end Hook_ExecPS2 @@ -496,7 +317,7 @@ Hook_CreateThread: /* change the stack pointer */ la $sp, _end - /* preserves ra, a1 and a0 registers values */ + /* preserves ra, a1 (sp) and a0 registers values */ addiu $sp, $sp, -0x20 sd $ra, 0x0000($sp) sd $a1, 0x0008($sp) @@ -510,13 +331,11 @@ Hook_CreateThread: la $v1, padOpen_hooked sw $v0, 0x0000($v1) - /* restore a0, a1 and ra registers */ + /* restore a0, sp and ra registers */ ld $a0, 0x0010($sp) - ld $a1, 0x0008($sp) ld $ra, 0x0000($sp) + ld $sp, 0x0008($sp) - /* restore the original stack pointer */ - daddu $sp, $a1, $zero 2: /* call CreateThread */ lw $v0, Old_CreateThread @@ -525,16 +344,92 @@ Hook_CreateThread: .end Hook_CreateThread +.ent CleanExecPS2 +CleanExecPS2: + jal InitRegsExecPS2 + nop -/************************************************************************** - * - * COMMON section - * - **************************************************************************/ - - .section COMMON -g_argbuf: - .space (ARGBUF_SIZE) + j ExecPS2 + por $ra, $zero, $zero + +.end CleanExecPS2 + +.ent InitRegsExecPS2 +InitRegsExecPS2: + /* Erase all registers, so that all games will have the same boot state regardless of whatever OPL was doing. + Note: Sony added something like this at the start of crt0 for newer SDK releases. But older games will still not have this. + While this is not as clean, it is the best thing to do without changing the game. */ + por $at, $zero, $zero + por $v0, $zero, $zero + por $v1, $zero, $zero + #por $a0, $zero, $zero #Used for entrypoint + #por $a1, $zero, $zero #Used for gp + #por $a2, $zero, $zero #Used for argc + #por $a3, $zero, $zero #Used for argv + por $t0, $zero, $zero + por $t1, $zero, $zero + por $t2, $zero, $zero + por $t3, $zero, $zero + por $t4, $zero, $zero + por $t5, $zero, $zero + por $t6, $zero, $zero + por $t7, $zero, $zero + por $s0, $zero, $zero + por $s1, $zero, $zero + por $s2, $zero, $zero + por $s3, $zero, $zero + por $s4, $zero, $zero + por $s5, $zero, $zero + por $s6, $zero, $zero + por $s7, $zero, $zero + por $t8, $zero, $zero + por $t9, $zero, $zero + por $gp, $zero, $zero + la $sp, _end #Reset SP to top of stack + por $fp, $zero, $zero + #por $ra, $zero, $zero #Required for returning + mthi $zero + mthi1 $zero + mtlo $zero + mtlo1 $zero + mtsah $zero, 0 + mtc1 $zero, $f0 + mtc1 $zero, $f1 + mtc1 $zero, $f2 + mtc1 $zero, $f3 + mtc1 $zero, $f4 + mtc1 $zero, $f5 + mtc1 $zero, $f6 + mtc1 $zero, $f7 + mtc1 $zero, $f8 + mtc1 $zero, $f9 + mtc1 $zero, $f10 + mtc1 $zero, $f11 + mtc1 $zero, $f12 + mtc1 $zero, $f13 + mtc1 $zero, $f14 + mtc1 $zero, $f15 + mtc1 $zero, $f16 + mtc1 $zero, $f17 + mtc1 $zero, $f18 + mtc1 $zero, $f19 + mtc1 $zero, $f20 + mtc1 $zero, $f21 + mtc1 $zero, $f22 + mtc1 $zero, $f23 + mtc1 $zero, $f24 + mtc1 $zero, $f25 + mtc1 $zero, $f26 + mtc1 $zero, $f27 + mtc1 $zero, $f28 + mtc1 $zero, $f29 + mtc1 $zero, $f30 + mtc1 $zero, $f31 + adda.s $f0, $f1 #Clear facc + sync.p + jr $ra + ctc1 $zero, $f31 +.end InitRegsExecPS2 .set pop diff --git a/ee_core/src/crt0.s b/ee_core/src/crt0.s index 83b4fde1c..cd85fccdc 100755 --- a/ee_core/src/crt0.s +++ b/ee_core/src/crt0.s @@ -8,6 +8,7 @@ # Review ps2sdk README & LICENSE files for further details. # # Modified crt0.s +# Changed zerobss to only erase bss if not done once before. Otherwise, variables will lose their values whenever LoadExecPS2 is invoked. # Remove _ps2sdk_args_parse, _ps2sdk_libc_init and _ps2sdk_libc_deinit weak functions for size optimization .weak _init @@ -19,6 +20,7 @@ .extern _heap_size .extern _stack .extern _stack_size + .extern _isInit .set noat .set noreorder @@ -32,6 +34,11 @@ .globl _start .ent _start _start: + la $4, isInit + lw $5, ($4) + + bnez $5, 2f #Skip if already initialized. + nop zerobss: # clear bss area diff --git a/ee_core/src/igs_api.c b/ee_core/src/igs_api.c index e80ac3054..630a0d2e3 100644 --- a/ee_core/src/igs_api.c +++ b/ee_core/src/igs_api.c @@ -24,7 +24,7 @@ #include "include/igs_api.h" -inline void FastDelay(int count) +static void FastDelay(int count) { int i, ret; @@ -35,7 +35,7 @@ inline void FastDelay(int count) } } -_IGS_ENGINE_ void BlinkColour(u8 x, u32 colour, u8 forever) +static _IGS_ENGINE_ void BlinkColour(u8 x, u32 colour, u8 forever) { u8 i; do { @@ -50,7 +50,7 @@ _IGS_ENGINE_ void BlinkColour(u8 x, u32 colour, u8 forever) } while (forever); } -_IGS_ENGINE_ u32 FindEmptyArea(u32 start, u32 end, u32 emptysize) +static _IGS_ENGINE_ u32 FindEmptyArea(u32 start, u32 end, u32 emptysize) { u128 *addr = (u128 *)start; u32 counter = 0; @@ -80,7 +80,7 @@ _IGS_ENGINE_ u32 FindEmptyArea(u32 start, u32 end, u32 emptysize) return result; } -_IGS_ENGINE_ void ClearBuffer(u8 *buffer, u32 size) +static _IGS_ENGINE_ void ClearBuffer(u8 *buffer, u32 size) { u32 i; for (i = 0; i < size; i++) { @@ -88,36 +88,7 @@ _IGS_ENGINE_ void ClearBuffer(u8 *buffer, u32 size) } } -_IGS_ENGINE_ void DisableInterrupts() -{ - int eie; - asm volatile("mfc0\t%0, $12" - : "=r"(eie)); - eie &= 0x10000; - if (!eie) - return; - asm(".p2align 3"); - do { - asm volatile("di"); - asm volatile("sync.p"); - asm volatile("mfc0\t%0, $12" - : "=r"(eie)); - eie &= 0x10000; - } while (eie); - return; -} - -_IGS_ENGINE_ void EnableInterrupts() -{ - int eie; - asm volatile("mfc0\t%0, $12" - : "=r"(eie)); - eie &= 0x10000; - if (eie) - asm volatile("ei"); -} - -_IGS_ENGINE_ void u8todecstr(u8 input, char *output, u8 digits) +static _IGS_ENGINE_ void u8todecstr(u8 input, char *output, u8 digits) { u8 i = digits; //Number of digits (output) do { @@ -132,7 +103,7 @@ _IGS_ENGINE_ void u8todecstr(u8 input, char *output, u8 digits) output[digits] = 0; } -_IGS_ENGINE_ void u16todecstr(u16 input, char *output, u8 digits) +static _IGS_ENGINE_ void u16todecstr(u16 input, char *output, u8 digits) { u8 i = digits; //Number of digits (output) do { @@ -147,7 +118,7 @@ _IGS_ENGINE_ void u16todecstr(u16 input, char *output, u8 digits) output[digits] = 0; } -_IGS_ENGINE_ void u32todecstr(u32 input, char *output, u8 digits) +static _IGS_ENGINE_ void u32todecstr(u32 input, char *output, u8 digits) { u8 i = digits; //Number of digits (output) do { @@ -162,7 +133,7 @@ _IGS_ENGINE_ void u32todecstr(u32 input, char *output, u8 digits) output[digits] = 0; } -_IGS_ENGINE_ void u32tohexstr(u32 input, char *output, u8 digits) +static _IGS_ENGINE_ void u32tohexstr(u32 input, char *output, u8 digits) { u8 i = digits; //Number of digits (output) do { @@ -177,7 +148,7 @@ _IGS_ENGINE_ void u32tohexstr(u32 input, char *output, u8 digits) output[digits] = 0; } -_IGS_ENGINE_ void u64tohexstr(u64 input, char *output, u8 digits) +static _IGS_ENGINE_ void u64tohexstr(u64 input, char *output, u8 digits) { u8 i = digits; //Number of digits (output) do { @@ -192,7 +163,7 @@ _IGS_ENGINE_ void u64tohexstr(u64 input, char *output, u8 digits) output[digits] = 0; } -_IGS_ENGINE_ u8 PixelSize(u8 spsm) +static _IGS_ENGINE_ u8 PixelSize(u8 spsm) { u8 result = 0; if (spsm == GS_PSM_CT32) @@ -206,7 +177,7 @@ _IGS_ENGINE_ u8 PixelSize(u8 spsm) return result; } -_IGS_ENGINE_ void Screenshot(u16 sbp, u8 sbw, u8 spsm, u16 width, u16 height, u32 dimensions, u8 pixel_size, u32 image_size, u128 *buffer) +static _IGS_ENGINE_ void Screenshot(u16 sbp, u8 sbw, u8 spsm, u16 width, u16 height, u32 dimensions, u8 pixel_size, u32 image_size, u128 *buffer) { delay(1); @@ -365,7 +336,7 @@ _IGS_ENGINE_ void Screenshot(u16 sbp, u8 sbw, u8 spsm, u16 width, u16 height, u3 *GS_VIF1_FIFO = *(u128 *)EnableGIFPATH3; } -_IGS_ENGINE_ void ConvertColors32(u32 *buffer, u32 dimensions) +static _IGS_ENGINE_ void ConvertColors32(u32 *buffer, u32 dimensions) { u32 i; u32 x32; @@ -377,11 +348,9 @@ _IGS_ENGINE_ void ConvertColors32(u32 *buffer, u32 dimensions) FastDelay(1); GS_BGCOLOUR = (0x0000FF - (255 * (i + 1) / dimensions) * 0x000001); //Red Fade Out Effect } - FlushCache(0); - FlushCache(2); } -_IGS_ENGINE_ void ConvertColors24(u8 *buffer, u32 image_size) +static _IGS_ENGINE_ void ConvertColors24(u8 *buffer, u32 image_size) { u32 i; u32 x32 __attribute__((aligned(16))); @@ -395,11 +364,9 @@ _IGS_ENGINE_ void ConvertColors24(u8 *buffer, u32 image_size) FastDelay(1); GS_BGCOLOUR = (0x00FF00 - (255 * (i + 1) / image_size) * 0x000100); //Green Fade Out Effect } - FlushCache(0); - FlushCache(2); } -_IGS_ENGINE_ void ConvertColors16(u16 *buffer, u32 dimensions) +static _IGS_ENGINE_ void ConvertColors16(u16 *buffer, u32 dimensions) { u32 i; u16 x16; @@ -411,11 +378,9 @@ _IGS_ENGINE_ void ConvertColors16(u16 *buffer, u32 dimensions) FastDelay(1); GS_BGCOLOUR = (0xFF0000 - (255 * (i + 1) / dimensions) * 0x010000); //Blue Fade Out Effect } - FlushCache(0); - FlushCache(2); } -_IGS_ENGINE_ void SaveTextFile(u32 buffer, u16 width, u16 height, u8 pixel_size, u32 image_size, u8 Number) +static _IGS_ENGINE_ void SaveTextFile(u32 buffer, u16 width, u16 height, u8 pixel_size, u32 image_size, u8 Number) { delay(1); @@ -599,7 +564,7 @@ _IGS_ENGINE_ void SaveTextFile(u32 buffer, u16 width, u16 height, u8 pixel_size, GS_BGCOLOUR = 0x000000; //Black } -_IGS_ENGINE_ u8 SaveBitmapFile(u16 width, u16 height, u8 pixel_size, void *buffer, u8 intffmd) +static _IGS_ENGINE_ u8 SaveBitmapFile(u16 width, u16 height, u8 pixel_size, void *buffer, u8 intffmd) { delay(1); @@ -721,7 +686,7 @@ _IGS_ENGINE_ u8 SaveBitmapFile(u16 width, u16 height, u8 pixel_size, void *buffe _IGS_ENGINE_ int InGameScreenshot(void) { - DisableInterrupts(); + DI(); u64 pmode; u64 smode2; @@ -781,24 +746,24 @@ _IGS_ENGINE_ int InGameScreenshot(void) // Color Space conversion from BGR to RGB (i.e. little endian => big endian) switch (spsm) { case GS_PSM_CT32: - buffer32 = (u32 *)buffer; + buffer32 = (u32 *)UNCACHED_SEG(buffer); ConvertColors32(buffer32, dimensions); break; //32-bit PS2 BGR (PSMCT32 = 0, pixel_size=4) to BMP RGB conversion case GS_PSM_CT24: - buffer8 = (u8 *)buffer; + buffer8 = (u8 *)UNCACHED_SEG(buffer); ConvertColors24(buffer8, image_size); break; //24-bit PS2 BGR (PSMCT24 = 1, pixel_size=3) to BMP RGB conversion case GS_PSM_CT16: - buffer16 = (u16 *)buffer; + buffer16 = (u16 *)UNCACHED_SEG(buffer); ConvertColors16(buffer16, dimensions); break; //16-bit PS2 BGR (PSMCT16 = 2, pixel_size=2) to BMP RGB conversion case GS_PSM_CT16S: - buffer16 = (u16 *)buffer; + buffer16 = (u16 *)UNCACHED_SEG(buffer); ConvertColors16(buffer16, dimensions); break; //16-bit PS2 BGRA (PSMCT16S = 10, pixel_size=2) to BMP RGB conversion } - EnableInterrupts(); + EI(); delay(1); GS_BGCOLOUR = 0x660033; //Midnight Blue @@ -807,13 +772,6 @@ _IGS_ENGINE_ int InGameScreenshot(void) LoadFileInit(); LoadModule("rom0:SIO2MAN", 0, NULL); LoadModule("rom0:MCMAN", 0, NULL); - LoadModule("rom0:MCSERV", 0, NULL); - -#ifdef _DTL_T10000 - mcInit(MC_TYPE_XMC); -#else - mcInit(MC_TYPE_MC); -#endif //Save IGS Bitmap File first, since it's the bigger file) intffmd = GET_SMODE2_INTFFMD(smode2); @@ -828,7 +786,6 @@ _IGS_ENGINE_ int InGameScreenshot(void) // Exit services fioExit(); LoadFileExit(); - SifExitIopHeap(); SifExitRpc(); FlushCache(0); FlushCache(2); diff --git a/ee_core/src/main.c b/ee_core/src/main.c index fb508520b..3ee5ce664 100644 --- a/ee_core/src/main.c +++ b/ee_core/src/main.c @@ -19,16 +19,17 @@ #endif void *ModStorageStart, *ModStorageEnd; +void *eeloadCopy, *initUserMemory; -int main(int argc, char **argv) +int isInit = 0; + +static int eecoreInit(int argc, char **argv) { - char ElfPath[32]; + SifInitRpc(0); DINIT(); DPRINTF("OPL EE core start!\n"); - SifInitRpc(0); - int i = 0; if (!_strncmp(argv[i], "USB_MODE", 8)) @@ -45,13 +46,7 @@ int main(int argc, char **argv) DPRINTF("Debug Colors disabled\n"); } - PS2Logo = 0; - if (!_strncmp(&argv[i][11], "1", 1)) { - PS2Logo = 1; - DPRINTF("PS2 Logo enabled\n"); - } - - char *p = _strtok(&argv[i][13], " "); + char *p = _strtok(&argv[i][11], " "); if (!_strncmp(p, "Browser", 7)) ExitPath[0] = '\0'; else @@ -90,19 +85,16 @@ int main(int argc, char **argv) i++; + eeloadCopy = (void *)_strtoui(_strtok(argv[i], " ")); + initUserMemory = (void *)_strtoui(_strtok(NULL, " ")); + i++; + ModStorageStart = (void *)_strtoui(_strtok(argv[i], " ")); ModStorageEnd = (void *)_strtoui(_strtok(NULL, " ")); i++; - argv[i][11] = 0x00; // fix for 8+3 filename. - _strcpy(ElfPath, "cdrom0:\\"); - _strcat(ElfPath, argv[i]); - _strcat(ElfPath, ";1"); strncpy(GameID, argv[i], sizeof(GameID) - 1); GameID[sizeof(GameID) - 1] = '\0'; - DPRINTF("Elf path = '%s'\n", ElfPath); - DPRINTF("Game ID = '%s'\n", GameID); - i++; // bitmask of the compat. settings @@ -130,6 +122,7 @@ int main(int argc, char **argv) smode2 = _strtoui(_strtok(NULL, " ")); dx_offset = _strtoui(_strtok(NULL, " ")); dy_offset = _strtoui(_strtok(NULL, " ")); + i++; UpdateGSMParams(interlace, mode, ffmd, display, syncv, smode2, dx_offset, dy_offset); EnableGSM(); @@ -147,23 +140,24 @@ int main(int argc, char **argv) SifExitRpc(); - DPRINTF("Executing '%s'...\n", ElfPath); - - //PS2LOGO Caller, based on l_oliveira & SP193 tips - if (PS2Logo) { - char *argvs[1]; - argvs[0] = ElfPath; - argvs[1] = NULL; - LoadExecPS2("rom0:PS2LOGO", 1, argvs); - } else { - LoadExecPS2(ElfPath, 0, NULL); - } - - if (!DisableDebug) - GS_BGCOLOUR = 0x0000ff; //Red - DPRINTF("LoadExecPS2 failed!\n"); + return i; +} - SleepThread(); +int main(int argc, char **argv) +{ + int argOffset; + + //Ignore argv[0], as it contains the name of this module ("EELOAD") + argv++; + argc--; + if(!isInit) + { + argOffset = eecoreInit(argc - 1, &argv[1]); + isInit = 1; + } else + argOffset = 0; + + sysLoadElf(argv[0], argc - 1 - argOffset, &argv[1 + argOffset]); return 0; } diff --git a/ee_core/src/modmgr.c b/ee_core/src/modmgr.c index 6a7e8f234..12a0464b2 100644 --- a/ee_core/src/modmgr.c +++ b/ee_core/src/modmgr.c @@ -55,7 +55,7 @@ int LoadModule(const char *path, int arg_len, const char *args) struct _lf_module_load_arg arg; if (LoadFileInit() < 0) - return -E_LIB_API_INIT; + return -SCE_EBINDMISS; memset(&arg, 0, sizeof arg); @@ -69,7 +69,7 @@ int LoadModule(const char *path, int arg_len, const char *args) arg.p.arg_len = 0; if (SifCallRpc(&_lf_cd, LF_F_MOD_LOAD, 0x0, &arg, sizeof(arg), &arg, 8, NULL, NULL) < 0) - return -E_SIF_RPC_CALL; + return -SCE_ECALLMISS; return arg.p.result; } @@ -84,7 +84,7 @@ int LoadMemModule(int mode, void *modptr, unsigned int modsize, int arg_len, con int dma_id; if (LoadFileInit() < 0) - return -E_LIB_API_INIT; + return -SCE_EBINDMISS; /* Round the size up to the nearest 16 bytes. */ // modsize = (modsize + 15) & -16; @@ -121,7 +121,7 @@ int LoadMemModule(int mode, void *modptr, unsigned int modsize, int arg_len, con arg.q.arg_len = 0; if (SifCallRpc(&_lf_cd, LF_F_MOD_BUF_LOAD, mode, &arg, sizeof(arg), &arg, 8, NULL, NULL) < 0) - return -E_SIF_RPC_CALL; + return -SCE_ECALLMISS; if (!(mode & SIF_RPC_M_NOWAIT)) SifFreeIopHeap(iopmem); @@ -168,7 +168,7 @@ int LoadElf(const char *path, t_ExecData *data) struct _lf_elf_load_arg arg; if (LoadFileInit() < 0) - return -E_LIB_API_INIT; + return -SCE_EBINDMISS; u32 secname = 0x6c6c61; /* "all" */ @@ -178,17 +178,15 @@ int LoadElf(const char *path, t_ExecData *data) arg.secname[LF_ARG_MAX - 1] = 0; if (SifCallRpc(&_lf_cd, LF_F_ELF_LOAD, 0, &arg, sizeof arg, &arg, sizeof(t_ExecData), NULL, NULL) < 0) - return -E_SIF_RPC_CALL; + return -SCE_ECALLMISS; - if (arg.p.result < 0) - return arg.p.result; + if (arg.epc != 0) { + data->epc = arg.epc; + data->gp = arg.gp; - if (data) { - data->epc = arg.p.epc; - data->gp = arg.gp; - } - - return 0; + return 0; + } else + return -SCE_ELOADMISS; } /*----------------------------------------------------------------------------------------*/ diff --git a/ee_core/src/padhook.c b/ee_core/src/padhook.c index 15f83387f..6215bfa4d 100644 --- a/ee_core/src/padhook.c +++ b/ee_core/src/padhook.c @@ -50,7 +50,7 @@ static powerbuttondata_t Power_Button; static int IGR_Thread_ID = -1; /* IGR thread stack & stack size */ -#define IGR_STACK_SIZE (16 * 512) +#define IGR_STACK_SIZE (16 * 192) static u8 IGR_Stack[IGR_STACK_SIZE] __attribute__((aligned(16))); /* Extern symbol */ @@ -118,9 +118,11 @@ static void t_loadElf(void) argv[0] = ExitPath; argv[1] = NULL; + FlushCache(0); + ret = LoadElf(argv[0], &elf); - if (!ret && elf.epc) { + if (!ret) { // Exit services LoadFileExit(); diff --git a/ee_core/src/patches.c b/ee_core/src/patches.c index 7f7d26fa2..fa04cef41 100644 --- a/ee_core/src/patches.c +++ b/ee_core/src/patches.c @@ -10,6 +10,8 @@ #include "ee_core.h" #include "util.h" +#include "modules.h" +#include "modmgr.h" #define ALL_MODE -1 @@ -36,6 +38,8 @@ typedef struct #define PATCH_SRW_IMPACT 0x0021e808 #define PATCH_RNC_UYA 0x00398498 #define PATCH_ZOMBIE_ZONE 0xEEE62525 +#define PATCH_DOT_HACK 0x0D074A37 +#define PATCH_SOS 0x30303030 static const patchlist_t patch_list[] = { {"SLES_524.58", USB_MODE, {PATCH_GENERIC_NIS, 0x00000000, 0x00000000}}, // Disgaea Hour of Darkness PAL - disable cdvd timeout stuff @@ -90,6 +94,13 @@ static const patchlist_t patch_list[] = { {"SLES_544.61", ALL_MODE, {PATCH_ZOMBIE_ZONE, 0x001b3e20, 0x00000000}}, // Zombie Hunters {"SLPM_625.25", ALL_MODE, {PATCH_ZOMBIE_ZONE, 0x001b1dc0, 0x00000000}}, // Simple 2000 Series Vol. 61: The Oneechanbara {"SLPM_626.38", ALL_MODE, {PATCH_ZOMBIE_ZONE, 0x001b355c, 0x00000000}}, // Simple 2000 Series Vol. 80: The Oneechanpuruu + {"SLES_522.37", ALL_MODE, {PATCH_DOT_HACK, 0x00000000, 0x00000000}}, // .hack//Infection PAL + {"SLES_524.67", ALL_MODE, {PATCH_DOT_HACK, 0x00000000, 0x00000000}}, // .hack//Mutation PAL + {"SLES_524.69", ALL_MODE, {PATCH_DOT_HACK, 0x00000000, 0x00000000}}, // .hack//Outbreak PAL + {"SLES_524.68", ALL_MODE, {PATCH_DOT_HACK, 0x00000000, 0x00000000}}, // .hack//Quarantine PAL + {"SLUS_205.61", ALL_MODE, {PATCH_SOS, 0x00000001, 0x00000000}}, // Disaster Report + {"SLES_513.01", ALL_MODE, {PATCH_SOS, 0x00000002, 0x00000000}}, // SOS: The Final Escape + {"SLPS_251.13", ALL_MODE, {PATCH_SOS, 0x00000000, 0x00000000}}, // Zettai Zetsumei Toshi {NULL, 0, {0x00000000, 0x00000000, 0x00000000}} // terminater }; @@ -99,6 +110,7 @@ static const patchlist_t patch_list[] = { static int (*cdRead)(u32 lsn, u32 nsectors, void *buf, int *mode); static unsigned int g_delay_cycles; +static int g_mode; //Patch may use this for anything. // Nippon Ichi Software games generic patch to disable cdvd timeout static void NIS_generic_patches(void) @@ -349,6 +361,58 @@ static void ZombieZone_patches(unsigned int address) } } +static void DotHack_patches(const char *path) +{ //.hack (PAL) has a multi-language selector that boots the main ELF. However, it does not call scePadEnd() before LoadExecPS2() + //We only want to patch the language selector and nothing else! + static u32 patch[] = { + 0x00000000, //jal scePadEnd() + 0x00000000, //nop + 0x27a40020, //addiu $a0, $sp, $0020 (Contains boot path) + 0x0000282d, //move $a1, $zero + 0x00000000, //j LoadExecPS2() + 0x0000302d, //move $a2, $zero + }; + u32 *ptr, *pPadEnd, *pLoadExecPS2; + + if (_strcmp(path, "cdrom0:\\SLES_522.37;1") == 0) + { + ptr = (void*)0x0011a5fc; + pPadEnd = (void*)0x00119290; + pLoadExecPS2 = (void*)FNADDR(ptr[2]); + } + else if (_strcmp(path, "cdrom0:\\SLES_524.67;1") == 0) + { + ptr = (void*)0x0011a8bc; + pPadEnd = (void*)0x00119550; + pLoadExecPS2 = (void*)FNADDR(ptr[2]); + } + else if (_strcmp(path, "cdrom0:\\SLES_524.68;1") == 0) + { + ptr = (void*)0x00111d34; + pPadEnd = (void*)0x001109b0; + pLoadExecPS2 = (void*)FNADDR(ptr[3]); + } + else if (_strcmp(path, "cdrom0:\\SLES_524.69;1") == 0) + { + ptr = (void*)0x00111d34; + pPadEnd = (void*)0x001109b0; + pLoadExecPS2 = (void*)FNADDR(ptr[3]); + } + else + { + ptr = NULL; + pPadEnd = NULL; + pLoadExecPS2 = NULL; + } + + if (ptr != NULL && pPadEnd != NULL && pLoadExecPS2 != NULL) + { + patch[0] = JAL((u32)pPadEnd); + patch[4] = JMP((u32)pLoadExecPS2); + memcpy(ptr, patch, sizeof(patch)); + } +} + // Skip Bink (.BIK) Videos // This patch is expected to work with all games using ChoosePlayMovie statements, for instance: // SLUS_215.41(Ratatouille), SLES_541.72 (Garfield 2), SLES_555.22 (UP), SLUS_217.36(Wall-E), SLUS_219.31 (Toy Story 3) @@ -399,7 +463,93 @@ int Skip_Videos_sceMpegIsEnd(void) return 0; } -void apply_patches(void) +static int SOS_SifLoadModuleHook(const char *path, int arg_len, const char *args, int *modres, +int fno) +{ + int (*_pSifLoadModule)(const char *path, int arg_len, const char *args, int *modres, int fno); + void *(*pSifAllocIopHeap)(int size); + int (*pSifFreeIopHeap)(void *addr); + int (*pSifLoadModuleBuffer)(void *ptr, int arg_len, const char *args); + void *iopmem; + SifDmaTransfer_t sifdma; + int dma_id, ret, ret2; + void *iremsndpatch_irx; + unsigned int iremsndpatch_irx_size; + + switch(g_mode) + { + case 0: //NTSC-J + _pSifLoadModule = (void*)0x001d0680; + pSifAllocIopHeap = (void*)0x001cfc30; + pSifFreeIopHeap = (void*)0x001cfd20; + pSifLoadModuleBuffer = (void*)0x001d0640; + break; + case 1: //NTSC-U/C + _pSifLoadModule = (void*)0x001d0580; + pSifAllocIopHeap = (void*)0x001cfb30; + pSifFreeIopHeap = (void*)0x001cfc20; + pSifLoadModuleBuffer = (void*)0x001d0540; + break; + case 2: //PAL + _pSifLoadModule = (void*)0x001d11c0; + pSifAllocIopHeap = (void*)0x001d0770; + pSifFreeIopHeap = (void*)0x001d0860; + pSifLoadModuleBuffer = (void*)0x001d1180; + break; + default: + _pSifLoadModule = NULL; + pSifAllocIopHeap = NULL; + pSifFreeIopHeap = NULL; + pSifLoadModuleBuffer = NULL; + } + + ret = _pSifLoadModule(path, arg_len, args, modres, fno); + + if((ret >= 0) && (_pSifLoadModule != NULL) && (_strcmp(path, "cdrom0:\\IOP\\IREMSND.IRX;1") == 0)) + { + GetOPLModInfo(OPL_MODULE_ID_IOP_PATCH, &iremsndpatch_irx, &iremsndpatch_irx_size); + + iopmem = pSifAllocIopHeap(iremsndpatch_irx_size); + if(iopmem != NULL) + { + sifdma.src = iremsndpatch_irx; + sifdma.dest = iopmem; + sifdma.size = iremsndpatch_irx_size; + sifdma.attr = 0; + do { + dma_id = SifSetDma(&sifdma, 1); + } while (!dma_id); + + do { + ret2 = pSifLoadModuleBuffer(iopmem, 0, NULL); + } while (ret2 < 0); + + pSifFreeIopHeap(iopmem); + } + } + + return ret; +} + +static void SOSPatch(int region) +{ + g_mode = region; + + switch(region) + { // JAL SOS_SifLoadModuleHook - replace call to _SifLoadModule. + case 0: //NTSC-J + _sw(JAL((u32)&SOS_SifLoadModuleHook), 0x001d08b4); + break; + case 1: //NTSC-U/C + _sw(JAL((u32)&SOS_SifLoadModuleHook), 0x001d07b4); + break; + case 2: //PAL + _sw(JAL((u32)&SOS_SifLoadModuleHook), 0x001d13f4); + break; + } +} + +void apply_patches(const char *path) { const patchlist_t *p; @@ -431,6 +581,11 @@ void apply_patches(void) case PATCH_ZOMBIE_ZONE: ZombieZone_patches(p->patch.val); break; + case PATCH_DOT_HACK: + DotHack_patches(path); + case PATCH_SOS: + SOSPatch(p->patch.val); + break; default: // Single-value patches if (_lw(p->patch.addr) == p->patch.check) _sw(p->patch.val, p->patch.addr); diff --git a/ee_core/src/syshook.c b/ee_core/src/syshook.c index 26ec0e1ca..a364feadb 100644 --- a/ee_core/src/syshook.c +++ b/ee_core/src/syshook.c @@ -21,11 +21,6 @@ #include #include -#define MAX_ARGS 15 - -int g_argc; -char *g_argv[1 + MAX_ARGS]; - int set_reg_hook; int set_reg_disabled; int iop_reboot_count = 0; @@ -34,6 +29,7 @@ int padOpen_hooked = 0; int disable_padOpen_hook = 1; extern void *ModStorageStart, *ModStorageEnd; +extern void *eeloadCopy, *initUserMemory; /*----------------------------------------------------------------------------------------*/ /* This function is called when SifSetDma catches a reboot request. */ @@ -64,9 +60,6 @@ static void WipeUserMemory(void *start, void *end) unsigned int i; for (i = (unsigned int)start; i < (unsigned int)end; i += 64) { - if (i == (unsigned int)ModStorageStart) - i = (unsigned int)ModStorageEnd; - __asm__ __volatile__( "\tsq $0, 0(%0) \n" "\tsq $0, 16(%0) \n" @@ -75,11 +68,13 @@ static void WipeUserMemory(void *start, void *end) } } -void t_loadElf(void) +void sysLoadElf(char *filename, int argc, char **argv) { int r; t_ExecData elf; + SifInitRpc(0); + DPRINTF("t_loadElf()\n"); ResetSPU(); @@ -95,7 +90,7 @@ void t_loadElf(void) SifInitRpc(0); LoadFileInit(); - DPRINTF("t_loadElf: elf path = '%s'\n", g_argv[0]); + DPRINTF("t_loadElf: elf path = '%s'\n", filename); if (!DisableDebug) GS_BGCOLOUR = 0x00ff00; //Green @@ -104,22 +99,22 @@ void t_loadElf(void) // wipe user memory WipeUserMemory((void *)&_end, (void *)ModStorageStart); - WipeUserMemory((void *)ModStorageEnd, (void *)GetMemorySize()); + //The upper half (from ModStorageEnd to GetMemorySize()) is taken care of by LoadExecPS2(). + //WipeUserMemory((void *)ModStorageEnd, (void *)GetMemorySize()); FlushCache(0); - FlushCache(2); DPRINTF(" done\n"); DPRINTF("t_loadElf: loading elf..."); - r = LoadElf(g_argv[0], &elf); + r = LoadElf(filename, &elf); - if ((!r) && (elf.epc)) { + if (!r) { DPRINTF(" done\n"); DPRINTF("t_loadElf: trying to apply patches...\n"); // applying needed patches - apply_patches(); + apply_patches(filename); FlushCache(0); FlushCache(2); @@ -133,7 +128,7 @@ void t_loadElf(void) disable_padOpen_hook = 0; DPRINTF("t_loadElf: executing...\n"); - ExecPS2((void *)elf.epc, (void *)elf.gp, g_argc, g_argv); + CleanExecPS2((void *)elf.epc, (void *)elf.gp, argc, argv); } DPRINTF(" failed\n"); @@ -143,6 +138,29 @@ void t_loadElf(void) SleepThread(); } +static void unpatchEELOADCopy(void) +{ + vu32 *p = (vu32*)eeloadCopy; + + p[1] = 0x0240302D; /* daddu a2, s2, zero */ + p[2] = 0x8FA50014; /* lw a1, 0x0014(sp) */ + p[3] = 0x8C67000C; /* lw a3, 0x000C(v1) */ +} + +static void unpatchInitUserMemory(void) +{ + vu16 *p = (vu16*)initUserMemory; + + /* + * Reset the start of user memory to 0x00082000, by changing the immediate value being loaded into $a0. + * lui $a0, 0x0008 + * jal InitializeUserMemory + * ori $a0, $a0, 0x2000 + */ + p[0] = 0x0008; + p[4] = 0x2000; +} + /*----------------------------------------------------------------------------------------*/ /* Replace SifSetDma, SifSetReg, LoadExecPS2 syscalls in kernel. (Game Loader) */ /* Replace CreateThread and ExecPS2 syscalls in kernel. (In Game Reset) */ @@ -155,9 +173,6 @@ void Install_Kernel_Hooks(void) Old_SifSetReg = GetSyscallHandler(__NR_SifSetReg); SetSyscall(__NR_SifSetReg, &Hook_SifSetReg); - Old_LoadExecPS2 = GetSyscallHandler(__NR__LoadExecPS2); - SetSyscall(__NR__LoadExecPS2, &Hook_LoadExecPS2); - // If IGR is enabled hook ExecPS2 & CreateThread syscalls if (!(g_compat_mask & COMPAT_MODE_6)) { Old_CreateThread = GetSyscallHandler(__NR_CreateThread); @@ -176,11 +191,23 @@ void Remove_Kernel_Hooks(void) { SetSyscall(__NR_SifSetDma, Old_SifSetDma); SetSyscall(__NR_SifSetReg, Old_SifSetReg); - SetSyscall(__NR__LoadExecPS2, Old_LoadExecPS2); + + DI(); + ee_kmode_enter(); + + unpatchEELOADCopy(); + unpatchInitUserMemory(); + + ee_kmode_exit(); + EI(); // If IGR is enabled unhook ExecPS2 & CreateThread syscalls if (!(g_compat_mask & COMPAT_MODE_6)) { SetSyscall(__NR_CreateThread, Old_CreateThread); SetSyscall(__NR__ExecPS2, Old_ExecPS2); } + + FlushCache(0); + FlushCache(2); } + diff --git a/ee_core/src/util.c b/ee_core/src/util.c index 4dd611036..1c8ce47fe 100644 --- a/ee_core/src/util.c +++ b/ee_core/src/util.c @@ -363,7 +363,7 @@ void CopyToIop(void *eedata, unsigned int size, void *iopptr) /*----------------------------------------------------------------------------------------*/ /* NOP delay. */ /*----------------------------------------------------------------------------------------*/ -inline void delay(int count) +void delay(int count) { int i, ret; diff --git a/include/extern_irx.h b/include/extern_irx.h index 9106ea992..5c3e50d73 100644 --- a/include/extern_irx.h +++ b/include/extern_irx.h @@ -58,6 +58,9 @@ extern int size_ioptrap_irx; extern void *isofs_irx; extern int size_isofs_irx; +extern void *iremsndpatch_irx; +extern int size_iremsndpatch_irx; + extern void *mcman_irx; extern int size_mcman_irx; diff --git a/include/system.h b/include/system.h index 52b3547f8..d1526845b 100644 --- a/include/system.h +++ b/include/system.h @@ -17,13 +17,7 @@ void sysReset(int modload_mask); void sysExecExit(); void sysPowerOff(void); -#ifdef VMC -#define MCEMU int size_mcemu_irx, void **mcemu_irx, -#else -#define MCEMU -#endif - -void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, MCEMU int EnablePS2Logo, unsigned int compatflags); +void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx, int EnablePS2Logo, unsigned int compatflags); int sysExecElf(char *path); //START of OPL_DB tweaks diff --git a/modules/debug/tifinet.irx b/modules/debug/tifinet.irx index 1d3255a38ec246563db17f00e8438b036cef8faa..6288817d95d3cec10084a4b588de609cba3822cf 100755 GIT binary patch delta 1065 zcmZuvOK1~O6g_V;lcXj>szDoQA=A7zS#(itg)XWLZAHYY2rk4HEVT<4LB&>x5J(nX z1e7E)OFxL%ZY+&$U0U3Bq0)s*1;rLzxDZt6ZajDLx)2=Za^5@lopbM+nv0}c z$XYIWo99ajsn^&4+KK9O^mIpn8G4Ckif4EpQvXljb-7KzEgZL!u%zcY`)f#@3LDn# z0a>g$W>L@(VJ>wVzXGpY44#1VhmSq_n1jl|vRxo<$84R%AWeaTz#%Cl1-imQ!2U39 z(+m0dzkG#GS$=&T8aSwiU0*Z>g23WeZBHt;|I5o)wT=ELs%beFgLg!bx82}vH~1$s zc-xIQzC=c_nZIiM75rJdKeub>*3n(bk6&;&IQX>{<`xaE)`usZ`7jW%9<-~ypIhjb=y}R^J>z++YuaFR20(kjlpe$ zJ4AHFA!k3DfE`*|p+k_Pxl%=h76q#aE!v?&QKne6|a8WuqxCn{}4h01j9EAA1$=Ai>UY_rs_kG^K@4jX~W|uO? z?EUPNF}r^Ifibq#e3|dZMr^=V-cl6~9A&~%!*~@J@H`&EW?VAh_F+A4HWR9xDm9WA zX`Jv9%FFpMVXB2xDLQW+nOue6!%YaunYq~hfepQ{lg;J-& zMpb(_7F)h-QV@!;Cq0gzP5-bYcnHqkdaU9Khm>Kx0+?)q$$-7c9q_7hQuR!$0I)km zdjM5W{>QuUx$q$Rp6Iq)qeT0y?m<~X(8`%XwM#Ox@F787T*ylcd8r{UE#xJJNqkE9 z(FJR;=Zo%eo}EdwWVx!(pXsyUN3nH$z%qF5kX2g6KH}~qyL#c%j0tp1Iyz{diF%!V z(VQKarWtM6@AN8w%|)kVm~%6mZ#xDJV>U86Zx}&ztFt+hZq-Hygzn*U3bYW!JR)ubhf=Qdir ztNFC>Km{2&Fd#=1VSy%XDw^{o_ROPtwGHjwbvi hqVO{`$2tZ~YsYnQaMGLNAeQBuf(7{|)}m4O(Lb$9pCteQ diff --git a/modules/iopcore/cdvdman/Makefile b/modules/iopcore/cdvdman/Makefile index d691d6887..2b88dbd4e 100644 --- a/modules/iopcore/cdvdman/Makefile +++ b/modules/iopcore/cdvdman/Makefile @@ -9,13 +9,14 @@ # $Id: $ IOP_OBJS = cdvdman.o streaming.o ioplib_util.o smsutils.o imports.o exports.o +USE_DEV9 ?= 0 ifeq ($(USE_HDD),1) IOP_BIN = hdd_cdvdman.irx IOP_OBJNAME = obj.hdd/ -IOP_OBJS += device-hdd.o dev9.o atad.o +IOP_OBJS += device-hdd.o atad.o IOP_CFLAGS += -DHDD_DRIVER -IOP_CFLAGS += -D__USE_DEV9 +USE_DEV9 = 1 endif ifeq ($(USE_HDPRO),1) @@ -24,17 +25,16 @@ IOP_OBJNAME = obj.hdpro/ IOP_OBJS += device-hdd.o hdpro_atad.o IOP_CFLAGS += -DHDD_DRIVER -DHD_PRO ifeq ($(IOPCORE_DEBUG),1) -IOP_OBJS += dev9.o -IOP_CFLAGS += -D__USE_DEV9 +USE_DEV9 = 1 endif endif ifeq ($(USE_SMB),1) IOP_BIN = smb_cdvdman.irx IOP_OBJNAME = obj.smb/ -IOP_OBJS += device-smb.o dev9.o smb.o +IOP_OBJS += device-smb.o smb.o IOP_CFLAGS += -DSMB_DRIVER -IOP_CFLAGS += -D__USE_DEV9 +USE_DEV9 = 1 IOP_INCS += -I../../network/common endif @@ -44,8 +44,7 @@ IOP_OBJNAME = obj.usb/ IOP_OBJS += device-usb.o mass_driver.o IOP_CFLAGS += -DUSB_DRIVER ifeq ($(IOPCORE_DEBUG),1) -IOP_OBJS += dev9.o -IOP_CFLAGS += -D__USE_DEV9 +USE_DEV9 = 1 endif endif @@ -59,6 +58,11 @@ ifeq ($(IOPCORE_DEBUG),1) IOP_CFLAGS += -D__IOPCORE_DEBUG endif +ifeq ($(USE_DEV9),1) +IOP_OBJS += dev9.o +IOP_CFLAGS += -D__USE_DEV9 +endif + ifeq ($(VMC),1) IOP_CFLAGS += -DVMC_DRIVER endif diff --git a/modules/iopcore/patches/iremsndpatch/Makefile b/modules/iopcore/patches/iremsndpatch/Makefile new file mode 100644 index 000000000..0910a7f58 --- /dev/null +++ b/modules/iopcore/patches/iremsndpatch/Makefile @@ -0,0 +1,14 @@ +IOP_BIN = iremsndpatch.irx +IOP_OBJS = main.o imports.o + +IOP_INCS += +IOP_CFLAGS += -Os -Wall -fno-builtin +IOP_LDFLAGS += -s + +all: $(IOP_BIN) + +clean: + -rm -f $(IOP_OBJS) $(IOP_BIN) + +include $(PS2SDK)/Defs.make +include ../../../Rules.make diff --git a/modules/iopcore/patches/iremsndpatch/imports.lst b/modules/iopcore/patches/iremsndpatch/imports.lst new file mode 100644 index 000000000..aeedfd001 --- /dev/null +++ b/modules/iopcore/patches/iremsndpatch/imports.lst @@ -0,0 +1,8 @@ +loadcore_IMPORTS_start +I_GetLoadcoreInternalData +loadcore_IMPORTS_end + +thbase_IMPORTS_start +I_WakeupThread +thbase_IMPORTS_end + diff --git a/modules/iopcore/patches/iremsndpatch/irx_imports.h b/modules/iopcore/patches/iremsndpatch/irx_imports.h new file mode 100644 index 000000000..ea8e3f61d --- /dev/null +++ b/modules/iopcore/patches/iremsndpatch/irx_imports.h @@ -0,0 +1,23 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# $Id: irx_imports.h 577 2004-09-14 14:41:46Z pixel $ +# Defines all IRX imports. +*/ + +#ifndef IOP_IRX_IMPORTS_H +#define IOP_IRX_IMPORTS_H + +#include "irx.h" + +/* Please keep these in alphabetical order! */ +#include +#include + +#endif /* IOP_IRX_IMPORTS_H */ diff --git a/modules/iopcore/patches/iremsndpatch/main.c b/modules/iopcore/patches/iremsndpatch/main.c new file mode 100644 index 000000000..7019a4fa7 --- /dev/null +++ b/modules/iopcore/patches/iremsndpatch/main.c @@ -0,0 +1,64 @@ +#include +#include + +#define JAL(addr) (0x0c000000 | (((addr)&0x03ffffff) >> 2)) +#define JMP(addr) (0x08000000 | (0x3ffffff & ((addr) >> 2))) + +/* There was a memo dated July 2000, which went along the lines of saying that the atick functions of modmidi and modhsyn should be called, + if related sequence data is stopped and removed. + + The explanation was that these modules only process sequence data when their atick functions are called. + If data is removed and their atick functions are not called before further calls to the library are made, + then the correct operation of the library cannot be guaranteed because the data would be dequeued. + + By logging the commands issued to the RPC server of IREMSND, it can be established that the game eventually calls sndIopSesqCmd_STOPSE. + But sndIopSesqCmd_STOPSE does not ever call the modseseq and/or modhsyn atick functions! + + So to correct this, we wake up the tick thread, after the sndIopSesqCmd_STOPSE or sndIopSesqCmd_STOPSEID RPC functions are called. + While Sony also documented that this could cause a change in tempo, it is a small price to pay for such a simple fix. */ + +static int *tickThreadId; + +static int postStopSeseqTick(void) +{ + WakeupThread(*tickThreadId); + return 1; +} + +int _start(int argc, char **argv) +{ + lc_internals_t *lc; + ModuleInfo_t *m, *prevM; + u16 lo16, hi16; + + lc = GetLoadcoreInternalData(); + + //Locate the last-registered module. + m = lc->image_info; + prevM = NULL; + while(m->next != NULL) + { + prevM = m; + m = m->next; + } + m = prevM; + + if (m != NULL) + { + //Generate pointer to the threadId variable. + hi16 = *(vu16*)(m->text_start + 0x00000ac0); + lo16 = *(vu16*)(m->text_start + 0x00000ac4); + tickThreadId = (int*)(((u32)hi16 << 16) | lo16); + + //Apply patch on module. + //sndIopSesqCmd_STOPSE + *(vu32*)(m->text_start + 0x00001f4c) = JMP((u32)&postStopSeseqTick); + //sndIopSesqCmd_STOPSEID + *(vu32*)(m->text_start + 0x00001ff8) = JMP((u32)&postStopSeseqTick); + + return MODULE_RESIDENT_END; + } + + return MODULE_NO_RESIDENT_END; +} + diff --git a/modules/iopcore/udnl/IOPRP_DECI2.img b/modules/iopcore/udnl/IOPRP_DECI2.img index 5418242a699e90142691b789a9addd06dc1d14e1..f0524660426ac9c7d7bb87b779a616b3c6a6cd3f 100644 GIT binary patch delta 4938 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 RM>~=w{}XU2OD1p6`d?xkg+TxS diff --git a/modules/iopcore/udnl/Makefile b/modules/iopcore/udnl/Makefile index 424877311..39720d631 100755 --- a/modules/iopcore/udnl/Makefile +++ b/modules/iopcore/udnl/Makefile @@ -14,7 +14,7 @@ endif all: $(IOP_BIN) clean: - rm -f $(IOP_BIN) $(IOP_OBJS) IOPRP_img.c IOPRP_DECI2_img.c + rm -f $(IOP_BIN) $(IOP_OBJS) IOPRP_img.c IOPRP_DECI2_img.c IOPRP_DECI2_img.o IOPRP_img.o IOPRP_img.c: $(BIN2C) IOPRP.img IOPRP_img.c IOPRP_img diff --git a/modules/network/SMSTCPIP/Makefile b/modules/network/SMSTCPIP/Makefile index 250b530d6..9821e5182 100755 --- a/modules/network/SMSTCPIP/Makefile +++ b/modules/network/SMSTCPIP/Makefile @@ -1,3 +1,9 @@ +#Enable to reduce memory usage (in-game use). +INGAME_DRIVER ?= 0 + +#Enable to enable support for packet input from the interrupt context. +INTERRUPT_CTX_INPKT ?= 1 + IOP_BIN = SMSTCPIP.irx IOP_OBJS = ps2ip.o inet.o ip.o ip_addr.o ip_frag.o etharp.o tcp_in.o tcp_out.o \ tcp.o tcpip.o mem.o api_lib.o api_msg.o sockets.o netif.o udp.o memp.o \ @@ -13,6 +19,10 @@ ifeq ($(INGAME_DRIVER),1) IOP_CFLAGS += -DINGAME_DRIVER endif +ifeq ($(INTERRUPT_CTX_INPKT),1) +IOP_CFLAGS += -DINTERRUPT_CTX_INPKT +endif + all: $(IOP_BIN) clean: diff --git a/modules/network/SMSTCPIP/ps2ip.c b/modules/network/SMSTCPIP/ps2ip.c index 13c34ebc7..f41f836a1 100644 --- a/modules/network/SMSTCPIP/ps2ip.c +++ b/modules/network/SMSTCPIP/ps2ip.c @@ -81,7 +81,7 @@ static int inline IsMessageBoxEmpty(sys_mbox_t apMBox) return apMBox->u16Last == apMBox->u16First; } /* end IsMessageBoxEmpty */ -#ifdef INGAME_DRIVER +#ifdef INTERRUPT_CTX_INPKT void PostInputMSG(sys_mbox_t pMBox, void *pvMSG) { @@ -149,7 +149,7 @@ int ps2ip_setconfig(t_ip_info *pInfo) } /* end ps2ip_setconfig */ -#ifdef INGAME_DRIVER +#ifdef INTERRUPT_CTX_INPKT typedef struct InputMSG { struct pbuf *pInput; diff --git a/src/ethsupport.c b/src/ethsupport.c index c29774530..ece2cf720 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -697,10 +697,10 @@ static void ethLaunchGame(int id, config_set_t *configSet) #ifdef VMC #define ETH_MCEMU size_mcemu_irx, &smb_mcemu_irx, #else -#define ETH_MCEMU +#define ETH_MCEMU 0, NULL, #endif - sysLaunchLoaderElf(filename, "ETH_MODE", size_smb_cdvdman_irx, &smb_cdvdman_irx, ETH_MCEMU EnablePS2Logo, compatmask); + sysLaunchLoaderElf(filename, "ETH_MODE", size_smb_cdvdman_irx, &smb_cdvdman_irx, ETH_MCEMU EnablePS2Logo, compatmask); } static config_set_t *ethGetConfig(int id) diff --git a/src/hddsupport.c b/src/hddsupport.c index 288e58914..486f888d5 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -414,7 +414,7 @@ static void hddLaunchGame(int id, config_set_t *configSet) #ifdef VMC #define HDD_MCEMU size_mcemu_irx, &hdd_mcemu_irx, #else -#define HDD_MCEMU +#define HDD_MCEMU 0, NULL, #endif sysLaunchLoaderElf(filename, "HDD_MODE", size_irx, irx, HDD_MCEMU EnablePS2Logo, compatMode); diff --git a/src/system.c b/src/system.c index baee059bc..ea0d9b063 100644 --- a/src/system.c +++ b/src/system.c @@ -334,19 +334,57 @@ void sysExecExit() #define CORE_IRX_DEBUG 0x20 #define CORE_IRX_DECI2 0x40 -#ifdef VMC -static unsigned int sendIrxKernelRAM(unsigned int modules, void *ModuleStorage, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx) -{ // Send IOP modules that core must use to Kernel RAM -#else -static unsigned int sendIrxKernelRAM(unsigned int modules, void *ModuleStorage, int size_cdvdman_irx, void **cdvdman_irx) +typedef struct +{ + char *game; + char *mode; + void *module; + int *module_size; +} patchlist_t; + +//Blank string for mode = all modes. +static const patchlist_t iop_patch_list[] = { + {"SLUS_205.61", "", &iremsndpatch_irx, &size_iremsndpatch_irx}, //Disaster Report + {"SLES_513.01", "", &iremsndpatch_irx, &size_iremsndpatch_irx}, //SOS: The Final Escape + {"SLPS_251.13", "", &iremsndpatch_irx, &size_iremsndpatch_irx}, //Zettai Zetsumei Toshi + {NULL, NULL, NULL, NULL }, //Terminator +}; + +static unsigned int addIopPatch(const char *mode_str, const char *startup, irxptr_t *tab) +{ + const patchlist_t *p; + int i; + + for (i = 0; iop_patch_list[i].game != NULL; i++) + { + p = &iop_patch_list[i]; + + if (!strcmp(p->game, startup) && (p->mode[0] == '\0' || !strcmp(p->mode, startup))) + { + tab->info = (*(p->module_size)) | SET_OPL_MOD_ID(OPL_MODULE_ID_IOP_PATCH); + tab->ptr = (void *)p->module; + return 1; + } + } + + return 0; +} + +static unsigned int sendIrxKernelRAM(const char *startup, const char *mode_str, unsigned int modules, void *ModuleStorage, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx) { // Send IOP modules that core must use to Kernel RAM -#endif irxtab_t *irxtable; irxptr_t *irxptr_tab; void *irxptr, *ioprp_image; int i, modcount; unsigned int curIrxSize, size_ioprp_image, total_size; + if (!strcmp(mode_str, "USB_MODE")) + modules |= CORE_IRX_USB; + else if (!strcmp(mode_str, "ETH_MODE")) + modules |= CORE_IRX_ETH | CORE_IRX_SMB; + else + modules |= CORE_IRX_HDD; + irxtable = (irxtab_t *)ModuleStorage; irxptr_tab = (irxptr_t *)((unsigned char *)irxtable + sizeof(irxtab_t)); ioprp_image = malloc(size_IOPRP_img + size_cdvdman_irx + size_cdvdfsv_irx + 256); @@ -371,22 +409,19 @@ static unsigned int sendIrxKernelRAM(unsigned int modules, void *ModuleStorage, irxptr_tab[modcount++].ptr = pusbd_irx; } if (modules & CORE_IRX_ETH) { -#ifdef __DECI2_DEBUG //FIXME: I don't know why, but the ingame SMAP driver cannot be used with the DECI2 modules. Perhaps that old bug with the network stack become unresponsive gets triggered? Until this is solved, use the normal SMAP driver. - irxptr_tab[modcount].info = size_smap_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_SMAP); - irxptr_tab[modcount++].ptr = (void *)&smap_irx; -#else irxptr_tab[modcount].info = size_smap_ingame_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_SMAP); irxptr_tab[modcount++].ptr = (void *)&smap_ingame_irx; -#endif irxptr_tab[modcount].info = size_ingame_smstcpip_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_SMSTCPIP); irxptr_tab[modcount++].ptr = (void *)&ingame_smstcpip_irx; + } + if (modules & CORE_IRX_SMB) { irxptr_tab[modcount].info = size_smbinit_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_SMBINIT); irxptr_tab[modcount++].ptr = (void *)&smbinit_irx; } #ifdef VMC if (modules & CORE_IRX_VMC) { irxptr_tab[modcount].info = size_mcemu_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_MCEMU); - irxptr_tab[modcount++].ptr = (void *)mcemu_irx; + irxptr_tab[modcount++].ptr = (void *)&mcemu_irx; } #endif @@ -420,6 +455,8 @@ static unsigned int sendIrxKernelRAM(unsigned int modules, void *ModuleStorage, #endif #endif + modcount += addIopPatch(mode_str, startup, &irxptr_tab[modcount]); + irxtable->modules = irxptr_tab; irxtable->count = modcount; @@ -427,10 +464,10 @@ static unsigned int sendIrxKernelRAM(unsigned int modules, void *ModuleStorage, //For DECI2 debugging mode, the UDNL module will have to be stored within kernel RAM because there isn't enough space below user RAM. //total_size will hence not include the IOPRP image, but it's okay because the EE core is interested in protecting the module storage within user RAM. irxptr = (void *)0x00033000; - LOG("SYSTEM DECI2 UDNL address start: %p end: %p\n", irxptr, irxptr + GET_OPL_MOD_SIZE(irxptr_tab[OPL_MODULE_ID_UDNL].info)); + LOG("SYSTEM DECI2 UDNL address start: %p end: %p\n", irxptr, irxptr + GET_OPL_MOD_SIZE(irxptr_tab[0].info)); DI(); ee_kmode_enter(); - memcpy((void *)(0x80000000 | (unsigned int)irxptr), irxptr_tab[OPL_MODULE_ID_UDNL].ptr, GET_OPL_MOD_SIZE(irxptr_tab[OPL_MODULE_ID_UDNL].info)); + memcpy((void *)(0x80000000 | (unsigned int)irxptr), irxptr_tab[0].ptr, GET_OPL_MOD_SIZE(irxptr_tab[0].info)); ee_kmode_exit(); EI(); @@ -527,6 +564,8 @@ static void PrepareGSM(char *cmdline) What happens is that the OSD initializes the EE DECI2 TTY protocol at startup, but the EE DECI2 manager is never aware that the OSDSYS ever loads other programs. As a result, the EE kernel crashes immediately when the EE TTY gets used (when the IOP side of DECI2 comes up), when it invokes whatever that exists at the OSD's old ETTY handler's location. :( + + Must be run in kernel mode. */ static int ResetDECI2(void) { @@ -540,9 +579,6 @@ static int ResetDECI2(void) 0x34840102 //ori a0, a0, $0102 }; - DI(); - ee_kmode_enter(); - result = -1; ptr = (void *)0x80000000; for (i = 0; i < 0x20000 / 4; i++) { @@ -557,17 +593,96 @@ static int ResetDECI2(void) } } - ee_kmode_exit(); - EI(); + return result; +} +#endif + +/* Returns the patch location of LoadExecPS2(), which resides in kernel memory. + * Patches the kernel to use the EELOAD module at the specified location. + * Must be run in kernel mode. + */ +static void *initLoadExecPS2(void *new_eeload) +{ + void *result; + + /* The pattern of the code in LoadExecPS2() that prepares the kernel for copying EELOAD from rom0: */ + static const unsigned int initEELOADCopyPattern[] = { + 0x8FA30010, /* lw v1, 0x0010(sp) */ + 0x0240302D, /* daddu a2, s2, zero */ + 0x8FA50014, /* lw a1, 0x0014(sp) */ + 0x8C67000C, /* lw a3, 0x000C(v1) */ + 0x18E00009, /* blez a3, +9 <- The kernel will skip the EELOAD copying loop if the value in $a3 is less than, or equal to 0. Lets do that... */ + }; + + u32 *p; + + result = NULL; + /* Find the part of LoadExecPS2() that initilizes the EELOAD copying loop's variables */ + for(p = (u32 *)0x80001000; p < (u32 *)0x80030000; p++) + { + if(memcmp(p, &initEELOADCopyPattern, sizeof(initEELOADCopyPattern)) == 0) + { + p[1] = 0x3C120000 | (u16)((u32)new_eeload >> 16); /* lui s2, HI16(new_eeload) */ + p[2] = 0x36520000 | (u16)((u32)new_eeload & 0xFFFF); /* ori s2, s2, LO16(new_eeload) */ + p[3] = 0x24070000; /* li a3, 0 <- Disable the EELOAD copying loop */ + result = (void*)p; + break; /* All done. */ + } + } return result; } + +/* Gets the address of the jump to the function that initializes user memory. + * Pathces the kernel to begin erasure of memory from the specified address. + * Must be run in kernel mode. + */ +static void *initInitializeUserMemory(void *start) +{ + u32 *p; + void *result; + + result = NULL; + for (p = (unsigned int*)0x80001000; p < (unsigned int*)0x80030000; p++) + { + /* + * Search for function call and where $a0 is set. + * lui $a0, 0x0008 + * jal InitializeUserMemory + * ori $a0, $a0, 0x2000 + */ + if (p[0] == 0x3c040008 && (p[1] & 0xfc000000) == 0x0c000000 && p[2] == 0x34842000) { + p[0] = 0x3c040000 | ((unsigned int)start >> 16); + p[2] = 0x34840000 | ((unsigned int)start & 0xffff); + result = (void*)p; + break; + } + } + + return result; +} + +static int initKernel(void *eeload, void *modStorageEnd, void **eeloadCopy, void **initUserMemory) +{ + DI(); + ee_kmode_enter(); + +#ifdef __DECI2_DEBUG + ResetDECI2(); #endif + *eeloadCopy = initLoadExecPS2(eeload); + *initUserMemory = initInitializeUserMemory(modStorageEnd); + + ee_kmode_exit(); + EI(); + + return((*eeloadCopy != NULL && *initUserMemory != NULL) ? 0 : -1); +} -void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, MCEMU int EnablePS2Logo, unsigned int compatflags) +void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx, int EnablePS2Logo, unsigned int compatflags) { unsigned int modules, ModuleStorageSize; - void *ModuleStorage; + void *ModuleStorage, *ModuleStorageEnd; u8 local_ip_address[4], local_netmask[4], local_gateway[4]; u8 *boot_elf = NULL; elf_header_t *eh; @@ -589,15 +704,18 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo #else #define PADEMU_ARGS 0 #endif - char *argv[4 + GSM_ARGS + CHEAT_ARGS + PADEMU_ARGS]; + char ElfPath[32]; + char *argv[6 + GSM_ARGS + CHEAT_ARGS + PADEMU_ARGS]; char ModStorageConfig[32]; + char KernelConfig[32]; char config_str[256]; #ifdef GSM char gsm_config_str[256]; #endif + void *eeloadCopy, *initUserMemory; ethGetNetConfig(local_ip_address, local_netmask, local_gateway); -#ifndef __DEBUG +#if (!defined(__DEBUG) && !defined(_DTL_T10000)) AddHistoryRecordUsingFullPath(filename); #endif @@ -607,13 +725,7 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo //Wipe the low user memory region, since this region might not be wiped after OPL's EE core is installed. memset((void *)0x00082000, 0, 0x00100000 - 0x00082000); - if (!strcmp(mode_str, "USB_MODE")) - modules = CORE_IRX_USB; - else if (!strcmp(mode_str, "ETH_MODE")) - modules = CORE_IRX_ETH | CORE_IRX_SMB; - else - modules = CORE_IRX_HDD; - + modules = 0; ModuleStorage = (void *)((compatflags & COMPAT_MODE_7) ? OPL_MOD_STORAGE_HI : OPL_MOD_STORAGE); #ifdef __DECI2_DEBUG @@ -624,13 +736,12 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo #ifdef VMC modules |= CORE_IRX_VMC; - LOG("SYSTEM LaunchLoaderElf loading modules with size_mcemu_irx = %d\n", size_mcemu_irx); - ModuleStorageSize = (sendIrxKernelRAM(modules, ModuleStorage, size_cdvdman_irx, cdvdman_irx, size_mcemu_irx, mcemu_irx) + 0x3F) & ~0x3F; -#else - LOG("SYSTEM LaunchLoaderElf loading modules\n"); - ModuleStorageSize = (sendIrxKernelRAM(modules, ModuleStorage, size_cdvdman_irx, cdvdman_irx) + 0x3F) & ~0x3F; #endif - sprintf(ModStorageConfig, "%u %u", (unsigned int)ModuleStorage, (unsigned int)ModuleStorage + ModuleStorageSize); + LOG("SYSTEM LaunchLoaderElf loading modules\n"); + ModuleStorageSize = (sendIrxKernelRAM(filename, mode_str, modules, ModuleStorage, size_cdvdman_irx, cdvdman_irx, size_mcemu_irx, mcemu_irx) + 0x3F) & ~0x3F; + + ModuleStorageEnd = (void*)((u8*)ModuleStorage + ModuleStorageSize); + sprintf(ModStorageConfig, "%u %u", (unsigned int)ModuleStorage, (unsigned int)ModuleStorageEnd); if (!gDisableDebug) { char text[80]; @@ -650,11 +761,6 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo guiWarning(text, 20); } - -#ifdef __DECI2_DEBUG - ResetDECI2(); -#endif - // NB: LOADER.ELF is embedded boot_elf = (u8 *)&eecore_elf; eh = (elf_header_t *)boot_elf; @@ -673,6 +779,14 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo memset(eph[i].vaddr + eph[i].filesz, 0, eph[i].memsz - eph[i].filesz); } + //Get the kernel to use our EELOAD module and to begin erasure after module storage. EE core will erase any memory before the module storage (if any). + if(initKernel((void*)eh->entry, ModuleStorageEnd, &eeloadCopy, &initUserMemory) != 0) + { //Should not happen, but... + printf("Error - kernel is unsupported.\n"); + asm volatile("break\n"); + } + sprintf(KernelConfig, "%u %u", (unsigned int)eeloadCopy, (unsigned int)initUserMemory); + #ifdef CHEAT #define CHEAT_SPECIFIER " %u" #define CHEAT_ARGUMENT , gEnableCheat ? (unsigned int)gCheatList : 0 @@ -698,8 +812,8 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo #endif i = 0; - sprintf(config_str, "%s %d %d %s %d %u.%u.%u.%u %u.%u.%u.%u %u.%u.%u.%u %d" CHEAT_SPECIFIER GSM_SPECIFIER PADEMU_SPECIFIER, - mode_str, gDisableDebug, EnablePS2Logo, gExitPath, gHDDSpindown, + sprintf(config_str, "%s %d %s %d %u.%u.%u.%u %u.%u.%u.%u %u.%u.%u.%u %d" CHEAT_SPECIFIER GSM_SPECIFIER PADEMU_SPECIFIER, + mode_str, gDisableDebug, gExitPath, gHDDSpindown, local_ip_address[0], local_ip_address[1], local_ip_address[2], local_ip_address[3], local_netmask[0], local_netmask[1], local_netmask[2], local_netmask[3], local_gateway[0], local_gateway[1], local_gateway[2], local_gateway[3], @@ -708,6 +822,9 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo argv[i] = config_str; i++; + argv[i] = KernelConfig; + i++; + argv[i] = ModStorageConfig; i++; @@ -725,6 +842,10 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo i++; #endif + strcpy(ElfPath, "cdrom0:\\"); + strncat(ElfPath, filename, 11); // fix for 8+3 filename. + strcat(ElfPath, ";1"); + if (!gDisableDebug) { guiWarning("Let's go.", 10); // deinit stuff @@ -748,7 +869,13 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo FlushCache(0); FlushCache(2); - ExecPS2((void *)eh->entry, 0, i, argv); + //PS2LOGO Caller, based on l_oliveira & SP193 tips + if (EnablePS2Logo) { + argv[i] = ElfPath; + LoadExecPS2("rom0:PS2LOGO", i+1, argv); + } else { + LoadExecPS2(ElfPath, i, argv); + } } int sysExecElf(char *path) diff --git a/src/usbsupport.c b/src/usbsupport.c index d7c4decec..1239d919a 100644 --- a/src/usbsupport.c +++ b/src/usbsupport.c @@ -446,7 +446,7 @@ static void usbLaunchGame(int id, config_set_t *configSet) #ifdef VMC #define USB_MCEMU size_mcemu_irx, &usb_mcemu_irx, #else -#define USB_MCEMU +#define USB_MCEMU 0, NULL, #endif sysLaunchLoaderElf(filename, "USB_MODE", irx_size, irx, USB_MCEMU EnablePS2Logo, compatmask); From 68353518c8ee74fd93c398deaabc328d61dafa0f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 26 Jul 2018 07:58:42 -0700 Subject: [PATCH 108/269] update CREDITS file --- CREDITS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CREDITS b/CREDITS index 0e5f2ad64..9cd145de4 100644 --- a/CREDITS +++ b/CREDITS @@ -27,7 +27,7 @@ Other developers by BatRastard, crazyc, dlanor, doctorxyz, reprep UI design -by Berion +by Berion, Jay-Jay Quality Assurance by RandQalan, yoshi314, EP, LocalH, lee4, El_Patas, ShaolinAssassin, danielB From 9d02586abd5c3fbb0f329786c3e149bc8ad23987 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 6 Aug 2018 12:26:42 -0700 Subject: [PATCH 109/269] update lang_English.lng file --- lng/lang_English.lng | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 4550ed5bb..402c30d8c 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -39,7 +39,7 @@ Apps Theme Language The system will be powered off. -Exit to Browser/OSDSYS? +Exit to Browser? Cancel updating? %d: HardDisk Drive not detected %d: HardDisk Drive not formatted @@ -266,6 +266,8 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! From 3f014cf116b796b014921bfb562dcc28fdec8357 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 7 Aug 2018 20:13:53 -0700 Subject: [PATCH 110/269] update lang files from PS2-HOME Tranlsators --- lng/lang_Arabic.lng | 6 ++++-- lng/lang_Bulgarian.lng | 8 +++++--- lng/lang_Chinese_Simp.lng | 13 +++++++++---- lng/lang_Chinese_Trad.lng | 13 +++++++++---- lng/lang_Czech.lng | 13 +++++++++---- lng/lang_Danish.lng | 13 +++++++++---- lng/lang_Dutch.lng | 11 ++++++++--- lng/lang_Filipino.lng | 15 ++++++++++----- lng/lang_French.lng | 13 +++++++++---- lng/lang_German.lng | 13 +++++++++---- lng/lang_Greek.lng | 8 +++++--- lng/lang_Hungarian.lng | 8 +++++--- lng/lang_Indonesian.lng | 8 +++++--- lng/lang_Italian.lng | 13 +++++++++---- lng/lang_Japanese.lng | 13 +++++++++---- lng/lang_Korean.lng | 13 +++++++++---- lng/lang_Laotian.lng | 13 +++++++++---- lng/lang_Polish.lng | 13 +++++++++---- lng/lang_Portuguese.lng | 8 +++++--- lng/lang_Portuguese_BR.lng | 8 +++++--- lng/lang_Russian.lng | 8 +++++--- lng/lang_Spanish.lng | 8 +++++--- lng/lang_Swedish.lng | 8 +++++--- lng/lang_Turkish.lng | 13 +++++++++---- 24 files changed, 175 insertions(+), 85 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 9413136da..081b55322 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: 6/3/2018 -# Updated for OPL_1052_DB-TA [837ff55] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s @@ -248,6 +248,8 @@ LMP الاصدار: اختر منفذ من اجل نقر متعدد المحاكي تعطيل الحل لوحدة التحكم الوهمية بعض التحكمات تحتاج الى حل، سيؤدي هذا الخيار تعطيله +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 العاب PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index b073aeb34..a03e31833 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: 6/3/2018 -# Updated for OPL_1052_DB-TA [837ff55] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -21,7 +21,7 @@ ETH Игри Тема Език Изключване на системата? -Изход към Browser/OSDSYS? +Изход към Browser? Отмяна на обновяването? %d: Твърд Диск не е свързан. %d: Твърд Диск не е форматиран. @@ -248,6 +248,8 @@ Eмулиране на Multitap Избор на порт, на който да се емулира Multitap. Деактивиране на корекция при фалшиви DS3 Неоригинални DS3 контролери се нуждаят от тази корекция. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index d2d16b910..bc25d8453 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 3/22/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -21,7 +21,7 @@ ETH 游戏 主题 语言 系统电源将会关闭. -退出到浏览界面/OSDSYS? +退出到浏览界面? 取消更新? %d: 检测不到硬盘 %d: 硬盘没有格式化 @@ -248,9 +248,14 @@ LMP版本: 选择进行多重模拟的端口 禁用仿冒DS3手柄 这个选项将使一些仿冒的DS3手柄无法工作 +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! VCD文件'%s'没有找到! 重命名文件时发生错误. -删除文件时发生错误. \ No newline at end of file +删除文件时发生错误. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Chinese_Trad.lng b/lng/lang_Chinese_Trad.lng index 6bbac899f..c05fc4683 100644 --- a/lng/lang_Chinese_Trad.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 3/22/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -21,7 +21,7 @@ ETH 遊戲 主題 語言 系統電源將會關閉. -Exit to Browser/OSDSYS? +Exit to Browser? 取消更新? %d: 偵測不到硬碟 %d: 硬碟沒有格式化 @@ -248,9 +248,14 @@ LMP版本: 選擇進行多重模擬的端口 禁用仿冒DS3控制器 這個選項將使一些仿冒的DS3控制器無法工作 +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在'%s'上找不到! VCD档案'%s'沒有找到! 重命名档案時發生錯誤 -刪除档案時發生錯誤 \ No newline at end of file +刪除档案時發生錯誤 +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index f93a8c0bd..a88b1a41c 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -21,7 +21,7 @@ Aplikace Skin Jazyk Systém bude vypnut. -Ukončit a vrátit se do Prohlížeče/OSDSYS? +Ukončit a vrátit se do Prohlížeče? Zrušit update? %d: Harddisk nebyl detekován %d: Harddisk není naformátován @@ -248,9 +248,14 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index df754f7c8..142538931 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -21,7 +21,7 @@ Programmer Tema Sprog Systemet slukkes. -Vend tilbage til Browser/OSDSYS? +Vend tilbage til Browser? Annuller opdatering? %d: Inget harddisk drev fundet %d: Harddisk drevet er ikke formateret @@ -248,9 +248,14 @@ Multitap Emulator på port Vælg port til Multitap-emulering. Deaktiver løsning for falsk DS3 Nogle falske DS3'er har brug for en løsning, dette deaktivere den. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index 2df3c0a3f..516bce48c 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -248,9 +248,14 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 8d133a3de..d15341367 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -21,7 +21,7 @@ Apps tema wika The system will be powered off. -Exit to Browser/OSDSYS? +Exit to Browser? Cancel updating? %d: HardDisk Drive not detected %d: HardDisk Drive not formatted @@ -203,7 +203,7 @@ Re-download existing records? Update failed. Failed to connect to update server. Update completed. -Update cancelled. +Update canceled. Download settings from the network? Customized Settings Downloaded Defaults @@ -248,9 +248,14 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 23c7dddf8..ff9e97471 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -21,7 +21,7 @@ Apps Thème Langue Le système va être éteint. -Quitter vers Menu/OSDSYS? +Quitter vers Menu? Annuler mise à jour? %d: HDD non détecté %d: HDD non formaté @@ -248,9 +248,14 @@ Active/désactive l'émulation du Multitap pour le jeu sélectionné. Sélectionner le port pour émuler le Multitap Désactiver correctif des DS3 simulées Certaines DS3 simulées nécessitent ce correctif, cette option le désactivera. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 84e1a685b..d40ea181f 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and lopotri -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -21,7 +21,7 @@ Anwendungen Design Sprache Das System wird ausgeschaltet. -Verlassen und zum Browser/OSDSYS zurückkehren? +Verlassen und zum Browser zurückkehren? Aktualisierung abbrechen? %d: Festplatte nicht erkannt %d: Festplatte ist nicht formatiert @@ -248,9 +248,14 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 074a1ea05..82df89e0c 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: 6/7/2018 -# Updated for OPL_1052_DB-TA [837ff55] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -21,7 +21,7 @@ OPL %s Θέμα Γλώσσα Το σύστημα θα απενεργοποιηθεί. -Έξοδος στο Browser/OSDSYS; +Έξοδος στο Browser; Ακύρωση ενημέρωσης; %d: Δεν εντοπίστηκε Σκληρός Δίσκος. %d: Ο Σκληρός Δίσκος δεν έχει διαμορφωθεί. @@ -248,6 +248,8 @@ Multitap emulator στη θύρα Επιλέξτε θύρα για εξομοίωση Multitap. Απενεργ. workaround για ψεύτικα DS3 Κάποια ψεύτικα DS3s χρειάζονται workaround, αυτή η επιλογή θα το απενεργοποιήσει. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. Παιχνίδια PS1 Εκκίνηση μενού παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index a46a4c9da..843bb74ff 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: 6/5/2018 -# Updated for OPL_1052_DB-TA [837ff55] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -21,7 +21,7 @@ Alkalmazások Téma Nyelv A rendszer le fog állni. -Kilépés a böngészőbe/OSDSYS-be? +Kilépés a Browser-be? Frissítés visszavonása? %d: Merevlemez nem található %d: Merevlemez nincs leformázva @@ -248,6 +248,8 @@ Multitap emulátor ezen a porton Válassza ki a portot a Multitap emulációhoz. Megkerülés letiltása a hamisítvány DS3-hoz. Néhány hamis ds3-hoz megkerülés szükséges, ez az opció letiltja ezt. +FIELD flipping emulálása +Fix azon játékokhoz, melyek hibát produkálnak progresszív videó mód alatt. PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index d247b8106..24ee45c8a 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: 6/6/2018 -# Updated for OPL_1052_DB-TA [837ff55] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -21,7 +21,7 @@ Aplikasi Tema Bahasa Sistem akan dimatikan. -Keluar ke Browser /OSDSYS? +Keluar ke Browser? Batal perbarui? %d: Harddisk tak terdeteksi %d: Harddisk belum diformat @@ -248,6 +248,8 @@ emulator Multitap pada port Pilih port untuk emulasi Multitap. Nonaktifkan solusi untuk DS3 palsu beberapa ds3s palsu butuh solusi, opsi ini akan nonaktif. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index 8e8a641b2..c7a78cba3 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -21,7 +21,7 @@ Apps Tema Lingua Il sistema verrà spento. -Uscire al Browser/OSDSYS? +Uscire al Browser? Annullare l'aggiornamento? %d: Hard disk non rilevato %d: Hard disk non formattato @@ -248,9 +248,14 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index 8544486d7..b69ef02d3 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -21,7 +21,7 @@ ETHゲーム テーマ 言語 システムを終了し電源を切ります -ブラウザ/OSDSYSに戻りますか? +ブラウザに戻りますか? 変更をキャンセルしますか? %d: HDDが接続されていません %d: HDDがフォーマットされていません @@ -248,9 +248,14 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index b0a39c6f1..ff1e09fd6 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: 5/1/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -21,7 +21,7 @@ ETH 게임 테마 언어 시스템 전원이 꺼집니다. -Browser/OSDSYS 종료합니까? +Browser 종료합니까? 업데이트 취소합니까? %d: HDD를 검색할 수 없습니다 %d: HDD가 포맷되지 않았습니다 @@ -248,9 +248,14 @@ LMP 버전: 멀티탭 에뮬레이션을 위한 포트를 선택. Fake DS3에 대한 해결방법 비활성화 일부 fake ds3s는 해결 방법이 필요합니다. 이 옵션은 옵션을 비활성. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! VCD 파일 '% s'을(를) 찾을 수 없습니다! 파일 이름을 바꾸는 중 오류가 발생했습니다. -파일을 삭제하는 중 오류가 발생했습니다. \ No newline at end of file +파일을 삭제하는 중 오류가 발생했습니다. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index d808c3a90..1811b4054 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -21,7 +21,7 @@ OPL %s ຄຸນລັກສະນະຮູບຮ່າງ ພາສາ ລະບົບຈະຖືກປິດການໃຊ້ງານ -ອອກໄປສູ່ໜ້າ Browser/OSDSYS +ອອກໄປສູ່ໜ້າ Browser ຍົກເລີກການອັບເດດ? %d: ບໍ່ສາມາດຄົ້ນຫາ HardDisk ໄດ້ %d: HardDisk ຍັງບໍ່ທັນໄດ້ Format @@ -248,9 +248,14 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index 71352b8e4..c3805f64e 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -21,7 +21,7 @@ Aplikacje Motyw Język System zostanie wyłączony. -Exit to Browser/OSDSYS? +Exit to Browser? Przerwać aktualizację? %d: Nie wykryto dysku twardego %d: Dysk twardy nie jest sformatowany @@ -248,9 +248,14 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index df3eb4777..5fa39d7b4 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: 6/3/2018 -# Updated for OPL_1052_DB-TA [837ff55] +# Last update: 8/7/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -21,7 +21,7 @@ Aplicações Temas Idioma O sistema irá desligar. -Sair p/ o Browser/OSDSYS? +Sair para o Navegador? Cancelar atualização? %d: Disco Rigido não detetado %d: Disco Rigido não formatado @@ -248,6 +248,8 @@ Emulador Multitap na porta Selecionar porta para o emulador de Multitap. Desativar workaround para clones DS3 Alguns clones DS3 precisam de workaround, esta opção irá desativar-lo. +Emular inversão de CAMPO +Correção para jogos que apresentam falhas nos modos de vídeo progressivo. Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 7111b3db1..24363c425 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 6/3/2018 -# Updated for OPL_1052_DB-TA [837ff55] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -21,7 +21,7 @@ Aplicativos Tema Idioma O sistema será desligado. -Sair para o Navegador/OSDSYS? +Sair para o navegador? Cancelar atualização? Erro %d: Nenhum HD detectado. Erro %d: O HD não está formatado. @@ -248,6 +248,8 @@ Emulador Multitap na porta Selecione a porta para a emulação Multitap. Desativar solução alternativa para Controle DS3 pirata Alguns Controles DS3 piratas precisam de solução alternativa, esta opção irá desativá-lo. +Emular inversão de CAMPO +Correção para jogos que apresentam falhas nos modos de vídeo progressivo. Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 1ab148a44..eb181a8cb 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: 6/3/2018 -# Updated for OPL_1052_DB-TA [837ff55] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -21,7 +21,7 @@ HDD-Игры Тема Язык Выключить консоль. -Выйти в браузер/OSDSYS? +Выйти в браузер? Отменить обновление? %d: HardDisk не опознан %d: HardDisk не отформатирован @@ -248,6 +248,8 @@ Multitap эмулятор на порте Выбрать порт для Multitap эмуляции. Отключить работу для фальшивого DS3 Эту опцию нужно отключить, если DS3 фальшивый. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index eaac97a96..5461068ee 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: 6/3/2018 -# Updated for OPL_1052_DB-TA [837ff55] +# Last update: 8/7/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -21,7 +21,7 @@ Aplicaciones Estilo Idioma Se apagará el sistema. -¿Salir al navegador/OSDSYS? +¿Salir al navegador? ¿Cancelar actualización? %d: Disco duro no detectado %d: Disco duro no formateado @@ -248,6 +248,8 @@ Emulador multitap en el puerto Seleccione el puerto para la emulación multitap. Deshabilitar la solución provisional para DS3 falso Algunos DS3 falsos necesitan solución, esta opción lo deshabilitará. +Emular Inversión de campo +Solución para juegos que fallan con el modo de escaneo progresivo... Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 60687ec86..fb5839591 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: 6/3/2018 -# Updated for OPL_1052_DB-TA [837ff55] +# Last update: 8/7/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -21,7 +21,7 @@ Appar Tema Språk Systemet stängs av. -Avsluta till Meny/OSDSYS? +Avsluta till huvudmeny? Avbryt uppdatering? %d: Ingen Hårddisk hittad %d: Hårddisken ej formatterad @@ -248,6 +248,8 @@ Multitap emulator på porten Välj port för multitap emulering. Inaktivera lösningen för falska DS3 Några falska ds3s behöver lösningen, det här alternativet kommer att inaktivera det. +Emulera FIELD vändning +Fix för spel med problem i progressivt läge. PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index cc4b298df..94f15ec3b 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante -# Last update: 3/7/2018 -# Updated for OPL_1036_DB-TA [926069d] +# Last update: 8/6/2018 +# Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -21,7 +21,7 @@ Uygulamalar Tema Dil Çıkış işlemi gücü kapatacaktır. -Exit to Browser/OSDSYS? +Exit to Browser? Güncelleme iptal edilsinmi? %d: HardDisk sürücü bulunamadı %d: HardDisk sürücü biçimlendirilmemiş @@ -248,9 +248,14 @@ Multitap emulator on port Select port for Multitap emulation. Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. +Emulate FIELD flipping +Fix for games that glitch under progressive video modes. PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. -An error occurred while deleting the file. \ No newline at end of file +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file From 6e0b2d22fa372c258287f5b49614959511e10eac Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 9 Aug 2018 02:52:34 -0700 Subject: [PATCH 111/269] update lang files from PS2-HOME Translators --- lng/lang_Russian.lng | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index eb181a8cb..87abfb129 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,5 +1,5 @@ # Translated by druchapucha and frodosumkin -# Last update: 8/6/2018 +# Last update: 8/9/2018 # Updated for OPL_1271_DB-TA_[9d02586] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian @@ -248,8 +248,8 @@ Multitap эмулятор на порте Выбрать порт для Multitap эмуляции. Отключить работу для фальшивого DS3 Эту опцию нужно отключить, если DS3 фальшивый. -Emulate FIELD flipping -Fix for games that glitch under progressive video modes. +Эмулировать ОБЛАСТЬ обзора +Исправление для игр, где есть проблема с прогрессивным режимом. PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! From ac88664400dabc66209e3e52a4d45bd32a781a9b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 13 Aug 2018 18:13:27 -0700 Subject: [PATCH 112/269] update lang files from PS2-HOME Translators. --- lng/lang_Arabic.lng | 11 +++++++++-- lng/lang_Bulgarian.lng | 11 +++++++++-- lng/lang_Chinese_Simp.lng | 11 +++++++++-- lng/lang_Chinese_Trad.lng | 11 +++++++++-- lng/lang_Czech.lng | 11 +++++++++-- lng/lang_Danish.lng | 11 +++++++++-- lng/lang_Dutch.lng | 11 +++++++++-- lng/lang_Filipino.lng | 11 +++++++++-- lng/lang_French.lng | 11 +++++++++-- lng/lang_German.lng | 11 +++++++++-- lng/lang_Greek.lng | 11 +++++++++-- lng/lang_Hungarian.lng | 11 +++++++++-- lng/lang_Indonesian.lng | 11 +++++++++-- lng/lang_Italian.lng | 11 +++++++++-- lng/lang_Japanese.lng | 11 +++++++++-- lng/lang_Korean.lng | 11 +++++++++-- lng/lang_Laotian.lng | 11 +++++++++-- lng/lang_Polish.lng | 11 +++++++++-- lng/lang_Portuguese.lng | 11 +++++++++-- lng/lang_Portuguese_BR.lng | 11 +++++++++-- lng/lang_Russian.lng | 11 +++++++++-- lng/lang_Spanish.lng | 11 +++++++++-- lng/lang_Swedish.lng | 11 +++++++++-- lng/lang_Turkish.lng | 11 +++++++++-- 24 files changed, 216 insertions(+), 48 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 081b55322..6903506ad 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s @@ -250,6 +250,13 @@ LMP الاصدار: بعض التحكمات تحتاج الى حل، سيؤدي هذا الخيار تعطيله Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 العاب PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index a03e31833..dd16de883 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -250,6 +250,13 @@ Eмулиране на Multitap Неоригинални DS3 контролери се нуждаят от тази корекция. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index bc25d8453..62d9a6a56 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -250,6 +250,13 @@ LMP版本: 这个选项将使一些仿冒的DS3手柄无法工作 Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Chinese_Trad.lng b/lng/lang_Chinese_Trad.lng index c05fc4683..0cb1c427f 100644 --- a/lng/lang_Chinese_Trad.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -250,6 +250,13 @@ LMP版本: 這個選項將使一些仿冒的DS3控制器無法工作 Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index a88b1a41c..c44350522 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -250,6 +250,13 @@ Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index 142538931..3e0a701e3 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -250,6 +250,13 @@ Deaktiver løsning for falsk DS3 Nogle falske DS3'er har brug for en løsning, dette deaktivere den. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index 516bce48c..ecc649be2 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -250,6 +250,13 @@ Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index d15341367..2080e4230 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -250,6 +250,13 @@ Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French.lng b/lng/lang_French.lng index ff9e97471..44a10d5d6 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -250,6 +250,13 @@ Désactiver correctif des DS3 simulées Certaines DS3 simulées nécessitent ce correctif, cette option le désactivera. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_German.lng b/lng/lang_German.lng index d40ea181f..513ca51b4 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and lopotri -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -250,6 +250,13 @@ Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 82df89e0c..7569699e3 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -250,6 +250,13 @@ Multitap emulator στη θύρα Κάποια ψεύτικα DS3s χρειάζονται workaround, αυτή η επιλογή θα το απενεργοποιήσει. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: Παιχνίδια PS1 Εκκίνηση μενού παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 843bb74ff..e72e2c77e 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/11/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -250,6 +250,13 @@ Megkerülés letiltása a hamisítvány DS3-hoz. Néhány hamis ds3-hoz megkerülés szükséges, ez az opció letiltja ezt. FIELD flipping emulálása Fix azon játékokhoz, melyek hibát produkálnak progresszív videó mód alatt. +Gyerekzár Beállítások +Gyerekzár Jelszó +Hagyja üresen a gyerekzár kikapcsolásához. +Írja be a gyerekzár jelszót +Gyerekzár jelszó helytelen. +Gyerekzás kikapcsolva. +Build Opciók: PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 24ee45c8a..d7dcf81b5 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -250,6 +250,13 @@ Nonaktifkan solusi untuk DS3 palsu beberapa ds3s palsu butuh solusi, opsi ini akan nonaktif. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index c7a78cba3..c6cd292db 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -250,6 +250,13 @@ Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index b69ef02d3..4ca09590e 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -250,6 +250,13 @@ Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index ff1e09fd6..471c59d1d 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -250,6 +250,13 @@ Fake DS3에 대한 해결방법 비활성화 일부 fake ds3s는 해결 방법이 필요합니다. 이 옵션은 옵션을 비활성. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index 1811b4054..43de0a2ab 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -250,6 +250,13 @@ Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index c3805f64e..b0b7a23fd 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -250,6 +250,13 @@ Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 5fa39d7b4..7a6197389 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: 8/7/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/11/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -250,6 +250,13 @@ Desativar workaround para clones DS3 Alguns clones DS3 precisam de workaround, esta opção irá desativar-lo. Emular inversão de CAMPO Correção para jogos que apresentam falhas nos modos de vídeo progressivo. +Definições do Controlo Parental +Password do Controlo Parental +Deixe em branco para desativar o Controlo Parental. +Introduza a password do Controlo Parental +Password do Controlo Parental incorreta. +Controlo Parental desativado. +Opções de compilação: Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 24363c425..5ddf7d039 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/11/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -250,6 +250,13 @@ Desativar solução alternativa para Controle DS3 pirata Alguns Controles DS3 piratas precisam de solução alternativa, esta opção irá desativá-lo. Emular inversão de CAMPO Correção para jogos que apresentam falhas nos modos de vídeo progressivo. +Controle parental +Senha +Deixe em branco para desativar o controle parental. +Insira a senha do controle parental +Senha incorreta. +Controle parental desativado. +Opções nesta compilação: Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 87abfb129..790341869 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: 8/9/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/12/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -250,6 +250,13 @@ Multitap эмулятор на порте Эту опцию нужно отключить, если DS3 фальшивый. Эмулировать ОБЛАСТЬ обзора Исправление для игр, где есть проблема с прогрессивным режимом. +Настроить родительский контроль +Пароль для родительского контроля +Не заполняйте, чтобы выключить родительский контроль. +Родительский контроль, введите пароль +Родительский контроль, неверный пароль. +Родительский контроль выключен. +Опции сборки: PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 5461068ee..f1af2a7c9 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: 8/7/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/11/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -250,6 +250,13 @@ Deshabilitar la solución provisional para DS3 falso Algunos DS3 falsos necesitan solución, esta opción lo deshabilitará. Emular Inversión de campo Solución para juegos que fallan con el modo de escaneo progresivo... +Definiciones de control parental +Password de control parental +Dejar en blanco para desactivar control parental. +Introduzca el password de control parental +Password de control parental es incorrecto. +Control parental desactivado. +Opciones de compilación: Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index fb5839591..3e5d20a42 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: 8/7/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/11/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -250,6 +250,13 @@ Inaktivera lösningen för falska DS3 Några falska ds3s behöver lösningen, det här alternativet kommer att inaktivera det. Emulera FIELD vändning Fix för spel med problem i progressivt läge. +Föräldrakontroll +Lösenord för föräldrakontroll +Ange inget för att inaktivera funktionen +Ange lösenord för föräldrakontroll +Fel lösenord för föräldrakontroll +Föräldrakontroll inaktiverat +Bygg-Alternativ: PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index 94f15ec3b..50dd59a70 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante -# Last update: 8/6/2018 -# Updated for OPL_1271_DB-TA_[9d02586] +# Last update: 8/10/2018 +# Updated for OPL_1281_DB-TA_[aee9db0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -250,6 +250,13 @@ Disable workaround for fake DS3 Some fake ds3s need workaround, this option will disable it. Emulate FIELD flipping Fix for games that glitch under progressive video modes. +Parental Lock Settings +Parental Lock Password +Leave blank to disable the parental lock. +Enter Parental Lock Password +Parental lock password incorrect. +Parental lock disabled. +Build Options: PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! From 1e57345a1ebe6884c27c4acd496401abee29ffde Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 14 Aug 2018 19:39:18 -0700 Subject: [PATCH 113/269] update lang files from PS2-HOME Translators. --- lng/lang_Arabic.lng | 6 +- lng/lang_Bulgarian.lng | 6 +- lng/lang_Chinese_Simp.lng | 6 +- lng/lang_Chinese_Trad.lng | 6 +- lng/lang_Czech.lng | 6 +- lng/lang_Danish.lng | 6 +- lng/lang_Dutch.lng | 6 +- lng/lang_Filipino.lng | 6 +- lng/lang_French.lng | 6 +- lng/lang_German.lng | 126 ++++++++++++++++++------------------- lng/lang_Greek.lng | 24 +++---- lng/lang_Hungarian.lng | 6 +- lng/lang_Indonesian.lng | 24 +++---- lng/lang_Italian.lng | 6 +- lng/lang_Japanese.lng | 6 +- lng/lang_Korean.lng | 6 +- lng/lang_Laotian.lng | 6 +- lng/lang_Polish.lng | 6 +- lng/lang_Portuguese.lng | 6 +- lng/lang_Portuguese_BR.lng | 6 +- lng/lang_Russian.lng | 6 +- lng/lang_Spanish.lng | 6 +- lng/lang_Swedish.lng | 6 +- lng/lang_Turkish.lng | 6 +- 24 files changed, 150 insertions(+), 150 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 6903506ad..6265e12db 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s @@ -116,7 +116,7 @@ Unhook Syscalls اجتياز الفيديو محاكي DVD-DL تعطيل IGR -ارتفاع حدة التخزين +Unused إخفاء حدة dev9 تغير الحجم يؤدي الى إعادة تهيئة الـ VMC انشاء diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index dd16de883..28af14d38 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -116,7 +116,7 @@ NetBIOS 0 PSS режим Емулиране на DVD-DL Изключване на IGR -Зареждане на модулите във висока памет +Unused Скриване на модула DEV9 При промяна на обема, VMC ще бъде форматирана! Създаване diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index 62d9a6a56..738b87202 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -116,7 +116,7 @@ GUEST验证留空. 跳过 videos 模拟 DVD-DL 禁用 IGR -隐藏模式内存 +Unused 隐藏 DEV9 模式 改变大小将会重新格式化 VMC 生成 diff --git a/lng/lang_Chinese_Trad.lng b/lng/lang_Chinese_Trad.lng index 0cb1c427f..360f5675f 100644 --- a/lng/lang_Chinese_Trad.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -116,7 +116,7 @@ GUEST驗證留空. 跳过视频 模擬 DVD-DL 禁用 IGR -隱藏模式內存 +Unused 隱藏 DEV9 模式 改變大小將會重新格式化 VMC 生成 diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index c44350522..ae53d5633 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -116,7 +116,7 @@ Unhook Syscalls Přeskočit videa Emulovat DVD-DL Vypnout IGR -Vyšší adresa modulu +Unused Skrýt modul dev9 Změna velikosti přeformátuje VMC Vytvořit diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index 3e0a701e3..109ee3667 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -116,7 +116,7 @@ Frigiv syscalls Skip videoer Emulere DVD-DL Deaktivere IGR -High module lagering +Unused Skjul DEV9-modul Ændring af størrelsen vil omformatere VMC Opret diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index ecc649be2..2c05a56f6 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -116,7 +116,7 @@ Syscalls loshaken Videos overslaan Emuleer DVD-DL IGR uitschakelen -Hoge module opslag +Unused Verberg DEV9 module Het wijzigen van de grootte zal VMC formatteren Creëer diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 2080e4230..e3e7131b5 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -116,7 +116,7 @@ alisin sa pagkakakawit Syscalls Skip Videos Emulate DVD-DL Disable IGR -High module storage +Unused Hide DEV9 module Ang pagbabago ng laki ay i-reformat ang VMC Lumikha diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 44a10d5d6..67f5a6558 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -116,7 +116,7 @@ Décrocher Syscalls (purge OPL après lancement du jeu) Passer les vidéos Émuler DVD-DL (DVD9 rippés en DVD5) Désactiver IGR (incompatible avec certains jeux) -Stockage élevé (charge les modules de stockage à une adresse plus élevée) +Unused Cacher module DEV9 (Renomme le module DEV9 en CDVDMAN) Changer la taille reformatera la VMC Créer diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 513ca51b4..f34c73154 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ -# German Translation by ps2guy and lopotri -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# German Translation by ps2guy and LopoTRI +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -24,7 +24,7 @@ Das System wird ausgeschaltet. Verlassen und zum Browser zurückkehren? Aktualisierung abbrechen? %d: Festplatte nicht erkannt -%d: Festplatte ist nicht formatiert +%d: Festplatte ist nicht formatiert %d: Fehler beim Starten des Netzwerks %d: Netzwerkadapter nicht erkannt %d: Keine verbindung zum SMB Server @@ -116,7 +116,7 @@ Systemaufrufe aushängen Videos überspringen Emuliere DVD-DL Deaktiviere IGR -Erhöhte Speichermoduladresse +Unbenutzt Verstecke DEV9 Modul Ändern der Größe wird die VMC erneut formatieren! Erstellen @@ -133,7 +133,7 @@ Fortschritt VMC-Datei existiert Ungültige VMC-Datei, Größe ist nicht korrekt VMC-Datei muss erstellt werden -Fehler mit VMC %s, fahre fort mit phys. MC (Steckplatz %d)? +Fehler mit VMC %s, weiter mit phys. MC (Steckplatz %d)? Automatisch aktualisieren Über Programmierer @@ -161,14 +161,14 @@ VMC Steckplatz 2 Spiel ID DMA Modus V-Sync -Modus 1 -Modus 2 -Modus 3 -Modus 4 -Modus 5 -Modus 6 -Modus 7 -Modus 8 +Mod. 1 +Mod. 2 +Mod. 3 +Mod. 4 +Mod. 5 +Mod. 6 +Mod. 7 +Mod. 8 GSM konfigurieren ETH Geschwindigkeitsmodus 100Mbit full-duplex @@ -181,21 +181,21 @@ Schaltet GSM AN oder AUS VMODE Erzwungener benutzerdefinierter Bildschirmmodus H-POS -Horizontale Justierung +Horizontale anpassung V-POS -Vertikale Justierung -Überabtastung -Überabtastung anpassen +Vertikale anpassung +Overscan +Overscan anpassen Videosequenzen (FMV) überspringen -Überspringe Full Motion Videos +Überspringt Full Motion Videos Cheat Einstellungen Aktiviere PS2RD Cheat Engine -PS2RD Cheat Engine Spiele patcher +Lass PS2RD Cheat Engine das Spiel patchen PS2RD Cheat Engine Modus -Automatisch auswählen lassen oder Spielecheats auswählen +Automatische auswahl oder Spiele-cheats auswählen Autom. Auswahl der Cheats -Wähle Spielecheats -Fehler: Laden des Cheat-File fehlgeschlagen +Wähle Spiele-cheats +Fehler: Laden des Cheat-Files fehlgeschlagen Keine Cheats gefunden Standardeinstellungen herunterladen Netzwerkaktualisierung @@ -209,60 +209,60 @@ Benutzerdefinierte Einstellungen Standardeinstellungen heruntergeladen Automatischer Start in %i s... Automatischer Start -Wert in Sekunden (sek), 0 um Auto-start zu deaktivieren +Wert in Sekunden, 0 um Auto-start zu deaktivieren PS2 Logo -Wird nur bei gültigem Disc Logo angezeigt, welches mit der Region der Konsole übereinstimmen muss +Wird nur als gültiges Disk-Logo angezeigt, wenn es mit der Region der Konsole übereinstimmt PADEMU konfigurieren -Pad Emulator Einstellungen +Einstellungen Pad Emulator Pad Emulator aktivieren -Aktiviere/deaktiviere den Pad Emulator für das ausgewählte Spiel. +Aktiviert/Deaktiviert den Pad Emulator für das ausgewählte Spiel. Pad Emulator Modus Wähle Pad Emulator Modus DualShock3/4 USB DualShock3/4 BT Einstellungen für Anschluss: -Wähle Pad Emulator Anschluss für die Einstellungen. +Wähle Pad Emulatoranschluss für die Einstellungen. Emulation aktivieren -Aktiviert/deaktiviert den Pad Emulator für den ausgewählten Anschluss. +Aktiviert/Deaktiviert den Pad Emulator für den ausgewählten Anschluss. Vibration aktivieren -Aktiviert/deaktiviert die Vibration für den ausgewählten Anschluss. -USB Bluetooth-Aadapter MAC-Adresse: +Aktiviert/Deaktiviert die Vibration für den ausgewählten Anschluss. +USB Bluetooth-Adapter MAC-Adresse: DS Controller verbunden zur MAC-Adresse: Verbinden Verbinde DS Controller Verbinde DS Controller mit Bluetooth-Adapter MAC-Adresse. Nicht verbunden -Bluetooth adapter information -Shows more information and supported features +Bluetooth Adapter information +Zeigt mehr infos und unterstützte Funktionen HCI Version: LMP Version: -Manufacturer ID: -Support features: -Yes -No -Bluetooth adapter should be fully compatible with DS3/DS4 controllers. -Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation -Turns on/off Multitap emulation for selected game. -Multitap emulator on port -Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -Emulate FIELD flipping -Fix for games that glitch under progressive video modes. -Parental Lock Settings -Parental Lock Password -Leave blank to disable the parental lock. -Enter Parental Lock Password -Parental lock password incorrect. -Parental lock disabled. -Build Options: -PS1 Games -PS1 Games display mode -POPSTARTER.ELF not found at '%s'! -VCD file '%s' not found! -An error occurred while renaming the file. -An error occurred while deleting the file. -Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +Hersteller ID: +Unterstützt Funktionen: +Ja +Nein +Bluetooth Adapter ist voll kompatibel mit DS3/DS4 Controller. +Bluetooth Adapter funktioniert evtl nicht korrekt mit DS3/DS4 Controller. +Aktiviere Multitap emulation +Schaltet die Multitap emulation An/Aus für das ausgewählte Spiel. +Multitap emulator an Anschluss +Wähle Anschluss für Multitap emulation. +Deaktiviere Problemumgehung für gefälschten DS3 +Manche gefälschte ds3s brauchen Problemumgehung, diese Option schaltet es ab. +Emuliere Feld-spiegelung +Fix für Spiele, die Fehler unter progressivem Video modus haben. +Einstellungen Kindersicherung +Kindersicherungspasswort +Leer lassen für keine Kindersicherung. +Kindersicherungspasswort eingeben +Falsches Kindersicherungspasswort. +Kindersicherung ausgeschaltet. +Erstellungsoptionen: +PS1 Spiele +PS1 Spiele Bildschirmeinstellungs-modus +POPSTARTER.ELF nicht gefunden bei '%s'! +VCD Datei '%s' nicht gefunden! +Fehler beim umbenennen der Datei. +Fehler beim löschen der Datei. +Niemals OPEN-PS2-LOADER (OPL) kaufen, sondern frei erhältlich bei: +ifcaro OPL version bei psx-scene.com +OPL Daily Builds (DB) version bei ps2-home.com \ No newline at end of file diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 7569699e3..b9466606c 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -116,7 +116,7 @@ NetBIOS Παράλειψη των videos. Προσομοίωση DVD-DoubleLayer δίσκου. Απενεργοποίηση In-Game-Reset(IGR). -High Module Storage. +Αχρησιμοποίητο Απόκρυψη του DEV9 module. Αλλάζοντας το μέγεθος θα αναδιαμορφώστε τη VMC. Δημιουργία @@ -248,15 +248,15 @@ Multitap emulator στη θύρα Επιλέξτε θύρα για εξομοίωση Multitap. Απενεργ. workaround για ψεύτικα DS3 Κάποια ψεύτικα DS3s χρειάζονται workaround, αυτή η επιλογή θα το απενεργοποιήσει. -Emulate FIELD flipping -Fix for games that glitch under progressive video modes. -Parental Lock Settings -Parental Lock Password -Leave blank to disable the parental lock. -Enter Parental Lock Password -Parental lock password incorrect. -Parental lock disabled. -Build Options: +Εξομοίωση αντιστροφής του ΠΕΔΙΟΥ +Επιδιόρθωση για παιχνίδια που glitchάρουν υπό progressive video modes. +Ρυθμίσεις Γονικού Κλειδώματος +Κωδικός πρόσβασης Γονικού Κλειδώματος +Αφήστε το κενό για να απενεργοποιήσετε το Γονικό Κλείδωμα. +Εισάγετε τον κωδικό Γονικού Κλειδώματος +Εσφαλμένος κωδικός Γονικού Κλειδώματος. +Το Γονικό Κλείδωμα είναι απενεργοποιημένο. +Επιλογές Build: Παιχνίδια PS1 Εκκίνηση μενού παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index e72e2c77e..f6281e2b6 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: 8/11/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -116,7 +116,7 @@ Syscalls kiakasztás Videók átugrása DVD-DL emulálás IGR letiltása -Magas modul tárhely +Nem Használt DEV9 modul elrejtése A méretváltoztatás leformázza a VMC-t Létrehoz diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index d7dcf81b5..53d89b02a 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -116,7 +116,7 @@ Melepas kaitan syscalls Lewati video Emulasi DVD-DL Nonaktifkan IGR -Mode Penyimpanan Tinggi +Unused Sembunyikan mode Dev9 Mengubah ukuran akan memformat ulang VMC Membuat @@ -248,15 +248,15 @@ emulator Multitap pada port Pilih port untuk emulasi Multitap. Nonaktifkan solusi untuk DS3 palsu beberapa ds3s palsu butuh solusi, opsi ini akan nonaktif. -Emulate FIELD flipping -Fix for games that glitch under progressive video modes. -Parental Lock Settings -Parental Lock Password -Leave blank to disable the parental lock. -Enter Parental Lock Password -Parental lock password incorrect. -Parental lock disabled. -Build Options: +Emulasikan FIELD flipping +Perbaiki Game yang bermasalah di mode video progresif. +Seting kunci Parental +Kata sandi kunci parental +Kosongkan untuk non aktif kunci Parental. +Masukkan kata sandi kuci Parental +Kesalahan kata sandi kunci Parental. +Kunci Parental tidak aktif. +Opsi Bentukan: PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index c6cd292db..384be0daf 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -116,7 +116,7 @@ Unhook dalle syscalls Salta i video Disabilita DVD-DL Disabilita IGR -Moduli nell'area alta di memoria +Unused Nascondi modulo dev9 Modificare la dimensione riformatterà la VMC. Crea diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index 4ca09590e..72bf5b5fb 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -116,7 +116,7 @@ Syscallの解除 一部のムービーをスキップ 二層ディスク(DVD9)用設定 IGRを無効化 -メモリ解放 +Unused ネットワーク機能(DEV9)無効化 サイズを変更するとVMCはフォーマットされます VMCファイルを作成 diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 471c59d1d..f15e2587c 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -116,7 +116,7 @@ USB 게임 손상 검사 동영상 건너 뛰기 DV-DL 에뮬레이트 IGR 비활성 -고성능 모듈 스토리지 +Unused DEV9 모듈 숨기기 크기 변경 시 VMC 재포멧 됩니다. 생성 diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index 43de0a2ab..975756f2b 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -116,7 +116,7 @@ Unhook Syscalls ຂ້າມການຫຼິ້ນວິດິໂອ ປະມວນຜົນ DVD-DL Disable IGR -High module storage +Unused ປິດບັງ dev9 module ການປ່ຽນຂະໜາດຈະເຮັດໃຫ້ VMC(ກ້ອນເຊບສະເໝືອນຈິງ) ຖືກ format ໃໝ່ ສ້າງ diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index b0b7a23fd..d9364ce4c 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -116,7 +116,7 @@ Odhookuj Syscalls Przejdź filmy Emuluj DVD-DL Wyłącz IGR -Moduł dużej pamięci +Unused Ukryj moduł DEV9 Zmiana rozmiaru, zostanie sformatowany VMC Utwórz diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 7a6197389..9fa8316a4 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: 8/11/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -116,7 +116,7 @@ Desativar chamadas do sistema Saltar videos Emular DVD-DL Desativar IGR -Armazenamento elevado do módulo +Não utilizado Esconder módulo dev9 Alterar o tamanho (Irá reformatar o VMC!) Criar diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 5ddf7d039..6cca5d601 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 8/11/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -116,7 +116,7 @@ Desativar chamadas do sistema Pular vídeos PSS Emular DVD-DL Desabilitar IGR -Mudar módulo de armazenamento +Não utilizado Ocultar módulo dev9 Alterar o tamanho (Irá reformatar o VMC!) Criar diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 790341869..8dde3fa38 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: 8/12/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -116,7 +116,7 @@ NetBIOS Пропуск роликов Эмулировать DVD-DL Отключить использование IGR -Высокий модуль хранения +Unused Скрывать модули Dev9 При изменении размера, VMC переформатируется Создать diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index f1af2a7c9..2ed16f217 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: 8/11/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -116,7 +116,7 @@ Desvincula el sistema Apagar videos Emula DVD-DL Quita el IGR -Almacena los módulos en alta dirección de memoria +Unused Oculta el módulo DEV9 Cambiar el tamaño formateará la VMC Crear diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 3e5d20a42..2c95f0755 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: 8/11/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -116,7 +116,7 @@ Släpp Syscalls Skippa Videos Emulera DVD-DL Inaktivera IGR -Högmoduls-lagring +Används ej Göm dev9 modul Ändra storleken kommer att formatera om VMC Skapa diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index 50dd59a70..204fcca83 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante -# Last update: 8/10/2018 -# Updated for OPL_1281_DB-TA_[aee9db0] +# Last update: 8/14/2018 +# Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -116,7 +116,7 @@ Sis çağrılarını çöz Videoları atla DVD-DL i etkinleştir IGR i etkisizleştir -Uüksek konumda bellek kullanımı +Unused dev9 modulünü gizle VMC Boyutu değiştirmek VMC nin biçimlendirilmesine neden olur Oluştur From 29c5f2653f231061b8f6598ec3bd9a3f9b8b110b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 16 Aug 2018 19:53:10 -0700 Subject: [PATCH 114/269] update lang files from PS2-HOME Translators. --- lng/lang_Indonesian.lng | 4 ++-- lng/lang_Russian.lng | 4 ++-- lng/lang_Spanish.lng | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 53d89b02a..59149ca13 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,5 +1,5 @@ # translated by verislasher and jbliz -# Last update: 8/14/2018 +# Last update: 8/15/2018 # Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian @@ -116,7 +116,7 @@ Melepas kaitan syscalls Lewati video Emulasi DVD-DL Nonaktifkan IGR -Unused +Tdk terpakai Sembunyikan mode Dev9 Mengubah ukuran akan memformat ulang VMC Membuat diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 8dde3fa38..3f1e1df01 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,5 +1,5 @@ # Translated by druchapucha and frodosumkin -# Last update: 8/14/2018 +# Last update: 8/15/2018 # Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian @@ -116,7 +116,7 @@ NetBIOS Пропуск роликов Эмулировать DVD-DL Отключить использование IGR -Unused +Не используется Скрывать модули Dev9 При изменении размера, VMC переформатируется Создать diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 2ed16f217..e38243b7e 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,5 +1,5 @@ # Translation by lauchon22 -# Last update: 8/14/2018 +# Last update: 8/15/2018 # Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -108,7 +108,7 @@ Recordar último juego en uso Botón de selección Error, el juego está fragmentado Error, no se pudo iniciar el archivo -Test +Probar Dejar en blanco para autentificar como GUEST Lectura precisa Modo sincronizado @@ -116,7 +116,7 @@ Desvincula el sistema Apagar videos Emula DVD-DL Quita el IGR -Unused +Sin uso Oculta el módulo DEV9 Cambiar el tamaño formateará la VMC Crear From f6fc930d289bbcdad9040fa658004f5e321bfdf4 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 22 Aug 2018 08:53:31 -0700 Subject: [PATCH 115/269] update lang files from PS2-HOME Translators. --- lng/lang_Arabic.lng | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 6265e12db..a3a1816cb 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,5 +1,5 @@ # translation by alimadhi -# Last update: 8/14/2018 +# Last update: 8/22/2018 # Updated for OPL_1286_DB-TA_[2c8e7d0] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic @@ -21,7 +21,7 @@ OPL %s الموضوعه اللغة سوف يتوقف النضام. -؟(OSDSYS)خروج الى مستعرض +الخروج إلى المتصفح؟ الغاء التحديث؟ %d: لم يتم العثور على القرص الصلب %d: القرص الصلب غير مهيأ @@ -116,7 +116,7 @@ Unhook Syscalls اجتياز الفيديو محاكي DVD-DL تعطيل IGR -Unused +غير مستعمل إخفاء حدة dev9 تغير الحجم يؤدي الى إعادة تهيئة الـ VMC انشاء @@ -248,15 +248,15 @@ LMP الاصدار: اختر منفذ من اجل نقر متعدد المحاكي تعطيل الحل لوحدة التحكم الوهمية بعض التحكمات تحتاج الى حل، سيؤدي هذا الخيار تعطيله -Emulate FIELD flipping -Fix for games that glitch under progressive video modes. -Parental Lock Settings -Parental Lock Password -Leave blank to disable the parental lock. -Enter Parental Lock Password -Parental lock password incorrect. -Parental lock disabled. -Build Options: +محاكاة FIELD التقليب +إصلاح للألعاب التي تندرج تحت أوضاع الفيديو التدريجي. +إعدادات قفل الوالدين +كلمة مرور الوالدين قفل +اتركه فارغا لتعطيل قفل الوالدين. +أدخل كلمة مرور الوالدين قفل +كلمة مرور الوالدين قفل غير صحيحة. +تم تعطيل قفل الوالدين. +خيارات البناء: PS1 العاب PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! From 24f2d977730479749244fa9f0048c155428b2a07 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 24 Aug 2018 13:12:47 -0700 Subject: [PATCH 116/269] update lng/lang_English.lng file --- lng/lang_English.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 4f7e364d0..e854b59fe 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -275,6 +275,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! From 376d969c912feb5546adb918afe8ce1e157f5803 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 24 Aug 2018 19:29:41 -0700 Subject: [PATCH 117/269] update lang files from PS2-HOME Translators. --- lng/lang_Arabic.lng | 6 ++++-- lng/lang_Bulgarian.lng | 6 ++++-- lng/lang_Chinese_Simp.lng | 6 ++++-- lng/lang_Chinese_Trad.lng | 6 ++++-- lng/lang_Czech.lng | 6 ++++-- lng/lang_Danish.lng | 6 ++++-- lng/lang_Dutch.lng | 6 ++++-- lng/lang_Filipino.lng | 6 ++++-- lng/lang_French.lng | 6 ++++-- lng/lang_German.lng | 6 ++++-- lng/lang_Greek.lng | 6 ++++-- lng/lang_Hungarian.lng | 6 ++++-- lng/lang_Indonesian.lng | 6 ++++-- lng/lang_Italian.lng | 6 ++++-- lng/lang_Japanese.lng | 6 ++++-- lng/lang_Korean.lng | 6 ++++-- lng/lang_Laotian.lng | 6 ++++-- lng/lang_Polish.lng | 6 ++++-- lng/lang_Portuguese.lng | 6 ++++-- lng/lang_Portuguese_BR.lng | 6 ++++-- lng/lang_Russian.lng | 6 ++++-- lng/lang_Spanish.lng | 6 ++++-- lng/lang_Swedish.lng | 6 ++++-- lng/lang_Turkish.lng | 6 ++++-- 24 files changed, 96 insertions(+), 48 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index a3a1816cb..21decc44d 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: 8/22/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s @@ -257,6 +257,8 @@ LMP الاصدار: كلمة مرور الوالدين قفل غير صحيحة. تم تعطيل قفل الوالدين. خيارات البناء: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 العاب PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 28af14d38..8eb9c1f0b 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index 738b87202..e88962629 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Chinese_Trad.lng b/lng/lang_Chinese_Trad.lng index 360f5675f..4187143bb 100644 --- a/lng/lang_Chinese_Trad.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index ae53d5633..259a5dcd9 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index 109ee3667..e68598c25 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index 2c05a56f6..dfdd4ec0a 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index e3e7131b5..7da7bfb3f 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 67f5a6558..aff159ab4 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_German.lng b/lng/lang_German.lng index f34c73154..cc0b8a2ef 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -257,6 +257,8 @@ Kindersicherungspasswort eingeben Falsches Kindersicherungspasswort. Kindersicherung ausgeschaltet. Erstellungsoptionen: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index b9466606c..586ebb7f4 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -257,6 +257,8 @@ Multitap emulator στη θύρα Εσφαλμένος κωδικός Γονικού Κλειδώματος. Το Γονικό Κλείδωμα είναι απενεργοποιημένο. Επιλογές Build: +Σφάλμα - αυτός ο κωδικός πρόσβασης δεν μπορεί να χρησιμοποιηθεί. +Το αρχείο VMC %s είναι κατακερματισμένο. Συνέχεια με την Κάρτα Μνήμης στην υποδοχή %d; Παιχνίδια PS1 Εκκίνηση μενού παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index f6281e2b6..4a345275b 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -257,6 +257,8 @@ Hagyja üresen a gyerekzár kikapcsolásához. Gyerekzár jelszó helytelen. Gyerekzás kikapcsolva. Build Opciók: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 59149ca13..0b6423ad6 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: 8/15/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -257,6 +257,8 @@ Masukkan kata sandi kuci Parental Kesalahan kata sandi kunci Parental. Kunci Parental tidak aktif. Opsi Bentukan: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index 384be0daf..2bc4c74ee 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index 72bf5b5fb..e310fbfb3 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index f15e2587c..a0bb28066 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index 975756f2b..7632f7e4e 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index d9364ce4c..c90fa4300 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 9fa8316a4..637f1429a 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -257,6 +257,8 @@ Introduza a password do Controlo Parental Password do Controlo Parental incorreta. Controlo Parental desativado. Opções de compilação: +Erro - esta password não pode ser usada. +O ficheiro VMC %s está fragmentado. Continuar com o Cartão de Memoria na ranhura %d? Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 6cca5d601..2240513ab 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -257,6 +257,8 @@ Insira a senha do controle parental Senha incorreta. Controle parental desativado. Opções nesta compilação: +Erro - esta senha não pode ser usada. +O arquivo VMC %s está fragmentado. Continuar com o cartão de memória na entrada %d? Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 3f1e1df01..5cbb577ca 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: 8/15/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -257,6 +257,8 @@ Multitap эмулятор на порте Родительский контроль, неверный пароль. Родительский контроль выключен. Опции сборки: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index e38243b7e..10bff14bf 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: 8/15/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -257,6 +257,8 @@ Introduzca el password de control parental Password de control parental es incorrecto. Control parental desactivado. Opciones de compilación: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 2c95f0755..923056253 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -257,6 +257,8 @@ Ange lösenord för föräldrakontroll Fel lösenord för föräldrakontroll Föräldrakontroll inaktiverat Bygg-Alternativ: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index 204fcca83..78809203d 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante -# Last update: 8/14/2018 -# Updated for OPL_1286_DB-TA_[2c8e7d0] +# Last update: 8/24/2018 +# Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -257,6 +257,8 @@ Enter Parental Lock Password Parental lock password incorrect. Parental lock disabled. Build Options: +Error - this password cannot be used. +VMC %s file is fragmented. Continue with Memory Card in slot %d? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! From eb9d24841ae83002b0d43aa42fe2679c3bff1dfd Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 27 Aug 2018 19:07:55 -0700 Subject: [PATCH 118/269] update lang files from PS2-HOME Translators. --- lng/lang_German.lng | 6 +++--- lng/lang_Hungarian.lng | 6 +++--- lng/lang_Indonesian.lng | 4 ++-- lng/lang_Russian.lng | 6 +++--- lng/lang_Spanish.lng | 6 +++--- lng/lang_Swedish.lng | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lng/lang_German.lng b/lng/lang_German.lng index cc0b8a2ef..1127786ec 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,5 +1,5 @@ # German Translation by ps2guy and LopoTRI -# Last update: 8/24/2018 +# Last update: 8/25/2018 # Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German @@ -257,8 +257,8 @@ Kindersicherungspasswort eingeben Falsches Kindersicherungspasswort. Kindersicherung ausgeschaltet. Erstellungsoptionen: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? +Fehler - Dieses Passwort kann nicht benutzt werden. +VMC %s Datei ist fragmentiert. Weiter mit Memory Card in steckplatz %d? PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 4a345275b..4303e3a5b 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,5 +1,5 @@ # Translation by co5oos -# Last update: 8/24/2018 +# Last update: 8/25/2018 # Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian @@ -257,8 +257,8 @@ Hagyja üresen a gyerekzár kikapcsolásához. Gyerekzár jelszó helytelen. Gyerekzás kikapcsolva. Build Opciók: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? +Hiba - ez a jelszó nem használható. +VMC %s fájl töredezett. Folytatás a %d foglalatban lévő Memória Kártyával? PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 0b6423ad6..56173e55c 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -257,8 +257,8 @@ Masukkan kata sandi kuci Parental Kesalahan kata sandi kunci Parental. Kunci Parental tidak aktif. Opsi Bentukan: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? +Kesalahan - kata sandi tak bisa dipakai. +Berkas VMC %s terfragmentasi. Gunakan kartu memori di slot %d? PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 5cbb577ca..cc70384ed 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,5 +1,5 @@ # Translated by druchapucha and frodosumkin -# Last update: 8/24/2018 +# Last update: 8/25/2018 # Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian @@ -257,8 +257,8 @@ Multitap эмулятор на порте Родительский контроль, неверный пароль. Родительский контроль выключен. Опции сборки: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? +Ошибка - этот пароль не может быть использован. +VMC %s файл фрагментирован. Продолжить с картой памяти в слоте %d? PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 10bff14bf..7b0642dfb 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,5 +1,5 @@ # Translation by lauchon22 -# Last update: 8/24/2018 +# Last update: 8/27/2018 # Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -257,8 +257,8 @@ Introduzca el password de control parental Password de control parental es incorrecto. Control parental desactivado. Opciones de compilación: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? +Error - No se puede usar este password. +El archivo VMC %s está fragmentado. Continuar con Memory Card en slot %d? Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 923056253..47b462f1d 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,5 +1,5 @@ # Translation by Lord_Flaya -# Last update: 8/24/2018 +# Last update: 8/25/2018 # Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish @@ -257,8 +257,8 @@ Ange lösenord för föräldrakontroll Fel lösenord för föräldrakontroll Föräldrakontroll inaktiverat Bygg-Alternativ: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? +Fel - lösenordet kan ej användas. +VMC %s filen är fragmenterad. Använd minneskort i port %d? PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! From 35951ebb33e039add760ab9238ba553949c456fd Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 7 Sep 2018 00:02:44 -0700 Subject: [PATCH 119/269] update lang files from PS2-HOME Translators. --- lng/lang_Arabic.lng | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 21decc44d..8a2b0455f 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,5 +1,5 @@ # translation by alimadhi -# Last update: 8/24/2018 +# Last update: 8/31/2018 # Updated for OPL_1301_DB-TA_[24f2d97] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic @@ -257,8 +257,8 @@ LMP الاصدار: كلمة مرور الوالدين قفل غير صحيحة. تم تعطيل قفل الوالدين. خيارات البناء: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? +خطأ - لا يمكن استخدام كلمة المرور هذه. +ملف VMC %s مجزأ. تواصل مع بطاقة الذاكرة في الفتحة %d? PS1 العاب PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! From 0718d09af651b444de8b9971b3df259e70922e54 Mon Sep 17 00:00:00 2001 From: SP193 Date: Sun, 30 Sep 2018 13:02:58 +0800 Subject: [PATCH 120/269] CDVDFSV: increased stack size of RPC 1. Related to d25a8eab. --- modules/iopcore/cdvdfsv/cdvdfsv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/iopcore/cdvdfsv/cdvdfsv.c b/modules/iopcore/cdvdfsv/cdvdfsv.c index 9614d1d86..b43492a9a 100644 --- a/modules/iopcore/cdvdfsv/cdvdfsv.c +++ b/modules/iopcore/cdvdfsv/cdvdfsv.c @@ -264,7 +264,7 @@ static void cdvdfsv_startrpcthreads(void) thread_param.attr = TH_C; thread_param.option = 0xABCD8001; thread_param.thread = (void *)cdvdfsv_rpc1_th; - thread_param.stacksize = 0x500; //Original: 0x1900. Its operations probably won't need so much space, since its functions will never trigger a callback. + thread_param.stacksize = 0x600; //Original: 0x1900. Its operations probably won't need so much space, since its functions will never trigger a callback. thread_param.priority = 0x51; rpc1_thread_id = CreateThread(&thread_param); From a3143553297989d1b4dae87b19801fe001dd3a2b Mon Sep 17 00:00:00 2001 From: KrahJohlito Date: Sun, 25 Nov 2018 20:33:14 +1030 Subject: [PATCH 121/269] small fix to stop the user being able to navigate menus during init --- src/gui.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/gui.c b/src/gui.c index fdf6db25e..4b5e17152 100644 --- a/src/gui.c +++ b/src/gui.c @@ -2081,8 +2081,6 @@ void guiIntroLoop(void) while (!endIntro) { guiStartFrame(); - guiReadPads(); - if (wfadeout < 0x80) guiShow(); From efee55f933809ad54215d409029406aee2ff5355 Mon Sep 17 00:00:00 2001 From: KrahJohlito Date: Thu, 6 Dec 2018 21:32:53 +1030 Subject: [PATCH 122/269] add a save cfg prompt before starting hdl server to fix a bug where if current theme is not saved the console will crash upon unloading hdl server --- include/lang.h | 1 + src/lang.c | 1 + src/menusys.c | 10 ++++++++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/lang.h b/include/lang.h index a15ee4983..01e1153c0 100644 --- a/include/lang.h +++ b/include/lang.h @@ -260,6 +260,7 @@ enum _STR_IDS { _STR_BUILD_DETAILS, _STR_PARENLOCK_INVALID_PASSWORD, _STR_ERR_VMC_FRAGMENTED_CONTINUE, + _STR_HDL_SAVE_SETTINGS, //START of OPL_DB tweaks _STR_ELM, _STR_ELMMODE, diff --git a/src/lang.c b/src/lang.c index ebbbc61f1..097b5f495 100644 --- a/src/lang.c +++ b/src/lang.c @@ -272,6 +272,7 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Build Options:", "Error - this password cannot be used.", "VMC %s file is fragmented. Continue with Memory Card in slot %d?", + "Settings must be saved before continuing.", //START of OPL_DB tweaks "PS1 Games", "PS1 Games display mode", diff --git a/src/menusys.c b/src/menusys.c index 3eb5e51ed..6d8fef427 100644 --- a/src/menusys.c +++ b/src/menusys.c @@ -690,8 +690,14 @@ void menuHandleInputMenu() menuSetParentalLockCheckState(1); //Re-enable parental lock check. } } else if (id == MENU_START_HDL) { - if (menuCheckParentalLock() == 0) - handleHdlSrv(); + if (menuCheckParentalLock() == 0) { + int ret = guiMsgBox(_l(_STR_HDL_SAVE_SETTINGS), 1, NULL); + if (ret != 0) { + saveConfig(CONFIG_OPL | CONFIG_NETWORK, 1); + menuSetParentalLockCheckState(1); //Re-enable parental lock check. + handleHdlSrv(); + } + } } else if (id == MENU_ABOUT) { guiShowAbout(); } else if (id == MENU_EXIT) { From d0f161606073f90b858882ad6559cfcdf3fba1dc Mon Sep 17 00:00:00 2001 From: KrahJohlito Date: Thu, 6 Dec 2018 21:48:07 +1030 Subject: [PATCH 123/269] add gui sound effects --- Makefile | 34 +++++++- include/config.h | 4 + include/dialogs.h | 6 ++ include/extern_irx.h | 6 ++ include/gui.h | 3 + include/lang.h | 5 ++ include/opl.h | 8 ++ include/sound.h | 13 +++ include/themes.h | 2 +- misc/boot.adp | Bin 0 -> 143984 bytes misc/cancel.adp | Bin 0 -> 2128 bytes misc/confirm.adp | Bin 0 -> 2160 bytes misc/cursor.adp | Bin 0 -> 1872 bytes misc/message.adp | Bin 0 -> 17168 bytes misc/transition.adp | Bin 0 -> 1744 bytes src/dia.c | 165 +++++++++++++++++++++++++++++++----- src/dialogs.c | 31 +++++++ src/gui.c | 63 +++++++++++++- src/lang.c | 9 +- src/menusys.c | 43 ++++++++++ src/opl.c | 74 +++++++++++++++- src/sound.c | 197 +++++++++++++++++++++++++++++++++++++++++++ src/system.c | 20 +++++ src/themes.c | 16 ++++ 24 files changed, 669 insertions(+), 30 deletions(-) create mode 100644 include/sound.h create mode 100644 misc/boot.adp create mode 100644 misc/cancel.adp create mode 100644 misc/confirm.adp create mode 100644 misc/cursor.adp create mode 100644 misc/message.adp create mode 100644 misc/transition.adp create mode 100644 src/sound.c diff --git a/Makefile b/Makefile index 610ef06f3..b590affca 100755 --- a/Makefile +++ b/Makefile @@ -58,7 +58,7 @@ OPL_VERSION = $(VERSION).$(SUBVERSION).$(PATCHLEVEL).$(REVISION)$(if $(EXTRAVERS #START of OPL_DB tweaks FRONTEND_OBJS = pad.o fntsys.o renderman.o menusys.o OSDHistory.o system.o lang.o config.o hdd.o dialogs.o \ dia.o ioman.o texcache.o themes.o supportbase.o usbsupport.o ethsupport.o hddsupport.o \ - appsupport.o elmsupport.o gui.o textures.o opl.o atlas.o nbns.o httpclient.o gsm.o cheatman.o + appsupport.o elmsupport.o gui.o textures.o opl.o atlas.o nbns.o httpclient.o gsm.o cheatman.o sound.o GFX_OBJS = usb_icon.o hdd_icon.o eth_icon.o app_icon.o elm_icon.o \ cross_icon.o triangle_icon.o circle_icon.o square_icon.o select_icon.o start_icon.o \ @@ -68,14 +68,16 @@ GFX_OBJS = usb_icon.o hdd_icon.o eth_icon.o app_icon.o elm_icon.o \ #END of OPL_DB tweaks -MISC_OBJS = icon_sys_A.o icon_sys_J.o icon_sys_C.o conf_theme_OPL.o +MISC_OBJS = icon_sys_A.o icon_sys_J.o icon_sys_C.o conf_theme_OPL.o \ + boot.o cancel.o confirm.o cursor.o message.o transition.o IOP_OBJS = iomanx.o filexio.o ps2fs.o usbd.o usbhdfsd.o usbhdfsdfsv.o \ ps2atad.o hdpro_atad.o poweroff.o ps2hdd.o xhdd.o genvmc.o hdldsvr.o \ ps2dev9.o smsutils.o ps2ip.o smap.o isofs.o nbns-iop.o \ httpclient-iop.o netman.o ps2ips.o \ usb_mcemu.o hdd_mcemu.o smb_mcemu.o \ - iremsndpatch.o apemodpatch.o + iremsndpatch.o apemodpatch.o \ + libsd.o audsrv.o EECORE_OBJS = ee_core.o ioprp.o util.o \ elfldr.o udnl.o imgdrv.o eesync.o \ @@ -94,7 +96,7 @@ EE_ASM_DIR = asm/ MAPFILE = opl.map EE_LDFLAGS += -Wl,-Map,$(MAPFILE) -EE_LIBS = -L$(PS2SDK)/ports/lib -L$(GSKIT)/lib -L./lib -lgskit -ldmakit -lgskit_toolkit -lpoweroff -lfileXio -lpatches -ljpeg -lpng -lz -ldebug -lm -lmc -lfreetype -lvux -lcdvd -lnetman -lps2ips +EE_LIBS = -L$(PS2SDK)/ports/lib -L$(GSKIT)/lib -L./lib -lgskit -ldmakit -lgskit_toolkit -lpoweroff -lfileXio -lpatches -ljpeg -lpng -lz -ldebug -lm -lmc -lfreetype -lvux -lcdvd -lnetman -lps2ips -laudsrv -lc EE_INCS += -I$(PS2SDK)/ports/include -I$(GSKIT)/include -I$(GSKIT)/ee/dma/include -I$(GSKIT)/ee/gs/include -I$(GSKIT)/ee/toolkit/include -Imodules/iopcore/common -Imodules/network/common -Imodules/hdd/common -Iinclude BIN2C = $(PS2SDK)/bin/bin2c @@ -430,6 +432,12 @@ $(EE_ASM_DIR)isofs.s: modules/isofs/isofs.irx | $(EE_ASM_DIR) $(EE_ASM_DIR)usbd.s: $(PS2SDK)/iop/irx/usbd.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ usbd_irx +$(EE_ASM_DIR)libsd.s: $(PS2SDK)/iop/irx/libsd.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ libsd_irx + +$(EE_ASM_DIR)audsrv.s: $(PS2SDK)/iop/irx/audsrv.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ audsrv_irx + $(EE_OBJS_DIR)libds34bt.a: modules/ds34bt/ee/libds34bt.a cp $< $@ @@ -736,6 +744,24 @@ $(EE_ASM_DIR)icon_sys_C.s: misc/icon_C.sys | $(EE_ASM_DIR) $(EE_ASM_DIR)conf_theme_OPL.s: misc/conf_theme_OPL.cfg | $(EE_ASM_DIR) $(BIN2S) $< $@ conf_theme_OPL_cfg +$(EE_ASM_DIR)boot.s: misc/boot.adp | $(EE_ASM_DIR) + $(BIN2S) $< $@ boot_adp + +$(EE_ASM_DIR)cancel.s: misc/cancel.adp | $(EE_ASM_DIR) + $(BIN2S) $< $@ cancel_adp + +$(EE_ASM_DIR)confirm.s: misc/confirm.adp | $(EE_ASM_DIR) + $(BIN2S) $< $@ confirm_adp + +$(EE_ASM_DIR)cursor.s: misc/cursor.adp | $(EE_ASM_DIR) + $(BIN2S) $< $@ cursor_adp + +$(EE_ASM_DIR)message.s: misc/message.adp | $(EE_ASM_DIR) + $(BIN2S) $< $@ message_adp + +$(EE_ASM_DIR)transition.s: misc/transition.adp | $(EE_ASM_DIR) + $(BIN2S) $< $@ transition_adp + $(EE_ASM_DIR)IOPRP_img.s: modules/iopcore/IOPRP.img | $(EE_ASM_DIR) $(BIN2S) $< $@ IOPRP_img diff --git a/include/config.h b/include/config.h index 28e85ab64..e17bfdecb 100644 --- a/include/config.h +++ b/include/config.h @@ -90,6 +90,10 @@ enum CONFIG_INDEX { //END of OPL_DB tweaks #define CONFIG_OPL_SWAP_SEL_BUTTON "swap_select_btn" #define CONFIG_OPL_PARENTAL_LOCK_PWD "parental_lock_password" +#define CONFIG_OPL_SFX "enable_sfx" +#define CONFIG_OPL_BOOT_SND "enable_boot_snd" +#define CONFIG_OPL_SFX_VOLUME "sfx_volume" +#define CONFIG_OPL_BOOT_SND_VOLUME "boot_snd_volume" //Network config keys #define CONFIG_NET_ETH_LINKM "eth_linkmode" diff --git a/include/dialogs.h b/include/dialogs.h index bdd8d1e22..b3b74d8d7 100644 --- a/include/dialogs.h +++ b/include/dialogs.h @@ -49,6 +49,11 @@ enum UI_ITEMS { ABOUT_BUILD_DETAILS, CFG_PARENLOCK_PASSWORD, + + CFG_SFX, + CFG_BOOT_SND, + CFG_SFX_VOLUME, + CFG_BOOT_SND_VOLUME, NETCFG_SHOW_ADVANCED_OPTS, NETCFG_PS2_IP_ADDR_TYPE, @@ -182,6 +187,7 @@ extern struct UIItem diaPadEmuInfo[]; extern struct UIItem diaNetConfig[]; extern struct UIItem diaCompatConfig[]; extern struct UIItem diaUIConfig[]; +extern struct UIItem diaAudioConfig[]; extern struct UIItem diaGSConfig[]; extern struct UIItem diaCheatConfig[]; diff --git a/include/extern_irx.h b/include/extern_irx.h index c7b50e4f6..5a62e09b8 100644 --- a/include/extern_irx.h +++ b/include/extern_irx.h @@ -7,6 +7,9 @@ extern void *apemodpatch_irx; extern int size_apemodpatch_irx; +extern void *audsrv_irx; +extern int size_audsrv_irx; + extern void *bt_pademu_irx; extern int size_bt_pademu_irx; @@ -64,6 +67,9 @@ extern int size_isofs_irx; extern void *iremsndpatch_irx; extern int size_iremsndpatch_irx; +extern void *libsd_irx; +extern int size_libsd_irx; + extern void *mcman_irx; extern int size_mcman_irx; diff --git a/include/gui.h b/include/gui.h index e7a305fc2..f1df686fb 100644 --- a/include/gui.h +++ b/include/gui.h @@ -127,9 +127,12 @@ void guiShowNetCompatUpdate(void); void guiShowAbout(); void guiShowConfig(); void guiShowUIConfig(); +void guiShowAudioConfig(); void guiShowNetConfig(); void guiShowParentalLockConfig(); +void guiDelay(int milliSeconds); + /** Renders the given string on screen for the given function until it's io finishes * @note The ptr pointer is watched for it's value. The IO is considered finished when the value becomes zero. * @param ptr The finished state pointer (1 unfinished, 0 finished) diff --git a/include/lang.h b/include/lang.h index 01e1153c0..67f353aaa 100644 --- a/include/lang.h +++ b/include/lang.h @@ -261,6 +261,11 @@ enum _STR_IDS { _STR_PARENLOCK_INVALID_PASSWORD, _STR_ERR_VMC_FRAGMENTED_CONTINUE, _STR_HDL_SAVE_SETTINGS, + _STR_AUDIO_SETTINGS, + _STR_SFX, + _STR_BOOT_SND, + _STR_SFX_VOLUME, + _STR_BOOT_SND_VOLUME, //START of OPL_DB tweaks _STR_ELM, _STR_ELMMODE, diff --git a/include/opl.h b/include/opl.h index f8f8e6ddd..7513fe12a 100644 --- a/include/opl.h +++ b/include/opl.h @@ -119,6 +119,14 @@ int gYOff; int gOverscan; int gSelectButton; +int gEnableSFX; +int gEnableBootSND; +int gSFXVolume; +int gBootSndVolume; + +int gFadeDelay; +int toggleSfx; + #ifdef IGS #define IGS_VERSION "0.1" #endif diff --git a/include/sound.h b/include/sound.h new file mode 100644 index 000000000..f4f1cd786 --- /dev/null +++ b/include/sound.h @@ -0,0 +1,13 @@ +#ifndef __SOUND_H +#define __SOUND_H + +#define NUM_SFX_FILES 6 + +extern struct audsrv_adpcm_t sfx[NUM_SFX_FILES]; + +int sfxInit(void); +void sfxVolume(void); + +int thmSfxEnabled; + +#endif diff --git a/include/themes.h b/include/themes.h index 4523f9792..a461706c3 100644 --- a/include/themes.h +++ b/include/themes.h @@ -139,7 +139,7 @@ GSTEXTURE *thmGetTexture(unsigned int id); void thmEnd(void); // Indices are shifted in GUI, as we add the internal default theme at 0 -int thmSetGuiValue(int themeGuiId, int reload); +int thmSetGuiValue(int themeID, int reload); int thmGetGuiValue(void); int thmFindGuiID(const char *theme); const char **thmGetGuiList(void); diff --git a/misc/boot.adp b/misc/boot.adp new file mode 100644 index 0000000000000000000000000000000000000000..a670dd5e62d9b94cdd79b54a1d88b3c3056612e4 GIT binary patch literal 143984 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%0Aq|XcIrr=g=Iz7>LMX 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 literal 0 HcmV?d00001 diff --git a/misc/cancel.adp b/misc/cancel.adp new file mode 100644 index 0000000000000000000000000000000000000000..10274dff0b9d710f291d40b53fe9041e57b34c2c GIT binary patch literal 2128 zcmeHHK~Eb;6n>_WdZE~ev_*>WreK?d$g{LP6??`IyHXo=D3N-Km!wi}ULSiY{E8lc zE0waoCc(SuvBfhI$Kn}s>cz7@wt^j#+)(Hb?|~#YrEB?jHFtJb?9_DGQv`aP`|Z413zp&UR(QYdSv=Xf4n?cfEe#= z&Z+sn$2qM7qYl_aYZ1%nR4qV~aa=|j-Z5;rfJ9ZIligp{YzaK|ZsKg;& zv(+j9-ufseYfU$dpWlXq7Y8qX|MTp9mbl+N+iXC9VmZ%e5`BtJG@uhpAw*(;&?@z@ zJ_tNMre=-M-3G*Qhz(SdrtTc87GNs~upT=&X`*xiL=?#`iZh8piVY}J&ue;g3~_R{ z012XSP>9jWngZAyAp{MgI7fnbMCI%#875Mrfd#;+YHQP+gCNQZFvejwmjF_-Md*fm zc+eBs)5a9Rx|I4&A87~eAov=5?%vH!XY?ESy7M|N!tNeIl`?ja$vdnF9&+>ju}hpY z@-aM|pP88$jf^@vdiCmM5u!-

r!!$h!F=&KL0>!pF9Alea0_HKo^dFDC=gKA~{$&*DW6I#XzqCk|#??JHB-f6eDww`Wn)b1|dhtk9{1b>66v%wOa zT~1z3-np~1^3~GH(t{{2 z6i5N1+cdA~E{+{5=_axDax#mt#fN00i!miW


PMp&#l$of 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 Hu0mjf*hnf6 diff --git a/gfx/screen.png b/gfx/screen.png index 49a830e23e557c39d84858a2160d1ed03b7a8178..a9ffa387b6fed176e68de49bfb3d40a526917758 100644 GIT binary patch literal 113 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 diff --git a/include/textures.h b/include/textures.h index 00240b46c..047c380ad 100644 --- a/include/textures.h +++ b/include/textures.h @@ -35,6 +35,9 @@ enum INTERNAL_TEXTURE { R2_ICON, R3_ICON, */ MAIN_BG, +//START of OPL_DB tweaks + MAIN2_BG, +//END of OPL_DB tweaks INFO_BG, COVER_DEFAULT, DISC_DEFAULT, @@ -82,11 +85,6 @@ enum INTERNAL_TEXTURE { VMODE_PAL, LOGO_PICTURE, CASE_OVERLAY, - BG_OVERLAY, -//START of OPL_DB tweaks - BG_OVERLAY_2, - INFO_OVERLAY, -//END of OPL_DB tweaks TEXTURES_COUNT }; diff --git a/misc/conf_theme_OPL.cfg b/misc/conf_theme_OPL.cfg index 909baf05c..9383fca76 100644 --- a/misc/conf_theme_OPL.cfg +++ b/misc/conf_theme_OPL.cfg @@ -9,7 +9,7 @@ main0: pattern=BG main1: type=StaticImage - default=bg_overlay + default=background aligned=0 scaled=0 width=DIM_INF @@ -78,7 +78,7 @@ info0: pattern=BG info1: type=StaticImage - default=info_overlay + default=info aligned=0 scaled=0 width=DIM_INF @@ -293,7 +293,7 @@ mainELM0: pattern=BG mainELM1: type=StaticImage - default=bg_overlay_2 + default=background2 aligned=0 scaled=0 width=DIM_INF diff --git a/src/textures.c b/src/textures.c index 3d7706e7d..25e7efeb6 100644 --- a/src/textures.c +++ b/src/textures.c @@ -40,6 +40,9 @@ extern void *R2_png; extern void *R3_png; */ extern void *background_png; +//START of OPL_DB tweaks +extern void *background2_png; +//END of OPL_DB tweaks extern void *info_png; extern void *cover_png; extern void *disc_png; @@ -88,11 +91,6 @@ extern void *Vmode_ntsc_png; extern void *Vmode_pal_png; extern void *logo_png; -//START of OPL_DB tweaks -extern void *bg_overlay_png; -extern void *bg_overlay_2_png; -extern void *info_overlay_png; -//END of OPL_DB tweaks extern void *case_png; // Not related to screen size, just to limit at some point @@ -139,6 +137,9 @@ static texture_t internalDefault[TEXTURES_COUNT] = { {R2_ICON, "R2", &R2_png}, {R3_ICON, "R3", &R3_png}, */ {MAIN_BG, "background", &background_png}, + //START of OPL_DB tweaks + {MAIN2_BG, "background2", &background2_png}, + //END of OPL_DB tweaks {INFO_BG, "info", &info_png}, {COVER_DEFAULT, "cover", &cover_png}, {DISC_DEFAULT, "disc", &disc_png}, @@ -185,10 +186,6 @@ static texture_t internalDefault[TEXTURES_COUNT] = { {VMODE_NTSC, "Vmode_ntsc", &Vmode_ntsc_png}, {VMODE_PAL, "Vmode_pal", &Vmode_pal_png}, {LOGO_PICTURE, "logo", &logo_png}, - //START of OPL_DB tweaks - {BG_OVERLAY, "bg_overlay", &bg_overlay_png}, - {BG_OVERLAY_2, "bg_overlay_2", &bg_overlay_2_png}, - {INFO_OVERLAY, "info_overlay", &info_overlay_png}, {CASE_OVERLAY, "case", &case_png}, }; From d05a0f8bcd7353b7d83cd6bfefc595af28e52a36 Mon Sep 17 00:00:00 2001 From: DDinghoya Date: Wed, 12 Feb 2020 12:49:11 +0900 Subject: [PATCH 192/269] Create README_Kr.md (#19) --- README_Kr.md | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 README_Kr.md diff --git a/README_Kr.md b/README_Kr.md new file mode 100644 index 000000000..a4fd4912e --- /dev/null +++ b/README_Kr.md @@ -0,0 +1,117 @@ +# 오픈 PS2 로더 + +Copyright 2013, Ifcaro & jimmikaelkael +Academic 무료 라이센스 버전 3.0에 따라 라이센스 부여 +자세한 내용은 LICENSE 파일을 검토하십시오. + +## 소개 + +오픈 PS2 로더 (OPL)는 PS2 와 PS3 장치를 위한 100% 오픈 소스 게임 및 응용 프로그램 +로더입니다. USB 대용량 저장 장치, SMB 공유, 플레이스테이션 2 HDD 장치의 세 가지 +범주의 장치를 지원합니다. USB 장치, SMB 공유는 USBExtreme 및 \*.ISO 형식을 지원하는 +반면 PS2 HDD는 HDLoader 형식을 지원합니다. 현재 가장 호환성 좋은 홈브류 로더입니다. + +OPL은 지속적으로 개발되며 누구나 오픈 소스 특성으로 인해 프로젝트 개선에 기여할 수 +있습니다. + +오픈 PS2 로더 포럼을 방문 할 수 있습니다: + +http://www.ps2-home.com/forum/viewforum.php?f=13 + +http://psx-scene.com/forums/official-open-ps2-loader-forum/ + +https://www.psx-place.com/forums/open-ps2-loader-opl.77/ + +다음에서 호환성 게임 문제를보고 할 수 있습니다: + +http://www.ps2-home.com/forum/viewtopic.php?f=13&t=175 + +https://www.psx-place.com/threads/open-ps2-loader-game-bug-reports.19401/ + +업데이트 된 호환성 목록을 보려면 다음 사이트의 OPL-CL 사이트를 방문하십시오: + +http://www.ps2-home.com/forum/page/opl-game-compatibility-list-1 + +http://sx.sytes.net/oplcl/games.aspx + +## 개정 유형 + +오픈 PS2 로더 번들에는 동일한 OPL 버전의 여러 유형이 포함되었습니다. 이러한 +유형에는 다소의 기능이 포함되어 있습니다 + +| 유형 (조합 가능) | 설명 | +| --------------------------- | --------------------------------------------------------------------------------- | +| "Normal" (접미사 없음) | 추가 기능 없이 정기적인 기본 OPL 릴리스. 일명 바닐라 빌드. | +| "Childproof" | 일부 컨트롤이 비활성화 된 OPL 릴리스 (예: 쓰기 작업). | +| "VMC" | 가상 메모리 카드 (VMC)를 지원하는 OPL 릴리스. | +| "GSM" | GSM이 통합 된 OPL 릴리즈. | +| "PS2RD" | PS2RD 치트 엔진 내장 기능이 있는 OPL 릴리스. | + +## 사용하는 방법 + +OPL은 HDD, SMB, USB 모드에서 다음 디렉토리 트리 구조를 사용합니다: + +| 폴더 | 설명 | 모드 | +| ------ | ----------- | ----- | +| "CD" | CD 미디어의 게임 - 예: 파란색 하단 디스크) | USB 와 SMB | +| "DVD" | USB 또는 SMB에서 NTFS 파일 시스템을 사용하는 경우 DVD5 및 DVD9 이미지의 경우; USB 또는 SMB에서 FAT32 파일 시스템을 사용하는 경우 DVD9 이미지를 분할하여 장치 루트에 배치해야 함 | USB 와 SMB | +| "VMC" | 가상 메모리 카드 이미지의 경우 - 8MB에서 최대 64MB | 모두 | +| "CFG" | 게임 별 구성 파일 저장 | 모두 | +| "ART" | 게임 아트 이미지 | all | +| "THM" | 테마 지원 | all | +| "LNG" | 번역 지원 | 모두 | +| "CHT" | 치트 파일 | 모두 | +| "CFG-DEV" | OPL 개발 빌드에서 사용될 때 게임 별 구성 파일 저장 - 베타 빌드 | 모두 | + +OPL은 처음 시작할 때 위의 디렉토리 구조를 자동으로 생성하고 즐겨 사용하는 장치를 +활성화합니다. HDD 사용자의 경우 128Mb +OPL 파티션이 생성됩니다 (필요한 경우 +uLaunchELF를 사용하여 확대할 수 있음). + +## USB + +USB의 게임 파일은 파일 또는 전체 드라이브로 완벽하게 조각 모음을 수행해야하며 +FAT32 파일 시스템의 4GB 제한을 피하기 위해 듀얼 레이어 DVD9 이미지를 분할해야 +합니다. 최상의 조각 모음 결과를 얻으려면 Auslogics Disk Defrag을 권장합니다. + +http://www.auslogics.com/en/software/disk-defrag/ + +또한 게임을 USBUtil 2.0과 같은 USB Advance/Extreme 형식으로 변환하거나 분할하려면 +PC 프로그램이 필요합니다. + +## SMB + +SMB 프로토콜로 게임을 로드하려면 호스트 컴퓨터 또는 NAS 장치에서 폴더 +(예: PS2SMB)를 공유하고 전체 읽기 및 쓰기 권한이 있는지 확인해야합니다. +USB Advance/Extreme 형식은 선택 사항입니다. \*.ISO 이미지는 위의 폴더 +구조를 사용하여 지원되며 SMB 장치가 NTFS 또는 EXT3/4 파일 시스템을 +사용하는 경우 DVD9 이미지를 분할할 필요가 없다는 추가 보너스가 있습니다. + +## HDD + +PS2의 경우 최대 2TB의 48 비트 LBA 내장 HDD가 지원됩니다. HDLoader 또는 +uLaunchELF로 포맷해야합니다 (uLaunchELF 권장). + +OPL을 시작하기 위해 실행 가능한 elf를 로드하는 기존 방법 중 하나를 사용할 +수 있습니다. + +PS3에는 원본 SwapMagic 3.6 이상 또는 3.8 디스크가 필요합니다 (현재 다른 +옵션은 없습니다). PS3에 OPL을 로드하는 단계는 다음과 같습니다: + +1. OPNPS2LD.ELF를 SMBOOT0.ELF로 이름을 바꿉니다. +2. SWAPMAGIC이라는 USB 장치의 루트에 폴더를 만들고 SMBOOT0.ELF를 복사하십시오. +3. PS3에서 SwapMagic을 시작하고 UP+L1을 누르면 오픈 PS2 로더가 시작됩니다. + +SwapMagic에는 elf를 시작하기 위한 4 가지 형태가 있습니다. + +SMBOOT0.ELF = UP + L1 +SMBOOT1.ELF = UP + L2 +SMBOOT2.ELF = UP + R1 +SMBOOT3.ELF = UP + R2 + +참고: PS3에서는 USB 및 SMB 모드만 지원됩니다. + +## 개발을 위한 참고 사항 + +오픈 PS2 로더에는 최신 PS2SDK가 필요합니다: + +https://github.com/ps2dev/ps2sdk From eeff4487ab00419a246ac7934417253e628b0c08 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 11 Feb 2020 20:47:44 -0800 Subject: [PATCH 193/269] update lang files --- ...{lang_Arabic.lng => lang_Arabic_r1682.lng} | 16 +- ...Bulgarian.lng => lang_Bulgarian_r1682.lng} | 16 +- lng/lang_Croatian_r1682.lng | 294 ++++++++++++++++++ lng/{lang_Czech.lng => lang_Czech_r1682.lng} | 16 +- ...{lang_Danish.lng => lang_Danish_r1682.lng} | 16 +- lng/{lang_Dutch.lng => lang_Dutch_r1682.lng} | 16 +- ...g_Filipino.lng => lang_Filipino_r1682.lng} | 16 +- ...{lang_French.lng => lang_French_r1682.lng} | 16 +- ...{lang_German.lng => lang_German_r1682.lng} | 16 +- lng/{lang_Greek.lng => lang_Greek_r1682.lng} | 14 +- ...Hungarian.lng => lang_Hungarian_r1682.lng} | 16 +- ...donesian.lng => lang_Indonesian_r1682.lng} | 16 +- ...ang_Italian.lng => lang_Italian_r1682.lng} | 16 +- ...g_Japanese.lng => lang_Japanese_r1682.lng} | 16 +- ...{lang_Korean.lng => lang_Korean_r1682.lng} | 16 +- ...ang_Laotian.lng => lang_Laotian_r1682.lng} | 16 +- ...ang_Persian.lng => lang_Persian_r1682.lng} | 16 +- ...{lang_Polish.lng => lang_Polish_r1682.lng} | 16 +- ...se_BR.lng => lang_Portuguese_BR_r1682.lng} | 16 +- ...rtuguese.lng => lang_Portuguese_r1682.lng} | 16 +- ...ang_Romana.lng => lang_Romanian_r1682.lng} | 16 +- lng/lang_Russian.lng | 288 ----------------- lng/lang_Russian_r1682.lng | 294 ++++++++++++++++++ ...g_SChinese.lng => lang_SChinese_r1682.lng} | 16 +- ...ang_Spanish.lng => lang_Spanish_r1682.lng} | 16 +- ...ang_Swedish.lng => lang_Swedish_r1682.lng} | 16 +- ...g_TChinese.lng => lang_TChinese_r1682.lng} | 16 +- ...ang_Turkish.lng => lang_Turkish_r1682.lng} | 16 +- ...etnamese.lng => lang_Vietnamese_r1682.lng} | 16 +- 29 files changed, 873 insertions(+), 417 deletions(-) rename lng/{lang_Arabic.lng => lang_Arabic_r1682.lng} (97%) rename lng/{lang_Bulgarian.lng => lang_Bulgarian_r1682.lng} (97%) create mode 100644 lng/lang_Croatian_r1682.lng rename lng/{lang_Czech.lng => lang_Czech_r1682.lng} (95%) rename lng/{lang_Danish.lng => lang_Danish_r1682.lng} (95%) rename lng/{lang_Dutch.lng => lang_Dutch_r1682.lng} (95%) rename lng/{lang_Filipino.lng => lang_Filipino_r1682.lng} (95%) mode change 100755 => 100644 rename lng/{lang_French.lng => lang_French_r1682.lng} (95%) rename lng/{lang_German.lng => lang_German_r1682.lng} (95%) rename lng/{lang_Greek.lng => lang_Greek_r1682.lng} (98%) rename lng/{lang_Hungarian.lng => lang_Hungarian_r1682.lng} (96%) rename lng/{lang_Indonesian.lng => lang_Indonesian_r1682.lng} (95%) rename lng/{lang_Italian.lng => lang_Italian_r1682.lng} (95%) rename lng/{lang_Japanese.lng => lang_Japanese_r1682.lng} (96%) rename lng/{lang_Korean.lng => lang_Korean_r1682.lng} (96%) rename lng/{lang_Laotian.lng => lang_Laotian_r1682.lng} (96%) rename lng/{lang_Persian.lng => lang_Persian_r1682.lng} (97%) rename lng/{lang_Polish.lng => lang_Polish_r1682.lng} (95%) rename lng/{lang_Portuguese_BR.lng => lang_Portuguese_BR_r1682.lng} (96%) rename lng/{lang_Portuguese.lng => lang_Portuguese_r1682.lng} (96%) rename lng/{lang_Romana.lng => lang_Romanian_r1682.lng} (95%) delete mode 100644 lng/lang_Russian.lng create mode 100644 lng/lang_Russian_r1682.lng rename lng/{lang_SChinese.lng => lang_SChinese_r1682.lng} (94%) rename lng/{lang_Spanish.lng => lang_Spanish_r1682.lng} (96%) rename lng/{lang_Swedish.lng => lang_Swedish_r1682.lng} (95%) rename lng/{lang_TChinese.lng => lang_TChinese_r1682.lng} (94%) rename lng/{lang_Turkish.lng => lang_Turkish_r1682.lng} (95%) rename lng/{lang_Vietnamese.lng => lang_Vietnamese_r1682.lng} (95%) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic_r1682.lng similarity index 97% rename from lng/lang_Arabic.lng rename to lng/lang_Arabic_r1682.lng index f5de0ed47..15cbd7638 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic_r1682.lng @@ -1,12 +1,12 @@ # translation by alimadhi -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL ﺕﺍﺮﻴﻴﻐﺘﻟﺍ ﻆﻔﺣ ﻒﻠﺧ -ﺔﻜﺒﺸﻟﺍ ﻦﻳﻮﻜﺗ +Network Settings ﺔﻣﺪﻘﺘﻣ ﺕﺍﺭﺎﻴﺧ >ﻢﻴﻗ ﺪﺟﻮﻳﻻ< s% ﻲﻓ ﺕﺍﺩﺍﺪﻋﻹﺍ ﻆﻔﺣ ﻢﺗ @@ -145,7 +145,7 @@ USB ﺔﺋﺩﺎﺑ ﺭﺎﺴﻣ ﻮﻳﺪﻴﻔﻟﺍ ﻊﺿﻭ ﺭﺍﻮﺤﻟﺍ ﻥﻮﻟ ﺩﺪﺤﻤﻟﺍ ﻥﻮﻠﻟﺍ -ﻞﻤﻌﺘﺴﻣ ﺮﻴﻏ +Reset Colors ﺕﺎﻣﻮﻠﻌﻣ ELF ﺺﺼﺨﻣ ﻥﻮﻠﻟﺍ ﺭﺎﻴﺘﺧﺍ @@ -211,7 +211,7 @@ FMV ﺯﺎﻴﺘﺟﺍ ﻲﺋﺎﻘﻠﺗ ﻞﻴﻐﺸﺗ ﻲﺋﺎﻘﻠﺘﻟﺍ ﻞﻴﻐﺸﺘﻟﺍ ﻞﻴﻄﻌﺘﻟ ﺮﻔﺻ ،(s) ﺔﻴﻧﺎﺜﻟﺍ ﻲﻓ ﺔﻤﻴﻘﻟﺍ 2ﻲﻠﺑ ﺭﺎﻌﺷ -ﺔﻘﻄﻨﻤﻟﺍ ﺲﻔﻨﻟ ﺔﻘﺑﺎﻄﻤﻟﺍ ﺓﺰﻬﺟﻼﻟ ﺢﻟﺎﺼﻟﺍ ﺹﺮﻘﻟﺍ ﺭﺎﻌﺸﻟ ﻂﻘﻓ ﺎﻬﺿﺮﻋ ﻢﺘﻳ +Displayed for a valid disc logo matching the console's region. PADEMU ﻦﻳﻮﻜﺗ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﺕﺍﺩﺍﺪﻋﺍ ﻢﻜﺤﺗ ﻲﻛﺎﺤﻣ ﻦﻴﻜﻤﺗ @@ -277,6 +277,12 @@ s% ﻦﻣ ﻞﻤﺤﻣ s% ﺔﺒﻌﻟ ﻞﻜﻟ ﻞﻜﻟﺍ .ﺎﻬﺘﻟﺍﺯﻹ ﺕﺍﺩﺍﺪﻋﻹﺍ ﺩﺪﺣ +Support Forums: +Title +Genre +Release +Developer +Description PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian_r1682.lng similarity index 97% rename from lng/lang_Bulgarian.lng rename to lng/lang_Bulgarian_r1682.lng index 8bff2a040..9aabce679 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian_r1682.lng @@ -1,12 +1,12 @@ # translation by vsub and wisi -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s Запазване на промените Назад -Мрежови настройки +Network Settings Детайлни настройки <Няма опции> Settings saved to %s @@ -145,7 +145,7 @@ USB поддиректория Видео режим Цвят на опциите Цвят на избран обект -Unused +Reset Colors Info Нестандартен ELF Избор на цвят @@ -211,7 +211,7 @@ Overwrite Existing Records След Стойност в секунди, 0 за деактивиране. PS2 Лого -Показва се ако е валидно и съвпада с региона на конзолата +Displayed for a valid disc logo matching the console's region. Настройки на PADEMU Емулатор за контролер - настройки Включване на PADEMU @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Croatian_r1682.lng b/lng/lang_Croatian_r1682.lng new file mode 100644 index 000000000..614ec016b --- /dev/null +++ b/lng/lang_Croatian_r1682.lng @@ -0,0 +1,294 @@ +# Translation by Blacky5678 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +Croatian +OPL %s +Spremi Promjene +Natrag +Network Settings +Napredne Postavke + +Postavke spremljene u %s +Greska zapisivanja postavki! +Izlaz +Postavke +Izbornik +USB Igre +HDD Igre +ETH Igre +Aplikacije +Teme +Jezik +Sistem ce se ugasiti. +Izaci u Preglednik? +Otkazati azuriranje? +%d: Hard Disk nije primijecen. +%d: Hard Disk nije formatiran. +%d: Greska pokretanja mreze. +%d: Mrezni adapter nije primijecen. +%d: Nemoguce se spojiti na SMB server. +%d: Nemoguce se ulogirati na SMB server. +%d: Nemoguce otvoriti SMB dijeljenje. +%d: Nemoguce izlistati SMB dijeljenja. +%d: Nemoguce izlistati igre. +%d: DHCP server nije dostupan. +%d: Nema mrezne konekcije. +Uklj. +Isklj. +U redu +Odaberi +Otkazi +Krug +Kriz +Lista Igara +Postavke Igre +Ukloni Postavke +Uklonjeni svi kljucevi za igru. +Izlistati +Sporo +Srednje +Brzo +Uobicajeni Izbornik +Ucitaj sa diska +Molimo, sacekajte. +Greska tijekom ucitavanja ID-a igre. +Automatsko Sortiranje +Greska ucitavanja jezicne datoteke. +Onemoguci Debug Boje +Kontroler nije primijecen, cekanje... +Omoguci Naslovnice Igara +Siroki Zaslon +Ugasi +Ucitavanje konfiguracije... +Spremanje konfiguracije... +Zapocni Uredaj +Osvjezi +Pocetni Nacin USB Uredaja +Pocetni Nacin HDD Uredaja +Pocetni Nacin ETH Uredaja +Nacin Prikaza Aplikacijskog Izbornika +Automatski +Rucno +Zapocni HDL Server +Zapocinjanje HDL Servera... +Pokretanje HDL Servera... +Neuspjesno zapocinjanje HDL Servera. +Gasenje HDL Server... +IGR Putanja +Boja Pozadine +Boja Teksta +- PS2 - +- SMB Server - +Vrsta IP Adrese +Staticna +DHCP +IP Adresa +Adresa +Maska +Propusnica +DNS Server +Port +Dijeli +Korisnik +Lozinka + +Vrsta Adrese +IP +NetBIOS +Prihvati +Stavka ce biti trajno obrisana, nastaviti? +Preimenuj +Obrisi +Pokreni +Postavke Zaslona +Omoguci Operacije Pisanja +Provjeri Fragmentaciju USB Igre +Zapamti Zadnju Upaljenu Igru +Tipka za Odabir +Greska, igra je fragmentirana. +Greska, nije moguce pokrenuti ovu stavku. +Testiraj Promjene +Ostavi prazno za autent. GOSTA +Tocna Citanja +Sinkronizacijski Nacin +Otkaci Syscalls +Preskoci Videe +Emuliraj DVD-DL +Onemoguci IGR +Nekoristeno +Nekoristeno +Mijenjanje velice ce preurediti VMC. +Stvori +Zapocni +Izmjeni +Prekini +Resetiraj +Koristi Genericki +Konfiguriraj VMC +Ime +Velicina +Status +Napredak +VMC datoteka vec postoji. +Nevazeca VMC datoteka, velicina nije tocna. +VMC datoteka treba biti stvorena. +Greska pristupanja VMC %s. Nastaviti sa Memory Cardom u slotu %d? +Automatsko Osvjezavanje +O +Koderi +Osiguranje Kvalitete +Putanja USB Prefiksa +Pokrece prilagodeni ELF nakon IGR-a. +Vrijednost u minutama, 0 za onemogucivanje zavrtanja. +Automatsko Zavrtanje HDD-a +Video Nacin +Boja Dijaloga +Odabrana Boja +Reset Colors +Info +Prilagodeni ELF +Odabir Boje +Ponovno spoji +Ostavi prazno za listu dijeljenja. +Putanja ETH Prefiksa +Brisanje +Razmak +Unesi +Nacin +VMC Slot 1 +VMC Slot 2 +ID Igre +DMA Nacin +V-Sync +Nacin 1 +Nacin 2 +Nacin 3 +Nacin 4 +Nacin 5 +Nacin 6 +Nacin 7 +Nacin 8 +Konfiguriraj GSM +Nacin Povezivanja Etherneta +100Mbit Puni-dupleks +100Mbit Pola-dupleksa +10Mbit Puni-dupleks +10Mbit Pola-dupleksa +GSM Postavke +Omoguci GSM +Uklj./Isklj. GSM +VMOD +Forsirani prilagodeni nacin ekrana. +H-POZ +Horizontalno nastimavanje. +V-POZ +Vertikalno nastimavanje. +Skaliranje +Nastimavanje skaliranja. +Preskoci FMV +Preskakanje FMV-a +Postavke Varanja +Omoguci PS2RD Cheat Engine +Dopusti PS2RD Cheat Engine da zakrpa tvoju igru. +Nacin PS2RD Cheat Engine +Automatski odabir ili odaberi varanja za igru. +Automatski Odaberi Varanja +Odaberi Varanja Igre +Greska: neuspjelo ucitavanje datoteke varanja. +Varnaje nije pronadeno. +Preuzmi Uobicajeno +Mrezno Azuriranje +Prepisi Postojece Zapise +Azuriranje nije uspjelo. +Neuspjesno spajanje na server azuriranja. +Azuriranje zavrseno. +Azuriranje otkazano. +Preuzmi postavke sa mreze? +Prilagodene Postavke +Preuzeto Uobicajeno +Automatski zapocni za %i s... +Automatski zapocni +Vrijednost u sekundama, 0 za onemogucavanje automatskog pocetka. +PS2 Logo +Displayed for a valid disc logo matching the console's region. +Konfiguriraj PADEMU +Postavke Pad Emulatora +Omoguci Pad Emulator +Uklj./Isklj. Pad Emulator za odabranu igru. +Nacin Pad Emulatora +Odabire nacin Pad Emulatora. +DualShock3/4 USB +DualShock3/4 BT +Postavke Za Port: +Odaberi port za postavke Pad Emulatora. +Omoguci Emulaciju +Uklj./Isklj. Pad Emulator za odabrani port. +Omoguci Vibraciju +Uklj./Isklj. vibraciju za odabrani port Pad Emulatora. +MAC Adresa USB Bluetooth Adaptera: +DS Kontroler uparen na MAC Adresu: +Upari +Upari DS Kontroler +Upari DS kontroler sa MAC adresom Bluetooth adaptera. +Nije Spojeno +Informacije Bluetooth Adaptera +Prikazuje vise informacija i podrzana svojstva. +HCI Verzija: +LMP Verzija: +ID Proizvodaca: +Podrzana Svojstva: +Da +Ne +Bluetooth adapter bi trebao biti potpuno kompatibilan sa DS3/DS4 kontrolerom. +Bluetooth adapter mozda nece raditi ispravno sa DS3/DS4 kontrolerom. +Omoguci Emulaciju Multitapa +Uklj./Isklj. emulaciju Multitapa za odabranu igru. +Emulator Multitapa na Portu: +Odaberi port za emulaciju Multitapa. +Onemoguci Lazne DS3 Obilaske +Neki lazni DS3 ce trebati obilaske, ova postavka ce to onemoguciti. +Emuliraj preklapanje FIELD-a +Zakrpe za igre koje se kvare pod progresivnim video nacinom. +Postavke Roditeljskog Zakljucavanja +Lozinka Roditeljskog Zakljucavanja +Ostavi prazno za onemogucavanje roditeljskog zakljucavanja. +Unesi Lozinku Roditeljskog Zakljucavanja +Lozinka roditeljskog zakljucavanja nije tocna. +Roditeljsko zakljucavanje je onemoguceno. +Izgradi Postavke: +Greska - ova lozinka se ne moze koristiti. +VMC %s datoteka je fragmentirana. Nastaviti sa Memory Cardom u slotu %d? +Postavke Zvuka +Omoguci Zvucne Efekte +Omoguci Zvuk Pokretanja +Glasnoca Zvucnih Efekata +Glasnoca Zvuka Pokretanja +Potvrdi promjenu video nacina? +Predmemorija Liste Igara (HDD) +Omoguci Notifikacije +%s ucitano sa %s +Izbornik Igre +Postavke igre su spremljene. +%s postavke su uklonjene. +Prepisivanje postojecih postavki kompatibilnosti igre kada je omoguceno. +Nacin Postavki +Globalno +Po Igri +Sve +Odaberi postavke za ukloniti. +Support Forums: +Title +Genre +Release +Developer +Description +PS1 Igre +Nacin Prikaza PS1 Igara +POPSTARTER.ELF nije pronaden kod '%s'! +VCD datoteka '%s' nije pronadena! +Greska se pojavila dok se preimenovala datoteka. +Greska se pojavila dok se brisala datoteka. +Nikada ne kupujte OPEN-PS2-LOADER (OPL), umjesto toga ga nabavite besplatno na: +ifcaro OPL verzija na psx-scene.com +OPL Daily Builds (DB) verzija na ps2-home.com diff --git a/lng/lang_Czech.lng b/lng/lang_Czech_r1682.lng similarity index 95% rename from lng/lang_Czech.lng rename to lng/lang_Czech_r1682.lng index b0a01dc6d..0dd2bda8b 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech_r1682.lng @@ -1,12 +1,12 @@ # Translated by jimmysmith -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s Uložit změny Zpět -Síťová konfigurace +Network Settings Pokročilé možnosti <žádné hodnoty> Settings saved to %s @@ -145,7 +145,7 @@ Automatický HDD spin-down Video mód Barva dialogu Vybraná barva -Unused +Reset Colors Info Custom ELF Barva zvýraznení @@ -211,7 +211,7 @@ Automatický start v %i s... Auto start Hodnota v sekundách, zadej 0 pro vypnutí auto startu PS2 Logo -Zobrazováno pouze u validního loga disku, který má stejný region jako konzole +Displayed for a valid disc logo matching the console's region. Configure PADEMU Pad Emulator Settings Enable Pad Emulator @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish.lng b/lng/lang_Danish_r1682.lng similarity index 95% rename from lng/lang_Danish.lng rename to lng/lang_Danish_r1682.lng index 7c70cb4b4..5d6b58bc4 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish_r1682.lng @@ -1,12 +1,12 @@ # Translation by BongKris -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s Gem indstillinger Tilbage -Netværksindstillinger +Network Settings Avancerede indstillinger Settings saved to %s @@ -145,7 +145,7 @@ Automatisk harddisk spindown Videotilstand Dialogfarve Markeringsfarve -Unused +Reset Colors Info Brugerdefinerede ELF Farvevalg @@ -211,7 +211,7 @@ Auto-start om %i s... Auto-start Værdi i sekunder(s), 0 for at deaktivere auto start PS2-Logo -Vises kun med et gyldigt disk logo, som matcher konsollens region +Displayed for a valid disc logo matching the console's region. Konfigurér PADEMU Pad Emulator indstillinger Aktivér Pad Emulator @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch_r1682.lng similarity index 95% rename from lng/lang_Dutch.lng rename to lng/lang_Dutch_r1682.lng index 8b17fd903..bf28669cb 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch_r1682.lng @@ -1,12 +1,12 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s Wijzigingen opslaan Terug -Netwerkconfiguratie +Network Settings Geavanceerde opties Settings saved to %s @@ -145,7 +145,7 @@ Automatische HDD spin down Videomodus Dialoogvensterkleur Geselecteerde kleur -Unused +Reset Colors Info Aangepaste ELF Kleurselectie @@ -211,7 +211,7 @@ Auto-start over %i s... Auto-start Waarde in seconde(n), 0 om auto-start uit te schakelen PS2 logo -Alleen getoond voor geldige schijflogo die bij de console-regio past +Displayed for a valid disc logo matching the console's region. Configureer PADEMU Pad-emulator instellingen Pad-emulator inschakelen @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino_r1682.lng old mode 100755 new mode 100644 similarity index 95% rename from lng/lang_Filipino.lng rename to lng/lang_Filipino_r1682.lng index af76d80f1..d1b8577a8 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino_r1682.lng @@ -1,12 +1,12 @@ # Translation by Ceed Lorenzo -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s I-save ang mga pagbabago Likod -Network Config +Network Settings Advanced options Settings saved to %s @@ -145,7 +145,7 @@ Awtomatikong HDD paikutin pababa Video mode dialog ng kulay Piniling kulay -Unused +Reset Colors Impo Custom ELF kulay ng seleksyon @@ -211,7 +211,7 @@ Auto start in %i s... Auto Start Value in second(s), 0 to disable auto start. PS2 Logo -Only displayed for a valid disc logo which matches the console's region +Displayed for a valid disc logo matching the console's region. Configure PADEMU Pad Emulator Settings Enable Pad Emulator @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French.lng b/lng/lang_French_r1682.lng similarity index 95% rename from lng/lang_French.lng rename to lng/lang_French_r1682.lng index 7b356dfe2..07f9c06c6 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French_r1682.lng @@ -1,12 +1,12 @@ # Translation by machiavel and Squall -# Last update: Nov. 06, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s Sauvegarder Retour -Configuration réseau +Network Settings Options avancées Paramètres sauvegardés vers %s @@ -145,7 +145,7 @@ Arrêt auto. HDD Mode vidéo Couleur dialogue Couleur sélectionné -Inutilisé +Reset Colors Info ELF personnalisé Sélection de la couleur @@ -211,7 +211,7 @@ Démarrage auto dans %i s... Démarrage auto. Valeur en seconde(s), 0 pour désactiver le démarrage auto Logo PS2 -S'affiche uniquement si le logo du disque est compatible avec la région de votre console +Displayed for a valid disc logo matching the console's region. Configurer PADEMU Options de PADEMU Activer PadEmulator @@ -277,6 +277,12 @@ Global Par jeu Tout Sélectionnez les paramètres à supprimer. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Games Mode d'affichage des jeux PS1 POPSTARTER.ELF non trouvé à '%s'! diff --git a/lng/lang_German.lng b/lng/lang_German_r1682.lng similarity index 95% rename from lng/lang_German.lng rename to lng/lang_German_r1682.lng index bf7a59248..f9834b273 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German_r1682.lng @@ -1,12 +1,12 @@ # German Translation by ps2guy and LopoTRI -# Last update: Nov. 05, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s Änderungen speichern Zurück -Netzwerkkonfiguration +Network Settings Fortgeschrittene Optionen Einstellungen gespeichert in %s @@ -145,7 +145,7 @@ Autom. Abschaltung der Festplatte Videomodus Dialogfarbe Auswahlfarbe -Unbenutzt +Reset Colors Info Benutzerdefinierte ELF Farbauswahl @@ -211,7 +211,7 @@ Automatischer Start in %i s... Automatischer Start Wert in Sekunden, 0 um Auto-start zu deaktivieren PS2 Logo -Wird nur als gültiges Disk-Logo angezeigt, wenn es mit der Region der Konsole übereinstimmt +Displayed for a valid disc logo matching the console's region. PADEMU konfigurieren Einstellungen Pad Emulator Pad Emulator aktivieren @@ -277,6 +277,12 @@ Global je Spiel Alle Einstellungen Auswählen zum entfernen. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek.lng b/lng/lang_Greek_r1682.lng similarity index 98% rename from lng/lang_Greek.lng rename to lng/lang_Greek_r1682.lng index b74ae58fc..501a60a6a 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek_r1682.lng @@ -1,12 +1,12 @@ # Greek Translation by RivalK93 -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s Αποθήκευση αλλαγών Πίσω -Ρυθμίσεις δικτύου +Network Settings Προχωρημένες ρυθμίσεις <κενό> Settings saved to %s @@ -145,7 +145,7 @@ Error accessing VMC %s. Continue with the Memory Card in slot %d? Λειτουργία βίντεο Χρώμα μηνυμάτων Χρώμα επιλεγμένου -Αχρησιμοποίητο +Reset Colors Πληροφ. Προορισμένο ELF Επιλογή χρώματος @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description Παιχνίδια PS1 Εκκίνηση μενού Παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian_r1682.lng similarity index 96% rename from lng/lang_Hungarian.lng rename to lng/lang_Hungarian_r1682.lng index 2024bc22b..84c715cc5 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian_r1682.lng @@ -1,12 +1,12 @@ # Translation by co5oos -# Last update: Nov. 05, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s Változtatások mentése Vissza -Hálózat konfigurálás +Network Settings Haladó beállítások Beállítások elmentve %s-be @@ -145,7 +145,7 @@ Automatikus Merevlemez kikapcsolás Videó mód Párbeszédablak színe Kiválasztott színe -Nem Használt +Reset Colors Infó Testreszabott ELF Szín szelekció @@ -211,7 +211,7 @@ Automatikus indítás %i s belül... Automatikus indítás Érték másodperc(ek)ben, 0 az Automatikus indítás letiltásához PS2 Logó -Csak egy érvényes lemez logónál jelenik meg, amely egyezik a konzol régiójával +Displayed for a valid disc logo matching the console's region. PADEMU konfigurálás Pad Emulator Beállítások PadEmulator Engedélyezése @@ -277,6 +277,12 @@ Globális Játékonként Összes Válassza ki az eltávolítani való beállításokat. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian_r1682.lng similarity index 95% rename from lng/lang_Indonesian.lng rename to lng/lang_Indonesian_r1682.lng index aaa524970..d030336ea 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian_r1682.lng @@ -1,12 +1,12 @@ # translated by verislasher and jbliz -# Last update: Nov. 03, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s Simpan Perubahan Kembali -Konfigurasi jaringan +Network Settings Pilihan lanjutan Pengaturan disimpan pada %s @@ -145,7 +145,7 @@ HDD Otomatis berhenti Modus video Warna dialog Warna dipilih -Tdk terpakai +Reset Colors Info Kustom ELF Pemilihan warna @@ -211,7 +211,7 @@ Mulai otomatis dalam %i s... Mulai otomatis Nilai dalam detik, 0 mencegah mulai otomatis Logo PS2 -Hanya ditampilkan untuk logo disc yang valid yang cocok dengan region konsol +Displayed for a valid disc logo matching the console's region. Konfigurasi PADEMU Pengaturan Stik Emulator Aktifkan PadEmulator @@ -277,6 +277,12 @@ Global Per Game Seluruh Pilih setingan untuk dihapus. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian.lng b/lng/lang_Italian_r1682.lng similarity index 95% rename from lng/lang_Italian.lng rename to lng/lang_Italian_r1682.lng index ffd6b4c9d..31d9aa0c0 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian_r1682.lng @@ -1,12 +1,12 @@ # Translation by jauffre and andre95d -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s Salva modifiche Indietro -Configurazione rete +Network Settings Opzioni avanzate Settings saved to %s @@ -145,7 +145,7 @@ Spin down automatico HDD Modalità video Colore finestra Colore selezione -Unused +Reset Colors Info ELF personalizzato Seleziona il colore @@ -211,7 +211,7 @@ Avvio automatico in %i s... Avvio automatico Valore in secondi, 0 per disabilitare l'avvio automatico PS2 Logo -Mostrato soltanto con un logo del disco valido e compatibile con la regione della console +Displayed for a valid disc logo matching the console's region. Configure PADEMU Pad Emulator Settings Enable Pad Emulator @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese_r1682.lng similarity index 96% rename from lng/lang_Japanese.lng rename to lng/lang_Japanese_r1682.lng index e22389b57..8bd2baeb6 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese_r1682.lng @@ -1,12 +1,12 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s 設定を保存する 戻る -ネットワーク設定 +Network Settings 詳細オプション <未設定> Settings saved to %s @@ -145,7 +145,7 @@ IGR後に指定されたカスタムELFを実行します 画面モード ダイアログの色 選択時の色 -Unused +Reset Colors インフォ カスタムELF 表示色設定 @@ -211,7 +211,7 @@ Overwrite Existing Records 自動スタート 開始までの秒数を指定。0で無効化 PS2ロゴ -本体リージョンとディスクが一致した場合のみ表示されます +Displayed for a valid disc logo matching the console's region. PADEMUの設定 PADEMUの設定 PADEMU有効化 @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description PS1 ゲーム PS1 ゲーム 画面モード POPSTARTER.ELFが '%s'に見つかりません! diff --git a/lng/lang_Korean.lng b/lng/lang_Korean_r1682.lng similarity index 96% rename from lng/lang_Korean.lng rename to lng/lang_Korean_r1682.lng index 52d077ca6..244574ea0 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean_r1682.lng @@ -1,12 +1,12 @@ # Translated by DDinghoya -# Last update: Nov. 11, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s 저장 변경 뒤로 -네트워크 구성 +Network Settings 고급 옵션 <값 없음> 설정이 %s 에 저장되었습니다. @@ -145,7 +145,7 @@ IGR 후 사용자 정의 ELF 부팅 비디오 모드 대화상자 색상 선택한 색상 -미사용 +Reset Colors 정보 사용자 정의 ELF 색상 선택 @@ -211,7 +211,7 @@ PS2RD 치트 엔진 모드 자동 시작 초 입력, 자동 시작하지 않으려면 0으로 설정 PS2 로고 -콘솔의 지역과 일치하는 유효한 디스크 로고만 표시 +Displayed for a valid disc logo matching the console's region. PADEMU 구성 패드 에뮬레이터 설정 패드 에뮬레이터 활성화 @@ -277,6 +277,12 @@ VMC %s 파일이 조각났습니다. 슬롯 %d 에 있는 메모리 카드로 게임당 전부 제거할 설정을 선택하십시오. +Support Forums: +Title +Genre +Release +Developer +Description PS1 게임 PS1 게임 표시 모드 '%s' 에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian_r1682.lng similarity index 96% rename from lng/lang_Laotian.lng rename to lng/lang_Laotian_r1682.lng index 96604b1d5..3a95fc360 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian_r1682.lng @@ -1,12 +1,12 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s ບັນທຶກການປ່ຽນແປງ ກັບຄືນ -ກຳນົດຄ່າທາງດ້ານ Network +Network Settings ທາງເລືອກສຳລັບການຕັ້ງຄ່າຂັ້ນສູງ <ບໍ່ມີຄ່າໃດໆ> Settings saved to %s @@ -145,7 +145,7 @@ USB prefix path ໂໝດວິດິໂອ ສີ Dialog ສີທີ່ຖືກເລືອກ -Unused +Reset Colors ຂໍ້ມູນ ELF ທີ່ຖືກປັບແຕ່ງເອງ ເລືອກສີ @@ -211,7 +211,7 @@ Overwrite Existing Records ເປີດໃຊ້ແບບໂອໂຕ ຕັ້ງຄ່າຫົວໜ່ວຍ ວິນາທີ, ໃສ່ 0 ເພື່ອປິດການເປີດໃຊ້ແບບໂອໂຕ PS2 Logo -ຈະຖືກສະແດງຜົນ ກໍຕໍ່ເມື່ອໂລໂກ້ຂອງແຜ່ນຖືກຕ້ອງ ແລະ ສອດຄ່ອງຕາມໂຊນຂອງເຄື່ອງ +Displayed for a valid disc logo matching the console's region. Configure PADEMU Pad Emulator Settings Enable Pad Emulator @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Persian.lng b/lng/lang_Persian_r1682.lng similarity index 97% rename from lng/lang_Persian.lng rename to lng/lang_Persian_r1682.lng index 8a1d4cc88..1aefe6181 100644 --- a/lng/lang_Persian.lng +++ b/lng/lang_Persian_r1682.lng @@ -1,12 +1,12 @@ # Translation by saeid0035 -# Last update: Nov. 03, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s تاﺮﻴﻴﻐﺗ هﺮﻴﺧذ ﺖﺸﮔﺮﺑ -ﻪﻜﺒﺷ یﺪﻨﺑﺮﻜﻴﭘ +Network Settings ﻪﺘﻓﺮﺸﻴﭘ یﺎﻫ ﻪﻨﻴﺰﮔ >راﺪﻘﻣ نوﺪﺑ< ﺪﺷ هﺮﻴﺧذ %s رد ﺕﺎﻤﻴﻈﻨﺗ @@ -145,7 +145,7 @@ HDD رﺎﻛدﻮﺧ ﺶﺧﺮﭼ ﺶﻫﺎﻛ ﻮﻳﺪﻳو ﺖﻟﺎﺣ ﺎﻫ گﻮﻟﺎﻳد ﮓﻧر ﺎﻫ هﺪﺷ بﺎﺨﺘﻧا ﮓﻧر -هﺪﺸﻧ هدﺎﻔﺘﺳا +Reset Colors تﺎﻋﺎﻠﻃا ﻲﺷرﺎﻔﺳ ELF ﻞﻳﺎﻓ ﮓﻧر بﺎﺨﺘﻧا @@ -211,7 +211,7 @@ PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺖﻟﺎﺣ رﺎﻛدﻮﺧ عوﺮﺷ رﺎﻛدﻮﺧ عوﺮﺷ ندﺮﻛ لﺎﻌﻓﺮﻴﻏ یاﺮﺑ 0 ,ﻪﻴﻧﺎﺛ رد راﺪﻘﻣ 2 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﻮﮔﻮﻟ -دﻮﺸﻴﻣ هداد نﺎﺸﻧ ﺪﺷﺎﺑ ﻪﺘﺷاد ﻲﻧاﻮﺨﻤﻫ لﻮﺴﻨﻛ ﻦﺠﻳر ﺎﺑ ﻪﻛ ﺮﺒﺘﻌﻣ ﮏﺴﻳد ﮏﻳ یاﺮﺑ ﻂﻘﻓ +Displayed for a valid disc logo matching the console's region. ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ یﺪﻨﺑﺮﻜﻴﭘ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ تﺎﻤﻴﻈﻨﺗ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ لﺎﻌﻓ @@ -277,6 +277,12 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ ﻯﺯﺎﺑ ﺮﻫ ﺹﻮﺼﺨﻣ ﻪﻤﻫ ﺪﻴﻨﮐ ﺏﺎﺨﺘﻧﺍ ﺪﻴﻨﮐ ﮎﺎﭘ ﺪﻴﻫﺍﻮﺨﻴﻣ ﻪﻛ ﻰﺗﺎﻤﻴﻈﻨﺗ +Support Forums: +Title +Genre +Release +Developer +Description 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ !'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ diff --git a/lng/lang_Polish.lng b/lng/lang_Polish_r1682.lng similarity index 95% rename from lng/lang_Polish.lng rename to lng/lang_Polish_r1682.lng index 1ad1f79e6..934124ba6 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish_r1682.lng @@ -1,12 +1,12 @@ # Translation by yohokaru -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s Zapisz zmiany Wróć -Ustawienia sieci +Network Settings Opcje zaawansowane Settings saved to %s @@ -145,7 +145,7 @@ Automatyczne zwalnianie obrotów HDD Tryb wideo Kolor ustawień Kolor zaznaczenia -Niewykorzystany +Reset Colors Info Niestandardowy ELF Wybór koloru @@ -211,7 +211,7 @@ Auto start w %i s... Auto start Wartość w sekundach, 0 wyłącza auto start Logo PS2 -Logo zostanie wyświetlone wyłącznie jeśli region gry i konsoli będzie taki sam +Displayed for a valid disc logo matching the console's region. Konfiguracja emulacji Pada Ustawienia emulacji Pada Włącz emulację Pada @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR_r1682.lng similarity index 96% rename from lng/lang_Portuguese_BR.lng rename to lng/lang_Portuguese_BR_r1682.lng index 54995ae1a..4cf51098a 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR_r1682.lng @@ -1,12 +1,12 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s Salvar mudanças Voltar -Configurar rede +Network Settings Opções avançadas Configurações salvas em %s @@ -145,7 +145,7 @@ Desligamento automático do HDD (spin down) Modo de vídeo Cor do diálogo Cor da seleção -Não utilizado +Reset Colors Info Customizar ELF principal Seleção de cor @@ -211,7 +211,7 @@ Auto iniciar em %i segundos Auto iniciar Valor em segundo(s), 0(zero) desabilita o auto iniciar Logo PS2 -(Aparece quando houver uma logo válida que seja da mesma região do PS2) +Displayed for a valid disc logo matching the console's region. Configurar PADEMU Configurações do Emulador de Controles Ativar Emulador de Controles @@ -277,6 +277,12 @@ Global Por jogo Todos Selecione as configurações para remover. +Support Forums: +Title +Genre +Release +Developer +Description Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese_r1682.lng similarity index 96% rename from lng/lang_Portuguese.lng rename to lng/lang_Portuguese_r1682.lng index 3dfaf68f5..4648973b9 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese_r1682.lng @@ -1,12 +1,12 @@ # Translation by danielb -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s Salvar alterações Voltar -Configurações de Rede +Network Settings Opções avançadas Configurações guardadas em %s @@ -145,7 +145,7 @@ Desligamento automático do HDD Modo de vídeo Cor do diálogo Cor selecionada -Não utilizado +Reset Colors Info ELF personalizado Seleção de Cor @@ -211,7 +211,7 @@ Início automático em %i s... Auto iniciar Valor em segundos, 0 para desativar Logo PS2 -Apenas é exibido para um disco válido e que seja da mesma região da consola +Displayed for a valid disc logo matching the console's region. Configurar PADEMU Definições do Emulador de Comando Ativar Emulador Comando @@ -277,6 +277,12 @@ Global Por jogo Todos Selecione as configurações para remover. +Support Forums: +Title +Genre +Release +Developer +Description Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Romana.lng b/lng/lang_Romanian_r1682.lng similarity index 95% rename from lng/lang_Romana.lng rename to lng/lang_Romanian_r1682.lng index 0f13b9040..6321b28ce 100644 --- a/lng/lang_Romana.lng +++ b/lng/lang_Romanian_r1682.lng @@ -1,12 +1,12 @@ # Romanian translation by MRAdyy -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Romanian Open PS2 Loader %s Salvare Setari Inapoi -Config. retea +Network Settings Optiuni avansate Settings saved to %s @@ -145,7 +145,7 @@ Oprire automata HDD Mod video Culoare Dialog Culoare selectata -Unused +Reset Colors Info ELF personalizat Selectie culoare @@ -211,7 +211,7 @@ Pornire autpmata in %i secunde... Pornire automata Valoare in secunde, 0 pentru a opri pornirea automata PS2 Logo -Only displayed for a valid disc logo which matches the console's region +Displayed for a valid disc logo matching the console's region. Configure PADEMU Pad Emulator Settings Enable Pad Emulator @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng deleted file mode 100644 index e8e3cbd52..000000000 --- a/lng/lang_Russian.lng +++ /dev/null @@ -1,288 +0,0 @@ -# Translated by druchapucha and frodosumkin -# Last update: Nov. 14, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 -Russian -OPL %s -Сохранить настройки -Назад -Конфигурация сети -Расширенные опции -<не указано> -Настройки сохранены в %s -Ошибка сохранения настроек! -Выход -Настройки -Меню -USB-Игры -HDD-Игры -Сетевой ресурс -Приложения -Тема -Язык -Выключить консоль. -Выйти в браузер? -Отменить обновление? -%d: HardDisk не опознан -%d: HardDisk не отформатирован -%d: Ошибка настройки сети -%d: Не удается найти сетевой адаптер -%d: Не удается найти сетевой ресурс или подключиться к нему -%d: Не удается войти на сетевой ресурс с указанными учетными данными -%d: Не удается открыть сетевой ресурс -%d: Не удается открыть список с сетьевого ресурса -%d: Не удается открыть список -%d: DHCP сервер не доступен -%d: Отсутствует подключение к сети -Вкл -Выкл -Ок -Выбор -Отмена -Круг -Крест -Список игр -Конфиг. -Удалить настройки -Все опции сброшены! -Прокрутка -Медленная -Средняя -Быстрая -Меню по умолчанию -Загрузка с диска -Пожалуйста, подождите -Ошибка загрузки Game ID -Автоматическая прокрутка -Ошибка загрузки языкового файла -Отключить дебаг-цвета -Контроллер не обнаружен, ожидание... -Включить обложки -Широкий экран -Выключить консоль -Загрузка настроек -Сохранение настроек -Запуск устройства -Обновить -Режим запуска игр с USB -Режим запуска игр с HDD -Режим поиска Сетевого ресурса -Отобразить меню Приложений -Авто -Вручную -Запуск HDL сервера -HDL сервер запускается... -HDL сервер запущен... Нажмите кнопку [O], чтобы остановить -Нажмите кнопку [X], чтобы прервать работу HDL сервера -Выгрузка HDL сервера... -ELF при вызове IGR -Цвет фона -Цвет обычного текста -- PS2 - -- SMB Server - -Тип IP-адреса -Статичный -DHCP -IP-адрес -Адрес -Маска подсети -Шлюз -DNS сервер -Порт -Сетевая папка -Пользователь -Пароль -<не указано> -Тип адреса -IP -NetBIOS -Принять -Объект будет безвозвратно удален. Продолжить? -Переим. -Удалить -Запустить -Настройки экрана -Разрешить переименование/удаление -Проверять фрагментацию игр на USB -Запоминать последнюю игру -Кнопка выбор -Ошибка, игра фрагментирована -Ошибка, невозможно запустить объект! -Изменения Теста -Оставьте пустым для гостевого доступа -Аккуратное чтение -Альтернативный метод чтения данных -Разблокировать системные вызовы -Пропуск роликов -Эмулировать DVD-DL -Отключить использование IGR -Не используется -Не используется -При изменении размера, VMC переформатируется -Создать -Старт -Изменить -Отменить -Сбросить -Использовать обычную -Настройка VMC -Имя -Размер -Статус -Прогресс -VMC файл существует -Поврежденный VMC файл, неправильный размер -Необходимо создать VMC файл -Ошибка доступа к VMC %s. Продолжить работу с картой памяти в слоте %d? -Автоматическое обновление -О программе -Кодеры -Гарантия качества -Префикс пути для USB -Загрузить другой ELF, после IGR -Значение в минутах, 0 для отключения функции -Автоматическое отключение HDD -Видеорежим -Цвет текста -Выбранный цвет -Не используется -Инфо -Пользовательский ELF -Выбор цвета -Переподключиться -Оставьте пустым для вывода списка -Префикс пути для сетевого ресурса -Удалить -Пробел -Ввод -Режим -VMC слот 1 -VMC слот 2 -ID игры -Режим DMA -Вертикальная синхронизация -Режим 1 -Режим 2 -Режим 3 -Режим 4 -Режим 5 -Режим 6 -Режим 7 -Режим 8 -Конфигурация GSM -Скорость подключения и режим дуплекса -100 Мбит и полный дуплекс -100 Мбит и полудуплекс -10 Мбит и полный дуплекс -10 Мбит и полудуплекс -Настройки GSM -Задействовать GSM -Принудительно задействует GSM с указанными ниже параметрами -Использовать видеорежим -Принудительно задействует пользовательский режим -Отступить влево или вправо -Горизонтальное положение -Отступить вверх или вниз -Вертикальное положение -Вылет развёртки -Регулировать вылет развёртки -Пропуск FMV -Пропускать Full Motion видео -Настройка читов -Включить PS2RD Cheat Engine -PS2RD Cheat Engine пропатчит вашу игру -Режим PS2RD Cheat Engine -Автоматический выбор или выберите чит для игры -Автоматический выбор читов -Выбрать чит для игры -Ошибка, файл с читами не загружен -Не найдено ни читы -Загрузка стандартных -Обновление из Интернет -Перезаписать существующие записи -Не удалось загрузить. -Не удалось соединится с сервером. -Обновление завершено. -Обновление отменено. -Загрузить настройки из Интернет? -Пользовательские настройки -Загрузка стандартных -Автозапуск через %i s... -Автозапуск -Значение в секундах(ы), 0 чтобы выключить автопуск.. -PS2 логотип -Отображается экран, который запускается при запуске игрового диска -Настроить PADEMU -Настройки Pad эмулятора -Включить PadEmulator -Вкл/вык Pad эмулятор для выбранной игры. -Режим Pad эмулятора -Выбрать режим Pad эмулятора. -DualShock3/4 USB -DualShock3/4 BT -Настройки для порта: -Выбрать настройки для порта Pad эмулятора. -Включить эмуляцию -Вкл/вык Pad эмулятор для выбранного порта. -Включить вибрацию -Вкл/вык вибрацию в выбранном порте Pad эмулятора. -Usb bluetooth адаптер МАК адрес: -DS контроллер подключился к MAC-адресу: -Подключение -Подключён DS контроллер -Подключён DS контроллер с Bluetooth адаптером MAC-адрес. -Не подключено -Bluetooth адаптер информация -Показать больше информации и поддерживаемые функции -HCI версия: -LMP версия: -ID производителя: -Поддерживаемые функции: -Да -Нет -Bluetooth адаптер должен быть полностью совместим с DS3/DS4 контроллерами. -Bluetooth адаптер может работать неправильно с DS3/DS4 контроллерами. -Включить Multitap эмуляцию -Выключатель вкл/выкл Multitap эмуляция для выбранной игры. -Multitap эмулятор на порте -Выбрать порт для Multitap эмуляции. -Отключить работу для фальшивого DS3 -Эту опцию нужно отключить, если DS3 фальшивый. -Эмулировать ОБЛАСТЬ обзора -Исправление для игр, где есть проблема с прогрессивным режимом. -Настроить родительский контроль -Пароль для родительского контроля -Не заполняйте, чтобы выключить родительский контроль. -Родительский контроль, введите пароль -Родительский контроль, неверный пароль. -Родительский контроль выключен. -Опции сборки: -Ошибка - этот пароль не может быть использован. -VMC %s файл фрагментирован. Продолжить с картой памяти в слоте %d? -Аудио настройки -Включить звуковые эффекты -Включить звук загрузки -Громкость звуковых эффектов -Громкость звука загрузки -Подтвердить изменение режима видео? -Кэш игрового списка (HDD) -Включить уведомления -%s загруженных из %s -Меню игры -Настройки игры сохранены. -%s удалены настройки. -Перезаписывает существующие настройки совместимости игр, если они включены. -Режим настройки -Глобальный -За игру -Все -Выберите настройки для удаления. -PS1 игры -Отображать экран PS1 игр -POPSTARTER.ELF не найден '%s'! -VCD файл '%s' не найден! -При переименовании файла произошла ошибка. -При удалении файла произошла ошибка. -Не покупайте OPEN-PS2-LOADER (OPL), он абсолютно бесплатен: -ifcaro OPL версия на psx-scene.com -OPL Daily Builds (DB) версия на ps2-home.com diff --git a/lng/lang_Russian_r1682.lng b/lng/lang_Russian_r1682.lng new file mode 100644 index 000000000..47ae59c7c --- /dev/null +++ b/lng/lang_Russian_r1682.lng @@ -0,0 +1,294 @@ +# Translated by druchapucha, frodosumkin, and Marsi4eg. +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +Russian +OPL %s +Сохранить настройки +Назад +Network Settings +Расширенные настройки +<не указано> +Сохранено на %s +Ошибка сохранения настроек! +Выход +Настройки +Меню +Игры USB +Игры HDD +Игры ETH +Приложения +Тема +Язык +Вы действительно хотите отключить консоль? +Вы действительно хотите выйти в Браузер / OSDSYS? +Отменить обновление? +%d: HDD не опознан. +%d: HDD не отформатирован. +%d: Ошибка настройки сети. +%d: Сетевая карта не обнаружена. +%d: Не удается подключиться к SMB-серверу. +%d: Не удается авторизоваться на SMB-сервере. +%d: Не удается открыть сетевой ресурс. +%d: Не удается отобразить список сетевых ресурсов. +%d: Не удается отобразить список игр. +%d: DHCP-сервер недоступен. +%d: Отсутствует подключение к сети. +Вкл +Выкл +Ок +Выбор +Отмена +Круг +Крест +Список игр +Настройки игры +Сбросить настройки +Removed all keys for the game. +Прокрутка +Медленная +Средняя +Быстрая +Меню по умолчанию +Загрузить с диска +Пожалуйста, подождите. +Ошибка загрузки ID игры. +Автоматическая сортировка +Ошибка загрузки языкового файла. +Отключить цвета отладки +Контроллер не обнаружен, ожидание... +Отображать фоновые рисунки +Широкий экран +Выключить консоль +Загрузка настроек... +Сохранение настроек... +Запуск устройства +Обновить +Режим запуска USB +Режим запуска HDD +Режим запуска ETH +Режим показа Приложений +Авто +Вручную +Запуск HDL сервера +HDL сервер запускается... +HDL-сервер запущен... +Не удалось запустить HDL-сервер. +Остановка HDL сервера... +ELF при вызове IGR +Цвет фона +Цвет текста +- PS2 - +- Сервер SMB - +Тип IP-адреса +Статический +DHCP +IP-адрес +Адрес +Маска подсети +Шлюз +DNS сервер +Порт +Сетевая папка +Пользователь +Пароль +<не указано> +Тип адреса +IP +NetBIOS +Принять +Объект будет безвозвратно удален. Продолжить? +Переименовать +Удалить +Старт +Настройки экрана +Разрешить операции записи +Проверять фрагм. игр на USB +Запоминать последнюю игру +Кнопка выбора +Ошибка, игра фрагментирована. +Ошибка, невозможно запустить объект. +Проверка +Оставьте пустым для гостевого доступа +Аккуратное чтение +Синхронный режим +Разблокировать системные вызовы +Пропуск видео +Эмулировать DVD-DL +Отключить IGR +unused +unused +При изменении размера VMC отформатируется. +Создать +Старт +Изменить +Отменить +Сбросить +Использовать Generic +Настроить VMC +Имя +Размер +Статус +Прогресс +Файл VMC уже существует. +Файл VMC поврежден - неправильный размер. +Необходимо создать файл VMC. +Ошибка VMC %s. Использовать карту памяти в слоте %d? +Автообновление списка +О программе +Кодеры +Гарантия качества +Префикс пути для USB +Загрузить другой ELF после IGR. +Значение в минутах, 0 для отключения функции +Автоотключение HDD +Видеорежим +Цвет параметров +Выбранный элемент +Reset Colors +Об игре +Пользовательский ELF +Выбор цвета +Переподключиться +Оставьте пустым для вывода списка ресурсов. +Префикс пути для ETH +Удалить +Пробел +Ввод +Режим +VMC слот 1 +VMC слот 2 +ID игры +Режим DMA +Вертикальная синхронизация +Режим 1 +Режим 2 +Режим 3 +Режим 4 +Режим 5 +Режим 6 +Режим 7 +Режим 8 +Настроить GSM +Режим подключения сети +100 Мбит полный дуплекс +100 Мбит полудуплекс +10 Мбит полный дуплекс +10 Мбит полудуплекс +Настройки GSM +Задействовать GSM +Включает или выключает GSM. +Видеорежим +Принудительный пользовательский видеорежим. +Смещение по горизонтали +Горизонтальное положение картинки. +Смещение по вертикали +Вертикальное положение картинки. +Вылеты развёртки +Регулировка вылетов развёртки. +Пропуск FMV +Пропускать Full Motion Video. +Настройки читов +Включить PS2RD Cheat Engine +PS2RD Cheat Engine пропатчит Вашу игру. +Режим PS2RD Cheat Engine +Автовыбор или выберите чит для игры. +Автовыбор читов +Выбрать чит для игры +Ошибка: не удалось загрузить файл с читами. +Читы не найдены. +Загрузка стандартных +Обновление из Интернет +Перезаписывать существующие настройки +Обновление не удалось. +Не удалось соединиться с сервером обновлений. +Обновление завершено. +Обновление отменено. +Загрузить настройки из Интернет? +Изменено +Загрузка стандартных +Автозапуск через %i s... +Автозапуск +Значение в секундах (s), 0 чтобы выключить автозапуск. +Логотип PS2 +Displayed for a valid disc logo matching the console's region. +Настроить PADEMU +Настройки Pad-эмулятора +Использовать Pad-эмулятор +При включении будет задействован Pad-эмулятор. +Режим Pad-эмулятора +Выбрать режим Pad-эмулятора. +DualShock3/4 USB +DualShock3/4 BT +Настройки для порта: +Выбрать настройки для порта Pad-эмулятора. +Включить эмуляцию +Вкл/выкл Pad-эмулятор для выбранного порта. +Включить вибрацию +Вкл/выкл вибрацию в выбранном порте Pad-эмулятора. +MAC-адрес USB Bluetooth-адаптера: +Контроллер привязан к MAC-адресу: +Привязка +Привязать DS контроллер +Привязать DS контроллер к MAC-адресу Bluetooth-адаптера. +Не подключено +Информация о Bluetooth-адаптере +Показать подробности о поддерживаемых функциях. +Версия HCI: +Версия LMP: +ID производителя: +Поддерживаемые функции: +Да +Нет +Bluetooth-адаптер совместим с контроллерами DS3/DS4. +Bluetooth-адаптер может плохо работать с контроллерами DS3/DS4. +Эмуляция Multitap +Вкл/выкл эмуляцию Multitap. +Порт эмулятора Multitap: +Выбрать порт для эмуляции Multitap. +Не исправлять поддельные DS3 +Некоторым псевдо-DS3 нужно исправление, тут можно отключить его. +Эмуляция полукадра (FIELD) +Исправление для игр, имеющих проблемы с прогрессивным режимом. +Родительский контроль +Пароль родительского контроля +Оставьте пустым для отключения родительского контроля. +Введите пароль родительского контроля +Пароль родительского контроля неверный. +Родительский контроль отключен. +Опции сборки: +Ошибка - этот пароль не может быть установлен. +Файл VMC %s фрагментирован. Продолжить с картой памяти в слоте %d? +Настройки звука +Звуковые эффекты +Звук загрузки +Громкость звуковых эффектов +Громкость звука загрузки +Изменить режим видео? +Кэширование списка игр (HDD) +Показывать уведомления +%s загружено из %s +Меню игры +Настройки игры сохранены. +%s настройки удалены. +Перезапись существующих настроек совместимости игр, если вкл. +Режим настроек +Глобальные +Для игры +Все +Выберите настройки для удаления. +Support Forums: +Title +Genre +Release +Developer +Description +Игры PS1 +Режим показа игр PS1 +POPSTARTER.ELF не найден в '%s'! +VCD-файл '%s' не найден! +Ошибка переименования файла. +Ошибка при удалении файла. +Не покупайте OPEN-PS2-LOADER (OPL), он бесплатный: +Версия ifcaro OPL - на psx-scene.com +Версия OPL Daily Builds (DB) - на ps2-home.com diff --git a/lng/lang_SChinese.lng b/lng/lang_SChinese_r1682.lng similarity index 94% rename from lng/lang_SChinese.lng rename to lng/lang_SChinese_r1682.lng index 74e727701..d3e5d9d8f 100644 --- a/lng/lang_SChinese.lng +++ b/lng/lang_SChinese_r1682.lng @@ -1,12 +1,12 @@ # Translated by kane159 and eyu2007 -# Last update: Nov. 10, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese OPL %s 保存设置 返回 -网络设置 +Network Settings 进阶设置 <无数值> 设置保存到 %s @@ -145,7 +145,7 @@ USB 前缀路径 视频模式 对话框颜色 被选定颜色 -空闲 +Reset Colors 讯息 自定义 ELF 颜色选项 @@ -211,7 +211,7 @@ PS2RD 金手指模式 自动启动 以秒为单位,设为 0 禁用自动启动 PS2 标志 -进入游戏前显示相应标识 +Displayed for a valid disc logo matching the console's region. 配置PADEMU PADEMU设置 开启PADEMU @@ -277,6 +277,12 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 当前游戏 全部 选择要删除的设置。 +Support Forums: +Title +Genre +Release +Developer +Description PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish_r1682.lng similarity index 96% rename from lng/lang_Spanish.lng rename to lng/lang_Spanish_r1682.lng index 3302c2be2..3379b14e8 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish_r1682.lng @@ -1,12 +1,12 @@ # Translation by lauchon22 -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s Guardar cambios Atrás -Ajustes conexión de red +Network Settings Opciones avanzadas Configuración guardada en %s @@ -145,7 +145,7 @@ Paro automático rotación del Disco duro Modo de vídeo interfaz Color de diálogos Color de selección -Sin uso +Reset Colors Info. Archivo ELF personalizado Seleccionar color @@ -211,7 +211,7 @@ Inicio en %i s... Inicio automático Valor en segundos, 0 para desactivar el inicio automático PS2 Logo -Solo se muestra con un disco válido en una consola de la misma región +Displayed for a valid disc logo matching the console's region. Configurar PADEMU Configurar el mando del emulador Habilitar PadEmulator @@ -277,6 +277,12 @@ Global Por Juegos Todos Selecciona configuración a eliminar. +Support Forums: +Title +Genre +Release +Developer +Description Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish_r1682.lng similarity index 95% rename from lng/lang_Swedish.lng rename to lng/lang_Swedish_r1682.lng index 2dbf78d3c..eb511b504 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish_r1682.lng @@ -1,12 +1,12 @@ # Translation by Lord_Flaya -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s Spara ändringar Tillbaka -Nätverkskonfig +Network Settings Avancerad Konfig Inställningar sparade till %s @@ -145,7 +145,7 @@ Automatisk HDD nerspinn Videoläge Dialog färg Vald färg -Används ej +Reset Colors Info Custom ELF Färgval @@ -211,7 +211,7 @@ Autostart om %i s... Autostart Värde i sekund(er), 0 inaktiverar Autostart PS2 Logo -Visas bara när skivavbilden matchar konsolens region +Displayed for a valid disc logo matching the console's region. Konfigurera PADEMU Pad Emulator Inställningar Aktivera PadEmulator @@ -277,6 +277,12 @@ Globalt Per Sper Alla Välj inställningar att ta bort. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese_r1682.lng similarity index 94% rename from lng/lang_TChinese.lng rename to lng/lang_TChinese_r1682.lng index 1b6a0f17a..8553b7610 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese_r1682.lng @@ -1,12 +1,12 @@ # Translated by kane159 and eyu2007 -# Last update: Nov. 10, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s 保存設置 返回 -網路設置 +Network Settings 進階設置 <無數值> 設置保存到 %s @@ -145,7 +145,7 @@ USB 前綴路徑 視頻模式 對話框顏色 被選定顏色 -空閑 +Reset Colors 訊息 自定義 ELF 顏色選項 @@ -211,7 +211,7 @@ PS2RD 金手指模式 自動啟動 以秒為單位,設為 0 禁用自動啟動 PS2 標誌 -進入遊戲前顯示相應標識 +Displayed for a valid disc logo matching the console's region. 配置PADEMU PADEMU設置 開啟PADEMU @@ -277,6 +277,12 @@ vmc %s 文件碎片化.是否繼續使用插槽 %d 中的記憶卡? 當前遊戲 全部 選擇要刪除的設置。 +Support Forums: +Title +Genre +Release +Developer +Description PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish_r1682.lng similarity index 95% rename from lng/lang_Turkish.lng rename to lng/lang_Turkish_r1682.lng index 49799a4e9..e868c5c24 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish_r1682.lng @@ -1,12 +1,12 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s Değişiklikleri kaydet Geri -Ağ ayarları +Network Settings Gelişmiş ayarlar Settings saved to %s @@ -145,7 +145,7 @@ Otomatik Sabit Disk durdurma Video modu İleti rengi Seçili öğe rengi -Kullanılmıyor +Reset Colors Bilgi Özel ELF Renk seçimi @@ -211,7 +211,7 @@ Otomatik başlatılacak %i s... Otomatik başlat Saniye olarak değer, iptal etmek için 0 giriniz PS2 Logosu -Sadece konsolun bölgesine uyan, kabul edilebilir logolar gösterilir. +Displayed for a valid disc logo matching the console's region. PADEMU'yu ayarla Pad Emulator Ayarları PadEmulator Aktif Et @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. diff --git a/lng/lang_Vietnamese.lng b/lng/lang_Vietnamese_r1682.lng similarity index 95% rename from lng/lang_Vietnamese.lng rename to lng/lang_Vietnamese_r1682.lng index a64928baf..66ed4c60c 100644 --- a/lng/lang_Vietnamese.lng +++ b/lng/lang_Vietnamese_r1682.lng @@ -1,12 +1,12 @@ # Translation by zidane89 -# Last update: Nov. 02, 2019 -# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 +# Last update: Feb. 11, 2020 +# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese OPL %s Lưu thay đổi Quay lại -Cấu hình mạng +Network Settings Tùy chọn nâng cao Settings saved to %s @@ -145,7 +145,7 @@ HDD tự động chờ Chế độ Video Màu hộp thoại Chọn màu -Không dùng +Reset Colors Thông tin Tùy chỉnh ELF Màu sắc lựa chọn @@ -211,7 +211,7 @@ Tự khởi động trong %i s... Tự khởi động đơn vị bằng giây(s), 0 để ngắt tự khởi động Logo PS2 -Chỉ hiển thị logo phù hợp với phân vùng máy +Displayed for a valid disc logo matching the console's region. Cấu hình PADEMU Cài đặt giả lập tay cầm Bật PadEmulator @@ -277,6 +277,12 @@ Global Per Game All Select settings to remove. +Support Forums: +Title +Genre +Release +Developer +Description Các trò chơi PS1 Chế độ hiển thị cho game PS1 POPSTARTER.ELF không có ở '%s'! From 1433008480dcd4623e16f64f712573efaa2a5e22 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 12 Feb 2020 19:27:51 -0800 Subject: [PATCH 194/269] update lang files --- lng/lang_Indonesian_r1682.lng | 20 ++++++++++---------- lng/lang_Korean_r1682.lng | 14 +++++++------- lng/lang_Persian_r1682.lng | 20 ++++++++++---------- lng/lang_Portuguese_r1682.lng | 20 ++++++++++---------- lng/lang_Russian_r1682.lng | 22 +++++++++++----------- lng/lang_Swedish_r1682.lng | 18 +++++++++--------- 6 files changed, 57 insertions(+), 57 deletions(-) diff --git a/lng/lang_Indonesian_r1682.lng b/lng/lang_Indonesian_r1682.lng index d030336ea..4917da7e5 100644 --- a/lng/lang_Indonesian_r1682.lng +++ b/lng/lang_Indonesian_r1682.lng @@ -1,12 +1,12 @@ # translated by verislasher and jbliz -# Last update: Feb. 11, 2020 +# Last update: Feb. 12, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s Simpan Perubahan Kembali -Network Settings +Pengaturan Jaringan Pilihan lanjutan Pengaturan disimpan pada %s @@ -145,7 +145,7 @@ HDD Otomatis berhenti Modus video Warna dialog Warna dipilih -Reset Colors +Atur Ulang Warna Info Kustom ELF Pemilihan warna @@ -211,7 +211,7 @@ Mulai otomatis dalam %i s... Mulai otomatis Nilai dalam detik, 0 mencegah mulai otomatis Logo PS2 -Displayed for a valid disc logo matching the console's region. +Ditampilkan logo disc valid sesuai wilayah konsol. Konfigurasi PADEMU Pengaturan Stik Emulator Aktifkan PadEmulator @@ -277,12 +277,12 @@ Global Per Game Seluruh Pilih setingan untuk dihapus. -Support Forums: -Title -Genre -Release -Developer -Description +Forum Dukungan: +Judul +Aliran +Rilis +Pengembang +Deskripsi PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Korean_r1682.lng b/lng/lang_Korean_r1682.lng index 244574ea0..7c29fb393 100644 --- a/lng/lang_Korean_r1682.lng +++ b/lng/lang_Korean_r1682.lng @@ -1,5 +1,5 @@ # Translated by DDinghoya -# Last update: Feb. 11, 2020 +# Last update: Feb. 12, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean @@ -277,12 +277,12 @@ VMC %s 파일이 조각났습니다. 슬롯 %d 에 있는 메모리 카드로 게임당 전부 제거할 설정을 선택하십시오. -Support Forums: -Title -Genre -Release -Developer -Description +지원 포럼: +타이틀 +장르 +개정 +개발자 +설명 PS1 게임 PS1 게임 표시 모드 '%s' 에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Persian_r1682.lng b/lng/lang_Persian_r1682.lng index 1aefe6181..8cc224151 100644 --- a/lng/lang_Persian_r1682.lng +++ b/lng/lang_Persian_r1682.lng @@ -1,12 +1,12 @@ # Translation by saeid0035 -# Last update: Feb. 11, 2020 +# Last update: Feb. 12, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s تاﺮﻴﻴﻐﺗ هﺮﻴﺧذ ﺖﺸﮔﺮﺑ -Network Settings +ﻪﻜﺒﺷ ﺕﺎﻤﻴﻈﻨﺗ ﻪﺘﻓﺮﺸﻴﭘ یﺎﻫ ﻪﻨﻴﺰﮔ >راﺪﻘﻣ نوﺪﺑ< ﺪﺷ هﺮﻴﺧذ %s رد ﺕﺎﻤﻴﻈﻨﺗ @@ -145,7 +145,7 @@ HDD رﺎﻛدﻮﺧ ﺶﺧﺮﭼ ﺶﻫﺎﻛ ﻮﻳﺪﻳو ﺖﻟﺎﺣ ﺎﻫ گﻮﻟﺎﻳد ﮓﻧر ﺎﻫ هﺪﺷ بﺎﺨﺘﻧا ﮓﻧر -Reset Colors +ﺎﮪ ﮓﻧﺭ ﻰﻧﺎﺸﻧ ﺯﺎﺑ تﺎﻋﺎﻠﻃا ﻲﺷرﺎﻔﺳ ELF ﻞﻳﺎﻓ ﮓﻧر بﺎﺨﺘﻧا @@ -211,7 +211,7 @@ PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺖﻟﺎﺣ رﺎﻛدﻮﺧ عوﺮﺷ رﺎﻛدﻮﺧ عوﺮﺷ ندﺮﻛ لﺎﻌﻓﺮﻴﻏ یاﺮﺑ 0 ,ﻪﻴﻧﺎﺛ رد راﺪﻘﻣ 2 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﻮﮔﻮﻟ -Displayed for a valid disc logo matching the console's region. +.ﺩﻮﺷ ﻰﻣ ﻩﺩﺍﺩ ﻥﺎﺸﻧ ﺪﻧﺭﺍﺩ ﻰﻧﺍﻮﺨﻤﻫ ﻝﻮﺴﻨﻛ ﻦﺠﻳﺭ ﺎﺑ ﻪﻛ ﻯﺮﺒﺘﻌﻣ ﻯﺎﻫ ﮏﺴﻳﺩ ﻯﺍﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ یﺪﻨﺑﺮﻜﻴﭘ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ تﺎﻤﻴﻈﻨﺗ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ لﺎﻌﻓ @@ -277,12 +277,12 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ ﻯﺯﺎﺑ ﺮﻫ ﺹﻮﺼﺨﻣ ﻪﻤﻫ ﺪﻴﻨﮐ ﺏﺎﺨﺘﻧﺍ ﺪﻴﻨﮐ ﮎﺎﭘ ﺪﻴﻫﺍﻮﺨﻴﻣ ﻪﻛ ﻰﺗﺎﻤﻴﻈﻨﺗ -Support Forums: -Title -Genre -Release -Developer -Description +:ﻩﺪﺷ ﻰﻧﺎﺒﻴﺘﺸﭘ ﻯﺎﻫ ﻡﺮﻓ +ﻥﺍﻮﻨﻋ +ﺮﻧﺍﮊ +ﻪﺿﺮﻋ ﺦﻳﺭﺎﺗ +ﻩﺪﻧﺯﺎﺳ +ﺕﺎﺤﻴﺿﻮﺗ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ !'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ diff --git a/lng/lang_Portuguese_r1682.lng b/lng/lang_Portuguese_r1682.lng index 4648973b9..5d3bd47b4 100644 --- a/lng/lang_Portuguese_r1682.lng +++ b/lng/lang_Portuguese_r1682.lng @@ -1,12 +1,12 @@ # Translation by danielb -# Last update: Feb. 11, 2020 +# Last update: Feb. 12, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s Salvar alterações Voltar -Network Settings +Configurações de Rede Opções avançadas Configurações guardadas em %s @@ -145,7 +145,7 @@ Desligamento automático do HDD Modo de vídeo Cor do diálogo Cor selecionada -Reset Colors +Report Cores Info ELF personalizado Seleção de Cor @@ -211,7 +211,7 @@ Início automático em %i s... Auto iniciar Valor em segundos, 0 para desativar Logo PS2 -Displayed for a valid disc logo matching the console's region. +Exibido para um logotipo de disco válido que corresponde à região da consola. Configurar PADEMU Definições do Emulador de Comando Ativar Emulador Comando @@ -277,12 +277,12 @@ Global Por jogo Todos Selecione as configurações para remover. -Support Forums: -Title -Genre -Release -Developer -Description +Fóruns de suporte: +Título +Gênero +Data de lançamento +Desenvolvedor +Descrição Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Russian_r1682.lng b/lng/lang_Russian_r1682.lng index 47ae59c7c..ddcc86dfc 100644 --- a/lng/lang_Russian_r1682.lng +++ b/lng/lang_Russian_r1682.lng @@ -1,12 +1,12 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: Feb. 11, 2020 +# Last update: Feb. 12, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s Сохранить настройки Назад -Network Settings +Настройка сети Расширенные настройки <не указано> Сохранено на %s @@ -44,7 +44,7 @@ Network Settings Список игр Настройки игры Сбросить настройки -Removed all keys for the game. +Все опции сброшены! Прокрутка Медленная Средняя @@ -145,7 +145,7 @@ unused Видеорежим Цвет параметров Выбранный элемент -Reset Colors +Сброс цветов Об игре Пользовательский ELF Выбор цвета @@ -211,7 +211,7 @@ PS2RD Cheat Engine пропатчит Вашу игру. Автозапуск Значение в секундах (s), 0 чтобы выключить автозапуск. Логотип PS2 -Displayed for a valid disc logo matching the console's region. +Отображение логотипа диска, соответствующего региону консоли. Настроить PADEMU Настройки Pad-эмулятора Использовать Pad-эмулятор @@ -277,12 +277,12 @@ Bluetooth-адаптер может плохо работать с контро Для игры Все Выберите настройки для удаления. -Support Forums: -Title -Genre -Release -Developer -Description +Форум поддержки: +Название +Жанр +Дата +Разработчик +Описание Игры PS1 Режим показа игр PS1 POPSTARTER.ELF не найден в '%s'! diff --git a/lng/lang_Swedish_r1682.lng b/lng/lang_Swedish_r1682.lng index eb511b504..b3110c986 100644 --- a/lng/lang_Swedish_r1682.lng +++ b/lng/lang_Swedish_r1682.lng @@ -1,12 +1,12 @@ # Translation by Lord_Flaya -# Last update: Feb. 11, 2020 +# Last update: Feb. 12, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s Spara ändringar Tillbaka -Network Settings +Nätverksinställningar Avancerad Konfig Inställningar sparade till %s @@ -145,7 +145,7 @@ Automatisk HDD nerspinn Videoläge Dialog färg Vald färg -Reset Colors +Återställ Färger Info Custom ELF Färgval @@ -211,7 +211,7 @@ Autostart om %i s... Autostart Värde i sekund(er), 0 inaktiverar Autostart PS2 Logo -Displayed for a valid disc logo matching the console's region. +Visas för giltig disklogo matchande konsolens region. Konfigurera PADEMU Pad Emulator Inställningar Aktivera PadEmulator @@ -277,12 +277,12 @@ Globalt Per Sper Alla Välj inställningar att ta bort. -Support Forums: -Title +Support-Forum: +Titel Genre -Release -Developer -Description +Lansering +Utvecklare +Beskrivning PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! From 61662434836cbb79eac5b3f8e7ab882916ddb92f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 12 Feb 2020 20:25:13 -0800 Subject: [PATCH 195/269] default theme adjustment fix for LEFT and RIGHT icons for MenuText attribute --- misc/conf_theme_OPL.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/misc/conf_theme_OPL.cfg b/misc/conf_theme_OPL.cfg index 9383fca76..803c1df89 100644 --- a/misc/conf_theme_OPL.cfg +++ b/misc/conf_theme_OPL.cfg @@ -28,6 +28,7 @@ main3: color=#e6e6e6 x=-230 y=63 + width=200 main4: # Games ISO Vertical List type=ItemsList @@ -312,6 +313,7 @@ mainELM3: color=#e6e6e6 x=-230 y=63 + width=200 mainELM4: # Games ISO Vertical List type=ItemsList From 065b0ab8d3ee38c0e02b6eef469f5da3f9278255 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 13 Feb 2020 10:17:19 -0800 Subject: [PATCH 196/269] update lang files --- lng/lang_Arabic_r1682.lng | 20 ++++++++++---------- lng/lang_Russian_r1682.lng | 14 +++++++------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lng/lang_Arabic_r1682.lng b/lng/lang_Arabic_r1682.lng index 15cbd7638..154b158c4 100644 --- a/lng/lang_Arabic_r1682.lng +++ b/lng/lang_Arabic_r1682.lng @@ -1,12 +1,12 @@ # translation by alimadhi -# Last update: Feb. 11, 2020 +# Last update: Feb. 13, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL ﺕﺍﺮﻴﻴﻐﺘﻟﺍ ﻆﻔﺣ ﻒﻠﺧ -Network Settings +ﺔﻜﺒﺸﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ ﺔﻣﺪﻘﺘﻣ ﺕﺍﺭﺎﻴﺧ >ﻢﻴﻗ ﺪﺟﻮﻳﻻ< s% ﻲﻓ ﺕﺍﺩﺍﺪﻋﻹﺍ ﻆﻔﺣ ﻢﺗ @@ -145,7 +145,7 @@ USB ﺔﺋﺩﺎﺑ ﺭﺎﺴﻣ ﻮﻳﺪﻴﻔﻟﺍ ﻊﺿﻭ ﺭﺍﻮﺤﻟﺍ ﻥﻮﻟ ﺩﺪﺤﻤﻟﺍ ﻥﻮﻠﻟﺍ -Reset Colors +ﻥﺍﻮﻟﻷﺍ ﻦﻴﻴﻌﺗ ﺓﺩﺎﻋﺇ ﺕﺎﻣﻮﻠﻌﻣ ELF ﺺﺼﺨﻣ ﻥﻮﻠﻟﺍ ﺭﺎﻴﺘﺧﺍ @@ -211,7 +211,7 @@ FMV ﺯﺎﻴﺘﺟﺍ ﻲﺋﺎﻘﻠﺗ ﻞﻴﻐﺸﺗ ﻲﺋﺎﻘﻠﺘﻟﺍ ﻞﻴﻐﺸﺘﻟﺍ ﻞﻴﻄﻌﺘﻟ ﺮﻔﺻ ،(s) ﺔﻴﻧﺎﺜﻟﺍ ﻲﻓ ﺔﻤﻴﻘﻟﺍ 2ﻲﻠﺑ ﺭﺎﻌﺷ -Displayed for a valid disc logo matching the console's region. +.ﻢﻜﺤﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻘﻄﻨﻣ ﻖﺑﺎﻄﻳ ﺢﻟﺎﺻ ﺹﺮﻗ ﺭﺎﻌﺸﻟ ﺽﻭﺮﻌﻣ PADEMU ﻦﻳﻮﻜﺗ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﺕﺍﺩﺍﺪﻋﺍ ﻢﻜﺤﺗ ﻲﻛﺎﺤﻣ ﻦﻴﻜﻤﺗ @@ -277,12 +277,12 @@ s% ﻦﻣ ﻞﻤﺤﻣ s% ﺔﺒﻌﻟ ﻞﻜﻟ ﻞﻜﻟﺍ .ﺎﻬﺘﻟﺍﺯﻹ ﺕﺍﺩﺍﺪﻋﻹﺍ ﺩﺪﺣ -Support Forums: -Title -Genre -Release -Developer -Description +:ﻢﻋﺪﻟﺍ ﺕﺎﻳﺪﺘﻨﻣ +ﻥﺍﻮﻨﻋ +ﺏﻮﻠﺳﻻﺍ +ﺭﺍﺪﺻﻻﺍ +ﺭﻮﻄﻣ +ﻒﺻﻭ PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_Russian_r1682.lng b/lng/lang_Russian_r1682.lng index ddcc86dfc..39edd61ad 100644 --- a/lng/lang_Russian_r1682.lng +++ b/lng/lang_Russian_r1682.lng @@ -1,12 +1,12 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: Feb. 12, 2020 +# Last update: Feb. 13, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s Сохранить настройки Назад -Настройка сети +Настройки сети Расширенные настройки <не указано> Сохранено на %s @@ -44,7 +44,7 @@ OPL %s Список игр Настройки игры Сбросить настройки -Все опции сброшены! +Все ключи для игры удалены. Прокрутка Медленная Средняя @@ -145,7 +145,7 @@ unused Видеорежим Цвет параметров Выбранный элемент -Сброс цветов +Сбросить цвета Об игре Пользовательский ELF Выбор цвета @@ -211,7 +211,7 @@ PS2RD Cheat Engine пропатчит Вашу игру. Автозапуск Значение в секундах (s), 0 чтобы выключить автозапуск. Логотип PS2 -Отображение логотипа диска, соответствующего региону консоли. +Отображается при совпадении регионов диска и консоли. Настроить PADEMU Настройки Pad-эмулятора Использовать Pad-эмулятор @@ -277,10 +277,10 @@ Bluetooth-адаптер может плохо работать с контро Для игры Все Выберите настройки для удаления. -Форум поддержки: +Форумы поддержки: Название Жанр -Дата +Выпуск Разработчик Описание Игры PS1 From 1e85e2b5239f2dd14b72fe40e50240985ea09e51 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 13 Feb 2020 10:24:55 -0800 Subject: [PATCH 197/269] update lang files --- lng/lang_Portuguese_BR_r1682.lng | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lng/lang_Portuguese_BR_r1682.lng b/lng/lang_Portuguese_BR_r1682.lng index 4cf51098a..f97b0d559 100644 --- a/lng/lang_Portuguese_BR_r1682.lng +++ b/lng/lang_Portuguese_BR_r1682.lng @@ -1,12 +1,12 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Feb. 11, 2020 +# Last update: Feb. 13, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s Salvar mudanças Voltar -Network Settings +Configurações de Rede Opções avançadas Configurações salvas em %s @@ -145,7 +145,7 @@ Desligamento automático do HDD (spin down) Modo de vídeo Cor do diálogo Cor da seleção -Reset Colors +Redefinir Cores Info Customizar ELF principal Seleção de cor @@ -211,7 +211,7 @@ Auto iniciar em %i segundos Auto iniciar Valor em segundo(s), 0(zero) desabilita o auto iniciar Logo PS2 -Displayed for a valid disc logo matching the console's region. +Exibido para um logotipo de disco válido que corresponde à região do console. Configurar PADEMU Configurações do Emulador de Controles Ativar Emulador de Controles @@ -277,12 +277,12 @@ Global Por jogo Todos Selecione as configurações para remover. -Support Forums: -Title -Genre -Release -Developer -Description +Fóruns de suporte: +Título +Gênero +Data de lançamento +Desenvolvedor +Descrição Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! From 6c0550b6ad1ef40a4671ea16e33876c1b0a2b203 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 13 Feb 2020 10:28:35 -0800 Subject: [PATCH 198/269] update lang files --- lng/lang_Portuguese_BR_r1682.lng | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lng/lang_Portuguese_BR_r1682.lng b/lng/lang_Portuguese_BR_r1682.lng index f97b0d559..403ebaa7b 100644 --- a/lng/lang_Portuguese_BR_r1682.lng +++ b/lng/lang_Portuguese_BR_r1682.lng @@ -4,9 +4,9 @@ # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s -Salvar mudanças +Salvar configurações Voltar -Configurações de Rede +Configurações de rede Opções avançadas Configurações salvas em %s From 4430aeb70b5863781862b5956c3c55440ea56319 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 14 Feb 2020 08:33:28 -0800 Subject: [PATCH 199/269] readjust element Description on the INFO page --- misc/conf_theme_OPL.cfg | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/misc/conf_theme_OPL.cfg b/misc/conf_theme_OPL.cfg index 803c1df89..5df8cefc2 100644 --- a/misc/conf_theme_OPL.cfg +++ b/misc/conf_theme_OPL.cfg @@ -156,24 +156,17 @@ info9: y=104 width=250 info10: - type=StaticText - value=Description : - aligned=0 - color=#e6e6e6 - x=36 - y=180 -info11: type=AttributeText attribute=Description + display=0 aligned=0 - display=2 color=#e6e6e6 x=36 - y=206 + y=180 width=560 height=68 wrap=1 -info12: +info11: type=AttributeText attribute=#Media display=2 @@ -181,7 +174,7 @@ info12: color=#e6e6e6 x=45 y=305 -info13: +info12: type=AttributeText attribute=#Format display=2 @@ -189,7 +182,7 @@ info13: color=#e6e6e6 x=85 y=305 -info14: +info13: type=AttributeText attribute=VmodeText display=2 @@ -197,7 +190,7 @@ info14: color=#e6e6e6 x=135 y=305 -info15: +info14: type=AttributeText attribute=ScanText display=2 @@ -205,7 +198,7 @@ info15: color=#e6e6e6 x=263 y=305 -info16: +info15: type=AttributeText attribute=AspectText display=2 @@ -213,7 +206,7 @@ info16: color=#e6e6e6 x=417 y=305 -info17: +info16: # modes type=AttributeText attribute=Modes @@ -223,7 +216,7 @@ info17: x=545 y=305 width=220 -info18: +info17: type=AttributeText attribute=ParentalText display=2 @@ -231,14 +224,14 @@ info18: color=#e6e6e6 x=-65 y=132 -info19: +info18: type=StaticText value=Players : aligned=1 color=#e6e6e6 x=320 y=-120 -info20: +info19: type=AttributeText attribute=PlayersText display=2 @@ -246,14 +239,14 @@ info20: color=#e6e6e6 x=320 y=-92 -info21: +info20: # Run / Back Text at bottom center type=InfoHintText aligned=1 color=#e6e6e6 x=255 y=-30 -info22: +info21: type=AttributeText attribute=Cheat display=1 @@ -262,20 +255,20 @@ info22: x=290 y=126 width=250 -info23: +info22: type=StaticText value=/ ID : aligned=0 color=#e6e6e6 x=123 y=148 -info24: +info23: type=ItemText aligned=0 color=#e6e6e6 x=160 y=148 -info25: +info24: type=AttributeText attribute=Size display=1 @@ -283,7 +276,7 @@ info25: color=#e6e6e6 x=36 y=148 -info26: +info25: # flashing icon on bottom right hand corner type=LoadingIcon scaled=0 From 4e5409ff31bd7049b3743b01fba04587d443b3bf Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 14 Feb 2020 17:45:59 -0800 Subject: [PATCH 200/269] update lang files --- lng/lang_Spanish_r1682.lng | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lng/lang_Spanish_r1682.lng b/lng/lang_Spanish_r1682.lng index 3379b14e8..6ba4fc698 100644 --- a/lng/lang_Spanish_r1682.lng +++ b/lng/lang_Spanish_r1682.lng @@ -1,12 +1,12 @@ # Translation by lauchon22 -# Last update: Feb. 11, 2020 +# Last update: Feb. 14, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s Guardar cambios Atrás -Network Settings +Configuración de red Opciones avanzadas Configuración guardada en %s @@ -145,7 +145,7 @@ Paro automático rotación del Disco duro Modo de vídeo interfaz Color de diálogos Color de selección -Reset Colors +Restaurar colores Info. Archivo ELF personalizado Seleccionar color @@ -211,7 +211,7 @@ Inicio en %i s... Inicio automático Valor en segundos, 0 para desactivar el inicio automático PS2 Logo -Displayed for a valid disc logo matching the console's region. +Muestra un logotipo de disco válido que coincida con la región de la consola. Configurar PADEMU Configurar el mando del emulador Habilitar PadEmulator @@ -277,12 +277,12 @@ Global Por Juegos Todos Selecciona configuración a eliminar. -Support Forums: -Title -Genre -Release -Developer -Description +Foros de soporte: +Título +Género +Lanzamiento +Desarrollador +Descripción Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! From 885ccfe7b517e6b54b777c1214518ab648e934f6 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 15 Feb 2020 07:13:40 -0800 Subject: [PATCH 201/269] update lang files --- lng/lang_Hungarian_r1682.lng | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lng/lang_Hungarian_r1682.lng b/lng/lang_Hungarian_r1682.lng index 84c715cc5..18e72bbd2 100644 --- a/lng/lang_Hungarian_r1682.lng +++ b/lng/lang_Hungarian_r1682.lng @@ -1,12 +1,12 @@ # Translation by co5oos -# Last update: Feb. 11, 2020 +# Last update: Feb. 15, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s Változtatások mentése Vissza -Network Settings +Hálózati Beállítások Haladó beállítások Beállítások elmentve %s-be @@ -145,7 +145,7 @@ Automatikus Merevlemez kikapcsolás Videó mód Párbeszédablak színe Kiválasztott színe -Reset Colors +Színek Visszaállítása Infó Testreszabott ELF Szín szelekció @@ -211,7 +211,7 @@ Automatikus indítás %i s belül... Automatikus indítás Érték másodperc(ek)ben, 0 az Automatikus indítás letiltásához PS2 Logó -Displayed for a valid disc logo matching the console's region. +A konzol régiójához megfelelő lemez logó megjelenése. PADEMU konfigurálás Pad Emulator Beállítások PadEmulator Engedélyezése @@ -277,12 +277,12 @@ Globális Játékonként Összes Válassza ki az eltávolítani való beállításokat. -Support Forums: -Title -Genre -Release -Developer -Description +Támogatási Fórumok: +Cím +Műfaj +Megjelenés +Fejlesztő +Leírás PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! From 14716c389d87d80fabeba16eab726da9f6d92c5f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 27 Mar 2020 19:33:05 -0700 Subject: [PATCH 202/269] update lang files --- lng/lang_French_r1682.lng | 110 +++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/lng/lang_French_r1682.lng b/lng/lang_French_r1682.lng index 07f9c06c6..b9be7f259 100644 --- a/lng/lang_French_r1682.lng +++ b/lng/lang_French_r1682.lng @@ -1,12 +1,12 @@ # Translation by machiavel and Squall -# Last update: Feb. 11, 2020 +# Last update: March 26, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s Sauvegarder Retour -Network Settings +Paramètres réseau Options avancées Paramètres sauvegardés vers %s @@ -23,17 +23,17 @@ Langue Le système va être éteint. Quitter vers Menu? Annuler mise à jour? -%d: HDD non détecté -%d: HDD non formaté -%d: Erreur démarrage réseau -%d: Adaptateur réseau non détecté -%d: Ne peut se connecter au serveur SMB -%d: Ne peut s'authentifier au serveur SMB -%d: Ne peut ouvrir le partage SMB -%d: Ne peut lister les partages SMB -%d: Ne peut lister les jeux -%d: Serveur DHCP indisponible -%d: Pas de connexion réseau +%d: HDD non détecté. +%d: HDD non formaté. +%d: Erreur démarrage réseau. +%d: Adaptateur réseau non détecté. +%d: Ne peut se connecter au serveur SMB. +%d: Ne peut s'authentifier au serveur SMB. +%d: Ne peut ouvrir le partage SMB. +%d: Ne peut lister les partages SMB. +%d: Ne peut lister les jeux. +%d: Serveur DHCP indisponible. +%d: Pas de connexion réseau. Acti. Désa. OK @@ -44,24 +44,24 @@ Croix Liste des jeux Options du jeu Supprimer les paramètres -Options du jeu supprimées +Options du jeu supprimées. Défilement Lent Moyen Rapide Menu par défaut Charger depuis le disque -Veuillez patienter -Erreur lors du chargement de l'ID du jeu +Veuillez patienter. +Erreur lors du chargement de l'ID du jeu. Tri automatique -Erreur lors du chargement du fichier langue +Erreur lors du chargement du fichier langue. Désactiver couleurs de debug Aucune manette détectée, attente... Activer jaquette Écran large Éteindre -Chargement config -Sauvegarde config +Chargement config... +Sauvegarde config... Démarrer le périphérique Rafraîchir Mode de démarrage USB @@ -73,7 +73,7 @@ Manuel Démarrer serveur HDL Démarrage serveur HDL... Serveur HDL démarré... -Démarrage serveur HDL échoué +Démarrage serveur HDL échoué. Déchargement serveur HDL... Chemin IGR Couleur de fond @@ -97,7 +97,7 @@ Type d'adresse IP NetBIOS Accepter -L'objet sera définitivement supprimé, continuer ? +L'objet sera définitivement supprimé, continuer? Renommer Supprimer Lancer @@ -106,10 +106,10 @@ Activer l'écriture Vérifier fragmentation jeu USB Souvenir dernier jeu joué Bouton de sélection -Erreur, le jeu est fragmenté -Erreur, impossible de lancer l'objet +Erreur, le jeu est fragmenté. +Erreur, impossible de lancer l'objet. Tester les changements -Laissez vide pour authentification invité +Laissez vide pour authentification invité. Lecture précise (simule la vitesse de lecture du CD/DVD) Mode synchrone (mode de lecture alternatif) Décrocher Syscalls (purge OPL après lancement du jeu) @@ -130,27 +130,27 @@ Nom Taille État Progression -Fichier VMC existant -Fichier VMC invalide, taille incorrecte -Fichier VMC doit d'abord être créé +Fichier VMC existant. +Fichier VMC invalide, taille incorrecte. +Fichier VMC doit d'abord être créé. Erreur d'accès à la VMC %s. Continuer avec la Memory Card dans le slot %d? Rafraîchissement automatique À propos Codeurs Assurance qualité Préfixe du chemin USB -Lancer ELF perso après un IGR -En minute(s), 0 pour désactiver l'arrêt automatique +Lancer ELF perso après un IGR. +En minute(s), 0 pour désactiver l'arrêt automatique. Arrêt auto. HDD Mode vidéo Couleur dialogue Couleur sélectionné -Reset Colors +Réinitialiser les couleurs Info ELF personnalisé Sélection de la couleur Reconnecter -Laissez vide pour lister les partages +Laissez vide pour lister les partages. Préfixe du chemin ETH Effacer Espace @@ -177,41 +177,41 @@ Lien mode ETH 10Mbit Half-duplex Options GSM Activer GSM -Basculer On/Off GSM +Basculer On/Off GSM. VMODE -Mode d'affichage perso forcé +Mode d'affichage perso forcé. Pos. H -Ajustement horizontal +Ajustement horizontal. Pos. V -Ajustement vertical +Ajustement vertical. Overscan -Ajustement Overscan +Ajustement Overscan. Passer FMV -Passe les FMV +Passe les FMV. Options de cheat Activer PS2RD -Laisser PS2RD patcher vos jeux +Laisser PS2RD patcher vos jeux. Mode PS2RD -Automatique/Manuel -Automatique +Automatique/Manuel. +Automatique. Manuel (inactif, fonction à venir) -Erreur: Impossible de charger le fichier de cheat +Erreur: Impossible de charger le fichier de cheat. Aucun cheat trouvé Télécharger les régl. par défaut Mise à jour réseau Ecraser les enregistrements existants -Mise à jour échouée -Échec de connexion au serveur +Mise à jour échouée. +Échec de connexion au serveur. Mise à jour terminée. Mise à jour annulée. Télécharger les options depuis le réseau? Options personnalisées Options par défaut téléchargées Démarrage auto dans %i s... -Démarrage auto. -Valeur en seconde(s), 0 pour désactiver le démarrage auto +Démarrage auto +Valeur en seconde(s), 0 pour désactiver le démarrage auto. Logo PS2 -Displayed for a valid disc logo matching the console's region. +Affiche le logo du disque correspondant à la région de la console. Configurer PADEMU Options de PADEMU Activer PadEmulator @@ -233,7 +233,7 @@ Appairer contrôleur DS Appairer contrôleur DS avec l'adresse MAC de l'adaptateur Bluetooth. Non Connecté Informations de l'adaptateur Bluetooth -Montrer plus d'informations et de fonctions supportées +Montrer plus d'informations et de fonctions supportées. Version HCI: Version LMP: ID Fabricant: @@ -244,8 +244,8 @@ L'adaptateur Bluetooth devrait être parfaitement compatible avec les contrôleu L'adaptateur Bluetooth peut ne pas fonctionner correctement avec les contrôleurs DS3/DS4. Activer l'émulation du Multitap Active/désactive l'émulation du Multitap pour le jeu sélectionné. -Émulateur Multitap sur le port -Sélectionnez le port pour émuler le Multitap +Émulateur Multitap sur le port: +Sélectionnez le port pour émuler le Multitap. Désactiver correctif des DS3 simulées Certaines DS3 simulées nécessitent ce correctif, cette option le désactivera. Émuler FIELD flipping @@ -269,19 +269,19 @@ Cache liste de jeu (HDD) Activer les Notifications %s chargé depuis %s Menu du jeu -Supprimer les paramètres -%s paramètres supprimés +Supprimer les paramètres. +%s paramètres supprimés. Écrase les paramètres de compatibilité de jeu existants lorsqu'il est activé. Mode Paramètres Global Par jeu Tout Sélectionnez les paramètres à supprimer. -Support Forums: -Title +Forums d'assistance: +Titre Genre -Release -Developer +Mise à jour +Développeur Description PS1 Games Mode d'affichage des jeux PS1 From 47065d7f43f9b5d9676d0af212d541710e152753 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 17 Apr 2020 18:24:42 -0700 Subject: [PATCH 203/269] update lang files --- lng/lang_German_r1682.lng | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lng/lang_German_r1682.lng b/lng/lang_German_r1682.lng index f9834b273..af039e1d0 100644 --- a/lng/lang_German_r1682.lng +++ b/lng/lang_German_r1682.lng @@ -1,12 +1,12 @@ # German Translation by ps2guy and LopoTRI -# Last update: Feb. 11, 2020 +# Last update: April 11, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s Änderungen speichern Zurück -Network Settings +Netzwerkeinstellungen Fortgeschrittene Optionen Einstellungen gespeichert in %s @@ -145,7 +145,7 @@ Autom. Abschaltung der Festplatte Videomodus Dialogfarbe Auswahlfarbe -Reset Colors +Farben zurücksetzen Info Benutzerdefinierte ELF Farbauswahl @@ -211,7 +211,7 @@ Automatischer Start in %i s... Automatischer Start Wert in Sekunden, 0 um Auto-start zu deaktivieren PS2 Logo -Displayed for a valid disc logo matching the console's region. +Wird für ein gültiges Disc-Logo angezeigt, dass der Region der Konsole entspricht. PADEMU konfigurieren Einstellungen Pad Emulator Pad Emulator aktivieren @@ -277,12 +277,12 @@ Global je Spiel Alle Einstellungen Auswählen zum entfernen. -Support Forums: -Title +Support-Foren +Titel Genre -Release -Developer -Description +Veröffentlichung +Entwickler +Beschreibung PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! From d6a4d41a7f6e597547f60431da073e29ebee54b8 Mon Sep 17 00:00:00 2001 From: Tobias Jakobi Date: Thu, 9 Apr 2020 15:31:13 +0200 Subject: [PATCH 204/269] Increase read delay cycles for Kingdom Hearts II (#248) The initial version of KH2 has some timing issues with disc reads which leads to a game lockup when entering the gummi ship menu. A patch applied by the ee_core exists since quite some time, but probably because of improvements to the rest of the project, the original delay cycles count is no longer sufficient to prevent the game from locking up. Some bisection has shown that increasing the value from 0x100000 to 0x110000 is sufficient. For reference, a value 0x10c000 already fails to work. Also note that there are multiple critical transitions the game does. One is the obvious transition from the overworld map to the gummi menu. Another one is the transition from the gummi stage back to the gummi menu. E.g. with a value of 0x10c000 the former one works, but the latter fails. All tests were done using SMB mode and the SLUS_210.05 release. It seems plausible that the other language release suffer from the same issues, so apply the new value to all of them. --- ee_core/src/patches.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ee_core/src/patches.c b/ee_core/src/patches.c index 857e181a9..d7f63eab4 100644 --- a/ee_core/src/patches.c +++ b/ee_core/src/patches.c @@ -65,13 +65,13 @@ static const patchlist_t patch_list[] = { {"SLUS_212.00", USB_MODE, {PATCH_GENERIC_AC9B, 0x00000000, 0x00000000}}, // Armored Core Nine Breaker NTSC U - skip failing case on binding a RPC server {"SLES_538.19", USB_MODE, {PATCH_GENERIC_AC9B, 0x00000000, 0x00000000}}, // Armored Core Nine Breaker PAL - skip failing case on binding a RPC server {"SLPS_254.08", USB_MODE, {PATCH_GENERIC_AC9B, 0x00000000, 0x00000000}}, // Armored Core Nine Breaker NTSC J - skip failing case on binding a RPC server - {"SLUS_210.05", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00100000, 0x001ac514}}, // Kingdom Hearts 2 US - [Gummi mission freezing fix (check addr is where to patch, - {"SLES_541.14", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00100000, 0x001ac60c}}, // Kingdom Hearts 2 UK - val is the amount of delay cycles)] - {"SLES_542.32", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00100000, 0x001ac60c}}, // Kingdom Hearts 2 FR - {"SLES_542.33", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00100000, 0x001ac60c}}, // Kingdom Hearts 2 DE - {"SLES_542.34", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00100000, 0x001ac60c}}, // Kingdom Hearts 2 IT - {"SLES_542.35", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00100000, 0x001ac60c}}, // Kingdom Hearts 2 ES - {"SLPM_662.33", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00100000, 0x001ac44c}}, // Kingdom Hearts 2 JPN + {"SLUS_210.05", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00110000, 0x001ac514}}, // Kingdom Hearts 2 US - [Gummi mission freezing fix (check addr is where to patch, + {"SLES_541.14", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00110000, 0x001ac60c}}, // Kingdom Hearts 2 UK - val is the amount of delay cycles)] + {"SLES_542.32", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00110000, 0x001ac60c}}, // Kingdom Hearts 2 FR + {"SLES_542.33", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00110000, 0x001ac60c}}, // Kingdom Hearts 2 DE + {"SLES_542.34", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00110000, 0x001ac60c}}, // Kingdom Hearts 2 IT + {"SLES_542.35", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00110000, 0x001ac60c}}, // Kingdom Hearts 2 ES + {"SLPM_662.33", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00110000, 0x001ac44c}}, // Kingdom Hearts 2 JPN {"SLPM_666.75", ALL_MODE, {PATCH_GENERIC_SLOW_READS, 0x00149210, 0x001adf64}}, // Kingdom Hearts 2 Final Mix JPN {"SLUS_212.87", ETH_MODE, {PATCH_GENERIC_SLOW_READS, 0x000c0000, 0x006cd15c}}, // Prince of Persia: The Two Thrones NTSC U - slow down cdvd reads {"SLUS_212.87", HDD_MODE, {PATCH_GENERIC_SLOW_READS, 0x00040000, 0x006cd15c}}, // Prince of Persia: The Two Thrones NTSC U - slow down cdvd reads From 7607bc454375c3a97347ad50b2042cdd8b9323c4 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 11 May 2020 01:16:53 -0700 Subject: [PATCH 205/269] update lang files --- lng/lang_Bulgarian_r1682.lng | 56 +++--- lng/lang_Greek_r1682.lng | 238 +++++++++++------------ lng/lang_Korean_r1682.lng | 88 ++++----- lng/lang_Polish_r1682.lng | 358 +++++++++++++++++------------------ lng/lang_TChinese_r1682.lng | 4 +- 5 files changed, 372 insertions(+), 372 deletions(-) diff --git a/lng/lang_Bulgarian_r1682.lng b/lng/lang_Bulgarian_r1682.lng index 9aabce679..22c4bf59d 100644 --- a/lng/lang_Bulgarian_r1682.lng +++ b/lng/lang_Bulgarian_r1682.lng @@ -1,15 +1,15 @@ # translation by vsub and wisi -# Last update: Feb. 11, 2020 +# Last update: April 18, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s Запазване на промените Назад -Network Settings +Мрежови настройки Детайлни настройки <Няма опции> -Settings saved to %s +Настройки запазени в %s Грешка при записване на настройките! Изход Настройки @@ -43,7 +43,7 @@ O (Кръг) X (Хикс) Списък Игри Опции -Remove Settings +Изчистване на настройките Изчистени всички бутони за играта Превъртане бавно @@ -108,7 +108,7 @@ NetBIOS Бутон за избор Грешка - играта е фрагментирана! Грешка - не може да се стартира! -Test Changes +Проба на промените Оставете свободно за влизане като "гост". Прецизно четене Синхронен режим @@ -145,8 +145,8 @@ USB поддиректория Видео режим Цвят на опциите Цвят на избран обект -Reset Colors -Info +Цвет при начална стойност +Информация Нестандартен ELF Избор на цвят Свързване @@ -199,7 +199,7 @@ Cheats по избор Не са открити Cheats Сваляне на настройки Мрежово обновяване -Overwrite Existing Records +Презапис на наличните записи? Неуспешно обновяване. Неуспешна връзка с сървъра. Обновяване завършено. @@ -211,7 +211,7 @@ Overwrite Existing Records След Стойност в секунди, 0 за деактивиране. PS2 Лого -Displayed for a valid disc logo matching the console's region. +Показва се ако е валидно и съвпада с региона на конзолата Настройки на PADEMU Емулатор за контролер - настройки Включване на PADEMU @@ -264,25 +264,25 @@ VMC %s файлът е фрагментиран. Продължаване с Mem Звук при Начално зареждане Сила на Звуковите ефекти Сила на звука на Начално зареждане -Потвърждаване на промените във видеорежима? -Cache Game List (HDD) -Enable Notifications -%s loaded from %s -Game Menu -Game settings saved. -%s settings removed. -Overwrites existing game compatibility settings when enabled. -Settings Mode -Global -Per Game -All -Select settings to remove. -Support Forums: -Title -Genre -Release -Developer -Description +Потвърждаване на промените на видеорежима? +Кеширане списъка с игри (ЗУТМД - HDD) +Видими на Известия +%s зареден от %s +Меню Игри +Настройките на игри запазени. +%s настройки премахнати. +Презаписва съществуващите настройки на съвместимаст. +Режим Настройки +Общи +За определена игра +Всички +Избор на настройки, които да бъдат премахнати. +Форуми за подръжка: +Заглавие +Жанр +Издадена +Производител +Описание PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Greek_r1682.lng b/lng/lang_Greek_r1682.lng index 501a60a6a..e8852f7d1 100644 --- a/lng/lang_Greek_r1682.lng +++ b/lng/lang_Greek_r1682.lng @@ -1,15 +1,15 @@ # Greek Translation by RivalK93 -# Last update: Feb. 11, 2020 +# Last update: April 18, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s -Αποθήκευση αλλαγών +Αποθήκευση Αλλαγών Πίσω -Network Settings -Προχωρημένες ρυθμίσεις +Ρυθμίσεις Δικτύου +Σύνθετες Επιλογές <κενό> -Settings saved to %s +Αποθήκευση ρυθμίσεων σε %s Σφάλμα κατά την εγγραφή των ρυθμίσεων! Έξοδος Ρυθμίσεις @@ -41,81 +41,81 @@ OK Άκυρο Ο Χ -Λίστα παιχνιδιών -Ρυθμίσεις -Remove Settings +Λίστα Παιχνιδιών +Ρυθμίσεις Παιχνιδιού +Κατάργηση Ρυθμίσεων Καταργήθηκαν όλα τα πλήκτρα για το παιχνίδι. Κύλιση -Αργό -Κανονικό -Γρήγορο -Προεπιλεγμένο μενού -Φόρτωση από το δίσκο -Παρακαλώ περιμένετε... +Αργή +Κανονική +Γρήγορη +Προεπιλεγμένο Μενού +Φόρτωση από το Δίσκο +Παρακαλώ περιμένετε. Σφάλμα κατά τη φόρτωση του ID του παιχνιδιού. -Αυτόματη ταξινόμηση +Αυτόματη Ταξινόμηση Σφάλμα κατά τη φόρτωση του αρχείου γλώσσας. -Απενεργοποίηση χρωμάτων Debug +Απενεργοποίηση Χρωμάτων Debug Δεν εντοπίστηκε χειριστήριο, αναμονή... -Ενεργοποίηση εξωφύλλων +Ενεργοποίηση Εξωφύλλων Widescreen Απενεργοποίηση -Φόρτωση ρυθμίσεων -Αποθήκευση ρυθμίσεων -Εκκίνηση συσκευής +Φόρτωση ρυθμίσεων... +Αποθήκευση ρυθμίσεων... +Εκκίνηση Συσκευής Ανανέωση -Εκκίνηση λειτουργίας USB -Εκκίνηση λειτουργίας HDD -Εκκίνηση λειτουργίας ETH -Εκκίνηση μενού Εφαρμογών +Εκκίνηση Λειτουργίας USB +Εκκίνηση Λειτουργίας HDD +Εκκίνηση Λειτουργίας ETH +Εκκίνηση Μενού Εφαρμογών Αυτόματα Μη αυτόματα -Εκκίνηση εξυπηρετητή HDL -Γίνεται εκκίνηση εξυπηρετητή HDL... -Λειτουργία εξυπηρετητή HDL... -Αποτυχία εκκίνησης εξυπηρετητή HDL. -Αποφόρτωση εξυπηρετητή HDL... -Προορισμός μετά από IGR -Χρώμα στο φόντο -Χρώμα γραμματοσειράς +Εκκίνηση Εξυπηρετητή HDL +Γίνεται εκκίνηση Εξυπηρετητή HDL... +Λειτουργία Εξυπηρετητή HDL... +Αποτυχία εκκίνησης Εξυπηρετητή HDL. +Αποφόρτωση Εξυπηρετητή HDL... +Προορισμός Μετά Από IGR +Χρώμα στο Φόντο +Χρώμα Γραμματοσειράς - PS2 - - Εξυπηρετητής SMB - -Τύπος διεύθυνσης IP +Τύπος Διεύθυνσης IP Στατική DHCP Διεύθυνση IP Διεύθυνση -Μάσκα υποδικτύου +Μάσκα Υποδικτύου Gateway Εξυπηρετητής DNS Θύρα -Κοινόχρηστο στοιχείο +Κοινόχρηστο Στοιχείο Χρήστης Κωδικός <κενό> -Τύπος διεύθυνσης +Τύπος Διεύθυνσης IP NetBIOS Αποδοχή Το αρχείο θα διαγραφεί οριστικά, συνέχεια; -Μετ/σία +Μετονομασία Διαγραφή Εκκίνηση -Ρυθμίσεις οθόνης -Λειτουργίες εγγραφής -Έλεγχος κατακερματισμού USB -Απομνημόνευση τελευταίου παιχν. -Πλήκτρο επιλογής +Ρυθμίσεις Οθόνης +Λειτουργίες Εγγραφής +Έλεγχος Κατακερματισμού USB +Απομνημόνευση Τελευταίου Παιχνιδιού +Πλήκτρο Επιλογής Σφάλμα, το παιχνίδι είναι κατακερματισμένο. Σφάλμα, αδυναμία εκτέλεσης του αρχείου. -Test Changes +Δοκιμή Αλλαγών Αφήστε το κενό για δικαιώματα GUEST. -Ακριβής ανάγνωση. -Συγχρονισμένη λειτουργία ανάγνωσης. -Αποκοπή Syscalls. -Παράλειψη των videos. -Προσομοίωση DVD-DoubleLayer δίσκου. -Απενεργοποίηση In-Game-Reset(IGR). +Ακριβής Ανάγνωση +Συγχρονισμένη Λειτουργία Ανάγνωσης +Αποκοπή Syscalls +Παράλειψη των Videos +Προσομοίωση DVD-DoubleLayer Δίσκου +Απενεργοποίηση In-Game-Reset(IGR) Αχρησιμοποίητο Αχρησιμοποίητο Αλλάζοντας το μέγεθος θα αναδιαμορφώστε τη VMC. @@ -124,7 +124,7 @@ Test Changes Τροποποίηση Ακύρωση Επαναφορά -VMC γενικής χρήσης +VMC Γενικής Χρήσης Ρύθμιση VMC Όνομα Μέγεθος @@ -133,32 +133,32 @@ VMC γενικής χρήσης Το αρχείο VMC υπάρχει ήδη. Μη έγκυρο αρχείο VMC, το μέγεθος είναι λάθος. Πρέπει να δημιουργηθεί αρχείο VMC. -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Σφάλμα κατά την πρόσβαση σε VMC %s. Συνέχεια με την Κάρτα Μνήμης στη θύρα %d; Αυτόματη ανανέωση Σχετικά Προγραμματιστές -Διασφάλιση ποιότητας -Πρόθεμα μονοπατιού USB +Διασφάλιση Ποιότητας +Πρόθεμα Μονοπατιού USB Εκκίνηση του ορισμένου ELF μετά από In-Game-Reset. Τιμή σε λεπτά, 0 για απενεργοποίηση του spin-down. -Αυτόματο spin-down του HDD -Λειτουργία βίντεο -Χρώμα μηνυμάτων -Χρώμα επιλεγμένου -Reset Colors -Πληροφ. +Αυτόματο Spin-Down του HDD +Λειτουργία Βίντεο +Χρώμα Μηνυμάτων +Χρώμα Επιλεγμένου +Επαναφορά Χρωμάτων +Πληροφορίες Προορισμένο ELF -Επιλογή χρώματος +Επιλογή Χρώματος Επανασύνδεση Αφήστε το κενό για απαρίθμηση κοινόχρηστων. -Πρόθεμα μονοπατιού ETH +Πρόθεμα Μονοπατιού ETH Σβήσιμο Κενό ΟΚ Λειτουργία -VMC θέση 1 -VMC θέση 2 -ID παιχνιδιού +VMC Θέση 1 +VMC Θέση 2 +ID Παιχνιδιού Λειτουργία DMA V-Sync Mode 1 @@ -170,11 +170,11 @@ Mode 6 Mode 7 Mode 8 Ρύθμιση GSM -Λειτουργία σύνδεσης Ethernet -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +Λειτουργία Σύνδεσης Ethernet +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex Ρυθμίσεις GSM Ενεργοποίηση GSM Ενεργοποιεί/απενεργοποιεί το GSM. @@ -193,96 +193,96 @@ PS2RD Cheat Engine Patchάρισμα των παιχνιδιών από το PS2RD. Λειτουργία PS2RD Αυτόματη/μη αυτόματη επιλογή cheats των παιχνιδιών. -Αυτόματη επιλογή cheats -Μη αυτόματη επιλογή cheats +Αυτόματη Επιλογή Cheats +Μη αυτόματη Επιλογή Cheats Σφάλμα: Αποτυχία φόρτωσης αρχείου Cheats. Δε βρέθηκαν cheats. -Λήψη προεπιλεγμένων -Ενημέρωση δικτύου -Overwrite Existing Records +Λήψη Προεπιλεγμένων +Ενημέρωση Δικτύου +Αντικατάσταση Υπαρχόντων Εγγραφών Η ενημέρωση απέτυχε. Αποτυχία σύνδεσης σε εξυπηρετητή ενημέρωσης. Η ενημέρωση ολοκληρώθηκε. Η ενημέρωση ακυρώθηκε. Λήψη ρυθμίσεων από το δίκτυο; -Προσαρμοσμένες ρυθμίσεις -Έγινε λήψη των προεπιλεγμένων. +Προσαρμοσμένες Ρυθμίσεις +Έγινε λήψη των προεπιλεγμένων Αυτόματη εκκίνηση σε %i"... -Αυτόματη εκκίνηση +Αυτόματη Εκκίνηση Τιμή σε δευτερόλεπτα, 0 για μη αυτόματη εκκίνηση. Λογότυπο PS2 Εμφάνιση μόνο για συμβατά λογότυπα δίσκων που ταιριάζουν με το console region. Ρυθμίσεις PadEmu Ρυθμίσεις Προσομοιωτή Χειριστηρίου -Ενεργοποίηση προσομοιωτή -Ενεργοποιεί/απενεργοποιεί τον προσομοιωτή για το συγκεκριμένο παιχνίδι. -Τύπος προσομοίωσης +Ενεργοποίηση Προσομοιωτή +Ενεργοποιεί/απενεργοποιεί τον Προσομοιωτή Χειριστηρίου. +Τύπος Προσομοίωσης Επιλέξτε τον τύπο προσομοίωσης του χειριστηρίου. DualShock3/4 USB DualShock3/4 BT -Ρυθμίσεις για θύρα: +Ρυθμίσεις για Θύρα: Επιλέξτε τη θύρα προσομοιωτή προς ρύθμιση. -Ενεργοποίηση προσομοίωσης +Ενεργοποίηση Προσομοίωσης Ενεργοποιεί/απενεργοποιεί την προσομοίωση για τη συγκεκριμένη θύρα. -Ενεργοποίηση δόνησης +Ενεργοποίηση Δόνησης Ενεργοποιεί/απενεργοποιεί τη δόνηση για τη συγκεκριμένη θύρα. -Διεύθυνση MAC του προσαρμογέα BT: -Διεύθυνση MAC του χειριστηρίου DS: +Διεύθυνση MAC του Προσαρμογέα BT: +Διεύθυνση MAC του Χειριστηρίου DS: Σύζευξη -Σύζευξη με χειριστήριο DualShock +Σύζευξη με Χειριστήριο DualShock Σύζευξη του προσαρμογέα BlueTooth με το χειριστήριο DualShock. Μη συνδεδεμένο -Πληροφορίες προσαρμογέα BlueTooth +Πληροφορίες Προσαρμογέα BlueTooth Εμφανίζει περισσότερες πληροφορίες και υποστηριζόμενες λειτουργίες. Έκδοση HCI: Έκδοση LMP: ID κατασκευαστή: -Λειτουργίες υποστήριξης: +Υποστηριζόμενες Λειτουργίες: Ναι Όχι Ο προσαρμογέας BlueTooth θα πρέπει να είναι πλήρως συμβατός με ελεγκτές DS3/DS4. Ο προσαρμογέας Bluetooth ενδέχεται να μη λειτουργεί σωστά με τα χειριστήρια DS3/DS4. Εξομοίωση Multitap -Ενεργοποιεί/απενεργοποιεί την εξομοίωση Multitap για το παιχνίδι. -Εξομοιωτής Multitap στη θύρα +Ενεργοποιεί/απενεργοποιεί την εξομοίωση Multitap. +Εξομοιωτής Multitap στη Θύρα: Επιλέξτε θύρα για εξομοίωση Multitap. -Απενεργ. workaround για ψεύτικα DS3 -Κάποια ψεύτικα DS3 χρειάζονται workaround, αυτή η επιλογή θα το απενεργοποιήσει. -Εξομοίωση αντιστροφής του ΠΕΔΙΟΥ +Απενεργ. Πατέντας για Ψεύτικα DS3 +Κάποια ψεύτικα DS3 χρειάζονται πατέντα, αυτή η επιλογή θα την απενεργοποιήσει. +Εξομοίωση Αντιστροφής του ΠΕΔΙΟΥ Επιδιόρθωση για παιχνίδια που glitchάρουν υπό progressive video modes. -Ρυθμίσεις γονικού κλειδώματος -Κωδικός πρόσβασης γονικού κλειδώματος +Ρυθμίσεις Γονικού Κλειδώματος +Κωδικός Πρόσβασης Γονικού Κλειδώματος Αφήστε το κενό για να απενεργοποιήσετε το γονικό κλείδωμα. -Εισάγετε τον κωδικό γονικού κλειδώματος +Εισάγετε τον Κωδικό Γονικού Κλειδώματος Εσφαλμένος κωδικός γονικού κλειδώματος. Το γονικό κλείδωμα είναι απενεργοποιημένο. Επιλογές Build: Σφάλμα - αυτός ο κωδικός πρόσβασης δεν μπορεί να χρησιμοποιηθεί. Το αρχείο VMC %s είναι κατακερματισμένο. Συνέχεια με την Κάρτα Μνήμης στην υποδοχή %d; -Ρυθμίσεις ήχου -Ενεργοποίηση ηχητικών εφέ -Ενεργοποίηση ήχου εκκίνησης -Ένταση ηχητικών εφέ -Ένταση ήχου εκκίνησης +Ρυθμίσεις Ήχου +Ενεργοποίηση Ηχητικών Εφέ +Ενεργοποίηση Ήχου Εκκίνησης +Ένταση Ηχητικών Εφέ +Ένταση Ήχου Εκκίνησης Επιβεβαίωση αλλαγής της λειτουργίας βίντεο; -Caching λίστας παιχνιδιών (HDD) -Enable Notifications -%s loaded from %s -Game Menu -Game settings saved. -%s settings removed. -Overwrites existing game compatibility settings when enabled. -Settings Mode -Global -Per Game -All -Select settings to remove. -Support Forums: -Title -Genre -Release -Developer -Description +Caching Λίστας Παιχνιδιών (HDD) +Ενεργοποίηση Ειδοποιήσεων +Το %s φορτώθηκε από %s +Μενού Παιχνιδιού +Οι ρυθμίσεις παιχνιδιού αποθηκεύτηκαν. +Οι ρυθμίσεις %s καταργήθηκαν. +Αν είναι ενεργό, αντικαθιστά τις υπάρχουσες ρυθμίσεις συμβατότητας παιχνιδιού. +Λειτουργία Ρυθμίσεων +Γενική +Ανά Παιχνίδι +Όλες +Επιλέξτε ρυθμίσεις για κατάργηση. +Forum Υποστήριξης: +Τίτλος +Είδος +Κυκλοφορία +Προγραμματιστής +Περιγραφή Παιχνίδια PS1 Εκκίνηση μενού Παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Korean_r1682.lng b/lng/lang_Korean_r1682.lng index 7c29fb393..8deb30350 100644 --- a/lng/lang_Korean_r1682.lng +++ b/lng/lang_Korean_r1682.lng @@ -1,15 +1,15 @@ # Translated by DDinghoya -# Last update: Feb. 12, 2020 +# Last update: April 18, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s 저장 변경 뒤로 -Network Settings +네트워크 구성 고급 옵션 <값 없음> -설정이 %s 에 저장되었습니다. +설정 저장… 설정 기록 중 에러! 종료 설정 @@ -22,10 +22,10 @@ ETH 게임 언어 시스템 전원이 꺼집니다. 브라우저를 종료합니까? -업데이트를 취소합니까? +업데이트 취소합니까? %d: HDD를 검색할 수 없습니다 %d: HDD가 포맷되지 않았습니다 -%d: 네트워크 시작 에러 +%d: 네트워크 시작 오류 %d: 네트워크 아답터 감지 안됩니다 %d: SMB 서버에 접속할 수 없습니다 %d: SMB 서버에 로그인할 수 없습니다 @@ -43,7 +43,7 @@ O X 게임 목록 게임 설정 -설정 삭제 +모든 설정 제거 설정된 게임 키 제거 스크롤 속도 느림 @@ -51,14 +51,14 @@ X 빠름 기본 메뉴 디스크 읽기 -기다리세요 +잠시만 기다리세요 게임 ID 불러오는 중 오류 자동 정렬 언어 파일 불러오는 중 오류 디버그 색상 비활성 -컨트롤러가 없습니다. 대기 중… +컨트롤러가 없습니다. 대기 중... 표지 보기 -와이드 화면 +와이드화면 전원 끄기 불러오기 설정 저장 설정 @@ -71,10 +71,10 @@ ETH 장치 시작 모드 자동 수동 HDL 서버 시작 -HDL 서버 시작 중… -HDL 서버 가동 중… +HDL 서버 시작 중... +HDL 서버 가동 중... HDL 서버 시작 실패 -HDL 서버 업로딩 중… +HDL 서버 업로딩 중... IGR 경로 배경 색상 문자 색상 @@ -108,17 +108,17 @@ USB 게임 손상 검사 버튼 선택 오류, 게임이 손상 되었습니다. 오류, 항목을 실행할 수 없습니다 -테스트 변경 +테스트 게스트 권한을 위해 지움 정밀하게 읽음 동기화 모드 시스템 호출 해제 -동영상 건너 뛰기 +비디오 건너뛰기 DV-DL 에뮬레이트 IGR 비활성 미사용 미사용 -크기 변경 시 VMC 재포멧 됩니다. +크기 변경시 VMC 재포멧 됩니다. 생성 시작 수정 @@ -133,9 +133,9 @@ VMC 구성 VMC 파일 존재 잘못된 VMC 파일, 크기가 다릅니다. VMC 파일이 생성되야 합니다. -VMC %s 에 접속하는 동안 오류가 발생했습니다. 슬롯 %d 에서 메모리 카드를 계속 사용하겠습니까? +VMC %s 오류, 메모리카드(슬롯 %d)에서 계속합니까? 자동 새로 고침 -오픈 PS2 로더에 관하여 +오픈 PS2 로더 정보 개발자 품질 보증 USB prefix 경로 @@ -145,9 +145,9 @@ IGR 후 사용자 정의 ELF 부팅 비디오 모드 대화상자 색상 선택한 색상 -Reset Colors +정보 페이지 표시 정보 -사용자 정의 ELF +커스텀 ELF 색상 선택 재접속 목록 공유를 위해 지움 @@ -176,10 +176,10 @@ GSM 구성 10Mbit Full-duplex 10Mbit Half-duplex GSM 설정 -GSM 활성 +GSM 활성화 GSM 켜기 또는 끄기 V모드 -강제 사용자 지정 디스플레이 모드 +강제 커스텀 디스플레이 모드 H-POS 수평 조정 V-POS @@ -189,7 +189,7 @@ V-POS FMV 건너뛰기 풀 모션 비디오 건너뛰기 치트 설정 -PS2RD 치트 엔진 활성 +PS2RD 치트 엔진 활성화 PS2RD 치트 엔진 패치 적용 PS2RD 치트 엔진 모드 게임 치트 자동 선택 또는 선택 @@ -199,7 +199,7 @@ PS2RD 치트 엔진 모드 치트를 찾을 수 없음 다운로드 기본값 네트워크 업데이트 -기존 레코드 덮어 쓰기 +기존 데이터에서 다시 다운로드 합니까? 업데이트 실패. 업데이트 서버에 연결 실패. 업데이트 완료. @@ -207,11 +207,11 @@ PS2RD 치트 엔진 모드 네트워크에서 설정을 다운로드 합니까? 사용자 정의 설정 다운로드 받은 기본값 -%i 자동 시작… +%i 자동 시작... 자동 시작 초 입력, 자동 시작하지 않으려면 0으로 설정 PS2 로고 -Displayed for a valid disc logo matching the console's region. +콘솔의 지역과 일치하는 유효한 디스크 로고만 표시 PADEMU 구성 패드 에뮬레이터 설정 패드 에뮬레이터 활성화 @@ -228,7 +228,7 @@ PADEMU 구성 패드 에뮬레이터에 선택된 포트 진동 켬/끔 USB 블루투스 어답터 맥 주소: DS 컨트롤러 맥 주소와 페어링: -페어 +페어링 DS 컨트롤러 페어링 블루투스 어댑터 맥 주소가 있는 DS 컨트롤러 페어 연결되지 않음 @@ -247,35 +247,35 @@ LMP 버전: 포트상의 멀티탭 에뮬레이터 멀티탭 에뮬레이션을 위한 포트를 선택. Fake DS3에 대한 해결방법 비활성화 -일부 fake ds3s는 해결 방법이 필요합니다. 이 옵션은 옵션을 비활성. -FIELD 반전 에뮬레이션 -프로그레시브 비디오 모드에서 결함이있는 게임을 수정합니다. -자녀보호 잠금 설정 -자년보호 잠금 비밀번호 -자녀보호를 사용 중지하려면 비워 두십시오. -자년보호 잠금 비밀번호 입력 -자녀보호 잠금 비밀번호가 잘못되었습니다. -자녀보호 잠금이 비활성화 되었습니다. +일부 fake DSs3는 해결 방법이 필요합니다. 이 옵션은 옵션을 비활성화. +필드 뒤집기 에뮬레이션 +프로그레시브 비디오 모드에서 결함이있는 게임 수정. +보호자 잠금 설정 +보호자 잠금 비밀번호 +보호자 잠금을 사용하지 않으려면 비워 둡니다. +보호자 암호 입력 +보호자 잠금 비밀번호가 올바르지 않습니다. +보호자 잠금이 비활성화되었습니다. 빌드 옵션: -오류 - 이 비밀번호는 사용할 수 없습니다. -VMC %s 파일이 조각났습니다. 슬롯 %d 에 있는 메모리 카드로 계속 하겠습니까? +오류 - 이 비밀번호를 사용할 수 없습니다. +VMC %s 파일이 조각화되었습니다. 슬롯 %d에서 메모리 카드를 계속 사용하겠습니까? 오디오 설정 사운드 효과 활성화 -사운트 부팅 활성화 +부팅 사운드 활성화 사운드 효과 볼륨 -사운드 볼륨 부팅 -비디오 모드 변경을 확인 하시겠습니까? +부팅 사운드 볼륨 +비디오 모드 변경을 확인하겠습니까? 캐쉬 게임 목록 (HDD) -알림 사용 -%s 에서 %s 을(를) 로드했습니다. +알림 활성화 +%s에서 %s을(를)로드했습니다. 게임 메뉴 게임 설정이 저장되었습니다. %s 설정이 제거되었습니다. 활성화되면 기존 게임 호환성 설정을 덮어 씁니다. 설정 모드 글로벌 -게임당 -전부 +게임별 +모두 제거할 설정을 선택하십시오. 지원 포럼: 타이틀 diff --git a/lng/lang_Polish_r1682.lng b/lng/lang_Polish_r1682.lng index 934124ba6..6fc288bd9 100644 --- a/lng/lang_Polish_r1682.lng +++ b/lng/lang_Polish_r1682.lng @@ -1,17 +1,17 @@ # Translation by yohokaru -# Last update: Feb. 11, 2020 +# Last update: April 18, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s -Zapisz zmiany +Zapisz Zmiany Wróć -Network Settings -Opcje zaawansowane - -Settings saved to %s +Ustawienia Sieci +Opcje Zaawansowane + +Ustawienia zapisane na %s Błąd zapisu ustawień! -Wyjście +Wyjdź Ustawienia Menu Gry USB @@ -21,66 +21,66 @@ Aplikacje Motyw Język System zostanie wyłączony. -Exit to Browser? +Czy chcesz wyjść z programu? Przerwać aktualizację? -%d: Nie wykryto dysku twardego -%d: Dysk twardy nie jest sformatowany -%d: Błąd startu sieci -%d: Nie wykryto network adaptora -%d: Nie można połączyć z serwerem SMB -%d: Nie można zalogować do serwera SMB -%d: Nie można otworzyć udostępnienia SMB -%d: Nie można wyświetlić udostępnień SMB -%d: Nie można wyświetlić gier -%d: Serwer DHCP niedostępny -%d: Brak połączenia sieciowego -na -od +%d: Nie wykryto dysku twardego. +%d: Dysk twardy nie jest sformatowany. +%d: Wystąpił błąd podczas uruchamiania sieci. +%d: Nie wykryto Network Adaptora. +%d: Nie można połączyć się z serwerem SMB. +%d: Nie można zalogować się do serwera SMB. +%d: Nie można otworzyć udziału SMB. +%d: Nie można wyświetlić udziałów SMB. +%d: Nie można wyświetlić gier. +%d: Niedostępny Serwer DHCP. +%d: Brak połączenia sieciowego. +Włącz +Wyłącz OK -Wybierz +Wybierz Anuluj -Kółko -Iks -Lista gier -Ustawienia gry -Remove Settings -Usunięto wszystkie klucze do gry -Przewijanie +O +X +Lista Gier +Ustawienia Gry +Usuń Ustawienia +Usunięto wszystkie klucze dla gry. +Szybkość Przewijania Wolno Średnio Szybko -Domyślne menu -Załaduj z dysku -Proszę czekać -Błąd podczas ładowania ID gry -Sortowanie automatyczne -Błąd ładowania pliku językowego -Wyłącz debugowanie kolorów +Domyślne Menu +Załaduj Z Dysku +Proszę czekać. +Błąd podczas ładowania identyfikatora gry. +Sortowanie Automatyczne +Błąd ładowania pliku językowego. +Nie Wyświetlaj Kolorów Debugowania Nie wykryto kontrolera, oczekiwanie... -Okładki -Szeroki ekran +Wyświetlanie Okładek +Szeroki Ekran Wyłącz -Wczytaj ustawienia -Zapisz ustawienia -Uruchom urządzenie +Wczytywanie ustawień... +Zapisywanie ustawień... +Uruchom Urządzenie Odśwież -Start urządzenia USB -Start urządzenia HDD -Start urządzenia ETH -Start aplikacji -Automatycznie +Uruchom Urządzenie USB +Uruchom Urządzenie HDD +Uruchom Urządzenie ETH +Wyświetl Menu Aplikacji +Automatyczny Ręcznie -Uruchom serwer HDL -Uruchamianie serwera HDL... +Uruchom Serwer HDL +Uruchamianie Serwera HDL... Serwer HDL uruchomiony... -Niepowodzenie startu serwera HDL. -Odładowanie serwera HDL... -Ścieżka do IGR -Kolor tła -Kolor tekstu +Nieudane uruchomienie serwera HDL. +Serwer HDL zostanie zamknięty... +Ścieżka Dla IGR +Kolor Tła +Kolor Tekstu - PS2 - - Serwer SMB - -Typ adresu IP +Typ Adresu IP Statyczny DHCP Adres IP @@ -89,76 +89,76 @@ Maska Brama Serwer DNS Port -Udostępnij +Udostępniany Folder Użytkownik Hasło - -Typ adresu + +Typ Adresu IP NetBIOS Akceptuj Element zostanie trwale usunięty, kontynuować? -Zmień nazwę +Zmień Nazwę Usuń Uruchom -Ustawienia obrazu -Włącz operację zapisu -Sprawdzaj fragmentację gier USB -Zapamiętaj ostatnio uruchomioną grę -Przycisk wyboru -Błąd, gra jest pofragmentowana -Błąd, nie można uruchomić pozycji -Test Changes -Pozostaw puste dla gości. -Dokładny odczyt -Tryb synchroniczny -Odhookuj Syscalls -Przejdź filmy +Ustawienia Obrazu +Włącz Operację Zapisu +Sprawdź Fragmentację Gier USB +Zapamiętaj Ostatnio Uruchomioną Grę +Przycisk Wyboru +Błąd, gra jest pofragmentowana. +Błąd, nie można uruchomić pozycji. +Testuj Zmiany +Pozostaw puste dla "GOŚCIA". +Dokładny Odczyt +Tryb Synchroniczny +Wymaż OPL Po Uruchomieniu Gry +Pomiń Wstawki Filmowe Emuluj DVD-DL Wyłącz IGR Niewykorzystany Niewykorzystany -Zmiana rozmiaru, zostanie sformatowany VMC +Zmiana rozmiaru spowoduje przeformatowanie VMC. Utwórz Start Modyfikuj Przerwij Reset -Użyj ogólnych +Użyj Ogólnie Konfiguruj VMC Nazwa Rozmiar Status Postęp -Plik VMC istnieje -Błędny plik VMC, nieprawidłowy rozmiar -Musisz utworzyć plik VMC -Error accessing VMC %s. Continue with the Memory Card in slot %d? -Odświeżanie automatyczne -O programie +Plik VMC istnieje. +Błędny plik VMC, nieprawidłowy rozmiar. +Plik VMC musi zostać utworzony. +Błąd dostępu do VMC %s, kontynuuj z kartą pamięci w gnieździe %d? +Odświeżanie Automatyczne +O Programie Programiści -Zapewnienie jakości -Prefix ścieżki USB -Boots Custom ELF after an IGR -Wartość w minutach, 0 wyłącza zwalnianie obrotów -Automatyczne zwalnianie obrotów HDD -Tryb wideo -Kolor ustawień -Kolor zaznaczenia -Reset Colors -Info -Niestandardowy ELF -Wybór koloru -Połącz ponownie -Pozostaw puste aby notować akcje -Prefix ścieżki ETH -Cofnij +Kontrola Jakości +Prefix Ścieżki USB +Uruchom wybrany ELF po IGR. +Wartość w minutach, 0 dla dezaktywacji. +Automatyczne Zwalnianie Obrotów HDD +Tryb Wideo +Kolor Ustawień +Kolor Zaznaczenia +Zresetuj Kolory +Informacje +Alternatywny ELF +Wybór Koloru +Połącz Ponownie +Pozostaw puste aby wyświetlić listę udziałów. +Prefix Ścieżki ETH +Cofnij Odstęp Enter Tryb -VMC Slot 1 -VMC Slot 2 -ID gry +Gniazdo VMC 1 +Gniazdo VMC 2 +Identyfikator Gry Tryb DMA V-Sync Tryb 1 @@ -170,119 +170,119 @@ Tryb 6 Tryb 7 Tryb 8 Konfiguruj GSM -Tryb łącza ethernetowego -100Mbit pełny-dupleks -100Mbit pół-dupleks -10Mbit pełny-dupleks -10Mbit pół-dupleks -ustawienia GSM -Włącz GSM -Przełącz GSM wł lub wył -Wideo -Wymuś niestandardowy tryb wyświetlania -Poziom -Regulacja w poziomie -Pion -Regulacja w pionie +Szybkość I Tryb Sieci +100Mbit Pełny-dupleks +100Mbit Pół-dupleks +10Mbit Pełny-dupleks +10Mbit Pół-dupleks +Ustawienia GSM +Aktywuj GSM +Włącz lub wyłącz GSM. +Tryb Wideo +Wymuś określony tryb wyświetlania. +Położenie Poziome +Regulacja w poziomie. +Położenie Pionowe +Regulacja w pionie. Overscan -Overscan Adjustment +Regulacja overscanu. Pomiń FMV -Pomija scenki wideo -Ustawienia cheat'ów -Włącz silnik cheat'ów PS2RD -Pozwól PS2RD patchować gry -Tryb silnika cheat'ów PS2RD -Auto-wybieranie lub wybieranie cheat'ów gry -Auto-wybieranie cheat'ów -Wybierz cheat'y -Błąd: niepowodzenie ładowanie pliku -Nie znaleziono cheat'ow -Pobierz domyślne -Aktualizacja sieciowa -Overwrite Existing Records +Pomija wstawki filmowe. +Ustawienia Kodów +Włącz Silnik Kodów PS2RD +Pozwól silnikowi kodów PS2RD patchować grę. +Tryb Silnika Kodów PS2RD +Auto-wybieranie lub wybieranie kodów dla gry. +Auto-wybieranie Kodów +Wybierz Kody Dla Gry +Błąd: Nie udało się załadować pliku z kodami. +Nie znaleziono kodów. +Pobierz Domyślne +Aktualizacja Sieciowa +Nadpisz Istniejące Zapisy Aktualizacja nie powiodła się. -Błąd połączenia z serwerem aktualizacji. +Nie udało się połączyć z serwerem aktualizacji. Aktualizacja zakończona. Aktualizacja przerwana. Pobrać ustawienia z sieci? -Niestandardowe ustawienia -Pobrano domyślne +Dodatkowe Ustawienia +Pobrano domyślne. Auto start w %i s... -Auto start -Wartość w sekundach, 0 wyłącza auto start +Auto Start +Wartość w sekundach, 0 wyłącza auto start. Logo PS2 -Displayed for a valid disc logo matching the console's region. -Konfiguracja emulacji Pada -Ustawienia emulacji Pada -Włącz emulację Pada +Logo zostanie wyświetlone wyłącznie jeśli region gry i konsoli będzie taki sam. +Konfiguracja Emulacji Pada +Ustawienia Emulacji Pada +Włącz Emulację Pada Włącza/wyłącza emulację Pada dla wybranej gry. -Tryb emulacji Pada +Tryb Emulacji Pada Wybierz tryb emulacji Pada. DualShock3/4 USB DualShock3/4 BT -Ustawienia portu: -Wybierz Port emulacji Pada dla ustawień -Włącz emulację +Ustawienia Portu: +Wybierz Port emulacji Pada dla ustawień. +Włącz Emulację Włącz/wyłącz emulację Pada dla wybranego portu. -Włącz wibracje. +Włącz Wibracje Włącz/wyłącz wibracje dla wybranego portu emulacji Pada. -Adres MAC adaptera Bluetooth USB +Adres MAC adaptera Bluetooth USB: Kontroler DS sparowany z adresem MAC: Paruj -Paruj kontroler DS +Paruj Kontroler DS Paruj kontroler DS z adresem mac adaptera bluetooth. -Nie podłączony -Informacje o adapterze Bluetooth -Wyświetla więcej informacji i obsługiwane funkcje +Nie Podłączony +Informacje O Adapterze Bluetooth +Wyświetla więcej informacji i obsługiwane funkcje. Wersja HCI: Wersja LMP: -Identyfikator producenta: -Wspierane funkcje: +Identyfikator Producenta: +Wspierane Funkcje: Tak Nie Adapter Bluetooth powinien być w pełni kompatybilny z kontrolerami DS3/DS4. Adapter Bluetooth może nie współpracować poprawnie z kontrolerami DS3/DS4. -Włącz emulację Multitapa. +Włącz emulację Multitapa Włącza/wyłącza emulację Multitapa dla wybranej gry. -Emulacja Multitapa dla portu +Emulacja Multitapa Dla Portu: Wybierz port dla emulacji Multitapa. -Nie stosuj obejścia dla klonów DS3. +Nie Stosuj Obejścia Dla Klonów DS3. Niektóre klony DS3 wymagają obejścia, ta opcja to wyłączy. -Emuluj FIELD flipping +Emuluj FIELD Flipping Poprawka dla gier w których występują usterki w trybie progresywnego obrazu. -Ustawienia blokady rodzicielskiej -Hasło blokady rodzicielskiej +Ustawienia Blokady Rodzicielskiej +Hasło Blokady Rodzicielskiej Pozostaw puste aby wyłączyć blokadę rodzicielską. -Wprowadź hasło blokady rodzicielskiej. +Wprowadź Hasło Blokady Rodzicielskiej Nieprawidłowe hasło blokady rodzicielskiej. Blokada rodzicielska wyłączona. -Opcje kompilacji: +Opcje Kompilacji: Błąd - to hasło nie może być użyte. Plik VMC %s jest pofragmentowany. Kontynuuj z kartą pamięci w gnieździe %d? -Ustawienia dźwiękowe -Efekty dźwiękowe -Dźwięk startowy -Głośność efektów dźwiękowych -Głośność dźwięku startowego -Potwierdź zmianę rozdzielczości -Buforowanie listy gier (HDD) -Enable Notifications -%s loaded from %s -Game Menu -Game settings saved. -%s settings removed. -Overwrites existing game compatibility settings when enabled. -Settings Mode -Global -Per Game -All -Select settings to remove. -Support Forums: -Title -Genre -Release -Developer -Description +Ustawienia Dźwiękowe +Efekty Dźwiękowe +Dźwięk Startowy +Głośność Efektów Dźwiękowych +Głośność Dźwięku Startowego +Potwierdasz zmianę rozdzielczości? +Buforowanie Listy Gier (HDD) +Powiadomienia +%s załadowany z %s +Menu Gry +Ustawienia gry zostały zapisane. +%s ustawienia zostały usunięte. +Po włączeniu nadpisuje istniejące ustawienia kompatybilności z grami. +Tryb Ustawień +Globalne +Dla Danej Gry +Wszystkie +Wybierz ustawienia do usunięcia. +Wsparcie: +Tytuł +Gatunek +Data wydania +Deweloper +Opis PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_TChinese_r1682.lng b/lng/lang_TChinese_r1682.lng index 8553b7610..6dc2cd9f4 100644 --- a/lng/lang_TChinese_r1682.lng +++ b/lng/lang_TChinese_r1682.lng @@ -1,12 +1,12 @@ # Translated by kane159 and eyu2007 -# Last update: Feb. 11, 2020 +# Last update: April 18, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s 保存設置 返回 -Network Settings +網絡設置 進階設置 <無數值> 設置保存到 %s From af7253956ff249bccdd8dca94a33d9139a65ab4b Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Mon, 11 May 2020 20:00:29 +0100 Subject: [PATCH 206/269] Changes for NEWLIB --- src/elmsupport.c | 159 +++++++++++++++++++++++++---------------------- 1 file changed, 85 insertions(+), 74 deletions(-) diff --git a/src/elmsupport.c b/src/elmsupport.c index 2fb9e79e3..f7223be0d 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -11,6 +11,10 @@ #include "include/hddsupport.h" #include "include/supportbase.h" +#define NEWLIB_PORT_AWARE +#include // fileXioMount, fileXioUmount +#include // FIO_MT_RDWR + static int elmForceUpdate = 1; static int elmItemCount = 0; @@ -24,7 +28,7 @@ struct ElmGame char title[ISO_GAME_NAME_MAX - GAME_STARTUP_MAX + 1 ]; char ID[GAME_STARTUP_MAX + 1]; char file[ISO_GAME_NAME_MAX + 1 + 50]; - + //Eg: smb0:POPS .. smb0:POPS9 - It's where the VCD is //Eg: pfs0:POPS/ is where the ELF is and the fake launch path char pathFolder[50]; @@ -76,7 +80,7 @@ static int elmGameDuplicateTitleExists(ElmGame *inGame){ if (count > 0){ elmGameTitleAppendDevice(inGame); } - return count; + return count; } static struct ElmGame* elmGetGameInfo(int id) { @@ -111,7 +115,7 @@ static int elmNeedsUpdate(void) { elmForceUpdate = 0; update=1; } - + if(oplShouldElmUpdate()){ update = 1; } @@ -122,9 +126,12 @@ static int elmNeedsUpdate(void) { //Scans for POPSTARTER.ELF and VCD files in the given devPrefix. static int elmScanVCDs(char* devPrefix){ int count=0; //Game count - int fd,i; - iox_dirent_t record; - + int i; + char fullpath[256]; + struct dirent *pdirent; + struct stat st; + DIR *pdir; + LOG("elmScanVCDs()\n"); char currentPath[30]; @@ -138,16 +145,16 @@ static int elmScanVCDs(char* devPrefix){ LOG("currentPath = %s\n",currentPath); //Let's open the folder and search for the VCD files. - if ((fd = fileXioDopen(currentPath)) > 0) { - while (fileXioDread(fd, &record) > 0) { - int filename_len = strlen(record.name); - if (strlen(record.name) > ISO_GAME_NAME_MAX) + if ((pdir = opendir(currentPath)) != NULL) { + while ((pdirent = readdir(pdir)) != NULL) { + int filename_len = strlen(pdirent->d_name); + if (strlen(pdirent->d_name) > ISO_GAME_NAME_MAX) continue; //Skip files that cannot be supported properly. - if (filename_len >= 4 && strcasecmp(record.name + filename_len - 4, ".VCD") == 0) { - LOG("VCD Found: %s\n",record.name); - - if ((filename_len >= (GAME_STARTUP_MAX-1) + 1 + 1 + 4) && (record.name[4] == '_') && (record.name[8] == '.') && (record.name[11] == '.')) {//Game ID found + if (filename_len >= 4 && strcasecmp(pdirent->d_name + filename_len - 4, ".VCD") == 0) { + LOG("VCD Found: %s\n",pdirent->d_name); + + if ((filename_len >= (GAME_STARTUP_MAX-1) + 1 + 1 + 4) && (pdirent->d_name[4] == '_') && (pdirent->d_name[8] == '.') && (pdirent->d_name[11] == '.')) {//Game ID found //Create a new game ElmGame* newElmGame = (ElmGame*)malloc(sizeof(ElmGame)); if(newElmGame != NULL){ @@ -155,23 +162,27 @@ static int elmScanVCDs(char* devPrefix){ int NameLen = filename_len - GAME_STARTUP_MAX -4; //Eg: Game Title - strncpy(newElmGame->title, &record.name[GAME_STARTUP_MAX], NameLen); + strncpy(newElmGame->title, &pdirent->d_name[GAME_STARTUP_MAX], NameLen); newElmGame->title[NameLen] = '\0'; - + //Eg: SLES_123.04 - strncpy(newElmGame->ID, record.name, GAME_STARTUP_MAX - 1); + strncpy(newElmGame->ID, pdirent->d_name, GAME_STARTUP_MAX - 1); newElmGame->ID[GAME_STARTUP_MAX - 1] = '\0'; - + + // Get the file info + sprintf(fullpath, "%s/%s", currentPath, pdirent->d_name); + stat(fullpath, &st); + //Eg: smb0:POPS/SLES_123.04.Game Title.VCD - snprintf(newElmGame->file,ISO_GAME_NAME_MAX + 1,"%s%s",currentPath,record.name); - newElmGame->sizeMB = (record.stat.size >> 20) | (record.stat.hisize << 12); - + snprintf(newElmGame->file,ISO_GAME_NAME_MAX + 1,"%s%s",currentPath,pdirent->d_name); + newElmGame->sizeMB = st.st_size >> 20; + //Eg: smb0:POPS | smb0:POPS9 strncpy(newElmGame->pathFolder,currentPath,sizeof(newElmGame->pathFolder)); - - newElmGame->next = elmGameList; + + newElmGame->next = elmGameList; elmGameList = newElmGame; - + count++; LOG("newElmGame->file = %s\n",newElmGame->file); LOG("newElmGame->pathFolder = %s\n",newElmGame->pathFolder); @@ -185,10 +196,10 @@ static int elmScanVCDs(char* devPrefix){ LOG("No ID found in file name!!\n"); } }else{ - LOG("Not a .VCD file: %s\n",record.name); + LOG("Not a .VCD file: %s\n",pdirent->d_name); } } - fileXioDclose(fd); + closedir(pdir); } } return count; @@ -220,10 +231,10 @@ static int elmScanVCDsHDD(){ } } if (skip == 1) continue; - + strcpy(scanned[partitionCount],record.name); partitionCount++; - + sprintf(partition,"hdd0:%s",record.name); LOG("Mounting '%s' into '%s' \n",partition,mountPoint); if ((MountFD = fileXioMount(mountPoint, partition, O_RDONLY)) >= 0) { @@ -244,23 +255,23 @@ static int elmScanVCDsHDD(){ ElmGame* newElmGame = (ElmGame*)malloc(sizeof(ElmGame)); if(newElmGame != NULL){ newElmGame->next = elmGameList; - elmGameList = newElmGame; - + elmGameList = newElmGame; + //Eg: SLES_123.04.Game Title.VCD int NameLen = filename_len - GAME_STARTUP_MAX -4; //Eg: Game Title strncpy(newElmGame->title, &record.name[GAME_STARTUP_MAX], NameLen); newElmGame->title[NameLen] = '\0'; - + //Eg: SLES_123.04 strncpy(newElmGame->ID, record.name, GAME_STARTUP_MAX - 1); newElmGame->ID[GAME_STARTUP_MAX - 1] = '\0'; - + //Eg: hdd0:__POPS3/SLES_123.04.Game Title.VCD snprintf(newElmGame->file,ISO_GAME_NAME_MAX + 1,"%s/%s",partition,record.name);//!!!!PARTITION newElmGame->sizeMB = (record.stat.size >> 20) | (record.stat.hisize << 12); - + //Always pfs1: strcpy(newElmGame->pathFolder,"pfs1:"); @@ -290,24 +301,24 @@ static int elmScanVCDsHDD(){ } else { LOG("fd2 = %d\n",fd2); } - - - return count; + + + return count; } static int elmUpdateItemList(void) { elmItemCount = 0; - + //Clear game list first. if (elmGameList != NULL) elmGameListFree(); - + //Try HDD if (hddGetObject(1)) { //Eg: pfs0:POPS/POPSTARTER.ELF snprintf(elmPathElfHdd, sizeof(elmPathElfHdd), "%sPOPS/POPSTARTER.ELF",hddGetPrefix()); LOG("elmPathElfHdd = %s\n",elmPathElfHdd); - + //Check if POPSTARTER.ELF exists in the folder. int fdElf = fileXioOpen(elmPathElfHdd, O_RDONLY, 0666); if (fdElf >= 0) { @@ -317,13 +328,13 @@ static int elmUpdateItemList(void) { LOG("POPSTARTER.ELF not found at %s",elmPathElfHdd); } } - + //Try ETH - if (ethGetObject(1)) { + if (ethGetObject(1)) { //Eg: smb0:POPS/POPSTARTER.ELF snprintf(elmPathElfEth, sizeof(elmPathElfEth), "%sPOPS/POPSTARTER.ELF",ethGetPrefix()); LOG("elmPathElfEth = %s\n",elmPathElfEth); - + //Check if POPSTARTER.ELF exists in the folder. int fdElf = fileXioOpen(elmPathElfEth, O_RDONLY, 0666); if (fdElf >= 0) { @@ -332,7 +343,7 @@ static int elmUpdateItemList(void) { }else{ LOG("POPSTARTER.ELF not found at %s",elmPathElfEth); } - + } //Try USB @@ -340,7 +351,7 @@ static int elmUpdateItemList(void) { //Eg: mass0:POPS/POPSTARTER.ELF snprintf(elmPathElfUsb, sizeof(elmPathElfUsb), "%sPOPS/POPSTARTER.ELF",usbGetBase()); LOG("elmPathElfUsb = %s\n",elmPathElfUsb); - + //Check if POPSTARTER.ELF exists in the folder. int fdElf = fileXioOpen(elmPathElfUsb, O_RDONLY, 0666); if (fdElf >= 0) { @@ -350,7 +361,7 @@ static int elmUpdateItemList(void) { LOG("POPSTARTER.ELF not found at %s",elmPathElfUsb); } } - + //Check for duplicates if (elmGameList) { ElmGame* cur = elmGameList; @@ -383,24 +394,24 @@ static char* elmGetItemStartup(int id) { static void elmDeleteItem(int id) { ElmGame* cur = elmGetGameInfo(id); int ret = -1; - + //Check if it's a HDD game. if (!strncmp(cur->file,"hdd0:",5)){ int MountFD; char partition[10]; char file[256]; - + //Let's get the partition Eg: hdd0:__.POPS char *separator = strchr(cur->file, '/'); strncpy(partition,cur->file,separator - (cur->file)); partition[separator - (cur->file)] = '\0'; - + //And the file path Eg: pfs1:SLES_123.45.Game.VCD sprintf(file,"pfs1:%s",separator+1); - + //Make sure it's unmounted fileXioUmount("pfs1:"); - + LOG("Mounting '%s' into 'pfs1:'\n",partition); if ((MountFD = fileXioMount("pfs1:", partition, FIO_MT_RDWR)) >= 0) { ret = fileXioRemove(file); @@ -433,18 +444,18 @@ static void elmRenameItem(int id, char* newName) { if (!strncmp(cur->file,"hdd0:",5)){ char partition[10]; char file[256]; - + //Let's get the partition Eg: hdd0:__.POPS char *separator = strchr(cur->file, '/'); strncpy(partition,cur->file,separator - (cur->file)); partition[separator - (cur->file)] = '\0'; - + //And the file path Eg: pfs1:SLES_123.45.Game.VCD sprintf(file,"pfs1:%s",separator+1); //Make sure it's unmounted fileXioUmount("pfs1:"); - + LOG("Mounting '%s' into 'pfs1:'\n",partition); if ((fd = fileXioMount("pfs1:", partition, FIO_MT_RDWR)) >= 0) { ret = fileXioRename(file, newNameFull); @@ -466,7 +477,7 @@ static void elmRenameItem(int id, char* newName) { ret = fileXioRename(cur->file, newNameFull); LOG("fileXioRename(%s , %s) = %d\n",cur->file,newNameFull,ret); } - + if (ret != 0) { guiMsgBox(_l(_STR_ELM_RENAME_ERROR), 0, NULL); }else{ @@ -478,7 +489,7 @@ static void elmLaunchItem(int id, config_set_t* configSet) { ElmGame* cur = elmGetGameInfo(id); //The path to POPSTARTER.ELF char elmPathElf[256]; - + //The prefix of the ELF file. Eg: XX./SB./ char elmElfPrefix[4]; @@ -488,14 +499,14 @@ static void elmLaunchItem(int id, config_set_t* configSet) { strcpy(elmElfPrefix, ""); }else if (!strncmp(cur->file,"mass",4)){ strcpy(elmPathElf,elmPathElfUsb); - strcpy(elmElfPrefix, "XX."); + strcpy(elmElfPrefix, "XX."); }else{ strcpy(elmPathElf,elmPathElfEth); strcpy(elmElfPrefix, "SB."); } - + LOG("elmLaunchItem with %s",elmPathElf); - + int fdElf = fileXioOpen(elmPathElf, O_RDONLY, 0666); if (fdElf >= 0) { int fdVcd = 0; @@ -505,20 +516,20 @@ static void elmLaunchItem(int id, config_set_t* configSet) { }else{ fdVcd = fileXioOpen(cur->file, O_RDONLY, 0666); } - + if(fdVcd >=0){ void *buffer = NULL; int realSize = fileXioLseek(fdElf, 0, SEEK_END); fileXioLseek(fdElf, 0, SEEK_SET); - + buffer = malloc(realSize); if (!buffer) { LOG("Failed allocation of %d bytes", realSize); } else { fileXioRead(fdElf, buffer, realSize); - LOG("Loaded POPSTARTER ELF with size = %d\n",realSize); + LOG("Loaded POPSTARTER ELF with size = %d\n",realSize); } - + fileXioClose(fdElf); char memPath[256]; @@ -527,15 +538,15 @@ static void elmLaunchItem(int id, config_set_t* configSet) { char *fileOnly = strrchr(cur->file, '/'); if (!fileOnly) fileOnly = strrchr(cur->file, ':'); - + fileOnly++; - + fileOnly[strlen(fileOnly)-4] = '\0'; - + LOG("fileOnly= %s\n",fileOnly); char params[256]; sprintf(params,"%s%s%s.ELF",cur->pathFolder,elmElfPrefix,fileOnly); - + LOG("memPath = %s\n",memPath); LOG("params = %s\n",params); LOG("VCD Path= %s", cur->file); @@ -549,7 +560,7 @@ static void elmLaunchItem(int id, config_set_t* configSet) { mode = HDD_MODE; } else if (strncmp(cur->file,"smb", 3) == 0){ mode = ETH_MODE; - } + } if (mode == ELM_MODE) { // Failed to detect the device... @@ -557,7 +568,7 @@ static void elmLaunchItem(int id, config_set_t* configSet) { } else { LOG("ELMSUPPORT Mode detected as: ", mode); } - + deinit(UNMOUNT_EXCEPTION, mode); // CAREFUL: deinit will call elmCleanUp, so configElm/cur will be freed sysExecElfWithParam(memPath,params); }else{ @@ -577,7 +588,7 @@ static config_set_t* elmGetConfig(int id) { static item_list_t *listSupport = NULL; ElmGame* cur = elmGetGameInfo(id); int ret=0; - + //Search on HDD, SMB, USB for the CFG/GAME.ELF.cfg file. //HDD if ( (listSupport = hddGetObject(1)) ) { @@ -596,14 +607,14 @@ static config_set_t* elmGetConfig(int id) { char path[256]; if (config != NULL) configFree(config); - + #if OPL_IS_DEV_BUILD snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), cur->ID); #else snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(),cur->ID); #endif config = configAlloc(1, NULL, path); - ret = configRead(config); + ret = configRead(config); } //USB @@ -611,7 +622,7 @@ static config_set_t* elmGetConfig(int id) { char path[256]; if (config != NULL) configFree(config); - + #if OPL_IS_DEV_BUILD snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), cur->ID); #else @@ -624,10 +635,10 @@ static config_set_t* elmGetConfig(int id) { if (ret == 0){ //No config found on previous devices, create one. if (config != NULL) configFree(config); - + config = configAlloc(1, NULL, NULL); } - + configSetStr(config, CONFIG_ITEM_NAME, cur->title); configSetStr(config, CONFIG_ITEM_LONGNAME, cur->title); configSetStr(config, CONFIG_ITEM_STARTUP, cur->ID); From f1e2893590083216d32730f858d052eb72d16746 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Mon, 11 May 2020 21:26:08 +0100 Subject: [PATCH 207/269] More changes --- src/elmsupport.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/elmsupport.c b/src/elmsupport.c index f7223be0d..c63f6fc35 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -320,9 +320,9 @@ static int elmUpdateItemList(void) { LOG("elmPathElfHdd = %s\n",elmPathElfHdd); //Check if POPSTARTER.ELF exists in the folder. - int fdElf = fileXioOpen(elmPathElfHdd, O_RDONLY, 0666); + int fdElf = open(elmPathElfHdd, O_RDONLY, 0666); if (fdElf >= 0) { - fileXioClose(fdElf); + close(fdElf); elmItemCount += elmScanVCDsHDD(); }else{ LOG("POPSTARTER.ELF not found at %s",elmPathElfHdd); @@ -336,9 +336,9 @@ static int elmUpdateItemList(void) { LOG("elmPathElfEth = %s\n",elmPathElfEth); //Check if POPSTARTER.ELF exists in the folder. - int fdElf = fileXioOpen(elmPathElfEth, O_RDONLY, 0666); + int fdElf = open(elmPathElfEth, O_RDONLY, 0666); if (fdElf >= 0) { - fileXioClose(fdElf); + close(fdElf); elmItemCount += elmScanVCDs(ethGetPrefix()); }else{ LOG("POPSTARTER.ELF not found at %s",elmPathElfEth); @@ -353,9 +353,9 @@ static int elmUpdateItemList(void) { LOG("elmPathElfUsb = %s\n",elmPathElfUsb); //Check if POPSTARTER.ELF exists in the folder. - int fdElf = fileXioOpen(elmPathElfUsb, O_RDONLY, 0666); + int fdElf = open(elmPathElfUsb, O_RDONLY, 0666); if (fdElf >= 0) { - fileXioClose(fdElf); + close(fdElf); elmItemCount += elmScanVCDs(usbGetBase()); }else{ LOG("POPSTARTER.ELF not found at %s",elmPathElfUsb); @@ -467,9 +467,9 @@ static void elmRenameItem(int id, char* newName) { }else if (!strncmp(cur->file,"mass",4)){ LOG("RENAMING MASS\n"); - if ((fd = fileXioOpen(cur->file, O_RDONLY)) >= 0) { + if ((fd = open(cur->file, O_RDONLY)) >= 0) { ret = fileXioIoctl(fd, USBMASS_IOCTL_RENAME, newNameFull); - fileXioClose(fd); + close(fd); } LOG("fd = %d\n",fd); LOG("ret = %d\n",ret); @@ -507,14 +507,14 @@ static void elmLaunchItem(int id, config_set_t* configSet) { LOG("elmLaunchItem with %s",elmPathElf); - int fdElf = fileXioOpen(elmPathElf, O_RDONLY, 0666); + int fdElf = open(elmPathElf, O_RDONLY, 0666); if (fdElf >= 0) { int fdVcd = 0; //If we start with hdd0 don't check if the file exists if (!strncmp(cur->file,"hdd0",4)){ fdVcd = 1; }else{ - fdVcd = fileXioOpen(cur->file, O_RDONLY, 0666); + fdVcd = open(cur->file, O_RDONLY, 0666); } if(fdVcd >=0){ @@ -530,7 +530,7 @@ static void elmLaunchItem(int id, config_set_t* configSet) { LOG("Loaded POPSTARTER ELF with size = %d\n",realSize); } - fileXioClose(fdElf); + close(fdElf); char memPath[256]; sprintf(memPath,"mem:%u",(unsigned int)buffer); From dfe3972f93a757c8c5121f0562cc4b3f24f17006 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 14 May 2020 19:01:34 -0700 Subject: [PATCH 208/269] update lang files --- lng/lang_Czech_r1682.lng | 4 ++-- lng/lang_Danish_r1682.lng | 6 +++--- lng/lang_Dutch_r1682.lng | 6 +++--- lng/lang_Hungarian_r1682.lng | 6 +++--- lng/lang_Japanese_r1682.lng | 6 +++--- lng/lang_Korean_r1682.lng | 6 +++--- lng/lang_Laotian_r1682.lng | 4 ++-- lng/lang_Romanian_r1682.lng | 4 ++-- lng/lang_SChinese_r1682.lng | 2 +- lng/lang_Turkish_r1682.lng | 12 ++++++------ 10 files changed, 28 insertions(+), 28 deletions(-) diff --git a/lng/lang_Czech_r1682.lng b/lng/lang_Czech_r1682.lng index 0dd2bda8b..1a11f7acb 100644 --- a/lng/lang_Czech_r1682.lng +++ b/lng/lang_Czech_r1682.lng @@ -6,7 +6,7 @@ Czech OPL %s Uložit změny Zpět -Network Settings +Síťová konfigurace Pokročilé možnosti <žádné hodnoty> Settings saved to %s @@ -211,7 +211,7 @@ Automatický start v %i s... Auto start Hodnota v sekundách, zadej 0 pro vypnutí auto startu PS2 Logo -Displayed for a valid disc logo matching the console's region. +Zobrazováno pouze u validního loga disku, který má stejný region jako konzole Configure PADEMU Pad Emulator Settings Enable Pad Emulator diff --git a/lng/lang_Danish_r1682.lng b/lng/lang_Danish_r1682.lng index 5d6b58bc4..cd53a6bd2 100644 --- a/lng/lang_Danish_r1682.lng +++ b/lng/lang_Danish_r1682.lng @@ -6,7 +6,7 @@ Danish OPL %s Gem indstillinger Tilbage -Network Settings +Netværksindstillinger Avancerede indstillinger Settings saved to %s @@ -133,7 +133,7 @@ Fremskridt VMC-fil eksisterer allerede Ugyldig VMC-fil, størrelse er ukorrekt VMC-fil skal oprettes -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Fejl med VMC %s, fortsæt med fysisk MC (port %d)? Automatisk opdatering Om Kodere @@ -211,7 +211,7 @@ Auto-start om %i s... Auto-start Værdi i sekunder(s), 0 for at deaktivere auto start PS2-Logo -Displayed for a valid disc logo matching the console's region. +Vises kun med et gyldigt disk logo, som matcher konsollens region Konfigurér PADEMU Pad Emulator indstillinger Aktivér Pad Emulator diff --git a/lng/lang_Dutch_r1682.lng b/lng/lang_Dutch_r1682.lng index bf28669cb..4f8f0092b 100644 --- a/lng/lang_Dutch_r1682.lng +++ b/lng/lang_Dutch_r1682.lng @@ -6,7 +6,7 @@ Dutch OPL %s Wijzigingen opslaan Terug -Network Settings +Netwerkconfiguratie Geavanceerde opties Settings saved to %s @@ -133,7 +133,7 @@ Voortgang VMC-bestand bestaat Ongeldige VMC-bestand, grootte is incorrect VMC-bestand moet gecreëerd worden -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Fout met VMC %s, voorzetten met fysieke MC (slot %d)? Automatisch vernieuwen Over Coders @@ -211,7 +211,7 @@ Auto-start over %i s... Auto-start Waarde in seconde(n), 0 om auto-start uit te schakelen PS2 logo -Displayed for a valid disc logo matching the console's region. +Alleen getoond voor geldige schijflogo die bij de console-regio past Configureer PADEMU Pad-emulator instellingen Pad-emulator inschakelen diff --git a/lng/lang_Hungarian_r1682.lng b/lng/lang_Hungarian_r1682.lng index 18e72bbd2..4079707f3 100644 --- a/lng/lang_Hungarian_r1682.lng +++ b/lng/lang_Hungarian_r1682.lng @@ -6,7 +6,7 @@ Hungarian OPL %s Változtatások mentése Vissza -Hálózati Beállítások +Hálózat konfigurálás Haladó beállítások Beállítások elmentve %s-be @@ -133,7 +133,7 @@ Folyamat VMC fájl létezik Érvénytelen VMC fájl, helytelen méret VMC fájl létrehozása szükséges -Hiba történt a VMC %s hozzáférésénél. Folytatás a %d foglalatban lévő memória kártyával? +Hiba a VMC-vel %s, folytatás a fizikai MC-vel (foglalat %d) ? Automatikus frissítés Névjegy Kódolók @@ -211,7 +211,7 @@ Automatikus indítás %i s belül... Automatikus indítás Érték másodperc(ek)ben, 0 az Automatikus indítás letiltásához PS2 Logó -A konzol régiójához megfelelő lemez logó megjelenése. +Csak egy érvényes lemez logónál jelenik meg, amely egyezik a konzol régiójával PADEMU konfigurálás Pad Emulator Beállítások PadEmulator Engedélyezése diff --git a/lng/lang_Japanese_r1682.lng b/lng/lang_Japanese_r1682.lng index 8bd2baeb6..9a1bf2310 100644 --- a/lng/lang_Japanese_r1682.lng +++ b/lng/lang_Japanese_r1682.lng @@ -6,7 +6,7 @@ Japanese OPL %s 設定を保存する 戻る -Network Settings +ネットワーク設定 詳細オプション <未設定> Settings saved to %s @@ -133,7 +133,7 @@ VMC設定 VMCファイル作成済 VMCファイルのサイズが正しくありません VMCファイル未作成 -Error accessing VMC %s. Continue with the Memory Card in slot %d? +VMC %s でエラー。スロット %d のメモリカードを使いますか? 自動リフレッシュ OPLについて コーディング @@ -211,7 +211,7 @@ Overwrite Existing Records 自動スタート 開始までの秒数を指定。0で無効化 PS2ロゴ -Displayed for a valid disc logo matching the console's region. +本体リージョンとディスクが一致した場合のみ表示されます PADEMUの設定 PADEMUの設定 PADEMU有効化 diff --git a/lng/lang_Korean_r1682.lng b/lng/lang_Korean_r1682.lng index 8deb30350..8250e81af 100644 --- a/lng/lang_Korean_r1682.lng +++ b/lng/lang_Korean_r1682.lng @@ -9,7 +9,7 @@ OPL %s 네트워크 구성 고급 옵션 <값 없음> -설정 저장… +설정이 %s 에 저장되었습니다. 설정 기록 중 에러! 종료 설정 @@ -43,7 +43,7 @@ O X 게임 목록 게임 설정 -모든 설정 제거 +설정 삭제 설정된 게임 키 제거 스크롤 속도 느림 @@ -108,7 +108,7 @@ USB 게임 손상 검사 버튼 선택 오류, 게임이 손상 되었습니다. 오류, 항목을 실행할 수 없습니다 -테스트 +테스트 변경 게스트 권한을 위해 지움 정밀하게 읽음 동기화 모드 diff --git a/lng/lang_Laotian_r1682.lng b/lng/lang_Laotian_r1682.lng index 3a95fc360..8f411b739 100644 --- a/lng/lang_Laotian_r1682.lng +++ b/lng/lang_Laotian_r1682.lng @@ -6,7 +6,7 @@ Laotian OPL %s ບັນທຶກການປ່ຽນແປງ ກັບຄືນ -Network Settings +ກຳນົດຄ່າທາງດ້ານ Network ທາງເລືອກສຳລັບການຕັ້ງຄ່າຂັ້ນສູງ <ບໍ່ມີຄ່າໃດໆ> Settings saved to %s @@ -211,7 +211,7 @@ Overwrite Existing Records ເປີດໃຊ້ແບບໂອໂຕ ຕັ້ງຄ່າຫົວໜ່ວຍ ວິນາທີ, ໃສ່ 0 ເພື່ອປິດການເປີດໃຊ້ແບບໂອໂຕ PS2 Logo -Displayed for a valid disc logo matching the console's region. +ຈະຖືກສະແດງຜົນ ກໍຕໍ່ເມື່ອໂລໂກ້ຂອງແຜ່ນຖືກຕ້ອງ ແລະ ສອດຄ່ອງຕາມໂຊນຂອງເຄື່ອງ Configure PADEMU Pad Emulator Settings Enable Pad Emulator diff --git a/lng/lang_Romanian_r1682.lng b/lng/lang_Romanian_r1682.lng index 6321b28ce..32dc77671 100644 --- a/lng/lang_Romanian_r1682.lng +++ b/lng/lang_Romanian_r1682.lng @@ -6,7 +6,7 @@ Romanian Open PS2 Loader %s Salvare Setari Inapoi -Network Settings +Config. retea Optiuni avansate Settings saved to %s @@ -133,7 +133,7 @@ Progres Fisierul VMC exista Fisier VMC invalid, dimensiunea este incorecta Fisier VMC trebuie creat -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Eroare la VMC %s, continuati cu cardul memorie fizic (slot %d)? Reimprospatare Automata Despre Ingineri diff --git a/lng/lang_SChinese_r1682.lng b/lng/lang_SChinese_r1682.lng index d3e5d9d8f..698f7bbd9 100644 --- a/lng/lang_SChinese_r1682.lng +++ b/lng/lang_SChinese_r1682.lng @@ -6,7 +6,7 @@ Simplified Chinese OPL %s 保存设置 返回 -Network Settings +网络设置 进阶设置 <无数值> 设置保存到 %s diff --git a/lng/lang_Turkish_r1682.lng b/lng/lang_Turkish_r1682.lng index 6d1270b6b..e64125f90 100644 --- a/lng/lang_Turkish_r1682.lng +++ b/lng/lang_Turkish_r1682.lng @@ -6,7 +6,7 @@ Turkish OPL %s Değişiklikleri kaydet Geri -Network Settings +Ağ ayarları Gelişmiş ayarlar Ayarlar %s a kaydedildi @@ -56,7 +56,7 @@ Oyun kimliği yüklenirken hata oluştu Otomatik sıralama Dil dosyası yüklenirken hata oluştu Hata ayıklama renklerini iptal et -Oyun kolu algılanmadı, bekleniyor... +Oyun kolu algılanmadı, bekliyor... Kapak Resimlerini etkinleştir Geniş ekran Gücü kapat @@ -67,7 +67,7 @@ Yenile USB cihazı başlangıç türü HDD cihazı başlangıç türü AĞ cihazı başlangıç türü -Uygulamalar menüsü görünüm türü +Uygulamalar menüsü görünüm kipi Otomatik El ile HDL Sunucu Başlat @@ -104,14 +104,14 @@ Sil Görüntü ayarları Yazma işlemlerini aktif et USB oyun bütünlüğünü kontrol et (Fragmentation) -En son oynanan oyunu hatırla +Enson oynanan oyunu hatırla Seçme tuşu Hata, oyun dosyası parçalı Hata, nesne çalıştırılamıyor Test et MİSAFİR oturumu için boş bırakınız. Okuma hızını emüle et -Senkronize Mod +Senkronize Modu Sistem çağrılarını çöz Videoları atla DVD-DL i etkinleştir @@ -211,7 +211,7 @@ Otomatik başlatılacak %i s... Otomatik başlat Saniye olarak değer, iptal etmek için 0 giriniz PS2 Logosu -Displayed for a valid disc logo matching the console's region. +Sadece konsolun bölgesine uyan, kabul edilebilir logolar gösterilir. PADEMU'yu ayarla Pad Emulator Ayarları PadEmulator Aktif Et From ca0cb2c466f7b8de4b9cc73a1c769a78e0e839e8 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 14 May 2020 19:06:48 -0700 Subject: [PATCH 209/269] update CREDITS --- CREDITS | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CREDITS b/CREDITS index 2993f0a3d..ded4793bb 100644 --- a/CREDITS +++ b/CREDITS @@ -21,16 +21,16 @@ Copyright (C) 2009 misfire ----------------------------------------------------------------------------- Main Project developers -by Ifcaro, volca, jimmikaelkael, polo35, izdubar, hominem.te.esse, SP193 +by hominem.te.esse, Ifcaro, izdubar, jimmikaelkael, polo35, SP193, volca Other developers -by BatRastard, crazyc, dlanor, doctorxyz, reprep, belek666, Maximus32, misfire +by BatRastard, belek666, crazyc, danielb, dlanor, doctorxyz, Maximus32, misfire, reprep UI design by Berion, Jay-Jay Quality Assurance -by RandQalan, yoshi314, EP, LocalH, lee4, El_Patas, ShaolinAssassin, algol, gledson999, jolek, zero35 +by algol, El_Patas, EP, gledson999, jolek, lee4, LocalH, RandQalan, ShaolinAssassin, yoshi314, zero35 SMSUTILS, SMSMAP & SMSTCPIP modules by Eugene Plotnikov From 8ba97f7945ba2859812077fdcfbab9642b198290 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 27 Jun 2020 07:34:40 -0700 Subject: [PATCH 210/269] update lang files --- lng/lang_Japanese_r1682.lng | 58 ++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/lng/lang_Japanese_r1682.lng b/lng/lang_Japanese_r1682.lng index 9a1bf2310..1309d811b 100644 --- a/lng/lang_Japanese_r1682.lng +++ b/lng/lang_Japanese_r1682.lng @@ -1,5 +1,5 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: Feb. 11, 2020 +# Last update: June 27, 2020 # Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese @@ -9,7 +9,7 @@ OPL %s ネットワーク設定 詳細オプション <未設定> -Settings saved to %s +%s に設定を保存しました 設定保存中にエラーが発生しました 終了 設定 @@ -43,7 +43,7 @@ O X ゲームリスト ゲーム設定 -Remove Settings +設定を削除 キー設定を初期化 画面スクロール 遅い @@ -108,7 +108,7 @@ USBゲームのデフラグを常にチェック セレクトボタン ゲームがデフラグされていません ゲーム(アプリ)を開始できませんでした -Test Changes +テスト起動 GUESTでログインする場合は空欄 読み込み速度の補正 データ読み込みをシンクロ化 @@ -116,8 +116,8 @@ Syscallの解除 一部のムービーをスキップ 二層ディスク(DVD9)用設定 IGRを無効化 -Unused -Unused +未使用 +未使用 サイズを変更するとVMCはフォーマットされます VMCファイルを作成 開始 @@ -145,7 +145,7 @@ IGR後に指定されたカスタムELFを実行します 画面モード ダイアログの色 選択時の色 -Reset Colors +カラーリセット インフォ カスタムELF 表示色設定 @@ -185,7 +185,7 @@ GSM設定をオン/オフ 垂直調整 垂直方向の表示位置を微調整 Overscan -Overscan Adjustment +Overscan 調整 FMVスキップ フルモーションムービーをスキップ チート設定 @@ -199,7 +199,7 @@ PS2RDチートモード チートファイルが見つかりません デフォルト設定をダウンロード ネットワークアップデート -Overwrite Existing Records +既存のレコードを上書き アップデートが失敗しました アップデートサーバに接続できませんでした アップデート完了 @@ -258,7 +258,7 @@ FIELD反転をエミュレートする パレンタルロックは無効です ビルドオプション: エラー - このパスワードは使用できません -VMC %s ファイルは破損しています。 スロット %d のメモリカードに保存しますか? +VMC %s ファイルは破損しています。 スロット %d のメモリカードに保存しますか? オーディオ設定 効果音を有効にする 起動音を有効にする @@ -266,27 +266,27 @@ VMC %s ファイルは破損しています。 スロット %d のメモリ 起動音の音量 ビデオモードの変更を確認しますか? ゲームリストをキャッシュ(HDD) -Enable Notifications -%s loaded from %s -Game Menu -Game settings saved. -%s settings removed. -Overwrites existing game compatibility settings when enabled. -Settings Mode -Global -Per Game -All -Select settings to remove. -Support Forums: -Title -Genre -Release -Developer -Description +通知を有効にします +%s から %s をロード +ゲームメニュー +ゲーム設定を保存しました +%s 設定を削除しました +有効にすると、既存のゲーム互換性設定を上書きします +設定モード +共通 +ゲームごと +全て +削除する設定を選択します +サポートフォーラム: +タイトル +ジャンル +リリース +開発元 +説明文 PS1 ゲーム PS1 ゲーム 画面モード -POPSTARTER.ELFが '%s'に見つかりません! -VCDファイル '%s'が見つかりません! +POPSTARTER.ELFが '%s'に見つかりません! +VCDファイル '%s'が見つかりません! ファイルの名前変更中にエラーが発生しました ファイルの削除中にエラーが発生しました OPEN-PS2-LOADER(OPL)を決して購入しないで、無料で入手してください From ac46b6913f9202ab9de8a8ad21d32a93fbc4b16f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 9 Jul 2020 12:32:10 -0700 Subject: [PATCH 211/269] update dialogs.c file --- src/dialogs.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/dialogs.c b/src/dialogs.c index b5ff0b74b..dd0bdd465 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -868,7 +868,6 @@ struct UIItem diaAbout[] = { {UI_SPLITTER}, //END of OPL_DB tweaks -<<<<<<< HEAD //START of OPL_DB tweaks // OPL Free Statement {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OPL_FREE}}}, @@ -876,20 +875,6 @@ struct UIItem diaAbout[] = { {UI_SPACER}, {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {NULL, _STR_OPL_IFCARO}}}, -======= - // Build Options - {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_BUILD_DETAILS}}}, - {UI_SPACER}, - {UI_LABEL, ABOUT_BUILD_DETAILS, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, - {UI_BREAK}, - - // Support details - {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_FORUM_DETAILS}}}, - {UI_SPACER}, - {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {"psx-place.com", -1}}}, ->>>>>>> 61d1ccbae4df626eef6696f9af492cc48f92c361 {UI_BREAK}, {UI_SPACER}, From b32e9f4da424aace8f0620823ca2c1dedc819e6f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 9 Jul 2020 12:51:49 -0700 Subject: [PATCH 212/269] update dialogs.c file --- src/dialogs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dialogs.c b/src/dialogs.c index dd0bdd465..8fced7a19 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -812,7 +812,9 @@ struct UIItem diaAbout[] = { // Build Options {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_BUILD_DETAILS}}}, {UI_SPACER}, {UI_LABEL, ABOUT_BUILD_DETAILS, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_BUILD_DETAILS}}}, + {UI_SPACER}, + {UI_LABEL, ABOUT_BUILD_DETAILS, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, //END of OPL_DB tweaks {UI_SPLITTER}, From 4e791e658b1d8703cc3bd358151eb87acfbb8320 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 9 Jul 2020 13:02:18 -0700 Subject: [PATCH 213/269] update dialogs.c file --- src/dialogs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dialogs.c b/src/dialogs.c index 8fced7a19..a910c7e55 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -813,8 +813,8 @@ struct UIItem diaAbout[] = { // Build Options {UI_BREAK}, {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_BUILD_DETAILS}}}, - {UI_SPACER}, - {UI_LABEL, ABOUT_BUILD_DETAILS, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, + {UI_SPACER}, + {UI_LABEL, ABOUT_BUILD_DETAILS, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, //END of OPL_DB tweaks {UI_SPLITTER}, From c395c9463ec28dba8bcc129c3c82cf1d380d3893 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 9 Jul 2020 19:28:00 -0700 Subject: [PATCH 214/269] Format files using clang-format --- elfldr/elfldr.c | 143 +++--- include/dialogs.h | 4 +- include/elmsupport.h | 4 +- include/ethsupport.h | 2 +- include/hddsupport.h | 2 +- include/iosupport.h | 4 +- include/lang.h | 18 +- include/system.h | 2 +- include/textures.h | 8 +- include/themes.h | 2 +- include/usbsupport.h | 4 +- src/appsupport.c | 136 ++--- src/dialogs.c | 4 +- src/elmsupport.c | 1169 +++++++++++++++++++++--------------------- src/ethsupport.c | 5 +- src/guigame.c | 38 +- src/hddsupport.c | 11 +- src/menusys.c | 18 +- src/opl.c | 8 +- src/system.c | 6 +- src/themes.c | 28 +- src/usbsupport.c | 18 +- 22 files changed, 825 insertions(+), 809 deletions(-) diff --git a/elfldr/elfldr.c b/elfldr/elfldr.c index bd4200280..c009c5386 100644 --- a/elfldr/elfldr.c +++ b/elfldr/elfldr.c @@ -23,7 +23,7 @@ //------------------------------ typedef struct { - u8 ident[16]; // struct definition for ELF object header + u8 ident[16]; // struct definition for ELF object header u16 type; u16 machine; u32 version; @@ -41,7 +41,7 @@ typedef struct //------------------------------ typedef struct { - u32 type; // struct definition for ELF program section header + u32 type; // struct definition for ELF program section header u32 offset; void *vaddr; u32 paddr; @@ -120,18 +120,18 @@ unsigned int _strtoui(const char *p) -void RunLoaderElf(char *filename,u8 *pElf) +void RunLoaderElf(char *filename, u8 *pElf) { u8 *boot_elf; elf_header_t *eh; elf_pheader_t *eph; void *pdata; - int i; + int i; char *argv[2]; - int elfsize=0; - int boverlap; - int vaddr; - + int elfsize = 0; + int boverlap; + int vaddr; + /* NB: LOADER.ELF is embedded */ boot_elf = (u8 *)pElf; eh = (elf_header_t *)boot_elf; @@ -140,61 +140,60 @@ void RunLoaderElf(char *filename,u8 *pElf) ; eph = (elf_pheader_t *)(boot_elf + eh->phoff); - // calc elf size + // calc elf size for (i = 0; i < eh->phnum; i++) { if (eph[i].type != ELF_PT_LOAD) continue; - if( elfsize <(eph[i].offset+eph[i].filesz)){ - elfsize = eph[i].offset+eph[i].filesz; - } - } - // check for overlap - boverlap=0; - for (i = 0; i < eh->phnum; i++) { + if (elfsize < (eph[i].offset + eph[i].filesz)) { + elfsize = eph[i].offset + eph[i].filesz; + } + } + // check for overlap + boverlap = 0; + for (i = 0; i < eh->phnum; i++) { if (eph[i].type != ELF_PT_LOAD) continue; vaddr = (int)eph[i].vaddr; - if( vaddr <((int)pElf)) { - if(vaddr+eph[i].memsz>((int)pElf)) - boverlap=1; - break; - } - - if( vaddr >((int)pElf)) { - if(vaddr+eph[i].memsz<((int)pElf)) - boverlap=1; - break; - } - } - if(boverlap) - { - u32 u; - u = (u32)pElf; - u = u >>20; - u = u+16; - - u = u&0x1F; - - if(u==0) - u=1; - if(u>24) - u=24; - u = u << 20; - u = u & ( 32*1024*1024-1); - - memcpy((void*)u,pElf,elfsize); - boot_elf = (u8 *)u; - - eh = (elf_header_t *)boot_elf; - if (_lw((u32)&eh->ident) != ELF_MAGIC) - while (1) - ; - eph = (elf_pheader_t *)(boot_elf + eh->phoff); - } - - /* Scan through the ELF's program headers and copy them into RAM, then - zero out any non-loaded regions. */ + if (vaddr < ((int)pElf)) { + if (vaddr + eph[i].memsz > ((int)pElf)) + boverlap = 1; + break; + } + + if (vaddr > ((int)pElf)) { + if (vaddr + eph[i].memsz < ((int)pElf)) + boverlap = 1; + break; + } + } + if (boverlap) { + u32 u; + u = (u32)pElf; + u = u >> 20; + u = u + 16; + + u = u & 0x1F; + + if (u == 0) + u = 1; + if (u > 24) + u = 24; + u = u << 20; + u = u & (32 * 1024 * 1024 - 1); + + memcpy((void *)u, pElf, elfsize); + boot_elf = (u8 *)u; + + eh = (elf_header_t *)boot_elf; + if (_lw((u32)&eh->ident) != ELF_MAGIC) + while (1) + ; + eph = (elf_pheader_t *)(boot_elf + eh->phoff); + } + + /* Scan through the ELF's program headers and copy them into RAM, then + zero out any non-loaded regions. */ for (i = 0; i < eh->phnum; i++) { if (eph[i].type != ELF_PT_LOAD) continue; @@ -206,9 +205,9 @@ void RunLoaderElf(char *filename,u8 *pElf) memset(eph[i].vaddr + eph[i].filesz, 0, eph[i].memsz - eph[i].filesz); } - - - + + + FlushCache(0); FlushCache(2); @@ -220,20 +219,16 @@ void RunLoaderElf(char *filename,u8 *pElf) int main(int argc, char *argv[]) { - //START of OPL_DB tweaks - if(argc>0 && (argv[0][0]=='m') - && (argv[0][1]=='e') - && (argv[0][2]=='m') - && (argv[0][3]==':')) - { - // boot from memaddr ; - unsigned int n=_strtoui(&(argv[0][4])); - RunLoaderElf(argv[1],(void*)n); - BootError(argv[0]); - return 0; - } - //END of OPL_DB tweaks - + //START of OPL_DB tweaks + if (argc > 0 && (argv[0][0] == 'm') && (argv[0][1] == 'e') && (argv[0][2] == 'm') && (argv[0][3] == ':')) { + // boot from memaddr ; + unsigned int n = _strtoui(&(argv[0][4])); + RunLoaderElf(argv[1], (void *)n); + BootError(argv[0]); + return 0; + } + //END of OPL_DB tweaks + int result; t_ExecData exd; @@ -262,7 +257,7 @@ int main(int argc, char *argv[]) while (!SifIopSync()) { }; - //END of OPL_DB tweaks + //END of OPL_DB tweaks //START of OPL_DB tweaks //Sync with the SIF library on the IOP, or it may crash the IOP kernel during the next reset (Depending on the how the next program initializes the IOP). diff --git a/include/dialogs.h b/include/dialogs.h index ea3e4d110..fb6679c2f 100644 --- a/include/dialogs.h +++ b/include/dialogs.h @@ -34,9 +34,9 @@ enum UI_ITEMS { CFG_HDDMODE, CFG_ETHMODE, CFG_APPMODE, -//START of OPL_DB tweaks + //START of OPL_DB tweaks CFG_ELMMODE, -//END of OPL_DB tweaks + //END of OPL_DB tweaks CFG_CHECKUSBFRAG, CFG_LASTPLAYED, CFG_LBL_AUTOSTARTLAST, diff --git a/include/elmsupport.h b/include/elmsupport.h index 878f1d8cd..59902787f 100644 --- a/include/elmsupport.h +++ b/include/elmsupport.h @@ -3,9 +3,9 @@ #include "include/iosupport.h" -#define ELM_MODE_UPDATE_DELAY 240 +#define ELM_MODE_UPDATE_DELAY 240 void elmInit(); -item_list_t* elmGetObject(int initOnly); +item_list_t *elmGetObject(int initOnly); #endif diff --git a/include/ethsupport.h b/include/ethsupport.h index 799936fa6..1f249fd54 100644 --- a/include/ethsupport.h +++ b/include/ethsupport.h @@ -16,7 +16,7 @@ typedef struct } smb_vmc_infos_t; //START of OPL_DB tweaks -char* ethGetPrefix(void); +char *ethGetPrefix(void); //END of OPL_DB tweaks void ethInit(void); //Full initialization (Start ETH + SMB and apply configuration). GUI must be already initialized, used by GUI to start SMB mode. void ethDeinitModules(void); //Module-only deinitialization, without the GUI's knowledge (for specific reasons, otherwise unused). diff --git a/include/hddsupport.h b/include/hddsupport.h index 5e548c55a..02a0ad797 100644 --- a/include/hddsupport.h +++ b/include/hddsupport.h @@ -49,7 +49,7 @@ typedef struct } hdd_vmc_infos_t; //START of OPL_DB tweaks -char* hddGetPrefix(void); +char *hddGetPrefix(void); //END of OPL_DB tweaks int hddCheck(void); u32 hddGetTotalSectors(void); diff --git a/include/iosupport.h b/include/iosupport.h index f2c323d6f..e1e1f8a72 100644 --- a/include/iosupport.h +++ b/include/iosupport.h @@ -11,9 +11,9 @@ enum IO_MODES { ETH_MODE, HDD_MODE, APP_MODE, -//START of OPL_DB tweaks + //START of OPL_DB tweaks ELM_MODE, -//END of OPL_DB tweaks + //END of OPL_DB tweaks MODE_COUNT }; diff --git a/include/lang.h b/include/lang.h index 303e90007..05530ae41 100644 --- a/include/lang.h +++ b/include/lang.h @@ -284,17 +284,17 @@ enum _STR_IDS { _STR_INFO_RELEASE, _STR_INFO_DEVELOPER, _STR_INFO_DESCRIPTION, -//START of OPL_DB tweaks + //START of OPL_DB tweaks _STR_ELM, _STR_ELMMODE, - _STR_ELM_LAUNCH_POPSTARTER_NOTFOUND, - _STR_ELM_LAUNCH_VCD_NOTFOUND, - _STR_ELM_RENAME_ERROR, - _STR_ELM_DELETE_ERROR, - _STR_OPL_FREE, - _STR_OPL_IFCARO, - _STR_OPL_DB, -//END of OPL_DB tweaks + _STR_ELM_LAUNCH_POPSTARTER_NOTFOUND, + _STR_ELM_LAUNCH_VCD_NOTFOUND, + _STR_ELM_RENAME_ERROR, + _STR_ELM_DELETE_ERROR, + _STR_OPL_FREE, + _STR_OPL_IFCARO, + _STR_OPL_DB, + //END of OPL_DB tweaks LANG_STR_COUNT }; diff --git a/include/system.h b/include/system.h index 8498520d2..a4af1eb3b 100644 --- a/include/system.h +++ b/include/system.h @@ -22,7 +22,7 @@ void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdv int sysExecElf(const char *path); //START of OPL_DB tweaks -int sysExecElfWithParam(char *path,char *param); +int sysExecElfWithParam(char *path, char *param); //END of OPL_DB tweaks int sysLoadModuleBuffer(void *buffer, int size, int argc, char *argv); int sysCheckMC(void); diff --git a/include/textures.h b/include/textures.h index 047c380ad..d674c9fc5 100644 --- a/include/textures.h +++ b/include/textures.h @@ -14,9 +14,9 @@ enum INTERNAL_TEXTURE { HDD_ICON, ETH_ICON, APP_ICON, -//START of OPL_DB tweaks + //START of OPL_DB tweaks ELM_ICON, -//END of OPL_DB tweaks + //END of OPL_DB tweaks LEFT_ICON, RIGHT_ICON, UP_ICON, @@ -35,9 +35,9 @@ enum INTERNAL_TEXTURE { R2_ICON, R3_ICON, */ MAIN_BG, -//START of OPL_DB tweaks + //START of OPL_DB tweaks MAIN2_BG, -//END of OPL_DB tweaks + //END of OPL_DB tweaks INFO_BG, COVER_DEFAULT, DISC_DEFAULT, diff --git a/include/themes.h b/include/themes.h index fc484a2fd..e3078bf28 100644 --- a/include/themes.h +++ b/include/themes.h @@ -117,7 +117,7 @@ typedef struct theme int inElmPage; theme_element_t *itemsListELM; //END of OPL_DB tweaks - + int gameCacheCount; theme_element_t *itemsList; diff --git a/include/usbsupport.h b/include/usbsupport.h index c188e8ee0..cd5867b79 100644 --- a/include/usbsupport.h +++ b/include/usbsupport.h @@ -16,8 +16,8 @@ typedef struct } usb_vmc_infos_t; //START of OPL_DB tweaks -char* usbGetPrefix(void); -char* usbGetBase(void); +char *usbGetPrefix(void); +char *usbGetBase(void); //END of OPL_DB tweaks #define MAX_USB_DEVICES 5 diff --git a/src/appsupport.c b/src/appsupport.c index e7904024e..0ded53b01 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -120,46 +120,46 @@ static int addAppsLegacyList(struct app_info_linked **appsLinkedList) int count; //START of OPL_DB tweaks char path[256]; - static item_list_t *listSupport = NULL; - int ret=0; //Return from configRead - + static item_list_t *listSupport = NULL; + int ret = 0; //Return from configRead + configClear(configApps); - //Try MC?:/OPL/conf_apps.cfg - snprintf(path, sizeof(path), "%s/conf_apps.cfg", gBaseMCDir); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - - //Try HDD - if ( ret == 0 && (listSupport = hddGetObject(1)) ) { - if (configApps != NULL){ - configFree(configApps); - } - snprintf(path, sizeof(path), "%sconf_apps.cfg", hddGetPrefix()); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - } - - //Try ETH - if ( ret == 0 && (listSupport = ethGetObject(1)) ) { - if (configApps != NULL){ - configFree(configApps); - } - snprintf(path, sizeof(path), "%sconf_apps.cfg", ethGetPrefix()); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - } - - //Try USB - if ( ret == 0 && (listSupport = usbGetObject(1)) ){ - if (configApps != NULL){ - configFree(configApps); - } - snprintf(path, sizeof(path), "%sconf_apps.cfg", usbGetPrefix()); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - } - //END of OPL_DB tweaks + //Try MC?:/OPL/conf_apps.cfg + snprintf(path, sizeof(path), "%s/conf_apps.cfg", gBaseMCDir); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + + //Try HDD + if (ret == 0 && (listSupport = hddGetObject(1))) { + if (configApps != NULL) { + configFree(configApps); + } + snprintf(path, sizeof(path), "%sconf_apps.cfg", hddGetPrefix()); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + } + + //Try ETH + if (ret == 0 && (listSupport = ethGetObject(1))) { + if (configApps != NULL) { + configFree(configApps); + } + snprintf(path, sizeof(path), "%sconf_apps.cfg", ethGetPrefix()); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + } + + //Try USB + if (ret == 0 && (listSupport = usbGetObject(1))) { + if (configApps != NULL) { + configFree(configApps); + } + snprintf(path, sizeof(path), "%sconf_apps.cfg", usbGetPrefix()); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + } + //END of OPL_DB tweaks count = 0; cur = configApps->head; @@ -323,7 +323,7 @@ static char *appGetItemStartup(int id) struct config_value_t *cur = appGetConfigValue(id); return appGetELFName(cur->val); } else { - //END of OPL_DB tweaks + //END of OPL_DB tweaks return appsList[id].boot; } } @@ -397,64 +397,64 @@ static void appLaunchItem(int id, config_set_t *configSet) static config_set_t *appGetConfig(int id) { - //START of OPL_DB tweaks - config_set_t *config = NULL; - //END of OPL_DB tweaks + //START of OPL_DB tweaks + config_set_t *config = NULL; + //END of OPL_DB tweaks if (appsList[id].legacy) { config = configAlloc(0, NULL, NULL); struct config_value_t *cur = appGetConfigValue(id); //START of OPL_DB tweaks static item_list_t *listSupport = NULL; - int ret=0; + int ret = 0; //Search on HDD, SMB, USB for the CFG/GAME.ELF.CFG file. //HDD - if ( (listSupport = hddGetObject(1)) ) { + if ((listSupport = hddGetObject(1))) { char path[256]; - #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); - #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); - #endif +#if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); +#else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); +#endif config = configAlloc(0, NULL, path); ret = configRead(config); } //ETH - if ( ret == 0 && (listSupport = ethGetObject(1)) ) { + if (ret == 0 && (listSupport = ethGetObject(1))) { char path[256]; if (config != NULL) configFree(config); - - #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), appGetELFName(cur->val)); - #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(),appGetELFName(cur->val)); - #endif + +#if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), appGetELFName(cur->val)); +#else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(), appGetELFName(cur->val)); +#endif config = configAlloc(0, NULL, path); - ret = configRead(config); + ret = configRead(config); } //USB - if ( ret == 0 && (listSupport = usbGetObject(1)) ){ + if (ret == 0 && (listSupport = usbGetObject(1))) { char path[256]; if (config != NULL) configFree(config); - - #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); - #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); - #endif + +#if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); +#else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); +#endif config = configAlloc(0, NULL, path); ret = configRead(config); } - if (ret == 0){ //No config found on previous devices, create one. + if (ret == 0) { //No config found on previous devices, create one. if (config != NULL) configFree(config); - + config = configAlloc(0, NULL, NULL); } //END of OPL_DB tweaks @@ -492,12 +492,12 @@ static int appGetImage(char *folder, int isRelative, char *value, char *suffix, //START of OPL_DB tweaks // Try with entire value, fixes not loading theme icons in subfolders. - if (oplGetAppImage(device, folder, isRelative, value, suffix, resultTex, psm) >=0){ + if (oplGetAppImage(device, folder, isRelative, value, suffix, resultTex, psm) >= 0) { return 0; } //END of OPL_DB tweaks - return oplGetAppImage(device, folder, isRelative, startup, suffix, resultTex, psm); + return oplGetAppImage(device, folder, isRelative, startup, suffix, resultTex, psm); } //This may be called, even if appInit() was not. diff --git a/src/dialogs.c b/src/dialogs.c index a910c7e55..45db57c6e 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -812,8 +812,8 @@ struct UIItem diaAbout[] = { // Build Options {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_BUILD_DETAILS}}}, - {UI_SPACER}, + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_BUILD_DETAILS}}}, + {UI_SPACER}, {UI_LABEL, ABOUT_BUILD_DETAILS, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, //END of OPL_DB tweaks {UI_SPLITTER}, diff --git a/src/elmsupport.c b/src/elmsupport.c index c63f6fc35..93352d68e 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -25,15 +25,15 @@ static item_list_t elmItemList; typedef struct ElmGame ElmGame; struct ElmGame { - char title[ISO_GAME_NAME_MAX - GAME_STARTUP_MAX + 1 ]; - char ID[GAME_STARTUP_MAX + 1]; - char file[ISO_GAME_NAME_MAX + 1 + 50]; + char title[ISO_GAME_NAME_MAX - GAME_STARTUP_MAX + 1]; + char ID[GAME_STARTUP_MAX + 1]; + char file[ISO_GAME_NAME_MAX + 1 + 50]; - //Eg: smb0:POPS .. smb0:POPS9 - It's where the VCD is - //Eg: pfs0:POPS/ is where the ELF is and the fake launch path - char pathFolder[50]; + //Eg: smb0:POPS .. smb0:POPS9 - It's where the VCD is + //Eg: pfs0:POPS/ is where the ELF is and the fake launch path + char pathFolder[50]; int sizeMB; - ElmGame *next; + ElmGame *next; }; //The pointer to the first game in the list @@ -48,630 +48,648 @@ char elmPathElfEth[256]; static unsigned char elmModifiedPrev[8]; //Frees the entire game list -static void elmGameListFree(){ - ElmGame* temp = NULL; - while ((temp = elmGameList) != NULL) { - elmGameList = elmGameList->next; - free(temp); - } - LOG("elmGameListFree() Complete\n"); +static void elmGameListFree() +{ + ElmGame *temp = NULL; + while ((temp = elmGameList) != NULL) { + elmGameList = elmGameList->next; + free(temp); + } + LOG("elmGameListFree() Complete\n"); } -static void elmGameTitleAppendDevice(ElmGame *tempGame){ - if (!strncmp(tempGame->file,"hdd",3)){ - strcat(tempGame->title," [HDD]"); - }else if (!strncmp(tempGame->file,"mass",4)){ - strcat(tempGame->title," [USB]"); - }else{ - strcat(tempGame->title," [ETH]"); - } +static void elmGameTitleAppendDevice(ElmGame *tempGame) +{ + if (!strncmp(tempGame->file, "hdd", 3)) { + strcat(tempGame->title, " [HDD]"); + } else if (!strncmp(tempGame->file, "mass", 4)) { + strcat(tempGame->title, " [USB]"); + } else { + strcat(tempGame->title, " [ETH]"); + } } -static int elmGameDuplicateTitleExists(ElmGame *inGame){ - ElmGame* tempGame = inGame->next; - int count = 0; - while (tempGame != NULL) { - if (strcmp(tempGame->title,inGame->title) == 0){ - elmGameTitleAppendDevice(tempGame); - count ++; - } - tempGame = tempGame->next; - } - if (count > 0){ - elmGameTitleAppendDevice(inGame); - } - return count; +static int elmGameDuplicateTitleExists(ElmGame *inGame) +{ + ElmGame *tempGame = inGame->next; + int count = 0; + while (tempGame != NULL) { + if (strcmp(tempGame->title, inGame->title) == 0) { + elmGameTitleAppendDevice(tempGame); + count++; + } + tempGame = tempGame->next; + } + if (count > 0) { + elmGameTitleAppendDevice(inGame); + } + return count; } -static struct ElmGame* elmGetGameInfo(int id) { - struct ElmGame* cur = elmGameList; +static struct ElmGame *elmGetGameInfo(int id) +{ + struct ElmGame *cur = elmGameList; - while (id--) { - cur = cur->next; - } + while (id--) { + cur = cur->next; + } - return cur; + return cur; } -void elmInit(void) { - LOG("ELMSUPPORT Init\n"); - memset(elmModifiedPrev, 0, 8); - elmForceUpdate = 1; - configGetInt(configGetByType(CONFIG_OPL), "elm_frames_delay", &elmItemList.delay); - elmItemList.enabled = 1; +void elmInit(void) +{ + LOG("ELMSUPPORT Init\n"); + memset(elmModifiedPrev, 0, 8); + elmForceUpdate = 1; + configGetInt(configGetByType(CONFIG_OPL), "elm_frames_delay", &elmItemList.delay); + elmItemList.enabled = 1; } -item_list_t* elmGetObject(int initOnly) { - if (initOnly && !elmItemList.enabled) - return NULL; - return &elmItemList; +item_list_t *elmGetObject(int initOnly) +{ + if (initOnly && !elmItemList.enabled) + return NULL; + return &elmItemList; } -static int elmNeedsUpdate(void) { - int update; +static int elmNeedsUpdate(void) +{ + int update; - update = 0; - if (elmForceUpdate) { - elmForceUpdate = 0; - update=1; - } + update = 0; + if (elmForceUpdate) { + elmForceUpdate = 0; + update = 1; + } - if(oplShouldElmUpdate()){ - update = 1; - } + if (oplShouldElmUpdate()) { + update = 1; + } - return update; + return update; } //Scans for POPSTARTER.ELF and VCD files in the given devPrefix. -static int elmScanVCDs(char* devPrefix){ - int count=0; //Game count - int i; - char fullpath[256]; - struct dirent *pdirent; - struct stat st; - DIR *pdir; - - LOG("elmScanVCDs()\n"); - - char currentPath[30]; - //POPS POPS0 POPS1 ... POPS9 - for (i=-1; i<10; i++){ - if (i == -1){ - snprintf(currentPath, sizeof(currentPath), "%sPOPS/", devPrefix); - }else{ - snprintf(currentPath, sizeof(currentPath), "%sPOPS%d/",devPrefix,i ); - } - LOG("currentPath = %s\n",currentPath); - - //Let's open the folder and search for the VCD files. - if ((pdir = opendir(currentPath)) != NULL) { - while ((pdirent = readdir(pdir)) != NULL) { - int filename_len = strlen(pdirent->d_name); - if (strlen(pdirent->d_name) > ISO_GAME_NAME_MAX) - continue; //Skip files that cannot be supported properly. - - if (filename_len >= 4 && strcasecmp(pdirent->d_name + filename_len - 4, ".VCD") == 0) { - LOG("VCD Found: %s\n",pdirent->d_name); - - if ((filename_len >= (GAME_STARTUP_MAX-1) + 1 + 1 + 4) && (pdirent->d_name[4] == '_') && (pdirent->d_name[8] == '.') && (pdirent->d_name[11] == '.')) {//Game ID found - //Create a new game - ElmGame* newElmGame = (ElmGame*)malloc(sizeof(ElmGame)); - if(newElmGame != NULL){ - //Eg: SLES_123.04.Game Title.VCD - int NameLen = filename_len - GAME_STARTUP_MAX -4; - - //Eg: Game Title - strncpy(newElmGame->title, &pdirent->d_name[GAME_STARTUP_MAX], NameLen); - newElmGame->title[NameLen] = '\0'; - - //Eg: SLES_123.04 - strncpy(newElmGame->ID, pdirent->d_name, GAME_STARTUP_MAX - 1); - newElmGame->ID[GAME_STARTUP_MAX - 1] = '\0'; - - // Get the file info - sprintf(fullpath, "%s/%s", currentPath, pdirent->d_name); - stat(fullpath, &st); - - //Eg: smb0:POPS/SLES_123.04.Game Title.VCD - snprintf(newElmGame->file,ISO_GAME_NAME_MAX + 1,"%s%s",currentPath,pdirent->d_name); - newElmGame->sizeMB = st.st_size >> 20; - - //Eg: smb0:POPS | smb0:POPS9 - strncpy(newElmGame->pathFolder,currentPath,sizeof(newElmGame->pathFolder)); - - newElmGame->next = elmGameList; - elmGameList = newElmGame; - - count++; - LOG("newElmGame->file = %s\n",newElmGame->file); - LOG("newElmGame->pathFolder = %s\n",newElmGame->pathFolder); - LOG("newElmGame->title = %s\n",newElmGame->title); - LOG("newElmGame->ID = %s\n",newElmGame->ID); - LOG("newElmGame->sizeMB = %d\n",newElmGame->sizeMB); - } else { - break;//Out of memory. - } - }else{ - LOG("No ID found in file name!!\n"); - } - }else{ - LOG("Not a .VCD file: %s\n",pdirent->d_name); - } - } - closedir(pdir); - } - } - return count; +static int elmScanVCDs(char *devPrefix) +{ + int count = 0; //Game count + int i; + char fullpath[256]; + struct dirent *pdirent; + struct stat st; + DIR *pdir; + + LOG("elmScanVCDs()\n"); + + char currentPath[30]; + //POPS POPS0 POPS1 ... POPS9 + for (i = -1; i < 10; i++) { + if (i == -1) { + snprintf(currentPath, sizeof(currentPath), "%sPOPS/", devPrefix); + } else { + snprintf(currentPath, sizeof(currentPath), "%sPOPS%d/", devPrefix, i); + } + LOG("currentPath = %s\n", currentPath); + + //Let's open the folder and search for the VCD files. + if ((pdir = opendir(currentPath)) != NULL) { + while ((pdirent = readdir(pdir)) != NULL) { + int filename_len = strlen(pdirent->d_name); + if (strlen(pdirent->d_name) > ISO_GAME_NAME_MAX) + continue; //Skip files that cannot be supported properly. + + if (filename_len >= 4 && strcasecmp(pdirent->d_name + filename_len - 4, ".VCD") == 0) { + LOG("VCD Found: %s\n", pdirent->d_name); + + if ((filename_len >= (GAME_STARTUP_MAX - 1) + 1 + 1 + 4) && (pdirent->d_name[4] == '_') && (pdirent->d_name[8] == '.') && (pdirent->d_name[11] == '.')) { //Game ID found + //Create a new game + ElmGame *newElmGame = (ElmGame *)malloc(sizeof(ElmGame)); + if (newElmGame != NULL) { + //Eg: SLES_123.04.Game Title.VCD + int NameLen = filename_len - GAME_STARTUP_MAX - 4; + + //Eg: Game Title + strncpy(newElmGame->title, &pdirent->d_name[GAME_STARTUP_MAX], NameLen); + newElmGame->title[NameLen] = '\0'; + + //Eg: SLES_123.04 + strncpy(newElmGame->ID, pdirent->d_name, GAME_STARTUP_MAX - 1); + newElmGame->ID[GAME_STARTUP_MAX - 1] = '\0'; + + // Get the file info + sprintf(fullpath, "%s/%s", currentPath, pdirent->d_name); + stat(fullpath, &st); + + //Eg: smb0:POPS/SLES_123.04.Game Title.VCD + snprintf(newElmGame->file, ISO_GAME_NAME_MAX + 1, "%s%s", currentPath, pdirent->d_name); + newElmGame->sizeMB = st.st_size >> 20; + + //Eg: smb0:POPS | smb0:POPS9 + strncpy(newElmGame->pathFolder, currentPath, sizeof(newElmGame->pathFolder)); + + newElmGame->next = elmGameList; + elmGameList = newElmGame; + + count++; + LOG("newElmGame->file = %s\n", newElmGame->file); + LOG("newElmGame->pathFolder = %s\n", newElmGame->pathFolder); + LOG("newElmGame->title = %s\n", newElmGame->title); + LOG("newElmGame->ID = %s\n", newElmGame->ID); + LOG("newElmGame->sizeMB = %d\n", newElmGame->sizeMB); + } else { + break; //Out of memory. + } + } else { + LOG("No ID found in file name!!\n"); + } + } else { + LOG("Not a .VCD file: %s\n", pdirent->d_name); + } + } + closedir(pdir); + } + } + return count; } //Scans partitions named __.POPS* and lists the VCD's inside it -static int elmScanVCDsHDD(){ - int fd,fd2,MountFD=0,count=0; - const char *mountPoint = "pfs1:"; - char partition[250]; - iox_dirent_t record; - - char scanned[10][9]; - int i; - int skip = 0; - int partitionCount = 0; - if ((fd2 = fileXioDopen("hdd0:")) >= 0) { +static int elmScanVCDsHDD() +{ + int fd, fd2, MountFD = 0, count = 0; + const char *mountPoint = "pfs1:"; + char partition[250]; + iox_dirent_t record; + + char scanned[10][9]; + int i; + int skip = 0; + int partitionCount = 0; + if ((fd2 = fileXioDopen("hdd0:")) >= 0) { while (fileXioDread(fd2, &record) > 0) { - skip=0; - fileXioUmount(mountPoint); - if (strncmp (record.name,"__.POPS",7) == 0){ - for(i = 0; i < partitionCount; i++) - { - if(strcmp(scanned[i], record.name) == 0) - { - LOG("%s was already scanned! Skipping!", record.name); - skip = 1; - break; - } - } - if (skip == 1) continue; - - strcpy(scanned[partitionCount],record.name); - partitionCount++; - - sprintf(partition,"hdd0:%s",record.name); - LOG("Mounting '%s' into '%s' \n",partition,mountPoint); - if ((MountFD = fileXioMount(mountPoint, partition, O_RDONLY)) >= 0) { - LOG("MOUNTED %s @ %s\n",partition,mountPoint); - char mountPointSlash[10]; - sprintf(mountPointSlash,"%s/",mountPoint); - LOG("fileXioDopen(%s)\n",mountPointSlash); - if ((fd = fileXioDopen(mountPointSlash)) > 0) { - while (fileXioDread(fd, &record) > 0) { - int filename_len = strlen(record.name); - if (strlen(record.name) > ISO_GAME_NAME_MAX) - continue; //Skip files that cannot be supported properly. - - if (filename_len >= 4 && strcasecmp(record.name + filename_len - 4, ".VCD") == 0) { - LOG("VCD Found: %s\n",record.name); - if ((filename_len >= (GAME_STARTUP_MAX-1) + 1 + 1 + 4) && (record.name[4] == '_') && (record.name[8] == '.') && (record.name[11] == '.')) {//Game ID found - //Create a new game - ElmGame* newElmGame = (ElmGame*)malloc(sizeof(ElmGame)); - if(newElmGame != NULL){ - newElmGame->next = elmGameList; - elmGameList = newElmGame; - - //Eg: SLES_123.04.Game Title.VCD - int NameLen = filename_len - GAME_STARTUP_MAX -4; - - //Eg: Game Title - strncpy(newElmGame->title, &record.name[GAME_STARTUP_MAX], NameLen); - newElmGame->title[NameLen] = '\0'; - - //Eg: SLES_123.04 - strncpy(newElmGame->ID, record.name, GAME_STARTUP_MAX - 1); - newElmGame->ID[GAME_STARTUP_MAX - 1] = '\0'; - - //Eg: hdd0:__POPS3/SLES_123.04.Game Title.VCD - snprintf(newElmGame->file,ISO_GAME_NAME_MAX + 1,"%s/%s",partition,record.name);//!!!!PARTITION - newElmGame->sizeMB = (record.stat.size >> 20) | (record.stat.hisize << 12); - - //Always pfs1: - strcpy(newElmGame->pathFolder,"pfs1:"); - - count++; - LOG("newElmGame->file = %s\n",newElmGame->file); - LOG("newElmGame->pathFolder = %s\n",newElmGame->pathFolder); - LOG("newElmGame->title = %s\n",newElmGame->title); - LOG("newElmGame->ID = %s\n",newElmGame->ID); - LOG("newElmGame->sizeMB = %d\n",newElmGame->sizeMB); - } else { - break;//Out of memory. - } - }else{ - LOG("No ID found in file name!!\n"); - } - } - } - fileXioDclose(fd); - } - fileXioUmount(mountPoint); - }else{ - LOG("MountFD=%d\n",MountFD); - } - } + skip = 0; + fileXioUmount(mountPoint); + if (strncmp(record.name, "__.POPS", 7) == 0) { + for (i = 0; i < partitionCount; i++) { + if (strcmp(scanned[i], record.name) == 0) { + LOG("%s was already scanned! Skipping!", record.name); + skip = 1; + break; + } + } + if (skip == 1) + continue; + + strcpy(scanned[partitionCount], record.name); + partitionCount++; + + sprintf(partition, "hdd0:%s", record.name); + LOG("Mounting '%s' into '%s' \n", partition, mountPoint); + if ((MountFD = fileXioMount(mountPoint, partition, O_RDONLY)) >= 0) { + LOG("MOUNTED %s @ %s\n", partition, mountPoint); + char mountPointSlash[10]; + sprintf(mountPointSlash, "%s/", mountPoint); + LOG("fileXioDopen(%s)\n", mountPointSlash); + if ((fd = fileXioDopen(mountPointSlash)) > 0) { + while (fileXioDread(fd, &record) > 0) { + int filename_len = strlen(record.name); + if (strlen(record.name) > ISO_GAME_NAME_MAX) + continue; //Skip files that cannot be supported properly. + + if (filename_len >= 4 && strcasecmp(record.name + filename_len - 4, ".VCD") == 0) { + LOG("VCD Found: %s\n", record.name); + if ((filename_len >= (GAME_STARTUP_MAX - 1) + 1 + 1 + 4) && (record.name[4] == '_') && (record.name[8] == '.') && (record.name[11] == '.')) { //Game ID found + //Create a new game + ElmGame *newElmGame = (ElmGame *)malloc(sizeof(ElmGame)); + if (newElmGame != NULL) { + newElmGame->next = elmGameList; + elmGameList = newElmGame; + + //Eg: SLES_123.04.Game Title.VCD + int NameLen = filename_len - GAME_STARTUP_MAX - 4; + + //Eg: Game Title + strncpy(newElmGame->title, &record.name[GAME_STARTUP_MAX], NameLen); + newElmGame->title[NameLen] = '\0'; + + //Eg: SLES_123.04 + strncpy(newElmGame->ID, record.name, GAME_STARTUP_MAX - 1); + newElmGame->ID[GAME_STARTUP_MAX - 1] = '\0'; + + //Eg: hdd0:__POPS3/SLES_123.04.Game Title.VCD + snprintf(newElmGame->file, ISO_GAME_NAME_MAX + 1, "%s/%s", partition, record.name); //!!!!PARTITION + newElmGame->sizeMB = (record.stat.size >> 20) | (record.stat.hisize << 12); + + //Always pfs1: + strcpy(newElmGame->pathFolder, "pfs1:"); + + count++; + LOG("newElmGame->file = %s\n", newElmGame->file); + LOG("newElmGame->pathFolder = %s\n", newElmGame->pathFolder); + LOG("newElmGame->title = %s\n", newElmGame->title); + LOG("newElmGame->ID = %s\n", newElmGame->ID); + LOG("newElmGame->sizeMB = %d\n", newElmGame->sizeMB); + } else { + break; //Out of memory. + } + } else { + LOG("No ID found in file name!!\n"); + } + } + } + fileXioDclose(fd); + } + fileXioUmount(mountPoint); + } else { + LOG("MountFD=%d\n", MountFD); + } + } } fileXioDclose(fd2); } else { - LOG("fd2 = %d\n",fd2); + LOG("fd2 = %d\n", fd2); } - return count; + return count; } -static int elmUpdateItemList(void) { - elmItemCount = 0; - - //Clear game list first. - if (elmGameList != NULL) - elmGameListFree(); - - //Try HDD - if (hddGetObject(1)) { - //Eg: pfs0:POPS/POPSTARTER.ELF - snprintf(elmPathElfHdd, sizeof(elmPathElfHdd), "%sPOPS/POPSTARTER.ELF",hddGetPrefix()); - LOG("elmPathElfHdd = %s\n",elmPathElfHdd); - - //Check if POPSTARTER.ELF exists in the folder. - int fdElf = open(elmPathElfHdd, O_RDONLY, 0666); - if (fdElf >= 0) { - close(fdElf); - elmItemCount += elmScanVCDsHDD(); - }else{ - LOG("POPSTARTER.ELF not found at %s",elmPathElfHdd); - } - } - - //Try ETH - if (ethGetObject(1)) { - //Eg: smb0:POPS/POPSTARTER.ELF - snprintf(elmPathElfEth, sizeof(elmPathElfEth), "%sPOPS/POPSTARTER.ELF",ethGetPrefix()); - LOG("elmPathElfEth = %s\n",elmPathElfEth); - - //Check if POPSTARTER.ELF exists in the folder. - int fdElf = open(elmPathElfEth, O_RDONLY, 0666); - if (fdElf >= 0) { - close(fdElf); - elmItemCount += elmScanVCDs(ethGetPrefix()); - }else{ - LOG("POPSTARTER.ELF not found at %s",elmPathElfEth); - } - - } - - //Try USB - if (usbGetObject(1)){ - //Eg: mass0:POPS/POPSTARTER.ELF - snprintf(elmPathElfUsb, sizeof(elmPathElfUsb), "%sPOPS/POPSTARTER.ELF",usbGetBase()); - LOG("elmPathElfUsb = %s\n",elmPathElfUsb); - - //Check if POPSTARTER.ELF exists in the folder. - int fdElf = open(elmPathElfUsb, O_RDONLY, 0666); - if (fdElf >= 0) { - close(fdElf); - elmItemCount += elmScanVCDs(usbGetBase()); - }else{ - LOG("POPSTARTER.ELF not found at %s",elmPathElfUsb); - } - } - - //Check for duplicates - if (elmGameList) { - ElmGame* cur = elmGameList; - while (cur) { - elmGameDuplicateTitleExists(cur); - cur = cur->next; - } - } - return elmItemCount; +static int elmUpdateItemList(void) +{ + elmItemCount = 0; + + //Clear game list first. + if (elmGameList != NULL) + elmGameListFree(); + + //Try HDD + if (hddGetObject(1)) { + //Eg: pfs0:POPS/POPSTARTER.ELF + snprintf(elmPathElfHdd, sizeof(elmPathElfHdd), "%sPOPS/POPSTARTER.ELF", hddGetPrefix()); + LOG("elmPathElfHdd = %s\n", elmPathElfHdd); + + //Check if POPSTARTER.ELF exists in the folder. + int fdElf = open(elmPathElfHdd, O_RDONLY, 0666); + if (fdElf >= 0) { + close(fdElf); + elmItemCount += elmScanVCDsHDD(); + } else { + LOG("POPSTARTER.ELF not found at %s", elmPathElfHdd); + } + } + + //Try ETH + if (ethGetObject(1)) { + //Eg: smb0:POPS/POPSTARTER.ELF + snprintf(elmPathElfEth, sizeof(elmPathElfEth), "%sPOPS/POPSTARTER.ELF", ethGetPrefix()); + LOG("elmPathElfEth = %s\n", elmPathElfEth); + + //Check if POPSTARTER.ELF exists in the folder. + int fdElf = open(elmPathElfEth, O_RDONLY, 0666); + if (fdElf >= 0) { + close(fdElf); + elmItemCount += elmScanVCDs(ethGetPrefix()); + } else { + LOG("POPSTARTER.ELF not found at %s", elmPathElfEth); + } + } + + //Try USB + if (usbGetObject(1)) { + //Eg: mass0:POPS/POPSTARTER.ELF + snprintf(elmPathElfUsb, sizeof(elmPathElfUsb), "%sPOPS/POPSTARTER.ELF", usbGetBase()); + LOG("elmPathElfUsb = %s\n", elmPathElfUsb); + + //Check if POPSTARTER.ELF exists in the folder. + int fdElf = open(elmPathElfUsb, O_RDONLY, 0666); + if (fdElf >= 0) { + close(fdElf); + elmItemCount += elmScanVCDs(usbGetBase()); + } else { + LOG("POPSTARTER.ELF not found at %s", elmPathElfUsb); + } + } + + //Check for duplicates + if (elmGameList) { + ElmGame *cur = elmGameList; + while (cur) { + elmGameDuplicateTitleExists(cur); + cur = cur->next; + } + } + return elmItemCount; } -static int elmGetItemCount(void) { - return elmItemCount; +static int elmGetItemCount(void) +{ + return elmItemCount; } -static char* elmGetItemName(int id) { - ElmGame* cur = elmGetGameInfo(id); - return cur->title; +static char *elmGetItemName(int id) +{ + ElmGame *cur = elmGetGameInfo(id); + return cur->title; } -static int elmGetItemNameLength(int id) { - return ISO_GAME_NAME_MAX +1 - GAME_STARTUP_MAX; +static int elmGetItemNameLength(int id) +{ + return ISO_GAME_NAME_MAX + 1 - GAME_STARTUP_MAX; } -static char* elmGetItemStartup(int id) { - ElmGame* cur = elmGetGameInfo(id); - return cur->ID; +static char *elmGetItemStartup(int id) +{ + ElmGame *cur = elmGetGameInfo(id); + return cur->ID; } -static void elmDeleteItem(int id) { - ElmGame* cur = elmGetGameInfo(id); - int ret = -1; - - //Check if it's a HDD game. - if (!strncmp(cur->file,"hdd0:",5)){ - int MountFD; - char partition[10]; - char file[256]; - - //Let's get the partition Eg: hdd0:__.POPS - char *separator = strchr(cur->file, '/'); - strncpy(partition,cur->file,separator - (cur->file)); - partition[separator - (cur->file)] = '\0'; - - //And the file path Eg: pfs1:SLES_123.45.Game.VCD - sprintf(file,"pfs1:%s",separator+1); - - //Make sure it's unmounted - fileXioUmount("pfs1:"); - - LOG("Mounting '%s' into 'pfs1:'\n",partition); - if ((MountFD = fileXioMount("pfs1:", partition, FIO_MT_RDWR)) >= 0) { - ret = fileXioRemove(file); - LOG("fileXioRemove(%s) = %d\n",file,ret); - fileXioUmount("pfs1:"); - }else{ - LOG("Failed to mount. Error %d\n",MountFD); - } - }else{ - LOG("fileXioRemove()\n",cur->file); - ret = fileXioRemove(cur->file); - } - if (ret != 0) { - guiMsgBox(_l(_STR_ELM_DELETE_ERROR), 0, NULL); - }else{ - elmForceUpdate = 1; - } +static void elmDeleteItem(int id) +{ + ElmGame *cur = elmGetGameInfo(id); + int ret = -1; + + //Check if it's a HDD game. + if (!strncmp(cur->file, "hdd0:", 5)) { + int MountFD; + char partition[10]; + char file[256]; + + //Let's get the partition Eg: hdd0:__.POPS + char *separator = strchr(cur->file, '/'); + strncpy(partition, cur->file, separator - (cur->file)); + partition[separator - (cur->file)] = '\0'; + + //And the file path Eg: pfs1:SLES_123.45.Game.VCD + sprintf(file, "pfs1:%s", separator + 1); + + //Make sure it's unmounted + fileXioUmount("pfs1:"); + + LOG("Mounting '%s' into 'pfs1:'\n", partition); + if ((MountFD = fileXioMount("pfs1:", partition, FIO_MT_RDWR)) >= 0) { + ret = fileXioRemove(file); + LOG("fileXioRemove(%s) = %d\n", file, ret); + fileXioUmount("pfs1:"); + } else { + LOG("Failed to mount. Error %d\n", MountFD); + } + } else { + LOG("fileXioRemove()\n", cur->file); + ret = fileXioRemove(cur->file); + } + if (ret != 0) { + guiMsgBox(_l(_STR_ELM_DELETE_ERROR), 0, NULL); + } else { + elmForceUpdate = 1; + } } -static void elmRenameItem(int id, char* newName) { - ElmGame* cur = elmGetGameInfo(id); - char newNameFull[256]; - int ret = -1; - int fd; - snprintf(newNameFull, sizeof(newNameFull),"%s%s.%s.VCD",cur->pathFolder,cur->ID,newName); - LOG("elmRenameItem()\n"); - LOG("cur->file = %s\n",cur->file); - LOG("newNameFull = %s\n",newNameFull); - //Check if it's a HDD game. - if (!strncmp(cur->file,"hdd0:",5)){ - char partition[10]; - char file[256]; - - //Let's get the partition Eg: hdd0:__.POPS - char *separator = strchr(cur->file, '/'); - strncpy(partition,cur->file,separator - (cur->file)); - partition[separator - (cur->file)] = '\0'; - - //And the file path Eg: pfs1:SLES_123.45.Game.VCD - sprintf(file,"pfs1:%s",separator+1); - - //Make sure it's unmounted - fileXioUmount("pfs1:"); - - LOG("Mounting '%s' into 'pfs1:'\n",partition); - if ((fd = fileXioMount("pfs1:", partition, FIO_MT_RDWR)) >= 0) { - ret = fileXioRename(file, newNameFull); - LOG("fileXioRename(%s , %s) = %d\n",file,newNameFull,ret); - fileXioUmount("pfs1:"); - }else{ - LOG("Failed to mount. Error %d\n",fd); - } - }else if (!strncmp(cur->file,"mass",4)){ - LOG("RENAMING MASS\n"); - - if ((fd = open(cur->file, O_RDONLY)) >= 0) { +static void elmRenameItem(int id, char *newName) +{ + ElmGame *cur = elmGetGameInfo(id); + char newNameFull[256]; + int ret = -1; + int fd; + snprintf(newNameFull, sizeof(newNameFull), "%s%s.%s.VCD", cur->pathFolder, cur->ID, newName); + LOG("elmRenameItem()\n"); + LOG("cur->file = %s\n", cur->file); + LOG("newNameFull = %s\n", newNameFull); + //Check if it's a HDD game. + if (!strncmp(cur->file, "hdd0:", 5)) { + char partition[10]; + char file[256]; + + //Let's get the partition Eg: hdd0:__.POPS + char *separator = strchr(cur->file, '/'); + strncpy(partition, cur->file, separator - (cur->file)); + partition[separator - (cur->file)] = '\0'; + + //And the file path Eg: pfs1:SLES_123.45.Game.VCD + sprintf(file, "pfs1:%s", separator + 1); + + //Make sure it's unmounted + fileXioUmount("pfs1:"); + + LOG("Mounting '%s' into 'pfs1:'\n", partition); + if ((fd = fileXioMount("pfs1:", partition, FIO_MT_RDWR)) >= 0) { + ret = fileXioRename(file, newNameFull); + LOG("fileXioRename(%s , %s) = %d\n", file, newNameFull, ret); + fileXioUmount("pfs1:"); + } else { + LOG("Failed to mount. Error %d\n", fd); + } + } else if (!strncmp(cur->file, "mass", 4)) { + LOG("RENAMING MASS\n"); + + if ((fd = open(cur->file, O_RDONLY)) >= 0) { ret = fileXioIoctl(fd, USBMASS_IOCTL_RENAME, newNameFull); close(fd); } - LOG("fd = %d\n",fd); - LOG("ret = %d\n",ret); - }else{ - ret = fileXioRename(cur->file, newNameFull); - LOG("fileXioRename(%s , %s) = %d\n",cur->file,newNameFull,ret); - } - - if (ret != 0) { - guiMsgBox(_l(_STR_ELM_RENAME_ERROR), 0, NULL); - }else{ - elmForceUpdate = 1; - } + LOG("fd = %d\n", fd); + LOG("ret = %d\n", ret); + } else { + ret = fileXioRename(cur->file, newNameFull); + LOG("fileXioRename(%s , %s) = %d\n", cur->file, newNameFull, ret); + } + + if (ret != 0) { + guiMsgBox(_l(_STR_ELM_RENAME_ERROR), 0, NULL); + } else { + elmForceUpdate = 1; + } } -static void elmLaunchItem(int id, config_set_t* configSet) { - ElmGame* cur = elmGetGameInfo(id); - //The path to POPSTARTER.ELF - char elmPathElf[256]; - - //The prefix of the ELF file. Eg: XX./SB./ - char elmElfPrefix[4]; - - //Figure out the path to POPSTARTER and the prefix - if (!strncmp(cur->file,"hdd0",4)){ - strcpy(elmPathElf,elmPathElfHdd); - strcpy(elmElfPrefix, ""); - }else if (!strncmp(cur->file,"mass",4)){ - strcpy(elmPathElf,elmPathElfUsb); - strcpy(elmElfPrefix, "XX."); - }else{ - strcpy(elmPathElf,elmPathElfEth); - strcpy(elmElfPrefix, "SB."); - } - - LOG("elmLaunchItem with %s",elmPathElf); - - int fdElf = open(elmPathElf, O_RDONLY, 0666); - if (fdElf >= 0) { - int fdVcd = 0; - //If we start with hdd0 don't check if the file exists - if (!strncmp(cur->file,"hdd0",4)){ - fdVcd = 1; - }else{ - fdVcd = open(cur->file, O_RDONLY, 0666); - } - - if(fdVcd >=0){ - void *buffer = NULL; - int realSize = fileXioLseek(fdElf, 0, SEEK_END); - fileXioLseek(fdElf, 0, SEEK_SET); - - buffer = malloc(realSize); - if (!buffer) { - LOG("Failed allocation of %d bytes", realSize); - } else { - fileXioRead(fdElf, buffer, realSize); - LOG("Loaded POPSTARTER ELF with size = %d\n",realSize); - } - - close(fdElf); - - char memPath[256]; - sprintf(memPath,"mem:%u",(unsigned int)buffer); - - char *fileOnly = strrchr(cur->file, '/'); - if (!fileOnly) - fileOnly = strrchr(cur->file, ':'); - - fileOnly++; - - fileOnly[strlen(fileOnly)-4] = '\0'; - - LOG("fileOnly= %s\n",fileOnly); - char params[256]; - sprintf(params,"%s%s%s.ELF",cur->pathFolder,elmElfPrefix,fileOnly); - - LOG("memPath = %s\n",memPath); - LOG("params = %s\n",params); - LOG("VCD Path= %s", cur->file); - - int mode = ELM_MODE; - - // Figure out in what device the VCD is at. This is necessary to avoid the device to be unmounted. - if (strncmp(cur->file,"mass", 4) == 0){ - mode = USB_MODE; - } else if (strncmp(cur->file,"hdd", 3) == 0){ - mode = HDD_MODE; - } else if (strncmp(cur->file,"smb", 3) == 0){ - mode = ETH_MODE; - } - - if (mode == ELM_MODE) { - // Failed to detect the device... - LOG("ELMSUPPORT warning: cannot find mode for path: %s\n", cur->file); - } else { - LOG("ELMSUPPORT Mode detected as: ", mode); - } - - deinit(UNMOUNT_EXCEPTION, mode); // CAREFUL: deinit will call elmCleanUp, so configElm/cur will be freed - sysExecElfWithParam(memPath,params); - }else{ - char error[256]; - snprintf(error, sizeof(error), _l(_STR_ELM_LAUNCH_VCD_NOTFOUND), cur->file); - guiMsgBox(error, 0, NULL); - } - }else{ - char error[256]; - snprintf(error, sizeof(error), _l(_STR_ELM_LAUNCH_POPSTARTER_NOTFOUND), elmPathElf); - guiMsgBox(error, 0, NULL); - } +static void elmLaunchItem(int id, config_set_t *configSet) +{ + ElmGame *cur = elmGetGameInfo(id); + //The path to POPSTARTER.ELF + char elmPathElf[256]; + + //The prefix of the ELF file. Eg: XX./SB./ + char elmElfPrefix[4]; + + //Figure out the path to POPSTARTER and the prefix + if (!strncmp(cur->file, "hdd0", 4)) { + strcpy(elmPathElf, elmPathElfHdd); + strcpy(elmElfPrefix, ""); + } else if (!strncmp(cur->file, "mass", 4)) { + strcpy(elmPathElf, elmPathElfUsb); + strcpy(elmElfPrefix, "XX."); + } else { + strcpy(elmPathElf, elmPathElfEth); + strcpy(elmElfPrefix, "SB."); + } + + LOG("elmLaunchItem with %s", elmPathElf); + + int fdElf = open(elmPathElf, O_RDONLY, 0666); + if (fdElf >= 0) { + int fdVcd = 0; + //If we start with hdd0 don't check if the file exists + if (!strncmp(cur->file, "hdd0", 4)) { + fdVcd = 1; + } else { + fdVcd = open(cur->file, O_RDONLY, 0666); + } + + if (fdVcd >= 0) { + void *buffer = NULL; + int realSize = fileXioLseek(fdElf, 0, SEEK_END); + fileXioLseek(fdElf, 0, SEEK_SET); + + buffer = malloc(realSize); + if (!buffer) { + LOG("Failed allocation of %d bytes", realSize); + } else { + fileXioRead(fdElf, buffer, realSize); + LOG("Loaded POPSTARTER ELF with size = %d\n", realSize); + } + + close(fdElf); + + char memPath[256]; + sprintf(memPath, "mem:%u", (unsigned int)buffer); + + char *fileOnly = strrchr(cur->file, '/'); + if (!fileOnly) + fileOnly = strrchr(cur->file, ':'); + + fileOnly++; + + fileOnly[strlen(fileOnly) - 4] = '\0'; + + LOG("fileOnly= %s\n", fileOnly); + char params[256]; + sprintf(params, "%s%s%s.ELF", cur->pathFolder, elmElfPrefix, fileOnly); + + LOG("memPath = %s\n", memPath); + LOG("params = %s\n", params); + LOG("VCD Path= %s", cur->file); + + int mode = ELM_MODE; + + // Figure out in what device the VCD is at. This is necessary to avoid the device to be unmounted. + if (strncmp(cur->file, "mass", 4) == 0) { + mode = USB_MODE; + } else if (strncmp(cur->file, "hdd", 3) == 0) { + mode = HDD_MODE; + } else if (strncmp(cur->file, "smb", 3) == 0) { + mode = ETH_MODE; + } + + if (mode == ELM_MODE) { + // Failed to detect the device... + LOG("ELMSUPPORT warning: cannot find mode for path: %s\n", cur->file); + } else { + LOG("ELMSUPPORT Mode detected as: ", mode); + } + + deinit(UNMOUNT_EXCEPTION, mode); // CAREFUL: deinit will call elmCleanUp, so configElm/cur will be freed + sysExecElfWithParam(memPath, params); + } else { + char error[256]; + snprintf(error, sizeof(error), _l(_STR_ELM_LAUNCH_VCD_NOTFOUND), cur->file); + guiMsgBox(error, 0, NULL); + } + } else { + char error[256]; + snprintf(error, sizeof(error), _l(_STR_ELM_LAUNCH_POPSTARTER_NOTFOUND), elmPathElf); + guiMsgBox(error, 0, NULL); + } } -static config_set_t* elmGetConfig(int id) { - config_set_t* config = NULL; - static item_list_t *listSupport = NULL; - ElmGame* cur = elmGetGameInfo(id); - int ret=0; - - //Search on HDD, SMB, USB for the CFG/GAME.ELF.cfg file. - //HDD - if ( (listSupport = hddGetObject(1)) ) { - char path[256]; - #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), cur->ID)); - #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), cur->ID); - #endif - config = configAlloc(1, NULL, path); - ret = configRead(config); - } - - //ETH - if ( ret == 0 && (listSupport = ethGetObject(1)) ) { - char path[256]; - if (config != NULL) - configFree(config); - - #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), cur->ID); - #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(),cur->ID); - #endif - config = configAlloc(1, NULL, path); - ret = configRead(config); - } - - //USB - if ( ret == 0 && (listSupport = usbGetObject(1)) ){ - char path[256]; - if (config != NULL) - configFree(config); - - #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), cur->ID); - #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), cur->ID); - #endif - config = configAlloc(1, NULL, path); - ret = configRead(config); - } - - if (ret == 0){ //No config found on previous devices, create one. - if (config != NULL) - configFree(config); - - config = configAlloc(1, NULL, NULL); - } - - configSetStr(config, CONFIG_ITEM_NAME, cur->title); - configSetStr(config, CONFIG_ITEM_LONGNAME, cur->title); - configSetStr(config, CONFIG_ITEM_STARTUP, cur->ID); - configSetInt(config, CONFIG_ITEM_SIZE, cur->sizeMB); - configSetStr(config, CONFIG_ITEM_FORMAT, "VCD"); - configSetStr(config, CONFIG_ITEM_MEDIA, "PS1"); - return config; +static config_set_t *elmGetConfig(int id) +{ + config_set_t *config = NULL; + static item_list_t *listSupport = NULL; + ElmGame *cur = elmGetGameInfo(id); + int ret = 0; + + //Search on HDD, SMB, USB for the CFG/GAME.ELF.cfg file. + //HDD + if ((listSupport = hddGetObject(1))) { + char path[256]; +#if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), cur->ID)); +#else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), cur->ID); +#endif + config = configAlloc(1, NULL, path); + ret = configRead(config); + } + + //ETH + if (ret == 0 && (listSupport = ethGetObject(1))) { + char path[256]; + if (config != NULL) + configFree(config); + +#if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), cur->ID); +#else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(), cur->ID); +#endif + config = configAlloc(1, NULL, path); + ret = configRead(config); + } + + //USB + if (ret == 0 && (listSupport = usbGetObject(1))) { + char path[256]; + if (config != NULL) + configFree(config); + +#if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), cur->ID); +#else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), cur->ID); +#endif + config = configAlloc(1, NULL, path); + ret = configRead(config); + } + + if (ret == 0) { //No config found on previous devices, create one. + if (config != NULL) + configFree(config); + + config = configAlloc(1, NULL, NULL); + } + + configSetStr(config, CONFIG_ITEM_NAME, cur->title); + configSetStr(config, CONFIG_ITEM_LONGNAME, cur->title); + configSetStr(config, CONFIG_ITEM_STARTUP, cur->ID); + configSetInt(config, CONFIG_ITEM_SIZE, cur->sizeMB); + configSetStr(config, CONFIG_ITEM_FORMAT, "VCD"); + configSetStr(config, CONFIG_ITEM_MEDIA, "PS1"); + return config; } -static int elmGetImage(char* folder, int isRelative, char* value, char* suffix, GSTEXTURE* resultTex, short psm) { - // Search every device from fastest to slowest (HDD > ETH > USB) - item_list_t *listSupport = NULL; - if ( (listSupport = hddGetObject(1)) ) { - if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) - return 0; - } +static int elmGetImage(char *folder, int isRelative, char *value, char *suffix, GSTEXTURE *resultTex, short psm) +{ + // Search every device from fastest to slowest (HDD > ETH > USB) + item_list_t *listSupport = NULL; + if ((listSupport = hddGetObject(1))) { + if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) + return 0; + } - if ( (listSupport = ethGetObject(1)) ) { - if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) - return 0; - } + if ((listSupport = ethGetObject(1))) { + if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) + return 0; + } - if ( (listSupport = usbGetObject(1)) ) - return listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm); + if ((listSupport = usbGetObject(1))) + return listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm); - return -1; + return -1; } -static void elmCleanUp(int exception) { - if (elmItemList.enabled) { - LOG("ELMSUPPORT CleanUp\n"); - elmGameListFree(); - } +static void elmCleanUp(int exception) +{ + if (elmItemList.enabled) { + LOG("ELMSUPPORT CleanUp\n"); + elmGameListFree(); + } } //This may be called, even if appInit() was not. @@ -685,7 +703,6 @@ static void elmShutdown(void) } static item_list_t elmItemList = { - ELM_MODE, -1, 0, MODE_FLAG_NO_COMPAT|MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", _STR_ELM, NULL, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, + ELM_MODE, -1, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", _STR_ELM, NULL, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, &elmGetItemCount, NULL, &elmGetItemName, &elmGetItemNameLength, &elmGetItemStartup, &elmDeleteItem, &elmRenameItem, &elmLaunchItem, - &elmGetConfig, &elmGetImage, &elmCleanUp, &elmShutdown, NULL, ELM_ICON -}; + &elmGetConfig, &elmGetImage, &elmCleanUp, &elmShutdown, NULL, ELM_ICON}; diff --git a/src/ethsupport.c b/src/ethsupport.c index 105861347..a392f15c8 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -44,8 +44,9 @@ static int ethReadNetConfig(void); static int ethInitSemaID = -1; //START of OPL_DB tweaks -char* ethGetPrefix(void){ - return ethPrefix; +char *ethGetPrefix(void) +{ + return ethPrefix; } //END of OPL_DB tweaks diff --git a/src/guigame.c b/src/guigame.c index 27328507c..4095c5187 100644 --- a/src/guigame.c +++ b/src/guigame.c @@ -788,21 +788,21 @@ int guiGameSaveConfig(config_set_t *configSet, item_list_t *support) compatMode = 0; //START of OPL_DB tweaks - char modesBuf[16];//(1+2+3+4+5+6+7+8)= 15 +1 null + char modesBuf[16]; //(1+2+3+4+5+6+7+8)= 15 +1 null int modesBufPos = 0; - for (i = 0; i < COMPAT_MODE_COUNT; ++i) { - //END of OPL_DB tweaks + for (i = 0; i < COMPAT_MODE_COUNT; ++i) { + //END of OPL_DB tweaks int mdpart; diaGetInt(diaCompatConfig, COMPAT_MODE_BASE + i, &mdpart); compatMode |= (mdpart ? 1 : 0) << i; //START of OPL_DB tweaks - if (mdpart){ - if(modesBufPos == 0) - modesBufPos+=sprintf(modesBuf + modesBufPos, "%d", i+1); - else - modesBufPos+=sprintf(modesBuf + modesBufPos, "+%d", i+1); - } - //END of OPL_DB tweaks + if (mdpart) { + if (modesBufPos == 0) + modesBufPos += sprintf(modesBuf + modesBufPos, "%d", i + 1); + else + modesBufPos += sprintf(modesBuf + modesBufPos, "+%d", i + 1); + } + //END of OPL_DB tweaks } if (support->flags & MODE_FLAG_COMPAT_DMA) { @@ -813,15 +813,15 @@ int guiGameSaveConfig(config_set_t *configSet, item_list_t *support) configRemoveKey(configSet, CONFIG_ITEM_DMA); } - //START of OPL_DB tweaks - if (compatMode != 0){ - result = configSetInt(configSet, CONFIG_ITEM_COMPAT, compatMode); - configSetStr(configSet, CONFIG_ITEM_MODES, modesBuf); - }else{ - configRemoveKey(configSet, CONFIG_ITEM_COMPAT); - configRemoveKey(configSet, CONFIG_ITEM_MODES); - } - //END of OPL_DB tweaks + //START of OPL_DB tweaks + if (compatMode != 0) { + result = configSetInt(configSet, CONFIG_ITEM_COMPAT, compatMode); + configSetStr(configSet, CONFIG_ITEM_MODES, modesBuf); + } else { + configRemoveKey(configSet, CONFIG_ITEM_COMPAT); + configRemoveKey(configSet, CONFIG_ITEM_MODES); + } + //END of OPL_DB tweaks /// GSM /// diaGetInt(diaGSConfig, GSMCFG_ENABLEGSM, &EnableGSM); diff --git a/src/hddsupport.c b/src/hddsupport.c index dd12c2652..790a6bbec 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -34,7 +34,8 @@ const char *oplPart = "hdd0:+OPL"; static item_list_t hddGameList; //START of OPL_DB tweaks -char* hddGetPrefix(void){ +char *hddGetPrefix(void) +{ return hddPrefix; } @@ -126,14 +127,14 @@ void hddLoadModules(void) "-n" "\0" "20"; - + //START of OPL_DB tweaks - static char pfsarg[] = "-m" + static char pfsarg[] = "-m" "\0" "4" "\0" - "-o" - "\0" + "-o" + "\0" "10" "\0" "-n" diff --git a/src/menusys.c b/src/menusys.c index f5ed2d5a0..4c0ae60d0 100644 --- a/src/menusys.c +++ b/src/menusys.c @@ -847,7 +847,7 @@ void menuHandleInputMenu() //Check if there is anything to show the user, at all. //START of OPL_DB tweaks if (gAPPStartMode || gELMStartMode || gETHStartMode || gUSBStartMode || gHDDStartMode) - //END of OPL_DB tweaks + //END of OPL_DB tweaks guiSwitchScreen(GUI_SCREEN_MAIN); } } @@ -860,19 +860,19 @@ void menuRenderMain() WaitSema(menuSemaId); //START of OPL_DB tweaks - theme_element_t* elem = NULL; + theme_element_t *elem = NULL; item_list_t *list = selected_item->item->userdata; - if(list && gTheme->mainElemsELM.first && list->mode == ELM_MODE){ + if (list && gTheme->mainElemsELM.first && list->mode == ELM_MODE) { elem = gTheme->mainElemsELM.first; - if (gTheme->inElmPage == 0){//Switch to ELM + if (gTheme->inElmPage == 0) { //Switch to ELM theme_element_t *tmp = gTheme->itemsListELM; gTheme->itemsListELM = gTheme->itemsList; gTheme->itemsList = tmp; } gTheme->inElmPage = 1; - }else{ + } else { elem = gTheme->mainElems.first; - if (gTheme->inElmPage == 1){//Switch to Normal + if (gTheme->inElmPage == 1) { //Switch to Normal theme_element_t *tmp = gTheme->itemsListELM; gTheme->itemsListELM = gTheme->itemsList; gTheme->itemsList = tmp; @@ -948,11 +948,11 @@ void menuRenderInfo() WaitSema(menuSemaId); //START of OPL_DB tweaks - theme_element_t* elem = NULL; + theme_element_t *elem = NULL; item_list_t *list = selected_item->item->userdata; - if(list && gTheme->infoElemsELM.first && list->mode == ELM_MODE){ + if (list && gTheme->infoElemsELM.first && list->mode == ELM_MODE) { elem = gTheme->infoElemsELM.first; - }else{ + } else { elem = gTheme->infoElems.first; } //END of OPL_DB tweaks diff --git a/src/opl.c b/src/opl.c index 9f7e0ef40..0d0063615 100644 --- a/src/opl.c +++ b/src/opl.c @@ -535,7 +535,7 @@ void menuDeferredUpdate(void *data) //If other modes have been updated, then the apps list should be updated too. if (*mode != APP_MODE) shouldAppsUpdate = 1; - + //START of OPL_DB tweaks //If other modes have been updated, then the elm list should be updated too. if (*mode != ELM_MODE) @@ -942,10 +942,10 @@ static void _saveConfig() void applyConfig(int themeID, int langID) { - //START of OPL_DB tweaks - if (gDefaultDevice < 0 || gDefaultDevice > MODE_COUNT -1) + //START of OPL_DB tweaks + if (gDefaultDevice < 0 || gDefaultDevice > MODE_COUNT - 1) gDefaultDevice = APP_MODE; - //END of OPL_DB tweaks + //END of OPL_DB tweaks guiUpdateScrollSpeed(); guiSetFrameHook(&menuUpdateHook); diff --git a/src/system.c b/src/system.c index 682e8a5a9..8f661822f 100644 --- a/src/system.c +++ b/src/system.c @@ -877,7 +877,7 @@ int sysExecElf(const char *path) } //START of OPL_DB tweaks -int sysExecElfWithParam(char *path,char *param) +int sysExecElfWithParam(char *path, char *param) { u8 *boot_elf = NULL; elf_header_t *eh; @@ -913,11 +913,11 @@ int sysExecElfWithParam(char *path,char *param) SifExitRpc(); elf_argv[0] = path; - elf_argv[1] = param; + elf_argv[1] = param; FlushCache(0); FlushCache(2); - + ExecPS2((void *)eh->entry, 0, 2, elf_argv); return 0; diff --git a/src/themes.c b/src/themes.c index e0d53e770..52a26045d 100644 --- a/src/themes.c +++ b/src/themes.c @@ -383,11 +383,11 @@ static image_texture_t *initImageInternalTexture(config_set_t *themeConfig, cons { image_texture_t *texture = (image_texture_t *)malloc(sizeof(image_texture_t)); texPrepare(&texture->source, GS_PSM_CT24); - //START of OPL_DB tweaks - int length = strlen(name) + 1; - texture->name = (char *)malloc(length * sizeof(char)); - memcpy(texture->name, name, length); - //END of OPL_DB tweaks + //START of OPL_DB tweaks + int length = strlen(name) + 1; + texture->name = (char *)malloc(length * sizeof(char)); + memcpy(texture->name, name, length); + //END of OPL_DB tweaks int result; if ((result = texLookupInternalTexId(name)) >= 0) { @@ -466,7 +466,7 @@ static mutable_image_t *initMutableImage(const char *themePath, config_set_t *th findDuplicate(theme->mainElemsELM.first, cachePattern, defaultTexture, overlayTexture, mutableImage); findDuplicate(theme->infoElemsELM.first, cachePattern, defaultTexture, overlayTexture, mutableImage); //END of OPL_DB tweaks - + if (cachePattern && !mutableImage->cache) { if (type == ELEM_TYPE_ATTRIBUTE_IMAGE) mutableImage->cache = cacheInitCache(-1, themePath, 0, cachePattern, 1); @@ -926,7 +926,7 @@ static void validateGUIElems(const char *themePath, config_set_t *themeConfig, t } } //END of OPL_DB tweaks - + // 2. check we have a valid ItemsList element, and link its decorator to the target element if (theme->itemsList) { items_list_t *itemsList = (items_list_t *)theme->itemsList->extended; @@ -976,7 +976,7 @@ static void validateGUIElems(const char *themePath, config_set_t *themeConfig, t } itemsList->decorator = NULL; } - } else if(theme->mainElemsELM.first){ + } else if (theme->mainElemsELM.first) { LOG("THEMES No itemsList found in ELM page, adding a default one\n"); theme->itemsListELM = initBasic(themePath, themeConfig, theme, "il", ELEM_TYPE_ITEMS_LIST, 150, MENU_POS_V, ALIGN_NONE, DIM_UNDEF, DIM_UNDEF, SCALING_RATIO, theme->textColor, theme->fonts[0]); initItemsList(themePath, themeConfig, theme, theme->itemsListELM, "il", NULL); @@ -1030,8 +1030,8 @@ static int addGUIElem(const char *themePath, config_set_t *themeConfig, theme_t elem = initBasic(themePath, themeConfig, theme, name, ELEM_TYPE_ITEMS_LIST, 0, 0, ALIGN_NONE, DIM_UNDEF, DIM_UNDEF, SCALING_RATIO, theme->textColor, theme->fonts[0]); initItemsList(themePath, themeConfig, theme, elem, name, NULL); theme->itemsList = elem; - //START of OPL_DB tweaks - }else if (!theme->itemsListELM){ + //START of OPL_DB tweaks + } else if (!theme->itemsListELM) { elem = initBasic(themePath, themeConfig, theme, name, ELEM_TYPE_ITEMS_LIST, 150, MENU_POS_V, ALIGN_NONE, DIM_UNDEF, DIM_UNDEF, SCALING_RATIO, theme->textColor, theme->fonts[0]); initItemsList(themePath, themeConfig, theme, elem, name, NULL); theme->itemsListELM = elem; @@ -1289,15 +1289,15 @@ static void thmLoad(const char *themePath) snprintf(path, sizeof(path), "mainELM0"); while (addGUIElem(themePath, themeConfig, newT, &newT->mainElemsELM, NULL, path)) snprintf(path, sizeof(path), "mainELM%d", i++); - + //Special Info ELM page i = 1; snprintf(path, sizeof(path), "infoELM0"); - while(addGUIElem(themePath, themeConfig, newT, &newT->infoElemsELM, NULL, path)) + while (addGUIElem(themePath, themeConfig, newT, &newT->infoElemsELM, NULL, path)) snprintf(path, sizeof(path), "infoELM%d", i++); - + //END of OPL_DB tweaks - + validateGUIElems(themePath, themeConfig, newT); if (themePath) validateGUIElems(themePath, themeConfig, newT); diff --git a/src/usbsupport.c b/src/usbsupport.c index 48c8513c6..07e3a5e41 100644 --- a/src/usbsupport.c +++ b/src/usbsupport.c @@ -33,12 +33,14 @@ static base_game_info_t *usbGames; static item_list_t usbGameList; //START of OPL_DB tweaks -char* usbGetPrefix(void){ - return usbPrefix; +char *usbGetPrefix(void) +{ + return usbPrefix; } -char* usbGetBase(void){ - return usbBase; +char *usbGetBase(void) +{ + return usbBase; } //END of OPL_DB tweaks @@ -64,7 +66,7 @@ int usbFindPartition(char *target, const char *name, int write) else sprintf(target, "mass%d:", i); //START of OPL_DB tweaks - sprintf(usbBase,"mass%d:",i); + sprintf(usbBase, "mass%d:", i); //END of OPL_DB tweaks close(fd); return 1; @@ -76,9 +78,9 @@ int usbFindPartition(char *target, const char *name, int write) sprintf(target, "mass0:%s/", gUSBPrefix); else sprintf(target, "mass0:"); - //START of OPL_DB tweaks - sprintf(usbBase, "mass0:"); - //END of OPL_DB tweaks + //START of OPL_DB tweaks + sprintf(usbBase, "mass0:"); + //END of OPL_DB tweaks return 0; } From c6c9b25ad29a7e4c18654bf23fc5acdd8729d12a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 28 Jul 2020 14:34:05 -0700 Subject: [PATCH 215/269] update Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 89e8ff4f4..04e7895cb 100755 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ VERSION = 0 SUBVERSION = 9 PATCHLEVEL = 3+ -EXTRAVERSION = Beta +EXTRAVERSION = Beta_DB-TA # How to DEBUG? # Simply type "make " to build OPL with the necessary debugging functionality. From cd10ceed62e733be5c9e0f9cb6a11292d53c485f Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Sat, 22 Aug 2020 10:18:56 +0100 Subject: [PATCH 216/269] Reverting our appsupport.c changes before merge --- src/appsupport.c | 121 ++--------------------------------------------- 1 file changed, 3 insertions(+), 118 deletions(-) diff --git a/src/appsupport.c b/src/appsupport.c index 0ded53b01..e34394f79 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -10,9 +10,6 @@ #include "include/usbsupport.h" #include "include/ethsupport.h" #include "include/hddsupport.h" -//START of OPL_DB tweaks -#include "include/supportbase.h" -//END of OPL_DB tweaks static int appForceUpdate = 1; static int appItemCount = 0; @@ -118,48 +115,9 @@ static int addAppsLegacyList(struct app_info_linked **appsLinkedList) struct config_value_t *cur; struct app_info_linked *app; int count; - //START of OPL_DB tweaks - char path[256]; - static item_list_t *listSupport = NULL; - int ret = 0; //Return from configRead configClear(configApps); - - //Try MC?:/OPL/conf_apps.cfg - snprintf(path, sizeof(path), "%s/conf_apps.cfg", gBaseMCDir); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - - //Try HDD - if (ret == 0 && (listSupport = hddGetObject(1))) { - if (configApps != NULL) { - configFree(configApps); - } - snprintf(path, sizeof(path), "%sconf_apps.cfg", hddGetPrefix()); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - } - - //Try ETH - if (ret == 0 && (listSupport = ethGetObject(1))) { - if (configApps != NULL) { - configFree(configApps); - } - snprintf(path, sizeof(path), "%sconf_apps.cfg", ethGetPrefix()); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - } - - //Try USB - if (ret == 0 && (listSupport = usbGetObject(1))) { - if (configApps != NULL) { - configFree(configApps); - } - snprintf(path, sizeof(path), "%sconf_apps.cfg", usbGetPrefix()); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - } - //END of OPL_DB tweaks + configRead(configApps); count = 0; cur = configApps->head; @@ -318,12 +276,10 @@ static int appGetItemNameLength(int id) The path is used immediately, before a subsequent call to appGetItemStartup(). */ static char *appGetItemStartup(int id) { - //START of OPL_DB tweaks if (appsList[id].legacy) { struct config_value_t *cur = appGetConfigValue(id); - return appGetELFName(cur->val); + return cur->val; } else { - //END of OPL_DB tweaks return appsList[id].boot; } } @@ -397,74 +353,14 @@ static void appLaunchItem(int id, config_set_t *configSet) static config_set_t *appGetConfig(int id) { - //START of OPL_DB tweaks - config_set_t *config = NULL; - //END of OPL_DB tweaks + config_set_t *config; if (appsList[id].legacy) { config = configAlloc(0, NULL, NULL); struct config_value_t *cur = appGetConfigValue(id); - //START of OPL_DB tweaks - static item_list_t *listSupport = NULL; - int ret = 0; - - //Search on HDD, SMB, USB for the CFG/GAME.ELF.CFG file. - //HDD - if ((listSupport = hddGetObject(1))) { - char path[256]; -#if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); -#else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); -#endif - config = configAlloc(0, NULL, path); - ret = configRead(config); - } - - //ETH - if (ret == 0 && (listSupport = ethGetObject(1))) { - char path[256]; - if (config != NULL) - configFree(config); - -#if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), appGetELFName(cur->val)); -#else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(), appGetELFName(cur->val)); -#endif - config = configAlloc(0, NULL, path); - ret = configRead(config); - } - - //USB - if (ret == 0 && (listSupport = usbGetObject(1))) { - char path[256]; - if (config != NULL) - configFree(config); - -#if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); -#else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); -#endif - config = configAlloc(0, NULL, path); - ret = configRead(config); - } - - if (ret == 0) { //No config found on previous devices, create one. - if (config != NULL) - configFree(config); - - config = configAlloc(0, NULL, NULL); - } - //END of OPL_DB tweaks configSetStr(config, CONFIG_ITEM_NAME, appGetELFName(cur->val)); configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); - //START of OPL_DB tweaks - configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); - configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); - //END of OPL_DB tweaks } else { char path[256]; snprintf(path, sizeof(path), "%s/%s", appsList[id].path, APP_TITLE_CONFIG_FILE); @@ -476,10 +372,6 @@ static config_set_t *appGetConfig(int id) configSetStr(config, CONFIG_ITEM_LONGNAME, appsList[id].title); snprintf(path, sizeof(path), "%s/%s", appsList[id].path, appsList[id].boot); configSetStr(config, CONFIG_ITEM_STARTUP, path); - //START of OPL_DB tweaks - configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); - configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); - //END of OPL_DB tweaks } return config; } @@ -490,13 +382,6 @@ static int appGetImage(char *folder, int isRelative, char *value, char *suffix, startup = appGetBoot(device, sizeof(device), value); - //START of OPL_DB tweaks - // Try with entire value, fixes not loading theme icons in subfolders. - if (oplGetAppImage(device, folder, isRelative, value, suffix, resultTex, psm) >= 0) { - return 0; - } - - //END of OPL_DB tweaks return oplGetAppImage(device, folder, isRelative, startup, suffix, resultTex, psm); } From ba6cd8463e6021165ecb63077aaa39db37f0c3c0 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Sat, 22 Aug 2020 11:12:27 +0100 Subject: [PATCH 217/269] Change to match new signature --- src/elmsupport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elmsupport.c b/src/elmsupport.c index 93352d68e..3e0041d90 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -703,6 +703,6 @@ static void elmShutdown(void) } static item_list_t elmItemList = { - ELM_MODE, -1, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", _STR_ELM, NULL, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, + ELM_MODE, -1, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", _STR_ELM, NULL, NULL, NULL, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, &elmGetItemCount, NULL, &elmGetItemName, &elmGetItemNameLength, &elmGetItemStartup, &elmDeleteItem, &elmRenameItem, &elmLaunchItem, &elmGetConfig, &elmGetImage, &elmCleanUp, &elmShutdown, NULL, ELM_ICON}; From bdd3c4da1fa2b446c6aea53f63055ccb2e50a957 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Sun, 23 Aug 2020 10:57:47 +0100 Subject: [PATCH 218/269] Deleted too much stuff! --- src/appsupport.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/appsupport.c b/src/appsupport.c index 6754395af..d337cb959 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -386,6 +386,11 @@ static config_set_t *appGetConfig(int id) configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); + //START of OPL_DB tweaks + configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); + configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); + //END of OPL_DB tweaks + snprintf(tmp, sizeof(tmp), "%.2f", appGetELFSize(cur->val)); configSetStr(config, CONFIG_ITEM_SIZE, tmp); } else { @@ -400,6 +405,11 @@ static config_set_t *appGetConfig(int id) snprintf(path, sizeof(path), "%s/%s", appsList[id].path, appsList[id].boot); configSetStr(config, CONFIG_ITEM_STARTUP, path); + //START of OPL_DB tweaks + configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); + configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); + //END of OPL_DB tweaks + snprintf(tmp, sizeof(tmp), "%.2f", appGetELFSize(path)); configSetStr(config, CONFIG_ITEM_SIZE, tmp); } @@ -412,6 +422,14 @@ static int appGetImage(char *folder, int isRelative, char *value, char *suffix, startup = appGetBoot(device, sizeof(device), value); + //START of OPL_DB tweaks + // Try with entire value, fixes not loading theme icons in subfolders. + if (oplGetAppImage(device, folder, isRelative, value, suffix, resultTex, psm) >= 0) { + return 0; + } + + //END of OPL_DB tweaks + return oplGetAppImage(device, folder, isRelative, startup, suffix, resultTex, psm); } From f2ca18e748c247e8382ba1642807fcf45448b3e0 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Wed, 16 Dec 2020 09:44:34 +0000 Subject: [PATCH 219/269] Update opl.c --- src/opl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/opl.c b/src/opl.c index 13d42b91d..8557c7857 100644 --- a/src/opl.c +++ b/src/opl.c @@ -153,6 +153,7 @@ int gUSBStartMode; int gHDDStartMode; int gETHStartMode; int gAPPStartMode; +int gELMStartMode; int gAutosort; int gAutoRefresh; int gEnableNotifications; From f853c59d1478008c0ba9ecd638643c2d4f934ac6 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 10 Jan 2021 22:04:52 -0800 Subject: [PATCH 220/269] update lang files --- lng/{lang_Arabic_r1682.lng => lang_Arabic_r1903.lng} | 6 +++--- lng/{lang_Bulgarian_r1682.lng => lang_Bulgarian_r1903.lng} | 6 +++--- lng/{lang_Croatian_r1682.lng => lang_Croatian_r1903.lng} | 6 +++--- lng/{lang_Czech_r1682.lng => lang_Czech_r1903.lng} | 6 +++--- lng/{lang_Danish_r1682.lng => lang_Danish_r1903.lng} | 6 +++--- lng/{lang_Dutch_r1682.lng => lang_Dutch_r1903.lng} | 6 +++--- lng/{lang_Filipino_r1682.lng => lang_Filipino_r1903.lng} | 6 +++--- lng/{lang_French_r1682.lng => lang_French_r1903.lng} | 6 +++--- lng/{lang_German_r1682.lng => lang_German_r1903.lng} | 6 +++--- lng/{lang_Greek_r1682.lng => lang_Greek_r1903.lng} | 6 +++--- lng/{lang_Hungarian_r1682.lng => lang_Hungarian_r1903.lng} | 6 +++--- ...{lang_Indonesian_r1682.lng => lang_Indonesian_r1903.lng} | 6 +++--- lng/{lang_Italian_r1682.lng => lang_Italian_r1903.lng} | 6 +++--- lng/{lang_Japanese_r1682.lng => lang_Japanese_r1903.lng} | 6 +++--- lng/{lang_Korean_r1682.lng => lang_Korean_r1903.lng} | 6 +++--- lng/{lang_Laotian_r1682.lng => lang_Laotian_r1903.lng} | 6 +++--- lng/{lang_Persian_r1682.lng => lang_Persian_r1903.lng} | 6 +++--- lng/{lang_Polish_r1682.lng => lang_Polish_r1903.lng} | 6 +++--- ...Portuguese_BR_r1682.lng => lang_Portuguese_BR_r1903.lng} | 6 +++--- ...{lang_Portuguese_r1682.lng => lang_Portuguese_r1903.lng} | 6 +++--- lng/{lang_Romanian_r1682.lng => lang_Romanian_r1903.lng} | 6 +++--- lng/{lang_Russian_r1682.lng => lang_Russian_r1903.lng} | 6 +++--- lng/{lang_SChinese_r1682.lng => lang_SChinese_r1903.lng} | 6 +++--- lng/{lang_Spanish_r1682.lng => lang_Spanish_r1903.lng} | 6 +++--- lng/{lang_Swedish_r1682.lng => lang_Swedish_r1903.lng} | 6 +++--- lng/{lang_TChinese_r1682.lng => lang_TChinese_r1903.lng} | 6 +++--- lng/{lang_Turkish_r1682.lng => lang_Turkish_r1903.lng} | 6 +++--- ...{lang_Vietnamese_r1682.lng => lang_Vietnamese_r1903.lng} | 6 +++--- 28 files changed, 84 insertions(+), 84 deletions(-) rename lng/{lang_Arabic_r1682.lng => lang_Arabic_r1903.lng} (98%) rename lng/{lang_Bulgarian_r1682.lng => lang_Bulgarian_r1903.lng} (98%) rename lng/{lang_Croatian_r1682.lng => lang_Croatian_r1903.lng} (97%) rename lng/{lang_Czech_r1682.lng => lang_Czech_r1903.lng} (97%) rename lng/{lang_Danish_r1682.lng => lang_Danish_r1903.lng} (97%) rename lng/{lang_Dutch_r1682.lng => lang_Dutch_r1903.lng} (97%) rename lng/{lang_Filipino_r1682.lng => lang_Filipino_r1903.lng} (97%) rename lng/{lang_French_r1682.lng => lang_French_r1903.lng} (97%) rename lng/{lang_German_r1682.lng => lang_German_r1903.lng} (97%) rename lng/{lang_Greek_r1682.lng => lang_Greek_r1903.lng} (98%) rename lng/{lang_Hungarian_r1682.lng => lang_Hungarian_r1903.lng} (97%) rename lng/{lang_Indonesian_r1682.lng => lang_Indonesian_r1903.lng} (97%) rename lng/{lang_Italian_r1682.lng => lang_Italian_r1903.lng} (97%) rename lng/{lang_Japanese_r1682.lng => lang_Japanese_r1903.lng} (98%) rename lng/{lang_Korean_r1682.lng => lang_Korean_r1903.lng} (97%) rename lng/{lang_Laotian_r1682.lng => lang_Laotian_r1903.lng} (98%) rename lng/{lang_Persian_r1682.lng => lang_Persian_r1903.lng} (98%) rename lng/{lang_Polish_r1682.lng => lang_Polish_r1903.lng} (97%) rename lng/{lang_Portuguese_BR_r1682.lng => lang_Portuguese_BR_r1903.lng} (97%) rename lng/{lang_Portuguese_r1682.lng => lang_Portuguese_r1903.lng} (97%) rename lng/{lang_Romanian_r1682.lng => lang_Romanian_r1903.lng} (97%) rename lng/{lang_Russian_r1682.lng => lang_Russian_r1903.lng} (98%) rename lng/{lang_SChinese_r1682.lng => lang_SChinese_r1903.lng} (96%) rename lng/{lang_Spanish_r1682.lng => lang_Spanish_r1903.lng} (97%) rename lng/{lang_Swedish_r1682.lng => lang_Swedish_r1903.lng} (97%) rename lng/{lang_TChinese_r1682.lng => lang_TChinese_r1903.lng} (96%) rename lng/{lang_Turkish_r1682.lng => lang_Turkish_r1903.lng} (97%) rename lng/{lang_Vietnamese_r1682.lng => lang_Vietnamese_r1903.lng} (97%) diff --git a/lng/lang_Arabic_r1682.lng b/lng/lang_Arabic_r1903.lng similarity index 98% rename from lng/lang_Arabic_r1682.lng rename to lng/lang_Arabic_r1903.lng index 154b158c4..eabcfdce6 100644 --- a/lng/lang_Arabic_r1682.lng +++ b/lng/lang_Arabic_r1903.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: Feb. 13, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL @@ -268,7 +268,7 @@ d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞ (HDD) ﺖﻗﺆﻤﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺏﺎﻌﻟﺃ ﺔﻤﺋﺎﻗ ﺕﺍﺭﺎﻌﺷﻹﺍ ﻦﻴﻜﻤﺗ s% ﻦﻣ ﻞﻤﺤﻣ s% -ﺔﺒﻌﻠﻟﺍ ﺔﻤﺋﺎﻗ +Options .ﺔﺒﻌﻠﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﻆﻔﺣ ﻢﺗ .ﺕﺍﺩﺍﺪﻋﻹﺍ ﺔﻟﺍﺯﺇ ﺖﻤﺗ %s .ﻦﻴﻜﻤﺘﻟﺍ ﺪﻨﻋ ﺔﻴﻟﺎﺤﻟﺍ ﺔﺒﻌﻠﻟﺍ ﻖﻓﺍﻮﺗ ﺕﺍﺩﺍﺪﻋﺇ ﻕﻮﻓ ﺔﺑﺎﺘﻜﻟﺍ diff --git a/lng/lang_Bulgarian_r1682.lng b/lng/lang_Bulgarian_r1903.lng similarity index 98% rename from lng/lang_Bulgarian_r1682.lng rename to lng/lang_Bulgarian_r1903.lng index f85cc77b9..380d6c41a 100644 --- a/lng/lang_Bulgarian_r1682.lng +++ b/lng/lang_Bulgarian_r1903.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: May 10, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -268,7 +268,7 @@ VMC %s файлът е фрагментиран. Продължаване с Mem Кеширане списъка с игри (ЗУТМД - HDD) Видими на Известия %s зареден от %s -Меню Игри +Options Настройките на игри запазени. %s настройки премахнати. Презаписва съществуващите настройки на съвместимаст. diff --git a/lng/lang_Croatian_r1682.lng b/lng/lang_Croatian_r1903.lng similarity index 97% rename from lng/lang_Croatian_r1682.lng rename to lng/lang_Croatian_r1903.lng index 614ec016b..e2b1a39c9 100644 --- a/lng/lang_Croatian_r1682.lng +++ b/lng/lang_Croatian_r1903.lng @@ -1,6 +1,6 @@ # Translation by Blacky5678 -# Last update: Feb. 11, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Croatian OPL %s @@ -268,7 +268,7 @@ Potvrdi promjenu video nacina? Predmemorija Liste Igara (HDD) Omoguci Notifikacije %s ucitano sa %s -Izbornik Igre +Options Postavke igre su spremljene. %s postavke su uklonjene. Prepisivanje postojecih postavki kompatibilnosti igre kada je omoguceno. diff --git a/lng/lang_Czech_r1682.lng b/lng/lang_Czech_r1903.lng similarity index 97% rename from lng/lang_Czech_r1682.lng rename to lng/lang_Czech_r1903.lng index 1a11f7acb..6cbe936ed 100644 --- a/lng/lang_Czech_r1682.lng +++ b/lng/lang_Czech_r1903.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: Feb. 11, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -268,7 +268,7 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s -Game Menu +Options Game settings saved. %s settings removed. Overwrites existing game compatibility settings when enabled. diff --git a/lng/lang_Danish_r1682.lng b/lng/lang_Danish_r1903.lng similarity index 97% rename from lng/lang_Danish_r1682.lng rename to lng/lang_Danish_r1903.lng index cd53a6bd2..1cd90defc 100644 --- a/lng/lang_Danish_r1682.lng +++ b/lng/lang_Danish_r1903.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: Feb. 11, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -268,7 +268,7 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s -Game Menu +Options Game settings saved. %s settings removed. Overwrites existing game compatibility settings when enabled. diff --git a/lng/lang_Dutch_r1682.lng b/lng/lang_Dutch_r1903.lng similarity index 97% rename from lng/lang_Dutch_r1682.lng rename to lng/lang_Dutch_r1903.lng index 4f8f0092b..0b8097b7c 100644 --- a/lng/lang_Dutch_r1682.lng +++ b/lng/lang_Dutch_r1903.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: Feb. 11, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -268,7 +268,7 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s -Game Menu +Options Game settings saved. %s settings removed. Overwrites existing game compatibility settings when enabled. diff --git a/lng/lang_Filipino_r1682.lng b/lng/lang_Filipino_r1903.lng similarity index 97% rename from lng/lang_Filipino_r1682.lng rename to lng/lang_Filipino_r1903.lng index d1b8577a8..b1c1f72b6 100644 --- a/lng/lang_Filipino_r1682.lng +++ b/lng/lang_Filipino_r1903.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: Feb. 11, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -268,7 +268,7 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s -Game Menu +Options Game settings saved. %s settings removed. Overwrites existing game compatibility settings when enabled. diff --git a/lng/lang_French_r1682.lng b/lng/lang_French_r1903.lng similarity index 97% rename from lng/lang_French_r1682.lng rename to lng/lang_French_r1903.lng index b9be7f259..75fa3f48f 100644 --- a/lng/lang_French_r1682.lng +++ b/lng/lang_French_r1903.lng @@ -1,6 +1,6 @@ # Translation by machiavel and Squall -# Last update: March 26, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -268,7 +268,7 @@ Confirmer le changement du mode vidéo? Cache liste de jeu (HDD) Activer les Notifications %s chargé depuis %s -Menu du jeu +Options Supprimer les paramètres. %s paramètres supprimés. Écrase les paramètres de compatibilité de jeu existants lorsqu'il est activé. diff --git a/lng/lang_German_r1682.lng b/lng/lang_German_r1903.lng similarity index 97% rename from lng/lang_German_r1682.lng rename to lng/lang_German_r1903.lng index af039e1d0..79a3a1654 100644 --- a/lng/lang_German_r1682.lng +++ b/lng/lang_German_r1903.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: April 11, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -268,7 +268,7 @@ Lautstärke Startsound Spieleliste zwischenspeichern (HDD) Benachrichtigungen Einschalten %s geladen von %s -Spiel Menü +Options Spiel-Einstellungen gespeichert. %s Einstellungen entfernt. Wenn angewählt, werden existierende Spiel-Kompatibilitäts-Einstellungen überschrieben. diff --git a/lng/lang_Greek_r1682.lng b/lng/lang_Greek_r1903.lng similarity index 98% rename from lng/lang_Greek_r1682.lng rename to lng/lang_Greek_r1903.lng index e8852f7d1..ed527bceb 100644 --- a/lng/lang_Greek_r1682.lng +++ b/lng/lang_Greek_r1903.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: April 18, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -268,7 +268,7 @@ ID κατασκευαστή: Caching Λίστας Παιχνιδιών (HDD) Ενεργοποίηση Ειδοποιήσεων Το %s φορτώθηκε από %s -Μενού Παιχνιδιού +Options Οι ρυθμίσεις παιχνιδιού αποθηκεύτηκαν. Οι ρυθμίσεις %s καταργήθηκαν. Αν είναι ενεργό, αντικαθιστά τις υπάρχουσες ρυθμίσεις συμβατότητας παιχνιδιού. diff --git a/lng/lang_Hungarian_r1682.lng b/lng/lang_Hungarian_r1903.lng similarity index 97% rename from lng/lang_Hungarian_r1682.lng rename to lng/lang_Hungarian_r1903.lng index 4079707f3..2de16376a 100644 --- a/lng/lang_Hungarian_r1682.lng +++ b/lng/lang_Hungarian_r1903.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: Feb. 15, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -268,7 +268,7 @@ Videó mód változtatás jóváhagyása? Játéklista cachelés (HDD) Értesítések engedélyezése %s betöltve %s-ből -Játék Menü +Options Játékbeállítások elmentve. %s beállítások eltávolítva Engedélyezéskor felülírja a létező játék kompatibilitási beállításokat. diff --git a/lng/lang_Indonesian_r1682.lng b/lng/lang_Indonesian_r1903.lng similarity index 97% rename from lng/lang_Indonesian_r1682.lng rename to lng/lang_Indonesian_r1903.lng index 4917da7e5..f1ce97afe 100644 --- a/lng/lang_Indonesian_r1682.lng +++ b/lng/lang_Indonesian_r1903.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: Feb. 12, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -268,7 +268,7 @@ Konfirmasi perubahan mode video? Daftar Tembolok Game(HDD) Izinkan Pemberitahuan %s dimuat dari %s -Menu Game +Options Pengaturan Game disimpan. %s setingan dihapus. Timpa pengaturan kompatibilitas game yang ada ketika diaktifkan. diff --git a/lng/lang_Italian_r1682.lng b/lng/lang_Italian_r1903.lng similarity index 97% rename from lng/lang_Italian_r1682.lng rename to lng/lang_Italian_r1903.lng index 0bafa0d71..0ab992891 100644 --- a/lng/lang_Italian_r1682.lng +++ b/lng/lang_Italian_r1903.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d and completed by Peppe90 -# Last update: May 10, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -268,7 +268,7 @@ Confermare la modifica della modalità video? Cache Lista Giochi (HDD) Abilita Notifiche %s caricato da %s -Menu Gioco +Options Impostazioni salvate. %s impostazioni rimosse. Se abilitato sovrascrive le impostazioni di compatibilità esistenti. diff --git a/lng/lang_Japanese_r1682.lng b/lng/lang_Japanese_r1903.lng similarity index 98% rename from lng/lang_Japanese_r1682.lng rename to lng/lang_Japanese_r1903.lng index 1309d811b..f865163f5 100644 --- a/lng/lang_Japanese_r1682.lng +++ b/lng/lang_Japanese_r1903.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: June 27, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -268,7 +268,7 @@ VMC %s ファイルは破損しています。 スロット %d のメモリカ ゲームリストをキャッシュ(HDD) 通知を有効にします %s から %s をロード -ゲームメニュー +Options ゲーム設定を保存しました %s 設定を削除しました 有効にすると、既存のゲーム互換性設定を上書きします diff --git a/lng/lang_Korean_r1682.lng b/lng/lang_Korean_r1903.lng similarity index 97% rename from lng/lang_Korean_r1682.lng rename to lng/lang_Korean_r1903.lng index 8250e81af..86e3bc8e5 100644 --- a/lng/lang_Korean_r1682.lng +++ b/lng/lang_Korean_r1903.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: April 18, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -268,7 +268,7 @@ VMC %s 파일이 조각화되었습니다. 슬롯 %d에서 메모리 카드를 캐쉬 게임 목록 (HDD) 알림 활성화 %s에서 %s을(를)로드했습니다. -게임 메뉴 +Options 게임 설정이 저장되었습니다. %s 설정이 제거되었습니다. 활성화되면 기존 게임 호환성 설정을 덮어 씁니다. diff --git a/lng/lang_Laotian_r1682.lng b/lng/lang_Laotian_r1903.lng similarity index 98% rename from lng/lang_Laotian_r1682.lng rename to lng/lang_Laotian_r1903.lng index 8f411b739..52a0da252 100644 --- a/lng/lang_Laotian_r1682.lng +++ b/lng/lang_Laotian_r1903.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: Feb. 11, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -268,7 +268,7 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s -Game Menu +Options Game settings saved. %s settings removed. Overwrites existing game compatibility settings when enabled. diff --git a/lng/lang_Persian_r1682.lng b/lng/lang_Persian_r1903.lng similarity index 98% rename from lng/lang_Persian_r1682.lng rename to lng/lang_Persian_r1903.lng index 8cc224151..32a91e300 100644 --- a/lng/lang_Persian_r1682.lng +++ b/lng/lang_Persian_r1903.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: Feb. 12, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s @@ -268,7 +268,7 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ )HDD( ﺎﻫ یزﺎﺑ ﺖﺳﺮﻬﻓ ﺶﻛ ﻰﻧﺎﺳﺭ ﻉﺎﻠﻃا ﻥﺩﺮﻛ ﻝﺎﻌﻓ ﺪﺷ ﻯﺭﺍﺬﮔ ﺭﺎﺑ %s زا %s -ﻯﺯﺎﺑ ﻮﻨﻣ +Options ﺪﺷ ﻩﺮﻴﺧﺫ ﻯﺯﺎﺑ ﺕﺎﻤﻴﻈﻨﺗ %s ﺪﺷ ﮎﺎﭘ %s ﺕﺎﻤﻴﻈﻨﺗ ﻥﺩﻮﺑ ﻝﺎﻌﻓ ﻢﺎﮕﻨﻫ ﻯﺯﺎﺑ ﺎﺑ ﺭﺎﮔﺯﺎﺳ ﺕﺎﻤﻴﻈﻨﺗ ﻰﺴﻳﻮﻧ ﻭﺭ diff --git a/lng/lang_Polish_r1682.lng b/lng/lang_Polish_r1903.lng similarity index 97% rename from lng/lang_Polish_r1682.lng rename to lng/lang_Polish_r1903.lng index 6fc288bd9..2f39594bd 100644 --- a/lng/lang_Polish_r1682.lng +++ b/lng/lang_Polish_r1903.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: April 18, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -268,7 +268,7 @@ Potwierdasz zmianę rozdzielczości? Buforowanie Listy Gier (HDD) Powiadomienia %s załadowany z %s -Menu Gry +Options Ustawienia gry zostały zapisane. %s ustawienia zostały usunięte. Po włączeniu nadpisuje istniejące ustawienia kompatybilności z grami. diff --git a/lng/lang_Portuguese_BR_r1682.lng b/lng/lang_Portuguese_BR_r1903.lng similarity index 97% rename from lng/lang_Portuguese_BR_r1682.lng rename to lng/lang_Portuguese_BR_r1903.lng index 403ebaa7b..fde394863 100644 --- a/lng/lang_Portuguese_BR_r1682.lng +++ b/lng/lang_Portuguese_BR_r1903.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Feb. 13, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -268,7 +268,7 @@ Confirmar alteração do modo de vídeo? Cache da lista de jogos (HD) Ativar notificações %s carregado de %s -Menu do Jogo +Options Configurações do jogo salvas. %s configurações removidas. Substitui as configurações de compatibilidade de jogos existentes quando ativada. diff --git a/lng/lang_Portuguese_r1682.lng b/lng/lang_Portuguese_r1903.lng similarity index 97% rename from lng/lang_Portuguese_r1682.lng rename to lng/lang_Portuguese_r1903.lng index 5d3bd47b4..781618f5f 100644 --- a/lng/lang_Portuguese_r1682.lng +++ b/lng/lang_Portuguese_r1903.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: Feb. 12, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -268,7 +268,7 @@ Confirmar alteração do modo de vídeo? Cache da lista de jogos (HDD) Ativar notificações %s carregado de %s -Menu de Jogo +Options Configurações do jogo guardadas. %s configurações removidas. Substitui configurações de compatibilidade de jogos existentes quando ativado. diff --git a/lng/lang_Romanian_r1682.lng b/lng/lang_Romanian_r1903.lng similarity index 97% rename from lng/lang_Romanian_r1682.lng rename to lng/lang_Romanian_r1903.lng index 32dc77671..7b8e33399 100644 --- a/lng/lang_Romanian_r1682.lng +++ b/lng/lang_Romanian_r1903.lng @@ -1,6 +1,6 @@ # Romanian translation by MRAdyy -# Last update: Feb. 11, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Romanian Open PS2 Loader %s @@ -268,7 +268,7 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s -Game Menu +Options Game settings saved. %s settings removed. Overwrites existing game compatibility settings when enabled. diff --git a/lng/lang_Russian_r1682.lng b/lng/lang_Russian_r1903.lng similarity index 98% rename from lng/lang_Russian_r1682.lng rename to lng/lang_Russian_r1903.lng index 39edd61ad..ccf124094 100644 --- a/lng/lang_Russian_r1682.lng +++ b/lng/lang_Russian_r1903.lng @@ -1,6 +1,6 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: Feb. 13, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -268,7 +268,7 @@ Bluetooth-адаптер может плохо работать с контро Кэширование списка игр (HDD) Показывать уведомления %s загружено из %s -Меню игры +Options Настройки игры сохранены. %s настройки удалены. Перезапись существующих настроек совместимости игр, если вкл. diff --git a/lng/lang_SChinese_r1682.lng b/lng/lang_SChinese_r1903.lng similarity index 96% rename from lng/lang_SChinese_r1682.lng rename to lng/lang_SChinese_r1903.lng index 698f7bbd9..7e4896434 100644 --- a/lng/lang_SChinese_r1682.lng +++ b/lng/lang_SChinese_r1903.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Feb. 11, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese OPL %s @@ -268,7 +268,7 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 缓存游戏列表 (硬盘) 启用通知 %s 从 %s加载 -游戏菜单 +Options 游戏设置已保存。 %s设置已删除。 启用时覆盖现有的游戏兼容性设置。 diff --git a/lng/lang_Spanish_r1682.lng b/lng/lang_Spanish_r1903.lng similarity index 97% rename from lng/lang_Spanish_r1682.lng rename to lng/lang_Spanish_r1903.lng index 6ba4fc698..a9837d5bf 100644 --- a/lng/lang_Spanish_r1682.lng +++ b/lng/lang_Spanish_r1903.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: Feb. 14, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -268,7 +268,7 @@ Confirma cambiar modo de video? Cachè de lista de juegos (HDD) Activar notificaciones %s cargado desde %s -Menú de Juegos +Options Configuración de juego guardada %s configuraciones eliminadas. Sobrescribe la configuración de compatibilidad de juego cuando está habilitado diff --git a/lng/lang_Swedish_r1682.lng b/lng/lang_Swedish_r1903.lng similarity index 97% rename from lng/lang_Swedish_r1682.lng rename to lng/lang_Swedish_r1903.lng index b3110c986..80ebbe80b 100644 --- a/lng/lang_Swedish_r1682.lng +++ b/lng/lang_Swedish_r1903.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: Feb. 12, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -268,7 +268,7 @@ Bekräfta ändring av videoläge? Lägg Spellista i Cache (HDD) Aktivera notifikationer %s Laddat från %s -SpelMeny +Options Spelinställningar sparade. %s inställningar borttagna Skriver över befintliga spelinställningar om aktiverad. diff --git a/lng/lang_TChinese_r1682.lng b/lng/lang_TChinese_r1903.lng similarity index 96% rename from lng/lang_TChinese_r1682.lng rename to lng/lang_TChinese_r1903.lng index 6dc2cd9f4..43648142a 100644 --- a/lng/lang_TChinese_r1682.lng +++ b/lng/lang_TChinese_r1903.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: April 18, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -268,7 +268,7 @@ vmc %s 文件碎片化.是否繼續使用插槽 %d 中的記憶卡? 緩存遊戲列表 (硬碟) 啟用通知 %s 從 %s 載入 -遊戲菜單 +Options 遊戲設置已保存。 %s 設置已刪除。 啟用時覆蓋現有的遊戲兼容性設置。 diff --git a/lng/lang_Turkish_r1682.lng b/lng/lang_Turkish_r1903.lng similarity index 97% rename from lng/lang_Turkish_r1682.lng rename to lng/lang_Turkish_r1903.lng index e64125f90..5ee50c7de 100644 --- a/lng/lang_Turkish_r1682.lng +++ b/lng/lang_Turkish_r1903.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: May 10, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -268,7 +268,7 @@ Video çıkış modu değiştirilsin mi? Oyun listesini cachele (HDD) Bildirimleri aktifleştir %s yüklendi %s konumundan -Oyun Menüsü +Options Oyun ayarları kaydedildi. %s ayarları silindi. Aktifleştirildiğinde varolan oyun uyumluluk ayarlarının üzerine yazar. diff --git a/lng/lang_Vietnamese_r1682.lng b/lng/lang_Vietnamese_r1903.lng similarity index 97% rename from lng/lang_Vietnamese_r1682.lng rename to lng/lang_Vietnamese_r1903.lng index 66ed4c60c..f763df2a3 100644 --- a/lng/lang_Vietnamese_r1682.lng +++ b/lng/lang_Vietnamese_r1903.lng @@ -1,6 +1,6 @@ # Translation by zidane89 -# Last update: Feb. 11, 2020 -# Updated for OPL_1682_DB-TA_all-5bf829f-2020-02-11 and OPL_OPL_1436_ifcaro_beta_all-f8ba412-2020-01-27 +# Last update: Jan. 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese OPL %s @@ -268,7 +268,7 @@ Thay đổi chế độ video? Cache danh sách trò chơi (HDD) Enable Notifications %s loaded from %s -Game Menu +Options Game settings saved. %s settings removed. Overwrites existing game compatibility settings when enabled. From 66ca5aff57f4f6030a7d7651c4a8e7b949163cd2 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 13 Jan 2021 09:20:37 -0800 Subject: [PATCH 221/269] update lang files --- lng/lang_Arabic_r1903.lng | 6 +- lng/lang_Bulgarian_r1903.lng | 2 +- lng/lang_Croatian_r1903.lng | 2 +- lng/lang_Czech_r1903.lng | 2 +- lng/lang_Danish_r1903.lng | 2 +- lng/lang_Dutch_r1903.lng | 2 +- lng/lang_Filipino_r1903.lng | 140 +++++++++++++++---------------- lng/lang_French_r1903.lng | 2 +- lng/lang_German_r1903.lng | 6 +- lng/lang_Greek_r1903.lng | 2 +- lng/lang_Hungarian_r1903.lng | 2 +- lng/lang_Indonesian_r1903.lng | 2 +- lng/lang_Italian_r1903.lng | 2 +- lng/lang_Japanese_r1903.lng | 2 +- lng/lang_Korean_r1903.lng | 2 +- lng/lang_Laotian_r1903.lng | 2 +- lng/lang_Persian_r1903.lng | 6 +- lng/lang_Polish_r1903.lng | 2 +- lng/lang_Portuguese_BR_r1903.lng | 6 +- lng/lang_Portuguese_r1903.lng | 6 +- lng/lang_Romanian_r1903.lng | 2 +- lng/lang_Russian_r1903.lng | 2 +- lng/lang_SChinese_r1903.lng | 2 +- lng/lang_Spanish_r1903.lng | 2 +- lng/lang_Swedish_r1903.lng | 6 +- lng/lang_TChinese_r1903.lng | 2 +- lng/lang_Turkish_r1903.lng | 2 +- lng/lang_Vietnamese_r1903.lng | 2 +- 28 files changed, 109 insertions(+), 109 deletions(-) diff --git a/lng/lang_Arabic_r1903.lng b/lng/lang_Arabic_r1903.lng index eabcfdce6..c77f3f102 100644 --- a/lng/lang_Arabic_r1903.lng +++ b/lng/lang_Arabic_r1903.lng @@ -1,5 +1,5 @@ # translation by alimadhi -# Last update: Jan. 10, 2021 +# Last update: Jan. 13, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic @@ -268,7 +268,7 @@ d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞ (HDD) ﺖﻗﺆﻤﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺏﺎﻌﻟﺃ ﺔﻤﺋﺎﻗ ﺕﺍﺭﺎﻌﺷﻹﺍ ﻦﻴﻜﻤﺗ s% ﻦﻣ ﻞﻤﺤﻣ s% -Options +ﺕﺍﺭﺎﻴﺨﻟﺍ .ﺔﺒﻌﻠﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﻆﻔﺣ ﻢﺗ .ﺕﺍﺩﺍﺪﻋﻹﺍ ﺔﻟﺍﺯﺇ ﺖﻤﺗ %s .ﻦﻴﻜﻤﺘﻟﺍ ﺪﻨﻋ ﺔﻴﻟﺎﺤﻟﺍ ﺔﺒﻌﻠﻟﺍ ﻖﻓﺍﻮﺗ ﺕﺍﺩﺍﺪﻋﺇ ﻕﻮﻓ ﺔﺑﺎﺘﻜﻟﺍ @@ -290,5 +290,5 @@ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ .ﻒﻠﻤﻟﺍ ﺔﻴﻤﺴﺗ ﺓﺩﺎﻋﺇ ﺀﺎﻨﺛﺃ ﺄﻄﺧ ﺙﺪﺣ .ﻒﻠﻤﻟﺍ ﻑﺬﺣ ﺀﺎﻨﺛﺃ ﺄﻄﺧ ﺙﺪﺣ :ﻦﻣ ﺎًﻧﺎﺠﻣ ﻪﻴﻠﻋ ﻞﺼﺣﺍ ، ﺎًﻘﻠﻄﻣ (OPL) OPEN-PS2-LOADER ﻱﺮﺘﺸﺗ ﻻ -psx-scene.com ﺪﻨﻋ ﺓﺩﻮﺟﻮﻤﻟﺍ ﺔﺨﺴﻨﻟﺍ OPL ifcaro +psx-place.com ﺪﻨﻋ ﺓﺩﻮﺟﻮﻤﻟﺍ ﺔﺨﺴﻨﻟﺍ OPL ifcaro ps2-home.com ﺪﻨﻋ ﺓﺩﻮﺟﻮﻤﻟﺍ ﺔﺨﺴﻨﻟﺍ (DB) Builds Daily OPL diff --git a/lng/lang_Bulgarian_r1903.lng b/lng/lang_Bulgarian_r1903.lng index 380d6c41a..b36b9604d 100644 --- a/lng/lang_Bulgarian_r1903.lng +++ b/lng/lang_Bulgarian_r1903.lng @@ -290,5 +290,5 @@ VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Croatian_r1903.lng b/lng/lang_Croatian_r1903.lng index e2b1a39c9..8c4cbbe19 100644 --- a/lng/lang_Croatian_r1903.lng +++ b/lng/lang_Croatian_r1903.lng @@ -290,5 +290,5 @@ VCD datoteka '%s' nije pronadena! Greska se pojavila dok se preimenovala datoteka. Greska se pojavila dok se brisala datoteka. Nikada ne kupujte OPEN-PS2-LOADER (OPL), umjesto toga ga nabavite besplatno na: -ifcaro OPL verzija na psx-scene.com +ifcaro OPL verzija na psx-place.com OPL Daily Builds (DB) verzija na ps2-home.com diff --git a/lng/lang_Czech_r1903.lng b/lng/lang_Czech_r1903.lng index 6cbe936ed..cab50bbe3 100644 --- a/lng/lang_Czech_r1903.lng +++ b/lng/lang_Czech_r1903.lng @@ -290,5 +290,5 @@ VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Danish_r1903.lng b/lng/lang_Danish_r1903.lng index 1cd90defc..3de6f3e0a 100644 --- a/lng/lang_Danish_r1903.lng +++ b/lng/lang_Danish_r1903.lng @@ -290,5 +290,5 @@ VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Dutch_r1903.lng b/lng/lang_Dutch_r1903.lng index 0b8097b7c..2a22eafc4 100644 --- a/lng/lang_Dutch_r1903.lng +++ b/lng/lang_Dutch_r1903.lng @@ -290,5 +290,5 @@ VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Filipino_r1903.lng b/lng/lang_Filipino_r1903.lng index b1c1f72b6..fd8129cf9 100644 --- a/lng/lang_Filipino_r1903.lng +++ b/lng/lang_Filipino_r1903.lng @@ -1,5 +1,5 @@ -# Translation by Ceed Lorenzo -# Last update: Jan. 10, 2021 +# Translation by Ceed Lorenzo and Colton SIlva @ColtonSilvaonKnoxKontor +# Last update: Jan. 13, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino @@ -7,10 +7,10 @@ OPL %s I-save ang mga pagbabago Likod Network Settings -Advanced options +Advanced na opsyon Settings saved to %s -Error sa pagsulat setting ! +Error sa pagsulat ng setting! Lumabas Settings Menu @@ -18,44 +18,44 @@ USB Laro HDD Laro ETH Laro Apps -tema -wika -The system will be powered off. -Exit to Browser? -Cancel updating? -%d: HardDisk Drive not detected -%d: HardDisk Drive not formatted +Tema +Wika +I-popower off ang system?. +Lumabas sa Browser? +Kanselahin ang pag-update? +%d: Hindi na-detect ang HardDisk Drive +%d: Hindi naka-format ang HardDisk Drive %d: Network startup error -%d: No network adaptor detected +%d: Walang ma-detect na network adaptor %d: Hindi makakonekta sa SMB server %d: Hindi makapag-log in sa SMB server %d: Hindi mabuksan ang SMB ibahagi %d: Cannot list SMB shares %d: Cannot list games -%d: DHCP server unavailable -%d: No network connection +%d: Hindi available ang DHCP server +%d: Walang koneksyon sa network Sa Mula sa Ayos -Select -Cancel +Piliin +Kansel Circle Cross -Games List +Listahan Game Settings Remove Settings Inalis ang lahat ng mga pindutan para sa mga laro -i-scroll +I-scroll Mabagal -medium -mabilis -default na menu +Medium +Mabilis +Default na menu Mag-load mula sa disc Mangyaring maghintay Nagkaroon ng error habang naglo-load ang ID ng Laro Awtomatikong pag-uuri Error sa paglo-load ng file wika -Huwag paganahin ang mga Kulay Debug +Huwag paganahin ang mga Kulay ng Debug Controller Walang natukoy na , naghihintay... Paganahin ang Cover Art Malapad na screen @@ -68,19 +68,19 @@ USB aparato simula mode HDD aparato simula mode ETH aparato simula mode Mga application na simulan ang mode -auto -manwal -Start HDL Server +Awto +Manwal +I-sart ang HDL Server HDL Server Starting... HDL Server Running... -Failed to start HDL Server. +Bigong i- start ang HDL Server. HDL Server Unloading... Lumabas sa kulay ng background kulay ng teksto - PS2 - - SMB Server - -IP address type +uri ng IP address Static DHCP IP address @@ -89,26 +89,26 @@ Mask Gateway DNS Server Port -magbahagi -gumagamit +Magbahagi +Gumagamit Password - + Address type IP NetBIOS -tanggapin +Tanggapin Item ay permanenteng tatanggalin, magpatuloy? Rename Alisin Tumakbo Ipakita ang mga setting -Enable write operations +I-enable ang write operations Check USB game fragmentation Tandaan ang huling play ng laro Select button -Error, the game is fragmented +Error, fragmented ang laro Error, hindi maaaring tumakbo ang item -Test Changes +Subukan Iwanang walang laman para sa Guest auth . Accurate Reads Synchronous Mode @@ -128,22 +128,22 @@ gumamit ng generic I-configure ang VMC Pangalan Laki -katayuan -pag-unlad -VMC file umiiral +Katayuan +Pag-unlad +Umiiral ang VMC file Di-wastong VMC file , laki ay hindi tama VMC file na kailangan upang malikha Error accessing VMC %s. Continue with the Memory Card in slot %d? Awtomatikong i-refresh -tungkol sa +Tungkol sa Coders Quality Assurance -USB prefix landas +USB prefix path Boots Custom ELF after an IGR -Halaga sa (mga) minuto, 0 upang huwag paganahin iikot pababa +Value sa (mga) minuto, 0 upang huwag paganahin Awtomatikong HDD paikutin pababa Video mode -dialog ng kulay +Dialog ng kulay Piniling kulay Reset Colors Impo @@ -169,8 +169,8 @@ Mode 5 Mode 6 Mode 7 Mode 8 -Configure GSM -Ethernet bilis at duplex setting +I-configure ang GSM +Ethernet speed at duplex setting 100Mbit Full-duplex 100Mbit Half-duplex 10Mbit Full-duplex @@ -189,42 +189,42 @@ Overscan adjustment. FMV Skip Skips full motion videos. Cheat Settings -Enable PS2RD Cheat Engine +I-enable ang PS2RD Cheat Engine Allow PS2RD Cheat Engine to patch your game. PS2RD Cheat Engine Mode Auto select or select game cheats. Auto Select Cheats Select Game Cheats -Error: failed to load cheat file. +Error: Bigong i-load Cheat File No cheats found. Download Defaults Network Update Overwrite Existing Records Update failed. -Failed to connect to update server. +Bigong kumonekta sa update server. Update completed. Update canceled. -Download settings from the network? +I-download ang settings mula sa network? Customized Settings Downloaded Defaults Auto start in %i s... Auto Start -Value in second(s), 0 to disable auto start. +Value sa segundo, 0 para i-disable auto start PS2 Logo Displayed for a valid disc logo matching the console's region. -Configure PADEMU +I-configure ang PADEMU Pad Emulator Settings -Enable Pad Emulator +I-enable ang PadEmulator Turns On/Off Pad Emulator for selected game. -Pad Emulator Mode +mode ng Pad Emulator Select Pad Emulator mode. DualShock3/4 USB DualShock3/4 BT -Settings For Port: +Settings para sa port: Select Pad Emulator port for settings. -Enable Emulation +I-enable emulation Turns on/off Pad Emulator for selected port. -Enable Vibration +I-enable vibration Turns on/off vibration for Pad Emulator selected port. USB Bluetooth Adapter MAC Address: DS Controller Paired To MAC Address: @@ -232,16 +232,16 @@ Pair Pair DS Controller Pair DS controller with Bluetooth adapter MAC address. Not Connected -Bluetooth Adapter Information -Shows more information and supported features. +Impormasyon ng Bluetooth adapter +Ipakita ang impormation at supported features HCI Version: LMP Version: Manufacturer ID: Supported Features: Yes No -Bluetooth adapter should be fully compatible with DS3/DS4 controllers. -Bluetooth adapter may not work correctly with DS3/DS4 controllers. +Ang Bluetooth adapter ay daapat suportado ng DS3/DS4 controllers. +Ang Bluetooth adapter ay maaring hindi gumana sa DS3/DS4 controllers. Enable Multitap Emulation Turns on/off Multitap emulation for selected game. Multitap Emulator On Port: @@ -260,29 +260,29 @@ Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? Audio Settings -Enable Sound Effects -Enable Boot Sound +I-enable Sound Effects +I-enable Boot Sound Sound Effects Volume Boot Sound Volume -Confirm video mode change? +Kumpirmahin "video mode change"? Cache Game List (HDD) Enable Notifications %s loaded from %s Options -Game settings saved. -%s settings removed. +Nai-save "Game settings". +%s settings ay nai-alis. Overwrites existing game compatibility settings when enabled. Settings Mode Global Per Game -All -Select settings to remove. +Lahat +Piliin ang settings para alisin. Support Forums: -Title +Pamagat Genre -Release -Developer -Description +Nai-eelease +Debeloper +Deskripsyon PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! @@ -290,5 +290,5 @@ VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_French_r1903.lng b/lng/lang_French_r1903.lng index 75fa3f48f..50b3d7a9a 100644 --- a/lng/lang_French_r1903.lng +++ b/lng/lang_French_r1903.lng @@ -290,5 +290,5 @@ Fichier VCD '%s' non trouvé! Une erreur s'est produite lors du renommage du fichier. Une erreur s'est produite lors de la suppression du fichier. N'achetez jamais OPEN-PS2-LOADER (OPL), obtenez le gratuitement: -version ifcaro OPL sur psx-scene.com +version ifcaro OPL sur psx-place.com version OPL Daily Builds (DB) sur ps2-home.com diff --git a/lng/lang_German_r1903.lng b/lng/lang_German_r1903.lng index 79a3a1654..f42b1b673 100644 --- a/lng/lang_German_r1903.lng +++ b/lng/lang_German_r1903.lng @@ -1,5 +1,5 @@ # German Translation by ps2guy and LopoTRI -# Last update: Jan. 10, 2021 +# Last update: Jan. 13, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German @@ -268,7 +268,7 @@ Lautstärke Startsound Spieleliste zwischenspeichern (HDD) Benachrichtigungen Einschalten %s geladen von %s -Options +Optionen Spiel-Einstellungen gespeichert. %s Einstellungen entfernt. Wenn angewählt, werden existierende Spiel-Kompatibilitäts-Einstellungen überschrieben. @@ -290,5 +290,5 @@ VCD Datei '%s' nicht gefunden! Fehler beim umbenennen der Datei. Fehler beim löschen der Datei. Niemals OPEN-PS2-LOADER (OPL) kaufen, sondern frei erhältlich bei: -ifcaro OPL version bei psx-scene.com +ifcaro OPL version bei psx-place.com OPL Daily Builds (DB) version bei ps2-home.com diff --git a/lng/lang_Greek_r1903.lng b/lng/lang_Greek_r1903.lng index ed527bceb..85920ba0b 100644 --- a/lng/lang_Greek_r1903.lng +++ b/lng/lang_Greek_r1903.lng @@ -290,5 +290,5 @@ Forum Υποστήριξης: Παρουσιάστηκε σφάλμα κατά τη μετονομασία του αρχείου. Παρουσιάστηκε σφάλμα κατά τη διαγραφή του αρχείου. Ποτέ μην αγοράζετε το OPEN-PS2-LOADER (OPL), αντί αυτού αποκτήστε το δωρεάν: -Έκδοση OPL του ifcaro στο psx-scene.com +Έκδοση OPL του ifcaro στο psx-place.com Έκδοση OPL Daily Builds (DB) στο ps2-home.com diff --git a/lng/lang_Hungarian_r1903.lng b/lng/lang_Hungarian_r1903.lng index 2de16376a..eeed35b0b 100644 --- a/lng/lang_Hungarian_r1903.lng +++ b/lng/lang_Hungarian_r1903.lng @@ -290,5 +290,5 @@ VCD fájl '%s' nem található! A fájl átnevezésénél hiba történt. A fájl törlésénél hiba történt. Soha ne vásárold meg az OPEN-PS2-LOADER (OPL)-t, ehelyett szerezd meg itt: -ifcaro OPL verzió a psx-scene.com oldalon +ifcaro OPL verzió a psx-place.com oldalon OPL Daily Builds (DB) verzió a ps2-home.com oldalon diff --git a/lng/lang_Indonesian_r1903.lng b/lng/lang_Indonesian_r1903.lng index f1ce97afe..3831df7ae 100644 --- a/lng/lang_Indonesian_r1903.lng +++ b/lng/lang_Indonesian_r1903.lng @@ -290,5 +290,5 @@ berkas VCD'%s' tak ada! Terjadi kesalahan mengubah nama berkas. Terjadi kesalahan menghapus berkas. Jangan pernah membeli OPEN-PS2-LOADER (OPL), dapatkan secara gratis : -versi OPL ifcaro pada psx-scene.com +versi OPL ifcaro pada psx-place.com Versi OPL Daily Builds (DB) di ps2-home.com diff --git a/lng/lang_Italian_r1903.lng b/lng/lang_Italian_r1903.lng index 0ab992891..2ae318050 100644 --- a/lng/lang_Italian_r1903.lng +++ b/lng/lang_Italian_r1903.lng @@ -290,5 +290,5 @@ VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Japanese_r1903.lng b/lng/lang_Japanese_r1903.lng index f865163f5..bb810276d 100644 --- a/lng/lang_Japanese_r1903.lng +++ b/lng/lang_Japanese_r1903.lng @@ -290,5 +290,5 @@ VCDファイル '%s'が見つかりません! ファイルの名前変更中にエラーが発生しました ファイルの削除中にエラーが発生しました OPEN-PS2-LOADER(OPL)を決して購入しないで、無料で入手してください -psx-scene.comでのifcaro OPLバージョン +psx-place.comでのifcaro OPLバージョン ps2-home.comでのOPLデイリービルド(DB)バージョン diff --git a/lng/lang_Korean_r1903.lng b/lng/lang_Korean_r1903.lng index 86e3bc8e5..4e6e17845 100644 --- a/lng/lang_Korean_r1903.lng +++ b/lng/lang_Korean_r1903.lng @@ -290,5 +290,5 @@ VCD 파일 '%s' 을(를) 찾을 수 없습니다! 파일 이름을 바꾸는 중 오류가 발생했습니다. 파일을 삭제하는 중 오류가 발생했습니다. OPEN-PS2-LOADER (OPL)를 구입하지 말고 무료로 받으세요.: -psx-scene.com에서 ifcaro OPL 버전 +psx-place.com에서 ifcaro OPL 버전 ps2-home.com에서 OPL Daily Builds (DB) 버전 diff --git a/lng/lang_Laotian_r1903.lng b/lng/lang_Laotian_r1903.lng index 52a0da252..e93642eb6 100644 --- a/lng/lang_Laotian_r1903.lng +++ b/lng/lang_Laotian_r1903.lng @@ -290,5 +290,5 @@ VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Persian_r1903.lng b/lng/lang_Persian_r1903.lng index 32a91e300..8172701f5 100644 --- a/lng/lang_Persian_r1903.lng +++ b/lng/lang_Persian_r1903.lng @@ -1,5 +1,5 @@ # Translation by saeid0035 -# Last update: Jan. 10, 2021 +# Last update: Jan. 13, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian @@ -268,7 +268,7 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ )HDD( ﺎﻫ یزﺎﺑ ﺖﺳﺮﻬﻓ ﺶﻛ ﻰﻧﺎﺳﺭ ﻉﺎﻠﻃا ﻥﺩﺮﻛ ﻝﺎﻌﻓ ﺪﺷ ﻯﺭﺍﺬﮔ ﺭﺎﺑ %s زا %s -Options +ﺎﻫ ﻪﻨﯾﺰﮔ ﺪﺷ ﻩﺮﻴﺧﺫ ﻯﺯﺎﺑ ﺕﺎﻤﻴﻈﻨﺗ %s ﺪﺷ ﮎﺎﭘ %s ﺕﺎﻤﻴﻈﻨﺗ ﻥﺩﻮﺑ ﻝﺎﻌﻓ ﻢﺎﮕﻨﻫ ﻯﺯﺎﺑ ﺎﺑ ﺭﺎﮔﺯﺎﺳ ﺕﺎﻤﻴﻈﻨﺗ ﻰﺴﻳﻮﻧ ﻭﺭ @@ -290,5 +290,5 @@ Options .هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ﻞﻳﺎﻓ مﺎﻧ ﺮﻴﻴﻐﺗ مﺎﮕﻨﻫ رد .هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ﻞﻳﺎﻓ ندﺮﻛ کﺎﭘ مﺎﮕﻨﻫ رد :ﺪﻴﻨﻛ ﺖﻓﺎﻳرد نﺎﮕﻳار ار نآ ضﻮﻋ رد ,ﺪﻳﺮﺨﻧ ار )OPL( OPEN-PS2-LOADER ﺰﮔﺮﻫ -psx-scene.com رد OPL oracfi ی ﻪﺨﺴﻧ +psx-place.com رد OPL oracfi ی ﻪﺨﺴﻧ ps2-home.com رد )DB( OPL ﻪﻧازور ﺖﺧﺎﺳ ی ﻪﺨﺴﻧ diff --git a/lng/lang_Polish_r1903.lng b/lng/lang_Polish_r1903.lng index 2f39594bd..7ff79967e 100644 --- a/lng/lang_Polish_r1903.lng +++ b/lng/lang_Polish_r1903.lng @@ -290,5 +290,5 @@ VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Portuguese_BR_r1903.lng b/lng/lang_Portuguese_BR_r1903.lng index fde394863..8dacca709 100644 --- a/lng/lang_Portuguese_BR_r1903.lng +++ b/lng/lang_Portuguese_BR_r1903.lng @@ -1,5 +1,5 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Jan. 10, 2021 +# Last update: Jan. 13, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese @@ -268,7 +268,7 @@ Confirmar alteração do modo de vídeo? Cache da lista de jogos (HD) Ativar notificações %s carregado de %s -Options +Opções Configurações do jogo salvas. %s configurações removidas. Substitui as configurações de compatibilidade de jogos existentes quando ativada. @@ -290,5 +290,5 @@ O arquivo VCD '%s' não foi encontrado! Ocorreu um erro ao renomear o arquivo. Ocorreu um erro ao excluir o arquivo. Nunca compre OPEN-PS2-LOADER (OPL), baixe grátis em: -psx-scene.com, OPL versão ifcaro +psx-place.com, OPL versão ifcaro ps2-home.com, OPL versão Daily Builds (DB) diff --git a/lng/lang_Portuguese_r1903.lng b/lng/lang_Portuguese_r1903.lng index 781618f5f..aac9ba8ae 100644 --- a/lng/lang_Portuguese_r1903.lng +++ b/lng/lang_Portuguese_r1903.lng @@ -1,5 +1,5 @@ # Translation by danielb -# Last update: Jan. 10, 2021 +# Last update: Jan. 13, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese @@ -268,7 +268,7 @@ Confirmar alteração do modo de vídeo? Cache da lista de jogos (HDD) Ativar notificações %s carregado de %s -Options +Opções Configurações do jogo guardadas. %s configurações removidas. Substitui configurações de compatibilidade de jogos existentes quando ativado. @@ -290,5 +290,5 @@ Ficheiro VCD '%s' não encontrado! Ocorreu um erro ao renomear o ficheiro. Ocorreu um erro ao apagar o ficheiro Nunca compre o OPEN-PS2-LOADER (OPL), descarregue grátis em: -OPL versão ifcaro em psx-scene.com +OPL versão ifcaro em psx-place.com OPL versão Daily Builds (DB) em ps2-home.com diff --git a/lng/lang_Romanian_r1903.lng b/lng/lang_Romanian_r1903.lng index 7b8e33399..cb54e8bb0 100644 --- a/lng/lang_Romanian_r1903.lng +++ b/lng/lang_Romanian_r1903.lng @@ -290,5 +290,5 @@ VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Russian_r1903.lng b/lng/lang_Russian_r1903.lng index ccf124094..792a65325 100644 --- a/lng/lang_Russian_r1903.lng +++ b/lng/lang_Russian_r1903.lng @@ -290,5 +290,5 @@ VCD-файл '%s' не найден! Ошибка переименования файла. Ошибка при удалении файла. Не покупайте OPEN-PS2-LOADER (OPL), он бесплатный: -Версия ifcaro OPL - на psx-scene.com +Версия ifcaro OPL - на psx-place.com Версия OPL Daily Builds (DB) - на ps2-home.com diff --git a/lng/lang_SChinese_r1903.lng b/lng/lang_SChinese_r1903.lng index 7e4896434..7563c10db 100644 --- a/lng/lang_SChinese_r1903.lng +++ b/lng/lang_SChinese_r1903.lng @@ -290,5 +290,5 @@ VCD文件'%s'没有找到! 重命名文件时发生错误. 删除文件时发生错误. 永远不要购买OPEN-PS2-LOADER (OPL),而是免费获得: -ifcaro OPL 版本从psx-scene.com +ifcaro OPL 版本从psx-place.com OPL 日常开发版(DB)从ps2-home.com diff --git a/lng/lang_Spanish_r1903.lng b/lng/lang_Spanish_r1903.lng index a9837d5bf..7d572fa9e 100644 --- a/lng/lang_Spanish_r1903.lng +++ b/lng/lang_Spanish_r1903.lng @@ -290,5 +290,5 @@ No se encuentra el archivo VCD '%s'! Se produjo un error al cambiar el nombre del archivo. Se produjo un error al eliminar el archivo. Nunca compres OPEN-PS2-LOADER (OPL), descargalo gratis desde: -OPL Versión Ifcaro en psx-scene.com +OPL Versión Ifcaro en psx-place.com OPL Versión Daily Builds (DB) en ps2-home.com diff --git a/lng/lang_Swedish_r1903.lng b/lng/lang_Swedish_r1903.lng index 80ebbe80b..3c6f3d90e 100644 --- a/lng/lang_Swedish_r1903.lng +++ b/lng/lang_Swedish_r1903.lng @@ -1,5 +1,5 @@ # Translation by Lord_Flaya -# Last update: Jan. 10, 2021 +# Last update: Jan. 13, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish @@ -268,7 +268,7 @@ Bekräfta ändring av videoläge? Lägg Spellista i Cache (HDD) Aktivera notifikationer %s Laddat från %s -Options +Val Spelinställningar sparade. %s inställningar borttagna Skriver över befintliga spelinställningar om aktiverad. @@ -290,5 +290,5 @@ VCD fil '%s' saknas! Ett fel inträffade vid namnbyte. Ett fel inträffade vid radering. Köp aldrig OPEN-PS2-LOADER (OPL), det finns gratis här: -ifcaro OPL version @ psx-scene.com +ifcaro OPL version @ psx-place.com OPL Daily Builds (DB) version @ ps2-home.com diff --git a/lng/lang_TChinese_r1903.lng b/lng/lang_TChinese_r1903.lng index 43648142a..8ef266a13 100644 --- a/lng/lang_TChinese_r1903.lng +++ b/lng/lang_TChinese_r1903.lng @@ -290,5 +290,5 @@ VCD文件\'%s\'沒有找到! 重命名文件時發生錯誤. 刪除文件時發生錯誤. 永遠不要購買OPEN-PS2-LOADER (OPL),而是免費獲得: -ifcaro OPL 版本從psx-scene.com +ifcaro OPL 版本從psx-place.com OPL 日常開發版(DB)從ps2-home.com diff --git a/lng/lang_Turkish_r1903.lng b/lng/lang_Turkish_r1903.lng index 5ee50c7de..cd9c2ceba 100644 --- a/lng/lang_Turkish_r1903.lng +++ b/lng/lang_Turkish_r1903.lng @@ -290,5 +290,5 @@ VCD dosyası '%s' bulunamadı! Dosya yeniden adlandırılırken bir sorun çıktı. Dosya silinirken bir sorun çıktı. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Vietnamese_r1903.lng b/lng/lang_Vietnamese_r1903.lng index f763df2a3..54ba4b9a6 100644 --- a/lng/lang_Vietnamese_r1903.lng +++ b/lng/lang_Vietnamese_r1903.lng @@ -290,5 +290,5 @@ Tập tin VCD không thấy '%s' ! Xảy ra lỗi trong khi đổi tên tập tin. Đã xảy ra lỗi trong khi xóa tệp. Không bao giờ mua OPEN-PS2-LOADER (OPL), nó luôn miễn phí tại: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com From 07acbcd2a411f51d3c439a178eac6a5b08d600ba Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 22 Jan 2021 13:27:41 -0800 Subject: [PATCH 222/269] update lang files --- lng/lang_English.lng | 2 +- lng/lang_Filipino_r1903.lng | 156 ++++++++++++++++++------------------ 2 files changed, 79 insertions(+), 79 deletions(-) diff --git a/lng/lang_English.lng b/lng/lang_English.lng index fb66c635a..1176996d9 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -308,5 +308,5 @@ VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com +ifcaro OPL version at psx-place.com OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Filipino_r1903.lng b/lng/lang_Filipino_r1903.lng index fd8129cf9..15b6d3f90 100644 --- a/lng/lang_Filipino_r1903.lng +++ b/lng/lang_Filipino_r1903.lng @@ -1,5 +1,5 @@ # Translation by Ceed Lorenzo and Colton SIlva @ColtonSilvaonKnoxKontor -# Last update: Jan. 13, 2021 +# Last update: Jan. 22, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino @@ -20,7 +20,7 @@ ETH Laro Apps Tema Wika -I-popower off ang system?. +Ipa-power off ang system?. Lumabas sa Browser? Kanselahin ang pag-update? %d: Hindi na-detect ang HardDisk Drive @@ -30,8 +30,8 @@ Kanselahin ang pag-update? %d: Hindi makakonekta sa SMB server %d: Hindi makapag-log in sa SMB server %d: Hindi mabuksan ang SMB ibahagi -%d: Cannot list SMB shares -%d: Cannot list games +%d: Hindi mailista ang SMB Shares +%d: Hindi mailista ang mga laro %d: Hindi available ang DHCP server %d: Walang koneksyon sa network Sa @@ -42,8 +42,8 @@ Kansel Circle Cross Listahan -Game Settings -Remove Settings +Settings ng laro +Alisin ang Settings Inalis ang lahat ng mga pindutan para sa mga laro I-scroll Mabagal @@ -54,7 +54,7 @@ Mag-load mula sa disc Mangyaring maghintay Nagkaroon ng error habang naglo-load ang ID ng Laro Awtomatikong pag-uuri -Error sa paglo-load ng file wika +Error sa paglo-load ng file na wika Huwag paganahin ang mga Kulay ng Debug Controller Walang natukoy na , naghihintay... Paganahin ang Cover Art @@ -83,8 +83,8 @@ kulay ng teksto uri ng IP address Static DHCP -IP address -Address +Adres ng IP +Adres Mask Gateway DNS Server @@ -103,7 +103,7 @@ Alisin Tumakbo Ipakita ang mga setting I-enable ang write operations -Check USB game fragmentation +I-check ang USB game fragmentation Tandaan ang huling play ng laro Select button Error, fragmented ang laro @@ -111,16 +111,16 @@ Error, hindi maaaring tumakbo ang item Subukan Iwanang walang laman para sa Guest auth . Accurate Reads -Synchronous Mode -alisin sa pagkakakawit Syscalls +Synchronous na Mode +Alisin sa pagkakakawit ng Syscalls Skip Videos -Emulate DVD-DL -Disable IGR +I-emulate ang DVD-DL +I-disable ang IGR Unused Unused Ang pagbabago ng laki ay i-reformat ang VMC Lumikha -Start +Magsimula Baguhin May pagpapalaglag I-reset ang @@ -133,16 +133,16 @@ Pag-unlad Umiiral ang VMC file Di-wastong VMC file , laki ay hindi tama VMC file na kailangan upang malikha -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Bigong ma-access ang VMC %s. Magpatuloy gamit ang memory card ng PS2 sa slot %d? Awtomatikong i-refresh Tungkol sa -Coders +Mga coders Quality Assurance USB prefix path -Boots Custom ELF after an IGR +Ibo-boot ang Custom ELF pagtapos ng IGR Value sa (mga) minuto, 0 upang huwag paganahin -Awtomatikong HDD paikutin pababa -Video mode +Awtomatikong pababagalin ang HDD +Mode ng bidyo Dialog ng kulay Piniling kulay Reset Colors @@ -176,102 +176,102 @@ Ethernet speed at duplex setting 10Mbit Full-duplex 10Mbit Half-duplex GSM Mga Setting -paganahin GSM +paganahin ang GSM Toggles GSM On/Off. VMODE -Forced custom display mode. +Pwersahin ang Custom Display Mode H-POS -Horizontal adjustment. +Horizontal Adjustment V-POS -Vertical adjustment. +Vertical Adjustment Overscan -Overscan adjustment. +Overscan Adjustment FMV Skip -Skips full motion videos. -Cheat Settings +I-skip ang Full Motion Videos +Settings ng cheat I-enable ang PS2RD Cheat Engine -Allow PS2RD Cheat Engine to patch your game. +Ipa-patch ng PS2RD Cheat Engine ang iyong games PS2RD Cheat Engine Mode -Auto select or select game cheats. -Auto Select Cheats -Select Game Cheats -Error: Bigong i-load Cheat File -No cheats found. +Awto. pagpili or pagpili ng game cheats +Awto. pagpili ng cheats +Pagpili ng game cheats +Error: Bigong i-load ang Cheat File +Walang makitang Cheat Download Defaults -Network Update +I-update ang network Overwrite Existing Records -Update failed. +Bigong mag-update. Bigong kumonekta sa update server. -Update completed. -Update canceled. +Kumpletong na-update. +Nakansela ang pag-update. I-download ang settings mula sa network? Customized Settings Downloaded Defaults -Auto start in %i s... +Mag aawto-start ng %i s... Auto Start Value sa segundo, 0 para i-disable auto start PS2 Logo -Displayed for a valid disc logo matching the console's region. +Ididisplay ang valid disc logo kung tugma ito sa region na bersyon ng laro I-configure ang PADEMU Pad Emulator Settings I-enable ang PadEmulator -Turns On/Off Pad Emulator for selected game. -mode ng Pad Emulator -Select Pad Emulator mode. +Turns On/Off PadEmulator para sa piling laro. +Mode ng Pad Emulator +Pumili ng Pad Emulator mode. DualShock3/4 USB DualShock3/4 BT Settings para sa port: -Select Pad Emulator port for settings. -I-enable emulation -Turns on/off Pad Emulator for selected port. -I-enable vibration -Turns on/off vibration for Pad Emulator selected port. +Pumili ng Pad Emulator port para sa settings. +I-enable ang emulation +Turns on/off Pad Emulator para sa piling port. +I-enable ang vibration +Turns on/off vibration ng Pad Emulator para sa piling port. USB Bluetooth Adapter MAC Address: DS Controller Paired To MAC Address: -Pair -Pair DS Controller -Pair DS controller with Bluetooth adapter MAC address. -Not Connected +I-pair +I-pair ang DS Controller +I-pair ang DS Controller gamit ang bluetooth adapter mac address. +Walang koneksyon Impormasyon ng Bluetooth adapter Ipakita ang impormation at supported features -HCI Version: -LMP Version: +Bersyon ng HCI: +Bersyon ng LMP: Manufacturer ID: -Supported Features: -Yes -No +Suportadong mga features: +Opo +Hindi Ang Bluetooth adapter ay daapat suportado ng DS3/DS4 controllers. Ang Bluetooth adapter ay maaring hindi gumana sa DS3/DS4 controllers. -Enable Multitap Emulation -Turns on/off Multitap emulation for selected game. +I-enable ang Multitap emulation +Turns on/off Multitap emulation para sa piling game. Multitap Emulator On Port: -Select port for Multitap emulation. -Disable Fake DS3 Workaround -Some fake DS3s need workaround, this option will disable it. -Emulate FIELD Flipping -Fix for games that glitch under progressive video modes. -Parental Lock Settings +Pumili ng port para sa Multitap emulation. +I-disable ang workaround para sa pekeng ds3 +Ang ilang fake ds3s ay nangangailangan ng workaround, Maididisable ito ng opsyon na ito. +I-emulate ang FIELD flipping +Aayusin ang laro na may isyu ng glitch sa progressive video modes. +Settings ng Parental Lock Parental Lock Password -Leave blank to disable the parental lock. -Enter Parental Lock Password -Parental lock password incorrect. +Hayaang nakablangko para ma-disable ang parental lock. +I-enter ang Parental Lock Password +Ang Parental lock password ay mali. Parental lock disabled. -Build Options: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? -Audio Settings -I-enable Sound Effects -I-enable Boot Sound +Opsyon ng build: +Error - Hindi maaring gamitin ang password na ito. +VMC %s na file ay fragmented. Magpatuloy gamit ang Memory Card sa slot %d? +Settings ng Audio +I-enable ang Sound Effects +I-enable ang Boot Sound Sound Effects Volume Boot Sound Volume Kumpirmahin "video mode change"? Cache Game List (HDD) -Enable Notifications -%s loaded from %s -Options -Nai-save "Game settings". +I-enable ang Notifications +%s Naiload mula sa %s +Menu ng game +Nai-save ang "Game settings". %s settings ay nai-alis. -Overwrites existing game compatibility settings when enabled. +Io-overwrite ang nakairal na game compatibility settings kapag naka-enable. Settings Mode Global Per Game From f7e68e100a2d6ce004b15c628906070644f5e334 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 24 Jan 2021 20:33:17 -0800 Subject: [PATCH 223/269] update lang files --- lng/lang_Russian_r1903.lng | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lng/lang_Russian_r1903.lng b/lng/lang_Russian_r1903.lng index 792a65325..d9ad841f4 100644 --- a/lng/lang_Russian_r1903.lng +++ b/lng/lang_Russian_r1903.lng @@ -1,5 +1,5 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: Jan. 10, 2021 +# Last update: Jan. 15, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian @@ -268,7 +268,7 @@ Bluetooth-адаптер может плохо работать с контро Кэширование списка игр (HDD) Показывать уведомления %s загружено из %s -Options +Опции Настройки игры сохранены. %s настройки удалены. Перезапись существующих настроек совместимости игр, если вкл. From fc75b76b2e15c2a62840b7e5b4388f4fd94ea2bb Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 26 Jan 2021 13:25:38 -0800 Subject: [PATCH 224/269] update lang files --- lng/lang_Spanish_r1903.lng | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lng/lang_Spanish_r1903.lng b/lng/lang_Spanish_r1903.lng index 7d572fa9e..fb95d7843 100644 --- a/lng/lang_Spanish_r1903.lng +++ b/lng/lang_Spanish_r1903.lng @@ -1,5 +1,5 @@ # Translation by lauchon22 -# Last update: Jan. 10, 2021 +# Last update: Jan. 26, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -268,7 +268,7 @@ Confirma cambiar modo de video? Cachè de lista de juegos (HDD) Activar notificaciones %s cargado desde %s -Options +Opciones Configuración de juego guardada %s configuraciones eliminadas. Sobrescribe la configuración de compatibilidad de juego cuando está habilitado From 5abb5d33ab77e628787d849f6cdc8675e59acb1a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 1 Feb 2021 18:57:50 -0800 Subject: [PATCH 225/269] update lang files --- lng/{lang_Arabic_r1903.lng => lang_Arabic_r1922.lng} | 5 ++--- lng/{lang_Bulgarian_r1903.lng => lang_Bulgarian_r1922.lng} | 5 ++--- lng/{lang_Croatian_r1903.lng => lang_Croatian_r1922.lng} | 5 ++--- lng/{lang_Czech_r1903.lng => lang_Czech_r1922.lng} | 5 ++--- lng/{lang_Danish_r1903.lng => lang_Danish_r1922.lng} | 5 ++--- lng/{lang_Dutch_r1903.lng => lang_Dutch_r1922.lng} | 5 ++--- lng/lang_English.lng | 1 - lng/{lang_Filipino_r1903.lng => lang_Filipino_r1922.lng} | 5 ++--- lng/{lang_French_r1903.lng => lang_French_r1922.lng} | 5 ++--- lng/{lang_German_r1903.lng => lang_German_r1922.lng} | 5 ++--- lng/{lang_Greek_r1903.lng => lang_Greek_r1922.lng} | 5 ++--- lng/{lang_Hungarian_r1903.lng => lang_Hungarian_r1922.lng} | 5 ++--- lng/{lang_Indonesian_r1903.lng => lang_Indonesian_r1922.lng} | 5 ++--- lng/{lang_Italian_r1903.lng => lang_Italian_r1922.lng} | 5 ++--- lng/{lang_Japanese_r1903.lng => lang_Japanese_r1922.lng} | 5 ++--- lng/{lang_Korean_r1903.lng => lang_Korean_r1922.lng} | 5 ++--- lng/{lang_Laotian_r1903.lng => lang_Laotian_r1922.lng} | 5 ++--- lng/{lang_Persian_r1903.lng => lang_Persian_r1922.lng} | 5 ++--- lng/{lang_Polish_r1903.lng => lang_Polish_r1922.lng} | 5 ++--- ..._Portuguese_BR_r1903.lng => lang_Portuguese_BR_r1922.lng} | 5 ++--- lng/{lang_Portuguese_r1903.lng => lang_Portuguese_r1922.lng} | 5 ++--- lng/{lang_Romanian_r1903.lng => lang_Romanian_r1922.lng} | 5 ++--- lng/{lang_Russian_r1903.lng => lang_Russian_r1922.lng} | 5 ++--- lng/{lang_SChinese_r1903.lng => lang_SChinese_r1922.lng} | 5 ++--- lng/{lang_Spanish_r1903.lng => lang_Spanish_r1922.lng} | 5 ++--- lng/{lang_Swedish_r1903.lng => lang_Swedish_r1922.lng} | 5 ++--- lng/{lang_TChinese_r1903.lng => lang_TChinese_r1922.lng} | 5 ++--- lng/{lang_Turkish_r1903.lng => lang_Turkish_r1922.lng} | 5 ++--- lng/{lang_Vietnamese_r1903.lng => lang_Vietnamese_r1922.lng} | 5 ++--- src/lang.c | 2 +- 30 files changed, 57 insertions(+), 86 deletions(-) rename lng/{lang_Arabic_r1903.lng => lang_Arabic_r1922.lng} (98%) rename lng/{lang_Bulgarian_r1903.lng => lang_Bulgarian_r1922.lng} (98%) rename lng/{lang_Croatian_r1903.lng => lang_Croatian_r1922.lng} (97%) rename lng/{lang_Czech_r1903.lng => lang_Czech_r1922.lng} (96%) rename lng/{lang_Danish_r1903.lng => lang_Danish_r1922.lng} (96%) rename lng/{lang_Dutch_r1903.lng => lang_Dutch_r1922.lng} (97%) rename lng/{lang_Filipino_r1903.lng => lang_Filipino_r1922.lng} (97%) rename lng/{lang_French_r1903.lng => lang_French_r1922.lng} (97%) rename lng/{lang_German_r1903.lng => lang_German_r1922.lng} (97%) rename lng/{lang_Greek_r1903.lng => lang_Greek_r1922.lng} (98%) rename lng/{lang_Hungarian_r1903.lng => lang_Hungarian_r1922.lng} (97%) rename lng/{lang_Indonesian_r1903.lng => lang_Indonesian_r1922.lng} (97%) rename lng/{lang_Italian_r1903.lng => lang_Italian_r1922.lng} (97%) rename lng/{lang_Japanese_r1903.lng => lang_Japanese_r1922.lng} (97%) rename lng/{lang_Korean_r1903.lng => lang_Korean_r1922.lng} (97%) rename lng/{lang_Laotian_r1903.lng => lang_Laotian_r1922.lng} (98%) rename lng/{lang_Persian_r1903.lng => lang_Persian_r1922.lng} (98%) rename lng/{lang_Polish_r1903.lng => lang_Polish_r1922.lng} (97%) rename lng/{lang_Portuguese_BR_r1903.lng => lang_Portuguese_BR_r1922.lng} (97%) rename lng/{lang_Portuguese_r1903.lng => lang_Portuguese_r1922.lng} (97%) rename lng/{lang_Romanian_r1903.lng => lang_Romanian_r1922.lng} (96%) rename lng/{lang_Russian_r1903.lng => lang_Russian_r1922.lng} (98%) rename lng/{lang_SChinese_r1903.lng => lang_SChinese_r1922.lng} (96%) rename lng/{lang_Spanish_r1903.lng => lang_Spanish_r1922.lng} (97%) rename lng/{lang_Swedish_r1903.lng => lang_Swedish_r1922.lng} (96%) rename lng/{lang_TChinese_r1903.lng => lang_TChinese_r1922.lng} (96%) rename lng/{lang_Turkish_r1903.lng => lang_Turkish_r1922.lng} (96%) rename lng/{lang_Vietnamese_r1903.lng => lang_Vietnamese_r1922.lng} (97%) diff --git a/lng/lang_Arabic_r1903.lng b/lng/lang_Arabic_r1922.lng similarity index 98% rename from lng/lang_Arabic_r1903.lng rename to lng/lang_Arabic_r1922.lng index c77f3f102..5484a32d1 100644 --- a/lng/lang_Arabic_r1903.lng +++ b/lng/lang_Arabic_r1922.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: Jan. 13, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL @@ -103,7 +103,6 @@ IP ﻞﻴﻐﺸﺗ ﺽﺮﻌﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ ﺔﺑﺎﺘﻜﻟﺍ ﺕﺎﻴﻠﻤﻋ ﻦﻴﻜﻤﺗ -USB ﺏﺎﻌﻟﺍ ﺔﺋﺰﺠﺗ ﻦﻣ ﻖﻘﺤﺗ ﺎﻫﺭﺎﻴﺘﺧﺍ ﻢﺗ ﺔﺒﻌﻟ ﺮﺧﺁ ﺮﻛﺬﺗ ﺭﺰﻟﺍ ﺮﺘﺧﺍ ﺔﺋﺰﺠﻣ ﺔﺒﻌﻠﻟﺍ ،ﺄﻄﺧ diff --git a/lng/lang_Bulgarian_r1903.lng b/lng/lang_Bulgarian_r1922.lng similarity index 98% rename from lng/lang_Bulgarian_r1903.lng rename to lng/lang_Bulgarian_r1922.lng index b36b9604d..ad6398337 100644 --- a/lng/lang_Bulgarian_r1903.lng +++ b/lng/lang_Bulgarian_r1922.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -103,7 +103,6 @@ NetBIOS Старт Визуални настройки Изтриване и Преименуване -Проверка фрагментацията при USB Запомняне на последната игра Бутон за избор Грешка - играта е фрагментирана! diff --git a/lng/lang_Croatian_r1903.lng b/lng/lang_Croatian_r1922.lng similarity index 97% rename from lng/lang_Croatian_r1903.lng rename to lng/lang_Croatian_r1922.lng index 8c4cbbe19..85424a712 100644 --- a/lng/lang_Croatian_r1903.lng +++ b/lng/lang_Croatian_r1922.lng @@ -1,6 +1,6 @@ # Translation by Blacky5678 -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Croatian OPL %s @@ -103,7 +103,6 @@ Obrisi Pokreni Postavke Zaslona Omoguci Operacije Pisanja -Provjeri Fragmentaciju USB Igre Zapamti Zadnju Upaljenu Igru Tipka za Odabir Greska, igra je fragmentirana. diff --git a/lng/lang_Czech_r1903.lng b/lng/lang_Czech_r1922.lng similarity index 96% rename from lng/lang_Czech_r1903.lng rename to lng/lang_Czech_r1922.lng index cab50bbe3..707b9299f 100644 --- a/lng/lang_Czech_r1903.lng +++ b/lng/lang_Czech_r1922.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -103,7 +103,6 @@ Smazat Spustit Nastavení obrazovky Povolit zápisy -Zkontroluj fragmentaci na USB se hrou Pamatovat posledně hranou hru Tlačítko Select Chyba, hra je fragmentovaná diff --git a/lng/lang_Danish_r1903.lng b/lng/lang_Danish_r1922.lng similarity index 96% rename from lng/lang_Danish_r1903.lng rename to lng/lang_Danish_r1922.lng index 3de6f3e0a..2a210b4c9 100644 --- a/lng/lang_Danish_r1903.lng +++ b/lng/lang_Danish_r1922.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -103,7 +103,6 @@ Slet Kør Skærmindstillinger Aktivér skrive operationer -Kontrollér USB-spil fragmentering Husk sidst spillede spil Vælgeknap Fejl: spillet er fragmenteret diff --git a/lng/lang_Dutch_r1903.lng b/lng/lang_Dutch_r1922.lng similarity index 97% rename from lng/lang_Dutch_r1903.lng rename to lng/lang_Dutch_r1922.lng index 2a22eafc4..ea5d8c232 100644 --- a/lng/lang_Dutch_r1903.lng +++ b/lng/lang_Dutch_r1922.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -103,7 +103,6 @@ Verwijder Uitvoeren Beeldinstellingen Schrijftaken inschakelen -Check USB-spel fragmentatie Herinner laatst gespeelde spel Selecteerknop Foutmelding, het spel is gefragmenteerd diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 1176996d9..186bf060d 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -121,7 +121,6 @@ Delete Run Display Settings Enable Write Operations -Check USB Game Fragmentation Remember Last Played Game Select Button Error, the game is fragmented. diff --git a/lng/lang_Filipino_r1903.lng b/lng/lang_Filipino_r1922.lng similarity index 97% rename from lng/lang_Filipino_r1903.lng rename to lng/lang_Filipino_r1922.lng index 15b6d3f90..43ef2f21b 100644 --- a/lng/lang_Filipino_r1903.lng +++ b/lng/lang_Filipino_r1922.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo and Colton SIlva @ColtonSilvaonKnoxKontor -# Last update: Jan. 22, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -103,7 +103,6 @@ Alisin Tumakbo Ipakita ang mga setting I-enable ang write operations -I-check ang USB game fragmentation Tandaan ang huling play ng laro Select button Error, fragmented ang laro diff --git a/lng/lang_French_r1903.lng b/lng/lang_French_r1922.lng similarity index 97% rename from lng/lang_French_r1903.lng rename to lng/lang_French_r1922.lng index 50b3d7a9a..449c6fa6e 100644 --- a/lng/lang_French_r1903.lng +++ b/lng/lang_French_r1922.lng @@ -1,6 +1,6 @@ # Translation by machiavel and Squall -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -103,7 +103,6 @@ Supprimer Lancer Options d'affichage Activer l'écriture -Vérifier fragmentation jeu USB Souvenir dernier jeu joué Bouton de sélection Erreur, le jeu est fragmenté. diff --git a/lng/lang_German_r1903.lng b/lng/lang_German_r1922.lng similarity index 97% rename from lng/lang_German_r1903.lng rename to lng/lang_German_r1922.lng index f42b1b673..2aebfc0d5 100644 --- a/lng/lang_German_r1903.lng +++ b/lng/lang_German_r1922.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: Jan. 13, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -103,7 +103,6 @@ Löschen Ausführen Anzeige Einstellungen Aktiviere Schreiboptionen -Prüfe USB Spielefragmentierung Merke zuletzt gespieltes Spiel Auswahltaste Fehler, das Spiel ist fragmentiert diff --git a/lng/lang_Greek_r1903.lng b/lng/lang_Greek_r1922.lng similarity index 98% rename from lng/lang_Greek_r1903.lng rename to lng/lang_Greek_r1922.lng index 85920ba0b..59f85f469 100644 --- a/lng/lang_Greek_r1903.lng +++ b/lng/lang_Greek_r1922.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -103,7 +103,6 @@ NetBIOS Εκκίνηση Ρυθμίσεις Οθόνης Λειτουργίες Εγγραφής -Έλεγχος Κατακερματισμού USB Απομνημόνευση Τελευταίου Παιχνιδιού Πλήκτρο Επιλογής Σφάλμα, το παιχνίδι είναι κατακερματισμένο. diff --git a/lng/lang_Hungarian_r1903.lng b/lng/lang_Hungarian_r1922.lng similarity index 97% rename from lng/lang_Hungarian_r1903.lng rename to lng/lang_Hungarian_r1922.lng index eeed35b0b..bd6f0f2c7 100644 --- a/lng/lang_Hungarian_r1903.lng +++ b/lng/lang_Hungarian_r1922.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -103,7 +103,6 @@ Törlés Futtatás Képernyő Beállítások Írási műveletek engedélyezése -USB játék töredezettség ellenőrzése Emlékezz a legutóbbi játékra Select Gomb Hiba, a játék töredezett diff --git a/lng/lang_Indonesian_r1903.lng b/lng/lang_Indonesian_r1922.lng similarity index 97% rename from lng/lang_Indonesian_r1903.lng rename to lng/lang_Indonesian_r1922.lng index 3831df7ae..3f161ff36 100644 --- a/lng/lang_Indonesian_r1903.lng +++ b/lng/lang_Indonesian_r1922.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -103,7 +103,6 @@ Hapus Jalankan Pengaturan Tampilan Memungkinkan operasi tulis -Cek fragmentasi game USB Ingat pertandingan terakhir dimainkan Pilih tombol Kesalahan, game terfragmentasi diff --git a/lng/lang_Italian_r1903.lng b/lng/lang_Italian_r1922.lng similarity index 97% rename from lng/lang_Italian_r1903.lng rename to lng/lang_Italian_r1922.lng index 2ae318050..e034b2e5f 100644 --- a/lng/lang_Italian_r1903.lng +++ b/lng/lang_Italian_r1922.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d and completed by Peppe90 -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -103,7 +103,6 @@ Cancella Esegui Impostazioni Display Abilita Operazioni in Scrittura -Verifica Frammentazione Giochi USB Ricorda Ultimo Titolo Giocato Tasto di Selezione Errore, il gioco è frammentato. diff --git a/lng/lang_Japanese_r1903.lng b/lng/lang_Japanese_r1922.lng similarity index 97% rename from lng/lang_Japanese_r1903.lng rename to lng/lang_Japanese_r1922.lng index bb810276d..923d9fbce 100644 --- a/lng/lang_Japanese_r1903.lng +++ b/lng/lang_Japanese_r1922.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -103,7 +103,6 @@ OK 実行 表示設定 高度なメニューで書換えを有効化 -USBゲームのデフラグを常にチェック 最後にプレイしたゲームを記憶する セレクトボタン ゲームがデフラグされていません diff --git a/lng/lang_Korean_r1903.lng b/lng/lang_Korean_r1922.lng similarity index 97% rename from lng/lang_Korean_r1903.lng rename to lng/lang_Korean_r1922.lng index 4e6e17845..2ad6e95e3 100644 --- a/lng/lang_Korean_r1903.lng +++ b/lng/lang_Korean_r1922.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -103,7 +103,6 @@ NetBIOS 실행 디스플레이 설정 쓰기 작업 활성 -USB 게임 손상 검사 마지막에 실행한 게임 기억 버튼 선택 오류, 게임이 손상 되었습니다. diff --git a/lng/lang_Laotian_r1903.lng b/lng/lang_Laotian_r1922.lng similarity index 98% rename from lng/lang_Laotian_r1903.lng rename to lng/lang_Laotian_r1922.lng index e93642eb6..37874985d 100644 --- a/lng/lang_Laotian_r1903.lng +++ b/lng/lang_Laotian_r1922.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -103,7 +103,6 @@ NetBIOS ຫຼິ້ນເກມນີ້ ຕັ້ງຄ່າການສະແດງຜົນ ສາມາດລົບເກມ ແລະ ປ່ຽນຊື່ເກມໄດ້ -ກວດສອບ game fragmentation ເທິງ USB ໃຫ້ລະບົບຈື່ເກມທີ່ຫຼິ້ນໄປຄັ້ງສຸດທ້າຍ ເລືອກປຸ່ມ ເກີດຂໍ້ຜິດພາດ, ເກມນີ້ມີ fragmentation. ກະລຸນາ Defragment ເກມນີ້ກ່ອນ diff --git a/lng/lang_Persian_r1903.lng b/lng/lang_Persian_r1922.lng similarity index 98% rename from lng/lang_Persian_r1903.lng rename to lng/lang_Persian_r1922.lng index 8172701f5..40320b4c3 100644 --- a/lng/lang_Persian_r1903.lng +++ b/lng/lang_Persian_r1922.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: Jan. 13, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s @@ -103,7 +103,6 @@ NetBIOS اﺮﺟا ﺮﮕﺸﻳﺎﻤﻧ تﺎﻤﻴﻈﻨﺗ ﻦﺘﺷﻮﻧ هزﺎﺟا ندﺮﻛ لﺎﻌﻓ -USB یﺎﻫ یزﺎﺑ ﻲﮕﺘﺨﻳر ﻢﻬﺑ ندﺮﻛ ﮏﭼ هﺪﺷ مﺎﺟﻧا یزﺎﺑ ﻦﻳﺮﺧآ ﻦﺘﺷاد دﺎﻳ ﻪﺑ بﺎﺨﺘﻧا ی ﻪﻤﻛد ﺖﺳا ﻪﺘﺨﻳر ﻢﻫ ﻪﺑ یزﺎﺑ یﺎﻫ ﻞﻳﺎﻓ هﺪﻣآ دﻮﺟو ﻪﺑ ﻲﻠﻜﺸﻣ diff --git a/lng/lang_Polish_r1903.lng b/lng/lang_Polish_r1922.lng similarity index 97% rename from lng/lang_Polish_r1903.lng rename to lng/lang_Polish_r1922.lng index 7ff79967e..1144ec660 100644 --- a/lng/lang_Polish_r1903.lng +++ b/lng/lang_Polish_r1922.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -103,7 +103,6 @@ Usuń Uruchom Ustawienia Obrazu Włącz Operację Zapisu -Sprawdź Fragmentację Gier USB Zapamiętaj Ostatnio Uruchomioną Grę Przycisk Wyboru Błąd, gra jest pofragmentowana. diff --git a/lng/lang_Portuguese_BR_r1903.lng b/lng/lang_Portuguese_BR_r1922.lng similarity index 97% rename from lng/lang_Portuguese_BR_r1903.lng rename to lng/lang_Portuguese_BR_r1922.lng index 8dacca709..033c1644b 100644 --- a/lng/lang_Portuguese_BR_r1903.lng +++ b/lng/lang_Portuguese_BR_r1922.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Jan. 13, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -103,7 +103,6 @@ Excluir Iniciar Definições de tela Ativar ações de gravação -Checar fragmentação dos jogos no USB Lembrar último jogo executado Escolha o botão de ação ( X ou O ) Erro, o jogo está fragmentado! diff --git a/lng/lang_Portuguese_r1903.lng b/lng/lang_Portuguese_r1922.lng similarity index 97% rename from lng/lang_Portuguese_r1903.lng rename to lng/lang_Portuguese_r1922.lng index aac9ba8ae..cd7adb4e8 100644 --- a/lng/lang_Portuguese_r1903.lng +++ b/lng/lang_Portuguese_r1922.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: Jan. 13, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -103,7 +103,6 @@ Apagar Iniciar Definições de Visualização Ativar operações de escrita -Verificar fragmentação de jogo USB Lembrar último jogo executado Botão de Seleção Erro, o jogo está fragmentado diff --git a/lng/lang_Romanian_r1903.lng b/lng/lang_Romanian_r1922.lng similarity index 96% rename from lng/lang_Romanian_r1903.lng rename to lng/lang_Romanian_r1922.lng index cb54e8bb0..94b237edc 100644 --- a/lng/lang_Romanian_r1903.lng +++ b/lng/lang_Romanian_r1922.lng @@ -1,6 +1,6 @@ # Romanian translation by MRAdyy -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Romanian Open PS2 Loader %s @@ -103,7 +103,6 @@ Stergere Ruleaza Setari Imagine Activeaza operatiuni de scriere -Verificați fragmentarea jocului USB Aminteste ultimul joc jucat Butonul Select "Eroare, jocul este fragmentat" diff --git a/lng/lang_Russian_r1903.lng b/lng/lang_Russian_r1922.lng similarity index 98% rename from lng/lang_Russian_r1903.lng rename to lng/lang_Russian_r1922.lng index d9ad841f4..8358dae89 100644 --- a/lng/lang_Russian_r1903.lng +++ b/lng/lang_Russian_r1922.lng @@ -1,6 +1,6 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: Jan. 15, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -103,7 +103,6 @@ NetBIOS Старт Настройки экрана Разрешить операции записи -Проверять фрагм. игр на USB Запоминать последнюю игру Кнопка выбора Ошибка, игра фрагментирована. diff --git a/lng/lang_SChinese_r1903.lng b/lng/lang_SChinese_r1922.lng similarity index 96% rename from lng/lang_SChinese_r1903.lng rename to lng/lang_SChinese_r1922.lng index 7563c10db..a31d7220e 100644 --- a/lng/lang_SChinese_r1903.lng +++ b/lng/lang_SChinese_r1922.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese OPL %s @@ -103,7 +103,6 @@ NetBIOS 运行 显示设置 启用删除与重新命名功能 -检查 USB 游戏碎片 记住最后运行游戏 选定键 错误, 游戏有碎片 diff --git a/lng/lang_Spanish_r1903.lng b/lng/lang_Spanish_r1922.lng similarity index 97% rename from lng/lang_Spanish_r1903.lng rename to lng/lang_Spanish_r1922.lng index fb95d7843..f4f9f01e3 100644 --- a/lng/lang_Spanish_r1903.lng +++ b/lng/lang_Spanish_r1922.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: Jan. 26, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -103,7 +103,6 @@ Borrar Iniciar Configuraciones de pantalla Mostrar operaciones de escritura -Comprobar fragmentación juego USB Recordar último juego en uso Botón de selección Error, el juego está fragmentado diff --git a/lng/lang_Swedish_r1903.lng b/lng/lang_Swedish_r1922.lng similarity index 96% rename from lng/lang_Swedish_r1903.lng rename to lng/lang_Swedish_r1922.lng index 3c6f3d90e..1ef1a2352 100644 --- a/lng/lang_Swedish_r1903.lng +++ b/lng/lang_Swedish_r1922.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: Jan. 13, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -103,7 +103,6 @@ Radera Kör Skärminställningar Aktivera skrivåtkomst -Kontrollera USB spelfragmentering Kom ihåg senast spelade spel Välj knapp Fel, spelet är fragmenterat diff --git a/lng/lang_TChinese_r1903.lng b/lng/lang_TChinese_r1922.lng similarity index 96% rename from lng/lang_TChinese_r1903.lng rename to lng/lang_TChinese_r1922.lng index 8ef266a13..5303a2a03 100644 --- a/lng/lang_TChinese_r1903.lng +++ b/lng/lang_TChinese_r1922.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -103,7 +103,6 @@ NetBIOS 運行 顯示設置 啟用刪除與重新命名功能 -檢查 USB 遊戲碎片 記住最後運行遊戲 選定鍵 錯誤, 遊戲有碎片 diff --git a/lng/lang_Turkish_r1903.lng b/lng/lang_Turkish_r1922.lng similarity index 96% rename from lng/lang_Turkish_r1903.lng rename to lng/lang_Turkish_r1922.lng index cd9c2ceba..4ac815cbf 100644 --- a/lng/lang_Turkish_r1903.lng +++ b/lng/lang_Turkish_r1922.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -103,7 +103,6 @@ Sil Çalıştır Görüntü ayarları Yazma işlemlerini aktif et -USB oyun bütünlüğünü kontrol et (Fragmentation) Enson oynanan oyunu hatırla Seçme tuşu Hata, oyun dosyası parçalı diff --git a/lng/lang_Vietnamese_r1903.lng b/lng/lang_Vietnamese_r1922.lng similarity index 97% rename from lng/lang_Vietnamese_r1903.lng rename to lng/lang_Vietnamese_r1922.lng index 54ba4b9a6..a7627b140 100644 --- a/lng/lang_Vietnamese_r1903.lng +++ b/lng/lang_Vietnamese_r1922.lng @@ -1,6 +1,6 @@ # Translation by zidane89 -# Last update: Jan. 10, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1903-00169c4-2021-01-10 and OPNPS2LD-v1.1.0-Beta-1606-ifcaro_all-a2b2472-2021-01-10 +# Last update: Feb. 01, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese OPL %s @@ -103,7 +103,6 @@ Xóa Chạy Cài đặt hiển thị Kích hoạt thao tác ghi -Kiểm tra phân mảnh trò chơi trên USB Nhớ các cài đặt cuối cùng Chọn nút Lỗi, trò chơi bị phân mảnh diff --git a/src/lang.c b/src/lang.c index 1ca1e8314..dc91f676d 100644 --- a/src/lang.c +++ b/src/lang.c @@ -298,7 +298,7 @@ static char *internalEnglish[LANG_STR_COUNT] = { "An error occurred while renaming the file.", "An error occurred while deleting the file.", "Never buy OPEN-PS2-LOADER (OPL), instead get it free at:", - "ifcaro OPL version at psx-scene.com", + "ifcaro OPL version at psx-place.com", "OPL Daily Builds (DB) version at ps2-home.com", //END of OPL_DB tweaks }; From 00604b5224bb2e6f015f062977abec381f6b6350 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 10 Mar 2021 08:35:23 -0800 Subject: [PATCH 226/269] update lang files --- lng/lang_Albanian_r1922.lng | 293 ++++++++++++++++++++++++++++++++++++ lng/lang_Filipino_r1922.lng | 2 +- 2 files changed, 294 insertions(+), 1 deletion(-) create mode 100644 lng/lang_Albanian_r1922.lng diff --git a/lng/lang_Albanian_r1922.lng b/lng/lang_Albanian_r1922.lng new file mode 100644 index 000000000..ae15d7592 --- /dev/null +++ b/lng/lang_Albanian_r1922.lng @@ -0,0 +1,293 @@ +# Translation by LoniTheFricc +# Last update: March 10, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +Albanian +OPL %s +Ruaj Ndryshimet +Mbrapa +Opsionet e Networkit +Opsionet e Avancuara + +Opsionet ruajtur tek %s +Gabim gjatë shkrimit të opsioneve! +Dil +Opsione +Menu +Lojëra USB +Lojëra HDD +Lojëra ETH +Programe +Tema +Gjuhë +Sistemi do të fiket. +Dil tek Browseri? +Anulo? +%d: HardDisku nuk u dallua. +%d: HardDisku nuk është i formatuar. +%d: Gabim gjatë Nisjes së Networkit. +%d: Adapteri i Networkit nuk u dallua. +%d: Nuk mund të lidhet me serverin SMB. +%d: Nuk mund të logohet në serverin SMB. +%d: Nuk mund të hapet ndarja SMB. +%d: Nuk mund të listohet ndarja SMB. +%d: Nuk mund të listohen lojërat. +%d: Serveri DHCP është i pa disponueshëm. +%d: Nuk ka lidhje me Networkin. +Nezur +Fikur +OK +Zgjedh +Anulo +Rreth +Kqyq +Lista e Lojërave +Konfigurimet e Lojrave +Hiq Konfigurimet +Hequr të gjithë çelësat nga loja. +Lëvizja +Ngadalë +Mesatare +Shpejt +Menuja e Parazgjedhur +Ngarko nga Disku +Prisni. +Gabim duke ngarkuar ID e Lojës. +Rënditje Automatike. +Gabim duke ngarkuar skedarin e gjuhës. +Çaktivizo korrigjimin e Ngjyrave. +Nuk u dallua nje telekomandë, duke pritur... +Aktivizo Artin e Kopertinës +Ekran i gjerë +Fike +Duke Ngarkuar Konfigurimin... +Duke Ruajtur Konfigurimin... +Fillo Pajisjen +Rifresko +Moda e Fillimit të USB-s +Moda e Fillimit të HDD-s +Moda e Fillimit të ETH-it +Moda e Shfaqjes së menusë e Aplikacioneve +Auto +Manual +Fillo Serverin HDL +Serveri HDL duke filluar... +Serveri HDL në operacion... +Dështim në fillimin e serverit HDL. +Serveri HDL duke u shkarkuar... +Rruga e IGR +Ngjyra e Sfondit +Ngjyra e Tekstit +- PS2 - +- Server SMB - +Lloji i Adresës IP +Statik +DHCP +Adresë IP +Adresë +Maskë +Gateway +Serveri DNS +Portë +Ndarje +Përdorues +Fjalëkalim + +Lloji i Adresës +IP +NetBIOS +Prano +Artikulli do të fshihet përgjithmonë, vazdho? +Riemërto +Fshi +Hap +Opsionet e Ekranit +Lejo Operacionet e Modifikimit +Mbaj mend lojen e fundit të luajtur +Zgjidh Butonin +Gabim, Loja është e fragmentuar. +Gabim, artikulli nuk mundej te hapej. +Provo Ndryshimet +Lëje bosh per autorizim Vizitori. +Lexime te Sakta +Modë te Sinkronizuar +Zhvendo Syscalls +Kapërce Video +Imito DVD-DL +Çaktivizo IGR +E pa Përdorur +E pa Përdorur +Ndryshimi i Madhësisë do të riformatojë VMC-n. +Krijo +Fillo +Modifiko +Nderpre +Ristarto +Përdor Gjenerike +Konfiguro VMC-n +Emër +Madhësi +Status +Progres +Skedari VMC ekziston. +Skedar VMC i pavlefshëm, përmasa është gabim. +Skedari VMC duhet të krijohet. +Gabim duke aksesuar VMC %s. Vazdho me Kartën e Memorjes ne Portin %d? +Rifreskim Automatik +Për Ne +Koduesit +Sigurimi i Cilësisë +Rruga e Parashtesës se USB-s +Hap një ELF te Modifikuar mbas një IGR. +Vlera në minuta(s), 0 të çaktivizosh Ngadalsimin e Rrotullimit. +Ngadalsim Rrotullimi Automatik te HDD-së. +Moda e Videos +Ngjyra e Dialogut +Ngjyra e Zgjedhur +Rivendos Ngjyrat +Info +ELF i personalizuar +Zgjedhja e Ngjyrës +Rilidhu +Lëre bosh te listosh ndarjet. +Rruga e Parashtesësh se ETH. +Fshi +Hapësirë +Mbaro +Modë +Porti VMC 1 +Porti VMC 2 +ID-ja e Lojës +Moda DMA +V-Sync +Moda 1 +Moda 2 +Moda 3 +Moda 4 +Moda 5 +Moda 6 +Moda 7 +Moda 8 +Konfiguro GSM +Moda e Lidhjes Ethernet +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex +Opsionet GSM +Aktiviyo GSM +Ndërron GSM Ndezur/Fikur. +VMODE +Moda e shfaqjes së personalizuar te detyruar. +H-POZ +Rregullim Horizontal. +V-POZ +Rregullim Vertikal. +Tejkalim +Rregullim të Tejkalimit e TV. +Tejkalim FMV. +Tejkalon Videot ne Mocion të Plotë. +Opsionet e Hileve +Aktivizo Programin e hiles PS2RD +Lejo Programin e hiles PS2RD te modifikojë lojën. +Moda e hiles PS2RD. +Zgjedhje Automatike ose Zgjedhe të hileve te lojrave. +Zgjidh Hile Automatikisht +Select Game Cheats +Gabim: Skedari i hiles nuk arriti te ngarkohet. +Nuk u gjendën hile. +Shkarkoni Parazgjedhjet +Përditsim me Internet +Mbishkruaj rekordet ekzistuese +Perditsimi Dështoi. +Lidhja me serverin e përditsimit dështoi. +Përditsimi Mbaroi. +Përditsimi u Anulua. +Shkarko Opsionet nga Interneti? +Opsionet e Personalizuara +Parazgjedhjet e shkarkuara +Fillim Auto në %i s... +Fillim Auto +Vlerë në sekonda(s), 0 për të çaktivizuar Fillimin Auto. +Logoja e PS2 +Shfaqet për një logo të vlefshme të diskut që përputhet me rajonin e konsolës. +Konfiguro PADEMU +Konfigurimet e Emulatorit te Pad-it +Aktivizo Emulatorin e Pad-it +Aktivizon/Çaktivizon Emulatorin e Pad-it për lojën e zgjedhur. +Moda e Emulatorit të Pad-it +Zgjidj Modën e Emulatorit të Pad-it. +DualShock3/4 USB +DualShock3/4 BT +Opsionet për Port: +Zgjidh Portën e Emulatorit te Pad-it për opsione. +Aktivizo Emulimin +Aktivizon/Çaktivizon Emulatorin e Pad-it për portën e zgjedhur. +Aktivizo Dridhjen +Aktivizon/Çaktivizon Dridhjen e Emulatorit të Pad-it për portën e zgjedhur. +Adresa MAC e Adapterit BT USB: +Telekomanda DS e lidhur me MAC Adresin: +Lidh +Lidh Telekomandën DS +Lidh Telekomandën DS me Adresën MAC të Adapterit Bluetooth. +Nuk është Lidhur +Informacion i Adapterit Bluetooth +Tregon më shumë informacion dhe veçoritë e mbështetura. +Versioni HCI: +Versioni LMP: +ID-ja e Prodhuesit: +Karakteristikat e mbështetura: +Po +Jo +Adapteri Bluetooth duhet të jetë plotësisht i pajtueshëm me telekomandat DS3/DS4. +Adapteri Bluetooth mund të mos funksionojë si duhet me kontrolluesit DS3/DS4. +Aktivizo Emulimin e Multitap +Aktivizon/Çaktivizon emulimin e Multitap për lojën e zgjedhur. +Emulatori i Multitap në Portën: +Zgjidh portën për Emulimin e Multitap. +Çaktivizo Zgjidhjen e DS3-ve të rreme. +Disa DS3 të rreme kanë nevojë për zgjidhje, ky opsion do ta çaktivizoj atë. +Emulo Shfletimin FIELD +Rregullo lojërat që kanë anomali në mënyrat progresive të videos. +Opsionet e Kyçit Prindëror. +Fjalëkalimi i Kyçit Prindëror. +Lëre bosh qe të çaktivizosh kyçin prindëror. +Shkruani Fjalëkalimin e kyçit prindëror. +Fjalëkalimi është gabim. +Kyçi Prinderor u Çaktivizua. +Opsionet e Versionit: +Gabim - ky fjalëkalim nuk mund të përdoret. +Skedari VMC %s është i fragmentuar.Vazdho me Kartën e Memorjes ne Portën %d? +Opsionet Audio +Aktivizo Tingujt +Aktivizo Tingullin e nisjes +Volumi i Tingujve +Volumi i Tinguliit të nisjes +Konfirmo ndryshimet e Videos? +Depozito Listën e Lojerave? (HDD) +Aktivizo Njoftimet +%s ngarkuar nga %s +Opsione +Konfigurimet e Lojës u ruajtën. +%s konfigurimet u heqën. +Zëvendëson cilësimet ekzistuese të përputhshmërisë së lojërave kur aktivizohet. +Moda e Konfigurimeve +Global +Per Çdo Lojë +Gjithçka +Zgjith Konfigurimet per t'u hequr. +Forume Ndihme: +Titulli +Zhanri +Publikimi +Zhvilluesi +Përshkrimi +Lojrat e PS1-shit +Moda e Shfaqjes se Lojrave se PS1-shit +POPSTARTER.ELF nuk është gjetur tek '%s'! +Skedari VCD '%s' nuk është gjetur! +Ndodhi një gabim gjatë riemërimit të skedarit. +Ndodhi një gabim gjatë fshirjes së skedarit. +Kurrë mos blej OPEN-PS2-LOADER (OPL), mundesh ta gjeshë falas tek: +ifcaro OPL version at psx-place.com +OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Filipino_r1922.lng b/lng/lang_Filipino_r1922.lng index 0b8a7901e..93343880e 100644 --- a/lng/lang_Filipino_r1922.lng +++ b/lng/lang_Filipino_r1922.lng @@ -1,5 +1,5 @@ # Translation by Ceed Lorenzo and Colton SIlva @ColtonSilvaonKnoxKontor -# Last update: Feb. 16, 2021 +# Last update: Feb. 19, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino From 5dbc7f4b1542030bdca907035c43082ef1946429 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 13 Mar 2021 08:38:09 -0800 Subject: [PATCH 227/269] update lang files --- lng/lang_Albanian_r1922.lng | 44 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/lng/lang_Albanian_r1922.lng b/lng/lang_Albanian_r1922.lng index ae15d7592..6e0731a63 100644 --- a/lng/lang_Albanian_r1922.lng +++ b/lng/lang_Albanian_r1922.lng @@ -1,5 +1,5 @@ # Translation by LoniTheFricc -# Last update: March 10, 2021 +# Last update: March 13, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Albanian @@ -8,7 +8,7 @@ Ruaj Ndryshimet Mbrapa Opsionet e Networkit Opsionet e Avancuara - + Opsionet ruajtur tek %s Gabim gjatë shkrimit të opsioneve! Dil @@ -42,7 +42,7 @@ Anulo Rreth Kqyq Lista e Lojërave -Konfigurimet e Lojrave +Konfigurimet e Lojës Hiq Konfigurimet Hequr të gjithë çelësat nga loja. Lëvizja @@ -67,7 +67,7 @@ Rifresko Moda e Fillimit të USB-s Moda e Fillimit të HDD-s Moda e Fillimit të ETH-it -Moda e Shfaqjes së menusë e Aplikacioneve +Moda e Shfaqjes së Aplikacioneve Auto Manual Fillo Serverin HDL @@ -79,7 +79,7 @@ Rruga e IGR Ngjyra e Sfondit Ngjyra e Tekstit - PS2 - -- Server SMB - +- Serveri SMB - Lloji i Adresës IP Statik DHCP @@ -139,8 +139,8 @@ Koduesit Sigurimi i Cilësisë Rruga e Parashtesës se USB-s Hap një ELF te Modifikuar mbas një IGR. -Vlera në minuta(s), 0 të çaktivizosh Ngadalsimin e Rrotullimit. -Ngadalsim Rrotullimi Automatik te HDD-së. +Vlera në minuta(s),0 të çaktivizosh Ngadalsimin e Rrotullimit. +Ngadalsim Auto Rrotullimit së HDD-së. Moda e Videos Ngjyra e Dialogut Ngjyra e Zgjedhur @@ -150,7 +150,7 @@ ELF i personalizuar Zgjedhja e Ngjyrës Rilidhu Lëre bosh te listosh ndarjet. -Rruga e Parashtesësh se ETH. +Rruga e Parashtesës se ETH. Fshi Hapësirë Mbaro @@ -160,14 +160,14 @@ Porti VMC 2 ID-ja e Lojës Moda DMA V-Sync -Moda 1 -Moda 2 -Moda 3 -Moda 4 -Moda 5 -Moda 6 -Moda 7 -Moda 8 +Moda 1 +Moda 2 +Moda 3 +Moda 4 +Moda 5 +Moda 6 +Moda 7 +Moda 8 Konfiguro GSM Moda e Lidhjes Ethernet 100Mbit Full-duplex @@ -179,9 +179,9 @@ Aktiviyo GSM Ndërron GSM Ndezur/Fikur. VMODE Moda e shfaqjes së personalizuar te detyruar. -H-POZ +POZ-H Rregullim Horizontal. -V-POZ +POZ-V Rregullim Vertikal. Tejkalim Rregullim të Tejkalimit e TV. @@ -193,7 +193,7 @@ Lejo Programin e hiles PS2RD te modifikojë lojën. Moda e hiles PS2RD. Zgjedhje Automatike ose Zgjedhe të hileve te lojrave. Zgjidh Hile Automatikisht -Select Game Cheats +Zgjidh Hilet Gabim: Skedari i hiles nuk arriti te ngarkohet. Nuk u gjendën hile. Shkarkoni Parazgjedhjet @@ -272,7 +272,7 @@ Konfigurimet e Lojës u ruajtën. %s konfigurimet u heqën. Zëvendëson cilësimet ekzistuese të përputhshmërisë së lojërave kur aktivizohet. Moda e Konfigurimeve -Global +Globale Per Çdo Lojë Gjithçka Zgjith Konfigurimet per t'u hequr. @@ -282,8 +282,8 @@ Zhanri Publikimi Zhvilluesi Përshkrimi -Lojrat e PS1-shit -Moda e Shfaqjes se Lojrave se PS1-shit +Lojrat PS1 +Moda e Shfaqjes se Lojrave PS1 POPSTARTER.ELF nuk është gjetur tek '%s'! Skedari VCD '%s' nuk është gjetur! Ndodhi një gabim gjatë riemërimit të skedarit. From 8df3665ffb4eb579236ea0ddb7f45414b312a8bf Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 19 May 2021 22:02:00 -0700 Subject: [PATCH 228/269] update files to new USB to BDM changes --- src/bdmsupport.c | 2 +- src/elmsupport.c | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/bdmsupport.c b/src/bdmsupport.c index 7345423b5..74f92a3c4 100644 --- a/src/bdmsupport.c +++ b/src/bdmsupport.c @@ -35,7 +35,7 @@ char *bdmGetPrefix(void) return bdmPrefix; } -char bdmGetBase(void) +char *bdmGetBase(void) { return bdmBase; } diff --git a/src/elmsupport.c b/src/elmsupport.c index 3e0041d90..bfb41d532 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -6,7 +6,7 @@ #include "include/system.h" #include "include/ioman.h" -#include "include/usbsupport.h" +#include "include/bdmsupport.h" #include "include/ethsupport.h" #include "include/hddsupport.h" #include "include/supportbase.h" @@ -41,7 +41,7 @@ static ElmGame *elmGameList = NULL; //The full path to the POPSTARTER.ELF file. Eg: smb0:POPS/POPSTARTER.ELF char elmPathElfHdd[256]; -char elmPathElfUsb[256]; +char elmPathElfBdm[256]; char elmPathElfEth[256]; //Last modified for the folder @@ -355,18 +355,18 @@ static int elmUpdateItemList(void) } //Try USB - if (usbGetObject(1)) { + if (bdmGetObject(1)) { //Eg: mass0:POPS/POPSTARTER.ELF - snprintf(elmPathElfUsb, sizeof(elmPathElfUsb), "%sPOPS/POPSTARTER.ELF", usbGetBase()); - LOG("elmPathElfUsb = %s\n", elmPathElfUsb); + snprintf(elmPathElfBdm, sizeof(elmPathElfBdm), "%sPOPS/POPSTARTER.ELF", bdmGetBase()); + LOG("elmPathElfUsb = %s\n", elmPathElfBdm); //Check if POPSTARTER.ELF exists in the folder. - int fdElf = open(elmPathElfUsb, O_RDONLY, 0666); + int fdElf = open(elmPathElfBdm, O_RDONLY, 0666); if (fdElf >= 0) { close(fdElf); - elmItemCount += elmScanVCDs(usbGetBase()); + elmItemCount += elmScanVCDs(bdmGetBase()); } else { - LOG("POPSTARTER.ELF not found at %s", elmPathElfUsb); + LOG("POPSTARTER.ELF not found at %s", elmPathElfBdm); } } @@ -513,7 +513,7 @@ static void elmLaunchItem(int id, config_set_t *configSet) strcpy(elmPathElf, elmPathElfHdd); strcpy(elmElfPrefix, ""); } else if (!strncmp(cur->file, "mass", 4)) { - strcpy(elmPathElf, elmPathElfUsb); + strcpy(elmPathElf, elmPathElfBdm); strcpy(elmElfPrefix, "XX."); } else { strcpy(elmPathElf, elmPathElfEth); @@ -570,7 +570,7 @@ static void elmLaunchItem(int id, config_set_t *configSet) // Figure out in what device the VCD is at. This is necessary to avoid the device to be unmounted. if (strncmp(cur->file, "mass", 4) == 0) { - mode = USB_MODE; + mode = BDM_MODE; } else if (strncmp(cur->file, "hdd", 3) == 0) { mode = HDD_MODE; } else if (strncmp(cur->file, "smb", 3) == 0) { @@ -634,15 +634,15 @@ static config_set_t *elmGetConfig(int id) } //USB - if (ret == 0 && (listSupport = usbGetObject(1))) { + if (ret == 0 && (listSupport = bdmGetObject(1))) { char path[256]; if (config != NULL) configFree(config); #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), cur->ID); + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", bdmGetPrefix(), cur->ID); #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), cur->ID); + snprintf(path, sizeof(path), "%sCFG/%s.cfg", bdmGetPrefix(), cur->ID); #endif config = configAlloc(1, NULL, path); ret = configRead(config); @@ -678,7 +678,7 @@ static int elmGetImage(char *folder, int isRelative, char *value, char *suffix, return 0; } - if ((listSupport = usbGetObject(1))) + if ((listSupport = bdmGetObject(1))) return listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm); return -1; From 2403b93189de3396baf6d2e577a2f4a391aab86f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 20 May 2021 00:42:23 -0700 Subject: [PATCH 229/269] update lang files --- ...lbanian_r1922.lng => lang_Albanian_r1950.lng} | 14 +++++++------- ...ng_Arabic_r1922.lng => lang_Arabic_r1950.lng} | 14 +++++++------- ...garian_r1922.lng => lang_Bulgarian_r1950.lng} | 14 +++++++------- lng/{lang_Cebuano.lng => lang_Cebuano_r1950.lng} | 16 +++++++++------- ...roatian_r1922.lng => lang_Croatian_r1950.lng} | 14 +++++++------- ...lang_Czech_r1922.lng => lang_Czech_r1950.lng} | 14 +++++++------- ...ng_Danish_r1922.lng => lang_Danish_r1950.lng} | 14 +++++++------- ...lang_Dutch_r1922.lng => lang_Dutch_r1950.lng} | 14 +++++++------- lng/lang_English.lng | 10 +++++----- ...ilipino_r1922.lng => lang_Filipino_r1950.lng} | 14 +++++++------- ...ng_French_r1922.lng => lang_French_r1950.lng} | 14 +++++++------- ...ng_German_r1922.lng => lang_German_r1950.lng} | 14 +++++++------- ...lang_Greek_r1922.lng => lang_Greek_r1950.lng} | 12 ++++++------ ...garian_r1922.lng => lang_Hungarian_r1950.lng} | 14 +++++++------- ...esian_r1922.lng => lang_Indonesian_r1950.lng} | 14 +++++++------- ..._Italian_r1922.lng => lang_Italian_r1950.lng} | 12 ++++++------ ...apanese_r1922.lng => lang_Japanese_r1950.lng} | 14 +++++++------- ...ng_Korean_r1922.lng => lang_Korean_r1950.lng} | 14 +++++++------- ..._Laotian_r1922.lng => lang_Laotian_r1950.lng} | 14 +++++++------- ..._Persian_r1922.lng => lang_Persian_r1950.lng} | 14 +++++++------- ...ng_Polish_r1922.lng => lang_Polish_r1950.lng} | 14 +++++++------- ...BR_r1922.lng => lang_Portuguese_BR_r1950.lng} | 14 +++++++------- ...guese_r1922.lng => lang_Portuguese_r1950.lng} | 14 +++++++------- ...omanian_r1922.lng => lang_Romanian_r1950.lng} | 14 +++++++------- ..._Russian_r1922.lng => lang_Russian_r1950.lng} | 14 +++++++------- ...Chinese_r1922.lng => lang_SChinese_r1950.lng} | 14 +++++++------- ..._Spanish_r1922.lng => lang_Spanish_r1950.lng} | 14 +++++++------- ..._Swedish_r1922.lng => lang_Swedish_r1950.lng} | 14 +++++++------- ...Chinese_r1922.lng => lang_TChinese_r1950.lng} | 14 +++++++------- ..._Turkish_r1922.lng => lang_Turkish_r1950.lng} | 14 +++++++------- ...amese_r1922.lng => lang_Vietnamese_r1950.lng} | 14 +++++++------- 31 files changed, 215 insertions(+), 213 deletions(-) rename lng/{lang_Albanian_r1922.lng => lang_Albanian_r1950.lng} (95%) rename lng/{lang_Arabic_r1922.lng => lang_Arabic_r1950.lng} (97%) rename lng/{lang_Bulgarian_r1922.lng => lang_Bulgarian_r1950.lng} (96%) rename lng/{lang_Cebuano.lng => lang_Cebuano_r1950.lng} (94%) rename lng/{lang_Croatian_r1922.lng => lang_Croatian_r1950.lng} (95%) rename lng/{lang_Czech_r1922.lng => lang_Czech_r1950.lng} (95%) rename lng/{lang_Danish_r1922.lng => lang_Danish_r1950.lng} (95%) rename lng/{lang_Dutch_r1922.lng => lang_Dutch_r1950.lng} (95%) rename lng/{lang_Filipino_r1922.lng => lang_Filipino_r1950.lng} (95%) rename lng/{lang_French_r1922.lng => lang_French_r1950.lng} (95%) rename lng/{lang_German_r1922.lng => lang_German_r1950.lng} (96%) rename lng/{lang_Greek_r1922.lng => lang_Greek_r1950.lng} (97%) rename lng/{lang_Hungarian_r1922.lng => lang_Hungarian_r1950.lng} (96%) rename lng/{lang_Indonesian_r1922.lng => lang_Indonesian_r1950.lng} (95%) rename lng/{lang_Italian_r1922.lng => lang_Italian_r1950.lng} (96%) rename lng/{lang_Japanese_r1922.lng => lang_Japanese_r1950.lng} (96%) rename lng/{lang_Korean_r1922.lng => lang_Korean_r1950.lng} (96%) rename lng/{lang_Laotian_r1922.lng => lang_Laotian_r1950.lng} (96%) rename lng/{lang_Persian_r1922.lng => lang_Persian_r1950.lng} (97%) rename lng/{lang_Polish_r1922.lng => lang_Polish_r1950.lng} (95%) rename lng/{lang_Portuguese_BR_r1922.lng => lang_Portuguese_BR_r1950.lng} (96%) rename lng/{lang_Portuguese_r1922.lng => lang_Portuguese_r1950.lng} (95%) rename lng/{lang_Romanian_r1922.lng => lang_Romanian_r1950.lng} (95%) rename lng/{lang_Russian_r1922.lng => lang_Russian_r1950.lng} (96%) rename lng/{lang_SChinese_r1922.lng => lang_SChinese_r1950.lng} (94%) rename lng/{lang_Spanish_r1922.lng => lang_Spanish_r1950.lng} (95%) rename lng/{lang_Swedish_r1922.lng => lang_Swedish_r1950.lng} (95%) rename lng/{lang_TChinese_r1922.lng => lang_TChinese_r1950.lng} (94%) rename lng/{lang_Turkish_r1922.lng => lang_Turkish_r1950.lng} (95%) rename lng/{lang_Vietnamese_r1922.lng => lang_Vietnamese_r1950.lng} (95%) diff --git a/lng/lang_Albanian_r1922.lng b/lng/lang_Albanian_r1950.lng similarity index 95% rename from lng/lang_Albanian_r1922.lng rename to lng/lang_Albanian_r1950.lng index 6e0731a63..980d7ba22 100644 --- a/lng/lang_Albanian_r1922.lng +++ b/lng/lang_Albanian_r1950.lng @@ -1,6 +1,6 @@ # Translation by LoniTheFricc -# Last update: March 13, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Albanian OPL %s @@ -70,11 +70,11 @@ Moda e Fillimit të ETH-it Moda e Shfaqjes së Aplikacioneve Auto Manual -Fillo Serverin HDL -Serveri HDL duke filluar... -Serveri HDL në operacion... -Dështim në fillimin e serverit HDL. -Serveri HDL duke u shkarkuar... +Fillo Serverin NBD +Serveri NBD duke filluar... +Serveri NBD në operacion... +Dështim në fillimin e serverit NBD. +Serveri NBD duke u shkarkuar... Rruga e IGR Ngjyra e Sfondit Ngjyra e Tekstit diff --git a/lng/lang_Arabic_r1922.lng b/lng/lang_Arabic_r1950.lng similarity index 97% rename from lng/lang_Arabic_r1922.lng rename to lng/lang_Arabic_r1950.lng index 5484a32d1..5535ceeda 100644 --- a/lng/lang_Arabic_r1922.lng +++ b/lng/lang_Arabic_r1950.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL @@ -70,11 +70,11 @@ ETH ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ APPS ﺕﺎﻘﻴﺒﻄﺘﻟﺍ ﻞﻴﻐﺸﺗ ﻲﺋﺎﻘﻠﺗ ﻱﻭﺪﻳ -HDL ﻡﺩﺎﺧ ﺃﺪﺑ -HDL ﺮﻓﺮﻴﺳ ﺃﺪﺑ ﻱﺭﺎﺟ -HDL ﻞﻴﻐﺸﺗ ﻱﺭﺎﺟ -HDL ﺮﻓﺮﻴﺳ ﺍﺪﺑ ﻲﻓ ﻞﺸﻓ -HDL ﻡﺩﺎﺧ ﻞﻴﻤﺤﺗ ﺀﺎﻐﻟﺍ +NBD ﻡﺩﺎﺧ ﺃﺪﺑ +NBD ﺮﻓﺮﻴﺳ ﺃﺪﺑ ﻱﺭﺎﺟ +NBD ﻞﻴﻐﺸﺗ ﻱﺭﺎﺟ +NBD ﺮﻓﺮﻴﺳ ﺍﺪﺑ ﻲﻓ ﻞﺸﻓ +NBD ﻡﺩﺎﺧ ﻞﻴﻤﺤﺗ ﺀﺎﻐﻟﺍ IGR ﺭﺎﺴﻣ ﺔﻴﻔﻠﺨﻟﺍ ﻥﻮﻟ ﺺﻨﻟﺍ ﻥﻮﻟ diff --git a/lng/lang_Bulgarian_r1922.lng b/lng/lang_Bulgarian_r1950.lng similarity index 96% rename from lng/lang_Bulgarian_r1922.lng rename to lng/lang_Bulgarian_r1950.lng index ad6398337..a5b062888 100644 --- a/lng/lang_Bulgarian_r1922.lng +++ b/lng/lang_Bulgarian_r1950.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -70,11 +70,11 @@ ETH режим - стартиране Меню "Приложения" - стартиране Автоматично Ръчно -Стартиране на HDL сървъра -HDL сървърът стартира... -HDL сървърът работи... -Провалено стартиране на HDL сървъра. -HDL сървърът се изключва... +Стартиране на NBD сървъра +NBD сървърът стартира... +NBD сървърът работи... +Провалено стартиране на NBD сървъра. +NBD сървърът се изключва... Изход от игра (IGR) към: Цвят на фона Цвят на текста diff --git a/lng/lang_Cebuano.lng b/lng/lang_Cebuano_r1950.lng similarity index 94% rename from lng/lang_Cebuano.lng rename to lng/lang_Cebuano_r1950.lng index f1287bd2c..cd416a49e 100644 --- a/lng/lang_Cebuano.lng +++ b/lng/lang_Cebuano_r1950.lng @@ -1,5 +1,7 @@ -# Cebuano by Colton Silva -# For Open PS2 Loader v1.0.0 + betas - Official OPL Beta thread @https://www.psx-place.com/threads/open-ps2-loader-language-pack.20547/ +# Translation by Colton Silva +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Cebuano Open PS2 Loader %s Tipigi ang mga pagbag-o @@ -68,11 +70,11 @@ ETH aparato simula mode Mga application simula mode Awto Manwal -Pagsugod sa HDL Server -HDL Server Starting... -HDL Server Running... -Napakyas sa pagsugod sa HDL Server. -Pagdiskarga sa HDL Server. +Pagsugod sa NBD Server +NBD Server Starting... +NBD Server Running... +Napakyas sa pagsugod sa NBD Server. +Pagdiskarga sa NBD Server. IGR path kolor sa background kolor sa teksto diff --git a/lng/lang_Croatian_r1922.lng b/lng/lang_Croatian_r1950.lng similarity index 95% rename from lng/lang_Croatian_r1922.lng rename to lng/lang_Croatian_r1950.lng index 85424a712..ce420be07 100644 --- a/lng/lang_Croatian_r1922.lng +++ b/lng/lang_Croatian_r1950.lng @@ -1,6 +1,6 @@ # Translation by Blacky5678 -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Croatian OPL %s @@ -70,11 +70,11 @@ Pocetni Nacin ETH Uredaja Nacin Prikaza Aplikacijskog Izbornika Automatski Rucno -Zapocni HDL Server -Zapocinjanje HDL Servera... -Pokretanje HDL Servera... -Neuspjesno zapocinjanje HDL Servera. -Gasenje HDL Server... +Zapocni NBD Server +Zapocinjanje NBD Servera... +Pokretanje NBD Servera... +Neuspjesno zapocinjanje NBD Servera. +Gasenje NBD Server... IGR Putanja Boja Pozadine Boja Teksta diff --git a/lng/lang_Czech_r1922.lng b/lng/lang_Czech_r1950.lng similarity index 95% rename from lng/lang_Czech_r1922.lng rename to lng/lang_Czech_r1950.lng index 707b9299f..73e1c104d 100644 --- a/lng/lang_Czech_r1922.lng +++ b/lng/lang_Czech_r1950.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -70,11 +70,11 @@ ETH zařízení při startu Aplikace při startu Auto Manual -Spustit HDL Server -Spouštím HDL Server... -HDL Server běží... -Start HDL Serveru se nezdařil. -Vypínání HDL Serveru... +Spustit NBD Server +Spouštím NBD Server... +NBD Server běží... +Start NBD Serveru se nezdařil. +Vypínání NBD Serveru... Cesta k IGR Barva pozadí Barva textu diff --git a/lng/lang_Danish_r1922.lng b/lng/lang_Danish_r1950.lng similarity index 95% rename from lng/lang_Danish_r1922.lng rename to lng/lang_Danish_r1950.lng index 2a210b4c9..f678c10ae 100644 --- a/lng/lang_Danish_r1922.lng +++ b/lng/lang_Danish_r1950.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -70,11 +70,11 @@ ETH-enhed starttilstand Programmenu visningstilstand Automatisk Manuel -Start HDL-server -HDL-server starter... -HDL-server aktiv... -Kunne ikke starte HDL-server. -HDL-server lukker ned... +Start NBD-server +NBD-server starter... +NBD-server aktiv... +Kunne ikke starte NBD-server. +NBD-server lukker ned... IGR-sti Baggrundsfarve Tekstfarve diff --git a/lng/lang_Dutch_r1922.lng b/lng/lang_Dutch_r1950.lng similarity index 95% rename from lng/lang_Dutch_r1922.lng rename to lng/lang_Dutch_r1950.lng index ea5d8c232..60ad0bd6b 100644 --- a/lng/lang_Dutch_r1922.lng +++ b/lng/lang_Dutch_r1950.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -70,11 +70,11 @@ ETH-apparaat startmodus Applicaties startmodus Auto Handmatig -Start HDL Server -HDL Server starten... -HDL Server uitgevoerd... -Mislukt om HDL Server te starten. -HDL Server lossen... +Start NBD Server +NBD Server starten... +NBD Server uitgevoerd... +Mislukt om NBD Server te starten. +NBD Server lossen... IGR pad Achtergrondkleur Tekstkleur diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 186bf060d..de4fc6a65 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -88,11 +88,11 @@ ETH Device Start Mode Applications Menu Display Mode Auto Manual -Start HDL Server -HDL Server starting... -HDL Server running... -Failed to start HDL Server. -HDL Server unloading... +Start NBD Server +NBD Server starting... +NBD Server running... +Failed to start NBD Server. +NBD Server unloading... IGR Path Background Color Text Color diff --git a/lng/lang_Filipino_r1922.lng b/lng/lang_Filipino_r1950.lng similarity index 95% rename from lng/lang_Filipino_r1922.lng rename to lng/lang_Filipino_r1950.lng index 93343880e..86c9e798b 100644 --- a/lng/lang_Filipino_r1922.lng +++ b/lng/lang_Filipino_r1950.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo and Colton SIlva @ColtonSilvaonKnoxKontor -# Last update: Feb. 19, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -70,11 +70,11 @@ ETH aparato simula mode Mga application na simulan ang mode Awto Manwal -I-sart ang HDL Server -HDL Server Starting... -HDL Server Running... -Bigong i- start ang HDL Server. -HDL Server Unloading... +I-sart ang NBD Server +NBD Server Starting... +NBD Server Running... +Bigong i- start ang NBD Server. +NBD Server Unloading... Lumabas sa kulay ng background kulay ng teksto diff --git a/lng/lang_French_r1922.lng b/lng/lang_French_r1950.lng similarity index 95% rename from lng/lang_French_r1922.lng rename to lng/lang_French_r1950.lng index 449c6fa6e..97a3a245a 100644 --- a/lng/lang_French_r1922.lng +++ b/lng/lang_French_r1950.lng @@ -1,6 +1,6 @@ # Translation by machiavel and Squall -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -70,11 +70,11 @@ Mode de démarrage SMB Mode d'affichage du menu des apps Auto Manuel -Démarrer serveur HDL -Démarrage serveur HDL... -Serveur HDL démarré... -Démarrage serveur HDL échoué. -Déchargement serveur HDL... +Démarrer serveur NBD +Démarrage serveur NBD... +Serveur NBD démarré... +Démarrage serveur NBD échoué. +Déchargement serveur NBD... Chemin IGR Couleur de fond Couleur du texte diff --git a/lng/lang_German_r1922.lng b/lng/lang_German_r1950.lng similarity index 96% rename from lng/lang_German_r1922.lng rename to lng/lang_German_r1950.lng index 2aebfc0d5..95a8c76b2 100644 --- a/lng/lang_German_r1922.lng +++ b/lng/lang_German_r1950.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -70,11 +70,11 @@ ETH Start Modus Anwendungen Menü Anzeigen Automatisch Manuell -Starte HDL Server -HDL Server startet... -HDL Server läuft... -Fehler beim Starten des HDL-Server. -HDL Server entlädt... +Starte NBD Server +NBD Server startet... +NBD Server läuft... +Fehler beim Starten des NBD-Server. +NBD Server entlädt... IGR-Pfad Hintergrundfarbe Textfarbe diff --git a/lng/lang_Greek_r1922.lng b/lng/lang_Greek_r1950.lng similarity index 97% rename from lng/lang_Greek_r1922.lng rename to lng/lang_Greek_r1950.lng index 59f85f469..9cc5a6e39 100644 --- a/lng/lang_Greek_r1922.lng +++ b/lng/lang_Greek_r1950.lng @@ -1,5 +1,5 @@ # Greek Translation by RivalK93 -# Last update: Feb. 01, 2021 +# Last update: May 20, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek @@ -70,11 +70,11 @@ Widescreen Εκκίνηση Μενού Εφαρμογών Αυτόματα Μη αυτόματα -Εκκίνηση Εξυπηρετητή HDL -Γίνεται εκκίνηση Εξυπηρετητή HDL... -Λειτουργία Εξυπηρετητή HDL... -Αποτυχία εκκίνησης Εξυπηρετητή HDL. -Αποφόρτωση Εξυπηρετητή HDL... +Εκκίνηση Εξυπηρετητή NBD +Γίνεται εκκίνηση Εξυπηρετητή NBD... +Λειτουργία Εξυπηρετητή NBD... +Αποτυχία εκκίνησης Εξυπηρετητή NBD. +Αποφόρτωση Εξυπηρετητή NBD... Προορισμός Μετά Από IGR Χρώμα στο Φόντο Χρώμα Γραμματοσειράς diff --git a/lng/lang_Hungarian_r1922.lng b/lng/lang_Hungarian_r1950.lng similarity index 96% rename from lng/lang_Hungarian_r1922.lng rename to lng/lang_Hungarian_r1950.lng index bd6f0f2c7..fbac722ad 100644 --- a/lng/lang_Hungarian_r1922.lng +++ b/lng/lang_Hungarian_r1950.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -70,11 +70,11 @@ ETH eszköz indítási mód Alkalmazások menü megjelenítési mód Automatikus Manuális -HDL szerver indítása -HDL Szerver Elindul... -HDL Szerver Fut... -Az HDL Szerver elindítása Sikertelen. -Az HDL Szerver kirakodása... +NBD szerver indítása +NBD Szerver Elindul... +NBD Szerver Fut... +Az NBD Szerver elindítása Sikertelen. +Az NBD Szerver kirakodása... IGR útvonala Háttér színe Szöveg szín diff --git a/lng/lang_Indonesian_r1922.lng b/lng/lang_Indonesian_r1950.lng similarity index 95% rename from lng/lang_Indonesian_r1922.lng rename to lng/lang_Indonesian_r1950.lng index 3f161ff36..5648b4851 100644 --- a/lng/lang_Indonesian_r1922.lng +++ b/lng/lang_Indonesian_r1950.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -70,11 +70,11 @@ Memulai mode perangkat ETH Memulai mode Aplikasi Otomatis Manual -Mulai Server HDL -Memulai Server HDL ... -Menjalankan Server HDL... -Gagal memulai Server HDL. -Mengembalikan Server HDL... +Mulai Server NBD +Memulai Server NBD ... +Menjalankan Server NBD... +Gagal memulai Server NBD. +Mengembalikan Server NBD... Pintasan IGR Warna latar belakang Warna teks diff --git a/lng/lang_Italian_r1922.lng b/lng/lang_Italian_r1950.lng similarity index 96% rename from lng/lang_Italian_r1922.lng rename to lng/lang_Italian_r1950.lng index e034b2e5f..756638c89 100644 --- a/lng/lang_Italian_r1922.lng +++ b/lng/lang_Italian_r1950.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d and completed by Peppe90 -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -70,11 +70,11 @@ Modalità di Avvio ETH Modalità di Avvio Apps Auto Manuale -Avvia Server HDL +Avvia Server NBD Avvio server in corso... -Server HDL in esecuzione... -Server HDL in chiusura... -Server HDL in scaricamento dalla memoria... +Server NBD in esecuzione... +Server NBD in chiusura... +Server NBD in scaricamento dalla memoria... Percorso IGR Colore dello Sfondo Colore Testo diff --git a/lng/lang_Japanese_r1922.lng b/lng/lang_Japanese_r1950.lng similarity index 96% rename from lng/lang_Japanese_r1922.lng rename to lng/lang_Japanese_r1950.lng index 923d9fbce..d644f79a0 100644 --- a/lng/lang_Japanese_r1922.lng +++ b/lng/lang_Japanese_r1950.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -70,11 +70,11 @@ ETHデバイス開始モード アプリメニュー表示モード 自動 手動 -HDLサーバを開始 -HDLサーバを開始します… -HDLサーバは開始しました -HDLサーバ開始に失敗しました -HDLサーバを取消中… +NBDサーバを開始 +NBDサーバを開始します… +NBDサーバは開始しました +NBDサーバ開始に失敗しました +NBDサーバを取消中… IGRパス 背景色 文字色 diff --git a/lng/lang_Korean_r1922.lng b/lng/lang_Korean_r1950.lng similarity index 96% rename from lng/lang_Korean_r1922.lng rename to lng/lang_Korean_r1950.lng index 978b00410..9e9f34194 100644 --- a/lng/lang_Korean_r1922.lng +++ b/lng/lang_Korean_r1950.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: Feb. 16, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -70,11 +70,11 @@ ETH 장치 시작 모드 응용프로그램 시작 모드 자동 수동 -HDL 서버 시작 -HDL 서버 시작 중... -HDL 서버 가동 중... -HDL 서버 시작 실패 -HDL 서버 업로딩 중... +NBD 서버 시작 +NBD 서버 시작 중... +NBD 서버 가동 중... +NBD 서버 시작 실패 +NBD 서버 업로딩 중... IGR 경로 배경 색상 문자 색상 diff --git a/lng/lang_Laotian_r1922.lng b/lng/lang_Laotian_r1950.lng similarity index 96% rename from lng/lang_Laotian_r1922.lng rename to lng/lang_Laotian_r1950.lng index 37874985d..cb3d2be80 100644 --- a/lng/lang_Laotian_r1922.lng +++ b/lng/lang_Laotian_r1950.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -70,11 +70,11 @@ Remove Settings ໂໝດ ຕ່າງໆສຳລັບໂປຣແກຣມ ອັດຕະໂນມັດ ເລືອກເອງ -ເປີດໃຊ້ HDL Server -HDL Server ກຳລັງເລີ່ມໃຊ້ງານ... -HDL Server ກໍາລັງດໍາເນີນການ... -Failed to start HDL Server. -HDL Server ກໍາລັງຢຸດການໃຊ້ງານ... +ເປີດໃຊ້ NBD Server +NBD Server ກຳລັງເລີ່ມໃຊ້ງານ... +NBD Server ກໍາລັງດໍາເນີນການ... +Failed to start NBD Server. +NBD Server ກໍາລັງຢຸດການໃຊ້ງານ... IGR path ສີຂອງພື້ນຫຼັງ ສີຂອງຂໍ້ຄວາມ diff --git a/lng/lang_Persian_r1922.lng b/lng/lang_Persian_r1950.lng similarity index 97% rename from lng/lang_Persian_r1922.lng rename to lng/lang_Persian_r1950.lng index 40320b4c3..c31183f56 100644 --- a/lng/lang_Persian_r1922.lng +++ b/lng/lang_Persian_r1950.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s @@ -70,11 +70,11 @@ ETH هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ ﺎﻫ ﻪﻣﺎﻧﺮﺑ ﻮﻨﻣ نداد نﺎﺸﻧ رﺎﻛدﻮﺧ ﻲﺘﺳد -HDL روﺮﺳ عوﺮﺷ -...ﺪﺷﺎﺒﻴﻣ یزاﺪﻧا هار لﺎﺣرد HDL روﺮﺳ -...ﺪﺷﺎﺒﻴﻣ اﺮﺟا لﺎﺣرد HDL روﺮﺳ -.درﻮﺧ ﺖﺴﻜﺷ HDL روﺮﺳ یزاﺪﻧا هار -...ﺪﺷﺎﺒﻴﻣ ﻪﻴﻠﺨﺗ لﺎﺣرد HDL روﺮﺳ +NBD روﺮﺳ عوﺮﺷ +...ﺪﺷﺎﺒﻴﻣ یزاﺪﻧا هار لﺎﺣرد NBD روﺮﺳ +...ﺪﺷﺎﺒﻴﻣ اﺮﺟا لﺎﺣرد NBD روﺮﺳ +.درﻮﺧ ﺖﺴﻜﺷ NBD روﺮﺳ یزاﺪﻧا هار +...ﺪﺷﺎﺒﻴﻣ ﻪﻴﻠﺨﺗ لﺎﺣرد NBD روﺮﺳ IGR ﺮﻴﺴﻣ ﻪﻨﻴﻣز ﺲﭘ ﮓﻧر نﻮﺘﻣ ﮓﻧر diff --git a/lng/lang_Polish_r1922.lng b/lng/lang_Polish_r1950.lng similarity index 95% rename from lng/lang_Polish_r1922.lng rename to lng/lang_Polish_r1950.lng index 1144ec660..aafd88e4d 100644 --- a/lng/lang_Polish_r1922.lng +++ b/lng/lang_Polish_r1950.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -70,11 +70,11 @@ Uruchom Urządzenie ETH Wyświetl Menu Aplikacji Automatyczny Ręcznie -Uruchom Serwer HDL -Uruchamianie Serwera HDL... -Serwer HDL uruchomiony... -Nieudane uruchomienie serwera HDL. -Serwer HDL zostanie zamknięty... +Uruchom Serwer NBD +Uruchamianie Serwera NBD... +Serwer NBD uruchomiony... +Nieudane uruchomienie serwera NBD. +Serwer NBD zostanie zamknięty... Ścieżka Dla IGR Kolor Tła Kolor Tekstu diff --git a/lng/lang_Portuguese_BR_r1922.lng b/lng/lang_Portuguese_BR_r1950.lng similarity index 96% rename from lng/lang_Portuguese_BR_r1922.lng rename to lng/lang_Portuguese_BR_r1950.lng index 033c1644b..752c4f672 100644 --- a/lng/lang_Portuguese_BR_r1922.lng +++ b/lng/lang_Portuguese_BR_r1950.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -70,11 +70,11 @@ Modo de início do dispositivo REDE Modo de início dos Aplicativos Automático Manual -Iniciar servidor HDL -Iniciando Servidor HDL... -Servidor HDL conectado... -Falha na inicialização do Servidor HDL. -Fechando servidor HDL... +Iniciar servidor NBD +Iniciando Servidor NBD... +Servidor NBD conectado... +Falha na inicialização do Servidor NBD. +Fechando servidor NBD... Sair para Cor do fundo Cor do texto diff --git a/lng/lang_Portuguese_r1922.lng b/lng/lang_Portuguese_r1950.lng similarity index 95% rename from lng/lang_Portuguese_r1922.lng rename to lng/lang_Portuguese_r1950.lng index cd7adb4e8..d93844643 100644 --- a/lng/lang_Portuguese_r1922.lng +++ b/lng/lang_Portuguese_r1950.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -70,11 +70,11 @@ Modo de inicio para dispositivo Rede Modo de inicio para Aplicações Automático Manual -Iniciar servidor HDL -Servidor HDL a iniciar... -Servidor HDL a executar... -Erro a iniciar o servidor de HDL Dump. -Servidor HDL a fechar... +Iniciar servidor NBD +Servidor NBD a iniciar... +Servidor NBD a executar... +Erro a iniciar o servidor de NBD Dump. +Servidor NBD a fechar... Definir saída do IGR Cor de fundo Cor do texto diff --git a/lng/lang_Romanian_r1922.lng b/lng/lang_Romanian_r1950.lng similarity index 95% rename from lng/lang_Romanian_r1922.lng rename to lng/lang_Romanian_r1950.lng index 94b237edc..7c651c41e 100644 --- a/lng/lang_Romanian_r1922.lng +++ b/lng/lang_Romanian_r1950.lng @@ -1,6 +1,6 @@ # Romanian translation by MRAdyy -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Romanian Open PS2 Loader %s @@ -70,11 +70,11 @@ Modul de pornire al dispozitivului Retea Modul de pornire aplicatii Automat Manual -Pornire server HDL -Se porneste serverul HDL... -Serverul HDL ruleaza... -Failed to start HDL Server. -Serverul HDL se descarca... +Pornire server NBD +Se porneste serverul NBD... +Serverul NBD ruleaza... +Failed to start NBD Server. +Serverul NBD se descarca... cale IGR Culoare fundal Culoare text diff --git a/lng/lang_Russian_r1922.lng b/lng/lang_Russian_r1950.lng similarity index 96% rename from lng/lang_Russian_r1922.lng rename to lng/lang_Russian_r1950.lng index 8358dae89..6eb7a101b 100644 --- a/lng/lang_Russian_r1922.lng +++ b/lng/lang_Russian_r1950.lng @@ -1,6 +1,6 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -70,11 +70,11 @@ OPL %s Режим показа Приложений Авто Вручную -Запуск HDL сервера -HDL сервер запускается... -HDL-сервер запущен... -Не удалось запустить HDL-сервер. -Остановка HDL сервера... +Запуск NBD сервера +NBD сервер запускается... +NBD-сервер запущен... +Не удалось запустить NBD-сервер. +Остановка NBD сервера... ELF при вызове IGR Цвет фона Цвет текста diff --git a/lng/lang_SChinese_r1922.lng b/lng/lang_SChinese_r1950.lng similarity index 94% rename from lng/lang_SChinese_r1922.lng rename to lng/lang_SChinese_r1950.lng index a31d7220e..d5008591e 100644 --- a/lng/lang_SChinese_r1922.lng +++ b/lng/lang_SChinese_r1950.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese OPL %s @@ -70,11 +70,11 @@ ETH 设备启动模式 应用程序启动模式 自动 手动 -启动 HDL 服务 -HDL 服务启动中... -HDL 服务正在运行... -启动 HDL 服务时出错. -HDL 服务未能读取... +启动 NBD 服务 +NBD 服务启动中... +NBD 服务正在运行... +启动 NBD 服务时出错. +NBD 服务未能读取... IGR 位置 背景颜色 文字颜色 diff --git a/lng/lang_Spanish_r1922.lng b/lng/lang_Spanish_r1950.lng similarity index 95% rename from lng/lang_Spanish_r1922.lng rename to lng/lang_Spanish_r1950.lng index f4f9f01e3..4a70b68ad 100644 --- a/lng/lang_Spanish_r1922.lng +++ b/lng/lang_Spanish_r1950.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -70,11 +70,11 @@ Modo de inicio para Red Modo inicio de menú de Aplicaciones Automático Manual -Iniciar servidor HDLDump -Iniciando servidor HDLDump... -Servidor HDLDump conectado... -Error al iniciar el servidor HDLDump. -Cerrando servidor HDLDump... +Iniciar servidor NBDDump +Iniciando servidor NBDDump... +Servidor NBDDump conectado... +Error al iniciar el servidor NBDDump. +Cerrando servidor NBDDump... Ruta del IGR Color de fondo Color de texto diff --git a/lng/lang_Swedish_r1922.lng b/lng/lang_Swedish_r1950.lng similarity index 95% rename from lng/lang_Swedish_r1922.lng rename to lng/lang_Swedish_r1950.lng index 1ef1a2352..fcb0f52ac 100644 --- a/lng/lang_Swedish_r1922.lng +++ b/lng/lang_Swedish_r1950.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -70,11 +70,11 @@ ETH enhet startläge APP-meny visningsläge Auto Manuell -Starta HDL Server -HDL Server Startar ... -HDL Server Running... -Kan inte starta HDL server. -HDL Server Stängs... +Starta NBD Server +NBD Server Startar ... +NBD Server Running... +Kan inte starta NBD server. +NBD Server Stängs... Utgång till Bakgrundsfärg Textfärg diff --git a/lng/lang_TChinese_r1922.lng b/lng/lang_TChinese_r1950.lng similarity index 94% rename from lng/lang_TChinese_r1922.lng rename to lng/lang_TChinese_r1950.lng index 5303a2a03..d5160cccf 100644 --- a/lng/lang_TChinese_r1922.lng +++ b/lng/lang_TChinese_r1950.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -70,11 +70,11 @@ ETH 設備啟動模式 應用程序啟動模式 自動 手動 -啟動 HDL 服務 -HDL 服務啟動中... -HDL 服務正在運行... -啟動 HDL 服務時出錯. -HDL 服務未能讀取... +啟動 NBD 服務 +NBD 服務啟動中... +NBD 服務正在運行... +啟動 NBD 服務時出錯. +NBD 服務未能讀取... IGR 位置 背景顏色 文字顏色 diff --git a/lng/lang_Turkish_r1922.lng b/lng/lang_Turkish_r1950.lng similarity index 95% rename from lng/lang_Turkish_r1922.lng rename to lng/lang_Turkish_r1950.lng index 4ac815cbf..cc8629392 100644 --- a/lng/lang_Turkish_r1922.lng +++ b/lng/lang_Turkish_r1950.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -70,11 +70,11 @@ AĞ cihazı başlangıç türü Uygulamalar menüsü görünüm kipi Otomatik El ile -HDL Sunucu Başlat -HDL Sunucu Başlatma Hatası -HDL Sunucu Başlıyor... -HDL Sunucu Çalışıyor... -HDL Sunucu Durduruluyor... +NBD Sunucu Başlat +NBD Sunucu Başlatma Hatası +NBD Sunucu Başlıyor... +NBD Sunucu Çalışıyor... +NBD Sunucu Durduruluyor... IGR yeri Arkaplan rengi Metin rengi diff --git a/lng/lang_Vietnamese_r1922.lng b/lng/lang_Vietnamese_r1950.lng similarity index 95% rename from lng/lang_Vietnamese_r1922.lng rename to lng/lang_Vietnamese_r1950.lng index a7627b140..e9d7c00ff 100644 --- a/lng/lang_Vietnamese_r1922.lng +++ b/lng/lang_Vietnamese_r1950.lng @@ -1,6 +1,6 @@ # Translation by zidane89 -# Last update: Feb. 01, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: May 20, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese OPL %s @@ -70,11 +70,11 @@ Chọn ETH Hiển thị menu ứng dụng Tự động Thủ công -Khởi chạy máy chủ HDL -Máy chủ HDL khởi chạy... -Máy chủ HDL đang chạy... -khởi chạy máy chủ HDL thất bại. -Không nạp được máy chủ HDL... +Khởi chạy máy chủ NBD +Máy chủ NBD khởi chạy... +Máy chủ NBD đang chạy... +khởi chạy máy chủ NBD thất bại. +Không nạp được máy chủ NBD... Vá IGR Màu nền Màu chữ From aea2685631a3f3dedcf83df1a5d5078a41ff0656 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 25 May 2021 15:09:12 -0700 Subject: [PATCH 230/269] update lang files --- lng/lang_Cebuano_r1950.lng | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lng/lang_Cebuano_r1950.lng b/lng/lang_Cebuano_r1950.lng index cd416a49e..2a187ad39 100644 --- a/lng/lang_Cebuano_r1950.lng +++ b/lng/lang_Cebuano_r1950.lng @@ -282,3 +282,12 @@ Genre Buhian Debeloper Paghulagway +PS1 Games +PS1 Games Display Mode +POPSTARTER.ELF not found at '%s'! +VCD file '%s' not found! +An error occurred while renaming the file. +An error occurred while deleting the file. +Never buy OPEN-PS2-LOADER (OPL), instead get it free at: +ifcaro OPL version at psx-place.com +OPL Daily Builds (DB) version at ps2-home.com From fe01ea9088a0404db53ee8d2907f40c4128338ad Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 29 Jun 2021 23:22:07 -0700 Subject: [PATCH 231/269] test fix --- elfldr/elfldr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/elfldr/elfldr.c b/elfldr/elfldr.c index 0146ebfe4..4af47dcd5 100644 --- a/elfldr/elfldr.c +++ b/elfldr/elfldr.c @@ -14,7 +14,7 @@ #include #include -//START of OPL_DB tweaks +// START of OPL_DB tweaks // ELF-loading stuff #define ELF_MAGIC 0x464c457f #define ELF_PT_LOAD 1 @@ -50,7 +50,7 @@ typedef struct u32 flags; u32 align; } elf_pheader_t; -//END of OPL_DB tweaks +// END of OPL_DB tweaks /* static inline void _strcpy(char *dst, const char *src) { From 7969490b0b64b8d63227454069160b21dd09eb54 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 12 Jul 2021 18:48:34 -0700 Subject: [PATCH 232/269] clang-format file --- elfldr/elfldr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/elfldr/elfldr.c b/elfldr/elfldr.c index 4af47dcd5..ee19ec9ba 100644 --- a/elfldr/elfldr.c +++ b/elfldr/elfldr.c @@ -16,7 +16,7 @@ // START of OPL_DB tweaks // ELF-loading stuff -#define ELF_MAGIC 0x464c457f +#define ELF_MAGIC 0x464c457f #define ELF_PT_LOAD 1 @@ -279,4 +279,4 @@ int main(int argc, char *argv[]) BootError(argv[0]); return 0; -} +} \ No newline at end of file From 88861c8191b0f993f8b8df492c427a256b489af1 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 13 Jul 2021 14:59:44 -0700 Subject: [PATCH 233/269] mega not necessary for this fork --- .github/workflows/compilation.yml | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/.github/workflows/compilation.yml b/.github/workflows/compilation.yml index 3aeaa7f4d..a8ea6608d 100644 --- a/.github/workflows/compilation.yml +++ b/.github/workflows/compilation.yml @@ -177,21 +177,3 @@ jobs: OPNPS2LD-VARIANTS-${{ steps.version.outputs.version }}.7z OPNPS2LD.7z OPNPS2LD-VARIANTS.7z - - - name: Upload pre-release to Mega - if: github.ref == 'refs/heads/master' - uses: Difegue/action-megacmd@master - with: - args: put -c OPNPS2LD.7z /OPL/Pre-Release/${{ steps.version.outputs.version }}/ - env: - USERNAME: ${{ secrets.USERNAME }} - PASSWORD: ${{ secrets.PASSWORD }} - - - name: Upload release to Mega - if: startsWith(github.ref, 'refs/tags/v') - uses: Difegue/action-megacmd@master - with: - args: put -c OPNPS2LD.7z /OPL/Release/${{ steps.version.outputs.version }}/ - env: - USERNAME: ${{ secrets.USERNAME }} - PASSWORD: ${{ secrets.PASSWORD }} From ece82c68a1b346ea8ae2a6fa5321d19a3a6bddd3 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 22 Jul 2021 02:49:45 -0700 Subject: [PATCH 234/269] update lang files --- ...nian_r1950.lng => lang_Albanian_r2027.lng} | 10 ++-- ...Arabic_r1950.lng => lang_Arabic_r2027.lng} | 10 ++-- ...ian_r1950.lng => lang_Bulgarian_r2027.lng} | 10 ++-- ...buano_r1950.lng => lang_Cebuano_r2027.lng} | 10 ++-- ...tian_r1950.lng => lang_Croatian_r2027.lng} | 10 ++-- ...g_Czech_r1950.lng => lang_Czech_r2027.lng} | 10 ++-- ...Danish_r1950.lng => lang_Danish_r2027.lng} | 10 ++-- ...g_Dutch_r1950.lng => lang_Dutch_r2027.lng} | 10 ++-- ...pino_r1950.lng => lang_Filipino_r2027.lng} | 10 ++-- ...French_r1950.lng => lang_French_r2027.lng} | 10 ++-- ...German_r1950.lng => lang_German_r2027.lng} | 10 ++-- ...g_Greek_r1950.lng => lang_Greek_r2027.lng} | 10 ++-- ...ian_r1950.lng => lang_Hungarian_r2027.lng} | 10 ++-- ...an_r1950.lng => lang_Indonesian_r2027.lng} | 12 ++-- ...alian_r1950.lng => lang_Italian_r2027.lng} | 16 +++--- ...nese_r1950.lng => lang_Japanese_r2027.lng} | 10 ++-- ...Korean_r1950.lng => lang_Korean_r2027.lng} | 10 ++-- ...otian_r1950.lng => lang_Laotian_r2027.lng} | 14 +++-- ...rsian_r1950.lng => lang_Persian_r2027.lng} | 10 ++-- ...Polish_r1950.lng => lang_Polish_r2027.lng} | 12 ++-- ...r1950.lng => lang_Portuguese_BR_r2027.lng} | 10 ++-- ...se_r1950.lng => lang_Portuguese_r2027.lng} | 14 +++-- ...nian_r1950.lng => lang_Romanian_r2027.lng} | 10 ++-- ...ssian_r1950.lng => lang_Russian_r2027.lng} | 10 ++-- ...nese_r1950.lng => lang_SChinese_r2027.lng} | 10 ++-- ...anish_r1950.lng => lang_Spanish_r2027.lng} | 10 ++-- ...edish_r1950.lng => lang_Swedish_r2027.lng} | 12 ++-- ...nese_r1950.lng => lang_TChinese_r2027.lng} | 10 ++-- ...rkish_r1950.lng => lang_Turkish_r2027.lng} | 12 ++-- ...se_r1950.lng => lang_Vietnamese_r2027.lng} | 56 ++++++++++--------- 30 files changed, 214 insertions(+), 154 deletions(-) rename lng/{lang_Albanian_r1950.lng => lang_Albanian_r2027.lng} (96%) rename lng/{lang_Arabic_r1950.lng => lang_Arabic_r2027.lng} (98%) rename lng/{lang_Bulgarian_r1950.lng => lang_Bulgarian_r2027.lng} (97%) rename lng/{lang_Cebuano_r1950.lng => lang_Cebuano_r2027.lng} (96%) rename lng/{lang_Croatian_r1950.lng => lang_Croatian_r2027.lng} (96%) rename lng/{lang_Czech_r1950.lng => lang_Czech_r2027.lng} (96%) rename lng/{lang_Danish_r1950.lng => lang_Danish_r2027.lng} (96%) rename lng/{lang_Dutch_r1950.lng => lang_Dutch_r2027.lng} (96%) rename lng/{lang_Filipino_r1950.lng => lang_Filipino_r2027.lng} (96%) rename lng/{lang_French_r1950.lng => lang_French_r2027.lng} (96%) rename lng/{lang_German_r1950.lng => lang_German_r2027.lng} (96%) rename lng/{lang_Greek_r1950.lng => lang_Greek_r2027.lng} (97%) rename lng/{lang_Hungarian_r1950.lng => lang_Hungarian_r2027.lng} (96%) rename lng/{lang_Indonesian_r1950.lng => lang_Indonesian_r2027.lng} (96%) rename lng/{lang_Italian_r1950.lng => lang_Italian_r2027.lng} (96%) rename lng/{lang_Japanese_r1950.lng => lang_Japanese_r2027.lng} (97%) rename lng/{lang_Korean_r1950.lng => lang_Korean_r2027.lng} (96%) rename lng/{lang_Laotian_r1950.lng => lang_Laotian_r2027.lng} (97%) rename lng/{lang_Persian_r1950.lng => lang_Persian_r2027.lng} (98%) rename lng/{lang_Polish_r1950.lng => lang_Polish_r2027.lng} (96%) rename lng/{lang_Portuguese_BR_r1950.lng => lang_Portuguese_BR_r2027.lng} (96%) rename lng/{lang_Portuguese_r1950.lng => lang_Portuguese_r2027.lng} (95%) rename lng/{lang_Romanian_r1950.lng => lang_Romanian_r2027.lng} (96%) rename lng/{lang_Russian_r1950.lng => lang_Russian_r2027.lng} (97%) rename lng/{lang_SChinese_r1950.lng => lang_SChinese_r2027.lng} (95%) rename lng/{lang_Spanish_r1950.lng => lang_Spanish_r2027.lng} (96%) rename lng/{lang_Swedish_r1950.lng => lang_Swedish_r2027.lng} (96%) rename lng/{lang_TChinese_r1950.lng => lang_TChinese_r2027.lng} (95%) rename lng/{lang_Turkish_r1950.lng => lang_Turkish_r2027.lng} (96%) rename lng/{lang_Vietnamese_r1950.lng => lang_Vietnamese_r2027.lng} (91%) diff --git a/lng/lang_Albanian_r1950.lng b/lng/lang_Albanian_r2027.lng similarity index 96% rename from lng/lang_Albanian_r1950.lng rename to lng/lang_Albanian_r2027.lng index 980d7ba22..37289899c 100644 --- a/lng/lang_Albanian_r1950.lng +++ b/lng/lang_Albanian_r2027.lng @@ -1,6 +1,6 @@ # Translation by LoniTheFricc -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Albanian OPL %s @@ -64,7 +64,7 @@ Duke Ngarkuar Konfigurimin... Duke Ruajtur Konfigurimin... Fillo Pajisjen Rifresko -Moda e Fillimit të USB-s +Moda e Fillimit të BDM-s Moda e Fillimit të HDD-s Moda e Fillimit të ETH-it Moda e Shfaqjes së Aplikacioneve @@ -137,7 +137,7 @@ Rifreskim Automatik Për Ne Koduesit Sigurimi i Cilësisë -Rruga e Parashtesës se USB-s +Rruga e Parashtesës se BDM-s Hap një ELF te Modifikuar mbas një IGR. Vlera në minuta(s),0 të çaktivizosh Ngadalsimin e Rrotullimit. Ngadalsim Auto Rrotullimit së HDD-së. @@ -282,6 +282,8 @@ Zhanri Publikimi Zhvilluesi Përshkrimi +BDM Games +Select Block Devices Lojrat PS1 Moda e Shfaqjes se Lojrave PS1 POPSTARTER.ELF nuk është gjetur tek '%s'! diff --git a/lng/lang_Arabic_r1950.lng b/lng/lang_Arabic_r2027.lng similarity index 98% rename from lng/lang_Arabic_r1950.lng rename to lng/lang_Arabic_r2027.lng index 5535ceeda..7bed207a2 100644 --- a/lng/lang_Arabic_r1950.lng +++ b/lng/lang_Arabic_r2027.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL @@ -64,7 +64,7 @@ SMB ﺔﻤﺋﺎﻗ ﺔﻛﺭﺎﺸﻣ ﻦﻜﻤﻳﻻ ﻦﻳﻮﻜﺘﻟﺍ ﻆﻔﺣ ﺯﺎﻬﺠﻟﺍ ﺃﺪﺑ ﺚﻳﺪﺤﺗ -USB ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ +BDM ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ HDD ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ ETH ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ APPS ﺕﺎﻘﻴﺒﻄﺘﻟﺍ ﻞﻴﻐﺸﺗ @@ -137,7 +137,7 @@ d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞ ﻝﻮﺣ ﻥﻮﺠﻣﺮﺒﻤﻟﺍ ﺓﺩﻮﺠﻟﺍ ﻥﺎﻤﺿ -USB ﺔﺋﺩﺎﺑ ﺭﺎﺴﻣ +BDM ﺔﺋﺩﺎﺑ ﺭﺎﺴﻣ ﺔﺒﻌﻠﻟﺍ ﻞﺧﺍﺩ ﻦﻣ ﺖﻴﺳﺮﺘﻟﺍ ﺪﻌﺑ ﺹﺎﺧ ﻖﻴﺒﻄﺗ ﻞﻴﻐﺸﺗ ﻥﺍﺭﻭﺪﻟﺍ ﻁﻮﺒﻫ ﻞﻴﻄﻌﺗ ﺮﻔﺻ ،ﺔﻘﻴﻗﺪﻟﺍ ﻲﻓ ﺔﻤﻴﻘﻟﺍ ﺐﻠﺼﻟﺍ ﺹﺮﻘﻟﺍ ﻥﺍﺭﻭﺩ ﻁﻮﺒﻫ ﻲﺋﺎﻘﻠﺗ @@ -282,6 +282,8 @@ s% ﻦﻣ ﻞﻤﺤﻣ s% ﺭﺍﺪﺻﻻﺍ ﺭﻮﻄﻣ ﻒﺻﻭ +BDM Games +Select Block Devices PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_Bulgarian_r1950.lng b/lng/lang_Bulgarian_r2027.lng similarity index 97% rename from lng/lang_Bulgarian_r1950.lng rename to lng/lang_Bulgarian_r2027.lng index a5b062888..850446a36 100644 --- a/lng/lang_Bulgarian_r1950.lng +++ b/lng/lang_Bulgarian_r2027.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -64,7 +64,7 @@ X (Хикс) Запазвам настройките... Стартиране на устройството Опресни -USB режим - стартиране +BDM режим - стартиране HDD режим - стартиране ETH режим - стартиране Меню "Приложения" - стартиране @@ -137,7 +137,7 @@ VMC файлът трябва да бъде създаден. Относно Програмисти: Качествен контрол от: -USB поддиректория +BDM поддиректория Оставете свободно, за изход към PS2 Browser Стойност в минути, 0 за деактивиране Автоматично спиране на HDD след @@ -282,6 +282,8 @@ Options Издадена Производител Описание +BDM Games +Select Block Devices PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Cebuano_r1950.lng b/lng/lang_Cebuano_r2027.lng similarity index 96% rename from lng/lang_Cebuano_r1950.lng rename to lng/lang_Cebuano_r2027.lng index 2a187ad39..472e122d3 100644 --- a/lng/lang_Cebuano_r1950.lng +++ b/lng/lang_Cebuano_r2027.lng @@ -1,6 +1,6 @@ # Translation by Colton Silva -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Cebuano Open PS2 Loader %s @@ -64,7 +64,7 @@ Nilo-load ang config Sine-save ang config Pagsugod sa Device Pagpalagsik -USB aparato simula mode +BDM aparato simula mode HDD aparato simula mode ETH aparato simula mode Mga application simula mode @@ -137,7 +137,7 @@ Awtomatikong i-refresh Mahitungod sa Mga coder Kalidad nga Pasalig -USB prefix path +BDM prefix path Ang botas nga gipasadya nga ELF pagkahuman sa usa ka IGR. Balor sa (mga) minuto, 0 aron dili paganahon Ang HDD hinay nga mohinay @@ -282,6 +282,8 @@ Genre Buhian Debeloper Paghulagway +BDM Games +Select Block Devices PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Croatian_r1950.lng b/lng/lang_Croatian_r2027.lng similarity index 96% rename from lng/lang_Croatian_r1950.lng rename to lng/lang_Croatian_r2027.lng index ce420be07..b40328738 100644 --- a/lng/lang_Croatian_r1950.lng +++ b/lng/lang_Croatian_r2027.lng @@ -1,6 +1,6 @@ # Translation by Blacky5678 -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Croatian OPL %s @@ -64,7 +64,7 @@ Ucitavanje konfiguracije... Spremanje konfiguracije... Zapocni Uredaj Osvjezi -Pocetni Nacin USB Uredaja +Pocetni Nacin BDM Uredaja Pocetni Nacin HDD Uredaja Pocetni Nacin ETH Uredaja Nacin Prikaza Aplikacijskog Izbornika @@ -137,7 +137,7 @@ Automatsko Osvjezavanje O Koderi Osiguranje Kvalitete -Putanja USB Prefiksa +Putanja BDM Prefiksa Pokrece prilagodeni ELF nakon IGR-a. Vrijednost u minutama, 0 za onemogucivanje zavrtanja. Automatsko Zavrtanje HDD-a @@ -282,6 +282,8 @@ Genre Release Developer Description +BDM Games +Select Block Devices PS1 Igre Nacin Prikaza PS1 Igara POPSTARTER.ELF nije pronaden kod '%s'! diff --git a/lng/lang_Czech_r1950.lng b/lng/lang_Czech_r2027.lng similarity index 96% rename from lng/lang_Czech_r1950.lng rename to lng/lang_Czech_r2027.lng index 73e1c104d..be8db5da3 100644 --- a/lng/lang_Czech_r1950.lng +++ b/lng/lang_Czech_r2027.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -64,7 +64,7 @@ Nahrávám konfiguraci Ukládám konfiguraci Zapnout zařízení Obnovit -USB zařízení při startu +BDM zařízení při startu HDD zařízení při startu ETH zařízení při startu Aplikace při startu @@ -137,7 +137,7 @@ Automatické obnovení O aplikaci Kodéři Kontrola kvality -prefix cesty k USB +prefix cesty k BDM Načíst svůj ELF po IGR Hodnota v minutách, 0 pro vypnutí spin-down disku Automatický HDD spin-down @@ -282,6 +282,8 @@ Genre Release Developer Description +BDM Games +Select Block Devices PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish_r1950.lng b/lng/lang_Danish_r2027.lng similarity index 96% rename from lng/lang_Danish_r1950.lng rename to lng/lang_Danish_r2027.lng index f678c10ae..2fdcbc124 100644 --- a/lng/lang_Danish_r1950.lng +++ b/lng/lang_Danish_r2027.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -64,7 +64,7 @@ Indlæser indstillinger Gemmer indstillinger Start enhed Genindlæs -USB-enhed starttilstand +BDM-enhed starttilstand HDD-enhed starttilstand ETH-enhed starttilstand Programmenu visningstilstand @@ -137,7 +137,7 @@ Automatisk opdatering Om Kodere Kvalitetstestere -USB-præfiks sti +BDM-præfiks sti Starter brugerdefineret ELF efter en IGR Værdi i minuttet(r), 0 for at deaktivere spindown Automatisk harddisk spindown @@ -282,6 +282,8 @@ Genre Release Developer Description +BDM Games +Select Block Devices PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch_r1950.lng b/lng/lang_Dutch_r2027.lng similarity index 96% rename from lng/lang_Dutch_r1950.lng rename to lng/lang_Dutch_r2027.lng index 60ad0bd6b..6b87bf22f 100644 --- a/lng/lang_Dutch_r1950.lng +++ b/lng/lang_Dutch_r2027.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -64,7 +64,7 @@ Configuratie laden Configuratie opslaan Start apparaat Vernieuwen -USB-apparaat startmodus +BDM-apparaat startmodus HDD-apparaat startmodus ETH-apparaat startmodus Applicaties startmodus @@ -137,7 +137,7 @@ Automatisch vernieuwen Over Coders Kwaliteitsgarantie -USB-prefix pad +BDM-prefix pad Start aangepaste ELF na een IGR Waarde in minuten, 0 om spin down uit te schakelen Automatische HDD spin down @@ -282,6 +282,8 @@ Genre Release Developer Description +BDM Games +Select Block Devices PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Filipino_r1950.lng b/lng/lang_Filipino_r2027.lng similarity index 96% rename from lng/lang_Filipino_r1950.lng rename to lng/lang_Filipino_r2027.lng index 86c9e798b..cb4c83b3d 100644 --- a/lng/lang_Filipino_r1950.lng +++ b/lng/lang_Filipino_r2027.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo and Colton SIlva @ColtonSilvaonKnoxKontor -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -64,7 +64,7 @@ Nilo-load ang config Sine-save ang config Simulan ang aparato Refresh -USB aparato simula mode +BDM aparato simula mode HDD aparato simula mode ETH aparato simula mode Mga application na simulan ang mode @@ -137,7 +137,7 @@ Awtomatikong i-refresh Tungkol sa Mga coders Quality Assurance -USB prefix path +BDM prefix path Ibo-boot ang Custom ELF pagtapos ng IGR Value sa (mga) minuto, 0 upang huwag paganahin Awtomatikong pababagalin ang HDD @@ -282,6 +282,8 @@ Genre Nai-eelease Debeloper Deskripsyon +BDM Games +Select Block Devices PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French_r1950.lng b/lng/lang_French_r2027.lng similarity index 96% rename from lng/lang_French_r1950.lng rename to lng/lang_French_r2027.lng index 97a3a245a..0b368cd6b 100644 --- a/lng/lang_French_r1950.lng +++ b/lng/lang_French_r2027.lng @@ -1,6 +1,6 @@ # Translation by machiavel and Squall -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -64,7 +64,7 @@ Chargement config... Sauvegarde config... Démarrer le périphérique Rafraîchir -Mode de démarrage USB +Mode de démarrage BDM Mode de démarrage HDD Mode de démarrage SMB Mode d'affichage du menu des apps @@ -137,7 +137,7 @@ Rafraîchissement automatique À propos Codeurs Assurance qualité -Préfixe du chemin USB +Préfixe du chemin BDM Lancer ELF perso après un IGR. En minute(s), 0 pour désactiver l'arrêt automatique. Arrêt auto. HDD @@ -282,6 +282,8 @@ Genre Mise à jour Développeur Description +BDM Games +Select Block Devices PS1 Games Mode d'affichage des jeux PS1 POPSTARTER.ELF non trouvé à '%s'! diff --git a/lng/lang_German_r1950.lng b/lng/lang_German_r2027.lng similarity index 96% rename from lng/lang_German_r1950.lng rename to lng/lang_German_r2027.lng index 95a8c76b2..11421a99f 100644 --- a/lng/lang_German_r1950.lng +++ b/lng/lang_German_r2027.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -64,7 +64,7 @@ Lade Konfiguration Speichere Konfiguration Peripherie starten Aktual. -USB Start Modus +BDM Geräte Startmodus HDD Start Modus ETH Start Modus Anwendungen Menü Anzeigen @@ -137,7 +137,7 @@ Automatisch aktualisieren Über Programmierer Qualitätssicherung -USB Präfix Pfad +BDM Präfix Pfad Startet benutzerdef. ELF nach einem IGR Wert in Minuten, 0 um Abschaltung der Festplatte zu deaktivieren Autom. Abschaltung der Festplatte @@ -282,6 +282,8 @@ Genre Veröffentlichung Entwickler Beschreibung +BDM Spiele +Select Block Devices PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek_r1950.lng b/lng/lang_Greek_r2027.lng similarity index 97% rename from lng/lang_Greek_r1950.lng rename to lng/lang_Greek_r2027.lng index 9cc5a6e39..3cc781f28 100644 --- a/lng/lang_Greek_r1950.lng +++ b/lng/lang_Greek_r2027.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-1922-DB_all-f1ee78a-2021-02-01 and OPNPS2LD-v1.1.0-Beta-1617-ifcaro_all-4260147-2021-01-31 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -64,7 +64,7 @@ Widescreen Αποθήκευση ρυθμίσεων... Εκκίνηση Συσκευής Ανανέωση -Εκκίνηση Λειτουργίας USB +Εκκίνηση Λειτουργίας BDM Εκκίνηση Λειτουργίας HDD Εκκίνηση Λειτουργίας ETH Εκκίνηση Μενού Εφαρμογών @@ -137,7 +137,7 @@ VMC Γενικής Χρήσης Σχετικά Προγραμματιστές Διασφάλιση Ποιότητας -Πρόθεμα Μονοπατιού USB +Πρόθεμα Μονοπατιού BDM Εκκίνηση του ορισμένου ELF μετά από In-Game-Reset. Τιμή σε λεπτά, 0 για απενεργοποίηση του spin-down. Αυτόματο Spin-Down του HDD @@ -282,6 +282,8 @@ Forum Υποστήριξης: Κυκλοφορία Προγραμματιστής Περιγραφή +BDM Games +Select Block Devices Παιχνίδια PS1 Εκκίνηση μενού Παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian_r1950.lng b/lng/lang_Hungarian_r2027.lng similarity index 96% rename from lng/lang_Hungarian_r1950.lng rename to lng/lang_Hungarian_r2027.lng index fbac722ad..944b1f6e6 100644 --- a/lng/lang_Hungarian_r1950.lng +++ b/lng/lang_Hungarian_r2027.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -64,7 +64,7 @@ Konfiguráció betöltése Konfiguráció mentése Eszköz indítása Frissítés -USB eszköz indítási mód +BDM eszköz indítási mód HDD eszköz indítási mód ETH eszköz indítási mód Alkalmazások menü megjelenítési mód @@ -137,7 +137,7 @@ Automatikus frissítés Névjegy Kódolók Minőségbiztosítás -USB előtag elérési út +BDM előtag elérési út Testreszabott ELF bootolása egy IGR után Érték perc(ek)ben, 0 a kikapcsolás letiltására Automatikus Merevlemez kikapcsolás @@ -282,6 +282,8 @@ Műfaj Megjelenés Fejlesztő Leírás +BDM Games +Select Block Devices PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian_r1950.lng b/lng/lang_Indonesian_r2027.lng similarity index 96% rename from lng/lang_Indonesian_r1950.lng rename to lng/lang_Indonesian_r2027.lng index 867d749ac..b2f2e3a8b 100644 --- a/lng/lang_Indonesian_r1950.lng +++ b/lng/lang_Indonesian_r2027.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -64,7 +64,7 @@ Memuat konfigurasi Menyimpan konfigurasi Memulai perangkat Segarkan -Memulai mode perangkat USB +Memulai mode perangkat BDM Memulai mode perangkat HDD Memulai mode perangkat ETH Memulai mode Aplikasi @@ -78,7 +78,7 @@ Mengembalikan Server NBD... Pintasan IGR Warna latar belakang Warna teks -- PS2 - +- PS2 - - SMB Server - Jenis alamat IP Statis @@ -137,7 +137,7 @@ Segarkan otomatis Tentang Pengkode Kualitas jaminan -Awalan pintas USB +Awalan pintas BDM Jalankan ELF Kustom setelah IGR Nilai dalam menit (s), 0 untuk menonaktifkan berhenti HDD Otomatis berhenti @@ -282,6 +282,8 @@ Aliran Rilis Pengembang Deskripsi +BDM Games +Select Block Devices PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian_r1950.lng b/lng/lang_Italian_r2027.lng similarity index 96% rename from lng/lang_Italian_r1950.lng rename to lng/lang_Italian_r2027.lng index 74990574e..572307d33 100644 --- a/lng/lang_Italian_r1950.lng +++ b/lng/lang_Italian_r2027.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d and completed by Peppe90 -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -42,7 +42,7 @@ Annulla Cerchio X Lista Giochi -Impostazioni Gioco +Impostazioni Gioco Rimuovi Impostazioni Rimosse tutte le chiavi per il gioco. Scorrimento @@ -64,7 +64,7 @@ Caricamento configurazione... Salvataggio configurazione... Avvia Dispositivo Aggiorna -Modalità di Avvio USB +Modalità di Avvio BDM Modalità di Avvio HDD Modalità di Avvio ETH Modalità di Avvio Apps @@ -78,7 +78,7 @@ Server NBD in scaricamento dalla memoria... Percorso IGR Colore dello Sfondo Colore Testo -- PS2 - +- PS2 - - Server SMB - Tipo di Indirizzo IP Statico @@ -137,7 +137,7 @@ Aggiornamento Automatico Info Versione Sviluppatori Controllo Qualità -Percorso USB Prefisso +Percorso BDM Prefisso Avvia ELF personalizzato dopo un IGR. Valore in minuti, 0 per disabilitare lo spin down. Spin Down Automatico HDD @@ -154,7 +154,7 @@ Percorso ETH Prefisso Backspace Spazio Invio -Modalità +Modalità Slot VMC 1 Slot VMC 2 ID gioco @@ -282,6 +282,8 @@ Genere Pubblicazione Sviluppatore Descrizione +BDM Games +Select Block Devices PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese_r1950.lng b/lng/lang_Japanese_r2027.lng similarity index 97% rename from lng/lang_Japanese_r1950.lng rename to lng/lang_Japanese_r2027.lng index d644f79a0..33d9da842 100644 --- a/lng/lang_Japanese_r1950.lng +++ b/lng/lang_Japanese_r2027.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -64,7 +64,7 @@ X 設定を保存中 デバイスを開始 リフレッシュ -USBデバイス開始モード +BDMデバイス開始モード HDDデバイス開始モード ETHデバイス開始モード アプリメニュー表示モード @@ -137,7 +137,7 @@ VMC %s でエラー。スロット %d のメモリカードを使いますか? OPLについて コーディング QAテスター -USBプリフィクスパス +BDMプリフィクスパス IGR後に指定されたカスタムELFを実行します 秒数指定。0で無効化 自動HDDスピンダウン @@ -282,6 +282,8 @@ Options リリース 開発元 説明文 +BDM Games +Select Block Devices PS1 ゲーム PS1 ゲーム 画面モード POPSTARTER.ELFが '%s'に見つかりません! diff --git a/lng/lang_Korean_r1950.lng b/lng/lang_Korean_r2027.lng similarity index 96% rename from lng/lang_Korean_r1950.lng rename to lng/lang_Korean_r2027.lng index 9e9f34194..c43292945 100644 --- a/lng/lang_Korean_r1950.lng +++ b/lng/lang_Korean_r2027.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -64,7 +64,7 @@ X 저장 설정 장치 시작 새로 고침 -USB 장치 시작 모드 +BDM 장치 시작 모드 HDD 장치 시작 모드 ETH 장치 시작 모드 응용프로그램 시작 모드 @@ -137,7 +137,7 @@ VMC %s 오류, 메모리카드(슬롯 %d)에서 계속합니까? 오픈 PS2 로더 정보 개발자 품질 보증 -USB prefix 경로 +BDM prefix 경로 IGR 후 사용자 정의 ELF 부팅 분 입력, 회전 멈추지 않으려면 0으로 설정 자동 HDD 회전 멈춤 @@ -282,6 +282,8 @@ VMC %s 파일이 조각화되었습니다. 슬롯 %d에서 메모리 카드를 개정 개발자 설명 +BDM Games +Select Block Devices PS1 게임 PS1 게임 표시 모드 '%s' 에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian_r1950.lng b/lng/lang_Laotian_r2027.lng similarity index 97% rename from lng/lang_Laotian_r1950.lng rename to lng/lang_Laotian_r2027.lng index 835f972f3..d9fb651fd 100644 --- a/lng/lang_Laotian_r1950.lng +++ b/lng/lang_Laotian_r2027.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -64,8 +64,8 @@ Remove Settings ກຳລັງບັນທຶກການຕັ້ງຄ່າ ເປີດໃຊ້ອຸປະກອນເຊື່ອມຕໍ່ ເອີ້ນຄືນໃໝ່ -ໂໝດ ເຊື່ອມຕໍ່ອຸປະກອນ USB -ໂໝດ ເຊື່ອມຕໍ່ອຸປະກອນ Hard Disk +ໂໝດ ເຊື່ອມຕໍ່ອຸປະກອນ BDM +ໂໝດ ເຊື່ອມຕໍ່ອຸປະກອນ Hard Disk ໂໝດ ເຊື່ອມຕໍ່ອຸປະກອນ Network ໂໝດ ຕ່າງໆສຳລັບໂປຣແກຣມ ອັດຕະໂນມັດ @@ -113,7 +113,7 @@ Test Changes ວິທີການອ່ານຂໍ້ມູນທີ່ມີທາງເລືອກ Unhook Syscalls ຂ້າມການຫຼິ້ນວິດິໂອ -ປະມວນຜົນ DVD-DL +ປະມວນຜົນ DVD-DL Disable IGR Unused Unused @@ -137,7 +137,7 @@ Error accessing VMC %s. Continue with the Memory Card in slot %d? ກ່ຽວກັບໂປຣແກຣມ ກຸ່ມນັກພັດທະນາໂປຣແກຣມ ການປະກັນໃນຄຸນະພາບ -USB prefix path +BDM prefix path ປະມວນຜົນ ELF ຫຼັງຈາກ IGR ໃສ່ຄ່າເປັນນາທີ, ເລືອກ 0 ເພື່ອປິດການຢຸດໝຸນຮອບ ການຢຸດຮອບໝູນອັດຕະໂນມັດຂອງ Hard Disk @@ -282,6 +282,8 @@ Genre Release Developer Description +BDM Games +Select Block Devices PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Persian_r1950.lng b/lng/lang_Persian_r2027.lng similarity index 98% rename from lng/lang_Persian_r1950.lng rename to lng/lang_Persian_r2027.lng index c31183f56..f2c395a5c 100644 --- a/lng/lang_Persian_r1950.lng +++ b/lng/lang_Persian_r2027.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s @@ -64,7 +64,7 @@ ETH یﺎﻫ یزﺎﺑ یﺪﻨﺑﺮﻜﻴﭘ هﺮﻴﺧذ لﺎﺣرد هﺪﻨﻨﻛ عوﺮﺷ هﺎﮕﺘﺳد یزﺎﺳ هزﺎﺗ -USB هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ +BDM هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ HDD هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ ETH هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ ﺎﻫ ﻪﻣﺎﻧﺮﺑ ﻮﻨﻣ نداد نﺎﺸﻧ @@ -137,7 +137,7 @@ generic زا هدﺎﻔﺘﺳا هرﺎﺑرد نﺎﺴﻳﻮﻧ ﻪﻣﺎﻧرﺑ ﺖﻴﻔﻴﻛ ﺖﺴﺗ -USB ﻲﺤﻴﺟﺮﺗ ﺮﻴﺴﻣ +BDM ﻲﺤﻴﺟﺮﺗ ﺮﻴﺴﻣ IGR زا ﺪﻌﺑ ﻲﺷرﺎﻔﺳ ELF ﻞﻳﺎﻓ یاﺮﺟا ﻦﻴﻳﺎﭘ ﺶﺧﺮﭼ یاﺮﺑ 0 ,ﻪﻘﻴﻗد رد راﺪﻘﻣ HDD رﺎﻛدﻮﺧ ﺶﺧﺮﭼ ﺶﻫﺎﻛ @@ -282,6 +282,8 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ ﻪﺿﺮﻋ ﺦﻳﺭﺎﺗ ﻩﺪﻧﺯﺎﺳ ﺕﺎﺤﻴﺿﻮﺗ +BDM Games +Select Block Devices 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ !'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ diff --git a/lng/lang_Polish_r1950.lng b/lng/lang_Polish_r2027.lng similarity index 96% rename from lng/lang_Polish_r1950.lng rename to lng/lang_Polish_r2027.lng index c9677f8d7..1d25fe696 100644 --- a/lng/lang_Polish_r1950.lng +++ b/lng/lang_Polish_r2027.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -64,7 +64,7 @@ Wczytywanie ustawień... Zapisywanie ustawień... Uruchom Urządzenie Odśwież -Uruchom Urządzenie USB +Uruchom Urządzenie BDM Uruchom Urządzenie HDD Uruchom Urządzenie ETH Wyświetl Menu Aplikacji @@ -137,7 +137,7 @@ Odświeżanie Automatyczne O Programie Programiści Kontrola Jakości -Prefix Ścieżki USB +Prefix Ścieżki BDM Uruchom wybrany ELF po IGR. Wartość w minutach, 0 dla dezaktywacji. Automatyczne Zwalnianie Obrotów HDD @@ -151,7 +151,7 @@ Wybór Koloru Połącz Ponownie Pozostaw puste aby wyświetlić listę udziałów. Prefix Ścieżki ETH -Cofnij +Cofnij Odstęp Enter Tryb @@ -282,6 +282,8 @@ Gatunek Data wydania Deweloper Opis +BDM Games +Select Block Devices PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese_BR_r1950.lng b/lng/lang_Portuguese_BR_r2027.lng similarity index 96% rename from lng/lang_Portuguese_BR_r1950.lng rename to lng/lang_Portuguese_BR_r2027.lng index 752c4f672..28f9ab797 100644 --- a/lng/lang_Portuguese_BR_r1950.lng +++ b/lng/lang_Portuguese_BR_r2027.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -64,7 +64,7 @@ Carregando configurações... Salvando configurações... Iniciar dispositivo Atualizar -Modo de início do dispositivo USB +Modo de início do dispositivo BDM Modo de início do dispositivo HDD Modo de início do dispositivo REDE Modo de início dos Aplicativos @@ -137,7 +137,7 @@ Atualização automática Informações do programa Desenvolvedores Controle de qualidade -Prefixar uma pasta no USB +Prefixar uma pasta no BDM Inicia um ELF personalizado após o IGR Valor em minuto(s), 0(zero) desabilita o spin down Desligamento automático do HDD (spin down) @@ -282,6 +282,8 @@ Gênero Data de lançamento Desenvolvedor Descrição +Jogos BDM +Select Block Devices Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_r1950.lng b/lng/lang_Portuguese_r2027.lng similarity index 95% rename from lng/lang_Portuguese_r1950.lng rename to lng/lang_Portuguese_r2027.lng index 266c46dc7..01e802fcb 100644 --- a/lng/lang_Portuguese_r1950.lng +++ b/lng/lang_Portuguese_r2027.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -28,8 +28,8 @@ Cancelar atualização? %d: Erro ao iniciar rede %d: Adaptador de Rede não detetado %d: Não foi possível ligar ao servidor SMB -%d: Não foi possível efetuar login no servidor SMB -%d: Não foi possível abrir a partilha SMB +%d: Não foi possível efetuar login no servidor SMB +%d: Não foi possível abrir a partilha SMB %d: Impossivel listar partilhas SMB %d: Impossivel listar jogos %d: Servidor DHCP indisponivel @@ -64,7 +64,7 @@ Carregando configurações A guardar configurações... Iniciar dispositivo Atualizar -Modo de inicio para dispositivo USB +Modo de inicialização do dispositivo BDM Modo de inicio para dispositivo HDD Modo de inicio para dispositivo Rede Modo de inicio para Aplicações @@ -137,7 +137,7 @@ Atualização automática Créditos Desenvolvedores Controlo de qualidade -Prefixo de caminho USB +Prefixo de caminho BDM Iniciar ELF personalizado depois do IGR Valor em minuto(s), 0 p/ desativar Desligamento automático do HDD @@ -282,6 +282,8 @@ Gênero Data de lançamento Desenvolvedor Descrição +Jogos BDM +Select Block Devices Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Romanian_r1950.lng b/lng/lang_Romanian_r2027.lng similarity index 96% rename from lng/lang_Romanian_r1950.lng rename to lng/lang_Romanian_r2027.lng index 7c651c41e..e4310ec17 100644 --- a/lng/lang_Romanian_r1950.lng +++ b/lng/lang_Romanian_r2027.lng @@ -1,6 +1,6 @@ # Romanian translation by MRAdyy -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Romanian Open PS2 Loader %s @@ -64,7 +64,7 @@ Se incarca configurare Se salveaza configurarea Pornire dispozitiv Reimprospatare -Modul de pornire al dispozitivului USB +Modul de pornire al dispozitivului BDM Modul de pornire al dispozitivului HDD Modul de pornire al dispozitivului Retea Modul de pornire aplicatii @@ -137,7 +137,7 @@ Reimprospatare Automata Despre Ingineri Asigurarea calitatii -Calea prefixului USB +Calea prefixului BDM Lasa gol pentru a iesi in Browser Valoare in minute, 0 pentru a dezactiva rotirea Oprire automata HDD @@ -282,6 +282,8 @@ Genre Release Developer Description +BDM Games +Select Block Devices PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Russian_r1950.lng b/lng/lang_Russian_r2027.lng similarity index 97% rename from lng/lang_Russian_r1950.lng rename to lng/lang_Russian_r2027.lng index 6eb7a101b..be2552ee6 100644 --- a/lng/lang_Russian_r1950.lng +++ b/lng/lang_Russian_r2027.lng @@ -1,6 +1,6 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -64,7 +64,7 @@ OPL %s Сохранение настроек... Запуск устройства Обновить -Режим запуска USB +Режим запуска BDM Режим запуска HDD Режим запуска ETH Режим показа Приложений @@ -137,7 +137,7 @@ unused О программе Кодеры Гарантия качества -Префикс пути для USB +Префикс пути для BDM Загрузить другой ELF после IGR. Значение в минутах, 0 для отключения функции Автоотключение HDD @@ -282,6 +282,8 @@ Bluetooth-адаптер может плохо работать с контро Выпуск Разработчик Описание +Игры BDM +Select Block Devices Игры PS1 Режим показа игр PS1 POPSTARTER.ELF не найден в '%s'! diff --git a/lng/lang_SChinese_r1950.lng b/lng/lang_SChinese_r2027.lng similarity index 95% rename from lng/lang_SChinese_r1950.lng rename to lng/lang_SChinese_r2027.lng index d5008591e..9b0be0718 100644 --- a/lng/lang_SChinese_r1950.lng +++ b/lng/lang_SChinese_r2027.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese OPL %s @@ -64,7 +64,7 @@ X 设置储存中 启动设备 重新整理 -USB 设备启动模式 +BDM 设备启动模式 HDD 设备启动模式 ETH 设备启动模式 应用程序启动模式 @@ -137,7 +137,7 @@ VMC 存档已存在 关于 程序 测试 -USB 前缀路径 +BDM 前缀路径 自定义IGR启动文件 数值以分钟计,设为 0 禁用降速 自动 HDD 降速 @@ -282,6 +282,8 @@ Genre Release Developer Description +BDM Games +Select Block Devices PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Spanish_r1950.lng b/lng/lang_Spanish_r2027.lng similarity index 96% rename from lng/lang_Spanish_r1950.lng rename to lng/lang_Spanish_r2027.lng index 4a70b68ad..fb6a38e0b 100644 --- a/lng/lang_Spanish_r1950.lng +++ b/lng/lang_Spanish_r2027.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -64,7 +64,7 @@ Cargando configuración... Guardando configuración... Iniciar dispositivo Refrescar -Modo de inicio para USB +Modo de inicio del dispositivo BDM Modo de inicio para Disco duro Modo de inicio para Red Modo inicio de menú de Aplicaciones @@ -137,7 +137,7 @@ Refresco automático de las listas Acerca del OPL Desarrolladores Testeadores -Ruta predeterminada dispositivo USB +Ruta de prefijo BDM Lanzar ELF personalizado después de IGR Valor en minutos, 0 para desactivar el paro automático Paro automático rotación del Disco duro @@ -282,6 +282,8 @@ Género Lanzamiento Desarrollador Descripción +Juegos BDM +Select Block Devices Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish_r1950.lng b/lng/lang_Swedish_r2027.lng similarity index 96% rename from lng/lang_Swedish_r1950.lng rename to lng/lang_Swedish_r2027.lng index 7fb64cd94..b3f7b83d7 100644 --- a/lng/lang_Swedish_r1950.lng +++ b/lng/lang_Swedish_r2027.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -64,7 +64,7 @@ Ladda config Spara config Starta enheten Uppdatera -USB enhet startläge +BDM enhets startläge HDD enhet startläge ETH enhet startläge APP-meny visningsläge @@ -137,7 +137,7 @@ Automatisk uppdatering Om Kodare Kvalitetstestare -USB prefix sökväg +BDM Prefix plats Laddar vald ELF efter en IGR Värde i minut (er), 0 för att inaktivera nerspinn Automatisk HDD nerspinn @@ -207,7 +207,7 @@ Hämta inställningar från nätverket? Modifierade inställningar Hämtade standard Autostart om %i s... -Autostart +Autostart Värde i sekund(er), 0 inaktiverar Autostart PS2 Logo Visas för giltig disklogo matchande konsolens region. @@ -282,6 +282,8 @@ Genre Lansering Utvecklare Beskrivning +BDM Spel +Select Block Devices PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_TChinese_r1950.lng b/lng/lang_TChinese_r2027.lng similarity index 95% rename from lng/lang_TChinese_r1950.lng rename to lng/lang_TChinese_r2027.lng index d5160cccf..0c0a5dafb 100644 --- a/lng/lang_TChinese_r1950.lng +++ b/lng/lang_TChinese_r2027.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -64,7 +64,7 @@ X 設置儲存中 啟動設備 重新整理 -USB 設備啟動模式 +BDM 設備啟動模式 HDD 設備啟動模式 ETH 設備啟動模式 應用程序啟動模式 @@ -137,7 +137,7 @@ VMC 存檔已存在 關於 程序 測試 -USB 前綴路徑 +BDM 前綴路徑 自定義IGR啟動文件 數值以分鐘計,設為 0 禁用降速 自動 HDD 降速 @@ -282,6 +282,8 @@ Genre Release Developer Description +BDM Games +Select Block Devices PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! diff --git a/lng/lang_Turkish_r1950.lng b/lng/lang_Turkish_r2027.lng similarity index 96% rename from lng/lang_Turkish_r1950.lng rename to lng/lang_Turkish_r2027.lng index a6779dc43..0ed8a48c2 100644 --- a/lng/lang_Turkish_r1950.lng +++ b/lng/lang_Turkish_r2027.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -64,7 +64,7 @@ Ayarlar yükleniyor Ayarlar kayıt ediliyor Cihazı başlat Yenile -USB cihazı başlangıç türü +BDM cihazı başlangıç türü HDD cihazı başlangıç türü AĞ cihazı başlangıç türü Uygulamalar menüsü görünüm kipi @@ -78,7 +78,7 @@ NBD Sunucu Durduruluyor... IGR yeri Arkaplan rengi Metin rengi -- PS2 - +- PS2 - - SMB Sunucusu - IP adres türü Sabit @@ -137,7 +137,7 @@ Otomatik yenileme Hakkında Geliştiriciler Kalite Kontrolü -USB önek yolu +BDM önek yolu IGR'den sonra özel bir ELF'e başlar Dakika olarak değer, iptal etmek için 0 giriniz Otomatik Sabit Disk durdurma @@ -282,6 +282,8 @@ Tür Çıkış Geliştirici Açıklama +BDM Games +Select Block Devices PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. diff --git a/lng/lang_Vietnamese_r1950.lng b/lng/lang_Vietnamese_r2027.lng similarity index 91% rename from lng/lang_Vietnamese_r1950.lng rename to lng/lang_Vietnamese_r2027.lng index f40f9fed2..52c1598e7 100644 --- a/lng/lang_Vietnamese_r1950.lng +++ b/lng/lang_Vietnamese_r2027.lng @@ -1,6 +1,6 @@ # Translation by zidane89 -# Last update: May 20, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-1950-b329309-2021-05-19 and OPNPS2LD-v1.1.0-Beta_all-1635-ifcaro-1101a9d-2021-05-18 +# Last update: July 21, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese OPL %s @@ -16,7 +16,7 @@ Cài đặt Menu Trò chơi trên USB Trò chơi trên HDD -Trò chơi qua ETH +Trò chơi qua ETH Ứng dụng Chủ đề Ngôn ngữ @@ -26,7 +26,7 @@ Hủy bỏ các cập nhật? %d: Không phát hiện ổ cứng %d: Ổ cứng chưa định dạng %d: Lỗi khởi chạy mạng -%d: Không có adaptor mạng +%d: Không có adaptor mạng %d: Không thể kết nối đến SMB server %d: Không thể đăng nhập vào SMB server %d: Không mở được SMB share @@ -55,7 +55,7 @@ Vui lòng chờ Lỗi khi nạp Game ID Tự động phân loại Lỗi nạp tập tin ngôn ngữ -Ngắt màu Debug +Ngắt màu Debug Không có cần điều khiển, đợi chút... Bật Cover Art Màn hình rộng @@ -64,13 +64,13 @@ Nạp cấu hình Lưu cấu hình Chọn thiết bị lưu trò chơi Làm mới -Chọn USB -Chọn HDD -Chọn ETH +Chọn BDM +Chọn HDD +Chọn ETH Hiển thị menu ứng dụng Tự động Thủ công -Khởi chạy máy chủ NBD +Khởi chạy máy chủ NBD Máy chủ NBD khởi chạy... Máy chủ NBD đang chạy... khởi chạy máy chủ NBD thất bại. @@ -98,8 +98,8 @@ IP NetBIOS Truy cập Mục này sẽ bị xóa vĩnh viễn, tiếp tục? -Đổi tên -Xóa +Đổi tên +Xóa Chạy Cài đặt hiển thị Kích hoạt thao tác ghi @@ -137,7 +137,7 @@ Tự động làm tươi Thông tin Coders Đảm bảo chất lượng -USB prefix path +BDM prefix path Boots Custom ELF after an IGR Giá trị tính bằng phút(s), 0 tắt chế độ chờ HDD HDD tự động chờ @@ -145,7 +145,7 @@ Chế độ Video Màu hộp thoại Chọn màu Reset Colors -Thông tin +Thông tin Tùy chỉnh ELF Màu sắc lựa chọn Kết nối lại @@ -158,23 +158,23 @@ Chế độ VMC ở Khe 1 VMC ở Khe 2 Game ID -Chế độ DMA +Chế độ DMA V-Sync -Mode 1 -Mode 2 -Mode 3 -Mode 4 -Mode 5 -Mode 6 -Mode 7 -Mode 8 +Mode 1 +Mode 2 +Mode 3 +Mode 4 +Mode 5 +Mode 6 +Mode 7 +Mode 8 Cấu hình GSM Ethernet Link Mode 100Mbit Full-duplex 100Mbit Half-duplex 10Mbit Full-duplex 10Mbit Half-duplex -Cài đặt GSM +Cài đặt GSM Bật GSM Bật hoặc tắt GSM VMODE @@ -187,10 +187,10 @@ Overscan Overscan Adjustment Bỏ qua FMV Bỏ qua Full Motion Videos -Cài đặt Cheat +Cài đặt Cheat Bật PS2RD Cheat Engine Hãy để PS2RD Cheat Engine vá vào trò chơi -Chế độ PS2RD Cheat Engine +Chế độ PS2RD Cheat Engine Tự động chọn hoặc chọn trò chơi ăn gian Tự động chọn cheats Chọn cheats trò chơi @@ -209,7 +209,7 @@ Tải về mặc định Tự khởi động trong %i s... Tự khởi động đơn vị bằng giây(s), 0 để ngắt tự khởi động -Logo PS2 +Logo PS2 Displayed for a valid disc logo matching the console's region. Cấu hình PADEMU Cài đặt giả lập tay cầm @@ -241,7 +241,7 @@ Yes No Bluetooth adapter phải tương thích với tay cầm DS3/DS4. Bluetooth adapter có thể không hoạt động chính xác với tay cầm DS3/DS4. -Bật giả lập Multitap +Bật giả lập Multitap Bật/tắt giả lập Multitap cho trò chơi đã chọn. Giả lập Multitap tại cổng Chọn cổng giả lập Multitap. @@ -282,6 +282,8 @@ Genre Release Developer Description +BDM Games +Select Block Devices Các trò chơi PS1 Chế độ hiển thị cho game PS1 POPSTARTER.ELF không có ở '%s'! From 8b20731f6828ebeb54c12c402a7c0eeedd40913d Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 6 Aug 2021 23:32:14 -0700 Subject: [PATCH 235/269] update lang files --- lng/{lang_Albanian_r2027.lng => lang_Albanian_r2055.lng} | 7 ++++--- lng/{lang_Arabic_r2027.lng => lang_Arabic_r2055.lng} | 7 ++++--- ...lang_Bulgarian_r2027.lng => lang_Bulgarian_r2055.lng} | 7 ++++--- lng/{lang_Cebuano_r2027.lng => lang_Cebuano_r2055.lng} | 7 ++++--- lng/{lang_Croatian_r2027.lng => lang_Croatian_r2055.lng} | 7 ++++--- lng/{lang_Czech_r2027.lng => lang_Czech_r2055.lng} | 7 ++++--- lng/{lang_Danish_r2027.lng => lang_Danish_r2055.lng} | 7 ++++--- lng/{lang_Dutch_r2027.lng => lang_Dutch_r2055.lng} | 7 ++++--- lng/{lang_Filipino_r2027.lng => lang_Filipino_r2055.lng} | 7 ++++--- lng/{lang_French_r2027.lng => lang_French_r2055.lng} | 7 ++++--- lng/{lang_German_r2027.lng => lang_German_r2055.lng} | 9 +++++---- lng/{lang_Greek_r2027.lng => lang_Greek_r2055.lng} | 7 ++++--- ...lang_Hungarian_r2027.lng => lang_Hungarian_r2055.lng} | 7 ++++--- ...ng_Indonesian_r2027.lng => lang_Indonesian_r2055.lng} | 7 ++++--- lng/{lang_Italian_r2027.lng => lang_Italian_r2055.lng} | 7 ++++--- lng/{lang_Japanese_r2027.lng => lang_Japanese_r2055.lng} | 7 ++++--- lng/{lang_Korean_r2027.lng => lang_Korean_r2055.lng} | 7 ++++--- lng/{lang_Laotian_r2027.lng => lang_Laotian_r2055.lng} | 7 ++++--- lng/{lang_Persian_r2027.lng => lang_Persian_r2055.lng} | 7 ++++--- lng/{lang_Polish_r2027.lng => lang_Polish_r2055.lng} | 7 ++++--- ...tuguese_BR_r2027.lng => lang_Portuguese_BR_r2055.lng} | 9 +++++---- ...ng_Portuguese_r2027.lng => lang_Portuguese_r2055.lng} | 9 +++++---- lng/{lang_Romanian_r2027.lng => lang_Romanian_r2055.lng} | 7 ++++--- lng/{lang_Russian_r2027.lng => lang_Russian_r2055.lng} | 9 +++++---- lng/{lang_SChinese_r2027.lng => lang_SChinese_r2055.lng} | 7 ++++--- lng/{lang_Spanish_r2027.lng => lang_Spanish_r2055.lng} | 7 ++++--- lng/{lang_Swedish_r2027.lng => lang_Swedish_r2055.lng} | 9 +++++---- lng/{lang_TChinese_r2027.lng => lang_TChinese_r2055.lng} | 7 ++++--- lng/{lang_Turkish_r2027.lng => lang_Turkish_r2055.lng} | 7 ++++--- ...ng_Vietnamese_r2027.lng => lang_Vietnamese_r2055.lng} | 7 ++++--- 30 files changed, 125 insertions(+), 95 deletions(-) rename lng/{lang_Albanian_r2027.lng => lang_Albanian_r2055.lng} (97%) rename lng/{lang_Arabic_r2027.lng => lang_Arabic_r2055.lng} (98%) rename lng/{lang_Bulgarian_r2027.lng => lang_Bulgarian_r2055.lng} (98%) rename lng/{lang_Cebuano_r2027.lng => lang_Cebuano_r2055.lng} (97%) rename lng/{lang_Croatian_r2027.lng => lang_Croatian_r2055.lng} (97%) rename lng/{lang_Czech_r2027.lng => lang_Czech_r2055.lng} (96%) rename lng/{lang_Danish_r2027.lng => lang_Danish_r2055.lng} (96%) rename lng/{lang_Dutch_r2027.lng => lang_Dutch_r2055.lng} (96%) rename lng/{lang_Filipino_r2027.lng => lang_Filipino_r2055.lng} (97%) rename lng/{lang_French_r2027.lng => lang_French_r2055.lng} (97%) rename lng/{lang_German_r2027.lng => lang_German_r2055.lng} (97%) rename lng/{lang_Greek_r2027.lng => lang_Greek_r2055.lng} (98%) rename lng/{lang_Hungarian_r2027.lng => lang_Hungarian_r2055.lng} (97%) rename lng/{lang_Indonesian_r2027.lng => lang_Indonesian_r2055.lng} (96%) rename lng/{lang_Italian_r2027.lng => lang_Italian_r2055.lng} (97%) rename lng/{lang_Japanese_r2027.lng => lang_Japanese_r2055.lng} (97%) rename lng/{lang_Korean_r2027.lng => lang_Korean_r2055.lng} (97%) rename lng/{lang_Laotian_r2027.lng => lang_Laotian_r2055.lng} (98%) rename lng/{lang_Persian_r2027.lng => lang_Persian_r2055.lng} (98%) rename lng/{lang_Polish_r2027.lng => lang_Polish_r2055.lng} (97%) rename lng/{lang_Portuguese_BR_r2027.lng => lang_Portuguese_BR_r2055.lng} (96%) rename lng/{lang_Portuguese_r2027.lng => lang_Portuguese_r2055.lng} (96%) rename lng/{lang_Romanian_r2027.lng => lang_Romanian_r2055.lng} (96%) rename lng/{lang_Russian_r2027.lng => lang_Russian_r2055.lng} (97%) rename lng/{lang_SChinese_r2027.lng => lang_SChinese_r2055.lng} (96%) rename lng/{lang_Spanish_r2027.lng => lang_Spanish_r2055.lng} (97%) rename lng/{lang_Swedish_r2027.lng => lang_Swedish_r2055.lng} (96%) rename lng/{lang_TChinese_r2027.lng => lang_TChinese_r2055.lng} (96%) rename lng/{lang_Turkish_r2027.lng => lang_Turkish_r2055.lng} (97%) rename lng/{lang_Vietnamese_r2027.lng => lang_Vietnamese_r2055.lng} (97%) diff --git a/lng/lang_Albanian_r2027.lng b/lng/lang_Albanian_r2055.lng similarity index 97% rename from lng/lang_Albanian_r2027.lng rename to lng/lang_Albanian_r2055.lng index 37289899c..5477ac3c9 100644 --- a/lng/lang_Albanian_r2027.lng +++ b/lng/lang_Albanian_r2055.lng @@ -1,6 +1,6 @@ # Translation by LoniTheFricc -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Albanian OPL %s @@ -45,7 +45,7 @@ Lista e Lojërave Konfigurimet e Lojës Hiq Konfigurimet Hequr të gjithë çelësat nga loja. -Lëvizja +Scrolling Speed Ngadalë Mesatare Shpejt @@ -284,6 +284,7 @@ Zhvilluesi Përshkrimi BDM Games Select Block Devices +Controller Settings Lojrat PS1 Moda e Shfaqjes se Lojrave PS1 POPSTARTER.ELF nuk është gjetur tek '%s'! diff --git a/lng/lang_Arabic_r2027.lng b/lng/lang_Arabic_r2055.lng similarity index 98% rename from lng/lang_Arabic_r2027.lng rename to lng/lang_Arabic_r2055.lng index 7bed207a2..e35442ea7 100644 --- a/lng/lang_Arabic_r2027.lng +++ b/lng/lang_Arabic_r2055.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL @@ -45,7 +45,7 @@ SMB ﺔﻤﺋﺎﻗ ﺔﻛﺭﺎﺸﻣ ﻦﻜﻤﻳﻻ ﺔﺒﻌﻠﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﺕﺍﺩﺍﺪﻋﺇ ﺔﻟﺍﺯﺇ ﺔﺒﻌﻠﻟﺍ ﺢﻴﺗﺎﻔﻣ ﺔﻓﺎﻛ ﺔﻟﺍﺯﺇ -ﺮﻳﺮﻤﺘﻟﺍ +Scrolling Speed ﺀﻲﻄﺑ ﻂﺳﻮﺘﻣ ﻊﻳﺮﺳ @@ -284,6 +284,7 @@ s% ﻦﻣ ﻞﻤﺤﻣ s% ﻒﺻﻭ BDM Games Select Block Devices +Controller Settings PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_Bulgarian_r2027.lng b/lng/lang_Bulgarian_r2055.lng similarity index 98% rename from lng/lang_Bulgarian_r2027.lng rename to lng/lang_Bulgarian_r2055.lng index 850446a36..7f4c5faac 100644 --- a/lng/lang_Bulgarian_r2027.lng +++ b/lng/lang_Bulgarian_r2055.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -45,7 +45,7 @@ X (Хикс) Опции Изчистване на настройките Изчистени всички бутони за играта -Превъртане +Scrolling Speed бавно средно бързо @@ -284,6 +284,7 @@ Options Описание BDM Games Select Block Devices +Controller Settings PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Cebuano_r2027.lng b/lng/lang_Cebuano_r2055.lng similarity index 97% rename from lng/lang_Cebuano_r2027.lng rename to lng/lang_Cebuano_r2055.lng index 472e122d3..a015af219 100644 --- a/lng/lang_Cebuano_r2027.lng +++ b/lng/lang_Cebuano_r2055.lng @@ -1,6 +1,6 @@ # Translation by Colton Silva -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Cebuano Open PS2 Loader %s @@ -45,7 +45,7 @@ Lista Settings sa dula Tangtanga ang setting Gikuha ang tanan nga mga yawi alang sa dula. -I-scroll +Scrolling Speed Hinay Medium Paspas @@ -284,6 +284,7 @@ Debeloper Paghulagway BDM Games Select Block Devices +Controller Settings PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Croatian_r2027.lng b/lng/lang_Croatian_r2055.lng similarity index 97% rename from lng/lang_Croatian_r2027.lng rename to lng/lang_Croatian_r2055.lng index b40328738..e5f1cc2fe 100644 --- a/lng/lang_Croatian_r2027.lng +++ b/lng/lang_Croatian_r2055.lng @@ -1,6 +1,6 @@ # Translation by Blacky5678 -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Croatian OPL %s @@ -45,7 +45,7 @@ Lista Igara Postavke Igre Ukloni Postavke Uklonjeni svi kljucevi za igru. -Izlistati +Scrolling Speed Sporo Srednje Brzo @@ -284,6 +284,7 @@ Developer Description BDM Games Select Block Devices +Controller Settings PS1 Igre Nacin Prikaza PS1 Igara POPSTARTER.ELF nije pronaden kod '%s'! diff --git a/lng/lang_Czech_r2027.lng b/lng/lang_Czech_r2055.lng similarity index 96% rename from lng/lang_Czech_r2027.lng rename to lng/lang_Czech_r2055.lng index be8db5da3..f49966731 100644 --- a/lng/lang_Czech_r2027.lng +++ b/lng/lang_Czech_r2055.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -45,7 +45,7 @@ Seznam her Nast. hry Remove Settings Odebrat všechny klíče pro hru -Skrolování +Scrolling Speed Pomalu Normálně Rychle @@ -284,6 +284,7 @@ Developer Description BDM Games Select Block Devices +Controller Settings PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish_r2027.lng b/lng/lang_Danish_r2055.lng similarity index 96% rename from lng/lang_Danish_r2027.lng rename to lng/lang_Danish_r2055.lng index 2fdcbc124..0f8a0a958 100644 --- a/lng/lang_Danish_r2027.lng +++ b/lng/lang_Danish_r2055.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -45,7 +45,7 @@ Spil liste Spil indst. Remove Settings Spil indstillinger nulstillet -Scrolling +Scrolling Speed Langsom Medium Hurtig @@ -284,6 +284,7 @@ Developer Description BDM Games Select Block Devices +Controller Settings PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch_r2027.lng b/lng/lang_Dutch_r2055.lng similarity index 96% rename from lng/lang_Dutch_r2027.lng rename to lng/lang_Dutch_r2055.lng index 6b87bf22f..f229f473d 100644 --- a/lng/lang_Dutch_r2027.lng +++ b/lng/lang_Dutch_r2055.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -45,7 +45,7 @@ Spellenlijst Spelinstellingen Remove Settings Verwijder alle keys voor het spel -Scrollen +Scrolling Speed Langzaam Normaal Snel @@ -284,6 +284,7 @@ Developer Description BDM Games Select Block Devices +Controller Settings PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Filipino_r2027.lng b/lng/lang_Filipino_r2055.lng similarity index 97% rename from lng/lang_Filipino_r2027.lng rename to lng/lang_Filipino_r2055.lng index cb4c83b3d..19b38cfc1 100644 --- a/lng/lang_Filipino_r2027.lng +++ b/lng/lang_Filipino_r2055.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo and Colton SIlva @ColtonSilvaonKnoxKontor -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -45,7 +45,7 @@ Listahan Settings ng laro Alisin ang Settings Inalis ang lahat ng mga pindutan para sa mga laro -I-scroll +Scrolling Speed Mabagal Medium Mabilis @@ -284,6 +284,7 @@ Debeloper Deskripsyon BDM Games Select Block Devices +Controller Settings PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French_r2027.lng b/lng/lang_French_r2055.lng similarity index 97% rename from lng/lang_French_r2027.lng rename to lng/lang_French_r2055.lng index 0b368cd6b..976d3dd4e 100644 --- a/lng/lang_French_r2027.lng +++ b/lng/lang_French_r2055.lng @@ -1,6 +1,6 @@ # Translation by machiavel and Squall -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -45,7 +45,7 @@ Liste des jeux Options du jeu Supprimer les paramètres Options du jeu supprimées. -Défilement +Scrolling Speed Lent Moyen Rapide @@ -284,6 +284,7 @@ Développeur Description BDM Games Select Block Devices +Controller Settings PS1 Games Mode d'affichage des jeux PS1 POPSTARTER.ELF non trouvé à '%s'! diff --git a/lng/lang_German_r2027.lng b/lng/lang_German_r2055.lng similarity index 97% rename from lng/lang_German_r2027.lng rename to lng/lang_German_r2055.lng index 11421a99f..6cd248438 100644 --- a/lng/lang_German_r2027.lng +++ b/lng/lang_German_r2055.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -45,7 +45,7 @@ Spieleliste Spieleinst. Entferne Einstellungen Alle keys für das Spiel wurden entfernt -Scrollen +Scrolling Speed Langsam Mittel Schnell @@ -283,7 +283,8 @@ Veröffentlichung Entwickler Beschreibung BDM Spiele -Select Block Devices +Wähle Blockgeräte +Controller Settings PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek_r2027.lng b/lng/lang_Greek_r2055.lng similarity index 98% rename from lng/lang_Greek_r2027.lng rename to lng/lang_Greek_r2055.lng index 3cc781f28..97d7ebf9a 100644 --- a/lng/lang_Greek_r2027.lng +++ b/lng/lang_Greek_r2055.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -45,7 +45,7 @@ OK Ρυθμίσεις Παιχνιδιού Κατάργηση Ρυθμίσεων Καταργήθηκαν όλα τα πλήκτρα για το παιχνίδι. -Κύλιση +Scrolling Speed Αργή Κανονική Γρήγορη @@ -284,6 +284,7 @@ Forum Υποστήριξης: Περιγραφή BDM Games Select Block Devices +Controller Settings Παιχνίδια PS1 Εκκίνηση μενού Παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian_r2027.lng b/lng/lang_Hungarian_r2055.lng similarity index 97% rename from lng/lang_Hungarian_r2027.lng rename to lng/lang_Hungarian_r2055.lng index 944b1f6e6..d296cb201 100644 --- a/lng/lang_Hungarian_r2027.lng +++ b/lng/lang_Hungarian_r2055.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -45,7 +45,7 @@ Játék Lista Játékbeállítások Beállítások eltávolítása Játékhoz tartozó összes kulcs eltávolítva -Görgetés +Scrolling Speed Lassú Közepes Gyors @@ -284,6 +284,7 @@ Fejlesztő Leírás BDM Games Select Block Devices +Controller Settings PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian_r2027.lng b/lng/lang_Indonesian_r2055.lng similarity index 96% rename from lng/lang_Indonesian_r2027.lng rename to lng/lang_Indonesian_r2055.lng index b2f2e3a8b..bc1b1f0d1 100644 --- a/lng/lang_Indonesian_r2027.lng +++ b/lng/lang_Indonesian_r2055.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -45,7 +45,7 @@ Daftar Game Setingan Hapus setingan Semua kunci permainan yang dihapus -Gulir +Scrolling Speed Lambat Sedang Cepat @@ -284,6 +284,7 @@ Pengembang Deskripsi BDM Games Select Block Devices +Controller Settings PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian_r2027.lng b/lng/lang_Italian_r2055.lng similarity index 97% rename from lng/lang_Italian_r2027.lng rename to lng/lang_Italian_r2055.lng index 572307d33..1a113153e 100644 --- a/lng/lang_Italian_r2027.lng +++ b/lng/lang_Italian_r2055.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d and completed by Peppe90 -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -45,7 +45,7 @@ Lista Giochi Impostazioni Gioco Rimuovi Impostazioni Rimosse tutte le chiavi per il gioco. -Scorrimento +Scrolling Speed Lento Medio Veloce @@ -284,6 +284,7 @@ Sviluppatore Descrizione BDM Games Select Block Devices +Controller Settings PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese_r2027.lng b/lng/lang_Japanese_r2055.lng similarity index 97% rename from lng/lang_Japanese_r2027.lng rename to lng/lang_Japanese_r2055.lng index 33d9da842..cc78760ef 100644 --- a/lng/lang_Japanese_r2027.lng +++ b/lng/lang_Japanese_r2055.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -45,7 +45,7 @@ X ゲーム設定 設定を削除 キー設定を初期化 -画面スクロール +Scrolling Speed 遅い 普通 速い @@ -284,6 +284,7 @@ Options 説明文 BDM Games Select Block Devices +Controller Settings PS1 ゲーム PS1 ゲーム 画面モード POPSTARTER.ELFが '%s'に見つかりません! diff --git a/lng/lang_Korean_r2027.lng b/lng/lang_Korean_r2055.lng similarity index 97% rename from lng/lang_Korean_r2027.lng rename to lng/lang_Korean_r2055.lng index c43292945..7b9b0db9c 100644 --- a/lng/lang_Korean_r2027.lng +++ b/lng/lang_Korean_r2055.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -45,7 +45,7 @@ X 게임 설정 설정 삭제 설정된 게임 키 제거 -스크롤 속도 +Scrolling Speed 느림 보통 빠름 @@ -284,6 +284,7 @@ VMC %s 파일이 조각화되었습니다. 슬롯 %d에서 메모리 카드를 설명 BDM Games Select Block Devices +Controller Settings PS1 게임 PS1 게임 표시 모드 '%s' 에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian_r2027.lng b/lng/lang_Laotian_r2055.lng similarity index 98% rename from lng/lang_Laotian_r2027.lng rename to lng/lang_Laotian_r2055.lng index d9fb651fd..7c5431f7f 100644 --- a/lng/lang_Laotian_r2027.lng +++ b/lng/lang_Laotian_r2055.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -45,7 +45,7 @@ Settings saved to %s ຕັ້ງຄ່າໃຫ້ເກມນີ້ Remove Settings ລົບລ້າງ Key ທັງໝົດອອກຈາກເກມ -ການເລື່ອນ +Scrolling Speed ຊ້າໆ ປານກາງ ໄວ @@ -284,6 +284,7 @@ Developer Description BDM Games Select Block Devices +Controller Settings PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Persian_r2027.lng b/lng/lang_Persian_r2055.lng similarity index 98% rename from lng/lang_Persian_r2027.lng rename to lng/lang_Persian_r2055.lng index f2c395a5c..f60e56613 100644 --- a/lng/lang_Persian_r2027.lng +++ b/lng/lang_Persian_r2055.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s @@ -45,7 +45,7 @@ ETH یﺎﻫ یزﺎﺑ ﺎﻫ یزﺎﺑ تﺎﻤﻴﻈﻨﺗ ﺕﺎﻤﻴﻈﻨﺗ ﻥﺩﺮﮐ ﮎﺎﭘ یزﺎﺑ یﺎﻫ ﺪﻴﻠﻛ مﺎﻤﺗ ندﺮﻛ کﺎﭘ -لوﺮﻜﺳا ﺖﻋﺮﺳ +Scrolling Speed ﻪﺘﺴﻫآ ﻲﻟﻮﻤﻌﻣ ﻊﻳﺮﺳ @@ -284,6 +284,7 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ ﺕﺎﺤﻴﺿﻮﺗ BDM Games Select Block Devices +Controller Settings 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ !'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ diff --git a/lng/lang_Polish_r2027.lng b/lng/lang_Polish_r2055.lng similarity index 97% rename from lng/lang_Polish_r2027.lng rename to lng/lang_Polish_r2055.lng index 1d25fe696..bc6b5a0f1 100644 --- a/lng/lang_Polish_r2027.lng +++ b/lng/lang_Polish_r2055.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -45,7 +45,7 @@ Lista Gier Ustawienia Gry Usuń Ustawienia Usunięto wszystkie klucze dla gry. -Szybkość Przewijania +Scrolling Speed Wolno Średnio Szybko @@ -284,6 +284,7 @@ Deweloper Opis BDM Games Select Block Devices +Controller Settings PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese_BR_r2027.lng b/lng/lang_Portuguese_BR_r2055.lng similarity index 96% rename from lng/lang_Portuguese_BR_r2027.lng rename to lng/lang_Portuguese_BR_r2055.lng index 28f9ab797..f8973c48b 100644 --- a/lng/lang_Portuguese_BR_r2027.lng +++ b/lng/lang_Portuguese_BR_r2055.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -45,7 +45,7 @@ Lista de jogos Ajustes Remover configurações Todos os ajustes do jogo foram removidos -Rolagem +Scrolling Speed Lenta Média Rápida @@ -283,7 +283,8 @@ Data de lançamento Desenvolvedor Descrição Jogos BDM -Select Block Devices +Selecione os Dispositivos de Entrada +Controller Settings Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_r2027.lng b/lng/lang_Portuguese_r2055.lng similarity index 96% rename from lng/lang_Portuguese_r2027.lng rename to lng/lang_Portuguese_r2055.lng index 01e802fcb..1eb1b87c5 100644 --- a/lng/lang_Portuguese_r2027.lng +++ b/lng/lang_Portuguese_r2055.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -45,7 +45,7 @@ Lista de Jogos Aj. do jogo Remover configurações Removidos todos os ajustes para o jogo -Rolagem +Scrolling Speed Lento Médio Rápido @@ -283,7 +283,8 @@ Data de lançamento Desenvolvedor Descrição Jogos BDM -Select Block Devices +Selecionar dispositivos de entrada +Controller Settings Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Romanian_r2027.lng b/lng/lang_Romanian_r2055.lng similarity index 96% rename from lng/lang_Romanian_r2027.lng rename to lng/lang_Romanian_r2055.lng index e4310ec17..9a854c604 100644 --- a/lng/lang_Romanian_r2027.lng +++ b/lng/lang_Romanian_r2055.lng @@ -1,6 +1,6 @@ # Romanian translation by MRAdyy -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Romanian Open PS2 Loader %s @@ -45,7 +45,7 @@ Lista jocuri Setari joc Remove Settings Au fost sterse toate butoanele jocului -Miscare +Scrolling Speed Incet Medium Rapid @@ -284,6 +284,7 @@ Developer Description BDM Games Select Block Devices +Controller Settings PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Russian_r2027.lng b/lng/lang_Russian_r2055.lng similarity index 97% rename from lng/lang_Russian_r2027.lng rename to lng/lang_Russian_r2055.lng index be2552ee6..f8720874c 100644 --- a/lng/lang_Russian_r2027.lng +++ b/lng/lang_Russian_r2055.lng @@ -1,6 +1,6 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -45,7 +45,7 @@ OPL %s Настройки игры Сбросить настройки Все ключи для игры удалены. -Прокрутка +Scrolling Speed Медленная Средняя Быстрая @@ -283,7 +283,8 @@ Bluetooth-адаптер может плохо работать с контро Разработчик Описание Игры BDM -Select Block Devices +Выбор BDM-устройств +Controller Settings Игры PS1 Режим показа игр PS1 POPSTARTER.ELF не найден в '%s'! diff --git a/lng/lang_SChinese_r2027.lng b/lng/lang_SChinese_r2055.lng similarity index 96% rename from lng/lang_SChinese_r2027.lng rename to lng/lang_SChinese_r2055.lng index 9b0be0718..39166c493 100644 --- a/lng/lang_SChinese_r2027.lng +++ b/lng/lang_SChinese_r2055.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese OPL %s @@ -45,7 +45,7 @@ X 游戏设置 删除设置 删除游戏所有的设置 -选定项滚动速度 +Scrolling Speed 较慢 中等 较快 @@ -284,6 +284,7 @@ Developer Description BDM Games Select Block Devices +Controller Settings PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Spanish_r2027.lng b/lng/lang_Spanish_r2055.lng similarity index 97% rename from lng/lang_Spanish_r2027.lng rename to lng/lang_Spanish_r2055.lng index fb6a38e0b..8232f4b97 100644 --- a/lng/lang_Spanish_r2027.lng +++ b/lng/lang_Spanish_r2055.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -45,7 +45,7 @@ Lista de juegos Ajustes Eliminar configuración Ajustes del juego borrados -Desplazamiento +Scrolling Speed Lento Medio Rápido @@ -284,6 +284,7 @@ Desarrollador Descripción Juegos BDM Select Block Devices +Controller Settings Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish_r2027.lng b/lng/lang_Swedish_r2055.lng similarity index 96% rename from lng/lang_Swedish_r2027.lng rename to lng/lang_Swedish_r2055.lng index b3f7b83d7..4f9c7cc6c 100644 --- a/lng/lang_Swedish_r2027.lng +++ b/lng/lang_Swedish_r2055.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -45,7 +45,7 @@ Spel-lista Spelinst. Ta bort inställningar Tog bort alla nycklar för spelet -Bläddra +Scrolling Speed Sakta Medel Snabb @@ -283,7 +283,8 @@ Lansering Utvecklare Beskrivning BDM Spel -Select Block Devices +Välj enhet +Controller Settings PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_TChinese_r2027.lng b/lng/lang_TChinese_r2055.lng similarity index 96% rename from lng/lang_TChinese_r2027.lng rename to lng/lang_TChinese_r2055.lng index 0c0a5dafb..7440d173d 100644 --- a/lng/lang_TChinese_r2027.lng +++ b/lng/lang_TChinese_r2055.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -45,7 +45,7 @@ X 遊戲設置 刪除設置 刪除遊戲所有的設置 -選定項滾動速度 +Scrolling Speed 較慢 中等 較快 @@ -284,6 +284,7 @@ Developer Description BDM Games Select Block Devices +Controller Settings PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! diff --git a/lng/lang_Turkish_r2027.lng b/lng/lang_Turkish_r2055.lng similarity index 97% rename from lng/lang_Turkish_r2027.lng rename to lng/lang_Turkish_r2055.lng index 0ed8a48c2..c19bdd81b 100644 --- a/lng/lang_Turkish_r2027.lng +++ b/lng/lang_Turkish_r2055.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -45,7 +45,7 @@ Oyun listesi Oyun ayarları Ayarları sil Oyunun tüm anahtarları kaldırıldı -Kaydırma +Scrolling Speed Yavaş Orta Hızlı @@ -284,6 +284,7 @@ Geliştirici Açıklama BDM Games Select Block Devices +Controller Settings PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. diff --git a/lng/lang_Vietnamese_r2027.lng b/lng/lang_Vietnamese_r2055.lng similarity index 97% rename from lng/lang_Vietnamese_r2027.lng rename to lng/lang_Vietnamese_r2055.lng index 52c1598e7..0d06613dc 100644 --- a/lng/lang_Vietnamese_r2027.lng +++ b/lng/lang_Vietnamese_r2055.lng @@ -1,6 +1,6 @@ # Translation by zidane89 -# Last update: July 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2027-48f95c9-2021-07-21 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1703-4c44ccd-2021-07-21 +# Last update: August 06, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese OPL %s @@ -45,7 +45,7 @@ Danh sách trò chơi Cài đặt Game Remove Settings Removed all keys for the game -Cuộn +Scrolling Speed Chậm Thường Nhanh @@ -284,6 +284,7 @@ Developer Description BDM Games Select Block Devices +Controller Settings Các trò chơi PS1 Chế độ hiển thị cho game PS1 POPSTARTER.ELF không có ở '%s'! From 99d8e3e2434cc21b81de9294eb05afa3ecf2d125 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 8 Aug 2021 01:06:53 -0700 Subject: [PATCH 236/269] update lang files --- lng/lang_Portuguese_BR_r2055.lng | 8 ++++---- lng/lang_Russian_r2055.lng | 6 +++--- lng/lang_Spanish_r2055.lng | 10 +++++----- lng/lang_Swedish_r2055.lng | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lng/lang_Portuguese_BR_r2055.lng b/lng/lang_Portuguese_BR_r2055.lng index f8973c48b..1f10d2147 100644 --- a/lng/lang_Portuguese_BR_r2055.lng +++ b/lng/lang_Portuguese_BR_r2055.lng @@ -1,5 +1,5 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: August 06, 2021 +# Last update: August 07, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese @@ -45,7 +45,7 @@ Lista de jogos Ajustes Remover configurações Todos os ajustes do jogo foram removidos -Scrolling Speed +Velocidade de rolagem Lenta Média Rápida @@ -283,8 +283,8 @@ Data de lançamento Desenvolvedor Descrição Jogos BDM -Selecione os Dispositivos de Entrada -Controller Settings +Selecionar dispositivos de entrada +Configurar controles Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Russian_r2055.lng b/lng/lang_Russian_r2055.lng index f8720874c..d499ef4be 100644 --- a/lng/lang_Russian_r2055.lng +++ b/lng/lang_Russian_r2055.lng @@ -1,5 +1,5 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: August 06, 2021 +# Last update: August 07, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian @@ -45,7 +45,7 @@ OPL %s Настройки игры Сбросить настройки Все ключи для игры удалены. -Scrolling Speed +Скорость прокрутки Медленная Средняя Быстрая @@ -284,7 +284,7 @@ Bluetooth-адаптер может плохо работать с контро Описание Игры BDM Выбор BDM-устройств -Controller Settings +Настройки контроллера Игры PS1 Режим показа игр PS1 POPSTARTER.ELF не найден в '%s'! diff --git a/lng/lang_Spanish_r2055.lng b/lng/lang_Spanish_r2055.lng index 8232f4b97..edc4c917b 100644 --- a/lng/lang_Spanish_r2055.lng +++ b/lng/lang_Spanish_r2055.lng @@ -1,5 +1,5 @@ -# Translation by lauchon22 -# Last update: August 06, 2021 +# Translation by lauchon22 and destro +# Last update: August 07, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -45,7 +45,7 @@ Lista de juegos Ajustes Eliminar configuración Ajustes del juego borrados -Scrolling Speed +Velocidad de Desplazamiento Lento Medio Rápido @@ -283,8 +283,8 @@ Lanzamiento Desarrollador Descripción Juegos BDM -Select Block Devices -Controller Settings +Seleccionar Dispositivos de Entrada +Ajustes de Mando Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish_r2055.lng b/lng/lang_Swedish_r2055.lng index 4f9c7cc6c..117b419ab 100644 --- a/lng/lang_Swedish_r2055.lng +++ b/lng/lang_Swedish_r2055.lng @@ -1,5 +1,5 @@ # Translation by Lord_Flaya -# Last update: August 06, 2021 +# Last update: August 07, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish @@ -45,7 +45,7 @@ Spel-lista Spelinst. Ta bort inställningar Tog bort alla nycklar för spelet -Scrolling Speed +Scrollhastighet Sakta Medel Snabb @@ -284,7 +284,7 @@ Utvecklare Beskrivning BDM Spel Välj enhet -Controller Settings +Kontroll-inställningar PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! From e07a1811d66dc3663434223f46edd5c6d93168f8 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Wed, 11 Aug 2021 09:43:17 +0100 Subject: [PATCH 237/269] Fix compiler warning char overflow --- src/elmsupport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elmsupport.c b/src/elmsupport.c index bfb41d532..860a1c937 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -218,7 +218,7 @@ static int elmScanVCDsHDD() { int fd, fd2, MountFD = 0, count = 0; const char *mountPoint = "pfs1:"; - char partition[250]; + char partition[261]; iox_dirent_t record; char scanned[10][9]; From 57ddc9de008c20eb7fd2b58c574a48ff746cd8c3 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 22 Aug 2021 14:50:59 -0700 Subject: [PATCH 238/269] reduce length of the OPL Version in order to view more digits of the commit number in the About page --- src/gui.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui.c b/src/gui.c index 4b039d224..75a819d2e 100644 --- a/src/gui.c +++ b/src/gui.c @@ -202,7 +202,9 @@ void guiShowAbout() char OPLVersion[40]; char OPLBuildDetails[40]; - snprintf(OPLVersion, sizeof(OPLVersion), "Open PS2 Loader %s", OPL_VERSION); + //START of OPL_DB tweaks + snprintf(OPLVersion, sizeof(OPLVersion), "OPL %s", OPL_VERSION); + //END of OPL_DB tweaks diaSetLabel(diaAbout, ABOUT_TITLE, OPLVersion); snprintf(OPLBuildDetails, sizeof(OPLBuildDetails), "GSM %s" From 1465a8ec44fc21648af3b1bae0e6e704eea30ab9 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 24 Aug 2021 17:07:20 -0700 Subject: [PATCH 239/269] update lang files --- lng/lang_Arabic_r2055.lng | 22 +++++++++++----------- lng/lang_German_r2055.lng | 6 +++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lng/lang_Arabic_r2055.lng b/lng/lang_Arabic_r2055.lng index e35442ea7..452b1b909 100644 --- a/lng/lang_Arabic_r2055.lng +++ b/lng/lang_Arabic_r2055.lng @@ -1,5 +1,5 @@ # translation by alimadhi -# Last update: August 06, 2021 +# Last update: August 21, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic @@ -45,7 +45,7 @@ SMB ﺔﻤﺋﺎﻗ ﺔﻛﺭﺎﺸﻣ ﻦﻜﻤﻳﻻ ﺔﺒﻌﻠﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﺕﺍﺩﺍﺪﻋﺇ ﺔﻟﺍﺯﺇ ﺔﺒﻌﻠﻟﺍ ﺢﻴﺗﺎﻔﻣ ﺔﻓﺎﻛ ﺔﻟﺍﺯﺇ -Scrolling Speed +ﺮﻳﺮﻤﺘﻟﺍ ﺔﻋﺮﺳ ﺀﻲﻄﺑ ﻂﺳﻮﺘﻣ ﻊﻳﺮﺳ @@ -64,17 +64,17 @@ Scrolling Speed ﻦﻳﻮﻜﺘﻟﺍ ﻆﻔﺣ ﺯﺎﻬﺠﻟﺍ ﺃﺪﺑ ﺚﻳﺪﺤﺗ -BDM ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ +BDM ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ ﺀﺪﺑ ﻊﺿﻭ HDD ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ ETH ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ APPS ﺕﺎﻘﻴﺒﻄﺘﻟﺍ ﻞﻴﻐﺸﺗ ﻲﺋﺎﻘﻠﺗ ﻱﻭﺪﻳ -NBD ﻡﺩﺎﺧ ﺃﺪﺑ -NBD ﺮﻓﺮﻴﺳ ﺃﺪﺑ ﻱﺭﺎﺟ -NBD ﻞﻴﻐﺸﺗ ﻱﺭﺎﺟ -NBD ﺮﻓﺮﻴﺳ ﺍﺪﺑ ﻲﻓ ﻞﺸﻓ -NBD ﻡﺩﺎﺧ ﻞﻴﻤﺤﺗ ﺀﺎﻐﻟﺍ +NBD ﻡﺩﺎﺧ ﻞﻴﻐﺸﺗ ﺃﺪﺑﺍ +... NBD ﻡﺩﺎﺧ ﻞﻴﻐﺸﺗ ﺀﺪﺑ +... ﻞﻴﻐﺸﺘﻟﺍ ﺪﻴﻗ NBD ﻡﺩﺎﺧ +NBD. ﻡﺩﺎﺧ ﻞﻴﻐﺸﺗ ﺀﺪﺑ ﻞﺸﻓ +... NBD ﻡﺩﺎﺧ ﻎﻳﺮﻔﺗ ٍﺭﺎﺟ IGR ﺭﺎﺴﻣ ﺔﻴﻔﻠﺨﻟﺍ ﻥﻮﻟ ﺺﻨﻟﺍ ﻥﻮﻟ @@ -282,9 +282,9 @@ s% ﻦﻣ ﻞﻤﺤﻣ s% ﺭﺍﺪﺻﻻﺍ ﺭﻮﻄﻣ ﻒﺻﻭ -BDM Games -Select Block Devices -Controller Settings +BDM ﺏﺎﻌﻟﺃ +ﺓﺰﻬﺟﻷﺍ ﺮﻈﺣ ﺩﺪﺣ +ﻢﻜﺤﺗ ﺕﺍﺩﺍﺪﻋﺇ PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_German_r2055.lng b/lng/lang_German_r2055.lng index 6cd248438..d7be70fe5 100644 --- a/lng/lang_German_r2055.lng +++ b/lng/lang_German_r2055.lng @@ -1,5 +1,5 @@ # German Translation by ps2guy and LopoTRI -# Last update: August 06, 2021 +# Last update: August 08, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German @@ -45,7 +45,7 @@ Spieleliste Spieleinst. Entferne Einstellungen Alle keys für das Spiel wurden entfernt -Scrolling Speed +Scrollgeschwindigkeit Langsam Mittel Schnell @@ -284,7 +284,7 @@ Entwickler Beschreibung BDM Spiele Wähle Blockgeräte -Controller Settings +Controller einstellungen PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! From a5884564c20c603da9901a0ef4f8860be2aa314d Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 26 Aug 2021 15:35:38 -0700 Subject: [PATCH 240/269] dialogs.c tweaks -- adjust the About page so all text fits within the screen in non-widescreen mode and also add horizontal lines to devide the OK at the end of each settings page --- src/dialogs.c | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/dialogs.c b/src/dialogs.c index b3c829af3..fed631eb9 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -163,7 +163,10 @@ struct UIItem diaBlockDevicesConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {"MX4SIO", -1}}}, {UI_SPACER}, {UI_BOOL, CFG_ENABLEMX4SIO, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, - {UI_BREAK}, + //START of OPL_DB tweaks + // {UI_BREAK}, + {UI_SPLITTER}, + //END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -413,7 +416,10 @@ struct UIItem diaCompatConfig[] = { {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_ALTSTARTUP}}}, {UI_SPACER}, {UI_STRING, COMPAT_ALTSTARTUP, 1, 1, -1, 0, 0, {.stringvalue = {"", "", &guiGameAltStartupNameHandler}}}, - {UI_BREAK}, + //START of OPL_DB tweaks + // {UI_BREAK}, + {UI_SPLITTER}, + //END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -439,7 +445,10 @@ struct UIItem diaVMCConfig[] = { {UI_BUTTON, COMPAT_VMC2_DEFINE, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, {UI_SPACER}, {UI_BUTTON, COMPAT_VMC2_ACTION, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, - {UI_BREAK}, + //START of OPL_DB tweaks + // {UI_BREAK}, + {UI_SPLITTER}, + //END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -526,7 +535,10 @@ struct UIItem diaGSConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_GSM_FIELD_FIX}}}, {UI_SPACER}, {UI_BOOL, GSMCFG_GSMFIELDFIX, 1, 1, _STR_HINT_GSM_FIELD_FIX, 0, 0, {.intvalue = {0, 0}}}, - {UI_BREAK}, + //START of OPL_DB tweaks + // {UI_BREAK}, + {UI_SPLITTER}, + //END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -554,7 +566,10 @@ struct UIItem diaCheatConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_CHEATMODE}}}, {UI_SPACER}, {UI_ENUM, CHTCFG_CHEATMODE, 1, 1, _STR_HINT_CHEATMODE, 0, 0, {.intvalue = {0, 0}}}, - {UI_BREAK}, + //START of OPL_DB tweaks + // {UI_BREAK}, + {UI_SPLITTER}, + //END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -838,19 +853,19 @@ struct UIItem diaAbout[] = { {UI_SPACER}, //START of OPL_DB tweaks - {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"BatRastard, belek666, crazyc, danielb, dlanor, doctorxyz, hominem.te.esse, ifcaro,", -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"BatRastard, belek666, crazyc, danielb, dlanor, doctorxyz, hominem.te.esse,", -1}}}, //END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, //START of OPL_DB tweaks - {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"izdubar, Jay-Jay, jimmikaelkael, Maximus32, misfire, Polo35, ps2netbox/ps2usb,", -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"ifcaro, izdubar, Jay-Jay, jimmikaelkael, Maximus32, misfire, Polo35,", -1}}}, //END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, //START of OPL_DB tweaks - {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"reprep, SP193, volca, ... and the anonymous ...", -1}}}, + {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"ps2netbox/ps2usb, reprep, SP193, volca, ... and the anonymous ...", -1}}}, {UI_SPLITTER}, //END of OPL_DB tweaks @@ -940,7 +955,10 @@ struct UIItem diaParentalLockConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_PARENLOCK_PASSWORD}}}, {UI_SPACER}, {UI_PASSWORD, CFG_PARENLOCK_PASSWORD, 1, 1, _STR_PARENLOCK_PASSWORD_HINT, 0, 0, {.stringvalue = {"", "", NULL}}}, - {UI_BREAK}, + //START of OPL_DB tweaks + // {UI_BREAK}, + {UI_SPLITTER}, + //END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -972,7 +990,10 @@ struct UIItem diaAudioConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_BOOT_SND_VOLUME}}}, {UI_SPACER}, {UI_INT, CFG_BOOT_SND_VOLUME, 1, 1, -1, 0, 0, {.intvalue = {0, 0, 0, 100}}}, - {UI_BREAK}, + //START of OPL_DB tweaks + // {UI_BREAK}, + {UI_SPLITTER}, + //END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -993,7 +1014,10 @@ struct UIItem diaControllerConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_SELECTBUTTON}}}, {UI_SPACER}, {UI_ENUM, CFG_SELECTBUTTON, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, - {UI_BREAK}, + //START of OPL_DB tweaks + // {UI_BREAK}, + {UI_SPLITTER}, + //END of OPL_DB tweaks #ifdef PADEMU {UI_BREAK}, {UI_BUTTON, PADEMU_GLOBAL_BUTTON, 1, 1, -1, 0, 0, {.label = {NULL, _STR_PADEMUCONFIG}}}, From bd9e20264f372ff521c84c5d2fbf8c1109e4e56a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 26 Aug 2021 18:30:02 -0700 Subject: [PATCH 241/269] fix check-format issue --- src/dialogs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dialogs.c b/src/dialogs.c index fed631eb9..653e8b6f7 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -1017,7 +1017,7 @@ struct UIItem diaControllerConfig[] = { //START of OPL_DB tweaks // {UI_BREAK}, {UI_SPLITTER}, - //END of OPL_DB tweaks +//END of OPL_DB tweaks #ifdef PADEMU {UI_BREAK}, {UI_BUTTON, PADEMU_GLOBAL_BUTTON, 1, 1, -1, 0, 0, {.label = {NULL, _STR_PADEMUCONFIG}}}, From 32f419769bcb77f3fd2e1512cd893977fa0df181 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 26 Aug 2021 18:53:29 -0700 Subject: [PATCH 242/269] dialogs.c tweaks 2 -- add one more horizontal line --- src/dialogs.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dialogs.c b/src/dialogs.c index 653e8b6f7..cdd264084 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -1021,7 +1021,10 @@ struct UIItem diaControllerConfig[] = { #ifdef PADEMU {UI_BREAK}, {UI_BUTTON, PADEMU_GLOBAL_BUTTON, 1, 1, -1, 0, 0, {.label = {NULL, _STR_PADEMUCONFIG}}}, - {UI_BREAK}, + //START of OPL_DB tweaks + // {UI_BREAK}, + {UI_SPLITTER}, + //END of OPL_DB tweaks #endif // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, From 04df6a05ad94c7d1dc046850861dfc77d64ecb29 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 26 Aug 2021 18:56:13 -0700 Subject: [PATCH 243/269] fix check-format issue 2 --- src/dialogs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dialogs.c b/src/dialogs.c index cdd264084..136a698d7 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -1024,7 +1024,7 @@ struct UIItem diaControllerConfig[] = { //START of OPL_DB tweaks // {UI_BREAK}, {UI_SPLITTER}, - //END of OPL_DB tweaks +//END of OPL_DB tweaks #endif // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, From 255a57c9fb2138fe9450fdeef607a454c9c571a4 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 30 Aug 2021 16:00:26 -0700 Subject: [PATCH 244/269] update lang files --- ...nian_r2055.lng => lang_Albanian_r2114.lng} | 56 +++++++++--------- ...Arabic_r2055.lng => lang_Arabic_r2114.lng} | 54 ++++++++--------- ...ian_r2055.lng => lang_Bulgarian_r2114.lng} | 50 ++++++++-------- ...buano_r2055.lng => lang_Cebuano_r2114.lng} | 56 +++++++++--------- ...tian_r2055.lng => lang_Croatian_r2114.lng} | 54 ++++++++--------- ...g_Czech_r2055.lng => lang_Czech_r2114.lng} | 56 +++++++++--------- ...Danish_r2055.lng => lang_Danish_r2114.lng} | 54 ++++++++--------- ...g_Dutch_r2055.lng => lang_Dutch_r2114.lng} | 54 ++++++++--------- ...pino_r2055.lng => lang_Filipino_r2114.lng} | 54 ++++++++--------- ...French_r2055.lng => lang_French_r2114.lng} | 54 ++++++++--------- ...German_r2055.lng => lang_German_r2114.lng} | 54 ++++++++--------- ...g_Greek_r2055.lng => lang_Greek_r2114.lng} | 52 ++++++++--------- ...ian_r2055.lng => lang_Hungarian_r2114.lng} | 54 ++++++++--------- ...an_r2055.lng => lang_Indonesian_r2114.lng} | 54 ++++++++--------- ...alian_r2055.lng => lang_Italian_r2114.lng} | 54 ++++++++--------- ...nese_r2055.lng => lang_Japanese_r2114.lng} | 54 ++++++++--------- ...Korean_r2055.lng => lang_Korean_r2114.lng} | 54 ++++++++--------- ...otian_r2055.lng => lang_Laotian_r2114.lng} | 56 +++++++++--------- ...rsian_r2055.lng => lang_Persian_r2114.lng} | 54 ++++++++--------- ...Polish_r2055.lng => lang_Polish_r2114.lng} | 54 ++++++++--------- ...r2055.lng => lang_Portuguese_BR_r2114.lng} | 54 ++++++++--------- ...se_r2055.lng => lang_Portuguese_r2114.lng} | 58 +++++++++---------- ...nian_r2055.lng => lang_Romanian_r2114.lng} | 56 +++++++++--------- ...ssian_r2055.lng => lang_Russian_r2114.lng} | 54 ++++++++--------- ...nese_r2055.lng => lang_SChinese_r2114.lng} | 54 ++++++++--------- ...anish_r2055.lng => lang_Spanish_r2114.lng} | 54 ++++++++--------- ...edish_r2055.lng => lang_Swedish_r2114.lng} | 54 ++++++++--------- ...nese_r2055.lng => lang_TChinese_r2114.lng} | 54 ++++++++--------- ...rkish_r2055.lng => lang_Turkish_r2114.lng} | 54 ++++++++--------- ...se_r2055.lng => lang_Vietnamese_r2114.lng} | 54 ++++++++--------- 30 files changed, 754 insertions(+), 874 deletions(-) rename lng/{lang_Albanian_r2055.lng => lang_Albanian_r2114.lng} (88%) rename lng/{lang_Arabic_r2055.lng => lang_Arabic_r2114.lng} (90%) rename lng/{lang_Bulgarian_r2055.lng => lang_Bulgarian_r2114.lng} (91%) rename lng/{lang_Cebuano_r2055.lng => lang_Cebuano_r2114.lng} (88%) rename lng/{lang_Croatian_r2055.lng => lang_Croatian_r2114.lng} (89%) rename lng/{lang_Czech_r2055.lng => lang_Czech_r2114.lng} (89%) rename lng/{lang_Danish_r2055.lng => lang_Danish_r2114.lng} (89%) rename lng/{lang_Dutch_r2055.lng => lang_Dutch_r2114.lng} (89%) rename lng/{lang_Filipino_r2055.lng => lang_Filipino_r2114.lng} (88%) rename lng/{lang_French_r2055.lng => lang_French_r2114.lng} (89%) rename lng/{lang_German_r2055.lng => lang_German_r2114.lng} (89%) rename lng/{lang_Greek_r2055.lng => lang_Greek_r2114.lng} (90%) rename lng/{lang_Hungarian_r2055.lng => lang_Hungarian_r2114.lng} (88%) rename lng/{lang_Indonesian_r2055.lng => lang_Indonesian_r2114.lng} (89%) rename lng/{lang_Italian_r2055.lng => lang_Italian_r2114.lng} (89%) rename lng/{lang_Japanese_r2055.lng => lang_Japanese_r2114.lng} (89%) rename lng/{lang_Korean_r2055.lng => lang_Korean_r2114.lng} (89%) rename lng/{lang_Laotian_r2055.lng => lang_Laotian_r2114.lng} (91%) rename lng/{lang_Persian_r2055.lng => lang_Persian_r2114.lng} (89%) rename lng/{lang_Polish_r2055.lng => lang_Polish_r2114.lng} (89%) rename lng/{lang_Portuguese_BR_r2055.lng => lang_Portuguese_BR_r2114.lng} (89%) rename lng/{lang_Portuguese_r2055.lng => lang_Portuguese_r2114.lng} (88%) rename lng/{lang_Romanian_r2055.lng => lang_Romanian_r2114.lng} (88%) rename lng/{lang_Russian_r2055.lng => lang_Russian_r2114.lng} (90%) rename lng/{lang_SChinese_r2055.lng => lang_SChinese_r2114.lng} (88%) rename lng/{lang_Spanish_r2055.lng => lang_Spanish_r2114.lng} (89%) rename lng/{lang_Swedish_r2055.lng => lang_Swedish_r2114.lng} (88%) rename lng/{lang_TChinese_r2055.lng => lang_TChinese_r2114.lng} (88%) rename lng/{lang_Turkish_r2055.lng => lang_Turkish_r2114.lng} (88%) rename lng/{lang_Vietnamese_r2055.lng => lang_Vietnamese_r2114.lng} (90%) diff --git a/lng/lang_Albanian_r2055.lng b/lng/lang_Albanian_r2114.lng similarity index 88% rename from lng/lang_Albanian_r2055.lng rename to lng/lang_Albanian_r2114.lng index 5477ac3c9..3e7c62944 100644 --- a/lng/lang_Albanian_r2055.lng +++ b/lng/lang_Albanian_r2114.lng @@ -1,9 +1,8 @@ # Translation by LoniTheFricc -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Albanian -OPL %s Ruaj Ndryshimet Mbrapa Opsionet e Networkit @@ -14,7 +13,7 @@ Gabim gjatë shkrimit të opsioneve! Dil Opsione Menu -Lojëra USB +Lojëra BDM Lojëra HDD Lojëra ETH Programe @@ -44,7 +43,6 @@ Kqyq Lista e Lojërave Konfigurimet e Lojës Hiq Konfigurimet -Hequr të gjithë çelësat nga loja. Scrolling Speed Ngadalë Mesatare @@ -55,16 +53,16 @@ Prisni. Gabim duke ngarkuar ID e Lojës. Rënditje Automatike. Gabim duke ngarkuar skedarin e gjuhës. -Çaktivizo korrigjimin e Ngjyrave. +Debug Colors Nuk u dallua nje telekomandë, duke pritur... -Aktivizo Artin e Kopertinës +Cover Art Ekran i gjerë Fike Duke Ngarkuar Konfigurimin... Duke Ruajtur Konfigurimin... Fillo Pajisjen Rifresko -Moda e Fillimit të BDM-s +BDM Start Mode Moda e Fillimit të HDD-s Moda e Fillimit të ETH-it Moda e Shfaqjes së Aplikacioneve @@ -78,7 +76,6 @@ Serveri NBD duke u shkarkuar... Rruga e IGR Ngjyra e Sfondit Ngjyra e Tekstit -- PS2 - - Serveri SMB - Lloji i Adresës IP Statik @@ -102,7 +99,7 @@ Riemërto Fshi Hap Opsionet e Ekranit -Lejo Operacionet e Modifikimit +Write Operations Mbaj mend lojen e fundit të luajtur Zgjidh Butonin Gabim, Loja është e fragmentuar. @@ -115,8 +112,6 @@ Zhvendo Syscalls Kapërce Video Imito DVD-DL Çaktivizo IGR -E pa Përdorur -E pa Përdorur Ndryshimi i Madhësisë do të riformatojë VMC-n. Krijo Fillo @@ -166,8 +161,6 @@ Moda 3 Moda 4 Moda 5 Moda 6 -Moda 7 -Moda 8 Konfiguro GSM Moda e Lidhjes Ethernet 100Mbit Full-duplex @@ -175,9 +168,8 @@ Moda e Lidhjes Ethernet 10Mbit Full-duplex 10Mbit Half-duplex Opsionet GSM -Aktiviyo GSM -Ndërron GSM Ndezur/Fikur. -VMODE +GSM Selector +Toggles GSM on/off. Moda e shfaqjes së personalizuar te detyruar. POZ-H Rregullim Horizontal. @@ -188,7 +180,7 @@ Rregullim të Tejkalimit e TV. Tejkalim FMV. Tejkalon Videot ne Mocion të Plotë. Opsionet e Hileve -Aktivizo Programin e hiles PS2RD +PS2RD Cheat Engine Lejo Programin e hiles PS2RD te modifikojë lojën. Moda e hiles PS2RD. Zgjedhje Automatike ose Zgjedhe të hileve te lojrave. @@ -213,7 +205,7 @@ Logoja e PS2 Shfaqet për një logo të vlefshme të diskut që përputhet me rajonin e konsolës. Konfiguro PADEMU Konfigurimet e Emulatorit te Pad-it -Aktivizo Emulatorin e Pad-it +Pad Emulator Aktivizon/Çaktivizon Emulatorin e Pad-it për lojën e zgjedhur. Moda e Emulatorit të Pad-it Zgjidj Modën e Emulatorit të Pad-it. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Opsionet për Port: Zgjidh Portën e Emulatorit te Pad-it për opsione. -Aktivizo Emulimin +Emulation Aktivizon/Çaktivizon Emulatorin e Pad-it për portën e zgjedhur. -Aktivizo Dridhjen +Vibration Aktivizon/Çaktivizon Dridhjen e Emulatorit të Pad-it për portën e zgjedhur. Adresa MAC e Adapterit BT USB: Telekomanda DS e lidhur me MAC Adresin: @@ -241,12 +233,12 @@ Po Jo Adapteri Bluetooth duhet të jetë plotësisht i pajtueshëm me telekomandat DS3/DS4. Adapteri Bluetooth mund të mos funksionojë si duhet me kontrolluesit DS3/DS4. -Aktivizo Emulimin e Multitap +Multitap Emulation Aktivizon/Çaktivizon emulimin e Multitap për lojën e zgjedhur. Emulatori i Multitap në Portën: Zgjidh portën për Emulimin e Multitap. -Çaktivizo Zgjidhjen e DS3-ve të rreme. -Disa DS3 të rreme kanë nevojë për zgjidhje, ky opsion do ta çaktivizoj atë. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emulo Shfletimin FIELD Rregullo lojërat që kanë anomali në mënyrat progresive të videos. Opsionet e Kyçit Prindëror. @@ -259,14 +251,17 @@ Opsionet e Versionit: Gabim - ky fjalëkalim nuk mund të përdoret. Skedari VMC %s është i fragmentuar.Vazdho me Kartën e Memorjes ne Portën %d? Opsionet Audio -Aktivizo Tingujt -Aktivizo Tingullin e nisjes +Sound Effects +Boot Sound Volumi i Tingujve Volumi i Tinguliit të nisjes Konfirmo ndryshimet e Videos? Depozito Listën e Lojerave? (HDD) -Aktivizo Njoftimet -%s ngarkuar nga %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Opsione Konfigurimet e Lojës u ruajtën. %s konfigurimet u heqën. @@ -282,9 +277,10 @@ Zhanri Publikimi Zhvilluesi Përshkrimi -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). Lojrat PS1 Moda e Shfaqjes se Lojrave PS1 POPSTARTER.ELF nuk është gjetur tek '%s'! diff --git a/lng/lang_Arabic_r2055.lng b/lng/lang_Arabic_r2114.lng similarity index 90% rename from lng/lang_Arabic_r2055.lng rename to lng/lang_Arabic_r2114.lng index 452b1b909..fa122e289 100644 --- a/lng/lang_Arabic_r2055.lng +++ b/lng/lang_Arabic_r2114.lng @@ -1,9 +1,8 @@ # translation by alimadhi -# Last update: August 21, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic -OPL ﺕﺍﺮﻴﻴﻐﺘﻟﺍ ﻆﻔﺣ ﻒﻠﺧ ﺔﻜﺒﺸﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ @@ -14,7 +13,7 @@ s% ﻲﻓ ﺕﺍﺩﺍﺪﻋﻹﺍ ﻆﻔﺣ ﻢﺗ ﺝﻭﺮﺧ ﺕﺍﺩﺍﺪﻋﻻﺍ ﺔﻤﺋﺎﻘﻟﺍ -USB ﺏﺎﻌﻟﺃ +BDM ﺏﺎﻌﻟﺃ HDD ﺏﺎﻌﻟﺃ ETH ﺏﺎﻌﻟﺃ ﺕﺎﻘﻴﺒﻄﺗ @@ -44,7 +43,6 @@ SMB ﺔﻤﺋﺎﻗ ﺔﻛﺭﺎﺸﻣ ﻦﻜﻤﻳﻻ ﺏﺎﻌﻟﻻﺍ ﺔﻤﺋﺎﻗ ﺔﺒﻌﻠﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﺕﺍﺩﺍﺪﻋﺇ ﺔﻟﺍﺯﺇ -ﺔﺒﻌﻠﻟﺍ ﺢﻴﺗﺎﻔﻣ ﺔﻓﺎﻛ ﺔﻟﺍﺯﺇ ﺮﻳﺮﻤﺘﻟﺍ ﺔﻋﺮﺳ ﺀﻲﻄﺑ ﻂﺳﻮﺘﻣ @@ -55,16 +53,16 @@ SMB ﺔﻤﺋﺎﻗ ﺔﻛﺭﺎﺸﻣ ﻦﻜﻤﻳﻻ ﺔﺒﻌﻠﻟﺍ ID ﻞﻴﻤﺤﺗ ﺀﺎﻨﺛﺍ ﺄﻄﺧ ﻲﺋﺎﻘﻠﺗ ﺮﻳﺮﻤﺗ ﺔﻐﻠﻟﺍ ﻒﻠﻣ ﻞﻴﻤﺤﺗ ﻲﻓ ﺄﻄﺧ -ﻥﺍﻮﻟﻷﺍ ﺢﻴﺤﺼﺗ ﻞﻴﻄﻌﺗ +Debug Colors ... ﺮﻈﺘﻧﺍ ، ﻢﻜﺤﺗ ﺓﺪﺣﻭ ﻰﻠﻋ ﻒﺸﻜﻟﺍ ﻢﺘﻳ ﻢﻟ -ﺔﺒﻌﻠﻟﺍ ﺔﻔﻠﻏﺍ ﺽﺮﻋ ﻦﻴﻜﻤﺗ +Cover Art ﺔﻀﻳﺮﻋ ﺔﺷﺎﺷ ﻞﻴﻐﺸﺘﻟﺍ ﻑﺎﻘﻳﺇ ﻦﻳﻮﻜﺘﻟﺍ ﻞﻴﻤﺤﺗ ﻦﻳﻮﻜﺘﻟﺍ ﻆﻔﺣ ﺯﺎﻬﺠﻟﺍ ﺃﺪﺑ ﺚﻳﺪﺤﺗ -BDM ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ ﺀﺪﺑ ﻊﺿﻭ +BDM Start Mode HDD ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ ETH ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ APPS ﺕﺎﻘﻴﺒﻄﺘﻟﺍ ﻞﻴﻐﺸﺗ @@ -78,7 +76,6 @@ NBD. ﻡﺩﺎﺧ ﻞﻴﻐﺸﺗ ﺀﺪﺑ ﻞﺸﻓ IGR ﺭﺎﺴﻣ ﺔﻴﻔﻠﺨﻟﺍ ﻥﻮﻟ ﺺﻨﻟﺍ ﻥﻮﻟ -- PS2 - - SMB ﻡﺩﺎﺧ - IP ﻥﺍﻮﻨﻋ ﻉﻮﻧ ﺔﻟﺎﺤﻟﺍ @@ -102,7 +99,7 @@ IP ﻑﺬﺣ ﻞﻴﻐﺸﺗ ﺽﺮﻌﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ -ﺔﺑﺎﺘﻜﻟﺍ ﺕﺎﻴﻠﻤﻋ ﻦﻴﻜﻤﺗ +Write Operations ﺎﻫﺭﺎﻴﺘﺧﺍ ﻢﺗ ﺔﺒﻌﻟ ﺮﺧﺁ ﺮﻛﺬﺗ ﺭﺰﻟﺍ ﺮﺘﺧﺍ ﺔﺋﺰﺠﻣ ﺔﺒﻌﻠﻟﺍ ،ﺄﻄﺧ @@ -115,8 +112,6 @@ Syscalls Unhook ﻮﻳﺪﻴﻔﻟﺍ ﺯﺎﻴﺘﺟﺍ DVD-DL ﻲﻛﺎﺤﻣ IGR ﻞﻴﻄﻌﺗ -ﻞﻤﻌﺘﺴﻣ ﺮﻴﻏ -ﻞﻤﻌﺘﺴﻣ ﺮﻴﻏ VMC ـﻟﺍ ﺔﺌﻴﻬﺗ ﺓﺩﺎﻋﺇ ﻰﻟﺍ ﻱﺩﺆﻳ ﻢﺠﺤﻟﺍ ﺮﻴﻐﺗ ﺀﺎﺸﻧﺍ ﺃﺪﺑ @@ -166,8 +161,6 @@ DMA ﻊﺿﻮﻟﺍ 4 ﻊﺿﻭ 5 ﻊﺿﻭ 6 ﻊﺿﻭ -7 ﻊﺿﻭ -8 ﻊﺿﻭ GSM ﻦﻳﻮﻜﺗ ﻚﻨﻠﺛﺮﻳﺍ ﺔﻠﺻﻭ ﻊﺿﻭ 100Mbit ﻩﺎﺠﺗﻻﺍ ﺔﻴﺋﺎﻨﺛ @@ -175,9 +168,8 @@ GSM ﻦﻳﻮﻜﺗ 10Mbit ﻩﺎﺠﺗﻻﺍ ﺔﻴﺋﺎﻨﺛ 10Mbit ﺝﻭﺩﺰﻣ ﻒﺼﻧ GSM ﺕﺍﺩﺍﺪﻋﺇ -GSM ﻦﻴﻜﻤﺗ +GSM Selector ﻑﺎﻘﻳﺇ ﻭﺍ ﻞﻴﻐﺸﺗ GSM ﻞﻳﺪﺒﺗ -VMODE ﺽﺮﻌﻠﻟ ﺺﺼﺨﻣ ﻉﻮﻧ ﺭﺎﺒﺟﺍ H-POS ﻲﻘﻓﺍ ﻞﻳﺪﻌﺗ @@ -188,7 +180,7 @@ V-POS FMV ﺯﺎﻴﺘﺟﺍ ﻮﻳﺪﻴﻔﻟﺍ ﺔﻛﺮﺤﻟ ﻞﻣﺎﻛ ﻲﻄﺨﺗ ﺶﻐﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ -ﺶﻐﻟﺍ ﻙﺮﺤﻣ ﻦﻴﻜﻤﺗ +PS2RD Cheat Engine ﺏﺎﻌﻟﻷﺍ ﺢﻴﺤﺼﺗ ﻦﻣ ﺶﻐﻟﺍ ﻙﺮﺤﻣ ﺢﻴﺘﻳ ﺶﻐﻟﺍ ﻙﺮﺤﻣ ﻊﺿﻭ ﺔﺒﻌﻠﻟﺍ ﺶﻏ ﺮﺘﺧﺍ ﻭﺍ ﻲﺋﺎﻘﻠﺗ ﺪﻳﺪﺤﺗ @@ -213,7 +205,7 @@ FMV ﺯﺎﻴﺘﺟﺍ .ﻢﻜﺤﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻘﻄﻨﻣ ﻖﺑﺎﻄﻳ ﺢﻟﺎﺻ ﺹﺮﻗ ﺭﺎﻌﺸﻟ ﺽﻭﺮﻌﻣ PADEMU ﻦﻳﻮﻜﺗ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﺕﺍﺩﺍﺪﻋﺍ -ﻢﻜﺤﺗ ﻲﻛﺎﺤﻣ ﻦﻴﻜﻤﺗ +Pad Emulator ﺔﺒﻌﻟ ﺪﻳﺪﺤﺘﻟ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻑﺎﻘﻳﺍ/ﻞﻴﻐﺸﺗ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻊﺿﻭ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻊﺿﻭ ﺭﺎﻴﺘﺧﺍ @@ -221,9 +213,9 @@ PADEMU ﻦﻳﻮﻜﺗ ﺙﻮﺗﻮﻠﺑ 3/4 ﻦﺸﻴﺘﺳ ﻲﻠﺑ ﻢﻜﺤﺗ :ﺝﺮﺨﻤﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ .ﺕﺍﺩﺍﺪﻋﻼﻟ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﺝﺮﺨﻣ ﺪﻳﺪﺤﺗ -ﻲﻛﺎﺤﻤﻟﺍ ﻦﻴﻜﻤﺗ +Emulation ﺝﺮﺨﻤﻟﺍ ﺪﻳﺪﺤﺘﻟ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻑﺎﻘﻳﺍ/ﻞﻴﻐﺸﺗ -ﺯﺍﺰﺘﻫﻻﺍ ﻞﻴﻜﻤﺗ +Vibration ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﺝﺮﺨﻣ ﺭﺎﻴﺘﺧﻻ ﺯﺍﺰﺘﻫﻻﺍ ﻑﺎﻘﻳﺍ/ﻞﻴﻐﺸﺗ ﺙﻮﺗﻮﻠﺒﻟﺍ ﻲﺒﺳﺍﻮﻴﻟﺍ ﻝﻮﺤﻤﻟ ﻙﺎﻤﻟﺍ ﻥﺍﻮﻨﻋ :ﻙﺎﻤﻟﺍ ﻥﺍﻮﻨﻋ ﻰﻟﺍ ﻢﻜﺤﺘﻟﺍ ﻥﺍﺮﺘﻗﺍ @@ -241,12 +233,12 @@ ID: ﻊﻧﺎﺻ ﻻ DS4. / DS3 ﻢﻜﺤﺘﻟﺍ ﺕﺍﺪﺣﻭ ﻊﻣ ﺎﻣﺎﻤﺗ ﺔﻘﻓﺍﻮﺘﻣ ﺙﻮﺗﻮﻠﺑ ﻝﻮﺤﻣ ﻥﻮﻜﻳ ﻥﺃ ﺐﺠﻳ DS4. / DS3 ﻢﻜﺤﺘﻟﺍ ﺕﺍﺪﺣﻭ ﻊﻣ ﺢﻴﺤﺻ ﻞﻜﺸﺑ ﺙﻮﺗﻮﻠﺑ ﻝﻮﺤﻣ ﻞﻤﻌﻳ ﻻ ﺪﻗ -ﻝﺎﺳﺭﻹﺍ ﺩﺪﻌﺗ ﺓﺎﻛﺎﺤﻣ ﻦﻴﻜﻤﺗ +Multitap Emulation .ﺓﺭﺎﺘﺨﻣ ﺔﺒﻌﻟ ﻞﺟﺍ ﻦﻣ ﺕﺎﻛﺮﺤﺘﻟﺍ ﺓﺩﺪﻌﺘﻣ ﺓﺎﻛﺎﺤﻣ ﻑﺎﻘﻳﺇ / ﻞﻴﻐﺸﺗ ﺬﻔﻨﻤﻟﺍ ﻰﻠﻋ ﻲﻛﺎﺤﻤﻟﺍ ﺩﺪﻌﺘﻣ ﺮﻘﻧ ﻲﻛﺎﺤﻤﻟﺍ ﺩﺪﻌﺘﻣ ﺮﻘﻧ ﻞﺟﺍ ﻦﻣ ﺬﻔﻨﻣ ﺮﺘﺧﺍ -ﺔﻴﻤﻫﻮﻟﺍ ﻢﻜﺤﺘﻟﺍ ﺓﺪﺣﻮﻟ ﻞﺤﻟﺍ ﻞﻴﻄﻌﺗ -ﻪﻠﻴﻄﻌﺗ ﺭﺎﻴﺨﻟﺍ ﺍﺬﻫ ﻱﺩﺆﻴﺳ ،ﻞﺣ ﻰﻟﺍ ﺝﺎﺘﺤﺗ ﺕﺎﻤﻜﺤﺘﻟﺍ ﺾﻌﺑ +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. ﺐﻴﻠﻘﺘﻟﺍ FIELD ﺓﺎﻛﺎﺤﻣ .ﻲﺠﻳﺭﺪﺘﻟﺍ ﻮﻳﺪﻴﻔﻟﺍ ﻉﺎﺿﻭﺃ ﺖﺤﺗ ﺝﺭﺪﻨﺗ ﻲﺘﻟﺍ ﺏﺎﻌﻟﻸﻟ ﺡﻼﺻﺇ ﻦﻳﺪﻟﺍﻮﻟﺍ ﻞﻔﻗ ﺕﺍﺩﺍﺪﻋﺇ @@ -259,14 +251,17 @@ DS4. / DS3 ﻢﻜﺤﺘﻟﺍ ﺕﺍﺪﺣﻭ ﻊﻣ ﺢﻴﺤﺻ ﻞﻜﺸﺑ .ﻩﺬﻫ ﺭﻭﺮﻤﻟﺍ ﺔﻤﻠﻛ ﻡﺍﺪﺨﺘﺳﺍ ﻦﻜﻤﻳ ﻻ - ﺄﻄﺧ d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞﺻﺍﻮﺗ .ﺃﺰﺠﻣ s% VMC ﻒﻠﻣ ﺕﻮﺼﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ -ﺕﻮﺼﻟﺍ ﺕﺍﺮﺛﺆﻣ ﻦﻴﻜﻤﺗ -ﺕﻮﺼﻟﺍ ﺪﻴﻬﻤﺗ ﻦﻴﻜﻤﺗ +Sound Effects +Boot Sound ﺔﻴﺗﻮﺼﻟﺍ ﺕﺍﺮﺛﺆﻤﻟﺍ ﻢﺠﺣ ﺪﻴﻬﻤﺘﻟﺍ ﺕﻮﺻ ﻢﺠﺣ ؟ﻮﻳﺪﻴﻔﻟﺍ ﻊﺿﻭ ﺮﻴﻴﻐﺗ ﺪﻴﻛﺄﺗ (HDD) ﺖﻗﺆﻤﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺏﺎﻌﻟﺃ ﺔﻤﺋﺎﻗ -ﺕﺍﺭﺎﻌﺷﻹﺍ ﻦﻴﻜﻤﺗ -s% ﻦﻣ ﻞﻤﺤﻣ s% +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. ﺕﺍﺭﺎﻴﺨﻟﺍ .ﺔﺒﻌﻠﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﻆﻔﺣ ﻢﺗ .ﺕﺍﺩﺍﺪﻋﻹﺍ ﺔﻟﺍﺯﺇ ﺖﻤﺗ %s @@ -282,9 +277,10 @@ s% ﻦﻣ ﻞﻤﺤﻣ s% ﺭﺍﺪﺻﻻﺍ ﺭﻮﻄﻣ ﻒﺻﻭ -BDM ﺏﺎﻌﻟﺃ -ﺓﺰﻬﺟﻷﺍ ﺮﻈﺣ ﺩﺪﺣ +Block Devices ﻢﻜﺤﺗ ﺕﺍﺩﺍﺪﻋﺇ +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_Bulgarian_r2055.lng b/lng/lang_Bulgarian_r2114.lng similarity index 91% rename from lng/lang_Bulgarian_r2055.lng rename to lng/lang_Bulgarian_r2114.lng index 7f4c5faac..5e5a31a7b 100644 --- a/lng/lang_Bulgarian_r2055.lng +++ b/lng/lang_Bulgarian_r2114.lng @@ -1,9 +1,8 @@ # translation by vsub and wisi -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian -OPL %s Запазване на промените Назад Мрежови настройки @@ -14,7 +13,7 @@ OPL %s Изход Настройки Меню -USB Игри +BDM Игри HDD Игри ETH Игри Приложения @@ -44,7 +43,6 @@ X (Хикс) Списък Игри Опции Изчистване на настройките -Изчистени всички бутони за играта Scrolling Speed бавно средно @@ -55,16 +53,16 @@ Scrolling Speed Грешка при зареждането на Game ID Сортиране Грешка при зареждането на езиковия файл -Скриване на "цветове за грешки" +Debug Colors Не е включен контролер. Чакам... -Показване на "Обложки на игрите" +Cover Art Широк екран Изключване Зареждам настройките Запазвам настройките... Стартиране на устройството Опресни -BDM режим - стартиране +BDM Start Mode HDD режим - стартиране ETH режим - стартиране Меню "Приложения" - стартиране @@ -78,7 +76,6 @@ NBD сървърът се изключва... Изход от игра (IGR) към: Цвят на фона Цвят на текста -- PS2 - - SMB Сървър - IP адрес тип Статичен @@ -102,7 +99,7 @@ NetBIOS Изтрий Старт Визуални настройки -Изтриване и Преименуване +Write Operations Запомняне на последната игра Бутон за избор Грешка - играта е фрагментирана! @@ -115,8 +112,6 @@ NetBIOS 0 PSS режим Емулиране на DVD-DL Изключване на IGR -Unused -Unused При промяна на обема, VMC ще бъде форматирана! Създаване Стартиране @@ -166,8 +161,6 @@ Game ID режим 4 режим 5 режим 6 -режим 7 -режим 8 GSM видеорежим Скорост на мрежата и режим 100 Mbit пълен дуплекс @@ -175,9 +168,8 @@ GSM видеорежим 10 Mbit пълен дуплекс 10 Mbit полу-дуплекс GSM настройки -Използване на GSM +GSM Selector Сменя състоянието -Видеорежим PS2 ще е задължен да го използва Регулиране по хоризонтала Хоризонтално отместване @@ -213,7 +205,7 @@ PS2 Лого Показва се ако е валидно и съвпада с региона на конзолата Настройки на PADEMU Емулатор за контролер - настройки -Включване на PADEMU +Pad Emulator Включва/изключва PADEMU за избраната игра Режим на емулация Избор на свързно устройство. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Настройки на порта: Избор на порта, за който да се зададат настройки. -Активиране на емулацията +Emulation Включва/изключва емулациятя за този порт. -Активиране на вибрация +Vibration Включва/изключва вибрация за този емулиран порт. USB BlueTooth MAC адрес: DS контролер MAC адрес: @@ -241,12 +233,12 @@ LMP версия: не Свързаният BlueTooth адаптер би трябвало да е напълно съвместим с DS3/DS4 контролери. Свързаният BlueTooth адаптер може да не работи правилно с DS3/DS4 контролери. -Eмулиране на Multitap +Multitap Emulation Включва/изключва емулацията на Multitap за избраната игра. Емулация на Multitap за порт Избор на порт, на който да се емулира Multitap. -Деактивиране на корекция при фалшиви DS3 -Неоригинални DS3 контролери се нуждаят от тази корекция. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Емулация на FIELD-бит превкл. Корекция за игри с видеорежим с прогресивна развивка. Родителски контрол @@ -259,14 +251,17 @@ Eмулиране на Multitap Грешка - невалидна парола. VMC %s файлът е фрагментиран. Продължаване с Memory Card в слот %d? Звукови настройки -Звукови ефекти +Sound Effects Звук при Начално зареждане Сила на Звуковите ефекти Сила на звука на Начално зареждане Потвърждаване на промените на видеорежима? Кеширане списъка с игри (ЗУТМД - HDD) -Видими на Известия -%s зареден от %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Настройките на игри запазени. %s настройки премахнати. @@ -282,9 +277,10 @@ Options Издадена Производител Описание -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Cebuano_r2055.lng b/lng/lang_Cebuano_r2114.lng similarity index 88% rename from lng/lang_Cebuano_r2055.lng rename to lng/lang_Cebuano_r2114.lng index a015af219..3ed16b29b 100644 --- a/lng/lang_Cebuano_r2055.lng +++ b/lng/lang_Cebuano_r2114.lng @@ -1,9 +1,8 @@ # Translation by Colton Silva -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Cebuano -Open PS2 Loader %s Tipigi ang mga pagbag-o Likod Mga setting sa Network @@ -14,7 +13,7 @@ Sayup nga mga setting sa pagsulat! Paggawas Setting Menu -Dula sa USB +Dula sa BDM Dula sa HDD Dula sa ETH Apps @@ -44,7 +43,6 @@ Krus Lista Settings sa dula Tangtanga ang setting -Gikuha ang tanan nga mga yawi alang sa dula. Scrolling Speed Hinay Medium @@ -55,16 +53,16 @@ Pahilog hulat Sayup samtang gikarga ang Game ID. Awtomatik nga paghan-ay Sayup sa pagkarga sa file sa sinultian -I-disable ang kulay sa pag-debug +Debug Colors Wala’y nakita nga tigpugong, naghulat... -Pagpalihok sa Cover Art +Cover Art Malapad nga screen Power-off Nilo-load ang config Sine-save ang config Pagsugod sa Device Pagpalagsik -BDM aparato simula mode +BDM Start Mode HDD aparato simula mode ETH aparato simula mode Mga application simula mode @@ -78,7 +76,6 @@ Pagdiskarga sa NBD Server. IGR path kolor sa background kolor sa teksto -- PS2 - - SMB Server - Klase sa IP address Static @@ -102,7 +99,7 @@ Igngalan usab tangtangon Pagdagan Ipakita ang mga setting -Pagpalihok Pagsulat Operations +Write Operations Hinumdomi ang Katapusan nga Dula Select nga buton Sayup, ang dula ay mabahinbahin @@ -115,8 +112,6 @@ Alisin sa pagkakakawit ng Syscalls 0 PSS mode I-emulate nga DVD-DL I-disable mga IGR -Unused -Unused Ang pagbag-o sa gidak-on mag-usab sa VMC. Paghimo Pagsugod @@ -166,8 +161,6 @@ Mode 3 Mode 4 Mode 5 Mode 6 -Mode 7 -Mode 8 I-configure ang GSM Ethernet speed at duplex setting 100Mbit full-duplex @@ -175,9 +168,8 @@ Ethernet speed at duplex setting 10Mbit full-duplex 10Mbit half-duplex Settings sa GSM -Pagpaandar sa GSM -Toggles GSM ON or OFF -VMODE +GSM Selector +Toggles GSM on/off. Gipugos nga custom display mode. H-POS Horizontal Adjustment @@ -188,7 +180,7 @@ Overscan Adjustment FMV Skip Laktaw ang Mga Video sa Tibuok nga Paglihok Settings sa cheat -Pagpalihok sa PS2RD Cheat Engine +PS2RD Cheat Engine Gihangyo nga i-patch sa PS2RD Cheat Engine ang imong dula. PS2RD Cheat Engine Mode Awto. pagpili or pagpili sa mga cheat sa dula @@ -213,7 +205,7 @@ PS2 Logo Gipakita alang sa usa ka balido nga logo sa disc nga nahiangay sa rehiyon sa console. I-configure ang PADEMU Settings sa Pad Emulator -I-enable ang PadEmulator +Pad Emulator Gipasiga / gipatay ang Pad Emulator alang sa pinili nga dula. Mode ng Pad Emulator Pilia ang mode nga Pad Emulator. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Settings alang sa port: Pilia ang Pad Emulator port alang sa mga setting. -Pagpalihok sa pagsundog +Emulation Gipasiga / gipalong ang Pad Emulator alang sa pinili nga port. -Paglihok sa Vibration +Vibration Nag-on / off nga pagkurog alang sa napili sa Pad Emulator port. Usb bluetooth adapter mac address: DS Controller paired to mac address: @@ -241,12 +233,12 @@ Opo Dili Ang Bluetooth adapter kinahanglan nga hingpit nga katugma sa mga kontrol sa DS3 / DS4. Ang Bluetooth adapter mahimong dili molihok sa mga tigdumala sa DS3 / DS4. -Paglihok sa Multitap Emulation +Multitap Emulation Gipasiga / gipalayo ang pagsundog sa Multitap alang sa pinili nga dula. Multitap emulator sa port Pagpili usa ka port alang sa pagsundog sa Multitap. -Disable Fake DS3 Workaround -Ang pipila nga peke nga DS3s kinahanglan nga solusyon, kini nga kapilian dili pag-disable niini. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Sundoga ang FIELD Flipping Pag-ayo alang sa mga dula nga ning-glitch ubos sa mga progresibo nga mga mode sa video. Setting sa Parental Lock @@ -259,14 +251,17 @@ Opsyon sa build: Sayop - dili magamit ang kini nga password. Ang VMC% s file nabahinbahin. Padayon sa Memory Card sa slot% d? Setting sa Audio -Pagpalihok sa Sound Effects -Pagpalihok sa Boot Sound +Sound Effects +Boot Sound Sound Effects Volume Boot Sound Volume Gikumpirma nga "video mode change"? Cache Game List (HDD) -Pagpalihok sa Notifications -%s Nag-load gikan sa %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Nai-save ang "Game settings". %s settings ay nai-alis. @@ -282,9 +277,10 @@ Genre Buhian Debeloper Paghulagway -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Croatian_r2055.lng b/lng/lang_Croatian_r2114.lng similarity index 89% rename from lng/lang_Croatian_r2055.lng rename to lng/lang_Croatian_r2114.lng index e5f1cc2fe..c276b3023 100644 --- a/lng/lang_Croatian_r2055.lng +++ b/lng/lang_Croatian_r2114.lng @@ -1,9 +1,8 @@ # Translation by Blacky5678 -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Croatian -OPL %s Spremi Promjene Natrag Network Settings @@ -14,7 +13,7 @@ Greska zapisivanja postavki! Izlaz Postavke Izbornik -USB Igre +BDM Igre HDD Igre ETH Igre Aplikacije @@ -44,7 +43,6 @@ Kriz Lista Igara Postavke Igre Ukloni Postavke -Uklonjeni svi kljucevi za igru. Scrolling Speed Sporo Srednje @@ -55,16 +53,16 @@ Molimo, sacekajte. Greska tijekom ucitavanja ID-a igre. Automatsko Sortiranje Greska ucitavanja jezicne datoteke. -Onemoguci Debug Boje +Debug Colors Kontroler nije primijecen, cekanje... -Omoguci Naslovnice Igara +Cover Art Siroki Zaslon Ugasi Ucitavanje konfiguracije... Spremanje konfiguracije... Zapocni Uredaj Osvjezi -Pocetni Nacin BDM Uredaja +BDM Start Mode Pocetni Nacin HDD Uredaja Pocetni Nacin ETH Uredaja Nacin Prikaza Aplikacijskog Izbornika @@ -78,7 +76,6 @@ Gasenje NBD Server... IGR Putanja Boja Pozadine Boja Teksta -- PS2 - - SMB Server - Vrsta IP Adrese Staticna @@ -102,7 +99,7 @@ Preimenuj Obrisi Pokreni Postavke Zaslona -Omoguci Operacije Pisanja +Write Operations Zapamti Zadnju Upaljenu Igru Tipka za Odabir Greska, igra je fragmentirana. @@ -115,8 +112,6 @@ Otkaci Syscalls Preskoci Videe Emuliraj DVD-DL Onemoguci IGR -Nekoristeno -Nekoristeno Mijenjanje velice ce preurediti VMC. Stvori Zapocni @@ -166,8 +161,6 @@ Nacin 3 Nacin 4 Nacin 5 Nacin 6 -Nacin 7 -Nacin 8 Konfiguriraj GSM Nacin Povezivanja Etherneta 100Mbit Puni-dupleks @@ -175,9 +168,8 @@ Nacin Povezivanja Etherneta 10Mbit Puni-dupleks 10Mbit Pola-dupleksa GSM Postavke -Omoguci GSM +GSM Selector Uklj./Isklj. GSM -VMOD Forsirani prilagodeni nacin ekrana. H-POZ Horizontalno nastimavanje. @@ -188,7 +180,7 @@ Nastimavanje skaliranja. Preskoci FMV Preskakanje FMV-a Postavke Varanja -Omoguci PS2RD Cheat Engine +PS2RD Cheat Engine Dopusti PS2RD Cheat Engine da zakrpa tvoju igru. Nacin PS2RD Cheat Engine Automatski odabir ili odaberi varanja za igru. @@ -213,7 +205,7 @@ PS2 Logo Displayed for a valid disc logo matching the console's region. Konfiguriraj PADEMU Postavke Pad Emulatora -Omoguci Pad Emulator +Pad Emulator Uklj./Isklj. Pad Emulator za odabranu igru. Nacin Pad Emulatora Odabire nacin Pad Emulatora. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Postavke Za Port: Odaberi port za postavke Pad Emulatora. -Omoguci Emulaciju +Emulation Uklj./Isklj. Pad Emulator za odabrani port. -Omoguci Vibraciju +Vibration Uklj./Isklj. vibraciju za odabrani port Pad Emulatora. MAC Adresa USB Bluetooth Adaptera: DS Kontroler uparen na MAC Adresu: @@ -241,12 +233,12 @@ Da Ne Bluetooth adapter bi trebao biti potpuno kompatibilan sa DS3/DS4 kontrolerom. Bluetooth adapter mozda nece raditi ispravno sa DS3/DS4 kontrolerom. -Omoguci Emulaciju Multitapa +Multitap Emulation Uklj./Isklj. emulaciju Multitapa za odabranu igru. Emulator Multitapa na Portu: Odaberi port za emulaciju Multitapa. -Onemoguci Lazne DS3 Obilaske -Neki lazni DS3 ce trebati obilaske, ova postavka ce to onemoguciti. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emuliraj preklapanje FIELD-a Zakrpe za igre koje se kvare pod progresivnim video nacinom. Postavke Roditeljskog Zakljucavanja @@ -259,14 +251,17 @@ Izgradi Postavke: Greska - ova lozinka se ne moze koristiti. VMC %s datoteka je fragmentirana. Nastaviti sa Memory Cardom u slotu %d? Postavke Zvuka -Omoguci Zvucne Efekte -Omoguci Zvuk Pokretanja +Sound Effects +Boot Sound Glasnoca Zvucnih Efekata Glasnoca Zvuka Pokretanja Potvrdi promjenu video nacina? Predmemorija Liste Igara (HDD) -Omoguci Notifikacije -%s ucitano sa %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Postavke igre su spremljene. %s postavke su uklonjene. @@ -282,9 +277,10 @@ Genre Release Developer Description -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Igre Nacin Prikaza PS1 Igara POPSTARTER.ELF nije pronaden kod '%s'! diff --git a/lng/lang_Czech_r2055.lng b/lng/lang_Czech_r2114.lng similarity index 89% rename from lng/lang_Czech_r2055.lng rename to lng/lang_Czech_r2114.lng index f49966731..67cae1252 100644 --- a/lng/lang_Czech_r2055.lng +++ b/lng/lang_Czech_r2114.lng @@ -1,9 +1,8 @@ # Translated by jimmysmith -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech -OPL %s Uložit změny Zpět Síťová konfigurace @@ -14,7 +13,7 @@ Chyba při ukládání nastavení! Ukončit Nastavení Menu -USB Hry +BDM Hry HDD Hry ETH Hry Aplikace @@ -44,7 +43,6 @@ Křížek Seznam her Nast. hry Remove Settings -Odebrat všechny klíče pro hru Scrolling Speed Pomalu Normálně @@ -55,16 +53,16 @@ Chvilku strpení Chyba při nahrávání Game ID Automatické seřazení Chyba při nahrávání jazykového souboru -Vypnout debug barvy +Debug Colors Nebyl detekován žádný ovladač, čekám... -Povolit Cover Art +Cover Art Širokoúhlá obrazovka Vypnout Nahrávám konfiguraci Ukládám konfiguraci Zapnout zařízení Obnovit -BDM zařízení při startu +BDM Start Mode HDD zařízení při startu ETH zařízení při startu Aplikace při startu @@ -78,7 +76,6 @@ Vypínání NBD Serveru... Cesta k IGR Barva pozadí Barva textu -- PS2 - - SMB Server - Typ IP adresy Statická @@ -102,7 +99,7 @@ Přejmen. Smazat Spustit Nastavení obrazovky -Povolit zápisy +Write Operations Pamatovat posledně hranou hru Tlačítko Select Chyba, hra je fragmentovaná @@ -115,8 +112,6 @@ Unhook Syscalls Přeskočit videa Emulovat DVD-DL Vypnout IGR -Unused -Unused Změna velikosti přeformátuje VMC Vytvořit Start @@ -166,8 +161,6 @@ Mód 3 Mód 4 Mód 5 Mód 6 -Mód 7 -Mód 8 Konfigurovat GSM Ethernet link mód 100Mbit full-duplex @@ -175,9 +168,8 @@ Ethernet link mód 10Mbit full-duplex 10Mbit half-duplex Nastavení GSM -Zapnout GSM +GSM Selector Přepíná GSM ON/OFF -VMODE Vnutit uživatelský Display Mód H-POS Horizontální úprava @@ -188,7 +180,7 @@ Overscan Adjustment Přeskočit FMV Přeskočit Full Motion Videa Nastavení Cheatů -Zapnout PS2RD Cheat Engine +PS2RD Cheat Engine Umožní použití PS2RD Cheat Enginu PS2RD Cheat Engine Mód Automatické nebo uživatelská volba cheatů @@ -213,17 +205,17 @@ PS2 Logo Zobrazováno pouze u validního loga disku, který má stejný region jako konzole Configure PADEMU Pad Emulator Settings -Enable Pad Emulator -Turns On/Off Pad Emulator for selected game. +Pad Emulator +Turns on/off Pad Emulator for selected game. Pad Emulator Mode Select Pad Emulator mode. DualShock3/4 USB DualShock3/4 BT Settings For Port: Select Pad Emulator port for settings. -Enable Emulation +Emulation Turns on/off Pad Emulator for selected port. -Enable Vibration +Vibration Turns on/off vibration for Pad Emulator selected port. USB Bluetooth Adapter MAC Address: DS Controller Paired To MAC Address: @@ -241,12 +233,12 @@ Yes No Bluetooth adapter should be fully compatible with DS3/DS4 controllers. Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap Emulation +Multitap Emulation Turns on/off Multitap emulation for selected game. Multitap Emulator On Port: Select port for Multitap emulation. -Disable Fake DS3 Workaround -Some fake DS3s need workaround, this option will disable it. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings @@ -259,14 +251,17 @@ Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? Audio Settings -Enable Sound Effects -Enable Boot Sound +Sound Effects +Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) -Enable Notifications -%s loaded from %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Game settings saved. %s settings removed. @@ -282,9 +277,10 @@ Genre Release Developer Description -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish_r2055.lng b/lng/lang_Danish_r2114.lng similarity index 89% rename from lng/lang_Danish_r2055.lng rename to lng/lang_Danish_r2114.lng index 0f8a0a958..6bf195d08 100644 --- a/lng/lang_Danish_r2055.lng +++ b/lng/lang_Danish_r2114.lng @@ -1,9 +1,8 @@ # Translation by BongKris -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish -OPL %s Gem indstillinger Tilbage Netværksindstillinger @@ -14,7 +13,7 @@ Fejl ved lagering af indstillinger! Afslut Indstillinger Menu -USB-spil +BDM-spil HDD-spil ETH-spil Programmer @@ -44,7 +43,6 @@ Kryds Spil liste Spil indst. Remove Settings -Spil indstillinger nulstillet Scrolling Speed Langsom Medium @@ -55,16 +53,16 @@ Vent venligst Fejl ved indlæsning af spil ID Automatisk sortering Fejl ved indlæsning af sprogfil -Deaktivér fejlfindingsfarver +Debug Colors Ingen controller registreret, venter... -Aktivér Cover Art +Cover Art Bredskærmsformat Sluk Indlæser indstillinger Gemmer indstillinger Start enhed Genindlæs -BDM-enhed starttilstand +BDM Start Mode HDD-enhed starttilstand ETH-enhed starttilstand Programmenu visningstilstand @@ -78,7 +76,6 @@ NBD-server lukker ned... IGR-sti Baggrundsfarve Tekstfarve -- PS2 - - SMB-server - IP-metode Statisk @@ -102,7 +99,7 @@ Omdøb Slet Kør Skærmindstillinger -Aktivér skrive operationer +Write Operations Husk sidst spillede spil Vælgeknap Fejl: spillet er fragmenteret @@ -115,8 +112,6 @@ Frigiv syscalls Skip videoer Emulere DVD-DL Deaktivere IGR -Unused -Unused Ændring af størrelsen vil omformatere VMC Opret Start @@ -166,8 +161,6 @@ Mode 3 Mode 4 Mode 5 Mode 6 -Mode 7 -Mode 8 Konfigurér GSM Ethernet hastighed og duplex 100Mbit full-duplex @@ -175,9 +168,8 @@ Ethernet hastighed og duplex 10Mbit full-duplex 10Mbit half-duplex GSM-indstillinger -Aktivér GSM +GSM Selector Slå GSM Til eller Fra -Videotilstand Tvungen brugerdefinerede skærmtilstand Horisontal position Horisontal justering @@ -188,7 +180,7 @@ Overscan Justering Vis ikke FMV Springer over Full Motion Videos Snydeindstillinger -Aktivér PS2RD Cheat Engine +PS2RD Cheat Engine Tillad PS2RD Cheat Engine at patche dine spil PS2RD Cheat Engine tilstand Auto-vælg eller Vælg spil snydekoder @@ -213,7 +205,7 @@ PS2-Logo Vises kun med et gyldigt disk logo, som matcher konsollens region Konfigurér PADEMU Pad Emulator indstillinger -Aktivér Pad Emulator +Pad Emulator Slå Pad Emulator Til/Fra for valgte spil. Pad Emulator tilstand Vælg Pad Emulator tilstand. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT indstillinger for port: Vælg Pad Emulator port for indstillinger. -Aktivér emulering +Emulation Slå Pad Emulator Til/Fra for valgte port. -Aktivér vibration +Vibration Slå vibration Til/Fra for valgte Pad Emulator port. USB-bluetooth adapter MAC-adresse: DS controller parret med MAC-adresse: @@ -241,12 +233,12 @@ Ja Nej Bluetooth-adapter skal være fuldt kompatibel med DS3/DS4 controllere. Bluetooth-adapter fungerer muligvis ikke korrekt med DS3/DS4 controllere. -Aktivér Multitap-emulering +Multitap Emulation Slå Multitap-emulering Til/Fra for valgte spil. Multitap Emulator på port Vælg port til Multitap-emulering. -Deaktiver løsning for falsk DS3 -Nogle falske DS3'er har brug for en løsning, dette deaktivere den. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings @@ -259,14 +251,17 @@ Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? Audio Settings -Enable Sound Effects -Enable Boot Sound +Sound Effects +Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) -Enable Notifications -%s loaded from %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Game settings saved. %s settings removed. @@ -282,9 +277,10 @@ Genre Release Developer Description -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch_r2055.lng b/lng/lang_Dutch_r2114.lng similarity index 89% rename from lng/lang_Dutch_r2055.lng rename to lng/lang_Dutch_r2114.lng index f229f473d..e65bbec90 100644 --- a/lng/lang_Dutch_r2055.lng +++ b/lng/lang_Dutch_r2114.lng @@ -1,9 +1,8 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch -OPL %s Wijzigingen opslaan Terug Netwerkconfiguratie @@ -14,7 +13,7 @@ Fout bij schrijven van instellingen! Sluiten Instellingen Menu -USB Spellen +BDM Spellen HDD Spellen ETH Spellen Apps @@ -44,7 +43,6 @@ Kruis Spellenlijst Spelinstellingen Remove Settings -Verwijder alle keys voor het spel Scrolling Speed Langzaam Normaal @@ -55,16 +53,16 @@ Even geduld a.u.b. Fout tijdens laden van Spel ID Automatisch sorteren Fout bij laden van taalbestand -Debug kleuren uitschakelen +Debug Colors Geen controller gedetecteerd, wachtend... -Cover Art inschakelen +Cover Art Breedbeeld Uitschakelen Configuratie laden Configuratie opslaan Start apparaat Vernieuwen -BDM-apparaat startmodus +BDM Start Mode HDD-apparaat startmodus ETH-apparaat startmodus Applicaties startmodus @@ -78,7 +76,6 @@ NBD Server lossen... IGR pad Achtergrondkleur Tekstkleur -- PS2 - - SMB Server - IP-adres type Statisch @@ -102,7 +99,7 @@ Wijzig naam Verwijder Uitvoeren Beeldinstellingen -Schrijftaken inschakelen +Write Operations Herinner laatst gespeelde spel Selecteerknop Foutmelding, het spel is gefragmenteerd @@ -115,8 +112,6 @@ Syscalls loshaken Videos overslaan Emuleer DVD-DL IGR uitschakelen -Unused -Unused Het wijzigen van de grootte zal VMC formatteren Creëer Start @@ -166,8 +161,6 @@ Modus 3 Modus 4 Modus 5 Modus 6 -Modus 7 -Modus 8 Configureer GSM Ethernet link modus 100Mbit full-duplex @@ -175,9 +168,8 @@ Ethernet link modus 10Mbit full-duplex 10Mbit half-duplex GSM instellingen -GSM inschakelen +GSM Selector Schakelt GSM AAN of UIT -VMODE Geforceerde aangepast beeldschermmodus H-POS Horizontale aanpassing @@ -188,7 +180,7 @@ Overscan aanpassing FMV overslaan Slaat Full Motion Videos over Cheat instellingen -PS2RD Cheat Engine inschakelen +PS2RD Cheat Engine Laat PS2RD Cheat Engine uw spellen patchen PS2RD Cheat Engine Modus Auto-selecteer of selecteer spelcheats @@ -213,7 +205,7 @@ PS2 logo Alleen getoond voor geldige schijflogo die bij de console-regio past Configureer PADEMU Pad-emulator instellingen -Pad-emulator inschakelen +Pad Emulator Schakelt Pad-emulator in/uit voor geselecteerde spel Pad-emulator modus Selecteer Pad-emulator modus. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Instellingen voor poort: Selecteer Pad-emulator poort voor instellingen. -Emuleren inschakelen +Emulation Schakelt Pad-emulator in/uit voor geselecteerde poort. -Vibratie inschakelen +Vibration Schakelt vibratie in/uit voor Pad-emulator geselecteerde poort. USB-bluetoothadapter mac-adres: DS3-controller gepaard met mac-adres: @@ -241,12 +233,12 @@ Yes No Bluetooth adapter should be fully compatible with DS3/DS4 controllers. Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap Emulation +Multitap Emulation Turns on/off Multitap emulation for selected game. Multitap Emulator On Port: Select port for Multitap emulation. -Disable Fake DS3 Workaround -Some fake DS3s need workaround, this option will disable it. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings @@ -259,14 +251,17 @@ Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? Audio Settings -Enable Sound Effects -Enable Boot Sound +Sound Effects +Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) -Enable Notifications -%s loaded from %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Game settings saved. %s settings removed. @@ -282,9 +277,10 @@ Genre Release Developer Description -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Filipino_r2055.lng b/lng/lang_Filipino_r2114.lng similarity index 88% rename from lng/lang_Filipino_r2055.lng rename to lng/lang_Filipino_r2114.lng index 19b38cfc1..5710ed89d 100644 --- a/lng/lang_Filipino_r2055.lng +++ b/lng/lang_Filipino_r2114.lng @@ -1,9 +1,8 @@ # Translation by Ceed Lorenzo and Colton SIlva @ColtonSilvaonKnoxKontor -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino -OPL %s I-save ang mga pagbabago Likod Network Settings @@ -14,7 +13,7 @@ Error sa pagsulat ng setting! Lumabas Settings Menu -USB Laro +BDM Laro HDD Laro ETH Laro Apps @@ -44,7 +43,6 @@ Cross Listahan Settings ng laro Alisin ang Settings -Inalis ang lahat ng mga pindutan para sa mga laro Scrolling Speed Mabagal Medium @@ -55,16 +53,16 @@ Mangyaring maghintay Nagkaroon ng error habang naglo-load ang ID ng Laro Awtomatikong pag-uuri Error sa paglo-load ng file na wika -Huwag paganahin ang mga Kulay ng Debug +Debug Colors Controller Walang natukoy na , naghihintay... -Paganahin ang Cover Art +Cover Art Malapad na screen Power Off Nilo-load ang config Sine-save ang config Simulan ang aparato Refresh -BDM aparato simula mode +BDM Start Mode HDD aparato simula mode ETH aparato simula mode Mga application na simulan ang mode @@ -78,7 +76,6 @@ NBD Server Unloading... Lumabas sa kulay ng background kulay ng teksto -- PS2 - - SMB Server - uri ng IP address Static @@ -102,7 +99,7 @@ Rename Alisin Tumakbo Ipakita ang mga setting -I-enable ang write operations +Write Operations Tandaan ang huling play ng laro Select button Error, fragmented ang laro @@ -115,8 +112,6 @@ Alisin sa pagkakakawit ng Syscalls Skip Videos I-emulate ang DVD-DL I-disable ang IGR -Unused -Unused Ang pagbabago ng laki ay i-reformat ang VMC Lumikha Magsimula @@ -166,8 +161,6 @@ Mode 3 Mode 4 Mode 5 Mode 6 -Mode 7 -Mode 8 I-configure ang GSM Ethernet speed at duplex setting 100Mbit Full-duplex @@ -175,9 +168,8 @@ Ethernet speed at duplex setting 10Mbit Full-duplex 10Mbit Half-duplex GSM Mga Setting -paganahin ang GSM +GSM Selector Toggles GSM On/Off. -VMODE Pwersahin ang Custom Display Mode H-POS Horizontal Adjustment @@ -188,7 +180,7 @@ Overscan Adjustment FMV Skip I-skip ang Full Motion Videos Settings ng cheat -I-enable ang PS2RD Cheat Engine +PS2RD Cheat Engine Ipa-patch ng PS2RD Cheat Engine ang iyong games PS2RD Cheat Engine Mode Awto. pagpili or pagpili ng game cheats @@ -213,7 +205,7 @@ PS2 Logo Ididisplay ang valid disc logo kung tugma ito sa region na bersyon ng laro I-configure ang PADEMU Pad Emulator Settings -I-enable ang PadEmulator +Pad Emulator Turns On/Off PadEmulator para sa piling laro. Mode ng Pad Emulator Pumili ng Pad Emulator mode. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Settings para sa port: Pumili ng Pad Emulator port para sa settings. -I-enable ang emulation +Emulation Turns on/off Pad Emulator para sa piling port. -I-enable ang vibration +Vibration Turns on/off vibration ng Pad Emulator para sa piling port. USB Bluetooth Adapter MAC Address: DS Controller Paired To MAC Address: @@ -241,12 +233,12 @@ Opo Hindi Ang Bluetooth adapter ay daapat suportado ng DS3/DS4 controllers. Ang Bluetooth adapter ay maaring hindi gumana sa DS3/DS4 controllers. -I-enable ang Multitap emulation +Multitap Emulation Turns on/off Multitap emulation para sa piling game. Multitap Emulator On Port: Pumili ng port para sa Multitap emulation. -I-disable ang workaround para sa pekeng ds3 -Ang ilang fake ds3s ay nangangailangan ng workaround, Maididisable ito ng opsyon na ito. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. I-emulate ang FIELD flipping Aayusin ang laro na may isyu ng glitch sa progressive video modes. Settings ng Parental Lock @@ -259,14 +251,17 @@ Opsyon ng build: Error - Hindi maaring gamitin ang password na ito. VMC %s na file ay fragmented. Magpatuloy gamit ang Memory Card sa slot %d? Settings ng Audio -I-enable ang Sound Effects -I-enable ang Boot Sound +Sound Effects +Boot Sound Sound Effects Volume Boot Sound Volume Kumpirmahin "video mode change"? Cache Game List (HDD) -I-enable ang Notifications -%s Naiload mula sa %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Mga Opsyon Nai-save ang "Game settings". %s settings ay nai-alis. @@ -282,9 +277,10 @@ Genre Nai-eelease Debeloper Deskripsyon -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French_r2055.lng b/lng/lang_French_r2114.lng similarity index 89% rename from lng/lang_French_r2055.lng rename to lng/lang_French_r2114.lng index 976d3dd4e..120a121ce 100644 --- a/lng/lang_French_r2055.lng +++ b/lng/lang_French_r2114.lng @@ -1,9 +1,8 @@ # Translation by machiavel and Squall -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French -OPL %s Sauvegarder Retour Paramètres réseau @@ -14,7 +13,7 @@ Erreur d'écriture des options! Quitter Options Menu -Jeux USB +Jeux BDM Jeux HDD Jeux ETH Apps @@ -44,7 +43,6 @@ Croix Liste des jeux Options du jeu Supprimer les paramètres -Options du jeu supprimées. Scrolling Speed Lent Moyen @@ -55,16 +53,16 @@ Veuillez patienter. Erreur lors du chargement de l'ID du jeu. Tri automatique Erreur lors du chargement du fichier langue. -Désactiver couleurs de debug +MOD: Debug Colors Aucune manette détectée, attente... -Activer jaquette +MOD: Cover Art Écran large Éteindre Chargement config... Sauvegarde config... Démarrer le périphérique Rafraîchir -Mode de démarrage BDM +MOD: BDM Start Mode Mode de démarrage HDD Mode de démarrage SMB Mode d'affichage du menu des apps @@ -78,7 +76,6 @@ Déchargement serveur NBD... Chemin IGR Couleur de fond Couleur du texte -- PS2 - - Serveur SMB - Type d'adresse IP Statique @@ -102,7 +99,7 @@ Renommer Supprimer Lancer Options d'affichage -Activer l'écriture +MOD: Write Operations Souvenir dernier jeu joué Bouton de sélection Erreur, le jeu est fragmenté. @@ -115,8 +112,6 @@ Décrocher Syscalls (purge OPL après lancement du jeu) Passer les vidéos Émuler DVD-DL (DVD9 rippés en DVD5) Désactiver IGR (incompatible avec certains jeux) -Inutilisé -Inutilisé Changer la taille reformatera la VMC Créer Démarrer @@ -166,8 +161,6 @@ Mode 3 Mode 4 Mode 5 Mode 6 -Mode 7 -Mode 8 Configurer GSM Lien mode ETH 100Mbit Full-duplex @@ -175,9 +168,8 @@ Lien mode ETH 10Mbit Full-duplex 10Mbit Half-duplex Options GSM -Activer GSM +MOD: GSM Selector Basculer On/Off GSM. -VMODE Mode d'affichage perso forcé. Pos. H Ajustement horizontal. @@ -188,7 +180,7 @@ Ajustement Overscan. Passer FMV Passe les FMV. Options de cheat -Activer PS2RD +MOD: PS2RD Cheat Engine Laisser PS2RD patcher vos jeux. Mode PS2RD Automatique/Manuel. @@ -213,7 +205,7 @@ Logo PS2 Affiche le logo du disque correspondant à la région de la console. Configurer PADEMU Options de PADEMU -Activer PadEmulator +MOD: Pad Emulator Actve/désactive PADEMU pour ce jeu. Mode de PADEMU Sélectionner le mode de PADEMU. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Options du port: Sélectionner le port PADEMU pour les options. -Activer l'émulation +MOD: Emulation Active/désactive PADEMU pour ce port. -Activer la vibration +MOD: Vibration Active/désactive la vibration pour le port PADEMU sélectionné. Adress MAC de l'adapteur Bluetooth USB: Contrôleur DS appairé à l'adresse MAC: @@ -241,12 +233,12 @@ Oui Non L'adaptateur Bluetooth devrait être parfaitement compatible avec les contrôleurs DS3/DS4. L'adaptateur Bluetooth peut ne pas fonctionner correctement avec les contrôleurs DS3/DS4. -Activer l'émulation du Multitap +MOD: Multitap Emulation Active/désactive l'émulation du Multitap pour le jeu sélectionné. Émulateur Multitap sur le port: Sélectionnez le port pour émuler le Multitap. -Désactiver correctif des DS3 simulées -Certaines DS3 simulées nécessitent ce correctif, cette option le désactivera. +MOD: Fake DS3 Workaround +MOD: Some fake DS3s need a workaround, this option will enable it. Émuler FIELD flipping Fix pour les jeux qui glitch sous les modes vidéo progressifs. Contrôle parental @@ -259,14 +251,17 @@ Options du Build: Erreur - ce mot de passe ne peut pas être utilisé. Le fichier VMC %s est fragmenté. Continuer avec la carte mémoire dans le slot %d? Paramètres audio -Activer les effets sonore -Activer le son de démarrage +MOD: Sound Effects +MOD: Boot Sound Volume des effets sonore Volume du son de démarrage Confirmer le changement du mode vidéo? Cache liste de jeu (HDD) -Activer les Notifications -%s chargé depuis %s +MOD: Notifications +ADD: Config loaded from %s +ADD: Theme loaded from %s +MOD: Language loaded from %s +ADD: %s partition mounted. Options Supprimer les paramètres. %s paramètres supprimés. @@ -282,9 +277,10 @@ Genre Mise à jour Développeur Description -BDM Games -Select Block Devices +MOD: Block Devices Controller Settings +ADD: Turn on/off Block Device Manager. +ADD: Turn on/off Block Devices (e.g. USB). PS1 Games Mode d'affichage des jeux PS1 POPSTARTER.ELF non trouvé à '%s'! diff --git a/lng/lang_German_r2055.lng b/lng/lang_German_r2114.lng similarity index 89% rename from lng/lang_German_r2055.lng rename to lng/lang_German_r2114.lng index d7be70fe5..1817aab72 100644 --- a/lng/lang_German_r2055.lng +++ b/lng/lang_German_r2114.lng @@ -1,9 +1,8 @@ # German Translation by ps2guy and LopoTRI -# Last update: August 08, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German -OPL %s Änderungen speichern Zurück Netzwerkeinstellungen @@ -14,7 +13,7 @@ Fehler beim Schreiben der Einstellungen! Verlassen Einstellungen Menü -USB-Spiele +BDM-Spiele HDD-Spiele ETH-Spiele Anwendungen @@ -44,7 +43,6 @@ Kreuz Spieleliste Spieleinst. Entferne Einstellungen -Alle keys für das Spiel wurden entfernt Scrollgeschwindigkeit Langsam Mittel @@ -55,16 +53,16 @@ Bitte warten Fehler beim Laden der Spiel-ID Automatische Sortierung Fehler beim Laden der Sprachdatei -Deaktiviere Debugfarben +Debug Colors Kein Controller erkannt, warte... -Aktiviere Cover Bilder +Cover Art Breitbild Ausschalten Lade Konfiguration Speichere Konfiguration Peripherie starten Aktual. -BDM Geräte Startmodus +BDM Start Mode HDD Start Modus ETH Start Modus Anwendungen Menü Anzeigen @@ -78,7 +76,6 @@ NBD Server entlädt... IGR-Pfad Hintergrundfarbe Textfarbe -- PS2 - - SMB Server - IP-Adresstyp Statisch @@ -102,7 +99,7 @@ Umbenennen Löschen Ausführen Anzeige Einstellungen -Aktiviere Schreiboptionen +Write Operations Merke zuletzt gespieltes Spiel Auswahltaste Fehler, das Spiel ist fragmentiert @@ -115,8 +112,6 @@ Systemaufrufe aushängen Videos überspringen Emuliere DVD-DL Deaktiviere IGR -Unbenutzt -Unbenutzt Ändern der Größe wird die VMC erneut formatieren! Erstellen Starten @@ -166,8 +161,6 @@ Mod. 3 Mod. 4 Mod. 5 Mod. 6 -Mod. 7 -Mod. 8 GSM konfigurieren ETH Geschwindigkeitsmodus 100Mbit Full-duplex @@ -175,9 +168,8 @@ ETH Geschwindigkeitsmodus 10Mbit Full-duplex 10Mbit Half-duplex GSM Einstellungen -Aktiviere GSM +GSM Selector Schaltet GSM AN oder AUS -VMODE Erzwungener benutzerdefinierter Bildschirmmodus H-POS Horizontale anpassung @@ -188,7 +180,7 @@ Overscan anpassen Videosequenzen (FMV) überspringen Überspringt Full Motion Videos Cheat Einstellungen -Aktiviere PS2RD Cheat Engine +PS2RD Cheat Engine Lass PS2RD Cheat Engine das Spiel patchen PS2RD Cheat Engine Modus Automatische auswahl oder Spiele-cheats auswählen @@ -213,7 +205,7 @@ PS2 Logo Wird für ein gültiges Disc-Logo angezeigt, dass der Region der Konsole entspricht. PADEMU konfigurieren Einstellungen Pad Emulator -Pad Emulator aktivieren +Pad Emulator Aktiviert/Deaktiviert den Pad Emulator für das ausgewählte Spiel. Pad Emulator Modus Wähle Pad Emulator Modus @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Einstellungen für Anschluss: Wähle Pad Emulatoranschluss für die Einstellungen. -Emulation aktivieren +Emulation Aktiviert/Deaktiviert den Pad Emulator für den ausgewählten Anschluss. -Vibration aktivieren +Vibration Aktiviert/Deaktiviert die Vibration für den ausgewählten Anschluss. USB Bluetooth-Adapter MAC-Adresse: DS Controller verbunden zur MAC-Adresse: @@ -241,12 +233,12 @@ Ja Nein Bluetooth Adapter ist voll kompatibel mit DS3/DS4 Controller. Bluetooth Adapter funktioniert evtl nicht korrekt mit DS3/DS4 Controller. -Aktiviere Multitap emulation +Multitap Emulation Schaltet die Multitap emulation An/Aus für das ausgewählte Spiel. Multitap emulator an Anschluss Wähle Anschluss für Multitap emulation. -Deaktiviere Problemumgehung für gefälschten DS3 -Manche gefälschte ds3s brauchen Problemumgehung, diese Option schaltet es ab. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emuliere Feld-spiegelung Fix für Spiele, die Fehler unter progressivem Video modus haben. Einstellungen Kindersicherung @@ -259,14 +251,17 @@ Erstellungsoptionen: Fehler - Dieses Passwort kann nicht benutzt werden. VMC %s Datei ist fragmentiert. Weiter mit Memory Card in steckplatz %d? Audio Einstellungen -Soundeffekte Einschalten -Startsound Einschalten +Sound Effects +Boot Sound Lautstärke Soundeffekte Lautstärke Startsound Änderung des Video signals übernehmen? Spieleliste zwischenspeichern (HDD) -Benachrichtigungen Einschalten -%s geladen von %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Optionen Spiel-Einstellungen gespeichert. %s Einstellungen entfernt. @@ -282,9 +277,10 @@ Genre Veröffentlichung Entwickler Beschreibung -BDM Spiele -Wähle Blockgeräte +Block Devices Controller einstellungen +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek_r2055.lng b/lng/lang_Greek_r2114.lng similarity index 90% rename from lng/lang_Greek_r2055.lng rename to lng/lang_Greek_r2114.lng index 97d7ebf9a..b2094c860 100644 --- a/lng/lang_Greek_r2055.lng +++ b/lng/lang_Greek_r2114.lng @@ -1,9 +1,8 @@ # Greek Translation by RivalK93 -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek -OPL %s Αποθήκευση Αλλαγών Πίσω Ρυθμίσεις Δικτύου @@ -14,7 +13,7 @@ OPL %s Έξοδος Ρυθμίσεις Μενού -Παιχνίδια USB +Παιχνίδια BDM Παιχνίδια HDD Παιχνίδια ETH Εφαρμογές @@ -44,7 +43,6 @@ OK Λίστα Παιχνιδιών Ρυθμίσεις Παιχνιδιού Κατάργηση Ρυθμίσεων -Καταργήθηκαν όλα τα πλήκτρα για το παιχνίδι. Scrolling Speed Αργή Κανονική @@ -55,16 +53,16 @@ Scrolling Speed Σφάλμα κατά τη φόρτωση του ID του παιχνιδιού. Αυτόματη Ταξινόμηση Σφάλμα κατά τη φόρτωση του αρχείου γλώσσας. -Απενεργοποίηση Χρωμάτων Debug +Debug Colors Δεν εντοπίστηκε χειριστήριο, αναμονή... -Ενεργοποίηση Εξωφύλλων +Cover Art Widescreen Απενεργοποίηση Φόρτωση ρυθμίσεων... Αποθήκευση ρυθμίσεων... Εκκίνηση Συσκευής Ανανέωση -Εκκίνηση Λειτουργίας BDM +BDM Start Mode Εκκίνηση Λειτουργίας HDD Εκκίνηση Λειτουργίας ETH Εκκίνηση Μενού Εφαρμογών @@ -78,7 +76,6 @@ Widescreen Προορισμός Μετά Από IGR Χρώμα στο Φόντο Χρώμα Γραμματοσειράς -- PS2 - - Εξυπηρετητής SMB - Τύπος Διεύθυνσης IP Στατική @@ -102,7 +99,7 @@ NetBIOS Διαγραφή Εκκίνηση Ρυθμίσεις Οθόνης -Λειτουργίες Εγγραφής +Write Operations Απομνημόνευση Τελευταίου Παιχνιδιού Πλήκτρο Επιλογής Σφάλμα, το παιχνίδι είναι κατακερματισμένο. @@ -115,8 +112,6 @@ NetBIOS Παράλειψη των Videos Προσομοίωση DVD-DoubleLayer Δίσκου Απενεργοποίηση In-Game-Reset(IGR) -Αχρησιμοποίητο -Αχρησιμοποίητο Αλλάζοντας το μέγεθος θα αναδιαμορφώστε τη VMC. Δημιουργία Εκκίνηση @@ -166,8 +161,6 @@ Mode 3 Mode 4 Mode 5 Mode 6 -Mode 7 -Mode 8 Ρύθμιση GSM Λειτουργία Σύνδεσης Ethernet 100Mbit Full-duplex @@ -175,9 +168,8 @@ Mode 8 10Mbit Full-duplex 10Mbit Half-duplex Ρυθμίσεις GSM -Ενεργοποίηση GSM +GSM Selector Ενεργοποιεί/απενεργοποιεί το GSM. -VMODE Εξαναγκασμένη προσαρμογή λειτουργίας οθόνης. H-POS Οριζόντια ρύθμιση οθόνης. @@ -213,7 +205,7 @@ Patchάρισμα των παιχνιδιών από το PS2RD. Εμφάνιση μόνο για συμβατά λογότυπα δίσκων που ταιριάζουν με το console region. Ρυθμίσεις PadEmu Ρυθμίσεις Προσομοιωτή Χειριστηρίου -Ενεργοποίηση Προσομοιωτή +Pad Emulator Ενεργοποιεί/απενεργοποιεί τον Προσομοιωτή Χειριστηρίου. Τύπος Προσομοίωσης Επιλέξτε τον τύπο προσομοίωσης του χειριστηρίου. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Ρυθμίσεις για Θύρα: Επιλέξτε τη θύρα προσομοιωτή προς ρύθμιση. -Ενεργοποίηση Προσομοίωσης +Emulation Ενεργοποιεί/απενεργοποιεί την προσομοίωση για τη συγκεκριμένη θύρα. -Ενεργοποίηση Δόνησης +Vibration Ενεργοποιεί/απενεργοποιεί τη δόνηση για τη συγκεκριμένη θύρα. Διεύθυνση MAC του Προσαρμογέα BT: Διεύθυνση MAC του Χειριστηρίου DS: @@ -241,12 +233,12 @@ ID κατασκευαστή: Όχι Ο προσαρμογέας BlueTooth θα πρέπει να είναι πλήρως συμβατός με ελεγκτές DS3/DS4. Ο προσαρμογέας Bluetooth ενδέχεται να μη λειτουργεί σωστά με τα χειριστήρια DS3/DS4. -Εξομοίωση Multitap +Multitap Emulation Ενεργοποιεί/απενεργοποιεί την εξομοίωση Multitap. Εξομοιωτής Multitap στη Θύρα: Επιλέξτε θύρα για εξομοίωση Multitap. -Απενεργ. Πατέντας για Ψεύτικα DS3 -Κάποια ψεύτικα DS3 χρειάζονται πατέντα, αυτή η επιλογή θα την απενεργοποιήσει. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Εξομοίωση Αντιστροφής του ΠΕΔΙΟΥ Επιδιόρθωση για παιχνίδια που glitchάρουν υπό progressive video modes. Ρυθμίσεις Γονικού Κλειδώματος @@ -259,14 +251,17 @@ ID κατασκευαστή: Σφάλμα - αυτός ο κωδικός πρόσβασης δεν μπορεί να χρησιμοποιηθεί. Το αρχείο VMC %s είναι κατακερματισμένο. Συνέχεια με την Κάρτα Μνήμης στην υποδοχή %d; Ρυθμίσεις Ήχου -Ενεργοποίηση Ηχητικών Εφέ -Ενεργοποίηση Ήχου Εκκίνησης +Sound Effects +Boot Sound Ένταση Ηχητικών Εφέ Ένταση Ήχου Εκκίνησης Επιβεβαίωση αλλαγής της λειτουργίας βίντεο; Caching Λίστας Παιχνιδιών (HDD) -Ενεργοποίηση Ειδοποιήσεων -Το %s φορτώθηκε από %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Οι ρυθμίσεις παιχνιδιού αποθηκεύτηκαν. Οι ρυθμίσεις %s καταργήθηκαν. @@ -282,9 +277,10 @@ Forum Υποστήριξης: Κυκλοφορία Προγραμματιστής Περιγραφή -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). Παιχνίδια PS1 Εκκίνηση μενού Παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian_r2055.lng b/lng/lang_Hungarian_r2114.lng similarity index 88% rename from lng/lang_Hungarian_r2055.lng rename to lng/lang_Hungarian_r2114.lng index d296cb201..f6f383984 100644 --- a/lng/lang_Hungarian_r2055.lng +++ b/lng/lang_Hungarian_r2114.lng @@ -1,9 +1,8 @@ # Translation by co5oos -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian -OPL %s Változtatások mentése Vissza Hálózat konfigurálás @@ -14,7 +13,7 @@ Hiba a beállítások írásában! Kilépés Beállítások Menü -USB Játékok +BDM Játékok HDD Játékok ETH Játékok Alkalmazások @@ -44,7 +43,6 @@ Kereszt Játék Lista Játékbeállítások Beállítások eltávolítása -Játékhoz tartozó összes kulcs eltávolítva Scrolling Speed Lassú Közepes @@ -55,16 +53,16 @@ Kérem várjon Hiba a Játék ID betöltése közben Automatikus rendezés Hiba a nyelv fájl betöltésnél -Hibakeresési színek letiltása +Debug Colors Nem található kontroller, várakozás... -Lemezborító engedélyezése +Cover Art Szélesvásznú Kikapcsolás Konfiguráció betöltése Konfiguráció mentése Eszköz indítása Frissítés -BDM eszköz indítási mód +BDM Start Mode HDD eszköz indítási mód ETH eszköz indítási mód Alkalmazások menü megjelenítési mód @@ -78,7 +76,6 @@ Az NBD Szerver kirakodása... IGR útvonala Háttér színe Szöveg szín -- PS2 - - SMB Szerver - IP Cím típus Statikus @@ -102,7 +99,7 @@ Az elem véglegesen törlésre kerül, folytatja? Törlés Futtatás Képernyő Beállítások -Írási műveletek engedélyezése +Write Operations Emlékezz a legutóbbi játékra Select Gomb Hiba, a játék töredezett @@ -115,8 +112,6 @@ Syscalls kiakasztás Videók átugrása DVD-DL emulálás IGR letiltása -Nem Használt -Nem Használt A méretváltoztatás leformázza a VMC-t Létrehoz Indít @@ -166,8 +161,6 @@ Mód 3 Mód 4 Mód 5 Mód 6 -Mód 7 -Mód 8 GSM Konfiguráció Ethernet kapcsolat módja 100Mbit Full-duplex @@ -175,9 +168,8 @@ Ethernet kapcsolat módja 10Mbit Full-duplex 10Mbit Half-duplex GSM Beállítások -GSM Engedélyezése +GSM Selector KI vagy BE kapcsolja a GSM-t -VMODE Kényzerített Testreszabott Megjelenítési Mód Vízszintes-Pozíció Vízszintes Szabályozás @@ -188,7 +180,7 @@ Overscan Beállítása FMV Átugrása Átugorja a Full Motion Videókat Csalás Beállítások -PS2RD Csalás Motor engedélyezése +PS2RD Cheat Engine Engedd a PS2RD Csalás motornak, hogy patch-elje a játékodat. PS2RD Csalás Motor Mód Auto-kiválaszt vagy játékcsalások Kiválasztása @@ -213,7 +205,7 @@ PS2 Logó Csak egy érvényes lemez logónál jelenik meg, amely egyezik a konzol régiójával PADEMU konfigurálás Pad Emulator Beállítások -PadEmulator Engedélyezése +Pad Emulator Be/ki kapcsolja a PadEmulátor-t a kiválaszott játékhoz. Pad Emulátor mód Válassza ki a Pad Emulátor módját. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Port beállítások: Válassza ki a Pad Emulátor portot a beállításokhoz. -Emuláció engedélyezése +Emulation Be/ki kapcsolja a Pad Emulátor-t a kiválasztott porthoz. -Rezgés engedélyezése +Vibration Be/ki kapcsolja a rezgést a Pad Emulátor kiválasztott portjához. Usb bluetooth adapter mac címe: DS Kontroller a következő MAC címhez pároztatva: @@ -241,12 +233,12 @@ Igen Nem A Bluetooth adapternek teljes mértékben kompatibilisnek kell lennie a DS3/DS4 kontrollerekkel. A Bluetooth adapter nem biztos, hogy megfelelően fog működni DS3/DS4 kontrollerekkel. -Multitap emuláció Engedélyezése +Multitap Emulation ki/be kapcsolja Multitap emulációt a kiválasztott játékhoz. Multitap emulátor ezen a porton Válassza ki a portot a Multitap emulációhoz. -Megkerülés letiltása a hamisítvány DS3-hoz. -Néhány hamis ds3-hoz megkerülés szükséges, ez az opció letiltja ezt. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. FIELD flipping emulálása Fix azon játékokhoz, melyek hibát produkálnak progresszív videó mód alatt. Gyerekzár Beállítások @@ -259,14 +251,17 @@ Build Opciók: Hiba - ez a jelszó nem használható. VMC %s fájl töredezett. Folytatás a %d foglalatban lévő Memória Kártyával? Hangbeállítások -Hanghatások engedélyezése -Boot Sound engedélyezése +Sound Effects +Boot Sound Hanghatások hangereje Boot Sound hangereje Videó mód változtatás jóváhagyása? Játéklista cachelés (HDD) -Értesítések engedélyezése -%s betöltve %s-ből +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Játékbeállítások elmentve. %s beállítások eltávolítva @@ -282,9 +277,10 @@ Műfaj Megjelenés Fejlesztő Leírás -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian_r2055.lng b/lng/lang_Indonesian_r2114.lng similarity index 89% rename from lng/lang_Indonesian_r2055.lng rename to lng/lang_Indonesian_r2114.lng index bc1b1f0d1..dac2288bd 100644 --- a/lng/lang_Indonesian_r2055.lng +++ b/lng/lang_Indonesian_r2114.lng @@ -1,9 +1,8 @@ # translated by verislasher and jbliz -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian -OPL %s Simpan Perubahan Kembali Pengaturan Jaringan @@ -14,7 +13,7 @@ Kesalahan penulisan setingan! Keluar Setingan Menu -USB Games +BDM Games HDD Games ETH Games Aplikasi @@ -44,7 +43,6 @@ Kali Daftar Game Setingan Hapus setingan -Semua kunci permainan yang dihapus Scrolling Speed Lambat Sedang @@ -55,16 +53,16 @@ Mohon tunggu Kesalahan saat memuat ID Permainan Penyortiran otomatis Kesalahan memuat file bahasa -Menonaktifkan Warna Debug +Debug Colors Tak ada kontroler terdeteksi, menunggu ... -Aktifkan Sampul +Cover Art Layar lebar Matikan Memuat konfigurasi Menyimpan konfigurasi Memulai perangkat Segarkan -Memulai mode perangkat BDM +BDM Start Mode Memulai mode perangkat HDD Memulai mode perangkat ETH Memulai mode Aplikasi @@ -78,7 +76,6 @@ Mengembalikan Server NBD... Pintasan IGR Warna latar belakang Warna teks -- PS2 - - SMB Server - Jenis alamat IP Statis @@ -102,7 +99,7 @@ Ubah nama Hapus Jalankan Pengaturan Tampilan -Memungkinkan operasi tulis +Write Operations Ingat pertandingan terakhir dimainkan Pilih tombol Kesalahan, game terfragmentasi @@ -115,8 +112,6 @@ Melepas kaitan syscalls Lewati video Emulasi DVD-DL Nonaktifkan IGR -Tdk terpakai -Tdk terpakai Mengubah ukuran akan memformat ulang VMC Membuat Mulai @@ -166,8 +161,6 @@ Mode 3 Mode 4 Mode 5 Mode 6 -Mode 7 -Mode 8 Konfigurasi GSM Mode tautan ethernet 100Mbit rangkap penuh @@ -175,9 +168,8 @@ Mode tautan ethernet 10Mbit rangkap penuh 10Mbit setengah rangkap Setingan GSM -Aktifkan GSM +GSM Selector Alih GSM ON atau OFF -VMODE Paksa Mode Tampilan Kustom H-POS Penyesuaian horisontal @@ -188,7 +180,7 @@ Penyesuaian Tampilan berlebih Lewati FMV Lompati Video Gerakan Penuh Setingan Cheat -Aktifkan PS2RD Cheat Engine +PS2RD Cheat Engine Biarkan PS2RD Cheat Engine menambal permainan Anda Modus PS2RD Cheat Engine Pilih otomatis atau Pilih game cheats @@ -213,7 +205,7 @@ Logo PS2 Ditampilkan logo disc valid sesuai wilayah konsol. Konfigurasi PADEMU Pengaturan Stik Emulator -Aktifkan PadEmulator +Pad Emulator Hidup/matikan StikEmulator game dipilih. Mode Stik Emulator Pilih mode Stik Emulator. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Pengaturan untuk port: Pilih port Emulasi Pad untuk diatur. -Aktifkan emulasi +Emulation Nyalakan/Matikan Emulasi Pad diport terpilih. -Aktifkan getaran +Vibration Nyalakan/Matikan getaran untuk Emulasi Pad diport terpilih. Alamat Mac Adaptor USB Bluetooth: Pengontrol DS dipasangkan ke Alamat MAC: @@ -241,12 +233,12 @@ Ya Tidak adapter Bluetooth harus sepenuhnya cocok dengan Pengontrol DS3/DS4. adapter Bluetooth mungkin tidak bekerja dengan benar dengan Pengontrol DS3/DS4. -Aktifkan emulasi Multitap +Multitap Emulation Aktifkan/NonAktifkan emulasi Multitap untuk game dipilih. emulator Multitap pada port Pilih port untuk emulasi Multitap. -Nonaktifkan solusi untuk DS3 palsu -beberapa ds3s palsu butuh solusi, opsi ini akan nonaktif. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emulasikan FIELD flipping Perbaiki Game yang bermasalah di mode video progresif. Seting kunci Parental @@ -259,14 +251,17 @@ Opsi Bentukan: Kesalahan - kata sandi tak bisa dipakai. Berkas VMC %s terfragmentasi. Gunakan kartu memori di slot %d? Pengaturan Audio -Aktifkan efek suara -Aktifkan suara Boot +Sound Effects +Boot Sound Volume efek suara Volume suara Boot Konfirmasi perubahan mode video? Daftar Tembolok Game(HDD) -Izinkan Pemberitahuan -%s dimuat dari %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Pengaturan Game disimpan. %s setingan dihapus. @@ -282,9 +277,10 @@ Aliran Rilis Pengembang Deskripsi -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian_r2055.lng b/lng/lang_Italian_r2114.lng similarity index 89% rename from lng/lang_Italian_r2055.lng rename to lng/lang_Italian_r2114.lng index 1a113153e..c4e9c53a0 100644 --- a/lng/lang_Italian_r2055.lng +++ b/lng/lang_Italian_r2114.lng @@ -1,9 +1,8 @@ # Translation by jauffre and andre95d and completed by Peppe90 -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian -OPL %s Salva Modifiche Indietro Configurazione di Rete @@ -14,7 +13,7 @@ Errore scrittura impostazioni! Esci Impostazioni Menu -Giochi USB +Giochi BDM Giochi HDD Giochi ETH Apps @@ -44,7 +43,6 @@ X Lista Giochi Impostazioni Gioco Rimuovi Impostazioni -Rimosse tutte le chiavi per il gioco. Scrolling Speed Lento Medio @@ -55,16 +53,16 @@ Attendere prego. Errore durante il caricamento dell'ID di gioco. Ordinamento Automatico Errore nel caricamento del file di lingua. -Disattiva Colori di Debug +Debug Colors Nessun controller rilevato, in attesa... -Abilita Cover Art +Cover Art Widescreen Spegni Caricamento configurazione... Salvataggio configurazione... Avvia Dispositivo Aggiorna -Modalità di Avvio BDM +BDM Start Mode Modalità di Avvio HDD Modalità di Avvio ETH Modalità di Avvio Apps @@ -78,7 +76,6 @@ Server NBD in scaricamento dalla memoria... Percorso IGR Colore dello Sfondo Colore Testo -- PS2 - - Server SMB - Tipo di Indirizzo IP Statico @@ -102,7 +99,7 @@ Rinomina Cancella Esegui Impostazioni Display -Abilita Operazioni in Scrittura +Write Operations Ricorda Ultimo Titolo Giocato Tasto di Selezione Errore, il gioco è frammentato. @@ -115,8 +112,6 @@ Slega Chiamate Sys Salta i Video Disabilita DVD-DL Disabilita IGR -Inutilizzato -Inutilizzato Modificare la dimensione riformatterà la VMC. Crea Avvia @@ -166,8 +161,6 @@ Modo 3 Modo 4 Modo 5 Modo 6 -Modo 7 -Modo 8 Configura GSM Modalità Collegamento Ethernet 100Mbit full-duplex @@ -175,9 +168,8 @@ Modalità Collegamento Ethernet 10Mbit full-duplex 10Mbit half-duplex Impostazioni GSM -Abilita GSM +GSM Selector Imposta GSM On/Off. -VMODE Forza modo di visualizzazione personalizzato. H-POS Regolazione orizzontale. @@ -188,7 +180,7 @@ Regolazione overscan. Salta FMV Salta i filmati. Impostazioni Trucchi -Abilita Motore Trucchi PS2RD +PS2RD Cheat Engine Permetti a PS2RD di applicare patch ai giochi. Modo Motore Trucchi PS2RD Selezione automatica o seleziona trucchi. @@ -213,7 +205,7 @@ Logo PS2 Funziona solo se la regione del gioco combacia con quella della console. Configura PADEMU Impostazioni Emulatore Pad -Abilita Emulatore Pad +Pad Emulator Attiva/disattiva l'Emulatore Pad per il gioco selezionato. Modalità Emulatore Pad Seleziona modalità per l'Emulatore Pad. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Impostazioni Per l'Ingresso: Seleziona l'ingresso dell'Emulatore Pad per le impostazioni. -Abilita Emulazione +Emulation Attiva/disattiva l'Emulatore Pad per l'ingresso selezionato. -Abilita Vibrazione +Vibration Attiva/disattiva la vibrazione per l'Emulatore Pad nell'ingresso selezionato. Indirizzo MAC dell'Adattatore Bluetooth USB: Controller DS Associato a Indirizzo MAC: @@ -241,12 +233,12 @@ Si No L'adattatore Bluetooth dovrebbe essere perfettamente compatibile con i controller DS3/DS4. L'adattatore Bluetooth potrebbe non funzionare correttamente con i controller DS3/DS4. -Abilita emulazione Multitap +Multitap Emulation Attiva/disattiva l'emulazione del Multitap per il gioco selezionato. Emulatore Multitap nell'ingresso: Seleziona l'ingresso per l'emulazione del Multitap. -Disabilita patch per ds3 falsi -Alcuni ds3 cloni necessitano di una patch, questa opzione la disabiliterà. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emula FIELD Flipping Fix per i giochi che presentano problemi in modalità video progressiva. Impostazioni Blocco Genitori @@ -259,14 +251,17 @@ Opzioni di Costruzione: Errore - password non utilizzabile. Il file VMC %s è frammentato. Continuare con la Memory Card nello slot %d? Impostazioni Audio -Abilita Effetti Sonori -Abilita Suono di Avvio +Sound Effects +Boot Sound Volume Effetti Sonori Volume Suono di avvio Confermare la modifica della modalità video? Cache Lista Giochi (HDD) -Abilita Notifiche -%s caricato da %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Impostazioni salvate. %s impostazioni rimosse. @@ -282,9 +277,10 @@ Genere Pubblicazione Sviluppatore Descrizione -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese_r2055.lng b/lng/lang_Japanese_r2114.lng similarity index 89% rename from lng/lang_Japanese_r2055.lng rename to lng/lang_Japanese_r2114.lng index cc78760ef..802898b73 100644 --- a/lng/lang_Japanese_r2055.lng +++ b/lng/lang_Japanese_r2114.lng @@ -1,9 +1,8 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese -OPL %s 設定を保存する 戻る ネットワーク設定 @@ -14,7 +13,7 @@ OPL %s 終了 設定 メニュー -USBゲーム +BDMゲーム HDDゲーム ETHゲーム アプリ @@ -44,7 +43,6 @@ X ゲームリスト ゲーム設定 設定を削除 -キー設定を初期化 Scrolling Speed 遅い 普通 @@ -55,16 +53,16 @@ Scrolling Speed ゲームIDをロード中にエラーが発生しました 自動的に並べ替え 言語設定をロード中にエラーが発生しました -デバッグカラーを無効化 +Debug Colors コントローラーが見つかりません。お待ちください… -カバーアートを表示 +Cover Art ワイドスクリーン 電源を切る 設定をロード中 設定を保存中 デバイスを開始 リフレッシュ -BDMデバイス開始モード +BDM Start Mode HDDデバイス開始モード ETHデバイス開始モード アプリメニュー表示モード @@ -78,7 +76,6 @@ NBDサーバを取消中… IGRパス 背景色 文字色 -- PS2 - - SMBサーバ - IPアドレスタイプ Static @@ -102,7 +99,7 @@ OK 削除 実行 表示設定 -高度なメニューで書換えを有効化 +Write Operations 最後にプレイしたゲームを記憶する セレクトボタン ゲームがデフラグされていません @@ -115,8 +112,6 @@ Syscallの解除 一部のムービーをスキップ 二層ディスク(DVD9)用設定 IGRを無効化 -未使用 -未使用 サイズを変更するとVMCはフォーマットされます VMCファイルを作成 開始 @@ -166,8 +161,6 @@ V-Sync モード 4 モード 5 モード 6 -モード 7 -モード 8 GSM設定 ETHリンクモード 100Mbit full-duplex @@ -175,9 +168,8 @@ ETHリンクモード 10Mbit full-duplex 10Mbit half-duplex GSM設定 -GSM有効化 +GSM Selector GSM設定をオン/オフ -画面モード 指定されたモードを常に有効化 水平調整 水平方向の表示位置を微調整 @@ -188,7 +180,7 @@ Overscan 調整 FMVスキップ フルモーションムービーをスキップ チート設定 -PS2RDチートを有効化 +PS2RD Cheat Engine PS2RDチートをゲーム毎に指定 PS2RDチートモード 自動/手動チート選択 @@ -213,7 +205,7 @@ PS2ロゴ 本体リージョンとディスクが一致した場合のみ表示されます PADEMUの設定 PADEMUの設定 -PADEMU有効化 +Pad Emulator ゲーム毎にPADEMUの有効/無効を指定 PADEMUモード モードを選択 @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT ポート番号: PADEMUを適用するポートを指定 -ポート毎設定 +Emulation ポート毎にPADEMUを適用 -振動の有効化 +Vibration ポート毎に振動の有効/無効を指定 BluetoothアダプタのMACアドレス: DSのペア設定MACアドレス: @@ -241,12 +233,12 @@ Yes No BluetoothアダプタはDS3 / DS4コントローラをサポートしています BluetoothアダプタはDS3 / DS4コントローラをサポートしていません -マルチタップエミュレーションを有効 +Multitap Emulation 選択したゲームのマルチタップエミュレーションをオン/オフにします マルチタップエミュレータのポート マルチタップエミュレーション用のポートを選択 -フェイクDS3に対する回避策を無効 -いくつかのフェイクDS3は回避策を必要ですが、このオプションはそれを無効にします +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. FIELD反転をエミュレートする プログレッシブビデオモードでグリッチするゲームを修正しました パレンタルロック設定 @@ -259,14 +251,17 @@ FIELD反転をエミュレートする エラー - このパスワードは使用できません VMC %s ファイルは破損しています。 スロット %d のメモリカードに保存しますか? オーディオ設定 -効果音を有効にする -起動音を有効にする +Sound Effects +Boot Sound 効果音の音量 起動音の音量 ビデオモードの変更を確認しますか? ゲームリストをキャッシュ(HDD) -通知を有効にします -%s から %s をロード +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options ゲーム設定を保存しました %s 設定を削除しました @@ -282,9 +277,10 @@ Options リリース 開発元 説明文 -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 ゲーム PS1 ゲーム 画面モード POPSTARTER.ELFが '%s'に見つかりません! diff --git a/lng/lang_Korean_r2055.lng b/lng/lang_Korean_r2114.lng similarity index 89% rename from lng/lang_Korean_r2055.lng rename to lng/lang_Korean_r2114.lng index 7b9b0db9c..6d86f7354 100644 --- a/lng/lang_Korean_r2055.lng +++ b/lng/lang_Korean_r2114.lng @@ -1,9 +1,8 @@ # Translated by DDinghoya -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean -OPL %s 저장 변경 뒤로 네트워크 구성 @@ -14,7 +13,7 @@ OPL %s 종료 설정 메뉴 -USB 게임 +BDM 게임 HDD 게임 ETH 게임 응용프로그램 @@ -44,7 +43,6 @@ X 게임 목록 게임 설정 설정 삭제 -설정된 게임 키 제거 Scrolling Speed 느림 보통 @@ -55,16 +53,16 @@ Scrolling Speed 게임 ID 불러오는 중 오류 자동 정렬 언어 파일 불러오는 중 오류 -디버그 색상 비활성 +Debug Colors 컨트롤러가 없습니다. 대기 중... -표지 보기 +Cover Art 와이드화면 전원 끄기 불러오기 설정 저장 설정 장치 시작 새로 고침 -BDM 장치 시작 모드 +BDM Start Mode HDD 장치 시작 모드 ETH 장치 시작 모드 응용프로그램 시작 모드 @@ -78,7 +76,6 @@ NBD 서버 업로딩 중... IGR 경로 배경 색상 문자 색상 -- PS2 - - SMB 서버 - IP 주소 형식 Static @@ -102,7 +99,7 @@ NetBIOS 삭제 실행 디스플레이 설정 -쓰기 작업 활성 +Write Operations 마지막에 실행한 게임 기억 버튼 선택 오류, 게임이 손상 되었습니다. @@ -115,8 +112,6 @@ NetBIOS 비디오 건너뛰기 DV-DL 에뮬레이트 IGR 비활성 -미사용 -미사용 크기 변경시 VMC 재포멧 됩니다. 생성 시작 @@ -166,8 +161,6 @@ V-동기화 모드 4 모드 5 모드 6 -모드 7 -모드 8 GSM 구성 이더넷 링크 모드 100Mbit Full-duplex @@ -175,9 +168,8 @@ GSM 구성 10Mbit Full-duplex 10Mbit Half-duplex GSM 설정 -GSM 활성화 +GSM Selector GSM 켜기 또는 끄기 -V모드 강제 커스텀 디스플레이 모드 H-POS 수평 조정 @@ -188,7 +180,7 @@ V-POS FMV 건너뛰기 풀 모션 비디오 건너뛰기 치트 설정 -PS2RD 치트 엔진 활성화 +PS2RD Cheat Engine PS2RD 치트 엔진 패치 적용 PS2RD 치트 엔진 모드 게임 치트 자동 선택 또는 선택 @@ -213,7 +205,7 @@ PS2 로고 콘솔의 지역과 일치하는 유효한 디스크 로고만 표시 PADEMU 구성 패드 에뮬레이터 설정 -패드 에뮬레이터 활성화 +Pad Emulator 선택된 게임 패드에뮬레이터 켬/끔. 패드 에뮬레이터 모드 패드 에뮬레이터 모드 선택 @@ -221,9 +213,9 @@ PADEMU 구성 듀얼쇼크3/4 BT 포트 설정: 설정용 패드 에뮬레이터 포트 활성화. -에뮬레이션 활성화 +Emulation 선택된 포트 패드에뮬레이터 켬/끔. -진동 활성화 +Vibration 패드 에뮬레이터에 선택된 포트 진동 켬/끔 USB 블루투스 어답터 맥 주소: DS 컨트롤러 맥 주소와 페어링: @@ -241,12 +233,12 @@ LMP 버전: 아니오 블루투스 어댑터는 DS3/DS4 컨트롤러와 완벽하게 호환되어야 합니다. 블루투스 어댑터가 DS3/DS4 컨트롤러에서 올바르게 작동하지 않을 수 있습니다. -멀티탭 에뮬레이션 활성화 +Multitap Emulation 선택한 게임을 위한 멀티탭 에뮬레이션 켬/끔. 포트상의 멀티탭 에뮬레이터 멀티탭 에뮬레이션을 위한 포트를 선택. -Fake DS3에 대한 해결방법 비활성화 -일부 fake DSs3는 해결 방법이 필요합니다. 이 옵션은 옵션을 비활성화. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. 필드 뒤집기 에뮬레이션 프로그레시브 비디오 모드에서 결함이있는 게임 수정. 보호자 잠금 설정 @@ -259,14 +251,17 @@ Fake DS3에 대한 해결방법 비활성화 오류 - 이 비밀번호를 사용할 수 없습니다. VMC %s 파일이 조각화되었습니다. 슬롯 %d에서 메모리 카드를 계속 사용하겠습니까? 오디오 설정 -사운드 효과 활성화 -부팅 사운드 활성화 +Sound Effects +Boot Sound 사운드 효과 볼륨 부팅 사운드 볼륨 비디오 모드 변경을 확인하겠습니까? 캐쉬 게임 목록 (HDD) -알림 활성화 -%s에서 %s을(를)로드했습니다. +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. 옵션 게임 설정이 저장되었습니다. %s 설정이 제거되었습니다. @@ -282,9 +277,10 @@ VMC %s 파일이 조각화되었습니다. 슬롯 %d에서 메모리 카드를 개정 개발자 설명 -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 게임 PS1 게임 표시 모드 '%s' 에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian_r2055.lng b/lng/lang_Laotian_r2114.lng similarity index 91% rename from lng/lang_Laotian_r2055.lng rename to lng/lang_Laotian_r2114.lng index 7c5431f7f..cbe17fd70 100644 --- a/lng/lang_Laotian_r2055.lng +++ b/lng/lang_Laotian_r2114.lng @@ -1,9 +1,8 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian -OPL %s ບັນທຶກການປ່ຽນແປງ ກັບຄືນ ກຳນົດຄ່າທາງດ້ານ Network @@ -14,7 +13,7 @@ Settings saved to %s ອອກຈາກໂປຣແກຣມ ການຕັ້ງຄ່າ ເມນູ -ຫຼິ້ນເກມຜ່ານ USB +ຫຼິ້ນເກມຜ່ານ BDM ຫຼິ້ນເກມຜ່ານ Hard Disk ຫຼິ້ນເກມຜ່ານ Network ໂປຣແກຣມຕ່າງໆ @@ -44,7 +43,6 @@ Settings saved to %s ໄປທີ່ລາຍຊື່ເກມ ຕັ້ງຄ່າໃຫ້ເກມນີ້ Remove Settings -ລົບລ້າງ Key ທັງໝົດອອກຈາກເກມ Scrolling Speed ຊ້າໆ ປານກາງ @@ -55,16 +53,16 @@ Scrolling Speed ເກີດຂໍ້ຜິດພາດໃນຂະນະທີ່ໂຫຼດເກມ ID ລຽງລຳດັບລາຍຊື່ເກມແບບອັດຕະໂນມັດ ເກີດຂໍ້ຜິດພາດໃນຂະນະທີ່ໂຫຼດ File ພາສາ -ປິດຂັ້ນຕອນການສະແດງຂໍ້ຜິດພາດດ້ວຍສີ +Debug Colors ບໍ່ສາມາດກວດພົບມືເກມ, ກະລຸນາລໍຖ້າ... -ສາມາດເຫັນຮູບໜ້າປົກເກມ +Cover Art ຈໍໍກວ້າງ ປິດເຄື່ອງ ກຳລັງໂຫຼດການຕັ້ງຄ່າ ກຳລັງບັນທຶກການຕັ້ງຄ່າ ເປີດໃຊ້ອຸປະກອນເຊື່ອມຕໍ່ ເອີ້ນຄືນໃໝ່ -ໂໝດ ເຊື່ອມຕໍ່ອຸປະກອນ BDM +BDM Start Mode ໂໝດ ເຊື່ອມຕໍ່ອຸປະກອນ Hard Disk ໂໝດ ເຊື່ອມຕໍ່ອຸປະກອນ Network ໂໝດ ຕ່າງໆສຳລັບໂປຣແກຣມ @@ -78,7 +76,6 @@ NBD Server ກໍາລັງຢຸດການໃຊ້ງານ... IGR path ສີຂອງພື້ນຫຼັງ ສີຂອງຂໍ້ຄວາມ -- PS2 - - SMB Server - ປະເພດຂອງ IP address ຄ່າຄົງທີ່ @@ -102,7 +99,7 @@ NetBIOS ລົບ ຫຼິ້ນເກມນີ້ ຕັ້ງຄ່າການສະແດງຜົນ -ສາມາດລົບເກມ ແລະ ປ່ຽນຊື່ເກມໄດ້ +Write Operations ໃຫ້ລະບົບຈື່ເກມທີ່ຫຼິ້ນໄປຄັ້ງສຸດທ້າຍ ເລືອກປຸ່ມ ເກີດຂໍ້ຜິດພາດ, ເກມນີ້ມີ fragmentation. ກະລຸນາ Defragment ເກມນີ້ກ່ອນ @@ -115,8 +112,6 @@ Unhook Syscalls ຂ້າມການຫຼິ້ນວິດິໂອ ປະມວນຜົນ DVD-DL Disable IGR -Unused -Unused ການປ່ຽນຂະໜາດຈະເຮັດໃຫ້ VMC(ກ້ອນເຊບສະເໝືອນຈິງ) ຖືກ format ໃໝ່ ສ້າງ Start @@ -166,8 +161,6 @@ V-Sync ໂໝດ 4 ໂໝດ 5 ໂໝດ 6 -ໂໝດ 7 -ໂໝດ 8 ກຳນົດຄ່າ GSM ໂໝດການເຊື່ອມຕໍ່ຂອງສາຍ LAN ສົ່ງຂໍ້ມູນ 100Mbit ແບບ Full-duplex @@ -175,9 +168,8 @@ V-Sync ສົ່ງຂໍ້ມູນ 10Mbit ແບບ Full-duplex ສົ່ງຂໍ້ມູນ 10Mbit ແບບ Half-duplex ການຕັ້ງຄ່າ GSM -ເປີດໃຊ້ງານ GSM +GSM Selector Toggles GSM ເປີດ ຫຼື ປິດ -VMODE ບັງຄັບໃຊ້ໂໝດການສະແດງຜົນທີ່ປັບແຕ່ງເອງ H-POS ການປັບແຕ່ງຄ່າສະແດງຜົນຕາມແນວນອນ @@ -188,7 +180,7 @@ Overscan Adjustment ຂ້າມຂັ້ນຕອນ FMV ຂ້າມຂັ້ນຕອນສະແດງພາບເຄື່ອນໄຫວ Full Video ຕັ້ງຄ່າການໂກງເກມ -ເປີດໃຊ້ງານ ຄຳສັ່ງໂກງເກມ PS2RD +PS2RD Cheat Engine ອະນຸຍາດໃຫ້ ຄຳສັ່ງໂກງເກມ PS2RD ເຂົ້າເຖິງເກມຂອງເຈົ້າ ໂໝດຂອງ ຄຳສັ່ງໂກງເກມ PS2RD ເລືອກການໂກງແບບອັດຕະໂນມັດ ຫຼື ເລືອກເອງ @@ -213,17 +205,17 @@ PS2 Logo ຈະຖືກສະແດງຜົນ ກໍຕໍ່ເມື່ອໂລໂກ້ຂອງແຜ່ນຖືກຕ້ອງ ແລະ ສອດຄ່ອງຕາມໂຊນຂອງເຄື່ອງ Configure PADEMU Pad Emulator Settings -Enable Pad Emulator -Turns On/Off Pad Emulator for selected game. +Pad Emulator +Turns on/off Pad Emulator for selected game. Pad Emulator Mode Select Pad Emulator mode. DualShock3/4 USB DualShock3/4 BT Settings For Port: Select Pad Emulator port for settings. -Enable Emulation +Emulation Turns on/off Pad Emulator for selected port. -Enable Vibration +Vibration Turns on/off vibration for Pad Emulator selected port. USB Bluetooth Adapter MAC Address: DS Controller Paired To MAC Address: @@ -241,12 +233,12 @@ Yes No Bluetooth adapter should be fully compatible with DS3/DS4 controllers. Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap Emulation +Multitap Emulation Turns on/off Multitap emulation for selected game. Multitap Emulator On Port: Select port for Multitap emulation. -Disable Fake DS3 Workaround -Some fake DS3s need workaround, this option will disable it. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings @@ -259,14 +251,17 @@ Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? Audio Settings -Enable Sound Effects -Enable Boot Sound +Sound Effects +Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) -Enable Notifications -%s loaded from %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Game settings saved. %s settings removed. @@ -282,9 +277,10 @@ Genre Release Developer Description -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Persian_r2055.lng b/lng/lang_Persian_r2114.lng similarity index 89% rename from lng/lang_Persian_r2055.lng rename to lng/lang_Persian_r2114.lng index f60e56613..3ca862342 100644 --- a/lng/lang_Persian_r2055.lng +++ b/lng/lang_Persian_r2114.lng @@ -1,9 +1,8 @@ # Translation by saeid0035 -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian -OPL %s تاﺮﻴﻴﻐﺗ هﺮﻴﺧذ ﺖﺸﮔﺮﺑ ﻪﻜﺒﺷ ﺕﺎﻤﻴﻈﻨﺗ @@ -14,7 +13,7 @@ OPL %s جوﺮﺧ تﺎﻤﻴﻈﻨﺗ ﻮﻨﻣ -USB یﺎﻫ یزﺎﺑ +BDM یﺎﻫ یزﺎﺑ HDD یﺎﻫ یزﺎﺑ ETH یﺎﻫ یزﺎﺑ ﺎﻫ ﻪﻣﺎﻧﺮﺑ @@ -44,7 +43,6 @@ ETH یﺎﻫ یزﺎﺑ ﺎﻫ یزﺎﺑ ﺖﺴﻴﻟ ﺎﻫ یزﺎﺑ تﺎﻤﻴﻈﻨﺗ ﺕﺎﻤﻴﻈﻨﺗ ﻥﺩﺮﮐ ﮎﺎﭘ -یزﺎﺑ یﺎﻫ ﺪﻴﻠﻛ مﺎﻤﺗ ندﺮﻛ کﺎﭘ Scrolling Speed ﻪﺘﺴﻫآ ﻲﻟﻮﻤﻌﻣ @@ -55,16 +53,16 @@ Scrolling Speed هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ یزﺎﺑ ﻪﺳﺎﻨﺷ یراﺬﮔرﺎﺑ مﺎﮕﻨﻫ رد رﺎﻛدﻮﺧ نداد ﺐﻴﺗﺮﺗ ﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ نﺎﺑز ﻞﻴﺎﻓ یراﺬﮔرﺎﺑ مﺎﮕﻨﻫرد -ﻲﻳﺎﺸﮔ ﻞﻜﺸﻣ یﺎﻫ ﮓﻧر ندﺮﻛ لﺎﻌﻓﺮﻴﻏ +Debug Colors ...ﺪﻴﻧﺎﻤﺑ ﺮﻈﺘﻨﻣ ﺪﺸﻧ اﺪﻴﭘ یﺮﻟﺮﺘﻨﻛ ﭻﻴﻫ -ﺎﻫ یزﺎﺑ روﺎﻛ ندﺮﻛ لﺎﻌﻓ +Cover Art هﺪﻴﺸﻛ ﻪﺤﻔﺻ ندﺮﻛ شﻮﻣﺎﺧ یﺪﻨﺑﺮﻜﻴﭘ یراﺬﮔرﺎﺑ لﺎﺣرد یﺪﻨﺑﺮﻜﻴﭘ هﺮﻴﺧذ لﺎﺣرد هﺪﻨﻨﻛ عوﺮﺷ هﺎﮕﺘﺳد یزﺎﺳ هزﺎﺗ -BDM هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ +BDM Start Mode HDD هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ ETH هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ ﺎﻫ ﻪﻣﺎﻧﺮﺑ ﻮﻨﻣ نداد نﺎﺸﻧ @@ -78,7 +76,6 @@ NBD روﺮﺳ عوﺮﺷ IGR ﺮﻴﺴﻣ ﻪﻨﻴﻣز ﺲﭘ ﮓﻧر نﻮﺘﻣ ﮓﻧر -- 2 ﻦﺸﻴﺘﺳا ﻲﻠﭘ - - SMB روﺮﺳ - ﻲﭙﻳآ سردآ عﻮﻧ ﺎﺘﺴﻳا @@ -102,7 +99,7 @@ NetBIOS ندﺮﻛ کﺎﭘ اﺮﺟا ﺮﮕﺸﻳﺎﻤﻧ تﺎﻤﻴﻈﻨﺗ -ﻦﺘﺷﻮﻧ هزﺎﺟا ندﺮﻛ لﺎﻌﻓ +Write Operations هﺪﺷ مﺎﺟﻧا یزﺎﺑ ﻦﻳﺮﺧآ ﻦﺘﺷاد دﺎﻳ ﻪﺑ بﺎﺨﺘﻧا ی ﻪﻤﻛد ﺖﺳا ﻪﺘﺨﻳر ﻢﻫ ﻪﺑ یزﺎﺑ یﺎﻫ ﻞﻳﺎﻓ هﺪﻣآ دﻮﺟو ﻪﺑ ﻲﻠﻜﺸﻣ @@ -115,8 +112,6 @@ Syscalls ندﺮﻛزﺎﺑ ﺎﻫ ﻮﻳﺪﻳو ندﺮﻛ در DVD-DL یزﺎﺳ ﻪﻴﺒﺷ IGR ندﺮﻛ لﺎﻌﻓﺮﻴﻏ -هﺪﺸﻧ هدﺎﻔﺘﺳا -هﺪﺸﻧ هدﺎﻔﺘﺳا ﺪﻨﻜﻴﻣ ﺖﻣﺮﻓ ار یزﺎﺟﻣ ی ﻪﻈﻓﺎﺣ ترﺎﻛ هزاﺪﻧا ﺮﻴﻴﻐﺗ ﻦﺘﺧﺎﺳ عوﺮﺷ @@ -166,8 +161,6 @@ V-Sync 4 ﺖﻟﺎﺣ 5 ﺖﻟﺎﺣ 6 ﺖﻟﺎﺣ -7 ﺖﻟﺎﺣ -8 ﺖﻟﺎﺣ GSM یﺪﻨﺑﺮﻜﻴﭘ ﺖﻧﺮﺘﻨﻳا طﺎﺒﺗرا ﺖﻟﺎﺣ ﻒﻋﺎﻀﻣ ﺎﻠﻣﺎﻛ ﺖﻴﺑﺎﮕﻣ 001 @@ -175,9 +168,8 @@ GSM یﺪﻨﺑﺮﻜﻴﭘ ﻒﻋﺎﻀﻣ ﺎﻠﻣﺎﻛ ﺖﻴﺑﺎﮕﻣ 01 ﻒﻋﺎﻀﻣ ﻪﻤﻴﻧ ﺖﻴﺑﺎﮕﻣ 01 GSM تﺎﻤﻴﻈﻨﺗ -GSM ندﺮﻛ لﺎﻌﻓ +GSM Selector GSM ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ ﻦﺷور -ﻮﻳﺪﻳو ﺖﻟﺎﺣ ﻲﺷرﺎﻔﺳ ﺮﮕﺸﻳﺎﻤﻧ ﻪﺑ رﺎﺒﺟا H ﺖﻴﻌﻘﻮﻣ ﻲﻘﻓا ﺖﻟﺎﺣ ﻢﻴﻈﻨﺗ @@ -188,7 +180,7 @@ V ﺖﻴﻌﻘﻮﻣ FMV زا نﺪﻳﺮﭘ ﺎﻫ ﻦﻴﺳ تﺎﻛ زا نﺪﻳﺮﭘ ﺐﻠﻘﺗ ﺪﻛ تﺎﻤﻴﻈﻨﺗ -PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ندﺮﻛ لﺎﻌﻓ +PS2RD Cheat Engine ﺪﻨﻛ ﭻﭘ ارﺎﻤﺷ یزﺎﺑ PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺎﺗ ﺪﻳراﺬﮕﺑ PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺖﻟﺎﺣ یزﺎﺑ ﺐﻠﻘﺗ ﺰﻣر ﻲﺘﺳد بﺎﺨﺘﻧا ﺎﻳ و رﺎﻛدﻮﺧ بﺎﺨﺘﻧا @@ -213,7 +205,7 @@ PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺖﻟﺎﺣ .ﺩﻮﺷ ﻰﻣ ﻩﺩﺍﺩ ﻥﺎﺸﻧ ﺪﻧﺭﺍﺩ ﻰﻧﺍﻮﺨﻤﻫ ﻝﻮﺴﻨﻛ ﻦﺠﻳﺭ ﺎﺑ ﻪﻛ ﻯﺮﺒﺘﻌﻣ ﻯﺎﻫ ﮏﺴﻳﺩ ﻯﺍﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ یﺪﻨﺑﺮﻜﻴﭘ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ تﺎﻤﻴﻈﻨﺗ -ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ لﺎﻌﻓ +Pad Emulator .هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ یزﺎﺑ یاﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ و نﺷور ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ﺖﻟﺎﺣ .ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ﺖﻟﺎﺣ بﺎﺨﺘﻧا @@ -221,9 +213,9 @@ USB ﻖﻴﺮﻃ زا 4/3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﺮﻟﺮﺘﻨﻛ ثﻮﺗﻮﻠﺑ ﻖﻴﺮﻃ زا 4/3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﺮﻟﺮﺘﻨﻛ :هﺎﮔرد یاﺮﺑ تﺎﻤﻴﻈﻨﺗ .ﺪﻴﻨﻛ بﺎﺨﺘﻧا تﺎﻤﻴﻈﻨﺗ یاﺮﺑ ار ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ هﺎﮔرد -یزﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ لﺎﻌﻓ +Emulation .هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ هﺎﮔرد یاﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ و ﻦﺷور -کﻮﺷ ندﺮﻛ لﺎﻌﻓ +Vibration .هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ هﺎﮔﺮد یاﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ی هﺮﺒﻳو ندﺮﻛ لﺎﻌﻓﺮﻴﻏ ﺎﻳ لﺎﻌﻓ :USB ثﻮﺗﻮﻠﺑ رﻮﺘﭘادآ سردآ ﮏﻣ :سردآ ﮏﻣ ﺎﺑ ﺖﺳا هﺪﺷ ﺖﻔﺟ ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﺮﻟﺮﺘﻨﻛ @@ -241,12 +233,12 @@ USB ﻖﻴﺮﻃ زا 4/3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﺮﻟﺮﺘﻨﻛ ﺮﻴﺧ .ﺪﺷﺎﺑ رﺎﮔزﺎﺳ 4 و 3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ ﺮﻟﺮﺘﻨﻛ ﺎﺑ ﻞﻣﺎﻛ ترﻮﺻ ﻪﺑ ﺪﻳﺎﺑ ثﻮﺗﻮﻠﺑ رﻮﺘﭘادآ .ﺪﻨﻜﻧ رﺎﻛ 4و 3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ ﺮﻟﺮﺘﻨﻛ ﺎﺑ ﺪﻳﺎﺷ ثﻮﺗﻮﻠﺑ رﻮﺘﭘادآ -ﺪﻴﻠﻛ ﺪﻨﭼ نﺎﻣﺰﻤﻫ ندﺮﺸﻓ یزﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ لﺎﻌﻓ +Multitap Emulation .هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ یزﺎﺑ یاﺮﺑ ﺪﻴﻠﻛ ﺪﻨﭼ نﺎﻣﺰﻤﻫ ندﺮﺸﻓ یزﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ و ﻦﺷور هﺎﮔرد رد ﺪﻴﻠﻛ ﺪﻨﭼ نﺎﻣﺰﻤﻫ ندﺮﺸﻓ یزﺎﺳ ﻪﻴﺒﺷ .ﺪﻴﻠﻛ ﺪﻨﭼ نﺎﻣﺰﻤﻫ ندﺮﺸﻓ یزﺎﺳ ﻪﻴﺒﺷ یاﺮﺑ هﺎﮔرد بﺎﺨﺘﻧا -3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﻲﺒﻠﻘﺗ یﺎﻫ ﺮﻟﺮﺘﻨﻛ یاﺮﺑ ﻞﺣ هار ندﺮﻛ لﺎﻌﻓﺮﻴﻏ -.ﺪﻨﻜﻴﻣ لﺎﻌﻓﺮﻴﻏ ار نآ ﻪﻨﻳﺰﮔ ﻦﻳا ,ﺪﻧراد زﺎﻴﻧ ﻞﺣ هار ﻪﺑ 3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﻲﺒﻠﻘﺗ یﺎﻫ ﺮﻟﺮﺘﻨﻛ زا ﻲﻀﻌﺑ +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ . ﺪﻧراد ﭻﻴﻠﮔ progressive ﻮﻳﺪﻳو ﺖﻟﺎﺣ رد ﻪﻛ ییﺎﻫ یزﺎﺑ ندﺮﻛ ﺖﺳرد ﻦﻳﺪﻟاو ﻞﻔﻗ تﺎﻤﻴﻈﻨﺗ @@ -259,14 +251,17 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ .دﻮﺷ هدﺎﻔﺘﺳا ﺪﻧاﻮﺘﻴﻤﻧ رﻮﺒﻋ ﺰﻣر ﻦﻳا - هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ?%d هﺎﮔرد ﻲﻜﻳﺰﻴﻓ ی ﻪﻈﻓﺎﺣ ﺎﺑ ﻪﻣادا .ﺖﺳا هﺪﺷ ﻲﮕﺘﺨﻳر ﻢﻬﺑ رﺎﭼد %s یزﺎﺠﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ اﺪﺻ تﺎﻤﻴﻈﻨﺗ -ﻲﺗﻮﺻ یﺎﻫ هﻮﻠﺟ ندﺮﻛ لﺎﻌﻓ -تﻮﺑ یاﺪﺻ ندﺮﻛ لﺎﻌﻓ +Sound Effects +Boot Sound ﻲﺗﻮﺻ یﺎﻫ هﻮﻠﺟ اﺪﺻ ﻪﺟرد تﻮﺑ یاﺪﺻ ی ﻪﺟرد >؟ﺪﻴﻨﻜﻴﻣ ﺪﻴﻳﺎﺗ ار ﻮﻳﺪﻳو ﺖﻟﺎﺣ ﺮﻴﻴﻐﺗ )HDD( ﺎﻫ یزﺎﺑ ﺖﺳﺮﻬﻓ ﺶﻛ -ﻰﻧﺎﺳﺭ ﻉﺎﻠﻃا ﻥﺩﺮﻛ ﻝﺎﻌﻓ -ﺪﺷ ﻯﺭﺍﺬﮔ ﺭﺎﺑ %s زا %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. ﺎﻫ ﻪﻨﯾﺰﮔ ﺪﺷ ﻩﺮﻴﺧﺫ ﻯﺯﺎﺑ ﺕﺎﻤﻴﻈﻨﺗ %s ﺪﺷ ﮎﺎﭘ %s ﺕﺎﻤﻴﻈﻨﺗ @@ -282,9 +277,10 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ ﻪﺿﺮﻋ ﺦﻳﺭﺎﺗ ﻩﺪﻧﺯﺎﺳ ﺕﺎﺤﻴﺿﻮﺗ -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ !'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ diff --git a/lng/lang_Polish_r2055.lng b/lng/lang_Polish_r2114.lng similarity index 89% rename from lng/lang_Polish_r2055.lng rename to lng/lang_Polish_r2114.lng index bc6b5a0f1..c807631a4 100644 --- a/lng/lang_Polish_r2055.lng +++ b/lng/lang_Polish_r2114.lng @@ -1,9 +1,8 @@ # Translation by yohokaru -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish -OPL %s Zapisz Zmiany Wróć Ustawienia Sieci @@ -14,7 +13,7 @@ Błąd zapisu ustawień! Wyjdź Ustawienia Menu -Gry USB +Gry BDM Gry HDD Gry ETH Aplikacje @@ -44,7 +43,6 @@ X Lista Gier Ustawienia Gry Usuń Ustawienia -Usunięto wszystkie klucze dla gry. Scrolling Speed Wolno Średnio @@ -55,16 +53,16 @@ Proszę czekać. Błąd podczas ładowania identyfikatora gry. Sortowanie Automatyczne Błąd ładowania pliku językowego. -Nie Wyświetlaj Kolorów Debugowania +Debug Colors Nie wykryto kontrolera, oczekiwanie... -Wyświetlanie Okładek +Cover Art Szeroki Ekran Wyłącz Wczytywanie ustawień... Zapisywanie ustawień... Uruchom Urządzenie Odśwież -Uruchom Urządzenie BDM +BDM Start Mode Uruchom Urządzenie HDD Uruchom Urządzenie ETH Wyświetl Menu Aplikacji @@ -78,7 +76,6 @@ Serwer NBD zostanie zamknięty... Ścieżka Dla IGR Kolor Tła Kolor Tekstu -- PS2 - - Serwer SMB - Typ Adresu IP Statyczny @@ -102,7 +99,7 @@ Zmień Nazwę Usuń Uruchom Ustawienia Obrazu -Włącz Operację Zapisu +Write Operations Zapamiętaj Ostatnio Uruchomioną Grę Przycisk Wyboru Błąd, gra jest pofragmentowana. @@ -115,8 +112,6 @@ Wymaż OPL Po Uruchomieniu Gry Pomiń Wstawki Filmowe Emuluj DVD-DL Wyłącz IGR -Niewykorzystany -Niewykorzystany Zmiana rozmiaru spowoduje przeformatowanie VMC. Utwórz Start @@ -166,8 +161,6 @@ Tryb 3 Tryb 4 Tryb 5 Tryb 6 -Tryb 7 -Tryb 8 Konfiguruj GSM Szybkość I Tryb Sieci 100Mbit Pełny-dupleks @@ -175,9 +168,8 @@ Szybkość I Tryb Sieci 10Mbit Pełny-dupleks 10Mbit Pół-dupleks Ustawienia GSM -Aktywuj GSM +GSM Selector Włącz lub wyłącz GSM. -Tryb Wideo Wymuś określony tryb wyświetlania. Położenie Poziome Regulacja w poziomie. @@ -188,7 +180,7 @@ Regulacja overscanu. Pomiń FMV Pomija wstawki filmowe. Ustawienia Kodów -Włącz Silnik Kodów PS2RD +PS2RD Cheat Engine Pozwól silnikowi kodów PS2RD patchować grę. Tryb Silnika Kodów PS2RD Auto-wybieranie lub wybieranie kodów dla gry. @@ -213,7 +205,7 @@ Logo PS2 Logo zostanie wyświetlone wyłącznie jeśli region gry i konsoli będzie taki sam. Konfiguracja Emulacji Pada Ustawienia Emulacji Pada -Włącz Emulację Pada +Pad Emulator Włącza/wyłącza emulację Pada dla wybranej gry. Tryb Emulacji Pada Wybierz tryb emulacji Pada. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Ustawienia Portu: Wybierz Port emulacji Pada dla ustawień. -Włącz Emulację +Emulation Włącz/wyłącz emulację Pada dla wybranego portu. -Włącz Wibracje +Vibration Włącz/wyłącz wibracje dla wybranego portu emulacji Pada. Adres MAC adaptera Bluetooth USB: Kontroler DS sparowany z adresem MAC: @@ -241,12 +233,12 @@ Tak Nie Adapter Bluetooth powinien być w pełni kompatybilny z kontrolerami DS3/DS4. Adapter Bluetooth może nie współpracować poprawnie z kontrolerami DS3/DS4. -Włącz emulację Multitapa +Multitap Emulation Włącza/wyłącza emulację Multitapa dla wybranej gry. Emulacja Multitapa Dla Portu: Wybierz port dla emulacji Multitapa. -Nie Stosuj Obejścia Dla Klonów DS3. -Niektóre klony DS3 wymagają obejścia, ta opcja to wyłączy. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emuluj FIELD Flipping Poprawka dla gier w których występują usterki w trybie progresywnego obrazu. Ustawienia Blokady Rodzicielskiej @@ -259,14 +251,17 @@ Opcje Kompilacji: Błąd - to hasło nie może być użyte. Plik VMC %s jest pofragmentowany. Kontynuuj z kartą pamięci w gnieździe %d? Ustawienia Dźwiękowe -Efekty Dźwiękowe -Dźwięk Startowy +Sound Effects +Boot Sound Głośność Efektów Dźwiękowych Głośność Dźwięku Startowego Potwierdasz zmianę rozdzielczości? Buforowanie Listy Gier (HDD) -Powiadomienia -%s załadowany z %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Ustawienia gry zostały zapisane. %s ustawienia zostały usunięte. @@ -282,9 +277,10 @@ Gatunek Data wydania Deweloper Opis -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese_BR_r2055.lng b/lng/lang_Portuguese_BR_r2114.lng similarity index 89% rename from lng/lang_Portuguese_BR_r2055.lng rename to lng/lang_Portuguese_BR_r2114.lng index 1f10d2147..4d9e3d258 100644 --- a/lng/lang_Portuguese_BR_r2055.lng +++ b/lng/lang_Portuguese_BR_r2114.lng @@ -1,9 +1,8 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: August 07, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese -OPL %s Salvar configurações Voltar Configurações de rede @@ -14,7 +13,7 @@ Erro ao salvar configurações! Sair Configurações Menu -Jogos no USB +Jogos no BDM Jogos no HDD Jogos em REDE Aplicativos @@ -44,7 +43,6 @@ X Lista de jogos Ajustes Remover configurações -Todos os ajustes do jogo foram removidos Velocidade de rolagem Lenta Média @@ -55,16 +53,16 @@ Espere por favor Erro ao carregar ID do jogo Ordenação automática Erro ao carregar arquivo de idioma -Desativar depuração de cores +Debug Colors Controle não detectado, esperando... -Habilitar artes +Cover Art Wide screen (Visão panorâmica) Desligar Carregando configurações... Salvando configurações... Iniciar dispositivo Atualizar -Modo de início do dispositivo BDM +BDM Start Mode Modo de início do dispositivo HDD Modo de início do dispositivo REDE Modo de início dos Aplicativos @@ -78,7 +76,6 @@ Fechando servidor NBD... Sair para Cor do fundo Cor do texto -- PS2 - - Servidor SMB - Tipo de endereço IP Estático @@ -102,7 +99,7 @@ Renomear Excluir Iniciar Definições de tela -Ativar ações de gravação +Write Operations Lembrar último jogo executado Escolha o botão de ação ( X ou O ) Erro, o jogo está fragmentado! @@ -115,8 +112,6 @@ Desativar chamadas do sistema Pular vídeos PSS Emular DVD-DL Desabilitar IGR -Não utilizado -Não utilizado Alterar o tamanho (Irá reformatar o VMC!) Criar Iniciar atualização @@ -166,8 +161,6 @@ Modo 3 Modo 4 Modo 5 Modo 6 -Modo 7 -Modo 8 Configurar GSM Conexão de rede 100Mbit Full-duplex @@ -175,9 +168,8 @@ Conexão de rede 10Mbit Full-duplex 10Mbit Half-duplex Configurações GSM -Ativar GSM +GSM Selector Autoriza o GSM a forçar o modo de vídeo selecionado abaixo -Selecione o modo de vídeo Modo de vídeo a ser forçado Ajuste Horizontal Define o ajuste horizontal da imagem na tela @@ -188,7 +180,7 @@ Define o ajuste da tela visível Pular vídeos FMV Ignora vídeos no formato (FMV) Configurar PS2RD -Ativar PS2RD +PS2RD Cheat Engine Autoriza o PS2RD a usar Cheats(Trapaças) nos seus jogos Modo PS2RD Auto seleção(Ativa todos) ou Selecione os Cheats do jogo @@ -213,7 +205,7 @@ Logo PS2 Exibido para um logotipo de disco válido que corresponde à região do console. Configurar PADEMU Configurações do Emulador de Controles -Ativar Emulador de Controles +Pad Emulator Liga/desliga o Emulador de Controles para o jogo selecionado. Modo Emulador de Controles Selecione o modo do Emulador de Controles. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Configurações da porta: Selecione a porta que será configurada. -Ativar emulação +Emulation Liga/desliga a emulação na porta selecionada. -Ativar vibração +Vibration Liga/desliga a vibração na porta selecionada. Endereço MAC do adaptador Bluetooth USB: Endereço MAC do Controle DS emparelhado: @@ -241,12 +233,12 @@ Sim Não O adaptador Bluetooth deve ser totalmente compatível com os controles DS3/4. O adaptador Bluetooth pode não funcionar corretamente com os controles DS3/4. -Ativar emulação Multitap +Multitap Emulation Liga/desliga a emulação Multitap para o jogo selecionado. Emulador Multitap na porta Selecione a porta para a emulação Multitap. -Desativar solução alternativa para Controle DS3 pirata -Alguns Controles DS3 piratas precisam de solução alternativa, esta opção irá desativá-lo. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emular inversão de CAMPO Correção para jogos que apresentam falhas nos modos de vídeo progressivo. Controle parental @@ -259,14 +251,17 @@ Opções nesta compilação: Erro - esta senha não pode ser usada. O arquivo VMC %s está fragmentado. Continuar com o cartão de memória na entrada %d? Configurações de áudio -Ativar efeitos sonoros -Ativar som de inicialização +Sound Effects +Boot Sound Volume de efeitos sonoros Volume do som de inicialização Confirmar alteração do modo de vídeo? Cache da lista de jogos (HD) -Ativar notificações -%s carregado de %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Opções Configurações do jogo salvas. %s configurações removidas. @@ -282,9 +277,10 @@ Gênero Data de lançamento Desenvolvedor Descrição -Jogos BDM -Selecionar dispositivos de entrada +Block Devices Configurar controles +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_r2055.lng b/lng/lang_Portuguese_r2114.lng similarity index 88% rename from lng/lang_Portuguese_r2055.lng rename to lng/lang_Portuguese_r2114.lng index 1eb1b87c5..78b1ebf09 100644 --- a/lng/lang_Portuguese_r2055.lng +++ b/lng/lang_Portuguese_r2114.lng @@ -1,9 +1,8 @@ # Translation by danielb -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese -OPL %s Salvar alterações Voltar Configurações de Rede @@ -14,7 +13,7 @@ Erro ao salvar configurações! Sair Configurações Menu -Jogos por USB +Jogos por BDM Jogos por HDD Jogos por Rede Aplicações @@ -44,8 +43,7 @@ Cruz Lista de Jogos Aj. do jogo Remover configurações -Removidos todos os ajustes para o jogo -Scrolling Speed +Velocidade de rolagem Lento Médio Rápido @@ -55,16 +53,16 @@ Por favor espere Erro ao carregar ID do jogo Ordenar automaticamente Erro ao carregar ficheiro de idioma -Desativar depuração de cores +Debug Colors Comando não detectado, esperando... -Ativar Arte de Capas +Cover Art Ecrâ Panorâmico Desligar PS2 Carregando configurações A guardar configurações... Iniciar dispositivo Atualizar -Modo de inicialização do dispositivo BDM +BDM Start Mode Modo de inicio para dispositivo HDD Modo de inicio para dispositivo Rede Modo de inicio para Aplicações @@ -78,7 +76,6 @@ Servidor NBD a fechar... Definir saída do IGR Cor de fundo Cor do texto -- PS2 - - Servidor SMB - Endereço IP Estático @@ -102,7 +99,7 @@ Renomear Apagar Iniciar Definições de Visualização -Ativar operações de escrita +Write Operations Lembrar último jogo executado Botão de Seleção Erro, o jogo está fragmentado @@ -115,8 +112,6 @@ Desativar chamadas do sistema Saltar videos Emular DVD-DL Desativar IGR -Não utilizado -Não utilizado Alterar o tamanho (Irá reformatar o VMC!) Criar Iniciar @@ -166,8 +161,6 @@ Modo 3 Modo 4 Modo 5 Modo 6 -Modo 7 -Modo 8 Configurar GSM Velocidade Ethernet e sistema Duplex 100Mbit Full-duplex @@ -175,9 +168,8 @@ Velocidade Ethernet e sistema Duplex 10Mbit Full-duplex 10Mbit Half-duplex Opções do GSM -Ativar o GSM +GSM Selector Permitir que o GSM ative o modo de vídeo escolhido -Modo de vídeo selecionado Modo de vídeo a ser ativado Ajuste horizontal Definir compensação horizontal @@ -188,7 +180,7 @@ Ajustar Overscan Saltar FMV Saltar vídeos Opções de Cheat -Ativar PS2RD Cheat Engine +PS2RD Cheat Engine Permite PS2RD Cheat Engine injetar código nos jogos. Modo da PS2RD Cheat Engine Auto-Selecionar ou Selecionar cheats de jogo @@ -213,7 +205,7 @@ Logo PS2 Exibido para um logotipo de disco válido que corresponde à região da consola. Configurar PADEMU Definições do Emulador de Comando -Ativar Emulador Comando +Pad Emulator Ligar/Desligar o emulador para o jogo selecionado. Modo do Emulador de Comando Selecione o modo do Emulador de Comando. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Definições para a porta: Selecione a porta do Emulador de Comando para as definições. -Ativar emulação +Emulation Ligar/Desligar o emulador para a porta selecionada. -Ativar vibração. +Vibration Ligar/Desligar vibração na porta selecionada. Endereço MAC do adaptador Bluetooth USB: Comando DS emparelhado ao endereço MAC: @@ -241,12 +233,12 @@ Sim Não O adaptador Bluetooth deve ser completamente compatível com comandos DS3/DS4. O adaptador Bluetooth pode não funcionar corretamente com comandos DS3/DS4. -Ativar emulação Multitap +Multitap Emulation Ligar/Desligar a emulação Multitap para o jogo selecionado Emulador Multitap na porta Selecionar porta para o emulador de Multitap. -Desativar workaround para clones DS3 -Alguns clones DS3 precisam de workaround, esta opção irá desativar-lo. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emular inversão de CAMPO Correção para jogos que apresentam falhas nos modos de vídeo progressivo. Definições do Controlo Parental @@ -259,14 +251,17 @@ Opções de compilação: Erro - esta password não pode ser usada. O ficheiro VMC %s está fragmentado. Continuar com o Cartão de Memoria na ranhura %d? Definições de Áudio -Ativar sons -Ativar som de Arranque +Sound Effects +Boot Sound Volume dos sons Volume do som de arranque Confirmar alteração do modo de vídeo? Cache da lista de jogos (HDD) -Ativar notificações -%s carregado de %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Opções Configurações do jogo guardadas. %s configurações removidas. @@ -282,9 +277,10 @@ Gênero Data de lançamento Desenvolvedor Descrição -Jogos BDM -Selecionar dispositivos de entrada -Controller Settings +Block Devices +Configurações dos comandos +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Romanian_r2055.lng b/lng/lang_Romanian_r2114.lng similarity index 88% rename from lng/lang_Romanian_r2055.lng rename to lng/lang_Romanian_r2114.lng index 9a854c604..1e95a4de2 100644 --- a/lng/lang_Romanian_r2055.lng +++ b/lng/lang_Romanian_r2114.lng @@ -1,9 +1,8 @@ # Romanian translation by MRAdyy -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Romanian -Open PS2 Loader %s Salvare Setari Inapoi Config. retea @@ -14,7 +13,7 @@ Eroare in scrierea setarilor! Iesire Setari Meniu -Jocuri pe USB +Jocuri pe BDM Jocuri pe HDD Jocuri cu cablu LAN Aplicatii @@ -44,7 +43,6 @@ Cruce Lista jocuri Setari joc Remove Settings -Au fost sterse toate butoanele jocului Scrolling Speed Incet Medium @@ -55,16 +53,16 @@ Va rugam asteptati Eroare in incarcarea Id-ului al jocului Sortare automata Eroare in incarcarea fisierlui limba -Oprire culori depanare +Debug Colors Nici-o maneta gasita, se asteapta... -Activati Coperta +Cover Art Ecran Lat Oprire Se incarca configurare Se salveaza configurarea Pornire dispozitiv Reimprospatare -Modul de pornire al dispozitivului BDM +BDM Start Mode Modul de pornire al dispozitivului HDD Modul de pornire al dispozitivului Retea Modul de pornire aplicatii @@ -78,7 +76,6 @@ Serverul NBD se descarca... cale IGR Culoare fundal Culoare text -- PS2 - - Server SMB - Tip adresa IP Statica @@ -102,7 +99,7 @@ Redenumire Stergere Ruleaza Setari Imagine -Activeaza operatiuni de scriere +Write Operations Aminteste ultimul joc jucat Butonul Select "Eroare, jocul este fragmentat" @@ -115,8 +112,6 @@ Dezactivați apelurile sistemului 0 PSS mod Simulare DVD-DL Dezactivare IGR -Unused -Unused Schimbarea dimensiunii va reformata VMC Creeaza Start @@ -166,8 +161,6 @@ Mod 3 Mod 4 Mod 5 Mod 6 -Mod 7 -Mod 8 Configurare GSM Mod conectare Retea 100Mbit ful-dublu @@ -175,9 +168,8 @@ Mod conectare Retea 10Mbit ful-dublu 10Mbit jumatate-dublu Setari GSM -Activare GSM +GSM Selector Comuta GSM Pornit sau Oprit -Mod Video Modul de afișare personalizat fortat Pozitie-H Pozitie Orizontala @@ -188,7 +180,7 @@ Overscan Adjustment Salta FMV Omite Cutscenes Setari coduri -Activeaza PS2RD Cheat Engine +PS2RD Cheat Engine Lasa PS2RD Cheat Engine sa-ti patchuiasca jocurile Mod PS2RD Cheat Engine Selectati automat sau Selectati Codurile @@ -213,17 +205,17 @@ PS2 Logo Displayed for a valid disc logo matching the console's region. Configure PADEMU Pad Emulator Settings -Enable Pad Emulator -Turns On/Off Pad Emulator for selected game. +Pad Emulator +Turns on/off Pad Emulator for selected game. Pad Emulator Mode Select Pad Emulator mode. DualShock3/4 USB DualShock3/4 BT Settings For Port: Select Pad Emulator port for settings. -Enable Emulation +Emulation Turns on/off Pad Emulator for selected port. -Enable Vibration +Vibration Turns on/off vibration for Pad Emulator selected port. USB Bluetooth Adapter MAC Address: DS Controller Paired To MAC Address: @@ -241,12 +233,12 @@ Yes No Bluetooth adapter should be fully compatible with DS3/DS4 controllers. Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap Emulation +Multitap Emulation Turns on/off Multitap emulation for selected game. Multitap Emulator On Port: Select port for Multitap emulation. -Disable Fake DS3 Workaround -Some fake DS3s need workaround, this option will disable it. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings @@ -259,14 +251,17 @@ Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? Audio Settings -Enable Sound Effects -Enable Boot Sound +Sound Effects +Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) -Enable Notifications -%s loaded from %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Game settings saved. %s settings removed. @@ -282,9 +277,10 @@ Genre Release Developer Description -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Russian_r2055.lng b/lng/lang_Russian_r2114.lng similarity index 90% rename from lng/lang_Russian_r2055.lng rename to lng/lang_Russian_r2114.lng index d499ef4be..58b8bec51 100644 --- a/lng/lang_Russian_r2055.lng +++ b/lng/lang_Russian_r2114.lng @@ -1,9 +1,8 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: August 07, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian -OPL %s Сохранить настройки Назад Настройки сети @@ -14,7 +13,7 @@ OPL %s Выход Настройки Меню -Игры USB +Игры BDM Игры HDD Игры ETH Приложения @@ -44,7 +43,6 @@ OPL %s Список игр Настройки игры Сбросить настройки -Все ключи для игры удалены. Скорость прокрутки Медленная Средняя @@ -55,16 +53,16 @@ OPL %s Ошибка загрузки ID игры. Автоматическая сортировка Ошибка загрузки языкового файла. -Отключить цвета отладки +Debug Colors Контроллер не обнаружен, ожидание... -Отображать фоновые рисунки +Cover Art Широкий экран Выключить консоль Загрузка настроек... Сохранение настроек... Запуск устройства Обновить -Режим запуска BDM +BDM Start Mode Режим запуска HDD Режим запуска ETH Режим показа Приложений @@ -78,7 +76,6 @@ NBD-сервер запущен... ELF при вызове IGR Цвет фона Цвет текста -- PS2 - - Сервер SMB - Тип IP-адреса Статический @@ -102,7 +99,7 @@ NetBIOS Удалить Старт Настройки экрана -Разрешить операции записи +Write Operations Запоминать последнюю игру Кнопка выбора Ошибка, игра фрагментирована. @@ -115,8 +112,6 @@ NetBIOS Пропуск видео Эмулировать DVD-DL Отключить IGR -unused -unused При изменении размера VMC отформатируется. Создать Старт @@ -166,8 +161,6 @@ ID игры Режим 4 Режим 5 Режим 6 -Режим 7 -Режим 8 Настроить GSM Режим подключения сети 100 Мбит полный дуплекс @@ -175,9 +168,8 @@ ID игры 10 Мбит полный дуплекс 10 Мбит полудуплекс Настройки GSM -Задействовать GSM +GSM Selector Включает или выключает GSM. -Видеорежим Принудительный пользовательский видеорежим. Смещение по горизонтали Горизонтальное положение картинки. @@ -188,7 +180,7 @@ ID игры Пропуск FMV Пропускать Full Motion Video. Настройки читов -Включить PS2RD Cheat Engine +PS2RD Cheat Engine PS2RD Cheat Engine пропатчит Вашу игру. Режим PS2RD Cheat Engine Автовыбор или выберите чит для игры. @@ -213,7 +205,7 @@ PS2RD Cheat Engine пропатчит Вашу игру. Отображается при совпадении регионов диска и консоли. Настроить PADEMU Настройки Pad-эмулятора -Использовать Pad-эмулятор +Pad Emulator При включении будет задействован Pad-эмулятор. Режим Pad-эмулятора Выбрать режим Pad-эмулятора. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Настройки для порта: Выбрать настройки для порта Pad-эмулятора. -Включить эмуляцию +Emulation Вкл/выкл Pad-эмулятор для выбранного порта. -Включить вибрацию +Vibration Вкл/выкл вибрацию в выбранном порте Pad-эмулятора. MAC-адрес USB Bluetooth-адаптера: Контроллер привязан к MAC-адресу: @@ -241,12 +233,12 @@ ID производителя: Нет Bluetooth-адаптер совместим с контроллерами DS3/DS4. Bluetooth-адаптер может плохо работать с контроллерами DS3/DS4. -Эмуляция Multitap +Multitap Emulation Вкл/выкл эмуляцию Multitap. Порт эмулятора Multitap: Выбрать порт для эмуляции Multitap. -Не исправлять поддельные DS3 -Некоторым псевдо-DS3 нужно исправление, тут можно отключить его. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Эмуляция полукадра (FIELD) Исправление для игр, имеющих проблемы с прогрессивным режимом. Родительский контроль @@ -259,14 +251,17 @@ Bluetooth-адаптер может плохо работать с контро Ошибка - этот пароль не может быть установлен. Файл VMC %s фрагментирован. Продолжить с картой памяти в слоте %d? Настройки звука -Звуковые эффекты -Звук загрузки +Sound Effects +Boot Sound Громкость звуковых эффектов Громкость звука загрузки Изменить режим видео? Кэширование списка игр (HDD) -Показывать уведомления -%s загружено из %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Опции Настройки игры сохранены. %s настройки удалены. @@ -282,9 +277,10 @@ Bluetooth-адаптер может плохо работать с контро Выпуск Разработчик Описание -Игры BDM -Выбор BDM-устройств +Block Devices Настройки контроллера +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). Игры PS1 Режим показа игр PS1 POPSTARTER.ELF не найден в '%s'! diff --git a/lng/lang_SChinese_r2055.lng b/lng/lang_SChinese_r2114.lng similarity index 88% rename from lng/lang_SChinese_r2055.lng rename to lng/lang_SChinese_r2114.lng index 39166c493..3d36233f8 100644 --- a/lng/lang_SChinese_r2055.lng +++ b/lng/lang_SChinese_r2114.lng @@ -1,9 +1,8 @@ # Translated by kane159 and eyu2007 -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese -OPL %s 保存设置 返回 网络设置 @@ -14,7 +13,7 @@ OPL %s 离开 设置 选单 -USB 游戏 +BDM 游戏 HDD 游戏 ETH 游戏 应用程序 @@ -44,7 +43,6 @@ X 游戏列表 游戏设置 删除设置 -删除游戏所有的设置 Scrolling Speed 较慢 中等 @@ -55,16 +53,16 @@ Scrolling Speed 读取 游戏 ID 时出错 自动排序 加载语言文件时出错 -禁用调试跳色 +Debug Colors 未检测到控制器, 等待中... -显示游戏封面 +Cover Art 宽屏幕 关机 设置读取中 设置储存中 启动设备 重新整理 -BDM 设备启动模式 +BDM Start Mode HDD 设备启动模式 ETH 设备启动模式 应用程序启动模式 @@ -78,7 +76,6 @@ NBD 服务未能读取... IGR 位置 背景颜色 文字颜色 -- PS2 - - SMB 服务器 - IP 地址模式 静态 @@ -102,7 +99,7 @@ NetBIOS 删除 运行 显示设置 -启用删除与重新命名功能 +Write Operations 记住最后运行游戏 选定键 错误, 游戏有碎片 @@ -115,8 +112,6 @@ GUEST验证留空. 跳过 videos 模拟 DVD-DL 禁用 IGR -空闲 -空闲 改变大小将会重新格式化 VMC 生成 开始 @@ -166,8 +161,6 @@ DMA 模式 模式 4 模式 5 模式 6 -模式 7 -模式 8 配置 GSM 以太网链接模式 100Mbit 全双工 @@ -175,9 +168,8 @@ DMA 模式 10Mbit 全双工 10Mbit 半双工 GSM 设置 -启用 GSM +GSM Selector 切换 GSM 开或关 -画面模式 强制自定义显示模式 水平调整 调整水平方向的显示位置 @@ -188,7 +180,7 @@ GSM 设置 跳过 FMV 跳过全动态视频 金手指设置 -启用PS2RD +PS2RD Cheat Engine 允许对选定游戏使用PS2RD金手指 PS2RD 金手指模式 自动或手动选择 @@ -213,7 +205,7 @@ PS2 标志 Displayed for a valid disc logo matching the console's region. 配置PADEMU PADEMU设置 -开启PADEMU +Pad Emulator 为选定游戏开启/关闭PADEMU调节. 连接模式 选择PADEMU连接模式. @@ -221,9 +213,9 @@ PADEMU设置 蓝牙连接 设置端口: 选择应用PADEMU端口 -开启模拟 +Emulation 打开/关闭选定端口的模拟 -开启振动 +Vibration 打开/关闭选定端口的振动. 蓝牙适配器MAC地址: D S 手 柄MAC地址: @@ -241,12 +233,12 @@ LMP版本: 否 蓝牙适配器完全兼容DS3/DS4手柄 蓝牙适配器与DS3/DS4手柄不匹配 -开启分插模拟 +Multitap Emulation 打开/关闭分插模拟. 模拟分插端口 选择模拟的分插端口 -禁用仿制DS3手柄 -这个选项将使仿制DS3手柄无法工作 +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. 模拟播片扫描方式切换 修正逐行模式下视频播放有问题的游戏. 家长锁设置 @@ -259,14 +251,17 @@ LMP版本: 错误-无法使用此密码. vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 音频设置 -启用声音效果 -启用启动声音 +Sound Effects +Boot Sound 音效音量 启动音量 确认视频模式更改? 缓存游戏列表 (硬盘) -启用通知 -%s 从 %s加载 +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options 游戏设置已保存。 %s设置已删除。 @@ -282,9 +277,10 @@ Genre Release Developer Description -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Spanish_r2055.lng b/lng/lang_Spanish_r2114.lng similarity index 89% rename from lng/lang_Spanish_r2055.lng rename to lng/lang_Spanish_r2114.lng index edc4c917b..d2cc30876 100644 --- a/lng/lang_Spanish_r2055.lng +++ b/lng/lang_Spanish_r2114.lng @@ -1,9 +1,8 @@ # Translation by lauchon22 and destro -# Last update: August 07, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish -OPL %s Guardar cambios Atrás Configuración de red @@ -14,7 +13,7 @@ Configuración guardada en %s Salir Configuración Menú -Juegos por USB +Juegos por BDM Juegos por Disco duro Juegos por Red Aplicaciones @@ -44,7 +43,6 @@ Equis Lista de juegos Ajustes Eliminar configuración -Ajustes del juego borrados Velocidad de Desplazamiento Lento Medio @@ -55,16 +53,16 @@ Espera por favor Error al cargar el código ID del juego Listas ordenadas por alfabeto Error al cargar el archivo de idioma -No mostrar los colores para depuración +Debug Colors Mando no encontrado, esperando... -Carátulas, serigrafías y fondos +Cover Art Pantalla panorámica interfaz Apagar PS2 Cargando configuración... Guardando configuración... Iniciar dispositivo Refrescar -Modo de inicio del dispositivo BDM +BDM Start Mode Modo de inicio para Disco duro Modo de inicio para Red Modo inicio de menú de Aplicaciones @@ -78,7 +76,6 @@ Cerrando servidor NBDDump... Ruta del IGR Color de fondo Color de texto -- PS2 - - Servidor SMB - Tipo de dirección IP Estática @@ -102,7 +99,7 @@ Renombrar Borrar Iniciar Configuraciones de pantalla -Mostrar operaciones de escritura +Write Operations Recordar último juego en uso Botón de selección Error, el juego está fragmentado @@ -115,8 +112,6 @@ Desvincula el sistema Apagar videos Emula DVD-DL Quita el IGR -Sin uso -Sin uso Cambiar el tamaño formateará la VMC Crear Iniciar @@ -166,8 +161,6 @@ Modo 3 Modo 4 Modo 5 Modo 6 -Modo 7 -Modo 8 Configuración GSM Configuración de velocidad ethernet y duplex 100Mbit Full-duplex @@ -175,9 +168,8 @@ Configuración de velocidad ethernet y duplex 10Mbit Full-duplex 10Mbit Half-duplex Opciones GSM -Activar GSM +GSM Selector Activar o desactivar GSM -VMODO Forzar modo de vídeo seleccionado con GSM Ajuste horizontal Configura la posición horizontal de la pantalla @@ -188,7 +180,7 @@ Ajustes de Overscan Omitir vídeos FMV Omite escenas Full Motion Vídeos Configuración PS2RD -Activar PS2RD +PS2RD Cheat Engine Permitir que PS2RD parchee los juegos Modo PS2RD Auto-seleccionar o seleccionar códigos de juegos @@ -213,7 +205,7 @@ PS2 Logo Muestra un logotipo de disco válido que coincida con la región de la consola. Configurar PADEMU Configurar el mando del emulador -Habilitar PadEmulator +Pad Emulator Activar/apagar el mando del emulador para el juego elegido Modo del mando del emulador Seleccione el modo del mando del emulador @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Configuración del puerto Seleccione el mando del emulador para ajustes -Activar emulación +Emulation Activar/apagar el mando del emulador en el puerto elegido -Activar vibración +Vibration Activar/apagar vibracion en el puerto elegido Dirección MAC del mando BlueTooth USB: Controlador DS emparejado a la dirección MAC: @@ -241,12 +233,12 @@ Sí No El adaptador Bluetooth debe ser totalmente compatible con los controladores DS3 / DS4. Es posible que el adaptador Bluetooth no funcione correctamente con los controladores DS3 / DS4. -Habilitar la emulación del multitap +Multitap Emulation Enciende/apaga la emulación del multitap para el juego seleccionado. Emulador multitap en el puerto Seleccione el puerto para la emulación multitap. -Deshabilitar la solución provisional para DS3 falso -Algunos DS3 falsos necesitan solución, esta opción lo deshabilitará. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emular Inversión de campo Solución para juegos que fallan con el modo de escaneo progresivo... Definiciones de control parental @@ -259,14 +251,17 @@ Opciones de compilación: Error - No se puede usar este password. El archivo VMC %s está fragmentado. Continuar con Memory Card en slot %d? Configuraciones de audio -Habilitar efectos de sonido -Habilitar sonido de inicio +Sound Effects +Boot Sound Volumen de efectos de sonido Volumen de sonido de inicio Confirma cambiar modo de video? Cachè de lista de juegos (HDD) -Activar notificaciones -%s cargado desde %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Opciones Configuración de juego guardada %s configuraciones eliminadas. @@ -282,9 +277,10 @@ Género Lanzamiento Desarrollador Descripción -Juegos BDM -Seleccionar Dispositivos de Entrada +Block Devices Ajustes de Mando +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish_r2055.lng b/lng/lang_Swedish_r2114.lng similarity index 88% rename from lng/lang_Swedish_r2055.lng rename to lng/lang_Swedish_r2114.lng index 117b419ab..fe0b67cb5 100644 --- a/lng/lang_Swedish_r2055.lng +++ b/lng/lang_Swedish_r2114.lng @@ -1,9 +1,8 @@ # Translation by Lord_Flaya -# Last update: August 07, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish -OPL %s Spara ändringar Tillbaka Nätverksinställningar @@ -14,7 +13,7 @@ Fel vid skrivning av inställningar! Avsluta Inställning Meny -USB Spel +BDM Spel HDD Spel ETH Spel Appar @@ -44,7 +43,6 @@ Kryss Spel-lista Spelinst. Ta bort inställningar -Tog bort alla nycklar för spelet Scrollhastighet Sakta Medel @@ -55,16 +53,16 @@ Vänta Fel vid laddning av Game ID Automatisk sortering Fel vid inläsning av språkfilen -Inaktivera Debug Färger +Debug Colors Ingen kontroll upptäcks , vänta ... -Aktivera Omslag +Cover Art Bredbild Stäng av Ladda config Spara config Starta enheten Uppdatera -BDM enhets startläge +BDM Start Mode HDD enhet startläge ETH enhet startläge APP-meny visningsläge @@ -78,7 +76,6 @@ NBD Server Stängs... Utgång till Bakgrundsfärg Textfärg -- PS2 - - SMB Server - IP Address typ Statisk @@ -102,7 +99,7 @@ Byt namn Radera Kör Skärminställningar -Aktivera skrivåtkomst +Write Operations Kom ihåg senast spelade spel Välj knapp Fel, spelet är fragmenterat @@ -115,8 +112,6 @@ Släpp Syscalls Skippa Videos Emulera DVD-DL Inaktivera IGR -Används ej -Används ej Ändra storleken kommer att formatera om VMC Skapa Start @@ -166,8 +161,6 @@ Läge 3 Läge 4 Läge 5 Läge 6 -Läge 7 -Läge 8 Konfigurera GSM Ethernet hastighet och duplex 100Mbit Full-duplex @@ -175,9 +168,8 @@ Ethernet hastighet och duplex 10Mbit Full-duplex 10Mbit halv duplex GSM inställningar -Aktivera GSM +GSM Selector GSM PÅ eller AV -Vidoeläge Videoläge tvingas Horisontell position Ställer Horisontell offset @@ -188,7 +180,7 @@ Ställer Vertikal förskjutning Skippa FMV Skippar Full Motion Video Inställningar Fusk -Aktivera PS2RD Fusk Motor +PS2RD Cheat Engine Tillåter PS2RD patcha dina spel PS2RD Fusk Motor Läge Autovälj eller Välj spel fusk @@ -213,7 +205,7 @@ PS2 Logo Visas för giltig disklogo matchande konsolens region. Konfigurera PADEMU Pad Emulator Inställningar -Aktivera PadEmulator +Pad Emulator Slå av/på PadEmulator för valt spel. Pad Emulator läge Vlj Pad Emulator läge. @@ -221,9 +213,9 @@ DualShock3 / 4 USB DualShock3 / 4 BT Inställningar för port: Välj Pad Emulator port för inställningar. -Aktivera emulation +Emulation Slå av/på Pad Emulator för vald port. -Aktivera vibration +Vibration Slå av/på vibration för Pad Emulator vald port. Usb bluetooth adapter mac address: DS Controller kopplad till MAC-adress: @@ -241,12 +233,12 @@ Ja Nej Bluetooth-adaptern ska vara fullt kompatibel med DS3 / DS4-kontroller. Bluetooth-adaptern kanske inte fungerar korrekt med DS3 / DS4-kontroller. -Aktivera multitapemulering +Multitap Emulation Slår på / av multitap emulering för valt spel. Multitap emulator på porten Välj port för multitap emulering. -Inaktivera lösningen för falska DS3 -Några falska ds3s behöver lösningen, det här alternativet kommer att inaktivera det. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emulera FIELD vändning Fix för spel med problem i progressivt läge. Föräldrakontroll @@ -259,14 +251,17 @@ Bygg-Alternativ: Fel - lösenordet kan ej användas. VMC %s filen är fragmenterad. Använd minneskort i port %d? Ljudinställningar -Aktivera Ljudeffekter -Aktivera Uppstartsljud +Sound Effects +Boot Sound Ljudeffektsvolym Uppstartsljudsvolym Bekräfta ändring av videoläge? Lägg Spellista i Cache (HDD) -Aktivera notifikationer -%s Laddat från %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Val Spelinställningar sparade. %s inställningar borttagna @@ -282,9 +277,10 @@ Genre Lansering Utvecklare Beskrivning -BDM Spel -Välj enhet +Block Devices Kontroll-inställningar +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_TChinese_r2055.lng b/lng/lang_TChinese_r2114.lng similarity index 88% rename from lng/lang_TChinese_r2055.lng rename to lng/lang_TChinese_r2114.lng index 7440d173d..93737162a 100644 --- a/lng/lang_TChinese_r2055.lng +++ b/lng/lang_TChinese_r2114.lng @@ -1,9 +1,8 @@ # Translated by kane159 and eyu2007 -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese -OPL %s 保存設置 返回 網絡設置 @@ -14,7 +13,7 @@ OPL %s 離開 設置 選單 -USB 遊戲 +BDM 遊戲 HDD 遊戲 ETH 遊戲 應用程序 @@ -44,7 +43,6 @@ X 遊戲列表 遊戲設置 刪除設置 -刪除遊戲所有的設置 Scrolling Speed 較慢 中等 @@ -55,16 +53,16 @@ Scrolling Speed 讀取 遊戲 ID 時出錯 自動排序 載入語言文件時出錯 -禁用調試跳色 +Debug Colors 未檢測到控制器, 等待中... -顯示遊戲封面 +Cover Art 寬屏幕 關機 設置讀取中 設置儲存中 啟動設備 重新整理 -BDM 設備啟動模式 +BDM Start Mode HDD 設備啟動模式 ETH 設備啟動模式 應用程序啟動模式 @@ -78,7 +76,6 @@ NBD 服務未能讀取... IGR 位置 背景顏色 文字顏色 -- PS2 - - SMB 伺服器 - IP 地址模式 靜態 @@ -102,7 +99,7 @@ NetBIOS 刪除 運行 顯示設置 -啟用刪除與重新命名功能 +Write Operations 記住最後運行遊戲 選定鍵 錯誤, 遊戲有碎片 @@ -115,8 +112,6 @@ GUEST驗證留空. 跳過 videos 模擬 DVD-DL 禁用 IGR -空閑 -空閑 改變大小將會重新格式化 VMC 生成 開始 @@ -166,8 +161,6 @@ DMA 模式 模式 4 模式 5 模式 6 -模式 7 -模式 8 配置 GSM 乙太網鏈接模式 100Mbit 全雙工 @@ -175,9 +168,8 @@ DMA 模式 10Mbit 全雙工 10Mbit 半雙工 GSM 設置 -啟用 GSM +GSM Selector 切換 GSM 開或關 -畫面模式 強制自定義顯示模式 水平調整 調整水平方向的顯示位置 @@ -188,7 +180,7 @@ GSM 設置 跳過 FMV 跳過全動態視頻 金手指設置 -啟用PS2RD +PS2RD Cheat Engine 允許對選定遊戲使用PS2RD金手指 PS2RD 金手指模式 自動或手動選擇 @@ -213,7 +205,7 @@ PS2 標誌 Displayed for a valid disc logo matching the console's region. 配置PADEMU PADEMU設置 -開啟PADEMU +Pad Emulator 為選定遊戲開啟/關閉PADEMU調節. 連接模式 選擇PADEMU連接模式. @@ -221,9 +213,9 @@ PADEMU設置 藍牙連接 設置埠: 選擇應用PADEMU埠 -開啟模擬 +Emulation 打開/關閉選定埠的模擬 -開啟振動 +Vibration 打開/關閉選定埠的振動. 藍牙適配器MAC地址: D S 手 柄MAC地址: @@ -241,12 +233,12 @@ LMP版本: 否 藍牙適配器完全兼容DS3/DS4手柄 藍牙適配器與DS3/DS4手柄不匹配 -開啟分插模擬 +Multitap Emulation 打開/關閉分插模擬. 模擬分插埠 選擇模擬的分插埠 -禁用仿製DS3手柄 -這個選項將使仿製DS3手柄無法工作 +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. 模擬播片掃描方式切換 修正逐行模式下視頻播放有問題的遊戲. 家長鎖設置 @@ -259,14 +251,17 @@ LMP版本: 錯誤-無法使用此密碼. vmc %s 文件碎片化.是否繼續使用插槽 %d 中的記憶卡? 音頻設置 -啟用聲音效果 -啟用啟動聲音 +Sound Effects +Boot Sound 音效音量 啟動音量 確認視頻模式更改? 緩存遊戲列表 (硬碟) -啟用通知 -%s 從 %s 載入 +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options 遊戲設置已保存。 %s 設置已刪除。 @@ -282,9 +277,10 @@ Genre Release Developer Description -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! diff --git a/lng/lang_Turkish_r2055.lng b/lng/lang_Turkish_r2114.lng similarity index 88% rename from lng/lang_Turkish_r2055.lng rename to lng/lang_Turkish_r2114.lng index c19bdd81b..29a708e0e 100644 --- a/lng/lang_Turkish_r2055.lng +++ b/lng/lang_Turkish_r2114.lng @@ -1,9 +1,8 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish -OPL %s Değişiklikleri kaydet Geri Ağ ayarları @@ -14,7 +13,7 @@ Ayarlar yazılırken hata oluştu! Çıkış Ayarlar Menü -USB Oyunları +BDM Oyunları HDD Oyunları AĞ Oyunları Uygulamalar @@ -44,7 +43,6 @@ Daire Oyun listesi Oyun ayarları Ayarları sil -Oyunun tüm anahtarları kaldırıldı Scrolling Speed Yavaş Orta @@ -55,16 +53,16 @@ Lütfen bekleyiniz Oyun kimliği yüklenirken hata oluştu Otomatik sıralama Dil dosyası yüklenirken hata oluştu -Hata ayıklama renklerini iptal et +Debug Colors Oyun kolu algılanmadı, bekliyor... -Kapak Resimlerini etkinleştir +Cover Art Geniş ekran Gücü kapat Ayarlar yükleniyor Ayarlar kayıt ediliyor Cihazı başlat Yenile -BDM cihazı başlangıç türü +BDM Start Mode HDD cihazı başlangıç türü AĞ cihazı başlangıç türü Uygulamalar menüsü görünüm kipi @@ -78,7 +76,6 @@ NBD Sunucu Durduruluyor... IGR yeri Arkaplan rengi Metin rengi -- PS2 - - SMB Sunucusu - IP adres türü Sabit @@ -102,7 +99,7 @@ Y.Adlandır Sil Çalıştır Görüntü ayarları -Yazma işlemlerini aktif et +Write Operations Enson oynanan oyunu hatırla Seçme tuşu Hata, oyun dosyası parçalı @@ -115,8 +112,6 @@ Sistem çağrılarını çöz Videoları atla DVD-DL i etkinleştir IGR i etkisizleştir -Kullanılmıyor -Kullanılmıyor VMC Boyutu değiştirmek VMC nin biçimlendirilmesine neden olur Oluştur Başlat @@ -166,8 +161,6 @@ Kip 3 Kip 4 Kip 5 Kip 6 -Kip 7 -Kip 8 GSM ayarları Ağ Bağlantı kipi 100Mbit Full-duplex @@ -175,9 +168,8 @@ Ağ Bağlantı kipi 10Mbit Full-duplex 10Mbit Half-duplex GSM Ayarları -GSM Aktif +GSM Selector GSM'i Açar ve Kapatır -VMODE Zorlanmış özel görüntüleme kipi Y-Konum Yatay Ayarlama @@ -188,7 +180,7 @@ Overscan Ayarı FMV Atlama Full Motion Videoları atlar Hile Ayarları -PS2RD Cheat Engine'i Aktif et +PS2RD Cheat Engine PS2RD Cheat Engine'in oyunlara yama yapmasına izin ver PS2RD Cheat Engine Kipi Hileleri Otomatik veya Manuel seçer @@ -213,7 +205,7 @@ PS2 Logosu Sadece konsolun bölgesine uyan, kabul edilebilir logolar gösterilir. PADEMU'yu ayarla Pad Emulator Ayarları -PadEmulator Aktif Et +Pad Emulator Seçilen oyun için PADEMU'nun durumu Pad Emulator modu Pad Emulator modunu seçin. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Port için ayarlar. Ayarlanacak Pad Emulator portunu seçin -Emulasyonu aç +Emulation Seçilen port için Pad Emulator durumu -Titreşimi aç +Vibration Seçilen port için Pad Emulator titreşimi durumu USB Bluetooth adaptörü MAC adresi: MAC adresi ile eşleşmiş DS kolu: @@ -241,12 +233,12 @@ Evet Hayır Bluetooth adaptörü DS3/DS4 kolları ile büyük ihtimalle tam uyumlu. Bluetooth adaptörü DS3/DS4 kolları ile tam doğru çalışmayabilir. -Multitap emulasyonunu aç +Multitap Emulation Seçilen oyun için Multitap emulasyonu durumu Multitap emulasyonu portu Multitap emulasyonu için port seçin -Sahte DS3ler için workaround'u kapat -Bazı sahte DS3ler ile çalışabilmek için gereken workaround'u kapatır. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. FIELD flipping emüle et Progressive video modları ile bozulan oyunlar için çözüm yaması. Ebeveyn Kilidi Ayarları @@ -259,14 +251,17 @@ Build Ayarları: Hata - bu parola kullanılamaz. VMC %sdosyası fragment olmuş, fiziksel HK ile devam edilsin mi (slot %d)? Ses Ayarları -Ses Efektleri Olsun -Açılış Sesi Olsun +Sound Effects +Boot Sound Ses Efektleri Kuvveti Açılış Sesi Kuvveti Video çıkış modu değiştirilsin mi? Oyun listesini cachele (HDD) -Bildirimleri aktifleştir -%s yüklendi %s konumundan +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Oyun ayarları kaydedildi. %s ayarları silindi. @@ -282,9 +277,10 @@ Tür Çıkış Geliştirici Açıklama -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. diff --git a/lng/lang_Vietnamese_r2055.lng b/lng/lang_Vietnamese_r2114.lng similarity index 90% rename from lng/lang_Vietnamese_r2055.lng rename to lng/lang_Vietnamese_r2114.lng index 0d06613dc..b945fbdae 100644 --- a/lng/lang_Vietnamese_r2055.lng +++ b/lng/lang_Vietnamese_r2114.lng @@ -1,9 +1,8 @@ # Translation by zidane89 -# Last update: August 06, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2055-2c84440-2021-08-06 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1728-3c146fb-2021-08-06 +# Last update: August 29, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese -OPL %s Lưu thay đổi Quay lại Network Settings @@ -14,7 +13,7 @@ Không lưu được cài đặt! Thoát Cài đặt Menu -Trò chơi trên USB +Trò chơi trên BDM Trò chơi trên HDD Trò chơi qua ETH Ứng dụng @@ -44,7 +43,6 @@ Nút X Danh sách trò chơi Cài đặt Game Remove Settings -Removed all keys for the game Scrolling Speed Chậm Thường @@ -55,16 +53,16 @@ Vui lòng chờ Lỗi khi nạp Game ID Tự động phân loại Lỗi nạp tập tin ngôn ngữ -Ngắt màu Debug +Debug Colors Không có cần điều khiển, đợi chút... -Bật Cover Art +Cover Art Màn hình rộng Tắt máy Nạp cấu hình Lưu cấu hình Chọn thiết bị lưu trò chơi Làm mới -Chọn BDM +BDM Start Mode Chọn HDD Chọn ETH Hiển thị menu ứng dụng @@ -78,7 +76,6 @@ Không nạp được máy chủ NBD... Vá IGR Màu nền Màu chữ -- PS2 - - SMB Server - Gõ địa chỉ IP Tĩnh @@ -102,7 +99,7 @@ Mục này sẽ bị xóa vĩnh viễn, tiếp tục? Xóa Chạy Cài đặt hiển thị -Kích hoạt thao tác ghi +Write Operations Nhớ các cài đặt cuối cùng Chọn nút Lỗi, trò chơi bị phân mảnh @@ -115,8 +112,6 @@ Unhook Syscalls Bỏ qua các Video Giả lập DVD-DL Ngắt IGR -Không dùng -Không dùng Thay đổi dung lượng sẽ định dạng lại VMC Tạo Bắt đầu @@ -166,8 +161,6 @@ Mode 3 Mode 4 Mode 5 Mode 6 -Mode 7 -Mode 8 Cấu hình GSM Ethernet Link Mode 100Mbit Full-duplex @@ -175,9 +168,8 @@ Ethernet Link Mode 10Mbit Full-duplex 10Mbit Half-duplex Cài đặt GSM -Bật GSM +GSM Selector Bật hoặc tắt GSM -VMODE Chế độ hiển thị tùy chỉnh bắt buộc H-POS Điều chỉnh theo chiều ngang @@ -188,7 +180,7 @@ Overscan Adjustment Bỏ qua FMV Bỏ qua Full Motion Videos Cài đặt Cheat -Bật PS2RD Cheat Engine +PS2RD Cheat Engine Hãy để PS2RD Cheat Engine vá vào trò chơi Chế độ PS2RD Cheat Engine Tự động chọn hoặc chọn trò chơi ăn gian @@ -213,7 +205,7 @@ Logo PS2 Displayed for a valid disc logo matching the console's region. Cấu hình PADEMU Cài đặt giả lập tay cầm -Bật PadEmulator +Pad Emulator Bật/tắt PadEmulator cho trò chơi đã chọn. Chế độ Pad Emulator Chọn chế độ Pad Emulator. @@ -221,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Cài đặt cổng: Chọn cổng cài đặt Pad Emulator. -Bật giả lập +Emulation Bật/tắt Pad Emulator cổng đã chọn. -Bật rung +Vibration Bật/tắt rung Pad Emulator cho cổng đã chọn. Địa chỉ MAC của USB Bluetooth: Địa chỉ MAC của tay DS: @@ -241,12 +233,12 @@ Yes No Bluetooth adapter phải tương thích với tay cầm DS3/DS4. Bluetooth adapter có thể không hoạt động chính xác với tay cầm DS3/DS4. -Bật giả lập Multitap +Multitap Emulation Bật/tắt giả lập Multitap cho trò chơi đã chọn. Giả lập Multitap tại cổng Chọn cổng giả lập Multitap. -Ngắt workaround để fake DS3 -Fake ds3s cần workaround, Tùy chọn này sẽ ngắt nó. +Fake DS3 Workaround +Some fake DS3s need a workaround, this option will enable it. Emulate FIELD flipping Khắc phục các game bị trục trặc trong chế độ progressive modes. Cài đặt khóa phụ huynh @@ -259,14 +251,17 @@ Tùy chọn Build: Lỗi - mật khẩu này không thể sử dụng. Tệp VMC %s bị phân mảnh. Tiếp tục với MC ở khe %d? Cài đặt âm thanh -Bật hiệu ứng âm thanh -Tăng cường âm lượng +Sound Effects +Boot Sound Mức hiệu ứng âm thanh Tăng mức âm lượng Thay đổi chế độ video? Cache danh sách trò chơi (HDD) -Enable Notifications -%s loaded from %s +Notifications +Config loaded from %s +Theme loaded from %s +Language loaded from %s +%s partition mounted. Options Game settings saved. %s settings removed. @@ -282,9 +277,10 @@ Genre Release Developer Description -BDM Games -Select Block Devices +Block Devices Controller Settings +Turn on/off Block Device Manager. +Turn on/off Block Devices (e.g. USB). Các trò chơi PS1 Chế độ hiển thị cho game PS1 POPSTARTER.ELF không có ở '%s'! From 6ef9759084f681cdf35e40921072263d261163ac Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 31 Aug 2021 03:46:59 -0700 Subject: [PATCH 245/269] update lang files --- lng/lang_Portuguese_BR_r2114.lng | 130 +++++++++++++++---------------- lng/lang_Spanish_r2114.lng | 46 +++++------ 2 files changed, 88 insertions(+), 88 deletions(-) diff --git a/lng/lang_Portuguese_BR_r2114.lng b/lng/lang_Portuguese_BR_r2114.lng index 4d9e3d258..59e90b06b 100644 --- a/lng/lang_Portuguese_BR_r2114.lng +++ b/lng/lang_Portuguese_BR_r2114.lng @@ -1,5 +1,5 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: August 29, 2021 +# Last update: August 30, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese @@ -20,7 +20,7 @@ Aplicativos Tema Idioma O sistema será desligado. -Sair para o navegador? +Sair para o Navegador? Cancelar atualização? Erro %d: Nenhum HD detectado. Erro %d: O HD não está formatado. @@ -49,30 +49,30 @@ Média Rápida Menu padrão Iniciar a partir do disco -Espere por favor -Erro ao carregar ID do jogo +Espere por favor. +Erro ao carregar ID do jogo. Ordenação automática -Erro ao carregar arquivo de idioma -Debug Colors -Controle não detectado, esperando... -Cover Art +Erro ao carregar arquivo de idioma. +Depuração de cores +Controle não detectado, esperando… +Artes Wide screen (Visão panorâmica) Desligar -Carregando configurações... -Salvando configurações... -Iniciar dispositivo +Carregando configurações… +Salvando configurações… +Iniciar dispositivo. Atualizar -BDM Start Mode +Modo de início BDM Modo de início do dispositivo HDD Modo de início do dispositivo REDE Modo de início dos Aplicativos Automático Manual Iniciar servidor NBD -Iniciando Servidor NBD... -Servidor NBD conectado... +Iniciando Servidor NBD… +Servidor NBD conectado… Falha na inicialização do Servidor NBD. -Fechando servidor NBD... +Fechando servidor NBD… Sair para Cor do fundo Cor do texto @@ -99,13 +99,13 @@ Renomear Excluir Iniciar Definições de tela -Write Operations +Ações de gravação Lembrar último jogo executado Escolha o botão de ação ( X ou O ) Erro, o jogo está fragmentado! -Erro, não foi possível iniciar o item -Testar Alterações -Deixar vazio para identificação como convidado (GUEST) +Erro, não foi possível iniciar o item. +Testar alterações +Deixar vazio para identificação como convidado. Simular precisão de leitura CD/DVD Modo síncrono Desativar chamadas do sistema @@ -124,27 +124,27 @@ Nome Tamanho Estado Progresso -Arquivo VMC já existe -Arquivo VMC inválido, o tamanho está incorreto +Arquivo VMC já existe. +Arquivo VMC inválido, o tamanho está incorreto. Arquivo VMC precisa ser criado! Erro ao acessar o VMC %s. Continuar com MC na entrada %d? Atualização automática -Informações do programa +Informações Desenvolvedores Controle de qualidade Prefixar uma pasta no BDM -Inicia um ELF personalizado após o IGR -Valor em minuto(s), 0(zero) desabilita o spin down +Inicia um ELF personalizado após o IGR. +Valor em minuto(s), 0(zero) desabilita o spin down. Desligamento automático do HDD (spin down) Modo de vídeo Cor do diálogo Cor da seleção -Redefinir Cores +Redefinir cores Info Customizar ELF principal Seleção de cor Reconectar -Deixe vazio para listar compartilhamentos +Deixe vazio para listar compartilhamentos. Prefixar uma pasta na REDE Apagar Espaço @@ -163,34 +163,34 @@ Modo 5 Modo 6 Configurar GSM Conexão de rede -100Mbit Full-duplex -100Mbit Half-duplex -10Mbit Full-duplex -10Mbit Half-duplex +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex Configurações GSM -GSM Selector -Autoriza o GSM a forçar o modo de vídeo selecionado abaixo -Modo de vídeo a ser forçado +Seletor GSM +Autoriza o GSM a forçar o modo de vídeo selecionado abaixo. +Modo de vídeo a ser forçado. Ajuste Horizontal -Define o ajuste horizontal da imagem na tela +Define o ajuste horizontal da imagem na tela. Ajuste Vertical -Define o ajuste vertical da imagem na tela +Define o ajuste vertical da imagem na tela. Tela visível -Define o ajuste da tela visível +Define o ajuste da tela visível. Pular vídeos FMV -Ignora vídeos no formato (FMV) +Ignora vídeos no formato (FMV). Configurar PS2RD -PS2RD Cheat Engine -Autoriza o PS2RD a usar Cheats(Trapaças) nos seus jogos +PS2RD +Autoriza o PS2RD a usar Trapaças nos seus jogos. Modo PS2RD -Auto seleção(Ativa todos) ou Selecione os Cheats do jogo +Auto seleção(Ativa todos) ou Selecione os Cheats do jogo. Auto seleção Selecione os Cheats do jogo -Erro: Falha ao carregar o arquivo (Cheat) -Cheats não encontrados ou ilegíveis +Erro: Falha ao carregar o arquivo (Cheat). +Cheats não encontrados ou ilegíveis. Baixar arquivos(cfg) Atualizar arquivos(cfg) -Substituir os arquivos (cfg) existentes +Substituir os arquivos(cfg) existentes Atualização falhou. Falha na conexão com o servidor(cfg). Atualização concluída. @@ -198,14 +198,14 @@ Atualização cancelada. Baixar arquivos(cfg) do servidor? Configurações personalizadas Arquivos(cfg) baixados -Auto iniciar em %i segundos +Auto iniciar em %i s… Auto iniciar -Valor em segundo(s), 0(zero) desabilita o auto iniciar +Valor em segundo(s), 0(zero) desabilita o auto iniciar. Logo PS2 Exibido para um logotipo de disco válido que corresponde à região do console. Configurar PADEMU Configurações do Emulador de Controles -Pad Emulator +Emulador de Controles Liga/desliga o Emulador de Controles para o jogo selecionado. Modo Emulador de Controles Selecione o modo do Emulador de Controles. @@ -213,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Configurações da porta: Selecione a porta que será configurada. -Emulation +Emulação Liga/desliga a emulação na porta selecionada. -Vibration +Vibração Liga/desliga a vibração na porta selecionada. Endereço MAC do adaptador Bluetooth USB: Endereço MAC do Controle DS emparelhado: @@ -224,7 +224,7 @@ Emparelhar Controle DS: Emparelha o Controle DS com o MAC do adaptador Bluetooth. Não conectado Informações do adaptador Bluetooth -Mostra mais informações e recursos suportados +Mostra mais informações e recursos suportados. Versão HCI: Versão LMP: ID do fabricante: @@ -233,12 +233,12 @@ Sim Não O adaptador Bluetooth deve ser totalmente compatível com os controles DS3/4. O adaptador Bluetooth pode não funcionar corretamente com os controles DS3/4. -Multitap Emulation +Emulação Multitap Liga/desliga a emulação Multitap para o jogo selecionado. -Emulador Multitap na porta +Emulador Multitap na porta: Selecione a porta para a emulação Multitap. -Fake DS3 Workaround -Some fake DS3s need a workaround, this option will enable it. +Solução alternativa para Controle DS3 pirata +Alguns Controles DS3 piratas precisam de solução alternativa, esta opção irá habilitá-la. Emular inversão de CAMPO Correção para jogos que apresentam falhas nos modos de vídeo progressivo. Controle parental @@ -251,17 +251,17 @@ Opções nesta compilação: Erro - esta senha não pode ser usada. O arquivo VMC %s está fragmentado. Continuar com o cartão de memória na entrada %d? Configurações de áudio -Sound Effects -Boot Sound -Volume de efeitos sonoros +Efeitos sonoros +Som de inicialização +Volume dos efeitos sonoros Volume do som de inicialização Confirmar alteração do modo de vídeo? Cache da lista de jogos (HD) -Notifications -Config loaded from %s -Theme loaded from %s -Language loaded from %s -%s partition mounted. +Notificações +Configuração carregada de %s +Tema carregado de %s +Idioma carregado de %s +Partição %s montada. Opções Configurações do jogo salvas. %s configurações removidas. @@ -277,10 +277,10 @@ Gênero Data de lançamento Desenvolvedor Descrição -Block Devices -Configurar controles -Turn on/off Block Device Manager. -Turn on/off Block Devices (e.g. USB). +Dispositivos de entrada +Configurações dos controles +Ligue/desligue o gerenciador de dispositivos de entrada. +Ligue/desligue dispositivos de entrada (ex: USB). Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Spanish_r2114.lng b/lng/lang_Spanish_r2114.lng index d2cc30876..cb9c367d4 100644 --- a/lng/lang_Spanish_r2114.lng +++ b/lng/lang_Spanish_r2114.lng @@ -1,5 +1,5 @@ # Translation by lauchon22 and destro -# Last update: August 29, 2021 +# Last update: August 30, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -53,16 +53,16 @@ Espera por favor Error al cargar el código ID del juego Listas ordenadas por alfabeto Error al cargar el archivo de idioma -Debug Colors +Colores de Depuración Mando no encontrado, esperando... -Cover Art +Arte de Portada Pantalla panorámica interfaz Apagar PS2 Cargando configuración... Guardando configuración... Iniciar dispositivo Refrescar -BDM Start Mode +Modo de Inicio BDM Modo de inicio para Disco duro Modo de inicio para Red Modo inicio de menú de Aplicaciones @@ -99,7 +99,7 @@ Renombrar Borrar Iniciar Configuraciones de pantalla -Write Operations +Operaciones de Escritura Recordar último juego en uso Botón de selección Error, el juego está fragmentado @@ -168,7 +168,7 @@ Configuración de velocidad ethernet y duplex 10Mbit Full-duplex 10Mbit Half-duplex Opciones GSM -GSM Selector +Selector GSM Activar o desactivar GSM Forzar modo de vídeo seleccionado con GSM Ajuste horizontal @@ -180,7 +180,7 @@ Ajustes de Overscan Omitir vídeos FMV Omite escenas Full Motion Vídeos Configuración PS2RD -PS2RD Cheat Engine +Motor de Trucos PS2RD Permitir que PS2RD parchee los juegos Modo PS2RD Auto-seleccionar o seleccionar códigos de juegos @@ -205,7 +205,7 @@ PS2 Logo Muestra un logotipo de disco válido que coincida con la región de la consola. Configurar PADEMU Configurar el mando del emulador -Pad Emulator +Emulador de Pad Activar/apagar el mando del emulador para el juego elegido Modo del mando del emulador Seleccione el modo del mando del emulador @@ -213,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Configuración del puerto Seleccione el mando del emulador para ajustes -Emulation +Emulación Activar/apagar el mando del emulador en el puerto elegido -Vibration +Vibración Activar/apagar vibracion en el puerto elegido Dirección MAC del mando BlueTooth USB: Controlador DS emparejado a la dirección MAC: @@ -233,12 +233,12 @@ Sí No El adaptador Bluetooth debe ser totalmente compatible con los controladores DS3 / DS4. Es posible que el adaptador Bluetooth no funcione correctamente con los controladores DS3 / DS4. -Multitap Emulation +Emulación Multitap Enciende/apaga la emulación del multitap para el juego seleccionado. Emulador multitap en el puerto Seleccione el puerto para la emulación multitap. -Fake DS3 Workaround -Some fake DS3s need a workaround, this option will enable it. +Solución DS3 Falsa +Algunos DS3 falsos necesitan una solución, esta opción la habilitará. Emular Inversión de campo Solución para juegos que fallan con el modo de escaneo progresivo... Definiciones de control parental @@ -251,17 +251,17 @@ Opciones de compilación: Error - No se puede usar este password. El archivo VMC %s está fragmentado. Continuar con Memory Card en slot %d? Configuraciones de audio -Sound Effects -Boot Sound +Efectos de Sonido +Sonido de Arranque Volumen de efectos de sonido Volumen de sonido de inicio Confirma cambiar modo de video? Cachè de lista de juegos (HDD) -Notifications -Config loaded from %s -Theme loaded from %s -Language loaded from %s -%s partition mounted. +Notificaciones +Config cargada desde %s +Tema cargado desde %s +Idioma cargado desde %s +%s partición montada. Opciones Configuración de juego guardada %s configuraciones eliminadas. @@ -277,10 +277,10 @@ Género Lanzamiento Desarrollador Descripción -Block Devices +Dispositivos de Entrada Ajustes de Mando -Turn on/off Block Device Manager. -Turn on/off Block Devices (e.g. USB). +Prender/Apagar Administrador de Dispositivo de Entrada. +Prender/Apagar Dispositivos de Entrada (p.e. USB). Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! From 81975676460a2f4ce9a3f47383af460219225d6e Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 1 Sep 2021 15:07:53 -0700 Subject: [PATCH 246/269] update lang files --- lng/lang_Albanian_r2114.lng | 2 +- lng/lang_Arabic_r2114.lng | 2 +- lng/lang_Bulgarian_r2114.lng | 2 +- lng/lang_Cebuano_r2114.lng | 2 +- lng/lang_Croatian_r2114.lng | 2 +- lng/lang_Czech_r2114.lng | 2 +- lng/lang_Danish_r2114.lng | 2 +- lng/lang_Dutch_r2114.lng | 2 +- lng/lang_Filipino_r2114.lng | 2 +- lng/lang_French_r2114.lng | 2 +- lng/lang_German_r2114.lng | 2 +- lng/lang_Greek_r2114.lng | 2 +- lng/lang_Hungarian_r2114.lng | 2 +- lng/lang_Indonesian_r2114.lng | 2 +- lng/lang_Italian_r2114.lng | 2 +- lng/lang_Japanese_r2114.lng | 2 +- lng/lang_Korean_r2114.lng | 2 +- lng/lang_Laotian_r2114.lng | 2 +- lng/lang_Persian_r2114.lng | 2 +- lng/lang_Polish_r2114.lng | 2 +- lng/lang_Portuguese_BR_r2114.lng | 2 +- lng/lang_Portuguese_r2114.lng | 2 +- lng/lang_Romanian_r2114.lng | 6 +++--- lng/lang_Russian_r2114.lng | 2 +- lng/lang_SChinese_r2114.lng | 2 +- lng/lang_Spanish_r2114.lng | 2 +- lng/lang_Swedish_r2114.lng | 2 +- lng/lang_TChinese_r2114.lng | 2 +- lng/lang_Turkish_r2114.lng | 2 +- lng/lang_Vietnamese_r2114.lng | 2 +- 30 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lng/lang_Albanian_r2114.lng b/lng/lang_Albanian_r2114.lng index 3e7c62944..ef5fc8e40 100644 --- a/lng/lang_Albanian_r2114.lng +++ b/lng/lang_Albanian_r2114.lng @@ -1,7 +1,7 @@ # Translation by LoniTheFricc # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Albanian Ruaj Ndryshimet Mbrapa diff --git a/lng/lang_Arabic_r2114.lng b/lng/lang_Arabic_r2114.lng index fa122e289..e8d59a96e 100644 --- a/lng/lang_Arabic_r2114.lng +++ b/lng/lang_Arabic_r2114.lng @@ -1,7 +1,7 @@ # translation by alimadhi # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic ﺕﺍﺮﻴﻴﻐﺘﻟﺍ ﻆﻔﺣ ﻒﻠﺧ diff --git a/lng/lang_Bulgarian_r2114.lng b/lng/lang_Bulgarian_r2114.lng index 5e5a31a7b..5f8920f90 100644 --- a/lng/lang_Bulgarian_r2114.lng +++ b/lng/lang_Bulgarian_r2114.lng @@ -1,7 +1,7 @@ # translation by vsub and wisi # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian Запазване на промените Назад diff --git a/lng/lang_Cebuano_r2114.lng b/lng/lang_Cebuano_r2114.lng index 3ed16b29b..555203e4e 100644 --- a/lng/lang_Cebuano_r2114.lng +++ b/lng/lang_Cebuano_r2114.lng @@ -1,7 +1,7 @@ # Translation by Colton Silva # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Cebuano Tipigi ang mga pagbag-o Likod diff --git a/lng/lang_Croatian_r2114.lng b/lng/lang_Croatian_r2114.lng index c276b3023..71c215608 100644 --- a/lng/lang_Croatian_r2114.lng +++ b/lng/lang_Croatian_r2114.lng @@ -1,7 +1,7 @@ # Translation by Blacky5678 # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Croatian Spremi Promjene Natrag diff --git a/lng/lang_Czech_r2114.lng b/lng/lang_Czech_r2114.lng index 67cae1252..136327582 100644 --- a/lng/lang_Czech_r2114.lng +++ b/lng/lang_Czech_r2114.lng @@ -1,7 +1,7 @@ # Translated by jimmysmith # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech Uložit změny Zpět diff --git a/lng/lang_Danish_r2114.lng b/lng/lang_Danish_r2114.lng index 6bf195d08..714da5836 100644 --- a/lng/lang_Danish_r2114.lng +++ b/lng/lang_Danish_r2114.lng @@ -1,7 +1,7 @@ # Translation by BongKris # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish Gem indstillinger Tilbage diff --git a/lng/lang_Dutch_r2114.lng b/lng/lang_Dutch_r2114.lng index e65bbec90..1666870aa 100644 --- a/lng/lang_Dutch_r2114.lng +++ b/lng/lang_Dutch_r2114.lng @@ -1,7 +1,7 @@ # Translation by PS2gaming @ ps2-home.com # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch Wijzigingen opslaan Terug diff --git a/lng/lang_Filipino_r2114.lng b/lng/lang_Filipino_r2114.lng index 5710ed89d..0035d4b63 100644 --- a/lng/lang_Filipino_r2114.lng +++ b/lng/lang_Filipino_r2114.lng @@ -1,7 +1,7 @@ # Translation by Ceed Lorenzo and Colton SIlva @ColtonSilvaonKnoxKontor # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino I-save ang mga pagbabago Likod diff --git a/lng/lang_French_r2114.lng b/lng/lang_French_r2114.lng index 120a121ce..c2f53093c 100644 --- a/lng/lang_French_r2114.lng +++ b/lng/lang_French_r2114.lng @@ -1,7 +1,7 @@ # Translation by machiavel and Squall # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French Sauvegarder Retour diff --git a/lng/lang_German_r2114.lng b/lng/lang_German_r2114.lng index 1817aab72..2f51f2d66 100644 --- a/lng/lang_German_r2114.lng +++ b/lng/lang_German_r2114.lng @@ -1,7 +1,7 @@ # German Translation by ps2guy and LopoTRI # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German Änderungen speichern Zurück diff --git a/lng/lang_Greek_r2114.lng b/lng/lang_Greek_r2114.lng index b2094c860..3d6c5098f 100644 --- a/lng/lang_Greek_r2114.lng +++ b/lng/lang_Greek_r2114.lng @@ -1,7 +1,7 @@ # Greek Translation by RivalK93 # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek Αποθήκευση Αλλαγών Πίσω diff --git a/lng/lang_Hungarian_r2114.lng b/lng/lang_Hungarian_r2114.lng index f6f383984..5be40dde0 100644 --- a/lng/lang_Hungarian_r2114.lng +++ b/lng/lang_Hungarian_r2114.lng @@ -1,7 +1,7 @@ # Translation by co5oos # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian Változtatások mentése Vissza diff --git a/lng/lang_Indonesian_r2114.lng b/lng/lang_Indonesian_r2114.lng index dac2288bd..22f5b9a45 100644 --- a/lng/lang_Indonesian_r2114.lng +++ b/lng/lang_Indonesian_r2114.lng @@ -1,7 +1,7 @@ # translated by verislasher and jbliz # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian Simpan Perubahan Kembali diff --git a/lng/lang_Italian_r2114.lng b/lng/lang_Italian_r2114.lng index c4e9c53a0..0c3e51a0e 100644 --- a/lng/lang_Italian_r2114.lng +++ b/lng/lang_Italian_r2114.lng @@ -1,7 +1,7 @@ # Translation by jauffre and andre95d and completed by Peppe90 # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian Salva Modifiche Indietro diff --git a/lng/lang_Japanese_r2114.lng b/lng/lang_Japanese_r2114.lng index 802898b73..d662d0cd0 100644 --- a/lng/lang_Japanese_r2114.lng +++ b/lng/lang_Japanese_r2114.lng @@ -1,7 +1,7 @@ # Japanese Translation by yamamotonew and keiichiro2000 # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese 設定を保存する 戻る diff --git a/lng/lang_Korean_r2114.lng b/lng/lang_Korean_r2114.lng index 6d86f7354..d4150a29e 100644 --- a/lng/lang_Korean_r2114.lng +++ b/lng/lang_Korean_r2114.lng @@ -1,7 +1,7 @@ # Translated by DDinghoya # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean 저장 변경 뒤로 diff --git a/lng/lang_Laotian_r2114.lng b/lng/lang_Laotian_r2114.lng index cbe17fd70..3a1141bdb 100644 --- a/lng/lang_Laotian_r2114.lng +++ b/lng/lang_Laotian_r2114.lng @@ -1,7 +1,7 @@ # Translation by Anousith Phompida (aka: blackbutterfly) # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian ບັນທຶກການປ່ຽນແປງ ກັບຄືນ diff --git a/lng/lang_Persian_r2114.lng b/lng/lang_Persian_r2114.lng index 3ca862342..07d1f696f 100644 --- a/lng/lang_Persian_r2114.lng +++ b/lng/lang_Persian_r2114.lng @@ -1,7 +1,7 @@ # Translation by saeid0035 # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian تاﺮﻴﻴﻐﺗ هﺮﻴﺧذ ﺖﺸﮔﺮﺑ diff --git a/lng/lang_Polish_r2114.lng b/lng/lang_Polish_r2114.lng index c807631a4..d7641fe0a 100644 --- a/lng/lang_Polish_r2114.lng +++ b/lng/lang_Polish_r2114.lng @@ -1,7 +1,7 @@ # Translation by yohokaru # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish Zapisz Zmiany Wróć diff --git a/lng/lang_Portuguese_BR_r2114.lng b/lng/lang_Portuguese_BR_r2114.lng index 59e90b06b..4f1f59ac4 100644 --- a/lng/lang_Portuguese_BR_r2114.lng +++ b/lng/lang_Portuguese_BR_r2114.lng @@ -1,7 +1,7 @@ # Translation by Colossus, tonyhoro, and joseri # Last update: August 30, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese Salvar configurações Voltar diff --git a/lng/lang_Portuguese_r2114.lng b/lng/lang_Portuguese_r2114.lng index 78b1ebf09..10981e45c 100644 --- a/lng/lang_Portuguese_r2114.lng +++ b/lng/lang_Portuguese_r2114.lng @@ -1,7 +1,7 @@ # Translation by danielb # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese Salvar alterações Voltar diff --git a/lng/lang_Romanian_r2114.lng b/lng/lang_Romanian_r2114.lng index 1e95a4de2..0c8aa7958 100644 --- a/lng/lang_Romanian_r2114.lng +++ b/lng/lang_Romanian_r2114.lng @@ -1,7 +1,7 @@ # Romanian translation by MRAdyy # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Romanian Salvare Setari Inapoi @@ -102,8 +102,8 @@ Setari Imagine Write Operations Aminteste ultimul joc jucat Butonul Select -"Eroare, jocul este fragmentat" -"Eroare, nu a putut rula elementul" +Eroare, jocul este fragmentat +Eroare, nu a putut rula elementul Test Changes Lasati goala pentru autentificarea GUEST. Citeste exact diff --git a/lng/lang_Russian_r2114.lng b/lng/lang_Russian_r2114.lng index 58b8bec51..d6ee33094 100644 --- a/lng/lang_Russian_r2114.lng +++ b/lng/lang_Russian_r2114.lng @@ -1,7 +1,7 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian Сохранить настройки Назад diff --git a/lng/lang_SChinese_r2114.lng b/lng/lang_SChinese_r2114.lng index 3d36233f8..a648066f3 100644 --- a/lng/lang_SChinese_r2114.lng +++ b/lng/lang_SChinese_r2114.lng @@ -1,7 +1,7 @@ # Translated by kane159 and eyu2007 # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese 保存设置 返回 diff --git a/lng/lang_Spanish_r2114.lng b/lng/lang_Spanish_r2114.lng index cb9c367d4..a6536f820 100644 --- a/lng/lang_Spanish_r2114.lng +++ b/lng/lang_Spanish_r2114.lng @@ -1,7 +1,7 @@ # Translation by lauchon22 and destro # Last update: August 30, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish Guardar cambios Atrás diff --git a/lng/lang_Swedish_r2114.lng b/lng/lang_Swedish_r2114.lng index fe0b67cb5..c3df243fb 100644 --- a/lng/lang_Swedish_r2114.lng +++ b/lng/lang_Swedish_r2114.lng @@ -1,7 +1,7 @@ # Translation by Lord_Flaya # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish Spara ändringar Tillbaka diff --git a/lng/lang_TChinese_r2114.lng b/lng/lang_TChinese_r2114.lng index 93737162a..3d5d8f8d2 100644 --- a/lng/lang_TChinese_r2114.lng +++ b/lng/lang_TChinese_r2114.lng @@ -1,7 +1,7 @@ # Translated by kane159 and eyu2007 # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese 保存設置 返回 diff --git a/lng/lang_Turkish_r2114.lng b/lng/lang_Turkish_r2114.lng index 29a708e0e..8fc14e44c 100644 --- a/lng/lang_Turkish_r2114.lng +++ b/lng/lang_Turkish_r2114.lng @@ -1,7 +1,7 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish Değişiklikleri kaydet Geri diff --git a/lng/lang_Vietnamese_r2114.lng b/lng/lang_Vietnamese_r2114.lng index b945fbdae..abb30bd6e 100644 --- a/lng/lang_Vietnamese_r2114.lng +++ b/lng/lang_Vietnamese_r2114.lng @@ -1,7 +1,7 @@ # Translation by zidane89 # Last update: August 29, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 -# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese Lưu thay đổi Quay lại From 4f5adc559158e6f65302194e592d7f9a1ef2e6ad Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 2 Sep 2021 16:14:46 -0700 Subject: [PATCH 247/269] apply new changes to elm page --- src/elmsupport.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/elmsupport.c b/src/elmsupport.c index 860a1c937..10d327c98 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -684,6 +684,16 @@ static int elmGetImage(char *folder, int isRelative, char *value, char *suffix, return -1; } +static int elmGetTextId(void) +{ + return _STR_ELM; +} + +static int elmGetIconId(void) +{ + return ELM_ICON; +} + static void elmCleanUp(int exception) { if (elmItemList.enabled) { @@ -703,6 +713,6 @@ static void elmShutdown(void) } static item_list_t elmItemList = { - ELM_MODE, -1, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", _STR_ELM, NULL, NULL, NULL, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, + ELM_MODE, -1, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", &elmGetTextId, NULL, NULL, NULL, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, &elmGetItemCount, NULL, &elmGetItemName, &elmGetItemNameLength, &elmGetItemStartup, &elmDeleteItem, &elmRenameItem, &elmLaunchItem, - &elmGetConfig, &elmGetImage, &elmCleanUp, &elmShutdown, NULL, ELM_ICON}; + &elmGetConfig, &elmGetImage, &elmCleanUp, &elmShutdown, NULL, &elmGetIconId}; From 5e9f2e8dc0b28492c8e37d575f6fabce1a3726a1 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 2 Sep 2021 17:53:26 -0700 Subject: [PATCH 248/269] update lang files --- ...nian_r2114.lng => lang_Albanian_r2134.lng} | 7 ++- ...Arabic_r2114.lng => lang_Arabic_r2134.lng} | 7 ++- ...ian_r2114.lng => lang_Bulgarian_r2134.lng} | 7 ++- ...buano_r2114.lng => lang_Cebuano_r2134.lng} | 7 ++- ...tian_r2114.lng => lang_Croatian_r2134.lng} | 7 ++- ...g_Czech_r2114.lng => lang_Czech_r2134.lng} | 7 ++- ...Danish_r2114.lng => lang_Danish_r2134.lng} | 7 ++- ...g_Dutch_r2114.lng => lang_Dutch_r2134.lng} | 7 ++- ...pino_r2114.lng => lang_Filipino_r2134.lng} | 7 ++- ...French_r2114.lng => lang_French_r2134.lng} | 7 ++- ...German_r2114.lng => lang_German_r2134.lng} | 7 ++- ...g_Greek_r2114.lng => lang_Greek_r2134.lng} | 7 ++- ...ian_r2114.lng => lang_Hungarian_r2134.lng} | 7 ++- ...an_r2114.lng => lang_Indonesian_r2134.lng} | 7 ++- ...alian_r2114.lng => lang_Italian_r2134.lng} | 7 ++- ...nese_r2114.lng => lang_Japanese_r2134.lng} | 7 ++- ...Korean_r2114.lng => lang_Korean_r2134.lng} | 7 ++- ...otian_r2114.lng => lang_Laotian_r2134.lng} | 7 ++- ...rsian_r2114.lng => lang_Persian_r2134.lng} | 7 ++- ...Polish_r2114.lng => lang_Polish_r2134.lng} | 9 ++-- ...r2114.lng => lang_Portuguese_BR_r2134.lng} | 7 ++- ...se_r2114.lng => lang_Portuguese_r2134.lng} | 7 ++- ...nian_r2114.lng => lang_Romanian_r2134.lng} | 7 ++- ...ssian_r2114.lng => lang_Russian_r2134.lng} | 49 ++++++++++--------- ...nese_r2114.lng => lang_SChinese_r2134.lng} | 7 ++- ...anish_r2114.lng => lang_Spanish_r2134.lng} | 7 ++- ...edish_r2114.lng => lang_Swedish_r2134.lng} | 47 +++++++++--------- ...nese_r2114.lng => lang_TChinese_r2134.lng} | 7 ++- ...rkish_r2114.lng => lang_Turkish_r2134.lng} | 7 ++- ...se_r2114.lng => lang_Vietnamese_r2134.lng} | 7 ++- 30 files changed, 192 insertions(+), 102 deletions(-) rename lng/{lang_Albanian_r2114.lng => lang_Albanian_r2134.lng} (97%) rename lng/{lang_Arabic_r2114.lng => lang_Arabic_r2134.lng} (98%) rename lng/{lang_Bulgarian_r2114.lng => lang_Bulgarian_r2134.lng} (98%) rename lng/{lang_Cebuano_r2114.lng => lang_Cebuano_r2134.lng} (97%) rename lng/{lang_Croatian_r2114.lng => lang_Croatian_r2134.lng} (97%) rename lng/{lang_Czech_r2114.lng => lang_Czech_r2134.lng} (96%) rename lng/{lang_Danish_r2114.lng => lang_Danish_r2134.lng} (96%) rename lng/{lang_Dutch_r2114.lng => lang_Dutch_r2134.lng} (96%) rename lng/{lang_Filipino_r2114.lng => lang_Filipino_r2134.lng} (97%) rename lng/{lang_French_r2114.lng => lang_French_r2134.lng} (97%) rename lng/{lang_German_r2114.lng => lang_German_r2134.lng} (97%) rename lng/{lang_Greek_r2114.lng => lang_Greek_r2134.lng} (98%) rename lng/{lang_Hungarian_r2114.lng => lang_Hungarian_r2134.lng} (97%) rename lng/{lang_Indonesian_r2114.lng => lang_Indonesian_r2134.lng} (96%) rename lng/{lang_Italian_r2114.lng => lang_Italian_r2134.lng} (97%) rename lng/{lang_Japanese_r2114.lng => lang_Japanese_r2134.lng} (97%) rename lng/{lang_Korean_r2114.lng => lang_Korean_r2134.lng} (97%) rename lng/{lang_Laotian_r2114.lng => lang_Laotian_r2134.lng} (98%) rename lng/{lang_Persian_r2114.lng => lang_Persian_r2134.lng} (98%) rename lng/{lang_Polish_r2114.lng => lang_Polish_r2134.lng} (97%) rename lng/{lang_Portuguese_BR_r2114.lng => lang_Portuguese_BR_r2134.lng} (97%) rename lng/{lang_Portuguese_r2114.lng => lang_Portuguese_r2134.lng} (97%) rename lng/{lang_Romanian_r2114.lng => lang_Romanian_r2134.lng} (96%) rename lng/{lang_Russian_r2114.lng => lang_Russian_r2134.lng} (91%) rename lng/{lang_SChinese_r2114.lng => lang_SChinese_r2134.lng} (96%) rename lng/{lang_Spanish_r2114.lng => lang_Spanish_r2134.lng} (97%) rename lng/{lang_Swedish_r2114.lng => lang_Swedish_r2134.lng} (89%) rename lng/{lang_TChinese_r2114.lng => lang_TChinese_r2134.lng} (96%) rename lng/{lang_Turkish_r2114.lng => lang_Turkish_r2134.lng} (97%) rename lng/{lang_Vietnamese_r2114.lng => lang_Vietnamese_r2134.lng} (97%) diff --git a/lng/lang_Albanian_r2114.lng b/lng/lang_Albanian_r2134.lng similarity index 97% rename from lng/lang_Albanian_r2114.lng rename to lng/lang_Albanian_r2134.lng index ef5fc8e40..5f47fd13a 100644 --- a/lng/lang_Albanian_r2114.lng +++ b/lng/lang_Albanian_r2134.lng @@ -1,6 +1,6 @@ # Translation by LoniTheFricc -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Albanian Ruaj Ndryshimet @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games Lojrat PS1 Moda e Shfaqjes se Lojrave PS1 POPSTARTER.ELF nuk është gjetur tek '%s'! diff --git a/lng/lang_Arabic_r2114.lng b/lng/lang_Arabic_r2134.lng similarity index 98% rename from lng/lang_Arabic_r2114.lng rename to lng/lang_Arabic_r2134.lng index e8d59a96e..561c0b852 100644 --- a/lng/lang_Arabic_r2114.lng +++ b/lng/lang_Arabic_r2134.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic ﺕﺍﺮﻴﻴﻐﺘﻟﺍ ﻆﻔﺣ @@ -281,6 +281,9 @@ Block Devices ﻢﻜﺤﺗ ﺕﺍﺩﺍﺪﻋﺇ Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_Bulgarian_r2114.lng b/lng/lang_Bulgarian_r2134.lng similarity index 98% rename from lng/lang_Bulgarian_r2114.lng rename to lng/lang_Bulgarian_r2134.lng index 5f8920f90..5e32ebb0c 100644 --- a/lng/lang_Bulgarian_r2114.lng +++ b/lng/lang_Bulgarian_r2134.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian Запазване на промените @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Cebuano_r2114.lng b/lng/lang_Cebuano_r2134.lng similarity index 97% rename from lng/lang_Cebuano_r2114.lng rename to lng/lang_Cebuano_r2134.lng index 555203e4e..34458a160 100644 --- a/lng/lang_Cebuano_r2114.lng +++ b/lng/lang_Cebuano_r2134.lng @@ -1,6 +1,6 @@ # Translation by Colton Silva -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Cebuano Tipigi ang mga pagbag-o @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Croatian_r2114.lng b/lng/lang_Croatian_r2134.lng similarity index 97% rename from lng/lang_Croatian_r2114.lng rename to lng/lang_Croatian_r2134.lng index 71c215608..c349d26f6 100644 --- a/lng/lang_Croatian_r2114.lng +++ b/lng/lang_Croatian_r2134.lng @@ -1,6 +1,6 @@ # Translation by Blacky5678 -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Croatian Spremi Promjene @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Igre Nacin Prikaza PS1 Igara POPSTARTER.ELF nije pronaden kod '%s'! diff --git a/lng/lang_Czech_r2114.lng b/lng/lang_Czech_r2134.lng similarity index 96% rename from lng/lang_Czech_r2114.lng rename to lng/lang_Czech_r2134.lng index 136327582..fe9be80f0 100644 --- a/lng/lang_Czech_r2114.lng +++ b/lng/lang_Czech_r2134.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech Uložit změny @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish_r2114.lng b/lng/lang_Danish_r2134.lng similarity index 96% rename from lng/lang_Danish_r2114.lng rename to lng/lang_Danish_r2134.lng index 714da5836..f3b5c7b40 100644 --- a/lng/lang_Danish_r2114.lng +++ b/lng/lang_Danish_r2134.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish Gem indstillinger @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch_r2114.lng b/lng/lang_Dutch_r2134.lng similarity index 96% rename from lng/lang_Dutch_r2114.lng rename to lng/lang_Dutch_r2134.lng index 1666870aa..d5c48938b 100644 --- a/lng/lang_Dutch_r2114.lng +++ b/lng/lang_Dutch_r2134.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch Wijzigingen opslaan @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Filipino_r2114.lng b/lng/lang_Filipino_r2134.lng similarity index 97% rename from lng/lang_Filipino_r2114.lng rename to lng/lang_Filipino_r2134.lng index 0035d4b63..9c9adfd39 100644 --- a/lng/lang_Filipino_r2114.lng +++ b/lng/lang_Filipino_r2134.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo and Colton SIlva @ColtonSilvaonKnoxKontor -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino I-save ang mga pagbabago @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French_r2114.lng b/lng/lang_French_r2134.lng similarity index 97% rename from lng/lang_French_r2114.lng rename to lng/lang_French_r2134.lng index c2f53093c..7506e2484 100644 --- a/lng/lang_French_r2114.lng +++ b/lng/lang_French_r2134.lng @@ -1,6 +1,6 @@ # Translation by machiavel and Squall -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French Sauvegarder @@ -281,6 +281,9 @@ MOD: Block Devices Controller Settings ADD: Turn on/off Block Device Manager. ADD: Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games Mode d'affichage des jeux PS1 POPSTARTER.ELF non trouvé à '%s'! diff --git a/lng/lang_German_r2114.lng b/lng/lang_German_r2134.lng similarity index 97% rename from lng/lang_German_r2114.lng rename to lng/lang_German_r2134.lng index 2f51f2d66..b0c63ee1a 100644 --- a/lng/lang_German_r2114.lng +++ b/lng/lang_German_r2134.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German Änderungen speichern @@ -281,6 +281,9 @@ Block Devices Controller einstellungen Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek_r2114.lng b/lng/lang_Greek_r2134.lng similarity index 98% rename from lng/lang_Greek_r2114.lng rename to lng/lang_Greek_r2134.lng index 3d6c5098f..1a8e42969 100644 --- a/lng/lang_Greek_r2114.lng +++ b/lng/lang_Greek_r2134.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek Αποθήκευση Αλλαγών @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games Παιχνίδια PS1 Εκκίνηση μενού Παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian_r2114.lng b/lng/lang_Hungarian_r2134.lng similarity index 97% rename from lng/lang_Hungarian_r2114.lng rename to lng/lang_Hungarian_r2134.lng index 5be40dde0..ac7ea63e5 100644 --- a/lng/lang_Hungarian_r2114.lng +++ b/lng/lang_Hungarian_r2134.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian Változtatások mentése @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian_r2114.lng b/lng/lang_Indonesian_r2134.lng similarity index 96% rename from lng/lang_Indonesian_r2114.lng rename to lng/lang_Indonesian_r2134.lng index 22f5b9a45..1ed0b4cfe 100644 --- a/lng/lang_Indonesian_r2114.lng +++ b/lng/lang_Indonesian_r2134.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian Simpan Perubahan @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian_r2114.lng b/lng/lang_Italian_r2134.lng similarity index 97% rename from lng/lang_Italian_r2114.lng rename to lng/lang_Italian_r2134.lng index 0c3e51a0e..516c9f40b 100644 --- a/lng/lang_Italian_r2114.lng +++ b/lng/lang_Italian_r2134.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d and completed by Peppe90 -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian Salva Modifiche @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese_r2114.lng b/lng/lang_Japanese_r2134.lng similarity index 97% rename from lng/lang_Japanese_r2114.lng rename to lng/lang_Japanese_r2134.lng index d662d0cd0..8c263ff3d 100644 --- a/lng/lang_Japanese_r2114.lng +++ b/lng/lang_Japanese_r2134.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese 設定を保存する @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 ゲーム PS1 ゲーム 画面モード POPSTARTER.ELFが '%s'に見つかりません! diff --git a/lng/lang_Korean_r2114.lng b/lng/lang_Korean_r2134.lng similarity index 97% rename from lng/lang_Korean_r2114.lng rename to lng/lang_Korean_r2134.lng index d4150a29e..5b1408cdb 100644 --- a/lng/lang_Korean_r2114.lng +++ b/lng/lang_Korean_r2134.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean 저장 변경 @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 게임 PS1 게임 표시 모드 '%s' 에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian_r2114.lng b/lng/lang_Laotian_r2134.lng similarity index 98% rename from lng/lang_Laotian_r2114.lng rename to lng/lang_Laotian_r2134.lng index 3a1141bdb..c04a30c5c 100644 --- a/lng/lang_Laotian_r2114.lng +++ b/lng/lang_Laotian_r2134.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian ບັນທຶກການປ່ຽນແປງ @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Persian_r2114.lng b/lng/lang_Persian_r2134.lng similarity index 98% rename from lng/lang_Persian_r2114.lng rename to lng/lang_Persian_r2134.lng index 07d1f696f..7f900de24 100644 --- a/lng/lang_Persian_r2114.lng +++ b/lng/lang_Persian_r2134.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian تاﺮﻴﻴﻐﺗ هﺮﻴﺧذ @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ !'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ diff --git a/lng/lang_Polish_r2114.lng b/lng/lang_Polish_r2134.lng similarity index 97% rename from lng/lang_Polish_r2114.lng rename to lng/lang_Polish_r2134.lng index d7641fe0a..d2bcf746f 100644 --- a/lng/lang_Polish_r2114.lng +++ b/lng/lang_Polish_r2134.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish Zapisz Zmiany @@ -146,7 +146,7 @@ Wybór Koloru Połącz Ponownie Pozostaw puste aby wyświetlić listę udziałów. Prefix Ścieżki ETH -Cofnij +"Cofnij " Odstęp Enter Tryb @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese_BR_r2114.lng b/lng/lang_Portuguese_BR_r2134.lng similarity index 97% rename from lng/lang_Portuguese_BR_r2114.lng rename to lng/lang_Portuguese_BR_r2134.lng index 4f1f59ac4..9df25e7e9 100644 --- a/lng/lang_Portuguese_BR_r2114.lng +++ b/lng/lang_Portuguese_BR_r2134.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: August 30, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese Salvar configurações @@ -281,6 +281,9 @@ Dispositivos de entrada Configurações dos controles Ligue/desligue o gerenciador de dispositivos de entrada. Ligue/desligue dispositivos de entrada (ex: USB). +USB Games +iLink Games +MX4SIO Games Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_r2114.lng b/lng/lang_Portuguese_r2134.lng similarity index 97% rename from lng/lang_Portuguese_r2114.lng rename to lng/lang_Portuguese_r2134.lng index 10981e45c..4692c43a8 100644 --- a/lng/lang_Portuguese_r2114.lng +++ b/lng/lang_Portuguese_r2134.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese Salvar alterações @@ -281,6 +281,9 @@ Block Devices Configurações dos comandos Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Romanian_r2114.lng b/lng/lang_Romanian_r2134.lng similarity index 96% rename from lng/lang_Romanian_r2114.lng rename to lng/lang_Romanian_r2134.lng index 0c8aa7958..189be6da7 100644 --- a/lng/lang_Romanian_r2114.lng +++ b/lng/lang_Romanian_r2134.lng @@ -1,6 +1,6 @@ # Romanian translation by MRAdyy -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Romanian Salvare Setari @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Russian_r2114.lng b/lng/lang_Russian_r2134.lng similarity index 91% rename from lng/lang_Russian_r2114.lng rename to lng/lang_Russian_r2134.lng index d6ee33094..970ba18f1 100644 --- a/lng/lang_Russian_r2114.lng +++ b/lng/lang_Russian_r2134.lng @@ -1,6 +1,6 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian Сохранить настройки @@ -53,16 +53,16 @@ Russian Ошибка загрузки ID игры. Автоматическая сортировка Ошибка загрузки языкового файла. -Debug Colors +Цвета отладки Контроллер не обнаружен, ожидание... -Cover Art +Фоновые рисунки Широкий экран Выключить консоль Загрузка настроек... Сохранение настроек... Запуск устройства Обновить -BDM Start Mode +Режим запуска BDM Режим запуска HDD Режим запуска ETH Режим показа Приложений @@ -99,7 +99,7 @@ NetBIOS Удалить Старт Настройки экрана -Write Operations +Операции записи Запоминать последнюю игру Кнопка выбора Ошибка, игра фрагментирована. @@ -168,7 +168,7 @@ ID игры 10 Мбит полный дуплекс 10 Мбит полудуплекс Настройки GSM -GSM Selector +GSM-переключатель Включает или выключает GSM. Принудительный пользовательский видеорежим. Смещение по горизонтали @@ -205,7 +205,7 @@ PS2RD Cheat Engine пропатчит Вашу игру. Отображается при совпадении регионов диска и консоли. Настроить PADEMU Настройки Pad-эмулятора -Pad Emulator +Pad-эмулятор При включении будет задействован Pad-эмулятор. Режим Pad-эмулятора Выбрать режим Pad-эмулятора. @@ -213,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Настройки для порта: Выбрать настройки для порта Pad-эмулятора. -Emulation +Эмуляция Вкл/выкл Pad-эмулятор для выбранного порта. -Vibration +Вибрация Вкл/выкл вибрацию в выбранном порте Pad-эмулятора. MAC-адрес USB Bluetooth-адаптера: Контроллер привязан к MAC-адресу: @@ -233,12 +233,12 @@ ID производителя: Нет Bluetooth-адаптер совместим с контроллерами DS3/DS4. Bluetooth-адаптер может плохо работать с контроллерами DS3/DS4. -Multitap Emulation +Эмуляция Multitap Вкл/выкл эмуляцию Multitap. Порт эмулятора Multitap: Выбрать порт для эмуляции Multitap. -Fake DS3 Workaround -Some fake DS3s need a workaround, this option will enable it. +Неоригинальный DS3 +Некоторым репликам DS3 нужно исправление, тут можно включить его. Эмуляция полукадра (FIELD) Исправление для игр, имеющих проблемы с прогрессивным режимом. Родительский контроль @@ -251,17 +251,17 @@ Some fake DS3s need a workaround, this option will enable it. Ошибка - этот пароль не может быть установлен. Файл VMC %s фрагментирован. Продолжить с картой памяти в слоте %d? Настройки звука -Sound Effects -Boot Sound +Звуковые эффекты +Звук загрузки Громкость звуковых эффектов Громкость звука загрузки Изменить режим видео? Кэширование списка игр (HDD) -Notifications -Config loaded from %s -Theme loaded from %s -Language loaded from %s -%s partition mounted. +Уведомления +Настройки загружены из %s +Тема загружена из %s +Язык загружен из %s +Раздел %s смонтирован. Опции Настройки игры сохранены. %s настройки удалены. @@ -277,10 +277,13 @@ Language loaded from %s Выпуск Разработчик Описание -Block Devices +Устройства BDM Настройки контроллера -Turn on/off Block Device Manager. -Turn on/off Block Devices (e.g. USB). +Вкл/выкл Block Device Manager. +Вкл/выкл устройства BDM (напр. USB). +USB Games +iLink Games +MX4SIO Games Игры PS1 Режим показа игр PS1 POPSTARTER.ELF не найден в '%s'! diff --git a/lng/lang_SChinese_r2114.lng b/lng/lang_SChinese_r2134.lng similarity index 96% rename from lng/lang_SChinese_r2114.lng rename to lng/lang_SChinese_r2134.lng index a648066f3..ba78d31c2 100644 --- a/lng/lang_SChinese_r2114.lng +++ b/lng/lang_SChinese_r2134.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese 保存设置 @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Spanish_r2114.lng b/lng/lang_Spanish_r2134.lng similarity index 97% rename from lng/lang_Spanish_r2114.lng rename to lng/lang_Spanish_r2134.lng index a6536f820..8c9108951 100644 --- a/lng/lang_Spanish_r2114.lng +++ b/lng/lang_Spanish_r2134.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 and destro -# Last update: August 30, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish Guardar cambios @@ -281,6 +281,9 @@ Dispositivos de Entrada Ajustes de Mando Prender/Apagar Administrador de Dispositivo de Entrada. Prender/Apagar Dispositivos de Entrada (p.e. USB). +USB Games +iLink Games +MX4SIO Games Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish_r2114.lng b/lng/lang_Swedish_r2134.lng similarity index 89% rename from lng/lang_Swedish_r2114.lng rename to lng/lang_Swedish_r2134.lng index c3df243fb..a76a0a01c 100644 --- a/lng/lang_Swedish_r2114.lng +++ b/lng/lang_Swedish_r2134.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish Spara ändringar @@ -53,23 +53,23 @@ Vänta Fel vid laddning av Game ID Automatisk sortering Fel vid inläsning av språkfilen -Debug Colors -Ingen kontroll upptäcks , vänta ... -Cover Art +Felsökningsfärger +Ingen kontroll upptäcks, vänta... +Omslag Bredbild Stäng av Ladda config Spara config Starta enheten Uppdatera -BDM Start Mode +BDM Startläge HDD enhet startläge ETH enhet startläge APP-meny visningsläge Auto Manuell Starta NBD Server -NBD Server Startar ... +NBD Server Startar... NBD Server Running... Kan inte starta NBD server. NBD Server Stängs... @@ -99,7 +99,7 @@ Byt namn Radera Kör Skärminställningar -Write Operations +Skrivoperationer Kom ihåg senast spelade spel Välj knapp Fel, spelet är fragmenterat @@ -168,7 +168,7 @@ Ethernet hastighet och duplex 10Mbit Full-duplex 10Mbit halv duplex GSM inställningar -GSM Selector +GSM-väljare GSM PÅ eller AV Videoläge tvingas Horisontell position @@ -180,7 +180,7 @@ Ställer Vertikal förskjutning Skippa FMV Skippar Full Motion Video Inställningar Fusk -PS2RD Cheat Engine +PS2RD Fuskmotor Tillåter PS2RD patcha dina spel PS2RD Fusk Motor Läge Autovälj eller Välj spel fusk @@ -237,8 +237,8 @@ Multitap Emulation Slår på / av multitap emulering för valt spel. Multitap emulator på porten Välj port för multitap emulering. -Fake DS3 Workaround -Some fake DS3s need a workaround, this option will enable it. +Falsk DS3 Fix +Vissa falska DS3s behöver en fix, detta val löser det. Emulera FIELD vändning Fix för spel med problem i progressivt läge. Föräldrakontroll @@ -251,17 +251,17 @@ Bygg-Alternativ: Fel - lösenordet kan ej användas. VMC %s filen är fragmenterad. Använd minneskort i port %d? Ljudinställningar -Sound Effects -Boot Sound +Ljudeffekter +Startljud Ljudeffektsvolym Uppstartsljudsvolym Bekräfta ändring av videoläge? Lägg Spellista i Cache (HDD) -Notifications -Config loaded from %s -Theme loaded from %s -Language loaded from %s -%s partition mounted. +Notifikationer +Konfiguration laddas från %s +Tema laddas från %s +Språk laddas från %s +%s partition monterad. Val Spelinställningar sparade. %s inställningar borttagna @@ -277,10 +277,13 @@ Genre Lansering Utvecklare Beskrivning -Block Devices +Blockera enheter Kontroll-inställningar -Turn on/off Block Device Manager. -Turn on/off Block Devices (e.g. USB). +Slå på/av Blockera enhetshaterare. +Slå på/av Blockera enheter (T.ex USB). +USB Games +iLink Games +MX4SIO Games PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_TChinese_r2114.lng b/lng/lang_TChinese_r2134.lng similarity index 96% rename from lng/lang_TChinese_r2114.lng rename to lng/lang_TChinese_r2134.lng index 3d5d8f8d2..59d234341 100644 --- a/lng/lang_TChinese_r2114.lng +++ b/lng/lang_TChinese_r2134.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese 保存設置 @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! diff --git a/lng/lang_Turkish_r2114.lng b/lng/lang_Turkish_r2134.lng similarity index 97% rename from lng/lang_Turkish_r2114.lng rename to lng/lang_Turkish_r2134.lng index 8fc14e44c..b9e5fa349 100644 --- a/lng/lang_Turkish_r2114.lng +++ b/lng/lang_Turkish_r2134.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish Değişiklikleri kaydet @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. diff --git a/lng/lang_Vietnamese_r2114.lng b/lng/lang_Vietnamese_r2134.lng similarity index 97% rename from lng/lang_Vietnamese_r2114.lng rename to lng/lang_Vietnamese_r2134.lng index abb30bd6e..ae53ee9ab 100644 --- a/lng/lang_Vietnamese_r2114.lng +++ b/lng/lang_Vietnamese_r2134.lng @@ -1,6 +1,6 @@ # Translation by zidane89 -# Last update: August 29, 2021 -# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2114-48e7057-2021-08-29 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1765-dbf652f-2021-08-29 +# Last update: Sept. 2, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese Lưu thay đổi @@ -281,6 +281,9 @@ Block Devices Controller Settings Turn on/off Block Device Manager. Turn on/off Block Devices (e.g. USB). +USB Games +iLink Games +MX4SIO Games Các trò chơi PS1 Chế độ hiển thị cho game PS1 POPSTARTER.ELF không có ở '%s'! From 45ae6f0d183b6488590bbb7b13363c031184862a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 4 Sep 2021 15:55:40 -0700 Subject: [PATCH 249/269] update lang files --- lng/lang_Arabic_r2134.lng | 82 ++++++++++++++++---------------- lng/lang_Portuguese_BR_r2134.lng | 6 +-- lng/lang_Portuguese_r2134.lng | 52 ++++++++++---------- lng/lang_Russian_r2134.lng | 8 ++-- lng/lang_Spanish_r2134.lng | 6 +-- 5 files changed, 77 insertions(+), 77 deletions(-) diff --git a/lng/lang_Arabic_r2134.lng b/lng/lang_Arabic_r2134.lng index 561c0b852..8fd603242 100644 --- a/lng/lang_Arabic_r2134.lng +++ b/lng/lang_Arabic_r2134.lng @@ -1,5 +1,5 @@ # translation by alimadhi -# Last update: Sept. 2, 2021 +# Last update: Sept. 3, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic @@ -8,7 +8,7 @@ Arabic ﺔﻜﺒﺸﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ ﺔﻣﺪﻘﺘﻣ ﺕﺍﺭﺎﻴﺧ >ﻢﻴﻗ ﺪﺟﻮﻳﻻ< -s% ﻲﻓ ﺕﺍﺩﺍﺪﻋﻹﺍ ﻆﻔﺣ ﻢﺗ +%s ﻲﻓ ﺕﺍﺩﺍﺪﻋﻹﺍ ﻆﻔﺣ ﻢﺗ ! ﺄﻄﺧ ﺕﺍﺩﺍﺪﻋﻻﺍ ﺔﺑﺎﺘﻛ ﺝﻭﺮﺧ ﺕﺍﺩﺍﺪﻋﻻﺍ @@ -22,17 +22,17 @@ ETH ﺏﺎﻌﻟﺃ .ﻡﺎﻀﻨﻟﺍ ﻒﻗﻮﺘﻳ ﻑﻮﺳ ؟ ﺢﻔﺼﺘﻤﻟﺍ ﻰﻟﺍ ﺝﻭﺮﺨﻟﺍ ؟ﺚﻳﺪﺤﺘﻟﺍ ﺀﺎﻐﻟﺍ -ﺐﻠﺼﻟﺍ ﺹﺮﻘﻟﺍ ﻰﻠﻋ ﺭﻮﺜﻌﻟﺍ ﻢﺘﻳ ﻢﻟ -ﺄﻴﻬﻣ ﺮﻴﻏ ﺐﻠﺼﻟﺍ ﺹﺮﻘﻟﺍ -ﺔﻜﺒﺸﻟﺍ ﺃﺪﺑ ﻲﻓ ﺄﻄﺧ -ﻡﻮﻳﺩﻮﻤﻟﺍ ﻰﻠﻋ ﺭﻮﺜﻌﻟﺍ ﻢﺘﻳ ﻢﻟ -SMB ﺮﻓﺮﻴﺳ ﻰﻟﺍ ﻂﺑﺮﻟﺍ ﻦﻜﻤﻳﻻ -SMB ﺮﻓﺮﻴﺳ ﻰﻟﺍ ﻝﻮﺧﺪﻟﺍ ﻦﻜﻤﻳﻻ -SMB ﺔﻛﺭﺎﺸﻣ ﺢﺘﻓ ﻦﻜﻤﻳﻻ -SMB ﺔﻤﺋﺎﻗ ﺔﻛﺭﺎﺸﻣ ﻦﻜﻤﻳﻻ -ﺏﺎﻌﻟﻻﺍ ﺔﻤﺋﺎﻗ ﻝﺪﺳ ﻦﻜﻤﻳﻻ -ﺮﻓﻮﺘﻣ ﺮﻴﻏ ﻲﻜﻴﻣﺎﻨﻳﺪﻟﺍ ﻒﻴﻀﻤﻟﺍ ﻦﻳﻮﻜﺗ ﺮﻓﺮﻴﺳ -ﺔﻜﺒﺸﻟﺎﺑ ﻂﺑﺭ ﺪﺟﻮﻳﻻ +%d: ﺐﻠﺼﻟﺍ ﺹﺮﻘﻟﺍ ﻰﻠﻋ ﺭﻮﺜﻌﻟﺍ ﻢﺘﻳ ﻢﻟ +%d: ﺄﻴﻬﻣ ﺮﻴﻏ ﺐﻠﺼﻟﺍ ﺹﺮﻘﻟﺍ +%d: ﺔﻜﺒﺸﻟﺍ ﺃﺪﺑ ﻲﻓ ﺄﻄﺧ +%d: ﻡﻮﻳﺩﻮﻤﻟﺍ ﻰﻠﻋ ﺭﻮﺜﻌﻟﺍ ﻢﺘﻳ ﻢﻟ +%d: SMB ﺮﻓﺮﻴﺳ ﻰﻟﺍ ﻂﺑﺮﻟﺍ ﻦﻜﻤﻳﻻ +%d: SMB ﺮﻓﺮﻴﺳ ﻰﻟﺍ ﻝﻮﺧﺪﻟﺍ ﻦﻜﻤﻳﻻ +%d: SMB ﺔﻛﺭﺎﺸﻣ ﺢﺘﻓ ﻦﻜﻤﻳﻻ +%d: SMB ﺔﻤﺋﺎﻗ ﺔﻛﺭﺎﺸﻣ ﻦﻜﻤﻳﻻ +%d: ﺏﺎﻌﻟﻻﺍ ﺔﻤﺋﺎﻗ ﻝﺪﺳ ﻦﻜﻤﻳﻻ +%d: ﺮﻓﻮﺘﻣ ﺮﻴﻏ ﻲﻜﻴﻣﺎﻨﻳﺪﻟﺍ ﻒﻴﻀﻤﻟﺍ ﻦﻳﻮﻜﺗ ﺮﻓﺮﻴﺳ +%d: ﺔﻜﺒﺸﻟﺎﺑ ﻂﺑﺭ ﺪﺟﻮﻳﻻ ﻞﻴﻐﺸﺗ ﻑﺎﻘﻳﺇ ﺎﻨﺴﺣ @@ -53,16 +53,16 @@ SMB ﺔﻤﺋﺎﻗ ﺔﻛﺭﺎﺸﻣ ﻦﻜﻤﻳﻻ ﺔﺒﻌﻠﻟﺍ ID ﻞﻴﻤﺤﺗ ﺀﺎﻨﺛﺍ ﺄﻄﺧ ﻲﺋﺎﻘﻠﺗ ﺮﻳﺮﻤﺗ ﺔﻐﻠﻟﺍ ﻒﻠﻣ ﻞﻴﻤﺤﺗ ﻲﻓ ﺄﻄﺧ -Debug Colors +ﺢﻴﺤﺼﺘﻟﺍ ﻥﺍﻮﻟﺃ ... ﺮﻈﺘﻧﺍ ، ﻢﻜﺤﺗ ﺓﺪﺣﻭ ﻰﻠﻋ ﻒﺸﻜﻟﺍ ﻢﺘﻳ ﻢﻟ -Cover Art +ﺔﻔﻠﻏﻻﺍ ﺭﻮﺻ ﺔﻀﻳﺮﻋ ﺔﺷﺎﺷ ﻞﻴﻐﺸﺘﻟﺍ ﻑﺎﻘﻳﺇ ﻦﻳﻮﻜﺘﻟﺍ ﻞﻴﻤﺤﺗ ﻦﻳﻮﻜﺘﻟﺍ ﻆﻔﺣ ﺯﺎﻬﺠﻟﺍ ﺃﺪﺑ ﺚﻳﺪﺤﺗ -BDM Start Mode +BDM ﺀﺪﺑ ﻊﺿﻭ HDD ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ ETH ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ APPS ﺕﺎﻘﻴﺒﻄﺘﻟﺍ ﻞﻴﻐﺸﺗ @@ -99,7 +99,7 @@ IP ﻑﺬﺣ ﻞﻴﻐﺸﺗ ﺽﺮﻌﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ -Write Operations +ﺕﺎﻴﻠﻤﻌﻟﺍ ﺔﺑﺎﺘﻛ ﺎﻫﺭﺎﻴﺘﺧﺍ ﻢﺗ ﺔﺒﻌﻟ ﺮﺧﺁ ﺮﻛﺬﺗ ﺭﺰﻟﺍ ﺮﺘﺧﺍ ﺔﺋﺰﺠﻣ ﺔﺒﻌﻠﻟﺍ ،ﺄﻄﺧ @@ -127,7 +127,7 @@ VMC ﻦﻳﻮﻜﺗ ﺩﻮﺟﻮﻣ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ ﺢﻴﺤﺻ ﺮﻴﻏ ﻢﺠﺤﻟﺍﻭ ،ﺢﻟﺎﺻ ﺮﻴﻏ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ ﺀﺎﺸﻧﻻﺍ ﻰﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ ﺝﺎﺘﺤﻳ -d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞﻤﻛﺃ s.% ﻰﻟﺇ ﻝﻮﺻﻮﻟﺍ ﻲﻓ ﺄﻄﺧ +?%d: ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞﻤﻛﺃ s.% ﻰﻟﺇ ﻝﻮﺻﻮﻟﺍ ﻲﻓ ﺄﻄﺧ ﻲﺋﺎﻘﻠﺘﻟﺍ ﺚﻳﺪﺤﺘﻟﺍ ﻝﻮﺣ ﻥﻮﺠﻣﺮﺒﻤﻟﺍ @@ -168,7 +168,7 @@ GSM ﻦﻳﻮﻜﺗ 10Mbit ﻩﺎﺠﺗﻻﺍ ﺔﻴﺋﺎﻨﺛ 10Mbit ﺝﻭﺩﺰﻣ ﻒﺼﻧ GSM ﺕﺍﺩﺍﺪﻋﺇ -GSM Selector +GSM ﺩﺪﺤﻣ ﻑﺎﻘﻳﺇ ﻭﺍ ﻞﻴﻐﺸﺗ GSM ﻞﻳﺪﺒﺗ ﺽﺮﻌﻠﻟ ﺺﺼﺨﻣ ﻉﻮﻧ ﺭﺎﺒﺟﺍ H-POS @@ -180,7 +180,7 @@ V-POS FMV ﺯﺎﻴﺘﺟﺍ ﻮﻳﺪﻴﻔﻟﺍ ﺔﻛﺮﺤﻟ ﻞﻣﺎﻛ ﻲﻄﺨﺗ ﺶﻐﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ -PS2RD Cheat Engine +PS2RD ﺶﻐﻟﺍ ﻙﺮﺤﻣ ﺏﺎﻌﻟﻷﺍ ﺢﻴﺤﺼﺗ ﻦﻣ ﺶﻐﻟﺍ ﻙﺮﺤﻣ ﺢﻴﺘﻳ ﺶﻐﻟﺍ ﻙﺮﺤﻣ ﻊﺿﻭ ﺔﺒﻌﻠﻟﺍ ﺶﻏ ﺮﺘﺧﺍ ﻭﺍ ﻲﺋﺎﻘﻠﺗ ﺪﻳﺪﺤﺗ @@ -198,14 +198,14 @@ PS2RD Cheat Engine ؟ﺔﻜﺒﺸﻟﺍ ﻦﻣ ﺕﺍﺩﺍﺪﻋﻹﺍ ﻞﻴﻤﺤﺗ ﺔﺼﺼﺨﻣ ﺕﺍﺩﺍﺪﻋﺇ ﺎﻬﻠﻴﻤﺤﺗ ﺕﺎﻴﺿﺍﺮﺘﻓﺍ - s... i% ﻲﻓ ﻲﺋﺎﻘﻠﺗ ﺃﺪﺑ + s... %i ﻲﻓ ﻲﺋﺎﻘﻠﺗ ﺃﺪﺑ ﻲﺋﺎﻘﻠﺗ ﻞﻴﻐﺸﺗ ﻲﺋﺎﻘﻠﺘﻟﺍ ﻞﻴﻐﺸﺘﻟﺍ ﻞﻴﻄﻌﺘﻟ ﺮﻔﺻ ،(s) ﺔﻴﻧﺎﺜﻟﺍ ﻲﻓ ﺔﻤﻴﻘﻟﺍ 2ﻲﻠﺑ ﺭﺎﻌﺷ .ﻢﻜﺤﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻘﻄﻨﻣ ﻖﺑﺎﻄﻳ ﺢﻟﺎﺻ ﺹﺮﻗ ﺭﺎﻌﺸﻟ ﺽﻭﺮﻌﻣ PADEMU ﻦﻳﻮﻜﺗ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﺕﺍﺩﺍﺪﻋﺍ -Pad Emulator +ﺓﺩﺎﺳﻮﻟﺍ ﻲﻛﺎﺤﻣ ﺔﺒﻌﻟ ﺪﻳﺪﺤﺘﻟ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻑﺎﻘﻳﺍ/ﻞﻴﻐﺸﺗ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻊﺿﻭ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻊﺿﻭ ﺭﺎﻴﺘﺧﺍ @@ -213,9 +213,9 @@ Pad Emulator ﺙﻮﺗﻮﻠﺑ 3/4 ﻦﺸﻴﺘﺳ ﻲﻠﺑ ﻢﻜﺤﺗ :ﺝﺮﺨﻤﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ .ﺕﺍﺩﺍﺪﻋﻼﻟ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﺝﺮﺨﻣ ﺪﻳﺪﺤﺗ -Emulation +ﺓﺎﻛﺎﺤﻣ ﺝﺮﺨﻤﻟﺍ ﺪﻳﺪﺤﺘﻟ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻑﺎﻘﻳﺍ/ﻞﻴﻐﺸﺗ -Vibration +ﺯﺍﺰﺘﻫﺍ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﺝﺮﺨﻣ ﺭﺎﻴﺘﺧﻻ ﺯﺍﺰﺘﻫﻻﺍ ﻑﺎﻘﻳﺍ/ﻞﻴﻐﺸﺗ ﺙﻮﺗﻮﻠﺒﻟﺍ ﻲﺒﺳﺍﻮﻴﻟﺍ ﻝﻮﺤﻤﻟ ﻙﺎﻤﻟﺍ ﻥﺍﻮﻨﻋ :ﻙﺎﻤﻟﺍ ﻥﺍﻮﻨﻋ ﻰﻟﺍ ﻢﻜﺤﺘﻟﺍ ﻥﺍﺮﺘﻗﺍ @@ -233,12 +233,12 @@ ID: ﻊﻧﺎﺻ ﻻ DS4. / DS3 ﻢﻜﺤﺘﻟﺍ ﺕﺍﺪﺣﻭ ﻊﻣ ﺎﻣﺎﻤﺗ ﺔﻘﻓﺍﻮﺘﻣ ﺙﻮﺗﻮﻠﺑ ﻝﻮﺤﻣ ﻥﻮﻜﻳ ﻥﺃ ﺐﺠﻳ DS4. / DS3 ﻢﻜﺤﺘﻟﺍ ﺕﺍﺪﺣﻭ ﻊﻣ ﺢﻴﺤﺻ ﻞﻜﺸﺑ ﺙﻮﺗﻮﻠﺑ ﻝﻮﺤﻣ ﻞﻤﻌﻳ ﻻ ﺪﻗ -Multitap Emulation +Multitap ﺓﺎﻫﺎﻀﻣ .ﺓﺭﺎﺘﺨﻣ ﺔﺒﻌﻟ ﻞﺟﺍ ﻦﻣ ﺕﺎﻛﺮﺤﺘﻟﺍ ﺓﺩﺪﻌﺘﻣ ﺓﺎﻛﺎﺤﻣ ﻑﺎﻘﻳﺇ / ﻞﻴﻐﺸﺗ ﺬﻔﻨﻤﻟﺍ ﻰﻠﻋ ﻲﻛﺎﺤﻤﻟﺍ ﺩﺪﻌﺘﻣ ﺮﻘﻧ ﻲﻛﺎﺤﻤﻟﺍ ﺩﺪﻌﺘﻣ ﺮﻘﻧ ﻞﺟﺍ ﻦﻣ ﺬﻔﻨﻣ ﺮﺘﺧﺍ -Fake DS3 Workaround -Some fake DS3s need a workaround, this option will enable it. +ﺔﻴﻤﻫﻭ DS3 ﻞﺣ +.ﺎﻬﻨﻜﻤﻴﺳ ﺭﺎﻴﺨﻟﺍ ﺍﺬﻫﻭ ، ﻞﻳﺪﺑ ﻞﺣ ﻰﻟﺇ ﺔﻔﻳﺰﻤﻟﺍ DS3s ﺾﻌﺑ ﺝﺎﺘﺤﺗ ﺐﻴﻠﻘﺘﻟﺍ FIELD ﺓﺎﻛﺎﺤﻣ .ﻲﺠﻳﺭﺪﺘﻟﺍ ﻮﻳﺪﻴﻔﻟﺍ ﻉﺎﺿﻭﺃ ﺖﺤﺗ ﺝﺭﺪﻨﺗ ﻲﺘﻟﺍ ﺏﺎﻌﻟﻸﻟ ﺡﻼﺻﺇ ﻦﻳﺪﻟﺍﻮﻟﺍ ﻞﻔﻗ ﺕﺍﺩﺍﺪﻋﺇ @@ -249,19 +249,19 @@ Some fake DS3s need a workaround, this option will enable it. .ﻦﻳﺪﻟﺍﻮﻟﺍ ﻞﻔﻗ ﻞﻴﻄﻌﺗ ﻢﺗ :ﺀﺎﻨﺒﻟﺍ ﺕﺍﺭﺎﻴﺧ .ﻩﺬﻫ ﺭﻭﺮﻤﻟﺍ ﺔﻤﻠﻛ ﻡﺍﺪﺨﺘﺳﺍ ﻦﻜﻤﻳ ﻻ - ﺄﻄﺧ -d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞﺻﺍﻮﺗ .ﺃﺰﺠﻣ s% VMC ﻒﻠﻣ +?%d ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞﺻﺍﻮﺗ .ﺃﺰﺠﻣ %s VMC ﻒﻠﻣ ﺕﻮﺼﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ -Sound Effects -Boot Sound +ﺔﻴﺗﻮﺻ ﺕﺍﺮﺛﺆﻣ +ﺪﻴﻬﻤﺘﻟﺍ ﺕﻮﺻ ﺔﻴﺗﻮﺼﻟﺍ ﺕﺍﺮﺛﺆﻤﻟﺍ ﻢﺠﺣ ﺪﻴﻬﻤﺘﻟﺍ ﺕﻮﺻ ﻢﺠﺣ ؟ﻮﻳﺪﻴﻔﻟﺍ ﻊﺿﻭ ﺮﻴﻴﻐﺗ ﺪﻴﻛﺄﺗ (HDD) ﺖﻗﺆﻤﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺏﺎﻌﻟﺃ ﺔﻤﺋﺎﻗ -Notifications -Config loaded from %s -Theme loaded from %s -Language loaded from %s -%s partition mounted. +ﺕﺍﺭﺎﻌﺷﺇ +%s ﻦﻣ ﻦﻳﻮﻜﺘﻟﺍ ﻞﻴﻤﺤﺗ ﻢﺗ +%s ﻦﻣ ﺔﻤﺴﻟﺍ ﻞﻴﻤﺤﺗ ﻢﺗ +%s ﻦﻣ ﺔﻠﻤﺤﻤﻟﺍ ﺔﻐﻠﻟﺍ +.%s ﻢﺴﻗ ﻞﻴﻤﺤﺗ ﻢﺗ ﺕﺍﺭﺎﻴﺨﻟﺍ .ﺔﺒﻌﻠﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﻆﻔﺣ ﻢﺗ .ﺕﺍﺩﺍﺪﻋﻹﺍ ﺔﻟﺍﺯﺇ ﺖﻤﺗ %s @@ -277,13 +277,13 @@ Language loaded from %s ﺭﺍﺪﺻﻻﺍ ﺭﻮﻄﻣ ﻒﺻﻭ -Block Devices +ﺮﻈﺤﻟﺍ ﺓﺰﻬﺟﺃ ﻢﻜﺤﺗ ﺕﺍﺩﺍﺪﻋﺇ -Turn on/off Block Device Manager. -Turn on/off Block Devices (e.g. USB). -USB Games -iLink Games -MX4SIO Games +Manager. Device Block ﻞﻴﻐﺸﺗ ﻑﺎﻘﻳﺇ / ﻞﻴﻐﺸﺘﺑ ﻢﻗ +.(USB ﻞﺜﻣ) ﺮﻈﺤﻟﺍ ﺓﺰﻬﺟﺃ ﻞﻴﻐﺸﺗ ﻑﺎﻘﻳﺇ / ﻞﻴﻐﺸﺘﺑ ﻢﻗ +USB ﺏﺎﻌﻟﺃ +iLink ﺏﺎﻌﻟﺃ +MX4SIO ﺏﺎﻌﻟﺃ PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_Portuguese_BR_r2134.lng b/lng/lang_Portuguese_BR_r2134.lng index 9df25e7e9..f4a868913 100644 --- a/lng/lang_Portuguese_BR_r2134.lng +++ b/lng/lang_Portuguese_BR_r2134.lng @@ -281,9 +281,9 @@ Dispositivos de entrada Configurações dos controles Ligue/desligue o gerenciador de dispositivos de entrada. Ligue/desligue dispositivos de entrada (ex: USB). -USB Games -iLink Games -MX4SIO Games +Jogos USB +Jogos iLink +Jogos MX4SIO Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_r2134.lng b/lng/lang_Portuguese_r2134.lng index 4692c43a8..763560fde 100644 --- a/lng/lang_Portuguese_r2134.lng +++ b/lng/lang_Portuguese_r2134.lng @@ -1,5 +1,5 @@ # Translation by danielb -# Last update: Sept. 2, 2021 +# Last update: Sept. 3, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese @@ -53,16 +53,16 @@ Por favor espere Erro ao carregar ID do jogo Ordenar automaticamente Erro ao carregar ficheiro de idioma -Debug Colors +Cores de depuração Comando não detectado, esperando... -Cover Art +Artes Ecrâ Panorâmico Desligar PS2 Carregando configurações A guardar configurações... Iniciar dispositivo Atualizar -BDM Start Mode +Modo de início BDM Modo de inicio para dispositivo HDD Modo de inicio para dispositivo Rede Modo de inicio para Aplicações @@ -99,7 +99,7 @@ Renomear Apagar Iniciar Definições de Visualização -Write Operations +Operações de escrita Lembrar último jogo executado Botão de Seleção Erro, o jogo está fragmentado @@ -168,7 +168,7 @@ Velocidade Ethernet e sistema Duplex 10Mbit Full-duplex 10Mbit Half-duplex Opções do GSM -GSM Selector +Seletor GSM Permitir que o GSM ative o modo de vídeo escolhido Modo de vídeo a ser ativado Ajuste horizontal @@ -180,7 +180,7 @@ Ajustar Overscan Saltar FMV Saltar vídeos Opções de Cheat -PS2RD Cheat Engine +Motor de cheat PS2RD Permite PS2RD Cheat Engine injetar código nos jogos. Modo da PS2RD Cheat Engine Auto-Selecionar ou Selecionar cheats de jogo @@ -205,7 +205,7 @@ Logo PS2 Exibido para um logotipo de disco válido que corresponde à região da consola. Configurar PADEMU Definições do Emulador de Comando -Pad Emulator +Emulador de comandos Ligar/Desligar o emulador para o jogo selecionado. Modo do Emulador de Comando Selecione o modo do Emulador de Comando. @@ -213,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Definições para a porta: Selecione a porta do Emulador de Comando para as definições. -Emulation +Emulação Ligar/Desligar o emulador para a porta selecionada. -Vibration +Vibração Ligar/Desligar vibração na porta selecionada. Endereço MAC do adaptador Bluetooth USB: Comando DS emparelhado ao endereço MAC: @@ -233,12 +233,12 @@ Sim Não O adaptador Bluetooth deve ser completamente compatível com comandos DS3/DS4. O adaptador Bluetooth pode não funcionar corretamente com comandos DS3/DS4. -Multitap Emulation +Emulação multitap Ligar/Desligar a emulação Multitap para o jogo selecionado Emulador Multitap na porta Selecionar porta para o emulador de Multitap. -Fake DS3 Workaround -Some fake DS3s need a workaround, this option will enable it. +Alternativa para comandos DS3 falsos +Alguns comandos DS3 falsos precisam de solução alternativa, esta opção ativa-a. Emular inversão de CAMPO Correção para jogos que apresentam falhas nos modos de vídeo progressivo. Definições do Controlo Parental @@ -251,17 +251,17 @@ Opções de compilação: Erro - esta password não pode ser usada. O ficheiro VMC %s está fragmentado. Continuar com o Cartão de Memoria na ranhura %d? Definições de Áudio -Sound Effects -Boot Sound +Efeitos sonoros +Sons de arranque Volume dos sons Volume do som de arranque Confirmar alteração do modo de vídeo? Cache da lista de jogos (HDD) -Notifications -Config loaded from %s -Theme loaded from %s -Language loaded from %s -%s partition mounted. +Notificações +Configuração carregada de %s +Tema carregado de %s +Tradução carregada de %s +Partição %s montada. Opções Configurações do jogo guardadas. %s configurações removidas. @@ -277,13 +277,13 @@ Gênero Data de lançamento Desenvolvedor Descrição -Block Devices +Dispositivos de entrada Configurações dos comandos -Turn on/off Block Device Manager. -Turn on/off Block Devices (e.g. USB). -USB Games -iLink Games -MX4SIO Games +Ligar/desligar o gestor de dispositivos de entrada. +Ligar/desligar dispositivos de entrada (Ex: USB). +Jogos USB +Jogos iLink +Jogos MX4SIO Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Russian_r2134.lng b/lng/lang_Russian_r2134.lng index 970ba18f1..b97967b4d 100644 --- a/lng/lang_Russian_r2134.lng +++ b/lng/lang_Russian_r2134.lng @@ -1,5 +1,5 @@ # Translated by druchapucha, frodosumkin, and Marsi4eg. -# Last update: Sept. 2, 2021 +# Last update: Sept. 3, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian @@ -281,9 +281,9 @@ Bluetooth-адаптер может плохо работать с контро Настройки контроллера Вкл/выкл Block Device Manager. Вкл/выкл устройства BDM (напр. USB). -USB Games -iLink Games -MX4SIO Games +Игры USB +Игры iLink +Игры MX4SIO Игры PS1 Режим показа игр PS1 POPSTARTER.ELF не найден в '%s'! diff --git a/lng/lang_Spanish_r2134.lng b/lng/lang_Spanish_r2134.lng index 8c9108951..a0d2fc574 100644 --- a/lng/lang_Spanish_r2134.lng +++ b/lng/lang_Spanish_r2134.lng @@ -281,9 +281,9 @@ Dispositivos de Entrada Ajustes de Mando Prender/Apagar Administrador de Dispositivo de Entrada. Prender/Apagar Dispositivos de Entrada (p.e. USB). -USB Games -iLink Games -MX4SIO Games +Juegos USB +Juegos iLink +Juegos MX4SIO Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! From c948c7582c27d02e987776cf04bad5c24f9b50ff Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 15 Sep 2021 15:02:51 -0700 Subject: [PATCH 250/269] update lang files --- lng/lang_Hebrew_r2134.lng | 295 ++++++++++++++++++++++++++++++++++++ lng/lang_SChinese_r2134.lng | 14 +- lng/lang_Swedish_r2134.lng | 8 +- 3 files changed, 306 insertions(+), 11 deletions(-) create mode 100644 lng/lang_Hebrew_r2134.lng diff --git a/lng/lang_Hebrew_r2134.lng b/lng/lang_Hebrew_r2134.lng new file mode 100644 index 000000000..810897c10 --- /dev/null +++ b/lng/lang_Hebrew_r2134.lng @@ -0,0 +1,295 @@ +# Translated by Gil Grant / גיל גרנט +# Last update: Sept. 15, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +Hebrew +שמור שינויים +חזרה +הגדרות רשת +הגדרות מתקדמות +<ללא ערכים> +ההגדרות נשמרו ב-%s +שגיאה בשמירת הגדרות! +יציאה +הגדרות +תפריט +משחקי USB +משחקי HDD +משחקי רשת +אפליקציות +ערכת נושא +שפה +המערכת תיכבה. +לצאת אל המסך הראשי? +לבטל עדכון? +%d: כונן דיסק קשיח לא זוהה. +%d: דיסק קשיח לא מפורמט. +%d: שגיאת הפעלה ברשת. +%d: לא זוהה מתאם רשת. +%d: לא ניתן להתחבר לשרת SMB. +%d: לא ניתן להיכנס לשרת SMB. +%d: לא ניתן לפתוח את תקיית השיתוף. +%d: לא ניתן להציג את תקיית השיתוף. +%d: לא ניתן להציג משחקים. +%d: שרת DHCP אינו זמין. +%d: אין חיבור לרשת. +פעיל +כבוי +אישור +בחר +ביטול +עיגול +איקס +רשימת משחקים +הגדרות משחק +הסר הגדרות משחק +מהירות שליטה +לאט +בינוני +מהר +תפריט ברירת מחדל +טען מהדיסק +המתן בבקשה. +שגיאה בעת טעינת מזהה המשחק. +מיון אוטומטי +שגיאה בטעינת קובץ השפה. +צבעי Debug +לא זוהה בקר, ממתין... +תמונות למשחקים +מסך רחב +כיבוי +טוען הגדרות... +שומר הגדרות... +הפעל את הרכיב +רענן +מצב USB +מצב HDD +מצב רשת +מצב אפליקציות +אוטומטי +ידני +הפעל את שרת ה-NBD +טוען את שרת ה-NBD... +שרת ה-NBD פועל... +הפעלת שרת ה-NBD נכשלה. +שרת ה-NBD נפרק... +נתיב IGR +צבע רקע +צבע טקסט +- שרת SMB - +סוג כתובת IP +סטטי +DHCP +כתובת IP +כתובת +מסכה-Subnet Mask +כניסה-Gateway +שרת DNS +Port +תקיית השיתוף +שם משתמש +סיסמא +<לא צוין> +סוג כתובת +IP +NetBIOS +אישור +הפריט יימחק לצמיתות, להמשיך? +שנה שם +מחק +הפעל +הגדרות תצוגה +הרשאות כתיבה +זכור משחק אחרון +כפתור הבחירה +שגיאה, המשחק מקוטע. +שגיאה, לא ניתן להריץ את הפריט. +בדוק שינויים +השאר ריק לאישור אורח. +קריאה מדויקת +מצב סינכרוני +נתק Syscalls +דלג על סרטונים +אמולציית DVD-DL +השבת IGR +שינויים בגודל יפרמטו את כרטיס הזיכרון הוירטואלי. +צור +התחל +שנה +בטל +אתחל +השתמש בגנרי +הגדר כרטיס זיכרון וירטואלי +שם +גודל +סטטוס +התקדמות +קיים קובץ VMC. +קובץ VMC לא חוקי, הגודל לא נכון. +יש ליצור קובץ VMC. +שגיאה בגישה ל- VMC %s. להמשיך עם כרטיס הזיכרון בחריץ %d? +רענון אוטומטי +אודות +מתכנתים +בקרת איכות +נתיב כונן ה-USB +מריץ קובץ ELF מותאם לאחר IGR +ערך בדקות, (0) כדי להשבית את העצירה +עצירת סיבוב דיסק קשיח אוטומטי +מצב וידאו +צבע דיאלוג +צבע נבחר +אפס צבעים +מידע +קובץ ELF מותאם +בחירת צבע +התחבר מחדש +השאר ריק כדי להציג תיקיות שיתוף. +נתיב תקיית השיתוף +מחק +רווח +אישור +מצב +חריץ כרטיס זיכרון וירטואלי 1 +חריץ כרטיס זיכרון וירטואלי 2 +מזהה משחק +מצב DMA +V-Sync +מצב 1 +מצב 2 +מצב 3 +מצב 4 +מצב 5 +מצב 6 +הגדר GSM +מצב חיבור ה-Ethernet +דופלקס-מלא 100Mbit +חצי-דופלקס 100Mbit +דופלקס-מלא 10Mbit +חצי-דופלקס 10Mbit +הגדרות GSM +בורר GSM +הפעלה/כיבוי של ה-GSM. +אלץ מצב תצוגה מותאם +H-POS +התאמה אופקית. +V-POS +התאמה אנכית. +סריקת מסך +התאמת סריקת מסך. +דלג על FMV +מדלג על סרטוני תנועה מלאים. +הגדרות צ'יטים +מנוע הצ'יט - PS2RD +אפשר למנוע הצ'יט PS2RD לבצע שינוים במשחק +מצב הצ'יט של PS2RD +בחר צי'טים אוטומטי או למשחק +בחירה אוטומטית של צ'יטים +בחר בצ'יטים למשחק +שגיאה: טעינת קובץ הצ'יט נכשלה. +לא נמצאו צ'יטים. +הורד ברירת מחדל +עדכון רשת +החלף רשומות קיימות +עדכון נכשל. +ההתחברות לשרת העדכון נכשלה. +העדכון הושלם. +העדכון בוטל. +להוריד הגדרות מהרשת? +הגדרות מותאמות +הורד ברירות מחדל +הפעלה אוטומטית בעוד %i s... +הפעלה אוטומטית +ערך בשניות, 0 כדי לבטל הפעלה אוטומטית +לוגו PS2 +תצוגת לוגו התואם את אזור המשחק. +הגדר אמולטור PADEMU +הגדרות האמולטור PADEMU +אמולטור Pad Emulator +הפעלה/כיבוי אמולטור למשחק הנבחר. +מצב אמולטור +בחר מצב אמולטור +בקר-DualShock3/4 USB +בקר-DualShock3/4 BT +הגדרות ל-Port: +בחר ב-Port להגדרה. +אמולציה +הפעלה/כיבוי של האמולטור עבור ה-Port הנבחר. +רטט +הפעלה/כיבוי רטט עבור Port האמולטור הנבחר. +כתובת ה-MAC של מתאם ה-Bluetooth USB +בקר DS מותאם לכתובת MAC: +תאם +תאם בקר DS +חבר בקר DS עם כתובת ה-MAC של מתאם ה-Bluetooth. +לא מחובר +מידע על מתאם ה-Bluetooth +הצג מידע נוסף ותכונות נתמכות. +HCI גרסת: +LMP גרסת: +מזהה יצרן: +תכונות נתמכות: +כן +לא +מתאם ה-Bluetooth צריך להיות תואם לחלוטין עם בקרי DS3/DS4. +מתאם ה-Bluetooth עשוי שלא לפעול כראוי עם בקרי DS3/DS4. +אמולציית Multitap +הפעלה/כיבוי של אמולציית Multitap למשחק הנבחר. +אמולציית Multitap ב-Port: +בחר בPort לאמולציית Multitap +פתרון לשלטי DS3 מזויפים +חלק משלטי DS3 המזויפים זקוקים לפתרון, אפשרות זו תאפשר זאת. +אמולציית FIELD Flipping +תיקון למשחקים שנשברים במצבי וידאו מתקדמים. +הגדרות בקרת הורים +סיסמא בקרת הורים +השאר ריק כדי להשבית את בקרת ההורים. +הזן סיסמת בקרת ההורים +סיסמת בקרת ההורים שגויה. +בקרת הורים מושבתת +אפשרויות בנייה: +שגיאה - לא ניתן להשתמש בסיסמה זו. +קובץ VMC %s מקוטע. להמשיך עם כרטיס זיכרון בחריץ %d? +הגדרות שמע +אפקטים +צליל אתחול +עוצמת אפקטים +עוצמת קול אתחול +האם לאשר שינויים? +רשימת משחקים מוטמנת (HDD) +התראות +הגדרות נטענו מ- %s +ערכת נושא נטענה מ- %s +שפה נטענה מ- %s +מחיצת %s מותקנת. +אפשרויות +הגדרות המשחק נשמרו. +ההגדרות %s הוסרו. +מחליף הגדרות תאימות קיימות של משחקים כשמופעל. +מצב הגדרות +גלובלי +לכל משחק +הכל +בחר הגדרות להסרה. +פורומים לתמיכה: +משחק +ז'אנר +יציאה +מפתח +תיאור +חסום התקנים +הגדרות בקר +הפעלה/כיבוי חסום מנהל התקן +הפעלה/כיבוי חסום התקנים (USB) +משחקי USB +משחקי iLink +משחקי MX4SIO +משחקי PS1 +משחקי PS1 +POPSTARTER.ELF לא נמצא ב- '%s'! +קובץ VCD '%s' לא נמצא! +אירעה שגיאה בעת שינוי שם הקובץ. +אירעה שגיאה בעת מחיקת הקובץ. +אל תקנו OPEN-PS2-LOADER (OPL), במקום זאת הורידו אותו בחינם בכתובת: +גירסת ifcaro OPL בכתובת psx-place.com +גרסת OPL Daily Builds (DB) בכתובת ps2-home.com diff --git a/lng/lang_SChinese_r2134.lng b/lng/lang_SChinese_r2134.lng index ba78d31c2..be4f6d038 100644 --- a/lng/lang_SChinese_r2134.lng +++ b/lng/lang_SChinese_r2134.lng @@ -1,5 +1,5 @@ # Translated by kane159 and eyu2007 -# Last update: Sept. 2, 2021 +# Last update: Sept. 9, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese @@ -278,12 +278,12 @@ Release Developer Description Block Devices -Controller Settings -Turn on/off Block Device Manager. -Turn on/off Block Devices (e.g. USB). -USB Games -iLink Games -MX4SIO Games +控制器设置 +打开/关闭块设备管理器。 +打开/关闭块设备(例如 USB)。 +USB 游戏 +iLink 游戏 +MX4SIO 游戏 PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Swedish_r2134.lng b/lng/lang_Swedish_r2134.lng index a76a0a01c..1a69d8003 100644 --- a/lng/lang_Swedish_r2134.lng +++ b/lng/lang_Swedish_r2134.lng @@ -1,5 +1,5 @@ # Translation by Lord_Flaya -# Last update: Sept. 2, 2021 +# Last update: Sept. 10, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish @@ -281,9 +281,9 @@ Blockera enheter Kontroll-inställningar Slå på/av Blockera enhetshaterare. Slå på/av Blockera enheter (T.ex USB). -USB Games -iLink Games -MX4SIO Games +USB Spel +iLink Spel +MX4SIO Spel PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! From da25d92605150ba04d544422fbc4f1c376c3c415 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 10 Oct 2021 09:18:19 -0700 Subject: [PATCH 251/269] update lang files --- lng/lang_Persian_r2134.lng | 58 +++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/lng/lang_Persian_r2134.lng b/lng/lang_Persian_r2134.lng index 7f900de24..2c603a930 100644 --- a/lng/lang_Persian_r2134.lng +++ b/lng/lang_Persian_r2134.lng @@ -1,5 +1,5 @@ # Translation by saeid0035 -# Last update: Sept. 2, 2021 +# Last update: Oct. 4, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian @@ -43,7 +43,7 @@ ETH یﺎﻫ یزﺎﺑ ﺎﻫ یزﺎﺑ ﺖﺴﻴﻟ ﺎﻫ یزﺎﺑ تﺎﻤﻴﻈﻨﺗ ﺕﺎﻤﻴﻈﻨﺗ ﻥﺩﺮﮐ ﮎﺎﭘ -Scrolling Speed +ﻝﻭﺮﮑﺳﺍ ﺖﻋﺮﺳ ﻪﺘﺴﻫآ ﻲﻟﻮﻤﻌﻣ ﻊﻳﺮﺳ @@ -53,16 +53,16 @@ Scrolling Speed هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ یزﺎﺑ ﻪﺳﺎﻨﺷ یراﺬﮔرﺎﺑ مﺎﮕﻨﻫ رد رﺎﻛدﻮﺧ نداد ﺐﻴﺗﺮﺗ ﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ نﺎﺑز ﻞﻴﺎﻓ یراﺬﮔرﺎﺑ مﺎﮕﻨﻫرد -Debug Colors +ﯽﯾﺎﺸﮔ ﻞﮑﺸﻣ ﯼﺎﻫ ﮓﻧﺭ ...ﺪﻴﻧﺎﻤﺑ ﺮﻈﺘﻨﻣ ﺪﺸﻧ اﺪﻴﭘ یﺮﻟﺮﺘﻨﻛ ﭻﻴﻫ -Cover Art +ﺭﻭﺎﮐ ﺮﯾﻮﺼﺗ هﺪﻴﺸﻛ ﻪﺤﻔﺻ ندﺮﻛ شﻮﻣﺎﺧ یﺪﻨﺑﺮﻜﻴﭘ یراﺬﮔرﺎﺑ لﺎﺣرد یﺪﻨﺑﺮﻜﻴﭘ هﺮﻴﺧذ لﺎﺣرد هﺪﻨﻨﻛ عوﺮﺷ هﺎﮕﺘﺳد یزﺎﺳ هزﺎﺗ -BDM Start Mode +BDM ﻉﻭﺮﺷ ﺖﻟﺎﺣ HDD هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ ETH هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ ﺎﻫ ﻪﻣﺎﻧﺮﺑ ﻮﻨﻣ نداد نﺎﺸﻧ @@ -99,7 +99,7 @@ NetBIOS ندﺮﻛ کﺎﭘ اﺮﺟا ﺮﮕﺸﻳﺎﻤﻧ تﺎﻤﻴﻈﻨﺗ -Write Operations +ﻦﺘﺷﻮﻧ ﺕﺎﯿﻠﻤﻋ هﺪﺷ مﺎﺟﻧا یزﺎﺑ ﻦﻳﺮﺧآ ﻦﺘﺷاد دﺎﻳ ﻪﺑ بﺎﺨﺘﻧا ی ﻪﻤﻛد ﺖﺳا ﻪﺘﺨﻳر ﻢﻫ ﻪﺑ یزﺎﺑ یﺎﻫ ﻞﻳﺎﻓ هﺪﻣآ دﻮﺟو ﻪﺑ ﻲﻠﻜﺸﻣ @@ -132,7 +132,7 @@ generic زا هدﺎﻔﺘﺳا هرﺎﺑرد نﺎﺴﻳﻮﻧ ﻪﻣﺎﻧرﺑ ﺖﻴﻔﻴﻛ ﺖﺴﺗ -BDM ﻲﺤﻴﺟﺮﺗ ﺮﻴﺴﻣ +BDM ﺮﯿﺴﻣ ﺪﻧﻮﺸﯿﭘ IGR زا ﺪﻌﺑ ﻲﺷرﺎﻔﺳ ELF ﻞﻳﺎﻓ یاﺮﺟا ﻦﻴﻳﺎﭘ ﺶﺧﺮﭼ یاﺮﺑ 0 ,ﻪﻘﻴﻗد رد راﺪﻘﻣ HDD رﺎﻛدﻮﺧ ﺶﺧﺮﭼ ﺶﻫﺎﻛ @@ -168,7 +168,7 @@ GSM یﺪﻨﺑﺮﻜﻴﭘ ﻒﻋﺎﻀﻣ ﺎﻠﻣﺎﻛ ﺖﻴﺑﺎﮕﻣ 01 ﻒﻋﺎﻀﻣ ﻪﻤﻴﻧ ﺖﻴﺑﺎﮕﻣ 01 GSM تﺎﻤﻴﻈﻨﺗ -GSM Selector +GSM ﻩﺪﻨﻨﮐ ﺏﺎﺨﺘﻧﺍ GSM ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ ﻦﺷور ﻲﺷرﺎﻔﺳ ﺮﮕﺸﻳﺎﻤﻧ ﻪﺑ رﺎﺒﺟا H ﺖﻴﻌﻘﻮﻣ @@ -180,7 +180,7 @@ V ﺖﻴﻌﻘﻮﻣ FMV زا نﺪﻳﺮﭘ ﺎﻫ ﻦﻴﺳ تﺎﻛ زا نﺪﻳﺮﭘ ﺐﻠﻘﺗ ﺪﻛ تﺎﻤﻴﻈﻨﺗ -PS2RD Cheat Engine +PS2RD ﺐﻠﻘﺗ ﺪﮐ ﺭﻮﺗﻮﻣ ﺪﻨﻛ ﭻﭘ ارﺎﻤﺷ یزﺎﺑ PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺎﺗ ﺪﻳراﺬﮕﺑ PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺖﻟﺎﺣ یزﺎﺑ ﺐﻠﻘﺗ ﺰﻣر ﻲﺘﺳد بﺎﺨﺘﻧا ﺎﻳ و رﺎﻛدﻮﺧ بﺎﺨﺘﻧا @@ -205,7 +205,7 @@ PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺖﻟﺎﺣ .ﺩﻮﺷ ﻰﻣ ﻩﺩﺍﺩ ﻥﺎﺸﻧ ﺪﻧﺭﺍﺩ ﻰﻧﺍﻮﺨﻤﻫ ﻝﻮﺴﻨﻛ ﻦﺠﻳﺭ ﺎﺑ ﻪﻛ ﻯﺮﺒﺘﻌﻣ ﻯﺎﻫ ﮏﺴﻳﺩ ﻯﺍﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ یﺪﻨﺑﺮﻜﻴﭘ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ تﺎﻤﻴﻈﻨﺗ -Pad Emulator +ﺪﭘ ﻢﯿﮔ ﺯﺎﺳ ﻪﯿﺒﺷ .هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ یزﺎﺑ یاﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ و نﺷور ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ﺖﻟﺎﺣ .ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ﺖﻟﺎﺣ بﺎﺨﺘﻧا @@ -213,9 +213,9 @@ USB ﻖﻴﺮﻃ زا 4/3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﺮﻟﺮﺘﻨﻛ ثﻮﺗﻮﻠﺑ ﻖﻴﺮﻃ زا 4/3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﺮﻟﺮﺘﻨﻛ :هﺎﮔرد یاﺮﺑ تﺎﻤﻴﻈﻨﺗ .ﺪﻴﻨﻛ بﺎﺨﺘﻧا تﺎﻤﻴﻈﻨﺗ یاﺮﺑ ار ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ هﺎﮔرد -Emulation +ﯼﺯﺎﺳ ﻪﯿﺒﺷ .هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ هﺎﮔرد یاﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ و ﻦﺷور -Vibration +ﺵﺯﺮﻟ .هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ هﺎﮔﺮد یاﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ی هﺮﺒﻳو ندﺮﻛ لﺎﻌﻓﺮﻴﻏ ﺎﻳ لﺎﻌﻓ :USB ثﻮﺗﻮﻠﺑ رﻮﺘﭘادآ سردآ ﮏﻣ :سردآ ﮏﻣ ﺎﺑ ﺖﺳا هﺪﺷ ﺖﻔﺟ ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﺮﻟﺮﺘﻨﻛ @@ -233,12 +233,12 @@ Vibration ﺮﻴﺧ .ﺪﺷﺎﺑ رﺎﮔزﺎﺳ 4 و 3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ ﺮﻟﺮﺘﻨﻛ ﺎﺑ ﻞﻣﺎﻛ ترﻮﺻ ﻪﺑ ﺪﻳﺎﺑ ثﻮﺗﻮﻠﺑ رﻮﺘﭘادآ .ﺪﻨﻜﻧ رﺎﻛ 4و 3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ ﺮﻟﺮﺘﻨﻛ ﺎﺑ ﺪﻳﺎﺷ ثﻮﺗﻮﻠﺑ رﻮﺘﭘادآ -Multitap Emulation +ﻪﺑﺮﺿ ﺪﻨﭼ ﺯﺎﺳ ﻪﯿﺒﺷ .هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ یزﺎﺑ یاﺮﺑ ﺪﻴﻠﻛ ﺪﻨﭼ نﺎﻣﺰﻤﻫ ندﺮﺸﻓ یزﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ و ﻦﺷور هﺎﮔرد رد ﺪﻴﻠﻛ ﺪﻨﭼ نﺎﻣﺰﻤﻫ ندﺮﺸﻓ یزﺎﺳ ﻪﻴﺒﺷ .ﺪﻴﻠﻛ ﺪﻨﭼ نﺎﻣﺰﻤﻫ ندﺮﺸﻓ یزﺎﺳ ﻪﻴﺒﺷ یاﺮﺑ هﺎﮔرد بﺎﺨﺘﻧا -Fake DS3 Workaround -Some fake DS3s need a workaround, this option will enable it. +DS3 ﯽﺒﻠﻘﺗ ﯼﺎﻫ ﺮﻟﺮﺘﻨﮐ ﻞﺣ ﻩﺍﺭ +.ﺪﻨﮑﯿﻣ ﻝﺎﻌﻓ ﺍﺭ ﻥﺁ ﻪﻨﯾﺰﮔ ﻦﯾﺍ ،ﺪﻧﺭﺍﺩ ﻞﺣ ﻩﺍﺭ ﮏﯾ ﻪﺑ ﺯﺎﯿﻧ 3 ﮎﻮﺷ ﻞﺋﻭﺩ ﯽﺒﻠﻘﺗ ﯼﺎﻫ ﻝﺮﺘﻨﮐ ﺯﺍ ﯽﻀﻌﺑ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ . ﺪﻧراد ﭻﻴﻠﮔ progressive ﻮﻳﺪﻳو ﺖﻟﺎﺣ رد ﻪﻛ ییﺎﻫ یزﺎﺑ ندﺮﻛ ﺖﺳرد ﻦﻳﺪﻟاو ﻞﻔﻗ تﺎﻤﻴﻈﻨﺗ @@ -251,17 +251,17 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ .دﻮﺷ هدﺎﻔﺘﺳا ﺪﻧاﻮﺘﻴﻤﻧ رﻮﺒﻋ ﺰﻣر ﻦﻳا - هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ?%d هﺎﮔرد ﻲﻜﻳﺰﻴﻓ ی ﻪﻈﻓﺎﺣ ﺎﺑ ﻪﻣادا .ﺖﺳا هﺪﺷ ﻲﮕﺘﺨﻳر ﻢﻬﺑ رﺎﭼد %s یزﺎﺠﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ اﺪﺻ تﺎﻤﻴﻈﻨﺗ -Sound Effects -Boot Sound +ﯽﺗﻮﺻ ﯼﺎﻫ ﻩﻮﻠﺟ +ﺕﻮﺑ ﯼﺍﺪﺻ ﻲﺗﻮﺻ یﺎﻫ هﻮﻠﺟ اﺪﺻ ﻪﺟرد تﻮﺑ یاﺪﺻ ی ﻪﺟرد >؟ﺪﻴﻨﻜﻴﻣ ﺪﻴﻳﺎﺗ ار ﻮﻳﺪﻳو ﺖﻟﺎﺣ ﺮﻴﻴﻐﺗ )HDD( ﺎﻫ یزﺎﺑ ﺖﺳﺮﻬﻓ ﺶﻛ -Notifications -Config loaded from %s -Theme loaded from %s -Language loaded from %s -%s partition mounted. +ﺎﻫ ﯽﻧﺎﺳﺭ ﻉﻼﻃﺍ +ﺪﺷ ﯼﺭﺍﺬﮔﺭﺎﺑ s% ﺯﺍ ﮓﯿﻔﻧﺎﮐ +ﺪﺷ ﯼﺭﺍﺬﮔﺭﺎﺑ s% ﺯﺍ ﻪﺘﺳﻮﭘ +ﺪﺷ ﯼﺭﺍﺬﮔﺭﺎﺑ s% ﺯﺍ ﻥﺎﺑﺯ +ﺪﺷ ﺐﺼﻧ s% ﻦﺸﯿﺗﺭﺎﭘ ﺎﻫ ﻪﻨﯾﺰﮔ ﺪﺷ ﻩﺮﻴﺧﺫ ﻯﺯﺎﺑ ﺕﺎﻤﻴﻈﻨﺗ %s ﺪﺷ ﮎﺎﭘ %s ﺕﺎﻤﻴﻈﻨﺗ @@ -277,13 +277,13 @@ Language loaded from %s ﻪﺿﺮﻋ ﺦﻳﺭﺎﺗ ﻩﺪﻧﺯﺎﺳ ﺕﺎﺤﻴﺿﻮﺗ -Block Devices -Controller Settings -Turn on/off Block Device Manager. -Turn on/off Block Devices (e.g. USB). -USB Games -iLink Games -MX4SIO Games +ﮎﻮﻠﺑ ﻩﺎﮕﺘﺳﺩ +ﺮﻟﺮﺘﻨﮐ ﺕﺎﻤﯿﻈﻨﺗ +ﺎﻫ ﮎﻮﻠﺑ ﻩﺎﮕﺘﺳﺩ ﺖﯾﺮﯾﺪﻣ ﻥﺩﺮﮐ ﺵﻮﻣﺎﺧ ﺎﯾ ﻭ ﻦﺷﻭﺭ +(...ﻝﺎﺜﻣ ﺭﻮﻄﺑ ﺶﻠﻓ) ﺎﻫ ﮎﻮﻠﺑ ﻩﺎﮕﺘﺳﺩ ﺖﯾﺮﯾﺪﻣ ﻥﺩﺮﮐ ﺵﻮﻣﺎﺧ ﺎﯾ ﻭ ﻦﺷﻭﺭ +USB ﯼﺎﻫ ﯼﺯﺎﺑ +iLink ﯼﺎﻫ ﯼﺯﺎﺑ +MX4SIO ﯼﺎﻫ ﯼﺯﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ !'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ From 7d49951a9e91b5c8c21bc09afb6de0f4be0a392b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 10 Oct 2021 15:56:03 -0700 Subject: [PATCH 252/269] update lang files --- lng/lang_Persian_r2134.lng | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lng/lang_Persian_r2134.lng b/lng/lang_Persian_r2134.lng index 2c603a930..799200175 100644 --- a/lng/lang_Persian_r2134.lng +++ b/lng/lang_Persian_r2134.lng @@ -1,5 +1,5 @@ # Translation by saeid0035 -# Last update: Oct. 4, 2021 +# Last update: Oct. 10, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian @@ -106,7 +106,7 @@ NetBIOS ﺖﺴﻴﻧ ﺮﻳﺬﭘ نﺎﻜﻣا ﻢﺘﻳآ یاﺮﺟا هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ﺕﺍﺮﻴﻐﺗ ﺖﺴﺗ .ﺪﻳراﺬﮕﺑ ﻲﻟﺎﺧ سﺎﻨﺷﺎﻧ ترﻮﺻ ﻪﺑ دورو یاﺮﺑ -Accurate Reads +ﻖﯿﻗﺩ ﻥﺪﻧﺍﻮﺧ Synchronous ﺖﻟﺎﺣ Syscalls ندﺮﻛزﺎﺑ ﺎﻫ ﻮﻳﺪﻳو ندﺮﻛ در @@ -127,7 +127,7 @@ generic زا هدﺎﻔﺘﺳا ﺖﺳا دﻮﺟﻮﻣ یزﺎﺟﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ ﺖﺴﻴﻧ ﺖﺳرد هزاﺪﻧا ﺖﺳا ﺮﺒﺘﻌﻣﺎﻧ یزﺎﺟﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ دراد نﺪﺷ ﻪﺘﺧﺎﺳ ﻪﺑ زﺎﻴﻧ یزﺎﺟﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ -؟ﺪﻴﻫﺪﻴﻣ ﻪﻣادا %s هﺎﮔرد ﻰﻜﻳﺰﻴﻓ ﻪﻈﻓﺎﺣ ﺎﺑ .هﺪﻣﺁ ﺶﻴﭘ ﻰﻠﻜﺸﻣ %s ﻯﺯﺎﺠﻣ ﻪﻈﻓﺎﺣ ﻪﺑ ﻰﺳﺮﺘﺳﺩ رد +؟ﺪﻴﻫﺪﻴﻣ ﻪﻣادا %d هﺎﮔرد ﻰﻜﻳﺰﻴﻓ ﻪﻈﻓﺎﺣ ﺎﺑ .هﺪﻣﺁ ﺶﻴﭘ ﻰﻠﻜﺸﻣ %s ﻯﺯﺎﺠﻣ ﻪﻈﻓﺎﺣ ﻪﺑ ﻰﺳﺮﺘﺳﺩ رد رﺎﻛدﻮﺧ یزﺎﺳ هزﺎﺗ هرﺎﺑرد نﺎﺴﻳﻮﻧ ﻪﻣﺎﻧرﺑ @@ -154,7 +154,7 @@ ETH ﻲﺤﻴﺟﺮﺗ ﺮﻴﺴﻣ 2 یزﺎﺟﻣ ﻪﻈﻓﺎﺣ هﺎﮔرد یزﺎﺑ ﻪﺳﺎﻨﺷ DMA ﺖﻟﺎﺣ -V-Sync +ﻮﯾﺪﯾﻭ ﺥﺮﻧ ﯼﺯﺎﺳ ﻡﺎﮕﻤﻫ 1 ﺖﻟﺎﺣ 2 ﺖﻟﺎﺣ 3 ﺖﻟﺎﺣ @@ -258,10 +258,10 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ >؟ﺪﻴﻨﻜﻴﻣ ﺪﻴﻳﺎﺗ ار ﻮﻳﺪﻳو ﺖﻟﺎﺣ ﺮﻴﻴﻐﺗ )HDD( ﺎﻫ یزﺎﺑ ﺖﺳﺮﻬﻓ ﺶﻛ ﺎﻫ ﯽﻧﺎﺳﺭ ﻉﻼﻃﺍ -ﺪﺷ ﯼﺭﺍﺬﮔﺭﺎﺑ s% ﺯﺍ ﮓﯿﻔﻧﺎﮐ -ﺪﺷ ﯼﺭﺍﺬﮔﺭﺎﺑ s% ﺯﺍ ﻪﺘﺳﻮﭘ -ﺪﺷ ﯼﺭﺍﺬﮔﺭﺎﺑ s% ﺯﺍ ﻥﺎﺑﺯ -ﺪﺷ ﺐﺼﻧ s% ﻦﺸﯿﺗﺭﺎﭘ +ﺪﺷ ﯼﺭﺍﺬﮔﺭﺎﺑ %s ﺯﺍ ﮓﯿﻔﻧﺎﮐ +ﺪﺷ ﯼﺭﺍﺬﮔﺭﺎﺑ %s ﺯﺍ ﻪﺘﺳﻮﭘ +ﺪﺷ ﯼﺭﺍﺬﮔﺭﺎﺑ %s ﺯﺍ ﻥﺎﺑﺯ +ﺪﺷ ﺐﺼﻧ %s ﻦﺸﯿﺗﺭﺎﭘ ﺎﻫ ﻪﻨﯾﺰﮔ ﺪﺷ ﻩﺮﻴﺧﺫ ﻯﺯﺎﺑ ﺕﺎﻤﻴﻈﻨﺗ %s ﺪﺷ ﮎﺎﭘ %s ﺕﺎﻤﻴﻈﻨﺗ From e839141d52c4e5ba3d49c85a21b1c8b081a6f8af Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 30 Oct 2021 10:38:50 -0700 Subject: [PATCH 253/269] update lang files --- lng/lang_German_r2134.lng | 50 +++++++++++++++++++------------------- lng/lang_Turkish_r2134.lng | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/lng/lang_German_r2134.lng b/lng/lang_German_r2134.lng index b0c63ee1a..5833a85d7 100644 --- a/lng/lang_German_r2134.lng +++ b/lng/lang_German_r2134.lng @@ -1,12 +1,12 @@ # German Translation by ps2guy and LopoTRI -# Last update: Sept. 2, 2021 +# Last update: Oct. 30, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German Änderungen speichern Zurück Netzwerkeinstellungen -Fortgeschrittene Optionen +Erweiterte Optionen Einstellungen gespeichert in %s Fehler beim Schreiben der Einstellungen! @@ -53,7 +53,7 @@ Bitte warten Fehler beim Laden der Spiel-ID Automatische Sortierung Fehler beim Laden der Sprachdatei -Debug Colors +Debug Farben Kein Controller erkannt, warte... Cover Art Breitbild @@ -62,10 +62,10 @@ Lade Konfiguration Speichere Konfiguration Peripherie starten Aktual. -BDM Start Mode +BDM Start Modus HDD Start Modus ETH Start Modus -Anwendungen Menü Anzeigen +Menü -Anwendungen- Anzeigen Automatisch Manuell Starte NBD Server @@ -99,7 +99,7 @@ Umbenennen Löschen Ausführen Anzeige Einstellungen -Write Operations +Schreib Operatoren Merke zuletzt gespieltes Spiel Auswahltaste Fehler, das Spiel ist fragmentiert @@ -168,7 +168,7 @@ ETH Geschwindigkeitsmodus 10Mbit Full-duplex 10Mbit Half-duplex GSM Einstellungen -GSM Selector +GSM Auswählen Schaltet GSM AN oder AUS Erzwungener benutzerdefinierter Bildschirmmodus H-POS @@ -202,7 +202,7 @@ Automatischer Start in %i s... Automatischer Start Wert in Sekunden, 0 um Auto-start zu deaktivieren PS2 Logo -Wird für ein gültiges Disc-Logo angezeigt, dass der Region der Konsole entspricht. +Disc-Logo wird nur angezeigt, wenn es mit der Region der Konsole übereinstimmt. PADEMU konfigurieren Einstellungen Pad Emulator Pad Emulator @@ -235,10 +235,10 @@ Bluetooth Adapter ist voll kompatibel mit DS3/DS4 Controller. Bluetooth Adapter funktioniert evtl nicht korrekt mit DS3/DS4 Controller. Multitap Emulation Schaltet die Multitap emulation An/Aus für das ausgewählte Spiel. -Multitap emulator an Anschluss +Multitap Emulator an Anschluss Wähle Anschluss für Multitap emulation. -Fake DS3 Workaround -Some fake DS3s need a workaround, this option will enable it. +Fake DS3 Behelfslösung +Manche fake DS3s brauchen eine Umgehungslösung, diese option schaltet sie ein. Emuliere Feld-spiegelung Fix für Spiele, die Fehler unter progressivem Video modus haben. Einstellungen Kindersicherung @@ -251,17 +251,17 @@ Erstellungsoptionen: Fehler - Dieses Passwort kann nicht benutzt werden. VMC %s Datei ist fragmentiert. Weiter mit Memory Card in steckplatz %d? Audio Einstellungen -Sound Effects -Boot Sound +Soundeffekte +Startsound Lautstärke Soundeffekte Lautstärke Startsound Änderung des Video signals übernehmen? Spieleliste zwischenspeichern (HDD) -Notifications -Config loaded from %s -Theme loaded from %s -Language loaded from %s -%s partition mounted. +Benachrichtigungen +Konfiguration geladen von %s +Thema geladen von %s +Sprache geladen von %s +%s partition gemountet. Optionen Spiel-Einstellungen gespeichert. %s Einstellungen entfernt. @@ -277,15 +277,15 @@ Genre Veröffentlichung Entwickler Beschreibung -Block Devices +Blockspeichergeräte Controller einstellungen -Turn on/off Block Device Manager. -Turn on/off Block Devices (e.g. USB). -USB Games -iLink Games -MX4SIO Games +Schaltet Blockspeichergerät An/Aus +Schaltet Blockspeichergeräte An/Aus (bsp. USB) +USB Spiele +iLink Spiele +MX4SIO Spiele PS1 Spiele -PS1 Spiele Bildschirmeinstellungs-modus +Menü -PS1 Spiele- Anzeigen POPSTARTER.ELF nicht gefunden bei '%s'! VCD Datei '%s' nicht gefunden! Fehler beim umbenennen der Datei. diff --git a/lng/lang_Turkish_r2134.lng b/lng/lang_Turkish_r2134.lng index 015fd58e7..bd6a85a6d 100644 --- a/lng/lang_Turkish_r2134.lng +++ b/lng/lang_Turkish_r2134.lng @@ -1,5 +1,5 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: Sept. 2, 2021 +# Last update: Sept. 26, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish From b2d6d21c69109486f63d4a1f167155b346112a5d Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 10 Nov 2021 13:05:39 -0800 Subject: [PATCH 254/269] update lang files --- lng/lang_Polish_r2134.lng | 82 +++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/lng/lang_Polish_r2134.lng b/lng/lang_Polish_r2134.lng index 5d92b8e27..5adbdf9e4 100644 --- a/lng/lang_Polish_r2134.lng +++ b/lng/lang_Polish_r2134.lng @@ -1,5 +1,5 @@ # Translation by yohokaru -# Last update: Sept. 2, 2021 +# Last update: Oct. 17, 2021 # Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 # official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish @@ -43,7 +43,7 @@ X Lista Gier Ustawienia Gry Usuń Ustawienia -Scrolling Speed +Szybkość Przewijania Wolno Średnio Szybko @@ -51,28 +51,28 @@ Domyślne Menu Załaduj Z Dysku Proszę czekać. Błąd podczas ładowania identyfikatora gry. -Sortowanie Automatyczne +Automatyczne Sortowanie Błąd ładowania pliku językowego. -Debug Colors -Nie wykryto kontrolera, oczekiwanie... -Cover Art +Wyświetl Kolory Debugowania +Nie wykryto kontrolera, oczekiwanie… +Okładki Szeroki Ekran Wyłącz -Wczytywanie ustawień... -Zapisywanie ustawień... +Wczytywanie ustawień… +Zapisywanie ustawień… Uruchom Urządzenie Odśwież -BDM Start Mode -Uruchom Urządzenie HDD -Uruchom Urządzenie ETH +Uruchom BDM +Uruchom HDD +Uruchom ETH Wyświetl Menu Aplikacji Automatyczny Ręcznie Uruchom Serwer NBD -Uruchamianie Serwera NBD... -Serwer NBD uruchomiony... +Uruchamianie Serwera NBD… +Serwer NBD uruchomiony… Nieudane uruchomienie serwera NBD. -Serwer NBD zostanie zamknięty... +Serwer NBD zostanie zamknięty… Ścieżka Dla IGR Kolor Tła Kolor Tekstu @@ -99,7 +99,7 @@ Zmień Nazwę Usuń Uruchom Ustawienia Obrazu -Write Operations +Operacja Zapisu Zapamiętaj Ostatnio Uruchomioną Grę Przycisk Wyboru Błąd, gra jest pofragmentowana. @@ -108,7 +108,7 @@ Testuj Zmiany Pozostaw puste dla "GOŚCIA". Dokładny Odczyt Tryb Synchroniczny -Odepnij wywołania systemowe +Odepnij syscalle Pomiń Wstawki Filmowe Emuluj DVD-DL Wyłącz IGR @@ -128,7 +128,7 @@ Plik VMC istnieje. Błędny plik VMC, nieprawidłowy rozmiar. Plik VMC musi zostać utworzony. Błąd dostępu do VMC %s, kontynuuj z kartą pamięci w gnieździe %d? -Odświeżanie Automatyczne +Automatyczne Odświeżanie O Programie Programiści Kontrola Jakości @@ -146,7 +146,7 @@ Wybór Koloru Połącz Ponownie Pozostaw puste aby wyświetlić listę udziałów. Prefix Ścieżki ETH -"Cofnij " +Cofnij Odstęp Enter Tryb @@ -180,7 +180,7 @@ Regulacja overscanu. Pomiń FMV Pomija wstawki filmowe. Ustawienia Kodów -PS2RD Cheat Engine +Silnik Kodów PS2RD Pozwól silnikowi kodów PS2RD patchować grę. Tryb Silnika Kodów PS2RD Auto-wybieranie lub wybieranie kodów dla gry. @@ -198,14 +198,14 @@ Aktualizacja przerwana. Pobrać ustawienia z sieci? Dodatkowe Ustawienia Pobrano domyślne. -Auto start w %i s... +Auto start w %i s… Auto Start Wartość w sekundach, 0 wyłącza auto start. Logo PS2 Logo zostanie wyświetlone wyłącznie jeśli region gry i konsoli będzie taki sam. Konfiguracja Emulacji Pada Ustawienia Emulacji Pada -Pad Emulator +Emulacja Pada Włącza/wyłącza emulację Pada dla wybranej gry. Tryb Emulacji Pada Wybierz tryb emulacji Pada. @@ -213,9 +213,9 @@ DualShock3/4 USB DualShock3/4 BT Ustawienia Portu: Wybierz Port emulacji Pada dla ustawień. -Emulation +Emulacja Włącz/wyłącz emulację Pada dla wybranego portu. -Vibration +Wibracje Włącz/wyłącz wibracje dla wybranego portu emulacji Pada. Adres MAC adaptera Bluetooth USB: Kontroler DS sparowany z adresem MAC: @@ -233,12 +233,12 @@ Tak Nie Adapter Bluetooth powinien być w pełni kompatybilny z kontrolerami DS3/DS4. Adapter Bluetooth może nie współpracować poprawnie z kontrolerami DS3/DS4. -Multitap Emulation +Emulacja Multitapa Włącza/wyłącza emulację Multitapa dla wybranej gry. Emulacja Multitapa Dla Portu: Wybierz port dla emulacji Multitapa. -Fake DS3 Workaround -Some fake DS3s need a workaround, this option will enable it. +Poprawka Dla Klonów DS3 +Niektóre klony DS3 wymagają programowej poprawki, ta opcja ją włączy\wyłączy. Emuluj FIELD Flipping Poprawka dla gier w których występują usterki w trybie progresywnego obrazu. Ustawienia Blokady Rodzicielskiej @@ -251,18 +251,18 @@ Opcje Kompilacji: Błąd - to hasło nie może być użyte. Plik VMC %s jest pofragmentowany. Kontynuuj z kartą pamięci w gnieździe %d? Ustawienia Dźwiękowe -Sound Effects -Boot Sound +Efekty Dźwiękowe +Dźwięk Startowy Głośność Efektów Dźwiękowych Głośność Dźwięku Startowego Potwierdasz zmianę rozdzielczości? Buforowanie Listy Gier (HDD) -Notifications -Config loaded from %s -Theme loaded from %s -Language loaded from %s -%s partition mounted. -Options +Powiadomienia +Ustawienia załadowane z %s +Motyw załadowany z %s +Język załadowany z %s +Zamontowano partycję %s. +Opcje Ustawienia gry zostały zapisane. %s ustawienia zostały usunięte. Po włączeniu nadpisuje istniejące ustawienia kompatybilności z grami. @@ -277,13 +277,13 @@ Gatunek Data wydania Deweloper Opis -Block Devices -Controller Settings -Turn on/off Block Device Manager. -Turn on/off Block Devices (e.g. USB). -USB Games -iLink Games -MX4SIO Games +Urządzenia Blokowe +Ustawienia Kontrolera +Włącz/wyłącz menedżera urządzeń blokowych. +Włącz/wyłącz urządzenia blokowe (np. USB). +Gry USB +Gry iLink +Gry MX4SIO PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! From 3469ca4384d6a2b9cdf40a9fa12fd7e2f8843a56 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 10 Nov 2021 13:44:08 -0800 Subject: [PATCH 255/269] update lang files --- lng/lang_Polish_r2134.lng | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lng/lang_Polish_r2134.lng b/lng/lang_Polish_r2134.lng index 5adbdf9e4..65f9cb672 100644 --- a/lng/lang_Polish_r2134.lng +++ b/lng/lang_Polish_r2134.lng @@ -108,7 +108,7 @@ Testuj Zmiany Pozostaw puste dla "GOŚCIA". Dokładny Odczyt Tryb Synchroniczny -Odepnij syscalle +Odepnij wywołania systemowe Pomiń Wstawki Filmowe Emuluj DVD-DL Wyłącz IGR From 017b5e300a4120febcfbba78862d1df0fc50ddd9 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Sat, 13 Nov 2021 12:28:00 +0000 Subject: [PATCH 256/269] Merge remote-tracking branch 'ps2homebrew/master' --- Makefile | 32 ++++++++++++------------------- {misc => audio}/boot.adp | Bin {misc => audio}/cancel.adp | Bin {misc => audio}/confirm.adp | Bin {misc => audio}/cursor.adp | Bin {misc => audio}/message.adp | Bin {misc => audio}/transition.adp | Bin include/iosupport.h | 11 ++--------- src/OSDHistory.c | 10 +++++++++- src/appsupport.c | 15 +++++++++++++-- src/bdmsupport.c | 16 +++------------- src/ethsupport.c | 16 +++------------- src/hddsupport.c | 16 +++------------- src/opl.c | 22 +++++++++++++-------- src/supportbase.c | 34 ++++++++++++++++----------------- src/textures.c | 2 +- 16 files changed, 77 insertions(+), 97 deletions(-) rename {misc => audio}/boot.adp (100%) rename {misc => audio}/cancel.adp (100%) rename {misc => audio}/confirm.adp (100%) rename {misc => audio}/cursor.adp (100%) rename {misc => audio}/message.adp (100%) rename {misc => audio}/transition.adp (100%) diff --git a/Makefile b/Makefile index 093ed53b1..031e804c6 100755 --- a/Makefile +++ b/Makefile @@ -82,8 +82,9 @@ GFX_OBJS = usb_icon.o hdd_icon.o eth_icon.o app_icon.o elm_icon.o \ Scan_1080i.o Scan_1080i2.o Scan_1080p.o Vmode_multi.o Vmode_ntsc.o Vmode_pal.o \ poeveticanew.o icon_sys.o icon_icn.o -MISC_OBJS = icon_sys_A.o icon_sys_J.o icon_sys_C.o conf_theme_OPL.o \ - boot.o cancel.o confirm.o cursor.o message.o transition.o +AUDIO_OBJS = boot.o cancel.o confirm.o cursor.o message.o transition.o + +MISC_OBJS = icon_sys_A.o icon_sys_J.o icon_sys_C.o conf_theme_OPL.o IOP_OBJS = iomanx.o filexio.o ps2fs.o usbd.o bdmevent.o \ bdm.o bdmfs_vfat.o usbmass_bd.o iLinkman.o IEEE1394_bd.o mx4sio_bd.o \ @@ -96,7 +97,7 @@ IOP_OBJS = iomanx.o filexio.o ps2fs.o usbd.o bdmevent.o \ libsd.o audsrv.o EECORE_OBJS = ee_core.o ioprp.o util.o \ - elfldr.o udnl.o imgdrv.o eesync.o \ + udnl.o imgdrv.o eesync.o \ bdm_cdvdman.o IOPRP_img.o smb_cdvdman.o \ hdd_cdvdman.o hdd_hdpro_cdvdman.o cdvdfsv.o \ ingame_smstcpip.o smap_ingame.o smbman.o smbinit.o @@ -112,7 +113,7 @@ EE_ASM_DIR = asm/ MAPFILE = opl.map EE_LDFLAGS += -Wl,-Map,$(MAPFILE) -EE_LIBS = -L$(PS2SDK)/ports/lib -L$(GSKIT)/lib -L./lib -lgskit -ldmakit -lgskit_toolkit -lpoweroff -lfileXio -lpatches -ljpeg_ps2_addons -ljpeg -lpng -lz -ldebug -lm -lmc -lfreetype -lvux -lcdvd -lnetman -lps2ips -laudsrv -lpadx +EE_LIBS = -L$(PS2SDK)/ports/lib -L$(GSKIT)/lib -L./lib -lgskit -ldmakit -lgskit_toolkit -lpoweroff -lfileXio -lpatches -ljpeg_ps2_addons -ljpeg -lpng -lz -ldebug -lm -lmc -lfreetype -lvux -lcdvd -lnetman -lps2ips -laudsrv -lpadx -lelf-loader EE_INCS += -I$(PS2SDK)/ports/include -I$(PS2SDK)/ports/include/freetype2 -I$(GSKIT)/include -I$(GSKIT)/ee/dma/include -I$(GSKIT)/ee/gs/include -I$(GSKIT)/ee/toolkit/include -Imodules/iopcore/common -Imodules/network/common -Imodules/hdd/common -Iinclude BIN2C = $(PS2SDK)/bin/bin2c @@ -195,7 +196,7 @@ EE_CFLAGS += -fsingle-precision-constant -DOPL_VERSION=\"$(OPL_VERSION)\" # There are a few places where the config key/value are truncated, so disable these warnings EE_CFLAGS += -Wno-format-truncation -Wno-stringop-truncation -EE_OBJS += $(FRONTEND_OBJS) $(GFX_OBJS) $(MISC_OBJS) $(EECORE_OBJS) $(IOP_OBJS) +EE_OBJS += $(FRONTEND_OBJS) $(GFX_OBJS) $(AUDIO_OBJS) $(MISC_OBJS) $(EECORE_OBJS) $(IOP_OBJS) EE_OBJS := $(EE_OBJS:%=$(EE_OBJS_DIR)%) .SILENT: @@ -236,8 +237,6 @@ clean: rm -fr $(MAPFILE) $(EE_BIN) $(EE_BIN_PACKED) $(EE_BIN_STRIPPED) $(EE_VPKD).* $(EE_OBJS_DIR) $(EE_ASM_DIR) echo "-EE core" $(MAKE) -C ee_core clean - echo "-Elf Loader" - $(MAKE) -C elfldr clean echo "-IOP core" echo " -udnl-t300" $(MAKE) -C modules/iopcore/udnl-t300 clean @@ -361,13 +360,6 @@ ee_core/ee_core.elf: ee_core $(EE_ASM_DIR)ee_core.s: ee_core/ee_core.elf | $(EE_ASM_DIR) $(BIN2S) $< $@ eecore_elf -elfldr/elfldr.elf: elfldr - echo "-Elf Loader" - $(MAKE) -C $< - -$(EE_ASM_DIR)elfldr.s: elfldr/elfldr.elf | $(EE_ASM_DIR) - $(BIN2S) $< $@ elfldr_elf - $(UDNL_OUT): $(UDNL_SRC) echo "-IOP core" $(MAKE) -C $< @@ -929,22 +921,22 @@ $(EE_ASM_DIR)icon_sys_C.s: misc/icon_C.sys | $(EE_ASM_DIR) $(EE_ASM_DIR)conf_theme_OPL.s: misc/conf_theme_OPL.cfg | $(EE_ASM_DIR) $(BIN2S) $< $@ conf_theme_OPL_cfg -$(EE_ASM_DIR)boot.s: misc/boot.adp | $(EE_ASM_DIR) +$(EE_ASM_DIR)boot.s: audio/boot.adp | $(EE_ASM_DIR) $(BIN2S) $< $@ boot_adp -$(EE_ASM_DIR)cancel.s: misc/cancel.adp | $(EE_ASM_DIR) +$(EE_ASM_DIR)cancel.s: audio/cancel.adp | $(EE_ASM_DIR) $(BIN2S) $< $@ cancel_adp -$(EE_ASM_DIR)confirm.s: misc/confirm.adp | $(EE_ASM_DIR) +$(EE_ASM_DIR)confirm.s: audio/confirm.adp | $(EE_ASM_DIR) $(BIN2S) $< $@ confirm_adp -$(EE_ASM_DIR)cursor.s: misc/cursor.adp | $(EE_ASM_DIR) +$(EE_ASM_DIR)cursor.s: audio/cursor.adp | $(EE_ASM_DIR) $(BIN2S) $< $@ cursor_adp -$(EE_ASM_DIR)message.s: misc/message.adp | $(EE_ASM_DIR) +$(EE_ASM_DIR)message.s: audio/message.adp | $(EE_ASM_DIR) $(BIN2S) $< $@ message_adp -$(EE_ASM_DIR)transition.s: misc/transition.adp | $(EE_ASM_DIR) +$(EE_ASM_DIR)transition.s: audio/transition.adp | $(EE_ASM_DIR) $(BIN2S) $< $@ transition_adp $(EE_ASM_DIR)IOPRP_img.s: modules/iopcore/IOPRP.img | $(EE_ASM_DIR) diff --git a/misc/boot.adp b/audio/boot.adp similarity index 100% rename from misc/boot.adp rename to audio/boot.adp diff --git a/misc/cancel.adp b/audio/cancel.adp similarity index 100% rename from misc/cancel.adp rename to audio/cancel.adp diff --git a/misc/confirm.adp b/audio/confirm.adp similarity index 100% rename from misc/confirm.adp rename to audio/confirm.adp diff --git a/misc/cursor.adp b/audio/cursor.adp similarity index 100% rename from misc/cursor.adp rename to audio/cursor.adp diff --git a/misc/message.adp b/audio/message.adp similarity index 100% rename from misc/message.adp rename to audio/message.adp diff --git a/misc/transition.adp b/audio/transition.adp similarity index 100% rename from misc/transition.adp rename to audio/transition.adp diff --git a/include/iosupport.h b/include/iosupport.h index 8162833c1..659c5a315 100644 --- a/include/iosupport.h +++ b/include/iosupport.h @@ -96,18 +96,11 @@ typedef struct /// 0 = General refresh, which means that it will be refreshed every MENU_GENERAL_UPDATE_DELAY frames, regardless of whether automatic refresh is enabled or not. int updateDelay; - /// item description - char *text; - /// item description in localised form (used if value is not negative) int (*itemTextId)(void); - /// @return path to applications storage on the device (set callback to NULL if not applicable). - void (*itemGetAppsPath)(char *path, int max); - - void (*itemGetLegacyAppsPath)(char *path, int max); - - void (*itemGetLegacyAppsInfo)(char *path, int max, char *name); + /// @return path to device prefix (set callback to NULL if not applicable). + char *(*itemGetPrefix)(void); void (*itemInit)(void); diff --git a/src/OSDHistory.c b/src/OSDHistory.c index 956eed4c8..86206fd9d 100644 --- a/src/OSDHistory.c +++ b/src/OSDHistory.c @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include "include/util.h" #include "include/OSDHistory.h" @@ -124,7 +126,7 @@ static u16 GetTimestamp(void) int AddHistoryRecord(const char *name) { struct HistoryEntry HistoryEntries[MAX_HISTORY_ENTRIES], *NewEntry, OldHistoryEntry; - int i, value, LeastUsedRecord, LeastUsedRecordLaunchCount, LeastUsedRecordTimestamp, NewLaunchCount, result; + int i, value, LeastUsedRecord, LeastUsedRecordLaunchCount, LeastUsedRecordTimestamp, NewLaunchCount, result, mcType; u8 BlankSlotList[MAX_HISTORY_ENTRIES]; int NumBlankSlots, NumSlotsUsed, IsNewRecord; char SystemRegionLetter; @@ -132,6 +134,12 @@ int AddHistoryRecord(const char *name) DEBUG_PRINTF("Adding history record: %s\n", name); + // Don't write history for ps1 cards + mcGetInfo(0, 0, &mcType, 0, 0); + mcSync(0, NULL, &result); + if (mcType == sceMcTypePS1) + return -1; + // For simplicity, create the data folder immediately if the history file does not exist (unlike the original). sprintf(path, "mc0:/%s", GetSystemDataPath()); if ((result = LoadHistoryFile(path, HistoryEntries)) != 0) { diff --git a/src/appsupport.c b/src/appsupport.c index 5b4b3b7fb..976343e16 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -11,6 +11,8 @@ #include "include/ethsupport.h" #include "include/hddsupport.h" +#include + static int appForceUpdate = 1; static int appItemCount = 0; @@ -353,6 +355,8 @@ static void appLaunchItem(int id, config_set_t *configSet) { int mode, fd; const char *filename; + char partition[128]; + char *argv[1]; // Retrieve configuration set by appGetConfig() configGetStr(configSet, CONFIG_ITEM_STARTUP, &filename); @@ -361,13 +365,20 @@ static void appLaunchItem(int id, config_set_t *configSet) if (fd >= 0) { close(fd); + strcpy(partition, ""); + // To keep the necessary device accessible, we will assume the mode that owns the device which contains the file to boot. mode = oplPath2Mode(filename); if (mode < 0) mode = APP_MODE; // Legacy apps mode on memory card (mc?:/*) + if (mode == HDD_MODE) + snprintf(partition, sizeof(partition), "%s:", gOPLPart); + + argv[0] = (char *)filename; + deinit(UNMOUNT_EXCEPTION, mode); // CAREFUL: deinit will call appCleanUp, so configApps/cur will be freed - sysExecElf(filename); + LoadELFFromFileWithPartition(filename, partition, 1, argv); } else guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL); } @@ -464,6 +475,6 @@ static void appShutdown(void) } static item_list_t appItemList = { - APP_MODE, -1, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, APP_MODE_UPDATE_DELAY, "Applications", &appGetTextId, NULL, NULL, NULL, &appInit, &appNeedsUpdate, &appUpdateItemList, + APP_MODE, -1, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, APP_MODE_UPDATE_DELAY, &appGetTextId, NULL, &appInit, &appNeedsUpdate, &appUpdateItemList, &appGetItemCount, NULL, &appGetItemName, &appGetItemNameLength, &appGetItemStartup, &appDeleteItem, &appRenameItem, &appLaunchItem, &appGetConfig, &appGetImage, &appCleanUp, &appShutdown, NULL, &appGetIconId}; diff --git a/src/bdmsupport.c b/src/bdmsupport.c index 3ffe97ba4..de752668e 100644 --- a/src/bdmsupport.c +++ b/src/bdmsupport.c @@ -492,22 +492,12 @@ static int bdmCheckVMC(char *name, int createSize) return sysCheckVMC(bdmPrefix, "/", name, createSize, NULL); } -static void bdmGetAppsPath(char *path, int max) +static char *bdmGetPrefix(void) { - snprintf(path, max, "%sAPPS", bdmPrefix); -} - -static void bdmGetLegacyAppsPath(char *path, int max) -{ - snprintf(path, max, "%sconf_apps.cfg", bdmPrefix); -} - -static void bdmGetLegacyAppsInfo(char *path, int max, char *name) -{ - snprintf(path, max, "%sCFG/%s.cfg", bdmPrefix, name); + return bdmPrefix; } static item_list_t bdmGameList = { - BDM_MODE, 2, 0, 0, MENU_MIN_INACTIVE_FRAMES, BDM_MODE_UPDATE_DELAY, "BDM Games", &bdmGetTextId, &bdmGetAppsPath, &bdmGetLegacyAppsPath, &bdmGetLegacyAppsInfo, &bdmInit, &bdmNeedsUpdate, + BDM_MODE, 2, 0, 0, MENU_MIN_INACTIVE_FRAMES, BDM_MODE_UPDATE_DELAY, &bdmGetTextId, &bdmGetPrefix, &bdmInit, &bdmNeedsUpdate, &bdmUpdateGameList, &bdmGetGameCount, &bdmGetGame, &bdmGetGameName, &bdmGetGameNameLength, &bdmGetGameStartup, &bdmDeleteGame, &bdmRenameGame, &bdmLaunchGame, &bdmGetConfig, &bdmGetImage, &bdmCleanUp, &bdmShutdown, &bdmCheckVMC, &bdmGetIconId}; diff --git a/src/ethsupport.c b/src/ethsupport.c index 7b64cb76d..3bbb6d9ac 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -778,23 +778,13 @@ static int ethCheckVMC(char *name, int createSize) return sysCheckVMC(ethPrefix, "\\", name, createSize, NULL); } -static void ethGetAppsPath(char *path, int max) +static char *ethGetPrefix(void) { - snprintf(path, max, "%sAPPS", ethPrefix); -} - -static void ethGetLegacyAppsPath(char *path, int max) -{ - snprintf(path, max, "%sconf_apps.cfg", ethPrefix); -} - -static void ethGetLegacyAppsInfo(char *path, int max, char *name) -{ - snprintf(path, max, "%sCFG\\%s.cfg", ethPrefix, name); + return ethPrefix; } static item_list_t ethGameList = { - ETH_MODE, 1, 0, 0, MENU_MIN_INACTIVE_FRAMES, ETH_MODE_UPDATE_DELAY, "ETH Games", ðGetTextId, ðGetAppsPath, ðGetLegacyAppsPath, ðGetLegacyAppsInfo, ðInit, ðNeedsUpdate, + ETH_MODE, 1, 0, 0, MENU_MIN_INACTIVE_FRAMES, ETH_MODE_UPDATE_DELAY, ðGetTextId, ðGetPrefix, ðInit, ðNeedsUpdate, ðUpdateGameList, ðGetGameCount, ðGetGame, ðGetGameName, ðGetGameNameLength, ðGetGameStartup, ðDeleteGame, ðRenameGame, ðLaunchGame, ðGetConfig, ðGetImage, ðCleanUp, ðShutdown, ðCheckVMC, ðGetIconId}; diff --git a/src/hddsupport.c b/src/hddsupport.c index 7a8a35ada..b88eb932a 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -723,22 +723,12 @@ static int hddUpdateGameListCache(hdl_games_list_t *cache, hdl_games_list_t *gam return result; } -static void hddGetAppsPath(char *path, int max) +static char *hddGetPrefix(void) { - snprintf(path, max, "%sAPPS", gHDDPrefix); -} - -static void hddGetLegacyAppsPath(char *path, int max) -{ - snprintf(path, max, "%sconf_apps.cfg", gHDDPrefix); -} - -static void hddGetLegacyAppsInfo(char *path, int max, char *name) -{ - snprintf(path, max, "%sCFG/%s.cfg", gHDDPrefix, name); + return gHDDPrefix; } static item_list_t hddGameList = { - HDD_MODE, 0, 0, MODE_FLAG_COMPAT_DMA, MENU_MIN_INACTIVE_FRAMES, HDD_MODE_UPDATE_DELAY, "HDD Games", &hddGetTextId, &hddGetAppsPath, &hddGetLegacyAppsPath, &hddGetLegacyAppsInfo, &hddInit, &hddNeedsUpdate, &hddUpdateGameList, + HDD_MODE, 0, 0, MODE_FLAG_COMPAT_DMA, MENU_MIN_INACTIVE_FRAMES, HDD_MODE_UPDATE_DELAY, &hddGetTextId, &hddGetPrefix, &hddInit, &hddNeedsUpdate, &hddUpdateGameList, &hddGetGameCount, &hddGetGame, &hddGetGameName, &hddGetGameNameLength, &hddGetGameStartup, &hddDeleteGame, &hddRenameGame, &hddLaunchGame, &hddGetConfig, &hddGetImage, &hddCleanUp, &hddShutdown, &hddCheckVMC, &hddGetIconId}; diff --git a/src/opl.c b/src/opl.c index 8a77787f0..60ead6c92 100644 --- a/src/opl.c +++ b/src/opl.c @@ -417,8 +417,10 @@ int oplPath2Mode(const char *path) for (i = 0; i < MODE_COUNT; i++) { listSupport = list_support[i].support; - if ((listSupport != NULL) && (listSupport->itemGetAppsPath != NULL)) { - listSupport->itemGetAppsPath(appsPath, sizeof(appsPath)); + if ((listSupport != NULL) && (listSupport->itemGetPrefix != NULL)) { + char *prefix = listSupport->itemGetPrefix(); + snprintf(appsPath, sizeof(appsPath), "%sAPPS", prefix); + blkdevnameend = strchr(appsPath, ':'); if (blkdevnameend != NULL) { blkdevnamelen = (int)(blkdevnameend - appsPath); @@ -488,8 +490,9 @@ int oplScanApps(int (*callback)(const char *path, config_set_t *appConfig, void count = 0; for (i = 0; i < MODE_COUNT; i++) { listSupport = list_support[i].support; - if ((listSupport != NULL) && (listSupport->enabled) && (listSupport->itemGetAppsPath != NULL)) { - listSupport->itemGetAppsPath(appsPath, sizeof(appsPath)); + if ((listSupport != NULL) && (listSupport->enabled) && (listSupport->itemGetPrefix != NULL)) { + char *prefix = listSupport->itemGetPrefix(); + snprintf(appsPath, sizeof(appsPath), "%sAPPS", prefix); if ((pdir = opendir(appsPath)) != NULL) { while ((pdirent = readdir(pdir)) != NULL) { @@ -554,8 +557,9 @@ config_set_t *oplGetLegacyAppsConfig(void) for (i = MODE_COUNT - 1; i >= 0; i--) { listSupport = list_support[i].support; - if ((listSupport != NULL) && (listSupport->enabled) && (listSupport->itemGetLegacyAppsPath != NULL)) { - listSupport->itemGetLegacyAppsPath(appsPath, sizeof(appsPath)); + if ((listSupport != NULL) && (listSupport->enabled) && (listSupport->itemGetPrefix != NULL)) { + char *prefix = listSupport->itemGetPrefix(); + snprintf(appsPath, sizeof(appsPath), "%sconf_apps.cfg", prefix); fd = openFile(appsPath, O_RDONLY); if (fd >= 0) { @@ -582,8 +586,9 @@ config_set_t *oplGetLegacyAppsInfo(char *name) for (i = MODE_COUNT - 1; i >= 0; i--) { listSupport = list_support[i].support; - if ((listSupport != NULL) && (listSupport->enabled) && (listSupport->itemGetLegacyAppsInfo != NULL)) { - listSupport->itemGetLegacyAppsInfo(appsPath, sizeof(appsPath), name); + if ((listSupport != NULL) && (listSupport->enabled) && (listSupport->itemGetPrefix != NULL)) { + char *prefix = listSupport->itemGetPrefix(); + snprintf(appsPath, sizeof(appsPath), "%sCFG%s%s.cfg", prefix, i == ETH_MODE ? "\\" : "/", name); fd = openFile(appsPath, O_RDONLY); if (fd >= 0) { @@ -1778,6 +1783,7 @@ static void autoLaunchHDDGame(char *argv[]) LOG_ENABLE(); hddLoadModules(); + InitConsoleRegionData(); ret = configReadMulti(CONFIG_ALL); if (CONFIG_ALL & CONFIG_OPL) { diff --git a/src/supportbase.c b/src/supportbase.c index 8b0c0bf02..d1004c661 100644 --- a/src/supportbase.c +++ b/src/supportbase.c @@ -416,9 +416,6 @@ int sbReadList(base_game_info_t **list, const char *prefix, int *fsize, int *gam memset(*list, 0, sizeof(base_game_info_t) * count); while (size > 0) { - int ulfd = 1; - u8 part; - unsigned int name_checksum; base_game_info_t *g = &(*list)[id++]; // populate game entry in list even if entry corrupted @@ -435,20 +432,23 @@ int sbReadList(base_game_info_t **list, const char *prefix, int *fsize, int *gam g->media = GameEntry.media; g->format = GAME_FORMAT_USBLD; g->sizeMB = 0; - name_checksum = USBA_crc32(g->name); - - // TODO: size calculation is very slow - // implmented some caching, or do not touch at all - - // calculate total size for individual game - // for (part = 0; part < g->parts && ulfd >= 0; part++) { - // snprintf(path, sizeof(path), "%sul.%08X.%s.%02x", prefix, name_checksum, g->startup, part); - // ulfd = openFile(path, O_RDONLY); - // if (ulfd >= 0) { - // g->sizeMB += (getFileSize(ulfd) >> 20); - // close(ulfd); - // } - // } + + /* TODO: size calculation is very slow + implmented some caching, or do not touch at all */ + + //calculate total size for individual game + /*int ulfd = 1; + u8 part; + unsigned int name_checksum = USBA_crc32(g->name); + + for (part = 0; part < g->parts && ulfd >= 0; part++) { + snprintf(path, sizeof(path), "%sul.%08X.%s.%02x", prefix, name_checksum, g->startup, part); + ulfd = openFile(path, O_RDONLY); + if (ulfd >= 0) { + g->sizeMB += (getFileSize(ulfd) >> 20); + close(ulfd); + } + }*/ } } } diff --git a/src/textures.c b/src/textures.c index 27c57f2c5..67d17f6dd 100644 --- a/src/textures.c +++ b/src/textures.c @@ -530,7 +530,7 @@ static int texPngLoadAll(GSTEXTURE *texture, const char *filePath, int texId) png_set_tRNS_to_alpha(pngPtr); } - png_set_filler(pngPtr, 0x80, PNG_FILLER_AFTER); + png_set_filler(pngPtr, 0xff, PNG_FILLER_AFTER); png_read_update_info(pngPtr, infoPtr); void (*texPngReadPixels)(GSTEXTURE * texture, png_bytep * rowPointers, size_t size); From 9df27ddae49d9e934a75be58543167a23f1457b9 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Sat, 13 Nov 2021 15:49:50 +0000 Subject: [PATCH 257/269] Fixing --- Makefile | 11 +- include/bdmsupport.h | 5 - include/ethsupport.h | 3 - include/hddsupport.h | 3 - include/system.h | 1 - include/usbsupport.h | 30 --- src/bdmsupport.c | 21 -- src/elmsupport.c | 55 +++--- src/ethsupport.c | 7 - src/hddsupport.c | 7 - src/system.c | 53 ----- src/usbsupport.c | 453 ------------------------------------------- 12 files changed, 40 insertions(+), 609 deletions(-) delete mode 100644 include/usbsupport.h delete mode 100644 src/usbsupport.c diff --git a/Makefile b/Makefile index 031e804c6..623a489da 100755 --- a/Makefile +++ b/Makefile @@ -97,7 +97,7 @@ IOP_OBJS = iomanx.o filexio.o ps2fs.o usbd.o bdmevent.o \ libsd.o audsrv.o EECORE_OBJS = ee_core.o ioprp.o util.o \ - udnl.o imgdrv.o eesync.o \ + elfldr.o udnl.o imgdrv.o eesync.o \ bdm_cdvdman.o IOPRP_img.o smb_cdvdman.o \ hdd_cdvdman.o hdd_hdpro_cdvdman.o cdvdfsv.o \ ingame_smstcpip.o smap_ingame.o smbman.o smbinit.o @@ -237,6 +237,8 @@ clean: rm -fr $(MAPFILE) $(EE_BIN) $(EE_BIN_PACKED) $(EE_BIN_STRIPPED) $(EE_VPKD).* $(EE_OBJS_DIR) $(EE_ASM_DIR) echo "-EE core" $(MAKE) -C ee_core clean + echo "-Elf Loader" + $(MAKE) -C elfldr clean echo "-IOP core" echo " -udnl-t300" $(MAKE) -C modules/iopcore/udnl-t300 clean @@ -360,6 +362,13 @@ ee_core/ee_core.elf: ee_core $(EE_ASM_DIR)ee_core.s: ee_core/ee_core.elf | $(EE_ASM_DIR) $(BIN2S) $< $@ eecore_elf +elfldr/elfldr.elf: elfldr + echo "-Elf Loader" + $(MAKE) -C $< + +$(EE_ASM_DIR)elfldr.s: elfldr/elfldr.elf | $(EE_ASM_DIR) + $(BIN2S) $< $@ elfldr_elf + $(UDNL_OUT): $(UDNL_SRC) echo "-IOP core" $(MAKE) -C $< diff --git a/include/bdmsupport.h b/include/bdmsupport.h index c841a8e14..ad1370154 100644 --- a/include/bdmsupport.h +++ b/include/bdmsupport.h @@ -15,11 +15,6 @@ typedef struct vmc_spec_t specs; /* Card specifications */ } bdm_vmc_infos_t; -//START of OPL_DB tweaks -char *bdmGetPrefix(void); -char *bdmGetBase(void); -//END of OPL_DB tweaks - #define MAX_BDM_DEVICES 5 void bdmInit(); diff --git a/include/ethsupport.h b/include/ethsupport.h index 3f22fcb27..4cab9e5fb 100644 --- a/include/ethsupport.h +++ b/include/ethsupport.h @@ -15,9 +15,6 @@ typedef struct vmc_spec_t specs; /* Card specifications */ } smb_vmc_infos_t; -//START of OPL_DB tweaks -char *ethGetPrefix(void); -//END of OPL_DB tweaks void ethInit(void); // Full initialization (Start ETH + SMB and apply configuration). GUI must be already initialized, used by GUI to start SMB mode. void ethDeinitModules(void); // Module-only deinitialization, without the GUI's knowledge (for specific reasons, otherwise unused). int ethLoadInitModules(void); // Initializes Ethernet and applies configuration. diff --git a/include/hddsupport.h b/include/hddsupport.h index cbb7ddf94..e354d624e 100644 --- a/include/hddsupport.h +++ b/include/hddsupport.h @@ -48,9 +48,6 @@ typedef struct vmc_spec_t specs; /* Card specifications */ } hdd_vmc_infos_t; -//START of OPL_DB tweaks -char *hddGetPrefix(void); -//END of OPL_DB tweaks int hddCheck(void); u32 hddGetTotalSectors(void); int hddIs48bit(void); diff --git a/include/system.h b/include/system.h index b2df30193..e5d08abf7 100644 --- a/include/system.h +++ b/include/system.h @@ -20,7 +20,6 @@ int sysInitDECI2(void); void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx, int EnablePS2Logo, unsigned int compatflags); -int sysExecElf(const char *path); //START of OPL_DB tweaks int sysExecElfWithParam(char *path, char *param); //END of OPL_DB tweaks diff --git a/include/usbsupport.h b/include/usbsupport.h deleted file mode 100644 index cd5867b79..000000000 --- a/include/usbsupport.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __USB_SUPPORT_H -#define __USB_SUPPORT_H - -#include "include/iosupport.h" - -#define USB_MODE_UPDATE_DELAY MENU_UPD_DELAY_GENREFRESH - -#include "include/mcemu.h" - -typedef struct -{ - int active; /* Activation flag */ - u32 start_sector; /* Start sector of vmc file */ - int flags; /* Card flag */ - vmc_spec_t specs; /* Card specifications */ -} usb_vmc_infos_t; - -//START of OPL_DB tweaks -char *usbGetPrefix(void); -char *usbGetBase(void); -//END of OPL_DB tweaks - -#define MAX_USB_DEVICES 5 - -void usbInit(); -item_list_t *usbGetObject(int initOnly); -int usbFindPartition(char *target, const char *name, int write); -void usbLoadModules(void); - -#endif diff --git a/src/bdmsupport.c b/src/bdmsupport.c index de752668e..1555d8eac 100644 --- a/src/bdmsupport.c +++ b/src/bdmsupport.c @@ -16,9 +16,6 @@ #include // fileXioIoctl, fileXioDevctl static char bdmPrefix[40]; // Contains the full path to the folder where all the games are. -//START of OPL_DB tweaks -static char bdmBase[7]; -//END of OPL_DB tweaks static int bdmULSizePrev = -2; static time_t bdmModifiedCDPrev; static time_t bdmModifiedDVDPrev; @@ -32,18 +29,6 @@ static int mx4sioModLoaded = 0; // forward declaration static item_list_t bdmGameList; -//START of OPL_DB tweaks -char *bdmGetPrefix(void) -{ - return bdmPrefix; -} - -char *bdmGetBase(void) -{ - return bdmBase; -} -//END of OPL_DB tweaks - // Identifies the partition that the specified file is stored on and generates a full path to it. int bdmFindPartition(char *target, const char *name, int write) { @@ -65,9 +50,6 @@ int bdmFindPartition(char *target, const char *name, int write) sprintf(target, "mass%d:%s/", i, gBDMPrefix); else sprintf(target, "mass%d:", i); - //START of OPL_DB tweaks - sprintf(bdmBase, "mass%d:", i); - //END of OPL_DB tweaks close(fd); return 1; } @@ -78,9 +60,6 @@ int bdmFindPartition(char *target, const char *name, int write) sprintf(target, "mass0:%s/", gBDMPrefix); else sprintf(target, "mass0:"); - //START of OPL_DB tweaks - sprintf(bdmBase, "mass0:"); - //END of OPL_DB tweaks return 0; } diff --git a/src/elmsupport.c b/src/elmsupport.c index 10d327c98..f68057af0 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -316,6 +316,7 @@ static int elmScanVCDsHDD() static int elmUpdateItemList(void) { + item_list_t *tmp = NULL; elmItemCount = 0; //Clear game list first. @@ -323,9 +324,9 @@ static int elmUpdateItemList(void) elmGameListFree(); //Try HDD - if (hddGetObject(1)) { + if ((tmp = hddGetObject(1))) { //Eg: pfs0:POPS/POPSTARTER.ELF - snprintf(elmPathElfHdd, sizeof(elmPathElfHdd), "%sPOPS/POPSTARTER.ELF", hddGetPrefix()); + snprintf(elmPathElfHdd, sizeof(elmPathElfHdd), "%sPOPS/POPSTARTER.ELF", tmp->itemGetPrefix()); LOG("elmPathElfHdd = %s\n", elmPathElfHdd); //Check if POPSTARTER.ELF exists in the folder. @@ -339,34 +340,38 @@ static int elmUpdateItemList(void) } //Try ETH - if (ethGetObject(1)) { + if ((tmp = ethGetObject(1))) { //Eg: smb0:POPS/POPSTARTER.ELF - snprintf(elmPathElfEth, sizeof(elmPathElfEth), "%sPOPS/POPSTARTER.ELF", ethGetPrefix()); + snprintf(elmPathElfEth, sizeof(elmPathElfEth), "%sPOPS/POPSTARTER.ELF", tmp->itemGetPrefix()); LOG("elmPathElfEth = %s\n", elmPathElfEth); //Check if POPSTARTER.ELF exists in the folder. int fdElf = open(elmPathElfEth, O_RDONLY, 0666); if (fdElf >= 0) { close(fdElf); - elmItemCount += elmScanVCDs(ethGetPrefix()); + elmItemCount += elmScanVCDs(tmp->itemGetPrefix()); } else { LOG("POPSTARTER.ELF not found at %s", elmPathElfEth); } } - //Try USB - if (bdmGetObject(1)) { - //Eg: mass0:POPS/POPSTARTER.ELF - snprintf(elmPathElfBdm, sizeof(elmPathElfBdm), "%sPOPS/POPSTARTER.ELF", bdmGetBase()); - LOG("elmPathElfUsb = %s\n", elmPathElfBdm); - - //Check if POPSTARTER.ELF exists in the folder. - int fdElf = open(elmPathElfBdm, O_RDONLY, 0666); - if (fdElf >= 0) { - close(fdElf); - elmItemCount += elmScanVCDs(bdmGetBase()); - } else { - LOG("POPSTARTER.ELF not found at %s", elmPathElfBdm); + //Try BDM + if ((tmp = bdmGetObject(1))) { + char bdmPathBase[7]; //massX: + char bdmPathTest[40]; + int bdmFd, i; + for (i = 0; i < MAX_BDM_DEVICES; i++) { + snprintf(bdmPathBase, sizeof(bdmPathBase), "mass%d:", i); + snprintf(bdmPathTest, sizeof(bdmPathTest), "%sPOPS/POPSTARTER.ELF", bdmPathBase); + LOG("searching at: %s", bdmPathTest); + bdmFd = open(bdmPathTest, O_RDONLY, 0666); + if (bdmFd >= 0) { + LOG("Found!"); + strcpy(elmPathElfBdm, bdmPathTest); + close(bdmFd); + elmItemCount += elmScanVCDs(bdmPathBase); + break; + } } } @@ -610,9 +615,9 @@ static config_set_t *elmGetConfig(int id) if ((listSupport = hddGetObject(1))) { char path[256]; #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), cur->ID)); + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", listSupport->itemGetPrefix(), cur->ID)); #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), cur->ID); + snprintf(path, sizeof(path), "%sCFG/%s.cfg", listSupport->itemGetPrefix(), cur->ID); #endif config = configAlloc(1, NULL, path); ret = configRead(config); @@ -625,9 +630,9 @@ static config_set_t *elmGetConfig(int id) configFree(config); #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), cur->ID); + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", listSupport->itemGetPrefix(), cur->ID); #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(), cur->ID); + snprintf(path, sizeof(path), "%sCFG/%s.cfg", listSupport->itemGetPrefix(), cur->ID); #endif config = configAlloc(1, NULL, path); ret = configRead(config); @@ -640,9 +645,9 @@ static config_set_t *elmGetConfig(int id) configFree(config); #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", bdmGetPrefix(), cur->ID); + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", listSupport->itemGetPrefix(), cur->ID); #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", bdmGetPrefix(), cur->ID); + snprintf(path, sizeof(path), "%sCFG/%s.cfg", listSupport->itemGetPrefix(), cur->ID); #endif config = configAlloc(1, NULL, path); ret = configRead(config); @@ -713,6 +718,6 @@ static void elmShutdown(void) } static item_list_t elmItemList = { - ELM_MODE, -1, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", &elmGetTextId, NULL, NULL, NULL, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, + ELM_MODE, -1, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, &elmGetTextId, NULL, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, &elmGetItemCount, NULL, &elmGetItemName, &elmGetItemNameLength, &elmGetItemStartup, &elmDeleteItem, &elmRenameItem, &elmLaunchItem, &elmGetConfig, &elmGetImage, &elmCleanUp, &elmShutdown, NULL, &elmGetIconId}; diff --git a/src/ethsupport.c b/src/ethsupport.c index 3bbb6d9ac..1522c2cb3 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -43,13 +43,6 @@ static int ethReadNetConfig(void); static int ethInitSemaID = -1; -//START of OPL_DB tweaks -char *ethGetPrefix(void) -{ - return ethPrefix; -} - -//END of OPL_DB tweaks // Initializes locking semaphore for network support (not for just SMB support, but for the network subsystem). static int ethInitSema(void) { diff --git a/src/hddsupport.c b/src/hddsupport.c index b88eb932a..7b5693cb1 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -36,13 +36,6 @@ static hdl_games_list_t hddGames; // forward declaration static item_list_t hddGameList; -//START of OPL_DB tweaks -char *hddGetPrefix(void) -{ - return hddPrefix; -} - -//END of OPL_DB tweaks static int hddLoadGameListCache(hdl_games_list_t *cache); static int hddUpdateGameListCache(hdl_games_list_t *cache, hdl_games_list_t *game_list); diff --git a/src/system.c b/src/system.c index 7cb4398ae..bd6fb02e1 100644 --- a/src/system.c +++ b/src/system.c @@ -861,59 +861,6 @@ void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdv ExecPS2((void *)eh->entry, NULL, argc, argv); } -int sysExecElf(const char *path) -{ - u8 *boot_elf = NULL; - elf_header_t *eh; - elf_pheader_t *eph; - void *pdata; - int i; - char *elf_argv[2]; - char argv[256]; - int elf_argc = 1; - - // NB: ELFLDR.ELF is embedded - boot_elf = (u8 *)&elfldr_elf; - eh = (elf_header_t *)boot_elf; - if (_lw((u32)&eh->ident) != ELF_MAGIC) - while (1) - ; - - eph = (elf_pheader_t *)(boot_elf + eh->phoff); - - // Scan through the ELF's program headers and copy them into RAM, then - // zero out any non-loaded regions. - for (i = 0; i < eh->phnum; i++) { - if (eph[i].type != ELF_PT_LOAD) - continue; - - pdata = (void *)(boot_elf + eph[i].offset); - memcpy(eph[i].vaddr, pdata, eph[i].filesz); - - if (eph[i].memsz > eph[i].filesz) - memset(eph[i].vaddr + eph[i].filesz, 0, eph[i].memsz - eph[i].filesz); - } - - // Let's go. - fileXioExit(); - SifExitRpc(); - - elf_argv[0] = (char *)path; - - if (strncmp(path, "pfs", 3) == 0) { - snprintf(argv, sizeof(argv), "%s:%s", gOPLPart, elf_argv[0]); - elf_argv[1] = argv; - elf_argc++; - } - - FlushCache(0); - FlushCache(2); - - ExecPS2((void *)eh->entry, NULL, elf_argc, elf_argv); - - return 0; -} - //START of OPL_DB tweaks int sysExecElfWithParam(char *path, char *param) { diff --git a/src/usbsupport.c b/src/usbsupport.c deleted file mode 100644 index 3d1269cfc..000000000 --- a/src/usbsupport.c +++ /dev/null @@ -1,453 +0,0 @@ -#include "include/opl.h" -#include "include/lang.h" -#include "include/gui.h" -#include "include/supportbase.h" -#include "include/usb-ioctl.h" -#include "include/usbsupport.h" -#include "include/util.h" -#include "include/themes.h" -#include "include/textures.h" -#include "include/ioman.h" -#include "include/system.h" -#include "include/extern_irx.h" -#include "include/cheatman.h" -#include "modules/iopcore/common/cdvd_config.h" - -#define NEWLIB_PORT_AWARE -#include // fileXioIoctl, fileXioDevctl - -void *pusbd_irx = NULL; -int size_pusbd_irx = 0; - -static char usbPrefix[40]; //Contains the full path to the folder where all the games are. -//START of OPL_DB tweaks -static char usbBase[7]; -//END of OPL_DB tweaks -static int usbULSizePrev = -2; -static time_t usbModifiedCDPrev; -static time_t usbModifiedDVDPrev; -static int usbGameCount = 0; -static base_game_info_t *usbGames; - -// forward declaration -static item_list_t usbGameList; - -//START of OPL_DB tweaks -char *usbGetPrefix(void) -{ - return usbPrefix; -} - -char *usbGetBase(void) -{ - return usbBase; -} -//END of OPL_DB tweaks - -//Identifies the partition that the specified file is stored on and generates a full path to it. -int usbFindPartition(char *target, const char *name, int write) -{ - int i, fd; - char path[256]; - - for (i = 0; i < MAX_USB_DEVICES; i++) { - if (gUSBPrefix[0] != '\0') - sprintf(path, "mass%d:%s/%s", i, gUSBPrefix, name); - else - sprintf(path, "mass%d:%s", i, name); - if (write) - fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0666); - else - fd = open(path, O_RDONLY); - - if (fd >= 0) { - if (gUSBPrefix[0] != '\0') - sprintf(target, "mass%d:%s/", i, gUSBPrefix); - else - sprintf(target, "mass%d:", i); - //START of OPL_DB tweaks - sprintf(usbBase, "mass%d:", i); - //END of OPL_DB tweaks - close(fd); - return 1; - } - } - - // default to first partition (for themes, ...) - if (gUSBPrefix[0] != '\0') - sprintf(target, "mass0:%s/", gUSBPrefix); - else - sprintf(target, "mass0:"); - //START of OPL_DB tweaks - sprintf(usbBase, "mass0:"); - //END of OPL_DB tweaks - return 0; -} - -#define USBHDFSDFSV_FUNCNUM(x) (('U' << 8) | (x)) - -static unsigned int UsbGeneration = 0; - -static void usbEventHandler(void *packet, void *opt) -{ - UsbGeneration++; -} - -void usbLoadModules(void) -{ - LOG("USBSUPPORT LoadModules\n"); - //first search for a custom usbd module in MC? - pusbd_irx = readFile("mc?:BEDATA-SYSTEM/USBD.IRX", -1, &size_pusbd_irx); - if (!pusbd_irx) { - pusbd_irx = readFile("mc?:BADATA-SYSTEM/USBD.IRX", -1, &size_pusbd_irx); - if (!pusbd_irx) { - pusbd_irx = readFile("mc?:BIDATA-SYSTEM/USBD.IRX", -1, &size_pusbd_irx); - if (!pusbd_irx) { // If don't exist it uses embedded - pusbd_irx = (void *)&usbd_irx; - size_pusbd_irx = size_usbd_irx; - } - } - } - - sysLoadModuleBuffer(pusbd_irx, size_pusbd_irx, 0, NULL); - sysLoadModuleBuffer(&usbhdfsd_irx, size_usbhdfsd_irx, 0, NULL); - sysLoadModuleBuffer(&usbhdfsdfsv_irx, size_usbhdfsdfsv_irx, 0, NULL); - SifAddCmdHandler(0, &usbEventHandler, NULL); - - LOG("USBSUPPORT Modules loaded\n"); -} - -void usbInit(void) -{ - LOG("USBSUPPORT Init\n"); - usbULSizePrev = -2; - usbModifiedCDPrev = 0; - usbModifiedDVDPrev = 0; - usbGameCount = 0; - usbGames = NULL; - configGetInt(configGetByType(CONFIG_OPL), "usb_frames_delay", &usbGameList.delay); - usbGameList.enabled = 1; -} - -item_list_t *usbGetObject(int initOnly) -{ - if (initOnly && !usbGameList.enabled) - return NULL; - return &usbGameList; -} - -static int usbNeedsUpdate(void) -{ - char path[256]; - static unsigned int OldGeneration = 0; - static unsigned char ThemesLoaded = 0; - static unsigned char LanguagesLoaded = 0; - int result = 0; - struct stat st; - - if (usbULSizePrev != -2 && OldGeneration == UsbGeneration) - return 0; - OldGeneration = UsbGeneration; - - usbFindPartition(usbPrefix, "ul.cfg", 0); - - sprintf(path, "%sCD", usbPrefix); - if (stat(path, &st) != 0) - st.st_mtime = 0; - if (usbModifiedCDPrev != st.st_mtime) { - usbModifiedCDPrev = st.st_mtime; - result = 1; - } - - sprintf(path, "%sDVD", usbPrefix); - if (stat(path, &st) != 0) - st.st_mtime = 0; - if (usbModifiedDVDPrev != st.st_mtime) { - usbModifiedDVDPrev = st.st_mtime; - result = 1; - } - - if (!sbIsSameSize(usbPrefix, usbULSizePrev)) - result = 1; - - // update Themes - if (!ThemesLoaded) { - sprintf(path, "%sTHM", usbPrefix); - if (thmAddElements(path, "/", 1) > 0) - ThemesLoaded = 1; - } - - // update Languages - if (!LanguagesLoaded) { - sprintf(path, "%sLNG", usbPrefix); - if (lngAddLanguages(path, "/", usbGameList.mode) > 0) - LanguagesLoaded = 1; - } - - sbCreateFolders(usbPrefix, 1); - - return result; -} - -static int usbUpdateGameList(void) -{ - sbReadList(&usbGames, usbPrefix, &usbULSizePrev, &usbGameCount); - return usbGameCount; -} - -static int usbGetGameCount(void) -{ - return usbGameCount; -} - -static void *usbGetGame(int id) -{ - return (void *)&usbGames[id]; -} - -static char *usbGetGameName(int id) -{ - return usbGames[id].name; -} - -static int usbGetGameNameLength(int id) -{ - return ((usbGames[id].format != GAME_FORMAT_USBLD) ? ISO_GAME_NAME_MAX + 1 : UL_GAME_NAME_MAX + 1); -} - -static char *usbGetGameStartup(int id) -{ - return usbGames[id].startup; -} - -static void usbDeleteGame(int id) -{ - sbDelete(&usbGames, usbPrefix, "/", usbGameCount, id); - usbULSizePrev = -2; -} - -static void usbRenameGame(int id, char *newName) -{ - sbRename(&usbGames, usbPrefix, "/", usbGameCount, id, newName); - usbULSizePrev = -2; -} - -static void usbLaunchGame(int id, config_set_t *configSet) -{ - int i, fd, index, compatmask = 0; - int EnablePS2Logo = 0; - int result; - unsigned int start; - unsigned int startCluster; - char partname[256], filename[32]; - base_game_info_t *game = &usbGames[id]; - struct cdvdman_settings_usb *settings; - u32 layer1_start, layer1_offset; - unsigned short int layer1_part; - - char vmc_name[32], vmc_path[256], have_error = 0; - int vmc_id, size_mcemu_irx = 0; - usb_vmc_infos_t usb_vmc_infos; - vmc_superblock_t vmc_superblock; - - for (vmc_id = 0; vmc_id < 2; vmc_id++) { - memset(&usb_vmc_infos, 0, sizeof(usb_vmc_infos_t)); - configGetVMC(configSet, vmc_name, sizeof(vmc_name), vmc_id); - if (vmc_name[0]) { - have_error = 1; - if (sysCheckVMC(usbPrefix, "/", vmc_name, 0, &vmc_superblock) > 0) { - usb_vmc_infos.flags = vmc_superblock.mc_flag & 0xFF; - usb_vmc_infos.flags |= 0x100; - usb_vmc_infos.specs.page_size = vmc_superblock.page_size; - usb_vmc_infos.specs.block_size = vmc_superblock.pages_per_block; - usb_vmc_infos.specs.card_size = vmc_superblock.pages_per_cluster * vmc_superblock.clusters_per_card; - - sprintf(vmc_path, "%sVMC/%s.bin", usbPrefix, vmc_name); - - fd = open(vmc_path, O_RDONLY); - if (fd >= 0) { - if ((start = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_LBA, vmc_path)) != 0 && (startCluster = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_CLUSTER, vmc_path)) != 0) { - - // Check VMC cluster chain for fragmentation (write operation can cause damage to the filesystem). - if (fileXioDevctl("xmass0:", XUSBHDFSD_CHECK_CLUSTER_CHAIN, &startCluster, 4, NULL, 0) != 0) { - LOG("USBSUPPORT Cluster Chain OK\n"); - have_error = 0; - usb_vmc_infos.active = 1; - usb_vmc_infos.start_sector = start; - LOG("USBSUPPORT VMC slot %d start: 0x%X\n", vmc_id, start); - } else { - LOG("USBSUPPORT Cluster Chain NG\n"); - have_error = 2; - } - } - - close(fd); - } - } - } - - if (have_error) { - char error[256]; - if (have_error == 2) //VMC file is fragmented - snprintf(error, sizeof(error), _l(_STR_ERR_VMC_FRAGMENTED_CONTINUE), vmc_name, (vmc_id + 1)); - else - snprintf(error, sizeof(error), _l(_STR_ERR_VMC_CONTINUE), vmc_name, (vmc_id + 1)); - if (!guiMsgBox(error, 1, NULL)) { - return; - } - } - - for (i = 0; i < size_usb_mcemu_irx; i++) { - if (((u32 *)&usb_mcemu_irx)[i] == (0xC0DEFAC0 + vmc_id)) { - if (usb_vmc_infos.active) - size_mcemu_irx = size_usb_mcemu_irx; - memcpy(&((u32 *)&usb_mcemu_irx)[i], &usb_vmc_infos, sizeof(usb_vmc_infos_t)); - break; - } - } - } - - void **irx = &usb_cdvdman_irx; - int irx_size = size_usb_cdvdman_irx; - compatmask = sbPrepare(game, configSet, irx_size, irx, &index); - settings = (struct cdvdman_settings_usb *)((u8 *)irx + index); - for (i = 0; i < game->parts; i++) { - sbCreatePath(game, partname, usbPrefix, "/", i); - fd = open(partname, O_RDONLY); - if (fd >= 0) { - settings->LBAs[i] = fileXioIoctl(fd, USBMASS_IOCTL_GET_LBA, partname); - if ((startCluster = (unsigned int)fileXioIoctl(fd, USBMASS_IOCTL_GET_CLUSTER, partname)) == 0 || fileXioDevctl("xmass0:", XUSBHDFSD_CHECK_CLUSTER_CHAIN, &startCluster, 4, NULL, 0) == 0) { - - close(fd); - //Game is fragmented. Do not continue. - if (settings != NULL) - sbUnprepare(&settings->common); - - guiMsgBox(_l(_STR_ERR_FRAGMENTED), 0, NULL); - return; - } - - if ((gPS2Logo) && (i == 0)) - EnablePS2Logo = CheckPS2Logo(fd, 0); - - close(fd); - } else { - //Unable to open part of the game. Do not continue. - if (settings != NULL) - sbUnprepare(&settings->common); - guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL); - return; - } - } - - //Initialize layer 1 information. - sbCreatePath(game, partname, usbPrefix, "/", 0); - layer1_start = sbGetISO9660MaxLBA(partname); - - switch (game->format) { - case GAME_FORMAT_USBLD: - layer1_part = layer1_start / 0x80000; - layer1_offset = layer1_start % 0x80000; - sbCreatePath(game, partname, usbPrefix, "/", layer1_part); - break; - default: //Raw ISO9660 disc image; one part. - layer1_part = 0; - layer1_offset = layer1_start; - } - - if (sbProbeISO9660(partname, game, layer1_offset) != 0) { - layer1_start = 0; - LOG("DVD detected.\n"); - } else { - layer1_start -= 16; - LOG("DVD-DL layer 1 @ part %u sector 0x%lx.\n", layer1_part, layer1_offset); - } - settings->common.layer1_start = layer1_start; - - if ((result = sbLoadCheats(usbPrefix, game->startup)) < 0) { - switch (result) { - case -ENOENT: - guiWarning(_l(_STR_NO_CHEATS_FOUND), 10); - break; - default: - guiWarning(_l(_STR_ERR_CHEATS_LOAD_FAILED), 10); - } - } - - if (gRememberLastPlayed) { - configSetStr(configGetByType(CONFIG_LAST), "last_played", game->startup); - saveConfig(CONFIG_LAST, 0); - } - - if (configGetStrCopy(configSet, CONFIG_ITEM_ALTSTARTUP, filename, sizeof(filename)) == 0) - strcpy(filename, game->startup); - deinit(NO_EXCEPTION, USB_MODE); // CAREFUL: deinit will call usbCleanUp, so usbGames/game will be freed - - sysLaunchLoaderElf(filename, "USB_MODE", irx_size, irx, size_mcemu_irx, &usb_mcemu_irx, EnablePS2Logo, compatmask); -} - -static config_set_t *usbGetConfig(int id) -{ - return sbPopulateConfig(&usbGames[id], usbPrefix, "/"); -} - -static int usbGetImage(char *folder, int isRelative, char *value, char *suffix, GSTEXTURE *resultTex, short psm) -{ - char path[256]; - if (isRelative) - snprintf(path, sizeof(path), "%s%s/%s_%s", usbPrefix, folder, value, suffix); - else - snprintf(path, sizeof(path), "%s%s_%s", folder, value, suffix); - return texDiscoverLoad(resultTex, path, -1, psm); -} - -//This may be called, even if usbInit() was not. -static void usbCleanUp(int exception) -{ - if (usbGameList.enabled) { - LOG("USBSUPPORT CleanUp\n"); - - free(usbGames); - - // if ((exception & UNMOUNT_EXCEPTION) == 0) - // ... - } -} - -//This may be called, even if usbInit() was not. -static void usbShutdown(void) -{ - if (usbGameList.enabled) { - LOG("USBSUPPORT Shutdown\n"); - - free(usbGames); - } - - // As required by some (typically 2.5") HDDs, issue the SCSI STOP UNIT command to avoid causing an emergency park. - fileXioDevctl("mass:", USBMASS_DEVCTL_STOP_ALL, NULL, 0, NULL, 0); -} - -static int usbCheckVMC(char *name, int createSize) -{ - return sysCheckVMC(usbPrefix, "/", name, createSize, NULL); -} - -static void usbGetAppsPath(char *path, int max) -{ - snprintf(path, max, "%sAPPS", usbPrefix); -} - -static void usbGetLegacyAppsPath(char *path, int max) -{ - snprintf(path, max, "%sconf_apps.cfg", usbPrefix); -} - -static void usbGetLegacyAppsInfo(char *path, int max, char *name) -{ - snprintf(path, max, "%sCFG/%s.cfg", usbPrefix, name); -} - -static item_list_t usbGameList = { - USB_MODE, 2, 0, 0, MENU_MIN_INACTIVE_FRAMES, USB_MODE_UPDATE_DELAY, "USB Games", _STR_USB_GAMES, &usbGetAppsPath, &usbGetLegacyAppsPath, &usbGetLegacyAppsInfo, &usbInit, &usbNeedsUpdate, - &usbUpdateGameList, &usbGetGameCount, &usbGetGame, &usbGetGameName, &usbGetGameNameLength, &usbGetGameStartup, &usbDeleteGame, &usbRenameGame, - &usbLaunchGame, &usbGetConfig, &usbGetImage, &usbCleanUp, &usbShutdown, &usbCheckVMC, USB_ICON}; From da76f176516c4a6b451c0303f486d8d6db4e8aea Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Sun, 14 Nov 2021 12:50:53 +0000 Subject: [PATCH 258/269] Adjusting comments --- src/guigame.c | 8 +++++--- src/opl.c | 2 -- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/guigame.c b/src/guigame.c index f53a843cf..29d4ecf31 100644 --- a/src/guigame.c +++ b/src/guigame.c @@ -819,8 +819,8 @@ int guiGameSaveConfig(config_set_t *configSet, item_list_t *support) //START of OPL_DB tweaks char modesBuf[16]; //(1+2+3+4+5+6+7+8)= 15 +1 null int modesBufPos = 0; + //END of OPL_DB tweaks for (i = 0; i < COMPAT_MODE_COUNT; ++i) { - //END of OPL_DB tweaks int mdpart; diaGetInt(diaCompatConfig, COMPAT_MODE_BASE + i, &mdpart); compatMode |= (mdpart ? 1 : 0) << i; @@ -842,15 +842,17 @@ int guiGameSaveConfig(config_set_t *configSet, item_list_t *support) configRemoveKey(configSet, CONFIG_ITEM_DMA); } - //START of OPL_DB tweaks if (compatMode != 0) { result = configSetInt(configSet, CONFIG_ITEM_COMPAT, compatMode); + //START of OPL_DB tweaks configSetStr(configSet, CONFIG_ITEM_MODES, modesBuf); + //END of OPL_DB tweaks } else { configRemoveKey(configSet, CONFIG_ITEM_COMPAT); + //START of OPL_DB tweaks configRemoveKey(configSet, CONFIG_ITEM_MODES); + //END of OPL_DB tweaks } - //END of OPL_DB tweaks /// GSM /// diaGetInt(diaGSConfig, GSMCFG_ENABLEGSM, &EnableGSM); diff --git a/src/opl.c b/src/opl.c index 60ead6c92..38f6bacfe 100644 --- a/src/opl.c +++ b/src/opl.c @@ -128,9 +128,7 @@ static unsigned int frameCounter; static char errorMessage[256]; -//START of OPL_DB tweaks static opl_io_module_t list_support[MODE_COUNT]; -//END of OPL_DB tweaks // Global data char *gBaseMCDir; From 642fe4e954e269704d3cf6d85d1a609f12e8db52 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 14 Nov 2021 19:51:24 -0800 Subject: [PATCH 259/269] re-add deleted file --- elfldr/crt0.S | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 elfldr/crt0.S diff --git a/elfldr/crt0.S b/elfldr/crt0.S new file mode 100644 index 000000000..d6ca543c3 --- /dev/null +++ b/elfldr/crt0.S @@ -0,0 +1,127 @@ +# Copyright 2009-2010, Ifcaro, jimmikaelkael & Polo +# Copyright 2006-2008 Polo +# Licenced under Academic Free License version 3.0 +# Review OPNPS2LD README & LICENSE files for further details. +# +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# Modified crt0.s +# Remove _ps2sdk_args_parse, _ps2sdk_libc_init and _ps2sdk_libc_deinit weak functions for size optimization + +#define ABI_EABI64 // force all register names to EABI64 (legacy toolchain) +#include "as_reg_compat.h" + +.weak _init +.type _init, @function + +.weak _fini +.type _fini, @function + +.extern _heap_size +.extern _stack +.extern _stack_size + +.set noat +.set noreorder + +.text +.align 2 + + nop + nop + +.globl _start +.ent _start +_start: + +zerobss: + # clear bss area + + la $v0, _fbss + la $v1, _end + +1: + sltu $at, $v0, $v1 + beq $at, $zero, 2f + nop + sq $0, ($2) + addiu $v0, $v0, 16 + j 1b + nop +2: + +setupthread: + # setup current thread + + la $a0, _gp + la $a1, _stack + la $a2, _stack_size + la $a3, _args + la $t0, _root + move $gp, $a0 + addiu $v1, $zero, 60 + syscall # SetupThread(_gp, _stack, _stack_size, _args, _root) + move $sp, $v0 + + # initialize heap + la $a0, _end + la $a1, _heap_size + addiu $v1, $zero, 61 + syscall # SetupHeap(_end, _heap_size) + + # writeback data cache + move $a0, $zero + addiu $v1, $zero, 100 + syscall # FlushCache(0) + +ctors: + # call global constructors (weak) + la $t0, _init + beqz $t0, 1f + nop + jalr $t0 # _init() + nop +1: + # call main + la $v0, _args + lw $a0, ($v0) + jal main # main(argc, argv) + addiu $a1, $v0, 4 + + # call _exit + j _exit # _exit(retval) + move $a0, $v0 +.end _start + +.align 3 + +.globl _exit +.ent _exit +.text +_exit: + move $s0, $a0 # Preserve the return value. + +dtors: + # call global destructors (weak) + la $t0, _fini + beqz $t0, 1f + nop + jalr $t0 # _fini() + nop +1: + move $a0, $s0 + addiu $v1, $zero, 4 + syscall # Exit(retval) (noreturn) +.end _exit + +.ent _root +_root: + addiu $v1, $zero, 35 + syscall # ExitThread() (noreturn) +.end _root +.bss +.align 6 +_args: +.space 4+8*4+128 # argc, 16 arguments, 256 bytes payload From aa531a858c583104bfd577c4715339c8ce68d534 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 2 Jan 2022 14:36:52 -0800 Subject: [PATCH 260/269] update lang files --- lng/lang_Filipino_r2134.lng | 2 +- lng/lang_Slovak_r2134.lng | 295 ++++++++++++++++++++++++++++++++++++ 2 files changed, 296 insertions(+), 1 deletion(-) create mode 100644 lng/lang_Slovak_r2134.lng diff --git a/lng/lang_Filipino_r2134.lng b/lng/lang_Filipino_r2134.lng index 6bf7debd0..435ba5768 100644 --- a/lng/lang_Filipino_r2134.lng +++ b/lng/lang_Filipino_r2134.lng @@ -54,7 +54,7 @@ Nagkaroon ng error habang naglo-load ang ID ng Laro Awtomatikong pag-uuri Error sa paglo-load ng file na wika Debug na kulay -Controller Walang natukoy na , naghihintay… +Controller Walang natukoy na , naghihintay Cover Art Malapad na screen Power Off diff --git a/lng/lang_Slovak_r2134.lng b/lng/lang_Slovak_r2134.lng new file mode 100644 index 000000000..92b4623a0 --- /dev/null +++ b/lng/lang_Slovak_r2134.lng @@ -0,0 +1,295 @@ +# Translated by Samuel Kuchta +# Last update: Dec. 28, 2021 +# Updated for OPNPS2LD-v1.1.0-Beta-DB_all-2134-4f5adc5-2021-09-02 and OPNPS2LD-v1.1.0-Beta-ifcaro_all-1779-0265d2a-2021-09-02 +# official thread: https://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +Slovak +Uložiť Zmeny +Späť +Nastavenie Siete +Pokročilé Možnosti +<žiadne hodnoty> +Nastavenia boli uložené do %s +Chyba pri zápise nastavení! +Ukončiť Aplikáciu +Všeobecné nastavenia +Ponuka +BDM Hry +HDD Hry +ETH Hry +Aplikácie +Motív +Jazyk +Systém bude vypnutý. +Ukončiť a vrátiť sa do Prehliadača? +Zrušiť aktualizovanie? +%d: Pevný disk sa nenašiel. +%d: Pevný disk nie je naformátovaný. +%d: Chyba pri spúšťaní siete. +%d: Sieťový adaptér sa nenašiel. +%d: Nedá sa pripojiť k serveru SMB. +%d: Nedá sa prihlásiť na server SMB. +%d: Nedá sa otvoriť zdieľanie SMB. +%d: Nedájú sa vypísať zdieľané zložky SMB. +%d: Nedá sa vypísať zoznam hier. +%d: Server DHCP je nedostupný. +%d: Žiadne sieťové pripojenie. +Zap +Vyp +OK +Vybrať +Zrušiť +Kruh +Krížik +Zoznam Hier +Nastavenie Hry +Odstrániť Nastavenia +Rýchlosť Rolovania +Pomalá +Stredná +Rýchla +Predvolená Ponuka +Načítať Z Disku +Čakajte prosím. +Chyba pri načítaní ID hry. +Automatické Zoradenie +Chyba pri načítaní jazykového súboru. +Farby Pre Ladenie +Ovládač sa nenašiel, čakám… +Prebal +Širokouhlý Obraz +Vypnúť +Načítanie konfigurácie… +Ukladanie konfigurácie… +Spustiť Zariadenie +Obnoviť +Režim Spúšťania BDM +Režim Spúšťania Zariadenia HDD +Režim Spúšťania Zariadenia ETH +Režim Spúšťania Aplikácií +Automaticky +Manuálne +Spustiť Server NBD +Spúšťanie Servera NBD… +Server NBD beží… +Spustenie Servera NBD zlyhalo. +Vypínanie Servera NBD… +Cesta k ELF pri volaní IGR +Farba Pozadia +Farba Textu +- Server SMB - +Typ IP Adresy +Statická +DHCP +IP Adresa +Adresa +Maska +Brána +DNS Server +Port +Názov Zdieľania +Užívateľ +Heslo + +Typ Adresy +IP +NetBIOS +Prijať +Položka bude natrvalo zmazaná, pokračovať? +Premenovať +Vymazať +Spustiť +Nastavenie Obrazovky +Operácie Zápisu +Zapamätať Si Posledne Hranú Hru +Tlačidlo Výberu +Chyba, hra je fragmentovaná. +Chyba, položku nemožno spustiť. +Otestovať Zmeny +Nechajte prázdne pre povolenie účtu GUEST. +Presné Čítanie +Synchrónny Režim +Odpojiť Systémové Volania +Preskočiť Videá +Emulovať DVD-DL +Zakázať IGR +Zmenou veľkosti dôjde k preformátovaniu VMC. +Vytvoriť +Štart +Zmeniť +Zrušiť +Reset +Použiť Obecnú +Nastaviť VMC +Názov +Veľkosť +Stav +Postup +Súbor VMC existuje. +Neplatný súbor VMC, nesprávna veľkosť. +Je potrebné vytvoriť súbor VMC. +Chyba pri prístupe k VMC %s. Pokračovať s pamäťovou kartou v slote %d? +Automatické Obnovenie +O Aplikácii +Programátori +Zaistenie Kvality +Prefix Cesty k BDM +Spustí vlastný ELF po IGR. +Hodnota v minútach, 0 pre deaktiváciu funkcie +Automatické Vypnutie HDD +Video Režim +Farba Dialógového Okna +Farba Vybranej Položky +Obnoviť Farby +Info +Vlastné ELF +Výber Farby +Znovu Pripojiť +Pre výpis zdieľania ponechajte prázdne. +Prefix Cesty k ETH +Backspace +Medzera +Enter +Režim +Slot VMC 1 +Slot VMC 2 +ID hry +Režim DMA +Vertikálna Synchronizácia +Režim 1 +Režim 2 +Režim 3 +Režim 4 +Režim 5 +Režim 6 +Nastaviť GSM +Režim Pripojenia Ethernetu +100Mbit Úplný Duplex +100Mbit Polovičný Duplex +10Mbit Úplný Duplex +10Mbit Polovičný Duplex +Nastavenie GSM +Prepínač GSM +Zapína/Vypína GSM. +Vynútený užívateľský režim zobrazenia. +Horizontálna Pozícia +Horizontálna Úprava +Vertikálna Pozícia +Vertikálna Úprava +Prefotenie +Úprava Prefotenia. +Preskočiť FMV +Preskočí full motion videá +Nastavenie Cheatov +PS2RD Cheat Engine +Umožňuje PS2RD Cheat Engine opraviť vašu hru. +Režim PS2RD Cheat Engine +Automatický alebo užívateľský výber cheatov. +Automatický Výber Cheatov +Vybrať Cheaty Pre Hru +Chyba: nepodarilo sa načítať súbor s cheatmi. +Neboli nájdené žiadne cheaty. +Stiahnuť Predvolené nastavenia +Aktualizácia Cez Sieť +Prepísať Existujúce Záznamy +Aktualizácia Zlyhala. +Pripojenie k aktualizačnému serveru zlyhalo. +Aktualizácia dokončená. +Aktualizácia zrušená. +Stiahnuť nastavenia zo siete? +Vlastné Nastavenia +Stiahnuté Predvolené Nastavenia +Automatické spustenie za %i s… +Automatické Spustenie +Hodnota v sekundách, 0 pre deaktiváciu automatického spustenia. +Logo PS2 +Zobrazuje sa pre platné logo disku zodpovedajúce regiónu konzoly. +Nastaviť PADEMU +Nastavenie Emulátora Ovládača +Emulácia Ovládača +Zapne/Vypne Emulátor Ovládača pre vybranú hru. +Režim Emulátora Ovládače +Vyberte režim Emulátora Ovládača. +DualShock3/4 USB +DualShock3/4 BT +Nastavenia Pre Port: +Vyberte nastavenia pre port emulátora ovládača. +Emulácia +Zapne/Vypne Emulátor Ovládača pre vybraný port. +Vibrácie +Zapne/Vypne vibrácie pre vybraný port Emulátora Ovládača. +MAC adresa USB Bluetooth adaptéra: +DS ovládač spárovaný s MAC adresou: +Spárovať +Spárovať DS ovládač +Spárovať DS ovládač s MAC adresou Bluetooth adaptéra. +Nepripojené +Informácie o Bluetooth adaptéri +Zobrazuje ďalšie informácie a podporované funkcie. +Verzia HCI: +Verzia LMP: +ID Výrobcu: +Podporované Funkcie: +Áno +Nie +Bluetooth adaptér by mal byť plne kompatibilný s ovládačmi DS3/DS4. +Bluetooth adaptér nemusí správne fungovať s ovládačmi DS3/DS4. +Multitap Emulácia +Zapne/Vypne emuláciu Multitap pre vybranú hru. +Multitap Emulátor Na Porte: +Vyberte port pre emuláciu Multitap. +Riešenie Pre Neoriginálne DS3 +Niektoré neoriginálne DS3 vyžadujú špeciálny režim povolený touto voľbou. +Emulovať FIELD Flipping +Oprava pre hry, ktoré sa správajú nesprávne v režime progresívneho videa. +Nastavenie Rodičovského Zámku +Heslo Rodičovského Zámku +Ak chcete rodičovský zámok deaktivovať, ponechajte prázdne. +Zadajte Heslo Rodičovského Zámku +Nesprávne heslo rodičovského zámku. +Rodičovský zámok deaktivovaný. +Komponenty: +Chyba – toto heslo nemožno použiť. +Súbor VMC %s je fragmentovaný. Pokračovať s pamäťovou kartou v slote %d? +Nastavenie Zvuku +Zvukové Efekty +Zvuk Pri Spustení +Hlasitosť Zvukových Efektov +Hlasitosť Spúšťacieho Zvuku +Potvrdiť zmenu režimu videa? +Vyrovnávacia Pamäť Zoznamu Hier (HDD) +Oznámenia +Nastavenie načítané z %s +Motív načítaný z %s +Jazyk načítaný z %s +%s oddiel pripojený. +Možnosti +Nastavenie hry uložené. +Nastavenia %s boli odstránené. +Pri povolení prepíše existujúce nastavenia kompatibility hry. +Režim Nastavenia +Globálné +Jednotlivé +Všetko +Vyberte nastavenia, ktoré chcete odstrániť. +Fóra Podpory: +Titul +Žáner +Vydané +Vývojár +Popis +Blokové Zariadenia +Nastavenie Ovládača +Zapnutie/Vypnutie Správcu Blokových Zariadení. +Zapnutie/Vypnutie Blokových Zariadení (napr. USB). +USB hry +iLink hry +MX4SIO hry +PS1 Hry +Režim Zobrazenia PS1 Her +POPSTARTER.ELF nebol nájdený v '%s'! +Súbor VCD '%s' nebol nájdený! +Pri premenovaní súboru došlo k chybe. +Pri mazaní súboru došlo k chybe. +Nikdy nekupujte OPEN-PS2-LOADER (OPL), namiesto toho ho získajte zadarmo na: +ifcaro OPL verziu na psx-place.com +OPL Daily Builds (DB) Verziu na ps2-home.com From e4d3a2dbe62bbf8cbb8025a849e0d5801e6a27ff Mon Sep 17 00:00:00 2001 From: citronalco <2651739+citronalco@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:00:16 +0200 Subject: [PATCH 261/269] Change URL for OPL-Daily-Builds-lang repo --- download_lng.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download_lng.sh b/download_lng.sh index 539147c93..0741d9fb1 100755 --- a/download_lng.sh +++ b/download_lng.sh @@ -1,7 +1,7 @@ #!/bin/bash ## Download languages -REPO_URL="https://github.com/ps2homebrew/Open-PS2-Loader-lang" +REPO_URL="https://github.com/citronalco/OPL-Daily-Builds-lang" REPO_FOLDER="lng_src" BRANCH_NAME="main" if test ! -d "$REPO_FOLDER"; then From f130ccf136fc27f5f77093169d8113e8fcf07b17 Mon Sep 17 00:00:00 2001 From: citronalco <2651739+citronalco@users.noreply.github.com> Date: Tue, 26 Sep 2023 12:44:12 +0200 Subject: [PATCH 262/269] Fix merge mistake in include/lang.h --- include/lang.h | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/include/lang.h b/include/lang.h index dbf6a3274..48445d1b7 100644 --- a/include/lang.h +++ b/include/lang.h @@ -2,17 +2,6 @@ #define __LANG_H #include "lang_autogen.h" - // START of OPL_DB tweaks - _STR_ELM, - _STR_ELMMODE, - _STR_ELM_LAUNCH_POPSTARTER_NOTFOUND, - _STR_ELM_LAUNCH_VCD_NOTFOUND, - _STR_ELM_RENAME_ERROR, - _STR_ELM_DELETE_ERROR, - _STR_OPL_FREE, - _STR_OPL_IFCARO, - _STR_OPL_DB, - // END of OPL_DB tweaks // Maximum external languages supported #define MAX_LANGUAGE_FILES 15 From cf7215de60088b59c0b68a700eb02edfc4233d75 Mon Sep 17 00:00:00 2001 From: citronalco <2651739+citronalco@users.noreply.github.com> Date: Mon, 11 Sep 2023 12:43:34 +0200 Subject: [PATCH 263/269] add OPL-DB strings to translation template --- lng_tmpl/_base.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lng_tmpl/_base.yml b/lng_tmpl/_base.yml index 183e5e60a..f2a7b8b91 100644 --- a/lng_tmpl/_base.yml +++ b/lng_tmpl/_base.yml @@ -632,3 +632,21 @@ gui_strings: string: While button pressed - label: ACT_TOGGLED string: Toggled by button +- label: ELM + string: PS1 Games +- label: ELMMODE + string: PS1 Games Display Mode +- label: ELM_LAUNCH_POPSTARTER_NOTFOUND + string: POPSTARTER.ELF not found at '%s'! +- label: ELM_LAUNCH_VCD_NOTFOUND + string: VCD file '%s' not found! +- label: ELM_RENAME_ERROR + string: An error occurred while renaming the file. +- label: ELM_DELETE_ERROR + string: An error occurred while deleting the file. +- label: OPL_FREE + string: 'Never buy OPEN-PS2-LOADER (OPL), instead get it free at:' +- label: OPL_IFCARO + string: ifcaro OPL version at psx-place.com +- label: OPL_DB + string: OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file From c289f52433a2521338bb70ba72d22693d086b966 Mon Sep 17 00:00:00 2001 From: uyjulian Date: Fri, 11 Nov 2022 00:28:33 -0600 Subject: [PATCH 264/269] Modules including iomanX interfaces need to use iomanX imports --- modules/isofs/imports.lst | 4 ++-- modules/isofs/irx_imports.h | 2 +- modules/vmc/genvmc/imports.lst | 4 ++-- modules/vmc/genvmc/irx_imports.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/isofs/imports.lst b/modules/isofs/imports.lst index 3b83de333..dac68af26 100644 --- a/modules/isofs/imports.lst +++ b/modules/isofs/imports.lst @@ -5,13 +5,13 @@ I_SignalSema I_WaitSema thsemap_IMPORTS_end -ioman_IMPORTS_start +iomanX_IMPORTS_start I_open I_close I_read I_lseek I_AddDrv -ioman_IMPORTS_end +iomanX_IMPORTS_end sysclib_IMPORTS_start I_memset diff --git a/modules/isofs/irx_imports.h b/modules/isofs/irx_imports.h index e7ed7e731..325c8b60f 100644 --- a/modules/isofs/irx_imports.h +++ b/modules/isofs/irx_imports.h @@ -4,7 +4,7 @@ #include /* Please keep these in alphabetical order! */ -#include +#include #include #include #include diff --git a/modules/vmc/genvmc/imports.lst b/modules/vmc/genvmc/imports.lst index e433801d7..d4769889e 100644 --- a/modules/vmc/genvmc/imports.lst +++ b/modules/vmc/genvmc/imports.lst @@ -2,7 +2,7 @@ cdvdman_IMPORTS_start I_sceCdRC cdvdman_IMPORTS_end -ioman_IMPORTS_start +iomanX_IMPORTS_start I_DelDrv I_AddDrv I_open @@ -10,7 +10,7 @@ I_lseek I_write I_close I_remove -ioman_IMPORTS_end +iomanX_IMPORTS_end intrman_IMPORTS_start I_CpuSuspendIntr diff --git a/modules/vmc/genvmc/irx_imports.h b/modules/vmc/genvmc/irx_imports.h index 12dcbddb5..cee092e05 100644 --- a/modules/vmc/genvmc/irx_imports.h +++ b/modules/vmc/genvmc/irx_imports.h @@ -5,7 +5,7 @@ #include #include -#include +#include #include #ifdef DEBUG #include From d67daf76fc6229f1e6eaaee78c528436fd6b1633 Mon Sep 17 00:00:00 2001 From: uyjulian Date: Fri, 11 Nov 2022 00:29:01 -0600 Subject: [PATCH 265/269] lwnbdsvr/platform-ps2: include iomanX before redefining close() --- modules/network/lwnbdsvr/platform-ps2.h | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/network/lwnbdsvr/platform-ps2.h b/modules/network/lwnbdsvr/platform-ps2.h index a5e4b241d..4a2c6ab84 100644 --- a/modules/network/lwnbdsvr/platform-ps2.h +++ b/modules/network/lwnbdsvr/platform-ps2.h @@ -1,6 +1,7 @@ #include #include #include +#include #define assert(expr) \ ((expr) || \ From 15f47ab5fadbc301de5decf10158f7f8abf0b6b4 Mon Sep 17 00:00:00 2001 From: uyjulian Date: Sun, 12 Jun 2022 00:25:49 -0500 Subject: [PATCH 266/269] Replace usage of libkernel-nopatch with libkernel and strong symbols --- ee_core/Makefile | 2 +- ee_core/src/main.c | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ee_core/Makefile b/ee_core/Makefile index e11a97f3d..7a86efa85 100644 --- a/ee_core/Makefile +++ b/ee_core/Makefile @@ -53,7 +53,7 @@ ifeq ($(PADEMU),1) EE_CFLAGS += -DPADEMU endif -EE_LIBS += -lkernel-nopatch -lgcc +EE_LIBS += -lkernel -lgcc $(EE_OBJS_DIR)%.o : $(EE_SRC_DIR)%.c @mkdir -p $(EE_OBJS_DIR) diff --git a/ee_core/src/main.c b/ee_core/src/main.c index 9f38fff9a..406a34316 100644 --- a/ee_core/src/main.c +++ b/ee_core/src/main.c @@ -41,6 +41,13 @@ int PadMacroSettings; int EnableDebug; int *gCheatList; // Store hooks/codes addr+val pairs +// This function is defined as weak in ps2sdkc, so how +// we are not using time zone, so we can safe some KB +void _ps2sdk_timezone_update() {} + +DISABLE_PATCHED_FUNCTIONS(); // Disable the patched functionalities +DISABLE_EXTRA_TIMERS_FUNCTIONS(); // Disable the extra functionalities for timers + static int eecoreInit(int argc, char **argv) { int i = 0; From bda5f3c6c02062c01f3f823ff79a3a934ecb1283 Mon Sep 17 00:00:00 2001 From: citronalco <2651739+citronalco@users.noreply.github.com> Date: Tue, 26 Sep 2023 17:54:12 +0200 Subject: [PATCH 267/269] elfldr: apply changes similar to a98ee6b980b309daa05d6a4a7b8de2f309b5b8ae --- elfldr/Makefile | 2 +- elfldr/elfldr.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/elfldr/Makefile b/elfldr/Makefile index 50b89e8bb..251797ec7 100644 --- a/elfldr/Makefile +++ b/elfldr/Makefile @@ -5,7 +5,7 @@ EE_INCS := -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -I. EE_CFLAGS := -D_EE -O2 -mgpopt -G8192 -Wall $(EE_INCS) EE_LDFLAGS = -nostartfiles -Tlinkfile -L$(PS2SDK)/ee/lib -s -EE_LIBS += -lkernel-nopatch +EE_LIBS += -lkernel %.o : %.c $(EE_CC) $(EE_CFLAGS) $(EE_INCS) -c $< -o $@ diff --git a/elfldr/elfldr.c b/elfldr/elfldr.c index ee19ec9ba..a2ae3f9d1 100644 --- a/elfldr/elfldr.c +++ b/elfldr/elfldr.c @@ -19,6 +19,12 @@ #define ELF_MAGIC 0x464c457f #define ELF_PT_LOAD 1 +// This function is defined as weak in ps2sdkc, so how +// we are not using time zone, so we can safe some KB +void _ps2sdk_timezone_update() {} + +DISABLE_PATCHED_FUNCTIONS(); // Disable the patched functionalities +DISABLE_EXTRA_TIMERS_FUNCTIONS(); // Disable the extra functionalities for timers //------------------------------ typedef struct From 72e241a3849879625f88281e8969908636c8387b Mon Sep 17 00:00:00 2001 From: citronalco <2651739+citronalco@users.noreply.github.com> Date: Wed, 27 Sep 2023 10:51:20 +0200 Subject: [PATCH 268/269] Change CI build container to redsonbr/ps2dev:latest container was created from ps2dev as of 2023-03-23 --- .github/workflows/compilation.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/compilation.yml b/.github/workflows/compilation.yml index 245d99240..44c8bdc55 100644 --- a/.github/workflows/compilation.yml +++ b/.github/workflows/compilation.yml @@ -9,11 +9,11 @@ on: jobs: build: runs-on: ubuntu-latest - container: ps2dev/ps2dev:latest + container: redsonbr/ps2dev:latest steps: - name: Install dependencies run: | - apk add build-base git zip gawk python3 py3-pip bash + apk add build-base git zip gawk python3 py3-pip bash py3-yaml - name: git checkout uses: actions/checkout@v3 @@ -22,8 +22,8 @@ jobs: git config --global --add safe.directory "$GITHUB_WORKSPACE" git fetch --prune --unshallow - - name: Install Python packages - run: pip3 install -r requirements.txt + #- name: Install Python packages + # run: pip3 install -r requirements.txt - name: Compile -> make clean release run: make --trace clean release @@ -62,7 +62,7 @@ jobs: container: ps2dev/ps2dev:latest steps: - name: Install dependencies - run: apk add build-base git zip gawk python3 py3-pip bash + run: apk add build-base git zip gawk python3 py3-pip bash py3-yaml - name: git checkout uses: actions/checkout@v3 @@ -71,8 +71,8 @@ jobs: git config --global --add safe.directory "$GITHUB_WORKSPACE" git fetch --prune --unshallow - - name: Install Python packages - run: pip3 install -r requirements.txt + #- name: Install Python packages + # run: pip3 install -r requirements.txt - name: Get version id: version @@ -94,11 +94,11 @@ jobs: build-lang: runs-on: ubuntu-latest - container: ps2dev/ps2dev:latest + container: redsonbr/ps2dev:latest steps: - name: Install dependencies run: | - apk add build-base git zip gawk python3 py3-pip bash + apk add build-base git zip gawk python3 py3-pip bash py3-yaml - name: git checkout uses: actions/checkout@v3 @@ -107,8 +107,8 @@ jobs: git config --global --add safe.directory "$GITHUB_WORKSPACE" git fetch --prune --unshallow - - name: Install Python packages - run: pip3 install -r requirements.txt + #- name: Install Python packages + # run: pip3 install -r requirements.txt - name: Compile -> make download_lng languages run: make --trace download_lng languages @@ -130,10 +130,10 @@ jobs: matrix: debug: [debug, iopcore_debug, ingame_debug, deci2_debug] # eesio_debug broken runs-on: ubuntu-latest - container: ps2dev/ps2dev:latest + container: redsonbr/ps2dev:latest steps: - name: Install dependencies - run: apk add build-base git zip gawk python3 py3-pip bash + run: apk add build-base git zip gawk python3 py3-pip bash py3-yaml - name: git checkout uses: actions/checkout@v3 @@ -142,8 +142,8 @@ jobs: git config --global --add safe.directory "$GITHUB_WORKSPACE" git fetch --prune --unshallow - - name: Install Python packages - run: pip3 install -r requirements.txt + #- name: Install Python packages + # run: pip3 install -r requirements.txt - name: Get version id: version From 9d91e04cf037619252c43d418cd164373616593b Mon Sep 17 00:00:00 2001 From: Maximus32 Date: Mon, 6 Jun 2022 23:23:38 +0200 Subject: [PATCH 269/269] Fix: rename __NR__Exit to __NR_KExit --- ee_core/src/syshook.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ee_core/src/syshook.c b/ee_core/src/syshook.c index 59f70fa85..0fa24579a 100644 --- a/ee_core/src/syshook.c +++ b/ee_core/src/syshook.c @@ -180,8 +180,8 @@ void Install_Kernel_Hooks(void) SetSyscall(__NR__ExecPS2, &Hook_ExecPS2); } - Old_Exit = GetSyscallHandler(__NR__Exit); - SetSyscall(__NR__Exit, &Hook_Exit); + Old_Exit = GetSyscallHandler(__NR_KExit); + SetSyscall(__NR_KExit, &Hook_Exit); } /*----------------------------------------------------------------------------------------------*/ @@ -192,7 +192,7 @@ void Remove_Kernel_Hooks(void) { SetSyscall(__NR_SifSetDma, Old_SifSetDma); SetSyscall(__NR_SifSetReg, Old_SifSetReg); - SetSyscall(__NR__Exit, Old_Exit); + SetSyscall(__NR_KExit, Old_Exit); DI(); ee_kmode_enter();

Nul4YiYE_wl8@Zj*?bHMXE-@S8- zoiJQrnH1MbR$zaxh*ZyWt-V=GiT{5g zwOp+C-O!`-Z}<4(R4;Eo2<16_z@e^_qH@5ng+=jFd% zzEb1O>EqFrMp6R?T(TTju)&E?pVff)aitohI??LjhkMnF7#J6jN2(3(G!PvggCqDC zRij{y=WO99!oX7;Mf0wsR!1d^!{Bm>USSY09%B^Fy}_`Q7%~VMYuPQ;EEF1^G+`6QtWUD=g0yK5~BHrYDAK1H;vc z8tpUDWZKM2hAcsX6wIM0T8yM~U8e%+z3KUuT&~)l$+>hHSeLr_@+6jUf|{YlGDKY0 zW-Pw7@QcHH+nHK4Udp?W#}rVL5~kYXmq`U0C}ofP7Ux<2w>IK*@6m;ZbH znHOgYL8_k3r<*-qjCnyrkK$t$B#ZzLf+^q=TO>|UBBOJJWyF5g3JOGTeWJejo2|>A zz^w;=xP{#94|lqI%E)LD1YjM8WuemQk)AUJSHIZbn@#QI@9snhMN_etKKk=wI#LqP z7W}Ou@MC7y4?`AaJj#uVaeRl%=`(2~iwq{_i^&i67T*QpK);>a9>#j`ED&SDp)fB! zAu-^t9d9pd8^KDeT~dK)(2_Z-RfBS;T{>3bWNC0XcevKo#WfeMhxjKr?Y^qPQ zeO?77D0IS7gG<+EiL)gII;7alr)*_^T#Y*&K@5+NKsY`tZZE!#`Lr`Ra&$#*6pAdjD+wyU+i5aBBm@c$$5Ahj&X(Q>+!+7VyyC3iQ6k`Ukl+l3G7^wG+e1(x( zx}!m_#KzzxT^@1Jpo@U{`R-o3E##!Kw`o^Eq(ZLK6EN+DR_%7oi%$NJFE=TQTA$cD z`50eN8DkWvg4QG{BkrF{BBE;c%?#r`v=s~`$$!|RRovZkK+VPauJ@pXJ3TvJW|5)6 zfqXYXHV@Ycx%FW==EaO}3r+bn#M`n@PGAW6YF=_^hw~{h8rOhDZlJpPbSh{BN5V-Zk#_$NgWc=w4NV(C}YUP7^C!2bCM0q9a00$ z+?=#tFQ?BL8uq>}#Qkt*kd^9z6?1T&phXPECg+W>B$x<23Q}zhb2*;1S~@gmC3&Ke fgVhO6nSXS4`j?prY7V84!0y=bh2rP&|GfAQD`jU# literal 0 HcmV?d00001 diff --git a/misc/cursor.adp b/misc/cursor.adp new file mode 100644 index 0000000000000000000000000000000000000000..32a09b223051a1e3a477eb526c18f4ac4b6aaceb GIT binary patch literal 1872 zcmd7S&u<$=6bJA(>qIGayfd>&+LYj(-A#I+ir4nqZdEn5<2Xe^s*{w60|5dOaNx>+ z!hcW+#04Zun%*Ekp$DiF{|F#a$KG|E9*VQx-K1O^@3Ku>2`VZMT$sZfedjXL)BC*K zT)u!ffLlDAoDnc6;Q?72s6Z@4M?hpHU4y3EEI0Q8U-%j4G6h_lp(W|ZPw-`^I+h?t zvAUD7XT0!B(B)!B*A1e@2jyKYF%0-X0a1UWb|gldqB;y!T&U*nS)*Mqb>Q6}hK29d z5Z#VQ0(ZJaB7GpBnk~|44x=LfUHlS+%R=GKzP`xJ zG)#GvN0qpVvUNrD`(FVQWe)@1#^gq7@Jrk{vP&~S_oV5YOVK^T$_uj5rg$IWC_pqxxGpB=;AVU$ICNJ5@FXU& z(-6>Ls3IYZx3y4fIm0$$@P)PgGJc9#l!_0WUe_2ff z*--`zZ0JWe$waVUo`CG{d*bq0?FU_si{9QJl?M+bMMwrgk#M_^(?a5L*NUe`;KF(@ z7p-h%<0kp?BDxHYQ8}`xnsy3hTH()uz%8y#)i^;d(?>(-6rdFz_{OYGc^q(g-={b8 z%;&N9(D%8_c)A^?fy3Yq{Rf|sl9E}SZ~wx~mKoi+2rB6ysYIl0O&13t1z;U+Mx(U()aP-d z)Al+%(lbpX3E`66E)9wTId3VHHY3^37Al9nHz!y2chD<=M`R0rf9zA( z6~_0|l#4gc`#vS#=WcEGd7l*a(*_s%zxzyr(y(2uPkMnlGl2blWk?-omUomIS5$u% zU*uEWzpxz4Kk7%S5z&*{XXd_R~7gcfH9HuqXs r@^h3CYh&~CJFScwDTIBW{u&d(f0PQ>B5FTkm|!2OO$v`qKJW8S4&JBW literal 0 HcmV?d00001 diff --git a/misc/message.adp b/misc/message.adp new file mode 100644 index 0000000000000000000000000000000000000000..e37ae3f6f52a594046e826cc90e9955a239a0f70 GIT binary patch literal 17168 zcmeHt$#WZ5n&+1Z$`xS|xq_}Jn?PnF0m?OHVMze2!&n5dlNDo0BtiKy?Txa0nvO1S z*ZBixE_E%t+^#u|t)=9yzF1sDs;ei$B37#A&?1lvC|Asg$PJWxqD>%kKGk9Vfw_{w zV8n~$%Y5%!e&6r+-dDI5B#*L}=BwZ!99xvpMVqhIp3fVC!IpkWDQh|!z3vX0U zG+4VK+f*4OWn@p1QKHp%_(3}cy+}Ihs1YUO+Eh9dhd^^uyfLMniWPqQTPg;)n;sSA z)IOEwb+ZDmtY$l#Uj3TeqSkKk6|m{mYcX{qu9G{DFRjLb-~MV`j_ux?tX0WIumWp! zqZM4MPIc(g4Y?DCo=_rpz8jagJHMTjVsW^CbG%x2w!DpNf!0KcLyd2%(e;>SG9`Xz zGY*ps*Zg)|%(T9qUMcGp_-wM0?KUT?^%E;tyjFpb;}@^XwwWyRt;fMKq#3K{v4oYH z-+2mp321sTupPWU8s=pyS&qS4%l~{EiFT}gS=s^s|EAs90t0z5yQ>h$| z53l5OPd=en_%>B`%V3GDohMtTg;66&bjlD;>xXY=_a-Z(U69d#Ja-oyW>E?+SVE;s=BO9;raQLy`B7--~}fUYqiZ7~k6B2i<$jj5XG84_9O0 zZhJiG0YOD$-CzOdYk~|{t`9b^zOVPh3OHUmaPQ^o&lFDOdCp^s()b(5(Zaq{&s^_Q+ z>&9348~FZX$4IUoefG-r9~!2MV@baKbhX;{($Q4;KAJ#D#eQRSi1tjPvV-NkU#V-je#Uj!gRP4jN4L>X6<|i{ z>3gv|$0^ANyBCMl`-5h>9FWl2Yg4!5a4fl&z0*j=cD_qxaX%KVN|i@j(whNKVud&q z$UCR$XJ`RCU+U~vU@_Mj3kH!fHY4kUMg=I=me@O!4?`+dBH0R*M*YGs2Zt={3&v-N zccsBs=Q$@LYU7Rh`_J(ur-ti4tguBw7<$%I%b*`HYz|i7Cs5|r5RVs?oL)KaIQ7Y>7JrL zTv+cs#`(M_a@(^TPi}>a{v?X{cc{#_#v8m{47J5;aX7je=Cm>F9A4#rcZ&0kp)gQW z*LHhr7yLxF0yd#ED|`K-vAI~?iNlK@&S+P2?cgWmSBXpu@r&uGB8SlH+AL>RAb)N5>4!g6 zlk?s1^{M?h%;xqEql2x*+|JYbOfwEbRt;}-@8xrMkClUd1q%G<)U`*wLR`z&x~J&h zmv&Cm?Vfb-*=&9HaRtP|4ijp<@=@q8zpm49D7pKWv#sMrw<+>l!8oiRH7>`xkz%K} z65AS9pltLdazB~7+snkwd>qHYwR4TviuN(Hx0Q%P=*~lVs>#Tmh3kRd^L*7Wu9Csx zOZ`asQA>)$s1?a}_LZ0HV8#g+D=^qzD0hY_LQTreaS8E4&1YSqPBx{v-9EIdAALG`!PdSpg9eimmW36><9yI4%92To$pqkeLhX@j8`Ab!B_bY z_J*sRwK{X_{Kum?_&OYIQu6M1tMl#f$9x>17}eO=$P@^RfxzF2#{vG)I&n zB9abE8iXXJ#crz%hYUyXM%!mtMr7D~;s_NkHEx^jb9tin1`$YlsGb9BgP zy<`;}y^+sqN#14y&W>4yQs*>j1x3d93h`EY4mgV*`Ta?z>nVg7tAcBr(%|MqYgn2! zT)^*ju<~cK8J4|1>a$faOvhGLhTlmlAQJfg4rJPgoK5*YO%G zNiz}B5M-?ejef-0N@%?`(n}S~H5esh-Nkv078TxGJgGubaf1}?w|bqX=l7~$lW7vE zl9EFRmI(a5x7&!^y*UA1kCaC>Nb@ZZnBC9(2P)H<;8@A%=%(~JCmD?zH83+glkGxO zvTqLc|AO(-YWg(oQyDIr;guTH)7IK*0|d;`~8d_OAz1?ITDML9LF?MQ)VqIQJSRcjjG*Ya#H z#W753Rbrw`K&0kf%3qmtl&JJ+2<@ZMPV-*#=5f1WdiXtFDy`RV%w-fswk^E|!-?In z>?q+yNhyl^_iR9VYioq>ky3UENalT6ne#zdCC2F)+)s#MNRHeYTHC$Nn;0)Dt=Yxm zYNdR=T+X6>L{`J-m{_zmE0Hyj2tgzWecSI^o=VjK!`DfbB=&@r7{*uvwIl<_l&Ymz zdx89{2F>mL)_!kmh)&JOxc~ZEPF{<-j%M4Y)m(z7(RPGeTn`X#Kh?Rp1c&=!^_Vu_ zsglJ^W_}4+WO8+P0%AF{n8kQVPg(TDYTepwJPo!?v^Q6h*DASdb8LoT^d-32`|Q~I z`bQz1b)qt}1SRdU*AISv(^nImU08y0X--(15;NL_BtqR9V1UIqS0ZSwVKyJvpm(q5 z`HWL2m)0xK^Ccz|o@-Cq&57<4-V(f%6J<9d+3IJ9n1@Ty>MPL#FI|sI8G1ol0-rJS zSvD;%eiGxleSE*Vy}i}z_e?X%v!xn-|5~=hr+LHfs26w zszb2DMC$!>(aaJi5>H{#o>E0txrX^8u`K70tyaHrv)@4b>k}zjDra)JY=seF2`ul{ z!^VE3c`OAo=V+YoGR93)8>+WFM?n7%QtQzYC&&&v7>X?VkA#9Gg`6b#Rs-X;wcqa_ z3J$@i>*ciy+Pf$-tVQ{KyFCF1+6t=Mz5PQ?oj3yK(^R%ztY?)pkfWD__iT?}bEW3-QP9nOi+g_54UQ z9Yuf1xtJ^`MVF>jO2_!O+O!O4yQod6hq&JUu|8zDM4Bzc2?fUj?*Sfn7$W9G2J@A3 zh=Da}nyrS~w+X~AW=bi`tBMj05a2I?qc+T5m>5cs4|Q-pOaQT{4;>^WC4L!FH)hr@ z^b4J^+zdX?e=M~;_gtH3zPXS2zoS|v<+6OVSc>M*{`IoU?e?90uiZ%c#1aI2mII<6 zv`w!!jrl?45r{$s4rH|V1pNsK(NE{nYXL3`HtyfFhr?dOwrzrzWsJ8{G*e=usFAR0 zPnJQyHSV6?;F27&wcld=G=sWnJBcDh`E&{G%aR^zP=e3MjKZ%WJ`=0~Shd>?tz}|; z@_`hia;YSRcrJkZC$yp79BQ_tI{_k%{`VXVwML}nqY6QPaydc_F`OTvJyDNfJ`<%G zwj9C}6t%sD^|H~ohFB9wsSu5pv0i*!VU&@NkgpA$egfm2QaVY_W?FqbIibUo1* zd79~jalb7~H3DowMlP1>~8a5TgxK}|_QmXKyfQ3s#1p5TXB zH_fwa83pa{fYIFfd~@sGR^z;Y{*klFo4?G}_&Se_*^ zW1{UtZS%O(@SNz$GEkB~O@21~V&D1QmE zmtennv$6Rv!yZjQDO+EHYP?)gWMF*S?%Vz{^pl2J1ZL3GtzPrtGBhm5qZDPMq$oKq zwG8gDq$cdJENzrCH)m5;OKIGq;J4`~oYu6=audDK`!ekcxvn4JnFSga~6`Y&aS>wEc% zP(FF@(KPZQ%W0q2wbtKaztIGO_Q6FNa;dB*st^TQ>QH=B=z2bFR3R8u3!{WWORN}?kY8P# zQfWq`ShBZr@QWGbNMd0fA}cyehD*kr7~`0Oy% zH6<;K`sK8!7QTPwhIT2oBmQ|4@mn(+dE*c{BwZdY%t6#fiA{GsDlzzR{mUv``Jb=I z6Ol?cQ-iUhq2A*>Nneo76zKz}RzVt#)4D)VypK#&LOm8N><#&j7jgTNf%|bJGJzS- z@coTHy!Fpj_}TooAO8M79{szy&6R(eJ~szL@%|f6p4N9S<#arntis}>*-T$Nn&!HR zfVwh=`i)Dnp2M`K-E9fKckv+1AHVxx_FC($X98D+>GJm99t~rC)?l?OCvz~CJ2cr6 z2E*e0w@zkJKekf=O?oygcD;a|x&Yl5KiK*3$vZEczPWR;GerA)Ek=Juv6C{P1YizU zoyds=zE9aG)YBD=MBH#EIijRip&Oio>gI|O35kQq{Oy$k)LV*UUkvSEJ@F)`_=rM( zxnAl~qx9wL7ayGGOn(lvv=+>C@*E%mcX8|(c5<-)(eGc+4cByx zw9QQ_0oj@;*EpHghe)1_VQD6 zAY?SFFB(wyEM*S-csHm#6ul(u7`CI8K41z4hnFZtZDKp!?QiY>w-ezb<&qE~O zAs_Bso_evowfOrN|Mgqt&gB{$jFH+RndFIp9>aWHFlfTZT9tn^ojqKggHB{*if*&; zXu8x*@-^7I!c8)}d4qP?-N;Kd*uHwMUp%1|nAv?m~z{-p4S+1<=QIOVk#A7_X5LNm|1D znW@_sXTC}uP5VkWzXa!~oK|!e$O&{D1M`{iQzyaVBQJXpmNe9l;F&_#OzlQy`dLyy zy(o7IPfoAzT#Rief9Sso8&jzeql=yWK=u9p-Dg6e(xV& zt_Cwi7T1?H5Z?u3EZ)ZhaC|O?jMbUoN3p|SzwmGc`NM?hdR(yZ<)rq9Y1z8~nkC-(oS?xy01!Kg=R(s7LlX)OeLE2AZNomf4(H1~LI`#d~t(DXFiFwyl2t!Er`HzTgyC9}oD8-;C#XejzX6eG9{RMP5jQ zB+|&&BB&!;^k7!%qXUs&NqHqr2)r}0GJk*R|Db+b8B7Sm@L1bInuq-NNX^($Clw#B zbrMgI&$u352Uv=6sjRMik9vsr8C%>9l1;{^u-+v`OvwJ|Nn$>@ax{6a_tk}|+iy)B z76+#(Zfgk^o;?=*AOq7Gdyzx?Gb~LY`*n4i-?@rWw^_g9Pms*Z+{3K|LxKjEm=*3r5fHjD6%+HYMAI!CODEGaQqY zmZ8OP_mfW^uKi}=FGF^`43cU#h0*54(BbOf@*MJ`teDwd2<;bk!bhI542k*P#tfS; zcf`B12mcHGxsCecSm{O-(M>DJZ;DgN5MpveJb7B`EJ2tw+uUfGv6xA z(`h$NYPN{$wdn)8XkUu?Dc%v5A^Z2Qx%a%!$DLO1^3?t^eE0%e#dAkHea_}|eHkK! zKfL_rt-twUGu@qbhB#l#??$GAX@AAI6w;AT+0kzzd?S7EO1$~*qZ$ZNPjUrfBJKsb zCg$&h*{PP|3MYbMOCyZeZ2#(m^YuHI_@I-2bRNgeaKN5ro2C^l$z4!K`uWtC~$|1Mo_W@H$t`% z?+?Nkw%#4Q#`lX_|Mm)sUNYxIHJxFE`jSA39RlAI>k3G zA52gWszON1Pnl)yEz*)skl(Cy!(@l^^9GhJjGw)Tk!UBs|F_EF#vfMx$E$FD{=NWX ziZ*?!q#-{IuvGdan6;8_$BrVO9m4aocuE>XVs`Wy?q3@CX`jY>Cu#Ib2G7r~9-J?4 z=SP!(oqT@&Bp+ENePPN>54?0|{3?{%0x3jEH#2}(FZn9ymhT@g430}iq~ajn6QX2a zd8QT*!lX`OJOW;PF;15lS<$<)LSlwk^Ad%nCDt99!-N^Te%T?2EUT;fH%Gqe=O}Yj6JU@BVUpeHm`2zaQh(9o9ISYh7K22S3Z*EbPsO z%;d=Djh{p6gi0AE<2+XOUYy@qhW~V~m+3BKRB?cHnfevb+BmRv<(q#$*TQqP{I4K1 zDRnRM4$_88Plm-`fvq##)0NhxgPx29^5?KCp%x%OG+qnz^WC2lL9rtQf*ZeKXcvEf z{*%8pT>QU3XZ;sv{TFBb7iaw!XZ;sv{TFBb7iaw!XZ;sv{TFBb7iaw!XZ;sv{TFBb z7iaw!XZ;sv{TFBb7iaw!XZ;sv{TFBb7iaw!XZ;sv{TFBb7iaw!XZ;sv{TFBb7iaw! MXZ;udfBhH#7lzO0-v9sr literal 0 HcmV?d00001 diff --git a/misc/transition.adp b/misc/transition.adp new file mode 100644 index 0000000000000000000000000000000000000000..791fda519e8e17fc6f0306e9decbc6840ae3a399 GIT binary patch literal 1744 zcmeIy&2Jk;7zf~Yc5RTF?C#92t4h@SX(x!5)ZT3Z2S^j!O(mctX{>N7RVmy#!2iJ+ zD$z3$&=&R9hNP5Bl{k)5DnZxw+D?&ZyT=oCt4kL%uu())ByL5iTi~fBKz(TWCSmh!tv8$~L02%N1?G*Q z*R&BeWq>RB6z<3srB3vgYCy~3EJM=<^pvI%89>^H9;UPFyeoCi z-*~12FEz_1FM6HHtufChfPJo^DuTQI;r49XMqp0!i4OIvs?B@%e0t#cw9nISkqwPdV1t;>N)L17`z-kyfZWs zxQnLq`DF}BarJ1D@lpdgJmeD$U@kUfK8iARoodVh&}=IVH9weeP$G71H8(v7b)FIdN4eRprtu z(_`9WiFiM6tDBSCq82BExB!KXP^sotCsUY&GY){18dP)iAjS9!#r6=$(w*mD8t$oI zjwhvz3efs3y9T(_mNXaR%{&NWKb`8Nw^<(pvn^uCt{FZjgwTF(EAPa|E3ZU>(B;GO zwb>TWV(4+vbWNlj!?MejX#_tXOUjPH$DJUS;%KPMq`#QXJ$at#(qlU|4WPH=%u8CMM_9)A!{e07nAnq;h;KuBI0Lz?F$px|a1zj*7jO4-MmNEdRnS$e!6@W> z&-Dk*tHGYHGf=bZSi%nUdvBB}a_ zvXYB#zt%YoQAp+xXzQhAZFA{d2AYK)raj^kJK}(pfKajrk8z~?YKNgqP)~H-Qh3Iu zoPp2F23TWpst)=JB2P?2J5klkwKDs@ayU}mh`0sUfJFPy{n(do%kA?w9_c_!EAbU^ zfX>z=KhDUmFQU@c`s~9~o&SC9`%*cU7Pr%h>VNPBv9AUId(an!K#}eZzA1WhzrXd8 zJRbXMKN{clwaJnu$Z`FE%Q|XB@jR?GaSUqD7tKQL?Jd0#|4#>e`Md-mL=B0yaWf}W z=4vMp+&}h&t*gWVyzi?qGyL_mk{rD7#p&^1@fTmruCI{?GtT(G_zGIZZ$G|uz?bIB YJ?3!iizLxvgAT~JdF7p_7yiN5pCNUoRsaA1 literal 0 HcmV?d00001 diff --git a/src/dia.c b/src/dia.c index 2938ceda3..7e921da63 100644 --- a/src/dia.c +++ b/src/dia.c @@ -14,6 +14,9 @@ #include "include/themes.h" #include "include/util.h" +#include "include/sound.h" +#include + // UI spacing of the dialogues (pixels between consecutive items) #define UI_SPACING_H 10 #define UI_SPACING_V 2 @@ -133,6 +136,9 @@ int diaShowKeyb(char *text, int maxLen, int hide_text, const char *title) rmEndFrame(); if (getKey(KEY_LEFT)) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } if (selchar > -1) { if (selchar % KEYB_WIDTH) selchar--; @@ -145,6 +151,9 @@ int diaShowKeyb(char *text, int maxLen, int hide_text, const char *title) selcommand = -1; } } else if (getKey(KEY_RIGHT)) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } if (selchar > -1) { if ((selchar + 1) % KEYB_WIDTH) selchar++; @@ -157,17 +166,26 @@ int diaShowKeyb(char *text, int maxLen, int hide_text, const char *title) selcommand = -1; } } else if (getKey(KEY_UP)) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } if (selchar > -1) selchar = (selchar + KEYB_ITEMS - KEYB_WIDTH) % KEYB_ITEMS; else selcommand = (selcommand + KEYB_HEIGHT - 1) % KEYB_HEIGHT; } else if (getKey(KEY_DOWN)) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } if (selchar > -1) selchar = (selchar + KEYB_WIDTH) % KEYB_ITEMS; else selcommand = (selcommand + 1) % KEYB_HEIGHT; } else if (getKeyOn(gSelectButton)) { if (len < (maxLen - 1) && selchar > -1) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } if (mask_buffer != NULL) { mask_buffer[len] = '*'; mask_buffer[len + 1] = '\0'; @@ -177,6 +195,9 @@ int diaShowKeyb(char *text, int maxLen, int hide_text, const char *title) c[0] = keyb[selchar]; strcat(text, c); } else if (selcommand == 0) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(1, &sfx[1]); + } if (len > 0) { // BACKSPACE len--; text[len] = 0; @@ -184,6 +205,9 @@ int diaShowKeyb(char *text, int maxLen, int hide_text, const char *title) mask_buffer[len] = '\0'; } } else if (selcommand == 1) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } if (len < (maxLen - 1)) { // SPACE if (mask_buffer != NULL) { mask_buffer[len] = '*'; @@ -195,10 +219,16 @@ int diaShowKeyb(char *text, int maxLen, int hide_text, const char *title) strcat(text, c); } } else if (selcommand == 2) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } if (mask_buffer != NULL) free(mask_buffer); return 1; //ENTER } else if (selcommand == 3) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } selkeyb = (selkeyb + 1) % KEYB_MODE; // MODE if (selkeyb == 0) keyb = keyb0; @@ -207,6 +237,9 @@ int diaShowKeyb(char *text, int maxLen, int hide_text, const char *title) } } else if (getKey(KEY_SQUARE)) { if (len > 0) { // BACKSPACE + if (gEnableSFX) { + audsrv_ch_play_adpcm(1, &sfx[1]); + } len--; text[len] = 0; if (mask_buffer != NULL) @@ -214,6 +247,9 @@ int diaShowKeyb(char *text, int maxLen, int hide_text, const char *title) } } else if (getKey(KEY_TRIANGLE)) { if (len < (maxLen - 1) && selchar > -1) { // SPACE + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } if (mask_buffer != NULL) { mask_buffer[len] = '*'; mask_buffer[len + 1] = '\0'; @@ -224,19 +260,29 @@ int diaShowKeyb(char *text, int maxLen, int hide_text, const char *title) strcat(text, c); } } else if (getKeyOn(KEY_START)) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } if (mask_buffer != NULL) free(mask_buffer); return 1; //ENTER } else if (getKeyOn(KEY_SELECT)) { selkeyb = (selkeyb + 1) % KEYB_MODE; // MODE + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } if (selkeyb == 0) keyb = keyb0; if (selkeyb == 1) keyb = keyb1; } - if (getKey(gSelectButton == KEY_CIRCLE ? KEY_CROSS : KEY_CIRCLE)) + if (getKey(gSelectButton == KEY_CIRCLE ? KEY_CROSS : KEY_CIRCLE)) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(1, &sfx[1]); + } break; + } } @@ -308,24 +354,46 @@ static int diaShowColSel(unsigned char *r, unsigned char *g, unsigned char *b) rmEndFrame(); if (getKey(KEY_LEFT)) { - if (col[selc] > 0) + if (col[selc] > 0) { col[selc]--; + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + } } else if (getKey(KEY_RIGHT)) { - if (col[selc] < 255) + if (col[selc] < 255) { col[selc]++; + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + } } else if (getKey(KEY_UP)) { - if (selc > 0) + if (selc > 0) { selc--; + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + } } else if (getKey(KEY_DOWN)) { - if (selc < 2) + if (selc < 2) { selc++; + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + } } else if (getKeyOn(gSelectButton)) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } *r = col[0]; *g = col[1]; *b = col[2]; ret = 1; break; } else if (getKeyOn(gSelectButton == KEY_CIRCLE ? KEY_CROSS : KEY_CIRCLE)) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(1, &sfx[1]); + } ret = 0; break; } @@ -611,11 +679,17 @@ static int diaHandleInput(struct UIItem *item, int *modified) // circle loses focus, sets old values first if (getKeyOn(gSelectButton == KEY_CIRCLE ? KEY_CROSS : KEY_CIRCLE)) { diaResetValue(item); + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } return 0; } // cross loses focus without setting default if (getKeyOn(gSelectButton)) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } *modified = 0; return 0; } @@ -633,15 +707,25 @@ static int diaHandleInput(struct UIItem *item, int *modified) // up and down if (getKey(KEY_UP)) { - if (item->intvalue.current < item->intvalue.max) + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + if (item->intvalue.current < item->intvalue.max) { item->intvalue.current++; - else + } + else { item->intvalue.current = item->intvalue.min; //was "= 0;" + } } else if (getKey(KEY_DOWN)) { - if (item->intvalue.current > item->intvalue.min) + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + if (item->intvalue.current > item->intvalue.min) { item->intvalue.current--; - else + } + else { item->intvalue.current = item->intvalue.max; + } } else *modified = 0; } else if ((item->type == UI_STRING) || (item->type == UI_PASSWORD)) { @@ -667,12 +751,23 @@ static int diaHandleInput(struct UIItem *item, int *modified) return 0; } - if (getKey(KEY_UP) && (item->intvalue.current > 0)) + if (getKey(KEY_UP) && (item->intvalue.current > 0)) { item->intvalue.current--; - else if (getKey(KEY_DOWN) && (item->intvalue.enumvalues[item->intvalue.current + 1] != NULL)) + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + } + else if (getKey(KEY_DOWN) && (item->intvalue.enumvalues[item->intvalue.current + 1] != NULL)) { item->intvalue.current++; - else + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + } + + else { *modified = 0; + } + } else if (item->type == UI_COLOUR) { if (!diaShowColSel(&item->colourvalue.r, &item->colourvalue.g, &item->colourvalue.b)) *modified = 0; @@ -856,50 +951,80 @@ int diaExecuteDialog(struct UIItem *ui, int uiId, short inMenu, int (*updater)(i if (getKey(KEY_LEFT)) { struct UIItem *newf = diaGetPrevControl(cur, ui); - if (newf == cur) + if (gEnableSFX && !toggleSfx) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + + if (newf == cur) { cur = diaGetLastControl(ui); - else + } + else { cur = newf; + } } if (getKey(KEY_RIGHT)) { struct UIItem *newf = diaGetNextControl(cur, cur); - if (newf == cur) + if (gEnableSFX && !toggleSfx) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + + if (newf == cur) { cur = diaGetFirstControl(ui); - else + } + else { cur = newf; + } } if (getKey(KEY_UP)) { // find struct UIItem *newf = diaGetPrevLine(cur, ui); - if (newf == cur) + if (gEnableSFX && !toggleSfx) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + + if (newf == cur) { cur = diaGetLastControl(ui); - else + } + else { cur = newf; + } } if (getKey(KEY_DOWN)) { // find struct UIItem *newf = diaGetNextLine(cur, ui); - if (newf == cur) + if (gEnableSFX && !toggleSfx) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + + if (newf == cur) { cur = diaGetFirstControl(ui); - else + } + else { cur = newf; + } } // Cancel button breaks focus or exits with false result if (getKeyOn(gSelectButton == KEY_CIRCLE ? KEY_CROSS : KEY_CIRCLE)) { diaRestoreScrollSpeed(); + if (gEnableSFX) { + audsrv_ch_play_adpcm(1, &sfx[1]); + } return UIID_BTN_CANCEL; } // see what key events we have if (getKeyOn(gSelectButton)) { haveFocus = 1; + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } if (cur->type == UI_BUTTON) { diaRestoreScrollSpeed(); diff --git a/src/dialogs.c b/src/dialogs.c index 64f1298de..2ed8dbec7 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -921,3 +921,34 @@ struct UIItem diaParentalLockConfig[] = { // end of dialog {UI_TERMINATOR}}; + +// Audio Settings Menu +struct UIItem diaAudioConfig[] = { + {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_AUDIO_SETTINGS}}}, + {UI_SPLITTER}, + + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_SFX}}}, + {UI_SPACER}, + {UI_BOOL, CFG_SFX, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_BOOT_SND}}}, + {UI_SPACER}, + {UI_BOOL, CFG_BOOT_SND, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, + {UI_SPLITTER}, + + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_SFX_VOLUME}}}, + {UI_SPACER}, + {UI_INT, CFG_SFX_VOLUME, 1, 1, -1, 0, 0, {.intvalue = {0, 0, 0, 100}}}, + {UI_BREAK}, + + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_BOOT_SND_VOLUME}}}, + {UI_SPACER}, + {UI_INT, CFG_BOOT_SND_VOLUME, 1, 1, -1, 0, 0, {.intvalue = {0, 0, 0, 100}}}, + {UI_BREAK}, + + // buttons + {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, + {UI_BREAK}, + // end of dialog + {UI_TERMINATOR}}; diff --git a/src/gui.c b/src/gui.c index 4b5e17152..626d6efe4 100644 --- a/src/gui.c +++ b/src/gui.c @@ -21,6 +21,9 @@ #include "include/pggsm.h" #include "include/cheatman.h" +#include "include/sound.h" +#include + #ifdef PADEMU #include #include @@ -203,6 +206,7 @@ void guiShowAbout() char OPLVersion[40]; char OPLBuildDetails[40]; + toggleSfx = -1; snprintf(OPLVersion, sizeof(OPLVersion), _l(_STR_OPL_VER), OPL_VERSION); diaSetLabel(diaAbout, ABOUT_TITLE, OPLVersion); @@ -226,6 +230,7 @@ void guiShowAbout() diaSetLabel(diaAbout, ABOUT_BUILD_DETAILS, OPLBuildDetails); diaExecuteDialog(diaAbout, -1, 1, NULL); + toggleSfx = 0; } static int guiNetCompatUpdRefresh(int modified) @@ -562,6 +567,10 @@ void guiShowUIConfig(void) diaGetInt(diaUIConfig, UICFG_YOFF, &gYOff); diaGetInt(diaUIConfig, UICFG_OVERSCAN, &gOverscan); + int changed = thmSetGuiValue(themeID, changed); + if (changed) { + sfxInit(); + } applyConfig(themeID, langID); } } @@ -1090,6 +1099,26 @@ void guiShowParentalLockConfig(void) } } +void guiShowAudioConfig(void) +{ + int ret; + + diaSetInt(diaAudioConfig, CFG_SFX, gEnableSFX); + diaSetInt(diaAudioConfig, CFG_BOOT_SND, gEnableBootSND); + diaSetInt(diaAudioConfig, CFG_SFX_VOLUME, gSFXVolume); + diaSetInt(diaAudioConfig, CFG_BOOT_SND_VOLUME, gBootSndVolume); + + ret = diaExecuteDialog(diaAudioConfig, -1, 1, &guiUpdater); + if (ret) { + diaGetInt(diaAudioConfig, CFG_SFX, &gEnableSFX); + diaGetInt(diaAudioConfig, CFG_BOOT_SND, &gEnableBootSND); + diaGetInt(diaAudioConfig, CFG_SFX_VOLUME, &gSFXVolume); + diaGetInt(diaAudioConfig, CFG_BOOT_SND_VOLUME, &gBootSndVolume); + applyConfig(-1, -1); + sfxVolume(); + } +} + int guiShowKeyboard(char *value, int maxLength) { char tmp[maxLength]; @@ -1985,7 +2014,7 @@ static void guiDrawOverlays() bfadeout += 0x08; } - if (bfadeout > 0) + if (bfadeout > 0 && !toggleSfx) guiDrawBusy(); #ifdef __DEBUG @@ -2075,13 +2104,28 @@ static void guiShow() screenHandler->renderScreen(); } +void guiDelay(int milliSeconds) +{ + clock_t time_end = time_end = clock() + milliSeconds * CLOCKS_PER_SEC / 1000; + while (clock() < time_end) {} + + toggleSfx = 0; +} + void guiIntroLoop(void) { int endIntro = 0; + + if (gEnableSFX && gEnableBootSND) + toggleSfx = -1; + while (!endIntro) { guiStartFrame(); - if (wfadeout < 0x80) + if (wfadeout < 0x80 && toggleSfx) + guiDelay(gFadeDelay); + + if (wfadeout < 0x80 && !toggleSfx) guiShow(); if (gInitComplete) @@ -2139,6 +2183,9 @@ void guiSetFrameHook(gui_callback_t cback) void guiSwitchScreen(int target, int transition) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(5, &sfx[5]); + } if (transition == TRANSITION_LEFT) { transitionX = 1; transMax = screenWidth; @@ -2188,6 +2235,11 @@ void guiUpdateScreenScale(void) int guiMsgBox(const char *text, int addAccept, struct UIItem *ui) { int terminate = 0; + + if (gEnableSFX) { + audsrv_ch_play_adpcm(4, &sfx[4]); + } + while (!terminate) { guiStartFrame(); @@ -2216,6 +2268,13 @@ int guiMsgBox(const char *text, int addAccept, struct UIItem *ui) guiEndFrame(); } + if (gEnableSFX && terminate == 1) { + audsrv_ch_play_adpcm(1, &sfx[1]); + } + if (gEnableSFX && terminate == 2) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } + return terminate - 1; } diff --git a/src/lang.c b/src/lang.c index 097b5f495..54a1bd672 100644 --- a/src/lang.c +++ b/src/lang.c @@ -53,7 +53,7 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Circle", "Cross", "Games List", - "Game settings", + "Game Settings", "Remove all settings", "Removed all keys for the game", "Scrolling", @@ -114,7 +114,7 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Rename", "Delete", "Run", - "Display settings", + "Display Settings", "Enable write operations", "Check USB game fragmentation", "Remember last played game", @@ -273,6 +273,11 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Error - this password cannot be used.", "VMC %s file is fragmented. Continue with Memory Card in slot %d?", "Settings must be saved before continuing.", + "Audio Settings", + "Enable Sound Effects", + "Enable Boot Sound", + "Sound Effects Volume", + "Boot Sound Volume", //START of OPL_DB tweaks "PS1 Games", "PS1 Games display mode", diff --git a/src/menusys.c b/src/menusys.c index 6d8fef427..33a58700c 100644 --- a/src/menusys.c +++ b/src/menusys.c @@ -17,9 +17,13 @@ #include "include/ioman.h" #include +#include "include/sound.h" +#include + enum MENU_IDs { MENU_SETTINGS = 0, MENU_GFX_SETTINGS, + MENU_AUDIO_SETTINGS, MENU_NET_CONFIG, MENU_NET_UPDATE, MENU_PARENTAL_LOCK, @@ -113,6 +117,7 @@ static void menuInitMainMenu(void) // initialize the menu submenuAppendItem(&mainMenu, -1, NULL, MENU_SETTINGS, _STR_SETTINGS); submenuAppendItem(&mainMenu, -1, NULL, MENU_GFX_SETTINGS, _STR_GFX_SETTINGS); + submenuAppendItem(&mainMenu, -1, NULL, MENU_AUDIO_SETTINGS, _STR_AUDIO_SETTINGS); submenuAppendItem(&mainMenu, -1, NULL, MENU_NET_CONFIG, _STR_NETCONFIG); submenuAppendItem(&mainMenu, -1, NULL, MENU_NET_UPDATE, _STR_NET_UPDATE); submenuAppendItem(&mainMenu, -1, NULL, MENU_PARENTAL_LOCK, _STR_PARENLOCKCONFIG); @@ -430,6 +435,9 @@ static void menuNextH() if (selected_item->next != NULL) { selected_item = selected_item->next; itemConfigId = -1; + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } } } @@ -438,6 +446,9 @@ static void menuPrevH() if (selected_item->prev != NULL) { selected_item = selected_item->prev; itemConfigId = -1; + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } } } @@ -445,6 +456,10 @@ static void menuFirstPage() { submenu_list_t *cur = selected_item->item->current; if (cur) { + if (gEnableSFX && cur->prev) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } + selected_item->item->current = selected_item->item->submenu; selected_item->item->pagestart = selected_item->item->current; } @@ -454,6 +469,9 @@ static void menuLastPage() { submenu_list_t *cur = selected_item->item->current; if (cur) { + if (gEnableSFX && cur->next) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } while (cur->next) cur = cur->next; // go to end @@ -473,6 +491,9 @@ static void menuNextV() if (cur && cur->next) { selected_item->item->current = cur->next; + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } // if the current item is beyond the page start, move the page start one page down cur = selected_item->item->pagestart; @@ -496,6 +517,9 @@ static void menuPrevV() if (cur && cur->prev) { selected_item->item->current = cur->prev; + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } // if the current item is on the page start, move the page start one page up if (selected_item->item->pagestart == cur) { @@ -515,6 +539,9 @@ static void menuNextPage() if (cur && cur->next) { int itms = ((items_list_t *)gTheme->itemsList->extended)->displayedItems + 1; + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } while (--itms && cur->next) cur = cur->next; @@ -533,6 +560,9 @@ static void menuPrevPage() if (cur && cur->prev) { int itms = ((items_list_t *)gTheme->itemsList->extended)->displayedItems + 1; + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } while (--itms && cur->prev) cur = cur->prev; @@ -651,6 +681,9 @@ void menuHandleInputMenu() mainMenuCurrent = mainMenu; if (getKey(KEY_UP)) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } if (mainMenuCurrent->prev) mainMenuCurrent = mainMenuCurrent->prev; else // rewind to the last item @@ -659,6 +692,9 @@ void menuHandleInputMenu() } if (getKey(KEY_DOWN)) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(3, &sfx[3]); + } if (mainMenuCurrent->next) mainMenuCurrent = mainMenuCurrent->next; else @@ -669,12 +705,19 @@ void menuHandleInputMenu() // execute the item via looking at the id of it int id = mainMenuCurrent->item.id; + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } + if (id == MENU_SETTINGS) { if (menuCheckParentalLock() == 0) guiShowConfig(); } else if (id == MENU_GFX_SETTINGS) { if (menuCheckParentalLock() == 0) guiShowUIConfig(); + } else if (id == MENU_AUDIO_SETTINGS) { + if (menuCheckParentalLock() == 0) + guiShowAudioConfig(); } else if (id == MENU_NET_CONFIG) { if (menuCheckParentalLock() == 0) guiShowNetConfig(); diff --git a/src/opl.c b/src/opl.c index 8f0e86d1b..b4eeb65c0 100644 --- a/src/opl.c +++ b/src/opl.c @@ -35,6 +35,9 @@ #include "include/cheatman.h" +#include "include/sound.h" +#include + #ifdef __EESIO_DEBUG #include #define LOG_INIT() sio_init(38400, 0, 0, 0, 0) @@ -101,6 +104,7 @@ static void clearIOModuleT(opl_io_module_t *mod) static void clearMenuGameList(opl_io_module_t *mdl); static void moduleCleanup(opl_io_module_t *mod, int exception); static void reset(void); +static void deferredAudioInit(void); // frame counter static unsigned int frameCounter; @@ -151,6 +155,9 @@ void moduleUpdateMenu(int mode, int themeChanged) static void itemExecSelect(struct menu_item *curMenu) { item_list_t *support = curMenu->userdata; + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } if (support) { if (support->enabled) { @@ -170,8 +177,9 @@ static void itemExecSelect(struct menu_item *curMenu) static void itemExecCancel(struct menu_item *curMenu) { - if (!curMenu->current) + if (!curMenu->current) { return; + } if (!gEnableWrite) return; @@ -181,6 +189,9 @@ static void itemExecCancel(struct menu_item *curMenu) if (support) { if (support->itemRename) { if (menuCheckParentalLock() == 0) { + if (gEnableSFX) { + audsrv_ch_play_adpcm(4, &sfx[4]); + } int nameLength = support->itemGetNameLength(curMenu->current->item.id); char newName[nameLength]; strncpy(newName, curMenu->current->item.text, nameLength); @@ -216,6 +227,9 @@ static void itemExecTriangle(struct menu_item *curMenu) if (!(support->flags & MODE_FLAG_NO_COMPAT)) { if (menuCheckParentalLock() == 0) { config_set_t *configSet = menuLoadConfig(); + if (gEnableSFX) { + audsrv_ch_play_adpcm(5, &sfx[5]); + } if (guiShowCompatConfig(curMenu->current->item.id, support, configSet) == COMPAT_TEST) support->itemLaunch(curMenu->current->item.id, configSet); } @@ -264,6 +278,9 @@ static void itemExecRefresh(struct menu_item *curMenu) if (support && support->enabled) ioPutRequest(IO_MENU_UPDATE_DEFFERED, &support->mode); + if (gEnableSFX) { + audsrv_ch_play_adpcm(2, &sfx[2]); + } } static void initMenuForListSupport(int mode) @@ -592,6 +609,10 @@ static void _loadConfig() //START of OPL_DB tweaks configGetInt(configOPL, CONFIG_OPL_ELM_MODE, &gELMStartMode); //END of OPL_DB tweaks + configGetInt(configOPL, CONFIG_OPL_SFX, &gEnableSFX); + configGetInt(configOPL, CONFIG_OPL_BOOT_SND, &gEnableBootSND); + configGetInt(configOPL, CONFIG_OPL_SFX_VOLUME, &gSFXVolume); + configGetInt(configOPL, CONFIG_OPL_BOOT_SND_VOLUME, &gBootSndVolume); } } @@ -675,6 +696,10 @@ static void _saveConfig() //START of OPL_DB tweaks configSetInt(configOPL, CONFIG_OPL_ELM_MODE, gELMStartMode); //END of OPL_DB tweaks + configSetInt(configOPL, CONFIG_OPL_SFX, gEnableSFX); + configSetInt(configOPL, CONFIG_OPL_BOOT_SND, gEnableBootSND); + configSetInt(configOPL, CONFIG_OPL_SFX_VOLUME, gSFXVolume); + configSetInt(configOPL, CONFIG_OPL_BOOT_SND_VOLUME, gBootSndVolume); configSetInt(configOPL, CONFIG_OPL_SWAP_SEL_BUTTON, gSelectButton == KEY_CIRCLE ? 0 : 1); } @@ -1032,6 +1057,15 @@ static int loadHdldSvr(void) { int ret, padStatus; + // disable sfx before audio lib + if (gEnableSFX) { + gEnableSFX = 0; + toggleSfx = 1; + } + + //deint audio lib while hdl server is running + audsrv_quit(); + // block all io ops, wait for the ones still running to finish ioBlockOps(1); guiExecDeferredOps(); @@ -1087,6 +1121,9 @@ static void unloadHdldSvr(void) // init all supports again initAllSupport(1); + + // reinit audio lib + ioPutRequest(IO_CUSTOM_SIMPLEACTION, &deferredAudioInit); } void handleHdlSrv() @@ -1101,6 +1138,7 @@ void handleHdlSrv() // restore normal functionality again guiRenderTextScreen(_l(_STR_UNLOADHDL)); unloadHdldSvr(); + } // ---------------------------------------------------------- @@ -1204,6 +1242,10 @@ static void setDefaults(void) gUseInfoScreen = 0; gEnableArt = 0; gWideScreen = 0; + gEnableSFX = 0; + gEnableBootSND = 0; + gSFXVolume = 80; + gBootSndVolume = 80; gUSBStartMode = START_MODE_DISABLED; gHDDStartMode = START_MODE_DISABLED; @@ -1272,6 +1314,9 @@ static void init(void) // try to restore config _loadConfig(); + + // queue deffered init of sound effects, which will take place after the preceding initialization steps within the queue are complete. + ioPutRequest(IO_CUSTOM_SIMPLEACTION, &deferredAudioInit); } static void deferredInit(void) @@ -1288,6 +1333,33 @@ static void deferredInit(void) } } +static void deferredAudioInit(void) +{ + int ret; + + ret = audsrv_init(); + if (ret != 0) + LOG("Failed to initialize audsrv\n"); + LOG("Audsrv returned error string: %s\n", audsrv_get_error_string()); + + ret = sfxInit(); + if (ret >= 0) + LOG("sfxInit: %d samples loaded.\n", ret); + else + LOG("sfxInit: failed to initialize - %d.\n", ret); + + //boot sound + if (gEnableSFX && gEnableBootSND) { + audsrv_ch_play_adpcm(0, &sfx[0]); + } + + // re-enable sfx if previously disabled (hdl svr) + if (!gEnableSFX && toggleSfx) { + gEnableSFX = 1; + toggleSfx = 0; + } +} + // --------------------- Main -------------------- int main(int argc, char *argv[]) { diff --git a/src/sound.c b/src/sound.c new file mode 100644 index 000000000..034185d25 --- /dev/null +++ b/src/sound.c @@ -0,0 +1,197 @@ +/*-- Theme Sound Effects ------------------------------------------------------------------------------------------------- +---- SP193 wrote the code, I just made small changes. ---------------------------------------------------------------*/ + +#include +#include "include/sound.h" +#include "include/opl.h" +#include "include/themes.h" + +//default sfx +extern unsigned char boot_adp[]; +extern unsigned int size_boot_adp; + +extern unsigned char cancel_adp[]; +extern unsigned int size_cancel_adp; + +extern unsigned char confirm_adp[]; +extern unsigned int size_confirm_adp; + +extern unsigned char cursor_adp[]; +extern unsigned int size_cursor_adp; + +extern unsigned char message_adp[]; +extern unsigned int size_message_adp; + +extern unsigned char transition_adp[]; +extern unsigned int size_transition_adp; + +extern char sound_path[256]; + +struct sfxEffect { + const char *name; + void *buffer; + int size; +}; + +static struct sfxEffect sfx_files[NUM_SFX_FILES] = { + {"boot.adp"}, + {"cancel.adp"}, + {"confirm.adp"}, + {"cursor.adp"}, + {"message.adp"}, + {"transition.adp"}, +}; + +struct audsrv_adpcm_t sfx[NUM_SFX_FILES]; + +//Returns 0 if the specified file was read. The sfxEffect structure will not be updated unless the file is successfully read. +static int sfxRead(const char *full_path, struct sfxEffect *sfx) +{ + FILE* adpcm; + void *buffer; + int ret, size; + + adpcm = fopen(full_path, "rb"); + if (adpcm == NULL) + { + printf("Failed to open adpcm file %s\n", full_path); + return -ENOENT; + } + + fseek(adpcm, 0, SEEK_END); + size = ftell(adpcm); + rewind(adpcm); + + buffer = memalign(64, size); + if (buffer == NULL) + { + printf("Failed to allocate memory for SFX\n"); + fclose(adpcm); + return -ENOMEM; + } + + ret = fread(buffer, 1, size, adpcm); + fclose(adpcm); + + if(ret != size) + { + printf("Failed to read SFX: %d (expected %d)\n", ret, size); + free(buffer); + return -EIO; + } + + sfx->buffer = buffer; + sfx->size = size; + + return 0; +} + +static void sfxInitDefaults(void) +{ + sfx_files[0].buffer = boot_adp; + sfx_files[0].size = size_boot_adp; + sfx_files[1].buffer = cancel_adp; + sfx_files[1].size = size_cancel_adp; + sfx_files[2].buffer = confirm_adp; + sfx_files[2].size = size_confirm_adp; + sfx_files[3].buffer = cursor_adp; + sfx_files[3].size = size_cursor_adp; + sfx_files[4].buffer = message_adp; + sfx_files[4].size = size_message_adp; + sfx_files[5].buffer = transition_adp; + sfx_files[5].size = size_transition_adp; +} + +//Returns 0 (AUDSRV_ERR_NOERROR) if the sound was loaded successfully. +static int sfxLoad(struct sfxEffect *sfxData, audsrv_adpcm_t *sfx) +{ + int ret; + + ret = audsrv_load_adpcm(sfx, sfxData->buffer, sfxData->size); + free(sfxData->buffer); + sfxData->buffer = NULL; //Mark the buffer as freed. + + return ret; +} + +static int getFadeDelay(void) +{ + FILE* bootSnd; + char boot_path[256]; + int len; + int logoFadeTime = 1400; //fade time from sound call to fade to main in milliseconds + int byteRate = 176400 / 1000; //sample rate * channels * bits per sample /8 (/1000 to get in milliseconds) + + sprintf(boot_path, "%s/%s", sound_path, sfx_files[0].name); + bootSnd = fopen(boot_path, "rb"); + if (bootSnd == NULL) + { + printf("Failed to open adpcm file %s\n", boot_path); + return -ENOENT; + } + + fseek(bootSnd, 12, SEEK_SET); + fread(&len, 4, 1, bootSnd); + rewind(bootSnd); + + fclose(bootSnd); + + gFadeDelay = len / byteRate - logoFadeTime; + + return 0; +} + +void sfxVolume(void) +{ + int i; + + for (i = 1; i < NUM_SFX_FILES; i++) + { + audsrv_adpcm_set_volume(i, gSFXVolume); + } + + audsrv_adpcm_set_volume(0, gBootSndVolume); +} + +//Returns number of audio files successfully loaded, < 0 if an unrecoverable error occurred. +int sfxInit(void) +{ + char full_path[256]; + int ret, i, loaded; + + audsrv_adpcm_init(); + + sfxInitDefaults(); + sfxVolume(); + + ret = getFadeDelay(); + if (ret != 0) { + gFadeDelay = 1200; + } + + loaded = 0; + for (i = 0; i < NUM_SFX_FILES; i++) + { + if (thmSfxEnabled < 0) + { + sprintf(full_path, "%s/%s", sound_path, sfx_files[i].name); + ret = sfxRead(full_path, &sfx_files[i]); + if (ret != 0) + { + printf("SFX: %s could not be loaded. Using default sound %d.\n", full_path, ret); + } + } + + ret = sfxLoad(&sfx_files[i], &sfx[i]); + if (ret == 0) + { + loaded++; + } + else + { + printf("SFX: failed to load %s, error %d\n", full_path, ret); + } + } + + return loaded; +} diff --git a/src/system.c b/src/system.c index 6688bb665..3aae9197f 100644 --- a/src/system.c +++ b/src/system.c @@ -5,6 +5,7 @@ */ #include "include/opl.h" +#include "include/gui.h" #include "include/ethsupport.h" #include "include/util.h" #include "include/pad.h" @@ -16,6 +17,7 @@ #include "include/renderman.h" #include "include/extern_irx.h" #include "../ee_core/include/modules.h" +#include #include "include/pggsm.h" #include "include/cheatman.h" @@ -206,6 +208,9 @@ void sysReset(int modload_mask) sysLoadModuleBuffer(&genvmc_irx, size_genvmc_irx, 0, NULL); + sysLoadModuleBuffer(&libsd_irx, size_libsd_irx, 0, NULL); + sysLoadModuleBuffer(&audsrv_irx, size_audsrv_irx, 0, NULL); + #ifdef PADEMU int ds3pads = 1; //only one pad enabled @@ -315,6 +320,12 @@ void sysExecExit() ds34usb_reset(); ds34bt_reset(); #endif + if (gEnableSFX) { + //wait 70ms for confirm sound to finish playing before exit + guiDelay(0070); + gEnableSFX = 0; + } + audsrv_quit(); Exit(0); } @@ -796,6 +807,11 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo ds34usb_reset(); ds34bt_reset(); #endif + if (gEnableSFX) { + gEnableSFX = 0; + } + audsrv_quit(); + // Let's go. fileXioExit(); SifExitRpc(); @@ -845,6 +861,10 @@ int sysExecElf(char *path) if (eph[i].memsz > eph[i].filesz) memset(eph[i].vaddr + eph[i].filesz, 0, eph[i].memsz - eph[i].filesz); } + if (gEnableSFX) { + gEnableSFX = 0; + } + audsrv_quit(); // Let's go. fileXioExit(); diff --git a/src/themes.c b/src/themes.c index d5a52757d..429dfefdb 100644 --- a/src/themes.c +++ b/src/themes.c @@ -9,6 +9,9 @@ #include "include/lang.h" #include "include/pad.h" +#include "include/sound.h" +#include + #define MENU_POS_V 50 #define HINT_HEIGHT 32 #define DECORATOR_SIZE 20 @@ -26,6 +29,8 @@ static int nThemes = 0; static theme_file_t themes[THM_MAX_FILES]; static const char **guiThemesNames = NULL; +char sound_path[256]; + enum ELEM_ATTRIBUTE_TYPE { ELEM_TYPE_ATTRIBUTE_TEXT = 0, ELEM_TYPE_STATIC_TEXT, @@ -1175,10 +1180,21 @@ static void thmLoad(const char *themePath) //No theme specified. Prepare and load the default theme. themeConfig = configAlloc(0, NULL, NULL); configReadBuffer(themeConfig, &conf_theme_OPL_cfg, size_conf_theme_OPL_cfg); + thmSfxEnabled = 0; } else { snprintf(path, sizeof(path), "%sconf_theme.cfg", themePath); themeConfig = configAlloc(0, NULL, path); configRead(themeConfig); // try to load the theme config file + + //Get theme path for sfx, to use later + snprintf(sound_path, sizeof(sound_path), "%ssound", themePath); + //Check for custom sfx folder + int fd = fileXioDopen(sound_path); + if (fd < 0) + thmSfxEnabled = 0; + else + thmSfxEnabled = -1; + fileXioDclose(fd); } int intValue; From 962b513c10c6b56fc4abfacaa1d85e14340a4c51 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 6 Dec 2018 18:07:17 -0800 Subject: [PATCH 124/269] update lang_English.lng file --- lng/lang_English.lng | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lng/lang_English.lng b/lng/lang_English.lng index e854b59fe..926f88d9b 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -60,7 +60,7 @@ Cancel Circle Cross Games List -Game settings +Game Settings Remove all settings Removed all keys for the game Scrolling @@ -119,7 +119,7 @@ Item will be permanently deleted, continue? Rename Delete Run -Display settings +Display Settings Enable write operations Check USB game fragmentation Remember last played game @@ -277,6 +277,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! From 266f47a62a8687dec666d4db1dfac8078f23e22f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 6 Dec 2018 18:52:53 -0800 Subject: [PATCH 125/269] update lang files --- lng/lang_Arabic.lng | 10 ++- lng/lang_Bulgarian.lng | 10 ++- lng/lang_Chinese_Simp.lng | 134 +++++++++++++++++++------------------ lng/lang_Chinese_Trad.lng | 10 ++- lng/lang_Czech.lng | 10 ++- lng/lang_Danish.lng | 10 ++- lng/lang_Dutch.lng | 10 ++- lng/lang_English.lng | 2 +- lng/lang_Filipino.lng | 12 +++- lng/lang_French.lng | 10 ++- lng/lang_German.lng | 10 ++- lng/lang_Greek.lng | 10 ++- lng/lang_Hungarian.lng | 10 ++- lng/lang_Indonesian.lng | 10 ++- lng/lang_Italian.lng | 10 ++- lng/lang_Japanese.lng | 10 ++- lng/lang_Korean.lng | 10 ++- lng/lang_Laotian.lng | 10 ++- lng/lang_Polish.lng | 10 ++- lng/lang_Portuguese.lng | 10 ++- lng/lang_Portuguese_BR.lng | 10 ++- lng/lang_Russian.lng | 10 ++- lng/lang_Spanish.lng | 10 ++- lng/lang_Swedish.lng | 10 ++- lng/lang_Turkish.lng | 10 ++- 25 files changed, 256 insertions(+), 112 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 8a2b0455f..c7158c52b 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: 8/31/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s @@ -259,6 +259,12 @@ LMP الاصدار: خيارات البناء: خطأ - لا يمكن استخدام كلمة المرور هذه. ملف VMC %s مجزأ. تواصل مع بطاقة الذاكرة في الفتحة %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 العاب PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 8eb9c1f0b..d562b9251 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index e88962629..5775ad09e 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -24,13 +24,13 @@ ETH 游戏 退出到浏览界面? 取消更新? %d: 检测不到硬盘 -%d: 硬盘没有格式化 +%d: 硬盘未格式化 %d: 启动网络错误 %d: 检测不到网卡 %d: 无法连接 SMB 服务器 %d: 无法登入 SMB 服务器 %d: 无法开启 SMB 共享 -%d: 无法罗列 SMB 共享清单 +%d: 无法列出 SMB 共享清单 %d: 无法列出游戏清单 %d: DHCP 服务器不存在 %d: 无网络连接 @@ -43,9 +43,9 @@ O X 游戏列表 游戏设置 -移除所有设置 -移除游戏所有的设置 -滚动 +删除所有设置 +删除游戏所有的设置 +选定项滚动速度 较慢 中等 较快 @@ -53,10 +53,10 @@ X 从光盘中读取 请稍后 读取 游戏 ID 时出错 -自动滚动 -读取语言文件时出错 +自动排序 +加载语言文件时出错 禁用调试跳色 -未检测到摇杆, 等待中... +未检测到控制器, 等待中... 显示游戏封面 宽屏幕 关机 @@ -104,7 +104,7 @@ NetBIOS 显示设置 启用删除与重新命名功能 检查 USB 游戏碎片 -记住最后一个玩的游戏 +记住最后运行游戏 选定键 错误, 游戏有碎片 错误, 无法运行该项目 @@ -112,11 +112,11 @@ NetBIOS GUEST验证留空. 精确读取 同步模式 -脱开系统调用 +解除系统调用 跳过 videos 模拟 DVD-DL 禁用 IGR -Unused +空闲 隐藏 DEV9 模式 改变大小将会重新格式化 VMC 生成 @@ -130,9 +130,9 @@ Unused 大小 状态 进度 -VMC 档案已存在 -无效的 VMC 档案, 大小有误 -需要建立VMC 档案 +VMC 存档已存在 +无效的 VMC 存档, 大小有误 +需要建立VMC 存档 VMC %s 出错, 继续使用物理记忆卡吗 (slot %d) ? 自动重新整理 关于 @@ -142,7 +142,7 @@ USB 前缀路径 自定义IGR启动文件 数值以分钟计,设为 0 禁用降速 自动 HDD 降速 -影片模式 +视频模式 对话框颜色 被选定颜色 显示讯息页面 @@ -178,28 +178,28 @@ DMA 模式 GSM 设置 启用 GSM 切换 GSM 开或关 -VMODE +画面模式 强制自定义显示模式 -H-POS 水平调整 -V-POS +调整水平方向的显示位置 垂直调整 +调整垂直方向的显示位置 过扫 过扫调节 跳过 FMV 跳过全动态视频 金手指设置 -启用 PS2RD 金手指引擎 -允许 PS2RD 金手指引擎对你的游戏进行补丁 -PS2RD 金手指引擎模式 -自动或手动选择游戏金手指 -自动选择金手指 -手动选择金手指 +启用PS2RD +允许对选定游戏使用PS2RD金手指 +PS2RD 金手指模式 +自动或手动选择 +自动选择 +手动选择 错误: 读取金手指文件出错 未发现金手指文件 -下载默认值 +下载默认设置 网络更新 -重新下载现有记录? +重新下载设置? 更新失败. 连结更新服务器失败. 更新已完成. @@ -209,28 +209,28 @@ PS2RD 金手指引擎模式 已下载默认值 将自动于 %i 秒后启动... 自动启动 -以秒为单位,设为 0 来禁用自动启动 -PS2 Logo -只显示与控制台区域匹配的有效磁盘标识 +以秒为单位,设为 0 禁用自动启动 +PS2 标志 +进入游戏前显示相应标识 配置PADEMU -Pad模拟器设置 -开启Pad模拟器 -为选定的游戏开启/关闭pad模拟调节。 -Pad模拟器模式 -选择Pad模拟器模式。 +PADEMU设置 +开启PADEMU +为选定游戏开启/关闭PADEMU调节. +连接模式 +选择PADEMU连接模式. 有线连接 蓝牙连接 设置端口: -选择Pad模拟器端口 +选择应用PADEMU端口 开启模拟 -打开/关闭选定端口的模拟器 +打开/关闭选定端口的模拟 开启振动 -打开/关闭选定端口的振动。 -USB蓝牙适配器MAC地址: -D S 手 柄 MAC地址: +打开/关闭选定端口的振动. +蓝牙适配器MAC地址: +D S 手 柄MAC地址: 配对 配对DS手柄 -蓝牙适配器和DS手柄进行MAC地址配对。 +蓝牙适配器和DS手柄进行MAC地址配对. 没有连接 蓝牙适配器信息 显示更多的信息和支持的特性 @@ -240,31 +240,37 @@ LMP版本: 支持的功能: 是 否 -蓝牙适配器应该完全兼容DS3/DS4手柄 -蓝牙适配器可能无法与DS3/DS4手柄匹配 -开启多重模拟 -打开/关闭这个游戏的多重模拟. -多重模拟端口 -选择进行多重模拟的端口 -禁用仿冒DS3手柄 -这个选项将使一些仿冒的DS3手柄无法工作 -Emulate FIELD flipping -Fix for games that glitch under progressive video modes. -Parental Lock Settings -Parental Lock Password -Leave blank to disable the parental lock. -Enter Parental Lock Password -Parental lock password incorrect. -Parental lock disabled. -Build Options: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? +蓝牙适配器完全兼容DS3/DS4手柄 +蓝牙适配器与DS3/DS4手柄不匹配 +开启分插模拟 +打开/关闭分插模拟. +模拟分插端口 +选择模拟的分插端口 +禁用仿制DS3手柄 +这个选项将使仿制DS3手柄无法工作 +模拟播片扫描方式切换 +修正逐行模式下视频播放有问题的游戏. +家长锁设置 +家长锁密码 +留空将不启用家长锁. +输入家长锁密码 +家长锁密码不正确. +已禁用家长锁. +创建选项: +错误-无法使用此密码. +vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! VCD文件'%s'没有找到! 重命名文件时发生错误. 删除文件时发生错误. -Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +永远不要购买OPEN-PS2-LOADER (OPL),而是免费获得: +ifcaro OPL 版本从psx-scene.com +OPL 日常开发版(DB)从ps2-home.com \ No newline at end of file diff --git a/lng/lang_Chinese_Trad.lng b/lng/lang_Chinese_Trad.lng index 4187143bb..1de0a5c5a 100644 --- a/lng/lang_Chinese_Trad.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index 259a5dcd9..d0fc62f2c 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index e68598c25..ef59033c2 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index dfdd4ec0a..2d1139c97 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 926f88d9b..9d832864b 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -134,7 +134,7 @@ Unhook Syscalls Skip Videos Emulate DVD-DL Disable IGR -High module storage +Unused Hide DEV9 module Changing the size will reformat the VMC Create diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 7da7bfb3f..5a0ba2225 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -190,7 +190,7 @@ FMV Skip Skips Full Motion Videos Cheat Settings Enable PS2RD Cheat Engine -Let PS2RD Cheat Engine patch your games +Let PS2RD Cheat Engine patch your game PS2RD Cheat Engine Mode Auto-select or Select game cheats Auto-select cheats @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French.lng b/lng/lang_French.lng index aff159ab4..1226c3242 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 1127786ec..ceb9a42d5 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: 8/25/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -259,6 +259,12 @@ Kindersicherung ausgeschaltet. Erstellungsoptionen: Fehler - Dieses Passwort kann nicht benutzt werden. VMC %s Datei ist fragmentiert. Weiter mit Memory Card in steckplatz %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 586ebb7f4..61c39acf8 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -259,6 +259,12 @@ Multitap emulator στη θύρα Επιλογές Build: Σφάλμα - αυτός ο κωδικός πρόσβασης δεν μπορεί να χρησιμοποιηθεί. Το αρχείο VMC %s είναι κατακερματισμένο. Συνέχεια με την Κάρτα Μνήμης στην υποδοχή %d; +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume Παιχνίδια PS1 Εκκίνηση μενού παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 4303e3a5b..2267c468f 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: 8/25/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -259,6 +259,12 @@ Gyerekzás kikapcsolva. Build Opciók: Hiba - ez a jelszó nem használható. VMC %s fájl töredezett. Folytatás a %d foglalatban lévő Memória Kártyával? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 56173e55c..302318619 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -259,6 +259,12 @@ Kunci Parental tidak aktif. Opsi Bentukan: Kesalahan - kata sandi tak bisa dipakai. Berkas VMC %s terfragmentasi. Gunakan kartu memori di slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index 2bc4c74ee..8e9f0fc23 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index e310fbfb3..fa475a7e6 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index a0bb28066..3bfd21540 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index 7632f7e4e..a3b6f6e3e 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index c90fa4300..4d5374a52 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 637f1429a..641f38b29 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -259,6 +259,12 @@ Controlo Parental desativado. Opções de compilação: Erro - esta password não pode ser usada. O ficheiro VMC %s está fragmentado. Continuar com o Cartão de Memoria na ranhura %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 2240513ab..c2df3adaa 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -259,6 +259,12 @@ Controle parental desativado. Opções nesta compilação: Erro - esta senha não pode ser usada. O arquivo VMC %s está fragmentado. Continuar com o cartão de memória na entrada %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index cc70384ed..d495dc108 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: 8/25/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -259,6 +259,12 @@ Multitap эмулятор на порте Опции сборки: Ошибка - этот пароль не может быть использован. VMC %s файл фрагментирован. Продолжить с картой памяти в слоте %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 7b0642dfb..16f58f23f 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: 8/27/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -259,6 +259,12 @@ Control parental desactivado. Opciones de compilación: Error - No se puede usar este password. El archivo VMC %s está fragmentado. Continuar con Memory Card en slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 47b462f1d..29058727e 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: 8/25/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -259,6 +259,12 @@ Föräldrakontroll inaktiverat Bygg-Alternativ: Fel - lösenordet kan ej användas. VMC %s filen är fragmenterad. Använd minneskort i port %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index 78809203d..caa414e0d 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante -# Last update: 8/24/2018 -# Updated for OPL_1301_DB-TA_[24f2d97] +# Last update: 12/06/2018 +# Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -259,6 +259,12 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? +Settings must be saved before continuing. +Audio Settings +Enable Sound Effects +Enable Boot Sound +Sound Effects Volume +Boot Sound Volume PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! From 4e69c91df828a84820a102b163c00b6e409e974e Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 7 Dec 2018 07:14:58 -0800 Subject: [PATCH 126/269] update lang files --- lng/lang_Indonesian.lng | 16 ++++++++-------- lng/lang_Portuguese.lng | 16 ++++++++-------- lng/lang_Swedish.lng | 14 +++++++------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 302318619..478ddde1d 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,5 +1,5 @@ # translated by verislasher and jbliz -# Last update: 12/06/2018 +# Last update: 12/07/2018 # Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian @@ -101,7 +101,7 @@ Item akan dihapus secara permanen, lanjut? Ubah nama Hapus Jalankan -Setingan tampilan +Pengaturan Tampilan Memungkinkan operasi tulis Cek fragmentasi game USB Ingat pertandingan terakhir dimainkan @@ -259,12 +259,12 @@ Kunci Parental tidak aktif. Opsi Bentukan: Kesalahan - kata sandi tak bisa dipakai. Berkas VMC %s terfragmentasi. Gunakan kartu memori di slot %d? -Settings must be saved before continuing. -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume +Pengaturan wajib disimpan sebelum melanjutkan. +Pengaturan Audio +Aktifkan efek suara +Aktifkan suara Boot +Volume efek suara +Volume suara Boot PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 641f38b29..ac204a4cd 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,5 +1,5 @@ # Translation by danielb -# Last update: 12/06/2018 +# Last update: 12/07/2018 # Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese @@ -101,7 +101,7 @@ O item será PERMANENTEMENTE apagado! Continuar? Renomear Apagar Iniciar -Configurações de Ecrâ +Definições de Visualização Ativar operações de escrita Verificar fragmentação de jogo USB Lembrar último jogo executado @@ -259,12 +259,12 @@ Controlo Parental desativado. Opções de compilação: Erro - esta password não pode ser usada. O ficheiro VMC %s está fragmentado. Continuar com o Cartão de Memoria na ranhura %d? -Settings must be saved before continuing. -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume +As definições devem ser guardadas antes de continuar. +Definições de Áudio +Ativar sons +Ativar som de Arranque +Volume dos sons +Volume do som de arranque Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 29058727e..eeaa28eee 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -101,7 +101,7 @@ Objektet ska tas bort permanent , fortsätta? Byt namn Radera Kör -Inställningar Skärm +Skärminställningar Aktivera skrivåtkomst Kontrollera USB spelfragmentering Kom ihåg senast spelade spel @@ -259,12 +259,12 @@ Föräldrakontroll inaktiverat Bygg-Alternativ: Fel - lösenordet kan ej användas. VMC %s filen är fragmenterad. Använd minneskort i port %d? -Settings must be saved before continuing. -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume +Inställningar måste sparas för att gå vidare. +Ljudinställningar +Aktivera Ljudeffekter +Aktivera Uppstartsljud +Ljudeffektsvolym +Uppstartsljudsvolym PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! From 6ffd43e279663286a900b3937f516acc9d5c35e6 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 7 Dec 2018 10:27:47 -0800 Subject: [PATCH 127/269] update lang files --- lng/lang_German.lng | 16 ++++++++-------- lng/lang_Hungarian.lng | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lng/lang_German.lng b/lng/lang_German.lng index ceb9a42d5..6aa52cd7b 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,5 +1,5 @@ # German Translation by ps2guy and LopoTRI -# Last update: 12/06/2018 +# Last update: 12/07/2018 # Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German @@ -101,7 +101,7 @@ Objekt wird dauerhaft gelöscht, wirklich fortfahren? Umbenennen Löschen Ausführen -Bildschirmeinstellungen +Anzeige Einstellungen Aktiviere Schreiboptionen Prüfe USB Spielefragmentierung Merke zuletzt gespieltes Spiel @@ -259,12 +259,12 @@ Kindersicherung ausgeschaltet. Erstellungsoptionen: Fehler - Dieses Passwort kann nicht benutzt werden. VMC %s Datei ist fragmentiert. Weiter mit Memory Card in steckplatz %d? -Settings must be saved before continuing. -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume +Einstellungen müssen gespeichert werden vor dem fortsetzen +Audio Einstellungen +Soundeffekte Einschalten +Startsound Einschalten +Lautstärke Soundeffekte +Lautstärke Startsound PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 2267c468f..997d615c1 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,5 +1,5 @@ # Translation by co5oos -# Last update: 12/06/2018 +# Last update: 12/07/2018 # Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian @@ -259,12 +259,12 @@ Gyerekzás kikapcsolva. Build Opciók: Hiba - ez a jelszó nem használható. VMC %s fájl töredezett. Folytatás a %d foglalatban lévő Memória Kártyával? -Settings must be saved before continuing. -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume +Folytatás előtt a beállításokat el kell menteni. +Hangbeállítások +Hanghatások engedélyezése +Boot Sound engedélyezése +Hanghatások hangereje +Boot Sound hangereje PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! From b46c10e46a3bdbb10abc40486b44cad96c2161a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=87a=C4=9Fhan=20DEM=C4=B0R?= Date: Sun, 9 Dec 2018 00:32:43 +0200 Subject: [PATCH 128/269] Update Turkish language (#10) * Update Turkish language * Update Turkish (2) * Fix Accurate Reads --- lng/lang_Turkish.lng | 173 ++++++++++++++++++++++--------------------- 1 file changed, 87 insertions(+), 86 deletions(-) diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index caa414e0d..e182e7cd3 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,5 +1,6 @@ # Translation by Gürkan DEMİR aka: dante -# Last update: 12/06/2018 +# Translation Update by Çağhan DEMİR aka: caghandemir +# Last update: 12/08/2018 (08-Dec-2018) # Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish @@ -8,7 +9,7 @@ Değişiklikleri kaydet Geri Ağ ayarları Gelişmiş ayarlar - + Ayarlar kayıt edildi... Ayarlar yazılırken hata oluştu! Çıkış @@ -20,15 +21,15 @@ AĞ Oyunları Uygulamalar Tema Dil -Çıkış işlemi gücü kapatacaktır. -Exit to Browser? -Güncelleme iptal edilsinmi? +Sistem kapatılacaktır. +Menüye çıkılsın mı? +Güncelleme iptal edilsin mi? %d: HardDisk sürücü bulunamadı %d: HardDisk sürücü biçimlendirilmemiş %d: Ağ başlatma hatası %d: Ağ kartı bulunamadı -%d: Paylaşım sunucusuna (SMB) bağlanılamadı -%d: Paylaşım sunucusuna (SMB)oturum açılamıyor +%d: SMB sunucusuna bağlanılamadı +%d: SMB sunucusunda oturum açılamıyor %d: Paylaşım klasörü açılamıyor %d: Ağ paylaşımları listelenemiyor %d: Oyunlar listelenemiyor @@ -43,8 +44,8 @@ Daire Çarpı Oyun listesi Oyun ayarları -Tüm ayarları kaldır -Oyunun yüm anahtarları kaldırıldı +Tüm ayarları sil +Oyunun tüm anahtarları kaldırıldı Kaydırma Yavaş Orta @@ -56,7 +57,7 @@ Oyun kimliği yüklenirken hata oluştu Otomatik sıralama Dil dosyası yüklenirken hata oluştu Hata ayıklama renklerini iptal et -Oyun kolu algılanmadı, bekliyor... +Oyun kolu algılanmadı, bekleniyor... Kapak Resimlerini etkinleştir Geniş ekran Gücü kapat @@ -67,7 +68,7 @@ Yenile USB cihazı başlangıç türü HDD cihazı başlangıç türü AĞ cihazı başlangıç türü -Uygulamalar menüsü görünüm kipi +Uygulamalar menüsü görünüm türü Otomatik El ile HDL Sunucu Başlat @@ -75,11 +76,11 @@ HDL Sunucu Başlatma Hatası HDL Sunucu Başlıyor... HDL Sunucu Çalışıyor... HDL Sunucu Durduruluyor... -IGR çıkış yolu +IGR yeri Arkaplan rengi Metin rengi - PS2 - -- SMB Server - +- SMB Sunucusu - IP adres türü Sabit DHCP @@ -102,21 +103,21 @@ Y.Adlandır Sil Çalıştır Görüntü ayarları -Enable write operations -USB oyun bütünlüğünü kontrol et(Fragmentation) -Enson oynanan oyunu hatırla -Select tuşu +Yazma işlemlerini aktif et +USB oyun bütünlüğünü kontrol et (Fragmentation) +En son oynanan oyunu hatırla +Seçme tuşu Hata, oyun dosyası parçalı Hata, nesne çalıştırılamıyor Test MİSAFİR oturumu için boş bırakınız. -Alternatif çekirdeği yükle -Synchronous Mode -Sis çağrılarını çöz +Okuma hızını emüle et +Senkronize Mod +Sistem çağrılarını çöz Videoları atla DVD-DL i etkinleştir IGR i etkisizleştir -Unused +Kullanılmıyor dev9 modulünü gizle VMC Boyutu değiştirmek VMC nin biçimlendirilmesine neden olur Oluştur @@ -137,9 +138,9 @@ VMC %sdosyası hatalı, fiziksel HK ile devam edilsin mi (slot %d) ? Otomatik yenileme Hakkında Geliştiriciler -Kalite Konturolü +Kalite Kontrolü USB önek yolu -Boots Custom ELF after an IGR +IGR'den sonra özel bir ELF'e başlar Dakika olarak değer, iptal etmek için 0 giriniz Otomatik Sabit Disk durdurma Video modu @@ -171,10 +172,10 @@ Kip 7 Kip 8 GSM ayarları Ağ Bağlantı kipi -100Mbit Tam-ikili -100Mbit Yarım-ikili -10Mbit Tam-ikili -10Mbit Yarım-ikili +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex GSM Ayarları GSM Aktif GSM'i Açar ve Kapatır @@ -185,12 +186,12 @@ Yatay Ayarlama D-Konum Dikey Ayarlama Overscan -Overscan Adjustment +Overscan Ayarı FMV Atlama Full Motion Videoları atlar Hile Ayarları PS2RD Cheat Engine'i Aktif et -PS2RD Cheat Engine'in oyunlarınıza yama yapmasına izin verir +PS2RD Cheat Engine'in oyunlara yama yapmasına izin ver PS2RD Cheat Engine Kipi Hileleri Otomatik veya Manuel seçer Hileleri Otomatik Seç @@ -208,69 +209,69 @@ Internetten ayarlar indirilsin mi? Kişiselleştirilmiş Ayarlar Varsayılanlar indirildi Otomatik başlatılacak %i s... -Auto start -Value in second(s), 0 to disable auto start -PS2 Logo -Only displayed for a valid disc logo which matches the console's region -Configure PADEMU -Pad Emulator Settings -Enable PadEmulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode -Select Pad Emulator mode. +Otomatik başlat +Saniye olarak değer, iptal etmek için 0 giriniz +PS2 Logosu +Sadece konsolun bölgesine uyan, kabul edilebilir logolar gösterilir. +PADEMU'yu ayarla +Pad Emulator Ayarları +PadEmulator Aktif Et +Seçilen oyun için PADEMU'nun durumu +Pad Emulator modu +Pad Emulator modunu seçin. DualShock3/4 USB DualShock3/4 BT -Settings for port: -Select Pad Emulator port for settings. -Enable emulation -Turns on/off Pad Emulator for selected port. -Enable vibration -Turns on/off vibration for Pad Emulator selected port. -USB Bluetooth adapter MAC address: -DS Controller paired to MAC address: -Pair -Pair DS controller -Pair DS controller with Bluetooth adapter MAC address. -Not connected -Bluetooth adapter information -Shows more information and supported features +Port için ayarlar. +Ayarlanacak Pad Emulator portunu seçin +Emulasyonu aç +Seçilen port için Pad Emulator durumu +Titreşimi aç +Seçilen port için Pad Emulator titreşimi durumu +USB Bluetooth adaptörü MAC adresi: +MAC adresi ile eşleşmiş DS kolu: +Eşleştir +DS kolu eşleştir +DS kolunu Bluetooth adaptörü MAC adresi ile eşleştir +Bağlı değil +Bluetooth adaptörü bilgileri +Desteklenen özellikler ve daha fazla bilgi gösterir HCI Version: LMP Version: Manufacturer ID: Support features: -Yes -No -Bluetooth adapter should be fully compatible with DS3/DS4 controllers. -Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation -Turns on/off Multitap emulation for selected game. -Multitap emulator on port -Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -Emulate FIELD flipping -Fix for games that glitch under progressive video modes. -Parental Lock Settings -Parental Lock Password -Leave blank to disable the parental lock. -Enter Parental Lock Password -Parental lock password incorrect. -Parental lock disabled. -Build Options: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume -PS1 Games -PS1 Games display mode -POPSTARTER.ELF not found at '%s'! -VCD file '%s' not found! -An error occurred while renaming the file. -An error occurred while deleting the file. +Evet +Hayır +Bluetooth adaptörü DS3/DS4 kolları ile büyük ihtimalle tam uyumlu. +Bluetooth adaptörü DS3/DS4 kolları ile tam doğru çalışmayabilir. +Multitap emulasyonunu aç +Seçilen oyun için Multitap emulasyonu durumu +Multitap emulasyonu portu +Multitap emulasyonu için port seçin +Sahte DS3ler için workaround'u kapat +Bazı sahte DS3ler ile çalışabilmek için gereken workaround'u kapatır. +FIELD flipping emüle et +Progressive video modları ile bozulan oyunlar için çözüm yaması. +Ebeveyn Kilidi Ayarları +Ebeveyn Kilidi Şifresi +Ebeveyn Kilidini kapatmak için boş bırakın. +Ebeveyn Kilidi Şifresini Girin. +Ebeveyn Kilidi Şifresi Yanlış. +Ebeveyn Kilidi Kapatıldı. +Build Ayarları: +Hata - bu parola kullanılamaz. +VMC %sdosyası fragment olmuş, fiziksel HK ile devam edilsin mi (slot %d)? +Devam etmeden önce ayarlar kaydedilmelidir. +Ses Ayarları +Ses Efektleri Olsun +Açılış Sesi Olsun +Ses Efektleri Kuvveti +Açılış Sesi Kuvveti +PS1 Oyunları +PS1 Oyunları Ekran Modu +POPSTARTER.ELF '%s' de bulunamadı. +VCD dosyası '%s' bulunamadı! +Dosya yeniden adlandırılırken bir sorun çıktı. +Dosya silinirken bir sorun çıktı. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: ifcaro OPL version at psx-scene.com OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file From 4c8666cf8a4e3519b4da1bf8721fdc48b439ba5a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 8 Dec 2018 14:44:57 -0800 Subject: [PATCH 129/269] update lang files --- lng/lang_Portuguese_BR.lng | 14 +++++++------- lng/lang_Russian.lng | 14 +++++++------- lng/lang_Turkish.lng | 5 ++--- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index c2df3adaa..bad2303eb 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,5 +1,5 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 12/06/2018 +# Last update: 12/07/2018 # Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese @@ -259,12 +259,12 @@ Controle parental desativado. Opções nesta compilação: Erro - esta senha não pode ser usada. O arquivo VMC %s está fragmentado. Continuar com o cartão de memória na entrada %d? -Settings must be saved before continuing. -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume +As configurações devem ser salvas antes de continuar. +Configurações de áudio +Ativar efeitos sonoros +Ativar som de inicialização +Volume de efeitos sonoros +Volume do som de inicialização Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index d495dc108..2da2127eb 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,5 +1,5 @@ # Translated by druchapucha and frodosumkin -# Last update: 12/06/2018 +# Last update: 12/08/2018 # Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian @@ -259,12 +259,12 @@ Multitap эмулятор на порте Опции сборки: Ошибка - этот пароль не может быть использован. VMC %s файл фрагментирован. Продолжить с картой памяти в слоте %d? -Settings must be saved before continuing. -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume +Чтобы продолжить, настройки должны быть сохранены. +Аудио настройки +Включить звуковые эффекты +Включить звук загрузки +Громкость звуковых эффектов +Громкость звука загрузки PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index e182e7cd3..bb22d12ea 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,5 @@ -# Translation by Gürkan DEMİR aka: dante -# Translation Update by Çağhan DEMİR aka: caghandemir -# Last update: 12/08/2018 (08-Dec-2018) +# Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir +# Last update: 12/08/2018 # Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish From ff7ea5e879f0370a778306c0ad7988b723927772 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 13 Dec 2018 17:38:59 -0800 Subject: [PATCH 130/269] update lang files --- lng/lang_Arabic.lng | 14 +++++++------- lng/lang_Chinese_Simp.lng | 14 +++++++------- lng/lang_Spanish.lng | 16 ++++++++-------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index c7158c52b..5c4eeb108 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,5 +1,5 @@ # translation by alimadhi -# Last update: 12/06/2018 +# Last update: 12/09/2018 # Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic @@ -259,12 +259,12 @@ LMP الاصدار: خيارات البناء: خطأ - لا يمكن استخدام كلمة المرور هذه. ملف VMC %s مجزأ. تواصل مع بطاقة الذاكرة في الفتحة %d? -Settings must be saved before continuing. -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume +يجب حفظ الاعدادات قبل الاستمرار. +اعدادات الصوت +تمكين مؤثرات الصوت +تمكين تمهيد الصوت +حجم المؤثرات الصوتية +حجم صوت التمهيد PS1 العاب PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index 5775ad09e..422087df1 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,5 +1,5 @@ # Translated by kane159 and eyu2007 -# Last update: 12/06/2018 +# Last update: 12/10/2018 # Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese @@ -259,12 +259,12 @@ LMP版本: 创建选项: 错误-无法使用此密码. vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? -Settings must be saved before continuing. -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume +必须先保存设置, 然后才能继续. +音频设置 +启用声音效果 +启用启动声音 +音效音量 +启动音量 PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 16f58f23f..0ab793f7c 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,5 +1,5 @@ # Translation by lauchon22 -# Last update: 12/06/2018 +# Last update: 12/13/2018 # Updated for OPL_1345_DB-TA_[d0f1616] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -101,7 +101,7 @@ El archivo se borrará definitivamente, ¿continuar? Renombrar Borrar Iniciar -Preferencias de pantalla +Configuraciones de pantalla Mostrar operaciones de escritura Comprobar fragmentación juego USB Recordar último juego en uso @@ -259,12 +259,12 @@ Control parental desactivado. Opciones de compilación: Error - No se puede usar este password. El archivo VMC %s está fragmentado. Continuar con Memory Card en slot %d? -Settings must be saved before continuing. -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume +Los ajustes deben guardarse antes de continuar. +Configuraciones de audio +Habilitar efectos de sonido +Habilitar sonido de inicio +Volumen de efectos de sonido +Volumen de sonido de inicio Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! From e21bba4c0d36e132d2672cc51c7a08b3a8af9bb9 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 16 Dec 2018 01:54:48 -0800 Subject: [PATCH 131/269] update lang files --- lng/lang_Arabic.lng | 5 ++--- lng/lang_Bulgarian.lng | 5 ++--- lng/lang_Chinese_Simp.lng | 5 ++--- lng/lang_Chinese_Trad.lng | 5 ++--- lng/lang_Czech.lng | 5 ++--- lng/lang_Danish.lng | 5 ++--- lng/lang_Dutch.lng | 5 ++--- lng/lang_English.lng | 1 - lng/lang_Filipino.lng | 5 ++--- lng/lang_French.lng | 5 ++--- lng/lang_German.lng | 5 ++--- lng/lang_Greek.lng | 5 ++--- lng/lang_Hungarian.lng | 5 ++--- lng/lang_Indonesian.lng | 5 ++--- lng/lang_Italian.lng | 5 ++--- lng/lang_Japanese.lng | 5 ++--- lng/lang_Korean.lng | 5 ++--- lng/lang_Laotian.lng | 5 ++--- lng/lang_Polish.lng | 5 ++--- lng/lang_Portuguese.lng | 5 ++--- lng/lang_Portuguese_BR.lng | 5 ++--- lng/lang_Russian.lng | 5 ++--- lng/lang_Spanish.lng | 5 ++--- lng/lang_Swedish.lng | 5 ++--- lng/lang_Turkish.lng | 5 ++--- 25 files changed, 48 insertions(+), 73 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 5c4eeb108..b8ca48b26 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: 12/09/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s @@ -259,7 +259,6 @@ LMP الاصدار: خيارات البناء: خطأ - لا يمكن استخدام كلمة المرور هذه. ملف VMC %s مجزأ. تواصل مع بطاقة الذاكرة في الفتحة %d? -يجب حفظ الاعدادات قبل الاستمرار. اعدادات الصوت تمكين مؤثرات الصوت تمكين تمهيد الصوت diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index d562b9251..26a97d87a 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index 422087df1..8375eb3f6 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 12/10/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -259,7 +259,6 @@ LMP版本: 创建选项: 错误-无法使用此密码. vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? -必须先保存设置, 然后才能继续. 音频设置 启用声音效果 启用启动声音 diff --git a/lng/lang_Chinese_Trad.lng b/lng/lang_Chinese_Trad.lng index 1de0a5c5a..c48897e93 100644 --- a/lng/lang_Chinese_Trad.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index d0fc62f2c..fd0f0a2ed 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index ef59033c2..39f7f10f0 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index 2d1139c97..af1a559f7 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 9d832864b..8aef097fd 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -277,7 +277,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 5a0ba2225..28db87f27 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 1226c3242..99e8bd2ab 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 6aa52cd7b..a03d4e991 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: 12/07/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -259,7 +259,6 @@ Kindersicherung ausgeschaltet. Erstellungsoptionen: Fehler - Dieses Passwort kann nicht benutzt werden. VMC %s Datei ist fragmentiert. Weiter mit Memory Card in steckplatz %d? -Einstellungen müssen gespeichert werden vor dem fortsetzen Audio Einstellungen Soundeffekte Einschalten Startsound Einschalten diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 61c39acf8..1b7ec8adf 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -259,7 +259,6 @@ Multitap emulator στη θύρα Επιλογές Build: Σφάλμα - αυτός ο κωδικός πρόσβασης δεν μπορεί να χρησιμοποιηθεί. Το αρχείο VMC %s είναι κατακερματισμένο. Συνέχεια με την Κάρτα Μνήμης στην υποδοχή %d; -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 997d615c1..d9f5ff057 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: 12/07/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -259,7 +259,6 @@ Gyerekzás kikapcsolva. Build Opciók: Hiba - ez a jelszó nem használható. VMC %s fájl töredezett. Folytatás a %d foglalatban lévő Memória Kártyával? -Folytatás előtt a beállításokat el kell menteni. Hangbeállítások Hanghatások engedélyezése Boot Sound engedélyezése diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 478ddde1d..b29231214 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: 12/07/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -259,7 +259,6 @@ Kunci Parental tidak aktif. Opsi Bentukan: Kesalahan - kata sandi tak bisa dipakai. Berkas VMC %s terfragmentasi. Gunakan kartu memori di slot %d? -Pengaturan wajib disimpan sebelum melanjutkan. Pengaturan Audio Aktifkan efek suara Aktifkan suara Boot diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index 8e9f0fc23..cf5d8c381 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index fa475a7e6..3777cef8b 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 3bfd21540..f6ba79d4e 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index a3b6f6e3e..ff001074b 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index 4d5374a52..0930c8189 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -259,7 +259,6 @@ Parental lock disabled. Build Options: Error - this password cannot be used. VMC %s file is fragmented. Continue with Memory Card in slot %d? -Settings must be saved before continuing. Audio Settings Enable Sound Effects Enable Boot Sound diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index ac204a4cd..b4302b9f1 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: 12/07/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -259,7 +259,6 @@ Controlo Parental desativado. Opções de compilação: Erro - esta password não pode ser usada. O ficheiro VMC %s está fragmentado. Continuar com o Cartão de Memoria na ranhura %d? -As definições devem ser guardadas antes de continuar. Definições de Áudio Ativar sons Ativar som de Arranque diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index bad2303eb..bd7d23557 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 12/07/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -259,7 +259,6 @@ Controle parental desativado. Opções nesta compilação: Erro - esta senha não pode ser usada. O arquivo VMC %s está fragmentado. Continuar com o cartão de memória na entrada %d? -As configurações devem ser salvas antes de continuar. Configurações de áudio Ativar efeitos sonoros Ativar som de inicialização diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 2da2127eb..72f511532 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: 12/08/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -259,7 +259,6 @@ Multitap эмулятор на порте Опции сборки: Ошибка - этот пароль не может быть использован. VMC %s файл фрагментирован. Продолжить с картой памяти в слоте %d? -Чтобы продолжить, настройки должны быть сохранены. Аудио настройки Включить звуковые эффекты Включить звук загрузки diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 0ab793f7c..a80c18858 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: 12/13/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -259,7 +259,6 @@ Control parental desactivado. Opciones de compilación: Error - No se puede usar este password. El archivo VMC %s está fragmentado. Continuar con Memory Card en slot %d? -Los ajustes deben guardarse antes de continuar. Configuraciones de audio Habilitar efectos de sonido Habilitar sonido de inicio diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index eeaa28eee..d1e652d91 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: 12/06/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -259,7 +259,6 @@ Föräldrakontroll inaktiverat Bygg-Alternativ: Fel - lösenordet kan ej användas. VMC %s filen är fragmenterad. Använd minneskort i port %d? -Inställningar måste sparas för att gå vidare. Ljudinställningar Aktivera Ljudeffekter Aktivera Uppstartsljud diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index bb22d12ea..0446d980a 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: 12/08/2018 -# Updated for OPL_1345_DB-TA_[d0f1616] +# Last update: 12/15/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -259,7 +259,6 @@ Ebeveyn Kilidi Kapatıldı. Build Ayarları: Hata - bu parola kullanılamaz. VMC %sdosyası fragment olmuş, fiziksel HK ile devam edilsin mi (slot %d)? -Devam etmeden önce ayarlar kaydedilmelidir. Ses Ayarları Ses Efektleri Olsun Açılış Sesi Olsun From 0b9bd21cfab3ae2efa1420891a3888a7a390321c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 19 Dec 2018 00:23:55 -0800 Subject: [PATCH 132/269] update lang files --- lng/lang_Persian.lng | 275 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 lng/lang_Persian.lng diff --git a/lng/lang_Persian.lng b/lng/lang_Persian.lng new file mode 100644 index 000000000..0f9a33e46 --- /dev/null +++ b/lng/lang_Persian.lng @@ -0,0 +1,275 @@ +# Translation by saeid0035 +# Last update: 12/18/2018 +# Updated for OPL_1359_DB-TA_[d0ac8e5] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +Persian +OPL %s +ذخیره تغییرات +برگشت +پیکربندی شبکه +تنظیمات پیشرفته +<بدون مقدار> +تنظیمات ذخیره شد... +در نوشتن تنظیمات مشکلی پیش آمد! +خروج +تنظیمات +منو +بازی های فلش مموری +بازی های هارد +بازی های در شبکه +برنامه ها +پوسته ها +زبان ها +سیستم بزودی خاموش میشود. +میخواهید به منوی مرورگر اصلی دستگاه برگردید؟ +آپدیت لغو شود؟ +%d: درایو هارد دیسک شناسایی نشد +%d: درایو هارد دیسک فرم:نشده +%d: راه اندازی شبکه با مشکل مواجه شد +%d: هیچ آداپتور شبکه ای شناسایی نشد +%d: متصل شدن به سرور SMB موفقیت آمیز نبود +%d: وارد شدن به سرور SMB موفقیت آمیز نبود +%d: بازکردن اشتراک SMB موفقیت آمیز نبود +%d: لیست کردن اشترک های SMB موفقیت آمیز نبود +%d: لیست کردن بازی ها موفقیت آمیز نبود +%d: سرور DHCP در دسترس نیست +%d: هیچ اتصال شبکه ای در دسترس نیست +روشن +خاموش +حله +انتخاب +لغو +دایره +ضربدر +لیست بازی ها +تنظیمات بازی +حذف تمامی تنظیمات +تمام کلید های بازی پاک شد +سرعت اسکرول +آهسته +متوسط +سریع +منوی پیشفرض +بارگذاری از دیسک +لطفا منتظر بمانید +در بارگذاری آیدی بازی مشکلی پیش آمده +چینش خودکار +در بارگذاری فایل زبان مشکلی پیش آمده +غیرفعال کردن رنگ های مشکل زدایی +هیچ کنترلری شناسایی نشد، منتظر بمانید... +فعال کردن تصویر کاور +صفحه ی کشید +خاموش کردن کنسول +درحال بارگذاری پیکربندی +درحال ذخیره ی پیکربندی +شروع دیوایس +تازه سازی +حالت شروع فلش مموزی +حالت شروع هارد دیسک +حالت شروع تحت شبکه +حالت نمایش منو برنامه ها +خودکار +دستی +شروع سرور HDL +سرور HDL درحال راه اندازی میباشد... +سرور HDL درحال اجرا میباشد... +شروع سرور HDL شکست خورد. +سرور HDL بارگذاری نمیشود... +مسیر IGR +رنگ پس زمینه +رنگ متن +- پلی استیشن ۲ - +- سرور SMB - +حالت آدرس آیپی +Static +DHCP +آدرس آیپی +آدرس +Mask +Gateway +سرور DNS +پورت +اشتراک +نام کاربری +رمز عبور +<تنظیم نشده> +حالت آدرس +آیپی +NetBIOS +پذیزش +آیتم بصورت کامل پاک میشود، ادامه میدهید؟ +تغییر نام +پاک کردن +اجرا +تنظیمات نمایش +فعال کردن سیستم نوشتن +چک کردن بهم ریختگی بازی های فلش مموری +به خاطر سپردن آخرین بازی انجام شده +دکمه انتخاب کردن +مشکلی پیش آمده، فایل هلی بازی بهم ریخته میباشد +مشکلی پیش آمده، این آیتم اجرا نمیشود +تست +برای ورود بصورت ناشناس خالی بگذارید. +Accurate Reads +Synchronous Mode +Unhook Syscalls +پرش از ویدیو ها +شبیه سازی DVD-DL +غیرفعال کردن IGR +Unused +Hide DEV9 module +درحال تغییر سایز در هنگام فرمت مجدد VMC +ساختن +شروع +ساختن +رها کردن +بازگردانی +Use generic +پیکربندی VMC +نام +سایز +وضعیت +پیشرفت +فایل VMC موجود است +فایل VMC نامعتبر است، سایز وارد شده اشتباست +فایل VMC نیاز به ساخته شدن دارد +در فایل VMC مشکلی پیش آمده %s، با سیو فیزیکی خود ادامه میدهید (درگاه %d) ؟ +تازه سازی خودکار +درباره +توسعه دهندگان +Quality Assurance +مسیر ترجیحی USB +اجرای فایل ELF سفارشی بعد از IGR +مقدار در دقیقه، صفر برای غیرفعال کردن کاهش چرخش +کاهش چرخش خودکار هارد دیسک +حالت ویدیو +رنگ دیالوگ ها +رنگ انتخاب شده +نشان دادن صفحه اطلاعات +اطلاعات +فایل ELF سفارشی +انتخاب رنگ +اتصال مجدد +برای لیست اشتراک ها خالی بگذارید +مسیر ترجیخی بازی های تحت شبکه +پاک کردن +فاصله +اینتر +حالت +درگاه VMC ۱ +درگاه VMC ۲ +آیدی بازی +حالت DMA +V-Sync +حالت ۱ +حالت ۲ +حالت ۳ +حالت ۴ +حالت ۵ +حالت ۶ +حالت ۷ +حالت ۸ +پیکربندی GSM +Ethernet link mode +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex +تنظیمات GSM +فعال کردن GSM +روشن یا خاموش کردن GSM +حالت ویدیو +اجباری کردن حالت نمایش سفارشی +H-POS +Horizontal Adjustment +V-POS +Vertical Adjustment +Overscan +Overscan Adjustment +FMV Skip +Skips Full Motion Videos +تنظیمات کد های تقلب +فعال کردن موتور تقلب PS2RD +بزن بریم تا PS2RD بازی های شمارو پچ کنه +حالت موتور تقلب PS2RD +انتخاب خودکار یا انتخاب دستی کد های تقلب بازی +انتخاب خودکار کد های تقلب +انتخاب دستی کد های تقلب +مشکلی پیش آمده: بارگذاری فایل کد های تقلب شکست خورد +هیچ کد تقلبی موجود نیست +دانلود پیشفرض ها +آپدیت از طریق شبکه +دانلود مجدد فایل های موجود؟ +آپدیت شکست خورپ. +اتصال به سرور آپدیت ها شکست خورد. +آپدیت تکمیل شد. +آپدیت لغو شد. +دانلود تنظیمات از اینترنت؟ +تنظیمات شخصی سازی شده +پیشفرض ها دانلود شدند +بصورت خودکار در %i ثانیه دیگر شروع میشود... +شروع خودکار +مقدار بر حسب ثانیه،‌ برای غیرفعال کردن شروع خودکار ۰ بزارید +لوگو پلی استیشن ۲ +فقط برای یک دیسک معتبر که به ریجن کنسول هم هم خوانی داشته باشد نمایش داده میشود +پیکربندی PADEMU +تنظیمان شبیه ساز Pad +فعال کردن Pad +روشن یا خاموش کردن شبیه‌ساز Pad برای بازی های انتخاب شده. +حالت شبیه سازPad +حالت شبیه ساز Pad را انتخاب کنید. +کنترلر پلی استیشن ۳ یا ۴ از طریق درگاه usb +کنترلر پلی استیشن ۳ یا ۴ از طریق بلوتوث +تنظیمات برای پورت: +پورت شبیه ساز Pad را برای اعمال تنظیمات انتخاب کنید. +فعال کردن شبیه سازی +روشن و یا خاموش کردن شبیه ساز Pad برای پورت های انتخاب شده. +فعال کردن شوک +روشن و یا خاموش کردن شوک برای پورت های انتخاب شده در شبیه ساز Pad. +مک آدرس آداپتور بلوتوث داخل درگاه USB: +کنترلر با این مک آدرس جفت شد: +جفت کردن +جفت کردن کنترلر +جفت کردن کنترلر با مک آدرس آداپتور بلوتوث. +متصل نشد +اطلاعات آداپتور بلوتوث +نشان دادن اطلاعات بیشتر و ویژگی های پشتیبانی شده. +نسخه HCI: +نسخه LMP: +آیدی Manufacturer: +ویژگی های پشتیبانی: +بله +نه +آداپتور بلوتوث باید بطور کامل از کنترلر های پلی استیشن ۳ و ۴ پشتیبانی بکند. +مثل اینکه آداپتور بلوتوث بخوبی از کنترلر پشتیبانی نمیکند. +فعال کردن شبیه سازی زدن چند دکمه همزمان +روشن و یا خاموش کردن شبیه سازی زدن چند دکمه همزمان. +فعال کردن شبیه ساز زدن چند دکمه همزمان برای پورت +انتخاب پورت برای شبیه سازی زدن چند دکمه همزمان. +غیرفعال کردن workaround برای کنترلر های تقلبی پلی استیشن ۳ +برخی از کنترلر های تقلبی پلی استیشن ۳ به workaround نیاز دارند، این گزینه آن را غیرفعال میکند. +شبیه سازی FIELD flipping +برای حل مشکل گلیچ بعضی از بازی هاحین فعال بودن حالت ویدیویی progressive. +تنظیمات قفل والدین +کلمه عبور قفل والدین +برای غیرفعال کردن قفل والدین این گزینه را خالی بگذارید. +کلمه عبور قفل والدین را وارد کنید +کلمه عبور قفل والدین اشتباه است. +قفل والدین غیرفعال شد. +حالت های Build: +مشکلی پیش آمذه - نمیتوان از این پسورد استفاده کرد. +فایل VMC %s به هم ریخته شدن است. با سیو داخل درگاه %d ادامه میدهید؟ +تنظیمات صدا +فعال کردن افکت های صدا +فعال کرذن صدای بوت +میزان بلندی صدای افکت ها +میزان بلندی صدای بوت +بازی های پلی استیشن ۱ +حالت نمایش بازی های پلی استیشن ۱ +فایل POPSTARTER.ELF در '%s'موجود نیست! +فایل VCD '%s' وجود ندارد! +در هنگام تغییر نام فایل مشکلی پیش آمده است. +در هنگام پاک کردن فایل مشکلی پیش آمده است. +هیچوقت OPEN-PS2-LOADER (OPL) را نخرید، میتوانید آن را از لینک پایین رایگان بگیرید: +نسخه ی ifcaro OPL در psx-scene.com +نسخه آپدیت روزانه ی OPL (DB) در ps2-home.com \ No newline at end of file From b730609549607039a703418af887f3294ce2902b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 3 Jan 2019 20:32:27 -0800 Subject: [PATCH 133/269] update lang files --- lng/lang_Arabic.lng | 5 +++-- lng/lang_Bulgarian.lng | 5 +++-- lng/lang_Chinese_Simp.lng | 5 +++-- lng/lang_Chinese_Trad.lng | 5 +++-- lng/lang_Czech.lng | 5 +++-- lng/lang_Danish.lng | 5 +++-- lng/lang_Dutch.lng | 5 +++-- lng/lang_English.lng | 1 + lng/lang_Filipino.lng | 5 +++-- lng/lang_French.lng | 5 +++-- lng/lang_German.lng | 5 +++-- lng/lang_Greek.lng | 5 +++-- lng/lang_Hungarian.lng | 5 +++-- lng/lang_Indonesian.lng | 5 +++-- lng/lang_Italian.lng | 5 +++-- lng/lang_Japanese.lng | 5 +++-- lng/lang_Korean.lng | 5 +++-- lng/lang_Laotian.lng | 5 +++-- lng/lang_Persian.lng | 5 +++-- lng/lang_Polish.lng | 5 +++-- lng/lang_Portuguese.lng | 5 +++-- lng/lang_Portuguese_BR.lng | 5 +++-- lng/lang_Russian.lng | 5 +++-- lng/lang_Spanish.lng | 5 +++-- lng/lang_Swedish.lng | 5 +++-- lng/lang_Turkish.lng | 5 +++-- 26 files changed, 76 insertions(+), 50 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index b8ca48b26..06f37230c 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s @@ -264,6 +264,7 @@ LMP الاصدار: تمكين تمهيد الصوت حجم المؤثرات الصوتية حجم صوت التمهيد +Confirm video mode change? PS1 العاب PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 26a97d87a..0f3ef07e2 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index 8375eb3f6..5bf41b550 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -264,6 +264,7 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 启用启动声音 音效音量 启动音量 +Confirm video mode change? PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Chinese_Trad.lng b/lng/lang_Chinese_Trad.lng index c48897e93..2788217aa 100644 --- a/lng/lang_Chinese_Trad.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index fd0f0a2ed..adbb2ea7f 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index 39f7f10f0..8377c511d 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index af1a559f7..08eb88bd1 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 8aef097fd..ea7b6364c 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -282,6 +282,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 28db87f27..54bb91938 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 99e8bd2ab..1e5760f98 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_German.lng b/lng/lang_German.lng index a03d4e991..f18286424 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -264,6 +264,7 @@ Soundeffekte Einschalten Startsound Einschalten Lautstärke Soundeffekte Lautstärke Startsound +Confirm video mode change? PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 1b7ec8adf..d61de54b2 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? Παιχνίδια PS1 Εκκίνηση μενού παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index d9f5ff057..7e34e8cd8 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -264,6 +264,7 @@ Hanghatások engedélyezése Boot Sound engedélyezése Hanghatások hangereje Boot Sound hangereje +Confirm video mode change? PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index b29231214..ccfabaefa 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -264,6 +264,7 @@ Aktifkan efek suara Aktifkan suara Boot Volume efek suara Volume suara Boot +Confirm video mode change? PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index cf5d8c381..2a7bf7eec 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index 3777cef8b..d9f809495 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index f6ba79d4e..aca50b606 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index ff001074b..ed63af50d 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Persian.lng b/lng/lang_Persian.lng index 0f9a33e46..8e7ce5d11 100644 --- a/lng/lang_Persian.lng +++ b/lng/lang_Persian.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: 12/18/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s @@ -264,6 +264,7 @@ Skips Full Motion Videos فعال کرذن صدای بوت میزان بلندی صدای افکت ها میزان بلندی صدای بوت +Confirm video mode change? بازی های پلی استیشن ۱ حالت نمایش بازی های پلی استیشن ۱ فایل POPSTARTER.ELF در '%s'موجود نیست! diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index 0930c8189..53f909bb3 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -264,6 +264,7 @@ Enable Sound Effects Enable Boot Sound Sound Effects Volume Boot Sound Volume +Confirm video mode change? PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index b4302b9f1..aad23fb02 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -264,6 +264,7 @@ Ativar sons Ativar som de Arranque Volume dos sons Volume do som de arranque +Confirm video mode change? Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index bd7d23557..848b42552 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -264,6 +264,7 @@ Ativar efeitos sonoros Ativar som de inicialização Volume de efeitos sonoros Volume do som de inicialização +Confirm video mode change? Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 72f511532..042a3a6e9 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -264,6 +264,7 @@ VMC %s файл фрагментирован. Продолжить с карто Включить звук загрузки Громкость звуковых эффектов Громкость звука загрузки +Confirm video mode change? PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index a80c18858..7153f005b 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -264,6 +264,7 @@ Habilitar efectos de sonido Habilitar sonido de inicio Volumen de efectos de sonido Volumen de sonido de inicio +Confirm video mode change? Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index d1e652d91..2de3fdc2f 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -264,6 +264,7 @@ Aktivera Ljudeffekter Aktivera Uppstartsljud Ljudeffektsvolym Uppstartsljudsvolym +Confirm video mode change? PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index 0446d980a..26abab619 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: 12/15/2018 -# Updated for OPL_1359_DB-TA_[d0ac8e5] +# Last update: Jan. 3, 2019 +# Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -264,6 +264,7 @@ Ses Efektleri Olsun Açılış Sesi Olsun Ses Efektleri Kuvveti Açılış Sesi Kuvveti +Confirm video mode change? PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. From e06c7a8fa2168aa01864ea628b424d91f7004530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=87a=C4=9Fhan=20DEM=C4=B0R?= Date: Fri, 4 Jan 2019 21:46:51 +0200 Subject: [PATCH 134/269] Update lang_Turkish.lng (#11) --- lng/lang_Turkish.lng | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index 26abab619..cc6d2159a 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -264,7 +264,7 @@ Ses Efektleri Olsun Açılış Sesi Olsun Ses Efektleri Kuvveti Açılış Sesi Kuvveti -Confirm video mode change? +Video çıkış modu değiştirilsin mi? PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. From 3ce2ef8b6f2b56e7e24d3e75a63c18dd4945e2f2 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 4 Jan 2019 13:11:46 -0800 Subject: [PATCH 135/269] update lang files --- lng/lang_Hungarian.lng | 4 ++-- lng/lang_Portuguese.lng | 4 ++-- lng/lang_Portuguese_BR.lng | 4 ++-- lng/lang_Spanish.lng | 4 ++-- lng/lang_Turkish.lng | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 7e34e8cd8..e3f7010d1 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,5 +1,5 @@ # Translation by co5oos -# Last update: Jan. 3, 2019 +# Last update: Jan. 4, 2019 # Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian @@ -264,7 +264,7 @@ Hanghatások engedélyezése Boot Sound engedélyezése Hanghatások hangereje Boot Sound hangereje -Confirm video mode change? +Videó mód változtatás jóváhagyása? PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index aad23fb02..94eeef251 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,5 +1,5 @@ # Translation by danielb -# Last update: Jan. 3, 2019 +# Last update: Jan. 4, 2019 # Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese @@ -264,7 +264,7 @@ Ativar sons Ativar som de Arranque Volume dos sons Volume do som de arranque -Confirm video mode change? +Confirmar alteração do modo de vídeo? Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 848b42552..409652e8d 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,5 +1,5 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Jan. 3, 2019 +# Last update: Jan. 4, 2019 # Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese @@ -264,7 +264,7 @@ Ativar efeitos sonoros Ativar som de inicialização Volume de efeitos sonoros Volume do som de inicialização -Confirm video mode change? +Confirmar alteração do modo de vídeo? Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 7153f005b..fa88c0c13 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,5 +1,5 @@ # Translation by lauchon22 -# Last update: Jan. 3, 2019 +# Last update: Jan. 4, 2019 # Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -264,7 +264,7 @@ Habilitar efectos de sonido Habilitar sonido de inicio Volumen de efectos de sonido Volumen de sonido de inicio -Confirm video mode change? +Confirma cambiar modo de video? Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index cc6d2159a..e04ac35bd 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,5 +1,5 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: Jan. 3, 2019 +# Last update: Jan. 4, 2019 # Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish From 1926166ff5902f4a32da2c0253343e1265cf6c75 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 9 Jan 2019 15:57:09 -0800 Subject: [PATCH 136/269] update lang files --- lng/lang_Chinese_Simp.lng | 4 ++-- lng/lang_German.lng | 4 ++-- lng/lang_Indonesian.lng | 4 ++-- lng/lang_Swedish.lng | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index 5bf41b550..8d1ca73f8 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,5 +1,5 @@ # Translated by kane159 and eyu2007 -# Last update: Jan. 3, 2019 +# Last update: Jan. 5, 2019 # Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese @@ -264,7 +264,7 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 启用启动声音 音效音量 启动音量 -Confirm video mode change? +确认视频模式更改? PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_German.lng b/lng/lang_German.lng index f18286424..05d86e50f 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,5 +1,5 @@ # German Translation by ps2guy and LopoTRI -# Last update: Jan. 3, 2019 +# Last update: Jan. 6, 2019 # Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German @@ -264,7 +264,7 @@ Soundeffekte Einschalten Startsound Einschalten Lautstärke Soundeffekte Lautstärke Startsound -Confirm video mode change? +Änderung des Video signals übernehmen? PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index ccfabaefa..20dfe43cd 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,5 +1,5 @@ # translated by verislasher and jbliz -# Last update: Jan. 3, 2019 +# Last update: Jan. 5, 2019 # Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian @@ -264,7 +264,7 @@ Aktifkan efek suara Aktifkan suara Boot Volume efek suara Volume suara Boot -Confirm video mode change? +Konfirmasi mengubah mode video? PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 2de3fdc2f..f5bc39a90 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,5 +1,5 @@ # Translation by Lord_Flaya -# Last update: Jan. 3, 2019 +# Last update: Jan. 4, 2019 # Updated for OPL_1386_DB-TA_[d409ba5] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish @@ -264,7 +264,7 @@ Aktivera Ljudeffekter Aktivera Uppstartsljud Ljudeffektsvolym Uppstartsljudsvolym -Confirm video mode change? +Bekräfta ändring av videoläge? PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! From a5abeb36fc0d5fe14b185af1aeecc6a3a159a9b3 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 13 Jan 2019 00:30:52 -0800 Subject: [PATCH 137/269] Revert "Merge https://github.com/ifcaro/open-ps2-loader" This reverts commit 38b11afcd7847f4461c988156ee00ca5817e8117, reversing changes made to 14ecf62df456d85ab3705c45f3af2ff6a41c52ad. --- Makefile | 20 +- ee_core/src/patches.c | 55 +----- include/appsupport.h | 17 -- include/config.h | 1 - include/debug.h | 1 - include/dialogs.h | 1 - include/ethsupport.h | 5 +- include/extern_irx.h | 9 - include/hddsupport.h | 5 +- include/iosupport.h | 15 +- include/lang.h | 1 - include/opl.h | 16 +- include/supportbase.h | 27 ++- include/system.h | 9 +- include/util.h | 1 - modules/debug/deci2.img | Bin 73625 -> 0 bytes modules/debug/drvtif-ingame.irx | Bin 5985 -> 0 bytes modules/debug/tifinet-ingame.irx | Bin 3301 -> 0 bytes modules/debug/tifinet.irx | Bin 3301 -> 3301 bytes src/appsupport.c | 327 ++++++------------------------- src/config.c | 2 +- src/debug.c | 22 --- src/dialogs.c | 5 - src/ethsupport.c | 61 ++---- src/gui.c | 2 - src/hdd.c | 15 +- src/hddsupport.c | 199 ++----------------- src/ioman.c | 5 +- src/lang.c | 1 - src/opl.c | 223 ++++++--------------- src/supportbase.c | 326 ++++++------------------------ src/system.c | 104 +++++----- src/usbsupport.c | 28 +-- src/util.c | 80 -------- 34 files changed, 305 insertions(+), 1278 deletions(-) delete mode 100755 modules/debug/deci2.img delete mode 100755 modules/debug/drvtif-ingame.irx delete mode 100755 modules/debug/tifinet-ingame.irx diff --git a/Makefile b/Makefile index d7ebc1cb5..b590affca 100755 --- a/Makefile +++ b/Makefile @@ -141,12 +141,7 @@ endif ifeq ($(DEBUG),1) EE_CFLAGS += -D__DEBUG -g - ifeq ($(DECI2_DEBUG),1) - EE_OBJS += debug.o drvtif_irx.o tifinet_irx.o deci2_img.o - EE_LDFLAGS += -liopreboot - else - EE_OBJS += debug.o udptty.o ioptrap.o ps2link.o - endif + EE_OBJS += debug.o udptty.o ioptrap.o ps2link.o MOD_DEBUG_FLAGS = DEBUG=1 ifeq ($(IOPCORE_DEBUG),1) EE_CFLAGS += -D__INGAME_DEBUG @@ -166,9 +161,9 @@ ifeq ($(DEBUG),1) ifeq ($(DECI2_DEBUG),1) EE_CFLAGS += -D__DECI2_DEBUG EECORE_EXTRA_FLAGS += DECI2_DEBUG=1 - IOP_OBJS += drvtif_ingame_irx.o tifinet_ingame_irx.o + IOP_OBJS += drvtif_irx.o tifinet_irx.o DECI2_DEBUG=1 - CDVDMAN_DEBUG_FLAGS = USE_DEV9=1 #(clear IOPCORE_DEBUG) dsidb cannot be used to handle exceptions or set breakpoints, so disable output to save resources. + CDVDMAN_DEBUG_FLAGS = USE_DEV9=1 #dsidb cannot be used to handle exceptions or set breakpoints, so disable output to save resources. else IOP_OBJS += udptty-ingame.o endif @@ -770,21 +765,12 @@ $(EE_ASM_DIR)transition.s: misc/transition.adp | $(EE_ASM_DIR) $(EE_ASM_DIR)IOPRP_img.s: modules/iopcore/IOPRP.img | $(EE_ASM_DIR) $(BIN2S) $< $@ IOPRP_img -$(EE_ASM_DIR)drvtif_ingame_irx.s: modules/debug/drvtif-ingame.irx | $(EE_ASM_DIR) - $(BIN2S) $< $@ drvtif_ingame_irx - -$(EE_ASM_DIR)tifinet_ingame_irx.s: modules/debug/tifinet-ingame.irx | $(EE_ASM_DIR) - $(BIN2S) $< $@ tifinet_ingame_irx - $(EE_ASM_DIR)drvtif_irx.s: modules/debug/drvtif.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ drvtif_irx $(EE_ASM_DIR)tifinet_irx.s: modules/debug/tifinet.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ tifinet_irx -$(EE_ASM_DIR)deci2_img.s: modules/debug/deci2.img | $(EE_ASM_DIR) - $(BIN2S) $< $@ deci2_img - $(EE_OBJS_DIR)%.o: $(EE_SRC_DIR)%.c | $(EE_OBJS_DIR) $(EE_CC) $(EE_CFLAGS) $(EE_INCS) -c $< -o $@ diff --git a/ee_core/src/patches.c b/ee_core/src/patches.c index 5a3974ab9..8e6734881 100644 --- a/ee_core/src/patches.c +++ b/ee_core/src/patches.c @@ -43,7 +43,6 @@ typedef struct #define PATCH_SOS 0x30303030 #define PATCH_ULT_PRO_PINBALL 0xBA11BA11 #define PATCH_FERRARI_CHALLENGE 0x0012FCC8 -#define PATCH_PRO_SNOWBOARDER 0x01020199 static const patchlist_t patch_list[] = { {"SLES_524.58", USB_MODE, {PATCH_GENERIC_NIS, 0x00000000, 0x00000000}}, // Disgaea Hour of Darkness PAL - disable cdvd timeout stuff @@ -108,13 +107,7 @@ static const patchlist_t patch_list[] = { {"SLUS_209.77", ALL_MODE, {PATCH_VIRTUA_QUEST, 0x00000000, 0x00000000}}, // Virtua Quest {"SLPM_656.32", ALL_MODE, {PATCH_VIRTUA_QUEST, 0x00000000, 0x00000000}}, // Virtua Fighter Cyber Generation: Judgment Six No Yabou {"SLES_535.08", ALL_MODE, {PATCH_ULT_PRO_PINBALL, 0x00000000, 0x00000000}}, // Ultimate Pro Pinball - {"SLES_552.94", ALL_MODE, {PATCH_FERRARI_CHALLENGE, 0x0012fcc8, 0x00000000}}, // Ferrari Challenge: Trofeo Pirelli (PAL) - {"SLUS_217.80", ALL_MODE, {PATCH_FERRARI_CHALLENGE, 0x0012fcb0, 0x00000000}}, // Ferrari Challenge: Trofeo Pirelli (NTSC-U/C) - {"SLUS_201.99", ALL_MODE, {PATCH_PRO_SNOWBOARDER, 0x00000000, 0x00000000}}, // Shaun Palmer's Pro Snowboarder (NTSC-U/C) - {"SLES_504.00", ALL_MODE, {PATCH_PRO_SNOWBOARDER, 0x00000000, 0x00000000}}, // Shaun Palmer's Pro Snowboarder (PAL) - {"SLES_504.01", ALL_MODE, {PATCH_PRO_SNOWBOARDER, 0x00000000, 0x00000000}}, // Shaun Palmer's Pro Snowboarder (PAL French) - Untested - {"SLES_504.02", ALL_MODE, {PATCH_PRO_SNOWBOARDER, 0x00000000, 0x00000000}}, // Shaun Palmer's Pro Snowboarder (PAL German) - Untested - {"SLPM_651.98", ALL_MODE, {PATCH_PRO_SNOWBOARDER, 0x00000000, 0x00000000}}, // Shaun Palmer's Pro Snowboarder (NTSC-J) - Untested + {"SLES_552.94", ALL_MODE, {PATCH_FERRARI_CHALLENGE, 0x00000000, 0x00000000}}, // Ferrari Challenge: Trofeo Pirelli {NULL, 0, {0x00000000, 0x00000000, 0x00000000}} // terminater }; @@ -685,47 +678,10 @@ static void UltProPinballPatch(const char *path) } } -static void FerrariChallengePatch(u32 addr) +static void FerrariChallengePatch(void) { //Ferrari Challenge has the main thread ID hardcoded for a call to WakeupThread(). - // addiu $a0, $zero, 1 //This breaks when the thread IDs change after IGR is used. - *(vu16*)addr = (u16)GetThreadId(); -} - -static void ProSnowboarderPatch(void) -{ //Shaun Palmer's Pro Snowboarder incorrectly uses the main thread ID as the priority, causing a deadlock when the main thread ID changes (ID != priority) - //Replace all jal GetThreadId() with a li $v0, 1, whereby 1 is the main thread's priority (never changed by game). - static const unsigned int pattern[] = { - 0x240300ff, //addiu $v1, $zero, 0xff - 0x3c038080, //li $v0, 0x8080 - 0x34638081, //ori $v1, $v1, 0x8181 - 0x00650018, //mult $v1, $a1 - }; - static const unsigned int pattern_mask[] = { - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff}; - u32 *ptr, *ptr2, *ptr3; - - //Locate the calls to GetThreadId(). - ptr = find_pattern_with_mask((u32 *)0x00180000, 0x00280000, pattern, pattern_mask, sizeof(pattern)); - if (ptr) - { - ptr2 = find_pattern_with_mask(ptr+4, 0x00280000, pattern, pattern_mask, sizeof(pattern)); - - if (ptr2) - { - ptr3 = find_pattern_with_mask(ptr2+4, 0x00280000, pattern, pattern_mask, sizeof(pattern)); - - if (ptr3) - { - *(vu32*)&ptr[-12] = 0x24020001; //addiu $v0, $zero, 1 - *(vu32*)&ptr2[-9] = 0x24020001; //addiu $v0, $zero, 1 - *(vu32*)&ptr3[-9] = 0x24020001; //addiu $v0, $zero, 1 - } - } - } + *(vu16*)0x0012fcc8 = (u16)GetThreadId(); } void apply_patches(const char *path) @@ -773,10 +729,7 @@ void apply_patches(const char *path) UltProPinballPatch(path); break; case PATCH_FERRARI_CHALLENGE: - FerrariChallengePatch(p->patch.val); - break; - case PATCH_PRO_SNOWBOARDER: - ProSnowboarderPatch(); + FerrariChallengePatch(); break; default: // Single-value patches if (_lw(p->patch.addr) == p->patch.check) diff --git a/include/appsupport.h b/include/appsupport.h index 3c05aabb9..2793ad309 100644 --- a/include/appsupport.h +++ b/include/appsupport.h @@ -5,23 +5,6 @@ #define APP_MODE_UPDATE_DELAY 240 -#define APP_TITLE_MAX 128 -#define APP_PATH_MAX 128 -#define APP_BOOT_MAX 64 - -#define APP_CONFIG_TITLE "title" -#define APP_CONFIG_BOOT "boot" - -#define APP_TITLE_CONFIG_FILE "title.cfg" - -typedef struct -{ - char title[APP_TITLE_MAX + 1]; - char path[APP_PATH_MAX + 1]; - char boot[APP_BOOT_MAX + 1]; - u8 legacy; -} app_info_t; - void appInit(); item_list_t *appGetObject(int initOnly); diff --git a/include/config.h b/include/config.h index de3463416..b3c03b8e1 100644 --- a/include/config.h +++ b/include/config.h @@ -70,7 +70,6 @@ enum CONFIG_INDEX { #define CONFIG_OPL_OVERSCAN "overscan" #define CONFIG_OPL_DISABLE_DEBUG "disable_debug" #define CONFIG_OPL_PS2LOGO "ps2logo" -#define CONFIG_OPL_GAME_LIST_CACHE "game_list_cache" #define CONFIG_OPL_EXIT_PATH "exit_path" #define CONFIG_OPL_AUTO_SORT "autosort" #define CONFIG_OPL_AUTO_REFRESH "autorefresh" diff --git a/include/debug.h b/include/debug.h index 229808d41..85ac0e631 100644 --- a/include/debug.h +++ b/include/debug.h @@ -2,6 +2,5 @@ #define __DEBUG_H int debugSetActive(void); -void debugApplyConfig(void); #endif diff --git a/include/dialogs.h b/include/dialogs.h index 5bcdab327..b3b74d8d7 100644 --- a/include/dialogs.h +++ b/include/dialogs.h @@ -26,7 +26,6 @@ enum UI_ITEMS { CFG_DEBUG, CFG_PS2LOGO, - CFG_GAMELISTCACHE, CFG_EXITTO, CFG_DEFDEVICE, CFG_USBMODE, diff --git a/include/ethsupport.h b/include/ethsupport.h index 799936fa6..0962b0631 100644 --- a/include/ethsupport.h +++ b/include/ethsupport.h @@ -23,7 +23,10 @@ void ethDeinitModules(void); //Module-only deinitialization, without the GU int ethLoadInitModules(void); //Initializes Ethernet and applies configuration. void ethDisplayErrorStatus(void); //Displays the current error status (if any). GUI must be already initialized. int ethGetNetConfig(u8 *ip_address, u8 *netmask, u8 *gateway); -int ethApplyConfig(void); +int ethWaitValidNetIFLinkState(void); +int ethWaitValidDHCPState(void); +int ethApplyNetIFConfig(void); +int ethApplyIPConfig(void); int ethGetDHCPStatus(void); item_list_t *ethGetObject(int initOnly); diff --git a/include/extern_irx.h b/include/extern_irx.h index d4717ae1a..5a62e09b8 100644 --- a/include/extern_irx.h +++ b/include/extern_irx.h @@ -16,15 +16,9 @@ extern int size_bt_pademu_irx; extern void *cdvdfsv_irx; extern int size_cdvdfsv_irx; -extern void *deci2_img; -extern int size_deci2_img; - extern void *drvtif_irx; extern int size_drvtif_irx; -extern void *drvtif_ingame_irx; -extern int size_drvtif_ingame_irx; - extern void *ds34bt_irx; extern int size_ds34bt_irx; @@ -145,9 +139,6 @@ extern int size_smsutils_irx; extern void *tifinet_irx; extern int size_tifinet_irx; -extern void *tifinet_ingame_irx; -extern int size_tifinet_ingame_irx; - extern void *udptty_irx; extern int size_udptty_irx; diff --git a/include/hddsupport.h b/include/hddsupport.h index 5e548c55a..18e1fe2b5 100644 --- a/include/hddsupport.h +++ b/include/hddsupport.h @@ -20,8 +20,8 @@ typedef struct u8 ops2l_compat_flags; u8 dma_type; u8 dma_mode; - u8 disctype; u32 layer_break; + int disctype; u32 start_sector; u32 total_size_in_kb; } hdl_game_info_t; @@ -55,8 +55,7 @@ int hddCheck(void); u32 hddGetTotalSectors(void); int hddIs48bit(void); int hddSetTransferMode(int type, int mode); -void hddSetIdleTimeout(int timeout); -void hddSetIdleImmediate(void); +int hddSetIdleTimeout(int timeout); int hddGetHDLGamelist(hdl_games_list_t *game_list); void hddFreeHDLGamelist(hdl_games_list_t *game_list); int hddSetHDLGameInfo(hdl_game_info_t *ginfo); diff --git a/include/iosupport.h b/include/iosupport.h index cc47c6c84..ed78a1e44 100644 --- a/include/iosupport.h +++ b/include/iosupport.h @@ -3,9 +3,6 @@ #include "include/config.h" -#define IO_MODE_SELECTED_NONE -1 -#define IO_MODE_SELECTED_ALL MODE_COUNT - enum IO_MODES { USB_MODE = 0, ETH_MODE, @@ -75,16 +72,13 @@ enum ERROR_CODE { // minimal inactive frames for cover display, can be pretty low since it means no button is pressed :) #define MENU_MIN_INACTIVE_FRAMES 8 -#define MENU_UPD_DELAY_NOUPDATE -1 //Auto refresh is disabled for the item. The refresh button may be used to manually refresh the item. -#define MENU_UPD_DELAY_GENREFRESH 0 //The item will be refreshed every MENU_GENERAL_UPDATE_DELAY frames, regardless of whether automatic refresh is enabled or not. +#define MENU_UPD_DELAY_NOUPDATE -1 //Menu won't be ever be updated, even if the user triggers a refresh. +#define MENU_UPD_DELAY_GENREFRESH 0 //Menu will be refreshed every MENU_GENERAL_UPDATE_DELAY frames, regardless of whether automatic refresh is enabled or not. typedef struct { short int mode; - /// Device priority when it comes to locating art assets for apps. Higher value = lower priority. (< 0) means no support for art assets. - char appsPriority; - char enabled; unsigned char flags; @@ -102,9 +96,6 @@ typedef struct /// item description in localised form (used if value is not negative) int textId; - /// Path to applications storage on the device (set to NULL if not applicable). - char *appsPath; - void (*itemInit)(void); /** @return 1 if update is needed, 0 otherwise */ @@ -135,8 +126,6 @@ typedef struct void (*itemCleanUp)(int exception); - void (*itemShutdown)(void); - int (*itemCheckVMC)(char *name, int createSize); int iconId; diff --git a/include/lang.h b/include/lang.h index f63df69c2..eb8b91e6b 100644 --- a/include/lang.h +++ b/include/lang.h @@ -266,7 +266,6 @@ enum _STR_IDS { _STR_SFX_VOLUME, _STR_BOOT_SND_VOLUME, _STR_CFM_VMODE_CHG, - _STR_CACHE_GAME_LIST, //START of OPL_DB tweaks _STR_ELM, _STR_ELMMODE, diff --git a/include/opl.h b/include/opl.h index 1576d8511..f1c8ad9e7 100644 --- a/include/opl.h +++ b/include/opl.h @@ -41,12 +41,6 @@ //#define OPL_IS_DEV_BUILD 1 //Define if this build is a development build. //END of OPL_DB tweaks -#ifdef OPL_IS_DEV_BUILD -#define OPL_FOLDER "CFG-DEV" -#else -#define OPL_FOLDER "CFG" -#endif - //Master password for disabling the parental lock. #define OPL_PARENTAL_LOCK_MASTER_PASS "989765" @@ -63,12 +57,7 @@ #define OPL_COMPAT_UPDATE_STAT_CONN_ERROR -2 #define OPL_COMPAT_UPDATE_STAT_ABORTED -3 -#define OPL_VMODE_CHANGE_CONFIRMATION_TIMEOUT_MS 10000 - -int oplPath2Mode(const char *path); -char *oplGetModeText(int mode); -int oplGetAppImage(char *folder, int isRelative, char *value, char *suffix, GSTEXTURE *resultTex, short psm); -int oplScanApps(int (*callback)(const char *path, config_set_t *appConfig, void *arg), void *arg); +#define OPL_VMODE_CHANGE_CONFIRMATION_TIMEOUT_MS 5000 void setErrorMessage(int strId); void setErrorMessageWithCode(int strId, int error); @@ -78,7 +67,7 @@ void applyConfig(int themeID, int langID); void menuDeferredUpdate(void *data); void moduleUpdateMenu(int mode, int themeChanged); void handleHdlSrv(); -void deinit(int exception, int modeSelected); +void deinit(); char *gBaseMCDir; @@ -131,7 +120,6 @@ int gXOff; int gYOff; int gOverscan; int gSelectButton; -int gGameListCache; int gEnableSFX; int gEnableBootSND; diff --git a/include/supportbase.h b/include/supportbase.h index d5442de7a..826fc0980 100644 --- a/include/supportbase.h +++ b/include/supportbase.h @@ -3,11 +3,8 @@ #define UL_GAME_NAME_MAX 32 #define ISO_GAME_NAME_MAX 64 -#define ISO_GAME_EXTENSION_MAX 4 #define GAME_STARTUP_MAX 12 -#define ISO_GAME_FNAME_MAX (ISO_GAME_NAME_MAX+ISO_GAME_EXTENSION_MAX) - enum GAME_FORMAT { GAME_FORMAT_USBLD = 0, GAME_FORMAT_OLD_ISO, @@ -18,22 +15,22 @@ typedef struct { char name[ISO_GAME_NAME_MAX + 1]; // MUST be the higher value from UL / ISO char startup[GAME_STARTUP_MAX + 1]; - char extension[ISO_GAME_EXTENSION_MAX + 1]; - u8 parts; - u8 media; - u8 format; - u32 sizeMB; + char extension[5]; + unsigned char parts; + unsigned char media; + unsigned short format; + int sizeMB; } base_game_info_t; typedef struct { - char name[UL_GAME_NAME_MAX]; - char startup[15]; - u8 parts; - u8 media; //Disc type - u8 unknown[4]; - u8 Byte08; //Always 0x08 - u8 unknown2[10]; + unsigned char name[UL_GAME_NAME_MAX]; + unsigned char startup[15]; + unsigned char parts; + unsigned char media; //Disc type + unsigned char unknown[4]; + unsigned char Byte08; //Always 0x08 + unsigned char unknown2[10]; } USBExtreme_game_entry_t; int sbIsSameSize(const char *prefix, int prevSize); diff --git a/include/system.h b/include/system.h index 8498520d2..0a180ba9e 100644 --- a/include/system.h +++ b/include/system.h @@ -12,15 +12,12 @@ int sysGetDiscID(char *discID); void sysInitDev9(void); void sysShutdownDev9(void); void sysReset(int modload_mask); -void sysExecExit(void); +void sysExecExit(); void sysPowerOff(void); -#ifdef __DECI2_DEBUG -int sysInitDECI2(void); -#endif -void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx, int EnablePS2Logo, unsigned int compatflags); +void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx, int EnablePS2Logo, unsigned int compatflags); -int sysExecElf(const char *path); +int sysExecElf(char *path); //START of OPL_DB tweaks int sysExecElfWithParam(char *path,char *param); //END of OPL_DB tweaks diff --git a/include/util.h b/include/util.h index 55023d759..322c8ddb2 100644 --- a/include/util.h +++ b/include/util.h @@ -44,7 +44,6 @@ enum CONSOLE_REGIONS { int InitConsoleRegionData(void); const char *GetSystemDataPath(void); char GetSystemFolderLetter(void); -int sysDeleteFolder(const char *folder); int CheckPS2Logo(int fd, u32 lba); diff --git a/modules/debug/deci2.img b/modules/debug/deci2.img deleted file mode 100755 index 4944cf8b3796e43ee01f4b12d18d77bafc79ef65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73625 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 diff --git a/modules/debug/drvtif-ingame.irx b/modules/debug/drvtif-ingame.irx deleted file mode 100755 index ff82a2d62dd4eb1d79eb64f943463cdb89a87688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5985 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 R8(@_M8Z};n^head; @@ -60,7 +51,6 @@ void appInit(void) appForceUpdate = 1; configGetInt(configGetByType(CONFIG_OPL), "app_frames_delay", &appItemList.delay); configApps = configGetByType(CONFIG_APPS); - appsList = NULL; appItemList.enabled = 1; } @@ -72,121 +62,13 @@ item_list_t *appGetObject(int initOnly) } static int appNeedsUpdate(void) -{ // Always allow the user & auto refresh to refresh the apps list. - return 1; -} - -static int addAppsLegacyList(struct app_info_linked **appsLinkedList) { - struct config_value_t *cur; - struct app_info_linked *app; - int count; - - configClear(configApps); - configRead(configApps); - - count = 0; - cur = configApps->head; - while (cur != NULL) - { - if (*appsLinkedList == NULL) - { - *appsLinkedList = malloc(sizeof(struct app_info_linked)); - app = *appsLinkedList; - app->next = NULL; - } - else - { - app = malloc(sizeof(struct app_info_linked)); - if (app != NULL) { - app->next = *appsLinkedList; - *appsLinkedList = app; - } - } - - if (app == NULL) - { - LOG("APPSUPPORT unable to allocate memory.\n"); - break; - } - - strncpy(app->app.title, cur->key, APP_TITLE_MAX + 1); - app->app.title[APP_TITLE_MAX] = '\0'; - - //Split the boot filename from the path. - const char *elfname = appGetELFName(cur->val); - if (elfname != cur->val) { - strncpy(app->app.boot, elfname, APP_BOOT_MAX + 1); - app->app.boot[APP_BOOT_MAX] = '\0'; - - int pathlen = (int)(elfname - cur->val) - 1; - if (cur->val[pathlen] == ':') //Discard only '/'. - pathlen++; - if (pathlen > APP_PATH_MAX) - pathlen = APP_PATH_MAX; - strncpy(app->app.path, cur->val, pathlen); - app->app.path[pathlen] = '\0'; - } else { - //Cannot split boot filename from the path, somehow. - strncpy(app->app.boot, cur->val, APP_BOOT_MAX + 1); - app->app.boot[APP_BOOT_MAX] = '\0'; - strncpy(app->app.path, cur->val, APP_PATH_MAX + 1); - app->app.path[APP_BOOT_MAX] = '\0'; - } - - app->app.legacy = 1; - count++; - cur = cur->next; - } - - return count; -} - -static int appScanCallback(const char *path, config_set_t *appConfig, void *arg) -{ - struct app_info_linked **appsLinkedList = (struct app_info_linked **)arg; - struct app_info_linked *app; - const char *title, *boot; - - if (configGetStr(appConfig, APP_CONFIG_TITLE, &title) != 0 - && configGetStr(appConfig, APP_CONFIG_BOOT, &boot) != 0) - { - if (*appsLinkedList == NULL) - { - *appsLinkedList = malloc(sizeof(struct app_info_linked)); - app = *appsLinkedList; - app->next = NULL; - } - else - { - app = malloc(sizeof(struct app_info_linked)); - if (app != NULL) - { - app->next = *appsLinkedList; - *appsLinkedList = app; - } - } - - if (app == NULL) - { - LOG("APPSUPPORT unable to allocate memory.\n"); - return -1; - } - - strncpy(app->app.title, title, APP_TITLE_MAX+1); - app->app.title[APP_TITLE_MAX] = '\0'; - strncpy(app->app.boot, boot, APP_BOOT_MAX+1); - app->app.boot[APP_BOOT_MAX] = '\0'; - strncpy(app->app.path, path, APP_PATH_MAX+1); - app->app.path[APP_PATH_MAX] = '\0'; - app->app.legacy = 0; - return 0; - } else { - LOG("APPSUPPORT item has no boot/title.\n"); + if (appForceUpdate) { + appForceUpdate = 0; return 1; } - return -1; + return 0; } //START of OPL_DB tweaks @@ -237,59 +119,16 @@ static int appUpdateItemList(void) { //Count apps //END of OPL_DB tweaks - -static int appUpdateItemList(void) -{ - struct app_info_linked *appsLinkedList, *appNext; - int i; - - appFreeList(); - - appsLinkedList = NULL; - - //Get legacy apps list first, so it is possible to use appGetConfigValue(id). - appItemCount += addAppsLegacyList(&appsLinkedList); - - //Scan devices for apps. - appItemCount += oplScanApps(&appScanCallback, &appsLinkedList); - - // Generate apps list - if (appItemCount > 0) - { - appsList = malloc(appItemCount * sizeof(app_info_t)); - - if (appsList != NULL) - { - for (i = 0; appsLinkedList != NULL; i++) - { //appsLinkedList contains items in reverse order. - memcpy(&appsList[appItemCount - i - 1], &appsLinkedList->app, sizeof(app_info_t)); - - appNext = appsLinkedList->next; - free(appsLinkedList); - appsLinkedList = appNext; - } - } - else - { - LOG("APPSUPPORT unable to allocate memory.\n"); - appItemCount = 0; + if (configApps->head) { + struct config_value_t *cur = configApps->head; + while (cur) { + cur = cur->next; + appItemCount++; } } - - LOG("APPSUPPORT %d apps loaded\n", appItemCount); - return appItemCount; } -static void appFreeList(void) -{ - if (appsList != NULL) - { - appsList = NULL; - appItemCount = 0; - } -} - static int appGetItemCount(void) { return appItemCount; @@ -297,100 +136,60 @@ static int appGetItemCount(void) static char *appGetItemName(int id) { - return appsList[id].title; + struct config_value_t *cur = appGetConfigValue(id); + return cur->key; } static int appGetItemNameLength(int id) { - return CONFIG_KEY_NAME_LEN; + return 32; } static char *appGetItemStartup(int id) { - if (appsList[id].legacy) - { - struct config_value_t *cur = appGetConfigValue(id); - return cur->val; - } else { - int mode; - - mode = oplPath2Mode(appsList[id].path); - if (mode < 0) { - LOG("APPSUPPORT: cannot find mode for path: %s\n", filename); - return ""; - } - - return oplGetModeText(mode); - } + struct config_value_t *cur = appGetConfigValue(id); + return appGetELFName(cur->val); } static void appDeleteItem(int id) { - if (appsList[id].legacy) - { - struct config_value_t *cur = appGetConfigValue(id); - fileXioRemove(cur->val); - cur->key[0] = '\0'; - configApps->modified = 1; - configWrite(configApps); - } else { - sysDeleteFolder(appsList[id].path); - } + struct config_value_t *cur = appGetConfigValue(id); + fileXioRemove(cur->val); + cur->key[0] = '\0'; + configApps->modified = 1; + configWrite(configApps); appForceUpdate = 1; } static void appRenameItem(int id, char *newName) { - char value[256]; - - if (appsList[id].legacy) - { - struct config_value_t *cur = appGetConfigValue(id); - - strncpy(value, cur->val, sizeof(value)); - configRemoveKey(configApps, cur->key); - configSetStr(configApps, newName, value); - configWrite(configApps); - } else { - config_set_t *appConfig; - - snprintf(value, sizeof(value), "%s/%s", appsList[id].path, APP_TITLE_CONFIG_FILE); - - appConfig = configAlloc(0, NULL, value); - if (appConfig != NULL) - { - configRead(appConfig); - configSetStr(appConfig, APP_CONFIG_TITLE, newName); - configWrite(appConfig); + struct config_value_t *cur = appGetConfigValue(id); - configFree(appConfig); - } - } + char value[256]; + strncpy(value, cur->val, sizeof(value)); + configRemoveKey(configApps, cur->key); + configSetStr(configApps, newName, value); + configWrite(configApps); appForceUpdate = 1; } static void appLaunchItem(int id, config_set_t *configSet) { - int mode, fd; - const char *filename; - - //Retrieve configuration set by appGetConfig() - configGetStr(configSet, CONFIG_ITEM_STARTUP, &filename); - - fd = fileXioOpen(filename, O_RDONLY); + struct config_value_t *cur = appGetConfigValue(id); + int fd = fileXioOpen(cur->val, O_RDONLY, 0666); if (fd >= 0) { fileXioClose(fd); - //To keep the necessary device accessible, we will assume the mode that owns the device which contains the file to boot. - mode = oplPath2Mode(filename); - if (mode < 0) { - mode = APP_MODE; - LOG("APPSUPPORT warning: cannot find mode for path: %s\n", filename); - } + int exception = NO_EXCEPTION; + if (strncmp(cur->val, "pfs0:", 5) == 0) + exception = UNMOUNT_EXCEPTION; - deinit(UNMOUNT_EXCEPTION, mode); // CAREFUL: deinit will call appCleanUp, so configApps/cur will be freed + char filename[256]; + strncpy(filename, cur->val, sizeof(filename) - 1); + filename[sizeof(filename) - 1] = '\0'; + deinit(exception); // CAREFUL: deinit will call appCleanUp, so configApps/cur will be freed sysExecElf(filename); } else guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL); @@ -454,26 +253,13 @@ static config_set_t* appGetConfig(int id) { } //END of OPL_DB tweaks - -static config_set_t *appGetConfig(int id) -{ - config_set_t *config = configAlloc(0, NULL, NULL); - if (appsList[id].legacy) { - struct config_value_t *cur = appGetConfigValue(id); - configSetStr(config, CONFIG_ITEM_NAME, appGetELFName(cur->val)); - configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); - configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); - //START of OPL_DB tweaks - configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); - configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); - //END of OPL_DB tweaks - } else { - char path[256]; - configSetStr(config, CONFIG_ITEM_NAME, appsList[id].boot); - configSetStr(config, CONFIG_ITEM_LONGNAME, appsList[id].title); - snprintf(path, sizeof(path), "%s/%s", appsList[id].path, appsList[id].boot); - configSetStr(config, CONFIG_ITEM_STARTUP, path); - } + configSetStr(config, CONFIG_ITEM_NAME, appGetELFName(cur->val)); + configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); + configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); +//START of OPL_DB tweaks + configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); + configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); +//END of OPL_DB tweaks return config; } @@ -483,31 +269,32 @@ static int appGetImage(char *folder, int isRelative, char *value, char *suffix, //value = appGetELFName(value); // Search every device from fastest to slowest (HDD > ETH > USB) //END of OPL_DB tweaks - return oplGetAppImage(folder, isRelative, appGetELFName(value), suffix, resultTex, psm); -} - -//This may be called, even if appInit() was not. -static void appCleanUp(int exception) -{ - if (appItemList.enabled) { - LOG("APPSUPPORT CleanUp\n"); + static item_list_t *listSupport = NULL; + if ((listSupport = hddGetObject(1))) { + if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) + return 0; + } - appFreeList(); + if ((listSupport = ethGetObject(1))) { + if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) + return 0; } + + if ((listSupport = usbGetObject(1))) + return listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm); + + return -1; } -//This may be called, even if appInit() was not. -static void appShutdown(void) +static void appCleanUp(int exception) { if (appItemList.enabled) { - LOG("APPSUPPORT Shutdown\n"); - - appFreeList(); + LOG("APPSUPPORT CleanUp\n"); } } static item_list_t appItemList = { - APP_MODE, -1, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, APP_MODE_UPDATE_DELAY, "Applications", _STR_APPS, NULL, &appInit, &appNeedsUpdate, &appUpdateItemList, + APP_MODE, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, APP_MODE_UPDATE_DELAY, "Applications", _STR_APPS, &appInit, &appNeedsUpdate, &appUpdateItemList, &appGetItemCount, NULL, &appGetItemName, &appGetItemNameLength, &appGetItemStartup, &appDeleteItem, &appRenameItem, &appLaunchItem, - &appGetConfig, &appGetImage, &appCleanUp, &appShutdown, NULL, APP_ICON + &appGetConfig, &appGetImage, &appCleanUp, NULL, APP_ICON }; diff --git a/src/config.c b/src/config.c index ee420c0ed..0c4422015 100644 --- a/src/config.c +++ b/src/config.c @@ -16,7 +16,7 @@ static const char *configFilenames[CONFIG_INDEX_COUNT] = { "conf_opl.cfg", "conf_last.cfg", "conf_apps.cfg", - "conf_network.cfg", + "conf_network", }; static int strToColor(const char *string, unsigned char *color) diff --git a/src/debug.c b/src/debug.c index 40211d9fa..850f77c30 100644 --- a/src/debug.c +++ b/src/debug.c @@ -10,7 +10,6 @@ #include "include/ioman.h" #include "include/extern_irx.h" -static u8 modulesLoaded = 0; int debugSetActive(void) { @@ -20,15 +19,6 @@ int debugSetActive(void) if ((ret = ethLoadInitModules()) != 0) return -1; -#ifdef __DECI2_DEBUG - ret = sysLoadModuleBuffer(&drvtif_irx, size_drvtif_irx, 0, NULL); - if (ret < 0) - return -8; - - ret = sysLoadModuleBuffer(&tifinet_irx, size_tifinet_irx, 0, NULL); - if (ret < 0) - return -9; -#else ret = sysLoadModuleBuffer(&udptty_irx, size_udptty_irx, 0, NULL); if (ret < 0) return -8; @@ -41,18 +31,6 @@ int debugSetActive(void) if (ret < 0) return -10; #endif -#endif - - modulesLoaded = 1; return 0; } - -void debugApplyConfig(void) -{ -#ifndef _DTL_T10000 - if (modulesLoaded) - ethApplyConfig(); -#endif -} - diff --git a/src/dialogs.c b/src/dialogs.c index c7cd3199c..2ed8dbec7 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -259,11 +259,6 @@ struct UIItem diaConfig[] = { {UI_BOOL, CFG_PS2LOGO, 1, 1, _STR_HINT_PS2LOGO, 0, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_CACHE_GAME_LIST}}}, - {UI_SPACER}, - {UI_BOOL, CFG_GAMELISTCACHE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, - {UI_BREAK}, - {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_EXITTO}}}, {UI_SPACER}, {UI_STRING, CFG_EXITTO, 1, 1, _STR_HINT_EXITPATH, 0, 0, {.stringvalue = {"", "", NULL}}}, diff --git a/src/ethsupport.c b/src/ethsupport.c index 5e39ba28e..a002504a2 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -31,12 +31,8 @@ static struct ip4_addr lastGW; // forward declaration static item_list_t ethGameList; -static int ethWaitValidNetIFLinkState(void); -static int ethWaitValidDHCPState(void); -static int ethGetNetIFLinkStatus(void); -static int ethApplyNetIFConfig(void); -static int ethApplyIPConfig(void); static int ethReadNetConfig(void); +static int ethGetNetIFLinkStatus(void); static int ethInitSemaID = -1; @@ -193,12 +189,12 @@ static int WaitValidNetState(int (*checkingFunction)(void)) return 0; } -static int ethWaitValidNetIFLinkState(void) +int ethWaitValidNetIFLinkState(void) { return WaitValidNetState(ðGetNetIFLinkStatus); } -static int ethWaitValidDHCPState(void) +int ethWaitValidDHCPState(void) { return WaitValidNetState(ðGetDHCPStatus); } @@ -231,17 +227,6 @@ static int ethInitApplyConfig(void) return 0; } -int ethApplyConfig(void) -{ - int ret; - - WaitSema(ethInitSemaID); - ret = ethInitApplyConfig(); - SignalSema(ethInitSemaID); - - return ret; -} - static void ethInitSMB(void) { int ret; @@ -670,7 +655,7 @@ static void ethLaunchGame(int id, config_set_t *configSet) sprintf(partname, "%s%s.00", ethPrefix, settings->filename); break; default: //Raw ISO9660 disc image; one part. - sprintf(partname, "%s%s\\%s", ethPrefix, game->media == SCECdPS2CD ? "CD" : "DVD", settings->filename); + sprintf(partname, "%s%s\\%s", ethPrefix, game->media == 0x12 ? "CD" : "DVD", settings->filename); } if (gPS2Logo) { @@ -703,9 +688,12 @@ static void ethLaunchGame(int id, config_set_t *configSet) } settings->common.layer1_start = layer1_start; + // disconnect from the active SMB session + ethSMBDisconnect(); + if (configGetStrCopy(configSet, CONFIG_ITEM_ALTSTARTUP, filename, sizeof(filename)) == 0) strcpy(filename, game->startup); - deinit(NO_EXCEPTION, ETH_MODE); // CAREFUL: deinit will call ethCleanUp, so ethGames/game will be freed + deinit(NO_EXCEPTION); // CAREFUL: deinit will call ethCleanUp, so ethGames/game will be freed sysLaunchLoaderElf(filename, "ETH_MODE", size_smb_cdvdman_irx, &smb_cdvdman_irx, size_mcemu_irx, &smb_mcemu_irx, EnablePS2Logo, compatmask); } @@ -725,40 +713,15 @@ static int ethGetImage(char *folder, int isRelative, char *value, char *suffix, return texDiscoverLoad(resultTex, path, -1, psm); } -//This may be called, even if ethInit() was not. static void ethCleanUp(int exception) { if (ethGameList.enabled) { LOG("ETHSUPPORT CleanUp\n"); free(ethGames); - - // disconnect from the active SMB session - ethSMBDisconnect(); - } - - //UI may have initialized modules outside of ETH mode, so deinitialize regardless of the enabled status. - ethDeinitModules(); -} - -//This may be called, even if ethInit() was not. -static void ethShutdown(void) -{ - if (ethGameList.enabled) { - LOG("ETHSUPPORT Shutdown\n"); - - free(ethGames); - - // disconnect from the active SMB session - ethSMBDisconnect(); } - //UI may have initialized modules outside of ETH mode, so deinitialize regardless of the enabled status. ethDeinitModules(); - - //Only shut down dev9 from here, if it was initialized from here before. - if (ethModulesLoaded) - sysShutdownDev9(); } static int ethCheckVMC(char *name, int createSize) @@ -767,9 +730,9 @@ static int ethCheckVMC(char *name, int createSize) } static item_list_t ethGameList = { - ETH_MODE, 1, 0, 0, MENU_MIN_INACTIVE_FRAMES, ETH_MODE_UPDATE_DELAY, "ETH Games", _STR_NET_GAMES, "smb0:/APPS", ðInit, ðNeedsUpdate, + ETH_MODE, 0, 0, MENU_MIN_INACTIVE_FRAMES, ETH_MODE_UPDATE_DELAY, "ETH Games", _STR_NET_GAMES, ðInit, ðNeedsUpdate, ðUpdateGameList, ðGetGameCount, ðGetGame, ðGetGameName, ðGetGameNameLength, ðGetGameStartup, ðDeleteGame, ðRenameGame, - ðLaunchGame, ðGetConfig, ðGetImage, ðCleanUp, ðShutdown, ðCheckVMC, ETH_ICON + ðLaunchGame, ðGetConfig, ðGetImage, ðCleanUp, ðCheckVMC, ETH_ICON }; static int ethReadNetConfig(void) @@ -814,7 +777,7 @@ int ethGetNetConfig(u8 *ip_address, u8 *netmask, u8 *gateway) return result; } -static int ethApplyNetIFConfig(void) +int ethApplyNetIFConfig(void) { int mode, result; static int CurrentMode = NETMAN_NETIF_ETH_LINK_MODE_AUTO; @@ -850,7 +813,7 @@ static int ethGetNetIFLinkStatus(void) return (NetManIoctl(NETMAN_NETIF_IOCTL_GET_LINK_STATUS, NULL, 0, NULL, 0) == NETMAN_NETIF_ETH_LINK_STATE_UP); } -static int ethApplyIPConfig(void) +int ethApplyIPConfig(void) { t_ip_info ip_info; struct ip4_addr ipaddr, netmask, gw, dns; diff --git a/src/gui.c b/src/gui.c index 528b7f544..8a2f98469 100644 --- a/src/gui.c +++ b/src/gui.c @@ -388,7 +388,6 @@ void guiShowConfig() diaSetInt(diaConfig, CFG_DEBUG, gDisableDebug); diaSetInt(diaConfig, CFG_PS2LOGO, gPS2Logo); - diaSetInt(diaConfig, CFG_GAMELISTCACHE, gGameListCache); diaSetString(diaConfig, CFG_EXITTO, gExitPath); diaSetInt(diaConfig, CFG_ENWRITEOP, gEnableWrite); diaSetInt(diaConfig, CFG_HDDSPINDOWN, gHDDSpindown); @@ -414,7 +413,6 @@ void guiShowConfig() if (ret) { diaGetInt(diaConfig, CFG_DEBUG, &gDisableDebug); diaGetInt(diaConfig, CFG_PS2LOGO, &gPS2Logo); - diaGetInt(diaConfig, CFG_GAMELISTCACHE, &gGameListCache); diaGetString(diaConfig, CFG_EXITTO, gExitPath, sizeof(gExitPath)); diaGetInt(diaConfig, CFG_ENWRITEOP, &gEnableWrite); diaGetInt(diaConfig, CFG_HDDSPINDOWN, &gHDDSpindown); diff --git a/src/hdd.c b/src/hdd.c index 753e70817..3620a6acb 100644 --- a/src/hdd.c +++ b/src/hdd.c @@ -67,7 +67,7 @@ int hddSetTransferMode(int type, int mode) } //------------------------------------------------------------------------- -void hddSetIdleTimeout(int timeout) +int hddSetIdleTimeout(int timeout) { // From hdparm man: // A value of zero means "timeouts are disabled": the @@ -81,16 +81,11 @@ void hddSetIdleTimeout(int timeout) // 21 minutes plus 15 seconds. Note that some older drives may // have very different interpretations of these values. - u8 standbytimer = (u8)timeout; + u8 args[16]; - fileXioDevctl("hdd0:", HDIOC_IDLE, &standbytimer, 1, NULL, 0); - fileXioDevctl("hdd1:", HDIOC_IDLE, &standbytimer, 1, NULL, 0); -} + *(u32 *)&args[0] = timeout & 0xff; -void hddSetIdleImmediate(void) -{ - fileXioDevctl("hdd0:", HDIOC_IDLEIMM, NULL, 0, NULL, 0); - fileXioDevctl("hdd1:", HDIOC_IDLEIMM, NULL, 0, NULL, 0); + return fileXioDevctl("hdd0:", HDIOC_IDLE, args, 4, NULL, 0); } //------------------------------------------------------------------------- @@ -155,7 +150,7 @@ static int hddGetHDLGameInfo(struct GameDataEntry *game, hdl_game_info_t *ginfo) ginfo->dma_type = hdl_header->dma_type; ginfo->dma_mode = hdl_header->dma_mode; ginfo->layer_break = hdl_header->layer1_start; - ginfo->disctype = (u8)hdl_header->discType; + ginfo->disctype = hdl_header->discType; ginfo->start_sector = game->lba; ginfo->total_size_in_kb = game->size * 2; //size * 2048 / 1024 = 2x } else diff --git a/src/hddsupport.c b/src/hddsupport.c index a5e738011..dd6bf9fd2 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -17,7 +17,7 @@ #define OPL_HDD_MODE_PS2LOGO_OFFSET 0x17F8 -static unsigned char hddForceUpdate = 0; +static unsigned char hddForceUpdate = 1; static unsigned char hddHDProKitDetected = 0; static unsigned char hddModulesLoaded = 0; @@ -35,9 +35,6 @@ char* hddGetPrefix(void){ } //END of OPL_DB tweaks -static int hddLoadGameListCache(hdl_games_list_t *cache); -static int hddUpdateGameListCache(hdl_games_list_t *cache, hdl_games_list_t *game_list); - static void hddInitModules(void) { @@ -195,7 +192,7 @@ void hddLoadModules(void) void hddInit(void) { LOG("HDDSUPPORT Init\n"); - hddForceUpdate = 0; //Use cache at initial startup. + hddForceUpdate = 1; configGetInt(configGetByType(CONFIG_OPL), "hdd_frames_delay", &hddGameList.delay); ioPutRequest(IO_CUSTOM_SIMPLEACTION, &hddInitModules); hddGameList.enabled = 1; @@ -209,32 +206,18 @@ item_list_t *hddGetObject(int initOnly) } static int hddNeedsUpdate(void) -{ /* Auto refresh is disabled by setting HDD_MODE_UPDATE_DELAY to MENU_UPD_DELAY_NOUPDATE, within hddsupport.h. - Hence any update request would be issued by the user, which should be taken as an explicit request to re-scan the HDD. */ - return 1; -} - -static int hddUpdateGameList(void) { - hdl_games_list_t hddGamesNew; - int ret; - - if (((ret = hddLoadGameListCache(&hddGames)) != 0) || (hddForceUpdate)) - { - hddGamesNew.count = 0; - hddGamesNew.games = NULL; - ret = hddGetHDLGamelist(&hddGamesNew); - if (ret == 0) - { - hddUpdateGameListCache(&hddGames, &hddGamesNew); - hddFreeHDLGamelist(&hddGames); - hddGames = hddGamesNew; - } + if (hddForceUpdate) { + hddForceUpdate = 0; + return 1; } - hddForceUpdate = 1; //Subsequent refresh operations will cause the HDD to be scanned. + return 0; +} - return (ret == 0 ? hddGames.count : 0); +static int hddUpdateGameList(void) +{ + return (hddGetHDLGamelist(&hddGames) == 0 ? hddGames.count : 0); } static int hddGetGameCount(void) @@ -421,7 +404,7 @@ static void hddLaunchGame(int id, config_set_t *configSet) if (gPS2Logo) EnablePS2Logo = CheckPS2Logo(0, game->start_sector + OPL_HDD_MODE_PS2LOGO_OFFSET); - deinit(NO_EXCEPTION, HDD_MODE); // CAREFUL: deinit will call hddCleanUp, so hddGames/game will be freed + deinit(NO_EXCEPTION); // CAREFUL: deinit will call hddCleanUp, so hddGames/game will be freed sysLaunchLoaderElf(filename, "HDD_MODE", size_irx, irx, size_mcemu_irx, &hdd_mcemu_irx, EnablePS2Logo, compatMode); } @@ -431,14 +414,18 @@ static config_set_t *hddGetConfig(int id) char path[256]; hdl_game_info_t *game = &hddGames.games[id]; - snprintf(path, sizeof(path), "%s"OPL_FOLDER"/%s.cfg", hddPrefix, game->startup); +#ifdef OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddPrefix, game->startup); +#else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddPrefix, game->startup); +#endif config_set_t *config = configAlloc(0, NULL, path); configRead(config); //Does not matter if the config file exists or not. configSetStr(config, CONFIG_ITEM_NAME, game->name); configSetInt(config, CONFIG_ITEM_SIZE, game->total_size_in_kb >> 10); configSetStr(config, CONFIG_ITEM_FORMAT, "HDL"); - configSetStr(config, CONFIG_ITEM_MEDIA, game->disctype == SCECdPS2CD ? "CD" : "DVD"); + configSetStr(config, CONFIG_ITEM_MEDIA, game->disctype == 0x12 ? "CD" : "DVD"); configSetStr(config, CONFIG_ITEM_STARTUP, game->startup); return config; @@ -454,7 +441,6 @@ static int hddGetImage(char *folder, int isRelative, char *value, char *suffix, return texDiscoverLoad(resultTex, path, -1, psm); } -//This may be called, even if hddInit() was not. static void hddCleanUp(int exception) { LOG("HDDSUPPORT CleanUp\n"); @@ -464,14 +450,11 @@ static void hddCleanUp(int exception) if ((exception & UNMOUNT_EXCEPTION) == 0) fileXioUmount(hddPrefix); - } - //UI may have loaded modules outside of HDD mode, so deinitialize regardless of the enabled status. - if (hddModulesLoaded) { fileXioDevctl("pfs:", PDIOC_CLOSEALL, NULL, 0, NULL, 0); - - hddModulesLoaded = 0; } + + hddModulesLoaded = 0; } static int hddCheckVMC(char *name, int createSize) @@ -479,148 +462,8 @@ static int hddCheckVMC(char *name, int createSize) return sysCheckVMC(hddPrefix, "/", name, createSize, NULL); } -//This may be called, even if hddInit() was not. -static void hddShutdown(void) -{ - LOG("HDDSUPPORT Shutdown\n"); - - if (hddGameList.enabled) { - hddFreeHDLGamelist(&hddGames); - fileXioUmount(hddPrefix); - } - - //UI may have loaded modules outside of HDD mode, so deinitialize regardless of the enabled status. - if (hddModulesLoaded) { - /* Close all files */ - fileXioDevctl("pfs:", PDIOC_CLOSEALL, NULL, 0, NULL, 0); - - //DEV9 will remain active if ETH is in use, so put the HDD in IDLE state. - //The HDD should still enter standby state after 21 minutes & 15 seconds, as per the ATAD defaults. - hddSetIdleImmediate(); - - //Only shut down dev9 from here, if it was initialized from here before. - sysShutdownDev9(); - - hddModulesLoaded = 0; - } -} - -static int hddLoadGameListCache(hdl_games_list_t *cache) -{ - char filename[256]; - FILE *file; - hdl_game_info_t *games; - int result, size, count; - - if (!gGameListCache) - return 1; - - hddFreeHDLGamelist(cache); - - sprintf(filename, "%s/games.bin", hddPrefix); - file = fopen(filename, "rb"); - if (file != NULL) - { - fseek(file, 0, SEEK_END); - size = ftell(file); - rewind(file); - - count = size / sizeof(hdl_game_info_t); - if (count > 0) - { - games = memalign(64, count * sizeof(hdl_game_info_t)); - if (games != NULL) - { - if (fread(games, sizeof(hdl_game_info_t), count, file) == count) - { - cache->count = count; - cache->games = games; - LOG("hddLoadGameListCache: %d games loaded.\n", count); - result = 0; - } else { - LOG("hddLoadGameListCache: I/O error.\n"); - free(games); - result = EIO; - } - } else { - LOG("hddLoadGameListCache: failed to allocate memory.\n"); - result = ENOMEM; - } - } else { - result = -1; //Empty file - } - - fclose(file); - } else { - result = ENOENT; - } - - return result; -} - -static int hddUpdateGameListCache(hdl_games_list_t *cache, hdl_games_list_t *game_list) -{ - char filename[256]; - FILE *file; - int result, i, j, modified; - - if (!gGameListCache) - return 1; - - if (cache->count > 0) - { - modified = 0; - for(i = 0; i < cache->count; i++) - { - for (j = 0; j < game_list->count; j++) - { - if (strncmp(cache->games[i].partition_name, game_list->games[j].partition_name, APA_IDMAX+1) == 0) - break; - } - - if (j == game_list->count) - { - LOG("hddUpdateGameListCache: game added.\n"); - modified = 1; - break; - } - } - - if ((!modified) && (game_list->count != cache->count)) - { - LOG("hddUpdateGameListCache: game removed.\n"); - modified = 1; - } - } else { - modified = (game_list->count > 0) ? 1 : 0; - } - - if (!modified) - return 0; - LOG("hddUpdateGameListCache: caching new game list.\n"); - - sprintf(filename, "%s/games.bin", hddPrefix); - if (game_list->count > 0) - { - file = fopen(filename, "wb"); - if (file != NULL) - { - result = (fwrite(game_list->games, sizeof(hdl_game_info_t), game_list->count, file) == game_list->count) ? 0 : EIO; - fclose(file); - } else { - result = EIO; - } - } else { - //Last game deleted. - remove(filename); - result = 0; - } - - return result; -} - static item_list_t hddGameList = { - HDD_MODE, 0, 0, MODE_FLAG_COMPAT_DMA, MENU_MIN_INACTIVE_FRAMES, HDD_MODE_UPDATE_DELAY, "HDD Games", _STR_HDD_GAMES, "pfs0:/APPS", &hddInit, &hddNeedsUpdate, &hddUpdateGameList, + HDD_MODE, 0, MODE_FLAG_COMPAT_DMA, MENU_MIN_INACTIVE_FRAMES, HDD_MODE_UPDATE_DELAY, "HDD Games", _STR_HDD_GAMES, &hddInit, &hddNeedsUpdate, &hddUpdateGameList, &hddGetGameCount, &hddGetGame, &hddGetGameName, &hddGetGameNameLength, &hddGetGameStartup, &hddDeleteGame, &hddRenameGame, - &hddLaunchGame, &hddGetConfig, &hddGetImage, &hddCleanUp, &hddShutdown, &hddCheckVMC, HDD_ICON + &hddLaunchGame, &hddGetConfig, &hddGetImage, &hddCleanUp, &hddCheckVMC, HDD_ICON }; diff --git a/src/ioman.c b/src/ioman.c index 5de714128..0a7a48e80 100644 --- a/src/ioman.c +++ b/src/ioman.c @@ -232,8 +232,9 @@ int ioPutRequest(int type, void *data) SignalSema(gEndSemaId); - // Worker thread cannot wake itself up (WakeupThread will return an error), but it will find the new request before sleeping. - WakeupThread(gIOThreadId); + // Worker thread cannot wake itself up, but it will find the new request before sleeping. + if (GetThreadId() != gIOThreadId) + WakeupThread(gIOThreadId); return IO_OK; } diff --git a/src/lang.c b/src/lang.c index c55d688f4..56846bdb7 100644 --- a/src/lang.c +++ b/src/lang.c @@ -278,7 +278,6 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Sound Effects Volume", "Boot Sound Volume", "Confirm video mode change?", - "Cache Game List", //START of OPL_DB tweaks "PS1 Games", "PS1 Games display mode", diff --git a/src/opl.c b/src/opl.c index 712f37203..d1a5acf1f 100644 --- a/src/opl.c +++ b/src/opl.c @@ -39,10 +39,6 @@ #include #include -#ifdef PADEMU -#include -#include -#endif #ifdef __EESIO_DEBUG #include @@ -67,6 +63,8 @@ #endif #endif +static void RefreshAllLists(void); + typedef struct { item_list_t *support; @@ -106,7 +104,7 @@ static void clearIOModuleT(opl_io_module_t *mod) // forward decl static void clearMenuGameList(opl_io_module_t *mdl); -static void moduleCleanup(opl_io_module_t *mod, int exception, int modeSelected); +static void moduleCleanup(opl_io_module_t *mod, int exception); static void reset(void); static void deferredAudioInit(void); @@ -170,7 +168,6 @@ static void itemExecSelect(struct menu_item *curMenu) } else { support->itemInit(); moduleUpdateMenu(support->mode, 0); - // Manual refreshing can only be done if either auto refresh is disabled or auto refresh is disabled for the item. if (!gAutoRefresh || (support->updateDelay == MENU_UPD_DELAY_NOUPDATE)) ioPutRequest(IO_MENU_UPDATE_DEFFERED, &support->mode); } @@ -198,7 +195,10 @@ static void itemExecCancel(struct menu_item *curMenu) strncpy(newName, curMenu->current->item.text, nameLength); if (guiShowKeyboard(newName, nameLength)) { support->itemRename(curMenu->current->item.id, newName); - ioPutRequest(IO_MENU_UPDATE_DEFFERED, &support->mode); + if (gAutoRefresh) + RefreshAllLists(); + else + ioPutRequest(IO_MENU_UPDATE_DEFFERED, &support->mode); } } } @@ -249,7 +249,10 @@ static void itemExecSquare(struct menu_item *curMenu) if (menuCheckParentalLock() == 0) { if (guiMsgBox(_l(_STR_DELETE_WARNING), 1, NULL)) { support->itemDelete(curMenu->current->item.id); - ioPutRequest(IO_MENU_UPDATE_DEFFERED, &support->mode); + if (gAutoRefresh) + RefreshAllLists(); + else + ioPutRequest(IO_MENU_UPDATE_DEFFERED, &support->mode); } } } @@ -337,7 +340,10 @@ static void initSupport(item_list_t *itemList, int startMode, int mode, int forc mod->support->itemInit(); moduleUpdateMenu(mode, 0); - ioPutRequest(IO_MENU_UPDATE_DEFFERED, &mod->support->mode); // can't use mode as the variable will die at end of execution + if (gAutoRefresh) + RefreshAllLists(); + else + ioPutRequest(IO_MENU_UPDATE_DEFFERED, &mod->support->mode); // can't use mode as the variable will die at end of execution } } } @@ -348,126 +354,22 @@ static void initAllSupport(int force_reinit) initSupport(ethGetObject(0), gETHStartMode, ETH_MODE, force_reinit || (gNetworkStartup >= ERROR_ETH_SMB_CONN)); initSupport(hddGetObject(0), gHDDStartMode, HDD_MODE, force_reinit); initSupport(appGetObject(0), gAPPStartMode, APP_MODE, force_reinit); - //START of OPL_DB tweaks +//START of OPL_DB tweaks initSupport(elmGetObject(0), gELMStartMode, ELM_MODE, force_reinit); - //END of OPL_DB tweaks -} - -static void deinitAllSupport(int exception, int modeSelected) -{ - moduleCleanup(&list_support[USB_MODE], exception, modeSelected); - moduleCleanup(&list_support[ETH_MODE], exception, modeSelected); - moduleCleanup(&list_support[HDD_MODE], exception, modeSelected); - moduleCleanup(&list_support[APP_MODE], exception, modeSelected); - //START of OPL_DB tweaks - moduleCleanup(&list_support[ELM_MODE], exception, modeSelected); - //END of OPL_DB tweaks -} - -char *oplGetModeText(int mode) -{ - return(list_support[mode].support->textId == -1 ? list_support[mode].support->text : _l(list_support[mode].support->textId)); -} - -//For resolving the mode, given an app's path -int oplPath2Mode(const char *path) -{ - const char *blkdevnameend; - int i, blkdevnamelen; - item_list_t *listSupport; - - for (i = 0; i < MODE_COUNT; i++) - { - listSupport = list_support[i].support; - if ((listSupport != NULL) && (listSupport->appsPath != NULL)) - { - blkdevnameend = strchr(listSupport->appsPath, ':'); - if (blkdevnameend != NULL) - { - blkdevnamelen = (int)(blkdevnameend - listSupport->appsPath) + 1; - - if (strncmp(path, listSupport->appsPath, blkdevnamelen) == 0) - return listSupport->mode; - } - } - } - - return -1; -} - -int oplGetAppImage(char *folder, int isRelative, char *value, char *suffix, GSTEXTURE *resultTex, short psm) -{ - int i, remaining; - char priority; - item_list_t *listSupport; - - // We search on ever devices from fatest to slowest (HDD > ETH > USB) - for (remaining = MODE_COUNT,priority = 0; remaining > 0 && priority < 4; priority++) - { - for (i = 0; i < MODE_COUNT; i++) - { - listSupport = list_support[i].support; - - if (listSupport->appsPriority == priority) - { - if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) - return 0; - remaining--; - } - } - } - - return -1; +//END of OPL_DB tweaks } -int oplScanApps(int (*callback)(const char *path, config_set_t *appConfig, void *arg), void *arg) +static void deinitAllSupport(int exception) { - iox_dirent_t dirent; - int i, fd, count, ret; - item_list_t *listSupport; - config_set_t *appConfig; - char dir[128]; - char path[128]; - - count = 0; - for (i = 0; i < MODE_COUNT; i++) - { - listSupport = list_support[i].support; - if ((listSupport != NULL) && (listSupport->appsPath != NULL) && (listSupport->enabled)) - { - if ((fd = fileXioDopen(listSupport->appsPath)) > 0) - { - while (fileXioDread(fd, &dirent) > 0) - { - if (strcmp(dirent.name, ".") == 0 || strcmp(dirent.name, "..") == 0 || (!FIO_S_ISDIR(dirent.stat.mode))) - continue; - - snprintf(dir, sizeof(dir), "%s/%s", listSupport->appsPath, dirent.name); - snprintf(path, sizeof(path), "%s/%s", dir, APP_TITLE_CONFIG_FILE); - appConfig = configAlloc(0, NULL, path); - if (appConfig != NULL) - { - configRead(appConfig); - - ret = callback(dir, appConfig, arg); - configFree(appConfig); - - if (ret == 0) - count++; - else if (ret < 0) - { //Stopped because of unrecoverable error. - break; - } - } - } - - fileXioDclose(fd); - } else - LOG("APPS failed to open dir %s\n", listSupport->appsPath); - } - } + moduleCleanup(&list_support[USB_MODE], exception); + moduleCleanup(&list_support[ETH_MODE], exception); + moduleCleanup(&list_support[HDD_MODE], exception); + moduleCleanup(&list_support[APP_MODE], exception); +//START of OPL_DB tweaks + moduleCleanup(&list_support[ELM_MODE], exception); +//END of OPL_DB tweaks - return count; + ethDeinitModules(); //Deinitialize here if the UI used network support without SMB. } // ---------------------------------------------------------- @@ -531,6 +433,19 @@ void menuDeferredUpdate(void *data) } } +static void RefreshAllLists(void) +{ + int i; + + // schedule updates of all the list handlers + for (i = 0; i < MODE_COUNT; i++) { + if (list_support[i].support && list_support[i].support->enabled) + ioPutRequest(IO_MENU_UPDATE_DEFFERED, &list_support[i].support->mode); + } + + frameCounter = 0; +} + #define MENU_GENERAL_UPDATE_DELAY 60 static void menuUpdateHook() @@ -716,7 +631,6 @@ static void _loadConfig() configGetInt(configOPL, CONFIG_OPL_DISABLE_DEBUG, &gDisableDebug); configGetInt(configOPL, CONFIG_OPL_PS2LOGO, &gPS2Logo); - configGetInt(configOPL, CONFIG_OPL_GAME_LIST_CACHE, &gGameListCache); configGetStrCopy(configOPL, CONFIG_OPL_EXIT_PATH, gExitPath, sizeof(gExitPath)); configGetInt(configOPL, CONFIG_OPL_AUTO_SORT, &gAutosort); configGetInt(configOPL, CONFIG_OPL_AUTO_REFRESH, &gAutoRefresh); @@ -732,9 +646,9 @@ static void _loadConfig() configGetInt(configOPL, CONFIG_OPL_HDD_MODE, &gHDDStartMode); configGetInt(configOPL, CONFIG_OPL_ETH_MODE, &gETHStartMode); configGetInt(configOPL, CONFIG_OPL_APP_MODE, &gAPPStartMode); - //START of OPL_DB tweaks +//START of OPL_DB tweaks configGetInt(configOPL, CONFIG_OPL_ELM_MODE, &gELMStartMode); - //END of OPL_DB tweaks +//END of OPL_DB tweaks configGetInt(configOPL, CONFIG_OPL_SFX, &gEnableSFX); configGetInt(configOPL, CONFIG_OPL_BOOT_SND, &gEnableBootSND); configGetInt(configOPL, CONFIG_OPL_SFX_VOLUME, &gSFXVolume); @@ -871,7 +785,6 @@ static void _saveConfig() configSetInt(configOPL, CONFIG_OPL_OVERSCAN, gOverscan); configSetInt(configOPL, CONFIG_OPL_DISABLE_DEBUG, gDisableDebug); configSetInt(configOPL, CONFIG_OPL_PS2LOGO, gPS2Logo); - configSetInt(configOPL, CONFIG_OPL_GAME_LIST_CACHE, gGameListCache); configSetStr(configOPL, CONFIG_OPL_EXIT_PATH, gExitPath); configSetInt(configOPL, CONFIG_OPL_AUTO_SORT, gAutosort); configSetInt(configOPL, CONFIG_OPL_AUTO_REFRESH, gAutoRefresh); @@ -887,9 +800,9 @@ static void _saveConfig() configSetInt(configOPL, CONFIG_OPL_HDD_MODE, gHDDStartMode); configSetInt(configOPL, CONFIG_OPL_ETH_MODE, gETHStartMode); configSetInt(configOPL, CONFIG_OPL_APP_MODE, gAPPStartMode); - //START of OPL_DB tweaks +//START of OPL_DB tweaks configSetInt(configOPL, CONFIG_OPL_ELM_MODE, gELMStartMode); - //END of OPL_DB tweaks +//END of OPL_DB tweaks configSetInt(configOPL, CONFIG_OPL_SFX, gEnableSFX); configSetInt(configOPL, CONFIG_OPL_BOOT_SND, gEnableBootSND); configSetInt(configOPL, CONFIG_OPL_SFX_VOLUME, gSFXVolume); @@ -960,13 +873,9 @@ void applyConfig(int themeID, int langID) moduleUpdateMenu(ETH_MODE, changed); moduleUpdateMenu(HDD_MODE, changed); moduleUpdateMenu(APP_MODE, changed); - //START of OPL_DB tweaks +//START of OPL_DB tweaks moduleUpdateMenu(ELM_MODE, changed); - //END of OPL_DB tweaks - -#ifdef __DEBUG - debugApplyConfig(); -#endif +//END of OPL_DB tweaks } int loadConfig(int types) @@ -1270,8 +1179,7 @@ static int loadHdldSvr(void) ioBlockOps(1); guiExecDeferredOps(); - //Deinitialize all support without shutting down the HDD unit. - deinitAllSupport(NO_EXCEPTION, IO_MODE_SELECTED_ALL); + deinitAllSupport(NO_EXCEPTION); clearErrorMessage(); /* At this point, an error might have been displayed (since background tasks were completed). Clear it, otherwise it will get displayed after the server is closed. */ @@ -1356,38 +1264,22 @@ static void reset(void) #endif } -static void moduleCleanup(opl_io_module_t *mod, int exception, int modeSelected) +static void moduleCleanup(opl_io_module_t *mod, int exception) { if (!mod->support) return; - //Shutdown if not required anymore. - if ((mod->support->mode != modeSelected) && (modeSelected != IO_MODE_SELECTED_ALL)) - { - if (mod->support->itemShutdown) - mod->support->itemShutdown(); - } else { - if (mod->support->itemCleanUp) - mod->support->itemCleanUp(exception); - } + if (mod->support->itemCleanUp) + mod->support->itemCleanUp(exception); clearMenuGameList(mod); } -void deinit(int exception, int modeSelected) +void deinit(int exception) { - if (gEnableSFX) { - gEnableSFX = 0; - } - audsrv_quit(); - -#ifdef PADEMU - ds34usb_reset(); - ds34bt_reset(); -#endif unloadPads(); - deinitAllSupport(exception, modeSelected); + deinitAllSupport(exception); ioEnd(); guiEnd(); @@ -1404,9 +1296,9 @@ static void setDefaults(void) clearIOModuleT(&list_support[ETH_MODE]); clearIOModuleT(&list_support[HDD_MODE]); clearIOModuleT(&list_support[APP_MODE]); - //START of OPL_DB tweaks +//START of OPL_DB tweaks clearIOModuleT(&list_support[ELM_MODE]); - //END of OPL_DB tweaks +//END of OPL_DB tweaks gBaseMCDir = "mc?:OPL"; @@ -1447,7 +1339,6 @@ static void setDefaults(void) gAutoRefresh = 0; gDisableDebug = 1; gPS2Logo = 0; - gGameListCache = 0; gEnableWrite = 0; gRememberLastPlayed = 0; gAutoStartLastPlayed = 9; @@ -1467,7 +1358,7 @@ static void setDefaults(void) gHDDStartMode = START_MODE_DISABLED; gETHStartMode = START_MODE_DISABLED; gAPPStartMode = START_MODE_DISABLED; - //START of OPL_DB tweaks +//START of OPL_DB tweaks gELMStartMode = START_MODE_DISABLED; gDefaultBgColor[0] = 0x000; @@ -1485,7 +1376,7 @@ static void setDefaults(void) gDefaultUITextColor[0] = 0x032; gDefaultUITextColor[1] = 0x0ff; gDefaultUITextColor[2] = 0x030; - //END of OPL_DB tweaks +//END of OPL_DB tweaks frameCounter = 0; @@ -1578,10 +1469,6 @@ static void deferredAudioInit(void) // --------------------- Main -------------------- int main(int argc, char *argv[]) { -#ifdef __DECI2_DEBUG - sysInitDECI2(); -#endif - LOG_INIT(); PREINIT_LOG("OPL GUI start!\n"); diff --git a/src/supportbase.c b/src/supportbase.c index b8532dcc8..5f678f174 100644 --- a/src/supportbase.c +++ b/src/supportbase.c @@ -19,11 +19,6 @@ struct game_list_t struct game_list_t *next; }; -struct game_cache_list { - unsigned int count; - base_game_info_t *games; -}; - int sbIsSameSize(const char *prefix, int prevSize) { int size = -1; @@ -79,7 +74,7 @@ static inline int GetStartupExecName(const char *path, char *filename, int maxle fseek(file, 0, SEEK_END); size = ftell(file); rewind(file); - if ((SystemCNF = memalign(64, size + 1)) != NULL) { + if ((SystemCNF = malloc(size + 1)) != NULL) { fread(SystemCNF, 1, size, file); fclose(file); SystemCNF[size] = '\0'; @@ -92,7 +87,7 @@ static inline int GetStartupExecName(const char *path, char *filename, int maxle free(SystemCNF); if (NextLine != NULL && strcmp(strtok(NextLine, "\t ="), "BOOT2") == 0) { - if ((p = strtok(NULL, "\t =")) != NULL && strncmp(p, "cdrom0:\\", 8) == 0) { + if ((p = strtok(NULL, " =")) != NULL && strncmp(p, "cdrom0:\\", 8) == 0) { strncpy(filename, p + 8, maxlength); /* Skip the device name part of the path ("cdrom0:\"). */ filename[maxlength] = '\0'; LOG("Startup EXEC path: %s\n", filename); @@ -114,193 +109,12 @@ static inline int GetStartupExecName(const char *path, char *filename, int maxle return result; } -static void freeISOGameListCache(struct game_cache_list *cache); - -static int loadISOGameListCache(const char *path, struct game_cache_list *cache) -{ - char filename[256]; - FILE *file; - base_game_info_t *games; - int result, size, count; - - if (!gGameListCache) - return 1; - - freeISOGameListCache(cache); - - sprintf(filename, "%s/games.bin", path); - file = fopen(filename, "rb"); - if (file != NULL) - { - fseek(file, 0, SEEK_END); - size = ftell(file); - rewind(file); - - count = size / sizeof(base_game_info_t); - if (count > 0) - { - games = memalign(64, count * sizeof(base_game_info_t)); - if (games != NULL) - { - if (fread(games, sizeof(base_game_info_t), count, file) == count) - { - LOG("loadISOGameListCache: %d games loaded.\n", count); - cache->count = count; - cache->games = games; - result = 0; - } else { - LOG("loadISOGameListCache: I/O error.\n"); - free(games); - result = EIO; - } - } else { - LOG("loadISOGameListCache: failed to allocate memory.\n"); - result = ENOMEM; - } - } else { - result = -1; //Empty file (should not happen) - } - - fclose(file); - } else { - result = ENOENT; - } - - return result; -} - -static void freeISOGameListCache(struct game_cache_list *cache) -{ - if (cache->games != NULL) - { - free(cache->games); - cache->games = NULL; - cache->count = 0; - } -} - -static int updateISOGameList(const char *path, const struct game_cache_list *cache, const struct game_list_t *head, int count) -{ - char filename[256]; - FILE *file; - const struct game_list_t *game; - int result, i, j, modified; - base_game_info_t *list; - - if (!gGameListCache) - return 1; - - modified = 0; - if (cache != NULL) - { - if ((head != NULL) && (count > 0)) - { - game = head; - - for (i = 0; i < count; i++) - { - for (j = 0; j < cache->count; j++) - { - if (strncmp(cache->games[i].name, game->gameinfo.name, ISO_GAME_NAME_MAX+1) == 0 - && strncmp(cache->games[i].extension, game->gameinfo.extension, ISO_GAME_EXTENSION_MAX+1) == 0) - break; - } - - if (j == cache->count) - { - LOG("updateISOGameList: game added.\n"); - modified = 1; - break; - } - - game = game->next; - } - - if ((!modified) && (count != cache->count)) - { - LOG("updateISOGameList: game removed.\n"); - modified = 1; - } - } else { - modified = 0; - } - } else { - modified = ((head != NULL) && (count > 0)) ? 1 : 0; - } - - if (!modified) - return 0; - LOG("updateISOGameList: caching new game list.\n"); - - result = 0; - sprintf(filename, "%s/games.bin", path); - if ((head != NULL) && (count > 0)) - { - list = (base_game_info_t *)memalign(64, sizeof(base_game_info_t) * count); - - if (list != NULL) { - // Convert the linked list into a flat array, for writing performance. - game = head; - for (i = 0; (i < count) && (game != NULL); i++, game = game->next) { - // copy one game, advance - memcpy(&list[i], &game->gameinfo, sizeof(base_game_info_t)); - } - - file = fopen(filename, "wb"); - if (file != NULL) - { - result = fwrite(list, sizeof(base_game_info_t), count, file) == count ? 0 : EIO; - - fclose(file); - - if (result != 0) - remove(filename); - } else - result = EIO; - - free(list); - } else - result = ENOMEM; - } else { - //Last game deleted. - remove(filename); - } - - return result; -} - -//Queries for the game entry, based on filename. Only the new filename format is supported (filename.ext). -static int queryISOGameListCache(const struct game_cache_list *cache, base_game_info_t *ginfo, const char *filename) -{ - char isoname[ISO_GAME_FNAME_MAX+1]; - int i; - - for (i = 0; i < cache->count; i++) - { - snprintf(isoname, sizeof(isoname), "%s%s", cache->games[i].name, cache->games[i].extension); - - if (strcmp(filename, isoname) == 0) - { - memcpy(ginfo, &cache->games[i], sizeof(base_game_info_t)); - return 0; - } - } - - return ENOENT; -} - static int scanForISO(char *path, char type, struct game_list_t **glist) { - int fd, NameLen, count = 0, format, MountFD, cacheLoaded; - struct game_cache_list cache; - base_game_info_t cachedGInfo; + int fd, NameLen, count = 0, format, MountFD; char fullpath[256], startup[GAME_STARTUP_MAX]; iox_dirent_t record; - cache.games = NULL; - cache.count = 0; - cacheLoaded = loadISOGameListCache(path, &cache) == 0; - if ((fd = fileXioDopen(path)) > 0) { while (fileXioDread(fd, &record) > 0) { if ((format = isValidIsoName(record.name, &NameLen)) > 0) { @@ -329,54 +143,37 @@ static int scanForISO(char *path, char type, struct game_list_t **glist) break; } } else { - if(queryISOGameListCache(&cache, &cachedGInfo, record.name) != 0) { - sprintf(fullpath, "%s/%s", path, record.name); - - if ((MountFD = fileXioMount("iso:", fullpath, FIO_MT_RDONLY)) >= 0) { - if (GetStartupExecName("iso:/SYSTEM.CNF;1", startup, GAME_STARTUP_MAX - 1) == 0) { - struct game_list_t *next = (struct game_list_t *)malloc(sizeof(struct game_list_t)); - - if (next != NULL) { - next->next = *glist; - *glist = next; - - game = &(*glist)->gameinfo; - - strcpy(game->startup, startup); - strncpy(game->name, record.name, NameLen); - game->name[NameLen] = '\0'; - strncpy(game->extension, &record.name[NameLen], sizeof(game->extension)); - game->extension[sizeof(game->extension) - 1] = '\0'; - } else { - //Out of memory. - fileXioUmount("iso:"); - break; - } + sprintf(fullpath, "%s/%s", path, record.name); + if ((MountFD = fileXioMount("iso:", fullpath, FIO_MT_RDONLY)) >= 0) { + if (GetStartupExecName("iso:/SYSTEM.CNF;1", startup, GAME_STARTUP_MAX - 1) == 0) { + struct game_list_t *next = (struct game_list_t *)malloc(sizeof(struct game_list_t)); + + if (next != NULL) { + next->next = *glist; + *glist = next; + + game = &(*glist)->gameinfo; + + strcpy(game->startup, startup); + strncpy(game->name, record.name, NameLen); + game->name[NameLen] = '\0'; + strncpy(game->extension, &record.name[NameLen], sizeof(game->extension)); + game->extension[sizeof(game->extension) - 1] = '\0'; } else { - //Unable to parse SYSTEM.CNF. + //Out of memory. fileXioUmount("iso:"); - continue; + break; } - - fileXioUmount("iso:"); } else { - //Unable to mount game. + //Unable to parse SYSTEM.CNF. + fileXioUmount("iso:"); continue; } - } else { - //Entry was found in cache. - struct game_list_t *next = (struct game_list_t *)malloc(sizeof(struct game_list_t)); - if (next != NULL) { - next->next = *glist; - *glist = next; - - game = &(*glist)->gameinfo; - memcpy(game, &cachedGInfo, sizeof(base_game_info_t)); - } else { - //Out of memory. - break; - } + fileXioUmount("iso:"); + } else { + //Unable to mount game. + continue; } } @@ -393,14 +190,6 @@ static int scanForISO(char *path, char type, struct game_list_t **glist) count = fd; } - if (cacheLoaded) - { - updateISOGameList(path, &cache, *glist, count); - freeISOGameListCache(&cache); - } else { - updateISOGameList(path, NULL, *glist, count); - } - return count; } @@ -420,11 +209,11 @@ int sbReadList(base_game_info_t **list, const char *prefix, int *fsize, int *gam // count iso games in "cd" directory snprintf(path, sizeof(path), "%sCD", prefix); - count = scanForISO(path, SCECdPS2CD, &dlist_head); + count = scanForISO(path, 0x12, &dlist_head); // count iso games in "dvd" directory snprintf(path, sizeof(path), "%sDVD", prefix); - if ((result = scanForISO(path, SCECdPS2DVD, &dlist_head)) >= 0) { + if ((result = scanForISO(path, 0x14, &dlist_head)) >= 0) { count = count < 0 ? result : count + result; } @@ -509,7 +298,7 @@ int sbProbeISO9660(const char *path, base_game_info_t *game, u32 layer1_offset) char buffer[6]; result = -1; - if (game->media == SCECdPS2DVD) { //Only DVDs can have multiple layers. + if (game->media == 0x14) { //Only DVDs can have multiple layers. if ((file = fopen(path, "rb")) != NULL) { if (fseek(file, layer1_offset * 2048, SEEK_SET) == 0) { if ((fread(buffer, 1, sizeof(buffer), file) == sizeof(buffer)) && @@ -530,7 +319,7 @@ int sbProbeISO9660_64(const char *path, base_game_info_t *game, u32 layer1_offse char buffer[6]; result = -1; - if (game->media == SCECdPS2DVD) { //Only DVDs can have multiple layers. + if (game->media == 0x14) { //Only DVDs can have multiple layers. if ((fd = fileXioOpen(path, O_RDONLY, 0666)) >= 0) { if (fileXioLseek64(fd, (u64)layer1_offset * 2048, SEEK_SET) == (u64)layer1_offset * 2048) { if ((fileXioRead(fd, buffer, sizeof(buffer)) == sizeof(buffer)) && @@ -665,12 +454,12 @@ void sbDelete(base_game_info_t **list, const char *prefix, const char *sep, int if (game->format != GAME_FORMAT_USBLD) { if (game->format != GAME_FORMAT_OLD_ISO) { - if (game->media == SCECdPS2CD) + if (game->media == 0x12) snprintf(path, sizeof(path), "%sCD%s%s.%s%s", prefix, sep, game->startup, game->name, game->extension); else snprintf(path, sizeof(path), "%sDVD%s%s.%s%s", prefix, sep, game->startup, game->name, game->extension); } else { - if (game->media == SCECdPS2CD) + if (game->media == 0x12) snprintf(path, sizeof(path), "%sCD%s%s%s", prefix, sep, game->name, game->extension); else snprintf(path, sizeof(path), "%sDVD%s%s%s", prefix, sep, game->name, game->extension); @@ -696,7 +485,7 @@ void sbRename(base_game_info_t **list, const char *prefix, const char *sep, int if (game->format != GAME_FORMAT_USBLD) { if (game->format == GAME_FORMAT_OLD_ISO) { - if (game->media == SCECdPS2CD) { + if (game->media == 0x12) { snprintf(oldpath, sizeof(oldpath), "%sCD%s%s.%s%s", prefix, sep, game->startup, game->name, game->extension); snprintf(newpath, sizeof(newpath), "%sCD%s%s.%s%s", prefix, sep, game->startup, newname, game->extension); } else { @@ -704,7 +493,7 @@ void sbRename(base_game_info_t **list, const char *prefix, const char *sep, int snprintf(newpath, sizeof(newpath), "%sDVD%s%s.%s%s", prefix, sep, game->startup, newname, game->extension); } } else { - if (game->media == SCECdPS2CD) { + if (game->media == 0x12) { snprintf(oldpath, sizeof(oldpath), "%sCD%s%s%s", prefix, sep, game->name, game->extension); snprintf(newpath, sizeof(newpath), "%sCD%s%s%s", prefix, sep, newname, game->extension); } else { @@ -734,7 +523,11 @@ void sbRename(base_game_info_t **list, const char *prefix, const char *sep, int config_set_t *sbPopulateConfig(base_game_info_t *game, const char *prefix, const char *sep) { char path[256]; - snprintf(path, sizeof(path), "%s"OPL_FOLDER"%s%s.cfg", prefix, sep, game->startup); +#if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV%s%s.cfg", prefix, sep, game->startup); +#else + snprintf(path, sizeof(path), "%sCFG%s%s.cfg", prefix, sep, game->startup); +#endif config_set_t *config = configAlloc(0, NULL, path); configRead(config); //Does not matter if the config file could be loaded or not. @@ -743,33 +536,44 @@ config_set_t *sbPopulateConfig(base_game_info_t *game, const char *prefix, const configSetInt(config, CONFIG_ITEM_SIZE, game->sizeMB); configSetStr(config, CONFIG_ITEM_FORMAT, game->format != GAME_FORMAT_USBLD ? "ISO" : "UL"); - configSetStr(config, CONFIG_ITEM_MEDIA, game->media == SCECdPS2CD ? "CD" : "DVD"); + configSetStr(config, CONFIG_ITEM_MEDIA, game->media == 0x12 ? "CD" : "DVD"); configSetStr(config, CONFIG_ITEM_STARTUP, game->startup); return config; } -static void sbCreateFoldersFromList(const char *path, const char **folders) +void sbCreateFolders(const char *path, int createDiscImgFolders) { - int i; + // update Themes char fullpath[256]; - for (i = 0; folders[i] != NULL; i++) { - sprintf(fullpath, "%s%s", path, folders[i]); +#if OPL_IS_DEV_BUILD + sprintf(fullpath, "%sCFG-DEV", path); +#else + sprintf(fullpath, "%sCFG", path); +#endif + fileXioMkdir(fullpath, 0777); + + sprintf(fullpath, "%sTHM", path); + fileXioMkdir(fullpath, 0777); + + sprintf(fullpath, "%sART", path); + fileXioMkdir(fullpath, 0777); + + if (createDiscImgFolders) { + sprintf(fullpath, "%sCD", path); fileXioMkdir(fullpath, 0777); - } -} -void sbCreateFolders(const char *path, int createDiscImgFolders) -{ - const char *basicFolders[] = { OPL_FOLDER, "THM", "ART", "VMC", "CHT", "APPS", NULL }; - const char *discImgFolders[] = { "CD", "DVD", NULL }; + sprintf(fullpath, "%sDVD", path); + fileXioMkdir(fullpath, 0777); + } - sbCreateFoldersFromList(path, basicFolders); + sprintf(fullpath, "%sVMC", path); + fileXioMkdir(fullpath, 0777); - if (createDiscImgFolders) - sbCreateFoldersFromList(path, discImgFolders); + sprintf(fullpath, "%sCHT", path); + fileXioMkdir(fullpath, 0777); } int sbLoadCheats(const char *path, const char *file) diff --git a/src/system.c b/src/system.c index 13f033236..f93940310 100644 --- a/src/system.c +++ b/src/system.c @@ -4,10 +4,6 @@ Review OpenUsbLd README & LICENSE files for further details. */ -#ifdef __DECI2_DEBUG -#include -#endif - #include "include/opl.h" #include "include/gui.h" #include "include/ethsupport.h" @@ -127,7 +123,7 @@ int sysLoadModuleBuffer(void *buffer, int size, int argc, char *argv) #define OPL_SIF_CMD_BUFF_SIZE 1 static SifCmdHandlerData_t OplSifCmdbuffer[OPL_SIF_CMD_BUFF_SIZE]; -static unsigned char dev9Initialized = 0, dev9Loaded = 0, dev9InitCount = 0; +static unsigned char dev9Initialized = 0, dev9Loaded = 0; void sysInitDev9(void) { @@ -138,25 +134,6 @@ void sysInitDev9(void) dev9Loaded = (ret == 0); //DEV9.IRX must have successfully loaded and returned RESIDENT END. dev9Initialized = 1; } - - dev9InitCount++; -} - -void sysShutdownDev9(void) -{ - if (dev9InitCount > 0) - { - --dev9InitCount; - - if (dev9InitCount == 0) - { /* Switch off DEV9 once nothing needs it. */ - if (dev9Loaded) - { - while (fileXioDevctl("dev9x:", DDIOC_OFF, NULL, 0, NULL, 0) < 0) { - }; - } - } - } } void sysReset(int modload_mask) @@ -175,14 +152,9 @@ void sysReset(int modload_mask) #ifdef _DTL_T10000 while (!SifIopReset("rom0:UDNL", 0)) ; -#else -#ifdef __DECI2_DEBUG - while (!SifIopRebootBuffer(&deci2_img, size_deci2_img)) - ; #else while (!SifIopReset("", 0)) ; -#endif #endif dev9Initialized = 0; @@ -263,7 +235,25 @@ void sysReset(int modload_mask) void sysPowerOff(void) { - deinit(NO_EXCEPTION, IO_MODE_SELECTED_NONE); + int i; + + deinit(NO_EXCEPTION); + if (dev9Loaded) + { + /* Close all files */ + fileXioDevctl("pfs:", PDIOC_CLOSEALL, NULL, 0, NULL, 0); + /* Switch off DEV9 */ + while (fileXioDevctl("dev9x:", DDIOC_OFF, NULL, 0, NULL, 0) < 0) { + }; + } + + // As required by some (typically 2.5") HDDs, issue the SCSI STOP UNIT command to avoid causing an emergency park. + for (i = 0; i < MAX_USB_DEVICES; i++) { + char device[7]; + sprintf(device, "mass%d:", i); + fileXioDevctl(device, USBMASS_DEVCTL_STOP_UNIT, NULL, 0, NULL, 0); + } + poweroffShutdown(); } @@ -344,14 +334,18 @@ int sysGetDiscID(char *hexDiscID) return 1; } -void sysExecExit(void) +void sysExecExit() { +#ifdef PADEMU + ds34usb_reset(); + ds34bt_reset(); +#endif if (gEnableSFX) { //wait 70ms for confirm sound to finish playing before exit guiDelay(0070); + gEnableSFX = 0; } - //Deinitialize without shutting down active devices. - deinit(NO_EXCEPTION, IO_MODE_SELECTED_ALL); + audsrv_quit(); Exit(0); } @@ -500,10 +494,10 @@ static unsigned int sendIrxKernelRAM(const char *startup, const char *mode_str, #ifdef __INGAME_DEBUG #ifdef __DECI2_DEBUG if (modules & CORE_IRX_DECI2) { - irxptr_tab[modcount].info = size_drvtif_ingame_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_DRVTIF); - irxptr_tab[modcount++].ptr = (void *)&drvtif_ingame_irx; - irxptr_tab[modcount].info = size_tifinet_ingame_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_TIFINET); - irxptr_tab[modcount++].ptr = (void *)&tifinet_ingame_irx; + irxptr_tab[modcount].info = size_drvtif_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_DRVTIF); + irxptr_tab[modcount++].ptr = (void *)&drvtif_irx; + irxptr_tab[modcount].info = size_tifinet_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_TIFINET); + irxptr_tab[modcount++].ptr = (void *)&tifinet_irx; } #else if (modules & CORE_IRX_DEBUG) { @@ -602,21 +596,6 @@ static int ResetDECI2(void) return result; } - -int sysInitDECI2(void) -{ - int result; - - DI(); - ee_kmode_enter(); - - result = ResetDECI2(); - - ee_kmode_exit(); - EI(); - - return result; -} #endif /* Returns the patch location of LoadExecPS2(), which resides in kernel memory. @@ -701,7 +680,7 @@ static int initKernel(void *eeload, void *modStorageEnd, void **eeloadCopy, void return((*eeloadCopy != NULL && *initUserMemory != NULL) ? 0 : -1); } -void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx, int EnablePS2Logo, unsigned int compatflags) +void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx, int EnablePS2Logo, unsigned int compatflags) { unsigned int modules, ModuleStorageSize; void *ModuleStorage, *ModuleStorageEnd; @@ -799,7 +778,7 @@ void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdv argv[i] = ModStorageConfig; i++; - argv[i] = (char*)filename; + argv[i] = filename; i++; char cmask[10]; @@ -811,7 +790,18 @@ void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdv argv[i] = gsm_config_str; i++; - snprintf(ElfPath, sizeof(ElfPath), "cdrom0:\\%s;1", filename); + strcpy(ElfPath, "cdrom0:\\"); + strncat(ElfPath, filename, 11); // fix for 8+3 filename. + strcat(ElfPath, ";1"); + +#ifdef PADEMU + ds34usb_reset(); + ds34bt_reset(); +#endif + if (gEnableSFX) { + gEnableSFX = 0; + } + audsrv_quit(); // Let's go. fileXioExit(); @@ -832,7 +822,7 @@ void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdv } } -int sysExecElf(const char *path) +int sysExecElf(char *path) { u8 *boot_elf = NULL; elf_header_t *eh; @@ -871,7 +861,7 @@ int sysExecElf(const char *path) fileXioExit(); SifExitRpc(); - elf_argv[0] = (char*)path; + elf_argv[0] = path; FlushCache(0); FlushCache(2); diff --git a/src/usbsupport.c b/src/usbsupport.c index 5bf8437e2..4b7ab2958 100644 --- a/src/usbsupport.c +++ b/src/usbsupport.c @@ -301,10 +301,10 @@ static void usbLaunchGame(int id, config_set_t *configSet) for (i = 0; i < game->parts; i++) { switch (game->format) { case GAME_FORMAT_ISO: - sprintf(partname, "%s%s/%s%s", usbPrefix, (game->media == SCECdPS2CD) ? "CD" : "DVD", game->name, game->extension); + sprintf(partname, "%s%s/%s%s", usbPrefix, (game->media == 0x12) ? "CD" : "DVD", game->name, game->extension); break; case GAME_FORMAT_OLD_ISO: - sprintf(partname, "%s%s/%s.%s%s", usbPrefix, (game->media == SCECdPS2CD) ? "CD" : "DVD", game->startup, game->name, game->extension); + sprintf(partname, "%s%s/%s.%s%s", usbPrefix, (game->media == 0x12) ? "CD" : "DVD", game->startup, game->name, game->extension); break; default: //USBExtreme format. sprintf(partname, "%sul.%08X.%s.%02x", usbPrefix, USBA_crc32(game->name), game->startup, i); @@ -342,10 +342,10 @@ static void usbLaunchGame(int id, config_set_t *configSet) //Initialize layer 1 information. switch (game->format) { case GAME_FORMAT_ISO: - sprintf(partname, "%s%s/%s%s", usbPrefix, (game->media == SCECdPS2CD) ? "CD" : "DVD", game->name, game->extension); + sprintf(partname, "%s%s/%s%s", usbPrefix, (game->media == 0x12) ? "CD" : "DVD", game->name, game->extension); break; case GAME_FORMAT_OLD_ISO: - sprintf(partname, "%s%s/%s.%s%s", usbPrefix, (game->media == SCECdPS2CD) ? "CD" : "DVD", game->startup, game->name, game->extension); + sprintf(partname, "%s%s/%s.%s%s", usbPrefix, (game->media == 0x12) ? "CD" : "DVD", game->startup, game->name, game->extension); break; default: //USBExtreme format. sprintf(partname, "%sul.%08X.%s.00", usbPrefix, USBA_crc32(game->name), game->startup); @@ -390,7 +390,7 @@ static void usbLaunchGame(int id, config_set_t *configSet) if (configGetStrCopy(configSet, CONFIG_ITEM_ALTSTARTUP, filename, sizeof(filename)) == 0) strcpy(filename, game->startup); - deinit(NO_EXCEPTION, USB_MODE); // CAREFUL: deinit will call usbCleanUp, so usbGames/game will be freed + deinit(NO_EXCEPTION); // CAREFUL: deinit will call usbCleanUp, so usbGames/game will be freed sysLaunchLoaderElf(filename, "USB_MODE", irx_size, irx, size_mcemu_irx, &usb_mcemu_irx, EnablePS2Logo, compatmask); } @@ -410,7 +410,6 @@ static int usbGetImage(char *folder, int isRelative, char *value, char *suffix, return texDiscoverLoad(resultTex, path, -1, psm); } -//This may be called, even if usbInit() was not. static void usbCleanUp(int exception) { if (usbGameList.enabled) { @@ -420,26 +419,13 @@ static void usbCleanUp(int exception) } } -//This may be called, even if usbInit() was not. -static void usbShutdown(void) -{ - if (usbGameList.enabled) { - LOG("USBSUPPORT Shutdown\n"); - - free(usbGames); - } - - // As required by some (typically 2.5") HDDs, issue the SCSI STOP UNIT command to avoid causing an emergency park. - fileXioDevctl("mass:", USBMASS_DEVCTL_STOP_ALL, NULL, 0, NULL, 0); -} - static int usbCheckVMC(char *name, int createSize) { return sysCheckVMC(usbPrefix, "/", name, createSize, NULL); } static item_list_t usbGameList = { - USB_MODE, 2, 0, 0, MENU_MIN_INACTIVE_FRAMES, USB_MODE_UPDATE_DELAY, "USB Games", _STR_USB_GAMES, "mass0:/APPS", &usbInit, &usbNeedsUpdate, + USB_MODE, 0, 0, MENU_MIN_INACTIVE_FRAMES, USB_MODE_UPDATE_DELAY, "USB Games", _STR_USB_GAMES, &usbInit, &usbNeedsUpdate, &usbUpdateGameList, &usbGetGameCount, &usbGetGame, &usbGetGameName, &usbGetGameNameLength, &usbGetGameStartup, &usbDeleteGame, &usbRenameGame, - &usbLaunchGame, &usbGetConfig, &usbGetImage, &usbCleanUp, &usbShutdown, &usbCheckVMC, USB_ICON + &usbLaunchGame, &usbGetConfig, &usbGetImage, &usbCleanUp, &usbCheckVMC, USB_ICON }; diff --git a/src/util.c b/src/util.c index 0bcaed17d..4bbfa46ac 100644 --- a/src/util.c +++ b/src/util.c @@ -488,86 +488,6 @@ int CheckPS2Logo(int fd, u32 lba) return ValidPS2Logo; } -struct DirentToDelete { - struct DirentToDelete *next; - char *filename; -}; - -int sysDeleteFolder(const char *folder) -{ - int fd, result; - char *path; - iox_dirent_t dirent; - struct DirentToDelete *head, *start; - - result = 0; - start = head = NULL; - if((fd = fileXioDopen(folder)) >= 0) { - /* Generate a list of files in the directory. */ - while(fileXioDread(fd, &dirent) > 0) { - if((strcmp(dirent.name, ".") == 0) || ((strcmp(dirent.name, "..") == 0))) - continue; - - if(FIO_S_ISDIR(dirent.stat.mode)) { - if((path = malloc(strlen(folder)+strlen(dirent.name) + 2)) != NULL) { - sprintf(path, "%s/%s", folder, dirent.name); - result = sysDeleteFolder(path); - free(path); - } - } else { - if(start == NULL) { - head = malloc(sizeof(struct DirentToDelete)); - if(head == NULL) - break; - start = head; - } else { - if((head->next = malloc(sizeof(struct DirentToDelete))) == NULL) - break; - - head=head->next; - } - - head->next=NULL; - - if((head->filename = malloc(strlen(dirent.name) + 1)) != NULL) - strcpy(head->filename, dirent.name); - else - break; - } - } - - fileXioDclose(fd); - } else - result = fd; - - if (result >= 0) { - /* Delete the files. */ - for (head = start; head != NULL; head = start) { - if(head->filename != NULL) { - if((path = malloc(strlen(folder) + strlen(head->filename) + 2)) != NULL) { - sprintf(path, "%s/%s", folder, head->filename); - result=fileXioRemove(path); - if (result < 0) - LOG("sysDeleteFolder: failed to remove %s: %d\n", path, result); - - free(path); - } - free(head->filename); - } - - start = head->next; - free(head); - } - - if(result >= 0) { - result = fileXioRmdir(folder); - LOG("sysDeleteFolder: failed to rmdir %s: %d\n", folder, result); - } - } - - return result; -} - /*----------------------------------------------------------------------------------------*/ /* NOP delay. */ /*----------------------------------------------------------------------------------------*/ From cdfcab5c7f5682057b07a3d81d13be8a6cce5dfb Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Sun, 13 Jan 2019 15:51:02 +0000 Subject: [PATCH 138/269] =?UTF-8?q?Revert=20of=20revert=20=F0=9F=98=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 20 +- ee_core/src/patches.c | 55 +++++- include/appsupport.h | 17 ++ include/config.h | 1 + include/debug.h | 1 + include/dialogs.h | 1 + include/ethsupport.h | 5 +- include/extern_irx.h | 9 + include/hddsupport.h | 5 +- include/iosupport.h | 15 +- include/lang.h | 1 + include/opl.h | 16 +- include/supportbase.h | 27 +-- include/system.h | 9 +- include/util.h | 1 + modules/debug/deci2.img | Bin 0 -> 73625 bytes modules/debug/drvtif-ingame.irx | Bin 0 -> 5985 bytes modules/debug/tifinet-ingame.irx | Bin 0 -> 3301 bytes modules/debug/tifinet.irx | Bin 3301 -> 3301 bytes src/appsupport.c | 327 +++++++++++++++++++++++++------ src/config.c | 2 +- src/debug.c | 22 +++ src/dialogs.c | 5 + src/ethsupport.c | 61 ++++-- src/gui.c | 2 + src/hdd.c | 15 +- src/hddsupport.c | 199 +++++++++++++++++-- src/ioman.c | 5 +- src/lang.c | 1 + src/opl.c | 223 +++++++++++++++------ src/supportbase.c | 326 ++++++++++++++++++++++++------ src/system.c | 104 +++++----- src/usbsupport.c | 28 ++- src/util.c | 80 ++++++++ 34 files changed, 1278 insertions(+), 305 deletions(-) create mode 100755 modules/debug/deci2.img create mode 100755 modules/debug/drvtif-ingame.irx create mode 100755 modules/debug/tifinet-ingame.irx diff --git a/Makefile b/Makefile index b590affca..d7ebc1cb5 100755 --- a/Makefile +++ b/Makefile @@ -141,7 +141,12 @@ endif ifeq ($(DEBUG),1) EE_CFLAGS += -D__DEBUG -g - EE_OBJS += debug.o udptty.o ioptrap.o ps2link.o + ifeq ($(DECI2_DEBUG),1) + EE_OBJS += debug.o drvtif_irx.o tifinet_irx.o deci2_img.o + EE_LDFLAGS += -liopreboot + else + EE_OBJS += debug.o udptty.o ioptrap.o ps2link.o + endif MOD_DEBUG_FLAGS = DEBUG=1 ifeq ($(IOPCORE_DEBUG),1) EE_CFLAGS += -D__INGAME_DEBUG @@ -161,9 +166,9 @@ ifeq ($(DEBUG),1) ifeq ($(DECI2_DEBUG),1) EE_CFLAGS += -D__DECI2_DEBUG EECORE_EXTRA_FLAGS += DECI2_DEBUG=1 - IOP_OBJS += drvtif_irx.o tifinet_irx.o + IOP_OBJS += drvtif_ingame_irx.o tifinet_ingame_irx.o DECI2_DEBUG=1 - CDVDMAN_DEBUG_FLAGS = USE_DEV9=1 #dsidb cannot be used to handle exceptions or set breakpoints, so disable output to save resources. + CDVDMAN_DEBUG_FLAGS = USE_DEV9=1 #(clear IOPCORE_DEBUG) dsidb cannot be used to handle exceptions or set breakpoints, so disable output to save resources. else IOP_OBJS += udptty-ingame.o endif @@ -765,12 +770,21 @@ $(EE_ASM_DIR)transition.s: misc/transition.adp | $(EE_ASM_DIR) $(EE_ASM_DIR)IOPRP_img.s: modules/iopcore/IOPRP.img | $(EE_ASM_DIR) $(BIN2S) $< $@ IOPRP_img +$(EE_ASM_DIR)drvtif_ingame_irx.s: modules/debug/drvtif-ingame.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ drvtif_ingame_irx + +$(EE_ASM_DIR)tifinet_ingame_irx.s: modules/debug/tifinet-ingame.irx | $(EE_ASM_DIR) + $(BIN2S) $< $@ tifinet_ingame_irx + $(EE_ASM_DIR)drvtif_irx.s: modules/debug/drvtif.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ drvtif_irx $(EE_ASM_DIR)tifinet_irx.s: modules/debug/tifinet.irx | $(EE_ASM_DIR) $(BIN2S) $< $@ tifinet_irx +$(EE_ASM_DIR)deci2_img.s: modules/debug/deci2.img | $(EE_ASM_DIR) + $(BIN2S) $< $@ deci2_img + $(EE_OBJS_DIR)%.o: $(EE_SRC_DIR)%.c | $(EE_OBJS_DIR) $(EE_CC) $(EE_CFLAGS) $(EE_INCS) -c $< -o $@ diff --git a/ee_core/src/patches.c b/ee_core/src/patches.c index 8e6734881..5a3974ab9 100644 --- a/ee_core/src/patches.c +++ b/ee_core/src/patches.c @@ -43,6 +43,7 @@ typedef struct #define PATCH_SOS 0x30303030 #define PATCH_ULT_PRO_PINBALL 0xBA11BA11 #define PATCH_FERRARI_CHALLENGE 0x0012FCC8 +#define PATCH_PRO_SNOWBOARDER 0x01020199 static const patchlist_t patch_list[] = { {"SLES_524.58", USB_MODE, {PATCH_GENERIC_NIS, 0x00000000, 0x00000000}}, // Disgaea Hour of Darkness PAL - disable cdvd timeout stuff @@ -107,7 +108,13 @@ static const patchlist_t patch_list[] = { {"SLUS_209.77", ALL_MODE, {PATCH_VIRTUA_QUEST, 0x00000000, 0x00000000}}, // Virtua Quest {"SLPM_656.32", ALL_MODE, {PATCH_VIRTUA_QUEST, 0x00000000, 0x00000000}}, // Virtua Fighter Cyber Generation: Judgment Six No Yabou {"SLES_535.08", ALL_MODE, {PATCH_ULT_PRO_PINBALL, 0x00000000, 0x00000000}}, // Ultimate Pro Pinball - {"SLES_552.94", ALL_MODE, {PATCH_FERRARI_CHALLENGE, 0x00000000, 0x00000000}}, // Ferrari Challenge: Trofeo Pirelli + {"SLES_552.94", ALL_MODE, {PATCH_FERRARI_CHALLENGE, 0x0012fcc8, 0x00000000}}, // Ferrari Challenge: Trofeo Pirelli (PAL) + {"SLUS_217.80", ALL_MODE, {PATCH_FERRARI_CHALLENGE, 0x0012fcb0, 0x00000000}}, // Ferrari Challenge: Trofeo Pirelli (NTSC-U/C) + {"SLUS_201.99", ALL_MODE, {PATCH_PRO_SNOWBOARDER, 0x00000000, 0x00000000}}, // Shaun Palmer's Pro Snowboarder (NTSC-U/C) + {"SLES_504.00", ALL_MODE, {PATCH_PRO_SNOWBOARDER, 0x00000000, 0x00000000}}, // Shaun Palmer's Pro Snowboarder (PAL) + {"SLES_504.01", ALL_MODE, {PATCH_PRO_SNOWBOARDER, 0x00000000, 0x00000000}}, // Shaun Palmer's Pro Snowboarder (PAL French) - Untested + {"SLES_504.02", ALL_MODE, {PATCH_PRO_SNOWBOARDER, 0x00000000, 0x00000000}}, // Shaun Palmer's Pro Snowboarder (PAL German) - Untested + {"SLPM_651.98", ALL_MODE, {PATCH_PRO_SNOWBOARDER, 0x00000000, 0x00000000}}, // Shaun Palmer's Pro Snowboarder (NTSC-J) - Untested {NULL, 0, {0x00000000, 0x00000000, 0x00000000}} // terminater }; @@ -678,10 +685,47 @@ static void UltProPinballPatch(const char *path) } } -static void FerrariChallengePatch(void) +static void FerrariChallengePatch(u32 addr) { //Ferrari Challenge has the main thread ID hardcoded for a call to WakeupThread(). + // addiu $a0, $zero, 1 //This breaks when the thread IDs change after IGR is used. - *(vu16*)0x0012fcc8 = (u16)GetThreadId(); + *(vu16*)addr = (u16)GetThreadId(); +} + +static void ProSnowboarderPatch(void) +{ //Shaun Palmer's Pro Snowboarder incorrectly uses the main thread ID as the priority, causing a deadlock when the main thread ID changes (ID != priority) + //Replace all jal GetThreadId() with a li $v0, 1, whereby 1 is the main thread's priority (never changed by game). + static const unsigned int pattern[] = { + 0x240300ff, //addiu $v1, $zero, 0xff + 0x3c038080, //li $v0, 0x8080 + 0x34638081, //ori $v1, $v1, 0x8181 + 0x00650018, //mult $v1, $a1 + }; + static const unsigned int pattern_mask[] = { + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff}; + u32 *ptr, *ptr2, *ptr3; + + //Locate the calls to GetThreadId(). + ptr = find_pattern_with_mask((u32 *)0x00180000, 0x00280000, pattern, pattern_mask, sizeof(pattern)); + if (ptr) + { + ptr2 = find_pattern_with_mask(ptr+4, 0x00280000, pattern, pattern_mask, sizeof(pattern)); + + if (ptr2) + { + ptr3 = find_pattern_with_mask(ptr2+4, 0x00280000, pattern, pattern_mask, sizeof(pattern)); + + if (ptr3) + { + *(vu32*)&ptr[-12] = 0x24020001; //addiu $v0, $zero, 1 + *(vu32*)&ptr2[-9] = 0x24020001; //addiu $v0, $zero, 1 + *(vu32*)&ptr3[-9] = 0x24020001; //addiu $v0, $zero, 1 + } + } + } } void apply_patches(const char *path) @@ -729,7 +773,10 @@ void apply_patches(const char *path) UltProPinballPatch(path); break; case PATCH_FERRARI_CHALLENGE: - FerrariChallengePatch(); + FerrariChallengePatch(p->patch.val); + break; + case PATCH_PRO_SNOWBOARDER: + ProSnowboarderPatch(); break; default: // Single-value patches if (_lw(p->patch.addr) == p->patch.check) diff --git a/include/appsupport.h b/include/appsupport.h index 2793ad309..3c05aabb9 100644 --- a/include/appsupport.h +++ b/include/appsupport.h @@ -5,6 +5,23 @@ #define APP_MODE_UPDATE_DELAY 240 +#define APP_TITLE_MAX 128 +#define APP_PATH_MAX 128 +#define APP_BOOT_MAX 64 + +#define APP_CONFIG_TITLE "title" +#define APP_CONFIG_BOOT "boot" + +#define APP_TITLE_CONFIG_FILE "title.cfg" + +typedef struct +{ + char title[APP_TITLE_MAX + 1]; + char path[APP_PATH_MAX + 1]; + char boot[APP_BOOT_MAX + 1]; + u8 legacy; +} app_info_t; + void appInit(); item_list_t *appGetObject(int initOnly); diff --git a/include/config.h b/include/config.h index b3c03b8e1..de3463416 100644 --- a/include/config.h +++ b/include/config.h @@ -70,6 +70,7 @@ enum CONFIG_INDEX { #define CONFIG_OPL_OVERSCAN "overscan" #define CONFIG_OPL_DISABLE_DEBUG "disable_debug" #define CONFIG_OPL_PS2LOGO "ps2logo" +#define CONFIG_OPL_GAME_LIST_CACHE "game_list_cache" #define CONFIG_OPL_EXIT_PATH "exit_path" #define CONFIG_OPL_AUTO_SORT "autosort" #define CONFIG_OPL_AUTO_REFRESH "autorefresh" diff --git a/include/debug.h b/include/debug.h index 85ac0e631..229808d41 100644 --- a/include/debug.h +++ b/include/debug.h @@ -2,5 +2,6 @@ #define __DEBUG_H int debugSetActive(void); +void debugApplyConfig(void); #endif diff --git a/include/dialogs.h b/include/dialogs.h index b3b74d8d7..5bcdab327 100644 --- a/include/dialogs.h +++ b/include/dialogs.h @@ -26,6 +26,7 @@ enum UI_ITEMS { CFG_DEBUG, CFG_PS2LOGO, + CFG_GAMELISTCACHE, CFG_EXITTO, CFG_DEFDEVICE, CFG_USBMODE, diff --git a/include/ethsupport.h b/include/ethsupport.h index 0962b0631..799936fa6 100644 --- a/include/ethsupport.h +++ b/include/ethsupport.h @@ -23,10 +23,7 @@ void ethDeinitModules(void); //Module-only deinitialization, without the GU int ethLoadInitModules(void); //Initializes Ethernet and applies configuration. void ethDisplayErrorStatus(void); //Displays the current error status (if any). GUI must be already initialized. int ethGetNetConfig(u8 *ip_address, u8 *netmask, u8 *gateway); -int ethWaitValidNetIFLinkState(void); -int ethWaitValidDHCPState(void); -int ethApplyNetIFConfig(void); -int ethApplyIPConfig(void); +int ethApplyConfig(void); int ethGetDHCPStatus(void); item_list_t *ethGetObject(int initOnly); diff --git a/include/extern_irx.h b/include/extern_irx.h index 5a62e09b8..d4717ae1a 100644 --- a/include/extern_irx.h +++ b/include/extern_irx.h @@ -16,9 +16,15 @@ extern int size_bt_pademu_irx; extern void *cdvdfsv_irx; extern int size_cdvdfsv_irx; +extern void *deci2_img; +extern int size_deci2_img; + extern void *drvtif_irx; extern int size_drvtif_irx; +extern void *drvtif_ingame_irx; +extern int size_drvtif_ingame_irx; + extern void *ds34bt_irx; extern int size_ds34bt_irx; @@ -139,6 +145,9 @@ extern int size_smsutils_irx; extern void *tifinet_irx; extern int size_tifinet_irx; +extern void *tifinet_ingame_irx; +extern int size_tifinet_ingame_irx; + extern void *udptty_irx; extern int size_udptty_irx; diff --git a/include/hddsupport.h b/include/hddsupport.h index 18e1fe2b5..5e548c55a 100644 --- a/include/hddsupport.h +++ b/include/hddsupport.h @@ -20,8 +20,8 @@ typedef struct u8 ops2l_compat_flags; u8 dma_type; u8 dma_mode; + u8 disctype; u32 layer_break; - int disctype; u32 start_sector; u32 total_size_in_kb; } hdl_game_info_t; @@ -55,7 +55,8 @@ int hddCheck(void); u32 hddGetTotalSectors(void); int hddIs48bit(void); int hddSetTransferMode(int type, int mode); -int hddSetIdleTimeout(int timeout); +void hddSetIdleTimeout(int timeout); +void hddSetIdleImmediate(void); int hddGetHDLGamelist(hdl_games_list_t *game_list); void hddFreeHDLGamelist(hdl_games_list_t *game_list); int hddSetHDLGameInfo(hdl_game_info_t *ginfo); diff --git a/include/iosupport.h b/include/iosupport.h index ed78a1e44..cc47c6c84 100644 --- a/include/iosupport.h +++ b/include/iosupport.h @@ -3,6 +3,9 @@ #include "include/config.h" +#define IO_MODE_SELECTED_NONE -1 +#define IO_MODE_SELECTED_ALL MODE_COUNT + enum IO_MODES { USB_MODE = 0, ETH_MODE, @@ -72,13 +75,16 @@ enum ERROR_CODE { // minimal inactive frames for cover display, can be pretty low since it means no button is pressed :) #define MENU_MIN_INACTIVE_FRAMES 8 -#define MENU_UPD_DELAY_NOUPDATE -1 //Menu won't be ever be updated, even if the user triggers a refresh. -#define MENU_UPD_DELAY_GENREFRESH 0 //Menu will be refreshed every MENU_GENERAL_UPDATE_DELAY frames, regardless of whether automatic refresh is enabled or not. +#define MENU_UPD_DELAY_NOUPDATE -1 //Auto refresh is disabled for the item. The refresh button may be used to manually refresh the item. +#define MENU_UPD_DELAY_GENREFRESH 0 //The item will be refreshed every MENU_GENERAL_UPDATE_DELAY frames, regardless of whether automatic refresh is enabled or not. typedef struct { short int mode; + /// Device priority when it comes to locating art assets for apps. Higher value = lower priority. (< 0) means no support for art assets. + char appsPriority; + char enabled; unsigned char flags; @@ -96,6 +102,9 @@ typedef struct /// item description in localised form (used if value is not negative) int textId; + /// Path to applications storage on the device (set to NULL if not applicable). + char *appsPath; + void (*itemInit)(void); /** @return 1 if update is needed, 0 otherwise */ @@ -126,6 +135,8 @@ typedef struct void (*itemCleanUp)(int exception); + void (*itemShutdown)(void); + int (*itemCheckVMC)(char *name, int createSize); int iconId; diff --git a/include/lang.h b/include/lang.h index eb8b91e6b..f63df69c2 100644 --- a/include/lang.h +++ b/include/lang.h @@ -266,6 +266,7 @@ enum _STR_IDS { _STR_SFX_VOLUME, _STR_BOOT_SND_VOLUME, _STR_CFM_VMODE_CHG, + _STR_CACHE_GAME_LIST, //START of OPL_DB tweaks _STR_ELM, _STR_ELMMODE, diff --git a/include/opl.h b/include/opl.h index f1c8ad9e7..1576d8511 100644 --- a/include/opl.h +++ b/include/opl.h @@ -41,6 +41,12 @@ //#define OPL_IS_DEV_BUILD 1 //Define if this build is a development build. //END of OPL_DB tweaks +#ifdef OPL_IS_DEV_BUILD +#define OPL_FOLDER "CFG-DEV" +#else +#define OPL_FOLDER "CFG" +#endif + //Master password for disabling the parental lock. #define OPL_PARENTAL_LOCK_MASTER_PASS "989765" @@ -57,7 +63,12 @@ #define OPL_COMPAT_UPDATE_STAT_CONN_ERROR -2 #define OPL_COMPAT_UPDATE_STAT_ABORTED -3 -#define OPL_VMODE_CHANGE_CONFIRMATION_TIMEOUT_MS 5000 +#define OPL_VMODE_CHANGE_CONFIRMATION_TIMEOUT_MS 10000 + +int oplPath2Mode(const char *path); +char *oplGetModeText(int mode); +int oplGetAppImage(char *folder, int isRelative, char *value, char *suffix, GSTEXTURE *resultTex, short psm); +int oplScanApps(int (*callback)(const char *path, config_set_t *appConfig, void *arg), void *arg); void setErrorMessage(int strId); void setErrorMessageWithCode(int strId, int error); @@ -67,7 +78,7 @@ void applyConfig(int themeID, int langID); void menuDeferredUpdate(void *data); void moduleUpdateMenu(int mode, int themeChanged); void handleHdlSrv(); -void deinit(); +void deinit(int exception, int modeSelected); char *gBaseMCDir; @@ -120,6 +131,7 @@ int gXOff; int gYOff; int gOverscan; int gSelectButton; +int gGameListCache; int gEnableSFX; int gEnableBootSND; diff --git a/include/supportbase.h b/include/supportbase.h index 826fc0980..d5442de7a 100644 --- a/include/supportbase.h +++ b/include/supportbase.h @@ -3,8 +3,11 @@ #define UL_GAME_NAME_MAX 32 #define ISO_GAME_NAME_MAX 64 +#define ISO_GAME_EXTENSION_MAX 4 #define GAME_STARTUP_MAX 12 +#define ISO_GAME_FNAME_MAX (ISO_GAME_NAME_MAX+ISO_GAME_EXTENSION_MAX) + enum GAME_FORMAT { GAME_FORMAT_USBLD = 0, GAME_FORMAT_OLD_ISO, @@ -15,22 +18,22 @@ typedef struct { char name[ISO_GAME_NAME_MAX + 1]; // MUST be the higher value from UL / ISO char startup[GAME_STARTUP_MAX + 1]; - char extension[5]; - unsigned char parts; - unsigned char media; - unsigned short format; - int sizeMB; + char extension[ISO_GAME_EXTENSION_MAX + 1]; + u8 parts; + u8 media; + u8 format; + u32 sizeMB; } base_game_info_t; typedef struct { - unsigned char name[UL_GAME_NAME_MAX]; - unsigned char startup[15]; - unsigned char parts; - unsigned char media; //Disc type - unsigned char unknown[4]; - unsigned char Byte08; //Always 0x08 - unsigned char unknown2[10]; + char name[UL_GAME_NAME_MAX]; + char startup[15]; + u8 parts; + u8 media; //Disc type + u8 unknown[4]; + u8 Byte08; //Always 0x08 + u8 unknown2[10]; } USBExtreme_game_entry_t; int sbIsSameSize(const char *prefix, int prevSize); diff --git a/include/system.h b/include/system.h index 0a180ba9e..8498520d2 100644 --- a/include/system.h +++ b/include/system.h @@ -12,12 +12,15 @@ int sysGetDiscID(char *discID); void sysInitDev9(void); void sysShutdownDev9(void); void sysReset(int modload_mask); -void sysExecExit(); +void sysExecExit(void); void sysPowerOff(void); +#ifdef __DECI2_DEBUG +int sysInitDECI2(void); +#endif -void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx, int EnablePS2Logo, unsigned int compatflags); +void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx, int EnablePS2Logo, unsigned int compatflags); -int sysExecElf(char *path); +int sysExecElf(const char *path); //START of OPL_DB tweaks int sysExecElfWithParam(char *path,char *param); //END of OPL_DB tweaks diff --git a/include/util.h b/include/util.h index 322c8ddb2..55023d759 100644 --- a/include/util.h +++ b/include/util.h @@ -44,6 +44,7 @@ enum CONSOLE_REGIONS { int InitConsoleRegionData(void); const char *GetSystemDataPath(void); char GetSystemFolderLetter(void); +int sysDeleteFolder(const char *folder); int CheckPS2Logo(int fd, u32 lba); diff --git a/modules/debug/deci2.img b/modules/debug/deci2.img new file mode 100755 index 0000000000000000000000000000000000000000..4944cf8b3796e43ee01f4b12d18d77bafc79ef65 GIT binary patch literal 73625 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 literal 0 HcmV?d00001 diff --git a/modules/debug/drvtif-ingame.irx b/modules/debug/drvtif-ingame.irx new file mode 100755 index 0000000000000000000000000000000000000000..ff82a2d62dd4eb1d79eb64f943463cdb89a87688 GIT binary patch literal 5985 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 @@ -51,6 +60,7 @@ void appInit(void) appForceUpdate = 1; configGetInt(configGetByType(CONFIG_OPL), "app_frames_delay", &appItemList.delay); configApps = configGetByType(CONFIG_APPS); + appsList = NULL; appItemList.enabled = 1; } @@ -62,13 +72,121 @@ item_list_t *appGetObject(int initOnly) } static int appNeedsUpdate(void) +{ // Always allow the user & auto refresh to refresh the apps list. + return 1; +} + +static int addAppsLegacyList(struct app_info_linked **appsLinkedList) { - if (appForceUpdate) { - appForceUpdate = 0; + struct config_value_t *cur; + struct app_info_linked *app; + int count; + + configClear(configApps); + configRead(configApps); + + count = 0; + cur = configApps->head; + while (cur != NULL) + { + if (*appsLinkedList == NULL) + { + *appsLinkedList = malloc(sizeof(struct app_info_linked)); + app = *appsLinkedList; + app->next = NULL; + } + else + { + app = malloc(sizeof(struct app_info_linked)); + if (app != NULL) { + app->next = *appsLinkedList; + *appsLinkedList = app; + } + } + + if (app == NULL) + { + LOG("APPSUPPORT unable to allocate memory.\n"); + break; + } + + strncpy(app->app.title, cur->key, APP_TITLE_MAX + 1); + app->app.title[APP_TITLE_MAX] = '\0'; + + //Split the boot filename from the path. + const char *elfname = appGetELFName(cur->val); + if (elfname != cur->val) { + strncpy(app->app.boot, elfname, APP_BOOT_MAX + 1); + app->app.boot[APP_BOOT_MAX] = '\0'; + + int pathlen = (int)(elfname - cur->val) - 1; + if (cur->val[pathlen] == ':') //Discard only '/'. + pathlen++; + if (pathlen > APP_PATH_MAX) + pathlen = APP_PATH_MAX; + strncpy(app->app.path, cur->val, pathlen); + app->app.path[pathlen] = '\0'; + } else { + //Cannot split boot filename from the path, somehow. + strncpy(app->app.boot, cur->val, APP_BOOT_MAX + 1); + app->app.boot[APP_BOOT_MAX] = '\0'; + strncpy(app->app.path, cur->val, APP_PATH_MAX + 1); + app->app.path[APP_BOOT_MAX] = '\0'; + } + + app->app.legacy = 1; + count++; + cur = cur->next; + } + + return count; +} + +static int appScanCallback(const char *path, config_set_t *appConfig, void *arg) +{ + struct app_info_linked **appsLinkedList = (struct app_info_linked **)arg; + struct app_info_linked *app; + const char *title, *boot; + + if (configGetStr(appConfig, APP_CONFIG_TITLE, &title) != 0 + && configGetStr(appConfig, APP_CONFIG_BOOT, &boot) != 0) + { + if (*appsLinkedList == NULL) + { + *appsLinkedList = malloc(sizeof(struct app_info_linked)); + app = *appsLinkedList; + app->next = NULL; + } + else + { + app = malloc(sizeof(struct app_info_linked)); + if (app != NULL) + { + app->next = *appsLinkedList; + *appsLinkedList = app; + } + } + + if (app == NULL) + { + LOG("APPSUPPORT unable to allocate memory.\n"); + return -1; + } + + strncpy(app->app.title, title, APP_TITLE_MAX+1); + app->app.title[APP_TITLE_MAX] = '\0'; + strncpy(app->app.boot, boot, APP_BOOT_MAX+1); + app->app.boot[APP_BOOT_MAX] = '\0'; + strncpy(app->app.path, path, APP_PATH_MAX+1); + app->app.path[APP_PATH_MAX] = '\0'; + app->app.legacy = 0; + return 0; + } else { + LOG("APPSUPPORT item has no boot/title.\n"); return 1; } - return 0; + return -1; } //START of OPL_DB tweaks @@ -119,16 +237,59 @@ static int appUpdateItemList(void) { //Count apps //END of OPL_DB tweaks - if (configApps->head) { - struct config_value_t *cur = configApps->head; - while (cur) { - cur = cur->next; - appItemCount++; + +static int appUpdateItemList(void) +{ + struct app_info_linked *appsLinkedList, *appNext; + int i; + + appFreeList(); + + appsLinkedList = NULL; + + //Get legacy apps list first, so it is possible to use appGetConfigValue(id). + appItemCount += addAppsLegacyList(&appsLinkedList); + + //Scan devices for apps. + appItemCount += oplScanApps(&appScanCallback, &appsLinkedList); + + // Generate apps list + if (appItemCount > 0) + { + appsList = malloc(appItemCount * sizeof(app_info_t)); + + if (appsList != NULL) + { + for (i = 0; appsLinkedList != NULL; i++) + { //appsLinkedList contains items in reverse order. + memcpy(&appsList[appItemCount - i - 1], &appsLinkedList->app, sizeof(app_info_t)); + + appNext = appsLinkedList->next; + free(appsLinkedList); + appsLinkedList = appNext; + } + } + else + { + LOG("APPSUPPORT unable to allocate memory.\n"); + appItemCount = 0; } } + + LOG("APPSUPPORT %d apps loaded\n", appItemCount); + return appItemCount; } +static void appFreeList(void) +{ + if (appsList != NULL) + { + appsList = NULL; + appItemCount = 0; + } +} + static int appGetItemCount(void) { return appItemCount; @@ -136,60 +297,100 @@ static int appGetItemCount(void) static char *appGetItemName(int id) { - struct config_value_t *cur = appGetConfigValue(id); - return cur->key; + return appsList[id].title; } static int appGetItemNameLength(int id) { - return 32; + return CONFIG_KEY_NAME_LEN; } static char *appGetItemStartup(int id) { - struct config_value_t *cur = appGetConfigValue(id); - return appGetELFName(cur->val); + if (appsList[id].legacy) + { + struct config_value_t *cur = appGetConfigValue(id); + return cur->val; + } else { + int mode; + + mode = oplPath2Mode(appsList[id].path); + if (mode < 0) { + LOG("APPSUPPORT: cannot find mode for path: %s\n", filename); + return ""; + } + + return oplGetModeText(mode); + } } static void appDeleteItem(int id) { - struct config_value_t *cur = appGetConfigValue(id); - fileXioRemove(cur->val); - cur->key[0] = '\0'; - configApps->modified = 1; - configWrite(configApps); + if (appsList[id].legacy) + { + struct config_value_t *cur = appGetConfigValue(id); + fileXioRemove(cur->val); + cur->key[0] = '\0'; + configApps->modified = 1; + configWrite(configApps); + } else { + sysDeleteFolder(appsList[id].path); + } appForceUpdate = 1; } static void appRenameItem(int id, char *newName) { - struct config_value_t *cur = appGetConfigValue(id); - char value[256]; - strncpy(value, cur->val, sizeof(value)); - configRemoveKey(configApps, cur->key); - configSetStr(configApps, newName, value); - configWrite(configApps); + + if (appsList[id].legacy) + { + struct config_value_t *cur = appGetConfigValue(id); + + strncpy(value, cur->val, sizeof(value)); + configRemoveKey(configApps, cur->key); + configSetStr(configApps, newName, value); + configWrite(configApps); + } else { + config_set_t *appConfig; + + snprintf(value, sizeof(value), "%s/%s", appsList[id].path, APP_TITLE_CONFIG_FILE); + + appConfig = configAlloc(0, NULL, value); + if (appConfig != NULL) + { + configRead(appConfig); + configSetStr(appConfig, APP_CONFIG_TITLE, newName); + configWrite(appConfig); + + configFree(appConfig); + } + } appForceUpdate = 1; } static void appLaunchItem(int id, config_set_t *configSet) { - struct config_value_t *cur = appGetConfigValue(id); - int fd = fileXioOpen(cur->val, O_RDONLY, 0666); + int mode, fd; + const char *filename; + + //Retrieve configuration set by appGetConfig() + configGetStr(configSet, CONFIG_ITEM_STARTUP, &filename); + + fd = fileXioOpen(filename, O_RDONLY); if (fd >= 0) { fileXioClose(fd); - int exception = NO_EXCEPTION; - if (strncmp(cur->val, "pfs0:", 5) == 0) - exception = UNMOUNT_EXCEPTION; + //To keep the necessary device accessible, we will assume the mode that owns the device which contains the file to boot. + mode = oplPath2Mode(filename); + if (mode < 0) { + mode = APP_MODE; + LOG("APPSUPPORT warning: cannot find mode for path: %s\n", filename); + } - char filename[256]; - strncpy(filename, cur->val, sizeof(filename) - 1); - filename[sizeof(filename) - 1] = '\0'; - deinit(exception); // CAREFUL: deinit will call appCleanUp, so configApps/cur will be freed + deinit(UNMOUNT_EXCEPTION, mode); // CAREFUL: deinit will call appCleanUp, so configApps/cur will be freed sysExecElf(filename); } else guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL); @@ -253,13 +454,26 @@ static config_set_t* appGetConfig(int id) { } //END of OPL_DB tweaks - configSetStr(config, CONFIG_ITEM_NAME, appGetELFName(cur->val)); - configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); - configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); -//START of OPL_DB tweaks - configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); - configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); -//END of OPL_DB tweaks + +static config_set_t *appGetConfig(int id) +{ + config_set_t *config = configAlloc(0, NULL, NULL); + if (appsList[id].legacy) { + struct config_value_t *cur = appGetConfigValue(id); + configSetStr(config, CONFIG_ITEM_NAME, appGetELFName(cur->val)); + configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); + configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); + //START of OPL_DB tweaks + configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); + configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); + //END of OPL_DB tweaks + } else { + char path[256]; + configSetStr(config, CONFIG_ITEM_NAME, appsList[id].boot); + configSetStr(config, CONFIG_ITEM_LONGNAME, appsList[id].title); + snprintf(path, sizeof(path), "%s/%s", appsList[id].path, appsList[id].boot); + configSetStr(config, CONFIG_ITEM_STARTUP, path); + } return config; } @@ -269,32 +483,31 @@ static int appGetImage(char *folder, int isRelative, char *value, char *suffix, //value = appGetELFName(value); // Search every device from fastest to slowest (HDD > ETH > USB) //END of OPL_DB tweaks - static item_list_t *listSupport = NULL; - if ((listSupport = hddGetObject(1))) { - if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) - return 0; - } - - if ((listSupport = ethGetObject(1))) { - if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) - return 0; - } - - if ((listSupport = usbGetObject(1))) - return listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm); - - return -1; + return oplGetAppImage(folder, isRelative, appGetELFName(value), suffix, resultTex, psm); } +//This may be called, even if appInit() was not. static void appCleanUp(int exception) { if (appItemList.enabled) { LOG("APPSUPPORT CleanUp\n"); + + appFreeList(); + } +} + +//This may be called, even if appInit() was not. +static void appShutdown(void) +{ + if (appItemList.enabled) { + LOG("APPSUPPORT Shutdown\n"); + + appFreeList(); } } static item_list_t appItemList = { - APP_MODE, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, APP_MODE_UPDATE_DELAY, "Applications", _STR_APPS, &appInit, &appNeedsUpdate, &appUpdateItemList, + APP_MODE, -1, 0, MODE_FLAG_NO_COMPAT | MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, APP_MODE_UPDATE_DELAY, "Applications", _STR_APPS, NULL, &appInit, &appNeedsUpdate, &appUpdateItemList, &appGetItemCount, NULL, &appGetItemName, &appGetItemNameLength, &appGetItemStartup, &appDeleteItem, &appRenameItem, &appLaunchItem, - &appGetConfig, &appGetImage, &appCleanUp, NULL, APP_ICON + &appGetConfig, &appGetImage, &appCleanUp, &appShutdown, NULL, APP_ICON }; diff --git a/src/config.c b/src/config.c index 0c4422015..ee420c0ed 100644 --- a/src/config.c +++ b/src/config.c @@ -16,7 +16,7 @@ static const char *configFilenames[CONFIG_INDEX_COUNT] = { "conf_opl.cfg", "conf_last.cfg", "conf_apps.cfg", - "conf_network", + "conf_network.cfg", }; static int strToColor(const char *string, unsigned char *color) diff --git a/src/debug.c b/src/debug.c index 850f77c30..40211d9fa 100644 --- a/src/debug.c +++ b/src/debug.c @@ -10,6 +10,7 @@ #include "include/ioman.h" #include "include/extern_irx.h" +static u8 modulesLoaded = 0; int debugSetActive(void) { @@ -19,6 +20,15 @@ int debugSetActive(void) if ((ret = ethLoadInitModules()) != 0) return -1; +#ifdef __DECI2_DEBUG + ret = sysLoadModuleBuffer(&drvtif_irx, size_drvtif_irx, 0, NULL); + if (ret < 0) + return -8; + + ret = sysLoadModuleBuffer(&tifinet_irx, size_tifinet_irx, 0, NULL); + if (ret < 0) + return -9; +#else ret = sysLoadModuleBuffer(&udptty_irx, size_udptty_irx, 0, NULL); if (ret < 0) return -8; @@ -31,6 +41,18 @@ int debugSetActive(void) if (ret < 0) return -10; #endif +#endif + + modulesLoaded = 1; return 0; } + +void debugApplyConfig(void) +{ +#ifndef _DTL_T10000 + if (modulesLoaded) + ethApplyConfig(); +#endif +} + diff --git a/src/dialogs.c b/src/dialogs.c index 2ed8dbec7..c7cd3199c 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -259,6 +259,11 @@ struct UIItem diaConfig[] = { {UI_BOOL, CFG_PS2LOGO, 1, 1, _STR_HINT_PS2LOGO, 0, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_CACHE_GAME_LIST}}}, + {UI_SPACER}, + {UI_BOOL, CFG_GAMELISTCACHE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, + {UI_BREAK}, + {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_EXITTO}}}, {UI_SPACER}, {UI_STRING, CFG_EXITTO, 1, 1, _STR_HINT_EXITPATH, 0, 0, {.stringvalue = {"", "", NULL}}}, diff --git a/src/ethsupport.c b/src/ethsupport.c index a002504a2..5e39ba28e 100644 --- a/src/ethsupport.c +++ b/src/ethsupport.c @@ -31,8 +31,12 @@ static struct ip4_addr lastGW; // forward declaration static item_list_t ethGameList; -static int ethReadNetConfig(void); +static int ethWaitValidNetIFLinkState(void); +static int ethWaitValidDHCPState(void); static int ethGetNetIFLinkStatus(void); +static int ethApplyNetIFConfig(void); +static int ethApplyIPConfig(void); +static int ethReadNetConfig(void); static int ethInitSemaID = -1; @@ -189,12 +193,12 @@ static int WaitValidNetState(int (*checkingFunction)(void)) return 0; } -int ethWaitValidNetIFLinkState(void) +static int ethWaitValidNetIFLinkState(void) { return WaitValidNetState(ðGetNetIFLinkStatus); } -int ethWaitValidDHCPState(void) +static int ethWaitValidDHCPState(void) { return WaitValidNetState(ðGetDHCPStatus); } @@ -227,6 +231,17 @@ static int ethInitApplyConfig(void) return 0; } +int ethApplyConfig(void) +{ + int ret; + + WaitSema(ethInitSemaID); + ret = ethInitApplyConfig(); + SignalSema(ethInitSemaID); + + return ret; +} + static void ethInitSMB(void) { int ret; @@ -655,7 +670,7 @@ static void ethLaunchGame(int id, config_set_t *configSet) sprintf(partname, "%s%s.00", ethPrefix, settings->filename); break; default: //Raw ISO9660 disc image; one part. - sprintf(partname, "%s%s\\%s", ethPrefix, game->media == 0x12 ? "CD" : "DVD", settings->filename); + sprintf(partname, "%s%s\\%s", ethPrefix, game->media == SCECdPS2CD ? "CD" : "DVD", settings->filename); } if (gPS2Logo) { @@ -688,12 +703,9 @@ static void ethLaunchGame(int id, config_set_t *configSet) } settings->common.layer1_start = layer1_start; - // disconnect from the active SMB session - ethSMBDisconnect(); - if (configGetStrCopy(configSet, CONFIG_ITEM_ALTSTARTUP, filename, sizeof(filename)) == 0) strcpy(filename, game->startup); - deinit(NO_EXCEPTION); // CAREFUL: deinit will call ethCleanUp, so ethGames/game will be freed + deinit(NO_EXCEPTION, ETH_MODE); // CAREFUL: deinit will call ethCleanUp, so ethGames/game will be freed sysLaunchLoaderElf(filename, "ETH_MODE", size_smb_cdvdman_irx, &smb_cdvdman_irx, size_mcemu_irx, &smb_mcemu_irx, EnablePS2Logo, compatmask); } @@ -713,15 +725,40 @@ static int ethGetImage(char *folder, int isRelative, char *value, char *suffix, return texDiscoverLoad(resultTex, path, -1, psm); } +//This may be called, even if ethInit() was not. static void ethCleanUp(int exception) { if (ethGameList.enabled) { LOG("ETHSUPPORT CleanUp\n"); free(ethGames); + + // disconnect from the active SMB session + ethSMBDisconnect(); + } + + //UI may have initialized modules outside of ETH mode, so deinitialize regardless of the enabled status. + ethDeinitModules(); +} + +//This may be called, even if ethInit() was not. +static void ethShutdown(void) +{ + if (ethGameList.enabled) { + LOG("ETHSUPPORT Shutdown\n"); + + free(ethGames); + + // disconnect from the active SMB session + ethSMBDisconnect(); } + //UI may have initialized modules outside of ETH mode, so deinitialize regardless of the enabled status. ethDeinitModules(); + + //Only shut down dev9 from here, if it was initialized from here before. + if (ethModulesLoaded) + sysShutdownDev9(); } static int ethCheckVMC(char *name, int createSize) @@ -730,9 +767,9 @@ static int ethCheckVMC(char *name, int createSize) } static item_list_t ethGameList = { - ETH_MODE, 0, 0, MENU_MIN_INACTIVE_FRAMES, ETH_MODE_UPDATE_DELAY, "ETH Games", _STR_NET_GAMES, ðInit, ðNeedsUpdate, + ETH_MODE, 1, 0, 0, MENU_MIN_INACTIVE_FRAMES, ETH_MODE_UPDATE_DELAY, "ETH Games", _STR_NET_GAMES, "smb0:/APPS", ðInit, ðNeedsUpdate, ðUpdateGameList, ðGetGameCount, ðGetGame, ðGetGameName, ðGetGameNameLength, ðGetGameStartup, ðDeleteGame, ðRenameGame, - ðLaunchGame, ðGetConfig, ðGetImage, ðCleanUp, ðCheckVMC, ETH_ICON + ðLaunchGame, ðGetConfig, ðGetImage, ðCleanUp, ðShutdown, ðCheckVMC, ETH_ICON }; static int ethReadNetConfig(void) @@ -777,7 +814,7 @@ int ethGetNetConfig(u8 *ip_address, u8 *netmask, u8 *gateway) return result; } -int ethApplyNetIFConfig(void) +static int ethApplyNetIFConfig(void) { int mode, result; static int CurrentMode = NETMAN_NETIF_ETH_LINK_MODE_AUTO; @@ -813,7 +850,7 @@ static int ethGetNetIFLinkStatus(void) return (NetManIoctl(NETMAN_NETIF_IOCTL_GET_LINK_STATUS, NULL, 0, NULL, 0) == NETMAN_NETIF_ETH_LINK_STATE_UP); } -int ethApplyIPConfig(void) +static int ethApplyIPConfig(void) { t_ip_info ip_info; struct ip4_addr ipaddr, netmask, gw, dns; diff --git a/src/gui.c b/src/gui.c index 8a2f98469..528b7f544 100644 --- a/src/gui.c +++ b/src/gui.c @@ -388,6 +388,7 @@ void guiShowConfig() diaSetInt(diaConfig, CFG_DEBUG, gDisableDebug); diaSetInt(diaConfig, CFG_PS2LOGO, gPS2Logo); + diaSetInt(diaConfig, CFG_GAMELISTCACHE, gGameListCache); diaSetString(diaConfig, CFG_EXITTO, gExitPath); diaSetInt(diaConfig, CFG_ENWRITEOP, gEnableWrite); diaSetInt(diaConfig, CFG_HDDSPINDOWN, gHDDSpindown); @@ -413,6 +414,7 @@ void guiShowConfig() if (ret) { diaGetInt(diaConfig, CFG_DEBUG, &gDisableDebug); diaGetInt(diaConfig, CFG_PS2LOGO, &gPS2Logo); + diaGetInt(diaConfig, CFG_GAMELISTCACHE, &gGameListCache); diaGetString(diaConfig, CFG_EXITTO, gExitPath, sizeof(gExitPath)); diaGetInt(diaConfig, CFG_ENWRITEOP, &gEnableWrite); diaGetInt(diaConfig, CFG_HDDSPINDOWN, &gHDDSpindown); diff --git a/src/hdd.c b/src/hdd.c index 3620a6acb..753e70817 100644 --- a/src/hdd.c +++ b/src/hdd.c @@ -67,7 +67,7 @@ int hddSetTransferMode(int type, int mode) } //------------------------------------------------------------------------- -int hddSetIdleTimeout(int timeout) +void hddSetIdleTimeout(int timeout) { // From hdparm man: // A value of zero means "timeouts are disabled": the @@ -81,11 +81,16 @@ int hddSetIdleTimeout(int timeout) // 21 minutes plus 15 seconds. Note that some older drives may // have very different interpretations of these values. - u8 args[16]; + u8 standbytimer = (u8)timeout; - *(u32 *)&args[0] = timeout & 0xff; + fileXioDevctl("hdd0:", HDIOC_IDLE, &standbytimer, 1, NULL, 0); + fileXioDevctl("hdd1:", HDIOC_IDLE, &standbytimer, 1, NULL, 0); +} - return fileXioDevctl("hdd0:", HDIOC_IDLE, args, 4, NULL, 0); +void hddSetIdleImmediate(void) +{ + fileXioDevctl("hdd0:", HDIOC_IDLEIMM, NULL, 0, NULL, 0); + fileXioDevctl("hdd1:", HDIOC_IDLEIMM, NULL, 0, NULL, 0); } //------------------------------------------------------------------------- @@ -150,7 +155,7 @@ static int hddGetHDLGameInfo(struct GameDataEntry *game, hdl_game_info_t *ginfo) ginfo->dma_type = hdl_header->dma_type; ginfo->dma_mode = hdl_header->dma_mode; ginfo->layer_break = hdl_header->layer1_start; - ginfo->disctype = hdl_header->discType; + ginfo->disctype = (u8)hdl_header->discType; ginfo->start_sector = game->lba; ginfo->total_size_in_kb = game->size * 2; //size * 2048 / 1024 = 2x } else diff --git a/src/hddsupport.c b/src/hddsupport.c index dd6bf9fd2..a5e738011 100644 --- a/src/hddsupport.c +++ b/src/hddsupport.c @@ -17,7 +17,7 @@ #define OPL_HDD_MODE_PS2LOGO_OFFSET 0x17F8 -static unsigned char hddForceUpdate = 1; +static unsigned char hddForceUpdate = 0; static unsigned char hddHDProKitDetected = 0; static unsigned char hddModulesLoaded = 0; @@ -35,6 +35,9 @@ char* hddGetPrefix(void){ } //END of OPL_DB tweaks +static int hddLoadGameListCache(hdl_games_list_t *cache); +static int hddUpdateGameListCache(hdl_games_list_t *cache, hdl_games_list_t *game_list); + static void hddInitModules(void) { @@ -192,7 +195,7 @@ void hddLoadModules(void) void hddInit(void) { LOG("HDDSUPPORT Init\n"); - hddForceUpdate = 1; + hddForceUpdate = 0; //Use cache at initial startup. configGetInt(configGetByType(CONFIG_OPL), "hdd_frames_delay", &hddGameList.delay); ioPutRequest(IO_CUSTOM_SIMPLEACTION, &hddInitModules); hddGameList.enabled = 1; @@ -206,18 +209,32 @@ item_list_t *hddGetObject(int initOnly) } static int hddNeedsUpdate(void) -{ - if (hddForceUpdate) { - hddForceUpdate = 0; - return 1; - } - - return 0; +{ /* Auto refresh is disabled by setting HDD_MODE_UPDATE_DELAY to MENU_UPD_DELAY_NOUPDATE, within hddsupport.h. + Hence any update request would be issued by the user, which should be taken as an explicit request to re-scan the HDD. */ + return 1; } static int hddUpdateGameList(void) { - return (hddGetHDLGamelist(&hddGames) == 0 ? hddGames.count : 0); + hdl_games_list_t hddGamesNew; + int ret; + + if (((ret = hddLoadGameListCache(&hddGames)) != 0) || (hddForceUpdate)) + { + hddGamesNew.count = 0; + hddGamesNew.games = NULL; + ret = hddGetHDLGamelist(&hddGamesNew); + if (ret == 0) + { + hddUpdateGameListCache(&hddGames, &hddGamesNew); + hddFreeHDLGamelist(&hddGames); + hddGames = hddGamesNew; + } + } + + hddForceUpdate = 1; //Subsequent refresh operations will cause the HDD to be scanned. + + return (ret == 0 ? hddGames.count : 0); } static int hddGetGameCount(void) @@ -404,7 +421,7 @@ static void hddLaunchGame(int id, config_set_t *configSet) if (gPS2Logo) EnablePS2Logo = CheckPS2Logo(0, game->start_sector + OPL_HDD_MODE_PS2LOGO_OFFSET); - deinit(NO_EXCEPTION); // CAREFUL: deinit will call hddCleanUp, so hddGames/game will be freed + deinit(NO_EXCEPTION, HDD_MODE); // CAREFUL: deinit will call hddCleanUp, so hddGames/game will be freed sysLaunchLoaderElf(filename, "HDD_MODE", size_irx, irx, size_mcemu_irx, &hdd_mcemu_irx, EnablePS2Logo, compatMode); } @@ -414,18 +431,14 @@ static config_set_t *hddGetConfig(int id) char path[256]; hdl_game_info_t *game = &hddGames.games[id]; -#ifdef OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddPrefix, game->startup); -#else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddPrefix, game->startup); -#endif + snprintf(path, sizeof(path), "%s"OPL_FOLDER"/%s.cfg", hddPrefix, game->startup); config_set_t *config = configAlloc(0, NULL, path); configRead(config); //Does not matter if the config file exists or not. configSetStr(config, CONFIG_ITEM_NAME, game->name); configSetInt(config, CONFIG_ITEM_SIZE, game->total_size_in_kb >> 10); configSetStr(config, CONFIG_ITEM_FORMAT, "HDL"); - configSetStr(config, CONFIG_ITEM_MEDIA, game->disctype == 0x12 ? "CD" : "DVD"); + configSetStr(config, CONFIG_ITEM_MEDIA, game->disctype == SCECdPS2CD ? "CD" : "DVD"); configSetStr(config, CONFIG_ITEM_STARTUP, game->startup); return config; @@ -441,6 +454,7 @@ static int hddGetImage(char *folder, int isRelative, char *value, char *suffix, return texDiscoverLoad(resultTex, path, -1, psm); } +//This may be called, even if hddInit() was not. static void hddCleanUp(int exception) { LOG("HDDSUPPORT CleanUp\n"); @@ -450,11 +464,14 @@ static void hddCleanUp(int exception) if ((exception & UNMOUNT_EXCEPTION) == 0) fileXioUmount(hddPrefix); + } + //UI may have loaded modules outside of HDD mode, so deinitialize regardless of the enabled status. + if (hddModulesLoaded) { fileXioDevctl("pfs:", PDIOC_CLOSEALL, NULL, 0, NULL, 0); - } - hddModulesLoaded = 0; + hddModulesLoaded = 0; + } } static int hddCheckVMC(char *name, int createSize) @@ -462,8 +479,148 @@ static int hddCheckVMC(char *name, int createSize) return sysCheckVMC(hddPrefix, "/", name, createSize, NULL); } +//This may be called, even if hddInit() was not. +static void hddShutdown(void) +{ + LOG("HDDSUPPORT Shutdown\n"); + + if (hddGameList.enabled) { + hddFreeHDLGamelist(&hddGames); + fileXioUmount(hddPrefix); + } + + //UI may have loaded modules outside of HDD mode, so deinitialize regardless of the enabled status. + if (hddModulesLoaded) { + /* Close all files */ + fileXioDevctl("pfs:", PDIOC_CLOSEALL, NULL, 0, NULL, 0); + + //DEV9 will remain active if ETH is in use, so put the HDD in IDLE state. + //The HDD should still enter standby state after 21 minutes & 15 seconds, as per the ATAD defaults. + hddSetIdleImmediate(); + + //Only shut down dev9 from here, if it was initialized from here before. + sysShutdownDev9(); + + hddModulesLoaded = 0; + } +} + +static int hddLoadGameListCache(hdl_games_list_t *cache) +{ + char filename[256]; + FILE *file; + hdl_game_info_t *games; + int result, size, count; + + if (!gGameListCache) + return 1; + + hddFreeHDLGamelist(cache); + + sprintf(filename, "%s/games.bin", hddPrefix); + file = fopen(filename, "rb"); + if (file != NULL) + { + fseek(file, 0, SEEK_END); + size = ftell(file); + rewind(file); + + count = size / sizeof(hdl_game_info_t); + if (count > 0) + { + games = memalign(64, count * sizeof(hdl_game_info_t)); + if (games != NULL) + { + if (fread(games, sizeof(hdl_game_info_t), count, file) == count) + { + cache->count = count; + cache->games = games; + LOG("hddLoadGameListCache: %d games loaded.\n", count); + result = 0; + } else { + LOG("hddLoadGameListCache: I/O error.\n"); + free(games); + result = EIO; + } + } else { + LOG("hddLoadGameListCache: failed to allocate memory.\n"); + result = ENOMEM; + } + } else { + result = -1; //Empty file + } + + fclose(file); + } else { + result = ENOENT; + } + + return result; +} + +static int hddUpdateGameListCache(hdl_games_list_t *cache, hdl_games_list_t *game_list) +{ + char filename[256]; + FILE *file; + int result, i, j, modified; + + if (!gGameListCache) + return 1; + + if (cache->count > 0) + { + modified = 0; + for(i = 0; i < cache->count; i++) + { + for (j = 0; j < game_list->count; j++) + { + if (strncmp(cache->games[i].partition_name, game_list->games[j].partition_name, APA_IDMAX+1) == 0) + break; + } + + if (j == game_list->count) + { + LOG("hddUpdateGameListCache: game added.\n"); + modified = 1; + break; + } + } + + if ((!modified) && (game_list->count != cache->count)) + { + LOG("hddUpdateGameListCache: game removed.\n"); + modified = 1; + } + } else { + modified = (game_list->count > 0) ? 1 : 0; + } + + if (!modified) + return 0; + LOG("hddUpdateGameListCache: caching new game list.\n"); + + sprintf(filename, "%s/games.bin", hddPrefix); + if (game_list->count > 0) + { + file = fopen(filename, "wb"); + if (file != NULL) + { + result = (fwrite(game_list->games, sizeof(hdl_game_info_t), game_list->count, file) == game_list->count) ? 0 : EIO; + fclose(file); + } else { + result = EIO; + } + } else { + //Last game deleted. + remove(filename); + result = 0; + } + + return result; +} + static item_list_t hddGameList = { - HDD_MODE, 0, MODE_FLAG_COMPAT_DMA, MENU_MIN_INACTIVE_FRAMES, HDD_MODE_UPDATE_DELAY, "HDD Games", _STR_HDD_GAMES, &hddInit, &hddNeedsUpdate, &hddUpdateGameList, + HDD_MODE, 0, 0, MODE_FLAG_COMPAT_DMA, MENU_MIN_INACTIVE_FRAMES, HDD_MODE_UPDATE_DELAY, "HDD Games", _STR_HDD_GAMES, "pfs0:/APPS", &hddInit, &hddNeedsUpdate, &hddUpdateGameList, &hddGetGameCount, &hddGetGame, &hddGetGameName, &hddGetGameNameLength, &hddGetGameStartup, &hddDeleteGame, &hddRenameGame, - &hddLaunchGame, &hddGetConfig, &hddGetImage, &hddCleanUp, &hddCheckVMC, HDD_ICON + &hddLaunchGame, &hddGetConfig, &hddGetImage, &hddCleanUp, &hddShutdown, &hddCheckVMC, HDD_ICON }; diff --git a/src/ioman.c b/src/ioman.c index 0a7a48e80..5de714128 100644 --- a/src/ioman.c +++ b/src/ioman.c @@ -232,9 +232,8 @@ int ioPutRequest(int type, void *data) SignalSema(gEndSemaId); - // Worker thread cannot wake itself up, but it will find the new request before sleeping. - if (GetThreadId() != gIOThreadId) - WakeupThread(gIOThreadId); + // Worker thread cannot wake itself up (WakeupThread will return an error), but it will find the new request before sleeping. + WakeupThread(gIOThreadId); return IO_OK; } diff --git a/src/lang.c b/src/lang.c index 56846bdb7..c55d688f4 100644 --- a/src/lang.c +++ b/src/lang.c @@ -278,6 +278,7 @@ static char *internalEnglish[LANG_STR_COUNT] = { "Sound Effects Volume", "Boot Sound Volume", "Confirm video mode change?", + "Cache Game List", //START of OPL_DB tweaks "PS1 Games", "PS1 Games display mode", diff --git a/src/opl.c b/src/opl.c index d1a5acf1f..712f37203 100644 --- a/src/opl.c +++ b/src/opl.c @@ -39,6 +39,10 @@ #include #include +#ifdef PADEMU +#include +#include +#endif #ifdef __EESIO_DEBUG #include @@ -63,8 +67,6 @@ #endif #endif -static void RefreshAllLists(void); - typedef struct { item_list_t *support; @@ -104,7 +106,7 @@ static void clearIOModuleT(opl_io_module_t *mod) // forward decl static void clearMenuGameList(opl_io_module_t *mdl); -static void moduleCleanup(opl_io_module_t *mod, int exception); +static void moduleCleanup(opl_io_module_t *mod, int exception, int modeSelected); static void reset(void); static void deferredAudioInit(void); @@ -168,6 +170,7 @@ static void itemExecSelect(struct menu_item *curMenu) } else { support->itemInit(); moduleUpdateMenu(support->mode, 0); + // Manual refreshing can only be done if either auto refresh is disabled or auto refresh is disabled for the item. if (!gAutoRefresh || (support->updateDelay == MENU_UPD_DELAY_NOUPDATE)) ioPutRequest(IO_MENU_UPDATE_DEFFERED, &support->mode); } @@ -195,10 +198,7 @@ static void itemExecCancel(struct menu_item *curMenu) strncpy(newName, curMenu->current->item.text, nameLength); if (guiShowKeyboard(newName, nameLength)) { support->itemRename(curMenu->current->item.id, newName); - if (gAutoRefresh) - RefreshAllLists(); - else - ioPutRequest(IO_MENU_UPDATE_DEFFERED, &support->mode); + ioPutRequest(IO_MENU_UPDATE_DEFFERED, &support->mode); } } } @@ -249,10 +249,7 @@ static void itemExecSquare(struct menu_item *curMenu) if (menuCheckParentalLock() == 0) { if (guiMsgBox(_l(_STR_DELETE_WARNING), 1, NULL)) { support->itemDelete(curMenu->current->item.id); - if (gAutoRefresh) - RefreshAllLists(); - else - ioPutRequest(IO_MENU_UPDATE_DEFFERED, &support->mode); + ioPutRequest(IO_MENU_UPDATE_DEFFERED, &support->mode); } } } @@ -340,10 +337,7 @@ static void initSupport(item_list_t *itemList, int startMode, int mode, int forc mod->support->itemInit(); moduleUpdateMenu(mode, 0); - if (gAutoRefresh) - RefreshAllLists(); - else - ioPutRequest(IO_MENU_UPDATE_DEFFERED, &mod->support->mode); // can't use mode as the variable will die at end of execution + ioPutRequest(IO_MENU_UPDATE_DEFFERED, &mod->support->mode); // can't use mode as the variable will die at end of execution } } } @@ -354,22 +348,126 @@ static void initAllSupport(int force_reinit) initSupport(ethGetObject(0), gETHStartMode, ETH_MODE, force_reinit || (gNetworkStartup >= ERROR_ETH_SMB_CONN)); initSupport(hddGetObject(0), gHDDStartMode, HDD_MODE, force_reinit); initSupport(appGetObject(0), gAPPStartMode, APP_MODE, force_reinit); -//START of OPL_DB tweaks + //START of OPL_DB tweaks initSupport(elmGetObject(0), gELMStartMode, ELM_MODE, force_reinit); -//END of OPL_DB tweaks + //END of OPL_DB tweaks } -static void deinitAllSupport(int exception) +static void deinitAllSupport(int exception, int modeSelected) { - moduleCleanup(&list_support[USB_MODE], exception); - moduleCleanup(&list_support[ETH_MODE], exception); - moduleCleanup(&list_support[HDD_MODE], exception); - moduleCleanup(&list_support[APP_MODE], exception); -//START of OPL_DB tweaks - moduleCleanup(&list_support[ELM_MODE], exception); -//END of OPL_DB tweaks + moduleCleanup(&list_support[USB_MODE], exception, modeSelected); + moduleCleanup(&list_support[ETH_MODE], exception, modeSelected); + moduleCleanup(&list_support[HDD_MODE], exception, modeSelected); + moduleCleanup(&list_support[APP_MODE], exception, modeSelected); + //START of OPL_DB tweaks + moduleCleanup(&list_support[ELM_MODE], exception, modeSelected); + //END of OPL_DB tweaks +} + +char *oplGetModeText(int mode) +{ + return(list_support[mode].support->textId == -1 ? list_support[mode].support->text : _l(list_support[mode].support->textId)); +} + +//For resolving the mode, given an app's path +int oplPath2Mode(const char *path) +{ + const char *blkdevnameend; + int i, blkdevnamelen; + item_list_t *listSupport; + + for (i = 0; i < MODE_COUNT; i++) + { + listSupport = list_support[i].support; + if ((listSupport != NULL) && (listSupport->appsPath != NULL)) + { + blkdevnameend = strchr(listSupport->appsPath, ':'); + if (blkdevnameend != NULL) + { + blkdevnamelen = (int)(blkdevnameend - listSupport->appsPath) + 1; + + if (strncmp(path, listSupport->appsPath, blkdevnamelen) == 0) + return listSupport->mode; + } + } + } + + return -1; +} + +int oplGetAppImage(char *folder, int isRelative, char *value, char *suffix, GSTEXTURE *resultTex, short psm) +{ + int i, remaining; + char priority; + item_list_t *listSupport; - ethDeinitModules(); //Deinitialize here if the UI used network support without SMB. + // We search on ever devices from fatest to slowest (HDD > ETH > USB) + for (remaining = MODE_COUNT,priority = 0; remaining > 0 && priority < 4; priority++) + { + for (i = 0; i < MODE_COUNT; i++) + { + listSupport = list_support[i].support; + + if (listSupport->appsPriority == priority) + { + if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) + return 0; + remaining--; + } + } + } + + return -1; +} + +int oplScanApps(int (*callback)(const char *path, config_set_t *appConfig, void *arg), void *arg) +{ + iox_dirent_t dirent; + int i, fd, count, ret; + item_list_t *listSupport; + config_set_t *appConfig; + char dir[128]; + char path[128]; + + count = 0; + for (i = 0; i < MODE_COUNT; i++) + { + listSupport = list_support[i].support; + if ((listSupport != NULL) && (listSupport->appsPath != NULL) && (listSupport->enabled)) + { + if ((fd = fileXioDopen(listSupport->appsPath)) > 0) + { + while (fileXioDread(fd, &dirent) > 0) + { + if (strcmp(dirent.name, ".") == 0 || strcmp(dirent.name, "..") == 0 || (!FIO_S_ISDIR(dirent.stat.mode))) + continue; + + snprintf(dir, sizeof(dir), "%s/%s", listSupport->appsPath, dirent.name); + snprintf(path, sizeof(path), "%s/%s", dir, APP_TITLE_CONFIG_FILE); + appConfig = configAlloc(0, NULL, path); + if (appConfig != NULL) + { + configRead(appConfig); + + ret = callback(dir, appConfig, arg); + configFree(appConfig); + + if (ret == 0) + count++; + else if (ret < 0) + { //Stopped because of unrecoverable error. + break; + } + } + } + + fileXioDclose(fd); + } else + LOG("APPS failed to open dir %s\n", listSupport->appsPath); + } + } + + return count; } // ---------------------------------------------------------- @@ -433,19 +531,6 @@ void menuDeferredUpdate(void *data) } } -static void RefreshAllLists(void) -{ - int i; - - // schedule updates of all the list handlers - for (i = 0; i < MODE_COUNT; i++) { - if (list_support[i].support && list_support[i].support->enabled) - ioPutRequest(IO_MENU_UPDATE_DEFFERED, &list_support[i].support->mode); - } - - frameCounter = 0; -} - #define MENU_GENERAL_UPDATE_DELAY 60 static void menuUpdateHook() @@ -631,6 +716,7 @@ static void _loadConfig() configGetInt(configOPL, CONFIG_OPL_DISABLE_DEBUG, &gDisableDebug); configGetInt(configOPL, CONFIG_OPL_PS2LOGO, &gPS2Logo); + configGetInt(configOPL, CONFIG_OPL_GAME_LIST_CACHE, &gGameListCache); configGetStrCopy(configOPL, CONFIG_OPL_EXIT_PATH, gExitPath, sizeof(gExitPath)); configGetInt(configOPL, CONFIG_OPL_AUTO_SORT, &gAutosort); configGetInt(configOPL, CONFIG_OPL_AUTO_REFRESH, &gAutoRefresh); @@ -646,9 +732,9 @@ static void _loadConfig() configGetInt(configOPL, CONFIG_OPL_HDD_MODE, &gHDDStartMode); configGetInt(configOPL, CONFIG_OPL_ETH_MODE, &gETHStartMode); configGetInt(configOPL, CONFIG_OPL_APP_MODE, &gAPPStartMode); -//START of OPL_DB tweaks + //START of OPL_DB tweaks configGetInt(configOPL, CONFIG_OPL_ELM_MODE, &gELMStartMode); -//END of OPL_DB tweaks + //END of OPL_DB tweaks configGetInt(configOPL, CONFIG_OPL_SFX, &gEnableSFX); configGetInt(configOPL, CONFIG_OPL_BOOT_SND, &gEnableBootSND); configGetInt(configOPL, CONFIG_OPL_SFX_VOLUME, &gSFXVolume); @@ -785,6 +871,7 @@ static void _saveConfig() configSetInt(configOPL, CONFIG_OPL_OVERSCAN, gOverscan); configSetInt(configOPL, CONFIG_OPL_DISABLE_DEBUG, gDisableDebug); configSetInt(configOPL, CONFIG_OPL_PS2LOGO, gPS2Logo); + configSetInt(configOPL, CONFIG_OPL_GAME_LIST_CACHE, gGameListCache); configSetStr(configOPL, CONFIG_OPL_EXIT_PATH, gExitPath); configSetInt(configOPL, CONFIG_OPL_AUTO_SORT, gAutosort); configSetInt(configOPL, CONFIG_OPL_AUTO_REFRESH, gAutoRefresh); @@ -800,9 +887,9 @@ static void _saveConfig() configSetInt(configOPL, CONFIG_OPL_HDD_MODE, gHDDStartMode); configSetInt(configOPL, CONFIG_OPL_ETH_MODE, gETHStartMode); configSetInt(configOPL, CONFIG_OPL_APP_MODE, gAPPStartMode); -//START of OPL_DB tweaks + //START of OPL_DB tweaks configSetInt(configOPL, CONFIG_OPL_ELM_MODE, gELMStartMode); -//END of OPL_DB tweaks + //END of OPL_DB tweaks configSetInt(configOPL, CONFIG_OPL_SFX, gEnableSFX); configSetInt(configOPL, CONFIG_OPL_BOOT_SND, gEnableBootSND); configSetInt(configOPL, CONFIG_OPL_SFX_VOLUME, gSFXVolume); @@ -873,9 +960,13 @@ void applyConfig(int themeID, int langID) moduleUpdateMenu(ETH_MODE, changed); moduleUpdateMenu(HDD_MODE, changed); moduleUpdateMenu(APP_MODE, changed); -//START of OPL_DB tweaks + //START of OPL_DB tweaks moduleUpdateMenu(ELM_MODE, changed); -//END of OPL_DB tweaks + //END of OPL_DB tweaks + +#ifdef __DEBUG + debugApplyConfig(); +#endif } int loadConfig(int types) @@ -1179,7 +1270,8 @@ static int loadHdldSvr(void) ioBlockOps(1); guiExecDeferredOps(); - deinitAllSupport(NO_EXCEPTION); + //Deinitialize all support without shutting down the HDD unit. + deinitAllSupport(NO_EXCEPTION, IO_MODE_SELECTED_ALL); clearErrorMessage(); /* At this point, an error might have been displayed (since background tasks were completed). Clear it, otherwise it will get displayed after the server is closed. */ @@ -1264,22 +1356,38 @@ static void reset(void) #endif } -static void moduleCleanup(opl_io_module_t *mod, int exception) +static void moduleCleanup(opl_io_module_t *mod, int exception, int modeSelected) { if (!mod->support) return; - if (mod->support->itemCleanUp) - mod->support->itemCleanUp(exception); + //Shutdown if not required anymore. + if ((mod->support->mode != modeSelected) && (modeSelected != IO_MODE_SELECTED_ALL)) + { + if (mod->support->itemShutdown) + mod->support->itemShutdown(); + } else { + if (mod->support->itemCleanUp) + mod->support->itemCleanUp(exception); + } clearMenuGameList(mod); } -void deinit(int exception) +void deinit(int exception, int modeSelected) { + if (gEnableSFX) { + gEnableSFX = 0; + } + audsrv_quit(); + +#ifdef PADEMU + ds34usb_reset(); + ds34bt_reset(); +#endif unloadPads(); - deinitAllSupport(exception); + deinitAllSupport(exception, modeSelected); ioEnd(); guiEnd(); @@ -1296,9 +1404,9 @@ static void setDefaults(void) clearIOModuleT(&list_support[ETH_MODE]); clearIOModuleT(&list_support[HDD_MODE]); clearIOModuleT(&list_support[APP_MODE]); -//START of OPL_DB tweaks + //START of OPL_DB tweaks clearIOModuleT(&list_support[ELM_MODE]); -//END of OPL_DB tweaks + //END of OPL_DB tweaks gBaseMCDir = "mc?:OPL"; @@ -1339,6 +1447,7 @@ static void setDefaults(void) gAutoRefresh = 0; gDisableDebug = 1; gPS2Logo = 0; + gGameListCache = 0; gEnableWrite = 0; gRememberLastPlayed = 0; gAutoStartLastPlayed = 9; @@ -1358,7 +1467,7 @@ static void setDefaults(void) gHDDStartMode = START_MODE_DISABLED; gETHStartMode = START_MODE_DISABLED; gAPPStartMode = START_MODE_DISABLED; -//START of OPL_DB tweaks + //START of OPL_DB tweaks gELMStartMode = START_MODE_DISABLED; gDefaultBgColor[0] = 0x000; @@ -1376,7 +1485,7 @@ static void setDefaults(void) gDefaultUITextColor[0] = 0x032; gDefaultUITextColor[1] = 0x0ff; gDefaultUITextColor[2] = 0x030; -//END of OPL_DB tweaks + //END of OPL_DB tweaks frameCounter = 0; @@ -1469,6 +1578,10 @@ static void deferredAudioInit(void) // --------------------- Main -------------------- int main(int argc, char *argv[]) { +#ifdef __DECI2_DEBUG + sysInitDECI2(); +#endif + LOG_INIT(); PREINIT_LOG("OPL GUI start!\n"); diff --git a/src/supportbase.c b/src/supportbase.c index 5f678f174..b8532dcc8 100644 --- a/src/supportbase.c +++ b/src/supportbase.c @@ -19,6 +19,11 @@ struct game_list_t struct game_list_t *next; }; +struct game_cache_list { + unsigned int count; + base_game_info_t *games; +}; + int sbIsSameSize(const char *prefix, int prevSize) { int size = -1; @@ -74,7 +79,7 @@ static inline int GetStartupExecName(const char *path, char *filename, int maxle fseek(file, 0, SEEK_END); size = ftell(file); rewind(file); - if ((SystemCNF = malloc(size + 1)) != NULL) { + if ((SystemCNF = memalign(64, size + 1)) != NULL) { fread(SystemCNF, 1, size, file); fclose(file); SystemCNF[size] = '\0'; @@ -87,7 +92,7 @@ static inline int GetStartupExecName(const char *path, char *filename, int maxle free(SystemCNF); if (NextLine != NULL && strcmp(strtok(NextLine, "\t ="), "BOOT2") == 0) { - if ((p = strtok(NULL, " =")) != NULL && strncmp(p, "cdrom0:\\", 8) == 0) { + if ((p = strtok(NULL, "\t =")) != NULL && strncmp(p, "cdrom0:\\", 8) == 0) { strncpy(filename, p + 8, maxlength); /* Skip the device name part of the path ("cdrom0:\"). */ filename[maxlength] = '\0'; LOG("Startup EXEC path: %s\n", filename); @@ -109,12 +114,193 @@ static inline int GetStartupExecName(const char *path, char *filename, int maxle return result; } +static void freeISOGameListCache(struct game_cache_list *cache); + +static int loadISOGameListCache(const char *path, struct game_cache_list *cache) +{ + char filename[256]; + FILE *file; + base_game_info_t *games; + int result, size, count; + + if (!gGameListCache) + return 1; + + freeISOGameListCache(cache); + + sprintf(filename, "%s/games.bin", path); + file = fopen(filename, "rb"); + if (file != NULL) + { + fseek(file, 0, SEEK_END); + size = ftell(file); + rewind(file); + + count = size / sizeof(base_game_info_t); + if (count > 0) + { + games = memalign(64, count * sizeof(base_game_info_t)); + if (games != NULL) + { + if (fread(games, sizeof(base_game_info_t), count, file) == count) + { + LOG("loadISOGameListCache: %d games loaded.\n", count); + cache->count = count; + cache->games = games; + result = 0; + } else { + LOG("loadISOGameListCache: I/O error.\n"); + free(games); + result = EIO; + } + } else { + LOG("loadISOGameListCache: failed to allocate memory.\n"); + result = ENOMEM; + } + } else { + result = -1; //Empty file (should not happen) + } + + fclose(file); + } else { + result = ENOENT; + } + + return result; +} + +static void freeISOGameListCache(struct game_cache_list *cache) +{ + if (cache->games != NULL) + { + free(cache->games); + cache->games = NULL; + cache->count = 0; + } +} + +static int updateISOGameList(const char *path, const struct game_cache_list *cache, const struct game_list_t *head, int count) +{ + char filename[256]; + FILE *file; + const struct game_list_t *game; + int result, i, j, modified; + base_game_info_t *list; + + if (!gGameListCache) + return 1; + + modified = 0; + if (cache != NULL) + { + if ((head != NULL) && (count > 0)) + { + game = head; + + for (i = 0; i < count; i++) + { + for (j = 0; j < cache->count; j++) + { + if (strncmp(cache->games[i].name, game->gameinfo.name, ISO_GAME_NAME_MAX+1) == 0 + && strncmp(cache->games[i].extension, game->gameinfo.extension, ISO_GAME_EXTENSION_MAX+1) == 0) + break; + } + + if (j == cache->count) + { + LOG("updateISOGameList: game added.\n"); + modified = 1; + break; + } + + game = game->next; + } + + if ((!modified) && (count != cache->count)) + { + LOG("updateISOGameList: game removed.\n"); + modified = 1; + } + } else { + modified = 0; + } + } else { + modified = ((head != NULL) && (count > 0)) ? 1 : 0; + } + + if (!modified) + return 0; + LOG("updateISOGameList: caching new game list.\n"); + + result = 0; + sprintf(filename, "%s/games.bin", path); + if ((head != NULL) && (count > 0)) + { + list = (base_game_info_t *)memalign(64, sizeof(base_game_info_t) * count); + + if (list != NULL) { + // Convert the linked list into a flat array, for writing performance. + game = head; + for (i = 0; (i < count) && (game != NULL); i++, game = game->next) { + // copy one game, advance + memcpy(&list[i], &game->gameinfo, sizeof(base_game_info_t)); + } + + file = fopen(filename, "wb"); + if (file != NULL) + { + result = fwrite(list, sizeof(base_game_info_t), count, file) == count ? 0 : EIO; + + fclose(file); + + if (result != 0) + remove(filename); + } else + result = EIO; + + free(list); + } else + result = ENOMEM; + } else { + //Last game deleted. + remove(filename); + } + + return result; +} + +//Queries for the game entry, based on filename. Only the new filename format is supported (filename.ext). +static int queryISOGameListCache(const struct game_cache_list *cache, base_game_info_t *ginfo, const char *filename) +{ + char isoname[ISO_GAME_FNAME_MAX+1]; + int i; + + for (i = 0; i < cache->count; i++) + { + snprintf(isoname, sizeof(isoname), "%s%s", cache->games[i].name, cache->games[i].extension); + + if (strcmp(filename, isoname) == 0) + { + memcpy(ginfo, &cache->games[i], sizeof(base_game_info_t)); + return 0; + } + } + + return ENOENT; +} + static int scanForISO(char *path, char type, struct game_list_t **glist) { - int fd, NameLen, count = 0, format, MountFD; + int fd, NameLen, count = 0, format, MountFD, cacheLoaded; + struct game_cache_list cache; + base_game_info_t cachedGInfo; char fullpath[256], startup[GAME_STARTUP_MAX]; iox_dirent_t record; + cache.games = NULL; + cache.count = 0; + cacheLoaded = loadISOGameListCache(path, &cache) == 0; + if ((fd = fileXioDopen(path)) > 0) { while (fileXioDread(fd, &record) > 0) { if ((format = isValidIsoName(record.name, &NameLen)) > 0) { @@ -143,37 +329,54 @@ static int scanForISO(char *path, char type, struct game_list_t **glist) break; } } else { - sprintf(fullpath, "%s/%s", path, record.name); - if ((MountFD = fileXioMount("iso:", fullpath, FIO_MT_RDONLY)) >= 0) { - if (GetStartupExecName("iso:/SYSTEM.CNF;1", startup, GAME_STARTUP_MAX - 1) == 0) { - struct game_list_t *next = (struct game_list_t *)malloc(sizeof(struct game_list_t)); - - if (next != NULL) { - next->next = *glist; - *glist = next; - - game = &(*glist)->gameinfo; - - strcpy(game->startup, startup); - strncpy(game->name, record.name, NameLen); - game->name[NameLen] = '\0'; - strncpy(game->extension, &record.name[NameLen], sizeof(game->extension)); - game->extension[sizeof(game->extension) - 1] = '\0'; + if(queryISOGameListCache(&cache, &cachedGInfo, record.name) != 0) { + sprintf(fullpath, "%s/%s", path, record.name); + + if ((MountFD = fileXioMount("iso:", fullpath, FIO_MT_RDONLY)) >= 0) { + if (GetStartupExecName("iso:/SYSTEM.CNF;1", startup, GAME_STARTUP_MAX - 1) == 0) { + struct game_list_t *next = (struct game_list_t *)malloc(sizeof(struct game_list_t)); + + if (next != NULL) { + next->next = *glist; + *glist = next; + + game = &(*glist)->gameinfo; + + strcpy(game->startup, startup); + strncpy(game->name, record.name, NameLen); + game->name[NameLen] = '\0'; + strncpy(game->extension, &record.name[NameLen], sizeof(game->extension)); + game->extension[sizeof(game->extension) - 1] = '\0'; + } else { + //Out of memory. + fileXioUmount("iso:"); + break; + } } else { - //Out of memory. + //Unable to parse SYSTEM.CNF. fileXioUmount("iso:"); - break; + continue; } - } else { - //Unable to parse SYSTEM.CNF. + fileXioUmount("iso:"); + } else { + //Unable to mount game. continue; } - - fileXioUmount("iso:"); } else { - //Unable to mount game. - continue; + //Entry was found in cache. + struct game_list_t *next = (struct game_list_t *)malloc(sizeof(struct game_list_t)); + + if (next != NULL) { + next->next = *glist; + *glist = next; + + game = &(*glist)->gameinfo; + memcpy(game, &cachedGInfo, sizeof(base_game_info_t)); + } else { + //Out of memory. + break; + } } } @@ -190,6 +393,14 @@ static int scanForISO(char *path, char type, struct game_list_t **glist) count = fd; } + if (cacheLoaded) + { + updateISOGameList(path, &cache, *glist, count); + freeISOGameListCache(&cache); + } else { + updateISOGameList(path, NULL, *glist, count); + } + return count; } @@ -209,11 +420,11 @@ int sbReadList(base_game_info_t **list, const char *prefix, int *fsize, int *gam // count iso games in "cd" directory snprintf(path, sizeof(path), "%sCD", prefix); - count = scanForISO(path, 0x12, &dlist_head); + count = scanForISO(path, SCECdPS2CD, &dlist_head); // count iso games in "dvd" directory snprintf(path, sizeof(path), "%sDVD", prefix); - if ((result = scanForISO(path, 0x14, &dlist_head)) >= 0) { + if ((result = scanForISO(path, SCECdPS2DVD, &dlist_head)) >= 0) { count = count < 0 ? result : count + result; } @@ -298,7 +509,7 @@ int sbProbeISO9660(const char *path, base_game_info_t *game, u32 layer1_offset) char buffer[6]; result = -1; - if (game->media == 0x14) { //Only DVDs can have multiple layers. + if (game->media == SCECdPS2DVD) { //Only DVDs can have multiple layers. if ((file = fopen(path, "rb")) != NULL) { if (fseek(file, layer1_offset * 2048, SEEK_SET) == 0) { if ((fread(buffer, 1, sizeof(buffer), file) == sizeof(buffer)) && @@ -319,7 +530,7 @@ int sbProbeISO9660_64(const char *path, base_game_info_t *game, u32 layer1_offse char buffer[6]; result = -1; - if (game->media == 0x14) { //Only DVDs can have multiple layers. + if (game->media == SCECdPS2DVD) { //Only DVDs can have multiple layers. if ((fd = fileXioOpen(path, O_RDONLY, 0666)) >= 0) { if (fileXioLseek64(fd, (u64)layer1_offset * 2048, SEEK_SET) == (u64)layer1_offset * 2048) { if ((fileXioRead(fd, buffer, sizeof(buffer)) == sizeof(buffer)) && @@ -454,12 +665,12 @@ void sbDelete(base_game_info_t **list, const char *prefix, const char *sep, int if (game->format != GAME_FORMAT_USBLD) { if (game->format != GAME_FORMAT_OLD_ISO) { - if (game->media == 0x12) + if (game->media == SCECdPS2CD) snprintf(path, sizeof(path), "%sCD%s%s.%s%s", prefix, sep, game->startup, game->name, game->extension); else snprintf(path, sizeof(path), "%sDVD%s%s.%s%s", prefix, sep, game->startup, game->name, game->extension); } else { - if (game->media == 0x12) + if (game->media == SCECdPS2CD) snprintf(path, sizeof(path), "%sCD%s%s%s", prefix, sep, game->name, game->extension); else snprintf(path, sizeof(path), "%sDVD%s%s%s", prefix, sep, game->name, game->extension); @@ -485,7 +696,7 @@ void sbRename(base_game_info_t **list, const char *prefix, const char *sep, int if (game->format != GAME_FORMAT_USBLD) { if (game->format == GAME_FORMAT_OLD_ISO) { - if (game->media == 0x12) { + if (game->media == SCECdPS2CD) { snprintf(oldpath, sizeof(oldpath), "%sCD%s%s.%s%s", prefix, sep, game->startup, game->name, game->extension); snprintf(newpath, sizeof(newpath), "%sCD%s%s.%s%s", prefix, sep, game->startup, newname, game->extension); } else { @@ -493,7 +704,7 @@ void sbRename(base_game_info_t **list, const char *prefix, const char *sep, int snprintf(newpath, sizeof(newpath), "%sDVD%s%s.%s%s", prefix, sep, game->startup, newname, game->extension); } } else { - if (game->media == 0x12) { + if (game->media == SCECdPS2CD) { snprintf(oldpath, sizeof(oldpath), "%sCD%s%s%s", prefix, sep, game->name, game->extension); snprintf(newpath, sizeof(newpath), "%sCD%s%s%s", prefix, sep, newname, game->extension); } else { @@ -523,11 +734,7 @@ void sbRename(base_game_info_t **list, const char *prefix, const char *sep, int config_set_t *sbPopulateConfig(base_game_info_t *game, const char *prefix, const char *sep) { char path[256]; -#if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV%s%s.cfg", prefix, sep, game->startup); -#else - snprintf(path, sizeof(path), "%sCFG%s%s.cfg", prefix, sep, game->startup); -#endif + snprintf(path, sizeof(path), "%s"OPL_FOLDER"%s%s.cfg", prefix, sep, game->startup); config_set_t *config = configAlloc(0, NULL, path); configRead(config); //Does not matter if the config file could be loaded or not. @@ -536,44 +743,33 @@ config_set_t *sbPopulateConfig(base_game_info_t *game, const char *prefix, const configSetInt(config, CONFIG_ITEM_SIZE, game->sizeMB); configSetStr(config, CONFIG_ITEM_FORMAT, game->format != GAME_FORMAT_USBLD ? "ISO" : "UL"); - configSetStr(config, CONFIG_ITEM_MEDIA, game->media == 0x12 ? "CD" : "DVD"); + configSetStr(config, CONFIG_ITEM_MEDIA, game->media == SCECdPS2CD ? "CD" : "DVD"); configSetStr(config, CONFIG_ITEM_STARTUP, game->startup); return config; } -void sbCreateFolders(const char *path, int createDiscImgFolders) +static void sbCreateFoldersFromList(const char *path, const char **folders) { - // update Themes + int i; char fullpath[256]; -#if OPL_IS_DEV_BUILD - sprintf(fullpath, "%sCFG-DEV", path); -#else - sprintf(fullpath, "%sCFG", path); -#endif - fileXioMkdir(fullpath, 0777); - - sprintf(fullpath, "%sTHM", path); - fileXioMkdir(fullpath, 0777); - - sprintf(fullpath, "%sART", path); - fileXioMkdir(fullpath, 0777); - - if (createDiscImgFolders) { - sprintf(fullpath, "%sCD", path); - fileXioMkdir(fullpath, 0777); - - sprintf(fullpath, "%sDVD", path); + for (i = 0; folders[i] != NULL; i++) { + sprintf(fullpath, "%s%s", path, folders[i]); fileXioMkdir(fullpath, 0777); } +} + +void sbCreateFolders(const char *path, int createDiscImgFolders) +{ + const char *basicFolders[] = { OPL_FOLDER, "THM", "ART", "VMC", "CHT", "APPS", NULL }; + const char *discImgFolders[] = { "CD", "DVD", NULL }; - sprintf(fullpath, "%sVMC", path); - fileXioMkdir(fullpath, 0777); + sbCreateFoldersFromList(path, basicFolders); - sprintf(fullpath, "%sCHT", path); - fileXioMkdir(fullpath, 0777); + if (createDiscImgFolders) + sbCreateFoldersFromList(path, discImgFolders); } int sbLoadCheats(const char *path, const char *file) diff --git a/src/system.c b/src/system.c index f93940310..13f033236 100644 --- a/src/system.c +++ b/src/system.c @@ -4,6 +4,10 @@ Review OpenUsbLd README & LICENSE files for further details. */ +#ifdef __DECI2_DEBUG +#include +#endif + #include "include/opl.h" #include "include/gui.h" #include "include/ethsupport.h" @@ -123,7 +127,7 @@ int sysLoadModuleBuffer(void *buffer, int size, int argc, char *argv) #define OPL_SIF_CMD_BUFF_SIZE 1 static SifCmdHandlerData_t OplSifCmdbuffer[OPL_SIF_CMD_BUFF_SIZE]; -static unsigned char dev9Initialized = 0, dev9Loaded = 0; +static unsigned char dev9Initialized = 0, dev9Loaded = 0, dev9InitCount = 0; void sysInitDev9(void) { @@ -134,6 +138,25 @@ void sysInitDev9(void) dev9Loaded = (ret == 0); //DEV9.IRX must have successfully loaded and returned RESIDENT END. dev9Initialized = 1; } + + dev9InitCount++; +} + +void sysShutdownDev9(void) +{ + if (dev9InitCount > 0) + { + --dev9InitCount; + + if (dev9InitCount == 0) + { /* Switch off DEV9 once nothing needs it. */ + if (dev9Loaded) + { + while (fileXioDevctl("dev9x:", DDIOC_OFF, NULL, 0, NULL, 0) < 0) { + }; + } + } + } } void sysReset(int modload_mask) @@ -152,9 +175,14 @@ void sysReset(int modload_mask) #ifdef _DTL_T10000 while (!SifIopReset("rom0:UDNL", 0)) ; +#else +#ifdef __DECI2_DEBUG + while (!SifIopRebootBuffer(&deci2_img, size_deci2_img)) + ; #else while (!SifIopReset("", 0)) ; +#endif #endif dev9Initialized = 0; @@ -235,25 +263,7 @@ void sysReset(int modload_mask) void sysPowerOff(void) { - int i; - - deinit(NO_EXCEPTION); - if (dev9Loaded) - { - /* Close all files */ - fileXioDevctl("pfs:", PDIOC_CLOSEALL, NULL, 0, NULL, 0); - /* Switch off DEV9 */ - while (fileXioDevctl("dev9x:", DDIOC_OFF, NULL, 0, NULL, 0) < 0) { - }; - } - - // As required by some (typically 2.5") HDDs, issue the SCSI STOP UNIT command to avoid causing an emergency park. - for (i = 0; i < MAX_USB_DEVICES; i++) { - char device[7]; - sprintf(device, "mass%d:", i); - fileXioDevctl(device, USBMASS_DEVCTL_STOP_UNIT, NULL, 0, NULL, 0); - } - + deinit(NO_EXCEPTION, IO_MODE_SELECTED_NONE); poweroffShutdown(); } @@ -334,18 +344,14 @@ int sysGetDiscID(char *hexDiscID) return 1; } -void sysExecExit() +void sysExecExit(void) { -#ifdef PADEMU - ds34usb_reset(); - ds34bt_reset(); -#endif if (gEnableSFX) { //wait 70ms for confirm sound to finish playing before exit guiDelay(0070); - gEnableSFX = 0; } - audsrv_quit(); + //Deinitialize without shutting down active devices. + deinit(NO_EXCEPTION, IO_MODE_SELECTED_ALL); Exit(0); } @@ -494,10 +500,10 @@ static unsigned int sendIrxKernelRAM(const char *startup, const char *mode_str, #ifdef __INGAME_DEBUG #ifdef __DECI2_DEBUG if (modules & CORE_IRX_DECI2) { - irxptr_tab[modcount].info = size_drvtif_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_DRVTIF); - irxptr_tab[modcount++].ptr = (void *)&drvtif_irx; - irxptr_tab[modcount].info = size_tifinet_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_TIFINET); - irxptr_tab[modcount++].ptr = (void *)&tifinet_irx; + irxptr_tab[modcount].info = size_drvtif_ingame_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_DRVTIF); + irxptr_tab[modcount++].ptr = (void *)&drvtif_ingame_irx; + irxptr_tab[modcount].info = size_tifinet_ingame_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_TIFINET); + irxptr_tab[modcount++].ptr = (void *)&tifinet_ingame_irx; } #else if (modules & CORE_IRX_DEBUG) { @@ -596,6 +602,21 @@ static int ResetDECI2(void) return result; } + +int sysInitDECI2(void) +{ + int result; + + DI(); + ee_kmode_enter(); + + result = ResetDECI2(); + + ee_kmode_exit(); + EI(); + + return result; +} #endif /* Returns the patch location of LoadExecPS2(), which resides in kernel memory. @@ -680,7 +701,7 @@ static int initKernel(void *eeload, void *modStorageEnd, void **eeloadCopy, void return((*eeloadCopy != NULL && *initUserMemory != NULL) ? 0 : -1); } -void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx, int EnablePS2Logo, unsigned int compatflags) +void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdvdman_irx, void **cdvdman_irx, int size_mcemu_irx, void **mcemu_irx, int EnablePS2Logo, unsigned int compatflags) { unsigned int modules, ModuleStorageSize; void *ModuleStorage, *ModuleStorageEnd; @@ -778,7 +799,7 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo argv[i] = ModStorageConfig; i++; - argv[i] = filename; + argv[i] = (char*)filename; i++; char cmask[10]; @@ -790,18 +811,7 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo argv[i] = gsm_config_str; i++; - strcpy(ElfPath, "cdrom0:\\"); - strncat(ElfPath, filename, 11); // fix for 8+3 filename. - strcat(ElfPath, ";1"); - -#ifdef PADEMU - ds34usb_reset(); - ds34bt_reset(); -#endif - if (gEnableSFX) { - gEnableSFX = 0; - } - audsrv_quit(); + snprintf(ElfPath, sizeof(ElfPath), "cdrom0:\\%s;1", filename); // Let's go. fileXioExit(); @@ -822,7 +832,7 @@ void sysLaunchLoaderElf(char *filename, char *mode_str, int size_cdvdman_irx, vo } } -int sysExecElf(char *path) +int sysExecElf(const char *path) { u8 *boot_elf = NULL; elf_header_t *eh; @@ -861,7 +871,7 @@ int sysExecElf(char *path) fileXioExit(); SifExitRpc(); - elf_argv[0] = path; + elf_argv[0] = (char*)path; FlushCache(0); FlushCache(2); diff --git a/src/usbsupport.c b/src/usbsupport.c index 4b7ab2958..5bf8437e2 100644 --- a/src/usbsupport.c +++ b/src/usbsupport.c @@ -301,10 +301,10 @@ static void usbLaunchGame(int id, config_set_t *configSet) for (i = 0; i < game->parts; i++) { switch (game->format) { case GAME_FORMAT_ISO: - sprintf(partname, "%s%s/%s%s", usbPrefix, (game->media == 0x12) ? "CD" : "DVD", game->name, game->extension); + sprintf(partname, "%s%s/%s%s", usbPrefix, (game->media == SCECdPS2CD) ? "CD" : "DVD", game->name, game->extension); break; case GAME_FORMAT_OLD_ISO: - sprintf(partname, "%s%s/%s.%s%s", usbPrefix, (game->media == 0x12) ? "CD" : "DVD", game->startup, game->name, game->extension); + sprintf(partname, "%s%s/%s.%s%s", usbPrefix, (game->media == SCECdPS2CD) ? "CD" : "DVD", game->startup, game->name, game->extension); break; default: //USBExtreme format. sprintf(partname, "%sul.%08X.%s.%02x", usbPrefix, USBA_crc32(game->name), game->startup, i); @@ -342,10 +342,10 @@ static void usbLaunchGame(int id, config_set_t *configSet) //Initialize layer 1 information. switch (game->format) { case GAME_FORMAT_ISO: - sprintf(partname, "%s%s/%s%s", usbPrefix, (game->media == 0x12) ? "CD" : "DVD", game->name, game->extension); + sprintf(partname, "%s%s/%s%s", usbPrefix, (game->media == SCECdPS2CD) ? "CD" : "DVD", game->name, game->extension); break; case GAME_FORMAT_OLD_ISO: - sprintf(partname, "%s%s/%s.%s%s", usbPrefix, (game->media == 0x12) ? "CD" : "DVD", game->startup, game->name, game->extension); + sprintf(partname, "%s%s/%s.%s%s", usbPrefix, (game->media == SCECdPS2CD) ? "CD" : "DVD", game->startup, game->name, game->extension); break; default: //USBExtreme format. sprintf(partname, "%sul.%08X.%s.00", usbPrefix, USBA_crc32(game->name), game->startup); @@ -390,7 +390,7 @@ static void usbLaunchGame(int id, config_set_t *configSet) if (configGetStrCopy(configSet, CONFIG_ITEM_ALTSTARTUP, filename, sizeof(filename)) == 0) strcpy(filename, game->startup); - deinit(NO_EXCEPTION); // CAREFUL: deinit will call usbCleanUp, so usbGames/game will be freed + deinit(NO_EXCEPTION, USB_MODE); // CAREFUL: deinit will call usbCleanUp, so usbGames/game will be freed sysLaunchLoaderElf(filename, "USB_MODE", irx_size, irx, size_mcemu_irx, &usb_mcemu_irx, EnablePS2Logo, compatmask); } @@ -410,6 +410,7 @@ static int usbGetImage(char *folder, int isRelative, char *value, char *suffix, return texDiscoverLoad(resultTex, path, -1, psm); } +//This may be called, even if usbInit() was not. static void usbCleanUp(int exception) { if (usbGameList.enabled) { @@ -419,13 +420,26 @@ static void usbCleanUp(int exception) } } +//This may be called, even if usbInit() was not. +static void usbShutdown(void) +{ + if (usbGameList.enabled) { + LOG("USBSUPPORT Shutdown\n"); + + free(usbGames); + } + + // As required by some (typically 2.5") HDDs, issue the SCSI STOP UNIT command to avoid causing an emergency park. + fileXioDevctl("mass:", USBMASS_DEVCTL_STOP_ALL, NULL, 0, NULL, 0); +} + static int usbCheckVMC(char *name, int createSize) { return sysCheckVMC(usbPrefix, "/", name, createSize, NULL); } static item_list_t usbGameList = { - USB_MODE, 0, 0, MENU_MIN_INACTIVE_FRAMES, USB_MODE_UPDATE_DELAY, "USB Games", _STR_USB_GAMES, &usbInit, &usbNeedsUpdate, + USB_MODE, 2, 0, 0, MENU_MIN_INACTIVE_FRAMES, USB_MODE_UPDATE_DELAY, "USB Games", _STR_USB_GAMES, "mass0:/APPS", &usbInit, &usbNeedsUpdate, &usbUpdateGameList, &usbGetGameCount, &usbGetGame, &usbGetGameName, &usbGetGameNameLength, &usbGetGameStartup, &usbDeleteGame, &usbRenameGame, - &usbLaunchGame, &usbGetConfig, &usbGetImage, &usbCleanUp, &usbCheckVMC, USB_ICON + &usbLaunchGame, &usbGetConfig, &usbGetImage, &usbCleanUp, &usbShutdown, &usbCheckVMC, USB_ICON }; diff --git a/src/util.c b/src/util.c index 4bbfa46ac..0bcaed17d 100644 --- a/src/util.c +++ b/src/util.c @@ -488,6 +488,86 @@ int CheckPS2Logo(int fd, u32 lba) return ValidPS2Logo; } +struct DirentToDelete { + struct DirentToDelete *next; + char *filename; +}; + +int sysDeleteFolder(const char *folder) +{ + int fd, result; + char *path; + iox_dirent_t dirent; + struct DirentToDelete *head, *start; + + result = 0; + start = head = NULL; + if((fd = fileXioDopen(folder)) >= 0) { + /* Generate a list of files in the directory. */ + while(fileXioDread(fd, &dirent) > 0) { + if((strcmp(dirent.name, ".") == 0) || ((strcmp(dirent.name, "..") == 0))) + continue; + + if(FIO_S_ISDIR(dirent.stat.mode)) { + if((path = malloc(strlen(folder)+strlen(dirent.name) + 2)) != NULL) { + sprintf(path, "%s/%s", folder, dirent.name); + result = sysDeleteFolder(path); + free(path); + } + } else { + if(start == NULL) { + head = malloc(sizeof(struct DirentToDelete)); + if(head == NULL) + break; + start = head; + } else { + if((head->next = malloc(sizeof(struct DirentToDelete))) == NULL) + break; + + head=head->next; + } + + head->next=NULL; + + if((head->filename = malloc(strlen(dirent.name) + 1)) != NULL) + strcpy(head->filename, dirent.name); + else + break; + } + } + + fileXioDclose(fd); + } else + result = fd; + + if (result >= 0) { + /* Delete the files. */ + for (head = start; head != NULL; head = start) { + if(head->filename != NULL) { + if((path = malloc(strlen(folder) + strlen(head->filename) + 2)) != NULL) { + sprintf(path, "%s/%s", folder, head->filename); + result=fileXioRemove(path); + if (result < 0) + LOG("sysDeleteFolder: failed to remove %s: %d\n", path, result); + + free(path); + } + free(head->filename); + } + + start = head->next; + free(head); + } + + if(result >= 0) { + result = fileXioRmdir(folder); + LOG("sysDeleteFolder: failed to rmdir %s: %d\n", folder, result); + } + } + + return result; +} + /*----------------------------------------------------------------------------------------*/ /* NOP delay. */ /*----------------------------------------------------------------------------------------*/ From 1c133cf3ed6404eb1088014644a9436036410cd9 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Sun, 13 Jan 2019 16:22:31 +0000 Subject: [PATCH 139/269] Fixes --- src/appsupport.c | 220 ++++++++++++++++++++++------------------------- src/elmsupport.c | 26 ++++-- 2 files changed, 123 insertions(+), 123 deletions(-) diff --git a/src/appsupport.c b/src/appsupport.c index 42c8fe302..c9b47d677 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -81,9 +81,46 @@ static int addAppsLegacyList(struct app_info_linked **appsLinkedList) struct config_value_t *cur; struct app_info_linked *app; int count; - + char path[256]; + static item_list_t *listSupport = NULL; + int ret=0; //Return from configRead + configClear(configApps); - configRead(configApps); + + //Try MC?:/OPL/conf_apps.cfg + snprintf(path, sizeof(path), "%s/conf_apps.cfg", gBaseMCDir); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + + //Try HDD + if ( ret == 0 && (listSupport = hddGetObject(1)) ) { + if (configApps != NULL){ + configFree(configApps); + } + snprintf(path, sizeof(path), "%sconf_apps.cfg", hddGetPrefix()); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + } + + //Try ETH + if ( ret == 0 && (listSupport = ethGetObject(1)) ) { + if (configApps != NULL){ + configFree(configApps); + } + snprintf(path, sizeof(path), "%sconf_apps.cfg", ethGetPrefix()); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + } + + //Try USB + if ( ret == 0 && (listSupport = usbGetObject(1)) ){ + if (configApps != NULL){ + configFree(configApps); + } + snprintf(path, sizeof(path), "%sconf_apps.cfg", usbGetPrefix()); + configApps = configAlloc(CONFIG_APPS, NULL, path); + ret = configRead(configApps); + } count = 0; cur = configApps->head; @@ -189,55 +226,6 @@ static int appScanCallback(const char *path, config_set_t *appConfig, void *arg) return -1; } -//START of OPL_DB tweaks -static int appUpdateItemList(void) { - char path[256]; - static item_list_t *listSupport = NULL; - int ret=0; //Return from configRead - appItemCount = 0; - - //Clear config if already exists - if (configApps != NULL) - configFree(configApps); - - //Try MC?:/OPL/conf_apps.cfg - snprintf(path, sizeof(path), "%s/conf_apps.cfg", gBaseMCDir); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - - //Try HDD - if ( ret == 0 && (listSupport = hddGetObject(1)) ) { - if (configApps != NULL){ - configFree(configApps); - } - snprintf(path, sizeof(path), "%sconf_apps.cfg", hddGetPrefix()); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - } - - //Try ETH - if ( ret == 0 && (listSupport = ethGetObject(1)) ) { - if (configApps != NULL){ - configFree(configApps); - } - snprintf(path, sizeof(path), "%sconf_apps.cfg", ethGetPrefix()); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - } - - //Try USB - if ( ret == 0 && (listSupport = usbGetObject(1)) ){ - if (configApps != NULL){ - configFree(configApps); - } - snprintf(path, sizeof(path), "%sconf_apps.cfg", usbGetPrefix()); - configApps = configAlloc(CONFIG_APPS, NULL, path); - ret = configRead(configApps); - } - - //Count apps - //END of OPL_DB tweaks - static int appUpdateItemList(void) { struct app_info_linked *appsLinkedList, *appNext; @@ -316,7 +304,7 @@ static char *appGetItemStartup(int id) mode = oplPath2Mode(appsList[id].path); if (mode < 0) { - LOG("APPSUPPORT: cannot find mode for path: %s\n", filename); + LOG("APPSUPPORT: cannot find mode for path: %s\n", appsList[id].path); return ""; } @@ -396,93 +384,91 @@ static void appLaunchItem(int id, config_set_t *configSet) guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL); } -//START of OPL_DB tweaks -static config_set_t* appGetConfig(int id) { - config_set_t* config = NULL; - static item_list_t *listSupport = NULL; - struct config_value_t *cur = appGetConfigValue(id); - int ret=0; - - //Search on HDD, SMB, USB for the CFG/GAME.ELF.CFG file. - //HDD - if ( (listSupport = hddGetObject(1)) ) { - char path[256]; - #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); - #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); - #endif - config = configAlloc(1, NULL, path); - ret = configRead(config); - } - - //ETH - if ( ret == 0 && (listSupport = ethGetObject(1)) ) { - char path[256]; - if (config != NULL) - configFree(config); - - #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), appGetELFName(cur->val)); - #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(),appGetELFName(cur->val)); - #endif - config = configAlloc(1, NULL, path); - ret = configRead(config); - } - - //USB - if ( ret == 0 && (listSupport = usbGetObject(1)) ){ - char path[256]; - if (config != NULL) - configFree(config); - - #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); - #else - snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); - #endif - config = configAlloc(1, NULL, path); - ret = configRead(config); - } - - if (ret == 0){ //No config found on previous devices, create one. - if (config != NULL) - configFree(config); - - config = configAlloc(1, NULL, NULL); - } - -//END of OPL_DB tweaks - static config_set_t *appGetConfig(int id) { - config_set_t *config = configAlloc(0, NULL, NULL); + config_set_t *config; + if (appsList[id].legacy) { struct config_value_t *cur = appGetConfigValue(id); + static item_list_t *listSupport = NULL; + //START of OPL_DB tweaks + int ret=0; + + //Search on HDD, SMB, USB for the CFG/GAME.ELF.CFG file. + //HDD + if ( (listSupport = hddGetObject(1)) ) { + char path[256]; + #if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); + #else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", hddGetPrefix(), appGetELFName(cur->val)); + #endif + config = configAlloc(0, NULL, path); + ret = configRead(config); + } + + //ETH + if ( ret == 0 && (listSupport = ethGetObject(1)) ) { + char path[256]; + if (config != NULL) + configFree(config); + + #if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", ethGetPrefix(), appGetELFName(cur->val)); + #else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", ethGetPrefix(),appGetELFName(cur->val)); + #endif + config = configAlloc(0, NULL, path); + ret = configRead(config); + } + + //USB + if ( ret == 0 && (listSupport = usbGetObject(1)) ){ + char path[256]; + if (config != NULL) + configFree(config); + + #if OPL_IS_DEV_BUILD + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); + #else + snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); + #endif + config = configAlloc(0, NULL, path); + ret = configRead(config); + } + + if (ret == 0){ //No config found on previous devices, create one. + if (config != NULL) + configFree(config); + + config = configAlloc(0, NULL, NULL); + } + //END of OPL_DB tweaks + config = configAlloc(0, NULL, NULL); configSetStr(config, CONFIG_ITEM_NAME, appGetELFName(cur->val)); configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); //START of OPL_DB tweaks configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); - configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); + configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); //END of OPL_DB tweaks } else { char path[256]; + config = configAlloc(0, NULL, NULL); configSetStr(config, CONFIG_ITEM_NAME, appsList[id].boot); configSetStr(config, CONFIG_ITEM_LONGNAME, appsList[id].title); snprintf(path, sizeof(path), "%s/%s", appsList[id].path, appsList[id].boot); configSetStr(config, CONFIG_ITEM_STARTUP, path); + //START of OPL_DB tweaks + configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); + configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); + //END of OPL_DB tweaks } return config; } static int appGetImage(char *folder, int isRelative, char *value, char *suffix, GSTEXTURE *resultTex, short psm) { -//START of OPL_DB tweaks - //value = appGetELFName(value); - // Search every device from fastest to slowest (HDD > ETH > USB) -//END of OPL_DB tweaks return oplGetAppImage(folder, isRelative, appGetELFName(value), suffix, resultTex, psm); } diff --git a/src/elmsupport.c b/src/elmsupport.c index b3eabd6d8..d9a2d3cab 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -526,9 +526,6 @@ static void elmLaunchItem(int id, config_set_t* configSet) { fileOnly++; - //char fileWithoutExt[256]; - //strncpy(fileWithoutExt,fileOnly,strlen(fileOnly) -4); - //fileWithoutExt[strlen(fileOnly) -4] = '\0'; fileOnly[strlen(fileOnly)-4] = '\0'; LOG("fileOnly= %s\n",fileOnly); @@ -538,7 +535,14 @@ static void elmLaunchItem(int id, config_set_t* configSet) { LOG("memPath = %s\n",memPath); LOG("params = %s\n",params); - deinit(); // CAREFUL: deinit will call elmCleanUp, so configElm/cur will be freed + //To keep the necessary device accessible, we will assume the mode that owns the device which contains the file to boot. + int mode = oplPath2Mode(cur->file); + if (mode < 0) { + mode = ELM_MODE; + LOG("ELMSUPPORT warning: cannot find mode for path: %s\n", cur->file); + } + + deinit(UNMOUNT_EXCEPTION, mode); // CAREFUL: deinit will call elmCleanUp, so configElm/cur will be freed sysExecElfWithParam(memPath,params); }else{ char error[256]; @@ -643,8 +647,18 @@ static void elmCleanUp(int exception) { } } +//This may be called, even if appInit() was not. +static void appShutdown(void) +{ + if (elmItemList.enabled) { + LOG("ELMSUPPORT Shutdown\n"); + + elmGameListFree(); + } +} + static item_list_t elmItemList = { - ELM_MODE, 0, MODE_FLAG_NO_COMPAT|MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", _STR_ELM, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, + ELM_MODE, -1, 0, MODE_FLAG_NO_COMPAT|MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", _STR_ELM, NULL, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, &elmGetItemCount, NULL, &elmGetItemName, &elmGetItemNameLength, &elmGetItemStartup, &elmDeleteItem, &elmRenameItem, &elmLaunchItem, - &elmGetConfig, &elmGetImage, &elmCleanUp, NULL, ELM_ICON + &elmGetConfig, &elmGetImage, &elmCleanUp, &appShutdown, NULL, ELM_ICON }; From 68b88cbefd641e8bd9d7bcb6b399e0e299622f61 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Sun, 13 Jan 2019 18:04:35 +0000 Subject: [PATCH 140/269] Fix crash in oplGetAppImage if a device was disabled. Fix warning --- src/appsupport.c | 2 +- src/opl.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/appsupport.c b/src/appsupport.c index c9b47d677..a7085bf25 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -386,7 +386,7 @@ static void appLaunchItem(int id, config_set_t *configSet) static config_set_t *appGetConfig(int id) { - config_set_t *config; + config_set_t *config = NULL; if (appsList[id].legacy) { struct config_value_t *cur = appGetConfigValue(id); diff --git a/src/opl.c b/src/opl.c index 712f37203..6bf674e06 100644 --- a/src/opl.c +++ b/src/opl.c @@ -401,14 +401,15 @@ int oplGetAppImage(char *folder, int isRelative, char *value, char *suffix, GSTE char priority; item_list_t *listSupport; - // We search on ever devices from fatest to slowest (HDD > ETH > USB) + // We search on every device from fastest to slowest (HDD > ETH > USB) for (remaining = MODE_COUNT,priority = 0; remaining > 0 && priority < 4; priority++) { for (i = 0; i < MODE_COUNT; i++) { listSupport = list_support[i].support; - if (listSupport->appsPriority == priority) + // If a device is disabled, listSupport will be NULL here + if (listSupport != NULL && listSupport->appsPriority == priority) { if (listSupport->itemGetImage(folder, isRelative, value, suffix, resultTex, psm) >= 0) return 0; From e5fbd8a515498f3a9cfb70dea9ad72e9895fb417 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Mon, 14 Jan 2019 20:35:29 +0000 Subject: [PATCH 141/269] Fix app cfg not loading --- src/appsupport.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/appsupport.c b/src/appsupport.c index a7085bf25..597e7257d 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -444,7 +444,6 @@ static config_set_t *appGetConfig(int id) config = configAlloc(0, NULL, NULL); } //END of OPL_DB tweaks - config = configAlloc(0, NULL, NULL); configSetStr(config, CONFIG_ITEM_NAME, appGetELFName(cur->val)); configSetStr(config, CONFIG_ITEM_LONGNAME, cur->key); configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); From d561fdc2e784e3b3843a6d1d022971f065aa0cfc Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Mon, 14 Jan 2019 20:48:13 +0000 Subject: [PATCH 142/269] Comments --- src/appsupport.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/appsupport.c b/src/appsupport.c index c20a4eebc..cfdc7dd5e 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -81,6 +81,7 @@ static int addAppsLegacyList(struct app_info_linked **appsLinkedList) struct config_value_t *cur; struct app_info_linked *app; int count; + //START of OPL_DB tweaks char path[256]; static item_list_t *listSupport = NULL; int ret=0; //Return from configRead @@ -121,6 +122,7 @@ static int addAppsLegacyList(struct app_info_linked **appsLinkedList) configApps = configAlloc(CONFIG_APPS, NULL, path); ret = configRead(configApps); } + //END of OPL_DB tweaks count = 0; cur = configApps->head; @@ -393,8 +395,8 @@ static config_set_t *appGetConfig(int id) if (appsList[id].legacy) { config = configAlloc(0, NULL, NULL); struct config_value_t *cur = appGetConfigValue(id); - static item_list_t *listSupport = NULL; //START of OPL_DB tweaks + static item_list_t *listSupport = NULL; int ret=0; //Search on HDD, SMB, USB for the CFG/GAME.ELF.CFG file. From b04dccd8ca8a568f449cf5ae17238d40692696cf Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Tue, 15 Jan 2019 20:40:36 +0000 Subject: [PATCH 143/269] Only show ELF in ID --- src/appsupport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appsupport.c b/src/appsupport.c index cfdc7dd5e..9134f1d35 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -300,7 +300,7 @@ static char *appGetItemStartup(int id) if (appsList[id].legacy) { struct config_value_t *cur = appGetConfigValue(id); - return cur->val; + return appGetELFName(cur->val); } else { int mode; From 2af682d02d9e5ff8b43a5bf97ec58bdb2a79a608 Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Sat, 19 Jan 2019 17:18:03 +0000 Subject: [PATCH 144/269] Fix for missing theme icons --- src/appsupport.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/appsupport.c b/src/appsupport.c index 6ae444d6b..1356b8bbc 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -497,6 +497,11 @@ static int appGetImage(char *folder, int isRelative, char *value, char *suffix, startup = appGetBoot(device, sizeof(device), value); + // Try with entire value, fixes not loading theme icons in subfolders. + if (oplGetAppImage(device, folder, isRelative, value, suffix, resultTex, psm) >=0){ + return 0; + } + return oplGetAppImage(device, folder, isRelative, startup, suffix, resultTex, psm); } From ba80a133bde9dbf5adff075af08a4563174252a9 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 20 Jan 2019 04:01:25 -0800 Subject: [PATCH 145/269] update DB comments --- src/appsupport.c | 16 ++++++--- src/dialogs.c | 92 +++++++++++++++++++++++------------------------- src/gui.c | 16 ++++----- src/menusys.c | 4 +-- src/textures.c | 8 ++--- src/themes.c | 2 -- 6 files changed, 69 insertions(+), 69 deletions(-) diff --git a/src/appsupport.c b/src/appsupport.c index 1356b8bbc..b32401ff4 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -328,7 +328,9 @@ static char *appGetItemStartup(int id) if (appsList[id].legacy) { struct config_value_t *cur = appGetConfigValue(id); + //START of OPL_DB tweaks return appGetELFName(cur->val); + //END of OPL_DB tweaks } else { return appsList[id].boot; } @@ -406,7 +408,9 @@ static void appLaunchItem(int id, config_set_t *configSet) static config_set_t *appGetConfig(int id) { - config_set_t *config = NULL; + //START of OPL_DB tweaks + config_set_t *config = NULL; + //END of OPL_DB tweaks if (appsList[id].legacy) { config = configAlloc(0, NULL, NULL); @@ -470,7 +474,7 @@ static config_set_t *appGetConfig(int id) configSetStr(config, CONFIG_ITEM_STARTUP, cur->val); //START of OPL_DB tweaks configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); - configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); + configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); //END of OPL_DB tweaks } else { char path[256]; @@ -485,7 +489,7 @@ static config_set_t *appGetConfig(int id) configSetStr(config, CONFIG_ITEM_STARTUP, path); //START of OPL_DB tweaks configSetStr(config, CONFIG_ITEM_FORMAT, "ELF"); - configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); + configSetStr(config, CONFIG_ITEM_MEDIA, "PS2"); //END of OPL_DB tweaks } return config; @@ -497,12 +501,14 @@ static int appGetImage(char *folder, int isRelative, char *value, char *suffix, startup = appGetBoot(device, sizeof(device), value); - // Try with entire value, fixes not loading theme icons in subfolders. + //START of OPL_DB tweaks + // Try with entire value, fixes not loading theme icons in subfolders. if (oplGetAppImage(device, folder, isRelative, value, suffix, resultTex, psm) >=0){ return 0; } - return oplGetAppImage(device, folder, isRelative, startup, suffix, resultTex, psm); + //END of OPL_DB tweaks + return oplGetAppImage(device, folder, isRelative, startup, suffix, resultTex, psm); } //This may be called, even if appInit() was not. diff --git a/src/dialogs.c b/src/dialogs.c index c7cd3199c..b0d7da727 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -19,12 +19,12 @@ struct UIItem diaNetConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_ETH_OPMODE}}}, {UI_SPACER}, {UI_ENUM, NETCFG_ETHOPMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks // {UI_BREAK}, // {UI_BREAK}, {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_CAT_PS2}}}, {UI_BREAK}, @@ -109,10 +109,10 @@ struct UIItem diaNetConfig[] = { {UI_INT, NETCFG_SHARE_PORT, 1, 1, -1, 0, 0, {.intvalue = {445, 445, 0, 1024}}}, {UI_BREAK}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks // {UI_BREAK}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks // ---- SMB share name ---- {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_SHARE}}}, {UI_SPACER}, @@ -127,15 +127,15 @@ struct UIItem diaNetConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_PASSWORD}}}, {UI_SPACER}, {UI_PASSWORD, NETCFG_SHARE_PASSWORD, 1, 1, _STR_HINT_GUEST, 0, 0, {.stringvalue = {"", "", NULL}}}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks // {UI_BREAK}, {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks // buttons -//START of OPL_DB tweaks + //START of OPL_DB tweaks // {UI_BREAK}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_BUTTON, NETCFG_OK, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, {UI_SPACER}, {UI_BUTTON, NETCFG_RECONNECT, 1, 1, -1, 0, 0, {.label = {NULL, _STR_RECONNECT}}}, @@ -221,10 +221,10 @@ struct UIItem diaCompatConfig[] = { {UI_STRING, COMPAT_GAMEID, 1, 1, -1, 0, 0, {.stringvalue = {"", "", NULL}}}, {UI_SPACER}, {UI_BUTTON, COMPAT_LOADFROMDISC, 1, 1, -1, 0, 0, {.label = {NULL, _STR_LOAD_FROM_DISC}}}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks // {UI_SPLITTER}, {UI_BREAK}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, -30, 0, {.label = {NULL, _STR_ALTSTARTUP}}}, {UI_SPACER}, @@ -328,20 +328,20 @@ struct UIItem diaConfig[] = { {UI_ENUM, CFG_APPMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_ELMMODE}}}, {UI_SPACER}, {UI_ENUM, CFG_ELMMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, {UI_BREAK}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_DEFDEVICE}}}, {UI_SPACER}, {UI_ENUM, CFG_DEFDEVICE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks // {UI_BREAK}, {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -431,10 +431,10 @@ struct UIItem diaUIConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_WIDE_SCREEN}}}, {UI_SPACER}, {UI_BOOL, UICFG_WIDESCREEN, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks // {UI_BREAK}, {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -466,10 +466,10 @@ struct UIItem diaGSConfig[] = { {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_YOFFSET}}}, {UI_SPACER}, {UI_INT, GSMCFG_GSMYOFFSET, 1, 1, _STR_HINT_YOFFSET, -5, 0, {.intvalue = {0, 0, -100, 100}}}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks // {UI_BREAK}, {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_GSM_FIELD_FIX}}}, {UI_SPACER}, @@ -758,13 +758,13 @@ struct UIItem diaCheatConfig[] = { // About Menu struct UIItem diaAbout[] = { {UI_LABEL, ABOUT_TITLE, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_SPLITTER}, // Build Options {UI_BREAK}, {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_BUILD_DETAILS}}}, {UI_SPACER}, {UI_LABEL, ABOUT_BUILD_DETAILS, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_SPLITTER}, // Coders @@ -772,58 +772,54 @@ struct UIItem diaAbout[] = { {UI_BREAK}, {UI_SPACER}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"BatRastard, crazyc, danielb, dlanor, doctorxyz, hominem.te.esse, ifcaro,", -1}}}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"izdubar, Jay-Jay, jimmikaelkael, Maximus32, misfire, Polo35, ps2netbox/ps2usb,", -1}}}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"reprep, SP193, volca, ... and the anonymous ...", -1}}}, -//END of OPL_DB tweaks -//START of OPL_DB tweaks {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks // Quality Assurance -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_QANDA}}}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"algol, Berion, El_Patas, EP, gledson999, lee4, LocalH, RandQalan,", -1}}}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {"ShaolinAssassin, yoshi314, and zero35.", -1}}}, -//END of OPL_DB tweaks -//START of OPL_DB tweaks {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks // Network update -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_NET_UPDATE}}}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_BREAK}, {UI_SPACER}, {UI_LABEL, 0, 1, 1, -1, 0, 15, {.label = {"icyson55", -1}}}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks -//START of OPL_DB tweaks + //START of OPL_DB tweaks // OPL Free Statement {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OPL_FREE}}}, {UI_BREAK}, @@ -835,7 +831,7 @@ struct UIItem diaAbout[] = { {UI_SPACER}, {UI_LABEL, 0, 1, 1, -1, 0, 10, {.label = {NULL, _STR_OPL_DB}}}, {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks // buttons {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}}, @@ -857,9 +853,9 @@ struct UIItem diaVMC[] = { {UI_LABEL, 0, 1, 1, -1, -20, 0, {.label = {NULL, _STR_VMC_SIZE}}}, {UI_SPACER}, {UI_ENUM, VMC_SIZE, 1, 1, _STR_HINT_VMC_SIZE, 0, 0, {.intvalue = {0, 0}}}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {UI_LABEL, 0, 1, 1, -1, -20, 0, {.label = {NULL, _STR_VMC_STATUS}}}, {UI_SPACER}, @@ -870,9 +866,9 @@ struct UIItem diaVMC[] = { {UI_SPACER}, {UI_INT, VMC_PROGRESS, 0, 1, -1, 0, 0, {.intvalue = {0, 0, 0, 100}}}, {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {"%", -1}}}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks // buttons {UI_BUTTON, VMC_BUTTON_CREATE, 1, 1, -1, 0, 0, {.label = {NULL, -1}}}, @@ -897,9 +893,9 @@ struct UIItem diaNetCompatUpdate[] = { {UI_SPACER}, {UI_INT, NETUPD_PROGRESS, 0, 1, -1, 0, 0, {.intvalue = {0, 0, 0, 100}}}, {UI_LABEL, NETUPD_PROGRESS_PERC_LBL, 1, 1, -1, 0, 0, {.label = {"%", -1}}}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {UI_SPLITTER}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks // buttons {UI_BUTTON, NETUPD_BTN_START, 1, 1, -1, 0, 0, {.label = {NULL, _STR_START}}}, diff --git a/src/gui.c b/src/gui.c index 528b7f544..18f45cd16 100644 --- a/src/gui.c +++ b/src/gui.c @@ -433,9 +433,9 @@ void guiShowConfig() diaGetInt(diaConfig, CFG_HDDMODE, &gHDDStartMode); diaGetInt(diaConfig, CFG_ETHMODE, &gETHStartMode); diaGetInt(diaConfig, CFG_APPMODE, &gAPPStartMode); -//START of OPL_DB tweaks + //START of OPL_DB tweaks diaGetInt(diaConfig, CFG_ELMMODE, &gELMStartMode); -//END of OPL_DB tweaks + //END of OPL_DB tweaks applyConfig(-1, -1); } @@ -1533,22 +1533,22 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) } } else if (result > 0) { // test button pressed or save button compatMode = 0; -//START of OPL_DB tweaks + //START of OPL_DB tweaks char modesBuf[16];//(1+2+3+4+5+6+7+8)= 15 +1 null int modesBufPos = 0; for (i = 0; i < COMPAT_MODE_COUNT; ++i) { -//END of OPL_DB tweaks + //END of OPL_DB tweaks int mdpart; diaGetInt(diaCompatConfig, COMPAT_MODE_BASE + i, &mdpart); compatMode |= (mdpart ? 1 : 0) << i; -//START of OPL_DB tweaks + //START of OPL_DB tweaks if (mdpart){ if(modesBufPos == 0) modesBufPos+=sprintf(modesBuf + modesBufPos, "%d", i+1); else modesBufPos+=sprintf(modesBuf + modesBufPos, "+%d", i+1); } -//END of OPL_DB tweaks + //END of OPL_DB tweaks } if (support->flags & MODE_FLAG_COMPAT_DMA) { @@ -1559,7 +1559,7 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_DMA); } -//START of OPL_DB tweaks + //START of OPL_DB tweaks if (compatMode != 0){ configSetInt(configSet, CONFIG_ITEM_COMPAT, compatMode); configSetStr(configSet, CONFIG_ITEM_MODES, modesBuf); @@ -1567,7 +1567,7 @@ int guiShowCompatConfig(int id, item_list_t *support, config_set_t *configSet) configRemoveKey(configSet, CONFIG_ITEM_COMPAT); configRemoveKey(configSet, CONFIG_ITEM_MODES); } -//END of OPL_DB tweaks + //END of OPL_DB tweaks //GSM diaGetInt(diaGSConfig, GSMCFG_ENABLEGSM, &EnableGSM); diff --git a/src/menusys.c b/src/menusys.c index 41b7f12ec..c146ee963 100644 --- a/src/menusys.c +++ b/src/menusys.c @@ -733,9 +733,9 @@ void menuHandleInputMenu() if (getKeyOn(KEY_START) || getKeyOn(gSelectButton == KEY_CIRCLE ? KEY_CROSS : KEY_CIRCLE)) { //Check if there is anything to show the user, at all. -//START of OPL_DB tweaks + //START of OPL_DB tweaks if (gAPPStartMode || gELMStartMode || gETHStartMode || gUSBStartMode || gHDDStartMode) -//END of OPL_DB tweaks + //END of OPL_DB tweaks guiSwitchScreen(GUI_SCREEN_MAIN, TRANSITION_LEFT); } } diff --git a/src/textures.c b/src/textures.c index 0c93d2e64..19991a7c0 100644 --- a/src/textures.c +++ b/src/textures.c @@ -66,9 +66,9 @@ static texture_t internalDefault[TEXTURES_COUNT] = { {HDD_ICON, "hdd", &hdd_png}, {ETH_ICON, "eth", ð_png}, {APP_ICON, "app", &app_png}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {ELM_ICON, "elm", &elm_png}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks {LEFT_ICON, "left", &left_png}, {RIGHT_ICON, "right", &right_png}, {UP_ICON, "up", &up_png}, @@ -85,10 +85,10 @@ static texture_t internalDefault[TEXTURES_COUNT] = { {R2_ICON, "R2", &R2_png}, {LOGO_PICTURE, "logo", &logo_png}, {BG_OVERLAY, "bg_overlay", &bg_overlay_png}, -//START of OPL_DB tweaks + //START of OPL_DB tweaks {BG_OVERLAY_2, "bg_overlay_2", &bg_overlay_2_png}, {INFO_OVERLAY, "info_overlay", &info_overlay_png}, -//END of OPL_DB tweaks + //END of OPL_DB tweaks }; int texLookupInternalTexId(const char *name) diff --git a/src/themes.c b/src/themes.c index 095c7bde2..5030ba3c1 100644 --- a/src/themes.c +++ b/src/themes.c @@ -735,7 +735,6 @@ static void drawItemsList(struct menu_list *menu, struct submenu_list *item, con if (itemsList->decoratorImage) { GSTEXTURE *itemIconTex = getGameImageTexture(itemsList->decoratorImage->cache, menu->item->userdata, &ps->item); if (itemIconTex && itemIconTex->Mem) -//START of OPL_DB tweaks rmDrawPixmap(itemIconTex, posX, posY, elem->aligned, DECORATOR_SIZE, DECORATOR_SIZE, elem->scaled, gDefaultCol); else { if (itemsList->decoratorImage->defaultTexture) @@ -744,7 +743,6 @@ static void drawItemsList(struct menu_list *menu, struct submenu_list *item, con fntRenderString(elem->font, elem->posX + DECORATOR_SIZE, posY, elem->aligned, elem->width, elem->height, submenuItemGetText(&ps->item), color); } else fntRenderString(elem->font, elem->posX, posY, elem->aligned, elem->width, elem->height, submenuItemGetText(&ps->item), color); -//END of OPL_DB tweaks posY += MENU_ITEM_HEIGHT; ps = ps->next; From 98d5c7b176db0fc17fa4c5657b32e92d7dc3a392 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 20 Jan 2019 04:06:36 -0800 Subject: [PATCH 146/269] update DB comments --- src/appsupport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/appsupport.c b/src/appsupport.c index b32401ff4..d432ea689 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -330,7 +330,7 @@ static char *appGetItemStartup(int id) struct config_value_t *cur = appGetConfigValue(id); //START of OPL_DB tweaks return appGetELFName(cur->val); - //END of OPL_DB tweaks + //END of OPL_DB tweaks } else { return appsList[id].boot; } @@ -408,7 +408,7 @@ static void appLaunchItem(int id, config_set_t *configSet) static config_set_t *appGetConfig(int id) { - //START of OPL_DB tweaks + //START of OPL_DB tweaks config_set_t *config = NULL; //END of OPL_DB tweaks From 57fe65c427595ef3f33e24136699907f00003cce Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 20 Jan 2019 06:20:47 -0800 Subject: [PATCH 147/269] update DB comment (fix) --- src/appsupport.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/appsupport.c b/src/appsupport.c index d432ea689..c7f5cf5c9 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -325,13 +325,13 @@ static int appGetItemNameLength(int id) The path is used immediately, before a subsequent call to appGetItemStartup(). */ static char *appGetItemStartup(int id) { + //START of OPL_DB tweaks if (appsList[id].legacy) { struct config_value_t *cur = appGetConfigValue(id); - //START of OPL_DB tweaks return appGetELFName(cur->val); - //END of OPL_DB tweaks } else { + //END of OPL_DB tweaks return appsList[id].boot; } } @@ -502,7 +502,7 @@ static int appGetImage(char *folder, int isRelative, char *value, char *suffix, startup = appGetBoot(device, sizeof(device), value); //START of OPL_DB tweaks - // Try with entire value, fixes not loading theme icons in subfolders. + // Try with entire value, fixes not loading theme icons in subfolders. if (oplGetAppImage(device, folder, isRelative, value, suffix, resultTex, psm) >=0){ return 0; } From dabb07a225b7fd8ffd893139d56717101b20c47a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 20 Jan 2019 08:41:38 -0800 Subject: [PATCH 148/269] update lang files --- lng/lang_Arabic.lng | 5 +- lng/lang_Bulgarian.lng | 5 +- lng/lang_Chinese_Simp.lng | 5 +- lng/lang_Chinese_Trad.lng | 261 +++++++++++++++++++------------------ lng/lang_Czech.lng | 5 +- lng/lang_Danish.lng | 5 +- lng/lang_Dutch.lng | 5 +- lng/lang_Filipino.lng | 5 +- lng/lang_French.lng | 5 +- lng/lang_German.lng | 5 +- lng/lang_Greek.lng | 5 +- lng/lang_Hungarian.lng | 5 +- lng/lang_Indonesian.lng | 5 +- lng/lang_Italian.lng | 5 +- lng/lang_Japanese.lng | 5 +- lng/lang_Korean.lng | 5 +- lng/lang_Laotian.lng | 5 +- lng/lang_Persian.lng | 5 +- lng/lang_Polish.lng | 5 +- lng/lang_Portuguese.lng | 5 +- lng/lang_Portuguese_BR.lng | 5 +- lng/lang_Russian.lng | 7 +- lng/lang_Spanish.lng | 5 +- lng/lang_Swedish.lng | 5 +- lng/lang_Turkish.lng | 5 +- 25 files changed, 204 insertions(+), 179 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 06f37230c..d7f223d4f 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s @@ -265,6 +265,7 @@ LMP الاصدار: حجم المؤثرات الصوتية حجم صوت التمهيد Confirm video mode change? +Cache Game List PS1 العاب PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 0f3ef07e2..27d4c3ed1 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index 8d1ca73f8..72dc06577 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Jan. 5, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -265,6 +265,7 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 音效音量 启动音量 确认视频模式更改? +Cache Game List PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Chinese_Trad.lng b/lng/lang_Chinese_Trad.lng index 2788217aa..3418810d2 100644 --- a/lng/lang_Chinese_Trad.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,12 +1,12 @@ # Translated by kane159 and eyu2007 -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s 保存設置 返回 -網絡設置 +網路設置 進階設置 <無數值> 設置已保存... @@ -17,57 +17,57 @@ OPL %s USB 遊戲 HDD 遊戲 ETH 遊戲 -應用程式 +應用程序 主題 語言 系統電源將會關閉. -Exit to Browser? +退出到瀏覽界面? 取消更新? -%d: 偵測不到硬碟 -%d: 硬碟沒有格式化 -%d: 啟動網絡錯誤 -%d: 偵測不到網卡 +%d: 檢測不到硬碟 +%d: 硬碟未格式化 +%d: 啟動網路錯誤 +%d: 檢測不到網卡 %d: 無法連接 SMB 伺服器 %d: 無法登入 SMB 伺服器 %d: 無法開啟 SMB 共享 -%d: 無法羅列 SMB 共享清單 +%d: 無法列出 SMB 共享清單 %d: 無法列出遊戲清單 %d: DHCP 伺服器不存在 -%d: 無網絡連接 +%d: 無網路連接 開啟 關閉 確定 選擇 取消 -圓圈 -叉叉 -遊戲清單 +O +X +遊戲列表 遊戲設置 -移除所有設置 -移除遊戲所有的設置 -滾動 +刪除所有設置 +刪除遊戲所有的設置 +選定項滾動速度 較慢 中等 較快 -預設選單 +默認選單 從光碟中讀取 請稍後 -讀取 Game ID 時出錯 -自動滾動 -讀取語言档案時出錯 -禁用 Debug Colors -無偵測到搖桿, 等待中... -啟用圖示封面 -寬螢幕 +讀取 遊戲 ID 時出錯 +自動排序 +載入語言文件時出錯 +禁用調試跳色 +未檢測到控制器, 等待中... +顯示遊戲封面 +寬屏幕 關機 設置讀取中 設置儲存中 -啟動裝置 +啟動設備 重新整理 -USB 裝置啟動模式 -HDD 裝置啟動模式 -ETH 裝置啟動模式 -應用程式啟動模式 +USB 設備啟動模式 +HDD 設備啟動模式 +ETH 設備啟動模式 +應用程序啟動模式 自動 手動 啟動 HDL 服務 @@ -80,20 +80,20 @@ IGR 位置 文字顏色 - PS2 - - SMB 伺服器 - -IP 位置模式 +IP 地址模式 靜態 DHCP -IP 位置 -位置 -子網路遮罩 -閘道 +IP 地址 +地址 +子網掩碼 +網關 DNS 伺服器 -端口 +埠 共享 使用者 密碼 <無設置> -位置格式 +地址格式 IP NetBIOS 允許 @@ -104,7 +104,7 @@ NetBIOS 顯示設置 啟用刪除與重新命名功能 檢查 USB 遊戲碎片 -記住最後一個玩的遊戲 +記住最後運行遊戲 選定鍵 錯誤, 遊戲有碎片 錯誤, 無法運行該項目 @@ -112,11 +112,11 @@ NetBIOS GUEST驗證留空. 精確讀取 同步模式 -脫開系統調用 -跳过视频 +解除系統調用 +跳過 videos 模擬 DVD-DL 禁用 IGR -Unused +空閑 隱藏 DEV9 模式 改變大小將會重新格式化 VMC 生成 @@ -130,37 +130,37 @@ Unused 大小 狀態 進度 -VMC 檔案已存在 -無效的 VMC 檔案, 大小有誤 -需要建立VMC 檔案 +VMC 存檔已存在 +無效的 VMC 存檔, 大小有誤 +需要建立VMC 存檔 VMC %s 出錯, 繼續使用物理記憶卡嗎 (slot %d) ? 自動重新整理 關於 -Coders -Quality Assurance -USB 前墜路徑 -Boots Custom ELF after an IGR +程序 +測試 +USB 前綴路徑 +自定義IGR啟動文件 數值以分鐘計,設為 0 禁用降速 自動 HDD 降速 -影片模式 +視頻模式 對話框顏色 被選定顏色 -顯示資訊業面 -資訊 +顯示訊息頁面 +訊息 自定義 ELF 顏色選項 -重新連線 +重新連接 留空列出共享清單 -ETH 前墜位置 +ETH 前綴路徑 退格 空格 -Enter +回車 模式 VMC 插槽 1 VMC 插槽 2 -Game ID +遊戲 ID DMA 模式 -V-Sync +垂直同步 模式 1 模式 2 模式 3 @@ -170,107 +170,108 @@ V-Sync 模式 7 模式 8 配置 GSM -以太網鏈接模式 -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +乙太網鏈接模式 +100Mbit 全雙工 +100Mbit 半雙工 +10Mbit 全雙工 +10Mbit 半雙工 GSM 設置 啟用 GSM 切換 GSM 開或關 -VMODE +畫面模式 強制自定義顯示模式 -H-POS 水平調整 -V-POS +調整水平方向的顯示位置 垂直調整 -Overscan -Overscan Adjustment +調整垂直方向的顯示位置 +過掃 +過掃調節 跳過 FMV 跳過全動態視頻 金手指設置 -啟用 PS2RD 金手指引擎 -允許 PS2RD 金手指引擎對你的遊戲進行補丁 -PS2RD 金手指引擎模式 -自動選擇或選擇遊戲金手指 -自動選擇金手指 -選擇遊戲金手指 -錯誤: 讀取金手指档案出錯 -無發現金手指档案 -下載預設值 -網絡更新 -重新下載現有記錄? +啟用PS2RD +允許對選定遊戲使用PS2RD金手指 +PS2RD 金手指模式 +自動或手動選擇 +自動選擇 +手動選擇 +錯誤: 讀取金手指文件出錯 +未發現金手指文件 +下載默認設置 +網路更新 +重新下載設置? 更新失敗. 連結更新伺服器失敗. 更新已完成. 更新已取消. -從網絡上下載設置? +從網路上下載設置? 自定義設置 -已下載預設值 +已下載默認值 將自動於 %i 秒後啟動... 自動啟動 -以秒為單位,設為 0 來禁用自動啟動 -PS2Logo -僅顯示與控制臺區域疋配的有效磁盤標識 +以秒為單位,設為 0 禁用自動啟動 +PS2 標誌 +進入遊戲前顯示相應標識 配置PADEMU -Pad模擬器設置 -開啟Pad模擬器 -為選定的遊戲開啟/關閉pad模擬調節。 -Pad模擬器模式 -選擇Pad模擬器模式。 +PADEMU設置 +開啟PADEMU +為選定遊戲開啟/關閉PADEMU調節. +連接模式 +選擇PADEMU連接模式. 有線連接 藍牙連接 -設置端口: -選擇Pad模擬器端口 +設置埠: +選擇應用PADEMU埠 開啟模擬 -打開/關閉選定端口的模擬器 +打開/關閉選定埠的模擬 開啟振動 -打開/關閉選定端口的振動。 -USB藍牙適配器MAC地址: -DS控制器MAC地址: +打開/關閉選定埠的振動. +藍牙適配器MAC地址: +D S 手 柄MAC地址: 配對 -配對DS控制器 -藍牙適配器和DS控制器進行MAC地址配對。 +配對DS手柄 +藍牙適配器和DS手柄進行MAC地址配對. 沒有連接 -藍牙適配器資訊 -顯示更多的資訊和支持的特性 +藍牙適配器信息 +顯示更多的信息和支持的特性 HCI版本: LMP版本: -制造商ID: +製造商ID: 支持的功能: 是 否 -藍牙適配器應該完全兼容DS3/DS4控制器 -藍牙適配器可能無法與DS3/DS4控制器疋配 -開啟多重模擬 -打開/關閉這個遊戲的多重模擬. -多重模擬端口 -選擇進行多重模擬的端口 -禁用仿冒DS3控制器 -這個選項將使一些仿冒的DS3控制器無法工作 -Emulate FIELD flipping -Fix for games that glitch under progressive video modes. -Parental Lock Settings -Parental Lock Password -Leave blank to disable the parental lock. -Enter Parental Lock Password -Parental lock password incorrect. -Parental lock disabled. -Build Options: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume -Confirm video mode change? +藍牙適配器完全兼容DS3/DS4手柄 +藍牙適配器與DS3/DS4手柄不匹配 +開啟分插模擬 +打開/關閉分插模擬. +模擬分插埠 +選擇模擬的分插埠 +禁用仿製DS3手柄 +這個選項將使仿製DS3手柄無法工作 +模擬播片掃描方式切換 +修正逐行模式下視頻播放有問題的遊戲. +家長鎖設置 +家長鎖密碼 +留空將不啟用家長鎖. +輸入家長鎖密碼 +家長鎖密碼不正確. +已禁用家長鎖. +創建選項: +錯誤-無法使用此密碼. +vmc% s 文件碎片化.是否繼續使用插槽% d 中的記憶卡? +音頻設置 +啟用聲音效果 +啟用啟動聲音 +音效音量 +啟動音量 +確認視頻模式更改? +Cache Game List PS1遊戲 PS1遊戲啟動模式 -POPSTARTER.ELF在'%s'上找不到! -VCD档案'%s'沒有找到! -重命名档案時發生錯誤 -刪除档案時發生錯誤 -Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +POPSTARTER.ELF在\'%s\'上找不到! +VCD文件\'%s\'沒有找到! +重命名文件時發生錯誤. +刪除文件時發生錯誤. +永遠不要購買OPEN-PS2-LOADER (OPL),而是免費獲得: +ifcaro OPL 版本從psx-scene.com +OPL 日常開發版(DB)從ps2-home.com \ No newline at end of file diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index adbb2ea7f..3f3eaad89 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index 8377c511d..00487d194 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index 08eb88bd1..71abd6217 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 54bb91938..7feeecded 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 1e5760f98..bf456051f 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 05d86e50f..319ef189c 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: Jan. 6, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -265,6 +265,7 @@ Startsound Einschalten Lautstärke Soundeffekte Lautstärke Startsound Änderung des Video signals übernehmen? +Cache Game List PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index d61de54b2..9d29d04f6 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List Παιχνίδια PS1 Εκκίνηση μενού παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index e3f7010d1..2b2f857c5 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: Jan. 4, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -265,6 +265,7 @@ Boot Sound engedélyezése Hanghatások hangereje Boot Sound hangereje Videó mód változtatás jóváhagyása? +Cache Game List PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 20dfe43cd..ad0bccf74 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: Jan. 5, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -265,6 +265,7 @@ Aktifkan suara Boot Volume efek suara Volume suara Boot Konfirmasi mengubah mode video? +Cache Game List PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index 2a7bf7eec..1a2d9cd85 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index d9f809495..defb364fb 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index aca50b606..791349659 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index ed63af50d..326c7dcf8 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Persian.lng b/lng/lang_Persian.lng index 8e7ce5d11..7e366405e 100644 --- a/lng/lang_Persian.lng +++ b/lng/lang_Persian.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s @@ -265,6 +265,7 @@ Skips Full Motion Videos میزان بلندی صدای افکت ها میزان بلندی صدای بوت Confirm video mode change? +Cache Game List بازی های پلی استیشن ۱ حالت نمایش بازی های پلی استیشن ۱ فایل POPSTARTER.ELF در '%s'موجود نیست! diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index 53f909bb3..cf9230aca 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -265,6 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 94eeef251..1755cfb2b 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: Jan. 4, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -265,6 +265,7 @@ Ativar som de Arranque Volume dos sons Volume do som de arranque Confirmar alteração do modo de vídeo? +Cache Game List Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 409652e8d..f1c84ab87 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Jan. 4, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -265,6 +265,7 @@ Ativar som de inicialização Volume de efeitos sonoros Volume do som de inicialização Confirmar alteração do modo de vídeo? +Cache Game List Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 042a3a6e9..ef06c5cc3 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: Jan. 3, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -264,7 +264,8 @@ VMC %s файл фрагментирован. Продолжить с карто Включить звук загрузки Громкость звуковых эффектов Громкость звука загрузки -Confirm video mode change? +Подтвердить изменение режима видео? +Cache Game List PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index fa88c0c13..b82b76345 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: Jan. 4, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -265,6 +265,7 @@ Habilitar sonido de inicio Volumen de efectos de sonido Volumen de sonido de inicio Confirma cambiar modo de video? +Cache Game List Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index f5bc39a90..47b37b4d4 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: Jan. 4, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -265,6 +265,7 @@ Aktivera Uppstartsljud Ljudeffektsvolym Uppstartsljudsvolym Bekräfta ändring av videoläge? +Cache Game List PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index e04ac35bd..842d25502 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: Jan. 4, 2019 -# Updated for OPL_1386_DB-TA_[d409ba5] +# Last update: Jan. 20, 2019 +# Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -265,6 +265,7 @@ Açılış Sesi Olsun Ses Efektleri Kuvveti Açılış Sesi Kuvveti Video çıkış modu değiştirilsin mi? +Cache Game List PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. From 146d30bec2a9f994c1a3924bef3ef18a91da4e60 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 20 Jan 2019 18:37:57 -0800 Subject: [PATCH 149/269] update lang files --- lng/lang_English.lng | 1 + lng/lang_Portuguese.lng | 2 +- lng/lang_Portuguese_BR.lng | 2 +- lng/lang_Swedish.lng | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lng/lang_English.lng b/lng/lang_English.lng index ea7b6364c..3f625a444 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -283,6 +283,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? +Cache Game List PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 1755cfb2b..0a3ced521 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -265,7 +265,7 @@ Ativar som de Arranque Volume dos sons Volume do som de arranque Confirmar alteração do modo de vídeo? -Cache Game List +Cache da lista de jogos Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index f1c84ab87..e0ddb0407 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -265,7 +265,7 @@ Ativar som de inicialização Volume de efeitos sonoros Volume do som de inicialização Confirmar alteração do modo de vídeo? -Cache Game List +Cache da lista de jogos Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 47b37b4d4..2cd687edf 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -265,7 +265,7 @@ Aktivera Uppstartsljud Ljudeffektsvolym Uppstartsljudsvolym Bekräfta ändring av videoläge? -Cache Game List +Lägg Spellista i Cache PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! From 4f4b0452c3b8d5371b1280f3ccb042f414522a77 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 20 Jan 2019 21:13:10 -0800 Subject: [PATCH 150/269] clean up src/lang.c file --- src/lang.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lang.c b/src/lang.c index c55d688f4..e96d8f21f 100644 --- a/src/lang.c +++ b/src/lang.c @@ -282,13 +282,13 @@ static char *internalEnglish[LANG_STR_COUNT] = { //START of OPL_DB tweaks "PS1 Games", "PS1 Games display mode", - "POPSTARTER.ELF not found at '%s'!", - "VCD file '%s' not found!", - "An error occurred while renaming the file.", - "An error occurred while deleting the file.", - "Never buy OPEN-PS2-LOADER (OPL), instead get it free at:", - "ifcaro OPL version at psx-scene.com", - "OPL Daily Builds (DB) version at ps2-home.com", + "POPSTARTER.ELF not found at '%s'!", + "VCD file '%s' not found!", + "An error occurred while renaming the file.", + "An error occurred while deleting the file.", + "Never buy OPEN-PS2-LOADER (OPL), instead get it free at:", + "ifcaro OPL version at psx-scene.com", + "OPL Daily Builds (DB) version at ps2-home.com", //END of OPL_DB tweaks }; From c159a762019c5af5abda3f5bcba3a631e9fe7011 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sun, 20 Jan 2019 22:49:14 -0800 Subject: [PATCH 151/269] revert the revert (#8105d94) --- elfldr/elfldr.c | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/elfldr/elfldr.c b/elfldr/elfldr.c index a4ced0545..bd4200280 100644 --- a/elfldr/elfldr.c +++ b/elfldr/elfldr.c @@ -52,6 +52,32 @@ typedef struct } elf_pheader_t; //END of OPL_DB tweaks +static inline void _strcpy(char *dst, const char *src) +{ + strncpy(dst, src, strlen(src) + 1); +} + +static inline void _strcat(char *dst, const char *src) +{ + _strcpy(&dst[strlen(dst)], src); +} + +static int _strncmp(const char *s1, const char *s2, int length) +{ + const char *a = s1; + const char *b = s2; + + while (length > 0) { + if ((*a == 0) || (*b == 0)) + return -1; + if (*a++ != *b++) + return 1; + length--; + } + + return 0; +} + static inline void BootError(char *filename) { char *argv[2]; @@ -225,9 +251,9 @@ int main(int argc, char *argv[]) SifLoadFileExit(); + //START of OPL_DB tweaks if (result == 0 && exd.epc != 0) { //Final IOP reset, to fill the IOP with the default modules. - while (!SifIopReset(NULL, 0)) { }; @@ -236,20 +262,28 @@ int main(int argc, char *argv[]) while (!SifIopSync()) { }; + //END of OPL_DB tweaks + //START of OPL_DB tweaks //Sync with the SIF library on the IOP, or it may crash the IOP kernel during the next reset (Depending on the how the next program initializes the IOP). + //END of OPL_DB tweaks SifInitRpc(0); //Load modules. SifLoadFileInit(); SifLoadModule("rom0:SIO2MAN", 0, NULL); SifLoadModule("rom0:MCMAN", 0, NULL); SifLoadModule("rom0:MCSERV", 0, NULL); - - SifLoadFileExit(); - SifExitRpc(); + if (_strncmp(argv[0], "pfs", 3) == 0) { + static char _argv[256]; + _strcpy(_argv, "hdd0:+OPL:"); + _strcat(_argv, argv[0]); + + argv[0] = _argv; + } + ExecPS2((void *)exd.epc, (void *)exd.gp, argc, argv); } else { SifExitRpc(); From 93fa9f6b5f7250b92c3eaf55967765b6ac7fc2af Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 23 Jan 2019 18:07:27 -0800 Subject: [PATCH 152/269] update lang files: --- lng/lang_Chinese_Simp.lng | 4 ++-- lng/lang_Chinese_Trad.lng | 4 ++-- lng/lang_German.lng | 4 ++-- lng/lang_Hungarian.lng | 4 ++-- lng/lang_Indonesian.lng | 4 ++-- lng/lang_Russian.lng | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index 72dc06577..a7de0bbf9 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,5 +1,5 @@ # Translated by kane159 and eyu2007 -# Last update: Jan. 20, 2019 +# Last update: Jan. 22, 2019 # Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese @@ -265,7 +265,7 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 音效音量 启动音量 确认视频模式更改? -Cache Game List +缓存游戏列表 PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Chinese_Trad.lng b/lng/lang_Chinese_Trad.lng index 3418810d2..2cf1bff11 100644 --- a/lng/lang_Chinese_Trad.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,5 +1,5 @@ # Translated by kane159 and eyu2007 -# Last update: Jan. 20, 2019 +# Last update: Jan. 22, 2019 # Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese @@ -265,7 +265,7 @@ vmc% s 文件碎片化.是否繼續使用插槽% d 中的記憶卡? 音效音量 啟動音量 確認視頻模式更改? -Cache Game List +緩存遊戲列表 PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 319ef189c..329fa0aff 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,5 +1,5 @@ # German Translation by ps2guy and LopoTRI -# Last update: Jan. 20, 2019 +# Last update: Jan. 23, 2019 # Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German @@ -265,7 +265,7 @@ Startsound Einschalten Lautstärke Soundeffekte Lautstärke Startsound Änderung des Video signals übernehmen? -Cache Game List +Spieleliste zwischenspeichern PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 2b2f857c5..5c7f031fa 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,5 +1,5 @@ # Translation by co5oos -# Last update: Jan. 20, 2019 +# Last update: Jan. 21, 2019 # Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian @@ -265,7 +265,7 @@ Boot Sound engedélyezése Hanghatások hangereje Boot Sound hangereje Videó mód változtatás jóváhagyása? -Cache Game List +Játéklista cachelés PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index ad0bccf74..46aaabb00 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,5 +1,5 @@ # translated by verislasher and jbliz -# Last update: Jan. 20, 2019 +# Last update: Jan. 22, 2019 # Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian @@ -265,7 +265,7 @@ Aktifkan suara Boot Volume efek suara Volume suara Boot Konfirmasi mengubah mode video? -Cache Game List +Konfirmasi perubahan mode video? PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index ef06c5cc3..615a18fa6 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,5 +1,5 @@ # Translated by druchapucha and frodosumkin -# Last update: Jan. 20, 2019 +# Last update: Jan. 22, 2019 # Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian @@ -265,7 +265,7 @@ VMC %s файл фрагментирован. Продолжить с карто Громкость звуковых эффектов Громкость звука загрузки Подтвердить изменение режима видео? -Cache Game List +Кэш списка игр PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! From b5f8b1291111c9305bbff7357cf38e01ac0d8bf2 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 26 Jan 2019 11:50:38 -0800 Subject: [PATCH 153/269] update lang files --- lng/lang_Spanish.lng | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index b82b76345..c88ccfebf 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,5 +1,5 @@ # Translation by lauchon22 -# Last update: Jan. 20, 2019 +# Last update: Jan. 24, 2019 # Updated for OPL_1460_DB-TA_[57fe65c] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -265,7 +265,7 @@ Habilitar sonido de inicio Volumen de efectos de sonido Volumen de sonido de inicio Confirma cambiar modo de video? -Cache Game List +Cachè de lista de juegos Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! From a191899828aeaab72a050550f68bf154ccab626d Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 31 Jan 2019 00:24:56 -0800 Subject: [PATCH 154/269] update lang files --- lng/lang_Arabic.lng | 8 ++++---- lng/lang_Bulgarian.lng | 8 ++++---- lng/lang_Chinese_Simp.lng | 8 ++++---- lng/lang_Chinese_Trad.lng | 8 ++++---- lng/lang_Czech.lng | 8 ++++---- lng/lang_Danish.lng | 8 ++++---- lng/lang_Dutch.lng | 8 ++++---- lng/lang_English.lng | 4 ++-- lng/lang_Filipino.lng | 8 ++++---- lng/lang_French.lng | 8 ++++---- lng/lang_German.lng | 8 ++++---- lng/lang_Greek.lng | 8 ++++---- lng/lang_Hungarian.lng | 8 ++++---- lng/lang_Indonesian.lng | 8 ++++---- lng/lang_Italian.lng | 8 ++++---- lng/lang_Japanese.lng | 8 ++++---- lng/lang_Korean.lng | 8 ++++---- lng/lang_Laotian.lng | 8 ++++---- lng/lang_Persian.lng | 8 ++++---- lng/lang_Polish.lng | 8 ++++---- lng/lang_Portuguese.lng | 8 ++++---- lng/lang_Portuguese_BR.lng | 8 ++++---- lng/lang_Russian.lng | 8 ++++---- lng/lang_Spanish.lng | 8 ++++---- lng/lang_Swedish.lng | 8 ++++---- lng/lang_Turkish.lng | 8 ++++---- 26 files changed, 102 insertions(+), 102 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index d7f223d4f..ccf5a7696 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL %s @@ -117,7 +117,7 @@ Unhook Syscalls محاكي DVD-DL تعطيل IGR غير مستعمل -إخفاء حدة dev9 +غير مستعمل تغير الحجم يؤدي الى إعادة تهيئة الـ VMC انشاء بدأ @@ -265,7 +265,7 @@ LMP الاصدار: حجم المؤثرات الصوتية حجم صوت التمهيد Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 العاب PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 27d4c3ed1..e719113fe 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -117,7 +117,7 @@ NetBIOS Емулиране на DVD-DL Изключване на IGR Unused -Скриване на модула DEV9 +Unused При промяна на обема, VMC ще бъде форматирана! Създаване Стартиране @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index a7de0bbf9..6cdcc4cf6 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Jan. 22, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -117,7 +117,7 @@ GUEST验证留空. 模拟 DVD-DL 禁用 IGR 空闲 -隐藏 DEV9 模式 +空闲 改变大小将会重新格式化 VMC 生成 开始 @@ -265,7 +265,7 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 音效音量 启动音量 确认视频模式更改? -缓存游戏列表 +缓存游戏列表 (HD) PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Chinese_Trad.lng b/lng/lang_Chinese_Trad.lng index 2cf1bff11..767d6d063 100644 --- a/lng/lang_Chinese_Trad.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Jan. 22, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -117,7 +117,7 @@ GUEST驗證留空. 模擬 DVD-DL 禁用 IGR 空閑 -隱藏 DEV9 模式 +空閑 改變大小將會重新格式化 VMC 生成 開始 @@ -265,7 +265,7 @@ vmc% s 文件碎片化.是否繼續使用插槽% d 中的記憶卡? 音效音量 啟動音量 確認視頻模式更改? -緩存遊戲列表 +緩存遊戲列表 (HD) PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index 3f3eaad89..d48a4dd49 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -117,7 +117,7 @@ Přeskočit videa Emulovat DVD-DL Vypnout IGR Unused -Skrýt modul dev9 +Unused Změna velikosti přeformátuje VMC Vytvořit Start @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index 00487d194..75e7ce0fe 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -117,7 +117,7 @@ Skip videoer Emulere DVD-DL Deaktivere IGR Unused -Skjul DEV9-modul +Unused Ændring af størrelsen vil omformatere VMC Opret Start @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index 71abd6217..f1cd4e922 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -117,7 +117,7 @@ Videos overslaan Emuleer DVD-DL IGR uitschakelen Unused -Verberg DEV9 module +Unused Het wijzigen van de grootte zal VMC formatteren Creëer Start @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 3f625a444..8445c552a 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -135,7 +135,7 @@ Skip Videos Emulate DVD-DL Disable IGR Unused -Hide DEV9 module +Unused Changing the size will reformat the VMC Create Start @@ -283,7 +283,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 7feeecded..8dbacc249 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -117,7 +117,7 @@ Skip Videos Emulate DVD-DL Disable IGR Unused -Hide DEV9 module +Unused Ang pagbabago ng laki ay i-reformat ang VMC Lumikha Start @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French.lng b/lng/lang_French.lng index bf456051f..28c8de561 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -117,7 +117,7 @@ Passer les vidéos Émuler DVD-DL (DVD9 rippés en DVD5) Désactiver IGR (incompatible avec certains jeux) Unused -Cacher module DEV9 (Renomme le module DEV9 en CDVDMAN) +Unused Changer la taille reformatera la VMC Créer Démarrer @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 329fa0aff..90b9fcdba 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: Jan. 23, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -117,7 +117,7 @@ Videos überspringen Emuliere DVD-DL Deaktiviere IGR Unbenutzt -Verstecke DEV9 Modul +Unbenutzt Ändern der Größe wird die VMC erneut formatieren! Erstellen Starten @@ -265,7 +265,7 @@ Startsound Einschalten Lautstärke Soundeffekte Lautstärke Startsound Änderung des Video signals übernehmen? -Spieleliste zwischenspeichern +Spieleliste zwischenspeichern (HD) PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 9d29d04f6..b7083c0f0 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -117,7 +117,7 @@ NetBIOS Προσομοίωση DVD-DoubleLayer δίσκου. Απενεργοποίηση In-Game-Reset(IGR). Αχρησιμοποίητο -Απόκρυψη του DEV9 module. +Αχρησιμοποίητο Αλλάζοντας το μέγεθος θα αναδιαμορφώστε τη VMC. Δημιουργία Εκκίνηση @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) Παιχνίδια PS1 Εκκίνηση μενού παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 5c7f031fa..e9a9cad9c 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: Jan. 21, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -117,7 +117,7 @@ Videók átugrása DVD-DL emulálás IGR letiltása Nem Használt -DEV9 modul elrejtése +Nem Használt A méretváltoztatás leformázza a VMC-t Létrehoz Indít @@ -265,7 +265,7 @@ Boot Sound engedélyezése Hanghatások hangereje Boot Sound hangereje Videó mód változtatás jóváhagyása? -Játéklista cachelés +Játéklista cachelés (HD) PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 46aaabb00..bbc30cb21 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: Jan. 22, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -117,7 +117,7 @@ Lewati video Emulasi DVD-DL Nonaktifkan IGR Tdk terpakai -Sembunyikan mode Dev9 +Tdk terpakai Mengubah ukuran akan memformat ulang VMC Membuat Mulai @@ -265,7 +265,7 @@ Aktifkan suara Boot Volume efek suara Volume suara Boot Konfirmasi mengubah mode video? -Konfirmasi perubahan mode video? +Cache Game List (HD) PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index 1a2d9cd85..0c4fa7d10 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -117,7 +117,7 @@ Salta i video Disabilita DVD-DL Disabilita IGR Unused -Nascondi modulo dev9 +Unused Modificare la dimensione riformatterà la VMC. Crea Avvia @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index defb364fb..70414feda 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -117,7 +117,7 @@ Syscallの解除 二層ディスク(DVD9)用設定 IGRを無効化 Unused -ネットワーク機能(DEV9)無効化 +Unused サイズを変更するとVMCはフォーマットされます VMCファイルを作成 開始 @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 791349659..f9993d7c5 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -117,7 +117,7 @@ USB 게임 손상 검사 DV-DL 에뮬레이트 IGR 비활성 Unused -DEV9 모듈 숨기기 +Unused 크기 변경 시 VMC 재포멧 됩니다. 생성 시작 @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index 326c7dcf8..b5a3541a9 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -117,7 +117,7 @@ Unhook Syscalls ປະມວນຜົນ DVD-DL Disable IGR Unused -ປິດບັງ dev9 module +Unused ການປ່ຽນຂະໜາດຈະເຮັດໃຫ້ VMC(ກ້ອນເຊບສະເໝືອນຈິງ) ຖືກ format ໃໝ່ ສ້າງ Start @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Persian.lng b/lng/lang_Persian.lng index 7e366405e..b1fbb7d35 100644 --- a/lng/lang_Persian.lng +++ b/lng/lang_Persian.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s @@ -117,7 +117,7 @@ Unhook Syscalls شبیه سازی DVD-DL غیرفعال کردن IGR Unused -Hide DEV9 module +Unused درحال تغییر سایز در هنگام فرمت مجدد VMC ساختن شروع @@ -265,7 +265,7 @@ Skips Full Motion Videos میزان بلندی صدای افکت ها میزان بلندی صدای بوت Confirm video mode change? -Cache Game List +Cache Game List (HD) بازی های پلی استیشن ۱ حالت نمایش بازی های پلی استیشن ۱ فایل POPSTARTER.ELF در '%s'موجود نیست! diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index cf9230aca..568fb298d 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -117,7 +117,7 @@ Przejdź filmy Emuluj DVD-DL Wyłącz IGR Unused -Ukryj moduł DEV9 +Unused Zmiana rozmiaru, zostanie sformatowany VMC Utwórz Start @@ -265,7 +265,7 @@ Enable Boot Sound Sound Effects Volume Boot Sound Volume Confirm video mode change? -Cache Game List +Cache Game List (HD) PS1 Games PS1 Games display mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 0a3ced521..b14872487 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -117,7 +117,7 @@ Saltar videos Emular DVD-DL Desativar IGR Não utilizado -Esconder módulo dev9 +Não utilizado Alterar o tamanho (Irá reformatar o VMC!) Criar Iniciar @@ -265,7 +265,7 @@ Ativar som de Arranque Volume dos sons Volume do som de arranque Confirmar alteração do modo de vídeo? -Cache da lista de jogos +Cache da lista de jogos (HD) Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index e0ddb0407..5363b45b6 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -117,7 +117,7 @@ Pular vídeos PSS Emular DVD-DL Desabilitar IGR Não utilizado -Ocultar módulo dev9 +Não utilizado Alterar o tamanho (Irá reformatar o VMC!) Criar Iniciar atualização @@ -265,7 +265,7 @@ Ativar som de inicialização Volume de efeitos sonoros Volume do som de inicialização Confirmar alteração do modo de vídeo? -Cache da lista de jogos +Cache da lista de jogos (HD) Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 615a18fa6..8baf08eff 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: Jan. 22, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -117,7 +117,7 @@ NetBIOS Эмулировать DVD-DL Отключить использование IGR Не используется -Скрывать модули Dev9 +Не используется При изменении размера, VMC переформатируется Создать Старт @@ -265,7 +265,7 @@ VMC %s файл фрагментирован. Продолжить с карто Громкость звуковых эффектов Громкость звука загрузки Подтвердить изменение режима видео? -Кэш списка игр +Кэш списка игр (HD) PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index c88ccfebf..bc182b92e 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: Jan. 24, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -117,7 +117,7 @@ Apagar videos Emula DVD-DL Quita el IGR Sin uso -Oculta el módulo DEV9 +Sin uso Cambiar el tamaño formateará la VMC Crear Iniciar @@ -265,7 +265,7 @@ Habilitar sonido de inicio Volumen de efectos de sonido Volumen de sonido de inicio Confirma cambiar modo de video? -Cachè de lista de juegos +Cachè de lista de juegos (HD) Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 2cd687edf..69792a267 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -117,7 +117,7 @@ Skippa Videos Emulera DVD-DL Inaktivera IGR Används ej -Göm dev9 modul +Används ej Ändra storleken kommer att formatera om VMC Skapa Start @@ -265,7 +265,7 @@ Aktivera Uppstartsljud Ljudeffektsvolym Uppstartsljudsvolym Bekräfta ändring av videoläge? -Lägg Spellista i Cache +Lägg Spellista i Cache (HD) PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index 842d25502..8f31eb58d 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: Jan. 20, 2019 -# Updated for OPL_1460_DB-TA_[57fe65c] +# Last update: Jan. 30, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -117,7 +117,7 @@ Videoları atla DVD-DL i etkinleştir IGR i etkisizleştir Kullanılmıyor -dev9 modulünü gizle +Kullanılmıyor VMC Boyutu değiştirmek VMC nin biçimlendirilmesine neden olur Oluştur Başlat @@ -265,7 +265,7 @@ Açılış Sesi Olsun Ses Efektleri Kuvveti Açılış Sesi Kuvveti Video çıkış modu değiştirilsin mi? -Cache Game List +Cache Game List (HD) PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. From ed45a581a2e9119523e6d9253f751569e5cab74d Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 31 Jan 2019 02:03:10 -0800 Subject: [PATCH 155/269] tweak gui.c file --- src/gui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui.c b/src/gui.c index b4272bdb3..bdd7152c0 100644 --- a/src/gui.c +++ b/src/gui.c @@ -372,7 +372,7 @@ void guiShowConfig() // configure the enumerations const char *selectButtons[] = {_l(_STR_CIRCLE), _l(_STR_CROSS), NULL}; //START of OPL_DB tweaks - const char *deviceNames[] = {_l(_STR_USB_GAMES), _l(_STR_NET_GAMES), _l(_STR_HDD_GAMES),_l(_STR_APPS),_l(_STR_ELM), NULL}; + const char *deviceNames[] = {_l(_STR_USB_GAMES), _l(_STR_NET_GAMES), _l(_STR_HDD_GAMES), _l(_STR_APPS), _l(_STR_ELM), NULL}; //END of OPL_DB tweaks const char *deviceModes[] = {_l(_STR_OFF), _l(_STR_MANUAL), _l(_STR_AUTO), NULL}; From 44e834a0b28b7a72227aa07d8eadb01639967389 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 1 Feb 2019 08:10:08 -0800 Subject: [PATCH 156/269] some edits and minor fixes to OPL Daily Builds version code changes --- src/appsupport.c | 2 +- src/elmsupport.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/appsupport.c b/src/appsupport.c index c7f5cf5c9..9416e9961 100644 --- a/src/appsupport.c +++ b/src/appsupport.c @@ -454,7 +454,7 @@ static config_set_t *appGetConfig(int id) configFree(config); #if OPL_IS_DEV_BUILD - snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); + snprintf(path, sizeof(path), "%sCFG-DEV/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); #else snprintf(path, sizeof(path), "%sCFG/%s.cfg", usbGetPrefix(), appGetELFName(cur->val)); #endif diff --git a/src/elmsupport.c b/src/elmsupport.c index d9a2d3cab..7211830cd 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -648,7 +648,7 @@ static void elmCleanUp(int exception) { } //This may be called, even if appInit() was not. -static void appShutdown(void) +static void elmShutdown(void) { if (elmItemList.enabled) { LOG("ELMSUPPORT Shutdown\n"); @@ -658,7 +658,7 @@ static void appShutdown(void) } static item_list_t elmItemList = { - ELM_MODE, -1, 0, MODE_FLAG_NO_COMPAT|MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", _STR_ELM, NULL, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, - &elmGetItemCount, NULL, &elmGetItemName, &elmGetItemNameLength, &elmGetItemStartup, &elmDeleteItem, &elmRenameItem, &elmLaunchItem, - &elmGetConfig, &elmGetImage, &elmCleanUp, &appShutdown, NULL, ELM_ICON + ELM_MODE, -1, 0, MODE_FLAG_NO_COMPAT|MODE_FLAG_NO_UPDATE, MENU_MIN_INACTIVE_FRAMES, ELM_MODE_UPDATE_DELAY, "PS1 Games", _STR_ELM, NULL, &elmInit, &elmNeedsUpdate, &elmUpdateItemList, + &elmGetItemCount, NULL, &elmGetItemName, &elmGetItemNameLength, &elmGetItemStartup, &elmDeleteItem, &elmRenameItem, &elmLaunchItem, + &elmGetConfig, &elmGetImage, &elmCleanUp, &elmShutdown, NULL, ELM_ICON }; From 2eba332b78c951f7a42d361f86d99f9a68073a24 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 7 Feb 2019 13:35:34 -0800 Subject: [PATCH 157/269] update lang files --- lng/lang_Chinese_Simp.lng | 4 ++-- lng/lang_Chinese_Trad.lng | 4 ++-- lng/lang_Hungarian.lng | 4 ++-- lng/lang_Indonesian.lng | 4 ++-- lng/lang_Portuguese.lng | 4 ++-- lng/lang_Portuguese_BR.lng | 2 +- lng/lang_Russian.lng | 4 ++-- lng/lang_Spanish.lng | 4 ++-- lng/lang_Swedish.lng | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lng/lang_Chinese_Simp.lng b/lng/lang_Chinese_Simp.lng index 6cdcc4cf6..28fe2932e 100644 --- a/lng/lang_Chinese_Simp.lng +++ b/lng/lang_Chinese_Simp.lng @@ -1,5 +1,5 @@ # Translated by kane159 and eyu2007 -# Last update: Jan. 30, 2019 +# Last update: Feb. 03, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese @@ -265,7 +265,7 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 音效音量 启动音量 确认视频模式更改? -缓存游戏列表 (HD) +缓存游戏列表 (硬盘) PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Chinese_Trad.lng b/lng/lang_Chinese_Trad.lng index 767d6d063..e351b36d0 100644 --- a/lng/lang_Chinese_Trad.lng +++ b/lng/lang_Chinese_Trad.lng @@ -1,5 +1,5 @@ # Translated by kane159 and eyu2007 -# Last update: Jan. 30, 2019 +# Last update: Feb. 03, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese @@ -265,7 +265,7 @@ vmc% s 文件碎片化.是否繼續使用插槽% d 中的記憶卡? 音效音量 啟動音量 確認視頻模式更改? -緩存遊戲列表 (HD) +緩存遊戲列表 (硬碟) PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index e9a9cad9c..a93d8f7a6 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,5 +1,5 @@ # Translation by co5oos -# Last update: Jan. 30, 2019 +# Last update: Jan. 31, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian @@ -265,7 +265,7 @@ Boot Sound engedélyezése Hanghatások hangereje Boot Sound hangereje Videó mód változtatás jóváhagyása? -Játéklista cachelés (HD) +Játéklista cachelés (HDD) PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index bbc30cb21..661d50dfe 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,5 +1,5 @@ # translated by verislasher and jbliz -# Last update: Jan. 30, 2019 +# Last update: Feb. 01, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian @@ -265,7 +265,7 @@ Aktifkan suara Boot Volume efek suara Volume suara Boot Konfirmasi mengubah mode video? -Cache Game List (HD) +Daftar Tembolok Game(HDD) PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index b14872487..1de290d2a 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,5 +1,5 @@ # Translation by danielb -# Last update: Jan. 30, 2019 +# Last update: Jan. 31, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese @@ -265,7 +265,7 @@ Ativar som de Arranque Volume dos sons Volume do som de arranque Confirmar alteração do modo de vídeo? -Cache da lista de jogos (HD) +Cache da lista de jogos (HDD) Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 5363b45b6..c585d2a11 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,5 +1,5 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Jan. 30, 2019 +# Last update: Jan. 31, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 8baf08eff..f801e4852 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,5 +1,5 @@ # Translated by druchapucha and frodosumkin -# Last update: Jan. 30, 2019 +# Last update: Jan. 31, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian @@ -265,7 +265,7 @@ VMC %s файл фрагментирован. Продолжить с карто Громкость звуковых эффектов Громкость звука загрузки Подтвердить изменение режима видео? -Кэш списка игр (HD) +Кэш игрового списка (HDD) PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index bc182b92e..9c498a4f6 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,5 +1,5 @@ # Translation by lauchon22 -# Last update: Jan. 30, 2019 +# Last update: Feb. 03, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -265,7 +265,7 @@ Habilitar sonido de inicio Volumen de efectos de sonido Volumen de sonido de inicio Confirma cambiar modo de video? -Cachè de lista de juegos (HD) +Cachè de lista de juegos (HDD) Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 69792a267..e1c6baec8 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -265,7 +265,7 @@ Aktivera Uppstartsljud Ljudeffektsvolym Uppstartsljudsvolym Bekräfta ändring av videoläge? -Lägg Spellista i Cache (HD) +Lägg Spellista i Cache (HDD) PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! From 19b7464e502a41aa44a41cbf67cc4fe6ccd08034 Mon Sep 17 00:00:00 2001 From: DDinghoya Date: Sun, 10 Feb 2019 03:14:51 +0900 Subject: [PATCH 158/269] Update lang_Korean.lng (#14) --- lng/lang_Korean.lng | 50 ++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index f9993d7c5..64c0b97c5 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -21,8 +21,8 @@ ETH 게임 테마 언어 시스템 전원이 꺼집니다. -Browser 종료합니까? -업데이트 취소합니까? +브라우저를 종료합니까? +업데이트를 취소합니까? %d: HDD를 검색할 수 없습니다 %d: HDD가 포맷되지 않았습니다 %d: 네트워크 시작 에러 @@ -116,8 +116,8 @@ USB 게임 손상 검사 동영상 건너 뛰기 DV-DL 에뮬레이트 IGR 비활성 -Unused -Unused +미사용 +미사용 크기 변경 시 VMC 재포멧 됩니다. 생성 시작 @@ -248,30 +248,30 @@ LMP 버전: 멀티탭 에뮬레이션을 위한 포트를 선택. Fake DS3에 대한 해결방법 비활성화 일부 fake ds3s는 해결 방법이 필요합니다. 이 옵션은 옵션을 비활성. -Emulate FIELD flipping -Fix for games that glitch under progressive video modes. -Parental Lock Settings -Parental Lock Password -Leave blank to disable the parental lock. -Enter Parental Lock Password -Parental lock password incorrect. -Parental lock disabled. -Build Options: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume -Confirm video mode change? -Cache Game List (HD) +FIELD 반전 에뮬레이션 +프로그레시브 비디오 모드에서 결함이있는 게임을 수정합니다. +자녀보호 잠금 설정 +자년보호 잠금 비밀번호 +자녀보호를 사용 중지하려면 비워 두십시오. +자년보호 잠금 비밀번호 입력 +자녀보호 잠금 비밀번호가 잘못되었습니다. +자녀보호 잠금이 비활성화 되었습니다. +빌드 옵션: +오류 - 이 비밀번호는 사용할 수 없습니다. +VMC %s 파일이 조각났습니다. 슬롯 %d에 있는 메모리 카드로 계속 하시겠습니까? +오디오 설정 +사운드 효과 활성화 +사운트 부팅 활성화 +사운드 효과 볼륨 +사운드 볼륨 부팅 +비디오 모드 변경을 확인 하시겠습니까? +캐쉬 게임 목록 (HD) PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! VCD 파일 '% s'을(를) 찾을 수 없습니다! 파일 이름을 바꾸는 중 오류가 발생했습니다. 파일을 삭제하는 중 오류가 발생했습니다. -Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPEN-PS2-LOADER (OPL)를 구입하지 말고 무료로 받으세요.: +psx-scene.com에서 ifcaro OPL 버전 +ps2-home.com에서 OPL Daily Builds (DB) 버전 From 9a23741ad0bb14bebeca80717f1062c6ecac335f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 9 Feb 2019 10:20:55 -0800 Subject: [PATCH 159/269] update lang files --- lng/lang_Korean.lng | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 64c0b97c5..859ef6105 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,5 +1,5 @@ # Translated by DDinghoya -# Last update: Jan. 30, 2019 +# Last update: Feb. 09, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean @@ -274,4 +274,4 @@ VCD 파일 '% s'을(를) 찾을 수 없습니다! 파일을 삭제하는 중 오류가 발생했습니다. OPEN-PS2-LOADER (OPL)를 구입하지 말고 무료로 받으세요.: psx-scene.com에서 ifcaro OPL 버전 -ps2-home.com에서 OPL Daily Builds (DB) 버전 +ps2-home.com에서 OPL Daily Builds (DB) 버전 \ No newline at end of file From ababb410f5fe0d236041f7d1a7842d72cda606eb Mon Sep 17 00:00:00 2001 From: DDinghoya Date: Tue, 12 Feb 2019 07:47:44 +0900 Subject: [PATCH 160/269] Update lang_Korean.lng (#15) --- lng/lang_Korean.lng | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 859ef6105..3f27ebe76 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -265,7 +265,7 @@ VMC %s 파일이 조각났습니다. 슬롯 %d에 있는 메모리 카드로 계 사운드 효과 볼륨 사운드 볼륨 부팅 비디오 모드 변경을 확인 하시겠습니까? -캐쉬 게임 목록 (HD) +캐쉬 게임 목록 (HDD) PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! @@ -274,4 +274,4 @@ VCD 파일 '% s'을(를) 찾을 수 없습니다! 파일을 삭제하는 중 오류가 발생했습니다. OPEN-PS2-LOADER (OPL)를 구입하지 말고 무료로 받으세요.: psx-scene.com에서 ifcaro OPL 버전 -ps2-home.com에서 OPL Daily Builds (DB) 버전 \ No newline at end of file +ps2-home.com에서 OPL Daily Builds (DB) 버전 From cece21cf1e669343552512814781c77a5ddaef35 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 11 Feb 2019 14:51:29 -0800 Subject: [PATCH 161/269] update lang files --- lng/lang_German.lng | 4 ++-- lng/lang_Korean.lng | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 90b9fcdba..968f91078 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,5 +1,5 @@ # German Translation by ps2guy and LopoTRI -# Last update: Jan. 30, 2019 +# Last update: Feb. 09, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German @@ -265,7 +265,7 @@ Startsound Einschalten Lautstärke Soundeffekte Lautstärke Startsound Änderung des Video signals übernehmen? -Spieleliste zwischenspeichern (HD) +Spieleliste zwischenspeichern (HDD) PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 3f27ebe76..12eeefeee 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,5 +1,5 @@ # Translated by DDinghoya -# Last update: Feb. 09, 2019 +# Last update: Feb. 11, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean @@ -274,4 +274,4 @@ VCD 파일 '% s'을(를) 찾을 수 없습니다! 파일을 삭제하는 중 오류가 발생했습니다. OPEN-PS2-LOADER (OPL)를 구입하지 말고 무료로 받으세요.: psx-scene.com에서 ifcaro OPL 버전 -ps2-home.com에서 OPL Daily Builds (DB) 버전 +ps2-home.com에서 OPL Daily Builds (DB) 버전 \ No newline at end of file From 3e896823170be5ccdfdbf6a6322a1b0c4682b69e Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 16 Feb 2019 22:14:09 -0800 Subject: [PATCH 162/269] update English lang template --- lng/lang_English.lng | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 8445c552a..8847ab4c6 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -22,9 +22,9 @@ # Put here the English name of your language (will be displayed in the OPL Settings menu), in standard latin characters. English OPL %s -Save changes +Save Changes Back -Network config +Network Config Advanced options Settings saved... @@ -77,7 +77,7 @@ Disable Debug Colors No controller detected, waiting... Enable Cover Art Wide screen -Power off +Power Off Loading config Saving config Start device @@ -216,7 +216,7 @@ Select game cheats Error: failed to load Cheat File No cheats found Download defaults -Network update +Network Update Re-download existing records? Update failed. Failed to connect to update server. From a1bd0cf7674cdf5d5858aff4dc278669f3f66c4a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 23 Mar 2019 02:00:59 -0700 Subject: [PATCH 163/269] update lang files --- lng/lang_Arabic.lng | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index d3943d02b..17f971685 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,5 +1,5 @@ # translation by alimadhi -# Last update: Jan. 30, 2019 +# Last update: March 22, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic @@ -264,8 +264,8 @@ LMP الاصدار: تمكين تمهيد الصوت حجم المؤثرات الصوتية حجم صوت التمهيد -Confirm video mode change? -Cache Game List (HDD) +تأكيد تغيير وضع الفيديو؟ +قائمة ألعاب التخزين المؤقت (HDD) PS1 العاب PS1 وضع عرض الالعاب POPSTARTER.ELF غير موجود في '%s'! From d83587afb3323688f04bb10e98d096c01e1ba9ec Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 28 Mar 2019 14:04:17 -0700 Subject: [PATCH 164/269] update lang files --- lng/lang_Greek.lng | 114 +++++++++++++++++++++--------------------- lng/lang_Japanese.lng | 80 ++++++++++++++--------------- 2 files changed, 97 insertions(+), 97 deletions(-) diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 0687f8959..322cc6ff8 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,5 +1,5 @@ # Greek Translation by RivalK93 -# Last update: Feb. 17, 2019 +# Last update: Mar. 24, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek @@ -27,12 +27,12 @@ OPL %s %d: Ο Σκληρός Δίσκος δεν έχει διαμορφωθεί. %d: Σφάλμα εκκίνησης Δικτύου. %d: Δεν εντοπίστηκε Προσαρμογέας Δικτύου. -%d: Αδυναμία σύνδεσης με τον SMB Server. -%d: Αδυναμία login στον SMB Server. +%d: Αδυναμία σύνδεσης με τον εξυπηρετητή SMB. +%d: Αδυναμία login στον εξυπηρετητή SMB. %d: Αδυναμία ανοίγματος κοινής χρήσης SMB. %d: Αδυναμία απαρίθμησης κοινόχρηστων SMB. %d: Αδυναμία απαρίθμησης παιχνιδιών. -%d: Ο DHCP Server δεν είναι διαθέσιμος. +%d: Ο εξυπηρετητής DHCP δεν είναι διαθέσιμος. %d: Δεν υπάρχει σύνδεση δικτύου. Ναι Όχι @@ -41,16 +41,16 @@ OK Άκυρο Ο Χ -Λίστα Παιχνιδιών +Λίστα παιχνιδιών Ρυθμίσεις Κατάργηση όλων των ρυθμίσεων Καταργήθηκαν όλα τα πλήκτρα για το παιχνίδι. -Scrolling +Κύλιση Αργό Κανονικό Γρήγορο Προεπιλεγμένο μενού -Εκκίνηση από το δίσκο +Φόρτωση από το δίσκο Παρακαλώ περιμένετε... Σφάλμα κατά τη φόρτωση του ID του παιχνιδιού. Αυτόματη ταξινόμηση @@ -70,16 +70,16 @@ Widescreen Εκκίνηση μενού Εφαρμογών Αυτόματα Μη αυτόματα -Εκκίνηση HDL Server -Γίνεται εκκίνηση HDL Server... -Λειτουργία HDL Server... -Αποτυχία εκκίνησης HDL Server. -Αποφόρτωση HDL Server... -Θέση In-Game-Reset (IGR) +Εκκίνηση εξυπηρετητή HDL +Γίνεται εκκίνηση εξυπηρετητή HDL... +Λειτουργία εξυπηρετητή HDL... +Αποτυχία εκκίνησης εξυπηρετητή HDL. +Αποφόρτωση εξυπηρετητή HDL... +Προορισμός μετά από IGR Χρώμα στο φόντο Χρώμα γραμματοσειράς - PS2 - -- SMB Server - +- Εξυπηρετητής SMB - Τύπος διεύθυνσης IP Στατική DHCP @@ -87,9 +87,9 @@ DHCP Διεύθυνση Μάσκα υποδικτύου Gateway -DNS Server +Εξυπηρετητής DNS Θύρα -Κοινόχρηστο +Κοινόχρηστο στοιχείο Χρήστης Κωδικός <κενό> @@ -107,7 +107,7 @@ NetBIOS Απομνημόνευση τελευταίου παιχν. Πλήκτρο επιλογής Σφάλμα, το παιχνίδι είναι κατακερματισμένο. -Σφάλμα, αδυναμία εκκίνησης του αρχείου. +Σφάλμα, αδυναμία εκτέλεσης του αρχείου. Δοκιμή Αφήστε το κενό για δικαιώματα GUEST. Ακριβής ανάγνωση. @@ -130,35 +130,35 @@ VMC γενικής χρήσης Μέγεθος Κατάσταση Πρόοδος -Το αρχείο VMC υπάρχει ήδη -Μη έγκυρο αρχείο VMC, το μέγεθος είναι λάθος -Πρέπει να δημιουργηθεί αρχείο VMC +Το αρχείο VMC υπάρχει ήδη. +Μη έγκυρο αρχείο VMC, το μέγεθος είναι λάθος. +Πρέπει να δημιουργηθεί αρχείο VMC. Σφάλμα VMC %s, συνέχεια με την κανονική MC (Κάρτα Μνήμης %d) ; Αυτόματη ανανέωση Σχετικά Προγραμματιστές Διασφάλιση ποιότητας -Προεπιλεγμένη θέση USB -Εκκίνηση συγκεκριμένου ELF μετά το IGR. -Τιμή σε λεπτά, 0 για απενεργοποίηση του Spin-down. -Αυτόματο Spin-down του HDD +Πρόθεμα μονοπατιού USB +Εκκίνηση του ορισμένου ELF μετά από In-Game-Reset. +Τιμή σε λεπτά, 0 για απενεργοποίηση του spin-down. +Αυτόματο spin-down του HDD Λειτουργία βίντεο Χρώμα μηνυμάτων Χρώμα επιλεγμένου Εμφάνιση σελίδας πληροφοριών Πληροφ. -Προκαθορισμένο ELF +Προορισμένο ELF Επιλογή χρώματος Επανασύνδεση Αφήστε το κενό για απαρίθμηση κοινόχρηστων. -Προεπιλεγμένη θέση ETH +Πρόθεμα μονοπατιού ETH Σβήσιμο Κενό ΟΚ Λειτουργία VMC θέση 1 VMC θέση 2 -ID Παιχνιδιού +ID παιχνιδιού Λειτουργία DMA V-Sync Mode 1 @@ -184,24 +184,24 @@ H-POS Οριζόντια ρύθμιση οθόνης. V-POS Κάθετη ρύθμιση οθόνης. -Overscan -Προσαρμογή του Overscan +Περιθώρια +Προσαρμογή των περιθωρίων Παράλειψη FMV -Παράλειψη των βίντεο Full Motion +Παράλειψη των βίντεο πλήρους κίνησης. Ρυθμίσεις Cheats PS2RD Cheat Engine Patchάρισμα των παιχνιδιών από το PS2RD. Λειτουργία PS2RD -Αυτόματη/Μη αυτόματη επιλογή cheats των παιχνιδιών. +Αυτόματη/μη αυτόματη επιλογή cheats των παιχνιδιών. Αυτόματη επιλογή cheats Μη αυτόματη επιλογή cheats -Σφάλμα: Αποτυχία φόρτωσης αρχείου Cheat +Σφάλμα: Αποτυχία φόρτωσης αρχείου Cheats. Δε βρέθηκαν cheats. Λήψη προεπιλεγμένων Ενημέρωση δικτύου Εκ νέου λήψη υπαρχόντων αρχείων; Η ενημέρωση απέτυχε. -Αποτυχία σύνδεσης σε Server ενημέρωσης. +Αποτυχία σύνδεσης σε εξυπηρετητή ενημέρωσης. Η ενημέρωση ολοκληρώθηκε. Η ενημέρωση ακυρώθηκε. Λήψη ρυθμίσεων από το δίκτυο; @@ -209,25 +209,25 @@ Patchάρισμα των παιχνιδιών από το PS2RD. Έγινε λήψη των προεπιλεγμένων. Αυτόματη εκκίνηση σε %i"... Αυτόματη εκκίνηση -Τιμή σε δευτερόλεπτα, 0 για μη αυτόματη εκκίνηση +Τιμή σε δευτερόλεπτα, 0 για μη αυτόματη εκκίνηση. Λογότυπο PS2 Εμφάνιση μόνο για συμβατά λογότυπα δίσκων που ταιριάζουν με το console region. Ρυθμίσεις PadEmu -Ρυθμίσεις προσομοιωτή Χειριστηρίου +Ρυθμίσεις Προσομοιωτή Χειριστηρίου Ενεργοποίηση προσομοιωτή Ενεργοποιεί/απενεργοποιεί τον προσομοιωτή για το συγκεκριμένο παιχνίδι. Τύπος προσομοίωσης Επιλέξτε τον τύπο προσομοίωσης του χειριστηρίου. DualShock3/4 USB -DualShock3/4 BlueTooth +DualShock3/4 BT Ρυθμίσεις για θύρα: -Επιλέξτε θύρα προς ρύθμιση. +Επιλέξτε τη θύρα προσομοιωτή προς ρύθμιση. Ενεργοποίηση προσομοίωσης Ενεργοποιεί/απενεργοποιεί την προσομοίωση για τη συγκεκριμένη θύρα. Ενεργοποίηση δόνησης Ενεργοποιεί/απενεργοποιεί τη δόνηση για τη συγκεκριμένη θύρα. -Διεύθυνση mac του προσαρμογέα BT: -Διεύθυνση mac του χειριστηρίου DS: +Διεύθυνση MAC του προσαρμογέα BT: +Διεύθυνση MAC του χειριστηρίου DS: Σύζευξη Σύζευξη με χειριστήριο DualShock Σύζευξη του προσαρμογέα BlueTooth με το χειριστήριο DualShock. @@ -242,32 +242,32 @@ ID κατασκευαστή: Όχι Ο προσαρμογέας BlueTooth θα πρέπει να είναι πλήρως συμβατός με ελεγκτές DS3/DS4. Ο προσαρμογέας Bluetooth ενδέχεται να μη λειτουργεί σωστά με τα χειριστήρια DS3/DS4. -Ενεργοποίηση Multitap emulation -Ενεργοποιεί/απενεργοποιεί το Multitap emulation για το παιχνίδι. -Multitap emulator στη θύρα +Εξομοίωση Multitap +Ενεργοποιεί/απενεργοποιεί την εξομοίωση Multitap για το παιχνίδι. +Εξομοιωτής Multitap στη θύρα Επιλέξτε θύρα για εξομοίωση Multitap. Απενεργ. workaround για ψεύτικα DS3 -Κάποια ψεύτικα DS3s χρειάζονται workaround, αυτή η επιλογή θα το απενεργοποιήσει. +Κάποια ψεύτικα DS3 χρειάζονται workaround, αυτή η επιλογή θα το απενεργοποιήσει. Εξομοίωση αντιστροφής του ΠΕΔΙΟΥ Επιδιόρθωση για παιχνίδια που glitchάρουν υπό progressive video modes. -Ρυθμίσεις Γονικού Κλειδώματος -Κωδικός πρόσβασης Γονικού Κλειδώματος -Αφήστε το κενό για να απενεργοποιήσετε το Γονικό Κλείδωμα. -Εισάγετε τον κωδικό Γονικού Κλειδώματος -Εσφαλμένος κωδικός Γονικού Κλειδώματος. -Το Γονικό Κλείδωμα είναι απενεργοποιημένο. +Ρυθμίσεις γονικού κλειδώματος +Κωδικός πρόσβασης γονικού κλειδώματος +Αφήστε το κενό για να απενεργοποιήσετε το γονικό κλείδωμα. +Εισάγετε τον κωδικό γονικού κλειδώματος +Εσφαλμένος κωδικός γονικού κλειδώματος. +Το γονικό κλείδωμα είναι απενεργοποιημένο. Επιλογές Build: Σφάλμα - αυτός ο κωδικός πρόσβασης δεν μπορεί να χρησιμοποιηθεί. Το αρχείο VMC %s είναι κατακερματισμένο. Συνέχεια με την Κάρτα Μνήμης στην υποδοχή %d; -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume -Confirm video mode change? -Cache Game List (HDD) +Ρυθμίσεις ήχου +Ενεργοποίηση ηχητικών εφέ +Ενεργοποίηση ήχου εκκίνησης +Ένταση ηχητικών εφέ +Ένταση ήχου εκκίνησης +Επιβεβαίωση αλλαγής της λειτουργίας βίντεο; +Caching λίστας παιχνιδιών (HDD) Παιχνίδια PS1 -Εκκίνηση μενού παιχνιδιών PS1 +Εκκίνηση μενού Παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! Το αρχείο VCD '%s' δε βρέθηκε! Παρουσιάστηκε σφάλμα κατά τη μετονομασία του αρχείου. diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index 803bc8ff9..c62a3271e 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,5 +1,5 @@ -# Japanese Translation by yamamotonew -# Last update: Feb. 17, 2019 +# Japanese Translation by yamamotonew and keiichiro2000 +# Last update: March 28, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese @@ -232,46 +232,46 @@ DSのペア設定MACアドレス: DS3コントローラーをペア設定 BluetoothのMACアドレスを指定してDSコントローラーをペア設定 接続されていません -Bluetooth adapter information -Shows more information and supported features +Bluetooth アダプタ情報 +さらにサポートされている機能を表示 HCI Version: LMP Version: Manufacturer ID: -Support features: +サポート機能: Yes No -Bluetooth adapter should be fully compatible with DS3/DS4 controllers. -Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation -Turns on/off Multitap emulation for selected game. -Multitap emulator on port -Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -Emulate FIELD flipping -Fix for games that glitch under progressive video modes. -Parental Lock Settings -Parental Lock Password -Leave blank to disable the parental lock. -Enter Parental Lock Password -Parental lock password incorrect. -Parental lock disabled. -Build Options: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume -Confirm video mode change? -Cache Game List (HDD) -PS1 Games -PS1 Games display mode -POPSTARTER.ELF not found at '%s'! -VCD file '%s' not found! -An error occurred while renaming the file. -An error occurred while deleting the file. -Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +BluetoothアダプタはDS3 / DS4コントローラをサポートしています +BluetoothアダプタはDS3 / DS4コントローラをサポートしていません +マルチタップエミュレーションを有効 +選択したゲームのマルチタップエミュレーションをオン/オフにします +マルチタップエミュレータのポート +マルチタップエミュレーション用のポートを選択 +フェイクDS3に対する回避策を無効 +いくつかのフェイクDS3は回避策を必要ですが、このオプションはそれを無効にします +FIELD反転をエミュレートする +プログレッシブビデオモードでグリッチするゲームを修正しました +パレンタルロック設定 +パレンタルロックパスワード +パレンタルロックを無効にするには空白のままにします +パレンタルロックパスワードを入力してください +パレンタルロックのパスワードが正しくありません +パレンタルロックは無効です +ビルドオプション: +エラー - このパスワードは使用できません +VMC %s ファイルは破損しています。 スロット %d のメモリカードに保存しますか? +オーディオ設定 +効果音を有効にする +起動音を有効にする +効果音の音量 +起動音の音量 +ビデオモードの変更を確認しますか? +ゲームリストをキャッシュ(HDD) +PS1 ゲーム +PS1 ゲーム 画面モード +POPSTARTER.ELFが '%s'に見つかりません! +VCDファイル '%s'が見つかりません! +ファイルの名前変更中にエラーが発生しました +ファイルの削除中にエラーが発生しました +OPEN-PS2-LOADER(OPL)を決して購入しないで、無料で入手してください +psx-scene.comでのifcaro OPLバージョン +ps2-home.comでのOPLデイリービルド(DB)バージョン \ No newline at end of file From 9fc21886166b2db086c2cec86a9b74e76fb2f97b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 30 Mar 2019 21:31:25 -0700 Subject: [PATCH 165/269] update lang files --- lng/lang_French.lng | 82 ++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 3f6def15f..6a0630d49 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,5 +1,5 @@ -# Translation by machiavel -# Last update: Feb. 17, 2019 +# Translation by machiavel and Squall +# Last update: March 29, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French @@ -26,7 +26,7 @@ Annuler mise à jour? %d: HDD non détecté %d: HDD non formaté %d: Erreur démarrage réseau -%d: adaptateur réseau non détecté +%d: Adaptateur réseau non détecté %d: Ne peut se connecter au serveur SMB %d: Ne peut s'authentifier au serveur SMB %d: Ne peut ouvrir le partage SMB @@ -34,10 +34,10 @@ Annuler mise à jour? %d: Ne peut lister les jeux %d: Serveur DHCP indisponible %d: Pas de connexion réseau -On -Off +Acti. +Désa. OK -Select +Sélect Annuler Cercle Croix @@ -109,15 +109,15 @@ Bouton de sélection Erreur, le jeu est fragmenté Erreur, impossible de lancer l'objet Tester -Laisser vide pour authentification invité +Laissez vide pour authentification invité Lecture précise (simule la vitesse de lecture du CD/DVD) Mode synchrone (mode de lecture alternatif) Décrocher Syscalls (purge OPL après lancement du jeu) Passer les vidéos Émuler DVD-DL (DVD9 rippés en DVD5) Désactiver IGR (incompatible avec certains jeux) -Unused -Unused +Inutilisé +Inutilisé Changer la taille reformatera la VMC Créer Démarrer @@ -146,11 +146,11 @@ Mode vidéo Couleur dialogue Couleur sélectionné Afficher page d'infos -Infos. +Info ELF personnalisé Sélection de la couleur Reconnecter -Laisser vide pour lister les partages +Laissez vide pour lister les partages Préfixe du chemin ETH Effacer Espace @@ -221,14 +221,14 @@ Sélectionner le mode de PADEMU. DualShock3/4 USB DualShock3/4 BT Options du port: -SSélectionner le port PADEMU pour les options. +Sélectionner le port PADEMU pour les options. Activer l'émulation Active/désactive PADEMU pour ce port. Activer la vibration Active/désactive la vibration pour le port PADEMU sélectionné. Adress MAC de l'adapteur Bluetooth USB: Contrôleur DS appairé à l'adresse MAC: -Apairer +Appairer Appairer contrôleur DS Appairer contrôleur DS avec l'adresse MAC de l'adaptateur Bluetooth. Non Connecté @@ -241,37 +241,37 @@ Fonctions supportées: Oui Non L'adaptateur Bluetooth devrait être parfaitement compatible avec les contrôleurs DS3/DS4. -L'adaptateur Bluetooth peut ne pas fonctionner correctement avec les contrôleurs DS3/DS4 +L'adaptateur Bluetooth peut ne pas fonctionner correctement avec les contrôleurs DS3/DS4. Activer l'émulation du Multitap Active/désactive l'émulation du Multitap pour le jeu sélectionné. Émulateur Multitap sur le port -Sélectionner le port pour émuler le Multitap +Sélectionnez le port pour émuler le Multitap Désactiver correctif des DS3 simulées Certaines DS3 simulées nécessitent ce correctif, cette option le désactivera. -Emulate FIELD flipping -Fix for games that glitch under progressive video modes. -Parental Lock Settings -Parental Lock Password -Leave blank to disable the parental lock. -Enter Parental Lock Password -Parental lock password incorrect. -Parental lock disabled. -Build Options: -Error - this password cannot be used. -VMC %s file is fragmented. Continue with Memory Card in slot %d? -Audio Settings -Enable Sound Effects -Enable Boot Sound -Sound Effects Volume -Boot Sound Volume -Confirm video mode change? -Cache Game List (HDD) +Émuler FIELD flipping +Fix pour les jeux qui glitch sous les modes vidéo progressifs. +Contrôle parental +Mot de passe du contrôle parental +Laissez vide pour désactiver le contrôle parental. +Entrez le mot de passe du contrôle parental +Le mot de passe du contrôle parental est incorrect. +Contrôle parental désactivé. +Options du Build: +Erreur - ce mot de passe ne peut pas être utilisé. +Le fichier VMC %s est fragmenté. Continuer avec la carte mémoire dans le slot %d? +Paramètres audio +Activer les effets sonore +Activer le son de démarrage +Volume des effets sonore +Volume du son de démarrage +Confirmer le changement du mode vidéo? +Cache liste de jeu (HDD) PS1 Games -PS1 Games display mode -POPSTARTER.ELF not found at '%s'! -VCD file '%s' not found! -An error occurred while renaming the file. -An error occurred while deleting the file. -Never buy OPEN-PS2-LOADER (OPL), instead get it free at: -ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +Mode d'affichage des jeux PS1 +POPSTARTER.ELF non trouvé à '%s'! +Fichier VCD '%s' non trouvé! +Une erreur s'est produite lors du renommage du fichier. +Une erreur s'est produite lors de la suppression du fichier. +N'achetez jamais OPEN-PS2-LOADER (OPL), obtenez le gratuitement: +version ifcaro OPL sur psx-scene.com +version OPL Daily Builds (DB) sur ps2-home.com \ No newline at end of file From dda0845b58e64d7da76bb3197d31b149bec29389 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 24 Apr 2019 17:37:30 -0700 Subject: [PATCH 166/269] update lang files --- lng/lang_Vietnamese.lng | 277 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 lng/lang_Vietnamese.lng diff --git a/lng/lang_Vietnamese.lng b/lng/lang_Vietnamese.lng new file mode 100644 index 000000000..afb0ef293 --- /dev/null +++ b/lng/lang_Vietnamese.lng @@ -0,0 +1,277 @@ +# Translation by zidane89 +# Last update: April 22, 2019 +# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 +Vietnamese +OPL %s +Lưu thay đổi +Quay lại +Cấu hình mạng +Tùy chọn nâng cao + +Lưu các cài đặt... +Không lưu được cài đặt! +Thoát +Cài đặt +Menu +Trò chơi trên USB +Trò chơi trên HDD +Trò chơi qua ETH +Ứng dụng +Chủ đề +Ngôn ngữ +Tắt nguồn hệ thống. +Thoát khỏi trình duyệt? +Hủy bỏ các cập nhật? +%d: Không phát hiện ổ cứng +%d: Ổ cứng chưa định dạng +%d: Lỗi khởi chạy mạng +%d: Không có adaptor mạng +%d: Không thể kết nối đến SMB server +%d: Không thể đăng nhập vào SMB server +%d: Không mở được SMB share +%d: Không lấy được danh sách SMB shares +%d: Không lấy được danh sách trò chơi +%d: Máy chủ DHCP không có sẵn +%d: Không có kết nối mạng +Bật +Tắt +OK +Chọn +Hủy +Nút O +Nút X +Danh sách trò chơi +Cài đặt Game +Xóa mọi cài đặt +Removed all keys for the game +Cuộn +Chậm +Thường +Nhanh +Menu mặc định +Nạp từ đĩa +Vui lòng chờ +Lỗi khi nạp Game ID +Tự động phân loại +Lỗi nạp tập tin ngôn ngữ +Ngắt màu Debug +Không có cần điều khiển, đợi chút... +Bật Cover Art +Màn hình rộng +Tắt máy +Nạp cấu hình +Lưu cấu hình +Chọn thiết bị lưu trò chơi +Làm mới +Chọn USB +Chọn HDD +Chọn ETH +Hiển thị menu ứng dụng +Tự động +Thủ công +Khởi chạy máy chủ HDL +Máy chủ HDL khởi chạy... +Máy chủ HDL đang chạy... +khởi chạy máy chủ HDL thất bại. +Không nạp được máy chủ HDL... +Vá IGR +Màu nền +Màu chữ +- PS2 - +- SMB Server - +Gõ địa chỉ IP +Tĩnh +Động +Địa chỉ IP +Địa chỉ +Mask +Gateway +DNS Server +Cổng +Share +Tên +Mật khẩu + +Gõ địa chỉ +IP +NetBIOS +Truy cập +Mục này sẽ bị xóa vĩnh viễn, tiếp tục? +Đổi tên +Xóa +Chạy +Cài đặt hiển thị +Kích hoạt thao tác ghi +Kiểm tra phân mảnh trò chơi trên USB +Nhớ các cài đặt cuối cùng +Chọn nút +Lỗi, trò chơi bị phân mảnh +Error, không thể chạy mục này +Kiểm tra +Để trống với quyền truy cập Khách. +Đọc chính xác +Chế độ đồng bộ +Unhook Syscalls +Bỏ qua các Video +Giả lập DVD-DL +Ngắt IGR +Không dùng +Không dùng +Thay đổi dung lượng sẽ định dạng lại VMC +Tạo +Bắt đầu +Sửa đổi +Hủy +Cài lại +Sử dụng chung +Cấu hình VMC +Tên +Dung lượng +Trạng thái +Tiến hành +File VMC không tồn tại +File VMC không hợp lệ, Dung lượng không đúng +File VMC cần được tạo +Lỗi với VMC %s, tiếp tục với thẻ save thật (khe %d) ? +Tự động làm tươi +Thông tin +Coders +Đảm bảo chất lượng +USB prefix path +Boots Custom ELF after an IGR +Giá trị tính bằng phút(s), 0 tắt chế độ chờ HDD +HDD tự động chờ +Chế độ Video +Màu hộp thoại +Chọn màu +Hiển thị trang thông tin trò chơi +Thông tin +Tùy chỉnh ELF +Màu sắc lựa chọn +Kết nối lại +Leave empty to list shares +ETH prefix path +Xóa +Cách +Enter +Chế độ +VMC ở Khe 1 +VMC ở Khe 2 +Game ID +Chế độ DMA +V-Sync +Mode 1 +Mode 2 +Mode 3 +Mode 4 +Mode 5 +Mode 6 +Mode 7 +Mode 8 +Cấu hình GSM +Ethernet link mode +100Mbit full-duplex +100Mbit half-duplex +10Mbit full-duplex +10Mbit half-duplex +Cài đặt GSM +Bật GSM +Bật hoặc tắt GSM +VMODE +Chế độ hiển thị tùy chỉnh bắt buộc +H-POS +Điều chỉnh theo chiều ngang +V-POS +Điều chỉnh theo chiều dọc +Overscan +Overscan Adjustment +Bỏ qua FMV +Bỏ qua Full Motion Videos +Cài đặt Cheat +Bật PS2RD Cheat Engine +Hãy để PS2RD Cheat Engine vá vào trò chơi +Chế độ PS2RD Cheat Engine +Tự động chọn hoặc chọn trò chơi ăn gian +Tự động chọn cheats +Chọn cheats trò chơi +Lỗi: nạp tệp ăn gian thất bại +Không thấy cheat +Tải về mặc định +Network Update +Tải lại hồ sơ hiện có? +Cập nhật thất bại. +Không thể kết nối đến máy chủ để cập nhật. +Cập nhật hoàn thành. +Hủy cập nhật. +Tải về cài đặt qua mạng? +Cài đặt tùy chỉnh +Tải về mặc định +Tự khởi động trong %i s... +Tự khởi động +đơn vị bằng giây(s), 0 để ngắt tự khởi động +Logo PS2 +Chỉ hiển thị logo phù hợp với phân vùng máy +Cấu hình PADEMU +Cài đặt giả lập tay cầm +Bật PadEmulator +Bật/tắt PadEmulator cho trò chơi đã chọn. +Chế độ Pad Emulator +Chọn chế độ Pad Emulator. +DualShock3/4 USB +DualShock3/4 BT +Cài đặt cổng: +Chọn cổng cài đặt Pad Emulator. +Bật giả lập +Bật/tắt Pad Emulator cổng đã chọn. +Bật rung +Bật/tắt rung Pad Emulator cho cổng đã chọn. +Địa chỉ MAC của USB Bluetooth: +Địa chỉ MAC của tay DS: +Ghép +Ghép tay DS +Ghép tay DS với Bluetooth adapter MAC address. +Không kết nối +Thông tin Bluetooth adapter +Hiện thông tin và tính năng hỗ trợ +Phiên bản HCI: +Phiên bản LMP: +Manufacturer ID: +Tính năng hỗ trợ: +Yes +No +Bluetooth adapter phải tương thích với tay cầm DS3/DS4. +Bluetooth adapter có thể không hoạt động chính xác với tay cầm DS3/DS4. +Bật giả lập Multitap +Bật/tắt giả lập Multitap cho trò chơi đã chọn. +Giả lập Multitap tại cổng +Chọn cổng giả lập Multitap. +Ngắt workaround để fake DS3 +Fake ds3s cần workaround, Tùy chọn này sẽ ngắt nó. +Emulate FIELD flipping +Khắc phục các game bị trục trặc trong chế độ progressive modes. +Cài đặt khóa phụ huynh +Mật khẩu khóa +Để trống để vô hiệu hóa khóa phụ huynh. +Nhập mật khẩu +Mật khẩu khóa không chính xác. +Khóa phụ huynh bị vô hiệu hóa. +Tùy chọn Build: +Lỗi - mật khẩu này không thể sử dụng. +Tệp VMC %s bị phân mảnh. Tiếp tục với MC ở khe %d? +Cài đặt âm thanh +Bật hiệu ứng âm thanh +Tăng cường âm lượng +Mức hiệu ứng âm thanh +Tăng mức âm lượng +Thay đổi chế độ video? +Cache danh sách trò chơi (HDD) +Các trò chơi PS1 +Chế độ hiển thị cho game PS1 +POPSTARTER.ELF không có ở '%s'! +Tập tin VCD không thấy '%s' ! +Xảy ra lỗi trong khi đổi tên tập tin. +Đã xảy ra lỗi trong khi xóa tệp. +Không bao giờ mua OPEN-PS2-LOADER (OPL), nó luôn miễn phí tại: +ifcaro OPL version at psx-scene.com +OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file From 5c94baf1ec2a76291b65c35b05c74294f5cd7f3e Mon Sep 17 00:00:00 2001 From: Jay-Jay Date: Mon, 3 Jun 2019 10:17:32 -0700 Subject: [PATCH 167/269] Possible fix for HDD spindown in POPS (#16) --- src/elmsupport.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/elmsupport.c b/src/elmsupport.c index 7211830cd..f98a61e89 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -534,12 +534,24 @@ static void elmLaunchItem(int id, config_set_t* configSet) { LOG("memPath = %s\n",memPath); LOG("params = %s\n",params); - - //To keep the necessary device accessible, we will assume the mode that owns the device which contains the file to boot. - int mode = oplPath2Mode(cur->file); - if (mode < 0) { - mode = ELM_MODE; - LOG("ELMSUPPORT warning: cannot find mode for path: %s\n", cur->file); + LOG("VCD Path= %s", cur->file); + + int mode = ELM_MODE; + + // Figure out in what device the VCD is at. This is necessary to avoid the device to be unmounted. + if (strncmp(cur->file,"mass", 4) == 0){ + mode = USB_MODE; + } else if (strncmp(cur->file,"hdd", 3) == 0){ + mode = HDD_MODE; + } else if (strncmp(cur->file,"smb", 3) == 0){ + mode = ETH_MODE; + } + + if (mode == ELM_MODE) { + // Failed to detect the device... + LOG("ELMSUPPORT warning: cannot find mode for path: %s\n", cur->file); + } else { + LOG("ELMSUPPORT Mode detected as: ", mode); } deinit(UNMOUNT_EXCEPTION, mode); // CAREFUL: deinit will call elmCleanUp, so configElm/cur will be freed From 87f4a1953c130b5c86f4b9efd6f463ca2e4cf6ea Mon Sep 17 00:00:00 2001 From: Daniel Sousa Date: Mon, 3 Jun 2019 23:45:02 +0100 Subject: [PATCH 168/269] Refresh elm page (#17) Also added vscode folder to gitignore --- .gitignore | 5 +++++ include/opl.h | 3 +++ src/elmsupport.c | 12 ++++++++---- src/opl.c | 22 ++++++++++++++++++++++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 0907f7349..d987b8afb 100755 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,8 @@ DETAILED_CHANGELOG # pc/iso2usbld/bin/iso2usbld IOPRP_img.c + +# START of OPL_DB tweaks +# Visual Studio Code folder +.vscode +#END of OPL_DB tweaks \ No newline at end of file diff --git a/include/opl.h b/include/opl.h index 959d34509..98ef0587d 100644 --- a/include/opl.h +++ b/include/opl.h @@ -69,6 +69,9 @@ int oplPath2Mode(const char *path); int oplGetAppImage(const char *device, char *folder, int isRelative, char *value, char *suffix, GSTEXTURE *resultTex, short psm); int oplScanApps(int (*callback)(const char *path, config_set_t *appConfig, void *arg), void *arg); int oplShouldAppsUpdate(void); +//START of OPL_DB tweaks +int oplShouldElmUpdate(void); +//END of OPL_DB tweaks void setErrorMessage(int strId); void setErrorMessageWithCode(int strId, int error); diff --git a/src/elmsupport.c b/src/elmsupport.c index f98a61e89..2fb9e79e3 100644 --- a/src/elmsupport.c +++ b/src/elmsupport.c @@ -104,15 +104,19 @@ item_list_t* elmGetObject(int initOnly) { } static int elmNeedsUpdate(void) { + int update; + + update = 0; if (elmForceUpdate) { elmForceUpdate = 0; - return 1; + update=1; } - if (elmGameList == NULL) - return 1; + if(oplShouldElmUpdate()){ + update = 1; + } - return 0; + return update; } //Scans for POPSTARTER.ELF and VCD files in the given devPrefix. diff --git a/src/opl.c b/src/opl.c index d2da650e1..187a92cf2 100644 --- a/src/opl.c +++ b/src/opl.c @@ -81,6 +81,10 @@ typedef struct //App support stuff. static unsigned char shouldAppsUpdate; +//START of OPL_DB tweaks +static unsigned char shouldElmUpdate; +//END of OPL_DB tweaks + //Network support stuff. #define HTTP_IOBUF_SIZE 512 static unsigned int CompatUpdateComplete, CompatUpdateTotal; @@ -505,6 +509,18 @@ int oplShouldAppsUpdate(void) return result; } +//START of OPL_DB tweaks +int oplShouldElmUpdate(void) +{ + int result; + + result = (int)shouldElmUpdate; + shouldElmUpdate = 0; + + return result; +} +//END of OPL_DB tweaks + // ---------------------------------------------------------- // ----------------------- Updaters ------------------------- // ---------------------------------------------------------- @@ -567,6 +583,12 @@ void menuDeferredUpdate(void *data) //If other modes have been updated, then the apps list should be updated too. if (*mode != APP_MODE) shouldAppsUpdate = 1; + + //START of OPL_DB tweaks + //If other modes have been updated, then the elm list should be updated too. + if (*mode != ELM_MODE) + shouldElmUpdate = 1; + //END of OPL_DB tweaks } } From df383aec6b8ee8667d096a0de6f186064fd98abc Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 29 Jun 2019 01:26:02 -0700 Subject: [PATCH 169/269] update lang files --- lng/lang_Persian.lng | 534 +++++++++++++++++++++---------------------- 1 file changed, 267 insertions(+), 267 deletions(-) diff --git a/lng/lang_Persian.lng b/lng/lang_Persian.lng index b1fbb7d35..cfadd9059 100644 --- a/lng/lang_Persian.lng +++ b/lng/lang_Persian.lng @@ -1,277 +1,277 @@ # Translation by saeid0035 -# Last update: Jan. 30, 2019 +# Last update: June 29, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s -ذخیره تغییرات -برگشت -پیکربندی شبکه -تنظیمات پیشرفته -<بدون مقدار> -تنظیمات ذخیره شد... -در نوشتن تنظیمات مشکلی پیش آمد! -خروج -تنظیمات -منو -بازی های فلش مموری -بازی های هارد -بازی های در شبکه -برنامه ها -پوسته ها -زبان ها -سیستم بزودی خاموش میشود. -میخواهید به منوی مرورگر اصلی دستگاه برگردید؟ -آپدیت لغو شود؟ -%d: درایو هارد دیسک شناسایی نشد -%d: درایو هارد دیسک فرم:نشده -%d: راه اندازی شبکه با مشکل مواجه شد -%d: هیچ آداپتور شبکه ای شناسایی نشد -%d: متصل شدن به سرور SMB موفقیت آمیز نبود -%d: وارد شدن به سرور SMB موفقیت آمیز نبود -%d: بازکردن اشتراک SMB موفقیت آمیز نبود -%d: لیست کردن اشترک های SMB موفقیت آمیز نبود -%d: لیست کردن بازی ها موفقیت آمیز نبود -%d: سرور DHCP در دسترس نیست -%d: هیچ اتصال شبکه ای در دسترس نیست -روشن -خاموش -حله -انتخاب -لغو -دایره -ضربدر -لیست بازی ها -تنظیمات بازی -حذف تمامی تنظیمات -تمام کلید های بازی پاک شد -سرعت اسکرول -آهسته -متوسط -سریع -منوی پیشفرض -بارگذاری از دیسک -لطفا منتظر بمانید -در بارگذاری آیدی بازی مشکلی پیش آمده -چینش خودکار -در بارگذاری فایل زبان مشکلی پیش آمده -غیرفعال کردن رنگ های مشکل زدایی -هیچ کنترلری شناسایی نشد، منتظر بمانید... -فعال کردن تصویر کاور -صفحه ی کشید -خاموش کردن کنسول -درحال بارگذاری پیکربندی -درحال ذخیره ی پیکربندی -شروع دیوایس -تازه سازی -حالت شروع فلش مموزی -حالت شروع هارد دیسک -حالت شروع تحت شبکه -حالت نمایش منو برنامه ها -خودکار -دستی -شروع سرور HDL -سرور HDL درحال راه اندازی میباشد... -سرور HDL درحال اجرا میباشد... -شروع سرور HDL شکست خورد. -سرور HDL بارگذاری نمیشود... -مسیر IGR -رنگ پس زمینه -رنگ متن -- پلی استیشن ۲ - -- سرور SMB - -حالت آدرس آیپی -Static +ذﺧﻴﺮه ﺗﻐﻴﻴﺮات +ﺑﺮﮔﺸﺖ +ﭘﻴﻜﺮﺑﻨﺪی ﺷﺒﻜﻪ +ﮔﺰﻴﻨﻪ ﻫﺎی ﭘﻴﺸﺮﻓﺘﻪ +<ﺑﺪون ﻣﻘﺪار> +ﺗﻨﻈﻴﻤﺎت ذﺧﻴﺮه ﺷﺪ... +در ﻧﻮﺷﺘﻦ ﺗﻨﻈﻴﻤﺎت ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪ! +ﺧﺮوج +ﺗﻨﻈﻴﻤﺎت +ﻣﻨﻮ +ﺑﺎزی ﻫﺎی USB +ﺑﺎزی ﻫﺎی HDD +ﺑﺎزی ﻫﺎی ETH +ﺑﺮﻧﺎﻣﻪ ﻫﺎ +ﭘﻮﺳﺘﻪ +زﺑﺎن +ﺳﻴﺴﺘﻢ ﺑﺰودی ﺧﺎﻣﻮش ﻣﻲ ﺷﻮد. +ﺧﺮوج ﺑﻪ ﻣﺮورﮔﺮ؟ +آﭘﺪﻳﺖ ﺷﺪن ﻟﻐﻮ ﺷﻮد؟ +%d: دراﻳﻮ ﻫﺎرد دﻳﺴﮏ ﺗﺸﺨﻴﺺ داده ﻧﺸﺪ +%d: دراﻳﻮ ﻫﺎرد دﻳﺴﮏ ﻓﺮﻣﺖ ﻧﺸﺪه اﺳﺖ +%d: راه اﻧﺪازی ﺷﺒﻜﻪ ﺑﺎ ﻣﺸﻜﻞ ﻣﻮاﺟﻪ ﺷﺪ +%d: ﻫﻴﭻ آداﭘﺘﻮر ﺷﺒﻜﻪ ای ﻳﺎﻓﺖ ﻧﺸﺪ +%d: اﺗﺼﺎل ﺑﻪ ﺳﺮور SMB اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ +%d: ورود ﺑﻪ ﺳﺮور SMB اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ +%d: ﺑﺎزﻛﺮدن اﺷﺘﺮاک SMB اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ +%d: ﺑﺎزﻛﺮدن اﺷﺘﺮاک ﻫﺎی SMB اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ +%d: ﻟﻴﺴﺖ ﻛﺮدن ﺑﺎزی ﻫﺎ اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ +%d: ﺳﺮور DHCP در دﺴﺘﺮس ﻧﻴﺴﺖ +%d: ﻫﻴﭻ اﺗﺼﺎل ﺷﺒﻜﻪ ای وﺟﻮد ﻧﺪارد +روﺷﻦ +ﺧﺎﻣﻮش +ﺣﻠﻪ +اﻧﺘﺨﺎب +ﻟﻐﻮ +داﻳﺮه +ﺿﺮﺑﺪر +ﻟﻴﺴﺖ ﺑﺎزی ﻫﺎ +ﺗﻨﻈﻴﻤﺎت ﺑﺎزی ﻫﺎ +ﭘﺎک ﻛﺮدن ﺗﻤﺎم ﺗﻨﻈﻴﻤﺎت +ﭘﺎک ﻛﺮدن ﺗﻤﺎم ﻛﻠﻴﺪ ﻫﺎی ﺑﺎزی +ﺳﺮﻋﺖ اﺳﻜﺮول +آﻫﺴﺘﻪ +ﻣﻌﻤﻮﻟﻲ +ﺳﺮﻳﻊ +ﻣﻨﻮ ﭘﻴﺸﻔﺮض +ﺑﺎرﮔﺰاری از دﻳﺴﮏ +ﻟﻄﻔﺎ ﻣﻨﺘﻈﺮ ﺑﻤﺎﻨﻴﺪ +در ﻫﻨﮕﺎم ﺑﺎرﮔﺬاری ﺷﻨﺎﺳﻪ ﺑﺎزی ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه +ﺗﺮﺗﻴﺐ دادن ﺧﻮدﻛﺎر +درﻫﻨﮕﺎم ﺑﺎرﮔﺬاری ﻓﺎﻴﻞ زﺑﺎن ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪ +ﻏﻴﺮﻓﻌﺎل ﻛﺮدن رﻧﮓ ﻫﺎی ﻣﺸﻜﻞ ﮔﺸﺎﻳﻲ +ﻫﻴﭻ ﻛﻨﺘﺮﻟﺮی ﭘﻴﺪا ﻧﺸﺪ ﻣﻨﺘﻈﺮ ﺑﻤﺎﻧﻴﺪ... +ﻓﻌﺎل ﻛﺮدن ﻛﺎور ﺑﺎزی ﻫﺎ +ﺻﻔﺤﻪ ﻛﺸﻴﺪه +ﺧﺎﻣﻮش ﻛﺮدن +درﺣﺎل ﺑﺎرﮔﺬاری ﭘﻴﻜﺮﺑﻨﺪی +درﺣﺎل ذﺧﻴﺮه ﭘﻴﻜﺮﺑﻨﺪی +دﺳﺘﮕﺎه ﺷﺮوع ﻛﻨﻨﺪه +ﺗﺎزه ﺳﺎزی +ﺣﺎﻟﺖ ﺷﺮوع دﺳﺘﮕﺎه USB +ﺣﺎﻟﺖ ﺷﺮوع دﺳﺘﮕﺎه HDD +ﺣﺎﻟﺖ ﺷﺮوع دﺳﺘﮕﺎه ETH +ﻧﺸﺎن دادن ﻣﻨﻮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ +ﺧﻮدﻛﺎر +دﺳﺘﻲ +ﺷﺮوع ﺳﺮور HDL +ﺳﺮور HDL درﺣﺎل راه اﻧﺪازی ﻣﻴﺒﺎﺷﺪ... +ﺳﺮور HDL درﺣﺎل اﺟﺮا ﻣﻴﺒﺎﺷﺪ... +راه اﻧﺪازی ﺳﺮور HDL ﺷﻜﺴﺖ ﺧﻮرد. +ﺳﺮور HDL درﺣﺎل ﺗﺨﻠﻴﻪ ﻣﻴﺒﺎﺷﺪ... +ﻣﺴﻴﺮ IGR +رﻧﮓ ﭘﺲ زﻣﻴﻨﻪ +رﻧﮓ ﻣﺘﻮن +- ﭘﻠﻲ اﺳﺘﻴﺸﻦ 2 - +- ﺳﺮور SMB - +ﻧﻮع آدرس آﻳﭙﻲ +اﻳﺴﺘﺎ DHCP -آدرس آیپی +آدرس آﻳﭙﻲ آدرس -Mask -Gateway -سرور DNS -پورت -اشتراک -نام کاربری -رمز عبور -<تنظیم نشده> -حالت آدرس -آیپی +ﭘﻮﺷﺶ +دروازه +ﺳﺮور DNS +ﭘﻮرت +اﺷﺘﺮاک +ﻧﺎم ﻛﺎرﺑﺮی +ﻛﻠﻤﻪ ﻋﺒﻮر +<ﺗﻌﻴﻴﻦ ﻧﺸﺪه> +ﻧﻮع آدرس +آﻳﭙﻲ NetBIOS -پذیزش -آیتم بصورت کامل پاک میشود، ادامه میدهید؟ -تغییر نام -پاک کردن -اجرا -تنظیمات نمایش -فعال کردن سیستم نوشتن -چک کردن بهم ریختگی بازی های فلش مموری -به خاطر سپردن آخرین بازی انجام شده -دکمه انتخاب کردن -مشکلی پیش آمده، فایل هلی بازی بهم ریخته میباشد -مشکلی پیش آمده، این آیتم اجرا نمیشود -تست -برای ورود بصورت ناشناس خالی بگذارید. +ﭘﺬﻳﺮﻓﺘﻦ +آﻳﺘﻢ ﺑﻄﻮر ﻛﺎﻣﻞ ﭘﺎک ﻣﻴﺸﻮد اداﻣﻪ ﻣﻴﺪﻫﻴﺪ؟ +ﺗﻐﻴﻴﺮﻧﺎم +ﭘﺎک ﻛﺮدن +اﺟﺮا +ﺗﻨﻈﻴﻤﺎت ﻧﻤﺎﻳﺸﮕﺮ +ﻓﻌﺎل ﻛﺮدن اﺟﺎزه ﻧﻮﺷﺘﻦ +ﭼﮏ ﻛﺮدن ﺑﻬﻢ رﻳﺨﺘﮕﻲ ﺑﺎزی ﻫﺎی USB +ﺑﻪ ﻳﺎد داﺷﺘﻦ آﺧﺮﻳﻦ ﺑﺎزی اﻧﺟﺎم ﺷﺪه +دﻛﻤﻪ ی اﻧﺘﺨﺎب +ﻣﺸﻜﻠﻲ ﺑﻪ وﺟﻮد آﻣﺪه ﻓﺎﻳﻞ ﻫﺎی ﺑﺎزی ﺑﻪ ﻫﻢ رﻳﺨﺘﻪ اﺳﺖ +ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه اﺟﺮای آﻳﺘﻢ اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ +ﺗﺴﺖ +ﺑﺮای ورود ﺑﻪ ﺻﻮرت ﻧﺎﺷﻨﺎس ﺧﺎﻟﻲ ﺑﮕﺬارﻳﺪ. Accurate Reads -Synchronous Mode -Unhook Syscalls -پرش از ویدیو ها -شبیه سازی DVD-DL -غیرفعال کردن IGR -Unused -Unused -درحال تغییر سایز در هنگام فرمت مجدد VMC -ساختن -شروع -ساختن -رها کردن -بازگردانی -Use generic -پیکربندی VMC -نام -سایز -وضعیت -پیشرفت -فایل VMC موجود است -فایل VMC نامعتبر است، سایز وارد شده اشتباست -فایل VMC نیاز به ساخته شدن دارد -در فایل VMC مشکلی پیش آمده %s، با سیو فیزیکی خود ادامه میدهید (درگاه %d) ؟ -تازه سازی خودکار -درباره -توسعه دهندگان -Quality Assurance -مسیر ترجیحی USB -اجرای فایل ELF سفارشی بعد از IGR -مقدار در دقیقه، صفر برای غیرفعال کردن کاهش چرخش -کاهش چرخش خودکار هارد دیسک -حالت ویدیو -رنگ دیالوگ ها -رنگ انتخاب شده -نشان دادن صفحه اطلاعات -اطلاعات -فایل ELF سفارشی -انتخاب رنگ -اتصال مجدد -برای لیست اشتراک ها خالی بگذارید -مسیر ترجیخی بازی های تحت شبکه -پاک کردن -فاصله -اینتر -حالت -درگاه VMC ۱ -درگاه VMC ۲ -آیدی بازی -حالت DMA +ﺣﺎﻟﺖ Synchronous +ﺑﺎزﻛﺮدن Syscalls +رد ﻛﺮدن وﻳﺪﻳﻮ ﻫﺎ +ﺷﺒﻴﻪ ﺳﺎزی DVD-DL +ﻏﻴﺮﻓﻌﺎل ﻛﺮدن IGR +اﺳﺘﻔﺎده ﻧﺸﺪه +اﺳﺘﻔﺎده ﻧﺸﺪه +ﺗﻐﻴﻴﺮ اﻧﺪازه ﻛﺎرت ﺣﺎﻓﻈﻪ ی ﻣﺟﺎزی را ﻓﺮﻣﺖ ﻣﻴﻜﻨﺪ +ﺳﺎﺧﺘﻦ +ﺷﺮوع +ﺗﻐﻴﺮ دادن +ﻗﻄﻊ ﻛﺮدن +ﺑﺎز ﻧﺸﺎﻧﺪن +اﺳﺘﻔﺎده از generic +ﭘﻴﻜﺮﺑﻨﺪی ﺣﺎﻓﻈﻪ ﻣﺟﺎزی +ﻧﺎم +اﻧﺪازه +وﺿﻌﻴﺖ +ﭘﻴﺸﺮﻓﺖ +ﻓﺎﻳﻞ ﺣﺎﻓﻈﻪ ﻣﺟﺎزی ﻣﻮﺟﻮد اﺳﺖ +ﻓﺎﻳﻞ ﺣﺎﻓﻈﻪ ﻣﺟﺎزی ﻧﺎﻣﻌﺘﺒﺮ اﺳﺖ اﻧﺪازه درﺳﺖ ﻧﻴﺴﺖ +ﻓﺎﻳﻞ ﺣﺎﻓﻈﻪ ﻣﺟﺎزی ﻧﻴﺎز ﺑﻪ ﺳﺎﺧﺘﻪ ﺷﺪن دارد +ﻣﺸﻜﻠﻲ ﺑﺮای ﺣﺎﻓﻈﻪ ﻣﺟﺎزی %s ﺑﻪ وﺟﻮد آﻣﺪه, ﺑﺎ ﺣﺎﻓﻈﻪ ی ﻓﻴﺰﻳﻜﻲ اداﻣﻪ ﻣﻴﺪﻫﻴﺪ (درﮔﺎه %d) ؟ +ﺗﺎزه ﺳﺎزی ﺧﻮدﻛﺎر +درﺑﺎره +ﺑرﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن +ﺗﺴﺖ ﻛﻴﻔﻴﺖ +ﻣﺴﻴﺮ ﺗﺮﺟﻴﺤﻲ USB +اﺟﺮای ﻓﺎﻳﻞ ELF ﺳﻔﺎرﺷﻲ ﺑﻌﺪ از IGR +ﻣﻘﺪار در دﻗﻴﻘﻪ, 0 ﺑﺮای ﭼﺮﺧﺶ ﭘﺎﻳﻴﻦ +ﻛﺎﻫﺶ ﭼﺮﺧﺶ ﺧﻮدﻛﺎر HDD +ﺣﺎﻟﺖ وﻳﺪﻳﻮ +رﻧﮓ دﻳﺎﻟﻮگ ﻫﺎ +رﻧﮓ اﻧﺘﺨﺎب ﺷﺪه ﻫﺎ +ﻧﺸﺎن دادن ﺻﻔﺤﻪ اﻃﻠﺎﻋﺎت +اﻃﻠﺎﻋﺎت +ﻓﺎﻳﻞ ELF ﺳﻔﺎرﺷﻲ +اﻧﺘﺨﺎب رﻧﮓ +اﺗﺼﺎل ﻣﺠﺪد +ﺑﺮای ﻟﻴﺴﺖ ﻛﺮدن اﺷﺘﺮاک ﻫﺎ ﺧﺎﻟﻲ ﺑﮕﺬارﻳﺪ +ﻣﺴﻴﺮ ﺗﺮﺟﻴﺤﻲ ETH +ﭘﺎک ﻛﺮدن +ﻓﺎﺻﻠﻪ +اﻳﻨﺘﺮ +ﺣﺎﻟﺖ +درﮔﺎه ﺣﺎﻓﻈﻪ ﻣﺟﺎزی 1 +درﮔﺎه ﺣﺎﻓﻈﻪ ﻣﺟﺎزی 2 +ﺷﻨﺎﺳﻪ ﺑﺎزی +ﺣﺎﻟﺖ DMA V-Sync -حالت ۱ -حالت ۲ -حالت ۳ -حالت ۴ -حالت ۵ -حالت ۶ -حالت ۷ -حالت ۸ -پیکربندی GSM -Ethernet link mode -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex -تنظیمات GSM -فعال کردن GSM -روشن یا خاموش کردن GSM -حالت ویدیو -اجباری کردن حالت نمایش سفارشی -H-POS -Horizontal Adjustment -V-POS -Vertical Adjustment -Overscan -Overscan Adjustment -FMV Skip -Skips Full Motion Videos -تنظیمات کد های تقلب -فعال کردن موتور تقلب PS2RD -بزن بریم تا PS2RD بازی های شمارو پچ کنه -حالت موتور تقلب PS2RD -انتخاب خودکار یا انتخاب دستی کد های تقلب بازی -انتخاب خودکار کد های تقلب -انتخاب دستی کد های تقلب -مشکلی پیش آمده: بارگذاری فایل کد های تقلب شکست خورد -هیچ کد تقلبی موجود نیست -دانلود پیشفرض ها -آپدیت از طریق شبکه -دانلود مجدد فایل های موجود؟ -آپدیت شکست خورپ. -اتصال به سرور آپدیت ها شکست خورد. -آپدیت تکمیل شد. -آپدیت لغو شد. -دانلود تنظیمات از اینترنت؟ -تنظیمات شخصی سازی شده -پیشفرض ها دانلود شدند -بصورت خودکار در %i ثانیه دیگر شروع میشود... -شروع خودکار -مقدار بر حسب ثانیه،‌ برای غیرفعال کردن شروع خودکار ۰ بزارید -لوگو پلی استیشن ۲ -فقط برای یک دیسک معتبر که به ریجن کنسول هم هم خوانی داشته باشد نمایش داده میشود -پیکربندی PADEMU -تنظیمان شبیه ساز Pad -فعال کردن Pad -روشن یا خاموش کردن شبیه‌ساز Pad برای بازی های انتخاب شده. -حالت شبیه سازPad -حالت شبیه ساز Pad را انتخاب کنید. -کنترلر پلی استیشن ۳ یا ۴ از طریق درگاه usb -کنترلر پلی استیشن ۳ یا ۴ از طریق بلوتوث -تنظیمات برای پورت: -پورت شبیه ساز Pad را برای اعمال تنظیمات انتخاب کنید. -فعال کردن شبیه سازی -روشن و یا خاموش کردن شبیه ساز Pad برای پورت های انتخاب شده. -فعال کردن شوک -روشن و یا خاموش کردن شوک برای پورت های انتخاب شده در شبیه ساز Pad. -مک آدرس آداپتور بلوتوث داخل درگاه USB: -کنترلر با این مک آدرس جفت شد: -جفت کردن -جفت کردن کنترلر -جفت کردن کنترلر با مک آدرس آداپتور بلوتوث. -متصل نشد -اطلاعات آداپتور بلوتوث -نشان دادن اطلاعات بیشتر و ویژگی های پشتیبانی شده. -نسخه HCI: -نسخه LMP: -آیدی Manufacturer: -ویژگی های پشتیبانی: -بله -نه -آداپتور بلوتوث باید بطور کامل از کنترلر های پلی استیشن ۳ و ۴ پشتیبانی بکند. -مثل اینکه آداپتور بلوتوث بخوبی از کنترلر پشتیبانی نمیکند. -فعال کردن شبیه سازی زدن چند دکمه همزمان -روشن و یا خاموش کردن شبیه سازی زدن چند دکمه همزمان. -فعال کردن شبیه ساز زدن چند دکمه همزمان برای پورت -انتخاب پورت برای شبیه سازی زدن چند دکمه همزمان. -غیرفعال کردن workaround برای کنترلر های تقلبی پلی استیشن ۳ -برخی از کنترلر های تقلبی پلی استیشن ۳ به workaround نیاز دارند، این گزینه آن را غیرفعال میکند. -شبیه سازی FIELD flipping -برای حل مشکل گلیچ بعضی از بازی هاحین فعال بودن حالت ویدیویی progressive. -تنظیمات قفل والدین -کلمه عبور قفل والدین -برای غیرفعال کردن قفل والدین این گزینه را خالی بگذارید. -کلمه عبور قفل والدین را وارد کنید -کلمه عبور قفل والدین اشتباه است. -قفل والدین غیرفعال شد. -حالت های Build: -مشکلی پیش آمذه - نمیتوان از این پسورد استفاده کرد. -فایل VMC %s به هم ریخته شدن است. با سیو داخل درگاه %d ادامه میدهید؟ -تنظیمات صدا -فعال کردن افکت های صدا -فعال کرذن صدای بوت -میزان بلندی صدای افکت ها -میزان بلندی صدای بوت -Confirm video mode change? -Cache Game List (HD) -بازی های پلی استیشن ۱ -حالت نمایش بازی های پلی استیشن ۱ -فایل POPSTARTER.ELF در '%s'موجود نیست! -فایل VCD '%s' وجود ندارد! -در هنگام تغییر نام فایل مشکلی پیش آمده است. -در هنگام پاک کردن فایل مشکلی پیش آمده است. -هیچوقت OPEN-PS2-LOADER (OPL) را نخرید، میتوانید آن را از لینک پایین رایگان بگیرید: -نسخه ی ifcaro OPL در psx-scene.com -نسخه آپدیت روزانه ی OPL (DB) در ps2-home.com \ No newline at end of file +ﺣﺎﻟﺖ 1 +ﺣﺎﻟﺖ 2 +ﺣﺎﻟﺖ 3 +ﺣﺎﻟﺖ 4 +ﺣﺎﻟﺖ 5 +ﺣﺎﻟﺖ 6 +ﺣﺎﻟﺖ 7 +ﺣﺎﻟﺖ 8 +ﭘﻴﻜﺮﺑﻨﺪی GSM +ﺣﺎﻟﺖ ارﺗﺒﺎط اﻳﻨﺘﺮﻧﺖ +100 ﻣﮕﺎﺑﻴﺖ ﻛﺎﻣﻠﺎ ﻣﻀﺎﻋﻒ +100 ﻣﮕﺎﺑﻴﺖ ﻧﻴﻤﻪ ﻣﻀﺎﻋﻒ +10 ﻣﮕﺎﺑﻴﺖ ﻛﺎﻣﻠﺎ ﻣﻀﺎﻋﻒ +10 ﻣﮕﺎﺑﻴﺖ ﻧﻴﻤﻪ ﻣﻀﺎﻋﻒ +ﺗﻨﻈﻴﻤﺎت GSM +ﻓﻌﺎل ﻛﺮدن GSM +روﺷﻦ ﻳﺎ ﺧﺎﻣﻮش ﻛﺮدن GSM +ﺣﺎﻟﺖ وﻳﺪﻳﻮ +اﺟﺒﺎر ﺑﻪ ﻧﻤﺎﻳﺸﮕﺮ ﺳﻔﺎرﺷﻲ +ﻣﻮﻘﻌﻴﺖ H +ﺗﻨﻈﻴﻢ ﺣﺎﻟﺖ اﻓﻘﻲ +ﻣﻮﻘﻌﻴﺖ V +ﺗﻨﻈﻴﻢ ﺣﺎﻟﺖ ﻋﻤﻮدی +ﺑﺰرگ ﻛﺮدن ﺗﺼﻮﻳﺮ +ﺗﻨﻈﻴﻢ ﻣﻴﺰان ﺑﺰرگ ﻛﺮدن ﺗﺼﻮﻳﺮ +ﭘﺮﻳﺪن از FMV +ﭘﺮﻳﺪن از ﻛﺎت ﺳﻴﻦ ﻫﺎ +ﺗﻨﻈﻴﻤﺎت ﻛﺪ ﺗﻘﻠﺐ +ﻓﻌﺎل ﻛﺮدن ﻣﻮﺗﻮر ﻛﺪ ﺗﻘﻠﺐ PS2RD +ﺑﮕﺬارﻳﺪ ﺗﺎ ﻣﻮﺗﻮر ﻛﺪ ﺗﻘﻠﺐ PS2RD ﺑﺎزی ﺷﻤﺎرا ﭘﭻ ﻛﻨﺪ +ﺣﺎﻟﺖ ﻣﻮﺗﻮر ﻛﺪ ﺗﻘﻠﺐ PS2RD +اﻧﺘﺨﺎب ﺧﻮدﻛﺎر و ﻳﺎ اﻧﺘﺨﺎب دﺳﺘﻲ رﻣﺰ ﺗﻘﻠﺐ ﺑﺎزی +اﻧﺘﺨﺎب ﺧﻮدﻛﺎر رﻣﺰ ﺗﻘﻠﺐ +اﻧﺘﺨﺎب دﺳﺘﻲ رﻣﺰ ﺑﺎزی +در ﺑﺎرﮔﺬاری ﻓﺎﻳﻞ ﻛﺪ ﺗﻘﻠﺐ ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه +ﻫﻴﭻ ﻛﺪ ﺗﻘﻠﺒﻲ ﻳﺎﻓﺖ ﻧﺸﺪ +داﻧﻠﻮد ﭘﻴﺶ ﻓﺮض ﻫﺎ +آﭘﺪﻳﺖ از ﻃﺮﻳﻖ ﺷﺒﻜﻪ +داﻧﻠﻮد ﻣﺠﺪد ﻓﺎﻳﻞ ﻫﺎی ﻣﻮﺟﻮد؟ +آﭘﺪﻳﺖ ﺷﻜﺴﺖ ﺧﻮرد. +در اﺗﺼﺎل ﺑﻪ ﺳﺮور آﭘﺪﻳﺖ ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه. +اﭘﺪﻳﺖ ﺗﻜﻤﻴﻞ ﺷﺪ. +آﭘﺪﻳﺖ ﻟﻐﻮ ﺷﺪ. +ﺗﻨﻈﻴﻤﺎت از ﺷﺒﻜﻪ داﻧﻠﻮد ﺷﻮد؟ +ﺗﻨﻈﻴﻤﺎت ﺷﺨﺼﻲ ﺳﺎزی ﺷﺪه +ﭘﻴﺶ ﻓﺮض ﻫﺎ داﻧﻠﻮد ﺷﺪ +ﺷﺮوع ﺧﻮدﻛﺎر در %i ﺛﺎﻧﻴﻪ... +ﺷﺮوع ﺧﻮدﻛﺎر +ﻣﻘﺪار در ﺛﺎﻧﻴﻪ, 0 ﺑﺮای ﻏﻴﺮﻓﻌﺎل ﻛﺮدن ﺷﺮوع ﺧﻮدﻛﺎر +ﻟﻮﮔﻮ ﭘﻠﻲ اﺳﺘﻴﺸﻦ 2 +ﻓﻘﻂ ﺑﺮای ﻳﮏ دﻳﺴﮏ ﻣﻌﺘﺒﺮ ﻛﻪ ﺑﺎ رﻳﺠﻦ ﻛﻨﺴﻮل ﻫﻤﺨﻮاﻧﻲ داﺷﺘﻪ ﺑﺎﺷﺪ ﻧﺸﺎن داده ﻣﻴﺸﻮد +ﭘﻴﻜﺮﺑﻨﺪی ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ +ﺗﻨﻈﻴﻤﺎت ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ +ﻓﻌﺎل ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ +روﺷن و ﻳﺎ ﺧﺎﻣﻮش ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ ﺑﺮای ﺑﺎزی ﻫﺎی اﻧﺘﺨﺎب ﺷﺪه. +ﺣﺎﻟﺖ ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ +اﻧﺘﺨﺎب ﺣﺎﻟﺖ ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ. +ﻛﻨﺘﺮﻟﺮ ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3/4 از ﻃﺮﻴﻖ USB +ﻛﻨﺘﺮﻟﺮ ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3/4 از ﻃﺮﻴﻖ ﺑﻠﻮﺗﻮث +ﺗﻨﻈﻴﻤﺎت ﺑﺮای درﮔﺎه: +درﮔﺎه ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ را ﺑﺮای ﺗﻨﻈﻴﻤﺎت اﻧﺘﺨﺎب ﻛﻨﻴﺪ. +ﻓﻌﺎل ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎزی +روﺷﻦ و ﻳﺎ ﺧﺎﻣﻮش ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ ﺑﺮای درﮔﺎه ﻫﺎی اﻧﺘﺨﺎب ﺷﺪه. +ﻓﻌﺎل ﻛﺮدن ﺷﻮک +ﻓﻌﺎل ﻳﺎ ﻏﻴﺮﻓﻌﺎل ﻛﺮدن وﻳﺒﺮه ی ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ ﺑﺮای دﺮﮔﺎه ﻫﺎی اﻧﺘﺨﺎب ﺷﺪه. +ﻣﮏ آدرس آداﭘﺘﻮر ﺑﻠﻮﺗﻮث USB: +ﻛﻨﺘﺮﻟﺮ ﭘﻠﻲ اﺳﺘﻴﺸﻦ ﺟﻔﺖ ﺷﺪه اﺳﺖ ﺑﺎ ﻣﮏ آدرس: +ﺟﻔﺖ ﻛﺮدن +ﺟﻔﺖ ﻛﺮدن ﻛﻨﺘﺮﻟﺮ ﻫﺎی ﭘﻠﻲ اﺳﺘﻴﺸﻦ +ﺟﻔﺖ ﻛﺮدن ﻛﻨﺘﺮﻟﺮ ﭘﻠﻲ اﺳﺘﻴﺸﻦ ﺑﺎ ﻣﮏ آدرس آداﭘﺘﻮر ﺑﻠﻮﺗﻮث. +ﻣﺘﺼﻞ ﻧﺸﺪ +اﻃﻠﺎﻋﺎت آداﭘﺘﻮر ﺑﻠﻮﺗﻮث +ﻧﺸﺎن دادن اﻃﻠﺎﻋﺎت ﺑﻴﺸﺘﺮ و ﻗﺎﺑﻠﻴﺖ ﻫﺎی ﭘﺸﺘﻴﺒﺎﻧﻲ ﺷﺪه +ﻧﺴﺨﻪ ی HCI: +ﻧﺴﺨﻪ ی LMP: +ﺷﻨﺎﺳﻪ ﺗﻮﻟﻴﺪ ﻛﻨﻨﺪه: +ﻗﺎﺑﻠﻴﺖ ﻫﺎی ﭘﺸﺘﻴﺒﺎﻧﻲ ﺷﺪه: +ﺑﻠﻪ +ﺧﻴﺮ +آداﭘﺘﻮر ﺑﻠﻮﺗﻮث ﺑﺎﻳﺪ ﺑﻪ ﺻﻮرت ﻛﺎﻣﻞ ﺑﺎ ﻛﻨﺘﺮﻟﺮ ﻫﺎی ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3 و 4 ﺳﺎزﮔﺎر ﺑﺎﺷﺪ. +آداﭘﺘﻮر ﺑﻠﻮﺗﻮث ﺷﺎﻳﺪ ﺑﺎ ﻛﻨﺘﺮﻟﺮ ﻫﺎی ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3 و4 ﻛﺎر ﻧﻜﻨﺪ. +ﻓﻌﺎل ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎزی ﻓﺸﺮدن ﻫﻤﺰﻣﺎن ﭼﻨﺪ ﻛﻠﻴﺪ +روﺷﻦ و ﻳﺎ ﺧﺎﻣﻮش ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎزی ﻓﺸﺮدن ﻫﻤﺰﻣﺎن ﭼﻨﺪ ﻛﻠﻴﺪ ﺑﺮای ﺑﺎزی ﻫﺎی اﻧﺘﺨﺎب ﺷﺪه. +ﺷﺒﻴﻪ ﺳﺎزی ﻓﺸﺮدن ﻫﻤﺰﻣﺎن ﭼﻨﺪ ﻛﻠﻴﺪ در درﮔﺎه +اﻧﺘﺨﺎب درﮔﺎه ﺑﺮای ﺷﺒﻴﻪ ﺳﺎزی ﻓﺸﺮدن ﻫﻤﺰﻣﺎن ﭼﻨﺪ ﻛﻠﻴﺪ. +ﻏﻴﺮﻓﻌﺎل ﻛﺮدن راه ﺣﻞ ﺑﺮای ﻛﻨﺘﺮﻟﺮ ﻫﺎی ﺗﻘﻠﺒﻲ ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3 +ﺑﻌﻀﻲ از ﻛﻨﺘﺮﻟﺮ ﻫﺎی ﺗﻘﻠﺒﻲ ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3 ﺑﻪ راه ﺣﻞ ﻧﻴﺎز دارﻧﺪ, اﻳﻦ ﮔﺰﻳﻨﻪ آن را ﻏﻴﺮﻓﻌﺎل ﻣﻴﻜﻨﺪ. +ﺷﺒﻴﻪ ﺳﺎزی FIELD flipping +درﺳﺖ ﻛﺮدن ﺑﺎزی ﻫﺎیی ﻛﻪ در ﺣﺎﻟﺖ وﻳﺪﻳﻮ progressive ﮔﻠﻴﭻ دارﻧﺪ . +ﺗﻨﻈﻴﻤﺎت ﻗﻔﻞ واﻟﺪﻳﻦ +رﻣﺰ ﻋﺒﻮر ﻗﻔﻞ واﻟﺪﻳﻦ +ﺑﺮای ﻏﻴﺮﻓﻌﺎل ﻛﺮدن ﻗﻔﻞ واﻟﺪﻳﻦ ﺧﺎﻟﻲ ﮔﺬاﺷﺗﻪ ﺷﻮد. +رﻣﺰ ﻋﺒﻮر ﻗﻔﻞ واﻟﺪﻳﻦ را وارد ﻛﻨﻴﺪ +رﻣﺰ ﻋﺒﻮر ﻗﻔﻞ واﻟﺪﻳﻦ ﻧﺎدرﺳﺖ اﺳﺖ. +ﻗﻔﻞ واﻟﺪﻳﻦ ﻏﻴﺮﻓﻌﺎل ﺷﺪ. +ﮔﺰﻳﻨﻪ ﻫﺎی ﺳﺎﺧﺖ: +ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه - اﻳﻦ رﻣﺰ ﻋﺒﻮر ﻧﻤﻴﺘﻮاﻧﺪ اﺳﺘﻔﺎده ﺷﻮد. +ﻓﺎﻳﻞ ﺣﺎﻓﻈﻪ ﻣﺠﺎزی %s دﭼﺎر ﺑﻬﻢ رﻳﺨﺘﮕﻲ ﺷﺪه اﺳﺖ. اداﻣﻪ ﺑﺎ ﺣﺎﻓﻈﻪ ی ﻓﻴﺰﻳﻜﻲ درﮔﺎه %d? +ﺗﻨﻈﻴﻤﺎت ﺻﺪا +ﻓﻌﺎل ﻛﺮدن ﺟﻠﻮه ﻫﺎی ﺻﻮﺗﻲ +ﻓﻌﺎل ﻛﺮدن ﺻﺪای ﺑﻮت +درﺟﻪ ﺻﺪا ﺟﻠﻮه ﻫﺎی ﺻﻮﺗﻲ +درﺟﻪ ی ﺻﺪای ﺑﻮت +ﺗﻐﻴﻴﺮ ﺣﺎﻟﺖ وﻳﺪﻳﻮ را ﺗﺎﻳﻴﺪ ﻣﻴﻜﻨﻴﺪ؟> +ﻛﺶ ﻓﻬﺮﺳﺖ ﺑﺎزی ﻫﺎ (HDD) +ﺑﺎزی ﻫﺎی ﭘﻠﻲ اﺳﺘﻴﺸﻦ 1 +ﺣﺎﻟﺖ ﻧﻤﺎﻳﺶ ﺑﺎزی ﻫﺎی ﭘﻠﻲ اﺳﺘﻴﺸﻦ 1 +ﻓﺎﻳﻞ POPSTARTER.ELF ﻳﺎﻓﺖ ﻧﺸﺪ در '%s'! +ﻓﺎﻳﻞ VCD '%s' وﺟﻮد ﻧﺪارد! +در ﻫﻨﮕﺎم ﺗﻐﻴﻴﺮ ﻧﺎم ﻓﺎﻳﻞ ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه. +در ﻫﻨﮕﺎم ﭘﺎک ﻛﺮدن ﻓﺎﻳﻞ ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه. +ﻫﺮﮔﺰ OPEN-PS2-LOADER (OPL) را ﻧﺨﺮﻳﺪ, در ﻋﻮض آن را راﻳﮕﺎن درﻳﺎﻓﺖ ﻛﻨﻴﺪ: +ﻧﺴﺨﻪ ی ifcaro OPL در psx-scene.com +ﻧﺴﺨﻪ ی ﺳﺎﺧﺖ روزاﻧﻪ OPL (DB) در ps2-home.com From f4e235bd452be72dedbf5378163c25a116c6c591 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 17 Jul 2019 07:14:35 -0700 Subject: [PATCH 170/269] update lang files -- both Arabic and Persian languages no longer need to use OPL (RTL) version. --- lng/lang_Arabic.lng | 536 +++++++++++++++++++++---------------------- lng/lang_Persian.lng | 536 +++++++++++++++++++++---------------------- 2 files changed, 536 insertions(+), 536 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 17f971685..59a573b3c 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,277 +1,277 @@ # translation by alimadhi -# Last update: March 22, 2019 +# Last update: July 02, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic -OPL %s -حفظ التغييرات -خلف -تكوين الشبكة -خيارات متقدمة -<لايوجد قيم> -الإعدادات محفوظة -كتابة الاعدادات خطأ ! -خروج -الاعدادات -القائمة -ألعاب USB -ألعاب HDD -ألعاب ETH -تطبيقات -الموضوعه -اللغة -سوف يتوقف النضام. -الخروج إلى المتصفح؟ -الغاء التحديث؟ -%d: لم يتم العثور على القرص الصلب -%d: القرص الصلب غير مهيأ -%d: خطأ في بدأ الشبكة -%d: لم يتم العثور على موديوم -%d: لا يمن الربط الى سيرف SMB -%d: لايمكن الدخول الى سيرف SMB -%d: ا يمكن فتح مشاركة SMB -%d: ايمكن مشاركة قائمة SMB -%d: لايمكن سدل قائمة الالعاب -%d: سيرفر تكوين المضيف الديناميكي غير متوفر -%d: لايوجد ربط بالشبكة -تشغيل -إيقاف -حسنا -اختيار -الغاء -دائرة -اكس -قائمة الالعاب -إعدادات اللعبة -إزالة كافة إعدادات -إزالة كافة مفاتيح اللعبة -التمرير -بطيء -متوسط -سريع -القائمة الافتراضية -تحميل من القرص -يرجى الانتظار -خطأ أثناء تحميل الايدي للعبة -تمرير تلقائي -خطأ في تحميل ملف اللغة -تعطيل تصحيح الألوان -لم يتم الكشف على وحدة تحكم ، انتظر ... -تمكين عرض اغلفة اللعبة -شاشة عريضة -إيقاف التشغيل -تحميل التكوين -حفظ التكوين -بدأ الجهاز -تحديث -USB الوضع الافتراضي -HDD الوضع الافتراضي -ETH الوضع الافتراضي - الوضع الافتراضي APPS -تلقائي -يدوي -بدأ خادم HDL -جاري بدأ سيرفر HDL -HDL جاري بتشغيل -فشل في بدا سيرفر HDL -الغاء تحميل خادم HDL -مسار IGR -لون الخلفية -لون النص +OPL +ﺕﺍﺮﻴﻴﻐﺘﻟﺍ ﻆﻔﺣ +ﻒﻠﺧ +ﺔﻜﺒﺸﻟﺍ ﻦﻳﻮﻜﺗ +ﺔﻣﺪﻘﺘﻣ ﺕﺍﺭﺎﻴﺧ +>ﻢﻴﻗ ﺪﺟﻮﻳﻻ< +ﺔﻇﻮﻔﺤﻣ ﺕﺍﺩﺍﺪﻋﻹﺍ +! ﺄﻄﺧ ﺕﺍﺩﺍﺪﻋﻻﺍ ﺔﺑﺎﺘﻛ +ﺝﻭﺮﺧ +ﺕﺍﺩﺍﺪﻋﻻﺍ +ﺔﻤﺋﺎﻘﻟﺍ +USB ﺏﺎﻌﻟﺃ +HDD ﺏﺎﻌﻟﺃ +ETH ﺏﺎﻌﻟﺃ +ﺕﺎﻘﻴﺒﻄﺗ +ﻪﻋﻮﺿﻮﻤﻟﺍ +ﺔﻐﻠﻟﺍ +.ﻡﺎﻀﻨﻟﺍ ﻒﻗﻮﺘﻳ ﻑﻮﺳ +؟ ﺢﻔﺼﺘﻤﻟﺍ ﻰﻟﺍ ﺝﻭﺮﺨﻟﺍ +؟ﺚﻳﺪﺤﺘﻟﺍ ﺀﺎﻐﻟﺍ +ﺐﻠﺼﻟﺍ ﺹﺮﻘﻟﺍ ﻰﻠﻋ ﺭﻮﺜﻌﻟﺍ ﻢﺘﻳ ﻢﻟ +ﺄﻴﻬﻣ ﺮﻴﻏ ﺐﻠﺼﻟﺍ ﺹﺮﻘﻟﺍ +ﺔﻜﺒﺸﻟﺍ ﺃﺪﺑ ﻲﻓ ﺄﻄﺧ +ﻡﻮﻳﺩﻮﻤﻟﺍ ﻰﻠﻋ ﺭﻮﺜﻌﻟﺍ ﻢﺘﻳ ﻢﻟ +SMB ﺮﻓﺮﻴﺳ ﻰﻟﺍ ﻂﺑﺮﻟﺍ ﻦﻜﻤﻳﻻ +SMB ﺮﻓﺮﻴﺳ ﻰﻟﺍ ﻝﻮﺧﺪﻟﺍ ﻦﻜﻤﻳﻻ +SMB ﺔﻛﺭﺎﺸﻣ ﺢﺘﻓ ﻦﻜﻤﻳﻻ +SMB ﺔﻤﺋﺎﻗ ﺔﻛﺭﺎﺸﻣ ﻦﻜﻤﻳﻻ +ﺏﺎﻌﻟﻻﺍ ﺔﻤﺋﺎﻗ ﻝﺪﺳ ﻦﻜﻤﻳﻻ +ﺮﻓﻮﺘﻣ ﺮﻴﻏ ﻲﻜﻴﻣﺎﻨﻳﺪﻟﺍ ﻒﻴﻀﻤﻟﺍ ﻦﻳﻮﻜﺗ ﺮﻓﺮﻴﺳ +ﺔﻜﺒﺸﻟﺎﺑ ﻂﺑﺭ ﺪﺟﻮﻳﻻ +ﻞﻴﻐﺸﺗ +ﻑﺎﻘﻳﺇ +ﺎﻨﺴﺣ +ﺭﺎﻴﺘﺧﺍ +ﺀﺎﻐﻟﺍ +ﺓﺮﺋﺍﺩ +ﺲﻛﺍ +ﺏﺎﻌﻟﻻﺍ ﺔﻤﺋﺎﻗ +ﺔﺒﻌﻠﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ +ﺕﺍﺩﺍﺪﻋﻻﺍ ﺔﻓﺎﻛ ﺔﻟﺍﺯﺍ +ﺔﺒﻌﻠﻟﺍ ﺢﻴﺗﺎﻔﻣ ﺔﻓﺎﻛ ﺔﻟﺍﺯﺇ +ﺮﻳﺮﻤﺘﻟﺍ +ﺀﻲﻄﺑ +ﻂﺳﻮﺘﻣ +ﻊﻳﺮﺳ +ﺔﻴﺿﺍﺮﺘﻓﻻﺍ ﺔﻤﺋﺎﻘﻟﺍ +ﺹﺮﻘﻟﺍ ﻦﻣ ﻞﻴﻤﺤﺗ +ﺭﺎﻈﺘﻧﻻﺍ ﻰﺟﺮﻳ +ﺔﺒﻌﻠﻟﺍ ID ﻞﻴﻤﺤﺗ ﺀﺎﻨﺛﺍ ﺄﻄﺧ +ﻲﺋﺎﻘﻠﺗ ﺮﻳﺮﻤﺗ +ﺔﻐﻠﻟﺍ ﻒﻠﻣ ﻞﻴﻤﺤﺗ ﻲﻓ ﺄﻄﺧ +ﻥﺍﻮﻟﻷﺍ ﺢﻴﺤﺼﺗ ﻞﻴﻄﻌﺗ +... ﺮﻈﺘﻧﺍ ، ﻢﻜﺤﺗ ﺓﺪﺣﻭ ﻰﻠﻋ ﻒﺸﻜﻟﺍ ﻢﺘﻳ ﻢﻟ +ﺔﺒﻌﻠﻟﺍ ﺔﻔﻠﻏﺍ ﺽﺮﻋ ﻦﻴﻜﻤﺗ +ﺔﻀﻳﺮﻋ ﺔﺷﺎﺷ +ﻞﻴﻐﺸﺘﻟﺍ ﻑﺎﻘﻳﺇ +ﻦﻳﻮﻜﺘﻟﺍ ﻞﻴﻤﺤﺗ +ﻦﻳﻮﻜﺘﻟﺍ ﻆﻔﺣ +ﺯﺎﻬﺠﻟﺍ ﺃﺪﺑ +ﺚﻳﺪﺤﺗ +USB ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ +HDD ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ +ETH ﺯﺎﻬﺟ ﻞﻴﻐﺸﺗ +APPS ﺕﺎﻘﻴﺒﻄﺘﻟﺍ ﻞﻴﻐﺸﺗ +ﻲﺋﺎﻘﻠﺗ +ﻱﻭﺪﻳ +HDL ﻡﺩﺎﺧ ﺃﺪﺑ +HDL ﺮﻓﺮﻴﺳ ﺃﺪﺑ ﻱﺭﺎﺟ +HDL ﻞﻴﻐﺸﺗ ﻱﺭﺎﺟ + HDL ﺮﻓﺮﻴﺳ ﺍﺪﺑ ﻲﻓ ﻞﺸﻓ +HDL ﻡﺩﺎﺧ ﻞﻴﻤﺤﺗ ﺀﺎﻐﻟﺍ +IGR ﺭﺎﺴﻣ +ﺔﻴﻔﻠﺨﻟﺍ ﻥﻮﻟ +ﺺﻨﻟﺍ ﻥﻮﻟ - PS2 - -- خادم SMB - -نوع عنوان IP -الحالة -تكوين المضيف الديناميكي -IP عنوان -عنوان -قناع -بوابة -DNS سيرفر -المنفذ -المشاركة -المستخدم -كلمة السر -<غير مضبوط> -نوع العنوان +- SMB ﻡﺩﺎﺧ - +IP ﻥﺍﻮﻨﻋ ﻉﻮﻧ +ﺔﻟﺎﺤﻟﺍ +ﻲﻜﻴﻣﺎﻨﻳﺪﻟﺍ ﻒﻴﻀﻤﻟﺍ ﻦﻳﻮﻜﺗ +IP ﻥﺍﻮﻨﻋ +ﻥﺍﻮﻨﻋ +ﻉﺎﻨﻗ +ﺔﺑﺍﻮﺑ +DNS ﺮﻓﺮﻴﺳ +ﺬﻔﻨﻤﻟﺍ +ﺔﻛﺭﺎﺸﻤﻟﺍ +ﻡﺪﺨﺘﺴﻤﻟﺍ +ﺮﺴﻟﺍ ﺔﻤﻠﻛ +>ﻁﻮﺒﻀﻣ ﺮﻴﻏ< +ﻥﺍﻮﻨﻌﻟﺍ ﻉﻮﻧ IP -نت بايوس -قبول -سيتم حذف العنصر بشكل دائم ، متابعة ؟ -تسمية -حذف -تشغيل -اعدادات العرض -تمكين عمليات الكتابة -تحقق من تجزئة العاب USB -تذكر آخر لعبة تم اختيارها -اختر الزر -خطأ، اللعبة مجزئة -خطأ، لا يمكن تشغيل هذا البند -اختبار -ترك فارغة من اجل مصادقة الضيف. -قراءات دقيقة -وضع التزامن -Unhook Syscalls -اجتياز الفيديو -محاكي DVD-DL -تعطيل IGR -غير مستعمل -غير مستعمل -تغير الحجم يؤدي الى إعادة تهيئة الـ VMC -انشاء -بدأ -تعديل -إحباط -إعادة تعيين -استخدام شامل -تكوين VMC -الاسم -الحجم -الحالة -التقدم -ملف سواقة وحدة التخزين موجود -ملف سواقة وحدة التخزين غير صالح، والحجم غير صحيح -يحتاج ملف سواقة وحدة التخزين الى الانشاء -خطاء في سواقة وحدة التخزين، استمرار اجباري مع الميموري كارد ؟ -التحديث التلقائي -حول -المبرمجون -ضمان الجودة -مسار بادئة USB -تشغيل تطبيق خاص بعد الترسيت من داخل اللعبة -القيمة في الدقيقة، صفر تعطيل هبوط الدوران -تلقائي هبوط دوران القرص الصلب -وضع الفيديو -لون الحوار -اللون المحدد -عرض معلومات الصحفة -معلومات -Custom ELF -اختيار اللون -إعادة الاتصال -ترك فارغة الى قائمة المشاركة -مسار بادئة ETH -خلف -فراغ -دخول -الوضع -VMC فتحة 1 -VMC فتحة 2 -ايدي اللعبة -DMA الوضع -V -مزامنة -وضع 1 -وضع 2 -وضع 3 -وضع 4 -وضع 5 -وضع 6 -وضع 7 -وضع 8 -تكوين GSM -وضع وصلة ايرثلنك -100Mbit ثنائية الاتجاه -100Mbit نصف مزدوج -10Mbit ثنائية الاتجاه -10Mbit نصف مزدوج -إعدادات GSM -تمكين GSM -تبديل GSM تشغيل او إيقاف +ﺱﻮﻳﺎﺑ ﺖﻧ +ﻝﻮﺒﻗ +؟ ﺔﻌﺑﺎﺘﻣ ، ﻢﺋﺍﺩ ﻞﻜﺸﺑ ﺮﺼﻨﻌﻟﺍ ﻑﺬﺣ ﻢﺘﻴﺳ +ﺔﻴﻤﺴﺗ +ﻑﺬﺣ +ﻞﻴﻐﺸﺗ +ﺽﺮﻌﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ +ﺔﺑﺎﺘﻜﻟﺍ ﺕﺎﻴﻠﻤﻋ ﻦﻴﻜﻤﺗ +USB ﺏﺎﻌﻟﺍ ﺔﺋﺰﺠﺗ ﻦﻣ ﻖﻘﺤﺗ +ﺎﻫﺭﺎﻴﺘﺧﺍ ﻢﺗ ﺔﺒﻌﻟ ﺮﺧﺁ ﺮﻛﺬﺗ +ﺭﺰﻟﺍ ﺮﺘﺧﺍ +ﺔﺋﺰﺠﻣ ﺔﺒﻌﻠﻟﺍ ،ﺄﻄﺧ +ﺪﻨﺒﻟﺍ ﺍﺬﻫ ﻞﻴﻐﺸﺗ ﻦﻜﻤﻳ ﻻ ،ﺄﻄﺧ +ﺭﺎﺒﺘﺧﺍ +.ﻒﻴﻀﻟﺍ ﺔﻗﺩﺎﺼﻣ ﻞﺟﺍ ﻦﻣ ﺔﻏﺭﺎﻓ ﻙﺮﺗ +ﺔﻘﻴﻗﺩ ﺕﺍﺀﺍﺮﻗ +ﻦﻣﺍﺰﺘﻟﺍ ﻊﺿﻭ +Syscalls Unhook +ﻮﻳﺪﻴﻔﻟﺍ ﺯﺎﻴﺘﺟﺍ +DVD-DL ﻲﻛﺎﺤﻣ +IGR ﻞﻴﻄﻌﺗ +ﻞﻤﻌﺘﺴﻣ ﺮﻴﻏ +ﻞﻤﻌﺘﺴﻣ ﺮﻴﻏ +VMC ـﻟﺍ ﺔﺌﻴﻬﺗ ﺓﺩﺎﻋﺇ ﻰﻟﺍ ﻱﺩﺆﻳ ﻢﺠﺤﻟﺍ ﺮﻴﻐﺗ +ﺀﺎﺸﻧﺍ +ﺃﺪﺑ +ﻞﻳﺪﻌﺗ +ﻁﺎﺒﺣﺇ +ﻦﻴﻴﻌﺗ ﺓﺩﺎﻋﺇ +ﻞﻣﺎﺷ ﻡﺍﺪﺨﺘﺳﺍ +VMC ﻦﻳﻮﻜﺗ +ﻢﺳﻻﺍ +ﻢﺠﺤﻟﺍ +ﺔﻟﺎﺤﻟﺍ +ﻡﺪﻘﺘﻟﺍ +ﺩﻮﺟﻮﻣ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ +ﺢﻴﺤﺻ ﺮﻴﻏ ﻢﺠﺤﻟﺍﻭ ،ﺢﻟﺎﺻ ﺮﻴﻏ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ +ﺀﺎﺸﻧﻻﺍ ﻰﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ ﺝﺎﺘﺤﻳ +؟ ﺩﺭﺎﻛ ﻱﺭﻮﻤﻴﻤﻟﺍ ﻊﻣ ﻱﺭﺎﺒﺟﺍ ﺭﺍﺮﻤﺘﺳﺍ ،ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻲﻓ ﺀﺎﻄﺧ +ﻲﺋﺎﻘﻠﺘﻟﺍ ﺚﻳﺪﺤﺘﻟﺍ +ﻝﻮﺣ +ﻥﻮﺠﻣﺮﺒﻤﻟﺍ +ﺓﺩﻮﺠﻟﺍ ﻥﺎﻤﺿ +USB ﺔﺋﺩﺎﺑ ﺭﺎﺴﻣ + ﺔﺒﻌﻠﻟﺍ ﻞﺧﺍﺩ ﻦﻣ ﺖﻴﺳﺮﺘﻟﺍ ﺪﻌﺑ ﺹﺎﺧ ﻖﻴﺒﻄﺗ ﻞﻴﻐﺸﺗ +ﻥﺍﺭﻭﺪﻟﺍ ﻁﻮﺒﻫ ﻞﻴﻄﻌﺗ ﺮﻔﺻ ،ﺔﻘﻴﻗﺪﻟﺍ ﻲﻓ ﺔﻤﻴﻘﻟﺍ +ﺐﻠﺼﻟﺍ ﺹﺮﻘﻟﺍ ﻥﺍﺭﻭﺩ ﻁﻮﺒﻫ ﻲﺋﺎﻘﻠﺗ +ﻮﻳﺪﻴﻔﻟﺍ ﻊﺿﻭ +ﺭﺍﻮﺤﻟﺍ ﻥﻮﻟ +ﺩﺪﺤﻤﻟﺍ ﻥﻮﻠﻟﺍ +ﺔﺤﻔﺼﻟﺍ ﺕﺎﻣﻮﻠﻌﻣ ﺽﺮﻋ +ﺕﺎﻣﻮﻠﻌﻣ +ELF ﺺﺼﺨﻣ +ﻥﻮﻠﻟﺍ ﺭﺎﻴﺘﺧﺍ +ﻝﺎﺼﺗﻻﺍ ﺓﺩﺎﻋﺇ +ﺔﻛﺭﺎﺸﻤﻟﺍ ﺔﻤﺋﺎﻗ ﻰﻟﺍ ﺔﻏﺭﺎﻓ ﻙﺮﺗ +ETH ﺔﺋﺩﺎﺑ ﺭﺎﺴﻣ +ﻒﻠﺧ +ﻍﺍﺮﻓ +ﻝﻮﺧﺩ +ﻊﺿﻮﻟﺍ +VMC1 ﺔﺤﺘﻓ +VMC2 ﺔﺤﺘﻓ +ﺔﺒﻌﻠﻟﺍ ﻱﺩ ﻱﺍ +DMA ﻊﺿﻮﻟﺍ +ﺔﻨﻣﺍﺰﻣ- V +1 ﻊﺿﻭ +2 ﻊﺿﻭ +3 ﻊﺿﻭ +4 ﻊﺿﻭ +5 ﻊﺿﻭ +6 ﻊﺿﻭ +7 ﻊﺿﻭ +8 ﻊﺿﻭ +GSM ﻦﻳﻮﻜﺗ +ﻚﻨﻠﺛﺮﻳﺍ ﺔﻠﺻﻭ ﻊﺿﻭ +100Mbit ﻩﺎﺠﺗﻻﺍ ﺔﻴﺋﺎﻨﺛ +100Mbit ﺝﻭﺩﺰﻣ ﻒﺼﻧ +10Mbit ﻩﺎﺠﺗﻻﺍ ﺔﻴﺋﺎﻨﺛ +10Mbit ﺝﻭﺩﺰﻣ ﻒﺼﻧ +GSM ﺕﺍﺩﺍﺪﻋﺇ +GSM ﻦﻴﻜﻤﺗ +ﻑﺎﻘﻳﺇ ﻭﺍ ﻞﻴﻐﺸﺗ GSM ﻞﻳﺪﺒﺗ VMODE -اجبار نوع مخصص للعرض +ﺽﺮﻌﻠﻟ ﺺﺼﺨﻣ ﻉﻮﻧ ﺭﺎﺒﺟﺍ H-POS -تعديل افقي +ﻲﻘﻓﺍ ﻞﻳﺪﻌﺗ V-POS -تعديل عامودي -حدود الصورة -تنظيم حدود الصورة -FMV اجتياز -تخطي كامل لحركة الفيديو -اعدادات الغش -تمكين محرك الغش -يتيح محرك الغش من تصحيح الألعاب -وضع محرك الغش -تحديد تلقائي او اختر غش اللعبة -تحديد الغش تلقائي -اختر غش اللعبة -خطأ: فشل في تحميل ملف الغش -لم يتم العثور على الغش -تحميل افتراضي -تحديث الشبكة -إعادة تحميل السجلات الموجودة؟ -فشل التحديث. -فشل الاتصال لتحديث الخادم. -انتهى التحديث. -تم إلغاء التحديث. -تحميل الإعدادات من الشبكة؟ -إعدادات مخصصة -افتراضيات تحميلها -بدأ تلقائي في %i s... -تشغيل تلقائي -القيمة في الثانية (s)، صفر لتعطيل التشغيل التلقائي -شعار بلي2 -يتم عرضها فقط لشعار القرص الصالح للاجهزة المطابقة لنفس المنطقة -تكوين PADEMU -اعدادات محاكي اليدة -تمكين محاكي تحكم -تشغيل/ايقاف محاكي اليدة لتحديد لعبة -وضع محاكي اليدة -اختيار وضع محاكي اليدة -تحكم بلي ستيشن 3/4 يو-اس-بي -تحكم بلي ستيشن 3/4 بلوتوث -اعدادات المخرج: -تحديد مخرج محاكي اليدة للاعدادات. -تمكين المحاكي -تشغيل/ايقاف محاكي اليدة لتحديد المخرج -تمكيل الاهتزاز -تشغيل/ايقاف الاهتزاز لاختيار مخرج محاكي اليدة -عنوان الماك لمحول اليواسبي البلوتوث -اقتران التحكم الى عنوان الماك: -اقتران -تزاوج التحكم -تزاوج التحكم مع عنوان محول البلوتوث -غير متصل -معلومات محول البلوتوث -لعرض المزيد من المعلومات والميزات المدعومة -HCI الاصدار: -LMP الاصدار: -صانع الاي دي: -ميزات الدعم: -نعم -لا -يجب أن يكون محول بلوتوث متوافقة تماما مع وحدات التحكم DS3 / DS4. -قد لا يعمل محول بلوتوث بشكل صحيح مع وحدات التحكم DS3 / DS4. -تمكين محاكاة تعدد الإرسال -تشغيل / إيقاف محاكاة متعددة التحركات من اجل لعبة مختارة. -نقر متعدد المحاكي على المنفذ -اختر منفذ من اجل نقر متعدد المحاكي -تعطيل الحل لوحدة التحكم الوهمية -بعض التحكمات تحتاج الى حل، سيؤدي هذا الخيار تعطيله -محاكاة FIELD التقليب -إصلاح للألعاب التي تندرج تحت أوضاع الفيديو التدريجي. -إعدادات قفل الوالدين -كلمة مرور الوالدين قفل -اتركه فارغا لتعطيل قفل الوالدين. -أدخل كلمة مرور الوالدين قفل -كلمة مرور الوالدين قفل غير صحيحة. -تم تعطيل قفل الوالدين. -خيارات البناء: -خطأ - لا يمكن استخدام كلمة المرور هذه. -ملف VMC %s مجزأ. تواصل مع بطاقة الذاكرة في الفتحة %d? -اعدادات الصوت -تمكين مؤثرات الصوت -تمكين تمهيد الصوت -حجم المؤثرات الصوتية -حجم صوت التمهيد -تأكيد تغيير وضع الفيديو؟ -قائمة ألعاب التخزين المؤقت (HDD) -PS1 العاب -PS1 وضع عرض الالعاب -POPSTARTER.ELF غير موجود في '%s'! -VCD ملف '%s' غير موجود! -حدث خطأ أثناء إعادة تسمية الملف. -حدث خطأ أثناء حذف الملف. -لا تشتري OPEN-PS2-LOADER (OPL) مطلقًا ، احصل عليه مجانًا من: -ifcaro OPL النسخة الموجودة عند psx-scene.com -OPL Daily Builds (DB) النسخة الموجودة عند ps2-home.com \ No newline at end of file +ﻱﺩﻮﻣﺎﻋ ﻞﻳﺪﻌﺗ +ﺓﺭﻮﺼﻟﺍ ﺩﻭﺪﺣ +ﺓﺭﻮﺼﻟﺍ ﺩﻭﺪﺣ ﻢﻴﻈﻨﺗ +FMV ﺯﺎﻴﺘﺟﺍ +ﻮﻳﺪﻴﻔﻟﺍ ﺔﻛﺮﺤﻟ ﻞﻣﺎﻛ ﻲﻄﺨﺗ +ﺶﻐﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ +ﺶﻐﻟﺍ ﻙﺮﺤﻣ ﻦﻴﻜﻤﺗ +ﺏﺎﻌﻟﻷﺍ ﺢﻴﺤﺼﺗ ﻦﻣ ﺶﻐﻟﺍ ﻙﺮﺤﻣ ﺢﻴﺘﻳ +ﺶﻐﻟﺍ ﻙﺮﺤﻣ ﻊﺿﻭ +ﺔﺒﻌﻠﻟﺍ ﺶﻏ ﺮﺘﺧﺍ ﻭﺍ ﻲﺋﺎﻘﻠﺗ ﺪﻳﺪﺤﺗ +ﻲﺋﺎﻘﻠﺗ ﺶﻐﻟﺍ ﺪﻳﺪﺤﺗ +ﺔﺒﻌﻠﻟﺍ ﺶﻏ ﺮﺘﺧﺍ +ﺶﻐﻟﺍ ﻒﻠﻣ ﻞﻴﻤﺤﺗ ﻲﻓ ﻞﺸﻓ :ﺄﻄﺧ +ﺶﻐﻟﺍ ﻰﻠﻋ ﺭﻮﺜﻌﻟﺍ ﻢﺘﻳ ﻢﻟ +ﻲﺿﺍﺮﺘﻓﺍ ﻞﻴﻤﺤﺗ +ﺔﻜﺒﺸﻟﺍ ﺚﻳﺪﺤﺗ +؟ﺓﺩﻮﺟﻮﻤﻟﺍ ﺕﻼﺠﺴﻟﺍ ﻞﻴﻤﺤﺗ ﺓﺩﺎﻋﺇ +.ﺚﻳﺪﺤﺘﻟﺍ ﻞﺸﻓ +.ﻡﺩﺎﺨﻟﺍ ﺚﻳﺪﺤﺘﻟ ﻝﺎﺼﺗﻻﺍ ﻞﺸﻓ +.ﺚﻳﺪﺤﺘﻟﺍ ﻰﻬﺘﻧﺍ +.ﺚﻳﺪﺤﺘﻟﺍ ﺀﺎﻐﻟﺇ ﻢﺗ +؟ﺔﻜﺒﺸﻟﺍ ﻦﻣ ﺕﺍﺩﺍﺪﻋﻹﺍ ﻞﻴﻤﺤﺗ +ﺔﺼﺼﺨﻣ ﺕﺍﺩﺍﺪﻋﺇ +ﺎﻬﻠﻴﻤﺤﺗ ﺕﺎﻴﺿﺍﺮﺘﻓﺍ + s... i% ﻲﻓ ﻲﺋﺎﻘﻠﺗ ﺃﺪﺑ +ﻲﺋﺎﻘﻠﺗ ﻞﻴﻐﺸﺗ +ﻲﺋﺎﻘﻠﺘﻟﺍ ﻞﻴﻐﺸﺘﻟﺍ ﻞﻴﻄﻌﺘﻟ ﺮﻔﺻ ،(s) ﺔﻴﻧﺎﺜﻟﺍ ﻲﻓ ﺔﻤﻴﻘﻟﺍ +2ﻲﻠﺑ ﺭﺎﻌﺷ +ﺔﻘﻄﻨﻤﻟﺍ ﺲﻔﻨﻟ ﺔﻘﺑﺎﻄﻤﻟﺍ ﺓﺰﻬﺟﻼﻟ ﺢﻟﺎﺼﻟﺍ ﺹﺮﻘﻟﺍ ﺭﺎﻌﺸﻟ ﻂﻘﻓ ﺎﻬﺿﺮﻋ ﻢﺘﻳ +PADEMU ﻦﻳﻮﻜﺗ +ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﺕﺍﺩﺍﺪﻋﺍ +ﻢﻜﺤﺗ ﻲﻛﺎﺤﻣ ﻦﻴﻜﻤﺗ +ﺔﺒﻌﻟ ﺪﻳﺪﺤﺘﻟ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻑﺎﻘﻳﺍ/ﻞﻴﻐﺸﺗ +ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻊﺿﻭ +ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻊﺿﻭ ﺭﺎﻴﺘﺧﺍ +ﻲﺑ-ﺱﺍ-ﻮﻳ 3/4 ﻦﺸﻴﺘﺳ ﻲﻠﺑ ﻢﻜﺤﺗ +ﺙﻮﺗﻮﻠﺑ 3/4 ﻦﺸﻴﺘﺳ ﻲﻠﺑ ﻢﻜﺤﺗ +:ﺝﺮﺨﻤﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ +.ﺕﺍﺩﺍﺪﻋﻼﻟ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﺝﺮﺨﻣ ﺪﻳﺪﺤﺗ +ﻲﻛﺎﺤﻤﻟﺍ ﻦﻴﻜﻤﺗ +ﺝﺮﺨﻤﻟﺍ ﺪﻳﺪﺤﺘﻟ ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﻑﺎﻘﻳﺍ/ﻞﻴﻐﺸﺗ +ﺯﺍﺰﺘﻫﻻﺍ ﻞﻴﻜﻤﺗ +ﺓﺪﻴﻟﺍ ﻲﻛﺎﺤﻣ ﺝﺮﺨﻣ ﺭﺎﻴﺘﺧﻻ ﺯﺍﺰﺘﻫﻻﺍ ﻑﺎﻘﻳﺍ/ﻞﻴﻐﺸﺗ +ﺙﻮﺗﻮﻠﺒﻟﺍ ﻲﺒﺳﺍﻮﻴﻟﺍ ﻝﻮﺤﻤﻟ ﻙﺎﻤﻟﺍ ﻥﺍﻮﻨﻋ +:ﻙﺎﻤﻟﺍ ﻥﺍﻮﻨﻋ ﻰﻟﺍ ﻢﻜﺤﺘﻟﺍ ﻥﺍﺮﺘﻗﺍ +ﻥﺍﺮﺘﻗﺍ +ﻢﻜﺤﺘﻟﺍ ﺝﻭﺍﺰﺗ +ﺙﻮﺗﻮﻠﺒﻟﺍ ﻝﻮﺤﻣ ﻥﺍﻮﻨﻋ ﻊﻣ ﻢﻜﺤﺘﻟﺍ ﺝﻭﺍﺰﺗ +ﻞﺼﺘﻣ ﺮﻴﻏ +ﺙﻮﺗﻮﻠﺒﻟﺍ ﻝﻮﺤﻣ ﺕﺎﻣﻮﻠﻌﻣ +ﺔﻣﻮﻋﺪﻤﻟﺍ ﺕﺍﺰﻴﻤﻟﺍﻭ ﺕﺎﻣﻮﻠﻌﻤﻟﺍ ﻦﻣ ﺪﻳﺰﻤﻟﺍ ﺽﺮﻌﻟ +HCI: ﺭﺍﺪﺻﻻﺍ +LMP: ﺭﺍﺪﺻﻻﺍ +ID: ﻊﻧﺎﺻ +:ﻢﻋﺪﻟﺍ ﺕﺍﺰﻴﻣ +ﻢﻌﻧ +ﻻ +DS4. / DS3 ﻢﻜﺤﺘﻟﺍ ﺕﺍﺪﺣﻭ ﻊﻣ ﺎﻣﺎﻤﺗ ﺔﻘﻓﺍﻮﺘﻣ ﺙﻮﺗﻮﻠﺑ ﻝﻮﺤﻣ ﻥﻮﻜﻳ ﻥﺃ ﺐﺠﻳ +DS4. / DS3 ﻢﻜﺤﺘﻟﺍ ﺕﺍﺪﺣﻭ ﻊﻣ ﺢﻴﺤﺻ ﻞﻜﺸﺑ ﺙﻮﺗﻮﻠﺑ ﻝﻮﺤﻣ ﻞﻤﻌﻳ ﻻ ﺪﻗ +ﻝﺎﺳﺭﻹﺍ ﺩﺪﻌﺗ ﺓﺎﻛﺎﺤﻣ ﻦﻴﻜﻤﺗ +.ﺓﺭﺎﺘﺨﻣ ﺔﺒﻌﻟ ﻞﺟﺍ ﻦﻣ ﺕﺎﻛﺮﺤﺘﻟﺍ ﺓﺩﺪﻌﺘﻣ ﺓﺎﻛﺎﺤﻣ ﻑﺎﻘﻳﺇ / ﻞﻴﻐﺸﺗ +ﺬﻔﻨﻤﻟﺍ ﻰﻠﻋ ﻲﻛﺎﺤﻤﻟﺍ ﺩﺪﻌﺘﻣ ﺮﻘﻧ +ﻲﻛﺎﺤﻤﻟﺍ ﺩﺪﻌﺘﻣ ﺮﻘﻧ ﻞﺟﺍ ﻦﻣ ﺬﻔﻨﻣ ﺮﺘﺧﺍ +ﺔﻴﻤﻫﻮﻟﺍ ﻢﻜﺤﺘﻟﺍ ﺓﺪﺣﻮﻟ ﻞﺤﻟﺍ ﻞﻴﻄﻌﺗ +ﻪﻠﻴﻄﻌﺗ ﺭﺎﻴﺨﻟﺍ ﺍﺬﻫ ﻱﺩﺆﻴﺳ ،ﻞﺣ ﻰﻟﺍ ﺝﺎﺘﺤﺗ ﺕﺎﻤﻜﺤﺘﻟﺍ ﺾﻌﺑ +ﺐﻴﻠﻘﺘﻟﺍ FIELD ﺓﺎﻛﺎﺤﻣ +.ﻲﺠﻳﺭﺪﺘﻟﺍ ﻮﻳﺪﻴﻔﻟﺍ ﻉﺎﺿﻭﺃ ﺖﺤﺗ ﺝﺭﺪﻨﺗ ﻲﺘﻟﺍ ﺏﺎﻌﻟﻸﻟ ﺡﻼﺻﺇ +ﻦﻳﺪﻟﺍﻮﻟﺍ ﻞﻔﻗ ﺕﺍﺩﺍﺪﻋﺇ +ﻞﻔﻗ ﻦﻳﺪﻟﺍﻮﻟﺍ ﺭﻭﺮﻣ ﺔﻤﻠﻛ +.ﻦﻳﺪﻟﺍﻮﻟﺍ ﻞﻔﻗ ﻞﻴﻄﻌﺘﻟ ﺎﻏﺭﺎﻓ ﻪﻛﺮﺗﺍ +ﻞﻔﻗ ﻦﻳﺪﻟﺍﻮﻟﺍ ﺭﻭﺮﻣ ﺔﻤﻠﻛ ﻞﺧﺩﺃ +.ﺔﺤﻴﺤﺻ ﺮﻴﻏ ﻞﻔﻗ ﻦﻳﺪﻟﺍﻮﻟﺍ ﺭﻭﺮﻣ ﺔﻤﻠﻛ +.ﻦﻳﺪﻟﺍﻮﻟﺍ ﻞﻔﻗ ﻞﻴﻄﻌﺗ ﻢﺗ +:ﺀﺎﻨﺒﻟﺍ ﺕﺍﺭﺎﻴﺧ +.ﻩﺬﻫ ﺭﻭﺮﻤﻟﺍ ﺔﻤﻠﻛ ﻡﺍﺪﺨﺘﺳﺍ ﻦﻜﻤﻳ ﻻ - ﺄﻄﺧ +d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞﺻﺍﻮﺗ .ﺃﺰﺠﻣ s% VMC ﻒﻠﻣ +ﺕﻮﺼﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ +ﺕﻮﺼﻟﺍ ﺕﺍﺮﺛﺆﻣ ﻦﻴﻜﻤﺗ +ﺕﻮﺼﻟﺍ ﺪﻴﻬﻤﺗ ﻦﻴﻜﻤﺗ +ﺔﻴﺗﻮﺼﻟﺍ ﺕﺍﺮﺛﺆﻤﻟﺍ ﻢﺠﺣ +ﺪﻴﻬﻤﺘﻟﺍ ﺕﻮﺻ ﻢﺠﺣ +؟ﻮﻳﺪﻴﻔﻟﺍ ﻊﺿﻭ ﺮﻴﻴﻐﺗ ﺪﻴﻛﺄﺗ +(HDD) ﺖﻗﺆﻤﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺏﺎﻌﻟﺃ ﺔﻤﺋﺎﻗ +PS1 ﺏﺎﻌﻟﺍ +PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ +'%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF +!ﺩﻮﺟﻮﻣ ﺮﻴﻏ '%s' ﻒﻠﻣ VCD +.ﻒﻠﻤﻟﺍ ﺔﻴﻤﺴﺗ ﺓﺩﺎﻋﺇ ﺀﺎﻨﺛﺃ ﺄﻄﺧ ﺙﺪﺣ +.ﻒﻠﻤﻟﺍ ﻑﺬﺣ ﺀﺎﻨﺛﺃ ﺄﻄﺧ ﺙﺪﺣ +:ﻦﻣ ﺎًﻧﺎﺠﻣ ﻪﻴﻠﻋ ﻞﺼﺣﺍ ، ﺎًﻘﻠﻄﻣ (OPL) OPEN-PS2-LOADER ﻱﺮﺘﺸﺗ ﻻ +psx-scene.com ﺪﻨﻋ ﺓﺩﻮﺟﻮﻤﻟﺍ ﺔﺨﺴﻨﻟﺍ OPL ifcaro +ps2-home.com ﺪﻨﻋ ﺓﺩﻮﺟﻮﻤﻟﺍ ﺔﺨﺴﻨﻟﺍ (DB) Builds Daily OPL \ No newline at end of file diff --git a/lng/lang_Persian.lng b/lng/lang_Persian.lng index cfadd9059..3d28f6139 100644 --- a/lng/lang_Persian.lng +++ b/lng/lang_Persian.lng @@ -1,277 +1,277 @@ # Translation by saeid0035 -# Last update: June 29, 2019 +# Last update: June 30, 2019 # Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s -ذﺧﻴﺮه ﺗﻐﻴﻴﺮات -ﺑﺮﮔﺸﺖ -ﭘﻴﻜﺮﺑﻨﺪی ﺷﺒﻜﻪ -ﮔﺰﻴﻨﻪ ﻫﺎی ﭘﻴﺸﺮﻓﺘﻪ -<ﺑﺪون ﻣﻘﺪار> -ﺗﻨﻈﻴﻤﺎت ذﺧﻴﺮه ﺷﺪ... -در ﻧﻮﺷﺘﻦ ﺗﻨﻈﻴﻤﺎت ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪ! -ﺧﺮوج -ﺗﻨﻈﻴﻤﺎت -ﻣﻨﻮ -ﺑﺎزی ﻫﺎی USB -ﺑﺎزی ﻫﺎی HDD -ﺑﺎزی ﻫﺎی ETH -ﺑﺮﻧﺎﻣﻪ ﻫﺎ -ﭘﻮﺳﺘﻪ -زﺑﺎن -ﺳﻴﺴﺘﻢ ﺑﺰودی ﺧﺎﻣﻮش ﻣﻲ ﺷﻮد. -ﺧﺮوج ﺑﻪ ﻣﺮورﮔﺮ؟ -آﭘﺪﻳﺖ ﺷﺪن ﻟﻐﻮ ﺷﻮد؟ -%d: دراﻳﻮ ﻫﺎرد دﻳﺴﮏ ﺗﺸﺨﻴﺺ داده ﻧﺸﺪ -%d: دراﻳﻮ ﻫﺎرد دﻳﺴﮏ ﻓﺮﻣﺖ ﻧﺸﺪه اﺳﺖ -%d: راه اﻧﺪازی ﺷﺒﻜﻪ ﺑﺎ ﻣﺸﻜﻞ ﻣﻮاﺟﻪ ﺷﺪ -%d: ﻫﻴﭻ آداﭘﺘﻮر ﺷﺒﻜﻪ ای ﻳﺎﻓﺖ ﻧﺸﺪ -%d: اﺗﺼﺎل ﺑﻪ ﺳﺮور SMB اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ -%d: ورود ﺑﻪ ﺳﺮور SMB اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ -%d: ﺑﺎزﻛﺮدن اﺷﺘﺮاک SMB اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ -%d: ﺑﺎزﻛﺮدن اﺷﺘﺮاک ﻫﺎی SMB اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ -%d: ﻟﻴﺴﺖ ﻛﺮدن ﺑﺎزی ﻫﺎ اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ -%d: ﺳﺮور DHCP در دﺴﺘﺮس ﻧﻴﺴﺖ -%d: ﻫﻴﭻ اﺗﺼﺎل ﺷﺒﻜﻪ ای وﺟﻮد ﻧﺪارد -روﺷﻦ -ﺧﺎﻣﻮش -ﺣﻠﻪ -اﻧﺘﺨﺎب -ﻟﻐﻮ -داﻳﺮه -ﺿﺮﺑﺪر -ﻟﻴﺴﺖ ﺑﺎزی ﻫﺎ -ﺗﻨﻈﻴﻤﺎت ﺑﺎزی ﻫﺎ -ﭘﺎک ﻛﺮدن ﺗﻤﺎم ﺗﻨﻈﻴﻤﺎت -ﭘﺎک ﻛﺮدن ﺗﻤﺎم ﻛﻠﻴﺪ ﻫﺎی ﺑﺎزی -ﺳﺮﻋﺖ اﺳﻜﺮول -آﻫﺴﺘﻪ -ﻣﻌﻤﻮﻟﻲ -ﺳﺮﻳﻊ -ﻣﻨﻮ ﭘﻴﺸﻔﺮض -ﺑﺎرﮔﺰاری از دﻳﺴﮏ -ﻟﻄﻔﺎ ﻣﻨﺘﻈﺮ ﺑﻤﺎﻨﻴﺪ -در ﻫﻨﮕﺎم ﺑﺎرﮔﺬاری ﺷﻨﺎﺳﻪ ﺑﺎزی ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه -ﺗﺮﺗﻴﺐ دادن ﺧﻮدﻛﺎر -درﻫﻨﮕﺎم ﺑﺎرﮔﺬاری ﻓﺎﻴﻞ زﺑﺎن ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪ -ﻏﻴﺮﻓﻌﺎل ﻛﺮدن رﻧﮓ ﻫﺎی ﻣﺸﻜﻞ ﮔﺸﺎﻳﻲ -ﻫﻴﭻ ﻛﻨﺘﺮﻟﺮی ﭘﻴﺪا ﻧﺸﺪ ﻣﻨﺘﻈﺮ ﺑﻤﺎﻧﻴﺪ... -ﻓﻌﺎل ﻛﺮدن ﻛﺎور ﺑﺎزی ﻫﺎ -ﺻﻔﺤﻪ ﻛﺸﻴﺪه -ﺧﺎﻣﻮش ﻛﺮدن -درﺣﺎل ﺑﺎرﮔﺬاری ﭘﻴﻜﺮﺑﻨﺪی -درﺣﺎل ذﺧﻴﺮه ﭘﻴﻜﺮﺑﻨﺪی -دﺳﺘﮕﺎه ﺷﺮوع ﻛﻨﻨﺪه -ﺗﺎزه ﺳﺎزی -ﺣﺎﻟﺖ ﺷﺮوع دﺳﺘﮕﺎه USB -ﺣﺎﻟﺖ ﺷﺮوع دﺳﺘﮕﺎه HDD -ﺣﺎﻟﺖ ﺷﺮوع دﺳﺘﮕﺎه ETH -ﻧﺸﺎن دادن ﻣﻨﻮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ -ﺧﻮدﻛﺎر -دﺳﺘﻲ -ﺷﺮوع ﺳﺮور HDL -ﺳﺮور HDL درﺣﺎل راه اﻧﺪازی ﻣﻴﺒﺎﺷﺪ... -ﺳﺮور HDL درﺣﺎل اﺟﺮا ﻣﻴﺒﺎﺷﺪ... -راه اﻧﺪازی ﺳﺮور HDL ﺷﻜﺴﺖ ﺧﻮرد. -ﺳﺮور HDL درﺣﺎل ﺗﺨﻠﻴﻪ ﻣﻴﺒﺎﺷﺪ... -ﻣﺴﻴﺮ IGR -رﻧﮓ ﭘﺲ زﻣﻴﻨﻪ -رﻧﮓ ﻣﺘﻮن -- ﭘﻠﻲ اﺳﺘﻴﺸﻦ 2 - -- ﺳﺮور SMB - -ﻧﻮع آدرس آﻳﭙﻲ -اﻳﺴﺘﺎ +تاﺮﻴﻴﻐﺗ هﺮﻴﺧذ +ﺖﺸﮔﺮﺑ +ﻪﻜﺒﺷ یﺪﻨﺑﺮﻜﻴﭘ +ﻪﺘﻓﺮﺸﻴﭘ یﺎﻫ ﻪﻨﻴﺰﮔ +>راﺪﻘﻣ نوﺪﺑ< +...ﺪﺷ هﺮﻴﺧذ تﺎﻤﻴﻈﻨﺗ +!ﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ تﺎﻤﻴﻈﻨﺗ ﻦﺘﺷﻮﻧ رد +جوﺮﺧ +تﺎﻤﻴﻈﻨﺗ +ﻮﻨﻣ +USB یﺎﻫ یزﺎﺑ +HDD یﺎﻫ یزﺎﺑ +ETH یﺎﻫ یزﺎﺑ +ﺎﻫ ﻪﻣﺎﻧﺮﺑ +ﻪﺘﺳﻮﭘ +نﺎﺑز +.دﻮﺷ ﻲﻣ شﻮﻣﺎﺧ یدوﺰﺑ ﻢﺘﺴﻴﺳ +؟ﺮﮔروﺮﻣ ﻪﺑ جوﺮﺧ +؟دﻮﺷ ﻮﻐﻟ نﺪﺷ ﺖﻳﺪﭘآ +ﺪﺸﻧ هداد ﺺﻴﺨﺸﺗ ﮏﺴﻳد درﺎﻫ ﻮﻳارد %d: +ﺖﺳا هﺪﺸﻧ ﺖﻣﺮﻓ ﮏﺴﻳد درﺎﻫ ﻮﻳارد %d: +ﺪﺷ ﻪﺟاﻮﻣ ﻞﻜﺸﻣ ﺎﺑ ﻪﻜﺒﺷ یزاﺪﻧا هار %d: +ﺪﺸﻧ ﺖﻓﺎﻳ یا ﻪﻜﺒﺷ رﻮﺘﭘادآ ﭻﻴﻫ %d: +ﺖﺴﻴﻧ ﺮﻳﺬﭘ نﺎﻜﻣا SMB روﺮﺳ ﻪﺑ لﺎﺼﺗا %d: +ﺖﺴﻴﻧ ﺮﻳﺬﭘ نﺎﻜﻣا SMB روﺮﺳ ﻪﺑ دورو %d: +ﺖﺴﻴﻧ ﺮﻳﺬﭘ نﺎﻜﻣا SMB کاﺮﺘﺷا ندﺮﻛزﺎﺑ %d: +ﺖﺴﻴﻧ ﺮﻳﺬﭘ نﺎﻜﻣا SMB یﺎﻫ کاﺮﺘﺷا ندﺮﻛزﺎﺑ %d: +ﺖﺴﻴﻧ ﺮﻳﺬﭘ نﺎﻜﻣا ﺎﻫ یزﺎﺑ ندﺮﻛ ﺖﺴﻴﻟ %d: +ﺖﺴﻴﻧ سﺮﺘﺴد رد DHCP روﺮﺳ %d: +دراﺪﻧ دﻮﺟو یا ﻪﻜﺒﺷ لﺎﺼﺗا ﭻﻴﻫ %d: +ﻦﺷور +شﻮﻣﺎﺧ +ﻪﻠﺣ +بﺎﺨﺘﻧا +ﻮﻐﻟ +هﺮﻳاد +رﺪﺑﺮﺿ +ﺎﻫ یزﺎﺑ ﺖﺴﻴﻟ +ﺎﻫ یزﺎﺑ تﺎﻤﻴﻈﻨﺗ +تﺎﻤﻴﻈﻨﺗ مﺎﻤﺗ ندﺮﻛ کﺎﭘ +یزﺎﺑ یﺎﻫ ﺪﻴﻠﻛ مﺎﻤﺗ ندﺮﻛ کﺎﭘ +لوﺮﻜﺳا ﺖﻋﺮﺳ +ﻪﺘﺴﻫآ +ﻲﻟﻮﻤﻌﻣ +ﻊﻳﺮﺳ +ضﺮﻔﺸﻴﭘ ﻮﻨﻣ +ﮏﺴﻳد زا یراﺰﮔرﺎﺑ +ﺪﻴﻨﺎﻤﺑ ﺮﻈﺘﻨﻣ ﺎﻔﻄﻟ +هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ یزﺎﺑ ﻪﺳﺎﻨﺷ یراﺬﮔرﺎﺑ مﺎﮕﻨﻫ رد +رﺎﻛدﻮﺧ نداد ﺐﻴﺗﺮﺗ +ﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ نﺎﺑز ﻞﻴﺎﻓ یراﺬﮔرﺎﺑ مﺎﮕﻨﻫرد +ﻲﻳﺎﺸﮔ ﻞﻜﺸﻣ یﺎﻫ ﮓﻧر ندﺮﻛ لﺎﻌﻓﺮﻴﻏ +...ﺪﻴﻧﺎﻤﺑ ﺮﻈﺘﻨﻣ ﺪﺸﻧ اﺪﻴﭘ یﺮﻟﺮﺘﻨﻛ ﭻﻴﻫ +ﺎﻫ یزﺎﺑ روﺎﻛ ندﺮﻛ لﺎﻌﻓ +هﺪﻴﺸﻛ ﻪﺤﻔﺻ +ندﺮﻛ شﻮﻣﺎﺧ +یﺪﻨﺑﺮﻜﻴﭘ یراﺬﮔرﺎﺑ لﺎﺣرد +یﺪﻨﺑﺮﻜﻴﭘ هﺮﻴﺧذ لﺎﺣرد +هﺪﻨﻨﻛ عوﺮﺷ هﺎﮕﺘﺳد +یزﺎﺳ هزﺎﺗ +USB هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ +HDD هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ +ETH هﺎﮕﺘﺳد عوﺮﺷ ﺖﻟﺎﺣ +ﺎﻫ ﻪﻣﺎﻧﺮﺑ ﻮﻨﻣ نداد نﺎﺸﻧ +رﺎﻛدﻮﺧ +ﻲﺘﺳد +HDL روﺮﺳ عوﺮﺷ +...ﺪﺷﺎﺒﻴﻣ یزاﺪﻧا هار لﺎﺣرد HDL روﺮﺳ +...ﺪﺷﺎﺒﻴﻣ اﺮﺟا لﺎﺣرد HDL روﺮﺳ +.درﻮﺧ ﺖﺴﻜﺷ HDL روﺮﺳ یزاﺪﻧا هار +...ﺪﺷﺎﺒﻴﻣ ﻪﻴﻠﺨﺗ لﺎﺣرد HDL روﺮﺳ +IGR ﺮﻴﺴﻣ +ﻪﻨﻴﻣز ﺲﭘ ﮓﻧر +نﻮﺘﻣ ﮓﻧر +- 2 ﻦﺸﻴﺘﺳا ﻲﻠﭘ - +- SMB روﺮﺳ - +ﻲﭙﻳآ سردآ عﻮﻧ +ﺎﺘﺴﻳا DHCP -آدرس آﻳﭙﻲ -آدرس -ﭘﻮﺷﺶ -دروازه -ﺳﺮور DNS -ﭘﻮرت -اﺷﺘﺮاک -ﻧﺎم ﻛﺎرﺑﺮی -ﻛﻠﻤﻪ ﻋﺒﻮر -<ﺗﻌﻴﻴﻦ ﻧﺸﺪه> -ﻧﻮع آدرس -آﻳﭙﻲ +ﻲﭙﻳآ سردآ +سردآ +ﺶﺷﻮﭘ +هزاورد +DNS روﺮﺳ +ترﻮﭘ +کاﺮﺘﺷا +یﺮﺑرﺎﻛ مﺎﻧ +رﻮﺒﻋ ﻪﻤﻠﻛ +>هﺪﺸﻧ ﻦﻴﻴﻌﺗ< +سردآ عﻮﻧ +ﻲﭙﻳآ NetBIOS -ﭘﺬﻳﺮﻓﺘﻦ -آﻳﺘﻢ ﺑﻄﻮر ﻛﺎﻣﻞ ﭘﺎک ﻣﻴﺸﻮد اداﻣﻪ ﻣﻴﺪﻫﻴﺪ؟ -ﺗﻐﻴﻴﺮﻧﺎم -ﭘﺎک ﻛﺮدن -اﺟﺮا -ﺗﻨﻈﻴﻤﺎت ﻧﻤﺎﻳﺸﮕﺮ -ﻓﻌﺎل ﻛﺮدن اﺟﺎزه ﻧﻮﺷﺘﻦ -ﭼﮏ ﻛﺮدن ﺑﻬﻢ رﻳﺨﺘﮕﻲ ﺑﺎزی ﻫﺎی USB -ﺑﻪ ﻳﺎد داﺷﺘﻦ آﺧﺮﻳﻦ ﺑﺎزی اﻧﺟﺎم ﺷﺪه -دﻛﻤﻪ ی اﻧﺘﺨﺎب -ﻣﺸﻜﻠﻲ ﺑﻪ وﺟﻮد آﻣﺪه ﻓﺎﻳﻞ ﻫﺎی ﺑﺎزی ﺑﻪ ﻫﻢ رﻳﺨﺘﻪ اﺳﺖ -ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه اﺟﺮای آﻳﺘﻢ اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ -ﺗﺴﺖ -ﺑﺮای ورود ﺑﻪ ﺻﻮرت ﻧﺎﺷﻨﺎس ﺧﺎﻟﻲ ﺑﮕﺬارﻳﺪ. +ﻦﺘﻓﺮﻳﺬﭘ +؟ﺪﻴﻫﺪﻴﻣ ﻪﻣادا دﻮﺸﻴﻣ کﺎﭘ ﻞﻣﺎﻛ رﻮﻄﺑ ﻢﺘﻳآ +مﺎﻧﺮﻴﻴﻐﺗ +ندﺮﻛ کﺎﭘ +اﺮﺟا +ﺮﮕﺸﻳﺎﻤﻧ تﺎﻤﻴﻈﻨﺗ +ﻦﺘﺷﻮﻧ هزﺎﺟا ندﺮﻛ لﺎﻌﻓ +USB یﺎﻫ یزﺎﺑ ﻲﮕﺘﺨﻳر ﻢﻬﺑ ندﺮﻛ ﮏﭼ +هﺪﺷ مﺎﺟﻧا یزﺎﺑ ﻦﻳﺮﺧآ ﻦﺘﺷاد دﺎﻳ ﻪﺑ +بﺎﺨﺘﻧا ی ﻪﻤﻛد +ﺖﺳا ﻪﺘﺨﻳر ﻢﻫ ﻪﺑ یزﺎﺑ یﺎﻫ ﻞﻳﺎﻓ هﺪﻣآ دﻮﺟو ﻪﺑ ﻲﻠﻜﺸﻣ +ﺖﺴﻴﻧ ﺮﻳﺬﭘ نﺎﻜﻣا ﻢﺘﻳآ یاﺮﺟا هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ +ﺖﺴﺗ +.ﺪﻳراﺬﮕﺑ ﻲﻟﺎﺧ سﺎﻨﺷﺎﻧ ترﻮﺻ ﻪﺑ دورو یاﺮﺑ Accurate Reads -ﺣﺎﻟﺖ Synchronous -ﺑﺎزﻛﺮدن Syscalls -رد ﻛﺮدن وﻳﺪﻳﻮ ﻫﺎ -ﺷﺒﻴﻪ ﺳﺎزی DVD-DL -ﻏﻴﺮﻓﻌﺎل ﻛﺮدن IGR -اﺳﺘﻔﺎده ﻧﺸﺪه -اﺳﺘﻔﺎده ﻧﺸﺪه -ﺗﻐﻴﻴﺮ اﻧﺪازه ﻛﺎرت ﺣﺎﻓﻈﻪ ی ﻣﺟﺎزی را ﻓﺮﻣﺖ ﻣﻴﻜﻨﺪ -ﺳﺎﺧﺘﻦ -ﺷﺮوع -ﺗﻐﻴﺮ دادن -ﻗﻄﻊ ﻛﺮدن -ﺑﺎز ﻧﺸﺎﻧﺪن -اﺳﺘﻔﺎده از generic -ﭘﻴﻜﺮﺑﻨﺪی ﺣﺎﻓﻈﻪ ﻣﺟﺎزی -ﻧﺎم -اﻧﺪازه -وﺿﻌﻴﺖ -ﭘﻴﺸﺮﻓﺖ -ﻓﺎﻳﻞ ﺣﺎﻓﻈﻪ ﻣﺟﺎزی ﻣﻮﺟﻮد اﺳﺖ -ﻓﺎﻳﻞ ﺣﺎﻓﻈﻪ ﻣﺟﺎزی ﻧﺎﻣﻌﺘﺒﺮ اﺳﺖ اﻧﺪازه درﺳﺖ ﻧﻴﺴﺖ -ﻓﺎﻳﻞ ﺣﺎﻓﻈﻪ ﻣﺟﺎزی ﻧﻴﺎز ﺑﻪ ﺳﺎﺧﺘﻪ ﺷﺪن دارد -ﻣﺸﻜﻠﻲ ﺑﺮای ﺣﺎﻓﻈﻪ ﻣﺟﺎزی %s ﺑﻪ وﺟﻮد آﻣﺪه, ﺑﺎ ﺣﺎﻓﻈﻪ ی ﻓﻴﺰﻳﻜﻲ اداﻣﻪ ﻣﻴﺪﻫﻴﺪ (درﮔﺎه %d) ؟ -ﺗﺎزه ﺳﺎزی ﺧﻮدﻛﺎر -درﺑﺎره -ﺑرﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن -ﺗﺴﺖ ﻛﻴﻔﻴﺖ -ﻣﺴﻴﺮ ﺗﺮﺟﻴﺤﻲ USB -اﺟﺮای ﻓﺎﻳﻞ ELF ﺳﻔﺎرﺷﻲ ﺑﻌﺪ از IGR -ﻣﻘﺪار در دﻗﻴﻘﻪ, 0 ﺑﺮای ﭼﺮﺧﺶ ﭘﺎﻳﻴﻦ -ﻛﺎﻫﺶ ﭼﺮﺧﺶ ﺧﻮدﻛﺎر HDD -ﺣﺎﻟﺖ وﻳﺪﻳﻮ -رﻧﮓ دﻳﺎﻟﻮگ ﻫﺎ -رﻧﮓ اﻧﺘﺨﺎب ﺷﺪه ﻫﺎ -ﻧﺸﺎن دادن ﺻﻔﺤﻪ اﻃﻠﺎﻋﺎت -اﻃﻠﺎﻋﺎت -ﻓﺎﻳﻞ ELF ﺳﻔﺎرﺷﻲ -اﻧﺘﺨﺎب رﻧﮓ -اﺗﺼﺎل ﻣﺠﺪد -ﺑﺮای ﻟﻴﺴﺖ ﻛﺮدن اﺷﺘﺮاک ﻫﺎ ﺧﺎﻟﻲ ﺑﮕﺬارﻳﺪ -ﻣﺴﻴﺮ ﺗﺮﺟﻴﺤﻲ ETH -ﭘﺎک ﻛﺮدن -ﻓﺎﺻﻠﻪ -اﻳﻨﺘﺮ -ﺣﺎﻟﺖ -درﮔﺎه ﺣﺎﻓﻈﻪ ﻣﺟﺎزی 1 -درﮔﺎه ﺣﺎﻓﻈﻪ ﻣﺟﺎزی 2 -ﺷﻨﺎﺳﻪ ﺑﺎزی -ﺣﺎﻟﺖ DMA +Synchronous ﺖﻟﺎﺣ +Syscalls ندﺮﻛزﺎﺑ +ﺎﻫ ﻮﻳﺪﻳو ندﺮﻛ در +DVD-DL یزﺎﺳ ﻪﻴﺒﺷ +IGR ندﺮﻛ لﺎﻌﻓﺮﻴﻏ +هﺪﺸﻧ هدﺎﻔﺘﺳا +هﺪﺸﻧ هدﺎﻔﺘﺳا +ﺪﻨﻜﻴﻣ ﺖﻣﺮﻓ ار یزﺎﺟﻣ ی ﻪﻈﻓﺎﺣ ترﺎﻛ هزاﺪﻧا ﺮﻴﻴﻐﺗ +ﻦﺘﺧﺎﺳ +عوﺮﺷ +نداد ﺮﻴﻐﺗ +ندﺮﻛ ﻊﻄﻗ +نﺪﻧﺎﺸﻧ زﺎﺑ +generic زا هدﺎﻔﺘﺳا +یزﺎﺟﻣ ﻪﻈﻓﺎﺣ یﺪﻨﺑﺮﻜﻴﭘ +مﺎﻧ +هزاﺪﻧا +ﺖﻴﻌﺿو +ﺖﻓﺮﺸﻴﭘ +ﺖﺳا دﻮﺟﻮﻣ یزﺎﺟﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ +ﺖﺴﻴﻧ ﺖﺳرد هزاﺪﻧا ﺖﺳا ﺮﺒﺘﻌﻣﺎﻧ یزﺎﺟﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ +دراد نﺪﺷ ﻪﺘﺧﺎﺳ ﻪﺑ زﺎﻴﻧ یزﺎﺟﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ +؟ )%d هﺎﮔرد( ﺪﻴﻫﺪﻴﻣ ﻪﻣادا ﻲﻜﻳﺰﻴﻓ ی ﻪﻈﻓﺎﺣ ﺎﺑ ,هﺪﻣآ دﻮﺟو ﻪﺑ %s یزﺎﺟﻣ ﻪﻈﻓﺎﺣ یاﺮﺑ ﻲﻠﻜﺸﻣ +رﺎﻛدﻮﺧ یزﺎﺳ هزﺎﺗ +هرﺎﺑرد +نﺎﺴﻳﻮﻧ ﻪﻣﺎﻧرﺑ +ﺖﻴﻔﻴﻛ ﺖﺴﺗ +USB ﻲﺤﻴﺟﺮﺗ ﺮﻴﺴﻣ +IGR زا ﺪﻌﺑ ﻲﺷرﺎﻔﺳ ELF ﻞﻳﺎﻓ یاﺮﺟا +ﻦﻴﻳﺎﭘ ﺶﺧﺮﭼ یاﺮﺑ 0 ,ﻪﻘﻴﻗد رد راﺪﻘﻣ +HDD رﺎﻛدﻮﺧ ﺶﺧﺮﭼ ﺶﻫﺎﻛ +ﻮﻳﺪﻳو ﺖﻟﺎﺣ +ﺎﻫ گﻮﻟﺎﻳد ﮓﻧر +ﺎﻫ هﺪﺷ بﺎﺨﺘﻧا ﮓﻧر +تﺎﻋﺎﻠﻃا ﻪﺤﻔﺻ نداد نﺎﺸﻧ +تﺎﻋﺎﻠﻃا +ﻲﺷرﺎﻔﺳ ELF ﻞﻳﺎﻓ +ﮓﻧر بﺎﺨﺘﻧا +دﺪﺠﻣ لﺎﺼﺗا +ﺪﻳراﺬﮕﺑ ﻲﻟﺎﺧ ﺎﻫ کاﺮﺘﺷا ندﺮﻛ ﺖﺴﻴﻟ یاﺮﺑ +ETH ﻲﺤﻴﺟﺮﺗ ﺮﻴﺴﻣ +ندﺮﻛ کﺎﭘ +ﻪﻠﺻﺎﻓ +ﺮﺘﻨﻳا +ﺖﻟﺎﺣ +1 یزﺎﺟﻣ ﻪﻈﻓﺎﺣ هﺎﮔرد +2 یزﺎﺟﻣ ﻪﻈﻓﺎﺣ هﺎﮔرد +یزﺎﺑ ﻪﺳﺎﻨﺷ +DMA ﺖﻟﺎﺣ V-Sync -ﺣﺎﻟﺖ 1 -ﺣﺎﻟﺖ 2 -ﺣﺎﻟﺖ 3 -ﺣﺎﻟﺖ 4 -ﺣﺎﻟﺖ 5 -ﺣﺎﻟﺖ 6 -ﺣﺎﻟﺖ 7 -ﺣﺎﻟﺖ 8 -ﭘﻴﻜﺮﺑﻨﺪی GSM -ﺣﺎﻟﺖ ارﺗﺒﺎط اﻳﻨﺘﺮﻧﺖ -100 ﻣﮕﺎﺑﻴﺖ ﻛﺎﻣﻠﺎ ﻣﻀﺎﻋﻒ -100 ﻣﮕﺎﺑﻴﺖ ﻧﻴﻤﻪ ﻣﻀﺎﻋﻒ -10 ﻣﮕﺎﺑﻴﺖ ﻛﺎﻣﻠﺎ ﻣﻀﺎﻋﻒ -10 ﻣﮕﺎﺑﻴﺖ ﻧﻴﻤﻪ ﻣﻀﺎﻋﻒ -ﺗﻨﻈﻴﻤﺎت GSM -ﻓﻌﺎل ﻛﺮدن GSM -روﺷﻦ ﻳﺎ ﺧﺎﻣﻮش ﻛﺮدن GSM -ﺣﺎﻟﺖ وﻳﺪﻳﻮ -اﺟﺒﺎر ﺑﻪ ﻧﻤﺎﻳﺸﮕﺮ ﺳﻔﺎرﺷﻲ -ﻣﻮﻘﻌﻴﺖ H -ﺗﻨﻈﻴﻢ ﺣﺎﻟﺖ اﻓﻘﻲ -ﻣﻮﻘﻌﻴﺖ V -ﺗﻨﻈﻴﻢ ﺣﺎﻟﺖ ﻋﻤﻮدی -ﺑﺰرگ ﻛﺮدن ﺗﺼﻮﻳﺮ -ﺗﻨﻈﻴﻢ ﻣﻴﺰان ﺑﺰرگ ﻛﺮدن ﺗﺼﻮﻳﺮ -ﭘﺮﻳﺪن از FMV -ﭘﺮﻳﺪن از ﻛﺎت ﺳﻴﻦ ﻫﺎ -ﺗﻨﻈﻴﻤﺎت ﻛﺪ ﺗﻘﻠﺐ -ﻓﻌﺎل ﻛﺮدن ﻣﻮﺗﻮر ﻛﺪ ﺗﻘﻠﺐ PS2RD -ﺑﮕﺬارﻳﺪ ﺗﺎ ﻣﻮﺗﻮر ﻛﺪ ﺗﻘﻠﺐ PS2RD ﺑﺎزی ﺷﻤﺎرا ﭘﭻ ﻛﻨﺪ -ﺣﺎﻟﺖ ﻣﻮﺗﻮر ﻛﺪ ﺗﻘﻠﺐ PS2RD -اﻧﺘﺨﺎب ﺧﻮدﻛﺎر و ﻳﺎ اﻧﺘﺨﺎب دﺳﺘﻲ رﻣﺰ ﺗﻘﻠﺐ ﺑﺎزی -اﻧﺘﺨﺎب ﺧﻮدﻛﺎر رﻣﺰ ﺗﻘﻠﺐ -اﻧﺘﺨﺎب دﺳﺘﻲ رﻣﺰ ﺑﺎزی -در ﺑﺎرﮔﺬاری ﻓﺎﻳﻞ ﻛﺪ ﺗﻘﻠﺐ ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه -ﻫﻴﭻ ﻛﺪ ﺗﻘﻠﺒﻲ ﻳﺎﻓﺖ ﻧﺸﺪ -داﻧﻠﻮد ﭘﻴﺶ ﻓﺮض ﻫﺎ -آﭘﺪﻳﺖ از ﻃﺮﻳﻖ ﺷﺒﻜﻪ -داﻧﻠﻮد ﻣﺠﺪد ﻓﺎﻳﻞ ﻫﺎی ﻣﻮﺟﻮد؟ -آﭘﺪﻳﺖ ﺷﻜﺴﺖ ﺧﻮرد. -در اﺗﺼﺎل ﺑﻪ ﺳﺮور آﭘﺪﻳﺖ ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه. -اﭘﺪﻳﺖ ﺗﻜﻤﻴﻞ ﺷﺪ. -آﭘﺪﻳﺖ ﻟﻐﻮ ﺷﺪ. -ﺗﻨﻈﻴﻤﺎت از ﺷﺒﻜﻪ داﻧﻠﻮد ﺷﻮد؟ -ﺗﻨﻈﻴﻤﺎت ﺷﺨﺼﻲ ﺳﺎزی ﺷﺪه -ﭘﻴﺶ ﻓﺮض ﻫﺎ داﻧﻠﻮد ﺷﺪ -ﺷﺮوع ﺧﻮدﻛﺎر در %i ﺛﺎﻧﻴﻪ... -ﺷﺮوع ﺧﻮدﻛﺎر -ﻣﻘﺪار در ﺛﺎﻧﻴﻪ, 0 ﺑﺮای ﻏﻴﺮﻓﻌﺎل ﻛﺮدن ﺷﺮوع ﺧﻮدﻛﺎر -ﻟﻮﮔﻮ ﭘﻠﻲ اﺳﺘﻴﺸﻦ 2 -ﻓﻘﻂ ﺑﺮای ﻳﮏ دﻳﺴﮏ ﻣﻌﺘﺒﺮ ﻛﻪ ﺑﺎ رﻳﺠﻦ ﻛﻨﺴﻮل ﻫﻤﺨﻮاﻧﻲ داﺷﺘﻪ ﺑﺎﺷﺪ ﻧﺸﺎن داده ﻣﻴﺸﻮد -ﭘﻴﻜﺮﺑﻨﺪی ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ -ﺗﻨﻈﻴﻤﺎت ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ -ﻓﻌﺎل ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ -روﺷن و ﻳﺎ ﺧﺎﻣﻮش ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ ﺑﺮای ﺑﺎزی ﻫﺎی اﻧﺘﺨﺎب ﺷﺪه. -ﺣﺎﻟﺖ ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ -اﻧﺘﺨﺎب ﺣﺎﻟﺖ ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ. -ﻛﻨﺘﺮﻟﺮ ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3/4 از ﻃﺮﻴﻖ USB -ﻛﻨﺘﺮﻟﺮ ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3/4 از ﻃﺮﻴﻖ ﺑﻠﻮﺗﻮث -ﺗﻨﻈﻴﻤﺎت ﺑﺮای درﮔﺎه: -درﮔﺎه ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ را ﺑﺮای ﺗﻨﻈﻴﻤﺎت اﻧﺘﺨﺎب ﻛﻨﻴﺪ. -ﻓﻌﺎل ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎزی -روﺷﻦ و ﻳﺎ ﺧﺎﻣﻮش ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ ﺑﺮای درﮔﺎه ﻫﺎی اﻧﺘﺨﺎب ﺷﺪه. -ﻓﻌﺎل ﻛﺮدن ﺷﻮک -ﻓﻌﺎل ﻳﺎ ﻏﻴﺮﻓﻌﺎل ﻛﺮدن وﻳﺒﺮه ی ﺷﺒﻴﻪ ﺳﺎز ﻛﻨﺘﺮﻟﺮ ﺑﺮای دﺮﮔﺎه ﻫﺎی اﻧﺘﺨﺎب ﺷﺪه. -ﻣﮏ آدرس آداﭘﺘﻮر ﺑﻠﻮﺗﻮث USB: -ﻛﻨﺘﺮﻟﺮ ﭘﻠﻲ اﺳﺘﻴﺸﻦ ﺟﻔﺖ ﺷﺪه اﺳﺖ ﺑﺎ ﻣﮏ آدرس: -ﺟﻔﺖ ﻛﺮدن -ﺟﻔﺖ ﻛﺮدن ﻛﻨﺘﺮﻟﺮ ﻫﺎی ﭘﻠﻲ اﺳﺘﻴﺸﻦ -ﺟﻔﺖ ﻛﺮدن ﻛﻨﺘﺮﻟﺮ ﭘﻠﻲ اﺳﺘﻴﺸﻦ ﺑﺎ ﻣﮏ آدرس آداﭘﺘﻮر ﺑﻠﻮﺗﻮث. -ﻣﺘﺼﻞ ﻧﺸﺪ -اﻃﻠﺎﻋﺎت آداﭘﺘﻮر ﺑﻠﻮﺗﻮث -ﻧﺸﺎن دادن اﻃﻠﺎﻋﺎت ﺑﻴﺸﺘﺮ و ﻗﺎﺑﻠﻴﺖ ﻫﺎی ﭘﺸﺘﻴﺒﺎﻧﻲ ﺷﺪه -ﻧﺴﺨﻪ ی HCI: -ﻧﺴﺨﻪ ی LMP: -ﺷﻨﺎﺳﻪ ﺗﻮﻟﻴﺪ ﻛﻨﻨﺪه: -ﻗﺎﺑﻠﻴﺖ ﻫﺎی ﭘﺸﺘﻴﺒﺎﻧﻲ ﺷﺪه: -ﺑﻠﻪ -ﺧﻴﺮ -آداﭘﺘﻮر ﺑﻠﻮﺗﻮث ﺑﺎﻳﺪ ﺑﻪ ﺻﻮرت ﻛﺎﻣﻞ ﺑﺎ ﻛﻨﺘﺮﻟﺮ ﻫﺎی ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3 و 4 ﺳﺎزﮔﺎر ﺑﺎﺷﺪ. -آداﭘﺘﻮر ﺑﻠﻮﺗﻮث ﺷﺎﻳﺪ ﺑﺎ ﻛﻨﺘﺮﻟﺮ ﻫﺎی ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3 و4 ﻛﺎر ﻧﻜﻨﺪ. -ﻓﻌﺎل ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎزی ﻓﺸﺮدن ﻫﻤﺰﻣﺎن ﭼﻨﺪ ﻛﻠﻴﺪ -روﺷﻦ و ﻳﺎ ﺧﺎﻣﻮش ﻛﺮدن ﺷﺒﻴﻪ ﺳﺎزی ﻓﺸﺮدن ﻫﻤﺰﻣﺎن ﭼﻨﺪ ﻛﻠﻴﺪ ﺑﺮای ﺑﺎزی ﻫﺎی اﻧﺘﺨﺎب ﺷﺪه. -ﺷﺒﻴﻪ ﺳﺎزی ﻓﺸﺮدن ﻫﻤﺰﻣﺎن ﭼﻨﺪ ﻛﻠﻴﺪ در درﮔﺎه -اﻧﺘﺨﺎب درﮔﺎه ﺑﺮای ﺷﺒﻴﻪ ﺳﺎزی ﻓﺸﺮدن ﻫﻤﺰﻣﺎن ﭼﻨﺪ ﻛﻠﻴﺪ. -ﻏﻴﺮﻓﻌﺎل ﻛﺮدن راه ﺣﻞ ﺑﺮای ﻛﻨﺘﺮﻟﺮ ﻫﺎی ﺗﻘﻠﺒﻲ ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3 -ﺑﻌﻀﻲ از ﻛﻨﺘﺮﻟﺮ ﻫﺎی ﺗﻘﻠﺒﻲ ﭘﻠﻲ اﺳﺘﻴﺸﻦ 3 ﺑﻪ راه ﺣﻞ ﻧﻴﺎز دارﻧﺪ, اﻳﻦ ﮔﺰﻳﻨﻪ آن را ﻏﻴﺮﻓﻌﺎل ﻣﻴﻜﻨﺪ. -ﺷﺒﻴﻪ ﺳﺎزی FIELD flipping -درﺳﺖ ﻛﺮدن ﺑﺎزی ﻫﺎیی ﻛﻪ در ﺣﺎﻟﺖ وﻳﺪﻳﻮ progressive ﮔﻠﻴﭻ دارﻧﺪ . -ﺗﻨﻈﻴﻤﺎت ﻗﻔﻞ واﻟﺪﻳﻦ -رﻣﺰ ﻋﺒﻮر ﻗﻔﻞ واﻟﺪﻳﻦ -ﺑﺮای ﻏﻴﺮﻓﻌﺎل ﻛﺮدن ﻗﻔﻞ واﻟﺪﻳﻦ ﺧﺎﻟﻲ ﮔﺬاﺷﺗﻪ ﺷﻮد. -رﻣﺰ ﻋﺒﻮر ﻗﻔﻞ واﻟﺪﻳﻦ را وارد ﻛﻨﻴﺪ -رﻣﺰ ﻋﺒﻮر ﻗﻔﻞ واﻟﺪﻳﻦ ﻧﺎدرﺳﺖ اﺳﺖ. -ﻗﻔﻞ واﻟﺪﻳﻦ ﻏﻴﺮﻓﻌﺎل ﺷﺪ. -ﮔﺰﻳﻨﻪ ﻫﺎی ﺳﺎﺧﺖ: -ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه - اﻳﻦ رﻣﺰ ﻋﺒﻮر ﻧﻤﻴﺘﻮاﻧﺪ اﺳﺘﻔﺎده ﺷﻮد. -ﻓﺎﻳﻞ ﺣﺎﻓﻈﻪ ﻣﺠﺎزی %s دﭼﺎر ﺑﻬﻢ رﻳﺨﺘﮕﻲ ﺷﺪه اﺳﺖ. اداﻣﻪ ﺑﺎ ﺣﺎﻓﻈﻪ ی ﻓﻴﺰﻳﻜﻲ درﮔﺎه %d? -ﺗﻨﻈﻴﻤﺎت ﺻﺪا -ﻓﻌﺎل ﻛﺮدن ﺟﻠﻮه ﻫﺎی ﺻﻮﺗﻲ -ﻓﻌﺎل ﻛﺮدن ﺻﺪای ﺑﻮت -درﺟﻪ ﺻﺪا ﺟﻠﻮه ﻫﺎی ﺻﻮﺗﻲ -درﺟﻪ ی ﺻﺪای ﺑﻮت -ﺗﻐﻴﻴﺮ ﺣﺎﻟﺖ وﻳﺪﻳﻮ را ﺗﺎﻳﻴﺪ ﻣﻴﻜﻨﻴﺪ؟> -ﻛﺶ ﻓﻬﺮﺳﺖ ﺑﺎزی ﻫﺎ (HDD) -ﺑﺎزی ﻫﺎی ﭘﻠﻲ اﺳﺘﻴﺸﻦ 1 -ﺣﺎﻟﺖ ﻧﻤﺎﻳﺶ ﺑﺎزی ﻫﺎی ﭘﻠﻲ اﺳﺘﻴﺸﻦ 1 -ﻓﺎﻳﻞ POPSTARTER.ELF ﻳﺎﻓﺖ ﻧﺸﺪ در '%s'! -ﻓﺎﻳﻞ VCD '%s' وﺟﻮد ﻧﺪارد! -در ﻫﻨﮕﺎم ﺗﻐﻴﻴﺮ ﻧﺎم ﻓﺎﻳﻞ ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه. -در ﻫﻨﮕﺎم ﭘﺎک ﻛﺮدن ﻓﺎﻳﻞ ﻣﺸﻜﻠﻲ ﭘﻴﺶ آﻣﺪه. -ﻫﺮﮔﺰ OPEN-PS2-LOADER (OPL) را ﻧﺨﺮﻳﺪ, در ﻋﻮض آن را راﻳﮕﺎن درﻳﺎﻓﺖ ﻛﻨﻴﺪ: -ﻧﺴﺨﻪ ی ifcaro OPL در psx-scene.com -ﻧﺴﺨﻪ ی ﺳﺎﺧﺖ روزاﻧﻪ OPL (DB) در ps2-home.com +1 ﺖﻟﺎﺣ +2 ﺖﻟﺎﺣ +3 ﺖﻟﺎﺣ +4 ﺖﻟﺎﺣ +5 ﺖﻟﺎﺣ +6 ﺖﻟﺎﺣ +7 ﺖﻟﺎﺣ +8 ﺖﻟﺎﺣ +GSM یﺪﻨﺑﺮﻜﻴﭘ +ﺖﻧﺮﺘﻨﻳا طﺎﺒﺗرا ﺖﻟﺎﺣ +ﻒﻋﺎﻀﻣ ﺎﻠﻣﺎﻛ ﺖﻴﺑﺎﮕﻣ 001 +ﻒﻋﺎﻀﻣ ﻪﻤﻴﻧ ﺖﻴﺑﺎﮕﻣ 001 +ﻒﻋﺎﻀﻣ ﺎﻠﻣﺎﻛ ﺖﻴﺑﺎﮕﻣ 01 +ﻒﻋﺎﻀﻣ ﻪﻤﻴﻧ ﺖﻴﺑﺎﮕﻣ 01 +GSM تﺎﻤﻴﻈﻨﺗ +GSM ندﺮﻛ لﺎﻌﻓ +GSM ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ ﻦﺷور +ﻮﻳﺪﻳو ﺖﻟﺎﺣ +ﻲﺷرﺎﻔﺳ ﺮﮕﺸﻳﺎﻤﻧ ﻪﺑ رﺎﺒﺟا +H ﺖﻴﻌﻘﻮﻣ +ﻲﻘﻓا ﺖﻟﺎﺣ ﻢﻴﻈﻨﺗ +V ﺖﻴﻌﻘﻮﻣ +یدﻮﻤﻋ ﺖﻟﺎﺣ ﻢﻴﻈﻨﺗ +ﺮﻳﻮﺼﺗ ندﺮﻛ گرﺰﺑ +ﺮﻳﻮﺼﺗ ندﺮﻛ گرﺰﺑ ناﺰﻴﻣ ﻢﻴﻈﻨﺗ +FMV زا نﺪﻳﺮﭘ +ﺎﻫ ﻦﻴﺳ تﺎﻛ زا نﺪﻳﺮﭘ +ﺐﻠﻘﺗ ﺪﻛ تﺎﻤﻴﻈﻨﺗ +PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ندﺮﻛ لﺎﻌﻓ +ﺪﻨﻛ ﭻﭘ ارﺎﻤﺷ یزﺎﺑ PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺎﺗ ﺪﻳراﺬﮕﺑ +PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺖﻟﺎﺣ +یزﺎﺑ ﺐﻠﻘﺗ ﺰﻣر ﻲﺘﺳد بﺎﺨﺘﻧا ﺎﻳ و رﺎﻛدﻮﺧ بﺎﺨﺘﻧا +ﺐﻠﻘﺗ ﺰﻣر رﺎﻛدﻮﺧ بﺎﺨﺘﻧا +یزﺎﺑ ﺰﻣر ﻲﺘﺳد بﺎﺨﺘﻧا +هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ﺐﻠﻘﺗ ﺪﻛ ﻞﻳﺎﻓ یراﺬﮔرﺎﺑ رد +ﺪﺸﻧ ﺖﻓﺎﻳ ﻲﺒﻠﻘﺗ ﺪﻛ ﭻﻴﻫ +ﺎﻫ ضﺮﻓ ﺶﻴﭘ دﻮﻠﻧاد +ﻪﻜﺒﺷ ﻖﻳﺮﻃ زا ﺖﻳﺪﭘآ +؟دﻮﺟﻮﻣ یﺎﻫ ﻞﻳﺎﻓ دﺪﺠﻣ دﻮﻠﻧاد +.درﻮﺧ ﺖﺴﻜﺷ ﺖﻳﺪﭘآ +.هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ﺖﻳﺪﭘآ روﺮﺳ ﻪﺑ لﺎﺼﺗا رد +.ﺪﺷ ﻞﻴﻤﻜﺗ ﺖﻳﺪﭘا +.ﺪﺷ ﻮﻐﻟ ﺖﻳﺪﭘآ +؟دﻮﺷ دﻮﻠﻧاد ﻪﻜﺒﺷ زا تﺎﻤﻴﻈﻨﺗ +هﺪﺷ یزﺎﺳ ﻲﺼﺨﺷ تﺎﻤﻴﻈﻨﺗ +ﺪﺷ دﻮﻠﻧاد ﺎﻫ ضﺮﻓ ﺶﻴﭘ +...ﻪﻴﻧﺎﺛ %i رد رﺎﻛدﻮﺧ عوﺮﺷ +رﺎﻛدﻮﺧ عوﺮﺷ +رﺎﻛدﻮﺧ عوﺮﺷ ندﺮﻛ لﺎﻌﻓﺮﻴﻏ یاﺮﺑ 0 ,ﻪﻴﻧﺎﺛ رد راﺪﻘﻣ +2 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﻮﮔﻮﻟ +دﻮﺸﻴﻣ هداد نﺎﺸﻧ ﺪﺷﺎﺑ ﻪﺘﺷاد ﻲﻧاﻮﺨﻤﻫ لﻮﺴﻨﻛ ﻦﺠﻳر ﺎﺑ ﻪﻛ ﺮﺒﺘﻌﻣ ﮏﺴﻳد ﮏﻳ یاﺮﺑ ﻂﻘﻓ +ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ یﺪﻨﺑﺮﻜﻴﭘ +ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ تﺎﻤﻴﻈﻨﺗ +ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ لﺎﻌﻓ +.هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ یزﺎﺑ یاﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ و نﺷور +ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ﺖﻟﺎﺣ +.ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ﺖﻟﺎﺣ بﺎﺨﺘﻧا +USB ﻖﻴﺮﻃ زا 4/3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﺮﻟﺮﺘﻨﻛ +ثﻮﺗﻮﻠﺑ ﻖﻴﺮﻃ زا 4/3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﺮﻟﺮﺘﻨﻛ +:هﺎﮔرد یاﺮﺑ تﺎﻤﻴﻈﻨﺗ +.ﺪﻴﻨﻛ بﺎﺨﺘﻧا تﺎﻤﻴﻈﻨﺗ یاﺮﺑ ار ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ هﺎﮔرد +یزﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ لﺎﻌﻓ +.هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ هﺎﮔرد یاﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ و ﻦﺷور +کﻮﺷ ندﺮﻛ لﺎﻌﻓ +.هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ هﺎﮔﺮد یاﺮﺑ ﺮﻟﺮﺘﻨﻛ زﺎﺳ ﻪﻴﺒﺷ ی هﺮﺒﻳو ندﺮﻛ لﺎﻌﻓﺮﻴﻏ ﺎﻳ لﺎﻌﻓ +:USB ثﻮﺗﻮﻠﺑ رﻮﺘﭘادآ سردآ ﮏﻣ +:سردآ ﮏﻣ ﺎﺑ ﺖﺳا هﺪﺷ ﺖﻔﺟ ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﺮﻟﺮﺘﻨﻛ +ندﺮﻛ ﺖﻔﺟ +ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ ﺮﻟﺮﺘﻨﻛ ندﺮﻛ ﺖﻔﺟ +.ثﻮﺗﻮﻠﺑ رﻮﺘﭘادآ سردآ ﮏﻣ ﺎﺑ ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﺮﻟﺮﺘﻨﻛ ندﺮﻛ ﺖﻔﺟ +ﺪﺸﻧ ﻞﺼﺘﻣ +ثﻮﺗﻮﻠﺑ رﻮﺘﭘادآ تﺎﻋﺎﻠﻃا +هﺪﺷ ﻲﻧﺎﺒﻴﺘﺸﭘ یﺎﻫ ﺖﻴﻠﺑﺎﻗ و ﺮﺘﺸﻴﺑ تﺎﻋﺎﻠﻃا نداد نﺎﺸﻧ +:HCI ی ﻪﺨﺴﻧ +:LMP ی ﻪﺨﺴﻧ +:هﺪﻨﻨﻛ ﺪﻴﻟﻮﺗ ﻪﺳﺎﻨﺷ +:هﺪﺷ ﻲﻧﺎﺒﻴﺘﺸﭘ یﺎﻫ ﺖﻴﻠﺑﺎﻗ +ﻪﻠﺑ +ﺮﻴﺧ +.ﺪﺷﺎﺑ رﺎﮔزﺎﺳ 4 و 3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ ﺮﻟﺮﺘﻨﻛ ﺎﺑ ﻞﻣﺎﻛ ترﻮﺻ ﻪﺑ ﺪﻳﺎﺑ ثﻮﺗﻮﻠﺑ رﻮﺘﭘادآ +.ﺪﻨﻜﻧ رﺎﻛ 4و 3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ ﺮﻟﺮﺘﻨﻛ ﺎﺑ ﺪﻳﺎﺷ ثﻮﺗﻮﻠﺑ رﻮﺘﭘادآ +ﺪﻴﻠﻛ ﺪﻨﭼ نﺎﻣﺰﻤﻫ ندﺮﺸﻓ یزﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ لﺎﻌﻓ +.هﺪﺷ بﺎﺨﺘﻧا یﺎﻫ یزﺎﺑ یاﺮﺑ ﺪﻴﻠﻛ ﺪﻨﭼ نﺎﻣﺰﻤﻫ ندﺮﺸﻓ یزﺎﺳ ﻪﻴﺒﺷ ندﺮﻛ شﻮﻣﺎﺧ ﺎﻳ و ﻦﺷور +هﺎﮔرد رد ﺪﻴﻠﻛ ﺪﻨﭼ نﺎﻣﺰﻤﻫ ندﺮﺸﻓ یزﺎﺳ ﻪﻴﺒﺷ +.ﺪﻴﻠﻛ ﺪﻨﭼ نﺎﻣﺰﻤﻫ ندﺮﺸﻓ یزﺎﺳ ﻪﻴﺒﺷ یاﺮﺑ هﺎﮔرد بﺎﺨﺘﻧا +3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﻲﺒﻠﻘﺗ یﺎﻫ ﺮﻟﺮﺘﻨﻛ یاﺮﺑ ﻞﺣ هار ندﺮﻛ لﺎﻌﻓﺮﻴﻏ +.ﺪﻨﻜﻴﻣ لﺎﻌﻓﺮﻴﻏ ار نآ ﻪﻨﻳﺰﮔ ﻦﻳا ,ﺪﻧراد زﺎﻴﻧ ﻞﺣ هار ﻪﺑ 3 ﻦﺸﻴﺘﺳا ﻲﻠﭘ ﻲﺒﻠﻘﺗ یﺎﻫ ﺮﻟﺮﺘﻨﻛ زا ﻲﻀﻌﺑ +FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ +. ﺪﻧراد ﭻﻴﻠﮔ progressive ﻮﻳﺪﻳو ﺖﻟﺎﺣ رد ﻪﻛ ییﺎﻫ یزﺎﺑ ندﺮﻛ ﺖﺳرد +ﻦﻳﺪﻟاو ﻞﻔﻗ تﺎﻤﻴﻈﻨﺗ +ﻦﻳﺪﻟاو ﻞﻔﻗ رﻮﺒﻋ ﺰﻣر +.دﻮﺷ ﻪﺗﺷاﺬﮔ ﻲﻟﺎﺧ ﻦﻳﺪﻟاو ﻞﻔﻗ ندﺮﻛ لﺎﻌﻓﺮﻴﻏ یاﺮﺑ +ﺪﻴﻨﻛ دراو ار ﻦﻳﺪﻟاو ﻞﻔﻗ رﻮﺒﻋ ﺰﻣر +.ﺖﺳا ﺖﺳردﺎﻧ ﻦﻳﺪﻟاو ﻞﻔﻗ رﻮﺒﻋ ﺰﻣر +.ﺪﺷ لﺎﻌﻓﺮﻴﻏ ﻦﻳﺪﻟاو ﻞﻔﻗ +:ﺖﺧﺎﺳ یﺎﻫ ﻪﻨﻳﺰﮔ +.دﻮﺷ هدﺎﻔﺘﺳا ﺪﻧاﻮﺘﻴﻤﻧ رﻮﺒﻋ ﺰﻣر ﻦﻳا - هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ +?%d هﺎﮔرد ﻲﻜﻳﺰﻴﻓ ی ﻪﻈﻓﺎﺣ ﺎﺑ ﻪﻣادا .ﺖﺳا هﺪﺷ ﻲﮕﺘﺨﻳر ﻢﻬﺑ رﺎﭼد %s یزﺎﺠﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ +اﺪﺻ تﺎﻤﻴﻈﻨﺗ +ﻲﺗﻮﺻ یﺎﻫ هﻮﻠﺟ ندﺮﻛ لﺎﻌﻓ +تﻮﺑ یاﺪﺻ ندﺮﻛ لﺎﻌﻓ +ﻲﺗﻮﺻ یﺎﻫ هﻮﻠﺟ اﺪﺻ ﻪﺟرد +تﻮﺑ یاﺪﺻ ی ﻪﺟرد +>؟ﺪﻴﻨﻜﻴﻣ ﺪﻴﻳﺎﺗ ار ﻮﻳﺪﻳو ﺖﻟﺎﺣ ﺮﻴﻴﻐﺗ +)HDD( ﺎﻫ یزﺎﺑ ﺖﺳﺮﻬﻓ ﺶﻛ +1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ +1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ +!'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ +!دراﺪﻧ دﻮﺟو '%s' VCD ﻞﻳﺎﻓ +.هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ﻞﻳﺎﻓ مﺎﻧ ﺮﻴﻴﻐﺗ مﺎﮕﻨﻫ رد +.هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ﻞﻳﺎﻓ ندﺮﻛ کﺎﭘ مﺎﮕﻨﻫ رد +:ﺪﻴﻨﻛ ﺖﻓﺎﻳرد نﺎﮕﻳار ار نآ ضﻮﻋ رد ,ﺪﻳﺮﺨﻧ ار )OPL( OPEN-PS2-LOADER ﺰﮔﺮﻫ +psx-scene.com رد OPL oracfi ی ﻪﺨﺴﻧ +ps2-home.com رد )DB( OPL ﻪﻧازور ﺖﺧﺎﺳ ی ﻪﺨﺴﻧ \ No newline at end of file From 7859d00d0943f224d0b2fbe34fb28d108e8a8ee2 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 23 Sep 2019 15:14:49 -0700 Subject: [PATCH 171/269] update lang files --- lng/lang_Arabic.lng | 12 +++-- lng/lang_Bulgarian.lng | 16 ++++--- lng/lang_Czech.lng | 50 +++++++++---------- lng/lang_Danish.lng | 16 ++++--- lng/lang_Dutch.lng | 30 ++++++------ lng/lang_Filipino.lng | 98 +++++++++++++++++++------------------- lng/lang_French.lng | 20 ++++---- lng/lang_German.lng | 20 ++++---- lng/lang_Greek.lng | 12 +++-- lng/lang_Hungarian.lng | 20 ++++---- lng/lang_Indonesian.lng | 8 ++-- lng/lang_Italian.lng | 60 ++++++++++++----------- lng/lang_Japanese.lng | 12 +++-- lng/lang_Korean.lng | 20 ++++---- lng/lang_Laotian.lng | 58 +++++++++++----------- lng/lang_Persian.lng | 12 +++-- lng/lang_Polish.lng | 14 +++--- lng/lang_Portuguese.lng | 20 ++++---- lng/lang_Portuguese_BR.lng | 20 ++++---- lng/lang_Romana.lng | 54 +++++++++++---------- lng/lang_Russian.lng | 12 +++-- lng/lang_SChinese.lng | 12 +++-- lng/lang_Spanish.lng | 20 ++++---- lng/lang_Swedish.lng | 16 ++++--- lng/lang_TChinese.lng | 12 +++-- lng/lang_Turkish.lng | 22 +++++---- lng/lang_Vietnamese.lng | 22 +++++---- 27 files changed, 371 insertions(+), 317 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 59a573b3c..0f51c253a 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: July 02, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL @@ -9,7 +9,7 @@ OPL ﺔﻜﺒﺸﻟﺍ ﻦﻳﻮﻜﺗ ﺔﻣﺪﻘﺘﻣ ﺕﺍﺭﺎﻴﺧ >ﻢﻴﻗ ﺪﺟﻮﻳﻻ< -ﺔﻇﻮﻔﺤﻣ ﺕﺍﺩﺍﺪﻋﻹﺍ +Settings saved to %s ! ﺄﻄﺧ ﺕﺍﺩﺍﺪﻋﻻﺍ ﺔﺑﺎﺘﻛ ﺝﻭﺮﺧ ﺕﺍﺩﺍﺪﻋﻻﺍ @@ -133,7 +133,7 @@ VMC ﻦﻳﻮﻜﺗ ﺩﻮﺟﻮﻣ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ ﺢﻴﺤﺻ ﺮﻴﻏ ﻢﺠﺤﻟﺍﻭ ،ﺢﻟﺎﺻ ﺮﻴﻏ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ ﺀﺎﺸﻧﻻﺍ ﻰﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ ﺝﺎﺘﺤﻳ -؟ ﺩﺭﺎﻛ ﻱﺭﻮﻤﻴﻤﻟﺍ ﻊﻣ ﻱﺭﺎﺒﺟﺍ ﺭﺍﺮﻤﺘﺳﺍ ،ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻲﻓ ﺀﺎﻄﺧ +Error accessing VMC %s. Continue with the Memory Card in slot %d? ﻲﺋﺎﻘﻠﺘﻟﺍ ﺚﻳﺪﺤﺘﻟﺍ ﻝﻮﺣ ﻥﻮﺠﻣﺮﺒﻤﻟﺍ @@ -266,6 +266,8 @@ d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞ ﺪﻴﻬﻤﺘﻟﺍ ﺕﻮﺻ ﻢﺠﺣ ؟ﻮﻳﺪﻴﻔﻟﺍ ﻊﺿﻭ ﺮﻴﻴﻐﺗ ﺪﻴﻛﺄﺗ (HDD) ﺖﻗﺆﻤﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺏﺎﻌﻟﺃ ﺔﻤﺋﺎﻗ +Enable Notifications +%s loaded from %s PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF @@ -274,4 +276,4 @@ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ .ﻒﻠﻤﻟﺍ ﻑﺬﺣ ﺀﺎﻨﺛﺃ ﺄﻄﺧ ﺙﺪﺣ :ﻦﻣ ﺎًﻧﺎﺠﻣ ﻪﻴﻠﻋ ﻞﺼﺣﺍ ، ﺎًﻘﻠﻄﻣ (OPL) OPEN-PS2-LOADER ﻱﺮﺘﺸﺗ ﻻ psx-scene.com ﺪﻨﻋ ﺓﺩﻮﺟﻮﻤﻟﺍ ﺔﺨﺴﻨﻟﺍ OPL ifcaro -ps2-home.com ﺪﻨﻋ ﺓﺩﻮﺟﻮﻤﻟﺍ ﺔﺨﺴﻨﻟﺍ (DB) Builds Daily OPL \ No newline at end of file +ps2-home.com ﺪﻨﻋ ﺓﺩﻮﺟﻮﻤﻟﺍ ﺔﺨﺴﻨﻟﺍ (DB) Builds Daily OPL diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 6ef63af44..c13faf6be 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: Feb. 17, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -9,7 +9,7 @@ OPL %s Мрежови настройки Детайлни настройки <Няма опции> -Настройките са запазени. +Settings saved to %s Грешка при записване на настройките! Изход Настройки @@ -21,7 +21,7 @@ ETH Игри Тема Език Изключване на системата? -Изход от OPL? +Изход към Browser? Отмяна на обновяването? %d: Твърд Диск не е свързан. %d: Твърд Диск не е форматиран. @@ -133,7 +133,7 @@ Unused VMC файлът съществува. Невалиден VMC файл - грешен обем. VMC файлът трябва да бъде създаден. -Грешка с VMC %s, продължаване с MC в слот %s? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Автоматично опресняване Относно Програмисти: @@ -266,12 +266,14 @@ VMC %s файлът е фрагментиран. Продължаване с Mem Сила на звука на Начално зареждане Потвърждаване на промените във видеорежима? Cache Game List (HDD) +Enable Notifications +%s loaded from %s PS1 Games -PS1 Games display mode +PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index 6329e5491..657885ed0 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: Feb. 17, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -9,7 +9,7 @@ Zpět Síťová konfigurace Pokročilé možnosti <žádné hodnoty> -Nastavení uloženo... +Settings saved to %s Chyba při ukládání nastavení! Ukončit Nastavení @@ -133,7 +133,7 @@ Postup VMC soubor existuje Vadný VMC soubor, nesprávná velikost Je potřeba vytvořit VMC soubor -Chyba VMC %s, pokračovat s fyzickým slotem MC (slot %d) ? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Automatické obnovení O aplikaci Kodéři @@ -214,41 +214,41 @@ PS2 Logo Zobrazováno pouze u validního loga disku, který má stejný region jako konzole Configure PADEMU Pad Emulator Settings -Enable PadEmulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode +Enable Pad Emulator +Turns On/Off Pad Emulator for selected game. +Pad Emulator Mode Select Pad Emulator mode. DualShock3/4 USB DualShock3/4 BT -Settings for port: +Settings For Port: Select Pad Emulator port for settings. -Enable emulation +Enable Emulation Turns on/off Pad Emulator for selected port. -Enable vibration +Enable Vibration Turns on/off vibration for Pad Emulator selected port. -USB Bluetooth adapter MAC address: -DS Controller paired to MAC address: +USB Bluetooth Adapter MAC Address: +DS Controller Paired To MAC Address: Pair Pair DS Controller -Pair DS Controller with Bluetooth adapter MAC address. -Not connected -Bluetooth adapter information -Shows more information and supported features +Pair DS controller with Bluetooth adapter MAC address. +Not Connected +Bluetooth Adapter Information +Shows more information and supported features. HCI Version: LMP Version: Manufacturer ID: -Support features: +Supported Features: Yes No Bluetooth adapter should be fully compatible with DS3/DS4 controllers. Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation +Enable Multitap Emulation Turns on/off Multitap emulation for selected game. -Multitap emulator on port +Multitap Emulator On Port: Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -Emulate FIELD flipping +Disable Fake DS3 Workaround +Some fake DS3s need workaround, this option will disable it. +Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings Parental Lock Password @@ -266,12 +266,14 @@ Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) +Enable Notifications +%s loaded from %s PS1 Games -PS1 Games display mode +PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index 316196102..30ffb2a53 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: Jan. 30, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -9,7 +9,7 @@ Tilbage Netværksindstillinger Avancerede indstillinger -Indstillinger gemt... +Settings saved to %s Fejl ved lagering af indstillinger! Afslut Indstillinger @@ -133,7 +133,7 @@ Fremskridt VMC-fil eksisterer allerede Ugyldig VMC-fil, størrelse er ukorrekt VMC-fil skal oprettes -Fejl med VMC %s, fortsæt med fysisk MC (port %d)? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Automatisk opdatering Om Kodere @@ -248,7 +248,7 @@ Multitap Emulator på port Vælg port til Multitap-emulering. Deaktiver løsning for falsk DS3 Nogle falske DS3'er har brug for en løsning, dette deaktivere den. -Emulate FIELD flipping +Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings Parental Lock Password @@ -266,12 +266,14 @@ Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) +Enable Notifications +%s loaded from %s PS1 Games -PS1 Games display mode +PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index cc2643a3d..313bfd64b 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: Feb. 17, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -9,7 +9,7 @@ Terug Netwerkconfiguratie Geavanceerde opties -Instellingen opgeslagen... +Settings saved to %s Fout bij schrijven van instellingen! Sluiten Instellingen @@ -133,7 +133,7 @@ Voortgang VMC-bestand bestaat Ongeldige VMC-bestand, grootte is incorrect VMC-bestand moet gecreëerd worden -Fout met VMC %s, voorzetten met fysieke MC (slot %d)? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Automatisch vernieuwen Over Coders @@ -232,23 +232,23 @@ Paar Paar DS-controller Paar DS-controller met bluetoothadapter mac-adres Niet verbonden -Bluetooth adapter information -Shows more information and supported features +Bluetooth Adapter Information +Shows more information and supported features. HCI Version: LMP Version: Manufacturer ID: -Support features: +Supported Features: Yes No Bluetooth adapter should be fully compatible with DS3/DS4 controllers. Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation +Enable Multitap Emulation Turns on/off Multitap emulation for selected game. -Multitap emulator on port +Multitap Emulator On Port: Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -Emulate FIELD flipping +Disable Fake DS3 Workaround +Some fake DS3s need workaround, this option will disable it. +Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings Parental Lock Password @@ -266,12 +266,14 @@ Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) +Enable Notifications +%s loaded from %s PS1 Games -PS1 Games display mode +PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index c96ae578c..85b2ba4fa 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: Feb. 17, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -9,7 +9,7 @@ Likod Network Config Advanced options -Save ang mga setting... +Settings saved to %s Error sa pagsulat setting ! Lumabas Settings @@ -42,7 +42,7 @@ Cancel Circle Cross Games List -Game settings +Game Settings Alisin ang lahat ng mga setting ng Inalis ang lahat ng mga pindutan para sa mga laro i-scroll @@ -59,7 +59,7 @@ Huwag paganahin ang mga Kulay Debug Controller Walang natukoy na , naghihintay... Paganahin ang Cover Art Malapad na screen -Power off +Power Off Nilo-load ang config Sine-save ang config Simulan ang aparato @@ -133,7 +133,7 @@ pag-unlad VMC file umiiral Di-wastong VMC file , laki ay hindi tama VMC file na kailangan upang malikha -Error sa VMC %s , magpatuloy sa pisikal na MC (slot %d) ? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Awtomatikong i-refresh tungkol sa Coders @@ -171,84 +171,84 @@ Mode 7 Mode 8 Configure GSM Ethernet bilis at duplex setting -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex GSM Mga Setting paganahin GSM -Toggles GSM ON or OFF +Toggles GSM On/Off. VMODE -Forced Custom Display Mode +Forced custom display mode. H-POS -Horizontal Adjustment +Horizontal adjustment. V-POS -Vertical Adjustment +Vertical adjustment. Overscan -Overscan Adjustment +Overscan adjustment. FMV Skip -Skips Full Motion Videos +Skips full motion videos. Cheat Settings Enable PS2RD Cheat Engine -Let PS2RD Cheat Engine patch your game +Allow PS2RD Cheat Engine to patch your game. PS2RD Cheat Engine Mode -Auto-select or Select game cheats -Auto-select cheats -Select game cheats -Error: failed to load Cheat File -No cheats found -Download defaults -Network update -Re-download existing records? +Auto select or select game cheats. +Auto Select Cheats +Select Game Cheats +Error: failed to load cheat file. +No cheats found. +Download Defaults +Network Update +Redownload existing records? Update failed. Failed to connect to update server. Update completed. Update canceled. Download settings from the network? Customized Settings -Downloaded Defaults +Downloaded defaults. Auto start in %i s... -Auto start -Value in second(s), 0 to disable auto start +Auto Start +Value in second(s), 0 to disable auto start. PS2 Logo Only displayed for a valid disc logo which matches the console's region Configure PADEMU Pad Emulator Settings -Enable PadEmulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode +Enable Pad Emulator +Turns On/Off Pad Emulator for selected game. +Pad Emulator Mode Select Pad Emulator mode. DualShock3/4 USB DualShock3/4 BT -Settings for port: +Settings For Port: Select Pad Emulator port for settings. -Enable emulation +Enable Emulation Turns on/off Pad Emulator for selected port. -Enable vibration +Enable Vibration Turns on/off vibration for Pad Emulator selected port. -USB Bluetooth adapter MAC address: -DS Controller paired to MAC address: +USB Bluetooth Adapter MAC Address: +DS Controller Paired To MAC Address: Pair Pair DS Controller -Pair DS Controller with Bluetooth adapter MAC address. -Not connected -Bluetooth adapter information -Shows more information and supported features +Pair DS controller with Bluetooth adapter MAC address. +Not Connected +Bluetooth Adapter Information +Shows more information and supported features. HCI Version: LMP Version: Manufacturer ID: -Support features: +Supported Features: Yes No Bluetooth adapter should be fully compatible with DS3/DS4 controllers. Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation +Enable Multitap Emulation Turns on/off Multitap emulation for selected game. -Multitap emulator on port +Multitap Emulator On Port: Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -Emulate FIELD flipping +Disable Fake DS3 Workaround +Some fake DS3s need workaround, this option will disable it. +Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings Parental Lock Password @@ -266,12 +266,14 @@ Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) +Enable Notifications +%s loaded from %s PS1 Games -PS1 Games display mode +PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 6a0630d49..8fe09f0d5 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel and Squall -# Last update: March 29, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -9,7 +9,7 @@ Retour Configuration réseau Options avancées -Options sauvegardées... +Settings saved to %s Erreur d'écriture des options! Quitter Options @@ -133,7 +133,7 @@ Progression Fichier VMC existant Fichier VMC invalide, taille incorrecte Fichier VMC doit d'abord être créé -Erreur sur VMC %s. Continuer sur MC physique %d ? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Rafraîchissement automatique À propos Codeurs @@ -171,10 +171,10 @@ Mode 7 Mode 8 Configurer GSM Lien mode ETH -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex Options GSM Activer GSM Basculer On/Off GSM @@ -266,6 +266,8 @@ Volume des effets sonore Volume du son de démarrage Confirmer le changement du mode vidéo? Cache liste de jeu (HDD) +Enable Notifications +%s loaded from %s PS1 Games Mode d'affichage des jeux PS1 POPSTARTER.ELF non trouvé à '%s'! @@ -274,4 +276,4 @@ Une erreur s'est produite lors du renommage du fichier. Une erreur s'est produite lors de la suppression du fichier. N'achetez jamais OPEN-PS2-LOADER (OPL), obtenez le gratuitement: version ifcaro OPL sur psx-scene.com -version OPL Daily Builds (DB) sur ps2-home.com \ No newline at end of file +version OPL Daily Builds (DB) sur ps2-home.com diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 968f91078..9a38ecbfa 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: Feb. 09, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -9,7 +9,7 @@ Zurück Netzwerkkonfiguration Fortgeschrittene Optionen -Einstellungen gespeichert... +Einstellungen gespeichert in %s Fehler beim Schreiben der Einstellungen! Verlassen Einstellungen @@ -133,7 +133,7 @@ Fortschritt VMC-Datei existiert Ungültige VMC-Datei, Größe ist nicht korrekt VMC-Datei muss erstellt werden -Fehler mit VMC %s, weiter mit phys. MC (Steckplatz %d)? +Fehler beim zugriff auf VMC %s. Weiter mit Speicherkarte in Steckplatz %d? Automatisch aktualisieren Über Programmierer @@ -171,10 +171,10 @@ Mod. 7 Mod. 8 GSM konfigurieren ETH Geschwindigkeitsmodus -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex GSM Einstellungen Aktiviere GSM Schaltet GSM AN oder AUS @@ -266,6 +266,8 @@ Lautstärke Soundeffekte Lautstärke Startsound Änderung des Video signals übernehmen? Spieleliste zwischenspeichern (HDD) +Benachrichtigungen Einschalten +%s geladen von %s PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! @@ -274,4 +276,4 @@ Fehler beim umbenennen der Datei. Fehler beim löschen der Datei. Niemals OPEN-PS2-LOADER (OPL) kaufen, sondern frei erhältlich bei: ifcaro OPL version bei psx-scene.com -OPL Daily Builds (DB) version bei ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version bei ps2-home.com diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 322cc6ff8..6c22c155a 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: Mar. 24, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -9,7 +9,7 @@ OPL %s Ρυθμίσεις δικτύου Προχωρημένες ρυθμίσεις <κενό> -Οι ρυθμίσεις αποθηκεύτηκαν... +Settings saved to %s Σφάλμα κατά την εγγραφή των ρυθμίσεων! Έξοδος Ρυθμίσεις @@ -133,7 +133,7 @@ VMC γενικής χρήσης Το αρχείο VMC υπάρχει ήδη. Μη έγκυρο αρχείο VMC, το μέγεθος είναι λάθος. Πρέπει να δημιουργηθεί αρχείο VMC. -Σφάλμα VMC %s, συνέχεια με την κανονική MC (Κάρτα Μνήμης %d) ; +Error accessing VMC %s. Continue with the Memory Card in slot %d? Αυτόματη ανανέωση Σχετικά Προγραμματιστές @@ -266,6 +266,8 @@ ID κατασκευαστή: Ένταση ήχου εκκίνησης Επιβεβαίωση αλλαγής της λειτουργίας βίντεο; Caching λίστας παιχνιδιών (HDD) +Enable Notifications +%s loaded from %s Παιχνίδια PS1 Εκκίνηση μενού Παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! @@ -274,4 +276,4 @@ Caching λίστας παιχνιδιών (HDD) Παρουσιάστηκε σφάλμα κατά τη διαγραφή του αρχείου. Ποτέ μην αγοράζετε το OPEN-PS2-LOADER (OPL), αντί αυτού αποκτήστε το δωρεάν: Έκδοση OPL του ifcaro στο psx-scene.com -Έκδοση OPL Daily Builds (DB) στο ps2-home.com \ No newline at end of file +Έκδοση OPL Daily Builds (DB) στο ps2-home.com diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index a93d8f7a6..a21f77074 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: Jan. 31, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -9,7 +9,7 @@ Vissza Hálózat konfigurálás Haladó beállítások -Beállítások mentve... +Settings saved to %s Hiba a beállítások írásában! Kilépés Beállítások @@ -133,7 +133,7 @@ Folyamat VMC fájl létezik Érvénytelen VMC fájl, helytelen méret VMC fájl létrehozása szükséges -Hiba a VMC-vel %s, folytatás a fizikai MC-vel (foglalat %d) ? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Automatikus frissítés Névjegy Kódolók @@ -171,10 +171,10 @@ Mód 7 Mód 8 GSM Konfiguráció Ethernet kapcsolat módja -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex GSM Beállítások GSM Engedélyezése KI vagy BE kapcsolja a GSM-t @@ -266,6 +266,8 @@ Hanghatások hangereje Boot Sound hangereje Videó mód változtatás jóváhagyása? Játéklista cachelés (HDD) +Enable Notifications +%s loaded from %s PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! @@ -274,4 +276,4 @@ A fájl átnevezésénél hiba történt. A fájl törlésénél hiba történt. Soha ne vásárold meg az OPEN-PS2-LOADER (OPL)-t, ehelyett szerezd meg itt: ifcaro OPL verzió a psx-scene.com oldalon -OPL Daily Builds (DB) verzió a ps2-home.com oldalon \ No newline at end of file +OPL Daily Builds (DB) verzió a ps2-home.com oldalon diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 661d50dfe..34d9233a9 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -9,7 +9,7 @@ Kembali Konfigurasi jaringan Pilihan lanjutan -Setingan disimpan... +Settings saved to %s Kesalahan penulisan setingan! Keluar Setingan @@ -133,7 +133,7 @@ Kemajuan Berkas VMC ada Berkas VMC cacat, ukuran salah Berkas VMC harus dibuat -Kesalahan dengan VMC %s, lanjutkan dengan MC fisik (Slot %d)? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Segarkan otomatis Tentang Pengkode @@ -266,6 +266,8 @@ Volume efek suara Volume suara Boot Konfirmasi mengubah mode video? Daftar Tembolok Game(HDD) +Enable Notifications +%s loaded from %s PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! @@ -274,4 +276,4 @@ Terjadi kesalahan mengubah nama berkas. Terjadi kesalahan menghapus berkas. Jangan pernah membeli OPEN-PS2-LOADER (OPL), dapatkan secara gratis : versi OPL ifcaro pada psx-scene.com -Versi OPL Daily Builds (DB) di ps2-home.com \ No newline at end of file +Versi OPL Daily Builds (DB) di ps2-home.com diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index d24984bde..7055b3a61 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: Feb. 17, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -9,7 +9,7 @@ Indietro Configurazione rete Opzioni avanzate -Impostazioni salvate... +Settings saved to %s Errore scrittura impostazioni Esci Impostazioni @@ -133,7 +133,7 @@ Progresso File VMC esiste. File VMC non valido, dimensione non corretta. Creazione file VMC richiesta. -Errore VMC %s, continuare con MC fisica (slot %d)? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Aggiornamento automatico Informazioni su Sviluppatori @@ -171,10 +171,10 @@ Modo 7 Modo 8 Configura GSM Velocità Ethernet e impostazioni duplex -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex Impostazioni GSM Abilita GSM Imposta GSM On/Off @@ -185,7 +185,7 @@ Regolazione orizzontale V-POS Regolazione verticale Overscan -Overscan Adjustment +Overscan adjustment. Salta FMV Salta video in full motion Impostazioni cheat @@ -214,41 +214,41 @@ PS2 Logo Mostrato soltanto con un logo del disco valido e compatibile con la regione della console Configure PADEMU Pad Emulator Settings -Enable PadEmulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode +Enable Pad Emulator +Turns On/Off Pad Emulator for selected game. +Pad Emulator Mode Select Pad Emulator mode. DualShock3/4 USB DualShock3/4 BT -Settings for port: +Settings For Port: Select Pad Emulator port for settings. -Enable emulation +Enable Emulation Turns on/off Pad Emulator for selected port. -Enable vibration +Enable Vibration Turns on/off vibration for Pad Emulator selected port. -USB Bluetooth adapter MAC address: -DS Controller paired to MAC address: +USB Bluetooth Adapter MAC Address: +DS Controller Paired To MAC Address: Pair Pair DS Controller -Pair DS Controller with Bluetooth adapter MAC address. -Not connected -Bluetooth adapter information -Shows more information and supported features +Pair DS controller with Bluetooth adapter MAC address. +Not Connected +Bluetooth Adapter Information +Shows more information and supported features. HCI Version: LMP Version: Manufacturer ID: -Support features: +Supported Features: Yes No Bluetooth adapter should be fully compatible with DS3/DS4 controllers. Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation +Enable Multitap Emulation Turns on/off Multitap emulation for selected game. -Multitap emulator on port +Multitap Emulator On Port: Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -Emulate FIELD flipping +Disable Fake DS3 Workaround +Some fake DS3s need workaround, this option will disable it. +Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings Parental Lock Password @@ -266,12 +266,14 @@ Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) +Enable Notifications +%s loaded from %s PS1 Games -PS1 Games display mode +PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index c62a3271e..0dd98c355 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: March 28, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -9,7 +9,7 @@ OPL %s ネットワーク設定 詳細オプション <未設定> -設定が保存されました +Settings saved to %s 設定保存中にエラーが発生しました 終了 設定 @@ -133,7 +133,7 @@ VMC設定 VMCファイル作成済 VMCファイルのサイズが正しくありません VMCファイル未作成 -VMC %s でエラー。スロット %d のメモリカードを使いますか? +Error accessing VMC %s. Continue with the Memory Card in slot %d? 自動リフレッシュ OPLについて コーディング @@ -266,6 +266,8 @@ VMC %s ファイルは破損しています。 スロット %d のメモリ 起動音の音量 ビデオモードの変更を確認しますか? ゲームリストをキャッシュ(HDD) +Enable Notifications +%s loaded from %s PS1 ゲーム PS1 ゲーム 画面モード POPSTARTER.ELFが '%s'に見つかりません! @@ -274,4 +276,4 @@ VCDファイル '%s'が見つかりません! ファイルの削除中にエラーが発生しました OPEN-PS2-LOADER(OPL)を決して購入しないで、無料で入手してください psx-scene.comでのifcaro OPLバージョン -ps2-home.comでのOPLデイリービルド(DB)バージョン \ No newline at end of file +ps2-home.comでのOPLデイリービルド(DB)バージョン diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 12eeefeee..1475f5467 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: Feb. 11, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -9,7 +9,7 @@ OPL %s 네트워크 구성 고급 옵션 <값 없음> -설정 저장… +Settings saved to %s 설정 기록 중 에러! 종료 설정 @@ -133,7 +133,7 @@ VMC 구성 VMC 파일 존재 잘못된 VMC 파일, 크기가 다릅니다. VMC 파일이 생성되야 합니다. -VMC %s 에러, 메모리카드(슬롯 %d)에서 계속합니까? +Error accessing VMC %s. Continue with the Memory Card in slot %d? 자동 새로 고침 오픈 PS2 로더에 관하여 개발자 @@ -171,10 +171,10 @@ V-Sync 모드 8 GSM 구성 이더넷 링크 모드 -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex GSM 설정 GSM 활성 GSM 켜기 또는 끄기 @@ -266,6 +266,8 @@ VMC %s 파일이 조각났습니다. 슬롯 %d에 있는 메모리 카드로 계 사운드 볼륨 부팅 비디오 모드 변경을 확인 하시겠습니까? 캐쉬 게임 목록 (HDD) +Enable Notifications +%s loaded from %s PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! @@ -274,4 +276,4 @@ VCD 파일 '% s'을(를) 찾을 수 없습니다! 파일을 삭제하는 중 오류가 발생했습니다. OPEN-PS2-LOADER (OPL)를 구입하지 말고 무료로 받으세요.: psx-scene.com에서 ifcaro OPL 버전 -ps2-home.com에서 OPL Daily Builds (DB) 버전 \ No newline at end of file +ps2-home.com에서 OPL Daily Builds (DB) 버전 diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index 989f20725..f91acbcae 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: Feb. 17, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -9,7 +9,7 @@ OPL %s ກຳນົດຄ່າທາງດ້ານ Network ທາງເລືອກສຳລັບການຕັ້ງຄ່າຂັ້ນສູງ <ບໍ່ມີຄ່າໃດໆ> -ບັນທຶກການຕັ້ງຄ່າ… +Settings saved to %s ການຂຽນການຕັ້ງຄ່າມີຂໍ້ຜິດພາດ! ອອກຈາກໂປຣແກຣມ ການຕັ້ງຄ່າ @@ -133,7 +133,7 @@ Start ມີ File ຂອງ VMC ຢູ່ແລ້ວ ຂະໜາດຂອງ File VMC ບໍ່ຖືກຕ້ອງ File VMC(ກ້ອນເຊບສະເໝືອນຈິງ) ຈະຕ້ອງຖືກສ້າງຂຶ້ນ -ເກີດຂໍ້ຜິດພາດກັບ VMC(ກ້ອນເຊບສະເໝືອນຈິງ) %s, ດຳເນີນການຕໍ່ດ້ວຍກ້ອນເຊບແທ້ (ຊ່ອງ %d) ຫຼື ບໍ່? +Error accessing VMC %s. Continue with the Memory Card in slot %d? ເອີ້ນຄືນໃໝ່ແບບອັດຕະໂນມັດ ກ່ຽວກັບໂປຣແກຣມ ກຸ່ມນັກພັດທະນາໂປຣແກຣມ @@ -171,10 +171,10 @@ V-Sync ໂໝດ 8 ກຳນົດຄ່າ GSM ໂໝດການເຊື່ອມຕໍ່ຂອງສາຍ LAN -ສົ່ງຂໍ້ມູນ 100Mbit ແບບ full-duplex -ສົ່ງຂໍ້ມູນ 100Mbit ແບບ half-duplex -ສົ່ງຂໍ້ມູນ 10Mbit ແບບ full-duplex -ສົ່ງຂໍ້ມູນ 10Mbit ແບບ half-duplex +ສົ່ງຂໍ້ມູນ 100Mbit ແບບ Full-duplex +ສົ່ງຂໍ້ມູນ 100Mbit ແບບ Half-duplex +ສົ່ງຂໍ້ມູນ 10Mbit ແບບ Full-duplex +ສົ່ງຂໍ້ມູນ 10Mbit ແບບ Half-duplex ການຕັ້ງຄ່າ GSM ເປີດໃຊ້ງານ GSM Toggles GSM ເປີດ ຫຼື ປິດ @@ -214,41 +214,41 @@ PS2 Logo ຈະຖືກສະແດງຜົນ ກໍຕໍ່ເມື່ອໂລໂກ້ຂອງແຜ່ນຖືກຕ້ອງ ແລະ ສອດຄ່ອງຕາມໂຊນຂອງເຄື່ອງ Configure PADEMU Pad Emulator Settings -Enable PadEmulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode +Enable Pad Emulator +Turns On/Off Pad Emulator for selected game. +Pad Emulator Mode Select Pad Emulator mode. DualShock3/4 USB DualShock3/4 BT -Settings for port: +Settings For Port: Select Pad Emulator port for settings. -Enable emulation +Enable Emulation Turns on/off Pad Emulator for selected port. -Enable vibration +Enable Vibration Turns on/off vibration for Pad Emulator selected port. -USB Bluetooth adapter MAC address: -DS Controller paired to MAC address: +USB Bluetooth Adapter MAC Address: +DS Controller Paired To MAC Address: Pair Pair DS Controller -Pair DS Controller with Bluetooth adapter MAC address. -Not connected -Bluetooth adapter information -Shows more information and supported features +Pair DS controller with Bluetooth adapter MAC address. +Not Connected +Bluetooth Adapter Information +Shows more information and supported features. HCI Version: LMP Version: Manufacturer ID: -Support features: +Supported Features: Yes No Bluetooth adapter should be fully compatible with DS3/DS4 controllers. Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation +Enable Multitap Emulation Turns on/off Multitap emulation for selected game. -Multitap emulator on port +Multitap Emulator On Port: Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -Emulate FIELD flipping +Disable Fake DS3 Workaround +Some fake DS3s need workaround, this option will disable it. +Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings Parental Lock Password @@ -266,12 +266,14 @@ Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) +Enable Notifications +%s loaded from %s PS1 Games -PS1 Games display mode +PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Persian.lng b/lng/lang_Persian.lng index 3d28f6139..56feb4525 100644 --- a/lng/lang_Persian.lng +++ b/lng/lang_Persian.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: June 30, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s @@ -9,7 +9,7 @@ OPL %s ﻪﻜﺒﺷ یﺪﻨﺑﺮﻜﻴﭘ ﻪﺘﻓﺮﺸﻴﭘ یﺎﻫ ﻪﻨﻴﺰﮔ >راﺪﻘﻣ نوﺪﺑ< -...ﺪﺷ هﺮﻴﺧذ تﺎﻤﻴﻈﻨﺗ +ﺪﺷ هﺮﻴﺧذ %s رد ﺕﺎﻤﻴﻈﻨﺗ !ﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ تﺎﻤﻴﻈﻨﺗ ﻦﺘﺷﻮﻧ رد جوﺮﺧ تﺎﻤﻴﻈﻨﺗ @@ -133,7 +133,7 @@ generic زا هدﺎﻔﺘﺳا ﺖﺳا دﻮﺟﻮﻣ یزﺎﺟﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ ﺖﺴﻴﻧ ﺖﺳرد هزاﺪﻧا ﺖﺳا ﺮﺒﺘﻌﻣﺎﻧ یزﺎﺟﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ دراد نﺪﺷ ﻪﺘﺧﺎﺳ ﻪﺑ زﺎﻴﻧ یزﺎﺟﻣ ﻪﻈﻓﺎﺣ ﻞﻳﺎﻓ -؟ )%d هﺎﮔرد( ﺪﻴﻫﺪﻴﻣ ﻪﻣادا ﻲﻜﻳﺰﻴﻓ ی ﻪﻈﻓﺎﺣ ﺎﺑ ,هﺪﻣآ دﻮﺟو ﻪﺑ %s یزﺎﺟﻣ ﻪﻈﻓﺎﺣ یاﺮﺑ ﻲﻠﻜﺸﻣ +؟ﺪﻴﻫﺪﻴﻣ ﻪﻣادا %s هﺎﮔرد ﻰﻜﻳﺰﻴﻓ ﻪﻈﻓﺎﺣ ﺎﺑ .هﺪﻣﺁ ﺶﻴﭘ ﻰﻠﻜﺸﻣ %s ﻯﺯﺎﺠﻣ ﻪﻈﻓﺎﺣ ﻪﺑ ﻰﺳﺮﺘﺳﺩ رد رﺎﻛدﻮﺧ یزﺎﺳ هزﺎﺗ هرﺎﺑرد نﺎﺴﻳﻮﻧ ﻪﻣﺎﻧرﺑ @@ -266,6 +266,8 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ تﻮﺑ یاﺪﺻ ی ﻪﺟرد >؟ﺪﻴﻨﻜﻴﻣ ﺪﻴﻳﺎﺗ ار ﻮﻳﺪﻳو ﺖﻟﺎﺣ ﺮﻴﻴﻐﺗ )HDD( ﺎﻫ یزﺎﺑ ﺖﺳﺮﻬﻓ ﺶﻛ +ﻰﻧﺎﺳﺭ ﻉﺎﻠﻃا ﻥﺩﺮﻛ ﻝﺎﻌﻓ +ﺪﺷ ﻯﺭﺍﺬﮔ ﺭﺎﺑ %s زا %s 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ !'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ @@ -274,4 +276,4 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ .هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ﻞﻳﺎﻓ ندﺮﻛ کﺎﭘ مﺎﮕﻨﻫ رد :ﺪﻴﻨﻛ ﺖﻓﺎﻳرد نﺎﮕﻳار ار نآ ضﻮﻋ رد ,ﺪﻳﺮﺨﻧ ار )OPL( OPEN-PS2-LOADER ﺰﮔﺮﻫ psx-scene.com رد OPL oracfi ی ﻪﺨﺴﻧ -ps2-home.com رد )DB( OPL ﻪﻧازور ﺖﺧﺎﺳ ی ﻪﺨﺴﻧ \ No newline at end of file +ps2-home.com رد )DB( OPL ﻪﻧازور ﺖﺧﺎﺳ ی ﻪﺨﺴﻧ diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index 173e997fe..4f07aa678 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: Feb. 17, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -9,7 +9,7 @@ Wróć Ustawienia sieci Opcje zaawansowane -Ustawienia zapisane... +Settings saved to %s Błąd zapisu ustawień! Wyjście Ustawienia @@ -133,7 +133,7 @@ Postęp Plik VMC istnieje Błędny plik VMC, nieprawidłowy rozmiar Musisz utworzyć plik VMC -Błąd z plikiem VMC %s, kontynuować z fizyczną MC (slot %d) ? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Odświeżanie automatyczne O programie Programiści @@ -266,12 +266,14 @@ Głośność efektów dźwiękowych Głośność dźwięku startowego Potwierdź zmianę rozdzielczości Buforowanie listy gier (HDD) +Enable Notifications +%s loaded from %s PS1 Games -PS1 Games display mode +PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 1de290d2a..45fd63739 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: Jan. 31, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -9,7 +9,7 @@ Voltar Configurações de Rede Opções avançadas -Configurações salvas +Configurações guardadas em %s Erro ao salvar configurações! Sair Configurações @@ -133,7 +133,7 @@ Progresso Arquivo VMC já existe Arquivo VMC inválido, o tamanho está incorreto Arquivo VMC precisa ser criado! -Erro com o ficheiro VMC %s, continuar com MC físico (slot %d) ? +Erro ao aceder ao VMC %s. Continuar com o Cartão de Memória na ranhura %d? Atualização automática Créditos Desenvolvedores @@ -171,10 +171,10 @@ Modo 7 Modo 8 Configurar GSM Velocidade Ethernet e sistema Duplex -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex Opções do GSM Ativar o GSM Permitir que o GSM ative o modo de vídeo escolhido @@ -266,6 +266,8 @@ Volume dos sons Volume do som de arranque Confirmar alteração do modo de vídeo? Cache da lista de jogos (HDD) +Ativar notificações +%s carregado de %s Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! @@ -274,4 +276,4 @@ Ocorreu um erro ao renomear o ficheiro. Ocorreu um erro ao apagar o ficheiro Nunca compre o OPEN-PS2-LOADER (OPL), descarregue grátis em: OPL versão ifcaro em psx-scene.com -OPL versão Daily Builds (DB) em ps2-home.com \ No newline at end of file +OPL versão Daily Builds (DB) em ps2-home.com diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index c585d2a11..ab058eaa3 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Jan. 31, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -9,7 +9,7 @@ Voltar Configurar rede Opções avançadas -Configurações salvas... +Settings saved to %s Erro ao salvar configurações! Sair Configurações @@ -133,7 +133,7 @@ Progresso Arquivo VMC já existe Arquivo VMC inválido, o tamanho está incorreto Arquivo VMC precisa ser criado! -Erro com VMC %s, continuar com MC físico (entrada %d)? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Atualização automática Informações do programa Desenvolvedores @@ -171,10 +171,10 @@ Modo 7 Modo 8 Configurar GSM Conexão de rede -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex Configurações GSM Ativar GSM Autoriza o GSM a forçar o modo de vídeo selecionado abaixo @@ -266,6 +266,8 @@ Volume de efeitos sonoros Volume do som de inicialização Confirmar alteração do modo de vídeo? Cache da lista de jogos (HD) +Enable Notifications +%s loaded from %s Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! @@ -274,4 +276,4 @@ Ocorreu um erro ao renomear o arquivo. Ocorreu um erro ao excluir o arquivo. Nunca compre OPEN-PS2-LOADER (OPL), baixe grátis em: psx-scene.com, OPL versão ifcaro -ps2-home.com, OPL versão Daily Builds (DB) \ No newline at end of file +ps2-home.com, OPL versão Daily Builds (DB) diff --git a/lng/lang_Romana.lng b/lng/lang_Romana.lng index 0f22ae7a6..35b016265 100644 --- a/lng/lang_Romana.lng +++ b/lng/lang_Romana.lng @@ -1,15 +1,15 @@ -# Romana translation by MRAdyy -# Last update: Feb. 17, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Romanian translation by MRAdyy +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 -Romana +Romanian Open PS2 Loader %s Salvare Setari Inapoi Config. retea Optiuni avansate -Setari salvate... +Settings saved to %s Eroare in scrierea setarilor! Iesire Setari @@ -133,7 +133,7 @@ Progres Fisierul VMC exista Fisier VMC invalid, dimensiunea este incorecta Fisier VMC trebuie creat -Eroare la VMC %s, continuati cu cardul memorie fizic (slot %d)? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Reimprospatare Automata Despre Ingineri @@ -214,41 +214,41 @@ PS2 Logo Only displayed for a valid disc logo which matches the console's region Configure PADEMU Pad Emulator Settings -Enable PadEmulator -Turns on/off PadEmulator for selected game. -Pad Emulator mode +Enable Pad Emulator +Turns On/Off Pad Emulator for selected game. +Pad Emulator Mode Select Pad Emulator mode. DualShock3/4 USB DualShock3/4 BT -Settings for port: +Settings For Port: Select Pad Emulator port for settings. -Enable emulation +Enable Emulation Turns on/off Pad Emulator for selected port. -Enable vibration +Enable Vibration Turns on/off vibration for Pad Emulator selected port. -USB Bluetooth adapter MAC address: -DS Controller paired to MAC address: +USB Bluetooth Adapter MAC Address: +DS Controller Paired To MAC Address: Pair Pair DS Controller -Pair DS Controller with Bluetooth adapter MAC address. -Not connected -Bluetooth adapter information -Shows more information and supported features +Pair DS controller with Bluetooth adapter MAC address. +Not Connected +Bluetooth Adapter Information +Shows more information and supported features. HCI Version: LMP Version: Manufacturer ID: -Support features: +Supported Features: Yes No Bluetooth adapter should be fully compatible with DS3/DS4 controllers. Bluetooth adapter may not work correctly with DS3/DS4 controllers. -Enable Multitap emulation +Enable Multitap Emulation Turns on/off Multitap emulation for selected game. -Multitap emulator on port +Multitap Emulator On Port: Select port for Multitap emulation. -Disable workaround for fake DS3 -Some fake ds3s need workaround, this option will disable it. -Emulate FIELD flipping +Disable Fake DS3 Workaround +Some fake DS3s need workaround, this option will disable it. +Emulate FIELD Flipping Fix for games that glitch under progressive video modes. Parental Lock Settings Parental Lock Password @@ -266,12 +266,14 @@ Sound Effects Volume Boot Sound Volume Confirm video mode change? Cache Game List (HDD) +Enable Notifications +%s loaded from %s PS1 Games -PS1 Games display mode +PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! VCD file '%s' not found! An error occurred while renaming the file. An error occurred while deleting the file. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index f801e4852..ddcfe64b8 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: Jan. 31, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -9,7 +9,7 @@ OPL %s Конфигурация сети Расширенные опции <не указано> -Настройки сохранены... +Settings saved to %s Ошибка сохранения настроек! Выход Настройки @@ -133,7 +133,7 @@ NetBIOS VMC файл существует Поврежденный VMC файл, неправильный размер Необходимо создать VMC файл -Ошибка с VMC %s, использовать физическую карту (слот %d) ? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Автоматическое обновление О программе Кодеры @@ -266,6 +266,8 @@ VMC %s файл фрагментирован. Продолжить с карто Громкость звука загрузки Подтвердить изменение режима видео? Кэш игрового списка (HDD) +Enable Notifications +%s loaded from %s PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! @@ -274,4 +276,4 @@ VCD файл '%s' не найден! При удалении файла произошла ошибка. Не покупайте OPEN-PS2-LOADER (OPL), он абсолютно бесплатен: ifcaro OPL версия на psx-scene.com -OPL Daily Builds (DB) версия на ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) версия на ps2-home.com diff --git a/lng/lang_SChinese.lng b/lng/lang_SChinese.lng index 4930ce2dd..09b89da55 100644 --- a/lng/lang_SChinese.lng +++ b/lng/lang_SChinese.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Feb. 17, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese OPL %s @@ -9,7 +9,7 @@ OPL %s 网络设置 进阶设置 <无数值> -设置已保存... +Settings saved to %s 写入设置错误! 离开 设置 @@ -133,7 +133,7 @@ GUEST验证留空. VMC 存档已存在 无效的 VMC 存档, 大小有误 需要建立VMC 存档 -VMC %s 出错, 继续使用物理记忆卡吗 (slot %d) ? +Error accessing VMC %s. Continue with the Memory Card in slot %d? 自动重新整理 关于 程序 @@ -266,6 +266,8 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 启动音量 确认视频模式更改? 缓存游戏列表 (硬盘) +Enable Notifications +%s loaded from %s PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! @@ -274,4 +276,4 @@ VCD文件'%s'没有找到! 删除文件时发生错误. 永远不要购买OPEN-PS2-LOADER (OPL),而是免费获得: ifcaro OPL 版本从psx-scene.com -OPL 日常开发版(DB)从ps2-home.com \ No newline at end of file +OPL 日常开发版(DB)从ps2-home.com diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 9c498a4f6..266f3e3de 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: Feb. 03, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -9,7 +9,7 @@ Atrás Ajustes conexión de red Opciones avanzadas -Configuración guardada. +Settings saved to %s ¡Error al guardar la configuración! Salir Configuración @@ -133,7 +133,7 @@ Progreso Archivo VMC creado Archivo VMC inválido, el tamaño es incorrecto El archivo VMC debe ser creado -Error con el archivo VMC %s, ¿continuar con la tarjeta física (slot %d)? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Refresco automático de las listas Acerca del OPL Desarrolladores @@ -171,10 +171,10 @@ Modo 7 Modo 8 Configuración GSM Configuración de velocidad ethernet y duplex -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex Opciones GSM Activar GSM Activar o desactivar GSM @@ -266,6 +266,8 @@ Volumen de efectos de sonido Volumen de sonido de inicio Confirma cambiar modo de video? Cachè de lista de juegos (HDD) +Enable Notifications +%s loaded from %s Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! @@ -274,4 +276,4 @@ Se produjo un error al cambiar el nombre del archivo. Se produjo un error al eliminar el archivo. Nunca compres OPEN-PS2-LOADER (OPL), descargalo gratis desde: OPL Versión Ifcaro en psx-scene.com -OPL Versión Daily Builds (DB) en ps2-home.com \ No newline at end of file +OPL Versión Daily Builds (DB) en ps2-home.com diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index e1c6baec8..136f94882 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: Jan. 30, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -9,7 +9,7 @@ Tillbaka Nätverkskonfig Avancerad Konfig -Inställningar sparade... +Settings saved to %s Fel vid skrivning av inställningar! Avsluta Inställning @@ -133,7 +133,7 @@ Framsteg VMC fil existerar Ogiltig VMC fil, felaktig storlek VMC filen måste skapas -Fel med VMC %s, fortsätt med fysisk MC (kortplats %d) ? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Automatisk uppdatering Om Kodare @@ -171,9 +171,9 @@ Läge 7 Läge 8 Konfigurera GSM Ethernet hastighet och duplex -100Mbit full duplex +100Mbit Full-duplex 100Mbit halv duplex -10Mbit full duplex +10Mbit Full-duplex 10Mbit halv duplex GSM inställningar Aktivera GSM @@ -266,6 +266,8 @@ Ljudeffektsvolym Uppstartsljudsvolym Bekräfta ändring av videoläge? Lägg Spellista i Cache (HDD) +Enable Notifications +%s loaded from %s PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! @@ -274,4 +276,4 @@ Ett fel inträffade vid namnbyte. Ett fel inträffade vid radering. Köp aldrig OPEN-PS2-LOADER (OPL), det finns gratis här: ifcaro OPL version @ psx-scene.com -OPL Daily Builds (DB) version @ ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version @ ps2-home.com diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese.lng index e351b36d0..b45ec301f 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Feb. 03, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -9,7 +9,7 @@ OPL %s 網路設置 進階設置 <無數值> -設置已保存... +Settings saved to %s 寫入設置錯誤! 離開 設置 @@ -133,7 +133,7 @@ GUEST驗證留空. VMC 存檔已存在 無效的 VMC 存檔, 大小有誤 需要建立VMC 存檔 -VMC %s 出錯, 繼續使用物理記憶卡嗎 (slot %d) ? +Error accessing VMC %s. Continue with the Memory Card in slot %d? 自動重新整理 關於 程序 @@ -266,6 +266,8 @@ vmc% s 文件碎片化.是否繼續使用插槽% d 中的記憶卡? 啟動音量 確認視頻模式更改? 緩存遊戲列表 (硬碟) +Enable Notifications +%s loaded from %s PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! @@ -274,4 +276,4 @@ VCD文件\'%s\'沒有找到! 刪除文件時發生錯誤. 永遠不要購買OPEN-PS2-LOADER (OPL),而是免費獲得: ifcaro OPL 版本從psx-scene.com -OPL 日常開發版(DB)從ps2-home.com \ No newline at end of file +OPL 日常開發版(DB)從ps2-home.com diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index d28f27036..6244d92eb 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: Feb. 17, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -9,7 +9,7 @@ Geri Ağ ayarları Gelişmiş ayarlar -Ayarlar kayıt edildi... +Settings saved to %s Ayarlar yazılırken hata oluştu! Çıkış Ayarlar @@ -133,7 +133,7 @@ Durum VMC dosyası var Geçersiz VMC dosyası, boyut hatalı VMC dosyasının oluşturulması gerekli -VMC %sdosyası hatalı, fiziksel HK ile devam edilsin mi (slot %d) ? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Otomatik yenileme Hakkında Geliştiriciler @@ -171,10 +171,10 @@ Kip 7 Kip 8 GSM ayarları Ağ Bağlantı kipi -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex GSM Ayarları GSM Aktif GSM'i Açar ve Kapatır @@ -265,7 +265,9 @@ Açılış Sesi Olsun Ses Efektleri Kuvveti Açılış Sesi Kuvveti Video çıkış modu değiştirilsin mi? -Cache Game List (HDD) +Cache Game List (HD) +Enable Notifications +%s loaded from %s PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. @@ -274,4 +276,4 @@ Dosya yeniden adlandırılırken bir sorun çıktı. Dosya silinirken bir sorun çıktı. Never buy OPEN-PS2-LOADER (OPL), instead get it free at: ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version at ps2-home.com diff --git a/lng/lang_Vietnamese.lng b/lng/lang_Vietnamese.lng index afb0ef293..c2d37197b 100644 --- a/lng/lang_Vietnamese.lng +++ b/lng/lang_Vietnamese.lng @@ -1,6 +1,6 @@ # Translation by zidane89 -# Last update: April 22, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 23, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese OPL %s @@ -9,7 +9,7 @@ Quay lại Cấu hình mạng Tùy chọn nâng cao -Lưu các cài đặt... +Settings saved to %s Không lưu được cài đặt! Thoát Cài đặt @@ -133,7 +133,7 @@ Tiến hành File VMC không tồn tại File VMC không hợp lệ, Dung lượng không đúng File VMC cần được tạo -Lỗi với VMC %s, tiếp tục với thẻ save thật (khe %d) ? +Error accessing VMC %s. Continue with the Memory Card in slot %d? Tự động làm tươi Thông tin Coders @@ -170,11 +170,11 @@ Mode 6 Mode 7 Mode 8 Cấu hình GSM -Ethernet link mode -100Mbit full-duplex -100Mbit half-duplex -10Mbit full-duplex -10Mbit half-duplex +Ethernet Link Mode +100Mbit Full-duplex +100Mbit Half-duplex +10Mbit Full-duplex +10Mbit Half-duplex Cài đặt GSM Bật GSM Bật hoặc tắt GSM @@ -266,6 +266,8 @@ Mức hiệu ứng âm thanh Tăng mức âm lượng Thay đổi chế độ video? Cache danh sách trò chơi (HDD) +Enable Notifications +%s loaded from %s Các trò chơi PS1 Chế độ hiển thị cho game PS1 POPSTARTER.ELF không có ở '%s'! @@ -274,4 +276,4 @@ Xảy ra lỗi trong khi đổi tên tập tin. Đã xảy ra lỗi trong khi xóa tệp. Không bao giờ mua OPEN-PS2-LOADER (OPL), nó luôn miễn phí tại: ifcaro OPL version at psx-scene.com -OPL Daily Builds (DB) version at ps2-home.com \ No newline at end of file +OPL Daily Builds (DB) version at ps2-home.com From 50e1d7c19681995a22863d6d782541300bb371da Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 24 Sep 2019 10:40:31 -0700 Subject: [PATCH 172/269] update lang files --- lng/lang_Hungarian.lng | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index a21f77074..88b358bb9 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,5 +1,5 @@ # Translation by co5oos -# Last update: Sept. 23, 2019 +# Last update: Sept. 24, 2019 # Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian @@ -9,7 +9,7 @@ Vissza Hálózat konfigurálás Haladó beállítások -Settings saved to %s +Beállítások elmentve %s-be Hiba a beállítások írásában! Kilépés Beállítások @@ -133,7 +133,7 @@ Folyamat VMC fájl létezik Érvénytelen VMC fájl, helytelen méret VMC fájl létrehozása szükséges -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Hiba történt a VMC %s hozzáférésénél. Folytatás a %d foglalatban lévő memória kártyával? Automatikus frissítés Névjegy Kódolók @@ -266,8 +266,8 @@ Hanghatások hangereje Boot Sound hangereje Videó mód változtatás jóváhagyása? Játéklista cachelés (HDD) -Enable Notifications -%s loaded from %s +Értesítések engedélyezése +%s betöltve %s-ből PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! From 0576e2fc07ac08695fbfc96f8f6e7803eea3f3da Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 27 Sep 2019 06:44:49 -0700 Subject: [PATCH 173/269] update lang files --- lng/lang_Arabic.lng | 10 +++++----- lng/lang_Indonesian.lng | 12 ++++++------ lng/lang_Portuguese_BR.lng | 10 +++++----- lng/lang_Spanish.lng | 10 +++++----- lng/lang_Swedish.lng | 10 +++++----- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 0f51c253a..8852b450f 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,5 +1,5 @@ # translation by alimadhi -# Last update: Sept. 23, 2019 +# Last update: Sept. 24, 2019 # Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic @@ -9,7 +9,7 @@ OPL ﺔﻜﺒﺸﻟﺍ ﻦﻳﻮﻜﺗ ﺔﻣﺪﻘﺘﻣ ﺕﺍﺭﺎﻴﺧ >ﻢﻴﻗ ﺪﺟﻮﻳﻻ< -Settings saved to %s +s% ﻲﻓ ﺕﺍﺩﺍﺪﻋﻹﺍ ﻆﻔﺣ ﻢﺗ ! ﺄﻄﺧ ﺕﺍﺩﺍﺪﻋﻻﺍ ﺔﺑﺎﺘﻛ ﺝﻭﺮﺧ ﺕﺍﺩﺍﺪﻋﻻﺍ @@ -133,7 +133,7 @@ VMC ﻦﻳﻮﻜﺗ ﺩﻮﺟﻮﻣ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ ﺢﻴﺤﺻ ﺮﻴﻏ ﻢﺠﺤﻟﺍﻭ ،ﺢﻟﺎﺻ ﺮﻴﻏ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ ﺀﺎﺸﻧﻻﺍ ﻰﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺓﺪﺣﻭ ﺔﻗﺍﻮﺳ ﻒﻠﻣ ﺝﺎﺘﺤﻳ -Error accessing VMC %s. Continue with the Memory Card in slot %d? +d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞﻤﻛﺃ s.% ﻰﻟﺇ ﻝﻮﺻﻮﻟﺍ ﻲﻓ ﺄﻄﺧ ﻲﺋﺎﻘﻠﺘﻟﺍ ﺚﻳﺪﺤﺘﻟﺍ ﻝﻮﺣ ﻥﻮﺠﻣﺮﺒﻤﻟﺍ @@ -266,8 +266,8 @@ d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞ ﺪﻴﻬﻤﺘﻟﺍ ﺕﻮﺻ ﻢﺠﺣ ؟ﻮﻳﺪﻴﻔﻟﺍ ﻊﺿﻭ ﺮﻴﻴﻐﺗ ﺪﻴﻛﺄﺗ (HDD) ﺖﻗﺆﻤﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺏﺎﻌﻟﺃ ﺔﻤﺋﺎﻗ -Enable Notifications -%s loaded from %s +ﺕﺍﺭﺎﻌﺷﻹﺍ ﻦﻴﻜﻤﺗ +s% ﻦﻣ ﻞﻤﺤﻣ s% PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 34d9233a9..be01df15c 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: Feb. 01, 2019 -# Updated for OPL_1499_DB-TA_[f52ac91] and OPL_1307_ifcaro_beta [6571f0d] +# Last update: Sept. 26, 2019 +# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -9,7 +9,7 @@ Kembali Konfigurasi jaringan Pilihan lanjutan -Settings saved to %s +Pengaturan disimpan pada %s Kesalahan penulisan setingan! Keluar Setingan @@ -133,7 +133,7 @@ Kemajuan Berkas VMC ada Berkas VMC cacat, ukuran salah Berkas VMC harus dibuat -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Kesalahan mengakses VMC %s. Lanjutkan dengan Kartu Memori pada slot %d? Segarkan otomatis Tentang Pengkode @@ -266,8 +266,8 @@ Volume efek suara Volume suara Boot Konfirmasi mengubah mode video? Daftar Tembolok Game(HDD) -Enable Notifications -%s loaded from %s +Izinkan Pemberitahuan +%s dimuat dari %s PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index ab058eaa3..4fbfd1c03 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,5 +1,5 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Sept. 23, 2019 +# Last update: Sept. 24, 2019 # Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese @@ -9,7 +9,7 @@ Voltar Configurar rede Opções avançadas -Settings saved to %s +Configurações salvas em %s Erro ao salvar configurações! Sair Configurações @@ -133,7 +133,7 @@ Progresso Arquivo VMC já existe Arquivo VMC inválido, o tamanho está incorreto Arquivo VMC precisa ser criado! -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Erro ao acessar o VMC %s. Continuar com MC na entrada %d? Atualização automática Informações do programa Desenvolvedores @@ -266,8 +266,8 @@ Volume de efeitos sonoros Volume do som de inicialização Confirmar alteração do modo de vídeo? Cache da lista de jogos (HD) -Enable Notifications -%s loaded from %s +Ativar notificações +%s carregado de %s Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 266f3e3de..c7336f8e1 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,5 +1,5 @@ # Translation by lauchon22 -# Last update: Sept. 23, 2019 +# Last update: Sept. 25, 2019 # Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -9,7 +9,7 @@ Atrás Ajustes conexión de red Opciones avanzadas -Settings saved to %s +Configuración guardada en %s ¡Error al guardar la configuración! Salir Configuración @@ -133,7 +133,7 @@ Progreso Archivo VMC creado Archivo VMC inválido, el tamaño es incorrecto El archivo VMC debe ser creado -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Error al acceder a VMC %s. ¿Continuar con la tarjeta de memoria en la ranura %d? Refresco automático de las listas Acerca del OPL Desarrolladores @@ -266,8 +266,8 @@ Volumen de efectos de sonido Volumen de sonido de inicio Confirma cambiar modo de video? Cachè de lista de juegos (HDD) -Enable Notifications -%s loaded from %s +Activar notificaciones +%s cargado desde %s Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index 136f94882..d3c171ea1 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,5 +1,5 @@ # Translation by Lord_Flaya -# Last update: Sept. 23, 2019 +# Last update: Sept. 24, 2019 # Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish @@ -9,7 +9,7 @@ Tillbaka Nätverkskonfig Avancerad Konfig -Settings saved to %s +Inställningar sparade till %s Fel vid skrivning av inställningar! Avsluta Inställning @@ -133,7 +133,7 @@ Framsteg VMC fil existerar Ogiltig VMC fil, felaktig storlek VMC filen måste skapas -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Felaktig åtkomst till VMC%s. Använd Minneskort i port %d? Automatisk uppdatering Om Kodare @@ -266,8 +266,8 @@ Ljudeffektsvolym Uppstartsljudsvolym Bekräfta ändring av videoläge? Lägg Spellista i Cache (HDD) -Enable Notifications -%s loaded from %s +Aktivera notifikationer +%s Laddat från %s PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! From 1b43eb1b1d7e50ce4e6d7478369940b9fd66ad3b Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 12 Oct 2019 15:33:35 -0700 Subject: [PATCH 174/269] update gitignore --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d987b8afb..ae6f80304 100755 --- a/.gitignore +++ b/.gitignore @@ -11,11 +11,15 @@ *.ELF *.erl *.exe +*.irx *.map *.o *.patch *.rej +*.s *.zip +*.ZIP +*.a DETAILED_CHANGELOG # @@ -32,4 +36,4 @@ IOPRP_img.c # START of OPL_DB tweaks # Visual Studio Code folder .vscode -#END of OPL_DB tweaks \ No newline at end of file +#END of OPL_DB tweaks From 98bca47ee1c4b7dd689140ad7ebbd183c5a0446a Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 12 Oct 2019 15:34:40 -0700 Subject: [PATCH 175/269] remove a repeat in gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index ae6f80304..42e2f7f4c 100755 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,6 @@ *.s *.zip *.ZIP -*.a DETAILED_CHANGELOG # From ff5a50215f77fe0b3cd767fd3cedb8c37dbafb78 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Fri, 18 Oct 2019 13:48:13 -0700 Subject: [PATCH 176/269] update README.md file --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9f67bcac0..77fd50a28 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,8 @@ https://www.psx-place.com/forums/open-ps2-loader-opl.77/ You can report compatibility game problems at: +http://www.ps2-home.com/forum/viewtopic.php?f=13&t=175 + https://www.psx-place.com/threads/open-ps2-loader-game-bug-reports.19401/ For updated compatibility lists, you can visit OPL-CL site at: From f543188b02327b50b717023a9e43a04b138c4e1c Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 28 Oct 2019 10:13:54 -0700 Subject: [PATCH 177/269] update lang files --- lng/lang_Arabic.lng | 12 ++++++++---- lng/lang_Bulgarian.lng | 12 ++++++++---- lng/lang_Czech.lng | 12 ++++++++---- lng/lang_Danish.lng | 12 ++++++++---- lng/lang_Dutch.lng | 12 ++++++++---- lng/lang_English.lng | 4 ++-- lng/lang_Filipino.lng | 14 +++++++++----- lng/lang_French.lng | 12 ++++++++---- lng/lang_German.lng | 12 ++++++++---- lng/lang_Greek.lng | 12 ++++++++---- lng/lang_Hungarian.lng | 12 ++++++++---- lng/lang_Indonesian.lng | 12 ++++++++---- lng/lang_Italian.lng | 12 ++++++++---- lng/lang_Japanese.lng | 12 ++++++++---- lng/lang_Korean.lng | 12 ++++++++---- lng/lang_Laotian.lng | 12 ++++++++---- lng/lang_Persian.lng | 12 ++++++++---- lng/lang_Polish.lng | 12 ++++++++---- lng/lang_Portuguese.lng | 12 ++++++++---- lng/lang_Portuguese_BR.lng | 12 ++++++++---- lng/lang_Romana.lng | 12 ++++++++---- lng/lang_Russian.lng | 20 ++++++++++++-------- lng/lang_SChinese.lng | 20 ++++++++++++-------- lng/lang_Spanish.lng | 12 ++++++++---- lng/lang_Swedish.lng | 12 ++++++++---- lng/lang_TChinese.lng | 20 ++++++++++++-------- lng/lang_Turkish.lng | 12 ++++++++---- lng/lang_Vietnamese.lng | 12 ++++++++---- 28 files changed, 231 insertions(+), 123 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 8852b450f..f614c37d8 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: Sept. 24, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL @@ -108,7 +108,7 @@ USB ﺏﺎﻌﻟﺍ ﺔﺋﺰﺠﺗ ﻦﻣ ﻖﻘﺤﺗ ﺭﺰﻟﺍ ﺮﺘﺧﺍ ﺔﺋﺰﺠﻣ ﺔﺒﻌﻠﻟﺍ ،ﺄﻄﺧ ﺪﻨﺒﻟﺍ ﺍﺬﻫ ﻞﻴﻐﺸﺗ ﻦﻜﻤﻳ ﻻ ،ﺄﻄﺧ -ﺭﺎﺒﺘﺧﺍ +Test Changes .ﻒﻴﻀﻟﺍ ﺔﻗﺩﺎﺼﻣ ﻞﺟﺍ ﻦﻣ ﺔﻏﺭﺎﻓ ﻙﺮﺗ ﺔﻘﻴﻗﺩ ﺕﺍﺀﺍﺮﻗ ﻦﻣﺍﺰﺘﻟﺍ ﻊﺿﻭ @@ -199,7 +199,7 @@ FMV ﺯﺎﻴﺘﺟﺍ ﺶﻐﻟﺍ ﻰﻠﻋ ﺭﻮﺜﻌﻟﺍ ﻢﺘﻳ ﻢﻟ ﻲﺿﺍﺮﺘﻓﺍ ﻞﻴﻤﺤﺗ ﺔﻜﺒﺸﻟﺍ ﺚﻳﺪﺤﺗ -؟ﺓﺩﻮﺟﻮﻤﻟﺍ ﺕﻼﺠﺴﻟﺍ ﻞﻴﻤﺤﺗ ﺓﺩﺎﻋﺇ +Overwrite Existing Records .ﺚﻳﺪﺤﺘﻟﺍ ﻞﺸﻓ .ﻡﺩﺎﺨﻟﺍ ﺚﻳﺪﺤﺘﻟ ﻝﺎﺼﺗﻻﺍ ﻞﺸﻓ .ﺚﻳﺪﺤﺘﻟﺍ ﻰﻬﺘﻧﺍ @@ -268,6 +268,10 @@ d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞ (HDD) ﺖﻗﺆﻤﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺏﺎﻌﻟﺃ ﺔﻤﺋﺎﻗ ﺕﺍﺭﺎﻌﺷﻹﺍ ﻦﻴﻜﻤﺗ s% ﻦﻣ ﻞﻤﺤﻣ s% +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index c13faf6be..102de522d 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -108,7 +108,7 @@ NetBIOS Бутон за избор Грешка - играта е фрагментирана! Грешка - не може да се стартира! -Тест +Test Changes Оставете свободно за влизане като "гост". Прецизно четене Синхронен режим @@ -199,7 +199,7 @@ Cheats по избор Не са открити Cheats Сваляне на настройки Мрежово обновяване -Повторно сваляне на наличните записи? +Overwrite Existing Records Неуспешно обновяване. Неуспешна връзка с сървъра. Обновяване завършено. @@ -268,6 +268,10 @@ VMC %s файлът е фрагментиран. Продължаване с Mem Cache Game List (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index 657885ed0..86e6152f1 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -108,7 +108,7 @@ Pamatovat posledně hranou hru Tlačítko Select Chyba, hra je fragmentovaná Chyba, nemůžu spustit hru -Test +Test Changes Nechte prázdné pro přihlášení GUEST účtu Přesné čtení Synchronní mód @@ -199,7 +199,7 @@ Chyba: nepodařilo se nahrát soubor s cheaty Nenalezeny žádné cheaty Stáhnout původní verze konfigů Síťový update -Stáhnout znovu již existující záznamy? +Overwrite Existing Records Update selhal. Připojení k update serveru se nezdařilo. Update kompletní. @@ -268,6 +268,10 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index 30ffb2a53..17e3175b8 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -108,7 +108,7 @@ Husk sidst spillede spil Vælgeknap Fejl: spillet er fragmenteret Fejl: kunne ikke køre elementet -Test +Test Changes Efterlad tom for gæste konto Korrekt læsning Synkroniseringstilstand @@ -199,7 +199,7 @@ Fejl: kunne ikke indlæses fil med snydekoder Ingen snydekoder fundet Hent standardindstillinger Netværksopdatering -Hent eksisterende arkiv? +Overwrite Existing Records Opdatering mislykkedes. Kan ikke oprette forbindes til server. Opdatering fuldendt. @@ -268,6 +268,10 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index 313bfd64b..a5eab5616 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -108,7 +108,7 @@ Herinner laatst gespeelde spel Selecteerknop Foutmelding, het spel is gefragmenteerd Foutmelding, kan het item niet uitvoeren -Test +Test Changes Laat leeg voor GUEST auth. Accurate reads Synchrone modus @@ -199,7 +199,7 @@ Foutmelding: mislukt om cheatbestand te laden Geen cheats gevonden Download standaardwaarden Netwerkupdate -Bestaande records herdownloaden? +Overwrite Existing Records Update mislukt. Mislukt om te verbinden met update server. Update voltooid. @@ -268,6 +268,10 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_English.lng b/lng/lang_English.lng index 370ad7ac2..f0b41d1af 100644 --- a/lng/lang_English.lng +++ b/lng/lang_English.lng @@ -195,7 +195,7 @@ Ethernet Link Mode 10Mbit Half-duplex GSM Settings Enable GSM -Toggles GSM on/off. +Toggles GSM On/Off. VMODE Forced custom display mode. H-POS @@ -233,7 +233,7 @@ Only displayed for a valid disc logo which matches the console's region Configure PADEMU Pad Emulator Settings Enable Pad Emulator -Turns on/off Pad Emulator for selected game. +Turns On/Off Pad Emulator for selected game. Pad Emulator Mode Select Pad Emulator mode. DualShock3/4 USB diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 85b2ba4fa..973e30b20 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -108,7 +108,7 @@ Tandaan ang huling play ng laro Select button Error, the game is fragmented Error, hindi maaaring tumakbo ang item -pagsubok +Test Changes Iwanang walang laman para sa Guest auth . Accurate Reads Synchronous Mode @@ -199,14 +199,14 @@ Error: failed to load cheat file. No cheats found. Download Defaults Network Update -Redownload existing records? +Overwrite Existing Records Update failed. Failed to connect to update server. Update completed. Update canceled. Download settings from the network? Customized Settings -Downloaded defaults. +Downloaded Defaults Auto start in %i s... Auto Start Value in second(s), 0 to disable auto start. @@ -268,6 +268,10 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 8fe09f0d5..37ec34896 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel and Squall -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -108,7 +108,7 @@ Souvenir dernier jeu joué Bouton de sélection Erreur, le jeu est fragmenté Erreur, impossible de lancer l'objet -Tester +Test Changes Laissez vide pour authentification invité Lecture précise (simule la vitesse de lecture du CD/DVD) Mode synchrone (mode de lecture alternatif) @@ -199,7 +199,7 @@ Erreur: Impossible de charger le fichier de cheat Aucun cheat trouvé Télécharger les régl. par défaut Mise à jour réseau -Re-télécharger les données existantes? +Overwrite Existing Records Mise à jour échouée Échec de connexion au serveur Mise à jour terminée. @@ -268,6 +268,10 @@ Confirmer le changement du mode vidéo? Cache liste de jeu (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Games Mode d'affichage des jeux PS1 POPSTARTER.ELF non trouvé à '%s'! diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 9a38ecbfa..84ad2b4f6 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -108,7 +108,7 @@ Merke zuletzt gespieltes Spiel Auswahltaste Fehler, das Spiel ist fragmentiert Fehler, Objekt kann nicht ausgeführt werden -Test +Test Changes Leer lassen für Anmeldung als GAST Korrekte Lesegeschw Synchronmodus @@ -199,7 +199,7 @@ Fehler: Laden des Cheat-Files fehlgeschlagen Keine Cheats gefunden Standardeinstellungen herunterladen Netzwerkaktualisierung -Erneutes runterladen von bereits existierenden Aufzeichnungen? +Overwrite Existing Records Aktualisierung fehlgeschlagen. Verbindung zum Updateserver fehlgeschlagen. Aktualisierung abgeschlossen. @@ -268,6 +268,10 @@ Lautstärke Startsound Spieleliste zwischenspeichern (HDD) Benachrichtigungen Einschalten %s geladen von %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index 6c22c155a..ef3676b84 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -108,7 +108,7 @@ NetBIOS Πλήκτρο επιλογής Σφάλμα, το παιχνίδι είναι κατακερματισμένο. Σφάλμα, αδυναμία εκτέλεσης του αρχείου. -Δοκιμή +Test Changes Αφήστε το κενό για δικαιώματα GUEST. Ακριβής ανάγνωση. Συγχρονισμένη λειτουργία ανάγνωσης. @@ -199,7 +199,7 @@ Patchάρισμα των παιχνιδιών από το PS2RD. Δε βρέθηκαν cheats. Λήψη προεπιλεγμένων Ενημέρωση δικτύου -Εκ νέου λήψη υπαρχόντων αρχείων; +Overwrite Existing Records Η ενημέρωση απέτυχε. Αποτυχία σύνδεσης σε εξυπηρετητή ενημέρωσης. Η ενημέρωση ολοκληρώθηκε. @@ -268,6 +268,10 @@ ID κατασκευαστή: Caching λίστας παιχνιδιών (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. Παιχνίδια PS1 Εκκίνηση μενού Παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index 88b358bb9..aabb2d5ef 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: Sept. 24, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -108,7 +108,7 @@ Emlékezz a legutóbbi játékra Select Gomb Hiba, a játék töredezett Hiba, az elem futtatása sikertelen -Teszt +Test Changes Hagyja üresen VENDÉG hitelesítéshez Postos Olvasás Egyidejű Mód @@ -199,7 +199,7 @@ Hiba: A Csalás Fájl betöltése sikertelen Nem találhatóak csalások Alapértelmezett letöltése Hálózat frissítés -Újra-letölti a meglévő feljegyzéseket? +Overwrite Existing Records Frissítés Sikertelen. Nem sikerült csatlakozni a frissítő szerverhez. Frissítés befejezve. @@ -268,6 +268,10 @@ Videó mód változtatás jóváhagyása? Játéklista cachelés (HDD) Értesítések engedélyezése %s betöltve %s-ből +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index be01df15c..fc03ec8fc 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: Sept. 26, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -108,7 +108,7 @@ Ingat pertandingan terakhir dimainkan Pilih tombol Kesalahan, game terfragmentasi Kesalahan, tidak bisa menjalankan item -Coba +Test Changes Tinggalkan kosong untuk Otent TAMU. Membaca akurat Mode Sinkronisasi @@ -199,7 +199,7 @@ Kesalahan: gagal untuk memuat Berkas cheat Tak ada cheat ditemukan Unduhan default Pembaruan jaringan -Unduh catatan yang ada? +Overwrite Existing Records Pembaruan gagal Gagal menyambungkan ke server pembaruan Perbarui selesai @@ -268,6 +268,10 @@ Konfirmasi mengubah mode video? Daftar Tembolok Game(HDD) Izinkan Pemberitahuan %s dimuat dari %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index 7055b3a61..23b9846ab 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -108,7 +108,7 @@ Ricorda ultimo titolo giocato Tasto seleziona Errore, il gioco è frammentato Errore, impossibile avviare il titolo. -Test +Test Changes Lasciare vuoto per autenticazione GUEST Lettura accurata Modo sincrono @@ -199,7 +199,7 @@ Errore: impossibile caricare file cheats Nessun cheat trovato Scarica predefiniti Aggiornamento via rete -Riscaricare le righe esistenti? +Overwrite Existing Records Aggiornamento fallito. Impossibile connettersi al server di aggiornamento. Aggiornamento completato. @@ -268,6 +268,10 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index 0dd98c355..b955f9e86 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -108,7 +108,7 @@ USBゲームのデフラグを常にチェック セレクトボタン ゲームがデフラグされていません ゲーム(アプリ)を開始できませんでした -テスト +Test Changes GUESTでログインする場合は空欄 読み込み速度の補正 データ読み込みをシンクロ化 @@ -199,7 +199,7 @@ PS2RDチートモード チートファイルが見つかりません デフォルト設定をダウンロード ネットワークアップデート -設定を再ダウンロード +Overwrite Existing Records アップデートが失敗しました アップデートサーバに接続できませんでした アップデート完了 @@ -268,6 +268,10 @@ VMC %s ファイルは破損しています。 スロット %d のメモリ ゲームリストをキャッシュ(HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 ゲーム PS1 ゲーム 画面モード POPSTARTER.ELFが '%s'に見つかりません! diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 1475f5467..d885f1efb 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -108,7 +108,7 @@ USB 게임 손상 검사 버튼 선택 오류, 게임이 손상 되었습니다. 오류, 항목을 실행할 수 없습니다 -테스트 +Test Changes 게스트 권한을 위해 지움 정밀하게 읽음 동기화 모드 @@ -199,7 +199,7 @@ PS2RD 치트 엔진 모드 치트를 찾을 수 없음 다운로드 기본값 네트워크 업데이트 -기존 데이터에서 다시 다운로드 합니까? +Overwrite Existing Records 업데이트 실패. 업데이트 서버에 연결 실패. 업데이트 완료. @@ -268,6 +268,10 @@ VMC %s 파일이 조각났습니다. 슬롯 %d에 있는 메모리 카드로 계 캐쉬 게임 목록 (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index f91acbcae..2e31c13b7 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -108,7 +108,7 @@ NetBIOS ເລືອກປຸ່ມ ເກີດຂໍ້ຜິດພາດ, ເກມນີ້ມີ fragmentation. ກະລຸນາ Defragment ເກມນີ້ກ່ອນ ເກີດຂໍ້ຜິດພາດ, ບໍ່ສາມາດເປີດໃຊ້ງານໄດ້ -ທົດລອງ +Test Changes ບໍ່ມີຄ່າກຳນົດໃດໆສຳລັບການເຂົ້າເຖິງຂອງ GUEST ອ່ານແບບຖືກຕ້ອງແມ່ນຍຳ ວິທີການອ່ານຂໍ້ມູນທີ່ມີທາງເລືອກ @@ -199,7 +199,7 @@ Overscan Adjustment ບໍ່ພົບ File ໂກງເກມໃດໆ ດາວໂຫຼດຄ່າມາດຕະຖານ ອັບເດດ Network -ດາວໂຫຼດການບັນທຶກທີ່ມີຢູ່ອີກຄັ້ງ? +Overwrite Existing Records ການອັບເດດເກີດຂໍ້ຜິດພາດ. ການເຊື່ອມຕໍ່ເພື່ອອັບເດດ Server ບໍ່ສົມບູນ. ການອັບເດດສົມບູນ. @@ -268,6 +268,10 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Persian.lng b/lng/lang_Persian.lng index 56feb4525..923d664d1 100644 --- a/lng/lang_Persian.lng +++ b/lng/lang_Persian.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s @@ -108,7 +108,7 @@ USB یﺎﻫ یزﺎﺑ ﻲﮕﺘﺨﻳر ﻢﻬﺑ ندﺮﻛ ﮏﭼ بﺎﺨﺘﻧا ی ﻪﻤﻛد ﺖﺳا ﻪﺘﺨﻳر ﻢﻫ ﻪﺑ یزﺎﺑ یﺎﻫ ﻞﻳﺎﻓ هﺪﻣآ دﻮﺟو ﻪﺑ ﻲﻠﻜﺸﻣ ﺖﺴﻴﻧ ﺮﻳﺬﭘ نﺎﻜﻣا ﻢﺘﻳآ یاﺮﺟا هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ -ﺖﺴﺗ +Test Changes .ﺪﻳراﺬﮕﺑ ﻲﻟﺎﺧ سﺎﻨﺷﺎﻧ ترﻮﺻ ﻪﺑ دورو یاﺮﺑ Accurate Reads Synchronous ﺖﻟﺎﺣ @@ -199,7 +199,7 @@ PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺖﻟﺎﺣ ﺪﺸﻧ ﺖﻓﺎﻳ ﻲﺒﻠﻘﺗ ﺪﻛ ﭻﻴﻫ ﺎﻫ ضﺮﻓ ﺶﻴﭘ دﻮﻠﻧاد ﻪﻜﺒﺷ ﻖﻳﺮﻃ زا ﺖﻳﺪﭘآ -؟دﻮﺟﻮﻣ یﺎﻫ ﻞﻳﺎﻓ دﺪﺠﻣ دﻮﻠﻧاد +Overwrite Existing Records .درﻮﺧ ﺖﺴﻜﺷ ﺖﻳﺪﭘآ .هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ﺖﻳﺪﭘآ روﺮﺳ ﻪﺑ لﺎﺼﺗا رد .ﺪﺷ ﻞﻴﻤﻜﺗ ﺖﻳﺪﭘا @@ -268,6 +268,10 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ )HDD( ﺎﻫ یزﺎﺑ ﺖﺳﺮﻬﻓ ﺶﻛ ﻰﻧﺎﺳﺭ ﻉﺎﻠﻃا ﻥﺩﺮﻛ ﻝﺎﻌﻓ ﺪﺷ ﻯﺭﺍﺬﮔ ﺭﺎﺑ %s زا %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ !'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index 4f07aa678..f56464270 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -108,7 +108,7 @@ Zapamiętaj ostatnio uruchomioną grę Przycisk wyboru Błąd, gra jest pofragmentowana Błąd, nie można uruchomić pozycji -Test +Test Changes Pozostaw puste dla gości. Dokładny odczyt Tryb synchroniczny @@ -199,7 +199,7 @@ Błąd: niepowodzenie ładowanie pliku Nie znaleziono cheat'ow Pobierz domyślne Aktualizacja sieciowa -Pobrać ponownie istniejące zapisy? +Overwrite Existing Records Aktualizacja nie powiodła się. Błąd połączenia z serwerem aktualizacji. Aktualizacja zakończona. @@ -268,6 +268,10 @@ Potwierdź zmianę rozdzielczości Buforowanie listy gier (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 45fd63739..c3699f160 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -108,7 +108,7 @@ Lembrar último jogo executado Botão de Seleção Erro, o jogo está fragmentado Erro, não foi possível iniciar o item -Testar +Test Changes Deixar vazio para ligar como convidado (GUEST) Carregar núcleo alternativo Modo Síncrono @@ -199,7 +199,7 @@ Erro: falha ao abrir o ficheiro de Cheat Nenhum Cheat encontrado Pré-definições de download Atualização por Internet -Voltar a descarregar dados existentes? +Overwrite Existing Records Atualizaçao falhou. Falha a ligar ao servidor de atualização. Atualização completa. @@ -268,6 +268,10 @@ Confirmar alteração do modo de vídeo? Cache da lista de jogos (HDD) Ativar notificações %s carregado de %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 4fbfd1c03..c78602b46 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Sept. 24, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -108,7 +108,7 @@ Lembrar último jogo executado Escolha o botão de ação ( X ou O ) Erro, o jogo está fragmentado! Erro, não foi possível iniciar o item -Testar +Test Changes Deixar vazio para identificação como convidado (GUEST) Simular precisão de leitura CD/DVD Modo síncrono @@ -199,7 +199,7 @@ Erro: Falha ao carregar o arquivo (Cheat) Cheats não encontrados ou ilegíveis Baixar arquivos(cfg) Atualizar arquivos(cfg) -Baixar novamente os arquivos(cfg) existentes? +Overwrite Existing Records Atualização falhou. Falha na conexão com o servidor(cfg). Atualização concluída. @@ -268,6 +268,10 @@ Confirmar alteração do modo de vídeo? Cache da lista de jogos (HD) Ativar notificações %s carregado de %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Romana.lng b/lng/lang_Romana.lng index 35b016265..558b3f0ca 100644 --- a/lng/lang_Romana.lng +++ b/lng/lang_Romana.lng @@ -1,6 +1,6 @@ # Romanian translation by MRAdyy -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Romanian Open PS2 Loader %s @@ -108,7 +108,7 @@ Aminteste ultimul joc jucat Butonul Select "Eroare, jocul este fragmentat" "Eroare, nu a putut rula elementul" -Testare +Test Changes Lasati goala pentru autentificarea GUEST. Citeste exact Modul sincron @@ -199,7 +199,7 @@ Eroare: nu s-a putut incarca fisierul Cheat Nici un cod gasit Descarca implicit Actualizare Retea -Reincarcati inregistrarile existente? +Overwrite Existing Records Actualizare esuata. Nu sa putut conecta serverul de actualizare. Actualizare finalizata. @@ -268,6 +268,10 @@ Confirm video mode change? Cache Game List (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index ddcfe64b8..df7686d5d 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -9,7 +9,7 @@ OPL %s Конфигурация сети Расширенные опции <не указано> -Settings saved to %s +Настройки сохранены в %s Ошибка сохранения настроек! Выход Настройки @@ -108,7 +108,7 @@ NetBIOS Кнопка выбор Ошибка, игра фрагментирована Ошибка, невозможно запустить объект! -Проверка +Test Changes Оставьте пустым для гостевого доступа Аккуратное чтение Альтернативный метод чтения данных @@ -133,7 +133,7 @@ NetBIOS VMC файл существует Поврежденный VMC файл, неправильный размер Необходимо создать VMC файл -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Ошибка доступа к VMC %s. Продолжить работу с картой памяти в слоте %d? Автоматическое обновление О программе Кодеры @@ -199,7 +199,7 @@ PS2RD Cheat Engine пропатчит вашу игру Не найдено ни читы Загрузка стандартных Обновление из Интернет -Перезагрузить существующие записи? +Overwrite Existing Records Не удалось загрузить. Не удалось соединится с сервером. Обновление завершено. @@ -266,8 +266,12 @@ VMC %s файл фрагментирован. Продолжить с карто Громкость звука загрузки Подтвердить изменение режима видео? Кэш игрового списка (HDD) -Enable Notifications -%s loaded from %s +Включить уведомления +%s загружено из %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_SChinese.lng b/lng/lang_SChinese.lng index 09b89da55..4ae826b44 100644 --- a/lng/lang_SChinese.lng +++ b/lng/lang_SChinese.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese OPL %s @@ -9,7 +9,7 @@ OPL %s 网络设置 进阶设置 <无数值> -Settings saved to %s +设置保存到 %s 写入设置错误! 离开 设置 @@ -108,7 +108,7 @@ NetBIOS 选定键 错误, 游戏有碎片 错误, 无法运行该项目 -测试 +Test Changes GUEST验证留空. 精确读取 同步模式 @@ -133,7 +133,7 @@ GUEST验证留空. VMC 存档已存在 无效的 VMC 存档, 大小有误 需要建立VMC 存档 -Error accessing VMC %s. Continue with the Memory Card in slot %d? +访问VMC %s出错。继续使用插槽 %d中的记忆卡? 自动重新整理 关于 程序 @@ -199,7 +199,7 @@ PS2RD 金手指模式 未发现金手指文件 下载默认设置 网络更新 -重新下载设置? +Overwrite Existing Records 更新失败. 连结更新服务器失败. 更新已完成. @@ -266,8 +266,12 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 启动音量 确认视频模式更改? 缓存游戏列表 (硬盘) -Enable Notifications -%s loaded from %s +启用通知 +%s 从 %s加载 +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index c7336f8e1..e5be8c191 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: Sept. 25, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -108,7 +108,7 @@ Recordar último juego en uso Botón de selección Error, el juego está fragmentado Error, no se pudo iniciar el archivo -Probar +Test Changes Dejar en blanco para autentificar como GUEST Lectura precisa Modo sincronizado @@ -199,7 +199,7 @@ Error: fallo al cargar el archivo de códigos No se han encontrado códigos Descargar ajustes predeterminados Actualización ajustes juegos a través de red -¿Cargar de nuevo los ajustes existentes? +Overwrite Existing Records Actualización fallida. Error al conectarse con el servidor de actualización. Actualización completa. @@ -268,6 +268,10 @@ Confirma cambiar modo de video? Cachè de lista de juegos (HDD) Activar notificaciones %s cargado desde %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index d3c171ea1..d4d2768f6 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: Sept. 24, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -108,7 +108,7 @@ Kom ihåg senast spelade spel Välj knapp Fel, spelet är fragmenterat Fel, kunde inte köra posten -Test +Test Changes Lämna tomt för Gäst konto. Korrekt läsning Synkroniseringsläge @@ -199,7 +199,7 @@ Fel: kunde inte ladda Fuskfilen Inga fusk funna Hämta standard Nätverksuppdatering -Ladda ner befintliga arkiv? +Overwrite Existing Records Uppdatering misslyckad Kunde inte ansluta till servern Uppdatering klar @@ -268,6 +268,10 @@ Bekräfta ändring av videoläge? Lägg Spellista i Cache (HDD) Aktivera notifikationer %s Laddat från %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese.lng index b45ec301f..07c3c6451 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -9,7 +9,7 @@ OPL %s 網路設置 進階設置 <無數值> -Settings saved to %s +設置保存到%s 寫入設置錯誤! 離開 設置 @@ -108,7 +108,7 @@ NetBIOS 選定鍵 錯誤, 遊戲有碎片 錯誤, 無法運行該項目 -測試 +Test Changes GUEST驗證留空. 精確讀取 同步模式 @@ -133,7 +133,7 @@ GUEST驗證留空. VMC 存檔已存在 無效的 VMC 存檔, 大小有誤 需要建立VMC 存檔 -Error accessing VMC %s. Continue with the Memory Card in slot %d? +訪問VMC %s出錯。繼續使用插槽%d中的記憶卡? 自動重新整理 關於 程序 @@ -199,7 +199,7 @@ PS2RD 金手指模式 未發現金手指文件 下載默認設置 網路更新 -重新下載設置? +Overwrite Existing Records 更新失敗. 連結更新伺服器失敗. 更新已完成. @@ -266,8 +266,12 @@ vmc% s 文件碎片化.是否繼續使用插槽% d 中的記憶卡? 啟動音量 確認視頻模式更改? 緩存遊戲列表 (硬碟) -Enable Notifications -%s loaded from %s +啟用通知 +%s從%s載入 +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index 6244d92eb..c0f615c9f 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -108,7 +108,7 @@ En son oynanan oyunu hatırla Seçme tuşu Hata, oyun dosyası parçalı Hata, nesne çalıştırılamıyor -Test +Test Changes MİSAFİR oturumu için boş bırakınız. Okuma hızını emüle et Senkronize Mod @@ -199,7 +199,7 @@ Hata: Hile dosyası yüklemesi başarısız Hile bulunamadı Varsayılanları indir Internetten güncelleme -Varolan kayıtlar tekrar indirilsin mi? +Overwrite Existing Records Güncelleme başarısız. Güncelleme sunucusuna bağlantı kurulamadı. Güncelleme tamamlandı. @@ -268,6 +268,10 @@ Video çıkış modu değiştirilsin mi? Cache Game List (HD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. diff --git a/lng/lang_Vietnamese.lng b/lng/lang_Vietnamese.lng index c2d37197b..bd3f91df9 100644 --- a/lng/lang_Vietnamese.lng +++ b/lng/lang_Vietnamese.lng @@ -1,6 +1,6 @@ # Translation by zidane89 -# Last update: Sept. 23, 2019 -# Updated for OPL_1602_DB-TA_[65af37a] and OPL_1383_ifcaro_beta [cf40031] +# Last update: Oct. 27, 2019 +# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese OPL %s @@ -108,7 +108,7 @@ Nhớ các cài đặt cuối cùng Chọn nút Lỗi, trò chơi bị phân mảnh Error, không thể chạy mục này -Kiểm tra +Test Changes Để trống với quyền truy cập Khách. Đọc chính xác Chế độ đồng bộ @@ -199,7 +199,7 @@ Lỗi: nạp tệp ăn gian thất bại Không thấy cheat Tải về mặc định Network Update -Tải lại hồ sơ hiện có? +Overwrite Existing Records Cập nhật thất bại. Không thể kết nối đến máy chủ để cập nhật. Cập nhật hoàn thành. @@ -268,6 +268,10 @@ Thay đổi chế độ video? Cache danh sách trò chơi (HDD) Enable Notifications %s loaded from %s +Game Menu +Game settings saved. +Game settings removed. +Overwrites existing game compatibility settings when enabled. Các trò chơi PS1 Chế độ hiển thị cho game PS1 POPSTARTER.ELF không có ở '%s'! From c0936bdb9a4b9c1bbd763cd93efbe822c260307f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 28 Oct 2019 10:34:01 -0700 Subject: [PATCH 178/269] update lang files --- lng/lang_German.lng | 14 +++++++------- lng/lang_Indonesian.lng | 16 ++++++++-------- lng/lang_Spanish.lng | 14 +++++++------- lng/lang_Swedish.lng | 14 +++++++------- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 84ad2b4f6..3ae153ba2 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,5 +1,5 @@ # German Translation by ps2guy and LopoTRI -# Last update: Oct. 27, 2019 +# Last update: Oct. 28, 2019 # Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German @@ -108,7 +108,7 @@ Merke zuletzt gespieltes Spiel Auswahltaste Fehler, das Spiel ist fragmentiert Fehler, Objekt kann nicht ausgeführt werden -Test Changes +Änderungen Testen Leer lassen für Anmeldung als GAST Korrekte Lesegeschw Synchronmodus @@ -199,7 +199,7 @@ Fehler: Laden des Cheat-Files fehlgeschlagen Keine Cheats gefunden Standardeinstellungen herunterladen Netzwerkaktualisierung -Overwrite Existing Records +Überschreibe existierende Aufnahmen Aktualisierung fehlgeschlagen. Verbindung zum Updateserver fehlgeschlagen. Aktualisierung abgeschlossen. @@ -268,10 +268,10 @@ Lautstärke Startsound Spieleliste zwischenspeichern (HDD) Benachrichtigungen Einschalten %s geladen von %s -Game Menu -Game settings saved. -Game settings removed. -Overwrites existing game compatibility settings when enabled. +Spiel Menü +Spiel-Einstellungen gespeichert. +Spiel-Einstellungen entfernt. +Wenn angewählt, werden existierende Spiel-Kompatibilitäts-Einstellungen überschrieben. PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index fc03ec8fc..715f7aeca 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,5 +1,5 @@ # translated by verislasher and jbliz -# Last update: Oct. 27, 2019 +# Last update: Oct. 28, 2019 # Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian @@ -108,7 +108,7 @@ Ingat pertandingan terakhir dimainkan Pilih tombol Kesalahan, game terfragmentasi Kesalahan, tidak bisa menjalankan item -Test Changes +Uji Perubahan Tinggalkan kosong untuk Otent TAMU. Membaca akurat Mode Sinkronisasi @@ -199,7 +199,7 @@ Kesalahan: gagal untuk memuat Berkas cheat Tak ada cheat ditemukan Unduhan default Pembaruan jaringan -Overwrite Existing Records +Timpa Rekaman Yang Ada Pembaruan gagal Gagal menyambungkan ke server pembaruan Perbarui selesai @@ -264,14 +264,14 @@ Aktifkan efek suara Aktifkan suara Boot Volume efek suara Volume suara Boot -Konfirmasi mengubah mode video? +Konfirmasi perubahan mode video? Daftar Tembolok Game(HDD) Izinkan Pemberitahuan %s dimuat dari %s -Game Menu -Game settings saved. -Game settings removed. -Overwrites existing game compatibility settings when enabled. +Menu Game +Pengaturan Game disimpan. +Pengaturan Game dibuang. +Timpa pengaturan kompatibilitas game yang ada ketika diaktifkan. PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index e5be8c191..14c1f8e8e 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,5 +1,5 @@ # Translation by lauchon22 -# Last update: Oct. 27, 2019 +# Last update: Oct. 28, 2019 # Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish @@ -108,7 +108,7 @@ Recordar último juego en uso Botón de selección Error, el juego está fragmentado Error, no se pudo iniciar el archivo -Test Changes +Prueba de Cambios Dejar en blanco para autentificar como GUEST Lectura precisa Modo sincronizado @@ -199,7 +199,7 @@ Error: fallo al cargar el archivo de códigos No se han encontrado códigos Descargar ajustes predeterminados Actualización ajustes juegos a través de red -Overwrite Existing Records +Sobrescribir Registros Existentes Actualización fallida. Error al conectarse con el servidor de actualización. Actualización completa. @@ -268,10 +268,10 @@ Confirma cambiar modo de video? Cachè de lista de juegos (HDD) Activar notificaciones %s cargado desde %s -Game Menu -Game settings saved. -Game settings removed. -Overwrites existing game compatibility settings when enabled. +Menú de Juegos +Configuración de juego guardada +Configuración de juego eliminada +Sobrescribe la configuración de compatibilidad de juego cuando está habilitado Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index d4d2768f6..e408dc4f3 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,5 +1,5 @@ # Translation by Lord_Flaya -# Last update: Oct. 27, 2019 +# Last update: Oct. 28, 2019 # Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish @@ -108,7 +108,7 @@ Kom ihåg senast spelade spel Välj knapp Fel, spelet är fragmenterat Fel, kunde inte köra posten -Test Changes +Testa ändringar Lämna tomt för Gäst konto. Korrekt läsning Synkroniseringsläge @@ -199,7 +199,7 @@ Fel: kunde inte ladda Fuskfilen Inga fusk funna Hämta standard Nätverksuppdatering -Overwrite Existing Records +Skriv över befintliga Uppdatering misslyckad Kunde inte ansluta till servern Uppdatering klar @@ -268,10 +268,10 @@ Bekräfta ändring av videoläge? Lägg Spellista i Cache (HDD) Aktivera notifikationer %s Laddat från %s -Game Menu -Game settings saved. -Game settings removed. -Overwrites existing game compatibility settings when enabled. +SpelMeny +Spelinställningar sparade. +Spelinställningar borttagna. +Skriver över befintliga spelinställningar om aktiverad. PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! From 61f40e51c6f5ca8b5e4d5334f0e406a893081903 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 28 Oct 2019 10:47:21 -0700 Subject: [PATCH 179/269] center Info page footer InfoHintText --- misc/conf_theme_OPL.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/conf_theme_OPL.cfg b/misc/conf_theme_OPL.cfg index 98d005c19..909baf05c 100644 --- a/misc/conf_theme_OPL.cfg +++ b/misc/conf_theme_OPL.cfg @@ -248,7 +248,7 @@ info20: info21: # Run / Back Text at bottom center type=InfoHintText - aligned=0 + aligned=1 color=#e6e6e6 x=255 y=-30 From eb4d667f0ad09a2ce3958871e558d07c46981332 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 28 Oct 2019 16:51:34 -0700 Subject: [PATCH 180/269] update lang files --- lng/lang_Portuguese.lng | 14 +++++++------- lng/lang_Portuguese_BR.lng | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index c3699f160..1619ee8b9 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,5 +1,5 @@ # Translation by danielb -# Last update: Oct. 27, 2019 +# Last update: Oct. 28, 2019 # Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese @@ -108,7 +108,7 @@ Lembrar último jogo executado Botão de Seleção Erro, o jogo está fragmentado Erro, não foi possível iniciar o item -Test Changes +Testar Alterações Deixar vazio para ligar como convidado (GUEST) Carregar núcleo alternativo Modo Síncrono @@ -199,7 +199,7 @@ Erro: falha ao abrir o ficheiro de Cheat Nenhum Cheat encontrado Pré-definições de download Atualização por Internet -Overwrite Existing Records +Substituir Registos Existentes Atualizaçao falhou. Falha a ligar ao servidor de atualização. Atualização completa. @@ -268,10 +268,10 @@ Confirmar alteração do modo de vídeo? Cache da lista de jogos (HDD) Ativar notificações %s carregado de %s -Game Menu -Game settings saved. -Game settings removed. -Overwrites existing game compatibility settings when enabled. +Menu de Jogo +Configurações do jogo guardadas. +Configurações do jogo removidas. +Substitui configurações de compatibilidade de jogos existentes quando ativado. Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index c78602b46..78efc0e34 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,5 +1,5 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Oct. 27, 2019 +# Last update: Oct. 28, 2019 # Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese @@ -108,7 +108,7 @@ Lembrar último jogo executado Escolha o botão de ação ( X ou O ) Erro, o jogo está fragmentado! Erro, não foi possível iniciar o item -Test Changes +Testar Alterações Deixar vazio para identificação como convidado (GUEST) Simular precisão de leitura CD/DVD Modo síncrono @@ -199,7 +199,7 @@ Erro: Falha ao carregar o arquivo (Cheat) Cheats não encontrados ou ilegíveis Baixar arquivos(cfg) Atualizar arquivos(cfg) -Overwrite Existing Records +Substituir os arquivos (cfg) existentes Atualização falhou. Falha na conexão com o servidor(cfg). Atualização concluída. @@ -268,10 +268,10 @@ Confirmar alteração do modo de vídeo? Cache da lista de jogos (HD) Ativar notificações %s carregado de %s -Game Menu -Game settings saved. -Game settings removed. -Overwrites existing game compatibility settings when enabled. +Menu do Jogo +Configurações do jogo salvas. +Configurações do jogo removidas. +Substitui as configurações de compatibilidade de jogos existentes quando ativada. Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! From 23bdd9a0d38bd6ef9607ba7b1ca60ca10b744a99 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 31 Oct 2019 16:22:35 -0700 Subject: [PATCH 181/269] update lang files --- lng/lang_SChinese.lng | 14 +++++++------- lng/lang_TChinese.lng | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lng/lang_SChinese.lng b/lng/lang_SChinese.lng index 4ae826b44..5c3a5a4ee 100644 --- a/lng/lang_SChinese.lng +++ b/lng/lang_SChinese.lng @@ -1,5 +1,5 @@ # Translated by kane159 and eyu2007 -# Last update: Oct. 27, 2019 +# Last update: Oct. 31, 2019 # Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese @@ -108,7 +108,7 @@ NetBIOS 选定键 错误, 游戏有碎片 错误, 无法运行该项目 -Test Changes +测试修改 GUEST验证留空. 精确读取 同步模式 @@ -199,7 +199,7 @@ PS2RD 金手指模式 未发现金手指文件 下载默认设置 网络更新 -Overwrite Existing Records +覆盖现有记录 更新失败. 连结更新服务器失败. 更新已完成. @@ -268,10 +268,10 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? 缓存游戏列表 (硬盘) 启用通知 %s 从 %s加载 -Game Menu -Game settings saved. -Game settings removed. -Overwrites existing game compatibility settings when enabled. +游戏菜单 +游戏设置已保存。 +游戏设置已删除。 +启用时覆盖现有的游戏兼容性设置。 PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese.lng index 07c3c6451..bdb80b36a 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese.lng @@ -1,5 +1,5 @@ # Translated by kane159 and eyu2007 -# Last update: Oct. 27, 2019 +# Last update: Oct. 31, 2019 # Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese @@ -108,7 +108,7 @@ NetBIOS 選定鍵 錯誤, 遊戲有碎片 錯誤, 無法運行該項目 -Test Changes +測試修改 GUEST驗證留空. 精確讀取 同步模式 @@ -199,7 +199,7 @@ PS2RD 金手指模式 未發現金手指文件 下載默認設置 網路更新 -Overwrite Existing Records +覆蓋現有記錄 更新失敗. 連結更新伺服器失敗. 更新已完成. @@ -268,10 +268,10 @@ vmc% s 文件碎片化.是否繼續使用插槽% d 中的記憶卡? 緩存遊戲列表 (硬碟) 啟用通知 %s從%s載入 -Game Menu -Game settings saved. -Game settings removed. -Overwrites existing game compatibility settings when enabled. +遊戲菜單 +遊戲設置已保存。 +遊戲設置已刪除。 +啟用時覆蓋現有的遊戲兼容性設置。 PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! From 9d44261f83b7640f21b71b8cf5b23ceb4a5fd284 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 2 Nov 2019 10:26:09 -0700 Subject: [PATCH 182/269] update lang files --- lng/lang_Arabic.lng | 15 ++++++++++----- lng/lang_Bulgarian.lng | 15 ++++++++++----- lng/lang_Czech.lng | 15 ++++++++++----- lng/lang_Danish.lng | 15 ++++++++++----- lng/lang_Dutch.lng | 15 ++++++++++----- lng/lang_Filipino.lng | 15 ++++++++++----- lng/lang_French.lng | 15 ++++++++++----- lng/lang_German.lng | 15 ++++++++++----- lng/lang_Greek.lng | 15 ++++++++++----- lng/lang_Hungarian.lng | 15 ++++++++++----- lng/lang_Indonesian.lng | 15 ++++++++++----- lng/lang_Italian.lng | 15 ++++++++++----- lng/lang_Japanese.lng | 15 ++++++++++----- lng/lang_Korean.lng | 15 ++++++++++----- lng/lang_Laotian.lng | 15 ++++++++++----- lng/lang_Persian.lng | 15 ++++++++++----- lng/lang_Polish.lng | 15 ++++++++++----- lng/lang_Portuguese.lng | 15 ++++++++++----- lng/lang_Portuguese_BR.lng | 15 ++++++++++----- lng/lang_Romana.lng | 15 ++++++++++----- lng/lang_Russian.lng | 15 ++++++++++----- lng/lang_SChinese.lng | 15 ++++++++++----- lng/lang_Spanish.lng | 15 ++++++++++----- lng/lang_Swedish.lng | 15 ++++++++++----- lng/lang_TChinese.lng | 15 ++++++++++----- lng/lang_Turkish.lng | 15 ++++++++++----- lng/lang_Vietnamese.lng | 15 ++++++++++----- 27 files changed, 270 insertions(+), 135 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index f614c37d8..741bd19d4 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -1,6 +1,6 @@ # translation by alimadhi -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Arabic OPL @@ -43,7 +43,7 @@ SMB ﺔﻤﺋﺎﻗ ﺔﻛﺭﺎﺸﻣ ﻦﻜﻤﻳﻻ ﺲﻛﺍ ﺏﺎﻌﻟﻻﺍ ﺔﻤﺋﺎﻗ ﺔﺒﻌﻠﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ -ﺕﺍﺩﺍﺪﻋﻻﺍ ﺔﻓﺎﻛ ﺔﻟﺍﺯﺍ +Remove Settings ﺔﺒﻌﻠﻟﺍ ﺢﻴﺗﺎﻔﻣ ﺔﻓﺎﻛ ﺔﻟﺍﺯﺇ ﺮﻳﺮﻤﺘﻟﺍ ﺀﻲﻄﺑ @@ -145,7 +145,7 @@ USB ﺔﺋﺩﺎﺑ ﺭﺎﺴﻣ ﻮﻳﺪﻴﻔﻟﺍ ﻊﺿﻭ ﺭﺍﻮﺤﻟﺍ ﻥﻮﻟ ﺩﺪﺤﻤﻟﺍ ﻥﻮﻠﻟﺍ -ﺔﺤﻔﺼﻟﺍ ﺕﺎﻣﻮﻠﻌﻣ ﺽﺮﻋ +ﻞﻤﻌﺘﺴﻣ ﺮﻴﻏ ﺕﺎﻣﻮﻠﻌﻣ ELF ﺺﺼﺨﻣ ﻥﻮﻠﻟﺍ ﺭﺎﻴﺘﺧﺍ @@ -270,8 +270,13 @@ d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞ s% ﻦﻣ ﻞﻤﺤﻣ s% Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_Bulgarian.lng b/lng/lang_Bulgarian.lng index 102de522d..8bff2a040 100644 --- a/lng/lang_Bulgarian.lng +++ b/lng/lang_Bulgarian.lng @@ -1,6 +1,6 @@ # translation by vsub and wisi -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Bulgarian OPL %s @@ -43,7 +43,7 @@ O (Кръг) X (Хикс) Списък Игри Опции -Изчистване на настройките +Remove Settings Изчистени всички бутони за играта Превъртане бавно @@ -145,7 +145,7 @@ USB поддиректория Видео режим Цвят на опциите Цвят на избран обект -Страница с информация +Unused Info Нестандартен ELF Избор на цвят @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Czech.lng b/lng/lang_Czech.lng index 86e6152f1..b0a01dc6d 100644 --- a/lng/lang_Czech.lng +++ b/lng/lang_Czech.lng @@ -1,6 +1,6 @@ # Translated by jimmysmith -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Czech OPL %s @@ -43,7 +43,7 @@ Kolečko Křížek Seznam her Nast. hry -Odebrat veškeré nastavení +Remove Settings Odebrat všechny klíče pro hru Skrolování Pomalu @@ -145,7 +145,7 @@ Automatický HDD spin-down Video mód Barva dialogu Vybraná barva -Zobrazit stránku s informacemi +Unused Info Custom ELF Barva zvýraznení @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Danish.lng b/lng/lang_Danish.lng index 17e3175b8..7c70cb4b4 100644 --- a/lng/lang_Danish.lng +++ b/lng/lang_Danish.lng @@ -1,6 +1,6 @@ # Translation by BongKris -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Danish OPL %s @@ -43,7 +43,7 @@ Cirkel Kryds Spil liste Spil indst. -Nulstil alle indstillinger +Remove Settings Spil indstillinger nulstillet Scrolling Langsom @@ -145,7 +145,7 @@ Automatisk harddisk spindown Videotilstand Dialogfarve Markeringsfarve -Vis infoside +Unused Info Brugerdefinerede ELF Farvevalg @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Dutch.lng b/lng/lang_Dutch.lng index a5eab5616..8b17fd903 100644 --- a/lng/lang_Dutch.lng +++ b/lng/lang_Dutch.lng @@ -1,6 +1,6 @@ # Translation by PS2gaming @ ps2-home.com -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Dutch OPL %s @@ -43,7 +43,7 @@ Cirkel Kruis Spellenlijst Spelinstellingen -Verwijder alle instellingen +Remove Settings Verwijder alle keys voor het spel Scrollen Langzaam @@ -145,7 +145,7 @@ Automatische HDD spin down Videomodus Dialoogvensterkleur Geselecteerde kleur -Toon infopagina +Unused Info Aangepaste ELF Kleurselectie @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Filipino.lng b/lng/lang_Filipino.lng index 973e30b20..af76d80f1 100755 --- a/lng/lang_Filipino.lng +++ b/lng/lang_Filipino.lng @@ -1,6 +1,6 @@ # Translation by Ceed Lorenzo -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Filipino OPL %s @@ -43,7 +43,7 @@ Circle Cross Games List Game Settings -Alisin ang lahat ng mga setting ng +Remove Settings Inalis ang lahat ng mga pindutan para sa mga laro i-scroll Mabagal @@ -145,7 +145,7 @@ Awtomatikong HDD paikutin pababa Video mode dialog ng kulay Piniling kulay -Ipakita ang impormasyon ng pahina +Unused Impo Custom ELF kulay ng seleksyon @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_French.lng b/lng/lang_French.lng index 37ec34896..bd2ed1fc9 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,6 +1,6 @@ # Translation by machiavel and Squall -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French OPL %s @@ -43,7 +43,7 @@ Cercle Croix Liste des jeux Options du jeu -Effacer les options +Remove Settings Options du jeu supprimées Défilement Lent @@ -145,7 +145,7 @@ Arrêt auto. HDD Mode vidéo Couleur dialogue Couleur sélectionné -Afficher page d'infos +Inutilisé Info ELF personnalisé Sélection de la couleur @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Games Mode d'affichage des jeux PS1 POPSTARTER.ELF non trouvé à '%s'! diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 3ae153ba2..957b62d99 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,6 +1,6 @@ # German Translation by ps2guy and LopoTRI -# Last update: Oct. 28, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German OPL %s @@ -43,7 +43,7 @@ Kreis Kreuz Spieleliste Spieleinst. -Entferne alle Einstellungen +Remove Settings Alle keys für das Spiel wurden entfernt Scrollen Langsam @@ -145,7 +145,7 @@ Autom. Abschaltung der Festplatte Videomodus Dialogfarbe Auswahlfarbe -Infoseite anzeigen +Unbenutzt Info Benutzerdefinierte ELF Farbauswahl @@ -270,8 +270,13 @@ Benachrichtigungen Einschalten %s geladen von %s Spiel Menü Spiel-Einstellungen gespeichert. -Spiel-Einstellungen entfernt. +%s settings removed. Wenn angewählt, werden existierende Spiel-Kompatibilitäts-Einstellungen überschrieben. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Greek.lng b/lng/lang_Greek.lng index ef3676b84..b74ae58fc 100644 --- a/lng/lang_Greek.lng +++ b/lng/lang_Greek.lng @@ -1,6 +1,6 @@ # Greek Translation by RivalK93 -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Greek OPL %s @@ -43,7 +43,7 @@ OK Χ Λίστα παιχνιδιών Ρυθμίσεις -Κατάργηση όλων των ρυθμίσεων +Remove Settings Καταργήθηκαν όλα τα πλήκτρα για το παιχνίδι. Κύλιση Αργό @@ -145,7 +145,7 @@ Error accessing VMC %s. Continue with the Memory Card in slot %d? Λειτουργία βίντεο Χρώμα μηνυμάτων Χρώμα επιλεγμένου -Εμφάνιση σελίδας πληροφοριών +Αχρησιμοποίητο Πληροφ. Προορισμένο ELF Επιλογή χρώματος @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. Παιχνίδια PS1 Εκκίνηση μενού Παιχνιδιών PS1 Το POPSTARTER.ELF δεν βρέθηκε στη θέση '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index aabb2d5ef..f9fe3cb38 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,6 +1,6 @@ # Translation by co5oos -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian OPL %s @@ -43,7 +43,7 @@ Kör Kereszt Játék Lista Játékbeállítások -Összes beállítás eltávolítása +Remove Settings Játékhoz tartozó összes kulcs eltávolítva Görgetés Lassú @@ -145,7 +145,7 @@ Automatikus Merevlemez kikapcsolás Videó mód Párbeszédablak színe Kiválasztott színe -Információ oldal megjelenítése +Nem Használt Infó Testreszabott ELF Szín szelekció @@ -270,8 +270,13 @@ Játéklista cachelés (HDD) %s betöltve %s-ből Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 715f7aeca..290694ea8 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,6 +1,6 @@ # translated by verislasher and jbliz -# Last update: Oct. 28, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian OPL %s @@ -43,7 +43,7 @@ Bulat Kali Daftar Game Setingan -Hapus semua Setingan +Remove Settings Semua kunci permainan yang dihapus Gulir Lambat @@ -145,7 +145,7 @@ HDD Otomatis berhenti Modus video Warna dialog Warna dipilih -Tampilan info halaman +Tdk terpakai Info Kustom ELF Pemilihan warna @@ -270,8 +270,13 @@ Izinkan Pemberitahuan %s dimuat dari %s Menu Game Pengaturan Game disimpan. -Pengaturan Game dibuang. +%s settings removed. Timpa pengaturan kompatibilitas game yang ada ketika diaktifkan. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Italian.lng b/lng/lang_Italian.lng index 23b9846ab..ffd6b4c9d 100644 --- a/lng/lang_Italian.lng +++ b/lng/lang_Italian.lng @@ -1,6 +1,6 @@ # Translation by jauffre and andre95d -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Italian OPL %s @@ -43,7 +43,7 @@ Cerchio X Lista dei giochi Impost. -Rimuovi tutte le impostazioni +Remove Settings Rimosse tutte le chiavi per il gioco Scorrimento Lento @@ -145,7 +145,7 @@ Spin down automatico HDD Modalità video Colore finestra Colore selezione -Visualizza pagina info +Unused Info ELF personalizzato Seleziona il colore @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Japanese.lng b/lng/lang_Japanese.lng index b955f9e86..e22389b57 100644 --- a/lng/lang_Japanese.lng +++ b/lng/lang_Japanese.lng @@ -1,6 +1,6 @@ # Japanese Translation by yamamotonew and keiichiro2000 -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Japanese OPL %s @@ -43,7 +43,7 @@ O X ゲームリスト ゲーム設定 -設定を初期化 +Remove Settings キー設定を初期化 画面スクロール 遅い @@ -145,7 +145,7 @@ IGR後に指定されたカスタムELFを実行します 画面モード ダイアログの色 選択時の色 -インフォページを表示 +Unused インフォ カスタムELF 表示色設定 @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 ゲーム PS1 ゲーム 画面モード POPSTARTER.ELFが '%s'に見つかりません! diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index d885f1efb..90aa62476 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,6 +1,6 @@ # Translated by DDinghoya -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean OPL %s @@ -43,7 +43,7 @@ O X 게임 목록 게임 설정 -모든 설정 제거 +Remove Settings 설정된 게임 키 제거 스크롤 속도 느림 @@ -145,7 +145,7 @@ IGR 후 사용자 정의 ELF 부팅 비디오 모드 대화상자 색상 선택한 색상 -정보 페이지 표시 +미사용 정보 사용자 정의 ELF 색상 선택 @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! diff --git a/lng/lang_Laotian.lng b/lng/lang_Laotian.lng index 2e31c13b7..96604b1d5 100644 --- a/lng/lang_Laotian.lng +++ b/lng/lang_Laotian.lng @@ -1,6 +1,6 @@ # Translation by Anousith Phompida (aka: blackbutterfly) -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Laotian OPL %s @@ -43,7 +43,7 @@ Settings saved to %s ຄູນ ໄປທີ່ລາຍຊື່ເກມ ຕັ້ງຄ່າໃຫ້ເກມນີ້ -ຍົກເລີກການຕັ້ງຄ່າທັງໝົດ +Remove Settings ລົບລ້າງ Key ທັງໝົດອອກຈາກເກມ ການເລື່ອນ ຊ້າໆ @@ -145,7 +145,7 @@ USB prefix path ໂໝດວິດິໂອ ສີ Dialog ສີທີ່ຖືກເລືອກ -ສະແດງຂໍ້ມູນຂອງໜ້າ +Unused ຂໍ້ມູນ ELF ທີ່ຖືກປັບແຕ່ງເອງ ເລືອກສີ @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Persian.lng b/lng/lang_Persian.lng index 923d664d1..abdcd584b 100644 --- a/lng/lang_Persian.lng +++ b/lng/lang_Persian.lng @@ -1,6 +1,6 @@ # Translation by saeid0035 -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian OPL %s @@ -43,7 +43,7 @@ ETH یﺎﻫ یزﺎﺑ رﺪﺑﺮﺿ ﺎﻫ یزﺎﺑ ﺖﺴﻴﻟ ﺎﻫ یزﺎﺑ تﺎﻤﻴﻈﻨﺗ -تﺎﻤﻴﻈﻨﺗ مﺎﻤﺗ ندﺮﻛ کﺎﭘ +Remove Settings یزﺎﺑ یﺎﻫ ﺪﻴﻠﻛ مﺎﻤﺗ ندﺮﻛ کﺎﭘ لوﺮﻜﺳا ﺖﻋﺮﺳ ﻪﺘﺴﻫآ @@ -145,7 +145,7 @@ HDD رﺎﻛدﻮﺧ ﺶﺧﺮﭼ ﺶﻫﺎﻛ ﻮﻳﺪﻳو ﺖﻟﺎﺣ ﺎﻫ گﻮﻟﺎﻳد ﮓﻧر ﺎﻫ هﺪﺷ بﺎﺨﺘﻧا ﮓﻧر -تﺎﻋﺎﻠﻃا ﻪﺤﻔﺻ نداد نﺎﺸﻧ +هﺪﺸﻧ هدﺎﻔﺘﺳا تﺎﻋﺎﻠﻃا ﻲﺷرﺎﻔﺳ ELF ﻞﻳﺎﻓ ﮓﻧر بﺎﺨﺘﻧا @@ -270,8 +270,13 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ ﺪﺷ ﻯﺭﺍﺬﮔ ﺭﺎﺑ %s زا %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ !'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ diff --git a/lng/lang_Polish.lng b/lng/lang_Polish.lng index f56464270..1ad1f79e6 100644 --- a/lng/lang_Polish.lng +++ b/lng/lang_Polish.lng @@ -1,6 +1,6 @@ # Translation by yohokaru -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Polish OPL %s @@ -43,7 +43,7 @@ Kółko Iks Lista gier Ustawienia gry -Usuń wszystkie ustawienia +Remove Settings Usunięto wszystkie klucze do gry Przewijanie Wolno @@ -145,7 +145,7 @@ Automatyczne zwalnianie obrotów HDD Tryb wideo Kolor ustawień Kolor zaznaczenia -Wyświetl stronę informacji +Niewykorzystany Info Niestandardowy ELF Wybór koloru @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index 1619ee8b9..db0e6fbd3 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -1,6 +1,6 @@ # Translation by danielb -# Last update: Oct. 28, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Portuguese OPL %s @@ -43,7 +43,7 @@ Circulo Cruz Lista de Jogos Aj. do jogo -Remover todos os ajustes +Remove Settings Removidos todos os ajustes para o jogo Rolagem Lento @@ -145,7 +145,7 @@ Desligamento automático do HDD Modo de vídeo Cor do diálogo Cor selecionada -Mostrar Página de Informação +Não utilizado Info ELF personalizado Seleção de Cor @@ -270,8 +270,13 @@ Ativar notificações %s carregado de %s Menu de Jogo Configurações do jogo guardadas. -Configurações do jogo removidas. +%s settings removed. Substitui configurações de compatibilidade de jogos existentes quando ativado. +Settings Mode +Global +Per Game +All +Select settings to remove. Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index 78efc0e34..dc0c9f6d3 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -1,6 +1,6 @@ # Translation by Colossus, tonyhoro, and joseri -# Last update: Oct. 28, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Brazilian Portuguese OPL %s @@ -43,7 +43,7 @@ O X Lista de jogos Ajustes -Remover todos os ajustes +Remove Settings Todos os ajustes do jogo foram removidos Rolagem Lenta @@ -145,7 +145,7 @@ Desligamento automático do HDD (spin down) Modo de vídeo Cor do diálogo Cor da seleção -Exibir página de informações +Não utilizado Info Customizar ELF principal Seleção de cor @@ -270,8 +270,13 @@ Ativar notificações %s carregado de %s Menu do Jogo Configurações do jogo salvas. -Configurações do jogo removidas. +%s settings removed. Substitui as configurações de compatibilidade de jogos existentes quando ativada. +Settings Mode +Global +Per Game +All +Select settings to remove. Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Romana.lng b/lng/lang_Romana.lng index 558b3f0ca..0f13b9040 100644 --- a/lng/lang_Romana.lng +++ b/lng/lang_Romana.lng @@ -1,6 +1,6 @@ # Romanian translation by MRAdyy -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Romanian Open PS2 Loader %s @@ -43,7 +43,7 @@ Cerc Cruce Lista jocuri Setari joc -Sterge toate setarile +Remove Settings Au fost sterse toate butoanele jocului Miscare Incet @@ -145,7 +145,7 @@ Oprire automata HDD Mod video Culoare Dialog Culoare selectata -Afisare pagina informatii +Unused Info ELF personalizat Selectie culoare @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Games PS1 Games Display Mode POPSTARTER.ELF not found at '%s'! diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index df7686d5d..64a6bbcbf 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,6 +1,6 @@ # Translated by druchapucha and frodosumkin -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian OPL %s @@ -43,7 +43,7 @@ HDD-Игры Крест Список игр Конфиг. -Сбросить все настройки +Remove Settings Все опции сброшены! Прокрутка Медленная @@ -145,7 +145,7 @@ VMC файл существует Видеорежим Цвет текста Выбранный цвет -Включить страницу инфо +Не используется Инфо Пользовательский ELF Выбор цвета @@ -270,8 +270,13 @@ VMC %s файл фрагментирован. Продолжить с карто %s загружено из %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! diff --git a/lng/lang_SChinese.lng b/lng/lang_SChinese.lng index 5c3a5a4ee..da64335fc 100644 --- a/lng/lang_SChinese.lng +++ b/lng/lang_SChinese.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Oct. 31, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese OPL %s @@ -43,7 +43,7 @@ O X 游戏列表 游戏设置 -删除所有设置 +Remove Settings 删除游戏所有的设置 选定项滚动速度 较慢 @@ -145,7 +145,7 @@ USB 前缀路径 视频模式 对话框颜色 被选定颜色 -显示讯息页面 +空闲 讯息 自定义 ELF 颜色选项 @@ -270,8 +270,13 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? %s 从 %s加载 游戏菜单 游戏设置已保存。 -游戏设置已删除。 +%s settings removed. 启用时覆盖现有的游戏兼容性设置。 +Settings Mode +Global +Per Game +All +Select settings to remove. PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 14c1f8e8e..8296a4c86 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -1,6 +1,6 @@ # Translation by lauchon22 -# Last update: Oct. 28, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Spanish OPL %s @@ -43,7 +43,7 @@ Círculo Equis Lista de juegos Ajustes -Borrar todos los ajustes +Remove Settings Ajustes del juego borrados Desplazamiento Lento @@ -145,7 +145,7 @@ Paro automático rotación del Disco duro Modo de vídeo interfaz Color de diálogos Color de selección -Mostrar pantalla de información +Sin uso Info. Archivo ELF personalizado Seleccionar color @@ -270,8 +270,13 @@ Activar notificaciones %s cargado desde %s Menú de Juegos Configuración de juego guardada -Configuración de juego eliminada +%s settings removed. Sobrescribe la configuración de compatibilidad de juego cuando está habilitado +Settings Mode +Global +Per Game +All +Select settings to remove. Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index e408dc4f3..e4299ccc2 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -1,6 +1,6 @@ # Translation by Lord_Flaya -# Last update: Oct. 28, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Swedish OPL %s @@ -43,7 +43,7 @@ Cirkel Kryss Spel-lista Spelinst. -Ta bort alla inställningar +Remove Settings Tog bort alla nycklar för spelet Bläddra Sakta @@ -145,7 +145,7 @@ Automatisk HDD nerspinn Videoläge Dialog färg Vald färg -Visa info sida +Används ej Info Custom ELF Färgval @@ -270,8 +270,13 @@ Aktivera notifikationer %s Laddat från %s SpelMeny Spelinställningar sparade. -Spelinställningar borttagna. +%s settings removed. Skriver över befintliga spelinställningar om aktiverad. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese.lng index bdb80b36a..af9123f06 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese.lng @@ -1,6 +1,6 @@ # Translated by kane159 and eyu2007 -# Last update: Oct. 31, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese OPL %s @@ -43,7 +43,7 @@ O X 遊戲列表 遊戲設置 -刪除所有設置 +Remove Settings 刪除遊戲所有的設置 選定項滾動速度 較慢 @@ -145,7 +145,7 @@ USB 前綴路徑 視頻模式 對話框顏色 被選定顏色 -顯示訊息頁面 +空閑 訊息 自定義 ELF 顏色選項 @@ -270,8 +270,13 @@ vmc% s 文件碎片化.是否繼續使用插槽% d 中的記憶卡? %s從%s載入 遊戲菜單 遊戲設置已保存。 -遊戲設置已刪除。 +%s settings removed. 啟用時覆蓋現有的遊戲兼容性設置。 +Settings Mode +Global +Per Game +All +Select settings to remove. PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! diff --git a/lng/lang_Turkish.lng b/lng/lang_Turkish.lng index c0f615c9f..49799a4e9 100644 --- a/lng/lang_Turkish.lng +++ b/lng/lang_Turkish.lng @@ -1,6 +1,6 @@ # Translation by Gürkan DEMİR aka: dante and Çağhan DEMİR aka: caghandemir -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Turkish OPL %s @@ -43,7 +43,7 @@ Daire Çarpı Oyun listesi Oyun ayarları -Tüm ayarları sil +Remove Settings Oyunun tüm anahtarları kaldırıldı Kaydırma Yavaş @@ -145,7 +145,7 @@ Otomatik Sabit Disk durdurma Video modu İleti rengi Seçili öğe rengi -Bilgi Ekranı göster +Kullanılmıyor Bilgi Özel ELF Renk seçimi @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. PS1 Oyunları PS1 Oyunları Ekran Modu POPSTARTER.ELF '%s' de bulunamadı. diff --git a/lng/lang_Vietnamese.lng b/lng/lang_Vietnamese.lng index bd3f91df9..a64928baf 100644 --- a/lng/lang_Vietnamese.lng +++ b/lng/lang_Vietnamese.lng @@ -1,6 +1,6 @@ # Translation by zidane89 -# Last update: Oct. 27, 2019 -# Updated for OPL_1627-DB-TA-[784dc3f] and OPL_1399-Beta-[81a94ed] +# Last update: Nov. 02, 2019 +# Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Vietnamese OPL %s @@ -43,7 +43,7 @@ Nút O Nút X Danh sách trò chơi Cài đặt Game -Xóa mọi cài đặt +Remove Settings Removed all keys for the game Cuộn Chậm @@ -145,7 +145,7 @@ HDD tự động chờ Chế độ Video Màu hộp thoại Chọn màu -Hiển thị trang thông tin trò chơi +Không dùng Thông tin Tùy chỉnh ELF Màu sắc lựa chọn @@ -270,8 +270,13 @@ Enable Notifications %s loaded from %s Game Menu Game settings saved. -Game settings removed. +%s settings removed. Overwrites existing game compatibility settings when enabled. +Settings Mode +Global +Per Game +All +Select settings to remove. Các trò chơi PS1 Chế độ hiển thị cho game PS1 POPSTARTER.ELF không có ở '%s'! From 298cde1ff3d9020a9c7fad1478574f162c1739d3 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Sat, 2 Nov 2019 21:51:41 -0700 Subject: [PATCH 183/269] update lang files --- lng/lang_Arabic.lng | 26 +++++++++++++------------- lng/lang_Portuguese.lng | 12 ++++++------ lng/lang_Portuguese_BR.lng | 12 ++++++------ lng/lang_Spanish.lng | 12 ++++++------ lng/lang_Swedish.lng | 14 +++++++------- 5 files changed, 38 insertions(+), 38 deletions(-) diff --git a/lng/lang_Arabic.lng b/lng/lang_Arabic.lng index 741bd19d4..f5de0ed47 100644 --- a/lng/lang_Arabic.lng +++ b/lng/lang_Arabic.lng @@ -43,7 +43,7 @@ SMB ﺔﻤﺋﺎﻗ ﺔﻛﺭﺎﺸﻣ ﻦﻜﻤﻳﻻ ﺲﻛﺍ ﺏﺎﻌﻟﻻﺍ ﺔﻤﺋﺎﻗ ﺔﺒﻌﻠﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ -Remove Settings +ﺕﺍﺩﺍﺪﻋﺇ ﺔﻟﺍﺯﺇ ﺔﺒﻌﻠﻟﺍ ﺢﻴﺗﺎﻔﻣ ﺔﻓﺎﻛ ﺔﻟﺍﺯﺇ ﺮﻳﺮﻤﺘﻟﺍ ﺀﻲﻄﺑ @@ -73,7 +73,7 @@ APPS ﺕﺎﻘﻴﺒﻄﺘﻟﺍ ﻞﻴﻐﺸﺗ HDL ﻡﺩﺎﺧ ﺃﺪﺑ HDL ﺮﻓﺮﻴﺳ ﺃﺪﺑ ﻱﺭﺎﺟ HDL ﻞﻴﻐﺸﺗ ﻱﺭﺎﺟ - HDL ﺮﻓﺮﻴﺳ ﺍﺪﺑ ﻲﻓ ﻞﺸﻓ +HDL ﺮﻓﺮﻴﺳ ﺍﺪﺑ ﻲﻓ ﻞﺸﻓ HDL ﻡﺩﺎﺧ ﻞﻴﻤﺤﺗ ﺀﺎﻐﻟﺍ IGR ﺭﺎﺴﻣ ﺔﻴﻔﻠﺨﻟﺍ ﻥﻮﻟ @@ -108,7 +108,7 @@ USB ﺏﺎﻌﻟﺍ ﺔﺋﺰﺠﺗ ﻦﻣ ﻖﻘﺤﺗ ﺭﺰﻟﺍ ﺮﺘﺧﺍ ﺔﺋﺰﺠﻣ ﺔﺒﻌﻠﻟﺍ ،ﺄﻄﺧ ﺪﻨﺒﻟﺍ ﺍﺬﻫ ﻞﻴﻐﺸﺗ ﻦﻜﻤﻳ ﻻ ،ﺄﻄﺧ -Test Changes +ﺕﺍﺮﻴﻴﻐﺘﻟﺍ ﺭﺎﺒﺘﺧﺍ .ﻒﻴﻀﻟﺍ ﺔﻗﺩﺎﺼﻣ ﻞﺟﺍ ﻦﻣ ﺔﻏﺭﺎﻓ ﻙﺮﺗ ﺔﻘﻴﻗﺩ ﺕﺍﺀﺍﺮﻗ ﻦﻣﺍﺰﺘﻟﺍ ﻊﺿﻭ @@ -199,7 +199,7 @@ FMV ﺯﺎﻴﺘﺟﺍ ﺶﻐﻟﺍ ﻰﻠﻋ ﺭﻮﺜﻌﻟﺍ ﻢﺘﻳ ﻢﻟ ﻲﺿﺍﺮﺘﻓﺍ ﻞﻴﻤﺤﺗ ﺔﻜﺒﺸﻟﺍ ﺚﻳﺪﺤﺗ -Overwrite Existing Records +ﺓﺩﻮﺟﻮﻤﻟﺍ ﺕﻼﺠﺴﻟﺍ ﻕﻮﻓ ﺔﺑﺎﺘﻜﻟﺍ .ﺚﻳﺪﺤﺘﻟﺍ ﻞﺸﻓ .ﻡﺩﺎﺨﻟﺍ ﺚﻳﺪﺤﺘﻟ ﻝﺎﺼﺗﻻﺍ ﻞﺸﻓ .ﺚﻳﺪﺤﺘﻟﺍ ﻰﻬﺘﻧﺍ @@ -268,15 +268,15 @@ d?% ﺔﺤﺘﻔﻟﺍ ﻲﻓ ﺓﺮﻛﺍﺬﻟﺍ ﺔﻗﺎﻄﺑ ﻊﻣ ﻞ (HDD) ﺖﻗﺆﻤﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﺏﺎﻌﻟﺃ ﺔﻤﺋﺎﻗ ﺕﺍﺭﺎﻌﺷﻹﺍ ﻦﻴﻜﻤﺗ s% ﻦﻣ ﻞﻤﺤﻣ s% -Game Menu -Game settings saved. -%s settings removed. -Overwrites existing game compatibility settings when enabled. -Settings Mode -Global -Per Game -All -Select settings to remove. +ﺔﺒﻌﻠﻟﺍ ﺔﻤﺋﺎﻗ +.ﺔﺒﻌﻠﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﻆﻔﺣ ﻢﺗ +.ﺕﺍﺩﺍﺪﻋﻹﺍ ﺔﻟﺍﺯﺇ ﺖﻤﺗ %s +.ﻦﻴﻜﻤﺘﻟﺍ ﺪﻨﻋ ﺔﻴﻟﺎﺤﻟﺍ ﺔﺒﻌﻠﻟﺍ ﻖﻓﺍﻮﺗ ﺕﺍﺩﺍﺪﻋﺇ ﻕﻮﻓ ﺔﺑﺎﺘﻜﻟﺍ +ﺕﺍﺩﺍﺪﻋﻹﺍ ﻊﺿﻭ +ﻲﻤﻟﺎﻋ +ﺔﺒﻌﻟ ﻞﻜﻟ +ﻞﻜﻟﺍ +.ﺎﻬﺘﻟﺍﺯﻹ ﺕﺍﺩﺍﺪﻋﻹﺍ ﺩﺪﺣ PS1 ﺏﺎﻌﻟﺍ PS1 ﺏﺎﻌﻟﺍ ﻞﻴﻐﺸﺗ '%s'! ﻲﻓ ﺩﻮﺟﻮﻣ ﺮﻴﻏ POPSTARTER.ELF diff --git a/lng/lang_Portuguese.lng b/lng/lang_Portuguese.lng index db0e6fbd3..3dfaf68f5 100644 --- a/lng/lang_Portuguese.lng +++ b/lng/lang_Portuguese.lng @@ -43,7 +43,7 @@ Circulo Cruz Lista de Jogos Aj. do jogo -Remove Settings +Remover configurações Removidos todos os ajustes para o jogo Rolagem Lento @@ -270,13 +270,13 @@ Ativar notificações %s carregado de %s Menu de Jogo Configurações do jogo guardadas. -%s settings removed. +%s configurações removidas. Substitui configurações de compatibilidade de jogos existentes quando ativado. -Settings Mode +Modo de configurações Global -Per Game -All -Select settings to remove. +Por jogo +Todos +Selecione as configurações para remover. Jogos PS1 Modo de inicio para Jogos PS1 POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Portuguese_BR.lng b/lng/lang_Portuguese_BR.lng index dc0c9f6d3..54995ae1a 100644 --- a/lng/lang_Portuguese_BR.lng +++ b/lng/lang_Portuguese_BR.lng @@ -43,7 +43,7 @@ O X Lista de jogos Ajustes -Remove Settings +Remover configurações Todos os ajustes do jogo foram removidos Rolagem Lenta @@ -270,13 +270,13 @@ Ativar notificações %s carregado de %s Menu do Jogo Configurações do jogo salvas. -%s settings removed. +%s configurações removidas. Substitui as configurações de compatibilidade de jogos existentes quando ativada. -Settings Mode +Modo de configurações Global -Per Game -All -Select settings to remove. +Por jogo +Todos +Selecione as configurações para remover. Jogos PS1 Modo de início dos Jogos PS1 Arquivo POPSTARTER.ELF não encontrado em '%s'! diff --git a/lng/lang_Spanish.lng b/lng/lang_Spanish.lng index 8296a4c86..3302c2be2 100644 --- a/lng/lang_Spanish.lng +++ b/lng/lang_Spanish.lng @@ -43,7 +43,7 @@ Círculo Equis Lista de juegos Ajustes -Remove Settings +Eliminar configuración Ajustes del juego borrados Desplazamiento Lento @@ -270,13 +270,13 @@ Activar notificaciones %s cargado desde %s Menú de Juegos Configuración de juego guardada -%s settings removed. +%s configuraciones eliminadas. Sobrescribe la configuración de compatibilidad de juego cuando está habilitado -Settings Mode +Modo Configuración Global -Per Game -All -Select settings to remove. +Por Juegos +Todos +Selecciona configuración a eliminar. Juegos de PS1 Modo de visualización de juegos de PS1 ¡POPSTARTER.ELF no se encuentra en '%s'! diff --git a/lng/lang_Swedish.lng b/lng/lang_Swedish.lng index e4299ccc2..2dbf78d3c 100644 --- a/lng/lang_Swedish.lng +++ b/lng/lang_Swedish.lng @@ -43,7 +43,7 @@ Cirkel Kryss Spel-lista Spelinst. -Remove Settings +Ta bort inställningar Tog bort alla nycklar för spelet Bläddra Sakta @@ -270,13 +270,13 @@ Aktivera notifikationer %s Laddat från %s SpelMeny Spelinställningar sparade. -%s settings removed. +%s inställningar borttagna Skriver över befintliga spelinställningar om aktiverad. -Settings Mode -Global -Per Game -All -Select settings to remove. +Inställningsläge +Globalt +Per Sper +Alla +Välj inställningar att ta bort. PS1 Spel Video läge PS1 Spel POPSTARTER.ELF saknas i '%s! From 38b26d2b456397fbf45a2c9618f3b6e01b417855 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 4 Nov 2019 22:35:28 -0800 Subject: [PATCH 184/269] update lang files --- lng/lang_Indonesian.lng | 12 ++++++------ lng/lang_Persian.lng | 26 +++++++++++++------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lng/lang_Indonesian.lng b/lng/lang_Indonesian.lng index 290694ea8..aaa524970 100644 --- a/lng/lang_Indonesian.lng +++ b/lng/lang_Indonesian.lng @@ -1,5 +1,5 @@ # translated by verislasher and jbliz -# Last update: Nov. 02, 2019 +# Last update: Nov. 03, 2019 # Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Indonesian @@ -43,7 +43,7 @@ Bulat Kali Daftar Game Setingan -Remove Settings +Hapus setingan Semua kunci permainan yang dihapus Gulir Lambat @@ -270,13 +270,13 @@ Izinkan Pemberitahuan %s dimuat dari %s Menu Game Pengaturan Game disimpan. -%s settings removed. +%s setingan dihapus. Timpa pengaturan kompatibilitas game yang ada ketika diaktifkan. -Settings Mode +Mode Setingan Global Per Game -All -Select settings to remove. +Seluruh +Pilih setingan untuk dihapus. PS1 Games PS1 Games mode tampilan POPSTARTER.ELF tak ada di '%s'! diff --git a/lng/lang_Persian.lng b/lng/lang_Persian.lng index abdcd584b..8a1d4cc88 100644 --- a/lng/lang_Persian.lng +++ b/lng/lang_Persian.lng @@ -1,5 +1,5 @@ # Translation by saeid0035 -# Last update: Nov. 02, 2019 +# Last update: Nov. 03, 2019 # Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Persian @@ -43,7 +43,7 @@ ETH یﺎﻫ یزﺎﺑ رﺪﺑﺮﺿ ﺎﻫ یزﺎﺑ ﺖﺴﻴﻟ ﺎﻫ یزﺎﺑ تﺎﻤﻴﻈﻨﺗ -Remove Settings +ﺕﺎﻤﻴﻈﻨﺗ ﻥﺩﺮﮐ ﮎﺎﭘ یزﺎﺑ یﺎﻫ ﺪﻴﻠﻛ مﺎﻤﺗ ندﺮﻛ کﺎﭘ لوﺮﻜﺳا ﺖﻋﺮﺳ ﻪﺘﺴﻫآ @@ -108,7 +108,7 @@ USB یﺎﻫ یزﺎﺑ ﻲﮕﺘﺨﻳر ﻢﻬﺑ ندﺮﻛ ﮏﭼ بﺎﺨﺘﻧا ی ﻪﻤﻛد ﺖﺳا ﻪﺘﺨﻳر ﻢﻫ ﻪﺑ یزﺎﺑ یﺎﻫ ﻞﻳﺎﻓ هﺪﻣآ دﻮﺟو ﻪﺑ ﻲﻠﻜﺸﻣ ﺖﺴﻴﻧ ﺮﻳﺬﭘ نﺎﻜﻣا ﻢﺘﻳآ یاﺮﺟا هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ -Test Changes +ﺕﺍﺮﻴﻐﺗ ﺖﺴﺗ .ﺪﻳراﺬﮕﺑ ﻲﻟﺎﺧ سﺎﻨﺷﺎﻧ ترﻮﺻ ﻪﺑ دورو یاﺮﺑ Accurate Reads Synchronous ﺖﻟﺎﺣ @@ -199,7 +199,7 @@ PS2RD ﺐﻠﻘﺗ ﺪﻛ رﻮﺗﻮﻣ ﺖﻟﺎﺣ ﺪﺸﻧ ﺖﻓﺎﻳ ﻲﺒﻠﻘﺗ ﺪﻛ ﭻﻴﻫ ﺎﻫ ضﺮﻓ ﺶﻴﭘ دﻮﻠﻧاد ﻪﻜﺒﺷ ﻖﻳﺮﻃ زا ﺖﻳﺪﭘآ -Overwrite Existing Records +ﺩﻮﺟﻮﻣ ﻖﺑﺍﻮﺳ ﺮﺑ ﻰﺳﻳﻮﻧﻭﺭ .درﻮﺧ ﺖﺴﻜﺷ ﺖﻳﺪﭘآ .هﺪﻣآ ﺶﻴﭘ ﻲﻠﻜﺸﻣ ﺖﻳﺪﭘآ روﺮﺳ ﻪﺑ لﺎﺼﺗا رد .ﺪﺷ ﻞﻴﻤﻜﺗ ﺖﻳﺪﭘا @@ -268,15 +268,15 @@ FIELD flipping یزﺎﺳ ﻪﻴﺒﺷ )HDD( ﺎﻫ یزﺎﺑ ﺖﺳﺮﻬﻓ ﺶﻛ ﻰﻧﺎﺳﺭ ﻉﺎﻠﻃا ﻥﺩﺮﻛ ﻝﺎﻌﻓ ﺪﺷ ﻯﺭﺍﺬﮔ ﺭﺎﺑ %s زا %s -Game Menu -Game settings saved. -%s settings removed. -Overwrites existing game compatibility settings when enabled. -Settings Mode -Global -Per Game -All -Select settings to remove. +ﻯﺯﺎﺑ ﻮﻨﻣ +ﺪﺷ ﻩﺮﻴﺧﺫ ﻯﺯﺎﺑ ﺕﺎﻤﻴﻈﻨﺗ +%s ﺪﺷ ﮎﺎﭘ %s ﺕﺎﻤﻴﻈﻨﺗ +ﻥﺩﻮﺑ ﻝﺎﻌﻓ ﻢﺎﮕﻨﻫ ﻯﺯﺎﺑ ﺎﺑ ﺭﺎﮔﺯﺎﺳ ﺕﺎﻤﻴﻈﻨﺗ ﻰﺴﻳﻮﻧ ﻭﺭ +ﺕﺎﻤﻴﻈﻨﺗ ﺖﻟﺎﺣ +ﻯﺭﺍﺮﺳ +ﻯﺯﺎﺑ ﺮﻫ ﺹﻮﺼﺨﻣ +ﻪﻤﻫ +ﺪﻴﻨﮐ ﺏﺎﺨﺘﻧﺍ ﺪﻴﻨﮐ ﮎﺎﭘ ﺪﻴﻫﺍﻮﺨﻴﻣ ﻪﻛ ﻰﺗﺎﻤﻴﻈﻨﺗ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ 1 ﻦﺸﻴﺘﺳا ﻲﻠﭘ یﺎﻫ یزﺎﺑ ﺶﻳﺎﻤﻧ ﺖﻟﺎﺣ !'%s' رد ﺪﺸﻧ ﺖﻓﺎﻳ POPSTARTER.ELF ﻞﻳﺎﻓ From 398402aa5df6278b44ebfa751e6f22d7ae02814f Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 5 Nov 2019 16:33:56 -0800 Subject: [PATCH 185/269] update lang files --- lng/lang_German.lng | 14 +++++++------- lng/lang_Hungarian.lng | 26 +++++++++++++------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lng/lang_German.lng b/lng/lang_German.lng index 957b62d99..bf7a59248 100644 --- a/lng/lang_German.lng +++ b/lng/lang_German.lng @@ -1,5 +1,5 @@ # German Translation by ps2guy and LopoTRI -# Last update: Nov. 02, 2019 +# Last update: Nov. 05, 2019 # Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 German @@ -43,7 +43,7 @@ Kreis Kreuz Spieleliste Spieleinst. -Remove Settings +Entferne Einstellungen Alle keys für das Spiel wurden entfernt Scrollen Langsam @@ -270,13 +270,13 @@ Benachrichtigungen Einschalten %s geladen von %s Spiel Menü Spiel-Einstellungen gespeichert. -%s settings removed. +%s Einstellungen entfernt. Wenn angewählt, werden existierende Spiel-Kompatibilitäts-Einstellungen überschrieben. -Settings Mode +Einstellungsmodus Global -Per Game -All -Select settings to remove. +je Spiel +Alle +Einstellungen Auswählen zum entfernen. PS1 Spiele PS1 Spiele Bildschirmeinstellungs-modus POPSTARTER.ELF nicht gefunden bei '%s'! diff --git a/lng/lang_Hungarian.lng b/lng/lang_Hungarian.lng index f9fe3cb38..2024bc22b 100644 --- a/lng/lang_Hungarian.lng +++ b/lng/lang_Hungarian.lng @@ -1,5 +1,5 @@ # Translation by co5oos -# Last update: Nov. 02, 2019 +# Last update: Nov. 05, 2019 # Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Hungarian @@ -43,7 +43,7 @@ Kör Kereszt Játék Lista Játékbeállítások -Remove Settings +Beállítások eltávolítása Játékhoz tartozó összes kulcs eltávolítva Görgetés Lassú @@ -108,7 +108,7 @@ Emlékezz a legutóbbi játékra Select Gomb Hiba, a játék töredezett Hiba, az elem futtatása sikertelen -Test Changes +Változások tesztelése Hagyja üresen VENDÉG hitelesítéshez Postos Olvasás Egyidejű Mód @@ -199,7 +199,7 @@ Hiba: A Csalás Fájl betöltése sikertelen Nem találhatóak csalások Alapértelmezett letöltése Hálózat frissítés -Overwrite Existing Records +Létező rekordok felülírása Frissítés Sikertelen. Nem sikerült csatlakozni a frissítő szerverhez. Frissítés befejezve. @@ -268,15 +268,15 @@ Videó mód változtatás jóváhagyása? Játéklista cachelés (HDD) Értesítések engedélyezése %s betöltve %s-ből -Game Menu -Game settings saved. -%s settings removed. -Overwrites existing game compatibility settings when enabled. -Settings Mode -Global -Per Game -All -Select settings to remove. +Játék Menü +Játékbeállítások elmentve. +%s beállítások eltávolítva +Engedélyezéskor felülírja a létező játék kompatibilitási beállításokat. +Beállítások Mód +Globális +Játékonként +Összes +Válassza ki az eltávolítani való beállításokat. PS1 Játékok PS1 Játékok megjelenítési módja POPSTARTER.ELF nem található '%s'-nél! From 7a1684c6d30f1d3cd91a43d3463ea6f16cb9f6e2 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Wed, 6 Nov 2019 16:25:50 -0800 Subject: [PATCH 186/269] update lang files --- lng/lang_French.lng | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lng/lang_French.lng b/lng/lang_French.lng index bd2ed1fc9..7b356dfe2 100644 --- a/lng/lang_French.lng +++ b/lng/lang_French.lng @@ -1,5 +1,5 @@ # Translation by machiavel and Squall -# Last update: Nov. 02, 2019 +# Last update: Nov. 06, 2019 # Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 French @@ -9,7 +9,7 @@ Retour Configuration réseau Options avancées -Settings saved to %s +Paramètres sauvegardés vers %s Erreur d'écriture des options! Quitter Options @@ -43,7 +43,7 @@ Cercle Croix Liste des jeux Options du jeu -Remove Settings +Supprimer les paramètres Options du jeu supprimées Défilement Lent @@ -108,7 +108,7 @@ Souvenir dernier jeu joué Bouton de sélection Erreur, le jeu est fragmenté Erreur, impossible de lancer l'objet -Test Changes +Tester les changements Laissez vide pour authentification invité Lecture précise (simule la vitesse de lecture du CD/DVD) Mode synchrone (mode de lecture alternatif) @@ -133,7 +133,7 @@ Progression Fichier VMC existant Fichier VMC invalide, taille incorrecte Fichier VMC doit d'abord être créé -Error accessing VMC %s. Continue with the Memory Card in slot %d? +Erreur d'accès à la VMC %s. Continuer avec la Memory Card dans le slot %d? Rafraîchissement automatique À propos Codeurs @@ -199,7 +199,7 @@ Erreur: Impossible de charger le fichier de cheat Aucun cheat trouvé Télécharger les régl. par défaut Mise à jour réseau -Overwrite Existing Records +Ecraser les enregistrements existants Mise à jour échouée Échec de connexion au serveur Mise à jour terminée. @@ -266,17 +266,17 @@ Volume des effets sonore Volume du son de démarrage Confirmer le changement du mode vidéo? Cache liste de jeu (HDD) -Enable Notifications -%s loaded from %s -Game Menu -Game settings saved. -%s settings removed. -Overwrites existing game compatibility settings when enabled. -Settings Mode +Activer les Notifications +%s chargé depuis %s +Menu du jeu +Supprimer les paramètres +%s paramètres supprimés +Écrase les paramètres de compatibilité de jeu existants lorsqu'il est activé. +Mode Paramètres Global -Per Game -All -Select settings to remove. +Par jeu +Tout +Sélectionnez les paramètres à supprimer. PS1 Games Mode d'affichage des jeux PS1 POPSTARTER.ELF non trouvé à '%s'! From 26139d6e76ac642b926a6d20e91874d4dc9d36dd Mon Sep 17 00:00:00 2001 From: DDinghoya Date: Tue, 12 Nov 2019 10:08:09 +0900 Subject: [PATCH 187/269] Update lang_Korean.lng (#18) --- lng/lang_Korean.lng | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index 90aa62476..acffd8d24 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -9,7 +9,7 @@ OPL %s 네트워크 구성 고급 옵션 <값 없음> -Settings saved to %s +설정이 % s에 저장되었습니다. 설정 기록 중 에러! 종료 설정 @@ -43,7 +43,7 @@ O X 게임 목록 게임 설정 -Remove Settings +설정 삭제 설정된 게임 키 제거 스크롤 속도 느림 @@ -108,7 +108,7 @@ USB 게임 손상 검사 버튼 선택 오류, 게임이 손상 되었습니다. 오류, 항목을 실행할 수 없습니다 -Test Changes +테스트 변경 게스트 권한을 위해 지움 정밀하게 읽음 동기화 모드 @@ -133,7 +133,7 @@ VMC 구성 VMC 파일 존재 잘못된 VMC 파일, 크기가 다릅니다. VMC 파일이 생성되야 합니다. -Error accessing VMC %s. Continue with the Memory Card in slot %d? +VMC %s에 접속하는 동안 오류가 발생했습니다. 슬롯 %d에서 메모리 카드를 계속 사용하겠습니까? 자동 새로 고침 오픈 PS2 로더에 관하여 개발자 @@ -160,7 +160,7 @@ VMC 슬롯 1 VMC 슬롯 2 게임 ID DMA 모드 -V-Sync +V-동기화 모드 1 모드 2 모드 3 @@ -178,7 +178,7 @@ GSM 구성 GSM 설정 GSM 활성 GSM 켜기 또는 끄기 -VMODE +V모드 강제 사용자 지정 디스플레이 모드 H-POS 수평 조정 @@ -199,7 +199,7 @@ PS2RD 치트 엔진 모드 치트를 찾을 수 없음 다운로드 기본값 네트워크 업데이트 -Overwrite Existing Records +기존 레코드 덮어 쓰기 업데이트 실패. 업데이트 서버에 연결 실패. 업데이트 완료. @@ -258,7 +258,7 @@ FIELD 반전 에뮬레이션 자녀보호 잠금이 비활성화 되었습니다. 빌드 옵션: 오류 - 이 비밀번호는 사용할 수 없습니다. -VMC %s 파일이 조각났습니다. 슬롯 %d에 있는 메모리 카드로 계속 하시겠습니까? +VMC %s 파일이 조각났습니다. 슬롯 %d에 있는 메모리 카드로 계속 하겠습니까? 오디오 설정 사운드 효과 활성화 사운트 부팅 활성화 @@ -266,17 +266,17 @@ VMC %s 파일이 조각났습니다. 슬롯 %d에 있는 메모리 카드로 계 사운드 볼륨 부팅 비디오 모드 변경을 확인 하시겠습니까? 캐쉬 게임 목록 (HDD) -Enable Notifications -%s loaded from %s -Game Menu -Game settings saved. -%s settings removed. -Overwrites existing game compatibility settings when enabled. -Settings Mode -Global -Per Game -All -Select settings to remove. +알림 사용 +%s에서 %s을(를) 로드했습니다. +게임 메뉴 +게임 설정이 저장되었습니다. +%s 설정이 제거되었습니다. +활성화되면 기존 게임 호환성 설정을 덮어 씁니다. +설정 모드 +글로벌 +게임당 +전부 +제거할 설정을 선택하십시오. PS1 게임 PS1 게임 표시 모드 '%s'에 POPSTARTER.ELF이 없습니다! From 2f151cc6a9333929d98d7dfbcd5cbb00a97df2ac Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Mon, 11 Nov 2019 17:12:45 -0800 Subject: [PATCH 188/269] update lang files --- lng/lang_Korean.lng | 14 +++++++------- lng/lang_SChinese.lng | 16 ++++++++-------- lng/lang_TChinese.lng | 24 ++++++++++++------------ 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/lng/lang_Korean.lng b/lng/lang_Korean.lng index acffd8d24..52d077ca6 100644 --- a/lng/lang_Korean.lng +++ b/lng/lang_Korean.lng @@ -1,5 +1,5 @@ # Translated by DDinghoya -# Last update: Nov. 02, 2019 +# Last update: Nov. 11, 2019 # Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Korean @@ -9,7 +9,7 @@ OPL %s 네트워크 구성 고급 옵션 <값 없음> -설정이 % s에 저장되었습니다. +설정이 %s 에 저장되었습니다. 설정 기록 중 에러! 종료 설정 @@ -133,7 +133,7 @@ VMC 구성 VMC 파일 존재 잘못된 VMC 파일, 크기가 다릅니다. VMC 파일이 생성되야 합니다. -VMC %s에 접속하는 동안 오류가 발생했습니다. 슬롯 %d에서 메모리 카드를 계속 사용하겠습니까? +VMC %s 에 접속하는 동안 오류가 발생했습니다. 슬롯 %d 에서 메모리 카드를 계속 사용하겠습니까? 자동 새로 고침 오픈 PS2 로더에 관하여 개발자 @@ -258,7 +258,7 @@ FIELD 반전 에뮬레이션 자녀보호 잠금이 비활성화 되었습니다. 빌드 옵션: 오류 - 이 비밀번호는 사용할 수 없습니다. -VMC %s 파일이 조각났습니다. 슬롯 %d에 있는 메모리 카드로 계속 하겠습니까? +VMC %s 파일이 조각났습니다. 슬롯 %d 에 있는 메모리 카드로 계속 하겠습니까? 오디오 설정 사운드 효과 활성화 사운트 부팅 활성화 @@ -267,7 +267,7 @@ VMC %s 파일이 조각났습니다. 슬롯 %d에 있는 메모리 카드로 계 비디오 모드 변경을 확인 하시겠습니까? 캐쉬 게임 목록 (HDD) 알림 사용 -%s에서 %s을(를) 로드했습니다. +%s 에서 %s 을(를) 로드했습니다. 게임 메뉴 게임 설정이 저장되었습니다. %s 설정이 제거되었습니다. @@ -279,8 +279,8 @@ VMC %s 파일이 조각났습니다. 슬롯 %d에 있는 메모리 카드로 계 제거할 설정을 선택하십시오. PS1 게임 PS1 게임 표시 모드 -'%s'에 POPSTARTER.ELF이 없습니다! -VCD 파일 '% s'을(를) 찾을 수 없습니다! +'%s' 에 POPSTARTER.ELF이 없습니다! +VCD 파일 '%s' 을(를) 찾을 수 없습니다! 파일 이름을 바꾸는 중 오류가 발생했습니다. 파일을 삭제하는 중 오류가 발생했습니다. OPEN-PS2-LOADER (OPL)를 구입하지 말고 무료로 받으세요.: diff --git a/lng/lang_SChinese.lng b/lng/lang_SChinese.lng index da64335fc..74e727701 100644 --- a/lng/lang_SChinese.lng +++ b/lng/lang_SChinese.lng @@ -1,5 +1,5 @@ # Translated by kane159 and eyu2007 -# Last update: Nov. 02, 2019 +# Last update: Nov. 10, 2019 # Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Simplified Chinese @@ -43,7 +43,7 @@ O X 游戏列表 游戏设置 -Remove Settings +删除设置 删除游戏所有的设置 选定项滚动速度 较慢 @@ -270,13 +270,13 @@ vmc% s 文件碎片化.是否继续使用插槽% d 中的记忆卡? %s 从 %s加载 游戏菜单 游戏设置已保存。 -%s settings removed. +%s设置已删除。 启用时覆盖现有的游戏兼容性设置。 -Settings Mode -Global -Per Game -All -Select settings to remove. +设置模式 +全局 +当前游戏 +全部 +选择要删除的设置。 PS1游戏 PS1游戏启动模式 POPSTARTER.ELF在'%s'上找不到! diff --git a/lng/lang_TChinese.lng b/lng/lang_TChinese.lng index af9123f06..1b6a0f17a 100644 --- a/lng/lang_TChinese.lng +++ b/lng/lang_TChinese.lng @@ -1,5 +1,5 @@ # Translated by kane159 and eyu2007 -# Last update: Nov. 02, 2019 +# Last update: Nov. 10, 2019 # Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Traditional Chinese @@ -9,7 +9,7 @@ OPL %s 網路設置 進階設置 <無數值> -設置保存到%s +設置保存到 %s 寫入設置錯誤! 離開 設置 @@ -43,7 +43,7 @@ O X 遊戲列表 遊戲設置 -Remove Settings +刪除設置 刪除遊戲所有的設置 選定項滾動速度 較慢 @@ -133,7 +133,7 @@ GUEST驗證留空. VMC 存檔已存在 無效的 VMC 存檔, 大小有誤 需要建立VMC 存檔 -訪問VMC %s出錯。繼續使用插槽%d中的記憶卡? +訪問VMC %s 出錯。繼續使用插槽%d中的記憶卡 %d? 自動重新整理 關於 程序 @@ -258,7 +258,7 @@ LMP版本: 已禁用家長鎖. 創建選項: 錯誤-無法使用此密碼. -vmc% s 文件碎片化.是否繼續使用插槽% d 中的記憶卡? +vmc %s 文件碎片化.是否繼續使用插槽 %d 中的記憶卡? 音頻設置 啟用聲音效果 啟用啟動聲音 @@ -267,16 +267,16 @@ vmc% s 文件碎片化.是否繼續使用插槽% d 中的記憶卡? 確認視頻模式更改? 緩存遊戲列表 (硬碟) 啟用通知 -%s從%s載入 +%s 從 %s 載入 遊戲菜單 遊戲設置已保存。 -%s settings removed. +%s 設置已刪除。 啟用時覆蓋現有的遊戲兼容性設置。 -Settings Mode -Global -Per Game -All -Select settings to remove. +設置模式 +全局 +當前遊戲 +全部 +選擇要刪除的設置。 PS1遊戲 PS1遊戲啟動模式 POPSTARTER.ELF在\'%s\'上找不到! From 19b2f05223c3053bb32441b10ec617076b895fdb Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Thu, 14 Nov 2019 15:01:40 -0800 Subject: [PATCH 189/269] update lang files --- lng/lang_Russian.lng | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lng/lang_Russian.lng b/lng/lang_Russian.lng index 64a6bbcbf..e8e3cbd52 100644 --- a/lng/lang_Russian.lng +++ b/lng/lang_Russian.lng @@ -1,5 +1,5 @@ # Translated by druchapucha and frodosumkin -# Last update: Nov. 02, 2019 +# Last update: Nov. 14, 2019 # Updated for OPL_1641_DB-TA_all-04fb897-2019-11-02 and OPL_1406_ifcaro_beta_all-5dbb549-2019-11-02 # official thread: http://www.ps2-home.com/forum/viewtopic.php?f=83&t=164 Russian @@ -43,7 +43,7 @@ HDD-Игры Крест Список игр Конфиг. -Remove Settings +Удалить настройки Все опции сброшены! Прокрутка Медленная @@ -108,7 +108,7 @@ NetBIOS Кнопка выбор Ошибка, игра фрагментирована Ошибка, невозможно запустить объект! -Test Changes +Изменения Теста Оставьте пустым для гостевого доступа Аккуратное чтение Альтернативный метод чтения данных @@ -199,7 +199,7 @@ PS2RD Cheat Engine пропатчит вашу игру Не найдено ни читы Загрузка стандартных Обновление из Интернет -Overwrite Existing Records +Перезаписать существующие записи Не удалось загрузить. Не удалось соединится с сервером. Обновление завершено. @@ -267,16 +267,16 @@ VMC %s файл фрагментирован. Продолжить с карто Подтвердить изменение режима видео? Кэш игрового списка (HDD) Включить уведомления -%s загружено из %s -Game Menu -Game settings saved. -%s settings removed. -Overwrites existing game compatibility settings when enabled. -Settings Mode -Global -Per Game -All -Select settings to remove. +%s загруженных из %s +Меню игры +Настройки игры сохранены. +%s удалены настройки. +Перезаписывает существующие настройки совместимости игр, если они включены. +Режим настройки +Глобальный +За игру +Все +Выберите настройки для удаления. PS1 игры Отображать экран PS1 игр POPSTARTER.ELF не найден '%s'! From 23e844aa2903d2b0a289a215b809718f3169acbd Mon Sep 17 00:00:00 2001 From: KrahJohlito Date: Tue, 12 Nov 2019 09:01:27 +1030 Subject: [PATCH 190/269] update compat mode count to only include used modes --- include/iosupport.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/iosupport.h b/include/iosupport.h index 7731776f0..657233cf5 100644 --- a/include/iosupport.h +++ b/include/iosupport.h @@ -68,7 +68,7 @@ enum ERROR_CODE { #define COMPAT_MODE_7 0x40 // Unused #define COMPAT_MODE_8 0x80 // Unused -#define COMPAT_MODE_COUNT 8 +#define COMPAT_MODE_COUNT 6 // only count modes in use #define OPL_MOD_STORAGE 0x00097000 //(default) Address of the module storage region From 5bf829f1df6e6a4b907117e4e243f0d110f99f06 Mon Sep 17 00:00:00 2001 From: Jay-Jay-OPL Date: Tue, 11 Feb 2020 15:57:50 -0800 Subject: [PATCH 191/269] update default DB theme --- Makefile | 18 ++++++------------ gfx/{bg_overlay_2.png => background2.png} | Bin gfx/bg_overlay.png | Bin 40742 -> 0 bytes gfx/case.png | Bin 6562 -> 113 bytes gfx/cover.png | Bin 1134 -> 113 bytes gfx/info_overlay.png | Bin 68331 -> 0 bytes gfx/screen.png | Bin 6686 -> 113 bytes include/textures.h | 8 +++----- misc/conf_theme_OPL.cfg | 6 +++--- src/textures.c | 15 ++++++--------- 10 files changed, 18 insertions(+), 29 deletions(-) rename gfx/{bg_overlay_2.png => background2.png} (100%) delete mode 100755 gfx/bg_overlay.png delete mode 100644 gfx/info_overlay.png diff --git a/Makefile b/Makefile index 7cd80a6c1..dd28eba3e 100755 --- a/Makefile +++ b/Makefile @@ -64,7 +64,7 @@ GFX_OBJS = usb_icon.o hdd_icon.o eth_icon.o app_icon.o elm_icon.o \ cross_icon.o triangle_icon.o circle_icon.o square_icon.o select_icon.o start_icon.o \ left_icon.o right_icon.o up_icon.o down_icon.o \ load0.o load1.o load2.o load3.o load4.o load5.o load6.o load7.o \ - background.o info.o cover.o disc.o screen.o logo.o case.o bg_overlay.o bg_overlay_2.o \ + background.o info.o cover.o disc.o screen.o logo.o case.o background2.o \ ELF.o HDL.o ISO.o UL.o CD.o DVD.o Aspect_s.o Aspect_w.o Aspect_w1.o Aspect_w2.o \ Device_1.o Device_2.o Device_3.o Device_4.o Device_5.o Device_6.o Device_all.o \ Rating_0.o Rating_1.o Rating_2.o Rating_3.o Rating_4.o Rating_5.o \ @@ -659,17 +659,6 @@ $(EE_ASM_DIR)load6.s: gfx/load6.png | $(EE_ASM_DIR) $(EE_ASM_DIR)load7.s: gfx/load7.png | $(EE_ASM_DIR) $(BIN2S) $< $@ load7_png -$(EE_ASM_DIR)logo.s: gfx/logo.png | $(EE_ASM_DIR) - $(BIN2S) $< $@ logo_png - -#START of OPL_DB tweaks -$(EE_ASM_DIR)bg_overlay_2.s: gfx/bg_overlay_2.png | $(EE_ASM_DIR) - $(BIN2S) $< $@ bg_overlay_2_png - -$(EE_ASM_DIR)info_overlay.s: gfx/info_overlay.png | $(EE_ASM_DIR) - $(BIN2S) $< $@ info_overlay_png -#END of OPL_DB tweaks - $(EE_ASM_DIR)usb_icon.s: gfx/usb.png | $(EE_ASM_DIR) $(BIN2S) $< $@ usb_png @@ -720,6 +709,11 @@ $(EE_ASM_DIR)down_icon.s: gfx/down.png | $(EE_ASM_DIR) $(EE_ASM_DIR)background.s: gfx/background.png | $(EE_ASM_DIR) $(BIN2S) $< $@ background_png +#START of OPL_DB tweaks +$(EE_ASM_DIR)background2.s: gfx/background2.png | $(EE_ASM_DIR) + $(BIN2S) $< $@ background2_png +#END of OPL_DB tweaks + $(EE_ASM_DIR)info.s: gfx/info.png | $(EE_ASM_DIR) $(BIN2S) $< $@ info_png diff --git a/gfx/bg_overlay_2.png b/gfx/background2.png similarity index 100% rename from gfx/bg_overlay_2.png rename to gfx/background2.png diff --git a/gfx/bg_overlay.png b/gfx/bg_overlay.png deleted file mode 100755 index fada6b15d8e72eedde7c1512fe8392e6632e09c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40742 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%0A15(0=B`gsFbQT}#((K)8bQq@j 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 diff --git a/gfx/case.png b/gfx/case.png index daa3976bd2729c91982a67f0083d049b2ce23f88..a9ffa387b6fed176e68de49bfb3d40a526917758 100644 GIT binary patch literal 113 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 O4XiEf&F`7gQ~wKD0ZqdI diff --git a/gfx/cover.png b/gfx/cover.png index 74405f32da60de5cc73d88b71009b70cbbe36580..a9ffa387b6fed176e68de49bfb3d40a526917758 100644 GIT binary patch literal 113 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 uU146Bp5x?}w5E3{R3L>nuKT~wj6b&U%-8WeP diff --git a/gfx/bg_overlay.png b/gfx/bg_overlay.png index 3de6633a3c06336efc55ff76e53f72aae417bfb2..fada6b15d8e72eedde7c1512fe8392e6632e09c3 100755 GIT binary patch literal 40742 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%0A15(0=B`gsFbQT}#((K)8bQq@j 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 literal 29641 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 diff --git a/gfx/bg_overlay_2.png b/gfx/bg_overlay_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9b857c488356d9e5a5877a4355d74285bcc32a16 GIT binary patch literal 41135 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 M07*qoM6N<$f=&e1T>t<8 literal 0 HcmV?d00001 diff --git a/gfx/circle.png b/gfx/circle.png index 5fa9cfd580dd486efed70e4822f7360778bced09..892022925fbc8ab045658462bb288f7fb138e9d2 100644 GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQaEa{HEjtmSN`?>!lvI6<-0X`wF zKpH=Y^7C8k?*7ry@r0}EX&09dj*e~K-eLa!Yuw#`IXL`vaM-tRo*BO5nFgcJep(Cktqa?vvvk${i);V2|M}Y|UeBYmewD+H Q@1Vf81NH=v8Gi-<0051N9Sr~g02y>eSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00J0EL_t(|+Jx0lNEBfh$MKy}OT?(w{#bOV6e0)$snEN(qH7TzI&_FI z5c42(k?1CLs#8%A9XodD(4m`Tda{CoEEO#)v2mjuyuxG5Z5wHKn9_&E(631lO=14brN(AK1XEj+fI3 zPh&{|)?TAo{eKVf7H@DLhj0QP^!Tk+7m<>&9d1tsL{~Zr9xj&Uo*0?3y4&_*5XX<7GnHXi+`;17uHe2F(v+phE#ASm0(O; zGONB7EZQ2j=(QKLxZOCX^R)^u#Y*M3%H)oFDOOr>D4VCcU^O+4I^1&Gtmw}FYSJSr z@K81bz79KdA+L)s^|mkIg(i8YB0rA9c&|IN+MQOxZ`pc7N|w`c3>VRadfAKX_@$L;-m{Vp+90f>AwU;)>qd;7(tg2>0B&6x=7Pr1S6 C>?ZpF diff --git a/gfx/config.png b/gfx/config.png index 9fe0d7c82776393f0af93f72a7387f3f46d4d6f4..af37af39a2bd77e4bdccb59cab8d5f26df24f33b 100644 GIT binary patch literal 3492 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 fd7G$pJGKB|aZHGN-4cFl>vzoo!lvI6;O0X`wF zKpH<#tzK)LT4$9|$};aeeSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00Hw!L_t(|+Jx23OH@%9$MNpqOK6KQ4RM(+Y8wSX+twn8Bnd(gx=C=+ zqGhxV+C;0Oq)nu>2@#>U{~}O)sf0)k)Vz1bnMrTor+z0Mj(>Bf10QC%bI$MFbMABQ zBzc~nXwo`x4&6AyCe~0d8qiX3{X8ad4ShHXo4JfHn8y=*J2ukpFfxsu{BNtFj7;qN zFa5TG>+$$F?14Jhkrvoj_#uvPyC`s4VF%dO-8BlU=+jnFRq$XOcmY54<1+d&qX~T2 zfhHQl4K3fSpnuB;KGxt&11EL;r3(#Vwr{O?<5pp9Dg>U!l5RiM#^-KtUb%e@VefQp zUt?@#Z;{x5D_U;mmRE^F=Wr8kcprs@yZ?+HtHWNjN5y)G3Lc>iBk05jTt$k+^|zuw zg|1Tc!@u%GNx?gAk{|k>6dZ`e25q6{I$2n&0>|(Ii+`BF5N36^zFFVw&*ZH83|6%d zp)~9PjG}}E?U`--t>{6e?xB3N{-JE1se?V?T?|KIp`d-}j5|@*?)W;qr~%et9hdOB zL1Bl`an)*FzT#|r^zJDj9Ic|GS5}|QmDgyavusOzst(mAFNaiNHTAvQ>}`|azMHuk z6}%7Hc0Bu87#Li}bF3+-Dtq{ZhkAh=8=L&+FTh^?1MV;2JC=1)8n)j83;+zw8_;$@ R4XXeE002ovPDHLkV1iHa6c7La diff --git a/gfx/disc.png b/gfx/disc.png index bc7e7b040722f17d76a756f3a37deaf48bd10bf9..3c39edc140b0ac6e21c7d2fdb2afaf79725de76b 100644 GIT binary patch literal 3269 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 P00000NkvXXu0mjfmie-* literal 1490 zcmV;@1ugoCP)EQvEz`*oQa=P3GS^S zrLLPMu%h3QI^3q_$h3yM)079OjF3p7CXt;3siN`tF|tQv{@aja$m7Th zNDyfiHJn5WJwzfuM|MPC2m}J)bULA`stVk0Hvye4P3HehF@oUm5dJ z*^X3u-B~0DX=eJFi^R?@M(AR@?g{#>)^R<4fIRPsRF2W($X;3k>SboC<9Mosjv?P6 z&l#}G;&ptBTuOz|9%L=D*#M!Nsji+>2>k(hRPaVX&UhVwANMcAkx#p zG&cw99W8KYygNUfTLmuHW%F8>i0+V(Iz+W86FdxfzU z@37i>cpX+~gNAmgd!pfRm^C#uv5AR^1-FPFH#Rm(*P}uy*%aO>itp z^HEI7kwm)^$BcL!mIs#O89zTWGZTHP7Rf~HI?SCf(|Wo#iFPHPUU=V+wxXgUrR%&Q zA5u)GRiH>-mK*sfvU$+hF70dGzP`RhNuDI9v>*9WfXI_nRvnd{Y`c_&27^JxOrcOH z-f0J1f5*9Vk)cVR_bDpNA)sCILNhZnVRSV9dYzxo%F2?9>+tToo1%6+)_X;RK%Vvh z<=stXr3q-4^7P_#I@#pp)Yz^CUNUK0867ILBK6~kpKVy07*qoM6N<$f?{#dcmMzZ diff --git a/gfx/eth.png b/gfx/eth.png index f3214c2d9ff5cb0c509b36544f7e4a5d39f6b0c9..05a4aa0e4a0a9c224fa5f0ccfc5eb639a3efd35a 100644 GIT binary patch literal 6413 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 diff --git a/gfx/exit.png b/gfx/exit.png index c65c97116548acc4edd8e863a6c1d30fe26e20ab..1c0fce2ad49b5d9a3785b1e2e631357527815e01 100644 GIT binary patch literal 3280 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 JsOC#@{sDuV@Qwfg diff --git a/gfx/hdd.png b/gfx/hdd.png index 41bace056dd6cb12211e23532faea5c0e63ab9b4..baeb5c51967e9504299e7ebd1e1043cbea34c42a 100644 GIT binary patch literal 6397 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 LNkvXXu0mjfGStXm literal 2735 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