📄 mp3.lst
字号:
0202 9BCB SBIS 0x19,3
0203 C001 RJMP 0x0205
0204 6450 ORI R21,0x40
(0147) if (PORT_ATA_DATA1_IN & 0x10) wordin |= 0x0004;
0205 9BCC SBIS 0x19,4
0206 C001 RJMP 0x0208
0207 6044 ORI R20,4
(0148) if (PORT_ATA_DATA1_IN & 0x20) wordin |= 0x2000;
0208 9BCD SBIS 0x19,5
0209 C001 RJMP 0x020B
020A 6250 ORI R21,0x20
(0149) if (PORT_ATA_DATA1_IN & 0x40) wordin |= 0x0008;
020B 9BCE SBIS 0x19,6
020C C001 RJMP 0x020E
020D 6048 ORI R20,0x8
(0150) if (PORT_ATA_DATA1_IN & 0x80) wordin |= 0x1000;
020E 9BCF SBIS 0x19,7
020F C001 RJMP 0x0211
0210 6150 ORI R21,0x10
(0151)
(0152) if (PORT_ATA_DATA2_IN & 0x01) wordin |= 0x0100;
0211 9B98 SBIS 0x13,0
0212 C001 RJMP 0x0214
0213 6051 ORI R21,1
(0153) if (PORT_ATA_DATA2_IN & 0x02) wordin |= 0x0080;
0214 9B99 SBIS 0x13,1
0215 C001 RJMP 0x0217
0216 6840 ORI R20,0x80
(0154) if (PORT_ATA_DATA2_IN & 0x04) wordin |= 0x0200;
0217 9B9A SBIS 0x13,2
0218 C001 RJMP 0x021A
0219 6052 ORI R21,2
(0155) if (PORT_ATA_DATA2_IN & 0x08) wordin |= 0x0040;
021A 9B9B SBIS 0x13,3
021B C001 RJMP 0x021D
021C 6440 ORI R20,0x40
(0156) if (PORT_ATA_DATA2_IN & 0x10) wordin |= 0x0400;
021D 9B9C SBIS 0x13,4
021E C001 RJMP 0x0220
021F 6054 ORI R21,4
(0157) if (PORT_ATA_DATA2_IN & 0x20) wordin |= 0x0020;
0220 9B9D SBIS 0x13,5
0221 C001 RJMP 0x0223
0222 6240 ORI R20,0x20
(0158) if (PORT_ATA_DATA2_IN & 0x40) wordin |= 0x0800;
0223 9B9E SBIS 0x13,6
0224 C001 RJMP 0x0226
0225 6058 ORI R21,0x8
(0159) if (PORT_ATA_DATA2_IN & 0x80) wordin |= 0x0010;
0226 9B9F SBIS 0x13,7
0227 C001 RJMP 0x0229
0228 6140 ORI R20,0x10
(0160)
(0161) PORT_ATA_IO_CNTL |= ATA_IOR;
0229 91800062 LDS R24,0x62
022B 6480 ORI R24,0x40
022C 93800062 STS 0x62,R24
(0162) return wordin;
022E 018A MOVW R16,R20
022F 940E1528 CALL pop_gset2
0231 9508 RET
_ata_read_byte:
reg --> R20
0232 940E1534 CALL push_gset1
0234 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);
0235 2F04 MOV R16,R20
0236 DFAE RCALL _ata_read_word
0237 7010 ANDI R17,0
0238 940E1537 CALL pop_gset1
023A 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:
023B EF0D LDI R16,0xFD
023C DFF5 RCALL _ata_read_byte
023D FF06 SBRS R16,6
023E C002 RJMP 0x0241
023F E001 LDI R16,1
0240 C001 RJMP 0x0242
(0184) else return 0;
0241 2700 CLR R16
0242 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:
0243 EF0D LDI R16,0xFD
0244 DFED RCALL _ata_read_byte
0245 FF07 SBRS R16,7
0246 C002 RJMP 0x0249
0247 E001 LDI R16,1
0248 C001 RJMP 0x024A
(0195) else return 0;
0249 2700 CLR R16
024A 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:
024B EF0D LDI R16,0xFD
024C DFE5 RCALL _ata_read_byte
024D FF03 SBRS R16,3
024E C002 RJMP 0x0251
024F E001 LDI R16,1
0250 C001 RJMP 0x0252
(0206) else return 0;
0251 2700 CLR R16
0252 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:
0253 EF0D LDI R16,0xFD
0254 DFDD RCALL _ata_read_byte
0255 FF00 SBRS R16,0
0256 C002 RJMP 0x0259
0257 E001 LDI R16,1
0258 C001 RJMP 0x025A
(0217) else return 0;
0259 2700 CLR R16
025A 9508 RET
_ata_read_sector_byte:
word --> R14
i --> R10
j --> R12
ptr --> Y+18
qte --> Y+16
from --> Y+14
lbasector --> Y+10
device --> R10
025B 933A ST R19,-Y
025C 932A ST R18,-Y
025D 940E1557 CALL push_gset5
025F 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;
0260 EF4F LDI R20,0xFF
0261 EF5F LDI R21,0xFF
0262 EF6F LDI R22,0xFF
0263 E07F LDI R23,0xF
0264 01FE MOVW R30,R28
0265 8422 LDD R2,Z+10
0266 8433 LDD R3,Z+11
0267 8444 LDD R4,Z+12
0268 8455 LDD R5,Z+13
0269 2224 AND R2,R20
026A 2235 AND R3,R21
026B 2246 AND R4,R22
026C 2257 AND R5,R23
026D 8622 STD Z+10,R2
026E 8633 STD Z+11,R3
026F 8644 STD Z+12,R4
0270 8655 STD Z+13,R5
(0232)
(0233) switch (device)
0271 24BB CLR R11
0272 20AA TST R10
0273 F411 BNE 0x0276
0274 20BB TST R11
0275 F031 BEQ 0x027C
0276 01C5 MOVW R24,R10
0277 3081 CPI R24,1
0278 E0E0 LDI R30,0
0279 079E CPC R25,R30
027A F0D9 BEQ 0x0296
027B C034 RJMP 0x02B0
(0234) {
(0235) case 0x00:
(0236) ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
027C E188 LDI R24,0x18
027D E090 LDI R25,0
027E 01FE MOVW R30,R28
027F 8422 LDD R2,Z+10
0280 8433 LDD R3,Z+11
0281 8444 LDD R4,Z+12
0282 8455 LDD R5,Z+13
0283 938A ST R24,-Y
0284 0181 MOVW R16,R2
0285 0192 MOVW R18,R4
0286 940E15C0 CALL lsr32
0288 0118 MOVW R2,R16
0289 0129 MOVW R4,R18
028A EE40 LDI R20,0xE0
028B E050 LDI R21,0
028C E060 LDI R22,0
028D E070 LDI R23,0
028E 2A24 OR R2,R20
028F 2A35 OR R3,R21
0290 2A46 OR R4,R22
0291 2A57 OR R5,R23
0292 2D22 MOV R18,R2
0293 EF05 LDI R16,0xF5
0294 DF45 RCALL _ata_write_byte
(0237) break;
0295 C033 RJMP 0x02C9
(0238) case 0x01:
(0239) ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xF0);
0296 E188 LDI R24,0x18
0297 E090 LDI R25,0
0298 01FE MOVW R30,R28
0299 8422 LDD R2,Z+10
029A 8433 LDD R3,Z+11
029B 8444 LDD R4,Z+12
029C 8455 LDD R5,Z+13
029D 938A ST R24,-Y
029E 0181 MOVW R16,R2
029F 0192 MOVW R18,R4
02A0 940E15C0 CALL lsr32
02A2 0118 MOVW R2,R16
02A3 0129 MOVW R4,R18
02A4 EF40 LDI R20,0xF0
02A5 E050 LDI R21,0
02A6 E060 LDI R22,0
02A7 E070 LDI R23,0
02A8 2A24 OR R2,R20
02A9 2A35 OR R3,R21
02AA 2A46 OR R4,R22
02AB 2A57 OR R5,R23
02AC 2D22 MOV R18,R2
02AD EF05 LDI R16,0xF5
02AE DF2B RCALL _ata_write_byte
(0240) break;
02AF C019 RJMP 0x02C9
(0241) default:
(0242) ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
02B0 E188 LDI R24,0x18
02B1 E090 LDI R25,0
02B2 01FE MOVW R30,R28
02B3 8422 LDD R2,Z+10
02B4 8433 LDD R3,Z+11
02B5 8444 LDD R4,Z+12
02B6 8455 LDD R5,Z+13
02B7 938A ST R24,-Y
02B8 0181 MOVW R16,R2
02B9 0192 MOVW R18,R4
02BA 940E15C0 CALL lsr32
02BC 0118 MOVW R2,R16
02BD 0129 MOVW R4,R18
02BE EE40 LDI R20,0xE0
02BF E050 LDI R21,0
02C0 E060 LDI R22,0
02C1 E070 LDI R23,0
02C2 2A24 OR R2,R20
02C3 2A35 OR R3,R21
02C4 2A46 OR R4,R22
02C5 2A57 OR R5,R23
02C6 2D22 MOV R18,R2
02C7 EF05 LDI R16,0xF5
02C8 DF11 RCALL _ata_write_byte
(0243) break;
(0244) }
(0245) while(busy);
02C9 DF79 RCALL _ata_bsy
02CA 2300 TST R16
02CB F7E9 BNE 0x02C9
(0246) ata_write_byte(ATA_IO_CYL_H,lbasector >> 16);
02CC 01FE MOVW R30,R28
02CD 8422 LDD R2,Z+10
02CE 8433 LDD R3,Z+11
02CF 8444 LDD R4,Z+12
02D0 8455 LDD R5,Z+13
02D1 0112 MOVW R2,R4
02D2 2444 CLR R4
02D3 2455 CLR R5
02D4 2D22 MOV R18,R2
02D5 ED0D LDI R16,0xDD
02D6 DF03 RCALL _ata_write_byte
(0247) while(busy);
02D7 DF6B RCALL _ata_bsy
02D8 2300 TST R16
02D9 F7E9 BNE 0x02D7
(0248) ata_write_byte(ATA_IO_CYL_L,lbasector >> 8);
02DA E088 LDI R24,0x8
02DB E090 LDI R25,0
02DC 01FE MOVW R30,R28
02DD 8422 LDD R2,Z+10
02DE 8433 LDD R3,Z+11
02DF 8444 LDD R4,Z+12
02E0 8455 LDD R5,Z+13
02E1 938A ST R24,-Y
02E2 0181 MOVW R16,R2
02E3 0192 MOVW R18,R4
02E4 940E15C0 CALL lsr32
02E6 2F20 MOV R18,R16
02E7 ED05 LDI R16,0xD5
02E8 DEF1 RCALL _ata_write_byte
(0249) while(busy);
02E9 DF59 RCALL _ata_bsy
02EA 2300 TST R16
02EB F7E9 BNE 0x02E9
(0250) ata_write_byte(ATA_IO_SECTORNUM,lbasector);
02EC 01FE MOVW R30,R28
02ED 8422 LDD R2,Z+10
02EE 8433 LDD R3,Z+11
02EF 8444 LDD R4,Z+12
02F0 8455 LDD R5,Z+13
02F1 2D22 MOV R18,R2
02F2 EE0D LDI R16,0xED
02F3 DEE6 RCALL _ata_write_byte
(0251) while(busy);
02F4 DF4E RCALL _ata_bsy
02F5 2300 TST R16
02F6 F7E9 BNE 0x02F4
(0252) ata_write_byte(ATA_IO_SECTORCNT,0x01);
02F7 E021 LDI R18,1
02F8 EE05 LDI R16,0xE5
02F9 DEE0 RCALL _ata_write_byte
(0253) while(busy);
02FA DF48 RCALL _ata_bsy
02FB 2300 TST R16
02FC F7E9 BNE 0x02FA
(0254) ata_write_byte(ATA_IO_CMD,CMD_READ_SECTORS);
02FD E220 LDI R18,0x20
02FE EF0D LDI R16,0xFD
02FF DEDA RCALL _ata_write_byte
(0255) while(busy);
0300 DF42 RCALL _ata_bsy
0301 2300 TST R16
0302 F7E9 BNE 0x0300
(0256) while(!drq);
0303 DF47 RCALL _ata_drq
0304 2300 TST R16
0305 F3E9 BEQ 0x0303
(0257)
(0258) j = 0;
0306 24CC CLR R12
0307 24DD CLR R13
(0259) for (i=0;i<256;i++)
0308 24AA CLR R10
0309 24BB CLR R11
030A C036 RJMP 0x0341
(0260) {
(0261) word = ata_read_word(ATA_IO_DATA);
030B EC05 LDI R16,0xC5
030C DED8 RCALL _ata_read_word
030D 0178 MOVW R14,R16
(0262) if ((j >= from) && (j < (from + qte))) *ptr++ = (unsigned char)(word);
030E 840E LDD R0,Y+14
030F 841F LDD R1,Y+15
0310 14C0 CP R12,R0
0311 04D1 CPC R13,R1
0312 F068 BCS 0x0320
0313 0110 MOVW R2,R0
0314 8808 LDD R0,Y+16
0315 8819 LDD R1,Y+17
0316 0C20 ADD R2,R0
0317 1C31 ADC R3,R1
0318 14C2 CP R12,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -