📄 mp3.lst
字号:
025F 6042 ORI R20,2
(0146) if (PORT_ATA_DATA1_IN & 0x08) wordin |= 0x4000;
0260 9BCB SBIS 0x19,3
0261 C001 RJMP 0x0263
0262 6450 ORI R21,0x40
(0147) if (PORT_ATA_DATA1_IN & 0x10) wordin |= 0x0004;
0263 9BCC SBIS 0x19,4
0264 C001 RJMP 0x0266
0265 6044 ORI R20,4
(0148) if (PORT_ATA_DATA1_IN & 0x20) wordin |= 0x2000;
0266 9BCD SBIS 0x19,5
0267 C001 RJMP 0x0269
0268 6250 ORI R21,0x20
(0149) if (PORT_ATA_DATA1_IN & 0x40) wordin |= 0x0008;
0269 9BCE SBIS 0x19,6
026A C001 RJMP 0x026C
026B 6048 ORI R20,0x8
(0150) if (PORT_ATA_DATA1_IN & 0x80) wordin |= 0x1000;
026C 9BCF SBIS 0x19,7
026D C001 RJMP 0x026F
026E 6150 ORI R21,0x10
(0151)
(0152) if (PORT_ATA_DATA2_IN & 0x01) wordin |= 0x0100;
026F 9B98 SBIS 0x13,0
0270 C001 RJMP 0x0272
0271 6051 ORI R21,1
(0153) if (PORT_ATA_DATA2_IN & 0x02) wordin |= 0x0080;
0272 9B99 SBIS 0x13,1
0273 C001 RJMP 0x0275
0274 6840 ORI R20,0x80
(0154) if (PORT_ATA_DATA2_IN & 0x04) wordin |= 0x0200;
0275 9B9A SBIS 0x13,2
0276 C001 RJMP 0x0278
0277 6052 ORI R21,2
(0155) if (PORT_ATA_DATA2_IN & 0x08) wordin |= 0x0040;
0278 9B9B SBIS 0x13,3
0279 C001 RJMP 0x027B
027A 6440 ORI R20,0x40
(0156) if (PORT_ATA_DATA2_IN & 0x10) wordin |= 0x0400;
027B 9B9C SBIS 0x13,4
027C C001 RJMP 0x027E
027D 6054 ORI R21,4
(0157) if (PORT_ATA_DATA2_IN & 0x20) wordin |= 0x0020;
027E 9B9D SBIS 0x13,5
027F C001 RJMP 0x0281
0280 6240 ORI R20,0x20
(0158) if (PORT_ATA_DATA2_IN & 0x40) wordin |= 0x0800;
0281 9B9E SBIS 0x13,6
0282 C001 RJMP 0x0284
0283 6058 ORI R21,0x8
(0159) if (PORT_ATA_DATA2_IN & 0x80) wordin |= 0x0010;
0284 9B9F SBIS 0x13,7
0285 C001 RJMP 0x0287
0286 6140 ORI R20,0x10
(0160)
(0161) PORT_ATA_IO_CNTL |= ATA_IOR;
0287 91800062 LDS R24,0x62
0289 6480 ORI R24,0x40
028A 93800062 STS 0x62,R24
(0162) return wordin;
028C 018A MOVW R16,R20
028D 940E15C5 CALL pop_gset2
028F 9508 RET
_ata_read_byte:
reg --> R20
0290 940E15D9 CALL push_gset1
0292 2F40 MOV R20,R16
(0163) }
(0164)
(0165) //******************************************************************
(0166) //* READ BYTE FROM ATA DEVICE
(0167) //*
(0168) //*
(0169) //*
(0170) //******************************************************************
(0171) unsigned char ata_read_byte(unsigned char reg)
(0172) {
(0173) return (unsigned char)(ata_read_word(reg) & 0x00ff);
0293 2F04 MOV R16,R20
0294 DFAE RCALL _ata_read_word
0295 7010 ANDI R17,0
0296 940E15DC CALL pop_gset1
0298 9508 RET
(0174) }
(0175)
(0176) //******************************************************************
(0177) //* CHECK ATA READY BIT
(0178) //* Checks READY status bit.
(0179) //* Returns 1 if device is ready.
(0180) //******************************************************************
(0181) unsigned char ata_rdy(void)
(0182) {
(0183) if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_RDY) return 1;
_ata_rdy:
0299 EF0D LDI R16,0xFD
029A DFF5 RCALL _ata_read_byte
029B FF06 SBRS R16,6
029C C002 RJMP 0x029F
029D E001 LDI R16,1
029E C001 RJMP 0x02A0
(0184) else return 0;
029F 2700 CLR R16
02A0 9508 RET
(0185) }
(0186)
(0187) //******************************************************************
(0188) //* CHECK ATA BUSY BIT
(0189) //* Checks READY status bit.
(0190) //* Returns 1 if device is busy.
(0191) //******************************************************************
(0192) unsigned char ata_bsy(void)
(0193) {
(0194) if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_BSY) return 1;
_ata_bsy:
02A1 EF0D LDI R16,0xFD
02A2 DFED RCALL _ata_read_byte
02A3 FF07 SBRS R16,7
02A4 C002 RJMP 0x02A7
02A5 E001 LDI R16,1
02A6 C001 RJMP 0x02A8
(0195) else return 0;
02A7 2700 CLR R16
02A8 9508 RET
(0196) }
(0197)
(0198) //******************************************************************
(0199) //* CHECK ATA DRQ BIT
(0200) //* Checks READY status bit.
(0201) //* Returns 1 if device is requesting service.
(0202) //******************************************************************
(0203) unsigned char ata_drq(void)
(0204) {
(0205) if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_DRQ) return 1;
_ata_drq:
02A9 EF0D LDI R16,0xFD
02AA DFE5 RCALL _ata_read_byte
02AB FF03 SBRS R16,3
02AC C002 RJMP 0x02AF
02AD E001 LDI R16,1
02AE C001 RJMP 0x02B0
(0206) else return 0;
02AF 2700 CLR R16
02B0 9508 RET
(0207) }
(0208)
(0209) //******************************************************************
(0210) //* CHECK ATA ERROR BIT
(0211) //* Checks READY status bit.
(0212) //* Returns 1 if device is reporting an error condition.
(0213) //******************************************************************
(0214) unsigned char ata_err(void)
(0215) {
(0216) if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_ERR) return 1;
_ata_err:
02B1 EF0D LDI R16,0xFD
02B2 DFDD RCALL _ata_read_byte
02B3 FF00 SBRS R16,0
02B4 C002 RJMP 0x02B7
02B5 E001 LDI R16,1
02B6 C001 RJMP 0x02B8
(0217) else return 0;
02B7 2700 CLR R16
02B8 9508 RET
_ata_read_sector_byte:
word --> R10
i --> R12
j --> R14
ptr --> Y+18
qte --> Y+16
from --> Y+14
lbasector --> Y+10
device --> R10
02B9 933A ST R19,-Y
02BA 932A ST R18,-Y
02BB 940E15D1 CALL push_gset5
02BD 2EA0 MOV R10,R16
(0218) }
(0219)
(0220) //******************************************************************
(0221) //* READ A PART of SECTOR
(0222) //* device = 0x00 or 0x01
(0223) //*
(0224) //******************************************************************
(0225) void ata_read_sector_byte(unsigned char device, unsigned long lbasector,
(0226) unsigned int from, unsigned int qte,
(0227) unsigned char *ptr)
(0228) {
(0229) unsigned int i,j,word;
(0230)
(0231) lbasector &= 0x0FFFFFFF;
02BE EF4F LDI R20,0xFF
02BF EF5F LDI R21,0xFF
02C0 EF6F LDI R22,0xFF
02C1 E07F LDI R23,0xF
02C2 01FE MOVW R30,R28
02C3 8422 LDD R2,Z+10
02C4 8433 LDD R3,Z+11
02C5 8444 LDD R4,Z+12
02C6 8455 LDD R5,Z+13
02C7 2224 AND R2,R20
02C8 2235 AND R3,R21
02C9 2246 AND R4,R22
02CA 2257 AND R5,R23
02CB 01FE MOVW R30,R28
02CC 8622 STD Z+10,R2
02CD 8633 STD Z+11,R3
02CE 8644 STD Z+12,R4
02CF 8655 STD Z+13,R5
(0232)
(0233) switch (device)
02D0 24BB CLR R11
02D1 20AA TST R10
02D2 F411 BNE 0x02D5
02D3 20BB TST R11
02D4 F031 BEQ 0x02DB
02D5 01C5 MOVW R24,R10
02D6 3081 CPI R24,1
02D7 E0E0 LDI R30,0
02D8 079E CPC R25,R30
02D9 F0D9 BEQ 0x02F5
02DA C034 RJMP 0x030F
(0234) {
(0235) case 0x00:
(0236) ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
02DB E188 LDI R24,0x18
02DC E090 LDI R25,0
02DD 01FE MOVW R30,R28
02DE 8422 LDD R2,Z+10
02DF 8433 LDD R3,Z+11
02E0 8444 LDD R4,Z+12
02E1 8455 LDD R5,Z+13
02E2 938A ST R24,-Y
02E3 0181 MOVW R16,R2
02E4 0192 MOVW R18,R4
02E5 940E1655 CALL lsr32
02E7 0118 MOVW R2,R16
02E8 0129 MOVW R4,R18
02E9 EE40 LDI R20,0xE0
02EA E050 LDI R21,0
02EB E060 LDI R22,0
02EC E070 LDI R23,0
02ED 2A24 OR R2,R20
02EE 2A35 OR R3,R21
02EF 2A46 OR R4,R22
02F0 2A57 OR R5,R23
02F1 2D22 MOV R18,R2
02F2 EF05 LDI R16,0xF5
02F3 DF44 RCALL _ata_write_byte
(0237) break;
02F4 C033 RJMP 0x0328
(0238) case 0x01:
(0239) ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xF0);
02F5 E188 LDI R24,0x18
02F6 E090 LDI R25,0
02F7 01FE MOVW R30,R28
02F8 8422 LDD R2,Z+10
02F9 8433 LDD R3,Z+11
02FA 8444 LDD R4,Z+12
02FB 8455 LDD R5,Z+13
02FC 938A ST R24,-Y
02FD 0181 MOVW R16,R2
02FE 0192 MOVW R18,R4
02FF 940E1655 CALL lsr32
0301 0118 MOVW R2,R16
0302 0129 MOVW R4,R18
0303 EF40 LDI R20,0xF0
0304 E050 LDI R21,0
0305 E060 LDI R22,0
0306 E070 LDI R23,0
0307 2A24 OR R2,R20
0308 2A35 OR R3,R21
0309 2A46 OR R4,R22
030A 2A57 OR R5,R23
030B 2D22 MOV R18,R2
030C EF05 LDI R16,0xF5
030D DF2A RCALL _ata_write_byte
(0240) break;
030E C019 RJMP 0x0328
(0241) default:
(0242) ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
030F E188 LDI R24,0x18
0310 E090 LDI R25,0
0311 01FE MOVW R30,R28
0312 8422 LDD R2,Z+10
0313 8433 LDD R3,Z+11
0314 8444 LDD R4,Z+12
0315 8455 LDD R5,Z+13
0316 938A ST R24,-Y
0317 0181 MOVW R16,R2
0318 0192 MOVW R18,R4
0319 940E1655 CALL lsr32
031B 0118 MOVW R2,R16
031C 0129 MOVW R4,R18
031D EE40 LDI R20,0xE0
031E E050 LDI R21,0
031F E060 LDI R22,0
0320 E070 LDI R23,0
0321 2A24 OR R2,R20
0322 2A35 OR R3,R21
0323 2A46 OR R4,R22
0324 2A57 OR R5,R23
0325 2D22 MOV R18,R2
0326 EF05 LDI R16,0xF5
0327 DF10 RCALL _ata_write_byte
(0243) break;
(0244) }
(0245) while(busy);
0328 DF78 RCALL _ata_bsy
0329 2300 TST R16
032A F7E9 BNE 0x0328
(0246) ata_write_byte(ATA_IO_CYL_H,lbasector >> 16);
032B 01FE MOVW R30,R28
032C 8422 LDD R2,Z+10
032D 8433 LDD R3,Z+11
032E 8444 LDD R4,Z+12
032F 8455 LDD R5,Z+13
0330 0112 MOVW R2,R4
0331 2444 CLR R4
0332 2455 CLR R5
0333 2D22 MOV R18,R2
0334 ED0D LDI R16,0xDD
0335 DF02 RCALL _ata_write_byte
(0247) while(busy);
0336 DF6A RCALL _ata_bsy
0337 2300 TST R16
0338 F7E9 BNE 0x0336
(0248) ata_write_byte(ATA_IO_CYL_L,lbasector >> 8);
0339 E088 LDI R24,0x8
033A E090 LDI R25,0
033B 01FE MOVW R30,R28
033C 8422 LDD R2,Z+10
033D 8433 LDD R3,Z+11
033E 8444 LDD R4,Z+12
033F 8455 LDD R5,Z+13
0340 938A ST R24,-Y
0341 0181 MOVW R16,R2
0342 0192 MOVW R18,R4
0343 940E1655 CALL lsr32
0345 2F20 MOV R18,R16
0346 ED05 LDI R16,0xD5
0347 DEF0 RCALL _ata_write_byte
(0249) while(busy);
0348 DF58 RCALL _ata_bsy
0349 2300 TST R16
034A F7E9 BNE 0x0348
(0250) ata_write_byte(ATA_IO_SECTORNUM,lbasector);
034B 01FE MOVW R30,R28
034C 8422 LDD R2,Z+10
034D 8433 LDD R3,Z+11
034E 8444 LDD R4,Z+12
034F 8455 LDD R5,Z+13
0350 2D22 MOV R18,R2
0351 EE0D LDI R16,0xED
0352 DEE5 RCALL _ata_write_byte
(0251) while(busy);
0353 DF4D RCALL _ata_bsy
0354 2300 TST R16
0355 F7E9 BNE 0x0353
(0252) ata_write_byte(ATA_IO_SECTORCNT,0x01);
0356 E021 LDI R18,1
0357 EE05 LDI R16,0xE5
0358 DEDF RCALL _ata_write_byte
(0253) while(busy);
0359 DF47 RCALL _ata_bsy
035A 2300 TST R16
035B F7E9 BNE 0x0359
(0254) ata_write_byte(ATA_IO_CMD,CMD_READ_SECTORS);
035C E220 LDI R18,0x20
035D EF0D LDI R16,0xFD
035E DED9 RCALL _ata_write_byte
(0255) while(busy);
035F DF41 RCALL _ata_bsy
0360 2300 TST R16
0361 F7E9 BNE 0x035F
(0256) while(!drq);
0362 DF46 RCALL _ata_drq
0363 2300 TST R16
0364 F3E9 BEQ 0x0362
(0257)
(0258) j = 0;
0365 24EE CLR R14
0366 24FF CLR R15
(0259) for (i=0;i<256;i++)
0367 24CC CLR R12
0368 24DD CLR R13
0369 C036 RJMP 0x03A0
(0260) {
(0261) word = ata_read_word(ATA_IO_DATA);
036A EC05 LDI R16,0xC5
036B DED7 RCALL _ata_read_word
036C 0158 MOVW R10,R16
(0262) if ((j >= from) && (j < (from + qte))) *ptr++ = (unsigned char)(word);
036D 840E LDD R0,Y+14
036E 841F LDD R1,Y+15
036F 14E0 CP R14,R0
0370 04F1 CPC R15,R1
0371 F068 BCS 0x037F
0372 0110 MOVW R2,R0
0373 8808 LDD R0,Y+16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -