Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 5564 → Rev 5565

/kernel/branches/Kolibri-acpi/kernel.asm
1,6 → 1,6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved.
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved.
;; PROGRAMMING:
;; Ivan Poddubny
;; Marat Zakiyanov (Mario79)
351,15 → 351,26
mov fs, cx
mov gs, bx
 
xor eax, eax
mov ebx, 0xFFFFF000+PG_SHARED+PG_NOCACHE+PG_UWR
bt [cpu_caps], CAPS_PAT
setc al
shl eax, 7
or ebx, eax
 
mov eax, PG_GLOBAL
bt [cpu_caps], CAPS_PGE
jnc @F
 
or dword [sys_proc+PROC.pdt_0+(OS_BASE shr 20)], PG_GLOBAL
or [sys_proc+PROC.pdt_0+(OS_BASE shr 20)], eax
or ebx, eax
 
mov ebx, cr4
or ebx, CR4_PGE
mov cr4, ebx
mov eax, cr4
or eax, CR4_PGE
mov cr4, eax
@@:
mov [pte_valid_mask], ebx
 
xor eax, eax
mov dword [sys_proc+PROC.pdt_0], eax
mov dword [sys_proc+PROC.pdt_0+4], eax
444,13 → 455,11
mov [_display.width], eax
mov [display_width_standard], eax
dec eax
mov [Screen_Max_X], eax
mov [screen_workarea.right], eax
movzx eax, word [BOOT_VARS+BOOT_Y_RES]; Y max
mov [_display.height], eax
mov [display_height_standard], eax
dec eax
mov [Screen_Max_Y], eax
mov [screen_workarea.bottom], eax
movzx eax, word [BOOT_VARS+BOOT_VESA_MODE] ; screen mode
mov dword [SCR_MODE], eax
463,10 → 472,10
je @f
movzx eax, word[BOOT_VARS+BOOT_PITCH] ; for other modes
@@:
mov [_display.pitch], eax
mov [_display.lfb_pitch], eax
mov eax, [_display.width]
mul [_display.height]
mov [_WinMapSize], eax
mov [_display.win_map_size], eax
 
call calculate_fast_getting_offset_for_WinMapAddress
; for Qemu or non standart video cards
577,11 → 586,11
.noSYSCALL:
; -----------------------------------------
stdcall alloc_page
stdcall map_page, tss-0xF80, eax, PG_SW
stdcall map_page, tss-0xF80, eax, PG_SWR
stdcall alloc_page
stdcall map_page, tss+0x80, eax, PG_SW
stdcall map_page, tss+0x80, eax, PG_SWR
stdcall alloc_page
stdcall map_page, tss+0x1080, eax, PG_SW
stdcall map_page, tss+0x1080, eax, PG_SWR
 
; LOAD IDT
 
661,8 → 670,8
mov [graph_data_l+4], al
mov [graph_data_l+7], ah
 
stdcall kernel_alloc, [_WinMapSize]
mov [_WinMapAddress], eax
stdcall kernel_alloc, [_display.win_map_size]
mov [_display.win_map], eax
 
xor eax, eax
inc eax
756,7 → 765,7
mov edi, OS_BASE + 8000h
mov ecx, (ap_init16_size + 3) / 4
rep movsd
stdcall map_io_mem, [acpi_lapic_base], 0x1000, PG_SW+PG_NOCACHE
stdcall map_io_mem, [acpi_lapic_base], 0x1000, PG_GLOBAL+PG_NOCACHE+PG_SWR
mov [LAPIC_BASE], eax
lea edi, [eax+300h]
mov esi, smpt+4
1061,14 → 1070,14
;protect io permission map
 
mov esi, [default_io_map]
stdcall map_page, esi, [SLOT_BASE+256+APPDATA.io_map], PG_MAP
stdcall map_page, esi, [SLOT_BASE+256+APPDATA.io_map], PG_READ
add esi, 0x1000
stdcall map_page, esi, [SLOT_BASE+256+APPDATA.io_map+4], PG_MAP
stdcall map_page, esi, [SLOT_BASE+256+APPDATA.io_map+4], PG_READ
 
stdcall map_page, tss._io_map_0, \
[SLOT_BASE+256+APPDATA.io_map], PG_MAP
[SLOT_BASE+256+APPDATA.io_map], PG_READ
stdcall map_page, tss._io_map_1, \
[SLOT_BASE+256+APPDATA.io_map+4], PG_MAP
[SLOT_BASE+256+APPDATA.io_map+4], PG_READ
 
; SET KEYBOARD PARAMETERS
mov al, 0xf6 ; reset keyboard, scan enabled
2114,7 → 2123,7
movzx ebx, word [MOUSE_X]
mov eax, [d_width_calc_area + eax*4]
 
add eax, [_WinMapAddress]
add eax, [_display.win_map]
movzx edx, byte [ebx+eax]
shl edx, 8
mov esi, [edx+SLOT_BASE+APPDATA.cursor]
2406,10 → 2415,10
;* mouse centered - start code- Mario79
;mouse_centered:
; push eax
mov eax, [Screen_Max_X]
mov eax, [_display.width]
shr eax, 1
mov [MOUSE_X], ax
mov eax, [Screen_Max_Y]
mov eax, [_display.height]
shr eax, 1
mov [MOUSE_Y], ax
call wakeup_osloop
2451,11 → 2460,11
; cmp ecx,4 ; set mouse pointer position
dec ecx
jnz .set_mouse_button
cmp dx, word[Screen_Max_Y]
ja .end
cmp dx, word[_display.height]
jae .end
rol edx, 16
cmp dx, word[Screen_Max_X]
ja .end
cmp dx, word[_display.width]
jae .end
mov [MOUSE_X], edx
mov [mouse_active], 1
call wakeup_osloop
2541,7 → 2550,7
pushfd
cli
mov eax, ecx
mov ecx, [_display.pitch]
mov ecx, [_display.lfb_pitch]
mov [_display.width], eax
dec eax
mov [_display.height], edx
2804,7 → 2813,7
align 4
@@:
mov eax, [page_tabs+esi*4]
or al, PG_UW
or al, PG_UWR
mov [page_tabs+ebx*4], eax
mov eax, ebx
shl eax, 12
2882,8 → 2891,10
jnz nosb9
; ecx = [left]*65536 + [right]
; edx = [top]*65536 + [bottom]
mov eax, [Screen_Max_X]
mov ebx, [Screen_Max_Y]
mov eax, [_display.width]
mov ebx, [_display.height]
dec eax
dec ebx
; check [right]
cmp cx, ax
ja .exit
2935,8 → 2946,10
and [draw_data+32 + RECT.left], 0
and [draw_data+32 + RECT.top], 0
push eax ebx
mov eax, [Screen_Max_X]
mov ebx, [Screen_Max_Y]
mov eax, [_display.width]
mov ebx, [_display.height]
dec eax
dec ebx
mov [draw_data+32 + RECT.right], eax
mov [draw_data+32 + RECT.bottom], ebx
pop ebx eax
3298,9 → 3311,11
add edx, draw_data - CURRENT_TASK
mov [edx + RECT.left], 0
mov [edx + RECT.top], 0
mov eax, [Screen_Max_X]
mov eax, [_display.width]
dec eax
mov [edx + RECT.right], eax
mov eax, [Screen_Max_Y]
mov eax, [_display.height]
dec eax
mov [edx + RECT.bottom], eax
 
srl1:
3819,7 → 3834,7
.start_x:
add eax, ecx
mov ebp, [d_width_calc_area + ebx*4]
add ebp, [_WinMapAddress]
add ebp, [_display.win_map]
movzx ebp, byte[eax+ebp] ; get value for current point
cmp ebp, edi
jne @f
3864,9 → 3879,9
;-----------------------------------------------------------------------------
align 4
calculatebackground: ; background
mov edi, [_WinMapAddress] ; set os to use all pixels
mov edi, [_display.win_map] ; set os to use all pixels
mov eax, 0x01010101
mov ecx, [_WinMapSize]
mov ecx, [_display.win_map_size]
shr ecx, 2
rep stosd
 
4793,9 → 4808,9
jnz @f
mov word [msg_board_pos+2], (42*6)
add word [msg_board_pos], 10
mov ax, word [Screen_Max_Y]
mov ax, word [_display.width]
cmp word [msg_board_pos], ax
jbe @f
jb @f
mov word [msg_board_pos], 10
@@:
; // end if
5012,10 → 5027,9
 
 
.1: ; resolution
mov eax, [Screen_Max_X]
mov eax, [_display.width]
shl eax, 16
mov ax, word [Screen_Max_Y]
add eax, 0x00010001
mov ax, word [_display.height]
mov [esp+32], eax
ret
.2: ; bits per pixel
5023,7 → 5037,7
mov [esp+32], eax
ret
.3: ; bytes per scanline
mov eax, [_display.pitch]
mov eax, [_display.lfb_pitch]
mov [esp+32], eax
ret
 
5100,9 → 5114,11
 
align 4
syscall_getscreensize: ; GetScreenSize
mov ax, word [Screen_Max_X]
mov ax, word [_display.width]
dec ax
shl eax, 16
mov ax, word [Screen_Max_Y]
mov ax, word [_display.height]
dec ax
mov [esp + 32], eax
ret
;-----------------------------------------------------------------------------
5178,10 → 5194,10
;-----------------------------------------------------------------------------
align 4
syscall_getpixel_WinMap: ; GetPixel WinMap
cmp ebx, [Screen_Max_X]
jbe @f
cmp ecx, [Screen_Max_Y]
jbe @f
cmp ebx, [_display.width]
jb @f
cmp ecx, [_display.height]
jb @f
xor eax, eax
jmp .store
;--------------------------------------
5188,7 → 5204,7
align 4
@@:
mov eax, [d_width_calc_area + ecx*4]
add eax, [_WinMapAddress]
add eax, [_display.win_map]
movzx eax, byte[eax+ebx] ; get value for current point
;--------------------------------------
align 4
5198,8 → 5214,7
;-----------------------------------------------------------------------------
align 4
syscall_getpixel: ; GetPixel
mov ecx, [Screen_Max_X]
inc ecx
mov ecx, [_display.width]
xor edx, edx
mov eax, ebx
div ecx
5328,7 → 5343,7
 
pushad
mov edx, [d_width_calc_area + ebx*4]
add edx, [_WinMapAddress]
add edx, [_display.win_map]
movzx edx, byte [eax+edx]
cmp dl, byte 1
jne @f
5429,7 → 5444,7
cld
@@:
stosd
add eax, [_display.pitch]
add eax, [_display.lfb_pitch]
dec ecx
jnz @r
ret
5444,9 → 5459,7
pushfd
cli
 
mov [Screen_Max_X], eax
mov [Screen_Max_Y], edx
mov [_display.pitch], ecx
mov [_display.lfb_pitch], ecx
 
mov [screen_workarea.right], eax
mov [screen_workarea.bottom], edx
5460,14 → 5473,14
cmp [do_not_touch_winmap], 1
je @f
 
stdcall kernel_free, [_WinMapAddress]
stdcall kernel_free, [_display.win_map]
 
mov eax, [_display.width]
mul [_display.height]
mov [_WinMapSize], eax
mov [_display.win_map_size], eax
 
stdcall kernel_alloc, eax
mov [_WinMapAddress], eax
mov [_display.win_map], eax
test eax, eax
jz .epic_fail
; store for f.18.24
5487,8 → 5500,10
call repos_windows
xor eax, eax
xor ebx, ebx
mov ecx, [Screen_Max_X]
mov edx, [Screen_Max_Y]
mov ecx, [_display.width]
mov edx, [_display.height]
dec ecx
dec edx
call calculatescreen
pop edi
pop esi
5650,10 → 5665,10
.rsdp_found:
mov esi, [eax+16] ; esi contains physical address of the RSDT
mov ebp, [ipc_tmp]
stdcall map_page, ebp, esi, PG_MAP
stdcall map_page, ebp, esi, PG_READ
lea eax, [esi+1000h]
lea edx, [ebp+1000h]
stdcall map_page, edx, eax, PG_MAP
stdcall map_page, edx, eax, PG_READ
and esi, 0xFFF
add esi, ebp
cmp dword [esi], 'RSDT'
5667,10 → 5682,10
lodsd
mov ebx, eax
lea eax, [ebp+2000h]
stdcall map_page, eax, ebx, PG_MAP
stdcall map_page, eax, ebx, PG_READ
lea eax, [ebp+3000h]
add ebx, 0x1000
stdcall map_page, eax, ebx, PG_MAP
stdcall map_page, eax, ebx, PG_READ
and ebx, 0xFFF
lea ebx, [ebx+ebp+2000h]
cmp dword [ebx], 'FACP'
5681,10 → 5696,10
; ebx is linear address of FADT
mov edi, [ebx+40] ; physical address of the DSDT
lea eax, [ebp+4000h]
stdcall map_page, eax, edi, PG_MAP
stdcall map_page, eax, edi, PG_READ
lea eax, [ebp+5000h]
lea esi, [edi+0x1000]
stdcall map_page, eax, esi, PG_MAP
stdcall map_page, eax, esi, PG_READ
and esi, 0xFFF
sub edi, esi
cmp dword [esi+ebp+4000h], 'DSDT'
5732,8 → 5747,8
add edi, 0x1000
push eax
lea eax, [ebp+4000h]
stdcall map_page, eax, edi, PG_MAP
push PG_MAP
stdcall map_page, eax, edi, PG_READ
push PG_READ
lea eax, [edi+1000h]
push eax
lea eax, [ebp+5000h]