file.lst
来自「Philips LPC2138 Demo Application with Ke」· LST 代码 · 共 1,317 行 · 第 1/5 页
LST
1,317 行
EXTERN CODE16 (fs_clusterToSector?T)
EXTERN CODE16 (fs_getNextFreeCluster?T)
EXTERN CODE16 (fs_giveFreeClusterHint?T)
EXTERN CODE16 (fs_findFreeFile?T)
EXTERN CODE16 (fs_findFile?T)
EXTERN CODE16 (fs_setFirstClusterInDirEntry?T)
EXTERN CODE16 (fs_initClusterChain?T)
EXTERN CODE16 (fat_setNextClusterAddress?T)
EXTERN CODE16 (fat_giveEocMarker?T)
EXTERN CODE16 (fat_LogicToDiscCluster?T)
EXTERN CODE16 (fat_allocClusterChain?T)
EXTERN CODE16 (fat_countClustersInChain?T)
EXTERN CODE16 (dir_getFileStructure?T)
EXTERN CODE16 (dir_createDirectoryEntry?T)
EXTERN CODE16 (dir_createDefaultEntry?T)
EXTERN CODE16 (dir_setFirstCluster?T)
EXTERN CODE16 (dir_setFileSize?T)
EXTERN CODE16 (dir_getFatFileName?T)
EXTERN CODE16 (dir_updateDirectoryEntry?T)
EXTERN CODE16 (?C?UDIV?T)
*** PUBLICS:
PUBLIC file_fopen?T
PUBLIC file_fclose?T
PUBLIC file_setpos?T
PUBLIC file_fread?T
PUBLIC file_read?T
PUBLIC file_fwrite?T
PUBLIC file_write?T
PUBLIC file_normalToFatName?T
PUBLIC file_validateChar?T
PUBLIC file_initFile?T
PUBLIC file_setAttr?T
PUBLIC file_getAttr?T
PUBLIC file_requiredCluster?T
*** CODE SEGMENT '?PR?file_fread?T?file':
34: euint32 file_fread(File *file,euint32 offset, euint32 size,euint8 *buf)
00000000 B5F0 PUSH {R4-R7,LR}
00000002 1C1D MOV R5,R3 ; buf
00000004 ---- Variable 'buf' assigned to Register 'R5' ----
00000004 1C17 MOV R7,R2 ; size
00000006 ---- Variable 'size' assigned to Register 'R7' ----
00000006 1C0E MOV R6,R1 ; offset
00000008 ---- Variable 'offset' assigned to Register 'R6' ----
00000008 1C04 MOV R4,R0 ; file
0000000A ---- Variable 'file' assigned to Register 'R4' ----
0000000A B084 SUB R13,#0x10
35: {
0000000C ; SCOPE-START
36: euint32 bytes_read=0,size_left=size,coffset=offset;
0000000C 2000 MOV R0,#0x0
0000000E 9000 STR R0,[R13,#0x0] ; bytes_read
00000010 1C38 MOV R0,R7 ; size
00000012 9001 STR R0,[R13,#0x4] ; size_left
ARM COMPILER V2.42, file 27/03/06 10:45:50 PAGE 10
00000014 1C30 MOV R0,R6 ; offset
00000016 9002 STR R0,[R13,#0x8] ; coffset
42: if(!file_getAttr(file,FILE_STATUS_OPEN))return(0);
00000018 1C20 MOV R0,R4 ; file
0000001A 2100 MOV R1,#0x0
0000001C F7FF BL file_getAttr?T ; T=0x0001 (1)
0000001E FFF0 BL file_getAttr?T ; T=0x0001 (2)
00000020 0600 LSL R0,R0,#0x18 ; file_getAttr?T
00000022 0E00 LSR R0,R0,#0x18
00000024 2800 CMP R0,#0x0
00000026 D101 BNE L_1 ; T=0x0000002C
00000028 2000 MOV R0,#0x0
0000002A E08C B L_2 ; T=0x00000146
0000002C L_1:
44: if(offset>=file->FileSize)
0000002C 1C20 MOV R0,R4 ; file
0000002E 6CC0 LDR R0,[R0,#0x4C]
00000030 1C31 MOV R1,R6 ; offset
00000032 4281 CMP R1,R0 ; offset
00000034 D301 BCC L_3 ; T=0x0000003A
45: size_left=0; /* Offset check */
00000036 2100 MOV R1,#0x0
00000038 9101 STR R1,[R13,#0x4] ; size_left
0000003A L_3:
47: if( (offset+size > file->FileSize) && size_left!=0)
0000003A 1C3A MOV R2,R7 ; size
0000003C 1C31 MOV R1,R6 ; offset
0000003E 1889 ADD R1,R2 ; offset
00000040 4281 CMP R1,R0
00000042 D905 BLS L_8 ; T=0x00000050
00000044 9901 LDR R1,[R13,#0x4] ; size_left
00000046 2900 CMP R1,#0x0
00000048 D002 BEQ L_8 ; T=0x00000050
48: size_left=file->FileSize-offset;
0000004A 1C31 MOV R1,R6 ; offset
0000004C 1A40 SUB R0,R1 ; offset
0000004E 9001 STR R0,[R13,#0x4] ; size_left
50: while(size_left>0){
00000050 L_8:
00000050 E075 B L_5 ; T=0x0000013E
00000052 L_7:
52: cclus = coffset/(512*file->fs->volumeId.SectorsPerCluster);
00000052 1C20 MOV R0,R4 ; file
00000054 6A87 LDR R7,[R0,#0x28]
00000056 79BE LDRB R6,[R7,#0x6]
00000058 1C31 MOV R1,R6
0000005A 0249 LSL R1,R1,#0x9
0000005C 9A02 LDR R2,[R13,#0x8] ; coffset
0000005E 1C10 MOV R0,R2
00000060 F7FF BL ?C?UDIV?T ; T=0x0001 (1) ; ?C?UDIV?T
00000062 FFCE BL ?C?UDIV?T ; T=0x0001 (2) ; ?C?UDIV?T
00000064 1C08 MOV R0,R1
00000066 1C03 MOV R3,R0 ; cclus
00000068 ---- Variable 'cclus' assigned to Register 'R3' ----
53: csec = (coffset/(512))%file->fs->volumeId.SectorsPerCluster;
00000068 1C31 MOV R1,R6
0000006A 0A50 LSR R0,R2,#0x9
0000006C F7FF BL ?C?UDIV?T ; T=0x0001 (1) ; ?C?UDIV?T
0000006E FFC8 BL ?C?UDIV?T ; T=0x0001 (2) ; ?C?UDIV?T
00000070 1C01 MOV R1,R0
00000072 1C0F MOV R7,R1 ; csec
00000074 ---- Variable 'csec' assigned to Register 'R7' ----
54: cbyte = coffset%512;
00000074 9A02 LDR R2,[R13,#0x8] ; coffset
00000076 4800 LDR R0,=0x1FF
00000078 4002 AND R2,R0
ARM COMPILER V2.42, file 27/03/06 10:45:50 PAGE 11
0000007A ---- Variable 'cbyte' assigned to Register 'R2' ----
56: if(cbyte!=0 || size_left<512){
0000007A 1C11 MOV R1,R2 ; cbyte
0000007C 2900 CMP R1,#0x0 ; cbyte
0000007E D103 BNE L_10 ; T=0x00000088
00000080 9901 LDR R1,[R13,#0x4] ; size_left
00000082 4A80 LDR R2,=0x200
00000084 4291 CMP R1,R2
00000086 D20E BCS L_9 ; T=0x000000A6
00000088 L_10:
57: btr = 512-(coffset%512)>=size_left?size_left:512-(coffset%512);
00000088 9A02 LDR R2,[R13,#0x8] ; coffset
0000008A 4002 AND R2,R0
0000008C 4980 LDR R1,=0x200
0000008E 1A88 SUB R0,R1,R2
00000090 9A01 LDR R2,[R13,#0x4] ; size_left
00000092 4290 CMP R0,R2
00000094 D301 BCC L_11 ; T=0x0000009A
00000096 9801 LDR R0,[R13,#0x4] ; size_left
00000098 E003 B L_12 ; T=0x000000A2
0000009A L_11:
0000009A 9A02 LDR R2,[R13,#0x8] ; coffset
0000009C 4800 LDR R0,=0x1FF
0000009E 4002 AND R2,R0
000000A0 1A88 SUB R0,R1,R2
000000A2 L_12:
000000A2 9003 STR R0,[R13,#0xC] ; btr
58: }else{
000000A4 E001 B L_13 ; T=0x000000AA
000000A6 L_9:
59: btr = 512;
000000A6 4880 LDR R0,=0x200
000000A8 9003 STR R0,[R13,#0xC] ; btr
60: }
000000AA L_13:
62: if((fat_LogicToDiscCluster(file->fs,&(file->Cache),cclus))!=0){
000000AA 1C20 MOV R0,R4 ; file
000000AC 6A80 LDR R0,[R0,#0x28]
000000AE 1C21 MOV R1,R4 ; file
000000B0 312C ADD R1,#0x2C
000000B2 1C1A MOV R2,R3 ; cclus
000000B4 F7FF BL fat_LogicToDiscCluster?T ; T=0x0001 (1)
000000B6 FFA4 BL fat_LogicToDiscCluster?T ; T=0x0001 (2)
000000B8 0400 LSL R0,R0,#0x10 ; fat_LogicToDiscCluster?T
000000BA 1400 ASR R0,R0,#0x10
000000BC 2800 CMP R0,#0x0
000000BE D001 BEQ L_14 ; T=0x000000C4
63: return(0);
000000C0 2000 MOV R0,#0x0
000000C2 E040 B L_2 ; T=0x00000146
64: }
000000C4 L_14:
65: rclus=file->Cache.DiscCluster;
000000C4 1C20 MOV R0,R4 ; file
000000C6 6B46 LDR R6,[R0,#0x34]
000000C8 ---- Variable 'rclus' assigned to Register 'R6' ----
66: rsec=fs_clusterToSector(file->fs,rclus);
000000C8 1C20 MOV R0,R4 ; file
000000CA 6A80 LDR R0,[R0,#0x28]
000000CC 1C31 MOV R1,R6 ; rclus
000000CE F7FF BL fs_clusterToSector?T ; T=0x0001 (1)
000000D0 FF97 BL fs_clusterToSector?T ; T=0x0001 (2)
000000D2 1C06 MOV R6,R0 ; rsec
000000D4 ---- Variable 'rsec' assigned to Register 'R6' ----
69: if(btr==512){
000000D4 9803 LDR R0,[R13,#0xC] ; btr
ARM COMPILER V2.42, file 27/03/06 10:45:50 PAGE 12
000000D6 4980 LDR R1,=0x200
000000D8 4288 CMP R0,R1
000000DA D10B BNE L_15 ; T=0x000000F4
71: part_directSectorRead(file->fs->part,rsec+csec,buf+bytes_read);
000000DC 1C20 MOV R0,R4 ; file
000000DE 6A80 LDR R0,[R0,#0x28]
000000E0 6800 LDR R0,[R0,#0x0]
000000E2 1C3A MOV R2,R7 ; csec
000000E4 1C31 MOV R1,R6 ; rsec
000000E6 1889 ADD R1,R2 ; rsec
000000E8 9B00 LDR R3,[R13,#0x0] ; bytes_read
000000EA 1C2A MOV R2,R5 ; buf
000000EC 18D2 ADD R2,R3 ; buf
000000EE F7FF BL part_directSectorRead?T ; T=0x0001 (1)
000000F0 FF87 BL part_directSectorRead?T ; T=0x0001 (2)
72: }else{
000000F2 E01A B L_16 ; T=0x0000012A
000000F4 L_15:
74: tbuf = part_getSect(file->fs->part,rsec+csec,IOM_MODE_READONLY);
000000F4 1C20 MOV R0,R4 ; file
000000F6 6A80 LDR R0,[R0,#0x28]
000000F8 6800 LDR R0,[R0,#0x0]
000000FA 1C3A MOV R2,R7 ; csec
000000FC 1C31 MOV R1,R6 ; rsec
000000FE 1889 ADD R1,R2 ; rsec
00000100 2201 MOV R2,#0x1
00000102 F7FF BL part_getSect?T ; T=0x0001 (1)
00000104 FF7D BL part_getSect?T ; T=0x0001 (2)
00000106 1C06 MOV R6,R0 ; tbuf
00000108 ---- Variable 'tbuf' assigned to Register 'R6' ----
75: memCpy(tbuf+(coffset%512),buf+bytes_read,btr);
00000108 9902 LDR R1,[R13,#0x8] ; coffset
0000010A 4800 LDR R0,=0x1FF
0000010C 4001 AND R1,R0
0000010E 1C30 MOV R0,R6 ; tbuf
00000110 1840 ADD R0,R1 ; tbuf
00000112 9A00 LDR R2,[R13,#0x0] ; bytes_read
00000114 1C29 MOV R1,R5 ; buf
00000116 1889 ADD R1,R2 ; buf
00000118 9A03 LDR R2,[R13,#0xC] ; btr
0000011A F7FF BL memCpy?T ; T=0x0001 (1)
0000011C FF71 BL memCpy?T ; T=0x0001 (2)
76: part_relSect(file->fs->part,tbuf);
0000011E 1C20 MOV R0,R4 ; file
00000120 6A80 LDR R0,[R0,#0x28]
00000122 6800 LDR R0,[R0,#0x0]
00000124 1C31 MOV R1,R6 ; tbuf
00000126 F7FF BL part_relSect?T ; T=0x0001 (1)
00000128 FF6B BL part_relSect?T ; T=0x0001 (2)
77: }
0000012A L_16:
79: coffset+=btr;
0000012A 9903 LDR R1,[R13,#0xC] ; btr
0000012C 9802 LDR R0,[R13,#0x8] ; coffset
0000012E 1840 ADD R0,R1
00000130 9002 STR R0,[R13,#0x8] ; coffset
80: bytes_read+=btr;
00000132 9800 LDR R0,[R13,#0x0] ; bytes_read
00000134 1840 ADD R0,R1
00000136 9000 STR R0,[R13,#0x0] ; bytes_read
81: size_left-=btr;
00000138 9801 LDR R0,[R13,#0x4] ; size_left
0000013A 1A40 SUB R0,R1
0000013C 9001 STR R0,[R13,#0x4] ; size_left
82: }
0000013E L_5:
ARM COMPILER V2.42, file 27/03/06 10:45:50 PAGE 13
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?