程序:简易画图
编写:女孩不哭, 6502汇编, 6502通用汇编器1.2.6
使用方法:
  上下左右:移动画笔坐标
  选择  :切换命名表#0,#3(因为是水平镜像)
  开始  :清空当前命名表
  BB     :加速移动
  AA     :画图, 像素切换

源代码:

; start:$BFF0; end:  $FFFF; size: $4010        .start  reset        .org    $BFF0   ; 文件头        .db     "NES",$1A,$01,$01,$00,$00        .dw     $00,$00,$00,$00

JOY_NOW = $00JOY_LAST = $01BTN_TIME = $04NT_NOW = $05            ; Cur NT: 0:$2000,1:$2800PPU_ADDR_LOW = $02PPU_ADDR_HI = $03

        .org    $C000pal_data:               ; 调色板数据        .db     $0F,$03,$11,$1A        .db     $0F,$1A,$11,$03reset:        sei        cld        ldx     $ff     ; 初始化堆栈SP        txs_main_vb1:              ; PPU预热2次        lda     $2002        bpl     _main_vb1_main_vb2:        lda     $2002        bpl     _main_vb2               inx             ; 关nmi, 关屏幕        stx     $2000        stx     $2001           stx     JOY_NOW ; 内存初始化        stx     JOY_LAST        stx     PPU_ADDR_LOW        stx     PPU_ADDR_HI        stx     BTN_TIME        stx     NT_NOW        jsr     set_pal ; 设置调色板        jsr     clr_spr ; 清空精灵        jsr     clr_nt  ; 清空命名表        lda     #$07    ; 初始化精灵        sta     $0200+0        lda     #$01        sta     $0200+1        lda     #$00    ; 卷轴归位        sta     $2005        sta     $2005        lda     #$1e    ; 开屏幕        sta     $2001        lda     #$80    ; 开nmi中断        sta     $2000main:        jmp     main    ; reset中断无限循环; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<nmi:        lda     #$00        sta     $2001        jsr     read_joy        jsr     check_btn        jsr     move_spr        jsr     draw_item        lda     #$02    ; DMA方式更新精灵        sta     $4014        lda     #$1e        sta     $2001        rti; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<check_btn:        lda     JOY_NOW        cmp     #$10        beq     _cb_st1        cmp     #$20        beq     _cb_n1        rts_cb_st1:        cmp     JOY_LAST        bne     _cb_st2        rts_cb_st2:        lda     NT_NOW        cmp     #$00    ; NT:$2000        bne     _cb_nt1        lda     #$20        jsr     _sub_clr_nt        rts_cb_nt1:        lda     #$28        jsr     _sub_clr_nt        rts_cb_n1:        cmp     JOY_LAST        bne     _cb_n2        rts_cb_n2:        lda     NT_NOW        cmp     #$00        bne     _cb_nodraw        ; 没有画        lda     #$01    ; 已经画了        sta     NT_NOW        lda     #$82        sta     $2000        rts_cb_nodraw:        ; 已经画        lda     #$00    ; 没有画        sta     NT_NOW         lda     #$80        sta     $2000        rts; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<draw_item:        lda     JOY_NOW        and     #$80    ; 同时按下了A?        beq     _di_rts ; 没有按下        lda     JOY_NOW        cmp     JOY_LAST        beq     _di_rts        lda     #$00    ; 初始化        sta     PPU_ADDR_LOW        lda     NT_NOW        cmp     #$01    ; NT:$2800        bne     _di_nt1        lda     #$28        sta     PPU_ADDR_HI        jmp     _di_nt2_di_nt1:        lda     #$20            sta     PPU_ADDR_HI_di_nt2:        ldy     $0200+0 ; Y坐标        iny             ; 因为是Y-1        tya        lsr             ; A/=8        lsr        lsr        tax             ; 计算乘法, x*$20=>A        lda     #$00_di_loop1:        clc        adc     #$20        bcc     _di_lab1        inc     PPU_ADDR_HI_di_lab1:        dex        bne     _di_loop1        sta     PPU_ADDR_LOW        lda     $0200+3 ; X坐标        lsr             ; X/=8        lsr        lsr        clc        adc     PPU_ADDR_LOW    ; X偏移        bcc     _di_lab2        inc     PPU_ADDR_HI_di_lab2:        sta     PPU_ADDR_LOW

_skip:        lda     PPU_ADDR_HI        sta     $2006        lda     PPU_ADDR_LOW        sta     $2006        lda     $2007        lda     $2007        cmp     #$00    ; 被画了吗?        beq     _di_draw ; 没有        lda     PPU_ADDR_HI        sta     $2006        lda     PPU_ADDR_LOW        sta     $2006        lda     #$00        sta     $2007        jmp     _di_rts_di_draw:        lda     PPU_ADDR_HI        sta     $2006        lda     PPU_ADDR_LOW        sta     $2006        lda     #$01        sta     $2007_di_rts:        lda     #$00        sta     $2005        sta     $2005        rts; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<move_spr:        lda     JOY_NOW        cmp     JOY_LAST        bne     _ms_n0        ldx     BTN_TIME        cpx     #$14        bne     _ms_n4_ms_n0:        cmp     #$01    ; 右        bne     _ms_n1        lda     $0200+3        clc        adc     #$08        sta     $0200+3        rts_ms_n1:        cmp     #$02    ; 左        bne     _ms_n2        lda     $0200+3        sec        sbc     #$08        sta     $0200+3        rts_ms_n2:        cmp     #$04    ; 下        bne     _ms_n3        lda     $0200+0        clc        adc     #$08        cmp     #$e7        bne     _unk_1        lda     #$07_unk_1:        sta     $0200+0        rts_ms_n3:        cmp     #$08    ; 上        bne     _ms_n4        lda     $0200+0        sec        sbc     #$08        cmp     #$ff        bne     _unk_2        lda     #$df_unk_2:        sta     $0200+0        rts_ms_n4:        rts; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<read_joy:        lda     JOY_NOW        pha        lda     #$01        sta     $4016        lsr        sta     $4016        ldx     #$08        sta     JOY_NOW        sta     JOY_LASTjoy_loop:        lda     $4016        and     #$01        sta     JOY_LAST        lda     JOY_NOW        asl        ora     JOY_LAST        sta     JOY_NOW        dex        bne     joy_loop        pla        cmp     JOY_NOW ; 和前一次相比较        bne     _rj_n1  ; 不相等清除计数器        cmp     #$00        beq     _rj_rts        inc     BTN_TIME        ldy     BTN_TIME        cpy     #$15    ; 延迟长度        bne     _rj_rts        stx     JOY_LAST_rj_n1:        stx     BTN_TIME_rj_rts:        sta     JOY_LAST        rts; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<       set_pal:        lda     #$3f        sta     $2006        lda     #$00        sta     $2006        ldx     #$00_sp_loop1:        lda     pal_data,x        sta     $2007        inx        cpx     #$04        bne     _sp_loop1

        lda     #$3f        sta     $2006        lda     #$10        sta     $2006        ldx     #$00_sp_loop2:        lda     pal_data+4,x        sta     $2007        inx        cpx     #$04        bne     _sp_loop2        rts; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<clr_spr:        lda     #$00        tax_cs_cs: sta     $0200,x        inx        bne     _cs_cs

        lda     #$ef_cs_hide:        sta     $0200,x        inx        inx        inx        inx        bne     _cs_hide        rts; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<clr_nt:        lda     #$20        jsr     _sub_clr_nt        lda     #$28_sub_clr_nt:        sta     $2006        lda     #$00        sta     $2006        ldy     #$04        ldx     #$00_clr_nt_loop1:        sta     $2007        inx        bne     _clr_nt_loop1        dey        bne     _clr_nt_loop1        lda     #$00        sta     $2005        sta     $2005        rts; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<irq:        rti; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        .org    $FFFA        .dw     nmi,reset,irq

点阵字模数据:

$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00, $00

FC/NES PPU 示例汇编程序 简易画图相关推荐

  1. FC/NES PPU卷轴滚屏示例 歌词显示

    编写:女孩不哭 2012-08-31 语言:6502 汇编环境:6502 通用汇编器 1.2.6 修改版 所选歌词:Kelly Clarkson - Because of you 效果图: 以下是源代 ...

  2. JS实现简易画图工具

    [Canvas]画布 Canvas为HTML5中新加入的标签, JS 可在上面进行绘画,Canvas一个矩形的单元.Canvas 拥有多种绘制路径.矩形.圆形.字符以及添加图像的方法. 绘制图形的步骤 ...

  3. 基于html+JS实现canvas简易画图工具

    使用canvas来创建区域,建立核心对象,再接着分别获取几个按钮的节点,确定鼠标按下的起始位置,和鼠标释放时的位置,并为其加上移动事件,鼠标松开时则删除移动节点.点击清除画布按钮,使用clearRec ...

  4. 怎么画图自动生成HTML,用canvas写一个简易画图工具

    本文将为您描述用canvas写一个简易画图工具,具体操作方法: Document style="border:1px solid #000000;">您的浏览器不支持canv ...

  5. 简易画图工具(Python)

    简易画图工具(Python) 小黑最近在努力的入门python,正好学习到了Python的tkinker模块下的Canvas(画布)和Button(按钮)再加上相应的事务管理,实现了一个简单的画图小工 ...

  6. fceux源码解析_FCEUX金手指加强版 - 使用Lua脚本语言编写FC/NES金手指脚本

    一直觉得大部分的FC/NES模拟器的作弊码金手指不是那么方便使用, 比如魂斗罗1代, 玩家的武器可以通过修改0xAA的值来改变: 0x11为M弹(重机枪),0x12为F弹(圈圈),0x13为S弹(散弹 ...

  7. FC(nes)游戏开发资源

    美国的网站,所有NES模拟器(程序设计)方面的资料 http://nesdev.parodius.com 各种NES模拟器源代码 http://www.zophar.net/nes.html FCNE ...

  8. 很久很久以前写的FC/NES 游戏ROM文件管理程序,许久没更新,用得着的试试吧

    那是在很久很久以前了, 那时候才刚刚学习Win32 SDK编程,恰恰又学了Sqlite3数据库的使用,所以就写 了这么一个程序, 没什么特殊的功能, 就是把NES文件保存到数据库中, 支持搜索, 要查 ...

  9. CC65 开发FC/NES 游戏(一)环境搭建(2021-04-27更新部分内容和修改部分错误介绍)

    童年的红白机(又叫FC,美国叫NES)  开发语言,早期的码农们用的是6502的CPU上的汇编语言ASM(其实跟单片机差不多)  简单的说不同的芯片提供了一堆指令让用户编程调用,但其实都是单调的地址引 ...

最新文章

  1. 用awk数组处理两个文件的例子
  2. 异步fifo_异步FIFO设计
  3. 有哪些命令行工具堪称神器?
  4. “约见”面试官系列之常见面试题之第五十五篇之清除浮动的方法(建议收藏)
  5. Oracle 自动备份详细步骤
  6. 细数数据中台的3个业务价值和5个技术价值
  7. 900万注释图像数据集升级了!谷歌开放Open Images V6,首增语音、文本、鼠标轨迹同步注释...
  8. PyCharm常用快捷键和设置
  9. redis映射的概念_Redis基础概念和实现机制的总结
  10. axios 简单常用笔记
  11. TASKCTL单机/分布式部署,启动服务/代理节点监听
  12. linux内核make menuconfig配置
  13. SmartUpload问题
  14. 100个特别的遥感应用和用途
  15. 发送网页内容到onenote_如何直接在网页上做笔记并保存到 Onenote?
  16. Bootstrap基础三 排版
  17. Zap之日志记录器选择
  18. iOS企业应用分发平台搭建(uniapp打包)
  19. echarts实现中国地图,山西地图,图表面积图配置项
  20. word如何调整字间距离_Word如何快速调整行间距和字间距?

热门文章

  1. win10设置了睡眠时间,但两分钟无操作仍然黑屏。解决办法
  2. 六问禅道5:需求和Bug的区别
  3. python工资有多少-Python工程师工资多少
  4. iOS开发者账号快速添加手机号码
  5. EasyExcel解析excel(合并单元格和未合并)
  6. RB-tree深度探索
  7. Transformer Architectures and Pre-training Strategies for Fast and Accurate Multi-sentence Scoring
  8. Oracle的全文检索
  9. IOS之 点击链接跳转到App Store指定App(应用程序)
  10. TCP/IP协议第一章笔记