|
|
1.1 ! root 1: /* ! 2: * Data used for communication between custom.c and drawing.c. ! 3: * ! 4: * Copyright 1996-1998 Bernd Schmidt ! 5: */ ! 6: ! 7: #define SMART_UPDATE 1 ! 8: ! 9: #ifdef SUPPORT_PENGUINS ! 10: #undef SMART_UPDATE ! 11: #define SMART_UPDATE 1 ! 12: #endif ! 13: ! 14: /* ! 15: * Several people have tried this define, with not much success. Turning on ! 16: * AGA garbles the screen. A place you could start looking is the calcdiw() ! 17: * function - the AGA timing parameters are different, and apparently I ! 18: * haven't figured out the correct formula yet. Pity, the current one looks ! 19: * logical. ! 20: * ! 21: * @@@ Probably won't compile in this version. ! 22: */ ! 23: ! 24: /* #define EMULATE_AGA */ ! 25: ! 26: #ifndef EMULATE_AGA ! 27: #define AGA_CHIPSET 0 ! 28: #else ! 29: #define AGA_CHIPSET 1 ! 30: #endif ! 31: ! 32: #if AGA_CHIPSET == 1 ! 33: #define MAX_PLANES 8 ! 34: #else ! 35: #define MAX_PLANES 6 ! 36: #endif ! 37: ! 38: /* We ignore that many lores pixels at the start of the display. These are ! 39: * invisible anyway due to hardware DDF limits. */ ! 40: #define DISPLAY_LEFT_SHIFT 0x38 ! 41: #define PIXEL_XPOS(HPOS) (((HPOS)*2 - DISPLAY_LEFT_SHIFT) << lores_shift) ! 42: ! 43: /* @@@ Is maxhpos + 4 - 1 correct? (4 less isn't enough) */ ! 44: #define max_diwlastword (PIXEL_XPOS(maxhpos + 4 -1)) ! 45: ! 46: extern int lores_factor, lores_shift, sprite_width; ! 47: ! 48: static __inline__ int coord_hw_to_native_x (int x) ! 49: { ! 50: x -= DISPLAY_LEFT_SHIFT; ! 51: return x << lores_shift; ! 52: } ! 53: ! 54: extern int framecnt; ! 55: ! 56: struct color_entry { ! 57: #if AGA_CHIPSET == 0 ! 58: /* X86.S expects this at the start of the structure. */ ! 59: xcolnr acolors[32]; ! 60: uae_u16 color_regs[32]; ! 61: #else ! 62: uae_u32 color_regs[256]; ! 63: #endif ! 64: }; ! 65: ! 66: /* ! 67: * The idea behind this code is that at some point during each horizontal ! 68: * line, we decide how to draw this line. There are many more-or-less ! 69: * independent decisions, each of which can be taken at a different horizontal ! 70: * position. ! 71: * Sprites, color changes and bitplane delay changes are handled specially: ! 72: * There isn't a single decision, but a list of structures containing ! 73: * information on how to draw the line. ! 74: */ ! 75: ! 76: struct color_change { ! 77: int linepos; ! 78: int regno; ! 79: unsigned long value; ! 80: }; ! 81: ! 82: struct sprite_draw { ! 83: int linepos; ! 84: int num; ! 85: int ctl; ! 86: uae_u32 datab; ! 87: }; ! 88: ! 89: struct delay_change { ! 90: int linepos; ! 91: unsigned int value; ! 92: }; ! 93: ! 94: /* Way too much... */ ! 95: #define MAX_REG_CHANGE ((maxvpos+1) * 2 * maxhpos) ! 96: ! 97: #ifdef OS_WITHOUT_MEMORY_MANAGEMENT ! 98: extern struct sprite_draw *sprite_positions[2]; ! 99: extern struct color_change *color_changes[2]; ! 100: extern struct delay_change *delay_changes; ! 101: #else ! 102: extern struct sprite_draw sprite_positions[2][MAX_REG_CHANGE]; ! 103: extern struct color_change color_changes[2][MAX_REG_CHANGE]; ! 104: /* We don't remember those across frames, that would be too much effort. ! 105: * We simply redraw the line whenever we see one of these. */ ! 106: extern struct delay_change delay_changes[MAX_REG_CHANGE]; ! 107: #endif ! 108: ! 109: extern struct color_entry color_tables[2][(maxvpos+1) * 2]; ! 110: extern struct color_entry *curr_color_tables, *prev_color_tables; ! 111: ! 112: extern struct sprite_draw *curr_sprite_positions, *prev_sprite_positions; ! 113: extern struct color_change *curr_color_changes, *prev_color_changes; ! 114: extern struct draw_info *curr_drawinfo, *prev_drawinfo; ! 115: ! 116: /* struct decision contains things we save across drawing frames for ! 117: * comparison (smart update stuff). */ ! 118: struct decision { ! 119: unsigned long color0; ! 120: int which; ! 121: int plfstrt, plflinelen; ! 122: /* Display window: native coordinates, depend on lores state. */ ! 123: int diwfirstword, diwlastword; ! 124: int ctable; ! 125: ! 126: uae_u16 bplcon0, bplcon1, bplcon2; ! 127: #if 0 /* We don't need this. */ ! 128: uae_u16 bplcon3; ! 129: #endif ! 130: #if AGA_CHIPSET == 1 ! 131: uae_u16 bplcon4; ! 132: #endif ! 133: }; ! 134: ! 135: /* Anything related to changes in hw registers during the DDF for one ! 136: * line. */ ! 137: struct draw_info { ! 138: int first_sprite_draw, last_sprite_draw; ! 139: int first_color_change, last_color_change; ! 140: int first_delay_change, last_delay_change; ! 141: int nr_color_changes, nr_sprites; ! 142: }; ! 143: ! 144: extern struct decision line_decisions[2 * (maxvpos+1) + 1]; ! 145: extern struct draw_info line_drawinfo[2][2 * (maxvpos+1) + 1]; ! 146: extern char line_changed[2 * (maxvpos+1)]; ! 147: ! 148: extern uae_u8 line_data[(maxvpos+1) * 2][MAX_PLANES * MAX_WORDS_PER_LINE * 2]; ! 149: ! 150: /* Functions in drawing.c. */ ! 151: extern int coord_native_to_amiga_y (int); ! 152: extern int coord_native_to_amiga_x (int); ! 153: ! 154: extern void record_diw_line (int first, int last); ! 155: extern void hardware_line_completed (int lineno); ! 156: ! 157: /* Determine how to draw a scan line. */ ! 158: enum nln_how { ! 159: /* All lines on a non-doubled display. */ ! 160: nln_normal, ! 161: /* Non-interlace, doubled display. */ ! 162: nln_doubled, ! 163: /* Interlace, doubled display, upper line. */ ! 164: nln_upper, ! 165: /* Interlace, doubled display, lower line. */ ! 166: nln_lower ! 167: }; ! 168: ! 169: extern void hsync_record_line_state (int lineno, enum nln_how); ! 170: extern void vsync_handle_redraw (int long_frame, int lof_changed); ! 171: extern void init_hardware_for_drawing_frame (void); ! 172: extern void finish_drawing_frame (void); ! 173: extern void reset_drawing (void); ! 174: extern void drawing_init (void); ! 175: extern void notice_interlace_seen (void); ! 176: ! 177: /* Finally, stuff that shouldn't really be shared. */ ! 178: ! 179: extern int thisframe_first_drawn_line, thisframe_last_drawn_line; ! 180: extern uae_u16 clxdat, clxcon; ! 181: extern int clx_sprmask; ! 182: extern int diwfirstword,diwlastword;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.