📄 l51_bank.a51
字号:
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 + -