		org	100h
		xra	a	; set A=0
loop:		push	psw	; print number as decimal
		call	decout
		call	padding	; print padding
		pop	psw
		push	psw
		call	binout	; print number as binary
		call	padding
		pop	psw
		;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		mov	b,a	; gray encode
		ana	a	; clear carry
		rar		; shift right
		xra	b	; xor the original
		;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		push	psw
		call	binout	; print gray number as binary
		call	padding
		pop	psw
		;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		mov	b,a	; gray decode
decode:		ana	a	; clear carry
		jz	done	; when no more bits are left, stop
		rar		; shift right
		mov	c,a	; keep that value
		xra	b	; xor into output value
		mov	b,a	; that is the output value
		mov	a,c	; restore intermediate
		jmp	decode	; do next bit
done:		mov	a,b	; give output value
		;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		push	psw
		call	binout	; print decoded number as binary
		call	padding
		pop	psw
		push	psw
		call	decout	; print decoded number as decimal
		lxi	d,nl 
		call	strout
		pop	psw
		inr	a	; next number 
		ani	1fh	; are we there yet?
		jnz	loop	; if not, do next number
		ret
		;; Print A as two-digit number 
decout:		mvi	c,10
		call	dgtout
		mvi	c,1
dgtout:		mvi	e,'0' - 1
dgtloop:	inr	e
		sub	c
		jnc	dgtloop
		add	c
		push	psw
		mvi	c,2
		call	5
		pop	psw
		ret
		;; Print A as five-bit binary number
binout:		ani	1fh
		ral
		ral
		ral
		mvi	c,5
binloop:	ral
		push	psw
		push	b
		mvi	c,2 
		mvi	a,0
		aci	'0'
		mov	e,a
		call	5
		pop	b
		pop	psw
		dcr	c
		jnz	binloop
		ret
		;; Print padding
padding:	lxi	d,arrow
strout:		mvi	c,9
		jmp	5		
arrow:		db	' ==> $'
nl:		db	13,10,'$'