Added COMMAND, SYS and HEX2BIN
Added the reconstructed source code of COMMAND.COM, SYS.COM and HEX2BIN.COM.
This commit is contained in:
@@ -1,2 +1,8 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
|
||||
# 86-DOS text files must use CRLF and have 0x1A EOF markers, we simply mark them as binary
|
||||
*.asm binary
|
||||
*.doc binary
|
||||
*.hex binary
|
||||
*.prn binary
|
||||
|
||||
+488
@@ -0,0 +1,488 @@
|
||||
FCB EQU 5CH
|
||||
DSKRESET EQU 13
|
||||
SETBASE EQU 38
|
||||
SRCHFRST EQU 17
|
||||
SRCHNXT EQU 18
|
||||
RENAM EQU 23
|
||||
INCHAR EQU 1
|
||||
GETFAT EQU 27
|
||||
OPEN EQU 15
|
||||
CLOSE EQU 16
|
||||
MAKE EQU 22
|
||||
DELETE EQU 19
|
||||
RDBLK EQU 39
|
||||
WRBLK EQU 40
|
||||
SETDMA EQU 26
|
||||
SELDRV EQU 14
|
||||
GETDRV EQU 25
|
||||
PRINTBUF EQU 9
|
||||
OUTCH EQU 2
|
||||
INBUF EQU 10
|
||||
RR EQU 33
|
||||
|
||||
ORG 100H
|
||||
|
||||
MOV SP,STACK
|
||||
CLD
|
||||
MOV DL,0 ;Start with A:
|
||||
SETDRV:
|
||||
MOV CL,SELDRV
|
||||
CALL 5
|
||||
COMMAND:
|
||||
MOV SP,STACK
|
||||
CLD
|
||||
MOV AX,CS
|
||||
MOV SS,AX
|
||||
MOV ES,AX
|
||||
MOV DS,AX
|
||||
MOV CX,[6]
|
||||
SUB CX,TPA
|
||||
AND CL,80H ;Round down
|
||||
ROL CX
|
||||
XCHG CH,CL
|
||||
MOV [NUMREC],CX ;Number of records each time
|
||||
MOV DX,CRLF
|
||||
MOV CL,PRINTBUF
|
||||
CALL 5
|
||||
MOV DX,COMMAND
|
||||
MOV AX,2522H ;Set vector 34 (terminate)
|
||||
INT 33
|
||||
MOV AX,2523H ;Set vector 35 (CTRL-C)
|
||||
INT 33
|
||||
GETCOM:
|
||||
MOV CL,GETDRV
|
||||
CALL 5
|
||||
ADD AL,"A"
|
||||
MOV CL,OUTCH
|
||||
MOV DL,AL
|
||||
CALL 5 ;Print drive letter
|
||||
MOV DL,":"
|
||||
MOV CL,OUTCH
|
||||
CALL 5 ;Print :
|
||||
MOV DX,LINEBUF
|
||||
MOV CL,INBUF
|
||||
CALL 5
|
||||
MOV DL,10
|
||||
MOV CL,OUTCH
|
||||
CALL 5 ;New line
|
||||
MOV CH,0
|
||||
MOV SI,FILLINFO ;8 spaces
|
||||
MOV DI,ID
|
||||
CALL FILLBUF
|
||||
MOV DI,FCB
|
||||
CALL FILLBUF
|
||||
MOV SI,LINEBUF+2
|
||||
MOV DI,ID
|
||||
CALL FILEDRV ;Get COM drive
|
||||
MOV [SPECDRV],AL
|
||||
MOV CX,8
|
||||
CALL COPYNAM ;Copy file name
|
||||
MOV AL,9
|
||||
SUB AL,CL
|
||||
MOV [IDLEN],AL
|
||||
MOV DI,81H
|
||||
MOV CX,0
|
||||
PUSH SI
|
||||
COMTAIL:
|
||||
LODB
|
||||
STOB ;Move command tail to 80H
|
||||
CMP AL,13
|
||||
LOOPNZ COMTAIL
|
||||
NOT CL
|
||||
MOV [80H],CL
|
||||
POP SI
|
||||
MOV DI,FCB
|
||||
CALL PARSENAM
|
||||
MOV DI,FCB+10H
|
||||
CALL PARSENAM
|
||||
MOV AL,[IDLEN]
|
||||
MOV DL,[SPECDRV]
|
||||
OR DL,DL ;Check if drive was specified
|
||||
JNZ DRVCHK
|
||||
DEC AL ;Check for null command
|
||||
JZ GETCOM
|
||||
MOV SI,COMTAB
|
||||
FINDCOM:
|
||||
MOV DI,IDLEN
|
||||
MOV CL,[SI]
|
||||
JCXZ EXTERNAL
|
||||
REPE
|
||||
CMPB
|
||||
LAHF
|
||||
ADD SI,CX ;Bump to next position without affecting flags
|
||||
SAHF
|
||||
LODW ;Get address of command
|
||||
JNZ FINDCOM
|
||||
CALL AX ;Call command
|
||||
JMP COMMAND
|
||||
SETDRV1:
|
||||
JMP SETDRV
|
||||
DRVCHK:
|
||||
DEC DL ;Adjust for correct drive number
|
||||
DEC AL ;Check if anything else is on line
|
||||
JZ SETDRV1
|
||||
EXTERNAL:
|
||||
MOV AL,[SPECDRV]
|
||||
MOV [IDLEN],AL
|
||||
PUSH DS
|
||||
MOV DX,TPA
|
||||
ADD DX,0FH ;Round to next paragraph
|
||||
SHR DX
|
||||
SHR DX
|
||||
SHR DX
|
||||
SHR DX ;Divide 16
|
||||
MOV CX,CS
|
||||
ADD DX,CX ;New segment
|
||||
MOV DS,DX
|
||||
MOV AH,SETBASE
|
||||
INT 33
|
||||
MOV DX,100H
|
||||
MOV CL,SETDMA
|
||||
CALL 5
|
||||
MOV BX,DS ;New segment into BX
|
||||
POP DS
|
||||
MOV DX,IDLEN
|
||||
MOV AH,OPEN
|
||||
INT 33
|
||||
OR AL,AL
|
||||
JNZ BADCOM
|
||||
MOV W,[IDLEN+RR],0
|
||||
MOV CX,512 ;512 records
|
||||
MOV AH,RDBLK
|
||||
INT 33
|
||||
MOV DS,BX
|
||||
MOV ES,BX
|
||||
MOV SS,BX
|
||||
MOV SP,40H
|
||||
MOV AX,0
|
||||
PUSH AX
|
||||
MOV AX,100H
|
||||
PUSH BX
|
||||
PUSH AX
|
||||
MOV CL,SETDMA
|
||||
MOV DX,80H
|
||||
CALL 5
|
||||
RET L
|
||||
BADCOM:
|
||||
MOV DX,BADNAM
|
||||
MOV CL,PRINTBUF
|
||||
CALL 5
|
||||
JMP COMMAND
|
||||
|
||||
NEXTCHR:
|
||||
;Convert lower case input to upper case
|
||||
LODB
|
||||
CMP AL,"a"-1
|
||||
JB DELIM
|
||||
CMP AL,"z"
|
||||
JA DELIM
|
||||
SUB AL,20H ;Lower-case changed to upper-case
|
||||
DELIM:
|
||||
CMP AL," "
|
||||
JZ RET
|
||||
CMP AL,"="
|
||||
JZ RET
|
||||
CMP AL,","
|
||||
JZ RET
|
||||
CMP AL,";"
|
||||
JZ RET
|
||||
CMP AL,9 ;Check for TAB character
|
||||
RET
|
||||
|
||||
FILEDRV:
|
||||
CALL NEXTCHR
|
||||
JZ FILEDRV ;Skip delim
|
||||
CMP AL,13
|
||||
JZ NOMATCH
|
||||
CMP B,[SI],":"
|
||||
JNZ NOMATCH
|
||||
SUB AL,40H ;A => 1, B => 2
|
||||
INC SI
|
||||
RET
|
||||
|
||||
PARSENAM:
|
||||
CALL NEXTCHR
|
||||
JZ ISDELIM
|
||||
CMP AL,13
|
||||
JNZ PARSENAM
|
||||
DEC SI
|
||||
ISDELIM:
|
||||
CALL FILEDRV
|
||||
STOB
|
||||
MOV CX,11
|
||||
CALL COPYNAM
|
||||
ADD DI,CX
|
||||
CMP CX,3
|
||||
JB RET
|
||||
SUB DI,3
|
||||
CMP AL,"."
|
||||
JNZ NOMATCH
|
||||
MOV CX,3
|
||||
COPYNAM:
|
||||
CALL NEXTCHR
|
||||
JZ NOMATCH
|
||||
CMP AL,13
|
||||
JZ NOMATCH
|
||||
CMP AL,"."
|
||||
JZ RET
|
||||
STOB
|
||||
LOOP COPYNAM
|
||||
NOMATCH:
|
||||
XOR AL,AL
|
||||
DEC SI
|
||||
RET
|
||||
|
||||
FILLBUF:
|
||||
LODB
|
||||
MOV CL,AL
|
||||
JCXZ RET
|
||||
LODB
|
||||
REP
|
||||
STOB
|
||||
JP FILLBUF
|
||||
|
||||
DIR:
|
||||
CMP B,[FCB+1]," "
|
||||
JNZ HASNAME
|
||||
MOV SI,FCBFIL
|
||||
MOV DI,FCB+1
|
||||
CALL FILLBUF ;Fill 11 bytes with "?"
|
||||
HASNAME:
|
||||
MOV DX,LINEBUF+2+1
|
||||
MOV CL,SETDMA
|
||||
CALL 5
|
||||
MOV CL,SRCHFRST
|
||||
MOV DX,FCB
|
||||
EACHFILE:
|
||||
CALL 5
|
||||
INC AL ;FF = file not found
|
||||
JZ RET
|
||||
MOV SI,LINEBUF+2+1
|
||||
MOV CX,8
|
||||
CALL OUTCNT ;Print 8 chars (name)
|
||||
MOV CL,OUTCH
|
||||
MOV DL," "
|
||||
CALL 5 ;Print space
|
||||
MOV SI,LINEBUF+2+9
|
||||
MOV CX,3
|
||||
CALL OUTCNT ;Print 3 chars (ext)
|
||||
MOV DX,CRLF
|
||||
MOV CL,PRINTBUF
|
||||
CALL 5 ;Print new line
|
||||
MOV CL,SRCHNXT
|
||||
JP EACHFILE
|
||||
OUTCNT:
|
||||
LODB
|
||||
PUSH CX
|
||||
PUSH SI
|
||||
MOV DL,AL
|
||||
MOV CL,OUTCH
|
||||
CALL 5
|
||||
POP SI
|
||||
POP CX
|
||||
LOOP OUTCNT
|
||||
RET
|
||||
|
||||
RENAME:
|
||||
MOV CL,RENAM
|
||||
MOV DX,FCB
|
||||
JMP 5
|
||||
|
||||
ERASE:
|
||||
MOV CL,DELETE
|
||||
MOV DX,FCB
|
||||
JMP 5
|
||||
|
||||
CREATE:
|
||||
MOV CL,MAKE
|
||||
MOV DX,FCB
|
||||
JMP 5
|
||||
|
||||
TYPE:
|
||||
MOV DX,TPA
|
||||
MOV CL,SETDMA
|
||||
CALL 5
|
||||
MOV DX,FCB
|
||||
MOV AH,OPEN
|
||||
INT 33
|
||||
OR AL,AL
|
||||
JNZ RET ; Not found
|
||||
MOV W,[FCB+RR],0
|
||||
MOV CX,512
|
||||
MOV AH,RDBLK
|
||||
INT 33
|
||||
MOV SI,TPA
|
||||
OUTLP:
|
||||
LODB
|
||||
CMP AL,1AH ;Is EOF?
|
||||
JZ RET
|
||||
MOV CL,OUTCH
|
||||
MOV DL,AL
|
||||
CALL 5
|
||||
JP OUTLP
|
||||
RET
|
||||
|
||||
CLEAR:
|
||||
MOV DX,ERAMES
|
||||
MOV CL,PRINTBUF
|
||||
CALL 5 ;Confirm erase
|
||||
MOV CL,INCHAR
|
||||
CALL 5
|
||||
CMP AL,"Y"
|
||||
JZ DOCLEAR
|
||||
CMP AL,"y"
|
||||
JZ DOCLEAR
|
||||
RET
|
||||
DOCLEAR:
|
||||
MOV DL,[FCB]
|
||||
OR DL,DL
|
||||
JZ CLRDSK
|
||||
DEC DL
|
||||
MOV CL,SELDRV
|
||||
CALL 5
|
||||
CLRDSK:
|
||||
MOV CL,GETFAT
|
||||
CALL 5
|
||||
MOV CX,DX
|
||||
INC DX
|
||||
SHR DX
|
||||
ADD CX,DX
|
||||
MOV AX,DS
|
||||
MOV ES,AX
|
||||
MOV DI,BX
|
||||
MOV AX,0FFFFH
|
||||
STOW
|
||||
STOB ;Fill first 3 bytes with FF
|
||||
INC AX ;AX = 0
|
||||
SHR CX
|
||||
JNC DOFILL
|
||||
STOB ;Odd byte
|
||||
DOFILL:
|
||||
REP
|
||||
STOW
|
||||
MOV AX,CS
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
MOV SI,FCBFIL
|
||||
MOV DI,FCB+1
|
||||
CALL FILLBUF
|
||||
MOV DX,FCB
|
||||
MOV CL,DELETE
|
||||
CALL 5 ;Delete all files
|
||||
MOV CL,DSKRESET
|
||||
JMP 5
|
||||
|
||||
COPY:
|
||||
MOV SI,FCB+10H
|
||||
MOV DI,DSTFCB
|
||||
MOVB
|
||||
CMP B,[SI]," " ;Has file name?
|
||||
JNZ HASDSTNAM
|
||||
MOV SI,FCB+1
|
||||
HASDSTNAM:
|
||||
MOVB
|
||||
MOV CX,7
|
||||
REP
|
||||
MOVW
|
||||
MOV DX,FCB
|
||||
MOV AH,OPEN
|
||||
INT 33
|
||||
OR AL,AL
|
||||
JNZ NOSRC
|
||||
MOV DX,DSTFCB
|
||||
MOV AH,DELETE
|
||||
INT 33
|
||||
MOV AH,MAKE
|
||||
INT 33
|
||||
MOV DX,TPA
|
||||
MOV AH,SETDMA
|
||||
INT 33
|
||||
MOV W,[FCB+RR],0
|
||||
MOV W,[DSTFCB+RR],0
|
||||
CPYBLK:
|
||||
MOV DX,FCB
|
||||
MOV CX,[NUMREC]
|
||||
MOV AH,RDBLK
|
||||
INT 33
|
||||
JCXZ CPYDONE
|
||||
MOV DX,DSTFCB
|
||||
MOV AH,WRBLK
|
||||
INT 33
|
||||
OR AL,AL
|
||||
JZ CPYBLK
|
||||
MOV DX,NOSPACE
|
||||
MOV AH,PRINTBUF
|
||||
INT 33
|
||||
CPYDONE:
|
||||
MOV DX,DSTFCB
|
||||
MOV AH,CLOSE
|
||||
INT 33
|
||||
RET
|
||||
NOSRC:
|
||||
MOV DX,NOTFND
|
||||
MOV AH,PRINTBUF
|
||||
INT 33
|
||||
RET
|
||||
|
||||
DS 40
|
||||
STACK:
|
||||
|
||||
BADNAM:
|
||||
DB "Bad command or file name"
|
||||
CRLF:
|
||||
DB 13,10,"$"
|
||||
ERAMES:
|
||||
DB "Erase all files (Y/N)? $"
|
||||
NOTFND:
|
||||
DB "Source file not found$"
|
||||
NOSPACE:
|
||||
DB "Insufficient disk space$"
|
||||
|
||||
FCBFIL:
|
||||
DB 11,"?"
|
||||
DB 0
|
||||
|
||||
SPECDRV:
|
||||
DS 1
|
||||
NUMREC:
|
||||
DS 2
|
||||
|
||||
IDLEN:
|
||||
DS 1
|
||||
ID:
|
||||
DS 8
|
||||
COM:
|
||||
DB "COM"
|
||||
DSTFCB:
|
||||
DS 36
|
||||
|
||||
LINEBUF:
|
||||
DB 80H,1,13
|
||||
DS 80H
|
||||
|
||||
FILLINFO:
|
||||
DB 8," "
|
||||
DB 0
|
||||
DB 12," ",4,0
|
||||
DB 12," ",8,0
|
||||
DB 0
|
||||
|
||||
COMTAB:
|
||||
DB 4,"DIR"
|
||||
DW DIR
|
||||
DB 7,"RENAME"
|
||||
DW RENAME
|
||||
DB 6,"ERASE"
|
||||
DW ERASE
|
||||
DB 7,"CREATE"
|
||||
DW CREATE
|
||||
DB 5,"TYPE"
|
||||
DW TYPE
|
||||
DB 6,"CLEAR"
|
||||
DW CLEAR
|
||||
DB 5,"COPY"
|
||||
DW COPY
|
||||
DB 0
|
||||
|
||||
TPA:
|
||||
|
||||
+155
@@ -0,0 +1,155 @@
|
||||
; HEX2BIN
|
||||
; Converts Intel hex format files to straight binary
|
||||
|
||||
FCB: EQU 5CH
|
||||
READ: EQU 20
|
||||
SETDMA: EQU 26
|
||||
OPEN: EQU 15
|
||||
CLOSE: EQU 16
|
||||
CREATE: EQU 22
|
||||
DELETE: EQU 19
|
||||
BLKWRT: EQU 40
|
||||
BUFFER: EQU 80H
|
||||
BUFSIZ: EQU 128
|
||||
|
||||
ORG 100H
|
||||
PUT 100H
|
||||
|
||||
HEX2BIN:
|
||||
MOV DI,FCB+9
|
||||
CMP B,[DI]," "
|
||||
JNZ HAVEXT
|
||||
MOV SI,HEX
|
||||
MOVB
|
||||
MOVW
|
||||
HAVEXT:
|
||||
;Get load offset (default is -100H)
|
||||
MOV AH,OPEN
|
||||
MOV DX,FCB
|
||||
INT 21H
|
||||
OR AL,AL
|
||||
JNZ NOFIL
|
||||
MOV B,[FCB+32],0
|
||||
MOV AH,READ
|
||||
MOV BP,START
|
||||
MOV SI,BUFFER+BUFSIZ ;Flag input buffer as empty
|
||||
READHEX:
|
||||
CALL GETCH
|
||||
CMP AL,":" ;Search for : to start line
|
||||
JNZ READHEX
|
||||
CALL GETBYT ;Get byte count
|
||||
MOV CL,AL
|
||||
MOV CH,0
|
||||
JCXZ DONE
|
||||
CALL GETBYT ;Get high byte of load address
|
||||
MOV BH,AL
|
||||
CALL GETBYT ;Get low byte of load address
|
||||
MOV BL,AL
|
||||
ADD BX,START-100H ;Add in offset
|
||||
MOV DI,BX
|
||||
CALL GETBYT ;Throw away type byte
|
||||
READLN:
|
||||
CMP DI,[6]
|
||||
JAE ADERR
|
||||
CMP DI,START
|
||||
JB ADERR
|
||||
CALL GETBYT ;Get data byte
|
||||
STOB
|
||||
LOOP READLN
|
||||
CMP DI,BP ;Check if this is the largest address so far
|
||||
JBE READHEX
|
||||
MOV BP,DI ;Save new largest
|
||||
JP READHEX
|
||||
|
||||
NOFIL:
|
||||
MOV DX,NOFILE
|
||||
QUIT:
|
||||
MOV AH,9
|
||||
INT 21H
|
||||
INT 20H
|
||||
|
||||
ADERR:
|
||||
MOV DX,ADDR
|
||||
JMP ERROR
|
||||
|
||||
GETCH:
|
||||
CMP SI,BUFFER+BUFSIZ
|
||||
JNZ NOREAD
|
||||
INT 21H
|
||||
OR AL,AL
|
||||
JNZ ERROR
|
||||
MOV SI,BUFFER
|
||||
NOREAD:
|
||||
LODB
|
||||
CMP AL,1AH
|
||||
JZ DONE
|
||||
RET
|
||||
|
||||
GETBYT:
|
||||
CALL HEXDIG
|
||||
MOV BL,AL
|
||||
CALL HEXDIG
|
||||
SHL BL
|
||||
SHL BL
|
||||
SHL BL
|
||||
SHL BL
|
||||
OR AL,BL
|
||||
RET
|
||||
|
||||
HEXDIG:
|
||||
CALL GETCH
|
||||
SUB AL,"0"
|
||||
JC ERROR
|
||||
CMP AL,9
|
||||
JBE RET
|
||||
SUB AL,"A"-"0"-10
|
||||
JC ERROR
|
||||
CMP AL,15
|
||||
JBE RET
|
||||
ERROR:
|
||||
MOV DX,ERRMES
|
||||
MOV AH,9
|
||||
INT 21H
|
||||
DONE:
|
||||
MOV DI,FCB+9
|
||||
MOV SI,COM
|
||||
MOVB
|
||||
MOVW
|
||||
MOV DX,FCB
|
||||
MOV AH,DELETE
|
||||
INT 21H
|
||||
MOV AH,CREATE
|
||||
INT 21H
|
||||
OR AL,AL
|
||||
JNZ NOROOM
|
||||
MOV W,[FCB+33],0
|
||||
MOV DX,START
|
||||
MOV AH,SETDMA
|
||||
INT 21H
|
||||
MOV CX,BP
|
||||
SUB CX,1F2H
|
||||
AND CL,80H
|
||||
JCXZ EXIT
|
||||
ROL CX
|
||||
XCHG CL,CH
|
||||
MOV AH,BLKWRT
|
||||
MOV DX,FCB
|
||||
INT 21H
|
||||
MOV AH,CLOSE
|
||||
INT 21H
|
||||
EXIT:
|
||||
INT 20H
|
||||
|
||||
NOROOM:
|
||||
MOV DX,DIRFUL
|
||||
JMP QUIT
|
||||
|
||||
HEX: DB "HEX"
|
||||
COM: DB "COM"
|
||||
ERRMES: DB "Error in HEX file--conversion aborted$"
|
||||
NOFILE: DB "File not found$"
|
||||
ADDR: DB "Address out of range--conversion aborted$"
|
||||
DIRFUL: DB "Disk directory full$"
|
||||
|
||||
START:
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
FCB EQU 5CH
|
||||
|
||||
ORG 100H
|
||||
JMP START
|
||||
SECS:
|
||||
DW 52 ;Patch for different configs
|
||||
|
||||
START:
|
||||
MOV AL,[FCB]
|
||||
OR AL,AL
|
||||
JZ BADDRV
|
||||
DEC AL
|
||||
JZ BADDRV
|
||||
MOV [FCB],AL
|
||||
MOV CX,[SECS]
|
||||
MOV DX,0
|
||||
MOV BX,END
|
||||
MOV AL,0
|
||||
INT 37
|
||||
JC RDERR
|
||||
POPF
|
||||
MOV CX,[SECS]
|
||||
MOV DX,0
|
||||
MOV BX,END
|
||||
MOV AL,[FCB]
|
||||
MOV AH,1
|
||||
INT 38
|
||||
JC WRERR
|
||||
MOV DX,TRANSOK
|
||||
JP QUIT
|
||||
|
||||
RDERR:
|
||||
MOV DX,RDERMSG
|
||||
|
||||
QUIT:
|
||||
MOV AH,9
|
||||
INT 33
|
||||
INT 32
|
||||
|
||||
WRERR:
|
||||
MOV DX,WRERMSG
|
||||
JP QUIT
|
||||
|
||||
BADDRV:
|
||||
MOV DX,BADDRVMSG
|
||||
JP QUIT
|
||||
|
||||
TRANSOK:
|
||||
DB "System transfered$"
|
||||
RDERMSG:
|
||||
DB "Disk read error$"
|
||||
WRERMSG:
|
||||
DB "Disk write error$"
|
||||
BADDRVMSG:
|
||||
DB "Bad drive specification"
|
||||
|
||||
END:
|
||||
|
||||
Reference in New Issue
Block a user