【MSX】GLORIOUS FORCE と DumpListEditorの強力な機能&プログラム確認用データ(For MSX FAN)

GLORIOUS FORCE

f:id:uniskie:20220301211914p:plain

グロリアスフォース」
MSX(要RAM32KB/CasetteTape専用)
コマンド戦闘型RPG

月刊ログイン 1987年7月号掲載:
ソフトウェアコンテストグランプリ作品

 

グロリアスフォース」はTAKERUで販売されていたMSX用の良作RPG「ラドラの伝説」の前身となる作品で、こちらもグラフィックのセンスが飛びぬけています。

f:id:uniskie:20220301212029p:plain

なんとリストを打ち込むだけでこんなかっこいい画面で遊べます。

 

このゲームはラドラの伝説のタイトル画面をツイートしたところ、そこで教えていただいたもので、

おこのみ実験場~「投稿ゲーム再発見『グロリアスフォース』」 (psyzans.com)

おこのみ実験場さんで詳細が紹介されています。

 

(↓参考までにこちらがラドラの伝説のタイトル画面)

f:id:uniskie:20220305095440p:plain

ラドラの伝説(MSX1 DISK / ソフトベンダーTAKERUで販売)

■ リスト打ち込み作業

f:id:uniskie:20220305100138j:plain

月刊ログイン 1987年7月号に掲載されていたリストをOCR併用で打ち込みました。

f:id:uniskie:20220301212709p:plain

印刷は0とOが見分けづらく、OCRでは「0」(ゼロ)を「O」(オー)、8(数字の八)を0(ゼロ)と間違えがちで結構苦労しました。

肉眼だと細さやサイズの違いでオーとゼロの違いは分かるのですが、OCRは制御方法がよくわからないので、OCR変換された後のものを雑誌と見比べながら修正していきました。

(それでも、1から入力するのに比べたら遥かに楽です!)

 

今回の作業には「Program List OCR」「Scan Tailor」「Dump List Editor」 を使用しました。

手順は

  1.  スキャナで取り込み
  2.  Scan Tailorで画像補正
  3.  Program List OCRでテキストデータに変換
  4.  Dump List Editorでテキスト修正&casファイル化

でした。

 

ProgramListOCRの使い方はこちら:
Program List OCR 1.0.0リリース!: 808 Midway (seesaa.net)

Dump List Editorはこちら:
PC-8001を懐かしむページ (ojaru.jp)

 

■ 想像の10倍は強力だったDumpListEditorの機能

DumpListEditorは強力な機能を満載しています。
触ってみるととんでもない便利さにびっくりすると思います。

f:id:uniskie:20220302022624p:plain

MSX-BASICにも強力な対応。特殊文字も平気。
  • MSX-BASICを含めた各種BASICの文法解析(とエラー箇所表示)
  • BASICで使用されている変数リスト出力
  • テキストとBASファイルの相互変換
  • MSXFANファンダムのプログラムチェックデータ出力
  • 各種雑誌のダンプリスト方式(ログインも対応)のチェックサム解析(とエラー箇所表示)
  • ダンプリストとバイナリファイルの相互変換
  • アセンブルソースとバイナリファイルの相互変換
  • 行番号やアドレスの抜けチェック
  • MSX-BASIC独自の文字コードへの自動変換(全角文字をMSX文字コードに変換してくれる。コピーペーストでもファイル入出力でもできる。)

f:id:uniskie:20220302022946p:plain

各種ダンプリスト形式へ対応

f:id:uniskie:20220302022830p:plain

DSKイメージやCASイメージの作成や中身の編集も可能

 

元々はP6やP8用だったようなのですが、MSXにも追加で対応されたものです。
MSXユーザーからしても相当な高機能でとんでもない便利ソフトです。

 

OCRでは誤認識が少ないほうが良い為、
使用する文字種が少ないダンプリストの方が、
BASICリストより楽に完成させることができました。

(どちらも8→0、B↔8を誤認識する場合がありますが、ダンプリストは1↔l、O↔0、S↔5の誤認識を心配せずに済みます。)

 

とにかく、雑誌を見ながら
修正したら「チェック!」ボタン。
修正したら「チェック!」ボタン。

この繰り返しでどんどん問題が減っていくわけですね。
DumpListEditorが無かったらきっとくじけていたと思います。

■ 変数リストの使い方

f:id:uniskie:20220302022728p:plain

該当箇所のエラー表示以外も、変数リストが思いのほか強力でした。

構文解析で変数リストを出してくれるのですが、
例えば、「GOSUB」を打ち間違えて「G05UB」になっていた場合、変数として変数リストに出力されるので一目で分かります。

■ファンダムプログラムチェッカー機能の使い方

f:id:uniskie:20220302022634p:plain

また、ファンダムプログラムチェッカー機能があるので、このチェックデータを比較すれば、間違っている行がすぐわかるという寸法です。

そのためには、先に正常に打ち込みを完成した人にプログラムチェッカーデータを教えてもらう必要があります。

で。

これが、今回の本題になりますが、
自分の打ち込んだものと比較してくれる人を募集しております(笑)

宜しければ比較して教えてください。

自分のうちこんだBGFというファイル名のBASICプログラムのチェックデータはこちらになります。

 

※ 一部余計なコメントが紛れ込んでいたため、2022/03/02 02:20 更新しました。

 

2022/03/05  本名荒井 (id:fukenko)さんが比較検証してくださいました!

fukenko.hatenablog.com

 

結果、2か所、自分の打ち込み間違いが判明し修正することが出来ました。
ありがとうございます!

参考用に、どういう間違いだったかも掲載しておきます。
OCRだとこういう感じで意外と予想外な誤変換があったりしますね。

f:id:uniskie:20220305025328p:plain

f:id:uniskie:20220305025336p:plain

 1890> 1 0ss3 ※間違い

 3060>156 Pwh0 ※間違い

こういった流れも、これから打ち込みをされる方の参考になれば幸いです。

荒井さんありがとうございました!

↓ 修正後のプログラム確認用データ

---------プログラム確認用データ(For MSX FAN)
 1000>207	C8H0
 1010>255	NI60
 1020> 73	Oa40
 1030> 38	0lH0
 1040>242	T480
 1050>231	xqD0
 1060>199	xmA0
 1070>169	rE00
 1080>253	Do80
 1090>236	JR30
 1100>190	Ori0
 1110>143	7i60
 1120>  1	el10
 1130>127	jCJ0
 1140>191	M410
 1150>138	MCN0
 1160>218	Hj70
 1170>143	w310
 1180> 15	5kS0
 1190>175	E410
 1200> 96	R1U0
 1210>205	Hj70
 1220> 48	e5w0
 1230> 74	Mh70
 1240>208	twI0
 1250>249	cXg1
 1260>  4	kIS1
 1270> 14	1WS0
 1280>165	MUs0
 1290> 77	8tJ3
 1300> 59	xbi0
 1310>184	CV40
 1320>106	hWG0
 1330>186	wHd0
 1340>145	P700
 1350>  2	ef10
 1360> 57	RIL0
 1370>252	8670
 1380> 38	GDi0
 1390> 40	4s40
 1400> 79	6dK0
 1410>206	4e20
 1420> 19	Z600
 1430> 93	JV00
 1440>119	e520
 1450>153	8GE0
 1460>218	Asj0
 1470>247	Dt80
 1480> 19	UMS0
 1490> 47	D4H0
 1500> 41	quS2
 1510>198	M200
 1520> 93	fHr0
 1530>186	9530
 1540> 34	8dN0
 1550> 22	e350
 1560>235	7U41
 1570>136	bbX1
 1580>242	3U60
 1590>215	I3F0
 1600>245	9D70
 1610> 37	JS00
 1620> 40	rGE1
 1630>224	vU40
 1640>196	u341
 1650>242	3U60
 1660> 19	kq60
 1670>227	le91
 1680> 64	k6i0
 1690> 81	Z610
 1700>196	Ch10
 1710> 68	DW61
 1720> 56	iK31
 1730>122	WWs0
 1740> 98	kQ30
 1750> 92	eA00
 1760> 98	fTC0
 1770> 51	MMD0
 1780>253	YCT1
 1790>231	P1w0
 1800> 73	BQM0
 1810>207	NPJ0
 1820> 68	67p0
 1830>102	tZP0
 1840> 59	2P40
 1850>104	CvY0
 1860>189	ilA0
 1870>206	4A40
 1880>  8	9290
 1890>166	Rns3
 1900>214	cFi1
 1910> 67	wVl1
 1920>100	rvD0
 1930>138	bRp1
 1940>195	PsB0
 1950>219	ont0
 1960>147	qH80
 1970>226	uOJ0
 1980> 21	o210
 1990>165	jwQ0
 2000>143	B200
 2010>189	wO40
 2020>193	TZ60
 2030>211	Nu02
 2040>  7	R600
 2050>241	Tg00
 2060>213	7f50
 2070> 41	s220
 2080>  2	jAA0
 2090> 50	dkJ0
 2100>207	cN90
 2110> 42	OEA0
 2120> 47	xM31
 2130> 10	Zxb0
 2140>245	PbB0
 2150> 17	EBr0
 2160>194	BDa0
 2170>191	2lV0
 2180> 65	IYh0
 2190> 67	npB0
 2200>239	eWG0
 2210>206	omF1
 2220>199	tCR1
 2230>166	Dd00
 2240>180	b0S0
 2250>199	ORP0
 2260>162	hBB0
 2270> 67	C260
 2280>194	EsY0
 2290> 68	ZsY0
 2300> 41	XTF0
 2310> 19	kJu0
 2320>135	Wx10
 2330>111	sf10
 2340> 79	N300
 2350>188	mr10
 2360> 73	9c00
 2370>190	IjM0
 2380> 47	7E00
 2390>111	rxG0
 2400>198	OLX0
 2410>236	oZJ0
 2420>176	l3Y1
 2430> 61	XI00
 2440>208	WH00
 2450> 93	4E10
 2460> 27	U6B0
 2470>210	aO30
 2480> 74	WFO0
 2490>255	Bdh0
 2500>226	P4W0
 2510> 99	DYI0
 2520> 41	uCa0
 2530>152	GjH0
 2540>104	Oni0
 2550> 37	JS00
 2560>113	U510
 2570>212	TVF0
 2580>232	Jf74
 2590>234	6Sn0
 2600>179	ndH0
 2610> 66	BiD0
 2620> 84	0L50
 2630>237	ss10
 2640> 12	ICB0
 2650> 15	5Y10
 2660> 39	moi1
 2670> 76	t760
 2680>133	kKU0
 2690> 27	sf30
 2700> 25	r760
 2710>153	7hL0
 2720> 95	dC01
 2730> 60	B8k0
 2740>240	H430
 2750>164	Wl00
 2760> 63	p270
 2770>164	qA90
 2780>143	B200
 2790> 51	wZO0
 2800> 53	f310
 2810> 27	9ws0
 2820> 21	4ph1
 2830>153	Y9A0
 2840> 90	7f00
 2850>115	E5g0
 2860> 51	Wt10
 2870>173	ad50
 2880> 19	C620
 2890> 35	I260
 2900>155	gbg0
 2910> 50	rOm0
 2920>130	kaf0
 2930>171	jMF1
 2940>142	n6d0
 2950>181	tgJ0
 2960> 53	2lg0
 2970> 40	QmW0
 2980>175	s240
 2990>252	4Z30
 3000> 80	gIL0
 3010>234	f1B0
 3020>225	REM0
 3030>189	6W10
 3040>175	UZ20
 3050>229	eNB0
 3060> 43	0hg0
 3070> 43	rYH0
 3080>144	YvM0
 3090>226	5oi2
 3100> 76	lW11
 3110> 60	RTG0
 3120> 58	OGo2
 3130>210	rvL0
 3140> 38	wdD0
 3150>206	IJa1
 3160> 48	nuB0
 3170> 44	or40
 3180> 21	twE0
 3190> 72	fAf0
 3200> 82	hG90
 3210>138	0k70
 3220>126	mQv0
 3230> 93	K750
 3240>186	MkE0
 3250>210	8MK4
 3260>236	NW50
 3270>111	wX40
 3280>207	Uf30
 3290> 50	jXV1
 3300> 48	xPO0
 3310>229	fj60
 3320> 39	n5A0
 3330> 41	YZ50
 3340>218	pE40
 3350>166	oXD0
 3360>182	iUD0
 3370> 24	SQS0
 3380>187	XD60
 3390>112	bF20
 3400> 39	4e10
 3410> 93	JV00
 3420> 17	7GW0
 3430>186	CHN0
 3440>196	PoB0
 3450> 78	8p20
 3460>226	Zt00
 3470> 14	9f30
 3480> 49	0DF0
 3490>  5	q9f0
 3500>128	eA00
 3510>187	Cu91
 3520> 18	2ow0
 3530>169	wDB1
 3540>240	dRA0
 3550> 46	Vb32
 3560>173	iFT4
 3570>246	Aw01
 3580> 82	R153
 3590>131	cZD0
 3600>142	t8Z3
 3610> 29	7HP0
 3620>228	XSg0
 3630>171	oF90
 3640>  1	P2E0
 3650>237	EX53
 3660> 35	ew70
 3670>143	pDG0
 3680>128	AeP0

 

以上です。

自分が実際に動かして遊んでいるものは、最初の行を

1000 CLEAR:SCREEN1:DEFINTF-Z:DEFSNGA-E,G,M,N,V:ONSTOPGOSUB1510:STOPOFF:GOTO3540

に変更していますが、

チェックデータの方は変更前のプログラムで作成したチェックデータになります。

 

f:id:uniskie:20220301220300p:plain

綺麗ですね~。

今度はちゃんと打ち込みエラーなく動きそうです。

■ プログラムで気になるポイント

プログラムを眺めていて気になったのは文字変数領域のオーバーの可能性です。

LGF(スタートアップ・ロードプログラム)でメモリ範囲宣言CLEAR 80,&HB7FFをしているのですが、BGF(ゲームメインプログラム)で、文字変数の扱いを見ていると文字データの総数が80バイトをオーバーしそうな気がします。

DumpListEditorのBASICコード解析結果の変数リストを参考に軽く調べた感じでは、

■ 内容可変の文字変数:
SA$    VRAMから読み取った4桁の16進数
    FNQ(X,Y)=VPEEK(&H1800+X+Y*32)
A$    汎用。READ、PLAY、MAGIC名
B$    "F2DE2G2RF2GE2C2" 固定?
E$    敵キャラ名。11文字
S$    メッセージ表示用。一時変数
G$    PLAY BGM
PLAY文やPRINT文で文字列を連結する際の一時エリア

■ 内容固定の文字変数:
EX$    "EXIT"
Z$    "ENEMY"
Y$    "YOU DON'T HAVE "
P$    "T255L64V13"
UI$    CHR$(13)
U$    CHR$(34)
NM$(7)    FOOD,WEAPON,DRUG,ITEM,MYSTIC,POW,INN
DA$(18)    ERROR!,STATUS,MAGIC,ITEM,M.SPEED,LOAD,OPEN,CONTROL,END,ATTACK,MAGIC,ITEM,RUNAWAY,EXAMINE,PUSH SPACE!,COMMAND,HERALD,":SLEEPING...",":AWAKED!"

のような感じでした。

 

OpenMSX等で文字列変数領域の中身を表示する機能とかあれば分かりそうですね。
OpenMSXのツールコマンドはスプリプトで記述されていて、動作中のメモリの状態等を読み書き出来るみたいなので、文字変数領域のBASICワークエリア解析とかもできそうですよね。
BASICプログラム開発の役に立つので、既にどなたか作ったりしてないんでしょうか?