?? t128_bank.a51
字號:
INC DPTR
MOV A,#0xA0
MOVX @DPTR,A
; Registers[0xF1FB]=0x00;
INC DPTR
MOV A,#0x00
MOVX @DPTR,A
; Registers[0xF1FC]=0xE0;
INC DPTR
MOV A,#0xE0
MOVX @DPTR,A
; Registers[0xF1FD]=0x90;
MOV DPTR,#0xF1FD
MOV A,#0x90
MOVX @DPTR,A
ENDM
SWITCH3 MACRO ; Switch to Memory Bank #3
; Registers[0xF1F0]=0x0B;
MOV DPTR,#0xF1F0
MOV A,#0x0B
MOVX @DPTR,A
; Registers[0xF1F1]=0x00;
CLR A
INC DPTR
MOVX @DPTR,A
; Registers[0xF1F2]=0xC0;
INC DPTR
MOV A,#0xC0
MOVX @DPTR,A
; Registers[0xF1F3]=0x00;
INC DPTR
MOV A,#0x00
MOVX @DPTR,A
; Registers[0xF1F5]=0x6C;
MOV DPTR,#0xF1F5
MOV A,#0x6C
MOVX @DPTR,A
; Registers[0xF1F9]=0x00;
CLR A
MOV DPTR,#0xF1F9
MOVX @DPTR,A
; Registers[0xF1FA]=0x00;
INC DPTR
MOV A,#0x80
MOVX @DPTR,A
; Registers[0xF1FB]=0x00;
INC DPTR
MOV A,#0x00
MOVX @DPTR,A
; Registers[0xF1FC]=0xE0;
INC DPTR
MOV A,#0xE0
MOVX @DPTR,A
; Registers[0xF1FD]=0x90;
INC DPTR
MOV A,#0x90
MOVX @DPTR,A
; while(!(Registers[0xF1FC]&0x80));
?C0007:
MOV DPTR,#0xF1FC
MOVX A,@DPTR
JNB ACC.7,?C0007
?C0008:
; Registers[0xF1F0]=0x0B;
MOV DPTR,#0xF1F0
MOV A,#0x0B
MOVX @DPTR,A
; Registers[0xF1F1]=0x00;
CLR A
INC DPTR
MOVX @DPTR,A
; Registers[0xF1F2]=0xE0;
INC DPTR
MOV A,#0xE0
MOVX @DPTR,A
; Registers[0xF1F3]=0x00;
INC DPTR
MOV A,#0x00
MOVX @DPTR,A
; Registers[0xF1F5]=0x6C;
MOV DPTR,#0xF1F5
MOV A,#0x6C
MOVX @DPTR,A
; Registers[0xF1F9]=0x00;
CLR A
MOV DPTR,#0xF1F9
MOVX @DPTR,A
; Registers[0xF1FA]=0xA0;
INC DPTR
MOV A,#0xA0
MOVX @DPTR,A
; Registers[0xF1FB]=0x00;
INC DPTR
MOV A,#0x00
MOVX @DPTR,A
; Registers[0xF1FC]=0xE0;
INC DPTR
MOV A,#0xE0
MOVX @DPTR,A
; Registers[0xF1FD]=0x90;
MOV DPTR,#0xF1FD
MOV A,#0x90
MOVX @DPTR,A
ENDM
; *
; *
;-----------------------------------------------------------------------------*
ENDIF; *
; *
IF ?B_VAR_BANKING = 1; *
; *
XMEM EQU 0x02000000 ; LX51 xdata symbol offset: do not change! *
; *
;******* Configuration Section for uVision2 Memory Simulation Support *********
; *
; The following settings allow you to map the physical xdata and code memory *
; banks into simulation memory of the uVision2 Simulator. *
; *
?B?XSTART EQU 0x8000 ; Start of xdata bank area *
?B?XEND EQU 0xFFFF ; Stop of xdata bank area *
?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 uVision2 simulation memory area for the EEPROM V:0 .. V:0xFFFF *
; *
;-----------------------------------------------------------------------------*
; *
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 = 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 = 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
CNT SET CNT+1
ENDM
ENDIF ; close block IF ?B_MODE = 4 *******************************************
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -