📄 f34x_msd_file_system.src
字号:
?C0022:
LCALL L?0223
SUBB A,#0BH
JNC ?C0023
; findinfo->direntry->sfn.name[i] = ' ';
; SOURCE LINE # 1068
MOV DPTR,#findinfo?144
LCALL L?0154
LCALL L?0175
MOV DPL,R7
MOV DPH,#00H
MOV A,#020H
LCALL L?0213
SJMP ?C0022
?C0023:
; for( j = 0; j < 20; j++ ) {
; SOURCE LINE # 1069
CLR A
MOV DPTR,#j?147
MOVX @DPTR,A
?C0025:
MOV DPTR,#j?147
MOVX A,@DPTR
MOV R7,A
CLR C
SUBB A,#014H
JNC ?C0026
; if(!filename[j] || filename[j] == '.')
; SOURCE LINE # 1070
MOV DPTR,#filename?145
LCALL L?0154
MOV DPL,R7
LCALL L?0162
MOV R7,A
JZ ?C0026
XRL A,#02EH
JZ ?C0026
; break;
; SOURCE LINE # 1071
?C0028:
; if( j < 8 )
; SOURCE LINE # 1072
MOV DPTR,#j?147
MOVX A,@DPTR
MOV R7,A
CLR C
SUBB A,#08H
JNC ?C0027
; findinfo->direntry->sfn.name[j] = toupper(filename[j]);
; SOURCE LINE # 1073
MOV DPL,R7
LCALL L?0162
MOV R7,A
LCALL _toupper
MOV DPTR,#findinfo?144
LCALL L?0154
LCALL L?0175
MOV DPTR,#j?147
MOVX A,@DPTR
MOV DPL,A
MOV DPH,#00H
MOV A,R7
LCALL ?C?CSTOPTR
; }
; SOURCE LINE # 1074
?C0027:
MOV DPTR,#j?147
MOVX A,@DPTR
INC A
MOVX @DPTR,A
SJMP ?C0025
?C0026:
; if( filename[j] == '.' ) {
; SOURCE LINE # 1075
MOV DPTR,#filename?145
LCALL L?0154
MOV DPTR,#j?147
LCALL L?0160
XRL A,#02EH
JNZ ?C0031
; for( i = 0; i < 3; i++ ) {
; SOURCE LINE # 1076
MOV DPTR,#i?146
MOVX @DPTR,A
?C0032:
LCALL L?0224
SUBB A,#03H
JNC ?C0031
; if(!filename[j+i+1] || filename[j+i+1]=='.')
; SOURCE LINE # 1077
INC DPTR
MOVX A,@DPTR
ADD A,R7
MOV R7,A
CLR A
RLC A
XCH A,R7
ADD A,#01H
XCH A,R7
ADDC A,#00H
MOV R6,A
MOV DPTR,#filename?145
LCALL L?0154
MOV DPL,R7
MOV DPH,R6
LCALL ?C?CLDOPTR
MOV R7,A
JZ ?C0031
XRL A,#02EH
JZ ?C0031
; break;
; SOURCE LINE # 1078
?C0035:
; findinfo->direntry->sfn.name[8+i] = toupper(filename[j+i+1]);
; SOURCE LINE # 1079
LCALL _toupper
MOV DPTR,#findinfo?144
LCALL L?0154
LCALL L?0175
MOV DPTR,#i?146
MOVX A,@DPTR
ADD A,#08H
MOV DPL,A
CLR A
RLC A
MOV DPH,A
MOV A,R7
; }
; SOURCE LINE # 1080
LCALL L?0213
SJMP ?C0032
; }
; SOURCE LINE # 1081
?C0031:
; //for(i=0;i<11;i++) findinfo->direntry->sfn.name[i]=
; //toupper(findinfo->direntry->sfn.name[i]);
;
; // Don't forget to set the attrib:
; findinfo->direntry->sfn.attrib = ATTRIB_ARCHIVE;
; SOURCE LINE # 1086
MOV DPTR,#findinfo?144
LCALL L?0154
LCALL L?0175
MOV DPTR,#0BH
MOV A,#020H
LCALL ?C?CSTOPTR
;
; // Write the new data to MMC
; Sect_Write(findinfo->block);
; SOURCE LINE # 1089
MOV DPTR,#findinfo?144
LCALL L?0154
LCALL ?C?LLDPTR
LCALL _Sect_Write
;
; return 1;
; SOURCE LINE # 1091
MOV R7,#01H
; }
; SOURCE LINE # 1092
?C0018:
RET
; END OF _fcreate
;
;
; static find_info xdata findinfo; // Shared find_info for fopen() and fdelete()
;
; int fopen(FILE* f,char* filename,char* mode)
RSEG ?PR?_fopen?F34X_MSD_FILE_SYSTEM
_fopen:
USING 0
; SOURCE LINE # 1097
MOV DPTR,#f?248
MOV A,R3
LCALL L?0165
; {
; SOURCE LINE # 1098
; f->isopen = 0;
; SOURCE LINE # 1099
MOV DPTR,#f?248
LCALL L?0154
MOV DPTR,#013H
CLR A
LCALL ?C?CSTOPTR
;
; if( mode[0] == 'w' ) {
; SOURCE LINE # 1101
MOV DPTR,#mode?250
LCALL L?0154
LCALL ?C?CLDPTR
CJNE A,#077H,?C0037
; fdelete(filename);
; SOURCE LINE # 1102
MOV DPTR,#filename?249
LCALL L?0154
LCALL _fdelete
; } // This is the most memory-efficient solution, not the most time-efficient solution.
; SOURCE LINE # 1103
?C0037:
;
; findfirst(&findinfo, 0);
; SOURCE LINE # 1105
LCALL L?0202
CLR A
MOV R5,A
LCALL _findfirst
?C0038:
; while(!file_name_match(filename,findinfo.direntry->sfn.name)) {
; SOURCE LINE # 1106
LCALL L?0163
MOV DPTR,#filename?249
LCALL L?0154
LCALL _file_name_match
MOV A,R7
JNZ ?C0039
; if(!findnext(&findinfo)) {
; SOURCE LINE # 1107
LCALL L?0202
LCALL _findnext
MOV A,R7
JNZ ?C0038
; if(mode[0] == 'r') {
; SOURCE LINE # 1108
MOV DPTR,#mode?250
LCALL L?0154
LCALL ?C?CLDPTR
MOV R5,A
CJNE A,#072H,?C0041
; return 0; // File not found.
; SOURCE LINE # 1109
CLR A
MOV R6,A
MOV R7,A
RET
; }
; SOURCE LINE # 1110
?C0041:
; if( mode[0] == 'w' || mode[0] == 'a' ) {
; SOURCE LINE # 1111
MOV A,R5
XRL A,#077H
JZ ?C0044
LCALL ?C?CLDPTR
CJNE A,#061H,?C0038
?C0044:
; if(!fcreate(&findinfo, filename)) {
; SOURCE LINE # 1112
MOV DPTR,#filename?249
LCALL L?0185
MOV DPTR,#?_fcreate?BYTE+03H
LCALL L?0164
LCALL L?0203
LCALL _fcreate
MOV A,R7
JNZ ?C0039
; return 0; // File cannot be created.
; SOURCE LINE # 1113
MOV R6,A
MOV R7,A
RET
; } else {
; SOURCE LINE # 1114
; break;
; SOURCE LINE # 1115
; }
; SOURCE LINE # 1116
; }
; SOURCE LINE # 1117
; }
; SOURCE LINE # 1118
; }
; SOURCE LINE # 1119
?C0039:
;
; f->sector_direntry=findinfo.block;
; SOURCE LINE # 1121
MOV DPTR,#findinfo
INC DPTR
LCALL L?0182
MOV DPTR,#f?248
LCALL L?0154
MOV DPTR,#06H
MOV A,R6
MOV B,R7
LCALL ?C?ISTOPTR
; f->offset_direntry=findinfo.offset;
; SOURCE LINE # 1122
MOV DPTR,#findinfo+04H
MOVX A,@DPTR
MOV R7,A
INC DPTR
MOVX A,@DPTR
MOV DPTR,#08H
XCH A,R7
MOV B,R7
LCALL ?C?ISTOPTR
; f->cluster_start=f->sector_current=
; SOURCE LINE # 1123
MOV DPTR,#findinfo+07H
LCALL L?0154
MOV DPTR,#01AH
LCALL L?0178
LCALL _htons
CLR A
MOV R4,A
MOV R5,A
MOV DPTR,#f?248
LCALL L?0154
LCALL L?0225
MOV A,R6
MOV B,R7
LCALL ?C?ISTPTR
; ntohs(findinfo.direntry->sfn.starting_cluster);//*MBR.sectors_per_cluster;
; f->attrib=findinfo.direntry->sfn.attrib;
; SOURCE LINE # 1125
MOV DPTR,#findinfo+07H
LCALL L?0154
LCALL L?0227
MOV R7,A
MOV DPTR,#f?248
LCALL L?0154
MOV DPTR,#0AH
MOV A,R7
LCALL ?C?CSTOPTR
; f->size=ntohl(findinfo.direntry->sfn.filesize);
; SOURCE LINE # 1126
MOV DPTR,#findinfo+07H
LCALL L?0154
MOV DPTR,#01CH
LCALL ?C?LLDOPTR
LCALL _htonl
MOV DPTR,#f?248
LCALL L?0154
MOV DPTR,#0FH
LCALL ?C?LSTOPTR
;
; if(mode[0]=='a') f->pos=f->size; else f->pos=0;
; SOURCE LINE # 1128
MOV DPTR,#mode?250
LCALL L?0154
LCALL ?C?CLDPTR
MOV DPTR,#f?248
CJNE A,#061H,?C0047
LCALL L?0154
LCALL L?0188
MOV DPTR,#0BH
LCALL ?C?LSTOPTR
SJMP ?C0048
?C0047:
LCALL L?0154
MOV DPTR,#0BH
LCALL ?C?LSTKOPTR
DB 00H
DB 00H
DB 00H
DB 00H
?C0048:
; // Print_File(f);
; return f->isopen=1;
; SOURCE LINE # 1130
MOV DPTR,#f?248
LCALL L?0154
MOV DPTR,#013H
MOV A,#01H
LCALL ?C?CSTOPTR
MOV R6,#00H
MOV R7,#01H
; }
; SOURCE LINE # 1131
?C0042:
RET
; END OF _fopen
;
; /*
; int fexists(char* filename) {
; FILE xdata f;
; if(fopen(&f,filename,"r")) {
; fclose(&f);
; return 1;
; }
; return 0;
; }
; */
;
; /*
; int fseek(FILE* f,long offset,int origin) {
; if(!f->isopen) return 0;
; switch(origin) {
; case SEEK_SET:default:
; if(offset>=0)
; f->pos=offset;
; else
; return 0;
; break;
; case SEEK_END:
; f->pos=f->size+offset;
; break;
; case SEEK_CUR:
; f->pos+=offset;
; break;
; }
;
; return 1;
; }
; */
;
; /*
; DWORD ftell(FILE* f) {
; if(!f->isopen) return 0;
; return f->pos;
; }
; */
;
; int feof(FILE* f)
RSEG ?PR?_feof?F34X_MSD_FILE_SYSTEM
_feof:
USING 0
; SOURCE LINE # 1173
;---- Variable 'f?351' assigned to Register 'R1/R2/R3' ----
; {
; SOURCE LINE # 1174
; if(!f->isopen) return 1;
; SOURCE LINE # 1175
LCALL L?0229
JNZ ?C0049
MOV R6,A
MOV R7,#01H
RET
?C0049:
; return f->pos >= f->size;
; SOURCE LINE # 1176
LCALL L?0188
LCALL L?0193
CLR C
LCALL ?C?ULCMP
MOV R6,#00H
JC ?C0051
MOV R7,#01H
SJMP ?C0052
?C0051:
MOV R7,#00H
?C0052:
; }
; SOURCE LINE # 1177
?C0050:
RET
; END OF _feof
;
; // Find the 'nr'-th sector in the fat chain starting at 'from'
; static unsigned long fat_chain(unsigned long from,unsigned nr)
RSEG ?PR?_fat_chain?F34X_MSD_FILE_SYSTEM
_fat_chain:
USING 0
; SOURCE LINE # 1180
LCALL L?0215
; {
; SOURCE LINE # 1181
; unsigned* xdata fat_table=Scratch;
; SOURCE LINE # 1182
MOV DPTR,#fat_table?454
; unsigned xdata sect,sect_prev=0;
; SOURCE LINE # 1183
LCALL L?0191
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
; unsigned xdata cluster = nr/MBR.sectors_per_cluster;
; SOURCE LINE # 1184
LCALL L?0195
MOV DPTR,#cluster?457
MOV A,R6
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
?C0053:
;
; while(cluster) {
; SOURCE LINE # 1186
MOV DPTR,#cluster?457
MOVX A,@DPTR
JNZ ?C0132
INC DPTR
MOVX A,@DPTR
?C0132:
JNZ $ + 5H
LJMP ?C0054
; sect = Sect_Fat1() + from/(Sect_Block_Size()/2);
; SOURCE LINE # 1187
LCALL Sect_Fat1
MOV A,R6
PUSH ACC
MOV A,R7
PUSH ACC
CLR A
MOV R3,A
MOV R2,#01H
MOV R1,A
MOV R0,A
LCALL L?0179
LCALL ?C?ULDIV
POP ACC
ADD A,R7
MOV R7,A
POP ACC
ADDC A,R6
MOV R6,A
;---- Variable 'sect?455' assigned to Register 'R6/R7' ----
; if(sect!=sect_prev) {
; SOURCE LINE # 1188
MOV DPTR,#sect_prev?456
MOVX A,@DPTR
XRL A,R6
JNZ ?C0133
INC DPTR
MOVX A,@DPTR
XRL A,R7
?C0133:
JZ ?C0055
; Sect_Read(sect_prev=sect);
; SOURCE LINE # 1189
MOV DPTR,#sect_prev?456
MOV A,R6
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
CLR A
MOV R4,A
MOV R5,A
LCALL _Sect_Read
; }
; SOURCE LINE # 1190
?C0055:
;
; from=ntohs(fat_table[from%(Sect_Block_Size()/2)]);
; SOURCE LINE # 1192
MOV DPTR,#from?452
INC DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -