forked from KolibriOS/kolibrios
tag for Kolibri 0.5.3.0
git-svn-id: svn://kolibrios.org@60 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
8eba058ee9
commit
0ea1d629b0
261
kernel/tags/kolibri0.5.3.0/blkdev/cdrom.inc
Normal file
261
kernel/tags/kolibri0.5.3.0/blkdev/cdrom.inc
Normal file
@ -0,0 +1,261 @@
|
||||
sys_cd_audio:
|
||||
|
||||
cmp word [cdbase],word 0
|
||||
jnz @f
|
||||
mov eax,1
|
||||
ret
|
||||
@@:
|
||||
|
||||
; eax=1 cdplay at ebx 0x00FFSSMM
|
||||
; eax=2 get tracklist size of ecx to [ebx]
|
||||
; eax=3 stop/pause playing
|
||||
|
||||
cmp eax,1
|
||||
jnz nocdp
|
||||
call sys_cdplay
|
||||
ret
|
||||
nocdp:
|
||||
|
||||
cmp eax,2
|
||||
jnz nocdtl
|
||||
mov edi,[0x3010]
|
||||
add edi,0x10
|
||||
add ebx,[edi]
|
||||
call sys_cdtracklist
|
||||
ret
|
||||
nocdtl:
|
||||
|
||||
cmp eax,3
|
||||
jnz nocdpause
|
||||
call sys_cdpause
|
||||
ret
|
||||
nocdpause:
|
||||
|
||||
mov eax,0xffffff01
|
||||
ret
|
||||
|
||||
|
||||
|
||||
sys_cd_atapi_command:
|
||||
|
||||
pushad
|
||||
|
||||
mov dx,word [cdbase]
|
||||
add dx,6
|
||||
mov ax,word [cdid]
|
||||
out dx,al
|
||||
mov esi,10
|
||||
call delay_ms
|
||||
mov dx,word [cdbase]
|
||||
add dx,7
|
||||
in al,dx
|
||||
and al,0x80
|
||||
cmp al,0
|
||||
jnz res
|
||||
jmp cdl6
|
||||
res:
|
||||
mov dx,word [cdbase]
|
||||
add dx,7
|
||||
mov al,0x8
|
||||
out dx,al
|
||||
mov dx,word [cdbase]
|
||||
add dx,0x206
|
||||
mov al,0xe
|
||||
out dx,al
|
||||
mov esi,1
|
||||
call delay_ms
|
||||
mov dx,word [cdbase]
|
||||
add dx,0x206
|
||||
mov al,0x8
|
||||
out dx,al
|
||||
mov esi,30
|
||||
call delay_ms
|
||||
xor cx,cx
|
||||
cdl5:
|
||||
inc cx
|
||||
cmp cx,10
|
||||
jz cdl6
|
||||
mov dx,word [cdbase]
|
||||
add dx,7
|
||||
in al,dx
|
||||
and al,0x88
|
||||
cmp al,0x00
|
||||
jz cdl5
|
||||
mov esi,100
|
||||
call delay_ms
|
||||
jmp cdl5
|
||||
cdl6:
|
||||
mov dx,word [cdbase]
|
||||
add dx,4
|
||||
mov al,0
|
||||
out dx,al
|
||||
mov dx,word [cdbase]
|
||||
add dx,5
|
||||
mov al,0
|
||||
out dx,al
|
||||
mov dx,word [cdbase]
|
||||
add dx,7
|
||||
mov al,0xec
|
||||
out dx,al
|
||||
mov esi,5
|
||||
call delay_ms
|
||||
mov dx,word [cdbase]
|
||||
add dx,1
|
||||
mov al,0
|
||||
out dx,al
|
||||
add dx,1
|
||||
mov al,0
|
||||
out dx,al
|
||||
add dx,1
|
||||
mov al,0
|
||||
out dx,al
|
||||
add dx,1
|
||||
mov al,0
|
||||
out dx,al
|
||||
add dx,1
|
||||
mov al,128
|
||||
out dx,al
|
||||
add dx,2
|
||||
mov al,0xa0
|
||||
out dx,al
|
||||
xor cx,cx
|
||||
mov dx,word [cdbase]
|
||||
add dx,7
|
||||
cdl1:
|
||||
inc cx
|
||||
cmp cx,100
|
||||
jz cdl2
|
||||
in al,dx
|
||||
and ax,0x88
|
||||
cmp al,0x8
|
||||
jz cdl2
|
||||
mov esi,2
|
||||
call delay_ms
|
||||
jmp cdl1
|
||||
cdl2:
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
sys_cdplay:
|
||||
|
||||
mov ax,5
|
||||
push ax
|
||||
push ebx
|
||||
cdplay:
|
||||
call sys_cd_atapi_command
|
||||
cli
|
||||
mov dx,word [cdbase]
|
||||
mov ax,0x0047
|
||||
out dx,ax
|
||||
mov al,1
|
||||
mov ah,[esp+0] ; min xx
|
||||
out dx,ax
|
||||
mov ax,[esp+1] ; fr sec
|
||||
out dx,ax
|
||||
mov ax,256+99
|
||||
out dx,ax
|
||||
mov ax,0x0001
|
||||
out dx,ax
|
||||
mov ax,0x0000
|
||||
out dx,ax
|
||||
mov esi,10
|
||||
call delay_ms
|
||||
sti
|
||||
add dx,7
|
||||
in al,dx
|
||||
test al,1
|
||||
jz cdplayok
|
||||
mov ax,[esp+4]
|
||||
dec ax
|
||||
mov [esp+4],ax
|
||||
cmp ax,0
|
||||
jz cdplayfail
|
||||
jmp cdplay
|
||||
cdplayfail:
|
||||
cdplayok:
|
||||
pop ebx
|
||||
pop ax
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
|
||||
sys_cdtracklist:
|
||||
|
||||
push ebx
|
||||
tcdplay:
|
||||
call sys_cd_atapi_command
|
||||
mov dx,word [cdbase]
|
||||
mov ax,0x43+2*256
|
||||
out dx,ax
|
||||
mov ax,0x0
|
||||
out dx,ax
|
||||
mov ax,0x0
|
||||
out dx,ax
|
||||
mov ax,0x0
|
||||
out dx,ax
|
||||
mov ax,200
|
||||
out dx,ax
|
||||
mov ax,0x0
|
||||
out dx,ax
|
||||
in al,dx
|
||||
mov cx,1000
|
||||
mov dx,word [cdbase]
|
||||
add dx,7
|
||||
cld
|
||||
cdtrnwewait:
|
||||
mov esi,10
|
||||
call delay_ms
|
||||
in al,dx
|
||||
and al,128
|
||||
cmp al,0
|
||||
jz cdtrl1
|
||||
loop cdtrnwewait
|
||||
cdtrl1:
|
||||
; read the result
|
||||
mov ecx,[esp+0]
|
||||
mov dx,word [cdbase]
|
||||
cdtrread:
|
||||
add dx,7
|
||||
in al,dx
|
||||
and al,8
|
||||
cmp al,8
|
||||
jnz cdtrdone
|
||||
sub dx,7
|
||||
in ax,dx
|
||||
mov [ecx],ax
|
||||
add ecx,2
|
||||
jmp cdtrread
|
||||
cdtrdone:
|
||||
pop ecx
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
|
||||
sys_cdpause:
|
||||
|
||||
call sys_cd_atapi_command
|
||||
|
||||
mov dx,word [cdbase]
|
||||
mov ax,0x004B
|
||||
out dx,ax
|
||||
mov ax,0
|
||||
out dx,ax
|
||||
mov ax,0
|
||||
out dx,ax
|
||||
mov ax,0
|
||||
out dx,ax
|
||||
mov ax,0
|
||||
out dx,ax
|
||||
mov ax,0
|
||||
out dx,ax
|
||||
|
||||
mov esi,10
|
||||
call delay_ms
|
||||
add dx,7
|
||||
in al,dx
|
||||
|
||||
xor eax, eax
|
||||
ret
|
||||
|
73
kernel/tags/kolibri0.5.3.0/blkdev/fdc.inc
Normal file
73
kernel/tags/kolibri0.5.3.0/blkdev/fdc.inc
Normal file
@ -0,0 +1,73 @@
|
||||
iglobal
|
||||
;function pointers.
|
||||
fdc_irq_func dd fdc_null
|
||||
endg
|
||||
|
||||
uglobal
|
||||
dmasize db 0x0
|
||||
dmamode db 0x0
|
||||
endg
|
||||
|
||||
fdc_init: ;start with clean tracks.
|
||||
mov edi,0xD201
|
||||
mov al,0
|
||||
mov ecx,160
|
||||
rep stosb
|
||||
ret
|
||||
|
||||
fdc_filesave: ;ebx: cluster to be saved.
|
||||
pusha ;returns immediately. does not trigger a write.
|
||||
mov eax,ebx
|
||||
add eax,31
|
||||
mov bl,18
|
||||
div bl
|
||||
mov ah,0
|
||||
add eax,0xD201
|
||||
mov [eax],byte 1 ;This track is now dirty.
|
||||
popa
|
||||
ret
|
||||
|
||||
fdc_irq:
|
||||
call [fdc_irq_func]
|
||||
fdc_null:
|
||||
ret
|
||||
|
||||
save_image:
|
||||
call reserve_flp
|
||||
call restorefatchain
|
||||
pusha
|
||||
call check_label
|
||||
cmp [FDC_Status],0
|
||||
jne unnecessary_save_image
|
||||
mov [FDD_Track],0 ; Öèëèíäð
|
||||
mov [FDD_Head],0 ; Ñòîðîíà
|
||||
mov [FDD_Sector],1 ; Ñåêòîð
|
||||
mov esi,0x100000
|
||||
call SeekTrack
|
||||
save_image_1:
|
||||
push esi
|
||||
call take_data_from_application_1
|
||||
pop esi
|
||||
add esi,512
|
||||
call WriteSectWithRetr
|
||||
; call WriteSector
|
||||
cmp [FDC_Status],0
|
||||
jne unnecessary_save_image
|
||||
inc [FDD_Sector]
|
||||
cmp [FDD_Sector],19
|
||||
jne save_image_1
|
||||
mov [FDD_Sector],1
|
||||
inc [FDD_Head]
|
||||
cmp [FDD_Head],2
|
||||
jne save_image_1
|
||||
mov [FDD_Head],0
|
||||
inc [FDD_Track]
|
||||
call SeekTrack
|
||||
cmp [FDD_Track],80
|
||||
jne save_image_1
|
||||
unnecessary_save_image:
|
||||
mov [fdc_irq_func],fdc_null
|
||||
popa
|
||||
mov [flp_status],0
|
||||
ret
|
||||
|
613
kernel/tags/kolibri0.5.3.0/blkdev/flp_drv.inc
Normal file
613
kernel/tags/kolibri0.5.3.0/blkdev/flp_drv.inc
Normal file
@ -0,0 +1,613 @@
|
||||
;**********************************************************
|
||||
; Непосредственная работа с контроллером гибкого диска
|
||||
;**********************************************************
|
||||
; Автор исходного текста Кулаков Владимир Геннадьевич.
|
||||
; Адаптация и доработка Mario79
|
||||
|
||||
give_back_application_data: ; переслать приложению
|
||||
mov edi,[3010h]
|
||||
mov edi,[edi+10h]
|
||||
add edi,ecx
|
||||
give_back_application_data_1:
|
||||
mov esi,0xD000 ;FDD_DataBuffer ;0x40000
|
||||
xor ecx,ecx
|
||||
mov cx,128
|
||||
cld
|
||||
rep movsd
|
||||
ret
|
||||
|
||||
take_data_from_application: ; взять из приложения
|
||||
mov esi,[3010h]
|
||||
mov esi,[esi+10h]
|
||||
add esi,ecx
|
||||
take_data_from_application_1:
|
||||
mov edi,0xD000 ;FDD_DataBuffer ;0x40000
|
||||
xor ecx,ecx
|
||||
mov cx,128
|
||||
cld
|
||||
rep movsd
|
||||
ret
|
||||
|
||||
; Коды завершения операции с контроллером (FDC_Status)
|
||||
FDC_Normal equ 0 ;нормальное завершение
|
||||
FDC_TimeOut equ 1 ;ошибка тайм-аута
|
||||
FDC_DiskNotFound equ 2 ;в дисководе нет диска
|
||||
FDC_TrackNotFound equ 3 ;дорожка не найдена
|
||||
FDC_SectorNotFound equ 4 ;сектор не найден
|
||||
|
||||
; Максимальные значения координат сектора (заданные
|
||||
; значения соответствуют параметрам стандартного
|
||||
; трехдюймового гибкого диска объемом 1,44 Мб)
|
||||
MAX_Track equ 79
|
||||
MAX_Head equ 1
|
||||
MAX_Sector equ 18
|
||||
|
||||
; Счетчик тиков таймера
|
||||
TickCounter dd ?
|
||||
; Код завершения операции с контроллером НГМД
|
||||
FDC_Status DB ?
|
||||
; Флаг прерывания от НГМД
|
||||
FDD_IntFlag DB ?
|
||||
; Момент начала последней операции с НГМД
|
||||
FDD_Time DD ?
|
||||
; Номер дисковода
|
||||
FDD_Type db 0
|
||||
; Координаты сектора
|
||||
FDD_Track DB ?
|
||||
FDD_Head DB ?
|
||||
FDD_Sector DB ?
|
||||
|
||||
; Блок результата операции
|
||||
FDC_ST0 DB ?
|
||||
FDC_ST1 DB ?
|
||||
FDC_ST2 DB ?
|
||||
FDC_C DB ?
|
||||
FDC_H DB ?
|
||||
FDC_R DB ?
|
||||
FDC_N DB ?
|
||||
; Счетчик повторения операции чтения
|
||||
ReadRepCounter DB ?
|
||||
; Счетчик повторения операции рекалибровки
|
||||
RecalRepCounter DB ?
|
||||
; Область памяти для хранения прочитанного сектора
|
||||
;FDD_DataBuffer: times 512 db 0 ;DB 512 DUP (?)
|
||||
fdd_motor_status db 0
|
||||
timer_fdd_motor dd 0
|
||||
|
||||
;*************************************
|
||||
;* ИНИЦИАЛИЗАЦИЯ РЕЖИМА ПДП ДЛЯ НГМД *
|
||||
;*************************************
|
||||
Init_FDC_DMA:
|
||||
pushad
|
||||
mov al,0
|
||||
out 0x0c,al ; reset the flip-flop to a known state.
|
||||
mov al,6 ; mask channel 2 so we can reprogram it.
|
||||
out 0x0a,al
|
||||
mov al,[dmamode] ; 0x46 -> Read from floppy - 0x4A Write to floppy
|
||||
out 0x0b,al
|
||||
mov al,0
|
||||
out 0x0c,al ; reset the flip-flop to a known state.
|
||||
mov eax,0xD000
|
||||
out 0x04,al ; set the channel 2 starting address to 0
|
||||
shr eax,8
|
||||
out 0x04,al
|
||||
shr eax,8
|
||||
out 0x81,al
|
||||
mov al,0
|
||||
out 0x0c, al ; reset flip-flop
|
||||
mov al, 0xff ;set count (actual size -1)
|
||||
out 0x5, al
|
||||
mov al,0x1 ;[dmasize] ;(0x1ff = 511 / 0x23ff =9215)
|
||||
out 0x5,al
|
||||
mov al,2
|
||||
out 0xa,al
|
||||
popad
|
||||
ret
|
||||
|
||||
;***********************************
|
||||
;* ЗАПИСАТЬ БАЙТ В ПОРТ ДАННЫХ FDC *
|
||||
;* Параметры: *
|
||||
;* AL - выводимый байт. *
|
||||
;***********************************
|
||||
FDCDataOutput:
|
||||
; pusha
|
||||
push ax cx dx
|
||||
mov AH,AL ;запомнить байт в AH
|
||||
; Сбросить переменную состояния контроллера
|
||||
mov [FDC_Status],FDC_Normal
|
||||
; Проверить готовность контроллера к приему данных
|
||||
mov DX,3F4h ;(порт состояния FDC)
|
||||
xor CX,CX ;установить счетчик тайм-аута
|
||||
@@TestRS:
|
||||
in AL,DX ;прочитать регистр RS
|
||||
and AL,0C0h ;выделить разряды 6 и 7
|
||||
cmp AL,80h ;проверить разряды 6 и 7
|
||||
je @@OutByteToFDC
|
||||
loop @@TestRS
|
||||
; Ошибка тайм-аута
|
||||
mov [FDC_Status],FDC_TimeOut
|
||||
jmp @@End_5
|
||||
; Вывести байт в порт данных
|
||||
@@OutByteToFDC:
|
||||
inc DX
|
||||
mov AL,AH
|
||||
out DX,AL
|
||||
@@End_5:
|
||||
; popa
|
||||
pop dx cx ax
|
||||
ret
|
||||
|
||||
;******************************************
|
||||
;* ПРОЧИТАТЬ БАЙТ ИЗ ПОРТА ДАННЫХ FDC *
|
||||
;* Процедура не имеет входных параметров. *
|
||||
;* Выходные данные: *
|
||||
;* AL - считанный байт. *
|
||||
;******************************************
|
||||
FDCDataInput:
|
||||
push ECX
|
||||
push DX
|
||||
; Сбросить переменную состояния контроллера
|
||||
mov [FDC_Status],FDC_Normal
|
||||
; Проверить готовность контроллера к передаче данных
|
||||
mov DX,3F4h ;(порт состояния FDC)
|
||||
xor CX,CX ;установить счетчик тайм-аута
|
||||
@@TestRS_1:
|
||||
in AL,DX ;прочитать регистр RS
|
||||
and AL,0C0h ;выдлить разряды 6 и 7
|
||||
cmp AL,0C0h ;проверить разряды 6 и 7
|
||||
je @@GetByteFromFDC
|
||||
loop @@TestRS_1
|
||||
; Ошибка тайм-аута
|
||||
mov [FDC_Status],FDC_TimeOut
|
||||
jmp @@End_6
|
||||
; Ввести байт из порта данных
|
||||
@@GetByteFromFDC:
|
||||
inc DX
|
||||
in AL,DX
|
||||
@@End_6: pop DX
|
||||
pop ECX
|
||||
ret
|
||||
|
||||
;*********************************************
|
||||
;* ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ КОНТРОЛЛЕРА НГМД *
|
||||
;*********************************************
|
||||
FDCInterrupt:
|
||||
; Установить флаг прерывания
|
||||
mov [FDD_IntFlag],1
|
||||
ret
|
||||
|
||||
|
||||
;******************************************
|
||||
;* УСТАНОВИТЬ НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЙ *
|
||||
;* НГМД *
|
||||
;******************************************
|
||||
SetUserInterrupts:
|
||||
mov [fdc_irq_func],FDCInterrupt
|
||||
ret
|
||||
|
||||
;*******************************************
|
||||
;* ОЖИДАНИЕ ПРЕРЫВАНИЯ ОТ КОНТРОЛЛЕРА НГМД *
|
||||
;*******************************************
|
||||
WaitFDCInterrupt:
|
||||
pusha
|
||||
; Сбросить байт состояния операции
|
||||
mov [FDC_Status],FDC_Normal
|
||||
; Сбросить флаг прерывания
|
||||
mov [FDD_IntFlag],0
|
||||
; Обнулить счетчик тиков
|
||||
mov eax,[timer_ticks]
|
||||
mov [TickCounter],eax
|
||||
; Ожидать установки флага прерывания НГМД
|
||||
@@TestRS_2:
|
||||
cmp [FDD_IntFlag],0
|
||||
jnz @@End_7 ;прерывание произошло
|
||||
call change_task
|
||||
mov eax,[timer_ticks]
|
||||
sub eax,[TickCounter]
|
||||
cmp eax,50 ;25 ;5 ;ожидать 5 тиков
|
||||
jb @@TestRS_2
|
||||
; jl @@TestRS_2
|
||||
; Ошибка тайм-аута
|
||||
mov [FDC_Status],FDC_TimeOut
|
||||
; mov [flp_status],0
|
||||
@@End_7: popa
|
||||
ret
|
||||
|
||||
;*********************************
|
||||
;* ВКЛЮЧИТЬ МОТОР ДИСКОВОДА "A:" *
|
||||
;*********************************
|
||||
FDDMotorON:
|
||||
pusha
|
||||
; cmp [fdd_motor_status],1
|
||||
; je fdd_motor_on
|
||||
mov al,[flp_number]
|
||||
cmp [fdd_motor_status],al
|
||||
je fdd_motor_on
|
||||
; Произвести сброс контроллера НГМД
|
||||
mov DX,3F2h ;порт управления двигателями
|
||||
mov AL,0
|
||||
out DX,AL
|
||||
; Выбрать и включить мотор дисковода
|
||||
cmp [flp_number],1
|
||||
jne FDDMotorON_B
|
||||
; call FDDMotorOFF_B
|
||||
mov AL,1Ch ; Floppy A
|
||||
jmp FDDMotorON_1
|
||||
FDDMotorON_B:
|
||||
; call FDDMotorOFF_A
|
||||
mov AL,2Dh ; Floppy B
|
||||
FDDMotorON_1:
|
||||
out DX,AL
|
||||
; Обнулить счетчик тиков
|
||||
mov eax,[timer_ticks]
|
||||
mov [TickCounter],eax
|
||||
; Ожидать 0,5 с
|
||||
@@dT:
|
||||
call change_task
|
||||
mov eax,[timer_ticks]
|
||||
sub eax,[TickCounter]
|
||||
cmp eax,50 ;10
|
||||
jb @@dT
|
||||
cmp [flp_number],1
|
||||
jne fdd_motor_on_B
|
||||
mov [fdd_motor_status],1
|
||||
jmp fdd_motor_on
|
||||
fdd_motor_on_B:
|
||||
mov [fdd_motor_status],2
|
||||
fdd_motor_on:
|
||||
call save_timer_fdd_motor
|
||||
popa
|
||||
ret
|
||||
|
||||
;*****************************************
|
||||
;* СОХРАНЕНИЕ УКАЗАТЕЛЯ ВРЕМЕНИ *
|
||||
;*****************************************
|
||||
save_timer_fdd_motor:
|
||||
mov eax,[timer_ticks]
|
||||
mov [timer_fdd_motor],eax
|
||||
ret
|
||||
|
||||
;*****************************************
|
||||
;* ПРОВЕРКА ЗАДЕРЖКИ ВЫКЛЮЧЕНИЯ МОТОРА *
|
||||
;*****************************************
|
||||
check_fdd_motor_status:
|
||||
cmp [fdd_motor_status],0
|
||||
je end_check_fdd_motor_status_1
|
||||
mov eax,[timer_ticks]
|
||||
sub eax,[timer_fdd_motor]
|
||||
cmp eax,500
|
||||
jb end_check_fdd_motor_status
|
||||
call FDDMotorOFF
|
||||
mov [fdd_motor_status],0
|
||||
end_check_fdd_motor_status_1:
|
||||
mov [flp_status],0
|
||||
end_check_fdd_motor_status:
|
||||
ret
|
||||
|
||||
;**********************************
|
||||
;* ВЫКЛЮЧИТЬ МОТОР ДИСКОВОДА *
|
||||
;**********************************
|
||||
FDDMotorOFF:
|
||||
push AX
|
||||
push DX
|
||||
cmp [flp_number],1
|
||||
jne FDDMotorOFF_1
|
||||
call FDDMotorOFF_A
|
||||
jmp FDDMotorOFF_2
|
||||
FDDMotorOFF_1:
|
||||
call FDDMotorOFF_B
|
||||
FDDMotorOFF_2:
|
||||
pop DX
|
||||
pop AX
|
||||
; сброс флагов кеширования в связи с устареванием информации
|
||||
mov [root_read],0
|
||||
mov [flp_fat],0
|
||||
ret
|
||||
|
||||
FDDMotorOFF_A:
|
||||
mov DX,3F2h ;порт управления двигателями
|
||||
mov AL,0Ch ; Floppy A
|
||||
out DX,AL
|
||||
ret
|
||||
|
||||
FDDMotorOFF_B:
|
||||
mov DX,3F2h ;порт управления двигателями
|
||||
mov AL,5h ; Floppy B
|
||||
out DX,AL
|
||||
ret
|
||||
|
||||
;*******************************
|
||||
;* РЕКАЛИБРОВКА ДИСКОВОДА "A:" *
|
||||
;*******************************
|
||||
RecalibrateFDD:
|
||||
pusha
|
||||
call save_timer_fdd_motor
|
||||
; Подать команду "Рекалибровка"
|
||||
mov AL,07h
|
||||
call FDCDataOutput
|
||||
mov AL,00h
|
||||
call FDCDataOutput
|
||||
; Ожидать завершения операции
|
||||
call WaitFDCInterrupt
|
||||
; cmp [FDC_Status],0
|
||||
; je no_fdc_status_error
|
||||
; mov [flp_status],0
|
||||
;no_fdc_status_error:
|
||||
call save_timer_fdd_motor
|
||||
popa
|
||||
ret
|
||||
|
||||
;*****************************************************
|
||||
;* ПОИСК ДОРОЖКИ *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;*****************************************************
|
||||
SeekTrack:
|
||||
pusha
|
||||
call save_timer_fdd_motor
|
||||
; Подать команду "Поиск"
|
||||
mov AL,0Fh
|
||||
call FDCDataOutput
|
||||
; Передать байт номера головки/накопителя
|
||||
mov AL,[FDD_Head]
|
||||
shl AL,2
|
||||
call FDCDataOutput
|
||||
; Передать байт номера дорожки
|
||||
mov AL,[FDD_Track]
|
||||
call FDCDataOutput
|
||||
; Ожидать завершения операции
|
||||
call WaitFDCInterrupt
|
||||
cmp [FDC_Status],FDC_Normal
|
||||
jne @@Exit
|
||||
; Сохранить результат поиска
|
||||
mov AL,08h
|
||||
call FDCDataOutput
|
||||
call FDCDataInput
|
||||
mov [FDC_ST0],AL
|
||||
call FDCDataInput
|
||||
mov [FDC_C],AL
|
||||
; Проверить результат поиска
|
||||
; Поиск завершен?
|
||||
test [FDC_ST0],100000b
|
||||
je @@Err
|
||||
; Заданный трек найден?
|
||||
mov AL,[FDC_C]
|
||||
cmp AL,[FDD_Track]
|
||||
jne @@Err
|
||||
; Номер головки совпадает с заданным?
|
||||
mov AL,[FDC_ST0]
|
||||
and AL,100b
|
||||
shr AL,2
|
||||
cmp AL,[FDD_Head]
|
||||
jne @@Err
|
||||
; Операция завершена успешно
|
||||
mov [FDC_Status],FDC_Normal
|
||||
jmp @@Exit
|
||||
@@Err: ; Трек не найден
|
||||
mov [FDC_Status],FDC_TrackNotFound
|
||||
; mov [flp_status],0
|
||||
@@Exit:
|
||||
call save_timer_fdd_motor
|
||||
popa
|
||||
ret
|
||||
|
||||
;*******************************************************
|
||||
;* ЧТЕНИЕ СЕКТОРА ДАННЫХ *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции чтения *
|
||||
;* содержимое сектора будет занесено в FDD_DataBuffer. *
|
||||
;*******************************************************
|
||||
ReadSector:
|
||||
pushad
|
||||
call save_timer_fdd_motor
|
||||
; Установить скорость передачи 500 Кбайт/с
|
||||
mov AX,0
|
||||
mov DX,03F7h
|
||||
out DX,AL
|
||||
; Инициализировать канал прямого доступа к памяти
|
||||
mov [dmamode],0x46
|
||||
call Init_FDC_DMA
|
||||
; Подать команду "Чтение данных"
|
||||
mov AL,0E6h ;чтение в мультитрековом режиме
|
||||
call FDCDataOutput
|
||||
mov AL,[FDD_Head]
|
||||
shl AL,2
|
||||
call FDCDataOutput
|
||||
mov AL,[FDD_Track]
|
||||
call FDCDataOutput
|
||||
mov AL,[FDD_Head]
|
||||
call FDCDataOutput
|
||||
mov AL,[FDD_Sector]
|
||||
call FDCDataOutput
|
||||
mov AL,2 ;код размера сектора (512 байт)
|
||||
call FDCDataOutput
|
||||
mov AL,18 ;+1; 3Fh ;число секторов на дорожке
|
||||
call FDCDataOutput
|
||||
mov AL,1Bh ;значение GPL
|
||||
call FDCDataOutput
|
||||
mov AL,0FFh ;значение DTL
|
||||
call FDCDataOutput
|
||||
; Ожидаем прерывание по завершении операции
|
||||
call WaitFDCInterrupt
|
||||
cmp [FDC_Status],FDC_Normal
|
||||
jne @@Exit_1
|
||||
; Считываем статус завершения операции
|
||||
call GetStatusInfo
|
||||
test [FDC_ST0],11011000b
|
||||
jnz @@Err_1
|
||||
mov [FDC_Status],FDC_Normal
|
||||
jmp @@Exit_1
|
||||
@@Err_1: mov [FDC_Status],FDC_SectorNotFound
|
||||
; mov [flp_status],0
|
||||
@@Exit_1:
|
||||
call save_timer_fdd_motor
|
||||
popad
|
||||
ret
|
||||
|
||||
;*******************************************************
|
||||
;* ЧТЕНИЕ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ) *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции чтения *
|
||||
;* содержимое сектора будет занесено в FDD_DataBuffer. *
|
||||
;*******************************************************
|
||||
ReadSectWithRetr:
|
||||
pusha
|
||||
; Обнулить счетчик повторения операции рекалибровки
|
||||
mov [RecalRepCounter],0
|
||||
@@TryAgain:
|
||||
; Обнулить счетчик повторения операции чтения
|
||||
mov [ReadRepCounter],0
|
||||
@@ReadSector_1:
|
||||
call ReadSector
|
||||
cmp [FDC_Status],0
|
||||
je @@Exit_2
|
||||
cmp [FDC_Status],1
|
||||
je @@Err_3
|
||||
; Троекратное повторение чтения
|
||||
inc [ReadRepCounter]
|
||||
cmp [ReadRepCounter],3
|
||||
jb @@ReadSector_1
|
||||
; Троекратное повторение рекалибровки
|
||||
call RecalibrateFDD
|
||||
call SeekTrack
|
||||
inc [RecalRepCounter]
|
||||
cmp [RecalRepCounter],3
|
||||
jb @@TryAgain
|
||||
; mov [flp_status],0
|
||||
@@Exit_2:
|
||||
popa
|
||||
ret
|
||||
@@Err_3:
|
||||
mov [flp_status],0
|
||||
popa
|
||||
ret
|
||||
|
||||
;*******************************************************
|
||||
;* ЗАПИСЬ СЕКТОРА ДАННЫХ *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции записи *
|
||||
;* содержимое FDD_DataBuffer будет занесено в сектор. *
|
||||
;*******************************************************
|
||||
WriteSector:
|
||||
pushad
|
||||
call save_timer_fdd_motor
|
||||
; Установить скорость передачи 500 Кбайт/с
|
||||
mov AX,0
|
||||
mov DX,03F7h
|
||||
out DX,AL
|
||||
; Инициализировать канал прямого доступа к памяти
|
||||
mov [dmamode],0x4A
|
||||
call Init_FDC_DMA
|
||||
; Подать команду "Запись данных"
|
||||
mov AL,0xC5 ;0x45 ;запись в мультитрековом режиме
|
||||
call FDCDataOutput
|
||||
mov AL,[FDD_Head]
|
||||
shl AL,2
|
||||
call FDCDataOutput
|
||||
mov AL,[FDD_Track]
|
||||
call FDCDataOutput
|
||||
mov AL,[FDD_Head]
|
||||
call FDCDataOutput
|
||||
mov AL,[FDD_Sector]
|
||||
call FDCDataOutput
|
||||
mov AL,2 ;код размера сектора (512 байт)
|
||||
call FDCDataOutput
|
||||
mov AL,18; 3Fh ;число секторов на дорожке
|
||||
call FDCDataOutput
|
||||
mov AL,1Bh ;значение GPL
|
||||
call FDCDataOutput
|
||||
mov AL,0FFh ;значение DTL
|
||||
call FDCDataOutput
|
||||
; Ожидаем прерывание по завершении операции
|
||||
call WaitFDCInterrupt
|
||||
cmp [FDC_Status],FDC_Normal
|
||||
jne @@Exit_3
|
||||
; Считываем статус завершения операции
|
||||
call GetStatusInfo
|
||||
test [FDC_ST0],11000000b ;11011000b
|
||||
jnz @@Err_2
|
||||
mov [FDC_Status],FDC_Normal
|
||||
jmp @@Exit_3
|
||||
@@Err_2: mov [FDC_Status],FDC_SectorNotFound
|
||||
@@Exit_3:
|
||||
call save_timer_fdd_motor
|
||||
popad
|
||||
ret
|
||||
|
||||
;*******************************************************
|
||||
;* ЗАПИСЬ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ) *
|
||||
;* Параметры передаются через глобальные переменные: *
|
||||
;* FDD_Track - номер дорожки (0-79); *
|
||||
;* FDD_Head - номер головки (0-1); *
|
||||
;* FDD_Sector - номер сектора (1-18). *
|
||||
;* Результат операции заносится в FDC_Status. *
|
||||
;* В случае успешного выполнения операции записи *
|
||||
;* содержимое FDD_DataBuffer будет занесено в сектор. *
|
||||
;*******************************************************
|
||||
WriteSectWithRetr:
|
||||
pusha
|
||||
; Обнулить счетчик повторения операции рекалибровки
|
||||
mov [RecalRepCounter],0
|
||||
@@TryAgain_1:
|
||||
; Обнулить счетчик повторения операции чтения
|
||||
mov [ReadRepCounter],0
|
||||
@@WriteSector_1:
|
||||
call WriteSector
|
||||
cmp [FDC_Status],0
|
||||
je @@Exit_4
|
||||
cmp [FDC_Status],1
|
||||
je @@Err_4
|
||||
; Троекратное повторение чтения
|
||||
inc [ReadRepCounter]
|
||||
cmp [ReadRepCounter],3
|
||||
jb @@WriteSector_1
|
||||
; Троекратное повторение рекалибровки
|
||||
call RecalibrateFDD
|
||||
call SeekTrack
|
||||
inc [RecalRepCounter]
|
||||
cmp [RecalRepCounter],3
|
||||
jb @@TryAgain_1
|
||||
@@Exit_4:
|
||||
popa
|
||||
ret
|
||||
@@Err_4:
|
||||
mov [flp_status],0
|
||||
popa
|
||||
ret
|
||||
|
||||
;*********************************************
|
||||
;* ПОЛУЧИТЬ ИНФОРМАЦИЮ О РЕЗУЛЬТАТЕ ОПЕРАЦИИ *
|
||||
;*********************************************
|
||||
GetStatusInfo:
|
||||
push AX
|
||||
call FDCDataInput
|
||||
mov [FDC_ST0],AL
|
||||
call FDCDataInput
|
||||
mov [FDC_ST1],AL
|
||||
call FDCDataInput
|
||||
mov [FDC_ST2],AL
|
||||
call FDCDataInput
|
||||
mov [FDC_C],AL
|
||||
call FDCDataInput
|
||||
mov [FDC_H],AL
|
||||
call FDCDataInput
|
||||
mov [FDC_R],AL
|
||||
call FDCDataInput
|
||||
mov [FDC_N],AL
|
||||
pop AX
|
||||
ret
|
||||
|
522
kernel/tags/kolibri0.5.3.0/blkdev/rd.inc
Normal file
522
kernel/tags/kolibri0.5.3.0/blkdev/rd.inc
Normal file
@ -0,0 +1,522 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; RAMDISK functions ;;
|
||||
;; (C) 2004 Ville Turjanmaa, License: GPL ;;
|
||||
;; Addings by M.Lisovin ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; calculate fat chain
|
||||
|
||||
calculatefatchain:
|
||||
|
||||
pushad
|
||||
|
||||
mov esi,0x100000+512
|
||||
mov edi,0x280000
|
||||
|
||||
fcnew:
|
||||
mov eax,dword [esi]
|
||||
mov ebx,dword [esi+4]
|
||||
mov ecx,dword [esi+8]
|
||||
mov edx,ecx
|
||||
shr edx,4 ;8 ok
|
||||
shr dx,4 ;7 ok
|
||||
xor ch,ch
|
||||
shld ecx,ebx,20 ;6 ok
|
||||
shr cx,4 ;5 ok
|
||||
shld ebx,eax,12
|
||||
and ebx,0x0fffffff ;4 ok
|
||||
shr bx,4 ;3 ok
|
||||
shl eax,4
|
||||
and eax,0x0fffffff ;2 ok
|
||||
shr ax,4 ;1 ok
|
||||
mov dword [edi],eax
|
||||
add edi,4
|
||||
mov dword [edi],ebx
|
||||
add edi,4
|
||||
mov dword [edi],ecx
|
||||
add edi,4
|
||||
mov dword [edi],edx
|
||||
add edi,4
|
||||
add esi,12
|
||||
|
||||
cmp edi,0x280000+2856*2 ;2849 clusters
|
||||
jnz fcnew
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
restorefatchain: ; restore fat chain
|
||||
|
||||
pushad
|
||||
|
||||
mov esi,0x280000
|
||||
mov edi,0x100000+512
|
||||
|
||||
fcnew2:
|
||||
mov eax,dword [esi]
|
||||
mov ebx,dword [esi+4]
|
||||
shl ax,4
|
||||
shl eax,4
|
||||
shl bx,4
|
||||
shr ebx,4
|
||||
shrd eax,ebx,8
|
||||
shr ebx,8
|
||||
mov dword [edi],eax
|
||||
add edi,4
|
||||
mov word [edi],bx
|
||||
add edi,2
|
||||
add esi,8
|
||||
|
||||
cmp edi,0x100000+512+4278 ;4274 bytes - all used FAT
|
||||
jb fcnew2
|
||||
|
||||
mov esi,0x100000+512 ; duplicate fat chain
|
||||
mov edi,0x100000+512+0x1200
|
||||
mov ecx,1069 ;4274/4
|
||||
cld
|
||||
rep movsd
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
ramdisk_free_space:
|
||||
;---------------------------------------------
|
||||
;
|
||||
; returns free space in edi
|
||||
; rewr.by Mihasik
|
||||
;---------------------------------------------
|
||||
|
||||
push eax ebx ecx
|
||||
|
||||
mov edi,0x280000 ;start of FAT
|
||||
xor ax,ax ;Free cluster=0x0000 in FAT
|
||||
xor ebx,ebx ;counter
|
||||
mov ecx,2849 ;2849 clusters
|
||||
cld
|
||||
rdfs1:
|
||||
repne scasw
|
||||
jnz rdfs2 ;if last cluster not 0
|
||||
inc ebx
|
||||
jcxz rdfs2 ;if last cluster=0
|
||||
jmp rdfs1 ;if not last
|
||||
rdfs2:
|
||||
shl ebx,9 ;free clusters*512
|
||||
mov edi,ebx
|
||||
|
||||
pop ecx ebx eax
|
||||
ret
|
||||
|
||||
|
||||
expand_filename:
|
||||
;---------------------------------------------
|
||||
;
|
||||
; exapand filename with '.' to 11 character
|
||||
; eax - pointer to filename
|
||||
;---------------------------------------------
|
||||
|
||||
push esi edi ebx
|
||||
|
||||
mov edi,esp ; check for '.' in the name
|
||||
add edi,12+8
|
||||
|
||||
mov esi,eax
|
||||
|
||||
mov eax,edi
|
||||
mov [eax+0],dword ' '
|
||||
mov [eax+4],dword ' '
|
||||
mov [eax+8],dword ' '
|
||||
|
||||
flr1:
|
||||
|
||||
cmp [esi],byte '.'
|
||||
jne flr2
|
||||
mov edi,eax
|
||||
add edi,7
|
||||
jmp flr3
|
||||
|
||||
flr2:
|
||||
|
||||
mov bl,[esi]
|
||||
mov [edi],bl
|
||||
|
||||
flr3:
|
||||
|
||||
inc esi
|
||||
inc edi
|
||||
|
||||
mov ebx,eax
|
||||
add ebx,11
|
||||
|
||||
cmp edi,ebx
|
||||
jbe flr1
|
||||
|
||||
pop ebx edi esi
|
||||
ret
|
||||
|
||||
fileread:
|
||||
;----------------------------------------------------------------
|
||||
;
|
||||
; fileread - sys floppy
|
||||
;
|
||||
; eax points to filename 11 chars
|
||||
; ebx first wanted block ; 1+ ; if 0 then set to 1
|
||||
; ecx number of blocks to read ; 1+ ; if 0 then set to 1
|
||||
; edx mem location to return data
|
||||
; esi length of filename 12*X 0=root
|
||||
;
|
||||
; ret ebx = size or 0xffffffff file not found
|
||||
; eax = 0 ok read or other = errormsg
|
||||
;
|
||||
;--------------------------------------------------------------
|
||||
test ebx,ebx ;if ebx=0 - set to 1
|
||||
jnz frfl5
|
||||
inc ebx
|
||||
frfl5:
|
||||
test ecx,ecx ;if ecx=0 - set to 1
|
||||
jnz frfl6
|
||||
inc ecx
|
||||
frfl6:
|
||||
test esi,esi ; return ramdisk root
|
||||
jnz fr_noroot ;if not root
|
||||
cmp ebx,14 ;14 clusters=root dir
|
||||
ja oorr
|
||||
cmp ecx,14
|
||||
ja oorr
|
||||
jmp fr_do
|
||||
oorr:
|
||||
mov eax,5 ;out of root range (fnf)
|
||||
xor ebx,ebx
|
||||
dec ebx ;0xffffffff
|
||||
ret
|
||||
|
||||
fr_do: ;reading rootdir
|
||||
mov edi,edx
|
||||
dec ebx
|
||||
push edx
|
||||
mov edx,ecx
|
||||
add edx,ebx
|
||||
cmp edx,15 ;ebx+ecx=14+1
|
||||
pushf
|
||||
jbe fr_do1
|
||||
sub edx,14
|
||||
sub ecx,edx
|
||||
fr_do1:
|
||||
shl ebx,9
|
||||
mov esi,0x100000+512*19
|
||||
add esi,ebx
|
||||
shl ecx,7
|
||||
cld
|
||||
rep movsd
|
||||
popf
|
||||
pop edx
|
||||
jae fr_do2
|
||||
xor eax,eax ; ok read
|
||||
xor ebx,ebx
|
||||
ret
|
||||
fr_do2: ;if last cluster
|
||||
mov eax,6 ;end of file
|
||||
xor ebx,ebx
|
||||
ret
|
||||
|
||||
fr_noroot:
|
||||
|
||||
sub esp,32
|
||||
call expand_filename
|
||||
|
||||
dec ebx
|
||||
|
||||
push eax
|
||||
|
||||
push eax ebx ecx edx esi edi
|
||||
call rd_findfile
|
||||
je fifound
|
||||
add esp,32+28 ;if file not found
|
||||
ret
|
||||
|
||||
fifound:
|
||||
|
||||
mov ebx,[edi-11+28] ;file size
|
||||
mov [esp+20],ebx
|
||||
mov [esp+24],ebx
|
||||
add edi,0xf
|
||||
movzx eax,word [edi]
|
||||
mov edi,eax ;edi=cluster
|
||||
|
||||
frnew:
|
||||
|
||||
add eax,31 ;bootsector+2*fat+filenames
|
||||
shl eax,9 ;*512
|
||||
add eax,0x100000 ;image base
|
||||
mov ebx,[esp+8]
|
||||
mov ecx,512 ;[esp+4]
|
||||
|
||||
cmp [esp+16],dword 0 ; wanted cluster ?
|
||||
jne frfl7
|
||||
call memmove
|
||||
add [esp+8],dword 512
|
||||
dec dword [esp+12] ; last wanted cluster ?
|
||||
cmp [esp+12],dword 0
|
||||
je frnoread
|
||||
jmp frfl8
|
||||
frfl7:
|
||||
dec dword [esp+16]
|
||||
frfl8:
|
||||
shl edi,1 ;find next cluster from FAT
|
||||
add edi,0x280000
|
||||
movzx eax,word [edi]
|
||||
mov edi,eax
|
||||
cmp edi,4095 ;eof - cluster
|
||||
jz frnoread2
|
||||
|
||||
cmp [esp+24],dword 512 ;eof - size
|
||||
jb frnoread
|
||||
sub [esp+24],dword 512
|
||||
|
||||
jmp frnew
|
||||
|
||||
frnoread2:
|
||||
|
||||
cmp [esp+16],dword 0 ; eof without read ?
|
||||
je frnoread
|
||||
|
||||
pop edi esi edx ecx
|
||||
add esp,4
|
||||
pop ebx ; ebx <- eax : size of file
|
||||
add esp,36
|
||||
mov eax,6 ; end of file
|
||||
ret
|
||||
|
||||
frnoread:
|
||||
|
||||
pop edi esi edx ecx
|
||||
add esp,4
|
||||
pop ebx ; ebx <- eax : size of file
|
||||
add esp,36
|
||||
xor eax,eax ;read ok
|
||||
ret
|
||||
|
||||
filedelete:
|
||||
;--------------------------------------------
|
||||
;
|
||||
; filedelete - sys floppy
|
||||
; in:
|
||||
; eax - pointer to filename 11 chars
|
||||
;
|
||||
; out:
|
||||
; eax - 0 = successful, 5 = file not found
|
||||
;
|
||||
;--------------------------------------------
|
||||
|
||||
sub esp,32
|
||||
call expand_filename
|
||||
|
||||
push eax ebx ecx edx esi edi
|
||||
|
||||
call rd_findfile
|
||||
je fifoundd
|
||||
pop edi esi edx ecx ebx eax ;file not found
|
||||
add esp,32
|
||||
mov eax,5
|
||||
ret
|
||||
|
||||
fifoundd:
|
||||
|
||||
mov [edi-11],byte 0xE5 ;mark filename deleted
|
||||
add edi,0xf
|
||||
movzx eax,word [edi]
|
||||
mov edi,eax ;edi = cluster
|
||||
|
||||
frnewd:
|
||||
|
||||
shl edi,1 ;find next cluster from FAT
|
||||
add edi,0x280000
|
||||
movzx eax,word [edi]
|
||||
mov [edi],word 0x0 ;clear fat chain cluster
|
||||
mov edi,eax
|
||||
cmp edi,dword 0xff8 ;last cluster ?
|
||||
jb frnewd
|
||||
|
||||
pop edi esi edx ecx ebx eax
|
||||
add esp,32
|
||||
xor eax,eax ; file found
|
||||
ret
|
||||
|
||||
|
||||
|
||||
filesave:
|
||||
;----------------------------------------------------------
|
||||
;
|
||||
; filesave - sys floppy
|
||||
;
|
||||
; eax points to filename 11 chars
|
||||
;
|
||||
; eax ; pointer to file name
|
||||
; ebx ; buffer
|
||||
; ecx ; count to write in bytes
|
||||
; edx ; 0 create new , 1 append
|
||||
;
|
||||
;-----------------------------------------------------------
|
||||
|
||||
sub esp,32
|
||||
call expand_filename
|
||||
test edx,edx
|
||||
jnz fsdel
|
||||
pusha
|
||||
call filedelete
|
||||
popa
|
||||
|
||||
fsdel:
|
||||
|
||||
call ramdisk_free_space
|
||||
cmp ecx,edi
|
||||
jbe rd_do_save
|
||||
add esp,32
|
||||
mov eax,8 ;disk full
|
||||
ret
|
||||
|
||||
rd_do_save:
|
||||
|
||||
push eax ebx ecx edx esi edi
|
||||
|
||||
mov edi,0x100000+512*18+512 ;Point at directory
|
||||
mov edx,224 +1
|
||||
; find an empty spot for filename in the root dir
|
||||
l20ds:
|
||||
dec edx
|
||||
test edx,edx
|
||||
jz frnoreadds
|
||||
l21ds:
|
||||
cmp [edi],byte 0xE5
|
||||
jz fifoundds
|
||||
cmp [edi],byte 0x0
|
||||
jz fifoundds
|
||||
add edi,32 ; Advance to next entry
|
||||
jmp l20ds
|
||||
fifoundds:
|
||||
|
||||
push edi ; move the filename to root dir
|
||||
mov esi,[esp+4+20]
|
||||
mov ecx,11
|
||||
cld
|
||||
rep movsb
|
||||
pop edi
|
||||
mov edx,edi
|
||||
add edx,11+0xf ; edx <- cluster save position
|
||||
mov ebx,[esp+12] ; save file size
|
||||
mov [edi+28],ebx
|
||||
mov [edi+11],byte 0x20 ; attribute
|
||||
; Ivan Poddubny 11/12/2003:
|
||||
call get_date_for_file ; from FAT32.INC
|
||||
mov [edi+24],ax ; date
|
||||
call get_time_for_file ; from FAT32.INC
|
||||
mov [edi+22],ax ; time
|
||||
; End
|
||||
mov edi,0x280000 ;pointer to first cluster
|
||||
mov ecx,2849
|
||||
cld
|
||||
frnewds:
|
||||
xor ax,ax
|
||||
repne scasw
|
||||
mov ebx,2848
|
||||
sub ebx,ecx
|
||||
mov [edx],bx ; save next cluster pos. to prev cl.
|
||||
mov edx,edi ; next save pos abs mem add
|
||||
dec edx
|
||||
dec edx
|
||||
call fdc_filesave
|
||||
pusha ; move save to floppy cluster
|
||||
add ebx,31
|
||||
shl ebx,9
|
||||
add ebx,0x100000
|
||||
mov eax,[esp+32+16]
|
||||
mov ecx,512
|
||||
call memmove
|
||||
popa
|
||||
|
||||
mov eax,[esp+12]
|
||||
cmp eax,512
|
||||
jbe flnsa
|
||||
sub eax,512
|
||||
mov [esp+12],eax
|
||||
mov eax,[esp+16]
|
||||
add eax,512
|
||||
mov [esp+16],eax
|
||||
jmp frnewds
|
||||
|
||||
flnsa:
|
||||
dec edi
|
||||
dec edi
|
||||
mov [edi],word 4095 ; mark end of file - last cluster
|
||||
|
||||
frnoreadds:
|
||||
|
||||
pop edi esi edx ecx ebx eax
|
||||
add esp,32
|
||||
|
||||
; pusha
|
||||
; cli
|
||||
; call fdc_commitfile
|
||||
; sti
|
||||
; popa
|
||||
|
||||
xor eax,eax ;ok write
|
||||
ret
|
||||
|
||||
rd_findfile:
|
||||
;by Mihasik
|
||||
;IN: eax - pointer to filename OUT: filestring+11 in edi or notZero in flags and fnf in eax,ebx
|
||||
|
||||
mov edi,0x100000+512*18+512 ;Point at directory
|
||||
cld
|
||||
rd_newsearch:
|
||||
mov esi,eax
|
||||
mov ecx,11
|
||||
rep cmpsb
|
||||
je rd_ff
|
||||
add cl,21
|
||||
add edi,ecx
|
||||
cmp edi,0x100000+512*33
|
||||
jb rd_newsearch
|
||||
mov eax,5 ;if file not found - eax=5
|
||||
xor ebx,ebx
|
||||
dec ebx ;ebx=0xffffffff and zf=0
|
||||
rd_ff:
|
||||
ret
|
||||
|
||||
rd_getfileinfo:
|
||||
;get date, time, size or attributes of file
|
||||
;IN: eax - pointer to file, ebx - type of function: 12-get filesize, 13-get fileattr, 14-get filedate
|
||||
;ecx - filelengh 0=root
|
||||
;OUT: eax=0 - Ok or 5 - file not found ebx - date/time, size or attributes
|
||||
test ecx,ecx
|
||||
jnz no_getfinfo_root
|
||||
mov eax,5 ;if root - fnf
|
||||
xor ebx,ebx
|
||||
dec ebx
|
||||
ret
|
||||
no_getfinfo_root: ;if not root
|
||||
sub esp,32
|
||||
call expand_filename
|
||||
call rd_findfile
|
||||
je fifoundi
|
||||
add esp,32 ;if file not found
|
||||
ret
|
||||
fifoundi:
|
||||
cmp ebx,13
|
||||
jne no_rd_attr
|
||||
movzx ebx,byte [edi] ;get attributes
|
||||
jmp rd_getfileinfo_end
|
||||
no_rd_attr:
|
||||
cmp ebx,14
|
||||
jne no_rd_date
|
||||
mov ebx,dword [edi+11] ;get date/time
|
||||
jmp rd_getfileinfo_end
|
||||
no_rd_date:
|
||||
mov ebx,dword [edi+17] ;get size
|
||||
rd_getfileinfo_end:
|
||||
xor eax,eax
|
||||
add esp,32
|
||||
ret
|
26
kernel/tags/kolibri0.5.3.0/blkdev/rdsave.inc
Normal file
26
kernel/tags/kolibri0.5.3.0/blkdev/rdsave.inc
Normal file
@ -0,0 +1,26 @@
|
||||
cmp eax,6 ; SAVE FLOPPY IMAGE (HD version only)
|
||||
jnz nosaveimage
|
||||
cmp ebx,1
|
||||
jnz img_save_hd_1
|
||||
mov edx,bootpath ; path = '/KOLIBRI '
|
||||
jmp img_save_hd_3
|
||||
img_save_hd_1:
|
||||
cmp ebx,2
|
||||
jnz img_save_hd_2
|
||||
mov edx,bootpath2 ; path = 0 (root dir)
|
||||
jmp img_save_hd_3
|
||||
img_save_hd_2:
|
||||
cmp ebx,3
|
||||
jnz exit_for_anyone
|
||||
mov edx,[3010h]
|
||||
mov edx,[edx+10h]
|
||||
add edx,ecx
|
||||
img_save_hd_3:
|
||||
call restorefatchain ; restore FAT !!!
|
||||
mov eax,image_save
|
||||
mov ebx,1440*1024 ; size 1440 Kb
|
||||
mov ecx,0x100000 ; address of image
|
||||
call file_write
|
||||
ret
|
||||
|
||||
nosaveimage:
|
1085
kernel/tags/kolibri0.5.3.0/boot/bootcode.inc
Normal file
1085
kernel/tags/kolibri0.5.3.0/boot/bootcode.inc
Normal file
File diff suppressed because it is too large
Load Diff
133
kernel/tags/kolibri0.5.3.0/boot/booteng.inc
Normal file
133
kernel/tags/kolibri0.5.3.0/boot/booteng.inc
Normal file
@ -0,0 +1,133 @@
|
||||
;======================================================================
|
||||
;
|
||||
; BOOT DATA
|
||||
;
|
||||
;======================================================================
|
||||
|
||||
macro line_full_top {
|
||||
db 201
|
||||
times 78 db 205
|
||||
db 187
|
||||
}
|
||||
macro line_full_bottom {
|
||||
db 200
|
||||
times 78 db 205
|
||||
db 188
|
||||
}
|
||||
macro line_half {
|
||||
db 186,' '
|
||||
times 76 db 0xc4
|
||||
db ' ',186
|
||||
}
|
||||
macro line_space {
|
||||
db 186
|
||||
times 78 db 32
|
||||
db 186
|
||||
}
|
||||
d80x25_top:
|
||||
line_full_top
|
||||
space_msg: line_space
|
||||
verstr:
|
||||
; line_space
|
||||
; version string
|
||||
db 186,32
|
||||
repeat 78
|
||||
load a byte from version+%-1
|
||||
if a = 13
|
||||
break
|
||||
end if
|
||||
db a
|
||||
end repeat
|
||||
repeat 78 - ($-verstr)
|
||||
db ' '
|
||||
end repeat
|
||||
db 32,186
|
||||
line_half
|
||||
d80x25_top_num = 4
|
||||
d80x25_bottom:
|
||||
db 186,' KolibriOS based on MenuetOS and comes with ABSOLUTELY '
|
||||
db 'NO WARRANTY ',186
|
||||
db 186,' See file COPYING for details '
|
||||
db ' ',186
|
||||
line_full_bottom
|
||||
d80x25_bottom_num = 3
|
||||
|
||||
novesa db "Display: EGA/CGA",13,10,0
|
||||
vervesa db "Version of Vesa: Vesa x.x",13,10,0
|
||||
vervesa_off=22
|
||||
gr_mode db 186," Vesa 2.0+ 16 M LFB: [1] 640x480, [2] 800x600, "
|
||||
db "[3] 1024x768, [4] 1280x1024",13,10
|
||||
db 186," Vesa 1.2 16 M Bnk: [5] 640x480, [6] 800x600, "
|
||||
db "[7] 1024x768, [8] 1280x1024",13,10
|
||||
db 186," EGA/CGA 256 Colors: [9] 320x200, "
|
||||
db "VGA 16 Colors: [0] 640x480",13,10
|
||||
db 186," Select mode: ",0
|
||||
bt24 db "Bits Per Pixel: 24",13,10,0
|
||||
bt32 db "Bits Per Pixel: 32",13,10,0
|
||||
vrrmprint db "Apply VRR? (picture frequency greater than 60Hz"
|
||||
db " only for transfers:",13,10
|
||||
db 186," 1024*768->800*600 and 800*600->640*480) [1-yes,2-no]:",0
|
||||
;askmouse db " Mouse at:"
|
||||
; db " [1] PS/2 (USB), [2] Com1, [3] Com2."
|
||||
; db " Select port [1-3]: ",0
|
||||
;no_com1 db 13,10,186, " No COM1 mouse",0
|
||||
;no_com2 db 13,10,186, " No COM2 mouse",0
|
||||
gr_acc db "Vesa 2.0+ : MTRR graphics acceleration "
|
||||
db "[1-yes/2-no] ? ",0
|
||||
;gr_direct db 186," Use direct LFB writing? "
|
||||
; db "[1-yes/2-no] ? ",0
|
||||
;mem_model db 13,10,186," Motherboard memory [1-16 Mb / 2-32 Mb / "
|
||||
; db "3-64Mb / 4-128 Mb / 5-256 Mb] ? ",0
|
||||
;bootlog db 13,10,186," After bootlog display [1-continue/2-pause] ? ",0
|
||||
bdev db "Load ramdisk from [1-floppy; 2-C:\menuet.img (FAT32);"
|
||||
db 13,10,186," "
|
||||
db "3-use preloaded ram-image from kernel restart]: ",0
|
||||
probetext db 13,10,13,10,186," Use standart graphics mode? [1-yes, "
|
||||
db "2-probe bios (Vesa 3.0)]: ",0
|
||||
;memokz256 db 13,10,186," RAM 256 Mb",0
|
||||
;memokz128 db 13,10,186," RAM 128 Mb",0
|
||||
;memokz64 db 13,10,186," RAM 64 Mb",0
|
||||
;memokz32 db 13,10,186," RAM 32 Mb",0
|
||||
;memokz16 db 13,10,186," RAM 16 Mb",0
|
||||
prnotfnd db "Fatal - Videomode not found.",0
|
||||
;modena db "Fatal - VBE 0x112+ required.",0
|
||||
not386 db "Fatal - CPU 386+ required.",0
|
||||
btns db "Fatal - Can't determine color depth.",0
|
||||
fatalsel db "Fatal - Graphics mode not supported by hardware.",0
|
||||
badsect db 13,10,186," Fatal - Bad sector. Replace floppy.",0
|
||||
memmovefailed db 13,10,186," Fatal - Int 0x15 move failed.",0
|
||||
okt db " ... OK"
|
||||
linef db 13,10,0
|
||||
diskload db "Loading diskette: 00 %",8,8,8,8,0
|
||||
pros db "00"
|
||||
backspace2 db 8,8,0
|
||||
boot_dev db 0 ; 0=floppy, 1=hd
|
||||
start_msg db "Press [abcd] to change settings, press [Enter] to continue booting",13,10,0
|
||||
time_msg db " or wait "
|
||||
time_str db " 5 seconds"
|
||||
db " before automatical continuation",13,10,0
|
||||
current_cfg_msg db "Current settings:",13,10,0
|
||||
curvideo_msg db " [a] Videomode: ",0
|
||||
mode1 db "640x480",0
|
||||
mode2 db "800x600",0
|
||||
mode3 db "1024x768",0
|
||||
mode4 db "1280x1024",0
|
||||
modes_msg dw mode4-0x10000,mode1-0x10000,mode2-0x10000,mode3-0x10000
|
||||
modevesa20 db " with LFB",0
|
||||
modevesa12 db ", VESA 1.2 Bnk",0
|
||||
mode9 db "320x200, EGA/CGA 256 colors",0
|
||||
mode10 db "640x480, VGA 16 colors",0
|
||||
probeno_msg db " (standard mode)",0
|
||||
probeok_msg db " (check nonstandard modes)",0
|
||||
mtrr_msg db " [b] Use MTRR for graphics acceleration:",0
|
||||
on_msg db " on",13,10,0
|
||||
off_msg db " off",13,10,0
|
||||
vrrm_msg db " [c] Use VRR:",0
|
||||
preboot_device_msg db " [d] Floppy image: ",0
|
||||
preboot_device_msgs dw 0,pdm1-0x10000,pdm2-0x10000,pdm3-0x10000
|
||||
pdm1 db "real floppy",13,10,0
|
||||
pdm2 db "C:\menuet.img (FAT32)",13,10,0
|
||||
pdm3 db "use already loaded image",13,10,0
|
||||
loading_msg db "Loading KolibriOS...",0
|
||||
save_quest db "Remember current settings? [y/n]: ",0
|
||||
loader_block_error db "Bootloader data invalid, I cannot continue. Stopped.",0
|
133
kernel/tags/kolibri0.5.3.0/boot/bootru.inc
Normal file
133
kernel/tags/kolibri0.5.3.0/boot/bootru.inc
Normal file
@ -0,0 +1,133 @@
|
||||
;======================================================================
|
||||
;
|
||||
; BOOT DATA
|
||||
;
|
||||
;======================================================================
|
||||
|
||||
macro line_full_top {
|
||||
db 201
|
||||
times 78 db 205
|
||||
db 187
|
||||
}
|
||||
macro line_full_bottom {
|
||||
db 200
|
||||
times 78 db 205
|
||||
db 188
|
||||
}
|
||||
macro line_half {
|
||||
db 186,' '
|
||||
times 76 db 0xc4
|
||||
db ' ',186
|
||||
}
|
||||
macro line_space {
|
||||
db 186
|
||||
times 78 db 32
|
||||
db 186
|
||||
}
|
||||
d80x25_top:
|
||||
line_full_top
|
||||
space_msg: line_space
|
||||
verstr:
|
||||
; line_space
|
||||
; version string
|
||||
db 186,32
|
||||
repeat 78
|
||||
load a byte from version+%-1
|
||||
if a = 13
|
||||
break
|
||||
end if
|
||||
db a
|
||||
end repeat
|
||||
repeat 78 - ($-verstr)
|
||||
db ' '
|
||||
end repeat
|
||||
db 32,186
|
||||
line_half
|
||||
d80x25_top_num = 4
|
||||
d80x25_bottom:
|
||||
db 186,' Kolibri OS ®á®¢ Menuet OS ¨ ¥ ¯à¥¤®áâ ¢«ï¥â '
|
||||
db '¨ª ª¨å £ àa⨩. ',186
|
||||
db 186,' <20>®¤à®¡¥¥ ᬮâà¨â¥ ä ©« GNU.TXT '
|
||||
db ' ',186
|
||||
line_full_bottom
|
||||
d80x25_bottom_num = 3
|
||||
|
||||
novesa db "‚¨¤¥®ª àâ : EGA/CGA",13,10,0
|
||||
vervesa db "‚¥àá¨ï VESA: Vesa x.x",13,10,0
|
||||
vervesa_off=19
|
||||
gr_mode db 186," Vesa 2.0+ 16 M LFB: [1] 640x480, [2] 800x600, "
|
||||
db "[3] 1024x768, [4] 1280x1024",13,10
|
||||
db 186," Vesa 1.2 16 M Bnk: [5] 640x480, [6] 800x600, "
|
||||
db "[7] 1024x768, [8] 1280x1024",13,10
|
||||
db 186," EGA/CGA 256 –¢¥â®¢: [9] 320x200, "
|
||||
db "VGA 16 –¢¥â®¢: [0] 640x480",13,10
|
||||
db 186," ‚ë¡¥à¨â¥ ¢¨¤¥®à¥¦¨¬: ",0
|
||||
bt24 db "ƒ«ã¡¨ 梥â : 24",13,10,0
|
||||
bt32 db "ƒ«ã¡¨ 梥â : 32",13,10,0
|
||||
vrrmprint db "ˆá¯®«ì§®¢ âì VRR? (ç áâ®â ª ¤à®¢ ¢ëè¥ 60 ƒæ"
|
||||
db " ⮫쪮 ¤«ï ¯¥à¥å®¤®¢:",13,10
|
||||
db 186," 1024*768>800*600 ¨ 800*600>640*480) [1-¤ , 2-¥â]: ",0
|
||||
;askmouse db "Œëèì:" ; 186, " "
|
||||
; db " [1] PS/2 (USB), [2] Com1, [3] Com2."
|
||||
; db " ‚ë¡¥à¨â¥ ¯®àâ [1-3]: ",0
|
||||
;no_com1 db 13,10,186," No COM1 mouse",0
|
||||
;no_com2 db 13,10,186," No COM2 mouse",0
|
||||
gr_acc db "Vesa 2.0+: ‚ª«îç¨âì MTRR ¤«ï ãáª®à¥¨ï £à 䨪¨? "
|
||||
db "[1-¤ /2-¥â]: ",0
|
||||
;gr_direct db 186," ˆá¯®«ì§®¢ âì «¨¥©ë© ¢¨¤¥®¡ãä¥à? "
|
||||
; db "[1-¤ /2-¥â]: ",0
|
||||
;mem_model db 13,10,186," Ž¡ê+¬ ¯ ¬ï⨠[1-16 Mb / 2-32 Mb / "
|
||||
; db "3-64Mb / 4-128 Mb / 5-256 Mb]: ",0
|
||||
;bootlog db 13,10,186," <20>à®á¬®âà¥âì ¦ãà « § £à㧪¨? [1-¥â/2-¤ ]: ",0
|
||||
bdev db "‡ £à㧨âì ®¡à § ¨§ [1-¤¨áª¥â ; 2-C:\menuet.img (FAT32);"
|
||||
db 13,10,186," "
|
||||
db "3-¨á¯®«ì§®¢ âì 㦥 § £àã¦¥ë© ®¡à §]: ",0
|
||||
probetext db 13,10,13,10,186," ‘â ¤ àâë© ¢¨¤¥®à¥¦¨¬? [1-¤ , "
|
||||
db "2-¯à®¢¥à¨âì ¤à㣨¥ (Vesa 3.0)]: ",0
|
||||
;memokz256 db 13,10,186," RAM 256 Mb",0
|
||||
;memokz128 db 13,10,186," RAM 128 Mb",0
|
||||
;memokz64 db 13,10,186," RAM 64 Mb",0
|
||||
;memokz32 db 13,10,186," RAM 32 Mb",0
|
||||
;memokz16 db 13,10,186," RAM 16 Mb",0
|
||||
prnotfnd db "Žè¨¡ª - ‚¨¤¥®à¥¦¨¬ ¥ ©¤¥.",0
|
||||
;modena db "Žè¨¡ª - ’ॡã¥âáï ¯®¤¤¥à¦ª VBE 0x112+.",0
|
||||
not386 db "Žè¨¡ª - ’ॡã¥âáï ¯à®æ¥áá®à 386+.",0
|
||||
btns db "Žè¨¡ª - <20>¥ ¬®£ã ®¯à¥¤¥«¨âì £«ã¡¨ã 梥â .",0
|
||||
fatalsel db "Žè¨¡ª - ‚ë¡à ë© ¢¨¤¥®à¥¦¨¬ ¥ ¯®¤¤¥à¦¨¢ ¥âáï.",0
|
||||
badsect db 13,10,186," Žè¨¡ª - „¨áª¥â ¯®¢à¥¦¤¥ . <20>®¯à®¡ã©â¥ ¤àã£ãî.",0
|
||||
memmovefailed db 13,10,186," Žè¨¡ª - Int 0x15 move failed.",0
|
||||
okt db " ... OK"
|
||||
linef db 13,10,0
|
||||
diskload db "‡ £à㧪 ¤¨áª¥âë: 00 %",8,8,8,8,0
|
||||
pros db "00"
|
||||
backspace2 db 8,8,0
|
||||
boot_dev db 0
|
||||
start_msg db "<EFBFBD> ¦¬¨â¥ [abcd] ¤«ï ¨§¬¥¥¨ï áâ஥ª, [Enter] ¤«ï ¯à®¤®«¦¥¨ï § £à㧪¨",13,10,0
|
||||
time_msg db " ¨«¨ ¯®¤®¦¤¨â¥ "
|
||||
time_str db " 5 ᥪ㤠"
|
||||
db " ¤® ¢â®¬ â¨ç¥áª®£® ¯à®¤®«¦¥¨ï",13,10,0
|
||||
current_cfg_msg db "’¥ªã騥 áâனª¨:",13,10,0
|
||||
curvideo_msg db " [a] ‚¨¤¥®à¥¦¨¬: ",0
|
||||
mode1 db "640x480",0
|
||||
mode2 db "800x600",0
|
||||
mode3 db "1024x768",0
|
||||
mode4 db "1280x1024",0
|
||||
modes_msg dw mode4-0x10000,mode1-0x10000,mode2-0x10000,mode3-0x10000
|
||||
modevesa20 db " á LFB",0
|
||||
modevesa12 db ", VESA 1.2 Bnk",0
|
||||
mode9 db "320x200, EGA/CGA 256 梥⮢",0
|
||||
mode10 db "640x480, VGA 16 梥⮢",0
|
||||
probeno_msg db " (áâ ¤ àâë© ¢¨¤¥®à¥¦¨¬)",0
|
||||
probeok_msg db " (¯à®¢¥à¨âì ¥áâ ¤ àâë¥ à¥¦¨¬ë)",0
|
||||
mtrr_msg db " [b] ˆá¯®«ì§®¢ ¨¥ MTRR ¤«ï ãáª®à¥¨ï £à 䨪¨:",0
|
||||
on_msg db " ¢ª«",13,10,0
|
||||
off_msg db " ¢ëª«",13,10,0
|
||||
vrrm_msg db " [c] ˆá¯®«ì§®¢ ¨¥ VRR:",0
|
||||
preboot_device_msg db " [d] Ž¡à § ¤¨áª¥âë: ",0
|
||||
preboot_device_msgs dw 0,pdm1-0x10000,pdm2-0x10000,pdm3-0x10000
|
||||
pdm1 db " áâ®ïé ï ¤¨áª¥â ",13,10,0
|
||||
pdm2 db "C:\menuet.img (FAT32)",13,10,0
|
||||
pdm3 db "¨á¯®«ì§®¢ âì 㦥 § £àã¦¥ë© ®¡à §",13,10,0
|
||||
loading_msg db "ˆ¤ñâ § £à㧪 KolibriOS...",0
|
||||
save_quest db "‡ ¯®¬¨âì ⥪ã騥 áâனª¨? [y/n]: ",0
|
||||
loader_block_error db "Žè¨¡ª ¢ ¤ ëå ç «ì®£® § £àã§ç¨ª , ¯à®¤®«¦¥¨¥ ¥¢®§¬®¦®.",0
|
26
kernel/tags/kolibri0.5.3.0/boot/preboot.inc
Normal file
26
kernel/tags/kolibri0.5.3.0/boot/preboot.inc
Normal file
@ -0,0 +1,26 @@
|
||||
display_modechg db 0 ; display mode change for text, yes/no (0 or 2)
|
||||
;
|
||||
; !! Important note !!
|
||||
;
|
||||
; Must be set to 2, to avoid two screenmode
|
||||
; changes within a very short period of time.
|
||||
|
||||
display_atboot db 0 ; show boot screen messages ( 2-no )
|
||||
|
||||
preboot_graph db 0 ; graph mode
|
||||
preboot_gprobe db 0 ; probe vesa3 videomodes (1-no, 2-yes)
|
||||
preboot_vrrm db 0 ; use VRR_M (1-yes, 2- no)
|
||||
;;preboot_mouse db 0 ; mouse port (1-PS2, 2-COM1, 3-COM2)
|
||||
preboot_mtrr db 0 ; mtrr acceleration (1-yes, 2-no)
|
||||
preboot_device db 0 ; boot device
|
||||
; (1-floppy 2-harddisk 3-kernel restart)
|
||||
;;preboot_memory db 0 ; amount of memory
|
||||
; (1-16Mb;2-32Mb;3-64Mb;4-128Mb;5-256Mb)
|
||||
; !!!! 0 - autodetect !!!!
|
||||
preboot_blogesc db 1 ; start immediately after bootlog
|
||||
|
||||
if $>10200h
|
||||
ERROR: prebooting parameters must fit in first sector!!!
|
||||
end if
|
||||
hdsysimage db 'MENUET IMG' ; load from
|
||||
image_save db 'MENUET IMG' ; save to
|
95
kernel/tags/kolibri0.5.3.0/boot/rdload.inc
Normal file
95
kernel/tags/kolibri0.5.3.0/boot/rdload.inc
Normal file
@ -0,0 +1,95 @@
|
||||
; READ RAMDISK IMAGE FROM HD
|
||||
|
||||
cmp [boot_dev],1
|
||||
jne no_sys_on_hd
|
||||
|
||||
test [0x40001],byte 0x40
|
||||
jz position_2
|
||||
mov [hdbase],0x1f0
|
||||
mov [hdid],0x0
|
||||
mov [hdpos],1
|
||||
mov [fat32part],0
|
||||
position_1_1:
|
||||
inc [fat32part]
|
||||
call search_and_read_image
|
||||
cmp [image_retrieved],1
|
||||
je yes_sys_on_hd
|
||||
movzx eax,byte [0x40002]
|
||||
cmp [fat32part],eax
|
||||
jle position_1_1
|
||||
position_2:
|
||||
test [0x40001],byte 0x10
|
||||
jz position_3
|
||||
mov [hdbase],0x1f0
|
||||
mov [hdid],0x10
|
||||
mov [hdpos],2
|
||||
mov [fat32part],0
|
||||
position_2_1:
|
||||
inc [fat32part]
|
||||
call search_and_read_image
|
||||
cmp [image_retrieved],1
|
||||
je yes_sys_on_hd
|
||||
movzx eax,byte [0x40003]
|
||||
cmp eax,[fat32part]
|
||||
jle position_2_1
|
||||
position_3:
|
||||
test [0x40001],byte 0x4
|
||||
jz position_4
|
||||
mov [hdbase],0x170
|
||||
mov [hdid],0x0
|
||||
mov [hdpos],3
|
||||
mov [fat32part],0
|
||||
position_3_1:
|
||||
inc [fat32part]
|
||||
call search_and_read_image
|
||||
cmp [image_retrieved],1
|
||||
je yes_sys_on_hd
|
||||
movzx eax,byte [0x40004]
|
||||
cmp eax,[fat32part]
|
||||
jle position_3_1
|
||||
position_4:
|
||||
test [0x40001],byte 0x1
|
||||
jz no_sys_on_hd
|
||||
mov [hdbase],0x170
|
||||
mov [hdid],0x10
|
||||
mov [hdpos],4
|
||||
mov [fat32part],0
|
||||
position_4_1:
|
||||
inc [fat32part]
|
||||
call search_and_read_image
|
||||
cmp [image_retrieved],1
|
||||
je yes_sys_on_hd
|
||||
movzx eax,byte [0x40005]
|
||||
cmp eax,[fat32part]
|
||||
jle position_4_1
|
||||
jmp yes_sys_on_hd
|
||||
|
||||
search_and_read_image:
|
||||
; mov [0xfe10],dword 0 ; entries in hd cache
|
||||
call set_FAT32_variables
|
||||
mov edx, bootpath
|
||||
call read_image
|
||||
test eax, eax
|
||||
jz image_present
|
||||
mov edx, bootpath2
|
||||
call read_image
|
||||
test eax, eax
|
||||
jz image_present
|
||||
ret
|
||||
image_present:
|
||||
mov [image_retrieved],1
|
||||
ret
|
||||
|
||||
read_image:
|
||||
mov eax, hdsysimage
|
||||
mov ebx, 1474560/512
|
||||
mov ecx, 0x100000
|
||||
mov esi, 0
|
||||
mov edi, 12
|
||||
call file_read
|
||||
ret
|
||||
|
||||
image_retrieved db 0
|
||||
counter_of_partitions db 0
|
||||
no_sys_on_hd:
|
||||
yes_sys_on_hd:
|
92
kernel/tags/kolibri0.5.3.0/boot/ru.inc
Normal file
92
kernel/tags/kolibri0.5.3.0/boot/ru.inc
Normal file
@ -0,0 +1,92 @@
|
||||
; Generated by RUFNT.EXE
|
||||
; By BadBugsKiller (C)
|
||||
; Modifyed by BadBugsKiller 12.01.2004 17:45
|
||||
; Øðèôò óìåíüøåí â ðàçìåðå è òåïåðü ñîñòîèò èç 2-óõ ÷àñòåé,
|
||||
; ñîäåðæàùèõ òîëüêî ñèìâîëû ðóññêîãî àëôàâèòà.
|
||||
; ñèìâîëû â êîäèðîâêå ASCII (ÄÎÑ'îâñêàÿ), êîäîâàÿ ñòàíèöà 866.
|
||||
RU_FNT1:
|
||||
db 0x00, 0x00, 0x1E, 0x36, 0x66, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xFE, 0x62, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xFE, 0x66, 0x62, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x1E, 0x36, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xFF, 0xC3, 0x81, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xDB, 0xDB, 0x5A, 0x5A, 0x7E, 0x7E, 0x5A, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x6C, 0x38, 0xC6, 0xC6, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C, 0x78, 0x78, 0x6C, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x1F, 0x36, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xCF, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
|
||||
db 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, 0xC2, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xFF, 0xDB, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x7E, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xC6, 0xC6, 0x6C, 0x7C, 0x38, 0x38, 0x7C, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFF, 0x03, 0x03, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xFE, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xFF, 0x03, 0x03, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xF8, 0xF0, 0xB0, 0x30, 0x3E, 0x33, 0x33, 0x33, 0x33, 0x7E, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xC3, 0xC3, 0xC3, 0xC3, 0xF3, 0xDB, 0xDB, 0xDB, 0xDB, 0xF3, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x26, 0x3E, 0x26, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xCE, 0xDB, 0xDB, 0xDB, 0xFB, 0xDB, 0xDB, 0xDB, 0xDB, 0xCE, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x3F, 0x66, 0x66, 0x66, 0x3E, 0x3E, 0x66, 0x66, 0x66, 0xE7, 0x00, 0x00, 0x00, 0x00
|
||||
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x02, 0x06, 0x7C, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x62, 0x62, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x36, 0x66, 0x66, 0x66, 0x66, 0xFF, 0xC3, 0xC3, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0xD6, 0x54, 0x7C, 0x54, 0xD6, 0xD6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x3C, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xCE, 0xD6, 0xE6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x6C, 0x38, 0xC6, 0xC6, 0xCE, 0xD6, 0xE6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x36, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xD6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
|
||||
RU_FNT2:
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xC6, 0x7C, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x3C, 0x18, 0x7E, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x7E, 0x18, 0x18, 0x3C, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFF, 0x03, 0x03, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xFE, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xFE, 0x03, 0x03, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xB0, 0xB0, 0x3E, 0x33, 0x33, 0x7E, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xF6, 0xDE, 0xDE, 0xF6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x3E, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0xDB, 0xDB, 0xFB, 0xDB, 0xDB, 0xCE, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xC6, 0xC6, 0x7E, 0x36, 0x66, 0xE7, 0x00, 0x00, 0x00, 0x00
|
||||
|
||||
db 0x6C, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xFC, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC8, 0xF8, 0xC8, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xF8, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x66, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x6C, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x6C, 0x38, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x6C, 0x38, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xC6, 0x7C, 0x00
|
||||
db 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0xCF, 0xCD, 0xEF, 0xEC, 0xFF, 0xDC, 0xDC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
563
kernel/tags/kolibri0.5.3.0/boot/shutdown.inc
Normal file
563
kernel/tags/kolibri0.5.3.0/boot/shutdown.inc
Normal file
@ -0,0 +1,563 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;
|
||||
;; Shutdown for Menuet
|
||||
;;
|
||||
;; Distributed under General Public License
|
||||
;; See file COPYING for details.
|
||||
;; Copyright 2003 Ville Turjanmaa
|
||||
;;
|
||||
|
||||
|
||||
system_shutdown: ; shut down the system
|
||||
|
||||
mov eax,3 ; stop playing cd
|
||||
call sys_cd_audio
|
||||
cli
|
||||
cld
|
||||
|
||||
mov al,[0x2f0000+0x9030]
|
||||
cmp al,1
|
||||
jl no_shutdown_parameter
|
||||
cmp al,4
|
||||
jg no_shutdown_parameter
|
||||
jmp yes_shutdown_param
|
||||
no_shutdown_parameter:
|
||||
|
||||
movzx ecx,word [0x2f0000+0x900A]
|
||||
movzx esi,word [0x2f0000+0x900C]
|
||||
imul ecx,esi ;[0xfe04]
|
||||
; mov ecx,0x500000/4 ;3fff00/4 ; darken screen
|
||||
push ecx
|
||||
mov esi,[0xfe80]
|
||||
cmp esi,32*0x100000
|
||||
jbe no_darken_screen
|
||||
mov edi,16*0x100000
|
||||
sdnewpix:
|
||||
mov eax,[esi]
|
||||
add esi,4
|
||||
shr eax,1
|
||||
and eax,0x7f7f7f7f
|
||||
stosd
|
||||
loop sdnewpix
|
||||
pop ecx
|
||||
mov esi,16*0x100000
|
||||
mov edi,[0xfe80]
|
||||
cld
|
||||
rep movsd
|
||||
no_darken_screen:
|
||||
|
||||
mov eax,[0xfe00]
|
||||
shr eax,1
|
||||
sub eax,220
|
||||
|
||||
mov ebx,[0xfe04]
|
||||
shr ebx,1
|
||||
mov [shutdownpos],ebx
|
||||
sub ebx,120
|
||||
|
||||
mov edi,1
|
||||
mov ecx,0x0000ff
|
||||
|
||||
sdnewpix2:
|
||||
|
||||
call [putpixel]
|
||||
|
||||
inc eax
|
||||
mov esi,[0xfe00]
|
||||
shr esi,1
|
||||
add esi,220
|
||||
cmp eax,esi
|
||||
jnz sdnewpix2
|
||||
|
||||
dec ecx
|
||||
|
||||
mov eax,[0xfe00]
|
||||
shr eax,1
|
||||
sub eax,220
|
||||
|
||||
inc ebx
|
||||
|
||||
mov edx,[shutdownpos]
|
||||
add edx,105
|
||||
cmp ebx,edx
|
||||
jnz sdnewpix2
|
||||
|
||||
|
||||
mov esi,[0xfe00] ; menuet version
|
||||
shr esi,1
|
||||
sub esi,220
|
||||
add esi,27
|
||||
shl esi,16
|
||||
mov eax,esi
|
||||
add eax,[shutdownpos]
|
||||
sub eax,105
|
||||
mov ebx,0xffff00
|
||||
mov ecx,version
|
||||
mov edx,34
|
||||
mov edi,1
|
||||
call dtext
|
||||
|
||||
mov esi,[0xfe00] ; 'it is safe..'
|
||||
shr esi,1
|
||||
sub esi,220
|
||||
add esi,27
|
||||
shl esi,16
|
||||
mov eax,esi
|
||||
add eax,[shutdownpos]
|
||||
add eax,33
|
||||
mov esi,6
|
||||
mov ebx,0xffffff
|
||||
mov ecx,shutdowntext
|
||||
mov edx,40
|
||||
mov edi,1
|
||||
newsdt:
|
||||
call dtext
|
||||
add eax,10
|
||||
add ecx,40
|
||||
dec esi
|
||||
jnz newsdt
|
||||
|
||||
mov eax,rosef ; load rose.txt
|
||||
mov ebx,0
|
||||
mov ecx,16800
|
||||
mov edx,0x90000
|
||||
mov esi,12
|
||||
call fileread
|
||||
|
||||
mov esi,[0xfe00] ; draw rose
|
||||
shr esi,1
|
||||
add esi,20
|
||||
shl esi,16
|
||||
mov eax,esi
|
||||
add eax,[shutdownpos]
|
||||
sub eax,110
|
||||
|
||||
mov ebx,0x00ff00
|
||||
mov ecx,0x90001
|
||||
mov edx,27
|
||||
mov edi,1
|
||||
|
||||
nrl:
|
||||
call dtext
|
||||
sub ebx,0x050000
|
||||
add eax,8
|
||||
add ecx,31
|
||||
cmp ecx,dword 0x90001+25*31
|
||||
jnz nrl
|
||||
|
||||
call checkEgaCga
|
||||
|
||||
yes_shutdown_param:
|
||||
|
||||
cli
|
||||
|
||||
mov eax,kernel ; load kernel.mnt to 0x8000:0
|
||||
mov esi,12
|
||||
mov ebx,0
|
||||
mov ecx,-1
|
||||
mov edx,0x80000
|
||||
call fileread
|
||||
|
||||
mov esi,restart_kernel_4000 ; move kernel re-starter to 0x4000:0
|
||||
mov edi,0x40000
|
||||
mov ecx,1000
|
||||
cld
|
||||
rep movsb
|
||||
|
||||
mov eax,0x2F0000 ; restore 0x0 - 0xffff
|
||||
mov ebx,0x0000
|
||||
mov ecx,0xffff
|
||||
call memmove
|
||||
|
||||
call restorefatchain
|
||||
|
||||
mov eax,pr_mode_exit
|
||||
mov [0x467+0],ax
|
||||
mov [0x467+2],word 0x1000
|
||||
|
||||
mov al,0x0F
|
||||
out 0x70,al
|
||||
mov al,0x05
|
||||
out 0x71,al
|
||||
|
||||
mov al,0xFE
|
||||
out 0x64,al
|
||||
hlt
|
||||
|
||||
use16
|
||||
|
||||
pr_mode_exit:
|
||||
|
||||
; setup stack
|
||||
mov ax, 3000h
|
||||
mov ss, ax
|
||||
mov esp, 0EC00h
|
||||
; setup ds
|
||||
push cs
|
||||
pop ds
|
||||
; mov ax,1000
|
||||
; mov ds,ax
|
||||
; mov es,ax
|
||||
; mov fs,ax
|
||||
; mov gs,ax
|
||||
; mov ss,ax
|
||||
; mov bl,[shutdown_parameter]
|
||||
; mov [es:shutdown_parameter-0x10000],bl
|
||||
|
||||
jmp real_mode-0x10000
|
||||
|
||||
old_ints_h:
|
||||
dw 4*0x20
|
||||
dd 0
|
||||
dw 0
|
||||
|
||||
rdelay:
|
||||
ret
|
||||
real_mode:
|
||||
|
||||
lidt [old_ints_h-0x10000]
|
||||
;remap IRQs
|
||||
mov al,0x11
|
||||
out 0x20,al
|
||||
call rdelay
|
||||
out 0xA0,al
|
||||
call rdelay
|
||||
|
||||
mov al,0x08
|
||||
out 0x21,al
|
||||
call rdelay
|
||||
mov al,0x70
|
||||
out 0xA1,al
|
||||
call rdelay
|
||||
|
||||
mov al,0x04
|
||||
out 0x21,al
|
||||
call rdelay
|
||||
mov al,0x02
|
||||
out 0xA1,al
|
||||
call rdelay
|
||||
|
||||
mov al,0x01
|
||||
out 0x21,al
|
||||
call rdelay
|
||||
out 0xA1,al
|
||||
call rdelay
|
||||
|
||||
mov al,0
|
||||
out 0x21,al
|
||||
call rdelay
|
||||
out 0xA1,al
|
||||
sti
|
||||
|
||||
jmp temp_3456
|
||||
|
||||
nbw:
|
||||
xor ax,ax
|
||||
in al,0x60
|
||||
call pause_key
|
||||
cmp al,7
|
||||
jge nbw
|
||||
mov bl,al
|
||||
nbw2:
|
||||
in al,0x60
|
||||
call pause_key
|
||||
cmp al,bl
|
||||
je nbw2
|
||||
cmp al,240 ;ax,240
|
||||
jne nbw31
|
||||
mov al,bl
|
||||
dec al
|
||||
jmp nbw32
|
||||
nbw31:
|
||||
add bl,128
|
||||
cmp al,bl
|
||||
jne nbw
|
||||
sub al,129
|
||||
|
||||
nbw32:
|
||||
|
||||
cmp al,1 ; write floppy
|
||||
jne no_floppy_write
|
||||
call floppy_write
|
||||
jmp temp_3456 ;nbw
|
||||
no_floppy_write:
|
||||
|
||||
cmp al,2 ; poweroff
|
||||
jne no_apm_off
|
||||
call APM_PowerOff
|
||||
no_apm_off:
|
||||
|
||||
cmp al,3 ; boot
|
||||
jnz no_sys_boot
|
||||
mov ax,0x0040
|
||||
mov ds,ax
|
||||
mov word[0x0072],0x1234
|
||||
jmp 0xF000:0xFFF0
|
||||
no_sys_boot:
|
||||
|
||||
cmp al,4 ; restart kernel
|
||||
je restart_kernel
|
||||
|
||||
temp_3456:
|
||||
push word 0x0000
|
||||
pop es
|
||||
mov al,byte [es:0x9030]
|
||||
cmp al,1
|
||||
jl nbw
|
||||
cmp al,4
|
||||
jg nbw
|
||||
jmp nbw32
|
||||
|
||||
; jmp nbw
|
||||
pause_key:
|
||||
mov ecx,100
|
||||
pause_key_1:
|
||||
loop pause_key_1
|
||||
ret
|
||||
|
||||
iglobal
|
||||
kernel db 'KERNEL MNT'
|
||||
; shutdown_parameter db 0
|
||||
endg
|
||||
|
||||
restart_kernel:
|
||||
|
||||
mov ax,0x0003 ; set text mode for screen
|
||||
int 0x10
|
||||
|
||||
jmp 0x4000:0000
|
||||
|
||||
|
||||
restart_kernel_4000:
|
||||
cli
|
||||
|
||||
; mov di,0x1000 ; load kernel image from 0x8000:0 -> 0x1000:0
|
||||
;
|
||||
; new_kernel_block_move:
|
||||
;
|
||||
; mov ebx,0
|
||||
;
|
||||
; new_kernel_byte_move:
|
||||
;
|
||||
; mov ax,di
|
||||
; add ax,0x7000
|
||||
; mov es,ax
|
||||
; mov dl,[es:bx]
|
||||
; mov es,di
|
||||
; mov [es:bx],dl
|
||||
;
|
||||
; inc ebx
|
||||
; cmp ebx,65536
|
||||
; jbe new_kernel_byte_move
|
||||
;
|
||||
; add di,0x1000
|
||||
; cmp di,0x2000
|
||||
; jbe new_kernel_block_move
|
||||
push ds
|
||||
pop es
|
||||
mov cx, 0x8000
|
||||
push cx
|
||||
mov ds, cx
|
||||
xor si, si
|
||||
xor di, di
|
||||
rep movsw
|
||||
mov ax, 0x9000
|
||||
mov ds, ax
|
||||
mov ax, 0x2000
|
||||
mov es, ax
|
||||
pop cx
|
||||
rep movsw
|
||||
|
||||
wbinvd ; write and invalidate cache
|
||||
|
||||
; mov ax,0x1000
|
||||
; mov es,ax
|
||||
; mov ax,0x3000
|
||||
; mov ss,ax
|
||||
; mov sp,0xec00
|
||||
; restore timer
|
||||
mov al, 00110100b
|
||||
out 43h, al
|
||||
jcxz $+2
|
||||
mov al, 0xFF
|
||||
out 40h, al
|
||||
jcxz $+2
|
||||
out 40h, al
|
||||
jcxz $+2
|
||||
sti
|
||||
|
||||
; bootloader interface
|
||||
push 0x1000
|
||||
pop ds
|
||||
mov si, .bootloader_block-0x10000
|
||||
mov ax, 'KL'
|
||||
jmp 0x1000:0000
|
||||
|
||||
.bootloader_block:
|
||||
db 1 ; version
|
||||
dw 1 ; floppy image is in memory
|
||||
dd 0 ; cannot save parameters
|
||||
|
||||
APM_PowerOff:
|
||||
;!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
mov ax,0x5300
|
||||
xor bx,bx
|
||||
int 0x15
|
||||
push ax
|
||||
|
||||
mov ax,0x5301
|
||||
xor bx,bx
|
||||
int 0x15
|
||||
|
||||
mov ax,0x5308
|
||||
mov bx,1
|
||||
mov cx,bx
|
||||
int 0x15
|
||||
|
||||
mov ax,0x530E
|
||||
xor bx,bx
|
||||
pop cx
|
||||
int 0x15
|
||||
|
||||
mov ax,0x530D
|
||||
mov bx,1
|
||||
mov cx,bx
|
||||
int 0x15
|
||||
|
||||
mov ax,0x530F
|
||||
mov bx,1
|
||||
mov cx,bx
|
||||
int 0x15
|
||||
|
||||
mov ax,0x5307
|
||||
mov bx,1
|
||||
mov cx,3
|
||||
int 0x15
|
||||
;!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
ret
|
||||
uglobal
|
||||
flm db 0
|
||||
endg
|
||||
|
||||
floppy_write: ; write diskette image to physical floppy
|
||||
|
||||
pusha
|
||||
|
||||
mov ax,0x1000
|
||||
mov es,ax
|
||||
cmp [es:flm-0x10000],byte 1
|
||||
je fwwritedone
|
||||
mov [es:flm-0x10000],byte 1
|
||||
|
||||
mov ax,0x0000 ; reset drive
|
||||
mov dx,0x0000
|
||||
int 0x13
|
||||
|
||||
mov cx,0x0001 ; startcyl,startsector
|
||||
mov dx,0x0000 ; starthead,drive
|
||||
push word 80*2 ; read no of sect
|
||||
|
||||
fwwrites:
|
||||
pusha
|
||||
|
||||
; move 1mb+ -> 0:a000
|
||||
|
||||
pusha
|
||||
mov si,fwmovedesc -0x10000
|
||||
push word 0x1000
|
||||
pop es
|
||||
mov cx,256*18
|
||||
mov ah,0x87
|
||||
int 0x15
|
||||
mov eax,[es:fwmovedesc-0x10000+0x12]
|
||||
add eax,512*18
|
||||
mov [es:fwmovedesc-0x10000+0x12],eax
|
||||
popa
|
||||
|
||||
xor si,si
|
||||
fwnewwrite:
|
||||
push word 0x0
|
||||
pop es
|
||||
mov bx,0xa000 ; es:bx -> data area
|
||||
mov ax,0x0300+18 ; read, no of sectors to read
|
||||
int 0x13
|
||||
|
||||
cmp ah,0
|
||||
jz fwgoodwrite
|
||||
|
||||
add si,1
|
||||
cmp si,10
|
||||
jnz fwnewwrite
|
||||
|
||||
add esp,32+2
|
||||
|
||||
popa ; can't access diskette
|
||||
ret
|
||||
|
||||
fwgoodwrite:
|
||||
|
||||
popa
|
||||
|
||||
inc dh
|
||||
cmp dh,2
|
||||
jnz fwbb2
|
||||
mov dh,0
|
||||
inc ch
|
||||
|
||||
fwbb2:
|
||||
|
||||
cld
|
||||
pop ax
|
||||
dec ax
|
||||
push ax
|
||||
cmp ax,0
|
||||
jnz fwrs
|
||||
|
||||
pop ax
|
||||
|
||||
jmp fwwritedone
|
||||
fwrs:
|
||||
jmp fwwrites
|
||||
|
||||
fwmovedesc:
|
||||
|
||||
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
|
||||
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
|
||||
db 0xff,0xff,0x0,0x00,0x10,0x93,0x0,0x0
|
||||
db 0xff,0xff,0x0,0xa0,0x00,0x93,0x0,0x0
|
||||
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
|
||||
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
|
||||
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
|
||||
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
|
||||
|
||||
fwwritedone:
|
||||
|
||||
popa
|
||||
|
||||
ret
|
||||
|
||||
|
||||
use32
|
||||
|
||||
uglobal
|
||||
shutdownpos dd 0x0
|
||||
endg
|
||||
|
||||
iglobal
|
||||
;shutdowntext:
|
||||
; db "IT'S SAFE TO POWER OFF COMPUTER OR "
|
||||
; db ' '
|
||||
; db '1) SAVE RAMDISK TO FLOPPY '
|
||||
; db '2) APM - POWEROFF '
|
||||
; db '3) REBOOT '
|
||||
; db '4) RESTART KERNEL '
|
||||
shutdowntext:
|
||||
db "<EFBFBD>¥§®¯ ᮥ ¢ëª«î票¥ ª®¬¯ìîâ¥à ¨«¨ "
|
||||
db ' '
|
||||
db '1) ‘®åà ¨âì à ¬¤¨áª ¤¨áª¥âã '
|
||||
db '2) APM - ¢ëª«î票¥ ¯¨â ¨ï '
|
||||
db '3) <20>¥à¥§ £à㧪 á¨á⥬ë '
|
||||
db '4) <20>¥áâ àâ ï¤à ¨§ Ž‡“ '
|
||||
rosef:
|
||||
db 'ROSE TXT'
|
||||
endg
|
4
kernel/tags/kolibri0.5.3.0/build_en.bat
Normal file
4
kernel/tags/kolibri0.5.3.0/build_en.bat
Normal file
@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm kernel.asm kernel.mnt
|
||||
@pause
|
4
kernel/tags/kolibri0.5.3.0/build_ru.bat
Normal file
4
kernel/tags/kolibri0.5.3.0/build_ru.bat
Normal file
@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ru >lang.inc
|
||||
@fasm kernel.asm kernel.mnt
|
||||
@pause
|
46
kernel/tags/kolibri0.5.3.0/bus/pci/pci16.inc
Normal file
46
kernel/tags/kolibri0.5.3.0/bus/pci/pci16.inc
Normal file
@ -0,0 +1,46 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; PCI16.INC ;;
|
||||
;; ;;
|
||||
;; 16 bit PCI driver code ;;
|
||||
;; ;;
|
||||
;; Version 0.2 December 21st, 2002 ;;
|
||||
;; ;;
|
||||
;; Author: Victor Prodan, victorprodan@yahoo.com ;;
|
||||
;; ;;
|
||||
;; See file COPYING for details ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
init_pci_16:
|
||||
|
||||
pushad
|
||||
|
||||
xor ax,ax
|
||||
mov es,ax
|
||||
mov byte [es:0x9020],1 ;default mechanism:1
|
||||
mov ax,0xb101
|
||||
int 0x1a
|
||||
or ah,ah
|
||||
jnz pci16skip
|
||||
|
||||
mov [es:0x9021],cl ;last PCI bus in system
|
||||
mov [es:0x9022],bx
|
||||
mov [es:0x9024],edi
|
||||
|
||||
; we have a PCI BIOS, so check which configuration mechanism(s)
|
||||
; it supports
|
||||
; AL = PCI hardware characteristics (bit0 => mechanism1, bit1 => mechanism2)
|
||||
test al,1
|
||||
jnz pci16skip
|
||||
test al,2
|
||||
jz pci16skip
|
||||
mov byte [es:0x9020],2 ; if (al&3)==2 => mechanism 2
|
||||
|
||||
pci16skip:
|
||||
|
||||
mov ax,0x1000
|
||||
mov es,ax
|
||||
|
||||
popad
|
358
kernel/tags/kolibri0.5.3.0/bus/pci/pci32.inc
Normal file
358
kernel/tags/kolibri0.5.3.0/bus/pci/pci32.inc
Normal file
@ -0,0 +1,358 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; PCI32.INC ;;
|
||||
;; ;;
|
||||
;; 32 bit PCI driver code ;;
|
||||
;; ;;
|
||||
;; Version 0.2 December 21st, 2002 ;;
|
||||
;; ;;
|
||||
;; Author: Victor Prodan, victorprodan@yahoo.com ;;
|
||||
;; Credits: ;;
|
||||
;; Ralf Brown ;;
|
||||
;; Mike Hibbett, mikeh@oceanfree.net ;;
|
||||
;; ;;
|
||||
;; See file COPYING for details ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; pci_api:
|
||||
;
|
||||
; Description
|
||||
; entry point for system PCI calls
|
||||
;***************************************************************************
|
||||
|
||||
align 4
|
||||
|
||||
pci_api:
|
||||
|
||||
cmp [pci_access_enabled],1
|
||||
jne no_pci_access_for_applications
|
||||
|
||||
or al,al
|
||||
jnz pci_fn_1
|
||||
; PCI function 0: get pci version (AH.AL)
|
||||
movzx eax,word [0x2F0000+0x9022]
|
||||
ret
|
||||
|
||||
pci_fn_1:
|
||||
cmp al,1
|
||||
jnz pci_fn_2
|
||||
|
||||
; PCI function 1: get last bus in AL
|
||||
mov al,[0x2F0000+0x9021]
|
||||
ret
|
||||
|
||||
pci_fn_2:
|
||||
cmp al,2
|
||||
jne pci_fn_3
|
||||
; PCI function 2: get pci access mechanism
|
||||
mov al,[0x2F0000+0x9020]
|
||||
ret
|
||||
pci_fn_3:
|
||||
|
||||
cmp al,4
|
||||
jz pci_read_reg ;byte
|
||||
cmp al,5
|
||||
jz pci_read_reg ;word
|
||||
cmp al,6
|
||||
jz pci_read_reg ;dword
|
||||
|
||||
cmp al,8
|
||||
jz pci_write_reg ;byte
|
||||
cmp al,9
|
||||
jz pci_write_reg ;word
|
||||
cmp al,10
|
||||
jz pci_write_reg ;dword
|
||||
|
||||
no_pci_access_for_applications:
|
||||
|
||||
mov eax,-1
|
||||
|
||||
ret
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; pci_make_config_cmd
|
||||
;
|
||||
; Description
|
||||
; creates a command dword for use with the PCI bus
|
||||
; bus # in ah
|
||||
; device+func in bh (dddddfff)
|
||||
; register in bl
|
||||
;
|
||||
; command dword returned in eax ( 10000000 bbbbbbbb dddddfff rrrrrr00 )
|
||||
;***************************************************************************
|
||||
|
||||
align 4
|
||||
|
||||
pci_make_config_cmd:
|
||||
shl eax,8 ; move bus to bits 16-23
|
||||
mov ax,bx ; combine all
|
||||
and eax,0xffffff
|
||||
or eax,0x80000000
|
||||
ret
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; pci_read_reg:
|
||||
;
|
||||
; Description
|
||||
; read a register from the PCI config space into EAX/AX/AL
|
||||
; IN: ah=bus,device+func=bh,register address=bl
|
||||
; number of bytes to read (1,2,4) coded into AL, bits 0-1
|
||||
;***************************************************************************
|
||||
|
||||
align 4
|
||||
|
||||
pci_read_reg:
|
||||
cmp byte [0x2F0000+0x9020],2 ;what mechanism will we use?
|
||||
je pci_read_reg_2
|
||||
|
||||
; mechanism 1
|
||||
push esi ; save register size into ESI
|
||||
mov esi,eax
|
||||
and esi,3
|
||||
|
||||
call pci_make_config_cmd
|
||||
mov ebx,eax
|
||||
; get current state
|
||||
mov dx,0xcf8
|
||||
in eax, dx
|
||||
push eax
|
||||
; set up addressing to config data
|
||||
mov eax,ebx
|
||||
and al,0xfc ; make address dword-aligned
|
||||
out dx,eax
|
||||
; get requested DWORD of config data
|
||||
mov dl,0xfc
|
||||
and bl,3
|
||||
or dl,bl ; add to port address first 2 bits of register address
|
||||
|
||||
or esi,esi
|
||||
jz pci_read_byte1
|
||||
cmp esi,1
|
||||
jz pci_read_word1
|
||||
cmp esi,2
|
||||
jz pci_read_dword1
|
||||
jmp pci_fin_read1
|
||||
|
||||
pci_read_byte1:
|
||||
in al,dx
|
||||
jmp pci_fin_read1
|
||||
pci_read_word1:
|
||||
in ax,dx
|
||||
jmp pci_fin_read1
|
||||
pci_read_dword1:
|
||||
in eax,dx
|
||||
jmp pci_fin_read1
|
||||
pci_fin_read1:
|
||||
; restore configuration control
|
||||
xchg eax,[esp]
|
||||
mov dx,0xcf8
|
||||
out dx,eax
|
||||
|
||||
pop eax
|
||||
pop esi
|
||||
ret
|
||||
pci_read_reg_2:
|
||||
|
||||
test bh,128 ;mech#2 only supports 16 devices per bus
|
||||
jnz pci_read_reg_err
|
||||
|
||||
push esi ; save register size into ESI
|
||||
mov esi,eax
|
||||
and esi,3
|
||||
|
||||
push eax
|
||||
;store current state of config space
|
||||
mov dx,0xcf8
|
||||
in al,dx
|
||||
mov ah,al
|
||||
mov dl,0xfa
|
||||
in al,dx
|
||||
|
||||
xchg eax,[esp]
|
||||
; out 0xcfa,bus
|
||||
mov al,ah
|
||||
out dx,al
|
||||
; out 0xcf8,0x80
|
||||
mov dl,0xf8
|
||||
mov al,0x80
|
||||
out dx,al
|
||||
; compute addr
|
||||
shr bh,3 ; func is ignored in mechanism 2
|
||||
or bh,0xc0
|
||||
mov dx,bx
|
||||
|
||||
or esi,esi
|
||||
jz pci_read_byte2
|
||||
cmp esi,1
|
||||
jz pci_read_word2
|
||||
cmp esi,2
|
||||
jz pci_read_dword2
|
||||
jmp pci_fin_read2
|
||||
|
||||
pci_read_byte2:
|
||||
in al,dx
|
||||
jmp pci_fin_read2
|
||||
pci_read_word2:
|
||||
in ax,dx
|
||||
jmp pci_fin_read2
|
||||
pci_read_dword2:
|
||||
in eax,dx
|
||||
; jmp pci_fin_read2
|
||||
pci_fin_read2:
|
||||
|
||||
; restore configuration space
|
||||
xchg eax,[esp]
|
||||
mov dx,0xcfa
|
||||
out dx,al
|
||||
mov dl,0xf8
|
||||
mov al,ah
|
||||
out dx,al
|
||||
|
||||
pop eax
|
||||
pop esi
|
||||
ret
|
||||
|
||||
pci_read_reg_err:
|
||||
xor eax,eax
|
||||
dec eax
|
||||
ret
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; pci_write_reg:
|
||||
;
|
||||
; Description
|
||||
; write a register from ECX/CX/CL into the PCI config space
|
||||
; IN: ah=bus,device+func=bh,register address (dword aligned)=bl,
|
||||
; value to write in ecx
|
||||
; number of bytes to write (1,2,4) coded into AL, bits 0-1
|
||||
;***************************************************************************
|
||||
|
||||
align 4
|
||||
|
||||
pci_write_reg:
|
||||
cmp byte [0x2F0000+0x9020],2 ;what mechanism will we use?
|
||||
je pci_write_reg_2
|
||||
|
||||
; mechanism 1
|
||||
push esi ; save register size into ESI
|
||||
mov esi,eax
|
||||
and esi,3
|
||||
|
||||
call pci_make_config_cmd
|
||||
mov ebx,eax
|
||||
; get current state into ecx
|
||||
mov dx,0xcf8
|
||||
in eax, dx
|
||||
push eax
|
||||
; set up addressing to config data
|
||||
mov eax,ebx
|
||||
and al,0xfc ; make address dword-aligned
|
||||
out dx,eax
|
||||
; write DWORD of config data
|
||||
mov dl,0xfc
|
||||
and bl,3
|
||||
or dl,bl
|
||||
mov eax,ecx
|
||||
|
||||
or esi,esi
|
||||
jz pci_write_byte1
|
||||
cmp esi,1
|
||||
jz pci_write_word1
|
||||
cmp esi,2
|
||||
jz pci_write_dword1
|
||||
jmp pci_fin_write1
|
||||
|
||||
pci_write_byte1:
|
||||
out dx,al
|
||||
jmp pci_fin_write1
|
||||
pci_write_word1:
|
||||
out dx,ax
|
||||
jmp pci_fin_write1
|
||||
pci_write_dword1:
|
||||
out dx,eax
|
||||
jmp pci_fin_write1
|
||||
pci_fin_write1:
|
||||
|
||||
; restore configuration control
|
||||
pop eax
|
||||
mov dl,0xf8
|
||||
out dx,eax
|
||||
|
||||
xor eax,eax
|
||||
pop esi
|
||||
|
||||
ret
|
||||
pci_write_reg_2:
|
||||
|
||||
test bh,128 ;mech#2 only supports 16 devices per bus
|
||||
jnz pci_write_reg_err
|
||||
|
||||
|
||||
push esi ; save register size into ESI
|
||||
mov esi,eax
|
||||
and esi,3
|
||||
|
||||
push eax
|
||||
;store current state of config space
|
||||
mov dx,0xcf8
|
||||
in al,dx
|
||||
mov ah,al
|
||||
mov dl,0xfa
|
||||
in al,dx
|
||||
xchg eax,[esp]
|
||||
; out 0xcfa,bus
|
||||
mov al,ah
|
||||
out dx,al
|
||||
; out 0xcf8,0x80
|
||||
mov dl,0xf8
|
||||
mov al,0x80
|
||||
out dx,al
|
||||
; compute addr
|
||||
shr bh,3 ; func is ignored in mechanism 2
|
||||
or bh,0xc0
|
||||
mov dx,bx
|
||||
; write register
|
||||
mov eax,ecx
|
||||
|
||||
or esi,esi
|
||||
jz pci_write_byte2
|
||||
cmp esi,1
|
||||
jz pci_write_word2
|
||||
cmp esi,2
|
||||
jz pci_write_dword2
|
||||
jmp pci_fin_write2
|
||||
|
||||
pci_write_byte2:
|
||||
out dx,al
|
||||
jmp pci_fin_write2
|
||||
pci_write_word2:
|
||||
out dx,ax
|
||||
jmp pci_fin_write2
|
||||
pci_write_dword2:
|
||||
out dx,eax
|
||||
jmp pci_fin_write2
|
||||
pci_fin_write2:
|
||||
; restore configuration space
|
||||
pop eax
|
||||
mov dx,0xcfa
|
||||
out dx,al
|
||||
mov dl,0xf8
|
||||
mov al,ah
|
||||
out dx,al
|
||||
|
||||
xor eax,eax
|
||||
pop esi
|
||||
ret
|
||||
|
||||
pci_write_reg_err:
|
||||
xor eax,eax
|
||||
dec eax
|
||||
ret
|
347
kernel/tags/kolibri0.5.3.0/core/debug.inc
Normal file
347
kernel/tags/kolibri0.5.3.0/core/debug.inc
Normal file
@ -0,0 +1,347 @@
|
||||
; this code uses following additions to system structures:
|
||||
; in additional app info at 80000..8FFFF:
|
||||
; AC (dword) 0 or debugger slot
|
||||
; BC (dword) address of debug event memory
|
||||
; new process slot state:
|
||||
; 1 = suspended
|
||||
; 2 = suspended waiting for event
|
||||
; new event: 8 (and new possible bitflag for A8 in additional app info)
|
||||
; diamond, 2006
|
||||
sys_debug_services:
|
||||
cmp eax, 8
|
||||
ja @f
|
||||
jmp dword [sys_debug_services_table+eax*4]
|
||||
@@: ret
|
||||
sys_debug_services_table:
|
||||
dd debug_set_event_data
|
||||
dd debug_getcontext
|
||||
dd debug_setcontext
|
||||
dd debug_detach
|
||||
dd debug_suspend
|
||||
dd debug_resume
|
||||
dd debug_read_process_memory
|
||||
dd debug_write_process_memory
|
||||
dd debug_terminate
|
||||
|
||||
debug_set_event_data:
|
||||
; in: ebx = pointer
|
||||
; destroys eax
|
||||
mov eax, [0x3000]
|
||||
shl eax, 8
|
||||
mov [eax+0x80000+0xBC], ebx
|
||||
ret
|
||||
|
||||
get_debuggee_slot:
|
||||
; in: ebx=PID
|
||||
; out: CF=1 if error
|
||||
; CF=0 and eax=slot*0x20 if ok
|
||||
; out: interrupts disabled
|
||||
cli
|
||||
mov eax, ebx
|
||||
call pid_to_slot
|
||||
test eax, eax
|
||||
jz .ret_bad
|
||||
shl eax, 5
|
||||
push ebx
|
||||
mov ebx, [0x3000]
|
||||
cmp [0x80000+eax*8+0xAC], ebx
|
||||
pop ebx
|
||||
jnz .ret_bad
|
||||
; clc ; automatically
|
||||
ret
|
||||
.ret_bad:
|
||||
stc
|
||||
ret
|
||||
|
||||
debug_detach:
|
||||
; in: ebx=pid
|
||||
; destroys eax,ebx
|
||||
call get_debuggee_slot
|
||||
jc .ret
|
||||
and dword [eax*8+0x80000+0xAC], 0
|
||||
call do_resume
|
||||
.ret:
|
||||
sti
|
||||
ret
|
||||
|
||||
debug_terminate:
|
||||
; in: ebx=pid
|
||||
call get_debuggee_slot
|
||||
jc debug_detach.ret
|
||||
mov ebx, eax
|
||||
shr ebx, 5
|
||||
push 2
|
||||
pop eax
|
||||
jmp sys_system
|
||||
|
||||
debug_suspend:
|
||||
; in: ebx=pid
|
||||
; destroys eax,ebx
|
||||
call get_debuggee_slot
|
||||
jc .ret
|
||||
mov bl, [0x3000+eax+0xA] ; process state
|
||||
test bl, bl
|
||||
jz .1
|
||||
cmp bl, 5
|
||||
jnz .ret
|
||||
mov bl, 2
|
||||
.2: mov [0x3000+eax+0xA], bl
|
||||
.ret:
|
||||
sti
|
||||
ret
|
||||
.1:
|
||||
inc ebx
|
||||
jmp .2
|
||||
|
||||
do_resume:
|
||||
mov bl, [0x3000+eax+0xA]
|
||||
cmp bl, 1
|
||||
jz .1
|
||||
cmp bl, 2
|
||||
jnz .ret
|
||||
mov bl, 5
|
||||
.2: mov [0x3000+eax+0xA], bl
|
||||
.ret: ret
|
||||
.1: dec ebx
|
||||
jmp .2
|
||||
|
||||
debug_resume:
|
||||
; in: ebx=pid
|
||||
; destroys eax,ebx
|
||||
call get_debuggee_slot
|
||||
jc .ret
|
||||
call do_resume
|
||||
.ret: sti
|
||||
ret
|
||||
|
||||
debug_getcontext:
|
||||
; in:
|
||||
; ebx=pid
|
||||
; ecx=sizeof(CONTEXT)
|
||||
; edx->CONTEXT
|
||||
; destroys eax,ecx,edx,esi,edi
|
||||
cmp ecx, 28h
|
||||
jnz .ret
|
||||
add edx, std_application_base_address
|
||||
push ebx
|
||||
mov ebx, edx
|
||||
call check_region
|
||||
pop ebx
|
||||
dec eax
|
||||
jnz .ret
|
||||
call get_debuggee_slot
|
||||
jc .ret
|
||||
imul eax, tss_step/32
|
||||
add eax, tss_data
|
||||
mov edi, edx
|
||||
cmp [l.cs - tss_sceleton + eax], app_code
|
||||
jnz .ring0
|
||||
lea esi, [l.eip - tss_sceleton + eax]
|
||||
shr ecx, 2
|
||||
rep movsd
|
||||
jmp .ret
|
||||
.ring0:
|
||||
; note that following code assumes that all interrupt/exception handlers
|
||||
; saves ring-3 context by push ds es, pushad in this order
|
||||
mov esi, [l.esp0 - tss_sceleton + eax]
|
||||
; top of ring0 stack: ring3 stack ptr (ss+esp), iret data (cs+eip+eflags), ds, es, pushad
|
||||
sub esi, 8+12+8+20h
|
||||
lodsd
|
||||
mov [edi+24h], eax
|
||||
lodsd
|
||||
mov [edi+20h], eax
|
||||
lodsd
|
||||
mov [edi+1Ch], eax
|
||||
lodsd
|
||||
lodsd
|
||||
mov [edi+14h], eax
|
||||
lodsd
|
||||
mov [edi+10h], eax
|
||||
lodsd
|
||||
mov [edi+0Ch], eax
|
||||
lodsd
|
||||
mov [edi+8], eax
|
||||
add esi, 8
|
||||
lodsd
|
||||
mov [edi], eax
|
||||
lodsd
|
||||
lodsd
|
||||
mov [edi+4], eax
|
||||
lodsd
|
||||
mov [edi+18h], eax
|
||||
.ret:
|
||||
sti
|
||||
ret
|
||||
|
||||
debug_setcontext:
|
||||
; in:
|
||||
; ebx=pid
|
||||
; ecx=sizeof(CONTEXT)
|
||||
; edx->CONTEXT
|
||||
; destroys eax,ecx,edx,esi,edi
|
||||
cmp ecx, 28h
|
||||
jnz .ret
|
||||
add edx, std_application_base_address
|
||||
push ebx
|
||||
mov ebx, edx
|
||||
call check_region
|
||||
pop ebx
|
||||
dec eax
|
||||
jnz .ret
|
||||
call get_debuggee_slot
|
||||
jc .stiret
|
||||
imul eax, tss_step/32
|
||||
add eax, tss_data
|
||||
mov esi, edx
|
||||
cmp [l.cs - tss_sceleton + eax], app_code
|
||||
jnz .ring0
|
||||
lea edi, [l.eip - tss_sceleton + eax]
|
||||
shr ecx, 2
|
||||
rep movsd
|
||||
jmp .stiret
|
||||
.ring0:
|
||||
mov edi, [l.esp0 - tss_sceleton + eax]
|
||||
sub edi, 8+12+8+20h
|
||||
mov eax, [esi+24h]
|
||||
stosd
|
||||
mov eax, [esi+20h]
|
||||
stosd
|
||||
mov eax, [esi+1Ch]
|
||||
stosd
|
||||
scasd
|
||||
mov eax, [esi+14h]
|
||||
stosd
|
||||
mov eax, [esi+10h]
|
||||
stosd
|
||||
mov eax, [esi+0Ch]
|
||||
stosd
|
||||
mov eax, [esi+8]
|
||||
stosd
|
||||
add edi, 8
|
||||
mov eax, [esi]
|
||||
stosd
|
||||
scasd
|
||||
mov eax, [esi+4]
|
||||
stosd
|
||||
mov eax, [esi+18h]
|
||||
stosd
|
||||
.stiret:
|
||||
sti
|
||||
.ret:
|
||||
ret
|
||||
|
||||
debug_read_process_memory:
|
||||
; in:
|
||||
; ebx=pid
|
||||
; ecx=length
|
||||
; esi->buffer in debugger
|
||||
; edx=address in debuggee
|
||||
; out: [esp+36]=sizeof(read)
|
||||
; destroys all
|
||||
add esi, std_application_base_address
|
||||
push ebx
|
||||
mov ebx, esi
|
||||
call check_region
|
||||
pop ebx
|
||||
dec eax
|
||||
jnz .err
|
||||
call get_debuggee_slot
|
||||
jc .err
|
||||
shr eax, 5
|
||||
mov ebx, esi
|
||||
call read_process_memory
|
||||
sti
|
||||
mov dword [esp+36], eax
|
||||
ret
|
||||
.err:
|
||||
or dword [esp+36], -1
|
||||
ret
|
||||
|
||||
debug_write_process_memory:
|
||||
; in:
|
||||
; ebx=pid
|
||||
; ecx=length
|
||||
; esi->buffer in debugger
|
||||
; edx=address in debuggee
|
||||
; out: [esp+36]=sizeof(write)
|
||||
; destroys all
|
||||
add esi, std_application_base_address
|
||||
push ebx
|
||||
mov ebx, esi
|
||||
call check_region
|
||||
pop ebx
|
||||
dec eax
|
||||
jnz debug_read_process_memory.err
|
||||
call get_debuggee_slot
|
||||
jc debug_read_process_memory.err
|
||||
shr eax, 5
|
||||
mov ebx, esi
|
||||
call write_process_memory
|
||||
sti
|
||||
mov [esp+36], eax
|
||||
ret
|
||||
|
||||
debugger_notify:
|
||||
; in: eax=debugger slot
|
||||
; ecx=size of debug message
|
||||
; [esp+4]..[esp+4+ecx]=message
|
||||
; interrupts must be disabled!
|
||||
; destroys all general registers
|
||||
; interrupts remain disabled
|
||||
mov ebp, eax
|
||||
shl eax, 8
|
||||
.1:
|
||||
mov edx, [0x80000+eax+0xBC]
|
||||
test edx, edx
|
||||
jz .ret
|
||||
; read buffer header
|
||||
push ecx
|
||||
push eax
|
||||
push eax
|
||||
mov eax, ebp
|
||||
mov ebx, esp
|
||||
mov ecx, 8
|
||||
call read_process_memory
|
||||
cmp eax, ecx
|
||||
jz @f
|
||||
add esp, 12
|
||||
jmp .ret
|
||||
@@:
|
||||
cmp dword [ebx], 0
|
||||
jg @f
|
||||
.2:
|
||||
pop ecx
|
||||
pop ecx
|
||||
pop ecx
|
||||
sti
|
||||
call change_task
|
||||
cli
|
||||
jmp .1
|
||||
@@:
|
||||
mov ecx, [ebx+8]
|
||||
add ecx, [ebx+4]
|
||||
cmp ecx, [ebx]
|
||||
ja .2
|
||||
; advance buffer position
|
||||
push ecx
|
||||
mov ecx, 4
|
||||
sub ebx, ecx
|
||||
mov eax, ebp
|
||||
add edx, ecx
|
||||
call write_process_memory
|
||||
pop eax
|
||||
; write message
|
||||
mov eax, ebp
|
||||
add edx, ecx
|
||||
add edx, [ebx+8]
|
||||
add ebx, 20
|
||||
pop ecx
|
||||
pop ecx
|
||||
pop ecx
|
||||
call write_process_memory
|
||||
; new debug event
|
||||
mov eax, ebp
|
||||
shl eax, 8
|
||||
or byte [0x80000+eax+0xA8+1], 1 ; set flag 100h
|
||||
.ret:
|
||||
ret
|
473
kernel/tags/kolibri0.5.3.0/core/mem.inc
Normal file
473
kernel/tags/kolibri0.5.3.0/core/mem.inc
Normal file
@ -0,0 +1,473 @@
|
||||
if ~defined mem_inc
|
||||
mem_inc_fix:
|
||||
mem_inc fix mem_inc_fix
|
||||
;include "memmanag.inc"
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;High-level memory management in MenuetOS.
|
||||
;;It uses memory manager in memmanager.inc
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
second_base_address=0xC0000000
|
||||
std_application_base_address=0x10000000
|
||||
general_page_table_ dd 0
|
||||
general_page_table=general_page_table_+second_base_address
|
||||
;-----------------------------------------------------------------------------
|
||||
create_general_page_table:
|
||||
;input
|
||||
; none
|
||||
;output
|
||||
; none
|
||||
;Procedure create general page directory and write
|
||||
;it address to [general_page_table].
|
||||
pushad
|
||||
mov eax,1 ;alloc 1 page
|
||||
mov ebx,general_page_table ;write address to [general_page_table]
|
||||
call MEM_Alloc_Pages ;allocate page directory
|
||||
mov eax,[general_page_table]
|
||||
call MEM_Get_Linear_Address ;eax - linear address of page directory
|
||||
mov edi,eax
|
||||
mov ebx,eax
|
||||
xor eax,eax
|
||||
mov ecx,4096/4
|
||||
cld
|
||||
rep stosd ;clear page directory
|
||||
|
||||
mov eax,4
|
||||
mov edx,eax
|
||||
call MEM_Alloc_Pages ;alloc page tables for 0x0-0x1000000 region
|
||||
cmp eax,edx
|
||||
jnz $ ;hang if not enough memory
|
||||
|
||||
;fill page tables
|
||||
xor esi,esi
|
||||
mov ebp,7
|
||||
|
||||
.loop:
|
||||
;esi - number of page in page directory
|
||||
;ebp - current page address
|
||||
;ebx - linear address of page directory
|
||||
mov eax,[ebx+4*esi]
|
||||
add dword [ebx+4*esi],7 ;add flags to address of page table
|
||||
call MEM_Get_Linear_Address
|
||||
;eax - linear address of page table
|
||||
mov ecx,4096/4
|
||||
;ecx (counter) - number of pages in page table
|
||||
;current address=4Mb*esi
|
||||
cmp esi,2
|
||||
jz .start_lfb_map ;lfb map begin at 0x800000
|
||||
cmp esi,3
|
||||
jz .end_lfb_map ;lfb map end at 0xC00000
|
||||
jmp .loop1
|
||||
.start_lfb_map:
|
||||
;current address=lfb address
|
||||
mov ebp,[0x2f0000+0x9018]
|
||||
add ebp,7 ;add flags
|
||||
jmp .loop1
|
||||
.end_lfb_map:
|
||||
;current address=linear address
|
||||
mov ebp,12*0x100000+7
|
||||
|
||||
.loop1:
|
||||
mov [eax],ebp ;write page address (with flags) in page table
|
||||
add eax,4
|
||||
add ebp,4096 ;size of page=4096 bytes
|
||||
loop .loop1
|
||||
|
||||
inc esi ;next page directory entry
|
||||
cmp esi,edx
|
||||
jnz .loop
|
||||
|
||||
;map region 0x80000000-0x803fffff to 0x800000-0xcfffff
|
||||
mov eax,1 ;size of the region is 4Mb so only 1 page table needed
|
||||
mov edx,ebx ;ebx still contains linear address of the page directory
|
||||
add ebx,0x800
|
||||
call MEM_Alloc_Pages ;alloc page table for the region
|
||||
mov eax,[ebx]
|
||||
add dword [ebx],7 ;add flags
|
||||
call MEM_Get_Linear_Address ;get linear address of the page table
|
||||
mov ebx,eax
|
||||
mov ecx,4096/4 ;number of pages in page table
|
||||
mov eax,8*0x100000+7
|
||||
.loop3:
|
||||
;ebx - linear address of page table
|
||||
;eax - current linear address with flags
|
||||
mov [ebx],eax
|
||||
add ebx,4
|
||||
add eax,4096
|
||||
loop .loop3
|
||||
|
||||
;map region 0xC0000000-* to 0x0-*
|
||||
mov esi,edx ;esi=linear address of the page directory
|
||||
lea edi,[esi+(second_base_address shr 20)];add offset of entry (0xC00)
|
||||
mov ecx,4
|
||||
rep movsd ;first 16Mb of the region mapped as 0x0-0x1000000 block
|
||||
mov eax,[0xfe8c] ;eax=memory size
|
||||
add eax,0x3fffff
|
||||
shr eax,22
|
||||
mov esi,eax ;calculate number of entries in page directory
|
||||
sub esi,4 ;subtract entries for first 16Mb.
|
||||
mov ebp,0x1000000+7 ;start physical address with flags
|
||||
|
||||
;mapping memory higher than 16Mb
|
||||
.loop4:
|
||||
;esi (counter) - number of entries in page directory
|
||||
;edi - address of entry
|
||||
test esi,esi
|
||||
jle .loop4end
|
||||
call MEM_Alloc_Page ;alloc page table for entry in page directory
|
||||
mov [edi],eax
|
||||
add dword [edi],7 ;write physical address of page table in page directory
|
||||
add edi,4 ;move entry pointer
|
||||
call MEM_Get_Linear_Address
|
||||
mov ecx,eax
|
||||
xor edx,edx
|
||||
|
||||
.loop5:
|
||||
;ecx - linear address of page table
|
||||
;edx - index of page in page table
|
||||
;ebp - current mapped physical address with flags
|
||||
mov [ecx+4*edx],ebp ;write address of page in page table
|
||||
add ebp,0x1000 ;move to next page
|
||||
inc edx
|
||||
cmp edx,4096/4
|
||||
jl .loop5
|
||||
|
||||
dec esi
|
||||
jmp .loop4
|
||||
.loop4end:
|
||||
|
||||
.set_cr3:
|
||||
;set value of cr3 register to the address of page directory
|
||||
mov eax,[general_page_table]
|
||||
add eax,8+16 ;add flags
|
||||
mov cr3,eax ;now we have full access paging
|
||||
|
||||
popad
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
simple_clone_cr3_table:
|
||||
;Parameters:
|
||||
; eax - physical address of cr3 table (page directory)
|
||||
;result:
|
||||
; eax - physical address of clone of cr3 table.
|
||||
;Function copy only page directory.
|
||||
push ecx
|
||||
push edx
|
||||
push esi
|
||||
push edi
|
||||
call MEM_Get_Linear_Address
|
||||
;eax - linear address of cr3 table
|
||||
mov esi,eax
|
||||
call MEM_Alloc_Page
|
||||
test eax,eax
|
||||
jz .failed
|
||||
;eax - physical address of new page diretory
|
||||
mov edx,eax
|
||||
call MEM_Get_Linear_Address
|
||||
mov edi,eax
|
||||
mov ecx,4096/4
|
||||
cld
|
||||
;esi - address of old page directory
|
||||
;edi - address of new page directory
|
||||
rep movsd ;copy page directory
|
||||
mov eax,edx
|
||||
.failed:
|
||||
pop edi
|
||||
pop esi
|
||||
pop edx
|
||||
pop ecx
|
||||
ret
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
create_app_cr3_table:
|
||||
;Parameters:
|
||||
; eax - slot of process (index in 0x3000 table)
|
||||
;result:
|
||||
; eax - physical address of table.
|
||||
;This function create page directory for new process and
|
||||
;write it physical address to offset 0xB8 of extended
|
||||
;process information.
|
||||
push ebx
|
||||
|
||||
mov ebx,eax
|
||||
mov eax,[general_page_table]
|
||||
call simple_clone_cr3_table ;clone general page table
|
||||
shl ebx,8
|
||||
mov [second_base_address+0x80000+ebx+0xB8],eax ;save address of page directory
|
||||
|
||||
pop ebx
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
get_cr3_table:
|
||||
;Input:
|
||||
; eax - slot of process
|
||||
;result:
|
||||
; eax - physical address of page directory
|
||||
shl eax,8 ;size of process extended information=256 bytes
|
||||
mov eax,[second_base_address+0x80000+eax+0xB8]
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
dispose_app_cr3_table:
|
||||
;Input:
|
||||
; eax - slot of process
|
||||
;result:
|
||||
; none
|
||||
;This procedure frees page directory,
|
||||
;page tables and all memory of process.
|
||||
pushad
|
||||
mov ebp,eax
|
||||
;ebp = process slot in the procedure.
|
||||
shl eax,8
|
||||
mov eax,[second_base_address+0x80000+eax+0xB8]
|
||||
mov ebx,eax
|
||||
;ebx = physical address of page directory
|
||||
call MEM_Get_Linear_Address
|
||||
mov edi,eax
|
||||
;edi = linear address of page directory
|
||||
mov eax,[edi+(std_application_base_address shr 20)]
|
||||
and eax,not (4096-1)
|
||||
call MEM_Get_Linear_Address
|
||||
mov esi,eax
|
||||
;esi = linear address of first page table
|
||||
|
||||
;search threads
|
||||
; mov ecx,0x200
|
||||
xor edx,edx
|
||||
mov eax,0x2
|
||||
|
||||
.loop:
|
||||
;eax = current slot of process
|
||||
mov ecx,eax
|
||||
shl ecx,5
|
||||
cmp byte [second_base_address+0x3000+ecx+0xa],9 ;if process running?
|
||||
jz .next ;skip empty slots
|
||||
shl ecx,3
|
||||
cmp [second_base_address+0x80000+ecx+0xB8],ebx ;compare page directory addresses
|
||||
jnz .next
|
||||
inc edx ;thread found
|
||||
.next:
|
||||
inc eax
|
||||
cmp eax,[0x3004] ;exit loop if we look through all processes
|
||||
jle .loop
|
||||
|
||||
;edx = number of threads
|
||||
;our process is zombi so it isn't counted
|
||||
cmp edx,1
|
||||
jg .threadsexists
|
||||
;if there isn't threads then clear memory.
|
||||
add edi,std_application_base_address shr 20
|
||||
|
||||
.loop1:
|
||||
;edi = linear address of current directory entry
|
||||
;esi = linear address of current page table
|
||||
test esi,esi
|
||||
jz .loop1end
|
||||
xor ecx,ecx
|
||||
|
||||
.loop2:
|
||||
;ecx = index of page
|
||||
mov eax,[esi+4*ecx]
|
||||
test eax,eax
|
||||
jz .loopend ;skip empty entries
|
||||
and eax,not (4096-1) ;clear flags
|
||||
push ecx
|
||||
call MEM_Free_Page ;free page
|
||||
pop ecx
|
||||
.loopend:
|
||||
inc ecx
|
||||
cmp ecx,1024 ;there are 1024 pages in page table
|
||||
jl .loop2
|
||||
|
||||
mov eax,esi
|
||||
call MEM_Free_Page_Linear ;free page table
|
||||
.loop1end:
|
||||
add edi,4 ;move to next directory entry
|
||||
mov eax,[edi]
|
||||
and eax,not (4096-1)
|
||||
call MEM_Get_Linear_Address
|
||||
mov esi,eax ;calculate linear address of new page table
|
||||
test edi,0x800
|
||||
jz .loop1 ;test if we at 0x80000000 address?
|
||||
|
||||
and edi,not (4096-1) ;clear offset of page directory entry
|
||||
mov eax,edi
|
||||
call MEM_Free_Page_Linear ;free page directory
|
||||
popad
|
||||
ret
|
||||
|
||||
.threadsexists: ;do nothing
|
||||
popad ;last thread will free memory
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
mem_alloc_specified_region:
|
||||
;eax - linear directory address
|
||||
;ebx - start address (aligned to 4096 bytes)
|
||||
;ecx - size in pages
|
||||
;result:
|
||||
; eax=1 - ok
|
||||
; eax=0 - failed
|
||||
;Try to alloc and map ecx pages to [ebx;ebx+4096*ecx) interval.
|
||||
pushad
|
||||
mov ebp,ebx ;save start address for recoil
|
||||
mov esi,eax
|
||||
.gen_loop:
|
||||
;esi = linear directory address
|
||||
;ebx = current address
|
||||
;ecx = remaining size in pages
|
||||
mov edx,ebx
|
||||
shr edx,22
|
||||
mov edi,[esi+4*edx] ;find directory entry for current address
|
||||
test edi,edi
|
||||
jnz .table_exists ;check if page table allocated
|
||||
call MEM_Alloc_Page ;alloc page table
|
||||
test eax,eax
|
||||
jz .failed
|
||||
mov [esi+4*edx],eax
|
||||
add dword [esi+4*edx],7 ;write it address with flags
|
||||
call MEM_Get_Linear_Address
|
||||
call mem_fill_page ;clear page table
|
||||
jmp .table_linear
|
||||
.table_exists:
|
||||
;calculate linear address of page table
|
||||
mov eax,edi
|
||||
and eax,not (4096-1) ;clear flags
|
||||
call MEM_Get_Linear_Address
|
||||
.table_linear:
|
||||
;eax = linear address of page table
|
||||
mov edx,ebx
|
||||
shr edx,12
|
||||
and edx,(1024-1) ;calculate index in page table
|
||||
mov edi,eax
|
||||
|
||||
.loop:
|
||||
;edi = linear address of page table
|
||||
;edx = current page table index
|
||||
;ecx = remaining size in pages
|
||||
;ebx = current address
|
||||
test ecx,ecx
|
||||
jle .endloop1 ;all requested pages allocated
|
||||
|
||||
call MEM_Alloc_Page ;alloc new page
|
||||
test eax,eax
|
||||
jz .failed
|
||||
mov [edi+4*edx],eax
|
||||
add dword [edi+4*edx],7 ;write it address with flags
|
||||
call MEM_Get_Linear_Address
|
||||
call mem_fill_page ;clear new page
|
||||
;go to next page table entry
|
||||
dec ecx
|
||||
add ebx,4096
|
||||
inc edx
|
||||
test edx,(1024-1)
|
||||
jnz .loop
|
||||
|
||||
jmp .gen_loop
|
||||
|
||||
.endloop1:
|
||||
popad
|
||||
mov eax,1 ;ok
|
||||
ret
|
||||
|
||||
.failed:
|
||||
;calculate data for recoil
|
||||
sub ebx,ebp
|
||||
shr ebx,12
|
||||
mov ecx,ebx ;calculate number of allocated pages
|
||||
mov eax,esi ;restore linear address of page directory
|
||||
mov ebx,ebp ;restore initial address
|
||||
call mem_free_specified_region ;free all allocated pages
|
||||
popad
|
||||
xor eax,eax ;fail
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
mem_fill_page:
|
||||
;Input:
|
||||
; eax - address
|
||||
;result:
|
||||
; none
|
||||
;set to zero 4096 bytes at eax address.
|
||||
push ecx
|
||||
push edi
|
||||
mov edi,eax
|
||||
mov ecx,4096/4
|
||||
xor eax,eax
|
||||
rep stosd
|
||||
lea eax,[edi-4096]
|
||||
pop edi
|
||||
pop ecx
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
mem_free_specified_region:
|
||||
;eax - linear page directory address
|
||||
;ebx - start address (aligned to 4096 bytes)
|
||||
;ecx - size in pages
|
||||
;result - none
|
||||
;Free pages in [ebx;ebx+4096*ecx) region.
|
||||
pushad
|
||||
mov esi,eax
|
||||
xor ebp,ebp
|
||||
|
||||
.gen_loop:
|
||||
;esi = linear page directory address
|
||||
;ebx = current address
|
||||
;ecx = remaining pages
|
||||
;ebp = 0 for first page table
|
||||
; 1 otherwise
|
||||
mov edx,ebx
|
||||
shr edx,22
|
||||
mov eax,[esi+4*edx] ;find directory entry for current address
|
||||
and eax,not (4096-1)
|
||||
test eax,eax
|
||||
jnz .table_exists
|
||||
;skip absent page tables
|
||||
mov edx,ebx
|
||||
shr edx,12
|
||||
and edx,(1024-1) ;edx - index of current page
|
||||
add ebx,1 shl 22
|
||||
add ecx,edx
|
||||
and ebx,not ((1 shl 22)-1)
|
||||
mov ebp,1 ;set flag
|
||||
sub ecx,1024 ;ecx=ecx-(1024-edx)
|
||||
jg .gen_loop
|
||||
popad
|
||||
ret
|
||||
.table_exists:
|
||||
call MEM_Get_Linear_Address
|
||||
;eax - linear address of table
|
||||
mov edx,ebx
|
||||
shr edx,12
|
||||
and edx,(1024-1) ;edx - index of current page
|
||||
mov edi,eax
|
||||
|
||||
.loop:
|
||||
;edi = linear address of page table entry
|
||||
;edx = index of page table entry
|
||||
;ecx = remaining pages
|
||||
test ecx,ecx
|
||||
jle .endloop1
|
||||
|
||||
mov eax,[edi+4*edx]
|
||||
and eax,not (4096-1)
|
||||
call MEM_Free_Page ;free page
|
||||
mov dword [edi+4*edx],0 ;and clear page table entry
|
||||
dec ecx
|
||||
inc edx
|
||||
cmp edx,1024
|
||||
jl .loop
|
||||
|
||||
test ebp,ebp
|
||||
jz .first_page
|
||||
mov eax,edi
|
||||
call MEM_Free_Page_Linear ;free page table
|
||||
mov edx,ebx
|
||||
shr edx,22
|
||||
mov dword [esi+4*edx],0 ;and clear page directory entry
|
||||
.first_page:
|
||||
add ebx,1 shl 22
|
||||
and ebx,not ((1 shl 22)-1) ;calculate new current address
|
||||
mov ebp,1 ;set flag
|
||||
jmp .gen_loop
|
||||
|
||||
.endloop1:
|
||||
popad
|
||||
ret
|
||||
end if
|
833
kernel/tags/kolibri0.5.3.0/core/memmanag.inc
Normal file
833
kernel/tags/kolibri0.5.3.0/core/memmanag.inc
Normal file
@ -0,0 +1,833 @@
|
||||
if ~defined memmanager_inc
|
||||
memmanager_inc_fix:
|
||||
memmanager_inc fix memmanager_inc_fix
|
||||
;for testing in applications
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Memory allocator for MenuetOS kernel
|
||||
;; Andrey Halyavin, halyavin@land.ru 2005
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; heap block structure -
|
||||
;; you can handle several ranges of
|
||||
;; pages simultaneosly.
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
.heap_linear_address equ 0
|
||||
.heap_block_size equ 4
|
||||
.heap_physical_address equ 8
|
||||
.heap_reserved equ 12
|
||||
.heap_block_info equ 16
|
||||
max_heaps equ 8
|
||||
.range_info equ 36
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; memory manager data
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
uglobal
|
||||
MEM_heap_block rd .heap_block_info*max_heaps/4
|
||||
MEM_heap_count rd 1
|
||||
MEM_cli_count rd 1
|
||||
MEM_cli_prev rd 1
|
||||
MEM_FreeSpace rd 1
|
||||
; MEM_AllSpace rd 1
|
||||
endg
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Init
|
||||
;;Initialize memory manager structures.
|
||||
;;Must be called first.
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
MEM_Init:
|
||||
push eax
|
||||
xor eax,eax
|
||||
mov [MEM_cli_prev],eax ;init value = 0
|
||||
dec eax
|
||||
mov [MEM_cli_count],eax ;init value = -1
|
||||
pop eax
|
||||
ret
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Heap_Lock
|
||||
;;Wait until all operations with heap will be finished.
|
||||
;;Between MEM_Heap_Lock and MEM_Heap_UnLock operations
|
||||
;;with heap are forbidden.
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
MEM_Heap_Lock:
|
||||
pushfd
|
||||
cli
|
||||
inc dword [MEM_cli_count]
|
||||
jz MEM_Heap_First_Lock
|
||||
add esp,4
|
||||
ret
|
||||
MEM_Heap_First_Lock: ;save interrupt flag
|
||||
shr dword [esp],9
|
||||
and dword [esp],1
|
||||
pop dword [MEM_cli_prev]
|
||||
ret
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Heap_UnLock
|
||||
;;After this routine operations with heap are allowed.
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
MEM_Heap_UnLock:
|
||||
dec dword [MEM_cli_count]
|
||||
js MEM_Heap_UnLock_last
|
||||
ret
|
||||
MEM_Heap_UnLock_last:
|
||||
cmp dword [MEM_cli_prev],0 ;restore saved interrupt flag
|
||||
jz MEM_Heap_UnLock_No_sti
|
||||
sti
|
||||
MEM_Heap_UnLock_No_sti:
|
||||
ret
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Add_Heap
|
||||
;;Add new range to memory manager.
|
||||
;;eax - linear address
|
||||
;;ebx - size in pages
|
||||
;;ecx - physical address
|
||||
;;Result:
|
||||
;; eax=1 - success
|
||||
;; eax=0 - failed
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
MEM_Add_Heap:
|
||||
push edx
|
||||
call MEM_Heap_Lock
|
||||
mov edx,[MEM_heap_count]
|
||||
cmp edx,max_heaps
|
||||
jz MEM_Add_Heap_Error
|
||||
inc dword [MEM_heap_count]
|
||||
shl edx,4
|
||||
mov [MEM_heap_block+edx+.heap_linear_address],eax
|
||||
mov [MEM_heap_block+edx+.heap_block_size],ebx
|
||||
shl dword [MEM_heap_block+edx+.heap_block_size],12
|
||||
mov [MEM_heap_block+edx+.heap_physical_address],ecx
|
||||
lea edx,[4*ebx+.range_info+4095] ;calculate space for page info table
|
||||
and edx,0xFFFFF000
|
||||
|
||||
push edi
|
||||
mov edi,edx
|
||||
shr edi,12
|
||||
sub edi,ebx ;edi=-free space
|
||||
sub [MEM_FreeSpace],edi
|
||||
; sub [MEM_AllSpace],edi
|
||||
|
||||
mov [eax],eax
|
||||
add [eax],edx ;first 4 bytes - pointer to first free page
|
||||
;clean page info area
|
||||
lea edi,[eax+4]
|
||||
mov ecx,edx
|
||||
shr ecx,2
|
||||
push eax
|
||||
xor eax,eax
|
||||
rep stosd
|
||||
pop eax
|
||||
pop edi
|
||||
;create free pages list.
|
||||
mov ecx,[eax]
|
||||
shl ebx,12
|
||||
add eax,ebx ;eax - address after block
|
||||
MEM_Add_Heap_loop:
|
||||
add ecx,4096
|
||||
mov [ecx-4096],ecx ;set forward pointer
|
||||
cmp ecx,eax
|
||||
jnz MEM_Add_Heap_loop
|
||||
mov dword [ecx-4096],0 ;set end of list
|
||||
MEM_Add_Heap_ret:
|
||||
call MEM_Heap_UnLock
|
||||
pop edx
|
||||
ret
|
||||
MEM_Add_Heap_Error:
|
||||
xor eax,eax
|
||||
jmp MEM_Add_Heap_ret
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Get_Physical_Address
|
||||
;;Translate linear address to physical address
|
||||
;;Parameters:
|
||||
;; eax - linear address
|
||||
;;Result:
|
||||
;; eax - physical address
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Get_Physical_Address
|
||||
MEM_Get_Physical_Address:
|
||||
push ecx
|
||||
call MEM_Heap_Lock
|
||||
mov ecx,[MEM_heap_count]
|
||||
dec ecx
|
||||
shl ecx,4
|
||||
MEM_Get_Physical_Address_loop:
|
||||
sub eax,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
jl MEM_Get_Physical_Address_next
|
||||
cmp eax,[MEM_heap_block+ecx+.heap_block_size]
|
||||
jge MEM_Get_Physical_Address_next
|
||||
add eax,[MEM_heap_block+ecx+.heap_physical_address]
|
||||
jmp MEM_Get_Physical_Address_loopend
|
||||
MEM_Get_Physical_Address_next:
|
||||
add eax,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
sub ecx,16
|
||||
jns MEM_Get_Physical_Address_loop
|
||||
xor eax,eax ;address not found
|
||||
MEM_Get_Physical_Address_loopend:
|
||||
call MEM_Heap_UnLock
|
||||
pop ecx
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Get_Linear_Address
|
||||
;;Translate physical address to linear address.
|
||||
;;Parameters:
|
||||
;; eax - physical address
|
||||
;;Result:
|
||||
;; eax - linear address
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Get_Linear_Address
|
||||
MEM_Get_Linear_Address:
|
||||
push ecx
|
||||
call MEM_Heap_Lock
|
||||
mov ecx,[MEM_heap_count]
|
||||
dec ecx
|
||||
shl ecx,4
|
||||
MEM_Get_Linear_Address_loop:
|
||||
sub eax,[MEM_heap_block+ecx+.heap_physical_address]
|
||||
jl MEM_Get_Linear_Address_Next
|
||||
cmp eax,[MEM_heap_block+ecx+.heap_block_size]
|
||||
jge MEM_Get_Linear_Address_Next
|
||||
add eax,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
call MEM_Heap_UnLock
|
||||
pop ecx
|
||||
ret
|
||||
MEM_Get_Linear_Address_Next:
|
||||
add eax,[MEM_heap_block+ecx+.heap_physical_address]
|
||||
sub ecx,16
|
||||
jns MEM_Get_Linear_Address_loop
|
||||
call MEM_Heap_UnLock
|
||||
pop ecx
|
||||
xor eax,eax ;address not found
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Alloc_Page
|
||||
;;Allocate and add reference to page
|
||||
;;Result:
|
||||
;; eax<>0 - physical address of page
|
||||
;; eax=0 - not enough memory
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Alloc_Page
|
||||
MEM_Alloc_Page:
|
||||
push ecx
|
||||
call MEM_Heap_Lock
|
||||
mov ecx,[MEM_heap_count]
|
||||
dec ecx
|
||||
shl ecx,4
|
||||
MEM_Alloc_Page_loop:
|
||||
push ecx
|
||||
mov ecx,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
cmp dword [ecx],0
|
||||
jz MEM_Alloc_Page_loopend
|
||||
mov eax,[ecx]
|
||||
push dword [eax]
|
||||
pop dword [ecx]
|
||||
sub eax,ecx
|
||||
push eax
|
||||
shr eax,10
|
||||
mov word [ecx+.range_info+eax],1
|
||||
pop eax
|
||||
pop ecx
|
||||
add eax,[MEM_heap_block+ecx+.heap_physical_address]
|
||||
dec [MEM_FreeSpace]
|
||||
jmp MEM_Alloc_Page_ret
|
||||
MEM_Alloc_Page_loopend:
|
||||
pop ecx
|
||||
sub ecx,16
|
||||
jns MEM_Alloc_Page_loop
|
||||
xor eax,eax
|
||||
MEM_Alloc_Page_ret:
|
||||
call MEM_Heap_UnLock
|
||||
pop ecx
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Alloc_Page_Linear
|
||||
;;Allocate and add reference to page
|
||||
;;Result:
|
||||
;; eax<>0 - linear address of page
|
||||
;; eax=0 - not enough memory
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Alloc_Page_Linear
|
||||
MEM_Alloc_Page_Linear:
|
||||
push ecx
|
||||
call MEM_Heap_Lock
|
||||
mov ecx,[MEM_heap_count]
|
||||
dec ecx
|
||||
shl ecx,4
|
||||
MEM_Alloc_Page_Linear_loop:
|
||||
push ecx
|
||||
mov ecx,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
cmp dword [ecx],0
|
||||
jz MEM_Alloc_Page_Linear_loopend
|
||||
mov eax,[ecx]
|
||||
push dword [eax]
|
||||
pop dword [ecx]
|
||||
push eax
|
||||
sub eax,ecx
|
||||
shr eax,10
|
||||
mov word [ecx+.range_info+eax],1
|
||||
pop eax
|
||||
pop ecx
|
||||
dec [MEM_FreeSpace]
|
||||
jmp MEM_Alloc_Page_Linear_ret
|
||||
MEM_Alloc_Page_Linear_loopend:
|
||||
pop ecx
|
||||
sub ecx,16
|
||||
jns MEM_Alloc_Page_Linear_loop
|
||||
xor eax,eax
|
||||
MEM_Alloc_Page_Linear_ret:
|
||||
call MEM_Heap_UnLock
|
||||
pop ecx
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Free_Page
|
||||
;;Remove reference and free page if number of
|
||||
;;references is equal to 0
|
||||
;;Parameters:
|
||||
;; eax - physical address of page
|
||||
;;Result:
|
||||
;; eax - 1 success
|
||||
;; eax - 0 failed
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if (used MEM_Free_Page) | (used MEM_Free_Page_Linear)
|
||||
MEM_Free_Page:
|
||||
test eax,eax
|
||||
jz MEM_Free_Page_Zero
|
||||
test eax,0xFFF
|
||||
jnz MEM_Free_Page_Not_Aligned
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
call MEM_Heap_Lock
|
||||
mov ecx,[MEM_heap_count]
|
||||
dec ecx
|
||||
shl ecx,4
|
||||
MEM_Free_Page_Heap_loop:
|
||||
sub eax,[MEM_heap_block+ecx+.heap_physical_address]
|
||||
js MEM_Free_Page_Heap_loopnext
|
||||
cmp eax,[MEM_heap_block+ecx+.heap_block_size]
|
||||
jl MEM_Free_Page_Heap_loopend
|
||||
MEM_Free_Page_Heap_loopnext:
|
||||
add eax,[MEM_heap_block+ecx+.heap_physical_address]
|
||||
sub ecx,16
|
||||
jns MEM_Free_Page_Heap_loop
|
||||
xor eax,eax
|
||||
inc eax
|
||||
jmp MEM_Free_Page_ret
|
||||
MEM_Free_Page_Heap_loopend:
|
||||
mov ecx,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
mov ebx,eax
|
||||
add eax,ecx
|
||||
shr ebx,10
|
||||
mov edx,[ecx+.range_info+ebx]
|
||||
test edx,0x80000000
|
||||
jnz MEM_Free_Page_Bucket
|
||||
test dx,dx
|
||||
jz MEM_Free_Page_Error
|
||||
dec word [ecx+.range_info+ebx]
|
||||
jnz MEM_Free_Page_OK
|
||||
MEM_Free_Page_Bucket:
|
||||
push dword [ecx]
|
||||
mov [ecx],eax
|
||||
pop dword [eax]
|
||||
mov dword [ecx+.range_info+ebx],0
|
||||
inc [MEM_FreeSpace]
|
||||
MEM_Free_Page_OK:
|
||||
mov eax,1
|
||||
MEM_Free_Page_ret:
|
||||
call MEM_Heap_UnLock
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret
|
||||
MEM_Free_Page_Error:
|
||||
xor eax,eax
|
||||
jmp MEM_Free_Page_ret
|
||||
MEM_Free_Page_Zero:
|
||||
inc eax
|
||||
ret
|
||||
MEM_Free_Page_Not_Aligned:
|
||||
xor eax,eax
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Free_Page_Linear
|
||||
;;Remove reference and free page if number of
|
||||
;;references is equal to 0
|
||||
;;Parameters:
|
||||
;; eax - linear address of page
|
||||
;;Result:
|
||||
;; eax - 1 success
|
||||
;; eax - 0 failed
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Free_Page_Linear
|
||||
MEM_Free_Page_Linear:
|
||||
test eax,eax
|
||||
jz MEM_Free_Page_Zero
|
||||
test eax,0xFFF
|
||||
jnz MEM_Free_Page_Not_Aligned
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
call MEM_Heap_Lock
|
||||
mov ecx,[MEM_heap_count]
|
||||
dec ecx
|
||||
shl ecx,4
|
||||
|
||||
MEM_Free_Page_Linear_Heap_loop:
|
||||
sub eax,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
js MEM_Free_Page_Linear_Heap_loopnext
|
||||
cmp eax,[MEM_heap_block+ecx+.heap_block_size]
|
||||
jl MEM_Free_Page_Heap_loopend
|
||||
MEM_Free_Page_Linear_Heap_loopnext:
|
||||
add eax,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
sub ecx,16
|
||||
jns MEM_Free_Page_Linear_Heap_loop
|
||||
xor eax,eax
|
||||
inc eax
|
||||
jmp MEM_Free_Page_ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Alloc_Pages
|
||||
;;Allocates set of pages.
|
||||
;;Parameters:
|
||||
;; eax - number of pages
|
||||
;; ebx - buffer for physical addresses
|
||||
;;Result:
|
||||
;; eax - number of allocated pages
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Alloc_Pages
|
||||
MEM_Alloc_Pages:
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
mov ecx,eax
|
||||
test ecx,ecx
|
||||
jz MEM_Alloc_Pages_ret
|
||||
MEM_Alloc_Pages_loop:
|
||||
call MEM_Alloc_Page
|
||||
test eax,eax
|
||||
jz MEM_Alloc_Pages_ret
|
||||
mov [ebx],eax
|
||||
add ebx,4
|
||||
dec ecx
|
||||
jnz MEM_Alloc_Pages_loop
|
||||
MEM_Alloc_Pages_ret:
|
||||
sub [esp+8],ecx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Alloc_Pages_Linear
|
||||
;;Allocates set of pages.
|
||||
;;Parameters:
|
||||
;; eax - number of pages
|
||||
;; ebx - buffer for linear addresses
|
||||
;;Result:
|
||||
;; eax - number of allocated pages
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Alloc_Pages_Linear
|
||||
MEM_Alloc_Pages_Linear:
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
mov ecx,eax
|
||||
test ecx,ecx
|
||||
jz MEM_Alloc_Pages_Linear_ret
|
||||
MEM_Alloc_Pages_Linear_loop:
|
||||
call MEM_Alloc_Page_Linear
|
||||
test eax,eax
|
||||
jz MEM_Alloc_Pages_Linear_ret
|
||||
mov [ebx],eax
|
||||
add ebx,4
|
||||
dec ecx
|
||||
jnz MEM_Alloc_Pages_Linear_loop
|
||||
MEM_Alloc_Pages_Linear_ret:
|
||||
sub [esp+8],ecx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Free_Pages
|
||||
;;Parameters:
|
||||
;; eax - number of pages
|
||||
;; ebx - array of addresses
|
||||
;;Result:
|
||||
;; eax=1 - succcess
|
||||
;; eax=0 - failed
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Free_Pages
|
||||
MEM_Free_Pages:
|
||||
push ebx
|
||||
push ecx
|
||||
mov ecx,eax
|
||||
test ecx,ecx
|
||||
jz MEM_Free_Pages_ret
|
||||
MEM_Free_Pages_loop:
|
||||
mov eax,[ebx]
|
||||
call MEM_Free_Page
|
||||
add ebx,4
|
||||
test eax,eax
|
||||
jz MEM_Free_Pages_ret
|
||||
dec ecx
|
||||
jnz MEM_Free_Pages_loop
|
||||
MEM_Free_Pages_ret:
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Free_Pages_Linear
|
||||
;;Parameters:
|
||||
;; eax - number of pages
|
||||
;; ebx - array of addresses
|
||||
;;Result:
|
||||
;; eax=1 - succcess
|
||||
;; eax=0 - failed
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Free_Pages_Linear
|
||||
MEM_Free_Pages_Linear:
|
||||
push ebx
|
||||
push ecx
|
||||
mov ecx,eax
|
||||
test ecx,ecx
|
||||
jz MEM_Free_Pages_Linear_ret
|
||||
MEM_Free_Pages_Linear_loop:
|
||||
mov eax,[ebx]
|
||||
call MEM_Free_Page_Linear
|
||||
add ebx,4
|
||||
test eax,eax
|
||||
jz MEM_Free_Pages_Linear_ret
|
||||
dec ecx
|
||||
jnz MEM_Free_Pages_Linear_loop
|
||||
MEM_Free_Pages_Linear_ret:
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Get_Heap_Number
|
||||
;;Calculate number of heap which pointer belongs to.
|
||||
;;Parameter:
|
||||
;; eax - address
|
||||
;;Result:
|
||||
;; ecx - number of heap*16.
|
||||
;; eax=0 if address not found.
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Get_Heap_Number
|
||||
MEM_Get_Heap_Number:
|
||||
call MEM_Heap_Lock
|
||||
mov ecx,[MEM_heap_count]
|
||||
dec ecx
|
||||
shl ecx,4
|
||||
MEM_Get_Heap_loop:
|
||||
sub eax,[MEM_heap_block+ecx+.heap_physical_address]
|
||||
jl MEM_Get_Heap_loopnext
|
||||
cmp eax,[MEM_heap_block+ecx+.heap_block_size]
|
||||
jl MEM_Get_Heap_loopend
|
||||
MEM_Get_Heap_loopnext:
|
||||
add eax,[MEM_heap_block+ecx+.heap_physical_address]
|
||||
sub ecx,16
|
||||
jns MEM_Get_Heap_loop
|
||||
call MEM_Heap_UnLock
|
||||
xor eax,eax
|
||||
ret
|
||||
MEM_Get_Heap_loopend:
|
||||
add eax,[MEM_heap_block+ecx+.heap_physical_address]
|
||||
call MEM_Heap_UnLock
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Get_Heap_Number_Linear
|
||||
;;Calculate number of heap which pointer belongs to.
|
||||
;;Parameter:
|
||||
;; eax - address
|
||||
;;Result:
|
||||
;; ecx - number of heap*16.
|
||||
;; eax=0 if address not found.
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Get_Heap_Number_Linear
|
||||
MEM_Get_Heap_Number_Linear:
|
||||
call MEM_Heap_Lock
|
||||
mov ecx,[MEM_heap_count]
|
||||
dec ecx
|
||||
shl ecx,4
|
||||
MEM_Get_Heap_Linear_loop:
|
||||
sub eax,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
jl MEM_Get_Heap_Linear_loopnext
|
||||
cmp eax,[MEM_heap_block+ecx+.heap_block_size]
|
||||
jl MEM_Get_Heap_Linear_loopend
|
||||
MEM_Get_Heap_Linear_loopnext:
|
||||
add eax,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
sub ecx,16
|
||||
jns MEM_Get_Heap_Linear_loop
|
||||
call MEM_Heap_UnLock
|
||||
xor eax,eax
|
||||
ret
|
||||
MEM_Get_Heap_Linear_loopend:
|
||||
add eax,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
call MEM_Heap_UnLock
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Alloc
|
||||
;;Allocate small region.
|
||||
;;Parameters:
|
||||
;; eax - size (0<eax<=4096)
|
||||
;;Result:
|
||||
;; eax - linear address
|
||||
;; eax=0 - not enough memory
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Alloc
|
||||
MEM_Alloc:
|
||||
;find chain
|
||||
test eax,eax
|
||||
jng MEM_Alloc_Wrong_Size
|
||||
cmp eax,4096
|
||||
jg MEM_Alloc_Wrong_Size
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
push esi
|
||||
dec eax
|
||||
shr eax,4
|
||||
xor edx,edx
|
||||
MEM_Alloc_Find_Size:
|
||||
add edx,4
|
||||
shr eax,1
|
||||
jnz MEM_Alloc_Find_Size
|
||||
MEM_Alloc_Size_Found:
|
||||
mov ecx,edx
|
||||
shr ecx,2
|
||||
add ecx,4
|
||||
mov eax,1
|
||||
shl eax,cl
|
||||
mov esi,eax
|
||||
;esi - block size
|
||||
;edx - offset
|
||||
call MEM_Heap_Lock
|
||||
mov ecx,[MEM_heap_count]
|
||||
dec ecx
|
||||
shl ecx,4
|
||||
MEM_Alloc_Find_Heap:
|
||||
mov eax,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
cmp dword [eax+edx],0
|
||||
jnz MEM_Alloc_Use_Existing
|
||||
sub ecx,16
|
||||
jns MEM_Alloc_Find_Heap
|
||||
;create new bucket page
|
||||
call MEM_Alloc_Page_Linear
|
||||
call MEM_Get_Heap_Number_Linear
|
||||
mov ecx,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
mov [ecx+edx],eax
|
||||
lea ebx,[eax+4096]
|
||||
MEM_Alloc_List_loop:
|
||||
mov [eax],eax
|
||||
mov [eax+4],eax
|
||||
add [eax],esi
|
||||
sub [eax+4],esi
|
||||
add eax,esi
|
||||
cmp eax,ebx
|
||||
jnz MEM_Alloc_List_loop
|
||||
sub ebx,esi
|
||||
mov dword [ebx],0
|
||||
sub eax,4096
|
||||
mov dword [eax+4],0
|
||||
mov eax,ecx
|
||||
|
||||
MEM_Alloc_Use_Existing:
|
||||
mov ebx,eax
|
||||
mov eax,[eax+edx]
|
||||
mov ecx,[eax]
|
||||
mov [ebx+edx],ecx
|
||||
test ecx,ecx
|
||||
jz MEM_Alloc_Became_Empty
|
||||
mov dword [ecx+4],0
|
||||
MEM_Alloc_Became_Empty:
|
||||
mov ecx,eax
|
||||
sub ecx,ebx
|
||||
shr ecx,10
|
||||
and ecx,0xFFFFFFFC
|
||||
inc byte [ebx+.range_info+ecx+2]
|
||||
shr edx,2
|
||||
add edx,128
|
||||
dec edx
|
||||
mov [ebx+.range_info+ecx+3],dl
|
||||
|
||||
MEM_Alloc_ret:
|
||||
call MEM_Heap_UnLock
|
||||
pop esi
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret
|
||||
MEM_Alloc_Wrong_Size:
|
||||
xor eax,eax
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Free
|
||||
;;Parameters:
|
||||
;; eax - linear address
|
||||
;;Result:
|
||||
;; eax=1 - success
|
||||
;; eax=0 - failed
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Free
|
||||
MEM_Free:
|
||||
test eax,eax
|
||||
jz MEM_Free_Zero
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
push esi
|
||||
push edi
|
||||
push ebp
|
||||
call MEM_Heap_Lock
|
||||
call MEM_Get_Heap_Number_Linear
|
||||
test eax,eax
|
||||
jz MEM_Free_ret
|
||||
mov edx,eax
|
||||
mov ecx,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
sub edx,ecx
|
||||
shr edx,10
|
||||
and edx,0xFFFFFFFC
|
||||
mov ebx,[ecx+.range_info+edx]
|
||||
mov esi,ebx
|
||||
shr esi,24
|
||||
sub esi,128
|
||||
mov edi,[ecx+4+4*esi]
|
||||
mov [eax],edi
|
||||
mov dword [eax+4],0
|
||||
test edi,edi
|
||||
jz MEM_Free_Empty_List
|
||||
mov [edi+4],eax
|
||||
MEM_Free_Empty_List:
|
||||
mov [ecx+4+4*esi],eax
|
||||
sub ebx,0x10000
|
||||
mov [ecx+.range_info+edx],ebx
|
||||
test ebx,0xFF0000
|
||||
jnz MEM_Free_ret
|
||||
;delete empty blocks on the page
|
||||
lea edx,[esi+5]
|
||||
and eax,0xFFFFF000
|
||||
mov edi,eax
|
||||
mov eax,1
|
||||
xchg ecx,edx
|
||||
shl eax,cl
|
||||
mov ecx,edx
|
||||
mov edx,eax
|
||||
;edx - size of block
|
||||
;edi - start of page
|
||||
mov eax,edi
|
||||
lea ebx,[eax+4096]
|
||||
MEM_Free_Block_loop:
|
||||
cmp dword [eax+4],0
|
||||
jnz MEM_Free_Block_Not_First
|
||||
mov ebp,dword [eax]
|
||||
mov [ecx+4+4*esi],ebp
|
||||
test ebp,ebp
|
||||
jz MEM_Free_Block_Last
|
||||
mov dword [ebp+4],0
|
||||
MEM_Free_Block_Last:
|
||||
jmp MEM_Free_Block_loop_end
|
||||
MEM_Free_Block_Not_First:
|
||||
mov ebp,dword [eax]
|
||||
push ebp
|
||||
mov ebp,dword [eax+4]
|
||||
pop dword [ebp]
|
||||
mov ebp,dword [eax]
|
||||
test ebp,ebp
|
||||
jz MEM_Free_Block_loop_end
|
||||
push dword [eax+4]
|
||||
pop dword [ebp+4]
|
||||
; jmp MEM_Free_Block_loop_end
|
||||
MEM_Free_Block_loop_end:
|
||||
add eax,edx
|
||||
cmp eax,ebx
|
||||
jnz MEM_Free_Block_loop
|
||||
mov eax,edi
|
||||
call MEM_Free_Page_Linear
|
||||
MEM_Free_ret:
|
||||
call MEM_Heap_UnLock
|
||||
pop ebp
|
||||
pop edi
|
||||
pop esi
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret
|
||||
MEM_Free_Zero:
|
||||
inc eax
|
||||
ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Add_Reference
|
||||
;; eax - physical address of page
|
||||
;;Result:
|
||||
;; eax=1 - success
|
||||
;; eax=0 - failed
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Add_Reference
|
||||
MEM_Add_Reference:
|
||||
push ebx
|
||||
push ecx
|
||||
call MEM_Heap_Lock
|
||||
call MEM_Get_Heap_Number
|
||||
test eax,eax
|
||||
jz MEM_Add_Reference_ret
|
||||
sub eax,[MEM_heap_block+ecx+.heap_physical_address]
|
||||
mov ecx,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
shr eax,10
|
||||
and eax,0xFFFFFFFC
|
||||
test dword [ecx+eax+.range_info],0x80000000
|
||||
jnz MEM_Add_Reference_failed
|
||||
inc dword [ecx+eax+.range_info]
|
||||
MEM_Add_Reference_ret:
|
||||
call MEM_Heap_UnLock
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret
|
||||
MEM_Add_Reference_failed:
|
||||
xor eax,eax
|
||||
jmp MEM_Add_Reference_ret
|
||||
end if
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;MEM_Add_Reference_Linear
|
||||
;; eax - linear address of page
|
||||
;;Result:
|
||||
;; eax=1 - success
|
||||
;; eax=0 - failed
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
if used MEM_Add_Reference_Linear
|
||||
MEM_Add_Reference_Linear:
|
||||
push ebx
|
||||
push ecx
|
||||
call MEM_Heap_Lock
|
||||
call MEM_Get_Heap_Number_Linear
|
||||
test eax,eax
|
||||
jz MEM_Add_Reference_Linear_ret
|
||||
mov ecx,[MEM_heap_block+ecx+.heap_linear_address]
|
||||
sub eax,ecx
|
||||
shr eax,10
|
||||
and eax,0xFFFFFFFC
|
||||
test dword [ecx+eax+.range_info],0x80000000
|
||||
jnz MEM_Add_Reference_Linear_failed
|
||||
inc dword [ecx+eax+.range_info]
|
||||
mov eax,1
|
||||
MEM_Add_Reference_Linear_ret:
|
||||
call MEM_Heap_UnLock
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret
|
||||
MEM_Add_Reference_Linear_failed:
|
||||
xor eax,eax
|
||||
jmp MEM_Add_Reference_Linear_ret
|
||||
end if
|
||||
end if ;memmanager.inc
|
1372
kernel/tags/kolibri0.5.3.0/core/newproce.inc
Normal file
1372
kernel/tags/kolibri0.5.3.0/core/newproce.inc
Normal file
File diff suppressed because it is too large
Load Diff
218
kernel/tags/kolibri0.5.3.0/core/physmem.inc
Normal file
218
kernel/tags/kolibri0.5.3.0/core/physmem.inc
Normal file
@ -0,0 +1,218 @@
|
||||
virtual at 0
|
||||
physical_mem_block:
|
||||
.start rd 1
|
||||
.size rd 1
|
||||
.flags rd 1 ;0-free, pid-used.
|
||||
.sizeof:
|
||||
end virtual
|
||||
max_physical_mem_blocks = 24
|
||||
uglobal
|
||||
num_physical_mem_blocks rd 1
|
||||
physical_mem_blocks rd 3*max_physical_mem_blocks
|
||||
endg
|
||||
Init_Physical_Memory_Manager:
|
||||
pushad
|
||||
mov edi,physical_mem_blocks
|
||||
mov ecx,3*max_physical_mem_blocks
|
||||
xor eax,eax
|
||||
cld
|
||||
rep stosd
|
||||
mov dword [num_physical_mem_blocks],2
|
||||
mov [physical_mem_blocks+physical_mem_block.start],0x60000
|
||||
mov [physical_mem_blocks+physical_mem_block.size],0x20000 ;128Kb
|
||||
mov [physical_mem_blocks+physical_mem_block.sizeof+physical_mem_block.start],0x780000
|
||||
mov [physical_mem_blocks+physical_mem_block.sizeof+physical_mem_block.size],0x80000 ;512Kb
|
||||
popad
|
||||
ret
|
||||
Insert_Block:
|
||||
;input:
|
||||
; eax - handle
|
||||
;output:
|
||||
; none
|
||||
push eax ecx esi edi
|
||||
sub eax,[num_physical_mem_blocks]
|
||||
neg eax
|
||||
mov edi,physical_mem_block.sizeof
|
||||
imul eax,edi
|
||||
shr eax,2
|
||||
mov ecx,eax
|
||||
mov esi,[num_physical_mem_blocks]
|
||||
imul esi,edi
|
||||
add esi,physical_mem_blocks
|
||||
lea edi,[esi+physical_mem_block.sizeof]
|
||||
std
|
||||
rep movsd
|
||||
pop edi esi ecx eax
|
||||
ret
|
||||
Delete_Block:
|
||||
;input:
|
||||
; eax - handle
|
||||
;output:
|
||||
; none
|
||||
pushad
|
||||
mov edi,eax
|
||||
sub eax,[num_physical_mem_blocks]
|
||||
neg eax
|
||||
dec eax
|
||||
mov esi,physical_mem_block.sizeof
|
||||
imul eax,esi
|
||||
imul edi,esi
|
||||
add edi,physical_mem_blocks
|
||||
lea esi,[edi+physical_mem_block.sizeof]
|
||||
mov ecx,eax
|
||||
shr ecx,2
|
||||
cld
|
||||
rep movsd
|
||||
popad
|
||||
ret
|
||||
Allocate_Physical_Block:
|
||||
;input:
|
||||
; eax - size
|
||||
;output:
|
||||
; eax - address or 0 if not enough memory.
|
||||
pushad
|
||||
cmp [num_physical_mem_blocks],max_physical_mem_blocks
|
||||
jge .error
|
||||
mov ebx,eax
|
||||
xor eax,eax
|
||||
mov esi,physical_mem_blocks
|
||||
.loop:
|
||||
cmp dword [esi+physical_mem_block.flags],0
|
||||
jnz .next
|
||||
cmp [esi+physical_mem_block.size],ebx
|
||||
jg .addblock
|
||||
jz .noaddblock
|
||||
.next:
|
||||
inc eax
|
||||
add esi,physical_mem_block.sizeof
|
||||
cmp eax,[num_physical_mem_blocks]
|
||||
jl .loop
|
||||
.error:
|
||||
popad
|
||||
xor eax,eax
|
||||
ret
|
||||
.noaddblock:
|
||||
mov eax,[esi+physical_mem_block.start]
|
||||
mov [esp+28],eax
|
||||
mov eax,[0x3010]
|
||||
mov eax,[eax+0x4]
|
||||
mov [esi+physical_mem_block.flags],eax
|
||||
popad
|
||||
ret
|
||||
.addblock:
|
||||
call Insert_Block
|
||||
inc dword [num_physical_mem_blocks]
|
||||
mov eax,[esi+physical_mem_block.start]
|
||||
mov [esp+28],eax
|
||||
mov ecx,[0x3010]
|
||||
mov ecx,[ecx+0x4]
|
||||
mov [esi+physical_mem_block.flags],ecx
|
||||
mov ecx,[esi+physical_mem_block.size]
|
||||
mov [esi+physical_mem_block.size],ebx
|
||||
sub ecx,ebx
|
||||
mov [esi+physical_mem_block.sizeof+physical_mem_block.size],ecx
|
||||
add ebx,[esi+physical_mem_block.start]
|
||||
mov [esi+physical_mem_block.sizeof+physical_mem_block.start],ebx
|
||||
mov dword [esi+physical_mem_block.sizeof+physical_mem_block.flags],0
|
||||
popad
|
||||
ret
|
||||
Free_Physical_Block:
|
||||
;input:
|
||||
; eax - address
|
||||
;output:
|
||||
; none
|
||||
pushad
|
||||
test eax,eax
|
||||
jz .ret
|
||||
mov ebx,eax
|
||||
xor eax,eax
|
||||
mov esi,physical_mem_blocks
|
||||
.loop:
|
||||
cmp ebx,[esi+physical_mem_block.start]
|
||||
jz .endloop
|
||||
inc eax
|
||||
add esi,physical_mem_block.sizeof
|
||||
cmp eax,[num_physical_mem_blocks]
|
||||
jl .loop
|
||||
jmp .ret
|
||||
.endloop:
|
||||
mov dword [esi+physical_mem_block.flags],0
|
||||
test eax,eax
|
||||
jz .no_union_previous
|
||||
cmp dword [esi-physical_mem_block.sizeof+physical_mem_block.flags],0
|
||||
jnz .no_union_previous
|
||||
mov ebx,[esi-physical_mem_block.sizeof+physical_mem_block.start]
|
||||
add ebx,[esi-physical_mem_block.sizeof+physical_mem_block.size]
|
||||
cmp ebx,[esi+physical_mem_block.start]
|
||||
jnz .no_union_previous
|
||||
mov ebx,[esi+physical_mem_block.size]
|
||||
add [esi-physical_mem_block.sizeof+physical_mem_block.size],ebx
|
||||
call Delete_Block
|
||||
dec eax
|
||||
dec [num_physical_mem_blocks]
|
||||
.no_union_previous:
|
||||
inc eax
|
||||
cmp eax,[num_physical_mem_blocks]
|
||||
jge .no_union_next
|
||||
cmp dword [esi+physical_mem_block.sizeof+physical_mem_block.flags],0
|
||||
jnz .no_union_next
|
||||
mov ebx,[esi+physical_mem_block.start]
|
||||
add ebx,[esi+physical_mem_block.size]
|
||||
cmp ebx,[esi+physical_mem_block.sizeof+physical_mem_block.start]
|
||||
jnz .no_union_next
|
||||
mov ebx,[esi+physical_mem_block.sizeof+physical_mem_block.size]
|
||||
add [esi+physical_mem_block.size],ebx
|
||||
call Delete_Block
|
||||
dec [num_physical_mem_blocks]
|
||||
.no_union_next:
|
||||
.ret:
|
||||
popad
|
||||
ret
|
||||
|
||||
sys_allocate_physical_block:
|
||||
;eax - subfunction number
|
||||
mov eax,ebx
|
||||
call Allocate_Physical_Block
|
||||
mov [esp+36],eax
|
||||
ret
|
||||
sys_free_physical_block:
|
||||
;eax - subfunction number
|
||||
mov eax,ebx
|
||||
call Free_Physical_Block
|
||||
ret
|
||||
sys_set_buffer:
|
||||
add ecx,std_application_base_address
|
||||
isys_set_buffer: ;for using in kernel
|
||||
;eax - subfunction number
|
||||
;ebx - physical address
|
||||
;ecx - buffer start
|
||||
;edx - buffer size
|
||||
lea edi,[ebx+second_base_address]
|
||||
mov esi,ecx
|
||||
mov ecx,edx
|
||||
rep movsb
|
||||
ret
|
||||
sys_get_buffer:
|
||||
add ecx,std_application_base_address
|
||||
isys_get_buffer: ;for using in kernel
|
||||
;eax - subfunction number
|
||||
;ebx - physical address
|
||||
;ecx - buffer start
|
||||
;edx - buffer size
|
||||
mov edi,ecx
|
||||
lea esi,[ebx+second_base_address]
|
||||
mov ecx,edx
|
||||
rep movsb
|
||||
ret
|
||||
sys_internal_services:
|
||||
cmp eax,4
|
||||
jle sys_sheduler
|
||||
cmp eax,5
|
||||
jz sys_allocate_physical_block
|
||||
cmp eax,6
|
||||
jz sys_free_physical_block
|
||||
cmp eax,7
|
||||
jz sys_set_buffer
|
||||
cmp eax,8
|
||||
jz sys_get_buffer
|
||||
ret
|
154
kernel/tags/kolibri0.5.3.0/core/sched.inc
Normal file
154
kernel/tags/kolibri0.5.3.0/core/sched.inc
Normal file
@ -0,0 +1,154 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; IRQ0 HANDLER (TIMER INTERRUPT) ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
align 32
|
||||
irq0:
|
||||
save_ring3_context
|
||||
mov ax, os_data
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
|
||||
mov edi,[0x3000]
|
||||
shl edi, 3
|
||||
; fields of TSS descriptor:
|
||||
mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b
|
||||
|
||||
inc dword [timer_ticks]
|
||||
|
||||
mov eax, [timer_ticks]
|
||||
call playNote ; <<<--- Speaker driver
|
||||
|
||||
cmp eax,[next_usage_update]
|
||||
jb .nocounter
|
||||
add eax,100
|
||||
mov [next_usage_update],eax
|
||||
call updatecputimes
|
||||
.nocounter:
|
||||
|
||||
mov edi, [0x3010]
|
||||
|
||||
mov ebx, [edi+0x18] ; time stamp counter add
|
||||
call _rdtsc
|
||||
sub eax, ebx
|
||||
add eax, [edi+0x14] ; counter sum
|
||||
mov [edi+0x14], eax
|
||||
|
||||
mov ebx,[0x3000]
|
||||
mov [prev_slot], ebx
|
||||
|
||||
cmp [0xffff], byte 1
|
||||
je .do_not_change_task
|
||||
|
||||
|
||||
.waiting_for_termination:
|
||||
.waiting_for_reuse:
|
||||
.waiting_for_event:
|
||||
.suspended:
|
||||
cmp ebx, [0x3004]
|
||||
jb @f
|
||||
mov edi, 0x3000
|
||||
xor ebx, ebx
|
||||
@@:
|
||||
|
||||
add edi,0x20
|
||||
inc ebx
|
||||
|
||||
mov al, byte [edi+0xA]
|
||||
cmp al, 1
|
||||
jz .suspended
|
||||
cmp al, 2
|
||||
jz .suspended
|
||||
cmp al, 3
|
||||
je .waiting_for_termination
|
||||
cmp al, 4
|
||||
je .waiting_for_termination
|
||||
cmp al, 9
|
||||
je .waiting_for_reuse
|
||||
|
||||
mov [0x3000],ebx
|
||||
mov [0x3010],edi
|
||||
|
||||
cmp al, 5
|
||||
jne .noevents
|
||||
call get_event_for_app
|
||||
test eax, eax
|
||||
jz .waiting_for_event
|
||||
mov [event_sched], eax
|
||||
mov [edi+0xA], byte 0
|
||||
.noevents:
|
||||
cmp ebx, [prev_slot]
|
||||
sete [0xffff]
|
||||
|
||||
|
||||
.do_not_change_task:
|
||||
|
||||
call _rdtsc
|
||||
mov [edi+0x18],eax
|
||||
|
||||
shl ebx, 3
|
||||
xor eax, eax
|
||||
add ebx, tss0
|
||||
mov word [far_jump.sel], bx ; selector
|
||||
mov dword [far_jump.offs], eax ; offset
|
||||
|
||||
mov al,0x20 ; send End Of Interrupt signal
|
||||
mov dx,0x20
|
||||
out dx,al
|
||||
|
||||
cmp [0xffff],byte 0
|
||||
je .switch
|
||||
dec byte [0xffff]
|
||||
jz @f
|
||||
.switch:
|
||||
jmp pword [far_jump]
|
||||
inc [context_counter] ;noname & halyavin
|
||||
@@:
|
||||
|
||||
restore_ring3_context
|
||||
iret
|
||||
|
||||
|
||||
uglobal
|
||||
align 4
|
||||
far_jump:
|
||||
.offs dd ?
|
||||
.sel dw ?
|
||||
context_counter dd ? ;noname & halyavin
|
||||
next_usage_update dd ?
|
||||
timer_ticks dd ?
|
||||
prev_slot dd ?
|
||||
event_sched dd ?
|
||||
endg
|
||||
|
||||
|
||||
align 4
|
||||
change_task:
|
||||
|
||||
mov [0xffff],byte 2
|
||||
|
||||
dec dword [timer_ticks] ; because irq0 will increase it
|
||||
|
||||
int 0x20 ; irq0 handler
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
||||
align 4
|
||||
updatecputimes:
|
||||
|
||||
mov eax,[idleuse]
|
||||
mov [idleusesec],eax
|
||||
mov [idleuse],dword 0
|
||||
mov ecx, [0x3004]
|
||||
mov edi, 0x3020
|
||||
.newupdate:
|
||||
mov ebx,[edi+0x14]
|
||||
mov [edi+0x1c],ebx
|
||||
mov [edi+0x14],dword 0
|
||||
add edi,0x20
|
||||
dec ecx
|
||||
jnz .newupdate
|
||||
|
||||
ret
|
111
kernel/tags/kolibri0.5.3.0/core/sync.inc
Normal file
111
kernel/tags/kolibri0.5.3.0/core/sync.inc
Normal file
@ -0,0 +1,111 @@
|
||||
if ~defined sync_inc
|
||||
sync_inc_fix:
|
||||
sync_inc fix sync_inc_fix
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;Synhronization for MenuetOS. ;;
|
||||
;;Author: Halyavin Andrey, halyavin@land.ru ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;simplest mutex.
|
||||
macro SimpleMutex name
|
||||
{
|
||||
; iglobal
|
||||
name dd 0
|
||||
name#.type = 1
|
||||
; endg
|
||||
}
|
||||
macro WaitSimpleMutex name
|
||||
{
|
||||
local start_wait,ok
|
||||
start_wait=$
|
||||
cli
|
||||
cmp [name],dword 0
|
||||
jz ok
|
||||
sti
|
||||
call change_task
|
||||
jmp start_wait
|
||||
ok=$
|
||||
push eax
|
||||
mov eax,dword [0x3010+second_base_address]
|
||||
mov eax,[eax+0x4]
|
||||
mov [name],eax
|
||||
pop eax
|
||||
sti
|
||||
}
|
||||
macro ReleaseSimpleMutex name
|
||||
{
|
||||
mov [name],dword 0
|
||||
}
|
||||
macro TryWaitSimpleMutex name ;result in eax and in flags
|
||||
{
|
||||
local ok,try_end
|
||||
cmp [name],dword 0
|
||||
jz ok
|
||||
xor eax,eax
|
||||
jmp try_end
|
||||
ok=$
|
||||
xor eax,eax
|
||||
inc eax
|
||||
try_end=$
|
||||
}
|
||||
macro SimpleCriticalSection name
|
||||
{
|
||||
; iglobal
|
||||
name dd 0
|
||||
dd 0
|
||||
name#.type=2
|
||||
; endg
|
||||
}
|
||||
macro WaitSimpleCriticalSection name
|
||||
{
|
||||
local start_wait,first_wait,inc_counter,end_wait
|
||||
push eax
|
||||
mov eax,[0x3010+second_base_address]
|
||||
mov eax,[eax+0x4]
|
||||
start_wait=$
|
||||
cli
|
||||
cmp [name],dword 0
|
||||
jz first_wait
|
||||
cmp [name],eax
|
||||
jz inc_counter
|
||||
sti
|
||||
call change_task
|
||||
jmp start_wait
|
||||
first_wait=$
|
||||
mov [name],eax
|
||||
mov [name+4],dword 1
|
||||
jmp end_wait
|
||||
inc_counter=$
|
||||
inc dword [name+4]
|
||||
end_wait=$
|
||||
sti
|
||||
pop eax
|
||||
}
|
||||
macro ReleaseSimpleCriticalSection name
|
||||
{
|
||||
local release_end
|
||||
dec dword [name+4]
|
||||
jnz release_end
|
||||
mov [name],dword 0
|
||||
release_end=$
|
||||
}
|
||||
macro TryWaitSimpleCriticalSection name ;result in eax and in flags
|
||||
{
|
||||
local ok,try_end
|
||||
mov eax,[0x3000+second_base_address]
|
||||
mov eax,[eax+0x4]
|
||||
cmp [name],eax
|
||||
jz ok
|
||||
cmp [name],0
|
||||
jz ok
|
||||
xor eax,eax
|
||||
jmp try_end
|
||||
ok=$
|
||||
xor eax,eax
|
||||
inc eax
|
||||
try_end=$
|
||||
}
|
||||
_cli equ call MEM_HeapLock
|
||||
_sti equ call MEM_HeapUnLock
|
||||
end if
|
||||
|
1021
kernel/tags/kolibri0.5.3.0/core/sys32.inc
Normal file
1021
kernel/tags/kolibri0.5.3.0/core/sys32.inc
Normal file
File diff suppressed because it is too large
Load Diff
145
kernel/tags/kolibri0.5.3.0/core/syscall.inc
Normal file
145
kernel/tags/kolibri0.5.3.0/core/syscall.inc
Normal file
@ -0,0 +1,145 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; SYSTEM CALL ENTRY ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
align 32
|
||||
i40:
|
||||
push ds es
|
||||
pushad
|
||||
cld
|
||||
|
||||
mov ax,word os_data
|
||||
mov ds,ax
|
||||
mov es,ax
|
||||
|
||||
; for syscall trace function
|
||||
call save_registers
|
||||
|
||||
; load all registers in crossed order
|
||||
mov edi,[esp+28] ; eax
|
||||
mov eax,[esp+16] ; ebx
|
||||
mov ebx,[esp+24] ; ecx
|
||||
mov ecx,[esp+20] ; edx
|
||||
mov edx,[esp+4] ; esi
|
||||
mov esi,[esp+0] ; edi
|
||||
|
||||
; enable interupts - a task switch or an IRQ _CAN_ interrupt i40 handler
|
||||
sti
|
||||
push eax
|
||||
and edi,0xff
|
||||
call dword [servetable+edi*4]
|
||||
pop eax
|
||||
cli
|
||||
|
||||
popad
|
||||
pop es ds
|
||||
iretd
|
||||
|
||||
align 4
|
||||
save_registers:
|
||||
mov esi, [0x3010]
|
||||
mov eax, [esi+0x4] ; load PID
|
||||
lea esi, [esp+4]
|
||||
inc [save_syscall_count]
|
||||
mov edi,[save_syscall_count]
|
||||
and edi,0xF
|
||||
shl edi,6
|
||||
add edi,save_syscall_data+32
|
||||
mov [edi-32],eax
|
||||
mov ecx,32 / 4
|
||||
cld
|
||||
rep movsd
|
||||
ret
|
||||
|
||||
uglobal
|
||||
save_syscall_count dd 0x0
|
||||
endg
|
||||
|
||||
label save_syscall_data dword at 0x5000
|
||||
|
||||
|
||||
iglobal
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; SYSTEM FUNCTIONS TABLE ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
align 4
|
||||
servetable:
|
||||
|
||||
dd sys_drawwindow ; 0-DrawWindow
|
||||
dd syscall_setpixel ; 1-SetPixel
|
||||
dd sys_getkey ; 2-GetKey
|
||||
dd sys_clock ; 3-GetTime
|
||||
dd syscall_writetext ; 4-WriteText
|
||||
dd delay_hs ; 5-DelayHs
|
||||
dd syscall_openramdiskfile ; 6-OpenRamdiskFile
|
||||
dd syscall_putimage ; 7-PutImage
|
||||
dd sys_button ; 8-DefineButton
|
||||
dd sys_cpuusage ; 9-GetProcessInfo
|
||||
dd sys_waitforevent ; 10-WaitForEvent
|
||||
dd sys_getevent ; 11-CheckForEvent
|
||||
dd sys_redrawstat ; 12-BeginDraw and EndDraw
|
||||
dd syscall_drawrect ; 13-DrawRect
|
||||
dd syscall_getscreensize ; 14-GetScreenSize
|
||||
dd sys_background ; 15-bgr
|
||||
dd sys_cachetodiskette ; 16-FlushFloppyCache
|
||||
dd sys_getbutton ; 17-GetButton
|
||||
dd syscall_system ; 18-Shutdown,KillApp,WindowActivate
|
||||
dd syscall_startapp ; 19-StartApp
|
||||
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 sys_wait_event_timeout ; 23-TimeOutWaitForEvent
|
||||
dd syscall_cdaudio ; 24-PlayCdTrack,StopCd and GetCdPlaylist
|
||||
dd sys_sb16 ; 25-SetSb16
|
||||
dd sys_getsetup ; 26-GetMidiBase,GetKeymap,GetShiftKeymap,.
|
||||
dd sys_wss ; 27-SetWssMainVol and SetWssCdVol
|
||||
dd sys_sb16II ; 28-SetSb16
|
||||
dd sys_date ; 29-GetDate
|
||||
dd syscall_readhd ; 30-ReadHd
|
||||
dd syscall_starthdapp ; 31-StartHdApp
|
||||
dd syscall_delramdiskfile ; 32-DelRamdiskFile
|
||||
dd syscall_writeramdiskfile; 33-WriteRamdiskFile
|
||||
dd read_floppy_file ; 34-ReadFloppyDrive
|
||||
dd syscall_getpixel ; 35-GetPixel
|
||||
dd syscall_readstring ; 36-ReadString (not yet ready)
|
||||
dd readmousepos ; 37-GetMousePosition_ScreenRelative,.
|
||||
dd syscall_drawline ; 38-DrawLine
|
||||
dd sys_getbackground ; 39-GetBackgroundSize,ReadBgrData,.
|
||||
dd set_app_param ; 40-WantEvents
|
||||
dd syscall_getirqowner ; 41-GetIrqOwner
|
||||
dd get_irq_data ; 42-ReadIrqData
|
||||
dd sys_outport ; 43-SendDeviceData
|
||||
dd sys_programirq ; 44-ProgramIrqs
|
||||
dd reserve_free_irq ; 45-ReserveIrq and FreeIrq
|
||||
dd syscall_reserveportarea ; 46-ReservePortArea and FreePortArea
|
||||
dd display_number ; 47-WriteNum
|
||||
dd display_settings ; 48-SetRedrawType and SetButtonType
|
||||
dd syscall_appints ; 49-AppInts
|
||||
dd random_shaped_window ; 50-Window shape & scale
|
||||
dd syscall_threads ; 51-Threads
|
||||
dd stack_driver_stat ; 52-Stack driver status
|
||||
dd socket ; 53-Socket interface
|
||||
dd user_events ; 54-User events
|
||||
dd sound_interface ; 55-Sound interface
|
||||
dd write_to_hd ; 56-Write a file to hd
|
||||
dd delete_from_hd ; 57-Delete a file from hd
|
||||
dd file_system ; 58-Common file system interface
|
||||
dd sys_trace ; 59-System call trace
|
||||
dd new_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 sys_resize_app_memory ; 64-Resize application memory usage
|
||||
dd undefined_syscall ; 65-UTF
|
||||
dd sys_process_def ; 66-Process definitions - keyboard
|
||||
dd sys_window_move ; 67-Window move or resize
|
||||
dd sys_internal_services ; 68-Some internal services
|
||||
dd sys_debug_services ; 69-Debug
|
||||
|
||||
times 255 - ( ($-servetable) /4 ) dd undefined_syscall
|
||||
|
||||
dd sys_end ; -1-end application
|
||||
endg
|
135
kernel/tags/kolibri0.5.3.0/detect/commouse.inc
Normal file
135
kernel/tags/kolibri0.5.3.0/detect/commouse.inc
Normal file
@ -0,0 +1,135 @@
|
||||
;**************************************************
|
||||
;* ПОИСК МЫШИ ПО ПОСЛЕДОВАТЕЛЬНЫМ ПОРТАМ *
|
||||
;* Процедура подготавливает глобальные переменные *
|
||||
;* COMPortNum и COMPortBaseAddr для подпрограммы *
|
||||
;* установки обработчика прерывания *
|
||||
;**************************************************
|
||||
; Автор исходного текста Кулаков Владимир Геннадьевич.
|
||||
; Адаптация и доработка Mario79
|
||||
|
||||
Detect_COM_Mouse:
|
||||
pusha
|
||||
call MSMouseSearch
|
||||
cmp AL,'M'
|
||||
jne @f
|
||||
mov [com1_mouse_detected],1
|
||||
pusha
|
||||
|
||||
mov eax,4
|
||||
shl eax,2
|
||||
mov [irq_owner+eax],byte 1
|
||||
|
||||
inc dword [0x2d0000]
|
||||
mov edi,[0x2d0000]
|
||||
shl edi,4
|
||||
mov [0x2d0000+edi+0],dword 1
|
||||
mov [0x2d0000+edi+4],dword 0x3f0
|
||||
mov [0x2d0000+edi+8],dword 0x3ff
|
||||
|
||||
popa
|
||||
mov esi,boot_setmouse_type+22
|
||||
call boot_log
|
||||
@@:
|
||||
sub [COMPortBaseAddr],100h
|
||||
call MSMouseSearch
|
||||
cmp AL,'M'
|
||||
jne @f
|
||||
mov [com2_mouse_detected],1
|
||||
pusha
|
||||
|
||||
mov eax,3
|
||||
shl eax,2
|
||||
mov [irq_owner+eax],byte 1
|
||||
|
||||
inc dword [0x2d0000]
|
||||
mov edi,[0x2d0000]
|
||||
shl edi,4
|
||||
mov [0x2d0000+edi+0],dword 1
|
||||
mov [0x2d0000+edi+4],dword 0x2f0
|
||||
mov [0x2d0000+edi+8],dword 0x2ff
|
||||
|
||||
popa
|
||||
mov esi,boot_setmouse_type+44
|
||||
call boot_log
|
||||
@@:
|
||||
popa
|
||||
jmp end_detecting_mouse
|
||||
|
||||
MSMouseSearch:
|
||||
; ПОИСК МЫШИ ЧЕРЕЗ COM-ПОРТЫ
|
||||
MouseSearch:
|
||||
; Устанавливаем скорость
|
||||
; приема/передачи 1200 бод
|
||||
mov DX,[COMPortBaseAddr]
|
||||
add DX,3
|
||||
in AL,DX
|
||||
or AL,80h ;установить бит DLAB
|
||||
out DX,AL
|
||||
mov DX,[COMPortBaseAddr]
|
||||
mov AL,60h ;1200 бод
|
||||
out DX,AL
|
||||
inc DX
|
||||
mov AL,0
|
||||
out DX,AL
|
||||
; Установить длину слова 7 бит, 1 стоповый бит,
|
||||
; четность не контролировать
|
||||
mov DX,[COMPortBaseAddr]
|
||||
add DX,3
|
||||
mov AL,00000010b
|
||||
out DX,AL
|
||||
; Запретить все прерывания
|
||||
mov DX,[COMPortBaseAddr]
|
||||
inc DX
|
||||
mov AL,0
|
||||
out DX,AL
|
||||
; Проверить, что устройство подключено и является
|
||||
; мышью типа MSMouse
|
||||
; Отключить питание мыши и прерывания
|
||||
mov DX,[COMPortBaseAddr]
|
||||
add DX,4 ;регистр управления модемом
|
||||
mov AL,0 ;сбросить DTR, RTS и OUT2
|
||||
out DX,AL
|
||||
; Ожидать 5 "тиков" (0,2 с)
|
||||
mov ecx,0xffff
|
||||
dT_1:
|
||||
dec ecx
|
||||
cmp ecx,0
|
||||
jne dT_1
|
||||
mov ecx,0xffff
|
||||
; Включить питание мыши
|
||||
mov AL,11b ;установить DTR и RTS
|
||||
out DX,AL
|
||||
; Очистить регистр данных
|
||||
mov DX,[COMPortBaseAddr]
|
||||
in AL,DX
|
||||
; Цикл опроса порта
|
||||
WaitData:
|
||||
; Ожидать еще 10 "тиков"
|
||||
dec ecx
|
||||
cmp ecx,0
|
||||
je NoMouse
|
||||
; Проверить наличие идентификационного байта
|
||||
mov DX,[COMPortBaseAddr]
|
||||
add DX,5
|
||||
in AL,DX
|
||||
test AL,1 ;Данные готовы?
|
||||
jz WaitData
|
||||
; Ввести данные
|
||||
mov DX,[COMPortBaseAddr]
|
||||
in AL,DX
|
||||
NoMouse:
|
||||
ret
|
||||
|
||||
iglobal
|
||||
COMPortBaseAddr dw 3F8h
|
||||
;COMPortNum dw 0
|
||||
endg
|
||||
|
||||
iglobal
|
||||
boot_setmouse_type db 'Detected - PS2 mouse',0
|
||||
db 'Detected - COM1 mouse',0
|
||||
db 'Detected - COM2 mouse',0
|
||||
endg
|
||||
|
||||
end_detecting_mouse:
|
||||
|
20
kernel/tags/kolibri0.5.3.0/detect/dev_fd.inc
Normal file
20
kernel/tags/kolibri0.5.3.0/detect/dev_fd.inc
Normal file
@ -0,0 +1,20 @@
|
||||
;***************************************************
|
||||
; предварительная очистка области таблицы
|
||||
; поиск и занесение в таблицу приводов FDD
|
||||
; автор Mario79
|
||||
;***************************************************
|
||||
xor eax,eax
|
||||
mov edi,0x40000
|
||||
mov ecx,16384
|
||||
cld
|
||||
rep stosd
|
||||
|
||||
mov al,0x10
|
||||
out 0x70,al
|
||||
mov cx,0xff
|
||||
wait_cmos:
|
||||
dec cx
|
||||
cmp cx,0
|
||||
jne wait_cmos
|
||||
in al,0x71
|
||||
mov [0x40000],al
|
374
kernel/tags/kolibri0.5.3.0/detect/dev_hdcd.inc
Normal file
374
kernel/tags/kolibri0.5.3.0/detect/dev_hdcd.inc
Normal file
@ -0,0 +1,374 @@
|
||||
;******************************************************
|
||||
; поиск приводов HDD и CD
|
||||
; автор исходного текста Кулаков Владимир Геннадьевич.
|
||||
; адаптация и доработка Mario79
|
||||
;******************************************************
|
||||
|
||||
;****************************************************
|
||||
;* ПОИСК HDD и CD *
|
||||
;****************************************************
|
||||
FindHDD:
|
||||
mov [ChannelNumber],1
|
||||
mov [DiskNumber],0
|
||||
call FindHDD_3
|
||||
; mov ax,[Sector512+176]
|
||||
; mov [0x40006],ax
|
||||
; mov ax,[Sector512+126]
|
||||
; mov [0x40008],ax
|
||||
; mov ax,[Sector512+128]
|
||||
; mov [0x40008],ax
|
||||
mov [DiskNumber],1
|
||||
call FindHDD_3
|
||||
; mov al,[Sector512+176]
|
||||
; mov [0x40007],al
|
||||
inc [ChannelNumber]
|
||||
mov [DiskNumber],0
|
||||
call FindHDD_3
|
||||
; mov al,[Sector512+176]
|
||||
; mov [0x40008],al
|
||||
mov [DiskNumber],1
|
||||
call FindHDD_1
|
||||
; mov al,[Sector512+176]
|
||||
; mov [0x40009],al
|
||||
|
||||
jmp EndFindHDD
|
||||
|
||||
FindHDD_1:
|
||||
call ReadHDD_ID
|
||||
cmp [DevErrorCode],0
|
||||
jne FindHDD_2
|
||||
cmp [Sector512+6],word 16
|
||||
ja FindHDD_2
|
||||
cmp [Sector512+12],word 255
|
||||
ja FindHDD_2
|
||||
inc byte [0x40001]
|
||||
jmp FindHDD_2_2
|
||||
FindHDD_2:
|
||||
call DeviceReset
|
||||
cmp [DevErrorCode],0
|
||||
jne FindHDD_2_2
|
||||
call ReadCD_ID
|
||||
cmp [DevErrorCode],0
|
||||
jne FindHDD_2_2
|
||||
inc byte [0x40001]
|
||||
inc byte [0x40001]
|
||||
FindHDD_2_2:
|
||||
ret
|
||||
|
||||
FindHDD_3:
|
||||
call FindHDD_1
|
||||
shl byte [0x40001],2
|
||||
ret
|
||||
|
||||
|
||||
; Адрес считываемого сектора в режиме LBA
|
||||
SectorAddress DD ?
|
||||
|
||||
;*************************************************
|
||||
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала (1 или 2); *
|
||||
;* DiskNumber - номер диска на канале (0 или 1). *
|
||||
;* Идентификационный блок данных считывается *
|
||||
;* в массив Sector512. *
|
||||
;*************************************************
|
||||
ReadHDD_ID:
|
||||
; Задать режим CHS
|
||||
mov [ATAAddressMode],0
|
||||
; Послать команду идентификации устройства
|
||||
mov [ATAFeatures],0
|
||||
mov [ATAHead],0
|
||||
mov [ATACommand],0ECh
|
||||
call SendCommandToHDD
|
||||
cmp [DevErrorCode],0 ;проверить код ошибки
|
||||
jne @@End ;закончить, сохранив код ошибки
|
||||
mov DX,[ATABasePortAddr]
|
||||
add DX,7 ;адрес регистра состояния
|
||||
mov ecx,0xffff
|
||||
@@WaitCompleet:
|
||||
; Проверить время выполнения команды
|
||||
dec ecx
|
||||
cmp ecx,0
|
||||
je @@Error1 ;ошибка тайм-аута
|
||||
; Проверить готовность
|
||||
in AL,DX
|
||||
test AL,80h ;состояние сигнала BSY
|
||||
jnz @@WaitCompleet
|
||||
test AL,1 ;состояние сигнала ERR
|
||||
jnz @@Error6
|
||||
test AL,08h ;состояние сигнала DRQ
|
||||
jz @@WaitCompleet
|
||||
; Принять блок данных от контроллера
|
||||
; mov AX,DS
|
||||
; mov ES,AX
|
||||
mov EDI,Sector512 ;offset Sector512
|
||||
mov DX,[ATABasePortAddr] ;регистр данных
|
||||
mov CX,256 ;число считываемых слов
|
||||
rep insw ;принять блок данных
|
||||
jmp @@End
|
||||
; Записать код ошибки
|
||||
@@Error1:
|
||||
mov [DevErrorCode],1
|
||||
jmp @@End
|
||||
@@Error6:
|
||||
mov [DevErrorCode],6
|
||||
@@End: ret
|
||||
|
||||
|
||||
|
||||
; Стандартные базовые адреса каналов 1 и 2
|
||||
StandardATABases DW 1F0h, 170h
|
||||
; Номер канала
|
||||
ChannelNumber DW ?
|
||||
; Номер диска
|
||||
DiskNumber DB ?
|
||||
; Базовый адрес группы портов контроллера ATA
|
||||
ATABasePortAddr DW ?
|
||||
; Параметры ATA-команды
|
||||
ATAFeatures DB ? ;особенности
|
||||
ATASectorCount DB ? ;количество обрабатываемых секторов
|
||||
ATASectorNumber DB ? ;номер начального сектора
|
||||
ATACylinder DW ? ;номер начального цилиндра
|
||||
ATAHead DB ? ;номер начальной головки
|
||||
ATAAddressMode DB ? ;режим адресации (0 - CHS, 1 - LBA)
|
||||
ATACommand DB ? ;код команды, подлежащей выполнению
|
||||
; Код ошибки (0 - нет ошибок, 1 - превышен допустимый
|
||||
; интервал ожидания, 2 - неверный код режима адресации,
|
||||
; 3 - неверный номер канала, 4 - неверный номер диска,
|
||||
; 5 - неверный номер головки, 6 - ошибка при выполнении
|
||||
; команды)
|
||||
DevErrorCode DB ?
|
||||
|
||||
;****************************************************
|
||||
;* ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала (1 или 2); *
|
||||
;* DiskNumber - номер диска (0 или 1); *
|
||||
;* ATAFeatures - "особенности"; *
|
||||
;* ATASectorCount - количество секторов; *
|
||||
;* ATASectorNumber - номер начального сектора; *
|
||||
;* ATACylinder - номер начального цилиндра; *
|
||||
;* ATAHead - номер начальной головки; *
|
||||
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
|
||||
;* ATACommand - код команды. *
|
||||
;* После успешного выполнения функции: *
|
||||
;* в ATABasePortAddr - базовый адрес HDD; *
|
||||
;* в DevErrorCode - ноль. *
|
||||
;* При возникновении ошибки в DevErrorCode будет *
|
||||
;* возвращен код ошибки. *
|
||||
;****************************************************
|
||||
SendCommandToHDD:
|
||||
; Проверить значение кода режима
|
||||
cmp [ATAAddressMode],1
|
||||
ja @@Err2
|
||||
; Проверить корректность номера канала
|
||||
mov BX,[ChannelNumber]
|
||||
cmp BX,1
|
||||
jb @@Err3
|
||||
cmp BX,2
|
||||
ja @@Err3
|
||||
; Установить базовый адрес
|
||||
dec BX
|
||||
shl BX,1
|
||||
movzx ebx,bx
|
||||
mov AX,[ebx+StandardATABases]
|
||||
mov [ATABasePortAddr],AX
|
||||
; Ожидание готовности HDD к приему команды
|
||||
; Выбрать нужный диск
|
||||
mov DX,[ATABasePortAddr]
|
||||
add DX,6 ;адрес регистра головок
|
||||
mov AL,[DiskNumber]
|
||||
cmp AL,1 ;проверить номера диска
|
||||
ja @@Err4
|
||||
shl AL,4
|
||||
or AL,10100000b
|
||||
out DX,AL
|
||||
; Ожидать, пока диск не будет готов
|
||||
inc DX
|
||||
mov ecx,0xfff
|
||||
; mov eax,[timer_ticks]
|
||||
; mov [TickCounter_1],eax
|
||||
@@WaitHDReady:
|
||||
; Проверить время ожидания
|
||||
dec ecx
|
||||
cmp ecx,0
|
||||
je @@Err1
|
||||
; mov eax,[timer_ticks]
|
||||
; sub eax,[TickCounter_1]
|
||||
; cmp eax,300 ;ожидать 300 тиков
|
||||
; ja @@Err1 ;ошибка тайм-аута
|
||||
; Прочитать регистр состояния
|
||||
in AL,DX
|
||||
; Проверить состояние сигнала BSY
|
||||
test AL,80h
|
||||
jnz @@WaitHDReady
|
||||
; Проверить состояние сигнала DRQ
|
||||
test AL,08h
|
||||
jnz @@WaitHDReady
|
||||
; Загрузить команду в регистры контроллера
|
||||
cli
|
||||
mov DX,[ATABasePortAddr]
|
||||
inc DX ;регистр "особенностей"
|
||||
mov AL,[ATAFeatures]
|
||||
out DX,AL
|
||||
inc DX ;счетчик секторов
|
||||
mov AL,[ATASectorCount]
|
||||
out DX,AL
|
||||
inc DX ;регистр номера сектора
|
||||
mov AL,[ATASectorNumber]
|
||||
out DX,AL
|
||||
inc DX ;номер цилиндра (младший байт)
|
||||
mov AX,[ATACylinder]
|
||||
out DX,AL
|
||||
inc DX ;номер цилиндра (старший байт)
|
||||
mov AL,AH
|
||||
out DX,AL
|
||||
inc DX ;номер головки/номер диска
|
||||
mov AL,[DiskNumber]
|
||||
shl AL,4
|
||||
cmp [ATAHead],0Fh ;проверить номер головки
|
||||
ja @@Err5
|
||||
or AL,[ATAHead]
|
||||
or AL,10100000b
|
||||
mov AH,[ATAAddressMode]
|
||||
shl AH,6
|
||||
or AL,AH
|
||||
out DX,AL
|
||||
; Послать команду
|
||||
mov AL,[ATACommand]
|
||||
inc DX ;регистр команд
|
||||
out DX,AL
|
||||
sti
|
||||
; Сбросить признак ошибки
|
||||
mov [DevErrorCode],0
|
||||
jmp @@End_2
|
||||
; Записать код ошибки
|
||||
@@Err1: mov [DevErrorCode],1
|
||||
jmp @@End_2
|
||||
@@Err2: mov [DevErrorCode],2
|
||||
jmp @@End_2
|
||||
@@Err3: mov [DevErrorCode],3
|
||||
jmp @@End_2
|
||||
@@Err4: mov [DevErrorCode],4
|
||||
jmp @@End_2
|
||||
@@Err5: mov [DevErrorCode],5
|
||||
; Завершение работы программы
|
||||
@@End_2:
|
||||
ret
|
||||
|
||||
;*************************************************
|
||||
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* перменные: *
|
||||
;* ChannelNumber - номер канала; *
|
||||
;* DiskNumber - номер диска на канале. *
|
||||
;* Идентификационный блок данных считывается *
|
||||
;* в массив Sector512. *
|
||||
;*************************************************
|
||||
ReadCD_ID:
|
||||
; Задать режим CHS
|
||||
mov [ATAAddressMode],0
|
||||
; Послать команду идентификации устройства
|
||||
mov [ATAFeatures],0
|
||||
mov [ATASectorCount],0
|
||||
mov [ATASectorNumber],0
|
||||
mov [ATACylinder],0
|
||||
mov [ATAHead],0
|
||||
mov [ATACommand],0A1h
|
||||
call SendCommandToHDD
|
||||
cmp [DevErrorCode],0 ;проверить код ошибки
|
||||
jne @@End_1 ;закончить, сохранив код ошибки
|
||||
; Ожидать готовность данных HDD
|
||||
mov DX,[ATABasePortAddr]
|
||||
add DX,7 ;порт 1х7h
|
||||
mov ecx,0xffff
|
||||
@@WaitCompleet_1:
|
||||
; Проверить время
|
||||
dec ecx
|
||||
cmp ecx,0
|
||||
je @@Error1_1 ;ошибка тайм-аута
|
||||
; Проверить готовность
|
||||
in AL,DX
|
||||
test AL,80h ;состояние сигнала BSY
|
||||
jnz @@WaitCompleet_1
|
||||
test AL,1 ;состояние сигнала ERR
|
||||
jnz @@Error6_1
|
||||
test AL,08h ;состояние сигнала DRQ
|
||||
jz @@WaitCompleet_1
|
||||
; Принять блок данных от контроллера
|
||||
; mov AX,DS
|
||||
; mov ES,AX
|
||||
mov EDI,Sector512 ;offset Sector512
|
||||
mov DX,[ATABasePortAddr] ;порт 1x0h
|
||||
mov CX,256 ;число считываемых слов
|
||||
rep insw
|
||||
jmp @@End_1
|
||||
; Записать код ошибки
|
||||
@@Error1_1:
|
||||
mov [DevErrorCode],1
|
||||
jmp @@End_1
|
||||
@@Error6_1:
|
||||
mov [DevErrorCode],6
|
||||
@@End_1:
|
||||
ret
|
||||
|
||||
;*************************************************
|
||||
;* СБРОС УСТРОЙСТВА *
|
||||
;* Входные параметры передаются через глобальные *
|
||||
;* переменные: *
|
||||
;* ChannelNumber - номер канала (1 или 2); *
|
||||
;* DiskNumber - номер диска (0 или 1). *
|
||||
;*************************************************
|
||||
DeviceReset:
|
||||
; Проверить корректность номера канала
|
||||
mov BX,[ChannelNumber]
|
||||
cmp BX,1
|
||||
jb @@Err3_2
|
||||
cmp BX,2
|
||||
ja @@Err3_2
|
||||
; Установить базовый адрес
|
||||
dec BX
|
||||
shl BX,1
|
||||
movzx ebx,bx
|
||||
mov DX,[ebx+StandardATABases]
|
||||
mov [ATABasePortAddr],DX
|
||||
; Выбрать нужный диск
|
||||
add DX,6 ;адрес регистра головок
|
||||
mov AL,[DiskNumber]
|
||||
cmp AL,1 ;проверить номера диска
|
||||
ja @@Err4_2
|
||||
shl AL,4
|
||||
or AL,10100000b
|
||||
out DX,AL
|
||||
; Послать команду "Сброс"
|
||||
mov AL,08h
|
||||
inc DX ;регистр команд
|
||||
out DX,AL
|
||||
mov ecx,0xffff
|
||||
@@WaitHDReady_1:
|
||||
; Проверить время ожидания
|
||||
dec ecx
|
||||
cmp ecx,0
|
||||
je @@Err1_2 ;ошибка тайм-аута
|
||||
; Прочитать регистр состояния
|
||||
in AL,DX
|
||||
; Проверить состояние сигнала BSY
|
||||
test AL,80h
|
||||
jnz @@WaitHDReady_1
|
||||
; Сбросить признак ошибки
|
||||
mov [DevErrorCode],0
|
||||
jmp @@End_3
|
||||
; Обработка ошибок
|
||||
@@Err1_2: mov [DevErrorCode],1
|
||||
jmp @@End_3
|
||||
@@Err3_2: mov [DevErrorCode],3
|
||||
jmp @@End_3
|
||||
@@Err4_2: mov [DevErrorCode],4
|
||||
; Записать код ошибки
|
||||
@@End_3:
|
||||
ret
|
||||
|
||||
EndFindHDD:
|
||||
|
4
kernel/tags/kolibri0.5.3.0/detect/disks.inc
Normal file
4
kernel/tags/kolibri0.5.3.0/detect/disks.inc
Normal file
@ -0,0 +1,4 @@
|
||||
include 'dev_fd.inc'
|
||||
include 'dev_hdcd.inc'
|
||||
include 'sear_par.inc'
|
||||
|
69
kernel/tags/kolibri0.5.3.0/detect/ps2mouse.inc
Normal file
69
kernel/tags/kolibri0.5.3.0/detect/ps2mouse.inc
Normal file
@ -0,0 +1,69 @@
|
||||
MouseSearch_PS2:
|
||||
|
||||
pusha
|
||||
mov bl, 0xAD
|
||||
call kb_cmd
|
||||
|
||||
mov bl,0xa8 ; enable mouse cmd
|
||||
call kb_cmd
|
||||
cmp ah,1
|
||||
je @@DataInputError
|
||||
|
||||
mov bl,0xd4 ; for mouse
|
||||
call kb_cmd
|
||||
cmp ah,1
|
||||
je @@DataInputError
|
||||
mov al,0xeb ;
|
||||
call kb_write
|
||||
cmp ah,1
|
||||
je @@DataInputError
|
||||
call kb_read ; Acknowledge
|
||||
call kb_read
|
||||
mov [ps2_mouse_detected],0
|
||||
test al,18h
|
||||
jz @f
|
||||
mov [ps2_mouse_detected],1
|
||||
@@:
|
||||
call kb_read ;
|
||||
call kb_read ;
|
||||
|
||||
mov bl,0x20 ; get command byte
|
||||
call kb_cmd
|
||||
cmp ah,1
|
||||
je @@DataInputError
|
||||
call kb_read
|
||||
cmp ah,1
|
||||
je @@DataInputError
|
||||
or al,3 ; enable interrupt
|
||||
mov bl,0x60 ; write command
|
||||
push eax
|
||||
call kb_cmd
|
||||
pop eax
|
||||
call kb_write
|
||||
cmp ah,1
|
||||
je @@DataInputError
|
||||
|
||||
mov bl,0xd4 ; for mouse
|
||||
call kb_cmd
|
||||
cmp ah,1
|
||||
je @@DataInputError
|
||||
mov al,0xf4 ; enable mouse device
|
||||
call kb_write
|
||||
cmp ah,1
|
||||
je @@DataInputError
|
||||
call kb_read ; read status return
|
||||
cmp ah,1
|
||||
je @@DataInputError
|
||||
cmp AL,0FAh
|
||||
jnz @@DataInputError ;íåò ïîäòâåðæäåíèÿ
|
||||
|
||||
@@DataInputError:
|
||||
cmp [ps2_mouse_detected],0
|
||||
je @f
|
||||
mov esi,boot_setmouse_type
|
||||
call boot_log
|
||||
@@:
|
||||
mov bl, 0xAE
|
||||
call kb_cmd
|
||||
popa
|
||||
|
118
kernel/tags/kolibri0.5.3.0/detect/sear_par.inc
Normal file
118
kernel/tags/kolibri0.5.3.0/detect/sear_par.inc
Normal file
@ -0,0 +1,118 @@
|
||||
;****************************************************
|
||||
; ïîèñê ëîãè÷åñêèõ äèñêîâ íà îáíàðóæåííûõ HDD
|
||||
; è çàíåñåíèå äàííûõ â îáëàñòü òàáëèöû
|
||||
; àâòîð Mario79
|
||||
;****************************************************
|
||||
mov [transfer_adress],0x4000a
|
||||
search_partitions_ide0:
|
||||
test [0x40001],byte 0x40
|
||||
jz search_partitions_ide1
|
||||
mov [hdbase],0x1f0
|
||||
mov [hdid],0x0
|
||||
mov [hdpos],1
|
||||
mov [fat32part],1
|
||||
search_partitions_ide0_1:
|
||||
call set_FAT32_variables
|
||||
cmp [problem_partition],0
|
||||
jne search_partitions_ide1
|
||||
inc byte [0x40002]
|
||||
call partition_data_transfer
|
||||
add [transfer_adress],100
|
||||
inc [fat32part]
|
||||
jmp search_partitions_ide0_1
|
||||
|
||||
search_partitions_ide1:
|
||||
test [0x40001],byte 0x10
|
||||
jz search_partitions_ide2
|
||||
mov [hdbase],0x1f0
|
||||
mov [hdid],0x10
|
||||
mov [hdpos],2
|
||||
mov [fat32part],1
|
||||
search_partitions_ide1_1:
|
||||
call set_FAT32_variables
|
||||
cmp [problem_partition],0
|
||||
jne search_partitions_ide2
|
||||
inc byte [0x40003]
|
||||
call partition_data_transfer
|
||||
add [transfer_adress],100
|
||||
inc [fat32part]
|
||||
jmp search_partitions_ide1_1
|
||||
|
||||
search_partitions_ide2:
|
||||
test [0x40001],byte 0x4
|
||||
jz search_partitions_ide3
|
||||
mov [hdbase],0x170
|
||||
mov [hdid],0x0
|
||||
mov [hdpos],3
|
||||
mov [fat32part],1
|
||||
search_partitions_ide2_1:
|
||||
call set_FAT32_variables
|
||||
cmp [problem_partition],0
|
||||
jne search_partitions_ide3
|
||||
inc byte [0x40004]
|
||||
call partition_data_transfer
|
||||
add [transfer_adress],100
|
||||
inc [fat32part]
|
||||
jmp search_partitions_ide2_1
|
||||
|
||||
search_partitions_ide3:
|
||||
test [0x40001],byte 0x1
|
||||
jz end_search_partitions_ide
|
||||
mov [hdbase],0x170
|
||||
mov [hdid],0x10
|
||||
mov [hdpos],4
|
||||
mov [fat32part],1
|
||||
search_partitions_ide3_1:
|
||||
call set_FAT32_variables
|
||||
cmp [problem_partition],0
|
||||
jne end_search_partitions_ide
|
||||
inc byte [0x40005]
|
||||
call partition_data_transfer
|
||||
add [transfer_adress],100
|
||||
inc [fat32part]
|
||||
jmp search_partitions_ide3_1
|
||||
|
||||
|
||||
partition_data_transfer:
|
||||
mov edi,[transfer_adress]
|
||||
mov esi,PARTITION_START
|
||||
xor ecx,ecx
|
||||
mov cx,69 ;100
|
||||
rep movsb
|
||||
ret
|
||||
transfer_adress dd 0
|
||||
partition_data_transfer_1:
|
||||
cli
|
||||
push edi
|
||||
mov edi,PARTITION_START
|
||||
mov esi,[transfer_adress]
|
||||
xor ecx,ecx
|
||||
mov cx,69 ;100
|
||||
rep movsb
|
||||
pop edi
|
||||
sti
|
||||
ret
|
||||
|
||||
end_search_partitions_ide:
|
||||
|
||||
;PARTITION_START dd 0x3f
|
||||
;PARTITION_END dd 0
|
||||
;SECTORS_PER_FAT dd 0x1f3a
|
||||
;NUMBER_OF_FATS dd 0x2
|
||||
;SECTORS_PER_CLUSTER dd 0x8
|
||||
;BYTES_PER_SECTOR dd 0x200 ; Note: if BPS <> 512 need lots of changes
|
||||
;ROOT_CLUSTER dd 2 ; first rootdir cluster
|
||||
;FAT_START dd 0 ; start of fat table
|
||||
;ROOT_START dd 0 ; start of rootdir (only fat16)
|
||||
;ROOT_SECTORS dd 0 ; count of rootdir sectors (only fat16)
|
||||
;DATA_START dd 0 ; start of data area (=first cluster 2)
|
||||
;LAST_CLUSTER dd 0 ; last availabe cluster
|
||||
;ADR_FSINFO dd 0 ; used only by fat32
|
||||
;
|
||||
;fatRESERVED dd 0x0FFFFFF6
|
||||
;fatBAD dd 0x0FFFFFF7
|
||||
;fatEND dd 0x0FFFFFF8
|
||||
;fatMASK dd 0x0FFFFFFF
|
||||
;
|
||||
;fat_type db 0 ; 0=none, 16=fat16, 32=fat32
|
||||
|
1084
kernel/tags/kolibri0.5.3.0/fs/fat12.inc
Normal file
1084
kernel/tags/kolibri0.5.3.0/fs/fat12.inc
Normal file
File diff suppressed because it is too large
Load Diff
2828
kernel/tags/kolibri0.5.3.0/fs/fat32.inc
Normal file
2828
kernel/tags/kolibri0.5.3.0/fs/fat32.inc
Normal file
File diff suppressed because it is too large
Load Diff
1098
kernel/tags/kolibri0.5.3.0/fs/fs.inc
Normal file
1098
kernel/tags/kolibri0.5.3.0/fs/fs.inc
Normal file
File diff suppressed because it is too large
Load Diff
111
kernel/tags/kolibri0.5.3.0/fs/fs_phys.inc
Normal file
111
kernel/tags/kolibri0.5.3.0/fs/fs_phys.inc
Normal file
@ -0,0 +1,111 @@
|
||||
hd_phys_read:
|
||||
;eax - sector number
|
||||
;ebx - destination
|
||||
pushad
|
||||
call wait_for_hd_idle
|
||||
popad
|
||||
push edx
|
||||
push eax
|
||||
cli
|
||||
xor eax,eax
|
||||
mov edx,[hdbase]
|
||||
inc edx
|
||||
out dx,al
|
||||
inc edx
|
||||
inc eax
|
||||
out dx,al
|
||||
inc edx
|
||||
;write sector number.
|
||||
mov eax,[esp]
|
||||
out dx,al
|
||||
shr eax,8
|
||||
inc edx
|
||||
out dx,al
|
||||
shr eax,8
|
||||
inc edx
|
||||
out dx,al
|
||||
shr eax,8
|
||||
inc edx
|
||||
and al,1+2+4+8
|
||||
add al,byte [hdid] ;+0 or +16
|
||||
or al,32+64+128
|
||||
out dx,al
|
||||
inc edx
|
||||
mov al,0x20
|
||||
out dx,al
|
||||
sti
|
||||
|
||||
call wait_for_sector_buffer
|
||||
cmp [hd_error],0
|
||||
jnz hd_read_error
|
||||
cli
|
||||
push edi
|
||||
mov edi,ebx
|
||||
mov ecx,256
|
||||
mov edx,[hdbase]
|
||||
cld
|
||||
rep insw
|
||||
pop edi
|
||||
sti
|
||||
pop edx
|
||||
pop eax
|
||||
ret
|
||||
|
||||
hd_phys_write:
|
||||
;eax - sector number
|
||||
;ebx - destination
|
||||
cmp eax,[partition_start]
|
||||
jb .ret
|
||||
cmp eax,[partition_end]
|
||||
ja .ret
|
||||
pushad
|
||||
call wait_for_hd_idle
|
||||
popad
|
||||
push edx
|
||||
push eax
|
||||
cli
|
||||
xor eax,eax
|
||||
mov edx,[hdbase]
|
||||
inc edx
|
||||
out dx,al
|
||||
inc edx
|
||||
inc eax
|
||||
out dx,al
|
||||
;write sector number
|
||||
inc edx
|
||||
mov eax,[esp]
|
||||
out dx,al
|
||||
shr eax,8
|
||||
inc edx
|
||||
out dx,al
|
||||
shr eax,8
|
||||
inc edx
|
||||
out dx,al
|
||||
shr eax,8
|
||||
inc edx
|
||||
and al,1+2+4+8
|
||||
add al,byte [hdid] ;+0 or +16
|
||||
or al,32+64+128
|
||||
out dx,al
|
||||
|
||||
inc edx
|
||||
mov al,0x30
|
||||
out dx,al
|
||||
sti
|
||||
|
||||
call wait_for_sector_buffer
|
||||
cmp [hd_error],0
|
||||
jnz hd_write_error
|
||||
cli
|
||||
push esi
|
||||
mov esi,ebx
|
||||
mov ecx,256
|
||||
mov edx,[hdbase]
|
||||
cld
|
||||
rep outsw
|
||||
pop esi
|
||||
sti
|
||||
pop edx
|
||||
pop eax
|
||||
.ret:
|
||||
ret
|
643
kernel/tags/kolibri0.5.3.0/gui/button.inc
Normal file
643
kernel/tags/kolibri0.5.3.0/gui/button.inc
Normal file
@ -0,0 +1,643 @@
|
||||
max_buttons=4095
|
||||
dececx:
|
||||
push edx
|
||||
push ecx
|
||||
|
||||
mov edx,2
|
||||
.loop:
|
||||
|
||||
cmp byte [esp+edx],0x20
|
||||
jae @f
|
||||
mov [esp+edx],byte 0x20
|
||||
@@:
|
||||
sub [esp+edx],byte 0x20
|
||||
|
||||
dec edx
|
||||
jns .loop
|
||||
|
||||
pop ecx
|
||||
pop edx
|
||||
ret
|
||||
|
||||
incecx:
|
||||
push edx
|
||||
push ecx
|
||||
|
||||
mov edx,2
|
||||
.loop:
|
||||
|
||||
cmp byte [esp+edx],0xdf
|
||||
jbe @f
|
||||
mov [esp+edx],byte 0xdf
|
||||
@@:
|
||||
add [esp+edx],byte 0x20
|
||||
|
||||
dec edx
|
||||
jns .loop
|
||||
pop ecx
|
||||
pop edx
|
||||
ret
|
||||
|
||||
incecx2:
|
||||
push edx
|
||||
push ecx
|
||||
|
||||
mov edx,2
|
||||
.loop:
|
||||
|
||||
cmp byte [esp+edx],0xeb
|
||||
jbe @f
|
||||
mov [esp+edx],byte 0xeb
|
||||
@@:
|
||||
add [esp+edx],byte 0x14
|
||||
|
||||
dec edx
|
||||
jns .loop
|
||||
pop ecx
|
||||
pop edx
|
||||
ret
|
||||
|
||||
drawbuttonframes:
|
||||
|
||||
push esi
|
||||
push edi
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
|
||||
shr eax,16
|
||||
shr ebx,16
|
||||
mov edx,[0x3010]
|
||||
|
||||
add eax,[edx-twdw]
|
||||
add ebx,[edx-twdw+4]
|
||||
mov cx,ax
|
||||
mov dx,bx
|
||||
shl eax,16
|
||||
shl ebx,16
|
||||
mov ax,cx
|
||||
mov bx,dx
|
||||
add ax,word [esp+12]
|
||||
mov esi,ebx
|
||||
mov edi,0
|
||||
mov ecx,[esp+0]
|
||||
call incecx
|
||||
call [draw_line]
|
||||
|
||||
movzx edx,word [esp+8]
|
||||
add ebx,edx
|
||||
shl edx,16
|
||||
add ebx,edx
|
||||
mov ecx,[esp+0]
|
||||
call dececx
|
||||
call [draw_line]
|
||||
|
||||
mov ebx,esi
|
||||
push edx
|
||||
mov edx,eax
|
||||
shr edx,16
|
||||
mov ax,dx
|
||||
mov edx,ebx
|
||||
shr edx,16
|
||||
mov bx,dx
|
||||
mov dx,[esp+8+4]
|
||||
add bx,dx
|
||||
pop edx
|
||||
mov edi,0
|
||||
mov ecx,[esp+0]
|
||||
call incecx
|
||||
call [draw_line]
|
||||
|
||||
mov esi,edx
|
||||
mov dx,[esp+12]
|
||||
add ax,dx
|
||||
shl edx,16
|
||||
add eax,edx
|
||||
add ebx,1*65536
|
||||
mov edx,esi
|
||||
mov ecx,[esp+0]
|
||||
call dececx
|
||||
call [draw_line]
|
||||
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
pop edi
|
||||
pop esi
|
||||
|
||||
ret
|
||||
|
||||
button_dececx:
|
||||
|
||||
cmp [buttontype],dword 1
|
||||
jne .finish
|
||||
; je bdece
|
||||
; ret
|
||||
; bdece:
|
||||
push eax
|
||||
mov eax,0x01
|
||||
cmp edi,20
|
||||
jg @f
|
||||
mov eax,0x02
|
||||
@@:
|
||||
test ecx,0xff
|
||||
jz @f
|
||||
sub ecx,eax
|
||||
@@:
|
||||
shl eax,8
|
||||
test ecx,0xff00
|
||||
jz @f
|
||||
sub ecx,eax
|
||||
@@:
|
||||
shl eax,8
|
||||
test ecx,0xff0000
|
||||
jz @f
|
||||
sub ecx,eax
|
||||
@@:
|
||||
pop eax
|
||||
.finish:
|
||||
ret
|
||||
|
||||
|
||||
sys_button:
|
||||
|
||||
test ecx,0x80000000
|
||||
jnz remove_button
|
||||
|
||||
push esi
|
||||
push edi
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
|
||||
or ax,ax
|
||||
jle noaddbutt
|
||||
or bx,bx
|
||||
jle noaddbutt
|
||||
|
||||
test ecx,0x40000000
|
||||
jnz button_no_draw
|
||||
|
||||
pushad ; button body
|
||||
push ebx
|
||||
shr eax,16
|
||||
shr ebx,16
|
||||
mov edx,[0x3010]
|
||||
mov esi,[edx-twdw]
|
||||
mov edi,[edx-twdw+4]
|
||||
add eax,esi
|
||||
add ebx,edi
|
||||
mov cx,ax
|
||||
mov dx,bx
|
||||
shl eax,16
|
||||
shl ebx,16
|
||||
mov ax,cx
|
||||
mov bx,dx
|
||||
movzx ecx,word [4+32+esp+12]
|
||||
add eax,ecx
|
||||
mov ecx,[4+32+esp+0]
|
||||
cmp [buttontype],dword 0
|
||||
je @f
|
||||
call incecx2
|
||||
@@:
|
||||
movzx edi,word [esp]
|
||||
|
||||
; <Ivan Poddubny 15.08.2004>
|
||||
pop edx
|
||||
and edx, 0xFFFF
|
||||
;;cli
|
||||
.newline:
|
||||
call button_dececx
|
||||
push edi
|
||||
xor edi, edi
|
||||
call [draw_line]
|
||||
pop edi
|
||||
add ebx,1*65536+1 ; [ y start | y end ]
|
||||
dec edx
|
||||
jnz .newline
|
||||
;;sti
|
||||
;; pop ebx
|
||||
; </Ivan Poddubny 15.08.2004>
|
||||
popad
|
||||
|
||||
call drawbuttonframes
|
||||
|
||||
button_no_draw:
|
||||
|
||||
and ecx,0xffff
|
||||
|
||||
mov edi,[0x3010]
|
||||
sub edi,twdw
|
||||
|
||||
mov edi,[0xfe88]
|
||||
movzx eax,word [edi]
|
||||
cmp eax,max_buttons
|
||||
jge noaddbutt
|
||||
inc eax
|
||||
mov [edi],ax
|
||||
|
||||
shl eax,4
|
||||
add eax,edi
|
||||
|
||||
mov bx,[0x3000]
|
||||
mov [eax],bx
|
||||
|
||||
add eax,2 ; save button id number
|
||||
mov ebx,[esp+4]
|
||||
mov [eax],bx ; bits 0-15
|
||||
shr ebx,16
|
||||
mov [eax-2+0xc],bx; bits 16-31
|
||||
add eax,2 ; x start
|
||||
mov bx,[esp+12+2]
|
||||
mov [eax],bx
|
||||
add eax,2 ; x size
|
||||
mov bx,[esp+12+0]
|
||||
mov [eax],bx
|
||||
add eax,2 ; y start
|
||||
mov bx,[esp+8+2]
|
||||
mov [eax],bx
|
||||
add eax,2 ; y size
|
||||
mov bx,[esp+8+0]
|
||||
mov [eax],bx
|
||||
|
||||
noaddbutt:
|
||||
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
pop edi
|
||||
pop esi
|
||||
|
||||
ret
|
||||
|
||||
|
||||
remove_button:
|
||||
|
||||
and ecx,0x7fffffff
|
||||
|
||||
rnewba2:
|
||||
|
||||
mov edi,[0xfe88]
|
||||
mov eax,edi
|
||||
movzx ebx,word [edi]
|
||||
inc bx
|
||||
|
||||
rnewba:
|
||||
|
||||
dec bx
|
||||
jz rnmba
|
||||
|
||||
add eax,0x10
|
||||
|
||||
mov dx,[0x3000]
|
||||
cmp dx,[eax]
|
||||
jnz rnewba
|
||||
|
||||
cmp cx,[eax+2]
|
||||
jnz rnewba
|
||||
|
||||
pushad
|
||||
mov ecx,ebx
|
||||
inc ecx
|
||||
shl ecx,4
|
||||
mov ebx,eax
|
||||
add eax,0x10
|
||||
call memmove
|
||||
dec dword [edi]
|
||||
popad
|
||||
|
||||
jmp rnewba2
|
||||
|
||||
rnmba:
|
||||
|
||||
ret
|
||||
|
||||
find_pressed_button_frames:
|
||||
|
||||
pushad
|
||||
|
||||
movzx ebx,word [eax+0]
|
||||
shl ebx,5
|
||||
add ebx,window_data
|
||||
movzx ecx,word [ebx+0] ; window x start
|
||||
movzx edx,word [eax+4] ; button x start
|
||||
add ecx,edx
|
||||
push ecx
|
||||
|
||||
mov dx,[eax+6] ; button x size
|
||||
add cx,dx
|
||||
mov esi,ecx
|
||||
inc esi
|
||||
mov cx,[ebx+4] ; window y start
|
||||
mov dx,[eax+8] ; button y start
|
||||
add ecx,edx
|
||||
mov ebx,ecx
|
||||
mov dx,[eax+10] ; button y size
|
||||
add dx,cx
|
||||
inc dx
|
||||
|
||||
pop eax
|
||||
|
||||
; eax x beginning
|
||||
; ebx y beginning
|
||||
; esi x end
|
||||
; edx y end
|
||||
; ecx color
|
||||
|
||||
mov [pressed_button_eax],eax
|
||||
mov [pressed_button_ebx],ebx
|
||||
mov [pressed_button_ecx],ecx
|
||||
mov [pressed_button_edx],edx
|
||||
mov [pressed_button_esi],esi
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
uglobal
|
||||
pressed_button_eax dd 0
|
||||
pressed_button_ebx dd 0
|
||||
pressed_button_ecx dd 0
|
||||
pressed_button_edx dd 0
|
||||
pressed_button_esi dd 0
|
||||
endg
|
||||
|
||||
; negative button image
|
||||
|
||||
negativebutton:
|
||||
; If requested, do not display button
|
||||
; boarder on press.
|
||||
test ebx,0x20000000
|
||||
jz draw_negative_button
|
||||
ret
|
||||
draw_negative_button:
|
||||
|
||||
pushad
|
||||
|
||||
mov eax,[pressed_button_eax]
|
||||
mov ebx,[pressed_button_ebx]
|
||||
mov ecx,[pressed_button_ecx]
|
||||
mov edx,[pressed_button_edx]
|
||||
mov esi,[pressed_button_esi]
|
||||
mov ecx,0x01000000
|
||||
|
||||
dec edx
|
||||
push edx
|
||||
inc edx
|
||||
dec esi
|
||||
push esi
|
||||
inc esi
|
||||
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
push edi
|
||||
|
||||
call [disable_mouse]
|
||||
|
||||
bdbnewline:
|
||||
mov edi,1 ; force
|
||||
cmp eax,[esp+16]
|
||||
jz bneg
|
||||
cmp eax,[esp+20]
|
||||
jz bneg
|
||||
cmp ebx,[esp+12]
|
||||
jz bneg
|
||||
cmp ebx,[esp+24]
|
||||
jnz nbneg
|
||||
; jz bneg
|
||||
; jmp nbneg
|
||||
|
||||
bneg:
|
||||
|
||||
;;;call [disable_mouse]
|
||||
call [putpixel]
|
||||
|
||||
nbneg:
|
||||
|
||||
inc eax
|
||||
cmp eax,esi
|
||||
jnz bdbnewline
|
||||
mov eax,[esp+16]
|
||||
inc ebx
|
||||
cmp ebx,edx
|
||||
jnz bdbnewline
|
||||
|
||||
add esp,28
|
||||
|
||||
popad
|
||||
|
||||
ret
|
||||
|
||||
; check buttons
|
||||
|
||||
|
||||
; 0000 word process number
|
||||
; 0002 word button id number : bits 0-15
|
||||
; 0004 word x start
|
||||
; 0006 word x size
|
||||
; 0008 word y start
|
||||
; 000A word y size
|
||||
; 000C word button id number : bits 16-31
|
||||
;
|
||||
; button table in 0x10 increments
|
||||
;
|
||||
; first at 0x10
|
||||
|
||||
|
||||
checkbuttons:
|
||||
|
||||
cmp [0xfb40],byte 0 ; mouse buttons pressed
|
||||
jnz @f
|
||||
ret
|
||||
@@:
|
||||
|
||||
pushad
|
||||
|
||||
xor esi, esi
|
||||
mov edi, [0xfe88]
|
||||
movzx edx, word [edi]
|
||||
test edx, edx
|
||||
jne @f
|
||||
popad
|
||||
ret
|
||||
|
||||
@@:
|
||||
|
||||
push esi
|
||||
inc edx
|
||||
push edx
|
||||
|
||||
buttonnewcheck:
|
||||
|
||||
pop edx
|
||||
pop esi
|
||||
inc esi
|
||||
cmp edx,esi
|
||||
jge bch
|
||||
|
||||
popad ; no button pressed
|
||||
ret
|
||||
|
||||
bch:
|
||||
|
||||
push esi
|
||||
push edx
|
||||
mov eax,esi
|
||||
shl eax,4
|
||||
add eax,edi
|
||||
|
||||
;......................start 1/2 : modified by vhanla .............................
|
||||
mov [buttonid],eax
|
||||
;......................end 1/2 : modified by vhanla .............................
|
||||
|
||||
; check that button is at top of windowing stack
|
||||
|
||||
movzx ebx,word [eax]
|
||||
movzx ecx,word [0xC000 + ebx * 2]
|
||||
cmp ecx,[0x3004]
|
||||
jne buttonnewcheck
|
||||
|
||||
; check that button start is inside window x/y end
|
||||
|
||||
movzx ebx,word [eax+0]
|
||||
shl ebx,5
|
||||
|
||||
test [ebx+window_data+WDATA.fl_wstate],WSTATE_MINIMIZED
|
||||
jnz buttonnewcheck
|
||||
|
||||
; add ebx,window_data
|
||||
; mov ecx,[window_data+ebx+8] ; window end X
|
||||
movzx edx,word [eax+4] ; button start X
|
||||
cmp edx, [window_data+ebx+8] ;ecx
|
||||
jge buttonnewcheck
|
||||
|
||||
; mov ecx,[window_data+ebx+12] ; window end Y
|
||||
movzx edx, word [eax+8] ; button start Y
|
||||
cmp edx, [window_data+ebx+12] ;ecx
|
||||
jge buttonnewcheck
|
||||
|
||||
; check coordinates
|
||||
; mouse x >= button x ?
|
||||
movzx ebx,word [eax+0]
|
||||
shl ebx,5
|
||||
add ebx,window_data
|
||||
movzx ecx,word [ebx+0] ; window x start
|
||||
movzx edx,word [eax+4] ; button x start
|
||||
add edx,ecx
|
||||
mov cx,[0xfb0a]
|
||||
cmp edx,ecx
|
||||
jg buttonnewcheck
|
||||
|
||||
movzx ebx,word [eax+6] ; button x size
|
||||
add edx,ebx
|
||||
cmp ecx,edx
|
||||
jg buttonnewcheck
|
||||
|
||||
; mouse y >= button y ?
|
||||
movzx ebx,word [eax+0]
|
||||
shl ebx,5
|
||||
add ebx,window_data
|
||||
movzx ecx,word [ebx+4] ; window y start
|
||||
movzx edx,word [eax+8] ; button y start
|
||||
add edx,ecx
|
||||
mov cx,[0xfb0c]
|
||||
cmp edx,ecx
|
||||
jg buttonnewcheck
|
||||
|
||||
movzx ebx,word [eax+10] ; button y size
|
||||
add edx,ebx
|
||||
cmp ecx,edx
|
||||
jg buttonnewcheck
|
||||
|
||||
; mouse on button
|
||||
|
||||
pop edx
|
||||
pop esi
|
||||
|
||||
mov bx,[eax+0xc] ; button id : bits 16-31
|
||||
shl ebx,16
|
||||
mov bx,[eax+2] ; button id : bits 00-16
|
||||
push ebx
|
||||
|
||||
mov [0xfb44],byte 1 ; no mouse down checks
|
||||
call find_pressed_button_frames
|
||||
call negativebutton
|
||||
|
||||
pushad
|
||||
cbwaitmouseup:
|
||||
|
||||
call checkidle
|
||||
|
||||
call [draw_pointer]
|
||||
|
||||
pushad
|
||||
call stack_handler
|
||||
popad
|
||||
|
||||
cmp [0xfb40],byte 0 ; mouse buttons pressed ?
|
||||
jnz cbwaitmouseup
|
||||
popad
|
||||
|
||||
call negativebutton
|
||||
mov [0xfff4],byte 0 ; no mouse background
|
||||
mov [0xfff5],byte 0 ; draw mouse
|
||||
;..................................... start 2/2 : modified by vhanla .............................
|
||||
; check coordinates
|
||||
jmp afterbuttonid
|
||||
buttonid dd 0x0 ;here a will backup the eax value
|
||||
afterbuttonid:
|
||||
|
||||
pusha
|
||||
; mouse x >= button x ?
|
||||
movzx ebx,word [eax+0]
|
||||
shl ebx,5
|
||||
add ebx,window_data
|
||||
movzx ecx,word [ebx+0] ; window x start
|
||||
movzx edx,word [eax+4] ; button x start
|
||||
add edx,ecx
|
||||
mov cx,[0xfb0a]
|
||||
cmp edx,ecx
|
||||
jg no_on_button ;if we release the pointer out of the button area
|
||||
|
||||
movzx ebx,word [eax+6] ; button x size
|
||||
add edx,ebx
|
||||
cmp ecx,edx
|
||||
jg no_on_button
|
||||
|
||||
; mouse y >= button y ?
|
||||
movzx ebx,word [eax+0]
|
||||
shl ebx,5
|
||||
add ebx,window_data
|
||||
movzx ecx,word [ebx+4] ; window y start
|
||||
movzx edx,word [eax+8] ; button y start
|
||||
add edx,ecx
|
||||
mov cx,[0xfb0c]
|
||||
cmp edx,ecx
|
||||
jg no_on_button
|
||||
|
||||
movzx ebx,word [eax+10] ; button y size
|
||||
add edx,ebx
|
||||
cmp ecx,edx
|
||||
jg no_on_button
|
||||
popa
|
||||
mov [0xf500],byte 1 ; no of buttons in buffer
|
||||
pop ebx
|
||||
mov [0xf501],ebx ; lets put the button id in buffer
|
||||
push ebx
|
||||
pusha
|
||||
jmp yes_on_button
|
||||
no_on_button:
|
||||
mov [0xf500],byte 0 ; no of buttons in buffer
|
||||
yes_on_button:
|
||||
mov [0xfb44],byte 0 ; mouse down -> do not draw
|
||||
popa
|
||||
pop ebx
|
||||
popa
|
||||
ret
|
||||
|
||||
;..................................... end 2/2 : modified by vhanla ................................
|
206
kernel/tags/kolibri0.5.3.0/gui/event.inc
Normal file
206
kernel/tags/kolibri0.5.3.0/gui/event.inc
Normal file
@ -0,0 +1,206 @@
|
||||
sys_getevent:
|
||||
|
||||
call get_event_for_app
|
||||
mov [esp+36],eax
|
||||
ret
|
||||
|
||||
|
||||
align 4
|
||||
|
||||
sys_wait_event_timeout:
|
||||
|
||||
mov ebx,[timer_ticks]
|
||||
add ebx,eax
|
||||
cmp ebx,[timer_ticks]
|
||||
jna .swfet2
|
||||
.swfet1:
|
||||
call get_event_for_app
|
||||
test eax,eax
|
||||
jne .eventoccur_time
|
||||
call change_task
|
||||
cmp ebx,[timer_ticks]
|
||||
jg .swfet1
|
||||
.swfet2:
|
||||
xor eax,eax
|
||||
.eventoccur_time:
|
||||
mov [esp+36],eax
|
||||
ret
|
||||
|
||||
|
||||
align 4
|
||||
|
||||
sys_waitforevent:
|
||||
|
||||
call get_event_for_app
|
||||
test eax,eax
|
||||
jne eventoccur
|
||||
newwait:
|
||||
|
||||
mov eax, [0x3010]
|
||||
mov [eax+0xA], byte 5
|
||||
call change_task
|
||||
|
||||
mov eax, [event_sched]
|
||||
|
||||
eventoccur:
|
||||
mov [esp+36],eax
|
||||
ret
|
||||
|
||||
|
||||
get_event_for_app:
|
||||
|
||||
pushad
|
||||
|
||||
mov edi,[0x3010] ; WINDOW REDRAW
|
||||
test [edi],dword 1
|
||||
jz no_eventoccur1
|
||||
;mov edi,[0x3010]
|
||||
cmp [edi-twdw+31],byte 0
|
||||
je no_eventoccur1
|
||||
popad
|
||||
mov eax,1
|
||||
ret
|
||||
no_eventoccur1:
|
||||
|
||||
;mov edi,[0x3010] ; KEY IN BUFFER
|
||||
test [edi],dword 2
|
||||
jz no_eventoccur2
|
||||
mov ecx, [0x3000]
|
||||
movzx edx,word [0xC000+ecx*2]
|
||||
mov eax, [0x3004]
|
||||
cmp eax,edx
|
||||
jne no_eventoccur2
|
||||
cmp [0xf400],byte 0
|
||||
je no_eventoccur2
|
||||
popad
|
||||
mov eax,2
|
||||
ret
|
||||
no_eventoccur2:
|
||||
|
||||
;mov edi,[0x3010] ; BUTTON IN BUFFER
|
||||
test [edi],dword 4
|
||||
jz no_eventoccur3
|
||||
cmp [0xf500],byte 0
|
||||
je no_eventoccur3
|
||||
mov ecx, [0x3000]
|
||||
movzx edx, word [0xC000+ecx*2]
|
||||
mov eax, [0x3004]
|
||||
cmp eax,edx
|
||||
jnz no_eventoccur3
|
||||
popad
|
||||
mov eax,[0xf501]
|
||||
cmp eax,65535
|
||||
je no_event_1
|
||||
mov eax,3
|
||||
ret
|
||||
|
||||
no_event_1:
|
||||
mov [window_minimize],1
|
||||
mov [0xf500],byte 0
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
no_eventoccur3:
|
||||
|
||||
|
||||
;mov edi,[0x3010] ; mouse event
|
||||
test [edi],dword 00100000b
|
||||
jz no_mouse_event
|
||||
mov eax,[0x3000]
|
||||
shl eax,8
|
||||
test [eax+0x80000+0xA8],dword 00100000b
|
||||
jz no_mouse_event
|
||||
and [eax+0x80000+0xA8],dword 0xffffffff-00100000b
|
||||
popad
|
||||
mov eax,6
|
||||
ret
|
||||
no_mouse_event:
|
||||
|
||||
|
||||
;mov edi,[0x3010] ; DESKTOP BACKGROUND REDRAW
|
||||
test [edi],dword 16
|
||||
jz no_eventoccur5
|
||||
cmp [0xfff0],byte 2
|
||||
jnz no_eventoccur5
|
||||
popad
|
||||
mov eax,5
|
||||
ret
|
||||
no_eventoccur5:
|
||||
|
||||
;mov edi,[0x3010] ; IPC
|
||||
test [edi],dword 01000000b
|
||||
jz no_ipc
|
||||
mov eax,[0x3000]
|
||||
shl eax,8
|
||||
test [eax+0x80000+0xA8],dword 01000000b
|
||||
jz no_ipc
|
||||
and [eax+0x80000+0xA8],dword 0xffffffff-01000000b
|
||||
popad
|
||||
mov eax,7
|
||||
ret
|
||||
no_ipc:
|
||||
|
||||
|
||||
;mov edi,[0x3010] ; STACK
|
||||
test [edi],dword 10000000b
|
||||
jz no_stack_event
|
||||
mov eax,[0x3000]
|
||||
shl eax,8
|
||||
test [eax+0x80000+0xA8],dword 10000000b
|
||||
jz no_stack_event
|
||||
and [eax+0x80000+0xA8],dword 0xffffffff-10000000b
|
||||
popad
|
||||
mov eax,8
|
||||
ret
|
||||
no_stack_event:
|
||||
|
||||
test byte [edi+1], 1 ; DEBUG
|
||||
jz no_debug_event
|
||||
mov eax, [0x3000]
|
||||
shl eax, 8
|
||||
test [eax+0x80000+0xA8+1], byte 1
|
||||
jz no_debug_event
|
||||
and byte [eax+0x80000+0xA8+1], not 1
|
||||
popad
|
||||
mov eax, 9
|
||||
ret
|
||||
no_debug_event:
|
||||
|
||||
cmp dword [edi], 0xFFFF
|
||||
jbe no_events
|
||||
|
||||
mov esi,0x2e0000 ; IRQ'S AND DATA
|
||||
mov ebx,0x00010000
|
||||
xor ecx, ecx
|
||||
irq_event_test:
|
||||
mov edi,[0x3010]
|
||||
test [edi],ebx
|
||||
jz no_irq_event
|
||||
mov edi,ecx
|
||||
shl edi,2
|
||||
add edi,irq_owner
|
||||
mov edx,[edi]
|
||||
mov eax,[0x3010]
|
||||
mov eax,[eax+0x4]
|
||||
cmp edx,eax
|
||||
jne no_irq_event
|
||||
cmp [esi],dword 0
|
||||
jz no_irq_event
|
||||
mov eax,ecx
|
||||
add eax,16
|
||||
mov [esp+28],eax
|
||||
popad
|
||||
ret
|
||||
no_irq_event:
|
||||
add esi,0x1000
|
||||
shl ebx,1
|
||||
inc ecx
|
||||
cmp ecx,16
|
||||
jb irq_event_test
|
||||
|
||||
no_events:
|
||||
popad
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
|
151
kernel/tags/kolibri0.5.3.0/gui/font.inc
Normal file
151
kernel/tags/kolibri0.5.3.0/gui/font.inc
Normal file
@ -0,0 +1,151 @@
|
||||
align 4
|
||||
dtext:
|
||||
; eax x & y
|
||||
; ebx font ( 0xX0000000 ) & color ( 0x00RRGGBB )
|
||||
; ecx start of text
|
||||
; edx length
|
||||
; edi 1 force
|
||||
|
||||
test ebx,0x10000000
|
||||
jnz dtext2
|
||||
|
||||
pushad
|
||||
|
||||
mov esi, edx
|
||||
and esi, 0xff
|
||||
test esi, esi ; zero length ?
|
||||
jnz @f
|
||||
popad
|
||||
ret
|
||||
@@:
|
||||
align 4
|
||||
.letnew:
|
||||
|
||||
push eax ecx edx
|
||||
movzx ebx,ax
|
||||
shr eax,16
|
||||
movzx edx,byte [ecx]
|
||||
mov ecx,[esp+3*4+32-16]
|
||||
call drawletter
|
||||
pop edx ecx eax
|
||||
|
||||
add eax,6*65536
|
||||
|
||||
inc ecx
|
||||
dec edx
|
||||
jnz .letnew
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
align 4
|
||||
drawletter:
|
||||
;eax - x
|
||||
;ebx - y
|
||||
;ecx - color
|
||||
;edx - ascii code
|
||||
pushad
|
||||
call [disable_mouse]
|
||||
mov esi,9
|
||||
lea ebp,[0x3F600+8*edx+edx]
|
||||
.symloop:
|
||||
push esi
|
||||
mov dl,byte [ebp]
|
||||
mov esi,8
|
||||
.pixloop:
|
||||
test dl,1
|
||||
jz .nopix
|
||||
call [putpixel]
|
||||
.nopix:
|
||||
shr dl,1
|
||||
inc eax
|
||||
dec esi
|
||||
jnz .pixloop
|
||||
sub eax,8
|
||||
inc ebx
|
||||
inc ebp
|
||||
pop esi
|
||||
dec esi
|
||||
jnz .symloop
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
|
||||
dtext2:
|
||||
|
||||
; eax x & y
|
||||
; ebx color
|
||||
; ecx start of text
|
||||
; edx length
|
||||
; edi 1 force
|
||||
|
||||
pushad
|
||||
|
||||
mov esi,edx
|
||||
and esi,0xff
|
||||
test esi,esi ; zero length ?
|
||||
jnz @f
|
||||
popad
|
||||
ret
|
||||
@@:
|
||||
|
||||
align 4
|
||||
letnew2:
|
||||
|
||||
push ecx
|
||||
push edx
|
||||
movzx ebx,ax
|
||||
shr eax,16
|
||||
movzx edx,byte [ecx]
|
||||
mov ecx,[esp+2*4+32-16]
|
||||
call drawletter2
|
||||
shl eax,16
|
||||
add eax,ebx
|
||||
pop edx
|
||||
pop ecx
|
||||
|
||||
inc ecx
|
||||
dec edx
|
||||
jnz letnew2
|
||||
|
||||
popad
|
||||
ret
|
||||
|
||||
align 4
|
||||
drawletter2:
|
||||
;eax - x
|
||||
;ebx - y
|
||||
;ecx - color
|
||||
;edx - symbol
|
||||
;edi - force?
|
||||
;result - eax=eax+sym_size
|
||||
pushad
|
||||
call [disable_mouse]
|
||||
shl edx,1
|
||||
mov esi,9
|
||||
lea ebp,[0x3EC00+4*edx+edx+1]
|
||||
.symloop:
|
||||
push esi
|
||||
mov dl,byte [ebp]
|
||||
xor esi,esi
|
||||
.pixloop:
|
||||
test dl,1
|
||||
jz .nopix
|
||||
call [putpixel]
|
||||
.nopix:
|
||||
shr dl,1
|
||||
inc esi
|
||||
inc eax
|
||||
cmp esi,8
|
||||
jl .pixloop
|
||||
sub eax,8
|
||||
inc ebx
|
||||
pop esi
|
||||
inc ebp
|
||||
dec esi
|
||||
jnz .symloop
|
||||
movzx edx,byte [ebp-10]
|
||||
add [esp+32-4],edx
|
||||
popad
|
||||
ret
|
243
kernel/tags/kolibri0.5.3.0/gui/mouse.inc
Normal file
243
kernel/tags/kolibri0.5.3.0/gui/mouse.inc
Normal file
@ -0,0 +1,243 @@
|
||||
;mouseunder:
|
||||
; times 16*24 dd 0
|
||||
label mouseunder dword at 0x6900
|
||||
|
||||
iglobal
|
||||
|
||||
mousepointer:
|
||||
db 0x00,0x00,0x00,0x74,0x74,0x74,0x6e,0x6e,0x6e,0x6f
|
||||
db 0x6f,0x6f,0x71,0x71,0x71,0x75,0x75,0x75,0x79,0x79
|
||||
db 0x79,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63
|
||||
db 0x66,0x66,0x66,0x6c,0x6c,0x6c,0x72,0x72,0x72,0x78
|
||||
db 0x78,0x78,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0
|
||||
db 0xc0,0xc0,0x00,0x00,0x00,0x54,0x54,0x54,0x57,0x57
|
||||
db 0x57,0x5f,0x5f,0x5f,0x68,0x68,0x68,0x71,0x71,0x71
|
||||
db 0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0x00,0x00,0x00,0x47,0x47,0x47,0x50
|
||||
db 0x50,0x50,0x5b,0x5b,0x5b,0x67,0x67,0x67,0x70,0x70
|
||||
db 0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0xff,0xff,0xff,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x3f,0x3f,0x3f
|
||||
db 0x4b,0x4b,0x4b,0x59,0x59,0x59,0x66,0x66,0x66,0x70
|
||||
db 0x70,0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e
|
||||
db 0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x3a,0x3a
|
||||
db 0x3a,0x49,0x49,0x49,0x59,0x59,0x59,0x66,0x66,0x66
|
||||
db 0x70,0x70,0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e
|
||||
db 0x7e,0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x39
|
||||
db 0x39,0x39,0x49,0x49,0x49,0x59,0x59,0x59,0x66,0x66
|
||||
db 0x66,0x71,0x71,0x71,0x78,0x78,0x78,0x7c,0x7c,0x7c
|
||||
db 0x7e,0x7e,0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
||||
db 0x39,0x39,0x39,0x4a,0x4a,0x4a,0x5a,0x5a,0x5a,0x68
|
||||
db 0x68,0x68,0x72,0x72,0x72,0x79,0x79,0x79,0x7d,0x7d
|
||||
db 0x7d,0x7f,0x7f,0x7f,0x80,0x80,0x80,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00
|
||||
db 0x00,0x3c,0x3c,0x3c,0x4e,0x4e,0x4e,0x5e,0x5e,0x5e
|
||||
db 0x6b,0x6b,0x6b,0x75,0x75,0x75,0x7a,0x7a,0x7a,0x7e
|
||||
db 0x7e,0x7e,0x80,0x80,0x80,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00
|
||||
db 0x00,0x00,0x43,0x43,0x43,0x55,0x55,0x55,0x64,0x64
|
||||
db 0x64,0x70,0x70,0x70,0x78,0x78,0x78,0x7d,0x7d,0x7d
|
||||
db 0x80,0x80,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xc0
|
||||
db 0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x4e,0x4e,0x4e,0x5f,0x5f,0x5f,0x6d
|
||||
db 0x6d,0x6d,0x76,0x76,0x76,0x7c,0x7c,0x7c,0x80,0x80
|
||||
db 0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
||||
db 0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x14
|
||||
db 0x14,0x14,0x1b,0x1b,0x1b,0x29,0x29,0x29,0x3a,0x3a
|
||||
db 0x3a,0x4c,0x4c,0x4c,0x5d,0x5d,0x5d,0x6c,0x6c,0x6c
|
||||
db 0x75,0x75,0x75,0x7b,0x7b,0x7b,0x80,0x80,0x80,0xc0
|
||||
db 0xc0,0xc0,0x00,0x00,0x00,0x2f,0x2f,0x2f,0x80,0x80
|
||||
db 0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
||||
db 0x21,0x21,0x21,0x2e,0x2e,0x2e,0x40,0x40,0x40,0x52
|
||||
db 0x52,0x52,0x62,0x62,0x62,0x6f,0x6f,0x6f,0x77,0x77
|
||||
db 0x77,0x7c,0x7c,0x7c,0x80,0x80,0x80,0x00,0x00,0x00
|
||||
db 0x47,0x47,0x47,0x3b,0x3b,0x3b,0x80,0x80,0x80,0xff
|
||||
db 0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x25,0x25
|
||||
db 0x25,0x30,0x30,0x30,0x42,0x42,0x42,0x54,0x54,0x54
|
||||
db 0x64,0x64,0x64,0x70,0x70,0x70,0x78,0x78,0x78,0x7d
|
||||
db 0x7d,0x7d,0x00,0x00,0x00,0x62,0x62,0x62,0x52,0x52
|
||||
db 0x52,0x4a,0x4a,0x4a,0x43,0x43,0x43,0x80,0x80,0x80
|
||||
db 0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x33
|
||||
db 0x33,0x33,0x42,0x42,0x42,0x54,0x54,0x54,0x64,0x64
|
||||
db 0x64,0x71,0x71,0x71,0x79,0x79,0x79,0x7d,0x7d,0x7d
|
||||
db 0x72,0x72,0x72,0x6b,0x6b,0x6b,0x5f,0x5f,0x5f,0x5a
|
||||
db 0x5a,0x5a,0x54,0x54,0x54,0x80,0x80,0x80,0xff,0xff
|
||||
db 0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x35,0x35,0x35
|
||||
db 0x41,0x41,0x41,0x53,0x53,0x53,0x63,0x63,0x63,0x70
|
||||
db 0x70,0x70,0x78,0x78,0x78,0x7d,0x7d,0x7d,0x77,0x77
|
||||
db 0x77,0x73,0x73,0x73,0x6c,0x6c,0x6c,0x68,0x68,0x68
|
||||
db 0x62,0x62,0x62,0x5a,0x5a,0x5a,0x80,0x80,0x80,0xff
|
||||
db 0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x41,0x41
|
||||
db 0x41,0x52,0x52,0x52,0x62,0x62,0x62,0x6f,0x6f,0x6f
|
||||
db 0x78,0x78,0x78,0x7d,0x7d,0x7d,0x7b,0x7b,0x7b,0x79
|
||||
db 0x79,0x79,0x74,0x74,0x74,0x72,0x72,0x72,0x6e,0x6e
|
||||
db 0x6e,0x66,0x66,0x66,0x80,0x80,0x80,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0x00,0x00,0x00,0x44,0x44,0x44,0x52
|
||||
db 0x52,0x52,0x62,0x62,0x62,0x6e,0x6e,0x6e,0x77,0x77
|
||||
db 0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x7c,0x7c,0x7c
|
||||
db 0x7a,0x7a,0x7a,0x79,0x79,0x79,0x75,0x75,0x75,0x6f
|
||||
db 0x6f,0x6f,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x48,0x48,0x48,0x4b,0x4b,0x4b,0x56,0x56,0x56
|
||||
db 0x65,0x65,0x65,0x70,0x70,0x70,0x78,0x78,0x78,0x7d
|
||||
db 0x7d,0x7d,0x80,0x80,0x80,0x7f,0x7f,0x7f,0x7e,0x7e
|
||||
db 0x7e,0x7d,0x7d,0x7d,0x7a,0x7a,0x7a,0x76,0x76,0x76
|
||||
db 0x6f,0x6f,0x6f,0x65,0x65,0x65,0x5c,0x5c,0x5c,0x56
|
||||
db 0x56,0x56,0x58,0x58,0x58,0x60,0x60,0x60,0x6b,0x6b
|
||||
db 0x6b,0x73,0x73,0x73,0x7a,0x7a,0x7a,0x7d,0x7d,0x7d
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7f
|
||||
db 0x7f,0x7f,0x7d,0x7d,0x7d,0x7a,0x7a,0x7a,0x76,0x76
|
||||
db 0x76,0x70,0x70,0x70,0x6a,0x6a,0x6a,0x66,0x66,0x66
|
||||
db 0x66,0x66,0x66,0x6c,0x6c,0x6c,0x72,0x72,0x72,0x78
|
||||
db 0x78,0x78,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7b,0x7b,0x7b,0x77
|
||||
db 0x77,0x77,0x73,0x73,0x73,0x71,0x71,0x71,0x71,0x71
|
||||
db 0x71,0x74,0x74,0x74,0x78,0x78,0x78,0x7b,0x7b,0x7b
|
||||
db 0x7d,0x7d,0x7d,0x7f,0x7f,0x7f,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7c,0x7c,0x7c
|
||||
db 0x7a,0x7a,0x7a,0x78,0x78,0x78,0x78,0x78,0x78,0x7a
|
||||
db 0x7a,0x7a,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x7f,0x7f
|
||||
db 0x7f,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x7f,0x7f,0x7f,0x7e,0x7e,0x7e,0x7e,0x7e
|
||||
db 0x7e,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7e,0x7e,0x7e
|
||||
db 0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80
|
||||
|
||||
mousepointer1:
|
||||
db 0xff,0xff,0xff,0x06,0x06,0x06,0x0a,0x0a
|
||||
db 0x0a,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0x19,0x19,0x19,0x16
|
||||
db 0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2e,0x2e,0x2e
|
||||
db 0x23,0x23,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x3f
|
||||
db 0x3f,0x29,0x29,0x29,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x47
|
||||
db 0x47,0x47,0x2c,0x2c,0x2c,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0x48,0x48,0x48,0x2c,0x2c,0x2c,0x16,0x16,0x16,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x16,0x16,0x16
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0x47,0x47,0x47,0x29,0x29,0x29
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0x40,0x40,0x40,0x23,0x23
|
||||
db 0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xaa,0xaa,0xaa,0x9f,0x9f,0x9f,0x8c,0x8c,0x8c
|
||||
db 0x70,0x70,0x70,0x4f,0x4f,0x4f,0x30,0x30,0x30,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8f,0x8f,0x8f
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0x9c,0x9c,0x9c,0x87,0x87,0x87,0x6c,0x6c
|
||||
db 0x6c,0x4f,0x4f,0x4f,0x32,0x32,0x32,0x19,0x19,0x19
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0x69,0x69,0x69,0x84,0x84,0x84,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0x92,0x92,0x92,0x79,0x79,0x79,0x59,0x59,0x59,0x3c
|
||||
db 0x3c,0x3c,0x24,0x24,0x24,0x11,0x11,0x11,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x37,0x37,0x37
|
||||
db 0x5d,0x5d,0x5d,0x70,0x70,0x70,0x76,0x76,0x76,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0x75,0x75,0x75,0x51,0x51,0x51,0x31,0x31,0x31
|
||||
db 0x19,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x16,0x16,0x16,0x2d,0x2d,0x2d,0x49,0x49
|
||||
db 0x49,0x53,0x53,0x53,0x54,0x54,0x54,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x78
|
||||
db 0x78,0x78,0x54,0x54,0x54,0x30,0x30,0x30,0x16,0x16
|
||||
db 0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x0f,0x0f,0x0f,0x1f,0x1f,0x1f,0x30,0x30,0x30,0x33
|
||||
db 0x33,0x33,0x33,0x33,0x33,0x3b,0x3b,0x3b,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0x62,0x62,0x62,0x3b,0x3b,0x3b,0x1c,0x1c,0x1c,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08
|
||||
db 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x24,0x24,0x24,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6e,0x6e
|
||||
db 0x6e,0x48,0x48,0x48,0x25,0x25,0x25,0x0e,0x0e,0x0e
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x00
|
||||
db 0x00,0x00,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x29,0x29,0x29,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0x7c,0x7c,0x7c,0x71,0x71,0x71,0x50
|
||||
db 0x50,0x50,0x2b,0x2b,0x2b,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x02,0x02,0x02,0x04,0x04,0x04,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x36,0x36,0x36,0x56,0x56
|
||||
db 0x56,0x69,0x69,0x69,0x64,0x64,0x64,0x4a,0x4a,0x4a
|
||||
db 0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x05,0x05,0x05
|
||||
db 0x00,0x00,0x00,0x21,0x21,0x21,0x39,0x39,0x39,0x49
|
||||
db 0x49,0x49,0x48,0x48,0x48,0x35,0x35,0x35,0x1d,0x1d
|
||||
db 0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x27,0x27,0x27
|
||||
db 0x27,0x27,0x27,0x1d,0x1d,0x1d,0x0f,0x0f,0x0f,0x06
|
||||
db 0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00
|
||||
|
||||
endg
|
422
kernel/tags/kolibri0.5.3.0/gui/skincode.inc
Normal file
422
kernel/tags/kolibri0.5.3.0/gui/skincode.inc
Normal file
@ -0,0 +1,422 @@
|
||||
include "skindata.inc"
|
||||
|
||||
skin_data = 0x00778000
|
||||
|
||||
load_skin_file:
|
||||
; eax = filename
|
||||
; edx = destination
|
||||
mov ebx,1
|
||||
or ecx,-1
|
||||
mov esi,12
|
||||
call fileread
|
||||
ret
|
||||
|
||||
struct SKIN_HEADER
|
||||
.ident dd ?
|
||||
.version dd ?
|
||||
.params dd ?
|
||||
.buttons dd ?
|
||||
.bitmaps dd ?
|
||||
ends
|
||||
|
||||
struct SKIN_PARAMS
|
||||
.skin_height dd ?
|
||||
.margin.right dw ?
|
||||
.margin.left dw ?
|
||||
.margin.bottom dw ?
|
||||
.margin.top dw ?
|
||||
.colors.inner dd ?
|
||||
.colors.outer dd ?
|
||||
.colors.frame dd ?
|
||||
.colors_1.inner dd ?
|
||||
.colors_1.outer dd ?
|
||||
.colors_1.frame dd ?
|
||||
.dtp.size dd ?
|
||||
.dtp.data db 40 dup (?)
|
||||
ends
|
||||
|
||||
struct SKIN_BUTTONS
|
||||
.type dd ?
|
||||
.pos:
|
||||
.left dw ?
|
||||
.top dw ?
|
||||
.size:
|
||||
.width dw ?
|
||||
.height dw ?
|
||||
ends
|
||||
|
||||
struct SKIN_BITMAPS
|
||||
.kind dw ?
|
||||
.type dw ?
|
||||
.data dd ?
|
||||
ends
|
||||
|
||||
load_skin:
|
||||
pushad
|
||||
mov [_skinh],22
|
||||
mov eax,_skin_file
|
||||
mov edx,skin_data
|
||||
mov [edx+SKIN_HEADER.ident],'????'
|
||||
call load_skin_file
|
||||
cmp eax,ERROR_SUCCESS
|
||||
je @f
|
||||
cmp eax,ERROR_END_OF_FILE
|
||||
jne .exit
|
||||
@@: call parse_skin_data
|
||||
.exit:
|
||||
popad
|
||||
ret
|
||||
|
||||
parse_skin_data:
|
||||
mov ebp,skin_data
|
||||
cmp [ebp+SKIN_HEADER.ident],'SKIN'
|
||||
jne .exit
|
||||
|
||||
mov edi,skin_udata
|
||||
mov ecx,(skin_udata.end-skin_udata)/4
|
||||
xor eax,eax
|
||||
cld
|
||||
rep stosd
|
||||
|
||||
mov ebx,[ebp+SKIN_HEADER.params]
|
||||
add ebx,skin_data
|
||||
mov eax,[ebx+SKIN_PARAMS.skin_height]
|
||||
mov [_skinh],eax
|
||||
mov eax,[ebx+SKIN_PARAMS.colors.inner]
|
||||
mov [skin_active.colors.inner],eax
|
||||
mov eax,[ebx+SKIN_PARAMS.colors.outer]
|
||||
mov [skin_active.colors.outer],eax
|
||||
mov eax,[ebx+SKIN_PARAMS.colors.frame]
|
||||
mov [skin_active.colors.frame],eax
|
||||
mov eax,[ebx+SKIN_PARAMS.colors_1.inner]
|
||||
mov [skin_inactive.colors.inner],eax
|
||||
mov eax,[ebx+SKIN_PARAMS.colors_1.outer]
|
||||
mov [skin_inactive.colors.outer],eax
|
||||
mov eax,[ebx+SKIN_PARAMS.colors_1.frame]
|
||||
mov [skin_inactive.colors.frame],eax
|
||||
lea esi,[ebx+SKIN_PARAMS.dtp.data]
|
||||
mov edi,common_colours
|
||||
mov ecx,[ebx+SKIN_PARAMS.dtp.size]
|
||||
and ecx,127
|
||||
rep movsb
|
||||
mov eax,dword[ebx+SKIN_PARAMS.margin.right]
|
||||
mov dword[_skinmargins+0],eax
|
||||
mov eax,dword[ebx+SKIN_PARAMS.margin.bottom]
|
||||
mov dword[_skinmargins+4],eax
|
||||
|
||||
mov ebx,[ebp+SKIN_HEADER.bitmaps]
|
||||
add ebx,skin_data
|
||||
.lp1: cmp dword[ebx],0
|
||||
je .end_bitmaps
|
||||
movzx eax,[ebx+SKIN_BITMAPS.kind]
|
||||
movzx ecx,[ebx+SKIN_BITMAPS.type]
|
||||
dec eax
|
||||
jnz .not_left
|
||||
xor eax,eax
|
||||
mov edx,skin_active.left.data
|
||||
or ecx,ecx
|
||||
jnz @f
|
||||
mov edx,skin_inactive.left.data
|
||||
@@: jmp .next_bitmap
|
||||
.not_left:
|
||||
dec eax
|
||||
jnz .not_oper
|
||||
mov esi,[ebx+SKIN_BITMAPS.data]
|
||||
add esi,skin_data
|
||||
mov eax,[esi+0]
|
||||
neg eax
|
||||
mov edx,skin_active.oper.data
|
||||
or ecx,ecx
|
||||
jnz @f
|
||||
mov edx,skin_inactive.oper.data
|
||||
@@: jmp .next_bitmap
|
||||
.not_oper:
|
||||
dec eax
|
||||
jnz .not_base
|
||||
mov eax,[skin_active.left.width]
|
||||
mov edx,skin_active.base.data
|
||||
or ecx,ecx
|
||||
jnz @f
|
||||
mov eax,[skin_inactive.left.width]
|
||||
mov edx,skin_inactive.base.data
|
||||
@@: jmp .next_bitmap
|
||||
.not_base:
|
||||
add ebx,8
|
||||
jmp .lp1
|
||||
.next_bitmap:
|
||||
mov ecx,[ebx+SKIN_BITMAPS.data]
|
||||
add ecx,skin_data
|
||||
mov [edx+4],eax
|
||||
mov eax,[ecx+0]
|
||||
mov [edx+8],eax
|
||||
add ecx,8
|
||||
mov [edx+0],ecx
|
||||
add ebx,8
|
||||
jmp .lp1
|
||||
.end_bitmaps:
|
||||
|
||||
mov ebx,[ebp+SKIN_HEADER.buttons]
|
||||
add ebx,skin_data
|
||||
.lp2: cmp dword[ebx],0
|
||||
je .end_buttons
|
||||
mov eax,[ebx+SKIN_BUTTONS.type]
|
||||
dec eax
|
||||
jnz .not_close
|
||||
mov edx,skin_btn_close
|
||||
jmp .next_button
|
||||
.not_close:
|
||||
dec eax
|
||||
jnz .not_minimize
|
||||
mov edx,skin_btn_minimize
|
||||
jmp .next_button
|
||||
.not_minimize:
|
||||
add ebx,12
|
||||
jmp .lp2
|
||||
.next_button:
|
||||
movsx eax,[ebx+SKIN_BUTTONS.left]
|
||||
mov [edx+SKIN_BUTTON.left],eax
|
||||
movsx eax,[ebx+SKIN_BUTTONS.top]
|
||||
mov [edx+SKIN_BUTTON.top],eax
|
||||
movsx eax,[ebx+SKIN_BUTTONS.width]
|
||||
mov [edx+SKIN_BUTTON.width],eax
|
||||
movsx eax,[ebx+SKIN_BUTTONS.height]
|
||||
mov [edx+SKIN_BUTTON.height],eax
|
||||
add ebx,12
|
||||
jmp .lp2
|
||||
.end_buttons:
|
||||
|
||||
.exit:
|
||||
ret
|
||||
|
||||
sys_putimage_with_check:
|
||||
or ebx,ebx
|
||||
jz @f
|
||||
call sys_putimage
|
||||
@@: ret
|
||||
|
||||
drawwindow_IV:
|
||||
;param1 - aw_yes
|
||||
|
||||
pusha
|
||||
|
||||
push edx
|
||||
|
||||
mov edi,[esp] ; RECTANGLE
|
||||
|
||||
mov ebp,skin_active
|
||||
cmp byte [esp+32+4+4],0
|
||||
jne @f
|
||||
mov ebp,skin_inactive
|
||||
@@:
|
||||
|
||||
mov eax,[edi+0]
|
||||
shl eax,16
|
||||
mov ax,[edi+0]
|
||||
add ax,[edi+8]
|
||||
mov ebx,[edi+4]
|
||||
shl ebx,16
|
||||
mov bx,[edi+4]
|
||||
add bx,[edi+12]
|
||||
; mov esi,[edi+24]
|
||||
; shr esi,1
|
||||
; and esi,0x007f7f7f
|
||||
mov esi,[ebp+SKIN_DATA.colors.outer]
|
||||
call draw_rectangle
|
||||
mov ecx,3
|
||||
_dw3l:
|
||||
add eax,1*65536-1
|
||||
add ebx,1*65536-1
|
||||
test ax,ax
|
||||
js no_skin_add_button
|
||||
test bx,bx
|
||||
js no_skin_add_button
|
||||
mov esi,[ebp+SKIN_DATA.colors.frame] ;[edi+24]
|
||||
call draw_rectangle
|
||||
dec ecx
|
||||
jnz _dw3l
|
||||
mov esi,[ebp+SKIN_DATA.colors.inner]
|
||||
add eax,1*65536-1
|
||||
add ebx,1*65536-1
|
||||
test ax,ax
|
||||
js no_skin_add_button
|
||||
test bx,bx
|
||||
js no_skin_add_button
|
||||
call draw_rectangle
|
||||
|
||||
cmp dword[skin_data],'SKIN'
|
||||
je @f
|
||||
xor eax,eax
|
||||
xor ebx,ebx
|
||||
mov esi,[esp]
|
||||
mov ecx,[esi+8]
|
||||
inc ecx
|
||||
mov edx,[_skinh]
|
||||
mov edi,[common_colours+4] ; standard grab color
|
||||
call [drawbar]
|
||||
jmp draw_clientbar
|
||||
@@:
|
||||
|
||||
mov esi,[esp]
|
||||
mov eax,[esi+8] ; window width
|
||||
mov edx,[ebp+SKIN_DATA.left.left]
|
||||
shl edx,16
|
||||
mov ecx,[ebp+SKIN_DATA.left.width]
|
||||
shl ecx,16
|
||||
add ecx,[_skinh]
|
||||
|
||||
mov ebx, [ebp+SKIN_DATA.left.data]
|
||||
call sys_putimage_with_check
|
||||
|
||||
mov esi,[esp]
|
||||
mov eax,[esi+8]
|
||||
sub eax,[ebp+SKIN_DATA.left.width]
|
||||
sub eax,[ebp+SKIN_DATA.oper.width]
|
||||
cmp eax,[ebp+SKIN_DATA.base.left]
|
||||
jng non_base
|
||||
xor edx,edx
|
||||
mov ecx,[ebp+SKIN_DATA.base.width]
|
||||
jecxz non_base
|
||||
div ecx
|
||||
|
||||
inc eax
|
||||
|
||||
mov ebx,[ebp+SKIN_DATA.base.data]
|
||||
mov ecx,[ebp+SKIN_DATA.base.width]
|
||||
shl ecx,16
|
||||
add ecx,[_skinh]
|
||||
mov edx,[ebp+SKIN_DATA.base.left]
|
||||
sub edx,[ebp+SKIN_DATA.base.width]
|
||||
shl edx,16
|
||||
baseskinloop:
|
||||
shr edx,16
|
||||
add edx,[ebp+SKIN_DATA.base.width]
|
||||
shl edx,16
|
||||
|
||||
push eax ebx ecx edx
|
||||
call sys_putimage_with_check
|
||||
pop edx ecx ebx eax
|
||||
|
||||
dec eax
|
||||
jnz baseskinloop
|
||||
non_base:
|
||||
|
||||
mov esi,[esp]
|
||||
mov edx,[esi+8]
|
||||
sub edx,[ebp+SKIN_DATA.oper.width]
|
||||
inc edx
|
||||
shl edx,16
|
||||
mov ebx,[ebp+SKIN_DATA.oper.data]
|
||||
|
||||
mov ecx,[ebp+SKIN_DATA.oper.width]
|
||||
shl ecx,16
|
||||
add ecx,[_skinh]
|
||||
call sys_putimage_with_check
|
||||
|
||||
draw_clientbar:
|
||||
|
||||
mov esi,[esp]
|
||||
|
||||
mov edx,[esi+04] ; WORK AREA
|
||||
add edx,21+5
|
||||
mov ebx,[esi+04]
|
||||
add ebx,[esi+12]
|
||||
cmp edx,ebx
|
||||
jg _noinside2
|
||||
mov eax,5
|
||||
mov ebx,[_skinh]
|
||||
mov ecx,[esi+8]
|
||||
mov edx,[esi+12]
|
||||
sub ecx,4
|
||||
sub edx,4
|
||||
mov edi,[esi+16]
|
||||
call [drawbar]
|
||||
_noinside2:
|
||||
|
||||
cmp dword[skin_data],'SKIN'
|
||||
jne no_skin_add_button
|
||||
|
||||
;* close button
|
||||
mov edi,[0xfe88]
|
||||
movzx eax,word [edi]
|
||||
cmp eax,1000
|
||||
jge no_skin_add_button
|
||||
inc eax
|
||||
mov [edi],ax
|
||||
|
||||
shl eax,4
|
||||
add eax,edi
|
||||
|
||||
mov bx,[0x3000]
|
||||
mov [eax],bx
|
||||
|
||||
add eax,2 ; save button id number
|
||||
mov bx,1
|
||||
mov [eax],bx
|
||||
add eax,2 ; x start
|
||||
xor ebx,ebx
|
||||
cmp [skin_btn_close.left],0
|
||||
jge _bCx_at_right
|
||||
mov ebx,[esp]
|
||||
mov ebx,[ebx+8]
|
||||
inc ebx
|
||||
_bCx_at_right:
|
||||
add ebx,[skin_btn_close.left]
|
||||
mov [eax],bx
|
||||
add eax,2 ; x size
|
||||
mov ebx,[skin_btn_close.width]
|
||||
dec ebx
|
||||
mov [eax],bx
|
||||
add eax,2 ; y start
|
||||
mov ebx,[skin_btn_close.top]
|
||||
mov [eax],bx
|
||||
add eax,2 ; y size
|
||||
mov ebx,[skin_btn_close.height]
|
||||
dec ebx
|
||||
mov [eax],bx
|
||||
|
||||
;* minimize button
|
||||
mov edi,[0xfe88]
|
||||
movzx eax,word [edi]
|
||||
cmp eax,1000
|
||||
jge no_skin_add_button
|
||||
inc eax
|
||||
mov [edi],ax
|
||||
|
||||
shl eax,4
|
||||
add eax,edi
|
||||
|
||||
mov bx,[0x3000]
|
||||
mov [eax],bx
|
||||
|
||||
add eax,2 ; save button id number
|
||||
mov bx,65535 ;999
|
||||
mov [eax],bx
|
||||
add eax,2 ; x start
|
||||
xor ebx,ebx
|
||||
cmp [skin_btn_minimize.left],0
|
||||
jge _bMx_at_right
|
||||
mov ebx,[esp]
|
||||
mov ebx,[ebx+8]
|
||||
inc ebx
|
||||
_bMx_at_right:
|
||||
add ebx,[skin_btn_minimize.left]
|
||||
mov [eax],bx
|
||||
add eax,2 ; x size
|
||||
mov ebx,[skin_btn_minimize.width]
|
||||
dec ebx
|
||||
mov [eax],bx
|
||||
add eax,2 ; y start
|
||||
mov ebx,[skin_btn_minimize.top]
|
||||
mov [eax],bx
|
||||
add eax,2 ; y size
|
||||
mov ebx,[skin_btn_minimize.height]
|
||||
dec ebx
|
||||
mov [eax],bx
|
||||
|
||||
no_skin_add_button:
|
||||
|
||||
add esp,4
|
||||
popa
|
||||
|
||||
ret 4
|
||||
|
52
kernel/tags/kolibri0.5.3.0/gui/skindata.inc
Normal file
52
kernel/tags/kolibri0.5.3.0/gui/skindata.inc
Normal file
@ -0,0 +1,52 @@
|
||||
;
|
||||
; WINDOW SKIN DATA
|
||||
;
|
||||
|
||||
iglobal
|
||||
_skin_file_default db 'DEFAULT SKN',0
|
||||
endg
|
||||
|
||||
struct SKIN_DATA
|
||||
.colors.inner dd ?
|
||||
.colors.outer dd ?
|
||||
.colors.frame dd ?
|
||||
.left.data dd ?
|
||||
.left.left dd ?
|
||||
.left.width dd ?
|
||||
.oper.data dd ?
|
||||
.oper.left dd ?
|
||||
.oper.width dd ?
|
||||
.base.data dd ?
|
||||
.base.left dd ?
|
||||
.base.width dd ?
|
||||
ends
|
||||
|
||||
struct SKIN_BUTTON
|
||||
.left dd ?
|
||||
.top dd ?
|
||||
.width dd ?
|
||||
.height dd ?
|
||||
ends
|
||||
|
||||
uglobal
|
||||
|
||||
align 4
|
||||
|
||||
skin_udata:
|
||||
_skinh dd ?
|
||||
|
||||
_skinmargins rw 4
|
||||
|
||||
skin_btn_close SKIN_BUTTON
|
||||
skin_btn_minimize SKIN_BUTTON
|
||||
|
||||
skin_active SKIN_DATA
|
||||
skin_inactive SKIN_DATA
|
||||
|
||||
_skin_file rb 256
|
||||
|
||||
align 4
|
||||
|
||||
skin_udata.end:
|
||||
|
||||
endg
|
1704
kernel/tags/kolibri0.5.3.0/gui/window.inc
Normal file
1704
kernel/tags/kolibri0.5.3.0/gui/window.inc
Normal file
File diff suppressed because it is too large
Load Diff
224
kernel/tags/kolibri0.5.3.0/hid/keyboard.inc
Normal file
224
kernel/tags/kolibri0.5.3.0/hid/keyboard.inc
Normal file
@ -0,0 +1,224 @@
|
||||
;// mike.dld [
|
||||
|
||||
VKEY_LSHIFT = 0000000000000001b
|
||||
VKEY_RSHIFT = 0000000000000010b
|
||||
VKEY_LCONTROL = 0000000000000100b
|
||||
VKEY_RCONTROL = 0000000000001000b
|
||||
VKEY_LALT = 0000000000010000b
|
||||
VKEY_RALT = 0000000000100000b
|
||||
VKEY_CAPSLOCK = 0000000001000000b
|
||||
VKEY_NUMLOCK = 0000000010000000b
|
||||
VKEY_SCRLOCK = 0000000100000000b
|
||||
|
||||
VKEY_SHIFT = 0000000000000011b
|
||||
VKEY_CONTROL = 0000000000001100b
|
||||
VKEY_ALT = 0000000000110000b
|
||||
|
||||
uglobal
|
||||
align 4
|
||||
kb_state dd 0
|
||||
ext_code db 0
|
||||
|
||||
keyboard_mode db 0
|
||||
keyboard_data db 0
|
||||
|
||||
altmouseb db 0
|
||||
ctrl_alt_del db 0
|
||||
|
||||
kb_lights db 0
|
||||
endg
|
||||
|
||||
align 4
|
||||
irq1:
|
||||
save_ring3_context
|
||||
mov ax, os_data
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
|
||||
movzx eax,word[0x3004] ; top window process
|
||||
movzx eax,word[0xC400+eax*2]
|
||||
shl eax,8
|
||||
mov al,[0x800B4+eax]
|
||||
mov [keyboard_mode],al
|
||||
|
||||
in al,0x60
|
||||
mov [keyboard_data],al
|
||||
|
||||
mov ch,al
|
||||
cmp al,0xE0
|
||||
je @f
|
||||
cmp al,0xE1
|
||||
jne .normal_code
|
||||
@@: mov [ext_code],al
|
||||
jmp .no_key.end
|
||||
.normal_code:
|
||||
mov cl,[ext_code]
|
||||
mov [ext_code],0
|
||||
and al,0x7F
|
||||
@@: cmp al,0x2A
|
||||
jne @f
|
||||
cmp cl,0xE0
|
||||
je .no_key.end
|
||||
mov eax,VKEY_LSHIFT
|
||||
jmp .no_key
|
||||
@@: cmp al,0x36
|
||||
jne @f
|
||||
cmp cl,0xE0
|
||||
je .no_key.end
|
||||
mov eax,VKEY_RSHIFT
|
||||
jmp .no_key
|
||||
@@: cmp al,0x38
|
||||
jne @f
|
||||
cmp cl,0xE0
|
||||
je .alt.r
|
||||
mov eax,VKEY_LALT
|
||||
jmp .no_key
|
||||
.alt.r:
|
||||
mov eax,VKEY_RALT
|
||||
jmp .no_key
|
||||
@@: cmp al,0x1D
|
||||
jne @f
|
||||
cmp cl,0
|
||||
jne .ctrl.r
|
||||
mov eax,VKEY_LCONTROL
|
||||
jmp .no_key
|
||||
.ctrl.r:
|
||||
cmp cl,0xE1
|
||||
jne .ctrl.r.2
|
||||
mov [ext_code],cl
|
||||
jmp .no_key.end
|
||||
.ctrl.r.2:
|
||||
mov eax,VKEY_RCONTROL
|
||||
jmp .no_key
|
||||
@@: cmp al,0x3A
|
||||
jne @f
|
||||
mov bl,4
|
||||
mov eax,VKEY_CAPSLOCK
|
||||
jmp .no_key.xor
|
||||
@@: cmp al,0x45
|
||||
jne @f
|
||||
cmp cl,0
|
||||
jne .no_key.end
|
||||
mov bl,2
|
||||
mov eax,VKEY_NUMLOCK
|
||||
jmp .no_key.xor
|
||||
@@: cmp al,0x46
|
||||
jne @f
|
||||
mov bl,1
|
||||
mov eax,VKEY_SCRLOCK
|
||||
jmp .no_key.xor
|
||||
@@:
|
||||
test ch,0x80
|
||||
jnz .no_key.end
|
||||
movzx eax,ch ; plain key
|
||||
mov bl,[keymap+eax]
|
||||
mov edx,[kb_state]
|
||||
test dl,VKEY_CONTROL ; ctrl alt del
|
||||
jz .noctrlaltdel
|
||||
test dl,VKEY_ALT
|
||||
jz .noctrlaltdel
|
||||
cmp bl,134+48
|
||||
jne .noctrlaltdel
|
||||
mov [ctrl_alt_del],1
|
||||
jmp .no_key.end
|
||||
.noctrlaltdel:
|
||||
test dl,VKEY_CONTROL ; ctrl on ?
|
||||
jz @f
|
||||
sub bl,0x60
|
||||
@@: test dl,VKEY_SHIFT ; shift on ?
|
||||
jz @f
|
||||
mov bl,[keymap_shift+eax]
|
||||
@@: test dl,VKEY_ALT ; alt on ?
|
||||
jz @f
|
||||
mov bl,[keymap_alt+eax]
|
||||
; alt mouse ?
|
||||
xor edx,edx
|
||||
cmp bl,178
|
||||
jnz .no_alt.up
|
||||
mov edx,5*65536
|
||||
jmp .mouse.change
|
||||
.no_alt.up:
|
||||
cmp bl,177
|
||||
jnz .no_alt.down
|
||||
mov edx,251*65536
|
||||
jmp .mouse.change
|
||||
.no_alt.down:
|
||||
cmp bl,176
|
||||
jnz .no_alt.left
|
||||
mov edx,251*256
|
||||
jmp .mouse.change
|
||||
.no_alt.left:
|
||||
cmp bl,179
|
||||
jnz .no_alt.right
|
||||
mov edx,5*256
|
||||
jmp .mouse.change
|
||||
.no_alt.right:
|
||||
cmp bl,' '
|
||||
jne @f
|
||||
xor [altmouseb],1
|
||||
.mouse.change:
|
||||
mov byte[0xF604],1; ps2 data
|
||||
mov byte[0xFB00],0; ps2 chunk count
|
||||
mov word[0x2E0000+4096*12],3; mouse data count
|
||||
mov dl,[altmouseb]
|
||||
mov [0x2E0000+4096*12+0x10],edx
|
||||
mov bl,0
|
||||
@@:
|
||||
cmp [keyboard_mode],0 ; return from keymap
|
||||
jne .no_key.end
|
||||
mov [keyboard_mode_sys],0
|
||||
cmp bl,0
|
||||
je .no_key.end
|
||||
movzx eax,byte[0xF400]
|
||||
cmp al,120
|
||||
jae .no_key.end
|
||||
inc al
|
||||
mov [0xF400],al
|
||||
mov [0xF400+eax],bl
|
||||
|
||||
jmp .no_key.end
|
||||
|
||||
.no_key:
|
||||
test ch,0x80
|
||||
jz .no_key.down
|
||||
not eax
|
||||
and [kb_state],eax
|
||||
jmp .no_key.end
|
||||
.no_key.xor:
|
||||
test ch,0x80
|
||||
jnz .no_key.end
|
||||
xor [kb_state],eax
|
||||
xor [kb_lights],bl
|
||||
call set_lights
|
||||
jmp .no_key.end
|
||||
.no_key.down:
|
||||
or [kb_state],eax
|
||||
.no_key.end:
|
||||
cmp [keyboard_mode],1 ; return scancode
|
||||
jne .no_scancode
|
||||
mov [keyboard_mode_sys],1
|
||||
movzx eax,byte[0xF400]
|
||||
cmp al,120
|
||||
jae .no_scancode
|
||||
inc al
|
||||
mov [0xF400],al
|
||||
mov [0xF400+eax],ch
|
||||
.no_scancode:
|
||||
|
||||
.exit.irq1:
|
||||
mov [check_idle_semaphore],5
|
||||
|
||||
mov al,0x20 ; ready for next irq
|
||||
out 0x20,al
|
||||
|
||||
restore_ring3_context
|
||||
iret
|
||||
|
||||
set_lights:
|
||||
mov al,0xED
|
||||
call kb_write
|
||||
mov al,[kb_lights]
|
||||
call kb_write
|
||||
ret
|
||||
|
||||
;// mike.dld ]
|
118
kernel/tags/kolibri0.5.3.0/hid/m_com1.inc
Normal file
118
kernel/tags/kolibri0.5.3.0/hid/m_com1.inc
Normal file
@ -0,0 +1,118 @@
|
||||
; Номер принимаемого от мыши байта
|
||||
MouseByteNumber DB 0
|
||||
; Трехбайтовая структура данных, передаваемая мышью
|
||||
FirstByte DB 0
|
||||
SecondByte DB 0
|
||||
ThirdByte DB 0
|
||||
|
||||
;***************************************
|
||||
;* НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ *
|
||||
;***************************************
|
||||
check_mouse_data_com1:
|
||||
; cmp [com1_mouse_detected],0
|
||||
; je @@EndMouseInterrupt
|
||||
; Проверить наличие данных
|
||||
mov DX,3F8h ;[COMPortBaseAddr]
|
||||
add DX,5 ;xFDh
|
||||
in AL,DX
|
||||
test AL,1 ;Данные готовы?
|
||||
jz @@Error
|
||||
; Ввести данные
|
||||
mov DX,3F8h ;[COMPortBaseAddr] ;xF8h
|
||||
in AL,DX
|
||||
; Сбросить старший незначащий бит
|
||||
and AL,01111111b
|
||||
|
||||
; Определить порядковый номер принимаемого байта
|
||||
cmp [MouseByteNumber],0
|
||||
je @@FirstByte
|
||||
cmp [MouseByteNumber],1
|
||||
je @@SecondByte
|
||||
cmp [MouseByteNumber],2
|
||||
je @@ThirdByte
|
||||
jmp @@Error
|
||||
|
||||
; Сохранить первый байт данных
|
||||
@@FirstByte:
|
||||
test AL,1000000b ;Первый байт посылки?
|
||||
jz @@Error
|
||||
mov [FirstByte],AL
|
||||
inc [MouseByteNumber] ;увеличить счетчик
|
||||
jmp @@EndMouseInterrupt
|
||||
; Сохранить второй байт данных
|
||||
@@SecondByte:
|
||||
test AL,1000000b
|
||||
jnz @@Error
|
||||
mov [SecondByte],AL
|
||||
inc [MouseByteNumber] ;увеличить счетчик
|
||||
jmp @@EndMouseInterrupt
|
||||
; Сохранить третий байт данных
|
||||
@@ThirdByte:
|
||||
test AL,1000000b
|
||||
jnz @@Error
|
||||
mov [ThirdByte],AL ;увеличить счетчик
|
||||
mov [MouseByteNumber],0
|
||||
; (Пакет данных от мыши принят полностью).
|
||||
; Записать новое значение состояния кнопок мыши
|
||||
mov al,[FirstByte] ;[0xfb01]
|
||||
mov ah,al
|
||||
shr al,3
|
||||
and al,2
|
||||
shr ah,5
|
||||
and ah,1
|
||||
add al,ah
|
||||
mov [0xfb40],al
|
||||
mov [mouse_active],1
|
||||
; Прибавить перемещение по X к координате X
|
||||
mov AL,[FirstByte]
|
||||
shl AL,6
|
||||
or AL,[SecondByte]
|
||||
cbw
|
||||
shl ax,1
|
||||
add AX,[0xFB0A] ;[XCoordinate]
|
||||
; Курсор не должен выходить за левую или
|
||||
; правую границу экрана
|
||||
js @@X1
|
||||
cmp AX,[0xFE00] ;ScreenLength
|
||||
jb @@X2
|
||||
; Установить координату X по правой границе
|
||||
mov AX,[0xFE00] ;ScreenLength-1
|
||||
dec ax
|
||||
jmp @@X2
|
||||
@@X1:
|
||||
; Установить координату X по левой границе
|
||||
xor AX,AX
|
||||
@@X2:
|
||||
mov [0xFB0A],AX ;[XCoordinate]
|
||||
; Прибавить перемещение по Y к координате Y
|
||||
mov AL,[FirstByte]
|
||||
and AL,00001100b
|
||||
shl AL,4
|
||||
or AL,[ThirdByte]
|
||||
cbw
|
||||
shl ax,1
|
||||
add AX,[0xFB0C] ;[YCoordinate]
|
||||
; Курсор не должен выходить за верхнюю или
|
||||
; нижнюю границу экрана
|
||||
js @@Y1
|
||||
cmp AX,[0xFE04] ;ScreenHeigth
|
||||
jb @@Y2
|
||||
; Установить координату X по нижней границе
|
||||
mov AX,[0xFE04] ;ScreenHeigth-1
|
||||
dec ax
|
||||
jmp @@Y2
|
||||
@@Y1:
|
||||
; Установить координату X по верхней границе
|
||||
xor AX,AX
|
||||
@@Y2:
|
||||
mov [0xFB0C],AX ;[YCoordinate]
|
||||
jmp @@EndMouseInterrupt
|
||||
|
||||
@@Error:
|
||||
; Произошел сбой в порядке передачи информации от
|
||||
; мыши, обнулить счетчик байтов пакета данных
|
||||
mov [MouseByteNumber],0
|
||||
@@EndMouseInterrupt:
|
||||
call ready_for_next_irq
|
||||
ret
|
||||
|
118
kernel/tags/kolibri0.5.3.0/hid/m_com2.inc
Normal file
118
kernel/tags/kolibri0.5.3.0/hid/m_com2.inc
Normal file
@ -0,0 +1,118 @@
|
||||
; Номер принимаемого от мыши байта
|
||||
MouseByteNumber_1 DB 0
|
||||
; Трехбайтовая структура данных, передаваемая мышью
|
||||
FirstByte_1 DB 0
|
||||
SecondByte_1 DB 0
|
||||
ThirdByte_1 DB 0
|
||||
|
||||
;***************************************
|
||||
;* НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ *
|
||||
;***************************************
|
||||
check_mouse_data_com2:
|
||||
; cmp [com2_mouse_detected],0
|
||||
; je @@EndMouseInterrupt_1
|
||||
; Проверить наличие данных
|
||||
mov DX,2F8h ;[COMPortBaseAddr]
|
||||
add DX,5 ;xFDh
|
||||
in AL,DX
|
||||
test AL,1 ;Данные готовы?
|
||||
jz @@Error_1
|
||||
; Ввести данные
|
||||
mov DX,2F8h ;[COMPortBaseAddr] ;xF8h
|
||||
in AL,DX
|
||||
; Сбросить старший незначащий бит
|
||||
and AL,01111111b
|
||||
|
||||
; Определить порядковый номер принимаемого байта
|
||||
cmp [MouseByteNumber_1],0
|
||||
je @@FirstByte_1
|
||||
cmp [MouseByteNumber_1],1
|
||||
je @@SecondByte_1
|
||||
cmp [MouseByteNumber_1],2
|
||||
je @@ThirdByte_1
|
||||
jmp @@Error_1
|
||||
|
||||
; Сохранить первый байт данных
|
||||
@@FirstByte_1:
|
||||
test AL,1000000b ;Первый байт посылки?
|
||||
jz @@Error_1
|
||||
mov [FirstByte_1],AL
|
||||
inc [MouseByteNumber_1] ;увеличить счетчик
|
||||
jmp @@EndMouseInterrupt_1
|
||||
; Сохранить второй байт данных
|
||||
@@SecondByte_1:
|
||||
test AL,1000000b
|
||||
jnz @@Error_1
|
||||
mov [SecondByte_1],AL
|
||||
inc [MouseByteNumber_1] ;увеличить счетчик
|
||||
jmp @@EndMouseInterrupt_1
|
||||
; Сохранить третий байт данных
|
||||
@@ThirdByte_1:
|
||||
test AL,1000000b
|
||||
jnz @@Error_1
|
||||
mov [ThirdByte_1],AL ;увеличить счетчик
|
||||
mov [MouseByteNumber_1],0
|
||||
; (Пакет данных от мыши принят полностью).
|
||||
; Записать новое значение состояния кнопок мыши
|
||||
mov al,[FirstByte_1] ;[0xfb01]
|
||||
mov ah,al
|
||||
shr al,3
|
||||
and al,2
|
||||
shr ah,5
|
||||
and ah,1
|
||||
add al,ah
|
||||
mov [0xfb40],al
|
||||
mov [mouse_active],1
|
||||
; Прибавить перемещение по X к координате X
|
||||
mov AL,[FirstByte_1]
|
||||
shl AL,6
|
||||
or AL,[SecondByte_1]
|
||||
cbw
|
||||
shl ax,1
|
||||
add AX,[0xFB0A] ;[XCoordinate]
|
||||
; Курсор не должен выходить за левую или
|
||||
; правую границу экрана
|
||||
js @@X1_1
|
||||
cmp AX,[0xFE00] ;ScreenLength
|
||||
jb @@X2_1
|
||||
; Установить координату X по правой границе
|
||||
mov AX,[0xFE00] ;ScreenLength-1
|
||||
dec ax
|
||||
jmp @@X2_1
|
||||
@@X1_1:
|
||||
; Установить координату X по левой границе
|
||||
xor AX,AX
|
||||
@@X2_1:
|
||||
mov [0xFB0A],AX ;[XCoordinate]
|
||||
; Прибавить перемещение по Y к координате Y
|
||||
mov AL,[FirstByte_1]
|
||||
and AL,00001100b
|
||||
shl AL,4
|
||||
or AL,[ThirdByte_1]
|
||||
cbw
|
||||
shl ax,1
|
||||
add AX,[0xFB0C] ;[YCoordinate]
|
||||
; Курсор не должен выходить за верхнюю или
|
||||
; нижнюю границу экрана
|
||||
js @@Y1_1
|
||||
cmp AX,[0xFE04] ;ScreenHeigth
|
||||
jb @@Y2_1
|
||||
; Установить координату X по нижней границе
|
||||
mov AX,[0xFE04] ;ScreenHeigth-1
|
||||
dec ax
|
||||
jmp @@Y2_1
|
||||
@@Y1_1:
|
||||
; Установить координату X по верхней границе
|
||||
xor AX,AX
|
||||
@@Y2_1:
|
||||
mov [0xFB0C],AX ;[YCoordinate]
|
||||
jmp @@EndMouseInterrupt_1
|
||||
|
||||
@@Error_1:
|
||||
; Произошел сбой в порядке передачи информации от
|
||||
; мыши, обнулить счетчик байтов пакета данных
|
||||
mov [MouseByteNumber_1],0
|
||||
@@EndMouseInterrupt_1:
|
||||
call ready_for_next_irq
|
||||
ret
|
||||
|
157
kernel/tags/kolibri0.5.3.0/hid/m_ps2.inc
Normal file
157
kernel/tags/kolibri0.5.3.0/hid/m_ps2.inc
Normal file
@ -0,0 +1,157 @@
|
||||
; Номер принимаемого от мыши байта
|
||||
MouseByteNumber_2 DB 0
|
||||
; Трехбайтовая структура данных, передаваемая мышью
|
||||
FirstByte_2 DB 0
|
||||
SecondByte_2 DB 0
|
||||
ThirdByte_2 DB 0
|
||||
|
||||
;**************************************
|
||||
;* ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ PS/2 *
|
||||
;**************************************
|
||||
check_mouse_data_ps2:
|
||||
cmp [ps2_mouse_detected],0
|
||||
je @@EndMouseInterrupt_2
|
||||
call Wait8042BufferEmpty ;очистка буфера
|
||||
in AL,0x60 ;получить скэн-код
|
||||
; Выбирать порядковый номер принимаемого байта
|
||||
cmp [MouseByteNumber_2],0
|
||||
je @@SaveFirstByte
|
||||
cmp [MouseByteNumber_2],1
|
||||
je @@SaveSecondByte
|
||||
cmp [MouseByteNumber_2],2
|
||||
je @@SaveThirdByte
|
||||
jmp @@Error_2
|
||||
; Записать первый байт посылки
|
||||
@@SaveFirstByte:
|
||||
test AL,1000b ;первый байт посылки?
|
||||
jz @@Error_2 ;сбой синхронизации
|
||||
mov [FirstByte_2],AL
|
||||
inc [MouseByteNumber_2]
|
||||
jmp @@EndMouseInterrupt_2
|
||||
; Записать второй байт посылки
|
||||
@@SaveSecondByte:
|
||||
mov [SecondByte_2],AL
|
||||
inc [MouseByteNumber_2]
|
||||
jmp @@EndMouseInterrupt_2
|
||||
; Записать третий байт посылки
|
||||
@@SaveThirdByte:
|
||||
mov [ThirdByte_2],AL
|
||||
mov [MouseByteNumber_2],0
|
||||
; (пакет данных от мыши принят полностью)
|
||||
; Записать новое значение байта состояния кнопок
|
||||
mov al,[FirstByte_2] ;[0xfb01]
|
||||
and eax,3
|
||||
mov [0xfb40],al
|
||||
mov [mouse_active],1
|
||||
; Вычислить новую X-координату курсора
|
||||
; Занести в AX перемещение по X
|
||||
mov AH,0 ;дублируем знак во все разряды AH
|
||||
mov AL,[FirstByte_2]
|
||||
test AL,10000b
|
||||
jz @@M0
|
||||
mov AH,0FFh
|
||||
; Занести в AL младший байт
|
||||
@@M0:
|
||||
mov AL,[SecondByte_2]
|
||||
shl ax,1
|
||||
; Вычислить новое значение координаты
|
||||
; курсора по X
|
||||
add AX,[0xFB0A] ;[XCoordinate]
|
||||
cmp AX,0
|
||||
jge @@M1
|
||||
mov AX,0
|
||||
jmp @@M2
|
||||
@@M1:
|
||||
cmp AX,[0xFE00] ;ScreenLength
|
||||
jl @@M2
|
||||
mov AX,[0xFE00] ;ScreenLength-1
|
||||
dec ax
|
||||
@@M2:
|
||||
mov [0xFB0A],AX ;[XCoordinate]
|
||||
|
||||
; Вычисляем новую Y-координату курсора
|
||||
; Занести в AX перемещение по Y
|
||||
mov AH,0 ;дублируем знак во все разряды AH
|
||||
mov AL,[FirstByte_2]
|
||||
test AL,100000b
|
||||
jz @@M3
|
||||
mov AH,0FFh
|
||||
; Занести в AL младший байт
|
||||
@@M3:
|
||||
mov AL,[ThirdByte_2]
|
||||
shl ax,1
|
||||
; Вычислить новое значение координаты курсора
|
||||
; по Y (Y-координата мыши PS/2 направлена
|
||||
; противоположно экранной)
|
||||
neg AX
|
||||
add AX,[0xFB0C] ;[YCoordinate]
|
||||
cmp AX,0
|
||||
jge @@M4
|
||||
mov AX,0
|
||||
jmp @@M5
|
||||
@@M4:
|
||||
cmp AX,[0xFE04] ;ScreenHeigth
|
||||
jl @@M5
|
||||
mov AX,[0xFE04] ;ScreenHeigth-1
|
||||
dec ax
|
||||
@@M5:
|
||||
mov [0xFB0C],AX ;[YCoordinate]
|
||||
|
||||
; Показать курсор в новой позиции
|
||||
jmp @@EndMouseInterrupt_2
|
||||
|
||||
; Обнаружен сбой в порядке передачи информации от мыши
|
||||
@@Error_2:
|
||||
mov [MouseByteNumber_2],0
|
||||
; Нормальное завершение прерывания
|
||||
@@EndMouseInterrupt_2:
|
||||
call ready_for_next_irq_1
|
||||
ret
|
||||
|
||||
;***********************************************
|
||||
;* ОЖИДАНИЕ ОЧИСТКИ ВХОДНОГО БУФЕРА I8042 *
|
||||
;* При выходе из процедуры: *
|
||||
;* флаг ZF установлен - нормальное завершение, *
|
||||
;* флаг ZF сброшен - ошибка тайм-аута. *
|
||||
;***********************************************
|
||||
Wait8042BufferEmpty:
|
||||
; push CX
|
||||
; mov CX,0FFFFh ;задать число циклов ожидания
|
||||
;@@kb:
|
||||
; in AL,64h ;получить статус
|
||||
; test AL,10b ;буфер i8042 свободен?
|
||||
; loopnz @@kb ;если нет, то цикл
|
||||
; pop CX
|
||||
push ecx
|
||||
xor ecx,ecx
|
||||
@@:
|
||||
in al,64h
|
||||
test al,00000010b
|
||||
loopnz @b
|
||||
pop ecx
|
||||
;Если при выходе из подпрограммы сброшен
|
||||
;флаг ZF - ошибка
|
||||
ret ;возврат в подпрограмму
|
||||
|
||||
;***************************************
|
||||
;* ОЖИДАНИЕ ПОСТУПЛЕНИЯ ДАННЫХ ОТ МЫШИ *
|
||||
;***************************************
|
||||
WaitMouseData:
|
||||
; push CX
|
||||
; mov CX,0FFFFh ;задать число циклов ожидания
|
||||
;@@mouse:
|
||||
; in AL,64h ;опросить регистр статуса
|
||||
; test AL,100000b ;данные поступили?
|
||||
; loopz @@mouse ;если нет, то цикл
|
||||
; pop CX
|
||||
push ecx
|
||||
mov ECX,0FFFFh
|
||||
@@:
|
||||
in al,64h
|
||||
test al,100000b
|
||||
loopz @b
|
||||
pop ecx
|
||||
;Если при выходе из подпрограммы установлен
|
||||
;флаг ZF - ошибка
|
||||
ret
|
||||
|
423
kernel/tags/kolibri0.5.3.0/hid/mousedrv.inc
Normal file
423
kernel/tags/kolibri0.5.3.0/hid/mousedrv.inc
Normal file
@ -0,0 +1,423 @@
|
||||
; check mouse
|
||||
;
|
||||
;
|
||||
; FB00 -> FB0F mouse memory 00 chunk count - FB0A-B x - FB0C-D y
|
||||
; FB10 -> FB17 mouse color mem
|
||||
; FB21 x move
|
||||
; FB22 y move
|
||||
; FB30 color temp
|
||||
; FB28 high bits temp
|
||||
; FB4A -> FB4D FB4A-B x-under - FB4C-D y-under
|
||||
; FC00 -> FCFE com1/ps2 buffer
|
||||
; FCFF com1/ps2 buffer count starting from FC00
|
||||
|
||||
uglobal
|
||||
mousecount dd 0x0
|
||||
mousedata dd 0x0
|
||||
endg
|
||||
|
||||
include 'm_ps2.inc'
|
||||
include 'm_com1.inc'
|
||||
include 'm_com2.inc'
|
||||
|
||||
|
||||
;test_mario79:
|
||||
; push esi
|
||||
; push eax
|
||||
; mov [write_error_to],process_test_m79+43
|
||||
; movzx eax,al ;[DevErrorCode]
|
||||
; call writehex
|
||||
; mov esi,process_test_m79
|
||||
; call sys_msg_board_str
|
||||
; pop eax
|
||||
; pop esi
|
||||
; ret
|
||||
;process_test_m79 db 'K : Process - test Mario79 error 00000000',13,10,0
|
||||
|
||||
draw_mouse_under:
|
||||
|
||||
; return old picture
|
||||
|
||||
pushad
|
||||
|
||||
xor ecx,ecx
|
||||
xor edx,edx
|
||||
|
||||
;cli ; !!!****
|
||||
align 4
|
||||
mres:
|
||||
|
||||
movzx eax,word [0xfb4a]
|
||||
movzx ebx,word [0xfb4c]
|
||||
|
||||
add eax,ecx
|
||||
add ebx,edx
|
||||
|
||||
push ecx
|
||||
push edx
|
||||
push eax
|
||||
push ebx
|
||||
|
||||
mov eax,edx
|
||||
shl eax,6
|
||||
shl ecx,2
|
||||
add eax,ecx
|
||||
add eax,mouseunder
|
||||
mov ecx,[eax]
|
||||
|
||||
pop ebx
|
||||
pop eax
|
||||
|
||||
;;;push edi
|
||||
mov edi, 1 ;force
|
||||
call [putpixel]
|
||||
;;;pop edi
|
||||
|
||||
pop edx
|
||||
pop ecx
|
||||
|
||||
inc ecx
|
||||
cmp ecx, 16
|
||||
jnz mres
|
||||
xor ecx, ecx
|
||||
inc edx
|
||||
cmp edx, 24
|
||||
jnz mres
|
||||
;sti ; !!!****
|
||||
|
||||
popad
|
||||
|
||||
ret
|
||||
|
||||
save_draw_mouse:
|
||||
pushad
|
||||
; save & draw
|
||||
|
||||
mov [0xfb4a],ax
|
||||
mov [0xfb4c],bx
|
||||
push eax
|
||||
push ebx
|
||||
mov ecx,0
|
||||
mov edx,0
|
||||
|
||||
;cli ; !!!****
|
||||
align 4
|
||||
drm:
|
||||
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
|
||||
; helloworld
|
||||
push ecx
|
||||
; push eax ebx ecx
|
||||
add eax,ecx ; save picture under mouse
|
||||
add ebx,edx
|
||||
push ecx
|
||||
call getpixel
|
||||
mov [0xfb30],ecx
|
||||
pop ecx
|
||||
mov eax,edx
|
||||
shl eax,6
|
||||
shl ecx,2
|
||||
add eax,ecx
|
||||
add eax,mouseunder
|
||||
mov ebx,[0xfb30]
|
||||
mov [eax],ebx
|
||||
; pop ecx ebx eax
|
||||
pop ecx
|
||||
|
||||
mov edi,edx ; y cycle
|
||||
shl edi,4 ; *16 bytes per row
|
||||
add edi,ecx ; x cycle
|
||||
mov esi, edi
|
||||
add edi, esi
|
||||
add edi, esi ; *3
|
||||
add edi,[0xf200] ; we have our str address
|
||||
mov esi, edi
|
||||
add esi, 16*24*3
|
||||
push ecx
|
||||
mov ecx, [0xfb30]
|
||||
call combine_colors
|
||||
mov [0xfb10], ecx
|
||||
pop ecx
|
||||
|
||||
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
|
||||
add eax,ecx ; we have x coord+cycle
|
||||
add ebx,edx ; and y coord+cycle
|
||||
|
||||
; push ecx edi
|
||||
push ecx
|
||||
mov ecx, [0xfb10]
|
||||
mov edi, 1
|
||||
call [putpixel]
|
||||
pop ecx
|
||||
; pop edi ecx
|
||||
|
||||
; mnext:
|
||||
|
||||
mov ebx,[esp+0] ; pure y coord again
|
||||
mov eax,[esp+4] ; and x
|
||||
|
||||
inc ecx ; +1 cycle
|
||||
cmp ecx,16 ; if more than 16
|
||||
jnz drm
|
||||
xor ecx, ecx
|
||||
inc edx
|
||||
cmp edx,24
|
||||
jnz drm
|
||||
|
||||
pop ebx
|
||||
pop eax
|
||||
|
||||
;sti ; !!!****
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
combine_colors:
|
||||
|
||||
; in
|
||||
; ecx - color ( 00 RR GG BB )
|
||||
; edi - ref to new color byte
|
||||
; esi - ref to alpha byte
|
||||
;
|
||||
; out
|
||||
; ecx - new color ( roughly (ecx*[esi]>>8)+([edi]*[esi]>>8) )
|
||||
|
||||
push eax
|
||||
push ebx
|
||||
push edx
|
||||
push ecx
|
||||
xor ecx, ecx
|
||||
; byte 2
|
||||
mov eax, 0xff
|
||||
sub al, [esi+0]
|
||||
mov ebx, [esp]
|
||||
shr ebx, 16
|
||||
and ebx, 0xff
|
||||
mul ebx
|
||||
shr eax, 8
|
||||
add ecx, eax
|
||||
; xor eax, eax
|
||||
; xor ebx, ebx
|
||||
; mov al, [edi+0]
|
||||
; mov bl, [esi+0]
|
||||
movzx eax, byte [edi+0]
|
||||
movzx ebx, byte [esi+0]
|
||||
mul ebx
|
||||
shr eax, 8
|
||||
add ecx, eax
|
||||
shl ecx, 8
|
||||
; byte 1
|
||||
mov eax, 0xff
|
||||
sub al, [esi+1]
|
||||
mov ebx, [esp]
|
||||
shr ebx, 8
|
||||
and ebx, 0xff
|
||||
mul ebx
|
||||
shr eax, 8
|
||||
add ecx, eax
|
||||
; xor eax, eax
|
||||
; xor ebx, ebx
|
||||
; mov al, [edi+1]
|
||||
; mov bl, [esi+1]
|
||||
movzx eax, byte [edi+1]
|
||||
movzx ebx, byte [esi+1]
|
||||
mul ebx
|
||||
shr eax, 8
|
||||
add ecx, eax
|
||||
shl ecx, 8
|
||||
; byte 2
|
||||
mov eax, 0xff
|
||||
sub al, [esi+2]
|
||||
mov ebx, [esp]
|
||||
and ebx, 0xff
|
||||
mul ebx
|
||||
shr eax, 8
|
||||
add ecx, eax
|
||||
; xor eax, eax
|
||||
; xor ebx, ebx
|
||||
; mov al, [edi+2]
|
||||
; mov bl, [esi+2]
|
||||
movzx eax, byte [edi+2]
|
||||
movzx ebx, byte [esi+2]
|
||||
mul ebx
|
||||
shr eax, 8
|
||||
add ecx, eax
|
||||
|
||||
pop eax
|
||||
pop edx
|
||||
pop ebx
|
||||
pop eax
|
||||
ret
|
||||
|
||||
|
||||
__sys_disable_mouse:
|
||||
|
||||
|
||||
cmp dword [0xf204],dword 0
|
||||
je @f
|
||||
ret
|
||||
@@:
|
||||
; cli
|
||||
pushad
|
||||
|
||||
cmp [0x3000],dword 1
|
||||
je disable_m
|
||||
|
||||
mov edx,[0x3000]
|
||||
shl edx,5
|
||||
add edx,window_data
|
||||
|
||||
movzx eax, word [0xfb0a]
|
||||
movzx ebx, word [0xfb0c]
|
||||
|
||||
mov ecx,[0xfe00]
|
||||
inc ecx
|
||||
imul ecx,ebx
|
||||
add ecx,eax
|
||||
add ecx, display_data
|
||||
|
||||
movzx eax, byte [edx+twdw+0xe]
|
||||
|
||||
movzx ebx, byte [ecx]
|
||||
cmp eax,ebx
|
||||
je yes_mouse_disable
|
||||
movzx ebx, byte [ecx+16]
|
||||
cmp eax,ebx
|
||||
je yes_mouse_disable
|
||||
|
||||
; mov ebx,[0xfe00]
|
||||
; inc ebx
|
||||
; imul ebx,10
|
||||
; add ecx,ebx
|
||||
; movzx ebx, byte [ecx]
|
||||
; cmp eax,ebx
|
||||
; je yes_mouse_disable
|
||||
|
||||
mov ebx,[0xfe00]
|
||||
inc ebx
|
||||
imul ebx,10
|
||||
add ecx,ebx
|
||||
movzx ebx, byte [ecx]
|
||||
cmp eax,ebx
|
||||
je yes_mouse_disable
|
||||
|
||||
movzx ebx, byte [ecx+16]
|
||||
cmp eax,ebx
|
||||
je yes_mouse_disable
|
||||
|
||||
jmp no_mouse_disable
|
||||
|
||||
yes_mouse_disable:
|
||||
|
||||
mov edx,[0x3000]
|
||||
shl edx,5
|
||||
add edx,window_data
|
||||
|
||||
movzx eax, word [0xfb0a]
|
||||
movzx ebx, word [0xfb0c]
|
||||
|
||||
mov ecx,[edx+0] ; mouse inside the area ?
|
||||
add eax,14
|
||||
cmp eax,ecx
|
||||
jb no_mouse_disable
|
||||
sub eax,14
|
||||
|
||||
add ecx,[edx+8]
|
||||
cmp eax,ecx
|
||||
jg no_mouse_disable
|
||||
|
||||
mov ecx,[edx+4]
|
||||
add ebx,20
|
||||
cmp ebx,ecx
|
||||
jb no_mouse_disable
|
||||
sub ebx,20
|
||||
|
||||
add ecx,[edx+12]
|
||||
cmp ebx,ecx
|
||||
jg no_mouse_disable
|
||||
|
||||
disable_m:
|
||||
cmp dword [0xf204],dword 0
|
||||
jne @f
|
||||
cli
|
||||
call draw_mouse_under
|
||||
sti
|
||||
; @@:
|
||||
mov [0xf204],dword 1
|
||||
; inc dword [0xf204]
|
||||
@@:
|
||||
|
||||
no_mouse_disable:
|
||||
|
||||
popad
|
||||
; sti
|
||||
ret
|
||||
|
||||
__sys_draw_pointer:
|
||||
|
||||
cmp [mouse_pause],0
|
||||
je @f
|
||||
ret
|
||||
@@:
|
||||
push eax
|
||||
mov eax,[timer_ticks]
|
||||
sub eax,[MouseTickCounter]
|
||||
cmp eax,1
|
||||
ja @f
|
||||
pop eax
|
||||
ret
|
||||
@@:
|
||||
mov eax,[timer_ticks]
|
||||
mov [MouseTickCounter],eax
|
||||
pop eax
|
||||
; cli
|
||||
|
||||
pushad
|
||||
cmp dword [0xf204],dword 0 ; mouse visible ?
|
||||
je chms00
|
||||
|
||||
mov [0xf204], dword 0
|
||||
movzx ebx,word [0xfb0c]
|
||||
movzx eax,word [0xfb0a]
|
||||
cli
|
||||
call save_draw_mouse
|
||||
sti
|
||||
nodmu2:
|
||||
popad
|
||||
|
||||
ret
|
||||
|
||||
chms00:
|
||||
|
||||
movzx ecx,word [0xfb4a]
|
||||
movzx edx,word [0xfb4c]
|
||||
|
||||
movzx ebx,word [0xfb0c]
|
||||
movzx eax,word [0xfb0a]
|
||||
|
||||
cmp eax,ecx
|
||||
jne redrawmouse
|
||||
|
||||
cmp ebx,edx
|
||||
jne redrawmouse
|
||||
|
||||
jmp nodmp
|
||||
|
||||
redrawmouse:
|
||||
cli
|
||||
call draw_mouse_under
|
||||
call save_draw_mouse
|
||||
sti
|
||||
nodmp:
|
||||
popad
|
||||
; sti
|
||||
ret
|
191
kernel/tags/kolibri0.5.3.0/hid/set_dtc.inc
Normal file
191
kernel/tags/kolibri0.5.3.0/hid/set_dtc.inc
Normal file
@ -0,0 +1,191 @@
|
||||
;setting date,time,clock and alarm-clock
|
||||
;add sys_settime at servetable as for ex. 22 fcn:
|
||||
; 22 - SETTING DATE TIME, CLOCK AND ALARM-CLOCK
|
||||
; ebx =0 - set time ecx - 00SSMMHH
|
||||
; ebx =1 - set date ecx=00DDMMYY
|
||||
; ebx =2 - set day of week ecx- 1-7
|
||||
; ebx =3 - set alarm-clock ecx - 00SSMMHH
|
||||
; out: 0 -Ok 1 -wrong format 2 -battery low
|
||||
sys_settime:
|
||||
mov ecx,eax
|
||||
cli
|
||||
mov al,0x0d
|
||||
out 0x70,al
|
||||
in al,0x71
|
||||
bt ax,7
|
||||
jnc bat_low
|
||||
cmp ecx,2 ;day of week
|
||||
jne nosetweek
|
||||
test ebx,ebx ;test day of week
|
||||
je wrongtime
|
||||
cmp ebx,7
|
||||
ja wrongtime
|
||||
mov dx,0x70
|
||||
call startstopclk
|
||||
dec edx
|
||||
mov al,6
|
||||
out dx,al
|
||||
inc edx
|
||||
mov al,bl
|
||||
out dx,al
|
||||
jmp endsettime
|
||||
nosetweek: ;set date
|
||||
cmp ecx,1
|
||||
jne nosetdate
|
||||
cmp bl,0x99 ;test year
|
||||
ja wrongtime
|
||||
shl ebx,4
|
||||
cmp bl,0x90
|
||||
ja wrongtime
|
||||
cmp bh,0x99 ;test month
|
||||
ja wrongtime
|
||||
shr ebx,4
|
||||
test bh,bh
|
||||
je wrongtime
|
||||
cmp bh,0x12
|
||||
ja wrongtime
|
||||
shl ebx,8
|
||||
bswap ebx ;ebx=00YYMMDD
|
||||
test bl,bl ;test day
|
||||
je wrongtime
|
||||
shl ebx,4
|
||||
cmp bl,0x90
|
||||
ja wrongtime
|
||||
shr ebx,4
|
||||
cmp bh,2 ;February
|
||||
jne testday
|
||||
cmp bl,0x29
|
||||
ja wrongtime
|
||||
jmp setdate
|
||||
testday:
|
||||
cmp bh,8
|
||||
jb testday1 ;Aug-Dec
|
||||
bt bx,8
|
||||
jnc days31
|
||||
jmp days30
|
||||
testday1:
|
||||
bt bx,8 ;Jan-Jul ex.Feb
|
||||
jnc days30
|
||||
days31:
|
||||
cmp bl,0x31
|
||||
ja wrongtime
|
||||
jmp setdate
|
||||
days30:
|
||||
cmp bl,0x30
|
||||
ja wrongtime
|
||||
setdate:
|
||||
mov dx,0x70
|
||||
call startstopclk
|
||||
dec edx
|
||||
mov al,7 ;set days
|
||||
out dx,al
|
||||
inc edx
|
||||
mov al,bl
|
||||
out dx,al
|
||||
dec edx
|
||||
mov al,8 ;set months
|
||||
out dx,al
|
||||
inc edx
|
||||
mov al,bh
|
||||
out dx,al
|
||||
dec edx
|
||||
mov al,9 ;set years
|
||||
out dx,al
|
||||
inc edx
|
||||
shr ebx,8
|
||||
mov al,bh
|
||||
out dx,al
|
||||
jmp endsettime
|
||||
nosetdate: ;set time or alarm-clock
|
||||
cmp ecx,3
|
||||
ja wrongtime
|
||||
cmp bl,0x23
|
||||
ja wrongtime
|
||||
cmp bh,0x59
|
||||
ja wrongtime
|
||||
shl ebx,4
|
||||
cmp bl,0x90
|
||||
ja wrongtime
|
||||
cmp bh,0x92
|
||||
ja wrongtime
|
||||
shl ebx,4
|
||||
bswap ebx ;00HHMMSS
|
||||
cmp bl,0x59
|
||||
ja wrongtime
|
||||
shl ebx,4
|
||||
cmp bl,0x90
|
||||
ja wrongtime
|
||||
shr ebx,4
|
||||
mov dx,0x70
|
||||
call startstopclk
|
||||
dec edx
|
||||
cmp ecx,3
|
||||
je setalarm
|
||||
xor eax,eax ;al=0-set seconds
|
||||
out dx,al
|
||||
inc edx
|
||||
mov al,bl
|
||||
out dx,al
|
||||
dec edx
|
||||
mov al,2 ;set minutes
|
||||
out dx,al
|
||||
inc edx
|
||||
mov al,bh
|
||||
out dx,al
|
||||
dec edx
|
||||
mov al,4 ;set hours
|
||||
out dx,al
|
||||
inc edx
|
||||
shr ebx,8
|
||||
mov al,bh
|
||||
out dx,al
|
||||
jmp endsettime
|
||||
setalarm:
|
||||
mov al,1 ;set seconds for al.
|
||||
out dx,al
|
||||
inc edx
|
||||
mov al,bl
|
||||
out dx,al
|
||||
dec edx
|
||||
mov al,3 ;set minutes for al.
|
||||
out dx,al
|
||||
inc edx
|
||||
mov al,bh
|
||||
out dx,al
|
||||
dec edx
|
||||
mov al,5 ;set hours for al.
|
||||
out dx,al
|
||||
inc edx
|
||||
shr ebx,8
|
||||
mov al,bh
|
||||
out dx,al
|
||||
dec edx
|
||||
mov al,0x0b ;enable irq's
|
||||
out dx,al
|
||||
inc dx
|
||||
in al,dx
|
||||
bts ax,5 ;set bit 5
|
||||
out dx,al
|
||||
endsettime:
|
||||
dec edx
|
||||
call startstopclk
|
||||
sti
|
||||
mov [esp+36],dword 0
|
||||
ret
|
||||
bat_low:
|
||||
sti
|
||||
mov [esp+36],dword 2
|
||||
ret
|
||||
wrongtime:
|
||||
sti
|
||||
mov [esp+36],dword 1
|
||||
ret
|
||||
|
||||
startstopclk:
|
||||
mov al,0x0b
|
||||
out dx,al
|
||||
inc dx
|
||||
in al,dx
|
||||
btc ax,7
|
||||
out dx,al
|
||||
ret
|
5032
kernel/tags/kolibri0.5.3.0/kernel.asm
Normal file
5032
kernel/tags/kolibri0.5.3.0/kernel.asm
Normal file
File diff suppressed because it is too large
Load Diff
31
kernel/tags/kolibri0.5.3.0/kernel16.inc
Normal file
31
kernel/tags/kolibri0.5.3.0/kernel16.inc
Normal file
@ -0,0 +1,31 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; KERNEL16.INC ;;
|
||||
;; ;;
|
||||
;; Included 16 bit kernel files for MenuetOS ;;
|
||||
;; ;;
|
||||
;; This file is kept separate as it will be easier to ;;
|
||||
;; maintain and compile with an automated SETUP program ;;
|
||||
;; in the future. ;;
|
||||
;; ;;
|
||||
;; Copyright Ville Turjanmaa, see file COPYING for details. ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
;% +include
|
||||
|
||||
;!!!
|
||||
if lang eq en
|
||||
include "boot/booteng.inc" ; english system boot messages
|
||||
else
|
||||
include "boot/bootru.inc" ; russian system boot messages
|
||||
;!!!
|
||||
end if
|
||||
include "boot/ru.inc" ; Russian font
|
||||
|
||||
include "boot/bootcode.inc" ; 16 bit system boot code
|
||||
|
||||
include "bus/pci/pci16.inc"
|
||||
|
||||
;% -include
|
198
kernel/tags/kolibri0.5.3.0/kernel32.inc
Normal file
198
kernel/tags/kolibri0.5.3.0/kernel32.inc
Normal file
@ -0,0 +1,198 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; KERNEL32.INC ;;
|
||||
;; ;;
|
||||
;; Included 32 bit kernel files for MenuetOS ;;
|
||||
;; ;;
|
||||
;; This file is kept separate as it will be easier to ;;
|
||||
;; maintain and compile with an automated SETUP program ;;
|
||||
;; in the future. ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; structure definition helper
|
||||
macro struct name, [arg]
|
||||
{
|
||||
common
|
||||
name@struct equ name
|
||||
struc name arg {
|
||||
}
|
||||
|
||||
macro struct_helper name
|
||||
{
|
||||
match xname,name
|
||||
\{
|
||||
virtual at 0
|
||||
xname xname
|
||||
sizeof.#xname = $ - xname
|
||||
name equ sizeof.#xname
|
||||
end virtual
|
||||
\}
|
||||
}
|
||||
|
||||
ends fix } struct_helper name@struct
|
||||
|
||||
;// mike.dld, 2006-29-01 [
|
||||
|
||||
; macros definition
|
||||
macro diff16 title,l1,l2
|
||||
{
|
||||
local s,d
|
||||
s = l2-l1
|
||||
display title,': 0x'
|
||||
repeat 8
|
||||
d = 48 + s shr ((8-%) shl 2) and $0F
|
||||
if d > 57
|
||||
d = d + 65-57-1
|
||||
end if
|
||||
display d
|
||||
end repeat
|
||||
display 13,10
|
||||
}
|
||||
|
||||
struc db [a] { common . db a
|
||||
if ~used .
|
||||
display 'not used db: ',`.,13,10
|
||||
end if }
|
||||
struc dw [a] { common . dw a
|
||||
if ~used .
|
||||
display 'not used dw: ',`.,13,10
|
||||
end if }
|
||||
struc dd [a] { common . dd a
|
||||
if ~used .
|
||||
display 'not used dd: ',`.,13,10
|
||||
end if }
|
||||
struc dp [a] { common . dp a
|
||||
if ~used .
|
||||
display 'not used dp: ',`.,13,10
|
||||
end if }
|
||||
struc dq [a] { common . dq a
|
||||
if ~used .
|
||||
display 'not used dq: ',`.,13,10
|
||||
end if }
|
||||
struc dt [a] { common . dt a
|
||||
if ~used .
|
||||
display 'not used dt: ',`.,13,10
|
||||
end if }
|
||||
|
||||
; constants definition
|
||||
WSTATE_NORMAL = 00000000b
|
||||
WSTATE_MAXIMIZED = 00000001b
|
||||
WSTATE_MINIMIZED = 00000010b
|
||||
WSTATE_ROLLEDUP = 00000100b
|
||||
|
||||
; structures definition
|
||||
struc WDATA {
|
||||
.left dd ?
|
||||
.top dd ?
|
||||
.width dd ?
|
||||
.height dd ?
|
||||
.cl_workarea dd ?
|
||||
.cl_titlebar dd ?
|
||||
.cl_frames dd ?
|
||||
.reserved db ?
|
||||
.fl_wstate db ?
|
||||
.fl_wdrawn db ?
|
||||
.fl_redraw db ?
|
||||
}
|
||||
virtual at 0
|
||||
WDATA WDATA
|
||||
end virtual
|
||||
label WDATA.fl_wstyle byte at 0x13 ; WDATA.cl_workarea+3
|
||||
|
||||
struc RECT {
|
||||
.left dd ?
|
||||
.top dd ?
|
||||
.right dd ?
|
||||
.bottom dd ?
|
||||
}
|
||||
virtual at 0
|
||||
RECT RECT
|
||||
end virtual
|
||||
|
||||
struc BOX {
|
||||
.left dd ?
|
||||
.top dd ?
|
||||
.width dd ?
|
||||
.height dd ?
|
||||
}
|
||||
virtual at 0
|
||||
BOX BOX
|
||||
end virtual
|
||||
|
||||
;// mike.dld, 2006-29-01 ]
|
||||
|
||||
|
||||
; Core functions
|
||||
include "core/sync.inc"
|
||||
include "core/sys32.inc" ; process management
|
||||
include "core/sched.inc" ; process scheduling
|
||||
include "core/syscall.inc" ; system call
|
||||
include "core/mem.inc" ; high-level memory management
|
||||
include "core/newproce.inc" ;new process management
|
||||
include "core/physmem.inc" ; access to physical memory for applications
|
||||
include "core/sync.inc" ; macros for synhronization objects
|
||||
|
||||
; GUI stuff
|
||||
include "gui/window.inc"
|
||||
include "gui/event.inc"
|
||||
include "gui/font.inc"
|
||||
include "gui/button.inc"
|
||||
|
||||
; shutdown
|
||||
|
||||
include "boot/shutdown.inc" ; shutdown or restart
|
||||
|
||||
; file system
|
||||
|
||||
include "fs/fs.inc" ; syscall
|
||||
include "fs/fat32.inc" ; read / write for fat32 filesystem
|
||||
include "fs/fat12.inc" ; read / write for fat12 filesystem
|
||||
include "blkdev/rd.inc" ; ramdisk read /write
|
||||
|
||||
; sound
|
||||
|
||||
include "sound/sb16.inc" ; playback for Sound Blaster 16
|
||||
include "sound/playnote.inc" ; player Note for Speaker PC
|
||||
|
||||
; display
|
||||
|
||||
include "video/vesa12.inc" ; Vesa 1.2 functions
|
||||
include "video/vesa20.inc" ; Vesa 2.0 functions
|
||||
include "video/vga.inc" ; VGA 16 color functions
|
||||
|
||||
; Network Interface & TCPIP Stack
|
||||
|
||||
include "network/stack.inc"
|
||||
|
||||
; Mouse pointer
|
||||
|
||||
include "gui/mouse.inc"
|
||||
|
||||
; Window skinning
|
||||
|
||||
include "gui/skincode.inc"
|
||||
|
||||
; Pci functions
|
||||
|
||||
include "bus/pci/pci32.inc"
|
||||
|
||||
; Floppy drive controller
|
||||
|
||||
include "blkdev/fdc.inc"
|
||||
include "blkdev/flp_drv.inc"
|
||||
|
||||
; CD drive controller
|
||||
|
||||
include "blkdev/cdrom.inc"
|
||||
|
||||
; Character devices
|
||||
|
||||
include "hid/keyboard.inc"
|
||||
include "hid/mousedrv.inc"
|
||||
|
||||
; setting date,time,clock and alarm-clock
|
||||
|
||||
include "hid/set_dtc.inc"
|
||||
|
||||
;% -include
|
50
kernel/tags/kolibri0.5.3.0/kglobals.inc
Normal file
50
kernel/tags/kolibri0.5.3.0/kglobals.inc
Normal file
@ -0,0 +1,50 @@
|
||||
;------------------------------------------------------------------
|
||||
; use "iglobal" for inserting initialized global data definitions.
|
||||
;------------------------------------------------------------------
|
||||
macro iglobal {
|
||||
IGlobals equ IGlobals,
|
||||
macro __IGlobalBlock { }
|
||||
|
||||
;-------------------------------------------------------------
|
||||
; use 'uglobal' for inserting uninitialized global definitions.
|
||||
; even when you define some data values, these variables
|
||||
; will be stored as uninitialized data.
|
||||
;-------------------------------------------------------------
|
||||
macro uglobal {
|
||||
UGlobals equ UGlobals,
|
||||
macro __UGlobalBlock { }
|
||||
|
||||
endg fix } ; Use endg for ending iglobal and uglobal blocks.
|
||||
|
||||
macro IncludeIGlobals{
|
||||
macro IGlobals dummy,[n] \{ __IGlobalBlock
|
||||
purge __IGlobalBlock \}
|
||||
match I, IGlobals \{ I \} }
|
||||
|
||||
|
||||
macro IncludeUGlobals{
|
||||
macro UGlobals dummy,[n] \{
|
||||
\common
|
||||
\local begin, size
|
||||
begin = $
|
||||
virtual at $
|
||||
\forward
|
||||
__UGlobalBlock
|
||||
purge __UGlobalBlock
|
||||
\common
|
||||
size = $ - begin
|
||||
end virtual
|
||||
rb size
|
||||
\}
|
||||
match U, UGlobals \{ U \} }
|
||||
|
||||
macro IncludeAllGlobals {
|
||||
IncludeIGlobals
|
||||
IncludeUGlobals
|
||||
}
|
||||
|
||||
iglobal
|
||||
endg
|
||||
|
||||
uglobal
|
||||
endg
|
16
kernel/tags/kolibri0.5.3.0/makefile
Normal file
16
kernel/tags/kolibri0.5.3.0/makefile
Normal file
@ -0,0 +1,16 @@
|
||||
FASM=./fasm
|
||||
KSRC=kernel.asm
|
||||
KOUT=kernel.mnt
|
||||
|
||||
en: kernel.asm
|
||||
rm -f lang.inc
|
||||
echo lang fix en > lang.inc
|
||||
$(FASM) $(KSRC) $(KOUT)
|
||||
ru: kernel.asm
|
||||
rm -f lang.inc
|
||||
echo lang fix ru > lang.inc
|
||||
$(FASM) $(KSRC) $(KOUT)
|
||||
|
||||
clean:
|
||||
rm -f $(KOUT)
|
||||
rm -f lang.inc
|
229
kernel/tags/kolibri0.5.3.0/memmap.inc
Normal file
229
kernel/tags/kolibri0.5.3.0/memmap.inc
Normal file
@ -0,0 +1,229 @@
|
||||
;
|
||||
; MEMORY MAP
|
||||
;
|
||||
; Boot:
|
||||
;
|
||||
; 0:9000 byte bits per pixel
|
||||
; 0:9001 word scanline length
|
||||
; 0:9008 word vesa video mode
|
||||
; 0:900A word X res
|
||||
; 0:900C word Y res
|
||||
; 0:9010 byte mouse port - not used
|
||||
; 0:9014 dword Vesa 1.2 pm bank switch
|
||||
; 0:9018 dword Vesa 2.0 LFB address
|
||||
; 0:901C byte 0 or 1 : enable MTRR graphics acceleration
|
||||
; 0:901D byte not used anymore (0 or 1 : enable system log display)
|
||||
; 0:901E byte 0 or 1 : enable direct lfb write, paging disabled
|
||||
; 0:9020 8bytes pci data
|
||||
; 0:9030 byte VRR start enabled 1, 2-no
|
||||
; 0:9031 word IDEContrRegsBaseAddr
|
||||
;
|
||||
;
|
||||
; Runtime:
|
||||
;
|
||||
; 0000 -> 1FFF window_data - 256 entries
|
||||
;
|
||||
; 0000 dword x start
|
||||
; 0004 dword y start
|
||||
; 0008 dword x size
|
||||
; 000C dword y size
|
||||
; 0010 dword color of work area
|
||||
; 0014 dword color of grab bar
|
||||
; 0018 dword color of frames
|
||||
; 001C dword window flags, +30 = window drawn, +31 redraw flag
|
||||
;
|
||||
; 2000 -> 2FFF free
|
||||
;
|
||||
; 3000 -> 4FFF task list - 256 entries
|
||||
;
|
||||
; 00 dword process count
|
||||
; 04 dword no of processes
|
||||
; 10 dword base of running process at 0x3000+
|
||||
;
|
||||
; 20 dword application event mask
|
||||
; 24 dword PID - process identification number
|
||||
; 2a word 0, state 3=zombie, 4=terminate
|
||||
; 2e byte window number on screen
|
||||
; 30 dword exact position in memory
|
||||
; 34 dword counter sum
|
||||
; 38 dword time stamp counter add
|
||||
; 3c dword cpu usage in cpu timer tics
|
||||
;
|
||||
;
|
||||
; 5000 -> 5FFF save_syscall_data - syscall trace
|
||||
; 6000 -> 68FF free
|
||||
; 6900 -> 6EFF saved picture under mouse pointer
|
||||
;
|
||||
; 6F00 -> 6FFF free
|
||||
;
|
||||
; 7000 -> 7FFF used CD driver
|
||||
;
|
||||
; 8000 -> A3FF used FLOPPY driver
|
||||
;
|
||||
; A400 -> A7FF used active process stack
|
||||
;
|
||||
; A800 -> B0FF free
|
||||
|
||||
; B100 -> B2FF IDT
|
||||
|
||||
; B300 -> BFFF free
|
||||
|
||||
; C000 -> C3FF window stack C000 no of windows - all in words
|
||||
; C402 -> C7FF window position in stack
|
||||
; D000 -> D1FF FDC controller
|
||||
; D200 -> D3FF FDC controller for Fat12
|
||||
; D400 -> DFFF free
|
||||
; E000 byte multitasking started
|
||||
; E020 dword putpixel address
|
||||
; E024 dword getpixel address
|
||||
; E030 dword Vesa 1.2 pm bank switch address
|
||||
; F200 dword mousepicture -pointer
|
||||
; F204 dword mouse appearance counter
|
||||
; F300 dword x & y temp for windowmove
|
||||
; F400 byte no of keys in buffer
|
||||
; F401 byte 'buffer'
|
||||
; F402 -> F4FF reserved for keys
|
||||
; F500 byte no of buttons in buffer
|
||||
; F501 dword 'buffer'
|
||||
; F502 -> F5FF reserved for buttons
|
||||
; F600 dword tsc / second
|
||||
; F604 byte mouse port: 1 ps2, 2 com1, 3 com2
|
||||
; FB00 -> FB0F mouse memory 00 chunk count - FB0A-B x - FB0C-D y
|
||||
; FB10 -> FB17 mouse color mem
|
||||
; FB21 x move
|
||||
; FB22 y move
|
||||
; FB28 high bits temp
|
||||
; FB30 color temp
|
||||
; FB40 byte buttons down
|
||||
; FB44 byte 0 mouse down -> do not draw
|
||||
; FB4A -> FB4D FB4A-B x-under - FB4C-D y-under
|
||||
; FBF1 byte bits per pixel
|
||||
; FC00 -> FCFE com1/ps2 buffer
|
||||
; FCFF com1/ps2 buffer count starting from FC00
|
||||
; FE00 dword screen x size
|
||||
; FE04 dword screen y size
|
||||
; FE08 dword screen y multiplier
|
||||
; FE0C dword screen mode
|
||||
; FE10 dword entries in hd cache
|
||||
; FE80 dword address of LFB in physical
|
||||
; FE84 dword address of applications memory start in physical
|
||||
; FE88 dword address of button list
|
||||
; FE8C dword memory to use
|
||||
; FF00 byte 1 = system shutdown request
|
||||
; FF01 dword if >1 then activate process
|
||||
; FFF0 byte 1 = redraw background request from app
|
||||
; FFF1 byte 1 = diskette int occur
|
||||
; FFF2 write and read bank in screen
|
||||
; FFF4 byte 0 if first mouse draw & do not return picture under
|
||||
; FFF5 byte 1 do not draw pointer
|
||||
; FFFF byte do not change task for 1/100 sec.
|
||||
;
|
||||
; 10000 -> 3DBFF kernel, 32-bit run-time code (up to 183 Kb)
|
||||
; 3DC00 -> 3EBFF stack at boot time (4Kb)
|
||||
; 3EC00 -> 3F5FF basic text font II
|
||||
; 3F600 -> 3FFFF basic text font I
|
||||
; 40000 -> 4FFFF data of retrieved disks and partitions (Mario79)
|
||||
|
||||
; 50000 -> 5FFFF free (64 Kb)
|
||||
|
||||
; 60000 -> 7FFFF paging tables
|
||||
; 80000 -> 8FFFF additional app info, in 256 byte steps - 256 entries
|
||||
;
|
||||
; 00 11db name of app running
|
||||
; 10 108db floating point unit save area
|
||||
; 7f byte 0= no fpu saved , 1= fpu saved to 0x10 -> restore
|
||||
; 80 dword address of random shaped window area
|
||||
; 84 byte shape area scale
|
||||
; 88 dword used GDT of TSS
|
||||
; 8C dword application memory size
|
||||
; 90 dword window X position save
|
||||
; 94 dword window Y position save
|
||||
; 98 dword window X size save
|
||||
; 9C dword window Y size save
|
||||
; A0 dword IPC memory start
|
||||
; A4 dword IPC memory size
|
||||
; A8 dword event bits: mouse, stack,..
|
||||
;
|
||||
; B0 dword int40 handler in use ; 0 if not in use
|
||||
; B4 byte keyboard mode: 0 = keymap, 1 = scancodes
|
||||
; B8 dword physical address of directory table
|
||||
;
|
||||
; 90000 -> 9FFFF tmp
|
||||
; A0000 -> AFFFF screen access area
|
||||
; B0000 -> FFFFF bios rest in peace -area
|
||||
; 100000 -> 27FFFF diskette image
|
||||
; 280000 -> 281FFF ramdisk fat
|
||||
; 282000 -> 283FFF floppy fat
|
||||
;
|
||||
; 284000 -> 29FFFF free (112 Kb)
|
||||
;
|
||||
; 2A0000 -> 2B00ff wav device data
|
||||
; 2C0000 -> 2C3fff button info
|
||||
;
|
||||
; 0000 word number of buttons
|
||||
; first button entry at 0x10
|
||||
; +0000 word process number
|
||||
; +0002 word button id number : bits 00-15
|
||||
; +0004 word x start
|
||||
; +0006 word x size
|
||||
; +0008 word y start
|
||||
; +000A word y size
|
||||
; +000C word button id number : bits 16-31
|
||||
;
|
||||
; 2C4000 -> 2CFFFF free (48Kb)
|
||||
;
|
||||
; 2D0000 -> 2DFFFF reserved port area
|
||||
;
|
||||
; 0000 dword no of port areas reserved
|
||||
; 0010 dword process id
|
||||
; dword start port
|
||||
; dword end port
|
||||
; dword 0
|
||||
;
|
||||
; 2E0000 -> 2EFFFF irq data area
|
||||
; 2F0000 -> 2FFFFF low memory save
|
||||
;
|
||||
; 300000 -> 45FFFF background image, max 1,375 M
|
||||
;
|
||||
; 460000 -> 5FFFFF display info
|
||||
;
|
||||
; 600000 -> 6FFFFF hd cache
|
||||
;
|
||||
; 700000 -> 71ffff tcp memory (128 kb)
|
||||
; 720000 -> 75ffff free (256 kb)
|
||||
;
|
||||
; 760000 -> 76ffff !vrr driver
|
||||
; 770000 -> 777fff tcp memory ( 32 kb)
|
||||
;
|
||||
; 778000 -> 77ffff window skinning ( 32 kb)
|
||||
; 780000 -> 7fffff free (512 Kb)
|
||||
;
|
||||
; 800000 -> BFFFFF mapped to LFB
|
||||
;
|
||||
;
|
||||
; C00000 -> C01FFF draw_data - 256 entries
|
||||
;
|
||||
; 00 dword draw limit - x start
|
||||
; 04 dword draw limit - y start
|
||||
; 08 dword draw limit - x end
|
||||
; 0C dword draw limit - y end
|
||||
;
|
||||
; C02000 -> C02fff free (4 Kb)
|
||||
;
|
||||
; C03000 -> D02fff sysint_stack_data
|
||||
; - ring0 stacks for ring3 processes
|
||||
; - used for interrupt handling
|
||||
; - 256 entries * 4096 step
|
||||
;
|
||||
; D03000 -> D1ffff free (116 Kb)
|
||||
;
|
||||
; D20000 -> F28000 TSS and IO map for (8192*8)=65536 ports
|
||||
; (128+8192)*256 = 557956 = 0x88000
|
||||
;
|
||||
; 1000000 -> 3FFFFFF for applications
|
||||
;
|
||||
|
||||
|
||||
|
||||
|
||||
|
2380
kernel/tags/kolibri0.5.3.0/network/eth_drv/3c59x.inc
Normal file
2380
kernel/tags/kolibri0.5.3.0/network/eth_drv/3c59x.inc
Normal file
File diff suppressed because it is too large
Load Diff
1681
kernel/tags/kolibri0.5.3.0/network/eth_drv/ethernet.inc
Normal file
1681
kernel/tags/kolibri0.5.3.0/network/eth_drv/ethernet.inc
Normal file
File diff suppressed because it is too large
Load Diff
739
kernel/tags/kolibri0.5.3.0/network/eth_drv/i8255x.inc
Normal file
739
kernel/tags/kolibri0.5.3.0/network/eth_drv/i8255x.inc
Normal file
@ -0,0 +1,739 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; I8255X.INC ;;
|
||||
;; ;;
|
||||
;; Ethernet driver for Menuet OS ;;
|
||||
;; ;;
|
||||
;; Version 0.3 11 August 2003 ;;
|
||||
;; ;;
|
||||
;; This driver is based on the eepro100 driver from ;;
|
||||
;; the etherboot 5.0.6 project. The copyright statement is ;;
|
||||
;; ;;
|
||||
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||
;; Version 2, June 1991 ;;
|
||||
;; ;;
|
||||
;; remaining parts Copyright 2002 Mike Hibbett, ;;
|
||||
;; mikeh@oceanfree.net ;;
|
||||
;; ;;
|
||||
;; See file COPYING for details ;;
|
||||
;; ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
;********************************************************************
|
||||
; Interface
|
||||
; I8255x_reset
|
||||
; I8255x_probe
|
||||
; I8255x_poll
|
||||
; I8255x_transmit
|
||||
;
|
||||
; These functions are referenced in ethernet.inc
|
||||
;
|
||||
;********************************************************************
|
||||
|
||||
|
||||
rxfd_status equ eth_data_start
|
||||
rxfd_command equ eth_data_start + 2
|
||||
rxfd_link equ eth_data_start + 4
|
||||
rxfd_rx_buf_addr equ eth_data_start + 8
|
||||
rxfd_count equ eth_data_start + 12
|
||||
rxfd_size equ eth_data_start + 14
|
||||
rxfd_packet equ eth_data_start + 16
|
||||
|
||||
|
||||
|
||||
uglobal
|
||||
eeprom_data: times 16 dd 0
|
||||
|
||||
align 4
|
||||
|
||||
lstats:
|
||||
tx_good_frames: dd 0
|
||||
tx_coll16_errs: dd 0
|
||||
tx_late_colls: dd 0
|
||||
tx_underruns: dd 0
|
||||
tx_lost_carrier: dd 0
|
||||
tx_deferred: dd 0
|
||||
tx_one_colls: dd 0
|
||||
tx_multi_colls: dd 0
|
||||
tx_total_colls: dd 0
|
||||
rx_good_frames: dd 0
|
||||
rx_crc_errs: dd 0
|
||||
rx_align_errs: dd 0
|
||||
rx_resource_errs: dd 0
|
||||
rx_overrun_errs: dd 0
|
||||
rx_colls_errs: dd 0
|
||||
rx_runt_errs: dd 0
|
||||
done_marker: dd 0
|
||||
|
||||
align 4
|
||||
|
||||
confcmd:
|
||||
confcmd_status: dw 0
|
||||
confcmd_command: dw 0
|
||||
confcmd_link: dd 0
|
||||
endg
|
||||
|
||||
iglobal
|
||||
confcmd_data: db 22, 0x08, 0, 0, 0, 0x80, 0x32, 0x03, 1
|
||||
db 0, 0x2e, 0, 0x60, 0, 0xf2, 0x48, 0, 0x40, 0xf2
|
||||
db 0x80, 0x3f, 0x05
|
||||
endg
|
||||
|
||||
uglobal
|
||||
align 4
|
||||
|
||||
txfd:
|
||||
txfd_status: dw 0
|
||||
txfd_command: dw 0
|
||||
txfd_link: dd 0
|
||||
txfd_tx_desc_addr: dd 0
|
||||
txfd_count: dd 0
|
||||
txfd_tx_buf_addr0: dd 0
|
||||
txfd_tx_buf_size0: dd 0
|
||||
txfd_tx_buf_addr1: dd 0
|
||||
txfd_tx_buf_size1: dd 0
|
||||
|
||||
align 4
|
||||
|
||||
hdr:
|
||||
hdr_dst_addr: times 6 db 0
|
||||
hdr_src_addr: times 6 db 0
|
||||
hdr_type: dw 0
|
||||
endg
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; wait_for_cmd_done
|
||||
;
|
||||
; Description
|
||||
; waits for the hardware to complete a command
|
||||
; port address in edx
|
||||
;
|
||||
; al destroyed
|
||||
;***************************************************************************
|
||||
wait_for_cmd_done:
|
||||
in al, dx
|
||||
cmp al, 0
|
||||
jne wait_for_cmd_done
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; mdio_read
|
||||
;
|
||||
; Description
|
||||
; This probably reads a register in the "physical media interface chip"
|
||||
; Phy_id in ebx
|
||||
; location in ecx
|
||||
;
|
||||
; Data returned in eax
|
||||
;
|
||||
;***************************************************************************
|
||||
mdio_read:
|
||||
mov edx, [io_addr]
|
||||
add edx, 16 ; SCBCtrlMDI
|
||||
|
||||
mov eax, 0x08000000
|
||||
shl ecx, 16
|
||||
or eax, ecx
|
||||
shl ebx, 21
|
||||
or eax, ebx
|
||||
|
||||
out dx, eax
|
||||
|
||||
mrlp:
|
||||
call delay_us
|
||||
in eax, dx
|
||||
mov ecx, eax
|
||||
and ecx, 0x10000000
|
||||
jz mrlp
|
||||
|
||||
and eax, 0xffff
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; mdio_write
|
||||
;
|
||||
; Description
|
||||
; This probably writes a register in the "physical media interface chip"
|
||||
; Phy_id in ebx
|
||||
; location in ecx
|
||||
; data in edx
|
||||
; Data returned in eax
|
||||
;
|
||||
;***************************************************************************
|
||||
mdio_write:
|
||||
mov eax, 0x04000000
|
||||
shl ecx, 16
|
||||
or eax, ecx
|
||||
shl ebx, 21
|
||||
or eax, ebx
|
||||
or eax, edx
|
||||
|
||||
mov edx, [io_addr]
|
||||
add edx, 16 ; SCBCtrlMDI
|
||||
out dx, eax
|
||||
|
||||
mwlp:
|
||||
call delay_us
|
||||
in eax, dx
|
||||
mov ecx, eax
|
||||
and ecx, 0x10000000
|
||||
jz mwlp
|
||||
|
||||
and eax, 0xffff
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;/***********************************************************************/
|
||||
;/* I82557 related defines */
|
||||
;/***********************************************************************/
|
||||
|
||||
; Serial EEPROM section.
|
||||
; A "bit" grungy, but we work our way through bit-by-bit :->.
|
||||
; EEPROM_Ctrl bits.
|
||||
EE_SHIFT_CLK equ 0x01 ; EEPROM shift clock.
|
||||
EE_CS equ 0x02 ; EEPROM chip select.
|
||||
EE_DATA_WRITE equ 0x04 ; EEPROM chip data in.
|
||||
EE_DATA_READ equ 0x08 ; EEPROM chip data out.
|
||||
EE_WRITE_0 equ 0x4802
|
||||
EE_WRITE_1 equ 0x4806
|
||||
EE_ENB equ 0x4802
|
||||
|
||||
|
||||
; The EEPROM commands include the alway-set leading bit.
|
||||
EE_READ_CMD equ 6
|
||||
|
||||
; The SCB accepts the following controls for the Tx and Rx units:
|
||||
CU_START equ 0x0010
|
||||
CU_RESUME equ 0x0020
|
||||
CU_STATSADDR equ 0x0040
|
||||
CU_SHOWSTATS equ 0x0050 ; Dump statistics counters.
|
||||
CU_CMD_BASE equ 0x0060 ; Base address to add to add CU commands.
|
||||
CU_DUMPSTATS equ 0x0070 ; Dump then reset stats counters.
|
||||
|
||||
RX_START equ 0x0001
|
||||
RX_RESUME equ 0x0002
|
||||
RX_ABORT equ 0x0004
|
||||
RX_ADDR_LOAD equ 0x0006
|
||||
RX_RESUMENR equ 0x0007
|
||||
INT_MASK equ 0x0100
|
||||
DRVR_INT equ 0x0200 ; Driver generated interrupt.
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; do_eeprom_cmd
|
||||
;
|
||||
; Description
|
||||
; writes a cmd to the ethernet cards eeprom, by bit bashing
|
||||
; cmd in ebx
|
||||
; cmd length in ecx
|
||||
; return in eax
|
||||
;***************************************************************************
|
||||
do_eeprom_cmd:
|
||||
mov edx, [io_addr] ; We only require the value in dx
|
||||
add dx, 14 ; the value SCBeeprom
|
||||
|
||||
mov ax, EE_ENB
|
||||
out dx, ax
|
||||
call delay_us
|
||||
|
||||
mov ax, 0x4803 ; EE_ENB | EE_SHIFT_CLK
|
||||
out dx, ax
|
||||
call delay_us
|
||||
|
||||
; dx holds ee_addr
|
||||
; ecx holds count
|
||||
; eax holds cmd
|
||||
xor edi, edi ; this will be the receive data
|
||||
|
||||
dec_001:
|
||||
mov esi, 1
|
||||
|
||||
dec ecx
|
||||
shl esi, cl
|
||||
inc ecx
|
||||
and esi, ebx
|
||||
mov eax, EE_WRITE_0 ; I am assuming this doesnt affect the flags..
|
||||
cmp esi,0
|
||||
jz dec_002
|
||||
mov eax, EE_WRITE_1
|
||||
|
||||
dec_002:
|
||||
out dx, ax
|
||||
call delay_us
|
||||
|
||||
or ax, EE_SHIFT_CLK
|
||||
out dx, ax
|
||||
call delay_us
|
||||
|
||||
shl edi,1
|
||||
|
||||
in ax, dx
|
||||
and ax, EE_DATA_READ
|
||||
cmp ax,0
|
||||
jz dec_003
|
||||
inc edi
|
||||
|
||||
dec_003:
|
||||
loop dec_001
|
||||
|
||||
mov ax, EE_ENB
|
||||
out dx, ax
|
||||
call delay_us
|
||||
|
||||
mov ax, 0x4800
|
||||
out dx, ax
|
||||
call delay_us
|
||||
|
||||
mov eax, edi
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; I8255x_reset
|
||||
; Description
|
||||
; Place the chip (ie, the ethernet card) into a virgin state
|
||||
; No inputs
|
||||
; All registers destroyed
|
||||
;
|
||||
;***************************************************************************
|
||||
I8255x_reset:
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; I8255x_probe
|
||||
; Description
|
||||
; Searches for an ethernet card, enables it and clears the rx buffer
|
||||
; If a card was found, it enables the ethernet -> TCPIP link
|
||||
;
|
||||
;***************************************************************************
|
||||
I8255x_probe:
|
||||
mov eax, [io_addr]
|
||||
|
||||
mov ebx, [pci_bus]
|
||||
mov ecx, [pci_dev]
|
||||
mov edx, 0x04 ; PCI_COMMAND
|
||||
call pcibios_read_config_word
|
||||
|
||||
or ax, 0x05
|
||||
mov ebx, [pci_bus]
|
||||
mov ecx, [pci_dev]
|
||||
mov edx, 0x04 ; PCI_COMMAND
|
||||
call pcibios_write_config_word
|
||||
|
||||
mov ebx, 0x6000000
|
||||
mov ecx, 27
|
||||
call do_eeprom_cmd
|
||||
and eax, 0xffe0000
|
||||
cmp eax, 0xffe0000
|
||||
je bige
|
||||
|
||||
mov ebx, 0x1800000
|
||||
mov ecx, 0x40
|
||||
jmp doread
|
||||
|
||||
bige:
|
||||
mov ebx, 0x6000000
|
||||
mov ecx, 0x100
|
||||
|
||||
doread:
|
||||
; do-eeprom-cmd will destroy all registers
|
||||
; we have eesize in ecx
|
||||
; read_cmd in ebx
|
||||
|
||||
; Ignore full eeprom - just load the mac address
|
||||
mov ecx, 0
|
||||
|
||||
drlp:
|
||||
push ecx ; save count
|
||||
push ebx
|
||||
mov eax, ecx
|
||||
shl eax, 16
|
||||
or ebx, eax
|
||||
mov ecx, 27
|
||||
call do_eeprom_cmd
|
||||
|
||||
pop ebx
|
||||
pop ecx
|
||||
|
||||
mov edx, ecx
|
||||
shl edx, 2
|
||||
mov esi, eeprom_data
|
||||
add esi, edx
|
||||
mov [esi], eax
|
||||
|
||||
inc ecx
|
||||
cmp ecx, 16
|
||||
jne drlp
|
||||
|
||||
; OK, we have the MAC address.
|
||||
; Now reset the card
|
||||
|
||||
mov edx, [io_addr]
|
||||
add dx, 8 ; SCBPort
|
||||
xor eax, eax ; The reset cmd == 0
|
||||
out dx, eax
|
||||
|
||||
mov esi, 10
|
||||
call delay_ms ; Give the card time to warm up.
|
||||
|
||||
mov eax, lstats
|
||||
mov edx, [io_addr]
|
||||
add edx, 4 ; SCBPointer
|
||||
out dx, eax
|
||||
|
||||
mov eax, 0x0140 ; INT_MASK | CU_STATSADDR
|
||||
mov edx, [io_addr]
|
||||
add edx, 2 ; SCBCmd
|
||||
out dx, ax
|
||||
|
||||
call wait_for_cmd_done
|
||||
|
||||
mov eax, 0
|
||||
mov edx, [io_addr]
|
||||
add edx, 4 ; SCBPointer
|
||||
out dx, eax
|
||||
|
||||
mov eax, 0x0106 ; INT_MASK | RX_ADDR_LOAD
|
||||
mov edx, [io_addr]
|
||||
add edx, 2 ; SCBCmd
|
||||
out dx, ax
|
||||
|
||||
call wait_for_cmd_done
|
||||
|
||||
; build rxrd structure
|
||||
mov ax, 0x0001
|
||||
mov [rxfd_status], ax
|
||||
mov ax, 0x0000
|
||||
mov [rxfd_command], ax
|
||||
|
||||
mov eax, rxfd_status
|
||||
mov [rxfd_link], eax
|
||||
|
||||
mov eax, Ether_buffer
|
||||
mov [rxfd_rx_buf_addr], eax
|
||||
|
||||
mov ax, 0
|
||||
mov [rxfd_count], ax
|
||||
|
||||
mov ax, 1528
|
||||
mov [rxfd_size], ax
|
||||
|
||||
mov edx, [io_addr]
|
||||
add edx, 4 ; SCBPointer
|
||||
|
||||
mov eax, rxfd_status
|
||||
out dx, eax
|
||||
|
||||
mov edx, [io_addr]
|
||||
add edx, 2 ; SCBCmd
|
||||
|
||||
mov ax, 0x0101 ; INT_MASK | RX_START
|
||||
out dx, ax
|
||||
|
||||
call wait_for_cmd_done
|
||||
|
||||
; start the reciver
|
||||
|
||||
mov ax, 0
|
||||
mov [rxfd_status], ax
|
||||
|
||||
mov ax, 0xc000
|
||||
mov [rxfd_command], ax
|
||||
|
||||
mov edx, [io_addr]
|
||||
add edx, 4 ; SCBPointer
|
||||
|
||||
mov eax, rxfd_status
|
||||
out dx, eax
|
||||
|
||||
mov edx, [io_addr]
|
||||
add edx, 2 ; SCBCmd
|
||||
|
||||
mov ax, 0x0101 ; INT_MASK | RX_START
|
||||
out dx, ax
|
||||
|
||||
; Init TX Stuff
|
||||
|
||||
mov edx, [io_addr]
|
||||
add edx, 4 ; SCBPointer
|
||||
|
||||
mov eax, 0
|
||||
out dx, eax
|
||||
|
||||
mov edx, [io_addr]
|
||||
add edx, 2 ; SCBCmd
|
||||
|
||||
mov ax, 0x0160 ; INT_MASK | CU_CMD_BASE
|
||||
out dx, ax
|
||||
|
||||
call wait_for_cmd_done
|
||||
|
||||
; Set TX Base address
|
||||
|
||||
; First, set up confcmd values
|
||||
|
||||
mov ax, 2
|
||||
mov [confcmd_command], ax
|
||||
mov eax, txfd
|
||||
mov [confcmd_link], eax
|
||||
|
||||
mov ax, 1
|
||||
mov [txfd_command], ax ; CmdIASetup
|
||||
|
||||
mov ax, 0
|
||||
mov [txfd_status], ax
|
||||
|
||||
mov eax, confcmd
|
||||
mov [txfd_link], eax
|
||||
|
||||
; ETH_ALEN is 6 bytes
|
||||
|
||||
mov esi, eeprom_data
|
||||
mov edi, node_addr
|
||||
mov ecx, 3
|
||||
drp000:
|
||||
mov eax, [esi]
|
||||
mov [edi], al
|
||||
shr eax, 8
|
||||
inc edi
|
||||
mov [edi], al
|
||||
inc edi
|
||||
add esi, 4
|
||||
loop drp000
|
||||
|
||||
; Hard code your MAC address into node_addr at this point,
|
||||
; If you cannot read the MAC address from the eeprom in the previous step.
|
||||
; You also have to write the mac address into txfd_tx_desc_addr, rather
|
||||
; than taking data from eeprom_data
|
||||
|
||||
mov esi, eeprom_data
|
||||
mov edi, txfd_tx_desc_addr
|
||||
mov ecx, 3
|
||||
drp001:
|
||||
mov eax, [esi]
|
||||
mov [edi], al
|
||||
shr eax, 8
|
||||
inc edi
|
||||
mov [edi], al
|
||||
inc edi
|
||||
add esi, 4
|
||||
loop drp001
|
||||
|
||||
mov esi, eeprom_data + (6 * 4)
|
||||
mov eax, [esi]
|
||||
shr eax, 8
|
||||
and eax, 0x3f
|
||||
cmp eax, 4 ; DP83840
|
||||
je drp002
|
||||
cmp eax, 10 ; DP83840A
|
||||
je drp002
|
||||
jmp drp003
|
||||
|
||||
drp002:
|
||||
mov ebx, [esi]
|
||||
and ebx, 0x1f
|
||||
push ebx
|
||||
mov ecx, 23
|
||||
call mdio_read
|
||||
pop ebx
|
||||
or eax, 0x0422
|
||||
mov ecx, 23
|
||||
mov edx, eax
|
||||
call mdio_write
|
||||
|
||||
drp003:
|
||||
mov ax, 0x4002 ; Cmdsuspend | CmdConfigure
|
||||
mov [confcmd_command], ax
|
||||
mov ax, 0
|
||||
mov [confcmd_status], ax
|
||||
mov eax, txfd
|
||||
mov [confcmd_link], eax
|
||||
mov ebx, confcmd_data
|
||||
mov al, 0x88 ; fifo of 8 each
|
||||
mov [ebx + 1], al
|
||||
mov al, 0
|
||||
mov [ebx + 4], al
|
||||
mov al, 0x80
|
||||
mov [ebx + 5], al
|
||||
mov al, 0x48
|
||||
mov [ebx + 15], al
|
||||
mov al, 0x80
|
||||
mov [ebx + 19], al
|
||||
mov al, 0x05
|
||||
mov [ebx + 21], al
|
||||
|
||||
mov eax, txfd
|
||||
mov edx, [io_addr]
|
||||
add edx, 4 ; SCBPointer
|
||||
out dx, eax
|
||||
|
||||
mov eax, 0x0110 ; INT_MASK | CU_START
|
||||
mov edx, [io_addr]
|
||||
add edx, 2 ; SCBCmd
|
||||
out dx, ax
|
||||
|
||||
call wait_for_cmd_done
|
||||
jmp skip
|
||||
|
||||
; wait for thing to start
|
||||
drp004:
|
||||
mov ax, [txfd_status]
|
||||
cmp ax, 0
|
||||
je drp004
|
||||
|
||||
skip:
|
||||
; Indicate that we have successfully reset the card
|
||||
mov eax, [pci_data]
|
||||
mov [eth_status], eax
|
||||
|
||||
I8255x_exit:
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; I8255x_poll
|
||||
;
|
||||
; Description
|
||||
; Polls the ethernet card for a received packet
|
||||
; Received data, if any, ends up in Ether_buffer
|
||||
;
|
||||
;***************************************************************************
|
||||
I8255x_poll:
|
||||
mov ax, 0 ; assume no data
|
||||
mov [eth_rx_data_len], ax
|
||||
|
||||
mov ax, [rxfd_status]
|
||||
cmp ax, 0
|
||||
je i8p_exit
|
||||
|
||||
mov ax, 0
|
||||
mov [rxfd_status], ax
|
||||
|
||||
mov ax, 0xc000
|
||||
mov [rxfd_command], ax
|
||||
|
||||
mov edx, [io_addr]
|
||||
add edx, 4 ; SCBPointer
|
||||
|
||||
mov eax, rxfd_status
|
||||
out dx, eax
|
||||
|
||||
mov edx, [io_addr]
|
||||
add edx, 2 ; SCBCmd
|
||||
|
||||
mov ax, 0x0101 ; INT_MASK | RX_START
|
||||
out dx, ax
|
||||
|
||||
call wait_for_cmd_done
|
||||
|
||||
mov esi, rxfd_packet
|
||||
mov edi, Ether_buffer
|
||||
mov ecx, 1518
|
||||
cld
|
||||
rep movsb
|
||||
|
||||
mov ax, [rxfd_count]
|
||||
and ax, 0x3fff
|
||||
mov [eth_rx_data_len], ax
|
||||
|
||||
i8p_exit:
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; I8255x_transmit
|
||||
;
|
||||
; Description
|
||||
; Transmits a packet of data via the ethernet card
|
||||
; Pointer to 48 bit destination address in edi
|
||||
; Type of packet in bx
|
||||
; size of packet in ecx
|
||||
; pointer to packet data in esi
|
||||
;
|
||||
;***************************************************************************
|
||||
I8255x_transmit:
|
||||
|
||||
mov [hdr_type], bx
|
||||
|
||||
mov eax, [edi]
|
||||
mov [hdr_dst_addr], eax
|
||||
mov ax, [edi+4]
|
||||
mov [hdr_dst_addr+4], ax
|
||||
|
||||
mov eax, [node_addr]
|
||||
mov [hdr_src_addr], eax
|
||||
mov ax, [node_addr+4]
|
||||
mov [hdr_src_addr+4], ax
|
||||
|
||||
mov edx, [io_addr]
|
||||
in ax, dx
|
||||
and ax, 0xfc00
|
||||
out dx, ax
|
||||
|
||||
xor ax, ax
|
||||
mov [txfd_status], ax
|
||||
mov ax, 0x400C ; Cmdsuspend | CmdTx | CmdTxFlex
|
||||
mov [txfd_command], ax
|
||||
mov eax, txfd
|
||||
mov [txfd_link], eax
|
||||
mov eax, 0x02208000
|
||||
mov [txfd_count], eax
|
||||
mov eax, txfd_tx_buf_addr0
|
||||
mov [txfd_tx_desc_addr], eax
|
||||
mov eax, hdr
|
||||
mov [txfd_tx_buf_addr0], eax
|
||||
mov eax, 14 ; sizeof hdr
|
||||
mov [txfd_tx_buf_size0], eax
|
||||
|
||||
; Copy the buffer address and size in
|
||||
mov eax, esi
|
||||
mov [txfd_tx_buf_addr1], eax
|
||||
mov eax, ecx
|
||||
mov [txfd_tx_buf_size1], eax
|
||||
|
||||
mov eax, txfd
|
||||
mov edx, [io_addr]
|
||||
add edx, 4 ; SCBPointer
|
||||
out dx, eax
|
||||
|
||||
mov ax, 0x0110 ; INT_MASK | CU_START
|
||||
mov edx, [io_addr]
|
||||
add edx, 2 ; SCBCmd
|
||||
out dx, ax
|
||||
|
||||
call wait_for_cmd_done
|
||||
|
||||
mov edx, [io_addr]
|
||||
in ax, dx
|
||||
|
||||
I8t_001:
|
||||
mov ax, [txfd_status]
|
||||
cmp ax, 0
|
||||
je I8t_001
|
||||
|
||||
mov edx, [io_addr]
|
||||
in ax, dx
|
||||
|
||||
ret
|
814
kernel/tags/kolibri0.5.3.0/network/eth_drv/pcnet32.inc
Normal file
814
kernel/tags/kolibri0.5.3.0/network/eth_drv/pcnet32.inc
Normal file
@ -0,0 +1,814 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; PCNET32.INC ;;
|
||||
;; ;;
|
||||
;; Ethernet driver for Menuet OS ;;
|
||||
;; ;;
|
||||
;; Version 1.0 31 July 2004 ;;
|
||||
;; ;;
|
||||
;; This driver is based on the PCNet32 driver from ;;
|
||||
;; the etherboot 5.0.6 project. The copyright statement is ;;
|
||||
;; ;;
|
||||
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||
;; Version 2, June 1991 ;;
|
||||
;; ;;
|
||||
;; remaining parts Copyright 2004 Jarek Pelczar, ;;
|
||||
;; jpelczar@interia.pl ;;
|
||||
;; ;;
|
||||
;; See file COPYING for details ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;macro PutStr X
|
||||
;{
|
||||
; local .__xyz1
|
||||
; local .__xyz2
|
||||
; push esi
|
||||
; mov esi,.__xyz1
|
||||
; call sys_msg_board_str
|
||||
; push eax
|
||||
; mov eax,1
|
||||
; call delay_hs
|
||||
; pop eax
|
||||
; jmp .__xyz2
|
||||
;.__xyz1:
|
||||
; db X
|
||||
; db 13,10,0
|
||||
;.__xyz2:
|
||||
; pop esi
|
||||
;}
|
||||
PCNET32_PORT_AUI equ 0x00
|
||||
PCNET32_PORT_10BT equ 0x01
|
||||
PCNET32_PORT_GPSI equ 0x02
|
||||
PCNET32_PORT_MII equ 0x03
|
||||
PCNET32_PORT_PORTSEL equ 0x03
|
||||
PCNET32_PORT_ASEL equ 0x04
|
||||
PCNET32_PORT_100 equ 0x40
|
||||
PCNET32_PORT_FD equ 0x80
|
||||
PCNET32_DMA_MASK equ 0xffffffff
|
||||
PCNET32_LOG_TX_BUFFERS equ 1
|
||||
PCNET32_LOG_RX_BUFFERS equ 2
|
||||
PCNET32_TX_RING_SIZE equ (1 shl PCNET32_LOG_TX_BUFFERS)
|
||||
PCNET32_TX_RING_MOD_MASK equ (PCNET32_TX_RING_SIZE-1)
|
||||
PCNET32_TX_RING_LEN_BITS equ 0
|
||||
PCNET32_RX_RING_SIZE equ (1 shl PCNET32_LOG_RX_BUFFERS)
|
||||
PCNET32_RX_RING_MOD_MASK equ (PCNET32_RX_RING_SIZE-1)
|
||||
PCNET32_RX_RING_LEN_BITS equ (PCNET32_LOG_RX_BUFFERS shl 4)
|
||||
PCNET32_PKT_BUF_SZ equ 1544
|
||||
PCNET32_PKT_BUF_SZ_NEG equ 0xf9f8
|
||||
pcnet32_txb equ (eth_data_start)
|
||||
pcnet32_rxb equ ((pcnet32_txb+(PCNET32_PKT_BUF_SZ*PCNET32_TX_RING_SIZE)+0xf) and 0xfffffff0)
|
||||
pcnet32_tx_ring equ ((pcnet32_rxb+(PCNET32_PKT_BUF_SZ*PCNET32_RX_RING_SIZE)+0xf) and 0xfffffff0)
|
||||
pcnet32_rx_ring equ ((pcnet32_tx_ring+(16*PCNET32_TX_RING_SIZE)+0xf) and 0xfffffff0)
|
||||
virtual at ((pcnet32_rx_ring+(16*PCNET32_RX_RING_SIZE)+0xf) and 0xfffffff0)
|
||||
pcnet32_private:
|
||||
.mode dw ?
|
||||
.tlen_rlen dw ?
|
||||
.phys_addr db ?,?,?,?,?,?
|
||||
.reserved dw ?
|
||||
.filter dd ?,?
|
||||
.rx_ring dd ?
|
||||
.tx_ring dd ?
|
||||
.cur_rx dd ?
|
||||
.cur_tx dd ?
|
||||
.dirty_rx dd ?
|
||||
.dirty_tx dd ?
|
||||
.tx_full db ?
|
||||
.options dd ?
|
||||
.full_duplex db ?
|
||||
.chip_version dd ?
|
||||
.mii db ?
|
||||
.ltint db ?
|
||||
.dxsuflo db ?
|
||||
.fset db ?
|
||||
.fdx db ?
|
||||
end virtual
|
||||
virtual at 0
|
||||
pcnet32_rx_head:
|
||||
.base dd ?
|
||||
.buf_length dw ?
|
||||
.status dw ?
|
||||
.msg_length dd ?
|
||||
.reserved dd ?
|
||||
end virtual
|
||||
virtual at 0
|
||||
pcnet32_tx_head:
|
||||
.base dd ?
|
||||
.length dw ?
|
||||
.status dw ?
|
||||
.misc dd ?
|
||||
.reserved dd ?
|
||||
end virtual
|
||||
|
||||
uglobal
|
||||
pcnet32_access:
|
||||
.read_csr dd ?
|
||||
.write_csr dd ?
|
||||
.read_bcr dd ?
|
||||
.write_bcr dd ?
|
||||
.read_rap dd ?
|
||||
.write_rap dd ?
|
||||
.reset dd ?
|
||||
endg
|
||||
|
||||
iglobal
|
||||
pcnet32_options_mapping:
|
||||
dd PCNET32_PORT_ASEL ; 0 Auto-select
|
||||
dd PCNET32_PORT_AUI ; 1 BNC/AUI
|
||||
dd PCNET32_PORT_AUI ; 2 AUI/BNC
|
||||
dd PCNET32_PORT_ASEL ; 3 not supported
|
||||
dd PCNET32_PORT_10BT or PCNET32_PORT_FD ; 4 10baseT-FD
|
||||
dd PCNET32_PORT_ASEL ; 5 not supported
|
||||
dd PCNET32_PORT_ASEL ; 6 not supported
|
||||
dd PCNET32_PORT_ASEL ; 7 not supported
|
||||
dd PCNET32_PORT_ASEL ; 8 not supported
|
||||
dd PCNET32_PORT_MII ; 9 MII 10baseT
|
||||
dd PCNET32_PORT_MII or PCNET32_PORT_FD ; 10 MII 10baseT-FD
|
||||
dd PCNET32_PORT_MII ; 11 MII (autosel)
|
||||
dd PCNET32_PORT_10BT ; 12 10BaseT
|
||||
dd PCNET32_PORT_MII or PCNET32_PORT_100 ; 13 MII 100BaseTx
|
||||
dd PCNET32_PORT_MII or PCNET32_PORT_100 or PCNET32_PORT_FD ; 14 MII 100BaseTx-FD
|
||||
dd PCNET32_PORT_ASEL ; 15 not supported
|
||||
endg
|
||||
|
||||
PCNET32_WIO_RDP equ 0x10
|
||||
PCNET32_WIO_RAP equ 0x12
|
||||
PCNET32_WIO_RESET equ 0x14
|
||||
PCNET32_WIO_BDP equ 0x16
|
||||
PCNET32_DWIO_RDP equ 0x10
|
||||
PCNET32_DWIO_RAP equ 0x14
|
||||
PCNET32_DWIO_RESET equ 0x18
|
||||
PCNET32_DWIO_BDP equ 0x1C
|
||||
PCNET32_TOTAL_SIZE equ 0x20
|
||||
; ebx - index
|
||||
; return:
|
||||
; eax - data
|
||||
pcnet32_wio_read_csr:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_WIO_RAP]
|
||||
mov ax,bx
|
||||
out dx,ax
|
||||
lea edx,[ebp+PCNET32_WIO_RDP]
|
||||
in ax,dx
|
||||
and eax,0xffff
|
||||
pop edx
|
||||
ret
|
||||
; eax - data
|
||||
; ebx - index
|
||||
pcnet32_wio_write_csr:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_WIO_RAP]
|
||||
xchg eax,ebx
|
||||
out dx,ax
|
||||
xchg eax,ebx
|
||||
lea edx,[ebp+PCNET32_WIO_RDP]
|
||||
out dx,ax
|
||||
pop edx
|
||||
ret
|
||||
; ebx - index
|
||||
; return:
|
||||
; eax - data
|
||||
pcnet32_wio_read_bcr:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_WIO_RAP]
|
||||
mov ax,bx
|
||||
out dx,ax
|
||||
lea edx,[ebp+PCNET32_WIO_BDP]
|
||||
in ax,dx
|
||||
and eax,0xffff
|
||||
pop edx
|
||||
ret
|
||||
; eax - data
|
||||
; ebx - index
|
||||
pcnet32_wio_write_bcr:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_WIO_RAP]
|
||||
xchg eax,ebx
|
||||
out dx,ax
|
||||
xchg eax,ebx
|
||||
lea edx,[ebp+PCNET32_WIO_BDP]
|
||||
out dx,ax
|
||||
pop edx
|
||||
ret
|
||||
pcnet32_wio_read_rap:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_WIO_RAP]
|
||||
in ax,dx
|
||||
and eax,0xffff
|
||||
pop edx
|
||||
ret
|
||||
; eax - val
|
||||
pcnet32_wio_write_rap:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_WIO_RAP]
|
||||
out dx,ax
|
||||
pop edx
|
||||
ret
|
||||
pcnet32_wio_reset:
|
||||
push edx
|
||||
push eax
|
||||
lea edx,[ebp+PCNET32_WIO_RESET]
|
||||
in ax,dx
|
||||
pop eax
|
||||
pop edx
|
||||
ret
|
||||
pcnet32_wio_check:
|
||||
push edx
|
||||
mov ax,88
|
||||
lea edx,[ebp+PCNET32_WIO_RAP]
|
||||
out dx,ax
|
||||
nop
|
||||
nop
|
||||
in ax,dx
|
||||
cmp ax,88
|
||||
sete al
|
||||
pop edx
|
||||
ret
|
||||
|
||||
iglobal
|
||||
pcnet32_wio:
|
||||
dd pcnet32_wio_read_csr
|
||||
dd pcnet32_wio_write_csr
|
||||
dd pcnet32_wio_read_bcr
|
||||
dd pcnet32_wio_write_bcr
|
||||
dd pcnet32_wio_read_rap
|
||||
dd pcnet32_wio_write_rap
|
||||
dd pcnet32_wio_reset
|
||||
endg
|
||||
|
||||
; ebx - index
|
||||
; return:
|
||||
; eax - data
|
||||
pcnet32_dwio_read_csr:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_DWIO_RAP]
|
||||
mov ebx,eax
|
||||
out dx,eax
|
||||
lea edx,[ebp+PCNET32_DWIO_RDP]
|
||||
in eax,dx
|
||||
and eax,0xffff
|
||||
pop edx
|
||||
ret
|
||||
; ebx - index
|
||||
; eax - data
|
||||
pcnet32_dwio_write_csr:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_DWIO_RAP]
|
||||
xchg eax,ebx
|
||||
out dx,eax
|
||||
lea edx,[ebp+PCNET32_DWIO_RDP]
|
||||
xchg eax,ebx
|
||||
out dx,eax
|
||||
pop edx
|
||||
ret
|
||||
; ebx - index
|
||||
; return:
|
||||
; eax - data
|
||||
pcnet32_dwio_read_bcr:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_DWIO_RAP]
|
||||
mov ebx,eax
|
||||
out dx,eax
|
||||
lea edx,[ebp+PCNET32_DWIO_BDP]
|
||||
in eax,dx
|
||||
and eax,0xffff
|
||||
pop edx
|
||||
ret
|
||||
; ebx - index
|
||||
; eax - data
|
||||
pcnet32_dwio_write_bcr:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_DWIO_RAP]
|
||||
xchg eax,ebx
|
||||
out dx,eax
|
||||
lea edx,[ebp+PCNET32_DWIO_BDP]
|
||||
xchg eax,ebx
|
||||
out dx,eax
|
||||
pop edx
|
||||
ret
|
||||
pcnet32_dwio_read_rap:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_DWIO_RAP]
|
||||
in eax,dx
|
||||
and eax,0xffff
|
||||
pop edx
|
||||
ret
|
||||
; eax - val
|
||||
pcnet32_dwio_write_rap:
|
||||
push edx
|
||||
lea edx,[ebp+PCNET32_DWIO_RAP]
|
||||
out dx,eax
|
||||
pop edx
|
||||
ret
|
||||
pcnet32_dwio_reset:
|
||||
push edx
|
||||
push eax
|
||||
lea edx,[ebp+PCNET32_DWIO_RESET]
|
||||
in eax,dx
|
||||
pop eax
|
||||
pop edx
|
||||
ret
|
||||
pcnet32_dwio_check:
|
||||
push edx
|
||||
lea edx,[PCNET32_DWIO_RAP]
|
||||
mov eax,88
|
||||
out dx,eax
|
||||
nop
|
||||
nop
|
||||
in eax,dx
|
||||
and eax,0xffff
|
||||
cmp eax,88
|
||||
sete al
|
||||
pop edx
|
||||
ret
|
||||
|
||||
iglobal
|
||||
pcnet32_dwio:
|
||||
dd pcnet32_dwio_read_csr
|
||||
dd pcnet32_dwio_write_csr
|
||||
dd pcnet32_dwio_read_bcr
|
||||
dd pcnet32_dwio_write_bcr
|
||||
dd pcnet32_dwio_read_rap
|
||||
dd pcnet32_dwio_write_rap
|
||||
dd pcnet32_dwio_reset
|
||||
endg
|
||||
|
||||
pcnet32_init_ring:
|
||||
mov [pcnet32_private.tx_full],0
|
||||
mov [pcnet32_private.cur_rx],0
|
||||
mov [pcnet32_private.cur_tx],0
|
||||
mov [pcnet32_private.dirty_rx],0
|
||||
mov [pcnet32_private.dirty_tx],0
|
||||
mov edi,pcnet32_rx_ring
|
||||
mov ecx,PCNET32_RX_RING_SIZE
|
||||
mov ebx,pcnet32_rxb
|
||||
.rx_init:
|
||||
mov [edi+pcnet32_rx_head.base],ebx
|
||||
mov [edi+pcnet32_rx_head.buf_length],word PCNET32_PKT_BUF_SZ_NEG
|
||||
mov [edi+pcnet32_rx_head.status],word 0x8000
|
||||
add ebx,PCNET32_PKT_BUF_SZ
|
||||
; inc ebx
|
||||
add edi,16
|
||||
loop .rx_init
|
||||
mov edi,pcnet32_tx_ring
|
||||
mov ecx,PCNET32_TX_RING_SIZE
|
||||
.tx_init:
|
||||
mov [edi+pcnet32_tx_head.base],dword 0
|
||||
mov [edi+pcnet32_tx_head.status],word 0
|
||||
add edi,16
|
||||
loop .tx_init
|
||||
mov [pcnet32_private.tlen_rlen],(PCNET32_TX_RING_LEN_BITS or PCNET32_RX_RING_LEN_BITS)
|
||||
mov esi,node_addr
|
||||
mov edi,pcnet32_private.phys_addr
|
||||
cld
|
||||
movsd
|
||||
movsw
|
||||
mov dword [pcnet32_private.rx_ring],pcnet32_rx_ring
|
||||
mov dword [pcnet32_private.tx_ring],pcnet32_tx_ring
|
||||
ret
|
||||
pcnet32_reset:
|
||||
; Reset PCNET32
|
||||
mov ebp,[io_addr]
|
||||
call dword [pcnet32_access.reset]
|
||||
; set 32bit mode
|
||||
mov ebx,20
|
||||
mov eax,2
|
||||
call dword [pcnet32_access.write_bcr]
|
||||
; set/reset autoselect bit
|
||||
mov ebx,2
|
||||
call dword [pcnet32_access.read_bcr]
|
||||
and eax,not 2
|
||||
test [pcnet32_private.options],PCNET32_PORT_ASEL
|
||||
jz .L1
|
||||
or eax,2
|
||||
.L1:
|
||||
call dword [pcnet32_access.write_bcr]
|
||||
; Handle full duplex setting
|
||||
cmp byte [pcnet32_private.full_duplex],0
|
||||
je .L2
|
||||
mov ebx,9
|
||||
call dword [pcnet32_access.read_bcr]
|
||||
and eax,not 3
|
||||
test [pcnet32_private.options],PCNET32_PORT_FD
|
||||
jz .L3
|
||||
or eax,1
|
||||
cmp [pcnet32_private.options],PCNET32_PORT_FD or PCNET32_PORT_AUI
|
||||
jne .L4
|
||||
or eax,2
|
||||
jmp .L4
|
||||
.L3:
|
||||
test [pcnet32_private.options],PCNET32_PORT_ASEL
|
||||
jz .L4
|
||||
cmp [pcnet32_private.chip_version],0x2627
|
||||
jne .L4
|
||||
or eax,3
|
||||
.L4:
|
||||
mov ebx,9
|
||||
call dword [pcnet32_access.write_bcr]
|
||||
.L2:
|
||||
; set/reset GPSI bit
|
||||
mov ebx,124
|
||||
call dword [pcnet32_access.read_csr]
|
||||
mov ecx,[pcnet32_private.options]
|
||||
and ecx,PCNET32_PORT_PORTSEL
|
||||
cmp ecx,PCNET32_PORT_GPSI
|
||||
jne .L5
|
||||
or eax,0x10
|
||||
.L5:
|
||||
call dword [pcnet32_access.write_csr]
|
||||
cmp [pcnet32_private.mii],0
|
||||
je .L6
|
||||
test [pcnet32_private.options],PCNET32_PORT_ASEL
|
||||
jnz .L6
|
||||
mov ebx,32
|
||||
call dword [pcnet32_access.read_bcr]
|
||||
and eax,not 0x38
|
||||
test [pcnet32_private.options],PCNET32_PORT_FD
|
||||
jz .L7
|
||||
or eax,0x10
|
||||
.L7:
|
||||
test [pcnet32_private.options],PCNET32_PORT_100
|
||||
jz .L8
|
||||
or eax,0x08
|
||||
.L8:
|
||||
call dword [pcnet32_access.write_bcr]
|
||||
jmp .L9
|
||||
.L6:
|
||||
test [pcnet32_private.options],PCNET32_PORT_ASEL
|
||||
jz .L9
|
||||
mov ebx,32
|
||||
; PutStr "ASEL, enable auto-negotiation"
|
||||
call dword [pcnet32_access.read_bcr]
|
||||
and eax,not 0x98
|
||||
or eax,0x20
|
||||
call dword [pcnet32_access.write_bcr]
|
||||
.L9:
|
||||
cmp [pcnet32_private.ltint],0
|
||||
je .L10
|
||||
mov ebx,5
|
||||
call dword [pcnet32_access.read_csr]
|
||||
or eax,(1 shl 14)
|
||||
call dword [pcnet32_access.write_csr]
|
||||
.L10:
|
||||
mov eax,[pcnet32_private.options]
|
||||
and eax,PCNET32_PORT_PORTSEL
|
||||
shl eax,7
|
||||
mov [pcnet32_private.mode],ax
|
||||
mov [pcnet32_private.filter],dword 0xffffffff
|
||||
mov [pcnet32_private.filter+4],dword 0xffffffff
|
||||
call pcnet32_init_ring
|
||||
mov ebx,1
|
||||
mov eax,pcnet32_private
|
||||
and eax,0xffff
|
||||
call dword [pcnet32_access.write_csr]
|
||||
mov eax,pcnet32_private
|
||||
mov ebx,2
|
||||
shr eax,16
|
||||
call dword [pcnet32_access.write_csr]
|
||||
mov ebx,4
|
||||
mov eax,0x0915
|
||||
call dword [pcnet32_access.write_csr]
|
||||
mov ebx,0
|
||||
mov eax,1
|
||||
call dword [pcnet32_access.write_csr]
|
||||
mov ecx,100
|
||||
.L11:
|
||||
xor ebx,ebx
|
||||
call dword [pcnet32_access.read_csr]
|
||||
test ax,0x100
|
||||
jnz .L12
|
||||
loop .L11
|
||||
.L12:
|
||||
; PutStr "hardware reset"
|
||||
xor ebx,ebx
|
||||
mov eax,0x0002
|
||||
call dword [pcnet32_access.write_csr]
|
||||
xor ebx,ebx
|
||||
call dword [pcnet32_access.read_csr]
|
||||
; PutStr "PCNET reset complete"
|
||||
ret
|
||||
pcnet32_adjust_pci_device:
|
||||
;*******Get current setting************************
|
||||
mov al, 2 ;read a word
|
||||
mov bh, [pci_dev]
|
||||
mov ah, [pci_bus]
|
||||
mov bl, 0x04 ;from command Register
|
||||
call pci_read_reg
|
||||
;******see if its already set as bus master********
|
||||
mov bx, ax
|
||||
and bx,5
|
||||
cmp bx,5
|
||||
je pcnet32_adjust_pci_device_Latency
|
||||
;******Make card a bus master*******
|
||||
mov cx, ax ;value to write
|
||||
mov bh, [pci_dev]
|
||||
mov al, 2 ;write a word
|
||||
or cx,5
|
||||
mov ah, [pci_bus]
|
||||
mov bl, 0x04 ;to command register
|
||||
call pci_write_reg
|
||||
;******Check latency setting***********
|
||||
pcnet32_adjust_pci_device_Latency:
|
||||
;*******Get current latency setting************************
|
||||
; mov al, 1 ;read a byte
|
||||
; mov bh, [pci_dev]
|
||||
; mov ah, [pci_bus]
|
||||
; mov bl, 0x0D ;from Lantency Timer Register
|
||||
; call pci_read_reg
|
||||
;******see if its aat least 64 clocks********
|
||||
; cmp ax,64
|
||||
; jge pcnet32_adjust_pci_device_Done
|
||||
;******Set latency to 32 clocks*******
|
||||
; mov cx, 64 ;value to write
|
||||
; mov bh, [pci_dev]
|
||||
; mov al, 1 ;write a byte
|
||||
; mov ah, [pci_bus]
|
||||
; mov bl, 0x0D ;to Lantency Timer Register
|
||||
; call pci_write_reg
|
||||
;******Check latency setting***********
|
||||
pcnet32_adjust_pci_device_Done:
|
||||
ret
|
||||
pcnet32_probe:
|
||||
mov ebp,[io_addr]
|
||||
call pcnet32_wio_reset
|
||||
xor ebx,ebx
|
||||
call pcnet32_wio_read_csr
|
||||
cmp eax,4
|
||||
jne .try_dwio
|
||||
call pcnet32_wio_check
|
||||
and al,al
|
||||
jz .try_dwio
|
||||
; PutStr "Using WIO"
|
||||
mov esi,pcnet32_wio
|
||||
jmp .L1
|
||||
.try_dwio:
|
||||
call pcnet32_dwio_reset
|
||||
xor ebx,ebx
|
||||
call pcnet32_dwio_read_csr
|
||||
cmp eax,4
|
||||
jne .no_dev
|
||||
call pcnet32_dwio_check
|
||||
and al,al
|
||||
jz .no_dev
|
||||
; PutStr "Using DWIO"
|
||||
mov esi,pcnet32_dwio
|
||||
jmp .L1
|
||||
.no_dev:
|
||||
; PutStr "PCNET32 not found"
|
||||
ret
|
||||
.L1:
|
||||
mov edi,pcnet32_access
|
||||
mov ecx,7
|
||||
cld
|
||||
rep movsd
|
||||
mov ebx,88
|
||||
call dword [pcnet32_access.read_csr]
|
||||
mov ecx,eax
|
||||
mov ebx,89
|
||||
call dword [pcnet32_access.read_csr]
|
||||
shl eax,16
|
||||
or eax,ecx
|
||||
mov ecx,eax
|
||||
and ecx,0xfff
|
||||
cmp ecx,3
|
||||
jne .no_dev
|
||||
shr eax,12
|
||||
and eax,0xffff
|
||||
mov [pcnet32_private.chip_version],eax
|
||||
; PutStr "PCNET32 chip version OK"
|
||||
mov [pcnet32_private.fdx],0
|
||||
mov [pcnet32_private.mii],0
|
||||
mov [pcnet32_private.fset],0
|
||||
mov [pcnet32_private.dxsuflo],0
|
||||
mov [pcnet32_private.ltint],0
|
||||
mov eax,[pcnet32_private.chip_version]
|
||||
cmp eax,0x2420
|
||||
je .L2
|
||||
cmp eax,0x2430
|
||||
je .L3
|
||||
cmp eax,0x2621
|
||||
je .L4
|
||||
cmp eax,0x2623
|
||||
je .L5
|
||||
cmp eax,0x2624
|
||||
je .L6
|
||||
cmp eax,0x2625
|
||||
je .L7
|
||||
cmp eax,0x2626
|
||||
je .L8
|
||||
cmp eax,0x2627
|
||||
je .L9
|
||||
; PutStr "Invalid chip rev"
|
||||
jmp .no_dev
|
||||
.L2:
|
||||
; PutStr "PCnet/PCI 79C970"
|
||||
jmp .L10
|
||||
.L3:
|
||||
; PutStr "PCnet/PCI 79C970"
|
||||
jmp .L10
|
||||
.L4:
|
||||
; PutStr "PCnet/PCI II 79C970A"
|
||||
mov [pcnet32_private.fdx],1
|
||||
jmp .L10
|
||||
.L5:
|
||||
; PutStr "PCnet/FAST 79C971"
|
||||
mov [pcnet32_private.fdx],1
|
||||
mov [pcnet32_private.mii],1
|
||||
mov [pcnet32_private.fset],1
|
||||
mov [pcnet32_private.ltint],1
|
||||
jmp .L10
|
||||
.L6:
|
||||
; PutStr "PCnet/FAST+ 79C972"
|
||||
mov [pcnet32_private.fdx],1
|
||||
mov [pcnet32_private.mii],1
|
||||
mov [pcnet32_private.fset],1
|
||||
jmp .L10
|
||||
.L7:
|
||||
; PutStr "PCnet/FAST III 79C973"
|
||||
mov [pcnet32_private.fdx],1
|
||||
mov [pcnet32_private.mii],1
|
||||
jmp .L10
|
||||
.L8:
|
||||
; PutStr "PCnet/Home 79C978"
|
||||
mov [pcnet32_private.fdx],1
|
||||
mov ebx,49
|
||||
call dword [pcnet32_access.read_bcr]
|
||||
call dword [pcnet32_access.write_bcr]
|
||||
jmp .L10
|
||||
.L9:
|
||||
; PutStr "PCnet/FAST III 79C975"
|
||||
mov [pcnet32_private.fdx],1
|
||||
mov [pcnet32_private.mii],1
|
||||
.L10:
|
||||
cmp [pcnet32_private.fset],1
|
||||
jne .L11
|
||||
mov ebx,18
|
||||
call dword [pcnet32_access.read_bcr]
|
||||
or eax,0x800
|
||||
call dword [pcnet32_access.write_bcr]
|
||||
mov ebx,80
|
||||
call dword [pcnet32_access.read_csr]
|
||||
and eax,0xc00
|
||||
or eax,0xc00
|
||||
call dword [pcnet32_access.write_csr]
|
||||
mov [pcnet32_private.dxsuflo],1
|
||||
mov [pcnet32_private.ltint],1
|
||||
.L11:
|
||||
; read MAC
|
||||
mov edi,node_addr
|
||||
mov edx,ebp
|
||||
mov ecx,6
|
||||
.Lmac:
|
||||
in al,dx
|
||||
stosb
|
||||
inc edx
|
||||
loop .Lmac
|
||||
; PutStr "MAC read"
|
||||
call pcnet32_adjust_pci_device
|
||||
; PutStr "PCI done"
|
||||
mov eax,PCNET32_PORT_ASEL
|
||||
mov [pcnet32_private.options],eax
|
||||
mov [pcnet32_private.mode],word 0x0003
|
||||
mov [pcnet32_private.tlen_rlen],word (PCNET32_TX_RING_LEN_BITS or PCNET32_RX_RING_LEN_BITS)
|
||||
mov esi,node_addr
|
||||
mov edi,pcnet32_private.phys_addr
|
||||
cld
|
||||
movsd
|
||||
movsw
|
||||
mov [pcnet32_private.filter],dword 0
|
||||
mov [pcnet32_private.filter+4],dword 0
|
||||
mov dword [pcnet32_private.rx_ring],pcnet32_rx_ring
|
||||
mov dword [pcnet32_private.tx_ring],pcnet32_tx_ring
|
||||
; PutStr "Switching to 32"
|
||||
mov ebx,20
|
||||
mov eax,2
|
||||
call dword [pcnet32_access.write_bcr]
|
||||
mov ebx,1
|
||||
mov eax,(pcnet32_private and 0xffff)
|
||||
call dword [pcnet32_access.write_csr]
|
||||
mov ebx,2
|
||||
mov eax,(pcnet32_private shr 16) and 0xffff
|
||||
call dword [pcnet32_access.write_csr]
|
||||
mov ebx,0
|
||||
mov eax,1
|
||||
call dword [pcnet32_access.write_csr]
|
||||
mov esi,1
|
||||
call delay_ms
|
||||
call pcnet32_reset
|
||||
mov eax, [pci_data]
|
||||
mov [eth_status], eax
|
||||
ret
|
||||
pcnet32_poll:
|
||||
xor eax,eax
|
||||
mov [eth_rx_data_len],ax
|
||||
mov eax,[pcnet32_private.cur_rx]
|
||||
and eax,PCNET32_RX_RING_MOD_MASK
|
||||
mov ebx,eax
|
||||
imul esi,eax,PCNET32_PKT_BUF_SZ
|
||||
add esi,pcnet32_rxb
|
||||
shl ebx,4
|
||||
add ebx,pcnet32_rx_ring
|
||||
mov cx,[ebx+pcnet32_rx_head.status]
|
||||
test cx,0x8000
|
||||
jnz .L1
|
||||
cmp ch,3
|
||||
jne .L1
|
||||
; PutStr "PCNETRX"
|
||||
mov ecx,[ebx+pcnet32_rx_head.msg_length]
|
||||
and ecx,0xfff
|
||||
sub ecx,4
|
||||
mov [eth_rx_data_len],cx
|
||||
push ecx
|
||||
shr ecx,2
|
||||
mov edi,Ether_buffer
|
||||
cld
|
||||
rep movsd
|
||||
pop ecx
|
||||
and ecx,3
|
||||
rep movsb
|
||||
mov [ebx+pcnet32_rx_head.buf_length],word PCNET32_PKT_BUF_SZ_NEG
|
||||
or [ebx+pcnet32_rx_head.status],word 0x8000
|
||||
inc [pcnet32_private.cur_rx]
|
||||
.L1:
|
||||
ret
|
||||
; Pointer to 48 bit destination address in edi
|
||||
; Type of packet in bx
|
||||
; size of packet in ecx
|
||||
; pointer to packet data in esi
|
||||
pcnet32_xmit:
|
||||
push edi
|
||||
push esi
|
||||
push ebx
|
||||
push ecx
|
||||
; PutStr "PCNETTX"
|
||||
mov esi,edi
|
||||
mov edi,[pcnet32_private.cur_tx]
|
||||
imul edi,PCNET32_PKT_BUF_SZ
|
||||
add edi,pcnet32_txb ; edi=ptxb
|
||||
mov eax,edi
|
||||
cld ; copy MAC
|
||||
movsd
|
||||
movsw
|
||||
mov esi,node_addr
|
||||
cld
|
||||
movsd
|
||||
movsw
|
||||
mov [edi],bx
|
||||
add edi,2
|
||||
mov esi,[esp+8]
|
||||
mov ecx,[esp]
|
||||
push ecx
|
||||
shr ecx,2
|
||||
cld
|
||||
rep movsd
|
||||
pop ecx
|
||||
and ecx,3
|
||||
rep movsb
|
||||
; mov ecx,[esp]
|
||||
; add ecx,14 ; ETH_HLEN
|
||||
; xor eax,eax
|
||||
; pad to min length (60=ETH_ZLEN)
|
||||
; cmp ecx,60
|
||||
; jae .L1
|
||||
; sub ecx,60
|
||||
; cld
|
||||
; rep stosb
|
||||
;.L1:
|
||||
mov edi,pcnet32_tx_ring+0 ; entry=0
|
||||
mov ecx,[esp]
|
||||
add ecx,14
|
||||
cmp cx,60
|
||||
jae .L1
|
||||
mov cx,60
|
||||
.L1:
|
||||
neg cx
|
||||
mov [edi+pcnet32_tx_head.length],cx
|
||||
mov [edi+pcnet32_tx_head.misc],dword 0
|
||||
mov [edi+pcnet32_tx_head.base],eax
|
||||
mov [edi+pcnet32_tx_head.status],word 0x8300
|
||||
; trigger an immediate send poll
|
||||
mov ebx,0
|
||||
mov eax,0x0008 ; 0x0048
|
||||
mov ebp,[io_addr]
|
||||
call dword [pcnet32_access.write_csr]
|
||||
mov dword [pcnet32_private.cur_tx],0
|
||||
; wait for TX to complete
|
||||
mov ecx,[timer_ticks];[0xfdf0]
|
||||
add ecx,100
|
||||
.L2:
|
||||
mov ax,[edi+pcnet32_tx_head.status]
|
||||
test ax,0x8000
|
||||
jz .L3
|
||||
cmp ecx,[timer_ticks];[0xfdf0]
|
||||
jb .L4
|
||||
mov esi,10
|
||||
call delay_ms
|
||||
jnz .L2
|
||||
.L4:
|
||||
; PutStr "PCNET: Send timeout"
|
||||
.L3:
|
||||
mov dword [edi+pcnet32_tx_head.base],0
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop esi
|
||||
pop edi
|
||||
ret
|
955
kernel/tags/kolibri0.5.3.0/network/eth_drv/rtl8029.inc
Normal file
955
kernel/tags/kolibri0.5.3.0/network/eth_drv/rtl8029.inc
Normal file
@ -0,0 +1,955 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; RTL8029.INC ;;
|
||||
;; ;;
|
||||
;; Ethernet driver for Menuet OS ;;
|
||||
;; ;;
|
||||
;; Version 0.2 31 July 2002 ;;
|
||||
;; ;;
|
||||
;; This driver is based on the ns8390 driver from ;;
|
||||
;; the etherboot 5.0.6 project. The copyright statement is ;;
|
||||
;; ;;
|
||||
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||
;; Version 2, June 1991 ;;
|
||||
;; ;;
|
||||
;; remaining parts Copyright 2002 Mike Hibbett, ;;
|
||||
;; mikeh@oceanfree.net ;;
|
||||
;; ;;
|
||||
;; See file COPYING for details ;;
|
||||
;; ;;
|
||||
;; While this implementation handles only PCI bus RTL8029 ;;
|
||||
;; hardware, it can be easily adapted to other NE2000 clone ;;
|
||||
;; products. I just dont have any to try! ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
|
||||
;********************************************************************
|
||||
; Interface
|
||||
; rtl8029_reset
|
||||
; rtl8029_probe
|
||||
; rtl8029_poll
|
||||
; rtl8029_transmit
|
||||
;
|
||||
;********************************************************************
|
||||
|
||||
|
||||
|
||||
|
||||
;**************************************************************************
|
||||
; 8390 Register Definitions
|
||||
;**************************************************************************
|
||||
D8390_P0_COMMAND equ 0x00
|
||||
D8390_P0_PSTART equ 0x01
|
||||
D8390_P0_PSTOP equ 0x02
|
||||
D8390_P0_BOUND equ 0x03
|
||||
D8390_P0_TSR equ 0x04
|
||||
D8390_P0_TPSR equ 0x04
|
||||
D8390_P0_TBCR0 equ 0x05
|
||||
D8390_P0_TBCR1 equ 0x06
|
||||
D8390_P0_ISR equ 0x07
|
||||
D8390_P0_RSAR0 equ 0x08
|
||||
D8390_P0_RSAR1 equ 0x09
|
||||
D8390_P0_RBCR0 equ 0x0A
|
||||
D8390_P0_RBCR1 equ 0x0B
|
||||
D8390_P0_RSR equ 0x0C
|
||||
D8390_P0_RCR equ 0x0C
|
||||
D8390_P0_TCR equ 0x0D
|
||||
D8390_P0_DCR equ 0x0E
|
||||
D8390_P0_IMR equ 0x0F
|
||||
D8390_P1_COMMAND equ 0x00
|
||||
D8390_P1_PAR0 equ 0x01
|
||||
D8390_P1_PAR1 equ 0x02
|
||||
D8390_P1_PAR2 equ 0x03
|
||||
D8390_P1_PAR3 equ 0x04
|
||||
D8390_P1_PAR4 equ 0x05
|
||||
D8390_P1_PAR5 equ 0x06
|
||||
D8390_P1_CURR equ 0x07
|
||||
D8390_P1_MAR0 equ 0x08
|
||||
|
||||
D8390_COMMAND_PS0 equ 0x0 ; Page 0 select
|
||||
D8390_COMMAND_PS1 equ 0x40 ; Page 1 select
|
||||
D8390_COMMAND_PS2 equ 0x80 ; Page 2 select
|
||||
D8390_COMMAND_RD2 equ 0x20 ; Remote DMA control
|
||||
D8390_COMMAND_RD1 equ 0x10
|
||||
D8390_COMMAND_RD0 equ 0x08
|
||||
D8390_COMMAND_TXP equ 0x04 ; transmit packet
|
||||
D8390_COMMAND_STA equ 0x02 ; start
|
||||
D8390_COMMAND_STP equ 0x01 ; stop
|
||||
|
||||
D8390_COMMAND_RD2_STA equ 0x22
|
||||
D8390_COMMAND_RD2_STP equ 0x21
|
||||
D8390_COMMAND_RD1_STA equ 0x12
|
||||
D8390_COMMAND_RD0_STA equ 0x0A
|
||||
D8390_COMMAND_PS0_RD2_STP equ 0x21
|
||||
D8390_COMMAND_PS1_RD2_STP equ 0x61
|
||||
D8390_COMMAND_PS0_RD2_STA equ 0x22
|
||||
D8390_COMMAND_PS0_TXP_RD2_STA equ 0x26
|
||||
|
||||
D8390_RCR_MON equ 0x20 ; monitor mode
|
||||
|
||||
D8390_DCR_FT1 equ 0x40
|
||||
D8390_DCR_LS equ 0x08 ; Loopback select
|
||||
D8390_DCR_WTS equ 0x01 ; Word transfer select
|
||||
|
||||
D8390_DCR_FT1_LS equ 0x48
|
||||
D8390_DCR_WTS_FT1_LS equ 0x49
|
||||
|
||||
D8390_ISR_PRX equ 0x01 ; successful recv
|
||||
D8390_ISR_PTX equ 0x02 ; successful xmit
|
||||
D8390_ISR_RXE equ 0x04 ; receive error
|
||||
D8390_ISR_TXE equ 0x08 ; transmit error
|
||||
D8390_ISR_OVW equ 0x10 ; Overflow
|
||||
D8390_ISR_CNT equ 0x20 ; Counter overflow
|
||||
D8390_ISR_RDC equ 0x40 ; Remote DMA complete
|
||||
D8390_ISR_RST equ 0x80 ; reset
|
||||
|
||||
D8390_RSTAT_PRX equ 0x01 ; successful recv
|
||||
D8390_RSTAT_CRC equ 0x02 ; CRC error
|
||||
D8390_RSTAT_FAE equ 0x04 ; Frame alignment error
|
||||
D8390_RSTAT_OVER equ 0x08 ; FIFO overrun
|
||||
|
||||
D8390_TXBUF_SIZE equ 6
|
||||
D8390_RXBUF_END equ 32
|
||||
D8390_PAGE_SIZE equ 256
|
||||
|
||||
ETH_ALEN equ 6
|
||||
ETH_HLEN equ 14
|
||||
ETH_ZLEN equ 60
|
||||
ETH_FRAME_LEN equ 1514
|
||||
|
||||
FLAG_PIO equ 0x01
|
||||
FLAG_16BIT equ 0x02
|
||||
ASIC_PIO equ 0
|
||||
|
||||
VENDOR_NONE equ 0
|
||||
VENDOR_WD equ 1
|
||||
VENDOR_NOVELL equ 2
|
||||
VENDOR_3COM equ 3
|
||||
|
||||
NE_ASIC_OFFSET equ 0x10
|
||||
NE_RESET equ 0x0F ; Used to reset card
|
||||
NE_DATA equ 0x00 ; Used to read/write NIC mem
|
||||
|
||||
MEM_8192 equ 32
|
||||
MEM_16384 equ 64
|
||||
MEM_32768 equ 128
|
||||
|
||||
ISA_MAX_ADDR equ 0x400
|
||||
|
||||
uglobal
|
||||
eth_flags: db 0
|
||||
eth_vendor: db 0
|
||||
eth_nic_base: dw 0
|
||||
eth_asic_base: dw 0
|
||||
eth_memsize: db 0
|
||||
eth_rx_start: db 0
|
||||
eth_tx_start: db 0
|
||||
eth_bmem: dd 0
|
||||
eth_rmem: dd 0
|
||||
romdata: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
endg
|
||||
|
||||
iglobal
|
||||
test_data: db 'NE*000 memory',0
|
||||
test_buffer: db ' ',0
|
||||
endg
|
||||
|
||||
uglobal
|
||||
eth_type: dw 0
|
||||
pkthdr: db 0,0,0,0 ; status, next, (short) len
|
||||
pktoff: dw 0
|
||||
eth_rx_data_ptr: dd 0
|
||||
eth_tmp_len: dw 0
|
||||
endg
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; eth_pio_read
|
||||
;
|
||||
; Description
|
||||
; Read a frame from the ethernet card via Programmed I/O
|
||||
; src in ebx
|
||||
; cnt in ecx
|
||||
; dst in edi
|
||||
;***************************************************************************
|
||||
eth_pio_read:
|
||||
mov al, [eth_flags]
|
||||
and al, FLAG_16BIT
|
||||
cmp al, 0
|
||||
je epr_001
|
||||
|
||||
inc ecx
|
||||
and ecx, 0xFFFFFFFE
|
||||
|
||||
epr_001:
|
||||
mov al, D8390_COMMAND_RD2_STA
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_COMMAND
|
||||
out dx, al
|
||||
|
||||
mov al, cl
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_RBCR0
|
||||
out dx, al
|
||||
|
||||
mov al, ch
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_RBCR1
|
||||
out dx, al
|
||||
|
||||
mov al, bl
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_RSAR0
|
||||
out dx, al
|
||||
|
||||
mov al, bh
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_RSAR1
|
||||
out dx, al
|
||||
|
||||
mov al, D8390_COMMAND_RD0_STA
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_COMMAND
|
||||
out dx, al
|
||||
|
||||
mov dx, [eth_asic_base]
|
||||
add dx, ASIC_PIO
|
||||
|
||||
mov al, [eth_flags]
|
||||
and al, FLAG_16BIT
|
||||
cmp al, 0
|
||||
je epr_003
|
||||
|
||||
shr ecx, 1
|
||||
|
||||
epr_002:
|
||||
; 2 bytes at a time
|
||||
in ax, dx
|
||||
mov [edi], ax
|
||||
add edi, 2
|
||||
loop epr_002
|
||||
ret
|
||||
|
||||
epr_003:
|
||||
; 1 byte at a time
|
||||
in al, dx
|
||||
mov [edi], al
|
||||
inc edi
|
||||
loop epr_003
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; eth_pio_write
|
||||
;
|
||||
; Description
|
||||
; writes a frame to the ethernet card via Programmed I/O
|
||||
; dst in ebx
|
||||
; cnt in ecx
|
||||
; src in esi
|
||||
;***************************************************************************
|
||||
eth_pio_write:
|
||||
mov al, [eth_flags]
|
||||
and al, FLAG_16BIT
|
||||
cmp al, 0
|
||||
je epw_001
|
||||
|
||||
inc ecx
|
||||
and ecx, 0xFFFFFFFE
|
||||
|
||||
epw_001:
|
||||
mov al, D8390_COMMAND_RD2_STA
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_COMMAND
|
||||
out dx, al
|
||||
|
||||
mov al, D8390_ISR_RDC
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_ISR
|
||||
out dx, al
|
||||
|
||||
|
||||
mov al, cl
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_RBCR0
|
||||
out dx, al
|
||||
|
||||
mov al, ch
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_RBCR1
|
||||
out dx, al
|
||||
|
||||
mov al, bl
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_RSAR0
|
||||
out dx, al
|
||||
|
||||
mov al, bh
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_RSAR1
|
||||
out dx, al
|
||||
|
||||
mov al, D8390_COMMAND_RD1_STA
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_COMMAND
|
||||
out dx, al
|
||||
|
||||
mov dx, [eth_asic_base]
|
||||
add dx, ASIC_PIO
|
||||
|
||||
mov al, [eth_flags]
|
||||
and al, FLAG_16BIT
|
||||
cmp al, 0
|
||||
je epw_003
|
||||
|
||||
shr ecx, 1
|
||||
|
||||
epw_002:
|
||||
; 2 bytes at a time
|
||||
mov ax, [esi]
|
||||
add esi, 2
|
||||
out dx, ax
|
||||
|
||||
loop epw_002
|
||||
jmp epw_004
|
||||
|
||||
epw_003:
|
||||
; 1 byte at a time
|
||||
mov al, [esi]
|
||||
inc esi
|
||||
out dx, al
|
||||
loop epw_003
|
||||
|
||||
epw_004:
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_ISR
|
||||
|
||||
epw_005:
|
||||
in al, dx
|
||||
and al, D8390_ISR_RDC
|
||||
cmp al, D8390_ISR_RDC
|
||||
jne epw_005
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; rtl8029_reset
|
||||
; Description
|
||||
; Place the chip (ie, the ethernet card) into a virgin state
|
||||
; No inputs
|
||||
; All registers destroyed
|
||||
;
|
||||
;***************************************************************************
|
||||
rtl8029_reset:
|
||||
mov bx, [eth_nic_base]
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_COMMAND
|
||||
mov al, D8390_COMMAND_PS0_RD2_STP
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_DCR
|
||||
mov al, [eth_flags]
|
||||
and al, FLAG_16BIT
|
||||
cmp al, FLAG_16BIT
|
||||
jne nsr_001
|
||||
|
||||
mov al, 0x49
|
||||
jmp nsr_002
|
||||
|
||||
nsr_001:
|
||||
mov al, 0x48
|
||||
|
||||
nsr_002:
|
||||
out dx, al
|
||||
|
||||
xor al, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_RBCR0
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_RBCR1
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_RCR
|
||||
mov al, 0x20
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_TCR
|
||||
mov al, 2
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_TPSR
|
||||
mov al, [eth_tx_start]
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_PSTART
|
||||
mov al, [eth_rx_start]
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_PSTOP
|
||||
mov al, [eth_memsize]
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_BOUND
|
||||
mov al, [eth_memsize]
|
||||
dec al
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_ISR
|
||||
mov al, 0xff
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_IMR
|
||||
xor al, al
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_COMMAND
|
||||
mov al, D8390_COMMAND_PS1_RD2_STP
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P1_PAR0
|
||||
mov esi, node_addr
|
||||
mov ecx, ETH_ALEN
|
||||
|
||||
nsr_003:
|
||||
mov al, [esi]
|
||||
out dx, al
|
||||
|
||||
inc esi
|
||||
inc dx
|
||||
loop nsr_003
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P1_MAR0
|
||||
mov ecx, ETH_ALEN
|
||||
|
||||
mov al, 0xff
|
||||
|
||||
nsr_004:
|
||||
out dx, al
|
||||
inc dx
|
||||
loop nsr_004
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P1_CURR
|
||||
mov al, [eth_rx_start]
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_COMMAND
|
||||
mov al, D8390_COMMAND_PS0_RD2_STA
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_ISR
|
||||
mov al, 0xff
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_TCR
|
||||
mov al, 0
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_RCR
|
||||
mov al, 4
|
||||
out dx, al
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; rtl8029_probe
|
||||
; Description
|
||||
; Searches for an ethernet card, enables it and clears the rx buffer
|
||||
; If a card was found, it enables the ethernet -> TCPIP link
|
||||
;
|
||||
;***************************************************************************
|
||||
rtl8029_probe:
|
||||
mov eax, [io_addr]
|
||||
mov [eth_nic_base], ax ; The IO address space is 16 bit only
|
||||
|
||||
mov al, VENDOR_NONE
|
||||
mov [eth_vendor], al
|
||||
|
||||
mov al, [eth_vendor]
|
||||
cmp al, VENDOR_NONE
|
||||
|
||||
jne ep_check_have_vendor
|
||||
xor eax, eax
|
||||
mov [eth_bmem], eax
|
||||
|
||||
mov al, FLAG_PIO
|
||||
mov [eth_flags], al
|
||||
|
||||
mov ax, [eth_nic_base]
|
||||
add ax, NE_ASIC_OFFSET
|
||||
mov [eth_asic_base], ax
|
||||
|
||||
mov al, MEM_16384
|
||||
mov [eth_memsize], al
|
||||
|
||||
mov al, 32
|
||||
mov [eth_tx_start], al
|
||||
|
||||
add al, D8390_TXBUF_SIZE
|
||||
mov [eth_rx_start], al
|
||||
|
||||
mov dx, [eth_asic_base]
|
||||
add dx, NE_RESET
|
||||
|
||||
in al, dx
|
||||
out dx, al
|
||||
|
||||
in al, 0x84
|
||||
|
||||
mov bx, [eth_nic_base]
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_COMMAND
|
||||
mov al, D8390_COMMAND_RD2_STP
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_RCR
|
||||
mov al, D8390_RCR_MON
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_DCR
|
||||
mov al, D8390_DCR_FT1_LS
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_PSTART
|
||||
mov al, MEM_8192
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_PSTOP
|
||||
mov al, MEM_16384
|
||||
out dx, al
|
||||
|
||||
mov esi, test_data
|
||||
mov ebx, 8192
|
||||
mov ecx, 14
|
||||
call eth_pio_write
|
||||
|
||||
mov ebx, 8192
|
||||
mov ecx, 14
|
||||
mov edi, test_buffer
|
||||
call eth_pio_read
|
||||
|
||||
mov esi, test_buffer
|
||||
mov edi, test_data
|
||||
mov ecx, 13
|
||||
cld
|
||||
rep cmpsb
|
||||
|
||||
je ep_set_vendor
|
||||
|
||||
mov al, [eth_flags]
|
||||
or al, FLAG_16BIT
|
||||
mov [eth_flags], al
|
||||
|
||||
mov al, MEM_32768
|
||||
mov [eth_memsize], al
|
||||
|
||||
mov al, 64
|
||||
mov [eth_tx_start], al
|
||||
|
||||
add al, D8390_TXBUF_SIZE
|
||||
mov [eth_rx_start], al
|
||||
|
||||
mov bx, [eth_nic_base]
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_DCR
|
||||
mov al, D8390_DCR_WTS_FT1_LS
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_PSTART
|
||||
mov al, MEM_16384
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_PSTOP
|
||||
mov al, MEM_32768
|
||||
out dx, al
|
||||
|
||||
mov esi, test_data
|
||||
mov ebx, 16384
|
||||
mov ecx, 14
|
||||
call eth_pio_write
|
||||
|
||||
mov ebx, 16384
|
||||
mov ecx, 14
|
||||
mov edi, test_buffer
|
||||
call eth_pio_read
|
||||
|
||||
mov esi, test_buffer
|
||||
mov edi, test_data
|
||||
mov ecx, 13
|
||||
cld
|
||||
rep cmpsb
|
||||
|
||||
ep_set_vendor:
|
||||
; this bit is odd - probably left over from my hacking
|
||||
mov ax, [eth_nic_base]
|
||||
cmp ax, 0
|
||||
je rtl8029_exit
|
||||
cmp ax, ISA_MAX_ADDR
|
||||
jbe ep_001
|
||||
mov al, [eth_flags]
|
||||
or al, FLAG_16BIT
|
||||
mov [eth_flags], al
|
||||
|
||||
ep_001:
|
||||
mov al, VENDOR_NOVELL
|
||||
mov [eth_vendor], al
|
||||
|
||||
mov ebx, 0
|
||||
mov ecx, 16
|
||||
mov edi, romdata
|
||||
call eth_pio_read
|
||||
|
||||
|
||||
mov ecx, ETH_ALEN
|
||||
mov esi, romdata
|
||||
mov edi, node_addr
|
||||
|
||||
mov bl, [eth_flags]
|
||||
and bl, FLAG_16BIT
|
||||
|
||||
ep_002:
|
||||
mov al, [esi]
|
||||
mov [edi], al
|
||||
|
||||
inc edi
|
||||
inc esi
|
||||
cmp bl, FLAG_16BIT
|
||||
jne ep_003
|
||||
|
||||
inc esi
|
||||
|
||||
ep_003:
|
||||
loop ep_002
|
||||
|
||||
ep_check_have_vendor:
|
||||
mov al, [eth_vendor]
|
||||
cmp al, VENDOR_NONE
|
||||
je rtl8029_exit
|
||||
|
||||
cmp al, VENDOR_3COM
|
||||
je ep_reset_card
|
||||
|
||||
mov eax, [eth_bmem]
|
||||
mov [eth_rmem], eax
|
||||
|
||||
ep_reset_card:
|
||||
; Reset the card
|
||||
call rtl8029_reset
|
||||
|
||||
; Indicate that we have successfully reset the card
|
||||
mov eax, [pci_data]
|
||||
mov [eth_status], eax
|
||||
|
||||
rtl8029_exit:
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; rtl8029_poll
|
||||
;
|
||||
; Description
|
||||
; Polls the ethernet card for a received packet
|
||||
; Received data, if any, ends up in Ether_buffer
|
||||
;
|
||||
;***************************************************************************
|
||||
rtl8029_poll:
|
||||
mov eax, Ether_buffer
|
||||
mov [eth_rx_data_ptr], eax
|
||||
|
||||
mov bx, [eth_nic_base]
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_RSR
|
||||
in al, dx
|
||||
|
||||
and al, D8390_RSTAT_PRX
|
||||
cmp al, D8390_RSTAT_PRX
|
||||
jne nsp_exit
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_BOUND
|
||||
in al, dx
|
||||
inc al
|
||||
|
||||
cmp al, [eth_memsize]
|
||||
jb nsp_001
|
||||
|
||||
mov al, [eth_rx_start]
|
||||
|
||||
nsp_001:
|
||||
mov ch, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_COMMAND
|
||||
mov al, D8390_COMMAND_PS1
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P1_CURR
|
||||
in al, dx ; get current page
|
||||
mov cl, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_COMMAND
|
||||
mov al, D8390_COMMAND_PS0
|
||||
out dx, al
|
||||
|
||||
cmp cl, [eth_memsize]
|
||||
jb nsp_002
|
||||
|
||||
mov cl, [eth_rx_start]
|
||||
|
||||
nsp_002:
|
||||
cmp cl, ch
|
||||
je nsp_exit
|
||||
|
||||
xor ax, ax
|
||||
mov ah, ch
|
||||
|
||||
mov [pktoff], ax
|
||||
|
||||
mov al, [eth_flags]
|
||||
and al, FLAG_PIO
|
||||
cmp al, FLAG_PIO
|
||||
jne nsp_003
|
||||
|
||||
movzx ebx, word [pktoff]
|
||||
mov edi, pkthdr
|
||||
mov ecx, 4
|
||||
call eth_pio_read
|
||||
jmp nsp_004
|
||||
|
||||
nsp_003:
|
||||
mov edi, [eth_rmem]
|
||||
movzx eax, word [pktoff]
|
||||
add edi, eax
|
||||
mov eax, [edi]
|
||||
mov [pkthdr], eax
|
||||
|
||||
nsp_004:
|
||||
mov ax, [pktoff]
|
||||
add ax, 4
|
||||
mov [pktoff], ax
|
||||
|
||||
mov ax, [pkthdr + 2]
|
||||
sub ax, 4
|
||||
|
||||
mov [eth_tmp_len], ax
|
||||
|
||||
cmp ax, ETH_ZLEN
|
||||
jb nsp_exit
|
||||
|
||||
cmp ax, ETH_FRAME_LEN
|
||||
ja nsp_exit
|
||||
|
||||
mov al, [pkthdr]
|
||||
and al, D8390_RSTAT_PRX
|
||||
cmp al, D8390_RSTAT_PRX
|
||||
jne nsp_exit
|
||||
|
||||
; Right, we can now get the data
|
||||
|
||||
mov ax, [eth_tmp_len]
|
||||
mov [eth_rx_data_len], ax
|
||||
|
||||
xor ebx, ebx
|
||||
mov bh, [eth_memsize]
|
||||
sub bx, [pktoff]
|
||||
|
||||
cmp [eth_tmp_len], bx
|
||||
jbe nsp_005
|
||||
|
||||
mov al, [eth_flags]
|
||||
and al, FLAG_PIO
|
||||
cmp al, FLAG_PIO
|
||||
jne nsp_006
|
||||
|
||||
push ebx
|
||||
mov ecx, ebx
|
||||
xor ebx, ebx
|
||||
mov bx, [pktoff]
|
||||
mov edi, [eth_rx_data_ptr]
|
||||
call eth_pio_read
|
||||
pop ebx
|
||||
jmp nsp_007
|
||||
|
||||
nsp_006:
|
||||
; Not implemented, as we are using PIO mode on this card
|
||||
|
||||
nsp_007:
|
||||
xor ax, ax
|
||||
mov ah, [eth_rx_start]
|
||||
mov [pktoff], ax
|
||||
|
||||
mov eax, [eth_rx_data_ptr]
|
||||
add eax, ebx
|
||||
mov [eth_rx_data_ptr], eax
|
||||
|
||||
mov ax, [eth_tmp_len]
|
||||
sub ax, bx
|
||||
mov [eth_tmp_len], ax
|
||||
|
||||
nsp_005:
|
||||
mov al, [eth_flags]
|
||||
and al, FLAG_PIO
|
||||
cmp al, FLAG_PIO
|
||||
jne nsp_008
|
||||
|
||||
xor ebx, ebx
|
||||
mov bx, [pktoff]
|
||||
xor ecx, ecx
|
||||
mov cx, [eth_tmp_len]
|
||||
mov edi, [eth_rx_data_ptr]
|
||||
call eth_pio_read
|
||||
jmp nsp_009
|
||||
|
||||
nsp_008:
|
||||
; Not implemented, as we are using PIO mode on this card
|
||||
|
||||
nsp_009:
|
||||
mov al, [pkthdr+1]
|
||||
cmp al, [eth_rx_start]
|
||||
jne nsp_010
|
||||
|
||||
mov al, [eth_memsize]
|
||||
|
||||
nsp_010:
|
||||
mov dx, [eth_nic_base]
|
||||
add dx, D8390_P0_BOUND
|
||||
dec al
|
||||
out dx, al
|
||||
|
||||
nsp_exit:
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; rtl8029_transmit
|
||||
;
|
||||
; Description
|
||||
; Transmits a packet of data via the ethernet card
|
||||
; Pointer to 48 bit destination address in edi
|
||||
; Type of packet in bx
|
||||
; size of packet in ecx
|
||||
; pointer to packet data in esi
|
||||
;
|
||||
;***************************************************************************
|
||||
rtl8029_transmit:
|
||||
mov [eth_type], bx
|
||||
|
||||
pusha
|
||||
|
||||
mov esi, edi
|
||||
xor bx, bx
|
||||
mov bh, [eth_tx_start]
|
||||
mov ecx, ETH_ALEN
|
||||
call eth_pio_write
|
||||
|
||||
mov esi, node_addr
|
||||
xor bx, bx
|
||||
mov bh, [eth_tx_start]
|
||||
add bx, ETH_ALEN
|
||||
mov ecx, ETH_ALEN
|
||||
call eth_pio_write
|
||||
|
||||
mov esi, eth_type
|
||||
xor bx, bx
|
||||
mov bh, [eth_tx_start]
|
||||
add bx, ETH_ALEN
|
||||
add bx, ETH_ALEN
|
||||
mov ecx, 2
|
||||
call eth_pio_write
|
||||
|
||||
popa
|
||||
|
||||
xor bx, bx
|
||||
mov bh, [eth_tx_start]
|
||||
add bx, ETH_HLEN
|
||||
push ecx
|
||||
call eth_pio_write
|
||||
pop ecx
|
||||
|
||||
add ecx, ETH_HLEN
|
||||
cmp ecx, ETH_ZLEN
|
||||
jae nst_001
|
||||
|
||||
mov ecx, ETH_ZLEN
|
||||
|
||||
nst_001:
|
||||
push ecx
|
||||
|
||||
mov bx, [eth_nic_base]
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_COMMAND
|
||||
mov al, D8390_COMMAND_PS0_RD2_STA
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_TPSR
|
||||
mov al, [eth_tx_start]
|
||||
out dx, al
|
||||
|
||||
pop ecx
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_TBCR0
|
||||
mov al, cl
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_TBCR1
|
||||
mov al, ch
|
||||
out dx, al
|
||||
|
||||
mov dx, bx
|
||||
add dx, D8390_P0_COMMAND
|
||||
mov al, D8390_COMMAND_PS0_TXP_RD2_STA
|
||||
out dx, al
|
||||
|
||||
ret
|
595
kernel/tags/kolibri0.5.3.0/network/eth_drv/rtl8139.inc
Normal file
595
kernel/tags/kolibri0.5.3.0/network/eth_drv/rtl8139.inc
Normal file
@ -0,0 +1,595 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; RTL8139.INC ;;
|
||||
;; ;;
|
||||
;; Ethernet driver for Menuet OS ;;
|
||||
;; ;;
|
||||
;; Version 0.2 11 August 2003 ;;
|
||||
;; ;;
|
||||
;; Driver for chips of RealTek 8139 family ;;
|
||||
;; References: ;;
|
||||
;; www.realtek.com.hw - data sheets ;;
|
||||
;; rtl8139.c - linux driver ;;
|
||||
;; 8139too.c - linux driver ;;
|
||||
;; ethernet driver template by Mike Hibbett ;;
|
||||
;; ;;
|
||||
;; The copyright statement is ;;
|
||||
;; ;;
|
||||
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||
;; Version 2, June 1991 ;;
|
||||
;; ;;
|
||||
;; Copyright 2003 Endre Kozma, ;;
|
||||
;; endre.kozma@axelero.hu ;;
|
||||
;; ;;
|
||||
;; See file COPYING for details ;;
|
||||
;; ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
ETH_ALEN equ 6
|
||||
ETH_HLEN equ (2 * ETH_ALEN + 2)
|
||||
ETH_ZLEN equ 60 ; 60 + 4bytes auto payload for
|
||||
; mininmum 64bytes frame length
|
||||
|
||||
PCI_REG_COMMAND equ 0x04 ; command register
|
||||
PCI_BIT_PIO equ 0 ; bit0: io space control
|
||||
PCI_BIT_MMIO equ 1 ; bit1: memory space control
|
||||
PCI_BIT_MASTER equ 2 ; bit2: device acts as a PCI master
|
||||
|
||||
RTL8139_REG_MAR0 equ 0x08 ; multicast filter register 0
|
||||
RTL8139_REG_MAR4 equ 0x0c ; multicast filter register 4
|
||||
RTL8139_REG_TSD0 equ 0x10 ; transmit status of descriptor
|
||||
RTL8139_REG_TSAD0 equ 0x20 ; transmit start address of descriptor
|
||||
RTL8139_REG_RBSTART equ 0x30 ; RxBuffer start address
|
||||
RTL8139_REG_COMMAND equ 0x37 ; command register
|
||||
RTL8139_REG_CAPR equ 0x38 ; current address of packet read
|
||||
RTL8139_REG_IMR equ 0x3c ; interrupt mask register
|
||||
RTL8139_REG_ISR equ 0x3e ; interrupt status register
|
||||
RTL8139_REG_TXCONFIG equ 0x40 ; transmit configuration register
|
||||
RTL8139_REG_TXCONFIG_0 equ 0x40 ; transmit configuration register 0
|
||||
RTL8139_REG_TXCONFIG_1 equ 0x41 ; transmit configuration register 1
|
||||
RTL8139_REG_TXCONFIG_2 equ 0x42 ; transmit configuration register 2
|
||||
RTL8139_REG_TXCONFIG_3 equ 0x43 ; transmit configuration register 3
|
||||
RTL8139_REG_RXCONFIG equ 0x44 ; receive configuration register 0
|
||||
RTL8139_REG_RXCONFIG_0 equ 0x44 ; receive configuration register 0
|
||||
RTL8139_REG_RXCONFIG_1 equ 0x45 ; receive configuration register 1
|
||||
RTL8139_REG_RXCONFIG_2 equ 0x46 ; receive configuration register 2
|
||||
RTL8139_REG_RXCONFIG_3 equ 0x47 ; receive configuration register 3
|
||||
RTL8139_REG_MPC equ 0x4c ; missed packet counter
|
||||
RTL8139_REG_9346CR equ 0x50 ; serial eeprom 93C46 command register
|
||||
RTL8139_REG_CONFIG1 equ 0x52 ; configuration register 1
|
||||
RTL8139_REG_CONFIG4 equ 0x5a ; configuration register 4
|
||||
RTL8139_REG_HLTCLK equ 0x5b ; undocumented halt clock register
|
||||
RTL8139_REG_BMCR equ 0x62 ; basic mode control register
|
||||
RTL8139_REG_ANAR equ 0x66 ; auto negotiation advertisement register
|
||||
|
||||
; 5.1 packet header
|
||||
RTL8139_BIT_RUNT equ 4 ; total packet length < 64 bytes
|
||||
RTL8139_BIT_LONG equ 3 ; total packet length > 4k
|
||||
RTL8139_BIT_CRC equ 2 ; crc error occured
|
||||
RTL8139_BIT_FAE equ 1 ; frame alignment error occured
|
||||
RTL8139_BIT_ROK equ 0 ; received packet is ok
|
||||
; 5.4 command register
|
||||
RTL8139_BIT_RST equ 4 ; reset bit
|
||||
RTL8139_BIT_RE equ 3 ; receiver enabled
|
||||
RTL8139_BIT_TE equ 2 ; transmitter enabled
|
||||
RTL8139_BIT_BUFE equ 0 ; rx buffer is empty, no packet stored
|
||||
; 5.6 interrupt status register
|
||||
RTL8139_BIT_ISR_TOK equ 2 ; transmit ok
|
||||
RTL8139_BIT_ISR_RER equ 1 ; receive error interrupt
|
||||
RTL8139_BIT_ISR_ROK equ 0 ; receive ok
|
||||
; 5.7 transmit configyration register
|
||||
RTL8139_BIT_TX_MXDMA equ 8 ; Max DMA burst size per Tx DMA burst
|
||||
RTL8139_BIT_TXRR equ 4 ; Tx Retry count 16+(TXRR*16)
|
||||
; 5.8 receive configuration register
|
||||
RTL8139_BIT_RXFTH equ 13 ; Rx fifo threshold
|
||||
RTL8139_BIT_RBLEN equ 11 ; Ring buffer length indicator
|
||||
RTL8139_BIT_RX_MXDMA equ 8 ; Max DMA burst size per Rx DMA burst
|
||||
RTL8139_BIT_NOWRAP equ 7 ; transfered data wrapping
|
||||
RTL8139_BIT_9356SEL equ 6 ; eeprom selector 9346/9356
|
||||
RTL8139_BIT_AER equ 5 ; accept error packets
|
||||
RTL8139_BIT_AR equ 4 ; accept runt packets
|
||||
RTL8139_BIT_AB equ 3 ; accept broadcast packets
|
||||
RTL8139_BIT_AM equ 2 ; accept multicast packets
|
||||
RTL8139_BIT_APM equ 1 ; accept physical match packets
|
||||
RTL8139_BIT_AAP equ 0 ; accept all packets
|
||||
; 5.9 93C46/93C56 command register
|
||||
RTL8139_BIT_93C46_EEM1 equ 7 ; RTL8139 eeprom operating mode1
|
||||
RTL8139_BIT_93C46_EEM0 equ 6 ; RTL8139 eeprom operating mode0
|
||||
RTL8139_BIT_93C46_EECS equ 3 ; chip select
|
||||
RTL8139_BIT_93C46_EESK equ 2 ; serial data clock
|
||||
RTL8139_BIT_93C46_EEDI equ 1 ; serial data input
|
||||
RTL8139_BIT_93C46_EEDO equ 0 ; serial data output
|
||||
; 5.11 configuration register 1
|
||||
RTL8139_BIT_LWACT equ 4 ; see RTL8139_REG_CONFIG1
|
||||
RTL8139_BIT_SLEEP equ 1 ; sleep bit at older chips
|
||||
RTL8139_BIT_PWRDWN equ 0 ; power down bit at older chips
|
||||
RTL8139_BIT_PMEn equ 0 ; power management enabled
|
||||
; 5.14 configuration register 4
|
||||
RTL8139_BIT_LWPTN equ 2 ; see RTL8139_REG_CONFIG4
|
||||
; 6.2 transmit status register
|
||||
RTL8139_BIT_ERTXTH equ 16 ; early TX threshold
|
||||
RTL8139_BIT_TOK equ 15 ; transmit ok
|
||||
RTL8139_BIT_OWN equ 13 ; tx DMA operation is completed
|
||||
; 6.18 basic mode control register
|
||||
RTL8139_BIT_ANE equ 12 ; auto negotiation enable
|
||||
; 6.20 auto negotiation advertisement register
|
||||
RTL8139_BIT_TXFD equ 8 ; 100base-T full duplex
|
||||
RTL8139_BIT_TX equ 7 ; 100base-T
|
||||
RTL8139_BIT_10FD equ 6 ; 10base-T full duplex
|
||||
RTL8139_BIT_10 equ 5 ; 10base-T
|
||||
RTL8139_BIT_SELECTOR equ 0 ; binary encoded selector CSMA/CD=00001
|
||||
; RX/TX buffer size
|
||||
RTL8139_RBLEN equ 0 ; 0==8K 1==16k 2==32k 3==64k
|
||||
RTL8139_RX_BUFFER_SIZE equ (8192 shl RTL8139_RBLEN)
|
||||
MAX_ETH_FRAME_SIZE equ 1516 ; exactly 1514 wthout CRC
|
||||
RTL8139_NUM_TX_DESC equ 4
|
||||
RTL8139_TX_BUFFER_SIZE equ (MAX_ETH_FRAME_SIZE * RTL8139_NUM_TX_DESC)
|
||||
RTL8139_TXRR equ 8 ; total retries = 16+(TXRR*16)
|
||||
RTL8139_TX_MXDMA equ 6 ; 0==16 1==32 2==64 3==128
|
||||
; 4==256 5==512 6==1024 7==2048
|
||||
RTL8139_ERTXTH equ 8 ; in unit of 32 bytes e.g:(8*32)=256
|
||||
RTL8139_RX_MXDMA equ 7 ; 0==16 1==32 2==64 3==128
|
||||
; 4==256 5==512 6==1024 7==unlimited
|
||||
RTL8139_RXFTH equ 7 ; 0==16 1==32 2==64 3==128
|
||||
; 4==256 5==512 6==1024 7==no threshold
|
||||
RTL8139_RX_CONFIG equ ((RTL8139_RBLEN shl RTL8139_BIT_RBLEN) \
|
||||
or (RTL8139_RX_MXDMA shl RTL8139_BIT_RX_MXDMA) \
|
||||
or (1 shl RTL8139_BIT_NOWRAP) \
|
||||
or (RTL8139_RXFTH shl RTL8139_BIT_RXFTH) \
|
||||
or (1 shl RTL8139_BIT_AB) or (1 shl RTL8139_BIT_APM) \
|
||||
or (1 shl RTL8139_BIT_AER) or (1 shl RTL8139_BIT_AR) \
|
||||
or (1 shl RTL8139_BIT_AM))
|
||||
RTL8139_TX_TIMEOUT equ 30 ; 300 milliseconds timeout
|
||||
|
||||
EE_93C46_REG_ETH_ID equ 7 ; MAC offset
|
||||
EE_93C46_READ_CMD equ (6 shl 6) ; 110b + 6bit address
|
||||
EE_93C56_READ_CMD equ (6 shl 8) ; 110b + 8bit address
|
||||
EE_93C46_CMD_LENGTH equ 9 ; start bit + cmd + 6bit address
|
||||
EE_93C56_CMD_LENGTH equ 11 ; start bit + cmd + 8bit ddress
|
||||
|
||||
VER_RTL8139 equ 1100000b
|
||||
VER_RTL8139A equ 1110000b
|
||||
; VER_RTL8139AG equ 1110100b
|
||||
VER_RTL8139B equ 1111000b
|
||||
VER_RTL8130 equ VER_RTL8139B
|
||||
VER_RTL8139C equ 1110100b
|
||||
VER_RTL8100 equ 1111010b
|
||||
VER_RTL8100B equ 1110101b
|
||||
VER_RTL8139D equ VER_RTL8100B
|
||||
VER_RTL8139CP equ 1110110b
|
||||
VER_RTL8101 equ 1110111b
|
||||
|
||||
IDX_RTL8139 equ 0
|
||||
IDX_RTL8139A equ 1
|
||||
IDX_RTL8139B equ 2
|
||||
IDX_RTL8139C equ 3
|
||||
IDX_RTL8100 equ 4
|
||||
IDX_RTL8139D equ 5
|
||||
IDX_RTL8139D equ 6
|
||||
IDX_RTL8101 equ 7
|
||||
|
||||
|
||||
; These two must be 4 byte aligned ( which they are )
|
||||
rtl8139_rx_buff equ eth_data_start
|
||||
rtl8139_tx_buff equ rtl8139_rx_buff + (RTL8139_RX_BUFFER_SIZE + MAX_ETH_FRAME_SIZE)
|
||||
|
||||
uglobal
|
||||
align 4
|
||||
rtl8139_rx_buff_offset: dd 0
|
||||
curr_tx_desc: dd 0
|
||||
endg
|
||||
|
||||
iglobal
|
||||
hw_ver_array: db VER_RTL8139, VER_RTL8139A, VER_RTL8139B, VER_RTL8139C
|
||||
db VER_RTL8100, VER_RTL8139D, VER_RTL8139CP, VER_RTL8101
|
||||
HW_VER_ARRAY_SIZE = $-hw_ver_array
|
||||
endg
|
||||
|
||||
uglobal
|
||||
hw_ver_id: db 0
|
||||
endg
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; rtl8139_probe
|
||||
; Description
|
||||
; Searches for an ethernet card, enables it and clears the rx buffer
|
||||
; If a card was found, it enables the ethernet -> TCPIP link
|
||||
; Destroyed registers
|
||||
; eax, ebx, ecx, edx
|
||||
;
|
||||
;***************************************************************************
|
||||
rtl8139_probe:
|
||||
; enable the device
|
||||
mov al, 2
|
||||
mov ah, [pci_bus]
|
||||
mov bh, [pci_dev]
|
||||
mov bl, PCI_REG_COMMAND
|
||||
call pci_read_reg
|
||||
mov cx, ax
|
||||
or cl, (1 shl PCI_BIT_MASTER) or (1 shl PCI_BIT_PIO)
|
||||
and cl, not (1 shl PCI_BIT_MMIO)
|
||||
mov al, 2
|
||||
mov ah, [pci_bus]
|
||||
mov bh, [pci_dev]
|
||||
mov bl, PCI_REG_COMMAND
|
||||
call pci_write_reg
|
||||
; get chip version
|
||||
mov edx, [io_addr]
|
||||
add edx, RTL8139_REG_TXCONFIG_2
|
||||
in ax, dx
|
||||
shr ah, 2
|
||||
shr ax, 6
|
||||
and al, 01111111b
|
||||
mov ecx, HW_VER_ARRAY_SIZE-1
|
||||
.chip_ver_loop:
|
||||
cmp al, [hw_ver_array+ecx]
|
||||
je .chip_ver_found
|
||||
dec ecx
|
||||
jns .chip_ver_loop
|
||||
xor cl, cl ; default RTL8139
|
||||
.chip_ver_found:
|
||||
mov [hw_ver_id], cl
|
||||
; wake up the chip
|
||||
mov edx, [io_addr]
|
||||
add edx, RTL8139_REG_HLTCLK
|
||||
mov al, 'R' ; run the clock
|
||||
out dx, al
|
||||
; unlock config and BMCR registers
|
||||
add edx, RTL8139_REG_9346CR - RTL8139_REG_HLTCLK
|
||||
mov al, (1 shl RTL8139_BIT_93C46_EEM1) or (1 shl RTL8139_BIT_93C46_EEM0)
|
||||
out dx, al
|
||||
; enable power management
|
||||
add edx, RTL8139_REG_CONFIG1 - RTL8139_REG_9346CR
|
||||
in al, dx
|
||||
cmp byte [hw_ver_id], IDX_RTL8139B
|
||||
jl .old_chip
|
||||
; set LWAKE pin to active high (default value).
|
||||
; it is for Wake-On-LAN functionality of some motherboards.
|
||||
; this signal is used to inform the motherboard to execute a wake-up process.
|
||||
; only at newer chips.
|
||||
or al, (1 shl RTL8139_BIT_PMEn)
|
||||
and al, not (1 shl RTL8139_BIT_LWACT)
|
||||
out dx, al
|
||||
add edx, RTL8139_REG_CONFIG4 - RTL8139_REG_CONFIG1
|
||||
in al, dx
|
||||
and al, not (1 shl RTL8139_BIT_LWPTN)
|
||||
out dx, al
|
||||
jmp .finish_wake_up
|
||||
.old_chip:
|
||||
; wake up older chips
|
||||
and al, not ((1 shl RTL8139_BIT_SLEEP) or (1 shl RTL8139_BIT_PWRDWN))
|
||||
out dx, al
|
||||
.finish_wake_up:
|
||||
; lock config and BMCR registers
|
||||
xor al, al
|
||||
mov edx, [io_addr]
|
||||
add edx, RTL8139_REG_9346CR
|
||||
out dx, al
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; rt8139_reset
|
||||
; Description
|
||||
; Place the chip (ie, the ethernet card) into a virgin state
|
||||
; Destroyed registers
|
||||
; eax, ebx, ecx, edx
|
||||
;
|
||||
;***************************************************************************
|
||||
rtl8139_reset:
|
||||
mov edx, [io_addr]
|
||||
add edx, RTL8139_REG_COMMAND
|
||||
mov al, 1 shl RTL8139_BIT_RST
|
||||
out dx, al
|
||||
mov cx, 1000 ; wait no longer for the reset
|
||||
.wait_for_reset:
|
||||
in al, dx
|
||||
test al, 1 shl RTL8139_BIT_RST
|
||||
jz .reset_completed ; RST remains 1 during reset
|
||||
dec cx
|
||||
jns .wait_for_reset
|
||||
.reset_completed:
|
||||
; get MAC (hardware address)
|
||||
mov ecx, 2
|
||||
.mac_read_loop:
|
||||
lea eax, [EE_93C46_REG_ETH_ID+ecx]
|
||||
push ecx
|
||||
call rtl8139_read_eeprom
|
||||
pop ecx
|
||||
mov [node_addr+ecx*2], ax
|
||||
dec ecx
|
||||
jns .mac_read_loop
|
||||
; unlock config and BMCR registers
|
||||
mov edx, [io_addr]
|
||||
add edx, RTL8139_REG_9346CR
|
||||
mov al, (1 shl RTL8139_BIT_93C46_EEM1) or (1 shl RTL8139_BIT_93C46_EEM0)
|
||||
out dx, al
|
||||
; initialize multicast registers (no filtering)
|
||||
mov eax, 0xffffffff
|
||||
add edx, RTL8139_REG_MAR0 - RTL8139_REG_9346CR
|
||||
out dx, eax
|
||||
add edx, RTL8139_REG_MAR4 - RTL8139_REG_MAR0
|
||||
out dx, eax
|
||||
; enable Rx/Tx
|
||||
mov al, (1 shl RTL8139_BIT_RE) or (1 shl RTL8139_BIT_TE)
|
||||
add edx, RTL8139_REG_COMMAND - RTL8139_REG_MAR4
|
||||
out dx, al
|
||||
; 32k Rxbuffer, unlimited dma burst, no wrapping, no rx threshold
|
||||
; accept broadcast packets, accept physical match packets
|
||||
mov ax, RTL8139_RX_CONFIG
|
||||
add edx, RTL8139_REG_RXCONFIG - RTL8139_REG_COMMAND
|
||||
out dx, ax
|
||||
; 1024 bytes DMA burst, total retries = 16 + 8 * 16 = 144
|
||||
mov ax, (RTL8139_TX_MXDMA shl RTL8139_BIT_TX_MXDMA) \
|
||||
or (RTL8139_TXRR shl RTL8139_BIT_TXRR)
|
||||
add edx, RTL8139_REG_TXCONFIG - RTL8139_REG_RXCONFIG
|
||||
out dx, ax
|
||||
; enable auto negotiation
|
||||
add edx, RTL8139_REG_BMCR - RTL8139_REG_TXCONFIG
|
||||
in ax, dx
|
||||
or ax, (1 shl RTL8139_BIT_ANE)
|
||||
out dx, ax
|
||||
; set auto negotiation advertisement
|
||||
add edx, RTL8139_REG_ANAR - RTL8139_REG_BMCR
|
||||
in ax, dx
|
||||
or ax, (1 shl RTL8139_BIT_SELECTOR) or (1 shl RTL8139_BIT_10) \
|
||||
or (1 shl RTL8139_BIT_10FD) or (1 shl RTL8139_BIT_TX) \
|
||||
or (1 shl RTL8139_BIT_TXFD)
|
||||
out dx, ax
|
||||
; lock config and BMCR registers
|
||||
xor eax, eax
|
||||
add edx, RTL8139_REG_9346CR - RTL8139_REG_ANAR
|
||||
out dx, al
|
||||
; init RX/TX pointers
|
||||
mov [rtl8139_rx_buff_offset], eax
|
||||
mov [curr_tx_desc], eax
|
||||
; clear missing packet counter
|
||||
add edx, RTL8139_REG_MPC - RTL8139_REG_9346CR
|
||||
out dx, eax
|
||||
; disable all interrupts
|
||||
add edx, RTL8139_REG_IMR - RTL8139_REG_MPC
|
||||
out dx, ax
|
||||
; set RxBuffer address, init RX buffer offset, init TX ring
|
||||
mov eax, rtl8139_rx_buff
|
||||
add edx, RTL8139_REG_RBSTART - RTL8139_REG_IMR
|
||||
out dx, eax
|
||||
; Indicate that we have successfully reset the card
|
||||
mov eax, [pci_data]
|
||||
mov [eth_status], eax
|
||||
ret
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; rtl8139_read_eeprom
|
||||
; Description
|
||||
; reads eeprom type 93c46 and 93c56
|
||||
; Parameters
|
||||
; al - word to be read (6bit in case of 93c46 and 8bit otherwise)
|
||||
; Return value
|
||||
; ax - word read in
|
||||
; Destroyed register(s)
|
||||
; eax, cx, ebx, edx
|
||||
;
|
||||
;***************************************************************************
|
||||
rtl8139_read_eeprom:
|
||||
movzx ebx, al
|
||||
mov edx, [io_addr]
|
||||
add edx, RTL8139_REG_RXCONFIG
|
||||
in al, dx
|
||||
test al, (1 shl RTL8139_BIT_9356SEL)
|
||||
jz .type_93c46
|
||||
; and bl, 01111111b ; don't care first bit
|
||||
or bx, EE_93C56_READ_CMD ; it contains start bit
|
||||
mov cx, EE_93C56_CMD_LENGTH-1 ; cmd_loop counter
|
||||
jmp .read_eeprom
|
||||
.type_93c46:
|
||||
and bl, 00111111b
|
||||
or bx, EE_93C46_READ_CMD ; it contains start bit
|
||||
mov cx, EE_93C46_CMD_LENGTH-1 ; cmd_loop counter
|
||||
.read_eeprom:
|
||||
add edx, RTL8139_REG_9346CR - RTL8139_REG_RXCONFIG_0
|
||||
; mov al, (1 shl RTL8139_BIT_93C46_EEM1)
|
||||
; out dx, al
|
||||
mov al, (1 shl RTL8139_BIT_93C46_EEM1) \
|
||||
or (1 shl RTL8139_BIT_93C46_EECS) ; wake up the eeprom
|
||||
out dx, al
|
||||
.cmd_loop:
|
||||
mov al, (1 shl RTL8139_BIT_93C46_EEM1) or (1 shl RTL8139_BIT_93C46_EECS)
|
||||
bt bx, cx
|
||||
jnc .zero_bit
|
||||
or al, (1 shl RTL8139_BIT_93C46_EEDI)
|
||||
.zero_bit:
|
||||
out dx, al
|
||||
; push eax
|
||||
; in eax, dx ; eeprom delay
|
||||
; pop eax
|
||||
or al, (1 shl RTL8139_BIT_93C46_EESK)
|
||||
out dx, al
|
||||
; in eax, dx ; eeprom delay
|
||||
dec cx
|
||||
jns .cmd_loop
|
||||
; in eax, dx ; eeprom delay
|
||||
mov al, (1 shl RTL8139_BIT_93C46_EEM1) or (1 shl RTL8139_BIT_93C46_EECS)
|
||||
out dx, al
|
||||
mov cl, 0xf
|
||||
.read_loop:
|
||||
shl ebx, 1
|
||||
mov al, (1 shl RTL8139_BIT_93C46_EEM1) \
|
||||
or (1 shl RTL8139_BIT_93C46_EECS) \
|
||||
or (1 shl RTL8139_BIT_93C46_EESK)
|
||||
out dx, al
|
||||
; in eax, dx ; eeprom delay
|
||||
in al, dx
|
||||
and al, (1 shl RTL8139_BIT_93C46_EEDO)
|
||||
jz .dont_set
|
||||
inc ebx
|
||||
.dont_set:
|
||||
mov al, (1 shl RTL8139_BIT_93C46_EEM1) \
|
||||
or (1 shl RTL8139_BIT_93C46_EECS)
|
||||
out dx, al
|
||||
; in eax, dx ; eeprom delay
|
||||
dec cl
|
||||
jns .read_loop
|
||||
xor al, al
|
||||
out dx, al
|
||||
mov ax, bx
|
||||
ret
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; rtl8139_transmit
|
||||
; Description
|
||||
; Transmits a packet of data via the ethernet card
|
||||
; Pointer to 48 bit destination address in edi
|
||||
; Type of packet in bx
|
||||
; size of packet in ecx
|
||||
; pointer to packet data in esi
|
||||
; Destroyed registers
|
||||
; eax, edx, esi, edi
|
||||
; ToDo
|
||||
; for waiting of timeout the rtl8139 internal timer
|
||||
; should be used
|
||||
;
|
||||
;***************************************************************************
|
||||
rtl8139_transmit:
|
||||
cmp ecx, MAX_ETH_FRAME_SIZE
|
||||
jg .finish ; packet is too long
|
||||
push ecx
|
||||
; check descriptor
|
||||
mov ecx, [curr_tx_desc]
|
||||
mov edx, [io_addr]
|
||||
lea edx, [edx+ecx*4+RTL8139_REG_TSD0]
|
||||
push edx ebx
|
||||
in ax, dx
|
||||
and ax, (1 shl RTL8139_BIT_TOK) or (1 shl RTL8139_BIT_OWN)
|
||||
cmp ax, (1 shl RTL8139_BIT_TOK) or (1 shl RTL8139_BIT_OWN)
|
||||
jz .send_packet
|
||||
test ax, 0x1fff ; or no size given
|
||||
jz .send_packet
|
||||
; wait for timeout
|
||||
mov ebx, RTL8139_TX_TIMEOUT
|
||||
mov eax, 0x5 ; delay x/100 secs
|
||||
int 0x40
|
||||
in ax, dx
|
||||
and ax, (1 shl RTL8139_BIT_TOK) or (1 shl RTL8139_BIT_OWN)
|
||||
cmp ax, (1 shl RTL8139_BIT_TOK) or (1 shl RTL8139_BIT_OWN)
|
||||
jz .send_packet
|
||||
; chip hung, reset it
|
||||
call rtl8139_reset
|
||||
; reset the card
|
||||
.send_packet:
|
||||
; calculate tx_buffer address
|
||||
pop ebx
|
||||
push esi
|
||||
mov eax, MAX_ETH_FRAME_SIZE
|
||||
mul dword [curr_tx_desc]
|
||||
mov esi, edi
|
||||
lea edi, [rtl8139_tx_buff+eax]
|
||||
mov eax, edi
|
||||
cld
|
||||
; copy destination address
|
||||
movsd
|
||||
movsw
|
||||
; copy source address
|
||||
mov esi, node_addr
|
||||
movsd
|
||||
movsw
|
||||
; copy packet type
|
||||
mov [edi], bx
|
||||
add edi, 2
|
||||
; copy the packet data
|
||||
pop esi edx ecx
|
||||
push ecx
|
||||
shr ecx, 2
|
||||
rep movsd
|
||||
pop ecx
|
||||
push ecx
|
||||
and ecx, 3
|
||||
rep movsb
|
||||
; set address
|
||||
add edx, RTL8139_REG_TSAD0 - RTL8139_REG_TSD0
|
||||
out dx, eax
|
||||
; set size and early threshold
|
||||
pop eax ; pick up the size
|
||||
add eax, ETH_HLEN
|
||||
cmp eax, ETH_ZLEN
|
||||
jnc .no_pad
|
||||
mov eax, ETH_ZLEN
|
||||
.no_pad:
|
||||
or eax, (RTL8139_ERTXTH shl RTL8139_BIT_ERTXTH)
|
||||
add edx, RTL8139_REG_TSD0 - RTL8139_REG_TSAD0
|
||||
out dx, eax
|
||||
; get next descriptor 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, ...
|
||||
inc dword [curr_tx_desc]
|
||||
and dword [curr_tx_desc], 3
|
||||
.finish:
|
||||
ret
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; rtl8139_poll
|
||||
;
|
||||
; Description
|
||||
; Polls the ethernet card for a received packet
|
||||
; Received data, if any, ends up in Ether_buffer
|
||||
; Destroyed register(s)
|
||||
; eax, edx, ecx
|
||||
;
|
||||
;***************************************************************************
|
||||
rtl8139_poll:
|
||||
mov word [eth_rx_data_len], 0
|
||||
mov edx, [io_addr]
|
||||
add edx, RTL8139_REG_COMMAND
|
||||
in al, dx
|
||||
test al, (1 shl RTL8139_BIT_BUFE)
|
||||
jnz .finish
|
||||
; new packet received copy it from rx_buffer into Ether_buffer
|
||||
mov eax, rtl8139_rx_buff
|
||||
add eax, [rtl8139_rx_buff_offset]
|
||||
; check if packet is ok
|
||||
test byte [eax], (1 shl RTL8139_BIT_ROK)
|
||||
jz .reset_rx
|
||||
; packet is ok copy it into the Ether_buffer
|
||||
movzx ecx, word [eax+2] ; packet length
|
||||
sub ecx, 4 ; don't copy CRC
|
||||
mov word [eth_rx_data_len], cx
|
||||
push ecx
|
||||
shr ecx, 2 ; first copy dword-wise
|
||||
lea esi, [eax+4] ; don't copy the packet header
|
||||
mov edi, Ether_buffer
|
||||
cld
|
||||
rep movsd ; copy the dwords
|
||||
pop ecx
|
||||
and ecx, 3
|
||||
rep movsb ; copy the rest bytes
|
||||
; update rtl8139_rx_buff_offset
|
||||
movzx eax, word [eax+2] ; packet length
|
||||
add eax, [rtl8139_rx_buff_offset]
|
||||
add eax, 4+3 ; packet header is 4 bytes long + dword alignment
|
||||
and eax, not 3 ; dword alignment
|
||||
cmp eax, RTL8139_RX_BUFFER_SIZE
|
||||
jl .no_wrap
|
||||
sub eax, RTL8139_RX_BUFFER_SIZE
|
||||
.no_wrap:
|
||||
mov [rtl8139_rx_buff_offset], eax
|
||||
; update CAPR register
|
||||
sub eax, 0x10 ; value 0x10 is a constant for CAPR
|
||||
add edx, RTL8139_REG_CAPR - RTL8139_REG_COMMAND
|
||||
out dx, ax
|
||||
.finish:
|
||||
; clear active interrupt sources
|
||||
mov edx, [io_addr]
|
||||
add edx, RTL8139_REG_ISR
|
||||
in ax, dx
|
||||
out dx, ax
|
||||
ret
|
||||
.reset_rx:
|
||||
in al, dx ; read command register
|
||||
push eax
|
||||
and al, not (1 shl RTL8139_BIT_RE)
|
||||
out dx, al
|
||||
pop eax
|
||||
out dx, al
|
||||
add edx, RTL8139_REG_RXCONFIG - RTL8139_REG_COMMAND
|
||||
mov ax, RTL8139_RX_CONFIG
|
||||
out dx, ax
|
||||
ret
|
1148
kernel/tags/kolibri0.5.3.0/network/eth_drv/sis900.inc
Normal file
1148
kernel/tags/kolibri0.5.3.0/network/eth_drv/sis900.inc
Normal file
File diff suppressed because it is too large
Load Diff
202
kernel/tags/kolibri0.5.3.0/network/ip.inc
Normal file
202
kernel/tags/kolibri0.5.3.0/network/ip.inc
Normal file
@ -0,0 +1,202 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; IP.INC ;;
|
||||
;; ;;
|
||||
;; IP Processes for Menuet OS TCP/IP stack ;;
|
||||
;; ;;
|
||||
;; Version 0.3 29 August 2002 ;;
|
||||
;; ;;
|
||||
;; Copyright 2002 Mike Hibbett, mikeh@oceanfree.net ;;
|
||||
;; ;;
|
||||
;; See file COPYING for details ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
;*******************************************************************
|
||||
; Interface
|
||||
;
|
||||
; ip_rx processes all packets received by the network layer
|
||||
; It calls the appropriate protocol handler
|
||||
;
|
||||
;
|
||||
;
|
||||
;*******************************************************************
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; ip_rx
|
||||
;
|
||||
; Description
|
||||
; Handles received IP packets
|
||||
; This is a kernel function, called by stack_handler
|
||||
;
|
||||
;***************************************************************************
|
||||
ip_rx:
|
||||
; Look for a buffer to tx
|
||||
mov eax, IPIN_QUEUE
|
||||
call dequeue
|
||||
cmp ax, NO_BUFFER
|
||||
je ipr_exit ; Exit if no buffer available
|
||||
|
||||
push eax
|
||||
|
||||
; convert buffer pointer eax to the absolute address
|
||||
mov ecx, IPBUFFSIZE
|
||||
mul ecx
|
||||
add eax, IPbuffs
|
||||
|
||||
mov edx, eax ; Save the address in edx for use by future processes
|
||||
|
||||
; Validate the IP checksum
|
||||
mov ebx, edx
|
||||
mov ah, [ebx + 10]
|
||||
mov al, [ebx + 11] ; Get the checksum in intel format
|
||||
mov [ebx + 10], word 0 ; clear checksum field - need to when
|
||||
; recalculating checksum
|
||||
|
||||
; this needs two data pointers and two size #.
|
||||
; 2nd pointer can be of length 0
|
||||
mov ebx, edx
|
||||
mov [checkAdd1], ebx
|
||||
mov [checkSize1], word 20
|
||||
mov [checkAdd2], dword 0
|
||||
mov [checkSize2], word 0
|
||||
|
||||
call checksum ; Recalculate IP checksum
|
||||
cmp ax, [checkResult]
|
||||
jnz ipr_dump
|
||||
|
||||
; If the IP address is 255.255.255.255, accept it
|
||||
; - it is a broadcast packet, which we need for dhcp
|
||||
mov eax, [edx + 16]
|
||||
cmp eax, 0xffffffff
|
||||
je ipr_p0
|
||||
|
||||
; Validate the IP address, if it isn't broadcast
|
||||
cmp eax, [stack_ip]
|
||||
jnz ipr_dump
|
||||
|
||||
ipr_p0:
|
||||
mov al, [edx]
|
||||
and al, 0x0f
|
||||
cmp al, 0x05
|
||||
jnz ipr_dump
|
||||
|
||||
cmp [edx+8], byte 0
|
||||
jz ipr_dump
|
||||
|
||||
mov ax, [edx + 6]
|
||||
and ax, 0xFFBF
|
||||
cmp ax, 0
|
||||
jnz ipr_dump
|
||||
|
||||
; Check the protocol, and call the appropriate handler
|
||||
; Each handler will re-use or free the queue buffer as appropriate
|
||||
mov al, [edx + 9]
|
||||
cmp al , PROTOCOL_ICMP
|
||||
jnz ipr_p1
|
||||
pop eax
|
||||
call icmp_rx
|
||||
jmp ipr_exit
|
||||
|
||||
ipr_p1:
|
||||
cmp al , PROTOCOL_TCP
|
||||
jnz ipr_p2
|
||||
pop eax
|
||||
call tcp_rx
|
||||
jmp ipr_exit
|
||||
|
||||
ipr_p2:
|
||||
cmp al , PROTOCOL_UDP
|
||||
jnz ipr_dump
|
||||
pop eax
|
||||
call udp_rx
|
||||
jmp ipr_exit
|
||||
|
||||
ipr_dump:
|
||||
; No protocol handler available, so
|
||||
; silently dump the packet, freeing up the queue buffer
|
||||
|
||||
; inc dword [dumped_rx_count]
|
||||
|
||||
pop eax
|
||||
call freeBuff
|
||||
|
||||
ipr_exit:
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; icmp_rx
|
||||
;
|
||||
; Description
|
||||
; ICMP protocol handler
|
||||
; This is a kernel function, called by ip_rx
|
||||
; edx contains the address of the buffer in use.
|
||||
; This buffer must be reused or marked as empty afterwards
|
||||
;
|
||||
;***************************************************************************
|
||||
icmp_rx:
|
||||
cmp [edx + 20], byte 8 ; Is this an echo request? discard if not
|
||||
jz icmp_echo
|
||||
|
||||
call freeBuff
|
||||
jmp icmp_exit
|
||||
|
||||
icmp_echo:
|
||||
push eax
|
||||
mov [edx + 10], word 0 ; I think this was already done by IP rx
|
||||
|
||||
; swap the source and destination addresses
|
||||
mov ecx, [edx + 16]
|
||||
mov eax, [edx + 12]
|
||||
mov [edx + 16], eax
|
||||
mov [edx + 12], ecx
|
||||
|
||||
; recaluculate the IP header checksum
|
||||
|
||||
mov ebx, edx
|
||||
mov [checkAdd1], ebx
|
||||
mov [checkSize1], word 20
|
||||
mov [checkAdd2], dword 0
|
||||
mov [checkSize2], word 0
|
||||
|
||||
call checksum
|
||||
mov ax, [checkResult]
|
||||
mov [edx + 10], ah
|
||||
mov [edx + 11], al ; ?? correct byte order?
|
||||
|
||||
mov [edx + 20], byte 0 ; change the request to a response
|
||||
mov [edx + 22], word 0 ; clear ICMP checksum prior to re-calc
|
||||
|
||||
; Calculate the length of the ICMP data ( IP payload)
|
||||
mov ah, [edx + 2]
|
||||
mov al, [edx + 3]
|
||||
sub ax, 20
|
||||
|
||||
mov [checkSize1], ax
|
||||
mov ebx, edx
|
||||
add ebx, 20
|
||||
|
||||
mov [checkAdd1], ebx
|
||||
mov [checkAdd2], dword 0
|
||||
mov [checkSize2], word 0
|
||||
|
||||
call checksum
|
||||
|
||||
mov ax, [checkResult]
|
||||
mov [edx + 22], ah
|
||||
mov [edx + 23], al
|
||||
|
||||
; Queue packet for transmission
|
||||
|
||||
pop ebx
|
||||
mov eax, NET1OUT_QUEUE
|
||||
call queue
|
||||
|
||||
icmp_exit:
|
||||
ret
|
214
kernel/tags/kolibri0.5.3.0/network/queue.inc
Normal file
214
kernel/tags/kolibri0.5.3.0/network/queue.inc
Normal file
@ -0,0 +1,214 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; QUEUE.INC ;;
|
||||
;; ;;
|
||||
;; Buffer queue management for Menuet OS TCP/IP Stack ;;
|
||||
;; ;;
|
||||
;; Version 0.3 29 August 2002 ;;
|
||||
;; ;;
|
||||
;; Copyright 2002 Mike Hibbett, mikeh@oceanfree.net ;;
|
||||
;; ;;
|
||||
;; See file COPYING for details ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
;*******************************************************************
|
||||
; Interface
|
||||
;
|
||||
; queueInit Configures the queues to empty
|
||||
; dequeue Removes a buffer pointer from a queue
|
||||
; queue Inserts a buffer pointer into a queue
|
||||
; freeBuff Adds the buffer pointer to the list of free buffers
|
||||
; queueSize Returns the number of entries in a queue
|
||||
;
|
||||
; The various defines for queue names can be found in stack.inc
|
||||
;
|
||||
;*******************************************************************
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; freeBuff
|
||||
;
|
||||
; Description
|
||||
; Adds a buffer number to the beginning of the free list.
|
||||
; buffer number in eax ( ms word zeroed )
|
||||
; all other registers preserved
|
||||
; This always works, so no error returned
|
||||
;***************************************************************************
|
||||
freeBuff:
|
||||
push ebx
|
||||
push ecx
|
||||
mov ebx, EMPTY_QUEUE
|
||||
shl ebx, 1
|
||||
add ebx, queues
|
||||
cli ; Ensure that another process does not interfer
|
||||
movzx ecx, word [ebx]
|
||||
mov [ebx], ax
|
||||
shl eax, 1
|
||||
add eax, queueList
|
||||
mov [eax], cx
|
||||
sti
|
||||
pop ecx
|
||||
pop ebx
|
||||
|
||||
ret
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; queueSize
|
||||
;
|
||||
; Description
|
||||
; Counts the number of entries in a queue
|
||||
; queue number in ebx ( ms word zeroed )
|
||||
; Queue size returned in eax
|
||||
; This always works, so no error returned
|
||||
;***************************************************************************
|
||||
queueSize:
|
||||
xor eax, eax
|
||||
shl ebx, 1
|
||||
add ebx, queues
|
||||
movzx ecx, word [ebx]
|
||||
cmp cx, NO_BUFFER
|
||||
je qs_exit
|
||||
|
||||
qs_001:
|
||||
inc eax
|
||||
shl ecx, 1
|
||||
add ecx, queueList
|
||||
movzx ecx, word [ecx]
|
||||
cmp cx, NO_BUFFER
|
||||
je qs_exit
|
||||
jmp qs_001
|
||||
|
||||
qs_exit:
|
||||
ret
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; queue
|
||||
;
|
||||
; Description
|
||||
; Adds a buffer number to the *end* of a queue
|
||||
; This is quite quick because these queues will be short
|
||||
; queue number in eax ( ms word zeroed )
|
||||
; buffer number in ebx ( ms word zeroed )
|
||||
; all other registers preserved
|
||||
; This always works, so no error returned
|
||||
;***************************************************************************
|
||||
queue:
|
||||
push ebx
|
||||
shl ebx, 1
|
||||
add ebx, queueList ; eax now holds address of queue entry
|
||||
mov [ebx], word NO_BUFFER ; This buffer will be the last
|
||||
|
||||
cli
|
||||
shl eax, 1
|
||||
add eax, queues ; eax now holds address of queue
|
||||
movzx ebx, word [eax]
|
||||
|
||||
cmp bx, NO_BUFFER
|
||||
jne qu_001
|
||||
|
||||
pop ebx
|
||||
; The list is empty, so add this to the head
|
||||
mov [eax], bx
|
||||
jmp qu_exit
|
||||
|
||||
qu_001:
|
||||
; Find the last entry
|
||||
shl ebx, 1
|
||||
add ebx, queueList
|
||||
mov eax, ebx
|
||||
movzx ebx, word [ebx]
|
||||
cmp bx, NO_BUFFER
|
||||
jne qu_001
|
||||
|
||||
mov ebx, eax
|
||||
pop eax
|
||||
mov [ebx], ax
|
||||
|
||||
qu_exit:
|
||||
sti
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; dequeue
|
||||
;
|
||||
; Description
|
||||
; removes a buffer number from the head of a queue
|
||||
; This is fast, as it unlinks the first entry in the list
|
||||
; queue number in eax ( ms word zeroed )
|
||||
; buffer number returned in eax ( ms word zeroed )
|
||||
; all other registers preserved
|
||||
;
|
||||
;***************************************************************************
|
||||
dequeue:
|
||||
push ebx
|
||||
shl eax, 1
|
||||
add eax, queues ; eax now holds address of queue
|
||||
mov ebx, eax
|
||||
cli
|
||||
movzx eax, word [eax]
|
||||
cmp ax, NO_BUFFER
|
||||
je dq_exit
|
||||
push eax
|
||||
shl eax, 1
|
||||
add eax, queueList ; eax now holds address of queue entry
|
||||
mov ax, [eax]
|
||||
mov [ebx], ax
|
||||
pop eax
|
||||
|
||||
dq_exit:
|
||||
sti
|
||||
pop ebx
|
||||
ret
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; queueInit
|
||||
;
|
||||
; Description
|
||||
; Initialises the queues to empty, and creates the free queue
|
||||
; list.
|
||||
;
|
||||
;***************************************************************************
|
||||
queueInit:
|
||||
mov esi, queues
|
||||
mov ecx, NUMQUEUES
|
||||
mov ax, NO_BUFFER
|
||||
|
||||
qi001:
|
||||
mov [esi], ax
|
||||
inc esi
|
||||
inc esi
|
||||
loop qi001
|
||||
|
||||
mov esi, queues + ( 2 * EMPTY_QUEUE )
|
||||
|
||||
; Initialise empty queue list
|
||||
|
||||
xor ax, ax
|
||||
mov [esi], ax
|
||||
|
||||
mov ecx, NUMQUEUEENTRIES - 1
|
||||
mov esi, queueList
|
||||
|
||||
qi002:
|
||||
inc ax
|
||||
mov [esi], ax
|
||||
inc esi
|
||||
inc esi
|
||||
loop qi002
|
||||
|
||||
mov ax, NO_BUFFER
|
||||
mov [esi], ax
|
||||
|
||||
ret
|
1784
kernel/tags/kolibri0.5.3.0/network/stack.inc
Normal file
1784
kernel/tags/kolibri0.5.3.0/network/stack.inc
Normal file
File diff suppressed because it is too large
Load Diff
1243
kernel/tags/kolibri0.5.3.0/network/tcp.inc
Normal file
1243
kernel/tags/kolibri0.5.3.0/network/tcp.inc
Normal file
File diff suppressed because it is too large
Load Diff
137
kernel/tags/kolibri0.5.3.0/network/udp.inc
Normal file
137
kernel/tags/kolibri0.5.3.0/network/udp.inc
Normal file
@ -0,0 +1,137 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; UDP.INC ;;
|
||||
;; ;;
|
||||
;; UDP Processes for Menuet OS TCP/IP stack ;;
|
||||
;; ;;
|
||||
;; Version 0.3 29 August 2002 ;;
|
||||
;; ;;
|
||||
;; Copyright 2002 Mike Hibbett, mikeh@oceanfree.net ;;
|
||||
;; ;;
|
||||
;; See file COPYING for details ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
;*******************************************************************
|
||||
; Interface
|
||||
;
|
||||
; udp_rx Handles received IP packets with the UDP protocol
|
||||
;
|
||||
;*******************************************************************
|
||||
|
||||
|
||||
|
||||
|
||||
;***************************************************************************
|
||||
; Function
|
||||
; udp_rx
|
||||
;
|
||||
; Description
|
||||
; UDP protocol handler
|
||||
; This is a kernel function, called by ip_rx
|
||||
; IP buffer address given in edx
|
||||
; Free up (or re-use) IP buffer when finished
|
||||
;
|
||||
;***************************************************************************
|
||||
udp_rx:
|
||||
push eax
|
||||
|
||||
; First validate the header & checksum. Discard buffer if error
|
||||
|
||||
; Look for a socket where
|
||||
; IP Packet UDP Destination Port = local Port
|
||||
; IP Packet SA = Remote IP
|
||||
|
||||
movzx ebx, word [edx + 22] ; get the local port from
|
||||
; the IP packet's UDP header
|
||||
mov eax, SOCKETBUFFSIZE * NUM_SOCKETS
|
||||
mov ecx, NUM_SOCKETS
|
||||
|
||||
fs1:
|
||||
sub eax, SOCKETBUFFSIZE
|
||||
cmp [eax + sockets + 12], bx ; bx will hold the 'wrong' value,
|
||||
; but the comparision is correct
|
||||
loopnz fs1 ; Return back if no match
|
||||
jz fs_done
|
||||
|
||||
; No match, so exit
|
||||
jmp udprx_001
|
||||
|
||||
fs_done:
|
||||
; For dhcp, we must allow any remote server to respond.
|
||||
; I will accept the first incoming response to be the one
|
||||
; I bind to, if the socket is opened with a destination IP address of
|
||||
; 255.255.255.255
|
||||
mov ebx, [eax + sockets + 16]
|
||||
cmp ebx, 0xffffffff
|
||||
je udprx_002
|
||||
|
||||
mov ebx, [edx + 12] ; get the Source address from the IP packet
|
||||
cmp [eax + sockets + 16], ebx
|
||||
jne udprx_001 ; Quit if the source IP is not valid
|
||||
|
||||
udprx_002:
|
||||
; OK - we have a valid UDP packet for this socket.
|
||||
; First, update the sockets remote port number with the incoming msg
|
||||
; - it will have changed
|
||||
; from the original ( 69 normally ) to allow further connects
|
||||
movzx ebx, word [edx + 20] ; get the UDP source port
|
||||
; ( was 69, now new )
|
||||
mov [eax + sockets + 20], bx
|
||||
|
||||
; Now, copy data to socket. We have socket address as [eax + sockets].
|
||||
; We have IP packet in edx
|
||||
|
||||
; get # of bytes in ecx
|
||||
movzx ecx, byte [edx + 3] ; total length of IP packet. Subtract
|
||||
mov ch, byte [edx + 2] ; 20 + 8 gives data length
|
||||
sub ecx, 28
|
||||
|
||||
mov ebx, eax
|
||||
add ebx, sockets ; ebx = address of actual socket
|
||||
|
||||
mov eax, [ebx+ 4] ; get socket owner PID
|
||||
push eax
|
||||
|
||||
mov eax, [ebx + 24] ; get # of bytes already in buffer
|
||||
add [ebx + 24], ecx ; increment the count of bytes in buffer
|
||||
|
||||
; point to the location to store the data
|
||||
add ebx, eax
|
||||
add ebx, SOCKETHEADERSIZE
|
||||
|
||||
; ebx = location for first byte, ecx has count,
|
||||
; edx points to data
|
||||
|
||||
add edx, 28 ; edx now points to the data
|
||||
mov edi, ebx
|
||||
mov esi, edx
|
||||
|
||||
cld
|
||||
rep movsb ; copy the data across
|
||||
|
||||
; flag an event to the application
|
||||
pop eax
|
||||
mov ecx,1
|
||||
mov esi,0x3020+0x4
|
||||
|
||||
newsearch:
|
||||
cmp [esi],eax
|
||||
je foundPID
|
||||
inc ecx
|
||||
add esi,0x20
|
||||
cmp ecx,[0x3004]
|
||||
jbe newsearch
|
||||
|
||||
foundPID:
|
||||
shl ecx,8
|
||||
or dword [ecx+0x80000+0xA8],dword 10000000b ; stack event
|
||||
|
||||
mov [check_idle_semaphore],200
|
||||
|
||||
udprx_001:
|
||||
pop eax
|
||||
call freeBuff ; Discard the packet
|
||||
ret
|
||||
|
BIN
kernel/tags/kolibri0.5.3.0/skin_v3.7z
Normal file
BIN
kernel/tags/kolibri0.5.3.0/skin_v3.7z
Normal file
Binary file not shown.
135
kernel/tags/kolibri0.5.3.0/sound/playnote.inc
Normal file
135
kernel/tags/kolibri0.5.3.0/sound/playnote.inc
Normal file
@ -0,0 +1,135 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; PLAYNOTE.INC version 1.1 22 November 2003 ;;
|
||||
;; ;;
|
||||
;; Player Notes for Speaker PC ;;
|
||||
;; subfunction #55 from function #55 Menuet OS ;;
|
||||
;; ;;
|
||||
;; Copyright 2003 VaStaNi ;;
|
||||
;; vastani@ukr.net ;;
|
||||
;; >>>- SIMPLY - QUICKLY - SHORTLY -<<< ;;
|
||||
;; ;;
|
||||
;; Note: playnote.txt ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
kontrOctave dw 0x4742, 0x4342, 0x3F7C, 0x3BEC, 0x388F, 0x3562
|
||||
dw 0x3264, 0x2F8F, 0x2CE4, 0x2A5F, 0x2802, 0x25BF
|
||||
memAdrNote dd 0
|
||||
pidProcessNote dd 0
|
||||
slotProcessNote dd 0
|
||||
count_timer_Note dd 1
|
||||
mem8253r42 dw 0
|
||||
countDelayNote db 0
|
||||
|
||||
playNote:
|
||||
; jmp NotPlayNotes
|
||||
mov esi, [memAdrNote]
|
||||
or esi, esi ; ESI = 0 ? - OFF Notes Play ?
|
||||
jz NotPlayNotes ; if ESI = 0 -> ignore play pocedure
|
||||
cmp eax, [count_timer_Note]
|
||||
jb NotPlayNotes
|
||||
push eax
|
||||
inc eax
|
||||
mov [count_timer_Note], eax
|
||||
mov al, [countDelayNote]
|
||||
dec al ; decrement counter Delay for Playing Note
|
||||
jz NewLoadNote@Delay
|
||||
cmp al, 0xFF ; this is first Note Play ?
|
||||
jne NextDelayNote
|
||||
;This is FIRST Note, save counter channel 2 chip 8253
|
||||
mov al, 0xB6 ; control byte to timer chip 8253
|
||||
out 0x43, al ; Send it to the control port chip 8253
|
||||
in al, 0x42 ; Read Lower byte counter channel 2 chip 8253
|
||||
mov ah, al ; AH = Lower byte counter channel 2
|
||||
in al, 0x42 ; Read Upper byte counter channel 2 chip 8253
|
||||
mov [mem8253r42], ax ; Save counter channel 2 timer chip 8253
|
||||
NewLoadNote@Delay:
|
||||
cld
|
||||
; lodsb ; load AL - counter Delay
|
||||
call ReadNoteByte
|
||||
or al, al ; THE END ?
|
||||
jz EndPlayNote
|
||||
cmp al, 0x81
|
||||
jnc NoteforOctave
|
||||
mov [countDelayNote], al
|
||||
; lodsw ; load AX - counter for Note!
|
||||
call ReadNoteByte
|
||||
mov ah,al
|
||||
call ReadNoteByte
|
||||
xchg al,ah
|
||||
jmp pokeNote
|
||||
|
||||
EndPlayNote: ; THE END Play Notes!
|
||||
in al, 0x61 ; Get contents of system port B chip 8255
|
||||
and al, 0xFC ; Turn OFF timer and speaker
|
||||
out 0x61, al ; Send out new values to port B chip 8255
|
||||
mov ax, [mem8253r42] ; memorize counter channel 2 timer chip 8253
|
||||
xchg al, ah ; reverse byte in word
|
||||
out 0x42, al ; restore Lower byte counter channel 2
|
||||
mov al, ah ; AL = Upper byte counter channel 2
|
||||
out 0x42, al ; restore Upper byte channel 2
|
||||
xor eax, eax ; EAX = 0
|
||||
mov [memAdrNote], eax ; clear header control Delay-Note string
|
||||
NextDelayNote:
|
||||
mov [countDelayNote], al ; save new counter delay Note
|
||||
pop eax
|
||||
NotPlayNotes:
|
||||
RET
|
||||
|
||||
NoteforOctave:
|
||||
sub al, 0x81 ; correction value for delay Note
|
||||
mov [countDelayNote], al ; save counter delay this new Note
|
||||
; lodsb ; load pack control code
|
||||
call ReadNoteByte
|
||||
cmp al, 0xFF ; this is PAUSE ?
|
||||
jne packCode ; no, this is PACK CODE
|
||||
in al, 0x61 ; Get contents of system port B chip 8255
|
||||
and al, 0xFC ; Turn OFF timer and speaker
|
||||
out 0x61, al ; Send out new values to port B chip 8255
|
||||
jmp saveESI
|
||||
|
||||
packCode:
|
||||
mov cl, al ; save code
|
||||
and al, 0xF ; clear upper bits
|
||||
dec al ; correction
|
||||
add al, al ; transform number to offset constant
|
||||
movsx eax, al ; EAX - offset
|
||||
add eax, dword kontrOctave ; EAX - address from constant
|
||||
mov ax, [eax] ; read constant
|
||||
shr cl, 4 ; transform for number Octave
|
||||
shr ax, cl ; calculate from Note this Octave!
|
||||
pokeNote:
|
||||
out 0x42, al ; Lower byte Out to channel 2 timer chip 8253
|
||||
mov al, ah
|
||||
out 0x42, al ; Upper byte Out to channel 2 timer chip 8253
|
||||
in al, 0x61 ; Get contents of system port B chip 8255
|
||||
or al, 3 ; Turn ON timer and speaker
|
||||
out 0x61, al ; Send out new values to port B chip 8255
|
||||
saveESI:
|
||||
; mov [memAdrNote], esi ; save new header control Delay-Note string
|
||||
pop eax
|
||||
RET
|
||||
ReadNoteByte:
|
||||
;result:
|
||||
; al - note
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
mov eax,[pidProcessNote]
|
||||
call pid_to_slot
|
||||
test eax,eax
|
||||
jz .failed
|
||||
lea ebx,[esp+12]
|
||||
mov ecx,1
|
||||
mov edx,[memAdrNote]
|
||||
inc [memAdrNote]
|
||||
call read_process_memory
|
||||
.failed:
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
ret
|
||||
;------------------- END CODE -------------------
|
350
kernel/tags/kolibri0.5.3.0/sound/sb16.inc
Normal file
350
kernel/tags/kolibri0.5.3.0/sound/sb16.inc
Normal file
@ -0,0 +1,350 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; SB16.INC ;;
|
||||
;; ;;
|
||||
;; Sound Blaster 16 functions for MenuetOS ;;
|
||||
;; ;;
|
||||
;; Copyright 2002 Paolo Minazzi, paolo.minazzi@inwind.it ;;
|
||||
;; ;;
|
||||
;; See file COPYING for details ;;
|
||||
;; ;;
|
||||
;; - 11.07.2002 8 bit stereo mode - Ville Turjanmaa ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
SB16_load_music equ 0xc0000000
|
||||
SB16_play_music equ 0xc0000001
|
||||
DMAPage equ 0x2A
|
||||
Rate equ 44100
|
||||
SB16Buffer equ 0x2A0000
|
||||
SB16_Status equ SB16Buffer+65536
|
||||
|
||||
iglobal
|
||||
sound_data_format dd 0x1
|
||||
sound_data_length dd 65536
|
||||
sound_data_freq dd 44100
|
||||
endg
|
||||
|
||||
sound_interface:
|
||||
|
||||
cmp eax,0 ; Load data
|
||||
jne no_SB16_load_music
|
||||
mov edi,[0x3010]
|
||||
add edi,0x10
|
||||
add ebx,[edi]
|
||||
call code_SB16_load_music
|
||||
ret
|
||||
no_SB16_load_music:
|
||||
|
||||
cmp eax,1 ; Play data
|
||||
jne no_SB16_play_music
|
||||
call code_SB16_play_music
|
||||
ret
|
||||
no_SB16_play_music:
|
||||
|
||||
cmp eax,2 ; Set data formats
|
||||
jne no_SB16_data_format
|
||||
cmp ebx,0 ; ebx=0 play format
|
||||
jne no_sound_format
|
||||
mov [sound_data_format],ecx ; 1=8b mono, 2=8b stereo
|
||||
ret
|
||||
no_sound_format:
|
||||
cmp ebx,1 ; ebx=1 data length
|
||||
jne no_sound_length
|
||||
mov [sound_data_length],ecx ;
|
||||
ret
|
||||
no_sound_length:
|
||||
cmp ebx,2 ; ebx=2 sound data frequency
|
||||
jne no_sound_freq
|
||||
mov [sound_data_freq],ecx
|
||||
ret
|
||||
no_sound_freq:
|
||||
ret
|
||||
|
||||
no_SB16_data_format:
|
||||
|
||||
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
cmp eax, edi ; this is subfunction #55 ?
|
||||
jne retFunc55 ; if no then return.
|
||||
cmp byte [sound_flag],0
|
||||
jne retFunc55
|
||||
movzx eax, byte [countDelayNote]
|
||||
or al, al ; player is busy ?
|
||||
jnz retFunc55 ; return counter delay Note
|
||||
; mov eax, [0x3010]
|
||||
; mov eax, [eax+0x10] ; address application im memory
|
||||
; add eax, edx ; add offset Delay-Note string
|
||||
; mov [memAdrNote], eax
|
||||
mov [memAdrNote],edx
|
||||
mov eax,[0x3010]
|
||||
mov eax,[eax+4]
|
||||
mov [pidProcessNote],eax
|
||||
xor eax, eax ; Ok! EAX = 0
|
||||
retFunc55:
|
||||
mov [esp+36], eax ; return value EAX for application
|
||||
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
code_SB16_play_music:
|
||||
|
||||
cmp [sound_data_format],1
|
||||
jne no_sound_8bm
|
||||
call sb_play_8b_mono
|
||||
ret
|
||||
no_sound_8bm:
|
||||
|
||||
cmp [sound_data_format],2
|
||||
jne no_sound_8bs
|
||||
call sb_play_8b_stereo
|
||||
ret
|
||||
no_sound_8bs:
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Blaster_command:
|
||||
|
||||
push eax
|
||||
push ecx
|
||||
push edx
|
||||
|
||||
mov dx,word [sb16]
|
||||
add dx,0xc
|
||||
mov cx,1000
|
||||
bcl1:
|
||||
in al,dx
|
||||
and al,128
|
||||
jz bcl2
|
||||
loop bcl1
|
||||
bcl2:
|
||||
mov al,[esp+8]
|
||||
mov dx,[esp+0]
|
||||
add dx,word [sb16]
|
||||
out dx,al
|
||||
|
||||
pop edx
|
||||
pop ecx
|
||||
pop eax
|
||||
|
||||
ret
|
||||
|
||||
|
||||
sb_play_8b_stereo:
|
||||
|
||||
pusha
|
||||
|
||||
call sb_set_dma
|
||||
|
||||
call sb_set_stereo
|
||||
|
||||
mov dx,0xc
|
||||
mov al,0xa8
|
||||
call Blaster_command
|
||||
|
||||
mov al,0x40
|
||||
call Blaster_command
|
||||
|
||||
mov al,245
|
||||
call Blaster_command
|
||||
|
||||
mov al,0x48
|
||||
call Blaster_command
|
||||
|
||||
mov al,0xff
|
||||
call Blaster_command
|
||||
call Blaster_command
|
||||
|
||||
mov al,0x91
|
||||
call Blaster_command
|
||||
|
||||
popa
|
||||
ret
|
||||
|
||||
|
||||
|
||||
sb_set_stereo:
|
||||
|
||||
push eax
|
||||
push edx
|
||||
|
||||
call sb_wait
|
||||
|
||||
mov dx,word [sb16]
|
||||
add dx,0x4
|
||||
mov al,0xe
|
||||
out dx,al
|
||||
inc dx
|
||||
in al,dx
|
||||
and al,253
|
||||
or al,2 ; stereo
|
||||
out dx,al
|
||||
|
||||
pop edx
|
||||
pop eax
|
||||
ret
|
||||
|
||||
|
||||
|
||||
code_SB16_load_music:
|
||||
|
||||
cmp byte [SB16_Status],1
|
||||
je nol
|
||||
mov edi,SB16Buffer
|
||||
mov esi,ebx
|
||||
mov ecx,65536/4
|
||||
cld
|
||||
rep movsd
|
||||
nol: ret
|
||||
|
||||
|
||||
iglobal
|
||||
dma_table db 0x87,0x83,0x81,0x82
|
||||
endg
|
||||
|
||||
|
||||
|
||||
;--------------------------------
|
||||
; program dma
|
||||
;--------------------------------
|
||||
|
||||
sb_set_dma:
|
||||
|
||||
pusha
|
||||
|
||||
mov eax,[sound_dma]
|
||||
add eax,4
|
||||
out 0xa,al
|
||||
|
||||
mov al,0
|
||||
out 0xc,al
|
||||
|
||||
mov eax,[sound_dma]
|
||||
add eax,0x48
|
||||
out 0xb,al
|
||||
|
||||
mov edx,[sound_dma]
|
||||
shl edx,1
|
||||
mov al,0
|
||||
out dx,al
|
||||
|
||||
mov al,0
|
||||
out dx,al
|
||||
|
||||
mov edx,[sound_dma]
|
||||
add edx,dma_table
|
||||
movzx edx,byte [edx]
|
||||
mov al,DMAPage
|
||||
out dx,al
|
||||
|
||||
mov edx,[sound_dma]
|
||||
shl edx,1
|
||||
inc edx
|
||||
mov eax,[sound_data_length]
|
||||
dec eax
|
||||
and eax,0xff
|
||||
; mov al,(DataLength-1) and 0xff
|
||||
out dx,al
|
||||
|
||||
mov eax,[sound_data_length]
|
||||
dec eax
|
||||
shr eax,8
|
||||
; mov al,(DataLength-1) shr 8
|
||||
out dx,al
|
||||
|
||||
mov eax,[sound_dma] ; DMA
|
||||
out 0xa,al
|
||||
|
||||
popa
|
||||
ret
|
||||
|
||||
|
||||
|
||||
sb_play_8b_mono:
|
||||
|
||||
|
||||
call sb_set_dma
|
||||
|
||||
cmp byte [SB16_Status],1
|
||||
jne contsb16
|
||||
jmp retserve
|
||||
contsb16:
|
||||
|
||||
mov dx,word [sb16]
|
||||
add dx,4
|
||||
mov ecx,[sound_dma]
|
||||
mov ax,0x01
|
||||
shl ax,cl
|
||||
shl ax,8
|
||||
add ax,0x81
|
||||
out dx,ax
|
||||
|
||||
mov ax,0f280h ;enable irq5
|
||||
out dx,ax
|
||||
|
||||
|
||||
adr1_SB: mov dx,word [sb16]
|
||||
add dx,0ch
|
||||
in al,dx
|
||||
and al,080h
|
||||
jnz adr1_SB
|
||||
|
||||
call sb_set_stereo
|
||||
|
||||
mov al,0d1h
|
||||
out dx,al
|
||||
|
||||
|
||||
mov dx,word [sb16]
|
||||
add dx,0ch
|
||||
|
||||
call sb_wait
|
||||
|
||||
mov al,40h ; Rate
|
||||
out dx,al
|
||||
call sb_wait
|
||||
mov al,256-1000000/Rate
|
||||
out dx,al
|
||||
|
||||
call sb_wait
|
||||
|
||||
mov al,14h ; Datalength
|
||||
out dx,al
|
||||
call sb_wait
|
||||
|
||||
mov eax,[sound_data_length]
|
||||
dec eax
|
||||
and eax,0xff
|
||||
;mov al,(DataLength-1) and 0xff
|
||||
out dx,al
|
||||
call sb_wait
|
||||
mov eax,[sound_data_length]
|
||||
dec eax
|
||||
shr eax,8
|
||||
;mov al,(DataLength-1) shr 8
|
||||
out dx,al
|
||||
|
||||
retserve:
|
||||
|
||||
ret
|
||||
|
||||
|
||||
sb_wait: in al,dx ;wait
|
||||
and al,080h
|
||||
jnz sb_wait
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
;****************************************
|
||||
; END CODE SB16 by Minazzi Paolo
|
||||
;***************************************
|
990
kernel/tags/kolibri0.5.3.0/video/vesa12.inc
Normal file
990
kernel/tags/kolibri0.5.3.0/video/vesa12.inc
Normal file
@ -0,0 +1,990 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; VESA12.INC ;;
|
||||
;; ;;
|
||||
;; Vesa 1.2 functions for MenuetOS ;;
|
||||
;; ;;
|
||||
;; Copyright 2002 Ville Turjanmaa ;;
|
||||
;; ;;
|
||||
;; quickcode@mail.ru - bankswitch for S3 cards ;;
|
||||
;; ;;
|
||||
;; See file COPYING for details ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
; A complete video driver should include the following types of function
|
||||
;
|
||||
; Putpixel
|
||||
; Getpixel
|
||||
;
|
||||
; Drawimage
|
||||
; Drawbar
|
||||
;
|
||||
; Drawbackground
|
||||
;
|
||||
;
|
||||
; Modifying the set_bank -function is mostly enough
|
||||
; for different Vesa 1.2 setups.
|
||||
|
||||
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
; set_bank for Trident videocards, work on Trident 9440
|
||||
; modified by Mario79
|
||||
;set_bank:
|
||||
;cli
|
||||
;cmp al,[0xfff2]
|
||||
;je retsb
|
||||
;mov [0xfff2],al
|
||||
;push dx
|
||||
;mov dx,3D8h
|
||||
;out dx,al
|
||||
;pop dx
|
||||
;retsb:
|
||||
;sti
|
||||
;ret
|
||||
|
||||
|
||||
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
; set_bank for S3 videocards, work on S3 ViRGE PCI (325)
|
||||
; modified by kmeaw
|
||||
set_bank:
|
||||
cli
|
||||
cmp al,[0xfff2]
|
||||
je retsb
|
||||
mov [0xfff2],al
|
||||
push ax
|
||||
push dx
|
||||
push cx
|
||||
mov cl, al
|
||||
mov dx, 0x3D4
|
||||
mov al, 0x38
|
||||
out dx, al ;CR38 Register Lock 1 ;Note: Traditionally 48h is used to
|
||||
;unlock and 00h to lock
|
||||
inc dx
|
||||
mov al, 0x48
|
||||
out dx, al ;3d5 -?
|
||||
dec dx
|
||||
mov al, 0x31
|
||||
out dx, al ;CR31 Memory Configuration Register
|
||||
;0 Enable Base Address Offset (CPUA BASE). Enables bank operation if set, ;disables if clear.
|
||||
;4-5 Bit 16-17 of the Display Start Address. For the 801/5,928 see index 51h,
|
||||
;for the 864/964 see index 69h.
|
||||
|
||||
inc dx
|
||||
in al, dx
|
||||
dec dx
|
||||
mov ah, al
|
||||
mov al, 0x31
|
||||
out dx, ax
|
||||
mov al, ah
|
||||
or al, 9
|
||||
inc dx
|
||||
out dx, al
|
||||
dec dx
|
||||
mov al, 0x35
|
||||
out dx, al ;CR35 CRT Register Lock
|
||||
inc dx
|
||||
in al, dx
|
||||
dec dx
|
||||
and al, 0xF0
|
||||
mov ch, cl
|
||||
and ch, 0x0F
|
||||
or ch, al
|
||||
mov al, 0x35
|
||||
out dx, al
|
||||
inc dx
|
||||
mov al, ch
|
||||
out dx, ax
|
||||
dec dx
|
||||
mov al, 0x51 ;Extended System Control 2 Register
|
||||
out dx, al
|
||||
inc dx
|
||||
in al, dx
|
||||
dec dx
|
||||
and al, 0xF3
|
||||
shr cl, 2
|
||||
and cl, 0x0C
|
||||
or cl, al
|
||||
mov al, 0x51
|
||||
out dx, al
|
||||
inc dx
|
||||
mov al, cl
|
||||
out dx, al
|
||||
dec dx
|
||||
mov al, 0x38
|
||||
out dx, al
|
||||
inc dx
|
||||
xor al, al
|
||||
out dx, al
|
||||
dec dx
|
||||
pop cx
|
||||
pop dx
|
||||
pop ax
|
||||
retsb:
|
||||
sti
|
||||
ret
|
||||
|
||||
;Set bank function for Intel 810/815 chipsets
|
||||
; *****Modified by Protopopius, Russia.*****
|
||||
; ********* http://menuetos.hut.ru **************
|
||||
; ************************************************
|
||||
;
|
||||
;set_bank:
|
||||
;cli
|
||||
;cmp al,[0xfff2]
|
||||
;je retsb
|
||||
;mov [0xfff2],al
|
||||
;push ax
|
||||
;push dx
|
||||
;mov dx,3CEh
|
||||
;mov ah,al ; Save value for later use
|
||||
;mov al,10h ; Index GR10 (Address Mapping)
|
||||
;out dx,al ; Select GR10
|
||||
;inc dl
|
||||
;mov al,3 ; Set bits 0 and 1 (Enable linear page mapping)
|
||||
;out dx,al ; Write value
|
||||
;dec dl
|
||||
;mov al,11h ; Index GR11 (Page Selector)
|
||||
;out dx,al ; Select GR11
|
||||
;inc dl
|
||||
;mov al,ah ; Write address
|
||||
;out dx,al ; Write the value
|
||||
;pop dx
|
||||
;pop ax
|
||||
;retsb:
|
||||
;sti
|
||||
;ret
|
||||
|
||||
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
|
||||
|
||||
;set_bank:
|
||||
; cli
|
||||
; cmp al,[0xfff2]
|
||||
; je retsb
|
||||
; mov [0xfff2],al
|
||||
; push ax
|
||||
; push dx
|
||||
; mov ah,al
|
||||
; mov dx,0x03D4
|
||||
; mov al,0x39
|
||||
; out dx,al
|
||||
; inc dl
|
||||
; mov al,0xA5
|
||||
; out dx,al
|
||||
; dec dl
|
||||
; mov al,6Ah
|
||||
; out dx,al
|
||||
; inc dl
|
||||
; mov al,ah
|
||||
; out dx,al
|
||||
; dec dl
|
||||
; mov al,0x39
|
||||
; out dx,al
|
||||
; inc dl
|
||||
; mov al,0x5A
|
||||
; out dx,al
|
||||
; dec dl
|
||||
; pop dx
|
||||
; pop ax
|
||||
;
|
||||
; retsb:
|
||||
; ret
|
||||
|
||||
|
||||
vesa12_drawbackground:
|
||||
|
||||
call [disable_mouse]
|
||||
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
|
||||
xor edx,edx
|
||||
mov eax,dword[WinMapAddress-8]
|
||||
mov ebx,dword[WinMapAddress-4]
|
||||
mul ebx
|
||||
mov ebx,3
|
||||
mul ebx
|
||||
mov [imax],eax
|
||||
mov eax,[draw_data+32+0]
|
||||
mov ebx,[draw_data+32+4]
|
||||
mov edi,0 ;no force
|
||||
|
||||
v12dp3:
|
||||
|
||||
push eax
|
||||
push ebx
|
||||
mov esi,0x300000
|
||||
|
||||
cmp [WinMapAddress-12],dword 1 ; tiled background
|
||||
jne no_vesa12_tiled_bgr
|
||||
|
||||
push edx
|
||||
|
||||
xor edx,edx
|
||||
mov ecx,[WinMapAddress-8]
|
||||
div ecx
|
||||
mov eax,edx
|
||||
|
||||
push eax
|
||||
mov eax,ebx
|
||||
xor edx,edx
|
||||
mov ecx,[WinMapAddress-4]
|
||||
div ecx
|
||||
mov ebx,edx
|
||||
pop eax
|
||||
|
||||
pop edx
|
||||
|
||||
no_vesa12_tiled_bgr:
|
||||
|
||||
cmp [WinMapAddress-12],dword 2 ; stretched background
|
||||
jne no_vesa12_stretched_bgr
|
||||
|
||||
push edx
|
||||
|
||||
imul eax,dword [WinMapAddress-8]
|
||||
xor edx,edx
|
||||
mov ecx,[0xfe00]
|
||||
inc ecx
|
||||
div ecx
|
||||
|
||||
push eax
|
||||
mov eax,ebx
|
||||
imul eax,dword [WinMapAddress-4]
|
||||
xor edx,edx
|
||||
mov ecx,[0xfe04]
|
||||
inc ecx
|
||||
div ecx
|
||||
mov ebx,eax
|
||||
pop eax
|
||||
|
||||
pop edx
|
||||
|
||||
no_vesa12_stretched_bgr:
|
||||
|
||||
|
||||
push eax
|
||||
mov eax,ebx
|
||||
xor edx,edx
|
||||
mov ebx,[WinMapAddress-8]
|
||||
add ebx,[WinMapAddress-8]
|
||||
add ebx,[WinMapAddress-8]
|
||||
mul ebx
|
||||
mov esi,eax
|
||||
pop eax
|
||||
add esi,eax
|
||||
add esi,eax
|
||||
add esi,eax
|
||||
add esi,0x300000
|
||||
pop ebx
|
||||
pop eax
|
||||
|
||||
v12di4:
|
||||
|
||||
mov ecx,[esi]
|
||||
pusha
|
||||
mov esi,eax
|
||||
mov edi,ebx
|
||||
mov eax,[0xfe00]
|
||||
add eax,1
|
||||
mul ebx
|
||||
add eax,esi
|
||||
add eax,WinMapAddress
|
||||
cmp [eax],byte 1
|
||||
jnz v12nbgp
|
||||
mov eax,[0xfe08]
|
||||
mov ebx,edi
|
||||
mul ebx
|
||||
add eax,esi
|
||||
add eax,esi
|
||||
add eax,esi
|
||||
cmp [0xFBF1],byte 24
|
||||
jz v12bgl3
|
||||
add eax,esi
|
||||
|
||||
v12bgl3:
|
||||
|
||||
push ebx
|
||||
push eax
|
||||
|
||||
sub eax,[0xfe80]
|
||||
|
||||
shr eax,16
|
||||
call set_bank
|
||||
pop eax
|
||||
and eax,65535
|
||||
add eax,0xa0000
|
||||
pop ebx
|
||||
|
||||
mov [eax],cx
|
||||
add eax,2
|
||||
shr ecx,16
|
||||
mov [eax],cl
|
||||
sti
|
||||
|
||||
v12nbgp:
|
||||
|
||||
popa
|
||||
add esi,3
|
||||
inc eax
|
||||
cmp eax,[draw_data+32+8]
|
||||
jg v12nodp31
|
||||
jmp v12dp3
|
||||
|
||||
v12nodp31:
|
||||
|
||||
mov eax,[draw_data+32+0]
|
||||
inc ebx
|
||||
cmp ebx,[draw_data+32+12]
|
||||
jg v12dp4
|
||||
jmp v12dp3
|
||||
|
||||
v12dp4:
|
||||
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
ret
|
||||
|
||||
|
||||
vesa12_drawbar:
|
||||
|
||||
call [disable_mouse]
|
||||
|
||||
;; mov [novesachecksum],dword 0
|
||||
sub edx,ebx
|
||||
sub ecx,eax
|
||||
push esi
|
||||
push edi
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
mov ecx,[0x3010]
|
||||
add eax,[ecx-twdw]
|
||||
add ebx,[ecx-twdw+4]
|
||||
push eax
|
||||
mov eax,ebx ; y
|
||||
mov ebx,[0xfe08]
|
||||
mul ebx
|
||||
pop ecx
|
||||
add eax,ecx ; x
|
||||
add eax,ecx
|
||||
add eax,ecx
|
||||
cmp [0xfbf1],byte 24 ; 24 or 32 bpp ? - x start
|
||||
jz dbpi2412
|
||||
add eax,ecx
|
||||
|
||||
dbpi2412:
|
||||
|
||||
add eax,[0xfe80]
|
||||
mov edi,eax
|
||||
|
||||
; x size
|
||||
|
||||
mov eax,[esp+4] ; [esp+6]
|
||||
mov ecx,eax
|
||||
add ecx,eax
|
||||
add ecx,eax
|
||||
cmp [0xfbf1],byte 24 ; 24 or 32 bpp ? - x size
|
||||
jz dbpi24312
|
||||
add ecx,eax
|
||||
|
||||
dbpi24312:
|
||||
|
||||
mov ebx,[esp+0]
|
||||
|
||||
; check limits ?
|
||||
|
||||
push eax
|
||||
push ecx
|
||||
mov eax,[0x3010]
|
||||
mov ecx,[eax+draw_data-0x3000+0]
|
||||
cmp ecx,0
|
||||
jnz dbcblimitlset12
|
||||
mov ecx,[eax+draw_data-0x3000+4]
|
||||
cmp ecx,0
|
||||
jnz dbcblimitlset12
|
||||
mov ecx,[eax+draw_data-0x3000+8]
|
||||
cmp ecx,[0xfe00]
|
||||
jnz dbcblimitlset12
|
||||
mov ecx,[eax+draw_data-0x3000+12]
|
||||
cmp ecx,[0xfe04]
|
||||
jnz dbcblimitlset12
|
||||
pop ecx
|
||||
pop eax
|
||||
push dword 0
|
||||
jmp dbcblimitlno12
|
||||
|
||||
dbcblimitlset12:
|
||||
|
||||
pop ecx
|
||||
pop eax
|
||||
push dword 1
|
||||
|
||||
dbcblimitlno12:
|
||||
|
||||
cmp [0xfbf1],byte 24 ; 24 or 32 bpp ?
|
||||
jz dbpi24bit12
|
||||
jmp dbpi32bit12
|
||||
|
||||
|
||||
; DRAWBAR 24 BBP
|
||||
|
||||
|
||||
dbpi24bit12:
|
||||
|
||||
push eax
|
||||
push ebx
|
||||
push edx
|
||||
mov eax,ecx
|
||||
mov ebx,3
|
||||
div ebx
|
||||
mov ecx,eax
|
||||
pop edx
|
||||
pop ebx
|
||||
pop eax
|
||||
cld
|
||||
|
||||
dbnewpi12:
|
||||
|
||||
push ebx
|
||||
push edi
|
||||
push ecx
|
||||
|
||||
xor edx,edx
|
||||
mov eax,edi
|
||||
sub eax,[0xfe80]
|
||||
mov ebx,3
|
||||
div ebx
|
||||
add eax,WinMapAddress
|
||||
mov ebx,[0x3010]
|
||||
movzx ebx,byte[ebx+0xe]
|
||||
cld
|
||||
|
||||
dbnp2412:
|
||||
|
||||
mov dl,[eax]
|
||||
push eax
|
||||
push ecx
|
||||
cmp dl,bl
|
||||
jnz dbimp24no12
|
||||
cmp [esp+5*4],dword 0
|
||||
jz dbimp24yes12
|
||||
; call dbcplimit
|
||||
; jnz dbimp24no12
|
||||
|
||||
dbimp24yes12:
|
||||
|
||||
push edi
|
||||
mov eax,edi
|
||||
sub eax,[0xfe80]
|
||||
shr eax,16
|
||||
call set_bank
|
||||
and edi,0xffff
|
||||
add edi,0xa0000
|
||||
mov eax,[esp+8+3*4+16+4+4]
|
||||
stosw
|
||||
shr eax,16
|
||||
stosb
|
||||
sti
|
||||
pop edi
|
||||
add edi,3
|
||||
pop ecx
|
||||
pop eax
|
||||
inc eax
|
||||
loop dbnp2412
|
||||
jmp dbnp24d12
|
||||
|
||||
dbimp24no12:
|
||||
|
||||
pop ecx
|
||||
pop eax
|
||||
cld
|
||||
add edi,3
|
||||
inc eax
|
||||
loop dbnp2412
|
||||
|
||||
dbnp24d12:
|
||||
|
||||
mov eax,[esp+3*4+16+4]
|
||||
test eax,0x80000000
|
||||
jz nodbgl2412
|
||||
cmp al,0
|
||||
jz nodbgl2412
|
||||
dec eax
|
||||
mov [esp+3*4+16+4],eax
|
||||
|
||||
nodbgl2412:
|
||||
|
||||
pop ecx
|
||||
pop edi
|
||||
pop ebx
|
||||
add edi,[0xfe08]
|
||||
dec ebx
|
||||
jz dbnonewpi12
|
||||
jmp dbnewpi12
|
||||
|
||||
dbnonewpi12:
|
||||
|
||||
add esp,7*4
|
||||
|
||||
ret
|
||||
|
||||
|
||||
; DRAWBAR 32 BBP
|
||||
|
||||
|
||||
dbpi32bit12:
|
||||
|
||||
cld
|
||||
shr ecx,2
|
||||
|
||||
dbnewpi3212:
|
||||
|
||||
push ebx
|
||||
push edi
|
||||
push ecx
|
||||
|
||||
mov eax,edi
|
||||
sub eax,[0xfe80]
|
||||
shr eax,2
|
||||
add eax,WinMapAddress
|
||||
mov ebx,[0x3010]
|
||||
movzx ebx,byte[ebx+0xe]
|
||||
cld
|
||||
|
||||
dbnp3212:
|
||||
|
||||
mov dl,[eax]
|
||||
push eax
|
||||
push ecx
|
||||
cmp dl,bl
|
||||
jnz dbimp32no12
|
||||
cmp [esp+5*4],dword 0
|
||||
jz dbimp32yes12
|
||||
; call dbcplimit
|
||||
; jnz dbimp32no12
|
||||
|
||||
dbimp32yes12:
|
||||
|
||||
push edi
|
||||
mov eax,edi
|
||||
sub eax,[0xfe80]
|
||||
shr eax,16
|
||||
call set_bank
|
||||
and edi,0xffff
|
||||
add edi,0xa0000
|
||||
mov eax,[esp+8+3*4+16+4+4]
|
||||
stosw
|
||||
shr eax,16
|
||||
stosb
|
||||
sti
|
||||
pop edi
|
||||
add edi,4
|
||||
inc ebp
|
||||
pop ecx
|
||||
pop eax
|
||||
inc eax
|
||||
loop dbnp3212
|
||||
jmp dbnp32d12
|
||||
|
||||
dbimp32no12:
|
||||
|
||||
pop ecx
|
||||
pop eax
|
||||
inc eax
|
||||
add edi,4
|
||||
inc ebp
|
||||
loop dbnp3212
|
||||
|
||||
dbnp32d12:
|
||||
|
||||
mov eax,[esp+12+16+4]
|
||||
test eax,0x80000000
|
||||
jz nodbgl3212
|
||||
cmp al,0
|
||||
jz nodbgl3212
|
||||
dec eax
|
||||
mov [esp+12+16+4],eax
|
||||
|
||||
nodbgl3212:
|
||||
|
||||
pop ecx
|
||||
pop edi
|
||||
pop ebx
|
||||
add edi,[0xfe08]
|
||||
dec ebx
|
||||
jz nodbnewpi3212
|
||||
jmp dbnewpi3212
|
||||
|
||||
nodbnewpi3212:
|
||||
|
||||
add esp,7*4
|
||||
ret
|
||||
|
||||
|
||||
Vesa12_putpixel24:
|
||||
|
||||
mov edi,eax ; x
|
||||
mov eax,ebx ; y
|
||||
lea edi,[edi+edi*2]
|
||||
mov ebx,[0xfe08]
|
||||
mul ebx
|
||||
add edi,eax
|
||||
mov eax,edi
|
||||
shr eax,16
|
||||
call set_bank
|
||||
and edi,65535
|
||||
add edi,0xa0000
|
||||
mov eax,[esp+28]
|
||||
stosw
|
||||
shr eax,16
|
||||
mov [edi],al
|
||||
sti
|
||||
ret
|
||||
|
||||
|
||||
|
||||
Vesa12_putpixel32:
|
||||
|
||||
mov edi,eax ; x
|
||||
mov eax,ebx ; y
|
||||
shl edi,2
|
||||
mov ebx,[0xfe08]
|
||||
mul ebx
|
||||
add edi,eax
|
||||
mov eax,edi
|
||||
shr eax,16
|
||||
call set_bank
|
||||
and edi,65535
|
||||
add edi,0xa0000
|
||||
mov ecx,[esp+28]
|
||||
mov [edi],ecx
|
||||
sti
|
||||
ret
|
||||
|
||||
|
||||
Vesa12_getpixel24:
|
||||
|
||||
mov edi,eax ; x
|
||||
mov eax,ebx ; y
|
||||
lea edi,[edi+edi*2]
|
||||
mov ebx,[0xfe08]
|
||||
mul ebx
|
||||
add edi,eax
|
||||
mov eax,edi
|
||||
shr eax,16
|
||||
call set_bank
|
||||
and edi,65535
|
||||
add edi,0xa0000
|
||||
mov ecx,[edi]
|
||||
and ecx,255*256*256+255*256+255
|
||||
sti
|
||||
ret
|
||||
|
||||
|
||||
Vesa12_getpixel32:
|
||||
|
||||
mov edi,eax ; x
|
||||
mov eax,ebx ; y
|
||||
shl edi,2
|
||||
mov ebx,[0xfe08]
|
||||
xor edx,edx
|
||||
mul ebx
|
||||
add edi,eax
|
||||
mov eax,edi
|
||||
shr eax,16
|
||||
call set_bank
|
||||
and edi,65535
|
||||
add edi,0xa0000
|
||||
mov ecx,[edi]
|
||||
and ecx,255*256*256+255*256+255
|
||||
sti
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
||||
vesa12_putimage:
|
||||
|
||||
; mov ebx,image
|
||||
; mov ecx,320*65536+240
|
||||
; mov edx,20*65536+20
|
||||
|
||||
call [disable_mouse]
|
||||
|
||||
mov [novesachecksum],dword 0
|
||||
push esi
|
||||
push edi
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
movzx eax,word [esp+2]
|
||||
movzx ebx,word [esp+0]
|
||||
mov ecx,[0x3010]
|
||||
add eax,[ecx-twdw]
|
||||
add ebx,[ecx-twdw+4]
|
||||
push eax
|
||||
mov eax,ebx ; y
|
||||
mov ebx,[0xfe08]
|
||||
mul ebx
|
||||
pop ecx
|
||||
add eax,ecx ; x
|
||||
add eax,ecx
|
||||
add eax,ecx
|
||||
cmp [0xfbf1],byte 24 ; 24 or 32 bpp ? - x start
|
||||
jz pi2412
|
||||
add eax,ecx
|
||||
|
||||
pi2412:
|
||||
|
||||
add eax,[0xfe80]
|
||||
mov edi,eax
|
||||
|
||||
; x size
|
||||
|
||||
movzx eax,word [esp+6]
|
||||
mov ecx,eax
|
||||
add ecx,eax
|
||||
add ecx,eax
|
||||
cmp [0xfbf1],byte 24 ; 24 or 32 bpp ? - x size
|
||||
jz pi24312
|
||||
add ecx,eax
|
||||
|
||||
pi24312:
|
||||
|
||||
mov esi,[esp+8]
|
||||
movzx ebx,word [esp+4]
|
||||
|
||||
; check limits while draw ?
|
||||
|
||||
push eax
|
||||
push ecx
|
||||
mov eax,[0x3010]
|
||||
mov ecx,[eax+draw_data-0x3000+0]
|
||||
cmp ecx,0
|
||||
jnz dbcblimitlset212
|
||||
mov ecx,[eax+draw_data-0x3000+4]
|
||||
cmp ecx,0
|
||||
jnz dbcblimitlset212
|
||||
mov ecx,[eax+draw_data-0x3000+8]
|
||||
cmp ecx,[0xfe00]
|
||||
jnz dbcblimitlset212
|
||||
mov ecx,[eax+draw_data-0x3000+12]
|
||||
cmp ecx,[0xfe04]
|
||||
jnz dbcblimitlset212
|
||||
pop ecx
|
||||
pop eax
|
||||
push dword 0
|
||||
jmp dbcblimitlno212
|
||||
|
||||
dbcblimitlset212:
|
||||
|
||||
pop ecx
|
||||
pop eax
|
||||
push dword 1
|
||||
|
||||
dbcblimitlno212:
|
||||
|
||||
cmp [0xfbf1],byte 24 ; 24 or 32 bpp ?
|
||||
jz pi24bit12
|
||||
jmp pi32bit12
|
||||
|
||||
pi24bit12:
|
||||
|
||||
cld
|
||||
push eax
|
||||
push ebx
|
||||
push edx
|
||||
xor edx,edx
|
||||
mov eax,ecx
|
||||
mov ebx,3
|
||||
div ebx
|
||||
mov ecx,eax
|
||||
pop edx
|
||||
pop ebx
|
||||
pop eax
|
||||
|
||||
newpi12:
|
||||
|
||||
push edi
|
||||
push esi
|
||||
push ecx
|
||||
push ebx
|
||||
|
||||
xor edx,edx
|
||||
mov eax,edi
|
||||
sub eax,[0xfe80]
|
||||
mov ebx,3
|
||||
div ebx
|
||||
add eax,WinMapAddress
|
||||
mov ebx,[0x3010]
|
||||
mov bl,[ebx+0xe]
|
||||
mov bh,[esp+4*4]
|
||||
|
||||
np2412:
|
||||
|
||||
cmp bl,[eax]
|
||||
jnz imp24no12
|
||||
mov edx,[esi]
|
||||
cmp bh,0
|
||||
jz imp24yes12
|
||||
; call dbcplimit
|
||||
; jnz imp24no12
|
||||
|
||||
imp24yes12:
|
||||
|
||||
push eax
|
||||
push edi
|
||||
mov eax,edi
|
||||
sub eax,[0xfe80]
|
||||
shr eax,16
|
||||
call set_bank
|
||||
and edi,0xffff
|
||||
add edi,0xa0000
|
||||
mov [edi],edx
|
||||
shr edx,2
|
||||
mov [edi+2],dl
|
||||
sti
|
||||
pop edi
|
||||
pop eax
|
||||
|
||||
imp24no12:
|
||||
|
||||
inc eax
|
||||
add esi,3
|
||||
add edi,3
|
||||
dec ecx
|
||||
jnz np2412
|
||||
|
||||
np24d12:
|
||||
|
||||
pop ebx
|
||||
pop ecx
|
||||
pop esi
|
||||
pop edi
|
||||
|
||||
add edi,[0xfe08]
|
||||
xor eax,eax
|
||||
mov ax,[esp+4+2+4]
|
||||
lea eax,[eax+eax*2]
|
||||
add esi,eax
|
||||
dec ebx
|
||||
jz nonewpi12
|
||||
jmp newpi12
|
||||
|
||||
nonewpi12:
|
||||
|
||||
add esp,7*4
|
||||
mov eax,0
|
||||
ret
|
||||
|
||||
|
||||
pi32bit12:
|
||||
|
||||
cld
|
||||
shr ecx,2
|
||||
|
||||
newpi3212:
|
||||
|
||||
push edi
|
||||
push esi
|
||||
push ecx
|
||||
push ebx
|
||||
|
||||
mov eax,edi
|
||||
sub eax,[0xfe80]
|
||||
shr eax,2
|
||||
add eax,WinMapAddress
|
||||
mov ebx,[0x3010]
|
||||
mov bl,[ebx+0xe]
|
||||
mov bh,[esp+4*4]
|
||||
|
||||
np3212:
|
||||
|
||||
cmp bl,[eax]
|
||||
jnz imp32no12
|
||||
mov edx,[esi]
|
||||
cmp bh,0
|
||||
jz imp32yes12
|
||||
; call dbcplimit
|
||||
; jnz imp32no12
|
||||
|
||||
imp32yes12:
|
||||
|
||||
push eax
|
||||
push edi
|
||||
mov eax,edi
|
||||
sub eax,[0xfe80]
|
||||
shr eax,16
|
||||
call set_bank
|
||||
and edi,0xffff
|
||||
add edi,0xa0000
|
||||
mov [edi],edx
|
||||
sti
|
||||
pop edi
|
||||
pop eax
|
||||
|
||||
imp32no12:
|
||||
|
||||
inc eax
|
||||
add esi,3
|
||||
add edi,4
|
||||
dec ecx
|
||||
jnz np3212
|
||||
|
||||
np32d12:
|
||||
|
||||
pop ebx
|
||||
pop ecx
|
||||
pop esi
|
||||
pop edi
|
||||
|
||||
add edi,[0xfe08]
|
||||
movzx eax,word [esp+4+2+4]
|
||||
lea eax,[eax+eax*2]
|
||||
add esi,eax
|
||||
dec ebx
|
||||
jz nonewpi3212
|
||||
jmp newpi3212
|
||||
|
||||
nonewpi3212:
|
||||
|
||||
add esp,7*4
|
||||
mov eax,0
|
||||
ret
|
||||
|
||||
|
||||
vesa12_read_screen_pixel:
|
||||
|
||||
and eax,0x3FFFFF
|
||||
cmp [0xfbf1],byte 24 ; 24 or 32 bpp ?
|
||||
jz v12rsp24
|
||||
mov edi,eax
|
||||
shl edi,2
|
||||
mov eax,edi
|
||||
shr eax,16
|
||||
call set_bank
|
||||
and edi,65535
|
||||
add edi,0xa0000
|
||||
mov eax,[edi]
|
||||
and eax,0x00ffffff
|
||||
ret
|
||||
v12rsp24:
|
||||
|
||||
imul eax,3
|
||||
mov edi,eax
|
||||
shr eax,16
|
||||
call set_bank
|
||||
and edi,65535
|
||||
add edi,0xa0000
|
||||
mov eax,[edi]
|
||||
and eax,0x00ffffff
|
||||
ret
|
||||
|
||||
|
1119
kernel/tags/kolibri0.5.3.0/video/vesa20.inc
Normal file
1119
kernel/tags/kolibri0.5.3.0/video/vesa20.inc
Normal file
File diff suppressed because it is too large
Load Diff
787
kernel/tags/kolibri0.5.3.0/video/vga.inc
Normal file
787
kernel/tags/kolibri0.5.3.0/video/vga.inc
Normal file
@ -0,0 +1,787 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; VGA.INC ;;
|
||||
;; ;;
|
||||
;; 640x480 mode 0x12 VGA functions for MenuetOS ;;
|
||||
;; ;;
|
||||
;; Paul Butcher, paul.butcher@asa.co.uk ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
|
||||
paletteVGA:
|
||||
|
||||
;16 colour palette
|
||||
mov dx,0x3c8
|
||||
mov al,0
|
||||
out dx,al
|
||||
|
||||
mov ecx,16
|
||||
mov dx,0x3c9
|
||||
xor eax,eax
|
||||
|
||||
palvganew:
|
||||
|
||||
mov al,0
|
||||
test ah,4
|
||||
jz palvgalbl1
|
||||
add al,31
|
||||
test ah,8
|
||||
jz palvgalbl1
|
||||
add al,32
|
||||
palvgalbl1:
|
||||
out dx,al ; red 0,31 or 63
|
||||
mov al,0
|
||||
test ah,2
|
||||
jz palvgalbl2
|
||||
add al,31
|
||||
test ah,8
|
||||
jz palvgalbl2
|
||||
add al,32
|
||||
palvgalbl2:
|
||||
out dx,al ; blue 0,31 or 63
|
||||
mov al,0
|
||||
test ah,1
|
||||
jz palvgalbl3
|
||||
add al,31
|
||||
test ah,8
|
||||
jz palvgalbl3
|
||||
add al,32
|
||||
palvgalbl3:
|
||||
out dx,al ; green 0,31 or 63
|
||||
add ah,1
|
||||
loop palvganew
|
||||
|
||||
ret
|
||||
|
||||
|
||||
vga_putimage:
|
||||
; pushad
|
||||
call [disable_mouse]
|
||||
push ebp ;
|
||||
push esi ;
|
||||
push edi ;
|
||||
|
||||
push eax ;
|
||||
push ebx ; +8 [ptrImage]
|
||||
push ecx ; +4 [BH]
|
||||
push edx ; +0 [xy]
|
||||
|
||||
movzx eax,word [esp+2] ; eax:=x
|
||||
movzx ebx,word [esp+0] ; ebx:=y
|
||||
mov ecx,[0x3010] ;
|
||||
add eax,[ecx-twdw] ; eax+=Xwin
|
||||
add ebx,[ecx-twdw+4] ; ebx+=Ywin
|
||||
mov ecx,ebx ; ecx = y+Ywin
|
||||
mov edx,eax ; edx = x+Xwin
|
||||
|
||||
imul ebx, 640*4 ; (y+Ywin)*BytesPerScanLine
|
||||
shl eax,2 ; (x+Xwin)*BytesPerPixel
|
||||
add eax,ebx ;
|
||||
mov edi,eax ; store copy
|
||||
add eax,[0xfe80] ; +AddrLFB
|
||||
;entry point in LFB >> EAX:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+AddrLFB
|
||||
|
||||
shr edi,5 ; change from 4 to 1/8 BytesPerPixel
|
||||
add edi,0xa0000 ; + VGABasePtr
|
||||
;VGA start address >> EDI:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+AddrVGA
|
||||
|
||||
mov ebx, [0xfe00] ; ScreenXSize
|
||||
inc ebx ; +1
|
||||
imul ebx,ecx ; *(y+Ywin)
|
||||
mov ebp, ebx ;
|
||||
add ebp, edx ; +(x+Xwin)
|
||||
add ebp, WinMapAddress ; ebp:=(y+Ywin)*(ScreenXSize+1)+(x+Xwin)+AddrBuffer
|
||||
|
||||
mov esi,[esp+8] ; esi:=AddrImg
|
||||
movzx ecx,word [esp+6] ; ecx:=B
|
||||
movzx ebx,word [esp+4] ; ebx:=H
|
||||
|
||||
; check limits while draw ?
|
||||
|
||||
push ecx ; B
|
||||
push eax ; LFB address
|
||||
|
||||
mov eax,[0x3010]
|
||||
mov ecx,[eax+draw_data-0x3000+0]
|
||||
cmp ecx,0
|
||||
jnz dbcblimitlset_vga
|
||||
|
||||
mov ecx,[eax+draw_data-0x3000+4]
|
||||
cmp ecx,0
|
||||
jnz dbcblimitlset_vga
|
||||
|
||||
mov ecx,[eax+draw_data-0x3000+8]
|
||||
cmp ecx,[0xfe00] ; ecx <> Screen X size
|
||||
jnz dbcblimitlset_vga
|
||||
|
||||
mov ecx,[eax+draw_data-0x3000+12]
|
||||
cmp ecx,[0xfe04] ; ecx <> Screen Y size
|
||||
jnz dbcblimitlset_vga
|
||||
|
||||
pop eax ; LFB address
|
||||
pop ecx ; B
|
||||
|
||||
push dword 0
|
||||
|
||||
jmp pimvga
|
||||
|
||||
dbcblimitlset_vga:
|
||||
|
||||
pop eax ; LFB address
|
||||
pop ecx ; B
|
||||
|
||||
push dword 1
|
||||
|
||||
pimvga:
|
||||
push edi
|
||||
push esi
|
||||
push eax ; LFB address
|
||||
push ecx ; B
|
||||
push ebx ; H
|
||||
push edx ; x+Xwin
|
||||
|
||||
mov ebx,[0x3010]
|
||||
mov bl,[ebx+0xe]
|
||||
mov bh,[esp+6*4]
|
||||
|
||||
cld
|
||||
|
||||
npvga:
|
||||
|
||||
cmp bl,[ds:ebp]
|
||||
jnz impvgano
|
||||
|
||||
; cmp bh,0
|
||||
; jz impvgayes
|
||||
|
||||
; call voodoodbcplimit
|
||||
; jnz impvgano
|
||||
|
||||
; impvgayes:
|
||||
|
||||
push eax ; LFB address
|
||||
push ebx ; app no.
|
||||
push ecx ; B
|
||||
push edx ; x+Xwin
|
||||
|
||||
mov edx,[esi] ; color
|
||||
mov [eax],dx
|
||||
shr edx,16
|
||||
mov [eax+2],dl
|
||||
|
||||
mov eax,[esi] ; color
|
||||
mov ecx,[esp] ; x+Xwin
|
||||
and ecx,0x07 ; modulo 8
|
||||
call setvgapixel ; eax=color, ecx=x%8, edi=VGA address
|
||||
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
|
||||
impvgano:
|
||||
|
||||
add esi,3 ; esi+=3 ptrImage+=3
|
||||
add eax,4 ; eax+=4 LFBaddr +=4
|
||||
inc ebp
|
||||
inc edx ; x+Xwin+n
|
||||
|
||||
test edx,0x07 ; test modulo 8
|
||||
jnz impvgacont
|
||||
inc edi
|
||||
|
||||
impvgacont:
|
||||
dec ecx ; B--
|
||||
jnz npvga
|
||||
|
||||
pop edx
|
||||
pop ebx
|
||||
pop ecx
|
||||
pop eax
|
||||
pop esi
|
||||
pop edi
|
||||
|
||||
add edi,640/8 ; add one VGA line
|
||||
add eax,640*4 ; add one LFB line
|
||||
|
||||
sub ebp, ecx ; -B
|
||||
add ebp, [0xfe00] ;
|
||||
inc ebp ; ptrBuffer:=ptrBuffer-B+Screen_Xsize+1
|
||||
|
||||
push ecx
|
||||
lea ecx,[ecx+ecx*2] ;
|
||||
add esi,ecx ; ptrImage:=ptrImage+B*3
|
||||
pop ecx
|
||||
|
||||
dec ebx ; H--
|
||||
jnz near pimvga
|
||||
|
||||
add esp,4 ; jump saved limit byte
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebp
|
||||
|
||||
; call [draw_pointer]
|
||||
; call [disable_mouse]
|
||||
; popad
|
||||
ret
|
||||
|
||||
|
||||
VGA_putpixel:
|
||||
|
||||
; eax = x
|
||||
; ebx = y
|
||||
|
||||
mov ecx,eax
|
||||
mov eax, [esp+32-8+4] ; color
|
||||
|
||||
imul ebx, 640*4 ; y*BytesPerLine (Vesa2.0 32)
|
||||
lea edx, [ebx+ecx*4] ; + x*BytesPerPixel (Vesa2.0 32)
|
||||
|
||||
mov edi,edx
|
||||
add edi, [0xfe80] ; + LFB address
|
||||
mov [edi], eax ; write to LFB for Vesa2.0
|
||||
|
||||
shr edx,5 ; change BytesPerPixel to 1/8
|
||||
mov edi,edx
|
||||
add edi, 0x0a0000 ; address of pixel in VGA area
|
||||
|
||||
and ecx,0x07 ; bit no. (modulo 8)
|
||||
|
||||
setvgapixel:
|
||||
cli
|
||||
; edi = address, eax = 24bit colour, ecx = bit no. (modulo 8)
|
||||
|
||||
push eax
|
||||
mov ebx,eax ; color
|
||||
|
||||
;mov al,0x08
|
||||
;mov dx,0x03ce
|
||||
;out dx,al ; select GDC bit mask register
|
||||
|
||||
inc cl
|
||||
mov ax, 0x100
|
||||
shr ax,cl
|
||||
mov dx,0x03cf
|
||||
out dx,al ; set bit mask for pixel
|
||||
|
||||
mov dl,0
|
||||
mov eax,ebx
|
||||
and eax,0x000000ff ; blue
|
||||
cmp eax,85
|
||||
jle p13green
|
||||
or dl,0x01
|
||||
cmp eax,170
|
||||
jle p13green
|
||||
or dl,0x08
|
||||
|
||||
p13green:
|
||||
and ebx,0x0000ff00 ; green
|
||||
cmp ebx,85*256
|
||||
jle p13red
|
||||
or dl,0x02
|
||||
cmp ebx,170*256
|
||||
jle p13red
|
||||
or dl,0x08
|
||||
|
||||
p13red:
|
||||
pop ebx
|
||||
and ebx,0x00ff0000 ; red
|
||||
cmp ebx,85*256*256
|
||||
jle p13cont
|
||||
or dl,0x04
|
||||
cmp ebx,170*256*256
|
||||
jle p13cont
|
||||
or dl,0x08
|
||||
|
||||
p13cont:
|
||||
mov al,[edi] ; dummy read
|
||||
mov [edi],dl
|
||||
|
||||
sti
|
||||
ret
|
||||
|
||||
|
||||
vga_drawbar:
|
||||
; pushad
|
||||
call [disable_mouse]
|
||||
sub edx,ebx ; edx:=Yend-Ystart=H
|
||||
sub ecx,eax ; ecx:=Xend-Xstat=B
|
||||
|
||||
push ebp ; +24
|
||||
push esi ; +20
|
||||
push edi ; +16
|
||||
push eax ; +12
|
||||
push ebx ; +8
|
||||
push ecx ; +4
|
||||
push edx ; +0
|
||||
|
||||
mov ecx,[0x3010] ;
|
||||
add eax,[ecx-twdw] ; eax:=Xwin+x
|
||||
add ebx,[ecx-twdw+4] ; ebx:=Ywin+y
|
||||
mov ecx, eax ; ecx:=(x+Xwin)
|
||||
mov edx, ebx ; edx:=(y+Ywin)
|
||||
|
||||
imul ebx, 640/8 ;
|
||||
mov edi, ebx ; edi:=BytesPerScanLine*(y+Ywin)
|
||||
shr eax, 3 ;
|
||||
add edi, eax ; + (x+Xwin)*BytesPerPixel
|
||||
add edi,0xa0000 ; + VGAbaseaddress
|
||||
|
||||
mov eax, [0xfe00] ; ScreenXSize
|
||||
inc eax ; +1
|
||||
imul eax,edx ; *(y+Ywin)
|
||||
mov ebp, eax ;
|
||||
add ebp, ecx ; +(x+Win)
|
||||
add ebp, WinMapAddress ; +AddrBuffer
|
||||
|
||||
mov eax, [0xfe08] ; BytesPerScanLine - LFB
|
||||
mul edx ; *(y+Ywin)
|
||||
mov esi,eax
|
||||
add esi,ecx
|
||||
add esi,ecx
|
||||
add esi,ecx
|
||||
add esi,ecx ; + 4*(x+Xwin)
|
||||
add esi,[0xfe80] ; +AddrLFB
|
||||
|
||||
; edi:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel + AddrVGA
|
||||
; esi:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel + AddrLFB
|
||||
; ebp:=(y+Ywin)*(ScreenXSize+1)+(x+Xwin)+AddrBuffer
|
||||
|
||||
; x size
|
||||
|
||||
mov eax,[esp+4] ; B [esp+4]
|
||||
mov ebx,[esp+0] ; H
|
||||
|
||||
mov edx,[esp+16] ; color
|
||||
test edx,0x80000000
|
||||
jz nodbglvga
|
||||
|
||||
; no color glide for VGA - set to half glide
|
||||
shr ebx,1 ; H/2
|
||||
sub edx,ebx
|
||||
mov [esp+16],edx
|
||||
mov ebx,[esp+0] ; reset to H
|
||||
|
||||
nodbglvga:
|
||||
; check limits ?
|
||||
|
||||
push eax
|
||||
push ecx
|
||||
|
||||
mov eax,[0x3010]
|
||||
|
||||
mov ecx,[eax+draw_data-0x3000+0]
|
||||
cmp ecx,0
|
||||
jnz dbcblimitlset_vga2
|
||||
|
||||
mov ecx,[eax+draw_data-0x3000+4]
|
||||
cmp ecx,0
|
||||
jnz dbcblimitlset_vga2
|
||||
|
||||
mov ecx,[eax+draw_data-0x3000+8]
|
||||
cmp ecx,[0xfe00]
|
||||
jnz dbcblimitlset_vga2
|
||||
|
||||
mov ecx,[eax+draw_data-0x3000+12]
|
||||
cmp ecx,[0xfe04]
|
||||
jnz dbcblimitlset_vga2
|
||||
|
||||
pop ecx
|
||||
pop eax
|
||||
|
||||
push dword 0
|
||||
|
||||
jmp dbnewpivga
|
||||
|
||||
dbcblimitlset_vga2:
|
||||
|
||||
pop ecx ; x+Xwin
|
||||
pop eax ; B
|
||||
|
||||
push dword 1
|
||||
|
||||
dbnewpivga:
|
||||
|
||||
push eax; B
|
||||
push ebx ; H
|
||||
push edi
|
||||
push esi
|
||||
push ecx ; x+Xwin
|
||||
|
||||
mov ebx,[0x3010]
|
||||
movzx ebx,byte[ebx+0xe]
|
||||
|
||||
cld
|
||||
|
||||
dbnpvga:
|
||||
|
||||
mov dl,[ds:ebp]
|
||||
|
||||
cmp dl,bl
|
||||
jnz dbimpvgano
|
||||
|
||||
; mov edx,[esp+5*4] ; check limit?
|
||||
; cmp edx,0
|
||||
; jz dbimpvgayes
|
||||
|
||||
; call voodoodbcplimit
|
||||
; jnz dbimpvgano
|
||||
|
||||
; dbimpvgayes:
|
||||
|
||||
push eax ; B
|
||||
push ebx
|
||||
push ecx ; x+Xwin
|
||||
|
||||
mov eax,[esp+12+20+16+4] ; color
|
||||
mov ebx,eax
|
||||
|
||||
mov [esi],bx ; write LFB pixel
|
||||
shr ebx,16
|
||||
mov [esi+2],bl
|
||||
|
||||
and ecx,0x07 ; modulo 8
|
||||
call setvgapixel ; eax=color, ecx=x%8, edi=VGA address
|
||||
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
|
||||
dbimpvgano:
|
||||
|
||||
add esi,4 ; ptrLFB+=4
|
||||
inc ebp ; address buffer
|
||||
inc ecx ; x posn++
|
||||
test ecx,0x07 ; test modulo 8
|
||||
jnz dbvgacont
|
||||
inc edi ; VGA screen ptr++
|
||||
|
||||
dbvgacont:
|
||||
dec eax ; B-- NB ecx in Vesa20 fn?
|
||||
jnz dbnpvga
|
||||
|
||||
dbnpvgad:
|
||||
|
||||
pop ecx
|
||||
pop esi
|
||||
pop edi
|
||||
pop ebx
|
||||
pop eax
|
||||
|
||||
add esi,[0xfe08] ; ptrLFB+=BytesPerScanLine
|
||||
add edi,640/8 ; ptrScreen+=BytesPerScanLine
|
||||
|
||||
add ebp,[0xfe00] ;
|
||||
sub ebp, eax ; was ecx in vesa20 fn?
|
||||
inc ebp ; ptrBuffer:=ptrBuffer-B+BytesPerLine+1
|
||||
|
||||
dec ebx ; H--
|
||||
jz nodbnewpivga ; H<>0
|
||||
|
||||
jmp dbnewpivga
|
||||
|
||||
nodbnewpivga:
|
||||
|
||||
add esp,7*4 ; NB includes limit check flag
|
||||
;pop ebx
|
||||
;pop eax
|
||||
;pop edi
|
||||
;pop esi
|
||||
pop ebp
|
||||
|
||||
;pop edx
|
||||
;pop ecx
|
||||
; popad
|
||||
ret
|
||||
|
||||
|
||||
vga_drawbackground_tiled:
|
||||
call [disable_mouse]
|
||||
push ebp
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
|
||||
mov edx,dword [0x400000-8] ; B
|
||||
add edx,dword [WinMapAddress-8] ; +B
|
||||
add edx,dword [WinMapAddress-8] ; +B
|
||||
push edx
|
||||
|
||||
mov eax,[draw_data+32+0] ; x start:=(x+Xwin)
|
||||
mov ebx,[draw_data+32+4] ; y start:=(y+Ywin)
|
||||
mov ecx,eax
|
||||
mov edx,ebx
|
||||
|
||||
imul edx, 640*4 ; (y+Ywin)*BytesPerScanLine
|
||||
shl ecx,2 ; (x+Xwin)*BytesPerPixel
|
||||
add ecx,edx ;
|
||||
mov ebp,ecx ; store copy
|
||||
add ecx,[0xfe80] ; +AddrLFB
|
||||
;entry point in LFB >> ECX:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+Addr
|
||||
|
||||
shr ebp,5 ; change from 4 to 1/8 BytesPerPixel
|
||||
add ebp,0xa0000 ; + VGABasePtr
|
||||
;VGA start address >> EBP:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+AddrV
|
||||
|
||||
|
||||
call calculate_edi
|
||||
|
||||
dp3vga: ; MAIN LOOP
|
||||
|
||||
cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1)
|
||||
je ybgpvga
|
||||
|
||||
jmp nbgpvga
|
||||
|
||||
ybgpvga:
|
||||
|
||||
push eax ; x
|
||||
push ebx ; y
|
||||
push ecx ; LFB address
|
||||
|
||||
mov ecx,dword [WinMapAddress-8] ; B
|
||||
xor edx,edx ; edx:=0
|
||||
div ecx ; Xstart/B
|
||||
|
||||
; eax=Int(qn) edx:=Rem
|
||||
|
||||
lea esi,[edx+edx*2] ; esi:=edx*3
|
||||
|
||||
mov ecx,dword [WinMapAddress-4] ; ecx:=H
|
||||
mov eax,[esp+4] ; eax:=Ystart
|
||||
xor edx,edx ;
|
||||
div ecx ; Ystart/H
|
||||
|
||||
mov eax,edx ; eax:=Rem
|
||||
xor edx,edx ;
|
||||
mov ebx,[esp+12] ; ebx:=B*3
|
||||
mul ebx ;
|
||||
add esi,eax ;
|
||||
|
||||
mov eax,[esi+0x300000] ; color
|
||||
and eax,0xffffff
|
||||
|
||||
mov ecx, [esp] ; LFB address
|
||||
mov ebx,eax ; copy color
|
||||
mov [ecx],bx
|
||||
shr ebx,16
|
||||
mov [ecx+2],bl
|
||||
|
||||
xchg edi, ebp
|
||||
mov ecx,[esp+8] ; x position
|
||||
and ecx,0x07 ; x modulo 8
|
||||
call setvgapixel ; eax=color, ecx=x%8, edi=VGA address
|
||||
xchg ebp, edi
|
||||
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
|
||||
nbgpvga:
|
||||
|
||||
inc eax ; x++
|
||||
cmp eax,[draw_data+32+8] ; X > xend?
|
||||
jg nodp3vga
|
||||
|
||||
test eax,0x07 ; x test modulo 8
|
||||
jnz hook1vga
|
||||
inc ebp ; VGA address++
|
||||
|
||||
hook1vga:
|
||||
add ecx,4 ; LFB address += 4
|
||||
inc edi ; ptrBuffer++
|
||||
add esi,3 ; ptrImage+=3
|
||||
jmp dp3vga
|
||||
|
||||
nodp3vga:
|
||||
|
||||
mov eax,[draw_data+32+0] ; x+Xwin
|
||||
inc ebx ; y position
|
||||
mov ecx,eax
|
||||
mov edx,ebx
|
||||
|
||||
imul edx, 640*4 ; (y+Ywin)*BytesPerScanLine
|
||||
shl ecx,2 ; (x+Xwin)*BytesPerPixel
|
||||
add ecx,edx ;
|
||||
mov ebp,ecx ; store copy
|
||||
add ecx,[0xfe80] ; +AddrLFB
|
||||
;entry point in LFB >> ECX:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+Addr
|
||||
|
||||
|
||||
shr ebp,5 ; change from 4 to 1/8 BytesPerPixel
|
||||
add ebp,0xa0000 ; + VGABasePtr
|
||||
;VGA start address >> EBP:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+AddrV
|
||||
|
||||
|
||||
call calculate_edi
|
||||
|
||||
cmp ebx,[draw_data+32+12] ; Y > yend
|
||||
jg dp4vga
|
||||
|
||||
jmp dp3vga
|
||||
|
||||
dp4vga:
|
||||
|
||||
add esp,4
|
||||
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
pop ebp
|
||||
|
||||
ret
|
||||
|
||||
; ----------
|
||||
|
||||
|
||||
|
||||
vga_drawbackground_stretch:
|
||||
call [disable_mouse]
|
||||
|
||||
push ebp
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
|
||||
mov edx,dword [WinMapAddress-8] ; B
|
||||
add edx,dword [WinMapAddress-8] ; +B
|
||||
add edx,dword [WinMapAddress-8] ; +B
|
||||
push edx
|
||||
|
||||
mov eax,[draw_data+32+0] ; x start:=(x+Xwin)
|
||||
mov ebx,[draw_data+32+4] ; y start:=(y+Ywin)
|
||||
mov ecx,eax
|
||||
mov edx,ebx
|
||||
|
||||
imul edx, 640*4 ; (y+Ywin)*BytesPerScanLine
|
||||
shl ecx,2 ; (x+Xwin)*BytesPerPixel
|
||||
add ecx,edx ;
|
||||
mov ebp,ecx ; store copy
|
||||
add ecx,[0xfe80] ; +AddrLFB
|
||||
;entry point in LFB >> ECX:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+Addr
|
||||
|
||||
shr ebp,5 ; change from 4 to 1/8 BytesPerPixel
|
||||
add ebp,0xa0000 ; + VGABasePtr
|
||||
;VGA start address >> EBP:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+AddrV
|
||||
|
||||
|
||||
call calculate_edi
|
||||
|
||||
sdp3vga: ; MAIN LOOP
|
||||
|
||||
cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1)
|
||||
je sybgpvga
|
||||
|
||||
jmp snbgpvga
|
||||
|
||||
sybgpvga:
|
||||
|
||||
push eax ; x
|
||||
push ebx ; y
|
||||
push ecx ; LFB address
|
||||
|
||||
mov eax,dword [WinMapAddress-8] ; B
|
||||
xor edx,edx
|
||||
mov ebx,[esp+8] ; Xstart
|
||||
mul ebx ; B*Xstart
|
||||
xor edx,edx
|
||||
mov ebx,[0xfe00] ; x screen width
|
||||
div ebx ; B*Xstart/xwidth
|
||||
lea esi,[eax+eax*2] ; *3
|
||||
mov eax,dword [WinMapAddress-4] ; H
|
||||
xor edx,edx
|
||||
mov ebx,[esp+4] ; Ystart
|
||||
mul ebx ; H*Ystart
|
||||
xor edx,edx
|
||||
mov ebx,[0xfe04] ; y screen height
|
||||
div ebx ; H*Ystart/yheight
|
||||
|
||||
xor edx,edx
|
||||
mov ebx,[esp+12] ; B*3
|
||||
mul ebx ;
|
||||
add esi,eax
|
||||
mov eax,[esi+0x300000] ; color
|
||||
and eax,0xffffff
|
||||
|
||||
mov ecx, [esp] ; LFB address
|
||||
mov ebx,eax ; copy color
|
||||
mov [ecx],bx
|
||||
shr ebx,16
|
||||
mov [ecx+2],bl
|
||||
|
||||
xchg edi, ebp
|
||||
mov ecx,[esp+8] ; x position
|
||||
and ecx,0x07 ; x modulo 8
|
||||
call setvgapixel ; eax=color, ecx=x%8, edi=VGA address
|
||||
xchg ebp, edi ; ebp+=3
|
||||
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
|
||||
snbgpvga:
|
||||
|
||||
inc eax ; x++
|
||||
cmp eax,[draw_data+32+8] ; X > xend?
|
||||
jg snodp3vga
|
||||
|
||||
test eax,0x07 ; x test modulo 8
|
||||
jnz shook1vga
|
||||
inc ebp ; VGA address++
|
||||
|
||||
shook1vga:
|
||||
add ecx,4 ; LFB address += 4
|
||||
inc edi ; ptrBuffer++
|
||||
add esi,3 ; ptrImage+=3
|
||||
jmp sdp3vga
|
||||
|
||||
snodp3vga:
|
||||
|
||||
mov eax,[draw_data+32+0] ; x+Xwin
|
||||
inc ebx ; y position
|
||||
mov ecx,eax
|
||||
mov edx,ebx
|
||||
|
||||
imul edx, 640*4 ; (y+Ywin)*BytesPerScanLine
|
||||
shl ecx,2 ; (x+Xwin)*BytesPerPixel
|
||||
add ecx,edx ;
|
||||
mov ebp,ecx ; store copy
|
||||
add ecx,[0xfe80] ; +AddrLFB
|
||||
;entry point in LFB >> ECX:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+Addr
|
||||
|
||||
|
||||
shr ebp,5 ; change from 4 to 1/8 BytesPerPixel
|
||||
add ebp,0xa0000 ; + VGABasePtr
|
||||
;VGA start address >> EBP:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+A
|
||||
|
||||
|
||||
call calculate_edi
|
||||
|
||||
cmp ebx,[draw_data+32+12] ; Y > yend
|
||||
jg sdp4vga
|
||||
|
||||
jmp sdp3vga
|
||||
|
||||
sdp4vga:
|
||||
|
||||
add esp,4
|
||||
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
pop ebp
|
||||
|
||||
ret
|
||||
|
||||
|
43
kernel/tags/kolibri0.5.3.0/vmodeint.inc
Normal file
43
kernel/tags/kolibri0.5.3.0/vmodeint.inc
Normal file
@ -0,0 +1,43 @@
|
||||
;
|
||||
; Call of videomode driver's functions
|
||||
;
|
||||
; (Add in System function 21 (and/or 26) as a subfunction 13)
|
||||
;
|
||||
; Author: Trans
|
||||
; Date: 19.07.2003
|
||||
;
|
||||
; Include in MeOS kernel and compile with FASM
|
||||
;
|
||||
|
||||
uglobal
|
||||
old_screen_width dd ?
|
||||
old_screen_height dd ?
|
||||
endg
|
||||
|
||||
cmp eax,13 ; CALL VIDEOMODE DRIVER FUNCTIONS
|
||||
jne .no_vmode_drv_access
|
||||
pushd [0x0000fe00] [0x0000fe04]
|
||||
popd [old_screen_height] [old_screen_width]
|
||||
or eax,-1 ; If driver is absent then eax does not change
|
||||
call 0x760100 ; Entry point of video driver
|
||||
mov [esp+36],eax
|
||||
mov [esp+24],ebx
|
||||
mov [esp+32],ecx
|
||||
; mov [esp+28],edx
|
||||
mov eax,[old_screen_width]
|
||||
mov ebx,[old_screen_height]
|
||||
sub eax,[0x0000fe00]
|
||||
jnz @f
|
||||
sub ebx,[0x0000fe04]
|
||||
jz .resolution_wasnt_changed
|
||||
jmp .lp1
|
||||
@@: sub ebx,[0x0000fe04]
|
||||
.lp1: sub [screen_workarea.right],eax
|
||||
sub [screen_workarea.bottom],ebx
|
||||
|
||||
call repos_windows
|
||||
call calculatescreen
|
||||
|
||||
.resolution_wasnt_changed:
|
||||
ret
|
||||
.no_vmode_drv_access:
|
27
kernel/tags/kolibri0.5.3.0/vmodeld.inc
Normal file
27
kernel/tags/kolibri0.5.3.0/vmodeld.inc
Normal file
@ -0,0 +1,27 @@
|
||||
;
|
||||
; Load of videomode driver in memory
|
||||
;
|
||||
; (driver is located at 0x760000-0x768000 - 32kb) // if this area not occuped anything
|
||||
;
|
||||
; Author: Trans
|
||||
; Date: 19.07.2003
|
||||
;
|
||||
; Include in MeOS kernel and compile with FASM
|
||||
;
|
||||
|
||||
|
||||
;vmode db 'VMODE MDR' ; MDR - Menuet Driver
|
||||
; must be located after fonts filenames in kernel.asm
|
||||
|
||||
; LOAD VIDEOMODE DRIVER
|
||||
; If vmode.mdr file not found
|
||||
or eax,-1 ; Driver ID = -1 (not present in system)
|
||||
mov [0x760000],eax ;
|
||||
mov [0x760100],byte 0xC3 ; Instruction RETN - driver loop
|
||||
|
||||
mov eax,vmode ; File name of driver
|
||||
mov esi,12
|
||||
mov ebx,0
|
||||
mov ecx,26000
|
||||
mov edx,0x760000 ; Memory position of driver
|
||||
call fileread
|
Loading…
Reference in New Issue
Block a user