home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
MSBOOASM.ZIP
/
MSBPC2.ASM
< prev
next >
Wrap
Assembly Source File
|
1989-03-15
|
8KB
|
390 lines
TITLE MSBPC2 MS-DOS System BOO to EXE Utility Program
; (c) 1988 W.C. Parke, WGCP0086@GWUVM
; This program converts a BOO file to an EXE or binary file
;
; BOO files are ASCII files constructed from binary files and used
; to transfer the files over networks or tape which do not accept binary.
; The translation is by the following algorithm (by Bill Catchings):
; 1. The name of the file is placed on the first line, in plain text,
; followed by CR,LF
; 2. If a series of nulls occurs, a '~' (7EH) is used followed by
; an byte number for the null count, with a '0' bias, up to 7EH.
; 3. Three byte sequences are coded as 4 bytes, taking 6 bits from
; each byte and adding a '0' bias.
; 4. Carriage return/linefeeds are inserted to make lines break
; at approximately column 76.
;
; MSBPC2 compiled with MASM 5.10. Use LINK and EXE2BIN to make COM file.
;
; May be used with any BOO file on any MS-DOS path.
;
; This program translated the MSVIBM.BOO file in 15 seconds
; on an IBM XT clone. MSBPCT V1.0 took 6 min. 32 sec.
; The dramatic speed up comes largely from using large
; local file buffers.
;
; MSBPC2 uses the file name on the first line of the BOO file
; for its output file.
LF EQU 0AH
CR EQU 0DH
BUFSIZ EQU 6000H
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
ORG 100H
START: JMP BOO
FHAND1 DW 0
FNAM1 DB 80 DUP(0)
FHAND2 DW 0
FNAM2 DB 80 DUP(0)
INVOC DB CR,LF,'MSBPC2 Version 1.1'
DB CR,LF,'BOO file to binary file converter.'
DB CR,LF,'(c) 1988 W.C. Parke',CR,LF,CR,LF,'$'
DHPERR DB 'Syntax:',CR,LF,LF
DB ' MSBPC2 boofile',CR,LF,CR,LF,'$'
DCONV DB 'Converting $'
DTO DB ' to $'
DDOT DB ' ...$'
DEXIST DB ' already exists. Overwrite it? $'
DERROR DB CR,LF,'Error in file $'
DOPERR DB 'open$'
DCRERR DB 'creation$'
DCHERR DB 'character$'
DCLERR DB 'close$'
DRDERR DB 'read$'
DWRERR DB 'write$'
DERRF DB '.',CR,LF,'$'
DONE DB CR,LF,'Done.',CR,LF,'$'
BOO: MOV AH,9
MOV DX,OFFSET INVOC
INT 21H ; invocation
MOV SI,80H
LODSB
XOR AH,AH ; command line tail size
AND AX,AX
JNZ BOF
JMP ABORTHP
BOF: MOV DI,OFFSET FNAM1
INC AX
MOV CX,AX
PUSH DI
BO0: LODSB
CMP AL,CR
JZ BO1
CMP AL,20H
JZ BOL
CMP AL,'a'
JC BOS
AND AL,5FH
BOS: STOSB ; save possible file name
BOL: LOOP BO0
BO1: XOR AL,AL
STOSB
POP DX
MOV AH,3DH ; try to open file
INT 21H
JNC BO2
JMP ABORTOP
BO2: MOV FHAND1,AX
MOV DI,OFFSET FNAM2
MOV SI,OFFSET FBUF1
XOR AX,AX
MOV CNT1,AX
MOV CNT2,AX
BOON: CALL GETBN ; get file name from first line of file
JZ BOG
STOSB
JMP SHORT BOON
BOG: XOR AL,AL
STOSB
MOV DX,OFFSET FNAM2
XOR CX,CX
MOV AH,4EH
INT 21H ; search for file in our directory
JC BOZ ; not there
PUSH SI
MOV SI,OFFSET FNAM2
CALL SHOW
POP SI
MOV AH,9
MOV DX,OFFSET DEXIST
INT 21H
MOV AX,0C01H ; say exists, overwrite?
INT 21H
PUSH AX
MOV AH,2
MOV DL,CR
INT 21H
MOV DL,LF
INT 21H
POP AX
AND AL,5FH
CMP AL,'Y'
JZ BOZ
JMP EXIT
BOZ: MOV DX,OFFSET FNAM2
MOV AH,3CH
XOR CX,CX
INT 21H ; create output file
JC ABORTCR
MOV FHAND2,AX
PUSH SI
MOV AH,9
MOV DX,OFFSET DCONV ; say converting
INT 21H
MOV SI,OFFSET FNAM1 ; this file
CALL SHOW
MOV AH,9
MOV DX,OFFSET DTO ; to
INT 21H
MOV SI,OFFSET FNAM2 ; this one
CALL SHOW
MOV AH,9
MOV DX,OFFSET DDOT ; show dots
INT 21H
POP SI
MOV DI,OFFSET FBUF2
JMP NEXT ; conversion loop
PUBLIC FIN
FIN: CALL OUTLST
JC ABORTCL
MOV AH,9
MOV DX,OFFSET DONE ; say done
INT 21H
EXIT: MOV AX,4C00H
INT 21H
ABORTOP:
MOV DX,OFFSET DOPERR ; file open error
MOV AL,2
JMP ABORT
ABORTCR:
MOV DX,OFFSET DCRERR ; file create error
MOV AL,3
JMP ABORT
ABORTCL:
MOV DX,OFFSET DCLERR ; file close error
MOV AL,7
JMP ABORT
PUBLIC NULLS ; process nulls
NULLS: CALL GETB
XOR AH,AH
MOV CX,AX
XOR AL,AL
PUBLIC NULLN
NULLN: CALL OUTB
LOOP NULLN
PUBLIC NEXT
NEXT: CALL GETB
CMP AL,'~'-'0'
JZ NULLS ; got a null code
MOV AH,AL
CALL GETB
MOV BX,AX ; save first code pair in bx
CALL GETB
MOV AH,AL
CALL GETB ; save second code pair in ax
SHL AL,1
SHL AL,1
SHL BL,1
SHL BL,1 ; bx ax = 0xxxxxx0 0xxxxxx0
SHL AX,1
SHL AX,1
SHR BX,1
SHR BX,1 ; bx ax = 00xxxxxx xxxxxx00
SHL AX,1
RCL BX,1
RCL AX,1
RCL BX,1
RCL AX,1
RCL BX,1
RCL AX,1
RCL BX,1 ; bx ax = xxxxxxxx xxxx0000
MOV DX,AX
MOV AL,BH
CALL OUTB
MOV AL,BL
CALL OUTB
MOV AL,DH
CALL OUTB
JMP NEXT
PUBLIC GETB
CNT1 DW 0
GETBF: CALL GETMF ; load buffer from file
JNC GETBG
JMP SHORT GETBEC ; error loading buffer
GETB: ; get a byte from input
CMP WORD PTR CNT1,0
JZ GETBF ; no more bytes in buffer - read more in
GETBG: LODSB
DEC WORD PTR CNT1
AND AL,7FH ; drop eigth bit
CMP AL,7FH ; our EOF byte
JZ GETBFIN
CMP AL,LF ; skip lf's
JZ GETB
CMP AL,CR ; skip cr's
JZ GETB
CMP AL,1AH ;^Z
JZ GETBFIN ; EOF for ascii file
AND AL,AL
JZ GETBFIN ; null also EOF for ascii file
SUB AL,'0' ; remove bias
JC GETBEC ; no other control codes allowed
RET
GETBEC: POP AX
JMP ABORTCH ; character error in file
GETBFIN:
POP AX
JMP FIN ; write and close output file
GETMF: ; get more from input file
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,FHAND1
MOV DX,OFFSET FBUF1 ; buffer for input file bytes
MOV AH,3FH
MOV CX,BUFSIZ ; size of buffer
INT 21H ; get bytes
MOV SI,OFFSET FBUF1
POP DX
POP CX
POP BX
JC GETBC ; error reading input file
MOV CNT1,AX
CMP AX,BUFSIZ
JC GETBE ; got less than full buffer
POP AX
RET
GETBE: PUSH BX
MOV BX,WORD PTR CNT1
MOV AX,07F7FH
MOV WORD PTR [SI+BX],AX ; terminator bytes are 7fh
POP BX
CLC
GETBC: POP AX ; carry error
RET
PUBLIC GETBN
GETBN: ; get file name from first line of input file
CMP WORD PTR CNT1,0
JZ GETBM
GETBNG: LODSB
DEC WORD PTR CNT1
AND AL,7FH
CMP AL,LF ; end of line sets Zero flag
JZ GETR
CMP AL,CR ; end of line sets Zero flag
GETR: RET
GETBM: CALL GETMF ; get more characters from file
JNC GETBNG ; ok to get a character from buffer
POP AX
JMP ABORTRD ; file read error
PUBLIC OUTB
CNT2 DW 0
OUTBB: CALL OUTBF
JC OUTBCA
OUTB: ; output a byte to output buffer
CMP CNT2,BUFSIZ
JNC OUTBB
STOSB ; store byte
INC WORD PTR CNT2
CLC
RET
OUTBCA: POP AX
JMP ABORTWR ; problems with write
OUTBF: ; flush output buffer to file
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,WORD PTR FHAND2
MOV AH,40H
MOV DX,OFFSET FBUF2
MOV CX,BUFSIZ
INT 21H
POP DX
POP CX
POP BX
JC OUTBC ; write error
CMP AX,BUFSIZ
JNZ OUTBC ; incomplete write, disk full
MOV WORD PTR CNT2,0
MOV DI,OFFSET FBUF2
OUTBC: POP AX
RET
OUTLST: ; flush last of buffer, then close file
MOV BX,WORD PTR FHAND2
MOV AH,40H
MOV DX,OFFSET FBUF2
MOV CX,CNT2
INT 21H
MOV AH,3EH
INT 21H
RET
ABORTHP: ; abort with help screen
MOV DX,OFFSET DHPERR
MOV AH,9
INT 21H
MOV AX,4C01H
INT 21H
ABORTRD:
MOV DX,OFFSET DRDERR ; abort, file read error
MOV AL,4
JMP SHORT ABORT
ABORTCH: ; abort, file character error
CALL OUTLST
MOV DX,OFFSET DCHERR
MOV AL,5
JMP SHORT ABORT
ABORTWR: ; abort, file write error
MOV DX,OFFSET DWRERR
MOV AL,6
ABORT: CALL ABERR ; show start of error message
PUSH AX
MOV AH,9 ; show text of error message
INT 21H
MOV DX,OFFSET DERRF ; period ending
INT 21H
POP AX ; recover error index
MOV AH,4CH
INT 21H
ABERR: PUSH AX
PUSH DX
MOV DX,OFFSET DERROR
MOV AH,9
INT 21H
POP DX
POP AX
RET
EVEN
SHOW: MOV AH,2 ; show asciiz string
SHOM: LODSB
AND AL,AL
JZ SHOE
MOV DL,AL
INT 21H
JMP SHORT SHOM
SHOE: RET
FBUF1 EQU $
FBUF2 EQU $+BUFSIZ
CODE ENDS
END START