diff --git a/kernel/trunk/core/sched.inc b/kernel/trunk/core/sched.inc index 4ff0046830..56001a184d 100644 --- a/kernel/trunk/core/sched.inc +++ b/kernel/trunk/core/sched.inc @@ -101,9 +101,13 @@ ret ; Find next task to execute ; result: ebx = number of the selected task -; [0xffff] = 1 if the task is the same +; eax = 1 if the task is the same +; edi = address of the data for the task in ebx +; [0x3000] = ebx and [0x3010] = edi +; corrupts other regs find_next_task: - mov ebx,[0x3000] + mov ebx, [0x3000] + mov edi, [0x3010] mov [prev_slot], ebx .waiting_for_termination: diff --git a/kernel/trunk/core/sys32.inc b/kernel/trunk/core/sys32.inc index 39d005bafe..8f24c27373 100644 --- a/kernel/trunk/core/sys32.inc +++ b/kernel/trunk/core/sys32.inc @@ -796,45 +796,27 @@ terminate: ; terminate application cld shl esi,5 add esi,window_data - mov ax,[esi+0] - mov word [dlx],ax - add ax,[esi+8] - mov word [dlxe],ax - mov ax,[esi+4] - mov word [dly],ax - add ax,[esi+12] - mov word [dlye],ax - mov [esi+0],word 0 - mov [esi+8],word 5 - mov ax,[0xFE04] - mov [esi+4],ax - mov [esi+12],word 5 - xor eax, eax - mov [esi+16],eax;dword 0 - mov [esi+20],eax;dword 0 - mov [esi+24],eax;dword 0 - mov [esi+28],eax;dword 0 - popa + mov eax,[esi+WDATA.left] + mov [dlx],eax + add eax,[esi+WDATA.width] + mov [dlxe],eax + mov eax,[esi+WDATA.top] + mov [dly],eax + add eax,[esi+WDATA.height] + mov [dlye],eax - pusha - mov edi,esi - shl edi,5 - add edi,window_data + mov [esi+WDATA.left], 0 + mov [esi+WDATA.width], 5 + mov eax,[0xFE04] + mov [esi+WDATA.top],eax + mov [esi+WDATA.height], 5 + xor eax, eax + mov [esi+16],eax + mov [esi+20],eax + mov [esi+24],eax + mov [esi+28],eax + lea edi, [esi-window_data+draw_data] mov ecx,32/4 - xor eax, eax - ; cld - rep stosd - - mov eax,[0xFE04] ; set window to start from maxy+1 - add eax,2 - - mov edi,esi - shl edi,5 - mov [edi+4+window_data],eax - - add edi,draw_data - mov ecx,32/4 - xor eax, eax rep stosd popa @@ -861,7 +843,6 @@ terminate: ; terminate application add edi,0x80000 mov ecx,256/4 xor eax, eax - ; cld rep stosd popa @@ -871,23 +852,31 @@ terminate: ; terminate application add edi,0x80000 mov ecx,11 mov eax,' ' - ; cld rep stosb popa - pusha ; C000 --> C400 - mov eax, 0xc000 - mov esi, 0 - nlc40: - add eax, 2 - inc esi - cmp esi, [0x3004] - jae nlc41 - movzx ecx, word [eax] - mov [0xC400 + ecx*2], si - jmp nlc40 - nlc41: - popa + + ; activate window + movzx eax, word [0xC000 + esi*2] + cmp eax, [0x3004] + jne .dont_activate + pushad + .check_next_window: + dec eax + cmp eax, 1 + jbe .nothing_to_activate + lea esi, [0xc400+eax*2] + movzx edi, word [esi] ; edi = process + shl edi, 5 + cmp [0x3000 + edi + 0xa], byte 9 ; skip dead slots + je .check_next_window + add edi, window_data + call waredraw + mov [0xf400], byte 0 + mov [0xf500], byte 0 + .nothing_to_activate: + popad + .dont_activate: push esi ; remove hd1 & cd & flp reservation shl esi, 5 @@ -922,7 +911,6 @@ terminate: ; terminate application pusha ; remove all port reservations - mov [deleted_process],esi mov edx,esi shl edx, 5 ;imul edx,0x20 add edx,0x3000 @@ -997,13 +985,6 @@ terminate: ; terminate application ; movzx ecx,word [dlxe] ; movzx edx,word [dlye] call calculatescreen - cli - mov eax,[deleted_process] - cmp eax,[active_process] - jne no_activate_process - call read_active_process_stack - no_activate_process: - sti xor eax, eax xor esi, esi call redrawscreen @@ -1014,41 +995,7 @@ terminate: ; terminate application mov [application_table_status],0 mov esi,process_terminated call sys_msg_board_str - ret -save_active_process_stack: - cmp [active_proc_stack_coun],0xa400+0x400-4 - jne @f - mov [active_proc_stack_coun],0xa400-4 - @@: - push eax - push ebx - mov eax,[active_process] - shl eax,5 - add eax,0x3000 - mov [eax-twdw+31],byte 1 - add [active_proc_stack_coun],4 - mov eax,[active_process] - mov ebx,[active_proc_stack_coun] - mov [ebx],eax - pop ebx - pop eax - ret - -read_active_process_stack: - cmp [active_proc_stack_coun],0xa400-4 - jne @f - mov [active_proc_stack_coun],0xa400+0x400-4 - @@: - push eax - push ebx - mov ebx,[active_proc_stack_coun] - mov eax,[ebx] - mov [0xff01],eax ; activate - sub [active_proc_stack_coun],4 - mov [active_process_flag],1 - pop ebx - pop eax ret iglobal diff --git a/kernel/trunk/gui/button.inc b/kernel/trunk/gui/button.inc index 2f8ede35b0..fafea52529 100644 --- a/kernel/trunk/gui/button.inc +++ b/kernel/trunk/gui/button.inc @@ -205,10 +205,9 @@ sys_button: @@: movzx edi,word [esp] -; pop edx and edx, 0xFFFF - ;;cli + .newline: call button_dececx push edi @@ -218,9 +217,6 @@ sys_button: add ebx,1*65536+1 ; [ y start | y end ] dec edx jnz .newline - ;;sti -;; pop ebx -; popad call drawbuttonframes diff --git a/kernel/trunk/gui/window.inc b/kernel/trunk/gui/window.inc index 38c12cfbce..619429c1a4 100644 --- a/kernel/trunk/gui/window.inc +++ b/kernel/trunk/gui/window.inc @@ -51,6 +51,7 @@ setwindowdefaults: align 4 calculatescreen: pushad + pushfd cli mov esi, 1 @@ -65,9 +66,13 @@ calculatescreen: jbe .finish align 4 .new_wnd: - movzx edi, word [0xC400 + esi * 2] - shl edi, 5 - add edi, window_data + movzx edi, word [0xC400 + esi * 2] + shl edi, 5 + + cmp [0x3000+edi+0xa], byte 9 + je .not_wnd + + add edi, window_data test [edi+WDATA.fl_wstate],WSTATE_MINIMIZED jnz .not_wnd mov eax,[edi+WDATA.left] @@ -85,7 +90,7 @@ calculatescreen: dec ebp jnz .new_wnd .finish: - sti + popfd popad ret @@ -669,13 +674,8 @@ r_bx equ [esp+18] ; y end pushad mov ecx,esi ; yb,xb -> yb,xe - ;<<< 14.11.2004 Ivan Poddubny -; mov eax,r_eax -; shl eax,16 -; mov ax,r_ax mov eax, r_eax rol eax, 16 - ;>>> 14.11.2004 Ivan Poddubny mov ebx,r_ebx shl ebx,16 mov bx,r_ebx @@ -809,6 +809,20 @@ windowactivate: ; esi = abs mem position in stack 0xC400+ pushad + + ; if type of current active window is 3, + ; it must be redrawn + mov eax, [0x3004] + movzx eax, word [0xC400 + eax*2] + shl eax, 5 + add eax, window_data + mov ebx, [eax + WDATA.cl_workarea] + and ebx, 0x0f000000 + cmp ebx, 0x03000000 + jne @f + mov [eax + WDATA.fl_redraw], byte 1 + @@: + push esi movzx eax, word [esi] ; ax <- process no movzx eax, word [0xC000+eax*2] ; ax <- position in window stack @@ -834,25 +848,6 @@ windowactivate: mov bx, [0x3004] ; number of processes mov [0xC000+eax*2], bx ; this is the last (and the upper) -;* start code - get active process (4) - Mario79 - cli - cmp [active_process_flag],1 - jne @f - mov [active_process_flag],0 - jmp end_save_active_process - @@: - call save_active_process_stack - end_save_active_process: - mov [active_process],eax - push eax - mov eax,[active_process] - shl eax,5 - add eax,0x3000 - mov [eax-twdw+31],byte 1 - pop eax - sti -;* end code - get active process (4) - Mario79 - ; update on screen -window stack xor esi, esi waloop2: @@ -876,16 +871,19 @@ checkwindowdraw: ; edi = position in window_data+ + mov eax, [edi + WDATA.cl_workarea] + and eax, 0x0f000000 + cmp eax, 0x03000000 + je .return_yes ; window type 3 + mov esi, edi sub esi, window_data shr esi, 5 ; esi = process number -; movzx eax, word [0xC000 + esi * 2] ; get value of the curr process lea esi, [0xC400 + eax * 2] ; get address of this process at 0xC400 -; push esi @@ -903,34 +901,37 @@ checkwindowdraw: movzx eax, word [esi] shl eax, 5 - add eax, window_data - mov esi, eax + cmp [0x3000 + eax + 0xa], byte 9 + je .new_check ; skip dead windows - mov ebx, [edi+4] + lea esi, [eax+window_data] + + mov ebx, [edi+4] ; y0 mov edx, [edi+12] - add edx, ebx + add edx, ebx ; y0e - mov ecx, [esi+4] ; y check - cmp ecx, edx - jae .new_check + mov ecx, [esi+4] ; y ; y check + cmp ecx, edx + jae .new_check ; y < y0e mov eax, [esi+12] - add ecx, eax - cmp ebx, ecx + add ecx, eax ; ye + cmp ebx, ecx ; y0 >= ye ja .new_check - mov eax, [edi+0] + mov eax, [edi+0] ; x0 mov ecx, [edi+8] - add ecx, eax + add ecx, eax ; x0e - mov edx, [esi+0] ; x check + mov edx, [esi+0] ; x ; x check cmp edx, ecx - jae .new_check + jae .new_check ; x < x0e mov ecx, [esi+8] add edx, ecx cmp eax, edx ja .new_check pop esi + .return_yes: mov ecx,1 ; overlap some window ret @@ -974,9 +975,7 @@ waredraw: ; if redraw necessary at activate mov edi, [0x3004] movzx esi, word [0xC400 + edi * 2] - shl esi, 5 - movzx esi, byte [esi + 0x3000 + 0xE] - call setscreen ;;;calculatescreen ; setscreen + call setscreen popad cmp [0xff01], dword 1 ; if > 1 then activate process @@ -1048,11 +1047,6 @@ checkwindows: lea esi, [0xC400 + esi * 2] call waredraw -;* start code - get active process (2) - Mario79 -; mov eax,[0xff01] -; mov [active_process],eax -;* end code - get active process (2) - Mario79 - mov [0xff01],dword 0 ; activated popad @@ -1062,8 +1056,6 @@ checkwindows: cmp [0xfb40],byte 0 ; mouse buttons pressed ? jne .mouse_buttons_pressed -; cmp [window_minimize],2 -; jne .no_activate_request_1 cmp [window_minimize],0 je .no_activate_request_2 cmp [window_minimize],1 @@ -1074,11 +1066,6 @@ checkwindows: add edi, window_data test [edi+WDATA.fl_wstate],WSTATE_MINIMIZED jnz .mouse_buttons_pressed -; jne .no_activate_request_2 -; .no_activate_request_1: -; cmp [window_minimize],1 -; jge .mouse_buttons_pressed -; jmp .mouse_buttons_pressed .no_activate_request_2: mov [window_minimize],0 popad @@ -1505,35 +1492,6 @@ checkwindows: cmp [reposition],0 je retwm - pushad - mov eax,[edi+00] - mov ebx,[edi+04] - mov ecx,[edi+8] - mov edx,[edi+12] - add ecx,eax - add edx,ebx - mov edi,[0x3004] - shl edi,1 - add edi,0xc400 - movzx esi,byte [edi] - shl esi,5 - add esi,0x3000+0xe - movzx esi,byte [esi] - - sub edi,draw_data - shr edi,5 - shl edi,8 - add edi,0x80000+0x80 - ;cmp [edi],dword 0 - ;jne no_rect_shaped_move - call setscreen - jmp move_calculated - no_rect_shaped_move: - call calculatescreen - move_calculated: - - popad - mov [edi+WDATA.fl_redraw],1 mov [0xfff5],byte 1 ; no mouse @@ -1570,11 +1528,9 @@ checkwindows: popad mov [window_minimize],0 -; sti + ret -;temp_mouse_1 dw 0 -;temp_mouse_2 dw 0 uglobal add_window_data dd 0 diff --git a/kernel/trunk/hid/mousedrv.inc b/kernel/trunk/hid/mousedrv.inc index 2d5d27065c..caf64c032b 100644 --- a/kernel/trunk/hid/mousedrv.inc +++ b/kernel/trunk/hid/mousedrv.inc @@ -285,7 +285,7 @@ __sys_disable_mouse: add ecx,eax add ecx, display_data - movzx eax, byte [edx+twdw+0xe] + mov eax, [0x3000] movzx ebx, byte [ecx] cmp eax,ebx diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 0e8da3cc84..4f0409e83e 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -2188,10 +2188,6 @@ sysfn_activate: ; 18.3 = ACTIVATE WINDOW ja nowindowactivate ; edi = position at window_data+ mov edi, ebx ; edi = process number - ;shl ebx, 1 - ;add ebx, 0xc000 - ;mov esi, [ebx] ; esi = window stack value - ;and esi, 0xffff ; word movzx esi, word [0xC000 + ebx*2] cmp esi, [0x3004] ; number of processes jz nowindowactivate ; continue if window_stack_value != number_of_processes @@ -2216,7 +2212,8 @@ sysfn_getcpuclock: ; 18.5 = GET TSC/SEC ;!!!!!!!!!!!!!!!!!!!!!!!! sysfn_getactive: ; 18.7 = get active window - mov eax,[active_process] + mov eax, [0x3004] + movzx eax, word [0xC400 + eax*2] mov [esp+36],eax ret @@ -2885,16 +2882,14 @@ sys_drawwindow: cmp edi,3 ; type IV - skinned window jne nosyswIV - cli - mov edi,[0x3010] - sub edi,0x3000 - shr edi,5 - cmp edi,[active_process] + ; parameter for drawwindow_IV push 0 + mov edi, [0x3004] + movzx edi, word [0xC400 + edi*2] + cmp edi, [0x3000] jne @f - mov byte [esp],1 - @@: ; parameter for drawwindow_IV - sti + inc dword [esp] + @@: inc [mouse_pause] call [disable_mouse] @@ -5119,16 +5114,13 @@ uglobal ;part2_ld dd 0x0 -;* start code - get process (3) - Mario79 -active_process dd 0 -active_process_flag db 0 -deleted_process dd 0 +;* start code - Mario79 mouse_pause dd 0 MouseTickCounter dd 0 ps2_mouse_detected db 0 com1_mouse_detected db 0 com2_mouse_detected db 0 -;* end code - get active process (3) - Mario79 +;* end code - Mario79 wraw_bacground_select db 0 lba_read_enabled dd 0x0 ; 0 = disabled , 1 = enabled @@ -5145,7 +5137,6 @@ iglobal keyboard dd 0x1 sound_dma dd 0x1 syslang dd 0x1 - active_proc_stack_coun dd 0xa400-4 endg IncludeIGlobals diff --git a/kernel/trunk/memmap.inc b/kernel/trunk/memmap.inc index 8407cbfa63..02efb3b443 100644 --- a/kernel/trunk/memmap.inc +++ b/kernel/trunk/memmap.inc @@ -62,9 +62,7 @@ ; ; 8000 -> A3FF used FLOPPY driver ; -; A400 -> A7FF used active process stack -; -; A800 -> B0FF free +; A400 -> B0FF free ; B100 -> B2FF IDT diff --git a/kernel/trunk/video/vesa12.inc b/kernel/trunk/video/vesa12.inc index aa33f02d24..58672f5052 100644 --- a/kernel/trunk/video/vesa12.inc +++ b/kernel/trunk/video/vesa12.inc @@ -48,6 +48,7 @@ ; set_bank for S3 videocards, work on S3 ViRGE PCI (325) ; modified by kmeaw set_bank: +pushfd cli cmp al,[0xfff2] je retsb @@ -121,7 +122,7 @@ pop cx pop dx pop ax retsb: -sti +popfd ret ;Set bank function for Intel 810/815 chipsets @@ -461,8 +462,7 @@ dbpi24bit12: mov ebx,3 div ebx add eax,WinMapAddress - mov ebx,[0x3010] - movzx ebx,byte[ebx+0xe] + mov ebx,[0x3000] cld dbnp2412: @@ -553,8 +553,7 @@ dbpi24bit12: sub eax,[0xfe80] shr eax,2 add eax,WinMapAddress - mov ebx,[0x3010] - movzx ebx,byte[ebx+0xe] + mov ebx,[0x3000] cld dbnp3212: @@ -823,8 +822,7 @@ vesa12_putimage: mov ebx,3 div ebx add eax,WinMapAddress - mov ebx,[0x3010] - mov bl,[ebx+0xe] + mov ebx,[0x3000] mov bh,[esp+4*4] np2412: @@ -901,8 +899,7 @@ vesa12_putimage: sub eax,[0xfe80] shr eax,2 add eax,WinMapAddress - mov ebx,[0x3010] - mov bl,[ebx+0xe] + mov ebx,[0x3000] mov bh,[esp+4*4] np3212: diff --git a/kernel/trunk/video/vesa20.inc b/kernel/trunk/video/vesa20.inc index 3c6dfef16c..5a8fd3d68d 100644 --- a/kernel/trunk/video/vesa20.inc +++ b/kernel/trunk/video/vesa20.inc @@ -201,14 +201,12 @@ vesa20_putimage: xchg eax, ebp ; get process number - mov eax, [0x3010] - mov bl, [eax+0xE] + mov ebx, [0x3000] cmp byte [ScreenBPP], 32 je put_image_end_32 ;put_image_end_24: - ;cli ; !!!!!!!!!!!!!!!!!!!!!! mov edi, [putimg.real_sy] align 4 .new_line: @@ -244,7 +242,6 @@ vesa20_putimage: .finish: add esp, putimg.stack_data popad - ;sti ; !!!!!!!!!!!!!!!!!!!!! ret put_image_end_32: @@ -679,13 +676,11 @@ vesa20_drawbar: xchg eax, ebp ; get process number - mov eax, [0x3010] - mov bl, [eax+0xE] + mov ebx, [0x3000] cmp byte [ScreenBPP], 24 jne draw_bar_end_32 draw_bar_end_24: - ;cli ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! mov eax, [drbar.color] ;; BBGGRR00 mov bh, al ;; bh = BB shr eax, 8 ;; eax = RRGG @@ -736,7 +731,6 @@ draw_bar_end_24: add esp, drbar.stack_data popad xor eax, eax - ;sti ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ret draw_bar_end_32: diff --git a/kernel/trunk/video/vga.inc b/kernel/trunk/video/vga.inc index c41c17863b..ddd8f857cc 100644 --- a/kernel/trunk/video/vga.inc +++ b/kernel/trunk/video/vga.inc @@ -142,8 +142,7 @@ pimvga: push ebx ; H push edx ; x+Xwin - mov ebx,[0x3010] - mov bl,[ebx+0xe] + mov ebx,[0x3000] mov bh,[esp+6*4] cld @@ -255,6 +254,7 @@ VGA_putpixel: and ecx,0x07 ; bit no. (modulo 8) setvgapixel: + pushfd cli ; edi = address, eax = 24bit colour, ecx = bit no. (modulo 8) @@ -304,7 +304,7 @@ p13cont: mov al,[edi] ; dummy read mov [edi],dl - sti + popfd ret @@ -415,8 +415,7 @@ vga_drawbar: push esi push ecx ; x+Xwin - mov ebx,[0x3010] - movzx ebx,byte[ebx+0xe] + mov ebx,[0x3000] cld