	.386p

CODE	segment dword public ER use32 'CODE'
	assume cs:CODE


;                     esp+4    +8    +12   
;	callm analog&,fnction&,port&,varptr(d&(0))
;            in       fnction& = 0 : set analog mode
;                              = 1 : set digital mode
;                              = 2 : get analog data
;                     port = 1
;                          = 2
;            out      ch1,ch2,ch3,ch4 : 0---255
;                     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



analog	proc	near
	mov	al,ss:[esp+4]
	cmp	al,0
	je	#set_a_mode
	cmp	al,1
	je	#set_d_mode

#get_a_data:
	mov	dx,JOY_OUT
	mov	al,ss:[esp+8]
	cmp	al,1
	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,ss:[esp+12]

	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:[esp+8]
	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:[esp+8]
	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:
	ret
analog	endp

CODE	ends


DATA	segment
	assume	ds:DATA

temp	db	11 dup(0)

DATA	ends



	end

