📄 main.lst
字号:
1 .file "main.c"
2 .arch atmega16
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
69 .global uartdata
70 .global uartdata
71 .section .bss
74 uartdata:
75 0000 00 .skip 1,0
76 .text
78 .global __vector_11
80 __vector_11:
1:main.c **** /*****************************************************
2:main.c **** WinAVR
3:main.c **** 项目 : 硬盘控制
4:main.c **** 版本 : 0.1
5:main.c **** 日期 : 2005-1-9
6:main.c **** 作者 : 金方剑
7:main.c ****
8:main.c ****
9:main.c **** 芯片 : ATmega16L
10:main.c **** 时钟 : 8.000000 MHz
11:main.c **** *****************************************************/
12:main.c **** #include <avr/io.h>
13:main.c **** #include <avr/iom16.h>
14:main.c **** #include <avr/interrupt.h>
15:main.c **** #include <avr/signal.h>
16:main.c ****
17:main.c **** #include <avr/pgmspace.h>
18:main.c **** #include <avr/eeprom.h>
19:main.c **** //******************************************************************************
20:main.c **** #define byte unsigned char
21:main.c **** #define uint unsigned int
22:main.c **** #define ulong unsigned long
23:main.c **** #define nop() __asm__ __volatile__ ("nop" ::)
24:main.c **** #define wdr() __asm__ __volatile__ ("wdr" ::)
25:main.c **** #define Set_Bit(val, bitn) (val |=(1<<(bitn)))//设置某一位
26:main.c **** #define Clr_Bit(val, bitn) (val&=~(1<<(bitn)))//清除某一位
27:main.c **** #define Get_Bit(val, bitn) (val &(1<<(bitn)))//读取某一位
28:main.c **** //******************************************************************************
29:main.c **** //线路连接定义。如电路有变直接修改就可以了
30:main.c **** #define WDataL PORTA
31:main.c **** #define WDataH PORTB
32:main.c **** #define RDataL PINA
33:main.c **** #define RDataH PINB
34:main.c **** #define CS0 PC0
35:main.c **** #define CS1 PC1
36:main.c **** #define DA0 PD5
37:main.c **** #define DA1 PD6
38:main.c **** #define DA2 PD7
39:main.c **** #define Read PC6
40:main.c **** #define Write PC7
41:main.c **** #define Rst PD4
42:main.c **** //******************************************************************************
43:main.c **** //ATA命令
44:main.c **** // CB_ERR ERROR REGISTER BITS
45:main.c **** #define ATA_ER_BBK 0x80 // ATA bad block
46:main.c **** #define ATA_ER_UNC 0x40 // ATA uncorrected error
47:main.c **** #define ATA_ER_MC 0x20 // ATA media change
48:main.c **** #define ATA_ER_IDNF 0x10 // ATA id not found
49:main.c **** #define ATA_ER_MCR 0x08 // ATA media change request
50:main.c **** #define ATA_ER_ABRT 0x04 // ATA command aborted
51:main.c **** #define ATA_ER_NTK0 0x02 // ATA track 0 not found
52:main.c **** #define ATA_ER_NDAM 0x01 // ATA address mark not found
53:main.c **** // CB_DH bits 7-4 OF THE DEVICE/HEAD REGISTER
54:main.c **** #define ATA_DH_DEV0 0xE0 // select device 0 LBA MODE
55:main.c **** #define ATA_DH_DEV1 0xF0 // select device 1 LBA MODE
56:main.c **** //ATA commands (from ATA-3),
57:main.c **** #define CMD_CFA_ERASE_SECTORS 0xC0
58:main.c **** #define CMD_CFA_REQUEST_EXT_ERR_CODE 0x03
59:main.c **** #define CMD_CFA_TRANSLATE_SECTOR 0x87
60:main.c **** #define CMD_CFA_WRITE_MULTIPLE_WO_ERASE 0xCD
61:main.c **** #define CMD_CFA_WRITE_SECTORS_WO_ERASE 0x38
62:main.c **** #define CMD_CHECK_POWER_MODE1 0xE5
63:main.c **** #define CMD_CHECK_POWER_MODE2 0x98
64:main.c **** #define CMD_DEVICE_RESET 0x08
65:main.c **** #define CMD_EXECUTE_DEVICE_DIAGNOSTIC 0x90
66:main.c **** #define CMD_FLUSH_CACHE 0xE7
67:main.c **** #define CMD_FORMAT_TRACK 0x50
68:main.c **** #define CMD_IDENTIFY_DEVICE 0xEC
69:main.c **** #define CMD_IDENTIFY_DEVICE_PACKET 0xA1
70:main.c **** #define CMD_IDENTIFY_PACKET_DEVICE 0xA1
71:main.c **** #define CMD_IDLE1 0xE3
72:main.c **** #define CMD_IDLE2 0x97
73:main.c **** #define CMD_IDLE_IMMEDIATE1 0xE1
74:main.c **** #define CMD_IDLE_IMMEDIATE2 0x95
75:main.c **** #define CMD_INITIALIZE_DRIVE_PARAMETERS 0x91
76:main.c **** #define CMD_INITIALIZE_DEVICE_PARAMETERS 0x91
77:main.c **** #define CMD_NOP 0x00
78:main.c **** #define CMD_PACKET 0xA0
79:main.c **** #define CMD_READ_BUFFER 0xE4
80:main.c **** #define CMD_READ_DMA 0xC8
81:main.c **** #define CMD_READ_DMA_QUEUED 0xC7
82:main.c **** #define CMD_READ_MULTIPLE 0xC4
83:main.c **** #define CMD_READ_SECTORS 0x20
84:main.c **** #define CMD_READ_VERIFY_SECTORS 0x40
85:main.c **** #define CMD_RECALIBRATE 0x10
86:main.c **** #define CMD_SEEK 0x70
87:main.c **** #define CMD_SET_FEATURES 0xEF
88:main.c **** #define CMD_SET_MULTIPLE_MODE 0xC6
89:main.c **** #define CMD_SLEEP1 0xE6
90:main.c **** #define CMD_SLEEP2 0x99
91:main.c **** #define CMD_STANDBY1 0xE2
92:main.c **** #define CMD_STANDBY2 0x96
93:main.c **** #define CMD_STANDBY_IMMEDIATE1 0xE0
94:main.c **** #define CMD_STANDBY_IMMEDIATE2 0x94
95:main.c **** #define CMD_WRITE_BUFFER 0xE8
96:main.c **** #define CMD_WRITE_DMA 0xCA
97:main.c **** #define CMD_WRITE_DMA_QUEUED 0xCC
98:main.c **** #define CMD_WRITE_MULTIPLE 0xC5
99:main.c **** #define CMD_WRITE_SECTORS 0x30
100:main.c **** #define CMD_WRITE_VERIFY 0x3C
101:main.c **** //******************************************************************************
102:main.c **** //硬盘状态寄存器地址定义
103:main.c **** #define _Data 0x0
104:main.c **** #define _Err_Features 0x1
105:main.c **** #define _SecCount 0x2
106:main.c **** #define _SecNum 0x3
107:main.c **** #define _CylinderL 0x4
108:main.c **** #define _CylinderH 0x5
109:main.c **** #define _DeviceAndHead 0x6
110:main.c **** #define _Status_AND_Command 0x7
111:main.c **** //******************************************************************************
112:main.c **** /************************************************************
113:main.c **** * D7 D6 D5 D4 D3 D2 D1 D0 *
114:main.c **** BSY DRDY DWF DSC DRQ CORR IDX ERR *
115:main.c **** BSY:驱动器忙; *
116:main.c **** DRDY:驱动器准备好; *
117:main.c **** DWF:驱动器写失败; *
118:main.c **** DSC:寻道结束; *
119:main.c **** DRQ:请求服务,驱动器希望通过数据寄存器与CPU交换一字节数据 *
120:main.c **** CORR:当可以纠正的读错误发生时,该位置1,数据传输将继续进行 *
121:main.c **** IDX:收到综引信号; *
122:main.c **** ERR:命令执行出错。 *
123:main.c **** *************************************************************/
124:main.c **** #define BSY ((HDstate&0x80)==0x80)
125:main.c **** #define DRDY ((HDstate&0x40)==0x40)
126:main.c **** #define DWF ((HDstate&0x20)==0x20)
127:main.c **** #define DSC ((HDstate&0x10)==0x10)
128:main.c **** #define DRQ ((HDstate&0x08)==0x08)
129:main.c **** #define CORR ((HDstate&0x04)==0x04)
130:main.c **** #define IDX ((HDstate&0x02)==0x02)
131:main.c **** #define ERR ((HDstate&0x01)==0x01)
132:main.c **** //******************************************************************************
133:main.c **** //主工程的函数
134:main.c **** //int main(void);
135:main.c **** void delay_ms(uint ms);//毫秒级定时
136:main.c **** void delay_us(uint us);//微秒级定时
137:main.c **** //******************************************************************************
138:main.c **** //ATA的函数
139:main.c **** void HDinit(void);//硬盘初始化
140:main.c **** byte ReadReg(byte byAddr);//读寄存器
141:main.c **** void WriteReg(byte byAddr,byte byData);//写寄存器
142:main.c **** byte WaitBSY(void);//等待BSY信号
143:main.c **** byte WaitDRQ(void);//等待DRQ信号
144:main.c **** void RegAddrChangePhysics(byte byRegAddr);//把寄存器地址转化为物理接口
145:main.c **** void Read_HD_ID(void);//读硬盘ID
146:main.c **** void HDStop(void);//让硬盘休眠(停转)
147:main.c **** void HDRunningActivation(void);//激活硬盘(转动)
148:main.c **** void LBA(unsigned long lba);//LBA寻址
149:main.c **** void ReadData(void);//读硬盘数据寄存器内容
150:main.c **** void WriteData(byte byDataL,byte byDataH);//写硬盘数据寄存器内容
151:main.c **** void ReadSectorData(ulong lSectorAdd);//读一个扇区的数据
152:main.c **** void WriteSectorData(ulong lSectorAdd);//写一个扇区的数据
153:main.c **** void WriteCHS(uint iCylinder,byte byHead,byte bySector,byte byReadcount);//硬盘寻址
154:main.c **** byte ReversalData(byte byReversal);//颠倒数据,0位换到7位,7位换到0位
155:main.c **** //******************************************************************************
156:main.c **** byte uartdata=0;
157:main.c **** byte HDDATAL,HDDATAH; //低字节,高字节
158:main.c **** byte HDstate; //硬盘状态
159:main.c **** byte HDSectorDATA[512]; //硬盘扇区数据
160:main.c **** //******************************************************************************
161:main.c **** //UART接收中断
162:main.c **** SIGNAL(SIG_UART_RECV)
163:main.c **** {
82 .LM1:
83 /* prologue: frame size=0 */
84 0000 1F92 push __zero_reg__
85 0002 0F92 push __tmp_reg__
86 0004 0FB6 in __tmp_reg__,__SREG__
87 0006 0F92 push __tmp_reg__
88 0008 1124 clr __zero_reg__
89 000a 8F93 push r24
90 000c CF93 push r28
91 000e DF93 push r29
92 0010 CDB7 in r28,__SP_L__
93 0012 DEB7 in r29,__SP_H__
94 /* prologue end (size=10) */
164:main.c **** uartdata=UDR;//调试用的,不用管它
96 .LM2:
97 0014 8091 2C00 lds r24,44
98 0018 8093 0000 sts uartdata,r24
165:main.c **** nop();
100 .LM3:
101 /* #APP */
102 001c 0000 nop
166:main.c **** UDR=uartdata;
104 .LM4:
105 /* #NOAPP */
106 001e 8091 0000 lds r24,uartdata
107 0022 8093 2C00 sts 44,r24
108 /* epilogue: frame size=0 */
109 0026 DF91 pop r29
110 0028 CF91 pop r28
111 002a 8F91 pop r24
112 002c 0F90 pop __tmp_reg__
113 002e 0FBE out __SREG__,__tmp_reg__
114 0030 0F90 pop __tmp_reg__
115 0032 1F90 pop __zero_reg__
116 0034 1895 reti
117 /* epilogue end (size=8) */
118 /* function __vector_11 size 28 (10) */
120 .Lscope0:
122 .global main
124 main:
167:main.c **** }
168:main.c **** //******************************************************************************
169:main.c **** int main(void)
170:main.c **** {
126 .LM5:
127 /* prologue: frame size=6 */
128 0036 C0E0 ldi r28,lo8(__stack - 6)
129 0038 D0E0 ldi r29,hi8(__stack - 6)
130 003a DEBF out __SP_H__,r29
131 003c CDBF out __SP_L__,r28
132 /* prologue end (size=4) */
171:main.c **** ulong t1=0;
134 .LM6:
135 003e 1982 std Y+1,__zero_reg__
136 0040 1A82 std Y+2,__zero_reg__
137 0042 1B82 std Y+3,__zero_reg__
138 0044 1C82 std Y+4,__zero_reg__
172:main.c **** cli();
140 .LM7:
141 /* #APP */
142 0046 F894 cli
173:main.c **** //SP=0x45f; //WinAVR已经初始化堆栈
174:main.c **** DDRC=0xc3;
144 .LM8:
145 /* #NOAPP */
146 0048 83EC ldi r24,lo8(-61)
147 004a 8093 3400 sts 52,r24
175:main.c **** PORTD=1<<PD0|1<<PD1;
149 .LM9:
150 004e 83E0 ldi r24,lo8(3)
151 0050 8093 3200 sts 50,r24
176:main.c **** DDRD=0xfe;
153 .LM10:
154 0054 8EEF ldi r24,lo8(-2)
155 0056 8093 3100 sts 49,r24
177:main.c **** UCSRA=1<<U2X;
157 .LM11:
158 005a 82E0 ldi r24,lo8(2)
159 005c 8093 2B00 sts 43,r24
178:main.c **** UCSRB=1<<RXCIE|1<<RXEN|1<<TXEN;
161 .LM12:
162 0060 88E9 ldi r24,lo8(-104)
163 0062 8093 2A00 sts 42,r24
179:main.c **** UBRRL=105; //f0/9615/8+1,9615
165 .LM13:
166 0066 89E6 ldi r24,lo8(105)
167 0068 8093 2900 sts 41,r24
180:main.c **** delay_ms(10);
169 .LM14:
170 006c 8AE0 ldi r24,lo8(10)
171 006e 90E0 ldi r25,hi8(10)
172 0070 0E94 0000 call delay_ms
181:main.c **** Clr_Bit(PORTD,Rst); //硬盘复位
174 .LM15:
175 0074 8091 3200 lds r24,50
176 0078 8F7E andi r24,lo8(-17)
177 007a 8093 3200 sts 50,r24
182:main.c **** delay_ms(40);
179 .LM16:
180 007e 88E2 ldi r24,lo8(40)
181 0080 90E0 ldi r25,hi8(40)
182 0082 0E94 0000 call delay_ms
183:main.c **** Set_Bit(PORTD,Rst);
184 .LM17:
185 0086 8091 3200 lds r24,50
186 008a 8061 ori r24,lo8(16)
187 008c 8093 3200 sts 50,r24
184:main.c **** delay_ms(10);
189 .LM18:
190 0090 8AE0 ldi r24,lo8(10)
191 0092 90E0 ldi r25,hi8(10)
192 0094 0E94 0000 call delay_ms
185:main.c **** HDinit();
194 .LM19:
195 0098 0E94 0000 call HDinit
186:main.c **** //Read_HD_ID();
187:main.c **** sei();
197 .LM20:
198 /* #APP */
199 009c 7894 sei
200 /* #NOAPP */
201 .L3:
188:main.c **** while(1)
189:main.c **** {
190:main.c **** switch(uartdata)
203 .LM21:
204 009e 8091 0000 lds r24,uartdata
205 00a2 282F mov r18,r24
206 00a4 3327 clr r19
207 00a6 2D83 std Y+5,r18
208 00a8 3E83 std Y+6,r19
209 00aa 8D81 ldd r24,Y+5
210 00ac 9E81 ldd r25,Y+6
211 00ae 8430 cpi r24,4
212 00b0 9105 cpc r25,__zero_reg__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -