FC/NES 音乐示例程序 生日快乐歌

复制代码
;开始地址:$bff0
;结束地址:$ffff
;文件长度:$4010


COUNTER = $00
MUSIC_OFFSET1 = $01
MUSIC_OFFSET2 = $02

        .org    $BFF0
        .db     "NES",$1A,$01,$01,$00,$00
        .dw     $00,$00,$00,$00
        .start  $C000
        .org    $C000
reset:
        sei             ; 禁用中断
        cld                             
        ldx     #$ff    ; 初始化栈顶指针到$FF
        txs
        
        inx
        stx     COUNTER
        stx     MUSIC_OFFSET1
        stx     MUSIC_OFFSET2
        
_vb1:
        lda     $2002
        bpl     _vb1
_vb2:
        lda     $2002
        bpl     _vb2

        lda     #$00
        sta     $2001

        
        lda     #$0f    ; 声音切换:0000 1111,方波#1#2,三角波,噪声
        sta     $4015
        
        lda     #$8f
        sta     $4000   ; APU方波#1控制端口
        
        lda     #$00
        sta     $4001   ; APU方波#1控制端口
        
        lda     #$80    ; 开nmi中断
        sta     $2000           
        
main:
        jmp     main
        

nmi:
        inc     COUNTER         ; 计数器增加
        ldx     MUSIC_OFFSET1
        lda     music1,x        ; 取得音长
        cmp     COUNTER         ; 判断是否该播放
        beq     next2           ; 播放
        cmp     #$ff
        beq     next1           ; 是否结束
        jmp     over            ; 退出
next1:
        ldx     #$00            ; 回到开始
        stx     MUSIC_OFFSET1
        jmp     over
next2:  
        lda     #$00
        sta     COUNTER
        lda     MUSIC_OFFSET2
        tay
        lda     music2,y        ; 波长低八位
        cmp     #$ff            ; 结束了吗?
        beq     next3
        sta     $4002
        
        iny
        lda     music2,y        ; 波长高三位+音长计数器
        cmp     #$ff            ; 结束了吗?
        beq     next3
        sta     $4003
        
        iny                     ; 下一个音符
        sty     MUSIC_OFFSET2
        inx
        stx     MUSIC_OFFSET1
        jmp     over
next3:
        ldy     #$00            ; 回到开始
        sty     MUSIC_OFFSET2
over:
        rti

music1:
        ; 音长 8*4+1=33
        .db $10,$10,$20,$20,$20,$20,$20,$10
        .db $10,$20,$20,$20,$20,$20,$20,$10
        .db $10,$20,$20,$20,$20,$20,$20,$20
        .db $20,$10,$10,$20,$20,$20,$20,$20
        .db $20,$FF
music2:
        ; 两个一组,$FF为结束 8*8+2=66
        .db $1C,$09,$1C,$09,$FD,$08,$1C,$09
        .db $D4,$08,$E1,$08,$00,$00,$1C,$09
        .db $1C,$D9,$FD,$08,$1C,$09,$BD,$08
        .db $D4,$08,$D4,$08,$00,$00,$1C,$09
        .db $1C,$09,$8D,$08,$A8,$08,$D4,$08
        .db $E1,$08,$FD,$08,$FD,$08,$FD,$08
        .db $00,$00,$9F,$08,$9F,$08,$A8,$08
        .db $D4,$08,$BD,$08,$D4,$08,$D4,$D4
        .db $08,$00,$FF,$FF

irq:
        rti


        .org $fffa
        .dw nmi,reset,irq

复制代码

女孩不哭(QQ:191035066)@2012-08-13 16:45:32 @ http://www.cnblogs.com/nbsofer

posted @   女孩不哭  阅读(1018)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示