mirror of
https://github.com/stevenhowes/wbios.git
synced 2026-05-26 15:53:34 +01:00
d410ad0acb
Original source https://www.pcengines.ch/file/wbios111s.zip
444 lines
9.8 KiB
Plaintext
444 lines
9.8 KiB
Plaintext
;
|
|
; POST power on self-test
|
|
;
|
|
; (C)1997-2001 Pascal Dornier / PC Engines; All rights reserved.
|
|
; This file is licensed pursuant to the COMMON PUBLIC LICENSE 0.5.
|
|
;
|
|
; pd 040325 extend temporary area (option TEMPSIZE)
|
|
; pd 021118 add disakbd / enakbd around PS/2 mouse detection
|
|
; (suggested by Klaus Pfaadt)
|
|
; pd 010429 change VGA_END to allow for large VGA BIOS (e.g.
|
|
; C&T / Asiliant VGA)
|
|
; pd 991021 add option for M-Systems DiskOnChip
|
|
|
|
#if ! def ROM_BEG
|
|
ROM_BEG equ 0c800h ;start of ROM scan
|
|
#endif
|
|
|
|
#if ! def ROM_END
|
|
ROM_END equ 0f800h ;end of ROM scan
|
|
#endif
|
|
|
|
#if ! def VGA_BEG
|
|
VGA_BEG equ 0c000h ;start of VGA BIOS scan
|
|
#endif
|
|
|
|
#if ! def VGA_END
|
|
VGA_END equ 0c800h ;end of VGA BIOS scan
|
|
#endif
|
|
;
|
|
; Reset entry
|
|
;
|
|
; Note: Processor shutdown is NOT supported. There are easier and
|
|
; faster ways to get out of protected mode.
|
|
;
|
|
reset: cli
|
|
cld
|
|
mov ax,cs ;SS = CS (to support fake stack)
|
|
mov ss,ax
|
|
mov ds,ax ;DS = CS (for easier table loads)
|
|
mov al,01h ;POST code: reset entry
|
|
ret_sp postcode
|
|
|
|
ret_sp cs_clr ;clear chipset registers to allow
|
|
;access to DMA, IRQ controller
|
|
ret_sp post_clr ;clear registers
|
|
;
|
|
; Initialize chipset
|
|
;
|
|
resetcs: mov al,02h ;POST code: chipset initialization
|
|
ret_sp postcode
|
|
ret_sp cs_init ;initialize chipset
|
|
rstini: jb rstvid ;:shadow already enabled
|
|
;
|
|
; Detect base memory size
|
|
;
|
|
mov al,03h ;POST code: detect base memory size
|
|
ret_sp postcode
|
|
ret_sp cs_det ;detect memory
|
|
rstdet: ;may return by RET or JMP
|
|
;
|
|
; Init shadow RAM - if DRAM is bad, we'll die here
|
|
; (running out of shadow makes for a more effective
|
|
; memory test, and accelerates startup).
|
|
;
|
|
mov al,04h ;POST code: initialize shadow RAM
|
|
ret_sp postcode
|
|
ret_sp cs_shad ;init shadow
|
|
rstshad2:
|
|
;
|
|
; Init Hercules video card (blind init, we don't care if it's there)
|
|
;
|
|
rstvid: mov al,05h ;POST code: init mono video
|
|
ret_sp postcode
|
|
#if ! def NO_VIDINIT
|
|
ret_sp vid_init ;let there be light ...
|
|
#endif
|
|
;
|
|
; disable all PCI adapters on primary bus -> get bus masters
|
|
; to shut up...
|
|
;
|
|
#if def PCI
|
|
rstpci: mov al,06h ;POST code: disable PCI devices
|
|
ret_sp postcode
|
|
ret_sp pci_rst
|
|
#endif
|
|
;
|
|
; Check low 64KB of DRAM
|
|
;
|
|
mov al,07h ;POST code: test low 64KB of DRAM
|
|
ret_sp postcode
|
|
ret_sp getunreal ;enter unreal mode
|
|
xor ebp,ebp ;start address
|
|
mov dx,[m_rstflg] ;save reset flag
|
|
ret_sp post_t64k ;test first 64K of DRAM
|
|
jnb rstmem5 ;:ok
|
|
mov al,0f7h ;POST code: low 64KB failure
|
|
jmp fatal ;handle fatal error
|
|
|
|
rstmem5: mov [m_rstflg],dx ;restore reset flag
|
|
;
|
|
; initialize stack
|
|
;
|
|
mov al,08h ;POST code: initialize stack
|
|
ret_sp postcode
|
|
mov sp,tmp_stack ;set stack
|
|
xor ax,ax
|
|
mov ss,ax
|
|
;
|
|
; Set CPU specific parameters, enable L1 cache
|
|
;
|
|
call cs_cpu ;DS = 0
|
|
;
|
|
; Check BIOS checksum
|
|
;
|
|
mov al,09h ;POST code: BIOS checksum
|
|
call postcode
|
|
call cs_shadrw ;set read/write shadow
|
|
call d_dosum ;update data checksum
|
|
call cs_shadro ;set read only shadow
|
|
#if ! def NO_ROMSUM
|
|
call post_sum ;verify BIOS checksum
|
|
call post_err ;hang if error
|
|
#endif
|
|
;
|
|
; Configure super I/O
|
|
;
|
|
mov al,0ah ;POST code: super I/O initialization
|
|
call postcode
|
|
call sio_init
|
|
;
|
|
; Clear RTC interrupts, test shutdown byte, set operating mode
|
|
;
|
|
mov al,0bh ;POST code: RTC test
|
|
call postcode
|
|
#if ! def RTC_SKIP
|
|
call rtc_test
|
|
#if ! def IGNORE_RTC
|
|
call post_err
|
|
#endif
|
|
#endif
|
|
;
|
|
; Test refresh (and indirectly, 8254 timer)
|
|
;
|
|
mov al,0ch ;POST code: refresh / 8254 test
|
|
call postcode
|
|
call post_ref
|
|
#if ! def IGNORE_REF
|
|
call post_err
|
|
#endif
|
|
;
|
|
; Set speed-dependent chipset registers
|
|
; (done after post_ref)
|
|
;
|
|
mov al,0dh ;POST code: speed-dependent chipset regs
|
|
call postcode
|
|
call cs_spd
|
|
;
|
|
; Test 8237 DMA registers
|
|
;
|
|
mov al,0eh ;POST code: test 8237 DMA
|
|
call postcode
|
|
#if ! def DMA_SKIP
|
|
call post_dma
|
|
call post_err
|
|
#endif
|
|
;
|
|
; Test DMA page registers
|
|
;
|
|
mov al,0fh ;POST code: test DMA page registers
|
|
call postcode
|
|
call post_page
|
|
call post_err
|
|
;
|
|
; Test 8254 registers
|
|
;
|
|
mov al,10h ;POST code: test 8254 registers
|
|
call postcode
|
|
call post_tim
|
|
call post_err
|
|
;
|
|
; Test keyboard controller (don't care whether we have a keyboard)
|
|
;
|
|
mov al,11h ;POST code: test keyboard controller
|
|
call postcode
|
|
call kb_ini
|
|
#if ! def NO_KBC
|
|
call post_err
|
|
#endif
|
|
;
|
|
; Initialize Timer, DMA, interrupt registers, port 92
|
|
;
|
|
mov al,12h ;POST code: init timer, DMA, 8259...
|
|
call postcode
|
|
call post_tdma
|
|
;
|
|
; Test 8259 interrupt mask registers
|
|
;
|
|
mov al,13h ;POST code: test 8259 mask registers
|
|
call postcode
|
|
call post_irq
|
|
call post_err
|
|
;
|
|
; Size and test low 640 KB
|
|
;
|
|
mov al,14h ;POST code: test low 640KB
|
|
call postcode
|
|
call post_base ;base memory test
|
|
;
|
|
; Initialize memory locations, interrupt vectors, etc.
|
|
;
|
|
mov al,15h ;POST code: init vectors
|
|
call postcode
|
|
call post_vec ;init interrupt vectors
|
|
call vid_vars ;initialize Hercules video BIOS vars
|
|
mov byte [m_devflg],00110000xb ;no floppy present, monochrome
|
|
|
|
#if def GX_VID
|
|
call gx_video ;initialize GX video
|
|
#endif
|
|
#if def GX_INT10
|
|
call gxv_init ;initialize GX int 10
|
|
#endif
|
|
#if def VID_CGA
|
|
call cs_cga ;enable CGA redirect
|
|
#endif
|
|
;
|
|
; run PCI plug & play
|
|
;
|
|
#if def PCI
|
|
mov al,16h ;POST code: PCI plug & play
|
|
call postcode
|
|
call cs_shadrw ;enable read / write shadow
|
|
|
|
#if def PCI_WAIT
|
|
xxx
|
|
mov bx,5000 ;option PCI_WAIT: give slow
|
|
call cs_waitbx ;PCI peripherals time to wake up
|
|
#endif
|
|
|
|
#if ! def SKIP_PNP
|
|
call pci_pnp
|
|
|
|
mov eax,(INTD shl 24)+(INTC shl 16)+(INTB shl 8)+INTA
|
|
call cs_pciint ;set interrupt channels
|
|
#endif
|
|
#endif
|
|
;
|
|
; shadow video BIOS (unless PCI already did it)
|
|
;
|
|
mov al,17h ;POST code: shadow video BIOS
|
|
call postcode
|
|
call cs_vshad
|
|
;
|
|
; Look for VGA video BIOS at C000
|
|
;
|
|
mov al,18h ;POST code: look for VGA BIOS
|
|
call postcode
|
|
mov bx,VGA_BEG ;starting address
|
|
mov dx,VGA_END ;ending address
|
|
call post_scan
|
|
mov ax,cs
|
|
cmp [vec10+2],ax ;did VGA initialize ?
|
|
jz rstmda ;:no, still same interrupt
|
|
mov byte [m_devflg],0 ;VGA
|
|
rstmda:
|
|
;
|
|
; Display signon prompt, base memory size
|
|
;
|
|
mov al,19h ;POST code: sign-on prompt
|
|
call postcode
|
|
#if def CONSOLE
|
|
call con_init ;initialize serial console
|
|
#endif
|
|
mov si,copyrt
|
|
call v_msg
|
|
xor eax,eax
|
|
mov ax,[m_lomem] ;memory size
|
|
call post_itoa ;display number
|
|
mov si,msg_base ;display " KB Base Memory"
|
|
call v_msg
|
|
;
|
|
; keyboard test #2
|
|
;
|
|
mov al,1ah ;POST code: second keyboard test
|
|
call postcode
|
|
call kb_inb
|
|
;
|
|
; Size and test extended memory
|
|
;
|
|
mov al,1bh ;POST code: extended memory test
|
|
call postcode
|
|
#if ! def SKIP_EXTEST
|
|
call cs_a20on ;enable A20 gate
|
|
call post_ext ;test extended memory
|
|
#endif
|
|
;
|
|
; keyboard test, enable timer tick, enable interrupts
|
|
;
|
|
mov al,1ch ;POST code: enable interrupts
|
|
call postcode
|
|
call kb_inc ;continue keyboard initialization
|
|
call tim_init ;initialize timer tick, unmask ints
|
|
sti ;enable interrupts
|
|
call kb_ind ;set keyboard LEDs
|
|
;
|
|
; test & init RTC
|
|
;
|
|
mov al,1dh ;POST code: test / init RTC
|
|
call postcode
|
|
call rtc_ini
|
|
;
|
|
; Initialize floppy disk: detect, spin up, recalibrate
|
|
;
|
|
mov al,1eh ;POST code: init floppy disk
|
|
call postcode
|
|
call fd_init
|
|
;
|
|
; ROM scan
|
|
;
|
|
#if ! def DISKONCHIP
|
|
mov al,1fh ;POST code: option ROM scan
|
|
call postcode
|
|
#if ! def NO_ROMSCAN
|
|
mov bx,ROM_BEG ;starting address
|
|
mov dx,ROM_END ;ending address
|
|
call post_scan
|
|
#endif
|
|
#endif
|
|
;
|
|
; Test & init parallel ports
|
|
;
|
|
mov al,20h ;POST code: test parallel ports
|
|
call postcode
|
|
call lp_test
|
|
;
|
|
; Test & init serial ports
|
|
;
|
|
mov al,21h ;POST code: test serial ports
|
|
call postcode
|
|
call rs_test
|
|
;
|
|
; enable numeric coprocessor
|
|
;
|
|
mov al,22h ;POST code: enable coprocessor
|
|
call postcode
|
|
call cs_npx
|
|
;
|
|
; secondary floppy init
|
|
;
|
|
mov al,23h ;POST code: floppy init
|
|
call postcode
|
|
call fd_inb
|
|
;
|
|
; IDE initialization
|
|
;
|
|
mov al,24h ;POST code: hard disk init
|
|
call postcode
|
|
call cs_shadrw ;set read/write shadow
|
|
call hd_init ;init disk drives
|
|
call d_dosum ;update data checksum
|
|
call cs_shadro ;set read only shadow
|
|
;
|
|
; Flash disk initialization
|
|
;
|
|
#if def FLASHDISK
|
|
call fld_init ;initialize flash disk
|
|
#endif
|
|
;
|
|
; ROM scan (alternate location for M-Systems DiskOnChip)
|
|
;
|
|
; Caution: their firmware version 3.3.5 will HANG if no HDD
|
|
; present. Connect a HDD, and update their boot image to
|
|
; DOC121.EXB or later.
|
|
;
|
|
#if def DISKONCHIP
|
|
mov al,1fh ;POST code: option ROM scan
|
|
call postcode
|
|
#if ! def NO_ROMSCAN
|
|
mov bx,ROM_BEG ;starting address
|
|
mov dx,ROM_END ;ending address
|
|
call post_scan
|
|
#endif
|
|
#endif
|
|
;
|
|
; detect PS/2 mouse
|
|
;
|
|
#if def PS2MOUSE
|
|
mov al,25h ;POST code: PS/2 mouse detect
|
|
call postcode
|
|
call ps2init ;initialize mouse
|
|
#endif
|
|
;
|
|
; Timer / RTC update check
|
|
;
|
|
; Note: This test can take up to one second (normally overlapped
|
|
; with floppy / IDE init), skip if not required.
|
|
;
|
|
mov al,26h ;POST code: timer/RTC check
|
|
call postcode
|
|
#if ! def NO_RTCFAIL
|
|
call tim_test
|
|
cmp byte [tmp_tim],0
|
|
rsttim: jnz rsttim ;hang if failure
|
|
#endif
|
|
;
|
|
; enable L2 cache if present
|
|
;
|
|
#if def cs_cache
|
|
mov al,27h
|
|
call postcode
|
|
call cs_cache
|
|
#endif
|
|
;
|
|
; OEM decision: verify diagnostic flags to decide
|
|
; whether to boot or display error messages
|
|
;
|
|
mov al,28h ;POST code: OEM boot decision point
|
|
call postcode
|
|
call decide
|
|
;
|
|
; clean up before boot
|
|
;
|
|
mov word [m_rstflg],0 ;clear reset flag
|
|
mov di,0500h ;clear temporary data area: 0500..11FF
|
|
#if ! def TEMPSIZE
|
|
TEMPSIZE equ 01200
|
|
#endif
|
|
mov cx,(TEMPSIZE-0500h) / 2
|
|
xor ax,ax
|
|
rep stosw ;this also overwrites stack !
|
|
;
|
|
; Boot operating system
|
|
;
|
|
mov al,00h ;POST code: boot
|
|
call postcode
|
|
#if def BOOTBEEP
|
|
call beep ;let there be noise
|
|
#endif
|
|
int 19h ;boot
|
|
mov al,0dfh ;we shouldn't get here
|
|
call postcode
|
|
cli
|
|
hlt ;hang
|