;***************************************************************************** ; CROPFLAT - set limits of screen - for KolibriOS ; 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 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 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: ;------------------------------------------------------------------------------