; TENIE REMMEL
; Here are some very tiny hex filters (bin2hex 69 bytes, hex2bin 72 bytes)
; that I wrote. They use the undocumented variants of AAM and AAD (you
; can add a byte operand instead of the default 0Ah) so will not work on
; some old chips such as the V30, but who has those anymore??
;*******************************************************;
;* Bin2Hex.ASM -- Tiny 69-byte binary to hex converter *;
;*******************************************************;
Ideal
Macro AAME op1
db 0D4h
db op1
EndM
Model Tiny
CodeSeg
P186
Org 100h
Proc Program
mov ah,3Fh ;Read file/device
xor bx,bx ;handle for STDIN
mov dx,34816 ;Start at DS:34K
mov cx,30240 ;30K bytes (max)
int 21h ;DOS services
jc Exit ;Error?
mov cx,ax ;Number of bytes in CX
mov si,34816 ;SI = 34K
mov di,1024 ;DI = 1K
InpLoop: lodsb ;Load byte
aame 10h ;AAME to unpack digits
add al,90h ;Allison's algorithm
daa ;for converting a
adc al,40h ;binary byte to hex
daa
xchg al,ah ;Get other digit
add al,90h ;Allison's algorithm
daa
adc al,40h
daa
stosw ;Store digits
inc bx ;Inc line counter
cmp bx,32 ;32 bytes?
jl Next ;If not, loop back
xor bx,bx ;Zero line counter
mov ax,0A0Dh ;Output a CRLF
stosw
Next: loop InpLoop ;Loop back
mov ah,40h ;Write file/device
mov bx,1 ;handle for STDOUT
mov cx,di ;Number of bytes
mov dx,1024 ;Start at DS:1K
sub cx,dx ;Adjust bytes
int 21h ;DOS services
Exit: ret ;Exit
EndP Program
End Program
;*******************************************************;
;* Hex2Bin.ASM -- Tiny 72-byte hex to binary converter *;
;*******************************************************;
Ideal
Macro AADE op1
db 0D5h
db op1
EndM
Model Tiny
CodeSeg
P186
Org 100h
Proc Program
mov ah,3Fh ;Read file/device
xor bx,bx ;handle for STDIN
mov dx,1024 ;Start at DS:1K
mov cx,62464 ;61K bytes (max)
int 21h ;DOS services
jc Exit ;Error?
mov cx,ax ;Number of bytes in CX
mov si,1024 ;SI, DI = 1K
mov di,si
InpLoop: lodsb ;Load byte
cmp al,'0' ;0-9?
jl Next
cmp al,'9'
jle IsDigit
cmp al,'A' ;A-F?
jl Next
cmp al,'F'
jg Next
sub al,7 ;Was A-F, subtract 7
IsDigit: sub al,'0' ;Make it binary
test bx,bx ;Nextdigit flag set?
jz First ;If not, jump
aade 10h ;AADE to pack the digits
stosb ;Store byte
dec bx ;Clear nextdigit flag
jmp Next ;Loop back
First: mov ah,al ;Put digit in AH
inc bx ;Set nextdigit flag
Next: loop InpLoop ;Loop back
mov ah,40h ;Write file/device
mov bx,1 ;handle for STDOUT
mov cx,di ;Number of bytes
mov dx,1024 ;Start at DS:1K
sub cx,dx ;Adjust CX
int 21h ;DOS services
Exit: ret ;Exit
EndP Program
End Program