mirror of
https://github.com/romychs/sprinter-unzip.git
synced 2025-04-18 01:52:42 +03:00
Refactoring cmd line parames handling
This commit is contained in:
parent
a749155c5c
commit
87676d56b3
24
bios.asm
24
bios.asm
@ -52,6 +52,8 @@ DSS_HANDLER
|
|||||||
JP Z, _FIND_FIRST
|
JP Z, _FIND_FIRST
|
||||||
CP 0x1D
|
CP 0x1D
|
||||||
JP Z, _CH_DIR
|
JP Z, _CH_DIR
|
||||||
|
CP 0x1E
|
||||||
|
JP Z, _CURDIR
|
||||||
CP 0x5C
|
CP 0x5C
|
||||||
JP Z, _PCHARS
|
JP Z, _PCHARS
|
||||||
CP 0x41
|
CP 0x41
|
||||||
@ -77,8 +79,7 @@ NXT_PCHAR
|
|||||||
JR NZ, NXT_PCHAR
|
JR NZ, NXT_PCHAR
|
||||||
|
|
||||||
NORM_EXIT
|
NORM_EXIT
|
||||||
SCF
|
AND A ; CF=0
|
||||||
CCF
|
|
||||||
POP BC
|
POP BC
|
||||||
POP HL
|
POP HL
|
||||||
RET
|
RET
|
||||||
@ -111,6 +112,11 @@ _CREATE_FILE
|
|||||||
CUR_FILE_MAN
|
CUR_FILE_MAN
|
||||||
DB 0x4F
|
DB 0x4F
|
||||||
|
|
||||||
|
CUR_DIR
|
||||||
|
DB "C:\\FOLDER\\",0
|
||||||
|
CUR_DIR_END
|
||||||
|
CUR_DIR_SIZE EQU CUR_DIR_END-CUR_DIR
|
||||||
|
|
||||||
_OPEN_FILE
|
_OPEN_FILE
|
||||||
LD HL, CUR_FILE_MAN
|
LD HL, CUR_FILE_MAN
|
||||||
INC (HL)
|
INC (HL)
|
||||||
@ -191,6 +197,20 @@ _WRITE_FILE
|
|||||||
_CH_DIR
|
_CH_DIR
|
||||||
JP NORM_EXIT
|
JP NORM_EXIT
|
||||||
|
|
||||||
|
|
||||||
|
; 1Eh (30) CURDIR (Информация о текущем каталоге)
|
||||||
|
; Входные значения:
|
||||||
|
; HL - буфер в памяти 256 байт
|
||||||
|
; Выходные значения:
|
||||||
|
; A - код ошибки, если CF=1
|
||||||
|
_CURDIR
|
||||||
|
PUSH DE
|
||||||
|
EX HL,DE
|
||||||
|
LD BC, CUR_DIR_SIZE
|
||||||
|
LDIR
|
||||||
|
POP DE
|
||||||
|
JP NORM_EXIT
|
||||||
|
|
||||||
; Входные значения:
|
; Входные значения:
|
||||||
; HL - указатель на файловую спецификацию
|
; HL - указатель на файловую спецификацию
|
||||||
; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт
|
; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт
|
||||||
|
221
unzip.asm
221
unzip.asm
@ -7,7 +7,7 @@
|
|||||||
; Set to 1 to turn debug ON with DeZog VSCode plugin
|
; Set to 1 to turn debug ON with DeZog VSCode plugin
|
||||||
; Set to 0 to compile .EXE
|
; Set to 0 to compile .EXE
|
||||||
DEBUG EQU 0
|
DEBUG EQU 0
|
||||||
|
EXE_VERSION EQU 0
|
||||||
|
|
||||||
SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
|
SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
|
||||||
|
|
||||||
@ -34,6 +34,7 @@ DSS_FIND_FIRST EQU 0x0119
|
|||||||
DSS_FIND_NEXT EQU 0x011A
|
DSS_FIND_NEXT EQU 0x011A
|
||||||
DSS_MKDIR EQU 0x1B
|
DSS_MKDIR EQU 0x1B
|
||||||
DSS_CHDIR EQU 0x1D
|
DSS_CHDIR EQU 0x1D
|
||||||
|
DSS_CURDIR EQU 0x1E
|
||||||
DSS_EXIT EQU 0x41
|
DSS_EXIT EQU 0x41
|
||||||
DSS_PCHARS EQU 0x5C
|
DSS_PCHARS EQU 0x5C
|
||||||
|
|
||||||
@ -67,7 +68,7 @@ NR_DIST EQU 32
|
|||||||
|
|
||||||
EXE_HEADER
|
EXE_HEADER
|
||||||
DB "EXE"
|
DB "EXE"
|
||||||
DB 0x00 ; EXE Version
|
DB EXE_VERSION ; EXE Version
|
||||||
DW 0x0080 ; Code offset
|
DW 0x0080 ; Code offset
|
||||||
DW 0
|
DW 0
|
||||||
DW 0 ; Primary loader size
|
DW 0 ; Primary loader size
|
||||||
@ -92,19 +93,20 @@ START
|
|||||||
PUSH IX ; IX ptr to cmd line
|
PUSH IX ; IX ptr to cmd line
|
||||||
POP HL
|
POP HL
|
||||||
INC HL ; Skip size of Command line
|
INC HL ; Skip size of Command line
|
||||||
LD DE,INPUT_PATH
|
LD DE,PATH_INPUT
|
||||||
CALL READ_CMD_PAR
|
CALL GET_CMD_PARAM
|
||||||
JR C,INVALID_CMDLINE
|
JR C,INVALID_CMDLINE
|
||||||
LD DE,OUTPUT_PATH
|
LD DE,PATH_OUTPUT
|
||||||
CALL READ_CMD_PAR
|
CALL GET_CMD_PARAM
|
||||||
JR NC,IS_SEC_PAR
|
JR NC,IS_SEC_PAR
|
||||||
LD HL,INPUT_PATH ; In and out is same
|
LD HL,PATH_INPUT ; In and out is same
|
||||||
LD DE,OUTPUT_PATH
|
LD DE,PATH_OUTPUT
|
||||||
LD BC,256
|
LD BC,256
|
||||||
LDIR
|
LDIR
|
||||||
IS_SEC_PAR
|
IS_SEC_PAR
|
||||||
LD HL,OUTPUT_PATH
|
; split path and file name
|
||||||
CALL FIND_FILE_NAME
|
LD HL,PATH_OUTPUT
|
||||||
|
CALL SPLIT_PATH_FILE
|
||||||
JR START_L1
|
JR START_L1
|
||||||
INVALID_CMDLINE
|
INVALID_CMDLINE
|
||||||
LD HL,START_MESSAGE ; "PKUNZIP utility for Sprinter
|
LD HL,START_MESSAGE ; "PKUNZIP utility for Sprinter
|
||||||
@ -113,19 +115,19 @@ INVALID_CMDLINE
|
|||||||
LD BC,DSS_EXIT
|
LD BC,DSS_EXIT
|
||||||
RST DSS
|
RST DSS
|
||||||
START_L1
|
START_L1
|
||||||
LD A,(INPUT_PATH)
|
LD A,(PATH_INPUT) ; ToDo: No parameters, It is already checked before?
|
||||||
AND A
|
AND A
|
||||||
JR Z,INVALID_CMDLINE
|
JR Z,INVALID_CMDLINE
|
||||||
LD HL,START_MESSAGE ; "PKUNZIP utility for Sprinter
|
LD HL,START_MESSAGE ; "PKUNZIP utility for Sprinter
|
||||||
LD C,DSS_PCHARS
|
LD C,DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
LD HL,INPUT_PATH
|
LD HL,PATH_INPUT
|
||||||
CALL FIND_FILE_NAME
|
CALL SPLIT_PATH_FILE ; get zip file path and name from first cmd line parameter
|
||||||
JP C,ERR_FILE_OP
|
JP C,ERR_FILE_OP
|
||||||
LD HL,MSG_INP_PATH ; "Input path:"
|
LD HL,MSG_INP_PATH ; "Input path:"
|
||||||
LD C,DSS_PCHARS
|
LD C,DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
LD HL,INPUT_PATH
|
LD HL,PATH_INPUT
|
||||||
LD C,DSS_PCHARS
|
LD C,DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
LD HL,MSG_EOL ; '\r'
|
LD HL,MSG_EOL ; '\r'
|
||||||
@ -134,7 +136,7 @@ START_L1
|
|||||||
LD HL,MSG_OUT_PATH ; "Out path:"
|
LD HL,MSG_OUT_PATH ; "Out path:"
|
||||||
LD C,DSS_PCHARS
|
LD C,DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
LD HL,OUTPUT_PATH
|
LD HL,PATH_OUTPUT
|
||||||
LD C,DSS_PCHARS
|
LD C,DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
LD HL,MSG_EOL ; '\r'
|
LD HL,MSG_EOL ; '\r'
|
||||||
@ -142,23 +144,26 @@ START_L1
|
|||||||
RST DSS
|
RST DSS
|
||||||
IN A,(PAGE0)
|
IN A,(PAGE0)
|
||||||
LD (SAVE_P0),A
|
LD (SAVE_P0),A
|
||||||
LD HL,INPUT_PATH
|
; Change dir to input file directory
|
||||||
|
LD HL,PATH_INPUT
|
||||||
LD C,DSS_CHDIR
|
LD C,DSS_CHDIR
|
||||||
RST DSS
|
RST DSS
|
||||||
JP C,ERR_FILE_OP
|
JP C,ERR_FILE_OP
|
||||||
; Check input file exists
|
; Find first file by specified name or mask (*.zip for example)
|
||||||
LD HL,FILE_SPEC
|
LD HL,FILE_SPEC
|
||||||
LD DE,FF_WORK_BUF ; Work buffer
|
LD DE,FF_WORK_BUF ; Work buffer
|
||||||
LD BC,DSS_FIND_FIRST ; FIND_FIRST
|
LD BC,DSS_FIND_FIRST ; FIND_FIRST
|
||||||
LD A,0x2f ; Attrs
|
LD A,0x2f ; Attrs
|
||||||
RST DSS
|
RST DSS
|
||||||
JP C,ERR_FILE_OP ; File not found
|
JP C,ERR_FILE_OP ; File not found
|
||||||
JR GOT_INP_FILE
|
JR OPEN_ZIP_FILE
|
||||||
GET_NEXT_FILE
|
|
||||||
|
; ----------------------------------------------------
|
||||||
|
DO_NEXT_FILE
|
||||||
LD DE,FF_WORK_BUF
|
LD DE,FF_WORK_BUF
|
||||||
LD BC,DSS_FIND_NEXT ; FIND_NEXT
|
LD BC,DSS_FIND_NEXT ; FIND_NEXT
|
||||||
RST DSS
|
RST DSS
|
||||||
JR NC,GOT_INP_FILE
|
JR NC,OPEN_ZIP_FILE
|
||||||
CP E_FILE_NOT_FOUND
|
CP E_FILE_NOT_FOUND
|
||||||
JP NZ,ERR_FILE_OP
|
JP NZ,ERR_FILE_OP
|
||||||
LD HL,MSG_DEPAC_COMPLT ; "\r\nDepaking complited\r\n\n"
|
LD HL,MSG_DEPAC_COMPLT ; "\r\nDepaking complited\r\n\n"
|
||||||
@ -166,7 +171,8 @@ GET_NEXT_FILE
|
|||||||
RST DSS
|
RST DSS
|
||||||
LD BC,DSS_EXIT
|
LD BC,DSS_EXIT
|
||||||
RST DSS
|
RST DSS
|
||||||
GOT_INP_FILE
|
|
||||||
|
OPEN_ZIP_FILE
|
||||||
LD HL,FF_FILE_NAME
|
LD HL,FF_FILE_NAME
|
||||||
XOR A
|
XOR A
|
||||||
LD C,DSS_OPEN_FILE
|
LD C,DSS_OPEN_FILE
|
||||||
@ -179,13 +185,14 @@ GOT_INP_FILE
|
|||||||
LD HL,FF_FILE_NAME
|
LD HL,FF_FILE_NAME
|
||||||
LD C,DSS_PCHARS
|
LD C,DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
RD_LOCL_HDR
|
|
||||||
|
RD_LOCAL_HDR
|
||||||
CALL READ_HEADERS
|
CALL READ_HEADERS
|
||||||
JR C,ERR_IN_ZIP
|
JR C,ERR_IN_ZIP
|
||||||
AND A
|
AND A ; it is LFH?
|
||||||
JP Z,GOT_LFH
|
JP Z,DO_OUT_FNAME
|
||||||
|
; it is not local file header, but central directory
|
||||||
|
; close input file and go to next file
|
||||||
CLOSE_AND_NXT
|
CLOSE_AND_NXT
|
||||||
LD A,(FH_INP)
|
LD A,(FH_INP)
|
||||||
LD C,DSS_CLOSE_FILE
|
LD C,DSS_CLOSE_FILE
|
||||||
@ -193,14 +200,17 @@ CLOSE_AND_NXT
|
|||||||
JP C,ERR_FILE_OP
|
JP C,ERR_FILE_OP
|
||||||
XOR A
|
XOR A
|
||||||
LD (FH_INP),A
|
LD (FH_INP),A
|
||||||
JR GET_NEXT_FILE
|
JR DO_NEXT_FILE
|
||||||
|
|
||||||
ERR_IN_ZIP
|
ERR_IN_ZIP
|
||||||
LD HL,MSG_ERR_IN_ZIP ; "\r\nError in ZIP!\r\n"
|
LD HL,MSG_ERR_IN_ZIP ; "\r\nError in ZIP!\r\n"
|
||||||
LD C,DSS_PCHARS
|
LD C,DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
JR CLOSE_AND_NXT
|
JR CLOSE_AND_NXT
|
||||||
GOT_LFH
|
|
||||||
LD HL,OUTPUT_PATH
|
; Build full file name from output path and zip local header
|
||||||
|
DO_OUT_FNAME
|
||||||
|
LD HL,PATH_OUTPUT
|
||||||
LD DE,TEMP_BUFFR
|
LD DE,TEMP_BUFFR
|
||||||
LD BC,256
|
LD BC,256
|
||||||
LDIR
|
LDIR
|
||||||
@ -209,40 +219,47 @@ GOT_LFH
|
|||||||
RST DSS
|
RST DSS
|
||||||
LD HL,TEMP_BUFFR
|
LD HL,TEMP_BUFFR
|
||||||
XOR A
|
XOR A
|
||||||
|
; find end of path
|
||||||
FND_PATH_CPY_END
|
FND_PATH_CPY_END
|
||||||
CP (HL) ; HL => TEMP_BUFFR
|
CP (HL) ; HL => TEMP_BUFFR
|
||||||
JR Z,END_PATH_CPY
|
JR Z,END_PATH_CPY
|
||||||
INC HL
|
INC HL
|
||||||
JR FND_PATH_CPY_END
|
JR FND_PATH_CPY_END
|
||||||
|
; check last symbol is '\'' and add if not
|
||||||
END_PATH_CPY
|
END_PATH_CPY
|
||||||
DEC HL
|
DEC HL
|
||||||
LD A,(HL) ; HL => TEMP_0
|
LD A,(HL)
|
||||||
CP "\\"
|
CP "\\"
|
||||||
JR Z,IS_DIR_SEP
|
JR Z,IS_DIR_SEP
|
||||||
INC HL
|
INC HL
|
||||||
LD (HL),"\\" ; HL => TEMP_BUFFR
|
LD (HL),"\\"
|
||||||
IS_DIR_SEP
|
IS_DIR_SEP
|
||||||
INC HL
|
INC HL
|
||||||
LD (HL),0x0 ; mark end of string
|
LD (HL),0x0 ; mark end of string
|
||||||
LD DE,ENTRY_FILE_NAME
|
LD DE,ENTRY_FILE_NAME
|
||||||
ADD_NAME_TO_PATH
|
|
||||||
|
ADD_FNAME_TO_PATH
|
||||||
LD A,(DE) ; =>ENTRY_FILE_NAME
|
LD A,(DE) ; =>ENTRY_FILE_NAME
|
||||||
LD (HL),A ; =>TEMP_BUFFR + 1
|
LD (HL),A ; =>TEMP_BUFFR + 1
|
||||||
INC HL
|
INC HL
|
||||||
INC DE
|
INC DE
|
||||||
CHK_MV_END
|
; check end of file name
|
||||||
AND A
|
AND A
|
||||||
JR NZ,ADD_NAME_TO_PATH
|
JR NZ,ADD_FNAME_TO_PATH
|
||||||
|
|
||||||
|
; replace UNIX slash to DOS back slash
|
||||||
LD HL,TEMP_BUFFR
|
LD HL,TEMP_BUFFR
|
||||||
CHK_SLASH
|
CHK_SLASH
|
||||||
LD A,(HL) ; HL => TEMP_BUFFR
|
LD A,(HL) ; HL => TEMP_BUFFR
|
||||||
CP '/'
|
CP '/'
|
||||||
JR NZ,OUT_COMP_METHOD
|
JR NZ,SYM_NO_BSLASH
|
||||||
LD (HL),"\\"
|
LD (HL),"\\"
|
||||||
OUT_COMP_METHOD
|
SYM_NO_BSLASH
|
||||||
INC HL
|
INC HL
|
||||||
AND A
|
AND A
|
||||||
JR NZ,CHK_SLASH
|
JR NZ,CHK_SLASH
|
||||||
|
|
||||||
|
; Output compression method to screen
|
||||||
LD HL,(LH_PARAMS)
|
LD HL,(LH_PARAMS)
|
||||||
LD A,H
|
LD A,H
|
||||||
OR A
|
OR A
|
||||||
@ -288,29 +305,30 @@ OUT_COMP_MSG
|
|||||||
LD C,DSS_PCHARS
|
LD C,DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
|
|
||||||
MOVE_FP_REL
|
; move file pointer to next local header in zip file
|
||||||
|
MV_TO_NEXT_LH
|
||||||
LD HL,(LH_COMP_SIZE_H)
|
LD HL,(LH_COMP_SIZE_H)
|
||||||
LD IX,(LH_COMP_SIZE_L)
|
LD IX,(LH_COMP_SIZE_L)
|
||||||
LD BC,DSS_MOVE_FP_CP ; MOVE_FP from Current Pos
|
LD BC,DSS_MOVE_FP_CP ; MOVE_FP from Current Pos
|
||||||
LD A,(FH_INP)
|
LD A,(FH_INP)
|
||||||
RST DSS
|
RST DSS
|
||||||
JP C,ERR_FILE_OP
|
JP C,ERR_FILE_OP
|
||||||
JP RD_LOCL_HDR
|
JP RD_LOCAL_HDR
|
||||||
|
|
||||||
COMP_PARAMS_EMP
|
COMP_PARAMS_EMP
|
||||||
LD HL,MSG_UNKNOWN ; "Unknown: "
|
LD HL,MSG_UNKNOWN ; "Unknown: "
|
||||||
LD C,DSS_PCHARS
|
LD C,DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
JR MOVE_FP_REL
|
JR MV_TO_NEXT_LH
|
||||||
|
|
||||||
DIR_OR_EMPTY
|
DIR_OR_EMPTY
|
||||||
LD HL,TEMP_BUFFR
|
LD HL,TEMP_BUFFR
|
||||||
CALL MAKE_FILE_PATH
|
CALL MAKE_FILE_PATH
|
||||||
OUT (BRD_SND),A
|
OUT (BRD_SND),A
|
||||||
JP C,ERR_FILE_OP
|
JP C,ERR_FILE_OP
|
||||||
JP RD_LOCL_HDR
|
JP RD_LOCAL_HDR
|
||||||
|
|
||||||
; Supported compression method. Stored of Deflate
|
; Supported compression method. Stored or Deflate
|
||||||
C_SUPPORTED
|
C_SUPPORTED
|
||||||
LD HL,(LH_COMP_SIZE_L)
|
LD HL,(LH_COMP_SIZE_L)
|
||||||
LD (BYTES_REMAINS_L),HL
|
LD (BYTES_REMAINS_L),HL
|
||||||
@ -339,6 +357,9 @@ C_SUPPORTED
|
|||||||
LD A,(HL) ; HL => TEMP_0
|
LD A,(HL) ; HL => TEMP_0
|
||||||
CP "\\" ; it is directory separator?
|
CP "\\" ; it is directory separator?
|
||||||
JR Z,DIR_OR_EMPTY
|
JR Z,DIR_OR_EMPTY
|
||||||
|
|
||||||
|
; create output file and jump to ok, or try to create dir
|
||||||
|
; and then create output file
|
||||||
LD HL,TEMP_BUFFR
|
LD HL,TEMP_BUFFR
|
||||||
XOR A
|
XOR A
|
||||||
LD C,DSS_CREATE_FILE
|
LD C,DSS_CREATE_FILE
|
||||||
@ -346,16 +367,20 @@ C_SUPPORTED
|
|||||||
JR NC,OK_CREATE_FILE
|
JR NC,OK_CREATE_FILE
|
||||||
CP E_FILE_EXISTS ; FM = 7?
|
CP E_FILE_EXISTS ; FM = 7?
|
||||||
JR Z,ERR_FILE_EXIST
|
JR Z,ERR_FILE_EXIST
|
||||||
|
; separate output file path and name
|
||||||
LD HL,TEMP_BUFFR
|
LD HL,TEMP_BUFFR
|
||||||
CALL FIND_FILE_NAME
|
CALL SPLIT_PATH_FILE
|
||||||
JP C,ERR_FILE_OP
|
JP C,ERR_FILE_OP
|
||||||
LD HL,TEMP_BUFFR
|
; make output directory
|
||||||
CALL MAKE_FILE_PATH
|
LD HL,TEMP_BUFFR ; HL => output file path
|
||||||
|
CALL MAKE_FILE_PATH
|
||||||
JP C,ERR_FILE_OP
|
JP C,ERR_FILE_OP
|
||||||
|
; change dir to output directory
|
||||||
LD HL,TEMP_BUFFR
|
LD HL,TEMP_BUFFR
|
||||||
LD C,DSS_CHDIR
|
LD C,DSS_CHDIR
|
||||||
RST DSS
|
RST DSS
|
||||||
JP C,ERR_FILE_OP
|
JP C,ERR_FILE_OP
|
||||||
|
; create output file
|
||||||
LD HL,FILE_SPEC
|
LD HL,FILE_SPEC
|
||||||
XOR A
|
XOR A
|
||||||
LD C,DSS_CREATE_FILE
|
LD C,DSS_CREATE_FILE
|
||||||
@ -364,11 +389,12 @@ C_SUPPORTED
|
|||||||
CP E_FILE_EXISTS
|
CP E_FILE_EXISTS
|
||||||
JP NZ,ERR_FILE_OP
|
JP NZ,ERR_FILE_OP
|
||||||
|
|
||||||
|
; If file exists, notify user, and jump to next file
|
||||||
ERR_FILE_EXIST
|
ERR_FILE_EXIST
|
||||||
LD HL,MSG_FILE_EXISTS ; " File exists!"
|
LD HL,MSG_FILE_EXISTS ; " File exists!"
|
||||||
LD C,DSS_PCHARS
|
LD C,DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
JP MOVE_FP_REL
|
JP MV_TO_NEXT_LH
|
||||||
|
|
||||||
OK_CREATE_FILE
|
OK_CREATE_FILE
|
||||||
LD (FH_OUT),A
|
LD (FH_OUT),A
|
||||||
@ -378,7 +404,8 @@ OK_CREATE_FILE
|
|||||||
LD HL,CRC32_L
|
LD HL,CRC32_L
|
||||||
LD B,0x4 ; TODO: Remove exltra B=4
|
LD B,0x4 ; TODO: Remove exltra B=4
|
||||||
|
|
||||||
CRC_CMP
|
; Compare CRC32 from header and calculated for output file
|
||||||
|
CRC_CMP
|
||||||
LD A,(DE) ; DE => LH_CRC32
|
LD A,(DE) ; DE => LH_CRC32
|
||||||
XOR (HL) ; HL => CRC32
|
XOR (HL) ; HL => CRC32
|
||||||
INC HL
|
INC HL
|
||||||
@ -386,6 +413,7 @@ CRC_CMP
|
|||||||
INC A
|
INC A
|
||||||
JR NZ, CRC_CHK_ERR
|
JR NZ, CRC_CHK_ERR
|
||||||
DJNZ CRC_CMP
|
DJNZ CRC_CMP
|
||||||
|
; CRC Ok, close output file and go to next header
|
||||||
LD HL, MSG_OK_CR_LF ; ' '
|
LD HL, MSG_OK_CR_LF ; ' '
|
||||||
LD C, DSS_PCHARS
|
LD C, DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
@ -395,9 +423,10 @@ CRC_CMP
|
|||||||
JP C,ERR_FILE_OP
|
JP C,ERR_FILE_OP
|
||||||
XOR A
|
XOR A
|
||||||
LD (FH_OUT),A ; mark File Manipulator as 0 - closed
|
LD (FH_OUT),A ; mark File Manipulator as 0 - closed
|
||||||
JP RD_LOCL_HDR
|
JP RD_LOCAL_HDR
|
||||||
|
|
||||||
CRC_CHK_ERR
|
CRC_CHK_ERR
|
||||||
|
; Notify user about possible error and go to next header
|
||||||
LD HL,MSG_ERR_CRC ; " Error CRC!"
|
LD HL,MSG_ERR_CRC ; " Error CRC!"
|
||||||
LD C,DSS_PCHARS
|
LD C,DSS_PCHARS
|
||||||
RST DSS
|
RST DSS
|
||||||
@ -405,26 +434,9 @@ CRC_CHK_ERR
|
|||||||
LD C,DSS_CLOSE_FILE
|
LD C,DSS_CLOSE_FILE
|
||||||
RST DSS
|
RST DSS
|
||||||
JP C,ERR_FILE_OP
|
JP C,ERR_FILE_OP
|
||||||
JP RD_LOCL_HDR
|
JP RD_LOCAL_HDR
|
||||||
|
|
||||||
; STRUCT LH_PARAM_STRUCT
|
|
||||||
; VERSION WORD
|
|
||||||
; GPP_FLAG WORD
|
|
||||||
; COMP_METHOD WORD
|
|
||||||
; MTIME WORD
|
|
||||||
; MDATE WORD
|
|
||||||
; CRC32 DWORD
|
|
||||||
; COMP_SIZE DWORD
|
|
||||||
; UCOMP_SIZE DWORD
|
|
||||||
; FNAME_LEN WORD
|
|
||||||
; EXTRA_LEN WORD
|
|
||||||
; FILENAME BYTE
|
|
||||||
; ENDS
|
|
||||||
|
|
||||||
; ----------------------------------------------------
|
|
||||||
; Read local file header
|
|
||||||
; ret A=0 - for LocalHileHeader
|
|
||||||
; A=ff - for CentralDirectory
|
|
||||||
; ----------------------------------------------------
|
; ----------------------------------------------------
|
||||||
; ZIP Local File Header:
|
; ZIP Local File Header:
|
||||||
; +0 sw Signature 0x04034b50
|
; +0 sw Signature 0x04034b50
|
||||||
@ -441,6 +453,28 @@ CRC_CHK_ERR
|
|||||||
; +30 n FileName
|
; +30 n FileName
|
||||||
; +30+n m Extra Field
|
; +30+n m Extra Field
|
||||||
; ----------------------------------------------------
|
; ----------------------------------------------------
|
||||||
|
|
||||||
|
; STRUCT LH_PARAM_STRUCT
|
||||||
|
; VERSION WORD
|
||||||
|
; GPP_FLAG WORD
|
||||||
|
; COMP_METHOD WORD
|
||||||
|
; MTIME WORD
|
||||||
|
; MDATE WORD
|
||||||
|
; CRC32 DWORD
|
||||||
|
; COMP_SIZE DWORD
|
||||||
|
; UCOMP_SIZE DWORD
|
||||||
|
; FNAME_LEN WORD
|
||||||
|
; EXTRA_LEN WORD
|
||||||
|
; FILENAME BYTE
|
||||||
|
; ENDS
|
||||||
|
|
||||||
|
; ----------------------------------------------------
|
||||||
|
; Read local file header to buffer
|
||||||
|
; Out: CF=0 - Ok
|
||||||
|
; A=0x00 - for LocalHileHeader
|
||||||
|
; A=0xff - for CentralDirectory
|
||||||
|
; CF=1 - Error
|
||||||
|
; ----------------------------------------------------
|
||||||
READ_HEADERS
|
READ_HEADERS
|
||||||
LD A,(FH_INP)
|
LD A,(FH_INP)
|
||||||
LD HL,TEMP_BUFFR ; DST ADDR
|
LD HL,TEMP_BUFFR ; DST ADDR
|
||||||
@ -532,11 +566,12 @@ NO_CENTRAL_DIR
|
|||||||
RET
|
RET
|
||||||
|
|
||||||
; ----------------------------------------------------
|
; ----------------------------------------------------
|
||||||
; Read next cmd line parameter
|
; Read next command line parameter
|
||||||
; Inp: HL - pointer to cmd line position
|
; Inp: HL - pointer to cmd line position
|
||||||
; DE - pointer to buffer to place parameter
|
; DE - pointer to buffer to place parameter
|
||||||
|
; Out: CF = 1 if no more parameters
|
||||||
; ----------------------------------------------------
|
; ----------------------------------------------------
|
||||||
READ_CMD_PAR
|
GET_CMD_PARAM
|
||||||
PUSH DE
|
PUSH DE
|
||||||
|
|
||||||
FIRST_SPACE
|
FIRST_SPACE
|
||||||
@ -544,11 +579,14 @@ FIRST_SPACE
|
|||||||
INC HL
|
INC HL
|
||||||
AND A
|
AND A
|
||||||
JR Z,PARAM_EOL
|
JR Z,PARAM_EOL
|
||||||
|
; skip first space
|
||||||
CP ' '
|
CP ' '
|
||||||
JR Z,FIRST_SPACE
|
JR Z,FIRST_SPACE
|
||||||
DEC HL
|
DEC HL
|
||||||
|
|
||||||
PARAM_MOV
|
PARAM_MOV
|
||||||
|
; move parameter to buffer pointed by DE byte by byte
|
||||||
|
; until space or 0 reached
|
||||||
LD A,(HL)
|
LD A,(HL)
|
||||||
AND A
|
AND A
|
||||||
JR Z,PARAM_EOL
|
JR Z,PARAM_EOL
|
||||||
@ -560,9 +598,11 @@ PARAM_MOV
|
|||||||
JR PARAM_MOV
|
JR PARAM_MOV
|
||||||
|
|
||||||
PARAM_EOL
|
PARAM_EOL
|
||||||
|
; set end of string marker 0 at parameter end
|
||||||
XOR A
|
XOR A
|
||||||
LD (DE),A
|
LD (DE),A
|
||||||
POP DE
|
POP DE
|
||||||
|
; if parameter is empty, return CF=1
|
||||||
LD A,(DE)
|
LD A,(DE)
|
||||||
AND A
|
AND A
|
||||||
RET NZ
|
RET NZ
|
||||||
@ -570,47 +610,55 @@ PARAM_EOL
|
|||||||
RET
|
RET
|
||||||
|
|
||||||
; ----------------------------------------------------
|
; ----------------------------------------------------
|
||||||
; File name from filepath
|
; Split filepath for path and file specification
|
||||||
; HL - Buffer to seaarch
|
; (file name, or mask *.zip)
|
||||||
; ret: CF=1 - error
|
; Inp: HL - Ptr to filepath, zero ended
|
||||||
; else FILE_SPEC = file name
|
; Out: CF=1 - Error
|
||||||
|
; CF=0 - FILE_SPEC and trunc filepath to path
|
||||||
; ----------------------------------------------------
|
; ----------------------------------------------------
|
||||||
FIND_FILE_NAME
|
SPLIT_PATH_FILE
|
||||||
PUSH HL
|
PUSH HL
|
||||||
LD BC,0x80
|
; check next 128 bytes to find 0 - end of string
|
||||||
|
LD BC,0x0080
|
||||||
LD A,B
|
LD A,B
|
||||||
CPIR
|
CPIR
|
||||||
LD A,C
|
LD A,C
|
||||||
AND A
|
AND A
|
||||||
JR NZ,NOT_EOS
|
JR NZ,EOS_FOUND
|
||||||
POP HL
|
POP HL
|
||||||
|
; return error flag
|
||||||
LD A,0x10
|
LD A,0x10
|
||||||
SCF
|
SCF
|
||||||
RET
|
RET
|
||||||
NOT_EOS
|
EOS_FOUND
|
||||||
|
; find back for last back slash \
|
||||||
LD C,0x80
|
LD C,0x80
|
||||||
LD A,"\\"
|
LD A,"\\"
|
||||||
CPDR
|
CPDR
|
||||||
LD A,C
|
LD A,C
|
||||||
AND A
|
AND A
|
||||||
JR NZ,NOT_BKSL
|
JR NZ,BKSL_FOUND
|
||||||
POP HL
|
POP HL
|
||||||
|
; copy 13 symbols of filepath to FILE_SPEC. 'filename.zip',0
|
||||||
LD BC,13
|
LD BC,13
|
||||||
LD DE,FILE_SPEC
|
LD DE,FILE_SPEC
|
||||||
LDIR
|
LDIR
|
||||||
AND A
|
AND A ; CF=0
|
||||||
RET
|
RET
|
||||||
NOT_BKSL
|
BKSL_FOUND
|
||||||
INC HL
|
; path + filename
|
||||||
|
; copy filename to FILE_SPEC
|
||||||
|
INC HL ; HL => '\'
|
||||||
LD DE,FILE_SPEC
|
LD DE,FILE_SPEC
|
||||||
LD C,13
|
LD C,13
|
||||||
INC HL
|
INC HL ; HL => first symbol of filename
|
||||||
PUSH HL
|
PUSH HL
|
||||||
LDIR
|
LDIR
|
||||||
POP HL
|
POP HL
|
||||||
|
; mark path endto last symbol of path
|
||||||
LD (HL),0x0
|
LD (HL),0x0
|
||||||
POP HL
|
POP HL
|
||||||
AND A
|
AND A ; CF=0
|
||||||
RET
|
RET
|
||||||
|
|
||||||
; ----------------------------------------------------
|
; ----------------------------------------------------
|
||||||
@ -807,7 +855,7 @@ MSG_ERR_IN_ZIP
|
|||||||
MSG_BAD_TABLE
|
MSG_BAD_TABLE
|
||||||
DB " File has bad table!", 0
|
DB " File has bad table!", 0
|
||||||
|
|
||||||
; RAM page for decompression needs
|
; RAM page for decompression needsFindFi
|
||||||
WORK_P0
|
WORK_P0
|
||||||
DB 0Ah
|
DB 0Ah
|
||||||
; To save memory PAGE0 state
|
; To save memory PAGE0 state
|
||||||
@ -820,11 +868,11 @@ FH_INP
|
|||||||
FH_OUT
|
FH_OUT
|
||||||
DB 0
|
DB 0
|
||||||
; First parameter: Path to file
|
; First parameter: Path to file
|
||||||
INPUT_PATH
|
PATH_INPUT
|
||||||
DS 256, 0
|
DS 256, 0
|
||||||
|
|
||||||
; Second parameter: Path to .zip file
|
; Second parameter: Path to .zip file
|
||||||
OUTPUT_PATH
|
PATH_OUTPUT
|
||||||
DS 256, 0
|
DS 256, 0
|
||||||
|
|
||||||
; Work buffer for FindFist/FindNext op (256bytes)
|
; Work buffer for FindFist/FindNext op (256bytes)
|
||||||
@ -834,6 +882,7 @@ FF_WORK_BUF
|
|||||||
FF_FILE_NAME
|
FF_FILE_NAME
|
||||||
DS 223, 0
|
DS 223, 0
|
||||||
|
|
||||||
|
; Output file name from zip local header
|
||||||
ENTRY_FILE_NAME
|
ENTRY_FILE_NAME
|
||||||
DS 256, 0
|
DS 256, 0
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user