インターレースとは

ブラウン管の時代、主に "映像の帯域 "を削減するために必要だった機能。
これが原因で画面が毎フレーム上下に揺れたりぼやけたりする。

PCSX2側でこれを解除する機能は実装されており、グラフィック設定の「Deinterlacing(F5)」から適切なものを選ぶことで解除ができるがこれだけでは適切に処理できないことがあるので、この記事では「パッチ」を用いてインターレース解除する手段を紹介する。

インターレースが使用されているか確認

  1. グラフィック設定の「Deinterlacing(F5)」から「None」で無効化しておく。
  2. デバッグ > Show Debuggerの「breakpoint」からAddress:12000090を設置。
    • 12000090が駄目なら12000070, 12001000も試す。
  3. 画面が止まるので「Run」を押してコマ送りでちらつきが確認できた場合インターレースが有効になっている。

方法

確実に成功する方法はないので上から順に試すこと。
+ アセンブリ上での実装解説
PS2 interleacing is implemented by next 3 (functions / instructions / routines ):

1 > sony official sceGsSetHalfOffset = daddiu v0, v0, $0008 only
2 > sony official sceGsSetHalfOffset + custom game programer rutine = daddiu v0, v0, $0008 and ????????? custom routine or routines
3 > custom game programer routine only = ????????? custom routine or routines

so, we need to find adresses that write in this registers, values most of time are 0,1 1,0 0,8 8,0
to find this follow steps order:

1つ目

  1. ELF Search Tool 」でiso内の実行ファイル(頭にSLPM/SLUS/SLES等)を開く。
  2. Search Box「38290500 08004264」、Replace Box「38290500 00000000」、フォーマット「PNACH」でパッチ出力。

2つ目

  1. Debuggerから「12001000」 (readのみ)のブレークポイントを設置。
  2. 右のパネルから「andi 0x0001」を探す。
  3. 右クリックの「Assemble code(s)」から0x0000に書き換えてインターレースが解除されたら成功。右クリック「Copy Address」からコピーし00000000に置き換えるパッチを書く。

3つ目

解説者募集
+ 原文
2.2
put 12000090 (write) *game will pause > run cheat engine, hook pcsx2 process > memory scan start to 40100000 stop 41ffffff, in PCSX2 press RUN the game advance 1 frame you see image up and down a little> in cheatengine put 0 and firts scan, thousand adresses will find then in PCSX2 debugger press run again and cheat engine change value to 1 a press next scan, keep doign this till you filter/narrow less adresses that write 0 and 1 each time when you press RUN, (if you not find any inverse the search operation 1,0 or 0,8, 8,0)
Tip: in cheat engine you will note that filtered adresses when you PRESS RUN values change from 0 to 1 or 0 to 8 it Depends how you start searching.

now with this adresses you need to create write (breakpoints) for each addres (1 on time and test) in PCSX2 debugger not combined (dont forget disable 12000090 or 12000070 breakpoints or another breakpoints)
!!when copy the adresses from CE to PCSX2 Debugger change 4XXXXXXX (4) number for(0) = 0XXXXXXX (this number is the memory area is different in PCSX2 - CE)
if game interrup again use that address, if not use next addresses, next in left panel (PCSX2 debugger) each time game interrup pressing RUN you will see in left panel registers v0, v1, a0.. etc some change values 0,1 you need to deduce/analyze with this info
if adress you add had the same values or the near adresses.

Example:
Armore core last raven (USA) in game 3d world > filtering with 1,0 find 2 adresses (cheatengine) then you select 1 adress (202B81C8) > add to PCSX2 debugger write breakpoint the RUN > game will pause and mark (beq zero,zero,00177D98) you press RUN and see left panel register V0 are changing each time between 0 and 1, so i conclude need to find near a instruction who has V0 register, the next candidate is above adress with instruction (subu v0,v1,v0) > disable breakpoint then select adress doble click and see this interrup the game (withow breakpoint only execute type) press RUN again i see v0 are changing left panel start trial and error in this instruction with asemble opcode remplacing values v0 with "zero" (subu zero,v1,v0) and check * game still shake, try next register (subu v0,zero,v0) * check game works (fonts looks ugly) so i try next value (subu v0,v1,zero) *it works fonts looks ok; this adress affect custom interleasing routine of game so i create a pnach second click in the adress copy adress and hex in this format (patch=1,EE,*adress here,extended,*hex here) save and test game looks ok.
This not work always, you need to know, analize or guess each mips instruction (you will do better if learn mips basic) in many cases game crash or you need to change the mips code for ORI, li etc, or breakpoint near addresses, also if main instruction is large (you note by the color each section change) you need to check every candidate who not break the game
Special case: Armore core last raven.

Game no pause, go to step 2.3;
game crash or no find anything go to > step 3.

Basically we are finding what adresses are writing 0 and 1 in each frame step in cheat engine then in PCSX2 debugger find what instructions are writing this 0,1 values and cancel / nop / null / zero the value (you understand more when you learn more about cheat engine use);

2.3
put 12000070 (write) *game will pause, repeat step 2.2 instructions;
game crash or no pause go to > step 3

4つ目

解説者募集
+ 原文
this is more difficult to explain, you need understand about Ps2 Privileged GsRegisters, Good use Cheatengine, Basic Mips values changes like li, OR, ORI, XOR, etc
find routines/functions like scegsparam or similar, manipulate framebuffers / backbuffers, progressive modes opcodes, also amounts of logic and analytic mind Smile , this step is more difficult to explain (even with images) so, i left this in continue (or if some more skilled can teach us with another tutorial more advanced about manipulate this gs registers for framebuffers, frame sizes, progressive modes etc). basically you need to find framebuffer and progressive values and modify.
in the end this step is litle more dificult to grasp / understand but i put some lectures for learn more about it.
Tips for more interested people:
  • use 1.7 dev build from april 2021, this show GS Privileged registers and values, find this addreses values and edit in memory
  • use OPL-GSM source code values as guide (programers put good notes about this GS registers)
  • Read GS manual (lectures)
Special case: my code for Rumble Roses (Japan) / valkirye profile 2 silmeria (USA). / Tekken 5 USA/PAL

プログレッシブモード有効化

ELF Search Tool 」から作成。
ゲームウィンドウに「SDTV 480p / Progressive」と表示されれば成功。
Search Box:
002C0500 2000B2FF 00340600 1000B1FF 003C0700
Replace Box:
0000053C 2000B2FF 5000063C 1000B1FF 0100073C

画面が真っ黒だったりクラッシュする場合は次のsceMpegIsEnd(ビデオスキップコード)も追加。
Search Box:
4000838c 0800e003 0000628c 00000000
Replace Box:
4000838c 0800e003 01000224 00000000

本スレより

416名無しさん@お腹いっぱい。2019/08/01(木) 21:31:23.80ID:+8wNBUey0
>>413
>ずっと同じ人
パッチ作る人が少ないのが残念だなぁ。フォーラムのスレ主もしばらく来てないし
前スレに探し方を書いたけど無反応だったな。上のDMCを例に説明してみる
https://egg.5ch.net/test/read.cgi/software/1550328848/549

デバッガを開いて12001000(GS特権レジスタCSR)のReadでブレークポイントを設定すると0015B2CCで止まる

0015B2C8 lui at,0x1200
0015B2CC ld v0,0x1000(at)
0015B2D0 dsrl v0,0x0D
0015B2D4 andi v0,0x0001
0015B2D8 sltu v0,zero,v0
0015B2DC xori v0,0x0001
0015B2E0 sw v0,0xC4(s0)

0015B2D0~0015B2DCでv0レジスタにはCSRのビット13(表示中のフィールド)の状態を反転したものが入る
0015B2E0でv0をメモリに書き込むので次はそのアドレス(00753F64)をブレークポイントに設定して8を足す所を探す
手間を省くなら0015B2E0を sw zero,0xC4(s0) に変更(ただし、フリーズするソフトがあったりする)

patch=1,EE,0015B2E0,word,AE0000C4 //sw zero,0xC4(s0)

417名無しさん@お腹いっぱい。2019/08/01(木) 21:32:29.59ID:+8wNBUey0>>489>>606
表示バッファを変更するタイプはFBP(フレームバッファベースポインタ)の特定に悩んでたけど
GSdxを改造してFBPをコンソールに表示するようにした
うまく説明する自信が無いので自己流の手順だけで細かい説明は省略

エースコンバット04の場合
FBPを表示するGSdxでゲーム起動、メニュー選択画面にする
デバッガで12000090のWriteでブレークポイントを設定、書き込む値をチェック(Runをクリックしていくつあるか確認)

00261B84 ld v0,0x10(s0)
00261B88 sd v0,(a2)

書き込む値v0は948C(FBPは08C)のみ、コンソールに表示されたFBPは0なのでそれに変更してみる
v0は00261B84で0029F320から読み込んでいるのでそちらを8Cから00に書き換え
映像の縦が倍に伸びたので0029F318を03から01(FRAMEモードからFIELDモード)に書き換えてここは完了
タイトルデモやフライト画面ではv0が9070であとはほぼ同じ
ムービーやミッション説明は同じFBPになったのでそのままに

patch=1,EE,E0020003,extended,0029F318 //ムービーは0029F318が01なのでコード回避させる
patch=1,EE,0029F318,extended,00000001 //FRAMEモードからFIELDモードに変更
patch=1,EE,0029F320,extended,00000000 //FBP 8Cor70を00に書き換え


やる人いないだろうけど改造GSdxを上げておく
http://firestorage.jp/download/4c52209e7d78b2fbc0e1bb7873be51f457674929
同梱の_OFFSETの方はオフセットを変えるタイプをパッチなしでブレ除去する改造
(GSState.cppの1112行に o.y &= 0xfff7; を入れただけの雑な対応だけど)
ちなみにCutieからCRCハックを一部導入してるのでみんゴル4やみんテニが軽くなってる

パッチ共有

グラフィック設定の「Deinterlacing(F5)」から「None」を選択しておくこと。

EVER BLUE

タイトルID:59C8E0B8
patch=1,EE,00101b84,word,00000000
patch=1,EE,00101dec,word,00000000

インターレース解除

太鼓の達人7代目

タイトルID:F98F54AC
patch=1,EE,001B27C4,extended,00000000

天空断罪スケルターヘブン

タイトルID:C77BC872
patch=1,EE,0016966c,word,00000000

インターレース解除

最終更新:2022年06月12日 10:55