SSブログ

孤独へ向って突っ走れ (27) [  PC-98x1(補完計画)]

前回の続き。
下の分岐の③と④。

LODSB
CMP AL,6F
JB EFB0②
JZ EFB4(②)
CMP AL,80
JB EFEB
CMP AL,90
JB EFD7③
CMP AL,C0
JB EFB0②
CMP AL,D0
JB EFAD④
JZ EFCE①
JMP Short EFB0②




③条件分岐用のバイトが80Hから8FHまでの場合。この分岐先では、picファイル内のビットマップデータをグラフィックVRAMに書き込まない。その代わりに、グラフィックVRAMのオフセットDIに、それよりも1ないし数ラインだけ画面表示で上のデータをコピーする。

訂正
この後に私が長々と書いていたことは間違っていた。この③はスクロールに使われるのではない。縦方向の画像圧縮だった。私はこれがわかるまでPCの前に座り続けたので足が変だ。(前から記事に書いているが、私は座り続けると足を悪くする。)続きは数日後でないと書けないだろうが、きっと良い結果を出す。



EFD7: ;JBのラベルはここ
AND AL,0F
XOR AH,AH
サブルーチンEF80Hの冒頭で条件分岐に使ったALは、この分岐先では下位4ビットがパラメータ(00H - 0FH)になっている。

MOV BX,CS:[EF06]
CS:[EF06]には呼び出し元のサブルーチンEF08Hで50H(=80) が入れてある。これはグラフィックVRAMの1ラインのバイト数。

MUL BL
1ラインのバイト数に先ほどのパラメータを掛ける。

MOV BX,DI
SUB BX,AX
その結果をDIから引くと、グラフィックVRAMのDIよりも(パラメータの値)ライン分画面表示で上の場所になる。これをBXに入れる。

CALL F029
グラフィックVRAMのオフセットBXからオフセットDIへ指定横バイト数コピーする。
サブルーチンF029Hの解析結果はこの下に。

JMP Short EFA3




サブルーチンF029H
ES(=グラフィックVRAM)のオフセットBXから同じくES(=グラフィックVRAM)のオフセットDIへCS:[EF00](=指定横バイト数)バイトをコピーする。

PUSH DI
XCHG SI,BX

MOV CX,CS:[EF00]
REP MOVS Byte Ptr [DI],ES:[SI]
本来MOVSはDSからESへ転送するが、第2オペランドをESにオーバーライドしているのでESからESへの転送になる。

XCHG SI,BX
POP DI
RET




④条件分岐用のバイトがC0HからCFHまでの場合。この分岐先では、まず③とまったく同じコードでグラフィックVRAMのオフセットDIに、それよりも1ないし数ラインだけ画面表示で上のデータをコピーする。それに続けて、DIから指定オフセットの場所に指定の1バイトを書き込む。条件分岐用の1バイトの後は、(書き込む場所(DIからのオフセット))と(書き込むデータ1バイト)との組み合わせが続く。
私はこのルーチンの使い途が想像できないが、グラフィックVRAMの指定矩形領域内のすべてを更新するのでなく、既存データとの差分だけを書き込んでいるようだ。それだけならデータ量節約として理解できるが、その前に③の処理が付いている。

追記
わかった。やはり差分だった。縦方向の画像圧縮だった。



EFAD: ;JBのラベルはここ
JMP F038
JBのジャンプ先が遠すぎたのか、続けてJMPする。

F038: ;JMPのラベルはここ
AND AL,0F
XOR AH,AH
MOV BX,CS:[EF06]
MUL BL
MOV BX,DI
SUB BX,AX
CALL F029
グラフィックVRAMのオフセットDIに、それよりも1ないし数ラインだけ画面表示で上のデータをコピーする。ここまで③と同じ。

F04A: ;JNBのラベルはここ
LODSB
MOV BL,AL
MOV AH,AL
picファイルのオフセット9(初回)から1バイト取り出し、BLとAHに入れる。

AND BL,7F
XOR BH,BH
BL(picファイルのオフセット9(初回))の最上位ビットはデータ終了のフラグだが、これをマスクして0とし、その値をBXとする。

LODSB
MOV ES:[BX+DI],AL
picファイルのオフセット0AH(初回)から1バイト取り出し、グラフィックVRAMのオフセットBX+DIに書き込む。

SHL AH,1
JNB F04A
AH(picファイルのオフセット9(初回))の最上位ビットが0ならばF04AHへ戻って繰り返す。1ならばループから抜ける。

2C70:F05C E944FF JMP EFA3

コメント(0) 

コメント 0

コメントの受付は締め切りました