LAPIC timer interrupt test

git-svn-id: svn://kolibrios.org@3531 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Artem Jerdev (art_zh) 2013-05-23 17:29:52 +00:00
parent 4d079770dc
commit 55496cc735
5 changed files with 678 additions and 631 deletions

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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