/kernel/trunk/const.inc |
---|
309,14 → 309,12 |
BgrDrawMode equ (OS_BASE+0x033BFF4) |
BgrDataWidth equ (OS_BASE+0x033BFF8) |
BgrDataHeight equ (OS_BASE+0x033BFFC) |
WinMapAddress equ (OS_BASE+0x033C000) |
display_data equ (OS_BASE+0x033C000) ;1024*1280=0x140000 |
virtual at (OS_BASE+0x047CF80) |
virtual at (OS_BASE+0x033CF80) |
tss TSS |
end virtual |
sys_pgmap equ (OS_BASE+0x047F000) |
sys_pgmap equ (OS_BASE+0x033F000) |
HEAP_BASE equ (OS_BASE+0x0800000) |
HEAP_MIN_SIZE equ 0x01000000 |
580,6 → 578,7 |
.show_cursor dd ? |
.move_cursor dd ? |
.restore_cursor dd ? |
.disable_mouse dd ? |
} |
virtual at 0 |
677,7 → 676,8 |
.bk dd ? ;+0x1C ;prev SRV descriptor |
.base dd ? ;+0x20 ;service base address |
.entry dd ? ;+0x24 ;service START function |
.srv_proc dd ? ;+0x28 ;main service handler |
.srv_proc dd ? ;+0x28 ;user mode service handler |
.srv_proc_ex dd ? ;+0x2C ;kernel mode service handler |
.sizeof: |
} |
/kernel/trunk/core/memory.inc |
---|
321,8 → 321,17 |
cmp dword [LFBAddress], -1 |
jne @f |
mov [BOOT_VAR+0x901c],byte 2 |
stdcall kernel_alloc, 0x280000 |
mov [LFBAddress], eax |
stdcall alloc_pages, (0x280000 / 4096) |
push eax |
call alloc_page |
stdcall map_page_table, LFB_BASE, eax |
pop eax |
or eax, PG_UW |
mov ebx, LFB_BASE |
mov ecx, 0x280000 / 4096 |
call commit_pages |
mov [LFBAddress], dword LFB_BASE |
ret |
@@: |
test [SCR_MODE],word 0100000000000000b |
334,7 → 343,7 |
mov edx, LFB_BASE |
mov esi, [LFBAddress] |
mov edi, 0x00800000 |
mov edi, 0x00C00000 |
mov dword [exp_lfb+4], edx |
shr edi, 12 |
558,14 → 567,6 |
push ebx ;that is locals: .err_addr = cr2 |
inc [pg_data.pages_faults] |
; push eax |
; push edx |
; mov edx, 0x400 ;bochs |
; mov al,0xff ;bochs |
; out dx, al ;bochs |
; pop edx |
; pop eax |
mov eax, [pf_err_code] |
cmp ebx, OS_BASE ;ebx == .err_addr |
592,6 → 593,11 |
pop ebx ;restore exception number (#PF) |
ret |
; xchg bx, bx |
; add esp,12 ;clear in stack: locals(.err_addr) + #PF + ret_to_caller |
; restore_ring3_context |
; iretd |
.user_space: |
test eax, PG_MAP |
jnz .err_access ;Ñòðàíèöà ïðèñóòñòâóåò |
/kernel/trunk/data32.inc |
---|
129,32 → 129,11 |
; supported videomodes |
;mode_1280_1024_32: |
; dw 1280,1024,32,60 |
;mode_1280_1024_24: |
; dw 1280,1024,24,60 |
;mode_1024_768_32: |
; dw 1024,768,32,60 |
;mode_1024_768_24: |
; dw 1024,768,24,60 |
;mode_800_600_32: |
; dw 800,600,32,60 |
;mode_800_600_24: |
; dw 800,600,24,60 |
;mode_640_480_32: |
; dw 640,480,32,60 |
;mode_640_480_24: |
; dw 640,480,24,60 |
;mode_640_480_16: |
; dw 640,480,16,60 |
;mode_320_240_8: |
; dw 320,240,8,60 |
; mike.dld { |
db 0 |
dd servetable-0x10000 |
draw_line dd __sys_draw_line |
disable_mouse dd __sys_disable_mouse |
draw_pointer dd __sys_draw_pointer |
;//mike.dld, 2006-08-02 [ |
;drawbar dd __sys_drawbar |
337,8 → 316,15 |
srv.fd rd 1 |
srv.bk rd 1 |
align 16 |
_display display_t |
_WinMapAddress rd 1 |
_WinMapSize rd 1 |
scr_width rd 1 |
scr_height rd 1 |
/kernel/trunk/gui/button.inc |
---|
372,7 → 372,7 |
push edx |
push edi |
call [disable_mouse] |
call [_display.disable_mouse] |
bdbnewline: |
mov edi,1 ; force |
389,7 → 389,6 |
bneg: |
;;;call [disable_mouse] |
call [putpixel] |
nbneg: |
/kernel/trunk/gui/font.inc |
---|
33,7 → 33,7 |
.1: |
; } \\ Alver \\ |
pushad |
call [disable_mouse] |
call [_display.disable_mouse] |
movsx eax, bx ; eax=y |
sar ebx, 16 ; ebx=x |
/kernel/trunk/gui/window.inc |
---|
184,7 → 184,7 |
inc edi |
imul edi, ebx |
add edi, eax |
add edi, WinMapAddress |
add edi, [_WinMapAddress] |
.new_y: |
push ecx ; sx |
245,7 → 245,7 |
inc eax |
imul eax, ebx |
add eax, [esp] |
add eax, WinMapAddress |
add eax, [_WinMapAddress] |
mov ebp, eax |
mov edi, [edi+APPDATA.wnd_shape] |
/kernel/trunk/hid/mousedrv.inc |
---|
111,8 → 111,8 |
mov ecx, [Screen_Max_X] |
inc ecx |
mul ecx |
movzx edx, byte [display_data+ebx+eax] |
add eax, [_WinMapAddress] |
movzx edx, byte [ebx+eax] |
shl edx, 8 |
mov esi, [edx+SLOT_BASE+APPDATA.cursor] |
119,9 → 119,6 |
cmp esi, [current_cursor] |
je .draw |
; cmp [esi+CURSOR.magic], 'CURS' |
; jne .fail |
push esi |
call [select_hw_cursor] |
mov [current_cursor], esi |
292,7 → 289,7 |
inc ecx |
imul ecx,ebx |
add ecx,eax |
add ecx, display_data |
add ecx, [_WinMapAddress] |
mov eax, [CURRENT_TASK] |
movzx ebx, byte [ecx] |
cmp eax,ebx |
/kernel/trunk/kernel.asm |
---|
349,14 → 349,20 |
; mov [0xF604],byte 1 ;al |
mov al, [BOOT_VAR+0x901F] ; DMA access |
mov [allow_dma_access], al |
mov al,[BOOT_VAR+0x9000] ; bpp |
movzx eax, byte [BOOT_VAR+0x9000] ; bpp |
mov [ScreenBPP],al |
mov [_display.bpp], eax |
mov [_display.vrefresh], 60 |
mov [_display.disable_mouse], __sys_disable_mouse |
movzx eax,word [BOOT_VAR+0x900A] ; X max |
mov [_display.width], eax |
dec eax |
mov [Screen_Max_X],eax |
mov [screen_workarea.right],eax |
movzx eax,word [BOOT_VAR+0x900C] ; Y max |
mov [_display.height], eax |
dec eax |
mov [Screen_Max_Y],eax |
mov [screen_workarea.bottom],eax |
369,9 → 375,14 |
je @f |
cmp [SCR_MODE],word 0x12 ; VGA 640x480 |
je @f |
mov ax,[BOOT_VAR+0x9001] ; for other modes |
movzx eax, word[BOOT_VAR+0x9001] ; for other modes |
mov [BytesPerScanLine],ax |
mov [_display.pitch], eax |
@@: |
mov eax, [_display.width] |
mul [_display.height] |
mov [_WinMapSize], eax |
mov esi, BOOT_VAR+0x9080 |
movzx ecx, byte [esi-1] |
mov [NumBiosDisks], ecx |
541,6 → 552,9 |
mov [graph_data_l+4],al |
mov [graph_data_l+7],ah |
stdcall kernel_alloc, [_WinMapSize] |
mov [_WinMapAddress], eax |
xor eax,eax |
inc eax |
mov [CURRENT_TASK],eax ;dword 1 |
549,8 → 563,7 |
mov [current_slot], SLOT_BASE+256 |
; set background |
; xor eax,eax |
; inc eax |
mov [BgrDrawMode],eax |
mov [BgrDataWidth],eax |
mov [BgrDataHeight],eax |
1805,7 → 1818,6 |
ret |
app_load_cursor: |
; add ebx, new_app_base |
cmp ecx, OS_BASE |
jae msset |
stdcall load_cursor, ecx, edx |
2894,9 → 2906,9 |
; cmp eax,0 ; type I - original style |
jne nosyswI |
inc [mouse_pause] |
call [disable_mouse] |
call [_display.disable_mouse] |
call sys_set_window |
call [disable_mouse] |
call [_display.disable_mouse] |
call drawwindow_I |
;dec [mouse_pause] |
;call [draw_pointer] |
2907,9 → 2919,9 |
cmp al,1 ; type II - only reserve area, no draw |
jne nosyswII |
inc [mouse_pause] |
call [disable_mouse] |
call [_display.disable_mouse] |
call sys_set_window |
call [disable_mouse] |
call [_display.disable_mouse] |
call sys_window_mouse |
dec [mouse_pause] |
call [draw_pointer] |
2919,9 → 2931,9 |
cmp al,2 ; type III - new style |
jne nosyswIII |
inc [mouse_pause] |
call [disable_mouse] |
call [_display.disable_mouse] |
call sys_set_window |
call [disable_mouse] |
call [_display.disable_mouse] |
call drawwindow_III |
;dec [mouse_pause] |
;call [draw_pointer] |
2936,9 → 2948,9 |
draw_skin_window: |
inc [mouse_pause] |
call [disable_mouse] |
call [_display.disable_mouse] |
call sys_set_window |
call [disable_mouse] |
call [_display.disable_mouse] |
mov eax, [TASK_COUNT] |
movzx eax, word [WIN_POS + eax*2] |
cmp eax, [CURRENT_TASK] |
2957,7 → 2969,7 |
draw_window_caption: |
inc [mouse_pause] |
call [disable_mouse] |
call [_display.disable_mouse] |
xor eax,eax |
mov edx,[TASK_COUNT] |
3495,7 → 3507,8 |
mov edx,[Screen_Max_X] ; screen x size |
inc edx |
imul edx, ebx |
mov dl, [eax+edx+display_data] ; lea eax, [...] |
add eax, [_WinMapAddress] |
mov dl, [eax+edx] ; lea eax, [...] |
xor ecx, ecx |
mov eax, [CURRENT_TASK] |
3584,7 → 3597,7 |
no_mark_system_shutdown: |
call [disable_mouse] |
call [_display.disable_mouse] |
dec byte [SYS_SHUTDOWN] |
je system_shutdown |
3742,9 → 3755,10 |
calculatebackground: ; background |
mov edi,display_data ; set os to use all pixels |
mov edi, [_WinMapAddress] ; set os to use all pixels |
mov eax,0x01010101 |
mov ecx,1280*1024 / 4 |
mov ecx, [_WinMapSize] |
shr ecx, 2 |
rep stosd |
mov byte [REDRAW_BACKGROUND], 0 ; do not draw background! |
5093,7 → 5107,7 |
add ebx, [edi+APPDATA.wnd_clientbox.top] |
xor edi, edi ; no force |
; mov edi, 1 |
call [disable_mouse] |
call [_display.disable_mouse] |
jmp [putpixel] |
align 4 |
5247,7 → 5261,7 |
pushad |
inc [mouse_pause] |
; Check of use of the hardware cursor. |
cmp [disable_mouse],__sys_disable_mouse |
cmp [_display.disable_mouse],__sys_disable_mouse |
jne @f |
; Since the test for the coordinates of the mouse should not be used, |
; then use the call [disable_mouse] is not possible! |
5311,7 → 5325,7 |
jnz .start_y |
dec [mouse_pause] |
; Check of use of the hardware cursor. |
cmp [disable_mouse],__sys_disable_mouse |
cmp [_display.disable_mouse],__sys_disable_mouse |
jne @f |
call [draw_pointer] |
@@: |
5433,18 → 5447,33 |
mov [Screen_Max_X], eax |
mov [Screen_Max_Y], edx |
mov [BytesPerScanLine], ecx |
mov [screen_workarea.right],eax |
mov [screen_workarea.bottom], edx |
inc eax |
shl eax, 2 ;32 bpp |
mov [BytesPerScanLine], eax |
push ebx |
push esi |
push edi |
pushad |
stdcall kernel_free, [_WinMapAddress] |
mov eax, [_display.width] |
mul [_display.height] |
mov [_WinMapSize], eax |
stdcall kernel_alloc, eax |
mov [_WinMapAddress], eax |
test eax, eax |
jz .epic_fail |
popad |
call repos_windows |
mov eax, 0 |
mov ebx, 0 |
xor eax, eax |
xor ebx, ebx |
mov ecx, [Screen_Max_X] |
mov edx, [Screen_Max_Y] |
call calculatescreen |
5455,6 → 5484,9 |
popfd |
ret |
.epic_fail: |
hlt ; Houston, we've had a problem |
; --------------- APM --------------------- |
apm_entry dp 0 |
apm_vf dd 0 |
/kernel/trunk/video/vesa12.inc |
---|
242,7 → 242,7 |
vesa12_drawbackground: |
call [disable_mouse] |
call [_display.disable_mouse] |
push eax |
push ebx |
327,7 → 327,8 |
mov eax,[Screen_Max_X] |
add eax,1 |
mul ebx |
cmp [eax+esi+WinMapAddress],byte 1 |
add eax, [_WinMapAddress] |
cmp [eax+esi],byte 1 |
jnz v12nbgp |
mov eax,[BytesPerScanLine] |
mov ebx,edi |
386,7 → 387,7 |
vesa12_drawbar: |
call [disable_mouse] |
call [_display.disable_mouse] |
;; mov [novesachecksum],dword 0 |
sub edx,ebx |
494,7 → 495,7 |
sub eax,VGABasePtr |
mov ebx,3 |
div ebx |
add eax,WinMapAddress |
add eax, [_WinMapAddress] |
mov ebx,[CURRENT_TASK] |
cld |
585,7 → 586,7 |
mov eax,edi |
sub eax,VGABasePtr |
shr eax,2 |
add eax,WinMapAddress |
add eax, [_WinMapAddress] |
mov ebx,[CURRENT_TASK] |
cld |
753,7 → 754,7 |
; mov ecx,320*65536+240 |
; mov edx,20*65536+20 |
call [disable_mouse] |
call [_display.disable_mouse] |
mov [novesachecksum],dword 0 |
push esi |
830,7 → 831,7 |
sub edx,VGABasePtr |
mov ebx,3 |
div ebx |
add edx,WinMapAddress |
add edx, [_WinMapAddress] |
mov ebx,[CURRENT_TASK] |
mov bh,[esp+4*3] |
909,7 → 910,7 |
mov edx,edi |
sub edx,VGABasePtr |
shr edx,2 |
add edx,WinMapAddress |
add edx, [_WinMapAddress] |
mov ebx,[CURRENT_TASK] |
mov bh,[esp+4*3] |
/kernel/trunk/video/vesa20.inc |
---|
28,7 → 28,6 |
;BytesPerScanLine equ 0xfe08 |
;LFBAddress equ 0xfe80 |
;ScreenBPP equ 0xfbf1 |
;WinMapAddress equ 0x460000 |
54,8 → 53,7 |
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier |
lea edi, [eax+eax*2] ; edi = x*3 |
add edi, ebx ; edi = x*3+(y*y multiplier) |
add edi, [LFBAddress] ; ebx = where pixel is in memory |
mov ecx, [edi] |
mov ecx, [LFB_BASE+edi] |
and ecx, 0xffffff |
ret |
62,8 → 60,7 |
Vesa20_getpixel32: |
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier |
lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier) |
add edi, [LFBAddress] ; ebx = where pixel is in memory |
mov ecx, [edi] |
mov ecx, [LFB_BASE+edi] |
and ecx, 0xffffff |
ret |
106,7 → 103,7 |
vesa20_putimage: |
pushad |
call [disable_mouse] |
call [_display.disable_mouse] |
sub esp, putimg.stack_data |
; save pointer to image |
mov [putimg.pti], ebx |
194,13 → 191,12 |
shr ebx, 3 |
imul eax, ebx |
add edx, eax |
add edx, [LFBAddress] |
; pointer to pixel map |
mov eax, [putimg.abs_cy] |
imul eax, [Screen_Max_X] |
add eax, [putimg.abs_cy] |
add eax, [putimg.abs_cx] |
add eax, WinMapAddress |
add eax, [_WinMapAddress] |
xchg eax, ebp |
; get process number |
mov ebx, [CURRENT_TASK] |
220,9 → 216,9 |
cmp [ebp], bl |
jne .skip |
; mov eax, [esi] ; eax = RRBBGGRR |
mov [edx], ax |
mov [LFB_BASE+edx], ax |
shr eax, 16 |
mov [edx+2], al |
mov [LFB_BASE+edx+2], al |
.skip: |
; add esi, 3 ;[putimg.source_bpp] |
add edx, 3 |
265,7 → 261,7 |
cmp [ebp], bl |
jne .skip |
; mov eax, [esi] ; ecx = RRBBGGRR |
mov [edx], eax |
mov [LFB_BASE+edx], eax |
.skip: |
; add esi, [putimg.source_bpp] |
add edx, 4 |
308,20 → 304,25 |
;;; mov [novesachecksum], dword 0 |
pushad |
cmp [Screen_Max_X], eax |
jb .exit |
cmp [Screen_Max_Y], ebx |
jb .exit |
test edi,1 ; force ? |
jnz .forced |
; not forced: |
push ecx ; save 24th bit in case negative pixel wanted |
call checkpixel |
test ecx,ecx |
pop ecx |
jnz .exit |
push eax |
mov edx,[_display.width] ; screen x size |
imul edx, ebx |
add eax, [_WinMapAddress] |
movzx edx, byte [eax+edx] |
cmp edx, [CURRENT_TASK] |
pop eax |
jne .exit |
.forced: |
cmp [Screen_Max_X], eax |
jb .exit |
cmp [Screen_Max_Y], ebx |
jb .exit |
.ok: |
; check if negation |
test ecx,0x01000000 |
jz .noneg |
342,11 → 343,9 |
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier |
lea edi, [eax+eax*2] ; edi = x*3 |
mov eax, [esp+32-8+4] |
add edi, [LFBAddress] |
add edi, ebx ; ebx = where to put pixel in memory |
mov [edi], ax |
mov [LFB_BASE+ebx+edi], ax |
shr eax, 16 |
mov [edi+2], al |
mov [LFB_BASE+ebx+edi+2], al |
ret |
357,8 → 356,7 |
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 |
add edi, [LFBAddress] ; ebx = where to put pixel in memory |
mov [edi], eax |
mov [LFB_BASE+edi], eax |
ret |
;************************************************* |
378,7 → 376,7 |
align 4 |
__sys_draw_line: |
; inc [mouse_pause] |
call [disable_mouse] |
call [_display.disable_mouse] |
; draw a line |
; eax = HIWORD = x1 |
568,7 → 566,7 |
; edi color |
vesa20_drawbar: |
pushad |
call [disable_mouse] |
call [_display.disable_mouse] |
sub esp, drbar.stack_data |
mov [drbar.color], edi |
sub edx, ebx |
643,13 → 641,12 |
; shr ebx, 3 |
imul eax, ebx |
add edx, eax |
add edx, [LFBAddress] |
; pointer to pixel map |
mov eax, [drbar.abs_cy] |
imul eax, [Screen_Max_X] |
add eax, [drbar.abs_cy] |
add eax, [drbar.abs_cx] |
add eax, WinMapAddress |
add eax, [_WinMapAddress] |
xchg eax, ebp |
; get process number |
mov ebx, [CURRENT_TASK] |
674,8 → 671,9 |
.new_x: |
cmp byte [ebp], bl |
jne .skip |
mov [edx], bh |
mov [edx + 1], ax |
mov [LFB_BASE+edx], bh |
mov [LFB_BASE+edx + 1], ax |
.skip: |
; add pixel |
add edx, 3 |
710,7 → 708,8 |
.new_x: |
cmp byte [ebp], bl |
jne .skip |
mov [edx], eax |
mov [LFB_BASE+edx], eax |
.skip: |
; add pixel |
add edx, 4 |
737,62 → 736,9 |
mov [EGA_counter],1 |
ret |
;voodoodbcplimit: |
; ebp:=(y+Ywin)*(ScreenXSize+1)+(x+Xwin)+AddrBuffer |
; pusha |
; xor edx,edx |
; mov eax,ebp |
; mov ebx,[Screen_Max_X] ; Screen_X_size |
; inc ebx ; +1 |
; sub eax,WinMapAddress ; -AddrBuffer |
; div ebx ; |
; mov ebx,eax ; ebx:=Y |
; mov eax,edx ; eax:=X |
; call cplimit |
; test ecx,ecx |
; jne dbcpl12 |
; popa |
; clc |
; ret |
; dbcpl12: |
; popa |
; stc |
; ret |
;dbcplimit: |
; pusha |
; xor edx,edx |
; mov ebx,[Screen_Max_X] |
; inc ebx |
; sub eax,WinMapAddress |
; div ebx |
; mov ebx,eax |
; mov eax,edx |
; call cplimit |
; test ecx,ecx |
; jne dbcpl1 |
; popa |
; clc |
; ret |
; dbcpl1: |
; popa |
; stc |
; ret |
align 4 |
vesa20_drawbackground_tiled: |
call [disable_mouse] |
call [_display.disable_mouse] |
pushad |
; External loop for all y from start to end |
mov ebx, [draw_data+32+RECT.top] ; y start |
810,10 → 756,11 |
jz @f |
add ebp, eax |
@@: |
add ebp, [LFBAddress] |
add ebp, LFB_BASE |
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB |
call calculate_edi |
xchg edi, ebp |
add ebp, [_WinMapAddress] |
; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress |
; 2) Calculate offset in background memory block |
push eax |
842,7 → 789,7 |
; esi -> bgr memory, edi -> output |
; ebp = offset in WinMapAddress |
dp3: |
cmp [ebp+WinMapAddress], dl |
cmp [ebp], dl |
jnz nbgp |
movsb |
movsb |
881,7 → 828,7 |
vesa20_drawbackground_stretch: |
call [disable_mouse] |
call [_display.disable_mouse] |
pushad |
; Helper variables |
; calculate 2^32*(BgrDataWidth-1) mod (ScreenWidth-1) |
917,7 → 864,6 |
jz @f |
add ebp, eax |
@@: |
add ebp, [LFBAddress] |
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB |
call calculate_edi |
xchg edi, ebp |
985,7 → 931,8 |
; qword [esp+28] = 2^32*(BgrDataHeight-1)/(ScreenHeight-1) |
; qword [esp+36] = 2^32*(BgrDataWidth-1)/(ScreenWidth-1) |
sdp3a: |
cmp [ebp+WinMapAddress], byte 1 |
mov eax, [_WinMapAddress] |
cmp [ebp+eax], byte 1 |
jnz snbgp |
mov eax, [bgr_cur_line+esi] |
test ecx, ecx |
993,9 → 940,11 |
mov ebx, [bgr_next_line+esi] |
call [overlapping_of_points_ptr] |
.novert: |
mov [edi], ax |
mov [LFB_BASE+edi], ax |
shr eax, 16 |
mov [edi+2], al |
mov [LFB_BASE+edi+2], al |
snbgp: |
cmp [ScreenBPP], byte 25 |
sbb edi, -4 |