📄 ata.s
字号:
_ata_drq::
.dbline -1
.dbline 204
; }
;
; //******************************************************************
; //* CHECK ATA DRQ BIT
; //* Checks READY status bit.
; //* Returns 1 if device is requesting service.
; //******************************************************************
; unsigned char ata_drq(void)
; {
.dbline 205
; if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_DRQ) return 1;
ldi R16,253
xcall _ata_read_byte
sbrs R16,3
rjmp L103
.dbline 205
ldi R16,1
xjmp L102
L103:
.dbline 206
; else return 0;
clr R16
.dbline -2
L102:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ata_err _ata_err fc
.even
_ata_err::
.dbline -1
.dbline 215
; }
;
; //******************************************************************
; //* CHECK ATA ERROR BIT
; //* Checks READY status bit.
; //* Returns 1 if device is reporting an error condition.
; //******************************************************************
; unsigned char ata_err(void)
; {
.dbline 216
; if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_ERR) return 1;
ldi R16,253
xcall _ata_read_byte
sbrs R16,0
rjmp L106
.dbline 216
ldi R16,1
xjmp L105
L106:
.dbline 217
; else return 0;
clr R16
.dbline -2
L105:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ata_read_sector_byte _ata_read_sector_byte fV
; word -> R14,R15
; i -> R10,R11
; j -> R12,R13
; ptr -> y+18
; qte -> y+16
; from -> y+14
; lbasector -> y+10
; device -> R10
.even
_ata_read_sector_byte::
st -y,r19
st -y,r18
xcall push_gset5
mov R10,R16
.dbline -1
.dbline 228
; }
;
; //******************************************************************
; //* READ A PART of SECTOR
; //* device = 0x00 or 0x01
; //*
; //******************************************************************
; void ata_read_sector_byte(unsigned char device, unsigned long lbasector,
; unsigned int from, unsigned int qte,
; unsigned char *ptr)
; {
.dbline 231
; unsigned int i,j,word;
;
; lbasector &= 0x0FFFFFFF;
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
and R2,R20
and R3,R21
and R4,R22
and R5,R23
std z+10,R2
std z+11,R3
std z+12,R4
std z+13,R5
.dbline 233
;
; switch (device)
clr R11
tst R10
brne X4
tst R11
breq L112
X4:
movw R24,R10
cpi R24,1
ldi R30,0
cpc R25,R30
breq L113
xjmp L109
X5:
.dbline 234
; {
L112:
.dbline 236
; case 0x00:
; ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
ldi R24,24
ldi R25,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R2,R16
movw R4,R18
ldi R20,224
ldi R21,0
ldi R22,0
ldi R23,0
or R2,R20
or R3,R21
or R4,R22
or R5,R23
mov R18,R2
ldi R16,245
xcall _ata_write_byte
.dbline 237
; break;
xjmp L115
L113:
.dbline 239
; case 0x01:
; ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xF0);
ldi R24,24
ldi R25,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R2,R16
movw R4,R18
ldi R20,240
ldi R21,0
ldi R22,0
ldi R23,0
or R2,R20
or R3,R21
or R4,R22
or R5,R23
mov R18,R2
ldi R16,245
xcall _ata_write_byte
.dbline 240
; break;
xjmp L115
L109:
.dbline 242
; default:
; ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
ldi R24,24
ldi R25,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R2,R16
movw R4,R18
ldi R20,224
ldi R21,0
ldi R22,0
ldi R23,0
or R2,R20
or R3,R21
or R4,R22
or R5,R23
mov R18,R2
ldi R16,245
xcall _ata_write_byte
.dbline 243
; break;
L114:
.dbline 245
L115:
.dbline 245
; }
; while(busy);
xcall _ata_bsy
tst R16
brne L114
.dbline 246
; ata_write_byte(ATA_IO_CYL_H,lbasector >> 16);
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
movw R2,R4
clr R4
clr R5
mov R18,R2
ldi R16,221
xcall _ata_write_byte
L117:
.dbline 247
L118:
.dbline 247
; while(busy);
xcall _ata_bsy
tst R16
brne L117
.dbline 248
; ata_write_byte(ATA_IO_CYL_L,lbasector >> 8);
ldi R24,8
ldi R25,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
mov R18,R16
ldi R16,213
xcall _ata_write_byte
L120:
.dbline 249
L121:
.dbline 249
; while(busy);
xcall _ata_bsy
tst R16
brne L120
.dbline 250
; ata_write_byte(ATA_IO_SECTORNUM,lbasector);
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
mov R18,R2
ldi R16,237
xcall _ata_write_byte
L123:
.dbline 251
L124:
.dbline 251
; while(busy);
xcall _ata_bsy
tst R16
brne L123
.dbline 252
; ata_write_byte(ATA_IO_SECTORCNT,0x01);
ldi R18,1
ldi R16,229
xcall _ata_write_byte
L126:
.dbline 253
L127:
.dbline 253
; while(busy);
xcall _ata_bsy
tst R16
brne L126
.dbline 254
; ata_write_byte(ATA_IO_CMD,CMD_READ_SECTORS);
ldi R18,32
ldi R16,253
xcall _ata_write_byte
L129:
.dbline 255
L130:
.dbline 255
; while(busy);
xcall _ata_bsy
tst R16
brne L129
L132:
.dbline 256
L133:
.dbline 256
; while(!drq);
xcall _ata_drq
tst R16
breq L132
.dbline 258
;
; j = 0;
clr R12
clr R13
.dbline 259
; for (i=0;i<256;i++)
clr R10
clr R11
xjmp L138
L135:
.dbline 260
; {
.dbline 261
; word = ata_read_word(ATA_IO_DATA);
ldi R16,197
xcall _ata_read_word
movw R14,R16
.dbline 262
; if ((j >= from) && (j < (from + qte))) *ptr++ = (unsigned char)(word);
ldd R0,y+14
ldd R1,y+15
cp R12,R0
cpc R13,R1
brlo L139
movw R2,R0
ldd R0,y+16
ldd R1,y+17
add R2,R0
adc R3,R1
cp R12,R2
cpc R13,R3
brsh L139
.dbline 262
ldd R30,y+18
ldd R31,y+19
st Z+,R14
std y+19,R31
std y+18,R30
L139:
.dbline 263
; j++;
movw R24,R12
adiw R24,1
movw R12,R24
.dbline 264
; if ((j >= from) && (j < (from + qte))) *ptr++ = (unsigned char)(word >> 8);
ldd R0,y+14
ldd R1,y+15
cp R24,R0
cpc R25,R1
brlo L141
movw R2,R0
ldd R0,y+16
ldd R1,y+17
add R2,R0
adc R3,R1
cp R24,R2
cpc R25,R3
brsh L141
.dbline 264
movw R2,R14
mov R2,R3
clr R3
ldd R30,y+18
ldd R31,y+19
st Z+,R2
std y+19,R31
std y+18,R30
L141:
.dbline 265
; j++;
movw R24,R12
adiw R24,1
movw R12,R24
L143:
.dbline 266
L144:
.dbline 266
xcall _ata_bsy
tst R16
brne L143
.dbline 267
L136:
.dbline 259
movw R24,R10
adiw R24,1
movw R10,R24
L138:
.dbline 259
movw R24,R10
cpi R24,0
ldi R30,1
cpc R25,R30
brsh X6
xjmp L135
X6:
.dbline -2
.dbline 268
; while(busy);
; }
; }
L108:
xcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r word 14 i
.dbsym r i 10 i
.dbsym r j 12 i
.dbsym l ptr 18 pc
.dbsym l qte 16 i
.dbsym l from 14 i
.dbsym l lbasector 10 l
.dbsym r device 10 c
.dbend
.dbfunc e ata_write_sector _ata_write_sector fV
; i -> R12,R13
; ptr -> R10,R11
; lbasector -> y+8
; device -> R12
.even
_ata_write_sector::
st -y,r19
st -y,r18
xcall push_gset4
mov R12,R16
ldd R10,y+12
ldd R11,y+13
.dbline -1
.dbline 276
;
; //******************************************************************
; //* WRITE A SECTOR
; //* device = 0x00 or 0x01
; //*
; //******************************************************************
; void ata_write_sector(unsigned char device, unsigned long lbasector, unsigned char *ptr)
; {
.dbline 279
; unsigned int i;
;
; lbasector &= 0x0FFFFFFF;
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
and R2,R20
and R3,R21
and R4,R22
and R5,R23
std z+8,R2
std z+9,R3
std z+10,R4
std z+11,R5
.dbline 281
;
; switch (device)
clr R13
tst R12
brne X7
tst R13
breq L150
X7:
movw R24,R12
cpi R24,1
ldi R30,0
cpc R25,R30
breq L151
xjmp L147
X8:
.dbline 282
; {
L150:
.dbline 284
; case 0x00:
; ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
ldi R24,24
ldi R25,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R2,R16
movw R4,R18
ldi R20,224
ldi R21,0
ldi R22,0
ldi R23,0
or R2,R20
or R3,R21
or R4,R22
or R5,R23
mov R18,R2
ldi R16,245
xcall _ata_write_byte
.dbline 285
; break;
xjmp L153
L151:
.dbline 287
; case 0x01:
; ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xF0);
ldi R24,24
ldi R25,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R2,R16
movw R4,R18
ldi R20,240
ldi R21,0
ldi R22,0
ldi R23,0
or R2,R20
or R3,R21
or R4,R22
or R5,R23
mov R18,R2
ldi R16,245
xcall _ata_write_byte
.dbline 288
; break;
xjmp L153
L147:
.dbline 290
; default:
; ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
ldi R24,24
ldi R25,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R2,R16
movw R4,R18
ldi R20,224
ldi R21,0
ldi R22,0
ldi R23,0
or R2,R20
or R3,R21
or R4,R22
or R5,R23
mov R18,R2
ldi R16,245
xcall _ata_write_byte
.dbline 291
; break;
L152:
.dbline 293
L153:
.dbline 293
; }
; while(busy);
xcall _ata_bsy
tst R16
brne L152
.dbline 294
; ata_write_byte(ATA_IO_CYL_H,lbasector >> 16);
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
movw R2,R4
clr R4
clr R5
mov R18,R2
ldi R16,221
xcall _ata_write_byte
L155:
.dbline 295
L156:
.dbline 295
; while(busy);
xcall _ata_bsy
tst R16
brne L155
.dbline 296
; ata_write_byte(ATA_IO_CYL_L,lbasector >> 8);
ldi R24,8
ldi R25,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
mov R18,R16
ldi R16,213
xcall _ata_write_byte
L158:
.dbline 297
L159:
.dbline 297
; while(busy);
xcall _ata_bsy
tst R16
brne L158
.dbline 298
; ata_write_byte(ATA_IO_SECTORNUM,lbasector);
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
mov R18,R2
ldi R16,237
xcall _ata_write_byte
L161:
.dbline 299
L162:
.dbline 299
; while(busy);
xcall _ata_bsy
tst R16
brne L161
.dbline 300
; ata_write_byte(ATA_IO_SECTORCNT,0x01);
ldi R18,1
ldi R16,229
xcall _ata_write_byte
L164:
.dbline 301
L165:
.dbline 301
; while(busy);
xcall _ata_bsy
tst R16
brne L164
.dbline 302
; ata_write_byte(ATA_IO_CMD,CMD_WRITE_SECTORS);
ldi R18,48
ldi R16,253
xcall _ata_write_byte
L167:
.dbline 303
L168:
.dbline 303
; while(busy);
xcall _ata_bsy
tst R16
brne L167
L170:
.dbline 304
L171:
.dbline 304
; while(!drq);
xcall _ata_drq
tst R16
breq L170
.dbline 306
;
; for (i=0;i<256;i++)
clr R12
clr R13
xjmp L176
L173:
.dbline 307
; {
.dbline 308
; ata_write_word(ATA_IO_DATA,(unsigned int)(*(ptr+1)<<8)+*ptr);
movw R30,R10
ldd R2,z+0
clr R3
ldd R18,z+1
clr R19
mov R19,R18
clr R18
add R18,R2
adc R19,R3
ldi R16,197
xcall _ata_write_word
.dbline 309
; ptr += 2;
movw R24,R10
adiw R24,2
movw R10,R24
L177:
.dbline 310
L178:
.dbline 310
xcall _ata_bsy
tst R16
brne L177
.dbline 311
L174:
.dbline 306
movw R24,R12
adiw R24,1
movw R12,R24
L176:
.dbline 306
movw R24,R12
cpi R24,0
ldi R30,1
cpc R25,R30
brlo L173
.dbline -2
.dbline 312
; while(busy);
; }
; }
L146:
xcall pop_gset4
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r i 12 i
.dbsym r ptr 10 pc
.dbsym l lbasector 8 l
.dbsym r device 12 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -