📄 f34x_msd_cf_basic_functions.src
字号:
USING 0
; SOURCE LINE # 119
; {
; SOURCE LINE # 120
?C0019:
; xdata char wait, wait_bsy;
; do {
; SOURCE LINE # 122
; #ifndef MACRO_CF_VERSIONS
; wait = CF_GET_REGISTER_VALUE(0x07); // Read status register
; SOURCE LINE # 124
MOV R7,#07H
LCALL _CF_GET_REGISTER_VALUE
;---- Variable 'wait?246' assigned to Register 'R7' ----
; #else
; CF_GET_REGISTER_VALUE(0x07,wait); // Read status register
; #endif
; wait_bsy = wait & 0x80; // Wait for DRQ to SET
; SOURCE LINE # 128
MOV A,R7
ANL A,#080H
MOV R6,A
;---- Variable 'wait_bsy?247' assigned to Register 'R6' ----
; } while (wait_bsy == (char)0x80);
; SOURCE LINE # 129
XRL A,#080H
JZ ?C0019
; }
; SOURCE LINE # 130
RET
; END OF Wait_Busy
;
;
; //----------------------------------------------------------------------------
; // Dtct_Card
; //----------------------------------------------------------------------------
; //
; // Function detcts if compact flash card is in slot
; //
; // Parameters :
; // Return Value : 0 card is on , 1 off
; //----------------------------------------------------------------------------
;
; char Dtct_Card(void)
RSEG ?PR?Dtct_Card?F34X_MSD_CF_BASIC_FUNCTIONS
Dtct_Card:
USING 0
; SOURCE LINE # 143
; {
; SOURCE LINE # 144
; xdata char card_detect;
; card_detect = CF_CD1;
; SOURCE LINE # 146
MOV C,CF_CD1
CLR A
RLC A
MOV R7,A
;---- Variable 'card_detect?348' assigned to Register 'R7' ----
; return (card_detect); // 0 card is on , 1 off
; SOURCE LINE # 147
; }
; SOURCE LINE # 148
?C0021:
RET
; END OF Dtct_Card
;
; #ifndef MACRO_CF_VERSIONS
;
; //----------------------------------------------------------------------------
; // CF_GET_REGISTER_VALUE
; //----------------------------------------------------------------------------
; //
; // Function returns value from register pointed by addr
; //
; // Parameters : addr - address value of CF register
; // Return Value : value stroed in register
; //----------------------------------------------------------------------------
;
; char CF_GET_REGISTER_VALUE(char addr)
RSEG ?PR?_CF_GET_REGISTER_VALUE?F34X_MSD_CF_BASIC_FUNCTIONS
L?0054:
USING 0
L?0055:
MOV R7,#07H
LCALL _CF_SET_REGISTER_VALUE
MOV R7,#01H
_CF_GET_REGISTER_VALUE:
USING 0
; SOURCE LINE # 162
;---- Variable 'addr?449' assigned to Register 'R7' ----
; {
; SOURCE LINE # 163
; xdata char ret = 0;
; SOURCE LINE # 164
;---- Variable 'ret?450' assigned to Register 'R6' ----
; CF_SET_ADDR_LINE(addr);
; SOURCE LINE # 165
LCALL L?0062
; CF_READ;
; SOURCE LINE # 166
CLR A
MOV P4MDOUT,A
MOV P4,#0FFH
SETB CF_WE
CLR CF_OE
; CF_WAIT_STATE;
; SOURCE LINE # 167
NOP
NOP
NOP
; ret = CF_READ_DATA;
; SOURCE LINE # 168
MOV R6,P4
; CF_READWRITE_IDLE;
; SOURCE LINE # 169
LCALL L?0065
; return ret;
; SOURCE LINE # 170
XCH A,R7
MOV A,R6
XCH A,R7
; }
; SOURCE LINE # 171
?C0022:
RET
; END OF _CF_GET_REGISTER_VALUE
;
;
; //----------------------------------------------------------------------------
; // CF_SET_REGISTER_VALUE
; //----------------------------------------------------------------------------
; //
; // Function sets value of register
; //
; // Parameters : addr - register address
; // value - value to set
; // Return Value :
; //----------------------------------------------------------------------------
;
; void CF_SET_REGISTER_VALUE(char addr, char value)
RSEG ?PR?_CF_SET_REGISTER_VALUE?F34X_MSD_CF_BASIC_FUNCTIONS
L?0053:
USING 0
MOV R5,#01H
MOV R7,#02H
LCALL _CF_SET_REGISTER_VALUE
XCH A,R7
MOV A,R1
XCH A,R7
XCH A,R5
MOV A,R7
XCH A,R5
MOV R7,#03H
_CF_SET_REGISTER_VALUE:
USING 0
; SOURCE LINE # 185
;---- Variable 'value?552' assigned to Register 'R5' ----
;---- Variable 'addr?551' assigned to Register 'R7' ----
; {
; SOURCE LINE # 186
; CF_SET_ADDR_LINE(addr);
; SOURCE LINE # 187
LCALL L?0062
; CF_WR_DATA(value);
; SOURCE LINE # 188
MOV P4MDOUT,#0FFH
XCH A,R7
MOV A,R5
XCH A,R7
MOV P4,R7
; CF_WRITE;
; SOURCE LINE # 189
SETB CF_OE
CLR CF_WE
; CF_WAIT_STATE;
; SOURCE LINE # 190
NOP
NOP
NOP
; CF_READWRITE_IDLE;
; SOURCE LINE # 191
CLR A
LCALL L?0065
; }
; SOURCE LINE # 192
RET
; END OF _CF_SET_REGISTER_VALUE
; #endif
;
; //----------------------------------------------------------------------------
; // Write_Sector
; //----------------------------------------------------------------------------
; //
; // Function writes buffer into address
; //
; // Parameters : address - LBA address
; // buffer - buffer with data to write
; // Return Value : return error status or 0 if everything was OK
; //----------------------------------------------------------------------------
;
; char Write_Sector(unsigned long address, char* buffer)
RSEG ?PR?_Write_Sector?F34X_MSD_CF_BASIC_FUNCTIONS
_Write_Sector:
USING 0
; SOURCE LINE # 206
MOV DPTR,#address?653
LCALL ?C?LSTXDATA
MOV DPTR,#buffer?654
; {
; SOURCE LINE # 207
; xdata char cylinder_low, cylinder_high,sector,head;
; xdata char result, error;
; xdata int i;
; result = Dtct_Card();
; SOURCE LINE # 211
;---- Variable 'result?659' assigned to Register 'R7' ----
; if (result == 1) return (CF_NO_CARD);
; SOURCE LINE # 212
LCALL L?0051
CJNE A,#01H,?C0024
MOV R7,#01H
RET
?C0024:
;
; Led2=1;
; SOURCE LINE # 214
SETB Led2
; sector = address & 0xff;
; SOURCE LINE # 215
MOV DPTR,#address?653
LCALL L?0048
;---- Variable 'sector?657' assigned to Register 'R1' ----
; cylinder_low = (address >> 8 ) & 0x0FF;
; SOURCE LINE # 216
MOV DPTR,#address?653
LCALL L?0059
;---- Variable 'cylinder_low?655' assigned to Register 'R3' ----
; cylinder_high = (address >> 16) & 0xff;
; SOURCE LINE # 217
MOV DPTR,#address?653
LCALL L?0047
;---- Variable 'cylinder_high?656' assigned to Register 'R2' ----
LCALL L?0066
; head = (address >> 24) & 0x0f;
; SOURCE LINE # 218
MOV DPTR,#address?653
LCALL L?0048
LCALL L?0063
;---- Variable 'head?658' assigned to Register 'R6' ----
XCH A,R6
MOV A,R7
XCH A,R6
;
;
; CF_SET_REGISTER_VALUE(2,0x01);
; SOURCE LINE # 221
; CF_SET_REGISTER_VALUE(3,sector);
; SOURCE LINE # 222
LCALL L?0053
; CF_SET_REGISTER_VALUE(4,cylinder_low);
; SOURCE LINE # 223
XCH A,R5
MOV A,R3
XCH A,R5
MOV R7,#04H
LCALL _CF_SET_REGISTER_VALUE
; CF_SET_REGISTER_VALUE(5,cylinder_high);
; SOURCE LINE # 224
XCH A,R5
MOV A,R2
XCH A,R5
MOV R7,#05H
LCALL _CF_SET_REGISTER_VALUE
; CF_SET_REGISTER_VALUE(6,(0xE0 | head));
; SOURCE LINE # 225
MOV A,R6
LCALL L?0060
; CF_SET_REGISTER_VALUE(7,0x30);
; SOURCE LINE # 226
MOV R5,#030H
;
; error = CF_GET_REGISTER_VALUE(1);
; SOURCE LINE # 228
LCALL L?0054
MOV DPTR,#error?660
MOV A,R7
MOVX @DPTR,A
;
; Wait_Drq(); // Wait for DRQ
; SOURCE LINE # 230
LCALL Wait_Drq
; Wait_Busy();
; SOURCE LINE # 231
LCALL Wait_Busy
;
; for(i=0;i<PHYSICAL_BLOCK_SIZE;i++) {
; SOURCE LINE # 233
CLR A
MOV DPTR,#i?661
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
?C0026:
MOV DPTR,#i?661
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
CLR C
MOV A,R6
XRL A,#080H
SUBB A,#082H
JNC ?C0027
; CF_SET_REGISTER_VALUE(0,buffer[i]);
; SOURCE LINE # 234
MOV DPTR,#buffer?654
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPL,R7
MOV DPH,R6
LCALL ?C?CLDOPTR
MOV R5,A
CLR A
MOV R7,A
LCALL _CF_SET_REGISTER_VALUE
; }
; SOURCE LINE # 235
MOV DPTR,#i?661+01H
MOVX A,@DPTR
INC A
MOVX @DPTR,A
JNZ ?C0041
MOV DPTR,#i?661
MOVX A,@DPTR
INC A
MOVX @DPTR,A
?C0041:
SJMP ?C0026
?C0027:
;
; Wait_Busy();
; SOURCE LINE # 237
LCALL Wait_Busy
; #ifndef MACRO_CF_VERSIONS
; error = CF_GET_REGISTER_VALUE(1);
; SOURCE LINE # 239
MOV R7,#01H
LCALL _CF_GET_REGISTER_VALUE
MOV DPTR,#error?660
MOV A,R7
MOVX @DPTR,A
; #else
; CF_GET_REGISTER_VALUE(1,error);
; #endif
; Led2=0;
; SOURCE LINE # 243
CLR Led2
; return(error);
; SOURCE LINE # 244
; }
; SOURCE LINE # 245
?C0025:
RET
; END OF _Write_Sector
;
;
; //----------------------------------------------------------------------------
; // Read_Sector
; //----------------------------------------------------------------------------
; //
; // Function reads buffer from address
; //
; // Parameters : address - LBA address
; // buffer - buffer with data to write
; // Return Value : return error status or 0 if everything was OK
; //----------------------------------------------------------------------------
;
; char Read_Sector(unsigned long address, char* buffer)
RSEG ?PR?_Read_Sector?F34X_MSD_CF_BASIC_FUNCTIONS
_Read_Sector:
USING 0
; SOURCE LINE # 259
MOV DPTR,#address?762
LCALL ?C?LSTXDATA
MOV DPTR,#buffer?763
; {
; SOURCE LINE # 260
; xdata char cylinder_low, cylinder_high,sector,head;
; xdata char result, error;
; xdata int i;
; result = Dtct_Card();
; SOURCE LINE # 264
;---- Variable 'result?768' assigned to Register 'R7' ----
; if (result == 1) return (CF_NO_CARD);
; SOURCE LINE # 265
LCALL L?0051
CJNE A,#01H,?C0029
MOV R7,#01H
RET
?C0029:
; Led1 = 1;
; SOURCE LINE # 266
SETB Led1
; sector = address & 0xff;
; SOURCE LINE # 267
MOV DPTR,#address?762
LCALL L?0048
;---- Variable 'sector?766' assigned to Register 'R1' ----
; cylinder_low = (address >> 8 ) & 0x0FF;
; SOURCE LINE # 268
MOV DPTR,#address?762
LCALL L?0059
;---- Variable 'cylinder_low?764' assigned to Register 'R3' ----
; cylinder_high = (address >> 16) & 0xff;
; SOURCE LINE # 269
MOV DPTR,#address?762
LCALL L?0047
;---- Variable 'cylinder_high?765' assigned to Register 'R2' ----
LCALL L?0066
; head = (address >> 24) & 0x0f;
; SOURCE LINE # 270
MOV DPTR,#address?762
LCALL L?0048
LCALL L?0063
;---- Variable 'head?767' assigned to Register 'R4' ----
XCH A,R4
MOV A,R7
XCH A,R4
;
; error = CF_GET_REGISTER_VALUE(1);
; SOURCE LINE # 272
LCALL L?0056
;
; CF_SET_REGISTER_VALUE(2,0x01);
; SOURCE LINE # 274
; CF_SET_REGISTER_VALUE(3,sector);
; SOURCE LINE # 275
LCALL L?0053
; CF_SET_REGISTER_VALUE(4,cylinder_low);
; SOURCE LINE # 276
XCH A,R7
MOV A,R3
XCH A,R7
XCH A,R5
MOV A,R7
XCH A,R5
MOV R7,#04H
LCALL _CF_SET_REGISTER_VALUE
; CF_SET_REGISTER_VALUE(5,cylinder_high);
; SOURCE LINE # 277
XCH A,R7
MOV A,R2
XCH A,R7
XCH A,R5
MOV A,R7
XCH A,R5
MOV R7,#05H
LCALL _CF_SET_REGISTER_VALUE
; CF_SET_REGISTER_VALUE(6,(0xE0 | head));
; SOURCE LINE # 278
XCH A,R7
MOV A,R4
XCH A,R7
MOV A,R7
LCALL L?0060
; CF_SET_REGISTER_VALUE(7,0x20);
; SOURCE LINE # 279
MOV R5,#020H
;
; error = CF_GET_REGISTER_VALUE(1);
; SOURCE LINE # 281
LCALL L?0054
MOV A,R7
MOVX @DPTR,A
;
; Wait_Drq(); // Wait for DRQ
; SOURCE LINE # 283
LCALL Wait_Drq
;
; #ifndef MACRO_CF_VERSIONS
; error = CF_GET_REGISTER_VALUE(1);
; SOURCE LINE # 286
LCALL L?0056
; #else
; CF_GET_REGISTER_VALUE(1,error);
; #endif
;
;
;
; for(i=0;i<PHYSICAL_BLOCK_SIZE;i++) {
; SOURCE LINE # 293
;---- Variable 'i?770' assigned to Register 'R4/R5' ----
CLR A
MOV R5,A
MOV R4,A
?C0031:
; #ifndef MACRO_CF_VERSIONS
; buffer[i] = CF_GET_REGISTER_VALUE(0);
; SOURCE LINE # 295
CLR A
MOV R7,A
LCALL _CF_GET_REGISTER_VALUE
MOV DPTR,#buffer?763
; #else
; CF_GET_REGISTER_VALUE(0,buffer[i]);
; #endif
; }
; SOURCE LINE # 299
LCALL L?0058
CJNE R5,#00H,?C0042
INC R4
?C0042:
MOV A,R5
JNZ ?C0043
MOV A,R4
XRL A,#02H
?C0043:
JNZ ?C0031
?C0032:
; Wait_Busy();
; SOURCE LINE # 300
LCALL Wait_Busy
; #ifndef MACRO_CF_VERSIONS
; error = CF_GET_REGISTER_VALUE(1);
; SOURCE LINE # 302
LCALL L?0057
; #else
; CF_GET_REGISTER_VALUE(1,error);
; #endif
; Led1 = 0;
; SOURCE LINE # 306
CLR Led1
; return(error);
; SOURCE LINE # 307
; }
; SOURCE LINE # 308
?C0030:
RET
; END OF _Read_Sector
;
; //----------------------------------------------------------------------------
; // Identify_Drive
; //----------------------------------------------------------------------------
; //
; // This function reads identifier from card
; //
; // Parameters : buffer - buffer on data from CF
; // Return Value : error number if occurs
; //----------------------------------------------------------------------------
;
; char Identify_Drive(char* buffer)
RSEG ?PR?_Identify_Drive?F34X_MSD_CF_BASIC_FUNCTIONS
_Identify_Drive:
USING 0
; SOURCE LINE # 320
MOV DPTR,#buffer?871
; {
; SOURCE LINE # 321
; xdata char error,result;
; xdata int i;
;
; result = Dtct_Card();
; SOURCE LINE # 325
;---- Variable 'result?873' assigned to Register 'R7' ----
; if (result == 1) return (CF_NO_CARD);
; SOURCE LINE # 326
LCALL L?0052
CJNE A,#01H,?C0036
MOV R7,#01H
RET
?C0036:
;
; while(((error = CF_GET_REGISTER_VALUE(1)) & 0xF0) != 0);
; SOURCE LINE # 328
LCALL L?0064
MOV A,R7
ANL A,#0F0H
JNZ ?C0036
?C0037:
;
;
; CF_SET_REGISTER_VALUE(6,0);
; SOURCE LINE # 331
CLR A
LCALL L?0061
; CF_SET_REGISTER_VALUE(7,0xEC);
; SOURCE LINE # 332
MOV R5,#0ECH
;
; error = CF_GET_REGISTER_VALUE(1);
; SOURCE LINE # 334
LCALL L?0055
MOV DPTR,#error?872
MOV A,R7
MOVX @DPTR,A
;
;
; Wait_Drq();
; SOURCE LINE # 337
LCALL Wait_Drq
; for (i = 0; i < PHYSICAL_BLOCK_SIZE; i++) {
; SOURCE LINE # 338
;---- Variable 'i?874' assigned to Register 'R4/R5' ----
CLR A
MOV R5,A
MOV R4,A
?C0038:
; #ifndef MACRO_CF_VERSIONS
; *(buffer + i) = CF_GET_REGISTER_VALUE(0);
; SOURCE LINE # 340
CLR A
MOV R7,A
LCALL _CF_GET_REGISTER_VALUE
MOV DPTR,#buffer?871
; #else
; CF_GET_REGISTER_VALUE(0,*(buffer + i));
; #endif
; }
; SOURCE LINE # 344
LCALL L?0058
CJNE R5,#00H,?C0044
INC R4
?C0044:
MOV A,R5
JNZ ?C0045
MOV A,R4
XRL A,#02H
?C0045:
JNZ ?C0038
?C0039:
; #ifndef MACRO_CF_VERSIONS
; error = CF_GET_REGISTER_VALUE(1);
; SOURCE LINE # 346
LCALL L?0064
; #else
; CF_GET_REGISTER_VALUE(1,error);
; #endif
; return error;
; SOURCE LINE # 350
; } ; SOURCE LINE # 351
?C0035:
RET
; END OF _Identify_Drive
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -