;**********************************************************;
;* ZE v1.1 - Binary to Text Encoder, Better than UUENCODE *;
;* Size Increase only 27%, Fast, and Small - 188 Bytes! *;
;* *;
;* By Tenie Remmel *;
;**********************************************************;
Ideal
Model Tiny
P186
CodeSeg
Org 100h
Proc Program
mov ah,3Fh ;Read file/device
xor bx,bx ;handle for STDIN
mov dx,15872 ;Start at DS:15.5K
mov cx,49152 ;48K bytes (max)
int 21h ;DOS services
mov cx,ax ;Number of bytes in CX
mov si,15872 ;SI = 15.5K
mov di,1024 ;DI = 1K
mov bx,2 ;BX = 2 (words)
mov ah,'A' ;AH = 'A'
mov al,ch ;First digit
shr al,4 ;Shift over
add al,ah ;Adjust to text
stosb ;Store byte
mov al,ch ;Second digit
and al,0Fh ;AND mask
add al,ah ;Adjust to text
stosb ;Store byte
mov al,cl ;Third digit
shr al,4 ;Shift over
add al,ah ;Adjust to text
stosb ;Store byte
mov al,cl ;Last digit
and al,0Fh ;AND mask
add al,ah ;Adjust to text
stosb ;Store byte
add cx,si ;CX = limit for SI
InpLoop: call In13 ;Input 13 bits
mov dl,91 ;Divide AX by 91
div dl ;now AL, AH <= 90
add ax,2121h ;Adjust to text
cmp al,40h ;Eliminate @ char
jl AL_ok ;which is char 40h
inc ax
AL_ok: cmp ah,40h
jl AH_ok
inc ah
AH_ok: stosw ;Store word
inc bx ;Inc line counter
cmp bx,32 ;64 chars on this line?
jl Next ;Jump if not
xor bx,bx ;Clear line counter
mov ax,0A0Dh ;Put a CRLF in AX
stosw ;Store it
Next: cmp si,cx ;SI > CX?
jbe InpLoop ;Jump if not
mov al,'}' ;Store bracket (ending char)
stosb
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
ret ;Exit
EndP Program
BitBuf dw 0 ;The bit buffer
BitCnt db 0 ;The bit counter
Proc In13
push bx cx ;Save registers
mov dx,[BitBuf] ;Load buffer in DX
mov cl,[BitCnt] ;Load count in CL
mov bl,cl ;Count in BL also
and cl,7 ;CL = shift count
lodsb ;Load byte
mov ah,al ;Put it in AH
xor al,al ;Clear AL
shr ax,cl ;Adjust AX
or dx,ax ;Put byte in buffer
mov ch,dh ;Shift byte out into CH
mov dh,dl
xor dl,dl ;Clear DL
cmp bl,5 ;5 bits in buffer?
jae GetLow ;Jump if yes
lodsb ;Load byte
mov ah,al ;Put it in AH
xor al,al ;Clear AL
shr ax,cl ;Adjust AX
or dx,ax ;Put byte in buffer
add bl,8 ;Adjust bit count
GetLow: mov al,dh ;Shift 5 bits out
shl dx,5
sub bl,5 ;Adjust bit count
mov ah,ch ;Get high byte
shr ax,3 ;Adjust AX
mov [BitBuf],dx ;Save buffer
mov [BitCnt],bl ;Save bit count
pop cx bx ;Restore registers
ret ;Return
EndP In13
End Program