]> wirehaze git hosting - MS-DOS.git/blob - v1.25/source/HEX2BIN.ASM

wirehaze git hosting

Fixed typos
[MS-DOS.git] / v1.25 / source / HEX2BIN.ASM
1 ; HEX2BIN version 1.02
2 ; Converts Intel hex format files to straight binary
3
4 FCB: EQU 5CH
5 READ: EQU 20
6 SETDMA: EQU 26
7 OPEN: EQU 15
8 CLOSE: EQU 16
9 CREATE: EQU 22
10 DELETE: EQU 19
11 BLKWRT: EQU 40
12 GETSEG: EQU 38
13 BUFSIZ: EQU 1024
14
15 ORG 100H
16 PUT 100H
17
18 HEX2BIN:
19 MOV DI,FCB+9
20 CMP B,[DI]," "
21 JNZ HAVEXT
22 MOV SI,HEX
23 MOVB
24 MOVW
25 HAVEXT:
26 ;Get load offset (default is -100H)
27 MOV CL,4 ;Needed for shifts
28 MOV [OFFSET],-100H
29 MOV SI,FCB+11H ;Scan second FCB for offset
30 LODB
31 CMP AL," " ;Check if offset present
32 JZ HAVOFF
33 MOV B,[SIGN],0 ;Assume positive sign for now
34 CMP AL,"+"
35 JZ GETOFF ;Get a positive offset
36 CMP AL,"-"
37 JNZ GETOFF1 ;If not + or -, then not signed
38 MOV B,[SIGN],1 ;Flag as negative offset
39 GETOFF:
40 LODB ;Eat sign
41 GETOFF1:
42 CALL HEXCHK ;Check for valid hex character
43 JC HAVOFF ;No offset if not valid
44 XOR BX,BX ;Intialize offset sum to 0
45 CONVOFF:
46 SHL BX,CL ;Multiply current sum by 16
47 OR BL,AL ;Add in current hex digit
48 LODB ;Get next digit
49 CALL HEXCHK ;And convert it to binary
50 JNC CONVOFF ;Loop until all hex digits read
51 TEST B,[SIGN],-1 ;Check if offset was to be negative
52 JZ SAVOFF
53 NEG BX
54 SAVOFF:
55 MOV [OFFSET],BX
56 HAVOFF:
57 MOV DX,STARTSEG
58 MOV AX,DS
59 ADD DX,AX ;Compute load segment
60 MOV AH,GETSEG
61 INT 33
62 MOV ES,DX
63 SEG ES
64 MOV CX,[6] ;Get size of segment
65 MOV [SEGSIZ],CX
66 XOR AX,AX
67 MOV DI,AX
68 MOV BP,AX
69 SHR CX
70 REP
71 STOW ;Fill entire segment with zeros
72 MOV AH,OPEN
73 MOV DX,FCB
74 INT 21H
75 OR AL,AL
76 JNZ NOFIL
77 MOV B,[FCB+32],0
78 MOV [FCB+14],BUFSIZ ;Set record size to buffer size
79 MOV DX,BUFFER
80 MOV AH,SETDMA
81 INT 33
82 MOV AH,READ
83 MOV DX,FCB ;All set up for sequential reads
84 MOV SI,BUFFER+BUFSIZ ;Flag input buffer as empty
85 READHEX:
86 CALL GETCH
87 CMP AL,":" ;Search for : to start line
88 JNZ READHEX
89 CALL GETBYT ;Get byte count
90 MOV CL,AL
91 MOV CH,0
92 JCXZ DONE
93 CALL GETBYT ;Get high byte of load address
94 MOV BH,AL
95 CALL GETBYT ;Get low byte of load address
96 MOV BL,AL
97 ADD BX,[OFFSET] ;Add in offset
98 MOV DI,BX
99 CALL GETBYT ;Throw away type byte
100 READLN:
101 CMP DI,[SEGSIZ]
102 JAE ADERR
103 CALL GETBYT ;Get data byte
104 STOB
105 CMP DI,BP ;Check if this is the largest address so far
106 JBE HAVBIG
107 MOV BP,DI ;Save new largest
108 HAVBIG:
109 LOOP READLN
110 JP READHEX
111
112 NOFIL:
113 MOV DX,NOFILE
114 QUIT:
115 MOV AH,9
116 INT 21H
117 INT 20H
118
119 ADERR:
120 MOV DX,ADDR
121 JMP SHOWERR
122
123 GETCH:
124 CMP SI,BUFFER+BUFSIZ
125 JNZ NOREAD
126 INT 21H
127 CMP AL,1
128 JZ ERROR
129 MOV SI,BUFFER
130 NOREAD:
131 LODB
132 CMP AL,1AH
133 JZ DONE
134 RET
135
136 GETBYT:
137 CALL HEXDIG
138 MOV BL,AL
139 CALL HEXDIG
140 SHL BL
141 SHL BL
142 SHL BL
143 SHL BL
144 OR AL,BL
145 RET
146
147 HEXCHK:
148 SUB AL,"0"
149 JC RET
150 CMP AL,10
151 JC CMCRET
152 SUB AL,"A"-"0"-10
153 JC RET
154 CMP AL,16
155 CMCRET:
156 CMC
157 RET
158
159 HEXDIG:
160 CALL GETCH
161 CALL HEXCHK
162 JNC RET
163 ERROR:
164 MOV DX,ERRMES
165 SHOWERR:
166 MOV AH,9
167 INT 21H
168 DONE:
169 MOV [FCB+9],4F00H+"C" ;"CO"
170 MOV B,[FCB+11],"M"
171 MOV DX,FCB
172 MOV AH,CREATE
173 INT 21H
174 OR AL,AL
175 JNZ NOROOM
176 XOR AX,AX
177 MOV [FCB+33],AX
178 MOV [FCB+35],AX ;Set RR field
179 INC AX
180 MOV [FCB+14],AX ;Set record size
181 XOR DX,DX
182 PUSH DS
183 PUSH ES
184 POP DS ;Get load segment
185 MOV AH,SETDMA
186 INT 21H
187 POP DS
188 MOV CX,BP
189 MOV AH,BLKWRT
190 MOV DX,FCB
191 INT 21H
192 MOV AH,CLOSE
193 INT 21H
194 EXIT:
195 INT 20H
196
197 NOROOM:
198 MOV DX,DIRFUL
199 JMP QUIT
200
201 HEX: DB "HEX"
202 ERRMES: DB "Error in HEX file--conversion aborted$"
203 NOFILE: DB "File not found$"
204 ADDR: DB "Address out of range--conversion aborted$"
205 DIRFUL: DB "Disk directory full$"
206
207 OFFSET: DS 2
208 SEGSIZ: DS 2
209 SIGN: DS 1
210 BUFFER: DS BUFSIZ
211
212 START:
213 STARTSEG EQU (START+15)/16
214 \1a