File:  [RetroPC.NET] / xmil / win9x / dclockd.x86
Revision 1.1: download - view: text, annotated - select for diffs
Wed Aug 4 19:49:21 2004 JST (21 years, 2 months ago) by yui
Branches: MAIN
CVS tags: HEAD
fix...


DCLOCK_X		equ		56
DCLOCK_Y		equ		12
DCLOCK_PATMAX	equ		13

				struc dclock_t
.fnt			resd	1
.pos			resd	1
.flm			resb	8
.now			resb	8
.bak			resb	8
.drawing		resw	1
.clk_x			resb	1
.pad			resb	1
.dat
				endstruc

				struc dclockpos_t
.pos			resd	1
.mask			resw	1
.rolbit			resb	1
				resb	1
				endstruc

				struc dclockpal_t
.pal32			resd	4
.pal16			resw	4
.pal8			resd	4*16
				endstruc


section .rdata

				align	16
dclocky			db		0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3


section .text

	global	_dclock_cntdown
	global	_dclock_make
	global	_dclock_out8
	global	_dclock_out16
	extern	_dclock
	extern	_dclockpal


				align	16
_dclock_cntdown:xor		edx, edx
				cmp		[_dclock + dclock_t.clk_x], dl
				je		short dcd_main
				cmp		[_dclock + dclock_t.flm], edx
				jne		short dcd_main
				cmp		[_dclock + dclock_t.flm + 4], edx
				jne		short dcd_main
				ret
dcd_main:		mov		cl, [esp+4]
				cmp		cl, dl
				jne		short dcd_mnlp
				inc		cl
dcd_mnlp:		movzx	eax, byte [_dclock + dclock_t.flm + edx]
				cmp		eax, byte 0
				je		short dcd_mnnt
				cmp		eax, byte DCLOCK_PATMAX
				jae		short dcd_upabove
				mov		ch, [dclocky + eax]
				sub		al, cl
				jc		short dcd_set0
				cmp		ch, [dclocky + eax]
				je		short dcd_outflm
				jmp		short dcd_setdraw
dcd_upabove:	sub		al, cl
				jc		short dcd_set0
				cmp		al, DCLOCK_PATMAX
				jae		short dcd_outflm
				jmp		short dcd_setdraw
dcd_set0:		xor		eax, eax
dcd_setdraw:	bts		[_dclock + dclock_t.drawing], dx
dcd_outflm:		mov		[_dclock + dclock_t.flm + edx], al
dcd_mnnt:		inc		edx
				cmp		dl, [_dclock + dclock_t.clk_x]
				jc		short dcd_mnlp
				ret

				align	16
_dclock_make:	cmp		byte [_dclock + dclock_t.clk_x], 0
				je		short dmk_mned
				pushad
				xor		ebx, ebx
dmk_mnlp:		btr		[_dclock + dclock_t.drawing], bx
				jc		short dmk_mk1
dmk_mnnt:		inc		ebx
				cmp		bl, [_dclock + dclock_t.clk_x]
				jc		short dmk_mnlp
				popad
dmk_mned:		ret

dmk_mk1:		mov		eax, [_dclock + dclock_t.pos]
				lea		eax, [eax + ebx*8]
				mov		edi, [eax + dclockpos_t.pos]
				mov		dx, [eax + dclockpos_t.mask]
				mov		cl, [eax + dclockpos_t.rolbit]
				movzx	eax, byte [_dclock + dclock_t.flm + ebx]
				cmp		eax, byte 0
				je		short makedclock_y0
				cmp		eax, byte DCLOCK_PATMAX
				jb		short makedclock_ani
				movzx	eax, byte [_dclock + dclock_t.bak + ebx]
				jmp		short makedclock0put
makedclock_y0:	movzx	eax, byte [_dclock + dclock_t.now + ebx]
				mov		[_dclock + dclock_t.bak + ebx], al
makedclock0put:	mov		ch, 3
makedclock0_up:	and		[edi], dx
				add		edi, byte (DCLOCK_X / 8)
				dec		ch
				jne		short makedclock0_up
				shl		eax, 4
				add		eax, [_dclock + dclock_t.fnt]
				mov		esi, eax
				mov		ch, 9
makedclock0_dn:	movzx	eax, byte [esi]
				ror		ax, cl
				and		[edi], dx
				or		[edi], ax
				inc		esi
				add		edi, byte (DCLOCK_X / 8)
				dec		ch
				jne		short makedclock0_dn
				jmp		short dmk_mnnt

makedclock_ani:	movzx	eax, byte [dclocky + eax]
				push	eax
				mov		ch, 3
				sub		ch, al
				je		short makedclock_an2
makedclkani_up:	and		[edi], dx
				add		edi, byte (DCLOCK_X / 8)
				dec		ch
				jne		short makedclkani_up
makedclock_an2:	movzx	esi, byte [_dclock + dclock_t.now + ebx]
				shl		esi, 4
				add		esi, [_dclock + dclock_t.fnt]
				mov		ch, 9
makedclkani_md:	movzx	eax, byte [esi]
				ror		ax, cl
				and		[edi], dx
				or		[edi], ax
				inc		esi
				add		edi, (DCLOCK_X / 8)
				dec		ch
				jne		short makedclkani_md
				pop		eax
				mov		ch, al
				movzx	esi, byte [_dclock + dclock_t.bak + ebx]
				shl		esi, 4
				sub		esi, eax
				add		esi, byte 9
				add		esi, [_dclock + dclock_t.fnt]
makedclkani_dn:	movzx	eax, byte [esi]
				ror		ax, cl
				and		[edi], dx
				or		[edi], ax
				inc		esi
				add		edi, byte (DCLOCK_X / 8)
				dec		ch
				jne		short makedclkani_dn
				jmp		near dmk_mnnt

				align	16
_dclock_out8:	push	ebx
				push	esi
				push	edi
				push	ebp
				mov		ecx, [esp+16+4]
				sub		dword [esp+16+8], byte DCLOCK_X
				mov		esi, _dclock + dclock_t.dat
				mov		edi, _dclockpal + dclockpal_t.pal8
				mov		bh, 4
do8_lp1:		mov		bl, 3
do8_lp2:		mov		ebp, (DCLOCK_X / 8)
do8_lp3:		movzx	eax, byte [esi]
				shr		eax, 4
				mov		eax, [eax*4 + edi]
				mov		[ecx], eax
				movzx	eax, byte [esi]
				and		eax, byte 15
				mov		eax, [eax*4 + edi]
				mov		[ecx+4], eax
				inc		esi
				add		ecx, byte 8
				dec		ebp
				jne		short do8_lp3
				add		ecx, [esp+16+8]
				dec		bl
				jne		short do8_lp2
				add		edi, byte 4*16
				dec		bh
				jne		short do8_lp1
				pop		ebp
				pop		edi
				pop		esi
				pop		ebx
				ret

				align	16
_dclock_out16:	push	ebx
				push	esi
				push	edi
				push	ebp
				mov		esi, _dclock + dclock_t.dat
				mov		edi, _dclockpal + dclockpal_t.pal16
				mov		ecx, [esp+16+4]
				sub		dword [esp+16+8], byte (DCLOCK_X * 2)
				mov		dh, 4
do16_lp1:		mov		dl, 3
do16_lp2:		mov		ebp, (DCLOCK_X / 8)
do16_lp3:		mov		bl, [esi]
				mov		bh, 8
do16_lp4:		rcl		bl, 1
				sbb		ax, ax
				and		ax, [edi]
				mov		[ecx], ax
				add		ecx, byte 2
				dec		bh
				jne		short do16_lp4
				inc		esi
				dec		ebp
				jne		short do16_lp3
				add		ecx, [esp+16+8]
				dec		dl
				jne		short do16_lp2
				add		edi, byte 2
				dec		dh
				jne		short do16_lp1
				pop		ebp
				pop		edi
				pop		esi
				pop		ebx
				ret

	ends


RetroPC.NET-CVS <cvs@retropc.net>