From 7028e045657861b5357b600ce6b6cf9f67d772cb Mon Sep 17 00:00:00 2001 From: Doczom Date: Sun, 9 Apr 2023 18:19:13 +0000 Subject: [PATCH] [KERNEL] cleaned code and added description of some functions git-svn-id: svn://kolibrios.org@9911 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/core/clipboard.inc | 2 +- kernel/trunk/core/debug.inc | 46 ++- kernel/trunk/core/memory.inc | 6 +- kernel/trunk/core/taskman.inc | 31 ++ kernel/trunk/gui/button.inc | 40 ++- kernel/trunk/gui/window.inc | 2 +- kernel/trunk/hid/keyboard.inc | 274 +++++++++++++++++- kernel/trunk/kernel.asm | 482 ++++++++------------------------ 8 files changed, 483 insertions(+), 400 deletions(-) diff --git a/kernel/trunk/core/clipboard.inc b/kernel/trunk/core/clipboard.inc index 6eb2a06dac..45756f8e39 100644 --- a/kernel/trunk/core/clipboard.inc +++ b/kernel/trunk/core/clipboard.inc @@ -152,7 +152,7 @@ align 4 xor eax, eax inc eax ; error .exit_1: - mov [esp + 32], eax + mov [esp + SYSCALL_STACK.eax], eax .exit: ret ;------------------------------------------------------------------------------ diff --git a/kernel/trunk/core/debug.inc b/kernel/trunk/core/debug.inc index cddf771d6d..d353005f42 100644 --- a/kernel/trunk/core/debug.inc +++ b/kernel/trunk/core/debug.inc @@ -44,12 +44,14 @@ get_debuggee_slot: cli mov eax, ecx call pid_to_slot + ;call pid_to_appdata test eax, eax jz .ret_bad shl eax, BSF sizeof.APPDATA push ebx mov ebx, [current_slot_idx] cmp [SLOT_BASE + eax + APPDATA.debugger_slot], ebx + ;cmp [eax + APPDATA.debugger_slot], ebx pop ebx jnz .ret_bad ; clc ; automatically @@ -64,6 +66,7 @@ debug_detach: call get_debuggee_slot jc .ret and dword [eax + SLOT_BASE + APPDATA.debugger_slot], 0 + ;and dword [eax + APPDATA.debugger_slot], 0 call do_resume .ret: sti @@ -74,10 +77,13 @@ debug_terminate: call get_debuggee_slot jc debug_detach.ret mov ecx, eax + shr ecx, BSF sizeof.APPDATA + ;movzx ecx, ch ; del when sysfn_term... will using APPDATA + ; push 2 ; pop ebx - mov edx, esi + mov edx, esi ; what? jmp sysfn_terminate debug_suspend: @@ -93,13 +99,15 @@ debug_suspend: jc .ret ; } End patch mov cl, [SLOT_BASE + eax + APPDATA.state] ; process state + ;mov cl, [eax + APPDATA.state] ; process state test cl, cl jz .1 - cmp cl, 5 + cmp cl, TSTATE_WAITING jnz .ret - mov cl, 2 + mov cl, TSTATE_WAIT_SUSPENDED .2: mov [SLOT_BASE + eax + APPDATA.state], cl + ;mov [eax + APPDATA.state], cl .ret: sti ret @@ -109,13 +117,15 @@ debug_suspend: do_resume: mov cl, [SLOT_BASE + eax + APPDATA.state] - cmp cl, 1 + ;mov cl, [eax + APPDATA.state] + cmp cl, TSTATE_RUN_SUSPENDED jz .1 - cmp cl, 2 + cmp cl, TSTATE_WAIT_SUSPENDED jnz .ret - mov cl, 5 + mov cl, TSTATE_WAITING .2: mov [SLOT_BASE + eax + APPDATA.state], cl + ;mov [eax + APPDATA.state], cl .ret: ret .1: @@ -140,7 +150,7 @@ debug_getcontext: ; ecx=pid ; edx=sizeof(CONTEXT) ; esi->CONTEXT -; destroys eax,ebx,ecx,edx,esi,edi +; destroys eax,ebx,ecx,edx,esi,edi, ebp xor ebx, ebx ; 0 - get only gp regs cmp edx, 40 @@ -156,13 +166,17 @@ debug_getcontext: jc .ret shr eax, BSF sizeof.APPDATA + ;movzx ebp, ah + cmp eax, [fpu_owner] + ;cmp ebp, [fpu_owner] jne @f inc bh ; set swap context flag @@: shl eax, BSF sizeof.APPDATA mov edi, esi mov eax, [SLOT_BASE + eax + APPDATA.pl0_stack] + ;mov eax, [eax + APPDATA.pl0_stack] lea esi, [eax + RING0_STACK_SIZE] .ring0: @@ -232,6 +246,7 @@ debug_setcontext: jc .stiret ; mov esi, edx mov eax, [eax + SLOT_BASE+APPDATA.pl0_stack] + ;mov eax, [eax + APPDATA.pl0_stack] lea edi, [eax + RING0_STACK_SIZE] .ring0: @@ -268,6 +283,7 @@ debug_set_drx: jc .errret mov ebp, eax lea eax, [eax + SLOT_BASE + APPDATA.dbg_regs] + ;lea eax, [eax + APPDATA.dbg_regs] ; [eax]=dr0, [eax+4]=dr1, [eax+8]=dr2, [eax+C]=dr3 ; [eax+10]=dr7 cmp esi, OS_BASE @@ -295,17 +311,18 @@ debug_set_drx: ; imul eax, ebp, tss_step/32 ; and byte [eax + tss_data + TSS._trap], not 1 and [SLOT_BASE + ebp + APPDATA.dbg_state], not 1 + ;and [ebp + APPDATA.dbg_state], not 1 .okret: - and dword [esp+32], 0 + and dword [esp + SYSCALL_STACK.eax], 0 sti ret .errret: sti - mov dword [esp+32], 1 + mov dword [esp + SYSCALL_STACK.eax], 1 ret .errret2: sti - mov dword [esp+32], 2 + mov dword [esp + SYSCALL_STACK.eax], 2 ret .new: ; add new breakpoint @@ -342,6 +359,7 @@ debug_set_drx: ; imul eax, ebp, tss_step/32 ; or byte [eax + tss_data + TSS._trap], 1 or [SLOT_BASE + ebp + APPDATA.dbg_state], 1 + ;or [ebp + APPDATA.dbg_state], 1 jmp .okret debug_read_process_memory: @@ -355,13 +373,14 @@ debug_read_process_memory: call get_debuggee_slot jc .err shr eax, BSF sizeof.APPDATA + ;movzx eax,ah mov ecx, edi call read_process_memory sti - mov dword [esp+32], eax + mov dword [esp + SYSCALL_STACK.eax], eax ret .err: - or dword [esp+32], -1 + or dword [esp + SYSCALL_STACK.eax], -1 ret debug_write_process_memory: @@ -375,10 +394,11 @@ debug_write_process_memory: call get_debuggee_slot jc debug_read_process_memory.err shr eax, BSF sizeof.APPDATA + ;movzx eax,ah mov ecx, edi call write_process_memory sti - mov [esp+32], eax + mov [esp + SYSCALL_STACK.eax], eax ret debugger_notify: diff --git a/kernel/trunk/core/memory.inc b/kernel/trunk/core/memory.inc index da2b521361..cee841b575 100644 --- a/kernel/trunk/core/memory.inc +++ b/kernel/trunk/core/memory.inc @@ -392,7 +392,7 @@ proc create_trampoline_pgmap stdcall kernel_alloc, PAGE_SIZE mov edi, eax mov esi, master_tab - mov ecx, 1024 + mov ecx, PAGE_SIZE/4 rep movsd mov ecx, [master_tab + (OS_BASE shr 20)] mov [eax], ecx @@ -419,12 +419,12 @@ proc new_mem_resize stdcall, new_size:dword mov edi, [new_size] add edi, PAGE_SIZE-1 - and edi, not 4095 + and edi, -PAGE_SIZE mov [new_size], edi mov esi, [ebx + PROC.mem_used] add esi, PAGE_SIZE-1 - and esi, not 4095 + and esi, -PAGE_SIZE cmp edi, esi ja .expand diff --git a/kernel/trunk/core/taskman.inc b/kernel/trunk/core/taskman.inc index 762fa82d0d..80c727dba3 100644 --- a/kernel/trunk/core/taskman.inc +++ b/kernel/trunk/core/taskman.inc @@ -1071,4 +1071,35 @@ get_curr_slot: mov eax, [current_slot] ret +pid_to_appdata: +;Input: +; eax - pid of process +;Output: +; eax - 0 - not found or pointer on APPDATA + push ebx + push ecx + mov ebx, [thread_count] + shl ebx, BSF sizeof.APPDATA ; multiply by size + ; skip first process in the task table +.loop: + add ecx, sizeof.APPDATA + cmp [SLOT_BASE + ecx + APPDATA.state], TSTATE_FREE + jz .loop ;skip empty slots + cmp [SLOT_BASE + ecx + APPDATA.tid], eax + jz .pid_found + ;ecx = offset of current process info entry + ;ebx = maximum permitted offset + cmp ecx, ebx + jb .loop + + pop ecx + pop ebx + xor eax, eax + ret +.pid_found: + mov eax, ecx + pop ecx + pop ebx + ret + include "debug.inc" diff --git a/kernel/trunk/gui/button.inc b/kernel/trunk/gui/button.inc index 295b9b3828..3195eeefcc 100644 --- a/kernel/trunk/gui/button.inc +++ b/kernel/trunk/gui/button.inc @@ -20,9 +20,45 @@ struct SYS_BUTTON id_hi dw ? dw ? ends - ;--------------------------------------------------------------- -syscall_button: ;////////////// system function 8 ////////////// +align 4 +; @brief system function 17 - Get the identifier of the pressed button +; @param eax 17 - number function +; @return eax = 1 - buffer empty, +; eax = high 24 bits contain button identifier, +; al = 0 - the button was pressed with left mouse button, +; al = bit corresponding to used mouse button otherwise +sys_getbutton: + mov ebx, [current_slot_idx] ; TOP OF WINDOW STACK + mov [esp + SYSCALL_STACK.eax], dword 1 + movzx ecx, word [WIN_STACK + ebx * 2] + mov edx, [thread_count] ; less than 256 processes + cmp ecx, edx + jne .exit + movzx eax, byte [BTN_COUNT] + test eax, eax + jz .exit + mov eax, [BTN_BUFF] + and al, 0xFE ; delete left button bit + mov [BTN_COUNT], byte 0 + mov [esp + SYSCALL_STACK.eax], eax +;-------------------------------------- +align 4 +.exit: + ret +;--------------------------------------------------------------- +; @brief system function 8 - define/delete the button +; @param eax = 8 - number function +; @param ebx = [offset_x]*65536 + [width] +; @param ecx = [offset_y]*65536 + [height] +; @param edx = 0xXYnnnnnn, where: +; nnnnnn = identifier of the button +; 31 bit - delete button +; 30 bit - don't draw button +; 29 bit - don't draw button frame when pressed +; @param esi = 0x00RRGGBB - button color +; @return function does not return value +syscall_button: ;--------------------------------------------------------------- ;? Define/undefine GUI button object ;--------------------------------------------------------------- diff --git a/kernel/trunk/gui/window.inc b/kernel/trunk/gui/window.inc index 94833636c7..444049ba92 100644 --- a/kernel/trunk/gui/window.inc +++ b/kernel/trunk/gui/window.inc @@ -277,7 +277,7 @@ dd .setSkinUnicode .getCaptionHeight: mov eax, [_skinh] - mov [esp + 32], eax + mov [esp + SYSCALL_STACK.eax], eax ret .getScreenWorkingArea: diff --git a/kernel/trunk/hid/keyboard.inc b/kernel/trunk/hid/keyboard.inc index d5104934c4..df115f1082 100644 --- a/kernel/trunk/hid/keyboard.inc +++ b/kernel/trunk/hid/keyboard.inc @@ -102,6 +102,9 @@ hotkey_do_test: ret ;--------------------------------------------------------------------- align 4 +; @brief Export function - Add new scancode in buffer +; @param ecx - scancode +; @return not return set_keyboard_data: movzx eax, word[thread_count]; top window process movzx eax, word[WIN_POS + eax*2] @@ -116,16 +119,17 @@ set_keyboard_data: pop ebp edi esi ebx ret ;--------------------------------------------------------------------- -struct KEYBOARD -next dd ? -prev dd ? -functions dd ? -userdata dd ? +struct KEYBOARD + next dd ? + prev dd ? + functions dd ? + userdata dd ? ends -struct KBDFUNC -strucsize dd ? -close dd ? -setlights dd ? + +struct KBDFUNC + strucsize dd ? + close dd ? + setlights dd ? ends iglobal @@ -137,6 +141,10 @@ uglobal keyboard_list_mutex MUTEX endg +; @brief Export function - Registration new keyboard +; @param [esp + 4] - pointer on KBDFUNC this keyboard +; @param [esp + 8] - userdata for callback function +; @return eax = pointer on KEYBOARD structure or 0 on error register_keyboard: push ebx movi eax, sizeof.KEYBOARD @@ -171,6 +179,9 @@ register_keyboard: pop ebx ret 8 +; @brief Export function - Delete keyboard +; @param [esp + 4] - pointer on KEYBOARD structure +; @return not return delete_keyboard: push ebx mov ebx, [esp+4+4] @@ -577,3 +588,248 @@ iglobal numlock_map db '789-456+1230.' endg ;--------------------------------------------------------------------- +align 4 +kb_write_wait_ack: + + push ecx edx + + mov dl, al + mov ecx, 0x1ffff; last 0xffff, new value in view of fast CPU's +.wait_output_ready: + in al, 0x64 + test al, 2 + jz @f + loop .wait_output_ready + mov ah, 1 + jmp .nothing +@@: + mov al, dl + out 0x60, al + mov ecx, 0xfffff; last 0xffff, new value in view of fast CPU's +.wait_ack: + in al, 0x64 + test al, 1 + jnz @f + loop .wait_ack + mov ah, 1 + jmp .nothing +@@: + in al, 0x60 + xor ah, ah + +.nothing: + pop edx ecx + ret +;----------------------------------------------------------------------------- + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 66 sys function. ;; +;; in eax=66,ebx in [0..5],ecx,edx ;; +;; out eax ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +iglobal +align 4 +f66call: + dd sys_process_def.1 ; 1 = set keyboard mode + dd sys_process_def.2 ; 2 = get keyboard mode + dd sys_process_def.3 ; 3 = get keyboard ctrl, alt, shift + dd sys_process_def.4 ; 4 = set system-wide hotkey + dd sys_process_def.5 ; 5 = delete installed hotkey + dd sys_process_def.6 ; 6 = disable input, work only hotkeys + dd sys_process_def.7 ; 7 = enable input, opposition to f.66.6 +endg +;----------------------------------------------------------------------------- +align 4 +sys_process_def: + dec ebx + cmp ebx, 7 + jae .not_support ;if >=8 then or eax,-1 + + mov edi, [current_slot] + jmp dword [f66call + ebx*4] + +.not_support: + or [esp + SYSCALL_STACK.eax], -1 + ret +;----------------------------------------------------------------------------- +align 4 +.1: + mov [edi + APPDATA.keyboard_mode], cl + ret +;----------------------------------------------------------------------------- +align 4 +.2: ; 2 = get keyboard mode + movzx eax, byte [edi + APPDATA.keyboard_mode] + mov [esp + SYSCALL_STACK.eax], eax + ret +;----------------------------------------------------------------------------- +align 4 +.3: ;3 = get keyboard ctrl, alt, shift + mov eax, [kb_state] + mov [esp + SYSCALL_STACK.eax], eax + ret +;----------------------------------------------------------------------------- +align 4 +.4: + mov edi, [current_slot_idx] + mov eax, hotkey_list +@@: + cmp dword [eax + 8], 0 + jz .found_free + add eax, 16 + cmp eax, hotkey_list+16*256 + jb @b + mov dword [esp + SYSCALL_STACK.eax], 1 + ret +.found_free: + mov [eax + 8], edi + mov [eax + 4], edx + movzx ecx, cl + lea ecx, [hotkey_scancodes+ecx*4] + mov edx, [ecx] + mov [eax], edx + mov [ecx], eax + mov [eax + 12], ecx + test edx, edx + jz @f + mov [edx + 12], eax +@@: + and dword [esp + SYSCALL_STACK.eax], 0 + ret +;----------------------------------------------------------------------------- +align 4 +.5: + mov edi, [current_slot_idx] + movzx ebx, cl + lea ebx, [hotkey_scancodes+ebx*4] + mov eax, [ebx] +.scan: + test eax, eax + jz .notfound + cmp [eax + 8], edi + jnz .next + cmp [eax + 4], edx + jz .found +.next: + mov eax, [eax] + jmp .scan +.notfound: + mov dword [esp + SYSCALL_STACK.eax], 1 + ret +.found: + mov ecx, [eax] + jecxz @f + mov edx, [eax + 12] + mov [ecx + 12], edx +@@: + mov ecx, [eax + 12] + mov edx, [eax] + mov [ecx], edx + xor edx, edx + mov [eax + 4], edx + mov [eax + 8], edx + mov [eax + 12], edx + mov [eax], edx + mov [esp + SYSCALL_STACK.eax], edx + ret +;----------------------------------------------------------------------------- +align 4 +.6: + pushfd + cli + mov eax, [PID_lock_input] + test eax, eax + jnz @f +; get current PID + mov eax, [current_slot] + mov eax, [eax + APPDATA.tid] +; set current PID for lock input + mov [PID_lock_input], eax +@@: + popfd + ret +;----------------------------------------------------------------------------- +align 4 +.7: + mov eax, [PID_lock_input] + test eax, eax + jz @f +; get current PID + mov ebx, [current_slot] + mov ebx, [ebx + APPDATA.tid] +; compare current lock input with current PID + cmp ebx, eax + jne @f + + xor eax, eax + mov [PID_lock_input], eax +@@: + ret +;----------------------------------------------------------------------------- +uglobal + PID_lock_input dd 0x0 +endg +;----------------------------------------------------------------------------- +align 4 +; @brief System function 2 - Get pressed key +; @param eax = 2- number function +; @return eax = 1 - buffer empty, else +; al = 0, ah = code pressed key, +; 16-23 bits - scancode pressed key(in ASCII mode) +; if al=2 ah=scancode pressed key, 16-31 bits - state control keys +sys_getkey: + mov [esp + SYSCALL_STACK.eax], dword 1 + ; test main buffer + mov ebx, [current_slot_idx] ; TOP OF WINDOW STACK + movzx ecx, word [WIN_STACK + ebx * 2] + mov edx, [thread_count] + cmp ecx, edx + jne .finish + cmp [KEY_COUNT], byte 0 + je .finish + movzx ax, byte [KEY_BUFF + 120 + 2] + shl eax, 8 + mov al, byte [KEY_BUFF] + shl eax, 8 + push eax + dec byte [KEY_COUNT] + and byte [KEY_COUNT], 127 + movzx ecx, byte [KEY_COUNT] + add ecx, 2 + mov eax, KEY_BUFF + 1 + mov ebx, KEY_BUFF + call memmove + add eax, 120 + 2 + add ebx, 120 + 2 + call memmove + pop eax +;-------------------------------------- +align 4 +.ret_eax: + mov [esp + SYSCALL_STACK.eax], eax + ret +;-------------------------------------- +align 4 +.finish: +; test hotkeys buffer + mov ecx, hotkey_buffer +;-------------------------------------- +align 4 +@@: + cmp [ecx], ebx + jz .found + add ecx, 8 + cmp ecx, hotkey_buffer + 120 * 8 + jb @b + ret +;-------------------------------------- +align 4 +.found: + mov ax, [ecx + 6] + shl eax, 16 + mov ah, [ecx + 4] + mov al, 2 + and dword [ecx + 4], 0 + and dword [ecx], 0 + jmp .ret_eax +;------------------------------------------------------------------------------ \ No newline at end of file diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 4b9d13fd68..c67fd281fe 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -1073,14 +1073,11 @@ if preboot_blogesc end if mov [timer_ticks_enable], 1 ; for cd driver - sti call mtrr_validate jmp osloop - - ; Fly :) uglobal @@ -1266,13 +1263,13 @@ idle_thread: ; Beware. Don't do anything here. Anything at all. idle_loop: cmp [use_mwait_for_idle], 0 - jnz idle_loop_mwait + jnz .mwait -idle_loop_hlt: +.hlt: hlt - jmp idle_loop_hlt + jmp .hlt -idle_loop_mwait: +.mwait: mov eax, idle_addr xor ecx, ecx xor edx, edx @@ -1280,7 +1277,7 @@ idle_loop_mwait: xor ecx, ecx mov eax, 20h ; or 10h mwait - jmp idle_loop_mwait + jmp .mwait ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1334,9 +1331,9 @@ endg set_variables: mov ecx, 0x16 ; flush port 0x60 -.fl60: +@@: in al, 0x60 - loop .fl60 + loop @b push eax mov ax, [BOOT.y_res] @@ -1403,30 +1400,31 @@ display_number_force: and eax, 0x3fffffff cmp eax, 0xffff ; length > 0 ? pop eax - jge cont_displ + jge .cont_displ ret - cont_displ: + .cont_displ: push eax and eax, 0x3fffffff cmp eax, 61*0x10000 ; length <= 60 ? pop eax - jb cont_displ2 + jb .cont_displ2 ret - cont_displ2: + .cont_displ2: pushad cmp al, 1 ; ecx is a pointer ? - jne displnl1 + jne @f mov ebp, ebx add ebp, 4 - mov ebp, [ebp + std_application_base_address] - mov ebx, [ebx + std_application_base_address] - displnl1: + mov ebp, [ebp] ;[ebp + std_application_base_address] + mov ebx, [ebx] ;[ebx + std_application_base_address] +@@: sub esp, 64 test ah, ah ; DECIMAL - jnz no_display_desnum + jnz .no_display_desnum + shr eax, 16 and eax, 0xC03f ; and eax,0x3f @@ -1437,24 +1435,26 @@ display_number_force: mov ecx, eax mov eax, ebx mov ebx, 10 - d_desnum: +@@: xor edx, edx call division_64_bits div ebx add dl, 48 mov [edi], dl dec edi - loop d_desnum + loop @b + pop eax call normalize_number call draw_num_text add esp, 64 popad ret - no_display_desnum: +.no_display_desnum: cmp ah, 0x01 ; HEXADECIMAL - jne no_display_hexnum + jne .no_display_hexnum + shr eax, 16 and eax, 0xC03f ; and eax,0x3f @@ -1465,26 +1465,28 @@ display_number_force: mov ecx, eax mov eax, ebx mov ebx, 16 - d_hexnum: +@@: xor edx, edx call division_64_bits div ebx - hexletters = __fdo_hexdigits - add edx, hexletters + ;hexletters = __fdo_hexdigits + add edx, __fdo_hexdigits ;hexletters mov dl, [edx] mov [edi], dl dec edi - loop d_hexnum + loop @b + pop eax call normalize_number call draw_num_text add esp, 64 popad ret - no_display_hexnum: +.no_display_hexnum: cmp ah, 0x02 ; BINARY - jne no_display_binnum + jne .no_display_binnum + shr eax, 16 and eax, 0xC03f ; and eax,0x3f @@ -1495,21 +1497,22 @@ display_number_force: mov ecx, eax mov eax, ebx mov ebx, 2 - d_binnum: +@@: xor edx, edx call division_64_bits div ebx add dl, 48 mov [edi], dl dec edi - loop d_binnum + loop @b + pop eax call normalize_number call draw_num_text add esp, 64 popad ret - no_display_binnum: +.no_display_binnum: add esp, 64 popad @@ -1572,10 +1575,6 @@ draw_num_text: @@: jmp dtext ;----------------------------------------------------------------------------- -iglobal -midi_base dw 0 -endg -;----------------------------------------------------------------------------- align 4 sys_setup: ; 1 = roland mpu midi base , base io address @@ -1809,8 +1808,60 @@ get_timer_ticks: mov eax, [timer_ticks] ret ;----------------------------------------------------------------------------- +iglobal +midi_base dw 0 +endg -is_input: +align 4 +sys_midi: + cmp word [mididp], 0 + jnz @f + mov [esp + SYSCALL_STACK.eax], 1 + ret +@@: + and [esp + SYSCALL_STACK.eax], 0 + dec ebx + jnz .smn1 + ; call setuart +@@: + call .is_output + test al, al + jnz @b + mov dx, word [midisp] + mov al, 0xff + out dx, al +@@: + mov dx, word [midisp] + mov al, 0xff + out dx, al + call .is_input + test al, al + jnz @b + call .get_mpu_in + cmp al, 0xfe + jnz @b +@@: + call .is_output + test al, al + jnz @b + mov dx, word [midisp] + mov al, 0x3f + out dx, al + ret +.smn1: + dec ebx + jnz .ret +@@: + call .get_mpu_in + call .is_output + test al, al + jnz @b + mov al, bl + call .put_mpu_out +.ret: + ret + +.is_input: push edx mov dx, word [midisp] in al, dx @@ -1818,7 +1869,7 @@ is_input: pop edx ret -is_output: +.is_output: push edx mov dx, word [midisp] in al, dx @@ -1826,71 +1877,22 @@ is_output: pop edx ret -get_mpu_in: +.get_mpu_in: push edx mov dx, word [mididp] in al, dx pop edx ret -put_mpu_out: +.put_mpu_out: push edx mov dx, word [mididp] out dx, al pop edx ret -align 4 -sys_midi: - cmp [mididp], 0 - jnz sm0 - mov [esp+36], dword 1 - ret -sm0: - and [esp+36], dword 0 - dec ebx - jnz smn1 - ; call setuart -su1: - call is_output - test al, al - jnz su1 - mov dx, word [midisp] - mov al, 0xff - out dx, al -su2: - mov dx, word [midisp] - mov al, 0xff - out dx, al - call is_input - test al, al - jnz su2 - call get_mpu_in - cmp al, 0xfe - jnz su2 -su3: - call is_output - test al, al - jnz su3 - mov dx, word [midisp] - mov al, 0x3f - out dx, al - ret -smn1: - dec ebx - jnz smn2 -sm10: - call get_mpu_in - call is_output - test al, al - jnz sm10 - mov al, bl - call put_mpu_out - smn2: - ret - +;----------------------------------------------------------------------------- sys_end: -;-------------------------------------- cmp [_display.select_cursor], 0 je @f ; restore default cursor before killing @@ -2028,6 +2030,7 @@ sysfn_terminate: ; 18.2 = TERMINATE mov eax, [thread_count] shl ecx, BSF sizeof.APPDATA add ecx, SLOT_BASE + mov edx, [ecx + APPDATA.tid] cmp byte [ecx + APPDATA.state], TSTATE_FREE jz .noprocessterminate @@ -2054,7 +2057,7 @@ sysfn_terminate: ; 18.2 = TERMINATE ; restore default cursor before killing pusha mov ecx, [esp+32] - shl ecx, 8 + shl ecx, BSF sizeof.APPDATA add ecx, SLOT_BASE mov eax, [def_cursor] cmp [ecx + APPDATA.cursor], eax @@ -2078,8 +2081,6 @@ sysfn_terminate: ; 18.2 = TERMINATE ret ;------------------------------------------------------------------------------ sysfn_terminate2: -;lock application_table_status mutex -.table_status: call lock_application_table mov eax, ecx call pid_to_slot @@ -2247,16 +2248,16 @@ sysfn_getactive: ; 18.7 = get active window sysfn_sound_flag: ; 18.8 = get/set sound_flag ; cmp ecx,1 dec ecx - jnz nogetsoundflag + jnz .set_flag movzx eax, byte [sound_flag]; get sound_flag mov [esp + SYSCALL_STACK.eax], eax ret - nogetsoundflag: +.set_flag: ; cmp ecx,2 dec ecx - jnz nosoundflag + jnz .err xor byte [sound_flag], 1 - nosoundflag: +.err: ret ;------------------------------------------------------------------------------ sysfn_minimize: ; 18.10 = minimize window @@ -2294,13 +2295,12 @@ sysfn_getversion: ; 18.13 = get kernel ID and version ret ;------------------------------------------------------------------------------ sysfn_waitretrace: ; 18.14 = sys wait retrace - ;wait retrace functions - sys_wait_retrace: + ;wait retrace functions mov edx, 0x3da - WaitRetrace_loop: +.loop: in al, dx test al, 1000b - jz WaitRetrace_loop + jz .loop and [esp + SYSCALL_STACK.eax], dword 0 ret ;------------------------------------------------------------------------------ @@ -2490,84 +2490,6 @@ sys_cachetodiskette: mov [esp + SYSCALL_STACK.eax], dword 1 ret ;------------------------------------------------------------------------------ - -align 4 -sys_getkey: - mov [esp + SYSCALL_STACK.eax], dword 1 - ; test main buffer - mov ebx, [current_slot_idx] ; TOP OF WINDOW STACK - movzx ecx, word [WIN_STACK + ebx * 2] - mov edx, [thread_count] - cmp ecx, edx - jne .finish - cmp [KEY_COUNT], byte 0 - je .finish - movzx ax, byte [KEY_BUFF + 120 + 2] - shl eax, 8 - mov al, byte [KEY_BUFF] - shl eax, 8 - push eax - dec byte [KEY_COUNT] - and byte [KEY_COUNT], 127 - movzx ecx, byte [KEY_COUNT] - add ecx, 2 - mov eax, KEY_BUFF + 1 - mov ebx, KEY_BUFF - call memmove - add eax, 120 + 2 - add ebx, 120 + 2 - call memmove - pop eax -;-------------------------------------- -align 4 -.ret_eax: - mov [esp + SYSCALL_STACK.eax], eax - ret -;-------------------------------------- -align 4 -.finish: -; test hotkeys buffer - mov ecx, hotkey_buffer -;-------------------------------------- -align 4 -@@: - cmp [ecx], ebx - jz .found - add ecx, 8 - cmp ecx, hotkey_buffer + 120 * 8 - jb @b - ret -;-------------------------------------- -align 4 -.found: - mov ax, [ecx + 6] - shl eax, 16 - mov ah, [ecx + 4] - mov al, 2 - and dword [ecx + 4], 0 - and dword [ecx], 0 - jmp .ret_eax -;------------------------------------------------------------------------------ -align 4 -sys_getbutton: - mov ebx, [current_slot_idx] ; TOP OF WINDOW STACK - mov [esp + SYSCALL_STACK.eax], dword 1 - movzx ecx, word [WIN_STACK + ebx * 2] - mov edx, [thread_count] ; less than 256 processes - cmp ecx, edx - jne .exit - movzx eax, byte [BTN_COUNT] - test eax, eax - jz .exit - mov eax, [BTN_BUFF] - and al, 0xFE ; delete left button bit - mov [BTN_COUNT], byte 0 - mov [esp + SYSCALL_STACK.eax], eax -;-------------------------------------- -align 4 -.exit: - ret -;------------------------------------------------------------------------------ align 4 sys_cpuusage: @@ -3308,7 +3230,7 @@ calculatebackground: ; background mov ecx, [_display.win_map_size] shr ecx, 2 rep stosd - mov byte[window_data + 32 + WDATA.z_modif], ZPOS_DESKTOP + mov byte[window_data + sizeof.WDATA + WDATA.z_modif], ZPOS_DESKTOP mov [REDRAW_BACKGROUND], 0 ret ;----------------------------------------------------------------------------- @@ -4037,41 +3959,6 @@ putimage_get16bpp: ; call [draw_pointer] ; ret ;----------------------------------------------------------------------------- -align 4 -kb_write_wait_ack: - - push ecx edx - - mov dl, al - mov ecx, 0x1ffff; last 0xffff, new value in view of fast CPU's -.wait_output_ready: - in al, 0x64 - test al, 2 - jz @f - loop .wait_output_ready - mov ah, 1 - jmp .nothing -@@: - mov al, dl - out 0x60, al - mov ecx, 0xfffff; last 0xffff, new value in view of fast CPU's -.wait_ack: - in al, 0x64 - test al, 1 - jnz @f - loop .wait_ack - mov ah, 1 - jmp .nothing -@@: - in al, 0x60 - xor ah, ah - -.nothing: - pop edx ecx - - ret -;----------------------------------------------------------------------------- - if used _rdtsc _rdtsc: bt [cpu_caps], CAPS_TSC @@ -4241,153 +4128,6 @@ end if mov [esp + SYSCALL_STACK.ebx], 1 ret -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; 66 sys function. ;; -;; in eax=66,ebx in [0..5],ecx,edx ;; -;; out eax ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -iglobal -align 4 -f66call: - dd sys_process_def.1 ; 1 = set keyboard mode - dd sys_process_def.2 ; 2 = get keyboard mode - dd sys_process_def.3 ; 3 = get keyboard ctrl, alt, shift - dd sys_process_def.4 ; 4 = set system-wide hotkey - dd sys_process_def.5 ; 5 = delete installed hotkey - dd sys_process_def.6 ; 6 = disable input, work only hotkeys - dd sys_process_def.7 ; 7 = enable input, opposition to f.66.6 -endg -;----------------------------------------------------------------------------- -align 4 -sys_process_def: - dec ebx - cmp ebx, 7 - jae .not_support ;if >=8 then or eax,-1 - - mov edi, [current_slot] - jmp dword [f66call + ebx*4] - -.not_support: - or [esp + SYSCALL_STACK.eax], -1 - ret -;----------------------------------------------------------------------------- -align 4 -.1: - mov [edi + APPDATA.keyboard_mode], cl - ret -;----------------------------------------------------------------------------- -align 4 -.2: ; 2 = get keyboard mode - movzx eax, byte [edi + APPDATA.keyboard_mode] - mov [esp + SYSCALL_STACK.eax], eax - ret -;----------------------------------------------------------------------------- -align 4 -.3: ;3 = get keyboard ctrl, alt, shift - mov eax, [kb_state] - mov [esp + SYSCALL_STACK.eax], eax - ret -;----------------------------------------------------------------------------- -align 4 -.4: - mov edi, [current_slot_idx] - mov eax, hotkey_list -@@: - cmp dword [eax + 8], 0 - jz .found_free - add eax, 16 - cmp eax, hotkey_list+16*256 - jb @b - mov dword [esp + SYSCALL_STACK.eax], 1 - ret -.found_free: - mov [eax + 8], edi - mov [eax + 4], edx - movzx ecx, cl - lea ecx, [hotkey_scancodes+ecx*4] - mov edx, [ecx] - mov [eax], edx - mov [ecx], eax - mov [eax + 12], ecx - test edx, edx - jz @f - mov [edx + 12], eax -@@: - and dword [esp + SYSCALL_STACK.eax], 0 - ret -;----------------------------------------------------------------------------- -align 4 -.5: - mov edi, [current_slot_idx] - movzx ebx, cl - lea ebx, [hotkey_scancodes+ebx*4] - mov eax, [ebx] -.scan: - test eax, eax - jz .notfound - cmp [eax + 8], edi - jnz .next - cmp [eax + 4], edx - jz .found -.next: - mov eax, [eax] - jmp .scan -.notfound: - mov dword [esp + SYSCALL_STACK.eax], 1 - ret -.found: - mov ecx, [eax] - jecxz @f - mov edx, [eax + 12] - mov [ecx + 12], edx -@@: - mov ecx, [eax + 12] - mov edx, [eax] - mov [ecx], edx - xor edx, edx - mov [eax + 4], edx - mov [eax + 8], edx - mov [eax + 12], edx - mov [eax], edx - mov [esp + SYSCALL_STACK.eax], edx - ret -;----------------------------------------------------------------------------- -align 4 -.6: - pushfd - cli - mov eax, [PID_lock_input] - test eax, eax - jnz @f -; get current PID - mov eax, [current_slot] - mov eax, [eax + APPDATA.tid] -; set current PID for lock input - mov [PID_lock_input], eax -@@: - popfd - ret -;----------------------------------------------------------------------------- -align 4 -.7: - mov eax, [PID_lock_input] - test eax, eax - jz @f -; get current PID - mov ebx, [current_slot] - mov ebx, [ebx + APPDATA.tid] -; compare current lock input with current PID - cmp ebx, eax - jne @f - - xor eax, eax - mov [PID_lock_input], eax -@@: - ret -;----------------------------------------------------------------------------- -uglobal - PID_lock_input dd 0x0 -endg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 61 sys function. ;; ;; in eax=61,ebx in [1..3] ;; @@ -4737,7 +4477,7 @@ sys_apm: inc eax or dword [esp + 44], eax ; error add eax, 7 - mov dword [esp + 32], eax ; 32-bit protected-mode interface not supported + mov dword [esp + SYSCALL_STACK.eax], eax ; 32-bit protected-mode interface not supported ret @@: @@ -4748,9 +4488,9 @@ sys_apm: ja @f and [esp + 44], byte 0xfe ; emulate func 0..3 as func 0 mov eax, [apm_vf] - mov [esp + 32], eax + mov [esp + SYSCALL_STACK.eax], eax shr eax, 16 - mov [esp + 28], eax + mov [esp + SYSCALL_STACK.ecx], eax ret @@: @@ -4769,12 +4509,12 @@ sys_apm: mov cr3, eax pop eax - mov [esp + 4 ], edi - mov [esp + 8], esi - mov [esp + 20], ebx - mov [esp + 24], edx - mov [esp + 28], ecx - mov [esp + 32], eax + mov [esp + SYSCALL_STACK.edi], edi + mov [esp + SYSCALL_STACK.esi], esi + mov [esp + SYSCALL_STACK.ebx], ebx + mov [esp + SYSCALL_STACK.edx], edx + mov [esp + SYSCALL_STACK.ecx], ecx + mov [esp + SYSCALL_STACK.eax], eax setc al and [esp + 44], byte 0xfe or [esp + 44], al