開発メモ(思索ログ): へっぽこプログラマは日々こんなこと考えながらエミュ開発してます(笑) 2002/5/1-2 むう、EmuZ-2000さんとこのオフ会報告読んでたら、MZ-2500エミュ開発中と公表 されてるやんけ。 開発中もなにも全然作業進んでないけど、秋にはデモを出すという花見のときの 与太話まで載ってるぢゃないか。 こりゃあまずい、ということで昨年夏以来実機がなくて頓挫してたのは全放棄、 一から新規開発開始。 名称もあやかってEmuZ-2500と仮称、デモを公開できるようになったらお許し頂こう。 取り敢えず目先の開発方針をば。 こーしてこまめにメモっておくと、後々いい事あるかもしれんし。 (後から見直して赤面するかも。でも絶対に削除しない方針でGo!) メモリ管理も別クラス化して、ROM関係もそっちで読み込ませようかしら。 CPUからのメモリアクセスも、みんなparent_VM->mem->ReadMemory(addr)にして。 すっきりはするが、流石に遅くなってしまうかな? →VMクラス内でやった方が速度的にはマシ? IRQの管理もVMクラスで面倒みる? ・・・取り敢えず、正しいクラスプログラミングの習作も兼ねてクラス化の方向で やってみよう。 Saturnエミュレータだって、徹底したクラス化しても速度出てるそうだし。 GCTRクラス内で仮想bmpもたせて、win32->vm->gctrとwin32側で作ったメイン画面の hwndを渡して画面を更新させようか。 タイミング管理やフレームスキップはwin32側でやる? オートフレームスキップはpiさんのxm7方式で・・・ んー、nesterの設計に影響されきっているなあ俺。 ずっと弄りつづけてきたから、エミュレータとはあのように設計するもんだという 風に固定観念化されてるのかもしれん。 z80sioは取り敢えず雛型だけ作って、機能はからっぽにしてお茶を濁そう。 z80pioはそこそこ作りこみ、ただstrb,rdyはプルアップされてN.Cだし、割り込みは タイプ3だけ対応でいいか。 いっそ初期化ログを採ってみて、それにあわせて決めうちにしようかなあ・・・ でもフリーソフトで妖しいことしてるソフトがあるかもしれないし、最初からしっかり 対応しておいた方が後々問題おきなくて楽かもしれんし。 cpuのコアは外から持ってくると。 で動き出したら最終的には一から新造して権利関係をクリアーに。 mame? emz700? maratコア? FinalBurn? emz700のが使いやすそう・・・だけど 未定義コマンド大丈夫か? mb8876コアはpiさんに許可いただいてることだし、アルゴリズムそのままクラス化 すればいいかな。 FM音源コアは・・・DLL叩ける仕組みだけつくって雛型用意して、あとは誰かに 押し付けよう(ぉ 自分で作るんだったらmameから拾うかciscさんにお願いするか・・・ emmとromfileはtree氏作の綾波(仮)仕様で最大16MBまでサポートしよう。 サイズはファイルサイズから取得、ファイルがなければ存在しないということで。 明日はz80pioの作りこみとz80sioの雛型。 でirqの調停関連・・・はvmでやらせればいいか。 2002/5/2-3 joystick追加。昔作ったwin32版system3のソースを流用。 アナログスティックで動作するかは不明、4方向スイッチ無効の場合、読み取り値は 「押してない」でいいのか? 外部ROM、一応実装したけど要るのか? ファイルが無ければ0xffで埋めて、romが無いフリをさせておく。 メモリコントローラ実装。PCG & 漢字ROMのために内部的には2KB単位でバンク 切り替えできるようにする。 vramのリードモディファイライトは、実装できる仕組みだけ用意しておいたけど 取り敢えず保留。 gctrのレジスタのうち、リードモディファイライト関連のはメモリコントローラで 処理したがすっきりするな。 従来の漢字ROM実装、これも要らないかも。mz-2000モード持ってないし。 左側、右側を各々偶数、奇数アドレスと仮定したけど合ってるのかな・・・ カレンダー実装。 読み込みはPC側のデータを使用するかわりに時刻変更は禁止。 bank 1への書き込みも対応したけど、実際のアラーム発動は未実装。 memory内、通信ROMにも対応してみる。 周辺機器サポートする予定ないからどうせ使えないけど。 z80sioも無視して、マウスだけiocsフックしてサポートするつもりだし。 むー面倒臭いの避けてたら、簡単にできるのが無くなってしもた(苦笑) 明日こそz80pioというかキーボード周り作ろう。 crtcはどうしよーかなー。 書き換わったとこだけ画面更新した方が速度は出るんだけど、それは 非常に大変そうだし。 xeviousみたく、スクロールしたらどうせ全画面フラッシュだしなあ。 パレット毎のプライオリティなんて使われてなさげな感じだし、暫定的に テキストとグラフィックの優先順位切り替えだけで妥協しとこっかな。 優先されない方が先にbmp描画、でその上に優先されるほうを描画。 別々に生成して合成するよりゃ速度出そうだし。 モード切替で忠実再現版も使えるようにしておいて、将来マシンがはやく なったらそっち使うとか。 ・・・動かしてみたら今でも十分速かったりして(苦笑 うんづの例もあるし。 キーボード実装して、テキストだけ表示できるようにして、cpuコアを乗せたら それだけでIPLの画面くらいはでそうだな。 fdcはまだだけど、romファイルからならブートもできるかも。 んー結構順調だなあ。 昔のホビージャパンのいつだったかの正月号に掲載されてた、隠れハイザックの 3日間モデリングを思い出すよ。 ただ楽に作れるとこばっか先にやってるってのもあるし。 ああ、mb8876・・・ああ、z80コア・・・どーしよ(苦 つーかディスクイメージの形式どーするよ、d88でええのか? あれ結構面倒っぽいし、ベタイメージでもいいんちゃうか? それだったらbasic-m25で簡単に吸出しプログラム書けるしなあ。 2002/5/3-4 i8253のクロックは31.25kHz。 CPUのクロックは6MHz。 よって192だけCPUを回すとi8253のカウンタが変動する。 ・・・で、インクリメント?デクリメント? i8253の資料を手に入れないとあかんねこりゃ。 I/Oコントローラへ行っているのはカウンタ1の出力・・・カウンタ2,3は 割り込みには関係しないのね。 FENIXの資料によるとIOCSでは20msおきに割り込みがかかるらしいけど、それで 決めうちにしてしまってもいいのかな? 取り敢えずチップメーカから資料をダウンロード 実装しないと動作しないのは判ってるんだけど、余りに面倒くさそう。 1チャンネル分だけクラス化して、それを上位クラスで3つ生成して、 桁上がりだけそっちで面倒みてやって・・・むう。 MLにはやく加入して、普通の使われ方を聞いて、それにあわせて実装しよ。 keyboard実装。 ポートAは割込み関係ないと思うので出力に固定&制御レジスタ無視。 ポートBはそれなりに作ってるけど結局はモード3&出力固定で決めうち。 一応読み込み時にはディレクションワードを気にしてはいるし、 割込みの判定もしてはいるんだけど・・・ま、多分無駄かな(笑) キーマトリックスは定義ファイルから読み込めるようにしておこう。 定義ファイルの作成は外部ツールにお任せということで・・GUIをVB以外で組むの 面倒くさいし(ぉぃ あかん、仕事でVBを使うようになってから、プログラマとして堕落してるぞ俺。 gcrtc、4096色パレットボードのレジスタのみ実装。 避けてても仕方がないし、まあぼちぼち少しずつ実装していきましょうか。 当面テキストVRAMだけ描画するんだったら、コンソールアプリでもいけるかな。 でもbmp生成して描画してwindowに表示して・・・というのもsystem3で経験あるし、 win32側のコードも流用できるしな。 カセットはどうしようか。 MZ-80/2000モードは切るんだからデータレコーダとして使用する必要は全然ないと 思うんだけど、音声再生くらいはできないとMoliceさん納得してくれないだろうし。 まあこの辺は動くようになってからの話だわな。 今は帰省先で開発してるんだけど、会社の寮に戻ったら各種ROMの吸出しをして 取り敢えず動かしてみたいなあ。 IPLのブート画面だけでも出たら、身内限定でスクリーンショット出そう(月末?) i8253、取り敢えず仮想マシンと直接やり取りする部分は終了。 カウンタは単体で別クラスにして、それを3つ生成することに。 設計してみると意外に簡単かも。 出力パルスのduty比なんか無視して立ち上がりしか見ないつもりだけど、音を生成 するとかの目的で使われる訳でもないし。 でカウンタ単体のクラスも完成、やってみるとやっぱり簡単だった。 カウント値設定直後の数パルスの挙動はかなりうそっぽいけど気にしない。 2002/5/4-5 cpuを1フレーム分だけ駆動する処理を実装。 それにあわせてvblank関係も。 この辺も殆どnesterのと同じだったり・・・ってどのエミュレータでも結局は 同じようにしか書きようがないとは思うんだけど。 timerもそうだけど、実機と同じクロックで駆動すること前提で値を決めうち してるから、クロックアップしようとすると面倒くさいことになるかも。 z80コア開発開始。 といっても、http://www.din.or.jp/~boya/usr/java/z80/z80.html" にあるjavaの クラスをc++に書き直してるだけ。 他にも実績あるコアは存在するけど、今後自分でメンテナンスすることを考えると 構造が素直な方がありがたいの。 cpuコア、一通り完成。 仮想マシン側とのインターフェースも実装済み。 後は未定義命令の実装をしなければ。IOCSでおもいっきり使用してるらしいし。 変換&最適化中にエンバグしてる可能性大なので、そっちもチェックせんとな。 それにしてもだいぶ部品が揃ってきたなあ。 CRTC側で部分的に画面生成する機能つけて、win32側を適当にでっちあげれば、 割と直ぐにでも動きそうな気がする。 あー外見たら夜が明けてるよ(苦笑) 現在5:30、明日から会社だし、昼まで寝て今日は大掃除でもしよう。 開発の続きは晩飯後にでも。 ソース弄るのは一先ずおいて、実機のROM吸出しでもしましょうかね。 2002/5/5 大掃除が済んだので作業開始。 まずROMの吸出し作業から。 BASICのPOKEではメモリマップの変更ができないようなので、マシン語で マップ変更&1バイト取得をするプログラムを組んで読み取り。 転送はシリアルポートより文字列で、受信はTeraTermPROを使用。 Z80のマシン語は殆ど初めてなんだけど、この程度ならハンドアセンブルで十分。 ・・・あー。漢字ROMはまた別個のバンク切り替えがあったのよね。面倒くさ。 こっちがIPLの転送プログラム。 100 clear &HC000 110 poke &HC000,&HF3,&H3E,&H7,&HD3,&HB4,&H3E,0,&HD3,&HB5 120 poke &HC009,&H3A,0,0,&H32,&H0,&HD0,&HFB,&HC9 130 init "com1:9600,N81" 140 open "O",#1,"com1:" 150 for B=&H34 to &H37 160 poke &HC006,B 170 for H=&HE0 to &HFF 180 for L=&H0 to &HFF 190 poke &HC00A,L,H 200 call &HC000 210 print #1,right$(hex$(peek(&HD000)+256),2) 220 next L 230 print (B-&H34)*32+H-&HE0+1;"/ 128" 240 next H 250 next B 260 close #1 でこっちが漢字ROMのやつ。 第1・第2水準あわせて256KBもあるから流石に転送には時間が掛かる。 100 clear &HC000 110 poke &HC000,&HF3,&H3E,&H7,&HD3,&HB4,&H3E,&H39,&HD3,&HB5 120 poke &HC009,&H3E,0,&HD3,&HCF 130 poke &HC00D,&H3A,0,0,&H32,&H0,&HD0,&HFB,&HC9 140 init "com1:9600,N81" 150 open "O",#1,"com1:" 160 for B=&H80 to &HFF 170 poke &HC00A,B 180 for H=&HE0 to &HE7 190 for L=&H0 to &HFF 200 poke &HC00E,L,H 210 call &HC000 220 print #1,right$(hex$(peek(&HD000)+256),2) 230 next L 240 print (B-&H80)*8+H-&HE0+1;"/ 1024" 250 next H 260 next B 270 close #1 ########## ## ## ## ## ############################ ## ## ## ## ############################## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ############################ ## ######## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ######## ## ## ## ## ########## ## ## ## ## ## ## ############################ #### ## ## 漢字ROMもこんな感じでちゃんと吸えている模様。よしよし。 あーえと、勿論フォントはシャープの著作物ですけど、日記の中で64バイトくらい 引用するのはお目溢しください>シャープ様 そろそろ起動に漕ぎ着けられそうなので、MZ-MLに参加申請。 速攻で登録作業をして頂けたようで有難うございます>楯岡様 で最初のご挨拶をぽちぽち書いていたら。 ブーン、ヂヂヂヂ、ボン! もくもくもくもく・・・モニタが突然吹っ飛んだ(T-T) 何でやねん。 昨年夏に調達していた98モニタと変換アダプタ用の部品がまだ手元に残って いたので、MZ-FAQを参考にして変換アダプタを作成。 一応映ってるけど、明るさの調整がうまく利かず。 黒が全然黒じゃない、画面まっしろ白助。 で何となく気が向いたのでネットぐるぐる。 結構640x400で24KHzいける液晶モニタってあるのね。 最近全然お金使ってないし、善良な国民として景気回復のためにも個人消費を しなければ、ということでシャープのLL-T1520-Bをネット通販することに。 これで映らなかったら、それはそれでAT機で使うから別にいいや。 値段高いから、これまで吹っ飛ばすというのは勘弁な。 液晶吹っ飛ぶのかしらんけど。 取り敢えずIPLと漢字ROMが吸い出せたので今日は作業終わり。明日から会社なの。 休日出勤したのが2日ほど残ってる筈だから、それを使って水曜あたりにでも 代休突っ込んで、その日に何とかブート画面くらいは出そう。 2002/5/6-7 win32側をでっちあげて、全ファイルが一応コンパイルできるように修正。 記述上の問題でかなり梃子摺るも、一応通った模様。 うーむ、まともにファイルを分割してコーディングするのも初めてだ(ぉぃ 今まではファイル分割しても、結局includeして1ファイルになるようにしてた からなあ。 2002/5/7-8 crtcの描画機能をぼちぼち実装中。 640x400、テキスト80x25限定でテキストのみ描画できるところまで実装完了。 とは言えまだブートできるとこまではいかないので、BASIC-M25が起動した 直後のテキストVRAMとPCGを吸い出して、それを描画させて試験してみる。 うん、いい感じ。 折角だから、この時点でのスクリーンショットをmz-mailing list限定で 公開してみよう。 2002/5/8-9 昨日公開した謎画像は一部筋でややうけな模様。なにより。 取り敢えずCPUが回りだした。メモリコントローラも機能している模様。 しかしIPLの起動画面は出ず。 IPL内のコードを実行しているのは確かなんだけど・・・ 最初はCPUの未定義命令を疑ってswitchの最後にdefaultを入れて監視してみたけど、 ここまでは特に使用してないらしい。 I/Oのログを取って見てると8255のポートを数回叩いて沈黙してしまっている模様。 out 0xe3, 0x82 out 0xe2, 0x58 out 0xe3, 0x03 要は8255のA,B,Cポートを出、入、出にして、Cポートのb1をL->Hにしているらしい。 で8255のCポートのb1は負理論でリセット。うーむなるほど、これか。 カセットのサポートは当面するつもりはなかったけど、これとb4のIPLリセットの 機能だけは実装しないといけなさげだね。 で実装してみる。 今度は8255を叩いたところでリセットは掛かるんだけど、今度は全くI/Oにアクセス してこなくなってしまった。 どうもJP命令で無限ループに入ってしまった模様。 EIもされてないし、NMIでも待ってるのかしら。 とは言え回路図を見るとNMIはI/Oスロットにいっており、本体だけで発生させる ような仕組みにはなっていないらしいし。 んー悩んでいても仕方がないし、明日は出来るところから実装していこう。 MZ-MailingListより情報。 peek@, poke@なんて便利な命令があったらしい。 むう、実機のこと全然知らない弊害がこんなところに(苦笑) 2002/5/9-10 どうもCPUのレジスタ周りが虫食ってて、"OUT (C),A"でI/Oのポートを正確に叩けて いなかったらしい。javaからc++にコンバートする際にエンバグしてた。 で修正すると今度はtimerのところで引っかかってるらしい。 out 0xe7, 0x34; カウンタ1 50Hz out 0xe4, 0x71; out 0xe4, 0x02; out 0xe7, 0x74; カウンタ2 10Hz out 0xe5, 0x05; out 0xe5, 0x00; out 0xe7, 0xb4; カウンタ3 ?? out 0xe5, 0x00; out 0xe5, 0x00; カウンタ3のカウント値を0x0000としているのが謎。 8253の資料を読む限りだと、0x0000の場合は0x10000として扱うとあるのだが。 でカウンタ3の値が0になるのを待ってループに突入していたらしい。 0になるの、6553.5秒後だぞ? 8253の挙動は後で実機で調べるとして、取り合えず強制的にreturn 0;にして 次に進む。 今度はhblank,vblankの様子を見ながら、タイマからの割込み(20msおき?)で キーボードの様子を見ながら、crtcの初期設定をして、画面クリアして、 クリア完了を待ち続けて・・・あ、0xbdの実装してないや。 取り合えずこれも仮にreturn 0;でキャンセル。 blankを廃止してcrtcに押し付けないと駄目っぽいなあ。 キーボードを見に行ってるんだけど、0xe8へのrowアドレスの出力が何故か 0xef・・・どうも0xe8を読んで前回のアドレスを取得してるらしい。 これは簡単なのでさくっと実装。 まだ画面が出ない。むー。 でふと思い立ってBを押しながら起動してみると・・・来たー! 無事メモリチェックがスタート、ログが表示された(大歓喜) という訳で、初めてMZが自力で描画した画面がでました。 キーボードもちゃんと実装できているようですね。 まだ40x25モードも8x8フォントの表示も実装していないから画面は変だけど。 記念にキャプチャしてアップしよう。 まだ時間も早いのでテキスト回りを徹底的に実装する。 画面サイズの変更、フォントサイズの変更、フォントの背景色の処理関連を実装。 これでメモリチェック画面が正しくでるようになったかな。 あかん、もう夜3時や。画面キャプチャしてアップしたらええ加減寝よう。 しかし、普通にブートするにはまだまだ時間が掛かりそうやね。 2002/5/10-11 CPUのタイミング調整処理を追加。 処理速度に余裕がなければ描画はスキップ、但し10フレームスキップしたら 強制的に描画する。 最大スキップ数はいずれ設定可能にするつもり。 テキスト描画部にブリンクの処理を追加。 仮想マシンの時間とは非同期に、実時間にあわせて1Hzで点滅するように。 手抜きだけどまあ取り合えずは良しとしよう。 カンガルーポケット内のスイッチ読み込みのため、サウンド部を追加。 実際に音源を実装するのは多分最後かと。 スイッチの値はディスプレイ400ライン、MZ-2500モードに固定。 (ディスプレイは将来的には200ラインとの切り替えにも対応するかも) でディスプレイ設定を400ラインに変えたところ、メモリチェック画面が変。 フォントが重なって表示されてしまう。 実機の画面を眺める限りでは、どうも320x200モードでもテキスト画面だけは 320x400で表示されている、ように見える。 一応それっぽく修正はしたけど、これであってるかどうかは不明。 今日は新人歓迎宴会で酒が頭にはいってしまってるので作業はここまで。 酒が入ったときの自分は天才になってしまい、酔いが覚めて凡人に戻ったとき 天才の仕事が理解できなくなってしまうので(苦笑) 明日から土日なので、FDCを実装する予定。 2002/5/11-12 起きたら既に昼、顔を洗ってFDCの実装を開始。 最初はPIさんのXM7のソースをそのまま流用するつもりだったが、あらためて 見直しても長すぎてよく理解できない(←アホ) ヘッダが動くのに時間が掛かったり、セクタ間にギャップがあったりなど、 細かいところまで実装されていてるんだけど、そこまで細かく再現する必要は 今のところ感じてはいない。本当はいるんだろうけど。 で仕方ないので自分でコーディング。 とは言え、MB8877/8876の資料がある訳でもなし。 一応トランジスタ技術スペシャルのコピーと、68000システムの製作全科の下巻が 手元にあるので、これを参考にする。 多分直ぐには動かないだろうけど、レジスタや細かいフラグの挙動なんかは PIさんのソースを教科書にさせて頂こう。 しかし68000システムの製作全科って本当に凄まじい本だよなあと読む度に感動。 いつかこれのエミュレータも作ってみたい。 自分で半田付けするのは大変だけど、エミュレータでならば割と簡単に追体験 できるのではないだろうか? この本で育った人も多いと思うし、結構需要はあると思う。 方針: データはベタイメージを前提に。 MB8877として実装して、I/Oの読み込みでデータバスを反転させる。 Type1コマンドは実行直後に完了。 Type2,3コマンドも実行直後にヘッダの移動完了。 命令実行中はdrq立ちっぱなし、どれだけ待たされてもlost dataしない。 Type4コマンドは実装しない。どうせIRQは繋がってないし。 IDフィールドは (C,H,R,N) = (track,side,sector,1)に固定。 将来D88に対応した場合、(C,H,R,N)はそちらから取得する。 crcの生成部はPIさんのソースを流用させて頂く。 データアドレスマークの書き込み&ステータスへの反映も対応する。 これもベタイメージからは取得できないので、マウント直後は全セクタで データマークとして初期化する。 MB8877/8876でないとマークが読み込めないので、これに対応するのであれば 実機で吸い出して貰うことになるかと。 ライトプロテクトは、読み込んだイメージがプロテクトされているかどうかで 判定する。プロテクトが掛かってない場合はアンマウント時に上書き保存。 実装が済んだ(軽く書いているが、6時間以上は掛かっている)ので試験。 ステータスの挙動を変えたところ、"IPL is loading Sys Loader"が出るところ までは来たが、そこで止まってしまう。 FDCのログを取ってみると、どうもセクターレジスタを読み込んでインクリメント して出力するうちに、遂に17を出力して止まってしまっているらしい。 トラックの終了判定ができていないのであれば、インデックスホールの検出が できていないのか? と疑ってみたが、IPLを逆アセンブルしてみると、~17を FDCに出力してからそれが~17であればループを抜けるようになっていた。 セクターレジスタに17が書き込まれることそれ自体は問題ないらしい。 Type1コマンドが、実行直後に完了してしまうのが拙いのかと思い、ステータスを 1度読みに行くまでbusyのままにしてみる。 結局改善はされなかったが、まあ問題もなさそうなのでそのままに。 CPUが未定義命令のログを吐いているので部分的に実装。 ・・・? 未定義命令にすらない命令を実行してるぞ? なんか変なところにジャンプして暴走してないか? この処理が、実行開始時のマッピングを設定して、実行開始アドレスにジャンプ する処理部分。 LF880: LD HL,MF030 ;F880 2130F0 LD B,07H ;F883 0607 <07H> LD D,00H ;F885 1600 <00H> LF887: LD E,(HL) ;F887 5E CALL LF900 ;F888 CD00F9 INC HL ;F88B 23 INC D ;F88C 14 DJNZ LF887 ;F88D 10F8 LD HL,(MF018) ;F88F 2A18F0 JP (HL) ;F892 E9 LF900: LD C,0B4H ;F900 0EB4 DI ;F902 F3 OUT (C),D ;F903 ED51 INC C ;F905 0C OUT (C),E ;F906 ED59 EI ;F908 FB RET ;F909 C9 どうも正しくファイルを読み込めていないため、実行開始アドレスのジャンプ先で 暴走してしまっている模様。 もう朝7時越してるし、一度寝てから考えよう。 2002/5/12-13 起きてから、IPLブート時にメモリへコードを転送する処理を解析するが、 どうみても正常に転送されているっぽい。 ジャンプ先が00 00 00 00...になってしまっているが、でも間違いない。 原因判明。単に吸い出したデータをバイナリに変換する際のミス。 改行コードまでバイナリに変換してた(←間抜け) そのため実行時のメモリマップが狂ってしまっていたらしい。 (当然それ以外も狂っているんだけど) 修正後、Sys Loaderに処理が移行するようにはなった。 しかし "IPL is loading Sys Loader" が無限ループしてしまうように。 トラックリードなりセクタ連続リードなりが誤作動しているのではと疑ったが、 トラック0への移動と普通のセクターリードしかしていないっぽい。 取り敢えず懸案のカウンタレジスタに0000Hを書き込んだ際の挙動を修正。 カウンタを読みに行くときにカウンタレジスタを叩くとカウントが止まってしまう という不具合を修正した。 ログを取ってみると、3つのカウンタで正常に桁上がりしている模様。 これでカウンタ3に強制的に0を返さなくてもIPLが起動するようになったが、 やはり無限ループは直らず。 まあSys Loaderをロードして処理を渡すところまでは動いているんだから、 2段ブートをしないソフトであれば起動できるかも。 余り一箇所に嵌っていると進まないので、ブート画面の表示がおかしい問題を先に。 表示開始位置がずれるのは、単に0xF4のレジスタ番号が0x80-0x8Fの場合の処理を 間違えていただけ。ついでに0x80-0x8F指定時のパレット読み込みも実装。 また今までカラム指定はスクリーンサイズが320x200か否かで行っていたが、資料を よくよく見てみると0xE8のZ80PIOのポートのところで指定していたらしい。 ただ資料によるとb5=0で80桁、b5=1で40桁とあるが、どうもこれは逆っぽい。 これで起動デバイスの選択画面もメモリチェック画面も、ともに正しく表示される ようになった。まだ64色表示は対応してないけど、これはまあ先でもいいだろう。 昨日今日と休日にも関わらず余り作業が進まなかったが、エラーの原因究明に大半の 時間を費やしてしまってたから、まあ仕方が無いか。 しかしフロッピーのバイナリ変換ミスってたのに気付かず、5時間以上も無駄に してしまったのは余りに痛かった。むう。 1段階目までのフロッピーからの読み込みは出来るようになったっぽいし、明日は グラフィック回りを実装して、なにかゲームを起動できないか試してみよう。 寝る前に、ゲーム関連のディスクを吸い出してみる。 ・・・Excite Bikeもムーンチャイルドも、devi$で吸い出せない、罠。 やっぱいずれはD88に移行せなあかんのかなあ。セクタ長も可変にして。 FDC側の対応はそんなに掛からないんだけど。 ついでにCPUの使用率が高いのが気になるので、処理速度に余裕がないときでも フレーム毎にSleep(1);を強制的に入れる。 1フレームあたり18msしかないので、これはこれで結構きついのだが。 結果、デバッグ構成で平均55%、リリース構成で平均45%まで減少。 Pentium3 1.2GHzでこれではちと重過ぎるかもしれんが、ほっといてもユーザの PC環境は速くなっていくもんだ、気にしないでおこう。 2002/5/13-14 いい加減crtcクラスのソースが巨大化してきたため、I/Oのインタフェース、 テキスト画面描画部、グラフィック画面描画部にソースを分ける。 クラス自体は相変わらず1つのままだけど、見通しは多少良くなった。 グラフィック描画の実装に入る前に、まずvramのメモリマップの問題から。 各色のプレーンが、標準VRAMと拡張VRAMとアドレスが連続していない。 これではアドレスシフトによるスクロールの実装のときに処理が面倒になる。 これについてはwin32上でのメモリ空間を連続させることで解決。 メモリマップレジスタ側で割り当てるアドレスを変えてやればすむ話。 ついでに今まで先送りにしてきたリードモディファイライトを実装。 vramを握っているmemoryがやればよいとも思ったが、レジスタの関係もあるので 結局crtc内でやることに。 メモリもそうだけど、1サイクル毎にクラス間でデータやりとりしているのが どの程度悪影響を与えているかが非常に気になるところ。 それにしても、画面クリアーも一瞬で終わってしまっていいものだろうか。 一応実装完了。 念のため試験してみるが、やはりSys Loaderは起動せず。 幾らなんでもリードモディファイライトが原因で起動しなかったという事は ないだろうから予想通りなんだけど。 でもこれで、CG画面は描画されないにせよ、CPU側から見ればVRAMの挙動は完全に 実装できたのではないかと。 描画部もできてないし、そもそもまだ何のソフトも起動していないから、試験 できないのがいささか辛い。 どうせ実験できないなら、ということで今日もFDCの調査。 どうもドライブ2から起動しても、Sys Loaderはドライブ1を読みにいこうと しているっぽい・・・? ではドライブ1で読み込ませても、Sys Loaderに処理が移ったと思ったらまた IPL is loading Sys Loaderに逆戻り。 まあFDCが怪しいのは確かだから、PIさんのコードを参考に、フラグの挙動を 色々と修正してみる。しかし相変わらず起動せず。 関係しそうなところを逆アセンブルしてみても、ステータスのb7,b0しか見てない んだから、フラグの挙動は余り関係なにのかもしれない。 いい加減いやになったので、ディスク内のブート情報を見てディスクをメモリに 読み込み、開始アドレスにジャンプするという、強制ブート機能を実装。 しかしSys Loader内部で行われると思しきレジスタ群の初期がができていないため、 一瞬BASICの起動画面らしきものが見えたと思ったらそのままフリーズ。 画面右下に時計が表示されてるので、一応クロックの実装は正常に動作している ことは確認できたけど・・・ もう明け方4時なので、寝る。 2002/5/14 FDCアクセスのログを取ってみると、IPLがSys Loaderを読み込むまでのアクセスと、 Sys Loaderに処理が移行してからのアクセスが全く同じ。 ん?もしかしてディスクに読みにいく前に、Sys Loaderが何か異常を検出して、 IPLに出戻りしてるんじゃないか? ということで一旦fdcを弄るのは中止。 Sys Loaderに移行してから再度fdcにアクセスするまでの間のI/Oのログを 取ってみる。・・・どこが悪いのか判らん(汗 ただ、どうもromfileにはアクセスを仕掛けてきてるらしく、256回、つまり 1セクタ分だけ0xa9のポートを読み込んでいる。 という訳で、吸い出したディスクイメージをそのままromfileとして読み込ませて みると・・・IPL is loading Sys Loader. 取り敢えずromfileからでもSys Loaderが起動できることは確認できた。 2002/5/15 どうも直ぐに起動できる雰囲気ではないので、地道に実装と修正に励む事にする。 まず8253の修正。 新しいカウンタ値を書き込んでから、その値で実際にカウントを始めるまでの 遅延を実装する。 CPUの割り込み調停を修正。 相当致命的な実装ミスだったから、これで起動するかと期待するが、まだまだ。 ついでに将来の拡張デバイス対応に備えて対応する割込み源の数を8に増やす。 カレンダのバンク1の諸機能を実装。 閏年カウンタおよび12H/24Hの切り替えに対応。アラーム出力(1Hz, 16Hz)を サウンドから読み込めるようにしたのと、アラーム割り込みを実装。 2002/5/18- 突然残業が山ほど入ることになってちと作業中断してました。 週末はCPUコアの虫出しをすることに。 虫も殺さぬプログラマではあかん。 まずmode0,1割込みに対応。どうせ使わんとは思うけど、まあ念のため。 但しmode0についてはRSTにしか対応していない。