From 3be0aa5c21d11769740d2e712047ae53f31cf305 Mon Sep 17 00:00:00 2001 From: Galkov Date: Sat, 28 Mar 2009 18:36:41 +0000 Subject: [PATCH] refractoring of EVENT, and so on git-svn-id: svn://kolibrios.org@1055 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/const.inc | 16 +- kernel/trunk/core/exports.inc | 113 +- kernel/trunk/core/memory.inc | 3 +- kernel/trunk/core/sched.inc | 543 ++-- kernel/trunk/core/syscall.inc | 143 +- kernel/trunk/core/v86.inc | 10 +- kernel/trunk/data32.inc | 386 ++- kernel/trunk/gui/event.inc | 1119 ++++---- kernel/trunk/kernel.asm | 4659 ++++++++++++++++----------------- kernel/trunk/kernel32.inc | 54 +- kernel/trunk/macros.inc | 6 + 11 files changed, 3355 insertions(+), 3697 deletions(-) diff --git a/kernel/trunk/const.inc b/kernel/trunk/const.inc index c1a5afc71d..39ac37e702 100644 --- a/kernel/trunk/const.inc +++ b/kernel/trunk/const.inc @@ -95,11 +95,11 @@ CAPS_SVM equ 73 ;secure virual machine CAPS_ALTMOVCR8 equ 74 ; ; CPU MSR names -MSR_SYSENTER_CS equ 0x174 -MSR_SYSENTER_ESP equ 0x175 -MSR_SYSENTER_EIP equ 0x176 -MSR_AMD_EFER equ 0xC0000080 ; Extended Feature Enable Register -MSR_AMD_STAR equ 0xC0000081 ; SYSCALL/SYSRET Target Address Register +MSR_SYSENTER_CS equ 0x174 +MSR_SYSENTER_ESP equ 0x175 +MSR_SYSENTER_EIP equ 0x176 +MSR_AMD_EFER equ 0xC0000080 ; Extended Feature Enable Register +MSR_AMD_STAR equ 0xC0000081 ; SYSCALL/SYSRET Target Address Register CR0_PE equ 0x00000001 ;protected mode CR0_MP equ 0x00000002 ;monitor fpu @@ -468,9 +468,10 @@ struc EVENT .id dd ? ;event uid .state dd ? ;internal flags .code dd ? - rd 5 + rd 6 + .size = $ - .magic + .codesize = $ - .code } -EVENT_SIZE equ 52 virtual at 0 EVENT EVENT @@ -687,4 +688,3 @@ end virtual virtual at 0 CSYM COFF_SYM end virtual - diff --git a/kernel/trunk/core/exports.inc b/kernel/trunk/core/exports.inc index dffbe1a183..4096e406f2 100644 --- a/kernel/trunk/core/exports.inc +++ b/kernel/trunk/core/exports.inc @@ -9,57 +9,57 @@ $Revision$ iglobal - szKernel db 'KERNEL', 0 - szVersion db 'version',0 + szKernel db 'KERNEL', 0 + szVersion db 'version',0 - szRegService db 'RegService',0 - szGetService db 'GetService',0 + szRegService db 'RegService',0 + szGetService db 'GetService',0 szServiceHandler db 'ServiceHandler',0 szAttachIntHandler db 'AttachIntHandler',0 szGetIntHandler db 'GetIntHandler', 0 - szFpuSave db 'FpuSave',0 - szFpuRestore db 'FpuRestore',0 + szFpuSave db 'FpuSave',0 + szFpuRestore db 'FpuRestore',0 szReservePortArea db 'ReservePortArea',0 - szBoot_Log db 'Boot_Log',0 + szBoot_Log db 'Boot_Log',0 - szPciApi db 'PciApi', 0 - szPciRead32 db 'PciRead32', 0 - szPciRead16 db 'PciRead16', 0 - szPciRead8 db 'PciRead8', 0 - szPciWrite8 db 'PciWrite8',0 - szPciWrite16 db 'PciWrite16',0 - szPciWrite32 db 'PciWrite32',0 + szPciApi db 'PciApi', 0 + szPciRead32 db 'PciRead32', 0 + szPciRead16 db 'PciRead16', 0 + szPciRead8 db 'PciRead8', 0 + szPciWrite8 db 'PciWrite8',0 + szPciWrite16 db 'PciWrite16',0 + szPciWrite32 db 'PciWrite32',0 - szAllocPage db 'AllocPage',0 - szAllocPages db 'AllocPages',0 - szFreePage db 'FreePage',0 - szGetPgAddr db 'GetPgAddr',0 - szMapPage db 'MapPage',0 - szMapSpace db 'MapSpace',0 - szMapIoMem db 'MapIoMem',0 + szAllocPage db 'AllocPage',0 + szAllocPages db 'AllocPages',0 + szFreePage db 'FreePage',0 + szGetPgAddr db 'GetPgAddr',0 + szMapPage db 'MapPage',0 + szMapSpace db 'MapSpace',0 + szMapIoMem db 'MapIoMem',0 szCommitPages db 'CommitPages',0 szReleasePages db 'ReleasePages',0 szAllocKernelSpace db 'AllocKernelSpace',0 szFreeKernelSpace db 'FreeKernelSpace',0 szKernelAlloc db 'KernelAlloc',0 - szKernelFree db 'KernelFree',0 - szUserAlloc db 'UserAlloc',0 - szUserFree db 'UserFree',0 - szKmalloc db 'Kmalloc',0 - szKfree db 'Kfree',0 + szKernelFree db 'KernelFree',0 + szUserAlloc db 'UserAlloc',0 + szUserFree db 'UserFree',0 + szKmalloc db 'Kmalloc',0 + szKfree db 'Kfree',0 szCreateRingBuffer db 'CreateRingBuffer',0 - szGetPid db 'GetPid',0 + szGetPid db 'GetPid',0 szCreateObject db 'CreateObject',0 szDestroyObject db 'DestroyObject',0 szCreateEvent db 'CreateEvent',0 - szRaiseEvent db 'RaiseEvent',0 - szWaitEvent db 'WaitEvent',0 + szRaiseEvent db 'RaiseEvent',0 + szWaitEvent db 'WaitEvent',0 szDestroyEvent db 'DestroyEvent',0 - szClearEvent db 'ClearEvent',0 + szClearEvent db 'ClearEvent',0 - szLoadCursor db 'LoadCursor',0 + szLoadCursor db 'LoadCursor',0 szSelectHwCursor db 'SelectHwCursor',0 szSetHwCursor db 'SetHwCursor',0 szHwCursorRestore db 'HwCursorRestore', 0 @@ -68,19 +68,19 @@ iglobal szSysMsgBoardStr db 'SysMsgBoardStr', 0 szSysMsgBoardChar db 'SysMsgBoardChar', 0 szGetCurrentTask db 'GetCurrentTask',0 - szLFBAddress db 'LFBAddress',0 - szLoadFile db 'LoadFile',0 - szSendEvent db 'SendEvent',0 + szLFBAddress db 'LFBAddress',0 + szLoadFile db 'LoadFile',0 + szSendEvent db 'SendEvent',0 szSetMouseData db 'SetMouseData',0 szSleep db 'Sleep',0 szGetTimerTicks db 'GetTimerTicks',0 - szStrncat db 'strncat',0 - szStrncpy db 'strncpy',0 - szstrncmp db 'strncmp',0 - szStrnlen db 'strnlen',0 - szStrchr db 'strchr',0 - szStrrchr db 'strrchr',0 + szStrncat db 'strncat',0 + szStrncpy db 'strncpy',0 + szstrncmp db 'strncmp',0 + szStrnlen db 'strnlen',0 + szStrchr db 'strchr',0 + szStrrchr db 'strrchr',0 align 16 @@ -90,12 +90,12 @@ kernel_export: dd szServiceHandler , srv_handler dd szAttachIntHandler, attach_int_handler dd szGetIntHandler , get_int_handler - dd szFpuSave , fpu_save + dd szFpuSave , fpu_save dd szFpuRestore , fpu_restore dd szReservePortArea , r_f_port_area dd szBoot_Log , boot_log - dd szPciApi , pci_api + dd szPciApi , pci_api dd szPciRead32 , pci_read32 dd szPciRead16 , pci_read16 dd szPciRead8 , pci_read8 @@ -126,11 +126,11 @@ kernel_export: dd szGetPid , get_pid dd szCreateObject , create_kernel_object dd szDestroyObject , destroy_kernel_object - dd szCreateEvent , create_event - dd szRaiseEvent , raise_event - dd szWaitEvent , wait_event - dd szDestroyEvent , destroy_event - dd szClearEvent , clear_event + dd szCreateEvent , create_event ;see EVENT.inc for specification + dd szRaiseEvent , raise_event ;see EVENT.inc for specification + dd szWaitEvent , wait_event ;see EVENT.inc for specification + dd szDestroyEvent , destroy_event ;see EVENT.inc for specification + dd szClearEvent , clear_event ;see EVENT.inc for specification dd szLoadCursor , load_cursor ;stdcall @@ -143,21 +143,20 @@ kernel_export: dd szSysMsgBoardChar , sys_msg_board dd szGetCurrentTask , get_curr_task dd szLoadFile , load_file ;retval eax, ebx - dd szSendEvent , send_event + dd szSendEvent , send_event ;see EVENT.inc for specification dd szSetMouseData , set_mouse_data ;stdcall - dd szSleep , delay_ms + dd szSleep , delay_ms dd szGetTimerTicks , get_timer_ticks - dd szStrncat , strncat - dd szStrncpy , strncpy - dd szstrncmp , strncmp - dd szStrnlen , strnlen - dd szStrchr , strchr - dd szStrrchr , strrchr + dd szStrncat , strncat + dd szStrncpy , strncpy + dd szstrncmp , strncmp + dd szStrnlen , strnlen + dd szStrchr , strchr + dd szStrrchr , strrchr exp_lfb: dd szLFBAddress , 0 - dd 0 ;terminator, must be zero + dd 0 ;terminator, must be zero endg - diff --git a/kernel/trunk/core/memory.inc b/kernel/trunk/core/memory.inc index da38aa64c8..95fbcdc607 100644 --- a/kernel/trunk/core/memory.inc +++ b/kernel/trunk/core/memory.inc @@ -1051,7 +1051,8 @@ f68: .14: cmp ebx, OS_BASE jae .fail - stdcall get_event_ex, ebx, ecx + mov edi,ebx + call get_event_ex mov [esp+36], eax ret .15: diff --git a/kernel/trunk/core/sched.inc b/kernel/trunk/core/sched.inc index 83db51f967..e29ee756fe 100644 --- a/kernel/trunk/core/sched.inc +++ b/kernel/trunk/core/sched.inc @@ -15,321 +15,229 @@ $Revision$ align 32 irq0: - pushad - mov ax, app_data ; - mov ds, ax - mov es, ax - -; cmp dword[CURRENT_TASK], 1 -; jnz @f -; mov eax, [esp + 32] -; cmp eax, idle_loop + 1 -; jz @f -; DEBUGF 1, "K : OOOPS! EAX = 0x%x\n", eax -; @@: - - inc dword [timer_ticks] - - mov eax, [timer_ticks] - call playNote ; <<<--- Speaker driver - - cmp eax,[next_usage_update] - jb .nocounter - add eax,100 - mov [next_usage_update],eax - call updatecputimes -.nocounter: - cmp [DONT_SWITCH], byte 1 - jne .change_task - - mov al,0x20 ; send End Of Interrupt signal - mov dx,0x20 - out dx,al - - mov [DONT_SWITCH], byte 0 - - popad - iretd - -.change_task: - call update_counters - - call find_next_task - mov ecx, eax - - mov al,0x20 ; send End Of Interrupt signal - mov dx,0x20 - out dx,al - - test ecx, ecx ; if there is only one running process - jnz .return - - call do_change_task - -.return: - popad - ; popfd - iretd - + pushad + Mov ds, ax, app_data + mov es, ax + inc [timer_ticks] + mov eax, [timer_ticks] + call playNote ; <<<--- Speaker driver + sub eax,[next_usage_update] + cmp eax,100 + jb .nocounter + add [next_usage_update],100 + call updatecputimes + .nocounter: + mov al,0x20 ; send End Of Interrupt signal + out 0x20,al + btr dword[DONT_SWITCH], 0 + jc .return + call find_next_task + jz .return ; if there is only one running process + call do_change_task + .return: + popad + iretd align 4 change_task: - - pushfd - cli - pushad - - call update_counters - + pushfd + cli + pushad if 0 - -; \begin{Mario79} - cmp [dma_task_switched], 1 - jne .find_next_task - mov [dma_task_switched], 0 - mov ebx, [dma_process] - cmp [CURRENT_TASK], ebx - je .return - mov edi, [dma_slot_ptr] - mov [CURRENT_TASK], ebx - mov [TASK_BASE], edi - jmp @f +; \begin{Mario79} ; <- must be refractoried, if used... + cmp [dma_task_switched], 1 + jne .find_next_task + mov [dma_task_switched], 0 + mov ebx, [dma_process] + cmp [CURRENT_TASK], ebx + je .return + mov edi, [dma_slot_ptr] + mov [CURRENT_TASK], ebx + mov [TASK_BASE], edi + jmp @f .find_next_task: ; \end{Mario79} - end if - - call find_next_task - test eax, eax ; the same task -> skip switch - jnz .return -@@: - mov [DONT_SWITCH],byte 1 - call do_change_task - -.return: - popad - popfd - ret - + call find_next_task + jz .return ; the same task -> skip switch + @@: mov byte[DONT_SWITCH], 1 + call do_change_task + .return: + popad + popfd + ret uglobal - align 4 - far_jump: - .offs dd ? - .sel dw ? - context_counter dd ? ;noname & halyavin - next_usage_update dd ? - timer_ticks dd ? - prev_slot dd ? - event_sched dd ? +align 4 +; far_jump: +; .offs dd ? +; .sel dw ? + context_counter dd 0 ;noname & halyavin + next_usage_update dd 0 + timer_ticks dd 0 +; prev_slot dd ? +; event_sched dd ? endg - +align 4 update_counters: - mov edi, [TASK_BASE] - mov ebx, [edi+TASKDATA.counter_add] ; time stamp counter add - rdtsc - sub eax, ebx - add eax, [edi+TASKDATA.counter_sum] ; counter sum - mov [edi+TASKDATA.counter_sum], eax -ret - - -; Find next task to execute -; result: ebx = number of the selected task -; 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, [CURRENT_TASK] - mov edi, [TASK_BASE] - mov [prev_slot], ebx - -.waiting_for_termination: -.waiting_for_reuse: -.waiting_for_event: -.suspended: - cmp ebx, [TASK_COUNT] - jb @f - mov edi, CURRENT_TASK - xor ebx, ebx -@@: - - add edi,0x20 - inc ebx - - mov al, byte [edi+TASKDATA.state] - test al, al - jz .found - cmp al, 1 - jz .suspended - cmp al, 2 - jz .suspended - cmp al, 3 - je .waiting_for_termination - cmp al, 4 - je .waiting_for_termination - cmp al, 9 - je .waiting_for_reuse - - mov [CURRENT_TASK],ebx - mov [TASK_BASE],edi - - cmp al, 5 - jne .noevents - call get_event_for_app - test eax, eax - jnz @f - mov eax, ebx - shl eax, 8 - mov eax, [SLOT_BASE + APPDATA.wait_timeout + eax] - cmp eax, [timer_ticks] - jae .waiting_for_event - xor eax, eax -@@: - mov [event_sched], eax - mov [edi+TASKDATA.state], byte 0 -.noevents: -.found: - mov [CURRENT_TASK],ebx - mov [TASK_BASE],edi - rdtsc ;call _rdtsc - mov [edi+TASKDATA.counter_add],eax - - mov esi, [prev_slot] - xor eax, eax - cmp ebx, esi - sete al -ret - -; param -; ebx = incoming task -; esi = outcomig task - -do_change_task: - - shl ebx, 8 - add ebx, SLOT_BASE - mov [current_slot], ebx - - shl esi, 8 - add esi, SLOT_BASE - - mov [esi+APPDATA.saved_esp], esp - mov esp, [ebx+APPDATA.saved_esp] - -; set thread io map - - mov ecx, [ebx+APPDATA.io_map] - mov edx, [ebx+APPDATA.io_map+4] - mov dword [page_tabs+((tss._io_map_0 and -4096) shr 10)], ecx - mov dword [page_tabs+((tss._io_map_1 and -4096) shr 10)], edx - - mov eax, [ebx+APPDATA.dir_table] - cmp eax, [esi+APPDATA.dir_table] - je @F - mov cr3, eax -@@: - mov eax, [ebx+APPDATA.saved_esp0] - mov [tss._esp0], eax - mov ax, graph_data - mov gs, ax - - mov eax, [CURRENT_TASK] - cmp eax, [fpu_owner] - clts ;clear a task switch flag - je @F - ;and set it again if the owner - mov ecx, cr0 ;of a fpu has changed - or ecx, CR0_TS - mov cr0, ecx -@@: - inc [context_counter] ;noname & halyavin - test [ebx+APPDATA.dbg_state], 1 - jnz @F - ret -@@: - mov eax, [ebx+APPDATA.dbg_regs.dr0] - mov dr0, eax - mov eax, [ebx+APPDATA.dbg_regs.dr1] - mov dr1, eax - mov eax, [ebx+APPDATA.dbg_regs.dr2] - mov dr2, eax - mov eax, [ebx+APPDATA.dbg_regs.dr3] - mov dr3, eax - xor eax, eax - mov dr6, eax - mov eax, [ebx+APPDATA.dbg_regs.dr7] - mov dr7, eax - ret - + mov edi, [TASK_BASE] + rdtsc + sub eax, [edi+TASKDATA.counter_add] ; time stamp counter add + add [edi+TASKDATA.counter_sum], eax ; counter sum + ret align 4 updatecputimes: + xor eax,eax + xchg eax,[idleuse] + mov [idleusesec],eax + mov ecx, [TASK_COUNT] + mov edi, TASK_DATA + .newupdate: + xor eax,eax + xchg eax,[edi+TASKDATA.counter_sum] + mov [edi+TASKDATA.cpu_usage],eax + add edi,0x20 + loop .newupdate + ret - mov eax,[idleuse] - mov [idleusesec],eax - mov [idleuse],dword 0 - mov ecx, [TASK_COUNT] - mov edi, TASK_DATA -.newupdate: - mov ebx,[edi+TASKDATA.counter_sum] - mov [edi+TASKDATA.cpu_usage],ebx - mov [edi+TASKDATA.counter_sum],dword 0 - add edi,0x20 - dec ecx - jnz .newupdate +align 4 +find_next_task: +;info: +; Find next task to execute +;retval: +; ebx = address of the APPDATA for the selected task (slot-base) +; esi = previous slot-base ([current_slot] at the begin) +; edi = address of the TASKDATA for the selected task +; ZF = 1 if the task is the same +;warning: +; [CURRENT_TASK] = bh , [TASK_BASE] = edi -- as result +; [current_slot] is not set to new value (ebx)!!! +;scratched: eax,ecx + call update_counters ; edi := [TASK_BASE] + Mov esi, ebx, [current_slot] + .loop: + cmp bh,[TASK_COUNT] + jb @f + xor bh, bh + mov edi,CURRENT_TASK + @@: inc bh ; ebx += APPDATA.size + add edi,0x20 ; edi += TASKDATA.size + mov al, [edi+TASKDATA.state] + test al, al + jz .found ; state == 0 + cmp al, 5 + jne .loop ; state == 1,2,3,4,9 + ; state == 5 + pushad ; more freedom for [APPDATA.wait_test] + call [ebx+APPDATA.wait_test] + mov [esp+28],eax + popad + or eax,eax + jnz @f + ; testing for timeout + mov ecx, [timer_ticks] + sub ecx, [ebx+APPDATA.wait_begin] + cmp ecx, [ebx+APPDATA.wait_timeout] + jb .loop + @@: mov [ebx+APPDATA.wait_param], eax ; retval for wait + mov [edi+TASKDATA.state], 0 + .found: + mov [CURRENT_TASK],bh + mov [TASK_BASE],edi + rdtsc ;call _rdtsc + mov [edi+TASKDATA.counter_add],eax ; for next using update_counters + cmp ebx, esi ;esi - previous slot-base + ret +;TODO: Надо бы убрать использование do_change_task из V86... +; и после этого перенести обработку TASKDATA.counter_add/sum в do_change_task - ret +align 4 +do_change_task: +;param: +; ebx = address of the APPDATA for incoming task (new) +;warning: +; [CURRENT_TASK] and [TASK_BASE] must be changed before (e.g. in find_next_task) +; [current_slot] is the outcoming (old), and set here to a new value (ebx) +;scratched: eax,ecx,esi + mov esi,ebx + xchg esi,[current_slot] + ; set new stack after saving old + mov [esi+APPDATA.saved_esp], esp + mov esp, [ebx+APPDATA.saved_esp] + ; set new thread io-map + Mov dword [page_tabs+((tss._io_map_0 and -4096) shr 10)],eax,[ebx+APPDATA.io_map] + Mov dword [page_tabs+((tss._io_map_1 and -4096) shr 10)],eax,[ebx+APPDATA.io_map+4] + ; set new thread memory-map + mov ecx, APPDATA.dir_table + mov eax, [ebx+ecx] ;offset>0x7F + cmp eax, [esi+ecx] ;offset>0x7F + je @f + mov cr3, eax + @@: ; set tss.esp0 + Mov [tss._esp0],eax,[ebx+APPDATA.saved_esp0] + ; set gs selector unconditionally + Mov gs,ax,graph_data + ; set CR0.TS + cmp bh, byte[fpu_owner] ;bh == incoming task (new) + clts ;clear a task switch flag + je @f + mov eax, cr0 ;and set it again if the owner + or eax, CR0_TS ;of a fpu has changed + mov cr0, eax + @@: ; set context_counter (only for user pleasure ???) + inc [context_counter] ;noname & halyavin + ; set debug-registers, if it's necessary + test byte[ebx+APPDATA.dbg_state], 1 + jz @f + xor eax, eax + mov dr6, eax + lea esi,[ebx+ecx+APPDATA.dbg_regs-APPDATA.dir_table] ;offset>0x7F + cld + macro lodsReg [reg] { + lodsd + mov reg,eax + } lodsReg dr0, dr1, dr2, dr3, dr7 + purge lodsReg + @@: ret +;end. if 0 - - struc TIMER { .next dd ? .exp_time dd ? .func dd ? - .arg dd ? + .arg dd ? } - - - - - - - - -MAX_PROIRITY 0 ; highest, used for kernel tasks -MAX_USER_PRIORITY 0 ; highest priority for user processes -USER_PRIORITY 7 ; default (should correspond to nice 0) -MIN_USER_PRIORITY 14 ; minimum priority for user processes -IDLE_PRIORITY 15 ; lowest, only IDLE process goes here -NR_SCHED_QUEUES 16 ; MUST equal IDLE_PRIORYTY + 1 +MAX_PROIRITY 0 ; highest, used for kernel tasks +MAX_USER_PRIORITY 0 ; highest priority for user processes +USER_PRIORITY 7 ; default (should correspond to nice 0) +MIN_USER_PRIORITY 14 ; minimum priority for user processes +IDLE_PRIORITY 15 ; lowest, only IDLE process goes here +NR_SCHED_QUEUES 16 ; MUST equal IDLE_PRIORYTY + 1 rdy_head rd 16 - align 4 pick_task: - xor eax, eax -.pick: - mov ebx, [rdy_head+eax*4] - test ebx, ebx - jz .next - - mov [next_task], ebx - test [ebx+flags.billable] - jz @F - mov [bill_task], ebx -@@: - ret -.next: - inc eax - jmp .pick + xor eax, eax + .pick: + mov ebx, [rdy_head+eax*4] + test ebx, ebx + jz .next + mov [next_task], ebx + test [ebx+flags.billable] + jz @F + mov [bill_task], ebx + @@: + ret + .next: + inc eax + jmp .pick ; param ; eax= task @@ -338,51 +246,48 @@ pick_task: ; eax= task ; ebx= queue ; ecx= front if 1 or back if 0 - align 4 shed: - cmp [eax+.tics_left], 0 ;signed compare - mov ebx, [eax+.priority] - setg ecx - jg @F + cmp [eax+.tics_left], 0 ;signed compare + mov ebx, [eax+.priority] + setg ecx + jg @F - mov edx, [eax+.tics_quantum] - mov [eax+.ticks_left], edx - cmp ebx, (IDLE_PRIORITY-1) - je @F - inc ebx -@@: - ret + mov edx, [eax+.tics_quantum] + mov [eax+.ticks_left], edx + cmp ebx, (IDLE_PRIORITY-1) + je @F + inc ebx + @@: + ret ; param ; eax= task - align 4 enqueue: - call shed ;eax - cmp [rdy_head+ebx*4],0 - jnz @F + call shed ;eax + cmp [rdy_head+ebx*4],0 + jnz @F - mov [rdy_head+ebx*4], eax - mov [rdy_tail+ebx*4], eax - mov [eax+.next_ready], 0 - jmp .pick -@@: - test ecx, ecx - jz .back + mov [rdy_head+ebx*4], eax + mov [rdy_tail+ebx*4], eax + mov [eax+.next_ready], 0 + jmp .pick + @@: + test ecx, ecx + jz .back - mov ecx, [rdy_head+ebx*4] - mov [eax+.next_ready], ecx - mov [rdy_head+ebx*4], eax - jmp .pick -.back: - mov ecx, [rdy_tail+ebx*4] - mov [ecx+.next_ready], eax - mov [rdy_tail+ebx*4], eax - mov [eax+.next_ready], 0 -.pick: - call pick_proc ;select next task - ret + mov ecx, [rdy_head+ebx*4] + mov [eax+.next_ready], ecx + mov [rdy_head+ebx*4], eax + jmp .pick + .back: + mov ecx, [rdy_tail+ebx*4] + mov [ecx+.next_ready], eax + mov [rdy_tail+ebx*4], eax + mov [eax+.next_ready], 0 + .pick: + call pick_proc ;select next task + ret end if - diff --git a/kernel/trunk/core/syscall.inc b/kernel/trunk/core/syscall.inc index d6d89713b5..ebe8912562 100644 --- a/kernel/trunk/core/syscall.inc +++ b/kernel/trunk/core/syscall.inc @@ -10,33 +10,17 @@ $Revision$ ; Old style system call converter align 16 cross_order: - ; load all registers in crossed order - mov eax, ebx - mov ebx, ecx - mov ecx, edx - mov edx, esi - mov esi, edi - mov edi, [esp+28 + 4] - and edi,0xff - call dword [servetable+edi*4] - ret + ; load all registers in crossed order + mov eax, ebx + mov ebx, ecx + mov ecx, edx + mov edx, esi + mov esi, edi + movzx edi, byte[esp+28 + 4] + call dword [servetable+edi*4] + ret -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; SYSTEM CALL ENTRY ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - -align 16 -i40: - pushad - cld - movzx eax, al - call dword [servetable2 + eax * 4] - popad - iretd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; SYSENTER ENTRY ;; @@ -45,28 +29,43 @@ i40: align 32 sysenter_entry: - ; Настраиваем стек - mov esp, [ss:tss._esp0] - sti - push ebp ; save app esp + 4 - mov ebp, [ebp] ; ebp - original ebp - ;------------------ - pushad - cld + ; Настраиваем стек + mov esp, [ss:tss._esp0] + sti + push ebp ; save app esp + 4 + mov ebp, [ebp] ; ebp - original ebp + ;------------------ + pushad + cld - movzx eax, al - call dword [servetable2 + eax * 4] + movzx eax, al + call dword [servetable2 + eax * 4] - popad - ;------------------ - xchg ecx, [ss:esp] ; в вершин стека - app ecx, ecx - app esp + 4 - sub ecx, 4 - xchg edx, [ecx] ; edx - return point, & save original edx - push edx - mov edx, [ss:esp + 4] - mov [ecx + 4], edx ; save original ecx - pop edx - sysexit + popad + ;------------------ + xchg ecx, [ss:esp] ; в вершин стека - app ecx, ecx - app esp + 4 + sub ecx, 4 + xchg edx, [ecx] ; edx - return point, & save original edx + push edx + mov edx, [ss:esp + 4] + mov [ecx + 4], edx ; save original ecx + pop edx + sysexit + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; SYSTEM CALL ENTRY ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +align 16 +i40: + pushad + cld + movzx eax, al + call dword [servetable2 + eax * 4] + popad + iretd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; @@ -76,25 +75,26 @@ sysenter_entry: align 32 syscall_entry: ; cli syscall clear IF - xchg esp, [ss:tss._esp0] - push ecx - lea ecx, [esp+4] - xchg ecx, [ss:tss._esp0] - sti - push ecx - mov ecx, [ecx] - ;------------------ - pushad - cld + xchg esp, [ss:tss._esp0] + push ecx + lea ecx, [esp+4] + xchg ecx, [ss:tss._esp0] + sti + push ecx + mov ecx, [ecx] + ;------------------ + pushad + cld - movzx eax, al - call dword [servetable2 + eax * 4] + movzx eax, al + call dword [servetable2 + eax * 4] + + popad + ;------------------ + mov ecx, [ss:esp+4] + pop esp + sysret - popad - ;------------------ - mov ecx, [ss:esp+4] - pop esp - sysret iglobal ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; SYSTEM FUNCTIONS TABLE ;; @@ -133,7 +133,7 @@ iglobal dd 0 dd 0 ; dd 0 - dd sys_current_directory ; 30-Get/SetCurrentDirectory + dd sys_current_directory ; 30-Get/SetCurrentDirectory dd 0 dd 0 dd 0 @@ -153,7 +153,7 @@ iglobal dd display_number ; 47-WriteNum dd display_settings ; 48-SetRedrawType and SetButtonType dd sys_apm ; 49-Advanced Power Management (APM) - dd random_shaped_window ; 50-Window shape & scale + dd random_shaped_window ; 50-Window shape & scale dd syscall_threads ; 51-Threads dd stack_driver_stat ; 52-Stack driver status dd socket ; 53-Socket interface @@ -167,7 +167,7 @@ iglobal dd sys_gs ; 61-Direct graphics access dd sys_pci ; 62-PCI functions dd sys_msg_board ; 63-System message board - dd sys_resize_app_memory ; 64-Resize application memory usage + dd sys_resize_app_memory ; 64-Resize application memory usage dd syscall_putimage_palette; 65-PutImagePalette dd sys_process_def ; 66-Process definitions - keyboard dd sys_window_move ; 67-Window move or resize @@ -175,7 +175,6 @@ iglobal dd sys_debug_services ; 69-Debug dd file_system_lfn ; 70-Common file system interface, version 2 dd syscall_windowsettings ; 71-Window settings - dd sys_sendwindowmsg ; 72-Send window message ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; NEW SYSTEM FUNCTIONS TABLE ;; @@ -197,9 +196,9 @@ iglobal dd sys_getevent ; 11-CheckForEvent dd sys_redrawstat ; 12-BeginDraw and EndDraw dd syscall_drawrect ; 13-DrawRect - dd syscall_getscreensize ; 14-GetScreenSize + dd syscall_getscreensize ; 14-GetScreenSize dd sys_background ; 15-bgr - dd sys_cachetodiskette ; 16-FlushFloppyCache + dd sys_cachetodiskette ; 16-FlushFloppyCache dd sys_getbutton ; 17-GetButton dd sys_system ; 18-System Services dd paleholder ; 19-reserved @@ -224,7 +223,7 @@ iglobal dd syscall_drawline ; 38-DrawLine dd cross_order ; 39-GetBackgroundSize,ReadBgrData,. dd set_app_param ; 40-WantEvents - dd syscall_getirqowner ; 41-GetIrqOwner + dd syscall_getirqowner ; 41-GetIrqOwner dd get_irq_data ; 42-ReadIrqData dd cross_order ; 43-SendDeviceData dd sys_programirq ; 44-ProgramIrqs @@ -255,8 +254,8 @@ iglobal dd cross_order ; 69-Debug dd cross_order ; 70-Common file system interface, version 2 dd cross_order ; 71-Window settings - dd cross_order ; 72-Send window message - times 255 - ( ($-servetable2) /4 ) dd undefined_syscall - dd sys_end ; -1-end application + dd sys_sendwindowmsg ; 72-Send window message + times 255 - ( ($-servetable2) /4 ) dd undefined_syscall + dd sys_end ; -1-end application endg diff --git a/kernel/trunk/core/v86.inc b/kernel/trunk/core/v86.inc index 52d8d31a8c..6a93aadf6d 100644 --- a/kernel/trunk/core/v86.inc +++ b/kernel/trunk/core/v86.inc @@ -945,12 +945,12 @@ v86_irq2: mov cx, [eax*4+2] mov word [esi-v86_regs.size+v86_regs.cs], cx and byte [esi-v86_regs.size+v86_regs.eflags+1], not 3 - push ebx + ; push ebx call update_counters - pop ebx - sub ebx, SLOT_BASE - shr ebx, 8 - mov esi, [CURRENT_TASK] + ; pop ebx + ; sub ebx, SLOT_BASE + ; shr ebx, 8 + ; mov esi, [CURRENT_TASK] call do_change_task popad iretd diff --git a/kernel/trunk/data32.inc b/kernel/trunk/data32.inc index f21a76fe12..52084ccda2 100644 --- a/kernel/trunk/data32.inc +++ b/kernel/trunk/data32.inc @@ -48,28 +48,28 @@ keymap_alt: - boot_memdetect db 'Determining amount of memory',0 - boot_fonts db 'Fonts loaded',0 - boot_tss db 'Setting TSSs',0 - boot_cpuid db 'Reading CPUIDs',0 - boot_devices db 'Detecting devices',0 - boot_timer db 'Setting timer',0 - boot_irqs db 'Reprogramming IRQs',0 - boot_setmouse db 'Setting mouse',0 - boot_windefs db 'Setting window defaults',0 - boot_bgr db 'Calculating background',0 - boot_resirqports db 'Reserving IRQs & ports',0 - boot_setrports db 'Setting addresses for IRQs',0 - boot_setostask db 'Setting OS task',0 - boot_allirqs db 'Unmasking all IRQs',0 - boot_tsc db 'Reading TSC',0 + boot_memdetect db 'Determining amount of memory',0 + boot_fonts db 'Fonts loaded',0 + boot_tss db 'Setting TSSs',0 + boot_cpuid db 'Reading CPUIDs',0 + boot_devices db 'Detecting devices',0 + boot_timer db 'Setting timer',0 + boot_irqs db 'Reprogramming IRQs',0 + boot_setmouse db 'Setting mouse',0 + boot_windefs db 'Setting window defaults',0 + boot_bgr db 'Calculating background',0 + boot_resirqports db 'Reserving IRQs & ports',0 + boot_setrports db 'Setting addresses for IRQs',0 + boot_setostask db 'Setting OS task',0 + boot_allirqs db 'Unmasking all IRQs',0 + boot_tsc db 'Reading TSC',0 boot_cpufreq db 'CPU frequency is ',' ',' MHz',0 - boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0 - boot_pal_vga db 'Setting VGA 640x480 palette',0 - boot_failed db 'Failed to start first app',0 - boot_mtrr db 'Setting MTRR',0 + boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0 + boot_pal_vga db 'Setting VGA 640x480 palette',0 + boot_failed db 'Failed to start first app',0 + boot_mtrr db 'Setting MTRR',0 if preboot_blogesc - boot_tasking db 'All set - press ESC to start',0 + boot_tasking db 'All set - press ESC to start',0 end if ;new_process_loading db 'K : New Process - loading',13,10,0 @@ -80,7 +80,7 @@ msg_unresolved db 'unresolved ',0 msg_module db 'in module ',0 msg_version db 'incompatible driver version',13,10,0 msg_www db 'please visit www.kolibrios.org',13,10,0 -msg_CR db 13,10,0 +msg_CR db 13,10,0 aSis db 'SIS',0 intel_str db "GenuineIntel",0 @@ -88,11 +88,11 @@ AMD_str db "AuthenticAMD",0 ;szSound db 'SOUND',0 ;szInfinity db 'INFINITY',0 -szHwMouse db 'ATI2D',0 -szPS2MDriver db 'PS2MOUSE',0 -szCOM_MDriver db 'COM_MOUSE',0 -szUSB db 'USB',0 -szAtiHW db '/rd/1/drivers/ati2d.drv',0 +szHwMouse db 'ATI2D',0 +szPS2MDriver db 'PS2MOUSE',0 +szCOM_MDriver db 'COM_MOUSE',0 +szUSB db 'USB',0 +szAtiHW db '/rd/1/drivers/ati2d.drv',0 szSTART db 'START',0 szEXPORTS db 'EXPORTS',0 @@ -103,13 +103,13 @@ szIMPORTS db 'IMPORTS',0 read_firstapp db '/sys/' firstapp db 'LAUNCHER',0 -char db '/sys/FONTS/CHAR.MT',0 -char2 db '/sys/FONTS/CHAR2.MT',0 +char db '/sys/FONTS/CHAR.MT',0 +char2 db '/sys/FONTS/CHAR2.MT',0 bootpath db '/KOLIBRI ' bootpath2 db 0 -vmode db '/sys/drivers/VMODE.MDR',0 -vrr_m db 'VRR_M',0 +vmode db '/sys/drivers/VMODE.MDR',0 +vrr_m db 'VRR_M',0 kernel_file db 'KERNEL MNT' @@ -145,14 +145,14 @@ mode_320_240_8: ; mike.dld { db 0 dd servetable-0x10000 -draw_line dd __sys_draw_line -disable_mouse dd __sys_disable_mouse -draw_pointer dd __sys_draw_pointer +draw_line dd __sys_draw_line +disable_mouse dd __sys_disable_mouse +draw_pointer dd __sys_draw_pointer ;//mike.dld, 2006-08-02 [ ;drawbar dd __sys_drawbar -drawbar dd __sys_drawbar.forced +drawbar dd __sys_drawbar.forced ;//mike.dld, 2006-08-02 ] -putpixel dd __sys_putpixel +putpixel dd __sys_putpixel ; } mike.dld @@ -160,10 +160,10 @@ align 4 keyboard dd 1 syslang dd 1 -boot_y dd 10 +boot_y dd 10 -pci_bios_entry dd 0 - dw pci_code_sel +pci_bios_entry dd 0 + dw pci_code_sel if __DEBUG__ eq 1 include_debug_strings @@ -174,136 +174,135 @@ IncludeIGlobals align 16 gdts: - dw gdte-$-1 - dd gdts - dw 0 + dw gdte-$-1 + dd gdts + dw 0 ; Attention! Do not change the order of the first four selectors. They are used in Fast System Call ; must be : os_code, os_data, app_code, app_data, .... int_code_l: os_code_l: - dw 0xffff - dw 0x0000 - db 0x00 - dw 11011111b *256 +10011010b - db 0x00 + dw 0xffff + dw 0x0000 + db 0x00 + dw 11011111b *256 +10011010b + db 0x00 int_data_l: os_data_l: - dw 0xffff - dw 0x0000 - db 0x00 - dw 11011111b *256 +10010010b - db 0x00 + dw 0xffff + dw 0x0000 + db 0x00 + dw 11011111b *256 +10010010b + db 0x00 app_code_l: - dw 0xFFFF - dw 0 - db 0 - db cpl3 - dw G32+D32+(new_app_base shr 16)+0xF; + dw 0xFFFF + dw 0 + db 0 + db cpl3 + dw G32+D32+(new_app_base shr 16)+0xF; app_data_l: - dw 0xFFFF - dw 0 - db 0 - db drw3 - dw G32+D32+(new_app_base shr 16)+0xF; + dw 0xFFFF + dw 0 + db 0 + db drw3 + dw G32+D32+(new_app_base shr 16)+0xF; ; ------------- PCI BIOS ------------------ pci_code_32: - dw 0 ;lim 0-15 - dw 0 ;base 0-15 - db 0 ;base 16-23 - db cpl0 ;type - db D32 ;lim 16-19+props - db 0 ;base 24-31 + dw 0 ;lim 0-15 + dw 0 ;base 0-15 + db 0 ;base 16-23 + db cpl0 ;type + db D32 ;lim 16-19+props + db 0 ;base 24-31 pci_data_32: - dw 0 ;lim 0-15 - dw 0 ;base 0-15 - db 0 ;base 16-23 - db dpl0 ;type - db D32 ;lim 16-19+props - db 0 ;base 24-31 + dw 0 ;lim 0-15 + dw 0 ;base 0-15 + db 0 ;base 16-23 + db dpl0 ;type + db D32 ;lim 16-19+props + db 0 ;base 24-31 ; --------------- APM --------------------- apm_code_32: - dw 0x0f ; limit 64kb - db 0, 0, 0 - dw 11010000b *256 +10011010b - db 0x00 + dw 0x0f ; limit 64kb + db 0, 0, 0 + dw 11010000b *256 +10011010b + db 0x00 apm_code_16: - dw 0x0f - db 0, 0, 0 - dw 10010000b *256 +10011010b - db 0x00 + dw 0x0f + db 0, 0, 0 + dw 10010000b *256 +10011010b + db 0x00 apm_data_16: - dw 0x0f - db 0, 0, 0 - dw 10010000b *256 +10010010b - db 0x00 + dw 0x0f + db 0, 0, 0 + dw 10010000b *256 +10010010b + db 0x00 ; ----------------------------------------- graph_data_l: - dw 0x7ff - dw 0x0000 - db 0x00 - dw 11010000b *256 +11110010b - db 0x00 + dw 0x7ff + dw 0x0000 + db 0x00 + dw 11010000b *256 +11110010b + db 0x00 tss0_l: - dw TSS_SIZE-1 - dw tss and 0xFFFF - db (tss shr 16) and 0xFF - db 10001001b - dw (tss shr 16) and 0xFF00 + dw TSS_SIZE-1 + dw tss and 0xFFFF + db (tss shr 16) and 0xFF + db 10001001b + dw (tss shr 16) and 0xFF00 endofcode: gdte: align 16 -cur_saved_data rb 4096 -fpu_data: rb 512 +cur_saved_data rb 4096 +fpu_data: rb 512 ; device irq owners -irq_owner rd 16 ; process id +irq_owner rd 16 ; process id ; on irq read ports -irq00read rd 16 -irq01read rd 16 -irq02read rd 16 -irq03read rd 16 -irq04read rd 16 -irq05read rd 16 -irq06read rd 16 -irq07read rd 16 -irq08read rd 16 -irq09read rd 16 -irq10read rd 16 -irq11read rd 16 -irq12read rd 16 -irq13read rd 16 -irq14read rd 16 -irq15read rd 16 +irq00read rd 16 +irq01read rd 16 +irq02read rd 16 +irq03read rd 16 +irq04read rd 16 +irq05read rd 16 +irq06read rd 16 +irq07read rd 16 +irq08read rd 16 +irq09read rd 16 +irq10read rd 16 +irq11read rd 16 +irq12read rd 16 +irq13read rd 16 +irq14read rd 16 +irq15read rd 16 -irq_tab rd 16 +irq_tab rd 16 -mem_block_map rb 512 -event_map rb 64 -mem_block_list rd 64 +mem_block_map rb 512 +mem_block_list rd 64 large_block_list rd 31 -mem_block_mask rd 2 +mem_block_mask rd 2 large_block_mask rd 1 mem_used.fd rd 1 mem_used.bk rd 1 -mem_block_arr rd 1 +mem_block_arr rd 1 mem_block_start rd 1 -mem_block_end rd 1 +mem_block_end rd 1 heap_mutex rd 1 heap_size rd 1 @@ -315,143 +314,139 @@ mst MEM_STATE page_start rd 1 page_end rd 1 -events rd 1 -event_start rd 1 -event_end rd 1 -event_uid rd 1 -sys_page_map rd 1 -os_stack_seg rd 1 +sys_page_map rd 1 +os_stack_seg rd 1 -srv.fd rd 1 -srv.bk rd 1 +srv.fd rd 1 +srv.bk rd 1 -scr_width rd 1 -scr_height rd 1 +scr_width rd 1 +scr_height rd 1 -create_cursor rd 1 +create_cursor rd 1 select_hw_cursor rd 1 -set_hw_cursor rd 1 -hw_restore rd 1 +set_hw_cursor rd 1 +hw_restore rd 1 -def_cursor rd 1 -current_cursor rd 1 -hw_cursor rd 1 -cur_def_interl rd 1 -cur_saved_base rd 1 +def_cursor rd 1 +current_cursor rd 1 +hw_cursor rd 1 +cur_def_interl rd 1 +cur_saved_base rd 1 cur_saved_interl rd 1 -cur_saved_w rd 1 -cur_saved_h rd 1 +cur_saved_w rd 1 +cur_saved_h rd 1 -ipc_tmp rd 1 -ipc_pdir rd 1 -ipc_ptab rd 1 +ipc_tmp rd 1 +ipc_pdir rd 1 +ipc_ptab rd 1 -proc_mem_map rd 1 -proc_mem_pdir rd 1 -proc_mem_tab rd 1 +proc_mem_map rd 1 +proc_mem_pdir rd 1 +proc_mem_tab rd 1 -tmp_task_pdir rd 1 -tmp_task_ptab rd 1 +tmp_task_pdir rd 1 +tmp_task_ptab rd 1 -default_io_map rd 1 +default_io_map rd 1 -LFBSize rd 1 +LFBSize rd 1 -stall_mcs rd 1 -current_slot rd 1 +stall_mcs rd 1 +current_slot rd 1 ; status -hd1_status rd 1 ; 0 - free : other - pid +hd1_status rd 1 ; 0 - free : other - pid application_table_status rd 1 ; 0 - free : other - pid ; device addresses -mididp rd 1 -midisp rd 1 +mididp rd 1 +midisp rd 1 -cdbase rd 1 -cdid rd 1 +cdbase rd 1 +cdid rd 1 -hdbase rd 1 ; for boot 0x1f0 -hdid rd 1 -hdpos rd 1 ; for boot 0x1 -fat32part rd 1 ; for boot 0x1 -cdpos rd 1 +hdbase rd 1 ; for boot 0x1f0 +hdid rd 1 +hdpos rd 1 ; for boot 0x1 +fat32part rd 1 ; for boot 0x1 +cdpos rd 1 ;CPUID information -cpu_vendor rd 3 -cpu_sign rd 1 -cpu_info rd 1 -cpu_caps rd 4 +cpu_vendor rd 3 +cpu_sign rd 1 +cpu_info rd 1 +cpu_caps rd 4 -pg_data PG_DATA -heap_test rd 1 +pg_data PG_DATA +heap_test rd 1 -buttontype rd 1 +buttontype rd 1 windowtypechanged rd 1 -hd_entries rd 1 ;unused ? 0xfe10 +hd_entries rd 1 ;unused ? 0xfe10 ;* start code - Mario79 -mouse_active rd 1 -mouse_pause rd 1 +mouse_active rd 1 +mouse_pause rd 1 MouseTickCounter rd 1 ;* end code - Mario79 -img_background rd 1 -mem_BACKGROUND rd 1 +img_background rd 1 +mem_BACKGROUND rd 1 wraw_bacground_select rb 1 cache_ide0: -cache_ide0_pointer rd 1 -cache_ide0_size rd 1 ; not use +cache_ide0_pointer rd 1 +cache_ide0_size rd 1 ; not use cache_ide0_data_pointer rd 1 cache_ide0_system_data_size rd 1 ; not use cache_ide0_appl_data_size rd 1 ; not use -cache_ide0_system_data rd 1 -cache_ide0_appl_data rd 1 +cache_ide0_system_data rd 1 +cache_ide0_appl_data rd 1 cache_ide0_system_sad_size rd 1 cache_ide0_appl_sad_size rd 1 cache_ide0_search_start rd 1 cache_ide0_appl_search_start rd 1 cache_ide1: -cache_ide1_pointer rd 1 -cache_ide1_size rd 1 ; not use +cache_ide1_pointer rd 1 +cache_ide1_size rd 1 ; not use cache_ide1_data_pointer rd 1 cache_ide1_system_data_size rd 1 ; not use cache_ide1_appl_data_size rd 1 ; not use -cache_ide1_system_data rd 1 -cache_ide1_appl_data rd 1 +cache_ide1_system_data rd 1 +cache_ide1_appl_data rd 1 cache_ide1_system_sad_size rd 1 cache_ide1_appl_sad_size rd 1 cache_ide1_search_start rd 1 cache_ide1_appl_search_start rd 1 cache_ide2: -cache_ide2_pointer rd 1 -cache_ide2_size rd 1 ; not use +cache_ide2_pointer rd 1 +cache_ide2_size rd 1 ; not use cache_ide2_data_pointer rd 1 cache_ide2_system_data_size rd 1 ; not use cache_ide2_appl_data_size rd 1 ; not use -cache_ide2_system_data rd 1 -cache_ide2_appl_data rd 1 +cache_ide2_system_data rd 1 +cache_ide2_appl_data rd 1 cache_ide2_system_sad_size rd 1 cache_ide2_appl_sad_size rd 1 cache_ide2_search_start rd 1 cache_ide2_appl_search_start rd 1 cache_ide3: -cache_ide3_pointer rd 1 -cache_ide3_size rd 1 ; not use +cache_ide3_pointer rd 1 +cache_ide3_size rd 1 ; not use cache_ide3_data_pointer rd 1 cache_ide3_system_data_size rd 1 ; not use cache_ide3_appl_data_size rd 1 ; not use -cache_ide3_system_data rd 1 -cache_ide3_appl_data rd 1 +cache_ide3_system_data rd 1 +cache_ide3_appl_data rd 1 cache_ide3_system_sad_size rd 1 cache_ide3_appl_sad_size rd 1 cache_ide3_search_start rd 1 @@ -463,12 +458,11 @@ cd_appl_data rb 1 ; 0 = system cache, 1 - application cache lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled pci_access_enabled rd 1 ; 0 = disabled , 1 = enabled -timer_ticks_enable rb 1 ; for cd driver +timer_ticks_enable rb 1 ; for cd driver -NumBiosDisks rd 1 -BiosDisksData rb 200h -BiosDiskCaches rb 80h*(cache_ide1-cache_ide0) +NumBiosDisks rd 1 +BiosDisksData rb 200h +BiosDiskCaches rb 80h*(cache_ide1-cache_ide0) BiosDiskPartitions rd 80h IncludeUGlobals - diff --git a/kernel/trunk/gui/event.inc b/kernel/trunk/gui/event.inc index 4badc179bf..342beab5ce 100644 --- a/kernel/trunk/gui/event.inc +++ b/kernel/trunk/gui/event.inc @@ -7,695 +7,478 @@ $Revision$ +uglobal +align 4 + event_start dd ? + event_end dd ? + event_uid dd 0 +endg +EV_SPACE = 512 +FreeEvents = event_start-EVENT.fd ; "виртуальный" event, используются только поля: + ; FreeEvents.fd=event_start и FreeEvents.bk=event_end +align 4 +init_events: ;; used from kernel.asm + stdcall kernel_alloc,EV_SPACE*EVENT.size + or eax,eax + jz .fail + ; eax - current event, ebx - previos event below + mov ecx,EV_SPACE ; current - in allocated space + mov ebx,FreeEvents ; previos - начало списка + push ebx ; оно же и конец потом будет + @@: mov [ebx+EVENT.fd],eax + mov [eax+EVENT.bk],ebx + mov ebx,eax ; previos <- current + add eax,EVENT.size ; new current + loop @b + pop eax ; вот оно концом и стало + mov [ebx+EVENT.fd],eax + mov [eax+EVENT.bk],ebx +.fail: ret + +EVENT_WATCHED equ 0x10000000 ;бит 28 +EVENT_SIGNALED equ 0x20000000 ;бит 29 +MANUAL_RESET equ 0x40000000 ;бит 30 +MANUAL_DESTROY equ 0x80000000 ;бит 31 align 4 -init_events: - stdcall kernel_alloc, 512*EVENT_SIZE - mov [events], eax - xor eax, eax - mov [event_uid], eax - not eax - mov edi, event_map - mov [event_start], edi - mov ecx, 64/4 - cld - rep stosd - mov [event_end], edi - ret +create_event: ;; EXPORT use +;info: +; Переносим EVENT из списка FreeEvents в список ObjList текущего слота +; EVENT.state устанавливаем из ecx, EVENT.code косвенно из esi (если esi<>0) +;param: +; esi - event data +; ecx - flags +;retval: +; eax - event (=0 => fail) +; edx - uid +;scratched: ebx,ecx,esi,edi + mov ebx,[current_slot] + add ebx,APP_OBJ_OFFSET + mov edx,[TASK_BASE] + mov edx,[edx+TASKDATA.pid] + pushfd + cli + +set_event: ;; INTERNAL use !!! don't use for Call +;info: +; Берем новый event из FreeEvents, заполняем его поля, как указано в ecx,edx,esi +; и устанавливаем в список, указанный в ebx. +; Возвращаем сам event (в eax), и его uid (в edx) +;param: +; ebx - start-chain "virtual" event for entry new event Right of him +; ecx - flags (copied to EVENT.state) +; edx - pid (copied to EVENT.pid) +; esi - event data (copied to EVENT.code indirect, =0 => skip) +;retval: +; eax - event (=0 => fail) +; edx - uid +;scratched: ebx,ecx,esi,edi + mov eax,[event_start] + cmp eax,FreeEvents + jne @f ; not empty ??? + pushad + call init_events + popad + jz RemoveEventTo.break ; POPF+RET + @@: mov [eax+EVENT.magic],'EVNT' + mov [eax+EVENT.destroy],destroy_event.internal + mov [eax+EVENT.state],ecx + mov [eax+EVENT.pid],edx + inc [event_uid] + Mov [eax+EVENT.id],edx,[event_uid] + or esi,esi + jz RemoveEventTo + lea edi,[eax+EVENT.code] + mov ecx,EVENT.codesize/4 + cld + rep movsd + +RemoveEventTo: ;; INTERNAL use !!! don't use for Call +;param: +; eax - указатель на event, КОТОРЫЙ вставляем +; ebx - указатель на event, ПОСЛЕ которого вставляем +;scratched: ebx,ecx + mov ecx,eax ; ecx=eax=Self, ebx=NewLeft + xchg ecx,[ebx+EVENT.fd] ; NewLeft.fd=Self, ecx=NewRight + mov [ecx+EVENT.bk],eax ; NewRight.bk=Self + xchg ebx,[eax+EVENT.bk] ; Self.bk=NewLeft, ebx=OldLeft + xchg ecx,[eax+EVENT.fd] ; Self.fd=NewRight, ecx=OldRight + mov [ebx+EVENT.fd],ecx ; OldLeft.fd=OldRight + mov [ecx+EVENT.bk],ebx ; OldRight.bk=OldLeft +.break: popfd + ret align 4 -proc alloc_event - - pushfd - cli - mov ebx, [event_start] - mov ecx, [event_end] -.l1: - bsf eax,[ebx] - jnz .found - add ebx,4 - cmp ebx, ecx - jb .l1 - popfd - xor eax,eax - ret -.found: - btr [ebx], eax - mov [event_start],ebx - inc [event_uid] - - sub ebx, event_map - lea eax,[eax+ebx*8] - - lea ebx, [eax+eax*4] - shl eax,5 - lea eax,[eax+ebx*4] ;eax*=52 (EVENT_SIZE) - add eax, [events] - mov ebx, [event_uid] - popfd - ret -endp +NotDummyTest: ;; INTERNAL use (not returned for fail !!!) + pop edi + call DummyTest ; not returned for fail !!! + mov ebx,eax + mov eax,[ebx+EVENT.pid] + push edi +.small: ; криво как-то... + pop edi + pushfd + cli + call pid_to_slot ; seved all registers (eax - retval) + shl eax,8 + jz RemoveEventTo.break ; POPF+RET + jmp edi ; штатный возврат align 4 -free_event: - sub eax, [events] - mov ecx, EVENT_SIZE - mov ebx, event_map - cdq - div ecx +raise_event: ;; EXPORT use +;info: +; Устанавливаем данные EVENT.code +; Если там флаг EVENT_SIGNALED уже активен - больше ничего +; Иначе: этот флаг взводится, за исключением случая наличия флага EVENT_WATCHED в edx +; В этом случае EVENT_SIGNALED взводится лишь при наличие EVENT_WATCHED в самом событии +;param: +; eax - event +; ebx - uid (for Dummy testing) +; edx - flags +; esi - event data (=0 => skip) +;scratched: ebx,ecx,esi,edi + call NotDummyTest ; not returned for fail !!! + or esi,esi + jz @f + lea edi,[ebx+EVENT.code] + mov ecx,EVENT.codesize/4 + cld + rep movsd + @@: + test byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24 + jnz RemoveEventTo.break ; POPF+RET + bt edx, 28 ;EVENT_WATCHED + jnc @f + test byte[ebx+EVENT.state+3], EVENT_WATCHED shr 24 + jz RemoveEventTo.break ; POPF+RET + @@: + or byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24 + add eax,SLOT_BASE+APP_EV_OFFSET + xchg eax,ebx + jmp RemoveEventTo - pushfd - cli - bts [ebx], eax - shr eax, 3 - and eax, not 3 - add eax, ebx - cmp [event_start], eax - ja @f - popfd - ret -@@: - mov [event_start], eax - popfd - ret - -EVENT_WATCHED equ 0x10000000 -EVENT_SIGNALED equ 0x20000000 -MANUAL_RESET equ 0x40000000 -MANUAL_DESTROY equ 0x80000000 - - -; param -; eax= event data -; ebx= flags +align 4 +clear_event: ;; EXPORT use +;info: ; -; retval -; eax= event -; edx= id - -create_event: - .flags equ esp+4 - .data equ esp - - push ebx - push eax - - call alloc_event - test eax, eax - jz .fail - - mov [eax+APPOBJ.magic], 'EVNT' - mov [eax+APPOBJ.destroy], destroy_event.internal - mov [eax+EVENT.id], ebx - - mov ebx, [CURRENT_TASK] - shl ebx, 5 - mov ebx, [CURRENT_TASK+ebx+4] - mov [eax+APPOBJ.pid], ebx - mov edx, [.flags] - mov [eax+EVENT.state], edx - - mov esi, [.data] - test esi, esi - jz @F - lea edi, [eax+EVENT.code] - mov ecx, 6 - cld - rep movsd -@@: - mov ecx, [current_slot] - add ecx, APP_OBJ_OFFSET - - pushfd - cli - mov edx, [ecx+APPOBJ.fd] - mov [eax+APPOBJ.fd], edx - mov [eax+APPOBJ.bk], ecx - mov [ecx+APPOBJ.fd], eax - mov [edx+APPOBJ.bk], eax - popfd - mov edx, [eax+EVENT.id] -.fail: - add esp, 8 - ret - -restore .flags -restore .data - -; param -; eax= event -; ebx= id - -destroy_event: - - cmp [eax+APPOBJ.magic], 'EVNT' - jne .fail - cmp [eax+EVENT.id], ebx - jne .fail -.internal: - mov ebx, [eax+APPOBJ.fd] - mov ecx, [eax+APPOBJ.bk] - mov [ebx+APPOBJ.bk], ecx - mov [ecx+APPOBJ.fd], ebx -.force: - xor edx, edx ;clear common header - mov [eax], edx - mov [eax+4], edx - mov [eax+8], edx - mov [eax+12], edx - mov [eax+16], edx - - call free_event ;release object memory -.fail: - ret +;param: +; eax - event +; ebx - uid (for Dummy testing) +;scratched: ebx,ecx + call NotDummyTest ; not returned for fail !!! + add eax,SLOT_BASE+APP_OBJ_OFFSET + and byte[ebx+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24) + xchg eax,ebx + jmp RemoveEventTo align 4 -proc send_event stdcall pid:dword, event:dword - locals - slot dd ? - endl - - mov eax, [pid] - call pid_to_slot - test eax, eax - jz .fail - - shl eax, 8 - cmp [SLOT_BASE+eax+APPDATA.ev_count], 32 - ja .fail - - mov [slot], eax - - call alloc_event - test eax, eax - jz .fail - - lea edi, [eax+EVENT.code] - mov ecx, 6 - mov esi, [event] - cld - rep movsd - - mov ecx, [slot] - add ecx, SLOT_BASE+APP_EV_OFFSET - - mov [eax+APPOBJ.magic], 'EVNT' - mov [eax+APPOBJ.destroy], destroy_event - mov ebx, [pid] - mov [eax+APPOBJ.pid], ebx - mov [eax+EVENT.state], EVENT_SIGNALED - - pushfd - cli ;insert event into - mov edx, [ecx+APPOBJ.fd] ;events list - mov [eax+APPOBJ.fd], edx ;and set events flag - mov [eax+APPOBJ.bk], ecx - mov [ecx+APPOBJ.fd], eax - mov [edx+APPOBJ.bk], eax - inc [ecx+APPDATA.ev_count-APP_EV_OFFSET] - or [ecx+APPDATA.event_mask-APP_EV_OFFSET], EVENT_EXTENDED - popfd -.fail: - ret -endp - -; timeout ignored +send_event: ;; EXPORT use +;info: +; Создает новый EVENT (вытаскивает из списка FreeEvents) в списке EventList +; целевого слота (eax=pid), с данными из esi косвенно, и state=EVENT_SIGNALED +;param: +; eax - slots pid, to sending new event +; esi - pointer to sending data (in code field of new event) +;retval: +; eax - event (=0 => fail) +; edx - uid +;warning: +; may be used as CDECL with such prefix... +; mov esi,[esp+8] +; mov eax,[esp+4] +; but not as STDCALL :( +;scratched: ebx,ecx,esi,edi + mov edx,eax + call NotDummyTest.small ; not returned for fail !!! + lea ebx,[eax+SLOT_BASE+APP_EV_OFFSET] + mov ecx,EVENT_SIGNALED + jmp set_event align 4 -proc get_event_ex stdcall, p_ev:dword, timeout:dword +DummyTest: ;; INTERNAL use (not returned for fail !!!) +;param: +; eax - event +; ebx - uid (for Dummy testing) + cmp [eax+EVENT.magic],'EVNT' + jne @f + cmp [eax+EVENT.id],ebx + je .ret + @@: pop eax + xor eax,eax +.ret: ret -.wait: - mov edx,[current_slot] -; cmp [SLOT_BASE+edx+APPDATA.ev_count], 0 -; je .switch - - add edx, APP_EV_OFFSET - - mov eax, [edx+APPOBJ.fd] - cmp eax, edx - je .switch - - lea esi, [eax+EVENT.code] - mov edi, [p_ev] ;copy event data - mov ecx, 6 - cld - rep movsd - - and dword [edi-24], 0xFF00FFFF ;clear priority field - ; - test [eax+EVENT.state], MANUAL_RESET - jnz .done - - pushfd - cli ;remove event from events - mov ebx, [eax+APPOBJ.fd] ;list (reset event) - mov ecx, [eax+APPOBJ.bk] ;and clear events flag - mov [ebx+APPOBJ.bk], ecx ;if no active events - mov [ecx+APPOBJ.fd], ebx - - and [eax+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED) - - dec [edx+APPDATA.ev_count-APP_EV_OFFSET] - jnz @F - and [edx+APPDATA.event_mask-APP_EV_OFFSET], not EVENT_EXTENDED -@@: - popfd - - test [eax+EVENT.state], MANUAL_DESTROY - jz .destroy - - add edx, (APP_OBJ_OFFSET-APP_EV_OFFSET) - - pushfd - cli - mov ebx, [edx+APPOBJ.fd] ;insert event into - mov [eax+APPOBJ.fd], ebx ;objects list - mov [eax+APPOBJ.bk], edx - mov [edx+APPOBJ.fd], eax - mov [ebx+APPOBJ.bk], eax - popfd -.done: - ret - -.destroy: - call destroy_event.force - ret -.switch: - mov eax, [TASK_BASE] - mov [eax+TASKDATA.state], byte 5 - call change_task - jmp .wait -endp - -; param -; eax= event -; ebx= id align 4 -wait_event: - .event equ esp - push eax -.wait: - cmp [eax+APPOBJ.magic], 'EVNT' - jne .done - cmp [eax+EVENT.id], ebx - jne .done - - test [eax+EVENT.state], EVENT_SIGNALED - jz .switch - - test [eax+EVENT.state], MANUAL_RESET - jnz .done - - mov edx,[current_slot] - - pushfd - cli ;remove event from events - mov ebx, [eax+APPOBJ.fd] ;list (reset event) - mov ecx, [eax+APPOBJ.bk] ;and clear events flag - mov [ebx+APPOBJ.bk], ecx ;if no active events - mov [ecx+APPOBJ.fd], ebx - dec [edx+APPDATA.ev_count] - jnz @F - and [edx+APPDATA.event_mask], not EVENT_EXTENDED -@@: - and [eax+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED) - popfd - - test [eax+EVENT.state], MANUAL_DESTROY - jz .destroy - - add edx, APP_OBJ_OFFSET - - pushfd - cli - mov ecx, [edx+APPOBJ.fd] ;insert event into - mov [eax+APPOBJ.fd], ecx ;objects list - mov [eax+APPOBJ.bk], edx - mov [edx+APPOBJ.fd], eax - mov [ecx+APPOBJ.bk], eax - popfd -.done: - add esp, 4 - ret -.destroy: - call destroy_event.force - add esp, 4 - ret -.switch: - or [eax+EVENT.state], EVENT_WATCHED - mov eax, [TASK_BASE] - mov [eax+TASKDATA.state], byte 5 - call change_task - mov eax, [.event] - jmp .wait -restore .event - -; param -; eax= event -; ebx= id -; ecx= flags -; edx= event data - -raise_event: - .event equ esp - push eax - - cmp [eax+APPOBJ.magic], 'EVNT' - jne .fail - cmp [eax+EVENT.id], ebx - jne .fail - - mov eax, [eax+APPOBJ.pid] - call pid_to_slot - test eax, eax - jz .fail - - mov esi, edx - test esi, esi - mov edx, [.event] - jz @F - - push ecx - lea edi, [edx+EVENT.code] - mov ecx, 6 - cld - rep movsd - pop ecx -@@: - test [edx+EVENT.state], EVENT_SIGNALED - jnz .done - - test ecx, EVENT_WATCHED - jz @F - test [edx+EVENT.state], EVENT_WATCHED - jz .done -@@: - shl eax, 8 - add eax, SLOT_BASE+APP_EV_OFFSET - - pushfd - cli - mov ebx, [edx+APPOBJ.fd] - mov ecx, [edx+APPOBJ.bk] - mov [ebx+APPOBJ.bk], ecx - mov [ecx+APPOBJ.fd], ebx - - mov ecx, [eax+APPOBJ.fd] - mov [edx+APPOBJ.fd], ecx - mov [edx+APPOBJ.bk], eax - mov [eax+APPOBJ.fd], edx - mov [ecx+APPOBJ.bk], edx - or [edx+EVENT.state], EVENT_SIGNALED - - inc [eax+APPDATA.ev_count-APP_EV_OFFSET] - or [eax+APPDATA.event_mask-APP_EV_OFFSET], EVENT_EXTENDED - popfd -.fail: -.done: - add esp, 4 - ret -restore .event - -; param -; eax= event -; ebx= id -align 4 -clear_event: - .event equ esp - push eax - - cmp [eax+APPOBJ.magic], 'EVNT' - jne .fail - cmp [eax+EVENT.id], ebx - jne .fail - - mov eax, [eax+APPOBJ.pid] - call pid_to_slot - test eax, eax - jz .fail - - shl eax, 8 - add eax, SLOT_BASE+APP_EV_OFFSET - mov edx, [.event] - pushfd - cli ;remove event from events - mov ebx, [edx+APPOBJ.fd] ;list (reset event) - mov ecx, [edx+APPOBJ.bk] ;and clear events flag - mov [ebx+APPOBJ.bk], ecx ;if no active events - mov [ecx+APPOBJ.fd], ebx - - and [edx+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED) - - dec [eax+APPDATA.ev_count-APP_EV_OFFSET] - jnz @F - and [eax+APPDATA.event_mask-APP_EV_OFFSET], not EVENT_EXTENDED -@@: - add eax, (APP_OBJ_OFFSET-APP_EV_OFFSET) - - mov ecx, [eax+APPOBJ.fd] ;insert event into - mov [edx+APPOBJ.fd], ecx ;objects list - mov [edx+APPOBJ.bk], eax - mov [eax+APPOBJ.fd], edx - mov [ecx+APPOBJ.bk], edx - popfd -.fail: -.done: - add esp, 4 - ret -restore .event - -sys_getevent: - - call get_event_for_app - mov [esp + 32],eax - ret - -sys_waitforevent: - or ebx, 0xFFFFFFFF ; infinite timeout - jmp @f - -sys_wait_event_timeout: - add ebx, [timer_ticks] -@@: - mov eax, [current_slot] - mov [eax + APPDATA.wait_timeout], ebx - call get_event_for_app - test eax, eax - jnz eventoccur - - mov eax, [TASK_BASE] - mov [eax+TASKDATA.state], byte 5 +Wait_events: + or ebx,-1 ; infinite timeout +Wait_events_ex: +;info: +; Ожидание "абстрактного" события через перевод слота в 5-ю позицию. +; Абстрактность заключена в том, что факт события определяется функцией APPDATA.wait_test, +; которая задается клиентом и может быть фактически любой. +; Это позволяет shed-у надежно определить факт события, и не совершать "холостых" переключений, +; предназначенных для разборок типа "свой/чужой" внутри задачи. +;param: +; edx - wait_test, клиентская ф-я тестирования (адрес кода) +; ecx - wait_param, дополнительный параметр, возможно необходимый для [wait_test] +; ebx - wait_timeout +;retval: +; eax - результат вызова [wait_test] (=0 => timeout) +;scratched: esi + mov esi,[current_slot] + mov [esi+APPDATA.wait_param],ecx + pushad + mov ebx,esi;пока это вопрос, чего куды сувать.......... + pushfd ; это следствие общей концепции: пусть ф-я тестирования имеет + cli ; право рассчитывать на закрытые прерывания, как при вызове из shed + call edx + popfd + mov [esp+28],eax + popad + or eax,eax + jnz @f ;RET + mov [esi+APPDATA.wait_test],edx + mov [esi+APPDATA.wait_timeout],ebx + Mov [esi+APPDATA.wait_begin],eax,[timer_ticks] + mov eax,[TASK_BASE] + mov [eax+TASKDATA.state], 5 call change_task + mov eax,[esi+APPDATA.wait_param] + @@: ret - mov eax, [event_sched] -eventoccur: - mov [esp+32], eax - ret +align 4 +wait_event: ;; EXPORT use +;info: +; Ожидание флага EVENT_SIGNALED в совершенно конкретном Event +; (устанавливаемого, надо полагать, через raise_event) +; При активном флаге MANUAL_RESET - больше ничего +; Иначе: флаги EVENT_SIGNALED и EVENT_WATCHED у полученного события сбрасываются, +; и, при активном MANUAL_DESTROY - перемещается в список ObjList текущего слота, +; а при не активном - уничтожается штатно (destroy_event.internal) +;param: +; eax - event +; ebx - uid (for Dummy testing) +;scratched: ecx,edx,esi + call DummyTest + mov ecx,eax ; wait_param + mov edx, get_event_alone + call Wait_events ; timeout ignored + jmp wait_finish -sys_sendwindowmsg: - dec eax - jnz .ret - cmp ebx, 3 - jz .sendbtn - cmp ebx, 2 - jnz .ret -.sendkey: - pushf +align 4 +get_event_ex: ;; f68:14 +;info: +; Ожидание любого события в очереди EventList текущего слота +; Данные события code - копируются в память приложения (косвенно по edi) +; При активном флаге MANUAL_RESET - больше ничего +; Иначе: флаги EVENT_SIGNALED и EVENT_WATCHED у полученного события сбрасываются, +; и, при активном MANUAL_DESTROY - перемещается в список ObjList текущего слота, +; а при не активном - уничтожается штатно (destroy_event.internal) +;param: +; edi - адрес в коде приложения для копирования данных из EVENT.code +;retval: +; eax - собственно EVENT (будем называть это его хэндлом) +;scratched: ebx,ecx,edx,esi,edi + mov edx, get_event_queue + call Wait_events ; timeout ignored + lea esi,[eax+EVENT.code] + mov ecx,EVENT.codesize/4 + cld + rep movsd + mov [edi-EVENT.codesize+2],cl ;clear priority field +wait_finish: + test byte[eax+EVENT.state+3], MANUAL_RESET shr 24 + jnz get_event_queue.ret ; RET + and byte[ebx+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24) + test byte[eax+EVENT.state+3], MANUAL_DESTROY shr 24 + jz destroy_event.internal + mov ebx,[current_slot] + add ebx,APP_OBJ_OFFSET + pushfd cli - movzx eax, byte [KEY_COUNT] - cmp al, 120 - jae .overflow - inc eax - mov [KEY_COUNT], al - mov [KEY_COUNT+eax], cl - jmp .ok -.overflow: - popf - mov dword [esp+36], 1 - ret + jmp RemoveEventTo + +align 4 +destroy_event: ;; EXPORT use +;info: +; Переносим EVENT в список FreeEvents, чистим поля magic,destroy,pid,id +;param: +; eax - event +; ebx - uid (for Dummy testing) +;retval: +; eax - адрес объекта EVENT (=0 => fail) +;scratched: ebx,ecx + call DummyTest ; not returned for fail !!! +.internal: + xor ecx,ecx ; clear common header + pushfd + cli + mov [eax+EVENT.magic],ecx + mov [eax+EVENT.destroy],ecx + mov [eax+EVENT.pid],ecx + mov [eax+EVENT.id],ecx + mov ebx,FreeEvents + jmp RemoveEventTo + +align 4 +get_event_queue: +;info: +; клиентская ф-я тестирования для get_event_ex +;warning: +; -don't use [TASK_BASE],[current_slot],[CURRENT_TASK] - it is not for your slot +; -may be assumed, that interrupt are disabled +; -it is not restriction for scratched registers +;param: +; ebx - адрес APPDATA слота тестирования +;retval: +; eax - адрес объекта EVENT (=0 => fail) + add ebx,APP_EV_OFFSET + mov eax,[ebx+APPOBJ.bk] ; выбираем с конца, по принципу FIFO + cmp eax,ebx ; empty ??? + je get_event_alone.ret0 +.ret: ret + +align 4 +get_event_alone: +;info: +; клиентская ф-я тестирования для wait_event +;warning: +; -don't use [TASK_BASE],[current_slot],[CURRENT_TASK] - it is not for your slot +; -may be assumed, that interrupt are disabled +; -it is not restriction for scratched registers +;param: +; ebx - адрес APPDATA слота тестирования +;retval: +; eax - адрес объекта EVENT (=0 => fail) + mov eax,[ebx+APPDATA.wait_param] + test byte[eax+EVENT.state+3], EVENT_SIGNALED shr 24 + jnz .ret + or byte[eax+EVENT.state+3], EVENT_WATCHED shr 24 +.ret0: xor eax,eax ; NO event!!! +.ret: ret + +align 4 +sys_sendwindowmsg: ;; f72 + dec ebx + jnz .ret ;subfunction==1 ? + pushfd + cli + sub ecx,2 + je .sendkey + loop .retf .sendbtn: - pushf - cli - cmp byte [BTN_COUNT], 0 - jnz .overflow - mov byte [BTN_COUNT], 1 - mov [BTN_BUFF], ecx -.ok: - popf - and dword [esp+36], 0 -.ret: + cmp byte[BTN_COUNT],1 + jae .result ;overflow + inc byte[BTN_COUNT] + mov [BTN_BUFF],edx + jmp .result +.sendkey: + movzx eax,byte[KEY_COUNT] + cmp al,120 + jae .result ;overflow + inc byte[KEY_COUNT] + mov [KEY_COUNT+1+eax],dl +.result: + setae byte[esp+36] ;считаем, что исходно: dword[esp+36]==72 +.retf: popfd +.ret: ret + +align 4 +sys_getevent: ;; f11 + mov ebx,[current_slot] ;пока это вопрос, чего куды сувать.......... + pushfd ; это следствие общей концепции: пусть ф-я тестирования имеет + cli ; право рассчитывать на закрытые прерывания, как при вызове из shed + call get_event_for_app + popfd + mov [esp+32],eax ret -get_event_for_app: +align 4 +sys_waitforevent: ;; f10 + or ebx,-1 ; infinite timeout +sys_wait_event_timeout: ;; f23 + mov edx,get_event_for_app + call Wait_events_ex + mov [esp+32],eax + ret - pushad - - mov edi,[TASK_BASE] ; WINDOW REDRAW - test [edi+TASKDATA.event_mask], 1 - jz no_eventoccur1 - ;mov edi,[TASK_BASE] - cmp [edi-twdw+WDATA.fl_redraw],byte 0 - je no_eventoccur1 - popad - mov eax,1 - ret - no_eventoccur1: - - ;mov edi,[TASK_BASE] ; KEY IN BUFFER - test [edi+TASKDATA.event_mask],dword 2 - jz no_eventoccur2 - mov ecx, [CURRENT_TASK] - movzx edx,word [WIN_STACK+ecx*2] - mov eax, [TASK_COUNT] - cmp eax,edx - jne no_eventoccur2x - cmp [KEY_COUNT],byte 0 - je no_eventoccur2x - eventoccur2: - popad - mov eax,2 - ret - no_eventoccur2x: - mov eax, hotkey_buffer -@@: - cmp [eax], ecx - jz eventoccur2 - add eax, 8 - cmp eax, hotkey_buffer+120*8 +align 4 +get_event_for_app: ;; used from f10,f11,f23 +;info: +; клиентская ф-я тестирования для приложений (f10,f23) +;warning: +; -don't use [TASK_BASE],[current_slot],[CURRENT_TASK] - it is not for your slot +; -may be assumed, that interrupt are disabled +; -it is not restriction for scratched registers +;param: +; ebx - адрес APPDATA слота тестирования +;retval: +; eax - номер события (=0 => no events) + movzx edi,bh ; bh is assumed as [CURRENT_TASK] + shl edi,5 + add edi,CURRENT_TASK ; edi is assumed as [TASK_BASE] + mov ecx,[edi+TASKDATA.event_mask] +.loop: ; пока не исчерпаем все биты маски + bsr eax,ecx ; находим ненулевой бит маски (31 -> 0) + jz .no_events ; исчерпали все биты маски, но ничего не нашли ??? + btr ecx,eax ; сбрасываем проверяемый бит маски + ; переходим на обработчик этого (eax) бита + cmp eax,16 + jae .IRQ ; eax=[16..31]=retvals, events irq0..irq15 + cmp eax,9 + jae .loop ; eax=[9..15], ignored + cmp eax,3 + je .loop ; eax=3, ignored + ja .FlagAutoReset ; eax=[4..8], retvals=eax+1 + cmp eax,1 + jae .BtKy ; eax=[1,2], retvals=eax+1 +.WndRedraw: ; eax=0, retval WndRedraw=1 + cmp [edi-twdw+WDATA.fl_redraw],al ;al==0 + jne .result + jmp .loop + .no_events: + xor eax,eax + ret +.IRQ: +;TODO: сделать так же, как и для FlagAutoReset (BgrRedraw,Mouse,IPC,Stack,Debug) + mov edx,[irq_owner+eax*4-64] ; eax==16+irq + cmp edx,[edi+TASKDATA.pid] + jne .loop + mov edx,eax + shl edx,12 + cmp dword[IRQ_SAVE+edx-0x10000],0 ; edx==(16+irq)*0x1000 + je .loop ; empty ??? + ret ; retval = eax +.FlagAutoReset: ; retvals: BgrRedraw=5, Mouse=6, IPC=7, Stack=8, Debug=9 + btr [ebx+APPDATA.event_mask],eax + jnc .loop + .result: ; retval = eax+1 + inc eax + ret + .BtKy: + movzx edx,bh + movzx edx, word[WIN_STACK+edx*2] + je .Keys ; eax=1, retval Keys=2 +.Buttons: ; eax=2, retval Buttons=3 + cmp byte[BTN_COUNT],0 + je .loop ; empty ??? + cmp edx,[TASK_COUNT] + jne .loop ; not Top ??? + cmp dword[BTN_BUFF],0xFFFF ;-ID for Minimize-Button of Form + jne .result + mov [window_minimize],1 + dec byte[BTN_COUNT] + jmp .loop +.Keys: ; eax==1 + cmp edx,[TASK_COUNT] + jne @f ; not Top ??? + cmp [KEY_COUNT],al ; al==1 + jae .result ; not empty ??? + @@: mov edx, hotkey_buffer + @@: cmp [edx],bh ; bh - slot for testing + je .result + add edx,8 + cmp edx, hotkey_buffer+120*8 jb @b - no_eventoccur2: - - ;mov edi,[TASK_BASE] ; BUTTON IN BUFFER - test [edi+TASKDATA.event_mask],dword 4 - jz no_eventoccur3 - cmp [BTN_COUNT],byte 0 - je no_eventoccur3 - mov ecx, [CURRENT_TASK] - movzx edx, word [WIN_STACK+ecx*2] - mov eax, [TASK_COUNT] - cmp eax,edx - jnz no_eventoccur3 - popad - mov eax,[BTN_BUFF] - cmp eax,65535 - je no_event_1 - mov eax,3 - ret - - no_event_1: - mov [window_minimize],1 - mov [BTN_COUNT],byte 0 - xor eax, eax - ret - -no_eventoccur3: - - ;mov edi,[TASK_BASE] ; mouse event - mov eax, [CURRENT_TASK] - shl eax, 8 - add eax, SLOT_BASE - test [edi+TASKDATA.event_mask],dword 00100000b - jz no_mouse_event - - test [eax+APPDATA.event_mask],dword 00100000b - jz no_mouse_event - and [eax+APPDATA.event_mask],dword (not 00100000b) - popad - mov eax,6 - ret -no_mouse_event: - - ;mov edi,[TASK_BASE] ; DESKTOP BACKGROUND REDRAW - test [edi+TASKDATA.event_mask], 16 - jz no_eventoccur5 -; cmp [REDRAW_BACKGROUND],byte 2 -; jnz no_eventoccur5 - test [eax+APPDATA.event_mask], 16 - jz no_eventoccur5 - and [eax+APPDATA.event_mask], not 16 - popad - mov eax,5 - ret -no_eventoccur5: - - ;mov edi,[TASK_BASE] ; IPC - test [edi+TASKDATA.event_mask],dword 01000000b - jz no_ipc - test [eax+APPDATA.event_mask],dword 01000000b - jz no_ipc - and [eax+APPDATA.event_mask],dword 0xffffffff-01000000b - popad - mov eax,7 - ret -no_ipc: - - ;mov edi,[TASK_BASE] ; STACK - test [edi+TASKDATA.event_mask],dword 10000000b - jz no_stack_event - test [eax+APPDATA.event_mask],dword 10000000b - jz no_stack_event - and [eax+APPDATA.event_mask],dword 0xffffffff-10000000b - popad - mov eax,8 - ret -no_stack_event: - - test byte [edi+TASKDATA.event_mask+1], 1 ; DEBUG - jz .test_IRQ - test byte [eax+APPDATA.event_mask+1], byte 1 - jz .test_IRQ - and byte [eax+APPDATA.event_mask+1], not 1 - popad - mov eax, 9 - ret - -;.test_ext: -; mov eax, [CURRENT_TASK] -; shl eax, 8 -; test dword [eax+SLOT_BASE+APPDATA.event_mask], EVENT_EXTENDED -; jz .test_IRQ -; popad -; mov eax, 10 -; ret - -.test_IRQ: - cmp dword [edi+TASKDATA.event_mask], 0xFFFF - jbe no_events - - mov esi,IRQ_SAVE ; IRQ'S AND DATA - mov ebx,0x00010000 - xor ecx, ecx - irq_event_test: - mov edi,[TASK_BASE] - test [edi+TASKDATA.event_mask],ebx - jz no_irq_event - mov edi,ecx - shl edi,2 - add edi,irq_owner - mov edx,[edi] - mov eax,[TASK_BASE] - mov eax,[eax+TASKDATA.pid] - cmp edx,eax - jne no_irq_event - cmp [esi],dword 0 - jz no_irq_event - mov eax,ecx - add eax,16 - mov [esp+28],eax - popad - ret - no_irq_event: - add esi,0x1000 - shl ebx,1 - inc ecx - cmp ecx,16 - jb irq_event_test - - no_events: - popad - xor eax, eax - ret - - - + jmp .loop +;end. diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 213ff7f88a..85ce6bd718 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -59,7 +59,7 @@ include 'macros.inc' $Revision$ -USE_COM_IRQ equ 1 ; make irq 3 and irq 4 available for PCI devices +USE_COM_IRQ equ 1 ; make irq 3 and irq 4 available for PCI devices ; Enabling the next line will enable serial output console ;debug_com_base equ 0x3f8 ; 0x3f8 is com1, 0x2f8 is com2, 0x3e8 is com3, 0x2e8 is com4, no irq's are used @@ -69,14 +69,14 @@ include "kglobals.inc" include "lang.inc" include "const.inc" -max_processes equ 255 -tss_step equ (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4 +max_processes equ 255 +tss_step equ (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4 -os_stack equ (os_data_l-gdts) ; GDTs +os_stack equ (os_data_l-gdts) ; GDTs os_code equ (os_code_l-gdts) graph_data equ (3+graph_data_l-gdts) -tss0 equ (tss0_l-gdts) +tss0 equ (tss0_l-gdts) app_code equ (3+app_code_l-gdts) app_data equ (3+app_data_l-gdts) pci_code_sel equ (pci_code_32-gdts) @@ -114,8 +114,8 @@ pci_data_sel equ (pci_data_32-gdts) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; use16 - org 0x0 - jmp start_of_code + org 0x0 + jmp start_of_code version db 'Kolibri OS version 0.7.5.0 ',13,10,13,10,0 @@ -126,10 +126,10 @@ if lang eq en include "boot/booteng.inc" ; english system boot messages else if lang eq ru include "boot/bootru.inc" ; russian system boot messages -include "boot/ru.inc" ; Russian font +include "boot/ru.inc" ; Russian font else if lang eq et include "boot/bootet.inc" ; estonian system boot messages -include "boot/et.inc" ; Estonian font +include "boot/et.inc" ; Estonian font else include "boot/bootge.inc" ; german system boot messages end if @@ -147,58 +147,58 @@ include "detect/biosdisk.inc" ; CR0 Flags - Protected mode and Paging - mov ecx, CR0_PE + mov ecx, CR0_PE ; Enabling 32 bit protected mode - sidt [cs:old_ints_h] + sidt [cs:old_ints_h] - cli ; disable all irqs - cld - mov al,255 ; mask all irqs - out 0xa1,al - out 0x21,al - l.5: in al, 0x64 ; Enable A20 - test al, 2 - jnz l.5 - mov al, 0xD1 - out 0x64, al - l.6: in al, 0x64 - test al, 2 - jnz l.6 - mov al, 0xDF - out 0x60, al - l.7: in al, 0x64 - test al, 2 - jnz l.7 - mov al, 0xFF - out 0x64, al + cli ; disable all irqs + cld + mov al,255 ; mask all irqs + out 0xa1,al + out 0x21,al + l.5: in al, 0x64 ; Enable A20 + test al, 2 + jnz l.5 + mov al, 0xD1 + out 0x64, al + l.6: in al, 0x64 + test al, 2 + jnz l.6 + mov al, 0xDF + out 0x60, al + l.7: in al, 0x64 + test al, 2 + jnz l.7 + mov al, 0xFF + out 0x64, al - lgdt [cs:tmp_gdt] ; Load GDT - mov eax, cr0 ; protected mode - or eax, ecx - and eax, 10011111b *65536*256 + 0xffffff ; caching enabled - mov cr0, eax - jmp pword os_code:B32 ; jmp to enable 32 bit mode + lgdt [cs:tmp_gdt] ; Load GDT + mov eax, cr0 ; protected mode + or eax, ecx + and eax, 10011111b *65536*256 + 0xffffff ; caching enabled + mov cr0, eax + jmp pword os_code:B32 ; jmp to enable 32 bit mode align 8 tmp_gdt: - dw 23 - dd tmp_gdt+0x10000 - dw 0 + dw 23 + dd tmp_gdt+0x10000 + dw 0 - dw 0xffff - dw 0x0000 - db 0x00 - dw 11011111b *256 +10011010b - db 0x00 + dw 0xffff + dw 0x0000 + db 0x00 + dw 11011111b *256 +10011010b + db 0x00 - dw 0xffff - dw 0x0000 - db 0x00 - dw 11011111b *256 +10010010b - db 0x00 + dw 0xffff + dw 0x0000 + db 0x00 + dw 11011111b *256 +10010010b + db 0x00 include "data16.inc" @@ -207,65 +207,65 @@ org $+0x10000 align 4 B32: - mov ax,os_stack ; Selector for os - mov ds,ax - mov es,ax - mov fs,ax - mov gs,ax - mov ss,ax - mov esp,0x3ec00 ; Set stack + mov ax,os_stack ; Selector for os + mov ds,ax + mov es,ax + mov fs,ax + mov gs,ax + mov ss,ax + mov esp,0x3ec00 ; Set stack ; CLEAR 0x280000 - HEAP_BASE - xor eax,eax - mov edi,0x280000 - mov ecx,(HEAP_BASE-OS_BASE-0x280000) / 4 - cld - rep stosd + xor eax,eax + mov edi,0x280000 + mov ecx,(HEAP_BASE-OS_BASE-0x280000) / 4 + cld + rep stosd - mov edi,0x40000 - mov ecx,(0x90000-0x40000)/4 - rep stosd + mov edi,0x40000 + mov ecx,(0x90000-0x40000)/4 + rep stosd ; CLEAR KERNEL UNDEFINED GLOBALS - mov edi, endofcode-OS_BASE - mov ecx, (uglobals_size/4)+4 - rep stosd + mov edi, endofcode-OS_BASE + mov ecx, (uglobals_size/4)+4 + rep stosd ; SAVE & CLEAR 0-0xffff - xor esi, esi - mov edi,0x2F0000 - mov ecx,0x10000 / 4 - rep movsd - xor edi, edi - mov ecx,0x10000 / 4 - rep stosd + xor esi, esi + mov edi,0x2F0000 + mov ecx,0x10000 / 4 + rep movsd + xor edi, edi + mov ecx,0x10000 / 4 + rep stosd - call test_cpu - bts [cpu_caps-OS_BASE], CAPS_TSC ;force use rdtsc + call test_cpu + bts [cpu_caps-OS_BASE], CAPS_TSC ;force use rdtsc - call init_BIOS32 + call init_BIOS32 ; MEMORY MODEL - call mem_test - call init_mem - call init_page_map + call mem_test + call init_mem + call init_page_map ; ENABLE PAGING - mov eax, sys_pgdir-OS_BASE - mov cr3, eax + mov eax, sys_pgdir-OS_BASE + mov cr3, eax - mov eax,cr0 - or eax,CR0_PG+CR0_WP - mov cr0,eax + mov eax,cr0 + or eax,CR0_PG+CR0_WP + mov cr0,eax - lgdt [gdts] - jmp pword os_code:high_code + lgdt [gdts] + jmp pword os_code:high_code align 4 -bios32_entry dd ? -tmp_page_tabs dd ? +bios32_entry dd ? +tmp_page_tabs dd ? use16 org $-0x10000 @@ -281,45 +281,45 @@ org OS_BASE+$ align 4 high_code: - mov ax,os_stack - mov bx,app_data - mov ss,ax - add esp, OS_BASE + mov ax,os_stack + mov bx,app_data + mov ss,ax + add esp, OS_BASE - mov ds,bx - mov es,bx - mov fs,bx - mov gs,bx + mov ds,bx + mov es,bx + mov fs,bx + mov gs,bx - bt [cpu_caps], CAPS_PGE - jnc @F + bt [cpu_caps], CAPS_PGE + jnc @F - or dword [sys_pgdir+(OS_BASE shr 20)], PG_GLOBAL + or dword [sys_pgdir+(OS_BASE shr 20)], PG_GLOBAL - mov ebx, cr4 - or ebx, CR4_PGE - mov cr4, ebx + mov ebx, cr4 + or ebx, CR4_PGE + mov cr4, ebx @@: - xor eax, eax - mov dword [sys_pgdir], eax - mov dword [sys_pgdir+4], eax + xor eax, eax + mov dword [sys_pgdir], eax + mov dword [sys_pgdir+4], eax - mov eax, cr3 - mov cr3, eax ; flush TLB + mov eax, cr3 + mov cr3, eax ; flush TLB ; SAVE REAL MODE VARIABLES - mov ax, [BOOT_VAR + 0x9031] - mov [IDEContrRegsBaseAddr], ax + mov ax, [BOOT_VAR + 0x9031] + mov [IDEContrRegsBaseAddr], ax ; --------------- APM --------------------- ; init selectors - mov ebx, [BOOT_VAR+0x9040] ; offset of APM entry point + mov ebx, [BOOT_VAR+0x9040] ; offset of APM entry point movzx eax, word [BOOT_VAR+0x9050] ; real-mode segment base address of - ; protected-mode 32-bit code segment + ; protected-mode 32-bit code segment movzx ecx, word [BOOT_VAR+0x9052] ; real-mode segment base address of - ; protected-mode 16-bit code segment + ; protected-mode 16-bit code segment movzx edx, word [BOOT_VAR+0x9054] ; real-mode segment base address of - ; protected-mode 16-bit data segment + ; protected-mode 16-bit data segment shl eax, 4 mov [dword apm_code_32 + 2], ax @@ -344,241 +344,241 @@ high_code: ; ----------------------------------------- ; movzx eax,byte [BOOT_VAR+0x9010] ; mouse port ; mov [0xF604],byte 1 ;al - mov al, [BOOT_VAR+0x901F] ; DMA access - mov [allow_dma_access], al - mov al,[BOOT_VAR+0x9000] ; bpp - mov [ScreenBPP],al + mov al, [BOOT_VAR+0x901F] ; DMA access + mov [allow_dma_access], al + mov al,[BOOT_VAR+0x9000] ; bpp + mov [ScreenBPP],al - movzx eax,word [BOOT_VAR+0x900A] ; X max - dec eax - mov [Screen_Max_X],eax - mov [screen_workarea.right],eax - movzx eax,word [BOOT_VAR+0x900C] ; Y max - dec eax - mov [Screen_Max_Y],eax - mov [screen_workarea.bottom],eax - movzx eax,word [BOOT_VAR+0x9008] ; screen mode - mov [SCR_MODE],eax - mov eax,[BOOT_VAR+0x9014] ; Vesa 1.2 bnk sw add - mov [BANK_SWITCH],eax - mov [BytesPerScanLine],word 640*4 ; Bytes PerScanLine - cmp [SCR_MODE],word 0x13 ; 320x200 - je @f - cmp [SCR_MODE],word 0x12 ; VGA 640x480 - je @f - mov ax,[BOOT_VAR+0x9001] ; for other modes - mov [BytesPerScanLine],ax + movzx eax,word [BOOT_VAR+0x900A] ; X max + dec eax + mov [Screen_Max_X],eax + mov [screen_workarea.right],eax + movzx eax,word [BOOT_VAR+0x900C] ; Y max + dec eax + mov [Screen_Max_Y],eax + mov [screen_workarea.bottom],eax + movzx eax,word [BOOT_VAR+0x9008] ; screen mode + mov [SCR_MODE],eax + mov eax,[BOOT_VAR+0x9014] ; Vesa 1.2 bnk sw add + mov [BANK_SWITCH],eax + mov [BytesPerScanLine],word 640*4 ; Bytes PerScanLine + cmp [SCR_MODE],word 0x13 ; 320x200 + je @f + cmp [SCR_MODE],word 0x12 ; VGA 640x480 + je @f + mov ax,[BOOT_VAR+0x9001] ; for other modes + mov [BytesPerScanLine],ax @@: - mov esi, BOOT_VAR+0x9080 - movzx ecx, byte [esi-1] - mov [NumBiosDisks], ecx - mov edi, BiosDisksData - rep movsd + mov esi, BOOT_VAR+0x9080 + movzx ecx, byte [esi-1] + mov [NumBiosDisks], ecx + mov edi, BiosDisksData + rep movsd ; GRAPHICS ADDRESSES - mov byte [BOOT_VAR+0x901e],0x0 - mov eax,[BOOT_VAR+0x9018] - mov [LFBAddress],eax + mov byte [BOOT_VAR+0x901e],0x0 + mov eax,[BOOT_VAR+0x9018] + mov [LFBAddress],eax - cmp [SCR_MODE],word 0100000000000000b - jge setvesa20 - cmp [SCR_MODE],word 0x13 - je v20ga32 - mov [PUTPIXEL],dword Vesa12_putpixel24 ; Vesa 1.2 - mov [GETPIXEL],dword Vesa12_getpixel24 - cmp [ScreenBPP],byte 24 - jz ga24 - mov [PUTPIXEL],dword Vesa12_putpixel32 - mov [GETPIXEL],dword Vesa12_getpixel32 + cmp [SCR_MODE],word 0100000000000000b + jge setvesa20 + cmp [SCR_MODE],word 0x13 + je v20ga32 + mov [PUTPIXEL],dword Vesa12_putpixel24 ; Vesa 1.2 + mov [GETPIXEL],dword Vesa12_getpixel24 + cmp [ScreenBPP],byte 24 + jz ga24 + mov [PUTPIXEL],dword Vesa12_putpixel32 + mov [GETPIXEL],dword Vesa12_getpixel32 ga24: - jmp v20ga24 + jmp v20ga24 setvesa20: - mov [PUTPIXEL],dword Vesa20_putpixel24 ; Vesa 2.0 - mov [GETPIXEL],dword Vesa20_getpixel24 - cmp [ScreenBPP],byte 24 - jz v20ga24 + mov [PUTPIXEL],dword Vesa20_putpixel24 ; Vesa 2.0 + mov [GETPIXEL],dword Vesa20_getpixel24 + cmp [ScreenBPP],byte 24 + jz v20ga24 v20ga32: - mov [PUTPIXEL],dword Vesa20_putpixel32 - mov [GETPIXEL],dword Vesa20_getpixel32 + mov [PUTPIXEL],dword Vesa20_putpixel32 + mov [GETPIXEL],dword Vesa20_getpixel32 v20ga24: - cmp [SCR_MODE],word 0x12 ; 16 C VGA 640x480 - jne no_mode_0x12 - mov [PUTPIXEL],dword VGA_putpixel - mov [GETPIXEL],dword Vesa20_getpixel32 + cmp [SCR_MODE],word 0x12 ; 16 C VGA 640x480 + jne no_mode_0x12 + mov [PUTPIXEL],dword VGA_putpixel + mov [GETPIXEL],dword Vesa20_getpixel32 no_mode_0x12: ; -------- Fast System Call init ---------- ; Intel SYSENTER/SYSEXIT (AMD CPU support it too) - bt [cpu_caps], CAPS_SEP - jnc .SEnP ; SysEnter not Present - xor edx, edx - mov ecx, MSR_SYSENTER_CS - mov eax, os_code - wrmsr - mov ecx, MSR_SYSENTER_ESP + bt [cpu_caps], CAPS_SEP + jnc .SEnP ; SysEnter not Present + xor edx, edx + mov ecx, MSR_SYSENTER_CS + mov eax, os_code + wrmsr + mov ecx, MSR_SYSENTER_ESP ; mov eax, sysenter_stack ; Check it - xor eax, eax - wrmsr - mov ecx, MSR_SYSENTER_EIP - mov eax, sysenter_entry - wrmsr + xor eax, eax + wrmsr + mov ecx, MSR_SYSENTER_EIP + mov eax, sysenter_entry + wrmsr .SEnP: ; AMD SYSCALL/SYSRET - cmp byte[cpu_vendor], 'A' - jne .noSYSCALL - mov eax, 0x80000001 - cpuid - test edx, 0x800 ; bit_11 - SYSCALL/SYSRET support - jz .noSYSCALL - mov ecx, MSR_AMD_EFER - rdmsr - or eax, 1 ; bit_0 - System Call Extension (SCE) - wrmsr + cmp byte[cpu_vendor], 'A' + jne .noSYSCALL + mov eax, 0x80000001 + cpuid + test edx, 0x800 ; bit_11 - SYSCALL/SYSRET support + jz .noSYSCALL + mov ecx, MSR_AMD_EFER + rdmsr + or eax, 1 ; bit_0 - System Call Extension (SCE) + wrmsr - ; !!!! It`s dirty hack, fix it !!! - ; Bits of EDX : - ; Bit 31–16 During the SYSRET instruction, this field is copied into the CS register - ; and the contents of this field, plus 8, are copied into the SS register. - ; Bit 15–0 During the SYSCALL instruction, this field is copied into the CS register - ; and the contents of this field, plus 8, are copied into the SS register. + ; !!!! It`s dirty hack, fix it !!! + ; Bits of EDX : + ; Bit 31–16 During the SYSRET instruction, this field is copied into the CS register + ; and the contents of this field, plus 8, are copied into the SS register. + ; Bit 15–0 During the SYSCALL instruction, this field is copied into the CS register + ; and the contents of this field, plus 8, are copied into the SS register. - ; mov edx, (os_code + 16) * 65536 + os_code - mov edx, 0x1B0008 + ; mov edx, (os_code + 16) * 65536 + os_code + mov edx, 0x1B0008 - mov eax, syscall_entry - mov ecx, MSR_AMD_STAR - wrmsr + mov eax, syscall_entry + mov ecx, MSR_AMD_STAR + wrmsr .noSYSCALL: ; ----------------------------------------- ; LOAD IDT - call build_interrupt_table - lidt [idtreg] + call build_interrupt_table + lidt [idtreg] - call init_kernel_heap - stdcall kernel_alloc, RING0_STACK_SIZE+512 - mov [os_stack_seg], eax + call init_kernel_heap + stdcall kernel_alloc, RING0_STACK_SIZE+512 + mov [os_stack_seg], eax - lea esp, [eax+RING0_STACK_SIZE] + lea esp, [eax+RING0_STACK_SIZE] - mov [tss._ss0], os_stack - mov [tss._esp0], esp - mov [tss._esp], esp - mov [tss._cs],os_code - mov [tss._ss],os_stack - mov [tss._ds],app_data - mov [tss._es],app_data - mov [tss._fs],app_data - mov [tss._gs],app_data - mov [tss._io],128 + mov [tss._ss0], os_stack + mov [tss._esp0], esp + mov [tss._esp], esp + mov [tss._cs],os_code + mov [tss._ss],os_stack + mov [tss._ds],app_data + mov [tss._es],app_data + mov [tss._fs],app_data + mov [tss._gs],app_data + mov [tss._io],128 ;Add IO access table - bit array of permitted ports - mov edi, tss._io_map_0 - xor eax, eax - not eax - mov ecx, 8192/4 - rep stosd ; access to 4096*8=65536 ports + mov edi, tss._io_map_0 + xor eax, eax + not eax + mov ecx, 8192/4 + rep stosd ; access to 4096*8=65536 ports - mov ax,tss0 - ltr ax + mov ax,tss0 + ltr ax - mov [LFBSize], 0x800000 - call init_LFB - call init_fpu - call init_malloc + mov [LFBSize], 0x800000 + call init_LFB + call init_fpu + call init_malloc - stdcall alloc_kernel_space, 0x51000 - mov [default_io_map], eax + stdcall alloc_kernel_space, 0x51000 + mov [default_io_map], eax - add eax, 0x2000 - mov [ipc_tmp], eax - mov ebx, 0x1000 + add eax, 0x2000 + mov [ipc_tmp], eax + mov ebx, 0x1000 - add eax, 0x40000 - mov [proc_mem_map], eax + add eax, 0x40000 + mov [proc_mem_map], eax - add eax, 0x8000 - mov [proc_mem_pdir], eax + add eax, 0x8000 + mov [proc_mem_pdir], eax - add eax, ebx - mov [proc_mem_tab], eax + add eax, ebx + mov [proc_mem_tab], eax - add eax, ebx - mov [tmp_task_pdir], eax + add eax, ebx + mov [tmp_task_pdir], eax - add eax, ebx - mov [tmp_task_ptab], eax + add eax, ebx + mov [tmp_task_ptab], eax - add eax, ebx - mov [ipc_pdir], eax + add eax, ebx + mov [ipc_pdir], eax - add eax, ebx - mov [ipc_ptab], eax + add eax, ebx + mov [ipc_ptab], eax - stdcall kernel_alloc, (unpack.LZMA_BASE_SIZE+(unpack.LZMA_LIT_SIZE shl \ - (unpack.lc+unpack.lp)))*4 + stdcall kernel_alloc, (unpack.LZMA_BASE_SIZE+(unpack.LZMA_LIT_SIZE shl \ + (unpack.lc+unpack.lp)))*4 - mov [unpack.p], eax + mov [unpack.p], eax - call init_events - mov eax, srv.fd-SRV_FD_OFFSET - mov [srv.fd], eax - mov [srv.bk], eax + call init_events + mov eax, srv.fd-SRV_FD_OFFSET + mov [srv.fd], eax + mov [srv.bk], eax - mov edi, irq_tab - xor eax, eax - mov ecx, 16 - rep stosd + mov edi, irq_tab + xor eax, eax + mov ecx, 16 + rep stosd ;Set base of graphic segment to linear address of LFB - mov eax,[LFBAddress] ; set for gs - mov [graph_data_l+2],ax - shr eax,16 - mov [graph_data_l+4],al - mov [graph_data_l+7],ah + mov eax,[LFBAddress] ; set for gs + mov [graph_data_l+2],ax + shr eax,16 + mov [graph_data_l+4],al + mov [graph_data_l+7],ah - mov [CURRENT_TASK],dword 1 - mov [TASK_COUNT],dword 1 - mov [TASK_BASE],dword TASK_DATA - mov [current_slot], SLOT_BASE+256 + mov [CURRENT_TASK],dword 1 + mov [TASK_COUNT],dword 1 + mov [TASK_BASE],dword TASK_DATA + mov [current_slot], SLOT_BASE+256 ; set background - xor eax,eax - inc eax - mov [BgrDrawMode],eax - mov [BgrDataWidth],eax - mov [BgrDataHeight],eax - mov [mem_BACKGROUND],4095 - stdcall kernel_alloc, [mem_BACKGROUND] - mov [img_background], eax + xor eax,eax + inc eax + mov [BgrDrawMode],eax + mov [BgrDataWidth],eax + mov [BgrDataHeight],eax + mov [mem_BACKGROUND],4095 + stdcall kernel_alloc, [mem_BACKGROUND] + mov [img_background], eax - mov [SLOT_BASE + 256 + APPDATA.dir_table], sys_pgdir - OS_BASE + mov [SLOT_BASE + 256 + APPDATA.dir_table], sys_pgdir - OS_BASE ; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f - call rerouteirqs + call rerouteirqs ; Initialize system V86 machine - call init_sys_v86 + call init_sys_v86 ; TIMER SET TO 1/100 S - mov al,0x34 ; set to 100Hz - out 0x43,al - mov al,0x9b ; lsb 1193180 / 1193 - out 0x40,al - mov al,0x2e ; msb - out 0x40,al + mov al,0x34 ; set to 100Hz + out 0x43,al + mov al,0x9b ; lsb 1193180 / 1193 + out 0x40,al + mov al,0x2e ; msb + out 0x40,al ; Enable timer IRQ (IRQ0) and hard drives IRQs (IRQ14, IRQ15) ; they are used: when partitions are scanned, hd_read relies on timer ; Also enable IRQ2, because in some configurations ; IRQs from slave controller are not delivered until IRQ2 on master is enabled - mov al, 0xFA - out 0x21, al - mov al, 0x3F - out 0xA1, al + mov al, 0xFA + out 0x21, al + mov al, 0x3F + out 0xA1, al ;!!!!!!!!!!!!!!!!!!!!!!!!!! include 'detect/disks.inc' @@ -594,7 +594,7 @@ include 'boot/rdload.inc' ; mov [dma_hdd],1 ; CALCULATE FAT CHAIN FOR RAMDISK - call calculatefatchain + call calculatefatchain ; LOAD VMODE DRIVER @@ -603,259 +603,259 @@ include 'vmodeld.inc' ;!!!!!!!!!!!!!!!!!!!!!!! mov ax,[OS_BASE+0x10000+bx_from_load] - cmp ax,'r1' ; if using not ram disk, then load librares and parameters {SPraid.simba} + cmp ax,'r1' ; if using not ram disk, then load librares and parameters {SPraid.simba} je no_lib_load ; LOADING LIBRARES - stdcall dll.Load,@IMPORT ; loading librares for kernel (.obj files) - call load_file_parse_table ; prepare file parse table - call set_kernel_conf ; configure devices and gui + stdcall dll.Load,@IMPORT ; loading librares for kernel (.obj files) + call load_file_parse_table ; prepare file parse table + call set_kernel_conf ; configure devices and gui no_lib_load: ; LOAD FONTS I and II - stdcall read_file, char, FONT_I, 0, 2304 - stdcall read_file, char2, FONT_II, 0, 2560 + stdcall read_file, char, FONT_I, 0, 2304 + stdcall read_file, char2, FONT_II, 0, 2560 - mov esi,boot_fonts - call boot_log + mov esi,boot_fonts + call boot_log ; PRINT AMOUNT OF MEMORY - mov esi, boot_memdetect - call boot_log + mov esi, boot_memdetect + call boot_log - movzx ecx, word [boot_y] - or ecx, (10+29*6) shl 16 ; "Determining amount of memory" - sub ecx, 10 - mov edx, 0xFFFFFF - mov ebx, [MEM_AMOUNT] - shr ebx, 20 - mov edi, 1 - mov eax, 0x00040000 - call display_number_force + movzx ecx, word [boot_y] + or ecx, (10+29*6) shl 16 ; "Determining amount of memory" + sub ecx, 10 + mov edx, 0xFFFFFF + mov ebx, [MEM_AMOUNT] + shr ebx, 20 + mov edi, 1 + mov eax, 0x00040000 + call display_number_force ; BUILD SCHEDULER - call build_scheduler ; sys32.inc + call build_scheduler ; sys32.inc - mov esi,boot_devices - call boot_log + mov esi,boot_devices + call boot_log - mov [pci_access_enabled],1 + mov [pci_access_enabled],1 ; SET PRELIMINARY WINDOW STACK AND POSITIONS - mov esi,boot_windefs - call boot_log - call setwindowdefaults + mov esi,boot_windefs + call boot_log + call setwindowdefaults ; SET BACKGROUND DEFAULTS - mov esi,boot_bgr - call boot_log - call init_background - call calculatebackground + mov esi,boot_bgr + call boot_log + call init_background + call calculatebackground ; RESERVE SYSTEM IRQ'S JA PORT'S - mov esi,boot_resirqports - call boot_log - call reserve_irqs_ports + mov esi,boot_resirqports + call boot_log + call reserve_irqs_ports ; SET PORTS FOR IRQ HANDLERS - mov esi,boot_setrports - call boot_log - ;call setirqreadports + mov esi,boot_setrports + call boot_log + ;call setirqreadports ; SET UP OS TASK - mov esi,boot_setostask - call boot_log + mov esi,boot_setostask + call boot_log - xor eax, eax - mov dword [SLOT_BASE+APPDATA.fpu_state], fpu_data - mov dword [SLOT_BASE+APPDATA.fpu_handler], eax - mov dword [SLOT_BASE+APPDATA.sse_handler], eax + xor eax, eax + mov dword [SLOT_BASE+APPDATA.fpu_state], fpu_data + mov dword [SLOT_BASE+APPDATA.fpu_handler], eax + mov dword [SLOT_BASE+APPDATA.sse_handler], eax - ; name for OS/IDLE process + ; name for OS/IDLE process - mov dword [SLOT_BASE+256+APPDATA.app_name], dword 'OS/I' - mov dword [SLOT_BASE+256+APPDATA.app_name+4], dword 'DLE ' - mov edi, [os_stack_seg] - mov dword [SLOT_BASE+256+APPDATA.pl0_stack], edi - add edi, 0x2000-512 - mov dword [SLOT_BASE+256+APPDATA.fpu_state], edi - mov dword [SLOT_BASE+256+APPDATA.saved_esp0], edi ; just for case - mov dword [SLOT_BASE+256+APPDATA.io_map],\ - (tss._io_map_0-OS_BASE+PG_MAP) - mov dword [SLOT_BASE+256+APPDATA.io_map+4],\ - (tss._io_map_1-OS_BASE+PG_MAP) + mov dword [SLOT_BASE+256+APPDATA.app_name], dword 'OS/I' + mov dword [SLOT_BASE+256+APPDATA.app_name+4], dword 'DLE ' + mov edi, [os_stack_seg] + mov dword [SLOT_BASE+256+APPDATA.pl0_stack], edi + add edi, 0x2000-512 + mov dword [SLOT_BASE+256+APPDATA.fpu_state], edi + mov dword [SLOT_BASE+256+APPDATA.saved_esp0], edi ; just for case + mov dword [SLOT_BASE+256+APPDATA.io_map],\ + (tss._io_map_0-OS_BASE+PG_MAP) + mov dword [SLOT_BASE+256+APPDATA.io_map+4],\ + (tss._io_map_1-OS_BASE+PG_MAP) - mov esi, fpu_data - mov ecx, 512/4 - cld - rep movsd + mov esi, fpu_data + mov ecx, 512/4 + cld + rep movsd - mov dword [SLOT_BASE+256+APPDATA.fpu_handler], eax - mov dword [SLOT_BASE+256+APPDATA.sse_handler], eax + mov dword [SLOT_BASE+256+APPDATA.fpu_handler], eax + mov dword [SLOT_BASE+256+APPDATA.sse_handler], eax - mov ebx, SLOT_BASE+256+APP_OBJ_OFFSET - mov dword [SLOT_BASE+256+APPDATA.fd_obj], ebx - mov dword [SLOT_BASE+256+APPDATA.bk_obj], ebx + mov ebx, SLOT_BASE+256+APP_OBJ_OFFSET + mov dword [SLOT_BASE+256+APPDATA.fd_obj], ebx + mov dword [SLOT_BASE+256+APPDATA.bk_obj], ebx - mov dword [SLOT_BASE+256+APPDATA.cur_dir], sysdir_path + mov dword [SLOT_BASE+256+APPDATA.cur_dir], sysdir_path - ; task list - mov [CURRENT_TASK],dword 1 - mov [TASK_COUNT],dword 1 - mov [current_slot], SLOT_BASE+256 - mov [TASK_BASE],dword TASK_DATA - mov [TASK_DATA+TASKDATA.wnd_number], 1 ; on screen number - mov [TASK_DATA+TASKDATA.pid], 1 ; process id number - mov [TASK_DATA+TASKDATA.mem_start], 0 ; process base address + ; task list + mov [CURRENT_TASK],dword 1 + mov [TASK_COUNT],dword 1 + mov [current_slot], SLOT_BASE+256 + mov [TASK_BASE],dword TASK_DATA + mov [TASK_DATA+TASKDATA.wnd_number], 1 ; on screen number + mov [TASK_DATA+TASKDATA.pid], 1 ; process id number + mov [TASK_DATA+TASKDATA.mem_start], 0 ; process base address - call init_cursors - mov eax, [def_cursor] - mov [SLOT_BASE+APPDATA.cursor],eax - mov [SLOT_BASE+APPDATA.cursor+256],eax + call init_cursors + mov eax, [def_cursor] + mov [SLOT_BASE+APPDATA.cursor],eax + mov [SLOT_BASE+APPDATA.cursor+256],eax ; READ TSC / SECOND - mov esi,boot_tsc - call boot_log - cli - call _rdtsc - mov ecx,eax - mov esi,250 ; wait 1/4 a second - call delay_ms - call _rdtsc - sti - sub eax,ecx - shl eax,2 - mov [CPU_FREQ],eax ; save tsc / sec + mov esi,boot_tsc + call boot_log + cli + rdtsc ;call _rdtsc + mov ecx,eax + mov esi,250 ; wait 1/4 a second + call delay_ms + rdtsc ;call _rdtsc + sti + sub eax,ecx + shl eax,2 + mov [CPU_FREQ],eax ; save tsc / sec ; mov ebx, 1000000 ; div ebx ; ў®®ЎйҐ-в® Їа®Ё§ў®¤ЁвҐ«м­®бвм ў ¤ ­­®¬ Є®­ЄаҐв­®¬ ¬Ґб⥠; б®ўҐа襭­® ­ҐЄаЁвЁз­ , ­® зв®Ўл § вЄ­гвм «оЎЁвҐ«Ґ© ; ®ЇвЁ¬Ё§ЁагойЁе Є®¬ЇЁ«пв®а®ў џ‚“... - mov edx, 2251799814 - mul edx - shr edx, 19 - mov [stall_mcs], edx + mov edx, 2251799814 + mul edx + shr edx, 19 + mov [stall_mcs], edx ; PRINT CPU FREQUENCY - mov esi, boot_cpufreq - call boot_log + mov esi, boot_cpufreq + call boot_log - mov ebx, edx - movzx ecx, word [boot_y] - add ecx, (10+17*6) shl 16 - 10 ; 'CPU frequency is ' - mov edx, 0xFFFFFF - mov edi, 1 - mov eax, 0x00040000 - call display_number_force + mov ebx, edx + movzx ecx, word [boot_y] + add ecx, (10+17*6) shl 16 - 10 ; 'CPU frequency is ' + mov edx, 0xFFFFFF + mov edi, 1 + mov eax, 0x00040000 + call display_number_force ; SET VARIABLES - call set_variables + call set_variables ; SET MOUSE - ;call detect_devices - stdcall load_driver, szPS2MDriver - stdcall load_driver, szCOM_MDriver + ;call detect_devices + stdcall load_driver, szPS2MDriver + stdcall load_driver, szCOM_MDriver - mov esi,boot_setmouse - call boot_log - call setmouse + mov esi,boot_setmouse + call boot_log + call setmouse ; STACK AND FDC - call stack_init - call fdc_init + call stack_init + call fdc_init ; PALETTE FOR 320x200 and 640x480 16 col - cmp [SCR_MODE],word 0x12 - jne no_pal_vga - mov esi,boot_pal_vga - call boot_log - call paletteVGA + cmp [SCR_MODE],word 0x12 + jne no_pal_vga + mov esi,boot_pal_vga + call boot_log + call paletteVGA no_pal_vga: - cmp [SCR_MODE],word 0x13 - jne no_pal_ega - mov esi,boot_pal_ega - call boot_log - call palette320x200 + cmp [SCR_MODE],word 0x13 + jne no_pal_ega + mov esi,boot_pal_ega + call boot_log + call palette320x200 no_pal_ega: ; LOAD DEFAULT SKIN - call load_default_skin + call load_default_skin ;protect io permission map - mov esi, [default_io_map] - stdcall map_page,esi,(tss._io_map_0-OS_BASE), PG_MAP - add esi, 0x1000 - stdcall map_page,esi,(tss._io_map_1-OS_BASE), PG_MAP + mov esi, [default_io_map] + stdcall map_page,esi,(tss._io_map_0-OS_BASE), PG_MAP + add esi, 0x1000 + stdcall map_page,esi,(tss._io_map_1-OS_BASE), PG_MAP - stdcall map_page,tss._io_map_0,\ - (tss._io_map_0-OS_BASE), PG_MAP - stdcall map_page,tss._io_map_1,\ - (tss._io_map_1-OS_BASE), PG_MAP + stdcall map_page,tss._io_map_0,\ + (tss._io_map_0-OS_BASE), PG_MAP + stdcall map_page,tss._io_map_1,\ + (tss._io_map_1-OS_BASE), PG_MAP mov ax,[OS_BASE+0x10000+bx_from_load] - cmp ax,'r1' ; if not rused ram disk - load network configuration from files {SPraid.simba} + cmp ax,'r1' ; if not rused ram disk - load network configuration from files {SPraid.simba} je no_st_network - call set_network_conf + call set_network_conf no_st_network: ; LOAD FIRST APPLICATION - cli + cli - cmp byte [BOOT_VAR+0x9030],1 - jne no_load_vrr_m + cmp byte [BOOT_VAR+0x9030],1 + jne no_load_vrr_m - mov ebp, vrr_m - call fs_execute_from_sysdir + mov ebp, vrr_m + call fs_execute_from_sysdir - cmp eax,2 ; if vrr_m app found (PID=2) - je first_app_found + cmp eax,2 ; if vrr_m app found (PID=2) + je first_app_found no_load_vrr_m: - mov ebp, firstapp - call fs_execute_from_sysdir + mov ebp, firstapp + call fs_execute_from_sysdir - cmp eax,2 ; continue if a process has been loaded - je first_app_found + cmp eax,2 ; continue if a process has been loaded + je first_app_found - mov esi, boot_failed - call boot_log + mov esi, boot_failed + call boot_log - mov eax, 0xDEADBEEF ; otherwise halt - hlt + mov eax, 0xDEADBEEF ; otherwise halt + hlt first_app_found: - cli + cli - ;mov [TASK_COUNT],dword 2 - mov [CURRENT_TASK],dword 1 ; set OS task fisrt + ;mov [TASK_COUNT],dword 2 + mov [CURRENT_TASK],dword 1 ; set OS task fisrt ; SET KEYBOARD PARAMETERS - mov al, 0xf6 ; reset keyboard, scan enabled - call kb_write + mov al, 0xf6 ; reset keyboard, scan enabled + call kb_write - ; wait until 8042 is ready - xor ecx,ecx + ; wait until 8042 is ready + xor ecx,ecx @@: - in al,64h - and al,00000010b - loopnz @b + in al,64h + and al,00000010b + loopnz @b ; mov al, 0xED ; svetodiody - only for testing! ; call kb_write @@ -864,14 +864,14 @@ first_app_found: ; call kb_write ; call kb_read - mov al, 0xF3 ; set repeat rate & delay - call kb_write + mov al, 0xF3 ; set repeat rate & delay + call kb_write ; call kb_read - mov al, 0 ; 30 250 ;00100010b ; 24 500 ;00100100b ; 20 500 - call kb_write + mov al, 0 ; 30 250 ;00100010b ; 24 500 ;00100100b ; 20 500 + call kb_write ; call kb_read ;// mike.dld [ - call set_lights + call set_lights ;// mike.dld ] @@ -879,39 +879,39 @@ first_app_found: if defined debug_com_base - ; enable Divisor latch + ; enable Divisor latch - mov dx, debug_com_base+3 - mov al, 1 shl 7 - out dx, al + mov dx, debug_com_base+3 + mov al, 1 shl 7 + out dx, al - ; Set speed to 115200 baud (max speed) + ; Set speed to 115200 baud (max speed) - mov dx, debug_com_base - mov al, 0x01 - out dx, al + mov dx, debug_com_base + mov al, 0x01 + out dx, al - mov dx, debug_com_base+1 - mov al, 0x00 - out dx, al + mov dx, debug_com_base+1 + mov al, 0x00 + out dx, al - ; No parity, 8bits words, one stop bit, dlab bit back to 0 + ; No parity, 8bits words, one stop bit, dlab bit back to 0 - mov dx, debug_com_base+3 - mov al, 3 - out dx, al + mov dx, debug_com_base+3 + mov al, 3 + out dx, al - ; disable interrupts + ; disable interrupts - mov dx, debug_com_base+1 - mov al, 0 - out dx, al + mov dx, debug_com_base+1 + mov al, 0 + out dx, al - ; clear + enable fifo (64 bits) + ; clear + enable fifo (64 bits) - mov dx, debug_com_base+2 - mov al, 0x7 + 1 shl 5 - out dx, al + mov dx, debug_com_base+2 + mov al, 0x7 + 1 shl 5 + out dx, al end if @@ -919,72 +919,72 @@ end if ; START MULTITASKING if preboot_blogesc - mov esi, boot_tasking - call boot_log -.bll1: in al, 0x60 ; wait for ESC key press - cmp al, 129 - jne .bll1 + mov esi, boot_tasking + call boot_log +.bll1: in al, 0x60 ; wait for ESC key press + cmp al, 129 + jne .bll1 end if ; mov [ENABLE_TASKSWITCH],byte 1 ; multitasking enabled ; UNMASK ALL IRQ'S - mov esi,boot_allirqs - call boot_log + mov esi,boot_allirqs + call boot_log - cli ;guarantee forbidance of interrupts. - mov al,0 ; unmask all irq's - out 0xA1,al - out 0x21,al + cli ;guarantee forbidance of interrupts. + mov al,0 ; unmask all irq's + out 0xA1,al + out 0x21,al - mov ecx,32 + mov ecx,32 ready_for_irqs: - mov al,0x20 ; ready for irqs - out 0x20,al - out 0xa0,al + mov al,0x20 ; ready for irqs + out 0x20,al + out 0xa0,al - loop ready_for_irqs ; flush the queue + loop ready_for_irqs ; flush the queue - stdcall attach_int_handler, dword 1, irq1, dword 0 + stdcall attach_int_handler, dword 1, irq1, dword 0 ; mov [dma_hdd],1 - cmp [IDEContrRegsBaseAddr], 0 - setnz [dma_hdd] - mov [timer_ticks_enable],1 ; for cd driver + cmp [IDEContrRegsBaseAddr], 0 + setnz [dma_hdd] + mov [timer_ticks_enable],1 ; for cd driver - sti - call change_task + sti + call change_task - jmp osloop + jmp osloop ; jmp $ ; wait here for timer to take control - ; Fly :) + ; Fly :) include 'unpacker.inc' include 'fdo.inc' align 4 boot_log: - pushad + pushad - mov ebx,10*65536 - mov bx,word [boot_y] - add [boot_y],dword 10 - mov ecx,0x80ffffff ; ASCIIZ string with white color - mov edx,esi - mov edi,1 - call dtext + mov ebx,10*65536 + mov bx,word [boot_y] + add [boot_y],dword 10 + mov ecx,0x80ffffff ; ASCIIZ string with white color + mov edx,esi + mov edi,1 + call dtext - mov [novesachecksum],1000 - call checkVga_N13 + mov [novesachecksum],1000 + call checkVga_N13 - popad + popad - ret + ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -994,17 +994,17 @@ boot_log: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; align 32 osloop: - call [draw_pointer] - call checkbuttons - call checkwindows + call [draw_pointer] + call checkbuttons + call checkwindows ; call check_window_move_request - call checkmisc - call checkVga_N13 - call stack_handler - call checkidle - call check_fdd_motor_status - call check_ATAPI_device_event - jmp osloop + call checkmisc + call checkVga_N13 + call stack_handler + call checkidle + call check_fdd_motor_status + call check_ATAPI_device_event + jmp osloop ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; MAIN OS LOOP END ; @@ -1012,61 +1012,31 @@ osloop: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; checkidle: - pushad - - cmp [check_idle_semaphore],0 - jne no_idle_state - - call change_task - mov eax,[idlemem] - mov ebx,[timer_ticks] ;[0xfdf0] - cmp eax,ebx - jnz idle_exit - call _rdtsc - mov ecx,eax + pushad + mov ebx,[timer_ticks] + call change_task + jmp idle_loop_entry idle_loop: - hlt - cmp [check_idle_semaphore],0 - jne idle_loop_exit - mov eax,[timer_ticks] ;[0xfdf0] - cmp ebx,eax - jz idle_loop - idle_loop_exit: - mov [idlemem],eax - call _rdtsc - sub eax,ecx - mov ebx,[idleuse] - add ebx,eax - mov [idleuse],ebx - - popad - ret - + cmp ebx,[timer_ticks] + jne idle_exit + rdtsc ;call _rdtsc + mov ecx,eax + hlt + rdtsc ;call _rdtsc + sub eax,ecx + add [idleuse],eax + idle_loop_entry: + cmp [check_idle_semaphore],0 + je idle_loop + dec [check_idle_semaphore] idle_exit: - - mov ebx,[timer_ticks] ;[0xfdf0] - mov [idlemem],ebx - call change_task - - popad - ret - - no_idle_state: - - dec [check_idle_semaphore] - - mov ebx,[timer_ticks] ;[0xfdf0] - mov [idlemem],ebx - call change_task - - popad - ret + popad + ret uglobal - idlemem dd 0x0 - idleuse dd 0x0 - idleusesec dd 0x0 - check_idle_semaphore dd 0x0 + idleuse dd 0x0 + idleusesec dd 0x0 + check_idle_semaphore dd 0x0 endg @@ -1089,57 +1059,57 @@ include "kernel32.inc" reserve_irqs_ports: - pushad + pushad - mov [irq_owner+4*0], 1 ; timer - ;mov [irq_owner+4*1], 1 ; keyboard - mov [irq_owner+4*6], 1 ; floppy diskette - mov [irq_owner+4*13], 1 ; math co-pros - mov [irq_owner+4*14], 1 ; ide I - mov [irq_owner+4*15], 1 ; ide II + mov [irq_owner+4*0], 1 ; timer + ;mov [irq_owner+4*1], 1 ; keyboard + mov [irq_owner+4*6], 1 ; floppy diskette + mov [irq_owner+4*13], 1 ; math co-pros + mov [irq_owner+4*14], 1 ; ide I + mov [irq_owner+4*15], 1 ; ide II - ; RESERVE PORTS - mov edi,1 ; 0x00-0x2d - mov [RESERVED_PORTS],edi - shl edi,4 - mov [RESERVED_PORTS+edi+0],dword 1 - mov [RESERVED_PORTS+edi+4],dword 0x0 - mov [RESERVED_PORTS+edi+8],dword 0x2d + ; RESERVE PORTS + mov edi,1 ; 0x00-0x2d + mov [RESERVED_PORTS],edi + shl edi,4 + mov [RESERVED_PORTS+edi+0],dword 1 + mov [RESERVED_PORTS+edi+4],dword 0x0 + mov [RESERVED_PORTS+edi+8],dword 0x2d - inc dword [RESERVED_PORTS] ; 0x30-0x4d - mov edi,[RESERVED_PORTS] - shl edi,4 - mov [RESERVED_PORTS+edi+0],dword 1 - mov [RESERVED_PORTS+edi+4],dword 0x30 - mov [RESERVED_PORTS+edi+8],dword 0x4d + inc dword [RESERVED_PORTS] ; 0x30-0x4d + mov edi,[RESERVED_PORTS] + shl edi,4 + mov [RESERVED_PORTS+edi+0],dword 1 + mov [RESERVED_PORTS+edi+4],dword 0x30 + mov [RESERVED_PORTS+edi+8],dword 0x4d - inc dword [RESERVED_PORTS] ; 0x50-0xdf - mov edi,[RESERVED_PORTS] - shl edi,4 - mov [RESERVED_PORTS+edi+0],dword 1 - mov [RESERVED_PORTS+edi+4],dword 0x50 - mov [RESERVED_PORTS+edi+8],dword 0xdf + inc dword [RESERVED_PORTS] ; 0x50-0xdf + mov edi,[RESERVED_PORTS] + shl edi,4 + mov [RESERVED_PORTS+edi+0],dword 1 + mov [RESERVED_PORTS+edi+4],dword 0x50 + mov [RESERVED_PORTS+edi+8],dword 0xdf - inc dword [RESERVED_PORTS] ; 0xe5-0xff - mov edi,[RESERVED_PORTS] - shl edi,4 - mov [RESERVED_PORTS+edi+0],dword 1 - mov [RESERVED_PORTS+edi+4],dword 0xe5 - mov [RESERVED_PORTS+edi+8],dword 0xff + inc dword [RESERVED_PORTS] ; 0xe5-0xff + mov edi,[RESERVED_PORTS] + shl edi,4 + mov [RESERVED_PORTS+edi+0],dword 1 + mov [RESERVED_PORTS+edi+4],dword 0xe5 + mov [RESERVED_PORTS+edi+8],dword 0xff - popad - ret + popad + ret setirqreadports: - mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte - mov [irq12read+4],dword 0 ; end of port list - ;mov [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte - ;mov [irq04read+4],dword 0 ; end of port list - ;mov [irq03read+0],dword 0x2f8 + 0x01000000 ; read port 0x2f8 , byte - ;mov [irq03read+4],dword 0 ; end of port list + mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte + mov [irq12read+4],dword 0 ; end of port list + ;mov [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte + ;mov [irq04read+4],dword 0 ; end of port list + ;mov [irq03read+0],dword 0x2f8 + 0x01000000 ; read port 0x2f8 , byte + ;mov [irq03read+4],dword 0 ; end of port list - ret + ret iglobal process_number dd 0x1 @@ -1147,49 +1117,48 @@ endg set_variables: - mov ecx,0x100 ; flush port 0x60 -.fl60: in al,0x60 - loop .fl60 - mov [MOUSE_BUFF_COUNT],byte 0 ; mouse buffer - mov [KEY_COUNT],byte 0 ; keyboard buffer - mov [BTN_COUNT],byte 0 ; button buffer + mov ecx,0x100 ; flush port 0x60 +.fl60: in al,0x60 + loop .fl60 + mov [MOUSE_BUFF_COUNT],byte 0 ; mouse buffer + mov [KEY_COUNT],byte 0 ; keyboard buffer + mov [BTN_COUNT],byte 0 ; button buffer ; mov [MOUSE_X],dword 100*65536+100 ; mouse x/y - push eax - mov ax,[BOOT_VAR+0x900c] - shr ax,1 - shl eax,16 - mov ax,[BOOT_VAR+0x900A] - shr ax,1 - mov [MOUSE_X],eax - pop eax + push eax + mov ax,[BOOT_VAR+0x900c] + shr ax,1 + shl eax,16 + mov ax,[BOOT_VAR+0x900A] + shr ax,1 + mov [MOUSE_X],eax + pop eax - mov [BTN_ADDR],dword BUTTON_INFO ; address of button list + mov [BTN_ADDR],dword BUTTON_INFO ; address of button list ;!! IP 04.02.2005: - mov [next_usage_update], 100 - mov byte [DONT_SWITCH], 0 ; change task if possible + mov byte [DONT_SWITCH], 0 ; change task if possible - ret + ret ;* mouse centered - start code- Mario79 mouse_centered: - push eax - mov eax,[Screen_Max_X] - shr eax,1 - mov [MOUSE_X],ax - mov eax,[Screen_Max_Y] - shr eax,1 - mov [MOUSE_Y],ax - pop eax - ret + push eax + mov eax,[Screen_Max_X] + shr eax,1 + mov [MOUSE_X],ax + mov eax,[Screen_Max_Y] + shr eax,1 + mov [MOUSE_Y],ax + pop eax + ret ;* mouse centered - end code- Mario79 align 4 sys_outport: - mov edi,ebx ; separate flag for read / write + mov edi,ebx ; separate flag for read / write and ebx,65535 mov ecx,[RESERVED_PORTS] @@ -1211,9 +1180,9 @@ sys_outport: cmp edx,[esi+0] jne sopl2 cmp ebx,[esi+4] - jb sopl2 + jb sopl2 cmp ebx,[esi+8] - jg sopl2 + jg sopl2 jmp sopl3 sopl2: @@ -1228,15 +1197,15 @@ sys_outport: test edi,0x80000000 ; read ? jnz sopl4 - mov dx,bx ; write + mov dx,bx ; write out dx,al mov [esp+36],dword 0 ret sopl4: - mov dx,bx ; read - in al,dx + mov dx,bx ; read + in al,dx and eax,0xff mov [esp+36],dword 0 mov [esp+24],eax @@ -1255,18 +1224,18 @@ display_number: ; ebx = number or pointer ; ecx = x shl 16 + y ; edx = color - xor edi, edi + xor edi, edi display_number_force: push eax and eax,0x3fffffff - cmp eax,0xffff ; length > 0 ? + cmp eax,0xffff ; length > 0 ? pop eax jge cont_displ ret cont_displ: push eax and eax,0x3fffffff - cmp eax,61*0x10000 ; length <= 60 ? + cmp eax,61*0x10000 ; length <= 60 ? pop eax jb cont_displ2 ret @@ -1274,7 +1243,7 @@ display_number_force: pushad - cmp al,1 ; ecx is a pointer ? + cmp al,1 ; ecx is a pointer ? jne displnl1 mov ebp,ebx add ebp,4 @@ -1283,7 +1252,7 @@ display_number_force: displnl1: sub esp,64 - cmp ah,0 ; DECIMAL + cmp ah,0 ; DECIMAL jne no_display_desnum shr eax,16 and eax,0xC03f @@ -1311,7 +1280,7 @@ display_number_force: ret no_display_desnum: - cmp ah,0x01 ; HEXADECIMAL + cmp ah,0x01 ; HEXADECIMAL jne no_display_hexnum shr eax,16 and eax,0xC03f @@ -1340,7 +1309,7 @@ display_number_force: ret no_display_hexnum: - cmp ah,0x02 ; BINARY + cmp ah,0x02 ; BINARY jne no_display_binnum shr eax,16 and eax,0xC03f @@ -1419,9 +1388,9 @@ draw_num_text: add eax,[edi+SLOT_BASE+APPDATA.wnd_clientbox.top] add ebx,eax mov ecx,[esp+64+32-12+4] - and ecx, not 0x80000000 ; force counted string - mov eax, [esp+64+8] ; background color (if given) - mov edi, [esp+64+4] + and ecx, not 0x80000000 ; force counted string + mov eax, [esp+64+8] ; background color (if given) + mov edi, [esp+64+4] jmp dtext align 4 @@ -1441,7 +1410,7 @@ sys_setup: mov [esp+36],dword 0 - cmp eax,1 ; MIDI + cmp eax,1 ; MIDI jnz nsyse1 cmp ebx,0x100 jb nsyse1 @@ -1460,7 +1429,7 @@ endg nsyse1: - cmp eax,2 ; KEYBOARD + cmp eax,2 ; KEYBOARD jnz nsyse2 cmp ebx,1 jnz kbnobase @@ -1500,7 +1469,7 @@ endg mov [esp+36],dword 1 ret nsyse2: - cmp eax,3 ; CD + cmp eax,3 ; CD jnz nsyse4 test ebx,ebx jz nosesl @@ -1533,13 +1502,13 @@ cd_base db 0 nsyse4: - cmp eax,5 ; SYSTEM LANGUAGE + cmp eax,5 ; SYSTEM LANGUAGE jnz nsyse5 mov [syslang],ebx ret nsyse5: - cmp eax,7 ; HD BASE + cmp eax,7 ; HD BASE jne nsyse7 test ebx,ebx jz nosethd @@ -1577,7 +1546,7 @@ cd_base db 0 call reserve_hd1 call reserve_hd_channel call free_hd_channel - mov [hd1_status],0 ; free + mov [hd1_status],0 ; free nosethd: ret @@ -1587,7 +1556,7 @@ endg nsyse7: - cmp eax,8 ; HD PARTITION + cmp eax,8 ; HD PARTITION jne nsyse8 mov [fat32part],ebx ; call set_FAT32_variables @@ -1597,18 +1566,18 @@ nsyse7: pusha call choice_necessity_partition_1 popa - mov [hd1_status],0 ; free + mov [hd1_status],0 ; free ret nsyse8: - cmp eax,11 ; ENABLE LBA READ + cmp eax,11 ; ENABLE LBA READ jne no_set_lba_read and ebx,1 mov [lba_read_enabled],ebx ret no_set_lba_read: - cmp eax,12 ; ENABLE PCI ACCESS + cmp eax,12 ; ENABLE PCI ACCESS jne no_set_pci_access and ebx,1 mov [pci_access_enabled],ebx @@ -1681,17 +1650,17 @@ kbnoaltret: ret ngsyse2: - cmp eax,3 - jnz ngsyse3 - movzx eax,[cd_base] - mov [esp+36],eax - ret + cmp eax,3 + jnz ngsyse3 + movzx eax,[cd_base] + mov [esp+36],eax + ret ngsyse3: - cmp eax,5 - jnz ngsyse5 - mov eax,[syslang] - mov [esp+36],eax - ret + cmp eax,5 + jnz ngsyse5 + mov eax,[syslang] + mov [esp+36],eax + ret ngsyse5: cmp eax,7 jnz ngsyse7 @@ -1733,10 +1702,10 @@ get_timer_ticks: iglobal align 4 mousefn dd msscreen, mswin, msbutton, msset - dd app_load_cursor - dd app_set_cursor - dd app_delete_cursor - dd msz + dd app_load_cursor + dd app_set_cursor + dd app_delete_cursor + dd msz endg readmousepos: @@ -1750,107 +1719,107 @@ readmousepos: ; eax=6 delete cursor ; reserved ; eax=7 get mouse_z - cmp eax, 7 - ja msset - jmp [mousefn+eax*4] + cmp eax, 7 + ja msset + jmp [mousefn+eax*4] msscreen: - mov eax,[MOUSE_X] - shl eax,16 - mov ax,[MOUSE_Y] - mov [esp+36],eax - ret + mov eax,[MOUSE_X] + shl eax,16 + mov ax,[MOUSE_Y] + mov [esp+36],eax + ret mswin: - mov eax,[MOUSE_X] - shl eax,16 - mov ax,[MOUSE_Y] - mov esi,[TASK_BASE] - mov bx, word [esi-twdw+WDATA.box.left] - shl ebx,16 - mov bx, word [esi-twdw+WDATA.box.top] - sub eax,ebx + mov eax,[MOUSE_X] + shl eax,16 + mov ax,[MOUSE_Y] + mov esi,[TASK_BASE] + mov bx, word [esi-twdw+WDATA.box.left] + shl ebx,16 + mov bx, word [esi-twdw+WDATA.box.top] + sub eax,ebx - mov edi,[CURRENT_TASK] - shl edi,8 - sub ax,word[edi+SLOT_BASE+APPDATA.wnd_clientbox.top] - rol eax,16 - sub ax,word[edi+SLOT_BASE+APPDATA.wnd_clientbox.left] - rol eax,16 - mov [esp+36],eax - ret + mov edi,[CURRENT_TASK] + shl edi,8 + sub ax,word[edi+SLOT_BASE+APPDATA.wnd_clientbox.top] + rol eax,16 + sub ax,word[edi+SLOT_BASE+APPDATA.wnd_clientbox.left] + rol eax,16 + mov [esp+36],eax + ret msbutton: - movzx eax,byte [BTN_DOWN] - mov [esp+36],eax - ret + movzx eax,byte [BTN_DOWN] + mov [esp+36],eax + ret msz: - mov edi, [TASK_COUNT] - movzx edi, word [WIN_POS + edi*2] - cmp edi, [CURRENT_TASK] - jne @f - mov ax,[MOUSE_SCROLL_H] - shl eax,16 - mov ax,[MOUSE_SCROLL_V] - mov [esp+36],eax - mov [MOUSE_SCROLL_H],word 0 - mov [MOUSE_SCROLL_V],word 0 - ret + mov edi, [TASK_COUNT] + movzx edi, word [WIN_POS + edi*2] + cmp edi, [CURRENT_TASK] + jne @f + mov ax,[MOUSE_SCROLL_H] + shl eax,16 + mov ax,[MOUSE_SCROLL_V] + mov [esp+36],eax + mov [MOUSE_SCROLL_H],word 0 + mov [MOUSE_SCROLL_V],word 0 + ret @@: - mov [esp+36],dword 0 - ret + mov [esp+36],dword 0 + ret msset: - ret + ret app_load_cursor: ; add ebx, new_app_base - cmp ebx, OS_BASE - jae msset - stdcall load_cursor, ebx, ecx - mov [esp+36], eax - ret + cmp ebx, OS_BASE + jae msset + stdcall load_cursor, ebx, ecx + mov [esp+36], eax + ret app_set_cursor: - stdcall set_cursor, ebx - mov [esp+36], eax - ret + stdcall set_cursor, ebx + mov [esp+36], eax + ret app_delete_cursor: - stdcall delete_cursor, ebx - mov [esp+36], eax - ret + stdcall delete_cursor, ebx + mov [esp+36], eax + ret is_input: push edx - mov dx,word [midisp] - in al,dx - and al,0x80 - pop edx + mov dx,word [midisp] + in al,dx + and al,0x80 + pop edx ret is_output: push edx - mov dx,word [midisp] - in al,dx - and al,0x40 - pop edx + mov dx,word [midisp] + in al,dx + and al,0x40 + pop edx ret get_mpu_in: push edx - mov dx,word [mididp] - in al,dx - pop edx + mov dx,word [mididp] + in al,dx + pop edx ret put_mpu_out: push edx - mov dx,word [mididp] - out dx,al - pop edx + mov dx,word [mididp] + out dx,al + pop edx ret @@ -1858,28 +1827,28 @@ setuart: su1: call is_output - cmp al,0 - jnz su1 - mov dx,word [midisp] - mov al,0xff - out dx,al + cmp al,0 + jnz su1 + mov dx,word [midisp] + mov al,0xff + out dx,al su2: - mov dx,word [midisp] - mov al,0xff - out dx,al + mov dx,word [midisp] + mov al,0xff + out dx,al call is_input - cmp al,0 - jnz su2 + cmp al,0 + jnz su2 call get_mpu_in - cmp al,0xfe - jnz su2 + cmp al,0xfe + jnz su2 su3: call is_output - cmp al,0 - jnz su3 - mov dx,word [midisp] - mov al,0x3f - out dx,al + cmp al,0 + jnz su3 + mov dx,word [midisp] + mov al,0x3f + out dx,al ret @@ -1932,7 +1901,7 @@ sys_end: mov eax,[TASK_BASE] mov [eax+TASKDATA.state], 3 ; terminate this program - waitterm: ; wait here for termination + waitterm: ; wait here for termination mov ebx,100 call delay_hs jmp waitterm @@ -1940,42 +1909,42 @@ sys_end: iglobal align 4 sys_system_table: - dd exit_for_anyone ; 1 = obsolete - dd sysfn_terminate ; 2 = terminate thread - dd sysfn_activate ; 3 = activate window - dd sysfn_getidletime ; 4 = get idle time - dd sysfn_getcpuclock ; 5 = get cpu clock - dd sysfn_saveramdisk ; 6 = save ramdisk - dd sysfn_getactive ; 7 = get active window - dd sysfn_sound_flag ; 8 = get/set sound_flag - dd sysfn_shutdown ; 9 = shutdown with parameter - dd sysfn_minimize ; 10 = minimize window - dd sysfn_getdiskinfo ; 11 = get disk subsystem info - dd sysfn_lastkey ; 12 = get last pressed key - dd sysfn_getversion ; 13 = get kernel version - dd sysfn_waitretrace ; 14 = wait retrace - dd sysfn_centermouse ; 15 = center mouse cursor - dd sysfn_getfreemem ; 16 = get free memory size - dd sysfn_getallmem ; 17 = get total memory size - dd sysfn_terminate2 ; 18 = terminate thread using PID - ; instead of slot - dd sysfn_mouse_acceleration; 19 = set/get mouse acceleration - dd sysfn_meminfo ; 20 = get extended memory info - dd sysfn_pid_to_slot ; 21 = get slot number for pid - dd sysfn_min_rest_window ; 22 = minimize and restore any window + dd exit_for_anyone ; 1 = obsolete + dd sysfn_terminate ; 2 = terminate thread + dd sysfn_activate ; 3 = activate window + dd sysfn_getidletime ; 4 = get idle time + dd sysfn_getcpuclock ; 5 = get cpu clock + dd sysfn_saveramdisk ; 6 = save ramdisk + dd sysfn_getactive ; 7 = get active window + dd sysfn_sound_flag ; 8 = get/set sound_flag + dd sysfn_shutdown ; 9 = shutdown with parameter + dd sysfn_minimize ; 10 = minimize window + dd sysfn_getdiskinfo ; 11 = get disk subsystem info + dd sysfn_lastkey ; 12 = get last pressed key + dd sysfn_getversion ; 13 = get kernel version + dd sysfn_waitretrace ; 14 = wait retrace + dd sysfn_centermouse ; 15 = center mouse cursor + dd sysfn_getfreemem ; 16 = get free memory size + dd sysfn_getallmem ; 17 = get total memory size + dd sysfn_terminate2 ; 18 = terminate thread using PID + ; instead of slot + dd sysfn_mouse_acceleration; 19 = set/get mouse acceleration + dd sysfn_meminfo ; 20 = get extended memory info + dd sysfn_pid_to_slot ; 21 = get slot number for pid + dd sysfn_min_rest_window ; 22 = minimize and restore any window sysfn_num = ($ - sys_system_table)/4 endg sys_system: - dec ebx - cmp ebx, sysfn_num - jae @f - jmp dword [sys_system_table + ebx*4] + dec ebx + cmp ebx, sysfn_num + jae @f + jmp dword [sys_system_table + ebx*4] @@: - ret + ret -sysfn_shutdown: ; 18.9 = system shutdown +sysfn_shutdown: ; 18.9 = system shutdown cmp ecx,1 jl exit_for_anyone cmp ecx,4 @@ -1992,7 +1961,7 @@ sysfn_shutdown: ; 18.9 = system shutdown shutdown_processes: dd 0x0 endg -sysfn_terminate: ; 18.2 = TERMINATE +sysfn_terminate: ; 18.2 = TERMINATE cmp ecx,2 jb noprocessterminate mov edx,[TASK_COUNT] @@ -2006,7 +1975,7 @@ sysfn_terminate: ; 18.2 = TERMINATE jz noprocessterminate ;call MEM_Heap_Lock ;guarantee that process isn't working with heap - mov [ecx],byte 3 ; clear possible i40's + mov [ecx],byte 3 ; clear possible i40's ;call MEM_Heap_UnLock cmp edx,[application_table_status] ; clear app table stat @@ -2021,7 +1990,7 @@ sysfn_terminate2: .table_status: cli cmp [application_table_status],0 - je .stf + je .stf sti call change_task jmp .table_status @@ -2030,7 +1999,7 @@ sysfn_terminate2: mov eax,ecx call pid_to_slot test eax,eax - jz .not_found + jz .not_found mov ecx,eax cli call sysfn_terminate @@ -2040,10 +2009,10 @@ sysfn_terminate2: ret .not_found: mov [application_table_status],0 - or dword [esp+32],-1 + or dword [esp+32],-1 ret -sysfn_activate: ; 18.3 = ACTIVATE WINDOW +sysfn_activate: ; 18.3 = ACTIVATE WINDOW cmp ecx,2 jb .nowindowactivate cmp ecx,[TASK_COUNT] @@ -2064,12 +2033,12 @@ sysfn_activate: ; 18.3 = ACTIVATE WINDOW .nowindowactivate: ret -sysfn_getidletime: ; 18.4 = GET IDLETIME +sysfn_getidletime: ; 18.4 = GET IDLETIME mov eax,[idleusesec] mov [esp+32], eax ret -sysfn_getcpuclock: ; 18.5 = GET TSC/SEC +sysfn_getcpuclock: ; 18.5 = GET TSC/SEC mov eax,[CPU_FREQ] mov [esp+32], eax ret @@ -2079,13 +2048,13 @@ sysfn_getcpuclock: ; 18.5 = GET TSC/SEC include 'blkdev/rdsave.inc' ;!!!!!!!!!!!!!!!!!!!!!!!! -sysfn_getactive: ; 18.7 = get active window +sysfn_getactive: ; 18.7 = get active window mov eax, [TASK_COUNT] movzx eax, word [WIN_POS + eax*2] mov [esp+32],eax ret -sysfn_sound_flag: ; 18.8 = get/set sound_flag +sysfn_sound_flag: ; 18.8 = get/set sound_flag cmp ecx,1 jne nogetsoundflag movzx eax,byte [sound_flag] ; get sound_flag @@ -2098,11 +2067,11 @@ sysfn_sound_flag: ; 18.8 = get/set sound_flag nosoundflag: ret -sysfn_minimize: ; 18.10 = minimize window +sysfn_minimize: ; 18.10 = minimize window mov [window_minimize],1 ret -sysfn_getdiskinfo: ; 18.11 = get disk info table +sysfn_getdiskinfo: ; 18.11 = get disk info table cmp ecx,1 jnz full_table small_table: @@ -2124,11 +2093,11 @@ sysfn_getdiskinfo: ; 18.11 = get disk info table rep movsd ret -sysfn_lastkey: ; 18.12 = return 0 (backward compatibility) - and dword [esp+32], 0 - ret +sysfn_lastkey: ; 18.12 = return 0 (backward compatibility) + and dword [esp+32], 0 + ret -sysfn_getversion: ; 18.13 = get kernel ID and version +sysfn_getversion: ; 18.13 = get kernel ID and version mov edi,ebx mov esi,version_inf mov ecx,version_end-version_inf @@ -2146,7 +2115,7 @@ sysfn_waitretrace: ; 18.14 = sys wait retrace and [esp+32],dword 0 ret -sysfn_centermouse: ; 18.15 = mouse centered +sysfn_centermouse: ; 18.15 = mouse centered call mouse_centered and [esp+32],dword 0 ret @@ -2211,14 +2180,14 @@ sysfn_pid_to_slot: sysfn_min_rest_window: pushad - mov eax, edx ; ebx - operating + mov eax, edx ; ebx - operating shr ecx, 1 jnc @f call pid_to_slot @@: - or eax, eax ; eax - number of slot + or eax, eax ; eax - number of slot jz .error - cmp eax, 255 ; varify maximal slot number + cmp eax, 255 ; varify maximal slot number ja .error movzx eax, word [WIN_STACK + eax*2] shr ecx, 1 @@ -2246,7 +2215,7 @@ uglobal screen_workarea RECT ;// mike.dld, 2006-29-01 ] window_minimize db 0 -sound_flag db 0 +sound_flag db 0 endg iglobal @@ -2258,27 +2227,27 @@ version_end: endg UID_NONE=0 -UID_MENUETOS=1 ;official -UID_KOLIBRI=2 ;russian +UID_MENUETOS=1 ;official +UID_KOLIBRI=2 ;russian sys_cachetodiskette: - cmp ebx, 1 - jne .no_floppy_a_save - mov [flp_number], 1 - jmp .save_image_on_floppy + cmp ebx, 1 + jne .no_floppy_a_save + mov [flp_number], 1 + jmp .save_image_on_floppy .no_floppy_a_save: - cmp ebx, 2 - jne .no_floppy_b_save - mov [flp_number], 2 + cmp ebx, 2 + jne .no_floppy_b_save + mov [flp_number], 2 .save_image_on_floppy: - call save_image - mov [esp + 32], dword 0 - cmp [FDC_Status], 0 - je .yes_floppy_save + call save_image + mov [esp + 32], dword 0 + cmp [FDC_Status], 0 + je .yes_floppy_save .no_floppy_b_save: - mov [esp + 32], dword 1 + mov [esp + 32], dword 1 .yes_floppy_save: - ret + ret uglobal ; bgrchanged dd 0x0 @@ -2288,19 +2257,19 @@ endg sys_background: - cmp ebx,1 ; BACKGROUND SIZE + cmp ebx,1 ; BACKGROUND SIZE jnz nosb1 cmp ecx,0 - je sbgrr + je sbgrr cmp edx,0 - je sbgrr + je sbgrr @@: - mov al, 1 - xchg [bgrlock], al - test al, al - jz @f - call change_task - jmp @b + mov al, 1 + xchg [bgrlock], al + test al, al + jz @f + call change_task + jmp @b @@: mov [BgrDataWidth],ecx mov [BgrDataHeight],edx @@ -2331,14 +2300,14 @@ sys_background: mov [img_background], eax .exit_mem: popad - mov [bgrlock], 0 + mov [bgrlock], 0 sbgrr: ret nosb1: - cmp ebx,2 ; SET PIXEL + cmp ebx,2 ; SET PIXEL jnz nosb2 mov ebx, [mem_BACKGROUND] @@ -2346,7 +2315,7 @@ nosb1: and ebx, -4096 sub ebx, 4 cmp ecx, ebx - ja @F + ja @F mov eax,[img_background] mov ebx,[eax+ecx] @@ -2358,7 +2327,7 @@ nosb1: ret nosb2: - cmp ebx,3 ; DRAW BACKGROUND + cmp ebx,3 ; DRAW BACKGROUND jnz nosb3 draw_background_temp: ; cmp [bgrchanged],1 ;0 @@ -2372,17 +2341,17 @@ draw_background_temp: ret nosb3: - cmp ebx,4 ; TILED / STRETCHED + cmp ebx,4 ; TILED / STRETCHED jnz nosb4 cmp ecx,[BgrDrawMode] - je nosb41 + je nosb41 mov [BgrDrawMode],ecx ; mov [bgrchanged],1 nosb41: ret nosb4: - cmp ebx,5 ; BLOCK MOVE TO BGR + cmp ebx,5 ; BLOCK MOVE TO BGR jnz nosb5 ; bughere mov eax, ecx @@ -2394,85 +2363,85 @@ draw_background_temp: ret nosb5: - cmp ebx, 6 - jnz nosb6 + cmp ebx, 6 + jnz nosb6 @@: - mov al, 1 - xchg [bgrlock], al - test al, al - jz @f - call change_task - jmp @b + mov al, 1 + xchg [bgrlock], al + test al, al + jz @f + call change_task + jmp @b @@: - mov eax, [CURRENT_TASK] - mov [bgrlockpid], eax - stdcall user_alloc, [mem_BACKGROUND] - mov [esp+32], eax - test eax, eax - jz .nomem - mov ebx, eax - shr ebx, 12 - or dword [page_tabs+(ebx-1)*4], DONT_FREE_BLOCK - mov esi, [img_background] - shr esi, 12 - mov ecx, [mem_BACKGROUND] - add ecx, 0xFFF - shr ecx, 12 + mov eax, [CURRENT_TASK] + mov [bgrlockpid], eax + stdcall user_alloc, [mem_BACKGROUND] + mov [esp+32], eax + test eax, eax + jz .nomem + mov ebx, eax + shr ebx, 12 + or dword [page_tabs+(ebx-1)*4], DONT_FREE_BLOCK + mov esi, [img_background] + shr esi, 12 + mov ecx, [mem_BACKGROUND] + add ecx, 0xFFF + shr ecx, 12 .z: - mov eax, [page_tabs+ebx*4] - test al, 1 - jz @f - call free_page + mov eax, [page_tabs+ebx*4] + test al, 1 + jz @f + call free_page @@: - mov eax, [page_tabs+esi*4] - or al, PG_UW - mov [page_tabs+ebx*4], eax - mov eax, ebx - shl eax, 12 - invlpg [eax] - inc ebx - inc esi - loop .z - ret + mov eax, [page_tabs+esi*4] + or al, PG_UW + mov [page_tabs+ebx*4], eax + mov eax, ebx + shl eax, 12 + invlpg [eax] + inc ebx + inc esi + loop .z + ret .nomem: - and [bgrlockpid], 0 - mov [bgrlock], 0 + and [bgrlockpid], 0 + mov [bgrlock], 0 nosb6: - cmp ebx, 7 - jnz nosb7 - cmp [bgrlock], 0 - jz .err - mov eax, [CURRENT_TASK] - cmp [bgrlockpid], eax - jnz .err - mov eax, ecx - mov ebx, ecx - shr eax, 12 - mov ecx, [page_tabs+(eax-1)*4] - test cl, USED_BLOCK+DONT_FREE_BLOCK - jz .err - jnp .err - push eax - shr ecx, 12 + cmp ebx, 7 + jnz nosb7 + cmp [bgrlock], 0 + jz .err + mov eax, [CURRENT_TASK] + cmp [bgrlockpid], eax + jnz .err + mov eax, ecx + mov ebx, ecx + shr eax, 12 + mov ecx, [page_tabs+(eax-1)*4] + test cl, USED_BLOCK+DONT_FREE_BLOCK + jz .err + jnp .err + push eax + shr ecx, 12 @@: - and dword [page_tabs+eax*4], 0 - mov edx, eax - shl edx, 12 - push eax - invlpg [edx] - pop eax - inc eax - loop @b - pop eax - and dword [page_tabs+(eax-1)*4], not DONT_FREE_BLOCK - stdcall user_free, ebx - mov [esp+32], eax - and [bgrlockpid], 0 - mov [bgrlock], 0 - ret + and dword [page_tabs+eax*4], 0 + mov edx, eax + shl edx, 12 + push eax + invlpg [edx] + pop eax + inc eax + loop @b + pop eax + and dword [page_tabs+(eax-1)*4], not DONT_FREE_BLOCK + stdcall user_free, ebx + mov [esp+32], eax + and [bgrlockpid], 0 + mov [bgrlock], 0 + ret .err: - and dword [esp+32], 0 - ret + and dword [esp+32], 0 + ret nosb7: ret @@ -2493,7 +2462,7 @@ align 4 sys_getbackground: - cmp eax,1 ; SIZE + cmp eax,1 ; SIZE jnz nogb1 mov eax,[BgrDataWidth] shl eax,16 @@ -2503,7 +2472,7 @@ sys_getbackground: nogb1: - cmp eax,2 ; PIXEL + cmp eax,2 ; PIXEL jnz nogb2 mov ecx, [mem_BACKGROUND] @@ -2511,7 +2480,7 @@ nogb1: and ecx, -4096 sub ecx, 4 cmp ebx, ecx - ja @F + ja @F mov eax,[img_background] mov eax,[ebx+eax] @@ -2522,7 +2491,7 @@ nogb1: ret nogb2: - cmp eax,4 ; TILED / STRETCHED + cmp eax,4 ; TILED / STRETCHED jnz nogb4 mov eax,[BgrDrawMode] nogb4: @@ -2533,71 +2502,71 @@ nogb1: align 4 sys_getkey: - mov [esp + 32],dword 1 - ; test main buffer - mov ebx, [CURRENT_TASK] ; TOP OF WINDOW STACK - movzx ecx, word [WIN_STACK + ebx * 2] - mov edx, [TASK_COUNT] - cmp ecx, edx - jne .finish - cmp [KEY_COUNT], byte 0 - je .finish - movzx eax, 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 - pop eax + mov [esp + 32],dword 1 + ; test main buffer + mov ebx, [CURRENT_TASK] ; TOP OF WINDOW STACK + movzx ecx, word [WIN_STACK + ebx * 2] + mov edx, [TASK_COUNT] + cmp ecx, edx + jne .finish + cmp [KEY_COUNT], byte 0 + je .finish + movzx eax, 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 + pop eax .ret_eax: - mov [esp + 32], eax - ret + mov [esp + 32], eax + ret .finish: ; test hotkeys buffer - mov ecx, hotkey_buffer + mov ecx, hotkey_buffer @@: - cmp [ecx], ebx - jz .found - add ecx, 8 - cmp ecx, hotkey_buffer + 120 * 8 - jb @b - ret + cmp [ecx], ebx + jz .found + add ecx, 8 + cmp ecx, hotkey_buffer + 120 * 8 + jb @b + ret .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 + 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_TASK] ; TOP OF WINDOW STACK - mov [esp + 32], dword 1 - movzx ecx, word [WIN_STACK + ebx * 2] - mov edx, [TASK_COUNT] ; less than 256 processes - cmp ecx, edx - jne .exit - movzx eax, byte [BTN_COUNT] - test eax, eax - jz .exit - mov eax, [BTN_BUFF] - shl eax, 8 + mov ebx, [CURRENT_TASK] ; TOP OF WINDOW STACK + mov [esp + 32], dword 1 + movzx ecx, word [WIN_STACK + ebx * 2] + mov edx, [TASK_COUNT] ; less than 256 processes + cmp ecx, edx + jne .exit + movzx eax, byte [BTN_COUNT] + test eax, eax + jz .exit + mov eax, [BTN_BUFF] + shl eax, 8 ; // Alver 22.06.2008 // { - mov al, byte [btn_down_determ] - and al,0xFE ; delete left button bit + mov al, byte [btn_down_determ] + and al,0xFE ; delete left button bit ; } \\ Alver \\ - mov [BTN_COUNT], byte 0 - mov [esp + 32], eax + mov [BTN_COUNT], byte 0 + mov [esp + 32], eax .exit: - ret + ret align 4 @@ -2615,78 +2584,78 @@ sys_cpuusage: ; +30 dword PID , process idenfification number ; - cmp ecx,-1 ; who am I ? + cmp ecx,-1 ; who am I ? jne .no_who_am_i mov ecx,[CURRENT_TASK] .no_who_am_i: - cmp ecx, max_processes - ja .nofillbuf + cmp ecx, max_processes + ja .nofillbuf ; +4: word: position of the window of thread in the window stack - mov ax, [WIN_STACK + ecx * 2] - mov [ebx+4], ax + mov ax, [WIN_STACK + ecx * 2] + mov [ebx+4], ax ; +6: word: number of the thread slot, which window has in the window stack ; position ecx (has no relation to the specific thread) - mov ax, [WIN_POS + ecx * 2] - mov [ebx+6], ax + mov ax, [WIN_POS + ecx * 2] + mov [ebx+6], ax - shl ecx, 5 + shl ecx, 5 ; +0: dword: memory usage - mov eax, [ecx+CURRENT_TASK+TASKDATA.cpu_usage] - mov [ebx], eax + mov eax, [ecx+CURRENT_TASK+TASKDATA.cpu_usage] + mov [ebx], eax ; +10: 11 bytes: name of the process - push ecx - lea eax, [ecx*8+SLOT_BASE+APPDATA.app_name] - add ebx, 10 - mov ecx, 11 - call memmove - pop ecx + push ecx + lea eax, [ecx*8+SLOT_BASE+APPDATA.app_name] + add ebx, 10 + mov ecx, 11 + call memmove + pop ecx ; +22: address of the process in memory ; +26: size of used memory - 1 - push edi - lea edi, [ebx+12] - xor eax, eax - mov edx, 0x100000*16 - cmp ecx, 1 shl 5 - je .os_mem - mov edx, [SLOT_BASE+ecx*8+APPDATA.mem_size] - mov eax, std_application_base_address + push edi + lea edi, [ebx+12] + xor eax, eax + mov edx, 0x100000*16 + cmp ecx, 1 shl 5 + je .os_mem + mov edx, [SLOT_BASE+ecx*8+APPDATA.mem_size] + mov eax, std_application_base_address .os_mem: - stosd - lea eax, [edx-1] - stosd + stosd + lea eax, [edx-1] + stosd ; +30: PID/TID - mov eax, [ecx+CURRENT_TASK+TASKDATA.pid] - stosd + mov eax, [ecx+CURRENT_TASK+TASKDATA.pid] + stosd ; window position and size - push esi - lea esi, [ecx + window_data + WDATA.box] - movsd - movsd - movsd - movsd + push esi + lea esi, [ecx + window_data + WDATA.box] + movsd + movsd + movsd + movsd ; Process state (+50) - mov eax, dword [ecx+CURRENT_TASK+TASKDATA.state] - stosd + mov eax, dword [ecx+CURRENT_TASK+TASKDATA.state] + stosd ; Window client area box - lea esi, [ecx*8 + SLOT_BASE + APPDATA.wnd_clientbox] - movsd - movsd - movsd - movsd + lea esi, [ecx*8 + SLOT_BASE + APPDATA.wnd_clientbox] + movsd + movsd + movsd + movsd ; Window state - mov al, [ecx+window_data+WDATA.fl_wstate] - stosb + mov al, [ecx+window_data+WDATA.fl_wstate] + stosb - pop esi - pop edi + pop esi + pop edi .nofillbuf: ; return number of processes @@ -2697,133 +2666,133 @@ sys_cpuusage: align 4 sys_clock: - cli + cli ; Mikhail Lisovin xx Jan 2005 - @@: mov al, 10 - out 0x70, al - in al, 0x71 - test al, al - jns @f - mov esi, 1 - call delay_ms - jmp @b + @@: mov al, 10 + out 0x70, al + in al, 0x71 + test al, al + jns @f + mov esi, 1 + call delay_ms + jmp @b @@: ; end Lisovin's fix - xor al,al ; seconds - out 0x70,al - in al,0x71 - movzx ecx,al - mov al,02 ; minutes - shl ecx,16 - out 0x70,al - in al,0x71 - movzx edx,al - mov al,04 ; hours - shl edx,8 - out 0x70,al - in al,0x71 - add ecx,edx - movzx edx,al - add ecx,edx - sti - mov [esp + 32], ecx - ret + xor al,al ; seconds + out 0x70,al + in al,0x71 + movzx ecx,al + mov al,02 ; minutes + shl ecx,16 + out 0x70,al + in al,0x71 + movzx edx,al + mov al,04 ; hours + shl edx,8 + out 0x70,al + in al,0x71 + add ecx,edx + movzx edx,al + add ecx,edx + sti + mov [esp + 32], ecx + ret align 4 sys_date: - cli - @@: mov al, 10 - out 0x70, al - in al, 0x71 - test al, al - jns @f - mov esi, 1 - call delay_ms - jmp @b + cli + @@: mov al, 10 + out 0x70, al + in al, 0x71 + test al, al + jns @f + mov esi, 1 + call delay_ms + jmp @b @@: - mov ch,0 - mov al,7 ; date - out 0x70,al - in al,0x71 - mov cl,al - mov al,8 ; month - shl ecx,16 - out 0x70,al - in al,0x71 - mov ch,al - mov al,9 ; year - out 0x70,al - in al,0x71 - mov cl,al - sti - mov [esp+32], ecx - ret + mov ch,0 + mov al,7 ; date + out 0x70,al + in al,0x71 + mov cl,al + mov al,8 ; month + shl ecx,16 + out 0x70,al + in al,0x71 + mov ch,al + mov al,9 ; year + out 0x70,al + in al,0x71 + mov cl,al + sti + mov [esp+32], ecx + ret ; redraw status sys_redrawstat: - cmp ebx, 1 - jne no_widgets_away - ; buttons away - mov ecx,[CURRENT_TASK] + cmp ebx, 1 + jne no_widgets_away + ; buttons away + mov ecx,[CURRENT_TASK] sys_newba2: - mov edi,[BTN_ADDR] - cmp [edi], dword 0 ; empty button list ? - je end_of_buttons_away - movzx ebx, word [edi] - inc ebx - mov eax,edi + mov edi,[BTN_ADDR] + cmp [edi], dword 0 ; empty button list ? + je end_of_buttons_away + movzx ebx, word [edi] + inc ebx + mov eax,edi sys_newba: - dec ebx - jz end_of_buttons_away + dec ebx + jz end_of_buttons_away - add eax, 0x10 - cmp cx, [eax] - jnz sys_newba + add eax, 0x10 + cmp cx, [eax] + jnz sys_newba - push eax ebx ecx - mov ecx,ebx - inc ecx - shl ecx, 4 - mov ebx, eax - add eax, 0x10 - call memmove - dec dword [edi] - pop ecx ebx eax + push eax ebx ecx + mov ecx,ebx + inc ecx + shl ecx, 4 + mov ebx, eax + add eax, 0x10 + call memmove + dec dword [edi] + pop ecx ebx eax - jmp sys_newba2 + jmp sys_newba2 end_of_buttons_away: - ret + ret no_widgets_away: - cmp ebx, 2 - jnz srl1 + cmp ebx, 2 + jnz srl1 - mov edx, [TASK_BASE] ; return whole screen draw area for this app - add edx, draw_data - CURRENT_TASK - mov [edx + RECT.left], 0 - mov [edx + RECT.top], 0 - mov eax, [Screen_Max_X] - mov [edx + RECT.right], eax - mov eax, [Screen_Max_Y] - mov [edx + RECT.bottom], eax + mov edx, [TASK_BASE] ; return whole screen draw area for this app + add edx, draw_data - CURRENT_TASK + mov [edx + RECT.left], 0 + mov [edx + RECT.top], 0 + mov eax, [Screen_Max_X] + mov [edx + RECT.right], eax + mov eax, [Screen_Max_Y] + mov [edx + RECT.bottom], eax - mov edi, [TASK_BASE] - or [edi - twdw + WDATA.fl_wdrawn], 1 ; no new position & buttons from app - call sys_window_mouse - ret + mov edi, [TASK_BASE] + or [edi - twdw + WDATA.fl_wdrawn], 1 ; no new position & buttons from app + call sys_window_mouse + ret srl1: - ret + ret sys_drawwindow: @@ -2845,7 +2814,7 @@ sys_drawwindow: jmp draw_window_caption.2 nosyswI: - cmp al,1 ; type II - only reserve area, no draw + cmp al,1 ; type II - only reserve area, no draw jne nosyswII inc [mouse_pause] call [disable_mouse] @@ -2857,7 +2826,7 @@ sys_drawwindow: ret nosyswII: - cmp al,2 ; type III - new style + cmp al,2 ; type III - new style jne nosyswIII inc [mouse_pause] call [disable_mouse] @@ -2870,9 +2839,9 @@ sys_drawwindow: jmp draw_window_caption.2 nosyswIII: - cmp al,3 ; type IV - skinned window - je draw_skin_window - cmp al,4 ; type V - skinned window not sized! {not_sized_skin_window} + cmp al,3 ; type IV - skinned window + je draw_skin_window + cmp al,4 ; type V - skinned window not sized! {not_sized_skin_window} jne nosyswV draw_skin_window: @@ -2897,180 +2866,180 @@ sys_drawwindow: draw_window_caption: - inc [mouse_pause] - call [disable_mouse] + inc [mouse_pause] + call [disable_mouse] - xor eax,eax - mov edx,[TASK_COUNT] - movzx edx,word[WIN_POS+edx*2] - cmp edx,[CURRENT_TASK] - jne @f - inc eax - @@: mov edx,[CURRENT_TASK] - shl edx,5 - add edx,window_data - movzx ebx,[edx+WDATA.fl_wstyle] - and bl,0x0F - cmp bl,3 - je .draw_caption_style_3 ;{for 3 and 4 style write caption} - cmp bl,4 - je .draw_caption_style_3 + xor eax,eax + mov edx,[TASK_COUNT] + movzx edx,word[WIN_POS+edx*2] + cmp edx,[CURRENT_TASK] + jne @f + inc eax + @@: mov edx,[CURRENT_TASK] + shl edx,5 + add edx,window_data + movzx ebx,[edx+WDATA.fl_wstyle] + and bl,0x0F + cmp bl,3 + je .draw_caption_style_3 ;{for 3 and 4 style write caption} + cmp bl,4 + je .draw_caption_style_3 - jmp .not_style_3 + jmp .not_style_3 .draw_caption_style_3: - push edx - call drawwindow_IV_caption - add esp,4 - jmp .2 + push edx + call drawwindow_IV_caption + add esp,4 + jmp .2 .not_style_3: - cmp bl,2 - jne .not_style_2 + cmp bl,2 + jne .not_style_2 - call drawwindow_III_caption - jmp .2 + call drawwindow_III_caption + jmp .2 .not_style_2: - cmp bl,0 - jne .2 + cmp bl,0 + jne .2 - call drawwindow_I_caption + call drawwindow_I_caption ;-------------------------------------------------------------- - .2: ;jmp @f - mov edi,[CURRENT_TASK] - shl edi,5 - test [edi+window_data+WDATA.fl_wstyle],WSTYLE_HASCAPTION - jz @f - mov edx,[edi*8+SLOT_BASE+APPDATA.wnd_caption] - or edx,edx - jz @f + .2: ;jmp @f + mov edi,[CURRENT_TASK] + shl edi,5 + test [edi+window_data+WDATA.fl_wstyle],WSTYLE_HASCAPTION + jz @f + mov edx,[edi*8+SLOT_BASE+APPDATA.wnd_caption] + or edx,edx + jz @f - movzx eax,[edi+window_data+WDATA.fl_wstyle] - and al,0x0F - cmp al,3 - je .skinned - cmp al,4 - je .skinned + movzx eax,[edi+window_data+WDATA.fl_wstyle] + and al,0x0F + cmp al,3 + je .skinned + cmp al,4 + je .skinned - jmp .not_skinned + jmp .not_skinned .skinned: - mov ebp,[edi+window_data+WDATA.box.left-2] - mov bp,word[edi+window_data+WDATA.box.top] - movzx eax,word[edi+window_data+WDATA.box.width] - sub ax,[_skinmargins.left] - sub ax,[_skinmargins.right] - push edx - cwde - cdq - mov ebx,6 - idiv ebx - pop edx - or eax,eax - js @f - mov esi,eax - mov ebx,dword[_skinmargins.left-2] - mov bx,word[_skinh] - sub bx,[_skinmargins.bottom] - sub bx,[_skinmargins.top] - sar bx,1 - adc bx,0 - add bx,[_skinmargins.top] - add bx,-3 - add ebx,ebp - jmp .dodraw + mov ebp,[edi+window_data+WDATA.box.left-2] + mov bp,word[edi+window_data+WDATA.box.top] + movzx eax,word[edi+window_data+WDATA.box.width] + sub ax,[_skinmargins.left] + sub ax,[_skinmargins.right] + push edx + cwde + cdq + mov ebx,6 + idiv ebx + pop edx + or eax,eax + js @f + mov esi,eax + mov ebx,dword[_skinmargins.left-2] + mov bx,word[_skinh] + sub bx,[_skinmargins.bottom] + sub bx,[_skinmargins.top] + sar bx,1 + adc bx,0 + add bx,[_skinmargins.top] + add bx,-3 + add ebx,ebp + jmp .dodraw .not_skinned: - cmp al,1 - je @f + cmp al,1 + je @f - mov ebp,[edi+window_data+WDATA.box.left-2] - mov bp,word[edi+window_data+WDATA.box.top] - movzx eax,word[edi+window_data+WDATA.box.width] - sub eax,16 - push edx - cwde - cdq - mov ebx,6 - idiv ebx - pop edx - or eax,eax - js @f - mov esi,eax - mov ebx,0x00080007 - add ebx,ebp + mov ebp,[edi+window_data+WDATA.box.left-2] + mov bp,word[edi+window_data+WDATA.box.top] + movzx eax,word[edi+window_data+WDATA.box.width] + sub eax,16 + push edx + cwde + cdq + mov ebx,6 + idiv ebx + pop edx + or eax,eax + js @f + mov esi,eax + mov ebx,0x00080007 + add ebx,ebp .dodraw: - mov ecx,[common_colours+16];0x00FFFFFF - or ecx, 0x80000000 - xor edi,edi + mov ecx,[common_colours+16];0x00FFFFFF + or ecx, 0x80000000 + xor edi,edi ; // Alver 22.06.2008 // { ; call dtext - call dtext_asciiz_esi + call dtext_asciiz_esi ; } \\ Alver \\ @@: ;-------------------------------------------------------------- - dec [mouse_pause] - call [draw_pointer] - ret + dec [mouse_pause] + call [draw_pointer] + ret iglobal align 4 window_topleft dd \ - 1, 21,\ ;type 0 - 0, 0,\ ;type 1 - 5, 20,\ ;type 2 - 5, ?,\ ;type 3 {set by skin} - 5, ? ;type 4 {set by skin} + 1, 21,\ ;type 0 + 0, 0,\ ;type 1 + 5, 20,\ ;type 2 + 5, ?,\ ;type 3 {set by skin} + 5, ? ;type 4 {set by skin} endg set_window_clientbox: - push eax ecx edi + push eax ecx edi - mov eax,[_skinh] - mov [window_topleft+4*7],eax - mov [window_topleft+4*9],eax + mov eax,[_skinh] + mov [window_topleft+4*7],eax + mov [window_topleft+4*9],eax - mov ecx,edi - sub edi,window_data - shl edi,3 - test [ecx+WDATA.fl_wstyle],WSTYLE_CLIENTRELATIVE - jz @f + mov ecx,edi + sub edi,window_data + shl edi,3 + test [ecx+WDATA.fl_wstyle],WSTYLE_CLIENTRELATIVE + jz @f - movzx eax,[ecx+WDATA.fl_wstyle] - and eax,0x0F - mov eax,[eax*8+window_topleft+0] - mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.left],eax - shl eax,1 - neg eax - add eax,[ecx+WDATA.box.width] - mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.width],eax + movzx eax,[ecx+WDATA.fl_wstyle] + and eax,0x0F + mov eax,[eax*8+window_topleft+0] + mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.left],eax + shl eax,1 + neg eax + add eax,[ecx+WDATA.box.width] + mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.width],eax - movzx eax,[ecx+WDATA.fl_wstyle] - and eax,0x0F - push [eax*8+window_topleft+0] - mov eax,[eax*8+window_topleft+4] - mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.top],eax - neg eax - sub eax,[esp] - add eax,[ecx+WDATA.box.height] - mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.height],eax - add esp,4 + movzx eax,[ecx+WDATA.fl_wstyle] + and eax,0x0F + push [eax*8+window_topleft+0] + mov eax,[eax*8+window_topleft+4] + mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.top],eax + neg eax + sub eax,[esp] + add eax,[ecx+WDATA.box.height] + mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.height],eax + add esp,4 - pop edi ecx eax - ret + pop edi ecx eax + ret @@: - xor eax,eax - mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.left],eax - mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.top],eax - mov eax,[ecx+WDATA.box.width] - mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.width],eax - mov eax,[ecx+WDATA.box.height] - mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.height],eax + xor eax,eax + mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.left],eax + mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.top],eax + mov eax,[ecx+WDATA.box.width] + mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.width],eax + mov eax,[ecx+WDATA.box.height] + mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.height],eax - pop edi ecx eax - ret + pop edi ecx eax + ret sys_set_window: @@ -3106,39 +3075,39 @@ sys_set_window: call set_window_clientbox - push ecx esi edi ; save for window fullscreen/resize + push ecx esi edi ; save for window fullscreen/resize ;mov esi,edi - mov cl, [edi+WDATA.fl_wstyle] - mov eax, [edi+WDATA.cl_frames] + mov cl, [edi+WDATA.fl_wstyle] + mov eax, [edi+WDATA.cl_frames] sub edi,window_data shl edi,3 add edi,SLOT_BASE - and cl,0x0F - mov [edi+APPDATA.wnd_caption],0 - cmp cl,3 - je set_APPDATA_wnd_caption - cmp cl,4 ; {SPraid.simba} - je set_APPDATA_wnd_caption + and cl,0x0F + mov [edi+APPDATA.wnd_caption],0 + cmp cl,3 + je set_APPDATA_wnd_caption + cmp cl,4 ; {SPraid.simba} + je set_APPDATA_wnd_caption - jmp @f + jmp @f set_APPDATA_wnd_caption: - mov [edi+APPDATA.wnd_caption],eax - @@: mov esi,[esp+0] + mov [edi+APPDATA.wnd_caption],eax + @@: mov esi,[esp+0] add edi, APPDATA.saved_box - movsd - movsd - movsd - movsd + movsd + movsd + movsd + movsd pop edi esi ecx - mov esi, [CURRENT_TASK] - movzx esi, word [WIN_STACK+esi*2] - lea esi, [WIN_POS+esi*2] - call waredraw + mov esi, [CURRENT_TASK] + movzx esi, word [WIN_STACK+esi*2] + lea esi, [WIN_POS+esi*2] + call waredraw ;;; mov ebx, 1 ;;; call delay_hs @@ -3150,11 +3119,11 @@ sys_set_window: add edx, ebx call calculatescreen - mov [KEY_COUNT],byte 0 ; empty keyboard buffer - mov [BTN_COUNT],byte 0 ; empty button buffer + mov [KEY_COUNT],byte 0 ; empty keyboard buffer + mov [BTN_COUNT],byte 0 ; empty button buffer newd: - mov [edi+WDATA.fl_redraw],byte 0 ; no redraw + mov [edi+WDATA.fl_redraw],byte 0 ; no redraw mov edx,edi ret @@ -3162,18 +3131,18 @@ sys_set_window: syscall_windowsettings: .set_window_caption: - dec eax ; subfunction #1 - set window caption - jnz .get_window_caption + dec eax ; subfunction #1 - set window caption + jnz .get_window_caption - ; NOTE: only window owner thread can set its caption, - ; so there's no parameter for PID/TID + ; NOTE: only window owner thread can set its caption, + ; so there's no parameter for PID/TID - mov edi,[CURRENT_TASK] - shl edi,5 + mov edi,[CURRENT_TASK] + shl edi,5 - ; have to check if caption is within application memory limit - ; check is trivial, and if application resizes its memory, - ; caption still can become over bounds + ; have to check if caption is within application memory limit + ; check is trivial, and if application resizes its memory, + ; caption still can become over bounds ; diamond, 31.10.2006: check removed because with new memory manager ; there can be valid data after APPDATA.mem_size bound ; mov ecx,[edi*8+SLOT_BASE+APPDATA.mem_size] @@ -3181,115 +3150,115 @@ syscall_windowsettings: ; cmp ebx,ecx ; ja .exit_fail - mov [edi*8+SLOT_BASE+APPDATA.wnd_caption],ebx - or [edi+window_data+WDATA.fl_wstyle],WSTYLE_HASCAPTION + mov [edi*8+SLOT_BASE+APPDATA.wnd_caption],ebx + or [edi+window_data+WDATA.fl_wstyle],WSTYLE_HASCAPTION - call draw_window_caption + call draw_window_caption - xor eax,eax ; eax = 0 (success) - ret + xor eax,eax ; eax = 0 (success) + ret .get_window_caption: - dec eax ; subfunction #2 - get window caption - jnz .exit_fail + dec eax ; subfunction #2 - get window caption + jnz .exit_fail - ; not implemented yet + ; not implemented yet .exit_fail: - xor eax,eax - inc eax ; eax = 1 (fail) - ret + xor eax,eax + inc eax ; eax = 1 (fail) + ret sys_window_move: - mov edi,[CURRENT_TASK] - shl edi,5 - add edi,window_data + mov edi,[CURRENT_TASK] + shl edi,5 + add edi,window_data - test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED - jnz .window_move_return + test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED + jnz .window_move_return - push dword [edi + WDATA.box.left] ; save old coordinates - push dword [edi + WDATA.box.top] - push dword [edi + WDATA.box.width] - push dword [edi + WDATA.box.height] + push dword [edi + WDATA.box.left] ; save old coordinates + push dword [edi + WDATA.box.top] + push dword [edi + WDATA.box.width] + push dword [edi + WDATA.box.height] - cmp eax,-1 ; set new position and size - je .no_x_reposition - mov [edi + WDATA.box.left], eax + cmp eax,-1 ; set new position and size + je .no_x_reposition + mov [edi + WDATA.box.left], eax .no_x_reposition: - cmp ebx,-1 - je .no_y_reposition - mov [edi + WDATA.box.top], ebx + cmp ebx,-1 + je .no_y_reposition + mov [edi + WDATA.box.top], ebx .no_y_reposition: - test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP - jnz .no_y_resizing + test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP + jnz .no_y_resizing - cmp ecx,-1 - je .no_x_resizing - mov [edi + WDATA.box.width], ecx + cmp ecx,-1 + je .no_x_resizing + mov [edi + WDATA.box.width], ecx .no_x_resizing: - cmp edx,-1 - je .no_y_resizing - mov [edi + WDATA.box.height], edx + cmp edx,-1 + je .no_y_resizing + mov [edi + WDATA.box.height], edx .no_y_resizing: - call check_window_position - call set_window_clientbox + call check_window_position + call set_window_clientbox - pushad ; save for window fullscreen/resize - mov esi,edi - sub edi,window_data - shr edi,5 - shl edi,8 - add edi, SLOT_BASE + APPDATA.saved_box - mov ecx,4 - cld - rep movsd - popad + pushad ; save for window fullscreen/resize + mov esi,edi + sub edi,window_data + shr edi,5 + shl edi,8 + add edi, SLOT_BASE + APPDATA.saved_box + mov ecx,4 + cld + rep movsd + popad - pushad ; calculcate screen at new position - mov eax, [edi + WDATA.box.left] - mov ebx, [edi + WDATA.box.top] - mov ecx, [edi + WDATA.box.width] - mov edx, [edi + WDATA.box.height] - add ecx,eax - add edx,ebx + pushad ; calculcate screen at new position + mov eax, [edi + WDATA.box.left] + mov ebx, [edi + WDATA.box.top] + mov ecx, [edi + WDATA.box.width] + mov edx, [edi + WDATA.box.height] + add ecx,eax + add edx,ebx - call calculatescreen - popad + call calculatescreen + popad - pop edx ; calculcate screen at old position - pop ecx - pop ebx - pop eax - add ecx,eax - add edx,ebx - mov [dlx],eax ; save for drawlimits - mov [dly],ebx - mov [dlxe],ecx - mov [dlye],edx - call calculatescreen + pop edx ; calculcate screen at old position + pop ecx + pop ebx + pop eax + add ecx,eax + add edx,ebx + mov [dlx],eax ; save for drawlimits + mov [dly],ebx + mov [dlxe],ecx + mov [dlye],edx + call calculatescreen - mov [edi + WDATA.fl_redraw], 1 ; flag the process as redraw + mov [edi + WDATA.fl_redraw], 1 ; flag the process as redraw - mov eax,edi ; redraw screen at old position - xor esi,esi - call redrawscreen + mov eax,edi ; redraw screen at old position + xor esi,esi + call redrawscreen - mov [DONT_DRAW_MOUSE],byte 0 ; mouse pointer - mov [MOUSE_BACKGROUND],byte 0 ; no mouse under - mov [MOUSE_DOWN],byte 0 ; react to mouse up/down + mov [DONT_DRAW_MOUSE],byte 0 ; mouse pointer + mov [MOUSE_BACKGROUND],byte 0 ; no mouse under + mov [MOUSE_DOWN],byte 0 ; react to mouse up/down - call [draw_pointer] + call [draw_pointer] - mov [window_move_pr],0 + mov [window_move_pr],0 .window_move_return: - ret + ret uglobal window_move_pr dd 0x0 @@ -3361,22 +3330,22 @@ ret wrmsr_instr: ;now counter in ecx ;(edx:eax) esi:edi => edx:esi - ; Fast Call MSR can't be destroy - ; Но MSR_AMD_EFER можно изменять, т.к. в этом регистре лиш - ; включаются/выключаются расширенные возможности - cmp ecx, MSR_SYSENTER_CS - je @f - cmp ecx, MSR_SYSENTER_ESP - je @f - cmp ecx, MSR_SYSENTER_EIP - je @f - cmp ecx, MSR_AMD_STAR - je @f + ; Fast Call MSR can't be destroy + ; Но MSR_AMD_EFER можно изменять, т.к. в этом регистре лиш + ; включаются/выключаются расширенные возможности + cmp ecx, MSR_SYSENTER_CS + je @f + cmp ecx, MSR_SYSENTER_ESP + je @f + cmp ecx, MSR_SYSENTER_EIP + je @f + cmp ecx, MSR_AMD_STAR + je @f - mov eax, esi - wrmsr - ; mov [esp + 36], eax - ; mov [esp + 24], edx ;ret in ebx? + mov eax, esi + wrmsr + ; mov [esp + 36], eax + ; mov [esp + 24], edx ;ret in ebx? @@: ret @@ -3418,27 +3387,27 @@ ret ; check if pixel is allowed to be drawn checkpixel: - push eax edx + push eax edx - mov edx,[Screen_Max_X] ; screen x size - inc edx - imul edx, ebx - mov dl, [eax+edx+display_data] ; lea eax, [...] + mov edx,[Screen_Max_X] ; screen x size + inc edx + imul edx, ebx + mov dl, [eax+edx+display_data] ; lea eax, [...] - xor ecx, ecx - mov eax, [CURRENT_TASK] - cmp al, dl - setne cl + xor ecx, ecx + mov eax, [CURRENT_TASK] + cmp al, dl + setne cl - pop edx eax - ret + pop edx eax + ret iglobal cpustring db 'CPU',0 endg uglobal -background_defined db 0 ; diamond, 11.04.2006 +background_defined db 0 ; diamond, 11.04.2006 endg align 4 @@ -3449,8 +3418,8 @@ checkmisc: cmp [ctrl_alt_del], 1 jne nocpustart - mov ebp, cpustring - call fs_execute_from_sysdir + mov ebp, cpustring + call fs_execute_from_sysdir mov [ctrl_alt_del], 0 @@ -3459,24 +3428,24 @@ nocpustart: jne mouse_not_active mov [mouse_active], 0 xor edi, edi - mov ecx, [TASK_COUNT] + mov ecx, [TASK_COUNT] set_mouse_event: add edi, 256 - or [edi+SLOT_BASE+APPDATA.event_mask], dword 100000b + or [edi+SLOT_BASE+APPDATA.event_mask], dword 100000b loop set_mouse_event mouse_not_active: - cmp [REDRAW_BACKGROUND],byte 0 ; background update ? - jz nobackgr + cmp [REDRAW_BACKGROUND],byte 0 ; background update ? + jz nobackgr cmp [background_defined], 0 - jz nobackgr + jz nobackgr cmp [REDRAW_BACKGROUND], byte 2 jnz no_set_bgr_event xor edi, edi - mov ecx, [TASK_COUNT] + mov ecx, [TASK_COUNT] set_bgr_event: add edi, 256 - or [edi+SLOT_BASE+APPDATA.event_mask], 16 + or [edi+SLOT_BASE+APPDATA.event_mask], 16 loop set_bgr_event no_set_bgr_event: ; mov [draw_data+32 + RECT.left],dword 0 @@ -3494,7 +3463,7 @@ nobackgr: ; system shutdown request cmp [SYS_SHUTDOWN],byte 0 - je noshutdown + je noshutdown mov edx,[shutdown_processes] @@ -3515,21 +3484,21 @@ markz: call [disable_mouse] dec byte [SYS_SHUTDOWN] - je system_shutdown + je system_shutdown noshutdown: - mov eax,[TASK_COUNT] ; termination + mov eax,[TASK_COUNT] ; termination mov ebx,TASK_DATA+TASKDATA.state mov esi,1 newct: mov cl,[ebx] cmp cl,byte 3 - jz terminate + jz terminate cmp cl,byte 4 - jz terminate + jz terminate add ebx,0x20 inc esi @@ -3543,152 +3512,152 @@ redrawscreen: ; eax , if process window_data base is eax, do not set flag/limits - pushad - push eax + pushad + push eax ;;; mov ebx,2 ;;; call delay_hs - ;mov ecx,0 ; redraw flags for apps - xor ecx,ecx + ;mov ecx,0 ; redraw flags for apps + xor ecx,ecx newdw2: - inc ecx - push ecx + inc ecx + push ecx - mov eax,ecx - shl eax,5 - add eax,window_data + mov eax,ecx + shl eax,5 + add eax,window_data - cmp eax,[esp+4] - je not_this_task - ; check if window in redraw area - mov edi,eax + cmp eax,[esp+4] + je not_this_task + ; check if window in redraw area + mov edi,eax - cmp ecx,1 ; limit for background - jz bgli + cmp ecx,1 ; limit for background + jz bgli - mov eax, [edi + WDATA.box.left] - mov ebx, [edi + WDATA.box.top] - mov ecx, [edi + WDATA.box.width] - mov edx, [edi + WDATA.box.height] - add ecx,eax - add edx,ebx + mov eax, [edi + WDATA.box.left] + mov ebx, [edi + WDATA.box.top] + mov ecx, [edi + WDATA.box.width] + mov edx, [edi + WDATA.box.height] + add ecx,eax + add edx,ebx - mov ecx,[dlye] ; ecx = area y end ebx = window y start - cmp ecx,ebx - jb ricino + mov ecx,[dlye] ; ecx = area y end ebx = window y start + cmp ecx,ebx + jb ricino - mov ecx,[dlxe] ; ecx = area x end eax = window x start - cmp ecx,eax - jb ricino + mov ecx,[dlxe] ; ecx = area x end eax = window x start + cmp ecx,eax + jb ricino - mov eax, [edi + WDATA.box.left] - mov ebx, [edi + WDATA.box.top] - mov ecx, [edi + WDATA.box.width] - mov edx, [edi + WDATA.box.height] - add ecx, eax - add edx, ebx + mov eax, [edi + WDATA.box.left] + mov ebx, [edi + WDATA.box.top] + mov ecx, [edi + WDATA.box.width] + mov edx, [edi + WDATA.box.height] + add ecx, eax + add edx, ebx - mov eax,[dly] ; eax = area y start edx = window y end - cmp edx,eax - jb ricino + mov eax,[dly] ; eax = area y start edx = window y end + cmp edx,eax + jb ricino - mov eax,[dlx] ; eax = area x start ecx = window x end - cmp ecx,eax - jb ricino + mov eax,[dlx] ; eax = area x start ecx = window x end + cmp ecx,eax + jb ricino - bgli: + bgli: - cmp ecx,1 - jnz .az - mov al,[REDRAW_BACKGROUND] - cmp al,2 - jz newdw8 - test al,al - jz .az - lea eax,[edi+draw_data-window_data] - mov ebx,[dlx] - cmp ebx,[eax+RECT.left] - jae @f - mov [eax+RECT.left],ebx - @@: - mov ebx,[dly] - cmp ebx,[eax+RECT.top] - jae @f - mov [eax+RECT.top],ebx - @@: - mov ebx,[dlxe] - cmp ebx,[eax+RECT.right] - jbe @f - mov [eax+RECT.right],ebx - @@: - mov ebx,[dlye] - cmp ebx,[eax+RECT.bottom] - jbe @f - mov [eax+RECT.bottom],ebx - @@: - jmp newdw8 - .az: + cmp ecx,1 + jnz .az + mov al,[REDRAW_BACKGROUND] + cmp al,2 + jz newdw8 + test al,al + jz .az + lea eax,[edi+draw_data-window_data] + mov ebx,[dlx] + cmp ebx,[eax+RECT.left] + jae @f + mov [eax+RECT.left],ebx + @@: + mov ebx,[dly] + cmp ebx,[eax+RECT.top] + jae @f + mov [eax+RECT.top],ebx + @@: + mov ebx,[dlxe] + cmp ebx,[eax+RECT.right] + jbe @f + mov [eax+RECT.right],ebx + @@: + mov ebx,[dlye] + cmp ebx,[eax+RECT.bottom] + jbe @f + mov [eax+RECT.bottom],ebx + @@: + jmp newdw8 + .az: - mov eax,edi - add eax,draw_data-window_data + mov eax,edi + add eax,draw_data-window_data - mov ebx,[dlx] ; set limits - mov [eax + RECT.left], ebx - mov ebx,[dly] - mov [eax + RECT.top], ebx - mov ebx,[dlxe] - mov [eax + RECT.right], ebx - mov ebx,[dlye] - mov [eax + RECT.bottom], ebx + mov ebx,[dlx] ; set limits + mov [eax + RECT.left], ebx + mov ebx,[dly] + mov [eax + RECT.top], ebx + mov ebx,[dlxe] + mov [eax + RECT.right], ebx + mov ebx,[dlye] + mov [eax + RECT.bottom], ebx - sub eax,draw_data-window_data + sub eax,draw_data-window_data - cmp dword [esp],1 - jne nobgrd - mov byte [REDRAW_BACKGROUND], 1 + cmp dword [esp],1 + jne nobgrd + mov byte [REDRAW_BACKGROUND], 1 newdw8: nobgrd: - mov [eax + WDATA.fl_redraw],byte 1 ; mark as redraw + mov [eax + WDATA.fl_redraw],byte 1 ; mark as redraw ricino: not_this_task: - pop ecx + pop ecx - cmp ecx,[TASK_COUNT] - jle newdw2 + cmp ecx,[TASK_COUNT] + jle newdw2 - pop eax - popad + pop eax + popad - ret + ret calculatebackground: ; background - ; all black + ; all black - mov edi, [img_background] ;IMG_BACKGROUND ; set background to black - xor eax, eax - mov ecx, 1023 ;0x0fff00 / 4 - cld - rep stosd + mov edi, [img_background] ;IMG_BACKGROUND ; set background to black + xor eax, eax + mov ecx, 1023 ;0x0fff00 / 4 + cld + rep stosd - mov edi,display_data ; set os to use all pixels - mov eax,0x01010101 - mov ecx,1280*1024 / 4 - rep stosd + mov edi,display_data ; set os to use all pixels + mov eax,0x01010101 + mov ecx,1280*1024 / 4 + rep stosd - mov byte [REDRAW_BACKGROUND], 0 ; do not draw background! + mov byte [REDRAW_BACKGROUND], 0 ; do not draw background! - ret + ret uglobal - imax dd 0x0 + imax dd 0x0 endg @@ -3696,63 +3665,63 @@ endg delay_ms: ; delay in 1/1000 sec - push eax - push ecx + push eax + push ecx - mov ecx,esi - ; - imul ecx, 33941 - shr ecx, 9 - ; + mov ecx,esi + ; + imul ecx, 33941 + shr ecx, 9 + ; - in al,0x61 - and al,0x10 - mov ah,al - cld + in al,0x61 + and al,0x10 + mov ah,al + cld - cnt1: in al,0x61 - and al,0x10 - cmp al,ah - jz cnt1 + cnt1: in al,0x61 + and al,0x10 + cmp al,ah + jz cnt1 - mov ah,al - loop cnt1 + mov ah,al + loop cnt1 - pop ecx - pop eax + pop ecx + pop eax - ret + ret set_app_param: - mov edi, [TASK_BASE] - mov [edi + TASKDATA.event_mask], ebx - ret + mov edi, [TASK_BASE] + mov [edi + TASKDATA.event_mask], ebx + ret delay_hs: ; delay in 1/100 secs ; ebx = delay time - push ecx - push edx + push ecx + push edx - mov edx,[timer_ticks] + mov edx,[timer_ticks] newtic: - mov ecx,[timer_ticks] - sub ecx,edx - cmp ecx,ebx - jae zerodelay + mov ecx,[timer_ticks] + sub ecx,edx + cmp ecx,ebx + jae zerodelay - call change_task + call change_task - jmp newtic + jmp newtic zerodelay: - pop edx - pop ecx + pop edx + pop ecx - ret + ret memmove: ; memory move in bytes @@ -3770,14 +3739,14 @@ memmove: ; memory move in bytes mov esi, eax test ecx, not 11b - jz @f + jz @f push ecx shr ecx, 2 rep movsd pop ecx and ecx, 11b - jz .finish + jz .finish @@: rep movsb @@ -3846,7 +3815,7 @@ sys_programirq: jae .not_owner mov edi, [eax + TASKDATA.pid] cmp edi, [irq_owner + 4 * ecx] - je .spril1 + je .spril1 .not_owner: xor ecx, ecx inc ecx @@ -3869,11 +3838,11 @@ sys_programirq: align 4 get_irq_data: - movzx esi, bh ; save number of subfunction, if bh = 1, return data size, otherwise, read data + movzx esi, bh ; save number of subfunction, if bh = 1, return data size, otherwise, read data xor bh, bh cmp ebx, 16 jae .not_owner - mov edx, [4 * ebx + irq_owner] ; check for irq owner + mov edx, [4 * ebx + irq_owner] ; check for irq owner mov eax,[TASK_BASE] @@ -3887,28 +3856,28 @@ get_irq_data: gidril1: shl ebx, 12 - lea eax, [ebx + IRQ_SAVE] ; calculate address of the beginning of buffer + 0x0 - data size - mov edx, [eax] ; + 0x4 - data offset + lea eax, [ebx + IRQ_SAVE] ; calculate address of the beginning of buffer + 0x0 - data size + mov edx, [eax] ; + 0x4 - data offset dec esi jz gid1 - test edx, edx ; check if buffer is empty + test edx, edx ; check if buffer is empty jz gid1 mov ebx, [eax + 0x4] mov edi, ecx - mov ecx, 4000 ; buffer size, used frequently + mov ecx, 4000 ; buffer size, used frequently - cmp ebx, ecx ; check for the end of buffer, if end of buffer, begin cycle again + cmp ebx, ecx ; check for the end of buffer, if end of buffer, begin cycle again jb @f xor ebx, ebx @@: - lea esi, [ebx + edx] ; calculate data size and offset + lea esi, [ebx + edx] ; calculate data size and offset cld - cmp esi, ecx ; if greater than the buffer size, begin cycle again + cmp esi, ecx ; if greater than the buffer size, begin cycle again jbe @f sub ecx, ebx @@ -3925,11 +3894,11 @@ get_irq_data: rep movsb mov edx, [eax] - mov [eax], ecx ; set data size to zero - mov [eax + 0x4], ebx ; set data offset + mov [eax], ecx ; set data size to zero + mov [eax + 0x4], ebx ; set data offset gid1: - mov [esp+32], edx ; eax + mov [esp+32], edx ; eax ret @@ -3948,7 +3917,7 @@ set_io_access_rights: ; mov ebx,1 ; shl ebx,cl - cmp ebp,0 ; enable access - ebp = 0 + cmp ebp,0 ; enable access - ebp = 0 jne siar1 ; not ebx @@ -3979,14 +3948,14 @@ r_f_port_area: pushad - cmp ebx,ecx ; beginning > end ? + cmp ebx,ecx ; beginning > end ? ja rpal1 cmp ecx,65536 jae rpal1 mov esi,[RESERVED_PORTS] - test esi,esi ; no reserved areas ? + test esi,esi ; no reserved areas ? je rpal2 - cmp esi,255 ; max reserved + cmp esi,255 ; max reserved jae rpal1 rpal3: mov edi,esi @@ -4014,7 +3983,7 @@ r_f_port_area: ; enable port access at port IO map cli - pushad ; start enable io map + pushad ; start enable io map cmp ecx,65536 ;16384 jae no_unmask_io ; jge @@ -4025,7 +3994,7 @@ r_f_port_area: pushad - xor ebp,ebp ; enable - eax = port + xor ebp,ebp ; enable - eax = port call set_io_access_rights popad @@ -4036,7 +4005,7 @@ r_f_port_area: no_unmask_io: - popad ; end enable io map + popad ; end enable io map sti mov edi,[RESERVED_PORTS] @@ -4096,7 +4065,7 @@ free_port_area: ; disable port access at port IO map - pushad ; start disable io map + pushad ; start disable io map cmp ecx,65536 ;16384 jge no_mask_io @@ -4107,7 +4076,7 @@ free_port_area: pushad - mov ebp,1 ; disable - eax = port + mov ebp,1 ; disable - eax = port call set_io_access_rights popad @@ -4118,7 +4087,7 @@ free_port_area: no_mask_io: - popad ; end disable io map + popad ; end disable io map xor eax, eax ret @@ -4212,7 +4181,7 @@ drawbackground: align 4 -syscall_putimage: ; PutImage +syscall_putimage: ; PutImage sys_putimage: test ecx,0x80008000 jnz .exit @@ -4223,40 +4192,40 @@ sys_putimage: .exit: ret @@: - mov edi,[current_slot] - add dx,word[edi+APPDATA.wnd_clientbox.top] - rol edx,16 - add dx,word[edi+APPDATA.wnd_clientbox.left] - rol edx,16 + mov edi,[current_slot] + add dx,word[edi+APPDATA.wnd_clientbox.top] + rol edx,16 + add dx,word[edi+APPDATA.wnd_clientbox.left] + rol edx,16 .forced: - push ebp esi 0 - mov ebp, putimage_get24bpp - mov esi, putimage_init24bpp + push ebp esi 0 + mov ebp, putimage_get24bpp + mov esi, putimage_init24bpp sys_putimage_bpp: ; call [disable_mouse] ; this will be done in xxx_putimage ; mov eax, vga_putimage - cmp [SCR_MODE], word 0x12 - jz @f ;.doit - mov eax, vesa12_putimage - cmp [SCR_MODE], word 0100000000000000b - jae @f - cmp [SCR_MODE], word 0x13 - jnz .doit + cmp [SCR_MODE], word 0x12 + jz @f ;.doit + mov eax, vesa12_putimage + cmp [SCR_MODE], word 0100000000000000b + jae @f + cmp [SCR_MODE], word 0x13 + jnz .doit @@: - mov eax, vesa20_putimage + mov eax, vesa20_putimage .doit: - inc [mouse_pause] - call eax - dec [mouse_pause] - pop ebp esi ebp - jmp [draw_pointer] + inc [mouse_pause] + call eax + dec [mouse_pause] + pop ebp esi ebp + jmp [draw_pointer] syscall_putimage_palette: - mov edi, esi - mov esi, edx - mov edx, ecx - mov ecx, ebx - mov ebx, eax + mov edi, esi + mov esi, edx + mov edx, ecx + mov ecx, ebx + mov ebx, eax sys_putimage_palette: ; ebx = pointer to image ; ecx = [xsize]*65536 + [ysize] @@ -4264,282 +4233,282 @@ sys_putimage_palette: ; esi = number of bits per pixel, must be 8, 24 or 32 ; edi = pointer to palette ; ebp = row delta - mov eax, [CURRENT_TASK] - shl eax, 8 - add dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.top] - rol edx, 16 - add dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.left] - rol edx, 16 + mov eax, [CURRENT_TASK] + shl eax, 8 + add dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.top] + rol edx, 16 + add dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.left] + rol edx, 16 .forced: - cmp esi, 1 - jnz @f - push edi - mov eax, [edi+4] - sub eax, [edi] - push eax - push dword [edi] - push 0ffffff80h - mov edi, esp - call put_mono_image - add esp, 12 - pop edi - ret + cmp esi, 1 + jnz @f + push edi + mov eax, [edi+4] + sub eax, [edi] + push eax + push dword [edi] + push 0ffffff80h + mov edi, esp + call put_mono_image + add esp, 12 + pop edi + ret @@: - cmp esi, 2 - jnz @f - push edi - push 0ffffff80h - mov edi, esp - call put_2bit_image - pop eax - pop edi - ret + cmp esi, 2 + jnz @f + push edi + push 0ffffff80h + mov edi, esp + call put_2bit_image + pop eax + pop edi + ret @@: - cmp esi, 4 - jnz @f - push edi - push 0ffffff80h - mov edi, esp - call put_4bit_image - pop eax - pop edi - ret + cmp esi, 4 + jnz @f + push edi + push 0ffffff80h + mov edi, esp + call put_4bit_image + pop eax + pop edi + ret @@: - push ebp esi ebp - cmp esi, 8 - jnz @f - mov ebp, putimage_get8bpp - mov esi, putimage_init8bpp - jmp sys_putimage_bpp + push ebp esi ebp + cmp esi, 8 + jnz @f + mov ebp, putimage_get8bpp + mov esi, putimage_init8bpp + jmp sys_putimage_bpp @@: - cmp esi, 15 - jnz @f - mov ebp, putimage_get15bpp - mov esi, putimage_init15bpp - jmp sys_putimage_bpp + cmp esi, 15 + jnz @f + mov ebp, putimage_get15bpp + mov esi, putimage_init15bpp + jmp sys_putimage_bpp @@: - cmp esi, 16 - jnz @f - mov ebp, putimage_get16bpp - mov esi, putimage_init16bpp - jmp sys_putimage_bpp + cmp esi, 16 + jnz @f + mov ebp, putimage_get16bpp + mov esi, putimage_init16bpp + jmp sys_putimage_bpp @@: - cmp esi, 24 - jnz @f - mov ebp, putimage_get24bpp - mov esi, putimage_init24bpp - jmp sys_putimage_bpp + cmp esi, 24 + jnz @f + mov ebp, putimage_get24bpp + mov esi, putimage_init24bpp + jmp sys_putimage_bpp @@: - cmp esi, 32 - jnz @f - mov ebp, putimage_get32bpp - mov esi, putimage_init32bpp - jmp sys_putimage_bpp + cmp esi, 32 + jnz @f + mov ebp, putimage_get32bpp + mov esi, putimage_init32bpp + jmp sys_putimage_bpp @@: - pop ebp esi ebp - ret + pop ebp esi ebp + ret put_mono_image: - push ebp esi ebp - mov ebp, putimage_get1bpp - mov esi, putimage_init1bpp - jmp sys_putimage_bpp + push ebp esi ebp + mov ebp, putimage_get1bpp + mov esi, putimage_init1bpp + jmp sys_putimage_bpp put_2bit_image: - push ebp esi ebp - mov ebp, putimage_get2bpp - mov esi, putimage_init2bpp - jmp sys_putimage_bpp + push ebp esi ebp + mov ebp, putimage_get2bpp + mov esi, putimage_init2bpp + jmp sys_putimage_bpp put_4bit_image: - push ebp esi ebp - mov ebp, putimage_get4bpp - mov esi, putimage_init4bpp - jmp sys_putimage_bpp + push ebp esi ebp + mov ebp, putimage_get4bpp + mov esi, putimage_init4bpp + jmp sys_putimage_bpp putimage_init24bpp: - lea eax, [eax*3] + lea eax, [eax*3] putimage_init8bpp: - ret + ret align 16 putimage_get24bpp: - movzx eax, byte [esi+2] - shl eax, 16 - mov ax, [esi] - add esi, 3 - ret 4 + movzx eax, byte [esi+2] + shl eax, 16 + mov ax, [esi] + add esi, 3 + ret 4 align 16 putimage_get8bpp: - movzx eax, byte [esi] - push edx - mov edx, [esp+8] - mov eax, [edx+eax*4] - pop edx - inc esi - ret 4 + movzx eax, byte [esi] + push edx + mov edx, [esp+8] + mov eax, [edx+eax*4] + pop edx + inc esi + ret 4 putimage_init1bpp: - add eax, ecx - push ecx - add eax, 7 - add ecx, 7 - shr eax, 3 - shr ecx, 3 - sub eax, ecx - pop ecx - ret + add eax, ecx + push ecx + add eax, 7 + add ecx, 7 + shr eax, 3 + shr ecx, 3 + sub eax, ecx + pop ecx + ret align 16 putimage_get1bpp: - push edx - mov edx, [esp+8] - mov al, [edx] - add al, al - jnz @f - lodsb - adc al, al + push edx + mov edx, [esp+8] + mov al, [edx] + add al, al + jnz @f + lodsb + adc al, al @@: - mov [edx], al - sbb eax, eax - and eax, [edx+8] - add eax, [edx+4] - pop edx - ret 4 + mov [edx], al + sbb eax, eax + and eax, [edx+8] + add eax, [edx+4] + pop edx + ret 4 putimage_init2bpp: - add eax, ecx - push ecx - add ecx, 3 - add eax, 3 - shr ecx, 2 - shr eax, 2 - sub eax, ecx - pop ecx - ret + add eax, ecx + push ecx + add ecx, 3 + add eax, 3 + shr ecx, 2 + shr eax, 2 + sub eax, ecx + pop ecx + ret align 16 putimage_get2bpp: - push edx - mov edx, [esp+8] - mov al, [edx] - mov ah, al - shr al, 6 - shl ah, 2 - jnz .nonewbyte - lodsb - mov ah, al - shr al, 6 - shl ah, 2 - add ah, 1 + push edx + mov edx, [esp+8] + mov al, [edx] + mov ah, al + shr al, 6 + shl ah, 2 + jnz .nonewbyte + lodsb + mov ah, al + shr al, 6 + shl ah, 2 + add ah, 1 .nonewbyte: - mov [edx], ah - mov edx, [edx+4] - movzx eax, al - mov eax, [edx+eax*4] - pop edx - ret 4 + mov [edx], ah + mov edx, [edx+4] + movzx eax, al + mov eax, [edx+eax*4] + pop edx + ret 4 putimage_init4bpp: - add eax, ecx - push ecx - add ecx, 1 - add eax, 1 - shr ecx, 1 - shr eax, 1 - sub eax, ecx - pop ecx - ret + add eax, ecx + push ecx + add ecx, 1 + add eax, 1 + shr ecx, 1 + shr eax, 1 + sub eax, ecx + pop ecx + ret align 16 putimage_get4bpp: - push edx - mov edx, [esp+8] - add byte [edx], 80h - jc @f - movzx eax, byte [edx+1] - mov edx, [edx+4] - and eax, 0x0F - mov eax, [edx+eax*4] - pop edx - ret 4 + push edx + mov edx, [esp+8] + add byte [edx], 80h + jc @f + movzx eax, byte [edx+1] + mov edx, [edx+4] + and eax, 0x0F + mov eax, [edx+eax*4] + pop edx + ret 4 @@: - movzx eax, byte [esi] - add esi, 1 - mov [edx+1], al - shr eax, 4 - mov edx, [edx+4] - mov eax, [edx+eax*4] - pop edx - ret 4 + movzx eax, byte [esi] + add esi, 1 + mov [edx+1], al + shr eax, 4 + mov edx, [edx+4] + mov eax, [edx+eax*4] + pop edx + ret 4 putimage_init32bpp: - shl eax, 2 - ret + shl eax, 2 + ret align 16 putimage_get32bpp: - lodsd - ret 4 + lodsd + ret 4 putimage_init15bpp: putimage_init16bpp: - add eax, eax - ret + add eax, eax + ret align 16 putimage_get15bpp: ; 0RRRRRGGGGGBBBBB -> 00000000RRRRR000GGGGG000BBBBB000 - push ecx edx - movzx eax, word [esi] - add esi, 2 - mov ecx, eax - mov edx, eax - and eax, 0x1F - and ecx, 0x1F shl 5 - and edx, 0x1F shl 10 - shl eax, 3 - shl ecx, 6 - shl edx, 9 - or eax, ecx - or eax, edx - pop edx ecx - ret 4 + push ecx edx + movzx eax, word [esi] + add esi, 2 + mov ecx, eax + mov edx, eax + and eax, 0x1F + and ecx, 0x1F shl 5 + and edx, 0x1F shl 10 + shl eax, 3 + shl ecx, 6 + shl edx, 9 + or eax, ecx + or eax, edx + pop edx ecx + ret 4 align 16 putimage_get16bpp: ; RRRRRGGGGGGBBBBB -> 00000000RRRRR000GGGGGG00BBBBB000 - push ecx edx - movzx eax, word [esi] - add esi, 2 - mov ecx, eax - mov edx, eax - and eax, 0x1F - and ecx, 0x3F shl 5 - and edx, 0x1F shl 11 - shl eax, 3 - shl ecx, 5 - shl edx, 8 - or eax, ecx - or eax, edx - pop edx ecx - ret 4 + push ecx edx + movzx eax, word [esi] + add esi, 2 + mov ecx, eax + mov edx, eax + and eax, 0x1F + and ecx, 0x3F shl 5 + and edx, 0x1F shl 11 + shl eax, 3 + shl ecx, 5 + shl edx, 8 + or eax, ecx + or eax, edx + pop edx ecx + ret 4 ; eax x beginning ; ebx y beginning ; ecx x end - ; edx y end + ; edx y end ; edi color __sys_drawbar: - mov esi,[current_slot] - add eax,[esi+APPDATA.wnd_clientbox.left] - add ecx,[esi+APPDATA.wnd_clientbox.left] - add ebx,[esi+APPDATA.wnd_clientbox.top] - add edx,[esi+APPDATA.wnd_clientbox.top] + mov esi,[current_slot] + add eax,[esi+APPDATA.wnd_clientbox.left] + add ecx,[esi+APPDATA.wnd_clientbox.left] + add ebx,[esi+APPDATA.wnd_clientbox.top] + add edx,[esi+APPDATA.wnd_clientbox.top] .forced: inc [mouse_pause] ; call [disable_mouse] cmp [SCR_MODE],word 0x12 - je dbv20 + je dbv20 sdbv20: cmp [SCR_MODE],word 0100000000000000b jge dbv20 cmp [SCR_MODE],word 0x13 - je dbv20 + je dbv20 call vesa12_drawbar dec [mouse_pause] call [draw_pointer] @@ -4554,36 +4523,36 @@ __sys_drawbar: kb_read: - push ecx edx + push ecx edx - mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's + mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's kr_loop: - in al,0x64 - test al,1 - jnz kr_ready - loop kr_loop - mov ah,1 - jmp kr_exit + in al,0x64 + test al,1 + jnz kr_ready + loop kr_loop + mov ah,1 + jmp kr_exit kr_ready: - push ecx - mov ecx,32 + push ecx + mov ecx,32 kr_delay: - loop kr_delay - pop ecx - in al,0x60 - xor ah,ah + loop kr_delay + pop ecx + in al,0x60 + xor ah,ah kr_exit: - pop edx ecx + pop edx ecx - ret + ret kb_write: - push ecx edx + push ecx edx - mov dl,al + mov dl,al ; mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's ; kw_loop1: ; in al,0x64 @@ -4593,75 +4562,75 @@ kb_write: ; mov ah,1 ; jmp kw_exit ; kw_ok1: - in al,0x60 - mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's + in al,0x60 + mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's kw_loop: - in al,0x64 - test al,2 - jz kw_ok - loop kw_loop - mov ah,1 - jmp kw_exit + in al,0x64 + test al,2 + jz kw_ok + loop kw_loop + mov ah,1 + jmp kw_exit kw_ok: - mov al,dl - out 0x60,al - mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's + mov al,dl + out 0x60,al + mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's kw_loop3: - in al,0x64 - test al,2 - jz kw_ok3 - loop kw_loop3 - mov ah,1 - jmp kw_exit + in al,0x64 + test al,2 + jz kw_ok3 + loop kw_loop3 + mov ah,1 + jmp kw_exit kw_ok3: - mov ah,8 + mov ah,8 kw_loop4: - mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's + mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's kw_loop5: - in al,0x64 - test al,1 - jnz kw_ok4 - loop kw_loop5 - dec ah - jnz kw_loop4 + in al,0x64 + test al,1 + jnz kw_ok4 + loop kw_loop5 + dec ah + jnz kw_loop4 kw_ok4: - xor ah,ah + xor ah,ah kw_exit: - pop edx ecx + pop edx ecx - ret + ret kb_cmd: - mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's + mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's c_wait: - in al,0x64 - test al,2 - jz c_send - loop c_wait - jmp c_error + in al,0x64 + test al,2 + jz c_send + loop c_wait + jmp c_error c_send: - mov al,bl - out 0x64,al - mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's + mov al,bl + out 0x64,al + mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's c_accept: - in al,0x64 - test al,2 - jz c_ok - loop c_accept + in al,0x64 + test al,2 + jz c_ok + loop c_accept c_error: - mov ah,1 - jmp c_exit + mov ah,1 + jmp c_exit c_ok: - xor ah,ah + xor ah,ah c_exit: - ret + ret setmouse: ; set mousepicture -pointer - ; ps2 mouse enable + ; ps2 mouse enable mov [MOUSE_PICTURE],dword mousepointer @@ -4669,7 +4638,7 @@ setmouse: ; set mousepicture -pointer ret - +if used _rdtsc _rdtsc: bt [cpu_caps], CAPS_TSC jnc ret_rdtsc @@ -4679,63 +4648,64 @@ _rdtsc: mov edx,0xffffffff mov eax,0xffffffff ret +end if rerouteirqs: - cli + cli - mov al,0x11 ; icw4, edge triggered - out 0x20,al - call pic_delay - out 0xA0,al - call pic_delay + mov al,0x11 ; icw4, edge triggered + out 0x20,al + call pic_delay + out 0xA0,al + call pic_delay - mov al,0x20 ; generate 0x20 + - out 0x21,al - call pic_delay - mov al,0x28 ; generate 0x28 + - out 0xA1,al - call pic_delay + mov al,0x20 ; generate 0x20 + + out 0x21,al + call pic_delay + mov al,0x28 ; generate 0x28 + + out 0xA1,al + call pic_delay - mov al,0x04 ; slave at irq2 - out 0x21,al - call pic_delay - mov al,0x02 ; at irq9 - out 0xA1,al - call pic_delay + mov al,0x04 ; slave at irq2 + out 0x21,al + call pic_delay + mov al,0x02 ; at irq9 + out 0xA1,al + call pic_delay - mov al,0x01 ; 8086 mode - out 0x21,al - call pic_delay - out 0xA1,al - call pic_delay + mov al,0x01 ; 8086 mode + out 0x21,al + call pic_delay + out 0xA1,al + call pic_delay - mov al,255 ; mask all irq's - out 0xA1,al - call pic_delay - out 0x21,al - call pic_delay + mov al,255 ; mask all irq's + out 0xA1,al + call pic_delay + out 0x21,al + call pic_delay - mov ecx,0x1000 - cld -picl1: call pic_delay - loop picl1 + mov ecx,0x1000 + cld +picl1: call pic_delay + loop picl1 - mov al,255 ; mask all irq's - out 0xA1,al - call pic_delay - out 0x21,al - call pic_delay + mov al,255 ; mask all irq's + out 0xA1,al + call pic_delay + out 0x21,al + call pic_delay - cli + cli - ret + ret pic_delay: - jmp pdl1 -pdl1: ret + jmp pdl1 +pdl1: ret sys_msg_board_str: @@ -4757,43 +4727,43 @@ sys_msg_board_byte: ; in: al = byte to display ; out: nothing ; destroys: nothing - pushad - mov ecx, 2 - shl eax, 24 - jmp @f + pushad + mov ecx, 2 + shl eax, 24 + jmp @f sys_msg_board_word: ; in: ax = word to display ; out: nothing ; destroys: nothing - pushad - mov ecx, 4 - shl eax, 16 - jmp @f + pushad + mov ecx, 4 + shl eax, 16 + jmp @f sys_msg_board_dword: ; in: eax = dword to display ; out: nothing ; destroys: nothing - pushad - mov ecx, 8 + pushad + mov ecx, 8 @@: - push ecx - rol eax, 4 - push eax - and al, 0xF - cmp al, 10 - sbb al, 69h - das - mov bl, al - xor eax, eax - inc eax - call sys_msg_board - pop eax - pop ecx - loop @b - popad - ret + push ecx + rol eax, 4 + push eax + and al, 0xF + cmp al, 10 + sbb al, 69h + das + mov bl, al + xor eax, eax + inc eax + call sys_msg_board + pop eax + pop ecx + loop @b + popad + ret uglobal msg_board_data: times 4096 db 0 @@ -4805,59 +4775,59 @@ sys_msg_board: ; eax=1 : write : bl byte to write ; eax=2 : read : ebx=0 -> no data, ebx=1 -> data in al - mov ecx, [msg_board_count] - cmp eax, 1 - jne .smbl1 + mov ecx, [msg_board_count] + cmp eax, 1 + jne .smbl1 if defined debug_com_base - push dx ax + push dx ax - @@: ; Wait for empty transmit register (yes, this slows down system..) - mov dx, debug_com_base+5 - in al, dx - test al, 1 shl 5 - jz @r + @@: ; Wait for empty transmit register (yes, this slows down system..) + mov dx, debug_com_base+5 + in al, dx + test al, 1 shl 5 + jz @r - mov dx, debug_com_base ; Output the byte - mov al, bl - out dx, al + mov dx, debug_com_base ; Output the byte + mov al, bl + out dx, al - pop ax dx + pop ax dx end if - mov [msg_board_data+ecx],bl - inc ecx - and ecx, 4095 - mov [msg_board_count], ecx - mov [check_idle_semaphore], 5 - ret + mov [msg_board_data+ecx],bl + inc ecx + and ecx, 4095 + mov [msg_board_count], ecx + mov [check_idle_semaphore], 5 + ret .smbl1: - cmp eax, 2 - jne .smbl2 - test ecx, ecx - jz .smbl21 - mov eax, msg_board_data+1 - mov ebx, msg_board_data - movzx edx, byte [ebx] - call memmove - dec [msg_board_count] - mov [esp + 36], edx ;eax - mov [esp + 24], dword 1 - ret + cmp eax, 2 + jne .smbl2 + test ecx, ecx + jz .smbl21 + mov eax, msg_board_data+1 + mov ebx, msg_board_data + movzx edx, byte [ebx] + call memmove + dec [msg_board_count] + mov [esp + 36], edx ;eax + mov [esp + 24], dword 1 + ret .smbl21: - mov [esp+36], ecx - mov [esp+24], ecx + mov [esp+36], ecx + mov [esp+24], ecx .smbl2: - ret + ret sys_process_def: - mov edi, [CURRENT_TASK] + mov edi, [CURRENT_TASK] - dec eax ; 1 = set keyboard mode + dec eax ; 1 = set keyboard mode jne no_set_keyboard_setup shl edi,8 @@ -4867,7 +4837,7 @@ sys_process_def: no_set_keyboard_setup: - dec eax ; 2 = get keyboard mode + dec eax ; 2 = get keyboard mode jne no_get_keyboard_setup shl edi,8 @@ -4879,7 +4849,7 @@ sys_process_def: no_get_keyboard_setup: - dec eax ; 3 = get keyboard ctrl, alt, shift + dec eax ; 3 = get keyboard ctrl, alt, shift jne no_get_keyboard_cas ; xor eax,eax @@ -4901,70 +4871,70 @@ sys_process_def: no_get_keyboard_cas: - dec eax - jnz no_add_keyboard_hotkey + dec eax + jnz no_add_keyboard_hotkey - mov eax, hotkey_list + 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+36], 1 - ret + cmp dword [eax+8], 0 + jz .found_free + add eax, 16 + cmp eax, hotkey_list+16*256 + jb @b + mov dword [esp+36], 1 + ret .found_free: - mov [eax+8], edi - mov [eax+4], ecx - movzx ebx, bl - lea ebx, [hotkey_scancodes+ebx*4] - mov ecx, [ebx] - mov [eax], ecx - mov [ebx], eax - mov [eax+12], ebx - jecxz @f - mov [ecx+12], eax + mov [eax+8], edi + mov [eax+4], ecx + movzx ebx, bl + lea ebx, [hotkey_scancodes+ebx*4] + mov ecx, [ebx] + mov [eax], ecx + mov [ebx], eax + mov [eax+12], ebx + jecxz @f + mov [ecx+12], eax @@: - and dword [esp+36], 0 - ret + and dword [esp+36], 0 + ret no_add_keyboard_hotkey: - dec eax - jnz no_del_keyboard_hotkey + dec eax + jnz no_del_keyboard_hotkey - movzx ebx, bl - lea ebx, [hotkey_scancodes+ebx*4] - mov eax, [ebx] + movzx ebx, bl + lea ebx, [hotkey_scancodes+ebx*4] + mov eax, [ebx] .scan: - test eax, eax - jz .notfound - cmp [eax+8], edi - jnz .next - cmp [eax+4], ecx - jz .found + test eax, eax + jz .notfound + cmp [eax+8], edi + jnz .next + cmp [eax+4], ecx + jz .found .next: - mov eax, [eax] - jmp .scan + mov eax, [eax] + jmp .scan .notfound: - mov dword [esp+36], 1 - ret + mov dword [esp+36], 1 + ret .found: - mov ecx, [eax] - jecxz @f - mov edx, [eax+12] - mov [ecx+12], edx + 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+36], edx - ret + 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+36], edx + ret no_del_keyboard_hotkey: ret @@ -4972,9 +4942,9 @@ no_del_keyboard_hotkey: align 4 -sys_gs: ; direct screen access +sys_gs: ; direct screen access - cmp eax,1 ; resolution + cmp eax,1 ; resolution jne no_gs1 mov eax,[Screen_Max_X] shl eax,16 @@ -4984,14 +4954,14 @@ sys_gs: ; direct screen access ret no_gs1: - cmp eax,2 ; bits per pixel + cmp eax,2 ; bits per pixel jne no_gs2 movzx eax,byte [ScreenBPP] mov [esp+36],eax ret no_gs2: - cmp eax,3 ; bytes per scanline + cmp eax,3 ; bytes per scanline jne no_gs3 mov eax,[BytesPerScanLine] mov [esp+36],eax @@ -5013,110 +4983,110 @@ sys_pci: align 4 ; system functions -syscall_setpixel: ; SetPixel +syscall_setpixel: ; SetPixel - mov eax, ebx - mov ebx, ecx - mov ecx, edx - mov edx, [TASK_BASE] - add eax, [edx-twdw+WDATA.box.left] - add ebx, [edx-twdw+WDATA.box.top] - mov edi, [current_slot] - add eax, [edi+APPDATA.wnd_clientbox.left] - add ebx, [edi+APPDATA.wnd_clientbox.top] - xor edi, edi ; no force + mov eax, ebx + mov ebx, ecx + mov ecx, edx + mov edx, [TASK_BASE] + add eax, [edx-twdw+WDATA.box.left] + add ebx, [edx-twdw+WDATA.box.top] + mov edi, [current_slot] + add eax, [edi+APPDATA.wnd_clientbox.left] + add ebx, [edi+APPDATA.wnd_clientbox.top] + xor edi, edi ; no force ; mov edi, 1 - call [disable_mouse] - jmp [putpixel] + call [disable_mouse] + jmp [putpixel] align 4 -syscall_writetext: ; WriteText +syscall_writetext: ; WriteText - mov eax,[TASK_BASE] - mov ebp,[eax-twdw+WDATA.box.left] - push esi - mov esi,[current_slot] - add ebp,[esi+APPDATA.wnd_clientbox.left] - shl ebp,16 - add ebp,[eax-twdw+WDATA.box.top] - add bp,word[esi+APPDATA.wnd_clientbox.top] - pop esi - add ebx,ebp - mov eax,edi - xor edi,edi - jmp dtext + mov eax,[TASK_BASE] + mov ebp,[eax-twdw+WDATA.box.left] + push esi + mov esi,[current_slot] + add ebp,[esi+APPDATA.wnd_clientbox.left] + shl ebp,16 + add ebp,[eax-twdw+WDATA.box.top] + add bp,word[esi+APPDATA.wnd_clientbox.top] + pop esi + add ebx,ebp + mov eax,edi + xor edi,edi + jmp dtext align 4 -syscall_openramdiskfile: ; OpenRamdiskFile +syscall_openramdiskfile: ; OpenRamdiskFile - mov eax, ebx - mov ebx, ecx - mov ecx, edx - mov edx, esi - mov esi, 12 - call fileread - mov [esp+32], eax - ret + mov eax, ebx + mov ebx, ecx + mov ecx, edx + mov edx, esi + mov esi, 12 + call fileread + mov [esp+32], eax + ret align 4 -syscall_drawrect: ; DrawRect +syscall_drawrect: ; DrawRect - mov edi, edx ; color + gradient - and edi, 0x80FFFFFF - test bx, bx ; x.size - je .drectr - test cx, cx ; y.size - je .drectr + mov edi, edx ; color + gradient + and edi, 0x80FFFFFF + test bx, bx ; x.size + je .drectr + test cx, cx ; y.size + je .drectr - mov eax, ebx ; bad idea - mov ebx, ecx + mov eax, ebx ; bad idea + mov ebx, ecx - movzx ecx, ax ; ecx - x.size - shr eax, 16 ; eax - x.coord - movzx edx, bx ; edx - y.size - shr ebx, 16 ; ebx - y.coord - mov esi, [current_slot] + movzx ecx, ax ; ecx - x.size + shr eax, 16 ; eax - x.coord + movzx edx, bx ; edx - y.size + shr ebx, 16 ; ebx - y.coord + mov esi, [current_slot] - add eax, [esi + APPDATA.wnd_clientbox.left] - add ebx, [esi + APPDATA.wnd_clientbox.top] - add ecx, eax - add edx, ebx - jmp [drawbar] + add eax, [esi + APPDATA.wnd_clientbox.left] + add ebx, [esi + APPDATA.wnd_clientbox.top] + add ecx, eax + add edx, ebx + jmp [drawbar] .drectr: - ret + ret align 4 -syscall_getscreensize: ; GetScreenSize - mov ax, [Screen_Max_X] - shl eax, 16 - mov ax, [Screen_Max_Y] - mov [esp + 32], eax - ret +syscall_getscreensize: ; GetScreenSize + mov ax, [Screen_Max_X] + shl eax, 16 + mov ax, [Screen_Max_Y] + mov [esp + 32], eax + ret align 4 -syscall_cdaudio: ; CD +syscall_cdaudio: ; CD - cmp eax, 4 - jb .audio - jz .eject - cmp eax, 5 - jnz .ret + cmp eax, 4 + jb .audio + jz .eject + cmp eax, 5 + jnz .ret .load: - call .reserve - call LoadMedium - call .free - ret + call .reserve + call LoadMedium + call .free + ret .eject: - call .reserve - call clear_CD_cache - call allow_medium_removal - call EjectMedium - call .free - ret + call .reserve + call clear_CD_cache + call allow_medium_removal + call EjectMedium + call .free + ret .audio: call sys_cd_audio mov [esp+36],eax @@ -5124,39 +5094,39 @@ syscall_cdaudio: ; CD ret .reserve: - call reserve_cd - mov eax, ebx - shr eax, 1 - and eax, 1 - inc eax - mov [ChannelNumber], ax - mov eax, ebx - and eax, 1 - mov [DiskNumber], al - call reserve_cd_channel - and ebx, 3 - inc ebx - mov [cdpos], ebx - add ebx, ebx - mov cl, 8 - sub cl, bl - mov al, [DRIVE_DATA+1] - shr al, cl - test al, 2 - jz .err - ret + call reserve_cd + mov eax, ebx + shr eax, 1 + and eax, 1 + inc eax + mov [ChannelNumber], ax + mov eax, ebx + and eax, 1 + mov [DiskNumber], al + call reserve_cd_channel + and ebx, 3 + inc ebx + mov [cdpos], ebx + add ebx, ebx + mov cl, 8 + sub cl, bl + mov al, [DRIVE_DATA+1] + shr al, cl + test al, 2 + jz .err + ret .free: - call free_cd_channel - and [cd_status], 0 - ret + call free_cd_channel + and [cd_status], 0 + ret .err: - call .free - pop eax - ret + call .free + pop eax + ret align 4 -syscall_getpixel: ; GetPixel +syscall_getpixel: ; GetPixel mov ecx, [Screen_Max_X] inc ecx xor edx, edx @@ -5172,14 +5142,14 @@ align 4 syscall_getarea: ;eax = 36 -;ebx = pointer to bufer for img BBGGRRBBGGRR... -;ecx = [size x]*65536 + [size y] -;edx = [start x]*65536 + [start y] +;ebx = pointer to bufer for img BBGGRRBBGGRR... +;ecx = [size x]*65536 + [size y] +;edx = [start x]*65536 + [start y] pushad - inc [mouse_pause] + inc [mouse_pause] ; Check of use of the hardware cursor. cmp [disable_mouse],__sys_disable_mouse - jne @f + jne @f ; Since the test for the coordinates of the mouse should not be used, ; then use the call [disable_mouse] is not possible! cmp dword [MOUSE_VISIBLE],dword 0 @@ -5196,7 +5166,7 @@ syscall_getarea: mov ebx,edx and ebx,0xffff dec eax - dec ebx + dec ebx ; eax - x, ebx - y mov edx,ecx @@ -5204,22 +5174,22 @@ syscall_getarea: and edx,0xffff mov esi,ecx ; ecx - size x, edx - size y - - mov ebp,edx - dec ebp + + mov ebp,edx + dec ebp lea ebp,[ebp*3] - - imul ebp,esi - - mov esi,ecx - dec esi - lea esi,[esi*3] - + + imul ebp,esi + + mov esi,ecx + dec esi + lea esi,[esi*3] + add ebp,esi add ebp,edi add ebx,edx - + .start_y: push ecx edx .start_x: @@ -5232,50 +5202,50 @@ syscall_getarea: shr ecx,16 mov [ebp+2],cl - pop ecx ebx eax + pop ecx ebx eax sub ebp,3 dec ecx jnz .start_x - pop edx ecx - dec ebx + pop edx ecx + dec ebx dec edx jnz .start_y - dec [mouse_pause] + dec [mouse_pause] ; Check of use of the hardware cursor. cmp [disable_mouse],__sys_disable_mouse - jne @f - call [draw_pointer] + jne @f + call [draw_pointer] @@: popad ret align 4 -syscall_drawline: ; DrawLine +syscall_drawline: ; DrawLine - mov edi, [TASK_BASE] - movzx eax, word[edi-twdw+WDATA.box.left] - mov ebp, eax - mov esi, [current_slot] - add ebp, [esi+APPDATA.wnd_clientbox.left] - add ax, word[esi+APPDATA.wnd_clientbox.left] - add ebp,ebx - shl eax, 16 - movzx ebx, word[edi-twdw+WDATA.box.top] - add eax, ebp - mov ebp, ebx - add ebp, [esi+APPDATA.wnd_clientbox.top] - add bx, word[esi+APPDATA.wnd_clientbox.top] - add ebp, ecx - shl ebx, 16 - xor edi, edi - add ebx, ebp - mov ecx, edx - jmp [draw_line] + mov edi, [TASK_BASE] + movzx eax, word[edi-twdw+WDATA.box.left] + mov ebp, eax + mov esi, [current_slot] + add ebp, [esi+APPDATA.wnd_clientbox.left] + add ax, word[esi+APPDATA.wnd_clientbox.left] + add ebp,ebx + shl eax, 16 + movzx ebx, word[edi-twdw+WDATA.box.top] + add eax, ebp + mov ebp, ebx + add ebp, [esi+APPDATA.wnd_clientbox.top] + add bx, word[esi+APPDATA.wnd_clientbox.top] + add ebp, ecx + shl ebx, 16 + xor edi, edi + add ebx, ebp + mov ecx, edx + jmp [draw_line] align 4 -syscall_getirqowner: ; GetIrqOwner +syscall_getirqowner: ; GetIrqOwner cmp ebx,16 jae .err @@ -5293,7 +5263,7 @@ syscall_getirqowner: ; GetIrqOwner align 4 -syscall_reserveportarea: ; ReservePortArea and FreePortArea +syscall_reserveportarea: ; ReservePortArea and FreePortArea call r_f_port_area mov [esp+36],eax @@ -5301,7 +5271,7 @@ syscall_reserveportarea: ; ReservePortArea and FreePortArea align 4 -syscall_threads: ; CreateThreads +syscall_threads: ; CreateThreads call sys_threads mov [esp+36],eax @@ -5311,7 +5281,7 @@ align 4 stack_driver_stat: - call app_stack_handler ; Stack status + call app_stack_handler ; Stack status ; mov [check_idle_semaphore],5 ; enable these for zero delay ; call change_task ; between sent packet @@ -5321,7 +5291,7 @@ stack_driver_stat: align 4 -socket: ; Socket interface +socket: ; Socket interface call app_socket_handler ; mov [check_idle_semaphore],5 ; enable these for zero delay @@ -5333,7 +5303,7 @@ socket: ; Socket interface align 4 -read_from_hd: ; Read from hd - fn not in use +read_from_hd: ; Read from hd - fn not in use mov edi,[TASK_BASE] add edi,TASKDATA.mem_start @@ -5348,53 +5318,53 @@ read_from_hd: ; Read from hd - fn not in use ret paleholder: - ret + ret align 4 set_screen: - cmp eax, [Screen_Max_X] - jne .set + cmp eax, [Screen_Max_X] + jne .set - cmp edx, [Screen_Max_Y] - jne .set - ret + cmp edx, [Screen_Max_Y] + jne .set + ret .set: - pushfd - cli + pushfd + cli - mov [Screen_Max_X], eax - mov [Screen_Max_Y], edx + mov [Screen_Max_X], eax + mov [Screen_Max_Y], edx - mov [screen_workarea.right],eax - mov [screen_workarea.bottom], edx - inc eax - shl eax, 2 ;32 bpp - mov [BytesPerScanLine], eax - push ebx - push esi - push edi - call repos_windows - mov eax, 0 - mov ebx, 0 - mov ecx, [Screen_Max_X] - mov edx, [Screen_Max_Y] - call calculatescreen - pop edi - pop esi - pop ebx + mov [screen_workarea.right],eax + mov [screen_workarea.bottom], edx + inc eax + shl eax, 2 ;32 bpp + mov [BytesPerScanLine], eax + push ebx + push esi + push edi + call repos_windows + mov eax, 0 + mov ebx, 0 + mov ecx, [Screen_Max_X] + mov edx, [Screen_Max_Y] + call calculatescreen + pop edi + pop esi + pop ebx - popfd - ret + popfd + ret ; --------------- APM --------------------- apm_entry dp 0 -apm_vf dd 0 +apm_vf dd 0 align 4 sys_apm: cmp word [apm_vf], 0 ; Check APM BIOS enable jne @f - or [esp + 56], byte 1 ; error - mov [esp + 36], dword 8 ; 32-bit protected-mode interface not supported + or [esp + 56], byte 1 ; error + mov [esp + 36], dword 8 ; 32-bit protected-mode interface not supported ret @@: @@ -5402,7 +5372,7 @@ sys_apm: xchg ebx, ecx cmp al, 3 - ja @f + ja @f and [esp + 56], byte 0xfe ; emulate func 0..3 as func 0 mov eax, [apm_vf] mov [esp + 36], eax @@ -5416,9 +5386,9 @@ sys_apm: xchg [master_tab], esi push esi mov edi, cr3 - mov cr3, edi ;flush TLB + mov cr3, edi ;flush TLB - call pword [apm_entry] ; call APM BIOS + call pword [apm_entry] ; call APM BIOS xchg eax, [esp] mov [master_tab], eax @@ -5434,7 +5404,7 @@ sys_apm: mov [esp + 36], eax setc al and [esp + 56], byte 0xfe - or [esp + 56], al + or [esp + 56], al ret @@ -5442,177 +5412,177 @@ sys_apm: align 4 -undefined_syscall: ; Undefined system call +undefined_syscall: ; Undefined system call mov [esp + 32], dword -1 ret align 4 -system_shutdown: ; shut down the system +system_shutdown: ; shut down the system - cmp byte [BOOT_VAR+0x9030], 1 - jne @F - ret + cmp byte [BOOT_VAR+0x9030], 1 + jne @F + ret @@: - call stop_all_services - push 3 ; stop playing cd - pop eax - call sys_cd_audio + call stop_all_services + push 3 ; stop playing cd + pop eax + call sys_cd_audio yes_shutdown_param: - cli + cli - mov eax, kernel_file ; load kernel.mnt to 0x7000:0 - push 12 - pop esi - xor ebx,ebx - or ecx,-1 - mov edx, OS_BASE+0x70000 - call fileread + mov eax, kernel_file ; load kernel.mnt to 0x7000:0 + push 12 + pop esi + xor ebx,ebx + or ecx,-1 + mov edx, OS_BASE+0x70000 + call fileread - mov esi, restart_kernel_4000+OS_BASE+0x10000 ; move kernel re-starter to 0x4000:0 - mov edi,OS_BASE+0x40000 - mov ecx,1000 - rep movsb + mov esi, restart_kernel_4000+OS_BASE+0x10000 ; move kernel re-starter to 0x4000:0 + mov edi,OS_BASE+0x40000 + mov ecx,1000 + rep movsb - mov esi,OS_BASE+0x2F0000 ; restore 0x0 - 0xffff - mov edi, OS_BASE - mov ecx,0x10000/4 - cld - rep movsd + mov esi,OS_BASE+0x2F0000 ; restore 0x0 - 0xffff + mov edi, OS_BASE + mov ecx,0x10000/4 + cld + rep movsd - call restorefatchain + call restorefatchain - mov al, 0xFF - out 0x21, al - out 0xA1, al + mov al, 0xFF + out 0x21, al + out 0xA1, al if 1 - mov word [OS_BASE+0x467+0],pr_mode_exit - mov word [OS_BASE+0x467+2],0x1000 + mov word [OS_BASE+0x467+0],pr_mode_exit + mov word [OS_BASE+0x467+2],0x1000 - mov al,0x0F - out 0x70,al - mov al,0x05 - out 0x71,al + mov al,0x0F + out 0x70,al + mov al,0x05 + out 0x71,al - mov al,0xFE - out 0x64,al + mov al,0xFE + out 0x64,al - hlt + hlt else - cmp byte [OS_BASE + 0x9030], 2 - jnz no_acpi_power_off + cmp byte [OS_BASE + 0x9030], 2 + jnz no_acpi_power_off ; scan for RSDP ; 1) The first 1 Kb of the Extended BIOS Data Area (EBDA). - movzx eax, word [OS_BASE + 0x40E] - shl eax, 4 - jz @f - mov ecx, 1024/16 - call scan_rsdp - jnc .rsdp_found + movzx eax, word [OS_BASE + 0x40E] + shl eax, 4 + jz @f + mov ecx, 1024/16 + call scan_rsdp + jnc .rsdp_found @@: ; 2) The BIOS read-only memory space between 0E0000h and 0FFFFFh. - mov eax, 0xE0000 - mov ecx, 0x2000 - call scan_rsdp - jc no_acpi_power_off + mov eax, 0xE0000 + mov ecx, 0x2000 + call scan_rsdp + jc no_acpi_power_off .rsdp_found: - mov esi, [eax+16] ; esi contains physical address of the RSDT - mov ebp, [ipc_tmp] - stdcall map_page, ebp, esi, PG_MAP - lea eax, [esi+1000h] - lea edx, [ebp+1000h] - stdcall map_page, edx, eax, PG_MAP - and esi, 0xFFF - add esi, ebp - cmp dword [esi], 'RSDT' - jnz no_acpi_power_off - mov ecx, [esi+4] - sub ecx, 24h - jbe no_acpi_power_off - shr ecx, 2 - add esi, 24h + mov esi, [eax+16] ; esi contains physical address of the RSDT + mov ebp, [ipc_tmp] + stdcall map_page, ebp, esi, PG_MAP + lea eax, [esi+1000h] + lea edx, [ebp+1000h] + stdcall map_page, edx, eax, PG_MAP + and esi, 0xFFF + add esi, ebp + cmp dword [esi], 'RSDT' + jnz no_acpi_power_off + mov ecx, [esi+4] + sub ecx, 24h + jbe no_acpi_power_off + shr ecx, 2 + add esi, 24h .scan_fadt: - lodsd - mov ebx, eax - lea eax, [ebp+2000h] - stdcall map_page, eax, ebx, PG_MAP - lea eax, [ebp+3000h] - add ebx, 0x1000 - stdcall map_page, eax, ebx, PG_MAP - and ebx, 0xFFF - lea ebx, [ebx+ebp+2000h] - cmp dword [ebx], 'FACP' - jz .fadt_found - loop .scan_fadt - jmp no_acpi_power_off + lodsd + mov ebx, eax + lea eax, [ebp+2000h] + stdcall map_page, eax, ebx, PG_MAP + lea eax, [ebp+3000h] + add ebx, 0x1000 + stdcall map_page, eax, ebx, PG_MAP + and ebx, 0xFFF + lea ebx, [ebx+ebp+2000h] + cmp dword [ebx], 'FACP' + jz .fadt_found + loop .scan_fadt + jmp no_acpi_power_off .fadt_found: ; ebx is linear address of FADT - mov edx, [ebx+48] - test edx, edx - jz .nosmi - mov al, [ebx+52] - out dx, al - mov edx, [ebx+64] + mov edx, [ebx+48] + test edx, edx + jz .nosmi + mov al, [ebx+52] + out dx, al + mov edx, [ebx+64] @@: - in ax, dx - test al, 1 - jz @b + in ax, dx + test al, 1 + jz @b .nosmi: - mov edx, [ebx+64] - in ax, dx - and ax, 203h - or ax, 3C00h - out dx, ax - mov edx, [ebx+68] - test edx, edx - jz @f - in ax, dx - and ax, 203h - or ax, 3C00h - out dx, ax + mov edx, [ebx+64] + in ax, dx + and ax, 203h + or ax, 3C00h + out dx, ax + mov edx, [ebx+68] + test edx, edx + jz @f + in ax, dx + and ax, 203h + or ax, 3C00h + out dx, ax @@: - jmp $ + jmp $ no_acpi_power_off: - mov word [OS_BASE+0x467+0],pr_mode_exit - mov word [OS_BASE+0x467+2],0x1000 + mov word [OS_BASE+0x467+0],pr_mode_exit + mov word [OS_BASE+0x467+2],0x1000 - mov al,0x0F - out 0x70,al - mov al,0x05 - out 0x71,al + mov al,0x0F + out 0x70,al + mov al,0x05 + out 0x71,al - mov al,0xFE - out 0x64,al + mov al,0xFE + out 0x64,al - hlt + hlt scan_rsdp: - add eax, OS_BASE + add eax, OS_BASE .s: - cmp dword [eax], 'RSD ' - jnz .n - cmp dword [eax+4], 'PTR ' - jnz .n - xor edx, edx - xor esi, esi + cmp dword [eax], 'RSD ' + jnz .n + cmp dword [eax+4], 'PTR ' + jnz .n + xor edx, edx + xor esi, esi @@: - add dl, [eax+esi] - inc esi - cmp esi, 20 - jnz @b - test dl, dl - jz .ok + add dl, [eax+esi] + inc esi + cmp esi, 20 + jnz @b + test dl, dl + jz .ok .n: - add eax, 10h - loop .s - stc + add eax, 10h + loop .s + stc .ok: - ret + ret end if include "data32.inc" @@ -5621,4 +5591,3 @@ __REV__ = __REV uglobals_size = $ - endofcode diff16 "end of kernel code",0,$ - diff --git a/kernel/trunk/kernel32.inc b/kernel/trunk/kernel32.inc index 1e6cbcee64..d09f408ea2 100644 --- a/kernel/trunk/kernel32.inc +++ b/kernel/trunk/kernel32.inc @@ -74,7 +74,7 @@ WSTATE_MAXIMIZED = 00000001b WSTATE_MINIMIZED = 00000010b WSTATE_ROLLEDUP = 00000100b -WSTATE_REDRAW = 00000001b +WSTATE_REDRAW = 00000001b WSTATE_WNDDRAWN = 00000010b WSTYLE_HASCAPTION = 00010000b @@ -83,13 +83,13 @@ WSTYLE_CLIENTRELATIVE = 00100000b struc TASKDATA { .event_mask dd ? - .pid dd ? - dw ? + .pid dd ? + dw ? .state db ? db ? - dw ? + dw ? .wnd_number db ? - db ? + db ? .mem_start dd ? .counter_sum dd ? .counter_add dd ? @@ -101,14 +101,14 @@ end virtual ; structures definition struc WDATA { - .box BOX - .cl_workarea dd ? - .cl_titlebar dd ? - .cl_frames dd ? - .reserved db ? - .fl_wstate db ? - .fl_wdrawn db ? - .fl_redraw db ? + .box BOX + .cl_workarea dd ? + .cl_titlebar dd ? + .cl_frames dd ? + .reserved db ? + .fl_wstate db ? + .fl_wdrawn db ? + .fl_redraw db ? } virtual at 0 WDATA WDATA @@ -117,11 +117,11 @@ label WDATA.fl_wstyle byte at 0x13 struc APPDATA { - .app_name db 11 dup(?) - db 5 dup(?) + .app_name db 11 dup(?) + db 5 dup(?) .fpu_state dd ? ;+16 - .ev_count dd ? ;+20 + .ev_count_ dd ? ;unused ;+20 .fpu_handler dd ? ;+24 .sse_handler dd ? ;+28 .pl0_stack dd ? ;unused ;+32 @@ -138,22 +138,24 @@ struc APPDATA .cur_dir dd ? ;+80 .wait_timeout dd ? ;+84 .saved_esp0 dd ? ;+88 - - db 36 dup(?) ;+92 + .wait_begin dd ? ;+92 +++ + .wait_test dd ? ;+96 +++ + .wait_param dd ? ;+100 +++ + db 24 dup(?) ;+104 .wnd_shape dd ? ;+128 .wnd_shape_scale dd ? ;+132 dd ? ;+136 .mem_size dd ? ;+140 - .saved_box BOX - .ipc_start dd ? - .ipc_size dd ? - .event_mask dd ? + .saved_box BOX + .ipc_start dd ? + .ipc_size dd ? + .event_mask dd ? .debugger_slot dd ? - dd ? + dd ? .keyboard_mode db ? - db 3 dup(?) - .dir_table dd ? + db 3 dup(?) + .dir_table dd ? .dbg_event_mem dd ? .dbg_regs: .dbg_regs.dr0 dd ? @@ -161,7 +163,7 @@ struc APPDATA .dbg_regs.dr2 dd ? .dbg_regs.dr3 dd ? .dbg_regs.dr7 dd ? - .wnd_caption dd ? + .wnd_caption dd ? .wnd_clientbox BOX } virtual at 0 diff --git a/kernel/trunk/macros.inc b/kernel/trunk/macros.inc index 574b4a1e25..e99a17ec97 100644 --- a/kernel/trunk/macros.inc +++ b/kernel/trunk/macros.inc @@ -98,3 +98,9 @@ if ~ f eq end if } ; \end{diamond}[29.09.2006] + +macro Mov op1,op2,op3 ; op1 = op2 = op3 + { + mov op2,op3 + mov op1,op2 + }