	.386p

CODE	segment dword public ER use32 'CODE'
	assume cs:CODE


;                  esp+4    +8
;	callm pad&,port&,varptr(d&)
;            in       port = 1
;                          = 2
;            out      d  = 0, 1-8
;
;	callm ptrig&,port&,varptr(d&)
;            in       port = 1
;                          = 2
;            out      d  = select,run,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





pad	proc	near

	cmp	byte ptr [esp+4],1
	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,0fh
	movzx	eax,al
	mov	al,byte ptr ds:[pad_table+eax]
	movzx	eax,al
	
	mov	esi,[esp+8]
	mov	[esi],eax
	
	
	ret
pad	endp



ptrig	proc	near

	cmp	byte ptr [esp+4],1
	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:
	mov	ebx,0
	
	test	al,10h
	jne	#l3
	or	ebx,01h
	
#l3:
	test	al,20h
	jne	#l4
	or	ebx,02h
	
#l4:
	test	al,03h
	jne	#l5
	or	ebx,04h
	
#l5:
	test	al,0ch
	jne	#l6
	or	ebx,08h
	
#l6:
	mov	esi,[esp+8]
	mov	[esi],ebx
	
	
	ret
ptrig	endp




CODE	ends


DATA	segment dword public ER use32 'DATA'
	assume ds:DATA

pad_table	db	0,0,0,0,0,4,2,3,0,6,8,7,0,5,1,0


DATA	ends

	end

