sync with trunk

git-svn-id: svn://kolibrios.org@1376 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
CleverMouse 2010-01-15 11:54:11 +00:00
parent 3f03a80e3e
commit d003a8b8fe
43 changed files with 10857 additions and 9390 deletions

View File

@ -12,7 +12,7 @@ $Revision$
; Непосредственная работа с устройством СD (ATAPI) ; Непосредственная работа с устройством СD (ATAPI)
;********************************************************** ;**********************************************************
; Автор части исходного текста Кулаков Владимир Геннадьевич ; Автор части исходного текста Кулаков Владимир Геннадьевич
; Àäàïòàöèÿ, äîðàáîòêà è ðàçðàáîòêà Mario79 ; Àäàïòàöèÿ, äîðàáîòêà è ðàçðàáîòêà Mario79,<Lrz>
; Максимальное количество повторений операции чтения ; Максимальное количество повторений операции чтения
MaxRetr equ 10 MaxRetr equ 10
@ -20,46 +20,7 @@ MaxRetr equ 10
; (в тиках) ; (в тиках)
BSYWaitTime equ 1000 ;2 BSYWaitTime equ 1000 ;2
NoTickWaitTime equ 0xfffff NoTickWaitTime equ 0xfffff
CDBlockSize equ 2048
;*************************************************
;* ÏÎËÍÎÅ ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÊÎÌÏÀÊÒ-ÄÈÑÊÀ *
;* Ñ÷èòûâàþòñÿ äàííûå ïîëüçîâàòåëÿ, èíôîðìàöèÿ *
;* ñóáêàíàëà è êîíòðîëüíàÿ èíôîðìàöèÿ *
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
;* ïåðìåííûå: *
;* ChannelNumber - íîìåð êàíàëà; *
;* DiskNumber - íîìåð äèñêà íà êàíàëå; *
;* CDSectorAddress - àäðåñ ñ÷èòûâàåìîãî ñåêòîðà. *
;* Äàííûå ñ÷èòûâàåòñÿ â ìàññèâ CDDataBuf. *
;*************************************************
ReadCD:
pusha
; Çàäàòü ðàçìåð ñåêòîðà
mov [CDBlockSize],2048 ;2352
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
call clear_packet_buffer
; Ñôîðìèðîâàòü ïàêåòíóþ êîìàíäó äëÿ ñ÷èòûâàíèÿ
; ñåêòîðà äàííûõ
; Çàäàòü êîä êîìàíäû Read CD
mov [PacketCommand],byte 0x28 ;0xBE
; Çàäàòü àäðåñ ñåêòîðà
mov AX,word [CDSectorAddress+2]
xchg AL,AH
mov word [PacketCommand+2],AX
mov AX,word [CDSectorAddress]
xchg AL,AH
mov word [PacketCommand+4],AX
; mov eax,[CDSectorAddress]
; mov [PacketCommand+2],eax
; Çàäàòü êîëè÷åñòâî ñ÷èòûâàåìûõ ñåêòîðîâ
mov [PacketCommand+8],byte 1
; Çàäàòü ñ÷èòûâàíèå äàííûõ â ïîëíîì îáúåìå
; mov [PacketCommand+9],byte 0xF8
; Ïîäàòü êîìàíäó
call SendPacketDatCommand
popa
ret
;******************************************** ;********************************************
;* ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ * ;* ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ *
;* Многократное повторение чтения при сбоях * ;* Многократное повторение чтения при сбоях *
@ -73,8 +34,9 @@ ReadCDWRetr:
mov eax,[CDSectorAddress] mov eax,[CDSectorAddress]
mov ebx,[CDDataBuf_pointer] mov ebx,[CDDataBuf_pointer]
call cd_calculate_cache call cd_calculate_cache
xor edi,edi
add esi,8 add esi,8
mov edi,1 inc edi
.hdreadcache: .hdreadcache:
; cmp dword [esi+4],0 ; empty ; cmp dword [esi+4],0 ; empty
; je .nohdcache ; je .nohdcache
@ -128,9 +90,49 @@ ReadCDWRetr_1:
mov ECX,MaxRetr mov ECX,MaxRetr
@@NextRetr: @@NextRetr:
; Подать команду ; Подать команду
call ReadCD ;*************************************************
cmp [DevErrorCode],0 ;* ÏÎËÍÎÅ ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÊÎÌÏÀÊÒ-ÄÈÑÊÀ *
je @@End_4 ;* Ñ÷èòûâàþòñÿ äàííûå ïîëüçîâàòåëÿ, èíôîðìàöèÿ *
;* ñóáêàíàëà è êîíòðîëüíàÿ èíôîðìàöèÿ *
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
;* ïåðìåííûå: *
;* ChannelNumber - íîìåð êàíàëà; *
;* DiskNumber - íîìåð äèñêà íà êàíàëå; *
;* CDSectorAddress - àäðåñ ñ÷èòûâàåìîãî ñåêòîðà. *
;* Äàííûå ñ÷èòûâàåòñÿ â ìàññèâ CDDataBuf. *
;*************************************************
;ReadCD:
push ecx
; pusha
; Çàäàòü ðàçìåð ñåêòîðà
; mov [CDBlockSize],2048 ;2352
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
call clear_packet_buffer
; Ñôîðìèðîâàòü ïàêåòíóþ êîìàíäó äëÿ ñ÷èòûâàíèÿ
; ñåêòîðà äàííûõ
; Çàäàòü êîä êîìàíäû Read CD
mov [PacketCommand],byte 0x28 ;0xBE
; Çàäàòü àäðåñ ñåêòîðà
mov AX,word [CDSectorAddress+2]
xchg AL,AH
mov word [PacketCommand+2],AX
mov AX,word [CDSectorAddress]
xchg AL,AH
mov word [PacketCommand+4],AX
; mov eax,[CDSectorAddress]
; mov [PacketCommand+2],eax
; Çàäàòü êîëè÷åñòâî ñ÷èòûâàåìûõ ñåêòîðîâ
mov [PacketCommand+8],byte 1
; Çàäàòü ñ÷èòûâàíèå äàííûõ â ïîëíîì îáúåìå
; mov [PacketCommand+9],byte 0xF8
; Ïîäàòü êîìàíäó
call SendPacketDatCommand
pop ecx
; ret
; cmp [DevErrorCode],0
test eax,eax
jz @@End_4
or ecx,ecx ;{SPraid.simba} (for cd load) or ecx,ecx ;{SPraid.simba} (for cd load)
jz @@End_4 jz @@End_4
@ -141,8 +143,8 @@ ReadCDWRetr_1:
mov eax,NoTickWaitTime mov eax,NoTickWaitTime
.wait: .wait:
dec eax dec eax
cmp eax,0 ; test eax,eax
je @@NextRetr jz @@NextRetr
jmp .wait jmp .wait
@@: @@:
; Задержка на 2,5 секунды ; Задержка на 2,5 секунды
@ -154,23 +156,25 @@ ReadCDWRetr_1:
; ja @@Wait ; ja @@Wait
loop @@NextRetr loop @@NextRetr
@@End_4: @@End_4:
mov dword [DevErrorCode],eax
popad popad
ret ret
; Óíèâåðñàëüíûå ïðîöåäóðû, îáåñïå÷èâàþùèå âûïîëíåíèå ; Óíèâåðñàëüíûå ïðîöåäóðû, îáåñïå÷èâàþùèå âûïîëíåíèå
; пакетных команд в режиме PIO ; пакетных команд в режиме PIO
; Максимально допустимое время ожидания реакции ; Максимально допустимое время ожидания реакции
; устройства на пакетную команду (в тиках) ; устройства на пакетную команду (в тиках)
MaxCDWaitTime equ 1000 ;200 ;10 ñåêóíä
MaxCDWaitTime equ 1000 ;200 ;10 ñåêóíä
uglobal
; Область памяти для формирования пакетной команды ; Область памяти для формирования пакетной команды
PacketCommand: rb 12 ;DB 12 DUP (?) PacketCommand: rb 12 ;DB 12 DUP (?)
; Область памяти для приема данных от дисковода ; Область памяти для приема данных от дисковода
;CDDataBuf DB 4096 DUP (0) ;CDDataBuf DB 4096 DUP (0)
; Размер принимаемого блока данных в байтах ; Размер принимаемого блока данных в байтах
CDBlockSize DW ? ;CDBlockSize DW ?
; Адрес считываемого сектора данных ; Адрес считываемого сектора данных
CDSectorAddress: DD ? CDSectorAddress: DD ?
; Время начала очередной операции с диском ; Время начала очередной операции с диском
@ -179,7 +183,7 @@ TickCounter_1 DD 0
WURStartTime DD 0 WURStartTime DD 0
; указатель буфера для считывания ; указатель буфера для считывания
CDDataBuf_pointer dd 0 CDDataBuf_pointer dd 0
endg
;**************************************************** ;****************************************************
;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, * ;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ * ;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ *
@ -190,24 +194,26 @@ CDDataBuf_pointer dd 0
;* DiskNumber - номер диска на канале; * ;* DiskNumber - номер диска на канале; *
;* PacketCommand - 12-байтный командный пакет; * ;* PacketCommand - 12-байтный командный пакет; *
;* CDBlockSize - размер принимаемого блока данных. * ;* CDBlockSize - размер принимаемого блока данных. *
; return eax DevErrorCode
;**************************************************** ;****************************************************
SendPacketDatCommand: SendPacketDatCommand:
pushad xor eax,eax
mov [DevErrorCode],0 ; mov byte [DevErrorCode],al
; Задать режим CHS ; Задать режим CHS
mov [ATAAddressMode],0 mov byte [ATAAddressMode],al
; Послать ATA-команду передачи пакетной команды ; Послать ATA-команду передачи пакетной команды
mov [ATAFeatures],0 mov byte [ATAFeatures],al
mov [ATASectorCount],0 mov byte [ATASectorCount],al
mov [ATASectorNumber],0 mov byte [ATASectorNumber],al
; Загрузить размер передаваемого блока ; Загрузить размер передаваемого блока
mov AX,[CDBlockSize] mov [ATAHead],al
mov [ATACylinder],AX ; mov AX,[CDBlockSize]
mov [ATAHead],0 mov [ATACylinder],CDBlockSize
mov [ATACommand],0A0h mov [ATACommand],0A0h
call SendCommandToHDD_1 call SendCommandToHDD_1
cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè test eax,eax
jne @@End_8 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè ; cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
jnz @@End_8 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
; Ожидание готовности дисковода к приему ; Ожидание готовности дисковода к приему
; пакетной команды ; пакетной команды
@ -218,8 +224,8 @@ SendPacketDatCommand:
cmp [timer_ticks_enable],0 cmp [timer_ticks_enable],0
jne @f jne @f
dec ecx dec ecx
cmp ecx,0 ; test ecx,ecx
je @@Err1_1 jz @@Err1_1
jmp .test jmp .test
@@: @@:
call change_task call change_task
@ -261,8 +267,8 @@ SendPacketDatCommand:
cmp [timer_ticks_enable],0 cmp [timer_ticks_enable],0
jne @f jne @f
dec ecx dec ecx
cmp ecx,0 ; test ecx,ecx
je @@Err1_1 jz @@Err1_1
jmp .test_1 jmp .test_1
@@: @@:
call change_task call change_task
@ -286,7 +292,7 @@ SendPacketDatCommand:
mov DX,[ATABasePortAddr] ;порт 1x0h mov DX,[ATABasePortAddr] ;порт 1x0h
; Загрузить в счетчик размер блока в байтах ; Загрузить в счетчик размер блока в байтах
xor ecx,ecx xor ecx,ecx
mov CX,[CDBlockSize] mov CX,CDBlockSize
; Вычислить размер блока в 16-разрядных словах ; Вычислить размер блока в 16-разрядных словах
shr CX,1 ;разделить размер блока на 2 shr CX,1 ;разделить размер блока на 2
; Принять блок данных ; Принять блок данных
@ -294,21 +300,29 @@ SendPacketDatCommand:
cld cld
rep insw rep insw
sti sti
; Óñïåøíîå çàâåðøåíèå ïðèåìà äàííûõ ; Óñïåøíîå çàâåðøåíèå ïðèåìà äàííûõ
jmp @@End_8 @@End_8:
xor eax,eax
ret
; Записать код ошибки ; Записать код ошибки
@@Err1_1: @@Err1_1:
mov [DevErrorCode],1 xor eax,eax
jmp @@End_8 inc eax
ret
; mov [DevErrorCode],1
; ret
@@Err6_temp: @@Err6_temp:
mov [DevErrorCode],7 mov eax,7
jmp @@End_8 ret
; mov [DevErrorCode],7
; ret
@@Err6: @@Err6:
mov [DevErrorCode],6 mov eax,6
@@End_8: ret
popad ; mov [DevErrorCode],6
ret ;@@End_8:
; ret
@ -323,19 +337,21 @@ SendPacketDatCommand:
;*********************************************** ;***********************************************
SendPacketNoDatCommand: SendPacketNoDatCommand:
pushad pushad
mov [DevErrorCode],0 xor eax,eax
; mov byte [DevErrorCode],al
; Задать режим CHS ; Задать режим CHS
mov [ATAAddressMode],0 mov byte [ATAAddressMode],al
; Послать ATA-команду передачи пакетной команды ; Послать ATA-команду передачи пакетной команды
mov [ATAFeatures],0 mov byte [ATAFeatures],al
mov [ATASectorCount],0 mov byte [ATASectorCount],al
mov [ATASectorNumber],0 mov byte [ATASectorNumber],al
mov [ATACylinder],0 mov word [ATACylinder],ax
mov [ATAHead],0 mov byte [ATAHead],al
mov [ATACommand],0A0h mov [ATACommand],0A0h
call SendCommandToHDD_1 call SendCommandToHDD_1
cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè ; cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
jne @@End_9 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè test eax,eax
jnz @@End_9 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
; Ожидание готовности дисковода к приему ; Ожидание готовности дисковода к приему
; пакетной команды ; пакетной команды
mov DX,[ATABasePortAddr] mov DX,[ATABasePortAddr]
@ -371,8 +387,8 @@ SendPacketNoDatCommand:
mov AX,word [PacketCommand+10] mov AX,word [PacketCommand+10]
out DX,AX out DX,AX
; sti ; sti
cmp [ignore_CD_eject_wait],1 cmp [ignore_CD_eject_wait],1
je @@End_9 je @@clear_DEC
; Ожидание подтверждения приема команды ; Ожидание подтверждения приема команды
mov DX,[ATABasePortAddr] mov DX,[ATABasePortAddr]
add DX,7 ;порт 1х7h add DX,7 ;порт 1х7h
@ -391,15 +407,19 @@ SendPacketNoDatCommand:
jnz @@Err6_1 jnz @@Err6_1
test AL,40h ;состояние сигнала DRDY test AL,40h ;состояние сигнала DRDY
jz @@WaitDevice1_1 jz @@WaitDevice1_1
jmp @@End_9 @@clear_DEC:
and [DevErrorCode],0
popad
ret
; Записать код ошибки ; Записать код ошибки
@@Err1_3: @@Err1_3:
mov [DevErrorCode],1 xor eax,eax
inc eax
jmp @@End_9 jmp @@End_9
@@Err6_1: @@Err6_1:
mov [DevErrorCode],6 mov eax,6
@@End_9: @@End_9:
mov [DevErrorCode],eax
popad popad
ret ret
@ -420,11 +440,11 @@ SendPacketNoDatCommand:
;* в ATABasePortAddr - базовый адрес HDD; * ;* в ATABasePortAddr - базовый адрес HDD; *
;* в DevErrorCode - ноль. * ;* в DevErrorCode - ноль. *
;* При возникновении ошибки в DevErrorCode будет * ;* При возникновении ошибки в DevErrorCode будет *
;* âîçâðàùåí êîä îøèáêè. * ;* âîçâðàùåí êîä îøèáêè â eax *
;**************************************************** ;****************************************************
SendCommandToHDD_1: SendCommandToHDD_1:
pushad ; pushad
mov [DevErrorCode],0 ; mov [DevErrorCode],0 not need
; Проверить значение кода режима ; Проверить значение кода режима
cmp [ATAAddressMode],1 cmp [ATAAddressMode],1
ja @@Err2_4 ja @@Err2_4
@ -459,8 +479,8 @@ SendCommandToHDD_1:
cmp [timer_ticks_enable],0 cmp [timer_ticks_enable],0
jne @f jne @f
dec ecx dec ecx
cmp ecx,0 ; test ecx,ecx
je @@Err1_4 jz @@Err1_4
jmp .test jmp .test
@@: @@:
call change_task call change_task
@ -514,28 +534,35 @@ SendCommandToHDD_1:
out DX,AL out DX,AL
sti sti
; Сбросить признак ошибки ; Сбросить признак ошибки
mov [DevErrorCode],0 ; mov [DevErrorCode],0
jmp @@End_10 @@End_10:
xor eax,eax
ret
; Записать код ошибки ; Записать код ошибки
@@Err1_4: @@Err1_4:
mov [DevErrorCode],1 xor eax,eax
jmp @@End_10 inc eax
; mov [DevErrorCode],1
ret
@@Err2_4: @@Err2_4:
mov [DevErrorCode],2 mov eax,2
jmp @@End_10 ; mov [DevErrorCode],2
ret
@@Err3_4: @@Err3_4:
mov [DevErrorCode],3 mov eax,3
jmp @@End_10 ; mov [DevErrorCode],3
ret
@@Err4_4: @@Err4_4:
mov [DevErrorCode],4 mov eax,4
jmp @@End_10 ; mov [DevErrorCode],4
ret
@@Err5_4: @@Err5_4:
mov [DevErrorCode],5 mov eax,5
; mov [DevErrorCode],5
; Завершение работы программы ; Завершение работы программы
@@End_10: ret
; sti ; sti
popad ; popad
ret
;************************************************* ;*************************************************
;* ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ * ;* ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ *
@ -563,8 +590,8 @@ WaitUnitReady:
cmp [DevErrorCode],0 cmp [DevErrorCode],0
je @@End_11 je @@End_11
dec ecx dec ecx
cmp ecx,0 ; cmp ecx,0
je .Error jz .Error
jmp @@SendCommand jmp @@SendCommand
@@: @@:
call change_task call change_task
@ -815,14 +842,14 @@ check_ATAPI_device_event:
call EjectMedium call EjectMedium
mov [ignore_CD_eject_wait],0 mov [ignore_CD_eject_wait],0
ret ret
iglobal
timer_ATAPI_check dd 0 timer_ATAPI_check dd 0
ATAPI_IDE0_lock db 0 ATAPI_IDE0_lock db 0
ATAPI_IDE1_lock db 0 ATAPI_IDE1_lock db 0
ATAPI_IDE2_lock db 0 ATAPI_IDE2_lock db 0
ATAPI_IDE3_lock db 0 ATAPI_IDE3_lock db 0
ignore_CD_eject_wait db 0 ignore_CD_eject_wait db 0
endg
;************************************************* ;*************************************************
;* Получить сообщение о событии или состоянии * ;* Получить сообщение о событии или состоянии *
;* устройства * ;* устройства *
@ -896,7 +923,7 @@ Read_TOC:
clear_packet_buffer: clear_packet_buffer:
; Очистить буфер пакетной команды ; Очистить буфер пакетной команды
mov [PacketCommand],dword 0 and [PacketCommand],dword 0
mov [PacketCommand+4],dword 0 and [PacketCommand+4],dword 0
mov [PacketCommand+8],dword 0 and [PacketCommand+8],dword 0
ret ret

View File

@ -42,7 +42,7 @@ printplain:
@@: @@:
call putchar call putchar
lodsb lodsb
cmp al, 0 test al,al
jnz @b jnz @b
popa popa
ret ret

View File

@ -28,7 +28,7 @@ preboot_dma db 0 ; use DMA for access to HDD (1-always, 2-only for read, 3-n
preboot_device db 0 ; boot device preboot_device db 0 ; boot device
; (1-floppy 2-harddisk 3-kernel restart 4-format ram disk) ; (1-floppy 2-harddisk 3-kernel restart 4-format ram disk)
;!!!! 0 - autodetect !!!! ;!!!! 0 - autodetect !!!!
preboot_blogesc = 0 ; start immediately after bootlog preboot_blogesc = 0 ; start immediately after bootlog
preboot_biosdisk db 0 ; use V86 to access disks through BIOS (1-yes, 2-no) preboot_biosdisk db 0 ; use V86 to access disks through BIOS (1-yes, 2-no)
if $>0x200 if $>0x200

View File

@ -30,55 +30,66 @@ $Revision$
; Description ; Description
; entry point for system PCI calls ; entry point for system PCI calls
;*************************************************************************** ;***************************************************************************
;mmio_pci_addr equ 0x400 ; set actual PCI address here to activate user-MMIO
align 4 align 4
pci_api: pci_api:
cmp [pci_access_enabled],1 cmp [pci_access_enabled],1
jne no_pci_access_for_applications jne no_pci_access_for_applications
or al,al or al,al
jnz pci_fn_1 jnz pci_fn_1
; PCI function 0: get pci version (AH.AL) ; PCI function 0: get pci version (AH.AL)
movzx eax,word [BOOT_VAR+0x9022] movzx eax,word [BOOT_VAR+0x9022]
ret ret
pci_fn_1: pci_fn_1:
cmp al,1 cmp al,1
jnz pci_fn_2 jnz pci_fn_2
; PCI function 1: get last bus in AL ; PCI function 1: get last bus in AL
mov al,[BOOT_VAR+0x9021] mov al,[BOOT_VAR+0x9021]
ret ret
pci_fn_2: pci_fn_2:
cmp al,2 cmp al,2
jne pci_fn_3 jne pci_fn_3
; PCI function 2: get pci access mechanism ; PCI function 2: get pci access mechanism
mov al,[BOOT_VAR+0x9020] mov al,[BOOT_VAR+0x9020]
ret ret
pci_fn_3: pci_fn_3:
cmp al,4 cmp al,4
jz pci_read_reg ;byte jz pci_read_reg ;byte
cmp al,5 cmp al,5
jz pci_read_reg ;word jz pci_read_reg ;word
cmp al,6 cmp al,6
jz pci_read_reg ;dword jz pci_read_reg ;dword
cmp al,8 cmp al,8
jz pci_write_reg ;byte jz pci_write_reg ;byte
cmp al,9 cmp al,9
jz pci_write_reg ;word jz pci_write_reg ;word
cmp al,10 cmp al,10
jz pci_write_reg ;dword jz pci_write_reg ;dword
if defined mmio_pci_addr
cmp al,11 ; user-level MMIO functions
jz pci_mmio_init
cmp al,12
jz pci_mmio_map
cmp al,13
jz pci_mmio_unmap
end if
no_pci_access_for_applications: no_pci_access_for_applications:
mov eax,-1 or eax,-1
ret ret
;*************************************************************************** ;***************************************************************************
; Function ; Function
@ -96,10 +107,10 @@ pci_fn_3:
align 4 align 4
pci_make_config_cmd: pci_make_config_cmd:
shl eax,8 ; move bus to bits 16-23 shl eax,8 ; move bus to bits 16-23
mov ax,bx ; combine all mov ax,bx ; combine all
and eax,0xffffff and eax,0xffffff
or eax,0x80000000 or eax,0x80000000
ret ret
;*************************************************************************** ;***************************************************************************
@ -116,120 +127,120 @@ pci_make_config_cmd:
align 4 align 4
pci_read_reg: pci_read_reg:
cmp byte [BOOT_VAR+0x9020],2 ;what mechanism will we use? cmp byte [BOOT_VAR+0x9020],2 ;what mechanism will we use?
je pci_read_reg_2 je pci_read_reg_2
; mechanism 1 ; mechanism 1
push esi ; save register size into ESI push esi ; save register size into ESI
mov esi,eax mov esi,eax
and esi,3 and esi,3
call pci_make_config_cmd call pci_make_config_cmd
mov ebx,eax mov ebx,eax
; get current state ; get current state
mov dx,0xcf8 mov dx,0xcf8
in eax, dx in eax, dx
push eax push eax
; set up addressing to config data ; set up addressing to config data
mov eax,ebx mov eax,ebx
and al,0xfc ; make address dword-aligned and al,0xfc ; make address dword-aligned
out dx,eax out dx,eax
; get requested DWORD of config data ; get requested DWORD of config data
mov dl,0xfc mov dl,0xfc
and bl,3 and bl,3
or dl,bl ; add to port address first 2 bits of register address or dl,bl ; add to port address first 2 bits of register address
or esi,esi or esi,esi
jz pci_read_byte1 jz pci_read_byte1
cmp esi,1 cmp esi,1
jz pci_read_word1 jz pci_read_word1
cmp esi,2 cmp esi,2
jz pci_read_dword1 jz pci_read_dword1
jmp pci_fin_read1 jmp pci_fin_read1
pci_read_byte1: pci_read_byte1:
in al,dx in al,dx
jmp pci_fin_read1 jmp pci_fin_read1
pci_read_word1: pci_read_word1:
in ax,dx in ax,dx
jmp pci_fin_read1 jmp pci_fin_read1
pci_read_dword1: pci_read_dword1:
in eax,dx in eax,dx
jmp pci_fin_read1 jmp pci_fin_read1
pci_fin_read1: pci_fin_read1:
; restore configuration control ; restore configuration control
xchg eax,[esp] xchg eax,[esp]
mov dx,0xcf8 mov dx,0xcf8
out dx,eax out dx,eax
pop eax pop eax
pop esi pop esi
ret ret
pci_read_reg_2: pci_read_reg_2:
test bh,128 ;mech#2 only supports 16 devices per bus test bh,128 ;mech#2 only supports 16 devices per bus
jnz pci_read_reg_err jnz pci_read_reg_err
push esi ; save register size into ESI push esi ; save register size into ESI
mov esi,eax mov esi,eax
and esi,3 and esi,3
push eax push eax
;store current state of config space ;store current state of config space
mov dx,0xcf8 mov dx,0xcf8
in al,dx in al,dx
mov ah,al mov ah,al
mov dl,0xfa mov dl,0xfa
in al,dx in al,dx
xchg eax,[esp] xchg eax,[esp]
; out 0xcfa,bus ; out 0xcfa,bus
mov al,ah mov al,ah
out dx,al out dx,al
; out 0xcf8,0x80 ; out 0xcf8,0x80
mov dl,0xf8 mov dl,0xf8
mov al,0x80 mov al,0x80
out dx,al out dx,al
; compute addr ; compute addr
shr bh,3 ; func is ignored in mechanism 2 shr bh,3 ; func is ignored in mechanism 2
or bh,0xc0 or bh,0xc0
mov dx,bx mov dx,bx
or esi,esi or esi,esi
jz pci_read_byte2 jz pci_read_byte2
cmp esi,1 cmp esi,1
jz pci_read_word2 jz pci_read_word2
cmp esi,2 cmp esi,2
jz pci_read_dword2 jz pci_read_dword2
jmp pci_fin_read2 jmp pci_fin_read2
pci_read_byte2: pci_read_byte2:
in al,dx in al,dx
jmp pci_fin_read2 jmp pci_fin_read2
pci_read_word2: pci_read_word2:
in ax,dx in ax,dx
jmp pci_fin_read2 jmp pci_fin_read2
pci_read_dword2: pci_read_dword2:
in eax,dx in eax,dx
; jmp pci_fin_read2 ; jmp pci_fin_read2
pci_fin_read2: pci_fin_read2:
; restore configuration space ; restore configuration space
xchg eax,[esp] xchg eax,[esp]
mov dx,0xcfa mov dx,0xcfa
out dx,al out dx,al
mov dl,0xf8 mov dl,0xf8
mov al,ah mov al,ah
out dx,al out dx,al
pop eax pop eax
pop esi pop esi
ret ret
pci_read_reg_err: pci_read_reg_err:
xor eax,eax xor eax,eax
dec eax dec eax
ret ret
;*************************************************************************** ;***************************************************************************
@ -247,150 +258,281 @@ pci_read_reg_err:
align 4 align 4
pci_write_reg: pci_write_reg:
cmp byte [BOOT_VAR+0x9020],2 ;what mechanism will we use? cmp byte [BOOT_VAR+0x9020],2 ;what mechanism will we use?
je pci_write_reg_2 je pci_write_reg_2
; mechanism 1 ; mechanism 1
push esi ; save register size into ESI push esi ; save register size into ESI
mov esi,eax mov esi,eax
and esi,3 and esi,3
call pci_make_config_cmd call pci_make_config_cmd
mov ebx,eax mov ebx,eax
; get current state into ecx ; get current state into ecx
mov dx,0xcf8 mov dx,0xcf8
in eax, dx in eax, dx
push eax push eax
; set up addressing to config data ; set up addressing to config data
mov eax,ebx mov eax,ebx
and al,0xfc ; make address dword-aligned and al,0xfc ; make address dword-aligned
out dx,eax out dx,eax
; write DWORD of config data ; write DWORD of config data
mov dl,0xfc mov dl,0xfc
and bl,3 and bl,3
or dl,bl or dl,bl
mov eax,ecx mov eax,ecx
or esi,esi or esi,esi
jz pci_write_byte1 jz pci_write_byte1
cmp esi,1 cmp esi,1
jz pci_write_word1 jz pci_write_word1
cmp esi,2 cmp esi,2
jz pci_write_dword1 jz pci_write_dword1
jmp pci_fin_write1 jmp pci_fin_write1
pci_write_byte1: pci_write_byte1:
out dx,al out dx,al
jmp pci_fin_write1 jmp pci_fin_write1
pci_write_word1: pci_write_word1:
out dx,ax out dx,ax
jmp pci_fin_write1 jmp pci_fin_write1
pci_write_dword1: pci_write_dword1:
out dx,eax out dx,eax
jmp pci_fin_write1 jmp pci_fin_write1
pci_fin_write1: pci_fin_write1:
; restore configuration control ; restore configuration control
pop eax pop eax
mov dl,0xf8 mov dl,0xf8
out dx,eax out dx,eax
xor eax,eax xor eax,eax
pop esi pop esi
ret ret
pci_write_reg_2: pci_write_reg_2:
test bh,128 ;mech#2 only supports 16 devices per bus test bh,128 ;mech#2 only supports 16 devices per bus
jnz pci_write_reg_err jnz pci_write_reg_err
push esi ; save register size into ESI push esi ; save register size into ESI
mov esi,eax mov esi,eax
and esi,3 and esi,3
push eax push eax
;store current state of config space ;store current state of config space
mov dx,0xcf8 mov dx,0xcf8
in al,dx in al,dx
mov ah,al mov ah,al
mov dl,0xfa mov dl,0xfa
in al,dx in al,dx
xchg eax,[esp] xchg eax,[esp]
; out 0xcfa,bus ; out 0xcfa,bus
mov al,ah mov al,ah
out dx,al out dx,al
; out 0xcf8,0x80 ; out 0xcf8,0x80
mov dl,0xf8 mov dl,0xf8
mov al,0x80 mov al,0x80
out dx,al out dx,al
; compute addr ; compute addr
shr bh,3 ; func is ignored in mechanism 2 shr bh,3 ; func is ignored in mechanism 2
or bh,0xc0 or bh,0xc0
mov dx,bx mov dx,bx
; write register ; write register
mov eax,ecx mov eax,ecx
or esi,esi or esi,esi
jz pci_write_byte2 jz pci_write_byte2
cmp esi,1 cmp esi,1
jz pci_write_word2 jz pci_write_word2
cmp esi,2 cmp esi,2
jz pci_write_dword2 jz pci_write_dword2
jmp pci_fin_write2 jmp pci_fin_write2
pci_write_byte2: pci_write_byte2:
out dx,al out dx,al
jmp pci_fin_write2 jmp pci_fin_write2
pci_write_word2: pci_write_word2:
out dx,ax out dx,ax
jmp pci_fin_write2 jmp pci_fin_write2
pci_write_dword2: pci_write_dword2:
out dx,eax out dx,eax
jmp pci_fin_write2 jmp pci_fin_write2
pci_fin_write2: pci_fin_write2:
; restore configuration space ; restore configuration space
pop eax pop eax
mov dx,0xcfa mov dx,0xcfa
out dx,al out dx,al
mov dl,0xf8 mov dl,0xf8
mov al,ah mov al,ah
out dx,al out dx,al
xor eax,eax xor eax,eax
pop esi pop esi
ret ret
pci_write_reg_err: pci_write_reg_err:
xor eax,eax xor eax,eax
dec eax dec eax
ret ret
if defined mmio_pci_addr ; must be set above
;***************************************************************************
; Function
; pci_mmio_init
;
; Description
; IN: bx = device's PCI bus address (bbbbbbbbdddddfff)
; Returns eax = user heap space available (bytes)
; Error codes
; eax = -1 : PCI user access blocked,
; eax = -2 : device not registered for uMMIO service
; eax = -3 : user heap initialization failure
;***************************************************************************
pci_mmio_init:
cmp bx, mmio_pci_addr
jz @f
mov eax,-2
ret
@@:
call init_heap ; (if not initialized yet)
or eax,eax
jz @f
ret
@@:
mov eax,-3
ret
;***************************************************************************
; Function
; pci_mmio_map
;
; Description
; maps a block of PCI memory to user-accessible linear address
;
; WARNING! This VERY EXPERIMENTAL service is for one chosen PCI device only!
; The target device address should be set in kernel var mmio_pci_addr
;
; IN: ah = BAR#;
; IN: ebx = block size (bytes);
; IN: ecx = offset in MMIO block (in 4K-pages, to avoid misaligned pages);
;
; Returns eax = MMIO block's linear address in the userspace (if no error)
;
;
; Error codes
; eax = -1 : user access to PCI blocked,
; eax = -2 : an invalid BAR register referred
; eax = -3 : no i/o space on that BAR
; eax = -4 : a port i/o BAR register referred
; eax = -5 : dynamic userspace allocation problem
;***************************************************************************
pci_mmio_map:
and edx,0x0ffff
cmp ah,6
jc .bar_0_5
jz .bar_rom
mov eax,-2
ret
.bar_rom:
mov ah, 8 ; bar6 = Expansion ROM base address
.bar_0_5:
push ecx
add ebx, 4095
and ebx,-4096
push ebx
mov bl, ah ; bl = BAR# (0..5), however bl=8 for BAR6
shl bl, 1
shl bl, 1
add bl, 0x10 ; now bl = BAR offset in PCI config. space
mov ax, mmio_pci_addr
mov bh, al ; bh = dddddfff
mov al, 2 ; al : DW to read
call pci_read_reg
or eax, eax
jnz @f
mov eax,-3 ; empty I/O space
jmp mmio_ret_fail
@@:
test eax, 1
jz @f
mov eax,-4 ; damned ports (not MMIO space)
jmp mmio_ret_fail
@@:
pop ecx ; ecx = block size, bytes (expanded to whole page)
mov ebx, ecx ; user_alloc destroys eax, ecx, edx, but saves ebx
push eax ; store MMIO physical address + keep 2DWords in the stack
stdcall user_alloc, ecx
or eax, eax
jnz mmio_map_over
mov eax,-5 ; problem with page allocation
mmio_ret_fail:
pop ecx
pop edx
ret
mmio_map_over:
mov ecx, ebx ; ecx = size (bytes, expanded to whole page)
shr ecx, 12 ; ecx = number of pages
mov ebx, eax ; ebx = linear address
pop eax ; eax = MMIO start
pop edx ; edx = MMIO shift (pages)
shl edx, 12 ; edx = MMIO shift (bytes)
add eax, edx ; eax = uMMIO physical address
or eax, PG_SHARED
or eax, PG_UW
or eax, PG_NOCACHE
mov edi, ebx
call commit_pages
mov eax, edi
ret
;***************************************************************************
; Function
; pci_mmio_unmap_page
;
; Description
; unmaps the linear space previously tied to a PCI memory block
;
; IN: ebx = linear address of space previously allocated by pci_mmio_map
; returns eax = 1 if successfully unmapped
;
; Error codes
; eax = -1 if no user PCI access allowed,
; eax = 0 if unmapping failed
;***************************************************************************
pci_mmio_unmap:
stdcall user_free, ebx
ret
end if
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
uglobal
align 4
; VendID (2), DevID (2), Revision = 0 (1), Class Code (3), FNum (1), Bus (1) ; VendID (2), DevID (2), Revision = 0 (1), Class Code (3), FNum (1), Bus (1)
pci_emu_dat: times 30*10 db 0 pci_emu_dat: times 30*10 db 0
endg
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
align 4 align 4
sys_pcibios: sys_pcibios:
xchg ebx, eax
xchg ecx, eax
xchg edx, eax
xchg esi, eax
xchg edi, eax
cmp [pci_access_enabled], 1 cmp [pci_access_enabled], 1
jne .unsupported_func jne .unsupported_func
cmp [pci_bios_entry], 0 cmp [pci_bios_entry], 0
jz .emulate_bios jz .emulate_bios
push ds push ds
mov ax, pci_data_sel mov ax, pci_data_sel
mov ds, ax mov ds, ax
mov eax, ebp mov eax, ebp
mov ah, 0B1h mov ah, 0B1h
call pword [cs:pci_bios_entry] call pword [cs:pci_bios_entry]
pop ds pop ds
jmp .return jmp .return
;-=-=-=-=-=-=-=-= ;-=-=-=-=-=-=-=-=
@ -398,10 +540,10 @@ sys_pcibios:
cmp ebp, 1 ; PCI_FUNCTION_ID cmp ebp, 1 ; PCI_FUNCTION_ID
jnz .not_PCI_BIOS_PRESENT jnz .not_PCI_BIOS_PRESENT
mov edx, 'PCI ' mov edx, 'PCI '
mov al, [OS_BASE+0x2F0000 + 0x9020] mov al, [OS_BASE+0x2F0000 + 0x9020]
mov bx, [OS_BASE+0x2F0000 + 0x9022] mov bx, [OS_BASE+0x2F0000 + 0x9022]
mov cl, [OS_BASE+0x2F0000 + 0x9021] mov cl, [OS_BASE+0x2F0000 + 0x9021]
xor ah, ah xor ah, ah
jmp .return_abcd jmp .return_abcd
.not_PCI_BIOS_PRESENT: .not_PCI_BIOS_PRESENT:
@ -415,7 +557,7 @@ sys_pcibios:
dec si dec si
jns ..no jns ..no
mov bx, [ebx + 4] mov bx, [ebx + 4]
xor ah, ah xor ah, ah
jmp .return_ab jmp .return_ab
..no: cmp word[ebx], 0 ..no: cmp word[ebx], 0
je ..dev_not_found je ..dev_not_found
@ -430,10 +572,10 @@ sys_pcibios:
jne .not_FIND_PCI_CLASS_CODE jne .not_FIND_PCI_CLASS_CODE
mov esi, pci_emu_dat mov esi, pci_emu_dat
shl ecx, 8 shl ecx, 8
..nxt2: cmp [esi], ecx ..nxt2: cmp [esi], ecx
jne ..no2 jne ..no2
mov bx, [esi] mov bx, [esi]
xor ah, ah xor ah, ah
jmp .return_ab jmp .return_ab
..no2: cmp dword[esi], 0 ..no2: cmp dword[esi], 0
je ..dev_not_found je ..dev_not_found
@ -445,11 +587,11 @@ sys_pcibios:
jb .not_READ_CONFIG jb .not_READ_CONFIG
cmp ebp, 0x0A cmp ebp, 0x0A
ja .not_READ_CONFIG ja .not_READ_CONFIG
mov eax, ebp mov eax, ebp
mov ah, bh mov ah, bh
mov edx, edi mov edx, edi
mov bh, bl mov bh, bl
mov bl, dl mov bl, dl
call pci_read_reg call pci_read_reg
mov ecx, eax mov ecx, eax
xor ah, ah ; SUCCESSFUL xor ah, ah ; SUCCESSFUL
@ -459,25 +601,25 @@ sys_pcibios:
jb .not_WRITE_CONFIG jb .not_WRITE_CONFIG
cmp ebp, 0x0D cmp ebp, 0x0D
ja .not_WRITE_CONFIG ja .not_WRITE_CONFIG
lea eax, [ebp+1] lea eax, [ebp+1]
mov ah, bh mov ah, bh
mov edx, edi mov edx, edi
mov bh, bl mov bh, bl
mov bl, dl mov bl, dl
call pci_write_reg call pci_write_reg
xor ah, ah ; SUCCESSFUL xor ah, ah ; SUCCESSFUL
jmp .return_abc jmp .return_abc
.not_WRITE_CONFIG: .not_WRITE_CONFIG:
.unsupported_func: .unsupported_func:
mov ah, 0x81 ; FUNC_NOT_SUPPORTED mov ah, 0x81 ; FUNC_NOT_SUPPORTED
.return:mov dword[esp + 8 ], edi .return:mov dword[esp + 4 ], edi
mov dword[esp + 12], esi mov dword[esp + 8], esi
.return_abcd: .return_abcd:
mov dword[esp + 28], edx mov dword[esp + 24], edx
.return_abc: .return_abc:
mov dword[esp + 32], ecx mov dword[esp + 28], ecx
.return_ab: .return_ab:
mov dword[esp + 24], ebx mov dword[esp + 20], ebx
.return_a: .return_a:
mov dword[esp + 36], eax mov dword[esp + 32], eax
ret ret

View File

@ -1,6 +1,6 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -309,15 +309,13 @@ draw_data equ (OS_BASE+0x0338000);
BgrDrawMode equ (OS_BASE+0x033BFF4) BgrDrawMode equ (OS_BASE+0x033BFF4)
BgrDataWidth equ (OS_BASE+0x033BFF8) BgrDataWidth equ (OS_BASE+0x033BFF8)
BgrDataHeight equ (OS_BASE+0x033BFFC) BgrDataHeight equ (OS_BASE+0x033BFFC)
WinMapAddress equ (OS_BASE+0x033C000)
display_data equ (OS_BASE+0x033C000) ;1024*1280=0x140000
virtual at (OS_BASE+0x047CF80) sys_pgmap equ (OS_BASE+0x033C000)
virtual at (OS_BASE+0x05FFF80)
tss TSS tss TSS
end virtual end virtual
sys_pgmap equ (OS_BASE+0x047F000)
HEAP_BASE equ (OS_BASE+0x0800000) HEAP_BASE equ (OS_BASE+0x0800000)
HEAP_MIN_SIZE equ 0x01000000 HEAP_MIN_SIZE equ 0x01000000
@ -439,7 +437,8 @@ APP_OBJ_OFFSET equ 48
APP_EV_OFFSET equ 40 APP_EV_OFFSET equ 40
struc CURSOR struc CURSOR
{;common object header {
;common object header
.magic dd ? ;'CURS' .magic dd ? ;'CURS'
.destroy dd ? ;internal destructor .destroy dd ? ;internal destructor
.fd dd ? ;next object in list .fd dd ? ;next object in list
@ -450,12 +449,17 @@ struc CURSOR
.base dd ? ;allocated memory .base dd ? ;allocated memory
.hot_x dd ? ;hotspot coords .hot_x dd ? ;hotspot coords
.hot_y dd ? .hot_y dd ?
.list_next dd ? ;next cursor in cursor list
.list_prev dd ? ;prev cursor in cursor list
.dev_obj dd ? ;device depended data
.sizeof:
} }
virtual at 0 virtual at 0
CURSOR CURSOR CURSOR CURSOR
end virtual end virtual
CURSOR_SIZE equ 32
struc EVENT struc EVENT
{ {
@ -511,6 +515,77 @@ virtual at 0
SMAP SMAP SMAP SMAP
end virtual end virtual
struc DLLDESCR
{
.bk dd ?
.fd dd ? ;+4
.data dd ? ;+8
.size dd ? ;+12
.timestamp dq ?
.refcount dd ?
.defaultbase dd ?
.coff_hdr dd ?
.symbols_ptr dd ?
.symbols_num dd ?
.symbols_lim dd ?
.exports dd ? ;export table
.name:
.sizeof:
}
struc HDLL
{
.fd dd ? ;next object in list
.bk dd ? ;prev object in list
.pid dd ? ;owner id
.base dd ? ;mapped base
.size dd ? ;mapped size
.refcount dd ? ;reference counter for this process and this lib
.parent dd ? ;DLLDESCR
.sizeof:
}
virtual at 0
DLLDESCR DLLDESCR
end virtual
virtual at 0
HDLL HDLL
end virtual
struc display_t
{
.x dd ?
.y dd ?
.width dd ?
.height dd ?
.bpp dd ?
.vrefresh dd ?
.pitch dd ?
.lfb dd ?
.modes dd ?
.ddev dd ?
.connector dd ?
.crtc dd ?
.cr_list.next dd ?
.cr_list.prev dd ?
.cursor dd ?
.init_cursor dd ?
.select_cursor dd ?
.show_cursor dd ?
.move_cursor dd ?
.restore_cursor dd ?
.disable_mouse dd ?
}
virtual at 0
display_t display_t
end virtual
struc HEAP_DATA struc HEAP_DATA
{ {
@ -595,18 +670,20 @@ struc PG_DATA
;} ;}
struc SRV struc SRV
{ .srv_name rb 16 ;ASCIIZ string {
.srv_name rb 16 ;ASCIIZ string
.magic dd ? ;+0x10 ;'SRV ' .magic dd ? ;+0x10 ;'SRV '
.size dd ? ;+0x14 ;size of structure SRV .size dd ? ;+0x14 ;size of structure SRV
.fd dd ? ;+0x18 ;next SRV descriptor .fd dd ? ;+0x18 ;next SRV descriptor
.bk dd ? ;+0x1C ;prev SRV descriptor .bk dd ? ;+0x1C ;prev SRV descriptor
.base dd ? ;+0x20 ;service base address .base dd ? ;+0x20 ;service base address
.entry dd ? ;+0x24 ;service START function .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:
} }
SRV_FD_OFFSET equ 0x18 SRV_FD_OFFSET equ 0x18
SRV_SIZE equ 44
DRV_ENTRY equ 1 DRV_ENTRY equ 1
DRV_EXIT equ -1 DRV_EXIT equ -1

View File

@ -12,59 +12,59 @@
$Revision$ $Revision$
iglobal
conf_path_sect: db 'path',0 conf_path_sect: db 'path',0
conf_fname db '/sys/sys.conf',0 conf_fname db '/sys/sys.conf',0
endg
; set soke kernel configuration ; set soke kernel configuration
proc set_kernel_conf proc set_kernel_conf
locals locals
par db 30 dup(?) par db 30 dup(?)
endl endl
pushad pushad
;[gui] ;[gui]
;mouse_speed ;mouse_speed
lea eax,[par] lea eax,[par]
push eax push eax
invoke ini.get_str,conf_fname, ugui, ugui_mouse_speed,\ invoke ini.get_str,conf_fname, ugui, ugui_mouse_speed,\
eax,30, ugui_mouse_speed_def eax,30, ugui_mouse_speed_def
pop eax pop eax
stdcall strtoint,eax stdcall strtoint,eax
mov [mouse_speed_factor], ax mov [mouse_speed_factor], ax
;mouse_delay ;mouse_delay
lea eax,[par] lea eax,[par]
push eax push eax
invoke ini.get_str,conf_fname, ugui, ugui_mouse_delay,\ invoke ini.get_str,conf_fname, ugui, ugui_mouse_delay,\
eax,30, ugui_mouse_delay_def eax,30, ugui_mouse_delay_def
pop eax pop eax
stdcall strtoint,eax stdcall strtoint,eax
mov [mouse_delay], eax mov [mouse_delay], eax
;midibase ;midibase
lea eax,[par] lea eax,[par]
push eax push eax
invoke ini.get_str,conf_fname, udev, udev_midibase, eax,30, udev_midibase_def invoke ini.get_str,conf_fname, udev, udev_midibase, eax,30, udev_midibase_def
pop eax pop eax
stdcall strtoint,eax stdcall strtoint,eax
cmp eax, 0x100 cmp eax, 0x100
jb @f jb @f
cmp eax, 0x10000 cmp eax, 0x10000
jae @f jae @f
mov [midi_base], ax mov [midi_base], ax
mov [mididp], eax mov [mididp], eax
inc eax inc eax
mov [midisp], eax mov [midisp], eax
@@: @@:
popad popad
ret ret
endp endp
iglobal
ugui db 'gui',0 ugui db 'gui',0
ugui_mouse_speed db 'mouse_speed',0 ugui_mouse_speed db 'mouse_speed',0
ugui_mouse_speed_def db '2',0 ugui_mouse_speed_def db '2',0
@ -74,8 +74,63 @@ ugui_mouse_delay_def db '0x00A',0
udev db 'dev',0 udev db 'dev',0
udev_midibase db 'midibase',0 udev_midibase db 'midibase',0
udev_midibase_def db '0x320',0 udev_midibase_def db '0x320',0
endg
;set up netvork configuration
proc set_network_conf
locals
par db 30 dup(?)
endl
pushad
;[net]
;active
lea eax,[par]
invoke ini.get_int,conf_fname, unet, unet_active, 0
or eax,eax
jz .do_not_set_net
mov eax, [stack_config]
and eax, 0xFFFFFF80
add eax, 3
mov [stack_config], eax
call ash_eth_enable
;addr
lea eax,[par]
push eax
invoke ini.get_str,conf_fname, unet, unet_addr, eax,30, unet_def
pop eax
stdcall do_inet_adr,eax
mov [stack_ip], eax
;mask
lea eax,[par]
push eax
invoke ini.get_str,conf_fname, unet, unet_mask, eax,30, unet_def
pop eax
stdcall do_inet_adr,eax
mov [subnet_mask], eax
;gate
lea eax,[par]
push eax
invoke ini.get_str,conf_fname, unet, unet_gate, eax,30, unet_def
pop eax
stdcall do_inet_adr,eax
mov [gateway_ip], eax
.do_not_set_net:
popad
ret
endp
iglobal
unet db 'net',0
unet_active db 'active',0
unet_addr db 'addr',0
unet_mask db 'mask',0
unet_gate db 'gate',0
unet_def db 0
endg
; convert string to DWord ; convert string to DWord
proc strtoint stdcall,strs proc strtoint stdcall,strs
pushad pushad
@ -184,15 +239,15 @@ proc strtoint_hex stdcall,strs
cmp al,'A' cmp al,'A'
jae .bb jae .bb
jmp .cc jmp .cc
.bm: ; 57h .bm: ; 57h
sub al,57h sub al,57h
jmp .do jmp .do
.bb: ; 37h .bb: ; 37h
sub al,37h sub al,37h
jmp .do jmp .do
.cc: ; 30h .cc: ; 30h
sub al,30h sub al,30h
.do: .do:

View File

@ -10,10 +10,12 @@ $Revision$
; diamond, 2006 ; diamond, 2006
sys_debug_services: sys_debug_services:
cmp eax, 9 cmp ebx, 9
ja @f ja @f
jmp dword [sys_debug_services_table+eax*4] jmp dword [sys_debug_services_table+ebx*4]
@@: ret @@: ret
iglobal
align 4
sys_debug_services_table: sys_debug_services_table:
dd debug_set_event_data dd debug_set_event_data
dd debug_getcontext dd debug_getcontext
@ -25,21 +27,21 @@ sys_debug_services_table:
dd debug_write_process_memory dd debug_write_process_memory
dd debug_terminate dd debug_terminate
dd debug_set_drx dd debug_set_drx
endg
debug_set_event_data: debug_set_event_data:
; in: ebx = pointer ; in: ecx = pointer
; destroys eax ; destroys eax
mov eax, [current_slot] mov eax, [current_slot]
mov [eax+APPDATA.dbg_event_mem], ebx mov [eax+APPDATA.dbg_event_mem], ecx
ret ret
get_debuggee_slot: get_debuggee_slot:
; in: ebx=PID ; in: ecx=PID
; out: CF=1 if error ; out: CF=1 if error
; CF=0 and eax=slot*0x20 if ok ; CF=0 and eax=slot*0x20 if ok
; out: interrupts disabled ; out: interrupts disabled
cli cli
mov eax, ebx mov eax, ecx
call pid_to_slot call pid_to_slot
test eax, eax test eax, eax
jz .ret_bad jz .ret_bad
@ -56,7 +58,7 @@ get_debuggee_slot:
ret ret
debug_detach: debug_detach:
; in: ebx=pid ; in: ecx=pid
; destroys eax,ebx ; destroys eax,ebx
call get_debuggee_slot call get_debuggee_slot
jc .ret jc .ret
@ -67,54 +69,55 @@ debug_detach:
ret ret
debug_terminate: debug_terminate:
; in: ebx=pid ; in: ecx=pid
call get_debuggee_slot call get_debuggee_slot
jc debug_detach.ret jc debug_detach.ret
mov ecx, eax mov ecx, eax
shr ecx, 5 shr ecx, 5
push 2 ; push 2
pop ebx ; pop ebx
jmp sys_system mov edx,esi
jmp sysfn_terminate
debug_suspend: debug_suspend:
; in: ebx=pid ; in: ecx=pid
; destroys eax,ebx ; destroys eax,ecx
cli cli
mov eax, ebx mov eax, ecx
call pid_to_slot call pid_to_slot
shl eax, 5 shl eax, 5
jz .ret jz .ret
mov bl, [CURRENT_TASK+eax+TASKDATA.state] ; process state mov cl, [CURRENT_TASK+eax+TASKDATA.state] ; process state
test bl, bl test cl, cl
jz .1 jz .1
cmp bl, 5 cmp cl, 5
jnz .ret jnz .ret
mov bl, 2 mov cl, 2
.2: mov [CURRENT_TASK+eax+TASKDATA.state], bl .2: mov [CURRENT_TASK+eax+TASKDATA.state], cl
.ret: .ret:
sti sti
ret ret
.1: .1:
inc ebx inc ecx
jmp .2 jmp .2
do_resume: do_resume:
mov bl, [CURRENT_TASK+eax+TASKDATA.state] mov cl, [CURRENT_TASK+eax+TASKDATA.state]
cmp bl, 1 cmp cl, 1
jz .1 jz .1
cmp bl, 2 cmp cl, 2
jnz .ret jnz .ret
mov bl, 5 mov cl, 5
.2: mov [CURRENT_TASK+eax+TASKDATA.state], bl .2: mov [CURRENT_TASK+eax+TASKDATA.state], cl
.ret: ret .ret: ret
.1: dec ebx .1: dec ecx
jmp .2 jmp .2
debug_resume: debug_resume:
; in: ebx=pid ; in: ecx=pid
; destroys eax,ebx ; destroys eax,ebx
cli cli
mov eax, ebx mov eax, ecx
call pid_to_slot call pid_to_slot
shl eax, 5 shl eax, 5
jz .ret jz .ret
@ -124,23 +127,24 @@ debug_resume:
debug_getcontext: debug_getcontext:
; in: ; in:
; ebx=pid ; ecx=pid
; ecx=sizeof(CONTEXT) ; edx=sizeof(CONTEXT)
; edx->CONTEXT ; esi->CONTEXT
; destroys eax,ecx,edx,esi,edi ; destroys eax,ecx,edx,esi,edi
cmp ecx, 28h cmp edx, 28h
jnz .ret jnz .ret
push ebx ; push ecx
mov ebx, edx ; mov ecx, esi
call check_region call check_region
pop ebx ; pop ecx
dec eax dec eax
jnz .ret jnz .ret
call get_debuggee_slot call get_debuggee_slot
jc .ret jc .ret
mov edi, esi
mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack] mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack]
lea esi, [eax+RING0_STACK_SIZE] lea esi, [eax+RING0_STACK_SIZE]
mov edi, edx
.ring0: .ring0:
; note that following code assumes that all interrupt/exception handlers ; note that following code assumes that all interrupt/exception handlers
; saves ring-3 context by pushad in this order ; saves ring-3 context by pushad in this order
@ -174,23 +178,24 @@ debug_getcontext:
debug_setcontext: debug_setcontext:
; in: ; in:
; ebx=pid ; ecx=pid
; ecx=sizeof(CONTEXT) ; edx=sizeof(CONTEXT)
; edx->CONTEXT ; esi->CONTEXT
; destroys eax,ecx,edx,esi,edi ; destroys eax,ecx,edx,esi,edi
cmp ecx, 28h cmp edx, 28h
jnz .ret jnz .ret
push ebx ; push ebx
mov ebx, edx ; mov ebx, edx
call check_region call check_region
pop ebx ; pop ebx
dec eax dec eax
jnz .ret jnz .ret
call get_debuggee_slot call get_debuggee_slot
jc .stiret jc .stiret
; mov esi, edx
mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack] mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack]
lea edi, [eax+RING0_STACK_SIZE] lea edi, [eax+RING0_STACK_SIZE]
mov esi, edx
.ring0: .ring0:
sub edi, 8+12+20h sub edi, 8+12+20h
mov eax, [esi+24h] ;edi mov eax, [esi+24h] ;edi
@ -227,67 +232,75 @@ debug_set_drx:
lea eax, [eax*8+SLOT_BASE+APPDATA.dbg_regs] lea eax, [eax*8+SLOT_BASE+APPDATA.dbg_regs]
; [eax]=dr0, [eax+4]=dr1, [eax+8]=dr2, [eax+C]=dr3 ; [eax]=dr0, [eax+4]=dr1, [eax+8]=dr2, [eax+C]=dr3
; [eax+10]=dr7 ; [eax+10]=dr7
cmp edx, OS_BASE cmp esi, OS_BASE
jae .errret jae .errret
cmp cl, 3 cmp dl, 3
ja .errret ja .errret
mov ebx, dr7 mov ecx, dr7
shr ebx, cl ;fix me
shr ebx, cl xchg ecx,edx
test ebx, 2 ; bit 1+2*index = G0..G3, global break enable shr edx, cl
shr edx, cl
xchg ecx,edx
test ecx, 2 ; bit 1+2*index = G0..G3, global break enable
jnz .errret2 jnz .errret2
test ch, ch test dh, dh
jns .new jns .new
; clear breakpoint ; clear breakpoint
movzx ecx, cl movzx edx, dl
add ecx, ecx add edx, edx
and dword [eax+ecx*2], 0 ; clear DR<i> and dword [eax+edx*2], 0 ; clear DR<i>
btr dword [eax+10h], ecx ; clear L<i> bit btr dword [eax+10h], edx ; clear L<i> bit
test byte [eax+10h], 55h test byte [eax+10h], 55h
jnz .okret jnz .okret
; imul eax, ebp, tss_step/32 ; imul eax, ebp, tss_step/32
; and byte [eax + tss_data + TSS._trap], not 1 ; and byte [eax + tss_data + TSS._trap], not 1
and [ebp*8 + SLOT_BASE+APPDATA.dbg_state], not 1 and [ebp*8 + SLOT_BASE+APPDATA.dbg_state], not 1
.okret: .okret:
and dword [esp+36], 0 and dword [esp+32], 0
sti sti
ret ret
.errret: .errret:
sti sti
mov dword [esp+36], 1 mov dword [esp+32], 1
ret ret
.errret2: .errret2:
sti sti
mov dword [esp+36], 2 mov dword [esp+32], 2
ret ret
.new: .new:
; add new breakpoint ; add new breakpoint
; cl=index; ch=flags; edx=address ; dl=index; dh=flags; esi=address
test ch, 0xF0 test dh, 0xF0
jnz .errret jnz .errret
mov bl, ch mov cl, dh
and bl, 3 and cl, 3
cmp bl, 2 cmp cl, 2
jz .errret jz .errret
mov bl, ch mov cl, dh
shr bl, 2 shr cl, 2
cmp bl, 2 cmp cl, 2
jz .errret jz .errret
test dl, bl
mov ebx,esi
test bl, dl
jnz .errret jnz .errret
or byte [eax+10h+1], 3 ; set GE and LE flags or byte [eax+10h+1], 3 ; set GE and LE flags
movzx ebx, ch
movzx ecx, cl movzx edx, dh
movzx ecx, dl
add ecx, ecx add ecx, ecx
bts dword [eax+10h], ecx ; set L<i> flag bts dword [eax+10h], ecx ; set L<i> flag
add ecx, ecx add ecx, ecx
mov [eax+ecx], edx ; set DR<i> mov [eax+ecx], ebx;esi ; set DR<i>
shl ebx, cl
mov edx, 0xF
shl edx, cl shl edx, cl
not edx mov ebx, 0xF
and [eax+10h+2], dx shl ebx, cl
or [eax+10h+2], bx ; set R/W and LEN fields not ebx
and [eax+10h+2], bx
or [eax+10h+2], dx ; set R/W and LEN fields
; imul eax, ebp, tss_step/32 ; imul eax, ebp, tss_step/32
; or byte [eax + tss_data + TSS._trap], 1 ; or byte [eax + tss_data + TSS._trap], 1
or [ebp*8 + SLOT_BASE+APPDATA.dbg_state], 1 or [ebp*8 + SLOT_BASE+APPDATA.dbg_state], 1
@ -295,51 +308,51 @@ debug_set_drx:
debug_read_process_memory: debug_read_process_memory:
; in: ; in:
; ebx=pid ; ecx=pid
; ecx=length ; edx=length
; esi->buffer in debugger ; edi->buffer in debugger
; edx=address in debuggee ; esi=address in debuggee
; out: [esp+36]=sizeof(read) ; out: [esp+36]=sizeof(read)
; destroys all ; destroys all
push ebx ; push ebx
mov ebx, esi ; mov ebx, esi
call check_region call check_region
pop ebx ; pop ebx
dec eax dec eax
jnz .err jnz .err
call get_debuggee_slot call get_debuggee_slot
jc .err jc .err
shr eax, 5 shr eax, 5
mov ebx, esi ; mov ebx, esi
call read_process_memory call read_process_memory
sti sti
mov dword [esp+36], eax mov dword [esp+32], eax
ret ret
.err: .err:
or dword [esp+36], -1 or dword [esp+32], -1
ret ret
debug_write_process_memory: debug_write_process_memory:
; in: ; in:
; ebx=pid ; ecx=pid
; ecx=length ; edx=length
; esi->buffer in debugger ; edi->buffer in debugger
; edx=address in debuggee ; esi=address in debuggee
; out: [esp+36]=sizeof(write) ; out: [esp+36]=sizeof(write)
; destroys all ; destroys all
push ebx ; push ebx
mov ebx, esi ; mov ebx, esi
call check_region call check_region
pop ebx ; pop ebx
dec eax dec eax
jnz debug_read_process_memory.err jnz debug_read_process_memory.err
call get_debuggee_slot call get_debuggee_slot
jc debug_read_process_memory.err jc debug_read_process_memory.err
shr eax, 5 shr eax, 5
mov ebx, esi ; mov ebx, esi
call write_process_memory call write_process_memory
sti sti
mov [esp+36], eax mov [esp+32], eax
ret ret
debugger_notify: debugger_notify:

View File

@ -1,6 +1,6 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -17,39 +17,39 @@ PID_KERNEL equ 1 ;os_idle thread
align 4 align 4
proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword
push ebx push ebx
mov ebx, [irq] ;irq num mov ebx, [irq] ;irq num
test ebx, ebx test ebx, ebx
jz .err jz .err
cmp ebx, 15 ; hidnplayr says: we only have 16 IRQ's cmp ebx, 15 ; hidnplayr says: we only have 16 IRQ's
ja .err ja .err
mov eax, [handler] mov eax, [handler]
test eax, eax test eax, eax
jz .err jz .err
cmp [irq_owner + 4 * ebx], 0 cmp [irq_owner + 4 * ebx], 0
je @f je @f
mov ecx, [irq_rights + 4 * ebx] ; Rights : 0 - full access, 1 - read only, 2 - forbidden mov ecx, [irq_rights + 4 * ebx] ; Rights : 0 - full access, 1 - read only, 2 - forbidden
test ecx, ecx test ecx, ecx
jnz .err jnz .err
@@: @@:
mov [irq_tab+ebx*4], eax mov [irq_tab+ebx*4], eax
mov eax, [access_rights] mov eax, [access_rights]
mov [irq_rights + 4 * ebx], eax mov [irq_rights + 4 * ebx], eax
mov [irq_owner + 4 * ebx], PID_KERNEL ; all handlers belong to a kernel mov [irq_owner + 4 * ebx], PID_KERNEL ; all handlers belong to a kernel
stdcall enable_irq, [irq] stdcall enable_irq, [irq]
pop ebx pop ebx
mov eax, 1 mov eax, 1
ret ret
.err: .err:
pop ebx pop ebx
xor eax, eax xor eax, eax
ret ret
endp endp
uglobal uglobal
@ -121,8 +121,8 @@ align 4
jmp .main jmp .main
; align 4 ; align 4
; .irq_6: ; .irq_6:
; push 6 ; push 6
; jmp .main ; jmp .main
align 4 align 4
.irq_7: .irq_7:
push 7 push 7
@ -149,16 +149,16 @@ align 4
jmp .main jmp .main
; align 4 ; align 4
; .irq_13: ; .irq_13:
; push 13 ; push 13
; jmp .main ; jmp .main
; align 4 ; align 4
; .irq_14: ; .irq_14:
; push 14 ; push 14
; jmp .main ; jmp .main
; align 4 ; align 4
; .irq_15: ; .irq_15:
; push 15 ; push 15
; jmp .main ; jmp .main
align 16 align 16
.main: .main:
@ -315,7 +315,7 @@ proc srv_handler stdcall, ioctl:dword
cmp [edi+SRV.magic], ' SRV' cmp [edi+SRV.magic], ' SRV'
jne .fail jne .fail
cmp [edi+SRV.size], SRV_SIZE cmp [edi+SRV.size], SRV.sizeof
jne .fail jne .fail
stdcall [edi+SRV.srv_proc], esi stdcall [edi+SRV.srv_proc], esi
@ -333,24 +333,24 @@ proc srv_handler stdcall, ioctl:dword
endp endp
; param ; param
; ebx= io_control ; ecx= io_control
; ;
; retval ; retval
; eax= error code ; eax= error code
align 4 align 4
srv_handlerEx: srv_handlerEx:
cmp ebx, OS_BASE cmp ecx, OS_BASE
jae .fail jae .fail
mov eax, [ebx+handle] mov eax, [ecx+handle]
cmp [eax+SRV.magic], ' SRV' cmp [eax+SRV.magic], ' SRV'
jne .fail jne .fail
cmp [eax+SRV.size], SRV_SIZE cmp [eax+SRV.size], SRV.sizeof
jne .fail jne .fail
stdcall [eax+SRV.srv_proc], ebx stdcall [eax+SRV.srv_proc], ecx
ret ret
.fail: .fail:
or eax, -1 or eax, -1
@ -394,7 +394,7 @@ proc reg_service stdcall, name:dword, handler:dword
push ebx push ebx
xor eax, eax xor eax, eax
cmp [name], eax cmp [name], eax
je .fail je .fail
@ -402,8 +402,8 @@ proc reg_service stdcall, name:dword, handler:dword
cmp [handler], eax cmp [handler], eax
je .fail je .fail
mov eax, SRV_SIZE mov eax, SRV.sizeof
call malloc ;call alloc_service call malloc
test eax, eax test eax, eax
jz .fail jz .fail
@ -411,13 +411,15 @@ proc reg_service stdcall, name:dword, handler:dword
push edi push edi
mov edi, eax mov edi, eax
mov esi, [name] mov esi, [name]
mov ecx, 16/4 movsd
rep movsd movsd
movsd
movsd
pop edi pop edi
pop esi pop esi
mov [eax+SRV.magic], ' SRV' mov [eax+SRV.magic], ' SRV'
mov [eax+SRV.size], SRV_SIZE mov [eax+SRV.size], SRV.sizeof
mov ebx, srv.fd-SRV_FD_OFFSET mov ebx, srv.fd-SRV_FD_OFFSET
mov edx, [ebx+SRV.fd] mov edx, [ebx+SRV.fd]
@ -432,7 +434,7 @@ proc reg_service stdcall, name:dword, handler:dword
ret ret
.fail: .fail:
xor eax, eax xor eax, eax
pop ebx pop ebx
ret ret
endp endp
@ -472,8 +474,8 @@ proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
xor eax, eax xor eax, eax
ret ret
.ok: .ok:
mov ebx, [pSym] mov eax, [pSym]
mov eax, [ebx+8] mov eax, [eax+8]
ret ret
endp endp
@ -611,7 +613,10 @@ proc load_file stdcall, file_name:dword
jz .cleanup jz .cleanup
mov [file2], eax mov [file2], eax
pushfd
cli
stdcall unpack, [file], eax stdcall unpack, [file], eax
popfd
stdcall kernel_free, [file] stdcall kernel_free, [file]
mov eax, [file2] mov eax, [file2]
mov ebx, [file_size] mov ebx, [file_size]
@ -676,7 +681,7 @@ proc get_proc_ex stdcall, proc_name:dword, imports:dword
endp endp
align 4 align 4
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\ proc fix_coff_symbols stdcall uses ebx esi, sec:dword, symbols:dword,\
sym_count:dword, strings:dword, imports:dword sym_count:dword, strings:dword, imports:dword
locals locals
retval dd ? retval dd ?
@ -738,7 +743,8 @@ proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
endp endp
align 4 align 4
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword proc fix_coff_relocs stdcall uses ebx esi, coff:dword, sym:dword, \
delta:dword
locals locals
n_sec dd ? n_sec dd ?
endl endl
@ -746,15 +752,15 @@ proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
mov eax, [coff] mov eax, [coff]
movzx ebx, [eax+CFH.nSections] movzx ebx, [eax+CFH.nSections]
mov [n_sec], ebx mov [n_sec], ebx
lea esi, [eax+20]
.fix_sec: .fix_sec:
mov esi, [sec]
mov edi, [esi+CFS.PtrReloc] mov edi, [esi+CFS.PtrReloc]
add edi, [coff] add edi, [coff]
movzx ecx, [esi+CFS.NumReloc] movzx ecx, [esi+CFS.NumReloc]
test ecx, ecx test ecx, ecx
jz .next jz .next
.next_reloc: .reloc_loop:
mov ebx, [edi+CRELOC.SymIndex] mov ebx, [edi+CRELOC.SymIndex]
add ebx,ebx add ebx,ebx
lea ebx,[ebx+ebx*8] lea ebx,[ebx+ebx*8]
@ -777,12 +783,51 @@ proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
mov eax, [edi+CRELOC.VirtualAddress] mov eax, [edi+CRELOC.VirtualAddress]
add eax, [esi+CFS.VirtualAddress] add eax, [esi+CFS.VirtualAddress]
.fix: .fix:
add eax, [delta]
add [eax], edx add [eax], edx
.next_reloc:
add edi, 10 add edi, 10
dec ecx dec ecx
jnz .next_reloc jnz .reloc_loop
.next: .next:
add [sec], COFF_SECTION_SIZE add esi, COFF_SECTION_SIZE
dec [n_sec]
jnz .fix_sec
.exit:
ret
endp
proc rebase_coff stdcall uses ebx esi, coff:dword, sym:dword, \
delta:dword
locals
n_sec dd ?
endl
mov eax, [coff]
movzx ebx, [eax+CFH.nSections]
mov [n_sec], ebx
lea esi, [eax+20]
mov edx, [delta]
.fix_sec:
mov edi, [esi+CFS.PtrReloc]
add edi, [coff]
movzx ecx, [esi+CFS.NumReloc]
test ecx, ecx
jz .next
.reloc_loop:
cmp [edi+CRELOC.Type], 6
jne .next_reloc
.dir_32:
mov eax, [edi+CRELOC.VirtualAddress]
add eax, [esi+CFS.VirtualAddress]
add [eax+edx], edx
.next_reloc:
add edi, 10
dec ecx
jnz .reloc_loop
.next:
add esi, COFF_SECTION_SIZE
dec [n_sec] dec [n_sec]
jnz .fix_sec jnz .fix_sec
.exit: .exit:
@ -811,7 +856,7 @@ proc load_driver stdcall, driver_name:dword
mov byte [edx+12], '/' mov byte [edx+12], '/'
mov esi, [driver_name] mov esi, [driver_name]
.redo: .redo:
lea edx, [file_name] lea edx, [file_name]
lea edi, [edx+13] lea edi, [edx+13]
mov ecx, 16 mov ecx, 16
@@: @@:
@ -900,10 +945,8 @@ proc load_driver stdcall, driver_name:dword
jz .link_fail jz .link_fail
mov ebx, [coff] mov ebx, [coff]
add ebx, 20 stdcall fix_coff_relocs, ebx, [sym], 0
stdcall fix_coff_relocs, [coff], ebx, [sym]
mov ebx, [coff]
stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
test eax, eax test eax, eax
jz .link_fail jz .link_fail
@ -928,14 +971,14 @@ proc load_driver stdcall, driver_name:dword
jnz .ok jnz .ok
stdcall kernel_free, [img_base] stdcall kernel_free, [img_base]
cmp dword [file_name+13], 'SOUN' cmp dword [file_name+13], 'SOUN'
jnz @f jnz @f
cmp dword [file_name+17], 'D.ob' cmp dword [file_name+17], 'D.ob'
jnz @f jnz @f
cmp word [file_name+21], 'j' cmp word [file_name+21], 'j'
jnz @f jnz @f
mov esi, aSis mov esi, aSis
jmp .redo jmp .redo
@@: @@:
xor eax, eax xor eax, eax
ret ret
@ -975,124 +1018,537 @@ proc load_driver stdcall, driver_name:dword
ret ret
endp endp
; in: edx -> COFF_SECTION struct
; out: eax = alignment as mask for bits to drop
coff_get_align:
; Rules:
; - if alignment is not given, use default = 4K;
; - if alignment is given and is no more than 4K, use it;
; - if alignment is more than 4K, revert to 4K.
push ecx
mov cl, byte [edx+CFS.Characteristics+2]
mov eax, 1
shr cl, 4
dec cl
js .default
cmp cl, 12
jbe @f
.default:
mov cl, 12
@@:
shl eax, cl
pop ecx
dec eax
ret
align 4 align 4
proc load_library stdcall, file_name:dword proc load_library stdcall, file_name:dword
locals locals
fullname rb 260
fileinfo rb 40
coff dd ? coff dd ?
sym dd ?
strings dd ?
img_size dd ?
img_base dd ? img_base dd ?
exports dd ?
endl endl
cli cli
stdcall load_file, [file_name] ; resolve file name
test eax, eax mov ebx, [file_name]
lea edi, [fullname+1]
mov byte [edi-1], '/'
stdcall get_full_file_name, edi, 259
test al, al
jz .fail jz .fail
; scan for required DLL in list of already loaded for this process,
; ignore timestamp
mov esi, [CURRENT_TASK]
shl esi, 8
lea edi, [fullname]
mov ebx, [esi+SLOT_BASE+APPDATA.dlls_list_ptr]
test ebx, ebx
jz .not_in_process
mov esi, [ebx+HDLL.fd]
.scan_in_process:
cmp esi, ebx
jz .not_in_process
mov eax, [esi+HDLL.parent]
add eax, DLLDESCR.name
stdcall strncmp, eax, edi, -1
test eax, eax
jnz .next_in_process
; simple variant: load DLL which is already loaded in this process
; just increment reference counters and return address of exports table
inc [esi+HDLL.refcount]
mov ecx, [esi+HDLL.parent]
inc [ecx+DLLDESCR.refcount]
mov eax, [ecx+DLLDESCR.exports]
sub eax, [ecx+DLLDESCR.defaultbase]
add eax, [esi+HDLL.base]
ret
.next_in_process:
mov esi, [esi+HDLL.fd]
jmp .scan_in_process
.not_in_process:
; scan in full list, compare timestamp
lea eax, [fileinfo]
stdcall get_fileinfo, edi, eax
test eax, eax
jnz .fail
mov esi, [dll_list.fd]
.scan_for_dlls:
cmp esi, dll_list
jz .load_new
lea eax, [esi+DLLDESCR.name]
stdcall strncmp, eax, edi, -1
test eax, eax
jnz .continue_scan
.test_prev_dll:
mov eax, dword [fileinfo+24] ; last modified time
mov edx, dword [fileinfo+28] ; last modified date
cmp dword [esi+DLLDESCR.timestamp], eax
jnz .continue_scan
cmp dword [esi+DLLDESCR.timestamp+4], edx
jz .dll_already_loaded
.continue_scan:
mov esi, [esi+DLLDESCR.fd]
jmp .scan_for_dlls
; new DLL
.load_new:
; load file
stdcall load_file, edi
test eax, eax
jz .fail
mov [coff], eax mov [coff], eax
movzx ecx, [eax+CFH.nSections] mov dword [fileinfo+32], ebx
; allocate DLLDESCR struct; size is DLLDESCR.sizeof plus size of DLL name
mov esi, edi
mov ecx, -1
xor eax, eax
repnz scasb
not ecx
lea eax, [ecx+DLLDESCR.sizeof]
push ecx
call malloc
pop ecx
test eax, eax
jz .fail_and_free_coff
; save timestamp
lea edi, [eax+DLLDESCR.name]
rep movsb
mov esi, eax
mov eax, dword [fileinfo+24]
mov dword [esi+DLLDESCR.timestamp], eax
mov eax, dword [fileinfo+28]
mov dword [esi+DLLDESCR.timestamp+4], eax
; initialize DLLDESCR struct
and dword [esi+DLLDESCR.refcount], 0 ; no HDLLs yet; later it will be incremented
mov [esi+DLLDESCR.fd], dll_list
mov eax, [dll_list.bk]
mov [dll_list.bk], esi
mov [esi+DLLDESCR.bk], eax
mov [eax+DLLDESCR.fd], esi
; calculate size of loaded DLL
mov edx, [coff]
movzx ecx, [edx+CFH.nSections]
xor ebx, ebx xor ebx, ebx
lea edx, [eax+20] add edx, 20
@@: @@:
call coff_get_align
add ebx, eax
not eax
and ebx, eax
add ebx, [edx+CFS.SizeOfRawData] add ebx, [edx+CFS.SizeOfRawData]
add ebx, 15
and ebx, not 15
add edx, COFF_SECTION_SIZE add edx, COFF_SECTION_SIZE
dec ecx dec ecx
jnz @B jnz @B
mov [img_size], ebx ; it must be nonzero and not too big
mov [esi+DLLDESCR.size], ebx
call init_heap test ebx, ebx
stdcall user_alloc, [img_size] jz .fail_and_free_dll
cmp ebx, MAX_DEFAULT_DLL_ADDR-MIN_DEFAULT_DLL_ADDR
ja .fail_and_free_dll
; allocate memory for kernel-side image
stdcall kernel_alloc, ebx
test eax, eax test eax, eax
jz .fail jz .fail_and_free_dll
mov [img_base], eax mov [esi+DLLDESCR.data], eax
; calculate preferred base address
add ebx, 0x1FFF
and ebx, not 0xFFF
mov ecx, [dll_cur_addr]
lea edx, [ecx+ebx]
cmp edx, MAX_DEFAULT_DLL_ADDR
jb @f
mov ecx, MIN_DEFAULT_DLL_ADDR
lea edx, [ecx+ebx]
@@:
mov [esi+DLLDESCR.defaultbase], ecx
mov [dll_cur_addr], edx
; copy sections and set correct values for VirtualAddress'es in headers
push esi
mov edx, [coff] mov edx, [coff]
movzx ebx, [edx+CFH.nSections] movzx ebx, [edx+CFH.nSections]
mov edi, [img_base] mov edi, eax
lea eax, [edx+20] add edx, 20
cld
@@: @@:
mov [eax+CFS.VirtualAddress], edi call coff_get_align
mov esi, [eax+CFS.PtrRawData] add ecx, eax
add edi, eax
not eax
and ecx, eax
and edi, eax
mov [edx+CFS.VirtualAddress], ecx
add ecx, [edx+CFS.SizeOfRawData]
mov esi, [edx+CFS.PtrRawData]
push ecx
mov ecx, [edx+CFS.SizeOfRawData]
test esi, esi test esi, esi
jnz .copy jnz .copy
add edi, [eax+CFS.SizeOfRawData] xor eax, eax
rep stosb
jmp .next jmp .next
.copy: .copy:
add esi, edx add esi, [coff]
mov ecx, [eax+CFS.SizeOfRawData]
cld
rep movsb rep movsb
.next: .next:
add edi, 15 ;-new_app_base pop ecx
and edi, -16 add edx, COFF_SECTION_SIZE
add eax, COFF_SECTION_SIZE
dec ebx dec ebx
jnz @B jnz @B
pop esi
; save some additional data from COFF file
; later we will use COFF header, headers for sections and symbol table
; and also relocations table for all sections
mov edx, [coff]
mov ebx, [edx+CFH.pSymTable] mov ebx, [edx+CFH.pSymTable]
mov edi, dword [fileinfo+32]
sub edi, ebx
jc .fail_and_free_data
mov [esi+DLLDESCR.symbols_lim], edi
add ebx, edx add ebx, edx
mov [sym], ebx movzx ecx, [edx+CFH.nSections]
lea ecx, [ecx*5]
lea edi, [edi+ecx*8+20]
add edx, 20
@@:
movzx eax, [edx+CFS.NumReloc]
lea eax, [eax*5]
lea edi, [edi+eax*2]
add edx, COFF_SECTION_SIZE
sub ecx, 5
jnz @b
stdcall kernel_alloc, edi
test eax, eax
jz .fail_and_free_data
mov edx, [coff]
movzx ecx, [edx+CFH.nSections]
lea ecx, [ecx*5]
lea ecx, [ecx*2+5]
mov [esi+DLLDESCR.coff_hdr], eax
push esi
mov esi, edx
mov edi, eax
rep movsd
pop esi
mov [esi+DLLDESCR.symbols_ptr], edi
push esi
mov ecx, [edx+CFH.nSymbols] mov ecx, [edx+CFH.nSymbols]
add ecx,ecx mov [esi+DLLDESCR.symbols_num], ecx
lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE mov ecx, [esi+DLLDESCR.symbols_lim]
add ecx, [sym] mov esi, ebx
mov [strings], ecx rep movsb
pop esi
mov ebx, [esi+DLLDESCR.coff_hdr]
push esi
movzx eax, [edx+CFH.nSections]
lea edx, [ebx+20]
@@:
movzx ecx, [edx+CFS.NumReloc]
lea ecx, [ecx*5]
mov esi, [edx+CFS.PtrReloc]
mov [edx+CFS.PtrReloc], edi
sub [edx+CFS.PtrReloc], ebx
add esi, [coff]
shr ecx, 1
rep movsd
adc ecx, ecx
rep movsw
add edx, COFF_SECTION_SIZE
dec eax
jnz @b
pop esi
lea eax, [edx+20] ; fixup symbols
mov edx, ebx
mov eax, [ebx+CFH.nSymbols]
add edx, 20
mov ecx, [esi+DLLDESCR.symbols_num]
lea ecx, [ecx*9]
add ecx, ecx
add ecx, [esi+DLLDESCR.symbols_ptr]
stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ stdcall fix_coff_symbols, edx, [esi+DLLDESCR.symbols_ptr], eax,\
[strings], dword 0 ecx, 0
; test eax, eax
; jnz @F
;
;@@:
stdcall get_coff_sym,[esi+DLLDESCR.symbols_ptr],[ebx+CFH.nSymbols],szEXPORTS
test eax, eax test eax, eax
jnz @F jnz @F
stdcall get_coff_sym,[esi+DLLDESCR.symbols_ptr],[ebx+CFH.nSymbols],sz_EXPORTS
@@: @@:
mov edx, [coff] mov [esi+DLLDESCR.exports], eax
movzx ebx, [edx+CFH.nSections]
mov edi, new_app_base
lea eax, [edx+20]
@@:
add [eax+CFS.VirtualAddress], edi ;patch user space offset
add eax, COFF_SECTION_SIZE
dec ebx
jnz @B
add edx, 20 ; fix relocs in the hidden copy in kernel memory to default address
stdcall fix_coff_relocs, [coff], edx, [sym] ; it is first fix; usually this will be enough, but second fix
; can be necessary if real load address will not equal assumption
mov eax, [esi+DLLDESCR.data]
sub eax, [esi+DLLDESCR.defaultbase]
stdcall fix_coff_relocs, ebx, [esi+DLLDESCR.symbols_ptr], eax
mov ebx, [coff]
stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
test eax, eax
jnz @F
mov ebx, [coff]
stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],sz_EXPORTS
@@:
mov [exports], eax
stdcall kernel_free, [coff] stdcall kernel_free, [coff]
mov eax, [exports]
.dll_already_loaded:
inc [esi+DLLDESCR.refcount]
push esi
call init_heap
pop esi
mov edi, [esi+DLLDESCR.size]
stdcall user_alloc_at, [esi+DLLDESCR.defaultbase], edi
test eax, eax
jnz @f
stdcall user_alloc, edi
test eax, eax
jz .fail_and_dereference
@@:
mov [img_base], eax
mov eax, HDLL.sizeof
call malloc
test eax, eax
jz .fail_and_free_user
mov ebx, [CURRENT_TASK]
shl ebx, 5
mov edx, [CURRENT_TASK+ebx+TASKDATA.pid]
mov [eax+HDLL.pid], edx
push eax
call init_dlls_in_thread
pop ebx
test eax, eax
jz .fail_and_free_user
mov edx, [eax+HDLL.fd]
mov [ebx+HDLL.fd], edx
mov [ebx+HDLL.bk], eax
mov [eax+HDLL.fd], ebx
mov [edx+HDLL.bk], ebx
mov eax, ebx
mov ebx, [img_base]
mov [eax+HDLL.base], ebx
mov [eax+HDLL.size], edi
mov [eax+HDLL.refcount], 1
mov [eax+HDLL.parent], esi
mov edx, ebx
shr edx, 12
or dword [page_tabs+(edx-1)*4], DONT_FREE_BLOCK
; copy entries of page table from kernel-side image to usermode
; use copy-on-write for user-mode image, so map as readonly
xor edi, edi
mov ecx, [esi+DLLDESCR.data]
shr ecx, 12
.map_pages_loop:
mov eax, [page_tabs+ecx*4]
and eax, not 0xFFF
or al, PG_USER
xchg eax, [page_tabs+edx*4]
test al, 1
jz @f
call free_page
@@:
invlpg [ebx+edi]
inc ecx
inc edx
add edi, 0x1000
cmp edi, [esi+DLLDESCR.size]
jb .map_pages_loop
; if real user-mode base is not equal to preferred base, relocate image
sub ebx, [esi+DLLDESCR.defaultbase]
jz @f
stdcall rebase_coff, [esi+DLLDESCR.coff_hdr], [esi+DLLDESCR.symbols_ptr], ebx
@@:
mov eax, [esi+DLLDESCR.exports]
sub eax, [esi+DLLDESCR.defaultbase]
add eax, [img_base]
ret ret
.fail_and_free_data:
stdcall kernel_free, [esi+DLLDESCR.data]
.fail_and_free_dll:
mov eax, esi
call free
.fail_and_free_coff:
stdcall kernel_free, [coff]
.fail: .fail:
xor eax, eax xor eax, eax
ret ret
.fail_and_free_user:
stdcall user_free, [img_base]
.fail_and_dereference:
mov eax, 1 ; delete 1 reference
call dereference_dll
xor eax, eax
ret
endp endp
align 4 ; initialize [APPDATA.dlls_list_ptr] for given thread
proc stop_all_services ; DLL is per-process object, so APPDATA.dlls_list_ptr must be
; kept in sync for all threads of one process.
; out: eax = APPDATA.dlls_list_ptr if all is OK,
; NULL if memory allocation failed
init_dlls_in_thread:
mov ebx, [current_slot]
mov eax, [ebx+APPDATA.dlls_list_ptr]
test eax, eax
jnz .ret
push [ebx+APPDATA.dir_table]
mov eax, 8
call malloc
pop edx
test eax, eax
jz .ret
mov [eax], eax
mov [eax+4], eax
mov ecx, [TASK_COUNT]
mov ebx, SLOT_BASE+256
.set:
cmp [ebx+APPDATA.dir_table], edx
jnz @f
mov [ebx+APPDATA.dlls_list_ptr], eax
@@:
add ebx, 256
dec ecx
jnz .set
.ret:
ret
; in: eax = number of references to delete, esi -> DLLDESCR struc
dereference_dll:
sub [esi+DLLDESCR.refcount], eax
jnz .ret
mov eax, [esi+DLLDESCR.fd]
mov edx, [esi+DLLDESCR.bk]
mov [eax+DLLDESCR.bk], edx
mov [edx+DLLDESCR.fd], eax
stdcall kernel_free, [esi+DLLDESCR.coff_hdr]
stdcall kernel_free, [esi+DLLDESCR.data]
mov eax, esi
call free
.ret:
ret
destroy_hdll:
push ebx ecx esi edi
push eax
mov ebx, [eax+HDLL.base]
mov esi, [eax+HDLL.parent]
mov edx, [esi+DLLDESCR.size]
; The following actions require the context of application where HDLL is mapped.
; However, destroy_hdll can be called in the context of OS thread when
; cleaning up objects created by the application which is destroyed.
; So remember current cr3 and set it to page table of target.
mov eax, [ecx+APPDATA.dir_table]
; Because we cheat with cr3, disable interrupts: task switch would restore
; page table from APPDATA of current thread.
; Also set [current_slot] because it is used by user_free.
pushf
cli
push [current_slot]
mov [current_slot], ecx
mov ecx, cr3
push ecx
mov cr3, eax
push ebx ; argument for user_free
mov eax, ebx
shr ebx, 12
push ebx
mov esi, [esi+DLLDESCR.data]
shr esi, 12
.unmap_loop:
push eax
mov eax, 2
xchg eax, [page_tabs+ebx*4]
mov ecx, [page_tabs+esi*4]
and eax, not 0xFFF
and ecx, not 0xFFF
cmp eax, ecx
jz @f
call free_page
@@:
pop eax
invlpg [eax]
add eax, 0x1000
inc ebx
inc esi
sub edx, 0x1000
ja .unmap_loop
pop ebx
and dword [page_tabs+(ebx-1)*4], not DONT_FREE_BLOCK
call user_free
; Restore context.
pop eax
mov cr3, eax
pop [current_slot]
popf
; Ok, cheating is done.
pop eax
push eax
mov esi, [eax+HDLL.parent]
mov eax, [eax+HDLL.refcount]
call dereference_dll
pop eax
mov edx, [eax+HDLL.bk]
mov ebx, [eax+HDLL.fd]
mov [ebx+HDLL.bk], edx
mov [edx+HDLL.fd], ebx
call free
pop edi esi ecx ebx
ret
; ecx -> APPDATA for slot, esi = dlls_list_ptr
destroy_all_hdlls:
test esi, esi
jz .ret
.loop:
mov eax, [esi+HDLL.fd]
cmp eax, esi
jz free
call destroy_hdll
jmp .loop
.ret:
ret
align 4
stop_all_services:
push ebp
mov edx, [srv.fd] mov edx, [srv.fd]
.next: .next:
cmp edx, srv.fd-SRV_FD_OFFSET cmp edx, srv.fd-SRV_FD_OFFSET
je .done je .done
cmp [edx+SRV.magic], ' SRV' cmp [edx+SRV.magic], ' SRV'
jne .next jne .next
cmp [edx+SRV.size], SRV_SIZE cmp [edx+SRV.size], SRV.sizeof
jne .next jne .next
mov ebx, [edx+SRV.entry] mov ebx, [edx+SRV.entry]
@ -1101,12 +1557,16 @@ proc stop_all_services
jz .next jz .next
push edx push edx
stdcall ebx, dword -1 mov ebp, esp
push 0
push -1
call ebx
mov esp, ebp
pop edx pop edx
jmp .next jmp .next
.done: .done:
pop ebp
ret ret
endp
; param ; param
; eax= size ; eax= size

View File

@ -9,78 +9,74 @@ $Revision$
iglobal iglobal
szKernel db 'KERNEL', 0 szKernel db 'KERNEL', 0
szVersion db 'version',0 szVersion db 'version',0
szRegService db 'RegService',0 szRegService db 'RegService',0
szGetService db 'GetService',0 szGetService db 'GetService',0
szServiceHandler db 'ServiceHandler',0 szServiceHandler db 'ServiceHandler',0
szAttachIntHandler db 'AttachIntHandler',0 szAttachIntHandler db 'AttachIntHandler',0
szGetIntHandler db 'GetIntHandler', 0 szGetIntHandler db 'GetIntHandler', 0
szFpuSave db 'FpuSave',0 szFpuSave db 'FpuSave',0
szFpuRestore db 'FpuRestore',0 szFpuRestore db 'FpuRestore',0
szReservePortArea db 'ReservePortArea',0 szReservePortArea db 'ReservePortArea',0
szBoot_Log db 'Boot_Log',0 szBoot_Log db 'Boot_Log',0
szPciApi db 'PciApi', 0 szPciApi db 'PciApi', 0
szPciRead32 db 'PciRead32', 0 szPciRead32 db 'PciRead32', 0
szPciRead16 db 'PciRead16', 0 szPciRead16 db 'PciRead16', 0
szPciRead8 db 'PciRead8', 0 szPciRead8 db 'PciRead8', 0
szPciWrite8 db 'PciWrite8',0 szPciWrite8 db 'PciWrite8',0
szPciWrite16 db 'PciWrite16',0 szPciWrite16 db 'PciWrite16',0
szPciWrite32 db 'PciWrite32',0 szPciWrite32 db 'PciWrite32',0
szAllocPage db 'AllocPage',0 szAllocPage db 'AllocPage',0
szAllocPages db 'AllocPages',0 szAllocPages db 'AllocPages',0
szFreePage db 'FreePage',0 szFreePage db 'FreePage',0
szGetPgAddr db 'GetPgAddr',0 szGetPgAddr db 'GetPgAddr',0
szMapPage db 'MapPage',0 szMapPage db 'MapPage',0
szMapSpace db 'MapSpace',0 szMapSpace db 'MapSpace',0
szMapIoMem db 'MapIoMem',0 szMapIoMem db 'MapIoMem',0
szCommitPages db 'CommitPages',0 szCommitPages db 'CommitPages',0
szReleasePages db 'ReleasePages',0 szReleasePages db 'ReleasePages',0
szAllocKernelSpace db 'AllocKernelSpace',0 szAllocKernelSpace db 'AllocKernelSpace',0
szFreeKernelSpace db 'FreeKernelSpace',0 szFreeKernelSpace db 'FreeKernelSpace',0
szKernelAlloc db 'KernelAlloc',0 szKernelAlloc db 'KernelAlloc',0
szKernelFree db 'KernelFree',0 szKernelFree db 'KernelFree',0
szUserAlloc db 'UserAlloc',0 szUserAlloc db 'UserAlloc',0
szUserFree db 'UserFree',0 szUserFree db 'UserFree',0
szKmalloc db 'Kmalloc',0 szKmalloc db 'Kmalloc',0
szKfree db 'Kfree',0 szKfree db 'Kfree',0
szCreateRingBuffer db 'CreateRingBuffer',0 szCreateRingBuffer db 'CreateRingBuffer',0
szGetPid db 'GetPid',0 szGetPid db 'GetPid',0
szCreateObject db 'CreateObject',0 szCreateObject db 'CreateObject',0
szDestroyObject db 'DestroyObject',0 szDestroyObject db 'DestroyObject',0
szCreateEvent db 'CreateEvent',0 szCreateEvent db 'CreateEvent',0
szRaiseEvent db 'RaiseEvent',0 szRaiseEvent db 'RaiseEvent',0
szWaitEvent db 'WaitEvent',0 szWaitEvent db 'WaitEvent',0
szDestroyEvent db 'DestroyEvent',0 szDestroyEvent db 'DestroyEvent',0
szClearEvent db 'ClearEvent',0 szClearEvent db 'ClearEvent',0
szLoadCursor db 'LoadCursor',0 szLoadCursor db 'LoadCursor',0
szSelectHwCursor db 'SelectHwCursor',0
szSetHwCursor db 'SetHwCursor',0
szHwCursorRestore db 'HwCursorRestore', 0
szHwCursorCreate db 'HwCursorCreate', 0
szSysMsgBoardStr db 'SysMsgBoardStr', 0 szSysMsgBoardStr db 'SysMsgBoardStr', 0
szSysMsgBoardChar db 'SysMsgBoardChar', 0 szSysMsgBoardChar db 'SysMsgBoardChar', 0
szGetCurrentTask db 'GetCurrentTask',0 szGetCurrentTask db 'GetCurrentTask',0
szLFBAddress db 'LFBAddress',0 szLFBAddress db 'LFBAddress',0
szLoadFile db 'LoadFile',0 szLoadFile db 'LoadFile',0
szSendEvent db 'SendEvent',0 szSendEvent db 'SendEvent',0
szSetMouseData db 'SetMouseData',0 szSetMouseData db 'SetMouseData',0
szSleep db 'Sleep',0 szSleep db 'Sleep',0
szGetTimerTicks db 'GetTimerTicks',0 szGetTimerTicks db 'GetTimerTicks',0
szStrncat db 'strncat',0 szStrncat db 'strncat',0
szStrncpy db 'strncpy',0 szStrncpy db 'strncpy',0
szstrncmp db 'strncmp',0 szstrncmp db 'strncmp',0
szStrnlen db 'strnlen',0 szStrnlen db 'strnlen',0
szStrchr db 'strchr',0 szStrchr db 'strchr',0
szStrrchr db 'strrchr',0 szStrrchr db 'strrchr',0
szEthReceiver db 'EthReceiver',0 szEthReceiver db 'EthReceiver',0
szEthRegDev db 'EthRegDev',0 szEthRegDev db 'EthRegDev',0
@ -95,12 +91,12 @@ kernel_export:
dd szServiceHandler , srv_handler dd szServiceHandler , srv_handler
dd szAttachIntHandler, attach_int_handler dd szAttachIntHandler, attach_int_handler
dd szGetIntHandler , get_int_handler dd szGetIntHandler , get_int_handler
dd szFpuSave , fpu_save dd szFpuSave , fpu_save
dd szFpuRestore , fpu_restore dd szFpuRestore , fpu_restore
dd szReservePortArea , r_f_port_area dd szReservePortArea , r_f_port_area
dd szBoot_Log , boot_log dd szBoot_Log , boot_log
dd szPciApi , pci_api dd szPciApi , pci_api
dd szPciRead32 , pci_read32 dd szPciRead32 , pci_read32
dd szPciRead16 , pci_read16 dd szPciRead16 , pci_read16
dd szPciRead8 , pci_read8 dd szPciRead8 , pci_read8
@ -108,57 +104,52 @@ kernel_export:
dd szPciWrite16 , pci_write16 dd szPciWrite16 , pci_write16
dd szPciWrite32 , pci_write32 dd szPciWrite32 , pci_write32
dd szAllocPage , alloc_page ;stdcall dd szAllocPage , alloc_page ;stdcall
dd szAllocPages , alloc_pages ;stdcall dd szAllocPages , alloc_pages ;stdcall
dd szFreePage , free_page dd szFreePage , free_page
dd szMapPage , map_page ;stdcall dd szMapPage , map_page ;stdcall
dd szMapSpace , map_space dd szMapSpace , map_space
dd szMapIoMem , map_io_mem ;stdcall dd szMapIoMem , map_io_mem ;stdcall
dd szGetPgAddr , get_pg_addr dd szGetPgAddr , get_pg_addr
dd szCommitPages , commit_pages ;not implemented dd szCommitPages , commit_pages ;not implemented
dd szReleasePages , release_pages dd szReleasePages , release_pages
dd szAllocKernelSpace, alloc_kernel_space ;stdcall dd szAllocKernelSpace, alloc_kernel_space ;stdcall
dd szFreeKernelSpace , free_kernel_space ;stdcall dd szFreeKernelSpace , free_kernel_space ;stdcall
dd szKernelAlloc , kernel_alloc ;stdcall dd szKernelAlloc , kernel_alloc ;stdcall
dd szKernelFree , kernel_free ;stdcall dd szKernelFree , kernel_free ;stdcall
dd szUserAlloc , user_alloc ;stdcall dd szUserAlloc , user_alloc ;stdcall
dd szUserFree , user_free ;stdcall dd szUserFree , user_free ;stdcall
dd szKmalloc , malloc dd szKmalloc , malloc
dd szKfree , free dd szKfree , free
dd szCreateRingBuffer, create_ring_buffer ;stdcall dd szCreateRingBuffer, create_ring_buffer ;stdcall
dd szGetPid , get_pid dd szGetPid , get_pid
dd szCreateObject , create_kernel_object dd szCreateObject , create_kernel_object
dd szDestroyObject , destroy_kernel_object dd szDestroyObject , destroy_kernel_object
dd szCreateEvent , create_event ;see EVENT.inc for specification dd szCreateEvent , create_event ;see EVENT.inc for specification
dd szRaiseEvent , raise_event ;see EVENT.inc for specification dd szRaiseEvent , raise_event ;see EVENT.inc for specification
dd szWaitEvent , wait_event ;see EVENT.inc for specification dd szWaitEvent , wait_event ;see EVENT.inc for specification
dd szDestroyEvent , destroy_event ;see EVENT.inc for specification dd szDestroyEvent , destroy_event ;see EVENT.inc for specification
dd szClearEvent , clear_event ;see EVENT.inc for specification dd szClearEvent , clear_event ;see EVENT.inc for specification
dd szLoadCursor , load_cursor ;stdcall dd szLoadCursor , load_cursor ;stdcall
dd szSelectHwCursor , select_hw_cursor ;import stdcall
dd szSetHwCursor , set_hw_cursor ;import stdcall
dd szHwCursorRestore , hw_restore ;import
dd szHwCursorCreate , create_cursor ;import
dd szSysMsgBoardStr , sys_msg_board_str dd szSysMsgBoardStr , sys_msg_board_str
dd szSysMsgBoardChar , sys_msg_board dd szSysMsgBoardChar , sys_msg_board
dd szGetCurrentTask , get_curr_task dd szGetCurrentTask , get_curr_task
dd szLoadFile , load_file ;retval eax, ebx dd szLoadFile , load_file ;retval eax, ebx
dd szSendEvent , send_event ;see EVENT.inc for specification dd szSendEvent , send_event ;see EVENT.inc for specification
dd szSetMouseData , set_mouse_data ;stdcall dd szSetMouseData , set_mouse_data ;stdcall
dd szSleep , delay_ms dd szSleep , delay_ms
dd szGetTimerTicks , get_timer_ticks dd szGetTimerTicks , get_timer_ticks
dd szStrncat , strncat dd szStrncat , strncat
dd szStrncpy , strncpy dd szStrncpy , strncpy
dd szstrncmp , strncmp dd szstrncmp , strncmp
dd szStrnlen , strnlen dd szStrnlen , strnlen
dd szStrchr , strchr dd szStrchr , strchr
dd szStrrchr , strrchr dd szStrrchr , strrchr
dd szEthReceiver , ETH_receiver dd szEthReceiver , ETH_receiver
dd szEthRegDev , ETH_add_device dd szEthRegDev , ETH_add_device
@ -167,6 +158,6 @@ kernel_export:
exp_lfb: exp_lfb:
dd szLFBAddress , 0 dd szLFBAddress , 0
dd 0 ;terminator, must be zero dd 0 ;terminator, must be zero
endg endg

View File

@ -13,7 +13,9 @@
$Revision$ $Revision$
if 0
; The code currently does not work. Kill "if 0/end if" only after correcting
; to current kernel (dll.inc).
macro library [name,fname] macro library [name,fname]
{ {
forward forward
@ -315,3 +317,4 @@ endp
uglobal uglobal
s_libname db 64 dup (0) s_libname db 64 dup (0)
endg endg
end if

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -20,6 +20,7 @@ $Revision$
; esi= nb ; esi= nb
; ebx= idx ; ebx= idx
; ;
align 16
malloc: malloc:
push esi push esi
@ -134,13 +135,17 @@ malloc:
mov [eax+12], ecx ; r->bk = B; mov [eax+12], ecx ; r->bk = B;
mov eax, ebx mov eax, ebx
pop esi pop esi
mov [mst.mutex], 0
ret ret
.small: .small:
; if (ms.treemap != 0 && (mem = malloc_small(nb)) != 0) ; if (ms.treemap != 0 && (mem = malloc_small(nb)) != 0)
;;;;;;;;;;; start a change <lrz>
cmp [mst.treemap], 0 mov eax,[mst.treemap]
je .from_top test eax,eax
;;;;;;;;;;; end the change <lrz>
; cmp [mst.treemap], 0
jz .from_top
mov eax, esi mov eax, esi
call malloc_small call malloc_small
test eax, eax test eax, eax
@ -196,7 +201,6 @@ malloc:
; param ; param
; eax= mem ; eax= mem
align 4
free: free:
push edi push edi
mov edi, eax mov edi, eax
@ -246,7 +250,7 @@ free:
shr ecx, 3 shr ecx, 3
cmp eax, edx cmp eax, edx
jne @F jne @F
and [mst.smallmap], ecx btr [mst.smallmap], ecx
@@: @@:
mov [eax+12], edx ;F->bk = B; mov [eax+12], edx ;F->bk = B;
mov [edx+8], eax ;B->fd = F mov [edx+8], eax ;B->fd = F
@ -383,7 +387,6 @@ free:
; ecx = chunk ; ecx = chunk
; eax = size ; eax = size
align 4
insert_chunk: insert_chunk:
cmp eax, 256 cmp eax, 256
@ -416,13 +419,11 @@ insert_chunk:
and [mst.mutex], 0 and [mst.mutex], 0
ret ret
align 4
; param ; param
; esi= chunk ; esi= chunk
; ebx= size ; ebx= size
align 4
insert_large_chunk: insert_large_chunk:
; I = compute_tree_index(S); ; I = compute_tree_index(S);
@ -475,7 +476,6 @@ insert_large_chunk:
shl eax, cl ;eax= K shl eax, cl ;eax= K
jmp .loop jmp .loop
.not_eq_size: .not_eq_size:
; C = &(T->child[(K >> 31) & 1]); ; C = &(T->child[(K >> 31) & 1]);
@ -517,7 +517,6 @@ insert_large_chunk:
mov [esi+8], eax mov [esi+8], eax
mov [esi+12], edx mov [esi+12], edx
ret ret
.insert_child: .insert_child:
; *C = X; ; *C = X;
@ -536,7 +535,6 @@ insert_large_chunk:
; param ; param
; edx= chunk ; edx= chunk
align 4
unlink_large_chunk: unlink_large_chunk:
mov eax, [edx+12] mov eax, [edx+12]
@ -593,17 +591,21 @@ unlink_large_chunk:
btr [mst.treemap], ecx btr [mst.treemap], ecx
pop edi pop edi
ret ret
.l3: .l3:
cmp [edi+16], edx cmp [edi+16], edx
jne @F jne @F
mov [edi+16], eax mov [edi+16], eax
jmp .l4 jmp .l4
@@: @@:
mov [edi+20], eax mov [edi+20], eax
.l4: .l4:
test eax, eax test eax, eax
je .done je .done
.l5: .l5:
mov [eax+24], edi mov [eax+24], edi
mov ecx, [edx+16] mov ecx, [edx+16]
@ -612,6 +614,7 @@ unlink_large_chunk:
mov [eax+16], ecx mov [eax+16], ecx
mov [ecx+24], eax mov [ecx+24], eax
.l6: .l6:
mov edx, [edx+20] mov edx, [edx+20]
test edx, edx test edx, edx
@ -619,6 +622,7 @@ unlink_large_chunk:
mov [eax+20], edx mov [eax+20], edx
mov [edx+24], eax mov [edx+24], eax
.done: .done:
pop edi pop edi
ret ret
@ -626,7 +630,6 @@ unlink_large_chunk:
; param ; param
; esi= nb ; esi= nb
align 4
malloc_small: malloc_small:
push ebp push ebp
mov ebp, esi mov ebp, esi
@ -641,8 +644,10 @@ malloc_small:
mov edi, [ecx+4] mov edi, [ecx+4]
and edi, -4 and edi, -4
sub edi, esi sub edi, esi
.loop: .loop:
mov ebx, ecx mov ebx, ecx
.loop_1: .loop_1:
; while ((t = leftmost_child(t)) != 0) ; while ((t = leftmost_child(t)) != 0)
@ -652,8 +657,10 @@ malloc_small:
jz @F jz @F
mov ecx, eax mov ecx, eax
jmp .l1 jmp .l1
@@: @@:
mov ecx, [ecx+20] mov ecx, [ecx+20]
.l1: .l1:
test ecx, ecx test ecx, ecx
jz .unlink jz .unlink
@ -704,6 +711,7 @@ malloc_small:
lea eax, [ebx+8] lea eax, [ebx+8]
ret ret
.split: .split:
; v->head = nb|PINUSE_BIT|CINUSE_BIT; ; v->head = nb|PINUSE_BIT|CINUSE_BIT;
@ -736,6 +744,7 @@ malloc_small:
pop ebp pop ebp
lea eax, [ebx+8] lea eax, [ebx+8]
ret ret
.large: .large:
lea eax, [ebx+8] lea eax, [ebx+8]
push eax push eax
@ -750,12 +759,12 @@ malloc_small:
; param ; param
; esi= nb ; esi= nb
align 4
malloc_large: malloc_large:
.idx equ esp+4 .idx equ esp+4
.rst equ esp .rst equ esp
push ebp push ebp
push esi
push edi push edi
sub esp, 8 sub esp, 8
; v = 0; ; v = 0;
@ -789,17 +798,20 @@ malloc_large:
jne @F jne @F
xor ecx, ecx xor ecx, ecx
jmp .l1 jmp .l1
@@: @@:
mov edx, ecx mov edx, ecx
shr edx, 1 shr edx, 1
mov ecx, 37 mov ecx, 37
sub ecx, edx sub ecx, edx
.l1: .l1:
mov edx, ebx mov edx, ebx
shl edx, cl shl edx, cl
; rst = 0; ; rst = 0;
mov [.rst], ebp mov [.rst], ebp
.loop: .loop:
; trem = (t->head & ~INUSE_BITS) - nb; ; trem = (t->head & ~INUSE_BITS) - nb;
@ -819,6 +831,7 @@ malloc_large:
mov ebp, eax mov ebp, eax
mov edi, ecx mov edi, ecx
je .l2 je .l2
@@: @@:
; rt = t->child[1]; ; rt = t->child[1];
@ -840,6 +853,7 @@ malloc_large:
; rst = rt; ; rst = rt;
mov [.rst], ecx mov [.rst], ecx
@@: @@:
; if (t == 0) ; if (t == 0)
@ -850,9 +864,11 @@ malloc_large:
add edx, edx add edx, edx
jmp .loop jmp .loop
@@: @@:
; t = rst; ; t = rst;
mov eax, [.rst] mov eax, [.rst]
.l2: .l2:
; if (t == 0 && v == 0) ; if (t == 0 && v == 0)
@ -861,6 +877,7 @@ malloc_large:
test ebp, ebp test ebp, ebp
jne .l7 jne .l7
mov ecx, [.idx] mov ecx, [.idx]
.l3: .l3:
; leftbits = (-1<<idx) & ms.treemap; ; leftbits = (-1<<idx) & ms.treemap;
@ -874,11 +891,13 @@ malloc_large:
bsf eax, edx bsf eax, edx
; t = ms.treebins[i]; ; t = ms.treebins[i];
mov eax, [mst.treebins+eax*4] mov eax, [mst.treebins+eax*4]
@@: @@:
; while (t != 0) ; while (t != 0)
test eax, eax test eax, eax
jz .l5 jz .l5
.l4: .l4:
; trem = (t->head & ~INUSE_BITS) - nb; ; trem = (t->head & ~INUSE_BITS) - nb;
@ -896,6 +915,7 @@ malloc_large:
mov edi, ecx mov edi, ecx
; v = t; ; v = t;
mov ebp, eax mov ebp, eax
@@: @@:
; t = leftmost_child(t); ; t = leftmost_child(t);
@ -905,20 +925,24 @@ malloc_large:
je @F je @F
mov eax, ecx mov eax, ecx
jmp .l6 jmp .l6
@@: @@:
mov eax, [eax+20] mov eax, [eax+20]
.l6: .l6:
; while (t != 0) ; while (t != 0)
test eax, eax test eax, eax
jne .l4 jne .l4
.l5: .l5:
; if (v != 0) ; if (v != 0)
test ebp, ebp test ebp, ebp
jz .done jz .done
.l7: .l7:
; r = chunk_plus_offset((mchunkptr)v, nb); ; r = chunk_plus_offset((mchunkptr)v, nb);
@ -947,8 +971,10 @@ malloc_large:
lea eax, [ebp+8] lea eax, [ebp+8]
add esp, 8 add esp, 8
pop edi pop edi
pop esi
pop ebp pop ebp
ret ret
.large: .large:
; v->head = nb|PINUSE_BIT|CINUSE_BIT; ; v->head = nb|PINUSE_BIT|CINUSE_BIT;
@ -971,16 +997,18 @@ malloc_large:
lea eax, [ebp+8] lea eax, [ebp+8]
add esp, 8 add esp, 8
pop edi pop edi
pop esi
pop ebp pop ebp
ret ret
.done: .done:
add esp, 8 add esp, 8
pop edi pop edi
pop esi
pop ebp pop ebp
xor eax, eax xor eax, eax
ret ret
align 4
init_malloc: init_malloc:
stdcall kernel_alloc, 0x40000 stdcall kernel_alloc, 0x40000
@ -989,6 +1017,7 @@ init_malloc:
mov [mst.topsize], 128*1024 mov [mst.topsize], 128*1024
mov dword [eax+4], (128*1024) or 1 mov dword [eax+4], (128*1024) or 1
mov eax, mst.smallbins mov eax, mst.smallbins
@@: @@:
mov [eax+8], eax mov [eax+8], eax
mov [eax+12], eax mov [eax+12], eax
@ -998,6 +1027,3 @@ init_malloc:
ret ret

File diff suppressed because it is too large Load Diff

View File

@ -280,6 +280,8 @@ L40:
__exports: __exports:
export 'KERNEL', \ export 'KERNEL', \
alloc_kernel_space, 'AllocKernelSpace', \ ; stdcall alloc_kernel_space, 'AllocKernelSpace', \ ; stdcall
alloc_page, 'AllocPage', \ ; gcc ABI
alloc_pages, 'AllocPages', \ ; stdcall
commit_pages, 'CommitPages', \ ; eax, ebx, ecx commit_pages, 'CommitPages', \ ; eax, ebx, ecx
create_kernel_object, 'CreateObject', \ create_kernel_object, 'CreateObject', \
create_ring_buffer, 'CreateRingBuffer', \ ; stdcall create_ring_buffer, 'CreateRingBuffer', \ ; stdcall
@ -287,17 +289,12 @@ __exports:
free_kernel_space, 'FreeKernelSpace', \ ; stdcall free_kernel_space, 'FreeKernelSpace', \ ; stdcall
kernel_alloc, 'KernelAlloc', \ ; stdcall kernel_alloc, 'KernelAlloc', \ ; stdcall
kernel_free, 'KernelFree', \ ; stdcall kernel_free, 'KernelFree', \ ; stdcall
alloc_pages, 'AllocPages', \ ; stdcall
malloc, 'Kmalloc', \ malloc, 'Kmalloc', \
free, 'Kfree', \ free, 'Kfree', \
map_io_mem, 'MapIoMem', \ ; stdcall map_io_mem, 'MapIoMem', \ ; stdcall
get_pg_addr, 'GetPgAddr', \ ; eax get_pg_addr, 'GetPgAddr', \ ; eax
\ \
select_hw_cursor, 'SelectHwCursor', \ ; stdcall get_display, 'GetDisplay', \
set_hw_cursor, 'SetHwCursor', \ ; stdcall
hw_restore, 'HwCursorRestore', \ ;
create_cursor, 'HwCursorCreate', \ ;
\
set_screen, 'SetScreen', \ set_screen, 'SetScreen', \
pci_api, 'PciApi', \ pci_api, 'PciApi', \
pci_read8, 'PciRead8', \ ; stdcall pci_read8, 'PciRead8', \ ; stdcall
@ -307,6 +304,7 @@ __exports:
pci_write16, 'PciWrite16', \ ; stdcall pci_write16, 'PciWrite16', \ ; stdcall
pci_write32, 'PciWrite32', \ ; stdcall pci_write32, 'PciWrite32', \ ; stdcall
\ \
get_service, 'GetService', \ ;
reg_service, 'RegService', \ ; stdcall reg_service, 'RegService', \ ; stdcall
attach_int_handler, 'AttachIntHandler', \ ; stdcall attach_int_handler, 'AttachIntHandler', \ ; stdcall
user_alloc, 'UserAlloc', \ ; stdcall user_alloc, 'UserAlloc', \ ; stdcall

View File

@ -162,21 +162,36 @@ do_change_task:
;scratched: eax,ecx,esi ;scratched: eax,ecx,esi
mov esi,ebx mov esi,ebx
xchg esi,[current_slot] xchg esi,[current_slot]
; set new stack after saving old ; set new stack after saving old
mov [esi+APPDATA.saved_esp], esp mov [esi+APPDATA.saved_esp], esp
mov esp, [ebx+APPDATA.saved_esp] mov esp, [ebx+APPDATA.saved_esp]
; set new thread io-map ; set new thread io-map
Mov dword [page_tabs+((tss._io_map_0 and -4096) shr 10)],eax,[ebx+APPDATA.io_map] Mov dword [page_tabs+((tss._io_map_0 and -4096) shr 10)],eax,[ebx+APPDATA.io_map]
Mov dword [page_tabs+((tss._io_map_1 and -4096) shr 10)],eax,[ebx+APPDATA.io_map+4] Mov dword [page_tabs+((tss._io_map_1 and -4096) shr 10)],eax,[ebx+APPDATA.io_map+4]
; set new thread memory-map ; set new thread memory-map
mov ecx, APPDATA.dir_table mov ecx, APPDATA.dir_table
mov eax, [ebx+ecx] ;offset>0x7F mov eax, [ebx+ecx] ;offset>0x7F
cmp eax, [esi+ecx] ;offset>0x7F cmp eax, [esi+ecx] ;offset>0x7F
je @f je @f
mov cr3, eax mov cr3, eax
@@: ; set tss.esp0 @@:
; set tss.esp0
Mov [tss._esp0],eax,[ebx+APPDATA.saved_esp0] Mov [tss._esp0],eax,[ebx+APPDATA.saved_esp0]
; set gs selector unconditionally
mov edx, [ebx+APPDATA.tls_base]
cmp edx, [esi+APPDATA.tls_base]
je @f
mov [tls_data_l+2],dx
shr edx,16
mov [tls_data_l+4],dl
mov [tls_data_l+7],dh
mov dx, app_tls
mov fs, dx
@@:
; set gs selector unconditionally
Mov gs,ax,graph_data Mov gs,ax,graph_data
; set CR0.TS ; set CR0.TS
cmp bh, byte[fpu_owner] ;bh == incoming task (new) cmp bh, byte[fpu_owner] ;bh == incoming task (new)
@ -211,6 +226,7 @@ struc TIMER
.arg dd ? .arg dd ?
} }
MAX_PROIRITY 0 ; highest, used for kernel tasks MAX_PROIRITY 0 ; highest, used for kernel tasks
MAX_USER_PRIORITY 0 ; highest priority for user processes MAX_USER_PRIORITY 0 ; highest priority for user processes
USER_PRIORITY 7 ; default (should correspond to nice 0) USER_PRIORITY 7 ; default (should correspond to nice 0)
@ -218,7 +234,9 @@ MIN_USER_PRIORITY 14 ; minimum priority for user processes
IDLE_PRIORITY 15 ; lowest, only IDLE process goes here IDLE_PRIORITY 15 ; lowest, only IDLE process goes here
NR_SCHED_QUEUES 16 ; MUST equal IDLE_PRIORYTY + 1 NR_SCHED_QUEUES 16 ; MUST equal IDLE_PRIORYTY + 1
uglobal
rdy_head rd 16 rdy_head rd 16
endg
align 4 align 4
pick_task: pick_task:

View File

@ -279,21 +279,26 @@ p_irq15:
iret iret
ready_for_next_irq: ready_for_next_irq:
mov [check_idle_semaphore],5 mov eax,5
mov al, 0x20 mov [check_idle_semaphore],eax
; mov al, 0x20
add eax,(0x20-0x5)
out 0x20, al out 0x20, al
ret ret
;destroy eax
ready_for_next_irq_1: ready_for_next_irq_1:
mov [check_idle_semaphore],5 mov eax,5
mov al, 0x20 mov [check_idle_semaphore],eax
; mov al, 0x20
add eax,(0x20-0x5)
out 0xa0,al out 0xa0,al
out 0x20, al out 0x20, al
ret ret
irqD: irqD:
push eax push eax
mov al,0 xor eax,eax
out 0xf0,al out 0xf0,al
mov al,0x20 mov al,0x20
out 0xa0,al out 0xa0,al
@ -396,37 +401,33 @@ clear_application_table_status:
cmp eax,[application_table_status] cmp eax,[application_table_status]
jne apptsl1 jne apptsl1
mov [application_table_status],0 xor eax,eax
mov [application_table_status],eax
apptsl1: apptsl1:
pop eax pop eax
ret ret
; * eax = 64 - íîìåð ôóíêöèè
; * ebx = 1 - åäèíñòâåííàÿ ïîäôóíêöèÿ
; * ecx = íîâûé ðàçìåð ïàìÿòè
;Âîçâðàùàåìîå çíà÷åíèå:
; * eax = 0 - óñïåøíî
; * eax = 1 - íåäîñòàòî÷íî ïàìÿòè
sys_resize_app_memory: sys_resize_app_memory:
; eax = 1 - resize ; ebx = 1 - resize
; ebx = new amount of memory ; ecx = new amount of memory
cmp eax,1
jne .no_application_mem_resize
stdcall new_mem_resize, ebx
mov [esp+36], eax
ret
; cmp eax,1
dec ebx
jnz .no_application_mem_resize
stdcall new_mem_resize, ecx
mov [esp+32], eax
.no_application_mem_resize: .no_application_mem_resize:
ret ret
sys_threads:
; eax=1 create thread
;
; ebx=thread start
; ecx=thread stack value
;
; on return : eax = pid
jmp new_sys_threads
iglobal iglobal
; process_terminating db 'K : Process - terminating',13,10,0 ; process_terminating db 'K : Process - terminating',13,10,0
; process_terminated db 'K : Process - done',13,10,0 ; process_terminated db 'K : Process - done',13,10,0
@ -497,10 +498,10 @@ term9:
pop esi pop esi
jmp @B jmp @B
@@: @@:
mov eax, [.slot] mov eax, [.slot]
shl eax, 8 shl eax, 8
mov eax,[SLOT_BASE+eax+APPDATA.dir_table] stdcall destroy_app_space, [SLOT_BASE+eax+APPDATA.dir_table], [SLOT_BASE+eax+APPDATA.dlls_list_ptr]
stdcall destroy_app_space, eax
mov esi, [.slot] mov esi, [.slot]
cmp [fpu_owner],esi ; if user fpu last -> fpu user = 1 cmp [fpu_owner],esi ; if user fpu last -> fpu user = 1
@ -586,13 +587,13 @@ term9:
shl esi,5 shl esi,5
add esi,window_data add esi,window_data
mov eax,[esi+WDATA.box.left] mov eax,[esi+WDATA.box.left]
mov [dlx],eax mov [draw_limits.left],eax
add eax,[esi+WDATA.box.width] add eax,[esi+WDATA.box.width]
mov [dlxe],eax mov [draw_limits.right],eax
mov eax,[esi+WDATA.box.top] mov eax,[esi+WDATA.box.top]
mov [dly],eax mov [draw_limits.top],eax
add eax,[esi+WDATA.box.height] add eax,[esi+WDATA.box.height]
mov [dlye],eax mov [draw_limits.bottom],eax
xor eax, eax xor eax, eax
mov [esi+WDATA.box.left],eax mov [esi+WDATA.box.left],eax
@ -641,12 +642,12 @@ term9:
add edi,SLOT_BASE add edi,SLOT_BASE
mov eax, [edi+APPDATA.io_map] mov eax, [edi+APPDATA.io_map]
cmp eax, (tss._io_map_0-OS_BASE+PG_MAP) cmp eax, [SLOT_BASE+256+APPDATA.io_map]
je @F je @F
call free_page call free_page
@@: @@:
mov eax, [edi+APPDATA.io_map+4] mov eax, [edi+APPDATA.io_map+4]
cmp eax, (tss._io_map_1-OS_BASE+PG_MAP) cmp eax, [SLOT_BASE+256+APPDATA.io_map+4]
je @F je @F
call free_page call free_page
@@: @@:
@ -689,22 +690,22 @@ term9:
cmp [hd1_status], esi cmp [hd1_status], esi
jnz @f jnz @f
call free_hd_channel call free_hd_channel
mov [hd1_status], 0 and [hd1_status], 0
@@: @@:
cmp [cd_status], esi cmp [cd_status], esi
jnz @f jnz @f
call free_cd_channel call free_cd_channel
mov [cd_status], 0 and [cd_status], 0
@@: @@:
cmp [flp_status], esi cmp [flp_status], esi
jnz @f jnz @f
mov [flp_status], 0 and [flp_status], 0
@@: @@:
pop esi pop esi
cmp [bgrlockpid], esi cmp [bgrlockpid], esi
jnz @f jnz @f
and [bgrlockpid], 0 and [bgrlockpid], 0
mov [bgrlock], 0 and [bgrlock], 0
@@: @@:
pusha ; remove all irq reservations pusha ; remove all irq reservations
@ -736,8 +737,8 @@ term9:
mov esi,[RESERVED_PORTS] mov esi,[RESERVED_PORTS]
cmp esi,0 test esi,esi
je rmpr9 jz rmpr9
rmpr3: rmpr3:
@ -796,10 +797,10 @@ term9:
; call systest ; call systest
sti ; .. and life goes on sti ; .. and life goes on
mov eax, [dlx] mov eax, [draw_limits.left]
mov ebx, [dly] mov ebx, [draw_limits.top]
mov ecx, [dlxe] mov ecx, [draw_limits.right]
mov edx, [dlye] mov edx, [draw_limits.bottom]
call calculatescreen call calculatescreen
xor eax, eax xor eax, eax
xor esi, esi xor esi, esi
@ -808,7 +809,7 @@ term9:
mov [MOUSE_BACKGROUND],byte 0 ; no mouse background mov [MOUSE_BACKGROUND],byte 0 ; no mouse background
mov [DONT_DRAW_MOUSE],byte 0 ; draw mouse mov [DONT_DRAW_MOUSE],byte 0 ; draw mouse
mov [application_table_status],0 and [application_table_status],0
;mov esi,process_terminated ;mov esi,process_terminated
;call sys_msg_board_str ;call sys_msg_board_str
add esp, 4 add esp, 4

View File

@ -20,7 +20,6 @@ cross_order:
call dword [servetable+edi*4] call dword [servetable+edi*4]
ret ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; SYSENTER ENTRY ;; ;; SYSENTER ENTRY ;;
@ -123,59 +122,57 @@ iglobal
dd 0 dd 0
dd 0 dd 0
dd 0 dd 0
dd sys_midi ; 20-ResetMidi and OutputMidi
dd sys_setup ; 21-SetMidiBase,SetKeymap,SetShiftKeymap,.
dd sys_settime ; 22-setting date,time,clock and alarm-clock
dd 0
dd syscall_cdaudio ; 24-PlayCdTrack,StopCd and GetCdPlaylist
dd 0 ;
dd sys_getsetup ; 26-GetMidiBase,GetKeymap,GetShiftKeymap,.
dd 0
dd 0 ;
dd 0
dd sys_current_directory ; 30-Get/SetCurrentDirectory
dd 0 dd 0
dd 0 dd 0
dd 0 dd 0
dd 0 dd 0
dd 0 dd 0
dd 0 dd 0
dd readmousepos ; 37-GetMousePosition_ScreenRelative,.
dd 0 ; 38-DrawLine
dd sys_getbackground ; 39-GetBackgroundSize,ReadBgrData,.
dd 0 dd 0
dd 0 dd 0
dd 0 dd 0
dd sys_outport ; 43-SendDeviceData
dd 0
dd 0
dd syscall_reserveportarea ; 46-ReservePortArea and FreePortArea
dd display_number ; 47-WriteNum
dd display_settings ; 48-SetRedrawType and SetButtonType
dd sys_apm ; 49-Advanced Power Management (APM)
dd random_shaped_window ; 50-Window shape & scale
dd syscall_threads ; 51-Threads
dd 0 dd 0
dd 0 dd 0
dd 0 dd 0
dd sound_interface ; 55-Sound interface
dd 0 dd 0
dd sys_pcibios ; 57-PCI BIOS32
dd file_system ; 58-Common file system interface
dd 0 dd 0
dd sys_IPC ; 60-Inter Process Communication dd 0
dd sys_gs ; 61-Direct graphics access dd 0
dd sys_pci ; 62-PCI functions dd 0
dd sys_msg_board ; 63-System message board dd 0
dd sys_resize_app_memory ; 64-Resize application memory usage dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd sound_interface ; 55-Sound interface
dd 0
dd 0
dd file_system ; 58-Common file system interface
dd 0
dd sys_IPC ; 60-Inter Process Communication
dd sys_gs ; 61-Direct graphics access
dd sys_pci ; 62-PCI functions
dd sys_msg_board ; 63-System message board
dd 0
dd syscall_putimage_palette; 65-PutImagePalette dd syscall_putimage_palette; 65-PutImagePalette
dd sys_process_def ; 66-Process definitions - keyboard dd sys_process_def ; 66-Process definitions - keyboard
dd sys_window_move ; 67-Window move or resize dd sys_window_move ; 67-Window move or resize
dd f68 ; 68-Some internal services dd 0
dd sys_debug_services ; 69-Debug dd 0
dd file_system_lfn ; 70-Common file system interface, version 2 dd file_system_lfn ; 70-Common file system interface, version 2
dd syscall_windowsettings ; 71-Window settings
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; NEW SYSTEM FUNCTIONS TABLE ;; ;; NEW SYSTEM FUNCTIONS TABLE ;;
@ -183,83 +180,83 @@ iglobal
align 4 align 4
servetable2: servetable2:
dd sys_drawwindow ; 0-DrawWindow dd sys_drawwindow ; 0-DrawWindow
dd syscall_setpixel ; 1-SetPixel dd syscall_setpixel ; 1-SetPixel
dd sys_getkey ; 2-GetKey dd sys_getkey ; 2-GetKey
dd sys_clock ; 3-GetTime dd sys_clock ; 3-GetTime
dd syscall_writetext ; 4-WriteText dd syscall_writetext ; 4-WriteText
dd delay_hs ; 5-DelayHs dd delay_hs ; 5-DelayHs
dd syscall_openramdiskfile ; 6-OpenRamdiskFile dd syscall_openramdiskfile ; 6-OpenRamdiskFile
dd syscall_putimage ; 7-PutImage dd syscall_putimage ; 7-PutImage
dd sys_button ; 8-DefineButton dd syscall_button ; 8-DefineButton
dd sys_cpuusage ; 9-GetProcessInfo dd sys_cpuusage ; 9-GetProcessInfo
dd sys_waitforevent ; 10-WaitForEvent dd sys_waitforevent ; 10-WaitForEvent
dd sys_getevent ; 11-CheckForEvent dd sys_getevent ; 11-CheckForEvent
dd sys_redrawstat ; 12-BeginDraw and EndDraw dd sys_redrawstat ; 12-BeginDraw and EndDraw
dd syscall_drawrect ; 13-DrawRect dd syscall_drawrect ; 13-DrawRect
dd syscall_getscreensize ; 14-GetScreenSize dd syscall_getscreensize ; 14-GetScreenSize
dd sys_background ; 15-bgr dd sys_background ; 15-bgr
dd sys_cachetodiskette ; 16-FlushFloppyCache dd sys_cachetodiskette ; 16-FlushFloppyCache
dd sys_getbutton ; 17-GetButton dd sys_getbutton ; 17-GetButton
dd sys_system ; 18-System Services dd sys_system ; 18-System Services
dd paleholder ; 19-reserved dd paleholder ; 19-reserved
dd cross_order ; 20-ResetMidi and OutputMidi dd sys_midi ; 20-ResetMidi and OutputMidi
dd cross_order ; 21-SetMidiBase,SetKeymap,SetShiftKeymap,. dd sys_setup ; 21-SetMidiBase,SetKeymap,SetShiftKeymap,.
dd cross_order ; 22-setting date,time,clock and alarm-clock dd sys_settime ; 22-setting date,time,clock and alarm-clock
dd sys_wait_event_timeout ; 23-TimeOutWaitForEvent dd sys_wait_event_timeout ; 23-TimeOutWaitForEvent
dd cross_order ; 24-PlayCdTrack,StopCd and GetCdPlaylist dd syscall_cdaudio ; 24-PlayCdTrack,StopCd and GetCdPlaylist
dd undefined_syscall ; 25-reserved dd undefined_syscall ; 25-reserved
dd cross_order ; 26-GetMidiBase,GetKeymap,GetShiftKeymap,. dd sys_getsetup ; 26-GetMidiBase,GetKeymap,GetShiftKeymap,.
dd undefined_syscall ; 27-reserved dd undefined_syscall ; 27-reserved
dd undefined_syscall ; 28-reserved dd undefined_syscall ; 28-reserved
dd sys_date ; 29-GetDate dd sys_date ; 29-GetDate
dd cross_order ; 30-Get/SetCurrentDirectory dd sys_current_directory ; 30-Get/SetCurrentDirectory
dd undefined_syscall ; 31-reserved dd undefined_syscall ; 31-reserved
dd undefined_syscall ; 32-reserved dd undefined_syscall ; 32-reserved
dd undefined_syscall ; 33-reserved dd undefined_syscall ; 33-reserved
dd undefined_syscall ; 34-reserved dd undefined_syscall ; 34-reserved
dd syscall_getpixel ; 35-GetPixel dd syscall_getpixel ; 35-GetPixel
dd syscall_getarea ; 36-GetArea dd syscall_getarea ; 36-GetArea
dd cross_order ; 37-GetMousePosition_ScreenRelative,. dd readmousepos ; 37-GetMousePosition_ScreenRelative,.
dd syscall_drawline ; 38-DrawLine dd syscall_drawline ; 38-DrawLine
dd cross_order ; 39-GetBackgroundSize,ReadBgrData,. dd sys_getbackground ; 39-GetBackgroundSize,ReadBgrData,.
dd set_app_param ; 40-WantEvents dd set_app_param ; 40-WantEvents
dd syscall_getirqowner ; 41-GetIrqOwner dd syscall_getirqowner ; 41-GetIrqOwner
dd get_irq_data ; 42-ReadIrqData dd get_irq_data ; 42-ReadIrqData
dd cross_order ; 43-SendDeviceData dd sys_outport ; 43-SendDeviceData
dd sys_programirq ; 44-ProgramIrqs dd sys_programirq ; 44-ProgramIrqs
dd reserve_free_irq ; 45-ReserveIrq and FreeIrq dd reserve_free_irq ; 45-ReserveIrq and FreeIrq
dd cross_order ; 46-ReservePortArea and FreePortArea dd syscall_reserveportarea ; 46-ReservePortArea and FreePortArea
dd cross_order ; 47-WriteNum dd display_number ; 47-WriteNum
dd cross_order ; 48-SetRedrawType and SetButtonType dd syscall_display_settings ; 48-SetRedrawType and SetButtonType
dd cross_order ; 49-Advanced Power Management (APM) dd sys_apm ; 49-Advanced Power Management (APM)
dd cross_order ; 50-Window shape & scale dd syscall_set_window_shape ; 50-Window shape & scale
dd cross_order ; 51-Threads dd syscall_threads ; 51-Threads
dd cross_order ; 52-Stack driver status dd undefined_syscall ; 52-Stack driver status
dd cross_order ; 53-Socket interface dd undefined_syscall ; 53-Socket interface
dd undefined_syscall ; 54-reserved dd undefined_syscall ; 54-reserved
dd cross_order ; 55-Sound interface dd cross_order ; 55-Sound interface
dd undefined_syscall ; 56-reserved dd undefined_syscall ; 56-reserved
dd cross_order ; 57-PCI BIOS32 dd sys_pcibios ; 57-PCI BIOS32
dd cross_order ; 58-Common file system interface dd cross_order ; 58-Common file system interface
dd undefined_syscall ; 59-reserved dd undefined_syscall ; 59-reserved
dd cross_order ; 60-Inter Process Communication dd cross_order ; 60-Inter Process Communication
dd cross_order ; 61-Direct graphics access dd cross_order ; 61-Direct graphics access
dd cross_order ; 62-PCI functions dd cross_order ; 62-PCI functions
dd cross_order ; 63-System message board dd cross_order ; 63-System message board
dd cross_order ; 64-Resize application memory usage dd sys_resize_app_memory ; 64-Resize application memory usage
dd cross_order ; 65-PutImagePalette dd cross_order ; 65-PutImagePalette
dd cross_order ; 66-Process definitions - keyboard dd cross_order ; 66-Process definitions - keyboard
dd cross_order ; 67-Window move or resize dd cross_order ; 67-Window move or resize
dd cross_order ; 68-Some internal services dd f68 ; 68-Some internal services
dd cross_order ; 69-Debug dd sys_debug_services ; 69-Debug
dd cross_order ; 70-Common file system interface, version 2 dd cross_order ; 70-Common file system interface, version 2
dd cross_order ; 71-Window settings dd syscall_windowsettings ; 71-Window settings
dd sys_sendwindowmsg ; 72-Send window message dd sys_sendwindowmsg ; 72-Send window message
dd sys_network ; 73-Network stack dd sys_network ; 73-Network stack
dd sys_socket ; 74-Sockets dd sys_socket ; 74-Sockets
dd sys_protocols ; 75-Protocols dd sys_protocols ; 75-Protocols
times 255 - ( ($-servetable2) /4 ) dd undefined_syscall times 255 - ( ($-servetable2) /4 ) dd undefined_syscall
dd sys_end ; -1-end application dd sys_end ; -1-end application
endg endg

View File

@ -113,6 +113,7 @@ proc fs_execute
popad popad
mov eax, -ERROR_FILE_NOT_FOUND mov eax, -ERROR_FILE_NOT_FOUND
ret ret
.namecopied: .namecopied:
mov [cmdline], ebx mov [cmdline], ebx
@ -150,8 +151,8 @@ proc fs_execute
.get_lock: .get_lock:
mov eax, 1 mov eax, 1
xchg eax, [application_table_status] xchg eax, [application_table_status]
cmp eax, 0 test eax, eax
jne .wait_lock jnz .wait_lock
call set_application_table_status call set_application_table_status
@ -201,6 +202,14 @@ proc fs_execute
mov eax,[hdr_mem] mov eax,[hdr_mem]
mov [ebx+APPDATA.mem_size],eax mov [ebx+APPDATA.mem_size],eax
xor edx, edx
cmp word [6], '02'
jne @f
not edx
@@:
mov [ebx+APPDATA.tls_base],edx
if GREEDY_KERNEL if GREEDY_KERNEL
else else
mov ecx, [hdr_mem] mov ecx, [hdr_mem]
@ -211,7 +220,7 @@ else
jna @F jna @F
xor eax, eax xor eax, eax
cld cld
rep stosb rep stosb
@@: @@:
end if end if
@ -262,26 +271,28 @@ test_app_header:
jne .check_01_header jne .check_01_header
mov ecx,[APP_HEADER_00.start] mov ecx,[APP_HEADER_00.start]
mov [ebx+0x08], ecx ;app_eip mov [ebx+0x08], ecx ;app_eip
mov edx,[APP_HEADER_00.mem_size] mov edx,[APP_HEADER_00.mem_size]
mov [ebx+0x10], edx ;app_mem mov [ebx+0x10], edx ;app_mem
shr edx,1 shr edx,1
sub edx,0x10 sub edx,0x10
mov [ebx+0x0C], edx ;app_esp mov [ebx+0x0C], edx ;app_esp
mov ecx,[APP_HEADER_00.i_param] mov ecx,[APP_HEADER_00.i_param]
mov [ebx], ecx ;app_cmdline mov [ebx], ecx ;app_cmdline
mov [ebx+4], dword 0 ;app_path mov [ebx+4], dword 0 ;app_path
mov edx, [APP_HEADER_00.i_end] mov edx, [APP_HEADER_00.i_end]
mov [ebx+0x14], edx mov [ebx+0x14], edx
ret ret
.check_01_header: .check_01_header:
cmp [eax+6],word '01' cmp [eax+6], word '01'
jne .fail je @f
cmp [eax+6], word '02'
jne .fail
@@:
mov ecx,[APP_HEADER_01.start] mov ecx,[APP_HEADER_01.start]
mov [ebx+0x08], ecx ;app_eip mov [ebx+0x08], ecx ;app_eip
mov edx,[APP_HEADER_01.mem_size] mov edx,[APP_HEADER_01.mem_size]
; \begin{diamond}[20.08.2006] ; \begin{diamond}[20.08.2006]
@ -291,13 +302,13 @@ test_app_header:
jb .fail jb .fail
; \end{diamond}[20.08.2006] ; \end{diamond}[20.08.2006]
mov [ebx+0x10], edx ;app_mem mov [ebx+0x10], edx ;app_mem
mov ecx,[APP_HEADER_01.stack_top] mov ecx,[APP_HEADER_01.stack_top]
mov [ebx+0x0C], ecx ;app_esp mov [ebx+0x0C], ecx ;app_esp
mov edx,[APP_HEADER_01.i_param] mov edx,[APP_HEADER_01.i_param]
mov [ebx], edx ;app_cmdline mov [ebx], edx ;app_cmdline
mov ecx,[APP_HEADER_01.i_icon] mov ecx,[APP_HEADER_01.i_icon]
mov [ebx+4], ecx ;app_path mov [ebx+4], ecx ;app_path
mov edx, [APP_HEADER_01.i_end] mov edx, [APP_HEADER_01.i_end]
mov [ebx+0x14], edx mov [ebx+0x14], edx
ret ret
@ -451,7 +462,7 @@ proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
if GREEDY_KERNEL if GREEDY_KERNEL
mov eax, 0x02 mov eax, 0x02
rep stosd rep stosd
else else
.alloc: .alloc:
@ -475,7 +486,7 @@ end if
dec [pg_data.pg_mutex] dec [pg_data.pg_mutex]
cmp [dir_addr], 0 cmp [dir_addr], 0
je @f je @f
stdcall destroy_app_space, [dir_addr] stdcall destroy_app_space, [dir_addr], 0
@@: @@:
xor eax, eax xor eax, eax
ret ret
@ -512,12 +523,10 @@ proc destroy_page_table stdcall, pg_tab:dword
endp endp
align 4 align 4
proc destroy_app_space stdcall, pg_dir:dword proc destroy_app_space stdcall, pg_dir:dword, dlls_list:dword
mov ebx, pg_data.pg_mutex
call wait_mutex ;ebx
xor edx,edx xor edx,edx
push edx
mov eax,0x2 mov eax,0x2
mov ebx, [pg_dir] mov ebx, [pg_dir]
.loop: .loop:
@ -527,8 +536,10 @@ proc destroy_app_space stdcall, pg_dir:dword
cmp byte [CURRENT_TASK+ecx+0xa],9 ;if process running? cmp byte [CURRENT_TASK+ecx+0xa],9 ;if process running?
jz @f ;skip empty slots jz @f ;skip empty slots
shl ecx,3 shl ecx,3
cmp [SLOT_BASE+ecx+0xB8],ebx ;compare page directory addresses add ecx,SLOT_BASE
cmp [ecx+APPDATA.dir_table],ebx ;compare page directory addresses
jnz @f jnz @f
mov [ebp-4],ecx
inc edx ;thread found inc edx ;thread found
@@: @@:
inc eax inc eax
@ -537,13 +548,19 @@ proc destroy_app_space stdcall, pg_dir:dword
;edx = number of threads ;edx = number of threads
;our process is zombi so it isn't counted ;our process is zombi so it isn't counted
pop ecx
cmp edx,1 cmp edx,1
jg .exit jg .ret
;if there isn't threads then clear memory. ;if there isn't threads then clear memory.
mov esi, [dlls_list]
call destroy_all_hdlls
mov ebx, pg_data.pg_mutex
call wait_mutex ;ebx
mov eax, [pg_dir] mov eax, [pg_dir]
and eax, not 0xFFF and eax, not 0xFFF
stdcall map_page,[tmp_task_pdir],eax,dword PG_SW stdcall map_page,[tmp_task_pdir],eax,PG_SW
mov esi, [tmp_task_pdir] mov esi, [tmp_task_pdir]
mov edi, (OS_BASE shr 20)/4 mov edi, (OS_BASE shr 20)/4
.destroy: .destroy:
@ -551,7 +568,7 @@ proc destroy_app_space stdcall, pg_dir:dword
test eax, 1 test eax, 1
jz .next jz .next
and eax, not 0xFFF and eax, not 0xFFF
stdcall map_page,[tmp_task_ptab],eax,dword PG_SW stdcall map_page,[tmp_task_ptab],eax,PG_SW
stdcall destroy_page_table, [tmp_task_ptab] stdcall destroy_page_table, [tmp_task_ptab]
mov eax, [esi] mov eax, [esi]
call free_page call free_page
@ -563,16 +580,17 @@ proc destroy_app_space stdcall, pg_dir:dword
mov eax, [pg_dir] mov eax, [pg_dir]
call free_page call free_page
.exit: .exit:
stdcall map_page,[tmp_task_ptab],dword 0,dword PG_UNMAP stdcall map_page,[tmp_task_ptab],0,PG_UNMAP
stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP stdcall map_page,[tmp_task_pdir],0,PG_UNMAP
dec [pg_data.pg_mutex] dec [pg_data.pg_mutex]
.ret:
ret ret
endp endp
align 4 align 4
get_pid: get_pid:
mov eax, [TASK_BASE] mov eax, [TASK_BASE]
mov eax, [eax+TASKDATA.pid] mov eax, [eax+TASKDATA.pid]
ret ret
pid_to_slot: pid_to_slot:
@ -613,24 +631,24 @@ pid_to_slot:
check_region: check_region:
;input: ;input:
; ebx - start of buffer ; esi - start of buffer
; ecx - size of buffer ; edx - size of buffer
;result: ;result:
; eax = 1 region lays in app memory ; eax = 1 region lays in app memory
; eax = 0 region don't lays in app memory ; eax = 0 region don't lays in app memory
mov eax,[CURRENT_TASK] mov eax,[CURRENT_TASK]
jmp check_process_region ; jmp check_process_region
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
check_process_region: ;check_process_region:
;input: ;input:
; eax - slot ; eax - slot
; ebx - start of buffer ; esi - start of buffer
; ecx - size of buffer ; edx - size of buffer
;result: ;result:
; eax = 1 region lays in app memory ; eax = 1 region lays in app memory
; eax = 0 region don't lays in app memory ; eax = 0 region don't lays in app memory
test ecx,ecx test edx,edx
jle .ok jle .ok
shl eax,5 shl eax,5
cmp word [CURRENT_TASK+eax+0xa],0 cmp word [CURRENT_TASK+eax+0xa],0
@ -698,9 +716,9 @@ align 4
proc read_process_memory proc read_process_memory
;Input: ;Input:
; eax - process slot ; eax - process slot
; ebx - buffer address ; ecx - buffer address
; ecx - buffer size ; edx - buffer size
; edx - start address in other process ; esi - start address in other process
;Output: ;Output:
; eax - number of bytes read. ; eax - number of bytes read.
locals locals
@ -712,10 +730,10 @@ proc read_process_memory
endl endl
mov [slot], eax mov [slot], eax
mov [buff], ebx mov [buff], ecx
and [r_count], 0 and [r_count], 0
mov [tmp_r_cnt], ecx mov [tmp_r_cnt], edx
mov [offset], edx mov [offset], esi
pushad pushad
.read_mem: .read_mem:
@ -733,18 +751,22 @@ proc read_process_memory
jna @F jna @F
mov ecx, 0x8000 mov ecx, 0x8000
@@: @@:
mov eax, [slot]
shl eax,8
mov ebx, [offset] mov ebx, [offset]
; add ebx, new_app_base
push ecx push ecx
stdcall map_memEx, [proc_mem_map],\ stdcall map_memEx, [proc_mem_map],\
[SLOT_BASE+eax+0xB8],\ [slot], ebx, ecx, PG_MAP
ebx, ecx
pop ecx pop ecx
mov esi, [offset] mov esi, [offset]
and esi, 0xfff and esi, 0xfff
sub eax, esi
jbe .ret
cmp ecx, eax
jbe @f
mov ecx, eax
mov [tmp_r_cnt], eax
@@:
add esi, [proc_mem_map] add esi, [proc_mem_map]
mov edi, [buff] mov edi, [buff]
mov edx, ecx mov edx, ecx
@ -754,7 +776,7 @@ proc read_process_memory
add [offset], edx add [offset], edx
sub [tmp_r_cnt], edx sub [tmp_r_cnt], edx
jnz .read_mem jnz .read_mem
.ret:
popad popad
mov eax, [r_count] mov eax, [r_count]
ret ret
@ -764,9 +786,9 @@ align 4
proc write_process_memory proc write_process_memory
;Input: ;Input:
; eax - process slot ; eax - process slot
; ebx - buffer address ; ecx - buffer address
; ecx - buffer size ; edx - buffer size
; edx - start address in other process ; esi - start address in other process
;Output: ;Output:
; eax - number of bytes written ; eax - number of bytes written
@ -779,10 +801,10 @@ proc write_process_memory
endl endl
mov [slot], eax mov [slot], eax
mov [buff], ebx mov [buff], ecx
and [w_count], 0 and [w_count], 0
mov [tmp_w_cnt], ecx mov [tmp_w_cnt], edx
mov [offset], edx mov [offset], esi
pushad pushad
.read_mem: .read_mem:
@ -800,18 +822,22 @@ proc write_process_memory
jna @F jna @F
mov ecx, 0x8000 mov ecx, 0x8000
@@: @@:
mov eax, [slot]
shl eax,8
mov ebx, [offset] mov ebx, [offset]
; add ebx, new_app_base ; add ebx, new_app_base
push ecx push ecx
stdcall map_memEx, [proc_mem_map],\ stdcall map_memEx, [proc_mem_map],\
[SLOT_BASE+eax+0xB8],\ [slot], ebx, ecx, PG_SW
ebx, ecx
pop ecx pop ecx
mov edi, [offset] mov edi, [offset]
and edi, 0xfff and edi, 0xfff
sub eax, edi
jbe .ret
cmp ecx, eax
jbe @f
mov ecx, eax
mov [tmp_w_cnt], eax
@@:
add edi, [proc_mem_map] add edi, [proc_mem_map]
mov esi, [buff] mov esi, [buff]
mov edx, ecx mov edx, ecx
@ -821,7 +847,7 @@ proc write_process_memory
add [offset], edx add [offset], edx
sub [tmp_w_cnt], edx sub [tmp_w_cnt], edx
jnz .read_mem jnz .read_mem
.ret:
popad popad
mov eax, [w_count] mov eax, [w_count]
ret ret
@ -838,15 +864,14 @@ proc new_sys_threads
app_mem dd ? ;0x10 app_mem dd ? ;0x10
endl endl
cmp eax,1 cmp ebx,1
jne .failed ;other subfunctions jne .failed ;other subfunctions
xor eax,eax xor eax,eax
mov [app_eip], ecx
mov [app_cmdline], eax mov [app_cmdline], eax
mov [app_esp], edx
mov [app_path], eax mov [app_path], eax
mov [app_eip], ebx
mov [app_esp], ecx
;mov esi,new_process_loading ;mov esi,new_process_loading
;call sys_msg_board_str ;call sys_msg_board_str
.wait_lock: .wait_lock:
@ -858,8 +883,8 @@ proc new_sys_threads
.get_lock: .get_lock:
mov eax, 1 mov eax, 1
xchg eax, [application_table_status] xchg eax, [application_table_status]
cmp eax, 0 test eax, eax
jne .wait_lock jnz .wait_lock
call set_application_table_status call set_application_table_status
@ -895,21 +920,38 @@ proc new_sys_threads
mov [edx+APPDATA.mem_size], eax mov [edx+APPDATA.mem_size], eax
mov ecx,[ebx+APPDATA.dir_table] mov ecx,[ebx+APPDATA.dir_table]
mov [edx+APPDATA.dir_table],ecx ;copy page directory mov [edx+APPDATA.dir_table],ecx ;copy page directory
mov eax,[ebx+APPDATA.dlls_list_ptr]
mov [edx+APPDATA.dlls_list_ptr],eax
mov eax, [ebx+APPDATA.tls_base]
test eax, eax
jz @F
push edx
stdcall user_alloc, 4096
pop edx
test eax, eax
jz .failed1 ;eax=0
@@:
mov [edx+APPDATA.tls_base], eax
lea eax, [app_cmdline] lea eax, [app_cmdline]
stdcall set_app_params ,[slot],eax,dword 0,\ stdcall set_app_params ,[slot],eax,dword 0,\
dword 0,dword 0 dword 0,dword 0
;mov esi,new_process_running ;mov esi,new_process_running
;call sys_msg_board_str ;output information about succefull startup ;call sys_msg_board_str ;output information about succefull startup
xor eax,eax
mov [application_table_status],0 ;unlock application_table_status mutex mov [application_table_status],eax ;unlock application_table_status mutex
mov eax,[process_number] ;set result mov eax,[process_number] ;set result
ret ret
.failed: .failed:
mov [application_table_status],0 xor eax,eax
mov eax,-1 .failed1:
mov [application_table_status],eax
dec eax ;-1
ret ret
endp endp
@ -931,6 +973,24 @@ wait_mutex:
pop eax pop eax
ret ret
align 4
tls_app_entry:
call init_heap
stdcall user_alloc, 4096
mov edx, [current_slot]
mov [edx+APPDATA.tls_base], eax
mov [tls_data_l+2],ax
shr eax,16
mov [tls_data_l+4],al
mov [tls_data_l+7],ah
mov dx, app_tls
mov fs, dx
popad
iretd
EFL_IF equ 0x0200 EFL_IF equ 0x0200
EFL_IOPL1 equ 0x1000 EFL_IOPL1 equ 0x1000
EFL_IOPL2 equ 0x2000 EFL_IOPL2 equ 0x2000
@ -959,10 +1019,10 @@ proc set_app_params stdcall,slot:dword, params:dword,\
mov [eax+SLOT_BASE+APPDATA.except_mask], 0 mov [eax+SLOT_BASE+APPDATA.except_mask], 0
;set default io permission map ;set default io permission map
mov [eax+SLOT_BASE+APPDATA.io_map],\ mov ecx, [SLOT_BASE+256+APPDATA.io_map]
(tss._io_map_0-OS_BASE+PG_MAP) mov [eax+SLOT_BASE+APPDATA.io_map], ecx
mov [eax+SLOT_BASE+APPDATA.io_map+4],\ mov ecx, [SLOT_BASE+256+APPDATA.io_map+4]
(tss._io_map_1-OS_BASE+PG_MAP) mov [eax+SLOT_BASE+APPDATA.io_map+4], ecx
mov esi, fpu_data mov esi, fpu_data
mov ecx, 512/4 mov ecx, 512/4
@ -1037,6 +1097,11 @@ proc set_app_params stdcall,slot:dword, params:dword,\
shl ebx,5 shl ebx,5
lea ecx,[draw_data+ebx] ;ecx - pointer to draw data lea ecx,[draw_data+ebx] ;ecx - pointer to draw data
mov edx, irq0.return
cmp [ebx*8+SLOT_BASE+APPDATA.tls_base], -1
jne @F
mov edx, tls_app_entry
@@:
; set window state to 'normal' (non-minimized/maximized/rolled-up) state ; set window state to 'normal' (non-minimized/maximized/rolled-up) state
mov [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL mov [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
mov [ebx+window_data+WDATA.fl_redraw], 1 mov [ebx+window_data+WDATA.fl_redraw], 1
@ -1050,9 +1115,9 @@ proc set_app_params stdcall,slot:dword, params:dword,\
mov [ebx+4],eax ;set PID mov [ebx+4],eax ;set PID
;set draw data to full screen ;set draw data to full screen
xor eax,eax
mov [ecx+0],dword 0 mov [ecx+0],dword eax
mov [ecx+4],dword 0 mov [ecx+4],dword eax
mov eax,[Screen_Max_X] mov eax,[Screen_Max_X]
mov [ecx+8],eax mov [ecx+8],eax
mov eax,[Screen_Max_Y] mov eax,[Screen_Max_Y]
@ -1063,7 +1128,7 @@ proc set_app_params stdcall,slot:dword, params:dword,\
lea ecx, [ebx+REG_EIP] lea ecx, [ebx+REG_EIP]
xor eax, eax xor eax, eax
mov [ebx+REG_RET], dword irq0.return mov [ebx+REG_RET], edx
mov [ebx+REG_EDI], eax mov [ebx+REG_EDI], eax
mov [ebx+REG_ESI], eax mov [ebx+REG_ESI], eax
mov [ebx+REG_EBP], eax mov [ebx+REG_EBP], eax

View File

@ -0,0 +1,223 @@
; Tests of malloc()/free() from the kernel heap.
; This file is not included in the kernel, it is just test application.
use32
db 'MENUET01'
dd 1, start, i_end, mem, mem, 0, 0
start:
; Zero-initialize uglobals (as in kernel at boot)
mov ecx, (zeroend - zerostart + 3) / 4
xor eax, eax
mov edi, zerostart
rep stosd
; Initialize small heap (as in kernel at boot)
call init_malloc
; Run tests
call run_test1
call run_test2
call run_test3
; All is OK, return
or eax, -1
int 0x40
run_test1:
; basic test
mov eax, 1
call malloc_with_test
mov byte [eax], 0xDD
mov esi, eax
mov eax, 1
call malloc_with_test
cmp byte [esi], 0xDD
jnz memory_destroyed
mov byte [eax], 0xEE
xchg eax, esi
call free
cmp byte [esi], 0xEE
jnz memory_destroyed
xchg eax, esi
call free
ret
run_test2:
ret
run_test3:
; 1024000 times run random operation.
; Randomly select malloc(random size from 1 to 1023)
; or free(random of previously allocated areas)
mov edi, 0x12345678
xor esi, esi ; 0 areas allocated
mov ebx, 1024000
.loop:
imul edi, 1103515245
add edi, 12345
mov eax, edi
shr eax, 16
test ebx, 64
jz .prefer_free
.prefer_malloc:
test eax, 3
jz .free
jmp @f
.prefer_free:
test eax, 3
jnz .free
@@:
shr eax, 2
and eax, 1023
jz .loop
push ebx
push eax
; mov ecx, [saved_state_num]
; mov [saved_state+ecx*8], eax
call malloc_with_test
; mov ecx, [saved_state_num]
; mov [saved_state+ecx*8+4], eax
; inc [saved_state_num]
pop ecx
pop ebx
inc esi
push ecx eax
push edi
mov edi, eax
mov eax, esi
rep stosb
pop edi
jmp .common
.free:
test esi, esi
jz .loop
xor edx, edx
div esi
sub edx, esi
neg edx
dec edx
mov eax, [esp+edx*8]
; mov ecx, [saved_state_num]
; mov [saved_state+ecx*8], -1
; mov [saved_state+ecx*8+4], eax
; inc [saved_state_num]
mov ecx, [esp+edx*8+4]
push edi eax
mov edi, eax
mov al, [edi]
repz scasb
jnz memory_destroyed
pop eax edi
push ebx edx
call free
pop edx ebx
dec esi
pop eax ecx
push edi
lea edi, [esp+4]
@@:
dec edx
js @f
xchg eax, [edi]
xchg ecx, [edi+4]
add edi, 8
jmp @b
@@:
pop edi
.common:
dec ebx
jnz .loop
@@:
dec esi
js @f
pop eax ecx
call free
jmp @b
@@:
ret
malloc_with_test:
; calls malloc() and checks returned value
call malloc
test eax, eax
jz generic_malloc_fail
call check_mutex
call check_range
ret
; Stubs for kernel procedures used by heap code
wait_mutex:
inc dword [ebx]
ret
kernel_alloc:
cmp dword [esp+4], bufsize
jnz error1
mov eax, buffer
ret 4
macro $Revision [args]
{
}
; Error handlers
error1:
mov eax, 1
jmp error_with_code
generic_malloc_fail:
mov eax, 2
jmp error_with_code
check_mutex:
cmp [mst.mutex], 0
jnz @f
ret
@@:
mov eax, 3
jmp error_with_code
check_range:
cmp eax, buffer
jb @f
cmp eax, buffer+bufsize
jae @f
ret
@@:
mov eax, 4
jmp error_with_code
memory_destroyed:
mov eax, 5
jmp error_with_code
error_with_code:
mov edx, saved_state_num
; eax = error code
; 1 signals error in testing code (wrong bufsize)
; 2 = malloc() returned NULL
; 3 = mutex not released
; 4 = weird returned value from malloc()
; 5 = memory destroyed by malloc() or free()
int3 ; simplest way to report error
jmp $-1 ; just in case
; Include main heap code
include '../proc32.inc'
include '../const.inc'
include 'malloc.inc'
i_end:
align 4
zerostart:
mst MEM_STATE
align 16
bufsize = 0x40000 ; change if malloc.inc changes
buffer rb bufsize
zeroend:
saved_state_num dd ?
saved_state rd 0x10000
align 4
rb 0x10000 ; for stack
mem:

View File

@ -1,468 +1,466 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$ $Revision$
keymap: keymap:
db '6',27 db '6',27
db '1234567890-=',8,9 db '1234567890-=',8,9
db 'qwertyuiop[]',13 db 'qwertyuiop[]',13
db '~asdfghjkl;',39,96,0,'\zxcvbnm,./',0,'45 ' db '~asdfghjkl;',39,96,0,'\zxcvbnm,./',0,'45 '
db '@234567890123',180,178,184,'6',176,'7' db '@234567890123',180,178,184,'6',176,'7'
db 179,'8',181,177,183,185,182 db 179,'8',181,177,183,185,182
db 'AB<D',255,'FGHIJKLMNOPQRSTUVWXYZ' db 'AB<D',255,'FGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
keymap_shift: keymap_shift:
db '6',27 db '6',27
db '!@#$%^&*()_+',8,9 db '!@#$%^&*()_+',8,9
db 'QWERTYUIOP{}',13 db 'QWERTYUIOP{}',13
db '~ASDFGHJKL:"~',0,'|ZXCVBNM<>?',0,'45 ' db '~ASDFGHJKL:"~',0,'|ZXCVBNM<>?',0,'45 '
db '@234567890123',180,178,184,'6',176,'7' db '@234567890123',180,178,184,'6',176,'7'
db 179,'8',181,177,183,185,182 db 179,'8',181,177,183,185,182
db 'AB>D',255,'FGHIJKLMNOPQRSTUVWXYZ' db 'AB>D',255,'FGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
keymap_alt: keymap_alt:
db ' ',27 db ' ',27
db ' @ $ {[]}\ ',8,9 db ' @ $ {[]}\ ',8,9
db ' ',13 db ' ',13
db ' ',0,' ',0,'4',0,' ' db ' ',0,' ',0,'4',0,' '
db ' ',180,178,184,'6',176,'7' db ' ',180,178,184,'6',176,'7'
db 179,'8',181,177,183,185,182 db 179,'8',181,177,183,185,182
db 'ABCD',255,'FGHIJKLMNOPQRSTUVWXYZ' db 'ABCD',255,'FGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
boot_memdetect db 'Determining amount of memory',0
boot_memdetect db 'Determining amount of memory',0 boot_fonts db 'Fonts loaded',0
boot_fonts db 'Fonts loaded',0 boot_tss db 'Setting TSSs',0
boot_tss db 'Setting TSSs',0 boot_cpuid db 'Reading CPUIDs',0
boot_cpuid db 'Reading CPUIDs',0 boot_devices db 'Detecting devices',0
boot_devices db 'Detecting devices',0 boot_timer db 'Setting timer',0
boot_timer db 'Setting timer',0 boot_irqs db 'Reprogramming IRQs',0
boot_irqs db 'Reprogramming IRQs',0 boot_setmouse db 'Setting mouse',0
boot_setmouse db 'Setting mouse',0 boot_windefs db 'Setting window defaults',0
boot_windefs db 'Setting window defaults',0 boot_bgr db 'Calculating background',0
boot_bgr db 'Calculating background',0 boot_resirqports db 'Reserving IRQs & ports',0
boot_resirqports db 'Reserving IRQs & ports',0 boot_setrports db 'Setting addresses for IRQs',0
boot_setrports db 'Setting addresses for IRQs',0 boot_setostask db 'Setting OS task',0
boot_setostask db 'Setting OS task',0 boot_allirqs db 'Unmasking all IRQs',0
boot_allirqs db 'Unmasking all IRQs',0 boot_tsc db 'Reading TSC',0
boot_tsc db 'Reading TSC',0 boot_cpufreq db 'CPU frequency is ',' ',' MHz',0
boot_cpufreq db 'CPU frequency is ',' ',' MHz',0 boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0
boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0 boot_pal_vga db 'Setting VGA 640x480 palette',0
boot_pal_vga db 'Setting VGA 640x480 palette',0 boot_failed db 'Failed to start first app',0
boot_failed db 'Failed to start first app',0 boot_mtrr db 'Setting MTRR',0
boot_mtrr db 'Setting MTRR',0 if preboot_blogesc
if preboot_blogesc boot_tasking db 'All set - press ESC to start',0
boot_tasking db 'All set - press ESC to start',0 end if
end if
;new_process_loading db 'K : New Process - loading',13,10,0
;new_process_loading db 'K : New Process - loading',13,10,0 ;new_process_running db 'K : New Process - done',13,10,0
;new_process_running db 'K : New Process - done',13,10,0 start_not_enough_memory db 'K : New Process - not enough memory',13,10,0
start_not_enough_memory db 'K : New Process - not enough memory',13,10,0
msg_unresolved db 'unresolved ',0
msg_unresolved db 'unresolved ',0 msg_module db 'in module ',0
msg_module db 'in module ',0 msg_version db 'incompatible driver version',13,10,0
msg_version db 'incompatible driver version',13,10,0 msg_www db 'please visit www.kolibrios.org',13,10,0
msg_www db 'please visit www.kolibrios.org',13,10,0 msg_CR db 13,10,0
msg_CR db 13,10,0 aSis db 'SIS',0
aSis db 'SIS',0
intel_str db "GenuineIntel",0
intel_str db "GenuineIntel",0 AMD_str db "AuthenticAMD",0
AMD_str db "AuthenticAMD",0
;szSound db 'SOUND',0
;szSound db 'SOUND',0 ;szInfinity db 'INFINITY',0
;szInfinity db 'INFINITY',0 szHwMouse db 'ATI2D',0
szHwMouse db 'ATI2D',0 szPS2MDriver db 'PS2MOUSE',0
szPS2MDriver db 'PS2MOUSE',0 ;szCOM_MDriver db 'COM_MOUSE',0
;szCOM_MDriver db 'COM_MOUSE',0 szUSB db 'USB',0
szUSB db 'USB',0 szAtiHW db '/rd/1/drivers/ati2d.drv',0
szAtiHW db '/rd/1/drivers/ati2d.drv',0
szSTART db 'START',0
szSTART db 'START',0 szEXPORTS db 'EXPORTS',0
szEXPORTS db 'EXPORTS',0 sz_EXPORTS db '_EXPORTS',0
sz_EXPORTS db '_EXPORTS',0
szIMPORTS db 'IMPORTS',0
szIMPORTS db 'IMPORTS',0
read_firstapp db '/sys/'
read_firstapp db '/sys/' firstapp db 'LAUNCHER',0
firstapp db 'LAUNCHER',0
char db '/sys/FONTS/CHAR.MT',0
char db '/sys/FONTS/CHAR.MT',0 char2 db '/sys/FONTS/CHAR2.MT',0
char2 db '/sys/FONTS/CHAR2.MT',0
bootpath db '/KOLIBRI '
bootpath db '/KOLIBRI ' bootpath2 db 0
bootpath2 db 0 vmode db '/sys/drivers/VMODE.MDR',0
vmode db '/sys/drivers/VMODE.MDR',0 vrr_m db 'VRR_M',0
vrr_m db 'VRR_M',0 kernel_file db 'KERNEL MNT'
kernel_file db 'KERNEL MNT'
align 4
align 4
shmem_list:
shmem_list: .bk dd shmem_list
.bk dd shmem_list .fd dd shmem_list
.fd dd shmem_list
dll_list:
; supported videomodes .bk dd dll_list
.fd dd dll_list
mode_1280_1024_32:
dw 1280,1024,32,60 MAX_DEFAULT_DLL_ADDR = 0x20000000
mode_1280_1024_24: MIN_DEFAULT_DLL_ADDR = 0x10000000
dw 1280,1024,24,60 dll_cur_addr dd MIN_DEFAULT_DLL_ADDR
mode_1024_768_32:
dw 1024,768,32,60 ; supported videomodes
mode_1024_768_24:
dw 1024,768,24,60
mode_800_600_32: ; mike.dld {
dw 800,600,32,60 db 0
mode_800_600_24: dd servetable-0x10000
dw 800,600,24,60 draw_line dd __sys_draw_line
mode_640_480_32: draw_pointer dd __sys_draw_pointer
dw 640,480,32,60 ;//mike.dld, 2006-08-02 [
mode_640_480_24: ;drawbar dd __sys_drawbar
dw 640,480,24,60 drawbar dd __sys_drawbar.forced
mode_640_480_16: ;//mike.dld, 2006-08-02 ]
dw 640,480,16,60 putpixel dd __sys_putpixel
mode_320_240_8: ; } mike.dld
dw 320,240,8,60
; mike.dld { align 4
db 0 keyboard dd 1
dd servetable-0x10000 syslang dd 1
draw_line dd __sys_draw_line
disable_mouse dd __sys_disable_mouse boot_y dd 10
draw_pointer dd __sys_draw_pointer
;//mike.dld, 2006-08-02 [ pci_bios_entry dd 0
;drawbar dd __sys_drawbar dw pci_code_sel
drawbar dd __sys_drawbar.forced
;//mike.dld, 2006-08-02 ] if __DEBUG__ eq 1
putpixel dd __sys_putpixel include_debug_strings
; } mike.dld end if
IncludeIGlobals
align 4
keyboard dd 1 align 16
syslang dd 1 gdts:
boot_y dd 10 dw gdte-$-1
dd gdts
pci_bios_entry dd 0 dw 0
dw pci_code_sel
; Attention! Do not change the order of the first four selectors. They are used in Fast System Call
if __DEBUG__ eq 1 ; must be : os_code, os_data, app_code, app_data, ....
include_debug_strings
end if int_code_l:
os_code_l:
IncludeIGlobals dw 0xffff
dw 0x0000
align 16 db 0x00
gdts: dw 11011111b *256 +10011010b
db 0x00
dw gdte-$-1
dd gdts int_data_l:
dw 0 os_data_l:
dw 0xffff
; Attention! Do not change the order of the first four selectors. They are used in Fast System Call dw 0x0000
; must be : os_code, os_data, app_code, app_data, .... db 0x00
dw 11011111b *256 +10010010b
int_code_l: db 0x00
os_code_l:
dw 0xffff app_code_l:
dw 0x0000 dw 0xFFFF
db 0x00 dw 0
dw 11011111b *256 +10011010b db 0
db 0x00 db cpl3
dw G32+D32+0xF;
int_data_l:
os_data_l: app_data_l:
dw 0xffff dw 0xFFFF
dw 0x0000 dw 0
db 0x00 db 0
dw 11011111b *256 +10010010b db drw3
db 0x00 dw G32+D32+0xF;
app_code_l: ; ------------- PCI BIOS ------------------
dw 0xFFFF
dw 0 pci_code_32:
db 0 dw 0 ;lim 0-15
db cpl3 dw 0 ;base 0-15
dw G32+D32+(new_app_base shr 16)+0xF; db 0 ;base 16-23
db cpl0 ;type
app_data_l: db D32 ;lim 16-19+props
dw 0xFFFF db 0 ;base 24-31
dw 0
db 0 pci_data_32:
db drw3 dw 0 ;lim 0-15
dw G32+D32+(new_app_base shr 16)+0xF; dw 0 ;base 0-15
db 0 ;base 16-23
; ------------- PCI BIOS ------------------ db dpl0 ;type
db D32 ;lim 16-19+props
pci_code_32: db 0 ;base 24-31
dw 0 ;lim 0-15
dw 0 ;base 0-15 ; --------------- APM ---------------------
db 0 ;base 16-23 apm_code_32:
db cpl0 ;type dw 0x0f ; limit 64kb
db D32 ;lim 16-19+props db 0, 0, 0
db 0 ;base 24-31 dw 11010000b *256 +10011010b
db 0x00
pci_data_32: apm_code_16:
dw 0 ;lim 0-15 dw 0x0f
dw 0 ;base 0-15 db 0, 0, 0
db 0 ;base 16-23 dw 10010000b *256 +10011010b
db dpl0 ;type db 0x00
db D32 ;lim 16-19+props apm_data_16:
db 0 ;base 24-31 dw 0x0f
db 0, 0, 0
; --------------- APM --------------------- dw 10010000b *256 +10010010b
apm_code_32: db 0x00
dw 0x0f ; limit 64kb ; -----------------------------------------
db 0, 0, 0
dw 11010000b *256 +10011010b graph_data_l:
db 0x00
apm_code_16: dw 0x7ff
dw 0x0f dw 0x0000
db 0, 0, 0 db 0x00
dw 10010000b *256 +10011010b dw 11010000b *256 +11110010b
db 0x00 db 0x00
apm_data_16: tss0_l:
dw 0x0f dw TSS_SIZE-1
db 0, 0, 0 dw tss and 0xFFFF
dw 10010000b *256 +10010010b db (tss shr 16) and 0xFF
db 0x00 db 10001001b
; ----------------------------------------- dw (tss shr 16) and 0xFF00
graph_data_l: tls_data_l:
dw 0x0FFF
dw 0x7ff dw 0
dw 0x0000 db 0
db 0x00 db drw3
dw 11010000b *256 +11110010b dw D32
db 0x00
tss0_l: endofcode:
dw TSS_SIZE-1 gdte:
dw tss and 0xFFFF
db (tss shr 16) and 0xFF align 16
db 10001001b cur_saved_data rb 4096
dw (tss shr 16) and 0xFF00 fpu_data: rb 512
endofcode:
gdte: ; device irq owners
irq_owner rd 16 ; process id
align 16
cur_saved_data rb 4096 ; on irq read ports
fpu_data: rb 512
irq00read rd 16
; device irq owners irq01read rd 16
irq_owner rd 16 ; process id irq02read rd 16
irq03read rd 16
; on irq read ports irq04read rd 16
irq05read rd 16
irq00read rd 16 irq06read rd 16
irq01read rd 16 irq07read rd 16
irq02read rd 16 irq08read rd 16
irq03read rd 16 irq09read rd 16
irq04read rd 16 irq10read rd 16
irq05read rd 16 irq11read rd 16
irq06read rd 16 irq12read rd 16
irq07read rd 16 irq13read rd 16
irq08read rd 16 irq14read rd 16
irq09read rd 16 irq15read rd 16
irq10read rd 16
irq11read rd 16 irq_tab rd 16
irq12read rd 16
irq13read rd 16 mem_block_map rb 512
irq14read rd 16 mem_block_list rd 64
irq15read rd 16 large_block_list rd 31
mem_block_mask rd 2
irq_tab rd 16 large_block_mask rd 1
mem_block_map rb 512 mem_used.fd rd 1
mem_block_list rd 64 mem_used.bk rd 1
large_block_list rd 31
mem_block_mask rd 2 mem_block_arr rd 1
large_block_mask rd 1 mem_block_start rd 1
mem_block_end rd 1
mem_used.fd rd 1
mem_used.bk rd 1 heap_mutex rd 1
heap_size rd 1
mem_block_arr rd 1 heap_free rd 1
mem_block_start rd 1 heap_blocks rd 1
mem_block_end rd 1 free_blocks rd 1
heap_mutex rd 1 mst MEM_STATE
heap_size rd 1
heap_free rd 1 page_start rd 1
heap_blocks rd 1 page_end rd 1
free_blocks rd 1 sys_page_map rd 1
os_stack_seg rd 1
mst MEM_STATE
page_start rd 1 srv.fd rd 1
page_end rd 1 srv.bk rd 1
sys_page_map rd 1
os_stack_seg rd 1
align 16
srv.fd rd 1 _display display_t
srv.bk rd 1
_WinMapAddress rd 1
scr_width rd 1 _WinMapSize rd 1
scr_height rd 1
def_cursor rd 1
create_cursor rd 1 current_cursor rd 1
select_hw_cursor rd 1 hw_cursor rd 1
set_hw_cursor rd 1 cur_saved_base rd 1
hw_restore rd 1
cur.lock rd 1 ;1 - lock update, 2- hide
def_cursor rd 1 cur.left rd 1 ;cursor clip box
current_cursor rd 1 cur.top rd 1
hw_cursor rd 1 cur.right rd 1
cur_def_interl rd 1 cur.bottom rd 1
cur_saved_base rd 1 cur.w rd 1
cur_saved_interl rd 1 cur.h rd 1
cur_saved_w rd 1
cur_saved_h rd 1 ipc_tmp rd 1
ipc_pdir rd 1
ipc_tmp rd 1 ipc_ptab rd 1
ipc_pdir rd 1
ipc_ptab rd 1 proc_mem_map rd 1
proc_mem_pdir rd 1
proc_mem_map rd 1 proc_mem_tab rd 1
proc_mem_pdir rd 1
proc_mem_tab rd 1 tmp_task_pdir rd 1
tmp_task_ptab rd 1
tmp_task_pdir rd 1
tmp_task_ptab rd 1 default_io_map rd 1
default_io_map rd 1 LFBSize rd 1
LFBSize rd 1 stall_mcs rd 1
current_slot rd 1
stall_mcs rd 1
current_slot rd 1 ; status
hd1_status rd 1 ; 0 - free : other - pid
; status application_table_status rd 1 ; 0 - free : other - pid
hd1_status rd 1 ; 0 - free : other - pid
application_table_status rd 1 ; 0 - free : other - pid ; device addresses
mididp rd 1
; device addresses midisp rd 1
mididp rd 1
midisp rd 1 cdbase rd 1
cdid rd 1
cdbase rd 1
cdid rd 1 hdbase rd 1 ; for boot 0x1f0
hdid rd 1
hdbase rd 1 ; for boot 0x1f0 hdpos rd 1 ; for boot 0x1
hdid rd 1 fat32part rd 1 ; for boot 0x1
hdpos rd 1 ; for boot 0x1 cdpos rd 1
fat32part rd 1 ; for boot 0x1
cdpos rd 1 ;CPUID information
cpu_vendor rd 3
;CPUID information cpu_sign rd 1
cpu_vendor rd 3 cpu_info rd 1
cpu_sign rd 1 cpu_caps rd 4
cpu_info rd 1
cpu_caps rd 4
pg_data PG_DATA
heap_test rd 1
pg_data PG_DATA
heap_test rd 1 buttontype rd 1
windowtypechanged rd 1
buttontype rd 1
windowtypechanged rd 1 hd_entries rd 1 ;unused ? 0xfe10
hd_entries rd 1 ;unused ? 0xfe10 ;* start code - Mario79
;* start code - Mario79 mouse_active rd 1
mouse_pause rd 1
mouse_active rd 1 MouseTickCounter rd 1
mouse_pause rd 1
MouseTickCounter rd 1 ;* end code - Mario79
;* end code - Mario79 img_background rd 1
mem_BACKGROUND rd 1
img_background rd 1 static_background_data rd 1
mem_BACKGROUND rd 1
static_background_data rd 1 cache_ide0:
cache_ide0_pointer rd 1
cache_ide0: cache_ide0_size rd 1 ; not use
cache_ide0_pointer rd 1 cache_ide0_data_pointer rd 1
cache_ide0_size rd 1 ; not use cache_ide0_system_data_size rd 1 ; not use
cache_ide0_data_pointer rd 1 cache_ide0_appl_data_size rd 1 ; not use
cache_ide0_system_data_size rd 1 ; not use cache_ide0_system_data rd 1
cache_ide0_appl_data_size rd 1 ; not use cache_ide0_appl_data rd 1
cache_ide0_system_data rd 1 cache_ide0_system_sad_size rd 1
cache_ide0_appl_data rd 1 cache_ide0_appl_sad_size rd 1
cache_ide0_system_sad_size rd 1 cache_ide0_search_start rd 1
cache_ide0_appl_sad_size rd 1 cache_ide0_appl_search_start rd 1
cache_ide0_search_start rd 1
cache_ide0_appl_search_start rd 1 cache_ide1:
cache_ide1_pointer rd 1
cache_ide1: cache_ide1_size rd 1 ; not use
cache_ide1_pointer rd 1 cache_ide1_data_pointer rd 1
cache_ide1_size rd 1 ; not use cache_ide1_system_data_size rd 1 ; not use
cache_ide1_data_pointer rd 1 cache_ide1_appl_data_size rd 1 ; not use
cache_ide1_system_data_size rd 1 ; not use cache_ide1_system_data rd 1
cache_ide1_appl_data_size rd 1 ; not use cache_ide1_appl_data rd 1
cache_ide1_system_data rd 1 cache_ide1_system_sad_size rd 1
cache_ide1_appl_data rd 1 cache_ide1_appl_sad_size rd 1
cache_ide1_system_sad_size rd 1 cache_ide1_search_start rd 1
cache_ide1_appl_sad_size rd 1 cache_ide1_appl_search_start rd 1
cache_ide1_search_start rd 1
cache_ide1_appl_search_start rd 1 cache_ide2:
cache_ide2_pointer rd 1
cache_ide2: cache_ide2_size rd 1 ; not use
cache_ide2_pointer rd 1 cache_ide2_data_pointer rd 1
cache_ide2_size rd 1 ; not use cache_ide2_system_data_size rd 1 ; not use
cache_ide2_data_pointer rd 1 cache_ide2_appl_data_size rd 1 ; not use
cache_ide2_system_data_size rd 1 ; not use cache_ide2_system_data rd 1
cache_ide2_appl_data_size rd 1 ; not use cache_ide2_appl_data rd 1
cache_ide2_system_data rd 1 cache_ide2_system_sad_size rd 1
cache_ide2_appl_data rd 1 cache_ide2_appl_sad_size rd 1
cache_ide2_system_sad_size rd 1 cache_ide2_search_start rd 1
cache_ide2_appl_sad_size rd 1 cache_ide2_appl_search_start rd 1
cache_ide2_search_start rd 1
cache_ide2_appl_search_start rd 1 cache_ide3:
cache_ide3_pointer rd 1
cache_ide3: cache_ide3_size rd 1 ; not use
cache_ide3_pointer rd 1 cache_ide3_data_pointer rd 1
cache_ide3_size rd 1 ; not use cache_ide3_system_data_size rd 1 ; not use
cache_ide3_data_pointer rd 1 cache_ide3_appl_data_size rd 1 ; not use
cache_ide3_system_data_size rd 1 ; not use cache_ide3_system_data rd 1
cache_ide3_appl_data_size rd 1 ; not use cache_ide3_appl_data rd 1
cache_ide3_system_data rd 1 cache_ide3_system_sad_size rd 1
cache_ide3_appl_data rd 1 cache_ide3_appl_sad_size rd 1
cache_ide3_system_sad_size rd 1 cache_ide3_search_start rd 1
cache_ide3_appl_sad_size rd 1 cache_ide3_appl_search_start rd 1
cache_ide3_search_start rd 1
cache_ide3_appl_search_start rd 1 debug_step_pointer rd 1
hdd_appl_data rb 1 ; 0 = system cache, 1 - application cache
debug_step_pointer rd 1 cd_appl_data rb 1 ; 0 = system cache, 1 - application cache
hdd_appl_data rb 1 ; 0 = system cache, 1 - application cache
cd_appl_data rb 1 ; 0 = system cache, 1 - application cache lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled
pci_access_enabled rd 1 ; 0 = disabled , 1 = enabled
lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled timer_ticks_enable rb 1 ; for cd driver
pci_access_enabled rd 1 ; 0 = disabled , 1 = enabled
timer_ticks_enable rb 1 ; for cd driver NumBiosDisks rd 1
BiosDisksData rb 200h
NumBiosDisks rd 1 BiosDiskCaches rb 80h*(cache_ide1-cache_ide0)
BiosDisksData rb 200h BiosDiskPartitions rd 80h
BiosDiskCaches rb 80h*(cache_ide1-cache_ide0)
BiosDiskPartitions rd 80h IncludeUGlobals
IncludeUGlobals

View File

@ -55,7 +55,8 @@ bdds:
inc ax inc ax
cmp word [si], 170h cmp word [si], 170h
jz @f jz @f
mov ax, -1 or ax,-1
; mov ax, -1
@@: @@:
stosw stosw
pop ds pop ds
@ -63,10 +64,14 @@ bdds:
bddl: bddl:
mov al, dl mov al, dl
stosb stosb
mov al, 0 xor ax,ax
stosb stosb
mov ax, -1 dec ax
stosw stosw
; mov al, 0
; stosb
; mov ax, -1
; stosw
bddc2: bddc2:
cmp cl, [es:0x475] cmp cl, [es:0x475]
jae bdde jae bdde

View File

@ -24,7 +24,7 @@ $Revision$
mov cx,0xff mov cx,0xff
wait_cmos: wait_cmos:
dec cx dec cx
cmp cx,0 test cx,cx
jne wait_cmos jnz wait_cmos
in al,0x71 in al,0x71
mov [DRIVE_DATA],al mov [DRIVE_DATA],al

View File

@ -72,8 +72,9 @@ FindHDD_3:
; Адрес считываемого сектора в режиме LBA ; Адрес считываемого сектора в режиме LBA
uglobal
SectorAddress DD ? SectorAddress DD ?
endg
;************************************************* ;*************************************************
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА * ;* ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА *
;* Входные параметры передаются через глобальные * ;* Входные параметры передаются через глобальные *
@ -99,8 +100,8 @@ ReadHDD_ID:
@@WaitCompleet: @@WaitCompleet:
; Проверить время выполнения команды ; Проверить время выполнения команды
dec ecx dec ecx
cmp ecx,0 ; cmp ecx,0
je @@Error1 ;îøèáêà òàéì-àóòà jz @@Error1 ;îøèáêà òàéì-àóòà
; Проверить готовность ; Проверить готовность
in AL,DX in AL,DX
test AL,80h ;состояние сигнала BSY test AL,80h ;состояние сигнала BSY
@ -116,19 +117,21 @@ ReadHDD_ID:
mov DX,[ATABasePortAddr] ;регистр данных mov DX,[ATABasePortAddr] ;регистр данных
mov CX,256 ;число считываемых слов mov CX,256 ;число считываемых слов
rep insw ;принять блок данных rep insw ;принять блок данных
jmp @@End ret
; Записать код ошибки ; Записать код ошибки
@@Error1: @@Error1:
mov [DevErrorCode],1 mov [DevErrorCode],1
jmp @@End ret
@@Error6: @@Error6:
mov [DevErrorCode],6 mov [DevErrorCode],6
@@End: ret @@End: ret
iglobal
; Стандартные базовые адреса каналов 1 и 2 ; Стандартные базовые адреса каналов 1 и 2
StandardATABases DW 1F0h, 170h StandardATABases DW 1F0h, 170h
endg
uglobal
; Номер канала ; Номер канала
ChannelNumber DW ? ChannelNumber DW ?
; Номер диска ; Номер диска
@ -148,8 +151,8 @@ ATACommand DB ? ;
; 3 - неверный номер канала, 4 - неверный номер диска, ; 3 - неверный номер канала, 4 - неверный номер диска,
; 5 - неверный номер головки, 6 - ошибка при выполнении ; 5 - неверный номер головки, 6 - ошибка при выполнении
; команды) ; команды)
DevErrorCode DB ? DevErrorCode dd ?
endg
;**************************************************** ;****************************************************
;* ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ * ;* ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ *
;* Входные параметры передаются через глобальные * ;* Входные параметры передаются через глобальные *
@ -203,8 +206,8 @@ SendCommandToHDD:
@@WaitHDReady: @@WaitHDReady:
; Проверить время ожидани ; Проверить время ожидани
dec ecx dec ecx
cmp ecx,0 ; cmp ecx,0
je @@Err1 jz @@Err1
; mov eax,[timer_ticks] ; mov eax,[timer_ticks]
; sub eax,[TickCounter_1] ; sub eax,[TickCounter_1]
; cmp eax,300 ;ожидать 300 тиков ; cmp eax,300 ;ожидать 300 тиков
@ -253,19 +256,18 @@ SendCommandToHDD:
sti sti
; Сбросить признак ошибки ; Сбросить признак ошибки
mov [DevErrorCode],0 mov [DevErrorCode],0
jmp @@End_2 ret
; Записать код ошибки ; Записать код ошибки
@@Err1: mov [DevErrorCode],1 @@Err1: mov [DevErrorCode],1
jmp @@End_2 ret
@@Err2: mov [DevErrorCode],2 @@Err2: mov [DevErrorCode],2
jmp @@End_2 ret
@@Err3: mov [DevErrorCode],3 @@Err3: mov [DevErrorCode],3
jmp @@End_2 ret
@@Err4: mov [DevErrorCode],4 @@Err4: mov [DevErrorCode],4
jmp @@End_2 ret
@@Err5: mov [DevErrorCode],5 @@Err5: mov [DevErrorCode],5
; Завершение работы программы ; Завершение работы программы
@@End_2:
ret ret
;************************************************* ;*************************************************
@ -293,12 +295,12 @@ ReadCD_ID:
; Ожидать готовность данных HDD ; Ожидать готовность данных HDD
mov DX,[ATABasePortAddr] mov DX,[ATABasePortAddr]
add DX,7 ;порт 1х7h add DX,7 ;порт 1х7h
mov ecx,0xffff mov ecx,0xffff
@@WaitCompleet_1: @@WaitCompleet_1:
; Проверить врем ; Проверить врем
dec ecx dec ecx
cmp ecx,0 ; cmp ecx,0
je @@Error1_1 ;îøèáêà òàéì-àóòà jz @@Error1_1 ;îøèáêà òàéì-àóòà
; Проверить готовность ; Проверить готовность
in AL,DX in AL,DX
test AL,80h ;состояние сигнала BSY test AL,80h ;состояние сигнала BSY
@ -314,11 +316,11 @@ ReadCD_ID:
mov DX,[ATABasePortAddr] ;порт 1x0h mov DX,[ATABasePortAddr] ;порт 1x0h
mov CX,256 ;число считываемых слов mov CX,256 ;число считываемых слов
rep insw rep insw
jmp @@End_1 ret
; Записать код ошибки ; Записать код ошибки
@@Error1_1: @@Error1_1:
mov [DevErrorCode],1 mov [DevErrorCode],1
jmp @@End_1 ret
@@Error6_1: @@Error6_1:
mov [DevErrorCode],6 mov [DevErrorCode],6
@@End_1: @@End_1:
@ -360,7 +362,7 @@ DeviceReset:
@@WaitHDReady_1: @@WaitHDReady_1:
; Проверить время ожидани ; Проверить время ожидани
dec ecx dec ecx
cmp ecx,0 ; cmp ecx,0
je @@Err1_2 ;ошибка тайм-аута je @@Err1_2 ;ошибка тайм-аута
; Прочитать регистр состояни ; Прочитать регистр состояни
in AL,DX in AL,DX
@ -369,15 +371,14 @@ DeviceReset:
jnz @@WaitHDReady_1 jnz @@WaitHDReady_1
; Сбросить признак ошибки ; Сбросить признак ошибки
mov [DevErrorCode],0 mov [DevErrorCode],0
jmp @@End_3 ret
; Обработка ошибок ; Обработка ошибок
@@Err1_2: mov [DevErrorCode],1 @@Err1_2: mov [DevErrorCode],1
jmp @@End_3 ret
@@Err3_2: mov [DevErrorCode],3 @@Err3_2: mov [DevErrorCode],3
jmp @@End_3 ret
@@Err4_2: mov [DevErrorCode],4 @@Err4_2: mov [DevErrorCode],4
; Записать код ошибки ; Записать код ошибки
@@End_3:
ret ret
EndFindHDD: EndFindHDD:

View File

@ -6,6 +6,7 @@
$Revision$ $Revision$
_esp equ esp
; ;
; Formatted Debug Output (FDO) ; Formatted Debug Output (FDO)
@ -61,11 +62,13 @@ macro DEBUGS_N _sign,_num,[_str] {
jmp ..label jmp ..label
..str db _str,0 ..str db _str,0
..label: ..label:
add esp,4*8+4 ; add esp,4*8+4
mov edx,..str esp equ esp+4*8+4
sub esp,4*8+4 mov edx,..str
esp equ _esp
; sub esp,4*8+4
else else
mov edx,_str mov edx,_str
end if end if
if ~_num eq if ~_num eq
if _num eqtype eax if _num eqtype eax
@ -147,7 +150,8 @@ macro DEBUGD_N _sign,_num,_dec {
else if _dec eqtype 0 else if _dec eqtype 0
mov eax,_dec mov eax,_dec
else else
add esp,4*8+4 ; add esp,4*8+4
esp equ esp+4*8+4
if _num eq if _num eq
mov eax,dword _dec mov eax,dword _dec
else if _num = 1 else if _num = 1
@ -165,7 +169,8 @@ macro DEBUGD_N _sign,_num,_dec {
else else
mov eax,dword _dec mov eax,dword _dec
end if end if
sub esp,4*8+4 esp equ _esp
; sub esp,4*8+4
end if end if
mov cl,_sign mov cl,_sign
call fdo_debug_outdec call fdo_debug_outdec
@ -215,9 +220,11 @@ macro DEBUGH_N _sign,_num,_hex {
else if _hex eqtype 0 else if _hex eqtype 0
mov eax,_hex mov eax,_hex
else else
add esp,4*8+4 ; add esp,4*8+4
esp equ esp+4*8+4
mov eax,dword _hex mov eax,dword _hex
sub esp,4*8+4 esp equ _esp
; sub esp,4*8+4
end if end if
if ~_num eq if ~_num eq
mov edx,_num mov edx,_num
@ -235,75 +242,74 @@ macro DEBUGH_N _sign,_num,_hex {
debug_func fdo_debug_outchar debug_func fdo_debug_outchar
debug_beginf debug_beginf
pushad pushad
movzx ebx,al movzx ebx,al
mov eax,1 mov eax,1
mov ecx,sys_msg_board mov ecx,sys_msg_board
call ecx ; sys_msg_board call ecx ; sys_msg_board
popad popad
ret ret
debug_endf debug_endf
debug_func fdo_debug_outstr debug_func fdo_debug_outstr
debug_beginf debug_beginf
mov eax,1 mov eax,1
.l1: dec esi .l1: dec esi
js .l2 js .l2
movzx ebx,byte[edx] movzx ebx,byte[edx]
or bl,bl or bl,bl
jz .l2 jz .l2
mov ecx,sys_msg_board mov ecx,sys_msg_board
call ecx ; sys_msg_board call ecx ; sys_msg_board
inc edx inc edx
jmp .l1 jmp .l1
.l2: ret .l2: ret
debug_endf debug_endf
debug_func fdo_debug_outdec debug_func fdo_debug_outdec
debug_beginf debug_beginf
or cl,cl or cl,cl
jz @f jz @f
or eax,eax or eax,eax
jns @f jns @f
neg eax neg eax
push eax push eax
mov al,'-' mov al,'-'
call fdo_debug_outchar call fdo_debug_outchar
pop eax pop eax
@@: push 10 @@: push 10
pop ecx pop ecx
push -'0' push -'0'
.l1: xor edx,edx .l1: xor edx,edx
div ecx div ecx
push edx push edx
test eax,eax test eax,eax
jnz .l1 jnz .l1
.l2: pop eax .l2: pop eax
add al,'0' add al,'0'
jz .l3 jz .l3
call fdo_debug_outchar call fdo_debug_outchar
jmp .l2 jmp .l2
.l3: ret .l3: ret
debug_endf debug_endf
__fdo_hexdigits db '0123456789ABCDEF'
debug_func fdo_debug_outhex debug_func fdo_debug_outhex
__fdo_hexdigits db '0123456789ABCDEF'
debug_beginf debug_beginf
mov cl,dl mov cl,dl
neg cl neg cl
add cl,8 add cl,8
shl cl,2 shl cl,2
rol eax,cl rol eax,cl
.l1: rol eax,4 .l1: rol eax,4
push eax push eax
and eax,0x0000000F and eax,0x0000000F
mov al,[__fdo_hexdigits+eax] mov al,[__fdo_hexdigits+eax]
call fdo_debug_outchar call fdo_debug_outchar
pop eax pop eax
dec edx dec edx
jnz .l1 jnz .l1
ret ret
debug_endf debug_endf
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------

View File

@ -65,13 +65,13 @@ floppy_fileread:
mov [save_flag],0 mov [save_flag],0
mov [path_pointer_flp],edi mov [path_pointer_flp],edi
cmp esi,0 ; return ramdisk root test esi,esi ; return ramdisk root
jne fr_noroot_1 jnz fr_noroot_1
cmp ebx,224/16 cmp ebx,224/16
jbe fr_do_1 jbe fr_do_1
mov eax,5 mov eax,5
mov ebx,0 xor ebx,ebx
mov [flp_status],0 mov [flp_status],ebx
ret ret
fr_do_1: fr_do_1:
@ -88,26 +88,29 @@ fr_do_1:
shl ecx,9 shl ecx,9
cld cld
rep movsb rep movsb
mov eax,0 ; ok read xor eax,eax
mov ebx,0 xor ebx,ebx
mov [flp_status],0 ; mov eax,0 ; ok read
; mov ebx,0
mov [flp_status],eax
ret ret
fdc_status_error_1: fdc_status_error_1:
mov [flp_status],0 xor eax,eax
mov [flp_status],eax
mov eax,10 mov eax,10
mov ebx,-1 or ebx,-1
ret ret
fr_noroot_1: fr_noroot_1:
sub esp,32 sub esp,32
call expand_filename call expand_filename
frfloppy_1: frfloppy_1:
cmp ebx,0 test ebx,ebx
jne frfl5_1 jnz frfl5_1
mov ebx,1 mov ebx,1
frfl5_1: frfl5_1:
cmp ecx,0 test ecx,ecx
jne frfl6_1 jnz frfl6_1
mov ecx,1 mov ecx,1
frfl6_1: frfl6_1:
dec ebx dec ebx
@ -137,14 +140,14 @@ l.21_1:
add ecx,21 add ecx,21
add edi, ecx ;Advance to next entry add edi, ecx ;Advance to next entry
dec dl dec dl
cmp dl,0 test dl,dl
jne l.21_1 jnz l.21_1
dec dh dec dh
cmp dh,0 test dh,dh
jne l.20_1 jnz l.20_1
fdc_status_error_3: fdc_status_error_3:
mov eax,5 ; file not found ? mov eax,5 ; file not found ?
mov ebx,-1 or ebx,-1
add esp,32+28 add esp,32+28
mov [flp_status],0 mov [flp_status],0
ret ret
@ -232,8 +235,8 @@ frnoread_1:
add esp,4 add esp,4
pop ebx ; ebx <- eax : size of file pop ebx ; ebx <- eax : size of file
add esp,36 add esp,36
mov eax,0 xor eax,eax
mov [flp_status],0 mov [flp_status],eax
ret ret
fdc_status_error_5: fdc_status_error_5:
@ -499,8 +502,8 @@ calculate_chs:
div ebx div ebx
mov [FDD_Track],al mov [FDD_Track],al
mov [FDD_Head],0 mov [FDD_Head],0
cmp edx,0 test edx,edx
je no_head_2 jz no_head_2
inc [FDD_Head] inc [FDD_Head]
no_head_2: no_head_2:
mov dl,[old_track] mov dl,[old_track]
@ -2131,7 +2134,7 @@ fs_FloppySetFileInfo:
popa popa
pop edi pop edi
xor eax, eax xor eax, eax
cmp [FDC_Status], 0 cmp [FDC_Status], al
jz @f jz @f
mov al, 11 mov al, 11
@@: @@:

View File

@ -169,6 +169,7 @@ reserve_hd_channel:
call clear_hd_cache call clear_hd_cache
@@: @@:
pop eax pop eax
sti
.ret: .ret:
ret ret

View File

@ -1,6 +1,6 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -372,7 +372,7 @@ file_system_lfn:
mov edi, fs_additional_handlers mov edi, fs_additional_handlers
@@: @@:
cmp dword [edi], 0 cmp dword [edi], 0
jz @f jz .notfound
call dword [edi] call dword [edi]
scasd scasd
scasd scasd
@ -967,43 +967,76 @@ process_replace_file_name:
ret ret
sys_current_directory: sys_current_directory:
mov esi, [current_slot] ; mov esi, [current_slot]
mov esi, [esi+APPDATA.cur_dir] ; mov esi, [esi+APPDATA.cur_dir]
mov edx, esi ; mov edx, esi
dec eax
;get length string of appdata.cur_dir
mov eax, [current_slot]
mov edi, [eax+APPDATA.cur_dir]
dec ebx
jz .set jz .set
dec eax dec ebx
jz .get jz .get
ret ret
.get: .get:
; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len ; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len
; for our code: ebx->buffer,ecx=len ; for our code: ebx->buffer,ecx=len
max_cur_dir equ 0x1000
mov ebx,edi
push ecx
push edi
xor eax,eax
mov ecx,max_cur_dir
repne scasb ;find zerro at and string
jnz .error ; no zero in cur_dir: internal error, should not happen
sub edi,ebx ;lenght for copy
inc edi
mov [esp+32+8],edi ;return in eax
cmp edx, edi
jbe @f
mov edx, edi
@@: @@:
lodsb ;source string
test al, al pop esi
jnz @b ;destination string
sub esi, edx pop edi
inc esi cmp edx, 1
mov [esp+36], esi
cmp ecx, esi
jbe @f
mov ecx, esi
@@:
cmp ecx, 1
jbe .ret jbe .ret
mov esi, edx
mov edi, ebx mov al,'/' ;start string with '/'
mov al, '/'
stosb stosb
dec ecx mov ecx,edx
dec ecx rep movsb ;copy string
rep movsb .ret: ret
mov byte [edi], 0
.ret: .error: add esp,8
or dword [esp+32],-1 ;error not found zerro at string ->[eax+APPDATA.cur_dir]
ret ret
.set: .set:
; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string ; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string
; for our code: ebx->string to set ; for our code: ebx->string to set
; use generic resolver with APPDATA.cur_dir as destination
push max_cur_dir ;0x1000
push edi ;destination
mov ebx,ecx
call get_full_file_name
ret
; in: ebx = file name, [esp+4] = destination, [esp+8] = sizeof destination
; destroys all registers except ebp,esp
get_full_file_name:
push ebp
mov esi, [current_slot]
mov esi, [esi+APPDATA.cur_dir]
mov edx, esi
@@: @@:
inc esi inc esi
cmp byte [esi-1], 0 cmp byte [esi-1], 0
@ -1012,6 +1045,7 @@ sys_current_directory:
cmp byte [ebx], '/' cmp byte [ebx], '/'
jz .set_absolute jz .set_absolute
; string gives relative path ; string gives relative path
mov edi, [esp+8] ; destination
.relative: .relative:
cmp byte [ebx], 0 cmp byte [ebx], 0
jz .set_ok jz .set_ok
@ -1032,33 +1066,67 @@ sys_current_directory:
dec esi dec esi
cmp byte [esi], '/' cmp byte [esi], '/'
jnz @b jnz @b
mov byte [esi], 0
add ebx, 3 add ebx, 3
jmp .relative jmp .relative
.set_ok:
cmp edx, edi ; is destination equal to APPDATA.cur_dir?
jz .set_ok.cur_dir
sub esi, edx
cmp esi, [esp+12]
jb .set_ok.copy
.fail:
mov byte [edi], 0
xor eax, eax ; fail
pop ebp
ret 8
.set_ok.copy:
mov ecx, esi
mov esi, edx
rep movsb
mov byte [edi], 0
.ret.ok:
mov al, 1 ; ok
pop ebp
ret 8
.set_ok.cur_dir:
mov byte [esi], 0
jmp .ret.ok
.doset_relative: .doset_relative:
add edx, 0x1000 cmp edx, edi
mov byte [esi], '/' jz .doset_relative.cur_dir
inc esi sub esi, edx
cmp esi, edx cmp esi, [esp+12]
jae .overflow_esi jae .fail
mov ecx, esi
mov esi, edx
mov edx, edi
rep movsb
jmp .doset_relative.copy
.doset_relative.cur_dir:
mov edi, esi
.doset_relative.copy:
add edx, [esp+12]
mov byte [edi], '/'
inc edi
cmp edi, edx
jae .overflow
@@: @@:
mov al, [ebx] mov al, [ebx]
inc ebx inc ebx
mov [esi], al stosb
inc esi
test al, al test al, al
jz .set_ok jz .ret.ok
cmp esi, edx cmp edi, edx
jb @b jb @b
.overflow_esi: .overflow:
mov byte [esi-1], 0 ; force null-terminated string dec edi
.set_ok: jmp .fail
ret
.set_absolute: .set_absolute:
lea esi, [ebx+1] lea esi, [ebx+1]
call process_replace_file_name call process_replace_file_name
mov edi, edx mov edi, [esp+8]
add edx, 0x1000 mov edx, [esp+12]
add edx, edi
.set_copy: .set_copy:
lodsb lodsb
stosb stosb
@ -1067,13 +1135,11 @@ sys_current_directory:
.set_copy_cont: .set_copy_cont:
cmp edi, edx cmp edi, edx
jb .set_copy jb .set_copy
.overflow_edi: jmp .overflow
mov byte [edi-1], 0
ret
.set_part2: .set_part2:
mov esi, ebp mov esi, ebp
xor ebp, ebp xor ebp, ebp
test esi, esi test esi, esi
jz .set_ok jz .ret.ok
mov byte [edi-1], '/' mov byte [edi-1], '/'
jmp .set_copy_cont jmp .set_copy_cont

View File

@ -5,7 +5,7 @@
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$ $Revision:1322 $
uglobal uglobal
@ -625,8 +625,8 @@ cd_get_name:
mov ebp,[cd_current_pointer_of_input_2] mov ebp,[cd_current_pointer_of_input_2]
mov [cd_current_pointer_of_input],ebp mov [cd_current_pointer_of_input],ebp
mov eax,[ebp] mov eax,[ebp]
cmp eax,0 ; âõîäû çàêîí÷èëèñü? test eax,eax ; âõîäû çàêîí÷èëèñü?
je .next_sector jz .next_sector
cmp ebp,CDDataBuf+2048 ; áóôåð çàêîí÷èëñÿ? cmp ebp,CDDataBuf+2048 ; áóôåð çàêîí÷èëñÿ?
jae .next_sector jae .next_sector
movzx eax, byte [ebp] movzx eax, byte [ebp]

File diff suppressed because it is too large Load Diff

View File

@ -33,7 +33,7 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
.1: .1:
; } \\ Alver \\ ; } \\ Alver \\
pushad pushad
call [disable_mouse] call [_display.disable_mouse]
movsx eax, bx ; eax=y movsx eax, bx ; eax=y
sar ebx, 16 ; ebx=x sar ebx, 16 ; ebx=x

View File

@ -68,10 +68,10 @@ ends
struct SKIN_BUTTONS struct SKIN_BUTTONS
.type dd ? .type dd ?
.pos: .pos:
.left dw ? .left dw ?
.top dw ? .top dw ?
.size: .size:
.width dw ? .width dw ?
.height dw ? .height dw ?
ends ends
@ -311,7 +311,6 @@ drawwindow_IV:
; shr esi,1 ; shr esi,1
; and esi,0x007f7f7f ; and esi,0x007f7f7f
mov esi,[ebp+SKIN_DATA.colors.outer] mov esi,[ebp+SKIN_DATA.colors.outer]
or [edi+WDATA.fl_wdrawn], 4
call draw_rectangle call draw_rectangle
mov ecx,3 mov ecx,3
_dw3l: _dw3l:
@ -455,12 +454,6 @@ drawwindow_IV:
no_skin_add_button: no_skin_add_button:
pop edi pop edi
and [edi+WDATA.fl_wdrawn], not 4
test [edi+WDATA.fl_wdrawn], 2
jz @f
call drawwindowframes2
@@:
popa popa
ret 4 ret 4

File diff suppressed because it is too large Load Diff

View File

@ -51,12 +51,13 @@ endg
draw_mouse_under: draw_mouse_under:
; return old picture ; return old picture
cmp [set_hw_cursor], 0 cmp [_display.restore_cursor], 0
jz @F je @F
pushad pushad
movzx eax,word [X_UNDER] movzx eax,word [X_UNDER]
movzx ebx,word [Y_UNDER] movzx ebx,word [Y_UNDER]
stdcall [hw_restore], eax, ebx stdcall [_display.restore_cursor], eax, ebx
popad popad
ret ret
@@: @@:
@ -97,7 +98,7 @@ mres:
save_draw_mouse: save_draw_mouse:
cmp [set_hw_cursor], 0 cmp [_display.move_cursor], 0
je .no_hw_cursor je .no_hw_cursor
pushad pushad
@ -111,28 +112,25 @@ save_draw_mouse:
mov ecx, [Screen_Max_X] mov ecx, [Screen_Max_X]
inc ecx inc ecx
mul ecx mul ecx
add eax, [_WinMapAddress]
movzx edx, byte [display_data+ebx+eax] movzx edx, byte [ebx+eax]
shl edx, 8 shl edx, 8
mov esi, [edx+SLOT_BASE+APPDATA.cursor] mov esi, [edx+SLOT_BASE+APPDATA.cursor]
cmp esi, [current_cursor] cmp esi, [current_cursor]
je .draw je .draw
; cmp [esi+CURSOR.magic], 'CURS'
; jne .fail
push esi push esi
call [select_hw_cursor] call [_display.select_cursor]
mov [current_cursor], esi mov [current_cursor], esi
.draw: .draw:
stdcall [set_hw_cursor], esi stdcall [_display.move_cursor], esi
popad popad
ret ret
.fail: .fail:
mov ecx, [def_cursor] mov ecx, [def_cursor]
mov [edx+SLOT_BASE+APPDATA.cursor], ecx mov [edx+SLOT_BASE+APPDATA.cursor], ecx
stdcall [set_hw_cursor], ecx ; stdcall: [esp]=ebx,eax stdcall [_display.move_cursor], ecx ; stdcall: [esp]=ebx,eax
popad popad
ret ret
@ -292,7 +290,7 @@ __sys_disable_mouse:
inc ecx inc ecx
imul ecx,ebx imul ecx,ebx
add ecx,eax add ecx,eax
add ecx, display_data add ecx, [_WinMapAddress]
mov eax, [CURRENT_TASK] mov eax, [CURRENT_TASK]
movzx ebx, byte [ecx] movzx ebx, byte [ecx]
cmp eax,ebx cmp eax,ebx

View File

@ -1,6 +1,6 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -17,157 +17,159 @@ $Revision$
; ebx =3 - set alarm-clock ecx - 00SSMMHH ; ebx =3 - set alarm-clock ecx - 00SSMMHH
; out: 0 -Ok 1 -wrong format 2 -battery low ; out: 0 -Ok 1 -wrong format 2 -battery low
sys_settime: sys_settime:
mov ecx,eax
cli cli
mov al,0x0d mov al,0x0d
out 0x70,al out 0x70,al
in al,0x71 in al,0x71
bt ax,7 bt ax,7
jnc bat_low jnc bat_low
cmp ecx,2 ;day of week cmp ebx,2 ;day of week
jne nosetweek jne nosetweek
test ebx,ebx ;test day of week test ecx,ecx ;test day of week
je wrongtime je wrongtime
cmp ebx,7 cmp ecx,7
ja wrongtime ja wrongtime
mov dx,0x70 mov edx,0x70
call startstopclk call startstopclk
dec edx dec edx
mov al,6 mov al,6
out dx,al out dx,al
inc edx inc edx
mov al,bl mov al,cl
out dx,al out dx,al
jmp endsettime jmp endsettime
nosetweek: ;set date nosetweek: ;set date
cmp ecx,1 cmp ebx,1
jne nosetdate jne nosetdate
cmp bl,0x99 ;test year cmp cl,0x99 ;test year
ja wrongtime ja wrongtime
shl ebx,4 shl ecx,4
cmp bl,0x90 cmp cl,0x90
ja wrongtime ja wrongtime
cmp bh,0x99 ;test month cmp ch,0x99 ;test month
ja wrongtime ja wrongtime
shr ebx,4 shr ecx,4
test bh,bh test ch,ch
je wrongtime je wrongtime
cmp bh,0x12 cmp ch,0x12
ja wrongtime ja wrongtime
shl ebx,8 shl ecx,8
bswap ebx ;ebx=00YYMMDD bswap ecx ;ebx=00YYMMDD
test bl,bl ;test day test cl,cl ;test day
je wrongtime je wrongtime
shl ebx,4 shl ecx,4
cmp bl,0x90 cmp cl,0x90
ja wrongtime ja wrongtime
shr ebx,4 shr ecx,4
cmp bh,2 ;February cmp ch,2 ;February
jne testday jne testday
cmp bl,0x29 cmp cl,0x29
ja wrongtime ja wrongtime
jmp setdate jmp setdate
testday: testday:
cmp bh,8 cmp ch,8
jb testday1 ;Aug-Dec jb testday1 ;Aug-Dec
bt bx,8 bt cx,8
jnc days31 jnc days31
jmp days30 jmp days30
testday1: testday1:
bt bx,8 ;Jan-Jul ex.Feb bt cx,8 ;Jan-Jul ex.Feb
jnc days30 jnc days30
days31: days31:
cmp bl,0x31 cmp cl,0x31
ja wrongtime ja wrongtime
jmp setdate jmp setdate
days30: days30:
cmp bl,0x30 cmp cl,0x30
ja wrongtime ja wrongtime
setdate: setdate:
mov dx,0x70 mov edx,0x70
call startstopclk call startstopclk
dec edx dec edx
mov al,7 ;set days mov al,7 ;set days
out dx,al out dx,al
inc edx inc edx
mov al,bl mov al,cl
out dx,al out dx,al
dec edx dec edx
mov al,8 ;set months mov al,8 ;set months
out dx,al out dx,al
inc edx inc edx
mov al,bh mov al,ch
out dx,al out dx,al
dec edx dec edx
mov al,9 ;set years mov al,9 ;set years
out dx,al out dx,al
inc edx inc edx
shr ebx,8 shr ecx,8
mov al,bh mov al,ch
out dx,al out dx,al
jmp endsettime jmp endsettime
nosetdate: ;set time or alarm-clock nosetdate: ;set time or alarm-clock
cmp ecx,3 cmp ebx,3
ja wrongtime ja wrongtime
cmp bl,0x23 cmp cl,0x23
ja wrongtime ja wrongtime
cmp bh,0x59 cmp ch,0x59
ja wrongtime ja wrongtime
shl ebx,4 shl ecx,4
cmp bl,0x90 cmp cl,0x90
ja wrongtime ja wrongtime
cmp bh,0x92 cmp ch,0x92
ja wrongtime ja wrongtime
shl ebx,4 shl ecx,4
bswap ebx ;00HHMMSS bswap ecx ;00HHMMSS
cmp bl,0x59 cmp cl,0x59
ja wrongtime ja wrongtime
shl ebx,4 shl ecx,4
cmp bl,0x90 cmp cl,0x90
ja wrongtime ja wrongtime
shr ebx,4 shr ecx,4
mov dx,0x70
mov edx,0x70
call startstopclk call startstopclk
dec edx dec edx
cmp ecx,3 cmp ebx,3
je setalarm
je setalarm
xor eax,eax ;al=0-set seconds xor eax,eax ;al=0-set seconds
out dx,al out dx,al
inc edx inc edx
mov al,bl mov al,cl
out dx,al out dx,al
dec edx dec edx
mov al,2 ;set minutes mov al,2 ;set minutes
out dx,al out dx,al
inc edx inc edx
mov al,bh mov al,ch
out dx,al out dx,al
dec edx dec edx
mov al,4 ;set hours mov al,4 ;set hours
out dx,al out dx,al
inc edx inc edx
shr ebx,8 shr ecx,8
mov al,bh mov al,ch
out dx,al out dx,al
jmp endsettime jmp endsettime
setalarm: setalarm:
mov al,1 ;set seconds for al. mov al,1 ;set seconds for al.
out dx,al out dx,al
inc edx inc edx
mov al,bl mov al,cl
out dx,al out dx,al
dec edx dec edx
mov al,3 ;set minutes for al. mov al,3 ;set minutes for al.
out dx,al out dx,al
inc edx inc edx
mov al,bh mov al,ch
out dx,al out dx,al
dec edx dec edx
mov al,5 ;set hours for al. mov al,5 ;set hours for al.
out dx,al out dx,al
inc edx inc edx
shr ebx,8 shr ecx,8
mov al,bh mov al,ch
out dx,al out dx,al
dec edx dec edx
mov al,0x0b ;enable irq's mov al,0x0b ;enable irq's
@ -180,15 +182,15 @@ sys_settime:
dec edx dec edx
call startstopclk call startstopclk
sti sti
mov [esp+36],dword 0 and [esp+36-4],dword 0
ret ret
bat_low: bat_low:
sti sti
mov [esp+36],dword 2 mov [esp+36-4],dword 2
ret ret
wrongtime: wrongtime:
sti sti
mov [esp+36],dword 1 mov [esp+36-4],dword 1
ret ret
startstopclk: startstopclk:

View File

@ -114,9 +114,9 @@ proc init_mem
mov edx, (OS_BASE/4096) mov edx, (OS_BASE/4096)
jmp .set jmp .set
@@: @@:
cmp edx, (HEAP_BASE+HEAP_MIN_SIZE)/4096 cmp edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096
jae .set jae .set
mov edx, (HEAP_BASE+HEAP_MIN_SIZE)/4096 mov edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096
.set: .set:
mov [pg_data.kernel_pages-OS_BASE], edx mov [pg_data.kernel_pages-OS_BASE], edx
shr edx, 10 shr edx, 10
@ -205,19 +205,18 @@ proc init_page_map
mov edi, [ebx] mov edi, [ebx]
shr edi, 12 ; edi = first page shr edi, 12 ; edi = first page
mov eax, edi mov eax, edi
neg eax
shr edi, 5 shr edi, 5
shl edi, 2
add edi, sys_pgmap-OS_BASE add edi, sys_pgmap-OS_BASE
and eax, 31 and eax, 31
jz .startok jz .startok
sub ecx, eax add ecx, eax
sub ecx, 32
jbe .onedword jbe .onedword
push ecx push ecx
mov ecx, eax mov ecx, eax
xor eax, eax or eax, -1
inc eax
shl eax, cl shl eax, cl
dec eax
or [edi], eax or [edi], eax
add edi, 4 add edi, 4
pop ecx pop ecx
@ -228,15 +227,17 @@ proc init_page_map
rep stosd rep stosd
pop ecx pop ecx
and ecx, 31 and ecx, 31
not eax neg eax
shl eax, cl shl eax, cl
dec eax
or [edi], eax or [edi], eax
jmp .next jmp .next
.onedword: .onedword:
add ecx, eax add ecx, 32
sub ecx, eax
@@: @@:
dec eax
bts [edi], eax bts [edi], eax
inc eax
loop @b loop @b
.next: .next:
add ebx, 20 add ebx, 20

File diff suppressed because it is too large Load Diff

View File

@ -98,6 +98,14 @@ struc TASKDATA
virtual at 0 virtual at 0
TASKDATA TASKDATA TASKDATA TASKDATA
end virtual end virtual
TSTATE_RUNNING = 0
TSTATE_RUN_SUSPENDED = 1
TSTATE_WAIT_SUSPENDED = 2
TSTATE_ZOMBIE = 3
TSTATE_TERMINATING = 4
TSTATE_WAITING = 5
TSTATE_FREE = 9
; structures definition ; structures definition
struc WDATA { struc WDATA {
@ -109,11 +117,12 @@ struc WDATA {
.fl_wstate db ? .fl_wstate db ?
.fl_wdrawn db ? .fl_wdrawn db ?
.fl_redraw db ? .fl_redraw db ?
.sizeof:
} }
virtual at 0 virtual at 0
WDATA WDATA WDATA WDATA
end virtual end virtual
label WDATA.fl_wstyle byte at 0x13 label WDATA.fl_wstyle byte at WDATA.cl_workarea + 3
struc APPDATA struc APPDATA
{ {
@ -141,7 +150,9 @@ struc APPDATA
.wait_begin dd ? ;+92 +++ .wait_begin dd ? ;+92 +++
.wait_test dd ? ;+96 +++ .wait_test dd ? ;+96 +++
.wait_param dd ? ;+100 +++ .wait_param dd ? ;+100 +++
db 24 dup(?) ;+104 .tls_base dd ? ;+104
.dlls_list_ptr dd ? ;+108
db 16 dup(?) ;+112
.wnd_shape dd ? ;+128 .wnd_shape dd ? ;+128
.wnd_shape_scale dd ? ;+132 .wnd_shape_scale dd ? ;+132

View File

@ -143,22 +143,24 @@ ReadNoteByte:
;result: ;result:
; al - note ; al - note
push eax push eax
push ebx
push ecx push ecx
push edx push edx
push esi
mov eax,[pidProcessNote] mov eax,[pidProcessNote]
call pid_to_slot call pid_to_slot
test eax,eax test eax,eax
jz .failed jz .failed
lea ebx,[esp+12] lea ecx,[esp+12]
mov ecx,1 mov edx,1
mov edx,[memAdrNote] mov esi,[memAdrNote]
inc [memAdrNote] inc [memAdrNote]
call read_process_memory call read_process_memory
.failed: .failed:
pop esi
pop edx pop edx
pop ecx pop ecx
pop ebx
pop eax pop eax
ret ret
;------------------- END CODE ------------------- ;------------------- END CODE -------------------

View File

@ -32,7 +32,7 @@ virtual at 0
end virtual end virtual
align 4 align 4
proc vesa_init_cursor stdcall, dst:dword, src:dword proc init_cursor stdcall, dst:dword, src:dword
locals locals
rBase dd ? rBase dd ?
pQuad dd ? pQuad dd ?
@ -290,7 +290,7 @@ endp
; ebx= src ; ebx= src
; ecx= flags ; ecx= flags
vesa_cursor: create_cursor:
.src equ esp .src equ esp
.flags equ esp+4 .flags equ esp+4
.hcursor equ esp+8 .hcursor equ esp+8
@ -300,7 +300,7 @@ vesa_cursor:
push ebx push ebx
mov ebx, eax mov ebx, eax
mov eax, CURSOR_SIZE mov eax, CURSOR.sizeof
call create_kernel_object call create_kernel_object
test eax, eax test eax, eax
jz .fail jz .fail
@ -330,7 +330,32 @@ vesa_cursor:
mov [edi+CURSOR.hot_x], ecx mov [edi+CURSOR.hot_x], ecx
mov [edi+CURSOR.hot_y], edx mov [edi+CURSOR.hot_y], edx
stdcall vesa_init_cursor, eax, esi stdcall init_cursor, eax, esi
mov eax, [.hcursor]
lea eax, [eax+CURSOR.list_next]
lea edx, [_display.cr_list.next]
pushfd
cli
mov ecx, [edx]
mov [eax], ecx
mov [eax+4], edx
mov [ecx+4], eax
mov [edx], eax
popfd
mov eax, [.hcursor]
.check_hw:
cmp [_display.init_cursor], 0
je .fail
push eax
call [_display.init_cursor]
add esp, 4
mov eax, [.hcursor] mov eax, [.hcursor]
.fail: .fail:
add esp, 12 add esp, 12
@ -346,8 +371,7 @@ vesa_cursor:
mov ecx, 1024 mov ecx, 1024
cld cld
rep movsd rep movsd
add esp, 12 jmp .check_hw
ret
align 4 align 4
proc load_cursor stdcall, src:dword, flags:dword proc load_cursor stdcall, src:dword, flags:dword
@ -377,7 +401,7 @@ proc load_cursor stdcall, src:dword, flags:dword
mov eax, [CURRENT_TASK+eax+4] mov eax, [CURRENT_TASK+eax+4]
mov ebx, [src] mov ebx, [src]
mov ecx, [flags] mov ecx, [flags]
call [create_cursor] ;eax, ebx, ecx call create_cursor ;eax, ebx, ecx
mov [handle], eax mov [handle], eax
cmp word [flags], LOAD_FROM_FILE cmp word [flags], LOAD_FROM_FILE
@ -407,8 +431,6 @@ proc delete_cursor stdcall, hcursor:dword
mov esi, [hcursor] mov esi, [hcursor]
cmp [esi+CURSOR.magic], 'CURS' cmp [esi+CURSOR.magic], 'CURS'
jne .fail jne .fail
; cmp [esi+CURSOR.size], CURSOR_SIZE
; jne .fail
mov ebx, [CURRENT_TASK] mov ebx, [CURRENT_TASK]
shl ebx, 5 shl ebx, 5
@ -443,127 +465,78 @@ destroy_cursor:
align 4 align 4
select_cursor: select_cursor:
mov eax, [esp+4]
mov [_display.cursor], eax
ret 4 ret 4
align 4
proc init_cursors
cmp [SCR_MODE],word 0x13
jbe .fail
test word [SCR_MODE], 0x4000
jz .fail
movzx eax, byte [ScreenBPP]
mov ebx, [BytesPerScanLine]
cmp eax, 32
jne @F
sub ebx, 128
jmp .init
@@:
cmp eax, 24
jne .fail
sub ebx, 96
.init:
mov [cur_def_interl], ebx
stdcall load_driver, szHwMouse
mov [hw_cursor], eax
test eax, eax
jz .sw_mouse
stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
mov [def_cursor], eax
ret
.sw_mouse:
mov [create_cursor], vesa_cursor
stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
mov [def_cursor], eax
mov ecx, [Screen_Max_X]
mov edx, [Screen_Max_Y]
inc ecx
inc edx
mov [scr_width], ecx
mov [scr_height], edx
movzx ebx, byte [ScreenBPP]
cmp ebx, 32
jne @F
mov dword [select_hw_cursor], select_cursor
mov dword [set_hw_cursor], cursor_32
mov dword [hw_restore], restore_32
ret
@@:
mov dword [select_hw_cursor], select_cursor
mov dword [set_hw_cursor], cursor_24
mov dword [hw_restore], restore_24
ret
.fail:
xor eax, eax
mov dword [select_hw_cursor], eax
mov dword [set_hw_cursor], eax
mov dword [hw_restore], eax
ret
endp
align 4 align 4
proc restore_24 stdcall, x:dword, y:dword proc restore_24 stdcall, x:dword, y:dword
locals
w dd ?
endl
mov edi, [cur_saved_base] push ebx
mov edx, [cur_saved_h]
mov ebx, [cur_saved_interl] mov ebx, [cur_saved_base]
mov edx, [cur.h]
test edx, edx test edx, edx
jz .ret jz .ret
push esi
push edi
mov esi, cur_saved_data mov esi, cur_saved_data
@@: mov ecx, [cur.w]
mov ecx, [cur_saved_w]
lea ecx, [ecx+ecx*2] lea ecx, [ecx+ecx*2]
push ecx
@@:
mov edi, ebx
add ebx, [BytesPerScanLine]
mov ecx, [esp]
rep movsb rep movsb
add edi, ebx
dec edx dec edx
jnz @B jnz @B
pop ecx
pop edi
pop esi
.ret: .ret:
pop ebx
ret ret
endp endp
align 4 align 4
proc restore_32 stdcall, x:dword, y:dword proc restore_32 stdcall, x:dword, y:dword
locals
w dd ?
endl
mov edi, [cur_saved_base] push ebx
mov edx, [cur_saved_h]
mov ebx, [cur_saved_interl] mov ebx, [cur_saved_base]
mov edx, [cur.h]
test edx, edx test edx, edx
jz .ret jz .ret
push esi
push edi
mov esi, cur_saved_data mov esi, cur_saved_data
@@: @@:
mov ecx, [cur_saved_w] mov edi, ebx
add ebx, [BytesPerScanLine]
mov ecx, [cur.w]
rep movsd rep movsd
add edi, ebx
dec edx dec edx
jnz @B jnz @B
pop edi
.ret: .ret:
pop esi
pop ebx
ret ret
endp endp
align 4 align 4
proc cursor_24 stdcall, hcursor:dword, x:dword, y:dword proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
locals locals
w dd ?
h dd ? h dd ?
st dd ?
_dx dd ? _dx dd ?
_dy dd ? _dy dd ?
endl endl
@ -575,87 +548,84 @@ proc cursor_24 stdcall, hcursor:dword, x:dword, y:dword
xor edx, edx xor edx, edx
sub ecx, [esi+CURSOR.hot_x] sub ecx, [esi+CURSOR.hot_x]
lea ebx, [ecx+32-1]
mov [x], ecx mov [x], ecx
sets dl sets dl
dec edx dec edx
and ecx, edx ;clip x to 0<=x and ecx, edx ;clip x to 0<=x
mov [cur.left], ecx
mov edi, ecx mov edi, ecx
sub edi, [x] sub edi, [x]
mov [_dx], edi mov [_dx], edi
xor edx, edx xor edx, edx
sub eax, [esi+CURSOR.hot_y] sub eax, [esi+CURSOR.hot_y]
lea edi, [eax+32-1]
mov [y], eax mov [y], eax
sets dl sets dl
dec edx dec edx
and eax, edx ;clip y to 0<=y and eax, edx ;clip y to 0<=y
mov edi, eax mov [cur.top], eax
sub edi, [y]
mov [_dy], edi
mul ebx
lea esi, [ecx+ecx*2]
add esi, [LFBAddress]
add esi, eax
mov [cur_saved_base],esi
mov edi, [scr_width]
mov edx, [scr_height]
mov eax, 32
sub edi, ecx
cmp edi, eax
jng @F
mov edi, eax
@@:
sub edi, [_dx]
sub edx, [y]
cmp edx, eax
jng @F
mov edx, eax mov edx, eax
sub edx, [y]
mov [_dy], edx
mul dword [BytesPerScanLine]
lea edx, [LFB_BASE+ecx*3]
add edx, eax
mov [cur_saved_base],edx
cmp ebx, [Screen_Max_X]
jbe @F
mov ebx, [Screen_Max_X]
@@: @@:
sub edx, [_dy] cmp edi, [Screen_Max_Y]
jbe @F
mov edi, [Screen_Max_Y]
@@:
mov [cur.right], ebx
mov [cur.bottom], edi
mov [w], edi sub ebx, [x]
mov [h], edx sub edi, [y]
mov [cur_saved_w], edi inc ebx
mov [cur_saved_h], edx inc edi
sub eax, edi mov [cur.w], ebx
shl eax, 2 ;lea eax, [eax+eax*2] mov [cur.h], edi
lea edi, [edi+edi*2] mov [h], edi
sub ebx, edi
mov [cur_saved_interl], ebx
mov eax, edi
mov edi, cur_saved_data mov edi, cur_saved_data
@@: @@:
mov ecx, [w] mov esi, edx
add edx, [BytesPerScanLine]
mov ecx, [cur.w]
lea ecx, [ecx+ecx*2] lea ecx, [ecx+ecx*2]
rep movsb rep movsb
add esi, ebx dec eax
dec edx
jnz @B jnz @B
;draw cursor ;draw cursor
mov edx, eax mov ebx, [cur_saved_base]
mov edi, [cur_saved_base]
mov eax, [_dy] mov eax, [_dy]
shl eax, 5 shl eax, 5
add eax, [_dx] add eax, [_dx]
shl eax, 2
mov esi, [hcursor] mov esi, [hcursor]
mov esi, [esi+CURSOR.base] mov esi, [esi+CURSOR.base]
add esi, eax lea edx, [esi+eax*4]
.row: .row:
mov ecx, [w] mov ecx, [cur.w]
mov esi, edx
mov edi, ebx
add edx, 32*4
add ebx, [BytesPerScanLine]
.pix: .pix:
lodsd lodsd
test eax, 0xFF000000 test eax, 0xFF000000
jz @F jz @F
mov [edi], ax
mov word [edi], ax
shr eax, 16 shr eax, 16
mov [edi+2],al mov [edi+2],al
@@: @@:
@ -663,19 +633,16 @@ proc cursor_24 stdcall, hcursor:dword, x:dword, y:dword
dec ecx dec ecx
jnz .pix jnz .pix
add esi, edx
add edi, ebx
dec [h] dec [h]
jnz .row jnz .row
ret ret
endp endp
align 4 align 4
proc cursor_32 stdcall, hcursor:dword, x:dword, y:dword proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
locals locals
w dd ?
h dd ? h dd ?
st dd ?
_dx dd ? _dx dd ?
_dy dd ? _dy dd ?
endl endl
@ -683,83 +650,80 @@ proc cursor_32 stdcall, hcursor:dword, x:dword, y:dword
mov esi, [hcursor] mov esi, [hcursor]
mov ecx, [x] mov ecx, [x]
mov eax, [y] mov eax, [y]
mov ebx, [BytesPerScanLine]
xor edx, edx xor edx, edx
sub ecx, [esi+CURSOR.hot_x] sub ecx, [esi+CURSOR.hot_x]
lea ebx, [ecx+32-1]
mov [x], ecx mov [x], ecx
sets dl sets dl
dec edx dec edx
and ecx, edx ;clip x to 0<=x and ecx, edx ;clip x to 0<=x
mov [cur.left], ecx
mov edi, ecx mov edi, ecx
sub edi, [x] sub edi, [x]
mov [_dx], edi mov [_dx], edi
xor edx, edx xor edx, edx
sub eax, [esi+CURSOR.hot_y] sub eax, [esi+CURSOR.hot_y]
lea edi, [eax+32-1]
mov [y], eax mov [y], eax
sets dl sets dl
dec edx dec edx
and eax, edx ;clip y to 0<=y and eax, edx ;clip y to 0<=y
mov edi, eax mov [cur.top], eax
sub edi, [y]
mov [_dy], edi
mul ebx
lea esi, [eax+ecx*4]
add esi, [LFBAddress]
mov [cur_saved_base],esi
mov edi, [scr_width]
mov edx, [scr_height]
mov eax, 32
sub edi, ecx
cmp edi, eax
jng @F
mov edi, eax
@@:
sub edi, [_dx]
sub edx, [y]
cmp edx, eax
jng @F
mov edx, eax mov edx, eax
sub edx, [y]
mov [_dy], edx
mul dword [BytesPerScanLine]
lea edx, [LFB_BASE+eax+ecx*4]
mov [cur_saved_base],edx
cmp ebx, [Screen_Max_X]
jbe @F
mov ebx, [Screen_Max_X]
@@: @@:
sub edx, [_dy] cmp edi, [Screen_Max_Y]
jbe @F
mov edi, [Screen_Max_Y]
@@:
mov [cur.right], ebx
mov [cur.bottom], edi
mov [w], edi sub ebx, [x]
mov [h], edx sub edi, [y]
mov [cur_saved_w], edi inc ebx
mov [cur_saved_h], edx inc edi
sub eax, edi mov [cur.w], ebx
shl eax, 2 mov [cur.h], edi
shl edi, 2 mov [h], edi
sub ebx, edi
mov [cur_saved_interl], ebx
mov eax, edi
mov edi, cur_saved_data mov edi, cur_saved_data
@@: @@:
mov ecx, [w] mov esi, edx
add edx, [BytesPerScanLine]
mov ecx, [cur.w]
rep movsd rep movsd
add esi, ebx dec eax
dec edx
jnz @B jnz @B
;draw cursor ;draw cursor
mov edx, eax mov ebx, [cur_saved_base]
mov edi, [cur_saved_base]
mov eax, [_dy] mov eax, [_dy]
shl eax, 5 shl eax, 5
add eax, [_dx] add eax, [_dx]
shl eax, 2
mov esi, [hcursor] mov esi, [hcursor]
mov esi, [esi+CURSOR.base] mov esi, [esi+CURSOR.base]
add esi, eax lea edx, [esi+eax*4]
.row: .row:
mov ecx, [w] mov ecx, [cur.w]
mov esi, edx
mov edi, ebx
add edx, 32*4
add ebx, [BytesPerScanLine]
.pix: .pix:
lodsd lodsd
test eax, 0xFF000000 test eax, 0xFF000000
@ -769,13 +733,73 @@ proc cursor_32 stdcall, hcursor:dword, x:dword, y:dword
add edi, 4 add edi, 4
dec ecx dec ecx
jnz .pix jnz .pix
add esi, edx
add edi, ebx
dec [h] dec [h]
jnz .row jnz .row
ret ret
endp endp
align 4
get_display:
mov eax, _display
ret
align 4
init_display:
xor eax, eax
mov edi, _display
mov [edi+display_t.init_cursor], eax
mov [edi+display_t.select_cursor], eax
mov [edi+display_t.show_cursor], eax
mov [edi+display_t.move_cursor], eax
mov [edi+display_t.restore_cursor], eax
lea ecx, [edi+display_t.cr_list.next]
mov [edi+display_t.cr_list.next], ecx
mov [edi+display_t.cr_list.prev], ecx
cmp [SCR_MODE],word 0x13
jbe .fail
test word [SCR_MODE], 0x4000
jz .fail
mov ebx, restore_32
mov ecx, move_cursor_32
movzx eax, byte [ScreenBPP]
cmp eax, 32
je @F
mov ebx, restore_24
mov ecx, move_cursor_24
cmp eax, 24
jne .fail
@@:
mov [_display.select_cursor], select_cursor
mov [_display.move_cursor], ecx
mov [_display.restore_cursor], ebx
stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
mov [def_cursor], eax
ret
.fail:
xor eax, eax
mov [_display.select_cursor], eax
mov [_display.move_cursor], eax
ret
align 4 align 4
def_arrow: def_arrow:
file 'arrow.cur' file 'arrow.cur'

View File

@ -242,7 +242,7 @@ end if
vesa12_drawbackground: vesa12_drawbackground:
call [disable_mouse] call [_display.disable_mouse]
push eax push eax
push ebx push ebx
@ -258,7 +258,7 @@ vesa12_drawbackground:
mov [imax],eax mov [imax],eax
mov eax,[draw_data+32+RECT.left] mov eax,[draw_data+32+RECT.left]
mov ebx,[draw_data+32+RECT.top] mov ebx,[draw_data+32+RECT.top]
mov edi,0 ;no force xor edi,edi ;no force
v12dp3: v12dp3:
@ -327,7 +327,8 @@ vesa12_drawbackground:
mov eax,[Screen_Max_X] mov eax,[Screen_Max_X]
add eax,1 add eax,1
mul ebx mul ebx
cmp [eax+esi+WinMapAddress],byte 1 add eax, [_WinMapAddress]
cmp [eax+esi],byte 1
jnz v12nbgp jnz v12nbgp
mov eax,[BytesPerScanLine] mov eax,[BytesPerScanLine]
mov ebx,edi mov ebx,edi
@ -386,7 +387,7 @@ vesa12_drawbackground:
vesa12_drawbar: vesa12_drawbar:
call [disable_mouse] call [_display.disable_mouse]
;; mov [novesachecksum],dword 0 ;; mov [novesachecksum],dword 0
sub edx,ebx sub edx,ebx
@ -494,7 +495,7 @@ dbpi24bit12:
sub eax,VGABasePtr sub eax,VGABasePtr
mov ebx,3 mov ebx,3
div ebx div ebx
add eax,WinMapAddress add eax, [_WinMapAddress]
mov ebx,[CURRENT_TASK] mov ebx,[CURRENT_TASK]
cld cld
@ -585,7 +586,7 @@ dbpi24bit12:
mov eax,edi mov eax,edi
sub eax,VGABasePtr sub eax,VGABasePtr
shr eax,2 shr eax,2
add eax,WinMapAddress add eax, [_WinMapAddress]
mov ebx,[CURRENT_TASK] mov ebx,[CURRENT_TASK]
cld cld
@ -753,7 +754,7 @@ vesa12_putimage:
; mov ecx,320*65536+240 ; mov ecx,320*65536+240
; mov edx,20*65536+20 ; mov edx,20*65536+20
call [disable_mouse] call [_display.disable_mouse]
mov [novesachecksum],dword 0 mov [novesachecksum],dword 0
push esi push esi
@ -830,7 +831,7 @@ vesa12_putimage:
sub edx,VGABasePtr sub edx,VGABasePtr
mov ebx,3 mov ebx,3
div ebx div ebx
add edx,WinMapAddress add edx, [_WinMapAddress]
mov ebx,[CURRENT_TASK] mov ebx,[CURRENT_TASK]
mov bh,[esp+4*3] mov bh,[esp+4*3]
@ -909,7 +910,7 @@ vesa12_putimage:
mov edx,edi mov edx,edi
sub edx,VGABasePtr sub edx,VGABasePtr
shr edx,2 shr edx,2
add edx,WinMapAddress add edx, [_WinMapAddress]
mov ebx,[CURRENT_TASK] mov ebx,[CURRENT_TASK]
mov bh,[esp+4*3] mov bh,[esp+4*3]

View File

@ -28,7 +28,6 @@ $Revision$
;BytesPerScanLine equ 0xfe08 ;BytesPerScanLine equ 0xfe08
;LFBAddress equ 0xfe80 ;LFBAddress equ 0xfe80
;ScreenBPP equ 0xfbf1 ;ScreenBPP equ 0xfbf1
;WinMapAddress equ 0x460000
@ -54,16 +53,14 @@ Vesa20_getpixel24:
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
lea edi, [eax+eax*2] ; edi = x*3 lea edi, [eax+eax*2] ; edi = x*3
add edi, ebx ; edi = x*3+(y*y multiplier) add edi, ebx ; edi = x*3+(y*y multiplier)
add edi, [LFBAddress] ; ebx = where pixel is in memory mov ecx, [LFB_BASE+edi]
mov ecx, [edi]
and ecx, 0xffffff and ecx, 0xffffff
ret ret
Vesa20_getpixel32: Vesa20_getpixel32:
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
lea edi, [ebx+eax*4] ; edi = x*4+(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, [LFB_BASE+edi]
mov ecx, [edi]
and ecx, 0xffffff and ecx, 0xffffff
ret ret
@ -106,7 +103,7 @@ align 16
vesa20_putimage: vesa20_putimage:
pushad pushad
call [disable_mouse] call [_display.disable_mouse]
sub esp, putimg.stack_data sub esp, putimg.stack_data
; save pointer to image ; save pointer to image
mov [putimg.pti], ebx mov [putimg.pti], ebx
@ -194,13 +191,12 @@ vesa20_putimage:
shr ebx, 3 shr ebx, 3
imul eax, ebx imul eax, ebx
add edx, eax add edx, eax
add edx, [LFBAddress]
; pointer to pixel map ; pointer to pixel map
mov eax, [putimg.abs_cy] mov eax, [putimg.abs_cy]
imul eax, [Screen_Max_X] imul eax, [Screen_Max_X]
add eax, [putimg.abs_cy] add eax, [putimg.abs_cy]
add eax, [putimg.abs_cx] add eax, [putimg.abs_cx]
add eax, WinMapAddress add eax, [_WinMapAddress]
xchg eax, ebp xchg eax, ebp
; get process number ; get process number
mov ebx, [CURRENT_TASK] mov ebx, [CURRENT_TASK]
@ -220,9 +216,9 @@ align 4
cmp [ebp], bl cmp [ebp], bl
jne .skip jne .skip
; mov eax, [esi] ; eax = RRBBGGRR ; mov eax, [esi] ; eax = RRBBGGRR
mov [edx], ax mov [LFB_BASE+edx], ax
shr eax, 16 shr eax, 16
mov [edx+2], al mov [LFB_BASE+edx+2], al
.skip: .skip:
; add esi, 3 ;[putimg.source_bpp] ; add esi, 3 ;[putimg.source_bpp]
add edx, 3 add edx, 3
@ -265,7 +261,7 @@ align 4
cmp [ebp], bl cmp [ebp], bl
jne .skip jne .skip
; mov eax, [esi] ; ecx = RRBBGGRR ; mov eax, [esi] ; ecx = RRBBGGRR
mov [edx], eax mov [LFB_BASE+edx], eax
.skip: .skip:
; add esi, [putimg.source_bpp] ; add esi, [putimg.source_bpp]
add edx, 4 add edx, 4
@ -308,20 +304,25 @@ __sys_putpixel:
;;; mov [novesachecksum], dword 0 ;;; mov [novesachecksum], dword 0
pushad pushad
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
.forced:
cmp [Screen_Max_X], eax cmp [Screen_Max_X], eax
jb .exit jb .exit
cmp [Screen_Max_Y], ebx cmp [Screen_Max_Y], ebx
jb .exit jb .exit
.ok: test edi,1 ; force ?
jnz .forced
; not forced:
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:
; check if negation ; check if negation
test ecx,0x01000000 test ecx,0x01000000
jz .noneg jz .noneg
@ -342,11 +343,9 @@ Vesa20_putpixel24:
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
lea edi, [eax+eax*2] ; edi = x*3 lea edi, [eax+eax*2] ; edi = x*3
mov eax, [esp+32-8+4] mov eax, [esp+32-8+4]
add edi, [LFBAddress] mov [LFB_BASE+ebx+edi], ax
add edi, ebx ; ebx = where to put pixel in memory
mov [edi], ax
shr eax, 16 shr eax, 16
mov [edi+2], al mov [LFB_BASE+ebx+edi+2], al
ret ret
@ -357,8 +356,7 @@ Vesa20_putpixel32:
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier) lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier)
mov eax, [esp+32-8+4] ; eax = color mov eax, [esp+32-8+4] ; eax = color
add edi, [LFBAddress] ; ebx = where to put pixel in memory mov [LFB_BASE+edi], eax
mov [edi], eax
ret ret
;************************************************* ;*************************************************
@ -378,7 +376,7 @@ calculate_edi:
align 4 align 4
__sys_draw_line: __sys_draw_line:
; inc [mouse_pause] ; inc [mouse_pause]
call [disable_mouse] call [_display.disable_mouse]
; draw a line ; draw a line
; eax = HIWORD = x1 ; eax = HIWORD = x1
@ -568,7 +566,7 @@ align 4
; edi color ; edi color
vesa20_drawbar: vesa20_drawbar:
pushad pushad
call [disable_mouse] call [_display.disable_mouse]
sub esp, drbar.stack_data sub esp, drbar.stack_data
mov [drbar.color], edi mov [drbar.color], edi
sub edx, ebx sub edx, ebx
@ -643,13 +641,12 @@ vesa20_drawbar:
; shr ebx, 3 ; shr ebx, 3
imul eax, ebx imul eax, ebx
add edx, eax add edx, eax
add edx, [LFBAddress]
; pointer to pixel map ; pointer to pixel map
mov eax, [drbar.abs_cy] mov eax, [drbar.abs_cy]
imul eax, [Screen_Max_X] imul eax, [Screen_Max_X]
add eax, [drbar.abs_cy] add eax, [drbar.abs_cy]
add eax, [drbar.abs_cx] add eax, [drbar.abs_cx]
add eax, WinMapAddress add eax, [_WinMapAddress]
xchg eax, ebp xchg eax, ebp
; get process number ; get process number
mov ebx, [CURRENT_TASK] mov ebx, [CURRENT_TASK]
@ -674,8 +671,9 @@ align 4
.new_x: .new_x:
cmp byte [ebp], bl cmp byte [ebp], bl
jne .skip jne .skip
mov [edx], bh
mov [edx + 1], ax mov [LFB_BASE+edx], bh
mov [LFB_BASE+edx + 1], ax
.skip: .skip:
; add pixel ; add pixel
add edx, 3 add edx, 3
@ -710,7 +708,8 @@ align 4
.new_x: .new_x:
cmp byte [ebp], bl cmp byte [ebp], bl
jne .skip jne .skip
mov [edx], eax
mov [LFB_BASE+edx], eax
.skip: .skip:
; add pixel ; add pixel
add edx, 4 add edx, 4
@ -737,62 +736,9 @@ align 4
mov [EGA_counter],1 mov [EGA_counter],1
ret ret
;voodoodbcplimit: align 4
; 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
vesa20_drawbackground_tiled: vesa20_drawbackground_tiled:
call [disable_mouse] call [_display.disable_mouse]
pushad pushad
; External loop for all y from start to end ; External loop for all y from start to end
mov ebx, [draw_data+32+RECT.top] ; y start mov ebx, [draw_data+32+RECT.top] ; y start
@ -810,10 +756,11 @@ dp2:
jz @f jz @f
add ebp, eax add ebp, eax
@@: @@:
add ebp, [LFBAddress] add ebp, LFB_BASE
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi call calculate_edi
xchg edi, ebp xchg edi, ebp
add ebp, [_WinMapAddress]
; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress ; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress
; 2) Calculate offset in background memory block ; 2) Calculate offset in background memory block
push eax push eax
@ -842,7 +789,7 @@ dp2:
; esi -> bgr memory, edi -> output ; esi -> bgr memory, edi -> output
; ebp = offset in WinMapAddress ; ebp = offset in WinMapAddress
dp3: dp3:
cmp [ebp+WinMapAddress], dl cmp [ebp], dl
jnz nbgp jnz nbgp
movsb movsb
movsb movsb
@ -881,7 +828,7 @@ dp4:
vesa20_drawbackground_stretch: vesa20_drawbackground_stretch:
call [disable_mouse] call [_display.disable_mouse]
pushad pushad
; Helper variables ; Helper variables
; calculate 2^32*(BgrDataWidth-1) mod (ScreenWidth-1) ; calculate 2^32*(BgrDataWidth-1) mod (ScreenWidth-1)
@ -917,7 +864,6 @@ vesa20_drawbackground_stretch:
jz @f jz @f
add ebp, eax add ebp, eax
@@: @@:
add ebp, [LFBAddress]
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi call calculate_edi
xchg edi, ebp xchg edi, ebp
@ -985,7 +931,8 @@ sdp3:
; qword [esp+28] = 2^32*(BgrDataHeight-1)/(ScreenHeight-1) ; qword [esp+28] = 2^32*(BgrDataHeight-1)/(ScreenHeight-1)
; qword [esp+36] = 2^32*(BgrDataWidth-1)/(ScreenWidth-1) ; qword [esp+36] = 2^32*(BgrDataWidth-1)/(ScreenWidth-1)
sdp3a: sdp3a:
cmp [ebp+WinMapAddress], byte 1 mov eax, [_WinMapAddress]
cmp [ebp+eax], byte 1
jnz snbgp jnz snbgp
mov eax, [bgr_cur_line+esi] mov eax, [bgr_cur_line+esi]
test ecx, ecx test ecx, ecx
@ -993,9 +940,11 @@ sdp3a:
mov ebx, [bgr_next_line+esi] mov ebx, [bgr_next_line+esi]
call [overlapping_of_points_ptr] call [overlapping_of_points_ptr]
.novert: .novert:
mov [edi], ax
mov [LFB_BASE+edi], ax
shr eax, 16 shr eax, 16
mov [edi+2], al
mov [LFB_BASE+edi+2], al
snbgp: snbgp:
cmp [ScreenBPP], byte 25 cmp [ScreenBPP], byte 25
sbb edi, -4 sbb edi, -4

View File

@ -175,8 +175,8 @@ checkVga_N13:
cld cld
m13pix: m13pix:
lodsd lodsd
cmp eax,0 test eax,eax
je .save_pixel jz .save_pixel
push eax push eax
mov ebx,eax mov ebx,eax
and eax,(128+64+32) ; blue and eax,(128+64+32) ; blue
@ -259,8 +259,8 @@ VGA_draw_32_pixels:
mov cl,8 mov cl,8
.convert_pixels_to_VGA: .convert_pixels_to_VGA:
lodsd ; eax = 24bit colour lodsd ; eax = 24bit colour
cmp eax,0 test eax,eax
je .end jz .end
rol eax,8 rol eax,8
mov al,ch mov al,ch
ror eax,8 ror eax,8
@ -335,8 +335,8 @@ VGA_putpixel:
pushfd pushfd
; edi = address, eax = 24bit colour, ecx = bit no. (modulo 8) ; edi = address, eax = 24bit colour, ecx = bit no. (modulo 8)
xor edx,edx xor edx,edx
cmp eax,0 test eax,eax
je .p13cont jz .p13cont
cmp al,85 cmp al,85
jbe .p13green jbe .p13green
or dl,0x01 or dl,0x01

View File

@ -24,15 +24,16 @@ uglobal
old_screen_height dd ? old_screen_height dd ?
endg endg
cmp eax,13 ; CALL VIDEOMODE DRIVER FUNCTIONS ; cmp eax,13 ; CALL VIDEOMODE DRIVER FUNCTIONS
jne .no_vmode_drv_access dec ebx
jnz .no_vmode_drv_access
pushd [Screen_Max_X] [Screen_Max_Y] pushd [Screen_Max_X] [Screen_Max_Y]
popd [old_screen_height] [old_screen_width] popd [old_screen_height] [old_screen_width]
or eax,-1 ; If driver is absent then eax does not change or eax,-1 ; If driver is absent then eax does not change
call (VMODE_BASE+0x100) ; Entry point of video driver call (VMODE_BASE+0x100) ; Entry point of video driver
mov [esp+36],eax mov [esp+36-4],eax
mov [esp+24],ebx mov [esp+24-4],ebx
mov [esp+32],ecx mov [esp+32-4],ecx
; mov [esp+28],edx ; mov [esp+28],edx
mov eax,[old_screen_width] mov eax,[old_screen_width]
mov ebx,[old_screen_height] mov ebx,[old_screen_height]
@ -46,8 +47,8 @@ endg
sub [screen_workarea.bottom],ebx sub [screen_workarea.bottom],ebx
call repos_windows call repos_windows
mov eax, 0 xor eax,eax
mov ebx, 0 xor ebx,ebx
mov ecx, [Screen_Max_X] mov ecx, [Screen_Max_X]
mov edx, [Screen_Max_Y] mov edx, [Screen_Max_Y]
call calculatescreen call calculatescreen