************************************************************************
*
* This program patches into the xbios setmode() & setscreen() functions.
* Alters the video parameters set by the call so that it works with
* the PTC1426 TT monitor (with switch in VGA mode).
*
************************************************************************

	include	d:\devpac\powerdos\dos_defs.s

	include	d:\devpac\powerdos\dosmacro.s

VWRAP	equ	$FF8210
SPSHIFT	equ	$FF8266
HHT	equ	$FF8282
HBB	equ	$FF8284
HBE	equ	$FF8286
HDB	equ	$FF8288
HDE	equ	$FF828A
HSS	equ	$FF828C
HFS	equ	$FF828E
HEE	equ	$FF8290
VFT	equ	$FF82A2
VBB	equ	$FF82A4
VBE	equ	$FF82A6
VDB	equ	$FF82A8
VDE	equ	$FF82AA
VSS	equ	$FF82AC
VCO	equ	$FF82C0

start	os_fvector	our_setmode(pc),#$58,#14 Change Setmode vector to go to us
	lea	old_setmode+2(pc),a0
	move.l	d0,(a0)		Jump to original vector

	os_fvector	our_setscrn(pc),#5,#14	Change Setscreen vector to go to us
	lea	old_setscrn+2(pc),a0
	move.l	d0,(a0)		Jump to original vector
	p_termres	#0,#end_of_it-start+256

our_setscrn cmp.w	#%110010010,$e(sp)	Going to ST Low Rez?
	beq.s	.do_st_low
	cmp.w	#%000011010,$e(sp)	Going to 640x480x16?
	beq.s	.do_640x16
	cmp.w	#%000011011,$e(sp)	Going to 640x480x256?
	beq.s	.do_640x256

	bne.s	old_setscrn

.do_640x256 lea	4(sp),a0
	move.w	10(a0),-(sp)
	move.w	8(a0),-(sp)
	move.l	4(a0),-(sp)
	move.l	(a0),-(sp)
	pea	scrn_640x256(pc)
	bra.s	old_setscrn

.do_640x16	lea	4(sp),a0
	move.w	10(a0),-(sp)
	move.w	8(a0),-(sp)
	move.l	4(a0),-(sp)
	move.l	(a0),-(sp)
	pea	scrn_640x16(pc)
	bra.s	old_setscrn

.do_st_low	lea	4(sp),a0
	move.w	10(a0),-(sp)
	move.w	8(a0),-(sp)
	move.l	4(a0),-(sp)
	move.l	(a0),-(sp)
	pea	scrn_st_low(pc)	To do ST Low Rez
	bra.s	old_setscrn

old_setscrn	jmp	$DEADC0DE		Jump to original routine

scrn_640x256 bsr	_640x256
	lea	12(sp),sp
	rts

scrn_640x16	bsr	_640x16
	lea	12(sp),sp
	rts

scrn_st_low	bsr	st_low
	lea	12(sp),sp
	rts

our_setmode	cmp.w	#%110010010,4(sp)	Going to ST Low Rez?
	beq.s	set_st_low
	cmp.w	#%000011010,4(sp)	Going to 640x480x16?
	beq.s	set_640x16
	cmp.w	#%000011011,4(sp)	Going to 640x480x256?
	beq.s	set_640x256

	bne.s	old_setmode

set_640x256	move.w	4(sp),-(sp)
	pea	mode_640x256(pc)	To do 640x480x256
	bra.s	old_setmode

set_640x16	move.w	4(sp),-(sp)		Push parameter
	pea	mode_640x16(pc)	To do 640x480x16
	bra.s	old_setmode

set_st_low	move.w	4(sp),-(sp)
	pea	mode_st_low(pc)	To do ST Low Rez
	bra.s	old_setmode

old_setmode	jmp	$DEADC0DE		Jump to original routine

mode_640x256 bsr.s	_640x256
	addq.l	#2,sp
	rts

mode_640x16	bsr.s	_640x16
	addq.l	#2,sp
	rts

mode_st_low	bsr.s	st_low
	addq.l	#2,sp
	rts

_640x256	move.w	#$7C,HBB
	move.w	#$4,HBE
	move.w	#$29a,HDB
	move.w	#$73,HDE
	rts

_640x16	move.w	#$7c,HBB
	move.w	#$4,HBE
	move.w	#$292,HDB
	move.w	#$6b,HDE
	move.w	#$97,HSS
	rts

st_low	move.w	#$10,HBB
	move.w	#$0,HBE
	move.w	#$20c,HDB
	move.w	#$b,HDE
	move.w	#$12,HSS
	rts

end_of_it	nop

	end
