PlayLoud!!

Since1997

モトス改造

しばらく前から取り組んでいたモトスにコンティニューを実装する改造。何とかなった感じですね。
あ、以下実機で動かしてます。

コンティニュー自体は簡単に実装できたのですが、実際に遊んでみると色々と課題が出てきてう〜んと悩んでしまったり。
まず、単にコンティニューだけだとパーツがなくなってしまうのでクリアできなくなってしまう。

で、パーツ数も保存することにしたんだけど、それでも課題山積。
・パーツ数保存のタイミングによって、前の面で使ったパーツが減算されなかったり、逆にコンティニューで復活したパーツが取り放題になったりする
・ゲームオーバー後にデモ画面を通過することで、パーツ数と面数がデモ画面のものに書き換えられる
・途中までプレイしていた面数をリセットするルーチンをnopで潰したことで、ハイスコア表示も更新されないようになってしまう
・面数保存のタイミングの都合で、面数を-1しなければならないのだが、6809は減算時に16進数→10進数変換のDAA命令が使えない
・そもそも空いていそうなメモリが、割り込みベクタ直前の81バイトしかないのでプログラムを収めるのが大変
そんな感じで苦労しながらもなんとか完成!

ジャンプ!ジャンプ!w

クリアしました!

しかし、改めてこのゲームはこんなに難しくていいのだろうかと思ったり……
改造プログラムのソースは以下のとおりですね。

00001 C2A3              		org	$c2a3			;STARTボタンルーチン
00002 C2A3 163CF9       		lbra	mod_start
00003 C2A6 12           		nop
00004 C2A7 12           		nop
00005 C2A8 12           		nop
00006 C2A9              		
00007 CE35              		org	$ce35			;パーツ数減算時のデータ保存
00008 CE35 16318C       		lbra	data_store
00009 CE38              		
00010 CA20              		org	$ca20			;1Pstart時のデータ復帰
00011 CA20 163594       		lbra	data_restore
00012 CA23 12           		nop
00013 CA24 0F2E         		clr		$2e
00014 CA26              		
00015 FF9F              		org	$ff9f			;STARTボタンルーチン
00016 FF9F              mod_start	
00017 FF9F 8404         		anda	#$04		;1Pstart押しているか?
00018 FFA1 1027C264     		lbeq	$c209		;押してなければ本来のループ先へ
00019 FFA5              
00020 FFA5 B64803       		lda		$4803		;入力チェック
00021 FFA8 8401         		anda	#$01		;ボタン押しているか?
00022 FFAA 2708         		beq		skip2		;押していなければskip2
00023 FFAC 4F           		clra				;押していれば最初から
00024 FFAD 5F           		clrb
00025 FFAE FD1F02       		std		pow_save	;パーツ数に0を書き込み
00026 FFB1 FD1F00       		std		men_save
00027 FFB4              skip2
00028 FFB4 16C2F2       		lbra	$c2a9		;本来の処理に戻る
00029 FFB7              
00030 FFB7              data_restore
00031 FFB7 FC1F02       		ldd		pow_save	;データ復帰、パーツ数読み出し
00032 FFBA DD2C         		std		$2c			;パーツ数書き込み
00033 FFBC FC1F00       		ldd		men_save	;面数読み出し
00034 FFBF DD29         		std		$29			;面数書き込み
00035 FFC1 16CA60       		lbra	$ca24		;本来の処理に戻る
00036 FFC4              		
00037 FFC4              data_store
00038 FFC4 9619         		lda		$19			;デモ中フラグ読み出し
00039 FFC6 2621         		bne	skip3			;0以外=デモ中ならデータ保存しない
00040 FFC8 9628         		lda		$28			;死んだ後かどうかフラグ読み出し
00041 FFCA 271D         		beq	skip3			;0=一回死んだ後ならデータ保存しない
00042 FFCC 9629         		lda		$29			;現在の面数取り出し
00043 FFCE 4A           		deca				;面数がincされるのであらかじめdec
00044 FFCF B71F00       		sta		men_save	;面数保存
00045 FFD2 962A         		lda		$2a			;面表示読み出し
00046 FFD4 4A           		deca				;面表示減算
00047 FFD5 1F89         		tfr		a,b			;bにaをコピー
00048 FFD7 840F         		anda	#$0f		;aの下位4ビットを見る
00049 FFD9 810F         		cmpa	#$0f		;10進数変換
00050 FFDB 1E89         		exg		a,b
00051 FFDD 2602         		bne		skip
00052 FFDF 8006         		suba	#$06
00053 FFE1              skip
00054 FFE1 B71F01       		sta		disp_save	;面数表示保存
00055 FFE4 DC2C         		ldd		$2c			;パーツ数取り出し
00056 FFE6 FD1F02       		std		pow_save	;パーツ数保存
00057 FFE9              skip3				
00058 FFE9 CC0100       		ldd		#$0100		;本来のルーチン
00059 FFEC 16CE49       		lbra	$ce38		;本来の処理に戻る
00060 FFEF              		
00061 1F00              		org		$1f00		;データ保存用バッファ
00062 1F00              men_save
00063 1F00              		rmb		1
00064 1F01              disp_save
00065 1F01              		rmb		1
00066 1F02              pow_save
00067 1F02              		rmb		1
00068 1F03              jump_save
00069 1F03              		rmb		1
00070 1F04              		
00071 1F04              		end

SYMBOL TABLE

FF9F 0 MOD_STAR   FFB4 0 SKIP2      FFB7 0 DATA_RES   FFC4 0 DATA_STO
FFE1 0 SKIP       FFE9 0 SKIP3      1F00 0 MEN_SAVE   1F01 0 DISP_SAV
1F02 0 POW_SAVE   1F03 0 JUMP_SAV   

Total symbol=10
Total errors=0