📄 mp3.lst
字号:
04CA 9060036C LDS R6,0x36C
04CC 9070036D LDS R7,0x36D
04CE 0C62 ADD R6,R2
04CF 1C73 ADC R7,R3
04D0 1C84 ADC R8,R4
04D1 1C95 ADC R9,R5
04D2 0E60 ADD R6,R16
04D3 1E71 ADC R7,R17
04D4 1E82 ADC R8,R18
04D5 1E93 ADC R9,R19
04D6 92700221 STS FirstDataSector+1,R7
04D8 92600220 STS FirstDataSector,R6
04DA 92900223 STS FirstDataSector+3,R9
04DC 92800222 STS FirstDataSector+2,R8
04DE 9628 ADIW R28,0x8
04DF 940E15C5 CALL pop_gset2
04E1 9508 RET
_Clust2LBA:
clust --> Y+4
04E2 940E14D5 CALL push_arg4
04E4 940E15D7 CALL push_gset2
(0027) }
(0028)
(0029) //*************************************
(0030) // unsigned long clust2LBA(unsigned long clust)
(0031) //*************************************
(0032) unsigned long Clust2LBA(unsigned long clust)
(0033) {
(0034) return ((clust-2) * Boot.SecPerClust) + FirstDataSector;
04E6 E042 LDI R20,2
04E7 E050 LDI R21,0
04E8 E060 LDI R22,0
04E9 E070 LDI R23,0
04EA 01FE MOVW R30,R28
04EB 8024 LDD R2,Z+4
04EC 8035 LDD R3,Z+5
04ED 8046 LDD R4,Z+6
04EE 8057 LDD R5,Z+7
04EF 1A24 SUB R2,R20
04F0 0A35 SBC R3,R21
04F1 0A46 SBC R4,R22
04F2 0A57 SBC R5,R23
04F3 9060033D LDS R6,0x33D
04F5 2477 CLR R7
04F6 2488 CLR R8
04F7 2499 CLR R9
04F8 929A ST R9,-Y
04F9 928A ST R8,-Y
04FA 927A ST R7,-Y
04FB 926A ST R6,-Y
04FC 0181 MOVW R16,R2
04FD 0192 MOVW R18,R4
04FE 940E1595 CALL empy32s
0500 0118 MOVW R2,R16
0501 0129 MOVW R4,R18
0502 90800222 LDS R8,FirstDataSector+2
0504 90900223 LDS R9,FirstDataSector+3
0506 90600220 LDS R6,FirstDataSector
0508 90700221 LDS R7,FirstDataSector+1
050A 0C26 ADD R2,R6
050B 1C37 ADC R3,R7
050C 1C48 ADC R4,R8
050D 1C59 ADC R5,R9
050E 0181 MOVW R16,R2
050F 0192 MOVW R18,R4
0510 940E15C5 CALL pop_gset2
0512 9624 ADIW R28,4
0513 9508 RET
_GetNextCluster:
Fat32_Entry --> Y+16
FatSectorOffset --> Y+12
FatSectorNum --> Y+8
Clust --> Y+24
0514 940E14D5 CALL push_arg4
0516 940E15D7 CALL push_gset2
0518 9764 SBIW R28,0x14
(0035) }
(0036)
(0037) //****************************************************************
(0038) // unsigned long GetNextCluster(unsigned long Clust)
(0039) //
(0040) // Description:
(0041) // Returns the FAT32 Entry for the given Cluster Number.
(0042) // The FAT32 Entry is the next cluster number of the cluster
(0043) // chain. **May return a termination
(0044) //
(0045) // if Fat32_Entry >= 0x0FFFFFF8 EOC (End of Chain)
(0046) // if Fat32_Entry == 0x0FFFFFF7 Bad Cluster
(0047) //****************************************************************
(0048) unsigned long GetNextCluster(unsigned long Clust)
(0049) {
(0050) unsigned long FatSectorNum;
(0051) unsigned long FatSectorOffset;
(0052) unsigned long Fat32_Entry;
(0053)
(0054) FatSectorNum = Part.StartLBA + Boot.ResSectors + ((Clust * 4) / Boot.BytesPerSec);;
0519 01FE MOVW R30,R28
051A 8C20 LDD R2,Z+24
051B 8C31 LDD R3,Z+25
051C 8C42 LDD R4,Z+26
051D 8C53 LDD R5,Z+27
051E E044 LDI R20,4
051F E050 LDI R21,0
0520 E060 LDI R22,0
0521 E070 LDI R23,0
0522 925A ST R5,-Y
0523 924A ST R4,-Y
0524 923A ST R3,-Y
0525 922A ST R2,-Y
0526 018A MOVW R16,R20
0527 019B MOVW R18,R22
0528 940E1595 CALL empy32s
052A 9020033B LDS R2,0x33B
052C 9030033C LDS R3,0x33C
052E 2444 CLR R4
052F 2455 CLR R5
0530 925A ST R5,-Y
0531 924A ST R4,-Y
0532 923A ST R3,-Y
0533 922A ST R2,-Y
0534 940E1514 CALL div32u
0536 9020033E LDS R2,0x33E
0538 9030033F LDS R3,0x33F
053A 2444 CLR R4
053B 2455 CLR R5
053C 9080036E LDS R8,0x36E
053E 9090036F LDS R9,0x36F
0540 9060036C LDS R6,0x36C
0542 9070036D LDS R7,0x36D
0544 0C62 ADD R6,R2
0545 1C73 ADC R7,R3
0546 1C84 ADC R8,R4
0547 1C95 ADC R9,R5
0548 0E60 ADD R6,R16
0549 1E71 ADC R7,R17
054A 1E82 ADC R8,R18
054B 1E93 ADC R9,R19
054C 01FE MOVW R30,R28
054D 8660 STD Z+8,R6
054E 8671 STD Z+9,R7
054F 8682 STD Z+10,R8
0550 8693 STD Z+11,R9
(0055) FatSectorOffset = (Clust * 4) % Boot.BytesPerSec;
0551 01FE MOVW R30,R28
0552 8C20 LDD R2,Z+24
0553 8C31 LDD R3,Z+25
0554 8C42 LDD R4,Z+26
0555 8C53 LDD R5,Z+27
0556 E044 LDI R20,4
0557 E050 LDI R21,0
0558 E060 LDI R22,0
0559 E070 LDI R23,0
055A 925A ST R5,-Y
055B 924A ST R4,-Y
055C 923A ST R3,-Y
055D 922A ST R2,-Y
055E 018A MOVW R16,R20
055F 019B MOVW R18,R22
0560 940E1595 CALL empy32s
0562 9020033B LDS R2,0x33B
0564 9030033C LDS R3,0x33C
0566 2444 CLR R4
0567 2455 CLR R5
0568 925A ST R5,-Y
0569 924A ST R4,-Y
056A 923A ST R3,-Y
056B 922A ST R2,-Y
056C 940E1516 CALL mod32u
056E 01FE MOVW R30,R28
056F 8704 STD Z+12,R16
0570 8715 STD Z+13,R17
0571 8726 STD Z+14,R18
0572 8737 STD Z+15,R19
(0056)
(0057) ata_read_sector_byte(0, FatSectorNum, FatSectorOffset, 4 , (unsigned char*)&Fat32_Entry);
0573 01CE MOVW R24,R28
0574 9640 ADIW R24,0x10
0575 839F STD Y+7,R25
0576 838E STD Y+6,R24
0577 E084 LDI R24,4
0578 E090 LDI R25,0
0579 839D STD Y+5,R25
057A 838C STD Y+4,R24
057B 01FE MOVW R30,R28
057C 8424 LDD R2,Z+12
057D 8435 LDD R3,Z+13
057E 823B STD Y+3,R3
057F 822A STD Y+2,R2
0580 01FE MOVW R30,R28
0581 8420 LDD R2,Z+8
0582 8431 LDD R3,Z+9
0583 8442 LDD R4,Z+10
0584 8453 LDD R5,Z+11
0585 8248 STD Y+0,R4
0586 8259 STD Y+1,R5
0587 0191 MOVW R18,R2
0588 2700 CLR R16
0589 940E02B9 CALL _ata_read_sector_byte
(0058)
(0059) return(Fat32_Entry & 0x0FFFFFFF);
058B EF4F LDI R20,0xFF
058C EF5F LDI R21,0xFF
058D EF6F LDI R22,0xFF
058E E07F LDI R23,0xF
058F 01FE MOVW R30,R28
0590 8820 LDD R2,Z+16
0591 8831 LDD R3,Z+17
0592 8842 LDD R4,Z+18
0593 8853 LDD R5,Z+19
0594 2224 AND R2,R20
0595 2235 AND R3,R21
0596 2246 AND R4,R22
0597 2257 AND R5,R23
0598 0181 MOVW R16,R2
0599 0192 MOVW R18,R4
059A 9664 ADIW R28,0x14
059B 940E15C5 CALL pop_gset2
059D 9624 ADIW R28,4
059E 9508 RET
_GetDir:
k --> Y+9
NextCluster --> Y+49
LBA --> Y+45
LinePtr --> Y+44
i --> Y+40
LongFileName --> R14
Files --> Y+55
Offset --> Y+53
LongFilePtr --> R10
Entry --> Y+8
j --> R12
Display --> Y+75
Qte --> Y+73
From --> Y+71
Cluster --> Y+67
059F 940E14D5 CALL push_arg4
05A1 940E15D1 CALL push_gset5
05A3 97E9 SBIW R28,0x39
(0060) }
(0061)
(0062) //*************************************
(0063) // int GetDir(unsigned long Cluster, unsigned int FileWanted, unsigned int Type)
(0064) //
(0065) //*************************************
(0066) int GetDir(unsigned long Cluster, unsigned int From, unsigned int Qte, unsigned int Display)
(0067) {
(0068) extern unsigned char SectorBuffer[512];
(0069) unsigned long LBA,i,NextCluster;
(0070) unsigned int Offset,j,k,LongFilePtr,LongFileName,Files;
(0071) unsigned char LinePtr;
(0072) union FileEntry
(0073) {
(0074) struct DirEntry Dir;
(0075) struct WinEntry Win;
(0076) };
(0077)
(0078) union FileEntry Entry;
(0079)
(0080) NextCluster = Cluster;
05A4 01FE MOVW R30,R28
05A5 5BED SUBI R30,0xBD
05A6 4FFF SBCI R31,0xFF
05A7 8020 LDD R2,Z+0
05A8 8031 LDD R3,Z+1
05A9 8042 LDD R4,Z+2
05AA 8053 LDD R5,Z+3
05AB 01FE MOVW R30,R28
05AC AA21 STD Z+49,R2
05AD AA32 STD Z+50,R3
05AE AA43 STD Z+51,R4
05AF AA54 STD Z+52,R5
(0081) Files = 0;
05B0 2400 CLR R0
05B1 2411 CLR R1
05B2 AE18 STD Y+56,R1
05B3 AA0F STD Y+55,R0
(0082) LinePtr = 0;
05B4 2422 CLR R2
05B5 A62C STD Y+44,R2
05B6 C1E3 RJMP 0x079A
(0083) while (1)
(0084) {
(0085) LBA = Clust2LBA(NextCluster);
05B7 01FE MOVW R30,R28
05B8 A901 LDD R16,Z+49
05B9 A912 LDD R17,Z+50
05BA A923 LDD R18,Z+51
05BB A934 LDD R19,Z+52
05BC DF25 RCALL _Clust2LBA
05BD 01FE MOVW R30,R28
05BE A705 STD Z+45,R16
05BF A716 STD Z+46,R17
05C0 A727 STD Z+47,R18
05C1 AB30 STD Z+48,R19
(0086) for (i=0;i<Boot.SecPerClust;i++)
05C2 E040 LDI R20,0
05C3 E050 LDI R21,0
05C4 E060 LDI R22,0
05C5 E070 LDI R23,0
05C6 01FE MOVW R30,R28
05C7 A740 STD Z+40,R20
05C8 A751 STD Z+41,R21
05C9 A762 STD Z+42,R22
05CA A773 STD Z+43,R23
05CB C1A4 RJMP 0x0770
(0087) {
(0088) ata_read_sector_byte(0, LBA+i, 0, 512, (unsigned char*)&SectorBuffer);
05CC E38C LDI R24,0x3C
05CD E094 LDI R25,4
05CE 839F STD Y+7,R25
05CF 838E STD Y+6,R24
05D0 E080 LDI R24,0
05D1 E092 LDI R25,2
05D2 839D STD Y+5,R25
05D3 838C STD Y+4,R24
05D4 2422 CLR R2
05D5 2433 CLR R3
05D6 823B STD Y+3,R3
05D7 822A STD Y+2,R2
05D8 01FE MOVW R30,R28
05D9 A420 LDD R2,Z+40
05DA A431 LDD R3,Z+41
05DB A442 LDD R4,Z+42
05DC A453 LDD R5,Z+43
05DD 01FE MOVW R30,R28
05DE A465 LDD R6,Z+45
05DF A476 LDD R7,Z+46
05E0 A487 LDD R8,Z+47
05E1 A890 LDD R9,Z+48
05E2 0C62 ADD R6,R2
05E3 1C73 ADC R7,R3
05E4 1C84 ADC R8,R4
05E5 1C95 ADC R9,R5
05E6 8288 STD Y+0,R8
05E7 8299 STD Y+1,R9
05E8 0193 MOVW R18,R6
05E9 2700 CLR R16
05EA 940E02B9 CALL _ata_read_sector_byte
(0089) for (Offset=0;Offset<Boot.BytesPerSec;Offset=Offset+32)
05EC 2400 CLR R0
05ED 2411 CLR R1
05EE AA1E STD Y+54,R1
05EF AA0D STD Y+53,R0
05F0 C163 RJMP 0x0754
(0090) {
(0091) memcpy((unsigned char*)&Entry,(unsigned char*)&SectorBuffer[Offset],sizeof(Entry));
05F1 E280 LDI R24,0x20
05F2 E090 LDI R25,0
05F3 8399 STD Y+1,R25
05F4 8388 STD Y+0,R24
05F5 E38C LDI R24,0x3C
05F6 E094 LDI R25,4
05F7 A92D LDD R18,Y+53
05F8 A93E LDD R19,Y+54
05F9 0F28 ADD R18,R24
05FA 1F39 ADC R19,R25
05FB 018E MOVW R16,R28
05FC 5F08 SUBI R16,0xF8
05FD 4F1F SBCI R17,0xFF
05FE 940E149E CALL _memcpy
(0092) if (Entry.Dir.Attributes == ATTR_LONG_FILENAME)
0600 898B LDD R24,Y+19
0601 308F CPI R24,0xF
0602 F009 BEQ 0x0604
0603 C07C RJMP 0x0680
(0093) {
(0094) LongFileName = TRUE;
0604 E081 LDI R24,1
0605 E090 LDI R25,0
0606 017C MOVW R14,R24
(0095) LongFilePtr = ((Entry.Win.Cnt & 0x3f) * 13) - 13;
0607 8588 LDD R24,Y+8
0608 738F ANDI R24,0x3F
0609 E09D LDI R25,0xD
060A 9F98 MUL R25,R24
060B 01C0 MOVW R24,R0
060C 970D SBIW R24,0xD
060D 015C MOVW R10,R24
(0096) for (j=0;j<5;j++) File.Name[LongFilePtr++] = Entry.Win.Part1[j];
060E 24CC CLR R12
060F 24DD CLR R13
0610 C019 RJMP 0x062A
0611 0115 MOVW R2,R10
0612 01C1 MOVW R24,R2
0613 9601 ADIW R24,1
0614 015C MOVW R10,R24
0615 E002 LDI R16,2
0616 E010 LDI R17,0
0617 0196 MOVW R18,R12
0618 940E1585 CALL empy16s
061A 01F8 MOVW R30,R16
061B 01CE MOVW R24,R28
061C 9609 ADIW R24,0x9
061D 0FE8 ADD R30,R24
061E 1FF9 ADC R31,R25
061F 8040 LDD R4,Z+0
0620 8051 LDD R5,Z+1
0621 E284 LDI R24,0x24
0622 E092 LDI R25,2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -