Files
TempControl/XC88x_FLHANDLER.ASM
2025-10-21 21:25:35 +08:00

167 lines
5.3 KiB
NASM

;************************************************************************************
;* FILE : XC88x_FLHANDLER.ASM *
;* DESCRIPTION : Flash handler routine for XC88x AA and AB *
;* COPYRIGHT : (c) 2006 Infineon Technologies AG *
;* UPDATED : 14/03/2006 *
;************************************************************************************
$ NOMOD51
$ DEBUG
#include "XC88x_FLADDR.H"
FLASH_ERASE CODE FLASH_ERASE_BROM_ENTRY
FLASH_PROG CODE FLASH_PROGRAM_BROM_ENTRY
FLASH_ERASE_ABORT CODE FLASH_ERASE_ABORT_BROM_ENTRY
FLASH_READ_STATUS CODE FLASH_READ_STATUS_BROM_ENTRY
FLASH_PROTECT CODE FLASH_PROTECT_BROM_ENTRY
DSEG AT MAGIC_MEMORY
DS RESERVED_BYTES ; Reserved for FLASH Handler in Boot ROM
;------------------------------------------------------------------------------------------
; Function Name : bit DFlErase (unsigned int DFlash0Sector, unsigned int DFlash1Sector)
; Description : Erase DFlash Sectors (Bank3 and Bank4)
; Input Parameter : DFlash0Sector => Bit0 = Erase Sector0
; Bit1 = Erase Sector1
; Bit2 = Erase Sector2
; Bit3 = Erase Sector3
; Bit4 = Erase Sector4
; Bit5 = Erase Sector5
; Bit6 = Erase Sector6
; Bit7 = Erase Sector7
; Bit8 = Erase Sector8
; Bit9 = Erase Sector9
; DFlash1Sector => Bit0 = Erase Sector0
; Bit1 = Erase Sector1
; Bit2 = Erase Sector2
; Bit3 = Erase Sector3
; Bit4 = Erase Sector4
; Bit5 = Erase Sector5
; Bit6 = Erase Sector6
; Bit7 = Erase Sector7
; Bit8 = Erase Sector8
; Bit9 = Erase Sector9
;
; e.g: DFlash0Sector = 0x202
; DFlash1Sector = 0x380
; ==> Will erase Bank3 Sector 1
; erase Bank3 Sector 9
; erase Bank4 Sector 7
; erase Bank4 Sector 8
; erase Bank4 Sector 9
; Return Value : Bit => 1 = Successfull
; 0 = Fail
; Required Stack Size = 12
;------------------------------------------------------------------------------------------
#if USE_DLFERASE
?PR?_DFlErase?XC88x_FLHANDLER SEGMENT CODE
RSEG ?PR?_DFlErase?XC88x_FLHANDLER
PUBLIC _DFlErase
_DFlErase:
USING USE_BANK
MOV AR1,R6 ; BANK3
MOV AR0,R7 ; BANK3
MOV AR4,R4 ; BANK4
MOV AR3,R5 ; BANK4
CLR A
MOV AR5, A ; BANK0
MOV AR6, A ; BANK1
MOV AR7, A ; BANK2
PUSH PSW
PUSH ACC
PUSH B
#if (USE_BANK == 0)
ANL PSW, #0xE7 ; Set to Bank0
#elseif (USE_BANK == 1)
SETB PSW.3
CLR PSW.4
#elif (USE_BANK == 2)
CLR PSW.3
SETB PSW.4
#elif (USE_BANK == 3)
ORL PSW, #0x18
#endif
LCALL FLASH_ERASE
JC _derase_fail
POP B
POP ACC
POP PSW
SETB C
RET
_derase_fail:
POP B
POP ACC
POP PSW
CLR C
RET
#endif
;------------------------------------------------------------------------------------------
; Function Name: bit FlProg(unsigned char idata *WlBuf)
; Description: Program the 32byte data in the WlBuf to the EEPROM
; When calling this function, user should already programmed
; the DPTR with the EEPROM address (aligned to 32byte boundary)
; Input Parameter: *WlBuf ==> The pointer to the starting location of the buffer
; in the IDATA memory.
; Return Value: Bit => 1 = Successfull
; 0 = Fail
; Required Stack Size = 12
;------------------------------------------------------------------------------------------
?PR?_FlProg?XC88x_FLHANDLER SEGMENT CODE
RSEG ?PR?_FlProg?XC88x_FLHANDLER
PUBLIC _FlProg
_FlProg:
using USE_BANK
MOV AR0,R7 ; move C51 parameter registers to AR0
; this is the pointer to the WLBuf
; MOV A,#0x6F
; MOV DPH,A
; MOV A,#0x0 ; the DPL will = DPL+0x20 after one successful program
; MOV DPL,A
PUSH PSW
PUSH ACC
PUSH B
#if (USE_BANK == 0)
ANL PSW, #0xE7 ; Set to Bank0
#elif (USE_BANK == 1)
SETB PSW.3
CLR PSW.4
#elif (USE_BANK == 2)
CLR PSW.3
SETB PSW.4
#elif (USE_BANK == 3)
ORL PSW, #0x18
#endif
LCALL FLASH_PROG ; LCALL FLASH_PROG
JC _prog_fail
POP B
POP ACC
POP PSW
SETB C
RET
_prog_fail:
POP B
POP ACC
POP PSW
CLR C
RET
END
;;#endif ;;#if (XC88xAA)