forked from KolibriOS/kolibrios
LAPIC timer interrupt test
git-svn-id: svn://kolibrios.org@3531 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
4d079770dc
commit
55496cc735
@ -157,20 +157,20 @@ fusion_pcie_init:
|
|||||||
.pcie_cfg_mapped:
|
.pcie_cfg_mapped:
|
||||||
|
|
||||||
create_mmio_pte:
|
create_mmio_pte:
|
||||||
mov ecx, mmio_pte ; physical address
|
mov ecx, mmio_pte ; physical address
|
||||||
or ecx, (PG_NOCACHE + PG_SHARED)
|
or ecx, (PG_NOCACHE + PG_SHARED + PG_SW)
|
||||||
mov ebx, FUSION_MMIO ; linear address
|
mov ebx, FUSION_MMIO ; linear address
|
||||||
shr ebx, 20
|
shr ebx, 20
|
||||||
add ebx, (sys_pgdir - OS_BASE) ; PgDir entry @
|
add ebx, (sys_pgdir - OS_BASE) ; PgDir entry @
|
||||||
mov dword[ebx], ecx ; Fusion MMIO tables
|
mov dword[ebx], ecx ; Fusion MMIO tables
|
||||||
|
|
||||||
; ---- short page mapping ----
|
; ---- short page mapping ----
|
||||||
.map_apic_mmio:
|
.map_apic_mmio:
|
||||||
mov ecx, 0x01B ; APIC BAR
|
mov ecx, 0x01B ; APIC BAR
|
||||||
rdmsr
|
rdmsr
|
||||||
and eax, 0xFFFFF000 ; physical address
|
and eax, 0xFFFFF000 ; physical address
|
||||||
or eax, (PG_NOCACHE + PG_SHARED)
|
or eax, (PG_NOCACHE + PG_SHARED + PG_SW)
|
||||||
mov dword[mmio_pte + 0], eax
|
mov dword[mmio_pte + 0], eax
|
||||||
|
|
||||||
ret ; <<< OK >>>
|
ret ; <<< OK >>>
|
||||||
|
|
||||||
@ -298,4 +298,26 @@ sys_rdmsr:
|
|||||||
pop edx ecx
|
pop edx ecx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
apic_timer_reset:
|
||||||
|
xor eax, eax
|
||||||
|
mov [apic_data+0], eax
|
||||||
|
mov ebx, LAPIC_BAR+ 0x320
|
||||||
|
mov eax, [ebx]
|
||||||
|
and eax, 0xFFFEFF00
|
||||||
|
or eax, 0x0000003F ; int vector + norestart
|
||||||
|
mov [ebx], eax
|
||||||
|
mov dword[apic_data + 8], 100000000
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
apic_timer_int:
|
||||||
|
push eax
|
||||||
|
inc dword [apic_data + 0]
|
||||||
|
mov eax, [apic_data + 8]
|
||||||
|
mov dword [LAPIC_BAR + 0x380], eax ; load APICTIC
|
||||||
|
mov dword [LAPIC_BAR + 0x0B0], 0 ; end of interrupt
|
||||||
|
; mov dword [LAPIC_BAR + 0x420], 0x3F ; end of interrupt
|
||||||
|
pop eax
|
||||||
|
iretd
|
||||||
|
|
||||||
|
|
||||||
|
@ -273,7 +273,8 @@ FONT_I equ (OS_BASE+0x005E600)
|
|||||||
|
|
||||||
TMP_STACK_TOP equ 0x006C000
|
TMP_STACK_TOP equ 0x006C000
|
||||||
|
|
||||||
mmio_pte equ 0x006E000
|
apic_data equ (OS_BASE+0x006D000)
|
||||||
|
mmio_pte equ 0x006E000
|
||||||
sys_pgdir equ (OS_BASE+0x006F000)
|
sys_pgdir equ (OS_BASE+0x006F000)
|
||||||
|
|
||||||
DRIVE_DATA equ (OS_BASE+0x0070000)
|
DRIVE_DATA equ (OS_BASE+0x0070000)
|
||||||
@ -281,7 +282,7 @@ DRIVE_DATA equ (OS_BASE+0x0070000)
|
|||||||
SLOT_BASE equ (OS_BASE+0x0080000)
|
SLOT_BASE equ (OS_BASE+0x0080000)
|
||||||
|
|
||||||
|
|
||||||
;VGABasePtr equ (OS_BASE+0x00A0000)
|
;VGABasePtr equ (OS_BASE+0x00A0000)
|
||||||
|
|
||||||
RAMDISK equ (OS_BASE+0x0100000)
|
RAMDISK equ (OS_BASE+0x0100000)
|
||||||
RAMDISK_FAT equ (OS_BASE+0x0280000)
|
RAMDISK_FAT equ (OS_BASE+0x0280000)
|
||||||
@ -321,8 +322,8 @@ HEAP_MIN_SIZE equ 0x02000000
|
|||||||
PCIe_CONFIG_SPACE equ 0xF0000000
|
PCIe_CONFIG_SPACE equ 0xF0000000
|
||||||
USER_DMA_BUFFER equ 0xFD000000 ; linear addr.
|
USER_DMA_BUFFER equ 0xFD000000 ; linear addr.
|
||||||
USER_DMA_SIZE equ 0x00800000
|
USER_DMA_SIZE equ 0x00800000
|
||||||
FUSION_MMIO equ 0xFD800000
|
FUSION_MMIO equ 0xFD800000
|
||||||
LAPIC_BAR equ 0xFD800000 ; ==
|
LAPIC_BAR equ 0xFD800000 ; ==
|
||||||
|
|
||||||
page_tabs equ 0xFDC00000
|
page_tabs equ 0xFDC00000
|
||||||
app_page_tabs equ 0xFDC00000
|
app_page_tabs equ 0xFDC00000
|
||||||
@ -370,18 +371,18 @@ PG_SHARED equ 0x200
|
|||||||
;;;;;;;;;;;boot time variables
|
;;;;;;;;;;;boot time variables
|
||||||
|
|
||||||
;BOOT_BPP equ 0x9000 ;byte bits per pixel
|
;BOOT_BPP equ 0x9000 ;byte bits per pixel
|
||||||
;BOOT_SCANLINE equ 0x9001 ;word scanline length
|
;BOOT_SCANLINE equ 0x9001 ;word scanline length
|
||||||
;BOOT_VESA_MODE equ 0x9008 ;word vesa video mode
|
;BOOT_VESA_MODE equ 0x9008 ;word vesa video mode
|
||||||
;;BOOT_X_RES equ 0x900A ;word X res
|
;;BOOT_X_RES equ 0x900A ;word X res
|
||||||
;;BOOT_Y_RES equ 0x900C ;word Y res
|
;;BOOT_Y_RES equ 0x900C ;word Y res
|
||||||
;;BOOT_MOUSE_PORT equ 0x9010 ;byte mouse port - not used
|
;;BOOT_MOUSE_PORT equ 0x9010 ;byte mouse port - not used
|
||||||
;BOOT_BANK_SW equ 0x9014 ;dword Vesa 1.2 pm bank switch
|
;BOOT_BANK_SW equ 0x9014 ;dword Vesa 1.2 pm bank switch
|
||||||
BOOT_LFB equ 0x9018 ;dword Vesa 2.0 LFB address
|
BOOT_LFB equ 0x9018 ;dword Vesa 2.0 LFB address
|
||||||
BOOT_MTRR equ 0x901C ;byte 0 or 1 : enable MTRR graphics acceleration
|
BOOT_MTRR equ 0x901C ;byte 0 or 1 : enable MTRR graphics acceleration
|
||||||
BOOT_LOG equ 0x901D ;byte not used anymore (0 or 1 : enable system log display)
|
BOOT_LOG equ 0x901D ;byte not used anymore (0 or 1 : enable system log display)
|
||||||
BOOT_DIRECT_LFB equ 0x901E ;byte 0 or 1 : enable direct lfb write, paging disabled
|
BOOT_DIRECT_LFB equ 0x901E ;byte 0 or 1 : enable direct lfb write, paging disabled
|
||||||
BOOT_PCI_DATA equ 0x9020 ;8bytes pci data
|
BOOT_PCI_DATA equ 0x9020 ;8bytes pci data
|
||||||
;BOOT_VRR equ 0x9030 ;byte VRR start enabled 1, 2-no
|
;BOOT_VRR equ 0x9030 ;byte VRR start enabled 1, 2-no
|
||||||
BOOT_IDE_BASE_ADDR equ 0x9031 ;word IDEContrRegsBaseAddr
|
BOOT_IDE_BASE_ADDR equ 0x9031 ;word IDEContrRegsBaseAddr
|
||||||
BOOT_MEM_AMOUNT equ 0x9034 ;dword memory amount
|
BOOT_MEM_AMOUNT equ 0x9034 ;dword memory amount
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -18,50 +18,62 @@ $Revision$
|
|||||||
;* ПОИСК HDD и CD *
|
;* ПОИСК HDD и CD *
|
||||||
;****************************************************
|
;****************************************************
|
||||||
FindHDD:
|
FindHDD:
|
||||||
mov [ChannelNumber],1
|
mov [ChannelNumber],1
|
||||||
mov [DiskNumber],0
|
mov [DiskNumber],0
|
||||||
call FindHDD_3
|
call FindHDD_3
|
||||||
mov [DiskNumber],1
|
; mov ax,[Sector512+176]
|
||||||
call FindHDD_3
|
; mov [DRIVE_DATA+6],ax
|
||||||
inc [ChannelNumber]
|
; mov ax,[Sector512+126]
|
||||||
mov [DiskNumber],0
|
; mov [DRIVE_DATA+8],ax
|
||||||
call FindHDD_3
|
; mov ax,[Sector512+128]
|
||||||
mov [DiskNumber],1
|
; mov [DRIVE_DATA+8],ax
|
||||||
call FindHDD_1
|
mov [DiskNumber],1
|
||||||
|
call FindHDD_3
|
||||||
|
; mov al,[Sector512+176]
|
||||||
|
; mov [DRIVE_DATA+7],al
|
||||||
|
inc [ChannelNumber]
|
||||||
|
mov [DiskNumber],0
|
||||||
|
call FindHDD_3
|
||||||
|
; mov al,[Sector512+176]
|
||||||
|
; mov [DRIVE_DATA+8],al
|
||||||
|
mov [DiskNumber],1
|
||||||
|
call FindHDD_1
|
||||||
|
; mov al,[Sector512+176]
|
||||||
|
; mov [DRIVE_DATA+9],al
|
||||||
|
|
||||||
jmp EndFindHDD
|
jmp EndFindHDD
|
||||||
|
|
||||||
FindHDD_1:
|
FindHDD_1:
|
||||||
call ReadHDD_ID
|
call ReadHDD_ID
|
||||||
cmp [DevErrorCode],0
|
cmp [DevErrorCode],0
|
||||||
jne FindHDD_2
|
jne FindHDD_2
|
||||||
cmp [Sector512+6],word 16
|
cmp [Sector512+6],word 16
|
||||||
ja FindHDD_2
|
ja FindHDD_2
|
||||||
cmp [Sector512+12],word 255
|
cmp [Sector512+12],word 255
|
||||||
ja FindHDD_2
|
ja FindHDD_2
|
||||||
inc byte [DRIVE_DATA+1]
|
inc byte [DRIVE_DATA+1]
|
||||||
jmp FindHDD_2_2
|
jmp FindHDD_2_2
|
||||||
FindHDD_2:
|
FindHDD_2:
|
||||||
call DeviceReset
|
call DeviceReset
|
||||||
cmp [DevErrorCode],0
|
cmp [DevErrorCode],0
|
||||||
jne FindHDD_2_2
|
;; jne FindHDD_2_2
|
||||||
; call ReadCD_ID
|
; call ReadCD_ID
|
||||||
; cmp [DevErrorCode],0
|
; cmp [DevErrorCode],0
|
||||||
; jne FindHDD_2_2
|
jne FindHDD_2_2
|
||||||
inc byte [DRIVE_DATA+1]
|
inc byte [DRIVE_DATA+1]
|
||||||
inc byte [DRIVE_DATA+1]
|
inc byte [DRIVE_DATA+1]
|
||||||
FindHDD_2_2:
|
FindHDD_2_2:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
FindHDD_3:
|
FindHDD_3:
|
||||||
call FindHDD_1
|
call FindHDD_1
|
||||||
shl byte [DRIVE_DATA+1],2
|
shl byte [DRIVE_DATA+1],2
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
; Адрес считываемого сектора в режиме LBA
|
; Адрес считываемого сектора в режиме LBA
|
||||||
uglobal
|
uglobal
|
||||||
SectorAddress DD ?
|
SectorAddress DD ?
|
||||||
endg
|
endg
|
||||||
;*************************************************
|
;*************************************************
|
||||||
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА *
|
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА *
|
||||||
@ -74,43 +86,45 @@ endg
|
|||||||
;*************************************************
|
;*************************************************
|
||||||
ReadHDD_ID:
|
ReadHDD_ID:
|
||||||
; Задать режим CHS
|
; Задать режим CHS
|
||||||
mov [ATAAddressMode],0
|
mov [ATAAddressMode],0
|
||||||
; Послать команду идентификации устройства
|
; Послать команду идентификации устройства
|
||||||
mov [ATAFeatures],0
|
mov [ATAFeatures],0
|
||||||
mov [ATAHead],0
|
mov [ATAHead],0
|
||||||
mov [ATACommand],0ECh
|
mov [ATACommand],0ECh
|
||||||
call SendCommandToHDD
|
call SendCommandToHDD
|
||||||
cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
|
cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
|
||||||
jne @@End ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
|
jne @@End ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
|
||||||
mov DX,[ATABasePortAddr]
|
mov DX,[ATABasePortAddr]
|
||||||
add DX,7 ;àäðåñ ðåãèñòðà ñîñòîÿíè
|
add DX,7 ;àäðåñ ðåãèñòðà ñîñòîÿíè
|
||||||
mov ecx,0xffff
|
mov ecx,0xffff
|
||||||
@@WaitCompleet:
|
@@WaitCompleet:
|
||||||
; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû
|
; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû
|
||||||
dec ecx
|
dec ecx
|
||||||
; cmp ecx,0
|
; cmp ecx,0
|
||||||
jz @@Error1 ;îøèáêà òàéì-àóòà
|
jz @@Error1 ;îøèáêà òàéì-àóòà
|
||||||
; Ïðîâåðèòü ãîòîâíîñòü
|
; Ïðîâåðèòü ãîòîâíîñòü
|
||||||
in AL,DX
|
in AL,DX
|
||||||
test AL,80h ;ñîñòîÿíèå ñèãíàëà BSY
|
test AL,80h ;ñîñòîÿíèå ñèãíàëà BSY
|
||||||
jnz @@WaitCompleet
|
jnz @@WaitCompleet
|
||||||
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR
|
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR
|
||||||
jnz @@Error6
|
jnz @@Error6
|
||||||
test AL,08h ;ñîñòîÿíèå ñèãíàëà DRQ
|
test AL,08h ;ñîñòîÿíèå ñèãíàëà DRQ
|
||||||
jz @@WaitCompleet
|
jz @@WaitCompleet
|
||||||
; Принять блок данных от контроллера
|
; Принять блок данных от контроллера
|
||||||
mov EDI,Sector512 ;offset Sector512
|
; mov AX,DS
|
||||||
mov DX,[ATABasePortAddr] ;ðåãèñòð äàííûõ
|
; mov ES,AX
|
||||||
mov CX,256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
|
mov EDI,Sector512 ;offset Sector512
|
||||||
rep insw ;ïðèíÿòü áëîê äàííûõ
|
mov DX,[ATABasePortAddr] ;ðåãèñòð äàííûõ
|
||||||
|
mov CX,256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
|
||||||
|
rep insw ;ïðèíÿòü áëîê äàííûõ
|
||||||
ret
|
ret
|
||||||
; Записать код ошибки
|
; Записать код ошибки
|
||||||
@@Error1:
|
@@Error1:
|
||||||
mov [DevErrorCode],1
|
mov [DevErrorCode],1
|
||||||
ret
|
ret
|
||||||
@@Error6:
|
@@Error6:
|
||||||
mov [DevErrorCode],6
|
mov [DevErrorCode],6
|
||||||
@@End: ret
|
@@End: ret
|
||||||
|
|
||||||
|
|
||||||
iglobal
|
iglobal
|
||||||
@ -119,19 +133,19 @@ StandardATABases DW 1F0h, 170h
|
|||||||
endg
|
endg
|
||||||
uglobal
|
uglobal
|
||||||
; Номер канала
|
; Номер канала
|
||||||
ChannelNumber DW ?
|
ChannelNumber DW ?
|
||||||
; Номер диска
|
; Номер диска
|
||||||
DiskNumber DB ?
|
DiskNumber DB ?
|
||||||
; Базовый адрес группы портов контроллера ATA
|
; Базовый адрес группы портов контроллера ATA
|
||||||
ATABasePortAddr DW ?
|
ATABasePortAddr DW ?
|
||||||
; Параметры ATA-команды
|
; Параметры ATA-команды
|
||||||
ATAFeatures DB ? ;îñîáåííîñòè
|
ATAFeatures DB ? ;îñîáåííîñòè
|
||||||
ATASectorCount DB ? ;êîëè÷åñòâî îáðàáàòûâàåìûõ ñåêòîðîâ
|
ATASectorCount DB ? ;êîëè÷åñòâî îáðàáàòûâàåìûõ ñåêòîðîâ
|
||||||
ATASectorNumber DB ? ;номер начального сектора
|
ATASectorNumber DB ? ;номер начального сектора
|
||||||
ATACylinder DW ? ;íîìåð íà÷àëüíîãî öèëèíäðà
|
ATACylinder DW ? ;íîìåð íà÷àëüíîãî öèëèíäðà
|
||||||
ATAHead DB ? ;íîìåð íà÷àëüíîé ãîëîâêè
|
ATAHead DB ? ;íîìåð íà÷àëüíîé ãîëîâêè
|
||||||
ATAAddressMode DB ? ;ðåæèì àäðåñàöèè (0 - CHS, 1 - LBA)
|
ATAAddressMode DB ? ;ðåæèì àäðåñàöèè (0 - CHS, 1 - LBA)
|
||||||
ATACommand DB ? ;êîä êîìàíäû, ïîäëåæàùåé âûïîëíåíèþ
|
ATACommand DB ? ;êîä êîìàíäû, ïîäëåæàùåé âûïîëíåíèþ
|
||||||
; Код ошибки (0 - нет ошибок, 1 - превышен допустимый
|
; Код ошибки (0 - нет ошибок, 1 - превышен допустимый
|
||||||
; интервал ожидания, 2 - неверный код режима адресации,
|
; интервал ожидания, 2 - неверный код режима адресации,
|
||||||
; 3 - неверный номер канала, 4 - неверный номер диска,
|
; 3 - неверный номер канала, 4 - неверный номер диска,
|
||||||
@ -160,96 +174,102 @@ endg
|
|||||||
;****************************************************
|
;****************************************************
|
||||||
SendCommandToHDD:
|
SendCommandToHDD:
|
||||||
; Проверить значение кода режима
|
; Проверить значение кода режима
|
||||||
cmp [ATAAddressMode],1
|
cmp [ATAAddressMode],1
|
||||||
ja @@Err2
|
ja @@Err2
|
||||||
; Проверить корректность номера канала
|
; Проверить корректность номера канала
|
||||||
mov BX,[ChannelNumber]
|
mov BX,[ChannelNumber]
|
||||||
cmp BX,1
|
cmp BX,1
|
||||||
jb @@Err3
|
jb @@Err3
|
||||||
cmp BX,2
|
cmp BX,2
|
||||||
ja @@Err3
|
ja @@Err3
|
||||||
; Установить базовый адрес
|
; Установить базовый адрес
|
||||||
dec BX
|
dec BX
|
||||||
shl BX,1
|
shl BX,1
|
||||||
movzx ebx,bx
|
movzx ebx,bx
|
||||||
mov AX,[ebx+StandardATABases]
|
mov AX,[ebx+StandardATABases]
|
||||||
mov [ATABasePortAddr],AX
|
mov [ATABasePortAddr],AX
|
||||||
; Ожидание готовности HDD к приему команды
|
; Ожидание готовности HDD к приему команды
|
||||||
; Âûáðàòü íóæíûé äèñê
|
; Âûáðàòü íóæíûé äèñê
|
||||||
mov DX,[ATABasePortAddr]
|
mov DX,[ATABasePortAddr]
|
||||||
add DX,6 ;àäðåñ ðåãèñòðà ãîëîâîê
|
add DX,6 ;àäðåñ ðåãèñòðà ãîëîâîê
|
||||||
mov AL,[DiskNumber]
|
mov AL,[DiskNumber]
|
||||||
cmp AL,1 ;ïðîâåðèòü íîìåðà äèñêà
|
cmp AL,1 ;ïðîâåðèòü íîìåðà äèñêà
|
||||||
ja @@Err4
|
ja @@Err4
|
||||||
shl AL,4
|
shl AL,4
|
||||||
or AL,10100000b
|
or AL,10100000b
|
||||||
out DX,AL
|
out DX,AL
|
||||||
; Îæèäàòü, ïîêà äèñê íå áóäåò ãîòîâ
|
; Îæèäàòü, ïîêà äèñê íå áóäåò ãîòîâ
|
||||||
inc DX
|
inc DX
|
||||||
mov ecx,0xfff
|
mov ecx,0xfff
|
||||||
|
; mov eax,[timer_ticks]
|
||||||
|
; mov [TickCounter_1],eax
|
||||||
@@WaitHDReady:
|
@@WaitHDReady:
|
||||||
; Ïðîâåðèòü âðåìÿ îæèäàíè
|
; Ïðîâåðèòü âðåìÿ îæèäàíè
|
||||||
dec ecx
|
dec ecx
|
||||||
jz @@Err1
|
; cmp ecx,0
|
||||||
; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè
|
jz @@Err1
|
||||||
in AL,DX
|
; mov eax,[timer_ticks]
|
||||||
; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
|
; sub eax,[TickCounter_1]
|
||||||
test AL,80h
|
; cmp eax,300 ;îæèäàòü 300 òèêîâ
|
||||||
jnz @@WaitHDReady
|
; ja @@Err1 ;îøèáêà òàéì-àóòà
|
||||||
; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà DRQ
|
; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè
|
||||||
test AL,08h
|
in AL,DX
|
||||||
jnz @@WaitHDReady
|
; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
|
||||||
|
test AL,80h
|
||||||
|
jnz @@WaitHDReady
|
||||||
|
; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà DRQ
|
||||||
|
test AL,08h
|
||||||
|
jnz @@WaitHDReady
|
||||||
; Загрузить команду в регистры контроллера
|
; Загрузить команду в регистры контроллера
|
||||||
cli
|
cli
|
||||||
mov DX,[ATABasePortAddr]
|
mov DX,[ATABasePortAddr]
|
||||||
inc DX ;ðåãèñòð "îñîáåííîñòåé"
|
inc DX ;ðåãèñòð "îñîáåííîñòåé"
|
||||||
mov AL,[ATAFeatures]
|
mov AL,[ATAFeatures]
|
||||||
out DX,AL
|
out DX,AL
|
||||||
inc DX ;ñ÷åò÷èê ñåêòîðîâ
|
inc DX ;ñ÷åò÷èê ñåêòîðîâ
|
||||||
mov AL,[ATASectorCount]
|
mov AL,[ATASectorCount]
|
||||||
out DX,AL
|
out DX,AL
|
||||||
inc DX ;ðåãèñòð íîìåðà ñåêòîðà
|
inc DX ;ðåãèñòð íîìåðà ñåêòîðà
|
||||||
mov AL,[ATASectorNumber]
|
mov AL,[ATASectorNumber]
|
||||||
out DX,AL
|
out DX,AL
|
||||||
inc DX ;íîìåð öèëèíäðà (ìëàäøèé áàéò)
|
inc DX ;íîìåð öèëèíäðà (ìëàäøèé áàéò)
|
||||||
mov AX,[ATACylinder]
|
mov AX,[ATACylinder]
|
||||||
out DX,AL
|
out DX,AL
|
||||||
inc DX ;íîìåð öèëèíäðà (ñòàðøèé áàéò)
|
inc DX ;íîìåð öèëèíäðà (ñòàðøèé áàéò)
|
||||||
mov AL,AH
|
mov AL,AH
|
||||||
out DX,AL
|
out DX,AL
|
||||||
inc DX ;íîìåð ãîëîâêè/íîìåð äèñêà
|
inc DX ;íîìåð ãîëîâêè/íîìåð äèñêà
|
||||||
mov AL,[DiskNumber]
|
mov AL,[DiskNumber]
|
||||||
shl AL,4
|
shl AL,4
|
||||||
cmp [ATAHead],0Fh ;ïðîâåðèòü íîìåð ãîëîâêè
|
cmp [ATAHead],0Fh ;ïðîâåðèòü íîìåð ãîëîâêè
|
||||||
ja @@Err5
|
ja @@Err5
|
||||||
or AL,[ATAHead]
|
or AL,[ATAHead]
|
||||||
or AL,10100000b
|
or AL,10100000b
|
||||||
mov AH,[ATAAddressMode]
|
mov AH,[ATAAddressMode]
|
||||||
shl AH,6
|
shl AH,6
|
||||||
or AL,AH
|
or AL,AH
|
||||||
out DX,AL
|
out DX,AL
|
||||||
; Послать команду
|
; Послать команду
|
||||||
mov AL,[ATACommand]
|
mov AL,[ATACommand]
|
||||||
inc DX ;ðåãèñòð êîìàíä
|
inc DX ;ðåãèñòð êîìàíä
|
||||||
out DX,AL
|
out DX,AL
|
||||||
sti
|
sti
|
||||||
; Сбросить признак ошибки
|
; Сбросить признак ошибки
|
||||||
mov [DevErrorCode],0
|
mov [DevErrorCode],0
|
||||||
ret
|
ret
|
||||||
; Записать код ошибки
|
; Записать код ошибки
|
||||||
@@Err1: mov [DevErrorCode],1
|
@@Err1: mov [DevErrorCode],1
|
||||||
ret
|
ret
|
||||||
@@Err2: mov [DevErrorCode],2
|
@@Err2: mov [DevErrorCode],2
|
||||||
ret
|
ret
|
||||||
@@Err3: mov [DevErrorCode],3
|
@@Err3: mov [DevErrorCode],3
|
||||||
ret
|
ret
|
||||||
@@Err4: mov [DevErrorCode],4
|
@@Err4: mov [DevErrorCode],4
|
||||||
ret
|
ret
|
||||||
@@Err5: mov [DevErrorCode],5
|
@@Err5: mov [DevErrorCode],5
|
||||||
; Завершение работы программы
|
; Завершение работы программы
|
||||||
ret
|
ret
|
||||||
|
|
||||||
if 0
|
|
||||||
;*************************************************
|
;*************************************************
|
||||||
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI *
|
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI *
|
||||||
;* Входные параметры передаются через глобальные *
|
;* Входные параметры передаются через глобальные *
|
||||||
@ -261,49 +281,50 @@ if 0
|
|||||||
;*************************************************
|
;*************************************************
|
||||||
ReadCD_ID:
|
ReadCD_ID:
|
||||||
; Задать режим CHS
|
; Задать режим CHS
|
||||||
mov [ATAAddressMode],0
|
mov [ATAAddressMode],0
|
||||||
; Послать команду идентификации устройства
|
; Послать команду идентификации устройства
|
||||||
mov [ATAFeatures],0
|
mov [ATAFeatures],0
|
||||||
mov [ATASectorCount],0
|
mov [ATASectorCount],0
|
||||||
mov [ATASectorNumber],0
|
mov [ATASectorNumber],0
|
||||||
mov [ATACylinder],0
|
mov [ATACylinder],0
|
||||||
mov [ATAHead],0
|
mov [ATAHead],0
|
||||||
mov [ATACommand],0A1h
|
mov [ATACommand],0A1h
|
||||||
call SendCommandToHDD
|
call SendCommandToHDD
|
||||||
cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
|
cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
|
||||||
jne @@End_1 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
|
jne @@End_1 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
|
||||||
; Ожидать готовность данных HDD
|
; Ожидать готовность данных HDD
|
||||||
mov DX,[ATABasePortAddr]
|
mov DX,[ATABasePortAddr]
|
||||||
add DX,7 ;ïîðò 1õ7h
|
add DX,7 ;ïîðò 1õ7h
|
||||||
mov ecx,0xffff
|
mov ecx,0xffff
|
||||||
@@WaitCompleet_1:
|
@@WaitCompleet_1:
|
||||||
; Ïðîâåðèòü âðåì
|
; Ïðîâåðèòü âðåì
|
||||||
dec ecx
|
dec ecx
|
||||||
jz @@Error1_1 ;îøèáêà òàéì-àóòà
|
; cmp ecx,0
|
||||||
; Ïðîâåðèòü ãîòîâíîñòü
|
jz @@Error1_1 ;îøèáêà òàéì-àóòà
|
||||||
in AL,DX
|
; Ïðîâåðèòü ãîòîâíîñòü
|
||||||
test AL,80h ;ñîñòîÿíèå ñèãíàëà BSY
|
in AL,DX
|
||||||
jnz @@WaitCompleet_1
|
test AL,80h ;ñîñòîÿíèå ñèãíàëà BSY
|
||||||
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR
|
jnz @@WaitCompleet_1
|
||||||
jnz @@Error6_1
|
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR
|
||||||
test AL,08h ;ñîñòîÿíèå ñèãíàëà DRQ
|
jnz @@Error6_1
|
||||||
jz @@WaitCompleet_1
|
test AL,08h ;ñîñòîÿíèå ñèãíàëà DRQ
|
||||||
|
jz @@WaitCompleet_1
|
||||||
; Принять блок данных от контроллера
|
; Принять блок данных от контроллера
|
||||||
mov EDI,Sector512 ;offset Sector512
|
; mov AX,DS
|
||||||
mov DX,[ATABasePortAddr] ;ïîðò 1x0h
|
; mov ES,AX
|
||||||
mov CX,256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
|
mov EDI,Sector512 ;offset Sector512
|
||||||
rep insw
|
mov DX,[ATABasePortAddr] ;ïîðò 1x0h
|
||||||
ret
|
mov CX,256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
|
||||||
|
rep insw
|
||||||
|
ret
|
||||||
; Записать код ошибки
|
; Записать код ошибки
|
||||||
@@Error1_1:
|
@@Error1_1:
|
||||||
mov [DevErrorCode],1
|
mov [DevErrorCode],1
|
||||||
ret
|
ret
|
||||||
@@Error6_1:
|
@@Error6_1:
|
||||||
mov [DevErrorCode],6
|
mov [DevErrorCode],6
|
||||||
@@End_1:
|
@@End_1:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
end if
|
|
||||||
|
|
||||||
;*************************************************
|
;*************************************************
|
||||||
;* СБРОС УСТРОЙСТВА *
|
;* СБРОС УСТРОЙСТВА *
|
||||||
@ -314,51 +335,51 @@ end if
|
|||||||
;*************************************************
|
;*************************************************
|
||||||
DeviceReset:
|
DeviceReset:
|
||||||
; Проверить корректность номера канала
|
; Проверить корректность номера канала
|
||||||
mov BX,[ChannelNumber]
|
mov BX,[ChannelNumber]
|
||||||
cmp BX,1
|
cmp BX,1
|
||||||
jb @@Err3_2
|
jb @@Err3_2
|
||||||
cmp BX,2
|
cmp BX,2
|
||||||
ja @@Err3_2
|
ja @@Err3_2
|
||||||
; Установить базовый адрес
|
; Установить базовый адрес
|
||||||
dec BX
|
dec BX
|
||||||
shl BX,1
|
shl BX,1
|
||||||
movzx ebx,bx
|
movzx ebx,bx
|
||||||
mov DX,[ebx+StandardATABases]
|
mov DX,[ebx+StandardATABases]
|
||||||
mov [ATABasePortAddr],DX
|
mov [ATABasePortAddr],DX
|
||||||
; Выбрать нужный диск
|
; Выбрать нужный диск
|
||||||
add DX,6 ;àäðåñ ðåãèñòðà ãîëîâîê
|
add DX,6 ;àäðåñ ðåãèñòðà ãîëîâîê
|
||||||
mov AL,[DiskNumber]
|
mov AL,[DiskNumber]
|
||||||
cmp AL,1 ;ïðîâåðèòü íîìåðà äèñêà
|
cmp AL,1 ;ïðîâåðèòü íîìåðà äèñêà
|
||||||
ja @@Err4_2
|
ja @@Err4_2
|
||||||
shl AL,4
|
shl AL,4
|
||||||
or AL,10100000b
|
or AL,10100000b
|
||||||
out DX,AL
|
out DX,AL
|
||||||
; Послать команду "Сброс"
|
; Послать команду "Сброс"
|
||||||
mov AL,08h
|
mov AL,08h
|
||||||
inc DX ;ðåãèñòð êîìàíä
|
inc DX ;ðåãèñòð êîìàíä
|
||||||
out DX,AL
|
out DX,AL
|
||||||
mov ecx,0x80000
|
mov ecx,0x80000
|
||||||
@@WaitHDReady_1:
|
@@WaitHDReady_1:
|
||||||
; Ïðîâåðèòü âðåìÿ îæèäàíè
|
; Ïðîâåðèòü âðåìÿ îæèäàíè
|
||||||
dec ecx
|
dec ecx
|
||||||
; cmp ecx,0
|
; cmp ecx,0
|
||||||
je @@Err1_2 ;îøèáêà òàéì-àóòà
|
je @@Err1_2 ;îøèáêà òàéì-àóòà
|
||||||
; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè
|
; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè
|
||||||
in AL,DX
|
in AL,DX
|
||||||
; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
|
; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
|
||||||
test AL,80h
|
test AL,80h
|
||||||
jnz @@WaitHDReady_1
|
jnz @@WaitHDReady_1
|
||||||
; Сбросить признак ошибки
|
; Сбросить признак ошибки
|
||||||
mov [DevErrorCode],0
|
mov [DevErrorCode],0
|
||||||
ret
|
ret
|
||||||
; Обработка ошибок
|
; Обработка ошибок
|
||||||
@@Err1_2: mov [DevErrorCode],1
|
@@Err1_2: mov [DevErrorCode],1
|
||||||
ret
|
ret
|
||||||
@@Err3_2: mov [DevErrorCode],3
|
@@Err3_2: mov [DevErrorCode],3
|
||||||
ret
|
ret
|
||||||
@@Err4_2: mov [DevErrorCode],4
|
@@Err4_2: mov [DevErrorCode],4
|
||||||
; Записать код ошибки
|
; Записать код ошибки
|
||||||
ret
|
ret
|
||||||
|
|
||||||
EndFindHDD:
|
EndFindHDD:
|
||||||
|
|
||||||
|
@ -501,11 +501,11 @@ high_code:
|
|||||||
out 0xA1, al
|
out 0xA1, al
|
||||||
|
|
||||||
; Enable interrupts in IDE controller
|
; Enable interrupts in IDE controller
|
||||||
; mov al, 0
|
; mov al, 0
|
||||||
; mov dx, 0x3F6
|
; mov dx, 0x3F6
|
||||||
; out dx, al
|
; out dx, al
|
||||||
; mov dl, 0x76
|
; mov dl, 0x76
|
||||||
; out dx, al
|
; out dx, al
|
||||||
|
|
||||||
;!!!!!!!!!!!!!!!!!!!!!!!!!!
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
include 'detect/disks.inc'
|
include 'detect/disks.inc'
|
||||||
@ -688,7 +688,7 @@ include 'detect/disks.inc'
|
|||||||
; STACK AND FDC
|
; STACK AND FDC
|
||||||
|
|
||||||
call stack_init
|
call stack_init
|
||||||
; call fdc_init
|
; call fdc_init
|
||||||
|
|
||||||
|
|
||||||
; LOAD DEFAULT SKIN
|
; LOAD DEFAULT SKIN
|
||||||
@ -712,6 +712,8 @@ include 'detect/disks.inc'
|
|||||||
; mov esi, boot_uDMA_ok
|
; mov esi, boot_uDMA_ok
|
||||||
; call boot_log
|
; call boot_log
|
||||||
|
|
||||||
|
call apic_timer_reset
|
||||||
|
|
||||||
; LOAD FIRST APPLICATION
|
; LOAD FIRST APPLICATION
|
||||||
cli
|
cli
|
||||||
if 0
|
if 0
|
||||||
@ -1992,7 +1994,7 @@ version_inf:
|
|||||||
version_end:
|
version_end:
|
||||||
endg
|
endg
|
||||||
|
|
||||||
sys_cachetodiskette: ; << removed
|
sys_cachetodiskette: ; << removed
|
||||||
mov [esp + 32], ebx
|
mov [esp + 32], ebx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user