155 lines
2.3 KiB
NASM
155 lines
2.3 KiB
NASM
; 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:
|
|
|