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

📄 mp3.lst

📁 diy硬盘mp3的程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0202 9BCB      SBIS	0x19,3
    0203 C001      RJMP	0x0205
    0204 6450      ORI	R21,0x40
(0147) if (PORT_ATA_DATA1_IN & 0x10) wordin |= 0x0004;
    0205 9BCC      SBIS	0x19,4
    0206 C001      RJMP	0x0208
    0207 6044      ORI	R20,4
(0148) if (PORT_ATA_DATA1_IN & 0x20) wordin |= 0x2000;
    0208 9BCD      SBIS	0x19,5
    0209 C001      RJMP	0x020B
    020A 6250      ORI	R21,0x20
(0149) if (PORT_ATA_DATA1_IN & 0x40) wordin |= 0x0008;
    020B 9BCE      SBIS	0x19,6
    020C C001      RJMP	0x020E
    020D 6048      ORI	R20,0x8
(0150) if (PORT_ATA_DATA1_IN & 0x80) wordin |= 0x1000;
    020E 9BCF      SBIS	0x19,7
    020F C001      RJMP	0x0211
    0210 6150      ORI	R21,0x10
(0151) 
(0152) if (PORT_ATA_DATA2_IN & 0x01) wordin |= 0x0100;
    0211 9B98      SBIS	0x13,0
    0212 C001      RJMP	0x0214
    0213 6051      ORI	R21,1
(0153) if (PORT_ATA_DATA2_IN & 0x02) wordin |= 0x0080;
    0214 9B99      SBIS	0x13,1
    0215 C001      RJMP	0x0217
    0216 6840      ORI	R20,0x80
(0154) if (PORT_ATA_DATA2_IN & 0x04) wordin |= 0x0200;
    0217 9B9A      SBIS	0x13,2
    0218 C001      RJMP	0x021A
    0219 6052      ORI	R21,2
(0155) if (PORT_ATA_DATA2_IN & 0x08) wordin |= 0x0040;
    021A 9B9B      SBIS	0x13,3
    021B C001      RJMP	0x021D
    021C 6440      ORI	R20,0x40
(0156) if (PORT_ATA_DATA2_IN & 0x10) wordin |= 0x0400;
    021D 9B9C      SBIS	0x13,4
    021E C001      RJMP	0x0220
    021F 6054      ORI	R21,4
(0157) if (PORT_ATA_DATA2_IN & 0x20) wordin |= 0x0020;
    0220 9B9D      SBIS	0x13,5
    0221 C001      RJMP	0x0223
    0222 6240      ORI	R20,0x20
(0158) if (PORT_ATA_DATA2_IN & 0x40) wordin |= 0x0800;
    0223 9B9E      SBIS	0x13,6
    0224 C001      RJMP	0x0226
    0225 6058      ORI	R21,0x8
(0159) if (PORT_ATA_DATA2_IN & 0x80) wordin |= 0x0010;
    0226 9B9F      SBIS	0x13,7
    0227 C001      RJMP	0x0229
    0228 6140      ORI	R20,0x10
(0160) 
(0161) PORT_ATA_IO_CNTL |= ATA_IOR;
    0229 91800062  LDS	R24,0x62
    022B 6480      ORI	R24,0x40
    022C 93800062  STS	0x62,R24
(0162) return wordin;
    022E 018A      MOVW	R16,R20
    022F 940E1528  CALL	pop_gset2
    0231 9508      RET
_ata_read_byte:
  reg                  --> R20
    0232 940E1534  CALL	push_gset1
    0234 2F40      MOV	R20,R16
(0163) }   
(0164) 
(0165) //******************************************************************
(0166) //*	READ BYTE FROM ATA DEVICE
(0167) //*  
(0168) //*   
(0169) //*
(0170) //******************************************************************										 									 									 
(0171) unsigned char ata_read_byte(unsigned char reg)
(0172) {
(0173) return (unsigned char)(ata_read_word(reg) & 0x00ff);
    0235 2F04      MOV	R16,R20
    0236 DFAE      RCALL	_ata_read_word
    0237 7010      ANDI	R17,0
    0238 940E1537  CALL	pop_gset1
    023A 9508      RET
(0174) }	
(0175) 
(0176) //******************************************************************
(0177) //*	CHECK ATA READY BIT 
(0178) //*   Checks READY status bit.
(0179) //*   Returns 1 if device is ready.
(0180) //****************************************************************** 
(0181) unsigned char ata_rdy(void)
(0182) {
(0183) if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_RDY) return 1;
_ata_rdy:
    023B EF0D      LDI	R16,0xFD
    023C DFF5      RCALL	_ata_read_byte
    023D FF06      SBRS	R16,6
    023E C002      RJMP	0x0241
    023F E001      LDI	R16,1
    0240 C001      RJMP	0x0242
(0184) else return 0;
    0241 2700      CLR	R16
    0242 9508      RET
(0185) }
(0186) 
(0187) //******************************************************************
(0188) //*	CHECK ATA BUSY BIT 
(0189) //*   Checks READY status bit.
(0190) //*   Returns 1 if device is busy.
(0191) //****************************************************************** 
(0192) unsigned char ata_bsy(void)
(0193) {
(0194) if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_BSY) return 1;
_ata_bsy:
    0243 EF0D      LDI	R16,0xFD
    0244 DFED      RCALL	_ata_read_byte
    0245 FF07      SBRS	R16,7
    0246 C002      RJMP	0x0249
    0247 E001      LDI	R16,1
    0248 C001      RJMP	0x024A
(0195) else return 0;
    0249 2700      CLR	R16
    024A 9508      RET
(0196) }
(0197) 
(0198) //******************************************************************
(0199) //*	CHECK ATA DRQ BIT 
(0200) //*   Checks READY status bit.
(0201) //*   Returns 1 if device is requesting service.
(0202) //******************************************************************    
(0203) unsigned char ata_drq(void)
(0204) {
(0205) if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_DRQ) return 1;
_ata_drq:
    024B EF0D      LDI	R16,0xFD
    024C DFE5      RCALL	_ata_read_byte
    024D FF03      SBRS	R16,3
    024E C002      RJMP	0x0251
    024F E001      LDI	R16,1
    0250 C001      RJMP	0x0252
(0206) else return 0;
    0251 2700      CLR	R16
    0252 9508      RET
(0207) }
(0208) 
(0209) //******************************************************************
(0210) //*	CHECK ATA ERROR BIT 
(0211) //*   Checks READY status bit.
(0212) //*   Returns 1 if device is reporting an error condition.
(0213) //****************************************************************** 
(0214) unsigned char ata_err(void)
(0215) {
(0216) if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_ERR) return 1;
_ata_err:
    0253 EF0D      LDI	R16,0xFD
    0254 DFDD      RCALL	_ata_read_byte
    0255 FF00      SBRS	R16,0
    0256 C002      RJMP	0x0259
    0257 E001      LDI	R16,1
    0258 C001      RJMP	0x025A
(0217) else return 0;
    0259 2700      CLR	R16
    025A 9508      RET
_ata_read_sector_byte:
  word                 --> R14
  i                    --> R10
  j                    --> R12
  ptr                  --> Y+18
  qte                  --> Y+16
  from                 --> Y+14
  lbasector            --> Y+10
  device               --> R10
    025B 933A      ST	R19,-Y
    025C 932A      ST	R18,-Y
    025D 940E1557  CALL	push_gset5
    025F 2EA0      MOV	R10,R16
(0218) }
(0219) 
(0220) //******************************************************************
(0221) //*	READ A PART of SECTOR 
(0222) //*   device = 0x00 or 0x01  
(0223) //*   
(0224) //******************************************************************  	
(0225) void ata_read_sector_byte(unsigned char device, unsigned long lbasector,  
(0226) 	 					  unsigned int from, unsigned int qte, 
(0227) 						  unsigned char *ptr)
(0228) {
(0229) unsigned int i,j,word;
(0230) 
(0231) lbasector &= 0x0FFFFFFF;
    0260 EF4F      LDI	R20,0xFF
    0261 EF5F      LDI	R21,0xFF
    0262 EF6F      LDI	R22,0xFF
    0263 E07F      LDI	R23,0xF
    0264 01FE      MOVW	R30,R28
    0265 8422      LDD	R2,Z+10
    0266 8433      LDD	R3,Z+11
    0267 8444      LDD	R4,Z+12
    0268 8455      LDD	R5,Z+13
    0269 2224      AND	R2,R20
    026A 2235      AND	R3,R21
    026B 2246      AND	R4,R22
    026C 2257      AND	R5,R23
    026D 8622      STD	Z+10,R2
    026E 8633      STD	Z+11,R3
    026F 8644      STD	Z+12,R4
    0270 8655      STD	Z+13,R5
(0232) 
(0233) switch (device)
    0271 24BB      CLR	R11
    0272 20AA      TST	R10
    0273 F411      BNE	0x0276
    0274 20BB      TST	R11
    0275 F031      BEQ	0x027C
    0276 01C5      MOVW	R24,R10
    0277 3081      CPI	R24,1
    0278 E0E0      LDI	R30,0
    0279 079E      CPC	R25,R30
    027A F0D9      BEQ	0x0296
    027B C034      RJMP	0x02B0
(0234)  	{
(0235) 	case 0x00:
(0236)   	   ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
    027C E188      LDI	R24,0x18
    027D E090      LDI	R25,0
    027E 01FE      MOVW	R30,R28
    027F 8422      LDD	R2,Z+10
    0280 8433      LDD	R3,Z+11
    0281 8444      LDD	R4,Z+12
    0282 8455      LDD	R5,Z+13
    0283 938A      ST	R24,-Y
    0284 0181      MOVW	R16,R2
    0285 0192      MOVW	R18,R4
    0286 940E15C0  CALL	lsr32
    0288 0118      MOVW	R2,R16
    0289 0129      MOVW	R4,R18
    028A EE40      LDI	R20,0xE0
    028B E050      LDI	R21,0
    028C E060      LDI	R22,0
    028D E070      LDI	R23,0
    028E 2A24      OR	R2,R20
    028F 2A35      OR	R3,R21
    0290 2A46      OR	R4,R22
    0291 2A57      OR	R5,R23
    0292 2D22      MOV	R18,R2
    0293 EF05      LDI	R16,0xF5
    0294 DF45      RCALL	_ata_write_byte
(0237) 	   break;
    0295 C033      RJMP	0x02C9
(0238)   	case 0x01:
(0239)   	   ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xF0);
    0296 E188      LDI	R24,0x18
    0297 E090      LDI	R25,0
    0298 01FE      MOVW	R30,R28
    0299 8422      LDD	R2,Z+10
    029A 8433      LDD	R3,Z+11
    029B 8444      LDD	R4,Z+12
    029C 8455      LDD	R5,Z+13
    029D 938A      ST	R24,-Y
    029E 0181      MOVW	R16,R2
    029F 0192      MOVW	R18,R4
    02A0 940E15C0  CALL	lsr32
    02A2 0118      MOVW	R2,R16
    02A3 0129      MOVW	R4,R18
    02A4 EF40      LDI	R20,0xF0
    02A5 E050      LDI	R21,0
    02A6 E060      LDI	R22,0
    02A7 E070      LDI	R23,0
    02A8 2A24      OR	R2,R20
    02A9 2A35      OR	R3,R21
    02AA 2A46      OR	R4,R22
    02AB 2A57      OR	R5,R23
    02AC 2D22      MOV	R18,R2
    02AD EF05      LDI	R16,0xF5
    02AE DF2B      RCALL	_ata_write_byte
(0240) 	   break;
    02AF C019      RJMP	0x02C9
(0241)   	default:
(0242)   	   ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
    02B0 E188      LDI	R24,0x18
    02B1 E090      LDI	R25,0
    02B2 01FE      MOVW	R30,R28
    02B3 8422      LDD	R2,Z+10
    02B4 8433      LDD	R3,Z+11
    02B5 8444      LDD	R4,Z+12
    02B6 8455      LDD	R5,Z+13
    02B7 938A      ST	R24,-Y
    02B8 0181      MOVW	R16,R2
    02B9 0192      MOVW	R18,R4
    02BA 940E15C0  CALL	lsr32
    02BC 0118      MOVW	R2,R16
    02BD 0129      MOVW	R4,R18
    02BE EE40      LDI	R20,0xE0
    02BF E050      LDI	R21,0
    02C0 E060      LDI	R22,0
    02C1 E070      LDI	R23,0
    02C2 2A24      OR	R2,R20
    02C3 2A35      OR	R3,R21
    02C4 2A46      OR	R4,R22
    02C5 2A57      OR	R5,R23
    02C6 2D22      MOV	R18,R2
    02C7 EF05      LDI	R16,0xF5
    02C8 DF11      RCALL	_ata_write_byte
(0243) 	   break; 
(0244)  	} 
(0245) while(busy);
    02C9 DF79      RCALL	_ata_bsy
    02CA 2300      TST	R16
    02CB F7E9      BNE	0x02C9
(0246) ata_write_byte(ATA_IO_CYL_H,lbasector >> 16);
    02CC 01FE      MOVW	R30,R28
    02CD 8422      LDD	R2,Z+10
    02CE 8433      LDD	R3,Z+11
    02CF 8444      LDD	R4,Z+12
    02D0 8455      LDD	R5,Z+13
    02D1 0112      MOVW	R2,R4
    02D2 2444      CLR	R4
    02D3 2455      CLR	R5
    02D4 2D22      MOV	R18,R2
    02D5 ED0D      LDI	R16,0xDD
    02D6 DF03      RCALL	_ata_write_byte
(0247) while(busy);
    02D7 DF6B      RCALL	_ata_bsy
    02D8 2300      TST	R16
    02D9 F7E9      BNE	0x02D7
(0248) ata_write_byte(ATA_IO_CYL_L,lbasector >> 8);
    02DA E088      LDI	R24,0x8
    02DB E090      LDI	R25,0
    02DC 01FE      MOVW	R30,R28
    02DD 8422      LDD	R2,Z+10
    02DE 8433      LDD	R3,Z+11
    02DF 8444      LDD	R4,Z+12
    02E0 8455      LDD	R5,Z+13
    02E1 938A      ST	R24,-Y
    02E2 0181      MOVW	R16,R2
    02E3 0192      MOVW	R18,R4
    02E4 940E15C0  CALL	lsr32
    02E6 2F20      MOV	R18,R16
    02E7 ED05      LDI	R16,0xD5
    02E8 DEF1      RCALL	_ata_write_byte
(0249) while(busy);
    02E9 DF59      RCALL	_ata_bsy
    02EA 2300      TST	R16
    02EB F7E9      BNE	0x02E9
(0250) ata_write_byte(ATA_IO_SECTORNUM,lbasector);
    02EC 01FE      MOVW	R30,R28
    02ED 8422      LDD	R2,Z+10
    02EE 8433      LDD	R3,Z+11
    02EF 8444      LDD	R4,Z+12
    02F0 8455      LDD	R5,Z+13
    02F1 2D22      MOV	R18,R2
    02F2 EE0D      LDI	R16,0xED
    02F3 DEE6      RCALL	_ata_write_byte
(0251) while(busy);
    02F4 DF4E      RCALL	_ata_bsy
    02F5 2300      TST	R16
    02F6 F7E9      BNE	0x02F4
(0252) ata_write_byte(ATA_IO_SECTORCNT,0x01);
    02F7 E021      LDI	R18,1
    02F8 EE05      LDI	R16,0xE5
    02F9 DEE0      RCALL	_ata_write_byte
(0253) while(busy);
    02FA DF48      RCALL	_ata_bsy
    02FB 2300      TST	R16
    02FC F7E9      BNE	0x02FA
(0254) ata_write_byte(ATA_IO_CMD,CMD_READ_SECTORS);
    02FD E220      LDI	R18,0x20
    02FE EF0D      LDI	R16,0xFD
    02FF DEDA      RCALL	_ata_write_byte
(0255) while(busy);
    0300 DF42      RCALL	_ata_bsy
    0301 2300      TST	R16
    0302 F7E9      BNE	0x0300
(0256) while(!drq);
    0303 DF47      RCALL	_ata_drq
    0304 2300      TST	R16
    0305 F3E9      BEQ	0x0303
(0257) 
(0258) j = 0;
    0306 24CC      CLR	R12
    0307 24DD      CLR	R13
(0259) for (i=0;i<256;i++)
    0308 24AA      CLR	R10
    0309 24BB      CLR	R11
    030A C036      RJMP	0x0341
(0260)     {
(0261) 	word = ata_read_word(ATA_IO_DATA);
    030B EC05      LDI	R16,0xC5
    030C DED8      RCALL	_ata_read_word
    030D 0178      MOVW	R14,R16
(0262) 	if ((j >= from) && (j < (from + qte))) *ptr++ = (unsigned char)(word);
    030E 840E      LDD	R0,Y+14
    030F 841F      LDD	R1,Y+15
    0310 14C0      CP	R12,R0
    0311 04D1      CPC	R13,R1
    0312 F068      BCS	0x0320
    0313 0110      MOVW	R2,R0
    0314 8808      LDD	R0,Y+16
    0315 8819      LDD	R1,Y+17
    0316 0C20      ADD	R2,R0
    0317 1C31      ADC	R3,R1
    0318 14C2      CP	R12,R2

⌨️ 快捷键说明

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