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

📄 ata.s

📁 用ATmega128做的mp3播放器
💻 S
📖 第 1 页 / 共 2 页
字号:
_ata_drq::
	.dbline -1
	.dbline 204
; }
; 
; //******************************************************************
; //*	CHECK ATA DRQ BIT 
; //*   Checks READY status bit.
; //*   Returns 1 if device is requesting service.
; //******************************************************************    
; unsigned char ata_drq(void)
; {
	.dbline 205
; if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_DRQ) return 1;
	ldi R16,253
	xcall _ata_read_byte
	sbrs R16,3
	rjmp L103
	.dbline 205
	ldi R16,1
	xjmp L102
L103:
	.dbline 206
; else return 0;
	clr R16
	.dbline -2
L102:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e ata_err _ata_err fc
	.even
_ata_err::
	.dbline -1
	.dbline 215
; }
; 
; //******************************************************************
; //*	CHECK ATA ERROR BIT 
; //*   Checks READY status bit.
; //*   Returns 1 if device is reporting an error condition.
; //****************************************************************** 
; unsigned char ata_err(void)
; {
	.dbline 216
; if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_ERR) return 1;
	ldi R16,253
	xcall _ata_read_byte
	sbrs R16,0
	rjmp L106
	.dbline 216
	ldi R16,1
	xjmp L105
L106:
	.dbline 217
; else return 0;
	clr R16
	.dbline -2
L105:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e ata_read_sector_byte _ata_read_sector_byte fV
;           word -> R14,R15
;              i -> R10,R11
;              j -> R12,R13
;            ptr -> y+18
;            qte -> y+16
;           from -> y+14
;      lbasector -> y+10
;         device -> R10
	.even
_ata_read_sector_byte::
	st -y,r19
	st -y,r18
	xcall push_gset5
	mov R10,R16
	.dbline -1
	.dbline 228
; }
; 
; //******************************************************************
; //*	READ A PART of SECTOR 
; //*   device = 0x00 or 0x01  
; //*   
; //******************************************************************  	
; void ata_read_sector_byte(unsigned char device, unsigned long lbasector,  
; 	 					  unsigned int from, unsigned int qte, 
; 						  unsigned char *ptr)
; {
	.dbline 231
; unsigned int i,j,word;
; 
; lbasector &= 0x0FFFFFFF;
	ldi R20,255
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	std z+10,R2
	std z+11,R3
	std z+12,R4
	std z+13,R5
	.dbline 233
; 
; switch (device)
	clr R11
	tst R10
	brne X4
	tst R11
	breq L112
X4:
	movw R24,R10
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	breq L113
	xjmp L109
X5:
	.dbline 234
;  	{
L112:
	.dbline 236
; 	case 0x00:
;   	   ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
	ldi R24,24
	ldi R25,0
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	movw R2,R16
	movw R4,R18
	ldi R20,224
	ldi R21,0
	ldi R22,0
	ldi R23,0
	or R2,R20
	or R3,R21
	or R4,R22
	or R5,R23
	mov R18,R2
	ldi R16,245
	xcall _ata_write_byte
	.dbline 237
; 	   break;
	xjmp L115
L113:
	.dbline 239
;   	case 0x01:
;   	   ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xF0);
	ldi R24,24
	ldi R25,0
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	movw R2,R16
	movw R4,R18
	ldi R20,240
	ldi R21,0
	ldi R22,0
	ldi R23,0
	or R2,R20
	or R3,R21
	or R4,R22
	or R5,R23
	mov R18,R2
	ldi R16,245
	xcall _ata_write_byte
	.dbline 240
; 	   break;
	xjmp L115
L109:
	.dbline 242
;   	default:
;   	   ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
	ldi R24,24
	ldi R25,0
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	movw R2,R16
	movw R4,R18
	ldi R20,224
	ldi R21,0
	ldi R22,0
	ldi R23,0
	or R2,R20
	or R3,R21
	or R4,R22
	or R5,R23
	mov R18,R2
	ldi R16,245
	xcall _ata_write_byte
	.dbline 243
; 	   break; 
L114:
	.dbline 245
L115:
	.dbline 245
;  	} 
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L114
	.dbline 246
; ata_write_byte(ATA_IO_CYL_H,lbasector >> 16);
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	movw R2,R4
	clr R4
	clr R5
	mov R18,R2
	ldi R16,221
	xcall _ata_write_byte
L117:
	.dbline 247
L118:
	.dbline 247
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L117
	.dbline 248
; ata_write_byte(ATA_IO_CYL_L,lbasector >> 8);
	ldi R24,8
	ldi R25,0
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	mov R18,R16
	ldi R16,213
	xcall _ata_write_byte
L120:
	.dbline 249
L121:
	.dbline 249
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L120
	.dbline 250
; ata_write_byte(ATA_IO_SECTORNUM,lbasector);
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	mov R18,R2
	ldi R16,237
	xcall _ata_write_byte
L123:
	.dbline 251
L124:
	.dbline 251
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L123
	.dbline 252
; ata_write_byte(ATA_IO_SECTORCNT,0x01);
	ldi R18,1
	ldi R16,229
	xcall _ata_write_byte
L126:
	.dbline 253
L127:
	.dbline 253
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L126
	.dbline 254
; ata_write_byte(ATA_IO_CMD,CMD_READ_SECTORS);
	ldi R18,32
	ldi R16,253
	xcall _ata_write_byte
L129:
	.dbline 255
L130:
	.dbline 255
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L129
L132:
	.dbline 256
L133:
	.dbline 256
; while(!drq);
	xcall _ata_drq
	tst R16
	breq L132
	.dbline 258
; 
; j = 0;
	clr R12
	clr R13
	.dbline 259
; for (i=0;i<256;i++)
	clr R10
	clr R11
	xjmp L138
L135:
	.dbline 260
;     {
	.dbline 261
; 	word = ata_read_word(ATA_IO_DATA);
	ldi R16,197
	xcall _ata_read_word
	movw R14,R16
	.dbline 262
; 	if ((j >= from) && (j < (from + qte))) *ptr++ = (unsigned char)(word);
	ldd R0,y+14
	ldd R1,y+15
	cp R12,R0
	cpc R13,R1
	brlo L139
	movw R2,R0
	ldd R0,y+16
	ldd R1,y+17
	add R2,R0
	adc R3,R1
	cp R12,R2
	cpc R13,R3
	brsh L139
	.dbline 262
	ldd R30,y+18
	ldd R31,y+19
	st Z+,R14
	std y+19,R31
	std y+18,R30
L139:
	.dbline 263
; 	j++;
	movw R24,R12
	adiw R24,1
	movw R12,R24
	.dbline 264
;     if ((j >= from) && (j < (from + qte))) *ptr++ = (unsigned char)(word >> 8);
	ldd R0,y+14
	ldd R1,y+15
	cp R24,R0
	cpc R25,R1
	brlo L141
	movw R2,R0
	ldd R0,y+16
	ldd R1,y+17
	add R2,R0
	adc R3,R1
	cp R24,R2
	cpc R25,R3
	brsh L141
	.dbline 264
	movw R2,R14
	mov R2,R3
	clr R3
	ldd R30,y+18
	ldd R31,y+19
	st Z+,R2
	std y+19,R31
	std y+18,R30
L141:
	.dbline 265
; 	j++;
	movw R24,R12
	adiw R24,1
	movw R12,R24
L143:
	.dbline 266
L144:
	.dbline 266
	xcall _ata_bsy
	tst R16
	brne L143
	.dbline 267
L136:
	.dbline 259
	movw R24,R10
	adiw R24,1
	movw R10,R24
L138:
	.dbline 259
	movw R24,R10
	cpi R24,0
	ldi R30,1
	cpc R25,R30
	brsh X6
	xjmp L135
X6:
	.dbline -2
	.dbline 268
;     while(busy);
;     }
; }			
L108:
	xcall pop_gset5
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbsym r word 14 i
	.dbsym r i 10 i
	.dbsym r j 12 i
	.dbsym l ptr 18 pc
	.dbsym l qte 16 i
	.dbsym l from 14 i
	.dbsym l lbasector 10 l
	.dbsym r device 10 c
	.dbend
	.dbfunc e ata_write_sector _ata_write_sector fV
;              i -> R12,R13
;            ptr -> R10,R11
;      lbasector -> y+8
;         device -> R12
	.even
_ata_write_sector::
	st -y,r19
	st -y,r18
	xcall push_gset4
	mov R12,R16
	ldd R10,y+12
	ldd R11,y+13
	.dbline -1
	.dbline 276
; 
; //******************************************************************
; //*	WRITE A SECTOR 
; //*   device = 0x00 or 0x01  
; //*   
; //******************************************************************  	
; void ata_write_sector(unsigned char device, unsigned long lbasector, unsigned char *ptr)
; {
	.dbline 279
; unsigned int i;
; 
; lbasector &= 0x0FFFFFFF;
	ldi R20,255
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	std z+8,R2
	std z+9,R3
	std z+10,R4
	std z+11,R5
	.dbline 281
; 
; switch (device)
	clr R13
	tst R12
	brne X7
	tst R13
	breq L150
X7:
	movw R24,R12
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	breq L151
	xjmp L147
X8:
	.dbline 282
;  	{
L150:
	.dbline 284
; 	case 0x00:
;   	   ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
	ldi R24,24
	ldi R25,0
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	movw R2,R16
	movw R4,R18
	ldi R20,224
	ldi R21,0
	ldi R22,0
	ldi R23,0
	or R2,R20
	or R3,R21
	or R4,R22
	or R5,R23
	mov R18,R2
	ldi R16,245
	xcall _ata_write_byte
	.dbline 285
; 	   break;
	xjmp L153
L151:
	.dbline 287
;   	case 0x01:
;   	   ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xF0);
	ldi R24,24
	ldi R25,0
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	movw R2,R16
	movw R4,R18
	ldi R20,240
	ldi R21,0
	ldi R22,0
	ldi R23,0
	or R2,R20
	or R3,R21
	or R4,R22
	or R5,R23
	mov R18,R2
	ldi R16,245
	xcall _ata_write_byte
	.dbline 288
; 	   break;
	xjmp L153
L147:
	.dbline 290
;   	default:
;   	   ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
	ldi R24,24
	ldi R25,0
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	movw R2,R16
	movw R4,R18
	ldi R20,224
	ldi R21,0
	ldi R22,0
	ldi R23,0
	or R2,R20
	or R3,R21
	or R4,R22
	or R5,R23
	mov R18,R2
	ldi R16,245
	xcall _ata_write_byte
	.dbline 291
; 	   break; 
L152:
	.dbline 293
L153:
	.dbline 293
;  	} 
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L152
	.dbline 294
; ata_write_byte(ATA_IO_CYL_H,lbasector >> 16);
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	movw R2,R4
	clr R4
	clr R5
	mov R18,R2
	ldi R16,221
	xcall _ata_write_byte
L155:
	.dbline 295
L156:
	.dbline 295
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L155
	.dbline 296
; ata_write_byte(ATA_IO_CYL_L,lbasector >> 8);
	ldi R24,8
	ldi R25,0
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	mov R18,R16
	ldi R16,213
	xcall _ata_write_byte
L158:
	.dbline 297
L159:
	.dbline 297
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L158
	.dbline 298
; ata_write_byte(ATA_IO_SECTORNUM,lbasector);
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	mov R18,R2
	ldi R16,237
	xcall _ata_write_byte
L161:
	.dbline 299
L162:
	.dbline 299
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L161
	.dbline 300
; ata_write_byte(ATA_IO_SECTORCNT,0x01);
	ldi R18,1
	ldi R16,229
	xcall _ata_write_byte
L164:
	.dbline 301
L165:
	.dbline 301
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L164
	.dbline 302
; ata_write_byte(ATA_IO_CMD,CMD_WRITE_SECTORS);
	ldi R18,48
	ldi R16,253
	xcall _ata_write_byte
L167:
	.dbline 303
L168:
	.dbline 303
; while(busy);
	xcall _ata_bsy
	tst R16
	brne L167
L170:
	.dbline 304
L171:
	.dbline 304
; while(!drq);
	xcall _ata_drq
	tst R16
	breq L170
	.dbline 306
; 
; for (i=0;i<256;i++)
	clr R12
	clr R13
	xjmp L176
L173:
	.dbline 307
;     {
	.dbline 308
;     ata_write_word(ATA_IO_DATA,(unsigned int)(*(ptr+1)<<8)+*ptr);
	movw R30,R10
	ldd R2,z+0
	clr R3
	ldd R18,z+1
	clr R19
	mov R19,R18
	clr R18
	add R18,R2
	adc R19,R3
	ldi R16,197
	xcall _ata_write_word
	.dbline 309
; 	ptr += 2;
	movw R24,R10
	adiw R24,2
	movw R10,R24
L177:
	.dbline 310
L178:
	.dbline 310
	xcall _ata_bsy
	tst R16
	brne L177
	.dbline 311
L174:
	.dbline 306
	movw R24,R12
	adiw R24,1
	movw R12,R24
L176:
	.dbline 306
	movw R24,R12
	cpi R24,0
	ldi R30,1
	cpc R25,R30
	brlo L173
	.dbline -2
	.dbline 312
;     while(busy);
;     }
; }			
L146:
	xcall pop_gset4
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbsym r i 12 i
	.dbsym r ptr 10 pc
	.dbsym l lbasector 8 l
	.dbsym r device 12 c
	.dbend

⌨️ 快捷键说明

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