0,0 → 1,108 |
include 'cfg_bios.inc' |
use16 |
org 0 |
|
rom_header: |
; PnP Option ROM header |
rom_signature dw 0xAA55 ; +0 : magic |
rom_length db 1 ; +2 : number of 512byte blocks |
rom_entry: |
jmp init_entry ; +3 : initialization entry point |
; retf ; +5 |
@@: |
times (24-$) db 0 ; : left blank |
rom_pci_struc dw pci_header ; +18h : offset to PCI data structure |
|
times (32-$) db 0 |
|
; +32 |
pci_header: |
; PCI Data Structure |
pci_magic db 'PCIR' ; +0 : magic |
pci_vendor dw BIOS_PCI_VENDOR ; +4 : 10EE |
pci_device dw BIOS_PCI_DEVICE ; +6 : 0007 |
pci_vdata dw 0 ; +8 : 0 = no vital product data |
pci_length dw 0x18 ; +A : PCI data structure length |
pci_classrev dd BIOS_PCI_CLASS ; +C : rev.00 + class 05.00.00 |
pci_size dw 1 ; +10 : image length (512byte blocks) |
pci_rev dw 0 ; +12 |
pci_codetype db 0 ; +14 : x86 |
pci_indicator db 0x80 ; +15 : last image |
pci_maxlen dw 1 ; +16 : max length (512b blocks) |
pci_hdrptr dw 0; manstr ; +18 : ExROM's config utility code header |
pci_dmtf_entry dw 0 ; +1A : DMTP CLP entry point |
|
times (64-$) db 0 |
|
manstr: |
db 1,'Kolibri-A Operating System',13,10,0 |
; utility code header size = 42 bytes |
times (64+41-$) db 0 ; |
db 1 ; ver.1 |
|
utility_entry: |
jmp boot_failure |
times (128-$) db 0 |
|
;align 128 |
|
boot_failure: |
int 18h ; return to BIOS Boot sequence |
|
align 4 |
init_entry: |
; note x86 "unreal" mode! |
; ax = b:d.f |
; bx = run-time segment |
; cx = PMM segment |
; dx = PMM entry offset |
|
mov dx, 0x0cf8 ; PCI config address |
; mov eax, 0x80010010 ; BAR0 |
and eax, 0x0FFFF |
shl eax, 8 |
or eax, 0x80000010 ;BAR0 |
out dx, eax |
out dx, eax |
add dl, 4 |
in eax, dx |
and eax, 0xFFFFFF00 |
add eax, 0x0400 ; LPC control reg |
mov dword[eax], 0x90050000 ; LED port |
mov dword[eax+4], 0x055 |
xor eax, eax |
sub dl, 4 |
out dx, eax |
mov bx, ax |
retf |
|
|
; mov edx,[esp] ; get the origin |
; and dl, 0xF0 |
; shl ebx, 4 ; correct run-time address |
; mov cx, 0 ; words counter |
;@@: |
; mov ax, word[edx+ecx] |
; mov [ebx+ecx],ax |
; inc cx |
; inc cx |
; test cx,0x200 |
; jz @b |
; xor ax, ax |
; mov bx, ax |
; mov al, 0x20 ; IPL device's attached |
|
; retd ; double ! |
|
|
times (0xDF-$) db 0 ; checksum position |
|
sum = 0 |
repeat $-$$ |
load a byte from $$+% -1 |
sum = a + sum |
end repeat |
check = sum mod 256 |
check_byte db (0x100 - check ) mod 256 |
|
times (512-$) db 0 |