;
;		ish file converter for MS-DOS  Ver 2.00 (90/3/27)
;
;
;		Copyright (c) 1986, 1987, 1989, 1990  by  M. ishizuka
;		All rights reserved.
;



;-----------------------------------------------;
;						;
;	@@cmpreg	instruction, operator, operand1, operand2
;						;
;-----------------------------------------------;

@@cmpreg	macro	para1, para2, para3, para4
		ifidni	<para3>, <para4>
		else
		ifidni	<para4>, <ax>
			para1	para3, para4
		else
		ifidni	<para4>, <bx>
			para1	para3, para4
		else
		ifidni	<para4>, <cx>
			para1	para3, para4
		else
		ifidni	<para4>, <dx>
			para1	para3, para4
		else
		ifidni	<para4>, <si>
			para1	para3, para4
		else
		ifidni	<para4>, <di>
			para1	para3, para4
		else
		ifidni	<para4>, <bp>
			para1	para3, para4
		else
		ifidni	<para4>, <sp>
			para1	para3, para4
		else
		ifidni	<para4>, <cs>
			para1	para3, para4
		else
		ifidni	<para4>, <ds>
			para1	para3, para4
		else
		ifidni	<para4>, <es>
			para1	para3, para4
		else
		ifidni	<para4>, <ss>
			para1	para3, para4
		else
		ifidni	<para4>, <ah>
			para1	para3, para4
		else
		ifidni	<para4>, <al>
			para1	para3, para4
		else
		ifidni	<para4>, <bh>
			para1	para3, para4
		else
		ifidni	<para4>, <bl>
			para1	para3, para4
		else
		ifidni	<para4>, <ch>
			para1	para3, para4
		else
		ifidni	<para4>, <cl>
			para1	para3, para4
		else
		ifidni	<para4>, <dh>
			para1	para3, para4
		else
		ifidni	<para4>, <dl>
			para1	para3, para4
		else
			para1	para3, para2 para4
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endif
		endm



;-----------------------------------------------;
;						;
;	@@display	reg/offset		;
;						;
;	INPUT :	para				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK : flags, ax, dx			;
;						;
;-----------------------------------------------;

@@display	macro	para
		@@cmpreg	mov, offset, dx, para
		@@int21_9
		endm



;-----------------------------------------------;
;						;
;	@@dispchr	reg/char		;
;						;
;	INPUT :	para				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK : flags, ax, dl			;
;						;
;-----------------------------------------------;

@@dispchr	macro	para
		@@cmpreg	mov,, dl, para
		@@int21_2
		endm



;-----------------------------------------------;
;						;
;	@@display_stdout	reg/offset	;
;						;
;	INPUT :	para				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK : flags, ax, dx			;
;						;
;-----------------------------------------------;

@@display_stdout	macro	para
		@@cmpreg	mov, offset, dx, para
		mov	ah, 9
		int	21h
		endm



;-----------------------------------------------;
;						;
;	@@dispchr_stdout	reg/char	;
;						;
;	INPUT :	para				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK : flags, ax, dl			;
;						;
;-----------------------------------------------;

@@dispchr_stdout	macro	para
		@@cmpreg	mov,, dl, para
		mov	ah, 2
		int	21h
		endm



;-----------------------------------------------;
;						;
;	@@dispstr_sub				;
;						;
;	INPUT :	si (string(ASCIZ) address)	;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK : flags, ax, dl, si		;
;						;
;-----------------------------------------------;

@@dispstr_sub	macro
		local	dispstr_loop, dispstr_ret
		cld
dispstr_loop:	lodsb
		or	al, al
		jz	dispstr_ret
		@@dispchr	al
		jmp	dispstr_loop

dispstr_ret:
		endm



;-----------------------------------------------;
;						;
;	@@dispstr	reg/offset		;
;						;
;	INPUT :	para				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK : flags, ax, dl			;
;						;
;-----------------------------------------------;

@@dispstr	macro	para
		push	si
		@@cmpreg	mov, offset, si, para
		@@dispstr_sub
		pop	si
		endm



;-----------------------------------------------;
;						;
;	@@dispstr2	reg/offset, reg/number	;
;						;
;	INPUT :	para1, para2			;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK : flags, al, cx, dl, si		;
;						;
;-----------------------------------------------;

@@dispstr2	macro	para1, para2
		local	dispstr2_1
		@@cmpreg	mov, offset, si, para1
		@@cmpreg	mov,, cx, para2
dispstr2_1:	lodsb
		@@dispchr	al
		loop	dispstr2_1
		endm



;-----------------------------------------------;
;						;
;	@@hex_disp				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, ax, cx, dx		;
;						;
;-----------------------------------------------;

@@hex_disp	macro	para
		@@cmpreg	mov,, dh, para
		@@dispchr	'\'
		mov	cl, 4
		mov	dl, dh
		shr	dl, cl
		mov	cx, 2
hex_disp_1:	add	dl, 30h
		cmp	dl, '9' + 1
		jc	hex_disp_2
		add	dl, 27h
hex_disp_2:	@@dispchr	dl
		mov	dl, dh
		and	dl, 0fh
		loop	hex_disp_1
		endm
