しばらく68k実機を使っていたが、遅いしSDカード経由でのプログラム移動は面倒なのでPC上のエミュレータを使ってみることにした。
skyriverさんのブログ(https://piclabo.blog.ss-blog.jp/2018-07-22)
@hi631(Hiromichi Kitahara)さんのqiita https://qiita.com/hi631/items/577d943adbe9b03dce1c
を参考にしました。
---使用するファイル--------
・Musashi
https://github.com/kstenerud/Musashi
・CP/M-68K Simulator
http://davesrocketworks.com/electronics/cpm68/simulator.html
----------
Musashi-master.zipを展開し、cpmsim.zipを展開したもので上書き。(m68kconf.hだけ同じ名前のファイルがある)
ところがコンパイルエラーが多発。Musashiがバージョンアップして不整合が起きているような感じ。
cpmsim.zipはMusashiのバージョン3.3を想定しているようだが、現在のMusashiはバージョン4.6
エラーとその対応
[1]'obj/m68kopac.c' を make するルールがありません
>make: *** 'obj/m68kopac.o' に必要なターゲット 'obj/m68kopac.c' を make するルールがありません. 中止.
色々warningが出るが結局このエラーで止まる。m68kopac.cなどどこにもない。
makefileを調べて見ると以前は「obj/m68kmake obj m68k_in.c」によりobj/m68kops.c、obj/m68kopac.c、
obj/m68kopdm.c、obj/m68kopnz.cを生成していたようだが、現在のバージョンでは obj/m68ops.c しか作っていない。
(すべてm68kops.cに含まれているようだ)
MUSASHI Version3.3の m68kmake.c
/* Default filenames */
#define FILENAME_INPUT "m68k_in.c"
#define FILENAME_PROTOTYPE "m68kops.h"
#define FILENAME_TABLE "m68kops.c"
#define FILENAME_OPS_AC "m68kopac.c"
#define FILENAME_OPS_DM "m68kopdm.c"
#define FILENAME_OPS_NZ "m68kopnz.c"
MUSASHI Version4.6の m68kmake.c
/* Default filenames */
#define FILENAME_INPUT "m68k_in.c"
#define FILENAME_PROTOTYPE "m68kops.h"
#define FILENAME_TABLE "m68kops.c"
そこで
cpmsim: obj/cpmsim.o obj/m68kcpu.o obj/m68kops.o obj/m68kopac.o obj/m68kopdm.o obj/m68kopnz.o m68kdasm.o
$(CC) $(LFLAGS) obj/sim.o obj/m68kcpu.o obj/m68kops.o obj/m68kopac.o obj/m68kopdm.o obj/m68kopnz.o m68kdasm.o -o cpmsim
から不要なファイルを除き
cpmsim: obj/cpmsim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o
$(CC) $(LFLAGS) obj/sim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o -o cpmsim
[2]undefined reference to `float64_to_floatx80'
>/usr/bin/ld: obj/m68kcpu.o: in function `load_pack_float80':
> m68kcpu.c:(.text+0x480): undefined reference to `float64_to_floatx80'
float64_to_floatx80はsoftfloat/softfloat.c 内の関数のようだ。68000ではfloatは関係ないのだけど。
仕方ないのでsoftfloat.cをコンパイルしリンクするように変更
cpmsim: obj/cpmsim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o softfloat/softfloat.o
$(CC) $(LFLAGS) obj/sim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o softfloat/softfloat.o -o cpmsim
softfloat/softfloat.o: softfloat/softfloat.c softfloat/softfloat.h softfloat/softfloat-specialize softfloat/softfloat-macros m68kcpu.h
$(CC) $(CFLAGS) softfloat/softfloat.c -o softfloat/softfloat.o
[3]undefined reference to `sincos'
>m68kcpu.c:(.text+0x3fe5): undefined reference to `sincos'
sincosは math ライブラリなので、-lmをつける
cpmsim: obj/cpmsim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o softfloat/softfloat.o
$(CC) $(LFLAGS) obj/sim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o softfloat/softfloat.o -o cpmsim -lm
[4]コンパイルは成功するが実行するとSegmentation fault
>$ ./cpmsim
>Read 32768 bytes from boot track
>Segmentation fault
ググると http://davesrocketworks.com/electronics/cpm68/simulator.html で
>I received a report of segmentation violations when built using V3.4 of
> the Mushashi source. (I used 3.3) Upon investigation I found a thinly documented change
> to the initialization code. The README doesn't say anything but the example added
> some new code. So if you use V3.4 you need to add this just before the call to
> m68k_pulse_reset() in cpmsim.c:
これに従い
m68k_init();
m68k_set_cpu_type(M68K_CPU_TYPE_68000);
をm68k_pulse_reset()の直前に入れて動くようになった。
とはいうもののwarningはうっとおしい。
[5]overflow
>cpmsim.c:739:11: warning: 'read' writing 16777216 bytes into a region of size 16752640 overflows
> the destination [-Wstringop-overflow=]
>739 | if((i = read(fd, &g_ram[0x6000], MAX_RAM+1)) == -1)
g_ramは「unsigned char g_ram[MAX_RAM+1]」と宣言されているので、これだとオーバーするなあ。
そこで read(fd, &g_ram[0x6000], MAX_RAM+1-0x6000) とした。(fdはsimbios.bin 32.8KBなので問題ない)
[6]unused-variable
>obj/m68kops.c:36709:13: warning: unused variable 'cycle_cost' [-Wunused-variable
m68k_in.cで以下のようになっている。
>void m68ki_build_opcode_table(void)
>{
> const opcode_handler_struct *ostruct;
> int cycle_cost;
> int instr;
ところが、関数後半部分で
>/* SBF: don't add it here or the costs are added twice!
とコメントアウトされており、cycle_costが使用されなくなっている
そこで宣言をコメントアウト
これでやっとwarningがなくなった。
$ ./cpmsim
Read 32768 bytes from boot track
CP/M-68K(tm) Version 1.2 03/20/84
Copyright (c) 1984 Digital Research, Inc.
CP/M-68K BIOS Version 1.0
Simulated system of April 2014
TPA =16251 K
C>AUTOST.SUB
C>INIT.REL M
Do you really want to init disk M ?
C>
と正常に起動した
skyriverさんのブログ(https://piclabo.blog.ss-blog.jp/2018-07-22)
@hi631(Hiromichi Kitahara)さんのqiita https://qiita.com/hi631/items/577d943adbe9b03dce1c
を参考にしました。
---使用するファイル--------
・Musashi
https://github.com/kstenerud/Musashi
・CP/M-68K Simulator
http://davesrocketworks.com/electronics/cpm68/simulator.html
----------
Musashi-master.zipを展開し、cpmsim.zipを展開したもので上書き。(m68kconf.hだけ同じ名前のファイルがある)
ところがコンパイルエラーが多発。Musashiがバージョンアップして不整合が起きているような感じ。
cpmsim.zipはMusashiのバージョン3.3を想定しているようだが、現在のMusashiはバージョン4.6
エラーとその対応
[1]'obj/m68kopac.c' を make するルールがありません
>make: *** 'obj/m68kopac.o' に必要なターゲット 'obj/m68kopac.c' を make するルールがありません. 中止.
色々warningが出るが結局このエラーで止まる。m68kopac.cなどどこにもない。
makefileを調べて見ると以前は「obj/m68kmake obj m68k_in.c」によりobj/m68kops.c、obj/m68kopac.c、
obj/m68kopdm.c、obj/m68kopnz.cを生成していたようだが、現在のバージョンでは obj/m68ops.c しか作っていない。
(すべてm68kops.cに含まれているようだ)
MUSASHI Version3.3の m68kmake.c
/* Default filenames */
#define FILENAME_INPUT "m68k_in.c"
#define FILENAME_PROTOTYPE "m68kops.h"
#define FILENAME_TABLE "m68kops.c"
#define FILENAME_OPS_AC "m68kopac.c"
#define FILENAME_OPS_DM "m68kopdm.c"
#define FILENAME_OPS_NZ "m68kopnz.c"
MUSASHI Version4.6の m68kmake.c
/* Default filenames */
#define FILENAME_INPUT "m68k_in.c"
#define FILENAME_PROTOTYPE "m68kops.h"
#define FILENAME_TABLE "m68kops.c"
そこで
cpmsim: obj/cpmsim.o obj/m68kcpu.o obj/m68kops.o obj/m68kopac.o obj/m68kopdm.o obj/m68kopnz.o m68kdasm.o
$(CC) $(LFLAGS) obj/sim.o obj/m68kcpu.o obj/m68kops.o obj/m68kopac.o obj/m68kopdm.o obj/m68kopnz.o m68kdasm.o -o cpmsim
から不要なファイルを除き
cpmsim: obj/cpmsim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o
$(CC) $(LFLAGS) obj/sim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o -o cpmsim
[2]undefined reference to `float64_to_floatx80'
>/usr/bin/ld: obj/m68kcpu.o: in function `load_pack_float80':
> m68kcpu.c:(.text+0x480): undefined reference to `float64_to_floatx80'
float64_to_floatx80はsoftfloat/softfloat.c 内の関数のようだ。68000ではfloatは関係ないのだけど。
仕方ないのでsoftfloat.cをコンパイルしリンクするように変更
cpmsim: obj/cpmsim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o softfloat/softfloat.o
$(CC) $(LFLAGS) obj/sim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o softfloat/softfloat.o -o cpmsim
softfloat/softfloat.o: softfloat/softfloat.c softfloat/softfloat.h softfloat/softfloat-specialize softfloat/softfloat-macros m68kcpu.h
$(CC) $(CFLAGS) softfloat/softfloat.c -o softfloat/softfloat.o
[3]undefined reference to `sincos'
>m68kcpu.c:(.text+0x3fe5): undefined reference to `sincos'
sincosは math ライブラリなので、-lmをつける
cpmsim: obj/cpmsim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o softfloat/softfloat.o
$(CC) $(LFLAGS) obj/sim.o obj/m68kcpu.o obj/m68kops.o m68kdasm.o softfloat/softfloat.o -o cpmsim -lm
[4]コンパイルは成功するが実行するとSegmentation fault
>$ ./cpmsim
>Read 32768 bytes from boot track
>Segmentation fault
ググると http://davesrocketworks.com/electronics/cpm68/simulator.html で
>I received a report of segmentation violations when built using V3.4 of
> the Mushashi source. (I used 3.3) Upon investigation I found a thinly documented change
> to the initialization code. The README doesn't say anything but the example added
> some new code. So if you use V3.4 you need to add this just before the call to
> m68k_pulse_reset() in cpmsim.c:
これに従い
m68k_init();
m68k_set_cpu_type(M68K_CPU_TYPE_68000);
をm68k_pulse_reset()の直前に入れて動くようになった。
とはいうもののwarningはうっとおしい。
[5]overflow
>cpmsim.c:739:11: warning: 'read' writing 16777216 bytes into a region of size 16752640 overflows
> the destination [-Wstringop-overflow=]
>739 | if((i = read(fd, &g_ram[0x6000], MAX_RAM+1)) == -1)
g_ramは「unsigned char g_ram[MAX_RAM+1]」と宣言されているので、これだとオーバーするなあ。
そこで read(fd, &g_ram[0x6000], MAX_RAM+1-0x6000) とした。(fdはsimbios.bin 32.8KBなので問題ない)
[6]unused-variable
>obj/m68kops.c:36709:13: warning: unused variable 'cycle_cost' [-Wunused-variable
m68k_in.cで以下のようになっている。
>void m68ki_build_opcode_table(void)
>{
> const opcode_handler_struct *ostruct;
> int cycle_cost;
> int instr;
ところが、関数後半部分で
>/* SBF: don't add it here or the costs are added twice!
とコメントアウトされており、cycle_costが使用されなくなっている
そこで宣言をコメントアウト
これでやっとwarningがなくなった。
$ ./cpmsim
Read 32768 bytes from boot track
CP/M-68K(tm) Version 1.2 03/20/84
Copyright (c) 1984 Digital Research, Inc.
CP/M-68K BIOS Version 1.0
Simulated system of April 2014
TPA =16251 K
C>AUTOST.SUB
C>INIT.REL M
Do you really want to init disk M ?
C>
と正常に起動した
※コメント投稿者のブログIDはブログ作成者のみに通知されます