diff --git a/programs/system/cropflat/build.bat b/programs/system/cropflat/build.bat new file mode 100644 index 0000000000..476080ca53 --- /dev/null +++ b/programs/system/cropflat/build.bat @@ -0,0 +1,3 @@ +@fasm -m 16384 cropflat.asm cropflat +@kpack cropflat +@pause \ No newline at end of file diff --git a/programs/system/cropflat/cropflat.asm b/programs/system/cropflat/cropflat.asm new file mode 100644 index 0000000000..d9eb177959 --- /dev/null +++ b/programs/system/cropflat/cropflat.asm @@ -0,0 +1,174 @@ +;***************************************************************************** +; 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 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: +;------------------------------------------------------------------------------ \ No newline at end of file diff --git a/programs/system/cropflat/debug.inc b/programs/system/cropflat/debug.inc new file mode 100644 index 0000000000..15ea290d3b --- /dev/null +++ b/programs/system/cropflat/debug.inc @@ -0,0 +1,147 @@ +macro debug_print str +{ + local ..string, ..label + + jmp ..label + ..string db str,0 + ..label: + + pushf + pushad + mov edx,..string + call debug_outstr + popad + popf +} + +dps fix debug_print + +macro debug_print_dec arg +{ + pushf + pushad + if ~arg eq eax + mov eax,arg + end if + call debug_outdec + popad + popf +} + +dpd fix debug_print_dec + +;--------------------------------- +debug_outdec: ;(eax - num, edi-str) + push 10 ;2 + pop ecx ;1 + push -'0' ;2 + .l0: + xor edx,edx ;2 + div ecx ;2 + push edx ;1 + test eax,eax ;2 + jnz .l0 ;2 + .l1: + pop eax ;1 + add al,'0' ;2 + call debug_outchar ; stosb + jnz .l1 ;2 + ret ;1 +;--------------------------------- + +debug_outchar: ; al - char + pushf + pushad + mov cl,al + mov eax,63 + mov ebx,1 + int 0x40 + popad + popf +ret + +debug_outstr: + mov eax,63 + mov ebx,1 + @@: + mov cl,[edx] + test cl,cl + jz @f + int 40h + inc edx + jmp @b + @@: + ret + +_debug_crlf db 13, 10, 0 + +macro newline_1 +{ + pushf + pushad + mov edx, _debug_crlf + call debug_outstr + popad + popf +} + +macro newline +{ + pushf + pushad + mov edx, _debug_crlf + call debug_outstr + popad + popf +} + +macro print message +{ + dps message + newline +} + +macro pregs +{ + dps "EAX: " + dpd eax + dps " EBX: " + dpd ebx + newline + dps "ECX: " + dpd ecx + dps " EDX: " + dpd edx + newline +} + +macro debug_print_hex arg +{ + pushf + pushad + if ~arg eq eax + mov eax, arg + end if + call debug_outhex + popad + popf +} +dph fix debug_print_hex + +debug_outhex: + ; eax - number + mov edx, 8 + .new_char: + rol eax, 4 + movzx ecx, al + and cl, 0x0f + mov cl, [__hexdigits + ecx] + pushad + mcall 63, 1 + popad + dec edx + jnz .new_char +ret + +__hexdigits: + db '0123456789ABCDEF' \ No newline at end of file