📄 f34x_msd_sect_serv.src
字号:
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#MBR+0FH
MOVX A,@DPTR
ADD A,R7
MOV R7,A
MOV DPTR,#MBR+0EH
MOVX A,@DPTR
ADDC A,R6
MOV R6,A
RET
L?0055:
USING 0
MOV R4,A
L?0056:
MOV DPTR,#sector?647
LJMP ?C?LSTXDATA
L?0057:
USING 0
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (Scratch)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (Scratch)
MOVX @DPTR,A
RET
; END OF Com0026
; void Sect_Validate(void) reentrant
RSEG ?PR?_?Sect_Validate?F34X_MSD_SECT_SERV
_?Sect_Validate:
USING 0
; SOURCE LINE # 78
MOV DPTR,#0FFFBH
LCALL ?C?ADDXBP
; {
; unsigned fat_sec = 0;
; SOURCE LINE # 80
LCALL L?0052
CLR A
MOVX @DPTR,A
INC DPTR
;
; bootrecord_large* bootrecord=Scratch;
; SOURCE LINE # 82
LCALL L?0051
INC DPTR
INC DPTR
INC A
LCALL L?0057
; MBR.valid=0;
; SOURCE LINE # 83
CLR A
MOV DPTR,#MBR
MOVX @DPTR,A
; MBR.hidden_sectors = 0;
; SOURCE LINE # 84
MOV DPTR,#MBR+0EH
MOVX @DPTR,A
INC DPTR
;
; if((bootrecord->signature[0]!=0x55) || (bootrecord->signature[1]!=0xAA)) {
; SOURCE LINE # 86
LCALL L?0041
MOV DPTR,#01FEH
LCALL ?C?CLDOPTR
XRL A,#055H
JZ $ + 5H
LJMP ?C0003
MOV DPTR,#01FFH
LCALL ?C?CLDOPTR
XRL A,#0AAH
JZ $ + 5H
LJMP ?C0003
; return;
; }
; SOURCE LINE # 88
?C0001:
; if(PHYSICAL_BLOCK_SIZE != ntohs(bootrecord->bytes_per_sector)) {
; SOURCE LINE # 89
MOV DPTR,#0BH
LCALL L?0049
MOV A,R7
JNZ ?C0035
MOV A,R6
XRL A,#02H
?C0035:
JZ $ + 5H
LJMP ?_?Sect_Validate?Check_MBR
; goto Check_MBR;
; SOURCE LINE # 90
; }
; SOURCE LINE # 91
?C0004:
; if(bootrecord->filesystem[0]!='F' || bootrecord->filesystem[1]!='A' || bootrecord->filesystem[2]!='T' || bootrecord->filesystem[3]!='1' || bootrecord->filesystem[4]!='6') {
; SOURCE LINE # 92
LCALL L?0042
MOV DPTR,#036H
LCALL ?C?CLDOPTR
XRL A,#046H
JZ $ + 5H
LJMP ?_?Sect_Validate?Check_MBR
MOV DPTR,#037H
LCALL ?C?CLDOPTR
XRL A,#041H
JZ $ + 5H
LJMP ?_?Sect_Validate?Check_MBR
MOV DPTR,#038H
LCALL ?C?CLDOPTR
XRL A,#054H
JNZ ?_?Sect_Validate?Check_MBR
MOV DPTR,#039H
LCALL ?C?CLDOPTR
XRL A,#031H
JNZ ?_?Sect_Validate?Check_MBR
MOV DPTR,#03AH
LCALL ?C?CLDOPTR
XRL A,#036H
JNZ ?_?Sect_Validate?Check_MBR
; goto Check_MBR;
; SOURCE LINE # 93
; }
; SOURCE LINE # 94
?C0006:
;
; // Make a permanent copy of the important fields of the bootrecord:
; MBR.fat_copies = bootrecord->fat_copies;
; SOURCE LINE # 97
MOV DPTR,#010H
LCALL ?C?CLDOPTR
MOV DPTR,#MBR+01H
MOVX @DPTR,A
; MBR.root_directory_entries = ntohs(bootrecord->root_directory_entries);
; SOURCE LINE # 98
MOV DPTR,#011H
LCALL L?0049
MOV DPTR,#MBR+02H
; MBR.number_of_sectors = ntohs(bootrecord->number_of_sectors);
; SOURCE LINE # 99
LCALL L?0039
MOV DPTR,#013H
LCALL L?0054
MOV DPTR,#MBR+04H
; MBR.sectors_per_fat = ntohs(bootrecord->sectors_per_fat);
; SOURCE LINE # 100
LCALL L?0039
MOV DPTR,#016H
LCALL L?0054
MOV DPTR,#MBR+06H
; MBR.total_sectors = ntohl(bootrecord->total_sectors);
; SOURCE LINE # 101
LCALL L?0040
MOV DPTR,#020H
LCALL ?C?LLDOPTR
LCALL _htonl
MOV DPTR,#MBR+08H
LCALL ?C?LSTXDATA
; MBR.reserved_sectors = ntohs(bootrecord->reserved_sectors);
; SOURCE LINE # 102
LCALL L?0042
MOV DPTR,#0EH
LCALL ?C?ILDOPTR
MOV R7,A
MOV R6,B
LCALL _htons
MOV DPTR,#MBR+0CH
; MBR.sectors_per_cluster = bootrecord->sectors_per_cluster;
; SOURCE LINE # 103
LCALL L?0040
MOV DPTR,#0DH
LCALL ?C?CLDOPTR
MOV DPTR,#MBR+010H
MOVX @DPTR,A
; MBR.valid=1;
; SOURCE LINE # 104
MOV DPTR,#MBR
MOV A,#01H
MOVX @DPTR,A
SJMP ?C0003
; return;
; Check_MBR:
; SOURCE LINE # 106
?_?Sect_Validate?Check_MBR:
; // checks if this sector is not a MBR
; if((Scratch[0x1Be] == 0x80) || (Scratch[0x1Be] == 0x00)) {
; SOURCE LINE # 108
MOV DPTR,#Scratch+01BEH
MOVX A,@DPTR
MOV R7,A
XRL A,#080H
JZ ?C0009
MOV A,R7
JNZ ?C0003
?C0009:
; // partition is active
; fat_sec = *(unsigned*)&Scratch[0x1c6];
; SOURCE LINE # 110
MOV DPTR,#Scratch+01C6H
MOVX A,@DPTR
MOV R7,A
INC DPTR
MOVX A,@DPTR
LCALL L?0052
XCH A,R7
; fat_sec = ntohs(fat_sec);
; SOURCE LINE # 111
LCALL L?0050
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL _htons
LCALL L?0052
MOV A,R6
; Sect_Read(fat_sec);
; SOURCE LINE # 112
LCALL L?0050
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
CLR A
MOV R4,A
MOV R5,A
LCALL _Sect_Read
; Sect_Validate();
; SOURCE LINE # 113
LCALL _?Sect_Validate
; MBR.hidden_sectors = fat_sec;
; SOURCE LINE # 114
LCALL L?0052
MOVX A,@DPTR
MOV R7,A
INC DPTR
MOVX A,@DPTR
MOV DPTR,#MBR+0EH
XCH A,R7
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
; }
; SOURCE LINE # 115
; }
; SOURCE LINE # 116
?C0003:
MOV DPTR,#05H
LJMP ?C?ADDXBP
L?0049:
LCALL ?C?ILDOPTR
MOV R7,A
MOV R6,B
LCALL _htons
RET
L?0054:
LCALL ?C?ILDOPTR
MOV R7,A
MOV R6,B
LCALL _htons
RET
; END OF _?Sect_Validate
;
; //----------------------------------------------------------------------------
; // Sect_Init
; //----------------------------------------------------------------------------
; //
; // Function initializes memory card (Compact Flash or MMC), reads sector 0 and
; // checks the validate of bootrecord.
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; void Sect_Init(void)
RSEG ?PR?Sect_Init?F34X_MSD_SECT_SERV
Sect_Init:
USING 0
; SOURCE LINE # 129
; {
; SOURCE LINE # 130
; unsigned char xdata time_out = 0;
; SOURCE LINE # 131
CLR A
MOV DPTR,#time_out?140
MOVX @DPTR,A
; #ifdef __F340_VER__
; int xdata sizel,sizeh;
; Is_Compact_Flash = 0;
; if(Init_CF() != CF_NO_CARD) {
; if(Identify_Drive(Scratch)!= CF_NO_CARD)
; {
; Is_Compact_Flash = 1;
; sizel = (Scratch[115] << 8) | Scratch[114];
; sizeh = (Scratch[117] << 8) | Scratch[116];
; PHYSICAL_BLOCKS = ((unsigned long)sizeh << 16 ) | (sizel&0x0ffff);
; }
; }
; if(!Is_Compact_Flash) {
; #else
; Is_Compact_Flash = 0;
; SOURCE LINE # 146
MOV DPTR,#Is_Compact_Flash
MOVX @DPTR,A
; #endif
; MMC_FLASH_Init();
; SOURCE LINE # 148
LCALL MMC_FLASH_Init
; #ifdef __F340_VER__
; }
; #endif
; Sect_Read(0);
; SOURCE LINE # 152
MOV R7,#00H
MOV R6,#00H
MOV R5,#00H
MOV R4,#00H
LCALL _Sect_Read
; Sect_Validate();
; SOURCE LINE # 153
LJMP _?Sect_Validate
; END OF Sect_Init
; }
;
;
; //----------------------------------------------------------------------------
; // Sect_Sectors
; //----------------------------------------------------------------------------
; //
; // Returns number of sectors.
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; unsigned long Sect_Sectors(void)
RSEG ?PR?Sect_Sectors?F34X_MSD_SECT_SERV
Sect_Sectors:
USING 0
; SOURCE LINE # 167
; {
; SOURCE LINE # 168
; return PHYSICAL_BLOCKS;//MBR.number_of_sectors;
; SOURCE LINE # 169
MOV DPTR,#PHYSICAL_BLOCKS
LCALL L?0048
; }
; SOURCE LINE # 170
?C0011:
RET
; END OF Sect_Sectors
;
;
; //----------------------------------------------------------------------------
; // Sect_Print
; //----------------------------------------------------------------------------
; //
; // Dumps some information (size, bootrecord, filesystem, etc.)
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; void Sect_Print(void)
RSEG ?PR?Sect_Print?F34X_MSD_SECT_SERV
Sect_Print:
USING 0
; SOURCE LINE # 183
; {
; SOURCE LINE # 184
; bootrecord_large* xdata bootrecord=Scratch;
; SOURCE LINE # 185
MOV DPTR,#bootrecord?341
MOV A,#01H
LCALL L?0057
; if(!MBR.valid) {
; SOURCE LINE # 186
MOV DPTR,#MBR
MOVX A,@DPTR
JNZ ?C0012
; printf("ERROR: Bootrecord invalid." ENDLINE);
; SOURCE LINE # 187
MOV R3,#0FFH
MOV R2,#HIGH (?SC_0)
MOV R1,#LOW (?SC_0)
SJMP ?C0037
; return;
; }
; SOURCE LINE # 189
?C0012:
;
; printf("%s size = %lu bytes" ENDLINE,Is_Compact_Flash ? "CF memory" : "Memory", (DWORD)Sect_Sectors()*Sect_Block_Size());
; SOURCE LINE # 191
LCALL Sect_Sectors
CLR A
MOV R3,A
MOV R2,#02H
MOV R1,A
MOV R0,A
LCALL ?C?LMUL
MOV DPTR,#?_printf?BYTE+06H
LCALL ?C?LSTXDATA
MOV DPTR,#Is_Compact_Flash
MOVX A,@DPTR
MOV R3,#0FFH
JZ ?C0014
MOV R2,#HIGH (?SC_51)
MOV R1,#LOW (?SC_51)
SJMP ?C0015
?C0014:
MOV R2,#HIGH (?SC_61)
MOV R1,#LOW (?SC_61)
?C0015:
MOV DPTR,#?_printf?BYTE+03H
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
MOV R3,#0FFH
MOV R2,#HIGH (?SC_29)
MOV R1,#LOW (?SC_29)
?C0037:
LCALL _printf
;
; }
; SOURCE LINE # 193
?C0013:
RET
; END OF Sect_Print
;
; //----------------------------------------------------------------------------
; // Sect_Read
; //----------------------------------------------------------------------------
; //
; // Reads one sector into Scratch buffer
; //
; // Parameters : sector - sector's number
; // Return Value : error number
; //----------------------------------------------------------------------------
;
; unsigned Sect_Read(unsigned long sector)
RSEG ?PR?_Sect_Read?F34X_MSD_SECT_SERV
_Sect_Read:
USING 0
; SOURCE LINE # 205
MOV DPTR,#sector?442
LCALL ?C?LSTXDATA
; {
; SOURCE LINE # 206
; unsigned xdata error;
; #ifdef __F340_VER__
; if(!Is_Compact_Flash) {
; #endif
; unsigned char xdata loopguard = 0;
; SOURCE LINE # 211
CLR A
MOV DPTR,#loopguard?444
MOVX @DPTR,A
?C0016:
; while((error = MMC_FLASH_Block_Read(sector+HIDDEN_SECTORS,Scratch)) != 0)
; SOURCE LINE # 212
MOV DPTR,#sector?442
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -