File:  [RetroPC.NET] / np2 / win9x / dclockd.x86
Revision 1.4: download - view: text, annotated - select for diffs
Wed Feb 2 22:50:29 2011 JST (14 years, 8 months ago) by yui
Branches: MAIN
CVS tags: HEAD
updated nasm 2.09 on Windows


DCLOCK_WIDTH	equ		56
DCLOCK_HEIGHT	equ		12
DCLOCK_YALIGN	equ		(56 / 8)
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
				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 .text

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


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


				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_YALIGN
				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_YALIGN
				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_YALIGN
				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_YALIGN
				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_YALIGN
				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_WIDTH
				mov		esi, _dclock + dclock_t_size
				mov		edi, _dclockpal + dclockpal_t.pal8
				mov		bh, 4
.lp1:			mov		bl, 3
.lp2:			mov		ebp, DCLOCK_YALIGN
.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 .lp3
				add		ecx, [esp+16+8]
				dec		bl
				jne		short .lp2
				add		edi, byte 4*16
				dec		bh
				jne		short .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_size
				mov		edi, _dclockpal + dclockpal_t.pal16
				mov		ecx, [esp+16+4]
				sub		dword [esp+16+8], byte (DCLOCK_WIDTH * 2)
				mov		dh, 4
.lp1:			mov		dl, 3
.lp2:			mov		ebp, DCLOCK_YALIGN
.lp3:			mov		bl, [esi]
				mov		bh, 8
.lp4:			rcl		bl, 1
				sbb		ax, ax
				and		ax, [edi]
				mov		[ecx], ax
				add		ecx, byte 2
				dec		bh
				jne		short .lp4
				inc		esi
				dec		ebp
				jne		short .lp3
				add		ecx, [esp+16+8]
				dec		dl
				jne		short .lp2
				add		edi, byte 2
				dec		dh
				jne		short .lp1
				pop		ebp
				pop		edi
				pop		esi
				pop		ebx
				ret

				align	16
_dclock_out24:	push	ebx
				push	esi
				push	edi
				push	ebp
				mov		esi, _dclock + dclock_t_size
				mov		edi, _dclockpal + dclockpal_t.pal32
				mov		ecx, [esp+16+4]
				sub		dword [esp+16+8], (DCLOCK_WIDTH * 3)
				mov		dh, 4
.lp1:			mov		dl, 3
.lp2:			mov		ebp, DCLOCK_YALIGN
.lp3:			mov		bl, [esi]
				mov		bh, 8
.lp4:			rcl		bl, 1
				sbb		eax, eax
				and		eax, [edi]
				mov		[ecx+0], al
				shr		eax, 8
				mov		[ecx+1], al
				mov		[ecx+2], ah
				add		ecx, byte 3
				dec		bh
				jne		short .lp4
				inc		esi
				dec		ebp
				jne		short .lp3
				add		ecx, [esp+16+8]
				dec		dl
				jne		short .lp2
				add		edi, byte 4
				dec		dh
				jne		short .lp1
				pop		ebp
				pop		edi
				pop		esi
				pop		ebx
				ret

				align	16
_dclock_out32:	push	ebx
				push	esi
				push	edi
				push	ebp
				mov		esi, _dclock + dclock_t_size
				mov		edi, _dclockpal + dclockpal_t.pal32
				mov		ecx, [esp+16+4]
				sub		dword [esp+16+8], (DCLOCK_WIDTH * 4)
				mov		dh, 4
.lp1:			mov		dl, 3
.lp2:			mov		ebp, DCLOCK_YALIGN
.lp3:			mov		bl, [esi]
				mov		bh, 8
.lp4:			rcl		bl, 1
				sbb		eax, eax
				and		eax, [edi]
				mov		[ecx], eax
				add		ecx, byte 4
				dec		bh
				jne		short .lp4
				inc		esi
				dec		ebp
				jne		short .lp3
				add		ecx, [esp+16+8]
				dec		dl
				jne		short .lp2
				add		edi, byte 4
				dec		dh
				jne		short .lp1
				pop		ebp
				pop		edi
				pop		esi
				pop		ebx
				ret


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