石原 博の覚書

電子工作に関する日々の覚書を記載します

CP/M 68K で C言語

2024-04-14 22:30:02 | 日記
せっかくCP/M 68K でCが動くので、プログラムを動かした

Web上にCのソースは色々あるが、今となってはansi準拠がほとんど。

CP/M 68K のCは古いので、いろいろ対応していないため書き換える必要がある。大掛かりなものは面倒なので小物を探す。
手頃なものがあったので、書き換えてコンパイルまでしてみたが動かない。(エラーじゃなくて固まる)

昔を思い出しながらddtでデバッグすると、メモリのないところをアクセスして止まっている。
($FFFFCA28+$C になんてメモリがない)

link A6,#$0
PC=00009582 USP=00036546 SSP=00005D26 ST=0008=>IM=0 NEG
D 00000008 00036247 00000000 00000000 00000000 00000000 00000000 00000005
A 0000C838 00000008 00008081 00000000 00000000 00008086 00036546 00036546

movem.l D7-D7/A5-A5,-(A7)
PC=00009586 USP=0003653E SSP=00005D26 ST=0008=>IM=0 NEG
D 00000008 00036247 00000000 00000000 00000000 00000000 00000000 00000005
A 0000C838 00000008 00008081 00000000 00000000 00008086 00036546 0003653E

movea.l $8(A6),A5
PC=0000958A USP=0003653E SSP=00005D26 ST=0008=>IM=0 NEG
D 00000008 00036247 00000000 00000000 00000000 00000000 00000000 00000005
A 0000C838 00000008 00008081 00000000 00000000 FFFFCA28 00036546 0003653E

subq.w #$1,$C(A5)


そういえば、コンパイル時にwarningが出てた。警告なので無視したけど。
(warning) short assigned to pointer

そういえば このCはintは16bitでポインタは32bitだった。
該当箇所のアッセンブリソースを見ると以下のとおりfopenの返り値を符号拡張している。そりゃだめだ。
fp = fopen("test.txt", "r");

move.l #L3,(sp)
move.l #L2,-(sp)
jsr _fopen
addq.l #4,sp
ext.l R0
move.l R0,-4(R14)

特にCPM400SRを使っているのでTPAが$8000以降のため、返り値が符号拡張されfgetc(fp)で、
とんでもないアドレスをアクセスして固まったものと思われる。

本来 FILE *fopen(); がstdio.hにあるべきだと思ったんだが?

とりあえずソースの最初に「File *fopen();」を入れてコンパイルすれば警告も出ず、正常に動作させることが出来た。

2024/4/15追記
stdio.hはhttp:/www.cpm.z80.de/binary.htmlからダウンロードしたCP/M-68K BINARY version1.3
のものだがおかしい。後半が消えているようだ。
同ページの MICRO EMACS for CP/M-68K の中のstdio.hには、FILE *fopen();がある。
他にもヘッダファイルが途中までのようなものがいくつかある。 なぜだろう。


最新の画像もっと見る

コメントを投稿