何とか庵日誌

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

「DOWNDOWN」マシン語化した

f:id:fukenko:20141031013004p:plain


 ここで何度か晒している「DOWNDOWN」をようやくマシン語化しました。だいたいは以前晒した「DOWNDOWN2」と同じですが、壁のパターンが違うため、そこだけ別の処理を組まなければなりません。この壁のパターンをマシン語で再現するのに手こずりました。
 オリジナルでは壁の座標変化に論理式を使っています。2は壁の配置を乱数だけでやっているため、そちらの方が実装が楽です。”X=X-(X>1)”みたいな論理式は”IF X-1>0 THEN X=X-1”と、IF文にして考えた方がマシン語に近いということに気付いたら、どう書けば良いのか道が開けました。
 もとはたったの1行BASICプログラムですが、マシン語化するとなると疑似乱数発生処理やスコアの増加・表示処理等を一から自作しなければなりません。試行錯誤しながら自分で組んでみるのは、大変ですが面白いものです。


;--- マシンゴ デ DOWNDOWN1

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 09160H
RTANE: EQU 09161H
RNDVAL: EQU 09164H
KZAHYO: EQU 09165H
SCORES: EQU 09166H
SCORE: EQU 09169H

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
XOR A
LD (KZAHYO),A

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

LD H,31
LD L,24
CALL POSIT

;--- メインルーチン

MAIN: CALL MOVE
CALL WAIT
CALL RND
CALL WALL
CALL INPUT

BREAK: CALL BREAKX
RET C ;オマケ ノ Break ショリ

MAIN2: CALL COUNT
CALL COLLI
JR MAIN

;--- ジキ ノ ヒョウジ

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

;--- カベ ヒョウジ

WALL: LD HL,KABE
LD A,(KZAHYO)
LD B,A
LD A,(RNDVAL)
ADD A,B
SUB 3
JR C,PLUS

OR A
CP 0CH
JR C,PLUS3
JR Z,PLUS3
SUB 3

PLUS3: CP 01H
JR NC,PUTWL
JR Z,PUTWL
PLUS: ADD A,3

PUTWL: LD (KZAHYO),A

ADD A,0E0H
LD D,1AH
LD E,A
LD BC,0012H
CALL LDIRVM
LD A,0AH
CALL CHPUT
RET

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

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

;- ミギ イドウ

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

;- ヒダリ イドウ

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

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

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 (RTANE),HL ;ケッカ 9161H-9162H ニ カクノウ

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

LD HL,(09162H) ;L ニ ランスウ ジョウイ 1バイト ヲ ダイニュウ
LD C,8 ;モトメル ランスウ ノ ハンイ ヲ シテイ
CALL DIV8
LD (09163H),HL ;ランスウ ヲ 9164H ニ ホカン
RET

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

;--- ウェイト

WAIT: LD A,0FFH
WAIT2: LD B,10H ;A,B ノ スウチ デ ナンイド チョウセツ カ 90DBHバンチ
WAIT3: DJNZ WAIT3
DEC A
JR NZ,WAIT2
RET

;--- スコア カサン

COUNT: LD B,4
LD HL,SCORE
LD A,(HL)
INC A
LD (HL),A
COUNT2: CP 0AH
JR Z,CARRY
DJNZ COUNT2
RET

;- クリアガリ

CARRY: XOR A
LD (HL),A
DEC HL
LD A,(HL)
INC A
LD (HL),A
LD A,(SCORES)
CP 0AH
JR Z,COUNST
LD A,(HL)
JR COUNT2

;- カンスト ショリ

COUNST: LD A,09H
LD B,4
LOOP3: LD (HL),A
INC HL
DJNZ LOOP3
POP HL ;スタック ノ クリア
JR GOVER

;--- アタリハンテイ

COLLI: LD A,(XZAHYO)
ADD A,20H
LD H,19H
LD L,A
CALL RDVRM
CP 0DBH
RET NZ
POP HL ;スタック ノ クリア

;- ゲームオーバー

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