]>
Commit | Line | Data |
---|---|---|
2c00b10d | 1 | --- display.c.orig Tue Jan 28 08:43:52 2003 |
2 | +++ display.c Tue Jan 28 14:52:42 2003 | |
3 | @@ -111,20 +111,9 @@ | |
4 | ||
5 | static WORD display_get_addr(int x, int y) | |
6 | { | |
7 | - switch( scld_screenmode ) | |
8 | - { | |
9 | - case HIRES: | |
10 | - return display_line_start[y]+x; | |
11 | - break; | |
12 | - case ALTDFILE: /* Same as standard, but base at 0x6000 */ | |
13 | - return display_line_start[y]+x+ALTDFILE_OFFSET; | |
14 | - break; | |
15 | - case EXTCOLOUR: | |
16 | - default: /* Standard Speccy screen */ | |
17 | - return display_line_start[y]+x; | |
18 | - break; | |
19 | - } | |
20 | - | |
21 | + if (scld_altdfile) { | |
22 | + return display_line_start[y]+x+ALTDFILE_OFFSET; | |
23 | + } else return display_line_start[y]+x; | |
24 | ui_error( UI_ERROR_ERROR, "Impossible screenmode `%d'", scld_screenmode ); | |
25 | fuse_abort(); | |
26 | } | |
27 | @@ -206,7 +195,7 @@ | |
28 | { | |
29 | ||
30 | int x, screen_y, redraw, colour; | |
31 | - BYTE data, ink, paper; | |
32 | + BYTE data, data2, ink, paper; | |
33 | WORD hires_data; | |
34 | ||
35 | redraw = 0; | |
36 | @@ -227,20 +216,32 @@ | |
37 | display_is_dirty[screen_y] >>= 1, x++ ) { | |
38 | ||
39 | /* Skip to next 8 pixel chunk if this chunk is clean */ | |
40 | - if( ! ( display_is_dirty[screen_y] & 0x01 ) ) continue; | |
41 | - | |
42 | - data = read_screen_memory( display_get_addr( x, screen_y ) ); | |
43 | - display_get_attr( x, screen_y, &ink, &paper ); | |
44 | + if( ! ( display_is_dirty[screen_y] & 0x01 ) ) continue; | |
45 | ||
46 | - if( scld_hires ) { | |
47 | - hires_data = (data<<8) + | |
48 | - read_screen_memory( display_get_addr( x, screen_y ) + | |
49 | - ALTDFILE_OFFSET | |
50 | - ); | |
51 | - | |
52 | - display_plot16( x<<1, screen_y, hires_data, ink, paper ); | |
53 | - } else | |
54 | - display_plot8( x<<1, screen_y, data, ink, paper ); | |
55 | + display_get_attr( x, screen_y, &ink, &paper ); | |
56 | + data = read_screen_memory( display_get_addr( x, screen_y ) ); | |
57 | + if (scld_hires) { | |
58 | + switch (scld_screenmode) { | |
59 | + case 4: | |
60 | + data2 = read_screen_memory( display_attr_start[screen_y] + x); | |
61 | + break; | |
62 | + case 5: | |
63 | + data2 = read_screen_memory( display_attr_start[screen_y] + x + ALTDFILE_OFFSET); | |
64 | + break; | |
65 | + case 6: | |
66 | + data2 = read_screen_memory( display_get_addr( x, screen_y ) + ALTDFILE_OFFSET); | |
67 | + break; | |
68 | + case 7: | |
69 | + data2 = data; | |
70 | + break; | |
71 | + default: | |
72 | + break; | |
73 | + } | |
74 | + hires_data = (data << 8) + data2; | |
75 | + display_plot16( x<<1, screen_y, hires_data, ink, paper ); | |
76 | + } else { | |
77 | + display_plot8( x<<1, screen_y, data, ink, paper ); | |
78 | + } | |
79 | } | |
80 | ||
81 | /* Need to redraw this line */ | |
82 | @@ -299,35 +300,43 @@ | |
83 | `address'; 0x4000 <= address < 0x5b00 */ | |
84 | void display_dirty( WORD address ) | |
85 | { | |
86 | - switch( scld_screenmode ) | |
87 | - { | |
88 | - case ALTDFILE: /* Same as standard, but base at 0x6000 */ | |
89 | + switch (scld_screenmode) { | |
90 | + case 0: /* standard Speccy screen */ | |
91 | + case 4: /* strange mode */ | |
92 | + if(address>=0x5b00) | |
93 | + return; | |
94 | + if(address<0x5800) { /* 0x5800 = first attributes byte */ | |
95 | + display_dirty8(address); | |
96 | + } else { | |
97 | + display_dirty64(address); | |
98 | + } | |
99 | + break; | |
100 | + case 1: /* second screen */ | |
101 | + case 5: /* strange mode using second screen */ | |
102 | if( address >= 0x7b00 ) | |
103 | return; | |
104 | - if( address < 0x7800 ) { /* 0x7800 = first attributes byte */ | |
105 | + if( address >= 0x6000 && address < 0x7800 ) { /* 0x7800 = first attributes byte */ | |
106 | display_dirty8(address-ALTDFILE_OFFSET); | |
107 | } else { | |
108 | display_dirty64(address-ALTDFILE_OFFSET); | |
109 | } | |
110 | break; | |
111 | ||
112 | - case HIRES: | |
113 | - case EXTCOLOUR: | |
114 | + case 2: /* extended colours */ | |
115 | + case 6: /* hires mode */ | |
116 | if((address>=0x7800) || ((address>=0x5800) && (address<0x6000))) | |
117 | return; | |
118 | if(address>=0x6000) address-=ALTDFILE_OFFSET; | |
119 | display_dirty8(address); | |
120 | break; | |
121 | - | |
122 | - default: /* Standard Speccy screen */ | |
123 | - if(address>=0x5b00) | |
124 | - return; | |
125 | - if(address<0x5800) { /* 0x5800 = first attributes byte */ | |
126 | - display_dirty8(address); | |
127 | - } else { | |
128 | - display_dirty64(address); | |
129 | + case 3: /* extended colours, but attributes and data taken from second screen */ | |
130 | + case 7: /* hires mode, but data taken only from second screen */ | |
131 | + if( address >= 0x6000 && address < 0x7800 ) { /* 0x7800 = first attributes byte */ | |
132 | + display_dirty8(address-ALTDFILE_OFFSET); | |
133 | } | |
134 | break; | |
135 | + default: | |
136 | + break; | |
137 | } | |
138 | } | |
139 | ||
140 | @@ -408,23 +417,16 @@ | |
141 | { | |
142 | BYTE attr; | |
143 | ||
144 | - switch( scld_screenmode ) | |
145 | - { | |
146 | - case ALTDFILE: /* Same as standard, but base at 0x6000 */ | |
147 | - attr=read_screen_memory(display_attr_start[y]+x+ALTDFILE_OFFSET); | |
148 | - break; | |
149 | - case EXTCOLOUR: | |
150 | - attr=read_screen_memory(display_line_start[y]+x+ALTDFILE_OFFSET); | |
151 | - break; | |
152 | - case HIRES: | |
153 | - case (HIRES|EXTCOLOUR): | |
154 | - attr=hires_get_attr(); | |
155 | - break; | |
156 | - default: /* Standard Speccy screen */ | |
157 | - attr=read_screen_memory(display_attr_start[y]+x); | |
158 | - break; | |
159 | - } | |
160 | + if (scld_hires) { | |
161 | + attr = hires_get_attr(); | |
162 | + } else { | |
163 | + if (scld_extcolour) { | |
164 | + attr = read_screen_memory(display_line_start[y]+x+ALTDFILE_OFFSET); | |
165 | + } else if (scld_altdfile) { | |
166 | + attr = read_screen_memory(display_attr_start[y]+x+ALTDFILE_OFFSET); | |
167 | + } else attr = read_screen_memory(display_attr_start[y]+x); | |
168 | ||
169 | + } | |
170 | display_parse_attr(attr,ink,paper); | |
171 | } | |
172 | ||
173 | @@ -571,32 +573,27 @@ | |
174 | static void display_dirty_flashing(void) | |
175 | { | |
176 | int offset; BYTE attr; | |
177 | - | |
178 | - switch (scld_screenmode) | |
179 | - { | |
180 | - case ALTDFILE: /* Same as standard, but base at 0x6000 */ | |
181 | - for(offset=0x3800;offset<0x3b00;offset++) { | |
182 | - attr=read_screen_memory(offset); | |
183 | - if( attr & 0x80 ) | |
184 | - display_dirty64(offset+ALTDFILE_OFFSET); | |
185 | - } | |
186 | - break; | |
187 | - case EXTCOLOUR: | |
188 | + | |
189 | + if (!scld_hires) { | |
190 | + if (scld_extcolour) { | |
191 | for(offset=ALTDFILE_OFFSET;offset<0x3800;offset++) { | |
192 | attr=read_screen_memory(offset); | |
193 | if( attr & 0x80 ) | |
194 | - display_dirty8(offset-ALTDFILE_OFFSET); | |
195 | + display_dirty8(offset+ALTDFILE_OFFSET); | |
196 | } | |
197 | - break; | |
198 | - case HIRES: | |
199 | - break; | |
200 | - default: /* Standard Speccy screen */ | |
201 | - for(offset=0x1800;offset<0x1b00;offset++) { | |
202 | - attr=read_screen_memory(offset); | |
203 | - if( attr & 0x80 ) | |
204 | - display_dirty64(offset+0x4000); | |
205 | + } else if (scld_altdfile) { | |
206 | + for(offset=0x3800;offset<0x3b00;offset++) { | |
207 | + attr=read_screen_memory(offset); | |
208 | + if( attr & 0x80 ) | |
209 | + display_dirty64(offset+ALTDFILE_OFFSET); | |
210 | + } | |
211 | + } else { /* Standard Speccy screen */ | |
212 | + for(offset=0x1800;offset<0x1b00;offset++) { | |
213 | + attr=read_screen_memory(offset); | |
214 | + if( attr & 0x80 ) | |
215 | + display_dirty64(offset+0x4000); | |
216 | + } | |
217 | } | |
218 | - break; | |
219 | } | |
220 | } | |
221 | ||
222 | @@ -610,16 +607,6 @@ | |
223 | } | |
224 | ||
225 | for(y=0;y<DISPLAY_HEIGHT;y++) { | |
226 | - for(x=0;x<DISPLAY_WIDTH_COLS;x++) { | |
227 | - display_get_attr(x,y,&ink,&paper); | |
228 | - if( scld_hires ) { | |
229 | - hires_data = (read_screen_memory( display_get_addr(x,y) ) << 8 ) + | |
230 | - read_screen_memory( display_get_addr( x, y ) + ALTDFILE_OFFSET ); | |
231 | - display_plot16( x<<1, y, hires_data, ink, paper ); | |
232 | - } else | |
233 | - display_plot8( x<<1, y, read_screen_memory( display_get_addr(x,y) ), | |
234 | - ink, paper ); | |
235 | - } | |
236 | display_is_dirty[y] = display_all_dirty; /* Marks all pixels as dirty */ | |
237 | } | |
238 | } |