開発環境

  • Windows 10 Home (64bit)
  • ASM6

ソース

dummy.chr

>fsutil file createNew dummy.chr 8192

snddrv.asm

;asm6 snddrv.asm snddrv.nes
 
seqidx	equ	$00
tick	equ	$01
 
	; iNES header
	db	"NES", $1a
	db	$01	; PRG-ROM
	db	$01	; CHR-ROM
	db	$00	; mapper / mirroring
	dsb	9, $00
 
	base	$c000
Reset:
	lda	#$01
	sta	$4015	; 音声チャンネル制御レジスタ
 
	lda	#$68
;	lda	#$b8
	sta	$4000	; 矩形波CH1制御レジスタ1
	lda	#$00
	sta	$4001	; 矩形波CH1制御レジスタ2
 
	lda	#0
	sta	seqidx
	lda	#1
	sta	tick
 
	lda	#$88
	sta	$2000	; PPU制御レジスタ1
	lda	#$00
	sta	$2001	; PPU制御レジスタ2
-
	jmp	-
 
VBlank:
	dec	tick
	beq	+
	rti
+
	ldx	seqidx
-
	lda	sequence, x	; 音番号
	cmp	#$ff
	bne	+
	ldx	#0
	stx	seqidx
	jmp	-
+
	inc	seqidx
	sec
	sbc	#60
	asl
	tax
	lda	note_tbl, x
	sta	$4002		; 矩形波CH1周波数値レジスタ1
	lda	note_tbl+1, x
	sta	$4003		; 矩形波CH1周波数値レジスタ2
 
	ldx	seqidx
	lda	sequence, x	; 音長
	sta	tick
	inc	seqidx
	rti
 
note_tbl:
	dw	$1ab, $193, $17c, $167, $152, $13f, $12d, $11c, $10c, $fd, $ef, $e1
	dw	$d5
 
sequence:
	db	60,15, 62,15, 64,15, 65,15, 67,15, 69,15, 71,15, 72,15, $ff
;	db	60,12, 62,12, 64,48, 65,12, 64,12, 62,12, 60,12, 64,72, $ff
 
	org	$fffa
	dw	VBlank	; NMI VBlank
	dw	Reset
	dw	0	; IRQ/BRK
 
	incbin	"dummy.chr"
 

snddrv2.asm

;asm6 snddrv2.asm snddrv2.nes
 
seqidx1	equ	$00
seqidx2	equ	$01
tick1	equ	$02
tick2	equ	$03
 
notemin	equ	#46
 
	; iNES header
	db	"NES", $1a
	db	$01	; PRG-ROM
	db	$01	; CHR-ROM
	db	$00	; mapper / mirroring
	dsb	9, $00
 
	base	$c000
Reset:
	lda	#$03
	sta	$4015	; 音声チャンネル制御レジスタ
 
	lda	#$b8
	sta	$4000	; 矩形波CH1制御レジスタ1
	lda	#$00
	sta	$4001	; 矩形波CH1制御レジスタ2
 
	lda	#$b8
	sta	$4004	; 矩形波CH2制御レジスタ1
	lda	#$00
	sta	$4005	; 矩形波CH2制御レジスタ2
 
	lda	#0
	sta	seqidx1
	sta	seqidx2
	lda	#1
	sta	tick1
	sta	tick2
 
	lda	#$88
	sta	$2000	; PPU制御レジスタ1
	lda	#$00
	sta	$2001	; PPU制御レジスタ2
-
	jmp	-
 
VBlank:
	dec	tick1
	bne	exit1
	ldx	seqidx1
-
	lda	sequence1, x	; 音番号
	cmp	#$ff
	bne	+
	ldx	#0
	stx	seqidx1
	jmp	-
+
	inc	seqidx1
	cmp	#0
	beq	+
	sec
	sbc	notemin
	asl
+
	tax
	lda	note_tbl, x
	sta	$4002		; 矩形波CH1周波数値レジスタ1
	lda	note_tbl+1, x
	sta	$4003		; 矩形波CH1周波数値レジスタ2
 
	ldx	seqidx1
	lda	sequence1, x	; 音長
	sta	tick1
	inc	seqidx1
exit1:
	dec	tick2
	bne	exit2
	ldx	seqidx2
-
	lda	sequence2, x	; 音番号
	cmp	#$ff
	bne	+
	ldx	#0
	stx	seqidx2
	jmp	-
+
	inc	seqidx2
	cmp	#0
	beq	+
	sec
	sbc	notemin
	asl
+
	tax
	lda	note_tbl, x
	sta	$4006		; 矩形波CH2周波数値レジスタ1
	lda	note_tbl+1, x
	sta	$4007		; 矩形波CH2周波数値レジスタ2
 
	ldx	seqidx2
	lda	sequence2, x	; 音長
	sta	tick2
	inc	seqidx2
exit2:
	rti
 
note_tbl:
	dw	0	; 休符
	dw	$389	; B2(47)
	dw	$356, $326, $2f9, $2ce, $2a6, $280, $25c, $23a, $21a, $1fb, $1df, $1c4
	dw	$1ab, $193, $17c, $167, $152, $13f, $12d, $11c, $10c, $fd, $ef, $e1
	dw	$d5, $c9, $bd, $b3, $a9, $9f, $96, $8e, $86, $7e, $77, $70
 
sequence1:
	db	74,30, 81,30, 79,90, 77,15, 76,15, 74,30, 72,15, 70,15
	db	72,15, 69,15, 76,30, 74,120, 0,60, $ff
sequence2:
	db	50,15, 57,15, 53,15, 57,15, 50,15, 59,15, 55,15, 59,15
	db	50,15, 60,15, 57,15, 60,15, 50,15, 58,15, 53,15, 58,15
	db	52,15, 60,15, 57,15, 60,15, 50,15, 57,15, 54,15, 57,15
	db	50,15, 57,15, 54,15, 57,15, 47,15, 57,15, 49,15, 57,15, $ff
 
	org	$fffa
	dw	VBlank	; NMI VBlank
	dw	Reset
	dw	0	; IRQ/BRK
 
	incbin	"dummy.chr"
 
最終更新:2020年12月20日 09:49