88 環境はひとまず終了

つづき。

結論から言えば、ほぼあらたなことはなし。以前、エミュレータ環境にするためにはじめて作業したのは、おそらく 15 年くらい前。保管状況は決して悪くはないと思うものの経年劣化は否めず。ごく一部のものを除いて同等でしかなかった。

唯一といっていいくらいのは、書籍付録のディスクのひとつが全滅だったのを復旧することができたことくらい。それでも、壊れてしまっているらしきファイルはひとつふたつあったのでこれはまあ仕方ない。幸い、書籍付録のもので、どうしてもとなればそちらにソースリストがある。

まあ、いまさら 88 用のアセンブラであれこれということでもないので、そこまですることはたぶんない。

過去のものだと起動できても、あらたに転送したものではまったく起動できずというアプリケーションソフトもあったり。

プロテクトのかかったゲームは相変わらず無理であるし。

幸いにして作成したプログラムは十分機能を果たしてくれたのでよいのだが、これにて出番はないという短命。

そもそも、アスキーセーブしなおせば事足りるのだから。

N-DISK BASIC もあるけれど、こちらは数が少ないこと、中間コードが少し異なるらしいが資料がないこと、などからあっさりとセーブしなおしで。

さて、次は Internet Explorer が終焉を迎えたというのもあるので 98 環境の再整備ということか。Windows 3.1、Windows 95 環境はエミュレータにしっかり移せていないので。DOS 環境も一部動作しないままのもあるのでそのあたりも。

実機もまだ動作するものの、やはりこちらも一部環境がうまく動作しないようになっているので、あわせて整備しておきたいようにも。

まあ、いまさらもいまさらではある。

もう、CONFIG.SYS とかまったくわからなくなっているしなあ。

 

追記:(2022/07/12)

Github にコードを置いた。

 

| | コメント (0)

謎のオフセット値?

つづき。

基本的な変換そのものは、ほぼ問題ない感じなのだが、妙なエラーになるファイルが見つかって、バイナリで見るとどうも先頭のリンクポインタの数字がおかしい。

どうにかそれらしいところを追っていくと、どうやらアドレスにオフセット値とでもいうのか付加されているという感じ。

試しにそれを考慮して追ってみると良さそうなので、オフセット値と思われる分を差し引いて処理するようにしたところきれいに変換できた。

が、別のファイルでは異なるオフセット値がはいっていて、プログラム中で指定していたのを修正することに。optparse を使ってオプション指定できるようにした。これで少し楽になるか。

といってもその手のファイルはわずかではあったけれど。いずれにしてもなぜそんなものがついたのかが謎。

ということで次々と変換できたのでおおむね作業は終わりに近づいた。

残りのうちで N-DISK BASIC をどうしようかとは思う。資料もないし。ファイルがそもそも少ないし、アスキーセーブしなおせばよいか。

 

| | コメント (0)

0x3A の罠は、まだ続く

つづき。

実数の有効桁関連の修正をして N88 DISK BASIC と同じ結果になるようにしたのは、思ったよりは難しくなかった。

というのも、はじめ難儀していた丸め処理に関して 3.x 系の今となっては小数点以下についても Float#round が使えるとわかったので。

はじめはレシピブックを見て桁数指定で処理するメソッドを別に用意したのだけれど、どうもこれの動きがおかしなことになり、いろいろ調べているうちにいつからかはわからないけれど、現状では小数点以下、以上の任意の桁を指定して round 処理ができるらしい。

結果、プログラムも楽になったし、きちんと動作するようにもできた。

この過程で、できればファイル比較ができたらよいなと VS Code の拡張機能を探した。それらしいものを見つけたので試すと十分機能する感じ。

はじめに 88 側でアスキーセーブもしておいて、それと生成したものとを比較してみる。当初多く見つかったのが実数の桁数と丸め処理関連。ここが完了して残っていたのが条件分岐の ELSE の前についた : 。

アスキーセーブしたものにはついておらず、バイナリセーブされたものをみると ELSE を示す 16 進数の前に 3A つまり : がはいっている。どうやらこのまま実行しても問題はないようで動作はしていたけれど、やはり面白くないので対応することに。

おそらくは先の REM 文同様で明確に区別するための方式なのだろうと思うのだけれど、詳細は確かめようもない。

修正してもなかなかうまくいかず不思議に思っていたが、時間をあけてよくよく見れば、コードを挿入すべき場所が間違っているのだった。そこをきちんと対処したら意外とあっさりとしたコードでとりあえず動作するようにはなった。

ただ、ほかのバイナリファイルを試すとエラーになったりするので、まだ未知のなにかがあるのかもしれない。問題ないファイルもある。気長に順次対応ということで。

最悪、アスキーセーブしなおすという方法は残されているので。(というか、比較のためにも一度すべてやっておくべきか)

#タイトルを少し修正(20220607)

| | コメント (0)

N88-DISK BASIC の中間コードファイルをアスキーファイルに変換するのは、一応できた

さらに続き

単精度実数、倍精度実数の数字がおかしくなる原因は、16 進数から 2 進数へ変換したときに先頭のビットが 0 だとカットされてしまうためだった。

表す数字としてはどちらでも変わりはないものの、桁落ちしているビットも含めて情報なので、これでは正しく変換できるはずもない。

ということで補完するように修正。

そうこうして良さそうなので M88 へもっていって実行させようとするとロードエラーがでる。

が、ふと別の資料本を眺めていたら原因がわかった。ただしいファイルに変換できていなかった。行末のコードが正しくない。行の終わりには「0D0AH」がはいる必要がある。ファイルの終わりには、さらに「1AH」も必要。

修正して実行できることを確認した。

実数方面の丸目誤差がどう影響するかは、まだ未確認。0.0001 が 0.000099 とかになるのでごくわずかではあるのだが。

しかし、この時代に PC-8800 シリーズ用のツールなど(まして、アスキーセーブすれば事足りる)需要があるはずもないので、どこかに置くこともないかな。手元のバイナリー保存された BASIC プログラムをアスキーに変換するだけしたら、もう必要はないしなあ。

とはいえ、なかなか楽しい時間ではあった。案外あっさりできてしまった。

 

| | コメント (0)

試行錯誤

前のつづき。

いよいよ単精度実数、倍精度実数の処理にかかり、テストさせていて別の問題に気づく。

「REM」の問題。「'」となっていても「:REM♢」とか変換される。最後の「♢」についてはなかに「?」らしきもあるので不明なものとして処理されているのかもしれない。

ということでそれらをあらためて調べると、どうやら、「'」で示された REM は、中間コードでは「3A8FE9」となっている。3A が : 、8F は REM を表す中間コード、E9 は ' を表す中間コード。ということでこれらをセットで処理できるように修正してひとまずはよくなったものの、はたして単一の「'」であったりとか、純粋に「REM」と使われているときとかは、まだわからない。

実数の扱いも方法がようやくわかったので実装してみたものの、読み取った 16 進数を .to_s(2) で二進数に変換すると、行頭が 0 の場合カットされてしまうために桁不足が発生していたと判明。

これで、だいたいにはなったものの、まだ有効桁の処理が残っている。

やはり、もともとのプラットフォームで作成するほうが、内部ルーチンとか使って楽ができるのではないかと思い始めたところ。まあ、練習なので、やれるところまでは。

 

| | コメント (0)

中間コードからアスキーに変換するようにしてみた

先のことからプログラムを作ってみた。

調べているうちに単精度・倍精度実数の処理でよくわからないところがあったので、そこはまだきちんとしていない。

さいわいテストに使ったミンキーモモを描くプログラムでは使用しないので問題ない。

ちょっと困ったのは半角カナとか罫線みたいな不思議な模様があったけれど、このあたりはちょっとシフト JIS にしてもおかしいような感じは。もう少し確認してはみよう。

Ruby で書いたけれど、VS Code で remote WSL が使えるしありがたい。

中間コードのこんなバイナリファイルを、

20220530-163102s

 

こんなふうにアスキーに変換。

20220530-163128

 

久しぶりのプログラム。せっかくお題があるならやってみたらいいじゃない、ということでやってみた。PC-88 側でアスキーセーブし直せばそれでもすむのだけれど。

未実装や未確認部分は、またおいおいと。

 

| | コメント (0)

カセットテープに録音していたラジオ番組を分割して MP3 ファイルにした

1982 年から 1984 年にかけて録音していた NHK 長野の独自 FM 番組、「6時のジョッキー」のテープを以前 MD にしていたのだけれど、その後それを PC に取り込んで Wave ファイルにはしてあった。ただ、このままだとファイルサイズが大きすぎて普段使いにするにはやや不便。

また、50 分の番組(必ずしも毎回全部を録音できていたわけではないのだけれど)をそのまま録音しているので曲の情報とかが分離できないし、特定のときの DJ を聞こうとかいうことには不向き。

ということで曲と DJ 部分を分離して情報をまとめ、それらを一括して MP3 ファイルにしてしまおうと作業した。

放送の回数としては 33 回分が残されていた。番組あとにおしらせとかニュースとか入っているものもせっかくなので当時の記録としてそのまま活かした。

処理には Ruby のスクリプトを書いて実行。MP3 への変換は ffmpeg で。曲の発表年も調べておいたのだが、はじめこれだけがうまくメタデータにはいらなかった。調べてみたところ ID3 タグとしては「Year」なのだが、ffmpeg でのキーは「date」なのだという。ということで修正して無事に完了。

30GB ほどあった Wave ファイルが 1.6GB ほどに収まった。再生したいときにはこちらの MP3 ファイルを使えばすっきり。曲名や歌手名などもわかる。

まだ、こうしたカセットテープがあるので、おいおいと作業していく予定。ただ、件の「6時のジョッキー」のテープについては、MD 化の際に処分してしまったのが悔やまれる。今では MD は生産が終了してしまい、カセットテープはいまだ現役。枯れた技術こそ残るのだよなあと。残っているカセットテープはそのままに作業を続けたい。(カセットテープでは 50 分の録音になかなか苦労したわけだが。60 分テープだと途中で折り返さなくてはならない。120 分テープならいけるが、長期保管や再生には不安がつきまとう。その点では MD よかったのになあ)

作業中スレッド

| | コメント (0)