forked from KolibriOS/kolibrios
MAIN MENU
1) Checking for program exist to memory 2) Added processing of keys: left and right arrow 3) Fix for .BAT and .SH git-svn-id: svn://kolibrios.org@2211 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
6641043d17
commit
39db646ff8
14
programs/system/menu/trunk/build.sh
Normal file
14
programs/system/menu/trunk/build.sh
Normal file
@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
# This script does for linux the same as build.bat for DOS,
|
||||
# it compiles the KoOS kernel, hopefully ;-)
|
||||
|
||||
echo "lang fix en"
|
||||
echo "lang fix en" > lang.inc
|
||||
fasm -m 16384 menu.asm @menu
|
||||
kpack @menu
|
||||
rm -f lang.inc
|
||||
exit 0
|
||||
|
||||
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm menu.asm @menu
|
||||
@fasm -m 16384 menu.asm @menu
|
||||
@kpack @menu
|
||||
@erase lang.inc
|
||||
@pause
|
@ -1,5 +1,6 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ru >lang.inc
|
||||
@fasm menu.asm @menu
|
||||
@fasm -m 16384 menu.asm @menu
|
||||
@kpack @menu
|
||||
@erase lang.inc
|
||||
@pause
|
@ -1,4 +1,11 @@
|
||||
;******************************************************************************
|
||||
; MAIN MENU
|
||||
;******************************************************************************
|
||||
; last update: 19/09/2011
|
||||
; changed by: Marat Zakiyanov aka Mario79, aka Mario
|
||||
; changes: Checking for program exist to memory
|
||||
; Added processing of keys: left and right arrow
|
||||
;---------------------------------------------------------------------
|
||||
; MAIN MENU by lisovin@26.ru
|
||||
; Some parts of code rewritten by Ivan Poddubny <ivan-yar@bk.ru>
|
||||
;
|
||||
@ -10,6 +17,10 @@
|
||||
BTN_HEIGHT = 22
|
||||
TXT_Y = (BTN_HEIGHT)/2-5
|
||||
|
||||
PANEL_HEIGHT = 20
|
||||
MENU_BOTTON_X_POS = 10
|
||||
MENU_BOTTON_X_SIZE = 60
|
||||
|
||||
use32
|
||||
org 0x0
|
||||
db 'MENUET01' ; 8 byte id
|
||||
@ -17,524 +28,526 @@
|
||||
dd START ; start of code
|
||||
dd I_END ; size of image
|
||||
dd 0x20000 ; memory for app
|
||||
dd 0x20000-1 ; esp
|
||||
dd 0x0 , 0x0 ; I_Param , I_Icon
|
||||
dd 0x20000 ; esp
|
||||
dd 0x0,0x0 ; I_Param , I_Icon
|
||||
;******************************************************************************
|
||||
;include "DEBUG.INC" ; debug macros
|
||||
START: ; start of execution
|
||||
call program_exist
|
||||
mcall 14
|
||||
mov [screen_size],eax
|
||||
|
||||
mov eax, 48 ; load system colors
|
||||
mov ebx, 3
|
||||
mov ecx, sc
|
||||
mov edx, sizeof.system_colors
|
||||
mcall
|
||||
|
||||
mov eax, 70 ; load MENU.DAT
|
||||
mov ebx, fileinfo
|
||||
mcall
|
||||
test eax, eax ; error ?
|
||||
mcall 48,3,sc,sizeof.system_colors ; load system colors
|
||||
mcall 70,fileinfo ; load MENU.DAT
|
||||
test eax,eax ; error ?
|
||||
jz @f
|
||||
cmp eax,6
|
||||
jnz close
|
||||
@@:
|
||||
test ebx, ebx ; length = 0 ?
|
||||
@@:
|
||||
test ebx,ebx ; length = 0 ?
|
||||
jz close
|
||||
mov ecx, ebx
|
||||
mov edi, mem_end
|
||||
newsearch:
|
||||
mov al, '#'
|
||||
mov ecx,ebx
|
||||
mov edi,mem_end
|
||||
newsearch:
|
||||
mov al,'#'
|
||||
cld
|
||||
repne scasb
|
||||
test ecx, ecx ; if not found
|
||||
test ecx,ecx ; if not found
|
||||
jz close
|
||||
call get_number
|
||||
test ebx, ebx
|
||||
test ebx,ebx
|
||||
jnz .number
|
||||
cmp al, '#'
|
||||
cmp al,'#'
|
||||
je search_end
|
||||
.number:
|
||||
shl ebx, 4
|
||||
add ebx, menu_data ; pointer to process table
|
||||
mov [ebx], edi
|
||||
.number:
|
||||
shl ebx,4
|
||||
add ebx,menu_data ; pointer to process table
|
||||
mov [ebx],edi
|
||||
inc [processes]
|
||||
jmp newsearch
|
||||
search_end:
|
||||
mov [end_pointer], edi
|
||||
mov ebx, [processes]
|
||||
;---------------------------------------------------------------------
|
||||
search_end:
|
||||
mov [end_pointer],edi
|
||||
mov ebx,[processes]
|
||||
dec ebx
|
||||
shl ebx, 4
|
||||
add ebx, menu_data
|
||||
newprocess:
|
||||
xor edx, edx
|
||||
mov ecx, edi
|
||||
sub ecx, [ebx]
|
||||
mov al, 10
|
||||
newsearch1:
|
||||
shl ebx,4
|
||||
add ebx,menu_data
|
||||
newprocess:
|
||||
xor edx,edx
|
||||
mov ecx,edi
|
||||
sub ecx,[ebx]
|
||||
mov al,10
|
||||
newsearch1:
|
||||
std
|
||||
repne scasb
|
||||
test ecx, ecx
|
||||
test ecx,ecx
|
||||
je endprocess
|
||||
cmp [edi], byte 13
|
||||
cmp [edi],byte 13
|
||||
jne newsearch1
|
||||
inc edx
|
||||
jmp newsearch1
|
||||
endprocess:
|
||||
mov esi, ebx
|
||||
add esi, 4
|
||||
;---------------------------------------------------------------------
|
||||
endprocess:
|
||||
mov esi,ebx
|
||||
add esi,4
|
||||
dec edx
|
||||
mov [esi], dl
|
||||
cmp ebx, menu_data
|
||||
mov [esi],dl
|
||||
cmp ebx,menu_data
|
||||
jbe search_end1
|
||||
sub ebx, 16
|
||||
sub ebx,16
|
||||
jmp newprocess
|
||||
search_end1:
|
||||
mov eax, 14
|
||||
mcall
|
||||
sub ax, 20
|
||||
mov [menu_data + y_end], ax
|
||||
mov [menu_data + x_start], 5
|
||||
mov al, [menu_data + rows]
|
||||
mov [menu_data + cur_sel], al ; clear selection
|
||||
mov [menu_data + prev_sel], al
|
||||
|
||||
mov [buffer], 0
|
||||
thread:
|
||||
mov eax, [buffer] ; identifier
|
||||
shl eax, 4
|
||||
add eax, menu_data
|
||||
mov edi, eax
|
||||
|
||||
mov eax, 40 ; set event mask
|
||||
mov ebx, 100111b ; mouse + button + key + redraw
|
||||
mcall
|
||||
|
||||
call draw_window
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
search_end1:
|
||||
mcall 14
|
||||
sub ax,20
|
||||
mov [menu_data + y_end],ax
|
||||
mov [menu_data + x_start],5
|
||||
mov al,[menu_data + rows]
|
||||
mov [menu_data + cur_sel],al ; clear selection
|
||||
mov [menu_data + prev_sel],al
|
||||
mov [buffer],0
|
||||
thread:
|
||||
mov eax,[buffer] ; identifier
|
||||
shl eax,4
|
||||
add eax,menu_data
|
||||
mov edi,eax
|
||||
mcall 40,100111b ; mouse + button + key + redraw
|
||||
red:
|
||||
call draw_window ; redraw
|
||||
still:
|
||||
mov eax, 23 ; wait here for event
|
||||
mov ebx, 5
|
||||
mcall
|
||||
|
||||
test [close_now], 1 ; is close flag set?
|
||||
mcall 23,5 ; wait here for event
|
||||
test [close_now],1 ; is close flag set?
|
||||
jnz close
|
||||
|
||||
cmp eax, 1 ; redraw request ?
|
||||
cmp eax,1 ; redraw request ?
|
||||
je red
|
||||
cmp eax, 2 ; key pressed ?
|
||||
cmp eax,2 ; key pressed ?
|
||||
je key
|
||||
cmp eax, 3 ; button in buffer ?
|
||||
cmp eax,3 ; button in buffer ?
|
||||
je button
|
||||
cmp eax, 6 ; mouse event ?
|
||||
cmp eax,6 ; mouse event ?
|
||||
je mouse
|
||||
|
||||
cmp edi, menu_data
|
||||
cmp edi,menu_data
|
||||
je still ; if main process-ignored
|
||||
|
||||
movzx ebx, [edi + parent] ; parent id
|
||||
shl ebx, 4
|
||||
add ebx, menu_data ; ebx = base of parent info
|
||||
movzx ebx,[edi + parent] ; parent id
|
||||
shl ebx,4
|
||||
add ebx,menu_data ; ebx = base of parent info
|
||||
call backconvert ; get my id in al
|
||||
cmp al, [ebx + child] ; if I'm not child of my parent, I shall die :)
|
||||
cmp al,[ebx + child] ; if I'm not child of my parent, I shall die :)
|
||||
jne close
|
||||
|
||||
jmp still
|
||||
|
||||
|
||||
red: ; redraw
|
||||
call draw_window
|
||||
jmp still
|
||||
|
||||
|
||||
key:
|
||||
; mov eax, 2
|
||||
;---------------------------------------------------------------------
|
||||
key:
|
||||
; mov eax,2
|
||||
mcall
|
||||
|
||||
mov al, [edi + rows] ; number of buttons
|
||||
|
||||
cmp ah, 178 ; KEY_UP
|
||||
mov [last_key],ah
|
||||
mov al,[edi + rows] ; number of buttons
|
||||
cmp ah,178 ; KEY_UP
|
||||
jne .noup
|
||||
|
||||
mov ah, [edi+cur_sel]
|
||||
mov [edi+prev_sel], ah
|
||||
mov ah,[edi+cur_sel]
|
||||
mov [edi+prev_sel],ah
|
||||
dec byte [edi+cur_sel]
|
||||
jnz redrawbut
|
||||
mov [edi+cur_sel], al
|
||||
mov [edi+cur_sel],al
|
||||
jmp redrawbut
|
||||
|
||||
|
||||
.noup:
|
||||
cmp ah, 177 ; KEY_DOWN
|
||||
;---------------------------------------------------------------------
|
||||
.noup:
|
||||
cmp ah,177 ; KEY_DOWN
|
||||
jne .nodn
|
||||
|
||||
mov ah, [edi + cur_sel]
|
||||
mov [edi + prev_sel], ah
|
||||
mov ah,[edi + cur_sel]
|
||||
mov [edi + prev_sel],ah
|
||||
inc [edi + cur_sel]
|
||||
cmp [edi + cur_sel], al
|
||||
cmp [edi + cur_sel],al
|
||||
jna redrawbut
|
||||
mov [edi + cur_sel], 1
|
||||
mov [edi + cur_sel],1
|
||||
jmp redrawbut
|
||||
|
||||
.nodn:
|
||||
cmp ah, 13 ; ENTER
|
||||
;---------------------------------------------------------------------
|
||||
.nodn:
|
||||
cmp ah,179 ; KEY_LEFT
|
||||
je @f
|
||||
cmp ah,13 ; ENTER
|
||||
jne .noenter
|
||||
mov ah, [edi + cur_sel]
|
||||
@@:
|
||||
mov ah,[edi + cur_sel]
|
||||
jmp button1
|
||||
|
||||
.noenter:
|
||||
cmp ah, 27 ; ESC
|
||||
;---------------------------------------------------------------------
|
||||
.noenter:
|
||||
cmp ah,176 ; KEY_RIGHT
|
||||
je @f
|
||||
cmp ah,27 ; ESC
|
||||
jne still
|
||||
jmp close
|
||||
|
||||
@@:
|
||||
call get_process_ID
|
||||
cmp [main_process_ID],ecx
|
||||
jne close
|
||||
jmp still
|
||||
;---------------------------------------------------------------------
|
||||
; include "DEBUG.INC"
|
||||
|
||||
button: ; BUTTON HANDLER
|
||||
mov eax, 17 ; get id
|
||||
mcall
|
||||
button: ; BUTTON HANDLER
|
||||
mcall 17 ; get id
|
||||
; dunkaist[
|
||||
test eax,0xfffffe00 ; is it system close button? (close signal from @panel)
|
||||
setz byte[close_now]; set (or not set) close_recursive flag
|
||||
jz close ; if so, close all menus
|
||||
setz byte[close_now] ; set (or not set) close_recursive flag
|
||||
jz close ; if so,close all menus
|
||||
; dunkaist]
|
||||
button1:
|
||||
mov esi, edi
|
||||
button1:
|
||||
mov esi,edi
|
||||
push edi
|
||||
mov edi, [edi + pointer]
|
||||
|
||||
mov edi,[edi + pointer]
|
||||
; print "hello"
|
||||
mov al, [esi + cur_sel]
|
||||
mov [esi + prev_sel], al
|
||||
mov [esi + cur_sel], ah
|
||||
mov al,[esi + cur_sel]
|
||||
mov [esi + prev_sel],al
|
||||
mov [esi + cur_sel],ah
|
||||
|
||||
pushad
|
||||
mov edi, esi
|
||||
mov edi,esi
|
||||
; dph eax
|
||||
call draw_only_needed_buttons
|
||||
popad
|
||||
|
||||
; look for the next line <ah> times; <ah> = button_id
|
||||
; look for the next line <ah> times; <ah> = button_id
|
||||
push eax
|
||||
.next_string:
|
||||
.next_string:
|
||||
call searchstartstring
|
||||
dec ah
|
||||
jnz .next_string
|
||||
pop eax
|
||||
|
||||
mov ecx, 40
|
||||
mov al, '/'
|
||||
mov ecx,40
|
||||
mov al,'/'
|
||||
cld
|
||||
repne scasb
|
||||
test ecx, ecx ; if '/' not found
|
||||
test ecx,ecx ; if '/' not found
|
||||
je searchexit
|
||||
|
||||
cmp [edi], byte '@' ; check for submenu
|
||||
cmp [edi],byte '@' ; check for submenu
|
||||
je runthread
|
||||
|
||||
cmp [last_key],179
|
||||
je searchexit
|
||||
|
||||
dec edi
|
||||
push edi ; pointer to start of filename
|
||||
call searchstartstring ; search for next string
|
||||
sub edi, 2 ; to last byte of string
|
||||
sub edi,2 ; to last byte of string
|
||||
|
||||
mov ecx, edi
|
||||
mov ecx,edi
|
||||
pop esi
|
||||
sub ecx, esi
|
||||
sub ecx,esi
|
||||
inc ecx ; length of filename
|
||||
mov edi, fileinfo_start.name
|
||||
rep movsb ; copy string
|
||||
mov byte [edi], 0 ; store terminator
|
||||
mov eax, 70 ; start program
|
||||
mov ebx, fileinfo_start
|
||||
mcall
|
||||
; mcall 5,100
|
||||
or [close_now], 1 ; set close flag
|
||||
mov [edi],byte 0 ; store terminator
|
||||
mcall 70,fileinfo_start ; start program
|
||||
or [close_now],1 ; set close flag
|
||||
pop edi
|
||||
mov [mousemask], 0
|
||||
mov [mousemask],0
|
||||
jmp close
|
||||
|
||||
searchexit:
|
||||
;---------------------------------------------------------------------
|
||||
searchexit:
|
||||
pop edi
|
||||
jmp still
|
||||
|
||||
|
||||
runthread:
|
||||
;---------------------------------------------------------------------
|
||||
runthread:
|
||||
inc edi
|
||||
|
||||
push eax
|
||||
call get_number ; get number of this process
|
||||
pop eax
|
||||
|
||||
test ebx, ebx ; returned zero - main menu or not number
|
||||
test ebx,ebx ; returned zero - main menu or not number
|
||||
jz searchexit
|
||||
|
||||
mov al, bl
|
||||
mov al,bl
|
||||
|
||||
mov ebx, [processes]
|
||||
mov ebx,[processes]
|
||||
dec bl
|
||||
cmp al, bl
|
||||
cmp al,bl
|
||||
ja searchexit ; such process doesnt exist
|
||||
cmp al, [esi + child]
|
||||
cmp al,[esi + child]
|
||||
je searchexit ; such process already exists
|
||||
|
||||
mov [esi + child], al ; this is my child
|
||||
mov cx, [esi + x_start]
|
||||
add cx, 141 ; new x_start in cx
|
||||
movzx edx, al
|
||||
shl edx, 4
|
||||
add edx, menu_data ; edx points to child's base address
|
||||
mov [edx + x_start], cx ; xstart for new thread
|
||||
mov cx, [esi + y_end] ; y_end in cx
|
||||
mov bl, [esi + rows] ; number of buttons in bl
|
||||
sub bl, ah ; number of btn from bottom
|
||||
movzx eax, al
|
||||
mov [buffer], eax ; thread id in buffer
|
||||
movzx ebx, bl
|
||||
mov [esi + child],al ; this is my child
|
||||
mov cx,[esi + x_start]
|
||||
add cx,141 ; new x_start in cx
|
||||
movzx edx,al
|
||||
shl edx,4
|
||||
add edx,menu_data ; edx points to child's base address
|
||||
mov [edx + x_start],cx ; xstart for new thread
|
||||
mov cx,[esi + y_end] ; y_end in cx
|
||||
mov bl,[esi + rows] ; number of buttons in bl
|
||||
sub bl,ah ; number of btn from bottom
|
||||
movzx eax,al
|
||||
mov [buffer],eax ; thread id in buffer
|
||||
movzx ebx,bl
|
||||
push edx
|
||||
mov eax, BTN_HEIGHT
|
||||
mov eax,BTN_HEIGHT
|
||||
mul ebx
|
||||
sub cx, ax ; new y_end for new thread
|
||||
sub cx,ax ; new y_end for new thread
|
||||
pop edx
|
||||
mov [edx + y_end], cx ; store y_end
|
||||
mov edi, esi
|
||||
mov [edx + y_end],cx ; store y_end
|
||||
mov edi,esi
|
||||
call backconvert ; get number of this process (al)
|
||||
mov [edx + parent], al ; store number of parent process
|
||||
mov al, [edx + rows]
|
||||
mov [edx + cur_sel], al ; clear current selected element
|
||||
mov [edx + prev_sel], al ; clear previous selected element
|
||||
mov [edx + child], 0
|
||||
mov [edx + parent],al ; store number of parent process
|
||||
mov al,[edx + rows]
|
||||
mov [edx + cur_sel],al ; clear current selected element
|
||||
mov [edx + prev_sel],al ; clear previous selected element
|
||||
mov [edx + child],0
|
||||
|
||||
cmp [thread_stack], 0x1e000
|
||||
cmp [thread_stack],0x1e000
|
||||
jne thread_stack_not_full
|
||||
mov [thread_stack], 0xE000
|
||||
|
||||
mov [thread_stack],0xE000
|
||||
thread_stack_not_full:
|
||||
add [thread_stack], 0x2000 ; start new thread
|
||||
mov eax, 51
|
||||
mov ebx, 1
|
||||
mov ecx, thread
|
||||
mov edx, [thread_stack]
|
||||
mcall
|
||||
|
||||
add [thread_stack],0x2000 ; start new thread
|
||||
mcall 51,1,thread,[thread_stack]
|
||||
jmp searchexit
|
||||
;---------------------------------------------------------------------
|
||||
mouse: ; MOUSE EVENT HANDLER
|
||||
mcall 37,0
|
||||
mov [screen_mouse_position],eax ; eax = [ Y | X ] relative to screen
|
||||
|
||||
|
||||
mouse: ; MOUSE EVENT HANDLER
|
||||
mov eax, 37
|
||||
mov ebx, 2
|
||||
mcall
|
||||
test eax, eax ; check buttons state
|
||||
mcall 37,2
|
||||
test eax,eax ; check buttons state
|
||||
jnz click
|
||||
mov eax, 37
|
||||
mov ebx, 1
|
||||
mcall
|
||||
ror eax, 16 ; eax = [ Y | X ] relative to window
|
||||
cmp ax, 140 ; pointer in window?
|
||||
mcall 37,1
|
||||
ror eax,16 ; eax = [ Y | X ] relative to window
|
||||
cmp ax,140 ; pointer in window?
|
||||
ja noinwindow
|
||||
; in window
|
||||
|
||||
shr eax, 16 ; eax = [ 0 | Y ]
|
||||
xor edx, edx
|
||||
mov ebx, BTN_HEIGHT
|
||||
; *** in window ***
|
||||
shr eax,16 ; eax = [ 0 | Y ]
|
||||
xor edx,edx
|
||||
mov ebx,BTN_HEIGHT
|
||||
div ebx
|
||||
inc eax ; number of "button" in eax
|
||||
movzx ebx, [edi + rows] ; total strings in ebx
|
||||
cmp eax, ebx
|
||||
movzx ebx,[edi + rows] ; total strings in ebx
|
||||
cmp eax,ebx
|
||||
ja noinwindow
|
||||
cmp [edi + cur_sel], al
|
||||
cmp [edi + cur_sel],al
|
||||
je noredrawbut
|
||||
mov bl, [edi + cur_sel]
|
||||
|
||||
;;;;;;
|
||||
cmp [edi + child], 0
|
||||
mov bl,[edi + cur_sel]
|
||||
;;;;;;
|
||||
cmp [edi + child],0
|
||||
jne noredrawbut
|
||||
;;;;;;
|
||||
|
||||
mov [edi + cur_sel], al
|
||||
mov [edi + prev_sel], bl
|
||||
redrawbut:
|
||||
;;;;;;
|
||||
mov [edi + cur_sel],al
|
||||
mov [edi + prev_sel],bl
|
||||
redrawbut:
|
||||
call draw_only_needed_buttons
|
||||
noredrawbut:
|
||||
noredrawbut:
|
||||
call backconvert
|
||||
bts [mousemask], eax
|
||||
bts [mousemask],eax
|
||||
jmp still
|
||||
noinwindow:
|
||||
;---------------------------------------------------------------------
|
||||
noinwindow:
|
||||
call backconvert
|
||||
btr [mousemask], eax
|
||||
jmp still
|
||||
click:
|
||||
cmp [mousemask], 0 ; not in a window (i.e. menu)
|
||||
je close
|
||||
btr [mousemask],eax
|
||||
jmp still
|
||||
;---------------------------------------------------------------------
|
||||
click:
|
||||
cmp [mousemask],0 ; not in a window (i.e. menu)
|
||||
jne still
|
||||
; checking for pressing 'MENU' on the taskbar
|
||||
mov eax,[screen_mouse_position]
|
||||
mov ebx,[screen_size]
|
||||
sub bx,PANEL_HEIGHT
|
||||
cmp bx,ax
|
||||
ja close
|
||||
shr eax,16
|
||||
cmp ax,MENU_BOTTON_X_SIZE
|
||||
ja close
|
||||
cmp ax,MENU_BOTTON_X_POS
|
||||
ja still
|
||||
;---------------------------------------------------------------------
|
||||
close:
|
||||
|
||||
|
||||
close:
|
||||
movzx ebx, [edi+parent] ; parent id
|
||||
shl ebx, 4
|
||||
add ebx, menu_data ; ebx = base of parent info
|
||||
movzx ebx,[edi+parent] ; parent id
|
||||
shl ebx,4
|
||||
add ebx,menu_data ; ebx = base of parent info
|
||||
call backconvert
|
||||
cmp [ebx + child], al ; if i am the child of my parent...
|
||||
cmp [ebx + child],al ; if i am the child of my parent...
|
||||
jnz @f
|
||||
mov [ebx + child], -1 ; ...my parent now has no children
|
||||
mov [ebx + child],-1 ; ...my parent now has no children
|
||||
@@:
|
||||
or eax, -1 ; close this thread
|
||||
mov [edi + child], al ; my child is not mine
|
||||
or eax,-1 ; close this thread
|
||||
mov [edi + child],al ; my child is not mine
|
||||
mcall
|
||||
|
||||
backconvert: ; convert from pointer to process id
|
||||
mov eax, edi
|
||||
sub eax, menu_data
|
||||
shr eax, 4
|
||||
backconvert: ; convert from pointer to process id
|
||||
mov eax,edi
|
||||
sub eax,menu_data
|
||||
shr eax,4
|
||||
ret
|
||||
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
;==================================
|
||||
; get_number
|
||||
; load number from [edi] to ebx
|
||||
;==================================
|
||||
get_number:
|
||||
get_number:
|
||||
push edi
|
||||
|
||||
xor eax, eax
|
||||
xor ebx, ebx
|
||||
|
||||
.get_next_char:
|
||||
mov al, [edi]
|
||||
xor eax,eax
|
||||
xor ebx,ebx
|
||||
.get_next_char:
|
||||
mov al,[edi]
|
||||
inc edi
|
||||
cmp al, '0'
|
||||
jb .finish
|
||||
cmp al, '9'
|
||||
ja .finish
|
||||
sub al, '0'
|
||||
imul ebx, 10
|
||||
add ebx, eax
|
||||
imul ebx,10
|
||||
add ebx,eax
|
||||
jmp .get_next_char
|
||||
|
||||
.finish:
|
||||
;-------------------------------------
|
||||
.finish:
|
||||
pop edi
|
||||
ret
|
||||
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
get_process_ID:
|
||||
mcall 9,procinfo,-1
|
||||
mov edx,eax
|
||||
mov ecx,[ebx+30] ; PID
|
||||
ret
|
||||
;---------------------------------------------------------------------
|
||||
program_exist:
|
||||
call get_process_ID
|
||||
mov [main_process_ID],ecx
|
||||
mcall 18,21
|
||||
mov [active_process],eax ; WINDOW SLOT
|
||||
mov ecx,edx
|
||||
xor edx,edx
|
||||
;-----------------------------------------
|
||||
.loop:
|
||||
push ecx
|
||||
mcall 9,procinfo
|
||||
mov eax,[menu_mame]
|
||||
cmp [ebx+10],eax
|
||||
jne @f
|
||||
mov ax,[menu_mame+4]
|
||||
cmp [ebx+14],ax
|
||||
jne @f
|
||||
cmp ecx,[active_process]
|
||||
je @f
|
||||
; dph ecx
|
||||
mcall 18,2
|
||||
mov edx,1
|
||||
@@:
|
||||
pop ecx
|
||||
loop .loop
|
||||
;-----------------------------------------
|
||||
test edx,edx
|
||||
jz @f
|
||||
mcall -1
|
||||
@@:
|
||||
ret
|
||||
;---------------------------------------------------------------------
|
||||
; *********************************************
|
||||
; ******* WINDOW DEFINITIONS AND DRAW ********
|
||||
; *********************************************
|
||||
|
||||
|
||||
draw_window:
|
||||
|
||||
mov eax, 12 ; function 12:tell os about windowdraw
|
||||
mov ebx, 1 ; 1, start of draw
|
||||
mcall
|
||||
|
||||
movzx ebx, [edi + rows]
|
||||
imul eax, ebx, BTN_HEIGHT ; eax = height of window
|
||||
movzx ecx, [edi + y_end]
|
||||
sub ecx, eax ; ecx = Y_START
|
||||
shl ecx, 16
|
||||
add ecx, eax ; ecx = [ Y_START | Y_SIZE ]
|
||||
mcall 12,1 ; 1,start of draw
|
||||
movzx ebx,[edi + rows]
|
||||
imul eax,ebx,BTN_HEIGHT ; eax = height of window
|
||||
movzx ecx,[edi + y_end]
|
||||
sub ecx,eax ; ecx = Y_START
|
||||
shl ecx,16
|
||||
add ecx,eax ; ecx = [ Y_START | Y_SIZE ]
|
||||
dec ecx
|
||||
movzx ebx, [edi + x_start]
|
||||
shl ebx, 16
|
||||
mov bx, 140 ; ebx = [ X_START | X_SIZE ]
|
||||
xor eax, eax ; function 0 : define and draw window
|
||||
mov edx, 0x01000000 ; color of work area RRGGBB,8->color gl
|
||||
mov esi, edx ; unmovable window
|
||||
movzx ebx,[edi + x_start]
|
||||
shl ebx,16
|
||||
mov bx,140 ; ebx = [ X_START | X_SIZE ]
|
||||
mov edx,0x01000000 ; color of work area RRGGBB,8->color gl
|
||||
mov esi,edx ; unmovable window
|
||||
xor eax,eax ; function 0 : define and draw window
|
||||
mcall
|
||||
|
||||
call draw_all_buttons
|
||||
|
||||
mov eax,12
|
||||
mov ebx,2
|
||||
mcall
|
||||
|
||||
mcall 12,2
|
||||
ret
|
||||
|
||||
|
||||
draw_all_buttons:
|
||||
xor edx, edx
|
||||
.new_button:
|
||||
;---------------------------------------------------------------------
|
||||
draw_all_buttons:
|
||||
xor edx,edx
|
||||
.new_button:
|
||||
call draw_one_button
|
||||
inc edx
|
||||
cmp dl, [edi + rows]
|
||||
cmp dl,[edi + rows]
|
||||
jb .new_button
|
||||
|
||||
ret
|
||||
|
||||
|
||||
draw_only_needed_buttons:
|
||||
xor edx, edx
|
||||
mov dl, [edi + cur_sel]
|
||||
;---------------------------------------------------------------------
|
||||
draw_only_needed_buttons:
|
||||
xor edx,edx
|
||||
mov dl,[edi + cur_sel]
|
||||
dec dl
|
||||
call draw_one_button
|
||||
mov dl, [edi + prev_sel]
|
||||
mov dl,[edi + prev_sel]
|
||||
dec dl
|
||||
call draw_one_button
|
||||
ret
|
||||
|
||||
|
||||
draw_one_button:
|
||||
; receives number of button in dl
|
||||
push edx;ad
|
||||
|
||||
mov eax, 8
|
||||
mov ebx, 140
|
||||
movzx ecx, dl
|
||||
imul ecx, BTN_HEIGHT
|
||||
shl ecx, 16
|
||||
add ecx, BTN_HEIGHT-1
|
||||
;---------------------------------------------------------------------
|
||||
draw_one_button:
|
||||
; receives number of button in dl
|
||||
push edx
|
||||
mov eax,8
|
||||
mov ebx,140
|
||||
movzx ecx,dl
|
||||
imul ecx,BTN_HEIGHT
|
||||
shl ecx,16
|
||||
add ecx,BTN_HEIGHT-1
|
||||
; edx = button identifier
|
||||
mov esi, [sc.work]
|
||||
cmp esi, 0xdfdfdf
|
||||
mov esi,[sc.work]
|
||||
cmp esi,0xdfdfdf
|
||||
jb nocorrect
|
||||
sub esi, 0x1b1b1b
|
||||
nocorrect:
|
||||
sub esi,0x1b1b1b
|
||||
nocorrect:
|
||||
inc dl
|
||||
cmp [edi + cur_sel], dl
|
||||
cmp [edi + cur_sel],dl
|
||||
jne .nohighlight
|
||||
add esi, 0x1a1a1a
|
||||
.nohighlight:
|
||||
or edx, 0x20000000
|
||||
add esi,0x1a1a1a
|
||||
.nohighlight:
|
||||
or edx,0x20000000
|
||||
; dunkaist[
|
||||
add edx, 0xd1ff00 ; This makes first menu buttons differ from system close button with 0x000001 id
|
||||
add edx,0xd1ff00 ; This makes first menu buttons differ
|
||||
; from system close button with 0x000001 id
|
||||
; dunkaist]
|
||||
mcall
|
||||
movzx edx, dl
|
||||
|
||||
movzx edx,dl
|
||||
dec dl
|
||||
imul ebx, edx, BTN_HEIGHT
|
||||
add ebx, (4 shl 16) + TXT_Y
|
||||
|
||||
movzx ecx, dl
|
||||
imul ebx,edx,BTN_HEIGHT
|
||||
add ebx,(4 shl 16) + TXT_Y
|
||||
movzx ecx,dl
|
||||
inc ecx
|
||||
mov edx, [edi + pointer]
|
||||
.findline:
|
||||
cmp byte [edx], 13
|
||||
mov edx,[edi + pointer]
|
||||
.findline:
|
||||
cmp byte [edx],13
|
||||
je .linefound
|
||||
inc edx
|
||||
jmp .findline
|
||||
.linefound:
|
||||
;---------------------------------------------------------------------
|
||||
.linefound:
|
||||
inc edx
|
||||
cmp byte [edx], 10
|
||||
cmp byte [edx],10
|
||||
jne .findline
|
||||
dec ecx
|
||||
jnz .findline
|
||||
|
||||
mov ecx, [sc.work_text]
|
||||
mov eax, 4
|
||||
mov esi, 21
|
||||
mcall
|
||||
|
||||
pop edx;ad
|
||||
mcall 4,,[sc.work_text],,21
|
||||
pop edx
|
||||
ret
|
||||
|
||||
|
||||
searchstartstring:
|
||||
mov ecx, 40
|
||||
mov al, 13
|
||||
;---------------------------------------------------------------------
|
||||
searchstartstring:
|
||||
mov ecx,40
|
||||
mov al,13
|
||||
cld
|
||||
repne scasb
|
||||
cmp byte [edi], 10
|
||||
cmp byte [edi],10
|
||||
jne searchstartstring
|
||||
ret
|
||||
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
;*** DATA AREA ****************************************************************
|
||||
menu_mame:
|
||||
db '@MENU',0
|
||||
|
||||
thread_stack dd 0xE000
|
||||
processes dd 0
|
||||
@ -556,14 +569,26 @@ fileinfo_start:
|
||||
.rezerved_1 dd 0x0 ; nop
|
||||
.name:
|
||||
times 50 db ' '
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
I_END:
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
close_now dd ? ; close all processes immediately
|
||||
end_pointer dd ?
|
||||
buffer dd ?
|
||||
mousemask dd ? ; mask for mouse pointer location
|
||||
|
||||
active_process dd ?
|
||||
main_process_ID dd ?
|
||||
|
||||
screen_mouse_position:
|
||||
.y dw ?
|
||||
.x dw ?
|
||||
|
||||
screen_size:
|
||||
.y dw ?
|
||||
.x dw ?
|
||||
|
||||
|
||||
sc system_colors
|
||||
|
||||
menu_data:
|
||||
@ -581,4 +606,11 @@ virtual at 0 ; PROCESSES TABLE (located at menu_data)
|
||||
rb 16-$+1 ; [16 bytes per element]
|
||||
end virtual
|
||||
|
||||
last_key db ?
|
||||
;---------------------------------------------------------------------
|
||||
align 4
|
||||
procinfo:
|
||||
rb 1024
|
||||
;---------------------------------------------------------------------
|
||||
mem_end:
|
||||
;---------------------------------------------------------------------
|
Loading…
Reference in New Issue
Block a user