|
; File Splitter V1.0
; Author: LuPeipei(goodname008)
; Date: 2003.11.29
; BLOG: http://blog.csdn.net/goodname008
FILE_CREATE EQU 3CH ;Create File
FILE_OPEN EQU 3DH ;Open File
FILE_READ EQU 3FH ;Read File
FILE_WRITE EQU 40H ;Write File
FILE_CLOSE EQU 3EH ;Close File
FILE_MOVEPTR EQU 42H ;Move File Pointer
FILE_DELETE EQU 41H ;Delete File
ERR_IFN EQU 01H ;Invalid File Number
ERR_FNF EQU 02H ;File Not Found
ERR_PNF EQU 03H ;Path Not Found
ERR_TMF EQU 04H ;Too Many File opened
ERR_RIO EQU 05H ;Refuse Input/Output
ERR_IFH EQU 06H ;Invalid File Handler
ATTR_ARCHIVE EQU 00H ;File Attrib: Archive
ATTR_READONLY EQU 01H ;File Attrib: Read-only
ATTR_HIDDEN EQU 02H ;File Attrib: Hidden
ATTR_SYSTEM EQU 04H ;File Attrib: System
MODE_READ EQU 00H ;File open Mode: Read-only
MODE_WRITE EQU 01H ;File open Mode: Write-only
MODE_RW EQU 02H ;File open Mode: Read and Write
DSEG SEGMENT
ERROR_OF DB 'Failed to open file.',0DH,0AH,'$'
ERROR_MP DB 'Failed to move the pointer of file.',0DH,0AH,'$'
ERROR_FS DB 'The file size must be more than 1MB and less than 4096MB.',0DH,0AH,'$'
ERROR_VC DB 'The number of volume must be more than 1 and less than 100.',0DH,0AH,'$'
ERROR_CF DB 'Falied to create file.',0DH,0AH,'$'
ERROR_WF DB 'Insufficient disk space.',0DH,0AH,'$'
COMPLETE DB 'Complete successfully!!!',0DH,0AH
DB 'Thank you for using this software.',0DH,0AH,'$'
LOGO DB 'LPP (R) File Splitter version 1.0',0DH,0AH
DB 'Copyright (C) LPP software studio 2003-2004. All rights reserved.',0DH,0AH,0DH,0AH
DB 'Options: 1 -- Split 2 -- Combine',0DH,0AH,0DH,0AH
DB 'Your choice: $'
PROMPTSF DB 'Source filename: $'
FILESIZE DB 'File size: ',8 DUP('$')
OPTIONSIZE DB 'Volume size options: 1 -- Floppy Disk (1.44 MB) 2 -- Custom.',0DH,0AH,0DH,0AH
DB 'Your choice: $'
PROMPTS DB 'Volume size(MB): $'
PROMPTTF DB 'Target filename(don',"'",'t input extend name): $'
SFSIZE DD ?
TFSIZE DW ?
SFNUM DW ?
TFNUM DW ?
SFNAME DB 65,?,65 DUP(0),'$'
TFNAME DB 65,?,65 DUP(0),'.ext',0,'$'
VSIZE DB 4,?,4 DUP(0),'$'
PDIGIT DB 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
BUFFER DB 60736 DUP(?),'$'
FLAG DB ?
DSEG ENDS
SSEG SEGMENT STACK
DB 100 DUP(?)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START: MOV AX,DSEG
MOV DS,AX
LEA DX,LOGO ;print Author ,Copyrights and options
MOV AH,9H
INT 21H
MOV AH,1H ;get user choice
INT 21H
CALL PRINTCRLF
CMP AL,'1' ;1 -- Split 2 -- Combine
JE SPLIT
CMP AL,'2'
JE COMBINE
MOV AH,4CH
INT 21H
COMBINE:CALL COMBINEMODULE
SPLIT: CALL SPLITMODULE
;----------------------------------------------------------------------------
COMBINEMODULE PROC
MOV PROMPTTF[15],':'
MOV PROMPTTF[16],' '
MOV PROMPTTF[17],'$'
LEA DX,PROMPTTF ;print "Target filename:"
MOV AH,9H
INT 21H
LEA DX,TFNAME ;get the target filename from user
MOV AH,0AH
INT 21H
MOV DL,TFNAME+1 ;set the last filename char to 0
XOR DH,DH
MOV DI,DX
MOV TFNAME[DI+2],0
CALL PRINTCRLF
LEA DX,TFNAME+2 ;create target file
MOV AH,FILE_CREATE
MOV CX,ATTR_ARCHIVE
INT 21H
MOV TFNUM,AX ;save target file number to TFNUM
JNC COK_CF ;if error then EXIT
LEA DX,ERROR_CF
MOV AH,9H
INT 21H
MOV AH,4CH
INT 21H
COK_CF: LEA DX,PROMPTSF ;print "Source filename:"
MOV AH,9H
INT 21H
LEA DX,SFNAME ;get the source filename from user
MOV AH,0AH
INT 21H
CALL PRINTCRLF
MOV DL,SFNAME+1 ;set the last filename char to 0
XOR DH,DH
MOV DI,DX
LEA DI,SFNAME[DI] ;source filename extendsion's number --> DI
MOV BYTE PTR [DI+2],0
MOV BYTE PTR [DI+3],'$'
CALL PRINTCRLF
CALL PRINTCRLF
MOV TFSIZE,0FFFFH ;copy 1048576 bytes per time
XOR AX,AX
C_NEXT: PUSH AX
CALL HEXTODECASC ;change source file extend name
MOV BX,AX
LEA DX,SFNAME+2 ;open source file
MOV AH,FILE_OPEN
MOV AL,MODE_READ
INT 21H
MOV SFNUM,AX ;save source file number
JNC COK_OF ;if error then EXIT
CMP BX,0 ;if complete the EXIT
JNE EXITCSU
CALL PRINTCRLF
LEA DX,ERROR_OF ;print "Falied to open file."
MOV AH,9H
INT 21H
MOV AH,4CH
INT 21H
EXITCSU:CALL PRINTCRLF
LEA DX,COMPLETE ;print "Complete successfully ..."
MOV AH,9H
INT 21H
MOV AH,4CH
INT 21H
COK_OF: LEA DX,SFNAME+2 ;print source filename
MOV AH,9H
INT 21H
MOV DL,'.' ;print "......"
MOV AH,2H
INT 21H
INT 21H
INT 21H
INT 21H
INT 21H
INT 21H
CALL PRINTCRLF
CCOPY: CALL COPYBYTES
JC EXITCWF ;if disk full then EXIT
CMP FLAG,1 ;if complete then EXIT
JNE CCOPY
MOV BX,SFNUM ;close source file
MOV AH,FILE_CLOSE
INT 21H
POP AX
INC AX
JMP C_NEXT
EXITCWF:CALL PRINTCRLF
LEA DX,ERROR_WF ;print "Insufficient disk space."
MOV AH,9H
INT 21H
MOV AH,4CH
INT 21H
COMBINEMODULE ENDP
;----------------------------------------------------------------------------
SPLITMODULE PROC
LEA DX,PROMPTSF ;print "Source filename:"
MOV AH,9H
INT 21H
LEA DX,SFNAME ;get the source filename from user
MOV AH,0AH
INT 21H
CALL PRINTCRLF
MOV DL,SFNAME+1 ;set the last filename char to 0
XOR DH,DH
MOV SI,DX
MOV SFNAME[SI+2],0
CALL PRINTCRLF
LEA DX,SFNAME+2 ;open source file
MOV AH,FILE_OPEN
MOV AL,MODE_READ
INT 21H
JNC SOK_OF ;if error then EXIT
LEA DX,ERROR_OF
MOV AH,9H
INT 21H
MOV AH,4CH
INT 21H
SOK_OF: MOV SFNUM,AX ;save source file number
MOV BX,AX
XOR CX,CX ;get the length of file(Bytes) --> DX:AX
XOR DX,DX
MOV AL,02H
MOV AH,FILE_MOVEPTR
INT 21H
JNC SOK_MP ;if error occured then EXIT
LEA DX,ERROR_MP
MOV AH,9H
INT 21H
MOV AH,4CH
INT 21H
SOK_MP: CMP DX,0010H ;if the length of file is less than 1MB or more than 4096MB then EXIT
JB EXIT_FS
CMP DX,0FFF0H
JNA SOK_FS
EXIT_FS:LEA DX,ERROR_FS
MOV AH,9H
INT 21H
MOV AH,4CH
INT 21H
SOK_FS: MOV WORD PTR SFSIZE,AX
MOV WORD PTR SFSIZE+2,DX
MOV AX,DX ;the length of file(MB) --> AX
MOV CL,4
SHR AX,CL
PUSH AX ;save the length of file to stack
MOV DX,AX
LEA BX,FILESIZE[11]
CALL HEXTODECASC5
MOV FILESIZE[DI+11],'.'
MOV FILESIZE[DI+12],'0'
MOV AX,WORD PTR SFSIZE+2
AND AX,000FH ;calculate the point part (XXXX.p MB)
LEA BX,PDIGIT
XLAT
MOV DX,AX
LEA BX,FILESIZE[DI+12]
CALL HEXTODECASC5
MOV FILESIZE[SI+11+1],'0'
LEA DX,FILESIZE
MOV AH,9H
INT 21H
MOV AH,2H ;show ' MB' after source file size
MOV DL,' '
INT 21H
MOV DL,'M'
INT 21H
MOV DL,'B'
INT 21H
CALL PRINTCRLF
CALL PRINTCRLF
MOV BX,SFNUM ;set file pointer to 0000:0000
XOR CX,CX
XOR DX,DX
MOV AL,00H
MOV AH,FILE_MOVEPTR
INT 21H
LEA DX,OPTIONSIZE ;print volume size options information
MOV AH,9H
INT 21H
MOV AH,1H ;get user choice
INT 21H
CALL PRINTCRLF
CMP AL,'1' ;1 -- Floppy Disk (1.44 MB) 2 -- Custom.
JE FLP
CMP AL,'2'
JE CUSTOM
MOV AH,4CH
INT 21H
;if FLOPPY then check file size
FLP: CMP WORD PTR SFSIZE+2,0016H
JB EXIT_VC
JE CMPLOW
MOV AX,WORD PTR SFSIZE+2
CMP AX,8B0H
JA EXIT_VC
JMP SOK_VC
CMPLOW: CMP WORD PTR SFSIZE,3E00H
JB EXIT_VC
JMP SOK_VC
CUSTOM: LEA DX,PROMPTS ;print "Volume size:"
MOV AH,9H
INT 21H
LEA DX,VSIZE ;get volume size to AX (n:MB)
CALL RECEIVENUM
LEA DX,VSIZE+2
CALL ASCTOHEX
CALL BCDTOHEX
CMP AX,0
JE EXIT_VC
MOV SI,AX ;AX --> SI (volume size, n:MB)
MOV TFSIZE,AX ;save volume size to memory
POP AX ;restore the length of file from stack
XOR DX,DX ;volume count --> AX (actually in AL)
DIV SI
CMP AX,0 ;if volume count = 0 or more than 100 then EXIT
JE EXIT_VC
CMP AX,64H
JNA SOK_VC
EXIT_VC:LEA DX,ERROR_VC
MOV AH,9H
INT 21H
MOV AH,4CH
INT 21H
SOK_VC: LEA DX,PROMPTTF ;print "Target filename:"
MOV AH,9H
INT 21H
LEA DX,TFNAME ;get the target filename from user
MOV AH,0AH
INT 21H
CALL PRINTCRLF
MOV DL,TFNAME+1 ;set the last filename char to '.'
XOR DH,DH
MOV SI,DX
MOV TFNAME[SI+2],'.' ;set target filen |