Home | History | Annotate | Line # | Download | only in dev
grfabs_cc.c revision 1.28.20.1
      1  1.28.20.1        ad /*	$NetBSD: grfabs_cc.c,v 1.28.20.1 2007/07/15 13:15:27 ad Exp $ */
      2        1.6       cgd 
      3        1.1    chopps /*
      4        1.1    chopps  * Copyright (c) 1994 Christian E. Hopps
      5        1.1    chopps  * All rights reserved.
      6        1.1    chopps  *
      7        1.1    chopps  * Redistribution and use in source and binary forms, with or without
      8        1.1    chopps  * modification, are permitted provided that the following conditions
      9        1.1    chopps  * are met:
     10        1.1    chopps  * 1. Redistributions of source code must retain the above copyright
     11        1.1    chopps  *    notice, this list of conditions and the following disclaimer.
     12        1.1    chopps  * 2. Redistributions in binary form must reproduce the above copyright
     13        1.1    chopps  *    notice, this list of conditions and the following disclaimer in the
     14        1.1    chopps  *    documentation and/or other materials provided with the distribution.
     15        1.1    chopps  * 3. All advertising materials mentioning features or use of this software
     16        1.1    chopps  *    must display the following acknowledgement:
     17        1.1    chopps  *      This product includes software developed by Christian E. Hopps.
     18        1.1    chopps  * 4. The name of the author may not be used to endorse or promote products
     19        1.1    chopps  *    derived from this software without specific prior written permission
     20        1.1    chopps  *
     21        1.1    chopps  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22        1.1    chopps  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23        1.1    chopps  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24        1.1    chopps  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25        1.1    chopps  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26        1.1    chopps  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27        1.1    chopps  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28        1.1    chopps  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29        1.1    chopps  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30        1.1    chopps  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31        1.6       cgd  */
     32        1.6       cgd 
     33        1.6       cgd /*
     34        1.1    chopps  *  abstract interface for custom chips to the amiga abstract graphics driver.
     35        1.1    chopps  *
     36        1.1    chopps  */
     37       1.19        is 
     38       1.19        is #include "opt_amigaccgrf.h"
     39        1.1    chopps 
     40       1.22   aymeric #include <sys/cdefs.h>
     41  1.28.20.1        ad __KERNEL_RCSID(0, "$NetBSD: grfabs_cc.c,v 1.28.20.1 2007/07/15 13:15:27 ad Exp $");
     42       1.22   aymeric 
     43        1.1    chopps #include <sys/param.h>
     44        1.9    chopps #include <sys/systm.h>
     45        1.1    chopps #include <sys/errno.h>
     46        1.3    chopps #include <sys/queue.h>
     47        1.1    chopps 
     48       1.24   thorpej #include <uvm/uvm_extern.h>
     49       1.24   thorpej 
     50        1.1    chopps #include <amiga/amiga/custom.h>
     51        1.1    chopps #include <amiga/amiga/cc.h>
     52        1.1    chopps 
     53        1.1    chopps #include <amiga/dev/grfabs_reg.h>
     54        1.1    chopps #include <amiga/dev/grfabs_ccreg.h>
     55        1.1    chopps 
     56        1.1    chopps monitor_t *m_this;
     57        1.1    chopps mdata_t *m_this_data;
     58       1.26       jmc const char *monitor_name = "CCMONITOR";
     59        1.1    chopps monitor_t monitor;
     60        1.1    chopps mdata_t monitor_data;
     61        1.1    chopps cop_t  *null_mode_copper_list;
     62        1.1    chopps 
     63        1.1    chopps #if defined (GRF_PAL)
     64        1.1    chopps #  if defined (GRF_A2024)
     65        1.1    chopps dmode_t pal_a2024_mode;
     66        1.1    chopps dmdata_t pal_a2024_mode_data;
     67        1.1    chopps cop_t  *pal_a2024_frames[F_QD_TOTAL];
     68        1.1    chopps u_char *hedley_init;		/* init bitplane. */
     69        1.1    chopps dmode_t *p24_this;
     70        1.1    chopps dmdata_t *p24_this_data;
     71        1.1    chopps 
     72        1.1    chopps dmode_t pal_hires_dlace_mode;
     73        1.1    chopps dmdata_t pal_hires_dlace_mode_data;
     74        1.1    chopps cop_t  *pal_hires_dlace_frames[F_LACE_TOTAL];
     75        1.1    chopps dmode_t *phdl_this;
     76        1.1    chopps dmdata_t *phdl_this_data;
     77        1.1    chopps #  endif /* GRF_A2024 */
     78        1.1    chopps 
     79        1.7    chopps #  if defined (GRF_AGA)
     80        1.7    chopps dmode_t paga_mode;
     81        1.7    chopps dmdata_t paga_mode_data;
     82        1.7    chopps cop_t *paga_frames[F_TOTAL];
     83        1.7    chopps dmode_t *paga_this;
     84        1.7    chopps dmdata_t *paga_this_data;
     85       1.17    mhitch 
     86        1.7    chopps #  endif /* GRF_AGA */
     87        1.7    chopps 
     88        1.1    chopps dmode_t pal_hires_lace_mode;
     89        1.1    chopps dmdata_t pal_hires_lace_mode_data;
     90        1.1    chopps cop_t  *pal_hires_lace_frames[F_LACE_TOTAL];
     91        1.1    chopps dmode_t *phl_this;
     92        1.1    chopps dmdata_t *phl_this_data;
     93        1.1    chopps 
     94        1.1    chopps dmode_t pal_hires_mode;
     95        1.1    chopps dmdata_t pal_hires_mode_data;
     96        1.1    chopps cop_t  *pal_hires_frames[F_TOTAL];
     97        1.1    chopps dmode_t *ph_this;
     98        1.1    chopps dmdata_t *ph_this_data;
     99        1.1    chopps #endif /* PAL */
    100        1.1    chopps 
    101        1.1    chopps #if defined (GRF_NTSC)
    102        1.1    chopps #  if defined (GRF_A2024)
    103        1.1    chopps dmode_t a2024_mode;
    104        1.1    chopps dmdata_t a2024_mode_data;
    105        1.1    chopps cop_t  *a2024_frames[F_QD_TOTAL];
    106        1.1    chopps u_char *hedley_init;		/* init bitplane. */
    107        1.1    chopps dmode_t *a24_this;
    108        1.1    chopps dmdata_t *a24_this_data;
    109        1.1    chopps 
    110        1.1    chopps dmode_t hires_dlace_mode;
    111        1.1    chopps dmdata_t hires_dlace_mode_data;
    112        1.1    chopps cop_t  *hires_dlace_frames[F_LACE_TOTAL];
    113        1.1    chopps dmode_t *hdl_this;
    114        1.1    chopps dmdata_t *hdl_this_data;
    115        1.1    chopps #  endif /* GRF_A2024 */
    116        1.1    chopps 
    117        1.4    chopps #  if defined (GRF_AGA)
    118        1.4    chopps dmode_t aga_mode;
    119        1.4    chopps dmdata_t aga_mode_data;
    120        1.4    chopps cop_t *aga_frames[F_TOTAL];
    121        1.4    chopps dmode_t *aga_this;
    122        1.4    chopps dmdata_t *aga_this_data;
    123       1.17    mhitch 
    124       1.17    mhitch #if defined (GRF_SUPER72)
    125       1.17    mhitch dmode_t super72_mode;
    126       1.17    mhitch dmdata_t super72_mode_data;
    127       1.17    mhitch cop_t *super72_frames[F_LACE_TOTAL];
    128       1.17    mhitch dmode_t *super72_this;
    129       1.17    mhitch dmdata_t *super72_this_data;
    130       1.17    mhitch #endif /* GRF_SUPER72 */
    131       1.17    mhitch 
    132        1.4    chopps #  endif /* GRF_AGA */
    133        1.4    chopps 
    134        1.1    chopps dmode_t hires_lace_mode;
    135        1.1    chopps dmdata_t hires_lace_mode_data;
    136        1.1    chopps cop_t  *hires_lace_frames[F_LACE_TOTAL];
    137        1.1    chopps dmode_t *hl_this;
    138        1.1    chopps dmdata_t *hl_this_data;
    139        1.1    chopps 
    140        1.1    chopps void    display_hires_view(view_t * v);
    141        1.1    chopps dmode_t hires_mode;
    142        1.1    chopps dmdata_t hires_mode_data;
    143        1.1    chopps cop_t  *hires_frames[F_TOTAL];
    144        1.1    chopps dmode_t *h_this;
    145        1.1    chopps dmdata_t *h_this_data;
    146        1.1    chopps #endif /* GRF_NTSC */
    147        1.1    chopps 
    148        1.4    chopps #ifdef GRF_AGA
    149        1.4    chopps #define	AGA_ENABLE	0x0001
    150        1.4    chopps #define	AGA_ENABLE2	0x0002
    151        1.4    chopps #define AGA_TRACE	0x0004
    152        1.4    chopps #define AGA_TRACE2	0x0008
    153        1.4    chopps #define AGA_VGAONLY	0x0010
    154        1.4    chopps #define AGA_VGA31KHZ	0x0020
    155        1.4    chopps 
    156        1.4    chopps int aga_enable = 0;	/* set by start_c(), or can be patched */
    157       1.21   aymeric colormap_t *cc_alloc_aga_colormap(int);
    158       1.21   aymeric int cc_use_aga_colormap(view_t *, colormap_t *);
    159        1.4    chopps #endif
    160        1.1    chopps 
    161        1.1    chopps /* monitor functions. */
    162        1.1    chopps monitor_t *
    163       1.21   aymeric cc_init_monitor(void)
    164        1.1    chopps {
    165        1.3    chopps 	cop_t  *cp;
    166       1.21   aymeric 
    167        1.3    chopps 	if (m_this)
    168        1.3    chopps 		return(m_this);
    169        1.3    chopps 
    170        1.3    chopps 	cc_monitor = m_this = &monitor;
    171        1.3    chopps 	/* turn sprite DMA off. we don't support them yet. */
    172        1.3    chopps 	custom.dmacon = DMAF_SPRITE;
    173        1.8    chopps 
    174        1.8    chopps 	/* makre sure sprite data registers are clear as well */
    175        1.8    chopps 	custom.spr[0].data = 0;
    176        1.8    chopps 	custom.spr[0].datb = 0;
    177        1.3    chopps 
    178        1.3    chopps 	m_this->name = monitor_name;
    179        1.3    chopps 	m_this_data = m_this->data = &monitor_data;
    180        1.3    chopps 
    181        1.3    chopps 	m_this->get_current_mode = get_current_mode;
    182        1.3    chopps 	m_this->vbl_handler = (vbl_handler_func *) monitor_vbl_handler;
    183        1.3    chopps 	m_this->get_next_mode = get_next_mode;
    184        1.3    chopps 	m_this->get_best_mode = get_best_mode;
    185        1.1    chopps 
    186        1.3    chopps 	m_this->alloc_bitmap = alloc_bitmap;
    187        1.3    chopps 	m_this->free_bitmap = free_bitmap;
    188        1.1    chopps 
    189        1.3    chopps 	m_this_data->current_mode = NULL;
    190        1.3    chopps 	LIST_INIT(&m_this_data->modes);
    191        1.1    chopps 
    192        1.3    chopps 	cp = null_mode_copper_list = alloc_chipmem(sizeof(cop_t) * 4);
    193        1.3    chopps 	if (!cp)
    194        1.3    chopps 		panic("no chipmem for grf.");
    195        1.3    chopps 
    196        1.3    chopps 	CMOVE(cp, R_COLOR00, 0x0000);	/* background is black */
    197        1.3    chopps 	CMOVE(cp, R_BPLCON0, 0x0000);	/* no planes to fetch from */
    198        1.3    chopps 	CWAIT(cp, 255, 255);	/* COPEND */
    199        1.3    chopps 	CWAIT(cp, 255, 255);	/* COPEND really */
    200        1.1    chopps 
    201        1.4    chopps 	/* install this list and turn DMA on */
    202        1.3    chopps 	custom.cop1lc = PREP_DMA_MEM(null_mode_copper_list);
    203        1.3    chopps 	custom.copjmp1 = 0;
    204        1.3    chopps 	custom.dmacon = DMAF_SETCLR | DMAF_MASTER | DMAF_RASTER \
    205        1.3    chopps 	    |DMAF_COPPER;
    206        1.1    chopps 
    207        1.3    chopps 	cc_init_modes();
    208        1.3    chopps 	LIST_INSERT_HEAD(monitors, m_this, link);
    209        1.1    chopps 	return (m_this);
    210        1.1    chopps }
    211        1.1    chopps 
    212        1.1    chopps void
    213       1.21   aymeric monitor_vbl_handler(monitor_t *m)
    214        1.1    chopps {
    215        1.3    chopps 	dmdata_t *dmd;
    216        1.3    chopps 
    217        1.3    chopps 	if (m_this_data->current_mode == NULL)
    218        1.3    chopps 		return;
    219        1.3    chopps 
    220        1.3    chopps 	dmd = DMDATA(m_this_data->current_mode);
    221        1.3    chopps 	if (dmd)
    222        1.3    chopps 		dmd->vbl_handler(m_this_data->current_mode);
    223        1.1    chopps }
    224        1.1    chopps 
    225        1.1    chopps dmode_t *
    226       1.21   aymeric get_current_mode(void)
    227        1.1    chopps {
    228        1.3    chopps 	if (m_this_data->current_mode)
    229        1.3    chopps 		return(m_this_data->current_mode);
    230        1.3    chopps 	else
    231        1.3    chopps 		return(NULL);
    232        1.1    chopps }
    233        1.1    chopps 
    234        1.1    chopps dmode_t *
    235       1.21   aymeric get_next_mode(dmode_t *d)
    236        1.1    chopps {
    237        1.3    chopps 	if (d)
    238        1.3    chopps 		return(d->link.le_next);
    239        1.3    chopps 	return(m_this_data->modes.lh_first);
    240        1.1    chopps }
    241        1.1    chopps 
    242        1.1    chopps /* XXX needs to have more control attributes */
    243        1.1    chopps dmode_t *
    244       1.21   aymeric get_best_mode(dimen_t *size, u_char depth)
    245        1.1    chopps {
    246        1.3    chopps 	dmode_t *save;
    247        1.3    chopps 	dmode_t *dm;
    248       1.11     veego 	long    dt = 0, dx, dy, ct;
    249        1.3    chopps 	dmdata_t *dmd;
    250        1.3    chopps 
    251        1.3    chopps 	save = NULL;
    252        1.3    chopps 	dm = m_this_data->modes.lh_first;
    253        1.3    chopps 	while (dm != NULL) {
    254        1.3    chopps 		dmd = dm->data;
    255        1.1    chopps 		if (depth > dmd->max_depth || depth < dmd->min_depth) {
    256        1.3    chopps 			dm = dm->link.le_next;
    257        1.1    chopps 			continue;
    258        1.3    chopps 		} else if (size->width > dmd->max_size.width ||
    259        1.1    chopps 		    size->height > dmd->max_size.height) {
    260        1.3    chopps 			dm = dm->link.le_next;
    261        1.1    chopps 			continue;
    262        1.3    chopps 		} else if (size->width < dmd->min_size.width ||
    263        1.1    chopps 		    size->height < dmd->min_size.height) {
    264        1.3    chopps 			dm = dm->link.le_next;
    265        1.1    chopps 			continue;
    266        1.1    chopps 		}
    267        1.3    chopps 		dx = abs(dm->nominal_size.width - size->width);
    268        1.3    chopps 		dy = abs(dm->nominal_size.height - size->height);
    269        1.1    chopps 		ct = dx + dy;
    270        1.1    chopps 
    271        1.1    chopps 		if (ct < dt || save == NULL) {
    272        1.3    chopps 			save = dm;
    273        1.1    chopps 			dt = ct;
    274        1.1    chopps 		}
    275        1.3    chopps 		dm = dm->link.le_next;
    276        1.1    chopps 	}
    277        1.1    chopps 	return (save);
    278        1.1    chopps }
    279        1.1    chopps /* bitmap functions */
    280        1.1    chopps bmap_t *
    281       1.21   aymeric alloc_bitmap(u_short width, u_short height, u_short depth, u_short flags)
    282        1.1    chopps {
    283        1.1    chopps 	int     i;
    284        1.1    chopps 	u_long  total_size;
    285        1.4    chopps #ifdef GRF_AGA
    286        1.4    chopps 	u_short lwpr = (flags & BMF_ALIGN64) ? ((width + 63) / 64) * 2 :
    287        1.4    chopps 	    (width + 31) / 32;			/* AGA needs 64 bit align */
    288        1.4    chopps #else
    289        1.1    chopps 	u_short lwpr = (width + 31) / 32;
    290        1.4    chopps #endif
    291        1.1    chopps 	u_short wpr = lwpr << 1;
    292        1.1    chopps 	u_short bpr = wpr << 1;
    293        1.1    chopps 	u_short array_size = sizeof(u_char *) * depth;
    294        1.1    chopps 	u_long  plane_size = bpr * height;
    295        1.1    chopps 	u_short temp_size = bpr + sizeof(u_long);
    296        1.1    chopps 	bmap_t *bm;
    297        1.1    chopps 
    298        1.1    chopps 	/* note the next allocation will give everything, also note that all
    299        1.1    chopps 	 * the stuff we want (including bitmaps) will be long short aligned.
    300        1.4    chopps 	 * This is a function of the data being allocated and the fact that
    301        1.1    chopps 	 * alloc_chipmem() returns long short aligned data. note also that
    302        1.1    chopps 	 * each row of the bitmap is long word aligned and made of exactly n
    303        1.1    chopps 	 * longwords. -ch */
    304        1.1    chopps 
    305        1.1    chopps 	/* Sigh, it seems for mapping to work we need the bitplane data to 1:
    306        1.1    chopps 	 * be aligned on a page boundry. 2: be n pages large.
    307       1.21   aymeric 	 *
    308       1.25       wiz 	 * why? because the user gets a page aligned address, if this is before
    309        1.1    chopps 	 * your allocation, too bad.  Also it seems that the mapping routines
    310        1.1    chopps 	 * do not watch to closely to the allowable length. so if you go over
    311        1.1    chopps 	 * n pages by less than another page, the user gets to write all over
    312        1.1    chopps 	 * the entire page.  Since you did not allocate up to a page boundry
    313        1.1    chopps 	 * (or more) the user writes into someone elses memory. -ch */
    314       1.20        is #ifdef __powerpc__
    315       1.20        is #define m68k_round_page(x)	((((unsigned)(x)) + PGOFSET) & ~PGOFSET)
    316       1.20        is #endif
    317       1.16     veego 	total_size = m68k_round_page(plane_size * depth) +	/* for length */
    318        1.1    chopps 	    (temp_size) + (array_size) + sizeof(bmap_t) +
    319       1.24   thorpej 	    PAGE_SIZE;		/* for alignment */
    320        1.1    chopps 	bm = alloc_chipmem(total_size);
    321        1.1    chopps 	if (bm) {
    322        1.1    chopps 		if (flags & BMF_CLEAR) {
    323        1.1    chopps 			bzero(bm, total_size);
    324        1.1    chopps 		}
    325        1.1    chopps 		bm->bytes_per_row = bpr;
    326        1.1    chopps 		bm->rows = height;
    327        1.1    chopps 		bm->depth = depth;
    328        1.1    chopps 		bm->flags = flags;
    329        1.1    chopps 		bm->plane = (u_char **) & bm[1];
    330        1.1    chopps 		bm->blit_temp = ((u_char *) bm->plane) + array_size;
    331       1.16     veego 		bm->plane[0] = (u_char *) m68k_round_page((u_long)
    332       1.11     veego 						(bm->blit_temp + temp_size));
    333        1.1    chopps 		if (flags & BMF_INTERLEAVED) {
    334        1.1    chopps 			bm->row_mod = bm->bytes_per_row * (depth - 1);
    335        1.1    chopps 			for (i = 1; i < depth; i++) {
    336        1.1    chopps 				bm->plane[i] = bm->plane[i - 1] + bpr;
    337        1.1    chopps 			}
    338        1.1    chopps 		} else {
    339        1.1    chopps 			bm->row_mod = 0;
    340        1.1    chopps 			for (i = 1; i < depth; i++) {
    341        1.1    chopps 				bm->plane[i] = bm->plane[i - 1] + plane_size;
    342        1.1    chopps 			}
    343        1.1    chopps 		}
    344        1.1    chopps 		bm->hardware_address = PREP_DMA_MEM(bm->plane[0]);
    345        1.1    chopps 		return (bm);
    346        1.1    chopps 	}
    347        1.1    chopps 	return (NULL);
    348        1.1    chopps }
    349        1.1    chopps 
    350        1.1    chopps 
    351        1.1    chopps void
    352       1.21   aymeric free_bitmap(bmap_t *bm)
    353        1.1    chopps {
    354       1.21   aymeric 	if (bm)
    355        1.1    chopps 		free_chipmem(bm);
    356        1.1    chopps }
    357        1.1    chopps /* load a new mode into the current display, if NULL shut display off. */
    358        1.1    chopps void
    359       1.21   aymeric cc_load_mode(dmode_t *d)
    360        1.1    chopps {
    361        1.1    chopps 	if (d) {
    362        1.1    chopps 		m_this_data->current_mode = d;
    363       1.20        is #ifdef __powerpc__	/* XXX ???? */
    364       1.20        is 		custom.cop1lc = PREP_DMA_MEM(DMDATA(d)->frames[F_LONG]);
    365       1.20        is 		custom.copjmp1 = 0;
    366       1.20        is #endif
    367        1.1    chopps 		return;
    368        1.1    chopps 	}
    369        1.1    chopps 	/* turn off display */
    370        1.1    chopps 	m_this_data->current_mode = NULL;
    371        1.1    chopps 	wait_tof();
    372        1.1    chopps 	wait_tof();
    373        1.1    chopps 	custom.cop1lc = PREP_DMA_MEM(null_mode_copper_list);
    374       1.23  jandberg 	custom.copjmp1 = 0;
    375        1.1    chopps }
    376        1.1    chopps /*
    377        1.1    chopps  * CC Mode Stuff.
    378        1.1    chopps  */
    379        1.1    chopps 
    380        1.1    chopps dmode_t *(*mode_init_funcs[]) (void) = {
    381        1.1    chopps #if defined (GRF_NTSC)
    382        1.1    chopps #if defined (GRF_A2024)
    383        1.1    chopps 	cc_init_ntsc_a2024,
    384        1.1    chopps 	cc_init_ntsc_hires_dlace,
    385        1.1    chopps #endif /* GRF_A2024 */
    386        1.1    chopps 	cc_init_ntsc_hires_lace,
    387        1.1    chopps 	cc_init_ntsc_hires,
    388        1.4    chopps #if defined (GRF_AGA)
    389        1.4    chopps 	cc_init_ntsc_aga,
    390       1.17    mhitch #if defined (GRF_SUPER72)
    391       1.17    mhitch 	cc_init_super72,
    392       1.17    mhitch #endif /* GRF_SUPER72 */
    393        1.4    chopps #endif /* GRF_AGA */
    394        1.1    chopps #endif /* GRF_NTSC */
    395        1.1    chopps #if defined (GRF_PAL)
    396        1.1    chopps #if defined (GRF_A2024)
    397        1.1    chopps 	cc_init_pal_a2024,
    398        1.1    chopps 	cc_init_pal_hires_dlace,
    399        1.1    chopps #endif /* GRF_A2024 */
    400        1.1    chopps 	cc_init_pal_hires_lace,
    401        1.1    chopps 	cc_init_pal_hires,
    402        1.7    chopps #if defined (GRF_AGA)
    403        1.7    chopps 	cc_init_pal_aga,
    404        1.7    chopps #endif /* GRF_AGA */
    405        1.1    chopps #endif /* GRF_PAL */
    406        1.1    chopps 	NULL
    407        1.1    chopps };
    408        1.1    chopps 
    409        1.1    chopps int
    410       1.21   aymeric cc_init_modes(void)
    411        1.1    chopps {
    412        1.1    chopps 	int     i = 0;
    413        1.1    chopps 	int     error = 0;
    414        1.1    chopps 	while (mode_init_funcs[i]) {
    415        1.1    chopps 		mode_init_funcs[i] ();
    416        1.1    chopps 		i++;
    417        1.1    chopps 	}
    418        1.1    chopps 	return (error);
    419        1.1    chopps }
    420        1.1    chopps 
    421        1.1    chopps monitor_t *
    422       1.21   aymeric cc_get_monitor(dmode_t *d)
    423        1.1    chopps {
    424        1.1    chopps 	return (DMDATA(d)->monitor);
    425        1.1    chopps }
    426        1.1    chopps 
    427        1.1    chopps view_t *
    428       1.21   aymeric cc_get_current_view(dmode_t *d)
    429        1.1    chopps {
    430        1.1    chopps 	return (DMDATA(d)->current_view);
    431        1.1    chopps }
    432        1.1    chopps 
    433        1.1    chopps 
    434        1.1    chopps view_t *
    435       1.21   aymeric cc_alloc_view(dmode_t *mode, dimen_t *dim, u_char depth)
    436        1.1    chopps {
    437        1.1    chopps 	view_t *v = alloc_chipmem(sizeof(*v) + sizeof(vdata_t));
    438        1.1    chopps 	if (v) {
    439        1.4    chopps 		bmap_t *bm = cc_monitor->alloc_bitmap(dim->width, dim->height,
    440        1.4    chopps 		    depth, BMF_CLEAR | (DMDATA(mode)->max_depth == 8 ? BMF_ALIGN64 : 0));
    441        1.1    chopps 		if (bm) {
    442        1.1    chopps 			box_t   box;
    443        1.1    chopps 
    444        1.1    chopps 			v->data = &v[1];	/* at the end of view */
    445        1.1    chopps 			VDATA(v)->colormap = DMDATA(mode)->alloc_colormap(depth);
    446        1.1    chopps 			if (VDATA(v)->colormap) {
    447        1.1    chopps 				INIT_BOX(&box, 0, 0, dim->width, dim->height);
    448        1.1    chopps 				cc_init_view(v, bm, mode, &box);
    449        1.1    chopps 				return (v);
    450        1.1    chopps 			}
    451        1.1    chopps 			cc_monitor->free_bitmap(bm);
    452        1.1    chopps 		}
    453        1.1    chopps 		free_chipmem(v);
    454        1.1    chopps 	}
    455        1.1    chopps 	return (NULL);
    456        1.1    chopps }
    457        1.1    chopps 
    458        1.1    chopps colormap_t *
    459       1.21   aymeric cc_alloc_colormap(int depth)
    460        1.1    chopps {
    461        1.1    chopps 	u_long  size = 1U << depth, i;
    462        1.1    chopps 	colormap_t *cm = alloc_chipmem(sizeof(u_long) * size + sizeof(*cm));
    463        1.1    chopps 
    464        1.1    chopps 	if (cm) {
    465        1.1    chopps 		cm->type = CM_COLOR;
    466        1.1    chopps 		cm->red_mask = 0x0F;
    467        1.1    chopps 		cm->green_mask = 0x0F;
    468        1.1    chopps 		cm->blue_mask = 0x0F;
    469        1.1    chopps 		cm->first = 0;
    470        1.1    chopps 		cm->size = size;
    471        1.1    chopps 		cm->entry = (u_long *) & cm[1];	/* table directly after. */
    472        1.4    chopps 		for (i = 0; i < size; i++) {
    473        1.4    chopps 			cm->entry[i] = CM_WTOL(cc_default_colors[i&31]);
    474        1.4    chopps 		}
    475        1.4    chopps 		return (cm);
    476        1.4    chopps 	}
    477        1.4    chopps 	return (NULL);
    478        1.4    chopps }
    479        1.4    chopps 
    480        1.4    chopps #ifdef GRF_AGA
    481        1.4    chopps colormap_t *
    482       1.21   aymeric cc_alloc_aga_colormap(int depth)
    483        1.4    chopps {
    484        1.4    chopps 	u_long  size = 1U << depth, i;
    485        1.4    chopps 	colormap_t *cm = alloc_chipmem(sizeof(u_long) * size + sizeof(*cm));
    486        1.4    chopps 
    487        1.4    chopps 	if (cm) {
    488        1.4    chopps 		cm->type = CM_COLOR;
    489        1.4    chopps 		cm->red_mask = 0x0FF;
    490        1.4    chopps 		cm->green_mask = 0x0FF;
    491        1.4    chopps 		cm->blue_mask = 0x0FF;
    492        1.4    chopps 		cm->first = 0;
    493        1.4    chopps 		cm->size = size;
    494        1.4    chopps 		cm->entry = (u_long *) & cm[1];	/* table directly after. */
    495        1.4    chopps 		for (i = 0; i < size; i++) {
    496        1.4    chopps 			cm->entry[i] = CM_WTOL(cc_default_colors[i&31]) |
    497        1.4    chopps 			    (CM_WTOL(cc_default_colors[i&31]) << 4);
    498        1.1    chopps 		}
    499        1.1    chopps 		return (cm);
    500        1.1    chopps 	}
    501        1.1    chopps 	return (NULL);
    502        1.1    chopps }
    503        1.4    chopps #endif
    504        1.1    chopps 
    505        1.1    chopps int
    506       1.21   aymeric cc_colormap_checkvals(colormap_t *vcm, colormap_t *cm, int use)
    507        1.1    chopps {
    508        1.1    chopps 	if (use) {
    509        1.1    chopps 		/* check to see if its the view's colormap, if so just do
    510        1.1    chopps 		 * update. */
    511        1.1    chopps 		if (vcm != cm) {
    512       1.11     veego 			if (cm->first >= vcm->size ||
    513       1.11     veego 			   (cm->first + cm->size) > (cm->first + vcm->size) ||
    514        1.1    chopps 			    cm->type != vcm->type) {
    515        1.1    chopps 				return (0);
    516        1.1    chopps 			}
    517        1.1    chopps 			switch (vcm->type) {
    518        1.1    chopps 			case CM_COLOR:
    519        1.1    chopps 				if (cm->red_mask != vcm->red_mask ||
    520        1.1    chopps 				    cm->green_mask != vcm->green_mask ||
    521        1.1    chopps 				    cm->blue_mask != vcm->blue_mask) {
    522        1.1    chopps 					return (0);
    523        1.1    chopps 				}
    524        1.1    chopps 				break;
    525        1.1    chopps 			case CM_GREYSCALE:
    526        1.1    chopps 				if (cm->grey_mask != vcm->grey_mask) {
    527        1.1    chopps 					return (0);
    528        1.1    chopps 				}
    529        1.1    chopps 				break;
    530        1.1    chopps 			}
    531        1.1    chopps 		}
    532        1.1    chopps 	} else {
    533       1.11     veego 		if (cm->first >= vcm->size ||
    534       1.11     veego 		   (cm->first + cm->size) > (cm->first + vcm->size)) {
    535        1.1    chopps 			return (0);
    536        1.1    chopps 		}
    537        1.1    chopps 	}
    538        1.1    chopps 	return (1);
    539        1.1    chopps }
    540       1.21   aymeric 
    541        1.1    chopps /* does sanity check on values */
    542        1.1    chopps int
    543       1.21   aymeric cc_get_colormap(view_t *v, colormap_t *cm)
    544        1.1    chopps {
    545        1.1    chopps 	colormap_t *vcm = VDATA(v)->colormap;
    546        1.1    chopps 	int     i;
    547        1.1    chopps 
    548        1.1    chopps 	if (!cc_colormap_checkvals(vcm, cm, 0)) {
    549        1.1    chopps 		return (EINVAL);
    550        1.1    chopps 	}
    551        1.1    chopps 	cm->type = vcm->type;
    552        1.1    chopps 
    553        1.1    chopps 	switch (vcm->type) {
    554        1.1    chopps 	case CM_COLOR:
    555        1.1    chopps 		cm->red_mask = vcm->red_mask;
    556        1.1    chopps 		cm->green_mask = vcm->green_mask;
    557        1.1    chopps 		cm->blue_mask = vcm->blue_mask;
    558        1.1    chopps 		break;
    559        1.1    chopps 	case CM_GREYSCALE:
    560        1.1    chopps 		cm->grey_mask = vcm->grey_mask;
    561        1.1    chopps 		break;
    562        1.1    chopps 	}
    563        1.1    chopps 
    564        1.1    chopps 	/* copy entries into colormap. */
    565        1.1    chopps 	for (i = cm->first; i < (cm->first + cm->size); i++) {
    566        1.1    chopps 		cm->entry[i] = vcm->entry[i];
    567        1.1    chopps 	}
    568        1.1    chopps 	return (0);
    569        1.1    chopps }
    570        1.1    chopps 
    571        1.1    chopps /* does sanity check on values */
    572        1.1    chopps int
    573       1.21   aymeric cc_use_colormap(view_t *v, colormap_t *cm)
    574        1.1    chopps {
    575        1.1    chopps 	colormap_t *vcm = VDATA(v)->colormap;
    576        1.1    chopps 	int     s, i;
    577        1.1    chopps 
    578        1.1    chopps 	if (!cc_colormap_checkvals(vcm, cm, 1)) {
    579        1.1    chopps 		return (EINVAL);
    580        1.1    chopps 	}
    581        1.1    chopps 	/* check to see if its the view's colormap, if so just do update. */
    582        1.1    chopps 	if (vcm != cm) {
    583        1.1    chopps 		/* copy entries into colormap. */
    584        1.1    chopps 		for (i = cm->first; i < (cm->first + cm->size); i++) {
    585        1.1    chopps 			vcm->entry[i] = cm->entry[i];
    586        1.1    chopps 		}
    587        1.1    chopps 	}
    588        1.1    chopps 	s = spltty();
    589        1.1    chopps 
    590        1.1    chopps 	/* is view currently being displayed? */
    591        1.1    chopps 	if (VDATA(v)->flags & VF_DISPLAY) {
    592        1.1    chopps 		/* yes, update the copper lists */
    593        1.1    chopps 		cop_t  *tmp, *cp;
    594        1.1    chopps 		int     nframes = 1, j;
    595        1.1    chopps 
    596        1.1    chopps 		if (DMDATA(VDATA(v)->mode)->flags & DMF_INTERLACE) {
    597        1.1    chopps 			nframes = 2;
    598        1.1    chopps 		}
    599        1.1    chopps 		for (i = 0; i < nframes; i++) {
    600        1.1    chopps 			cp = DMDATA(VDATA(v)->mode)->frames[i];
    601        1.1    chopps 
    602        1.1    chopps 			tmp = find_copper_inst(cp, CI_MOVE(R_COLOR07));
    603        1.1    chopps 			tmp -= 7;
    604        1.1    chopps 
    605        1.4    chopps 			for (j = 0; j < 32; j++) {
    606       1.11     veego 				CMOVE(tmp, (R_COLOR00 + (j << 1)),
    607       1.11     veego 					CM_LTOW(vcm->entry[j]));
    608        1.1    chopps 			}
    609        1.1    chopps 		}
    610        1.1    chopps 	}
    611        1.1    chopps 	splx(s);
    612        1.1    chopps 	return (0);
    613        1.1    chopps }
    614        1.4    chopps 
    615        1.4    chopps #ifdef GRF_AGA
    616        1.4    chopps /* does sanity check on values */
    617        1.4    chopps int
    618       1.21   aymeric cc_use_aga_colormap(view_t *v, colormap_t *cm)
    619        1.4    chopps {
    620        1.4    chopps 	colormap_t *vcm = VDATA(v)->colormap;
    621        1.4    chopps 	int     s, i;
    622        1.4    chopps 
    623        1.4    chopps 	if (!cc_colormap_checkvals(vcm, cm, 1)) {
    624        1.4    chopps 		return (EINVAL);
    625        1.4    chopps 	}
    626        1.4    chopps 	/* check to see if its the view's colormap, if so just do update. */
    627        1.4    chopps 	if (vcm != cm) {
    628        1.4    chopps 		/* copy entries into colormap. */
    629        1.4    chopps 		for (i = cm->first; i < (cm->first + cm->size); i++) {
    630        1.4    chopps 			vcm->entry[i] = cm->entry[i];
    631        1.4    chopps 		}
    632        1.4    chopps 	}
    633        1.4    chopps 	s = spltty();
    634        1.4    chopps 
    635        1.4    chopps 	/* is view currently being displayed? */
    636        1.4    chopps 	if (VDATA(v)->flags & VF_DISPLAY) {
    637        1.4    chopps 		/* yes, update the copper lists */
    638        1.4    chopps 		cop_t  *tmp, *cp;
    639        1.4    chopps 		int     nframes = 1, j;
    640        1.4    chopps 
    641        1.4    chopps 		if (DMDATA(VDATA(v)->mode)->flags & DMF_INTERLACE) {
    642        1.4    chopps 			nframes = 2;
    643        1.4    chopps 		}
    644        1.4    chopps 		for (i = 0; i < nframes; i++) {
    645        1.4    chopps 			cp = DMDATA(VDATA(v)->mode)->frames[i];
    646        1.4    chopps 
    647        1.5    chopps 			tmp = find_copper_inst(cp, CI_MOVE(R_COLOR00));
    648        1.4    chopps 			for (j = 0; j < vcm->size; j += 32) {
    649        1.4    chopps 				int k;
    650        1.4    chopps 
    651        1.4    chopps 				for (k = 0; k < 32; k++) {
    652        1.4    chopps 					int ce = vcm->entry[j + k] >> 4;
    653       1.11     veego 					CMOVE(tmp, (R_COLOR00 + (k << 1)),
    654       1.11     veego 						CM_LTOW(ce));
    655        1.4    chopps 				}
    656        1.5    chopps 				tmp++;
    657        1.4    chopps 				for (k = 0; k < 32; k++) {
    658        1.4    chopps 					int ce =vcm->entry[j + k];
    659       1.11     veego 					CMOVE(tmp, (R_COLOR00 + (k << 1)),
    660       1.11     veego 						CM_LTOW(ce));
    661        1.4    chopps 				}
    662        1.5    chopps 				tmp++;
    663        1.4    chopps 			}
    664        1.4    chopps 		}
    665        1.4    chopps 	}
    666        1.4    chopps 	splx(s);
    667        1.4    chopps 	return (0);
    668        1.4    chopps }
    669        1.4    chopps #endif
    670        1.4    chopps 
    671        1.1    chopps #if defined (GRF_A2024)
    672        1.1    chopps colormap_t *
    673       1.21   aymeric cc_a2024_alloc_colormap(int depth)
    674        1.1    chopps {
    675        1.1    chopps 	u_long  size = 1U << depth, i;
    676        1.1    chopps 	colormap_t *cm = alloc_chipmem(sizeof(u_long) * size + sizeof(*cm));
    677        1.1    chopps 
    678        1.1    chopps 	if (cm) {
    679        1.1    chopps 		cm->type = CM_GREYSCALE;
    680        1.1    chopps 		cm->grey_mask = 0x03;
    681        1.1    chopps 		cm->first = 0;
    682        1.1    chopps 		cm->size = size;
    683        1.1    chopps 		cm->entry = (u_long *) & cm[1];	/* table directly after. */
    684        1.1    chopps 		for (i = 0; i < size; i++) {
    685        1.1    chopps 			cm->entry[i] = CM_WTOL(cc_a2024_default_colors[i]);
    686        1.1    chopps 		}
    687        1.1    chopps 		return (cm);
    688        1.1    chopps 	}
    689        1.1    chopps 	return (NULL);
    690        1.1    chopps }
    691        1.1    chopps 
    692        1.1    chopps int
    693       1.21   aymeric cc_a2024_get_colormap(view_t *v, colormap_t *cm)
    694        1.1    chopps {
    695        1.1    chopps 	/* there are no differences (yet) in the way the cm's are stored */
    696        1.1    chopps 	return (cc_get_colormap(v, cm));
    697        1.1    chopps }
    698        1.1    chopps 
    699        1.1    chopps int
    700       1.21   aymeric cc_a2024_use_colormap(view_t *v, colormap_t *cm)
    701        1.1    chopps {
    702        1.1    chopps 	colormap_t *vcm = VDATA(v)->colormap;
    703        1.1    chopps 	int     s, i;
    704        1.1    chopps 
    705        1.1    chopps 	if (!cc_colormap_checkvals(vcm, cm, 1)) {
    706        1.1    chopps 		return (EINVAL);
    707        1.1    chopps 	}
    708        1.1    chopps 	/* check to see if its the view's colormap, if so just do update. */
    709        1.1    chopps 	if (vcm != cm) {
    710        1.1    chopps 		/* copy entries into colormap. */
    711        1.1    chopps 		for (i = cm->first; i < (cm->first + cm->size); i++) {
    712        1.1    chopps 			vcm->entry[i] = cm->entry[i];
    713        1.1    chopps 		}
    714        1.1    chopps 	}
    715        1.1    chopps 	s = spltty();
    716        1.1    chopps 
    717        1.1    chopps 	/* is view currently being displayed? */
    718        1.1    chopps 	if (VDATA(v)->flags & VF_DISPLAY) {
    719        1.1    chopps 		/* yes, update the copper lists */
    720        1.1    chopps 		cop_t  *tmp, *cp;
    721        1.1    chopps 		int     nframes = 2, nregs = cm->size == 4 ? 16 : 8, j;
    722        1.1    chopps 
    723        1.1    chopps 		if (DMDATA(VDATA(v)->mode)->flags & DMF_HEDLEY_EXP) {
    724        1.1    chopps 			nframes = 4;
    725        1.1    chopps 		}
    726        1.1    chopps 		for (i = 0; i < nframes; i++) {
    727        1.1    chopps 			cp = DMDATA(VDATA(v)->mode)->frames[i];
    728        1.1    chopps 
    729        1.1    chopps 			tmp = find_copper_inst(cp, CI_MOVE(R_COLOR07));
    730        1.1    chopps 			tmp -= 7;
    731        1.1    chopps 
    732        1.1    chopps 			for (j = 0; j < nregs; j++) {
    733       1.11     veego 				CMOVE(tmp, (R_COLOR00 + (j << 1)),
    734       1.11     veego 					A2024_CM_TO_CR(vcm, j));
    735        1.1    chopps 			}
    736        1.1    chopps 		}
    737        1.1    chopps 	}
    738        1.1    chopps 	splx(s);
    739        1.1    chopps 	return (0);
    740        1.1    chopps }
    741        1.1    chopps #endif /* GRF_A2024 */
    742        1.1    chopps 
    743        1.1    chopps 
    744        1.1    chopps /*
    745        1.1    chopps  * CC View stuff.
    746        1.1    chopps  */
    747        1.1    chopps 
    748        1.1    chopps void
    749       1.21   aymeric cc_init_view(view_t *v, bmap_t *bm, dmode_t *mode, box_t *dbox)
    750        1.1    chopps {
    751        1.1    chopps 	vdata_t *vd = VDATA(v);
    752        1.1    chopps 	v->bitmap = bm;
    753        1.1    chopps 	vd->mode = mode;
    754        1.1    chopps 	bcopy(dbox, &v->display, sizeof(box_t));
    755        1.1    chopps 
    756        1.1    chopps 	v->display_view = DMDATA(vd->mode)->display_view;
    757        1.1    chopps 	v->use_colormap = DMDATA(vd->mode)->use_colormap;
    758        1.1    chopps 	v->get_colormap = DMDATA(vd->mode)->get_colormap;
    759        1.1    chopps 	v->free_view = cc_free_view;
    760        1.1    chopps 	v->get_display_mode = cc_get_display_mode;
    761        1.1    chopps 	v->remove_view = cc_remove_view;
    762        1.1    chopps }
    763        1.1    chopps 
    764        1.1    chopps void
    765       1.21   aymeric cc_free_view(view_t *v)
    766        1.1    chopps {
    767        1.1    chopps 	if (v) {
    768        1.1    chopps 		v->remove_view(v);
    769        1.4    chopps 		free_chipmem(VDATA(v)->colormap);
    770        1.1    chopps 		cc_monitor->free_bitmap(v->bitmap);
    771        1.1    chopps 		free_chipmem(v);
    772        1.1    chopps 	}
    773        1.1    chopps }
    774        1.1    chopps 
    775        1.1    chopps void
    776       1.21   aymeric cc_remove_view(view_t *v)
    777        1.1    chopps {
    778        1.1    chopps 	dmode_t *mode = VDATA(v)->mode;
    779        1.1    chopps 
    780        1.1    chopps 	if (MDATA(cc_monitor)->current_mode == mode) {
    781        1.1    chopps 		if (DMDATA(mode)->current_view == v) {
    782        1.1    chopps 			cc_load_mode(NULL);
    783        1.1    chopps 		}
    784        1.1    chopps 	}
    785        1.1    chopps 	if (DMDATA(mode)->current_view == v) {
    786        1.1    chopps 		DMDATA(mode)->current_view = NULL;
    787        1.1    chopps 	}
    788        1.1    chopps 	VDATA(v)->flags &= ~VF_DISPLAY;
    789        1.1    chopps }
    790        1.1    chopps 
    791        1.1    chopps dmode_t *
    792       1.21   aymeric cc_get_display_mode(view_t *v)
    793        1.1    chopps {
    794        1.1    chopps 	return (VDATA(v)->mode);
    795        1.1    chopps }
    796        1.1    chopps 
    797        1.1    chopps void
    798       1.21   aymeric cc_mode_vbl_handler(dmode_t *d)
    799        1.1    chopps {
    800        1.1    chopps 	u_short vp = ((custom.vposr & 0x0007) << 8) | ((custom.vhposr) >> 8);
    801        1.1    chopps 
    802        1.1    chopps 	if (vp < 12) {
    803        1.2    chopps 		custom.cop1lc = PREP_DMA_MEM(DMDATA(d)->frames[F_LONG]);
    804        1.1    chopps 		custom.copjmp1 = 0;
    805        1.1    chopps 	}
    806        1.1    chopps }
    807        1.1    chopps 
    808        1.1    chopps void
    809       1.21   aymeric cc_lace_mode_vbl_handler(dmode_t *d)
    810        1.1    chopps {
    811        1.1    chopps 	u_short vp = ((custom.vposr & 0x0007) << 8) | ((custom.vhposr) >> 8);
    812        1.1    chopps 
    813        1.1    chopps 	if (vp < 12) {
    814        1.1    chopps 		if (custom.vposr & 0x8000) {
    815        1.1    chopps 			custom.cop1lc = PREP_DMA_MEM(DMDATA(d)->frames[F_LACE_LONG]);
    816        1.1    chopps 		} else {
    817        1.1    chopps 			custom.cop1lc = PREP_DMA_MEM(DMDATA(d)->frames[F_LACE_SHORT]);
    818        1.1    chopps 		}
    819        1.1    chopps 		custom.copjmp1 = 0;
    820        1.1    chopps 	}
    821        1.1    chopps }
    822        1.1    chopps 
    823        1.1    chopps /*
    824        1.1    chopps  * Modes. (ick)
    825        1.1    chopps  */
    826        1.1    chopps 
    827        1.1    chopps /*
    828        1.1    chopps  * NTSC Modes
    829        1.1    chopps  */
    830        1.1    chopps 
    831        1.1    chopps #if defined (GRF_NTSC)
    832        1.1    chopps 
    833        1.1    chopps dmode_t *
    834       1.21   aymeric cc_init_ntsc_hires(void)
    835        1.1    chopps {
    836        1.4    chopps 	/* this function should only be called once. */
    837        1.1    chopps 	if (!h_this) {
    838        1.1    chopps 		u_short len = std_copper_list_len;
    839        1.1    chopps 
    840        1.1    chopps 		h_this = &hires_mode;
    841        1.1    chopps 		h_this_data = &hires_mode_data;
    842        1.1    chopps 		bzero(h_this, sizeof(dmode_t));
    843        1.1    chopps 		bzero(h_this_data, sizeof(dmdata_t));
    844        1.1    chopps 
    845        1.4    chopps 		h_this->name = "ntsc: hires";
    846        1.1    chopps 		h_this->nominal_size.width = 640;
    847        1.1    chopps 		h_this->nominal_size.height = 200;
    848        1.1    chopps 		h_this_data->max_size.width = 724;
    849        1.1    chopps 		h_this_data->max_size.height = 242;
    850        1.1    chopps 		h_this_data->min_size.width = 320;
    851        1.1    chopps 		h_this_data->min_size.height = 100;
    852        1.1    chopps 		h_this_data->min_depth = 1;
    853        1.1    chopps 		h_this_data->max_depth = 4;
    854        1.1    chopps 		h_this->data = h_this_data;
    855        1.1    chopps 
    856        1.1    chopps 		h_this->get_monitor = cc_get_monitor;
    857        1.1    chopps 		h_this->alloc_view = cc_alloc_view;
    858        1.1    chopps 		h_this->get_current_view = cc_get_current_view;
    859        1.1    chopps 
    860        1.1    chopps 		h_this_data->use_colormap = cc_use_colormap;
    861        1.1    chopps 		h_this_data->get_colormap = cc_get_colormap;
    862        1.1    chopps 		h_this_data->alloc_colormap = cc_alloc_colormap;
    863        1.1    chopps 		h_this_data->display_view = display_hires_view;
    864        1.1    chopps 		h_this_data->monitor = cc_monitor;
    865        1.1    chopps 
    866        1.1    chopps 		h_this_data->frames = hires_frames;
    867       1.11     veego 		h_this_data->frames[F_LONG] =
    868       1.11     veego 			alloc_chipmem(std_copper_list_size * F_TOTAL);
    869        1.1    chopps 		if (!h_this_data->frames[F_LONG]) {
    870        1.1    chopps 			panic("couldn't get chipmem for copper list");
    871        1.1    chopps 		}
    872       1.11     veego 		h_this_data->frames[F_STORE_LONG] =
    873       1.11     veego 			&h_this_data->frames[F_LONG][len];
    874        1.1    chopps 
    875       1.11     veego 		bcopy(std_copper_list, h_this_data->frames[F_STORE_LONG],
    876       1.11     veego 			std_copper_list_size);
    877       1.11     veego 		bcopy(std_copper_list, h_this_data->frames[F_LONG],
    878       1.11     veego 			std_copper_list_size);
    879        1.1    chopps 
    880        1.1    chopps 		h_this_data->bplcon0 = 0x8200 | USE_CON3;	/* hires, color
    881        1.4    chopps 								 * composite enable */
    882        1.1    chopps 		h_this_data->std_start_x = STANDARD_VIEW_X;
    883        1.1    chopps 		h_this_data->std_start_y = STANDARD_VIEW_Y;
    884       1.11     veego 		h_this_data->vbl_handler =
    885       1.11     veego 			(vbl_handler_func *) cc_mode_vbl_handler;
    886       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
    887        1.1    chopps 		h_this_data->beamcon0 = STANDARD_NTSC_BEAMCON;
    888        1.1    chopps #endif
    889        1.1    chopps 
    890        1.3    chopps 		LIST_INSERT_HEAD(&MDATA(cc_monitor)->modes, h_this, link);
    891        1.1    chopps 	}
    892        1.1    chopps 	return (h_this);
    893        1.1    chopps }
    894        1.1    chopps 
    895        1.1    chopps void
    896       1.21   aymeric display_hires_view(view_t *v)
    897        1.1    chopps {
    898        1.1    chopps 	if (h_this_data->current_view != v) {
    899        1.1    chopps 		vdata_t *vd = VDATA(v);
    900        1.1    chopps 		cop_t  *cp = h_this_data->frames[F_STORE_LONG], *tmp;
    901        1.1    chopps 		int     depth = v->bitmap->depth, i;
    902        1.1    chopps 		int     hstart, hstop, vstart, vstop, j;
    903        1.1    chopps 		int     x, y, w = v->display.width, h = v->display.height;
    904        1.1    chopps 		u_short ddfstart, ddfwidth, con1;
    905        1.1    chopps 
    906        1.1    chopps 		/* round down to nearest even width */
    907        1.1    chopps 		/* w &= 0xfffe; */
    908        1.1    chopps 		/* calculate datafetch width. */
    909        1.1    chopps 
    910        1.1    chopps 		ddfwidth = ((v->bitmap->bytes_per_row >> 1) - 2) << 2;
    911        1.1    chopps 
    912        1.4    chopps 		/* This will center the any overscanned display */
    913        1.1    chopps 		/* and allow user to modify. */
    914        1.1    chopps 		x = v->display.x + h_this_data->std_start_x - ((w - 640) >> 2);
    915        1.1    chopps 		y = v->display.y + h_this_data->std_start_y - ((h - 200) >> 1);
    916        1.1    chopps 
    917        1.1    chopps 		if (y & 1)
    918        1.1    chopps 			y--;
    919        1.1    chopps 
    920        1.1    chopps 		if (!(x & 1))
    921        1.1    chopps 			x--;
    922        1.1    chopps 
    923        1.1    chopps 		hstart = x;
    924        1.1    chopps 		hstop = x + (w >> 1);
    925        1.1    chopps 		vstart = y;
    926        1.1    chopps 		vstop = y + h;
    927        1.1    chopps 		ddfstart = (hstart - 9) >> 1;
    928        1.1    chopps 
    929        1.1    chopps 		/* check for hardware limits, AGA may allow more..? */
    930        1.1    chopps 		/* anyone got a 4000 I can borrow :^) -ch */
    931        1.1    chopps 		if ((ddfstart & 0xfffc) + ddfwidth > 0xd8) {
    932        1.1    chopps 			int     d = 0;
    933        1.1    chopps 
    934        1.1    chopps 			/* XXX anyone know the equality properties of
    935        1.1    chopps 			 * intermixed logial AND's */
    936        1.1    chopps 			/* XXX and arithmetic operators? */
    937        1.1    chopps 			while (((ddfstart & 0xfffc) + ddfwidth - d) > 0xd8) {
    938        1.1    chopps 				d++;
    939        1.1    chopps 			}
    940        1.1    chopps 
    941        1.1    chopps 			ddfstart -= d;
    942        1.1    chopps 			hstart -= d << 1;
    943        1.1    chopps 			hstop -= d << 1;
    944        1.1    chopps 		}
    945        1.1    chopps 		/* correct the datafetch to proper limits. */
    946        1.1    chopps 		/* delay the actual display of the data until we need it. */
    947        1.1    chopps 		ddfstart &= 0xfffc;
    948       1.11     veego 		con1 = ((hstart - 9) - (ddfstart << 1)) |
    949       1.11     veego 			(((hstart - 9) - (ddfstart << 1)) << 4);
    950        1.1    chopps 
    951        1.1    chopps 		if (h_this_data->current_view) {
    952       1.11     veego 			VDATA(h_this_data->current_view)->flags &=
    953       1.11     veego 				~VF_DISPLAY;	/* mark as no longer displayed. */
    954        1.1    chopps 		}
    955        1.1    chopps 		h_this_data->current_view = v;
    956        1.1    chopps 
    957        1.1    chopps 		cp = h_this_data->frames[F_STORE_LONG];
    958       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
    959        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON3));
    960        1.4    chopps 		tmp->cp.inst.operand = 0x0020;
    961  1.28.20.1        ad #if defined (GRF_AGA)
    962        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_FMODE));
    963        1.4    chopps 		tmp->cp.inst.operand = 0;
    964        1.4    chopps #endif
    965        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BEAMCON0));
    966        1.1    chopps 		tmp->cp.inst.operand = h_this_data->beamcon0;
    967        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWHIGH));
    968        1.1    chopps 		tmp->cp.inst.operand = CALC_DIWHIGH(hstart, vstart, hstop, vstop);
    969        1.1    chopps #endif /* ECS */
    970        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON0));
    971        1.1    chopps 		tmp->cp.inst.operand = h_this_data->bplcon0 | ((depth & 0x7) << 12);
    972        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON1));
    973        1.1    chopps 		tmp->cp.inst.operand = con1;
    974        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTART));
    975        1.1    chopps 		tmp->cp.inst.operand = ((vstart & 0xff) << 8) | (hstart & 0xff);
    976        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTOP));
    977        1.1    chopps 		tmp->cp.inst.operand = ((vstop & 0xff) << 8) | (hstop & 0xff);
    978        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTART));
    979        1.1    chopps 		tmp->cp.inst.operand = ddfstart;
    980        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTOP));
    981        1.1    chopps 		tmp->cp.inst.operand = ddfstart + ddfwidth;
    982        1.1    chopps 
    983        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
    984        1.1    chopps 		for (i = 0, j = 0; i < depth; j += 2, i++) {
    985        1.1    chopps 			/* update the plane pointers */
    986       1.11     veego 			tmp[j].cp.inst.operand =
    987       1.11     veego 				HIADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
    988       1.11     veego 			tmp[j + 1].cp.inst.operand =
    989       1.11     veego 				LOADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
    990        1.1    chopps 		}
    991        1.1    chopps 
    992        1.1    chopps 		/* set mods correctly. */
    993        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL1MOD));
    994        1.1    chopps 		tmp[0].cp.inst.operand = v->bitmap->row_mod;
    995        1.1    chopps 		tmp[1].cp.inst.operand = v->bitmap->row_mod;
    996        1.1    chopps 
    997        1.1    chopps 		/* set next pointers correctly */
    998        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
    999       1.11     veego 		tmp[0].cp.inst.operand =
   1000       1.11     veego 				HIADDR(PREP_DMA_MEM(h_this_data->frames[F_STORE_LONG]));
   1001       1.11     veego 		tmp[1].cp.inst.operand =
   1002       1.11     veego 				LOADDR(PREP_DMA_MEM(h_this_data->frames[F_STORE_LONG]));
   1003        1.1    chopps 
   1004        1.1    chopps 		cp = h_this_data->frames[F_LONG];
   1005        1.1    chopps 		h_this_data->frames[F_LONG] = h_this_data->frames[F_STORE_LONG];
   1006        1.1    chopps 		h_this_data->frames[F_STORE_LONG] = cp;
   1007        1.1    chopps 
   1008        1.1    chopps 		vd->flags |= VF_DISPLAY;
   1009        1.1    chopps 
   1010        1.1    chopps 		cc_use_colormap(v, vd->colormap);
   1011        1.1    chopps 	}
   1012        1.1    chopps 	cc_load_mode(h_this);
   1013        1.1    chopps }
   1014        1.1    chopps 
   1015        1.1    chopps dmode_t *
   1016       1.21   aymeric cc_init_ntsc_hires_lace(void)
   1017        1.1    chopps {
   1018        1.4    chopps 	/* this function should only be called once. */
   1019        1.1    chopps 	if (!hl_this) {
   1020        1.1    chopps 		u_short len = std_copper_list_len;
   1021        1.1    chopps 
   1022        1.1    chopps 		hl_this = &hires_lace_mode;
   1023        1.1    chopps 		hl_this_data = &hires_lace_mode_data;
   1024        1.1    chopps 		bzero(hl_this, sizeof(dmode_t));
   1025        1.1    chopps 		bzero(hl_this_data, sizeof(dmdata_t));
   1026        1.1    chopps 
   1027        1.1    chopps 		hl_this->name = "ntsc: hires interlace";
   1028        1.1    chopps 		hl_this->nominal_size.width = 640;
   1029        1.1    chopps 		hl_this->nominal_size.height = 400;
   1030        1.1    chopps 		hl_this_data->max_size.width = 724;
   1031        1.1    chopps 		hl_this_data->max_size.height = 482;
   1032        1.1    chopps 		hl_this_data->min_size.width = 320;
   1033        1.1    chopps 		hl_this_data->min_size.height = 200;
   1034        1.1    chopps 		hl_this_data->min_depth = 1;
   1035        1.1    chopps 		hl_this_data->max_depth = 4;
   1036        1.1    chopps 		hl_this->data = hl_this_data;
   1037        1.1    chopps 
   1038        1.1    chopps 		hl_this->get_monitor = cc_get_monitor;
   1039        1.1    chopps 		hl_this->alloc_view = cc_alloc_view;
   1040        1.1    chopps 		hl_this->get_current_view = cc_get_current_view;
   1041        1.1    chopps 
   1042        1.1    chopps 		hl_this_data->use_colormap = cc_use_colormap;
   1043        1.1    chopps 		hl_this_data->get_colormap = cc_get_colormap;
   1044        1.1    chopps 		hl_this_data->alloc_colormap = cc_alloc_colormap;
   1045        1.1    chopps 		hl_this_data->display_view = display_hires_lace_view;
   1046        1.1    chopps 		hl_this_data->monitor = cc_monitor;
   1047        1.1    chopps 
   1048        1.1    chopps 		hl_this_data->flags |= DMF_INTERLACE;
   1049        1.1    chopps 
   1050        1.1    chopps 		hl_this_data->frames = hires_lace_frames;
   1051       1.11     veego 		hl_this_data->frames[F_LACE_LONG] =
   1052       1.11     veego 				alloc_chipmem(std_copper_list_size * F_LACE_TOTAL);
   1053        1.1    chopps 		if (!hl_this_data->frames[F_LACE_LONG]) {
   1054        1.1    chopps 			panic("couldn't get chipmem for copper list");
   1055        1.1    chopps 		}
   1056       1.11     veego 		hl_this_data->frames[F_LACE_SHORT] =
   1057       1.11     veego 				&hl_this_data->frames[F_LACE_LONG][len];
   1058       1.11     veego 		hl_this_data->frames[F_LACE_STORE_LONG] =
   1059       1.11     veego 				&hl_this_data->frames[F_LACE_SHORT][len];
   1060       1.11     veego 		hl_this_data->frames[F_LACE_STORE_SHORT] =
   1061       1.11     veego 				&hl_this_data->frames[F_LACE_STORE_LONG][len];
   1062       1.11     veego 
   1063       1.11     veego 		bcopy(std_copper_list, hl_this_data->frames[F_LACE_STORE_LONG],
   1064       1.11     veego 			std_copper_list_size);
   1065       1.11     veego 		bcopy(std_copper_list, hl_this_data->frames[F_LACE_STORE_SHORT],
   1066       1.11     veego 			std_copper_list_size);
   1067       1.11     veego 		bcopy(std_copper_list, hl_this_data->frames[F_LACE_LONG],
   1068       1.11     veego 			std_copper_list_size);
   1069       1.11     veego 		bcopy(std_copper_list, hl_this_data->frames[F_LACE_SHORT],
   1070       1.11     veego 			std_copper_list_size);
   1071        1.1    chopps 
   1072        1.1    chopps 		hl_this_data->bplcon0 = 0x8204 | USE_CON3;	/* hires, color
   1073        1.1    chopps 								 * composite enable,
   1074        1.1    chopps 								 * lace. */
   1075        1.1    chopps 		hl_this_data->std_start_x = STANDARD_VIEW_X;
   1076        1.1    chopps 		hl_this_data->std_start_y = STANDARD_VIEW_Y;
   1077       1.11     veego 		hl_this_data->vbl_handler =
   1078       1.11     veego 			(vbl_handler_func *) cc_lace_mode_vbl_handler;
   1079       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   1080        1.1    chopps 		hl_this_data->beamcon0 = STANDARD_NTSC_BEAMCON;
   1081        1.1    chopps #endif
   1082        1.1    chopps 
   1083        1.3    chopps 		LIST_INSERT_HEAD(&MDATA(cc_monitor)->modes, hl_this, link);
   1084        1.1    chopps 	}
   1085        1.1    chopps 	return (hl_this);
   1086        1.1    chopps }
   1087        1.1    chopps 
   1088        1.1    chopps void
   1089       1.21   aymeric display_hires_lace_view(view_t *v)
   1090        1.1    chopps {
   1091        1.1    chopps 	if (hl_this_data->current_view != v) {
   1092        1.1    chopps 		vdata_t *vd = VDATA(v);
   1093        1.1    chopps 		cop_t  *cp = hl_this_data->frames[F_LACE_STORE_LONG], *tmp;
   1094        1.1    chopps 		int     depth = v->bitmap->depth, i;
   1095        1.1    chopps 		int     hstart, hstop, vstart, vstop, j;
   1096        1.1    chopps 		int     x, y, w = v->display.width, h = v->display.height;
   1097        1.1    chopps 		u_short ddfstart, ddfwidth, con1;
   1098        1.1    chopps 
   1099        1.1    chopps 		/* round down to nearest even width */
   1100        1.1    chopps 		/* w &= 0xfffe; */
   1101        1.1    chopps 
   1102        1.1    chopps 
   1103        1.1    chopps 		/* calculate datafetch width. */
   1104        1.1    chopps 
   1105        1.1    chopps 		ddfwidth = ((v->bitmap->bytes_per_row >> 1) - 2) << 2;
   1106        1.1    chopps 
   1107        1.4    chopps 		/* This will center the any overscanned display */
   1108        1.1    chopps 		/* and allow user to modify. */
   1109        1.1    chopps 		x = v->display.x + hl_this_data->std_start_x - ((w - 640) >> 2);
   1110        1.1    chopps 		y = v->display.y + hl_this_data->std_start_y - ((h - 400) >> 2);
   1111        1.1    chopps 
   1112        1.1    chopps 		if (y & 1)
   1113        1.1    chopps 			y--;
   1114        1.1    chopps 
   1115        1.1    chopps 		if (!(x & 1))
   1116        1.1    chopps 			x--;
   1117        1.1    chopps 
   1118        1.1    chopps 		hstart = x;
   1119        1.1    chopps 		hstop = x + (w >> 1);
   1120        1.1    chopps 		vstart = y;
   1121        1.1    chopps 		vstop = y + (h >> 1);
   1122        1.1    chopps 		ddfstart = (hstart - 9) >> 1;
   1123        1.1    chopps 
   1124        1.1    chopps 		/* check for hardware limits, AGA may allow more..? */
   1125        1.1    chopps 		/* anyone got a 4000 I can borrow :^) -ch */
   1126        1.1    chopps 		if ((ddfstart & 0xfffc) + ddfwidth > 0xd8) {
   1127        1.1    chopps 			int     d = 0;
   1128        1.1    chopps 
   1129        1.1    chopps 			/* XXX anyone know the equality properties of
   1130        1.1    chopps 			 * intermixed logial AND's */
   1131        1.1    chopps 			/* XXX and arithmetic operators? */
   1132        1.1    chopps 			while (((ddfstart & 0xfffc) + ddfwidth - d) > 0xd8) {
   1133        1.1    chopps 				d++;
   1134        1.1    chopps 			}
   1135        1.1    chopps 
   1136        1.1    chopps 			ddfstart -= d;
   1137        1.1    chopps 			hstart -= d << 1;
   1138        1.1    chopps 			hstop -= d << 1;
   1139        1.1    chopps 		}
   1140        1.1    chopps 		/* correct the datafetch to proper limits. */
   1141        1.1    chopps 		/* delay the actual display of the data until we need it. */
   1142        1.1    chopps 		ddfstart &= 0xfffc;
   1143       1.11     veego 		con1 = ((hstart - 9) - (ddfstart << 1)) |
   1144       1.11     veego 				(((hstart - 9) - (ddfstart << 1)) << 4);
   1145        1.1    chopps 
   1146        1.1    chopps 		if (hl_this_data->current_view) {
   1147       1.11     veego 			VDATA(hl_this_data->current_view)->flags &=
   1148       1.11     veego 				~VF_DISPLAY;	/* mark as no longer displayed. */
   1149        1.1    chopps 		}
   1150        1.1    chopps 		hl_this_data->current_view = v;
   1151        1.1    chopps 
   1152        1.1    chopps 		cp = hl_this_data->frames[F_LACE_STORE_LONG];
   1153       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   1154        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON3));
   1155        1.4    chopps 		tmp->cp.inst.operand = 0x0020;
   1156  1.28.20.1        ad #if defined (GRF_AGA)
   1157        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_FMODE));
   1158        1.4    chopps 		tmp->cp.inst.operand = 0;
   1159        1.4    chopps #endif
   1160        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BEAMCON0));
   1161        1.1    chopps 		tmp->cp.inst.operand = hl_this_data->beamcon0;
   1162        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWHIGH));
   1163        1.1    chopps 		tmp->cp.inst.operand = CALC_DIWHIGH(hstart, vstart, hstop, vstop);
   1164        1.1    chopps #endif /* ECS */
   1165        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON0));
   1166        1.1    chopps 		tmp->cp.inst.operand = hl_this_data->bplcon0 | ((depth & 0x7) << 12);
   1167        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON1));
   1168        1.1    chopps 		tmp->cp.inst.operand = con1;
   1169        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTART));
   1170        1.1    chopps 		tmp->cp.inst.operand = ((vstart & 0xff) << 8) | (hstart & 0xff);
   1171        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTOP));
   1172        1.1    chopps 		tmp->cp.inst.operand = ((vstop & 0xff) << 8) | (hstop & 0xff);
   1173        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTART));
   1174        1.1    chopps 		tmp->cp.inst.operand = ddfstart;
   1175        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTOP));
   1176        1.1    chopps 		tmp->cp.inst.operand = ddfstart + ddfwidth;
   1177        1.1    chopps 
   1178        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   1179        1.1    chopps 		for (i = 0, j = 0; i < depth; j += 2, i++) {
   1180        1.1    chopps 			/* update the plane pointers */
   1181       1.11     veego 			tmp[j].cp.inst.operand =
   1182       1.11     veego 				HIADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   1183       1.11     veego 			tmp[j + 1].cp.inst.operand =
   1184       1.11     veego 				LOADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   1185        1.1    chopps 		}
   1186        1.1    chopps 
   1187        1.1    chopps 		/* set mods correctly. */
   1188        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL1MOD));
   1189        1.1    chopps 		tmp[0].cp.inst.operand = v->bitmap->bytes_per_row + v->bitmap->row_mod;
   1190        1.1    chopps 		tmp[1].cp.inst.operand = v->bitmap->bytes_per_row + v->bitmap->row_mod;
   1191        1.1    chopps 
   1192        1.1    chopps 		/* set next pointers correctly */
   1193        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   1194       1.11     veego 		tmp[0].cp.inst.operand =
   1195       1.11     veego 			HIADDR(PREP_DMA_MEM(hl_this_data->frames[F_LACE_STORE_SHORT]));
   1196       1.11     veego 		tmp[1].cp.inst.operand =
   1197       1.11     veego 			LOADDR(PREP_DMA_MEM(hl_this_data->frames[F_LACE_STORE_SHORT]));
   1198        1.1    chopps 
   1199        1.1    chopps 
   1200       1.11     veego 		bcopy(hl_this_data->frames[F_LACE_STORE_LONG],
   1201       1.11     veego 			hl_this_data->frames[F_LACE_STORE_SHORT], std_copper_list_size);
   1202        1.1    chopps 
   1203        1.1    chopps 		/* these are the only ones that are different from long frame. */
   1204        1.1    chopps 		cp = hl_this_data->frames[F_LACE_STORE_SHORT];
   1205        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   1206        1.1    chopps 		for (i = 0, j = 0; i < depth; j += 2, i++) {
   1207        1.1    chopps 			u_short mod = v->bitmap->bytes_per_row + v->bitmap->row_mod;
   1208        1.1    chopps 			/* update plane pointers. high and low. */
   1209       1.11     veego 			tmp[j].cp.inst.operand =
   1210       1.11     veego 				HIADDR(PREP_DMA_MEM(&v->bitmap->plane[i][mod]));
   1211       1.11     veego 			tmp[j + 1].cp.inst.operand =
   1212       1.11     veego 				LOADDR(PREP_DMA_MEM(&v->bitmap->plane[i][mod]));
   1213        1.1    chopps 		}
   1214        1.1    chopps 
   1215        1.1    chopps 		/* set next pointers correctly */
   1216        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   1217       1.11     veego 		tmp[0].cp.inst.operand =
   1218       1.11     veego 			HIADDR(PREP_DMA_MEM(hl_this_data->frames[F_LACE_STORE_LONG]));
   1219       1.11     veego 		tmp[1].cp.inst.operand =
   1220       1.11     veego 			LOADDR(PREP_DMA_MEM(hl_this_data->frames[F_LACE_STORE_LONG]));
   1221        1.1    chopps 
   1222        1.1    chopps 
   1223        1.1    chopps 		cp = hl_this_data->frames[F_LACE_LONG];
   1224       1.11     veego 		hl_this_data->frames[F_LACE_LONG] =
   1225       1.11     veego 			hl_this_data->frames[F_LACE_STORE_LONG];
   1226        1.1    chopps 		hl_this_data->frames[F_LACE_STORE_LONG] = cp;
   1227        1.1    chopps 
   1228        1.1    chopps 		cp = hl_this_data->frames[F_LACE_SHORT];
   1229       1.11     veego 		hl_this_data->frames[F_LACE_SHORT] =
   1230       1.11     veego 			hl_this_data->frames[F_LACE_STORE_SHORT];
   1231        1.1    chopps 		hl_this_data->frames[F_LACE_STORE_SHORT] = cp;
   1232        1.1    chopps 
   1233        1.1    chopps 		vd->flags |= VF_DISPLAY;
   1234        1.1    chopps 
   1235        1.1    chopps 		cc_use_colormap(v, vd->colormap);
   1236        1.1    chopps 	}
   1237        1.1    chopps 	cc_load_mode(hl_this);
   1238        1.1    chopps }
   1239        1.1    chopps #if defined (GRF_A2024)
   1240        1.1    chopps 
   1241        1.1    chopps dmode_t *
   1242       1.21   aymeric cc_init_ntsc_hires_dlace(void)
   1243        1.1    chopps {
   1244        1.4    chopps 	/* this function should only be called once. */
   1245        1.1    chopps 	if (!hdl_this) {
   1246        1.1    chopps 		u_short len = std_dlace_copper_list_len;
   1247        1.1    chopps 
   1248        1.1    chopps 		hdl_this = &hires_dlace_mode;
   1249        1.1    chopps 		hdl_this_data = &hires_dlace_mode_data;
   1250        1.1    chopps 		bzero(hdl_this, sizeof(dmode_t));
   1251        1.1    chopps 		bzero(hdl_this_data, sizeof(dmdata_t));
   1252        1.1    chopps 
   1253        1.1    chopps 		hdl_this->name = "ntsc: hires double interlace";
   1254        1.1    chopps 		hdl_this->nominal_size.width = 640;
   1255        1.1    chopps 		hdl_this->nominal_size.height = 800;
   1256        1.1    chopps 		hdl_this_data->max_size.width = 724;
   1257        1.1    chopps 		hdl_this_data->max_size.height = 800;
   1258        1.1    chopps 		hdl_this_data->min_size.width = 320;
   1259        1.1    chopps 		hdl_this_data->min_size.height = 400;
   1260        1.1    chopps 		hdl_this_data->min_depth = 1;
   1261        1.1    chopps 		hdl_this_data->max_depth = 2;
   1262        1.1    chopps 		hdl_this->data = hdl_this_data;
   1263        1.1    chopps 
   1264        1.1    chopps 		hdl_this->get_monitor = cc_get_monitor;
   1265        1.1    chopps 		hdl_this->alloc_view = cc_alloc_view;
   1266        1.1    chopps 		hdl_this->get_current_view = cc_get_current_view;
   1267        1.1    chopps 
   1268        1.1    chopps 		hdl_this_data->use_colormap = cc_a2024_use_colormap;
   1269        1.1    chopps 		hdl_this_data->get_colormap = cc_a2024_get_colormap;
   1270        1.1    chopps 		hdl_this_data->alloc_colormap = cc_a2024_alloc_colormap;
   1271        1.1    chopps 		hdl_this_data->display_view = display_hires_dlace_view;
   1272        1.1    chopps 		hdl_this_data->monitor = cc_monitor;
   1273        1.1    chopps 
   1274        1.1    chopps 		hdl_this_data->flags |= DMF_INTERLACE;
   1275        1.1    chopps 
   1276        1.1    chopps 		hdl_this_data->frames = hires_dlace_frames;
   1277       1.11     veego 		hdl_this_data->frames[F_LACE_LONG] =
   1278       1.11     veego 			alloc_chipmem(std_dlace_copper_list_size * F_LACE_TOTAL);
   1279        1.1    chopps 		if (!hdl_this_data->frames[F_LACE_LONG]) {
   1280        1.1    chopps 			panic("couldn't get chipmem for copper list");
   1281        1.1    chopps 		}
   1282       1.11     veego 		hdl_this_data->frames[F_LACE_SHORT] =
   1283       1.11     veego 			&hdl_this_data->frames[F_LACE_LONG][len];
   1284       1.11     veego 		hdl_this_data->frames[F_LACE_STORE_LONG] =
   1285       1.11     veego 			&hdl_this_data->frames[F_LACE_SHORT][len];
   1286       1.11     veego 		hdl_this_data->frames[F_LACE_STORE_SHORT] =
   1287       1.11     veego 			&hdl_this_data->frames[F_LACE_STORE_LONG][len];
   1288       1.11     veego 
   1289       1.11     veego 		bcopy(std_dlace_copper_list,
   1290       1.11     veego 			hdl_this_data->frames[F_LACE_STORE_LONG],
   1291       1.11     veego 			std_dlace_copper_list_size);
   1292       1.11     veego 		bcopy(std_dlace_copper_list,
   1293       1.11     veego 			hdl_this_data->frames[F_LACE_STORE_SHORT],
   1294       1.11     veego 			std_dlace_copper_list_size);
   1295       1.11     veego 		bcopy(std_dlace_copper_list,
   1296       1.11     veego 			hdl_this_data->frames[F_LACE_LONG],
   1297       1.11     veego 			std_dlace_copper_list_size);
   1298       1.11     veego 		bcopy(std_dlace_copper_list,
   1299       1.11     veego 			hdl_this_data->frames[F_LACE_SHORT],
   1300       1.11     veego 			std_dlace_copper_list_size);
   1301        1.1    chopps 
   1302        1.1    chopps 		hdl_this_data->bplcon0 = 0x8204 | USE_CON3;	/* hires, color
   1303        1.1    chopps 								 * composite enable,
   1304        1.1    chopps 								 * dlace. */
   1305        1.1    chopps 		hdl_this_data->std_start_x = STANDARD_VIEW_X;
   1306        1.1    chopps 		hdl_this_data->std_start_y = STANDARD_VIEW_Y;
   1307       1.11     veego 		hdl_this_data->vbl_handler =
   1308       1.11     veego 			(vbl_handler_func *) cc_lace_mode_vbl_handler;
   1309       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   1310        1.1    chopps 		hdl_this_data->beamcon0 = STANDARD_NTSC_BEAMCON;
   1311        1.1    chopps #endif
   1312        1.3    chopps 		LIST_INSERT_HEAD(&MDATA(cc_monitor)->modes, hdl_this, link);
   1313        1.1    chopps 	}
   1314        1.1    chopps 	return (hdl_this);
   1315        1.1    chopps }
   1316        1.1    chopps 
   1317        1.1    chopps void
   1318       1.21   aymeric display_hires_dlace_view(view_t *v)
   1319        1.1    chopps {
   1320        1.1    chopps 	if (hdl_this_data->current_view != v) {
   1321        1.1    chopps 		vdata_t *vd = VDATA(v);
   1322        1.1    chopps 		cop_t  *cp = hdl_this_data->frames[F_LACE_STORE_LONG], *tmp;
   1323       1.11     veego 		int     depth = v->bitmap->depth;
   1324       1.11     veego 		int     hstart, hstop, vstart, vstop;
   1325        1.1    chopps 		int     x, y, w = v->display.width, h = v->display.height;
   1326        1.1    chopps 		u_short ddfstart, ddfwidth, con1;
   1327        1.1    chopps 		u_short mod1l, mod2l;
   1328        1.1    chopps 
   1329        1.1    chopps 		/* round down to nearest even width */
   1330        1.1    chopps 		/* w &= 0xfffe; */
   1331        1.1    chopps 
   1332        1.1    chopps 		/* calculate datafetch width. */
   1333        1.1    chopps 
   1334        1.1    chopps 		ddfwidth = ((v->bitmap->bytes_per_row >> 1) - 2) << 2;
   1335        1.1    chopps 
   1336        1.4    chopps 		/* This will center the any overscanned display */
   1337        1.1    chopps 		/* and allow user to modify. */
   1338        1.1    chopps 		x = v->display.x + hdl_this_data->std_start_x - ((w - 640) >> 2);
   1339        1.1    chopps 		y = v->display.y + hdl_this_data->std_start_y - ((h - 800) >> 3);
   1340        1.1    chopps 
   1341        1.1    chopps 		if (y & 1)
   1342        1.1    chopps 			y--;
   1343        1.1    chopps 
   1344        1.1    chopps 		if (!(x & 1))
   1345        1.1    chopps 			x--;
   1346        1.1    chopps 
   1347        1.1    chopps 		hstart = x;
   1348        1.1    chopps 		hstop = x + (w >> 1);
   1349        1.1    chopps 		vstart = y;
   1350        1.1    chopps 		vstop = y + (h >> 2);
   1351        1.1    chopps 
   1352        1.1    chopps 		ddfstart = (hstart - 9) >> 1;
   1353        1.1    chopps 
   1354        1.1    chopps 		/* check for hardware limits, AGA may allow more..? */
   1355        1.1    chopps 		/* anyone got a 4000 I can borrow :^) -ch */
   1356        1.1    chopps 		if ((ddfstart & 0xfffc) + ddfwidth > 0xd8) {
   1357        1.1    chopps 			int     d = 0;
   1358        1.1    chopps 
   1359        1.1    chopps 			/* XXX anyone know the equality properties of
   1360        1.1    chopps 			 * intermixed logial AND's */
   1361        1.1    chopps 			/* XXX and arithmetic operators? */
   1362        1.1    chopps 			while (((ddfstart & 0xfffc) + ddfwidth - d) > 0xd8) {
   1363        1.1    chopps 				d++;
   1364        1.1    chopps 			}
   1365        1.1    chopps 
   1366        1.1    chopps 			ddfstart -= d;
   1367        1.1    chopps 			hstart -= d << 1;
   1368        1.1    chopps 			hstop -= d << 1;
   1369        1.1    chopps 		}
   1370        1.1    chopps 		/* correct the datafetch to proper limits. */
   1371        1.1    chopps 		/* delay the actual display of the data until we need it. */
   1372        1.1    chopps 		ddfstart &= 0xfffc;
   1373       1.11     veego 		con1 = ((hstart - 9) - (ddfstart << 1)) |
   1374       1.11     veego 			(((hstart - 9) - (ddfstart << 1)) << 4);
   1375        1.1    chopps 
   1376        1.1    chopps 		if (hdl_this_data->current_view) {
   1377       1.11     veego 			VDATA(hdl_this_data->current_view)->flags &=
   1378       1.11     veego 				~VF_DISPLAY;	/* mark as no longer displayed. */
   1379        1.1    chopps 		}
   1380        1.1    chopps 		hdl_this_data->current_view = v;
   1381        1.1    chopps 
   1382        1.1    chopps 		cp = hdl_this_data->frames[F_LACE_STORE_LONG];
   1383       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   1384        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON3));
   1385        1.4    chopps 		tmp->cp.inst.operand = 0x0020;
   1386  1.28.20.1        ad #if defined (GRF_AGA)
   1387        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_FMODE));
   1388        1.4    chopps 		tmp->cp.inst.operand = 0;
   1389        1.4    chopps #endif
   1390        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BEAMCON0));
   1391        1.1    chopps 		tmp->cp.inst.operand = hdl_this_data->beamcon0;
   1392        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWHIGH));
   1393        1.1    chopps 		tmp->cp.inst.operand = CALC_DIWHIGH(hstart, vstart, hstop, vstop);
   1394        1.1    chopps #endif /* ECS */
   1395        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON0));
   1396       1.11     veego 		tmp->cp.inst.operand =
   1397       1.11     veego 			hdl_this_data->bplcon0 | ((depth & 0x7) << 13);	/* times two. */
   1398        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON1));
   1399        1.1    chopps 		tmp->cp.inst.operand = con1;
   1400        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTART));
   1401        1.1    chopps 		tmp->cp.inst.operand = ((vstart & 0xff) << 8) | (hstart & 0xff);
   1402        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTOP));
   1403        1.1    chopps 		tmp->cp.inst.operand = ((vstop & 0xff) << 8) | (hstop & 0xff);
   1404        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTART));
   1405        1.1    chopps 		tmp->cp.inst.operand = ddfstart;
   1406        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTOP));
   1407        1.1    chopps 		tmp->cp.inst.operand = ddfstart + ddfwidth;
   1408        1.1    chopps 
   1409        1.1    chopps 		mod1l = v->bitmap->bytes_per_row + v->bitmap->row_mod;
   1410        1.1    chopps 		mod2l = mod1l << 1;
   1411        1.1    chopps 
   1412        1.1    chopps 		/* update plane pointers. */
   1413        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   1414       1.11     veego 		tmp[0].cp.inst.operand =
   1415       1.11     veego 			HIADDR(PREP_DMA_MEM(&v->bitmap->plane[0][0]));
   1416       1.11     veego 		tmp[1].cp.inst.operand =
   1417       1.11     veego 			LOADDR(PREP_DMA_MEM(&v->bitmap->plane[0][0]));
   1418       1.11     veego 		tmp[2].cp.inst.operand =
   1419       1.11     veego 			HIADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod1l]));
   1420       1.11     veego 		tmp[3].cp.inst.operand =
   1421       1.11     veego 			LOADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod1l]));
   1422        1.1    chopps 		if (depth == 2) {
   1423       1.11     veego 			tmp[4].cp.inst.operand =
   1424       1.11     veego 				HIADDR(PREP_DMA_MEM(&v->bitmap->plane[1][0]));
   1425       1.11     veego 			tmp[5].cp.inst.operand =
   1426       1.11     veego 				LOADDR(PREP_DMA_MEM(&v->bitmap->plane[1][0]));
   1427       1.11     veego 			tmp[6].cp.inst.operand =
   1428       1.11     veego 				HIADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod1l]));
   1429       1.11     veego 			tmp[7].cp.inst.operand =
   1430       1.11     veego 				LOADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod1l]));
   1431        1.1    chopps 		}
   1432        1.1    chopps 		/* set modulos. */
   1433        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL1MOD));
   1434        1.1    chopps 		tmp[0].cp.inst.operand = mod2l + mod1l;
   1435        1.1    chopps 		tmp[1].cp.inst.operand = mod2l + mod1l;
   1436        1.1    chopps 
   1437        1.1    chopps 
   1438        1.1    chopps 		/* set next coper list pointers */
   1439        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   1440       1.11     veego 		tmp[0].cp.inst.operand =
   1441       1.11     veego 			HIADDR(PREP_DMA_MEM(hdl_this_data->frames[F_LACE_STORE_SHORT]));
   1442       1.11     veego 		tmp[1].cp.inst.operand =
   1443       1.11     veego 			LOADDR(PREP_DMA_MEM(hdl_this_data->frames[F_LACE_STORE_SHORT]));
   1444       1.11     veego 
   1445       1.11     veego 		bcopy(hdl_this_data->frames[F_LACE_STORE_LONG],
   1446       1.11     veego 			hdl_this_data->frames[F_LACE_STORE_SHORT],
   1447       1.11     veego 			std_dlace_copper_list_size);
   1448        1.1    chopps 
   1449        1.1    chopps 		/* these are the only ones that are different from long frame. */
   1450        1.1    chopps 		cp = hdl_this_data->frames[F_LACE_STORE_SHORT];
   1451        1.1    chopps 		/* update plane pointers. */
   1452        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   1453       1.11     veego 		tmp[0].cp.inst.operand =
   1454       1.11     veego 			HIADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod2l]));
   1455       1.11     veego 		tmp[1].cp.inst.operand =
   1456       1.11     veego 			LOADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod2l]));
   1457       1.11     veego 		tmp[2].cp.inst.operand =
   1458       1.11     veego 			HIADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod2l + mod1l]));
   1459       1.11     veego 		tmp[3].cp.inst.operand =
   1460       1.11     veego 			LOADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod2l + mod1l]));
   1461        1.1    chopps 		if (depth == 2) {
   1462       1.11     veego 			tmp[4].cp.inst.operand =
   1463       1.11     veego 				HIADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod2l]));
   1464       1.11     veego 			tmp[5].cp.inst.operand =
   1465       1.11     veego 				LOADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod2l]));
   1466       1.11     veego 			tmp[6].cp.inst.operand =
   1467       1.11     veego 				HIADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod2l + mod1l]));
   1468       1.11     veego 			tmp[7].cp.inst.operand =
   1469       1.11     veego 				LOADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod2l + mod1l]));
   1470        1.1    chopps 		}
   1471        1.1    chopps 		/* set next copper list pointers */
   1472        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   1473       1.11     veego 		tmp[0].cp.inst.operand =
   1474       1.11     veego 			HIADDR(PREP_DMA_MEM(hdl_this_data->frames[F_LACE_STORE_LONG]));
   1475       1.11     veego 		tmp[1].cp.inst.operand =
   1476       1.11     veego 			LOADDR(PREP_DMA_MEM(hdl_this_data->frames[F_LACE_STORE_LONG]));
   1477        1.1    chopps 
   1478        1.1    chopps 		cp = hdl_this_data->frames[F_LACE_LONG];
   1479       1.11     veego 		hdl_this_data->frames[F_LACE_LONG] =
   1480       1.11     veego 			hdl_this_data->frames[F_LACE_STORE_LONG];
   1481        1.1    chopps 		hdl_this_data->frames[F_LACE_STORE_LONG] = cp;
   1482        1.1    chopps 
   1483        1.1    chopps 		cp = hdl_this_data->frames[F_LACE_SHORT];
   1484       1.11     veego 		hdl_this_data->frames[F_LACE_SHORT] =
   1485       1.11     veego 			hdl_this_data->frames[F_LACE_STORE_SHORT];
   1486        1.1    chopps 		hdl_this_data->frames[F_LACE_STORE_SHORT] = cp;
   1487        1.1    chopps 
   1488        1.1    chopps 		vd->flags |= VF_DISPLAY;
   1489        1.1    chopps 		cc_a2024_use_colormap(v, vd->colormap);
   1490        1.1    chopps 	}
   1491        1.1    chopps 	cc_load_mode(hdl_this);
   1492        1.1    chopps }
   1493        1.1    chopps 
   1494        1.1    chopps 
   1495        1.1    chopps dmode_t *
   1496       1.21   aymeric cc_init_ntsc_a2024(void)
   1497        1.1    chopps {
   1498        1.4    chopps 	/* this function should only be called once. */
   1499        1.1    chopps 	if (!a24_this) {
   1500        1.1    chopps 		int     i;
   1501        1.1    chopps 		u_short len = std_a2024_copper_list_len;
   1502        1.1    chopps 		cop_t  *cp;
   1503        1.1    chopps 
   1504        1.1    chopps 		a24_this = &a2024_mode;
   1505        1.1    chopps 		a24_this_data = &a2024_mode_data;
   1506        1.1    chopps 		bzero(a24_this, sizeof(dmode_t));
   1507        1.1    chopps 		bzero(a24_this_data, sizeof(dmdata_t));
   1508        1.1    chopps 
   1509       1.28     lukem 		a24_this->name = "ntsc: A2024 15 kHz";
   1510        1.1    chopps 		a24_this->nominal_size.width = 1024;
   1511        1.1    chopps 		a24_this->nominal_size.height = 800;
   1512        1.1    chopps 		a24_this_data->max_size.width = 1024;
   1513        1.1    chopps 		a24_this_data->max_size.height = 800;
   1514        1.1    chopps 		a24_this_data->min_size.width = 1024;
   1515        1.1    chopps 		a24_this_data->min_size.height = 800;
   1516        1.1    chopps 		a24_this_data->min_depth = 1;
   1517        1.1    chopps 		a24_this_data->max_depth = 2;
   1518        1.1    chopps 		a24_this->data = a24_this_data;
   1519        1.1    chopps 
   1520        1.1    chopps 		a24_this->get_monitor = cc_get_monitor;
   1521        1.1    chopps 		a24_this->alloc_view = cc_alloc_view;
   1522        1.1    chopps 		a24_this->get_current_view = cc_get_current_view;
   1523        1.1    chopps 
   1524        1.1    chopps 		a24_this_data->use_colormap = cc_a2024_use_colormap;
   1525        1.1    chopps 		a24_this_data->get_colormap = cc_a2024_get_colormap;
   1526        1.1    chopps 		a24_this_data->display_view = display_a2024_view;
   1527        1.1    chopps 		a24_this_data->alloc_colormap = cc_a2024_alloc_colormap;
   1528        1.1    chopps 		a24_this_data->monitor = cc_monitor;
   1529        1.1    chopps 
   1530        1.1    chopps 		a24_this_data->flags |= DMF_HEDLEY_EXP;
   1531        1.1    chopps 
   1532        1.1    chopps 		a24_this_data->frames = a2024_frames;
   1533       1.11     veego 		a24_this_data->frames[F_QD_QUAD0] =
   1534       1.11     veego 			alloc_chipmem(std_a2024_copper_list_size * F_QD_TOTAL);
   1535        1.1    chopps 		if (!a24_this_data->frames[F_QD_QUAD0]) {
   1536        1.1    chopps 			panic("couldn't get chipmem for copper list");
   1537        1.1    chopps 		}
   1538        1.1    chopps 		/* setup the hedley init bitplane. */
   1539        1.1    chopps 		hedley_init = alloc_chipmem(128);
   1540        1.1    chopps 		if (!hedley_init) {
   1541        1.1    chopps 			panic("couldn't get chipmem for hedley init bitplane");
   1542        1.1    chopps 		}
   1543        1.1    chopps 		for (i = 1; i < 128; i++)
   1544        1.1    chopps 			hedley_init[i] = 0xff;
   1545        1.1    chopps 		hedley_init[0] = 0x03;
   1546        1.1    chopps 
   1547        1.1    chopps 		/* copy image of standard copper list. */
   1548       1.11     veego 		bcopy(std_a2024_copper_list, a24_this_data->frames[0],
   1549       1.11     veego 			std_a2024_copper_list_size);
   1550        1.1    chopps 
   1551        1.1    chopps 		/* set the init plane pointer. */
   1552       1.11     veego 		cp = find_copper_inst(a24_this_data->frames[F_QD_QUAD0],
   1553       1.11     veego 					CI_MOVE(R_BPL0PTH));
   1554        1.1    chopps 		cp[0].cp.inst.operand = HIADDR(PREP_DMA_MEM(hedley_init));
   1555        1.1    chopps 		cp[1].cp.inst.operand = LOADDR(PREP_DMA_MEM(hedley_init));
   1556        1.1    chopps 
   1557        1.1    chopps 		for (i = 1; i < F_QD_TOTAL; i++) {
   1558        1.1    chopps 			a24_this_data->frames[i] = &a24_this_data->frames[i - 1][len];
   1559       1.11     veego 			bcopy(a24_this_data->frames[0],
   1560       1.11     veego 				a24_this_data->frames[i],
   1561       1.11     veego 				std_a2024_copper_list_size);
   1562        1.1    chopps 		}
   1563        1.1    chopps 
   1564        1.1    chopps 		a24_this_data->bplcon0 = 0x8200;	/* hires */
   1565       1.11     veego 		a24_this_data->vbl_handler =
   1566       1.11     veego 			(vbl_handler_func *) a2024_mode_vbl_handler;
   1567        1.1    chopps 
   1568        1.1    chopps 
   1569        1.3    chopps 		LIST_INSERT_HEAD(&MDATA(cc_monitor)->modes, a24_this, link);
   1570        1.1    chopps 	}
   1571        1.1    chopps 	return (a24_this);
   1572        1.1    chopps }
   1573        1.1    chopps 
   1574        1.1    chopps void
   1575       1.21   aymeric display_a2024_view(view_t *v)
   1576        1.1    chopps {
   1577        1.1    chopps 	if (a24_this_data->current_view != v) {
   1578        1.1    chopps 		vdata_t *vd = VDATA(v);
   1579        1.1    chopps 		cop_t  *cp, *tmp;
   1580        1.1    chopps 		u_char *inst_plane[2];
   1581        1.1    chopps 		u_char **plane = inst_plane;
   1582        1.1    chopps 		u_long  full_line = v->bitmap->bytes_per_row + v->bitmap->row_mod;
   1583        1.1    chopps 		u_long  half_plane = full_line * v->bitmap->rows / 2;
   1584        1.1    chopps 
   1585        1.1    chopps 		int     depth = v->bitmap->depth, i, j;
   1586        1.1    chopps 
   1587        1.1    chopps 		plane[0] = v->bitmap->plane[0];
   1588        1.1    chopps 		if (depth == 2) {
   1589        1.1    chopps 			plane[1] = v->bitmap->plane[1];
   1590        1.1    chopps 		}
   1591        1.1    chopps 		if (a24_this_data->current_view) {
   1592       1.11     veego 			VDATA(a24_this_data->current_view)->flags &=
   1593       1.11     veego 				~VF_DISPLAY;	/* mark as no longer displayed. */
   1594        1.1    chopps 		}
   1595        1.1    chopps 		cp = a24_this_data->frames[F_QD_STORE_QUAD0];
   1596        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COLOR1F));
   1597       1.11     veego 		tmp = find_copper_inst(tmp, CI_MOVE(R_BPLCON0)); /* grab third one. */
   1598       1.11     veego 		tmp->cp.inst.operand = a24_this_data->bplcon0 |
   1599       1.11     veego 					((depth & 0x7) << 13);	/* times 2 */
   1600       1.11     veego 
   1601       1.11     veego 		bcopy(a24_this_data->frames[F_QD_STORE_QUAD0],
   1602       1.11     veego 			a24_this_data->frames[F_QD_STORE_QUAD1],
   1603       1.11     veego 			std_a2024_copper_list_size);
   1604       1.11     veego 		bcopy(a24_this_data->frames[F_QD_STORE_QUAD0],
   1605       1.11     veego 			a24_this_data->frames[F_QD_STORE_QUAD2],
   1606       1.11     veego 			std_a2024_copper_list_size);
   1607       1.11     veego 		bcopy(a24_this_data->frames[F_QD_STORE_QUAD0],
   1608       1.11     veego 			a24_this_data->frames[F_QD_STORE_QUAD3],
   1609       1.11     veego 			std_a2024_copper_list_size);
   1610        1.1    chopps 
   1611        1.1    chopps 		/*
   1612        1.1    chopps 		 * Mark Id's
   1613        1.1    chopps 		 */
   1614       1.11     veego 		tmp = find_copper_inst(a24_this_data->frames[F_QD_STORE_QUAD1],
   1615       1.11     veego 			CI_WAIT(126, 21));
   1616        1.1    chopps 		CBUMP(tmp);
   1617        1.1    chopps 		CMOVE(tmp, R_COLOR01, QUAD1_ID);
   1618       1.11     veego 		tmp = find_copper_inst(a24_this_data->frames[F_QD_STORE_QUAD2],
   1619       1.11     veego 			CI_WAIT(126, 21));
   1620        1.1    chopps 		CBUMP(tmp);
   1621        1.1    chopps 		CMOVE(tmp, R_COLOR01, QUAD2_ID);
   1622       1.11     veego 		tmp = find_copper_inst(a24_this_data->frames[F_QD_STORE_QUAD3],
   1623       1.11     veego 			CI_WAIT(126, 21));
   1624        1.1    chopps 		CBUMP(tmp);
   1625        1.1    chopps 		CMOVE(tmp, R_COLOR01, QUAD3_ID);
   1626        1.1    chopps 
   1627        1.1    chopps 		plane[0]--;
   1628        1.1    chopps 		plane[0]--;
   1629        1.1    chopps 		if (depth == 2) {
   1630        1.1    chopps 			plane[1]--;
   1631        1.1    chopps 			plane[1]--;
   1632        1.1    chopps 		}
   1633        1.1    chopps 		/*
   1634        1.1    chopps 		 * Set bitplane pointers.
   1635        1.1    chopps 		 */
   1636       1.11     veego 		tmp = find_copper_inst(a24_this_data->frames[F_QD_STORE_QUAD0],
   1637       1.11     veego 			CI_MOVE(R_BPLMOD2));
   1638        1.1    chopps 		CBUMP(tmp);
   1639        1.1    chopps 		CMOVE(tmp, R_BPL0PTH, HIADDR(PREP_DMA_MEM(&plane[0][0])));
   1640        1.1    chopps 		CMOVE(tmp, R_BPL0PTL, LOADDR(PREP_DMA_MEM(&plane[0][0])));
   1641        1.1    chopps 		CMOVE(tmp, R_BPL1PTH, HIADDR(PREP_DMA_MEM(&plane[0][full_line])));
   1642        1.1    chopps 		CMOVE(tmp, R_BPL1PTL, LOADDR(PREP_DMA_MEM(&plane[0][full_line])));
   1643        1.1    chopps 		if (depth == 2) {
   1644        1.1    chopps 			CMOVE(tmp, R_BPL2PTH, HIADDR(PREP_DMA_MEM(&plane[1][0])));
   1645        1.1    chopps 			CMOVE(tmp, R_BPL2PTL, LOADDR(PREP_DMA_MEM(&plane[1][0])));
   1646        1.1    chopps 			CMOVE(tmp, R_BPL3PTH, HIADDR(PREP_DMA_MEM(&plane[1][full_line])));
   1647        1.1    chopps 			CMOVE(tmp, R_BPL3PTL, LOADDR(PREP_DMA_MEM(&plane[1][full_line])));
   1648        1.1    chopps 		}
   1649       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   1650        1.1    chopps 		CMOVE(tmp, R_DIWHIGH, 0x2000);
   1651        1.1    chopps #endif
   1652       1.11     veego 		CMOVE(tmp, R_COP1LCH,
   1653       1.11     veego 			HIADDR(PREP_DMA_MEM(a24_this_data->frames[F_QD_STORE_QUAD1])));
   1654       1.11     veego 		CMOVE(tmp, R_COP1LCL,
   1655       1.11     veego 			LOADDR(PREP_DMA_MEM(a24_this_data->frames[F_QD_STORE_QUAD1])));
   1656        1.1    chopps 		CEND(tmp);
   1657        1.1    chopps 		CEND(tmp);
   1658        1.1    chopps 
   1659       1.11     veego 		tmp = find_copper_inst(a24_this_data->frames[F_QD_STORE_QUAD1],
   1660       1.11     veego 					CI_MOVE(R_BPLMOD2));
   1661        1.1    chopps 		CBUMP(tmp);
   1662       1.11     veego 		CMOVE(tmp, R_BPL0PTH,
   1663       1.11     veego 			HIADDR(PREP_DMA_MEM(&plane[0][HALF_2024_LINE])));
   1664       1.11     veego 		CMOVE(tmp, R_BPL0PTL,
   1665       1.11     veego 			LOADDR(PREP_DMA_MEM(&plane[0][HALF_2024_LINE])));
   1666       1.11     veego 		CMOVE(tmp, R_BPL1PTH,
   1667       1.11     veego 			HIADDR(PREP_DMA_MEM(&plane[0][full_line + HALF_2024_LINE])));
   1668       1.11     veego 		CMOVE(tmp, R_BPL1PTL,
   1669       1.11     veego 			LOADDR(PREP_DMA_MEM(&plane[0][full_line + HALF_2024_LINE])));
   1670        1.1    chopps 		if (depth == 2) {
   1671       1.11     veego 			CMOVE(tmp, R_BPL2PTH,
   1672       1.11     veego 				HIADDR(PREP_DMA_MEM(&plane[1][HALF_2024_LINE])));
   1673       1.11     veego 			CMOVE(tmp, R_BPL2PTL,
   1674       1.11     veego 				LOADDR(PREP_DMA_MEM(&plane[1][HALF_2024_LINE])));
   1675       1.11     veego 			CMOVE(tmp, R_BPL3PTH,
   1676       1.11     veego 				HIADDR(PREP_DMA_MEM(&plane[1][full_line + HALF_2024_LINE])));
   1677       1.11     veego 			CMOVE(tmp, R_BPL3PTL,
   1678       1.11     veego 				LOADDR(PREP_DMA_MEM(&plane[1][full_line + HALF_2024_LINE])));
   1679        1.1    chopps 		}
   1680       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   1681        1.1    chopps 		CMOVE(tmp, R_DIWHIGH, 0x2000);
   1682        1.1    chopps #endif
   1683       1.11     veego 		CMOVE(tmp, R_COP1LCH,
   1684       1.11     veego 			HIADDR(PREP_DMA_MEM(a24_this_data->frames[F_QD_STORE_QUAD2])));
   1685       1.11     veego 		CMOVE(tmp, R_COP1LCL,
   1686       1.11     veego 			LOADDR(PREP_DMA_MEM(a24_this_data->frames[F_QD_STORE_QUAD2])));
   1687        1.1    chopps 		CEND(tmp);
   1688        1.1    chopps 		CEND(tmp);
   1689        1.1    chopps 
   1690       1.11     veego 		tmp = find_copper_inst(a24_this_data->frames[F_QD_STORE_QUAD2],
   1691       1.11     veego 					CI_MOVE(R_BPLMOD2));
   1692        1.1    chopps 		CBUMP(tmp);
   1693       1.11     veego 		CMOVE(tmp, R_BPL0PTH,
   1694       1.11     veego 			HIADDR(PREP_DMA_MEM(&plane[0][half_plane])));
   1695       1.11     veego 		CMOVE(tmp, R_BPL0PTL,
   1696       1.11     veego 			LOADDR(PREP_DMA_MEM(&plane[0][half_plane])));
   1697       1.11     veego 		CMOVE(tmp, R_BPL1PTH,
   1698       1.11     veego 			HIADDR(PREP_DMA_MEM(&plane[0][half_plane + full_line])));
   1699       1.11     veego 		CMOVE(tmp, R_BPL1PTL,
   1700       1.11     veego 			LOADDR(PREP_DMA_MEM(&plane[0][half_plane + full_line])));
   1701        1.1    chopps 		if (depth == 2) {
   1702       1.11     veego 			CMOVE(tmp, R_BPL2PTH,
   1703       1.11     veego 				HIADDR(PREP_DMA_MEM(&plane[1][half_plane])));
   1704       1.11     veego 			CMOVE(tmp, R_BPL2PTL,
   1705       1.11     veego 				LOADDR(PREP_DMA_MEM(&plane[1][half_plane])));
   1706       1.11     veego 			CMOVE(tmp, R_BPL3PTH,
   1707       1.11     veego 				HIADDR(PREP_DMA_MEM(&plane[1][half_plane + full_line])));
   1708       1.11     veego 			CMOVE(tmp, R_BPL3PTL,
   1709       1.11     veego 				LOADDR(PREP_DMA_MEM(&plane[1][half_plane + full_line])));
   1710        1.1    chopps 		}
   1711       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   1712        1.1    chopps 		CMOVE(tmp, R_DIWHIGH, 0x2000);
   1713        1.1    chopps #endif
   1714       1.11     veego 		CMOVE(tmp, R_COP1LCH,
   1715       1.11     veego 			HIADDR(PREP_DMA_MEM(a24_this_data->frames[F_QD_STORE_QUAD3])));
   1716       1.11     veego 		CMOVE(tmp, R_COP1LCL,
   1717       1.11     veego 			LOADDR(PREP_DMA_MEM(a24_this_data->frames[F_QD_STORE_QUAD3])));
   1718        1.1    chopps 		CEND(tmp);
   1719        1.1    chopps 		CEND(tmp);
   1720        1.1    chopps 
   1721       1.11     veego 		tmp = find_copper_inst(a24_this_data->frames[F_QD_STORE_QUAD3],
   1722       1.11     veego 					CI_MOVE(R_BPLMOD2));
   1723        1.1    chopps 		CBUMP(tmp);
   1724       1.11     veego 		CMOVE(tmp, R_BPL0PTH, HIADDR(PREP_DMA_MEM(
   1725       1.11     veego 			&plane[0][half_plane + HALF_2024_LINE])));
   1726       1.11     veego 		CMOVE(tmp, R_BPL0PTL, LOADDR(PREP_DMA_MEM(
   1727       1.11     veego 			&plane[0][half_plane + HALF_2024_LINE])));
   1728       1.11     veego 		CMOVE(tmp, R_BPL1PTH, HIADDR(PREP_DMA_MEM(
   1729       1.11     veego 			&plane[0][half_plane + full_line + HALF_2024_LINE])));
   1730       1.11     veego 		CMOVE(tmp, R_BPL1PTL, LOADDR(PREP_DMA_MEM(
   1731       1.11     veego 			&plane[0][half_plane + full_line + HALF_2024_LINE])));
   1732        1.1    chopps 		if (depth == 2) {
   1733       1.11     veego 			CMOVE(tmp, R_BPL2PTH, HIADDR(PREP_DMA_MEM(
   1734       1.11     veego 				&plane[1][half_plane + HALF_2024_LINE])));
   1735       1.11     veego 			CMOVE(tmp, R_BPL2PTL, LOADDR(PREP_DMA_MEM(
   1736       1.11     veego 				&plane[1][half_plane + HALF_2024_LINE])));
   1737       1.11     veego 			CMOVE(tmp, R_BPL3PTH, HIADDR(PREP_DMA_MEM(
   1738       1.11     veego 				&plane[1][half_plane + full_line + HALF_2024_LINE])));
   1739       1.11     veego 			CMOVE(tmp, R_BPL3PTL, LOADDR(PREP_DMA_MEM(
   1740       1.11     veego 				&plane[1][half_plane + full_line + HALF_2024_LINE])));
   1741        1.1    chopps 		}
   1742       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   1743        1.1    chopps 		CMOVE(tmp, R_DIWHIGH, 0x2000);
   1744        1.1    chopps #endif
   1745       1.11     veego 		CMOVE(tmp, R_COP1LCH, HIADDR(PREP_DMA_MEM(
   1746       1.11     veego 				a24_this_data->frames[F_QD_STORE_QUAD0])));
   1747       1.11     veego 		CMOVE(tmp, R_COP1LCL, LOADDR(PREP_DMA_MEM(
   1748       1.11     veego 				a24_this_data->frames[F_QD_STORE_QUAD0])));
   1749        1.1    chopps 		CEND(tmp);
   1750        1.1    chopps 		CEND(tmp);
   1751        1.1    chopps 
   1752        1.1    chopps 		/* swap new pointers in. */
   1753        1.1    chopps 		for (i = F_QD_STORE_QUAD0, j = F_QD_QUAD0;
   1754        1.1    chopps 		    i <= F_QD_STORE_QUAD3; i++, j++) {
   1755        1.1    chopps 			cp = a24_this_data->frames[j];
   1756        1.1    chopps 			a24_this_data->frames[j] = a24_this_data->frames[i];
   1757        1.1    chopps 			a24_this_data->frames[i] = cp;
   1758        1.1    chopps 		}
   1759        1.1    chopps 
   1760        1.1    chopps 		a24_this_data->current_view = v;
   1761        1.1    chopps 		vd->flags |= VF_DISPLAY;
   1762        1.1    chopps 
   1763        1.1    chopps 		cc_a2024_use_colormap(v, vd->colormap);
   1764        1.1    chopps 	}
   1765        1.1    chopps 	cc_load_mode(a24_this);
   1766        1.1    chopps }
   1767        1.1    chopps 
   1768        1.1    chopps void
   1769       1.21   aymeric a2024_mode_vbl_handler(dmode_t *d)
   1770        1.1    chopps {
   1771        1.1    chopps 	u_short vp = ((custom.vposr & 0x0007) << 8) | ((custom.vhposr) >> 8);
   1772        1.1    chopps 
   1773        1.1    chopps 	if (vp < 12) {
   1774       1.11     veego 		custom.cop1lc =
   1775       1.11     veego 		  PREP_DMA_MEM(a24_this_data->frames[a24_this_data->hedley_current]);
   1776        1.1    chopps 		custom.copjmp1 = 0;
   1777        1.1    chopps 	}
   1778        1.1    chopps 	a24_this_data->hedley_current++;
   1779        1.1    chopps 	a24_this_data->hedley_current &= 0x3;	/* if 4 then 0. */
   1780        1.1    chopps }
   1781        1.1    chopps #endif /* GRF_A2024 */
   1782        1.4    chopps 
   1783        1.4    chopps #if defined (GRF_AGA)
   1784        1.4    chopps 
   1785        1.4    chopps dmode_t *
   1786       1.21   aymeric cc_init_ntsc_aga(void)
   1787        1.4    chopps {
   1788        1.4    chopps 	/* this function should only be called once. */
   1789        1.4    chopps 	if (!aga_this && (custom.deniseid & 0xff) == 0xf8 &&
   1790        1.4    chopps 	    aga_enable & AGA_ENABLE) {
   1791        1.4    chopps 		u_short len = aga_copper_list_len;
   1792        1.4    chopps 
   1793        1.4    chopps 		aga_this = &aga_mode;
   1794        1.4    chopps 		aga_this_data = &aga_mode_data;
   1795        1.4    chopps 		bzero(aga_this, sizeof(dmode_t));
   1796        1.4    chopps 		bzero(aga_this_data, sizeof(dmdata_t));
   1797        1.4    chopps 
   1798        1.4    chopps 		aga_this->name = "ntsc: AGA dbl";
   1799        1.4    chopps 		aga_this->nominal_size.width = 640;
   1800        1.4    chopps 		aga_this->nominal_size.height = 400;
   1801        1.4    chopps 		aga_this_data->max_size.width = 724;
   1802        1.4    chopps 		aga_this_data->max_size.height = 482;
   1803        1.4    chopps 		aga_this_data->min_size.width = 320;
   1804        1.4    chopps 		aga_this_data->min_size.height = 200;
   1805        1.4    chopps 		aga_this_data->min_depth = 1;
   1806        1.4    chopps 		aga_this_data->max_depth = 8;
   1807        1.4    chopps 		aga_this->data = aga_this_data;
   1808        1.4    chopps 
   1809        1.4    chopps 		aga_this->get_monitor = cc_get_monitor;
   1810        1.4    chopps 		aga_this->alloc_view = cc_alloc_view;
   1811        1.4    chopps 		aga_this->get_current_view = cc_get_current_view;
   1812        1.4    chopps 
   1813        1.4    chopps 		aga_this_data->use_colormap = cc_use_aga_colormap;
   1814        1.4    chopps 		aga_this_data->get_colormap = cc_get_colormap;
   1815        1.4    chopps 		aga_this_data->alloc_colormap = cc_alloc_aga_colormap;
   1816        1.4    chopps 		aga_this_data->display_view = display_aga_view;
   1817        1.4    chopps 		aga_this_data->monitor = cc_monitor;
   1818        1.4    chopps 
   1819        1.4    chopps 		aga_this_data->frames = aga_frames;
   1820        1.4    chopps 		aga_this_data->frames[F_LONG] = alloc_chipmem(aga_copper_list_size * F_TOTAL);
   1821        1.4    chopps 		if (!aga_this_data->frames[F_LONG]) {
   1822        1.4    chopps 			panic("couldn't get chipmem for copper list");
   1823        1.4    chopps 		}
   1824        1.4    chopps 		aga_this_data->frames[F_STORE_LONG] = &aga_this_data->frames[F_LONG][len];
   1825        1.4    chopps 
   1826        1.4    chopps 		bcopy(aga_copper_list, aga_this_data->frames[F_STORE_LONG], aga_copper_list_size);
   1827        1.4    chopps 		bcopy(aga_copper_list, aga_this_data->frames[F_LONG], aga_copper_list_size);
   1828        1.4    chopps 
   1829        1.4    chopps 		aga_this_data->bplcon0 = 0x0240 | USE_CON3;	/* color composite
   1830        1.4    chopps 								 * enable,
   1831        1.4    chopps 								 * shres. */
   1832       1.13   thorpej #ifdef GRF_AGA_VGA
   1833       1.12     veego 		aga_this_data->std_start_x = 0x40 /*STANDARD_VIEW_X*/;
   1834       1.21   aymeric #else
   1835       1.13   thorpej 		aga_this_data->std_start_x = 0x4f /*STANDARD_VIEW_X*/;
   1836       1.21   aymeric #endif
   1837        1.4    chopps 		aga_this_data->std_start_y = 0x2b /*STANDARD_VIEW_Y*/;
   1838        1.4    chopps 		aga_this_data->vbl_handler = (vbl_handler_func *) cc_mode_vbl_handler;
   1839        1.4    chopps 		aga_this_data->beamcon0 = SPECIAL_BEAMCON ^ VSYNCTRUE;
   1840        1.4    chopps 
   1841        1.4    chopps 		LIST_INSERT_HEAD(&MDATA(cc_monitor)->modes,
   1842        1.4    chopps 		    aga_this, link);
   1843        1.4    chopps 	}
   1844        1.4    chopps 	return (aga_this);
   1845        1.4    chopps }
   1846        1.4    chopps 
   1847        1.4    chopps /* static, so I can patch and play */
   1848        1.4    chopps 
   1849       1.13   thorpej #ifdef GRF_AGA_VGA
   1850       1.12     veego int	AGA_htotal = 0x71;
   1851       1.12     veego int	AGA_hsstrt = 0xc;
   1852       1.12     veego int	AGA_hsstop = 0x16;
   1853       1.12     veego int	AGA_hbstrt = 0x5;
   1854       1.18        is int	AGA_vtotal = 0x1c1;
   1855       1.21   aymeric #else
   1856       1.13   thorpej int	AGA_htotal = 0x79;
   1857       1.13   thorpej int	AGA_hsstrt = 0xe;
   1858       1.13   thorpej int	AGA_hsstop = 0x1c;
   1859       1.13   thorpej int	AGA_hbstrt = 0x8;
   1860       1.18        is int	AGA_vtotal = 0x1ec;
   1861       1.21   aymeric #endif
   1862        1.4    chopps int	AGA_hbstop = 0x1e;
   1863        1.4    chopps int	AGA_vsstrt = 0x3;
   1864        1.4    chopps int	AGA_vsstop = 0x6;
   1865        1.4    chopps int	AGA_vbstrt = 0x0;
   1866        1.4    chopps int	AGA_vbstop = 0x19;
   1867        1.4    chopps int	AGA_hcenter = 0x4a;
   1868        1.4    chopps 
   1869        1.4    chopps void
   1870       1.21   aymeric display_aga_view(view_t *v)
   1871        1.4    chopps {
   1872        1.4    chopps 	if (aga_this_data->current_view != v) {
   1873        1.4    chopps 		vdata_t *vd = VDATA(v);
   1874        1.4    chopps 		cop_t  *cp = aga_this_data->frames[F_STORE_LONG], *tmp;
   1875        1.4    chopps 		int     depth = v->bitmap->depth, i;
   1876        1.4    chopps 		int     hstart, hstop, vstart, vstop, j;
   1877        1.4    chopps 		int     x, y, w = v->display.width, h = v->display.height;
   1878        1.4    chopps 		u_short ddfstart, ddfwidth, con1;
   1879        1.4    chopps 
   1880        1.4    chopps #ifdef DEBUG
   1881        1.4    chopps 		if (aga_enable & AGA_TRACE)
   1882       1.15  christos 			printf("display_aga_view(%dx%dx%d) %p\n", w, h,
   1883        1.4    chopps 			    depth, v);
   1884        1.4    chopps #endif
   1885        1.4    chopps 		/* round down to nearest even width */
   1886        1.4    chopps 		/* w &= 0xfffe; */
   1887        1.4    chopps 		/* calculate datafetch width. */
   1888        1.4    chopps 
   1889        1.4    chopps 		ddfwidth = ((v->bitmap->bytes_per_row >> 1) - 4) << 1;
   1890        1.4    chopps 
   1891        1.4    chopps 		/* this will center the any overscanned display */
   1892        1.4    chopps 		/* and allow user to modify. */
   1893        1.4    chopps 		x = v->display.x + aga_this_data->std_start_x - ((w - 640) >> 3);
   1894        1.4    chopps 		y = v->display.y + aga_this_data->std_start_y - ((h - 400) >> 1);
   1895        1.4    chopps 
   1896        1.4    chopps 		if (y & 1)
   1897        1.4    chopps 			y--;
   1898        1.4    chopps 
   1899        1.4    chopps 		if (!(x & 1))
   1900        1.4    chopps 			x--;
   1901        1.4    chopps 
   1902        1.4    chopps 		hstart = x;
   1903        1.4    chopps 		hstop = x + (w >> 2);
   1904        1.4    chopps 		vstart = y;
   1905        1.4    chopps 		vstop = y + (h >> 0);
   1906        1.4    chopps 		ddfstart = (hstart >> 1) - 8;
   1907        1.4    chopps 
   1908        1.4    chopps #ifdef DEBUG
   1909        1.4    chopps 		if (aga_enable & AGA_TRACE2) {
   1910       1.15  christos 			printf ("  ddfwidth %04x x %04x y %04x", ddfwidth,
   1911        1.4    chopps 			    x, y);
   1912       1.15  christos 			printf (" hstart %04x hstop %04x vstart %04x vstop %04x ddfstart %04x\n",
   1913        1.4    chopps 			    hstart, hstop, vstart, vstop, ddfstart);
   1914        1.4    chopps 		}
   1915        1.4    chopps #endif
   1916        1.4    chopps 		/* check for hardware limits, AGA may allow more..? */
   1917        1.4    chopps 		/* anyone got a 4000 I can borrow :^) -ch */
   1918        1.4    chopps 		if ((ddfstart & 0xfffc) + ddfwidth > 0xd8) {
   1919        1.4    chopps 			int     d = 0;
   1920        1.4    chopps 
   1921        1.4    chopps 			/* XXX anyone know the equality properties of
   1922        1.4    chopps 			 * intermixed logial AND's */
   1923        1.4    chopps 			/* XXX and arithmetic operators? */
   1924        1.4    chopps 			while (((ddfstart & 0xfffc) + ddfwidth - d) > 0xd8) {
   1925        1.4    chopps 				d++;
   1926        1.4    chopps 			}
   1927        1.4    chopps 
   1928        1.4    chopps 			ddfstart -= d;
   1929        1.4    chopps 			hstart -= d << 1;
   1930        1.4    chopps 			hstop -= d << 1;
   1931        1.4    chopps 		}
   1932        1.4    chopps 		/* correct the datafetch to proper limits. */
   1933        1.4    chopps 		/* delay the actual display of the data until we need it. */
   1934        1.4    chopps 		ddfstart &= 0xfffc;
   1935        1.4    chopps #ifdef DEBUG
   1936        1.4    chopps 		if (aga_enable & AGA_TRACE2) {
   1937       1.15  christos 			printf ("  ddfwidth %04x x %04x y %04x", ddfwidth,
   1938        1.4    chopps 			    x, y);
   1939       1.15  christos 			printf (" hstart %04x hstop %04x vstart %04x vstop %04x ddfstart %04x\n",
   1940        1.4    chopps 			    hstart, hstop, vstart, vstop, ddfstart);
   1941        1.4    chopps 		}
   1942        1.4    chopps #endif
   1943        1.4    chopps 		con1 = ((hstart - 9) - (ddfstart << 1)) | (((hstart - 9) - (ddfstart << 1)) << 4);
   1944        1.4    chopps 
   1945        1.4    chopps 		if (aga_this_data->current_view) {
   1946        1.4    chopps 			VDATA(aga_this_data->current_view)->flags &= ~VF_DISPLAY;	/* mark as no longer */
   1947        1.4    chopps 			/* displayed. */
   1948        1.4    chopps 		}
   1949        1.4    chopps 		aga_this_data->current_view = v;
   1950        1.4    chopps 
   1951        1.4    chopps 		cp = aga_this_data->frames[F_STORE_LONG];
   1952        1.4    chopps 		tmp = cp;
   1953        1.4    chopps 		for (i = 0; i < 8; ++i) {
   1954        1.4    chopps 			if (tmp == NULL)
   1955        1.4    chopps 				break;
   1956        1.4    chopps 			tmp = find_copper_inst(tmp + 1, CI_MOVE(R_BPLCON3));
   1957        1.4    chopps 			if (tmp == NULL)
   1958        1.4    chopps 				break;
   1959        1.4    chopps 			tmp->cp.inst.operand = 0x0ca1 | (i << 13);
   1960        1.4    chopps 			tmp = find_copper_inst(tmp + 1, CI_MOVE(R_BPLCON3));
   1961        1.4    chopps 			if (tmp == NULL)
   1962        1.4    chopps 				break;
   1963        1.4    chopps 			tmp->cp.inst.operand = 0x0ea1 | (i << 13);
   1964        1.4    chopps 		}
   1965        1.4    chopps 		if (tmp)
   1966        1.4    chopps 			tmp = find_copper_inst(tmp + 1, CI_MOVE(R_BPLCON3));
   1967        1.4    chopps 		if (tmp)
   1968        1.4    chopps 			tmp->cp.inst.operand = 0x0ca1;
   1969        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_FMODE));
   1970        1.4    chopps 		tmp->cp.inst.operand = 0x8003;
   1971        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HTOTAL));
   1972        1.4    chopps 		tmp->cp.inst.operand = AGA_htotal; /* 81/71/73/79? */
   1973        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HBSTRT));
   1974        1.4    chopps 		tmp->cp.inst.operand = AGA_hbstrt; /* 0x0008 */
   1975        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HSSTRT));
   1976        1.4    chopps 		tmp->cp.inst.operand = AGA_hsstrt; /* 0x000e */
   1977        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HSSTOP));
   1978        1.4    chopps 		tmp->cp.inst.operand = AGA_hsstop; /* 0x001c */
   1979        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HBSTOP));
   1980        1.4    chopps 		tmp->cp.inst.operand = AGA_hsstop; /* 0x001e */
   1981        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HCENTER));
   1982        1.4    chopps 		tmp->cp.inst.operand = AGA_hcenter; /*AGA_htotal / 2 + AGA_hsstrt */
   1983        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_VBSTRT));
   1984        1.4    chopps 		tmp->cp.inst.operand = AGA_vbstrt; /* 0x0000 */
   1985        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_VSSTRT));
   1986        1.4    chopps 		tmp->cp.inst.operand = AGA_vsstrt; /* 0x016b / AGA_htotal */
   1987        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_VSSTOP));
   1988        1.4    chopps 		tmp->cp.inst.operand = AGA_vsstop; /* 0x02d6 / AGA_htotal */
   1989        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_VBSTOP));
   1990        1.4    chopps 		tmp->cp.inst.operand = AGA_vbstop; /* 0x0bd1 / AGA_htotal */
   1991        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_VTOTAL));
   1992        1.4    chopps 		tmp->cp.inst.operand = AGA_vtotal;
   1993        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BEAMCON0));
   1994        1.4    chopps 		tmp->cp.inst.operand = aga_this_data->beamcon0;
   1995        1.4    chopps #ifdef DEBUG
   1996        1.4    chopps 		if (aga_enable & AGA_TRACE2)
   1997       1.15  christos 			printf("  beamcon0 %04x", tmp->cp.inst.operand);
   1998        1.4    chopps #endif
   1999        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWHIGH));
   2000        1.4    chopps 		tmp->cp.inst.operand = CALC_DIWHIGH(hstart, vstart, hstop, vstop);
   2001        1.4    chopps #ifdef DEBUG
   2002        1.4    chopps 		if (aga_enable & AGA_TRACE2)
   2003       1.15  christos 			printf(" diwhigh %04x>", tmp->cp.inst.operand);
   2004        1.4    chopps #endif
   2005        1.4    chopps #if 0
   2006        1.4    chopps 		tmp->cp.inst.operand = (vstop & 0x0700) | ((hstop & 0x0100) << 5);
   2007        1.4    chopps #endif
   2008        1.4    chopps #ifdef DEBUG
   2009        1.4    chopps 		if (aga_enable & AGA_TRACE2)
   2010       1.15  christos 			printf("%04x", tmp->cp.inst.operand);
   2011        1.4    chopps #endif
   2012        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON0));
   2013        1.4    chopps 		tmp->cp.inst.operand = aga_this_data->bplcon0 |
   2014        1.4    chopps 		    ((depth & 0x7) << 12) | ((depth & 0x8) << 1);
   2015        1.4    chopps #ifdef DEBUG
   2016        1.4    chopps 		if (aga_enable & AGA_TRACE2)
   2017       1.15  christos 			printf(" bplcon0 %04x", tmp->cp.inst.operand);
   2018        1.4    chopps #endif
   2019        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON1));
   2020        1.4    chopps 		tmp->cp.inst.operand = con1;
   2021        1.4    chopps #ifdef DEBUG
   2022        1.4    chopps 		if (aga_enable & AGA_TRACE2)
   2023       1.15  christos 			printf(" bplcon1 %04x>0000\n", con1);
   2024        1.4    chopps #endif
   2025        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTART));
   2026        1.4    chopps 		tmp->cp.inst.operand = ((vstart & 0xff) << 8) | (hstart & 0xff);
   2027        1.4    chopps #ifdef DEBUG
   2028        1.4    chopps 		if (aga_enable & AGA_TRACE2)
   2029       1.15  christos 			printf("  diwstart %04x", tmp->cp.inst.operand);
   2030        1.4    chopps #endif
   2031        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTOP));
   2032        1.4    chopps 		tmp->cp.inst.operand = ((vstop & 0xff) << 8) | (hstop & 0xff);
   2033        1.4    chopps #ifdef DEBUG
   2034        1.4    chopps 		if (aga_enable & AGA_TRACE2)
   2035       1.15  christos 			printf(" diwstop %04x", tmp->cp.inst.operand);
   2036        1.4    chopps #endif
   2037        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTART));
   2038        1.4    chopps 		tmp->cp.inst.operand = ddfstart;
   2039        1.4    chopps #ifdef DEBUG
   2040        1.4    chopps 		if (aga_enable & AGA_TRACE2)
   2041       1.15  christos 			printf(" ddfstart %04x", tmp->cp.inst.operand);
   2042        1.4    chopps #endif
   2043        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTOP));
   2044        1.4    chopps 		tmp->cp.inst.operand = ddfstart + ddfwidth;
   2045        1.4    chopps #ifdef DEBUG
   2046        1.4    chopps 		if (aga_enable & AGA_TRACE2)
   2047       1.15  christos 			printf(" ddfstop %04x", tmp->cp.inst.operand);
   2048        1.4    chopps #endif
   2049        1.4    chopps 
   2050        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   2051        1.4    chopps 		for (i = 0, j = 0; i < depth; j += 2, i++) {
   2052        1.4    chopps 			/* update the plane pointers */
   2053        1.4    chopps 			tmp[j].cp.inst.operand = HIADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   2054        1.4    chopps 			tmp[j + 1].cp.inst.operand = LOADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   2055        1.4    chopps #ifdef DEBUG
   2056        1.4    chopps 		if (aga_enable & AGA_TRACE2)
   2057       1.15  christos 			printf (" bpl%dpth %p", i, v->bitmap->plane[i]);
   2058        1.4    chopps #endif
   2059        1.4    chopps 		}
   2060        1.4    chopps 
   2061        1.4    chopps 		/* set mods correctly. */
   2062        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL1MOD));
   2063        1.4    chopps 		tmp[0].cp.inst.operand = v->bitmap->row_mod;
   2064        1.4    chopps 		tmp[1].cp.inst.operand = v->bitmap->row_mod;
   2065        1.4    chopps #ifdef DEBUG
   2066        1.4    chopps 		if (aga_enable & AGA_TRACE2)
   2067       1.15  christos 			printf(" bplxmod %04x\n", v->bitmap->row_mod);
   2068        1.4    chopps #endif
   2069        1.4    chopps 
   2070        1.4    chopps 		/* set next pointers correctly */
   2071        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   2072        1.4    chopps 		tmp[0].cp.inst.operand = HIADDR(PREP_DMA_MEM(aga_this_data->frames[F_STORE_LONG]));
   2073        1.4    chopps 		tmp[1].cp.inst.operand = LOADDR(PREP_DMA_MEM(aga_this_data->frames[F_STORE_LONG]));
   2074        1.4    chopps 
   2075        1.4    chopps 		cp = aga_this_data->frames[F_LONG];
   2076        1.4    chopps 		aga_this_data->frames[F_LONG] = aga_this_data->frames[F_STORE_LONG];
   2077        1.4    chopps 		aga_this_data->frames[F_STORE_LONG] = cp;
   2078        1.4    chopps 
   2079        1.4    chopps 		vd->flags |= VF_DISPLAY;
   2080        1.4    chopps 
   2081        1.5    chopps 		cc_use_aga_colormap(v, vd->colormap);
   2082        1.4    chopps 	}
   2083        1.4    chopps 	cc_load_mode(aga_this);
   2084        1.4    chopps #ifdef DEBUG
   2085        1.4    chopps 	if (aga_enable & AGA_TRACE)
   2086        1.4    chopps 		aga_enable |= AGA_TRACE2;	/* XXXX */
   2087        1.4    chopps #endif
   2088        1.4    chopps }
   2089       1.17    mhitch 
   2090       1.17    mhitch /*
   2091       1.17    mhitch  * SUPER72 Mode
   2092       1.17    mhitch  */
   2093       1.17    mhitch 
   2094       1.17    mhitch #if defined (GRF_SUPER72)
   2095       1.17    mhitch dmode_t *
   2096       1.21   aymeric cc_init_super72(void)
   2097       1.17    mhitch {
   2098       1.17    mhitch 	/* this function should only be called once. */
   2099       1.17    mhitch 	if (!super72_this && (custom.deniseid & 0xff) == 0xf8) {
   2100       1.17    mhitch 		u_short len = aga_copper_list_len;
   2101       1.17    mhitch 
   2102       1.17    mhitch 		super72_this = &super72_mode;
   2103       1.17    mhitch 		super72_this_data = &super72_mode_data;
   2104       1.17    mhitch 		bzero(super72_this, sizeof(dmode_t));
   2105       1.17    mhitch 		bzero(super72_this_data, sizeof(dmdata_t));
   2106       1.17    mhitch 
   2107       1.17    mhitch 		super72_this->name = "super72: superhires interlace";
   2108       1.17    mhitch 		super72_this->nominal_size.width = 800;
   2109       1.17    mhitch 		super72_this->nominal_size.height = 600;
   2110       1.17    mhitch 		super72_this_data->max_size.width = 848;
   2111       1.17    mhitch 		super72_this_data->max_size.height = 614;
   2112       1.17    mhitch 		super72_this_data->min_size.width = 320;
   2113       1.17    mhitch 		super72_this_data->min_size.height = 484;
   2114       1.17    mhitch 		super72_this_data->min_depth = 1;
   2115       1.17    mhitch 		super72_this_data->max_depth = 8;
   2116       1.17    mhitch 		super72_this->data = super72_this_data;
   2117       1.17    mhitch 
   2118       1.17    mhitch 		super72_this->get_monitor = cc_get_monitor;
   2119       1.17    mhitch 		super72_this->alloc_view = cc_alloc_view;
   2120       1.17    mhitch 		super72_this->get_current_view = cc_get_current_view;
   2121       1.17    mhitch 
   2122       1.17    mhitch 		super72_this_data->use_colormap = cc_use_aga_colormap;
   2123       1.17    mhitch 		super72_this_data->get_colormap = cc_get_colormap;
   2124       1.17    mhitch 		super72_this_data->alloc_colormap = cc_alloc_aga_colormap;
   2125       1.17    mhitch 		super72_this_data->display_view = display_super72_view;
   2126       1.17    mhitch 		super72_this_data->monitor = cc_monitor;
   2127       1.17    mhitch 
   2128       1.17    mhitch 		super72_this_data->flags |= DMF_INTERLACE;
   2129       1.17    mhitch 
   2130       1.17    mhitch 		super72_this_data->frames = super72_frames;	/* MAY NEED TO CHANGE COPLIST */
   2131       1.17    mhitch 		super72_this_data->frames[F_LACE_LONG] =
   2132       1.17    mhitch 		    alloc_chipmem(aga_copper_list_size * F_LACE_TOTAL);
   2133       1.17    mhitch 		if (!super72_this_data->frames[F_LACE_LONG]) {
   2134       1.17    mhitch 			panic("couldn't get chipmem for copper list");
   2135       1.17    mhitch 		}
   2136       1.17    mhitch 		super72_this_data->frames[F_LACE_SHORT] =
   2137       1.17    mhitch 		    &super72_this_data->frames[F_LACE_LONG][len];
   2138       1.17    mhitch 		super72_this_data->frames[F_LACE_STORE_LONG] =
   2139       1.17    mhitch 		    &super72_this_data->frames[F_LACE_SHORT][len];
   2140       1.17    mhitch 		super72_this_data->frames[F_LACE_STORE_SHORT] =
   2141       1.17    mhitch 		    &super72_this_data->frames[F_LACE_STORE_LONG][len];
   2142       1.17    mhitch 
   2143       1.17    mhitch 		bcopy(aga_copper_list,
   2144       1.17    mhitch 		    super72_this_data->frames[F_LACE_STORE_LONG],
   2145       1.17    mhitch 		    aga_copper_list_size);
   2146       1.17    mhitch 		bcopy(aga_copper_list,
   2147       1.17    mhitch 		    super72_this_data->frames[F_LACE_STORE_SHORT],
   2148       1.17    mhitch 		    aga_copper_list_size);
   2149       1.17    mhitch 		bcopy(aga_copper_list,
   2150       1.17    mhitch 		    super72_this_data->frames[F_LACE_LONG],
   2151       1.17    mhitch 		    aga_copper_list_size);
   2152       1.17    mhitch 		bcopy(aga_copper_list,
   2153       1.17    mhitch 		    super72_this_data->frames[F_LACE_SHORT],
   2154       1.17    mhitch 		    aga_copper_list_size);
   2155       1.17    mhitch 
   2156       1.17    mhitch 		super72_this_data->bplcon0 = 0x0244 | USE_CON3;	/* color
   2157       1.17    mhitch 								 * composite enable,
   2158       1.17    mhitch 								 * shres
   2159       1.17    mhitch 								 * lace. */
   2160       1.17    mhitch #if 0	/* patchable variables for testing */
   2161       1.17    mhitch 		super72_this_data->std_start_x = 0x6c;
   2162       1.17    mhitch 		super72_this_data->std_start_y = 0x1b;
   2163       1.17    mhitch #endif
   2164       1.17    mhitch 		super72_this_data->vbl_handler =
   2165       1.17    mhitch 		    (vbl_handler_func *) cc_lace_mode_vbl_handler;
   2166       1.17    mhitch 		super72_this_data->beamcon0 = (SPECIAL_BEAMCON ^ VSYNCTRUE) |
   2167       1.17    mhitch 		    DISPLAYPAL | 0x4000;
   2168       1.17    mhitch 		super72_this_data->beamcon0 = 0x5bb0;
   2169       1.17    mhitch 
   2170       1.17    mhitch 		LIST_INSERT_HEAD(&MDATA(cc_monitor)->modes, super72_this, link);
   2171       1.17    mhitch 	}
   2172       1.17    mhitch 	return (super72_this);
   2173       1.17    mhitch }
   2174       1.17    mhitch 
   2175       1.17    mhitch /* Super72 83Hz hack monitor values */
   2176       1.17    mhitch /*int	super72_htotal = 0x083;
   2177       1.17    mhitch int	super72_hsstrt = 0x00d;
   2178       1.17    mhitch int	super72_hsstop = 0x01b;
   2179       1.17    mhitch int	super72_hbstrt = 0x001;
   2180       1.17    mhitch int	super72_hbstop = 0x021;
   2181       1.17    mhitch int	super72_vtotal = 0x148;
   2182       1.17    mhitch int	super72_vsstrt = 0x2d5;
   2183       1.17    mhitch int	super72_vsstop = 0x3ca;
   2184       1.17    mhitch int	super72_vbstrt = 0x000;
   2185       1.17    mhitch int	super72_vbstop = 0xfdc;
   2186       1.17    mhitch int	super72_hcenter = 0x04e;
   2187       1.17    mhitch */
   2188       1.17    mhitch 
   2189       1.17    mhitch /* Super72 standard monitor values */
   2190       1.17    mhitch int	super72_htotal = 154;	/* 0x099*/
   2191       1.17    mhitch int	super72_hsstrt = 17;	/* 0x01c*/
   2192       1.17    mhitch int	super72_hsstop = 27;	/* 0x038*/
   2193       1.17    mhitch int	super72_hbstrt = 154;	/* 0x008*/
   2194       1.17    mhitch int	super72_hbstop = 55;	/* 0x01e*/
   2195       1.17    mhitch int	super72_vtotal = 328;	/* 0x147*/
   2196       1.17    mhitch int	super72_vsstrt = 11;	/* 0x030*/
   2197       1.17    mhitch int	super72_vsstop = 18;	/* 0x033*/
   2198       1.17    mhitch int	super72_vbstrt = 327;	/* 0x000*/
   2199       1.17    mhitch int	super72_vbstop = 27;	/* 0x019*/
   2200       1.17    mhitch int	super72_hcenter = 94;	/* 0x057*/
   2201       1.17    mhitch int	super72_startx = 100;
   2202       1.17    mhitch int	super72_starty = 27;
   2203       1.17    mhitch 
   2204       1.17    mhitch void
   2205       1.21   aymeric display_super72_view(view_t *v)
   2206       1.17    mhitch {
   2207       1.17    mhitch 	if (super72_this_data->current_view != v) {
   2208       1.17    mhitch 		vdata_t *vd = VDATA(v);
   2209       1.17    mhitch 		cop_t  *cp = super72_this_data->frames[F_LACE_STORE_LONG], *tmp;
   2210       1.17    mhitch 		int     depth = v->bitmap->depth, i;
   2211       1.17    mhitch 		int     hstart, hstop, vstart, vstop, j;
   2212       1.17    mhitch 		int     x, y, w = v->display.width, h = v->display.height;
   2213       1.17    mhitch 		u_short ddfstart, ddfwidth, con1;
   2214       1.17    mhitch 
   2215       1.17    mhitch 		/* round down to nearest even width */
   2216       1.17    mhitch 		/* w &= 0xfffe; */
   2217       1.17    mhitch 
   2218       1.17    mhitch 		/* calculate datafetch width. */
   2219       1.17    mhitch 		ddfwidth = ((v->bitmap->bytes_per_row >> 1) - 4) << 1;
   2220       1.17    mhitch 
   2221       1.17    mhitch 		/* This will center any overscanned display */
   2222       1.17    mhitch 		/* and allow user to modify. */
   2223       1.17    mhitch 		x = (v->display.x >> 1) + super72_startx - ((w - 800) >> 3);
   2224       1.17    mhitch 		y = v->display.y + super72_starty - ((h - 600) >> 2);
   2225       1.17    mhitch 
   2226       1.17    mhitch 		hstart = x;
   2227       1.17    mhitch 		hstop = x + (w >> 2);
   2228       1.17    mhitch 		vstart = y;
   2229       1.17    mhitch 		vstop = y + (h >> 1);
   2230       1.17    mhitch 		ddfstart = (hstart >> 1) - 16;
   2231       1.17    mhitch 
   2232       1.17    mhitch 		ddfstart = (hstart << 2) - 4;
   2233       1.17    mhitch 		con1 = ddfstart & 63;
   2234       1.17    mhitch 		ddfstart = (ddfstart & -64) - 64;
   2235       1.17    mhitch 		ddfwidth = ((w + 64 - 1) & -64) - 64;
   2236       1.17    mhitch 		ddfwidth = ddfwidth >> 3;
   2237       1.17    mhitch 		ddfstart = ddfstart >> 3;
   2238       1.17    mhitch 		super72_hbstrt = ((x << 2) + w + 4) >> 3;
   2239       1.17    mhitch 		super72_hbstop = (hstart + 1) >> 1;
   2240       1.17    mhitch 		super72_vbstrt = vstop;
   2241       1.17    mhitch 		super72_vbstop = vstart - 2;
   2242       1.17    mhitch 
   2243       1.17    mhitch 		if ((hstop >> 1) > super72_htotal) {
   2244       1.17    mhitch 			int     d;
   2245       1.17    mhitch 
   2246       1.17    mhitch 			d = (hstop >> 1) - super72_htotal;
   2247       1.17    mhitch 			ddfstart -= d;
   2248       1.17    mhitch 			hstart -= d << 1;
   2249       1.17    mhitch 			hstop -= d << 1;
   2250       1.17    mhitch 		}
   2251       1.17    mhitch 		if (vstop >= super72_vtotal) {
   2252       1.17    mhitch 			int	d;
   2253       1.17    mhitch 			d = (vstop - super72_vtotal + 1);
   2254       1.17    mhitch 			vstart -= d;
   2255       1.17    mhitch 			vstop -= d;
   2256       1.17    mhitch 		}
   2257       1.17    mhitch 		con1 = ((con1 >> 2) & 0x000f) |		/* PF1H2-PF1H5 */
   2258       1.17    mhitch 		       ((con1 << 8) & 0x0300) |		/* PF1H0-PF1H2 */
   2259       1.17    mhitch 		       ((con1 << 4) & 0x0c00);		/* PF1H6-PF1H7 */
   2260       1.17    mhitch 		con1 |= con1 << 4;			/* PF2H2-PF2H7 */
   2261       1.17    mhitch 
   2262       1.17    mhitch 		if (super72_this_data->current_view) {
   2263       1.17    mhitch 			VDATA(super72_this_data->current_view)->flags &=
   2264       1.17    mhitch 			    ~VF_DISPLAY;	/* mark as no longer */
   2265       1.17    mhitch 						/* displayed. */
   2266       1.17    mhitch 		}
   2267       1.17    mhitch 		super72_this_data->current_view = v;
   2268       1.17    mhitch 
   2269       1.17    mhitch 		cp = super72_this_data->frames[F_LACE_STORE_LONG];
   2270       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_FMODE));
   2271       1.17    mhitch 		tmp->cp.inst.operand = 0x8003;
   2272       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_HTOTAL));
   2273       1.21   aymeric 		tmp->cp.inst.operand = super72_htotal;
   2274       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_HBSTRT));
   2275       1.21   aymeric 		tmp->cp.inst.operand = super72_hbstrt;
   2276       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_HSSTRT));
   2277       1.21   aymeric 		tmp->cp.inst.operand = super72_hsstrt;
   2278       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_HSSTOP));
   2279       1.21   aymeric 		tmp->cp.inst.operand = super72_hsstop;
   2280       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_HBSTOP));
   2281       1.21   aymeric 		tmp->cp.inst.operand = super72_hbstop;
   2282       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_HCENTER));
   2283       1.17    mhitch 		tmp->cp.inst.operand = super72_hcenter;
   2284       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_VBSTRT));
   2285       1.21   aymeric 		tmp->cp.inst.operand = super72_vbstrt;
   2286       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_VSSTRT));
   2287       1.21   aymeric 		tmp->cp.inst.operand = super72_vsstrt;
   2288       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_VSSTOP));
   2289       1.21   aymeric 		tmp->cp.inst.operand = super72_vsstop;
   2290       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_VBSTOP));
   2291       1.21   aymeric 		tmp->cp.inst.operand = super72_vbstop;
   2292       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_VTOTAL));
   2293       1.17    mhitch 		tmp->cp.inst.operand = super72_vtotal;
   2294       1.17    mhitch 
   2295       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_BEAMCON0));
   2296       1.17    mhitch 		tmp->cp.inst.operand = super72_this_data->beamcon0;
   2297       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWHIGH));
   2298       1.17    mhitch 		tmp->cp.inst.operand =
   2299       1.17    mhitch 		    CALC_DIWHIGH(hstart, vstart, hstop, vstop);
   2300       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON0));
   2301       1.17    mhitch 		tmp->cp.inst.operand = super72_this_data->bplcon0 |
   2302       1.17    mhitch 		    ((depth & 0x7) << 12) | ((depth & 0x8) << 1);
   2303       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON1));
   2304       1.17    mhitch 		tmp->cp.inst.operand = con1;
   2305       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTART));
   2306       1.17    mhitch 		tmp->cp.inst.operand = ((vstart & 0xff) << 8) | (hstart & 0xff);
   2307       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTOP));
   2308       1.17    mhitch 		tmp->cp.inst.operand = ((vstop & 0xff) << 8) | (hstop & 0xff);
   2309       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTART));
   2310       1.17    mhitch 		tmp->cp.inst.operand = ddfstart;
   2311       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTOP));
   2312       1.17    mhitch 		tmp->cp.inst.operand = ddfstart + ddfwidth;
   2313       1.17    mhitch 
   2314       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   2315       1.17    mhitch 		for (i = 0, j = 0; i < depth; j += 2, i++) {
   2316       1.17    mhitch 			/* update the plane pointers */
   2317       1.17    mhitch 			tmp[j].cp.inst.operand =
   2318       1.17    mhitch 			    HIADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   2319       1.17    mhitch 			tmp[j + 1].cp.inst.operand =
   2320       1.17    mhitch 			    LOADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   2321       1.17    mhitch 		}
   2322       1.17    mhitch 
   2323       1.17    mhitch 		/* set mods correctly. */
   2324       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL1MOD));
   2325       1.17    mhitch 		tmp[0].cp.inst.operand = v->bitmap->bytes_per_row +
   2326       1.17    mhitch 		    v->bitmap->row_mod;
   2327       1.17    mhitch 		tmp[1].cp.inst.operand = v->bitmap->bytes_per_row +
   2328       1.17    mhitch 		    v->bitmap->row_mod;
   2329       1.17    mhitch 
   2330       1.17    mhitch 		/* set next pointers correctly */
   2331       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   2332       1.17    mhitch 		tmp[0].cp.inst.operand =
   2333       1.17    mhitch 		    HIADDR(PREP_DMA_MEM(super72_this_data->frames[F_LACE_STORE_SHORT]));
   2334       1.17    mhitch 		tmp[1].cp.inst.operand =
   2335       1.17    mhitch 		    LOADDR(PREP_DMA_MEM(super72_this_data->frames[F_LACE_STORE_SHORT]));
   2336       1.17    mhitch 
   2337       1.17    mhitch 		bcopy(super72_this_data->frames[F_LACE_STORE_LONG],
   2338       1.17    mhitch 		    super72_this_data->frames[F_LACE_STORE_SHORT],
   2339       1.17    mhitch 		    aga_copper_list_size);
   2340       1.17    mhitch 
   2341       1.17    mhitch 		/* these are the only ones that are different from long frame. */
   2342       1.17    mhitch 		cp = super72_this_data->frames[F_LACE_STORE_SHORT];
   2343       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   2344       1.17    mhitch 		for (i = 0, j = 0; i < depth; j += 2, i++) {
   2345       1.17    mhitch 			u_short mod = v->bitmap->bytes_per_row +
   2346       1.17    mhitch 			    v->bitmap->row_mod;
   2347       1.17    mhitch 			/* update plane pointers. high and low. */
   2348       1.17    mhitch 			tmp[j].cp.inst.operand =
   2349       1.17    mhitch 			    HIADDR(PREP_DMA_MEM(&v->bitmap->plane[i][mod]));
   2350       1.17    mhitch 			tmp[j + 1].cp.inst.operand =
   2351       1.17    mhitch 			    LOADDR(PREP_DMA_MEM(&v->bitmap->plane[i][mod]));
   2352       1.17    mhitch 		}
   2353       1.17    mhitch 
   2354       1.17    mhitch 		/* set next pointers correctly */
   2355       1.17    mhitch 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   2356       1.17    mhitch 		tmp[0].cp.inst.operand =
   2357       1.17    mhitch 		    HIADDR(PREP_DMA_MEM(super72_this_data->frames[F_LACE_STORE_LONG]));
   2358       1.17    mhitch 		tmp[1].cp.inst.operand =
   2359       1.17    mhitch 		     LOADDR(PREP_DMA_MEM(super72_this_data->frames[F_LACE_STORE_LONG]));
   2360       1.17    mhitch 
   2361       1.17    mhitch 		cp = super72_this_data->frames[F_LACE_LONG];
   2362       1.17    mhitch 		super72_this_data->frames[F_LACE_LONG] =
   2363       1.17    mhitch 		    super72_this_data->frames[F_LACE_STORE_LONG];
   2364       1.17    mhitch 		super72_this_data->frames[F_LACE_STORE_LONG] = cp;
   2365       1.17    mhitch 
   2366       1.17    mhitch 		cp = super72_this_data->frames[F_LACE_SHORT];
   2367       1.17    mhitch 		super72_this_data->frames[F_LACE_SHORT] =
   2368       1.17    mhitch 		    super72_this_data->frames[F_LACE_STORE_SHORT];
   2369       1.17    mhitch 		super72_this_data->frames[F_LACE_STORE_SHORT] = cp;
   2370       1.17    mhitch 
   2371       1.17    mhitch 		vd->flags |= VF_DISPLAY;
   2372       1.17    mhitch 		cc_use_aga_colormap(v, vd->colormap);
   2373       1.17    mhitch 	}
   2374       1.17    mhitch 	cc_load_mode(super72_this);
   2375       1.17    mhitch }
   2376       1.17    mhitch #endif /* GRF_SUPER72 */
   2377        1.4    chopps 
   2378        1.4    chopps #endif /* GRF_AGA */
   2379        1.1    chopps #endif /* GRF_NTSC */
   2380        1.1    chopps 
   2381        1.1    chopps /*
   2382        1.1    chopps  * PAL modes.
   2383        1.1    chopps  */
   2384        1.1    chopps 
   2385        1.1    chopps #if defined (GRF_PAL)
   2386        1.1    chopps 
   2387        1.1    chopps dmode_t *
   2388       1.21   aymeric cc_init_pal_hires(void)
   2389        1.1    chopps {
   2390        1.4    chopps 	/* this function should only be called once. */
   2391        1.1    chopps 	if (!ph_this) {
   2392        1.1    chopps 		u_short len = std_copper_list_len;
   2393        1.1    chopps 
   2394        1.1    chopps 		ph_this = &pal_hires_mode;
   2395        1.1    chopps 		ph_this_data = &pal_hires_mode_data;
   2396        1.1    chopps 		bzero(ph_this, sizeof(dmode_t));
   2397        1.1    chopps 		bzero(ph_this_data, sizeof(dmdata_t));
   2398        1.1    chopps 
   2399        1.7    chopps 		ph_this->name = "pal: hires";
   2400        1.1    chopps 		ph_this->nominal_size.width = 640;
   2401        1.1    chopps 		ph_this->nominal_size.height = 256;
   2402        1.1    chopps 		ph_this_data->max_size.width = 724;
   2403        1.1    chopps 		ph_this_data->max_size.height = 289;
   2404        1.1    chopps 		ph_this_data->min_size.width = 320;
   2405        1.1    chopps 		ph_this_data->min_size.height = 244;
   2406        1.1    chopps 		ph_this_data->min_depth = 1;
   2407        1.1    chopps 		ph_this_data->max_depth = 4;
   2408        1.1    chopps 		ph_this->data = ph_this_data;
   2409        1.1    chopps 
   2410        1.1    chopps 		ph_this->get_monitor = cc_get_monitor;
   2411        1.1    chopps 		ph_this->alloc_view = cc_alloc_view;
   2412        1.1    chopps 		ph_this->get_current_view = cc_get_current_view;
   2413        1.1    chopps 
   2414        1.1    chopps 		ph_this_data->use_colormap = cc_use_colormap;
   2415        1.1    chopps 		ph_this_data->get_colormap = cc_get_colormap;
   2416        1.1    chopps 		ph_this_data->alloc_colormap = cc_alloc_colormap;
   2417        1.1    chopps 		ph_this_data->display_view = display_pal_hires_view;
   2418        1.1    chopps 		ph_this_data->monitor = cc_monitor;
   2419        1.1    chopps 
   2420        1.1    chopps 		ph_this_data->frames = pal_hires_frames;
   2421        1.1    chopps 		ph_this_data->frames[F_LONG] = alloc_chipmem(std_copper_list_size * F_TOTAL);
   2422        1.1    chopps 		if (!ph_this_data->frames[F_LONG]) {
   2423        1.1    chopps 			panic("couldn't get chipmem for copper list");
   2424        1.1    chopps 		}
   2425        1.1    chopps 		ph_this_data->frames[F_STORE_LONG] = &ph_this_data->frames[F_LONG][len];
   2426        1.1    chopps 
   2427        1.1    chopps 		bcopy(std_copper_list, ph_this_data->frames[F_STORE_LONG], std_copper_list_size);
   2428        1.1    chopps 		bcopy(std_copper_list, ph_this_data->frames[F_LONG], std_copper_list_size);
   2429        1.1    chopps 
   2430        1.1    chopps 		ph_this_data->bplcon0 = 0x8200 | USE_CON3;	/* pal_hires, color
   2431        1.1    chopps 								 * composite enable,
   2432        1.1    chopps 								 * lace. */
   2433        1.1    chopps 		ph_this_data->std_start_x = STANDARD_VIEW_X;
   2434        1.1    chopps 		ph_this_data->std_start_y = STANDARD_VIEW_Y;
   2435        1.1    chopps 		ph_this_data->vbl_handler = (vbl_handler_func *) cc_mode_vbl_handler;
   2436       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   2437        1.1    chopps 		ph_this_data->beamcon0 = STANDARD_PAL_BEAMCON;
   2438        1.1    chopps #endif
   2439        1.1    chopps 
   2440        1.3    chopps 		LIST_INSERT_HEAD(&MDATA(cc_monitor)->modes, ph_this, link);
   2441        1.1    chopps 	}
   2442        1.1    chopps 	return (ph_this);
   2443        1.1    chopps }
   2444        1.1    chopps 
   2445        1.1    chopps void
   2446       1.21   aymeric display_pal_hires_view(view_t *v)
   2447        1.1    chopps {
   2448        1.1    chopps 	if (ph_this_data->current_view != v) {
   2449        1.1    chopps 		vdata_t *vd = VDATA(v);
   2450        1.1    chopps 		cop_t  *cp = ph_this_data->frames[F_STORE_LONG], *tmp;
   2451        1.1    chopps 		int     depth = v->bitmap->depth, i;
   2452        1.1    chopps 		int     hstart, hstop, vstart, vstop, j;
   2453        1.1    chopps 		int     x, y, w = v->display.width, h = v->display.height;
   2454        1.1    chopps 		u_short ddfstart, ddfwidth, con1;
   2455        1.1    chopps 
   2456        1.1    chopps 		/* round down to nearest even width */
   2457        1.1    chopps 		/* w &= 0xfffe; */
   2458        1.1    chopps 
   2459        1.1    chopps 		/* calculate datafetch width. */
   2460        1.1    chopps 		ddfwidth = ((v->bitmap->bytes_per_row >> 1) - 2) << 2;
   2461        1.1    chopps 
   2462        1.4    chopps 		/* This will center the any overscanned display */
   2463        1.1    chopps 		/* and allow user to modify. */
   2464        1.1    chopps 		x = v->display.x + ph_this_data->std_start_x - ((w - 640) >> 2);
   2465        1.1    chopps 		y = v->display.y + ph_this_data->std_start_y - ((h - 256) >> 1);
   2466        1.1    chopps 
   2467        1.1    chopps 		if (y & 1)
   2468        1.1    chopps 			y--;
   2469        1.1    chopps 
   2470        1.1    chopps 		if (!(x & 1))
   2471        1.1    chopps 			x--;
   2472        1.1    chopps 
   2473        1.1    chopps 		hstart = x;
   2474        1.1    chopps 		hstop = x + (w >> 1);
   2475        1.1    chopps 		vstart = y;
   2476        1.1    chopps 		vstop = y + h;
   2477        1.1    chopps 		ddfstart = (hstart - 9) >> 1;
   2478        1.1    chopps 		/* check for hardware limits, AGA may allow more..? */
   2479        1.1    chopps 		/* anyone got a 4000 I can borrow :^) -ch */
   2480        1.1    chopps 		if ((ddfstart & 0xfffc) + ddfwidth > 0xd8) {
   2481        1.1    chopps 			int     d = 0;
   2482        1.1    chopps 
   2483        1.1    chopps 			/* XXX anyone know the equality properties of
   2484        1.1    chopps 			 * intermixed logial AND's */
   2485        1.1    chopps 			/* XXX and arithmetic operators? */
   2486        1.1    chopps 			while (((ddfstart & 0xfffc) + ddfwidth - d) > 0xd8) {
   2487        1.1    chopps 				d++;
   2488        1.1    chopps 			}
   2489        1.1    chopps 
   2490        1.1    chopps 			ddfstart -= d;
   2491        1.1    chopps 			hstart -= d << 1;
   2492        1.1    chopps 			hstop -= d << 1;
   2493        1.1    chopps 		}
   2494        1.1    chopps 		/* correct the datafetch to proper limits. */
   2495        1.1    chopps 		/* delay the actual display of the data until we need it. */
   2496        1.1    chopps 		ddfstart &= 0xfffc;
   2497        1.1    chopps 		con1 = ((hstart - 9) - (ddfstart << 1)) | (((hstart - 9) - (ddfstart << 1)) << 4);
   2498        1.1    chopps 
   2499        1.1    chopps 		if (ph_this_data->current_view) {
   2500        1.1    chopps 			VDATA(ph_this_data->current_view)->flags &= ~VF_DISPLAY;	/* mark as no longer */
   2501        1.1    chopps 			/* displayed. */
   2502        1.1    chopps 		}
   2503        1.1    chopps 		ph_this_data->current_view = v;
   2504        1.1    chopps 
   2505        1.1    chopps 		cp = ph_this_data->frames[F_STORE_LONG];
   2506       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   2507  1.28.20.1        ad #if defined (GRF_AGA)
   2508        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_FMODE));
   2509        1.4    chopps 		tmp->cp.inst.operand = 0;
   2510        1.4    chopps #endif
   2511        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BEAMCON0));
   2512        1.1    chopps 		tmp->cp.inst.operand = ph_this_data->beamcon0;
   2513        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWHIGH));
   2514        1.1    chopps 		tmp->cp.inst.operand = CALC_DIWHIGH(hstart, vstart, hstop, vstop);
   2515        1.1    chopps #endif /* ECS */
   2516        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON0));
   2517        1.1    chopps 		tmp->cp.inst.operand = ph_this_data->bplcon0 | ((depth & 0x7) << 12);
   2518        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON1));
   2519        1.1    chopps 		tmp->cp.inst.operand = con1;
   2520        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTART));
   2521        1.1    chopps 		tmp->cp.inst.operand = ((vstart & 0xff) << 8) | (hstart & 0xff);
   2522        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTOP));
   2523        1.1    chopps 		tmp->cp.inst.operand = ((vstop & 0xff) << 8) | (hstop & 0xff);
   2524        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTART));
   2525        1.1    chopps 		tmp->cp.inst.operand = ddfstart;
   2526        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTOP));
   2527        1.1    chopps 		tmp->cp.inst.operand = ddfstart + ddfwidth;
   2528        1.1    chopps 
   2529        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   2530        1.1    chopps 		for (i = 0, j = 0; i < depth; j += 2, i++) {
   2531        1.1    chopps 			/* update the plane pointers */
   2532        1.1    chopps 			tmp[j].cp.inst.operand = HIADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   2533        1.1    chopps 			tmp[j + 1].cp.inst.operand = LOADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   2534        1.1    chopps 		}
   2535        1.1    chopps 
   2536        1.1    chopps 		/* set mods correctly. */
   2537        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL1MOD));
   2538        1.1    chopps 		tmp[0].cp.inst.operand = v->bitmap->row_mod;
   2539        1.1    chopps 		tmp[1].cp.inst.operand = v->bitmap->row_mod;
   2540        1.1    chopps 
   2541        1.1    chopps 		/* set next pointers correctly */
   2542        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   2543        1.1    chopps 		tmp[0].cp.inst.operand = HIADDR(PREP_DMA_MEM(ph_this_data->frames[F_STORE_LONG]));
   2544        1.1    chopps 		tmp[1].cp.inst.operand = LOADDR(PREP_DMA_MEM(ph_this_data->frames[F_STORE_LONG]));
   2545        1.1    chopps 
   2546        1.1    chopps 		cp = ph_this_data->frames[F_LONG];
   2547        1.1    chopps 		ph_this_data->frames[F_LONG] = ph_this_data->frames[F_STORE_LONG];
   2548        1.1    chopps 		ph_this_data->frames[F_STORE_LONG] = cp;
   2549        1.1    chopps 
   2550        1.1    chopps 		vd->flags |= VF_DISPLAY;
   2551        1.1    chopps 		cc_use_colormap(v, vd->colormap);
   2552        1.1    chopps 	}
   2553        1.1    chopps 	cc_load_mode(ph_this);
   2554        1.1    chopps }
   2555        1.1    chopps 
   2556        1.1    chopps dmode_t *
   2557       1.21   aymeric cc_init_pal_hires_lace(void)
   2558        1.1    chopps {
   2559        1.4    chopps 	/* this function should only be called once. */
   2560        1.1    chopps 	if (!phl_this) {
   2561        1.1    chopps 		u_short len = std_copper_list_len;
   2562        1.1    chopps 
   2563        1.1    chopps 		phl_this = &pal_hires_lace_mode;
   2564        1.1    chopps 		phl_this_data = &pal_hires_lace_mode_data;
   2565        1.1    chopps 		bzero(phl_this, sizeof(dmode_t));
   2566        1.1    chopps 		bzero(phl_this_data, sizeof(dmdata_t));
   2567        1.1    chopps 
   2568        1.1    chopps 		phl_this->name = "pal: hires interlace";
   2569        1.1    chopps 		phl_this->nominal_size.width = 640;
   2570        1.1    chopps 		phl_this->nominal_size.height = 512;
   2571        1.1    chopps 		phl_this_data->max_size.width = 724;
   2572        1.1    chopps 		phl_this_data->max_size.height = 578;
   2573        1.1    chopps 		phl_this_data->min_size.width = 320;
   2574        1.1    chopps 		phl_this_data->min_size.height = 484;
   2575        1.1    chopps 		phl_this_data->min_depth = 1;
   2576        1.1    chopps 		phl_this_data->max_depth = 4;
   2577        1.1    chopps 		phl_this->data = phl_this_data;
   2578        1.1    chopps 
   2579        1.1    chopps 		phl_this->get_monitor = cc_get_monitor;
   2580        1.1    chopps 		phl_this->alloc_view = cc_alloc_view;
   2581        1.1    chopps 		phl_this->get_current_view = cc_get_current_view;
   2582        1.1    chopps 
   2583        1.1    chopps 		phl_this_data->use_colormap = cc_use_colormap;
   2584        1.1    chopps 		phl_this_data->get_colormap = cc_get_colormap;
   2585        1.1    chopps 		phl_this_data->alloc_colormap = cc_alloc_colormap;
   2586        1.1    chopps 		phl_this_data->display_view = display_pal_hires_lace_view;
   2587        1.1    chopps 		phl_this_data->monitor = cc_monitor;
   2588        1.1    chopps 
   2589        1.1    chopps 		phl_this_data->flags |= DMF_INTERLACE;
   2590        1.1    chopps 
   2591        1.1    chopps 		phl_this_data->frames = pal_hires_lace_frames;
   2592        1.1    chopps 		phl_this_data->frames[F_LACE_LONG] = alloc_chipmem(std_copper_list_size * F_LACE_TOTAL);
   2593        1.1    chopps 		if (!phl_this_data->frames[F_LACE_LONG]) {
   2594        1.1    chopps 			panic("couldn't get chipmem for copper list");
   2595        1.1    chopps 		}
   2596        1.1    chopps 		phl_this_data->frames[F_LACE_SHORT] = &phl_this_data->frames[F_LACE_LONG][len];
   2597        1.1    chopps 		phl_this_data->frames[F_LACE_STORE_LONG] = &phl_this_data->frames[F_LACE_SHORT][len];
   2598        1.1    chopps 		phl_this_data->frames[F_LACE_STORE_SHORT] = &phl_this_data->frames[F_LACE_STORE_LONG][len];
   2599        1.1    chopps 
   2600        1.1    chopps 		bcopy(std_copper_list, phl_this_data->frames[F_LACE_STORE_LONG], std_copper_list_size);
   2601        1.1    chopps 		bcopy(std_copper_list, phl_this_data->frames[F_LACE_STORE_SHORT], std_copper_list_size);
   2602        1.1    chopps 		bcopy(std_copper_list, phl_this_data->frames[F_LACE_LONG], std_copper_list_size);
   2603        1.1    chopps 		bcopy(std_copper_list, phl_this_data->frames[F_LACE_SHORT], std_copper_list_size);
   2604        1.1    chopps 
   2605        1.1    chopps 		phl_this_data->bplcon0 = 0x8204 | USE_CON3;	/* hires, color
   2606        1.1    chopps 								 * composite enable,
   2607        1.1    chopps 								 * lace. */
   2608        1.1    chopps 		phl_this_data->std_start_x = STANDARD_VIEW_X;
   2609        1.1    chopps 		phl_this_data->std_start_y = STANDARD_VIEW_Y;
   2610        1.1    chopps 		phl_this_data->vbl_handler = (vbl_handler_func *) cc_lace_mode_vbl_handler;
   2611       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   2612        1.1    chopps 		phl_this_data->beamcon0 = STANDARD_PAL_BEAMCON;
   2613        1.1    chopps #endif
   2614        1.1    chopps 
   2615        1.3    chopps 		LIST_INSERT_HEAD(&MDATA(cc_monitor)->modes, phl_this, link);
   2616        1.1    chopps 	}
   2617        1.1    chopps 	return (phl_this);
   2618        1.1    chopps }
   2619        1.1    chopps 
   2620        1.1    chopps void
   2621       1.21   aymeric display_pal_hires_lace_view(view_t *v)
   2622        1.1    chopps {
   2623        1.1    chopps 	if (phl_this_data->current_view != v) {
   2624        1.1    chopps 		vdata_t *vd = VDATA(v);
   2625        1.1    chopps 		cop_t  *cp = phl_this_data->frames[F_LACE_STORE_LONG], *tmp;
   2626        1.1    chopps 		int     depth = v->bitmap->depth, i;
   2627        1.1    chopps 		int     hstart, hstop, vstart, vstop, j;
   2628        1.1    chopps 		int     x, y, w = v->display.width, h = v->display.height;
   2629        1.1    chopps 		u_short ddfstart, ddfwidth, con1;
   2630        1.1    chopps 
   2631        1.1    chopps 		/* round down to nearest even width */
   2632        1.1    chopps 		/* w &= 0xfffe; */
   2633        1.1    chopps 
   2634        1.1    chopps 		/* calculate datafetch width. */
   2635        1.1    chopps 		ddfwidth = ((v->bitmap->bytes_per_row >> 1) - 2) << 2;
   2636        1.1    chopps 
   2637        1.4    chopps 		/* This will center the any overscanned display */
   2638        1.1    chopps 		/* and allow user to modify. */
   2639        1.1    chopps 		x = v->display.x + phl_this_data->std_start_x - ((w - 640) >> 2);
   2640        1.1    chopps 		y = v->display.y + phl_this_data->std_start_y - ((h - 512) >> 2);
   2641        1.1    chopps 
   2642        1.1    chopps 		if (y & 1)
   2643        1.1    chopps 			y--;
   2644        1.1    chopps 
   2645        1.1    chopps 		if (!(x & 1))
   2646        1.1    chopps 			x--;
   2647        1.1    chopps 
   2648        1.1    chopps 		hstart = x;
   2649        1.1    chopps 		hstop = x + (w >> 1);
   2650        1.1    chopps 		vstart = y;
   2651        1.1    chopps 		vstop = y + (h >> 1);
   2652        1.1    chopps 		ddfstart = (hstart - 9) >> 1;
   2653        1.1    chopps 
   2654        1.1    chopps 		/* check for hardware limits, AGA may allow more..? */
   2655        1.1    chopps 		/* anyone got a 4000 I can borrow :^) -ch */
   2656        1.1    chopps 		if ((ddfstart & 0xfffc) + ddfwidth > 0xd8) {
   2657        1.1    chopps 			int     d = 0;
   2658        1.1    chopps 
   2659        1.1    chopps 			/* XXX anyone know the equality properties of
   2660        1.1    chopps 			 * intermixed logial AND's */
   2661        1.1    chopps 			/* XXX and arithmetic operators? */
   2662        1.1    chopps 			while (((ddfstart & 0xfffc) + ddfwidth - d) > 0xd8) {
   2663        1.1    chopps 				d++;
   2664        1.1    chopps 			}
   2665        1.1    chopps 
   2666        1.1    chopps 			ddfstart -= d;
   2667        1.1    chopps 			hstart -= d << 1;
   2668        1.1    chopps 			hstop -= d << 1;
   2669        1.1    chopps 		}
   2670        1.1    chopps 		/* correct the datafetch to proper limits. */
   2671        1.1    chopps 		/* delay the actual display of the data until we need it. */
   2672        1.1    chopps 		ddfstart &= 0xfffc;
   2673        1.1    chopps 		con1 = ((hstart - 9) - (ddfstart << 1)) | (((hstart - 9) - (ddfstart << 1)) << 4);
   2674        1.1    chopps 
   2675        1.1    chopps 		if (phl_this_data->current_view) {
   2676        1.1    chopps 			VDATA(phl_this_data->current_view)->flags &= ~VF_DISPLAY;	/* mark as no longer */
   2677        1.1    chopps 			/* displayed. */
   2678        1.1    chopps 		}
   2679        1.1    chopps 		phl_this_data->current_view = v;
   2680        1.1    chopps 
   2681        1.1    chopps 		cp = phl_this_data->frames[F_LACE_STORE_LONG];
   2682       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   2683  1.28.20.1        ad #if defined (GRF_AGA)
   2684        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_FMODE));
   2685        1.4    chopps 		tmp->cp.inst.operand = 0;
   2686        1.4    chopps #endif
   2687        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BEAMCON0));
   2688        1.1    chopps 		tmp->cp.inst.operand = phl_this_data->beamcon0;
   2689        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWHIGH));
   2690        1.1    chopps 		tmp->cp.inst.operand = CALC_DIWHIGH(hstart, vstart, hstop, vstop);
   2691        1.1    chopps #endif /* ECS */
   2692        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON0));
   2693        1.1    chopps 		tmp->cp.inst.operand = phl_this_data->bplcon0 | ((depth & 0x7) << 12);
   2694        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON1));
   2695        1.1    chopps 		tmp->cp.inst.operand = con1;
   2696        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTART));
   2697        1.1    chopps 		tmp->cp.inst.operand = ((vstart & 0xff) << 8) | (hstart & 0xff);
   2698        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTOP));
   2699        1.1    chopps 		tmp->cp.inst.operand = ((vstop & 0xff) << 8) | (hstop & 0xff);
   2700        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTART));
   2701        1.1    chopps 		tmp->cp.inst.operand = ddfstart;
   2702        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTOP));
   2703        1.1    chopps 		tmp->cp.inst.operand = ddfstart + ddfwidth;
   2704        1.1    chopps 
   2705        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   2706        1.1    chopps 		for (i = 0, j = 0; i < depth; j += 2, i++) {
   2707        1.1    chopps 			/* update the plane pointers */
   2708        1.1    chopps 			tmp[j].cp.inst.operand = HIADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   2709        1.1    chopps 			tmp[j + 1].cp.inst.operand = LOADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   2710        1.1    chopps 		}
   2711        1.1    chopps 
   2712        1.1    chopps 		/* set mods correctly. */
   2713        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL1MOD));
   2714        1.1    chopps 		tmp[0].cp.inst.operand = v->bitmap->bytes_per_row + v->bitmap->row_mod;
   2715        1.1    chopps 		tmp[1].cp.inst.operand = v->bitmap->bytes_per_row + v->bitmap->row_mod;
   2716        1.1    chopps 
   2717        1.1    chopps 		/* set next pointers correctly */
   2718        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   2719        1.1    chopps 		tmp[0].cp.inst.operand = HIADDR(PREP_DMA_MEM(phl_this_data->frames[F_LACE_STORE_SHORT]));
   2720        1.1    chopps 		tmp[1].cp.inst.operand = LOADDR(PREP_DMA_MEM(phl_this_data->frames[F_LACE_STORE_SHORT]));
   2721        1.1    chopps 
   2722        1.1    chopps 
   2723        1.1    chopps 		bcopy(phl_this_data->frames[F_LACE_STORE_LONG], phl_this_data->frames[F_LACE_STORE_SHORT], std_copper_list_size);
   2724        1.1    chopps 
   2725        1.1    chopps 		/* these are the only ones that are different from long frame. */
   2726        1.1    chopps 		cp = phl_this_data->frames[F_LACE_STORE_SHORT];
   2727        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   2728        1.1    chopps 		for (i = 0, j = 0; i < depth; j += 2, i++) {
   2729        1.1    chopps 			u_short mod = v->bitmap->bytes_per_row + v->bitmap->row_mod;
   2730        1.1    chopps 			/* update plane pointers. high and low. */
   2731        1.1    chopps 			tmp[j].cp.inst.operand = HIADDR(PREP_DMA_MEM(&v->bitmap->plane[i][mod]));
   2732        1.1    chopps 			tmp[j + 1].cp.inst.operand = LOADDR(PREP_DMA_MEM(&v->bitmap->plane[i][mod]));
   2733        1.1    chopps 		}
   2734        1.1    chopps 
   2735        1.1    chopps 		/* set next pointers correctly */
   2736        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   2737        1.1    chopps 		tmp[0].cp.inst.operand = HIADDR(PREP_DMA_MEM(phl_this_data->frames[F_LACE_STORE_LONG]));
   2738        1.1    chopps 		tmp[1].cp.inst.operand = LOADDR(PREP_DMA_MEM(phl_this_data->frames[F_LACE_STORE_LONG]));
   2739        1.1    chopps 
   2740        1.1    chopps 
   2741        1.1    chopps 		cp = phl_this_data->frames[F_LACE_LONG];
   2742        1.1    chopps 		phl_this_data->frames[F_LACE_LONG] = phl_this_data->frames[F_LACE_STORE_LONG];
   2743        1.1    chopps 		phl_this_data->frames[F_LACE_STORE_LONG] = cp;
   2744        1.1    chopps 
   2745        1.1    chopps 		cp = phl_this_data->frames[F_LACE_SHORT];
   2746        1.1    chopps 		phl_this_data->frames[F_LACE_SHORT] = phl_this_data->frames[F_LACE_STORE_SHORT];
   2747        1.1    chopps 		phl_this_data->frames[F_LACE_STORE_SHORT] = cp;
   2748        1.1    chopps 
   2749        1.1    chopps 		vd->flags |= VF_DISPLAY;
   2750        1.1    chopps 		cc_use_colormap(v, vd->colormap);
   2751        1.1    chopps 	}
   2752        1.1    chopps 	cc_load_mode(phl_this);
   2753        1.1    chopps }
   2754        1.1    chopps #if defined (GRF_A2024)
   2755        1.1    chopps 
   2756        1.1    chopps dmode_t *
   2757       1.21   aymeric cc_init_pal_hires_dlace(void)
   2758        1.1    chopps {
   2759        1.4    chopps 	/* this function should only be called once. */
   2760        1.1    chopps 	if (!phdl_this) {
   2761        1.1    chopps 		u_short len = std_dlace_copper_list_len;
   2762        1.1    chopps 
   2763        1.1    chopps 		phdl_this = &pal_hires_dlace_mode;
   2764        1.1    chopps 		phdl_this_data = &pal_hires_dlace_mode_data;
   2765        1.1    chopps 		bzero(phdl_this, sizeof(dmode_t));
   2766        1.1    chopps 		bzero(phdl_this_data, sizeof(dmdata_t));
   2767        1.1    chopps 
   2768        1.1    chopps 		phdl_this->name = "pal: hires double interlace";
   2769        1.1    chopps 		phdl_this->nominal_size.width = 640;
   2770        1.1    chopps 		phdl_this->nominal_size.height = 1024;
   2771        1.1    chopps 		phdl_this_data->max_size.width = 724;
   2772        1.1    chopps 		phdl_this_data->max_size.height = 1024;
   2773        1.1    chopps 		phdl_this_data->min_size.width = 320;
   2774        1.1    chopps 		phdl_this_data->min_size.height = 512;
   2775        1.1    chopps 		phdl_this_data->min_depth = 1;
   2776        1.1    chopps 		phdl_this_data->max_depth = 2;
   2777        1.1    chopps 		phdl_this->data = phdl_this_data;
   2778        1.1    chopps 
   2779        1.1    chopps 		phdl_this->get_monitor = cc_get_monitor;
   2780        1.1    chopps 		phdl_this->alloc_view = cc_alloc_view;
   2781        1.1    chopps 		phdl_this->get_current_view = cc_get_current_view;
   2782        1.1    chopps 
   2783        1.1    chopps 		phdl_this_data->use_colormap = cc_a2024_use_colormap;
   2784        1.1    chopps 		phdl_this_data->get_colormap = cc_a2024_get_colormap;
   2785        1.1    chopps 		phdl_this_data->alloc_colormap = cc_a2024_alloc_colormap;
   2786        1.1    chopps 		phdl_this_data->display_view = display_pal_hires_dlace_view;
   2787        1.1    chopps 		phdl_this_data->monitor = cc_monitor;
   2788        1.1    chopps 
   2789        1.1    chopps 		phdl_this_data->flags |= DMF_INTERLACE;
   2790        1.1    chopps 
   2791        1.1    chopps 		phdl_this_data->frames = pal_hires_dlace_frames;
   2792        1.1    chopps 		phdl_this_data->frames[F_LACE_LONG] = alloc_chipmem(std_dlace_copper_list_size * F_LACE_TOTAL);
   2793        1.1    chopps 		if (!phdl_this_data->frames[F_LACE_LONG]) {
   2794        1.1    chopps 			panic("couldn't get chipmem for copper list");
   2795        1.1    chopps 		}
   2796        1.1    chopps 		phdl_this_data->frames[F_LACE_SHORT] = &phdl_this_data->frames[F_LACE_LONG][len];
   2797        1.1    chopps 		phdl_this_data->frames[F_LACE_STORE_LONG] = &phdl_this_data->frames[F_LACE_SHORT][len];
   2798        1.1    chopps 		phdl_this_data->frames[F_LACE_STORE_SHORT] = &phdl_this_data->frames[F_LACE_STORE_LONG][len];
   2799        1.1    chopps 
   2800        1.1    chopps 		bcopy(std_dlace_copper_list, phdl_this_data->frames[F_LACE_STORE_LONG], std_dlace_copper_list_size);
   2801        1.1    chopps 		bcopy(std_dlace_copper_list, phdl_this_data->frames[F_LACE_STORE_SHORT], std_dlace_copper_list_size);
   2802        1.1    chopps 		bcopy(std_dlace_copper_list, phdl_this_data->frames[F_LACE_LONG], std_dlace_copper_list_size);
   2803        1.1    chopps 		bcopy(std_dlace_copper_list, phdl_this_data->frames[F_LACE_SHORT], std_dlace_copper_list_size);
   2804        1.1    chopps 
   2805        1.1    chopps 		phdl_this_data->bplcon0 = 0x8204 | USE_CON3;	/* hires, color
   2806        1.1    chopps 								 * composite enable,
   2807        1.1    chopps 								 * dlace. */
   2808        1.1    chopps 		phdl_this_data->std_start_x = STANDARD_VIEW_X;
   2809        1.1    chopps 		phdl_this_data->std_start_y = STANDARD_VIEW_Y;
   2810        1.1    chopps 		phdl_this_data->vbl_handler = (vbl_handler_func *) cc_lace_mode_vbl_handler;
   2811       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   2812        1.1    chopps 		phdl_this_data->beamcon0 = STANDARD_PAL_BEAMCON;
   2813        1.1    chopps #endif
   2814        1.1    chopps 
   2815        1.3    chopps 		LIST_INSERT_HEAD(&MDATA(cc_monitor)->modes, phdl_this, link);
   2816        1.1    chopps 	}
   2817        1.1    chopps 	return (phdl_this);
   2818        1.1    chopps }
   2819        1.1    chopps 
   2820        1.1    chopps void
   2821       1.21   aymeric display_pal_hires_dlace_view(view_t *v)
   2822        1.1    chopps {
   2823        1.1    chopps 	if (phdl_this_data->current_view != v) {
   2824        1.1    chopps 		vdata_t *vd = VDATA(v);
   2825        1.1    chopps 		cop_t  *cp = phdl_this_data->frames[F_LACE_STORE_LONG], *tmp;
   2826       1.11     veego 		int     depth = v->bitmap->depth;
   2827       1.11     veego 		int     hstart, hstop, vstart, vstop;
   2828        1.1    chopps 		int     x, y, w = v->display.width, h = v->display.height;
   2829        1.1    chopps 		u_short ddfstart, ddfwidth, con1;
   2830        1.1    chopps 		u_short mod1l, mod2l;
   2831        1.1    chopps 
   2832        1.1    chopps 		/* round down to nearest even width */
   2833        1.1    chopps 		/* w &= 0xfffe; */
   2834        1.1    chopps 
   2835        1.1    chopps 		/* calculate datafetch width. */
   2836        1.1    chopps 		ddfwidth = ((v->bitmap->bytes_per_row >> 1) - 2) << 2;
   2837        1.1    chopps 
   2838        1.4    chopps 		/* This will center the any overscanned display */
   2839        1.1    chopps 		/* and allow user to modify. */
   2840        1.1    chopps 		x = v->display.x + phdl_this_data->std_start_x - ((w - 640) >> 2);
   2841        1.1    chopps 		y = v->display.y + phdl_this_data->std_start_y - ((h - 1024) >> 3);
   2842        1.1    chopps 
   2843        1.1    chopps 		if (y & 1)
   2844        1.1    chopps 			y--;
   2845        1.1    chopps 
   2846        1.1    chopps 		if (!(x & 1))
   2847        1.1    chopps 			x--;
   2848        1.1    chopps 
   2849        1.1    chopps 		hstart = x;
   2850        1.1    chopps 		hstop = x + (w >> 1);
   2851        1.1    chopps 		vstart = y;
   2852        1.1    chopps 		vstop = y + (h >> 2);
   2853        1.1    chopps 		ddfstart = (hstart - 9) >> 1;
   2854        1.1    chopps 
   2855        1.1    chopps 		/* check for hardware limits, AGA may allow more..? */
   2856        1.1    chopps 		/* anyone got a 4000 I can borrow :^) -ch */
   2857        1.1    chopps 		if ((ddfstart & 0xfffc) + ddfwidth > 0xd8) {
   2858        1.1    chopps 			int     d = 0;
   2859        1.1    chopps 
   2860        1.1    chopps 			/* XXX anyone know the equality properties of
   2861        1.1    chopps 			 * intermixed logial AND's */
   2862        1.1    chopps 			/* XXX and arithmetic operators? */
   2863        1.1    chopps 			while (((ddfstart & 0xfffc) + ddfwidth - d) > 0xd8) {
   2864        1.1    chopps 				d++;
   2865        1.1    chopps 			}
   2866        1.1    chopps 
   2867        1.1    chopps 			ddfstart -= d;
   2868        1.1    chopps 			hstart -= d << 1;
   2869        1.1    chopps 			hstop -= d << 1;
   2870        1.1    chopps 		}
   2871        1.1    chopps 		/* correct the datafetch to proper limits. */
   2872        1.1    chopps 		/* delay the actual display of the data until we need it. */
   2873        1.1    chopps 		ddfstart &= 0xfffc;
   2874        1.1    chopps 		con1 = ((hstart - 9) - (ddfstart << 1)) | (((hstart - 9) - (ddfstart << 1)) << 4);
   2875        1.1    chopps 
   2876        1.1    chopps 		if (phdl_this_data->current_view) {
   2877        1.1    chopps 			VDATA(phdl_this_data->current_view)->flags &= ~VF_DISPLAY;	/* mark as no longer */
   2878        1.1    chopps 			/* displayed. */
   2879        1.1    chopps 		}
   2880        1.1    chopps 		phdl_this_data->current_view = v;
   2881        1.1    chopps 
   2882        1.1    chopps 		cp = phdl_this_data->frames[F_LACE_STORE_LONG];
   2883       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   2884  1.28.20.1        ad #if defined (GRF_AGA)
   2885        1.4    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_FMODE));
   2886        1.4    chopps 		tmp->cp.inst.operand = 0;
   2887        1.4    chopps #endif
   2888        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BEAMCON0));
   2889        1.1    chopps 		tmp->cp.inst.operand = phdl_this_data->beamcon0;
   2890        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWHIGH));
   2891        1.1    chopps 		tmp->cp.inst.operand = CALC_DIWHIGH(hstart, vstart, hstop, vstop);
   2892        1.1    chopps #endif /* ECS */
   2893        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON0));
   2894        1.1    chopps 		tmp->cp.inst.operand = phdl_this_data->bplcon0 | ((depth & 0x7) << 13);	/* times two. */
   2895        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON1));
   2896        1.1    chopps 		tmp->cp.inst.operand = con1;
   2897        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTART));
   2898        1.1    chopps 		tmp->cp.inst.operand = ((vstart & 0xff) << 8) | (hstart & 0xff);
   2899        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTOP));
   2900        1.1    chopps 		tmp->cp.inst.operand = ((vstop & 0xff) << 8) | (hstop & 0xff);
   2901        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTART));
   2902        1.1    chopps 		tmp->cp.inst.operand = ddfstart;
   2903        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTOP));
   2904        1.1    chopps 		tmp->cp.inst.operand = ddfstart + ddfwidth;
   2905        1.1    chopps 
   2906        1.1    chopps 		mod1l = v->bitmap->bytes_per_row + v->bitmap->row_mod;
   2907        1.1    chopps 		mod2l = mod1l << 1;
   2908        1.1    chopps 
   2909        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   2910        1.1    chopps 		tmp[0].cp.inst.operand = HIADDR(PREP_DMA_MEM(&v->bitmap->plane[0][0]));	/* update plane
   2911        1.1    chopps 											 * pointers. */
   2912        1.1    chopps 		tmp[1].cp.inst.operand = LOADDR(PREP_DMA_MEM(&v->bitmap->plane[0][0]));	/* high and low. */
   2913        1.1    chopps 		tmp[2].cp.inst.operand = HIADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod1l]));	/* update plane
   2914        1.1    chopps 												 * pointers. */
   2915        1.1    chopps 		tmp[3].cp.inst.operand = LOADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod1l]));	/* high and low. */
   2916        1.1    chopps 		if (depth == 2) {
   2917        1.1    chopps 			tmp[4].cp.inst.operand = HIADDR(PREP_DMA_MEM(&v->bitmap->plane[1][0]));	/* update plane
   2918        1.1    chopps 												 * pointers. */
   2919        1.1    chopps 			tmp[5].cp.inst.operand = LOADDR(PREP_DMA_MEM(&v->bitmap->plane[1][0]));	/* high and low. */
   2920        1.1    chopps 			tmp[6].cp.inst.operand = HIADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod1l]));	/* update plane
   2921        1.1    chopps 													 * pointers. */
   2922        1.1    chopps 			tmp[7].cp.inst.operand = LOADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod1l]));	/* high and low. */
   2923        1.1    chopps 		}
   2924        1.1    chopps 		/* set mods correctly. */
   2925        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL1MOD));
   2926        1.1    chopps 		tmp[0].cp.inst.operand = mod2l + mod1l;
   2927        1.1    chopps 		tmp[1].cp.inst.operand = mod2l + mod1l;
   2928        1.1    chopps 
   2929        1.1    chopps 		/* set next pointers correctly */
   2930        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   2931        1.1    chopps 		tmp[0].cp.inst.operand = HIADDR(PREP_DMA_MEM(phdl_this_data->frames[F_LACE_STORE_SHORT]));
   2932        1.1    chopps 		tmp[1].cp.inst.operand = LOADDR(PREP_DMA_MEM(phdl_this_data->frames[F_LACE_STORE_SHORT]));
   2933        1.1    chopps 
   2934        1.1    chopps 		bcopy(phdl_this_data->frames[F_LACE_STORE_LONG], phdl_this_data->frames[F_LACE_STORE_SHORT], std_dlace_copper_list_size);
   2935        1.1    chopps 
   2936        1.1    chopps 		/* these are the only ones that are different from long frame. */
   2937        1.1    chopps 		cp = phdl_this_data->frames[F_LACE_STORE_SHORT];
   2938        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   2939        1.1    chopps 		tmp[0].cp.inst.operand = HIADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod2l]));	/* update plane
   2940        1.1    chopps 												 * pointers. */
   2941        1.1    chopps 		tmp[1].cp.inst.operand = LOADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod2l]));	/* high and low. */
   2942        1.1    chopps 		tmp[2].cp.inst.operand = HIADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod2l + mod1l]));	/* update plane
   2943        1.1    chopps 													 * pointers. */
   2944        1.1    chopps 		tmp[3].cp.inst.operand = LOADDR(PREP_DMA_MEM(&v->bitmap->plane[0][mod2l + mod1l]));	/* high and low. */
   2945        1.1    chopps 		if (depth == 2) {
   2946        1.1    chopps 			tmp[4].cp.inst.operand = HIADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod2l]));	/* update plane
   2947        1.1    chopps 													 * pointers. */
   2948        1.1    chopps 			tmp[5].cp.inst.operand = LOADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod2l]));	/* high and low. */
   2949        1.1    chopps 			tmp[6].cp.inst.operand = HIADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod2l + mod1l]));	/* update plane
   2950        1.1    chopps 														 * pointers. */
   2951        1.1    chopps 			tmp[7].cp.inst.operand = LOADDR(PREP_DMA_MEM(&v->bitmap->plane[1][mod2l + mod1l]));	/* high and low. */
   2952        1.1    chopps 		}
   2953        1.1    chopps 		/* set next pointers correctly */
   2954        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   2955        1.1    chopps 		tmp[0].cp.inst.operand = HIADDR(PREP_DMA_MEM(phdl_this_data->frames[F_LACE_STORE_LONG]));
   2956        1.1    chopps 		tmp[1].cp.inst.operand = LOADDR(PREP_DMA_MEM(phdl_this_data->frames[F_LACE_STORE_LONG]));
   2957        1.1    chopps 
   2958        1.1    chopps 		cp = phdl_this_data->frames[F_LACE_LONG];
   2959        1.1    chopps 		phdl_this_data->frames[F_LACE_LONG] = phdl_this_data->frames[F_LACE_STORE_LONG];
   2960        1.1    chopps 		phdl_this_data->frames[F_LACE_STORE_LONG] = cp;
   2961        1.1    chopps 
   2962        1.1    chopps 		cp = phdl_this_data->frames[F_LACE_SHORT];
   2963        1.1    chopps 		phdl_this_data->frames[F_LACE_SHORT] = phdl_this_data->frames[F_LACE_STORE_SHORT];
   2964        1.1    chopps 		phdl_this_data->frames[F_LACE_STORE_SHORT] = cp;
   2965        1.1    chopps 
   2966        1.1    chopps 		vd->flags |= VF_DISPLAY;
   2967        1.1    chopps 
   2968        1.1    chopps 		cc_a2024_use_colormap(v, vd->colormap);
   2969        1.1    chopps 	}
   2970        1.1    chopps 	cc_load_mode(phdl_this);
   2971        1.1    chopps }
   2972        1.1    chopps 
   2973        1.1    chopps dmode_t *
   2974       1.21   aymeric cc_init_pal_a2024(void)
   2975        1.1    chopps {
   2976        1.4    chopps 	/* this function should only be called once. */
   2977        1.1    chopps 	if (!p24_this) {
   2978        1.1    chopps 		int     i;
   2979        1.1    chopps 		u_short len = std_pal_a2024_copper_list_len;
   2980        1.1    chopps 		cop_t  *cp;
   2981        1.1    chopps 
   2982        1.1    chopps 		p24_this = &pal_a2024_mode;
   2983        1.1    chopps 		p24_this_data = &pal_a2024_mode_data;
   2984        1.1    chopps 		bzero(p24_this, sizeof(dmode_t));
   2985        1.1    chopps 		bzero(p24_this_data, sizeof(dmdata_t));
   2986        1.1    chopps 
   2987       1.28     lukem 		p24_this->name = "pal: A2024 15 kHz";
   2988        1.1    chopps 		p24_this->nominal_size.width = 1024;
   2989        1.1    chopps 		p24_this->nominal_size.height = 1024;
   2990        1.1    chopps 		p24_this_data->max_size.width = 1024;
   2991        1.1    chopps 		p24_this_data->max_size.height = 1024;
   2992        1.1    chopps 		p24_this_data->min_size.width = 1024;
   2993        1.1    chopps 		p24_this_data->min_size.height = 1024;
   2994        1.1    chopps 		p24_this_data->min_depth = 1;
   2995        1.1    chopps 		p24_this_data->max_depth = 2;
   2996        1.1    chopps 		p24_this->data = p24_this_data;
   2997        1.1    chopps 
   2998        1.1    chopps 		p24_this->get_monitor = cc_get_monitor;
   2999        1.1    chopps 		p24_this->alloc_view = cc_alloc_view;
   3000        1.1    chopps 		p24_this->get_current_view = cc_get_current_view;
   3001        1.1    chopps 
   3002        1.1    chopps 		p24_this_data->use_colormap = cc_a2024_use_colormap;
   3003        1.1    chopps 		p24_this_data->get_colormap = cc_a2024_get_colormap;
   3004        1.1    chopps 		p24_this_data->display_view = display_pal_a2024_view;
   3005        1.1    chopps 		p24_this_data->alloc_colormap = cc_a2024_alloc_colormap;
   3006        1.1    chopps 		p24_this_data->monitor = cc_monitor;
   3007        1.1    chopps 
   3008        1.1    chopps 		p24_this_data->flags |= DMF_HEDLEY_EXP;
   3009        1.1    chopps 
   3010        1.1    chopps 		p24_this_data->frames = pal_a2024_frames;
   3011        1.1    chopps 		p24_this_data->frames[F_QD_QUAD0] = alloc_chipmem(std_pal_a2024_copper_list_size * F_QD_TOTAL);
   3012        1.1    chopps 		if (!p24_this_data->frames[F_QD_QUAD0]) {
   3013        1.1    chopps 			panic("couldn't get chipmem for copper list");
   3014        1.1    chopps 		}
   3015        1.1    chopps 		/* setup the hedley init bitplane. */
   3016        1.1    chopps 		hedley_init = alloc_chipmem(128);
   3017        1.1    chopps 		if (!hedley_init) {
   3018        1.1    chopps 			panic("couldn't get chipmem for hedley init bitplane");
   3019        1.1    chopps 		}
   3020        1.1    chopps 		for (i = 1; i < 128; i++)
   3021        1.1    chopps 			hedley_init[i] = 0xff;
   3022        1.1    chopps 		hedley_init[0] = 0x03;
   3023        1.1    chopps 
   3024        1.1    chopps 		/* copy image of standard copper list. */
   3025        1.1    chopps 		bcopy(std_pal_a2024_copper_list, p24_this_data->frames[0], std_pal_a2024_copper_list_size);
   3026        1.1    chopps 
   3027        1.1    chopps 		/* set the init plane pointer. */
   3028        1.1    chopps 		cp = find_copper_inst(p24_this_data->frames[F_QD_QUAD0], CI_MOVE(R_BPL0PTH));
   3029        1.1    chopps 		cp[0].cp.inst.operand = HIADDR(PREP_DMA_MEM(hedley_init));
   3030        1.1    chopps 		cp[1].cp.inst.operand = LOADDR(PREP_DMA_MEM(hedley_init));
   3031        1.1    chopps 
   3032        1.1    chopps 		for (i = 1; i < F_QD_TOTAL; i++) {
   3033        1.1    chopps 			p24_this_data->frames[i] = &p24_this_data->frames[i - 1][len];
   3034        1.1    chopps 			bcopy(p24_this_data->frames[0], p24_this_data->frames[i], std_pal_a2024_copper_list_size);
   3035        1.1    chopps 		}
   3036        1.1    chopps 
   3037        1.1    chopps 		p24_this_data->bplcon0 = 0x8200;	/* hires */
   3038        1.1    chopps 		p24_this_data->vbl_handler = (vbl_handler_func *) pal_a2024_mode_vbl_handler;
   3039        1.1    chopps 
   3040        1.1    chopps 
   3041        1.3    chopps 		LIST_INSERT_HEAD(&MDATA(cc_monitor)->modes, p24_this, link);
   3042        1.1    chopps 	}
   3043        1.1    chopps 	return (p24_this);
   3044        1.1    chopps }
   3045        1.1    chopps 
   3046        1.1    chopps void
   3047       1.21   aymeric display_pal_a2024_view(view_t *v)
   3048        1.1    chopps {
   3049        1.1    chopps 	if (p24_this_data->current_view != v) {
   3050        1.1    chopps 		vdata_t *vd = VDATA(v);
   3051        1.1    chopps 		cop_t  *cp, *tmp;
   3052        1.1    chopps 		u_char *inst_plane[2];
   3053        1.1    chopps 		u_char **plane = inst_plane;
   3054        1.1    chopps 		u_long  full_line = v->bitmap->bytes_per_row + v->bitmap->row_mod;
   3055        1.1    chopps 		u_long  half_plane = full_line * v->bitmap->rows / 2;
   3056        1.1    chopps 
   3057        1.1    chopps 		int     depth = v->bitmap->depth, i, j;
   3058        1.1    chopps 
   3059        1.1    chopps 		plane[0] = v->bitmap->plane[0];
   3060        1.1    chopps 		if (depth == 2) {
   3061        1.1    chopps 			plane[1] = v->bitmap->plane[1];
   3062        1.1    chopps 		}
   3063        1.1    chopps 		if (p24_this_data->current_view) {
   3064        1.1    chopps 			VDATA(p24_this_data->current_view)->flags &= ~VF_DISPLAY;	/* mark as no longer
   3065        1.1    chopps 											 * displayed. */
   3066        1.1    chopps 		}
   3067        1.1    chopps 		cp = p24_this_data->frames[F_QD_STORE_QUAD0];
   3068        1.1    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COLOR1F));
   3069        1.1    chopps 		tmp = find_copper_inst(tmp, CI_MOVE(R_BPLCON0));	/* grab third one. */
   3070        1.1    chopps 		tmp->cp.inst.operand = p24_this_data->bplcon0 | ((depth & 0x7) << 13);	/* times 2 */
   3071        1.1    chopps 
   3072        1.1    chopps 		bcopy(p24_this_data->frames[F_QD_STORE_QUAD0], p24_this_data->frames[F_QD_STORE_QUAD1], std_pal_a2024_copper_list_size);
   3073        1.1    chopps 		bcopy(p24_this_data->frames[F_QD_STORE_QUAD0], p24_this_data->frames[F_QD_STORE_QUAD2], std_pal_a2024_copper_list_size);
   3074        1.1    chopps 		bcopy(p24_this_data->frames[F_QD_STORE_QUAD0], p24_this_data->frames[F_QD_STORE_QUAD3], std_pal_a2024_copper_list_size);
   3075        1.1    chopps 
   3076        1.1    chopps 		/*
   3077        1.1    chopps 		 * Mark Id's
   3078        1.1    chopps 		 */
   3079        1.1    chopps 		tmp = find_copper_inst(p24_this_data->frames[F_QD_STORE_QUAD1], CI_WAIT(126, 29));
   3080        1.1    chopps 		CBUMP(tmp);
   3081        1.1    chopps 		CMOVE(tmp, R_COLOR01, QUAD1_ID);
   3082        1.1    chopps 		tmp = find_copper_inst(p24_this_data->frames[F_QD_STORE_QUAD2], CI_WAIT(126, 29));
   3083        1.1    chopps 		CBUMP(tmp);
   3084        1.1    chopps 		CMOVE(tmp, R_COLOR01, QUAD2_ID);
   3085        1.1    chopps 		tmp = find_copper_inst(p24_this_data->frames[F_QD_STORE_QUAD3], CI_WAIT(126, 29));
   3086        1.1    chopps 		CBUMP(tmp);
   3087        1.1    chopps 		CMOVE(tmp, R_COLOR01, QUAD3_ID);
   3088        1.1    chopps 
   3089        1.1    chopps 		plane[0]--;
   3090        1.1    chopps 		plane[0]--;
   3091        1.1    chopps 		if (depth == 2) {
   3092        1.1    chopps 			plane[1]--;
   3093        1.1    chopps 			plane[1]--;
   3094        1.1    chopps 		}
   3095        1.1    chopps 		/*
   3096        1.1    chopps 		 * Set bitplane pointers.
   3097        1.1    chopps 		 */
   3098        1.1    chopps 		tmp = find_copper_inst(p24_this_data->frames[F_QD_STORE_QUAD0], CI_MOVE(R_BPLMOD2));
   3099        1.1    chopps 		CBUMP(tmp);
   3100        1.1    chopps 		CMOVE(tmp, R_BPL0PTH, HIADDR(PREP_DMA_MEM(&plane[0][0])));
   3101        1.1    chopps 		CMOVE(tmp, R_BPL0PTL, LOADDR(PREP_DMA_MEM(&plane[0][0])));
   3102        1.1    chopps 		CMOVE(tmp, R_BPL1PTH, HIADDR(PREP_DMA_MEM(&plane[0][full_line])));
   3103        1.1    chopps 		CMOVE(tmp, R_BPL1PTL, LOADDR(PREP_DMA_MEM(&plane[0][full_line])));
   3104        1.1    chopps 		if (depth == 2) {
   3105        1.1    chopps 			CMOVE(tmp, R_BPL2PTH, HIADDR(PREP_DMA_MEM(&plane[1][0])));
   3106        1.1    chopps 			CMOVE(tmp, R_BPL2PTL, LOADDR(PREP_DMA_MEM(&plane[1][0])));
   3107        1.1    chopps 			CMOVE(tmp, R_BPL3PTH, HIADDR(PREP_DMA_MEM(&plane[1][full_line])));
   3108        1.1    chopps 			CMOVE(tmp, R_BPL3PTL, LOADDR(PREP_DMA_MEM(&plane[1][full_line])));
   3109        1.1    chopps 		}
   3110       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   3111        1.1    chopps 		CMOVE(tmp, R_DIWHIGH, 0x2100);
   3112        1.1    chopps #endif
   3113        1.1    chopps 		CMOVE(tmp, R_COP1LCH, HIADDR(PREP_DMA_MEM(p24_this_data->frames[F_QD_STORE_QUAD1])));
   3114        1.1    chopps 		CMOVE(tmp, R_COP1LCL, LOADDR(PREP_DMA_MEM(p24_this_data->frames[F_QD_STORE_QUAD1])));
   3115        1.1    chopps 		CEND(tmp);
   3116        1.1    chopps 		CEND(tmp);
   3117        1.1    chopps 
   3118        1.1    chopps 		tmp = find_copper_inst(p24_this_data->frames[F_QD_STORE_QUAD1], CI_MOVE(R_BPLMOD2));
   3119        1.1    chopps 		CBUMP(tmp);
   3120        1.1    chopps 		CMOVE(tmp, R_BPL0PTH, HIADDR(PREP_DMA_MEM(&plane[0][HALF_2024_LINE])));
   3121        1.1    chopps 		CMOVE(tmp, R_BPL0PTL, LOADDR(PREP_DMA_MEM(&plane[0][HALF_2024_LINE])));
   3122        1.1    chopps 		CMOVE(tmp, R_BPL1PTH, HIADDR(PREP_DMA_MEM(&plane[0][full_line + HALF_2024_LINE])));
   3123        1.1    chopps 		CMOVE(tmp, R_BPL1PTL, LOADDR(PREP_DMA_MEM(&plane[0][full_line + HALF_2024_LINE])));
   3124        1.1    chopps 		if (depth == 2) {
   3125        1.1    chopps 			CMOVE(tmp, R_BPL2PTH, HIADDR(PREP_DMA_MEM(&plane[1][HALF_2024_LINE])));
   3126        1.1    chopps 			CMOVE(tmp, R_BPL2PTL, LOADDR(PREP_DMA_MEM(&plane[1][HALF_2024_LINE])));
   3127        1.1    chopps 			CMOVE(tmp, R_BPL3PTH, HIADDR(PREP_DMA_MEM(&plane[1][full_line + HALF_2024_LINE])));
   3128        1.1    chopps 			CMOVE(tmp, R_BPL3PTL, LOADDR(PREP_DMA_MEM(&plane[1][full_line + HALF_2024_LINE])));
   3129        1.1    chopps 		}
   3130       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   3131        1.1    chopps 		CMOVE(tmp, R_DIWHIGH, 0x2100);
   3132        1.1    chopps #endif
   3133        1.1    chopps 		CMOVE(tmp, R_COP1LCH, HIADDR(PREP_DMA_MEM(p24_this_data->frames[F_QD_STORE_QUAD2])));
   3134        1.1    chopps 		CMOVE(tmp, R_COP1LCL, LOADDR(PREP_DMA_MEM(p24_this_data->frames[F_QD_STORE_QUAD2])));
   3135        1.1    chopps 		CEND(tmp);
   3136        1.1    chopps 		CEND(tmp);
   3137        1.1    chopps 
   3138        1.1    chopps 		tmp = find_copper_inst(p24_this_data->frames[F_QD_STORE_QUAD2], CI_MOVE(R_BPLMOD2));
   3139        1.1    chopps 		CBUMP(tmp);
   3140        1.1    chopps 		CMOVE(tmp, R_BPL0PTH, HIADDR(PREP_DMA_MEM(&plane[0][half_plane])));
   3141        1.1    chopps 		CMOVE(tmp, R_BPL0PTL, LOADDR(PREP_DMA_MEM(&plane[0][half_plane])));
   3142        1.1    chopps 		CMOVE(tmp, R_BPL1PTH, HIADDR(PREP_DMA_MEM(&plane[0][half_plane + full_line])));
   3143        1.1    chopps 		CMOVE(tmp, R_BPL1PTL, LOADDR(PREP_DMA_MEM(&plane[0][half_plane + full_line])));
   3144        1.1    chopps 		if (depth == 2) {
   3145        1.1    chopps 			CMOVE(tmp, R_BPL2PTH, HIADDR(PREP_DMA_MEM(&plane[1][half_plane])));
   3146        1.1    chopps 			CMOVE(tmp, R_BPL2PTL, LOADDR(PREP_DMA_MEM(&plane[1][half_plane])));
   3147        1.1    chopps 			CMOVE(tmp, R_BPL3PTH, HIADDR(PREP_DMA_MEM(&plane[1][half_plane + full_line])));
   3148        1.1    chopps 			CMOVE(tmp, R_BPL3PTL, LOADDR(PREP_DMA_MEM(&plane[1][half_plane + full_line])));
   3149        1.1    chopps 		}
   3150       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   3151        1.1    chopps 		CMOVE(tmp, R_DIWHIGH, 0x2100);
   3152        1.1    chopps #endif
   3153        1.1    chopps 		CMOVE(tmp, R_COP1LCH, HIADDR(PREP_DMA_MEM(p24_this_data->frames[F_QD_STORE_QUAD3])));
   3154        1.1    chopps 		CMOVE(tmp, R_COP1LCL, LOADDR(PREP_DMA_MEM(p24_this_data->frames[F_QD_STORE_QUAD3])));
   3155        1.1    chopps 		CEND(tmp);
   3156        1.1    chopps 		CEND(tmp);
   3157        1.1    chopps 
   3158        1.1    chopps 		tmp = find_copper_inst(p24_this_data->frames[F_QD_STORE_QUAD3], CI_MOVE(R_BPLMOD2));
   3159        1.1    chopps 		CBUMP(tmp);
   3160        1.1    chopps 		CMOVE(tmp, R_BPL0PTH, HIADDR(PREP_DMA_MEM(&plane[0][half_plane + HALF_2024_LINE])));
   3161        1.1    chopps 		CMOVE(tmp, R_BPL0PTL, LOADDR(PREP_DMA_MEM(&plane[0][half_plane + HALF_2024_LINE])));
   3162        1.1    chopps 		CMOVE(tmp, R_BPL1PTH, HIADDR(PREP_DMA_MEM(&plane[0][half_plane + full_line + HALF_2024_LINE])));
   3163        1.1    chopps 		CMOVE(tmp, R_BPL1PTL, LOADDR(PREP_DMA_MEM(&plane[0][half_plane + full_line + HALF_2024_LINE])));
   3164        1.1    chopps 		if (depth == 2) {
   3165        1.1    chopps 			CMOVE(tmp, R_BPL2PTH, HIADDR(PREP_DMA_MEM(&plane[1][half_plane + HALF_2024_LINE])));
   3166        1.1    chopps 			CMOVE(tmp, R_BPL2PTL, LOADDR(PREP_DMA_MEM(&plane[1][half_plane + HALF_2024_LINE])));
   3167        1.1    chopps 			CMOVE(tmp, R_BPL3PTH, HIADDR(PREP_DMA_MEM(&plane[1][half_plane + full_line + HALF_2024_LINE])));
   3168        1.1    chopps 			CMOVE(tmp, R_BPL3PTL, LOADDR(PREP_DMA_MEM(&plane[1][half_plane + full_line + HALF_2024_LINE])));
   3169        1.1    chopps 		}
   3170       1.10    chopps #if defined (GRF_ECS) || defined (GRF_AGA)
   3171        1.1    chopps 		CMOVE(tmp, R_DIWHIGH, 0x2100);
   3172        1.1    chopps #endif
   3173        1.1    chopps 		CMOVE(tmp, R_COP1LCH, HIADDR(PREP_DMA_MEM(p24_this_data->frames[F_QD_STORE_QUAD0])));
   3174        1.1    chopps 		CMOVE(tmp, R_COP1LCL, LOADDR(PREP_DMA_MEM(p24_this_data->frames[F_QD_STORE_QUAD0])));
   3175        1.1    chopps 		CEND(tmp);
   3176        1.1    chopps 		CEND(tmp);
   3177        1.1    chopps 
   3178        1.1    chopps 		/* swap new pointers in. */
   3179        1.1    chopps 		for (i = F_QD_STORE_QUAD0, j = F_QD_QUAD0;
   3180        1.1    chopps 		    i <= F_QD_STORE_QUAD3; i++, j++) {
   3181        1.1    chopps 			cp = p24_this_data->frames[j];
   3182        1.1    chopps 			p24_this_data->frames[j] = p24_this_data->frames[i];
   3183        1.1    chopps 			p24_this_data->frames[i] = cp;
   3184        1.1    chopps 		}
   3185        1.1    chopps 
   3186        1.1    chopps 		p24_this_data->current_view = v;
   3187        1.1    chopps 		vd->flags |= VF_DISPLAY;
   3188        1.1    chopps 
   3189        1.1    chopps 		cc_a2024_use_colormap(v, vd->colormap);
   3190        1.1    chopps 	}
   3191        1.1    chopps 	cc_load_mode(p24_this);
   3192        1.1    chopps }
   3193        1.1    chopps 
   3194        1.1    chopps void
   3195       1.21   aymeric pal_a2024_mode_vbl_handler(dmode_t *d)
   3196        1.1    chopps {
   3197        1.1    chopps 	u_short vp = ((custom.vposr & 0x0007) << 8) | ((custom.vhposr) >> 8);
   3198        1.1    chopps 
   3199        1.1    chopps 	if (vp < 20) {
   3200        1.1    chopps 		custom.cop1lc = PREP_DMA_MEM(p24_this_data->frames[p24_this_data->hedley_current]);
   3201        1.1    chopps 		custom.copjmp1 = 0;
   3202        1.1    chopps 	}
   3203        1.1    chopps 	p24_this_data->hedley_current++;
   3204        1.1    chopps 	p24_this_data->hedley_current &= 0x3;	/* if 4 then 0. */
   3205        1.1    chopps }
   3206        1.7    chopps #endif /* GRF_A2024 */
   3207        1.7    chopps 
   3208        1.7    chopps #if defined (GRF_AGA)
   3209        1.7    chopps 
   3210        1.7    chopps dmode_t *
   3211       1.21   aymeric cc_init_pal_aga(void)
   3212        1.7    chopps {
   3213        1.7    chopps 	/* this function should only be called once. */
   3214        1.7    chopps 	if (!paga_this && (custom.deniseid & 0xff) == 0xf8 &&
   3215        1.7    chopps 	    aga_enable & AGA_ENABLE) {
   3216        1.7    chopps 		u_short len = aga_copper_list_len;
   3217        1.7    chopps 
   3218        1.7    chopps 		paga_this = &paga_mode;
   3219        1.7    chopps 		paga_this_data = &paga_mode_data;
   3220        1.7    chopps 		bzero(paga_this, sizeof(dmode_t));
   3221        1.7    chopps 		bzero(paga_this_data, sizeof(dmdata_t));
   3222        1.7    chopps 
   3223        1.7    chopps 		paga_this->name = "pal: AGA dbl";
   3224        1.7    chopps 		paga_this->nominal_size.width = 640;
   3225        1.7    chopps 		paga_this->nominal_size.height = 512;
   3226        1.7    chopps 		paga_this_data->max_size.width = 720;
   3227        1.7    chopps 		paga_this_data->max_size.height = 564;
   3228        1.7    chopps 		paga_this_data->min_size.width = 320;
   3229        1.7    chopps 		paga_this_data->min_size.height = 200;
   3230        1.7    chopps 		paga_this_data->min_depth = 1;
   3231        1.7    chopps 		paga_this_data->max_depth = 8;
   3232        1.7    chopps 		paga_this->data = paga_this_data;
   3233        1.7    chopps 
   3234        1.7    chopps 		paga_this->get_monitor = cc_get_monitor;
   3235        1.7    chopps 		paga_this->alloc_view = cc_alloc_view;
   3236        1.7    chopps 		paga_this->get_current_view = cc_get_current_view;
   3237        1.7    chopps 
   3238        1.7    chopps 		paga_this_data->use_colormap = cc_use_aga_colormap;
   3239        1.7    chopps 		paga_this_data->get_colormap = cc_get_colormap;
   3240        1.7    chopps 		paga_this_data->alloc_colormap = cc_alloc_aga_colormap;
   3241        1.7    chopps 		paga_this_data->display_view = display_pal_aga_view;
   3242        1.7    chopps 		paga_this_data->monitor = cc_monitor;
   3243        1.7    chopps 
   3244        1.7    chopps 		paga_this_data->frames = paga_frames;
   3245        1.7    chopps 		paga_this_data->frames[F_LONG] = alloc_chipmem(aga_copper_list_size * F_TOTAL);
   3246        1.7    chopps 		if (!paga_this_data->frames[F_LONG]) {
   3247        1.7    chopps 			panic("couldn't get chipmem for copper list");
   3248        1.7    chopps 		}
   3249        1.7    chopps 		paga_this_data->frames[F_STORE_LONG] = &paga_this_data->frames[F_LONG][len];
   3250        1.7    chopps 
   3251        1.7    chopps 		bcopy(aga_copper_list, paga_this_data->frames[F_STORE_LONG], aga_copper_list_size);
   3252        1.7    chopps 		bcopy(aga_copper_list, paga_this_data->frames[F_LONG], aga_copper_list_size);
   3253        1.7    chopps 
   3254        1.7    chopps 		paga_this_data->bplcon0 = 0x0240 | USE_CON3;	/* color composite
   3255        1.7    chopps 								 * enable,
   3256        1.7    chopps 								 * shres. */
   3257        1.7    chopps 		paga_this_data->std_start_x = 0x4f /*STANDARD_VIEW_X*/;
   3258        1.7    chopps 		paga_this_data->std_start_y = 0x2b /*STANDARD_VIEW_Y*/;
   3259        1.7    chopps 		paga_this_data->vbl_handler = (vbl_handler_func *) cc_mode_vbl_handler;
   3260        1.7    chopps 		paga_this_data->beamcon0 = STANDARD_PAL_BEAMCON | (SPECIAL_BEAMCON ^ VSYNCTRUE);
   3261        1.7    chopps 
   3262        1.7    chopps 		LIST_INSERT_HEAD(&MDATA(cc_monitor)->modes,
   3263        1.7    chopps 		    paga_this, link);
   3264        1.7    chopps 	}
   3265        1.7    chopps 	return (paga_this);
   3266        1.7    chopps }
   3267        1.7    chopps 
   3268       1.18        is /* static, so I can patch and play */
   3269        1.7    chopps 
   3270       1.18        is #ifdef GRF_AGA_VGA
   3271       1.18        is int	pAGA_htotal  = 0x079;
   3272       1.18        is int	pAGA_vtotal  = 0x24d;
   3273       1.18        is int	pAGA_vbstop  = 0x019;
   3274       1.18        is int	pAGA_hcenter = 0x04b;
   3275       1.18        is #else
   3276       1.18        is int	pAGA_htotal  = 0x081;
   3277       1.18        is int	pAGA_vtotal  = 0x23d;
   3278       1.18        is int	pAGA_vbstop  = 0x017;
   3279       1.18        is int	pAGA_hcenter = 0x04f;
   3280       1.18        is #endif
   3281       1.18        is int	pAGA_hsstrt  = 0x00f;
   3282       1.18        is int	pAGA_hsstop  = 0x019;
   3283       1.18        is int	pAGA_hbstrt  = 0x001;
   3284       1.18        is int	pAGA_hbstop  = 0x021;
   3285       1.18        is int	pAGA_vsstrt  = 0x001;
   3286       1.18        is int	pAGA_vsstop  = 0x008;
   3287       1.18        is int	pAGA_vbstrt  = 0x000;
   3288        1.7    chopps 
   3289        1.7    chopps void
   3290       1.21   aymeric display_pal_aga_view(view_t *v)
   3291        1.7    chopps {
   3292        1.7    chopps 	if (paga_this_data->current_view != v) {
   3293        1.7    chopps 		vdata_t *vd = VDATA(v);
   3294        1.7    chopps 		cop_t  *cp = paga_this_data->frames[F_STORE_LONG], *tmp;
   3295        1.7    chopps 		int     depth = v->bitmap->depth, i;
   3296        1.7    chopps 		int     hstart, hstop, vstart, vstop, j;
   3297        1.7    chopps 		int     x, y, w = v->display.width, h = v->display.height;
   3298        1.7    chopps 		u_short ddfstart, ddfwidth, con1;
   3299        1.7    chopps 
   3300        1.7    chopps #ifdef DEBUG
   3301        1.7    chopps 		if (aga_enable & AGA_TRACE)
   3302       1.15  christos 			printf("display_aga_view(%dx%dx%d) %p\n", w, h,
   3303        1.7    chopps 			    depth, v);
   3304        1.7    chopps #endif
   3305        1.7    chopps 		/* round down to nearest even width */
   3306        1.7    chopps 		/* w &= 0xfffe; */
   3307        1.7    chopps 		/* calculate datafetch width. */
   3308        1.7    chopps 
   3309        1.7    chopps 		ddfwidth = ((v->bitmap->bytes_per_row >> 1) - 4) << 1;
   3310        1.7    chopps 
   3311        1.7    chopps 		/* this will center the any overscanned display */
   3312        1.7    chopps 		/* and allow user to modify. */
   3313        1.7    chopps 		x = v->display.x + paga_this_data->std_start_x - ((w - 640) >> 3);
   3314        1.7    chopps 		y = v->display.y + paga_this_data->std_start_y - ((h - 512) >> 1);
   3315        1.7    chopps 
   3316        1.7    chopps 		if (y & 1)
   3317        1.7    chopps 			y--;
   3318        1.7    chopps 
   3319        1.7    chopps 		if (!(x & 1))
   3320        1.7    chopps 			x--;
   3321        1.7    chopps 
   3322        1.7    chopps 		hstart = x;
   3323        1.7    chopps 		hstop = x + (w >> 2);
   3324        1.7    chopps 		vstart = y;
   3325        1.7    chopps 		vstop = y + (h >> 0);
   3326        1.7    chopps 		ddfstart = (hstart >> 1) - 8;
   3327        1.7    chopps 
   3328        1.7    chopps #ifdef DEBUG
   3329        1.7    chopps 		if (aga_enable & AGA_TRACE2) {
   3330       1.15  christos 			printf ("  ddfwidth %04x x %04x y %04x", ddfwidth,
   3331        1.7    chopps 			    x, y);
   3332       1.15  christos 			printf (" hstart %04x hstop %04x vstart %04x vstop %04x ddfstart %04x\n",
   3333        1.7    chopps 			    hstart, hstop, vstart, vstop, ddfstart);
   3334        1.7    chopps 		}
   3335        1.7    chopps #endif
   3336        1.7    chopps 		/* check for hardware limits, AGA may allow more..? */
   3337        1.7    chopps 		/* anyone got a 4000 I can borrow :^) -ch */
   3338        1.7    chopps 		if ((ddfstart & 0xfffc) + ddfwidth > 0xd8) {
   3339        1.7    chopps 			int     d = 0;
   3340        1.7    chopps 
   3341        1.7    chopps 			/* XXX anyone know the equality properties of
   3342        1.7    chopps 			 * intermixed logial AND's */
   3343        1.7    chopps 			/* XXX and arithmetic operators? */
   3344        1.7    chopps 			while (((ddfstart & 0xfffc) + ddfwidth - d) > 0xd8) {
   3345        1.7    chopps 				d++;
   3346        1.7    chopps 			}
   3347        1.7    chopps 
   3348        1.7    chopps 			ddfstart -= d;
   3349        1.7    chopps 			hstart -= d << 1;
   3350        1.7    chopps 			hstop -= d << 1;
   3351        1.7    chopps 		}
   3352        1.7    chopps 		/* correct the datafetch to proper limits. */
   3353        1.7    chopps 		/* delay the actual display of the data until we need it. */
   3354        1.7    chopps 		ddfstart &= 0xfffc;
   3355        1.7    chopps #ifdef DEBUG
   3356        1.7    chopps 		if (aga_enable & AGA_TRACE2) {
   3357       1.15  christos 			printf ("  ddfwidth %04x x %04x y %04x", ddfwidth,
   3358        1.7    chopps 			    x, y);
   3359       1.15  christos 			printf (" hstart %04x hstop %04x vstart %04x vstop %04x ddfstart %04x\n",
   3360        1.7    chopps 			    hstart, hstop, vstart, vstop, ddfstart);
   3361        1.7    chopps 		}
   3362        1.7    chopps #endif
   3363        1.7    chopps 		con1 = ((hstart - 9) - (ddfstart << 1)) | (((hstart - 9) - (ddfstart << 1)) << 4);
   3364        1.7    chopps 
   3365        1.7    chopps 		if (paga_this_data->current_view) {
   3366        1.7    chopps 			VDATA(paga_this_data->current_view)->flags &= ~VF_DISPLAY;	/* mark as no longer */
   3367        1.7    chopps 			/* displayed. */
   3368        1.7    chopps 		}
   3369        1.7    chopps 		paga_this_data->current_view = v;
   3370        1.7    chopps 
   3371        1.7    chopps 		cp = paga_this_data->frames[F_STORE_LONG];
   3372        1.7    chopps 		tmp = cp;
   3373        1.7    chopps 		for (i = 0; i < 8; ++i) {
   3374        1.7    chopps 			if (tmp == NULL)
   3375        1.7    chopps 				break;
   3376        1.7    chopps 			tmp = find_copper_inst(tmp + 1, CI_MOVE(R_BPLCON3));
   3377        1.7    chopps 			if (tmp == NULL)
   3378        1.7    chopps 				break;
   3379        1.7    chopps 			tmp->cp.inst.operand = 0x0ca1 | (i << 13);
   3380        1.7    chopps 			tmp = find_copper_inst(tmp + 1, CI_MOVE(R_BPLCON3));
   3381        1.7    chopps 			if (tmp == NULL)
   3382        1.7    chopps 				break;
   3383        1.7    chopps 			tmp->cp.inst.operand = 0x0ea1 | (i << 13);
   3384        1.7    chopps 		}
   3385        1.7    chopps 		if (tmp)
   3386        1.7    chopps 			tmp = find_copper_inst(tmp + 1, CI_MOVE(R_BPLCON3));
   3387        1.7    chopps 		if (tmp)
   3388        1.7    chopps 			tmp->cp.inst.operand = 0x0ca1;
   3389        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_FMODE));
   3390        1.7    chopps 		tmp->cp.inst.operand = 0x8003;
   3391        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HTOTAL));
   3392        1.7    chopps 		tmp->cp.inst.operand = pAGA_htotal; /* 81/71/73/79? */
   3393        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HBSTRT));
   3394        1.7    chopps 		tmp->cp.inst.operand = pAGA_hbstrt; /* 0x0008 */
   3395        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HSSTRT));
   3396        1.7    chopps 		tmp->cp.inst.operand = pAGA_hsstrt; /* 0x000e */
   3397        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HSSTOP));
   3398        1.7    chopps 		tmp->cp.inst.operand = pAGA_hsstop; /* 0x001c */
   3399        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HBSTOP));
   3400        1.7    chopps 		tmp->cp.inst.operand = pAGA_hsstop; /* 0x001e */
   3401        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_HCENTER));
   3402        1.7    chopps 		tmp->cp.inst.operand = pAGA_hcenter; /*AGA_htotal / 2 + AGA_hsstrt */
   3403        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_VBSTRT));
   3404        1.7    chopps 		tmp->cp.inst.operand = pAGA_vbstrt; /* 0x0000 */
   3405        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_VSSTRT));
   3406        1.7    chopps 		tmp->cp.inst.operand = pAGA_vsstrt; /* 0x016b / AGA_htotal */
   3407        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_VSSTOP));
   3408        1.7    chopps 		tmp->cp.inst.operand = pAGA_vsstop; /* 0x02d6 / AGA_htotal */
   3409        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_VBSTOP));
   3410        1.7    chopps 		tmp->cp.inst.operand = pAGA_vbstop; /* 0x0bd1 / AGA_htotal */
   3411        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_VTOTAL));
   3412        1.7    chopps 		tmp->cp.inst.operand = pAGA_vtotal;
   3413        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BEAMCON0));
   3414        1.7    chopps 		tmp->cp.inst.operand = paga_this_data->beamcon0;
   3415        1.7    chopps #ifdef DEBUG
   3416        1.7    chopps 		if (aga_enable & AGA_TRACE2)
   3417       1.15  christos 			printf("  beamcon0 %04x", tmp->cp.inst.operand);
   3418        1.7    chopps #endif
   3419        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWHIGH));
   3420        1.7    chopps 		tmp->cp.inst.operand = CALC_DIWHIGH(hstart, vstart, hstop, vstop);
   3421        1.7    chopps #ifdef DEBUG
   3422        1.7    chopps 		if (aga_enable & AGA_TRACE2)
   3423       1.15  christos 			printf(" diwhigh %04x>", tmp->cp.inst.operand);
   3424        1.7    chopps #endif
   3425        1.7    chopps #if 0
   3426        1.7    chopps 		tmp->cp.inst.operand = (vstop & 0x0700) | ((hstop & 0x0100) << 5);
   3427        1.7    chopps #endif
   3428        1.7    chopps #ifdef DEBUG
   3429        1.7    chopps 		if (aga_enable & AGA_TRACE2)
   3430       1.15  christos 			printf("%04x", tmp->cp.inst.operand);
   3431        1.7    chopps #endif
   3432        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON0));
   3433        1.7    chopps 		tmp->cp.inst.operand = paga_this_data->bplcon0 |
   3434        1.7    chopps 		    ((depth & 0x7) << 12) | ((depth & 0x8) << 1);
   3435        1.7    chopps #ifdef DEBUG
   3436        1.7    chopps 		if (aga_enable & AGA_TRACE2)
   3437       1.15  christos 			printf(" bplcon0 %04x", tmp->cp.inst.operand);
   3438        1.7    chopps #endif
   3439        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPLCON1));
   3440        1.7    chopps 		tmp->cp.inst.operand = con1;
   3441        1.7    chopps #ifdef DEBUG
   3442        1.7    chopps 		if (aga_enable & AGA_TRACE2)
   3443       1.15  christos 			printf(" bplcon1 %04x>0000\n", con1);
   3444        1.7    chopps #endif
   3445        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTART));
   3446        1.7    chopps 		tmp->cp.inst.operand = ((vstart & 0xff) << 8) | (hstart & 0xff);
   3447        1.7    chopps #ifdef DEBUG
   3448        1.7    chopps 		if (aga_enable & AGA_TRACE2)
   3449       1.15  christos 			printf("  diwstart %04x", tmp->cp.inst.operand);
   3450        1.7    chopps #endif
   3451        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DIWSTOP));
   3452        1.7    chopps 		tmp->cp.inst.operand = ((vstop & 0xff) << 8) | (hstop & 0xff);
   3453        1.7    chopps #ifdef DEBUG
   3454        1.7    chopps 		if (aga_enable & AGA_TRACE2)
   3455       1.15  christos 			printf(" diwstop %04x", tmp->cp.inst.operand);
   3456        1.7    chopps #endif
   3457        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTART));
   3458        1.7    chopps 		tmp->cp.inst.operand = ddfstart;
   3459        1.7    chopps #ifdef DEBUG
   3460        1.7    chopps 		if (aga_enable & AGA_TRACE2)
   3461       1.15  christos 			printf(" ddfstart %04x", tmp->cp.inst.operand);
   3462        1.7    chopps #endif
   3463        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_DDFSTOP));
   3464        1.7    chopps 		tmp->cp.inst.operand = ddfstart + ddfwidth;
   3465        1.7    chopps #ifdef DEBUG
   3466        1.7    chopps 		if (aga_enable & AGA_TRACE2)
   3467       1.15  christos 			printf(" ddfstop %04x", tmp->cp.inst.operand);
   3468        1.7    chopps #endif
   3469        1.7    chopps 
   3470        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL0PTH));
   3471        1.7    chopps 		for (i = 0, j = 0; i < depth; j += 2, i++) {
   3472        1.7    chopps 			/* update the plane pointers */
   3473        1.7    chopps 			tmp[j].cp.inst.operand = HIADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   3474        1.7    chopps 			tmp[j + 1].cp.inst.operand = LOADDR(PREP_DMA_MEM(v->bitmap->plane[i]));
   3475        1.7    chopps #ifdef DEBUG
   3476        1.7    chopps 		if (aga_enable & AGA_TRACE2)
   3477       1.15  christos 			printf (" bpl%dpth %p", i, v->bitmap->plane[i]);
   3478        1.7    chopps #endif
   3479        1.7    chopps 		}
   3480        1.7    chopps 
   3481        1.7    chopps 		/* set mods correctly. */
   3482        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_BPL1MOD));
   3483        1.7    chopps 		tmp[0].cp.inst.operand = v->bitmap->row_mod;
   3484        1.7    chopps 		tmp[1].cp.inst.operand = v->bitmap->row_mod;
   3485        1.7    chopps #ifdef DEBUG
   3486        1.7    chopps 		if (aga_enable & AGA_TRACE2)
   3487       1.15  christos 			printf(" bplxmod %04x\n", v->bitmap->row_mod);
   3488        1.7    chopps #endif
   3489        1.7    chopps 
   3490        1.7    chopps 		/* set next pointers correctly */
   3491        1.7    chopps 		tmp = find_copper_inst(cp, CI_MOVE(R_COP1LCH));
   3492        1.7    chopps 		tmp[0].cp.inst.operand = HIADDR(PREP_DMA_MEM(paga_this_data->frames[F_STORE_LONG]));
   3493        1.7    chopps 		tmp[1].cp.inst.operand = LOADDR(PREP_DMA_MEM(paga_this_data->frames[F_STORE_LONG]));
   3494        1.7    chopps 
   3495        1.7    chopps 		cp = paga_this_data->frames[F_LONG];
   3496        1.7    chopps 		paga_this_data->frames[F_LONG] = paga_this_data->frames[F_STORE_LONG];
   3497        1.7    chopps 		paga_this_data->frames[F_STORE_LONG] = cp;
   3498        1.7    chopps 
   3499        1.7    chopps 		vd->flags |= VF_DISPLAY;
   3500        1.7    chopps 
   3501        1.7    chopps 		cc_use_aga_colormap(v, vd->colormap);
   3502        1.7    chopps 	}
   3503        1.7    chopps 	cc_load_mode(paga_this);
   3504        1.7    chopps #ifdef DEBUG
   3505        1.7    chopps 	if (aga_enable & AGA_TRACE)
   3506        1.7    chopps 		aga_enable |= AGA_TRACE2;	/* XXXX */
   3507        1.7    chopps #endif
   3508        1.7    chopps }
   3509        1.7    chopps 
   3510        1.7    chopps #endif /* GRF_AGA */
   3511        1.1    chopps #endif /* GRF_PAL */
   3512