Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 3701 → Rev 3702

/kernel/trunk/blkdev/hd_drv.inc
50,11 → 50,11
cmp [hdpos], 0x80
jae .bios
; hd_read_{dma,pio} use old ATA with 28 bit for sector number
cmp eax, 0x10000000
jb @f
inc [hd_error]
jmp return_01
@@:
; cmp eax, 0x10000000
; jb @f
; inc [hd_error]
; jmp return_01
;@@:
; DMA read is permitted if [allow_dma_access]=1 or 2
cmp [allow_dma_access], 2
ja .nodma
101,10 → 101,22
hd_read_pio:
push eax edx
 
; Выбрать нужный диск
mov edx, [hdbase]
add edx, 6 ;адрес регистра головок
mov al, byte [hdid]
add al, 128+64+32
out dx, al; номер головки/номер диска
call wait_for_hd_idle
cmp [hd_error], 0
jne hd_read_error
 
; ATA with 28 or 48 bit for sector number?
mov eax, [esp+4]
cmp eax, 0x10000000
jae .lba48
.lba28:
cli
xor eax, eax
mov edx, [hdbase]
132,7 → 144,45
mov al, 20h
out dx, al; ATACommand регистр команд
sti
 
jmp .continue
.lba48:
cli
xor eax, eax
mov edx, [hdbase]
inc edx
out dx, al ; Features Previous Reserved
out dx, al ; Features Current Reserved
inc edx
out dx, al ; Sector Count Previous Sector count (15:8)
inc eax
out dx, al ; Sector Count Current Sector count (7:0)
inc edx
mov eax, [esp+4]
rol eax,8
out dx, al ; LBA Low Previous LBA (31:24)
xor eax,eax ; because only 32 bit cache
inc edx
out dx, al ; LBA Mid Previous LBA (39:32)
inc edx
out dx, al ; LBA High Previous LBA (47:40)
sub edx,2
mov eax, [esp+4]
out dx, al ; LBA Low Current LBA (7:0)
shr eax, 8
inc edx
out dx, al ; LBA Mid Current LBA (15:8)
shr eax, 8
inc edx
out dx, al ; LBA High Current LBA (23:16)
inc edx
mov al, byte [hdid]
add al, 128+64+32
out dx, al; номер головки/номер диска
inc edx
mov al, 24h ; READ SECTOR(S) EXT
out dx, al; ATACommand регистр команд
sti
.continue:
call wait_for_sector_buffer
 
cmp [hd_error], 0
245,6 → 295,13
jae .bad
; call disable_ide_int
 
; Выбрать нужный диск
mov edx, [hdbase]
add edx, 6 ;адрес регистра головок
mov al, byte [hdid]
add al, 128+64+32
out dx, al; номер головки/номер диска
 
call wait_for_hd_idle
cmp [hd_error], 0
jne hd_write_error
596,6 → 653,12
 
align 4
hd_read_dma:
; hd_read_dma use old ATA with 28 bit for sector number
cmp eax, 0x10000000
jb @f
inc [hd_error]
ret
@@:
push eax
push edx
mov edx, [dma_hdpos]
819,6 → 882,11
 
uglobal
IDEContrRegsBaseAddr dw ?
IDEContrProgrammingInterface dw ?
IDE_BAR0_val dw ?
IDE_BAR1_val dw ?
IDE_BAR2_val dw ?
IDE_BAR3_val dw ?
endg
; \end{Mario79}
 
/kernel/trunk/boot/bootcode.inc
387,7 → 387,12
 
push 0
pop es
and word [es:BOOT_IDE_BASE_ADDR], 0
xor ax,ax
and word [es:BOOT_IDE_BASE_ADDR], ax ;0
and word [es:BOOT_IDE_BAR0_16], ax ;0
and word [es:BOOT_IDE_BAR1_16], ax ;0
and word [es:BOOT_IDE_BAR2_16], ax ;0
and word [es:BOOT_IDE_BAR3_16], ax ;0
; \begin{Mario79}
; find HDD IDE DMA PCI device
; check for PCI BIOS
402,12 → 407,14
; a) class 1, subclass 1, programming interface 0x80
mov ax, 0xB103
mov ecx, 1*10000h + 1*100h + 0x80
mov [es:BOOT_IDE_PI_16], cx
xor si, si ; device index = 0
int 0x1A
jnc .found
; b) class 1, subclass 1, programming interface 0x8A
jnc .found_1
; b) class 1, subclass 1, programming interface 0x8f
mov ax, 0xB103
mov ecx, 1*10000h + 1*100h + 0x8A
mov ecx, 1*10000h + 1*100h + 0x8f
mov [es:BOOT_IDE_PI_16], cx
xor si, si ; device index = 0
int 0x1A
jnc .found
414,17 → 421,67
; c) class 1, subclass 1, programming interface 0x85
mov ax, 0xB103
mov ecx, 1*10000h + 1*100h + 0x85
xor si, si
mov [es:BOOT_IDE_PI_16], cx
xor si, si ; device index = 0
int 0x1A
jc .nopci
.found:
; get memory base
jnc .found
; d) class 1, subclass 1, programming interface 0x8A
mov ax, 0xB103
mov ecx, 1*10000h + 1*100h + 0x8A
mov [es:BOOT_IDE_PI_16], cx
xor si, si ; device index = 0
int 0x1A
jnc .found
 
jmp .nopci
.found_1:
; get memory base BAR4
mov ax, 0xB10A
mov di, 0x20 ; memory base is config register at 0x20
push cx
int 0x1A
jc .nopci
jc .no_BAR4 ;.nopci
and cx, 0xFFF0 ; clear address decode type
mov [es:BOOT_IDE_BASE_ADDR], cx
.no_BAR4:
pop cx
.found:
; get memory base BAR0
mov ax, 0xB10A
mov di, 0x10 ; memory base is config register at 0x20
push cx
int 0x1A
jc .no_BAR0 ;.nopci
mov [es:BOOT_IDE_BAR0_16], cx
.no_BAR0:
pop cx
; get memory base BAR1
mov ax, 0xB10A
mov di, 0x14 ; memory base is config register at 0x20
push cx
int 0x1A
jc .no_BAR1 ;.nopci
mov [es:BOOT_IDE_BAR1_16], cx
.no_BAR1:
pop cx
; get memory base BAR2
mov ax, 0xB10A
mov di, 0x18 ; memory base is config register at 0x20
push cx
int 0x1A
jc .no_BAR2 ;.nopci
mov [es:BOOT_IDE_BAR2_16], cx
.no_BAR2:
pop cx
; get memory base BAR3
mov ax, 0xB10A
mov di, 0x1C ; memory base is config register at 0x20
push cx
int 0x1A
jc .no_BAR3 ;.nopci
mov [es:BOOT_IDE_BAR3_16], cx
.no_BAR3:
pop cx
.nopci:
; \end{Mario79}
 
550,8 → 607,8
; following 4 lines set variables to 1 if its current value is 0
cmp byte [di+preboot_dma-preboot_device], 1
adc byte [di+preboot_dma-preboot_device], 0
cmp byte [di+preboot_biosdisk-preboot_device], 1
adc byte [di+preboot_biosdisk-preboot_device], 0
; cmp byte [di+preboot_biosdisk-preboot_device], 1
; adc byte [di+preboot_biosdisk-preboot_device], 0
;; default value for VRR is OFF
; cmp byte [di+preboot_vrrm-preboot_device], 0
; jnz @f
/kernel/trunk/const.inc
322,6 → 322,11
BOOT_APM_CODE_32 equ 0x9050
BOOT_APM_CODE_16 equ 0x9052
BOOT_APM_DATA_16 equ 0x9054
BOOT_IDE_BAR0_16 equ 0x9056
BOOT_IDE_BAR1_16 equ 0x9058
BOOT_IDE_BAR2_16 equ 0x905A
BOOT_IDE_BAR3_16 equ 0x905C
BOOT_IDE_PI_16 equ 0x905E
 
TMP_FILE_NAME equ 0
TMP_CMD_LINE equ 1024
/kernel/trunk/detect/dev_hdcd.inc
44,6 → 44,10
jmp EndFindHDD
 
FindHDD_1:
movzx eax,word [ChannelNumber]
DEBUGF 1, "K : Channel %d ",eax
movzx eax,byte [DiskNumber]
DEBUGF 1, "Disk %d\n",eax
call ReadHDD_ID
cmp [DevErrorCode], 0
jne FindHDD_2
52,7 → 56,7
cmp [Sector512+12], word 255
ja FindHDD_2
inc byte [DRIVE_DATA+1]
jmp FindHDD_2_2
jmp Print_Device_Name
FindHDD_2:
call DeviceReset
cmp [DevErrorCode], 0
62,6 → 66,21
jne FindHDD_2_2
inc byte [DRIVE_DATA+1]
inc byte [DRIVE_DATA+1]
Print_Device_Name:
pushad
pushfd
mov esi,Sector512+27*2
mov edi,dev_name
mov ecx,20
cld
@@:
lodsw
xchg ah,al
stosw
loop @b
popfd
popad
DEBUGF 1, "K : Dev: %s \n", dev_name
FindHDD_2_2:
ret
 
70,10 → 89,11
shl byte [DRIVE_DATA+1], 2
ret
 
 
; Адрес считываемого сектора в режиме LBA
uglobal
SectorAddress DD ?
dev_name:
rb 41
endg
;*************************************************
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА *
/kernel/trunk/detect/sear_par.inc
17,7 → 17,8
search_partitions_ide0:
test [DRIVE_DATA+1], byte 0x40
jz search_partitions_ide1
mov [hdbase], 0x1f0
mov eax,[hd_address_table]
mov [hdbase], eax ;0x1f0
mov [hdid], 0x0
mov [hdpos], 1
mov [known_part], 1
39,7 → 40,8
search_partitions_ide1:
test [DRIVE_DATA+1], byte 0x10
jz search_partitions_ide2
mov [hdbase], 0x1f0
mov eax,[hd_address_table]
mov [hdbase], eax ;0x1f0
mov [hdid], 0x10
mov [hdpos], 2
mov [known_part], 1
61,7 → 63,8
search_partitions_ide2:
test [DRIVE_DATA+1], byte 0x4
jz search_partitions_ide3
mov [hdbase], 0x170
mov eax,[hd_address_table+16]
mov [hdbase], eax ;0x170
mov [hdid], 0x0
mov [hdpos], 3
mov [known_part], 1
83,7 → 86,8
search_partitions_ide3:
test [DRIVE_DATA+1], byte 0x1
jz end_search_partitions_ide
mov [hdbase], 0x170
mov eax,[hd_address_table+16]
mov [hdbase], eax ;0x170
mov [hdid], 0x10
mov [hdpos], 4
mov [known_part], 1
/kernel/trunk/fs/fs_lfn.inc
525,25 → 525,29
 
fs_OnHd0:
call reserve_hd1
mov [hdbase], 0x1F0
mov eax,[hd_address_table]
mov [hdbase], eax ;0x1F0
mov [hdid], 0
push 1
jmp fs_OnHd
fs_OnHd1:
call reserve_hd1
mov [hdbase], 0x1F0
mov eax,[hd_address_table]
mov [hdbase], eax ;0x1F0
mov [hdid], 0x10
push 2
jmp fs_OnHd
fs_OnHd2:
call reserve_hd1
mov [hdbase], 0x170
mov eax,[hd_address_table+16]
mov [hdbase], eax ;0x170
mov [hdid], 0
push 3
jmp fs_OnHd
fs_OnHd3:
call reserve_hd1
mov [hdbase], 0x170
mov eax,[hd_address_table+16]
mov [hdbase], eax ;0x170
mov [hdid], 0x10
push 4
fs_OnHd:
/kernel/trunk/kernel.asm
358,8 → 358,40
call mutex_init
 
; SAVE REAL MODE VARIABLES
xor eax,eax
mov ax, [BOOT_VAR + BOOT_IDE_PI_16]
mov [IDEContrProgrammingInterface], ax
mov ax, [BOOT_VAR + BOOT_IDE_BASE_ADDR]
mov [IDEContrRegsBaseAddr], ax
mov ax, [BOOT_VAR + BOOT_IDE_BAR0_16]
mov [IDE_BAR0_val], ax
cmp ax,0
je @f
cmp ax,1
je @f
and ax,0xfff0
mov [StandardATABases],ax
mov [hd_address_table],eax
mov [hd_address_table+8],eax
@@:
mov ax, [BOOT_VAR + BOOT_IDE_BAR1_16]
mov [IDE_BAR1_val], ax
mov ax, [BOOT_VAR + BOOT_IDE_BAR2_16]
mov [IDE_BAR2_val], ax
 
cmp ax,0
je @f
cmp ax,1
je @f
and ax,0xfff0
mov [StandardATABases+2],ax
mov [hd_address_table+16],eax
mov [hd_address_table+24],eax
@@:
mov ax, [BOOT_VAR + BOOT_IDE_BAR3_16]
mov [IDE_BAR3_val], ax
; --------------- APM ---------------------
 
; init selectors
1014,6 → 1046,18
@@:
DEBUGF 1, "K : %d CPU detected\n", eax
 
movzx eax,[IDE_BAR0_val]
DEBUGF 1, "K : BAR0 %x \n", eax
movzx eax,[IDE_BAR1_val]
DEBUGF 1, "K : BAR1 %x \n", eax
movzx eax,[IDE_BAR2_val]
DEBUGF 1, "K : BAR2 %x \n", eax
movzx eax,[IDE_BAR3_val]
DEBUGF 1, "K : BAR3 %x \n", eax
movzx eax,[IDEContrRegsBaseAddr]
DEBUGF 1, "K : BAR4 %x \n", eax
movzx eax,[IDEContrProgrammingInterface]
DEBUGF 1, "K : IDEContrProgrammingInterface %x \n", eax
; START MULTITASKING
 
; A 'All set - press ESC to start' messages if need
1028,6 → 1072,17
 
cmp [IDEContrRegsBaseAddr], 0
setnz [dma_hdd]
cmp [dma_hdd],0
je .print_pio
.print_dma:
DEBUGF 1, "K : IDE DMA mode\n"
jmp .continue
.print_pio:
DEBUGF 1, "K : IDE PIO mode\n"
.continue:
mov [timer_ticks_enable], 1 ; for cd driver
 
sti
1585,23 → 1640,27
 
dec ecx
jnz noprma
mov [cdbase], 0x1f0
mov eax,[hd_address_table]
mov [cdbase], eax ;0x1f0
mov [cdid], 0xa0
noprma:
 
dec ecx
jnz noprsl
mov [cdbase], 0x1f0
mov eax,[hd_address_table]
mov [cdbase], eax ;0x1f0
mov [cdid], 0xb0
noprsl:
dec ecx
jnz nosema
mov [cdbase], 0x170
mov eax,[hd_address_table+16]
mov [cdbase], eax ;0x170
mov [cdid], 0xa0
nosema:
dec ecx
jnz nosesl
mov [cdbase], 0x170
mov eax,[hd_address_table+16]
mov [cdbase], eax ;0x170
mov [cdid], 0xb0
nosesl:
ret
1630,7 → 1689,8
 
cmp ecx, 1
jnz noprmahd
mov [hdbase], 0x1f0
mov eax,[hd_address_table]
mov [hdbase], eax ;0x1f0
and dword [hdid], 0x0
mov dword [hdpos], ecx
; call set_FAT32_variables
1638,7 → 1698,8
 
cmp ecx, 2
jnz noprslhd
mov [hdbase], 0x1f0
mov eax,[hd_address_table]
mov [hdbase], eax ;0x1f0
mov [hdid], 0x10
mov dword [hdpos], ecx
; call set_FAT32_variables
1646,7 → 1707,8
 
cmp ecx, 3
jnz nosemahd
mov [hdbase], 0x170
mov eax,[hd_address_table+16]
mov [hdbase], eax ;0x170
and dword [hdid], 0x0
mov dword [hdpos], ecx
; call set_FAT32_variables
1654,7 → 1716,8
 
cmp ecx, 4
jnz noseslhd
mov [hdbase], 0x170
mov eax,[hd_address_table+16]
mov [hdbase], eax ;0x170
mov [hdid], 0x10
mov dword [hdpos], ecx
; call set_FAT32_variables