📄 atbase.asm
字号:
EXTRN POST_56S:NEAR
EXTRN POST_57S:NEAR
EXTRN POST_58S:NEAR
EXTRN POST_59S:NEAR
EXTRN POST_60S:NEAR
EXTRN POST_61S:NEAR
EXTRN POST_62S:NEAR
EXTRN POST_63S:NEAR
EXTRN POST_64S:NEAR
EXTRN POST_65S:NEAR
EXTRN POST_66S:NEAR
EXTRN POST_67S:NEAR
EXTRN POST_68S:NEAR
EXTRN POST_69S:NEAR
EXTRN POST_70S:NEAR
EXTRN POST_71S:NEAR
EXTRN POST_72S:NEAR
EXTRN POST_73S:NEAR
EXTRN POST_74S:NEAR
EXTRN POST_75S:NEAR
EXTRN POST_76S:NEAR
EXTRN POST_77S:NEAR
EXTRN POST_78S:NEAR
EXTRN POST_79S:NEAR
EXTRN POST_80S:NEAR
EXTRN POST_81S:NEAR
EXTRN POST_82S:NEAR
EXTRN POST_83S:NEAR
EXTRN POST_84S:NEAR
EXTRN POST_85S:NEAR
EXTRN POST_86S:NEAR
EXTRN POST_87S:NEAR
EXTRN POST_88S:NEAR
EXTRN POST_89S:NEAR
EXTRN POST_90S:NEAR
EXTRN POST_91S:NEAR
EXTRN POST_92S:NEAR
EXTRN POST_93S:NEAR
EXTRN POST_94S:NEAR
EXTRN POST_95S:NEAR
EXTRN POST_96S:NEAR
EXTRN POST_97S:NEAR
EXTRN POST_98S:NEAR
EXTRN POST_99S:NEAR
;R79 extrn BootSeq_Item:near
;R79 extrn GetItem_Cmos:near
;R79 extrn GetItem_Value:near ;R42
extrn Write_Item_Value:near ;R42
extrn HDD_TYPE_DIFF:ABS ;R42
;r119 start
ifdef RPB_ENABLED
extrn rpb_is_running:near ; RXX
extrn rpb_set_dos_mode:near
endif ; RPB_ENABLED
;r119 end
;R02 start
ifdef PM_SUPPORT
extrn Ct_Resume_Handle:near
extrn Ct_Sleep_Detect:near
extrn Ct_Check_SMI_Start:Near ;R07
endif ;PM_SUPPORT
;R02 end
ifdef IDE_LBA_MODE_SUPPORT ;R16
extrn Set_HDD_parm:Near ;R16
endif ;IDE_LBA_MODE_SUPPORT ;R16
ifdef QUERY_SYSTEM_ADDRESS_MAP
extrn ExtData1Kb:Near
extrn ExtMem128Mb:Near
extrn MemHole_15Mb:near ;R82
extrn MemAbove_15Mb:near ;R82
extrn Ct_MemHole_Status:near ;R82
;R111 start
ifdef ACPI_Support
extrn ACPITableAddress:near ;ACPI
extrn ACPINVSAddress:near ;ACPI
endif; ACPI_Support
;R111 end
endif ;QUERY_SYSTEM_ADDRESS_MAP
extrn CONFIG_TABLE:near ;R27
extrn Auto_IDE_Detect:near ;R37
extrn Display_String:near ;R37
extrn E000_64K_shadow_RW:near ;R44
extrn E000_64K_shadow_R:near ;R44
extrn Disable_E000_ROM_Shadow:near ;R77
IF RELEASE_E000_FOR_PCI ;R77
ifdef PCI_BUS ;R77A
extrn E000_USED_BY_PCI:near ;R77
endif; PCI_BUS ;R77A
ENDIF ;RELEASE_E000_FOR_PCI ;R77
extrn cpu_halt:near ;R84
extrn Int13_original_address:dword ;R81A
extrn SCSI_Drive_Max_Num:byte ;R88A
ifdef E000_SMI_SUPPORT ;R94
extrn Restore_E000_Shadow_Status:FAR ;R94
endif ;E000_SMI_SUPPORT ;R94
extrn CDROM_Boot_Delay:near ;R123D
extrn CDROM_Boot_loop:near ;R123D
.LIST
;[]---------------------------[]
;
; Low memory init (1st 64k)
;
;[]---------------------------[]
G_RAM SEGMENT USE16 AT 0
ORG 04H*4
INCLUDE SEG_0.INC
ORG 400H
INCLUDE G_RAM.INC
ORG 7C00H
BOOT LABEL FAR
G_RAM ENDS
;[]---------------------------[]
;
; Stack init
;
;[]---------------------------[]
BIOS_STK SEGMENT USE16 AT 0H
ORG 400H
BIOSSTK_TOP LABEL WORD
IF1
%OUT USING 1000h POST STACK LOCATION
ENDIF
ORG 1000h
POSTSTK_TOP LABEL WORD
BIOS_STK ENDS
PAGE
DGROUP GROUP FCODE
;R25 FCODE SEGMENT USE16 DWORD PUBLIC 'CODE'
FCODE SEGMENT USE16 PARA PUBLIC 'CODE' ;R25
ASSUME CS:dgroup,DS:dgroup
;R107 IFDEF S64K
;R107 IF1
;R107 %OUT S64K flag set: ORG set to 0 for 64K BIOS
;R107 ENDIF
;R107 ORG 0
;R107
;R107 ELSEIFDEF S60K
;R107 IF1
;R107 %OUT S60K flag set: ORG set to 1000h for 60K BIOS
;R107 ENDIF
;R107 ORG 1000h
;R107
;R107 ELSEIFDEF S56K
;R107 IF1
;R107 %OUT S56K flag set: ORG set to 2000h for 56K BIOS
;R107 ENDIF
;R107 ORG 2000h
;R107
;R107 ELSEIFDEF S52K
;R107 IF1
;R107 %OUT S52K flag set: ORG set to 3000h for 52K BIOS
;R107 ENDIF
;R107 ORG 3000h
;R107
;R107 ELSEIFDEF S48K
;R107 IF1
;R107 %OUT S48K flag set: ORG set to 4000h for 48K BIOS
;R107 ENDIF
;R107 ORG 4000h
;R107
;R107 ELSEIFDEF S44K
;R107 IF1
;R107 %OUT S44K flag set: ORG set to 5000h for 44K BIOS
;R107 ENDIF
;R107 ORG 5000h
;R107
;R107 ELSEIFDEF S40K
;R107 IF1
;R107 %OUT S40K flag set: ORG set to 6000h for 40K BIOS
;R107 ENDIF
;R107 ORG 06000H
;R107
;R107 ELSEIFDEF S36K
;R107 if1
;R107 %OUT S36K flag set: ORG set to 7000h for 36K BIOS
;R107 endif
;R107 ORG 07000H ; START OF ROM, DISK WHIZ
;R107
;R107 ELSE ; S32K
;R107 IF1
;R107 %OUT Default: ORG set to 8000h for 32K BIOS
;R107 ENDIF
;R107 ORG 08000H ; START OF ROM
;R107
;R107 ENDIF ; SxxK
PUBLIC CODE_START
CODE_START:
PAGE
dw offset code_end ;R08
;R101A;R101 start
;R101Aifdef No_Support_HiScan
;R101A public INT06_VECT
;R101AINT06_VECT:
;R101A extrn LOADALL:near
;R101A jmp LOADALL
;R101Aendif ;No_Support_HiScan
;R101A;R101 end
;R39 start
public Post_call_proc
Post_call_proc:
push offset POST_func_end
;R118 push 0f000h
push ax
pushf ;R72
cli ;R72
xchg bp,sp
;R72 mov ax,[bp+2]
;R72 xchg ax,[bp+8]
;R72 mov [bp+2],ax
mov ax,[bp+4] ;R72
;R118 xchg ax,[bp+10] ;R72
xchg ax,[bp+6] ;R118
mov [bp+4],ax ;R72
xchg bp,sp
popf ;R72
pop ax
FAR_JMP <OFFSET POST_VECT>,0e000h
;R39 end
PUBLIC EXCEPTION_HDLR
PUBLIC KILL_MACHINE
EXCEPTION_HDLR:
KILL_MACHINE: MOV AL,0FEH
OUT STAT8042,AL
SHUT_HLT: CLI
HLT
JMP SHORT SHUT_HLT
;R46 - start
;R47 ifndef SMBASE_USE_E000H
ALIGN 4
Public GDTR1
GDTR1: ; global descriptor table register
;R56 dw 8*3 ; LIMIT
;R95 dw 8*4 ;R56; LIMIT
dw 8*5 ;R95; LIMIT
dw offset GDT1
dw 0fh ; in 0F000h segment
Public GDT1
GDT1: ; null descriptor
dw 0 ; limit
dw 0 ; base
db 0 ; hibase
db 0 ; access
db 0 ; hilimit
db 0 ; msbase
Public CODE1_DT
CODE1_DT: ; cs - prom code segment
CODE1_INDEX = ((offset CODE1_DT - offset GDT1)/8) SHL 3
dw 0ffffh ; limit
dw 0 ; base a15-a0
db 0fh ; hibase a23-a16, assume we have 64k prom
db 9fh ; access
db 0 ; hilimit
db 0 ; msbase a31-a24
Public DATA1_DT
Public DATA1_INDEX
DATA1_DT: ; ds - first 64k segment
DATA1_INDEX = ((OFFSET DATA1_DT - OFFSET GDT1)/8) SHL 3
dw 0ffffh ; limit
dw 0 ; base data segment points to
db 0 ; hibase ; 00000000
db 93h ; access
db 08fh ; hilimit (4GB)
db 0 ; msbase
;R47 endif ;SMBASE_USE_E000H
;R46 - end
;R56 - start
ifdef PNP_BIOS
public ESCD_DT
public ESCD_INDEX
;R56A ifndef ESCD_BASE
;R100 ESCD_BASE EQU 0FFFF8000h
;R56A endif ;ESCD_BASE
ESCD_DT: ; ESCD
ESCD_INDEX = ((OFFSET ESCD_DT - OFFSET GDT1)/8) SHL 3
dw 0ffffh ; limit
dw (ESCD_BASE AND 0FFFFh) ; base address
db ((ESCD_BASE SHR 16) AND 0FFh) ; hibase
db 93h ; access
db 0 ; hilimit
db ((ESCD_BASE SHR 24) AND 0FFh) ; msbase
;R56 - end
;R95 - start
public F0DATA_DT
public F0DATA_INDEX
F0DATA_DT: ; F000 data
F0DATA_INDEX = ((offset F0DATA_DT - offset GDT1)/8) SHL 3
dw 0ffffh ; limit
dw 0 ; base address
db 0fh ; hibase
db 93h ; access
db 0 ; hilimit
db 0 ; msbase
endif; PNP_BIOS
;R95 - end
;R23;[]==============================================================[]
;R23;
;R23; REDO:
;R23;
;R23; This routine is called by the reset vector at F000:E05B
;R23; after a power-up. It determines whether this is a virtual
;R23; shutdown or a normal boot. If it is a normal boot, we
;R23; juggle a few cache's and then go on to POST.
;R23;
;R23;Saves: NONE
;R23;
;R23;Entry: NONE
;R23;Exit: NONE
;R23;
;R23;Author: Award
;R23;Date: 04/18/90
;R23;
;R23; Name | Date | Description
;R23; ---------------------------------------------------------------
;R23; TIM | 18-Apr-90 | Update to 4.0
;R23;
;R23;[]==============================================================[]
;R23
;R23 PUBLIC REDO
;R23REDO PROC NEAR
;R23
;R23 ror edx,16 ; high dx = cpu type
;R23;
;R23; Test if this was a virtual shutdown.
;R23;
;R23
;R23 cli
;R23 cld
;R23 in al,STAT8042 ; was this a user or prog reset ?
;R23 test al,4
;R23 jnz short redo1 ; virtual shutdown...
;R23
;R23 mov ax,cs ;R12
;R23 mov ss,ax ; ss = cs ;R12
;R23
;R23;R02 start
;R23ifdef PM_SUPPORT
;R23 call CT_Sleep_Detect
;R23 jnz short redo1 ; virtual shutdown...
;R23endif ;PM_SUPPORT
;R23;R02 end
;R23 xor al,al ; al = early detect ;R12
;R23 ror edx,16 ; dx = CPU ID ;R12
;R23 call CPU_Detect ;R12
;R23;R11 call CPU_Init ;R12
;R23 jmp Pup_Wait ; first time power up
;R23REDO ENDP
;R23
;R23
;R23;[]==============================================================[]
;R23;
;R23; REDO1:
;R23;
;R23;
;R23; Handle the virtual shutdown. The shutdown code is in byte 0Fh
;R23;of CMOS. The following codes can be found can be used:
;R23;
;R23;
;R23;00h = Power on or soft reset
;R23;01h = Memory sizing pass
;R23;02h = Memory test pass
;R23;03h = Memory test fail
;R23;04h = POST end; boot system
;R23;05h = Flush keyboard buffer, do an EOI, jmp to dword 40:67
;R23;06h = Protected mode test pass
;R23;07h = Protected mode test fail
;R23;08h = Memory sizing fail
;R23;09h = INT 15h block move return
;R23;0Ah = jmp to dword 40:67
;R23;
;R23;Saves: NONE
;R23;
;R23;Entry: NONE
;R23;Exit: NONE
;R23;
;R23;Author: Award
;R23;Date: 04/18/90
;R23;
;R23; Name | Date | Description
;R23; ---------------------------------------------------------------
;R23; TIM | 18-Apr-90 | Update to 4.0
;R23;
;R23;[]==============================================================[]
;R23
;R23REDO1 PROC NEAR
;R23
;R23;R02 start
;R23ifdef PM_SUPPORT
;R23; NOTE: To resume from the SUSPEND mode on a 386SL system, accessing
;R23; BIOS stack is not allowed before handling the RESUME process.
;R23
;R23 mov al,0fh NMI_OFF ; check cmos shutdown type
;R23 out CMOS,al
;R23 newiodelay
;R23 in al,CMOS+1
;R23 newiodelay
;R23 cmp al,RESUME_SHUTDOWN_BYTE ; user return sleep mode
;R23 jne redo1_0
;R23 jmp CT_RESUME_HANDLE
;R23redo1_0:
;R23endif ;PM_SUPPORT
;R23;R02 end
;R23
;R23;R07 start
;R23ifdef PM_SUPPORT
;R23 mov ax,G_RAM ;R15
;R23 mov es,ax ;R15
;R23 cmp es:USER_REBOOT,CTRL_ALT_DEL ;R15
;R23 je short Not_SMI_Start ;R15
;R23 jmp Ct_Check_SMI_Start ;See if it is a SMI request
;R23 ;issue(AMD & U5 CPU)
;R23 Public Not_SMI_Start
;R23Not_SMI_Start:
;R23endif ;PM_SUPPORT
;R23;R07 end
;R23
;R23 mov ax,BIOS_STK ; setup stack
;R23 mov ss,ax
;R23 mov sp,offset BIOSSTK_TOP
;R23
;R23;R05 - start
;R23 mov al,8fh ; cmos shutdown byte
;R23 out CMOS,al
;R23 newiodelay
;R23 in al,CMOS+1
;R23
;R23 push ax
;R23 or al,al
;R23 jz short Not_ShutDown
;R23;R05 - end
;R23
;R23 call Init_Cyrix_Reg ;R21
;R23
;R23 mov al,1 ;R06
;R23 call Restore_Cyrix_Reg ;R06
;R23
;R23 call Ct_Restore_Cyrix_Reg ;R14A
;R23
;R23;R14 - starts
;R23;R14B mov ax,0C3C3h ;lock Cyrix registers
;R23;R14B out 22h,al
;R23;R14B in al,23h
;R23;R14B or al,1
;R23;R14B xchg ah,al
;R23;R14B out 22h,al
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -