	.386p

CODE	segment dword public ER use32 'CODE'
	assume cs:CODE


;   void analog(int fnction,int port,int *ch)
;            in       fnction = 0 : set analog mode
;                              = 1 : set digital mode
;                              = 2 : get analog data
;                     port = 0
;                          = 1
;            out      ch[0],ch[1],ch[2],ch[3] : 0---255
;                     ch[4] = trg : A,B,C,D,E1,E2,F,G,A',B'


JOY1_IN		equ	04D0h
JOY2_IN		equ	04D2h
JOY_OUT		equ	04D6h

COM1_ON		equ	1Fh
COM1_OFF	equ	0Fh
COM2_ON		equ	2Fh
COM2_OFF	equ	0Fh



	public	analog
	db	'analog',6	; for stack dump
analog	proc	near
	push	ebp
	mov	ebp,esp
;	sub	esp,0
	push	esi
	push	edi
	push	ebx
	
	
	
	mov	al,ss:[ebp+8+0]
	cmp	al,0
	je	#set_a_mode
	cmp	al,1
	je	#set_d_mode

#get_a_data:
	mov	dx,JOY_OUT
	mov	al,ss:[ebp+8+4]
	cmp	al,0
	jne	#get_a_data_1

	mov	al,COM1_OFF
	out	dx,al
	mov	al,COM1_ON
	out	dx,al
	mov	dx,JOY1_IN
	jmp	#get_a_data_2

#get_a_data_1:
	mov	al,COM2_OFF
	out	dx,al
	mov	al,COM2_ON
	out	dx,al
	mov	dx,JOY2_IN

#get_a_data_2:
	mov	ecx,6
	mov	edi,offset temp


#get_a_data_3:


	mov	ebx,1000
#get_a_data_4:
	in	al,dx
	dec	ebx
	je	#exit
	test	al,10h
	jne	#get_a_data_4

	mov	ebx,1000
#get_a_data_5:
	in	al,dx
	dec	ebx
	je	#exit
	test	al,20h
	jne	#get_a_data_5

	in	al,dx
	and	al,0Fh
	mov	ss:[edi],al
	inc	edi

	mov	ebx,1000
#get_a_data_6:
	in	al,dx
	dec	ebx
	je	#exit
	test	al,10h
	je	#get_a_data_6

	mov	ebx,1000
#get_a_data_7:
	in	al,dx
	dec	ebx
	je	#exit
	test	al,20h
	jne	#get_a_data_7

	in	al,dx
	and	al,0Fh
	mov	ss:[edi],al
	inc	edi

	loop	#get_a_data_3



	mov	edi,[ebp+8+8]

	mov	eax,0
	mov	al,ds:[temp+0]
	shl	al,4
	and	ds:[temp+1],0fh
	or	al,ds:[temp+1]
	shl	ax,2
	and	ds:[temp+10],03h
	or	al,ds:[temp+10]
	mov	ds:[edi+16],eax

	mov	al,ds:[temp+5]
	shl	al,4
	or	al,ds:[temp+9]
	movzx	eax,al
	mov	ds:[edi+12],eax

	mov	al,ds:[temp+4]
	shl	al,4
	or	al,ds:[temp+8]
	movzx	eax,al
	mov	ds:[edi+8],eax

	mov	al,ds:[temp+3]
	shl	al,4
	or	al,ds:[temp+7]
	movzx	eax,al
	mov	ds:[edi+4],eax

	mov	al,ds:[temp+2]
	shl	al,4
	or	al,ds:[temp+6]
	movzx	eax,al
	mov	ds:[edi+0],eax

	jmp	#exit





#set_a_mode:
	mov	al,ss:[ebp+8+4]
	mov	dx,JOY_OUT
	cmp	al,1
	jne	#set_a_mode_1
	mov	al,COM1_ON
	jmp	#set_a_mode_exit
#set_a_mode_1:
	mov	al,COM2_ON
#set_a_mode_exit:
	out	dx,al
	jmp	#exit


#set_d_mode:
	mov	al,ss:[ebp+8+4]
	mov	dx,JOY_OUT
	cmp	al,1
	jne	#set_d_mode_1
	mov	al,COM1_OFF
	jmp	#set_d_mode_exit
#set_d_mode_1:
	mov	al,COM2_OFF
#set_d_mode_exit:
	out	dx,al
	jmp	#exit


#exit:
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret			; caller pops arguments
analog	endp

CODE	ends


DATA	segment
	assume	ds:DATA

temp	db	11 dup(0)

DATA	ends



	end

