delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1994/02/10/01:27:23

Date: Thu, 10 Feb 1994 00:18:18 -0500
From: davis AT amy DOT tch DOT harvard DOT edu ("John E. Davis")
To: babcock AT cfa DOT harvard DOT edu, davis AT amy DOT tch DOT harvard DOT edu,
djgpp AT sun DOT soe DOT clarkson DOT edu
Subject: Re: ATI Wonder Card

>The ATI VGA Wonder used the 18800 chipset.  But, based on my experience,
>there are different ATI cards, possibly using the same chipset, which require
>different code for bank switching.  The symptom of using the wrong bank
>switching code is that, as the screen is being updated, you'll get a horrible
>out-of-sync glitch in screen modes larger than about 640x480(x16 color?).
>It's often bad enough to shut down my multi-sync monitor.  I've just received
>the 32-bit version of GLE (a graphics package) which uses djgpp, so I may
>soon face the same problem.  If so, I'll try to create a fixed driver file.
>But there are more important things on the queue first.  If you'd like, I can
>send you an example of working bank-switching code from QPEG (a JPG display
>program).
>

Hi,

    Thank you very much.  I just received the following assembly language
routine from jmiller AT umdsun2 DOT umd DOT umich DOT edu.  Unfortunately, I do not really
know quite what to do with it.  Do I simply assemble it and rename it to
something like `wonder.gfx'?

--John
; This is file ATIVGA.ASM
;
; Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
;
; This file is distributed under the terms listed in the document
; "copying.dj", available from DJ Delorie at the address above.
; A copy of "copying.dj" should accompany this file; if not, a copy
; should be available from where this file was obtained.  This file
; may not be distributed without a verbatim copy of "copying.dj".
;
; This file is distributed WITHOUT ANY WARRANTY; without even the implied
; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
;
;
; Modify for the ATI VGA WONDER
; by Luc Bussieres, bussiere AT dmi DOT usherb DOT ca
; University of Sherbrooke
; March 9th, 1991
;
; Version revised by Patrick Daloze, daloze AT iro DOT umontreal DOT ca
; University of Montreal
; Juilly, 4th, 1991
;
; Version revised by Gershon Elber, gershon AT gr DOT utah DOT edu to support ATI Wonder
; ver. 1 (dated 1989/10/5 on my card) without seperated read/write capability.
; February 15th, 1992
;

cseg	segment	byte public 'code'
	assume	cs:cseg, ds:cseg, es:cseg, ss:nothing

	dw	offset init_routine
	dw	offset paging_routine
	dw 	0   	; set to 1 if separate read & write windows or
			; only 64K of video RAM (ie: no paging)

def_tw	dw	80	; filled in by go32 if GO32 env. var. is set
def_th 	dw	25
def_gw	dw 	640
def_gh 	dw 	480
IO_Add  dw      0

;--------------------------------------------------------------------------
; Entry: AX=mode selection
;		0=80x25 text
;		1=default text
;		2=text CX cols by DX rows
;		3=biggest text
;		4=320x200 graphics
;		5=default graphics
;		6=graphics CX width by DX height
;		7=biggest non-interlaced graphics
;		8=biggest graphics
;
; NOTE: This runs in real mode, but don't mess with the segment registers.
;       For mode 5 to 8 (640x480 or over): only for ATI Version 2 or more
;       (separate read and write planing).
;
; Exit:  CX=width (in pixels or characters)
;        DX=height

init_table	label	word
	dw	offset init_0
	dw	offset init_1
	dw	offset init_2
	dw	offset init_3
	dw	offset init_4
	dw	offset init_5
	dw	offset init_6
	dw	offset init_7
	dw	offset init_8

init_routine	proc	far
	cmp	ax,8
	jbe	valid_req
	ret
valid_req:
	shl	ax,1
	mov	bx,ax
	jmp	init_table[bx]

init_0: ; 80x25 text
	mov	ax,3
	int	10h
	mov	cx,80
	mov	dx,25
	ret

init_1: ; default text
	mov	cx,def_tw
	mov	dx,def_th
	jmp	init_2

init_2_table	label	word
	dw	01h, 40, 25
	dw	03h, 80, 25
	dw      23h, 132, 25
	dw      33h, 132, 44
init_2_tend	label	word

init_2: ; CX*DX text
	mov	si,offset init_2_table
init_2a:
	cmp	[si+2],cx
	jb	init_2b
	cmp	[si+4],dx
	jb	init_2b
	; got a big enough one!
	jmp	init_2c
init_2b:
	cmp	si,offset init_2_tend - 6
	je	init_2c
	add	si,6
	jmp	init_2a
init_2c:
	mov	ax,[si]
	push	si
	int	10h
	pop	si
	mov	cx,[si+2]
	mov	dx,[si+4]
	ret

init_3: ; biggest text
	mov	ax,[init_2_tend-6]
	int	10h
	mov	cx,[init_2_tend-4]
	mov	dx,[init_2_tend-2]
	ret

init_4: ; 320x200 graphics
	mov	ax,13h
	int	10h
	mov	cx,320
	mov	dx,200
	ret

init_5: ; default graphics - should be 640x480 if supported
	mov	cx,def_gw
	mov	dx,def_gh
	jmp	init_6

init_6_table	label	word
	dw	13h, 320, 200
	dw 	61h, 640, 400
	dw 	62h, 640, 480
	dw 	63h, 800, 600
init_6_tend	label	word

init_6: ; CX*DX graphics
	mov	si,offset init_6_table
init_6a:
	cmp	[si+2],cx
	jb	init_6b
	cmp	[si+4],dx
	jb	init_6b
	; got a big enough one!
	jmp	init_6c
init_6b:
	cmp	si,offset init_6_tend - 6
	je	init_6c
	add	si,6
	jmp	init_6a
init_6c:
	mov	ax,[si]
	push	si
	int	10h
	pop	si
	mov	cx,[si+2]
	mov	dx,[si+4]

	ret

init_7: ; biggest non-interlaced graphics
	mov     ax,63h
	int	10h
	mov     cx,800
	mov     dx,600

	ret

init_8: ; biggest graphics
	mov     ax,63h
	int	10h
	mov     cx,800
	mov     dx,600

	ret

init_routine	endp

;--------------------------------------------------------------------------
; Entry: AH=read page
;        AL=write page
;
; NOTE: This runs in protected mode!  Don't mess with the segment registers!
; This code must be relocatable and may not reference any data!
;
; Exit: VGA configured.
;       AX,BX,CX,DX,SI,DI may be trashed
;
; Source: Advanced Programmer's Guide To SuperVGAs
;

	assume	ds:nothing, es:nothing

paging_routine	proc	FAR

	or      ah,al           ; Combine Read and Write plane
	and     ah,07h          ; /
	mov	ch,ah

	mov	dx, 01ceh
	mov	al, 0b2h
	out	dx, al
	inc	dl
	in	al, dx
	mov	ah, al
	and	ah, 0e1h
	shl	ch, 1				;Twice the bank number
	or	ah, ch
	mov	al, 0b2h
	dec	dl
	out	dx, ax
	
	ret
paging_routine	endp

cseg	ends
	end


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019