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

📄 sys.a51

📁 mstar 776 开发的车载dvd
💻 A51
字号:
;///////////////////////////////////////////////////////////////////////////////
;
; Copyright (c) 2006-2007 MStar Semiconductor, Inc.
; All rights reserved.
;
; Unless otherwise stipulated in writing, any and all information contained
; herein regardless in any format shall remain the sole proprietary of
; MStar Semiconductor Inc. and be kept in strict confidence
; (¨MStar Confidential Information〃) by the recipient.
; Any unauthorized act including without limitation unauthorized disclosure,
; copying, use, reproduction, sale, distribution, modification, disassembling,
; reverse engineering and compiling of the contents of MStar Confidential
; Information is unlawful and strictly prohibited. MStar hereby reserves the
; rights to any and all damages, losses, costs and expenses resulting therefrom.
;
;///////////////////////////////////////////////////////////////////////////////

REG_SPI_START_0    EQU 0x1014
REG_SPI_START_1    EQU 0x1010
REG_SPI_END_0      EQU 0x1016
REG_SPI_END_1      EQU 0x1012

REG_CACHE_START_0  EQU 0x100C
REG_CACHE_START_1  EQU 0x1008
REG_CACHE_END_0    EQU 0x100E
REG_CACHE_END_1    EQU 0x100A

REG_CODE_FETCH     EQU 0x1018   ; Code fetch configuration
REG_CODE_BANK      EQU 0x1019   ; Current code bank
REG_CACHE_BASE     EQU 0x2B80   ; Code fetch base address in MIU (unit: 64kbytes)
REG_CACHE_BYPASS   EQU 0x2BA0

REG_SDR_XD_MAP_1   EQU 0x2BCC

// multiple DPTR
DPS     DATA    0x92
// MDU
MD0     DATA    0xE9
MD1     DATA    0xEA
MD2     DATA    0xEB
MD3     DATA    0xEC
MD4     DATA    0xED
MD5     DATA    0xEE

UD      BIT     0xD0.1

NAME	SYS

ENTRY MACRO symbol
    PUBLIC symbol
    symbol:
      ENDM

EXTRN	CODE (?C?CLDPTR)
EXTRN	CODE (?C?CSTPTR)
EXTRN   CODE (_msWarning)


?XD??_MDrv_Sys_RunCodeInXXX?DRVSYS      SEGMENT XDATA OVERLAYABLE
    RSEG    ?XD??_MDrv_Sys_RunCodeInXXX?DRVSYS

ENTRY ?_MDrv_Sys_CopyVAR2MIU?BYTE
ENTRY ?_MDrv_Sys_CopyMIU2VAR?BYTE

ENTRY ?_MDrv_MIU_VAR2SDRAMCopy?BYTE     ; for compatible, remove later
ENTRY ?_MDrv_MIU_SDRAM2VARCopy?BYTE

    ORG  7
    u16Length:   DS   4


?PR?_MDrv_Sys_RunCodeInXXX?DRVSYS       SEGMENT CODE  PAGE
	RSEG  ?PR?_MDrv_Sys_RunCodeInXXX?DRVSYS

	USING	0

;
; Get current code bank to R0
;
GET_CODE_BANK_TO_R0:
    MOV     DPTR, #(REG_CODE_BANK)
    MOVX    A, @DPTR
    MOV     R0, A
    RET

;
; bit MDrv_Sys_IsCodeInSPI( void );
;
ENTRY MDrv_Sys_IsCodeInSPI
    ;
    ; Return true if icache is enabled
    ;
	MOV  	DPTR, #(REG_CODE_FETCH)
	MOVX    A, @DPTR
	CLR     C
	SUBB    A, #08EH
	JC      EXIT_IsCodeInSPI

    CALL    GET_CODE_BANK_TO_R0

	;
	; Get SPI Start Bank
	;
	MOV  	DPTR, #(REG_CACHE_END_1)
	MOVX 	A, @DPTR
    SUBB    A, R0       ; C == 0 before SUBB

EXIT_IsCodeInSPI:

    RET
;
; void MDrv_Sys_RunCodeInSPI( void );
;
; This is called in STARTUP.A51, please check the code bank setting of this file
;
ENTRY MDrv_Sys_RunCodeInSPI

    CALL    MDrv_Sys_IsCodeInSPI    ; Now R0 is current code bank

    JC      DISABLE_CACHE

SWITCH_TO_SPI:
    ;
    ; Prepare for SPI
    ;
	MOV  	A, R0
	MOV  	DPTR, #(REG_CACHE_END_1)
	MOVX 	@DPTR, A

	MOV  	DPTR, #(REG_CACHE_END_0)
	MOV  	A, #LOW (DISABLE_CACHE-1)
	MOVX 	@DPTR, A
	INC  	DPTR
	MOV     A, #HIGH (DISABLE_CACHE-1)
	MOVX 	@DPTR, A

	MOV  	DPTR, #(REG_SPI_START_0)
	MOV     A, #LOW (DISABLE_CACHE)
	MOVX 	@DPTR, A
	INC  	DPTR
	MOV     A, #HIGH (DISABLE_CACHE)
	MOVX 	@DPTR, A

    MOV     A, R0
	MOV     DPTR, #(REG_SPI_START_1)
	MOVX    @DPTR, A

	NOP

DISABLE_CACHE:
    ;
    ; Disable and reset iCACHE
    ;
    MOV     DPTR, #(REG_CODE_FETCH)
    MOV     A, #082H
    MOVX    @DPTR, A

;
; void MDrv_Sys_ExtendSPIRange( void );
;
ENTRY MDrv_Sys_ExtendSPIRange
    ;
    ; Set SPI Start to 0x000000
    ;
	CLR  	A
	MOV  	DPTR, #(REG_SPI_START_0)
	MOVX 	@DPTR, A
	INC  	DPTR
	MOVX 	@DPTR, A
	MOV  	DPTR, #(REG_SPI_START_1)
	MOVX 	@DPTR, A

SET_SPI_END_WITH_CPL_ACC:
    ;
    ; Set SPI End to 0xFFFFFF
    ;
	MOV  	DPTR, #(REG_SPI_END_0)
	CPL     A
	MOVX 	@DPTR, A
	INC  	DPTR
	MOVX 	@DPTR, A
	MOV  	DPTR, #(REG_SPI_END_1)
	MOVX 	@DPTR, A
	RET

;
; void MDrv_Sys_RunCodeInMIU( U16 u16MIUAddrInBank,     // R6, R7
;                             U8 u8NumBanks,            // R5
;                             BOOLEAN bBypassCache );   // R3
;
FIX_CACHE_CODE_MAPPING:
    ;
    ; Set SPI Start to (u8NumBanks)  :0000
    ; Set Cache End to (u8NumBanks-1):FFFF
    ;
	MOV     A, R5
	MOV  	DPTR, #(REG_SPI_START_1)
	MOVX 	@DPTR, A
	DEC     A
	MOV     DPTR, #(REG_CACHE_END_1)
	MOVX    @DPTR, A

	MOV  	DPTR, #(REG_SPI_START_0)
	CLR  	A
	MOVX 	@DPTR, A
	INC  	DPTR
	MOVX 	@DPTR, A

	CPL     A
    MOV     DPTR, #(REG_CACHE_END_0)
    MOVX    @DPTR, A
    INC     DPTR
    MOVX    @DPTR, A

    RET

ENABLE_CACHE:
    ;
    ; Enable both SPI & iCACHE, also set `iCACHE no reset' bit
    ;
	MOV  	DPTR, #(REG_CODE_FETCH)
	MOV  	A, #08EH
	MOVX 	@DPTR, A

    ;
    ; Set cache base after clear iCACHE reset
    ;
	MOV  	DPTR, #(REG_CACHE_BASE)
	MOV     A, R7
	MOVX 	@DPTR, A
	INC  	DPTR
	MOV     A, R6
	MOVX 	@DPTR, A

	;
	; Enable HKMCU iCache bypass if bBypassCache(R3) is not zero
	;
    MOV     A, #0xFF
    ADD     A, R3
	MOV     DPTR, #(REG_CACHE_BYPASS)
	MOVX    A, @DPTR
    MOV     ACC.0, C
    MOVX    @DPTR, A
EXIT_RunCodeInMIU:
    RET

ENTRY  _MDrv_Sys_RunCodeInMIU
    ;
    ; R0: CurrCodeBank
    ;

    ;
    ; if (u8NumBanks == 0) do nothing
    ;
    MOV     A, R5
    JZ      EXIT_RunCodeInMIU

    ;
    ; Set iCache Start to 0x0
    ;
	MOV  	DPTR, #(REG_CACHE_START_0)
	CLR  	A   ; 0x00
	MOVX 	@DPTR, A
	INC  	DPTR
	MOVX 	@DPTR, A
	MOV  	DPTR, #(REG_CACHE_START_1)
	MOVX 	@DPTR, A

    CALL    SET_SPI_END_WITH_CPL_ACC
    CALL    GET_CODE_BANK_TO_R0

    ;
    ; if (u8NumBanks < CurrCodeBank) transfer to cache
    ;
    CLR     C
    SUBB    A, R5
    JC      SWITCH_TO_CACHE

    CALL    FIX_CACHE_CODE_MAPPING
    SJMP    ENABLE_CACHE

SWITCH_TO_CACHE:
    ;
    ; Prepare for Cache
    ;
	MOV  	DPTR, #(REG_CACHE_END_0)
	MOV  	A, #LOW (ENABLE_CACHE-1)
	MOVX 	@DPTR, A
	INC  	DPTR
	MOV     A, #HIGH (ENABLE_CACHE-1)
	MOVX 	@DPTR, A

	MOV  	DPTR, #(REG_SPI_START_0)
	MOV     A, #LOW (ENABLE_CACHE)
	MOVX 	@DPTR, A
	INC  	DPTR
	MOV     A, #HIGH (ENABLE_CACHE)
	MOVX 	@DPTR, A

	MOV  	A, R0
	MOV  	DPTR, #(REG_CACHE_END_1)
	MOVX 	@DPTR, A
	MOV     DPTR, #(REG_SPI_START_1)
	MOVX    @DPTR, A

    CALL    ENABLE_CACHE
    SJMP    FIX_CACHE_CODE_MAPPING

;
; U16 MDrv_Sys_SetXdataWindow1Base(U16 u16XDWin1BaseIn4Kytes);          // R6 - R7
;
ENTRY _MDrv_Sys_SetXdataWindow1Base
    MOV     DPTR, #(REG_SDR_XD_MAP_1)
    MOVX    A, @DPTR
    XCH     A, R7
    MOVX    @DPTR, A
    INC     DPTR
    MOVX    A, @DPTR
    XCH     A, R6
    MOVX    @DPTR, A
    RET

;
; U16 MDrv_Sys_GetXdataWindow1Base(void);
;
ENTRY MDrv_Sys_GetXdataWindow1Base
    MOV     DPTR, #(REG_SDR_XD_MAP_1)
    MOVX    A, @DPTR
    MOV     R7, A
    INC     DPTR
    MOVX    A, @DPTR
    MOV     R6, A
    RET

;
; void MDrv_MIU_VAR2SDRAMCopy( U8 * pAddr,        // R1 - R3
;                              U32 u32MiuAddr,    // R4 - R7
;                              U32 u32Length )
;
ENTRY _MDrv_MIU_VAR2SDRAMCopy
    MOV     DPTR, #(u16Length + 2)
    MOVX    A, @DPTR
    MOV     DPTR, #(u16Length)
    MOVX    @DPTR, A

    MOV     DPTR, #(u16Length + 3)
    MOVX    A, @DPTR
    MOV     DPTR, #(u16Length + 1)
    MOVX    @DPTR, A

    SJMP    _MDrv_Sys_CopyVAR2MIU

;
; void MDrv_MIU_SDRAM2VARCopy( U32 u32MiuAddr,    // R4 - R7
;                              U8 * pAddr,        // R1 - R3
;                              U32 u32Length )
;
ENTRY _MDrv_MIU_SDRAM2VARCopy
    MOV     DPTR, #(u16Length + 2)
    MOVX    A, @DPTR
    MOV     DPTR, #(u16Length)
    MOVX    @DPTR, A

    MOV     DPTR, #(u16Length + 3)
    MOVX    A, @DPTR
    MOV     DPTR, #(u16Length + 1)
    MOVX    @DPTR, A

    SJMP    _MDrv_Sys_CopyMIU2VAR

;
; void MDrv_Sys_CopyVAR2MIU( U8 * pAddr,        // R1 - R3
;                            U32 u32MiuAddr,    // R4 - R7
;                            U16 u16Length )
;
ENTRY _MDrv_Sys_CopyVAR2MIU
    CLR     UD
    SJMP    _MDrv_Sys_Copy

;
; void MDrv_Sys_CopyMIU2VAR( U32 u32MiuAddr,    // R4 - R7
;                            U8 * pAddr,        // R1 - R3
;                            U16 u16Length )
;
ENTRY _MDrv_Sys_CopyMIU2VAR
    SETB    UD
    SJMP    _MDrv_Sys_Copy

;
; void MDrv_Sys_Copy( U8 * pAddr,        // R1 - R3
;                     U32 u32MiuAddr,    // R4 - R7
;                     U16 u16Length )
;
_MDrv_Sys_Copy:
    ;
    ; R1/R2/R3: pAddr
    ; R4/R5:    block length
    ; R6/R7:    total length
    ;

    ;
    ; u32MiuAddr / 0x1000
    ;
    MOV     MD0, R7             ; D'endL
    MOV     MD1, R6
    MOV     MD2, R5
    MOV     MD3, R4             ; D'endH

    MOV     MD4, #LOW  (0x1000) ; D'orL
    MOV     MD5, #HIGH (0x1000) ; D'orH

    ;
    ; Store u16Length to R6/R7
    ;
    MOV     DPTR, #u16Length
    MOVX    A, @DPTR
    MOV     R6, A
    INC     DPTR
    MOVX    A, @DPTR
    MOV     R7, A

    ;
    ; Backup xdata win1 base, and set new one
    ;
    MOV     DPTR, #(REG_SDR_XD_MAP_1)
    MOVX    A, @DPTR
    PUSH    ACC
    MOV     A, MD0
    MOVX    @DPTR, A

    INC     DPTR
    MOVX    A, @DPTR
    PUSH    ACC
    MOV     A, MD1
    MOVX    @DPTR, A

    ;
    ; DPTR  = (Remainder + 0xF000)
    ; R4/R5 = (0x1000 - Reminder)
    ;
    MOV     A, MD4      ; RemL
    MOV     DPL, A
    CPL     A
    ADD     A, #01H
    MOV     R5, A
    MOV     A, MD5      ; RemH
    ORL     A, #0xF0
    MOV     DPH, A
    CPL     A
    ADDC    A, #00H
    MOV     R4, A

COPY_BLOCK:
    MOV     A, R7
    CJNE    R6, #00H, COMPARE_LENGTH_AND_BLOCK
    JZ      COPY_EXIT

COMPARE_LENGTH_AND_BLOCK:   ; C == 0 now, see above CJNE
    SUBB    A, R5
    MOV     A, R6
    SUBB    A, R4
    JNC     LENGTH_MINUS_BLOCK

ASSIGN_LEHGTH_TO_BLOCK:
    MOV     R4, AR6
    MOV     R5, AR7

LENGTH_MINUS_BLOCK:
    CLR     C
    MOV     A, R7
    SUBB    A, R5
    MOV     R7, A
    MOV     A, R6
    SUBB    A, R4
    MOV     R6, A

    MOV     A, R5
    JZ      COPY_BYTE
    INC     R4
COPY_BYTE:
    JB      UD, COPY_BYTE_MIU2VAR

COPY_BYTE_VAR2MIU:
    XRL     DPS, #01H
    LCALL   ?C?CLDPTR
    XRL     DPS, #01H

    MOVX    @DPTR, A
    INC     DPTR

    INC     R1
    CJNE    R1, #00, PTR_NOT_CARRY_0
    INC     R2
PTR_NOT_CARRY_0:

    DJNZ    R5, COPY_BYTE_VAR2MIU
    DJNZ    R4, COPY_BYTE_VAR2MIU

    SJMP    END_OF_COPY_BLOCK

COPY_BYTE_MIU2VAR:
    MOVX    A, @DPTR
    INC     DPTR

    XRL     DPS, #01H
    LCALL   ?C?CSTPTR
    XRL     DPS, #01H

    INC     R1
    CJNE    R1, #00, PTR_NOT_CARRY_1
    INC     R2
PTR_NOT_CARRY_1:

    DJNZ    R5, COPY_BYTE_MIU2VAR
    DJNZ    R4, COPY_BYTE_MIU2VAR

END_OF_COPY_BLOCK:

    MOV     A, DPH
    JNZ     COPY_EXIT

    ;
    ; update window1 base
    ;
    MOV     DPTR, #(REG_SDR_XD_MAP_1)
    MOVX    A, @DPTR
    INC     A
    MOVX    @DPTR, A
    JNZ     BASE_NOT_CARRY
    INC     DPTR
    MOVX    A, @DPTR
    INC     A
    MOVX    @DPTR, A

BASE_NOT_CARRY:

    MOV     DPTR, #0xF000
    MOV     R4, #010H

    SJMP    COPY_BLOCK

COPY_EXIT:
    ;
    ; Restore xdata win1 base
    ;
    MOV     DPTR, #(REG_SDR_XD_MAP_1 + 1)
    POP     ACC
    MOVX    @DPTR, A
    MOV     DPTR, #(REG_SDR_XD_MAP_1)
    POP     ACC
    MOVX    @DPTR, A

    RET

	END

⌨️ 快捷键说明

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