m@3記念館 QA 2025/7/2改
[このサイト何]
8~32bitレトロパソコンの記念館として収集物の記念撮影した画像を上げてます。
(元は博物館でも作ろうかと集めたのですがお金も尽き、10年ほったらかした挙句故障多発して止めました。)
実用性を重視する趣味により初代とかよりFDD付き後期モデルに偏ってます。
あまり奇麗な画像ではないですがご容赦。
ついででレトロパソコンで何か作って動かそうというソフト研究実験室になってます。
題材(習作)としてC言語でスクロールMAP表示と縦2Dシューティングゲームを上げてます。
(アセンブラでの最適化は先人に任せてCでどこまで出来るかという趣旨です。)
[動かない/バグってる]
PC-88VA以外の16/32bit機及びMSXの物は動作確認してる物もありますが、後は手間と都合により実機では確認してません。(修正前提でソースを出しています。)
FM TOWNSのは2M以上V2.1L20以降で起動します。X68000も2Mで動くはず。PC-88はfiles=0にして下さい。
[ソース]
あえて清書してません。(AS IS)
[バイナリが無い]
主にC言語関係でGPLでなくてMITで配布できるか色々検討して、問題ないと思われるもの含めていったん削除してあります。
付けている物は恐らく問題ないとの判断から。(今後消す可能性はあります。)
各ライブラリの著作権は各製作者にあります。
昔ならフリーソフトと書くだけで済んでいたのですが、今はライセンスを意識しなければいけない。時代の変化です。
[技術資料]
大体は図書館やネットにあります。
なお日高さんのページには氏の本の正誤表があります。
[BDS-CとSDCCとz88dkどれがいいですか]
全ては試してないので何とも。どれが速いのかも知りません。
SDCCはz88dkにパッチ当ててZSDCCとして取り込まれてます。(Winでは別配布のパッチでないとうまく動かなかった→今はそうでもない?)
SCCZ80より速いけど最適化に癖があったりして動かすのに一苦労します。MSX-BASICから呼ぶとexit(0)しないとSyntax Errorになるのは直ったらしい。
SCCZ80とZSDCCではスタックに積む引数の順番が標準では逆です。
癖と言うかBIOSコール時にIXレジスタ退避してないから変数が化けてたとか、みたく。
(LSI C-80よりSDCCやCLANGのがLSI Cメーカーの商品Webの再帰問題は速い?)
SDCC4.2.0で引数のレジスタ渡しが出来るようなので調査中。
→ZSDCCではオプション --sdcccall1を付ける…がライブラリ(乗除算も?)が対応してないので駄目。--sdcccall0だと引数をレジスタとスタック両方に積むが、ドキュメントに無いのでスタックだけ見た方がいいと思われる。1だとレジスタだけになる(使用されるレジスタも一部違う。戻り値も16bitではhlからdeになる)。引数のある関数ごとに__sdcccall(1)付けるしかない。
本家のドキュメントでは1が標準とあるのでZではあえて0にしてあると思われる。
[後期PC-88のキーボードのタイプ、HC-95の本体のタイプ]
探せば出てきます。
[HC-90/95、FM77AV40SXのD-Sub25ピンやHX-34等のRGBピン配置]
探せば出てきます。
[X1turboZのロゴの色の組み合わせ]
1~3全部違うらしい。
[無印X1とかファミコンとか割り込みじゃなくポーリングでBGM鳴ってるんですか]
らしいですね。
[gcc6809の通し方]
ビルドに必要なパッケージ全部入れて、ちゃんとビルドできるバージョン(Cygwin32なら4_3_branchとか)を解凍してbuild-6809からmake everythingする。
改行コードの問題、GCCのバージョンの互換性、カレントフォルダのパスもクリアしておく。
crt0.Sが何故かフォルダ名で誤生成されたら、フォルダに直してまっさらからもう一回。
終わったらcrt0.Sをmain呼ぶだけにいじり、crt0.oを生成。先頭番地を指定できるようアセンブラとリンカをわざわざ通すようにスクリプトを書く
インラインアセンブラの書式とラベル(行頭に_とか入れないとno headerとか出る)も直す。あとは先頭番地から実行できます。
なおnewlibの生成はできず?。tarballも間違ってました。libc.a欲しければgcc6809-CoCoが参考になります。
gcc6809 CoCoで探せばCygwin用バイナリがあるらしい。今はWSL2/Ubuntuで.debがある(後述)。
[CMOCって何]
6809のCライクコンパイラ。動かすまで難解なgcc6809に代わる物かも。ただWin版はうまく動かなかったのでCygwin等でmakeする必要あり
BASICからだとスタートアップが動かないので逆アセンブラした結果、mainの実行番地を直接呼んでます。アセンブラ・リンカ通せばいいのかもしれないけど、投げた
ビルド前にcrt.asmをいじっておくらしい。やり方は特に書かない。0.1.58はgcc6809より遅かったけど0.1.81は幾らか速くなった。
[何でFM77AV版は遅いのですか]
メインCPUで全部やってるからというかMMRの切り替えすぎ。サブCPUにやらせないとなのですがC言語だけではちょっと。でもメモリが無いかも。
SUB CPUをON/OFFしすぎなので見直してみた。キー入力が時々変になるのは仕方ないのかも。VRAMアクセスのためにSUB CPU止める=キー入力を取りこぼす?詰んでる。
パレット版は論理演算切り忘れてるけどSCREEN@で無効化されるらしく動いてる。
→SUB CPUコマンド版を試験的に作成。若干速い。(この若干が大事)
→キーボード入力をメインでやらせるように戻した。が取りこぼすし、不具合が露呈。以下マップ表示参照。
[FM TOWNS HR等の電源が直らない]
トランジスタ周りの抵抗とかやられてるのかも。壊れるのはコンデンサだけでないのです。ATX化するしかないかも。電源修理は下手すると失明するので注意。
[X68030 compact等の音量が直らない]
オペアンプ周りのスルーホールとかやられてるのかも。壊れるのはコンデンサだけでないのです。-12Vも出てるか見る。
[gcc-ia16がWindowsでビルドできない]
WSL2入れてUbuntu版を使う。これで98や88VAが試せる。
[gcc-ia16でI/Oポートを叩きたい]
libi86-ia16-elfをsudo apt-get installで入れて(解説には書いてない)、dos.hを#includeしてoutportb(,)/inportb()関数を使う。
-li86でリンクできる。#define _BORLANDC_SOURCEしないとWarning出る。
メモリモデルはtiny/small/mediumのようです。
何か.EXEで終了後ディスク読みに行けなかったりするので調査中。
WatcomCやDigitalMarsCの方が速いか?→-O2で最適化してみたらどっこい。
[USBセガサターンパッドが動かない・おかしい]
ATARI仕様ではなくてメガドライブ6ボタンパッド+CPA001やアナログパッドを選択してみて下さい。
[ELMSTRKの山賊の館はどこですか]
山の中です。なお抜け道色々あります。
[X1のDMA]
X1 turbo DMAで出てくるBDS Cのページ、DMAのリセットコマンドはC0ではなくてC3です。
[LSX-Dodgers]
z88dkではMSX-DOS形式ではなくて+cpmでないと駄目らしい。
PC-88版で何故かALUが効かず暴走する。→スタックポインタがOS側でC000H以降になってしまってるため。I/O 35HでVRAM選択するとおかしくなる。無理矢理スタックポインタを変更しても変数がおかしくなる。→VRAM選択中はスタックをいじらないことで解決。
似非DOSforMSXってのもある。メモリマッパ対応ではないようなのでMGSDRVが常駐できなかった(プレイヤーでの再生はできる)。
[CSCP]
77AVのDOSモード効いてない気がする。CSCPのMSX2Pは横スクロールしないしDOS1/2切り替えスイッチ無い。PC-6601は何処へ。
[8ビット機のグラフィックツール]
PC-88はPUT@/GET@で配列とやりとりしてそれ以上はマシン語で、PC-98はDEFSEG=でプレーン指定してBLOAD/BSAVEしてた時代。MSX2はBLOAD/BSAVE,Sで行けましたが。
→作りかけだったBASICのキャラクタエディタを手直して公開しました。
[背景との手前の重ね合わせ処理しないんですか]
したいけどメモリ食うからできない。.COM版ならできるかも。
[TOWNS-gcc クロスコンパイル環境]
試したところFarポインタが無いのでVRAMアクセスに関数でひたすら書くしかない。サウンドドライバさえどうにかなれば。シューティングゲームテストも動かした。
gccが古い版らしく__attribute__((interrupt));は逆立ちしてもありません。
[xdev68Kのビルド]
CF-SZ5では出来なかった。CF-QV1の方で構築して持ってきた。カーソルがOFFにならない。→B_CUROFF()の後にESCシーケンスで画面クリアしてたため。
[elf2X68k]
インラインアセンブラはレジスタ名に%つける。pc相対アドレスは絶対アドレスに直せば一応通る(アドレスが離れすぎる?)。
[CLANGサンプルの改訂版]
z88dkで+MSXしようとするとeZ80-CLANGではこけます。エラーの該当箇所を削れば通ります。
インライン展開させたくない時は関数名プロトタイプの後に__attribute__((noinline));を付けて下さい。(gccと同じ)
[他]
メモリマップドI/Oやワークエリアを参照するにはポインタ変数を使うのではなくて#define pointer ((volatile unsigned char *)0x0000)のようにマクロ定義した方がメモリが小さくなります。(修正は当面見送ります)constともまた違うらしい。
WSL2/Ubuntu上にgcc-ia16/elf2X68k/gcc6809/gcc6502/amiga-gcc(旧版)を何とか構築できました。ただ今後はLLVM-CLANGの時代かもしれず(何年後だ)。
6502はcc65が必要。C64用にコンパイルすると文字列を小文字にしないとおかしい。
6809のdebのはアセンブラ・リンカ等の書式が違うので書き直しが必要。(レジスタ変数bの挙動もおかしい/例をMAP表示に追加しました)
AMIGAのは内容古くて繋がらないサイトがあるのとgitがhttpsでないと通らないことがあるのと直接落としてあれば入れなくていい物があるので修正が必要。FD起動アプリ作るには色々サンプルの修正が必要。
elf2X68kはmake内のファイル名を小文字に統一する等の修正がコンパイル時に必要なこともあり。
C64/AMIGAはスプライトマルチプレクサー(ダブラー)考えないと、というところで中断。
[PC-98のWin2000/Win98マルチブート下でWin98側が起動しなくなった]
IO.SYSをWINBOOT.SYSにリネームしてコピーしてみてください。
[llvm-mc6809のビルド]
Ubuntuからgcc抜いてClangで通った。未完成。
→新版を同じ環境でCmakeしようとしたら途中でユーザーが停止させたになってその後WSLごと落ちた。(2025/6/27)
[X68000のBG面はラスタースクロールできないの]
InsideX68000のミスでXとYのレジスタが逆になってます。
[戻]