📄 intflash_driver_f93.s
字号:
; Spill Code: 0 (instruction)
.ENDFUNC "IntFlash_Read",125,"_IntFlash_Read"
; 126
; 127 INT32 IntFlash_Write( VOID *paddr, VOID *pbuf, UINT num_bytes )
; 128 #ifdef _IAR_CODE
; 129 @ "DATA_PER_RAM"
; 130 #endif
; 131 {
_IntFlash_Write:
.DEFINE "_IntFlash_Write"
.VALUE _IntFlash_Write
.CLASS 2
.TYPE 69
.ENDEF
.BEGFUNC "IntFlash_Write",131,"_IntFlash_Write"
.LINE 131
.DEFINE "paddr"
.CLASS 65
.VALUE 6
.TYPE 33
.ENDEF
.DEFINE "pbuf"
.CLASS 65
.VALUE 9
.TYPE 33
.ENDEF
.DEFINE "num_bytes"
.CLASS 65
.VALUE 12
.TYPE 14
.ENDEF
.DEFINE "pcaddr"
.CLASS 65
.VALUE -3
.TYPE 44
.ENDEF
.DEFINE "nBytes"
.CLASS 65
.VALUE -5
.TYPE 13
.ENDEF
.DEFINE "pcBuf"
.CLASS 65
.VALUE -8
.TYPE 44
.ENDEF
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH BC
DEC SP
DEC SP
; 132 // the number of bytes passed to this function is always less than
; 133 // 512 bytes
; 134
; 135 UINT16 nBytes ;
; 136 volatile UINT8 *pcBuf = ( UINT8 * ) pbuf ;
.LINE 136
LD BC,(IX+9)
LD (IX+-8),BC
; 137 volatile UINT8 *pcaddr = ( UINT8 * ) paddr ;
.LINE 137
LD BC,(IX+6)
LD (IX+-3),BC
XOR A,A
LD (IX+-5),A
XOR A,A
LD (IX+-4),A
; 138
; 139 #ifdef _EZ80F91
; 140 // set the PAGE, ROW and COL registers
; 141 FLASH_PAGE = GETPAGE( (LOC_ADDR) pcaddr ) ;
; 142 FLASH_ROW = GETROW( (LOC_ADDR) pcaddr ) ;
; 143 FLASH_COL = GETCOL( (LOC_ADDR) pcaddr ) ;
; 144 #endif
; 145
; 146 // now in a loop read the num_bytes values from FLASH_DATA register
; 147 for( nBytes = 0 ; nBytes < num_bytes ; nBytes++ )
.LINE 147
JR L_14
L_12:
; 148 {
; 149 #if defined(_EZ80F92) || defined(_EZ80F93)
; 150 // set the PAGE, ROW and COL registers
; 151 FLASH_PAGE = GETPAGE( (LOC_ADDR) pcaddr ) ;
.LINE 151
LD BC,130048
LD HL,(IX+-3)
CALL __iand
LD BC,10
CALL __ishrs
LD A,L
OUT0 (252),A
; 152 FLASH_ROW = GETROW( (LOC_ADDR) pcaddr ) ;
.LINE 152
LD BC,896
LD HL,(IX+-3)
CALL __iand
LD BC,7
CALL __ishru
LD A,L
OUT0 (253),A
; 153 FLASH_COL = GETCOL( (LOC_ADDR) pcaddr ) ;
.LINE 153
LD A,(IX+-3)
RES 7,A
OUT0 (254),A
; 154 #endif
; 155
; 156 FLASH_DATA = *pcBuf ;
.LINE 156
LD IY,(IX+-8)
LD A,(IY)
OUT0 (246),A
; 157 pcBuf++ ;
.LINE 157
LD BC,(IX+-8)
INC BC
LD (IX+-8),BC
; 158 #if defined(_EZ80F92) || defined(_EZ80F93)
; 159 pcaddr++ ;
.LINE 159
LD BC,(IX+-3)
INC BC
LD (IX+-3),BC
LD BC,(IX+-5)
INC BC
LD (IX+-5),C
LD (IX+-4),B
; 160 #endif
; 161
; 162 }
L_14:
.LINE 162
LD BC,(IX+-5)
CALL __stoiu
LD BC,(IX+12)
OR A,A
SBC HL,BC
JR C,L_12
; 163 return num_bytes ;
.LINE 163
LD BC,(IX+12)
XOR A,A
LD E,A
LD HL,BC
; 164 }
.LINE 164
LD SP,IX
POP IX
RET
;**************************** _IntFlash_Write ***************************
;Name Addr/Register Size Type
;pcBuf IX-8 3 variable
;nBytes IX-5 2 variable
;pcaddr IX-3 3 variable
;num_bytes IX+12 3 parameter
;pbuf IX+9 3 parameter
;paddr IX+6 3 parameter
; Stack Frame Size: 23 (bytes)
; Spill Code: 0 (instruction)
.ENDFUNC "IntFlash_Write",164,"_IntFlash_Write"
; 165
; 166 INT IntFlash_Erase( VOID *paddr, UINT32 num_bytes )
; 167 #ifdef _IAR_CODE
; 168 @ "DATA_PER_RAM"
; 169 #endif
; 170 {
_IntFlash_Erase:
.DEFINE "_IntFlash_Erase"
.VALUE _IntFlash_Erase
.CLASS 2
.TYPE 68
.ENDEF
.BEGFUNC "IntFlash_Erase",170,"_IntFlash_Erase"
.LINE 170
.DEFINE "paddr"
.CLASS 65
.VALUE 6
.TYPE 33
.ENDEF
.DEFINE "num_bytes"
.CLASS 65
.VALUE 9
.TYPE 15
.ENDEF
.DEFINE "nCnt"
.CLASS 65
.VALUE -3
.TYPE 14
.ENDEF
.DEFINE "nPageNum"
.CLASS 65
.VALUE -4
.TYPE 12
.ENDEF
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
DEC SP
; 171 // the provided address is the start address of the 32 KB block.
; 172 // and each 32 KB contains 16 2 KB pages. So need to erase the 16 pages.
; 173
; 174 // given start address is relative from ZERO address. So, from this, we
; 175 // calculate the page numbers to erase.
; 176 UINT8 nPageNum = GETPAGE( (UINT32) paddr ) ;
.LINE 176
LD BC,(IX+6)
XOR A,A
LD E,A
LD HL,BC
LD BC,130048
XOR A,A
CALL __land
LD BC,HL
LD HL,10
LD A,E
CALL __lshru
LD (IX+-4),C
LD BC,0
LD (IX+-3),BC
; 177 UINT nCnt ;
; 178
; 179 for( nCnt = 0 ; nCnt < g_nPagesPerBlock ; nCnt++ )
.LINE 179
JR L_25
L_23:
; 180 {
; 181 // store the PAGE NUM in the register
; 182 FLASH_PAGE = nPageNum ;
.LINE 182
LD A,(IX+-4)
OUT0 (252),A
; 183
; 184 // setup the flash erase
; 185 FLASH_PGCTL = FLASH_PGCTL_PG_ERASE_ENABLE ;
.LINE 185
LD A,2
OUT0 (255),A
; 186
; 187 // now poll for the
; 188 while(1)
.LINE 188
L_20:
; 189 {
; 190 // If erase is complete, break from the loop
; 191 if( !(FLASH_PGCTL & FLASH_PGCTL_PG_ERASE_ENABLE ) )
.LINE 191
IN0 A,(255)
AND A,2
JR NZ,L_20
; 192 break ;
.LINE 192
JR L_22
; 193 }
L_19:
.LINE 193
JR L_20
L_22:
; 194 // go to next page
; 195 nPageNum++ ;
.LINE 195
INC (IX+-4)
LD BC,(IX+-3)
INC BC
LD (IX+-3),BC
; 196 }
L_25:
.LINE 196
LD A,(_g_nPagesPerBlock)
UEXT HL
LD L,A
LD BC,HL
LD HL,(IX+-3)
OR A,A
SBC HL,BC
JR C,L_23
; 197
; 198 return SUCCESS;
.LINE 198
LD HL,0
; 199 }
.LINE 199
LD SP,IX
POP IX
RET
;**************************** _IntFlash_Erase ***************************
;Name Addr/Register Size Type
;_g_nPagesPerBlock STATIC 1 variable
;nPageNum IX-4 1 variable
;nCnt IX-3 3 variable
;num_bytes IX+9 4 parameter
;paddr IX+6 3 parameter
; Stack Frame Size: 19 (bytes)
; Spill Code: 0 (instruction)
.ENDFUNC "IntFlash_Erase",199,"_IntFlash_Erase"
; 200
; 201 INT IntFlash_Close( VOID )
; 202 #ifdef _IAR_CODE
; 203 @ "DATA_PER_RAM"
; 204 #endif
; 205 {
_IntFlash_Close:
.DEFINE "_IntFlash_Close"
.VALUE _IntFlash_Close
.CLASS 2
.TYPE 68
.ENDEF
.BEGFUNC "IntFlash_Close",205,"_IntFlash_Close"
PUSH IX
LD IX,0
ADD IX,SP
; 206 // disable INTERNAL FLASH
; 207 FLASH_CTRL = 0x00 ;
.LINE 207
XOR A,A
OUT0 (248),A
; 208 return SUCCESS ;
.LINE 208
LD HL,0
; 209 }
.LINE 209
LD SP,IX
POP IX
RET
;**************************** _IntFlash_Close ***************************
;Name Addr/Register Size Type
; Stack Frame Size: 6 (bytes)
; Spill Code: 0 (instruction)
.ENDFUNC "IntFlash_Close",209,"_IntFlash_Close"
XREF __iand:ROM
XREF __land:ROM
XREF __ishrs:ROM
XREF __ishru:ROM
XREF __lshru:ROM
XREF __stoiu:ROM
XDEF _IntFlash_Close
XDEF _IntFlash_Erase
XDEF _IntFlash_Write
XDEF _IntFlash_Read
XDEF _IntFlash_Init
XDEF _g_nPagesPerBlock
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -