

*********************************
**** Center screen under 2.0 ****
*********************************

PRINT:	macro
	move.l  dos,a6
	move.l  output,d1
	move.l  #\1,d2
	move.l  #\2,d3
	jsr     -48(a6)         ; write
	endm

OPENLIB:macro
	move.l	4,a6
	lea	\1,a1
	jsr	-408(a6)	; open lib
	move.l	d0,\2
	tst.l	d0
	endm

CLOSELIB:macro
	move.l	4,a6
	move.l	\1,a1
	jsr	-414(a6)	; close lib
	endm



	even

center:
	movem.l	d0-a6,-(a7)

	OPENLIB	dos_name,dos
	beq	erreur
	move.l	dos,a6
        jsr     -60(a6)         ; output()
        move.l  d0,output	; sauve handle

	movem.l	(a7)+,d0-a6


	subq	#1,d0		; si aucun parametre
	beq.s	install
search:

	cmp.b	#$20,(a0)+	; on cherche l'argument (apres espace)
	bne.s	found		; trouve
	dbra	d0,search	; d0 contient le nombre de carac.
				; constituant le parametre
found:
	
	subq	#1,a0

	cmp.b	#"?",(a0)	; ? -> aide
	beq	affi_doc	

install:

	OPENLIB	graphic_name,grafx
	beq	erreur

	OPENLIB	intui_name,intui
	beq	erreur

	move.l	intui,a6		; teste pour 'removing'
	move.l	-198+2(a6),a0		; pointe sur OpenScreen
	cmp.b	#"G",2(a0)
	bne.s	no_remove_it
	cmp.b	#"R",3(a0)
	bne.s	no_remove_it
	cmp.b	#"C",4(a0)
	bne.s	no_remove_it
	cmp.b	#"!",5(a0)
	beq	remove_it

no_remove_it:

	move.l	4,a6
	move.l	#patch_long,d0
	move.l	#$10000,d1		; chip ou fast
	jsr	-198(a6)		; allocmem
	tst.l	d0
	beq	erreur
	move.l	d0,mem
	

	move.l	intui,a1		; c'est intuition qu'on patch
	move.l	#-198,a0		; openscreen()
	move.l	mem,d0
	jsr	-420(a6)		; setfunction
	move.l	d0,patch_jmp		; pour le saut a la vrai fonction
	lea	patch_jmp2,a0
	move.l	d0,2(a0)		; pour le saut a la vrai fonction

	lea	patch,a0		; nouvelle routine
	move.l	mem,a1
	move.l	#patch_long,d0
	move.l	4,a6
	jsr	-624(a6)		; copymem

 	PRINT	ok,ok_long
quite:

	tst.l	intui
	beq.s	.jmp1
	CLOSELIB	intui
.jmp1:	tst.l	grafx
	beq.w	.jmp2
	CLOSELIB	grafx
.jmp2:	tst.l	dos
	beq.s	.jmp3
	CLOSELIB	dos
.jmp3:
	moveq	#0,d0

	rts


erreur:
	PRINT	une_erreur,erreur_long
	bra	quite

affi_doc:
	PRINT	doc,doc_long
	bra	quite


remove_it:
	move.l	a0,a5

	move.l	4,a6
	move.l	2+4+4+4(a0),d0		; ancienne fonction
	move.l	intui,a1
	move.l	#-198,a0
	jsr	-420(a6)

	move.l	a5,a0
	move.l	2+4(a0),a1		; memory block
	move.l	2+4+4(a0),d0		; taille du block
	jsr	-210(a6)		; freemem

	PRINT	remove,remove_long
	bra	quite

					; patch de openscreen()
patch:
	bra.s	patch_hop		; et un petit saut
tag:		dc.l	"GRC!"		; tag pour 'removing'
mem:		dc.l	0
lenght:		dc.l	patch_long
patch_jmp:	dc.l	0

patch_hop:

	movem.l	d0-d7/a0-a6,-(a7)

	tst.w	(a0)			; si coord x <> 0
	bne.s	patch_end

	move.l	grafx(pc),a6		; ...(pc) needed 
					; dans a0 screen args
	lea	216(a6),a1
	moveq	#0,d0

	move.w	2(a1),d0		; x maxi

	cmp.w	#724,d0			; overscan maxi en hires
	bhi.s	patch_end		; ecran trop grand pour moui !

	btst	#15,12(a0)		; ecran en lores ?
	bne.s	pas_lores
	divu	#2,d0
pas_lores:

	sub.w	4(a0),d0
	divu	#2,d0
	move.w	d0,(a0)			; centrage de l'écran


patch_end:
	movem.l	(a7)+,d0-d7/a0-a6
patch_jmp2:
	jmp	0

grafx:
	dc.l	0

patch_long=*-patch




**** Données ****

	even

intui:
	dc.l	0
dos:
	dc.l	0
output:
	dc.l	0

graphic_name:
	dc.b	"graphics.library",0
intui_name:
	dc.b	"intuition.library",0
dos_name:
	dc.b	"dos.library",0

ok:
	dc.b	27,"[1mCenter Screen patch v1.1 (c) 21 feb 1992 by GRC",10
	dc.b	27,"[0mCenter Screen patch installed ...",10,0
ok_long=*-ok


une_erreur:
	dc.b	"WARNING:Patch installation aborted !!!",10,0
erreur_long=*-une_erreur

remove:
	dc.b	"Removing Center Screen ...",10
	dc.b	0
remove_long=*-remove


doc:
	dc.b	27,"[1mCenter Screen patch v1.1 (c) 21 feb 1992 by GRC",10
	dc.b	27,"[0m"
	dc.b	10,"This little program patch 'intuition.library' Open"
	dc.b	"Screen() function.",10
	dc.b	"This patch allows to center any 'small' screens when you ",10
	dc.b	"have a big workbench (like under 2.0)",10,10
	dc.b	"Usage under cli only :",10
	dc.b	"1> Center <ret>     first time for installation",10
	dc.b	"1> Center <ret>     second time for removing",10,10
	dc.b	0
doc_long=*-doc



