?? l51_bank.a51
字號:
IF ?B_RTX = 0 AND ?B_NBANKS > 32
SWITCHBNK: XCH A,R0
ORL ?B_CURRENTBANK, #?B_MASK
ANL ?B_CURRENTBANK, A
MOV A,R0
RET
ELSEIF ?B_RTX = 1
SWITCHBNK: XCH A,R0
SWITCHBNK2: JBC EA,SWITCHBNK_EA1
ORL ?B_CURRENTBANK, #?B_MASK
ANL ?B_CURRENTBANK, A
MOV A,R0
RET
SWITCHBNK_EA1: ; interrupts where enabled
ORL ?B_CURRENTBANK, #?B_MASK
ANL ?B_CURRENTBANK, A
MOV A,R0
SETB EA ; enable interrupts again
RET
?B_RESTORE_BANK: ; entry for RTX-51 bank restore
ANL A,#?B_MASK
SJMP SWITCHBNK2
ENDIF
ENDIF ; close block IF ?B_MODE = 0 *******************************************
IF ?B_MODE = 1 ;***************************************************************
?B_FACTOR EQU 1 SHL ?B_FIRSTBIT
?B_MASK EQU MASK SHL ?B_FIRSTBIT
BANKN MACRO N
BANK&N EQU N SHL ?B_FIRSTBIT
ENDM
CNT SET 0
REPT ?B_NBANKS
BANKN %CNT
CNT SET CNT+1
ENDM
?C_INITSEG SEGMENT CODE ; Segment for Variable Initialization
RSEG ?C_INITSEG
DB 01H ; IData
DB ?B_CURRENTBANK ; Init Current Bank
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_NBANKS > 16
; Convert Bank No in Accu to Address * 4
IF ?B_FIRSTBIT = 0
CONVBANKNO MACRO
RL A
RL A
ENDM
ENDIF
IF ?B_FIRSTBIT = 1
CONVBANKNO MACRO
RL A
ENDM
ENDIF
IF ?B_FIRSTBIT = 2
CONVBANKNO MACRO
ENDM
ENDIF
IF ?B_FIRSTBIT = 3
CONVBANKNO MACRO
RR A
ENDM
ENDIF
IF ?B_FIRSTBIT = 4
CONVBANKNO MACRO
RR A
RR A
ENDM
ENDIF
IF ?B_FIRSTBIT = 5
CONVBANKNO MACRO
SWAP A
RL A
ENDM
ENDIF
IF ?B_FIRSTBIT = 6
CONVBANKNO MACRO
SWAP A
ENDM
ENDIF
IF ?B_FIRSTBIT = 7
CONVBANKNO MACRO
SWAP A
RR A
ENDM
ENDIF
; Macro code to select the 'N'
SWITCH MACRO N
ORG N * 4
PUBLIC ?B_SWITCH&N
?B_SWITCH&N:
MOV R0,#BANK&N
IF ?B_NBANKS > 32
IF (N < 32)
SJMP SWITCHBNK_H
ELSEIF (N = 32)
SWITCHBNK_H:
SJMP SWITCHBNK
ELSEIF (N <> ?B_NBANKS-1)
SJMP SWITCHBNK
ENDIF
ELSE
IF N <> (?B_NBANKS-1)
SJMP SWITCHBNK
ENDIF
ENDIF
ENDM
ENDIF
IF ?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
SWITCH MACRO N
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
ENDM
ENDIF
SELECT MACRO N
LOCAL XLABEL, YLABEL
PUBLIC ?B_BANK&N
?B_BANK&N:
MOV A,?B_CURRENTBANK
ANL A,#?B_MASK
CONVBANKNO ; Convert Bank Number to Address
PUSH ACC
MOV A,#HIGH ?BANK?SWITCH
PUSH ACC
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
?BANK?SWITCH SEGMENT CODE PAGE
RSEG ?BANK?SWITCH
CNT SET 0
REPT ?B_NBANKS
SWITCH %CNT
CNT SET CNT+1
ENDM
IF ?B_NBANKS > 16
SWITCHBNK: XCH A,R0
MOV DPTR,#?B_XDATAPORT
MOV ?B_CURRENTBANK,A
MOVX @DPTR,A
MOV A,R0
RET
ENDIF
IF (?B_RTX = 1 OR ?B_VAR_BANKING = 1)
?B_RESTORE_BANK: ; entry for RTX-51/XBANKING bank restore
MOV DPTR,#?B_XDATAPORT
MOV ?B_CURRENTBANK,A
MOVX @DPTR,A
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
IF (LONG_MACRO = 1)
?B_SWITCHJ&N:
ELSE
?B_SWITCH&N:
ENDIF
MOV ?B_CURRENTBANK,#LOW ?B_SWITCH&N
SWITCH&N
RET
ENDM
IF (LONG_MACRO = 1)
SWITCHJ MACRO N
?B_SWITCH&N:
JMP ?B_SWITCHJ&N
ENDM
ENDIF
?BANK?SWITCH SEGMENT CODE PAGE
RSEG ?BANK?SWITCH
B_SWITCH_START EQU $
IF (LONG_MACRO = 1)
; Generate ?B_SWITCHn jmp table entries
CNT SET 0
REPT ?B_NBANKS
SWITCHJ %CNT
CNT SET CNT+1
ENDM
ENDIF
; Generate ?B_SWITCHn functions
CNT SET 0
REPT ?B_NBANKS
BANK %CNT
SWITCH %CNT
CNT SET CNT+1
ENDM
B_SWITCH_SIZE EQU $-B_SWITCH_START
IF (LONG_MACRO = 0) AND (B_SWITCH_SIZE > 256)
__ERROR__ "BANK SWITCH CODE BIGGER THAN 256 BYTES, SET LONG_MACRO TO 1"
ENDIF
ENDIF ; close block IF ?B_MODE = 4 *******************************************
RSEG ?BANK?SELECT
;************************ SWITCHBANK FUNCTION *******************************
; *
; SWITCHBANK allows use of bank-switching for C programs *
; *
; prototype: extern switchbank (unsigned char bank_number); *
; *
;******************************************************************************
PUBLIC _SWITCHBANK, ?B_SWITCHBANK_A
_SWITCHBANK: MOV A,R7
IF ?B_MODE = 0 ;**************************************************************
?B_SWITCHBANK_A:
IF ?B_NBANKS > 32 OR ?B_RTX = 1
RL A
RL A
ENDIF
IF ?B_NBANKS <= 16 AND ?B_RTX = 0
SWAP A
RR A
ENDIF
MOV DPTR,#?BANK?SWITCH
JMP @A+DPTR
ENDIF ; close block IF ?B_MODE = 0 *******************************************
IF ?B_MODE = 1 ;***************************************************************
?B_SWITCHBANK_A:
IF ?B_NBANKS > 16
RL A
RL A
ENDIF
IF ?B_NBANKS <= 16
SWAP A
ENDIF
MOV DPTR,#?BANK?SWITCH
JMP @A+DPTR
ENDIF ; close block IF ?B_MODE = 1 *******************************************
IF ?B_MODE = 4 ;**************************************************************
IF (?B_VAR_BANKING = 1)
SJMP ?B_SWITCHBANK_A
SELECT_BANK_R3:
MOV A,R3
DEC A
ANL A,#3FH
ENDIF
?B_SWITCHBANK_A:
MOV DPTR,#switch_tab
MOVC A,@A+DPTR
?B_RESTORE_BANK: ; entry for RTX-51/XBANKING bank restore
MOV DPTR,#?BANK?SWITCH
JMP @A+DPTR
S_ENTRY MACRO N
DB LOW ?B_SWITCH&N
ENDM
switch_tab:
CNT SET 0
REPT ?B_NBANKS
S_ENTRY %CNT
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -