📄 ata.lis
字号:
0260 _ata_drq::
0260 .dbline -1
0260 .dbline 204
0260 ; }
0260 ;
0260 ; //******************************************************************
0260 ; //* CHECK ATA DRQ BIT
0260 ; //* Checks READY status bit.
0260 ; //* Returns 1 if device is requesting service.
0260 ; //******************************************************************
0260 ; unsigned char ata_drq(void)
0260 ; {
0260 .dbline 205
0260 ; if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_DRQ) return 1;
0260 0DEF ldi R16,253
0262 E5DF xcall _ata_read_byte
0264 03FF sbrs R16,3
0266 02C0 rjmp L103
0268 .dbline 205
0268 01E0 ldi R16,1
026A 01C0 xjmp L102
026C L103:
026C .dbline 206
026C ; else return 0;
026C 0027 clr R16
026E .dbline -2
026E L102:
026E .dbline 0 ; func end
026E 0895 ret
0270 .dbend
0270 .dbfunc e ata_err _ata_err fc
.even
0270 _ata_err::
0270 .dbline -1
0270 .dbline 215
0270 ; }
0270 ;
0270 ; //******************************************************************
0270 ; //* CHECK ATA ERROR BIT
0270 ; //* Checks READY status bit.
0270 ; //* Returns 1 if device is reporting an error condition.
0270 ; //******************************************************************
0270 ; unsigned char ata_err(void)
0270 ; {
0270 .dbline 216
0270 ; if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_ERR) return 1;
0270 0DEF ldi R16,253
0272 DDDF xcall _ata_read_byte
0274 00FF sbrs R16,0
0276 02C0 rjmp L106
0278 .dbline 216
0278 01E0 ldi R16,1
027A 01C0 xjmp L105
027C L106:
027C .dbline 217
027C ; else return 0;
027C 0027 clr R16
027E .dbline -2
027E L105:
027E .dbline 0 ; func end
027E 0895 ret
0280 .dbend
0280 .dbfunc e ata_read_sector_byte _ata_read_sector_byte fV
0280 ; word -> R10,R11
0280 ; i -> R12,R13
0280 ; j -> R14,R15
0280 ; ptr -> y+18
0280 ; qte -> y+16
0280 ; from -> y+14
0280 ; lbasector -> y+10
0280 ; device -> R10
.even
0280 _ata_read_sector_byte::
0280 3A93 st -y,r19
0282 2A93 st -y,r18
0284 0E940000 xcall push_gset5
0288 A02E mov R10,R16
028A .dbline -1
028A .dbline 228
028A ; }
028A ;
028A ; //******************************************************************
028A ; //* READ A PART of SECTOR
028A ; //* device = 0x00 or 0x01
028A ; //*
028A ; //******************************************************************
028A ; void ata_read_sector_byte(unsigned char device, unsigned long lbasector,
028A ; unsigned int from, unsigned int qte,
028A ; unsigned char *ptr)
028A ; {
028A .dbline 231
028A ; unsigned int i,j,word;
028A ;
028A ; lbasector &= 0x0FFFFFFF;
028A 4FEF ldi R20,255
028C 5FEF ldi R21,255
028E 6FEF ldi R22,255
0290 7FE0 ldi R23,15
0292 FE01 movw R30,R28
0294 2284 ldd R2,z+10
0296 3384 ldd R3,z+11
0298 4484 ldd R4,z+12
029A 5584 ldd R5,z+13
029C 2422 and R2,R20
029E 3522 and R3,R21
02A0 4622 and R4,R22
02A2 5722 and R5,R23
02A4 FE01 movw R30,R28
02A6 2286 std z+10,R2
02A8 3386 std z+11,R3
02AA 4486 std z+12,R4
02AC 5586 std z+13,R5
02AE .dbline 233
02AE ;
02AE ; switch (device)
02AE BB24 clr R11
02B0 AA20 tst R10
02B2 11F4 brne X4
02B4 BB20 tst R11
02B6 31F0 breq L112
02B8 X4:
02B8 C501 movw R24,R10
02BA 8130 cpi R24,1
02BC E0E0 ldi R30,0
02BE 9E07 cpc R25,R30
02C0 D9F0 breq L113
02C2 34C0 xjmp L109
02C4 X5:
02C4 .dbline 234
02C4 ; {
02C4 L112:
02C4 .dbline 236
02C4 ; case 0x00:
02C4 ; ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
02C4 88E1 ldi R24,24
02C6 90E0 ldi R25,0
02C8 FE01 movw R30,R28
02CA 2284 ldd R2,z+10
02CC 3384 ldd R3,z+11
02CE 4484 ldd R4,z+12
02D0 5584 ldd R5,z+13
02D2 8A93 st -y,R24
02D4 8101 movw R16,R2
02D6 9201 movw R18,R4
02D8 0E940000 xcall lsr32
02DC 1801 movw R2,R16
02DE 2901 movw R4,R18
02E0 40EE ldi R20,224
02E2 50E0 ldi R21,0
02E4 60E0 ldi R22,0
02E6 70E0 ldi R23,0
02E8 242A or R2,R20
02EA 352A or R3,R21
02EC 462A or R4,R22
02EE 572A or R5,R23
02F0 222D mov R18,R2
02F2 05EF ldi R16,245
02F4 44DF xcall _ata_write_byte
02F6 .dbline 237
02F6 ; break;
02F6 33C0 xjmp L115
02F8 L113:
02F8 .dbline 239
02F8 ; case 0x01:
02F8 ; ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xF0);
02F8 88E1 ldi R24,24
02FA 90E0 ldi R25,0
02FC FE01 movw R30,R28
02FE 2284 ldd R2,z+10
0300 3384 ldd R3,z+11
0302 4484 ldd R4,z+12
0304 5584 ldd R5,z+13
0306 8A93 st -y,R24
0308 8101 movw R16,R2
030A 9201 movw R18,R4
030C 0E940000 xcall lsr32
0310 1801 movw R2,R16
0312 2901 movw R4,R18
0314 40EF ldi R20,240
0316 50E0 ldi R21,0
0318 60E0 ldi R22,0
031A 70E0 ldi R23,0
031C 242A or R2,R20
031E 352A or R3,R21
0320 462A or R4,R22
0322 572A or R5,R23
0324 222D mov R18,R2
0326 05EF ldi R16,245
0328 2ADF xcall _ata_write_byte
032A .dbline 240
032A ; break;
032A 19C0 xjmp L115
032C L109:
032C .dbline 242
032C ; default:
032C ; ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
032C 88E1 ldi R24,24
032E 90E0 ldi R25,0
0330 FE01 movw R30,R28
0332 2284 ldd R2,z+10
0334 3384 ldd R3,z+11
0336 4484 ldd R4,z+12
0338 5584 ldd R5,z+13
033A 8A93 st -y,R24
033C 8101 movw R16,R2
033E 9201 movw R18,R4
0340 0E940000 xcall lsr32
0344 1801 movw R2,R16
0346 2901 movw R4,R18
0348 40EE ldi R20,224
034A 50E0 ldi R21,0
034C 60E0 ldi R22,0
034E 70E0 ldi R23,0
0350 242A or R2,R20
0352 352A or R3,R21
0354 462A or R4,R22
0356 572A or R5,R23
0358 222D mov R18,R2
035A 05EF ldi R16,245
035C 10DF xcall _ata_write_byte
035E .dbline 243
035E ; break;
035E L114:
035E .dbline 245
035E L115:
035E .dbline 245
035E ; }
035E ; while(busy);
035E 78DF xcall _ata_bsy
0360 0023 tst R16
0362 E9F7 brne L114
0364 .dbline 246
0364 ; ata_write_byte(ATA_IO_CYL_H,lbasector >> 16);
0364 FE01 movw R30,R28
0366 2284 ldd R2,z+10
0368 3384 ldd R3,z+11
036A 4484 ldd R4,z+12
036C 5584 ldd R5,z+13
036E 1201 movw R2,R4
0370 4424 clr R4
0372 5524 clr R5
0374 222D mov R18,R2
0376 0DED ldi R16,221
0378 02DF xcall _ata_write_byte
037A L117:
037A .dbline 247
037A L118:
037A .dbline 247
037A ; while(busy);
037A 6ADF xcall _ata_bsy
037C 0023 tst R16
037E E9F7 brne L117
0380 .dbline 248
0380 ; ata_write_byte(ATA_IO_CYL_L,lbasector >> 8);
0380 88E0 ldi R24,8
0382 90E0 ldi R25,0
0384 FE01 movw R30,R28
0386 2284 ldd R2,z+10
0388 3384 ldd R3,z+11
038A 4484 ldd R4,z+12
038C 5584 ldd R5,z+13
038E 8A93 st -y,R24
0390 8101 movw R16,R2
0392 9201 movw R18,R4
0394 0E940000 xcall lsr32
0398 202F mov R18,R16
039A 05ED ldi R16,213
039C F0DE xcall _ata_write_byte
039E L120:
039E .dbline 249
039E L121:
039E .dbline 249
039E ; while(busy);
039E 58DF xcall _ata_bsy
03A0 0023 tst R16
03A2 E9F7 brne L120
03A4 .dbline 250
03A4 ; ata_write_byte(ATA_IO_SECTORNUM,lbasector);
03A4 FE01 movw R30,R28
03A6 2284 ldd R2,z+10
03A8 3384 ldd R3,z+11
03AA 4484 ldd R4,z+12
03AC 5584 ldd R5,z+13
03AE 222D mov R18,R2
03B0 0DEE ldi R16,237
03B2 E5DE xcall _ata_write_byte
03B4 L123:
03B4 .dbline 251
03B4 L124:
03B4 .dbline 251
03B4 ; while(busy);
03B4 4DDF xcall _ata_bsy
03B6 0023 tst R16
03B8 E9F7 brne L123
03BA .dbline 252
03BA ; ata_write_byte(ATA_IO_SECTORCNT,0x01);
03BA 21E0 ldi R18,1
03BC 05EE ldi R16,229
03BE DFDE xcall _ata_write_byte
03C0 L126:
03C0 .dbline 253
03C0 L127:
03C0 .dbline 253
03C0 ; while(busy);
03C0 47DF xcall _ata_bsy
03C2 0023 tst R16
03C4 E9F7 brne L126
03C6 .dbline 254
03C6 ; ata_write_byte(ATA_IO_CMD,CMD_READ_SECTORS);
03C6 20E2 ldi R18,32
03C8 0DEF ldi R16,253
03CA D9DE xcall _ata_write_byte
03CC L129:
03CC .dbline 255
03CC L130:
03CC .dbline 255
03CC ; while(busy);
03CC 41DF xcall _ata_bsy
03CE 0023 tst R16
03D0 E9F7 brne L129
03D2 L132:
03D2 .dbline 256
03D2 L133:
03D2 .dbline 256
03D2 ; while(!drq);
03D2 46DF xcall _ata_drq
03D4 0023 tst R16
03D6 E9F3 breq L132
03D8 .dbline 258
03D8 ;
03D8 ; j = 0;
03D8 EE24 clr R14
03DA FF24 clr R15
03DC .dbline 259
03DC ; for (i=0;i<256;i++)
03DC CC24 clr R12
03DE DD24 clr R13
03E0 36C0 xjmp L138
03E2 L135:
03E2 .dbline 260
03E2 ; {
03E2 .dbline 261
03E2 ; word = ata_read_word(ATA_IO_DATA);
03E2 05EC ldi R16,197
03E4 D7DE xcall _ata_read_word
03E6 5801 movw R10,R16
03E8 .dbline 262
03E8 ; if ((j >= from) && (j < (from + qte))) *ptr++ = (unsigned char)(word);
03E8 0E84 ldd R0,y+14
03EA 1F84 ldd R1,y+15
03EC E014 cp R14,R0
03EE F104 cpc R15,R1
03F0 68F0 brlo L139
03F2 1001 movw R2,R0
03F4 0888 ldd R0,y+16
03F6 1988 ldd R1,y+17
03F8 200C add R2,R0
03FA 311C adc R3,R1
03FC E214 cp R14,R2
03FE F304 cpc R15,R3
0400 28F4 brsh L139
0402 .dbline 262
0402 EA89 ldd R30,y+18
0404 FB89 ldd R31,y+19
0406 A192 st Z+,R10
0408 FB8B std y+19,R31
040A EA8B std y+18,R30
040C L139:
040C .dbline 263
040C ; j++;
040C C701 movw R24,R14
040E 0196 adiw R24,1
0410 7C01 movw R14,R24
0412 .dbline 264
0412 ; if ((j >= from) && (j < (from + qte))) *ptr++ = (unsigned char)(word >> 8);
0412 0E84 ldd R0,y+14
0414 1F84 ldd R1,y+15
0416 8015 cp R24,R0
0418 9105 cpc R25,R1
041A 80F0 brlo L141
041C 1001 movw R2,R0
041E 0888 ldd R0,y+16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -