📄 pmupost.asm
字号:
mov si,offset Video_Off_Item
call GetItem_value
mov PM_RAM:[Video_Off_Mode],al
;Read DOZE timer setup value and store in SM RAM
;Read Suspend timer setup value and store in SM RAM
;Set Conserve Mode
mov cx, VT586_ACPI + 53h
mov al, 88h ; But the first conserve mode will on afer
call Set_PMU ; first doze state
mov PM_RAM:[PM_MODE1],FULL_ON
post_func_call Update_PM_Timer
;enable primary activity monitor
post_func_call End_Pmi_Handler ;clear status
ifdef Break_Suspend_In_Mouse_CMOS
mov si,offset Mouse_Irq_Item
call GetItem_Value
shl al,2
mov PM_RAM:[MISC_CNTL1],al
endif; Break_Suspend_In_Mouse_CMOS
ifdef HDD_PWRDOWN_IN_SUSPEND
ifdef HDD_PWRDOWN_IN_SUSPEND_After_1Min
mov si,offset HDD_Power_Item
Call GetItem_Value
mov byte ptr PM_RAM:[HDD_OFF_Timer],al
cmp al,0
jz short @f
post_func_call HDD_Timer_Restore
@@:
endif; HDD_PWRDOWN_IN_SUSPEND_After_1Min
endif; HDD_PWRDOWN_IN_SUSPEND
mov cl, 2ch
;R08 mov al, 1
;R08 call Set_PMIO
;R16 mov bx, 01e0h ;R08
mov bx, 01e4h ;R16
call Get_Set_PMIO ;R08
;Set CPU type
ifdef VT686 ;R52A - starts
mov si,offset Evt_INTR_Item
call F000_Getitem_Value
mov bl,00000000b ; set primary activity
test al,1
jz short @F
mov bl,00000010b
@@:
mov PM_RAM:[VT586PM_I34h_Value],bl ;default
mov al,bl ;R70
mov cl, 34h
call E000_Set_PMIO
mov si,offset Evt_HDD_Item
call F000_GetItem_Value
or al,al
jz short No_Evt_HDD
or PM_RAM:[VT586PM_I34h_Value],00011100b
No_Evt_HDD:
mov si,offset Evt_DMA_Item
call F000_GetItem_Value
or PM_RAM:[VT586PM_I34h_Value],al
mov si,offset Evt_LPT_COM_Item
call F000_GetItem_Value
or al,al
jz short No_Evt_LPT_COM
or PM_RAM:[VT586PM_I34h_Value],11100000b
No_Evt_LPT_COM:
mov si,offset M_Evt_VGA_Item
call F000_GetItem_Value
mov cl, 35h
call E000_Set_PMIO
else; VT686 ;R52A - ends
mov si,offset Evt_INTR_Item
call Getitem_Value
mov bl,10000000b ; set primary activity
test al,1
jz short @F
mov bl,10000010b
@@:
mov al,bl
mov PM_RAM:[VT586PM_I34h_Value],al ;default
mov cl, 34h
call Set_PMIO
mov si,offset Evt_HDD_Item
call GetItem_Value
shl al,3
or PM_RAM:[VT586PM_I34h_Value],al
mov si,offset Evt_DMA_Item
call GetItem_Value
or PM_RAM:[VT586PM_I34h_Value],al
;R52A mov si,offset Evt_INTR_Item
;R52A call GetItem_Value
;R52A shl al,1
;R52A or PM_RAM:[VT586PM_I34h_Value],al
mov si,offset Evt_LPT_COM_Item
call GetItem_Value
shl al,5
or PM_RAM:[VT586PM_I34h_Value],al
mov si,offset M_Evt_VGA_Item
call GetItem_Value
;R52Aifndef VT686 ;R52
shl al,4
or PM_RAM:[VT586PM_I34h_Value],al
;R52A;R52 - starts
;R52Aelse; VT686
;R52A mov cl, 35h
;R52A call E000_Set_PMIO
;R52Aendif; VT686
;R52A;R52 - ends
endif; VT686 ;R52A
mov cl, 38h
mov al, 01h
call Set_PMIO
ifdef Have_Fan_Control_Item_In_GPO_Low
Have_Fan_Control_Item_In_GPO EQU 1
endif; Have_Fan_Control_Item_In_GPO_Low
ifdef Have_Fan_Control_Item_In_GPO_High
Have_Fan_Control_Item_In_GPO EQU 1
endif; Have_Fan_Control_Item_In_GPO_High
ifdef Have_Fan_Control_Item_In_GPO
extrn Fan_Control_Item:near
mov si, offset DGROUP:Fan_Control_Item
call GetItem_Value ;save suspend--> fan
shl al,7 ;stop ?
or PM_RAM:[Video_Off_Mode],al
endif; Have_Fan_Control_Item_In_GPO
ifdef ACPI_SUPPORT ;
mov cl, 2ah ; Enable Software SMI
mov bl, 40h ;
call Get_Set_PMIO_OR ;
endif ;ACPI_SUPPORT ;
push ds
mov ax,G_RAM
mov ds,ax
assume ds:G_RAM
mov bl,byte ptr ds:[hardware]
pop ds
mov byte ptr PM_RAM:[PS2_INST],bl
pop ds
popa
endif; Move_F000_PMU_INIT_To_E000
ret
Ct_PM_Init Endp
ifndef Move_F000_PMU_INIT_To_E000
;R62 start
;==================================================[]
;Input: SI = item offset
; DI = timer setting offset in PM_RAM
;==================================================[]
Timer_Transfer proc near
call GetItem_Value ;get setup setting
xor ah,ah
shl ax,1
mov bx,offset Timer_Value ;value table
add bx,ax ;translate
mov ax,cs:[bx] ;into reg. value
mov es:[di],ax ;save value in PM_RAM
ret
Timer_Transfer ENDP
IRQ_Evnt_TBL:
dw offset IRQ3_Event_Item
dw offset IRQ4_Event_Item
dw offset IRQ5_Event_Item
dw offset IRQ6_Event_Item
dw offset IRQ7_Event_Item
dw offset IRQ8_Event_Item
dw offset IRQ9_Event_Item
dw offset IRQ10_Event_Item
dw offset IRQ11_Event_Item
dw offset IRQ12_Event_Item
dw offset IRQ13_Event_Item
dw offset IRQ14_Event_Item
dw offset IRQ15_Event_Item
IRQ_Evnt_TBL_Len EQU ($ - offset IRQ_Evnt_TBL) /2
;R62 end
; value ,unit
; ----------------------
Timer_Value:
db 00000000b,0ah ;Disable
db 00000101b,0ah ;5 Sec
db 00001010b,0ah ;10 Sec
db 00010100b,0ah ;20 Sec
db 00011110b,0ah ;30 Sec
db 00101000b,0ah ;40 Sec
db 00111100b,0ah ;1 Min
db 01111000b,0ah ;2 Min
db 00000100b,0bh ;4 Min
db 00000110b,0bh ;6 Min
db 00001000b,0bh ;8 Min
db 00001010b,0bh ;10 Min
db 00010100b,0bh ;20 Min
db 00011110b,0bh ;30 Min
db 00101000b,0bh ;40 Min
db 00111100b,0bh ;1 Hour
endif; Move_F000_PMU_INIT_To_E000
;[]========================================================================[]
;Procedure: Ct_LCD_Init
;
;Function : Set the LCD power down timer which initial method
; varies from chip to chip
;
;Input : DS = DGROUP
; ES = PM_RAM
;
;Output : None
;
;Note : 1. Call from POST 79S (PM initialization)
; 2. Stack available
; 3. Don't destroy any SEGMENT registers!
;[]========================================================================[]
ASSUME ES:PM_RAM
ASSUME DS:DGROUP
Public Ct_LCD_Init
Ct_LCD_Init Proc Near
ret
Ct_LCD_Init Endp
;[]========================================================================[]
;Procedure: HDD_Standby_Offset
;
;Function : Tell BIOS kernal the offset of the setup item
; "HDD Power Down Timer"
;
;Input : DS = DGROUP
; ES = PM_RAM
;
;Output : NC: HDD Power Down Item exist
; SI = Item offset
; CF: HDD Power Down Item absent
; SI Don't care
;
;Note : 1. Call from POST 79S (PM initialization)
; 2. Stack available
; 3. Don't destroy any SEGMENT registers!
; 4. If you don't have such a item in SETUP,
; just set carry flag & return!
;[]========================================================================[]
ASSUME ES:PM_RAM
ASSUME DS:DGROUP
Public HDD_Standby_Offset
HDD_Standby_Offset Proc Near
extrn HDD_Timer_Item:Near
mov si,offset HDD_Timer_Item
clc
ret
HDD_Standby_Offset Endp
;[]========================================================================[]
;Procedure: Get_IRQ15_Offset
;
;Input : DS = G_RAM
;
;Output : NC:
; AX = Segment location of the IRQ15
; PMI service routine
; SI = offset of the IRQ15 PMI service routine
;
; i.e. AX:SI
;
; CF:
; IRQ 15 is not supported!
;
;Registers: Please preserve all registers except AX & SI
;
;[Note] : 1. called from PM_INIT
; NC: AX:SI will be placed interrupt table located
; in segment 0
; CF: IRQ15 vector will be masked off
;[]========================================================================[]
ASSUME DS:G_RAM
Public Get_IRQ15_Offset
Get_IRQ15_Offset Proc Near
stc
ret
Get_IRQ15_Offset Endp
;[]========================================================================[]
;Procedure: Ct_Resume_Handle
;
;Function : Ct_Resume_Handle
;
;Input : None
;
;Output : None
;[]========================================================================[]
Public Ct_Resume_Handle
Ct_Resume_Handle Proc Near
mov ax,G_RAM
mov ds,ax
ASSUME DS:G_RAM
mov ss,G_RAM:[ROM_MODULE_SEG]
mov sp,G_RAM:[ROM_MODULE_OFFSET]
iret
Ct_Resume_Handle Endp
;[]-------------------------------------------------------------------[]
;
; PPPPPPPP AA RRRRRRRR TTTTTTTTTTT 33333
; PPPPPPPPP AAAA RRRRRRRRR TTTTTTTTTTT *** 333 333
; PPP PPP AAAAAA RRR RRR TTT *** 333
; PPPPPPPPP AAA AAA RRRRRRRRR TTT 33333
; PPPPPPPP AAAAAAAAAA RRRRRRRR TTT *** 333
; PPP AAAAAAAAAAAA RRR RRR TTT *** 333 333
; PPP AAA AAA RRR RRR TTT 33333
;
; Hooks to the real mode APM functions
;
;[]-------------------------------------------------------------------[]
;[]-------------------------------------------------------------------[]
;
; PPPPPPPP AA RRRRRRRR TTTTTTTTTTT 44444
; PPPPPPPPP AAAA RRRRRRRRR TTTTTTTTTTT *** 444444
; PPP PPP AAAAAA RRR RRR TTT *** 444 444
; PPPPPPPPP AAA AAA RRRRRRRRR TTT 4444444444
; PPPPPPPP AAAAAAAAAA RRRRRRRR TTT *** 44444444444
; PPP AAAAAAAAAAAA RRR RRR TTT *** 444
; PPP AAA AAA RRR RRR TTT 444
;
;
;
; OEM specific subroutines
;
; Normally, this part will be placed with the PMI handler
; (IRQ15 or SMI or NMI)
;
;[]-------------------------------------------------------------------[]
;[]========================================================================[]
;Function : Routine to handle the power management interrupt (PMI).
;
;Input : None
;
;Output : if PM using IRQ --- no output!
; if PM using NMI --- NC: BIOS has handle this NMI for
; PM chip!
; CF: NMI is not issue by PM chip
;
;Destroy: if PM using IRQ --- destroy None
; if PM using NMI --- destroy FLAG
;[]========================================================================[]
Public APM_R31_Added
APM_R31_Added:
;[]========================================================================[]
;Procedure: Get_PMI_Source
;
;Function : To get the corresponding PMI routine according
; to what kind of PMI it is
;
;Input : DS = PM_RAM
;
;Output : SI = point to appropriate PMI handler
; e.g. if it is a suspend request
; SI = offset Suspend_Handler
;
;Note : 1. Called from PM_Handler
; 2. stack available
; 3. The BIOS PM kernal will issue:
; "call si" after calling this routine!
;[]========================================================================[]
;[]========================================================================[]
;
;Function : Service routine to handle PMI source 0Fh (reg. 35h bit 4-0)
;
;[]========================================================================[]
;[]========================================================================[]
;
;Function : Service routine to handle PMI source
;
;[]========================================================================[]
;[]========================================================================[]
;
;Function : Service routine to handle PMI source
;
;[]========================================================================[]
;[]========================================================================[]
;
;Function : Service routine to handle EXT SMI1 source
;
;[]========================================================================[]
;[]========================================================================[]
;
;Function : Service routine to handle PMI source
;
;[]========================================================================[]
;[]========================================================================[]
;
;Function : Service routine to handle PMI source
;
;[]========================================================================[]
;[]========================================================================[]
;
;Function : Service routine to handle PMI source
;
;[]========================================================================[]
ASSUME DS:PM_RAM
ifndef CRT_Control_Not_In_F000
F000_Enable_CRT Proc Far
call Enable_CRT
retf
F000_Enable_CRT Endp
F000_Disable_CRT Proc Far
call Disable_CRT
retf
F000_Disable_CRT Endp
endif ;CRT_Control_Not_In_F000
ifndef V_ALARM_IN_E000
F000_Virtual_Resume_Timer Proc Far
call Virtual_Resume_Timer
retf
F000_Virtual_Resume_Timer Endp
;-----------------------------------------------------------
;Function : 1. reg.30h bit 1,0 --> 00b (Full-On Mode)
; 2. set PM_RAM:[PM_MODE]=FULL_ON
; 3. Enable CRT display
; 4. set CPU to its full speed
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -