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 + -
显示快捷键?