	.386p

CODE	segment dword public ER use32 'CODE'
	assume cs:CODE

;       void joy_in_1(int port,int *status);
;            in       port = 0
;                          = 1
;            out      status = b,a,r,l,u,d

;       void joy_in_2(int port,int *status);
;            in       port = 0
;                          = 1
;            out      status = select,run,b,a,r,l,u,d


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



;int int joy_in_1(int port,int *status);
	public	joy_in_1
	db	'joy_in_1',8	; for stack dump
joy_in_1	proc	near
	push	ebp
	mov	ebp,esp
;	sub	esp,n------
	push	esi
	push	edi
	push	ebx
	
	
	cmp	byte ptr [ebp+8+0],0
	jne	#l1
	
	mov	al,COM1_OFF
	mov	dx,JOY_OUT
	out	dx,al
	mov	dx,JOY1_IN
	in	al,dx
	jmp	#l2
	
#l1:	
	mov	al,COM2_OFF
	mov	dx,JOY_OUT
	out	dx,al
	mov	dx,JOY2_IN
	in	al,dx
#l2:
	and	al,3fh
	movzx	ax,al
	movzx	eax,ax
	
	mov	esi,[ebp+8+4]
	mov	[esi],eax
	
	mov	eax,0
	
	
	
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret			; caller pops arguments
joy_in_1	endp




;int int joy_in_2(int port,int *status);
	public	joy_in_2
	db	'joy_in_2',8	; for stack dump
joy_in_2	proc	near
	push	ebp
	mov	ebp,esp
;	sub	esp,n------
	push	esi
	push	edi
	push	ebx
	
	
	cmp	byte ptr [ebp+8+0],0
	jne	#l1
	
	mov	al,COM1_OFF
	mov	dx,JOY_OUT
	out	dx,al
	mov	dx,JOY1_IN
	in	al,dx
	jmp	#l2
	
#l1:	
	mov	al,COM2_OFF
	mov	dx,JOY_OUT
	out	dx,al
	mov	dx,JOY2_IN
	in	al,dx
#l2:
	or	al,0c0h
	
	mov	ah,al
	and	ah,03h
	jne	#l3
	
	and	al,0bfh
	or	al,03h
	
#l3:	mov	ah,al
	and	ah,0ch
	jne	#l4
	
	and	al,07fh
	or	al,0ch
	
#l4:	movzx	ax,al
	movzx	eax,ax
	
	mov	esi,[ebp+8+4]
	mov	[esi],eax
	
	mov	eax,0
	
	
	
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret			; caller pops arguments
joy_in_2	endp




CODE	ends




	end

