📄 intflash_infopage_driver_f92.s
字号:
.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
.DEFINE "ncol"
.CLASS 65
.VALUE -9
.TYPE 12
.ENDEF
.DEFINE "npage"
.CLASS 65
.VALUE -10
.TYPE 12
.ENDEF
.DEFINE "nrow"
.CLASS 65
.VALUE -11
.TYPE 12
.ENDEF
PUSH IX
LD IX,0
ADD IX,SP
LEA IY,IX+-11
LD SP,IY
; 133 // the number of bytes passed to this function is always less than
; 134 // 512 bytes
; 135
; 136 UINT16 nBytes ;
; 137 volatile UINT8 *pcBuf = ( UINT8 * ) pbuf ;
.LINE 137
LD BC,(IX+9)
LD (IX+-8),BC
; 138 volatile UINT8 *pcaddr = ( UINT8 * ) paddr ;
.LINE 138
LD BC,(IX+6)
LD (IX+-3),BC
; 139 volatile UINT8 npage ;
; 140 volatile UINT8 nrow ;
; 141 volatile UINT8 ncol ;
; 142
; 143 // set the PAGE, ROW and COL registers
; 144 npage = GETPAGE( (LOC_ADDR) pcaddr ) | FLASH_PAGE_INFO_ACCESS ;
.LINE 144
LD BC,130048
LD HL,(IX+-3)
CALL __iand
LD BC,10
CALL __ishrs
LD A,L
SET 7,A
LD (IX+-10),A
; 145 nrow = GETROW( (LOC_ADDR) pcaddr ) ;
.LINE 145
LD BC,896
LD HL,(IX+-3)
CALL __iand
LD BC,7
CALL __ishru
LD (IX+-11),L
; 146 ncol = GETCOL( (LOC_ADDR) pcaddr ) ;
.LINE 146
LD A,(IX+-3)
RES 7,A
LD (IX+-9),A
; 147 FLASH_PAGE = npage ;
.LINE 147
LD A,(IX+-10)
OUT0 (252),A
; 148 FLASH_ROW = nrow ;
.LINE 148
LD A,(IX+-11)
OUT0 (253),A
; 149 FLASH_COL = ncol ;
.LINE 149
LD A,(IX+-9)
OUT0 (254),A
XOR A,A
LD (IX+-5),A
XOR A,A
LD (IX+-4),A
; 150
; 151 // now in a loop read the num_bytes values from FLASH_DATA register
; 152 for( nBytes = 0 ; nBytes < num_bytes ; nBytes++ )
.LINE 152
JR L_14
L_12:
; 153 {
; 154 #if defined(_EZ80F92) || defined(_EZ80F93)
; 155 // set the PAGE, ROW and COL registers
; 156 FLASH_PAGE = 0 ;
.LINE 156
XOR A,A
OUT0 (252),A
; 157 FLASH_ROW = 0 ;
.LINE 157
XOR A,A
OUT0 (253),A
; 158 FLASH_COL = 0 ;
.LINE 158
XOR A,A
OUT0 (254),A
; 159 npage = GETPAGE( (LOC_ADDR) pcaddr ) | FLASH_PAGE_INFO_ACCESS ;
.LINE 159
LD BC,130048
LD HL,(IX+-3)
CALL __iand
LD BC,10
CALL __ishrs
LD A,L
SET 7,A
LD (IX+-10),A
; 160 nrow = GETROW( (LOC_ADDR) pcaddr ) ;
.LINE 160
LD BC,896
LD HL,(IX+-3)
CALL __iand
LD BC,7
CALL __ishru
LD (IX+-11),L
; 161 ncol = GETCOL( (LOC_ADDR) pcaddr ) ;
.LINE 161
LD A,(IX+-3)
RES 7,A
LD (IX+-9),A
; 162 FLASH_PAGE = npage ;
.LINE 162
LD A,(IX+-10)
OUT0 (252),A
; 163 FLASH_ROW = nrow ;
.LINE 163
LD A,(IX+-11)
OUT0 (253),A
; 164 FLASH_COL = ncol ;
.LINE 164
LD A,(IX+-9)
OUT0 (254),A
; 165 #endif
; 166
; 167 FLASH_DATA = *pcBuf ;
.LINE 167
LD IY,(IX+-8)
LD A,(IY)
OUT0 (246),A
; 168 pcBuf++ ;
.LINE 168
LD BC,(IX+-8)
INC BC
LD (IX+-8),BC
; 169 #if defined(_EZ80F92) || defined(_EZ80F93)
; 170 pcaddr++ ;
.LINE 170
LD BC,(IX+-3)
INC BC
LD (IX+-3),BC
LD BC,(IX+-5)
INC BC
LD (IX+-5),C
LD (IX+-4),B
; 171 #endif
; 172
; 173 }
L_14:
.LINE 173
LD BC,(IX+-5)
CALL __stoiu
LD BC,(IX+12)
OR A,A
SBC HL,BC
JR C,L_12
; 174 FLASH_PAGE = 0 ;
.LINE 174
XOR A,A
OUT0 (252),A
; 175 FLASH_ROW = 0 ;
.LINE 175
XOR A,A
OUT0 (253),A
; 176 FLASH_COL = 0 ;
.LINE 176
XOR A,A
OUT0 (254),A
; 177 return num_bytes ;
.LINE 177
LD BC,(IX+12)
XOR A,A
LD E,A
LD HL,BC
; 178 }
.LINE 178
LD SP,IX
POP IX
RET
;**************************** _IntFlash_IP_Write ***************************
;Name Addr/Register Size Type
;nrow IX-11 1 variable
;npage IX-10 1 variable
;ncol IX-9 1 variable
;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: 26 (bytes)
; Spill Code: 0 (instruction)
.ENDFUNC "IntFlash_IP_Write",178,"_IntFlash_IP_Write"
; 179
; 180 INT IntFlash_IP_Erase( VOID *paddr, UINT32 num_bytes )
; 181 #ifdef _IAR_CODE
; 182 @ "DATA_PER_RAM"
; 183 #endif
; 184 {
_IntFlash_IP_Erase:
.DEFINE "_IntFlash_IP_Erase"
.VALUE _IntFlash_IP_Erase
.CLASS 2
.TYPE 68
.ENDEF
.BEGFUNC "IntFlash_IP_Erase",184,"_IntFlash_IP_Erase"
.LINE 184
.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
; 185 /*
; 186 * F91, information page is of 512 bytes, but we use only 256
; 187 * bytes to maintain equality between all F series platforms
; 188 * F92/F93, information page is 256 bytes which is divided
; 189 * between 2 rows.
; 190 */
; 191
; 192 UINT8 nPageNum = GETPAGE( (UINT32) paddr ) ;
.LINE 192
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
; 193 UINT nCnt ;
; 194
; 195 for( nCnt = 0 ; nCnt < g_nRowsPerInfoPage ; nCnt++ )
.LINE 195
JR L_23
L_21:
; 196 {
; 197
; 198 /*
; 199 * set the flash access to IO
; 200 */
; 201 FLASH_PAGE = nPageNum | FLASH_PAGE_INFO_ACCESS ;
.LINE 201
LD A,(IX+-4)
SET 7,A
OUT0 (252),A
; 202 FLASH_ROW = (UINT8) nCnt ;
.LINE 202
LD A,(IX+-3)
OUT0 (253),A
; 203
; 204 // setup the flash erase
; 205 FLASH_PGCTL = FLASH_PGCTL_PG_ERASE_ENABLE ;
.LINE 205
LD A,2
OUT0 (255),A
; 206
; 207 // now poll for the
; 208 while(1)
.LINE 208
L_20:
; 209 {
; 210 // If erase is complete, break from the loop
; 211 if( !(FLASH_PGCTL & FLASH_PGCTL_PG_ERASE_ENABLE ) )
.LINE 211
IN0 A,(255)
AND A,2
JR NZ,L_20
; 212 break ;
.LINE 212
JR L_22
; 213 }
L_19:
.LINE 213
JR L_20
; 214 }
L_22:
.LINE 214
LD BC,(IX+-3)
INC BC
LD (IX+-3),BC
L_23:
LD A,(_g_nRowsPerInfoPage)
UEXT HL
LD L,A
LD BC,HL
LD HL,(IX+-3)
OR A,A
SBC HL,BC
JR C,L_21
; 215
; 216 FLASH_PAGE = 0 ;
.LINE 216
XOR A,A
OUT0 (252),A
; 217 FLASH_ROW = 0 ;
.LINE 217
XOR A,A
OUT0 (253),A
; 218 FLASH_COL = 0 ;
.LINE 218
XOR A,A
OUT0 (254),A
; 219 return SUCCESS;
.LINE 219
LD HL,0
; 220 }
.LINE 220
LD SP,IX
POP IX
RET
;**************************** _IntFlash_IP_Erase ***************************
;Name Addr/Register Size Type
;_g_nRowsPerInfoPage 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_IP_Erase",220,"_IntFlash_IP_Erase"
; 221
; 222 INT IntFlash_IP_Close( VOID )
; 223 #ifdef _IAR_CODE
; 224 @ "DATA_PER_RAM"
; 225 #endif
; 226 {
_IntFlash_IP_Close:
.DEFINE "_IntFlash_IP_Close"
.VALUE _IntFlash_IP_Close
.CLASS 2
.TYPE 68
.ENDEF
.BEGFUNC "IntFlash_IP_Close",226,"_IntFlash_IP_Close"
PUSH IX
LD IX,0
ADD IX,SP
; 227 // FLASH_PAGE = 0 ;
; 228 // disable INTERNAL FLASH
; 229 // FLASH_CTRL = 0x00 ;
; 230 return SUCCESS ;
.LINE 230
LD HL,0
; 231 }
.LINE 231
LD SP,IX
POP IX
RET
;**************************** _IntFlash_IP_Close ***************************
;Name Addr/Register Size Type
; Stack Frame Size: 6 (bytes)
; Spill Code: 0 (instruction)
.ENDFUNC "IntFlash_IP_Close",231,"_IntFlash_IP_Close"
XREF __iand:ROM
XREF __land:ROM
XREF __ishrs:ROM
XREF __ishru:ROM
XREF __lshru:ROM
XREF __stoiu:ROM
XDEF _IntFlash_IP_Close
XDEF _IntFlash_IP_Erase
XDEF _IntFlash_IP_Write
XDEF _IntFlash_IP_Read
XDEF _IntFlash_IP_Init
XDEF _g_nRowsPerInfoPage
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -