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

📄 mp3.lst

📁 使用硬盘制作mp3的源程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0158 EFCF      LDI	R28,0xFF
    0159 E1D0      LDI	R29,0x10
    015A BFCD      OUT	0x3D,R28
    015B BFDE      OUT	0x3E,R29
    015C 58C0      SUBI	R28,0x80
    015D 40D0      SBCI	R29,0
    015E EA0A      LDI	R16,0xAA
    015F 8308      STD	Y+0,R16
    0160 2400      CLR	R0
    0161 E2E0      LDI	R30,0x20
    0162 E0F2      LDI	R31,2
    0163 E016      LDI	R17,6
    0164 36EA      CPI	R30,0x6A
    0165 07F1      CPC	R31,R17
    0166 F011      BEQ	0x0169
    0167 9201      ST	R0,Z+
    0168 CFFB      RJMP	0x0164
    0169 8300      STD	Z+0,R16
    016A E8EF      LDI	R30,0x8F
    016B E0F1      LDI	R31,1
    016C E0A0      LDI	R26,0
    016D E0B1      LDI	R27,1
    016E E012      LDI	R17,2
    016F 3AEF      CPI	R30,0xAF
    0170 07F1      CPC	R31,R17
    0171 F021      BEQ	0x0176
    0172 95C8      LPM
    0173 9631      ADIW	R30,1
    0174 920D      ST	R0,X+
    0175 CFF9      RJMP	0x016F
    0176 940E081A  CALL	_main
_exit:
    0178 CFFF      RJMP	_exit
_init_ata:
  j                    --> Y+1
  i                    --> Y+1
  word_read            --> Y+1
  device               --> R20
    0179 940E15D7  CALL	push_gset2
    017B 2F40      MOV	R20,R16
FILE: G:\IccPro\Mp3Ide\ata.c
(0001) #include <iom128v.h>
(0002) #include <string.h>
(0003) #include <stdio.h>
(0004) #include <macros.h>
(0005) #include "ata.h"
(0006) #include "generic.h"
(0007) #include "remote.h"
(0008) 
(0009) #define debug
(0010) #define debugport 1
(0011) 
(0012) //******************************************************************
(0013) //*	INITIALIZE HARDWARE FOR ATA DRIVER
(0014) //*   
(0015) //*   
(0016) //******************************************************************
(0017) int init_ata(unsigned char device)
(0018) {
(0019) unsigned int word_read,i,j;
(0020) 
(0021) ata_databus_in;
    017C 2422      CLR	R2
    017D BA2A      OUT	0x1A,R2
    017E BA24      OUT	0x14,R2
(0022) PORT_ATA_IO_CNTL_DDR = 0xff;
    017F EF8F      LDI	R24,0xFF
    0180 93800061  STS	0x61,R24
(0023) PORT_ATA_IO_CNTL = ATA_IO_HIZ;
    0182 93800062  STS	0x62,R24
(0024) PORT_ATA_RST_CNTL_DDR |= ATA_RESET;
    0184 91800064  LDS	R24,0x64
    0186 6082      ORI	R24,2
    0187 93800064  STS	0x64,R24
(0025) 
(0026) ata_hard_reset();
    0189 D03D      RCALL	_ata_hard_reset
(0027) 
(0028) while (!ready & busy);
    018A D10E      RCALL	_ata_rdy
    018B 2300      TST	R16
    018C F419      BNE	0x0190
    018D E061      LDI	R22,1
    018E E070      LDI	R23,0
    018F C002      RJMP	0x0192
    0190 2766      CLR	R22
    0191 2777      CLR	R23
    0192 D10E      RCALL	_ata_bsy
    0193 2E20      MOV	R2,R16
    0194 2433      CLR	R3
    0195 012B      MOVW	R4,R22
    0196 2042      AND	R4,R2
    0197 2053      AND	R5,R3
    0198 2044      TST	R4
    0199 F781      BNE	0x018A
    019A 2055      TST	R5
    019B F771      BNE	0x018A
(0029) ata_select_device(device);
    019C 2F04      MOV	R16,R20
    019D D03F      RCALL	_ata_select_device
(0030) while (!ready & busy);
    019E D0FA      RCALL	_ata_rdy
    019F 2300      TST	R16
    01A0 F419      BNE	0x01A4
    01A1 E061      LDI	R22,1
    01A2 E070      LDI	R23,0
    01A3 C002      RJMP	0x01A6
    01A4 2766      CLR	R22
    01A5 2777      CLR	R23
    01A6 D0FA      RCALL	_ata_bsy
    01A7 2E20      MOV	R2,R16
    01A8 2433      CLR	R3
    01A9 012B      MOVW	R4,R22
    01AA 2042      AND	R4,R2
    01AB 2053      AND	R5,R3
    01AC 2044      TST	R4
    01AD F781      BNE	0x019E
    01AE 2055      TST	R5
    01AF F771      BNE	0x019E
(0031) ata_write_byte(ATA_IO_CMD,CMD_RECALIBRATE);
    01B0 E120      LDI	R18,0x10
    01B1 EF0D      LDI	R16,0xFD
    01B2 D085      RCALL	_ata_write_byte
(0032) while (busy);
    01B3 D0ED      RCALL	_ata_bsy
    01B4 2300      TST	R16
    01B5 F7E9      BNE	0x01B3
(0033) ata_write_byte(ATA_IO_SECTORCNT,60); // Sleep after 5 min
    01B6 E32C      LDI	R18,0x3C
    01B7 EE05      LDI	R16,0xE5
    01B8 D07F      RCALL	_ata_write_byte
(0034) while (busy);
    01B9 D0E7      RCALL	_ata_bsy
    01BA 2300      TST	R16
    01BB F7E9      BNE	0x01B9
(0035) ata_write_byte(ATA_IO_CMD,CMD_STANDBY2);
    01BC E926      LDI	R18,0x96
    01BD EF0D      LDI	R16,0xFD
    01BE D079      RCALL	_ata_write_byte
(0036) while (busy);
    01BF D0E1      RCALL	_ata_bsy
    01C0 2300      TST	R16
    01C1 F7E9      BNE	0x01BF
(0037) 
(0038) return 1;
    01C2 E001      LDI	R16,1
    01C3 E010      LDI	R17,0
    01C4 940E15C5  CALL	pop_gset2
    01C6 9508      RET
(0039) }
(0040) 
(0041) //******************************************************************
(0042) //*	PERFORM HARDWARE RESET
(0043) //*   This routine toggles ATA RESET line low for 10ms.
(0044) //*   
(0045) //******************************************************************										 									 									 
(0046) void ata_hard_reset(void)
(0047) {
(0048) ata_databus_in;
_ata_hard_reset:
    01C7 2422      CLR	R2
    01C8 BA2A      OUT	0x1A,R2
    01C9 BA24      OUT	0x14,R2
(0049) PORT_ATA_RST_CNTL &= ~ATA_RESET;
    01CA 91800065  LDS	R24,0x65
    01CC 7F8D      ANDI	R24,0xFD
    01CD 93800065  STS	0x65,R24
(0050) delay_ms(10);
    01CF E00A      LDI	R16,0xA
    01D0 E010      LDI	R17,0
    01D1 940E07EE  CALL	_delay_ms
(0051) PORT_ATA_RST_CNTL |= ATA_RESET;
    01D3 91800065  LDS	R24,0x65
    01D5 6082      ORI	R24,2
    01D6 93800065  STS	0x65,R24
(0052) delay_ms(10);
    01D8 E00A      LDI	R16,0xA
    01D9 E010      LDI	R17,0
    01DA 940E07EE  CALL	_delay_ms
    01DC 9508      RET
_ata_select_device:
  device               --> R20
    01DD 940E15D9  CALL	push_gset1
    01DF 2F40      MOV	R20,R16
(0053) }   
(0054) 
(0055) //******************************************************************
(0056) //*	SELECT ATA DEVICE
(0057) //*   This routine defaults to Drive 0 as the target drive.
(0058) //*   
(0059) //******************************************************************
(0060) void ata_select_device(unsigned char device)
(0061) {
(0062) switch (device)
    01E0 2755      CLR	R21
    01E1 3040      CPI	R20,0
    01E2 0745      CPC	R20,R21
    01E3 F029      BEQ	0x01E9
    01E4 3041      CPI	R20,1
    01E5 E0E0      LDI	R30,0
    01E6 075E      CPC	R21,R30
    01E7 F029      BEQ	0x01ED
    01E8 C008      RJMP	0x01F1
(0063) 	{
(0064)    	case 0x00:
(0065) 		ata_write_byte(ATA_IO_DEVICE_HEAD,ATA_DH_DEV0);
    01E9 EE20      LDI	R18,0xE0
    01EA EF05      LDI	R16,0xF5
    01EB D04C      RCALL	_ata_write_byte
(0066) 		break;
    01EC C007      RJMP	0x01F4
(0067)   	case 0x01:
(0068) 		ata_write_byte(ATA_IO_DEVICE_HEAD,ATA_DH_DEV1);
    01ED EF20      LDI	R18,0xF0
    01EE EF05      LDI	R16,0xF5
    01EF D048      RCALL	_ata_write_byte
(0069) 		break;
    01F0 C003      RJMP	0x01F4
(0070) 	default:
(0071) 		ata_write_byte(ATA_IO_DEVICE_HEAD,ATA_DH_DEV0);
    01F1 EE20      LDI	R18,0xE0
    01F2 EF05      LDI	R16,0xF5
    01F3 D044      RCALL	_ata_write_byte
(0072) 		break;
    01F4 940E15DC  CALL	pop_gset1
    01F6 9508      RET
_ata_write_word:
  wordout              --> R20
  reg                  --> R22
    01F7 940E15D7  CALL	push_gset2
    01F9 01A9      MOVW	R20,R18
    01FA 2F60      MOV	R22,R16
(0073)   }
(0074) }
(0075) 
(0076) //******************************************************************
(0077) //*	WRITE WORD TO ATA DEVICE
(0078) //*   
(0079) //* Mapping : D0-PA0,D1-PA2,D2-PA4,D3-PA6,D4-PC7,D5-PC5,D7-PC3,D7-PC1
(0080) //*			  D8-PC0,D9-PC2,D10-PC4,D11-PC6,D12-PA7,D13-PA5,D14-PA3,D15-PA1
(0081) //******************************************************************										 									 									 
(0082) void ata_write_word(unsigned char reg,unsigned int wordout)
(0083) {
(0084) WDR();
    01FB 95A8      WDR
(0085) PORT_ATA_IO_CNTL = reg;
    01FC 93600062  STS	0x62,R22
(0086) 
(0087) ata_databus_out;
    01FE EF8F      LDI	R24,0xFF
    01FF BB8A      OUT	0x1A,R24
    0200 BB84      OUT	0x14,R24
(0088) 
(0089) PORT_ATA_DATA1_OUT = 0x00;
    0201 2422      CLR	R2
    0202 BA2B      OUT	0x1B,R2
(0090) PORT_ATA_DATA2_OUT = 0x00;
    0203 BA25      OUT	0x15,R2
(0091) 
(0092) if (wordout & 0x0001) PORT_ATA_DATA1_OUT |= 0x01; 
    0204 FD40      SBRC	R20,0
    0205 9AD8      SBI	0x1B,0
(0093) if (wordout & 0x0002) PORT_ATA_DATA1_OUT |= 0x04;
    0206 FD41      SBRC	R20,1
    0207 9ADA      SBI	0x1B,2
(0094) if (wordout & 0x0004) PORT_ATA_DATA1_OUT |= 0x10;
    0208 FD42      SBRC	R20,2
    0209 9ADC      SBI	0x1B,4
(0095) if (wordout & 0x0008) PORT_ATA_DATA1_OUT |= 0x40;
    020A FD43      SBRC	R20,3
    020B 9ADE      SBI	0x1B,6
(0096) if (wordout & 0x0010) PORT_ATA_DATA2_OUT |= 0x80;
    020C FD44      SBRC	R20,4
    020D 9AAF      SBI	0x15,7
(0097) if (wordout & 0x0020) PORT_ATA_DATA2_OUT |= 0x20;
    020E FD45      SBRC	R20,5
    020F 9AAD      SBI	0x15,5
(0098) if (wordout & 0x0040) PORT_ATA_DATA2_OUT |= 0x08;
    0210 FD46      SBRC	R20,6
    0211 9AAB      SBI	0x15,3
(0099) if (wordout & 0x0080) PORT_ATA_DATA2_OUT |= 0x02;
    0212 FD47      SBRC	R20,7
    0213 9AA9      SBI	0x15,1
(0100) if (wordout & 0x0100) PORT_ATA_DATA2_OUT |= 0x01;
    0214 FD50      SBRC	R21,0
    0215 9AA8      SBI	0x15,0
(0101) if (wordout & 0x0200) PORT_ATA_DATA2_OUT |= 0x04;
    0216 FD51      SBRC	R21,1
    0217 9AAA      SBI	0x15,2
(0102) if (wordout & 0x0400) PORT_ATA_DATA2_OUT |= 0x10;
    0218 FD52      SBRC	R21,2
    0219 9AAC      SBI	0x15,4
(0103) if (wordout & 0x0800) PORT_ATA_DATA2_OUT |= 0x40;
    021A FD53      SBRC	R21,3
    021B 9AAE      SBI	0x15,6
(0104) if (wordout & 0x1000) PORT_ATA_DATA1_OUT |= 0x80;
    021C FD54      SBRC	R21,4
    021D 9ADF      SBI	0x1B,7
(0105) if (wordout & 0x2000) PORT_ATA_DATA1_OUT |= 0x20;
    021E FD55      SBRC	R21,5
    021F 9ADD      SBI	0x1B,5
(0106) if (wordout & 0x4000) PORT_ATA_DATA1_OUT |= 0x08;
    0220 FD56      SBRC	R21,6
    0221 9ADB      SBI	0x1B,3
(0107) if (wordout & 0x8000) PORT_ATA_DATA1_OUT |= 0x02;
    0222 FD57      SBRC	R21,7
    0223 9AD9      SBI	0x1B,1
(0108) 
(0109) ata_write_pulse;
    0224 91800062  LDS	R24,0x62
    0226 778F      ANDI	R24,0x7F
    0227 93800062  STS	0x62,R24
    0229 E001      LDI	R16,1
    022A E010      LDI	R17,0
    022B 940E0804  CALL	_delay_us
    022D 91800062  LDS	R24,0x62
    022F 6880      ORI	R24,0x80
    0230 93800062  STS	0x62,R24
(0110) 
(0111) ata_databus_in;
    0232 2422      CLR	R2
    0233 BA2A      OUT	0x1A,R2
    0234 BA24      OUT	0x14,R2
    0235 940E15C5  CALL	pop_gset2
    0237 9508      RET
_ata_write_byte:
  byteout              --> R22
  reg                  --> R20
    0238 940E15D7  CALL	push_gset2
    023A 2F62      MOV	R22,R18
    023B 2F40      MOV	R20,R16
(0112) } 	
(0113) 
(0114) //******************************************************************
(0115) //*	WRITE BYTE TO ATA DEVICE
(0116) //*   
(0117) //*
(0118) //******************************************************************										 									 									 
(0119) void ata_write_byte(unsigned char reg,unsigned char byteout)
(0120) {
(0121) ata_write_word(reg,(unsigned int)byteout);
    023C 2F26      MOV	R18,R22
    023D 2733      CLR	R19
    023E 2F04      MOV	R16,R20
    023F DFB7      RCALL	_ata_write_word
    0240 940E15C5  CALL	pop_gset2
    0242 9508      RET
_ata_read_word:
  wordin               --> R20
  reg                  --> R22
    0243 940E15D7  CALL	push_gset2
    0245 2F60      MOV	R22,R16
(0122) }
(0123) 
(0124) //******************************************************************
(0125) //*	READ WORD FROM ATA DEVICE
(0126) //*   
(0127) //*   
(0128) //* Mapping : D0-PA0,D1-PA2,D2-PA4,D3-PA6,D4-PC7,D5-PC5,D7-PC3,D7-PC1
(0129) //*			  D8-PC0,D9-PC2,D10-PC4,D11-PC6,D12-PA7,D13-PA5,D14-PA3,D15-PA1
(0130) //******************************************************************										 									 									 
(0131) unsigned int ata_read_word(unsigned char reg)
(0132) {
(0133) unsigned int wordin = 0;
    0246 2744      CLR	R20
    0247 2755      CLR	R21
(0134) 
(0135) WDR();
    0248 95A8      WDR
(0136) PORT_ATA_IO_CNTL = reg;
    0249 93600062  STS	0x62,R22
(0137) 
(0138) ata_databus_in;
    024B 2422      CLR	R2
    024C BA2A      OUT	0x1A,R2
    024D BA24      OUT	0x14,R2
(0139) 
(0140) PORT_ATA_IO_CNTL &= ~ATA_IOR;
    024E 91800062  LDS	R24,0x62
    0250 7B8F      ANDI	R24,0xBF
    0251 93800062  STS	0x62,R24
(0141) delay_us(1);
    0253 E001      LDI	R16,1
    0254 E010      LDI	R17,0
    0255 940E0804  CALL	_delay_us
(0142) 
(0143) if (PORT_ATA_DATA1_IN & 0x01) wordin |= 0x0001;
    0257 9BC8      SBIS	0x19,0
    0258 C001      RJMP	0x025A
    0259 6041      ORI	R20,1
(0144) if (PORT_ATA_DATA1_IN & 0x02) wordin |= 0x8000;
    025A 9BC9      SBIS	0x19,1
    025B C001      RJMP	0x025D
    025C 6850      ORI	R21,0x80
(0145) if (PORT_ATA_DATA1_IN & 0x04) wordin |= 0x0002;
    025D 9BCA      SBIS	0x19,2
    025E C001      RJMP	0x0260

⌨️ 快捷键说明

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