enumerate CPU's and start AP.

git-svn-id: svn://kolibrios.org@2439 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2012-03-09 08:20:02 +00:00
parent 4832ce7a33
commit 3e6513d51d
11 changed files with 1187 additions and 575 deletions

View File

@ -189,6 +189,7 @@ TASK_BASE equ (OS_BASE+0x0003010)
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)

View File

@ -41,7 +41,8 @@ IOAPIC_VER equ 0x1
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 @@ APIC_init:
;===========================================================
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 @@ LAPIC_init:
; 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,6 +419,34 @@ pci_irq_fixup:
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

View File

@ -7,15 +7,14 @@
$Revision$
; // Alver 22.06.2008 // {
;------------------------------------------------------------------------------
align 4
dtext_asciiz_esi: ; for skins title out
push eax
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 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
; 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,21 +37,26 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
cmp esi, 255
jb .loop
mov esi, 255
;--------------------------------------
align 4
.loop:
test ecx, ecx
js .test_asciiz
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 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
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 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
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 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
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,20 +105,28 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
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
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 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
call [putpixel]
pop ecx
;--------------------------------------
align 4
.pixloop2cont:
inc eax
dec esi
@ -128,7 +151,10 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
add dword [esp+28], esi
popad
jmp .loop
;--------------------------------------
align 4
.end:
popad
pop eax ; << // Alver 22.06.2008 // <<
pop eax
ret
;------------------------------------------------------------------------------

View File

@ -11,7 +11,8 @@ $Revision$
include "skindata.inc"
;skin_data = 0x00778000
;------------------------------------------------------------------------------
align 4
read_skin_file:
stdcall load_file, ebx
test eax, eax
@ -21,6 +22,8 @@ read_skin_file:
cmp ebx, 32*1024
jb @f
mov ebx, 32*1024
;--------------------------------------
align 4
@@:
lea ecx, [ebx+3]
shr ecx, 2
@ -32,16 +35,20 @@ read_skin_file:
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 @@ struct SKIN_BITMAPS
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,7 +136,9 @@ parse_skin_data:
mov ebx, [ebp+SKIN_HEADER.bitmaps]
add ebx, skin_data
.lp1:
;--------------------------------------
align 4
.lp1:
cmp dword[ebx], 0
je .end_bitmaps
movzx eax, [ebx+SKIN_BITMAPS.kind]
@ -139,9 +150,13 @@ parse_skin_data:
or ecx, ecx
jnz @f
mov edx, skin_inactive.left.data
@@:
;--------------------------------------
align 4
@@:
jmp .next_bitmap
.not_left:
;--------------------------------------
align 4
.not_left:
dec eax
jnz .not_oper
mov esi, [ebx+SKIN_BITMAPS.data]
@ -152,9 +167,13 @@ parse_skin_data:
or ecx, ecx
jnz @f
mov edx, skin_inactive.oper.data
@@:
;--------------------------------------
align 4
@@:
jmp .next_bitmap
.not_oper:
;--------------------------------------
align 4
.not_oper:
dec eax
jnz .not_base
mov eax, [skin_active.left.width]
@ -163,12 +182,18 @@ parse_skin_data:
jnz @f
mov eax, [skin_inactive.left.width]
mov edx, skin_inactive.base.data
@@:
;--------------------------------------
align 4
@@:
jmp .next_bitmap
.not_base:
;--------------------------------------
align 4
.not_base:
add ebx, 8
jmp .lp1
.next_bitmap:
;--------------------------------------
align 4
.next_bitmap:
mov ecx, [ebx+SKIN_BITMAPS.data]
add ecx, skin_data
mov [edx+4], eax
@ -178,11 +203,14 @@ parse_skin_data:
mov [edx+0], ecx
add ebx, 8
jmp .lp1
.end_bitmaps:
;--------------------------------------
align 4
.end_bitmaps:
mov ebx, [ebp+SKIN_HEADER.buttons]
add ebx, skin_data
.lp2:
;--------------------------------------
align 4
.lp2:
cmp dword[ebx], 0
je .end_buttons
mov eax, [ebx+SKIN_BUTTONS.type]
@ -190,15 +218,21 @@ parse_skin_data:
jnz .not_close
mov edx, skin_btn_close
jmp .next_button
.not_close:
;--------------------------------------
align 4
.not_close:
dec eax
jnz .not_minimize
mov edx, skin_btn_minimize
jmp .next_button
.not_minimize:
;--------------------------------------
align 4
.not_minimize:
add ebx, 12
jmp .lp2
.next_button:
;--------------------------------------
align 4
.next_button:
movsx eax, [ebx+SKIN_BUTTONS.left]
mov [edx+SKIN_BUTTON.left], eax
movsx eax, [ebx+SKIN_BUTTONS.top]
@ -209,26 +243,22 @@ parse_skin_data:
mov [edx+SKIN_BUTTON.height], eax
add ebx, 12
jmp .lp2
.end_buttons:
.exit:
;--------------------------------------
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
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 @@ drawwindow_IV_caption:
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,18 +294,28 @@ drawwindow_IV_caption:
mov edx, [ebp+SKIN_DATA.base.left]
sub edx, [ebp+SKIN_DATA.base.width]
shl edx, 16
.baseskinloop:
;--------------------------------------
align 4
.baseskinloop:
shr edx, 16
add edx, [ebp+SKIN_DATA.base.width]
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
.non_base:
;--------------------------------------
align 4
.non_base:
mov esi, [esp+4]
mov edx, [esi+WDATA.box.width]
@ -283,16 +327,18 @@ drawwindow_IV_caption:
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 @@ drawwindow_IV:
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 @@ drawwindow_IV:
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,7 +368,9 @@ drawwindow_IV:
rol ebx, 16
call draw_rectangle
mov ecx, 3
_dw3l:
;--------------------------------------
align 4
_dw3l:
add eax, 1*65536-1
add ebx, 0*65536-1
test ax, ax
@ -357,13 +403,14 @@ drawwindow_IV:
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
draw_clientbar:
;--------------------------------------
align 4
draw_clientbar:
mov esi, [esp]
mov edx, [esi+WDATA.box.top] ; WORK AREA
@ -382,11 +429,11 @@ drawwindow_IV:
test edi, 0x40000000
jnz _noinside2
call [drawbar]
_noinside2:
;--------------------------------------
align 4
_noinside2:
cmp dword[skin_data], 'SKIN'
jne no_skin_add_button
;* close button
mov edi, [BTN_ADDR]
movzx eax, word [edi]
@ -411,7 +458,9 @@ drawwindow_IV:
mov ebx, [esp]
mov ebx, [ebx+WDATA.box.width]
inc ebx
_bCx_at_right:
;--------------------------------------
align 4
_bCx_at_right:
add ebx, [skin_btn_close.left]
mov [eax], bx
add eax, 2 ; x size
@ -425,7 +474,6 @@ drawwindow_IV:
mov ebx, [skin_btn_close.height]
dec ebx
mov [eax], bx
;* minimize button
mov edi, [BTN_ADDR]
movzx eax, word [edi]
@ -450,7 +498,9 @@ drawwindow_IV:
mov ebx, [esp]
mov ebx, [ebx+WDATA.box.width]
inc ebx
_bMx_at_right:
;--------------------------------------
align 4
_bMx_at_right:
add ebx, [skin_btn_minimize.left]
mov [eax], bx
add eax, 2 ; x size
@ -464,10 +514,10 @@ drawwindow_IV:
mov ebx, [skin_btn_minimize.height]
dec ebx
mov [eax], bx
no_skin_add_button:
;--------------------------------------
align 4
no_skin_add_button:
pop edi
popa
ret 4
;------------------------------------------------------------------------------

File diff suppressed because it is too large Load Diff

View File

@ -432,6 +432,11 @@ proc test_cpu
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_dev_size rd 1
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 @@ rsdt_find: ;ecx= rsdt edx= SIG
lea ebx, [ecx+36]
mov esi, [ecx+4]
add esi, ecx
align 4
.next:
mov eax, [ebx]
cmp [eax], edx
@ -513,9 +521,16 @@ rsdt_find: ;ecx= rsdt edx= SIG
pop ebx
ret
align 4
madt_find:
ret
align 4
check_acpi:
call acpi_locate
@ -529,26 +544,53 @@ check_acpi:
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
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

View File

@ -342,18 +342,24 @@ ap_entry:
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 @@ high_code:
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 @@ high_code:
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 @@ no_mode_0x12:
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 @@ sys_end:
; 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 @@ sys_end:
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 @@ sysfn_terminate: ; 18.2 = TERMINATE
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,7 +4870,22 @@ read_from_hd: ; Read from hd - fn not in use
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]
@ -4912,6 +4922,8 @@ set_screen:
test eax, eax
jz .epic_fail
call calculate_fast_getting_offset_for_WinMapAddress
popad
call repos_windows

View File

@ -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)

View File

@ -1000,6 +1000,19 @@ align 4
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

View File

@ -243,13 +243,15 @@ align 4
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 @@ align 4
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
;--------------------------------------
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 @@ align 4
add esp, putimg.stack_data
popad
ret
;------------------------------------------------------------------------------
;--------------------------------------
align 4
put_image_end_32:
mov edi, [putimg.real_sy]
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,23 +415,22 @@ align 4
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
;--------------------------------------
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 @@ align 4
.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 @@ __sys_putpixel:
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 @@ Vesa20_putpixel24:
; 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 @@ align 4
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,14 +668,54 @@ Vesa20_putpixel32:
; check mouse area for putpixel
test eax, 0x04000000
jnz @f
call [_display.check_mouse]
call check_mouse_area_for_putpixel
;--------------------------------------
align 4
@@:
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 @@ align 4
.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 @@ dp4:
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 @@ sdpdone:
add esp, 44
popad
mov [EGA_counter], 1
cmp [SCR_MODE], dword 0x12
jne @f
call VGA_drawbackground
;--------------------------------------
align 4
@@:
ret
uglobal

View File

@ -13,7 +13,8 @@
$Revision$
;------------------------------------------------------------------------------
align 4
paletteVGA:
;16 colour palette
@ -24,9 +25,9 @@ paletteVGA:
mov ecx, 16
mov dx, 0x3c9
xor eax, eax
palvganew:
;--------------------------------------
align 4
palvganew:
mov al, 0
test ah, 4
jz palvgalbl1
@ -34,7 +35,9 @@ paletteVGA:
test ah, 8
jz palvgalbl1
add al, 32
palvgalbl1:
;--------------------------------------
align 4
palvgalbl1:
out dx, al; red 0,31 or 63
mov al, 0
test ah, 2
@ -43,7 +46,9 @@ paletteVGA:
test ah, 8
jz palvgalbl2
add al, 32
palvgalbl2:
;--------------------------------------
align 4
palvgalbl2:
out dx, al; blue 0,31 or 63
mov al, 0
test ah, 1
@ -52,7 +57,9 @@ paletteVGA:
test ah, 8
jz palvgalbl3
add al, 32
palvgalbl3:
;--------------------------------------
align 4
palvgalbl3:
out dx, al; green 0,31 or 63
add ah, 1
loop palvganew
@ -60,59 +67,76 @@ paletteVGA:
; mov ax, 0005h
; out dx, ax
ret
;------------------------------------------------------------------------------
align 4
palette320x200:
mov edx, 0x3c8
xor eax, eax
out dx, al
mov ecx, 256
mov edx, 0x3c9
xor eax, eax
palnew:
;--------------------------------------
align 4
palnew:
mov al, 0
test ah, 64
jz pallbl1
add al, 21
pallbl1:
;--------------------------------------
align 4
pallbl1:
test ah, 128
jz pallbl2
add al, 42
pallbl2:
;--------------------------------------
align 4
pallbl2:
out dx, al
mov al, 0
test ah, 8
jz pallbl3
add al, 8
pallbl3:
;--------------------------------------
align 4
pallbl3:
test ah, 16
jz pallbl4
add al, 15
pallbl4:
;--------------------------------------
align 4
pallbl4:
test ah, 32
jz pallbl5
add al, 40
pallbl5:
;--------------------------------------
align 4
pallbl5:
out dx, al
mov al, 0
test ah, 1
jz pallbl6
add al, 8
pallbl6:
;--------------------------------------
align 4
pallbl6:
test ah, 2
jz pallbl7
add al, 15
pallbl7:
;--------------------------------------
align 4
pallbl7:
test ah, 4
jz pallbl8
add al, 40
pallbl8:
;--------------------------------------
align 4
pallbl8:
out dx, al
add ah, 1
loop palnew
ret
;------------------------------------------------------------------------------
align 4
uglobal
novesachecksum dd 0x0
@ -123,13 +147,12 @@ uglobal
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,21 +160,28 @@ checkVga_N13:
cmp ecx, [novesachecksum]
jne novesal
popad
@@:
;--------------------------------------
align 4
@@:
ret
novesal:
;--------------------------------------
align 4
novesal:
mov [novesachecksum], ecx
mov ecx, 0
movzx eax, word [MOUSE_Y]
cmp eax, 100
jge m13l3
mov eax, 100
m13l3:
;--------------------------------------
align 4
m13l3:
cmp eax, 480-100
jbe m13l4
mov eax, 480-100
m13l4:
;--------------------------------------
align 4
m13l4:
sub eax, 100
imul eax, 640*4
add ecx, eax
@ -159,11 +189,15 @@ checkVga_N13:
cmp eax, 160
jge m13l1
mov eax, 160
m13l1:
;--------------------------------------
align 4
m13l1:
cmp eax, 640-160
jbe m13l2
mov eax, 640-160
m13l2:
;--------------------------------------
align 4
m13l2:
sub eax, 160
shl eax, 2
add ecx, eax
@ -173,7 +207,9 @@ checkVga_N13:
mov edx, 200
mov ecx, 320
cld
m13pix:
;--------------------------------------
align 4
m13pix:
lodsd
test eax, eax
jz .save_pixel
@ -188,7 +224,9 @@ checkVga_N13:
and ebx, (128+64)*256*256; red
shr ebx, 8+8
add eax, ebx
.save_pixel:
;--------------------------------------
align 4
.save_pixel:
stosb
loop m13pix
mov ecx, 320
@ -198,17 +236,18 @@ checkVga_N13:
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
lea edx, [edx+edx*4]
@ -221,9 +260,9 @@ VGA_drawbackground:
jnz @r
call VGA_draw_long_line_1
popad
.end:
ret
;------------------------------------------------------------------------------
align 4
VGA_draw_long_line:
mov dx, 3ceh
mov ax, 0ff08h
@ -231,7 +270,9 @@ VGA_draw_long_line:
out dx, ax
mov ax, 0005h
out dx, ax
m12pix:
;--------------------------------------
align 4
m12pix:
call VGA_draw_32_pixels
dec ebx
jnz m12pix
@ -246,7 +287,8 @@ VGA_draw_long_line:
out dx, al
sti
ret
;------------------------------------------------------------------------------
align 4
VGA_draw_32_pixels:
xor eax, eax
mov ebp, VGA_8_pixels
@ -255,9 +297,13 @@ VGA_draw_32_pixels:
mov [ebp+8], eax
mov [ebp+12], eax
mov ch, 4
.main_loop:
;--------------------------------------
align 4
.main_loop:
mov cl, 8
.convert_pixels_to_VGA:
;--------------------------------------
align 4
.convert_pixels_to_VGA:
lodsd ; eax = 24bit colour
test eax, eax
jz .end
@ -273,14 +319,18 @@ VGA_draw_32_pixels:
cmp al, 170
jbe .p13green
or [ebp+12], ch
.p13green:
;--------------------------------------
align 4
.p13green:
cmp ah, 85
jbe .p13red
or [ebp+4], ch
cmp ah, 170
jbe .p13red
or [ebp+12], ch
.p13red:
;--------------------------------------
align 4
.p13red:
shr eax, 8
cmp ah, 85
jbe .p13cont
@ -288,11 +338,15 @@ VGA_draw_32_pixels:
cmp ah, 170
jbe .p13cont
or [ebp+12], ch
.p13cont:
;--------------------------------------
align 4
.p13cont:
ror eax, 8
mov ch, ah
inc cl
.end:
;--------------------------------------
align 4
.end:
dec cl
jnz .convert_pixels_to_VGA
inc ebp
@ -303,7 +357,9 @@ VGA_draw_32_pixels:
mov esi, ebp
mov dx, 3c4h
mov ah, 1h
@@:
;--------------------------------------
align 4
@@:
mov al, 02h
out dx, ax
xchg ax, bp
@ -316,12 +372,25 @@ VGA_draw_32_pixels:
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 @@ VGA_putpixel:
cmp al, 170
jbe .p13green
or dl, 0x08
;--------------------------------------
align 4
.p13green:
cmp ah, 85
jbe .p13red
@ -350,6 +421,8 @@ VGA_putpixel:
cmp ah, 170
jbe .p13red
or dl, 0x08
;--------------------------------------
align 4
.p13red:
shr eax, 8
cmp ah, 85
@ -358,6 +431,8 @@ VGA_putpixel:
cmp ah, 170
jbe .p13cont
or dl, 0x08
;--------------------------------------
align 4
.p13cont:
ror edx, 8
inc cl
@ -371,14 +446,12 @@ VGA_putpixel:
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 @@ VGA__putimage:
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 @@ VGA_draw_bar:
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,13 +500,16 @@ VGA_draw_bar_1:
mov ebx, ecx
shr ebx, 5
inc ebx
;--------------------------------------
align 4
.main_loop:
call VGA_draw_long_line_1
dec edx
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 @@ VGA_draw_long_line_1:
call VGA_draw_long_line
pop edi esi edx ebx
ret
;------------------------------------------------------------------------------