title  "Wd Hard.asm"
;++
;
; Copyright (c) 1992  Microsoft Corporation
; Copyright (c) 1993  Western Digital Corporation
;
; Module Name:
;
;     vgahard.asm
;
; Abstract:
;
;     This module implements the baning code for the WD90Cxx.
;
; Environment:
;
;    Kernel mode only.
;
; Author:
;
;    Chung-I Chiang, Harold Huang     	Western Digital Corporation
;
; Revision History:
;
;
;--

.386p
        .xlist
include callconv.inc                    ; calling convention macros
        .list

;---------------------------------------
;
; Western Digital banking control port.
;

SEGMENT_SELECT_PORT equ     03ceh      ;banking control here
SEQ_ADDRESS_PORT equ        03C4h      ;Sequencer Address register
WD_PR0A          equ        09h
WD_PR0B          equ        0Ah
IND_MEMORY_MODE  equ        04h        ;Memory Mode register index in Sequencer
CHAIN4_MASK      equ        08h        ;Chain4 bit in Memory Mode register


_TEXT   SEGMENT DWORD PUBLIC 'CODE'
        ASSUME  DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING

        page ,132
        subttl  "Bank Switching Stub"

;
;    Bank switching code. This is a 1-64K-read/1-64K-write bank adapter
;    (VideoBanked1R1W).
;
;    Input:
;          EAX = desired read bank mapping
;          EDX = desired write bank mapping
;
;    Note: values must be correct, with no stray bits set; no error
;       checking is performed.
;
	public _BankSwitchStart
	public _BankSwitchEnd

        align 4

_BankSwitchStart proc ;start of bank switch code

	push	ebx			
	push	eax
	push	edx
	mov	dx,SEGMENT_SELECT_PORT
	in	al,dx
	mov	ebx,eax		;must save 3CE current index
	pop	edx
	pop	eax

	push	edx
	shl	eax,12			;read bank in PRO0A
	mov	al,WD_PR0A
	mov	dx,SEGMENT_SELECT_PORT
	out	dx,ax
	pop	edx

	mov	eax,edx
	shl	eax,12			;write bank in PRO0B
	mov	al,WD_PR0B
	mov	dx,SEGMENT_SELECT_PORT
	out	dx,ax

	mov	eax,ebx			;restore 3CE index
	mov	dx,SEGMENT_SELECT_PORT
	out	dx,al
	pop	ebx

        ret           ; This should be a fatal error ...

_BankSwitchEnd:

_BankSwitchStart endp

_TEXT   ends
        end