; 疑似平面3D 高速化ルーチン ; Program by Y.Kumagai, ClockRoom Software 1998 ; 共通設定 ;----------------------------------------------------------------- ComNo EQU [ESP+4] ;機能番号 Source EQU [ESP+8] ;ソースデータ先頭アドレス Result EQU [ESP+12] ;変換後データ先頭アドレス Maping EQU [ESP+16] ;マッピング参考データ先頭アドレス ;----------------------------------------------------------------- ; 機能一覧 ;----------------------------------------------------------------- ;00 疑似三次元フィールド ; ソースデータ先頭アドレス, 変換後データ先頭アドレス, ; マッピング参考データ先頭アドレス ;01 データ左右反転 ; ソースデータ先頭アドレス ;----------------------------------------------------------------- ; 機能管理 ;----------------------------------------------------------------- CMP ComNo,0 JZ Field: CMP ComNo,1 JZ LRTurn: JMP Return: ;----------------------------------------------------------------- ;▽▲▽ 疑似三次元フィールド ▽▲▽ Field: ; 初期設定 ;----------------------------------------------------------------- MOV EDI,0 ;カウンター(2) MOV ESI,0 ;カウンター(4) ;----------------------------------------------------------------- ; メインルーチン ;----------------------------------------------------------------- Fld_Main: ;▽ ソースデータ相対アドレス取得 MOV EAX,ESI ;EAX ← カウンター(4) ADD EAX,Maping ;マッピング参考データ絶対アドレス MOV EBX,[EAX] ;ソースデータ相対アドレス ;▽ ソースデータ内容取得 ADD EBX,Source ;ソースデータ絶対アドレス MOV DX,[EBX] ;ソースデータ内容 ;▽ 変換後データへの書き込み MOV EAX,EDI ;EAX ← カウンター(2) ADD EAX,Result ;変換後データ絶対アドレス MOV [EAX],DX ;変換後データ絶対アドレス ← ソースデータ内容 ;▽ 条件分岐 ADD EDI,2 ;カウンター(2) +2 ADD ESI,4 ;カウンター(4) +4 CMP ESI,76800 ;新カウンター(4) 比較 76800 JZ Return: ;↑ 結果同等 JMP Fld_Main: ;↑ 結果未満 ;----------------------------------------------------------------- ;▽▲▽ データ左右反転 ▽▲▽ LRTurn: ; 初期設定 ;----------------------------------------------------------------- MOV EDI,0 ;カウンター(XA) MOV ESI,318 ;カウンター(XB) MOV ECX,0 ;カウンター ;----------------------------------------------------------------- ; メインルーチン ;----------------------------------------------------------------- LRT_Main: ;▽ ソースデータ内容取得A MOV EAX,EDI ;EAX ← カウンター(XA) ADD EAX,ECX ;ソースデータ相対アドレス ADD EAX,Source ;ソースデータ絶対アドレス MOV BX,[EAX] ;ソースデータ内容A ;▽ ソースデータ内容取得B MOV EAX,ESI ;EAX ← カウンター(XB) ADD EAX,ECX ;ソースデータ相対アドレス ADD EAX,Source ;ソースデータ絶対アドレス MOV DX,[EAX] ;ソースデータ内容B ;▽ ソースデータ内容交換A MOV EAX,EDI ;EAX ← カウンター(XA) ADD EAX,ECX ;ソースデータ相対アドレス ADD EAX,Source ;ソースデータ絶対アドレス MOV [EAX],DX ;ソースデータ内容交換A ;▽ ソースデータ内容交換B MOV EAX,ESI ;EAX ← カウンター(XB) ADD EAX,ECX ;ソースデータ相対アドレス ADD EAX,Source ;ソースデータ絶対アドレス MOV [EAX],BX ;ソースデータ内容交換B ;▽ 条件分岐A ADD EDI,2 ;カウンター(XA) +1 SUB ESI,2 ;カウンター(XB) -1 CMP EDI,160 ;新カウンター(XA) 比較 160 JZ NextB: ;↑ 結果同等 JMP LRT_Main: ;↑ 結果未満 ;▽ 条件分岐B NextB: MOV EDI,0 ;カウンター(XA) ← 0 MOV ESI,318 ;カウンター(XB) ← 318 ADD ECX,320 ;カウンター +320 CMP ECX,38400 ;新カウンター 比較 38400 JZ Return: ;↑ 結果同等 JMP LRT_Main: ;↑ 結果未満 ;----------------------------------------------------------------- ; 終了 ;----------------------------------------------------------------- Return: RET ;-----------------------------------------------------------------