CMTファイル pcg3.zip

org	$d000
 
;-------+-------+-------+-------+-------+
 
main	proc
	local	L1,L2
 
	call	genpat
	call	inipcg
	call	inisnd
 
L1:
	in	a, ($40)
	and	$20
	jp	nz, L1
L2:
	in	a, ($40)
	and	$20
	jp	z, L2
 
	call	play
	call	input
	call	putobj
 
	jp	L1
	endp
 
;-------+-------+-------+-------+-------+
; パターン生成
genpat	proc
	local	L1,L2
 
	ld	ix, cannon
	ld	de, 16
	ld	c, 7
L1:
	ld	b, 8
L2:
	ld	a, (ix+0)
	srl	a
	ld	(ix+24), a
	ld	a, (ix+8)
	rra
	ld	(ix+32), a
	ld	a, (ix+16)
	rra
	ld	(ix+40), a
	inc	ix
	djnz	L2
 
	add	ix, de
	dec	c
	jp	nz, L1
 
	ret
	endp
 
;-------+-------+-------+-------+-------+
; PCG初期化
inipcg	proc
	local	L1
 
	ld	c, 0
	ld	b, 8*5
L1:
	xor	a
	out	($00), a
	ld	a, c
	out	($01), a
	ld	a, $10
	out	($02), a
	ld	a, $00
	out	($02), a
	inc	c
	djnz	L1
 
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
inisnd	proc
 
	ld	a, 1
	ld	(tick), a
	ld	hl, data
	ld	(p_data), hl
	ld	a, $36
	out	($0f), a
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
input	proc
	local	L1,L2
 
	in	a, ($00)
	ld	c, a
	ld	a, (posx)
	bit	4, c
	jp	nz, L1
	dec	a
L1:
	bit	6, c
	jp	nz, L2
	inc	a
L2:
	ld	(posx), a
	ret
	endp
 
;-------+-------+-------+-------+-------+
; オブジェクト配置
putobj	proc
	local	L1,L2
 
	ld	a, (posx)
	rra
	rra
	and	$3e		; x = posx >> 3
	ld	b, 0
	ld	c, a
	ld	hl, $f300+120*12
	add	hl, bc		; hl = $f300 + 120*y + 2*x
	ld	a, $80
	ld	b, 5
L1:
	ld	(hl), a
	inc	hl
	inc	hl
	inc	a
	djnz	L1
 
	ld	a, (posx)
	and	$07		; u = posx & $07
	add	a, a
	add	a, a
	add	a, a
	ld	c, a
	add	a, a
	add	a, c
	ld	b, 0
	ld	c, a
	ld	hl, cannon
	add	hl, bc		; hl = cannon + 24 * u
	ld	c, 8
	ld	b, 8*3
L2:
	ld	a, (hl)
	out	($00), a
	ld	a, c
	out	($01), a
	ld	a, $18
	out	($02), a
	ld	a, $08
	out	($02), a
	inc	hl
	inc	c
	djnz	L2
 
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
play	proc
	local	L1,L2,L3,EXIT
 
	ld	a, (tick)
	dec	a
	jp	nz, L3
				; tickが0ならdata処理
	ld	hl, (p_data)
L1:
	ld	e, (hl)		; 音番号
	inc	hl
	ld	a, e
	cp	$ff
	jp	nz, L2
				; 音番号が$ffなら先頭に戻る
	ld	hl, data
	jp	L1
L2:
	ld	(p_data), hl
	ld	a, 6
	ld	(tick), a
	ld	a, e
	add	a, a
	ld	h, 0
	ld	l, a
	ld	de, tone
	add	hl, de		; hl = tone + 2 * 音番号
 
	ld	c, $0c
	outi
	outi
;	ld	a, $08
;	out	($02), a
	jp	EXIT
L3:
	ld	(tick), a
EXIT:
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
posx	db	128
tick	ds	1
p_data	ds	2
 
;		C     C#    D     D#    E     F     F#    G     G#    A     A#    B
tone	dw	    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0
	dw	    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0
	dw	    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0
	dw	15289,14431,13621,12857,12135,11454,10811,10204, 9631, 9091, 8581, 8099
	dw	 7645, 7215, 6810, 6428, 6067, 5727, 5405, 5102, 4816, 4545, 4290, 4050
	dw	 3822, 3608, 3405, 3214, 3034, 2863, 2703, 2551, 2408, 2273, 2145, 2025
 
;		音番号
data	db	48,60,59,60,64,60,59,60
	db	48,60,58,60,64,60,58,60
	db	48,60,57,60,64,60,57,60
	db	48,60,56,60,64,60,58,60
	db	$ff
 
cannon	db	$02,$07,$07,$7f,$ff,$ff,$ff,$ff
	db	$00,$00,$00,$f0,$f8,$f8,$f8,$f8
	db	$00,$00,$00,$00,$00,$00,$00,$00
	ds	24*7
 
最終更新:2019年10月29日 18:37
添付ファイル