forked from KolibriOS/kolibrios
VHDL code generator for PCI BIOS extension ROMs
git-svn-id: svn://kolibrios.org@6442 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
227eb8887f
commit
b718363009
108
kernel/branches/Kolibri-A/trunk/bootloader/bios-bev/PCIROM.ASM
Normal file
108
kernel/branches/Kolibri-A/trunk/bootloader/bios-bev/PCIROM.ASM
Normal file
@ -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
|
@ -0,0 +1,30 @@
|
||||
; file 'pcirom.bin':0,0x49
|
||||
file 'pcirom.bin'
|
||||
|
||||
|
||||
db 13,10
|
||||
line = '0'
|
||||
block = 0
|
||||
repeat 7
|
||||
db 'INIT_0',line,' => X"'
|
||||
repeat 32
|
||||
pos = 32-%
|
||||
load a byte from pos+block
|
||||
b = a mod 16
|
||||
if b<10
|
||||
c = b + '0'
|
||||
else
|
||||
c = b-10+'A'
|
||||
end if
|
||||
b = a / 16
|
||||
if b<10
|
||||
d = b + '0'
|
||||
else
|
||||
d = b-10+'A'
|
||||
end if
|
||||
db d, c
|
||||
end repeat
|
||||
db '",',13,10
|
||||
block = block + 32
|
||||
line = line + 1
|
||||
end repeat
|
@ -0,0 +1 @@
|
||||
file 'step1.bin':512
|
@ -1,82 +0,0 @@
|
||||
include 'cfg_bios.inc'
|
||||
use16
|
||||
;org 0
|
||||
|
||||
rom_header:
|
||||
; PnP Option ROM header
|
||||
rom_signature dw 0xAA55 ; +0 : magic
|
||||
rom_length db BIOS_BOOT_BLOCK_SIZE ; +2 : number of 512byte blocks
|
||||
rom_entry:
|
||||
jmp init_entry ; +3 : initialization entry point
|
||||
db 'AZ'
|
||||
rom_reserved rb 0x11 ; +7 : reserved (17 bytes)
|
||||
rom_pci_struc dw pci_header ; +18h : offset to PCI data structure
|
||||
rom_expansion dw pnp_header ; +1Ah : offset to expansion header structure
|
||||
|
||||
align 16
|
||||
pnp_header:
|
||||
; PnP Expansion Header
|
||||
pnp_signature db '$PnP' ; +0 : magic
|
||||
pnp_revision db 1 ; +4 : revision
|
||||
pnp_length db 2 ; +5 : length (in 16byte paragraphs)
|
||||
pnp_next dw 0 ; +6 : offset of the next header (0 if none)
|
||||
pnp_reserv1 db 0 ; +8
|
||||
pnp_checksum db 0 ; +9 : checksum
|
||||
pnp_devid dd 0x0 ; +A : device identifier
|
||||
pnp_manstr dw manstr ; +E : pointer to manufacturer string
|
||||
pnp_prodstr dw prodstr ; +10 : pointer to product name string
|
||||
pnp_devtype1 db 2 ; +12 : device type code
|
||||
pnp_devtype2 dw 0x000
|
||||
pnp_devind db 0x14 ; +15 : device indicators
|
||||
pnp_bcv dw 0 ; +16 : boot connection vector (must be 0)
|
||||
pnp_discv dw 0 ; +18 : disconnect vector
|
||||
pnp_bev dw boot_entry ; +1A : boot entry vector
|
||||
pnp_reserv2 dw 0 ; +1C
|
||||
pnp_info dw 0 ; +1E : static resource information vector
|
||||
|
||||
align 16
|
||||
pci_header:
|
||||
; PCI Data Structure
|
||||
pci_magic db 'PCIR' ; +0 : magic
|
||||
pci_vendor dw BIOS_PCI_VENDOR ; +4 :
|
||||
pci_device dw BIOS_PCI_DEVICE ; +6 : sb700 PCI bridge
|
||||
pci_vdata dw 0 ; +8 : vital product data offset
|
||||
pci_length dw 0x18 ; +A : PCI data structure length
|
||||
pci_classrev dd BIOS_PCI_CLASS ; +C : rev.00 + class 04.00.00
|
||||
pci_size dw BIOS_BOOT_BLOCK_SIZE ; +10 : image length (512byte blocks)
|
||||
pci_rev dw 0 ; +12
|
||||
pci_codetype db 0 ; +14 : x86
|
||||
pci_indicator db 0x80 ; +15 : last image
|
||||
pci_reserved dw 0
|
||||
|
||||
align 4
|
||||
manstr:
|
||||
db 'Kolibri-A Operation System',0
|
||||
prodstr:
|
||||
db 'ver.ROM-0.1',0
|
||||
|
||||
align 4
|
||||
boot_entry:
|
||||
@@:
|
||||
|
||||
|
||||
boot_failure:
|
||||
int 18h ; return to BIOS Boot sequence
|
||||
|
||||
align 4
|
||||
init_entry:
|
||||
xor ax, ax
|
||||
mov [cs:rom_length], al
|
||||
mov al, 0x20
|
||||
retf
|
||||
|
||||
|
||||
check = 0
|
||||
repeat $-$$
|
||||
load a byte from $$+%-1
|
||||
check = a + check
|
||||
end repeat
|
||||
|
||||
check_byte db 0x100 - (check mod 256)
|
||||
|
||||
times (512-$) db 0
|
@ -1 +1,11 @@
|
||||
fasm bev.asm
|
||||
fasm pcirom.asm
|
||||
fasm step1.asm
|
||||
fasm step2.asm
|
||||
ren step2.bin pcirom.vhd
|
||||
del step1.bin
|
||||
del pcirom.bin
|
||||
echo off
|
||||
echo ********************************
|
||||
echo (C) Artem Jerdev, 2014
|
||||
echo PCI ROM VHDL Template generated
|
||||
pause
|
@ -2,4 +2,4 @@ BIOS_BOOT_BLOCK_SIZE equ 1 ; in 512-blocks
|
||||
|
||||
BIOS_PCI_VENDOR equ 0x10EE
|
||||
BIOS_PCI_DEVICE equ 0x0007
|
||||
BIOS_PCI_CLASS equ 0x04000000
|
||||
BIOS_PCI_CLASS equ 0x05000000
|
Loading…
Reference in New Issue
Block a user