📄 mmc.lst
字号:
0382: MOVF 1C,W
0384: SUBWF x6B,W
0386: BC 03AA
0388: MOVF x68,W
038A: ADDWF x6B,W
038C: MOVWF FE9
038E: MOVF x69,W
0390: ADDWFC x6C,W
0392: MOVWF FEA
0394: MOVF FC9,W
0396: MOVLW FF
0398: MOVWF FC9
039A: BTFSS FC7.0
039C: BRA 039A
039E: MOVFF FC9,FEF
03A2: INCF x6B,F
03A4: BTFSC FD8.2
03A6: INCF x6C,F
03A8: BRA 0372
.................... SPI_READ(0xFF); // read crc
03AA: MOVF FC9,W
03AC: MOVLW FF
03AE: MOVWF FC9
03B0: BTFSS FC7.0
03B2: BRA 03B0
.................... SPI_READ(0xFF);
03B4: MOVF FC9,W
03B6: MOVLW FF
03B8: MOVWF FC9
03BA: BTFSS FC7.0
03BC: BRA 03BA
....................
.................... return(true);
03BE: MOVLW 01
03C0: MOVWF 01
.................... }
03C2: MOVLB 0
03C4: RETLW 00
....................
.................... //////////////////////////////////////////////////////////////////
.................... ///////////////////////////////// INIT MMC ///////////////////////
.................... //////////////////////////////////////////////////////////////////
.................... #separate
....................
.................... int init_MMC(int max_tries){
.................... int32 start_lsec;
.................... int16 sec_resv,sec_for_FAT,bytes_per_sector,root_dir_entries,
.................... sec_for_data,count_of_clusters,root_dir_sectors,total_sectors;
.................... int i,tries,sec_per_cluster,c;
.................... char buff[32];
.................... tries=0;
*
048C: MOVLB 1
048E: CLRF x25
.................... cmd0:
.................... ///////////////////// place null treminators in globals fname and buff
.................... for(i=0;i<MAX_FILES;i++){
0490: CLRF x24
0492: MOVF x24,W
0494: SUBLW 01
0496: BNC 04DE
.................... file[i].name[0]=0;
0498: MOVF x24,W
049A: MULLW 3D
049C: MOVF FF3,W
049E: CLRF x49
04A0: MOVWF x48
04A2: MOVLW 22
04A4: ADDWF x48,W
04A6: MOVWF FE9
04A8: MOVLW 00
04AA: ADDWFC x49,W
04AC: MOVWF FEA
04AE: CLRF FEF
.................... file[i].rec_size=32; //// default rec_size = 32 byte tile size of FAT16
04B0: MOVF x24,W
04B2: MULLW 3D
04B4: MOVF FF3,W
04B6: CLRF x49
04B8: MOVWF x48
04BA: MOVLW 3B
04BC: ADDWF x48,W
04BE: MOVWF 01
04C0: MOVLW 00
04C2: ADDWFC x49,W
04C4: MOVWF 03
04C6: MOVF 01,W
04C8: ADDLW 22
04CA: MOVWF FE9
04CC: MOVLW 00
04CE: ADDWFC 03,W
04D0: MOVWF FEA
04D2: CLRF FEC
04D4: MOVF FED,F
04D6: MOVLW 20
04D8: MOVWF FEF
.................... }
04DA: INCF x24,F
04DC: BRA 0492
.................... //buff[MMC_BUFF_SIZE]=0;
.................... //frec_size=32; //// default rec_size = 32 byte tile size of FAT16
.................... output_high(_CS); /// reset chip hardware !!! required
04DE: BCF F94.2
04E0: BSF F8B.2
.................... delay_ms(20);
04E2: MOVLW 14
04E4: MOVWF x48
04E6: MOVLB 0
04E8: RCALL 01E0
.................... for(i=0;i<20;i++) SPI_READ(0xFF); // min 80 clocks to get MMC ready
04EA: MOVLB 1
04EC: CLRF x24
04EE: MOVF x24,W
04F0: SUBLW 13
04F2: BNC 0502
04F4: MOVF FC9,W
04F6: MOVLW FF
04F8: MOVWF FC9
04FA: BTFSS FC7.0
04FC: BRA 04FA
04FE: INCF x24,F
0500: BRA 04EE
.................... output_low(_CS); /// !!! required
0502: BCF F94.2
0504: BCF F8B.2
.................... delay_ms(20);
0506: MOVLW 14
0508: MOVWF x48
050A: MOVLB 0
050C: RCALL 01E0
.................... #if MMC_INIT_TRACE
.................... printf("cmd0");
.................... #ENDIF
.................... c=mmc_cmd(0x40,0x00000000,128,0x01,0x99);
050E: MOVLW 40
0510: MOVLB 1
0512: MOVWF x6F
0514: CLRF x73
0516: CLRF x72
0518: CLRF x71
051A: CLRF x70
051C: MOVLW 80
051E: MOVWF x74
0520: MOVLW 01
0522: MOVWF x75
0524: MOVLW 99
0526: MOVWF x76
0528: MOVLB 0
052A: RCALL 0210
052C: MOVFF 01,127
....................
.................... if (c==0x01) goto exit_cmd1;
0530: MOVLB 1
0532: DECFSZ x27,W
0534: BRA 0538
0536: BRA 054C
....................
.................... // note: i must cycle at least 8 times (16 is safe )
....................
.................... if (tries++<max_tries) goto cmd0; /// restart
0538: MOVF x25,W
053A: INCF x25,F
053C: SUBWF x0F,W
053E: BZ 0546
0540: BNC 0546
0542: BRA 0490
.................... else return (10);
0544: BRA 054C
0546: MOVLW 0A
0548: MOVWF 01
054A: BRA 0872
.................... exit_cmd1:
.................... // CPDMOD - This SOMETIMES seems to be necessary
.................... // output_high(_CS);
.................... // SPI_READ(0xFF); // min 8 clocks to get MMC ready
.................... // output_low(_CS);
.................... //CPDMOD End
....................
....................
.................... tries=0;
054C: CLRF x25
.................... cmd1:
....................
.................... /// now try to switch to idle mode
.................... /// Note: cmd1(idle) is the only command allowed after a cmd0(reset)
.................... //
....................
.................... c=mmc_cmd(0x41,0x00000000,128,0x00,0x99);
054E: MOVLW 41
0550: MOVWF x6F
0552: CLRF x73
0554: CLRF x72
0556: CLRF x71
0558: CLRF x70
055A: MOVLW 80
055C: MOVWF x74
055E: CLRF x75
0560: MOVLW 99
0562: MOVWF x76
0564: MOVLB 0
0566: RCALL 0210
0568: MOVFF 01,127
.................... if (c==0x00) { goto ready;}
056C: MOVLB 1
056E: MOVF x27,F
0570: BNZ 0574
0572: BRA 05A2
....................
....................
.................... if( tries++<max_tries) { printf("cmd1"); goto cmd1;}
0574: MOVF x25,W
0576: INCF x25,F
0578: SUBWF x0F,W
057A: BZ 059C
057C: BNC 059C
057E: CLRF x48
0580: MOVF x48,W
0582: MOVLB 0
0584: RCALL 0004
0586: IORLW 00
0588: BZ 0596
058A: MOVLB 1
058C: INCF x48,F
058E: BTFSS F9E.4
0590: BRA 058E
0592: MOVWF FAD
0594: BRA 0580
0596: MOVLB 1
0598: BRA 054E
.................... else return(11);
059A: BRA 05A2
059C: MOVLW 0B
059E: MOVWF 01
05A0: BRA 0872
.................... ready:
.................... //for( i=0;i<32;i++) SPI_READ(0xFF);// digest operation
.................... /// MMC is inialized and in idle state ready for commands
.................... ////
.................... //// we need to first access the master boot sector physical address=0
.................... ///
.................... if(set_BLOCKLEN((int32)32)==false) return(12); /// sets global block_size to 32
05A2: CLRF x63
05A4: CLRF x62
05A6: CLRF x61
05A8: MOVLW 20
05AA: MOVWF x60
05AC: MOVLB 0
05AE: RCALL 02A6
05B0: MOVF 01,F
05B2: BNZ 05BC
05B4: MOVLW 0C
05B6: MOVWF 01
05B8: MOVLB 1
05BA: BRA 0872
....................
.................... if (read_block(0x00000000,buff)==false) return (99); /// read the first few bytes
05BC: MOVLB 1
05BE: CLRF x67
05C0: CLRF x66
05C2: CLRF x65
05C4: CLRF x64
05C6: MOVLW 01
05C8: MOVWF x69
05CA: MOVLW 28
05CC: MOVWF x68
05CE: MOVLB 0
05D0: RCALL 02FC
05D2: MOVF 01,F
05D4: BNZ 05DE
05D6: MOVLW 63
05D8: MOVWF 01
05DA: MOVLB 1
05DC: BRA 0872
.................... #if MMC_INIT_TRACE
.................... printf("\n\r sector0=");
.................... for(i=0;i<32;i++)printf("%2X ",buff[i]);
.................... #ENDIF
.................... if (buff[0]==0xEB || buff[0]==0xE9){
05DE: MOVLB 1
05E0: MOVF x28,W
05E2: SUBLW EB
05E4: BZ 05EC
05E6: MOVF x28,W
05E8: SUBLW E9
05EA: BNZ 05EE
.................... /// sector 0 is the boot sector
.................... #if MMC_INIT_TRACE
.................... printf("\n\r boot sector= 0");
.................... #ENDIF
.................... }
.................... else{
05EC: BRA 065C
.................... //// partition
....................
.................... /// access the master boot sector physical address 0 at offset 1BE
.................... if (read_BLOCK(0x000001BE,buff)==false) return(13);
05EE: CLRF x67
05F0: CLRF x66
05F2: MOVLW 01
05F4: MOVWF x65
05F6: MOVLW BE
05F8: MOVWF x64
05FA: MOVLW 01
05FC: MOVWF x69
05FE: MOVLW 28
0600: MOVWF x68
0602: MOVLB 0
0604: RCALL 02FC
0606: MOVF 01,F
0608: BNZ 0614
060A: MOVLW 0D
060C: MOVWF 01
060E: MOVLB 1
0610: BRA 0872
0612: MOVLB 0
.................... #if MMC_INIT_TRACE
.................... for(i=0;i<32;i++)printf("%2X ",buff[i]);
.................... #ENDIF
.................... // start_lsec is address of the partion boot sector
.................... start_lsec=make32(buff[11],buff[10],buff[9],buff[8]);
0614: MOVFF 133,113
0618: MOVFF 132,112
061C: MOVFF 131,111
0620: MOVFF 130,110
.................... #if MMC_INIT_TRACE
.................... printf("\n\r boot sector= %lu",start_lsec);
.................... #ENDIF
.................... if (read_BLOCK(start_lsec*512,buff)==false) return(14);
0624: BCF FD8.0
0626: MOVLB 1
0628: CLRF x48
062A: RLCF x10,W
062C: MOVWF x49
062E: RLCF x11,W
0630: MOVWF x4A
0632: RLCF x12,W
0634: MOVWF x4B
0636: MOVWF x67
0638: MOVFF 14A,166
063C: MOVFF 149,165
0640: MOVFF 148,164
0644: MOVLW 01
0646: MOVWF x69
0648: MOVLW 28
064A: MOVWF x68
064C: MOVLB 0
064E: RCALL 02FC
0650: MOVF 01,F
0652: BNZ 065E
0654: MOVLW 0E
0656: MOVWF 01
0658: MOVLB 1
065A: BRA 0872
065C: MOVLB 0
.................... }
....................
.................... bytes_per_sector=make16(buff[12],buff[11]);
065E: MOVFF 134,119
0662: MOVFF 133,118
.................... if(bytes_per_sector!=512) return(15);
0666: MOVLB 1
0668: MOVF x18,F
066A: BNZ 0672
066C: MOVF x19,W
066E: SUBLW 02
0670: BZ 0678
0672: MOVLW 0F
0674: MOVWF 01
0676: BRA 0872
.................... sec_per_cluster=buff[13];
0678: MOVFF 135,126
.................... cluster_size_bytes=(int16)sec_per_cluster*bytes_per_sector;
067C: CLRF x49
067E: MOVFF 126,148
0682: MOVFF 149,14B
0686: MOVFF 126,14A
068A: MOVFF 119,14D
068E: MOVFF 118,14C
0692: MOVLB 0
0694: RCALL 03C6
0696: MOVFF 02,07
069A: MOVFF 01,06
....................
....................
.................... sec_resv=make16(buff[15],buff[14]);
069E: MOVFF 137,115
06A2: MOVFF 136,114
....................
.................... root_dir_entries=make16(buff[18],buff[17]);// number of 32 byte tiles
06A6: MOVFF 13A,11B
06AA: MOVFF 139,11A
....................
.................... total_sectors=make16(buff[20],buff[19]);
06AE: MOVFF 13C,123
06B2: MOVFF 13B,122
....................
.................... sec_for_FAT=make16(buff[23],buff[22]);
06B6: MOVFF 13F,117
06BA: MOVFF 13E,116
.................... //branch to file directory
.................... fat1_address=(start_lsec+sec_resv)*bytes_per_sector;
06BE: MOVLB 1
06C0: MOVF x14,W
06C2: ADDWF x10,W
06C4: MOVWF x48
06C6: MOVF x15,W
06C8: ADDWFC x11,W
06CA: MOVWF x49
06CC: MOVLW 00
06CE: ADDWFC x12,W
06D0: MOVWF x4A
06D2: MOVLW 00
06D4: ADDWFC x13,W
06D6: MOVWF x4B
06D8: MOVWF x6F
06DA: MOVFF 14A,16E
06DE: MOVFF 149,16D
06E2: MOVFF 148,16C
06E6: CLRF x73
06E8: CLRF x72
06EA: MOVFF 119,171
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -