Another monstrosity!

I'm almost ashamed to post it

, but whatever!
So what do you do if you don't have FASM (or Debug or whatnot) and want to encode raw hex values into a data file? I guess you could Alt-num (decimal) it piecemeal, but this way seemed slightly better.
Bug reports and fixes welcome!! (As if anybody cares anymore, sigh.

)
; HEX.ASM -- encode hex from cmdline into data file
;
; rugxulo _AT_ gmail
;
; public domain, free for any use, nenies proprajho
;NECSUX=1
ARGV=81h
BEEP=7
CR=13
LF=10
CLOSE=3Eh
CREATE=5Bh
GOODBYE=4Ch
OPENRW=3D02h
SEEKEND=4202h
WRITE=40h
WRITESTR=9
DOS equ int 21h
b equ byte
w equ word
macro AAD16 {
if defined NECSUX
aad 16 ; ?? maybe unsupported by NEC V20/V30 ??
else
rept 4 \{ shl ah,1 \}
add al,ah
end if
}
macro AAM16 {
if defined NECSUX
aam 16 ; ?? maybe unsupported by NEC V20/V30 ??
else
mov ah,al
and al,15
rept 4 \{ shr ah,1 \}
end if
}
macro NIB2ASC {
cmp al,10
sbb al,105
das
}
; section .text
org 100h ; DOS .COM
Main:
mov di,ARGV
cmp b[di],CR
jz Fino
xor ch,ch
mov cl,b[di-1]
inc cl
mov al,' '
rep scasb
dec di
cmp b[di],CR
jz Fino
.load:
mov si,di
mov di,buf
.read:
lodsw
call convert
xchg ah,al
call convert
AAD16
stosb
inc w[count]
.check:
cmp b[si],CR
jnz .read
; int3
call create
Fino:
mov ah,GOODBYE
mov al,b[errlvl]
DOS
; end Main
; proc
create:
mov ah,CREATE
xor cx,cx
mov dx,filename
DOS
jnc .handled
.append:
mov ax,OPENRW
mov dx,filename
DOS
jc .ret
mov bx,SEEKEND
xchg ax,bx
xor cx,cx
xor dx,dx
push bx
DOS
pop ax
jc .ret
.handled:
mov w[handle],ax
xchg ax,bx
.write:
mov ah,WRITE
mov cx,w[count]
mov dx,buf
DOS
jnc .howmany
xor al,al
.howmany:
mov b[errlvl],al
.close:
mov ah,CLOSE
; mov bx,w[handle]
DOS
jnc .ret
mov b[errlvl],0
.ret:
ret
; endp
; proc
convert:
cmp al,'0'
jb badhex
cmp al,'F'
ja badhex
cmp al,'9'
jbe .fix
cmp al,'A'
jb badhex
sub al,'A'-'9'-1 ; 7
.fix:
sub al,'0'
ret
; endp
badhex:
; int3
pop dx ; adjust the stack (why bother?)
; nop
cmp al,'~'
ja .nonprintable
cmp al,' '
jb .nonprintable
mov b[errmsg+3],al
.warn:
mov ah,WRITESTR
mov dx,errmsg
DOS
mov b[errlvl],255
jmp Fino
.nonprintable:
mov di,errmsg+2
AAM16
xchg ah,al
NIB2ASC
stosb
mov al,ah
NIB2ASC
mov ah,'h'
stosw
jmp .warn
; section .data
filename db 'hex.dat',0
errmsg db CR,LF,"'?' is invalid!",CR,LF,'$'
errlvl db 0
count dw 0
; section .bss
handle rw 1
buf rb 128 ; or probably only 64? (dunno)
; EOF