何とか庵日誌

本名荒井が毒にも薬にもならないことを書きつづるところ

マシン語でゲーム移植中

f:id:fukenko:20140925015008p:plain


先日MSX-Cにプロポシェの「DOWNDOWN」を移植したのに続いて、今度はマシン語で「DOWNDOWN2」を作ってみようと試行錯誤してます。
ひとまず動いてそれなりに遊べるようになりましたが、リストがゴチャゴチャだったり冗長だったり速すぎたりで、もっと改良する予定。
現在のアセンブリリストのソースは以下のとおりです。Simple ASMでアセンブルできますが、たぶんM80でも大丈夫でしょう(おい)。
苦心したのは乱数発生処理。Baaさんの「超暇人MSX」で紹介している、日高徹さんの書籍に載っていたという方法を使ってます*1
かんたんなものでもうんうん言いながらいろいろこさえてみると、よい勉強になりますな。


;--- マシンゴ デ DOWNDOWN2

RDVRM: EQU 004AH
WRTVRM: EQU 004DH
LDIRVM: EQU 005CH
CHGMOD: EQU 005FH
CHPUT: EQU 00A2H
BREAKX: EQU 00B7H
POSIT: EQU 00C6H
GTSTCK: EQU 00D5H
GTRIG: EQU 00D8H


XZAHYO: EQU 09120H
RTANE: EQU 09121H
RNDVAL: EQU 09124H
SCORE: EQU 09128H
SCORES: EQU 09125H
SZAHYO: EQU 0118H

ORG 9000H

;--- ガメン ショキカ

INIT: LD A,01H
CALL CHGMOD ;SCREEN 1
LD A,20H
LD (0F3B0H),A ;WIDTH 32

;--- ランスウ ショキカ

LD HL,0ACE1H ;タネ ノ ジュンビ
LD (RTANE),HL
XOR A
LD (RNDVAL),A

;--- スコア リセット

LD HL,SCORE
LD B,4
LOOP1: LD (HL),A
DEC HL
DJNZ LOOP1


;--- X ザヒョウ ショキカ

LD A,0FH
LD (XZAHYO),A

;--- スクロール ジュンビ

LD H,31
LD L,24
CALL POSIT

;--- ジキ ノ ヒョウジ

MAIN: LD A,(XZAHYO)
ADD A,20H
LD H,19H
LD L,A
LD A,56H
CALL WRTVRM

;--- カベ ヒョウジ

LD HL,KABE
LD A,(RNDVAL)
ADD A,0E0H
LD D,1AH
LD E,A
LD BC,0003H
CALL LDIRVM

LD A,0AH
CALL CHPUT

;--- キー ニュウリョク

INPUT: XOR A ;LD A,00H ノ カワリ
CALL GTSTCK
CP 03H
JR Z,RIGHT
CP 07H
JR Z,LEFT

;CALL デ ヨビダスト フッキジ CPメイレイ デ
;A ガ ヒッカカッテ セイジョウ ドウサ シナイ

;--- オマケ ノ Break ショリ

CALL BREAKX
JR NC,RND
RET

;--- ミギ イドウ

RIGHT: LD A,(XZAHYO)
CP 1FH
JR Z,REND
INC A
LD (XZAHYO),A
REND: JR RND

;--- ヒダリ イドウ

LEFT: LD A,(XZAHYO)
CP 00H
JR Z,LEND
DEC A
LD (XZAHYO),A
LEND: JR RND

;--- ランスウ ケイサン

RND: LD HL,(RTANE)

LD D,H
LD E,L

ADD HL,HL
ADD HL,HL
ADD HL,DE ;タネ ヲ 5バイ スル
LD DE,0200H
ADD HL,DE
LD (09121H),HL ;ケッカ 9121H-9122H ニ カクノウ

;--- ワリザン デ ランスウ ヲ シボル

LD HL,(09122H) ;L ニ ランスウ ジョウイ 1バイト ヲ ダイニュウ
LD C,30 ;モトメル ランスウ ノ ハンイ ヲ シテイ
CALL DIV8
LD (09123H),HL ;ランスウ ヲ 9124H ニ ホカン
JR ICHI

DIV8: LD H,0
LD B,8

LOOP2: ADD HL,HL
LD A,H
SUB C
JR C,NEXT
INC L
LD H,A
NEXT: DJNZ LOOP2
RET

;--- スコア カサン
;-- 1 ノ クライ カウント

ICHI: LD HL,SCORE
LD A,(SCORE)
INC A
CP 0AH
JR Z,JU
LD (HL),A
JR COLLI

;-- 10 ノ クライ カウント

JU: XOR A
LD (HL),A
DEC HL

LD A,(HL)
INC A
CP 0AH
JR Z,HYAKU
LD (HL),A
JR COLLI

;-- 100 ノ クライ カウント

HYAKU: XOR A
LD (HL),A
DEC HL

LD A,(HL)
INC A
CP 0AH
JR Z,SEN
LD (HL),A
JR COLLI

;-- 1000 ノ クライ カウント

SEN: XOR A
LD (HL),A
DEC HL

LD A,(HL)
INC A
CP 0AH
JR Z,COUNST
LD (HL),A
JR COLLI

;-- カンスト ショリ

COUNST: LD A,09H
LD B,4
LOOP3: LD (HL),A
INC HL
DJNZ LOOP3
JR GOVER


;--- アタリハンテイ

COLLI: LD A,(XZAHYO)
ADD A,20H
LD H,19H
LD L,A
CALL RDVRM
CP 0DBH
JP NZ,MAIN

;--- ゲームオーバー

GOVER: LD HL,SZAHYO
CALL POSIT
LD B,4
LD HL,SCORES
LOOP4: LD A,(HL)
ADD A,30H
CALL CHPUT
INC HL
DJNZ LOOP4

;--- リプレイ

REPLAY: XOR A
CALL GTRIG
CP 0FFH
JP Z,INIT
JR REPLAY

;--- カベ データ

KABE: DEFM 'ロロロ'

END

*1:線形合同法に近いアルゴリズムのようです