[C] CP/M80 シミュレーターで懐かしの BDS-C を動かしてみた

BDS C プログラミング

先日、自宅の本棚を見ていたら、ちょっと古めのIT関連本が有ったので、写真を撮って SNS にアップしてみたところ、IT系の知人が結構懐かしがった。

「ちょっと古めのIT本」
「ちょっと古めのIT本」

Z80MC6809アセンブリ言語の話題から、BDS-C の話題になった。

私も色々思い出してきて、どんどん懐かしくなってきた。

BDS-C について

BDS-C は、BD Software 製の i8080/Z80 用のプログラミング言語 Cコンパイラーだ。CP/M80 上で使えた。

C のサブセットで、浮動小数点数を直接サポートしておらず、代わりに浮動小数点演算ライブラリを使うようになっていた。廉価版に α-C があり、当時の C の処理系としては安かった (はっきりとは覚えていないが、他が10万円クラスだったのが、α-C は数万円程度だった気がする)。

BDS-C を試してみよう

懐かしくなったので、BDS-C を動かしてみることにした。ちなみに、手元の環境は、Windows 8.1。

BDS-C は現在無償で公開されている。

このサイトで、BDS-C のコンパイラー (cc.com、cc2.com) やリンカー (clink.com)、そして、それらの CP/M80 用のアセンブリ言語のソースコード、ユーザー マニュアル等をダウンロードすることができる。

CP/M80 は手元にないので、シミュレーターを使うことにした。

SIMH Altair 8800 simulator

シミュレーターと CP/M、BDSーC のディスク イメージのダウンロード

CP/M のシミュレーター/エミュレーターは色々とあるようだが、Altair 8800 のシミュレーター SIMH Altair 8800 simulator を使うことにした。

Altair 8800 は、1974年に開発された世界初の個人向けコンピューターで、これ用の BASIC インタープリタービル・ゲイツポール・アレンが書いたのがマイクロソフトの始まりになったことで有名だ。

サイトではシミュレーター本体だけでなく、CP/M80 を含んだ BDS-C のディスク イメージもダウンロードすることができる。

尚、このサイトでは、他にもこのシミュレーター用の沢山のプログラミング言語の処理系や OS、アプリケーション、ゲーム等のディスク イメージをダウンロードできる。

シミュレーターと CP/M、BDSーC の起動

ダウンロードした二つの圧縮ファイル (altairz80.zip と bdsc.zip) を解凍して、一つのフォルダーに入れる。

ここでは、「C:\Altair 8800 simulator」というフォルダーを作成した。

中身は、次のようになった (コマンド プロンプト)。

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
C:\>cd C:\Altair 8800 simulator
C:\Altair 8800 simulator>dir /b
altairz80.exe
altairz80_doc.pdf
bdsC
bdsc160.dsk
bdsc160source.dsk
cpm2.dsk
i.dsk
simh_doc.pdf
simh_faq.pdf
C:\Altair 8800 simulator>

シミュレーターを起動し、CP/M 付き BDS-C のディスク イメージを読み込み、CP/M を立ち上げてみよう。

コマンド プロンプトで、「altairz80 bdsC」と入力する。

画面は次のようになる (コマンド プロンプトの続き)。

C:\Altair 8800 simulator>altairz80 bdsC
Altair 8800 (Z80) simulator V3.9-0 build 1625 (scp created Feb 10 2013 at 09:37:
45 with gcc 4.2.4)
64K CP/M Version 2.2 (SIMH ALTAIR 8800, BIOS V1.23, 2 HD, 08-Oct-06)
A>
---------------
Altair 8800 (Z80) simulator V3.9-0 build 1625 (scp created Feb 10 2013 at 09:37:
45 with gcc 4.2.4)
64K CP/M Version 2.2 (SIMH ALTAIR 8800, BIOS V1.23, 2 HD, 08-Oct-06)

通常のドライブ A の他に、BDS-C のドライブが二つ (B ドライブと C ドライブ) 追加されている。C ドライブには、CC.ASM 等 BDS-C 自体のソースコードが入っているようだ。

試しに、それぞれのドライブの中を見てみよう。

A>dir
A: PIP      COM : LS       COM : XSUB     COM : STAT     COM
A: GO       COM : RSETSIMH MAC : SYSCOPY  COM : XFORMAT  COM
A: SPEED    COM : W        COM : L80      COM : M80      COM
A: WM       HLP : WM       COM : SUBMIT   COM : FORMAT   COM
A: SYSCPM2  SUB : SYSCPM2Z SUB : DDTZ     COM : DSKBOOT  MAC
A: EX       MAC : EX8080   COM : ED       COM : DDT      COM
A: LOAD     COM : ASM      COM : LU       COM : MBASIC   COM
A: ELIZA    BAS : DUMP     COM : CREF80   COM : EXZ80DOC COM
A: EXZ80ALL COM : EX       SUB : UNERA    COM : BOOT     COM
A: OTHELLO  COM : WORM     COM : LADDER   DAT : LADDER   COM
A: ZSID     COM : ZTRAN4   COM : SURVEY   MAC : SHOWSEC  COM
A: BOOT     MAC : HDSKBOOT MAC : TIMER    MAC : UNERA    MAC
A: R        COM : CFGCCP   LIB : CFGCCPZ  LIB : MOVER    MAC
A: CCP      MAC : CCPZ     MAC : USQ      COM : MC       SUB
A: MCC      SUB : MCCL     SUB : RSETSIMH COM : CPU      MAC
A: TIMER    COM : UNCR     COM : SURVEY   COM : CPU      COM
A: COPY     COM : SID      COM : LIB80    COM : CCPZ     TXT
A: ZAP      COM : PRELIM   MAC : PRELIM   COM : BDOS     MAC
A: CBIOSX   MAC : DIF      COM : DO       COM : BOOTGEN  COM
A>dir b:
B: BDSCPAT  Z80 : -READ    ME  : BDS      LIB : CMODEM   C
B: C        CCC : C        SUB : CASM     C   : CASM     SUB
B: CC       COM : CC2      COM : CCC      ASM : CCONFIG  C
B: CCONFIG  COM : CCONFIG  H   : CCONFIG2 C   : CHARIO   C
B: CLIB     COM : CLINK    COM : CLOAD    C   : CRCKLST1 CRC
B: DEFF     CRL : DEFF2    CRL : DEFF2A   CSM : DEFF2B   CSM
B: DEFF2C   CSM : FILES    DOC : L2       C   : SOURCES  LBR
B: STDIO    H   : STDLIB1  C   : STDLIB2  C   : STDLIB3  C
B: ZCASM    LBR : -LBR     NOT : BCD      LBR : BDSCIO   H
B: BUGS     DOC : CDEBUG   LBR : CRCK     COM : CRCK     DOC
B: CRCKLST2 CRC : DEFF15   CRL : LBREXT   COM : LDIR     COM
B: LONG     C   : MCONFIG  H   : RED      LBR : TARGET   C
B: UNCRUNCH COM : CASM     CRL : CASM     COM : CHARIO   CRL
B: L2       COM : CCV16PAT HEX : CLOAD    COM : TAIL     C
B: CCV20PAT HEX : CMODEM   H   : CMODEM2  C   : CP       C
B: DATE     C   : DIO      C   : DIO      H   : HARDWARE H
B: LPR      C   : NDI      C   : NOBOOT   C   : RM       C
B: UCASE    C   : WILDEXP  C
A>dir c:
C: A        SUB : CC       ASM : CC       SUB : CC2      ASM
C: CC2A     ASM : CC2B     ASM : CC2C     ASM : CC2D     ASM
C: CC2E     ASM : CC2L     ASM : CC2SLR   ASM : CCA      ASM
C: CCB      ASM : CCC      ASM : CCD      ASM : CCL      ASM
C: CLINK    ASM : CLINKA   ASM : CLINKB   ASM : CLINKL   ASM
C: LASM     COM : NCC      SUB : NCC2     SUB : NCC2S    SUB
C: NCC2Z    SUB : NCCD     SUB : NCCZ     SUB : NCLINK   SUB
C: NZCLINK  SUB : PUT      BTM : README   TXT : CHARIO   C
C: L2       C   : STDIO    H   : CC       COM : C        CCC
C: CLINK    COM : DEFF     CRL : CC2      COM : DEFF2    CRL
C: L2       COM
A>

B ドライブに、BDS-C のコンパイラー (CC.COM、CC2.COM) やリンカー (CLINK.COM) がある。ちなみに、A ドライブには、BDS-C で書かれたオセロゲーム (OTHELLO.COM) が入っている。

BDSーC で "Hello world!"

では、お約束の "Hello world!" をやってみよう。

CP/M で B ドライブに移動して、ライン エディターの「ed」 (CP/M が内蔵している テキスト エディターの一種) を立ち上げ、hello.c というファイル名で Hello world! と出力する C のプログラムを書く。

勿論、古い C の文法で書く必要がある。

A>b:
B>ed hello.c
NEW FILE
: *i
1:  #include <stdio.h>
2:
3:  main()
4:  {
5:      puts("Hello world!");
6:  }
7:
: *e
B>

hello.c の中身を覗いてみる。書いた通りのソースコードになっているのが確認できる。

B>type hello.c
#include <stdio.h>
main()
{
puts("Hello world!");
}
B>

では、BDS-C でコンパイルし、リンクしてみよう。コンパイルは cc、リンクは clink だ。

B>cc hello.c
BD Software C Compiler v1.60  (part I)
36K elbowroom
BD Software C Compiler v1.60 (part II)
33K to spare
B>clink hello
BD Software C Linker   v1.60
Last code address: 0901
Externals start at 0902, occupy 0006 bytes, last byte at 0907
Top of memory: E405
Stack space: DAFE
Writing output...
46K link space remaining
B>

エラー無くコンパイルとリンクができたようだ。

実行ファイルが出来たことを確認しよう。

B>dir hello.*
B: HELLO    C   : HELLO    CRL : HELLO    COM
B>

問題ないようだ。

では、愈々実行だ。

B>hello
Hello world!
B>

無事 Hello world! と表示された。

めでたし、めでたし。