6502.65s

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

65S
1,554
字号
; *     整个缓冲的大小=宽度*高度+5个字节                       *
; * 注意:执行本函数之前是否初始化了缓冲区(即是否执行           *
; *      了Savebackground函数)此函数的使用请参照Savebackground *
; *      函数里面有详细的说明和如何使用!!!                  *
; *------------------------------------------------------------*
; * 设计日期:2005-02-21                 设计者:彭勇            *
; * 最后修改日期:2005-02-21                                   *
; **************************************************************
MoveBackground  SUBROUTINE
        LDA $E0
        PHA
        LDA $E1
        PHA
        LDA $E2
        PHA
        LDA $E3
        PHA
        LDA $E4
        PHA
        LDA $E5
        PHA
        LDA $E6
        PHA
        LDA $E7
        PHA
        LDA $E8
        PHA

        PHP
        PHA
        TXA
        PHA
        TYA
        PHA

        LDA $E7   ;读取背景图案缓冲区的起始地址的低8位地址
        STA $DD  
        LDA $E8
        STA $DE   ;读取背景图案缓冲区的起始地址的高8位地址
        JSR RestoreBackground ;将缓冲区里的背景图案

        LDA $E4
        STA $10    ;宽度
        LDA $E5
        STA $11    ;高度
        LDA $E2    
        STA $12    ;X坐标
        LDA $E3
        STA $13    ;Y坐标
        LDA $E7   
        STA $14    ;保存背景图案缓冲区的起始地址的低8位地址
        LDA $E8
        STA $15    ;保存背景图案缓冲区的起始地址的高8位地址
        LDA $E6   
        STA $16    ;那一个命名表
        JSR SaveBackground ;将你要绘的背景图案保存至背景缓冲区
    
        LDA $E4
        STA $10    ;宽度
        LDA $E5
        STA $11    ;高度
        LDA $E2    
        STA $12    ;X坐标
        LDA $E3
        STA $13    ;Y坐标
        LDA $E0    
        STA $14    ;背景图案起始地址的低8位地址
        LDA $E1
        STA $15    ;背景图案起始地址的高8位地址
        LDA $E6   
        STA $16    ;那一个命名表
        JSR Background ;绘出指定的背景图案
        
        PLA
        TAY
        PLA
        TAX
        PLA
        PLP
 
        PLA
        STA $E8
        PLA
        STA $E7
        PLA
        STA $E6
        PLA
        STA $E5
        PLA
        STA $E4
        PLA 
        STA $E3
        PLA
        STA $E2
        PLA
        STA $E1
        PLA 
        STA $E0
        RTS
;*************************END******************************
              
; ***********设置调色板颜色函数[SetPaletteColor]***********
; * 功能:可以设置4个调色板以及调色板中的4种颜色           *
; *-------------------------------------------------------*
; * 函数参数说明:(总共有6个参数要传递,无返回值)           *
; * $D4:是在背景调色板还是精灵调色板中调颜色(#$00:背景    *
; *                     #$01或任意的8位十六进制数:精灵)   *
; * $D5:在那一个调色板中设置颜色(总共有4个调色板)如果值为 * 
; *                        #$00:1号调色板 #$01:2号调色板 *
; *                        #$02:3号调色板  #$03:4号调色板 *
; * $D6:在此号调色板的第一种颜色(#$00<$D5<#$3F)           *
; * $D7:在此号调色板的第二种颜色(#$00<$D6<#$3F)           *
; * $D8:在此号调色板的第三种颜色(#$00<$D7<#$3F)           *
; * $D9:在此号调色板的第四种颜色(#$00<$D8<#$3F)           *
; *-------------------------------------------------------*
; * 设计日期:2005-01-19                 设计者:彭勇       *
; * 最后修改日期:2005-01-20                              *
; *********************************************************
;-----------------------------------------------------------------------------------------
;背景调色板地址说明:
;    $3F00 背景调色板的1号调色板首地址($3F00至$3F03地址里面的值代表此号调色板中的四种颜色)
;    $3F04 背景调色板的2号调色板首地址($3F04至$3F07地址里面的值代表此号调色板中的四种颜色)
;    $3F08 背景调色板的3号调色板首地址($3F08至$3F0B地址里面的值代表此号调色板中的四种颜色)
;    $3F0C 背景调色板的4号调色板首地址($3F0C至$3F0F地址里面的值代表此号调色板中的四种颜色)

;精灵调色板地址说明:
;    $3F10 精灵调色板的1号调色板首地址($3F10至$3F13地址里面的值代表此号调色板中的四种颜色)
;    $3F14 精灵调色板的2号调色板首地址($3F14至$3F17地址里面的值代表此号调色板中的四种颜色)
;    $3F18 精灵调色板的3号调色板首地址($3F18至$3F1B地址里面的值代表此号调色板中的四种颜色)
;    $3F1C 精灵调色板的4号调色板首地址($3F1C至$3F1F地址里面的值代表此号调色板中的四种颜色)
;-----------------------------------------------------------------------------------------
SetPaletteColor  SUBROUTINE
                   LDA $86
                   PHA
                   LDA $87
                   PHA
                   LDA $88
                   PHA
                   LDA $89
                   PHA
           
                   PHP
                   PHA
                   TXA
                   PHA
                   TYA
                   PHA

                   LDA $D5
                   STA $86
                   LDA #$04
                   STA $87
                   JSR Mul
                   LDA $D4
                   CMP #$00  ;判断是背景调色板还是精灵调色板(#$00:背景,#$01或任意的8位十六进制数:精灵)
                   BEQ .BackgroundPalette ;转至背景调色板   
                   LDA $88   ;-----|
                   CLC       ;     | 
                   ADC #$10  ;     |---->使低位地址加#$10(目的是指向了精灵调色板地址)
                   STA $88   ;-----|
.BackgroundPalette LDA #$3F
                   STA $2006      ;送调色板的高位地址
                   LDA $88
                   STA $2006      ;根据输入的参数设置第几号调色板(总共有4个调色板)
                   LDA $D6
                   STA $2007      ;设置调色板的第一种颜色
                   LDA $D7
                   STA $2007      ;设置调色板的第二种颜色
                   LDA $D8
                   STA $2007      ;设置调色板的第三种颜色
                   LDA $D9
                   STA $2007      ;设置调色板的第四种颜色
                   
                   PLA
                   TAY
                   PLA
                   TAX
                   PLA
                   PLP
           
                   PLA
                   STA $89
                   PLA
                   STA $88
                   PLA
                   STA $87
                   PLA
                   STA $86
                   RTS
;*************************END******************************

; *************绘动态图像(精灵)函数[Scprite]***************
; * 功能:可以在屏幕上的任何位置绘出精灵(不会履盖背景图案) *
; *-------------------------------------------------------*
; * 函数参数说明:(总共有6个参数要传递,无返回值)           *
; * $A0:存精灵的Y坐标,$00<($A0)<$E0                       *
; * $A1:存精灵的X坐标,$00<($A1)<$F8                       *
; * $A2:存放精灵图案地址的低位地址                        *
; * $A3:存放精灵图案地址的高位地址                        *
; * $A4:存放精灵的宽度(每一个宽度为8*8点阵的图像)        *
; * $A5:存放精灵的大小(由多小个8*8点阵的小精灵组成)      *
; *     最多不能超过64个也就是说$00<($A5)<$40             *
; *-------------------------------------------------------*
; * 设计日期:2004-12-25                 设计者:彭勇       *
; * 最后修改日期:2005-01-11                              *
; *********************************************************
Scprite  SUBROUTINE
         LDA $A0
         PHA 
         LDA $A1
         PHA
         LDA $A2
         PHA
         LDA $A3
         PHA
         LDA $A4
         PHA
         LDA $A5
         PHA
         LDA $A6
         PHA 

         PHP
         PHA
         TXA
         PHA
         TYA
         PHA

         LDY #$00
         LDX #$00
         LDA $A1
         STA $A6           ;暂存X坐标
.Loop    LDA $A0           ;精灵Y坐标
         STA $2004
         LDA ($A2),y       ;精灵标号
         STA $2004
         LDA #%00000000    ;精灵属性
         STA $2004
         LDA $A1           ;精灵X坐标
         STA $2004
         LDA #$07
         ADC $A1
         STA $A1
         INX               ;精灵宽度加1(每加1相当于增加了一个8*8点阵的图像)
         TXA
         CMP $A4           ;与精灵宽度相比较
         BNE .NextCol
         LDA $A6           
         STA $A1           ;重新设置X坐标
         LDA #$07
         ADC $A0
         STA $A0
         LDX #$00          ;重新设置精灵宽度计数器"清0"(每一个宽度为8*8点阵的图像)
.NextCol INY
         TYA
         CMP $A5
         BNE .Loop         ;比较精灵是否已画完

         
         PLA
         TAY
         PLA
         TAX
         PLA
         PLP
         
         PLA
         STA $A6
         PLA 
         STA $A5
         PLA
         STA $A4
         PLA
         STA $A3
         PLA
         STA $A2
         PLA 
         STA $A1
         PLA 
         STA $A0
         RTS
;********************end***********************                           

; ***************手柄控制函数[GetHnadHandle]***************
; * 功能:可以获取指定手柄每个按键的状态                   *
; *-------------------------------------------------------*
; * 函数参数说明:(无参数要传递,有返回值A寄存器)           *
; * 返回值说明:                                           *
; * (A)=$00 表明没有按任何键
; * (A)=$01 表明按了向右的键                              *
; * (A)=$02 表明按了向左的键                              *
; * (A)=$03 表明按了向下的键                              *
; * (A)=$04 表明按了向上的键                              *
; * (A)=$05 表明按了开始键                                *
; * (A)=$06 表明按了选择键                                *
; * (A)=$07 表明按了B键                                   *
; * (A)=$08 表明按了A键                                   *
; *-------------------------------------------------------*
; * 设计日期:2004-12-27                 设计者:彭勇       *
; * 最后修改日期:2004-12-29                              *
; *********************************************************
GetHnadHandle SUBROUTINE
   LDX   $00      ;保存当前按键的状态
   stx   $01      ;保存上一次的按键状态

   LDY   #$08     
   LDX   #$01
   STX   $4016    ;送高地平至$4016----|
   DEX                               ;|--->使手柄(第一个手柄)开始复位(开始工作)
   STX   $4016    ;送低地平至$4016----|    如果将$4016改为$4017将使用的是第二个手柄 
.ReadBit
   LDA   $4016    ;读取按键状态
   ROR            ;读取A键状态放入进位标志(依次是A键,B键,选择键,开始键,上键,下键,左键,右键)
   TXA            ;                               |    |    |     |      |   |    |    |
   ROL            ;将A键的状态存入A寄存器的最高位(D7),(D6),(D5),(D4),  (D3),(D2),(D1),(D0)为"1"表示按了此键,"0"没有按
   TAX         
   DEY
   BNE   .ReadBit ;循环8次,主要是用于读取8个键的状态
;  RTS           

   and   #%11111111    ;允许所有按键有效(如果某一位为"0"表示禁止按此键,"1"表示按此键有效)
   sta   $00           ;将当前的按键状态保存至$00

;  lda   $00         ;获取当前的按键状态
   beq   .DoNothing  ;如果没有按任何键转移至.DoNothing

   lda   $01         ;获取上一次的按键状态
   eor   #$ff        
   and   $00         ;与当前按键状态异或运算
   beq   .DoNothing  ;如果还是按着此键未松开转移至.DoNothing(目的是防止键连按)

   ror           ;判断是否按了向右的键
   BCC   .NotR   ;如果没有按向右的键转移至.NotR
;*********按了向右的键[右光标键]***************
   LDA #$01
   JMP .DoNothing1
;**************END***********************
.NotR ror         ;判断是否按了向左的键
      bcc   .NotL ;如果没有按向左的键转移至.NotL
;**********按了向左的键[左光标键]********
  LDA #$02
  JMP .DoNothing1  
;**************END***********************
.NotL ROR         ;判断是否按了向下的键
      bcc   .NotD ;如果没有按向下的键转移至.NotD
;**********按了向下的键[下光标键]********
  LDA #$03
  JMP .DoNothing1  
;**************END***********************
.NotD ROR         ;判断是否按了向上的键
      BCC   .NotU ;如果没有按向上的键转移至.NotU
;********按了向上的键[上光标键]**********
  LDA #$04
  JMP .DoNothing1  
;**************END***********************      
.NotU ROR         ;判断是否按了开始的键
      BCC   .NotS ;如果没有按开始的键转移至.NotS
;**********按了开始的键[Enter键]*********
  LDA #$05
  JMP .DoNothing1
;**************END***********************      
.NotS ROR         ;判断是否按了选择的键
      BCC   .NotC ;如果没有按选择的键转移至.NotC
;*********按了选择的键[Tab键]************
  LDA #$06
  JMP .DoNothing1
;**************END***********************      
.NotC ROR         ;判断是否按了B键
      BCC   .NotB ;如果没有按B键转移至.NotB
;*************按了B键[Ctrl键]************
  LDA #$07
  JMP .DoNothing1
;**************END***********************     
.NotB ROR         ;判断是否按了A键
      BCC   .DoNothing ;如果没有按A键转移至.DoNothing
;*************按了A键[空格键]************
  LDA #$08
  JMP .DoNothing1
;**************END***********************    
.DoNothing
  LDA #$00
.DoNothing1       
  RTS
;**************************END**************************   

⌨️ 快捷键说明

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