2020-09-30 17:17:25 +02:00

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