PlayLoud!!

Since1997

バトルガレッガ改造

前回の改造でタイトル画面にバージョン表示を入れただけで画面がバグってしまったガレッガ

ゴミが表示されてるわけではなく、垂直帰線期間に表示が間に合わない分が画面上部(縦画面なので左端)に表示されちゃってるみたいです。

エミュレータ上では間に合います。これは今のPCが余裕あるってことでしょうか。

さて、そこでプログラムを改良します。

;ランク値表示入口
	org		$11EE
	jmp		$7fBB0.l
;バージョン表示入口
	org		$2582
	jmp		$7fcfa.l
;メモリチェックエラー分岐潰し
	org		$15A08
	nop
;ランク値表示ルーチン
	org		$7FBB0
	movem.l	D0-D7/A0-A7,-(A7)
;2P START読み込み
	move.b	$21c029,d0
	andi.b	#$40,d0
	beq		push2p
;2P連射防止フラグ
	cmpi.w	#1,$503ff2
	beq		skip0
	move.w	#1,$503ff2
;ランク値表示状態判定(トグル)
	cmpi.w	#1,$503ff0
	beq		disp_off
	move.w	#1,$503ff0
	bra		skip0
disp_off
	move.w	#0,$503ff0
	bra		skip0
push2p	;2PS押されてない
	move.w	#0,$503ff2
skip0
	cmpi.w	#0,$503ff0
	beq		skip3
;ランク値取得
	lea		$10c9d2.l,a0
	lea		$500046.l,a1
	move.w	#$03,d2
;ランク値表示色設定
	move.w	#$d000,d3
	cmpi.l	#$a00000,(a0)
	bcs		loop
	move.w	#$c800,d3
	cmpi.l	#$c00000,(a0)
	bcs		loop
	move.w	#$d400,d3
	cmpi.l	#$d00000,(a0)
	bcs		loop
	move.w	#$cc00,d3
	cmpi.l	#$e00000,(a0)
	bcs		loop
	move.w	#$c400,d3
loop	;ランク値→16進数表示文字コード変換
	move.b	(a0)+,d0
	move.b	d0,d1
	ror		#4,d0
	andi.w	#$000f,d0
	andi.w	#$000f,d1
	addi.w	#$0030,d0
	addi.w	#$0030,d1
	cmpi.w	#$003a,d0
	bcs	skip1
	addi.w	#7,d0
skip1
	cmpi.w	#$003a,d1
	bcs	skip2
	addi.w	#7,d1
skip2	;ランク値表示 VRAM書き込み
	add.w	d3,d0
	add.w	d3,d1
	move.w	d0,(a1)+
	lea		$7E(a1),a1
	move.w	d1,(a1)+
	lea		$7E(a1),a1
	dbra	d2,loop
	bra		skip4
skip3	;ランク値表示消去
	lea		$500046.l,a1
	clr.w	(a1)
	lea		$80(a1),a1
	clr.w	(a1)
	lea		$80(a1),a1
	clr.w	(a1)
	lea		$80(a1),a1
	clr.w	(a1)
	lea		$80(a1),a1
	clr.w	(a1)
	lea		$80(a1),a1
	clr.w	(a1)
	lea		$80(a1),a1
	clr.w	(a1)
	lea		$80(a1),a1
;デモ画面の小タイトル欠け防止
	cmpi.w	#$d1c7,$5003c4
	bne		skip5
	move.w	#$d1b5,$5003c6
	bra		skip4
skip5
	clr.w	(a1)
skip4
	movem.l	(a7)+,d0-d7/a0-a7
	lea		$500000.l,a5
	jmp		$11f4.l
;バージョン表示
	movem.l	D0-D7/A0-A7,-(A7)
;画面に「CO.,LTD」の「C」表示、小タイトル表示検出
;(デモ画面かどうかの判定)
	move.l	a1,d0
	cmpi.l	#$00500a86,d0
	bne		skip2_0
	cmpi.w	#$c043,d3
	bne		skip2_0
	lea		$5008ba,a2
	cmpi.w	#$d22b,(a2)
	beq		skip2_1
	lea		$500b30,a2
	cmpi.w	#$cc56,(a2)
	beq		skip2_0
	bra		skip2_2
skip2_1
	lea		$5008b8,a2
	cmpi.w	#$cc56,(a2)
	beq		skip2_0
skip2_2	;バージョン文字列 VRAM書き込み
	lea		let,a3
	move.w	#6,d0
loop2_0
	move.w	(a3)+,(a2)
	lea		$80(a2),a2
	dbra	d0,loop2_0
skip2_0	;VBlank待ち(本来のルーチンへ帰る前に待ちますよ)
	move.w	$21c03c.l,d7
	bmi     skip3_0
	move.w	$21c03c.l,d7
skip3_0
	cmpi.b	#$f1,d7
	bcs     skip2_0
	cmpi.b	#$fc,d7
	bcc     skip2_0
	movem.l	(a7)+,d0-d7/a0-a7
;本来の処理
	lea		$80(a1),a1
	jmp		$257a.l
let	;バージョン文字列
	.dc.w	$cc56
	.dc.w	$cc65
	.dc.w	$cc72
	.dc.w	$cc2e
	.dc.w	$cc4b
	.dc.w	$cc30
	.dc.w	$cc31
	.end

終わりの方にVBlank待ちを入れただけです。
今まで実行した結果から、バージョン表示自体は間に合っているんだけど、後の方の文字描画が割を食っておかしな場所に表示されているようなので、バージョン表示を描画した後で1回VBlankを待ってから本来の処理に戻るようにしました。
 
キター!

タイトル画面も直ったー!

なんとうまく解決したようです。
無改造のときと比べて、最低で1回分余計にVBlankを待ってしまっているので1/60秒程度の遅延がある理屈ですが、WARNING画面とタイトル画面だけなので問題ないでしょう。
実はゲーム中、デモプレイ中はこのルーチンを一切通らないので余計な処理落ちはかかりません。
一からの設計じゃないので多分に偶然要素がありますが、とりあえずうまく行ったのでよしとしましょうw