Intel 80C186XL Computer Hardware User Manual


 
CLOCK GENERATION AND POWER MANAGEMENT
5-14
Example 5-1. Initializing the Power Management Unit for Power-Save Mode
$mod186
name example_PSU_code
;FUNCTION: This function reduces CPU power consumption
; by dividing the CPU operating frequency by a
; divisor.
; SYNTAX: extern void far power_save(int divisor);
; INPUTS: divisor - This variable represents F0, F1 and F2
; of PWRSAV.
; OUTPUTS: None
; NOTE: Parameters are passed on the stack as required
; by high-level languages
;substitute register offset
PWRSAV equ xxxxH ;Power-Save Register
RFTIME equ xxxxH ;Refresh Interval Count
;Register
RFCON equ xxxxH ;Refresh Control Register
PSEN equ 8000H ;Power-Save enable bit
data segment public 'data'
FreqTable dw 1, 4, 8, 16, 32, 64, 0, 0
data ends
lib_80C186 segment public 'code'
assume cs:lib_80C186, ds:data
public _power_save
_power_save proc far
push bp ;save caller's bp
mov bp, sp ;get current top of stack
push ax ;save registers that will
push dx ;be modified
_divisor equ word ptr[bp+6] ;get parameter off the
;stack
mov dx, RFTIME ;get current DRAM refresh
in ax, dx ;rate
and ax, 01ffh ;mask off unwanted bits
div FreqTable[_divisor] ;divide refresh rate
;by _divisor
out dx, ax ;set new refresh rate
mov dx, PWRSAV ;select Power-Save Register
mov ax, _divisor ;get divisor
and ax, 7 ;mask off unwanted bits
or ax, PSEN ;set enable bit
out dx, ax ;divide frequency
pop dx ;restore saved registers
pop bx
pop ax
pop bp ;restore caller's bp
ret
_power_save endp
lib_80C186 ends
end