6502.65s

来自「6502单片机汇编函数!在里面的每一个函数都有详细说明!」· 65S 代码 · 共 1,554 行 · 第 1/4 页

65S
1,554
字号
           PHP                ;把各个寄存器压入堆栈
           PHA         
           TXA 
           PHA
           TYA
           PHA
   
           ;LDA   #<.TitleMap
           ;sta   $10
           ;lda   #>.TitleMap
           ;sta   $11

           lda   $12     ;Load Name and Attribute Table
           sta   $2006
           lda   #$00
           sta   $2006

           ldx   #$00  ;内循环256次
           ldy   #$04  ;外循环4次(总共读取1024个字节)包括命名表和属性表

.LoadTitle TXA
           pha

           LDX   #$00
           lda   ($10),X  ;Load Title Image
           sta   $2007

           PLA
           tax

           INC   $10
           bne   .NoTitle1
           inc   $11
.NoTitle1  dex
           bne   .LoadTitle
           dey
           BNE   .LoadTitle
  
           PLA                 ;发送完毕后,恢复各个寄存器的值
           TAY
           PLA
           TAX
           PLA
           PLP
           RTS
;**************************END*********************************

; *****************绘背景图像函数[Background]******************
; * 功能:可以在屏幕上的任何位置绘出指定的背景图案             *
; *-----------------------------------------------------------*
; * 函数参数说明:(总共有7个参数要传递,无返回值)               *
; * $10:存背景图案的宽度(每一个宽度是8*8点阵的图案)          *
; * $11:存背景图案的高度(每一个高度是8*8点阵的图案)          *
; * $12:存背景图案在屏幕上绘画的起始位置的X坐标(0<X<31)即32列 *
; * $13:存背景图案在屏幕上绘画的起始位置的Y坐标(0<Y<29)即30行 *
; * $14:存放背景图案地址的低位地址                            *
; * $15:存放背景图案地址的高位地址                            *
; * $16:在哪一个命名表中绘图(#$20:命名表0 #$24:命名表1        *
; *                          #$28:命名表2 #$2c:命名表3)       *
; *-----------------------------------------------------------*
; * 设计日期:2004-12-29                 设计者:彭勇           *
; * 最后修改日期:2005-01-26                                  *
; ************************************************************* 
Background SUBROUTINE
         LDA $10
         PHA
         LDA $11
         PHA
         LDA $12
         PHA
         LDA $13
         PHA
         LDA $14
         PHA
         LDA $15
         PHA
         LDA $16
         PHA
         
         PHP
         PHA         
         TXA 
         PHA
         TYA
         PHA
         
         LDX #$00
         LDY #$00

         LDA #$20    ;------|
         STA $86     ;      |
         LDA $13     ;      |--->根据坐标计算图案在屏幕上绘画的起始地址
         STA $87     ;      |
         JSR Mul     ;------|
         
         CLC
         LDA $16     ;在哪一个命名表中绘画($16=#$20:命名表0,$16=#$24:命名表1,$16=#$28:命名表2,$16=#$2c:命名表3)
         ADC $89
         STA $13     ;计算图案在屏幕上绘画的起始地址的高位地址
         
         CLC
         LDA $88
         ADC $12
         STA $12     ;计算图案在屏幕上绘画的起始地址的低位地址
         
    
.Loop0   LDA $13
         STA $2006
         LDA $12
         STA $2006
.Loop1   LDA ($14),y
         STA $2007
         ;INY
         CLC
         TYA
         ADC #$01
         TAY        
         BCC .NextCol         
         INC $15      ;如果拷贝了256个字节使高位地址加1
         ;DEY
.NextCol INX
         TXA
         CMP $10
         BNE .Loop1
         LDX #$00
         LDA $12
         ADC #$1F    ;绘完一行后,使地址增加$20=(1F+C)(目的是移至下一行,能够上下对齐,C为进们标志)
         STA $12
         BCC .NextRow
         INC $13
         CLC
.NextRow DEC $11
         bne .Loop0                    
         
         PLA
         TAY
         PLA
         TAX
         PLA
         PLP
        
         PLA
         STA $16
         PLA
         STA $15
         PLA
         STA $14
         PLA 
         STA $13
         PLA
         STA $12
         PLA
         STA $11
         PLA 
         STA $10
         RTS
;********************end***********************

; **************保存背景图像函数[SaveBackground]****************
; * 功能:可以在屏幕上的任何位置保存指定的背景图案              *
; *------------------------------------------------------------*
; * 函数参数说明:(总共有7个参数要传递,无返回值)                *
; * $10:需要保存背景图案的宽度(每一个宽度是8*8点阵的图案)     *
; * $11:需要保存背景图案的高度(每一个高度是8*8点阵的图案)     *
; * $12:需要保存背景图案在屏幕上的起始位置的X坐标(0<X<31)即32列*
; * $13:需要保存背景图案在屏幕上的起始位置的Y坐标(0<Y<29)即30行*
; * $14:保存背景图案存放地址的低位地址                         *
; * $15:保存背景图案存放地址的高位地址                         *
; * $16:保存哪一个命名表中的背景图(#$20:命名表0 #$24:命名表1   *
; *                                #$28:命名表2 #$2c:命名表3)  *
; * 注意:保存背景图案存放的起始地址的前面五个字节是用来分别存放*
; *      你需要保存的图案的X坐标,Y坐标,宽度,高度,哪一个命名表中*
; *      的背景图。五个字节以后才是保存真正的图案信息!!!    *
; * 例如:保存一副背景图高度为:10宽度为:20所需要的空间为:10*20+5*
; *      =205个字节,最前面5个字节存放背景图案的X坐标,Y坐标,宽  *
; *      度,高度,哪一个命名表中的背景图。                      *
; *------------------------------------------------------------*
; * 设计日期:2005-02-17                 设计者:彭勇            *
; * 最后修改日期:2005-02-19                                   *
; ************************************************************** 
SaveBackground SUBROUTINE
         LDA $10
         PHA
         LDA $11
         PHA
         LDA $12
         PHA
         LDA $13
         PHA
         LDA $14
         PHA
         LDA $15
         PHA
         LDA $16
         PHA
         
         PHP
         PHA         
         TXA 
         PHA
         TYA
         PHA
         
         LDX #$00
         LDY #$00

         LDA #$20    ;------|
         STA $86     ;      |
         LDA $13     ;      |--->根据坐标计算图案在屏幕上需要保存的背景图的起始地址
         STA $87     ;      |
         JSR Mul     ;------|

         LDA $12
         STA ($14),y ;保存X坐标
         INY
                                       
         LDA $13
         STA ($14),y ;保存Y坐标
         INY
         
         LDA $10
         STA ($14),y ;保存宽度
         INY

         LDA $11
         STA ($14),y ;保存高度
         INY
  
         LDA $16
         STA ($14),y ;保存哪一个命名表中的背景图
         INY
         
         CLC
         LDA $16     ;保存哪一个命名表中的背景图($16=#$20:命名表0,$16=#$24:命名表1,$16=#$28:命名表2,$16=#$2c:命名表3)
         ADC $89
         STA $13     ;计算图案在屏幕上起始地址的高位地址
         
         CLC
         LDA $88
         ADC $12
         STA $12     ;计算图案在屏幕上起始地址的低位地址
 
.Loop0   LDA $13
         STA $2006
         LDA $12
         STA $2006
         LDA $2007   ;读取一个无效的数据不要!!!
.Loop1   LDA $2007
         STA ($14),y
         ;INY
         CLC
         TYA
         ADC #$01
         TAY        
         BCC .NextCol         
         INC $15      ;如果拷贝了256个字节使高位地址加1
         ;DEY
.NextCol INX
         TXA
         CMP $10
         BNE .Loop1
         LDX #$00
         LDA $12
         ADC #$1F    ;读取完一行后,使地址增加$20=(1F+C)(目的是移至下一行,能够上下对齐,C为进们标志)
         STA $12
         BCC .NextRow
         INC $13
         CLC
.NextRow DEC $11
         bne .Loop0                    
                
         PLA
         TAY
         PLA
         TAX
         PLA
         PLP
        
         PLA
         STA $16
         PLA
         STA $15
         PLA
         STA $14
         PLA 
         STA $13
         PLA
         STA $12
         PLA
         STA $11
         PLA 
         STA $10
         RTS
;********************end***********************

; *************恢复背景图像函数[RestoreBackground]**************
; * 功能:可以恢复用SaveBackground函数保存的背景图像            *
; *------------------------------------------------------------*
; * 函数参数说明:(总共有2个参数要传递,无返回值)                *
; * $DD:需要恢复背景图案起始地址的低8位地址                    *
; * $DE:需要恢复背景图案起始地址的高8位地址                    *
; *------------------------------------------------------------*
; * 设计日期:2005-02-19                 设计者:彭勇            *
; * 最后修改日期:2005-02-21                                   *
; ************************************************************** 
RestoreBackground  SUBROUTINE      
        LDA $12
        PHA
        LDA $13
        PHA
        LDA $DD
        PHA
        LDA $DE                  
        PHA

        PHP
        PHA
        TXA
        PHA
        TYA
        PHA

        LDA #$00
        TAY
        
        LDA ($DD),Y ;读取X坐标
        STA $12
        INY

        LDA ($DD),Y ;读取Y坐标
        STA $13
        INY
        
        LDA ($DD),Y ;读取宽度
        STA $10
        INY
  
        LDA ($DD),Y ;读取高度
        STA $11
        INY
        
        LDA ($DD),Y ;读取在哪一个命名表中的背景图
        STA $16
        INY

        LDA $DD
        ADC #$05    ;将起始地址+5目的计算出存放背景图案信息的起始地址
        STA $14
        BCC .Next
        LDA $DE
        ADC #$01
        STA $15
        JMP .Excute
.Next   LDA $DE
        STA $15
.Excute JSR Background ;执行绘背景图案的函数
 
        PLA
        TAY
        PLA
        TAX
        PLA
        PLP
       
        PLA
        STA $DE
        PLA
        STA $DD
        PLA
        STA $13
        PLA
        STA $12
        RTS
;*************************END******************************

; **************移动背景图像函数[MoveBackground]****************
; * 功能:可以将指定的背景图案在屏幕上的任何位置移动            *
; *------------------------------------------------------------*
; * 函数参数说明:(总共有9个参数要传递,无返回值)                *
; * $E0:用来需要移动的背景图案的起始地址的低8位地址            *
; * $E1:用来需要移动的背景图案的起始地址的高8位地址            *
; * $E2:移到指定的位置(X坐标)                                  *
; * $E3:移到指定的位置(Y坐标)                                  *
; * $E4:背景图案的宽度                                         *
; * $E5:背景图案的高度                                         * 
; * $E6:在哪一个命名表中移动(#$20:命名表0 #$24:命名表1         *
; *                          #$28:命名表2 #$2c:命名表3)        *
; * $E7:保存背景图案缓冲区的起始地址的低8位地址                *
; * $E8:保存背景图案缓冲区的起始地址的高8位地址                *

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?