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