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

📄 eepromctrlex0205.asm

📁 如何使用flash来模拟EEPROM
💻 ASM
📖 第 1 页 / 共 5 页
字号:
; line   146 :  Arguments	   : ucDataNo:Read data No.
; line   147 : 		       : *pDataAddress:Read data storage address
; line   148 :  Return value  : Normal completion(TRUE:00H) / Reading data noth
;              ing(ERRNODAT:F7H) / 
; line   149 :                  With no effective block(ERRNOUSE:FAH)
; line   150 :  Summary       : Data with the specified number is read from EEP
;              ROM to the storage address.
; line   151 : 		       : 1.Searches for blocks being used as EEPROM.
; line   152 : 		       : 2.Searches for latest data's address among valid bloc
;              ks.
; line   153 : 		       : 3.Reads latest data from searched address.
; line   154 : ----------------------------------------------------------------
;              ---*/
; line   155 : UCHAR ucEEPROMReadEx( UCHAR ucDataNo, UCHAR *pDataAddress )			/*
;               EEPROM data read processing */
; line   156 : {
_ucEEPROMReadEx:
$DGL	1,124
	push	hl						;[INF] 1, 4
	push	ax						;[INF] 1, 4
	push	ax						;[INF] 1, 4
	push	ax						;[INF] 1, 4
	push	ax						;[INF] 1, 4
	movw	ax,sp						;[INF] 2, 8
	movw	hl,ax						;[INF] 1, 4
??bf_ucEEPROMReadEx:
; line   157 : 	USHORT	usDataSrcAdr;
; line   158 : 	UCHAR	ucBlockTBLNo;
; line   159 : 	UCHAR	*pReadAdr;
; line   160 : 	UCHAR	i;
; line   161 : 	
; line   162 : 	/* Parameter Check */
; line   163 : 	if( PARAM_OK == FALSE ){										/* parameter error? */
$DGL	0,8
	call	!_ucParamCheck					;[INF] 3, 7
	inc	c						;[INF] 1, 2
	bnz	$?L0048						;[INF] 2, 6
??bb00_ucEEPROMReadEx:
; line   164 : 		return( ERRPRM );											/* then rerun */
$DGL	0,9
	movw	bc,#0F4H	; 244 				;[INF] 3, 6
	br	!?L0047						;[INF] 3, 6
??eb00_ucEEPROMReadEx:
?L0048:
; line   165 : 	}
; line   166 : 	
; line   167 : 	/* Searches for valid blocks currently used as EEPROM */
; line   168 : 	ucBlockTBLNo = ucEEPROMUseBlockSearchEx();
$DGL	0,13
	call	!_ucEEPROMUseBlockSearchEx			;[INF] 3, 7
	mov	a,c						;[INF] 1, 2
	mov	[hl+3],a	; ucBlockTBLNo 			;[INF] 2, 8
; line   169 : 	if ( ucBlockTBLNo == FALSE ){									/* abnormal end? */
$DGL	0,14
	inc	a						;[INF] 1, 2
	bnz	$?L0050						;[INF] 2, 6
??bb01_ucEEPROMReadEx:
; line   170 : 		return ( ERRNOUSE );										/* With no effective block */
$DGL	0,15
	movw	bc,#0FAH	; 250 				;[INF] 3, 6
	br	$?L0047						;[INF] 2, 6
??eb01_ucEEPROMReadEx:
?L0050:
; line   171 : 	}
; line   172 : 	/* Obtains address of latest data for specified number */
; line   173 : 	usDataSrcAdr = usEEPROMDataSearchEx( ucDataNo, ucBlockTBLNo );
$DGL	0,18
	mov	a,[hl+3]	; ucBlockTBLNo 			;[INF] 2, 8
	mov	x,#00H	; 0 					;[INF] 2, 4
	xch	a,x						;[INF] 1, 2
	push	ax						;[INF] 1, 4
	mov	a,[hl+6]	; ucDataNo 			;[INF] 2, 8
	mov	x,#00H	; 0 					;[INF] 2, 4
	xch	a,x						;[INF] 1, 2
	call	!_usEEPROMDataSearchEx				;[INF] 3, 7
	pop	ax						;[INF] 1, 4
	movw	ax,bc						;[INF] 1, 4
	mov	[hl+5],a	; usDataSrcAdr 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	[hl+4],a	; usDataSrcAdr 			;[INF] 2, 8
; line   174 : 	if ( usDataSrcAdr == 0x00 ){
$DGL	0,19
	or	a,[hl+5]	; usDataSrcAdr 			;[INF] 2, 8
	bnz	$?L0052						;[INF] 2, 6
??bb02_ucEEPROMReadEx:
; line   175 : 		return( ERRNODAT );											/* no data */
$DGL	0,20
	movw	bc,#0F7H	; 247 				;[INF] 3, 6
	br	$?L0047						;[INF] 2, 6
??eb02_ucEEPROMReadEx:
?L0052:
; line   176 : 	}
; line   177 : 	/* Reads latest data from obtained address */
; line   178 : 	pReadAdr = (UCHAR*)( usDataSrcAdr +1 );
$DGL	0,23
	mov	a,[hl+4]	; usDataSrcAdr 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	a,[hl+5]	; usDataSrcAdr 			;[INF] 2, 8
	incw	ax						;[INF] 1, 4
	mov	[hl+2],a	; pReadAdr 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	[hl+1],a	; pReadAdr 			;[INF] 2, 8
; line   179 : 	for ( i=0 ; i < DATALENGTH ; i++ ){
$DGL	0,24
	mov	a,#00H	; 0 					;[INF] 2, 4
	mov	[hl],a	; i 					;[INF] 1, 4
?L0054:
	mov	a,[hl]	; i 					;[INF] 1, 4
	cmp	a,#01H	; 1 					;[INF] 2, 4
	bnc	$?L0055						;[INF] 2, 6
??bb03_ucEEPROMReadEx:
; line   180 : 		*pDataAddress++ = *pReadAdr++;
$DGL	0,25
	mov	a,[hl+1]	; pReadAdr 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	a,[hl+2]	; pReadAdr 			;[INF] 2, 8
	movw	de,ax						;[INF] 1, 4
	incw	ax						;[INF] 1, 4
	mov	[hl+2],a	; pReadAdr 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	[hl+1],a	; pReadAdr 			;[INF] 2, 8
	mov	a,[de]						;[INF] 1, 4
	mov	c,a						;[INF] 1, 2
	mov	a,[hl+12]	; pDataAddress 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	a,[hl+13]	; pDataAddress 			;[INF] 2, 8
	movw	de,ax						;[INF] 1, 4
	incw	ax						;[INF] 1, 4
	mov	[hl+13],a	; pDataAddress 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	[hl+12],a	; pDataAddress 			;[INF] 2, 8
	mov	a,c						;[INF] 1, 2
	mov	[de],a						;[INF] 1, 4
??eb03_ucEEPROMReadEx:
; line   181 : 	}
$DGL	0,26
	mov	a,[hl]	; i 					;[INF] 1, 4
	inc	a						;[INF] 1, 2
	mov	[hl],a	; i 					;[INF] 1, 4
	br	$?L0054						;[INF] 2, 6
?L0055:
; line   182 : 	if ( ( (USHORT)pReadAdr & 0x0003 ) == 0x0003 ){					/* Offset i
;              s +3 located (a 4byte unit) */
$DGL	0,27
	mov	a,[hl+1]	; pReadAdr 			;[INF] 2, 8
	and	a,#03H	; 3 					;[INF] 2, 4
	xch	a,x						;[INF] 1, 2
	mov	a,#00H	; 0 					;[INF] 2, 4
	cmpw	ax,#03H	; 3 					;[INF] 3, 6
	bnz	$?L0057						;[INF] 2, 6
??bb04_ucEEPROMReadEx:
; line   183 : 		/* Since the delimiter is read, it rewrites by the last byte d
;              ata */
; line   184 : 		pDataAddress--;												/* One pointer is returned */
$DGL	0,29
	mov	a,[hl+12]	; pDataAddress 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	a,[hl+13]	; pDataAddress 			;[INF] 2, 8
	decw	ax						;[INF] 1, 4
	mov	[hl+13],a	; pDataAddress 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	[hl+12],a	; pDataAddress 			;[INF] 2, 8
; line   185 : 		*pDataAddress = *pReadAdr;
$DGL	0,30
	mov	a,[hl+1]	; pReadAdr 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	a,[hl+2]	; pReadAdr 			;[INF] 2, 8
	movw	de,ax						;[INF] 1, 4
	mov	a,[de]						;[INF] 1, 4
	mov	c,a						;[INF] 1, 2
	mov	a,[hl+12]	; pDataAddress 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	a,[hl+13]	; pDataAddress 			;[INF] 2, 8
	movw	de,ax						;[INF] 1, 4
	mov	a,c						;[INF] 1, 2
	mov	[de],a						;[INF] 1, 4
??eb04_ucEEPROMReadEx:
?L0057:
; line   186 : 	}
; line   187 : 	return( TRUE );
$DGL	0,32
	movw	bc,#00H	; 0 					;[INF] 3, 6
?L0047:
; line   188 : }
$DGL	0,33
??ef_ucEEPROMReadEx:
	pop	ax						;[INF] 1, 4
	pop	ax						;[INF] 1, 4
	pop	ax						;[INF] 1, 4
	pop	ax						;[INF] 1, 4
	pop	hl						;[INF] 1, 4
	ret							;[INF] 1, 6
??ee_ucEEPROMReadEx:
; line   189 : 
; line   190 : /*--------------------------------------------------------------
;              -----
; line   191 :  Function name : ucEEPROMWriteEx(user access function)
; line   192 :  Arguments	   : ucDataNo:Write data number
; line   193 : 			   : *pDataAddress:Write data storage address
; line   194 :  Return value  : Normal completion(TRUE:00H) / Data full(ERRFULL
;              :F5H) / Write error(ERRWRITE:F6H) /
; line   195 :                  With no effective block(ERRNOUSE:FAH) / Initial
;              ization error(ERRINIT:FEH)
; line   196 :  Summary       : Writes data with specified number from the stor
;              age address to EEPROM.
; line   197 : 			   : 1.Searches for blocks being used as EEPROM.
; line   198 : 			   : 2:Searches for addresses to enable writing to valid bloc
;              k.
; line   199 : 			   : 3:Creates write data.
; line   200 : 			   : 4:Writes to valid blocks.
; line   201 : ----------------------------------------------------------------
;              ---*/
; line   202 : UCHAR ucEEPROMWriteEx( UCHAR ucDataNo, UCHAR *pDataAddress )		/*
;               EEPROM data write processing */
; line   203 : {
_ucEEPROMWriteEx:
$DGL	1,156
	push	hl						;[INF] 1, 4
	push	ax						;[INF] 1, 4
	push	ax						;[INF] 1, 4
	push	ax						;[INF] 1, 4
	push	ax						;[INF] 1, 4
	push	ax						;[INF] 1, 4
	movw	ax,sp						;[INF] 2, 8
	movw	hl,ax						;[INF] 1, 4
??bf_ucEEPROMWriteEx:
; line   204 : 	USHORT	usBlockAdr;
; line   205 : 	USHORT	usWriteAdr;
; line   206 : 	UCHAR	ucBlockTBLNo;
; line   207 : 	UCHAR	ucCount;
; line   208 : 	UCHAR	ucResult;
; line   209 : 	UCHAR	i;
; line   210 : 	
; line   211 : 	/* Parameter Check */
; line   212 : 	if( PARAM_OK == FALSE ){										/* parameter error? */
$DGL	0,10
	call	!_ucParamCheck					;[INF] 3, 7
	inc	c						;[INF] 1, 2
	bnz	$?L0061						;[INF] 2, 6
??bb00_ucEEPROMWriteEx:
; line   213 : 		return( ERRPRM );											/* then rerun */
$DGL	0,11
	movw	bc,#0F4H	; 244 				;[INF] 3, 6
	br	!?L0060						;[INF] 3, 6
??eb00_ucEEPROMWriteEx:
?L0061:
; line   214 : 	}
; line   215 : 	
; line   216 : 	/* Searches for valid blocks being used as EEPROM */
; line   217 : 	ucBlockTBLNo = ucEEPROMUseBlockSearchEx();
$DGL	0,15
	call	!_ucEEPROMUseBlockSearchEx			;[INF] 3, 7
	mov	a,c						;[INF] 1, 2
	mov	[hl+3],a	; ucBlockTBLNo 			;[INF] 2, 8
; line   218 : 	if ( ucBlockTBLNo == FALSE ){									/* abnormal end */
$DGL	0,16
	inc	a						;[INF] 1, 2
	bnz	$?L0063						;[INF] 2, 6
??bb01_ucEEPROMWriteEx:
; line   219 : 		return( ERRNOUSE );											/* With no effective block */
$DGL	0,17
	movw	bc,#0FAH	; 250 				;[INF] 3, 6
	br	!?L0060						;[INF] 3, 6
??eb01_ucEEPROMWriteEx:
?L0063:
; line   220 : 	}
; line   221 : 	
; line   222 : 	/* Bank set */
; line   223 : 	SET_BANK( ucEEPROM_BANK[ ucBlockTBLNo ] );
$DGL	0,21
	mov	a,[hl+3]	; ucBlockTBLNo 			;[INF] 2, 8
	mov	c,a						;[INF] 1, 2
	push	hl						;[INF] 1, 4
	movw	hl,#_ucEEPROM_BANK				;[INF] 3, 6
	mov	a,[hl+c]					;[INF] 1, 6
	pop	hl						;[INF] 1, 4
	mov	BANK,a						;[INF] 2, 5
; line   224 : 	/* Bank final address acquisition */
; line   225 : 	usBlockAdr = BLOCK_TO_ADDRESS( ucEEPROM_BLOCK[ ucBlockTBLNo ] )
;              ;
$DGL	0,23
	mov	a,[hl+3]	; ucBlockTBLNo 			;[INF] 2, 8
	mov	c,a						;[INF] 1, 2
	push	hl						;[INF] 1, 4
	movw	hl,#_ucEEPROM_BLOCK				;[INF] 3, 6
	mov	a,[hl+c]					;[INF] 1, 6
	pop	hl						;[INF] 1, 4
	mov	x,#00H	; 0 					;[INF] 2, 4
	xch	a,x						;[INF] 1, 2
	call	!_usBlockToAddress				;[INF] 3, 7
	movw	ax,bc						;[INF] 1, 4
	mov	[hl+7],a	; usBlockAdr 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	[hl+6],a	; usBlockAdr 			;[INF] 2, 8
; line   226 : 	usBlockAdr += DATA_END_OFFSET;
$DGL	0,24
	xch	a,x						;[INF] 1, 2
	add	a,#04H	; 4 					;[INF] 2, 4
	mov	[hl+7],a	; usBlockAdr 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	[hl+6],a	; usBlockAdr 			;[INF] 2, 8
; line   227 : 	/* Obtains EEPROM write address */
; line   228 : 	usWriteAdr = usEEPROMWriteTopSearchEx( ucBlockTBLNo );
$DGL	0,26
	mov	a,[hl+3]	; ucBlockTBLNo 			;[INF] 2, 8
	mov	x,#00H	; 0 					;[INF] 2, 4
	xch	a,x						;[INF] 1, 2
	call	!_usEEPROMWriteTopSearchEx			;[INF] 3, 7
	movw	ax,bc						;[INF] 1, 4
	mov	[hl+5],a	; usWriteAdr 			;[INF] 2, 8
	xch	a,x						;[INF] 1, 2
	mov	[hl+4],a	; usWriteAdr 			;[INF] 2, 8
; line   229 : 	/* Uses data specified by DataNo to create data to write to EEP
;              ROM */
; line   230 : 	ucDataBuf[ WRITE_DATA_LENGTH    ] = 0xFF;						/* Last field: D
;              elimiter */
$DGL	0,28
	mov	a,#0FFH	; 255 					;[INF] 2, 4
	mov	!_ucDataBuf+3,a					;[INF] 3, 8
; line   231 : 	ucDataBuf[ WRITE_DATA_LENGTH -1 ] = 0xFF;
$DGL	0,29
	mov	!_ucDataBuf+2,a					;[INF] 3, 8
; line   232 : 	ucDataBuf[ WRITE_DATA_LENGTH -2 ] = 0xFF;
$DGL	0,30
	mov	!_ucDataBuf+1,a					;[INF] 3, 8
; line   233 : 	ucDataBuf[ WRITE_DATA_LENGTH -3 ] = 0xFF;						/* FFH setting o
;              f empty data */
$DGL	0,31
	mov	!_ucDataBuf,a					

⌨️ 快捷键说明

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