/***   [srom.s]
*
*	システムロム 関連	(C)ささがわ
*
*	For GNU Assembler (GAS)
*
***/

	.text
/* int SROM_mos(int no, int x, int y, int color) */
	.align	2
_SROM_mos:
	.globl	_SROM_mos
	enter	$0, $0
	pushl	%esi
	pushl	%edi
	
	cld
	movb	$4, buf
	movb	$32, buf + 1
	pushl	%ds
	popl	%es
	movl	$buf + 2, %edi
	movl	$128, %ecx
	movl	$0, %eax
	rep
	stosl
	
	pushl	%ds
	movl	$buf + 2, %edi
	movl	8(%ebp), %esi
	decl	%esi
	shll	$8, %esi
	addl	$0x28000, %esi
	pushl	%ds
	popl	%es
	pushl	$0x0108
	popl	%ds
	
	movl	$128, %ecx
_SROM_icn_la:
	pushl	%ecx
	
	movb	(%esi), %al
	movb	128(%esi), %ah
	movl	$8, %ecx
_SROM_icn_lb:
	pushw	%cx
	movb	%ah, %dl
	decb	%cl
	shrb	%cl, %dl
	testb	$1, %dl
	jz	_SROM_icn_ga
	movb	$0, %dl
	jmp	_SROM_icn_gb
_SROM_icn_ga:
	movb	%al, %dl
	shrb	%cl, %dl
	testb	$1, %dl
	jz	_SROM_icn_gc
	movb	%es:_PAL_Black, %dl
	jmp	_SROM_icn_gb
_SROM_icn_gc:
	movb	%es:20(%ebp), %dl
_SROM_icn_gb:
	popw	%cx
	testb	$1, %cl
	jz	_SROM_icn_gd
	shlb	$4, %dl
	addb	%dl, %es:(%edi)
	incl	%edi
	jmp	_SROM_icn_ge
_SROM_icn_gd:
	addb	%dl, %es:(%edi)
_SROM_icn_ge:
	loop	_SROM_icn_lb
	incl	%esi
	
	popl	%ecx
	loop	_SROM_icn_la
	
	movl	$32, %ecx
	rep
	movsl
	
	popl	%ds
	
	pushl	$buf
	pushl	16(%ebp)
	pushl	12(%ebp)
	pushl	$2
	call	_MOS_type
	addl	$16, %esp
	
	popl	%edi
	popl	%esi
	leave
	ret

	.lcomm	buf, 642
