以下是我改寫的例程,可是運(yùn)行時(shí)能建立文件,數(shù)據(jù)也寫入了U盤,就是在計(jì)算機(jī)上讀不出來,提示文件系統(tǒng)出錯(cuò),用磁盤修復(fù)系統(tǒng)整理后,就能讀取文件了.請(qǐng)指教是怎么回事呢?另外我寫的產(chǎn)生文件創(chuàng)建時(shí)間的程序不能產(chǎn)生創(chuàng)建時(shí)間那兩個(gè)公式是什么呢? 謝謝回復(fù)!
;--------------------------------------------------------------------------- ;-----------------------打開文件 MOV R0,#LOW (mCmdParam);命令參數(shù),mCmdParam.Open.mPathName;;指向聯(lián)合體的最低單元 MOV DPTR,#FILE_NAME;指向原文件名,該文件在根目錄下;該地址以后存放文件名,長度為16個(gè)字節(jié) LCALL _mCopyStringToIRAMX;復(fù)制文件名作為調(diào)用子程序的參數(shù) LCALL CH375FileOpen;打開文件 MOV A,R7 XRL A,#ERR_MISS_FILE;查相應(yīng)的文件是否存在 JZ FILE_NOT_FOUND;文件不存在 LCALL _mStopIfError;返回值出錯(cuò)處理 ;-------文件存在則關(guān)閉文件 MOV R0,#LOW (mCmdParam);命令參數(shù), mCmdParam.Close.mUpdateLen MOV @R0,#00H;不要自動(dòng)計(jì)算文件長度,如果自動(dòng)計(jì)算,那么該長度總是512的倍數(shù);因?yàn)榍懊嬉呀?jīng)設(shè)置好了文件長度,所以在這里不用進(jìn)行文件長度的自動(dòng)設(shè)置 LCALL CH375FileClose;關(guān)閉文件 LCALL _mStopIfError;返回值出錯(cuò)處理 SJMP SETDISP ;-------生成新文件 FILE_NOT_FOUND: MOV R0,#LOW (mCmdParam);命令參數(shù),mCmdParam.Create.mPathName MOV DPTR,#FILE_NAME;NEW_NAME;指向新文件名,長度為16個(gè)字節(jié) LCALL _mCopyStringToIRAMX;復(fù)制文件名作為調(diào)用子程序的參數(shù) LCALL CH375FileCreate;新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 LCALL _mStopIfError;返回值出錯(cuò)處理 ;-------------以扇區(qū)方式往文件里寫入數(shù)據(jù) MOV R0,#LOW (mCmdParam);寫操作要指定寫入數(shù)據(jù)的長度,以扇區(qū)為單位,mCmdParam.Write.mSectorCount MOV SECCOUNT,#8 MOV @R0,SecCount;寫入所有扇區(qū)的數(shù)據(jù) LCALL CH375FileWrite;向文件寫入數(shù)據(jù) LCALL _mStopIfError;返回值出錯(cuò)處理; 如果文件數(shù)據(jù)的復(fù)制方式為"外部子程序",那么由_xReadFromExtBuf子程序?qū)懭霐?shù)據(jù),否則自動(dòng)將FILE_DATA_BUF中的數(shù)據(jù)寫入 ;-----------------------設(shè)置所建立文件的屬性,準(zhǔn)備關(guān)閉文件 FILESET: MOV A,#01H;;;;;;默認(rèn)文件屬性 MOV R0,#LOW (mCmdParam+08H);輸入?yún)?shù)mCmdParam.Modify.mFileAttr:設(shè)置新文件的屬性,為0FFH則不修改 MOV @R0,A ;-------------設(shè)置文件建立時(shí)間 MOV R0,#LOW (mCmdParam+06H);輸入?yún)?shù)mCmdParam.Modify.mFileTime:設(shè)置新文件的時(shí)間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認(rèn)時(shí)間 MOV A,XBUF2 LCALL BCDHEX RL A RL A RL A MOV R3,A MOV A,XBUF1 LCALL BCDHEX RL A RL A RL A RL A RL A MOV R4,A MOV A,XBUF0 LCALL BCDHEX RR A CLR C ADD A,R4 MOV R4,A CLR A ADDC A,R3 MOV @R0,A INC R0 MOV A,R4 MOV @R0,A ; MOV @R0,A;;;;;;;默認(rèn)文件建立時(shí)間 ; INC R0 ; MOV @R0,A ;-------------設(shè)置文件的建立日期為指定日期"2004.05.18" MOV R0,#LOW (mCmdParam+04H);輸入?yún)?shù)mCmdParam.Modify.mFileDate: 新的文件日期: 2004.05.18 */ MOV A,XBUF5 LCALL BCDHEX ADD A,#14H;(加100減80) RL A;直接送至高位字節(jié),少循環(huán)8次 MOV B,A;年高位暫存 MOV A,XBUF4 LCALL BCDHEX RL A RL A RL A RL A RL A MOV @R0,A;月循環(huán)5次低位暫存 MOV A,XBUF3 LCALL BCDHEX CLR C ADD A,@R0 INC R0 MOV @R0,A MOV A,#0 ADDC A,B DEC R0 MOV @R0,A ; MOV @R0,#030H;日期產(chǎn)生方法是 Date = ((Year-1980)<<9) + (Month<<5) + Day;在左移時(shí)是兩個(gè)字節(jié)在移動(dòng)也就是說(2004-1980)=24=18H,實(shí)際是0018H,左移后成為3000H,,.轉(zhuǎn)下一行 ; INC R0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;而月份中是0005H左移后成為00A0H,和日期(0012H)相加后成為了30B2H. ; MOV @R0,#0B2H;該值由上面的公式產(chǎn)生 ;-------------設(shè)置文件實(shí)際長度大小,以字節(jié)為單位,實(shí)際大小在Newsize-2,Newsize-1,Newsize,Newsize+1里面,共占用四個(gè)單元,如果文件長度小于64K字節(jié),則只使用Newsize,Newsize+1兩個(gè)字節(jié)就可以了 MOV R0,#LOW (mCmdParam); 輸入?yún)?shù)mCmdParam.Modify.mFileSize: 如果原文件較小,那么新的文件長度與原文件一樣長,否則被RAM所限 MOV @R0,#00H;-----長度計(jì)數(shù)字節(jié)1 INC R0 MOV @R0,#00H;-----長度計(jì)數(shù)字節(jié)2如果文件長度大于64KB,那么該單元應(yīng)該寫入文件長度的高23-16位 INC R0 MOV @R0,#0FFH;NewSize;--長度計(jì)數(shù)字節(jié)3 INC R0 MOV @R0,#0FFH;NewSize+01H;---長度計(jì)數(shù)字節(jié)4指定新的文件長度 ;-----------調(diào)用子程序?qū)⒃O(shè)置值寫入U(xiǎn)盤 LCALL CH375FileModify;修改當(dāng)前文件的信息,修改日期和長度 LCALL _mStopIfError;返回值出錯(cuò)處理 ;-------設(shè)置關(guān)閉文件參數(shù),關(guān)閉文件 MOV R0,#LOW (mCmdParam);命令參數(shù), mCmdParam.Close.mUpdateLen MOV @R0,#00H;不要自動(dòng)計(jì)算文件長度,如果自動(dòng)計(jì)算,那么該長度總是512的倍數(shù);因?yàn)榍懊嬉呀?jīng)設(shè)置好了文件長度,所以在這里不用進(jìn)行文件長度的自動(dòng)設(shè)置 LCALL CH375FileClose;關(guān)閉文件 LCALL _mStopIfError;返回值出錯(cuò)處理 ;-----------------------設(shè)置參數(shù)顯示和修改 SETDISP: NOP LCALL DPRT