CROPFLAT - set limits of screen

git-svn-id: svn://kolibrios.org@2656 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Marat Zakiyanov (Mario79) 2012-05-01 17:54:34 +00:00
parent 221b16cc14
commit 8ebfc0eca4
3 changed files with 324 additions and 0 deletions

View File

@ -0,0 +1,3 @@
@fasm -m 16384 cropflat.asm cropflat
@kpack cropflat
@pause

View File

@ -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 <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:
;------------------------------------------------------------------------------

View File

@ -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'