DBCSパーサーのバグ取りに苦戦 [DOS]

西洋版MS-DOSマウスドライバーをDOS/Vへ移植しようとアセンブリプログラミングしていて、コア部分はほぼ完成しつつある。だけど、一つ重大なバグが残っていて、それがなかなか原因を探るのに苦労している。

それは文字がDBCS(2バイト文字セット、全角文字)かどうかを識別するパーサー。テキスト上でカーソルを反転させるとき、DBCSなら反転する範囲をSBCS(1バイト文字セット、半角文字)より2倍の幅にする必要がある。

シフトJISエンコーディングのテキストからある文字がSBCSかDBCSかを調べるには、文字の第1バイトが81-9FhまたはE0-FChの範囲内にあるかどうかを調べればいい。ところが、シフトJISにはDBCSの第2バイトにもこの範囲を含むという致命的な欠点がある。途中のとあるバイトが文字の第1バイトか第2バイトかを見分けるには、前の文字も調べる必要があり、最悪、テキストの先頭までさかのぼらなければならない。

例えば、DBCSは1字目がラテン文字で、2字目は数字またはラテン文字からなる、2文字で表現し、それ以外をSBCSと仮定する。123A1B1C1とあったとき、23だけを見れば3がSBCSであることは確定する。2がSBCSかどうかは前の文字を確認する必要があり、この場合は1なので、そこで初めて2がSBCSだと確定する。では、先からA1を抜き出した時はどうか。これだけ見ればDBCSなのだが、確定するには前の文字を見る必要がある。AA-1というDBCSとSBCSの組み合わせの可能性もあるからだ。今回の場合は3A1であり、3がSBCSだろうがDBCSの2字目だろうが、A1がDBCSであることに違いないので確定する。問題はABCDEA1と続いた場合だ。こうなるとA1AがDBCSの第1バイトか第2バイトかを調べるには、先頭までさかのぼる必要がある。AB-CD-E[A]-1となるか、BC-DE-[A]1となるか、境界が分からないからだ。

こういう面倒な部分もあるが、単純に2バイトがDBCSかどうかを判断するプログラムはアセンブリコードでもそこまで複雑ではない。

; in: al = char, out: CF = 0 (SBCS), 1 (DBCS)
ischardbcs proc
    push    es
    push    di
    push    bx
    les     di,[dbcstblptr]    ;set ES:DI for DBCS lead-byte table
    cld
@@looknexttbl:
    mov     bx,es:[di]
    or      bh,bl
    jz      @@issbcs
    scasb   ;JPN: 81,9F,E0,FC,0,0h  KOR:81,BF,0,0h  CHT:81,FC,0,0h
    jb      @@issbcs
    scasb
    ja      @@looknexttbl
;@@isdbcs:
    stc
    jmp     @@endscan
@@issbcs:
    clc
@@endscan:
    pop     bx
    pop     di
    pop     es
    ret
ischardbcs endp

そのはずだが、問題はこのコードをドライバーに組み込んで実行したとき、エミュレーター(86Box)では期待通りの結果が出るのに対し、実機では違う結果が出ることだ。実機でドライバーコードをデバッグするのは結構手間がかかる。原因はまだ判明していない。範囲は絞られたので、もう少しで分かると良いのだが。現状は見当がつかない。

DOS/Vで英語版DOS用マウスドライバーが使えない理由

Image: DOS/Vで英語版DOS用マウスドライバーが使えない理由
今、DOS/V用マウスドライバーを開発していて欧米のDOSと違う部分にかなり苦労させられているけど、分かってきたこともあるのでまとめておく。DOS/Vの日本語環境では英語版やDOS用互換マウスドライバーの一部が動作しないことがある。IBM DOSバージョンJ5.02/VのDOSSHELLでマイクロソフト製、ロジテック製などいくつかのマウスドライバーを調べた結果は次の通り。
本文を読む…

24ビットカラーと32ビットカラーの違い [Win9x/Me]

Image: 24ビットカラーと32ビットカラーの違い [Win9x/Me]
最近、Win98で画面のプロパティを見ていて、「色」にある「True Color(24 ビット)」と「True Color(32 ビット)」は何が違うのか気になって調べた(昔も同じく調べたことがあったはずだけど、忘れた)。検索すると上位にこんな間違った回答も挙がっているので混乱する。
本文を読む…

250427 Oblivionのリマスターが出た!

Image: 250427 Oblivionのリマスターが出た!

「オブリビオン」はリマスターで何が変わったのか。主な変更点を紹介 - 4Gamer.net

つい4日前に突如発表・発売されたばかりという The Elder Scrolls IV: Oblivion Remaster。前からプレイしたいとは思っていたけど、PS2(PS3?)クオリティのCGでゲームのモチベが続くか微妙、でも気になると思っていたので、リマスターが出たことは嬉しい。GWはこれに時間をつぶすのもありだな。

NPCやフォロワーのクセのある動きやAI、会話の時のカメラズームアップはそのまま再現されているんだろうか。

SB AWE64 ゲームポートのMIDI外部出力を使う

ケーブル箱を整理していたら古いJOYSTICK-MIDI分岐ケーブルを見つけて、これは使い方をメモっておかないと忘れそうだなと思ったので、書いておく。AWE64サウンドカードでMIDIを再生する場合、SC-55などの外部MIDI音源を使うかカード内蔵MIDIシンセを使うかで方法が大きく異なる。
本文を読む…

DOS用万能ISA PnPサウンドドライバー UNISOUND

Image: DOS用万能ISA PnPサウンドドライバー UNISOUND
Sound Blaster AWE 32(PnP), AWE 64をDOSで使う方法は既に下の記事で紹介している通り。この正規の方法はフロッピーディスク1枚に収まらない大きなサイズのドライバーファイルを持ってきてインストールしなければならず、CTCMでのリソース設定も含めて、非常にだるい。同じことを考えた海外DOSユーザーが、Sound BlasterのみならずGUSやESSなどの様々なDOS時代のサウンドカードに対応したドライバーを開発し、2020年にフリーウェアとして公開した。
本文を読む…

250426 AVG『キモかわE!』(NDS) [4]サリエル ルート

Image: 250426 AVG『キモかわE!』(NDS) [4]サリエル ルート
ニンテンドーDS用AVG『キモかわE!』(2009年 / 5pb.)をプレイ。昨日、納屋を整理していたらこのゲームをまだクリアしていないことを何故か思い出し、別作業の片手間でプレイしていました。CGやエンディングのコンプ目指すつもりはないけど、ストーリーの要になりそうなサリエルを攻略することに決定。
本文を読む…

250424 2025年春のノベルゲー

18歳未満の方の閲覧はご遠慮下さい。最近は何かを享受することよりも自分で何かを創作することに熱心になっていたので、ゲームプレイはあんまり進んでいません。買う本数も少なくなったように思います。この現象は私特有だと思うけど、第三者目線でも新作は年々少なくなっている気がする。Visa/Masterのクレカ決済が使えなくなってAmazonでも非表示になった影響は少なからずあるかな。
本文を読む…

Sound Blaster AE-9のDACを分解する

Image: Sound Blaster AE-9のDACを分解する
Sound Blaster AE-9のDACがうんともすんとも言わなくなったので、分解してケーブルを交換しようとしましたが、解決しませんでした。たぶん、ケーブルを抜き差ししたときにショートして電源回路か制御チップが死んだんじゃないかと思っているけど、分からん。DACを分解するには両面テープで接着されている前面パネルと脚を外し、その裏にあるビスを外す必要があります。分解した痕跡を残さないようにするのはなかなか難しいです。上の写真ではビス固定位置を知る前だったので破壊しました。
本文を読む…