forked from KolibriOS/kolibrios
sync with trunk
git-svn-id: svn://kolibrios.org@1376 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
3f03a80e3e
commit
d003a8b8fe
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
@ -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
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
223
kernel/branches/net/core/test_malloc.asm
Normal file
223
kernel/branches/net/core/test_malloc.asm
Normal 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:
|
@ -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
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
|
||||||
;-----------------------------------------------------------------------------
|
;-----------------------------------------------------------------------------
|
||||||
|
@ -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
|
||||||
@@:
|
@@:
|
||||||
|
@ -169,6 +169,7 @@ reserve_hd_channel:
|
|||||||
call clear_hd_cache
|
call clear_hd_cache
|
||||||
@@:
|
@@:
|
||||||
pop eax
|
pop eax
|
||||||
|
sti
|
||||||
.ret:
|
.ret:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
@ -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
|
||||||
|
@ -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
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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
@ -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
|
||||||
|
@ -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 -------------------
|
||||||
|
@ -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'
|
||||||
|
@ -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]
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user