せっかく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();がある。
他にもヘッダファイルが途中までのようなものがいくつかある。 なぜだろう。
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();がある。
他にもヘッダファイルが途中までのようなものがいくつかある。 なぜだろう。
※コメント投稿者のブログIDはブログ作成者のみに通知されます