240720 PS/55エミュ製作 [39]OS/2は起動するけど表示の修正が必要

Image: 240720 PS/55エミュ製作 [39]OS/2は起動するけど表示の修正が必要
Windows 3.0は8色モードと256色モードの識別方法を変えたら色が正しく表示されるようになった。反転表示も問題ないのでエミュレーションの精度はDOSBoxを上回っている。上のスクリーンショットでは横長い黒線が一本残っているが、画面の差分更新プログラムを修正すれば直るだろう。
本文を読む…

240712 応急手当の講習を受ける

Image: 240712 応急手当の講習を受ける

施設管理者たるものは、AEDや心肺蘇生をためらいなくできるようにならねばならない、ということで、会社の命で救命講習を受けてきた。

心肺蘇生をやるのは、数年前に酸素欠乏・硫化水素危険作業主任者の講習を受けたとき以来だった。あなたが公園にいたとき、オフィスにいたとき、商業施設にいたとき、倒れている人を見かけた、といったシナリオで繰り返しやったことで、私はそこそこ自信を付けたと思う。

ブルアカの期間イベで心肺蘇生の話が出てきて、私にとってはホットな話題だった。さすがに人工呼吸は、現在はCOVIDの影響で厚生労働省が「人工呼吸は行わなくても良い」と指導しているらしく、講習でも人工呼吸は演技だけで終わった。前回の講習がCOVID前だったので、その時は模型相手に人工呼吸もやったけど、意外に肺活量を求められるから、心臓マッサージの合間にあれをやるのは結構大変だったのを思い出す。

240712 PS/55エミュ製作 [37]ESDIアダプター内蔵ハードディスク

Image: 240712 PS/55エミュ製作 [37]ESDIアダプター内蔵ハードディスク

PCemのビデオメモリーアドレスの仕組みが理解できなくて、グラフィックモードの開発が進まない。DOSBoxでもだいぶ苦労した部分なので、ここを突破するのは時間が掛かりそう。そういうわけで、エミュレーション精度を上げるために別の開発に取り組んでいた。

PS/55モデル5551-S,TはESDIハードディスク(リファレンスディスケットでは「アダプター内蔵ハード・ディスクII」と表示される)を内蔵しているんだけど、これをエミュレーションするのはそんなに難しくなかった。

ESDIコントローラー単体のMicroChannelアダプターとの違いは、ディスクBIOSのROMがない(システム・ボード側のROMで認識する)ことと、POS IDが違うこと以外はほとんど同じ。ただ、ESDI Fixed Disk Controllerのコードを流用すると、POSTでエラー10482(ハード・ディスク・エラー)が出る。BIOSを解析すると、デバイス7(アダプター)が対象のGet Device Configurationコマンドに対してセクターバッファーサイズを返す必要があって、少しコードを書く必要があった。こりゃBIOS ROMを逆アセンブルしないと分からないな。

240709 N64はレトロゲー [Niji]

最近、石神とサロメの配信をよく見てるので、石神とサロメの星のカービィSDXコラボや、MelocoとのときメモGSコラボがやってて、推し同士がコラボしてるの少し嬉しかった。N64がレトロゲーに入るかどうかって10年くらい前から議論されているけども、今の年数は30年を迎えつつあるから、それを考えたら立派なレトロゲーだな。

夏野菜議論、野菜全推しでTier表が崩壊してるんよ。食べ物の議論は奥が深いな…

240709 PS/55エミュ製作 [36]ROMのメモリー・エンコーディングを修正

DOS J4.0が起動しない問題は、DOSの動作中にメモリーの割り当て方法を設定するI/Oポート・レジスターが書き換えられて、ディスプレイ・アダプターの属性バッファーが配置されていたE0000-E0FFFhがシステムメモリー (RAM) に再割り当てされていたことが原因だった。

メモリー・エンコーディング・レジスター 1(16進 00E1)
Bit | Function
----|-----------------
7   | -Card 2 EN 2
6   | -Card 2 EN 1
5   | -Card 1 EN 2
4   | -Card 1 EN 1
3   | -ENSPLIT
2   | -640
1   | ROMEN
0   | Reserved

ビット1:このビットは、アドレス16進000E0000~000FFFFFがどのように割り当てられるかを決定します。このビットを1にセットすると、ROMがイネーブルされ、読み出しアクセス・アドレスがROMに割り当てられ、書き込みアクセス・アドレスはRAMに割り当てられます。このビットを0にセットすると、ROMがディセーブルされ、読み出しアドレスがRAMに割り当てられます。ROMがディセーブルされている間、書き込みアドレスはディセーブルされています。(注意:このビットを1にセットすると、システムの性能が低下します。ROMへのアクセスが8ビットであり、サイクルが長いためです。)

POSTはメモリー・エンコーディング・レジスターのビット1 (ROMEN) に1をセットして、BIOS ROMのデータをRAMにコピーし終わると、0をセットしてROMを無効にする。これは、注意書きにあるとおり、BIOSをRAMに再配置した方がレスポンスが改善するからだろう。しかし、まさかDOSの動作中にこのビットが書き換えられているとは思わなかった。

これで文字モードの実装はほぼ終わったので、あとはAPA(グラフィック)モードの実装だ。本当に苦労するのはここからかもな。

240707 PS/55エミュ製作 [35]DOS J4.0だけおかしくなる文字モード

Image: 240707 PS/55エミュ製作 [35]DOS J4.0だけおかしくなる文字モード

モノクロモニターの判別問題は、I/Oポート3E1hインデックス3のビット7がVGAでのSwitch Sense Bitと同じ役割を果たしていて、これはDOSVAXの実装と同じだった。問題はここではなく、属性コントローラーへのI/Oポートのデータ出力処理にバグがあって、これを直したらカラーパレットが正しく初期化されるようになって、問題が解決した。

属性コントローラーのI/Oポートにバイト単位で書き込むときはフリップフロップでインデックスとデータが交互に書き込まれるんだけど、ワード単位で書き込むときに、低位8ビットがインデックスで高位8ビットがデータに書き込まれるはずが、逆になっていた。

とても時間を掛けながらも、文字モードはほぼ実用レベルで表示できるようになった。しかし、今ぶち当たっている問題は、DOS K3.3やJ5.0は正しく起動するのに、DOS J4.0だけ文字モードが正しく表示されない。導入プログラムで使われる画面モード03hは正しく表示される。画面処理のBIOSがROMではなくDOSにあるのは知っているが、なんでDOSのバージョンによって挙動が違うんだ。

Image: DOS J4.04

240704 PS/55エミュ製作 [34]VGAのモノクロモニター判別方法を調べる

Image: 240704 PS/55エミュ製作 [34]VGAのモノクロモニター判別方法を調べる
前回からもう1週間か。つい昨日までDOSすら起動できなかった。まず、日本語DOS用のスキャンコードの実装は若干手間が掛かるくらいで、難しいところはなかった。次に、PS/2ではメモリアドレスE0000-FFFFFhまでの128KBがBIOSとして使用されているのだが、PS/55のディスプレイ・アダプターはE0000-E0FFFhの1KBをテキスト画面のバッファーとして使用する。
本文を読む…

240629 Niji GTA [Niji]

GTAオンラインの配信、メチャクチャ楽しかった。序盤は石神の配信を見てて、中盤からMelocoを中心に見ていたけども、ロールプレイで色んな役割やチームができてリアルタイムで交流していく様子を見るのは、人それぞれの多様な過ごし方、生活を垣間見ているようで面白かった。マイクラもコラボの定番だったけど、マイクラではここまで多様性やリアルタイムな動きは出ない。今回の場合は、警察とギャング、半グレ、裏社会といた対立と、救護班や整備班といったサポート役、店の運営といった役回り。ひすぴの記者(ゲーム内でニュースを発信)という立ち回りも見ていて面白い。

ライバーも見る側も寝る間を惜しんで体力を削っていたと思うが、それ以上に「楽しいから見たい」が勝っていたことに違いない。

それぞれが同時に動くから、各視点を比較していくのも楽しみ。最近YouTubeのチャットが重くてリアタイではあまり複窓できなかったけど、切り抜きがバンバン上がっているので、そこで比較動画も上がっていくことでしょう。

240629 PS/55エミュ製作 [33]リファレンスディスケットの起動に成功

Image: 240629 PS/55エミュ製作 [33]リファレンスディスケットの起動に成功
PCemで2HDフォーマットのフロッピーからブートすると途中でDOSのロードが止まる問題の続き。PCemはDOSBoxほどのデバッグ機能がないから、自分で割り込み発生時のレジスタをダンプしたり、特定アドレス上のメモリーへの変更を検出するコードを書かなければならなかった。BIOSを逆アセンブルしながらPS/2の色んなモデルのTechnical ReferenceやFDCのデータシートを見比べること約1週間弱。
本文を読む…

240624 PS/55エミュ製作 [32]FDDの読み出しバグ

2HDフォーマットのフロッピーからブートすると途中でDOSのロードが止まる問題について。

いまだメモリダンプの解析方法を十分理解できていなかったのでどこで止まったのか判明していなかったけど、割り込みなどをログに残すようにして調べた結果、無効な命令を実行しようとしてハングしていたことが分かった。しかし、これだけの情報では根本的な原因は分からないのが厄介だ。ジャンプ命令で飛んできた先に正しいプログラムデータがないか、途中で他のプログラムじゃないデータが間違って上書きされたことが原因なのだろうが、なぜそれが起きたのかを突き止めないといけない。

IO.SYSのロードは完了できているようなので、前回の記事でも書いたように、DOS内の初期化ルーチンで15セクター/トラック(2HD)が9セクター/トラック(2DD)の読み取りになってしまっていることは明らかなようだ。しかし、DOS 4.0のソースコード(数か月前に公式でオープンソース化された)を読むと、この動作は想定の範囲内のようにも読める。しかし、HDDのような論理セクターでのアクセスではないから、このままでは通用しないはず。

MS-DOS/v4.0/src/BIOS/MSINIT.ASM at main · microsoft/MS-DOS · GitHub

;J.K. 10/9/86 If CMOS is bad, it gives ES,AX,BX,CX,DH,DI=0. CY=0.
;In this case, we are going to put bogus informations to BDS table.
;We are going to set CH=39,CL=9,DH=1 to avoid divide overflow when
;they are calculated at the later time.  This is just for the Diagnostic
;Diskette which need MSBIO,MSDOS to boot up before it sets CMOS.
;This should only happen with drive B.
	CMP	CH,0			; if ch=0, then cl,dh=0 too.
	JNE	PFR_OK
	MOV	CH,39			; ROM gave wrong info.
	MOV	CL,9			; Let's default to 360K.
	MOV	DH,1
PFR_OK:
	INC	DH			; MAKE NUMBER OF HEADS 1-BASED
	INC	CH			; MAKE NUMBER OF CYLINDERS 1-BASED
	MOV	NUM_HEADS,DH	      ; SAVE PARMS RETURNED BY ROM
	AND	CL,00111111B		; EXTRACT SECTORS/TRACK
	MOV	SEC_TRK,CL
	MOV	NUM_CYLN,CH	      ; ASSUME LESS THAN 256 CYLINDERS!!

240619 PS/55エミュ製作 [31]PCemのビルド環境構築からさっそくつまづく

Windows上にPCemの開発環境を構築するところからいきなり大変だった。結局、最新のdevブランチじゃなくてreleaseブランチのPCem V17のソースコードからMINGW環境でビルドした。これに相当な時間が掛かった。

PS/55モデル5550-S/T/Vのエミュレーション環境を作りたいので、ベースとしたのはPS/2 model 70, 80あたり。ROMファイルのパス名だけ変更してソースコードはそのまま流用すれば使えるかと思ったら、そんな簡単じゃなかった。

エミュレーターを起動すると225というエラーコードが出る。IBM PC and PS/2 - Error codesによれば、”225 Some of your memory may be defective or not fast enough for your machine.“とのこと。これの原因はすぐ思い付いた。システム装置に装着されているメモリーの認識方法が model 70や80と違って、PS/55 5550-S/T/VではメモリーカードのIDを読み取って容量を認識するので、これをエミュレーションする必要があった。

この問題をパスしてメモリーカウントが表示されたことに喜んだのも束の間、今度は160, 603, 161, 163とエラーコードが4つ表示された。F1キーで処理を続行することはできるが、画面が消去された後、リファレンスディスケットを含めフロッピーからブートできずに途中で止まる。

160は”System Board ID not recognized.“。残りはQ35436: IBM PC, XT, AT, and PS/2 Error Codes | KnowledgeBase Archiveによれば、次のように書かれている。

1xx     System Board Errors
---------------------------
  161  System Options Error - (Run SETUP) Battery failure
  163  Time and date not set - (Run SETUP

6xx    Floppy Disk Drive Errors
--------------------------------
  603  Disk size error

まず、システムボードIDというのはMicroChannelコントローラーから取得できるシステムボードのPOS IDのこと。IDはリファレンスディスケットの情報から知ることができたので、あとはPOS IDとして返すだけであって、既存のコードを流用できたからエミュレーションするのは難しくなかった。

問題はDisk size errorの方。何が原因なのか思い当たる節がない。

症状をもっと詳しく調べてみると、2DDフォーマットのDOSは起動できることが分かった。しかし、2HDフォーマットのディスクは起動ファイルの読み込み中に止まってしまう。

Seek drive=0 track=0 sectors=18 sector_size=512 sides=2
Disk seeked to track 0
 Read FDC 03F0 86 E000:39A7 58467725 20 58467725 rate=0  0 Status Register A
 Write FDC 03F5 08 E000:39D3 58467739 20 58467739 rate=0  0 CMD:Sense interrupt
Sense interrupt status 0
[pcem55] FDC Read: 3F5 20 E000:3914 
[pcem55] FDC Read: 3F5 00 E000:3914 
 Write FDC 03F5 E6 E000:37FB 58506741 20 58506741 rate=0  0 CMD:Read Data
 Write FDC 03F3 88 E000:3451 58506979 20 58506979 rate=0  0
Read a sector track=0 head=0 sector=1 eot=18 [drive=0 rate=0]
Read data 1
 Read FDC 03F0 86 E000:39A7 58674943 20 58674943 rate=0  1 Status Register A
[pcem55] FDC Read: 3F0 86 E000:39A7 
[pcem55] FDC Read: 3F5 00 E000:3914 
[pcem55] FDC Read: 3F5 00 E000:3914 
[pcem55] FDC Read: 3F5 00 E000:3914 
[pcem55] FDC Read: 3F5 00 E000:3914 
[pcem55] FDC Read: 3F5 00 E000:3914 
[pcem55] FDC Read: 3F5 02 E000:3914 
[pcem55] FDC Read: 3F5 02 E000:3914 
 Read FDC 03F3 80 E000:35C2 58675463 20 58675463 rate=0  1 Drive Status Register
 Write FDC 03F5 03 E000:37FB 58676118 20 58676118 rate=0  0 CMD:Specify
Write DMA 000C 46 E000:34F7
Write DMA 000B 46 E000:34FB
Write DMA 0004 00 E000:3517
Write DMA 0004 F8 E000:351D
Write DMA 0005 FF E000:3546
Write DMA 0005 01 E000:354C
Write DMA 000A 02 E000:3551
 Read FDC 03F1 C1 E000:3772 58676427 20 58676427 rate=0  0 Status Register B
 Write FDC 03F2 1C E000:3792 58676440 20 58676440 rate=0  0 Digital Output Register
 Write FDC 03F5 E6 E000:37FB 58676476 20 58676476 rate=0  0 CMD:Read Data
 Write FDC 03F3 88 E000:3451 58676718 20 58676718 rate=0  0
Read a sector track=0 head=0 sector=2 eot=9 [drive=0 rate=0]
 Read FDC 03F0 96 E000:39A7 59599542 20 59599542 rate=0  1 Status Register A
[pcem55] FDC Read: 3F0 96 E000:39A7 
[pcem55] FDC Read: 3F5 00 E000:3914 
[pcem55] FDC Read: 3F5 00 E000:3914 
[pcem55] FDC Read: 3F5 00 E000:3914 
[pcem55] FDC Read: 3F5 04 E000:3914 
[pcem55] FDC Read: 3F5 00 E000:3914 
[pcem55] FDC Read: 3F5 01 E000:3914 
[pcem55] FDC Read: 3F5 02 E000:3914 

途中で15セクター/トラック(2HD)が9セクター/トラック(2DD)の読み取りになってしまっている。なぜ?リファレンスディスケットから起動しないことにはCMOSの設定を変更できないから、あと問題がありそうなのはI/Oポートに未実装があるくらいしか考えられないが。