⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 l51_bank.a51

📁 液晶显示程序
💻 A51
📖 第 1 页 / 共 2 页
字号:
                DB      0               ; Set to Zero
                DB      41H             ; XData
                DW      ?B_XDATAPORT    ; Init XDATA Port
                DB      0               ; Set to Zero

                PUBLIC  ?B_XDATAPORT

?BANK?DATA      SEGMENT DATA
                RSEG    ?BANK?DATA
?B_CURRENTBANK: DS      1


IF ?B_RTX = 1 OR ?B_NBANKS > 16
  ; Convert Bank No in Accu to Address * 8

  IF  ?B_FIRSTBIT = 0
  CONVBANKNO    MACRO
                SWAP    A
                RR      A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 1
  CONVBANKNO    MACRO
                RL      A
                RL      A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 2
  CONVBANKNO    MACRO
                RL      A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 3
  CONVBANKNO    MACRO
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 4
  CONVBANKNO    MACRO
                RR      A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 5
  CONVBANKNO    MACRO
                RR      A
                RR      A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 6
  CONVBANKNO    MACRO
                SWAP    A
                RL      A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 7
  CONVBANKNO    MACRO
                SWAP    A
                ENDM
  ENDIF
ENDIF


IF ?B_RTX = 0 AND ?B_NBANKS <= 16
  ; Convert Bank No in Accu to Address * 16
  IF  ?B_FIRSTBIT = 0
  CONVBANKNO    MACRO
                SWAP    A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 1
  CONVBANKNO    MACRO
                SWAP    A
                RR      A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 2
  CONVBANKNO    MACRO
                RL      A
                RL      A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 3
  CONVBANKNO    MACRO
                RL      A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 4
  CONVBANKNO    MACRO
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 5
  CONVBANKNO    MACRO
                RR      A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 6
  CONVBANKNO    MACRO
                RR      A
                RR      A
                ENDM
  ENDIF

  IF  ?B_FIRSTBIT = 7
  CONVBANKNO    MACRO
                SWAP    A
                RL      A
                ENDM
  ENDIF
ENDIF


SELECT          MACRO   N
LOCAL           XLABEL, YLABEL

                PUBLIC  ?B_BANK&N
?B_BANK&N:
                MOV     A,?B_CURRENTBANK
                ANL     A,#?B_MASK
;;              CJNE    A,#BANK&N,XLABEL
;;              SJMP    YLABEL
;;XLABEL:
                CONVBANKNO         ; Convert Bank Number to Address
                PUSH    ACC
                MOV     A,#HIGH ?BANK?SWITCH
                PUSH    ACC
;;YLABEL:
                PUSH    DPL
                PUSH    DPH
                LJMP    ?B_SWITCH&N

                ENDM


?BANK?SELECT    SEGMENT  CODE

                RSEG    ?BANK?SELECT
CNT             SET     0

                REPT    ?B_NBANKS
                SELECT  %CNT
CNT             SET     CNT+1

                ENDM


SWITCH          MACRO   N
  IF  ?B_RTX = 0 AND ?B_NBANKS <= 16
                ORG     N * 16
                PUBLIC  ?B_SWITCH&N
    ?B_SWITCH&N:
                MOV     R0,A
                MOV     A,#BANK&N
                MOV     DPTR,#?B_XDATAPORT
                MOV     ?B_CURRENTBANK,A
                MOVX    @DPTR,A
                MOV     A,R0
                RET
  ENDIF

  IF  ?B_RTX = 1 OR ?B_NBANKS > 16
                ORG     N * 8
                PUBLIC  ?B_SWITCH&N
    ?B_SWITCH&N:
                MOV     R0,A
                MOV     A,#BANK&N
                LJMP    SWITCHNOW
  ENDIF

                ENDM


?BANK?SWITCH    SEGMENT  CODE  PAGE

                RSEG    ?BANK?SWITCH
CNT             SET     0

                REPT    ?B_NBANKS
                SWITCH  %CNT

CNT             SET     CNT+1
                ENDM


  IF  ?B_RTX = 1 OR ?B_NBANKS > 16
    SWITCHNOW:  MOV     DPTR,#?B_XDATAPORT
    IF ?B_RTX = 0
                MOV     ?B_CURRENTBANK,A
                MOVX    @DPTR,A
    ELSE
;;;             PUSH    IE
;;;             CLR     EA
                MOV     ?B_CURRENTBANK,A
                MOVX    @DPTR,A
;;;             POP     IE
    ENDIF
                MOV     A,R0
                RET
  ENDIF

ENDIF  ; close block IF ?B_MODE = 1 *******************************************


IF  ?B_MODE = 4 ;**************************************************************

?B_FACTOR       EQU     0               ; Dummy Declarations
?B_FIRSTBIT     EQU     0
?B_MASK         EQU     MASK

?BANK?SELECT    SEGMENT CODE
?BANK?DATA      SEGMENT DATA
                RSEG    ?BANK?DATA
?B_CURRENTBANK: DS      1

BANK            MACRO   N
                PUBLIC  ?B_BANK&N
?B_BANK&N:
                PUSH    ?B_CURRENTBANK
                MOV     A,#HIGH ?BANK?SWITCH
                PUSH    ACC
                PUSH    DPL
                PUSH    DPH
                ENDM

SWITCH          MACRO   N
                PUBLIC  ?B_SWITCH&N
?B_SWITCH&N:
                MOV     ?B_CURRENTBANK,#LOW ?B_SWITCH&N
                SWITCH&N
                RET
                ENDM

?BANK?SWITCH    SEGMENT CODE PAGE

                RSEG    ?BANK?SWITCH
; Generate ?B_SWITCHn functions
CNT             SET     0

                REPT    ?B_NBANKS
                BANK    %CNT
                SWITCH  %CNT
CNT             SET     CNT+1
                ENDM

IF (HIGH ?BANK?SWITCH) <> (HIGH $)
ERROR BANK SWITCH CODE EXCEEDS 256 BYTES
ENDIF


;---- Initialization of ?B_CURRENTBANK and execution of SWITCH0:
;?C_C51STARTUP?1 SEGMENT CODE
;                RSEG    ?C_C51STARTUP?1
;                CLR     A
;                MOV     ?B_CURRENTBANK,A       ; Init Current Bank
;                SWITCH0                        ; Execute SWITCH0 Macro


COMMON_XDATA    MACRO     ; Switch back to common XDATA bank
                SWITCH1                        ; Switch to XDATA Bank 1
                ENDM


ENDIF  ; close block IF ?B_MODE = 4 *******************************************
;?BANK?SELECT   SEGMENT CODE

                RSEG    ?BANK?SELECT

;************************  SWITCHBANK FUNCTION  *******************************
;                                                                             *
; SWITCHBANK allows use of bank-switching for C programs                      *
;                                                                             *
; prototype:   extern switchbank (unsigned char bank_number);                 *
;                                                                             *
;******************************************************************************
                PUBLIC  _SWITCHBANK

_SWITCHBANK:    MOV     A,R7

IF  ?B_VAR_BANKING <> 0 ;******************************************************

                SJMP    _SWITCHBANK_A

PUBLIC ?C_VBANKING
PUBLIC ?B_VAR_BANKING
PUBLIC ?B_COMMON_XRAM
PUBLIC ?B_INTR_ACCESS

C_VBANKING:
IF ?B_COMMON_XRAM = 0
  IF ?B_INTR_ACCESS = 0
                JBC     EA,ENA_Intr     ; Check EA and disable interrupts
                CALL    SWITCH_VBANK    ; Switch to XDATA bank and make access
                COMMON_XDATA            ; Switch back to common XDATA bank
                RET

ENA_Intr:       CALL    SWITCH_VBANK    ; Switch to XDATA bank and make access
                COMMON_XDATA            ; Switch back to common XDATA bank
                BSET    EA              ; If EA was 1 enable interrupts again
                RET
  ELSE
                CALL    SWITCH_VBANK    ; Switch to XDATA bank and make access
                COMMON_XDATA            ; Switch back to common XDATA bank
                RET
  ENDIF
ENDIF

SWITCH_VBANK:   PUSH    DPL
                PUSH    DPH
                PUSH    ACC
                MOV     A,R3

IF  ?B_VARBANKING = 2

                JB      ACC.7,CONST_BANKING


ENDIF

CONST_BANKING:  ANL     A,#MASK

ENDIF  ; close block IF ?B_VAR_BANKING <> 0 ***********************************

IF  ?B_MODE = 0 ;**************************************************************

_SWITCHBANK_A:  SWAP    A
                RR      A
                MOV     DPTR,#?BANK?SWITCH
                JMP     @A+DPTR

ENDIF  ; close block IF ?B_MODE = 0 *******************************************

IF ?B_MODE = 1 ;***************************************************************

_SWITCHBANK_A:
IF ?B_NBANKS > 16 OR ?B_RTX = 1
                SWAP    A
                RR      A
ENDIF

IF ?B_NBANKS <= 16 AND ?B_RTX = 0
                SWAP    A
ENDIF
                MOV     DPTR,#?BANK?SWITCH
                JMP     @A+DPTR

ENDIF  ; close block IF ?B_MODE = 1 *******************************************


IF  ?B_MODE = 4 ;**************************************************************

S_ENTRY         MACRO   N
                DB      LOW ?B_SWITCH&N
                ENDM

_SWITCHBANK_A:
                ADD     A,#switch_tab+3-$
                MOVC    A,@A+PC
                MOV     DPTR,#?BANK?SWITCH
                JMP     @A+DPTR

switch_tab:
CNT             SET     0

                REPT    ?B_NBANKS
                S_ENTRY %CNT
CNT             SET     CNT+1
                ENDM
ENDIF  ; close block IF ?B_MODE = 4 *******************************************


                END

⌨️ 快捷键说明

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