;
;	GIO.REX	by MACHIKO
;
.386p
;
param	struc
		dd	?	;return EIP
p1		dd	?	;param.1
p2		dd	?	;param.2
p3		dd	?	;param.3
p4		dd	?	;param.4
param	ends
;
;
;***********<CODE>************
;
code	segment dword public ER use32 'CODE'
	assume	cs:code
;
;	offset	entry
;	
	jmp	read		;0  read  IO
	jmp	write		;5  write IO
	jmp	crtc		;10 crtc reg. write
	jmp	sw_dsp		;15 画面モード切替え
	jmp	zoom1		;20
	jmp	zoom2		;25
;---------------------------
;
read		proc	near
	mov	ebp,esp
	mov	edx,[ebp].p2		;dx = IO reg
	xor	eax,eax
	in	al,dx			;al = data
	xor	edx,edx
	mov	dl,al
	mov	ebx,[ebp].p1
	mov	ds:[ebx],edx		;result = IO data
	ret
;
read		endp
;
;----------------------------
;
write	proc	near
	mov	ebp,esp
	mov	edx,[ebp].p1		;dx = reg. add.
	mov	eax,[ebp].p2		;al = write data
	out	dx,al			;write IO
	ret
write	endp
;
;------------------------------
;
crtc	proc	near
	mov	ebp,esp
	mov	eax,[ebp].p1		;al = CRTC reg.No.
	call	vsncchk
	mov	dx,0440h
	out	dx,al			;write IO
;
	mov	ebx,[ebp].p2
	mov	al,bl			;al = CRTC low data
	mov	dx,0442h
	out	dx,al
;
	mov	al,bh			;al = CRTC high data
	inc	dx
	out	dx,al
;
	ret
crtc	endp
;
;------------------------------
;
sw_dsp	proc	near
	mov	ebp,esp
	mov	eax,[ebp].p1
	cmp	al,0
	je	#off
	cmp	al,1
	je	#32k_on
	cmp	al,2
	je	#16_on
	mov	al,0fh
	jmp	#out
#off:
	xor	al,al
	jmp	#out
#32k_on:
	mov	al,0ch
	jmp	#out
#16_on:
	mov	al,03h
#out:
	mov	dx,0fda0h
	out	dx,al
	ret
sw_dsp	endp
;
;------------------------
vsncchk proc	near
	push	ax
vscheck:
	mov	dx,0FDA0h		;VSYNC(輝線表示期間?)
	in	al,dx
	and	al,00000011b
	cmp	al,00000001b		;1b = VSYNC
	jnz	vscheck
;
	pop	ax
	ret
vsncchk endp
;------------------------
zoom1	proc	near
	mov	ebp,esp
	mov	ebx,[ebp].p1
	mov	esi,ebx			;esi = ZOM%(n) add.
	call	vsncchk
	mov	al,03h
	mov	dx,0fda0h
	out	dx,al
	mov	al,17
	mov	dx,0440h
	out	dx,al			;write IO
	cld
	lodsw
	mov	dx,0442h
	out	dx,al
	mov	al,ah			;al = CRTC high data
	inc	dx
	out	dx,al
	mov	al,27
	call	vsncchk
	mov	dx,0440h
	out	dx,al			;write IO
	mov	ebx,[ebp].p2
	mov	al,17
	mul	bl
	mov	dx,0442h
	out	dx,al
	xor	al,al
	inc	dx
	out	dx,al
	mov	al,0fh
	mov	dx,0fda0h
	out	dx,al
	ret
zoom1	endp
;
;----------------------
;
zoom2	proc	near
	mov	ebp,esp
	mov	ebx,[ebp].p1
	mov	esi,ebx			;esi = ZOM%(n) add.
	call	vsncchk
	mov	al,03h
	mov	dx,0fda0h
	out	dx,al
	mov	al,17
	mov	dx,0440h
	out	dx,al			;write IO
	std
	lodsw
	mov	dx,0442h
	out	dx,al
	mov	al,ah			;al = CRTC high data
	inc	dx
	out	dx,al
	mov	al,27
	call	vsncchk
	mov	dx,0440h
	out	dx,al			;write IO
	mov	al,17
	mov	ebx,[ebp].p2
	mul	bl
	mov	dx,0442h
	out	dx,al
	xor	al,al
	inc	dx
	out	dx,al
	mov	al,0fh
	mov	dx,0fda0h
	out	dx,al
	ret
zoom2	endp
;
;----------------------
;
code	ends
;
;*****************************
        end
