6502.65s

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

65S
1,554
字号
;******************本文件的函数使用的参数地址说明************************
;* DrawBackground    函数使用的地址:$10,$11,$12                         *
;* Background        函数使用的地址:$10,$11,$12,$13,$14,$15,$16         *
;* SaveBackground    函数使用的地址:$10,$11,$12,$13,$14,$15,$16         *
;* RestoreBackground 函数使用的地址:$DD,$DE                             * 
;* MoveBackground    函数使用的地址:$E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8 *
;* ClearH            函数使用的地址:$14,$15,$16,$17,$18                 *
;* ClearV            函数使用的地址:$14,$15,$16,$17,$18                 *
;* ASCII码字符           占用的地址:$20至--->$7E                        *
;* DisplayString     函数使用的地址:$80,$81,$82,$83,$84,$85             *
;* Mul               函数使用的地址:$86,$87,$88,$89                     *
;* HexToAsc          函数使用的地址:$8A,$8B,$8C                         *
;* TitleToASCII      函数使用的地址:$8D,$8E                             *
;* CopyMemory        函数使用的地址:$90,$91,$92,$93,$94,$95             *
;* Scprite           函数使用的地址:$A0,$A1,$A2,$A3,$A4,$A5             *
;* DisplayHex        函数使用的地址:$D0,$D1,$D2,$D3                     *
;* SetPaletteColor   函数使用的地址:$D4,$D5,$D6,$D7,$D8,$D9             *
;* DA                函数使用的地址:$DA,$DB,$DC                         *
;*----------------------------------------------------------------------*
;* 注意: 在调用这些函数的时候会影响以上这些地址的傎,如果要用这         *
;*       些地址最好在调这些函数之前将你所用到的地址压入堆栈,调         *
;*       完毕后再将该地址出栈。                                         *
;************************************************************************

; *******************十进制加法函数[DA]**********************
; * 功能:计算两个数的和(不过要把两个16进制的数看成是10进制的*
; *      数在执行本函数的时候是以10进制的加法进行运算的。   * 
; *---------------------------------------------------------*
; * 函数参数说明:(总共有2个参数要传递,有1个返回值)          *
; * $DA:被加数                                              * 
; * $DB:加数                                                *
; * $DC:返回两个数的和                                      *
; * 注意:执行此函数后会影响进位标志,例如(DA)=#$68,(DB)=#$59 *
; *      执行后的结果为:进位标志C=1,(DC)=#$27               *
; *      因为68+59=127 "1"则放在进位标志中!!              *
; *---------------------------------------------------------*
; * 设计日期:2005-02-04                 设计者:彭勇         *
; * 最后修改日期:2005-02-04                                *
; ***********************************************************
DA  SUBROUTINE
           LDA $DD
           PHA
           LDA $DE
           PHA
           LDA $DF
           PHA
           PHA         
           TXA 
           PHA
           TYA
           PHA

           
           LDA #$00
           STA $DF
           LDA $DA
           ADC $DB      
           ;PHP
           TAX
           BCC .Next
           LDA #$01
           STA $DF
           
.Next      LDA #$10
           STA $DE       ;判断是否有辅助进位的标志
           LDA $DA
           AND #$0F
           STA $DD
           LDA $DB
           AND #$0F
           ADC $DD
           BIT $DE           
           BNE .Add_06H  ;有辅助进位标志(AC=1)    
.First     TXA           ;第一种情况[累加器A的低4位大于9或辅助进位标志(AC)=1,则进行低4位加6修正:即A<--(A)+#$06]
           AND #$0F
           CMP #$09   
           BEQ .Second
           BPL .Add_06H
           JMP .Second
.Add_06H   TXA
           CLC
           ADC #$06      ;加上#$06
           TAX
           ;PLP
           BCS .Add_60H
.Second    ;TXA          ;第二种情况[累加器A的高4位大于9或进位标志位(CY)=1,则进行高4位加6修正:即A<--(A)+#$60]
           AND #$F0
           LSR
           LSR
           LSR
           LSR
           CMP #$09
           BEQ .Third
           BPL .Add_60H
           BCS .Add_60H
           JMP .Third    
.Add_60H   TXA
           CLC
           ADC #$60      ;加上#$60
           TAX
           BCC .Third
           LDA #$01
           STA $DF 
.Third     TXA          ;第三种情况[累加器A的高4位等于9且低4位大于9,则进行高4位加6修正:即A<--(A)+#$60]
           AND #$F0
           LSR
           LSR
           LSR
           LSR
           CMP #$09
           BEQ .Low
           JMP .Return
.Low       TXA
           AND #$0F
           CMP #$09
           BEQ .Return
           BPL .Add_60H3
 
           JMP .Return
.Add_60H3  TXA
           CLC
           ADC #$60
           TAX
           BCC .Return
           LDA #$01
           STA $DF           
.Return    LDA $DF
           CMP #$01
           BNE .Next1
           SEC
.Next1     STX $DC           
           PLA
           TAY
           PLA
           TAX
           PLA
          
           PLA
           STA $DF 
           PLA
           STA $DE
           PLA 
           STA $DD         
           RTS
;*************************END****************************              

; **********************乘法函数[Mul]**********************
; * 功能:计算两个数相乘                                   *
; *-------------------------------------------------------*
; * 函数参数说明:(总共有2个参数要传递,有2个返回值)        *
; * $86:乘数                                              *
; * $87:被乘数                                            *
; * $88:返回两数相乘后结果的低8位地址                     *
; * $89:返回两数相乘后结果的高8位地址                     *
; * 注意:两数相乘的结果最大不能超过$FE01即十进制的65025   *
; *      否则将出现不正确的结果                           *
; *-------------------------------------------------------*
; * 设计日期:2004-12-31                 设计者:彭勇       *
; * 最后修改日期:2005-01-11                              *
; * 修改说明:在子程序中只能出现一个"RTS"否则读取地址会出错*
; *          在本子程序中我已将"RTS"打上了注释标记改成JMP *
; *          跳转返回!!                                 * 
; *********************************************************
Mul  SUBROUTINE
             LDA $86
             PHA
             LDA $87
             PHA
             
             PHP
             PHA         
             TXA 
             PHA
             TYA
             PHA

             LDA $86
             CMP #$00           ;判断乘数是否为"0"
             BNE .Next          ;如果不为"0"判断被乘数是否为"0" 
             LDA #$00           ;如果为"0"直接返回结果"0"即($89)=0,($88)=0 
             STA $88
             STA $89
             JMP .Return        ;返回
             ;RTS  
.Next        LDA $87            
             CMP #$00           ;判断被乘数是否为"0"    
             BNE .Comparison    ;如果不为"0"比较乘数与被乘数的大小
             LDA #$00           ;如果为"0"直接返回结果"0"即($89)=0,($88)=0 
             STA $88
             STA $89
             JMP .Return        ;返回
             ;RTS
.Comparison  LDA $86
             CMP $87
             BCC .Small         ;如果小于转至循环相加部分 
             LDX $87            ;如果乘数($86)大于被乘数($87),将乘数与被乘数交换
             LDA $86
             STA $87
             STX $86
.Small       LDX $86
             LDA #$00
             STA $89
             CLC
.Loop        ADC $87
             BCC .NoAdd         ;判断高位地址是否要进位
             INC $89            ;高位地址加1($89)
             CLC
.NoAdd       DEX                ;循环累加计数器
             BNE .Loop
             STA $88            ;累加的结果送往低位地址($88)
                      
.Return      PLA
             TAY
             PLA
             TAX
             PLA
             PLP
            
             PLA
             STA $87
             PLA 
             STA $86
             RTS
;*************************END****************************             

;*************将十六进制数转化为ASCII[HexToAsc]************
; * 功能:将指定的十六进制数的高4位和低4位转化为ASCII      *
; * 作用:地址$8A的内容的高4位转化为相应ASCⅡ码送地址$8B   *
; *      地址$8A的内容的低4位转化为相应ASCⅡ码送地址$8C   *
; *                                                       *
; *        如(8A)=#$34,那么(8B)=#$33,(8C)=#$34            *
; *-------------------------------------------------------*
; * 函数参数说明:(总共有3个参数要传递,2个返回值)          *
; * $8A:存储要转的十六进制数                              *
; * $8B:返回十六进数的高4位数的ASCII                      *
; * $8C:返回十六进数的低4位数的ASCII                      *
; *-------------------------------------------------------*
; * 设计日期:2005-01-07                 设计者:彭勇       *
; * 最后修改日期:2005-01-11                              *
; *********************************************************
HexToAsc  SUBROUTINE            
            PHP
            PHA         
            TXA 
            PHA
            TYA
            PHA
            
            LDA $8A            
            LSR 
            LSR 
            LSR 
            LSR 
            STA $8B                ;将地址($8A)的值的高4位送往$8B
            LDA $8A
            AND #$0F
            STA $8C                ;将地址($8A)的值的低4位送往$8C
             
            LDA $8B                ;将高4位的值转为ASCⅡ码
            CMP #$0A               ;如果是字母则加上#$37(即大于或等于#$0A)
            BCS HexToAscL1         ;是字母
            CLC                    
            ADC #$30               ;是数字则加上#$30(即小于#$0A)
            STA $8B
            JMP HexToAscL2
HexToAscL1: CLC
            ADC #$37
            STA $8B
HexToAscL2: LDA $8C                ;将低4位的值转为ASCⅡ码
            CMP #$0A
            BCS HexToAscL3
            CLC
            ADC #$30
            STA $8C
            ;RTS
            JMP Return
HexToAscL3: CLC
            ADC #$37
            STA $8C
            
Return:     PLA
            TAY
            PLA
            TAX
            PLA
            PLP
            RTS             
;************************END************************

; *****************水平线清除函数[ClearH]******************
; * 功能:在屏幕上指定的位置开始以8*8点阵的大小用指定的   *
; *      标号(Title)清除一条水平线                        *
; *-------------------------------------------------------*
; * 函数参数说明:(总共有5个参数要传递,无返回值)           *
; * $14:清除水平线起始位置的X坐标(0<x<32)即32列           *
; * $15:清除水平线起始位置的Y坐标(0<y<30)即30行           *
; * $16:要清除水平线的宽度(每一个宽度为8*8点阵的图案)    *
; * $17:要用来清除的标号(Title)即8*8点阵的图案           *
; * $18:在哪一个命名表中清除(#$20:命名表0 #$24:命名表1    *
; *                          #$28:命名表2 #$2c:命名表3)   * 
; *-------------------------------------------------------*
; * 设计日期:2005-01-04                 设计者:彭勇       *
; * 最后修改日期:2005-01-04                              *
; *********************************************************
ClearH     SUBROUTINE
       LDA $14        ;保存输入参数的初始状态
       PHA 
       LDA $15
       PHA
       LDA $16
       PHA
       LDA $17
       PHA
       LDA $18
       PHA
       
       PHP            ;保存寄存器的初始状态
       PHA
       TXA
       PHA
       TYA
       PHA
      
       LDA #$20       ;每一行为$20个8*8点阵的块(即32个块)--
       STA $86        ;乘数                                 | 
       LDA $15        ;                                     |--->目的是计算存放图案在屏幕上的起始地址
       STA $87        ;被乘数                               | 
       JSR Mul        ;调用乘法函数                       -- 
       CLC
       LDA $18        ;在哪一个命名表($18=#$20:命名表0,$18=#$24:命名表1,$18=#$28:命名表2,$18=#$2c:命名表3)
       ADC $89        ;根据坐标计算出来的起始地址的高位地址
       STA $2006
       CLC
       LDA $88
       ADC $14        ;根据X坐标计算出来的起始地址的低位地址
       STA $2006
       LDA $17        ;读取水平清除的标号(Title)(即8*8点阵的图案)
.Loop  STA $2007
       DEC $16        ;要清除的宽度(每一个宽度为8*8点阵的图案)
       BNE .Loop
       
       PLA        ;返回寄存器的初始状态
       TAY
       PLA
       TAX
       PLA
       PLP
       
       PLA
       STA $18    ;返回输入参数的初始状态
       PLA
       STA $17
       PLA
       STA $16
       PLA
       STA $15
       PLA
       sta $14       
       RTS       
;************************END*******************************       

; *****************垂直线清除函数[ClearV]******************
; * 功能:在屏幕上指定的位置开始以8*8点阵的大小用指定的   *
; *      标号(Title)清除一条垂直线                        *
; *-------------------------------------------------------*
; * 函数参数说明:(总共有5个参数要传递,无返回值)           *
; * $14:清除垂直线起始位置的X坐标(0<x<32)即32列           *
; * $15:清除垂直线起始位置的Y坐标(0<y<30)即30行           *
; * $16:要清除垂直线的高度(每一个高度为8*8点阵的图案)    *
; * $17:要用来清除的标号(Title)即8*8点阵的图案           *
; * $18:在哪一个命名表中清除(#$20:命名表0 #$24:命名表1    *
; *                          #$28:命名表2 #$2c:命名表3)   * 
; *-------------------------------------------------------*
; * 设计日期:2005-01-04                 设计者:彭勇       *
; * 最后修改日期:2005-01-04                              *
; *********************************************************       
ClearV     SUBROUTINE
       LDA $14        ;保存输入参数的初始状态
       PHA 
       LDA $15
       PHA
       LDA $16
       PHA
       LDA $17
       PHA
       LDA $18
       PHA
       LDA $19
       PHA

⌨️ 快捷键说明

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