xref: /netbsd-src/sys/arch/amiga/dev/grf_ultms.g (revision c4a186ea1c2d2a74bf741938575574f356116d66)
1*c4a186eaSis; $NetBSD: grf_ultms.g,v 1.10 2009/11/09 15:35:27 is Exp $
24bf7b86bSchopps;
34bf7b86bSchopps; ite support for A2410.
44bf7b86bSchopps
54bf7b86bSchopps;
64bf7b86bSchopps; Copyright (c) 1995 Ignatios Souvatzis.
74bf7b86bSchopps; All rights reserved.
84bf7b86bSchopps;
94bf7b86bSchopps; Redistribution and use in source and binary forms, with or without
104bf7b86bSchopps; modification, are permitted provided that the following conditions
114bf7b86bSchopps; are met:
124bf7b86bSchopps; 1. Redistributions of source code must retain the above copyright
134bf7b86bSchopps;    notice, this list of conditions and the following disclaimer.
144bf7b86bSchopps; 2. Redistributions in binary form must reproduce the above copyright
154bf7b86bSchopps;    notice, this list of conditions and the following disclaimer in the
164bf7b86bSchopps;    documentation and/or other materials provided with the distribution.
174bf7b86bSchopps;
184bf7b86bSchopps; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
194bf7b86bSchopps; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
204bf7b86bSchopps; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
214bf7b86bSchopps; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
224bf7b86bSchopps; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
234bf7b86bSchopps; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
244bf7b86bSchopps; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
254bf7b86bSchopps; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
264bf7b86bSchopps; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
274bf7b86bSchopps; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
284bf7b86bSchopps
2902963a4aSis; This file contains the source code for grf_ultms.c. It is assembler
3002963a4aSis; code for the TMS34010 CPU/graphics processor, as understood by the
3102963a4aSis; in-tree version of Paul Mackerras' "gspa" assembler.
324bf7b86bSchopps;
33a14bf4eeSjdolecek; Use 'make grf_ultms.c' to generate the .c file.
344bf7b86bSchopps
354bf7b86bSchopps; memory map:
364bf7b86bSchopps; FF800000 .. FF9FFFFF	overlay planes
374bf7b86bSchopps; FFA00000 .. FFA0FFFF	ite support code
384bf7b86bSchopps; FFA10000 .. FFA1FFFF	ite support, input queue
394bf7b86bSchopps; FFA20000 .. FFA2FEFF	variables
404bf7b86bSchopps; FFA2FF00 .. FFA2FFFF	variables, X server
414bf7b86bSchopps; FFA30000 .. FFA3FFFF	font data
424bf7b86bSchopps; FFA40000 .. FFA4FFFF	font data, bold
434bf7b86bSchopps; FFA50000 .. FFA5FFFF	X server, input queue
444bf7b86bSchopps; FFA60000 .. FFFFC000	X server, onboard pixmaps
454bf7b86bSchopps
464bf7b86bSchopps; Start of data area
474bf7b86bSchopps	.org	$FFA20000
484bf7b86bSchoppsd:
494bf7b86bSchopps
504bf7b86bSchopps;
514bf7b86bSchopps; Ring buffer for getting stuff from host
524bf7b86bSchopps; Data buffer:
534bf7b86bSchoppsinbuf	=	$FFA10000	; 64kbits here (8k bytes)
544bf7b86bSchopps;
554bf7b86bSchopps; Pointers: (these must be at address $FFA20000)
564bf7b86bSchoppsput:		.long	inbuf
574bf7b86bSchoppsget:		.long	inbuf
584bf7b86bSchopps
594bf7b86bSchopps;
604bf7b86bSchopps; Mode bits for communication between GSP and CPU
614bf7b86bSchopps;
624bf7b86bSchopps; GSP mode bits: set by CPU, control GSP operation
634bf7b86bSchoppsGSP_HOLD =	0
644bf7b86bSchoppsGSP_FLUSH =	1
654bf7b86bSchoppsGSP_ALT_SCRN =	2
664bf7b86bSchoppsGSP_DISP_CTRL =	3
674bf7b86bSchoppsGSP_NO_CURSOR =	4
684bf7b86bSchoppsGSP_CALL_X =	5
694bf7b86bSchoppsgsp_mode:	.word	0
704bf7b86bSchopps
714bf7b86bSchopps;
724bf7b86bSchopps; Pointer to X operation routine
734bf7b86bSchoppsxproc:		.long	0
744bf7b86bSchopps
754bf7b86bSchopps; We leave the next few words for future communication requirements
764bf7b86bSchopps
774bf7b86bSchopps		.org	d+0x100
784bf7b86bSchopps;
794bf7b86bSchopps; Other data:
804bf7b86bSchoppsmagic:		.blkl	1		; set => screen already inited
814bf7b86bSchoppsMAGIC =		0xD0D0BEAC
824bf7b86bSchopps
834bf7b86bSchoppsscreen_width:	.word	1024
844bf7b86bSchoppsscreen_height:	.word	768
854bf7b86bSchoppsscreen_origin:	.long	$FE000000	; just a placeholder
864bf7b86bSchoppsscreen_pitch:	.word	8192		; 1024*8
874bf7b86bSchoppspixel_size:	.word	8
884bf7b86bSchopps
894bf7b86bSchopps		.org	d+0x200
904bf7b86bSchoppsfont_adr:
914bf7b86bSchopps;
924bf7b86bSchopps; Font information is stored in the structure defined declared below.
934bf7b86bSchopps;
944bf7b86bSchoppsbitmap_ptrs:	.long	$FFA30000	; points to first bitmap
954bf7b86bSchoppsfont_size:	.long	$00080008	; Y:X bitmap size
964bf7b86bSchoppsunder_row:	.word	6		; row # for underlines
974bf7b86bSchoppsunder_ht:	.word	1		; thickness of underline
984bf7b86bSchoppsfirst_char:	.word	32		; first and last char in font
994bf7b86bSchoppslast_char:	.word	255		;
1004bf7b86bSchoppsbold_smear:	.word	1		; for making bold fonts
1014bf7b86bSchopps
1024bf7b86bSchoppsbgcolor:	.long	0		; background color
1034bf7b86bSchoppsfgcolor:	.long	$01010101	; foreground color
1044bf7b86bSchopps;precomputed out of what the host gave us:
1054bf7b86bSchoppsfont_area:	.word	64		; in pixels
1064bf7b86bSchoppsfont_pitch:	.word	8
1074bf7b86bSchoppsfont_lmo:	.word	28
1084bf7b86bSchopps
1094bf7b86bSchopps
1104bf7b86bSchopps; Control register addresses
1114bf7b86bSchoppshesync	=	$c0000000
1124bf7b86bSchoppsdpyctl	=	$c0000080
1134bf7b86bSchoppscontrol	=	$c00000b0
1144bf7b86bSchoppsconvsp	=	$c0000130
1154bf7b86bSchoppsconvdp	=	$c0000140
1164bf7b86bSchoppspsize	=	$c0000150
1174bf7b86bSchopps
1184bf7b86bSchopps;
1194bf7b86bSchopps; Bits in control register
1204bf7b86bSchoppsT	=	$20		; enable transparency
1214bf7b86bSchoppsW	=	$C0		; window options
1224bf7b86bSchoppsPBH	=	$100		; pixblt horiz dirn
1234bf7b86bSchoppsPBV	=	$200		; pixblt vertical dirn
1244bf7b86bSchoppsPPOP	=	$7C00		; pixel processing options
1254bf7b86bSchopps
1264bf7b86bSchopps;
1274bf7b86bSchopps; Bits in dpyctl register
1284bf7b86bSchoppsSRT	=	$800		; do serial register transfers
1294bf7b86bSchopps
1304bf7b86bSchoppsfree_memory:	.long	free_memory_start
1314bf7b86bSchoppsfree_memory_start:		; allocate dynamic arrays from here
1324bf7b86bSchopps
1334bf7b86bSchopps;
1344bf7b86bSchopps; Program starts here.
1354bf7b86bSchopps	.org	$FFA00000
1364bf7b86bSchopps	.start	.
1374bf7b86bSchopps
1384bf7b86bSchopps;
1394bf7b86bSchopps; initialization
1404bf7b86bSchopps;
1414bf7b86bSchopps	setf	16,0,0		; just in case
1424bf7b86bSchopps	setf	32,0,1
1434bf7b86bSchopps	move	$fffff000,sp
1444bf7b86bSchopps
1454bf7b86bSchopps; Set up sync, blank parameters
1464bf7b86bSchopps; done by host through interface
1474bf7b86bSchopps
1484bf7b86bSchopps; set up overlay clut:
1494bf7b86bSchopps	move	$0,a0
1504bf7b86bSchopps	move	a0,@$fe800000
1514bf7b86bSchopps	move	$fe800030,a1
1524bf7b86bSchopps	move	128,a0
1534bf7b86bSchopps	move	a0,*a1
1544bf7b86bSchopps	move	a0,*a1
1554bf7b86bSchopps	move	a0,*a1
1564bf7b86bSchopps	move	0,a0
1574bf7b86bSchopps	move	a0,*a1
1584bf7b86bSchopps	move	a0,*a1
1594bf7b86bSchopps	move	a0,*a1
1604bf7b86bSchopps	move	a0,*a1
1614bf7b86bSchopps	move	a0,*a1
1624bf7b86bSchopps	move	a0,*a1
1634bf7b86bSchopps	move	a0,*a1
1644bf7b86bSchopps	move	a0,*a1
1654bf7b86bSchopps	move	a0,*a1
1664bf7b86bSchopps
1674bf7b86bSchopps; set up overlay planes:
1684bf7b86bSchopps	move	6,a0
1694bf7b86bSchopps	move	a0,@$fe800000
1704bf7b86bSchopps	move	$0b,a0
1714bf7b86bSchopps	move	a0,@$fe800020
1724bf7b86bSchopps
1734bf7b86bSchopps; set up global registers
1744bf7b86bSchopps	move	@screen_pitch,b3,0
1754bf7b86bSchopps	move	@screen_origin,b4,1
1764bf7b86bSchopps	move	@bgcolor,b8,1
1774bf7b86bSchopps	lmo	b3,b0
1784bf7b86bSchopps	move	b0,@convdp,0
1794bf7b86bSchopps	move	@control,a0,0
1804bf7b86bSchopps	andn	$7FE0,a0		; clear PPOP, PBV, PBH, W, T fields
1814bf7b86bSchopps	move	a0,@control,0
1824bf7b86bSchopps	move	@pixel_size,a0,0
1834bf7b86bSchopps	move	a0,@psize,0
1844bf7b86bSchopps	move	@psize,a0,0
1854bf7b86bSchopps
1864bf7b86bSchopps
1874bf7b86bSchopps; clear the entire screen
1884bf7b86bSchopps	move	b4,b2
1894bf7b86bSchopps	move	0,b9
1904bf7b86bSchopps	move	@screen_width,b7,1
1914bf7b86bSchopps	fill	l
1924bf7b86bSchopps
1934bf7b86bSchopps4:
1944bf7b86bSchopps; main stuff...
1954bf7b86bSchopps	move	@get,a0,1
1964bf7b86bSchopps	jruc	main_loop
1974bf7b86bSchoppsloop_end:
1984bf7b86bSchopps	clr	a4
1994bf7b86bSchopps	move	a4,*a0,0
2004bf7b86bSchopps	addxy	a1,a0
2014bf7b86bSchopps	move	a0,@get,1
2024bf7b86bSchoppsmain_loop:
2034bf7b86bSchopps	move	@gsp_mode,a1,0
2044bf7b86bSchopps	btst	GSP_CALL_X,a1
2054bf7b86bSchopps	jreq	main_loop_1
2064bf7b86bSchopps
2074bf7b86bSchopps	mmtm	sp,a0,a1,a2,a3
2084bf7b86bSchopps	move	@xproc,a4,1
2094bf7b86bSchopps	call	a4
2104bf7b86bSchopps	mmfm	sp,a0,a1,a2,a3
2114bf7b86bSchopps
2124bf7b86bSchoppsmain_loop_1:
2134bf7b86bSchopps	move	@put,a3,1
2144bf7b86bSchopps	move	*a0,a1,0
2154bf7b86bSchopps
2164bf7b86bSchopps	move	a1,a2
2174bf7b86bSchopps	andi	$FFF0,a1
2184bf7b86bSchopps	jrz	main_loop
2194bf7b86bSchopps
2204bf7b86bSchopps	sub	a0,a3
2214bf7b86bSchopps	jreq	main_loop
2224bf7b86bSchoppscontinue:
2234bf7b86bSchopps	andi	$F,a2
2244bf7b86bSchopps	jrz	loop_end
2254bf7b86bSchopps	dec	a2
2264bf7b86bSchopps	jrnz	testfor2
2274bf7b86bSchopps; op 1 - char
2284bf7b86bSchopps	movk	6,b10
2294bf7b86bSchopps	move	b10,@$fe800000,0
2304bf7b86bSchopps	movk	1,b10
2314bf7b86bSchopps	move	b10,@$fe800020,0
2324bf7b86bSchopps
2334bf7b86bSchopps	move	a0,b10
2344bf7b86bSchopps	move	*b10+,b12,0	; dummy move (faster than addk)
2354bf7b86bSchopps	move	*b10+,b12,0	; char code
2364bf7b86bSchopps	move	@first_char,b11,0
2374bf7b86bSchopps	sub	b11,b12		; minus first char in font
2384bf7b86bSchopps	move	@font_size,b7,1	;dydx - char size->pixel array dimensions
2394bf7b86bSchopps	move	@font_pitch,b1
2404bf7b86bSchopps	move	@font_lmo,b0
2414bf7b86bSchopps	move	b0,@convsp,0
2424bf7b86bSchopps	move	@font_area,b11
2434bf7b86bSchopps
2444bf7b86bSchopps	mpyu	b12,b11		; times char offset
2454bf7b86bSchopps	move	@font_adr,b0,1	; font bitmaps base
2464bf7b86bSchopps	add	b11,b0		; character bitmap start addr. linear
2474bf7b86bSchopps
2484bf7b86bSchopps	move	*b10+,b8,0	; fg
2494bf7b86bSchopps	move	*b10+,b9,0	; bg
2504bf7b86bSchopps	move	*b10+,b2,1	; y:x
2514bf7b86bSchopps
2524bf7b86bSchopps	move	*b10+,b11,0	; flags
2534bf7b86bSchopps	move	b11,a4
2544bf7b86bSchopps	btst	0,a4
2554bf7b86bSchopps	jreq	noinv
2564bf7b86bSchopps	move	b8,b11
2574bf7b86bSchopps	move	b9,b8
2584bf7b86bSchopps	move	b11,b9
2594bf7b86bSchoppsnoinv:
2604bf7b86bSchopps	btst	2,a4
2614bf7b86bSchopps	jreq	nobold
2624bf7b86bSchopps	addi	$10000,b0
2634bf7b86bSchoppsnobold:
2644bf7b86bSchopps	move	b2,a5
2654bf7b86bSchopps	pixblt	b,xy
2664bf7b86bSchopps	move	a5,b2
2674bf7b86bSchopps
2684bf7b86bSchopps	btst	1,a4
2694bf7b86bSchopps	jreq	noul
2704bf7b86bSchopps	move	@under_row,b11,0
2714bf7b86bSchopps	sll	16,b11		; shift into Y half
2724bf7b86bSchopps	add	b11,b2
2734bf7b86bSchopps	move	@under_ht,b11,0
2744bf7b86bSchopps	sll	16,b11		; shift into Y half
2754bf7b86bSchopps	movy	b11,b7		; and move Y half only
2764bf7b86bSchopps	fill	xy
2774bf7b86bSchoppsnoul:
2784bf7b86bSchopps	jruc	loop_end
2794bf7b86bSchoppstestfor2:
2804bf7b86bSchopps	dec	a2
2814bf7b86bSchopps	jrnz	testfor3
2824bf7b86bSchopps; op 2 - fill
2834bf7b86bSchopps	move	a0,b10
2844bf7b86bSchopps	move	*b10+,b9,0	; dummy move
2854bf7b86bSchopps	move	*b10+,b9,0	; color
2864bf7b86bSchopps	move	*b10+,b2,1	; XY start address
2874bf7b86bSchopps	move	*b10+,b7,1	; dydx
2884bf7b86bSchopps
2894bf7b86bSchopps	move	@control,b0,0
2904bf7b86bSchopps	move	b0,*-sp
2914bf7b86bSchopps	move	*b10+,b0
2924bf7b86bSchopps	setf	5,0,0
2934bf7b86bSchopps	move	b0,@control+10
2944bf7b86bSchopps	setf	16,0,0
2954bf7b86bSchopps	move	@control,b0,0
2964bf7b86bSchopps
2974bf7b86bSchopps	fill	xy
2984bf7b86bSchopps
2994bf7b86bSchopps	move	*sp+,b0
3004bf7b86bSchopps	move	b0,@control,0
3014bf7b86bSchopps	jruc	loop_end,l
3024bf7b86bSchopps
3034bf7b86bSchoppstestfor3:
3044bf7b86bSchopps	dec	a2
3054bf7b86bSchopps	jrnz	testfor4
3064bf7b86bSchopps; op 3 - pixblt
3074bf7b86bSchopps	move	a0,b10
3084bf7b86bSchopps	move	@convdp,@convsp,0
3094bf7b86bSchopps	move	*b10+,b0,0	; dummy move
3104bf7b86bSchopps	move	*b10+,b0,1	; XY src
3114bf7b86bSchopps	move	*b10+,b7,1	; dxdy
3124bf7b86bSchopps	move	*b10+,b2,1	; XY dst
3134bf7b86bSchopps	move	b3,b1
3144bf7b86bSchopps	move	@control,b11,0
3154bf7b86bSchopps	andni	PBH|PBV,b11
3164bf7b86bSchopps	cmpxy	b0,b2
3174bf7b86bSchopps	jrc	yok
3184bf7b86bSchopps	ori	PBV,b11
3194bf7b86bSchoppsyok:	jrv	xok
3204bf7b86bSchopps	ori	PBH,b11
3214bf7b86bSchoppsxok:	move	b11,@control,0
3224bf7b86bSchopps	move	@control,b11,0
3234bf7b86bSchopps
3244bf7b86bSchopps	pixblt	xy,xy
3254bf7b86bSchopps	jruc	loop_end,l
3264bf7b86bSchopps
3274bf7b86bSchoppstestfor4:
3284bf7b86bSchopps	dec	a2
3294bf7b86bSchopps	jrnz	testfor5
3304bf7b86bSchopps
3314bf7b86bSchopps; op 4 - mirror the font and precompute some values.
3324bf7b86bSchopps
3334bf7b86bSchopps	move	@font_size,a5,0
3344bf7b86bSchopps	movk	8,a6
3354bf7b86bSchopps	cmp	a6,a5
3364bf7b86bSchopps	jrle	t4b8
3374bf7b86bSchopps	movi	16, a6
3384bf7b86bSchoppst4b8:	move	a6,@font_pitch,0
3394bf7b86bSchopps	lmo	a5,a6
3404bf7b86bSchopps	move	a6,@font_lmo,0
3414bf7b86bSchopps	move	@font_size+$10,a6,0
3424bf7b86bSchopps	move	@font_pitch,a5,0
3434bf7b86bSchopps	mpyu	a6,a5
3444bf7b86bSchopps	move	a5,@font_area,0
3454bf7b86bSchopps
3464bf7b86bSchopps	move	@last_char,a6,0
3474bf7b86bSchopps	move	@first_char,a5,0
3484bf7b86bSchopps	sub	a5,a6
3494bf7b86bSchopps	addk	1,a6
3504bf7b86bSchopps	move	@font_size+$10,a5,0
3514bf7b86bSchopps	mpyu	a6,a5
3524bf7b86bSchopps	move	@font_size,a7,0
3534bf7b86bSchopps	cmpi	8,a7
3544bf7b86bSchopps	move	$7f7f,a12	; mask for bold smearing
3554bf7b86bSchopps	jrgt	t4bf		; wider than 8 pixels?
3564bf7b86bSchopps	addk	1,a5		; yes, the words are only half the # of rows
3574bf7b86bSchopps	srl	1,a5
3584bf7b86bSchopps	move	$7fff,a12	; mask for bold smearing changes, too
3594bf7b86bSchoppst4bf:	move	@font_adr,a6,1
3604bf7b86bSchopps	move	a6,a9
3614bf7b86bSchopps	addi	$10000,a9 ; start address of bold font
3624bf7b86bSchopps	move	@bold_smear,a10
3634bf7b86bSchopps
3644bf7b86bSchopps; fortunately, this loop fits into 3 of the 4 cache segments:
3654bf7b86bSchopps; execution time: about 32 periods per word of font.
3664bf7b86bSchopps
3674bf7b86bSchoppsmirlp:	move	*a6,a7
3684bf7b86bSchopps	clr	a8
3694bf7b86bSchopps
3704bf7b86bSchopps	srl	1,a7
3714bf7b86bSchopps	addc	a8,a8
3724bf7b86bSchopps	srl	1,a7
3734bf7b86bSchopps	addc	a8,a8
3744bf7b86bSchopps	srl	1,a7
3754bf7b86bSchopps	addc	a8,a8
3764bf7b86bSchopps	srl	1,a7
3774bf7b86bSchopps	addc	a8,a8
3784bf7b86bSchopps
3794bf7b86bSchopps	srl	1,a7
3804bf7b86bSchopps	addc	a8,a8
3814bf7b86bSchopps	srl	1,a7
3824bf7b86bSchopps	addc	a8,a8
3834bf7b86bSchopps	srl	1,a7
3844bf7b86bSchopps	addc	a8,a8
3854bf7b86bSchopps	srl	1,a7
3864bf7b86bSchopps	addc	a8,a8
3874bf7b86bSchopps
3884bf7b86bSchopps	srl	1,a7
3894bf7b86bSchopps	addc	a8,a8
3904bf7b86bSchopps	srl	1,a7
3914bf7b86bSchopps	addc	a8,a8
3924bf7b86bSchopps	srl	1,a7
3934bf7b86bSchopps	addc	a8,a8
3944bf7b86bSchopps	srl	1,a7
3954bf7b86bSchopps	addc	a8,a8
3964bf7b86bSchopps
3974bf7b86bSchopps	srl	1,a7
3984bf7b86bSchopps	addc	a8,a8
3994bf7b86bSchopps	srl	1,a7
4004bf7b86bSchopps	addc	a8,a8
4014bf7b86bSchopps	srl	1,a7
4024bf7b86bSchopps	addc	a8,a8
4034bf7b86bSchopps	srl	1,a7
4044bf7b86bSchopps	addc	a8,a8
4054bf7b86bSchopps
4064bf7b86bSchopps	move	a8,*a6+
4074bf7b86bSchopps	move	a8,a7
4084bf7b86bSchopps	move	a10,a11
4094bf7b86bSchoppssmearlp:
4104bf7b86bSchopps	and	a12,a7
4114bf7b86bSchopps	sll	1,a7
4124bf7b86bSchopps	or	a7,a8
4134bf7b86bSchopps	dsj	a11,smearlp
4144bf7b86bSchopps	move	a8,*a9+
4154bf7b86bSchopps
4164bf7b86bSchopps	dsj	a5,mirlp
4174bf7b86bSchopps;; support odd-sized fonts. pitch must still be 8 or 16
4184bf7b86bSchopps	move	@font_size,a5,0
4194bf7b86bSchopps	move	@font_pitch,a6,0
4204bf7b86bSchopps	sub	a5,a6
4214bf7b86bSchopps	move	@font_adr,a5,1
4224bf7b86bSchopps	add	a5,a6
4234bf7b86bSchopps	move	a6,@font_adr,1
4244bf7b86bSchopps;;
4254bf7b86bSchopps	jruc	loop_end,l
4264bf7b86bSchopps
4274bf7b86bSchopps
4284bf7b86bSchoppstestfor5:
4294bf7b86bSchopps	dec	a2
4304bf7b86bSchopps	jrne	testfor6
4314bf7b86bSchopps; loadclut --- load clut entry.
4324bf7b86bSchopps;	1==overlay index red green blue
4334bf7b86bSchopps;	for speed reasons, the host will load the image clut directly rather
4344bf7b86bSchopps;	than through us, but its not that expensive to support both here
4354bf7b86bSchopps;	just in case
4364bf7b86bSchopps	move	a0,a4
4374bf7b86bSchopps	addk	$10,a4
4384bf7b86bSchopps	move	$fe800030,a6
4394bf7b86bSchopps	move	*a4+,a5,0
4404bf7b86bSchopps	jrne	t5l1
4414bf7b86bSchopps	subk	$20,a6
4424bf7b86bSchoppst5l1:	move	*a4+,a5,0
4434bf7b86bSchopps	move	a5,@$fe800000,0
4444bf7b86bSchopps	move	*a4+,a5,0
4454bf7b86bSchopps	move	a5,*a6,0
4464bf7b86bSchopps	move	*a4+,a5,0
4474bf7b86bSchopps	move	a5,*a6,0
4484bf7b86bSchopps	move	*a4+,a5,0
4494bf7b86bSchopps	move	a5,*a6,0
4504bf7b86bSchopps	jruc	loop_end,l
4514bf7b86bSchopps
4524bf7b86bSchoppstestfor6:
4534bf7b86bSchopps	dec	a2
4544bf7b86bSchopps	jrne	testfor7
4554bf7b86bSchopps
4564bf7b86bSchopps; op 6: load new framebuffer size and position for ite support.
4574bf7b86bSchopps	move	a0,b10
4584bf7b86bSchopps	addk	$10,b10
4594bf7b86bSchopps	move	*b10+,b7,1
4604bf7b86bSchopps	move	b7,@screen_width,1
4614bf7b86bSchopps	move	*b10+,b4,1
4624bf7b86bSchopps	move	b4,@screen_origin,1
4634bf7b86bSchopps	move	*b10+,b3,0
4644bf7b86bSchopps	move	b3,@screen_pitch,0
4654bf7b86bSchopps	lmo	b3,b0
4664bf7b86bSchopps	move	b0,@convdp,0
4674bf7b86bSchopps	move	*b10,b0,0
4684bf7b86bSchopps	move	b0,@psize,0
4694bf7b86bSchopps	move	b0,@pixel_size,0	; this syncs the psize write, too
4704bf7b86bSchopps
4714bf7b86bSchopps	jruc	loop_end,l
4724bf7b86bSchopps
4734bf7b86bSchoppstestfor7:
4744bf7b86bSchopps	jruc	loop_end,l
4754bf7b86bSchopps;;;
476