亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? power.asm

?? DOS 源碼 系列之 BIOS ,上傳與大家分享
?? ASM
?? 第 1 頁 / 共 5 頁
字號:
	pop     es
	pop     di
	pop     si                      ; M086
	jmp     short PS_SRet

PS_Get_Stats:

IFDEF INCL_APM
	cmp     bx,PW_GET_APM_STATS     ;                               ; M076
	ja      PS_Inv_Parm_Err         ; invalid info level ?
	je      PS_Get_APM_Stats        ; APM statistics (resume count ) ?
ELSE
	or      bx,bx                   ; only Idle detection stats will be
	jnz     PS_Inv_Parm_Err         ; returned
ENDIF
	cmp     cx,size IDLE_INFO       ; No, Idle detection statistics
	jb      PS_Buff_Ovf_Err         ; Buffer not sufficient         ; M076
	push    si                      ; M086
	push    di
	lea             di,     INFO
PS_Transf_Stats:
	push    es
	mov     es,Bios_Data_Word
	assume  es:Bios_Data
	assume  es:nothing
	mov     bx,-1                   ; get stats ; there is no set stats
	jmp     short PS_Exch_ESDS_SIDI

IFDEF   INCL_APM

PS_Get_APM_Stats:
	cmp     cx, APM_STATS_STRUC_SIZE
	jb      PS_Buff_Ovf_Err         ; Buffer not sufficient         ; M076
	push    si                      ; M088
	push    di
	lea     di,APM_RESUME_COUNT
	jmp     short PS_Transf_Stats

ENDIF   ; of IFDEF INCL_APM

PS_Inv_Parm_Err:
	mov     ax,ERROR_PM_INVALID_PARAMETER
	stc
	jmp     short PS_Ret

PS_SRet: xor    ax,ax                   ; M084 : Clear CY and  put
					; 0 in AX to mean no error
PS_Ret:
	pop     ds
	ret


PS_Buff_Ovf_Err:
	mov     ax,ERROR_PM_BUFFER_TOO_SMALL
	jmp     PS_FRet

PS_GetSet_PWState:
	mov     ds,cs:Bios_Data_Word
	assume  ds:Bios_Data
	or      bh,bh           ; get power state ?
	call    GetPowStatus    ; M089 : old state in AL
	mov     bh,al           ; get old status
	mov     ax,0            ; M084 : Assume no error 
	jz      PS_APM_Ret      ; M084 
	test    bl,PWSTATE_RESERVED_BITS
	jnz     PS_Inv_Parm_Err
	push    bx              ; save old status on stack
; set power status
	test    bl,1            ; check for POWER.SYS/EXE enable
	jnz     PS_Enable_Power
; disable POWER.SYS
	test    POWER_STATUS,1
	jz      PS_Test_APM_Bit         ; already disabled
;
	and     [CONTROL].IDLE_FLG,NOT(IDLE_ACTIVE)     ; turn of idle detection
	and     POWER_STATUS,NOT(1)     ; turn off S/W PM
	jmp     short PS_Test_APM_Bit
PS_Enable_Power:
	test    POWER_STATUS,1
	jnz     PS_Test_APM_Bit         ; already enabled
	or      [CONTROL].IDLE_FLG,IDLE_ACTIVE  ; turn on idle detection
	or      POWER_STATUS,1          ; turn on S/W PM
;
PS_Test_APM_Bit:
;
IFDEF   INCL_APM
	call    Do_APM_Control
ENDIF
;
	pop     bx                      ; get back old status
;
; M084: NSM
; At this point :
; CY set if error 
;       AX = error code
; NC -> AX = 0
;
PS_APM_Ret:
	push    ax                      ; M089  BEGIN
	call    GetPowStatus            ; status in al
	mov     bl,al                   ; return with current status
	pop     ax                      ; M089  END
	jmp     PS_Ret

PS_GetSet_BaseLine:
	mov     ds,Bios_Data_Word
	assume  ds:Bios_Data
	or	bx,bx			; get base line ?
	je	PS_GetBaseLine
	mov	[BaseLineRef],bx
	mov	[KYC].BASE,bx
;
PS_GetBaseLine:
	mov	bx,[BaseLineRef]
	mov	cx,[BaseLineOvf]
	jmp	PS_SRet

Pwr_Services    endp

;****************************** GetPowStatus **********
; Get the current power status
; Entry: none
; Exit:  AL:Bit 0 - 1 if S/W PowMgmt enabled
;           Bit 1 - 1 if H/W PowMgmt enabled
; Regs: AX
; M089: Created
;******************************************************************
GetPowStatus    proc    near
	pushf
	mov     al,POWER_STATUS
	test    al,2            ; test for H/W enabled state
	jnz     GPS_Ret
; H/W not connected state; let us see if it is atleast enabled from what
; we know of before last disconnect.
IFDEF   INCL_APM
	test    fAPM_STATE,1            
	jz      @f
	or      al,2            ; H/W pow.mgmt enabled - POWER STD mode
@f:
ENDIF                   ; IFDEF INCL_APM
GPS_Ret:
	popf
	ret
GetPowStatus    endp

IFDEF   INCL_APM
;****************************** Do_APM_GetSet_PollCount **********
; INT 2F subfunction service procedure 
; To get/set the APM pollcount
; Entry: BX = 0 -> get APM poll count
;               otherwise, New poll count to be set
; Exit:  BX = new APM Poll count
; Regs: BX,DS,Flags
;******************************************************************
Do_APM_GetSet_PollCount Proc    NEAR

	mov     ds,cs:Bios_Data_Word
	assume  ds:Bios_Data
	or      bx,bx
	jz      DAPC_Get_PollCount
	mov     [APM_MAX_POLLCOUNT],bx
	mov     [APM_POLL_COUNT],bx             ; M093
	jmp     short DAPC_Ret 
DAPC_Get_PollCount:
	mov     bx,APM_MAX_POLLCOUNT
DAPC_Ret:
	ret

Do_APM_GetSet_PollCount endp

;****************************** Do_APM_Control *********************
; INT 2F subfunction service procedure 
; To (enable-connect to)/(disable-disconnect from) APM
; Entry:  BL = 3 -> connect and enable APM              ; M089
;         BL = 2 -> stay disconnected but enable it if needed
;         BL = 1 or 0 -> disconnect and disable
;
; Exit:  CY if operation failed
;               ax = error code
;        ELSE AX = 0
;
;       (POWER_STATUS flags updated properly
;        fAPM_STATE also updated)
;       APM_RESUME_COUNT initialised to zero if enable successful
;
; Regs: ax,bx,cx,dx
;******************************************************************

Do_APM_Control  proc    near

	cmp     bl,2            ; check for F/w PM bit enable
	jae     DACt_Enable_APM

; M089 BEGIN
; With the new definition of POWER STD, we need to enable APM but not
; connected to it (and sometime disable APM but we would not have been
; connected to it for doing it). Enable/disable can only be done if we
; are connected to APM and so We first connect to APM to enable/disable
; APM and depending on the requested state, we disconnect from APM
;
; Disconnect and disable APM
	and     [CMOSFlg],NOT(1)        ; M091 reset STD mode+APM bit in CMOSFlg
	test    POWER_STATUS,2          ; are we  connected already ?
	jnz     DACt_Dis_con_able       ; yes, just disable and disconnect
; we are not connected ; so go connect to it first, enable it
; and then disable it!

IFDEF POWERALONE
	call    far ptr Check_and_Init_APM ; M003: always check for APM presence
ELSE
	call    Check_and_Init_APM_Ptr
ENDIF
; M089 END
DACt_Dis_con_able:
	test    fAPM_PRESENT,1          ; M003:no need to do anything if APM not
	jz      DACt_End                ; M003:present
; disable APM
	mov     cx,APM_DISABLE_FUNC
	call    Do_APM_Enable_Disable   ; disable APM ;M005
	jc      DACt_End
	mov     fAPM_STATE,0            ; flag APM disabled state
	call    Do_APM_DisConnect
	and     POWER_STATUS,NOT (2)            
	jmp     short DACt_End
DACt_Enable_APM:
	push    bx                      ; save the desired state (input)

;M089 BEGIN
	test    POWER_STATUS,2
	jz      DACt_Connect            ; Go connect and enable
	test    fAPM_STATE,1            ; are we also enabled ?
	jnz     DACt_ChkForDiscon       ; yes, go see if we have to disconnect
	mov     cx,APM_ENABLE_FUNC
	call    Do_APM_Enable_Disable   ; enable APM 
	mov     fAPM_STATE,1            ; flag APM enabled state

DACt_Connect:
;M005 BEGIN - for resident driver call Check_and_Init_APM through pointer

IFDEF POWERALONE
	call    far ptr Check_and_Init_APM ; M003: always check for APM presence
ELSE
	call    Check_and_Init_APM_Ptr
ENDIF ; POWERALONE

;M005 END

	jnc     DACt_ChkForDiscon       ;  before connecting to it
	jz      DACt_APM_ConnErr        ; ignore if APM not present
	clc

DACt_ChkForDiscon:
	pop     bx                      ; get back requested APM state
	and     [CMOSFlg],NOT(1)        ; assume not stdmode+apm
	cmp     bl,3                    ; both S/W and F/W pwmgmt ON ?
	je      DACt_End                ; Yes, all done

; User requested APM be ON but we should stay disconnected

	call    Do_APM_DisConnect
	and     POWER_STATUS,NOT (2)            
	test    fAPM_PRESENT,1          ; M091
	jz      DACt_End                ; M091
	or      [CMOSFlg],1             ; M091 set POWER_STDMODE+APM
	mov     [CMOSPollCount],MAXCMOSPOLLCOUNT ; M091
; M089 END

DACt_End: xor   ax,ax                   ; M094  - ax=0 -> no error
DACt_Ret:
	ret

DACt_APM_ConnErr:
	pop     bx
	mov     ax,ERROR_PM_ALREADY_CONNECTED   ; put valid error code here
	stc
	jmp     short DACt_Ret

Do_APM_Control  endp

ENDIF
;********************** TIMER TIC READ ROUTINE *******************

; ax = READ_TMR0( void)
; purpose: to return tic stored in timer0
;
; M0FF:
; OEMs NOTE:
; This procedure should always return a count between 64k and 1
; This code assumes an 8254 timer chip and also assumes that 64k is the
; max count and counted DOWN.
; DOS usually uses mode 3 in both 8253/54. ( mode 2 counts the MAXCOUNT
; just once whereas mode counts it twice in a tic period). But in 8254,
; we can get half cycle we are in, in mode 3 whereas we can't get that
; info in 8253.   
; OEMS, if they don't have an 8254, need to modify this code to always
; return a count as if we are operating in mode 2 (down counter).

PUBLIC Read_tmr0
Read_tmr0 proc near
	assume  ds:nothing, es:nothing

IFDEF 8253
	cli
	mov     al,0
	out     43h,al
	jmp     $+2
	in      al,40h
	jmp     $+2
	mov     ah,al
	in      al,40h
	sti
	xchg    ah,al
	ret
ELSE				; 8254 assumed so that we will know the mode
	push    bx
	mov     al,0c2h         ; read mode as well as count of tmr0
	cli
	out     43h,al
	jmp     $+2

	in      al,40h		; status byte
				; bit 7 -> first half cycle
				; bit 1-3 -> mode 
	mov     bl,al		; save status in bl&bh
	mov     bh,al
	jmp	$+2

	in      al,40h		; low byte of count
	jmp     $+2
	mov     ah,al

	in      al,40h		; high byte of count
	sti
	xchg    ah,al		; ax = current tmr count

	and     bl,0eh          ; mask everything but mode bits 
	cmp     bl,6            ; mode 3 ?
	jne     rt_ret		; if mode 2 no need for adjustments
	shr     ax,1            ; halve for mode 3 cycle 1
	test    bh,80h          ; is this cycle 2 ?
	jz      rt_ret		; yes, the count is already correct 
	add     ax,8000h        ; first cycle, so add 32k to the count
rt_ret:
	pop     bx
	ret
ENDIF

Read_tmr0 endp

IFDEF DEBUG                         ; only use this code on test version

START_SOUND proc

	mov     al,0
	out     42h,al
	jmp     $+2
	mov     al,50h
	out     42h,al

	mov     al,3
	in      al,61h
	jmp     $+2
	or      al,3
	out     61h,al
	ret

START_SOUND endp

END_SOUND proc
	in      al,61h
	jmp     $+2
	and     al,not 3
	out     61h,al
	ret
END_SOUND endp

ENDIF                                   ; IFDEF DEBUG


; Z.flag CheckV86()
; return - NZ, if 386 V86 or protected  mode


PUBLIC CheckV86
CheckV86 proc near
	assume  ds:Bios_Data, es:nothing

	test    [CONTROL].CV86FLG,1     ; Avoid  test
	jz      cv8ret                  ; if bit cleared

	test    [CONTROL].CV86FLG,2             ; is it a 386?
	jz      cv8all                  ; don't know yet ...
cv8386:
	.386p
	smsw    [MSW]

	.8086
	test    [MSW],1                 ; check for protected mode
	ret                             ; NZ, yes

cv8all: push    ax                      ; run through all proccesors

	push    sp                      ; below 286?
	pop     ax
	cmp     sp,ax
	jne     cv8ex0                  ; yes, disable check

	pushf                           ; check TS
	pop     ax                      ; should be zero for 286
	or      ax,4000h                ; try setting TS high
	push    ax
	popf
	pushf
	pop     ax                      ; restore TS

	test    ax,4000h                ; did it remain 0?
	jz      cv8ex0                  ; yes, 286

	pop     ax
	or      [CONTROL].CV86FLG,2     ; Set 386 bit to save time
	jmp     short cv8386

cv8ex0: xor     ax,ax                   ; We don't have to test again
	mov     [CONTROL].CV86FLG,ax    ; return ZF
	pop     ax

cv8ret: ret
CheckV86 endp

;***************** DO_IDLE OEM EXTENDABLE ****************

PUBLIC Do_idle_dos
Do_idle_dos proc far
	assume  ds:nothing, es:nothing

	push    ds
	mov     ds,Bios_Data_Word
	assume  ds:Bios_Data
	call    DO_IDLE
	pop     ds
	assume  ds:nothing
	ret

Do_idle_dos endp

; CY.flag DO_IDLE()
; purpose: To put CPU in a low power state via a halt or
;          OEM supplied OEM_IDLE routine.
; passed:  control.IDLE_FLG - enables/disables DO_IDLE
; return:  Carry Set, if IDLE was executed

PUBLIC Do_idle
Do_idle proc near
	assume  ds:Bios_Data, es:nothing

; JAH Start - If app supports IDLE only idle on int 2f idle entry point below
	push	ds
	mov	ds,PSPsegment		; DS:BX --> Current PSP in Dosdata
	mov	ds,WORD PTR ds:[CUR_PSP_OFFSET]	; DS -> current app's PSP
	assume	ds:Pdb_Data
	cmp	PDB_Idle,IDLE_SUPPORT_BYTE ; Check app's idle support byte
	pop	ds
	assume	ds:Bios_Data

	je	didex1			; Idle aware app so don't idle

	PUBLIC I2fIdleEntry
I2fIdleEntry:				; Entry point from int 2fh handler
; JAH End

	test    [CONTROL].IDLE_FLG,IDLE_ACTIVE
	jnz     didbgn
didex1: clc                             ; idle failed  to execute
	ret

didbgn: push    ax

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品奇米国产一区二区三区| 国产精品久久网站| 中文字幕国产一区| 午夜久久久影院| 91蜜桃网址入口| 久久久精品免费免费| 石原莉奈在线亚洲二区| 色综合天天性综合| 久久久精品国产免大香伊| 日日夜夜精品视频免费| 一本色道久久综合亚洲精品按摩| 久久影院视频免费| 青青草国产成人av片免费| 色婷婷久久久亚洲一区二区三区| 国产婷婷精品av在线| 九一久久久久久| 日韩一区二区三区在线观看| 亚洲一级不卡视频| 91色|porny| 日韩毛片视频在线看| 成人一级黄色片| 久久久亚洲精品石原莉奈 | 一区在线观看视频| 国产乱码一区二区三区| 欧美mv和日韩mv的网站| 老鸭窝一区二区久久精品| 日韩一区二区在线看片| 蜜桃视频在线观看一区| 欧美一级夜夜爽| 美女久久久精品| 久久一区二区三区四区| 狠狠色丁香婷综合久久| 久久久久亚洲综合| 国产福利不卡视频| 亚洲国产精品t66y| 成人h动漫精品| 亚洲丝袜另类动漫二区| 91丨porny丨最新| 亚洲国产一区二区三区青草影视| 在线一区二区观看| 香港成人在线视频| 日韩一区二区电影在线| 国产精品综合一区二区三区| 国产喂奶挤奶一区二区三区| 99久久精品一区二区| 樱桃国产成人精品视频| 欧美吻胸吃奶大尺度电影| 日韩不卡一区二区| 欧美成人精品1314www| 国产a区久久久| |精品福利一区二区三区| 日本精品免费观看高清观看| 性欧美大战久久久久久久久| 日韩免费电影网站| 成人黄页在线观看| 一区二区三区在线高清| 日韩欧美中文一区| 从欧美一区二区三区| 亚洲手机成人高清视频| 欧美一区二区日韩| 懂色一区二区三区免费观看| 亚洲一区二区在线免费观看视频| 欧美日韩成人在线| 国产在线精品视频| 亚洲色图一区二区三区| 欧美一区二区三区四区在线观看 | 亚洲欧美日本在线| 91精品国产麻豆| 成人一级黄色片| 日韩有码一区二区三区| 国产欧美精品日韩区二区麻豆天美| 91免费观看在线| 国产综合久久久久影院| 夜夜操天天操亚洲| 久久久久久久免费视频了| 欧洲精品一区二区| 国产69精品久久777的优势| 丝袜美腿亚洲色图| 中文字幕五月欧美| 26uuu国产电影一区二区| 欧美午夜影院一区| 成人手机在线视频| 精品一区二区三区免费播放| 一区二区三区不卡在线观看| 久久久精品tv| 日韩三级中文字幕| 欧美日韩综合在线免费观看| 不卡av免费在线观看| 精品亚洲免费视频| 天天操天天干天天综合网| 日韩美女精品在线| 中文字幕第一区二区| 精品欧美一区二区在线观看 | 美女网站视频久久| 亚洲精品伦理在线| 中文字幕一区av| 久久久国产一区二区三区四区小说| 在线播放日韩导航| 在线观看日韩av先锋影音电影院| 国产v综合v亚洲欧| 国产一二精品视频| 精品一二三四在线| 久久精品999| 麻豆精品新av中文字幕| 青青草91视频| 亚洲www啪成人一区二区麻豆| 亚洲免费av观看| 亚洲欧美激情插| 亚洲视频一区在线| 国产精品久久久久一区| 欧美激情一二三区| 欧美激情自拍偷拍| 国产日韩欧美a| 国产精品全国免费观看高清| 国产精品毛片无遮挡高清| 国产欧美一区二区精品性| 国产日韩欧美制服另类| 日本一区二区三区电影| 国产亚洲综合av| 中文字幕亚洲精品在线观看| 亚洲欧美怡红院| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲四区在线观看| 亚洲自拍欧美精品| 亚洲一级二级三级| 免费人成精品欧美精品| 久久99久久久久| 九九久久精品视频| 国产成人午夜片在线观看高清观看| 丁香另类激情小说| 91麻豆文化传媒在线观看| 欧美亚洲动漫制服丝袜| 69久久夜色精品国产69蝌蚪网| 日韩一区二区视频| 中文字幕乱码一区二区免费| 亚洲人成影院在线观看| 亚洲成人一二三| 黄色资源网久久资源365| 国产精品亚洲午夜一区二区三区 | 国产伦精一区二区三区| 成人午夜在线免费| 色噜噜狠狠成人网p站| 911国产精品| 精品国产91亚洲一区二区三区婷婷 | 国产剧情在线观看一区二区| 成人性生交大片免费看视频在线| 日本久久一区二区三区| 日韩精品一区二区三区三区免费| 国产女主播在线一区二区| 一区二区三区不卡视频| 国产在线一区二区综合免费视频| av不卡在线播放| 欧美一级xxx| 亚洲日本一区二区三区| 免费精品视频最新在线| gogo大胆日本视频一区| 欧美一级欧美三级在线观看 | 久久综合网色—综合色88| 亚洲欧美日韩在线播放| 久久精品噜噜噜成人av农村| 一本久久综合亚洲鲁鲁五月天| 欧美本精品男人aⅴ天堂| 亚洲激情六月丁香| 国产一区欧美一区| 欧美日韩国产小视频在线观看| 精品国产91乱码一区二区三区 | 日本一区二区三区国色天香 | 制服丝袜日韩国产| 亚洲欧美怡红院| 国产成人综合在线观看| 欧美日韩国产精选| 国产精品毛片a∨一区二区三区| 热久久免费视频| 在线观看成人免费视频| 国产精品欧美久久久久一区二区| 美女爽到高潮91| 7777女厕盗摄久久久| 亚洲欧美成人一区二区三区| 国产一区二区三区观看| 欧美精品色综合| 夜夜嗨av一区二区三区网页| 91在线你懂得| 国产精品国模大尺度视频| 久久99九九99精品| 日韩欧美高清一区| 视频一区二区三区中文字幕| 欧美丝袜丝交足nylons图片| 中文字幕在线播放不卡一区| 国产成人综合亚洲91猫咪| 精品日韩在线观看| 免费不卡在线观看| 6080亚洲精品一区二区| 性做久久久久久| 欧美精品在线视频| 亚洲高清免费视频| 欧美日韩一区二区在线观看| 亚洲中国最大av网站| 欧美午夜免费电影| 一区二区三区不卡视频在线观看| 91成人免费网站|