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