;		32K色ムービ転送 
;		DATA → BUFFER → VRAM
;
;		1991 2/11  Hiroshi TODA
;

	.386p

work	struc
			;para area
data	dd	?		; DATA アドレス
buffer	dd	?		; BUFFER アドレス
mode	dd	?		; VRAM セグメント レジスタ
wt	dd	?		; VRAM アドレス

work	ends

cseg	segment	dword public use32 'CODE'
	assume	cs:cseg,ds:cseg

;int move32(int para[])
;char *work
;int para[] = { dataアドレス, bufferアドレス, mode, wait }
;出力 = next data アドレス

	public	move32_o
	db	'move32_o',8
move32_o proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx
	mov	ebx,[ebp+8]		; ebx = para のアドレス
	mov	edx,[ebx].buffer	; buffer -> edx
	mov	esi,[ebx].data
	mov	eax,[esi+4]		; data end -> eax
	add	esi,8
	add	eax,esi
	cmp	eax,esi
	je	move03
	cld				; ブロック転送++
move02:	mov	edi,[esi]
	add	edi,edx			; add buffer address
	mov	ecx,[esi+4]
	add	esi,8
	rep	movsd			; dword転送
	cmp	esi,eax
	jb	move02
move03:	push	eax			; eax(終了アドレス退避)
	push	es			; esをスタックに退避
	mov	ax,104h			; es=VRAMセグメントレジスタ
	mov	es,ax
	xor	edi,edi
	test	byte ptr [ebx].mode,1
	je	move04
	mov	edi,40000h		; es:[edi]=vram
move04:	mov	esi,[ebx].buffer	; ds:[esi]=buffer
	xor	ecx,ecx
	mov	edx,240
move05:	mov	cl,160			; vram 転送
	rep	movsd
	add	esi,384
	add	edi,384
	dec	edx
	jne	move05
	mov	ecx,[ebx].wt		; wait
	cmp	ecx,0
	je	move08
move0A:	mov	dx,0440h		; 垂直同期を読む
	mov	al,30
	out	dx,al
	mov	dx,0443h		; 0443h
move06:	in	al,dx
	and	al,04h			; 04h = 垂直同期監視
	jne	move06
move07:	in	al,dx
	and	al,04h			; 04h
	je	move07
	loop	move0A
	jmp	move11
move08:	mov	dx,0440h		; 水平同期を読む
	mov	al,30
	out	dx,al
	mov	dx,0443h		; 0443h
move09:	in	al,dx
	and	al,02h			; 02h = 水平同期監視
	jne	move09
move10:	in	al,dx
	and	al,02h			; 02h
	je	move10
move11:	mov	dx,0448h		; 0448h
	mov	al,1
	out	dx,al
	mov	dx,044Ah		; 044ah
	mov	eax,[ebx].mode		; プライオリティ
	out	dx,al
	pop	es			; esを元に戻す
	pop	eax			; eaxを元に戻す
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
move32_o endp

cseg	ends
	end

