石原 博の覚書

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

68k emulator (Musashi)でCP/M 68K

2024-12-23 22:16:01 | 日記
しばらく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>
と正常に起動した


最新の画像もっと見る

コメントを投稿