📄 ata.lis
字号:
013A ; if (wordout & 0x0200) PORT_ATA_DATA2_OUT |= 0x04;
013A 51FD sbrc R21,1
013C .dbline 101
013C AA9A sbi 0x15,2
013E L47:
013E .dbline 102
013E ; if (wordout & 0x0400) PORT_ATA_DATA2_OUT |= 0x10;
013E 52FD sbrc R21,2
0140 .dbline 102
0140 AC9A sbi 0x15,4
0142 L49:
0142 .dbline 103
0142 ; if (wordout & 0x0800) PORT_ATA_DATA2_OUT |= 0x40;
0142 53FD sbrc R21,3
0144 .dbline 103
0144 AE9A sbi 0x15,6
0146 L51:
0146 .dbline 104
0146 ; if (wordout & 0x1000) PORT_ATA_DATA1_OUT |= 0x80;
0146 54FD sbrc R21,4
0148 .dbline 104
0148 DF9A sbi 0x1b,7
014A L53:
014A .dbline 105
014A ; if (wordout & 0x2000) PORT_ATA_DATA1_OUT |= 0x20;
014A 55FD sbrc R21,5
014C .dbline 105
014C DD9A sbi 0x1b,5
014E L55:
014E .dbline 106
014E ; if (wordout & 0x4000) PORT_ATA_DATA1_OUT |= 0x08;
014E 56FD sbrc R21,6
0150 .dbline 106
0150 DB9A sbi 0x1b,3
0152 L57:
0152 .dbline 107
0152 ; if (wordout & 0x8000) PORT_ATA_DATA1_OUT |= 0x02;
0152 57FD sbrc R21,7
0154 .dbline 107
0154 D99A sbi 0x1b,1
0156 L59:
0156 .dbline 109
0156 ;
0156 ; ata_write_pulse;
0156 80916200 lds R24,98
015A 8F77 andi R24,127
015C 80936200 sts 98,R24
0160 .dbline 109
0160 01E0 ldi R16,1
0162 10E0 ldi R17,0
0164 0E940000 xcall _delay_us
0168 .dbline 109
0168 80916200 lds R24,98
016C 8068 ori R24,128
016E 80936200 sts 98,R24
0172 .dbline 109
0172 .dbline 111
0172 ;
0172 ; ata_databus_in;
0172 2224 clr R2
0174 2ABA out 0x1a,R2
0176 .dbline 111
0176 24BA out 0x14,R2
0178 .dbline 111
0178 .dbline -2
0178 L28:
0178 0E940000 xcall pop_gset2
017C .dbline 0 ; func end
017C 0895 ret
017E .dbsym r wordout 20 i
017E .dbsym r reg 22 c
017E .dbend
017E .dbfunc e ata_write_byte _ata_write_byte fV
017E ; byteout -> R22
017E ; reg -> R20
.even
017E _ata_write_byte::
017E 0E940000 xcall push_gset2
0182 622F mov R22,R18
0184 402F mov R20,R16
0186 .dbline -1
0186 .dbline 120
0186 ; }
0186 ;
0186 ; //******************************************************************
0186 ; //* WRITE BYTE TO ATA DEVICE
0186 ; //*
0186 ; //*
0186 ; //******************************************************************
0186 ; void ata_write_byte(unsigned char reg,unsigned char byteout)
0186 ; {
0186 .dbline 121
0186 ; ata_write_word(reg,(unsigned int)byteout);
0186 262F mov R18,R22
0188 3327 clr R19
018A 042F mov R16,R20
018C B7DF xcall _ata_write_word
018E .dbline -2
018E L61:
018E 0E940000 xcall pop_gset2
0192 .dbline 0 ; func end
0192 0895 ret
0194 .dbsym r byteout 22 c
0194 .dbsym r reg 20 c
0194 .dbend
0194 .dbfunc e ata_read_word _ata_read_word fi
0194 ; wordin -> R20,R21
0194 ; reg -> R22
.even
0194 _ata_read_word::
0194 0E940000 xcall push_gset2
0198 602F mov R22,R16
019A .dbline -1
019A .dbline 132
019A ; }
019A ;
019A ; //******************************************************************
019A ; //* READ WORD FROM ATA DEVICE
019A ; //*
019A ; //*
019A ; //* Mapping : D0-PA0,D1-PA2,D2-PA4,D3-PA6,D4-PC7,D5-PC5,D7-PC3,D7-PC1
019A ; //* D8-PC0,D9-PC2,D10-PC4,D11-PC6,D12-PA7,D13-PA5,D14-PA3,D15-PA1
019A ; //******************************************************************
019A ; unsigned int ata_read_word(unsigned char reg)
019A ; {
019A .dbline 133
019A ; unsigned int wordin = 0;
019A 4427 clr R20
019C 5527 clr R21
019E .dbline 135
019E ;
019E ; WDR();
019E A895 wdr
01A0 .dbline 136
01A0 ; PORT_ATA_IO_CNTL = reg;
01A0 60936200 sts 98,R22
01A4 .dbline 138
01A4 ;
01A4 ; ata_databus_in;
01A4 2224 clr R2
01A6 2ABA out 0x1a,R2
01A8 .dbline 138
01A8 24BA out 0x14,R2
01AA .dbline 138
01AA .dbline 140
01AA ;
01AA ; PORT_ATA_IO_CNTL &= ~ATA_IOR;
01AA 80916200 lds R24,98
01AE 8F7B andi R24,191
01B0 80936200 sts 98,R24
01B4 .dbline 141
01B4 ; delay_us(1);
01B4 01E0 ldi R16,1
01B6 10E0 ldi R17,0
01B8 0E940000 xcall _delay_us
01BC .dbline 143
01BC ;
01BC ; if (PORT_ATA_DATA1_IN & 0x01) wordin |= 0x0001;
01BC C89B sbis 0x19,0
01BE 01C0 rjmp L63
01C0 .dbline 143
01C0 4160 ori R20,1
01C2 L63:
01C2 .dbline 144
01C2 ; if (PORT_ATA_DATA1_IN & 0x02) wordin |= 0x8000;
01C2 C99B sbis 0x19,1
01C4 01C0 rjmp L65
01C6 .dbline 144
01C6 5068 ori R21,128
01C8 L65:
01C8 .dbline 145
01C8 ; if (PORT_ATA_DATA1_IN & 0x04) wordin |= 0x0002;
01C8 CA9B sbis 0x19,2
01CA 01C0 rjmp L67
01CC .dbline 145
01CC 4260 ori R20,2
01CE L67:
01CE .dbline 146
01CE ; if (PORT_ATA_DATA1_IN & 0x08) wordin |= 0x4000;
01CE CB9B sbis 0x19,3
01D0 01C0 rjmp L69
01D2 .dbline 146
01D2 5064 ori R21,64
01D4 L69:
01D4 .dbline 147
01D4 ; if (PORT_ATA_DATA1_IN & 0x10) wordin |= 0x0004;
01D4 CC9B sbis 0x19,4
01D6 01C0 rjmp L71
01D8 .dbline 147
01D8 4460 ori R20,4
01DA L71:
01DA .dbline 148
01DA ; if (PORT_ATA_DATA1_IN & 0x20) wordin |= 0x2000;
01DA CD9B sbis 0x19,5
01DC 01C0 rjmp L73
01DE .dbline 148
01DE 5062 ori R21,32
01E0 L73:
01E0 .dbline 149
01E0 ; if (PORT_ATA_DATA1_IN & 0x40) wordin |= 0x0008;
01E0 CE9B sbis 0x19,6
01E2 01C0 rjmp L75
01E4 .dbline 149
01E4 4860 ori R20,8
01E6 L75:
01E6 .dbline 150
01E6 ; if (PORT_ATA_DATA1_IN & 0x80) wordin |= 0x1000;
01E6 CF9B sbis 0x19,7
01E8 01C0 rjmp L77
01EA .dbline 150
01EA 5061 ori R21,16
01EC L77:
01EC .dbline 152
01EC ;
01EC ; if (PORT_ATA_DATA2_IN & 0x01) wordin |= 0x0100;
01EC 989B sbis 0x13,0
01EE 01C0 rjmp L79
01F0 .dbline 152
01F0 5160 ori R21,1
01F2 L79:
01F2 .dbline 153
01F2 ; if (PORT_ATA_DATA2_IN & 0x02) wordin |= 0x0080;
01F2 999B sbis 0x13,1
01F4 01C0 rjmp L81
01F6 .dbline 153
01F6 4068 ori R20,128
01F8 L81:
01F8 .dbline 154
01F8 ; if (PORT_ATA_DATA2_IN & 0x04) wordin |= 0x0200;
01F8 9A9B sbis 0x13,2
01FA 01C0 rjmp L83
01FC .dbline 154
01FC 5260 ori R21,2
01FE L83:
01FE .dbline 155
01FE ; if (PORT_ATA_DATA2_IN & 0x08) wordin |= 0x0040;
01FE 9B9B sbis 0x13,3
0200 01C0 rjmp L85
0202 .dbline 155
0202 4064 ori R20,64
0204 L85:
0204 .dbline 156
0204 ; if (PORT_ATA_DATA2_IN & 0x10) wordin |= 0x0400;
0204 9C9B sbis 0x13,4
0206 01C0 rjmp L87
0208 .dbline 156
0208 5460 ori R21,4
020A L87:
020A .dbline 157
020A ; if (PORT_ATA_DATA2_IN & 0x20) wordin |= 0x0020;
020A 9D9B sbis 0x13,5
020C 01C0 rjmp L89
020E .dbline 157
020E 4062 ori R20,32
0210 L89:
0210 .dbline 158
0210 ; if (PORT_ATA_DATA2_IN & 0x40) wordin |= 0x0800;
0210 9E9B sbis 0x13,6
0212 01C0 rjmp L91
0214 .dbline 158
0214 5860 ori R21,8
0216 L91:
0216 .dbline 159
0216 ; if (PORT_ATA_DATA2_IN & 0x80) wordin |= 0x0010;
0216 9F9B sbis 0x13,7
0218 01C0 rjmp L93
021A .dbline 159
021A 4061 ori R20,16
021C L93:
021C .dbline 161
021C ;
021C ; PORT_ATA_IO_CNTL |= ATA_IOR;
021C 80916200 lds R24,98
0220 8064 ori R24,64
0222 80936200 sts 98,R24
0226 .dbline 162
0226 ; return wordin;
0226 8A01 movw R16,R20
0228 .dbline -2
0228 L62:
0228 0E940000 xcall pop_gset2
022C .dbline 0 ; func end
022C 0895 ret
022E .dbsym r wordin 20 i
022E .dbsym r reg 22 c
022E .dbend
022E .dbfunc e ata_read_byte _ata_read_byte fc
022E ; reg -> R20
.even
022E _ata_read_byte::
022E 0E940000 xcall push_gset1
0232 402F mov R20,R16
0234 .dbline -1
0234 .dbline 172
0234 ; }
0234 ;
0234 ; //******************************************************************
0234 ; //* READ BYTE FROM ATA DEVICE
0234 ; //*
0234 ; //*
0234 ; //*
0234 ; //******************************************************************
0234 ; unsigned char ata_read_byte(unsigned char reg)
0234 ; {
0234 .dbline 173
0234 ; return (unsigned char)(ata_read_word(reg) & 0x00ff);
0234 042F mov R16,R20
0236 AEDF xcall _ata_read_word
0238 1070 andi R17,0
023A .dbline -2
023A L95:
023A 0E940000 xcall pop_gset1
023E .dbline 0 ; func end
023E 0895 ret
0240 .dbsym r reg 20 c
0240 .dbend
0240 .dbfunc e ata_rdy _ata_rdy fc
.even
0240 _ata_rdy::
0240 .dbline -1
0240 .dbline 182
0240 ; }
0240 ;
0240 ; //******************************************************************
0240 ; //* CHECK ATA READY BIT
0240 ; //* Checks READY status bit.
0240 ; //* Returns 1 if device is ready.
0240 ; //******************************************************************
0240 ; unsigned char ata_rdy(void)
0240 ; {
0240 .dbline 183
0240 ; if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_RDY) return 1;
0240 0DEF ldi R16,253
0242 F5DF xcall _ata_read_byte
0244 06FF sbrs R16,6
0246 02C0 rjmp L97
0248 .dbline 183
0248 01E0 ldi R16,1
024A 01C0 xjmp L96
024C L97:
024C .dbline 184
024C ; else return 0;
024C 0027 clr R16
024E .dbline -2
024E L96:
024E .dbline 0 ; func end
024E 0895 ret
0250 .dbend
0250 .dbfunc e ata_bsy _ata_bsy fc
.even
0250 _ata_bsy::
0250 .dbline -1
0250 .dbline 193
0250 ; }
0250 ;
0250 ; //******************************************************************
0250 ; //* CHECK ATA BUSY BIT
0250 ; //* Checks READY status bit.
0250 ; //* Returns 1 if device is busy.
0250 ; //******************************************************************
0250 ; unsigned char ata_bsy(void)
0250 ; {
0250 .dbline 194
0250 ; if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_BSY) return 1;
0250 0DEF ldi R16,253
0252 EDDF xcall _ata_read_byte
0254 07FF sbrs R16,7
0256 02C0 rjmp L100
0258 .dbline 194
0258 01E0 ldi R16,1
025A 01C0 xjmp L99
025C L100:
025C .dbline 195
025C ; else return 0;
025C 0027 clr R16
025E .dbline -2
025E L99:
025E .dbline 0 ; func end
025E 0895 ret
0260 .dbend
0260 .dbfunc e ata_drq _ata_drq fc
.even
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -