/kernel/branches/Kolibri-acpi/const.inc |
---|
189,6 → 189,7 |
TASK_DATA equ (OS_BASE+0x0003020) |
TASK_EVENT equ (OS_BASE+0x0003020) |
d_width_calc_area equ (OS_BASE+0x0005000) |
mouseunder equ (OS_BASE+0x0006900) |
CDDataBuf equ (OS_BASE+0x0007000) |
FLOPPY_BUFF equ (OS_BASE+0x0008000) |
/kernel/branches/Kolibri-acpi/core/apic.inc |
---|
41,7 → 41,8 |
IOAPIC_ARB equ 0x2 |
IOAPIC_REDTBL equ 0x10 |
IPI_INIT equ (0x6 shl 8) |
IPI_INIT equ (0x5 shl 8) |
IPI_START equ (0x6 shl 8) |
IPI_LEVEL_ASSERT equ (0x1 shl 14) |
SHORTHAND_ALL_EXCL equ (0x3 shl 18) |
129,15 → 130,9 |
;=========================================================== |
align 4 |
LAPIC_init: |
; Check MSR support |
;.... |
; Get LAPIC base address |
;mov ecx, 0x1b |
;rdmsr ; it may be replaced to |
;and ax, 0xf000 ; mov eax, 0xfee00000 |
mov [acpi_lapic_base], 0xfee00000 |
; xchg bx, bx |
cmp [LAPIC_BASE], 0 |
jne .done |
stdcall map_io_mem, [acpi_lapic_base], 0x1000, PG_SW |
mov [LAPIC_BASE], eax |
211,32 → 206,8 |
; Start (every 0.01 sec) |
; mov dword[esi + APIC_LVT_timer], 0x30020; periodic int 0x20 |
; mov dword[esi + APIC_timer_init], eax |
xchg bx, bx |
; mov al, 0x0F |
; out 0x70, al |
; mov al, 0x0A |
; out 0x71, al |
; mov [OS_BASE+0x469], word (__ap_start_16) shr 4 |
; mov [OS_BASE+0x469], word 0 |
mov [esi+APIC_ICRH], dword 0 |
mov [esi+APIC_ICRL], dword 0xc4500 |
mov ecx, 1000 |
@@: |
loop @B |
mov [esi+APIC_ICRH], dword 0 |
mov [esi+APIC_ICRL], dword 0xC4600+((0x10000+__ap_start_16) shr 12) |
; mov [esi+APIC_ICRL], dword 0xC4612 |
; mov [esi+APIC_ICRH], dword 0 |
; mov [esi+APIC_ICRL], dword CMD_IPI_INIT+IPI_LEVEL_ASSERT+16 |
.done: |
ret |
;=========================================================== |
448,7 → 419,35 |
pop ebp |
ret |
align 4 |
start_ap: |
;eax= cpu id |
; xchg bx, bx |
test eax, eax ;do not start self |
jz .exit |
cmp eax, [cpu_count] |
ja .exit |
mov eax, [smpt+eax*4] |
shl eax, 24 |
mov [esi+APIC_ICRH], eax |
mov [esi+APIC_ICRL], dword (IPI_INIT+IPI_LEVEL_ASSERT) |
mov ecx, 10000 |
@@: |
loop @B |
CMD_IPI_START equ (IPI_START+IPI_LEVEL_ASSERT)+((0x10000+__ap_start_16) shr 12) |
mov [esi+APIC_ICRH], eax |
mov [esi+APIC_ICRL], dword CMD_IPI_START |
.exit: |
ret |
/kernel/branches/Kolibri-acpi/gui/font.inc |
---|
7,7 → 7,7 |
$Revision$ |
; // Alver 22.06.2008 // { |
;------------------------------------------------------------------------------ |
align 4 |
dtext_asciiz_esi: ; for skins title out |
push eax |
14,8 → 14,7 |
xor eax, eax |
inc eax |
jmp dtext.1 |
; } \\ Alver \\ |
;------------------------------------------------------------------------------ |
align 4 |
dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org]) |
; ebx x & y |
26,12 → 25,11 |
; B = 1 <=> fill background with color eax |
; edx start of text |
; edi 1 force |
; // Alver 22.06.2008 // { |
push eax |
xor eax, eax |
;-------------------------------------- |
align 4 |
.1: |
; } \\ Alver \\ |
pushad |
movsx eax, bx ; eax=y |
sar ebx, 16 ; ebx=x |
39,6 → 37,8 |
cmp esi, 255 |
jb .loop |
mov esi, 255 |
;-------------------------------------- |
align 4 |
.loop: |
test ecx, ecx |
js .test_asciiz |
45,15 → 45,18 |
dec esi |
js .end |
jmp @f |
;-------------------------------------- |
align 4 |
.test_asciiz: |
cmp byte [edx], 0 |
jz .end |
; // Alver 22.06.2008 // { |
cmp byte [esp+28], 1 |
jne @f |
dec esi |
js .end |
; } \\ Alver \\ |
;-------------------------------------- |
align 4 |
@@: |
inc edx |
pushad |
62,9 → 65,13 |
jnz .font2 |
mov esi, 9 |
lea ebp, [FONT_I+8*edx+edx] |
;-------------------------------------- |
align 4 |
.symloop1: |
mov dl, byte [ebp] |
or dl, 1 shl 6 |
;-------------------------------------- |
align 4 |
.pixloop1: |
shr dl, 1 |
jz .pixloop1end |
72,6 → 79,8 |
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area |
call [putpixel] |
jmp .pixloop1cont |
;-------------------------------------- |
align 4 |
.nopix: |
test ecx, 0x40000000 |
jz .pixloop1cont |
80,9 → 89,13 |
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area |
call [putpixel] |
pop ecx |
;-------------------------------------- |
align 4 |
.pixloop1cont: |
inc eax |
jmp .pixloop1 |
;-------------------------------------- |
align 4 |
.pixloop1end: |
sub eax, 6 |
inc ebx |
92,14 → 105,20 |
popad |
add eax, 6 |
jmp .loop |
;-------------------------------------- |
align 4 |
.font2: |
add edx, edx |
lea ebp, [FONT_II+4*edx+edx+1] |
push 9 |
movzx esi, byte [ebp-1] |
;-------------------------------------- |
align 4 |
.symloop2: |
mov dl, byte [ebp] |
push esi |
;-------------------------------------- |
align 4 |
.pixloop2: |
shr dl, 1 |
jnc .nopix2 |
106,6 → 125,8 |
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area |
call [putpixel] |
jmp .pixloop2cont |
;-------------------------------------- |
align 4 |
.nopix2: |
test ecx, 0x40000000 |
jz .pixloop2cont |
114,6 → 135,8 |
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area |
call [putpixel] |
pop ecx |
;-------------------------------------- |
align 4 |
.pixloop2cont: |
inc eax |
dec esi |
128,7 → 151,10 |
add dword [esp+28], esi |
popad |
jmp .loop |
;-------------------------------------- |
align 4 |
.end: |
popad |
pop eax ; << // Alver 22.06.2008 // << |
pop eax |
ret |
;------------------------------------------------------------------------------ |
/kernel/branches/Kolibri-acpi/gui/skincode.inc |
---|
11,7 → 11,8 |
include "skindata.inc" |
;skin_data = 0x00778000 |
;------------------------------------------------------------------------------ |
align 4 |
read_skin_file: |
stdcall load_file, ebx |
test eax, eax |
21,6 → 22,8 |
cmp ebx, 32*1024 |
jb @f |
mov ebx, 32*1024 |
;-------------------------------------- |
align 4 |
@@: |
lea ecx, [ebx+3] |
shr ecx, 2 |
32,16 → 35,20 |
call parse_skin_data |
xor eax, eax |
ret |
;-------------------------------------- |
align 4 |
.notfound: |
xor eax, eax |
inc eax |
ret |
;-------------------------------------- |
align 4 |
.noskin: |
stdcall kernel_free, eax |
push 2 |
pop eax |
ret |
;------------------------------------------------------------------------------ |
struct SKIN_HEADER |
ident dd ? |
version dd ? |
81,13 → 88,15 |
type dw ? |
data dd ? |
ends |
;------------------------------------------------------------------------------ |
align 4 |
load_default_skin: |
mov [_skinh], 22 |
mov ebx, _skin_file_default |
call read_skin_file |
ret |
;------------------------------------------------------------------------------ |
align 4 |
parse_skin_data: |
mov ebp, skin_data |
cmp [ebp+SKIN_HEADER.ident], 'SKIN' |
127,6 → 136,8 |
mov ebx, [ebp+SKIN_HEADER.bitmaps] |
add ebx, skin_data |
;-------------------------------------- |
align 4 |
.lp1: |
cmp dword[ebx], 0 |
je .end_bitmaps |
139,8 → 150,12 |
or ecx, ecx |
jnz @f |
mov edx, skin_inactive.left.data |
;-------------------------------------- |
align 4 |
@@: |
jmp .next_bitmap |
;-------------------------------------- |
align 4 |
.not_left: |
dec eax |
jnz .not_oper |
152,8 → 167,12 |
or ecx, ecx |
jnz @f |
mov edx, skin_inactive.oper.data |
;-------------------------------------- |
align 4 |
@@: |
jmp .next_bitmap |
;-------------------------------------- |
align 4 |
.not_oper: |
dec eax |
jnz .not_base |
163,11 → 182,17 |
jnz @f |
mov eax, [skin_inactive.left.width] |
mov edx, skin_inactive.base.data |
;-------------------------------------- |
align 4 |
@@: |
jmp .next_bitmap |
;-------------------------------------- |
align 4 |
.not_base: |
add ebx, 8 |
jmp .lp1 |
;-------------------------------------- |
align 4 |
.next_bitmap: |
mov ecx, [ebx+SKIN_BITMAPS.data] |
add ecx, skin_data |
178,10 → 203,13 |
mov [edx+0], ecx |
add ebx, 8 |
jmp .lp1 |
;-------------------------------------- |
align 4 |
.end_bitmaps: |
mov ebx, [ebp+SKIN_HEADER.buttons] |
add ebx, skin_data |
;-------------------------------------- |
align 4 |
.lp2: |
cmp dword[ebx], 0 |
je .end_buttons |
190,14 → 218,20 |
jnz .not_close |
mov edx, skin_btn_close |
jmp .next_button |
;-------------------------------------- |
align 4 |
.not_close: |
dec eax |
jnz .not_minimize |
mov edx, skin_btn_minimize |
jmp .next_button |
;-------------------------------------- |
align 4 |
.not_minimize: |
add ebx, 12 |
jmp .lp2 |
;-------------------------------------- |
align 4 |
.next_button: |
movsx eax, [ebx+SKIN_BUTTONS.left] |
mov [edx+SKIN_BUTTON.left], eax |
209,18 → 243,13 |
mov [edx+SKIN_BUTTON.height], eax |
add ebx, 12 |
jmp .lp2 |
;-------------------------------------- |
align 4 |
.end_buttons: |
.exit: |
ret |
sys_putimage_with_check: |
or ebx, ebx |
jz @f |
call sys_putimage.forced |
@@: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
drawwindow_IV_caption: |
mov ebp, skin_active |
227,8 → 256,9 |
or al, al |
jnz @f |
mov ebp, skin_inactive |
;-------------------------------------- |
align 4 |
@@: |
mov esi, [esp+4] |
mov eax, [esi+WDATA.box.width] ; window width |
mov edx, [ebp+SKIN_DATA.left.left] |
238,8 → 268,12 |
add ecx, [_skinh] |
mov ebx, [ebp+SKIN_DATA.left.data] |
call sys_putimage_with_check |
or ebx, ebx |
jz @f |
call sys_putimage.forced |
;-------------------------------------- |
align 4 |
@@: |
mov esi, [esp+4] |
mov eax, [esi+WDATA.box.width] |
sub eax, [ebp+SKIN_DATA.left.width] |
260,6 → 294,8 |
mov edx, [ebp+SKIN_DATA.base.left] |
sub edx, [ebp+SKIN_DATA.base.width] |
shl edx, 16 |
;-------------------------------------- |
align 4 |
.baseskinloop: |
shr edx, 16 |
add edx, [ebp+SKIN_DATA.base.width] |
266,11 → 302,19 |
shl edx, 16 |
push eax ebx ecx edx |
call sys_putimage_with_check |
or ebx, ebx |
jz @f |
call sys_putimage.forced |
;-------------------------------------- |
align 4 |
@@: |
pop edx ecx ebx eax |
dec eax |
jnz .baseskinloop |
;-------------------------------------- |
align 4 |
.non_base: |
mov esi, [esp+4] |
283,16 → 327,18 |
mov ecx, [ebp+SKIN_DATA.oper.width] |
shl ecx, 16 |
add ecx, [_skinh] |
call sys_putimage_with_check |
or ebx, ebx |
jz @f |
call sys_putimage.forced |
;-------------------------------------- |
align 4 |
@@: |
ret |
;//mike.dld, 2006-08-02 ] |
;------------------------------------------------------------------------------ |
align 4 |
drawwindow_IV: |
;param1 - aw_yes |
pusha |
push edx |
303,8 → 349,9 |
cmp byte [esp+32+4+4], 0 |
jne @f |
mov ebp, skin_inactive |
;-------------------------------------- |
align 4 |
@@: |
mov eax, [edi+WDATA.box.left] |
shl eax, 16 |
mov ax, word [edi+WDATA.box.left] |
313,9 → 360,6 |
shl ebx, 16 |
mov bx, word [edi+WDATA.box.top] |
add bx, word [edi+WDATA.box.height] |
; mov esi,[edi+24] |
; shr esi,1 |
; and esi,0x007f7f7f |
mov esi, [ebp+SKIN_DATA.colors.outer] |
or esi, 1 shl 25 ; 0x02000000 used for draw_rectangle without top line |
ror ebx, 16 |
324,6 → 368,8 |
rol ebx, 16 |
call draw_rectangle |
mov ecx, 3 |
;-------------------------------------- |
align 4 |
_dw3l: |
add eax, 1*65536-1 |
add ebx, 0*65536-1 |
357,13 → 403,14 |
mov edi, [common_colours+4]; standard grab color |
call [drawbar] |
jmp draw_clientbar |
;-------------------------------------- |
align 4 |
@@: |
mov al, [esp+32+4+4] |
call drawwindow_IV_caption |
;-------------------------------------- |
align 4 |
draw_clientbar: |
mov esi, [esp] |
mov edx, [esi+WDATA.box.top] ; WORK AREA |
382,11 → 429,11 |
test edi, 0x40000000 |
jnz _noinside2 |
call [drawbar] |
;-------------------------------------- |
align 4 |
_noinside2: |
cmp dword[skin_data], 'SKIN' |
jne no_skin_add_button |
;* close button |
mov edi, [BTN_ADDR] |
movzx eax, word [edi] |
411,6 → 458,8 |
mov ebx, [esp] |
mov ebx, [ebx+WDATA.box.width] |
inc ebx |
;-------------------------------------- |
align 4 |
_bCx_at_right: |
add ebx, [skin_btn_close.left] |
mov [eax], bx |
425,7 → 474,6 |
mov ebx, [skin_btn_close.height] |
dec ebx |
mov [eax], bx |
;* minimize button |
mov edi, [BTN_ADDR] |
movzx eax, word [edi] |
450,6 → 498,8 |
mov ebx, [esp] |
mov ebx, [ebx+WDATA.box.width] |
inc ebx |
;-------------------------------------- |
align 4 |
_bMx_at_right: |
add ebx, [skin_btn_minimize.left] |
mov [eax], bx |
464,10 → 514,10 |
mov ebx, [skin_btn_minimize.height] |
dec ebx |
mov [eax], bx |
;-------------------------------------- |
align 4 |
no_skin_add_button: |
pop edi |
popa |
ret 4 |
;------------------------------------------------------------------------------ |
/kernel/branches/Kolibri-acpi/gui/window.inc |
---|
52,16 → 52,18 |
; type I - original style |
call drawwindow_I |
jmp window._.draw_window_caption.2 |
;-------------------------------------- |
align 4 |
@@: |
dec al |
jnz @f |
; type II - only reserve area, no draw |
call sys_window_mouse |
; call sys_window_mouse |
call [draw_pointer] |
jmp .exit |
;-------------------------------------- |
align 4 |
@@: |
dec al |
jnz @f |
71,6 → 73,8 |
jmp window._.draw_window_caption.2 |
; type IV & V - skinned window (resizable & not) |
;-------------------------------------- |
align 4 |
@@: |
mov eax, [TASK_COUNT] |
movzx eax, word[WIN_POS + eax * 2] |
80,10 → 84,11 |
push eax |
call drawwindow_IV |
jmp window._.draw_window_caption.2 |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
syscall_display_settings: ;///// system function 48 /////////////////////////// |
132,10 → 137,11 |
cmp ebx, .sizeof.ftable / 4 |
ja @f |
jmp [.ftable + ebx * 4] |
;-------------------------------------- |
align 4 |
@@: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.00: |
xor eax, eax |
145,10 → 151,11 |
mov [windowtypechanged], eax |
jmp syscall_display_settings._.redraw_whole_screen |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.01: |
and ecx, 1 |
156,10 → 163,11 |
je .exit |
mov [buttontype], ecx |
mov [windowtypechanged], ebx |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.02: |
dec ebx |
170,7 → 178,7 |
rep movsb |
mov [windowtypechanged], ebx |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.03: |
mov edi, ecx |
179,13 → 187,13 |
mov ecx, edx |
rep movsb |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.04: |
mov eax, [_skinh] |
mov [esp + 32], eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.05: |
mov eax, [screen_workarea.left - 2] |
195,7 → 203,7 |
mov ax, word[screen_workarea.bottom] |
mov [esp + 20], eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.06: |
xor esi, esi |
210,14 → 218,19 |
or eax, eax |
jge @f |
xor eax, eax |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.left], eax |
cmp ebx, edi |
jle @f |
mov ebx, edi |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.right], ebx |
;-------------------------------------- |
align 4 |
.check_horizontal: |
mov edi, [Screen_Max_Y] |
mov eax, edx |
229,14 → 242,19 |
or eax, eax |
jge @f |
xor eax, eax |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.top], eax |
cmp ebx, edi |
jle @f |
mov ebx, edi |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.bottom], ebx |
;-------------------------------------- |
align 4 |
.check_if_redraw_needed: |
or esi, esi |
jz .exit |
243,10 → 261,11 |
call repos_windows |
jmp syscall_display_settings._.calculate_whole_screen |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.07: |
mov eax, [_skinmargins + 0] |
254,7 → 273,7 |
mov eax, [_skinmargins + 4] |
mov [esp + 20], eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.08: |
mov ebx, ecx |
265,10 → 284,12 |
call syscall_display_settings._.calculate_whole_screen |
jmp syscall_display_settings._.redraw_whole_screen |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings._.calculate_whole_screen: |
xor eax, eax |
xor ebx, ebx |
275,7 → 296,8 |
mov ecx, [Screen_Max_X] |
mov edx, [Screen_Max_Y] |
jmp calculatescreen |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings._.redraw_whole_screen: |
xor eax, eax |
mov [draw_limits.left], eax |
286,7 → 308,7 |
mov [draw_limits.bottom], eax |
mov eax, window_data |
jmp redrawscreen |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
syscall_set_window_shape: ;///// system function 50 /////////////////////////// |
304,15 → 326,17 |
test ebx, ebx |
jne .shape_scale |
mov [edi + APPDATA.wnd_shape], ecx |
;-------------------------------------- |
align 4 |
.shape_scale: |
dec ebx |
jnz .exit |
mov [edi + APPDATA.wnd_shape_scale], ecx |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
syscall_move_window: ;///// system function 67 //////////////////////////////// |
332,19 → 356,26 |
cmp ebx, -1 |
jne @f |
mov ebx, [edi + WDATA.box.left] |
;-------------------------------------- |
align 4 |
@@: |
cmp ecx, -1 |
jne @f |
mov ecx, [edi + WDATA.box.top] |
;-------------------------------------- |
align 4 |
@@: |
cmp edx, -1 |
jne @f |
mov edx, [edi + WDATA.box.width] |
;-------------------------------------- |
align 4 |
@@: |
cmp esi, -1 |
jne @f |
mov esi, [edi + WDATA.box.height] |
;-------------------------------------- |
align 4 |
@@: |
push esi edx ecx ebx |
mov eax, esp |
359,10 → 390,11 |
; NOTE: do we really need this? to be reworked |
; call [draw_pointer] |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
syscall_window_settings: ;///// system function 71 ///////////////////////////// |
391,12 → 423,13 |
; jnz .exit_fail |
; not implemented yet |
;-------------------------------------- |
align 4 |
.exit_fail: |
xor eax, eax |
inc eax ; eax = 1 (fail) |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
set_window_defaults: ;///////////////////////////////////////////////////////// |
407,6 → 440,8 |
push eax ecx |
xor eax, eax |
mov ecx, WIN_STACK |
;-------------------------------------- |
align 4 |
@@: |
inc eax |
add ecx, 2 |
418,7 → 453,7 |
jne @b |
pop ecx eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
calculatescreen: ;///////////////////////////////////////////////////////////// |
445,7 → 480,8 |
jbe .exit |
push edx ecx ebx eax |
;-------------------------------------- |
align 4 |
.next_window: |
movzx edi, word[WIN_POS + esi * 2] |
shl edi, 5 |
475,25 → 511,33 |
cmp eax, [esp + RECT.left] |
jae @f |
mov eax, [esp + RECT.left] |
;-------------------------------------- |
align 4 |
@@: |
cmp ebx, [esp + RECT.top] |
jae @f |
mov ebx, [esp + RECT.top] |
;-------------------------------------- |
align 4 |
@@: |
cmp ecx, [esp + RECT.right] |
jbe @f |
mov ecx, [esp + RECT.right] |
;-------------------------------------- |
align 4 |
@@: |
cmp edx, [esp + RECT.bottom] |
jbe @f |
mov edx, [esp + RECT.bottom] |
;-------------------------------------- |
align 4 |
@@: |
push esi |
movzx esi, word[WIN_POS + esi * 2] |
call window._.set_screen |
pop esi |
;-------------------------------------- |
align 4 |
.skip_window: |
inc esi |
dec ebp |
500,7 → 544,8 |
jnz .next_window |
pop eax ebx ecx edx |
;-------------------------------------- |
align 4 |
.exit: |
pop ebp |
inc [_display.mask_seqno] |
507,7 → 552,7 |
popfd |
pop esi |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
repos_windows: ;/////////////////////////////////////////////////////////////// |
519,7 → 564,8 |
call force_redraw_background |
dec ecx |
jle .exit |
;-------------------------------------- |
align 4 |
.next_window: |
mov [edi + WDATA.fl_redraw], 1 |
test [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED |
534,10 → 580,13 |
sub eax, ebx |
jle @f |
mov [edi + WDATA.box.width], ebx |
;-------------------------------------- |
align 4 |
@@: |
sub ebx, [edi + WDATA.box.width] |
mov [edi + WDATA.box.left], ebx |
;-------------------------------------- |
align 4 |
.fix_vertical: |
mov eax, [edi + WDATA.box.top] |
add eax, [edi + WDATA.box.height] |
548,11 → 597,23 |
sub eax, ebx |
jle @f |
mov [edi + WDATA.box.height], ebx |
;-------------------------------------- |
align 4 |
@@: |
sub ebx, [edi + WDATA.box.height] |
mov [edi + WDATA.box.top], ebx |
jmp .fix_client_box |
;-------------------------------------- |
align 4 |
.fix_client_box: |
call window._.set_window_clientbox |
add edi, sizeof.WDATA |
loop .next_window |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;-------------------------------------- |
align 4 |
.fix_maximized: |
mov eax, [screen_workarea.left] |
mov [edi + WDATA.box.left], eax |
566,20 → 627,12 |
sub eax, [screen_workarea.bottom] |
neg eax |
mov [edi + WDATA.box.height], eax |
.fix_client_box: |
call window._.set_window_clientbox |
add edi, sizeof.WDATA |
loop .next_window |
.exit: |
ret |
align 4 |
jmp .fix_client_box |
;------------------------------------------------------------------------------ |
sys_window_mouse: ;//////////////////////////////////////////////////////////// |
;align 4 |
;------------------------------------------------------------------------------ |
;sys_window_mouse: ;//////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
; NOTE: commented out since doesn't provide necessary functionality |
597,8 → 650,8 |
; |
; .exit: |
; pop eax |
ret |
; ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
draw_rectangle: ;////////////////////////////////////////////////////////////// |
613,13 → 666,13 |
push eax ebx ecx edi |
xor edi, edi |
;-------------------------------------- |
align 4 |
.flags_set: |
push ebx |
; set line color |
mov ecx, esi |
; sub esi, 1 shl 25 |
; draw top border |
rol ebx, 16 |
push ebx |
629,6 → 682,8 |
jnz @f |
sub ecx, 1 shl 25 |
call [draw_line] |
;-------------------------------------- |
align 4 |
@@: |
; draw bottom border |
mov ebx, [esp - 2] |
652,13 → 707,14 |
pop edi ecx ebx eax |
ret |
;-------------------------------------- |
align 4 |
.forced: |
push eax ebx ecx edi |
xor edi, edi |
inc edi |
jmp .flags_set |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
drawwindow_I_caption: ;//////////////////////////////////////////////////////// |
677,11 → 733,14 |
cmp ebx, eax |
jbe @f |
mov ebx, eax |
;-------------------------------------- |
align 4 |
@@: |
push ebx |
xor edi, edi |
;-------------------------------------- |
align 4 |
.next_line: |
mov ebx, edx |
shl ebx, 16 |
697,6 → 756,8 |
jz @f |
sub ecx, 0x00040404 |
mov [esi + WDATA.cl_titlebar], ecx |
;-------------------------------------- |
align 4 |
@@: |
and ecx, 0x00ffffff |
call [draw_line] |
707,7 → 768,7 |
add esp, 4 |
pop [esi + WDATA.cl_titlebar] |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
drawwindow_I: ;//////////////////////////////////////////////////////////////// |
753,11 → 814,12 |
mov ecx, [esi + WDATA.box.width] |
mov edx, [esi + WDATA.box.height] |
call [drawbar] |
;-------------------------------------- |
align 4 |
.exit: |
popad |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
drawwindow_III_caption: ;///////////////////////////////////////////////////// |
777,11 → 839,14 |
cmp ebx, eax |
jb @f |
mov ebx, eax |
;-------------------------------------- |
align 4 |
@@: |
push ebx |
xor edi, edi |
;-------------------------------------- |
align 4 |
.next_line: |
mov ebx, edx |
shl ebx, 16 |
795,10 → 860,14 |
test ecx, 0x40000000 |
jz @f |
add ecx, 0x00040404 |
;-------------------------------------- |
align 4 |
@@: |
test ecx, 0x80000000 |
jz @f |
sub ecx, 0x00040404 |
;-------------------------------------- |
align 4 |
@@: |
mov [esi + WDATA.cl_titlebar], ecx |
and ecx, 0x00ffffff |
810,7 → 879,7 |
add esp, 4 |
pop [esi + WDATA.cl_titlebar] |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
drawwindow_III: ;////////////////////////////////////////////////////////////// |
842,7 → 911,8 |
mov ecx, 3 |
mov esi, [edx + WDATA.cl_frames] |
or esi, 1 shl 25; 0x02000000 used for draw_rectangle without top line |
;-------------------------------------- |
align 4 |
.next_frame: |
add eax, 1 * 65536 - 1 |
add ebx, 0 * 65536 - 1 |
882,11 → 952,12 |
sub ecx, 4 |
sub edx, 4 |
call [drawbar] |
;-------------------------------------- |
align 4 |
.exit: |
popad |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
waredraw: ;//////////////////////////////////////////////////////////////////// |
935,7 → 1006,8 |
mov [edi + WDATA.fl_redraw], 1 |
xor eax, eax |
jmp .exit |
;-------------------------------------- |
align 4 |
.do_not_draw: |
; no it's not, just activate the window |
call window._.window_activate |
942,13 → 1014,13 |
xor eax, eax |
mov byte[MOUSE_BACKGROUND], al |
mov byte[DONT_DRAW_MOUSE], al |
;-------------------------------------- |
align 4 |
.exit: |
mov byte[MOUSE_DOWN], 0 |
inc eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
minimize_window: ;///////////////////////////////////////////////////////////// |
988,12 → 1060,13 |
call redrawscreen |
pop esi edx ecx ebx eax |
;-------------------------------------- |
align 4 |
.exit: |
popfd |
pop edi |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
restore_minimized_window: ;//////////////////////////////////////////////////// |
1021,6 → 1094,8 |
cmp eax, [TASK_COUNT] |
jz @f |
mov ebp, calculatescreen |
;-------------------------------------- |
align 4 |
@@: |
mov eax, [edi + WDATA.box.left] |
mov ebx, [edi + WDATA.box.top] |
1031,12 → 1106,13 |
call ebp |
inc [_display.mask_seqno] |
mov byte[MOUSE_BACKGROUND], 0 |
;-------------------------------------- |
align 4 |
.exit: |
popfd |
popad |
ret |
;------------------------------------------------------------------------------ |
align 4 |
; TODO: remove this proc |
;------------------------------------------------------------------------------ |
1056,13 → 1132,15 |
jnz @f |
call minimize_window |
jmp .exit |
;-------------------------------------- |
align 4 |
@@: |
call restore_minimized_window |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
sys_window_maximize_handler: ;///////////////////////////////////////////////// |
1099,7 → 1177,8 |
sub [esp + BOX.height], ecx |
mov eax, esp |
jmp .set_box |
;-------------------------------------- |
align 4 |
.restore_size: |
mov eax, esi |
shl eax, 8 |
1109,7 → 1188,8 |
[eax + BOX.top] \ |
[eax + BOX.left] |
mov eax, esp |
;-------------------------------------- |
align 4 |
.set_box: |
test bl, WSTATE_ROLLEDUP |
jz @f |
1118,15 → 1198,17 |
call window._.get_rolledup_height |
mov [ecx + BOX.height], eax |
xchg eax, ecx |
;-------------------------------------- |
align 4 |
@@: |
call window._.set_window_box |
add esp, sizeof.BOX |
;-------------------------------------- |
align 4 |
.exit: |
inc [_display.mask_seqno] |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
sys_window_rollup_handler: ;/////////////////////////////////////////////////// |
1154,7 → 1236,8 |
[edi + WDATA.box.left] |
mov eax, esp |
jmp .set_box |
;-------------------------------------- |
align 4 |
.restore_size: |
test bl, WSTATE_MAXIMIZED |
jnz @f |
1161,7 → 1244,8 |
add esp, -sizeof.BOX |
lea eax, [edx + APPDATA.saved_box] |
jmp .set_box |
;-------------------------------------- |
align 4 |
@@: |
mov eax, [screen_workarea.top] |
push [screen_workarea.bottom] \ |
1170,13 → 1254,13 |
[edi + WDATA.box.left] |
sub [esp + BOX.height], eax |
mov eax, esp |
;-------------------------------------- |
align 4 |
.set_box: |
call window._.set_window_box |
add esp, sizeof.BOX |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
sys_window_start_moving_handler: ;///////////////////////////////////////////// |
1188,9 → 1272,8 |
;------------------------------------------------------------------------------ |
mov edi, eax |
call window._.draw_negative_box |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
sys_window_end_moving_handler: ;/////////////////////////////////////////////// |
1212,7 → 1295,7 |
mov bl, [edi + WDATA.fl_wstate] |
call window._.set_window_box |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
sys_window_moving_handler: ;/////////////////////////////////////////////////// |
1228,7 → 1311,6 |
mov edi, ebx |
call window._.draw_negative_box |
ret |
;============================================================================== |
;///// private functions ////////////////////////////////////////////////////// |
;============================================================================== |
1251,7 → 1333,7 |
; to be reworked |
; new_window_starting dd ? |
;endg |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.invalidate_screen: ;////////////////////////////////////////////////// |
1271,6 → 1353,8 |
cmp ecx, edx |
jle @f |
mov ecx, edx |
;-------------------------------------- |
align 4 |
@@: |
mov [draw_limits.left], ecx |
mov ecx, [eax + BOX.left] |
1279,6 → 1363,8 |
cmp ecx, edx |
jae @f |
mov ecx, edx |
;-------------------------------------- |
align 4 |
@@: |
mov [draw_limits.right], ecx |
mov ecx, [eax + BOX.top] |
1286,6 → 1372,8 |
cmp ecx, edx |
jle @f |
mov ecx, edx |
;-------------------------------------- |
align 4 |
@@: |
mov [draw_limits.top], ecx |
mov ecx, [eax + BOX.top] |
1294,9 → 1382,10 |
cmp ecx, edx |
jae @f |
mov ecx, edx |
;-------------------------------------- |
align 4 |
@@: |
mov [draw_limits.bottom], ecx |
; recalculate screen buffer at old position |
push ebx |
mov edx, [eax + BOX.height] |
1307,7 → 1396,6 |
add edx, ebx |
call calculatescreen |
pop eax |
; recalculate screen buffer at new position |
mov edx, [eax + BOX.height] |
mov ecx, [eax + BOX.width] |
1325,7 → 1413,7 |
pop ebx eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.set_window_box: ;///////////////////////////////////////////////////// |
1350,10 → 1438,10 |
repz cmpsd |
pop edi |
jz .exit |
;-------------------------------------- |
align 4 |
@@: |
add esp, -sizeof.BOX |
mov ebx, esp |
if WDATA.box |
lea esi, [edi + WDATA.box] |
1402,11 → 1490,12 |
jnz .exit |
mov [eax + APPDATA.saved_box.height], edx |
;-------------------------------------- |
align 4 |
.exit: |
pop esi ebx eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.set_window_clientbox: ;/////////////////////////////////////////////// |
1447,7 → 1536,8 |
mov [edi + SLOT_BASE + APPDATA.wnd_clientbox.height], eax |
add esp, 4 |
jmp .exit |
;-------------------------------------- |
align 4 |
.whole_window: |
xor eax, eax |
mov [edi + SLOT_BASE + APPDATA.wnd_clientbox.left], eax |
1456,11 → 1546,12 |
mov [edi + SLOT_BASE + APPDATA.wnd_clientbox.width], eax |
mov eax, [ecx + WDATA.box.height] |
mov [edi + SLOT_BASE + APPDATA.wnd_clientbox.height], eax |
;-------------------------------------- |
align 4 |
.exit: |
pop edi ecx eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.sys_set_window: ;///////////////////////////////////////////////////// |
1519,7 → 1610,8 |
je @f |
xor eax, eax |
;-------------------------------------- |
align 4 |
@@: |
mov [edi + APPDATA.wnd_caption], eax |
1547,7 → 1639,8 |
mov byte[KEY_COUNT], 0 ; empty keyboard buffer |
mov byte[BTN_COUNT], 0 ; empty button buffer |
;-------------------------------------- |
align 4 |
.set_client_box: |
; update window client box coordinates |
call window._.set_window_clientbox |
1556,7 → 1649,7 |
mov [edi + WDATA.fl_redraw], 0 |
mov edx, edi |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.check_window_position: ;////////////////////////////////////////////// |
1575,7 → 1668,8 |
mov esi, [Screen_Max_X] |
cmp ecx, esi |
ja .fix_width_high |
;-------------------------------------- |
align 4 |
.check_left: |
or eax, eax |
jl .fix_left_low |
1582,12 → 1676,14 |
add eax, ecx |
cmp eax, esi |
jg .fix_left_high |
;-------------------------------------- |
align 4 |
.check_height: |
mov esi, [Screen_Max_Y] |
cmp edx, esi |
ja .fix_height_high |
;-------------------------------------- |
align 4 |
.check_top: |
or ebx, ebx |
jl .fix_top_low |
1594,43 → 1690,50 |
add ebx, edx |
cmp ebx, esi |
jg .fix_top_high |
;-------------------------------------- |
align 4 |
.exit: |
pop esi edx ecx ebx eax |
ret |
;-------------------------------------- |
align 4 |
.fix_width_high: |
mov ecx, esi |
mov [edi + WDATA.box.width], esi |
jmp .check_left |
;-------------------------------------- |
align 4 |
.fix_left_low: |
xor eax, eax |
mov [edi + WDATA.box.left], eax |
jmp .check_height |
;-------------------------------------- |
align 4 |
.fix_left_high: |
mov eax, esi |
sub eax, ecx |
mov [edi + WDATA.box.left], eax |
jmp .check_height |
;-------------------------------------- |
align 4 |
.fix_height_high: |
mov edx, esi |
mov [edi + WDATA.box.height], esi |
jmp .check_top |
;-------------------------------------- |
align 4 |
.fix_top_low: |
xor ebx, ebx |
mov [edi + WDATA.box.top], ebx |
jmp .exit |
;-------------------------------------- |
align 4 |
.fix_top_high: |
mov ebx, esi |
sub ebx, edx |
mov [edi + WDATA.box.top], ebx |
jmp .exit |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.get_titlebar_height: ;//////////////////////////////////////////////// |
1645,10 → 1748,12 |
jne @f |
mov eax, [_skinh] |
ret |
;-------------------------------------- |
align 4 |
@@: |
mov eax, 21 |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.get_rolledup_height: ;//////////////////////////////////////////////// |
1664,15 → 1769,19 |
mov eax, [_skinh] |
add eax, 3 |
ret |
;-------------------------------------- |
align 4 |
@@: |
or al, al |
jnz @f |
mov eax, 21 |
ret |
;-------------------------------------- |
align 4 |
@@: |
mov eax, 21 + 2 |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.set_screen: ;///////////////////////////////////////////////////////// |
1704,7 → 1813,8 |
jnz .check_for_shaped_window |
cmp [window_data + edi + WDATA.box.height], 0 |
jz .exit |
;-------------------------------------- |
align 4 |
.check_for_shaped_window: |
mov edi, esi |
shl edi, 8 |
1731,7 → 1841,8 |
push ax |
shl eax, 16 |
pop ax |
;-------------------------------------- |
align 4 |
.next_line: |
push ecx |
shr ecx, 2 |
1746,7 → 1857,8 |
jnz .next_line |
jmp .exit |
;-------------------------------------- |
align 4 |
.shaped_window: |
; for (y=0; y <= x_size; y++) |
; for (x=0; x <= x_size; x++) |
1794,10 → 1906,12 |
add [ff_ysz], ebx |
mov ebx, [ff_y] |
;-------------------------------------- |
align 4 |
.ff_new_y: |
mov edx, [ff_x] |
;-------------------------------------- |
align 4 |
.ff_new_x: |
; -- body -- |
mov ecx, [ff_scale] |
1817,6 → 1931,8 |
mov eax, esi |
mov [ebp], al |
; -- end body -- |
;-------------------------------------- |
align 4 |
@@: |
inc ebp |
inc edx |
1832,12 → 1948,14 |
jb .ff_new_y |
add esp, 24 |
;-------------------------------------- |
align 4 |
.exit: |
popad |
inc [_display.mask_seqno] |
ret |
;-------------------------------------- |
align 4 |
.read_byte: |
; eax - address |
; esi - slot |
1848,7 → 1966,7 |
call read_process_memory |
pop esi edx ecx eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.window_activate: ;//////////////////////////////////////////////////// |
1873,10 → 1991,12 |
je .set_window_redraw_flag |
cmp al, 0x04 |
jne .move_others_down |
;-------------------------------------- |
align 4 |
.set_window_redraw_flag: |
mov [window_data + ebx + WDATA.fl_redraw], 1 |
;-------------------------------------- |
align 4 |
.move_others_down: |
; ax <- process no |
movzx ebx, word[esi] |
1885,7 → 2005,8 |
; drop others |
xor eax, eax |
;-------------------------------------- |
align 4 |
.next_stack_window: |
cmp eax, [TASK_COUNT] |
jae .move_self_up |
1901,7 → 2022,8 |
jbe .next_stack_window |
dec word[WIN_STACK + eax * 2] |
jmp .next_stack_window |
;-------------------------------------- |
align 4 |
.move_self_up: |
movzx ebx, word[esi] |
; number of processes |
1911,7 → 2033,8 |
; update on screen - window stack |
xor eax, eax |
;-------------------------------------- |
align 4 |
.next_window_pos: |
cmp eax, [TASK_COUNT] |
jae .reset_vars |
1919,7 → 2042,8 |
movzx ebx, word[WIN_STACK + eax * 2] |
mov [WIN_POS + ebx * 2], ax |
jmp .next_window_pos |
;-------------------------------------- |
align 4 |
.reset_vars: |
mov byte[KEY_COUNT], 0 |
mov byte[BTN_COUNT], 0 |
1928,7 → 2052,6 |
pop ebx eax |
ret |
;------------------------------------------------------------------------------ |
window._.window_deactivate: ;//////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
1937,7 → 2060,8 |
;> esi = pointer to WIN_POS+ window data |
;------------------------------------------------------------------------------ |
push eax ebx |
;------------------------------------------------------------------------------ |
;-------------------------------------- |
align 4 |
.move_others_up: |
; ax <- process no |
movzx ebx, word[esi] |
1945,6 → 2069,8 |
movzx ebx, word[WIN_STACK + ebx * 2] |
; up others |
xor eax, eax |
;-------------------------------------- |
align 4 |
.next_stack_window: |
cmp eax, [TASK_COUNT] |
jae .move_self_down |
1953,7 → 2079,8 |
jae .next_stack_window |
inc word[WIN_STACK + eax * 2] |
jmp .next_stack_window |
;---------------------------------------------- |
;-------------------------------------- |
align 4 |
.move_self_down: |
movzx ebx, word[esi] |
; this is the last (and the low) |
1960,6 → 2087,8 |
mov [WIN_STACK + ebx * 2], word 1 |
; update on screen - window stack |
xor eax, eax |
;-------------------------------------- |
align 4 |
.next_window_pos: |
cmp eax, [TASK_COUNT] |
jae .reset_vars |
1967,7 → 2096,8 |
movzx ebx, word[WIN_STACK + eax * 2] |
mov [WIN_POS + ebx * 2], ax |
jmp .next_window_pos |
;----------------------------------------------- |
;-------------------------------------- |
align 4 |
.reset_vars: |
mov byte[KEY_COUNT], 0 |
mov byte[BTN_COUNT], 0 |
1999,7 → 2129,8 |
movzx eax, word[WIN_STACK + eax * 2] ; get value of the curr process |
lea esi, [WIN_POS + eax * 2] ; get address of this process at 0xC400 |
;-------------------------------------- |
align 4 |
.next_window: |
add esi, 2 |
2037,17 → 2168,19 |
jge .next_window |
pop esi edx ebx eax |
;-------------------------------------- |
align 4 |
.exit.redraw: |
xor ecx, ecx |
inc ecx |
ret |
;-------------------------------------- |
align 4 |
.exit.no_redraw: |
pop esi edx ebx eax |
xor ecx, ecx |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.draw_window_caption: ;//////////////////////////////////////////////// |
2060,6 → 2193,8 |
cmp edx, [CURRENT_TASK] |
jne @f |
inc eax |
;-------------------------------------- |
align 4 |
@@: |
mov edx, [CURRENT_TASK] |
shl edx, 5 |
2072,13 → 2207,15 |
je .draw_caption_style_3 |
jmp .not_style_3 |
;-------------------------------------- |
align 4 |
.draw_caption_style_3: |
push edx |
call drawwindow_IV_caption |
add esp, 4 |
jmp .2 |
;-------------------------------------- |
align 4 |
.not_style_3: |
cmp bl, 2 |
jne .not_style_2 |
2085,13 → 2222,15 |
call drawwindow_III_caption |
jmp .2 |
;-------------------------------------- |
align 4 |
.not_style_2: |
cmp bl, 0 |
jne .2 |
call drawwindow_I_caption |
;-------------------------------------- |
align 4 |
.2: |
mov edi, [CURRENT_TASK] |
shl edi, 5 |
2109,7 → 2248,8 |
je .skinned |
jmp .not_skinned |
;-------------------------------------- |
align 4 |
.skinned: |
mov ebp, [edi + window_data + WDATA.box.left - 2] |
mov bp, word[edi + window_data + WDATA.box.top] |
2136,7 → 2276,8 |
add bx, -3 |
add ebx, ebp |
jmp .dodraw |
;-------------------------------------- |
align 4 |
.not_skinned: |
cmp al, 1 |
je .exit |
2157,17 → 2298,19 |
mov esi, eax |
mov ebx, 0x00080007 |
add ebx, ebp |
;-------------------------------------- |
align 4 |
.dodraw: |
mov ecx, [common_colours + 16] |
or ecx, 0x80000000 |
xor edi, edi |
call dtext_asciiz_esi |
;-------------------------------------- |
align 4 |
.exit: |
call [draw_pointer] |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.draw_negative_box: ;////////////////////////////////////////////////// |
2178,6 → 2321,8 |
;------------------------------------------------------------------------------ |
push eax ebx esi |
mov esi, 0x01000000 |
;-------------------------------------- |
align 4 |
.1: |
mov eax, [edi + BOX.left - 2] |
mov ax, word[edi + BOX.left] |
2189,6 → 2334,8 |
pop esi ebx eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.end_moving__box: ;////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Draw positive box |
2198,9 → 2345,9 |
push eax ebx esi |
xor esi, esi |
jmp window._.draw_negative_box.1 |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.get_rect: ;///////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> void __fastcall get_window_rect(struct RECT* rc); |
2220,6 → 2367,5 |
add edx, [eax-twdw + WDATA.box.height] |
mov [ecx+RECT.bottom], edx |
ret |
;------------------------------------------------------------------------------ |
/kernel/branches/Kolibri-acpi/init.inc |
---|
432,6 → 432,11 |
ret |
endp |
iglobal |
align 4 |
acpi_lapic_base dd 0xfee00000 ; default local apic base |
endg |
uglobal |
align 4 |
acpi_rsdp rd 1 |
443,8 → 448,10 |
acpi_rsdt_base rd 1 |
acpi_madt_base rd 1 |
acpi_lapic_base rd 1 |
acpi_ioapic_base rd 1 |
cpu_count rd 1 |
smpt rd 16 |
endg |
ACPI_HI_RSDP_WINDOW_START equ 0x000E0000 |
493,6 → 500,7 |
lea ebx, [ecx+36] |
mov esi, [ecx+4] |
add esi, ecx |
align 4 |
.next: |
mov eax, [ebx] |
cmp [eax], edx |
513,9 → 521,16 |
pop ebx |
ret |
align 4 |
madt_find: |
ret |
align 4 |
check_acpi: |
call acpi_locate |
529,19 → 544,42 |
test eax, eax |
jz .done |
xchg bx, bx |
mov [acpi_madt_base-OS_BASE], eax |
mov ecx, [eax+36] |
mov [acpi_lapic_base-OS_BASE], ecx |
mov edi, smpt-OS_BASE |
mov ebx, [ecx+0x20] |
shr ebx, 24 ; read APIC ID |
mov [edi], ebx ; bootstrap always first |
inc [cpu_count] |
add edi, 4 |
lea edx, [eax+44] |
mov ecx, [eax+4] |
add ecx, eax |
.check: |
mov eax, [edx] |
cmp al, 1 |
je .ioapic |
cmp al, 0 |
jne .io_apic |
shr eax, 24 ; get APIC ID |
cmp eax, ebx ; skip self |
je .next |
test [edx+4], byte 1 ; is enabled ? |
jz .next |
cmp [cpu_count-OS_BASE], 16 |
jae .next |
stosd ; store APIC ID |
inc [cpu_count-OS_BASE] |
.next: |
mov eax, [edx] |
movzx eax, ah |
add edx, eax |
cmp edx, ecx |
548,7 → 586,11 |
jb .check |
.done: |
ret |
.ioapic: |
.io_apic: |
cmp al, 1 |
jne .next |
mov eax, [edx+4] |
mov [acpi_ioapic_base-OS_BASE], eax |
ret |
jmp .next |
/kernel/branches/Kolibri-acpi/kernel.asm |
---|
342,18 → 342,24 |
or ebx, CR4_PGE |
mov cr4, ebx |
@@: |
mov esi, [LAPIC_BASE] |
xor ebp, ebp |
.1: |
mov ebx, LFB_BASE |
mov edx, 128 |
mov ebx, [esi+0x20] ;apic_id |
shr ebx, 24 |
shl ebx, 6+2 |
add ebx, LFB_BASE |
mov edx, 32 |
.2: |
mov ecx, 128 |
mov ecx, 32 |
mov edi, ebx |
mov eax, [_display.width] |
lea ebx, [ebx+eax*4] |
mov eax, 0xFF808080 |
mov eax, ebp |
rep stosd |
dec edx |
jnz .2 |
dec ebp |
jmp .1 |
hlt |
466,6 → 472,8 |
mul [_display.height] |
mov [_WinMapSize], eax |
call calculate_fast_getting_offset_for_WinMapAddress |
mov esi, BOOT_VAR+0x9080 |
movzx ecx, byte [esi-1] |
mov [NumBiosDisks], ecx |
483,14 → 491,7 |
cmp [SCR_MODE], word 0x13 ; EGA 320*200 256 colors |
je v20ga32 |
jmp v20ga24 |
; 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 |
setvesa20: |
mov [PUTPIXEL], dword Vesa20_putpixel24 ; Vesa 2.0 |
mov [GETPIXEL], dword Vesa20_getpixel24 |
685,6 → 686,9 |
call LAPIC_init |
mov eax, 1 |
call start_ap |
; Enable timer IRQ (IRQ0) and hard drives IRQs (IRQ14, IRQ15) |
; they are used: when partitions are scanned, hd_read relies on timer |
call unmask_timer |
1992,21 → 1996,7 |
; restore default cursor before killing |
pusha |
mov ecx, [current_slot] |
mov eax, [def_cursor] |
mov [ecx+APPDATA.cursor], eax |
movzx eax, word [MOUSE_Y] |
movzx ebx, word [MOUSE_X] |
mov ecx, [Screen_Max_X] |
inc ecx |
mul ecx |
add eax, [_WinMapAddress] |
movzx edx, byte [ebx+eax] |
shl edx, 8 |
mov esi, [edx+SLOT_BASE+APPDATA.cursor] |
push esi |
call [_display.select_cursor] |
mov [current_cursor], esi |
call restore_default_cursor_before_killing |
popa |
@@: |
;-------------------------------------- |
2025,7 → 2015,25 |
mov ebx, 100 |
call delay_hs |
jmp waitterm |
;------------------------------------------------------------------------------ |
restore_default_cursor_before_killing: |
mov eax, [def_cursor] |
mov [ecx+APPDATA.cursor], eax |
movzx eax, word [MOUSE_Y] |
movzx ebx, word [MOUSE_X] |
mov ecx, [Screen_Max_X] |
inc ecx |
mul ecx |
add eax, [_WinMapAddress] |
movzx edx, byte [ebx+eax] |
shl edx, 8 |
mov esi, [edx+SLOT_BASE+APPDATA.cursor] |
push esi |
call [_display.select_cursor] |
mov [current_cursor], esi |
ret |
;------------------------------------------------------------------------------ |
iglobal |
align 4 |
sys_system_table: |
2101,21 → 2109,8 |
pusha |
mov ecx, [esp+32] |
shl ecx, 8 |
mov eax, [def_cursor] |
mov [ecx+SLOT_BASE+APPDATA.cursor], eax |
movzx eax, word [MOUSE_Y] |
movzx ebx, word [MOUSE_X] |
mov ecx, [Screen_Max_X] |
inc ecx |
mul ecx |
add eax, [_WinMapAddress] |
movzx edx, byte [ebx+eax] |
shl edx, 8 |
mov esi, [edx+SLOT_BASE+APPDATA.cursor] |
push esi |
call [_display.select_cursor] |
mov [current_cursor], esi |
add ecx, SLOT_BASE |
call restore_default_cursor_before_killing |
popa |
@@: |
add esp, 4 |
4875,8 → 4870,23 |
paleholder: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
calculate_fast_getting_offset_for_WinMapAddress: |
; calculate data area for fast getting offset to _WinMapAddress |
mov eax, [_display.width] |
mov ecx, [_display.height] |
inc ecx |
mov edi, d_width_calc_area |
cld |
@@: |
stosd |
add eax, [_display.width] |
dec ecx |
jnz @r |
ret |
;------------------------------------------------------------------------------ |
align 4 |
set_screen: |
cmp eax, [Screen_Max_X] |
jne .set |
4912,6 → 4922,8 |
test eax, eax |
jz .epic_fail |
call calculate_fast_getting_offset_for_WinMapAddress |
popad |
call repos_windows |
/kernel/branches/Kolibri-acpi/memmap.inc |
---|
62,7 → 62,7 |
; 3c dword cpu usage in cpu timer tics |
; |
; |
; 5000 -> 68FF free (6k6) |
; 5000 -> 68FF display width fast calc area (6k6) |
; 6900 -> 6EFF saved picture under mouse pointer (1k5) |
; |
; 6F00 -> 6FFF free (256) |
/kernel/branches/Kolibri-acpi/video/cursors.inc |
---|
1000,6 → 1000,19 |
mov [_display.check_mouse], check_mouse_area_for_putpixel_new |
mov [_display.check_m_pixel], check_mouse_area_for_getpixel_new |
cmp [PUTPIXEL], dword VGA_putpixel |
je @f |
cmp [ScreenBPP], byte 32 |
je .32 |
mov [PUTPIXEL], dword Vesa20_putpixel24_new |
jmp @f |
;-------------------------------------- |
align 4 |
.32: |
mov [PUTPIXEL], dword Vesa20_putpixel32_new |
;-------------------------------------- |
align 4 |
@@: |
stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM |
mov [def_cursor], eax |
ret |
/kernel/branches/Kolibri-acpi/video/vesa20.inc |
---|
243,13 → 243,15 |
mov ebx, [CURRENT_TASK] |
cmp byte [ScreenBPP], 32 |
je put_image_end_32 |
;put_image_end_24: |
;-------------------------------------- |
put_image_end_24: |
mov edi, [putimg.real_sy] |
cmp [_display.select_cursor], 0 |
jne put_image_end_24_new |
;-------------------------------------- |
align 4 |
.new_line: |
mov ecx, [putimg.real_sx] |
; push ebp edx |
;-------------------------------------- |
align 4 |
.new_x: |
268,7 → 270,7 |
sub ecx, edi |
; check mouse area for putpixel |
call [_display.check_mouse] |
call check_mouse_area_for_putpixel |
pop ecx |
; store to real LFB |
mov [LFB_BASE+edx], ax |
277,16 → 279,15 |
;-------------------------------------- |
align 4 |
.skip: |
; add esi, 3 ;[putimg.source_bpp] |
add edx, 3 |
inc ebp |
dec ecx |
jnz .new_x |
; pop edx ebp |
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline];[BytesPerScanLine] |
add ebp, [putimg.winmap_newline];[Screen_Max_X] |
; inc ebp |
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
cmp [putimg.ebp], putimage_get2bpp |
309,15 → 310,93 |
add esp, putimg.stack_data |
popad |
ret |
;-------------------------------------- |
align 4 |
put_image_end_24_new: |
;-------------------------------------- |
align 4 |
.new_line: |
mov ecx, [putimg.real_sx] |
;-------------------------------------- |
align 4 |
.new_x: |
push [putimg.edi] |
mov eax, [putimg.ebp+4] |
call eax |
cmp [ebp], bl |
jne .skip |
;-------------------------------------- |
push ecx |
mov ecx, [putimg.real_sy_and_abs_cy + 4] |
sub ecx, edi |
;-------------------------------------- |
; check for Y |
cmp cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb .no_mouse_area |
cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh] |
jae .no_mouse_area |
rol ecx, 16 |
add ecx, [putimg.real_sx_and_abs_cx + 4] |
sub ecx, [esp] |
;-------------------------------------- |
; check for X |
cmp cx, [X_UNDER_subtraction_CUR_hot_x] |
jb .no_mouse_area |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae .no_mouse_area |
;-------------------------------------- |
; check mouse area for putpixel |
call check_mouse_area_for_putpixel_new.1 |
;-------------------------------------- |
align 4 |
.no_mouse_area: |
pop ecx |
; store to real LFB |
mov [LFB_BASE+edx], ax |
shr eax, 16 |
mov [LFB_BASE+edx+2], al |
;-------------------------------------- |
align 4 |
.skip: |
add edx, 3 |
inc ebp |
dec ecx |
jnz .new_x |
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline];[BytesPerScanLine] |
add ebp, [putimg.winmap_newline];[Screen_Max_X] |
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
cmp [putimg.ebp], putimage_get2bpp |
jz .correct |
cmp [putimg.ebp], putimage_get4bpp |
jnz @f |
;-------------------------------------- |
align 4 |
.correct: |
mov eax, [putimg.edi] |
mov byte [eax], 80h |
;-------------------------------------- |
align 4 |
@@: |
dec edi |
jnz .new_line |
jmp put_image_end_24.finish |
;------------------------------------------------------------------------------ |
align 4 |
put_image_end_32: |
mov edi, [putimg.real_sy] |
cmp [_display.select_cursor], 0 |
jne put_image_end_32_new |
;-------------------------------------- |
align 4 |
.new_line: |
mov ecx, [putimg.real_sx] |
; push ebp edx |
;-------------------------------------- |
align 4 |
.new_x: |
336,7 → 415,7 |
sub ecx, edi |
; check mouse area for putpixel |
call [_display.check_mouse] |
call check_mouse_area_for_putpixel |
pop ecx |
; store to real LFB |
mov [LFB_BASE+edx], eax |
343,16 → 422,15 |
;-------------------------------------- |
align 4 |
.skip: |
; add esi, [putimg.source_bpp] |
add edx, 4 |
inc ebp |
dec ecx |
jnz .new_x |
; pop edx ebp |
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline];[BytesPerScanLine] |
add ebp, [putimg.winmap_newline];[Screen_Max_X] |
; inc ebp |
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
cmp [putimg.ebp], putimage_get2bpp |
374,9 → 452,89 |
.finish: |
add esp, putimg.stack_data |
popad |
cmp [SCR_MODE], dword 0x12 |
jne @f |
call VGA__putimage |
;-------------------------------------- |
align 4 |
@@: |
mov [EGA_counter], 1 |
ret |
;-------------------------------------- |
align 4 |
put_image_end_32_new: |
;-------------------------------------- |
align 4 |
.new_line: |
mov ecx, [putimg.real_sx] |
;-------------------------------------- |
align 4 |
.new_x: |
push [putimg.edi] |
mov eax, [putimg.ebp+4] |
call eax |
cmp [ebp], bl |
jne .skip |
;-------------------------------------- |
push ecx |
mov ecx, [putimg.real_sy_and_abs_cy + 4] |
sub ecx, edi |
;-------------------------------------- |
; check for Y |
cmp cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb .no_mouse_area |
cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh] |
jae .no_mouse_area |
rol ecx, 16 |
add ecx, [putimg.real_sx_and_abs_cx + 4] |
sub ecx, [esp] |
;-------------------------------------- |
; check for X |
cmp cx, [X_UNDER_subtraction_CUR_hot_x] |
jb .no_mouse_area |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae .no_mouse_area |
;-------------------------------------- |
; check mouse area for putpixel |
call check_mouse_area_for_putpixel_new.1 |
;-------------------------------------- |
align 4 |
.no_mouse_area: |
pop ecx |
; store to real LFB |
mov [LFB_BASE+edx], eax |
;-------------------------------------- |
align 4 |
.skip: |
add edx, 4 |
inc ebp |
dec ecx |
jnz .new_x |
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline];[BytesPerScanLine] |
add ebp, [putimg.winmap_newline];[Screen_Max_X] |
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
cmp [putimg.ebp], putimage_get2bpp |
jz .correct |
cmp [putimg.ebp], putimage_get4bpp |
jnz @f |
;-------------------------------------- |
align 4 |
.correct: |
mov eax, [putimg.edi] |
mov byte [eax], 80h |
;-------------------------------------- |
align 4 |
@@: |
dec edi |
jnz .new_line |
jmp put_image_end_32.finish |
;------------------------------------------------------------------------------ |
align 4 |
__sys_putpixel: |
398,14 → 556,10 |
jnz .forced |
; not forced: |
push eax |
mov edx, [_display.width]; screen x size |
imul edx, ebx |
add eax, [_WinMapAddress] |
mov edx, [d_width_calc_area + ebx*4] |
add edx, [_WinMapAddress] |
movzx edx, byte [eax+edx] |
cmp edx, [CURRENT_TASK] |
pop eax |
jne .exit |
;-------------------------------------- |
align 4 |
447,7 → 601,7 |
; check mouse area for putpixel |
test eax, 0x04000000 |
jnz @f |
call [_display.check_mouse] |
call check_mouse_area_for_putpixel |
;-------------------------------------- |
align 4 |
@@: |
455,7 → 609,48 |
mov [LFB_BASE+ebx+edi], ax |
shr eax, 16 |
mov [LFB_BASE+ebx+edi+2], al |
ret |
;----------------------------------------------------------------------------- |
align 4 |
Vesa20_putpixel24_new: |
; eax = x |
; ebx = y |
mov ecx, eax |
shl ecx, 16 |
mov cx, bx |
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier |
lea edi, [eax+eax*2]; edi = x*3 |
mov eax, [esp+32-8+4] |
;-------------------------------------- |
; check mouse area for putpixel |
test eax, 0x04000000 |
jnz @f |
;-------------------------------------- |
; check for Y |
cmp cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb @f |
cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh] |
jae @f |
rol ecx, 16 |
;-------------------------------------- |
; check for X |
cmp cx, [X_UNDER_subtraction_CUR_hot_x] |
jb @f |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae @f |
call check_mouse_area_for_putpixel_new.1 |
;-------------------------------------- |
align 4 |
@@: |
; store to real LFB |
mov [LFB_BASE+ebx+edi], ax |
shr eax, 16 |
mov [LFB_BASE+ebx+edi+2], al |
ret |
;----------------------------------------------------------------------------- |
align 4 |
473,7 → 668,7 |
; check mouse area for putpixel |
test eax, 0x04000000 |
jnz @f |
call [_display.check_mouse] |
call check_mouse_area_for_putpixel |
;-------------------------------------- |
align 4 |
@@: |
480,7 → 675,47 |
and eax, 0xffffff |
; store to real LFB |
mov [LFB_BASE+edi], eax |
ret |
;----------------------------------------------------------------------------- |
align 4 |
Vesa20_putpixel32_new: |
; eax = x |
; ebx = y |
mov ecx, eax |
shl ecx, 16 |
mov cx, bx |
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier |
lea edi, [ebx+eax*4]; edi = x*4+(y*y multiplier) |
mov eax, [esp+32-8+4]; eax = color |
;-------------------------------------- |
; check mouse area for putpixel |
test eax, 0x04000000 |
jnz @f |
;-------------------------------------- |
; check for Y |
cmp cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb @f |
cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh] |
jae @f |
rol ecx, 16 |
;-------------------------------------- |
; check for X |
cmp cx, [X_UNDER_subtraction_CUR_hot_x] |
jb @f |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae @f |
call check_mouse_area_for_putpixel_new.1 |
;-------------------------------------- |
align 4 |
@@: |
and eax, 0xffffff |
; store to real LFB |
mov [LFB_BASE+edi], eax |
ret |
;----------------------------------------------------------------------------- |
align 4 |
1055,7 → 1290,12 |
.end: |
add esp, drbar.stack_data |
popad |
cmp [SCR_MODE], dword 0x12 |
jne @f |
call VGA_draw_bar |
;-------------------------------------- |
align 4 |
@@: |
xor eax, eax |
mov [EGA_counter], 1 |
ret |
1238,7 → 1478,12 |
jbe dp2 |
popad |
mov [EGA_counter], 1 |
cmp [SCR_MODE], dword 0x12 |
jne @f |
call VGA_drawbackground |
;-------------------------------------- |
align 4 |
@@: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
1445,7 → 1690,12 |
add esp, 44 |
popad |
mov [EGA_counter], 1 |
cmp [SCR_MODE], dword 0x12 |
jne @f |
call VGA_drawbackground |
;-------------------------------------- |
align 4 |
@@: |
ret |
uglobal |
/kernel/branches/Kolibri-acpi/video/vga.inc |
---|
13,7 → 13,8 |
$Revision$ |
;------------------------------------------------------------------------------ |
align 4 |
paletteVGA: |
;16 colour palette |
24,9 → 25,9 |
mov ecx, 16 |
mov dx, 0x3c9 |
xor eax, eax |
;-------------------------------------- |
align 4 |
palvganew: |
mov al, 0 |
test ah, 4 |
jz palvgalbl1 |
34,6 → 35,8 |
test ah, 8 |
jz palvgalbl1 |
add al, 32 |
;-------------------------------------- |
align 4 |
palvgalbl1: |
out dx, al; red 0,31 or 63 |
mov al, 0 |
43,6 → 46,8 |
test ah, 8 |
jz palvgalbl2 |
add al, 32 |
;-------------------------------------- |
align 4 |
palvgalbl2: |
out dx, al; blue 0,31 or 63 |
mov al, 0 |
52,6 → 57,8 |
test ah, 8 |
jz palvgalbl3 |
add al, 32 |
;-------------------------------------- |
align 4 |
palvgalbl3: |
out dx, al; green 0,31 or 63 |
add ah, 1 |
60,9 → 67,9 |
; mov ax, 0005h |
; out dx, ax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
palette320x200: |
mov edx, 0x3c8 |
xor eax, eax |
out dx, al |
69,16 → 76,21 |
mov ecx, 256 |
mov edx, 0x3c9 |
xor eax, eax |
;-------------------------------------- |
align 4 |
palnew: |
mov al, 0 |
test ah, 64 |
jz pallbl1 |
add al, 21 |
;-------------------------------------- |
align 4 |
pallbl1: |
test ah, 128 |
jz pallbl2 |
add al, 42 |
;-------------------------------------- |
align 4 |
pallbl2: |
out dx, al |
mov al, 0 |
85,14 → 97,20 |
test ah, 8 |
jz pallbl3 |
add al, 8 |
;-------------------------------------- |
align 4 |
pallbl3: |
test ah, 16 |
jz pallbl4 |
add al, 15 |
;-------------------------------------- |
align 4 |
pallbl4: |
test ah, 32 |
jz pallbl5 |
add al, 40 |
;-------------------------------------- |
align 4 |
pallbl5: |
out dx, al |
mov al, 0 |
99,20 → 117,26 |
test ah, 1 |
jz pallbl6 |
add al, 8 |
;-------------------------------------- |
align 4 |
pallbl6: |
test ah, 2 |
jz pallbl7 |
add al, 15 |
;-------------------------------------- |
align 4 |
pallbl7: |
test ah, 4 |
jz pallbl8 |
add al, 40 |
;-------------------------------------- |
align 4 |
pallbl8: |
out dx, al |
add ah, 1 |
loop palnew |
ret |
;------------------------------------------------------------------------------ |
align 4 |
uglobal |
novesachecksum dd 0x0 |
123,13 → 147,12 |
temp: |
.cx dd 0 |
endg |
;------------------------------------------------------------------------------ |
align 4 |
checkVga_N13: |
cmp [SCR_MODE], dword 0x13 |
jne @f |
; cnvl: |
pushad |
cmp [EGA_counter], 1 |
je novesal |
137,9 → 160,12 |
cmp ecx, [novesachecksum] |
jne novesal |
popad |
;-------------------------------------- |
align 4 |
@@: |
ret |
;-------------------------------------- |
align 4 |
novesal: |
mov [novesachecksum], ecx |
mov ecx, 0 |
147,10 → 173,14 |
cmp eax, 100 |
jge m13l3 |
mov eax, 100 |
;-------------------------------------- |
align 4 |
m13l3: |
cmp eax, 480-100 |
jbe m13l4 |
mov eax, 480-100 |
;-------------------------------------- |
align 4 |
m13l4: |
sub eax, 100 |
imul eax, 640*4 |
159,10 → 189,14 |
cmp eax, 160 |
jge m13l1 |
mov eax, 160 |
;-------------------------------------- |
align 4 |
m13l1: |
cmp eax, 640-160 |
jbe m13l2 |
mov eax, 640-160 |
;-------------------------------------- |
align 4 |
m13l2: |
sub eax, 160 |
shl eax, 2 |
173,6 → 207,8 |
mov edx, 200 |
mov ecx, 320 |
cld |
;-------------------------------------- |
align 4 |
m13pix: |
lodsd |
test eax, eax |
188,6 → 224,8 |
and ebx, (128+64)*256*256; red |
shr ebx, 8+8 |
add eax, ebx |
;-------------------------------------- |
align 4 |
.save_pixel: |
stosb |
loop m13pix |
198,16 → 236,17 |
mov [EGA_counter], 0 |
popad |
ret |
;------------------------------------------------------------------------------ |
align 4 |
VGA_drawbackground: |
; draw all |
cmp [SCR_MODE], dword 0x12 |
jne .end |
pushad |
mov esi, [LFBAddress] |
mov edi, VGABasePtr |
mov ebx, 640/32; 640*480/(8*4) |
mov edx, 480 |
;-------------------------------------- |
align 4 |
@@: |
push ebx edx esi edi |
shl edx, 9 |
221,9 → 260,9 |
jnz @r |
call VGA_draw_long_line_1 |
popad |
.end: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
VGA_draw_long_line: |
mov dx, 3ceh |
mov ax, 0ff08h |
231,6 → 270,8 |
out dx, ax |
mov ax, 0005h |
out dx, ax |
;-------------------------------------- |
align 4 |
m12pix: |
call VGA_draw_32_pixels |
dec ebx |
246,7 → 287,8 |
out dx, al |
sti |
ret |
;------------------------------------------------------------------------------ |
align 4 |
VGA_draw_32_pixels: |
xor eax, eax |
mov ebp, VGA_8_pixels |
255,8 → 297,12 |
mov [ebp+8], eax |
mov [ebp+12], eax |
mov ch, 4 |
;-------------------------------------- |
align 4 |
.main_loop: |
mov cl, 8 |
;-------------------------------------- |
align 4 |
.convert_pixels_to_VGA: |
lodsd ; eax = 24bit colour |
test eax, eax |
273,6 → 319,8 |
cmp al, 170 |
jbe .p13green |
or [ebp+12], ch |
;-------------------------------------- |
align 4 |
.p13green: |
cmp ah, 85 |
jbe .p13red |
280,6 → 328,8 |
cmp ah, 170 |
jbe .p13red |
or [ebp+12], ch |
;-------------------------------------- |
align 4 |
.p13red: |
shr eax, 8 |
cmp ah, 85 |
288,10 → 338,14 |
cmp ah, 170 |
jbe .p13cont |
or [ebp+12], ch |
;-------------------------------------- |
align 4 |
.p13cont: |
ror eax, 8 |
mov ch, ah |
inc cl |
;-------------------------------------- |
align 4 |
.end: |
dec cl |
jnz .convert_pixels_to_VGA |
303,6 → 357,8 |
mov esi, ebp |
mov dx, 3c4h |
mov ah, 1h |
;-------------------------------------- |
align 4 |
@@: |
mov al, 02h |
out dx, ax |
316,12 → 372,25 |
add edi, 4 |
pop esi |
ret |
;------------------------------------------------------------------------------ |
align 4 |
VGA_putpixel: |
; eax = x |
; ebx = y |
mov ecx, eax |
mov eax, [esp+32-8+4] ; color |
;-------------------------------------- |
push ecx |
shl ecx, 16 |
mov cx, bx |
; check mouse area for putpixel |
test eax, 0x04000000 |
jnz @f |
call [_display.check_mouse] |
;-------------------------------------- |
align 4 |
@@: |
pop ecx |
shl ebx, 9 |
lea ebx, [ebx+ebx*4] ; óìíîæåíèå íà 5 |
lea edx, [ebx+ecx*4] ; + x*BytesPerPixel (Vesa2.0 32) |
343,6 → 412,8 |
cmp al, 170 |
jbe .p13green |
or dl, 0x08 |
;-------------------------------------- |
align 4 |
.p13green: |
cmp ah, 85 |
jbe .p13red |
350,6 → 421,8 |
cmp ah, 170 |
jbe .p13red |
or dl, 0x08 |
;-------------------------------------- |
align 4 |
.p13red: |
shr eax, 8 |
cmp ah, 85 |
358,6 → 431,8 |
cmp ah, 170 |
jbe .p13cont |
or dl, 0x08 |
;-------------------------------------- |
align 4 |
.p13cont: |
ror edx, 8 |
inc cl |
371,14 → 446,12 |
rol edx, 8 |
mov [edi], dl |
popfd |
;.end: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
VGA__putimage: |
; ecx = size [x|y] |
; edx = coordinates [x|y] |
cmp [SCR_MODE], dword 0x12 |
jne @f |
pushad |
rol edx, 16 |
movzx eax, dx |
389,16 → 462,14 |
movzx ecx, cx |
call VGA_draw_bar_1 |
popad |
@@: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
VGA_draw_bar: |
; eax cx |
; ebx cy |
; ecx xe |
; edx ye |
cmp [SCR_MODE], dword 0x12 |
jne @f |
pushad |
sub ecx, eax |
sub edx, ebx |
408,9 → 479,9 |
and edx, 0xffff |
call VGA_draw_bar_1 |
popad |
@@: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
VGA_draw_bar_1: |
mov [temp.cx], eax |
mov eax, [TASK_BASE] |
429,6 → 500,8 |
mov ebx, ecx |
shr ebx, 5 |
inc ebx |
;-------------------------------------- |
align 4 |
.main_loop: |
call VGA_draw_long_line_1 |
dec edx |
435,7 → 508,8 |
jnz .main_loop |
call VGA_draw_long_line_1 |
ret |
;------------------------------------------------------------------------------ |
align 4 |
VGA_draw_long_line_1: |
push ebx edx esi edi |
shl edx, 9 |
446,5 → 520,4 |
call VGA_draw_long_line |
pop edi esi edx ebx |
ret |
;------------------------------------------------------------------------------ |