BDS Cで作った過去のミニゲームも公開しました。

http://www.nabeta.tk/msx/bdscmsx.html
三つのうち、ソースがあるのはひとつだけです。
2017年に作った最新バージョンのはずのCR3が、1991年のSPC2よりレベルが低いのは悲しい。
SPC2のソース紛失は悲しい。
ソースどころか、バイナリも紛失した幻のミニゲーム「オウム破壊シューティング」が見つからないのも悲しい。

BDS CでのターゲットのMSXのOS

一度諦めたと書いたんですが、うまくいったので書き換えました。
ROMカートリッジとしてのソフトの作り方は全くわかりませんでした。
BASICの上のBLOADファイルとして動くソフトは作れました。
うまくいきました。
MSX-DOSをターゲットに用意せずとも動作するソフトが作れるのは便利です。
CR3を動かすだけならうまく動いています。
公開するには標準関数もある程度動くようにしてからにしたいと思います。
原因ですが、自作のMSXライブラリのBASICのOSへの対応に問題がありMSX-DOSでは動いてもBASICのOSでは動かないものがありました。
条件分岐アセンブルで両方対応させたつもりでしたがまずいところが何箇所もありました。

BDS C v1.60 の標準ライブラリファイルの中身の関数一覧のメモ

DEFF.CRL

FCLOSE
FFLUSH
FGETC
FPUTC
_PUTC
UNGETC
GETW
PUTW
FREAD
FWRITE
FGETS
FPUTS
CLEARERR
FEOF
FERROR
PRINTF
FPRINTF
SPRINTF
_SSPR
LPRINTF
_FPUTC
SCANF
FSCANF
SSCANF
_GV2
_USPR
_BC
_SPR
_SGETC
_SUNGETC
_SCN
_GETNONW
GETLINE
PUTS
PUTDEC
STRCAT
STRCMP
STRCPY
STRLEN
ISALPHA
ISUPPER
ISLOWER
ISDEGIT
ISSPAGE
TOUPPER
TOLOWER
ATOI
QSORT
_SWP
INITW
INITB
INITPTR
GETVAL
ALLOC
FREE
SWAPIN
ABS
MAX
MIN
FOPEN

DEFF2.CRL
CMODE
IOBREAK
GETCHAR
KBHIT
UNGETCH
PUTCHAR
GETS
GETLINE
RAND
SRAND
SRAND1
NRAND
CSW
SETMEM
MOVMEM
MEMCMP
CALL
CALLA
INP
OUTP
PEEK
POKE
SLEEP
PAUSE
EXIT
BDOS
BIOS
BIOSH
CODEND
EXTERNS
ENDEXT
TOPOFMEM
EXEC
EXECV
RBRK
SBRK
RSVSTK
INDEX
SETJMP
LONGJMP
SETFCB
OPEN
CLOSE
CREAT
UNLINK
RENAME
FABORT
FCBADDR
WRITE
SEEK
TELL
HSEEK
HTELL
CFSIZE
CFLOW
ERRNO
ERRMSG
EXECL
LONG
PUTS
READ

CR3 自作コラムス(落ち物ゲーム)BDS C/MSX/HTML5

BDS CというC言語コンパイラで作った自作のMSXゲーム(2017年度版)を自分のホームページ上で動かして公開しました。
http://www.nabeta.tk/msx/cr3.html
これの元のソースが出てきたので改造したのですが、ソースが出てこなかったものも当時のままの状態で後で公開したいと思います。
ソースが出てこなかったもののほうがグラフィック機能使っている分だけ見た目はいいです。
BDS CコンパイラとこのCR3のソース一式をセットにして公開しています。
細かい説明はまたあと書きます。

Windows7 64bitに変えたらimDiskが動かなくなったと思ったが動いた。

Windows 8.1 64bitで、仮想ディスクドライバーの imDiskを仮想フロッピーディスクを使えていましたが、
Windows 7 64bitに変えたら動かなくなったと一時思いましたが、動いたり動かなかったりしています。
原因がはっきり分かりません。
少なくとも分かったのは、エクスプローラーで仮想フロッピーを開いた状態では、MSXPLAYerでその仮想フロッピーにアクセスできません。
動かなかったときに本物のフロッピーディスクドライブを買うことも考えました。
東南アジアの通販サイトのLAZADAで検索したらUSBのフロッピーディスクドライブもフロッピーディスクもまだ売っていました。
値段は安いんですが、買う価値があるかどうか悩みます。
正直要らないような気がしますが、今しか買えないかも知れないと思うと買っておいたほうがいいのかなとも思います。
完全に入手できなくなるまで生きているかどうかは分かりませんが。
フロッピーディスクはもう生産していないと聞くけどもなんでまだ新品が安価で販売できているのだろうか。

MSXマガジン永久保存版3のアスキー開発ツールズのワークディスクの内容のメモ

A>dir

BIN <dir> 05-03-26 1:46a
INCLUDE <dir> 05-03-26 1:46a
LIB <dir> 05-03-26 1:46a
SAMPLE <dir> 05-03-26 1:46a
MSXDOS2 SYS 2944 99-04-23 11:04p
COMMAND2 COM 15708 91-06-19 8:11p
AUTOEXEC BAT 8 04-12-12 1:17a
REBOOT BAT 90 04-12-12 1:28a
18K in 8 files 321K free

A>type autoexec.bat
reboot

A>type reboot.bat
mode 80
set path=.;a\;a\bin\
set include=a:\include\
set lib=a:\lib\
set expert=on

A:\BIN\AKID.COM 24576

A:\BIN\BATCH\ <dir>
A:\BIN\BATCH\AREL.BAT
A:\BIN\BATCH\CENV.BAT
A:\BIN\BATCH\CREL.BAT
A:\BIN\BATCH\FORREMK.BAT
A:\BIN\BATCH\GENLIB.BAT
A:\BIN\BATCH\GENLIBA.BAT
A:\BIN\BATCH\GENLIBC.BAT
A:\BIN\BATCH\GENREL.BAT
A:\BIN\BATCH\GENTCO.BAT
A:\BIN\BATCH\MKSYS.BAT

A:\BIN\C.BAT 103

A>type c.bat
cf %2 %1
fpc %1 lib
cg -k %3 %1
m80 =%1/z
del %1.mac
l80 ck,%1,clib/s,crun/s,cend,%1/n/y/e:xmain

A:\BIN\CC.BAT

A>type cc.bat
cf %2 %1
fpc %1 lib
cg -k %3 %1
m80 =%1/z
del %1.mac
l80 %lib%ck,%1,%lib%clib/s,%lib%crun/s,%lib%cend,%1/n/y/e:xmain
del %1.rel
del %1.sym

A:\BIN\CF.COM
A:\BIN\CG.COM
A:\BIN\CURSES.TCO
A:\BIN\FPC.COM
A:\BIN\GLIB.TCO
A:\BIN\KID.COM
A:\BIN\L80.COM
A:\BIN\LIB.TCO
A:\BIN\M80.COM
A:\BIN\MATH.TCO
A:\BIN\MLIB.TCO
A:\BIN\MSXBIOS.TCO
A:\BIN\MX.COM

A:\INCLUDE\BDOSFUNC.H
A:\INCLUDE\CONIO.H
A:\INCLUDE\CTYPE.H
A:\INCLUDE\CURSES.H
A:\INCLUDE\DIRECT.H
A:\INCLUDE\GLIB.H
A:\INCLUDE\IO.H
A:\INCLUDE\MALLOC.H
A:\INCLUDE\MATH.H
A:\INCLUDE\MEMORY.H
A:\INCLUDE\MSXBIOS.H
A:\INCLUDE\PROCESS.H
A:\INCLUDE\SETJMP.H
A:\INCLUDE\STDIO.H
A:\INCLUDE\STDLIB.H
A:\INCLUDE\STRING.H
A:\INCLUDE\TYPE.H

A:\LIB\CEND.REL
A:\LIB\CK.REL
A:\LIB\CRUN.REL
A:\LIB\CURSES.REL
A:\LIB\GLIB.REL
A:\LIB\MATH.REL
A:\LIB\MLIB.REL
A:\LIB\MSXBIOS.REL

A:\SAMPLE\BK.MAC
A:\SAMPLE\CALBIO.MAC
A:\SAMPLE\CALBIO.REL
A:\SAMPLE\COLOR.C
A:\SAMPLE\COLOR.REL
A:\SAMPLE\HEAD.C
A:\SAMPLE\LINE.C
A:\SAMPLE\LINE.REL
A:\SAMPLE\MKQ.BAT
A:\SAMPLE\Q.C
A:\SAMPLE\Q.COM
A:\SAMPLE\RND.MAC
A:\SAMPLE\RND.REL
A:\SAMPLE\ROM0.MAC
A:\SAMPLE\ROM1.C
A:\SAMPLE\SEARCH.BAS
A:\SAMPLE\SEARCH.BAT
A:\SAMPLE\SEARCH.C
A:\SAMPLE\WC.C

MSX用のCP/Mを昔持っていたような気がするかすかな記憶

確実に覚えているのはSHARP X1系のパソコンとそれようのCP/Mを持っていました。
機種名は覚えていませんが、X1 turboⅢか、X1 turbo Z Ⅲか、そんな感じの名前でした。
もうすでにX1の時代は終わっていて、中古で安く売っている時期に買いました。
ほとんど使うことはなく電源を入れたこともあまりありませんでした。
思い出せないのは、MSX用のCP/Mを持っていたような持っていなかったような。
検索すればMSX用のCP/M自体は存在しますが、検索しても私が当時日本で普通に入手できたような情報が出て来ないので多分、そんなものは持っていなかったのだとは思います。
でも、なぜ持っていたような記憶がかすかにあるのかが不思議なんです。
もし持っていたとすればCP/M単体で売られていたのではなくて、何かのソフト(多分コンパイラ系)がCP/Mを同梱して売っていてそのCP/Mの上で動いていたような気がします。
可能性としてはTurbo Pascalぐらいしか思いつきませんがTurbo Pascalは買った記憶がないし使った記憶もなくどんなものか想像もつかないぐらいなので絶対違いそう。
そしてTurbo PascalのMSX版がCP/M同梱だった記述は検索しても見つかりません。
では、MSX用のCP/Mを持っていたような気がするというかすかな記憶はどこから来たのでしょうか。
果たして、CP/Mを同梱したMSX用の市販ソフトは存在したのでしょうか?

他に思い出せないことは、
Small-CというC言語コンパイラと、Small-MacというSmall-Cでも使えるアセンブラとリンカを確かに買った記憶があります。
しかし、いったいどのパソコン向けに売られていた思い出せません。
CP/M用として5インチフロッピーディスクで売られていたのでしょうか?
今、検索してみてもSmall-Cの当時のことがほとんど出てこなくて良く分かりません。
買った記憶が本当に正しいのか不安になってきました。

BDS Cの純正ライブラリのみでMSXプログラム

BDS Cの純正ライブラリのみのMSXプログラムで可能なことを考えてみたいと思います。
純正ライブラリで設定を変えて再アセンブルもしくは再コンパイルしていない場合は、OSはMSX-DOSに限定されます。
MSXでCP/Mがもし動けばCP/Mでもいいです。
一応MSX2用のCP/Mはあるらしいですがほとんどの人はMSX-DOSを使ってCP/Mは使っていないし欠点はあっても使う利点は特にないかと思います。
機種固有機能を使っていないCP/Mシステムコールを使ったプログラムはMSX-DOSでもたいがい動きます。
BDS Cには、peek()、poke()、imp()、outp()、bdos()、kbhit()という便利な関数がデフォルトであるので別途、特殊なライブラリを用意しなくてもMSXを含む各種機種固有の機能をある程度使えます。
また、MSX-DOSはエスケープシーケンスが使えるので、printf()やputchar()などのC言語標準関数を使って文字カーソルの移動、画面の文字クリア、文字カーソルの形状指定、文字カーソルの表示のオン・オフなどができます。
例えば、エスケープシーケンスを使ったMSX-BASICのLOCATEに相当する指定位置への文字カーソルの移動は次のようになります。


void locate(x,y)
int x;
int y;
{
  printf("%cY%c%c",0x1b,32+y,32+x);
}
void main()
{
  locate(5,10);   /* X座標5、Y座標10の位置に文字カーソルを移動 */
}

peek()はMSX-BASICのPEEKに相当し、pokeはMSX-BASICのPOKEに相当し、番地を指定したメモリアクセスの読み書きができます。
MSXにはシステムワークエリアというものがあり、そこをpeek()で読むことでMSXの状態を得たり、そこにpoke()で書き込むことでMSXを操作することができます。
例えば、文字のカーソル移動はエスケープシーケンスを使わなくても、ワークエリアを書き換えることでも実現できます。
例えば、MSX-BASICのLOCATEに相当することをワークエリアの書き換えですると以下のようになります。
void locate(x,y)
int x;
int y;
{
poke(0xf3dc,y);
poke(0xf3dd,x);
}
void main()
{
locate(5,10); /* X座標5、Y座標10の位置に文字カーソルを移動 */
}
inp()は、MSX-BASICのIMPに相当しI/Oポートの読み込みができます。
outp()は、MSX-BASICのOUTに相当しI/Oポートの書き込みができます。
これらの関数でジョイスティックの入力を調べたりVDPをアクセスしてグラフィックを扱うこともできるかも知れません。
ただ、それをするのは難しいし、用途によっては速度が遅くなり現実的ではありません。
Z80アセンブリ言語で書かれたライブラリを使うほうが現実的でしょう。

kbhit()はキーボードのキーが押されているかどうかを調べる関数です。
bdos()は元々はCP/Mのシステムコールを呼ぶ関数でMSX-DOSのシステムコールにも使えます。
kbhit()でキーボードのキーが押されていると判断された時にbdos()でMSX-DOSのシステムコールの8番などの一文字入力機能を呼び出せば、多分、MSX-BASICのINKEY$に相当する入力待ちなしの位置文字入力機能を実現できると思います。
もうひとつ、INKEY$相当の機能を実現できそうな方法は、システムワークエリアのNEWKEY(FBE5H)を、peek()関数で読んでキーボードマトリクスを得て自作関数を作ることです。
C言語が、INKEY$に相当する標準関数を持っていないのは痛いところです。

BDS Cの標準ライブラリのみでMSXのプログラムを作ることを考えてみましたが、
でもまあ私はZ80アセンブリ言語でMSXライブラリを自作します。

BDS Cでの開発の準備中

BDS Cでの開発をしようとしていますが、今は足りない開発ツールの自作で止まっているところです。
他にはMSXライブラリの作成もしている途中です。
MSX-DOS上だけで動けばよいとは思っていなくてMSX-BASICのOS上(フロッピーディスクまたはカセットテープ)でも動くようにしたいと考えています。
できればROMカートリッジも。
まだROMカートリッジは試したこともないので実現可能かどうかはなんともいえません。
BASICのOS上では現在自作のBDS C用MSXライブラリが不足していて(MSX-DOSで動作するがBASIC-OSでは動作しない関数が多々ある)まともに使えませんが機能を限定すれば自作プログラムをBASIC-OS上で起動させることはできるようになりました。
大昔に作っていたMSX-BASIC-OS向けのBDS Cライブラリは消失しているので作り直しです。

MSXのROMカートリッジ向けソフトを作るには?

MSXエミュレーターでのROMカートリッジ用ソフトをBDS Cで作れないかなとふと思いました。
ROMカートリッジ向けソフトの利点は、C-BIOSというフリーのMSX互換BIOSに唯一対応することと、ROMカートリッジ用のソフトはディスクBASIC-OS上でマシン語(C言語からのコンパイル結果含む)のソフトを作るより最大プログラムサイズが大きく使えるメモリも多くなり、
さらに、MSX-DOSというOSを添付して配布したりユーザーに用意させる必要がなく、
フロッピーディスクもカセットテープもなくても動くと利点が大きいです。
欠点はMSX-DOSのほうがメモリマップが全部RAMでROMとRAMの区別がない分、メモリを有効に使えることと、MSX-DOSのシステムコールが使えないかも知れない。
(フロッピーディスクが使える状態ならMSX-DOSのシステムコールは使えるのでしょうか?)
C-BIOSはBASICインタプリタはなくフロッピーディスクにもカセットテープにも対応していません。
ROMカートリッジ向けソフトの問題は個人で作った例があまりないというか聞いたこともないような感じで作り方があまり知られていないことです。
どうやったらROMカートリッジ向けソフトが作れるのでしょうか。
MSXテクニカルハンドブックの記述及び簡単な解析をした結果では
先頭に0x41,0x42(アスキーコードで “AB”の2バイト)を書き、
次の2バイトに必要なら初期化ルーチンアドレス、BASIC-OSに戻らず無限ループするソフトならここでプログラム先頭に飛んでもよく、必要ないなら0x00,0x00で埋める。
残り12バイトを 0 で埋めて(0x41,0x42,初期化ルーチンアドレス2バイトを含めて16バイト)
17バイト目(メモリアドレス0x10)からプログラムが始まり、メガROM(64KB)でない普通のROMサイズは32KBで、64KBのRAMではメモリアドレス0x8000 から0xFFFFがRAMになり、
BIOSの呼び足しはMSX-DOSから呼び出す方法と同じスロット切り替えをすると思っていましたが、やってみたらできなくて
よく考えたら、スロット切り替えの1CHなどのBIOSの番地はROMカートリッジだと自分のプログラム部分でそこをCALLしてもBIOSが呼ばれるわけがないです。
かといって、MSX-DOSがやっているようにBIOSを呼べるようなルーチンをどこかに置くということは難しいです。
諦めようと思います。