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