|
YSFLIGHT.COM内のプログラムはすべてがオープンソースでは無いですが、オープンなものについては、以下のURLからダウンロードできます。
https://github.com/captainys/public
ウクライナに勝利を!
FM TOWNSの謎がひとつ増えてしまった。
FM TOWNSエミュレータ「津軽」の目標は、自分が最後に忠誠を誓ったコンピュータであり、自分が最後にメイン機として使ったFM TOWNSであるFM TOWNS II MXの再現だが、できてなかったことのひとつの中に、高解像度PCM音源があった。 高解像度PCM音源と言っても、今の基準では普通の音源なのだが、FM TOWNSにもとから入っていたPCMが公式には19.2KHz (エミュレータでやってみたらどうも20KHzっぽい)であったのに対して、FM TOWNS II MX/MAの世代で追加された高解像度PCM音源は最大48KHz。またデータをDMA転送するので、CPUの負荷が少ないというメリットがあった。
この高解像度PCM音源をエミュレータで再現するためには、当然DMAを再現しなくてはならない。I/Oを見たところ、オンボードのメインDMAと同じようだったのでコードを再利用した。
ところが、それだとデータの半分しか転送されない。よくよく調べると、DMAに設定するカウント1あたり2バイト転送されることになっていたらしい。そのように実装したら正しく音が鳴るようになった。
しかし、この動作はメインDMAと異なる。まさか富士通が高解像度PCM音源のためだけに違うDMAコントローラを使ったとも思えない。ましてI/Oはほとんど同じだ。メインDMAと同じタイプのDMAコントローラを使っていると考えるのが自然だ。
実はメインDMAにも8-bit/16-bitバス幅の指定があって、16-bitバス幅を指定すると一度のDMAサイクルで2バイトが転送されることになっている。問題は、そのときのカウント値の変化だ。FM TOWNSのシステムROM、IO.SYSなどはすべてこのDMAカウントには転送バイト数-1の値を指定する。DMAは、カウントをデクリメントしていって、最後に0から桁下がりが起きたとき止まるので、ちょうど指定した値+1回の転送で終了する。しかし、1カウントあたり2バイト転送しているとすると、指定した値のほぼ倍のバイト数が転送されることになってしまう。あるいは、実際転送されたバイト数の半分しかカウントが下がらない計算になる。
自分が津軽を開発していた間は、I/Oの動きを見て、いつも転送バイト数-1をカウント値として書き込んでいるようだったので、カウント値+1バイトまで転送するように書いた。その書き方で今のところDMAに関して動きが変なプログラムは見つかっていない。
仮に、16ビットバス幅のとき1カウントあたり2バイト転送しているとすると、例えばカウント値0x7FF(2023)で転送を初めてCD-ROMの1セクタ、0x800(2024)バイトを読み終わったとき、カウント値は0x3FFのはずだ。DMAのカウントが上がっていなくてもCD-ROMコントローラが止まってさえいれば問題はない。
この仮説を検証するために、以前書いた、アセンブラでCD-ROMから1セクタを読み込むプログラムに手を加えて読み込み後にDMAカウントを読んで表示させるようにしてみた。実機FM TOWNS II MXでの実験結果は0xFFFF。桁下がりが発生していた。したがって、2024バイトの転送で、カウントは2024だけ下がった。1カウントあたり1バイトの転送と見ることができる。
だとすると、DMAが8ビットバスモードになっているのか? 「FM TOWNSテクニカルデータブック」69ページによると、I/O 00A0Hのビット1に書き込む値によってバス幅が決まるらしい。そして、このビットに1を書き込むと16ビットバスモードになるとある。津軽上で動きを追ったところ、起動時このI/Oには3が書き込まれている。ビット1は1だからもしもこの本の通りであれば、16ビットバスモードのはずだ。
しかし、挙動は8ビットバスモードのように見える。だとすると、このビットに関する記述が間違っているのか?DMA 71071のデータシートによると、I/O 00A0Hは、初期化コマンドに対応するらしい。そして、ビット1を1にすると16ビットモードであると記述があった。データシートが誤っているのでなければ、FM TOWNSのDMAは16ビットモードに設定されているはずだ。
だとすれば、1カウントあたり2バイトの転送のはず。転送バイト数の半分だけカウントが下がるはずで、実機上で確認された挙動と違う。
あるいは、DMAの動作モードの中に、16ビットバス幅で2バイト単位で転送するが、カウント値を1サイクルあたり2だけデクリメントするモードがあるならばそれでも説明はつくが、これまでDMAのデータシートを見た限りではそういうモードも無さそうだ。
最後に残る可能性としては、実はI/O 00A0Hのビット1はどこにもつながっていなくて、ここに何を書き込もうがメインDMAは8ビットモードで動作しているという可能性は残る。
ちなみに、FM TOWNSにはもともと2個のDMAコントローラがあって、2個目のDMAコントローラには未使用チャンネルがあった。高解像度PCMがなぜその未使用チャンネルを使わなかったのか、これも謎のひとつと言える。が、サウンドチップが16ビット転送にしか対応していなくて、実はもとからあったDMAが8ビットモードで固定だったとすると説明がつくかもしれない。
この謎を解明するには相当なハードウェアのリバースエンジニアリングが必要になりそうだ。メインDMAの挙動は謎になってしまった。
更新してないうちにあっという間に12月。最近、なんかやったらgithubとFM TOWNS掲示板とDiscordに書いてそれでいいかってなってしまってこっちに書かない悪い癖がついた。
あっという間とは言ったものの、よく老化とともに時間が経つのが速く感じるようになると言われるが、自分としてはまだそんなに時間が経つのが速い気はしない。 子供はまだ生きてきた時間が短いから、たとえば10歳の子供なら1年というのはそれまでの人生の10%にもなるが、50歳のおっさんだと1年はたったの2%でしかない。だから、年を食うと時間が経つのが速く感じるとする説があるけど、それは違う鴨しれない。何か楽しみなことがあると、待ち遠しいもんだから待ち時間が長く感じる気がする。
今年も結構いろんなことをやった。
今年から、週3回大学のジムのトレッドミルで30分走るようにした。目標は5kmランを完走することだったのだが、4月のCMUカーニバルのランで完走に成功。そこで目標を5kmを30分に引き上げたところ、9月のピッツバーグ空港ラン(Flyby 5K)で27分台を達成してしまった。走れるもんだね。そこで、目標を5km 25分に引き上げたのだが、先月のTurkey Trot 5kでは残念ながら26分58秒。一気に達成はできなかった。8.5分/マイルのペーサーさんに2マイル地点ぐらいまでは着いていったんだが、その辺から遅れてしまった。とりあえず来年に向けてトレッドミルで走る速度を上げた。アスファルトの上を走ると膝に悪いというので普段走りはトレッドミルにして今のところ正解のようだ。正直、20年前は5kmなんて走れなかったから今の方が体力がある気がする。
小学生のころは、太ってて勉強はそこそこできるのに運動が下手という典型的ないじめられっ子だった。しかも、自分はいじめられっ子の先駆けみたいな時期だったので、いじめが社会問題として認識されていなかった。誰も助けてくれなかった。今思えばFM-7が無ければ僕は命を絶っていたかもしれない。当時僕をいじめてた奴らは今5km走れるのかな?奴らが成人病で苦しんでいるところを見てみたい気もするが、自分の中ではその優先順位はかなり低い。他に楽しいことが多すぎて忙しい。
今年は、飛行機の教官免許を取るという目標もあったけど、それは達成できなかった。というか、順番を間違えたね。まず教官席で自信をもって操縦できるようになってから、学科試験とか受けるべきだった。自分は、割と学習が遅い方だと思う。どちらかというと時間をかけて学習すればしっかり理解できるタイプだが、感覚でささっとおぼえるのが苦手で、言葉にできないことは体も動かない。ついでに夏に訓練を始めたときは、慣れない機種で教官席、右席からの操縦をいきなり覚えるというのは無理があった。もっと言うと、Piperの設計思想はいまいち好きじゃない。セスナは機体の左右両方にドアがあるのに対して、Piperの機体は右にしかドアが無い。もしも不時着して、右に出られなかったらなんとする?あるいは、片方のドアが曲がって開かなくなってもセスナだったら反対側にドアがあるし、大きな窓がある。Piper機にはそれがない。どれほどの訓練を積んでも100%に近づくことはできても100%にはならない。やっぱ僕はセスナの方が好きだな。
そいういわけで、最近は何度かセスナで右の席から操縦する訓練をした。何度かってまだ2回目か。1回目はさんざんだったが、2回目はかなりうまくできた。が、まだ目を左の計器から正面に移動するのが足りなくて、離着陸時に右ラダーを踏みすぎる傾向がある。イメージとしては、マルチモニタにして、左のモニタに計器を、右のモニタに正面を表示して操縦する感じ。感じというか外の景色が本物なだけでほんとにそうだな。この癖を直したら多分自信持って右席から飛べるようになると思うんだが。Archer乗ってた時、なぜか着陸して減速してきてから機種を右に振ってしまう癖があったんだけど、これも同じ原因だったの鴨しれない。
最近、我がレトロPCのひとつFM77AVにArduino Unoからきわめて安い方法でキーボード信号を送ることに成功した。これもまたgithubに上げてこっちに書くのをさぼるという悪い癖なんだけど、https://github.com/captainys/FM/blob/master/7/FM77AVKeyboard/cheapFM77AVkeyboard.mdここにやり方書いた。いつぞや作った赤外線でFM77AVにキーボード信号を送るのと同じArduinoプログラムで、本体からは、GND, KDETECT, KSDATAの3本の線を識別できればそれをArduinoの適切なピンにつなぐだけ、あとは、PC上のターミナルからArduinoにつなげてタイプした文字がFM77AVに出てくるというお手軽な仕組みにできた。FM77AVシリーズのキーボードのプロトコルは全機種同じだから、AV20/AV40/AV20EX/AV40EX/AV40SXのすべての機種で、結線さえわかれば同じ方法でタイプできるはず。 キーボードのないFM77AVに文字を送るには多分もっとも安上りなのではないかと思う。一応、キーボードエミュレータプログラムを使うとゲームの使用にも耐えるぐらいのレスポンスが出る。
あとは、最近、いつぞや開発したFM TOWNSで救難IPLを起動するためのFRAMカード、 製作してヤフオクに出してくれた人がいて、なんとまさかの4万円越え! 作った人、あまりの高騰に、次から即決価格で出そうかとか言ってたけど、4万円出してもまだFM TOWNSを稼働させ続けようという人がいるのを見るのはそれはそれで嬉しかったりすると思うから、普通にヤフオクに出しちゃってもいいと開発者としては思うんだけど。 ちょっとモチベーションが沸いたので、きちんとPCMCIAケースに収まるバージョンに再挑戦してみた。救難IPL (気分によって救難IPLと呼んだり救済IPLと呼んだりしているので、どっちも正式名称)を「神ソフトウェア」と評してくれていたので素直に喜んだ。 前回は、0.4mm厚PCB用のコネクタに無理やり0.7mm厚PCBを押し込んでみたところ、ケースがふくらんでタワー型TOWNSのメモリカードスロットに入らなかったり、構造的ストレスからはんだがはがれてしまうという現象が起きて失敗したのだが、今回は、0.4mm厚PCBで製作したところ、この問題は解決したようだ。PCMCIAケースはもうあまり手に入らないから、今ある部品がなくなったらもう生産できないんだけど、30枚分ぐらい確保してあるんで、もうしばらくはケース付きバージョンを生産できそうだ。ヤフオクでも出してみるかな?
サン・フランシスコ・フリートウィークエアショーの模様とかアップロードしようと思ってるんだけど、それはまたの機会だなー。
すげえ!朝起きたら慶應高校優勝してた!慶應高校に「若き血」と別の校歌があるって今日まで知らんかった!
おめでとー! (一応慶應OB)
内容の濃い夏であった。
飛行機教官免許の訓練を開始。筆記試験、スピントレーニングまで受けて、教官シート(右席)で飛ぶ練習も少しだけやった。訓練に使用していたPiper Archerがどうも癖がある機体で、離陸時右ラダーがいらないレベルでラダーの調整が狂っていたのでメカニックに言ったらこんどはものすごく強く右ラダーを踏んでないとまっすぐ飛ばなくなった。離陸中止しようか迷うレベル。今思うとあれは中止しとくべきだった。というような機体で、どうも思ったように操縦できないと思っているうちに、その機体が書類上の都合で飛行停止。そのままそのフライトスクールも開店休業状態になって訓練は中断してしまった。
それでも半端な訓練から、ふたつ良かったことがあって、ひとつは14歳からわからなくて謎だった疑問の答えがわかったこと。迎え角をゼロに維持したとして、操縦輪を左右に倒してロールを開始しても、操縦輪を中央に戻したらロールは止まる。パイロットは経験から知っている。しかし、この物理的な説明がわからなかった。ロールが止まるということは、回転と逆向きのモーメントがかかっているということだが、このモーメントはどこから来るのか?左右の迎え角が同じで対気速度が同じならロールを加速する方向にも減速する方向にもモーメントは働かないから操縦輪を中央に戻してもそのままロールを続けるはずだ。だが、実際はロールは止まる。この疑問がスピントレーニングの座学で氷解。ロールによって下がって行ってる方の翼は、上がって行ってる方よりも迎え角が大きくなるから微妙に揚力が大きくなるんだもんね。そりゃロール止める方向にモーメントが出るわ。
もうひとつは、教官から僕は風が強い状態でも対応できるからやってみろ、と言われてやってみたら実際20ktの風でも割と普通に操縦できたので、自身のパーソナル・ミニマムを引き上げた。これまでは、風速15kt以上、または横風成分が12kt以上のときは飛ばないことにしていたが、新しいミニマムでは風速20kt、横風成分15kt以下なら飛ぶことにした。なお、ミニマムというのは「最悪」の意味なので、風速の場合はどっちかというと「マキシマム」だが、一般的に、パーソナル・ミニマムと言う。実際、今度日本に帰国する友達を乗せたときは、風速20ktあったので、新基準を適用した。あと、フライングクラブのスポットランディングコンペのときもたしか19ktの風があったかな。
FM TOWNS用「大航海時代2」を津軽上でクリア。「大航海時代」がおもしろかったからぜひやってみたいと思っていた。プレイし終わっての感想は、ラディアとパウラはエンディングにも絡んでくるのに、ルチアだけどうしてまるでいなかったかのような扱いになるの???? 3人ともオープニングでは重要人物扱いなのに。誘拐事件イベント後、世界中ルチア探し回ったのに。
コロンバス航空ショー。F-5が飛んでるところを初めて見た、はず。ひょっとすると1995年と1997年にミラマーで飛んだのを見たのはT-38じゃなくF-5だったかもしれないが、記憶が定かでない。今度のやつは明示的にF-5だから、間違いない。写真まとめてアップロードしようと思いつつさぼっている。
我が妻の家族が来ピツ。ナイアガラまで我がセスナで飛ぶ。ナイアガラも結構慣れてきた。
車追突される。ピッツバーグ市警爆発物処理班の車が我がホンダ・フィットの後ろにいたアウディに追突、アウディは押されて我が車に追突。フィットは廃車は免れたけど、まだ帰ってきてない。
従妹家族が来ピツ。ピッツバーグのダウンタウン遊覧飛行に飛んだが、この週は今度日本に帰る友達を遊覧飛行に連れて行ったり、フライングクラブのスポット・ランディングコンペがあったりしたもんだから、ビーバーまで合計4往復、合計6回のフライトになった。6回のフライトはいいんだけどビーバー4往復がきつかった。飛行機の操縦は疲れないけど車の運転は疲れる。
イベントが盛りだくさんだった割に、いまいち何か達成したという感じが無いのは、教官免許が取れないまま夏休みが終わってしまったからかな。
ところでもう話題にも上らなくなったけど、タイタニック観光潜水艇の事故。日本のニュースサイトとかまとめサイトで、乗員は圧縮されて6000度の高温になった空気によって焼け死んだ、とする情報がまことしやかに流れていたけど、多分それは無い。死因は焼死じゃなくて、高圧による臓器の破損、肺を圧迫されたことによる窒息、あるいは、船内にものすごい勢いで流入した水の衝撃による打撲じゃないかと思う。Implosionという単語を「爆縮」と翻訳したから、「爆」って漢字がそういう印象を与えたのかと思ったら、なんか炎を上げて爆散する動画があったのね。動画は英語のナレーションだったから最初に間違ったのは日本じゃなかったようだ。
僕は計算してないから実際何度まで気温が上がったか知らない。空気を圧縮すると温度が上がるのは間違いない。多分6000度というのは船内の空気が断熱圧縮でものすごく小さな体積に圧縮された場合を想定してるんだと思う。まあ、断熱圧縮が起きたとしよう。たしかに一瞬だから熱が海水に伝わる時間よりも圧縮される時間が圧倒的に短かったとすると断熱圧縮と近似してもいいのかもしれない。だが、6000度まで上がるためには空気はものすごく小さな体積まで圧縮されなくてはならない。しかも、流れ込んだ水は空気の中に割り込むように入ってくるから、空気の塊がひとつにまとまっているわけがなく、おそらく点々とものすごく小さな、多分直径がミリメートル単位の高温の泡になり、まもなく冷えてしまっただろう。仮に温度が6000度まで上がったとしても、そんな点では人を焼き殺すことはできない。多分だけど、小さな泡が冷却される前にたまたま人体に接したとしても根性焼きができるぐらいではないだろうか。
ついでに、そもそも断熱圧縮ではない。空気の持つ熱は自由に海水に逃げることができた。空気が圧縮されて温度が上がって沸点を超えたら接している水は蒸発を始めて熱を奪うので温度の上昇には結構なブレーキがかかったのではないかと思う。どんなに一瞬だとしても蒸発するものは蒸発する。300気圧だったっけ?そのぐらいの水圧だと沸点は数百度ぐらい?空気を圧縮中の水は圧縮し終わるまで周囲よりも圧が一瞬だけど下がるはずだからもっと低い。当然、蒸発してできた気体になった水は沸点を超えて上昇を続けることができるとは言っても、6000度まで上昇はできなかったと思うんだけどな。おそらく、高音の泡は一瞬6000度よりはかなり低い温度まで加熱されて、次の一瞬で冷却してしまったと思う。
ついでに、高温になったのはものすごく小さな泡でしかないから、多分目に見えるような炎も出なかった。炎を上げて爆散した動画を作ったら人目につくかもしれないけどね。正確な描写ではない。
もちろん、これによって乗員の運命が変わるわけではないが、気になってたので。
更新をさぼってしまって早くも8月。FM TOWNS情報掲示板とかDiscordには出てるし、githubのコードのアップデートはしてるけど。
できれば、飛行機教官免許をこの時点で取れて入れれば良かったんだけど、この夏はイベントが多すぎた、だけではなく、そもそも教官免許の訓練をしていたフライトスクールが休業してしまったもんだから、いつ訓練を再開できるかわかんなくなった。別に前金で払ってあったりするわけではなく時間ごとに払ってたから金銭的なダメージは無く、風が強い状態で飛ぶ自信がついたんで最大風速20kt、横風成分15ktに自分のミニマムを引き上げたという効果はあった。
しかし、この出張は出発前から不運続きだった。離ピツ直前、14年間何のトラブルも無く走り続けた我がホンダ・フィットが追突される。渋滞で止まっていたところ、自分の後ろで車線変更しようとして半分入ったところで止まっていたアウディに、ピッツバーグ市警の爆発物処理班のでかいトラックが追突、アウディは押されてフィットの後方に衝突した。可哀そうに、停まってるところに追突されたのはこれで二度目だった。スピードはゆっくり目だったのだが、角が当たったので割と大きく凹んでしまった。かけてたサングラスがふっとぶぐらいの衝撃はあったが、日ごろの筋トレの効果か怪我などは無し。
そもそも、この出張、上司からは日本滞在を前後少し伸ばしてもいいよとのことだったのだが、前日がデイトン航空ショーだったので、離ピツをギリギリにして、最近教官免許を取るべく訓練しているので、あまり間を開けると良くないと思って東京は仕事の後一日だけ伸ばして帰ピツ日も詰めた。にもかかわらず、事故に遭う以前に、都合によりデイトン航空ショー行きはキャンセルになり、訓練に使ってた機体が手続き上の問題で使えなくなってて早く帰ってくる意味もなかったという、スケジュールからして不運の旅になった。ちなみに、教官免許のための訓練はいつ再開できるか目途が立ってない。
どうも最近ついてない。
自分は強運だと思う。そもそも、青森県弘前市の地元の大学に行って地元で学校の先生でもするんだろうなあ、と漠然と思っていたのに、蓋を開けてみたらアメリカに渡ってカーネギー・メロンでPh.Dを取り、好きなプログラミングの授業を任せてもらえて、YS FLIGHT SIMULATORとFM TOWNSエミュレータ津軽は世界中で使われて、セスナ172乗り回してるなんてこれで運が悪いと言ったら、バチが当たる。だが、この2~3週間だけ見たらついてなかった。
既に一週間が経過してしまいましたが、新年おめでとうございます。今年もよろしくお願いします! このお正月は、1月1日のフライトで日本からピッツバーグに戻りましたが、窓から富士山がきれいに見え、一昨日はピッツバーグで車を運転していたら前方を鷹(Red Tail Hawk)が低空で飛びぬけ、一富士、二鷹をクリアしてしまったので、晩にナスを食べ、三ナスビのコンボが完成するという非常に縁起の良い年の始まりになりました!
やっとコロナも終わった。いい加減それを認める時期だ。コロナも終わったので、去年は二度日本に帰省したんだが、最初の帰省ではいきなり10日も不当に逮捕・監禁され(あれのどこが隔離だ?)、二度目の帰省は最後までたいした事件も無く予定通り進んだかと思ったらいきなり預けた荷物が飛行機に積まれないというハプニングがあったものの、AirTagを入れてあったら一日遅れて運ばれてくる模様を逐一トラックできてAirTagの威力に感動して終わった。続きを読む
なお、正月は、鬼のように難しかったFM-7用Flappy (1984)はステートセーブしまくりならクリアできるのか?という疑問に答えを出すべく、「陸奥」でプレイしたところ、無事200面クリアできることがわかった。5日もかかってしまった。
Comments are welcome. Send E-Mail to: |