?? l51_bank.a51
字號:
$NOMOD51 NOLINES
$NOCOND
;
; *** <<< Use Configuration Wizard in Context Menu >>> ***
;------------------------------------------------------------------------------
; This file is part of the BL51 / LX51 Banked Linker/Locater package
; Copyright (c) 1988 - 2001 Keil Elektronik GmbH and Keil Software, Inc.
; Version 2.22 (Code and Variable Banking for Classic 8051 Derivatives)
;------------------------------------------------------------------------------
;************************ Configuration Section *******************************
;<h> Bank Configuration
;
; <i> Program Code in expanded memory is supported via the code banking mechanism
; <i> known from the classic 8051 architecture. You need to specify the number
; <i> of code banks that are required for your application.
;
; <o> ?B_NBANKS: Number of Banks
; <2=> 2
; <4=> 4
; <8=> 8
; <16=> 16
; <32=> 32
; <64=> 64
; <i> For BL51 the maximum value for ?B_NBANKS is 32
; <i> For LX51 the maximum value for ?B_NBANKS is 64
?B_NBANKS EQU 4 ; Define maximum Number of Banks
; ; following values are allowed: 2, 4, 8, 16, 32, 64
; ; for BL51 the maximum value for ?B_NBANKS is 32
; ; for LX51 the maximum value for ?B_NBANKS is 64
;
; <o> ?B_MODE: Bank Switching via
; <0=> 8051 Port
; <1=> XDATA Port
; <4=> User-provided bank switch code
?B_MODE EQU 0 ; 0 for Bank-Switching via 8051 Port
; ; 1 for Bank-Switching via XDATA Port
; ; 4 for user-provided bank switch code
;
; <q> ?B_RTX: The application uses RTX-51 Real-time OS
?B_RTX EQU 1 ; 0 for applications without real-time OS
; ; 1 for applications using the RTX-51 real-time OS
;
; <q> ?B_VAR_BANKING: Variable banking uses this L51_BANK module
; <i> Notes: ?B_VAR_BANKING uses the 'far' and 'far const' C51 memory types to
; <i> extent the space for variables in RAM and/or ROM of classic 8051
; <i> device. The same hardware as for code banking is used. Program
; <i> code banking and variable banking share the same hardware I/O pins.
; <i> The C51 Compiler must be used with the VARBANKING directive.
; <i> Variable Banking is only supported with the LX51 linker/locater.
?B_VAR_BANKING EQU 0 ; Variable Banking via L51_BANK (far memory support)
; ; 0 Variable Banking does not use L51_BANK.A51
; ; 1 Variable Banking uses this L51_BANK.A51 module
; Notes: ?B_VAR_BANKING uses the 'far' and 'far const' C51 memory types to
; extent the space for variables in RAM and/or ROM of classic 8051
; device. The same hardware as for code banking is used. Program
; code banking and variable banking share the same hardware I/O pins.
; The C51 Compiler must be used with the VARBANKING directive.
; Variable Banking is only supported with the LX51 linker/locater.
;
; <o> ?B_RST_BANK: Active code bank number after a Reset <0x0-0xFF>
; <i> Notes:
; <i> 1. This specifies the active code bank number after CPU reset.
; <i> It is used to reduce the entries in the INTERBANK CALL TABLE.
; <i> 2. The value 0xFF disables LX51 linker/locater optimization.
; <i> 3. Interbank Call Table optimization is only possible with LX51.
?B_RST_BANK EQU 0xFF ; specifies the active code bank number after CPU
; ; Reset. Used to reduce the entries in the
; ; INTERBANK CALL TABLE. The value 0xFF disables
; ; this LX51 linker/locater optimization.
; Note: Interbank Call Table optimization is only possible with LX51.
;
;</h>
;-----------------------------------------------------------------------------
;
IF ?B_MODE = 0;
;-----------------------------------------------------------------------------
; if ?BANK?MODE is 0 define the following values
; For Bank-Switching via 8051 Port define Port Address / Bits
;
;<h> Bank Switching via 8051 Port
; <i> This is only used if ?B_MODE is 0
; <o> P1: 8051 Port address <0x0-0xFF>
P1 DATA 90H ; I/O Port Address
;
?B_PORT EQU P1 ; default is P1
; <o> ?B_FIRSTBIT: Starting with Bit <0-7>
; <i> Default is Bit 2
?B_FIRSTBIT EQU 2 ; default is Bit 2
;</h>
;-----------------------------------------------------------------------------
ENDIF;
;
IF ?B_MODE = 1;
;-----------------------------------------------------------------------------
; if ?BANK?MODE is 1 define the following values
; For Bank-Switching via XDATA Port define XDATA Port Address / Bits
;
;<h> Bank Switching via XDATA Port Address
; <i> This is only used if ?B_MODE is 1
; <o> P1: XDATA port address <0x0-0xFFFF>
?B_XDATAPORT EQU 0FFFFH ; default is XDATA Port Address 0FFFFH
; <o> ?B_FIRSTBIT: Starting with Bit <0-7>
; <i> Default is Bit 0
?B_FIRSTBIT EQU 0 ; default is Bit 0
;</h>
;-----------------------------------------------------------------------------
ENDIF;
;
IF ?B_MODE = 4;
;-----------------------------------------------------------------------------
; if ?BANK?MODE is 4 define the following switch macros
; For bank switching via user-provided bank switch code you must define for
; each memory bank your own macro which contains the bank switch code. The
; following example shows how to use the I/O lines P1.4 and P1.7 for bank
; switching. Since you can select only 4 banks with two address lines, only
; four macros are defined. The number of macros must conform with the number
; ?B_NBANKS number, i.e. for an application with 16 memory banks you must
; define 16 macros.
;
; IMPORTANT NOTES:
; 1. The bank switch logic must be initialized before using it. Therefore
; add the following lines of code at the end of the STARTUP.A51 file:
;
; EXTRN CODE (?B_SWITCH0)
; CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
; LJMP ?C_START ; line already exits at the end of file
;
;
; 2. If the bank switch macros and the additional control code generate more
; than 256 bytes, you need to set the LONG_MACRO flag below. The error
; message "BANK SWITCH CODE BIGGER THAN 256 BYTES, SET LONG_MACRO TO 1"
; is generated in case that this is required.
;
; 3. The only registers that can be modified in this routines without prior
; saving are: DPTR and ACC.
;
;
; <h> Bank Switching via User Provided Code
; <i> This is only used if ?B_MODE is 4
; <o> LONG_MACRO: Macro size and number of banks
; <0=> Macros use less than 257 bytes and 8 banks or less
; <1=> Macros use more than 256 bytes and more than 8 banks
LONG_MACRO EQU 0 ; 0 default, for normal macros and up to 8 banks
; ; 1 big macro code or many banks
;
;
P1 DATA 90H ; I/O Port Addresses
P3 DATA 0B0H
;
SWITCH0 MACRO ; Switch to Memory Bank #0
CLR P1.5 ; Clear Port 1 Bit 5
CLR P3.3 ; Clear Port 3 Bit 3
ENDM
;
SWITCH1 MACRO ; Switch to Memory Bank #1
SETB P1.5 ; Set Port 1 Bit 5
CLR P3.3 ; Clear Port 3 Bit 3
ENDM
;
SWITCH2 MACRO ; Switch to Memory Bank #2
CLR P1.5 ; Clear Port 1 Bit 5
SETB P3.3 ; Set Port 3 Bit 3
ENDM
;
SWITCH3 MACRO ; Switch to Memory Bank #3
SETB P1.5 ; Set Port 1 Bit 5
SETB P3.3 ; Set Port 3 Bit 3
ENDM
;
; </h>
;-----------------------------------------------------------------------------
ENDIF;
;
IF ?B_VAR_BANKING = 1;
;
XMEM EQU 0x02000000 ; LX51 xdata symbol offset: do not change!
;
;******* Configuration Section for uVision Memory Simulation Support *********
;
; <h> 礦ision Memory Simulation Support
;
; <i> The following settings allow you to map the physical XDATA and CODE memory
; <i> banks into simulation memory of the 礦ision3 Simulator.
;
; <o> ?B?XSTART: Start of the XDATA bank area <0x0-0xFFFF>
?B?XSTART EQU 0x8000 ; Start of xdata bank area
; <o> ?B?XEND: End of the XDATA bank area <0x0-0xFFFF>
?B?XEND EQU 0xFFFF ; Stop of xdata bank area
; <o> ?B?XMEM: Start of XDATA bank area <0x010000-0xFFFFF>
?B?XMEM EQU XMEM+0x010000 ; First HDATA memory bank in xdata space
;
; The above setting redirects the symbols in the area X:0x20000 .. X:0x2FFFF
; into the uVision3 simulation memory area for the EEPROM V:0 .. V:0xFFFF
;
; </h>
;-----------------------------------------------------------------------------
;
PUBLIC ?B?XSTART, ?B?XEND, ?B?XMEM
ENDIF;
;
;******************************************************************************
; *
; THEORY OF OPERATION *
; ------------------- *
; The section below describes the code generated by BL51 or LX51 and the *
; operation of the L51_BANK.A51 module. BL51/LX51 generates for each *
; function that is located in a code memory bank and called from the common *
; area or a different code bank and entry into the INTRABANK CALL TABLE. The *
; INTRABANK CALL TABLE is located in the SEGMENT ?BANK?SELECT and listed in *
; the Linker MAP file. The entries in that TABLE have the following format: *
; *
; ?FCT?1: MOV DPTR,#FCT ; Load Address of target FCT *
; JMP ?B_BANKn ; Switch to Bank and Jump to Target Code *
; *
; Instead of directly calling the function FCT, the Linker changes the entry *
; to ?FCT?1. This entry selects the bank where the function FCT is located *
; and calls that function via the routines defined in this L51_BANK.A51 file. *
; The L51_BANK.A51 file contains two sets of functions for each bank: *
; *
; ?B_BANKn is a routine which saves the entry of the ?B_SWITCHn function *
; for the current active bank on the STACK and switches to the *
; bank 'n'. Then it jumps to the address specified by the DPTR *
; register. It is allowed to modify the following registers in *
; the ?B_BANKn routine: A, B, R0, DPTR, PSW *
; *
; ?B_SWITCHn is a function which selects the bank 'n'. This function is *
; used at the end of a user function to return to the calling *
; code bank. Only the following registers may be altered in the *
; ?B_SWITCHn function: R0, DPTR *
; *
; The current active bank is stored in ?B_CURRENTBANK. RTX-51 uses this *
; variable to restore the code bank after a task switch. To get correct *
; results, ?B_CURRENTBANK must be set to the code bank before the hardware *
; switch is done, or the code banking sequences must be interrupt protected. *
;******************************************************************************
NAME ?BANK?SWITCHING
PUBLIC ?B_NBANKS, ?B_MODE, ?B_CURRENTBANK, ?B_MASK
PUBLIC ?B_FACTOR, ?B_RST_BANK
IF (?B_RTX = 1)
PUBLIC ?B_RESTORE_BANK
ENDIF
; Standard SFR Symbols required in L51_BANK.A51
ACC DATA 0E0H
B DATA 0F0H
DPL DATA 82H
DPH DATA 83H
IE DATA 0A8H
EA BIT IE.7
; generate Mask and Bank Number Information
IF ?B_NBANKS <= 2
MASK EQU 00000001B
ELSEIF ?B_NBANKS <= 4
MASK EQU 00000011B
ELSEIF ?B_NBANKS <= 8
MASK EQU 00000111B
ELSEIF ?B_NBANKS <= 16
MASK EQU 00001111B
ELSEIF ?B_NBANKS <= 32
MASK EQU 00011111B
ELSE
MASK EQU 00111111B
ENDIF
IF ?B_MODE = 0 ;**************************************************************
?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
?B_CURRENTBANK EQU ?B_PORT
IF ?B_RTX = 1 OR ?B_NBANKS > 32
; 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 OR NOT ?B_MASK)
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_RTX = 0 AND ?B_NBANKS <= 32
; 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
; Macro code to select the 'N'
SWITCH MACRO N
ORG N * 8
PUBLIC ?B_SWITCH&N
?B_SWITCH&N:
IF N <> 0
ORL ?B_CURRENTBANK,#?B_MASK
ENDIF
IF N <> (?B_NBANKS-1)
ANL ?B_CURRENTBANK,#(BANK&N OR NOT ?B_MASK)
ENDIF
RET
ENDM
ENDIF
SELECT MACRO N
LOCAL XLABEL, YLABEL
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -