■ [98/12/26] |
x86系チップだと、奇数アドレスからのメモリアクセスは遅い。 メモリからBYTE型の変数に1バイトづつ取り出すよりも、INT型で4バイト分 取り出しておいてからシフトとマスクで分解した方が速い。はみ出たりすると危険だけど。 今のところ、処理速度でネックになっているのは256色パレットとして内部管理 している仮想画面をディスプレイに表示するところだから、 あまり気にする必要はなさそう。
■ [98/12/25] |
ちなみに256色環境で最も良いパフォーマンスが得られるのであった。
■ [98/12/20] |
そ、そっか、PC-9801にはScroll LockキーとPauseキーがないのか(--;)
おかしい、まじめにサウンドデバイスのクローズ処理を行なうと
プロセスの残骸が残る。どうやらwaveOutReset()が怪しく思えるけど、
コールバック関数の実装が間違っているのだろうか?
ちょっと無謀と思いつつもwaveOutResetをキーワードにgooで検索をかけてみると
一件だけひっかかった
みたい・・・と思ったらいつも日記を読んでいるHarakawaさんのページだった。
DirectSoundにしないとだめかな〜。
■ [98/12/19] |
うちの自作マシンのNT4.0とSoundBlaster AWE64Goldは非常に相性が悪い。
悪いなんてもんじゃなくってろくに動かない。とにかく音を出しているとなんの前触れも
なくフリーズ(Macintosh用語?)する。ブルーバックにもならない。
だからサウンドのサポートが遅れているんです、というわけじゃないけども、
無意識にやる気を削がれているのかもしれない。
そんな環境でも、とりあえず音が出た!ような気がする。 ビットレートやタイミングがよく分かっていないので、正しいかどうかは謎だけど。
101キーボードでは「@/゛」キーと「;+/れ」キーがないので、これの対応をする予定。
暫定的にファンクションキーでいいかな?
うちのMacintoshは101キーボードだから101キーボードユーザの気持ちはよくわかる。
Relase3を公開したけど、サウンド出力のボリューム設定を忘れたことに気がつく。 あ、クローズ処理もしてなかった。
■ [98/12/14] |
PC-6001mk2SRをばらしてみたけど、FDCらしきものはなく8255がFDDコネクタ
近辺にあるところをみると、8255で直接ドライブを制御していたか、
ドライブユニットに制御用のチップがくっついていたことになるみたいだ。
手っ取り早いのは、3.5inchFDD搭載のPC-9801を中古で一台買ってきて
アセンブラとBIOSとFDCを駆使する方法。X68K+3.5inchFDDっていうのもありか。
次点としては、実機でFDDを読み取ってCMT/JoyポートからAT機に持っていくっていう方法。
どっちも手におえなさそうなので、とりあえず頭の片隅に置いておくことにする。
■ [98/12/13] |
AT機のFDDで1Dメディアのディスクが読めるかどうか?という疑問がPC-6001emu掲示板に 書かれていたのでコッソリ(?)と調べてみた。Webの情報よりも、日本語で書かれた書籍の 方が参考になりそうだったから本屋をはしごしてDOS/V・アセンブラ・BIOS・MS-DOSをキーワードに 端から本を立ち読み。(買えよ)
でも、AT機ってDOSからWindowsに移行した段階で日本でブームが起きたようなもんだから、 MS-DOS用ソフト開発またはATハードウェアを詳しく扱っている本ってあまりないんだよね。 秋葉原やお茶の水の大きな本屋に行けばあるんだけど。 それにDOS用ソフトを開発するにはMASMを使うのが一般的です、なんて書いてあっても MASM売ってる店ってほとんどないし。
で、INT 25hで論理アクセスによるリードができるってことはわかったし、INT 13hっていうのも あるらしいけど、もしかしたらMS-DOSフォーマットじゃないとだめかもしれないし、 おそらくFDDドライブが対応していないんじゃないか?と思われる。
PC-9801の場合は2Dのリードができると本に書いてあった。さすがにPC-9801の書籍はまだまだ たくさんあるからこっちの方が便利かな。でもPC-6001でフォーマットされたメディアが 読み込めるかわからないし、3.5inchFDD搭載のPC-9801は持っていないからお手上げ。
そもそもオレ、x86系アセンブラはあまり使えないのであった。
■ [98/11/24] |
JOY STICK周りは予想通りっぽいので暫定的にソースを書き換えてTINY XEVIOUSを起動。
おぉっ、今までこの画面
ということは、ゲームポートに接続したJOY-STICKをエミュレータで 使用することが早い段階で可能になるか、も。
■ [98/11/23] |
瞬殺されてしまうTINY XEVIOUSを何とかするため久しぶりにプログラムの書き換えを始めたが、 失敗に終わる。
原因がよくわかっていない挙動として勝手にスペースが押される/矢印キーが効かないというのがある。
これの理由はさっぱりだし、ソフトによっては動くからソフトの解析をしないといけないのかもしれない。
とにかく実機がどんなことをしているかわかっていないと進まないので調べる。
キーボードによるSTICK, STRIG状態は、
CALL 1061H RET
によってAreg.に取り出すことが出来る。Areg.の状態は、bit7 bit0 |SPACE0|←|→|↓|↑|STOP|SHIFT|
で、押されたビットが1になる。1061Hの処理は、SUB CPUにコマンド6を送信する。このコマンドを 受け取ったSUB CPUは割り込みを発生させて割り込みベクトルから0F40Hを実行開始する。 ここでのルーチンはSUB CPUからデータを受信して0FECAHに結果を書き込む。SUB CPUから データを受信したかどうかは、0FECAHの値が変化したかどうかで判断する。 この割り込みが終了すると、1061Hでの割り込み待ちルーチンは復帰し、 0FECAHに書き込まれた値をAreg.に書き込むことになる。
キーボード部分はこんな風になっていて、X11版のソースを見るとサポートされている。
タイミング的に取り逃す可能性はあるけども、それが原因で勝手に動く・動かないの
理由にはならないと思うんだけどなぁ。
もしかしたら、不完全エミュレートのJOY STICKが悪さをしているのかもしれないので周辺を解析開始。
JOY-STICKポート(他にも接続できる機器はあるけど)の周辺回路図を書いてみる。
単純にAY-3-8910のI/Oポートを見ているんじゃなくって切り替えとかしてるのかぁ。
■ [98/11/16] |
テ☆リスの タイトル画面が変なんです、という報告を頂いたのでさっそくテストしてみた。 結果は以下の通りで問題ないように見える、ふむ。
デタラメな速さだけど、ホントの数字
ホント〜に1秒間に222回も画面を書き換えているんだろうか? それだとWindowsが画面を描画中でも平気でVRAMを書き換えていることになるから フリッカー(だっけ?・・・ティアリングらしい[12/3])が発生するんじゃないか?と思ったんだけども、 このFPS値はZ80が描画処理を何回指示したかをカウントしているだけで 実際にWindowsが画面を描画する回数とは異なることに気がついた。
まぁ多分、そんなことはどっちでもよくって適度な速さに調整しなさいよってことかも。
■ [98/11/15] |
割り込みで別の問題があった。
タイマ割り込み処理中にCMT割り込みが発生した場合、一般的に割り込み処理中は
別の割込み禁止状態なのでCMT割り込みが無視されることになる。エミュレータでは
CMT割り込み自体は発生してSUB CPUに「データ送ってよ」とお願いした後、
割り込みアドレスを設定するのだが、この時タイマ割り込み中で割り込み禁止状態
だからこの割り込みアドレスは読み捨てられてしまう。SUB CPUはデータをセット
するのだが、取り込み処理は通らなくなりSUB CPUはデータ送信待機のまま、
割り込みルーチンはデータ受信待機のままで見事なデッドロック状態となる。
実機では、おそらくINT割り込みをエッジではなくレベルで検出するようなので、
SUB CPUがZ80が割り込みを受け付けてくれるまでは
割り込み信号を送出し続けるのではないかと思うのだが・・・。
それでもサラトマは動かない。
ふとタイマ割り込みメニューを追加して動作中に許可・不許可を変更できるように
してみた。をや?タイマを切った状態でサラトマを起動してからタイマを動かすと
ハングアップするし。
ということは、ロードミスではないってことか?
■ [98/11/14] |
保留状態になっていたWindows95で特殊キーが効かない問題の対応。 結局無難といえばそれまでのごくごく普通の対処方法で解決・・・したつもりが またもや新しい問題が発生。PC-6001初代機モードでSHIFT+PAGEを押すと“ヘ”が4つほど 出てくる・・・。
タイマ割り込みとCMT割り込み頻度を実機と同スピードに調整した。基準クロックが 未調整だから、高速なマシンだと20MHz/90fpsとかいうとんでもない速度で 動いちゃったりしてカーソルが心拍数300くらいでバクバク点滅する。
90fpsといえば、今までは秒間60fにするために約16ms単位で 描画更新を行なっていたんだけども手元にあるマシン上のWindowsタイマは 10ms単位での精度が限界だと判明した。だから1msの位は切り上げて20ms単位で しか更新していないことになる。実際にテストした結果も50fpsが上限になっていた。
ここらで一度公開してもいいような気もするけど、サウンド非対応・・・と書かれるのが
怖かったり。
をや?タイマ割り込みを有効にするとサラトマが動かない・・・。
■ [98/11/9] |
SR-ROMでの起動テスト・・・失敗。
テスト用にイメージファイルを作成してみる。その前に実機で動作するか 確認してるんだけども、テープの読み込みに失敗するものが多いなぁ。
ヴォルガードだって起動するぜっ!
でも暴走したぜっ!(グッサリ)
■ [98/11/8] |
X11版のAY-3-8910エミュレート部分をざっと眺めてからとりあえず最終的な
波形データをファイルに書き出すようにしてどんな形式なのかを確認してみた。
データをコンバートしたりして確認すると、モノラル8bit符号なし 8000HzのPCMデータっぽい。
ここでの問題点は二つ。Windows95は8bitサンプリングは再生できるけど、それが
符号“あり”なのか“なし”なのかがわからない。そもそも符号ありとなしってなにが
違うのかがよくわからないのでWebで調べる。あぁ、これが実家だったらOh!Xの
バックナンバーでも引っ張り出せはすぐにわかることなのになぁと思いつつ、国内の
サイトを探索・・・ない。調べ方が悪いのかなぁ、役に立ちそうな資料がまったく
みつからなかった。国内だとこんなものかなぁ(ちょっと愚痴っぽい)。
国外で探す前に、部屋にあったC-Magazine 10/98に記事を発見(偶然にしては出来すぎで怖い)。
Windowsでは、8ビットのサンプルは符号なし(0-255)で収められています。このサンプルを 符号あり(-128〜127)へ変換するには符号ビットを反転させます。ようするに、^0x80すればいいってことか。でも、今回の場合はそのままWindows95へ 流し込んでいいってことになる。
次の問題は周波数の違い。オリジナル(fMSX)のソースをみると、8000Hz以外には 対応していないようなコメントが記述されている。 Windows95では、最低11.025kHzからの3種類にしか対応していないから変換する 必要がある。で、試しにソースの周波数定義部分を変えてみるとなんだか変で、 基準クロックをいじったみたいに再生速度が速くなったような感じになる。
8000Hzのデータを11.025kHzに変換し直すっていうのが楽そうな方法ではあるけど、 あまりかっこよくない。
■ [98/11/7] |
X11版 Ver0.5の移植開始・・・一時間くらいでとりあえずオシマイ。ただ、使用するROM の選択部分はダイアログにするとか、色々と面倒な部分が残ってるんだよね。 う、X11版のROM選択部分が#ifdef DEBUGで括ってあるのがちょっと気になる。(気のせい?)
今回のバージョンアップで一番の変更点はSR対応なんだけども、Mk2SRのROM-BASICでテスト したところ、起動しなかった。ちゃんとしたROMを準備してから再テストした方がいいかな。
■ [98/11/6] |
windows95でCtrlその他のキーが効かないことを確認したので対処にあたったんだけど、
これがまた非常に厄介。『どうしてこう、Windowsは・・・』と思うのはいつものことだし、
最近は逆に行儀の悪いことをしようとするから悩むんだと思うようになっている。
行儀の悪いことっていうのは、Windowsのユーザインタフェースガイドラインに沿っていない
操作方法を実現しようとしたときのことで、iP6forWinの場合、本来のショートカット操作や
メニューアクティブ化を行なうAltをGRAPHに割り当てるようなこと。
だから、たとえばかなキーは右のCtrlに割り当てるつもりだけど、やっぱりScrollLock
あたりにした方がトグル動作が正しくかなと思う。ただ、なんだか技術的・プログラム的に
難しいから逃げたみたいでちょっと引っかかるものがあるんだけど、
変なとことでこだわってもしょうがない気もする。
“続黄金の墓”のスクリーンショットで色がおかしいかな?と思った件([98/10/26])、 あれで正しいんです、というメールを頂きました。
PC-6001(初代)のCPUクロックは約4MHzなのですが、CRTCが画面の描画を行なっている 時間はCPUが停止しているので秒あたりのクロック数は下がるという件、実際は1.6MHz程度の 速度でしか動作していないとのメールを頂きました。
ありがとうございます。
■ [98/11/1] |
久々に本屋でWindows関連の本を購入してサウンド出力の方法を考える。 会社でも自宅でもサウンドカードにスピーカーをつないでないから音にはとっても無頓着。
実装方法に関しては大体の推測がついていたからあとはAPIの使い方がちょっと わからないくらいだった。DirectSoundでの実装方法は分かっていたんだけど。 というわけで書籍を参考に低レベルAPIでのwavファイル再生プログラムを作成開始、 本を読んでから実装(バグ取り)までが2時間くらいで、初チャレンジ物にしては めずらしく効率よく完成。バグは参考にした書籍の実装が甘い(えらそ〜)だけだったし。
続けてエミュレータでのPSG部分を斜め読みを始めたんだけど、これをWindowsに
持ってくるのもこれまた一苦労な気がする。Windowsの場合、OSがマルチスレッドを
サポートしても結局のところ協調型イベント駆動のプログラムにしないといけないから
この変換作業が悩みどころなんだよなぁ。プレステにでも移植した方が
よっぽど簡単な気がするよ、トホホ。
そんな感じだからサウンドのサポートには早くて一週間はかかりそう。
キーボード部分を担当しているSUB CPU(8049)についてちょっと調べてみた。 なるほど、EP-ROMを内部に持っているのか。PC-6001もそのタイプなのかなぁ?
■ [98/10/31] |
いいかげん、タイマ割り込みをなんとかしたい。したいんだけども問題が
いくつかある(と思っている・・・というのも推測だから)。
1つ目は、X11版のタイマ割り込みがOSのタイマー割り込みを使用していること。
WindowsにもOSのタイマ割り込みはあるんだけども精度が非常に悪いだけじゃなくって
OSの負荷が高いときはあとになってまとめて届いたりする。
だから、プログラム上で時間を判断して割り込みをかける必要があるんだけど、
今のエミュレータの作りが、
で、ここら辺に手をつけ始めると、オリジナルのコードから大きく離れちゃって 次のバージョンで差分を取るのが面倒だったりする。だから最後の最後のつもりだったん だけど、それでもさっさとタイマーはサポートしたいところ。
とりあえず、CPUを約4MHzで動作させてZ80部分を別スレッドにした。これで
画面の更新が遅れてもCPUはシャキシャキ動くことになるし、実際そうなったんだけども、
ただ、cloadでハングするようになってしまった。おそらく多重割り込みが
発生してるんじゃなかろか?
あと、2ms単位でタイマ割り込みをかけるようにしても、なかなかカーソルが
点滅してくれない。時間の誤差とばらつきが大きいけど、かなりの回数で割り込みは
かかっているんだけどな・・・というところで今日はおしまい。
ちなみに、実機のPC-6001(初代)は4MHzで動作するとしても、画面の表示期間中は バスをCRTCに占有されるから実際の動作はかなり遅いことになる。デュアルポート VRAMじゃないから、CRTCがVRAMにアクセスしているときはCPUほぼ停止状態になる。うーむ。 さらに、このCRTCアクセスはBUSREQで制御されるからINT割り込みとはちょっと違う。 どちらも初代機の話でMk2以降は・・・どうなんだろう?
■ [98/10/28] |
試しにDOOR DOOR[ENIX]のテープイメージを作成し、ロードさせてみた。 テープイメージのサイズは32KBytesなのに読み込みにはPentium 166MHzで2時間15分も かかったりする。その結果は以下参照。
カーソルキーで操作できないのでゲームにはならず。
同じことをPentiumII 300MHzで実行したらテープの読み込みに2分とかからなかったよ。
■ [98/10/27] |
X11版iP6のNew Versionが公開されたのでそれに合わせてWindows版の作成。
結果、以前のバージョンに比べて体感速度40%ダウンした。
でも、スピード(最適化)やMS-Windowsらしさに関しては一番最後に調整するって決めている。
だから今は目をつぶることにする。
そういえば、テープのロードが可能になったのでその部分をテストしてみた。 ・・・こりゃすげー。昨日のcloadもどきなんて話にならないくらいの出来。 なんだか、単に移植してるだけの自分が恥ずかしいなぁと思ったり。
■ [98/10/26] |
はて、実際どの程度プログラムが動くんだろうかという疑問、それから 『早くアレとかアレが動いているところをみたいなぁ』という欲求を一時的に解決すべく、 cload命令をシミュレートしてみた。cloadのみなのでマシン語とか特殊なフォーマットの テープは読み込めないけど、いろいろ試行錯誤した結果はごらんのと〜り。
ちょっぴりシアワセ気分かも。本来はこのあとマシン語の読み込みが始まるんだけどね。 ちなみに2つ目の画面は“続黄金の墓”の色調整部分。れれっ?緑の色が全然違う・・・。 もしかして、バ・・・(不幸かも〜)。
■ [98/10/25] |
さりげなくエミュレータバイナリファイルを置いたり。
逆アセンブルしたBASIC-ROM(ある意味OSか?)を読んでみる。PC-Tecknowがあるおかげで 結構サクサク読み進めることができたけど、エミュレートしなければならないことって かなりたくさんあるような感じがしてきた。SUB-CPUを分離してエミュレートした方が いいのかな。
タイマ割り込みは約2msec固定らしいから、2m sec分のCPU cycle毎に割り込みが発生した ことにしたらいいのかな・・・とか考え巡らす。それからキーボード割り込みはタイマーとは 別に割り込みが発生するからこれも分離しないといけないのかな。
なんとなくコントロールキーの処理部分を始めたらあっさり完成。昨日面倒だなぁと 思っていたのはいったい・・・。
■ [98/10/24] |
久々にiP6forWinのプログラム。問題になっていたキーボード部分のインプリメントを 開始して、コントロールキーとグラフィックキー以外は完成。(それって完成とはいわないか) でも、キーリピート時の挙動がなぁ・・・。原因の切り分けができていない。とりあえず 保留して先に進むことにする。
■ [98/10/23] |
モトローラさんから、MC6847の仕様書をもらった。
■ [98/10/15] |
PC6001にあってMk2にない機能ってのがあるのか〜。
キーボードの処理部分についてiP6 X11の作者様から返事のメールを頂いた。 一応、ちゃんとした形で実装したいので中途半端な作り込みはしたくないからしばらくは 手をつけないで資料集め。でも、忘れちゃうんだよな。(--;)
■ [98/10/13] |
BSD X11版 iP6の作者様からMS-Windows版公開許可のメールを頂いた。
とりあえずこんな感じ?
マイコンBASICマガジンに過去掲載されたプログラムを何らかの形で
共有できないか?と思い、メールで聞いてみたところ、著作権は電波新聞社および
作者にあるため、作者本人のWebページかマイコンBASICマガジンの
Webページにしか置けないでしょう、とのお返事。
ちなみに、過去のプログラムはすべて保存(FD?TAPE?)してあるので、
ベーマガWebページに公開するのは労力的な問題だけとのこと。
■ [98/10/11] |
PC6001初代機のROMを使用して移植したプログラムで動作確認をしてみた。
パレットの操作に誤りがあって画面が真っ黒だったくらいで、How Many Pages ?の
表示(^^)。Windowsのビットマップ系は左基点だから上下が反転していて、
激ショックだけども、なんか笑える。
How Many...から先に進まないのは、キーボードイベントを組み込んでいないから。
もうちょっとがんばって、逆さ画面を修正した。マッピングモードの変更で
できるかなぁと思ったんだけど甘かったらしい。
あと、PC-6001の内部キーコードがよくわからないからキーボードイベントは
とりあえず保留する。テストでリターンキーだけは押せるようにしたから、
先に進むことだけは確認できたんだけど、押しっぱなしにするとデッドロックが
発生しているような感じがするよ・・・。
あと、割り込み設定をしてもカーソルが表示されないのがナゾ。
■ [98/10/10] |
BSD X11版のiP6をWindowsNTに移植してみた。元々のキーボードとサウンド、 それからタイマー部分はペンディングだけども。まぁ、それ以前にROMセットが ないから動いてるんだかわからないや。CPUの動作速度の調整が必要だと 思うんだけど、このあたり、どうするんだろう?
■ [98/10/9] |
マイコンベーシックマガジンのWebページには、毎号掲載のプログラムが置いてある。 利用規定や著作権に関する記述が一切ないんだけど、古いベーマガのプログラムを Webページに置くことも不可能ではないかもしれないなぁ。 暇があったら聞いてみようっと。
■ [98/10/8] |
CMT経由でWindowsでROMを読み込む方法だが、1Kbyteあたり、2Byteほどの
データ化け&欠落が発生する。今のところ、単純な加算SUMしか行なっていないので
データの入れ替えが起きている可能性だってありうる。
ROMのサイズは全部で16KByte(フォントを除く)程度だから、すべてを目と手で検査しても
なんとかなるサイズではあるが・・・。
そもそも、PC-6001からの出力がおかしいのか、Windows上での解析結果が異常なのかの
切り分けもできていないし。
プリンタポート経由でがんばってみるかなぁ。
ちょっとばらして配線を追ってみたけど、めんどっちぃ。
■ [98/10/7] |
某氏からPC-6001本体とデータレコーダPC-DR311を購入。
カセット出力(CMT)をMDに接続してAT互換機(Windows95)でWAVEデータとして保存。
そのデータをX88000 Webページで公開されているプログラムを使用し、Windows上で
データを読み取ってみた。
しかし、各バイトデータ間に意味不明なマークが挿入されている。PC-8801では
テープデータの形式が異なるのだろうか?相互間に読み取りはできるはずなのだが。
とりあえず、T88フォーマットを解析して読みやすい形式に変更するための
プログラムを作成した。
問題はいかにしてPC6001のROM(16Kbytes)をWindows上に持ってくるか、だ。今のところ、 BASICのcsaveを利用する方法を考えているのだが・・・。