Example 51. initializing the power management uni – Intel 80C188XL User Manual

Page 153

Advertising
background image

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

Advertising
This manual is related to the following products: