182 lines
3.7 KiB
NASM
182 lines
3.7 KiB
NASM
TITLE "Memory Management Support Routines"
|
|
;++
|
|
;
|
|
; Copyright (c) 2001 Microsoft Corporation
|
|
;
|
|
; Module Name:
|
|
;
|
|
; superio.asm
|
|
;
|
|
; Abstract:
|
|
;
|
|
; This module implements the routines to interact with the system super I/O
|
|
; controller.
|
|
;
|
|
; Environment:
|
|
;
|
|
; Kernel mode only.
|
|
;
|
|
;--
|
|
|
|
.586p
|
|
.xlist
|
|
INCLUDE ks386.inc
|
|
INCLUDE callconv.inc
|
|
.list
|
|
|
|
;
|
|
; Define the ports used to interact with the super I/O controller.
|
|
;
|
|
|
|
SMC_CONFIG_PORT EQU 02Eh
|
|
SMC_INDEX_PORT EQU 02Fh
|
|
SMC_DATA_PORT EQU 02Fh
|
|
|
|
;
|
|
; Define the values to enter and exit the configuration mode of the super I/O
|
|
; controller.
|
|
;
|
|
|
|
SMC_ENTER_CONFIGURATION_MODE EQU 055h
|
|
SMC_EXIT_CONFIGURATION_MODE EQU 0AAh
|
|
|
|
;
|
|
; Define the logical device numbers.
|
|
;
|
|
|
|
SMC_FLOPPY_DRIVE_CONTROLLER EQU 000h
|
|
SMC_PARALLEL_PORT EQU 003h
|
|
SMC_SERIAL_PORT_1 EQU 004h
|
|
SMC_SERIAL_PORT_2 EQU 005h
|
|
SMC_KEYBOARD EQU 007h
|
|
SMC_GAME_PORT EQU 009h
|
|
SMC_PME EQU 00Ah
|
|
SMC_MPU_401 EQU 00Bh
|
|
SMC_USB_HUB EQU 00Ch
|
|
|
|
;
|
|
; Define the global configuration registers.
|
|
;
|
|
|
|
SMC_LOGICAL_DEVICE_NUMBER EQU 007h
|
|
|
|
SMC_DEVICE_ACTIVATE EQU 030h
|
|
SMC_DEVICE_PRIMARY_ADDRESS_HIGH EQU 060h
|
|
SMC_DEVICE_PRIMARY_ADDRESS_LOW EQU 061h
|
|
|
|
;++
|
|
;
|
|
; IODELAY
|
|
;
|
|
; Macro Description:
|
|
;
|
|
; This macro simply does a jmp to next instruction to synchronize
|
|
; IO port access.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; None
|
|
;
|
|
;--
|
|
|
|
IODELAY macro
|
|
ifdef NEC_98
|
|
out 5fh,al ; same effect with "stdcall IODelay8259"
|
|
else ; NEC_98
|
|
jmp $+2
|
|
endif ; NEC_98
|
|
endm
|
|
|
|
_TEXT SEGMENT DWORD PUBLIC 'CODE'
|
|
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
|
|
|
|
;++
|
|
;
|
|
; VOID
|
|
; DbgInitializeSuperIo(
|
|
; VOID
|
|
; )
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This function initializes the super I/O controller.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; None.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
cPublicProc _DbgInitializeSuperIo, 0
|
|
|
|
;
|
|
; Place the the super I/O controller in configuration mode.
|
|
;
|
|
|
|
mov edx, SMC_CONFIG_PORT
|
|
mov al, SMC_ENTER_CONFIGURATION_MODE
|
|
out dx, al
|
|
IODelay
|
|
|
|
;
|
|
; Select the first serial I/O port for configuration.
|
|
;
|
|
|
|
mov al, SMC_LOGICAL_DEVICE_NUMBER
|
|
out dx, al
|
|
IODelay
|
|
inc edx
|
|
mov al, SMC_SERIAL_PORT_1
|
|
out dx, al
|
|
IODelay
|
|
dec edx
|
|
|
|
;
|
|
; Activate the first serial I/O port at a base address of 0x03F8.
|
|
;
|
|
|
|
mov al, SMC_DEVICE_ACTIVATE
|
|
out dx, al
|
|
IODelay
|
|
inc edx
|
|
mov al, 1
|
|
out dx, al
|
|
IODelay
|
|
dec edx
|
|
|
|
mov al, SMC_DEVICE_PRIMARY_ADDRESS_HIGH
|
|
out dx, al
|
|
IODelay
|
|
inc edx
|
|
mov al, 003h
|
|
out dx, al
|
|
IODelay
|
|
dec edx
|
|
|
|
mov al, SMC_DEVICE_PRIMARY_ADDRESS_LOW
|
|
out dx, al
|
|
IODelay
|
|
inc edx
|
|
mov al, 0F8h
|
|
out dx, al
|
|
IODelay
|
|
dec edx
|
|
|
|
;
|
|
; Take the the super I/O controller out of configuration mode.
|
|
;
|
|
|
|
mov al, SMC_EXIT_CONFIGURATION_MODE
|
|
out dx, al
|
|
|
|
stdRET _DbgInitializeSuperIo
|
|
|
|
stdENDP _DbgInitializeSuperIo
|
|
|
|
_TEXT ends
|
|
|
|
END
|