2025-04-27 07:49:33 -04:00

126 lines
3.6 KiB
NASM

title "ET4000 ASM routines"
;++
;
; Copyright (c) 1992 Microsoft Corporation
;
; Module Name:
;
; vgahard.asm
;
; Abstract:
;
; This module implements the baning code for the et4000.
;
; Environment:
;
; Kernel mode only.
;
; Revision History:
;
;
;--
.386p
.xlist
include callconv.inc
.list
;---------------------------------------
;
; ET4000 banking control port.
;
SEGMENT_SELECT_PORT_LO equ 03cdh ;banking control here
SEGMENT_SELECT_PORT_HI equ 03cbh ;banking control here
SEQ_ADDRESS_PORT equ 03C4h ;Sequencer Address register
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
;
; 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, _BankSwitchEnd, _PlanarHCBankSwitchStart
public _EnablePlanarHCStart, _DisablePlanarHCStart
align 4
_BankSwitchStart proc ;start of bank switch code
_PlanarHCBankSwitchStart: ;start of planar HC bank switch code,
; which is the same code as normal
; bank switching
mov ah, al
mov dh, dl
and al, 0fh
and dl, 0fh
shl al, 4
or al, dl
; in bits 3-0
mov dx,SEGMENT_SELECT_PORT_LO ;banking control port
out dx,al ;select the banks
mov al, ah
mov dl, dh
and al, 30h
and dl, 30h
shr dl, 4
mov dx, SEGMENT_SELECT_PORT_HI
out dx, al
ret
align 4
_EnablePlanarHCStart:
mov dx,SEQ_ADDRESS_PORT
in al,dx
push eax ;preserve the state of the Seq Address
mov al,IND_MEMORY_MODE
out dx,al ;point to the Memory Mode register
inc edx
in al,dx ;get the state of the Memory Mode reg
and al,NOT CHAIN4_MASK ;turn off Chain4 to make memory planar
out dx,al
dec edx
pop eax
out dx,al ;restore the original Seq Address
ret
align 4
_DisablePlanarHCStart:
mov dx,SEQ_ADDRESS_PORT
in al,dx
push eax ;preserve the state of the Seq Address
mov al,IND_MEMORY_MODE
out dx,al ;point to the Memory Mode register
inc edx
in al,dx ;get the state of the Memory Mode reg
or al,CHAIN4_MASK ;turn on Chain4 to make memory linear
out dx,al
dec edx
pop eax
out dx,al ;restore the original Seq Address
ret
;
; Just here to generate end-of-bank-switch code label.
;
_BankSwitchEnd:
_BankSwitchStart endp
_TEXT ends
end