summaryrefslogtreecommitdiff
path: root/v1.25/source/HEX2BIN.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v1.25/source/HEX2BIN.ASM')
-rw-r--r--v1.25/source/HEX2BIN.ASM214
1 files changed, 214 insertions, 0 deletions
diff --git a/v1.25/source/HEX2BIN.ASM b/v1.25/source/HEX2BIN.ASM
new file mode 100644
index 0000000..d7ba742
--- /dev/null
+++ b/v1.25/source/HEX2BIN.ASM
@@ -0,0 +1,214 @@
1; HEX2BIN version 1.02
2; Converts Intel hex format files to straight binary
3
4FCB: EQU 5CH
5READ: EQU 20
6SETDMA: EQU 26
7OPEN: EQU 15
8CLOSE: EQU 16
9CREATE: EQU 22
10DELETE: EQU 19
11BLKWRT: EQU 40
12GETSEG: EQU 38
13BUFSIZ: EQU 1024
14
15 ORG 100H
16 PUT 100H
17
18HEX2BIN:
19 MOV DI,FCB+9
20 CMP B,[DI]," "
21 JNZ HAVEXT
22 MOV SI,HEX
23 MOVB
24 MOVW
25HAVEXT:
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
39GETOFF:
40 LODB ;Eat sign
41GETOFF1:
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
45CONVOFF:
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
54SAVOFF:
55 MOV [OFFSET],BX
56HAVOFF:
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
85READHEX:
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
100READLN:
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
108HAVBIG:
109 LOOP READLN
110 JP READHEX
111
112NOFIL:
113 MOV DX,NOFILE
114QUIT:
115 MOV AH,9
116 INT 21H
117 INT 20H
118
119ADERR:
120 MOV DX,ADDR
121 JMP SHOWERR
122
123GETCH:
124 CMP SI,BUFFER+BUFSIZ
125 JNZ NOREAD
126 INT 21H
127 CMP AL,1
128 JZ ERROR
129 MOV SI,BUFFER
130NOREAD:
131 LODB
132 CMP AL,1AH
133 JZ DONE
134 RET
135
136GETBYT:
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
147HEXCHK:
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
155CMCRET:
156 CMC
157 RET
158
159HEXDIG:
160 CALL GETCH
161 CALL HEXCHK
162 JNC RET
163ERROR:
164 MOV DX,ERRMES
165SHOWERR:
166 MOV AH,9
167 INT 21H
168DONE:
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
194EXIT:
195 INT 20H
196
197NOROOM:
198 MOV DX,DIRFUL
199 JMP QUIT
200
201HEX: DB "HEX"
202ERRMES: DB "Error in HEX file--conversion aborted$"
203NOFILE: DB "File not found$"
204ADDR: DB "Address out of range--conversion aborted$"
205DIRFUL: DB "Disk directory full$"
206
207OFFSET: DS 2
208SEGSIZ: DS 2
209SIGN: DS 1
210BUFFER: DS BUFSIZ
211
212START:
213STARTSEG EQU (START+15)/16
214 \ No newline at end of file