📄 i2cflash.asm
字号:
push A
// Setup parameters for call
// LSB to structure is already in X
IF (SYSTEM_LARGE_MEMORY_MODEL)
mov A,reg[STK_PP]
ELSE
mov A,0x00 // Save MSB
ENDIF
lcall bFlashWriteBlock
;IF (EzI2Cs_LARGE_FLASH)
; add SP,-8 // Fixup the stack
;ELSE
; add SP,-7 // Fixup the stack
;ENDIF
add SP,-FLASH_WRITE_STRUCT_SIZE
// Translate user block to system block address
// Call flash write routine.
// Set status byte RAM_Buffer[64]
// Release I2C bus (ACK/NAK)
jmp .ACK_CMD ; Command executed without errors.
;=================================================================
; Reset
;=================================================================
.CK_Reset_CMD:
cmp [EzI2Cs_bFLASH_CMD],I2C_FLASH_RESET_CMD ; Check for Reset command.
jnz .CK_EnterFlashMode_CMD
cmp [EzI2Cs_bFLASH_Param],I2C_FLASH_RESET_KEY1
jnz .NAK_CMD ; Key doesn't match, bail
cmp [EzI2Cs_bROM_RWoffset],I2C_FLASH_RESET_KEY0
jnz .NAK_CMD ; Data Pointer "Key2" doesn't match, bail
// Release I2C bus (ACK/NAK)
SetEzI2Cs_SCR ( EzI2Cs_SCR_ACK ) ; ACK Command
ljmp 0x0000 ; Reset
.CK_NORMAL_MODE:
;=================================================================
; Enter Flash Mode
;=================================================================
.CK_EnterFlashMode_CMD:
cmp [EzI2Cs_bFLASH_CMD],I2C_ENTER_FLASH_MODE_CMD ; Check for RESET command
jnz .CK_ShowBlock_CMD
cmp [EzI2Cs_bFLASH_Param],I2C_ENTER_FLASH_MODE_KEY1
jnz .NAK_CMD ; Key doesn't match, bail
cmp [EzI2Cs_bROM_RWoffset],I2C_ENTER_FLASH_MODE_KEY0
jnz .NAK_CMD ; Data Pointer "Key2" doesn't match, bail
// Clear all interrupts except I2C interrupt
mov reg[INT_MSK0],0x00
mov reg[INT_MSK1],0x00
// Create 65 byte buffer is free space
// Move stack in clear area
mov A,< EzI2Cs_varPage ; Get LSB of variable
and A,0xC0 ; Mask off all but 2 MSb
.REGION0: ; I2C UM memory between 0x00 - 0x3F
cmp A,0x00
jnz .REGION1
mov [EzI2Cs_pRAM_Buf_Addr_LSB],0xA0 ; Place RAM Buffer 0xA0
mov A,0x58 ; Place Stack at 0x58
jmp .SET_STACK
.REGION1: ; I2C UM memory between 0x40 - 0x7F
cmp A,0x40
jnz .REGION2
mov [EzI2Cs_pRAM_Buf_Addr_LSB],0xB0 ; Place RAM Buffer 0xB0
mov A,0x00 ; Place Stack at 0x00
jmp .SET_STACK
.REGION2: ; I2C UM memory between 0x80 - 0xBF
cmp A,0x80
jnz .REGION3
mov [EzI2Cs_pRAM_Buf_Addr_LSB],0x00 ; Place RAM Buffer 0x00
mov A,0x50 ; Place Stack at 0x50
jmp .SET_STACK
.REGION3: ; I2C UM memory between 0xC0 - 0xFF
mov [EzI2Cs_pRAM_Buf_Addr_LSB],0x00 ; Place RAM Buffer 0x00
mov A,0x80 ; Place Stack at 0x80
.SET_STACK:
swap A,SP
.SET_BUF_SIZE:
mov [EzI2Cs_bRAM_Buf_Size],0x41 ; Set buffer to 65 bytes
mov [EzI2Cs_bRAM_Buf_WSize],0x40 ; Set R/W area to 64 bytes
mov [EzI2Cs_bROM_Buf_Size],0x40 ; Make sure ROM window is 64 bytes
IF (SYSTEM_LARGE_MEMORY_MODEL)
REG_RESTORE CUR_PP ; Restore Current Page Pointer
REG_RESTORE IDX_PP ; Restore Index Page Pointer
ENDIF
// preload the stack so that an rti will take program
// execution to the Flash main routine.
// RAM_CHANGE_PAGE_MODE( FLAG_PGMODE_11b ) // 00
mov A,>EzI2Cs_FLASH_Main ; Push PCH
push A
mov A,<EzI2Cs_FLASH_Main ; Push PCL
push A
mov A,0xC1 ; Push Flags, with Interrupts enabled
push A
// Clear stack (force return to FLASH_MAIN)
// Release I2C bus (ACK/NAK)
or [EzI2Cs_bState],FLASH_MODE_FLAG ; Set FLASH mode bit
SetEzI2Cs_SCR ( EzI2Cs_SCR_ACK ) ; Release I2C bus (ACK/NAK)
reti // Return to Flash Main, NOT where we came from!!!
;=================================================================
; Show Block
;=================================================================
.CK_ShowBlock_CMD:
cmp [EzI2Cs_bFLASH_CMD],I2C_FLASH_SHOW_BLOCK_CMD
jnz .NAK_CMD
// Check for block range 0 to n (Max n-1)
mov A,(EzI2Cs_BlocksUsed - 1) ; Load block count -1
sub A,[EzI2Cs_bFLASH_Param]
jc .NAK_CMD ; Block index out of range
mov [EzI2Cs_pROM_Buf_Addr_MSB],>EzI2Cs_FirstBlock ; Put MSB of start block ID
; in MSB of Buffer address.
mov A,<EzI2Cs_FirstBlock ; Get LSB of first block
add A,[EzI2Cs_bFLASH_Param] ; Add the block offset (parameter)
mov [EzI2Cs_pROM_Buf_Addr_LSB],A ; Load the LSB of the ROM pointer
adc [EzI2Cs_pROM_Buf_Addr_MSB],0x00 ; Update MSB of buffer address (add with carry)
asl [EzI2Cs_pROM_Buf_Addr_LSB] ; Convert from blocks to address (mult by 64)
rlc [EzI2Cs_pROM_Buf_Addr_MSB] ; Shift left 6 times.
asl [EzI2Cs_pROM_Buf_Addr_LSB]
rlc [EzI2Cs_pROM_Buf_Addr_MSB]
asl [EzI2Cs_pROM_Buf_Addr_LSB]
rlc [EzI2Cs_pROM_Buf_Addr_MSB]
asl [EzI2Cs_pROM_Buf_Addr_LSB]
rlc [EzI2Cs_pROM_Buf_Addr_MSB]
asl [EzI2Cs_pROM_Buf_Addr_LSB]
rlc [EzI2Cs_pROM_Buf_Addr_MSB]
asl [EzI2Cs_pROM_Buf_Addr_LSB]
rlc [EzI2Cs_pROM_Buf_Addr_MSB]
mov [EzI2Cs_bROM_Buf_Size],0x40 ; Make sure ROM window is 64 bytes
jmp .ACK_CMD ; Command executed without errors.
.NAK_CMD:
mov A,0x00 // Command good
jmp EzI2Cs_Execute_CMD_End
.ACK_CMD:
mov A,0x01 // Command good
EzI2Cs_Execute_CMD_End:
ret
;-----------------------------------------------------------------------------
; FUNCTION NAME: EzI2Cs_Flash_Main
;
; DESCRIPTION:
; Execute flash command
;
;-----------------------------------------------------------------------------
;
; ARGUMENTS: none
;
; RETURNS: none
;
; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
;
; THEORY of OPERATION or PROCEDURE:
;
EzI2Cs_FLASH_Main:
// Use only page zero
// Calculate where Flash RAM array can exist
// Create 64 byte array plus 1 status byte ( 65 bytes )
// Set I2C RAM pointer to above array
// Move
TO_CNTR_MSB: equ 0
TO_CNTR_ISB: equ 1
TO_CNTR_LSB: equ 2
mov X,SP // Clear the time-out counter
add SP,3 // Add three byte for a variable
// Time-Out counter will
.INIT_TO_CNTR: // Init Timeout counter to 0x00000000
// Reset if timer gets to 0x01000000
mov [X+TO_CNTR_MSB], 0xE8
mov [X+TO_CNTR_ISB], 0x00
mov [X+TO_CNTR_LSB], 0x00
.Flash_Loop:
nop
nop ; Do nothing loop
IF (I2C_FLASH_AUTO_TIMEOUT)
push X
lcall EzI2Cs_GetActivity
pop X
cmp A,0x00
jz .IncTimer
jmp .INIT_TO_CNTR
.IncTimer:
mov A,0
inc [X+TO_CNTR_LSB]
adc [X+TO_CNTR_ISB],A
adc [X+TO_CNTR_MSB],A
jnc .Flash_Loop
M8C_Reset ; Jump back to Reset Vector
ELSE
jnc .Flash_Loop
ENDIF
ELSE
mov A,0x00 ; Invalid command
ret ; If Flash not used, just return
ENDIF
ELSE ; Flash interface not enabled
ret
ENDIF
; end of file EzI2CsINT.asm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -