;*****************************************************************************
; CROPFLAT - set limits of screen - for Kolibri OS
; Copyright (c) 2012, Marat Zakiyanov aka Mario79, aka Mario
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
;        * Redistributions of source code must retain the above copyright
;          notice, this list of conditions and the following disclaimer.
;        * Redistributions in binary form must reproduce the above copyright
;          notice, this list of conditions and the following disclaimer in the
;          documentation and/or other materials provided with the distribution.
;        * Neither the name of the <organization> nor the
;          names of its contributors may be used to endorse or promote products
;          derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;*****************************************************************************
;
; Example run with parameters:
; CROPFLAT XS800 YS480
;
;------------------------------------------------------------------------------
	use32
	org 0x0

	db 'MENUET01'
	dd 0x01
	dd START
	dd IM_END
	dd I_END
	dd stack_top
	dd boot_param
	dd 0x0

include '../../macros.inc'
;include '../../debug.inc'
;------------------------------------------------------------------------------
START:
	mcall	14
	mov	ebx,eax
	shr	eax,16
	inc	eax
	mov	[x_size],eax

;	dps	"CROPFLAT current X size: "
;	dpd	eax
;	newline

	and	ebx,0xffff
	inc	ebx
	mov	[y_size],ebx

;	dps	"CROPFLAT current Y size: "
;	dpd	ebx
;	newline
;------------------------------------------------------------------------------
	mov	bx,word 'XS'
	call	find_value
	test	eax,eax
	jnz	.y
	
	call	convert_ASCII_to_BIN
	test	ebx,ebx
	jz	@f
	
	mov	[x_size],ebx
;--------------------------------------
@@:
;	dps	"CROPFLAT new X size: "
;	dpd	ebx
;	newline
;------------------------------------------------------------------------------
.y:
	mov	bx,word 'YS'
	call	find_value
	test	eax,eax
	jnz	.set
	
	call	convert_ASCII_to_BIN
	test	ebx,ebx
	jz	@f

	mov	[y_size],ebx
;--------------------------------------
@@:
;	dps	"CROPFLAT new Y size: "
;	dpd	ebx
;	newline
;------------------------------------------------------------------------------
.set:
	mcall	18,24,[x_size],[y_size]
;--------------------------------------
.exit:
	mcall	-1
;------------------------------------------------------------------------------	
find_value:
; in:
; bx - word
; out:
; eax - 0 for valid value, -1 for invalid value
; esi - ASCII value
	mov	esi,boot_param
	mov	ecx,254
	cld
;--------------------------------------
.loop:
	lodsw
	cmp	ax,bx
	je	@f

	dec	esi
	loop	.loop

	mov	eax,-1
	ret
;--------------------------------------
@@:
	xor	eax,eax
	ret
;------------------------------------------------------------------------------
convert_ASCII_to_BIN:
; in:
; esi - ASCII value
; out:
; ebx - BIN value
	mov	ecx,4
	xor	ebx,ebx
	cld
;--------------------------------------
.loop:
	lodsb
	cmp	al,0x30	; 0
	jb	@f
	
	cmp	al,0x39	; 9
	ja	@f
	
	sub	al,0x30
; multiply by 10
	lea	ebx,[ebx+ebx*4] ; multiply by 5
	shl	ebx,1		; multiply by 2
	movzx	eax,al
	add	ebx,eax
	loop	.loop
;--------------------------------------
@@:
	ret
;------------------------------------------------------------------------------
IM_END:
;------------------------------------------------------------------------------
align 4
x_size	rd 1
y_size	rd 1
;------------------------------------------------------------------------------
align 4
boot_param:
	rb 256+1 ; +1 for reserve
;------------------------------------------------------------------------------
align 4
	rb 512
stack_top:
;------------------------------------------------------------------------------
I_END:
;------------------------------------------------------------------------------