ここしばらく「DIAMOND FIELD」のデバグ等でご無沙汰してましたが、忘れていたわけではありません。
なんとか手を入れて、ちゃんと遊べるレベルになりました。マシン語版「DOWNDOWN2」。
オリジナルとはけっこう仕様が違うので、マシン語版と称してよいかは「?」です(おい)。
その後各処理をサブルーチン化してメインルーチンから呼び出すように書き直し、さらにウェイト処理を付けて難易度を落としました。
例によってソースは次のとおりです。
SimpleASMでNLOADしてアセンブルすれば動きます。
;--- マシンゴ デ DOWNDOWN2RDVRM: 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 00D8HXZAHYO: EQU 09120H
RTANE: EQU 09121H
RNDVAL: EQU 09124H
SCORE: EQU 09128H
SCORES: EQU 09125H
SZAHYO: EQU 0118HORG 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: CALL MOVE
CALL WAIT
CALL WALL
CALL INPUTBREAK: CALL BREAKX
RET C ;オマケ ノ Break ショリMAIN2: CALL RND
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,(RNDVAL)
ADD A,0E0H
LD D,1AH
LD E,A
LD BC,0003H
CALL LDIRVMLD 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,LADD 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 ニ ホカン
RETDIV8: LD H,0
LD B,8LOOP2: 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,20H ;A,B ノ スウチ デ ナンイド チョウセツ カ
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
当たり判定からゲームオーバー処理に至るところの流れがちょっと不満(おい)。
今回の一番の目的はマシン語に慣れることでした。順を追って一から積み上げていけば、けっこう理解して作れるものだとしみじみ思いました。オールマシン語のゲームは、ベーマガ世代の憧れですから!