Rev 1854 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1854 | Rev 2829 | ||
---|---|---|---|
1 | #ifndef AUTOBUILD |
1 | #ifndef AUTOBUILD |
2 | // autobuild does not create lang.h, but defines LANG_{RUS,ENG} directly |
2 | // autobuild does not create lang.h, but defines LANG_{RUS,ENG} directly |
3 | #include "lang.h" |
3 | #include "lang.h" |
4 | #endif |
4 | #endif |
5 | 5 | ||
6 | #include "system/kolibri.h" |
6 | #include "system/kolibri.h" |
7 | #include "system/stdlib.h" |
7 | #include "system/stdlib.h" |
8 | #include "system/string.h" |
8 | #include "system/string.h" |
9 | #include "z80/z80.h" |
9 | #include "z80/z80.h" |
10 | #include "48.h" |
10 | #include "48.h" |
11 | 11 | ||
12 | #include "system/msgbox.c" |
12 | #include "system/msgbox.c" |
13 | 13 | ||
14 | ///============================= |
14 | ///============================= |
15 | 15 | ||
16 | #define TYPE_NO 0 |
16 | #define TYPE_NO 0 |
17 | #define TYPE_SNA 1 |
17 | #define TYPE_SNA 1 |
18 | #define TYPE_Z80 2 |
18 | #define TYPE_Z80 2 |
19 | 19 | ||
20 | #define SCREEN_LEN 3*3*256*192*3 |
20 | #define SCREEN_LEN 3*3*256*192*3 |
21 | 21 | ||
22 | char WND_CAPTION[] = {"e80 v0.5.1"}; |
22 | char WND_CAPTION[] = {"e80 v0.5.1"}; |
23 | 23 | ||
24 | extern char KOL_PARAM[256]; |
24 | extern char KOL_PARAM[256]; |
25 | extern char KOL_PATH[256]; |
25 | extern char KOL_PATH[256]; |
26 | 26 | ||
27 | char szBackup[256]; |
27 | char szBackup[256]; |
28 | char szScreen[256]; |
28 | char szScreen[256]; |
29 | 29 | ||
30 | int fila[5][5]; |
30 | int fila[5][5]; |
31 | int main_tecla, hay_tecla; |
31 | int main_tecla, hay_tecla; |
32 | int SSCS = 0; |
32 | int SSCS = 0; |
33 | 33 | ||
34 | int debug=0, scanl=0; |
34 | int debug=0, scanl=0; |
35 | int frame_counter; |
35 | int frame_counter; |
36 | int target_cycle; |
36 | int target_cycle; |
37 | Z80Regs spectrumZ80; |
37 | Z80Regs spectrumZ80; |
38 | 38 | ||
39 | char *screen; |
39 | char *screen; |
40 | unsigned screen_w, screen_h; |
40 | unsigned screen_w, screen_h; |
41 | #define screen_a_w 512 |
41 | #define screen_a_w 512 |
42 | #define screen_a_h 384 |
42 | #define screen_a_h 384 |
43 | int flash = 0; |
43 | int flash = 0; |
44 | unsigned time = 0; |
44 | unsigned time = 0; |
45 | 45 | ||
46 | ///============================= |
46 | ///============================= |
47 | 47 | ||
48 | #include "keyboard.c" |
48 | #include "keyboard.c" |
49 | 49 | ||
50 | ///============================= |
50 | ///============================= |
51 | 51 | ||
52 | int get_ext(char *filename) |
52 | int get_ext(char *filename) |
53 | { |
53 | { |
54 | 54 | ||
55 | return TYPE_SNA; |
55 | return TYPE_SNA; |
56 | } |
56 | } |
57 | 57 | ||
58 | ///============================= |
58 | ///============================= |
59 | 59 | ||
60 | void memory_print(Z80Regs *regs, char *filename) |
60 | void memory_print(Z80Regs *regs, char *filename) |
61 | { |
61 | { |
62 | kol_struct70 file; |
62 | kol_struct70 file; |
63 | 63 | ||
64 | file.p00 = 2; |
64 | file.p00 = 2; |
65 | file.p04 = 0; |
65 | file.p04 = 0; |
66 | file.p08 = 0; |
66 | file.p08 = 0; |
67 | file.p12 = 64*1024; |
67 | file.p12 = 64*1024; |
68 | file.p16 = (unsigned)(regs->RAM); |
68 | file.p16 = (unsigned)(regs->RAM); |
69 | file.p20 = 0; |
69 | file.p20 = 0; |
70 | file.p21 = filename; |
70 | file.p21 = filename; |
71 | 71 | ||
72 | kol_file_70(&file); |
72 | kol_file_70(&file); |
73 | } |
73 | } |
74 | 74 | ||
75 | 75 | ||
76 | ///============================= |
76 | ///============================= |
77 | 77 | ||
78 | void all_print(Z80Regs *regs, char *filename) |
78 | void all_print(Z80Regs *regs, char *filename) |
79 | { |
79 | { |
80 | kol_struct70 file; |
80 | kol_struct70 file; |
81 | 81 | ||
82 | file.p00 = 2; |
82 | file.p00 = 2; |
83 | file.p04 = 0; |
83 | file.p04 = 0; |
84 | file.p08 = 0; |
84 | file.p08 = 0; |
85 | file.p12 = sizeof (Z80Regs); |
85 | file.p12 = sizeof (Z80Regs); |
86 | file.p16 = (unsigned)regs; |
86 | file.p16 = (unsigned)regs; |
87 | file.p20 = 0; |
87 | file.p20 = 0; |
88 | file.p21 = filename; |
88 | file.p21 = filename; |
89 | 89 | ||
90 | kol_file_70(&file); |
90 | kol_file_70(&file); |
91 | } |
91 | } |
92 | 92 | ||
93 | ///============================= |
93 | ///============================= |
94 | 94 | ||
95 | void screen_print(Z80Regs *regs) |
95 | void screen_print(Z80Regs *regs) |
96 | { |
96 | { |
97 | 97 | ||
98 | kol_struct70 file; |
98 | kol_struct70 file; |
99 | 99 | ||
100 | char palette[]= |
100 | char palette[]= |
101 | { |
101 | { |
102 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
102 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
103 | 0xB0, 0x00, 0x00, 0xB0, 0x00, 0x00, |
103 | 0xB0, 0x00, 0x00, 0xB0, 0x00, 0x00, |
104 | 0x00, 0x00, 0xB0, 0x00, 0x00, 0xB0, |
104 | 0x00, 0x00, 0xB0, 0x00, 0x00, 0xB0, |
105 | 0xB0, 0x00, 0xB0, 0xB0, 0x00, 0xB0, |
105 | 0xB0, 0x00, 0xB0, 0xB0, 0x00, 0xB0, |
106 | 0x00, 0xB0, 0x00, 0x00, 0xB0, 0x00, |
106 | 0x00, 0xB0, 0x00, 0x00, 0xB0, 0x00, |
107 | 0xB0, 0xB0, 0x00, 0xB0, 0xB0, 0x00, |
107 | 0xB0, 0xB0, 0x00, 0xB0, 0xB0, 0x00, |
108 | 0x00, 0xB0, 0xB0, 0x00, 0xB0, 0xB0, |
108 | 0x00, 0xB0, 0xB0, 0x00, 0xB0, 0xB0, |
109 | 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, |
109 | 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, |
110 | 110 | ||
111 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
111 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
112 | 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, |
112 | 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, |
113 | 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, |
113 | 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, |
114 | 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, |
114 | 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, |
115 | 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, |
115 | 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, |
116 | 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, |
116 | 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, |
117 | 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, |
117 | 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, |
118 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF |
118 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF |
119 | }; |
119 | }; |
120 | 120 | ||
121 | char *scr; |
121 | char *scr; |
122 | char *atr; |
122 | char *atr; |
123 | 123 | ||
124 | char a, c, s; |
124 | char a, c, s; |
125 | int i, j, k, l, m; |
125 | int i, j, k, l, m; |
126 | unsigned bri; |
126 | unsigned bri; |
127 | char *color; |
127 | char *color; |
128 | char *addr; |
128 | char *addr; |
129 | int n = 0; |
129 | int n = 0; |
130 | int z = 0; |
130 | int z = 0; |
131 | int x, y; |
131 | int x, y; |
132 | 132 | ||
133 | scr = malloc(6144); |
133 | scr = malloc(6144); |
134 | atr = malloc(768); |
134 | atr = malloc(768); |
135 | 135 | ||
136 | memcpy(scr, regs->RAM + 0x4000 , 6144); |
136 | memcpy(scr, regs->RAM + 0x4000 , 6144); |
137 | memcpy(atr, regs->RAM + 0x5800 , 768); |
137 | memcpy(atr, regs->RAM + 0x5800 , 768); |
138 | 138 | ||
139 | for (j = 0; j < 3 ; j++) |
139 | for (j = 0; j < 3 ; j++) |
140 | for (i = 0; i < 8; i++) |
140 | for (i = 0; i < 8; i++) |
141 | for (k = 0; k < 8; k++) |
141 | for (k = 0; k < 8; k++) |
142 | for (l = 0; l < 32; l++) |
142 | for (l = 0; l < 32; l++) |
143 | { |
143 | { |
144 | c = scr[j*2048 + k*256 + i*32 + l]; |
144 | c = scr[j*2048 + k*256 + i*32 + l]; |
145 | for (m = 0; m < 8; m++) |
145 | for (m = 0; m < 8; m++) |
146 | { |
146 | { |
147 | s = (c & 128) >> 7; |
147 | s = (c & 128) >> 7; |
148 | a = atr[j*256 + i*32 + l]; |
148 | a = atr[j*256 + i*32 + l]; |
149 | 149 | ||
150 | if ( (a & 64) == 64 ) |
150 | if ( (a & 64) == 64 ) |
151 | bri = 8; |
151 | bri = 8; |
152 | else |
152 | else |
153 | bri = 0; |
153 | bri = 0; |
154 | 154 | ||
155 | if ( 0 == s ) |
155 | if ( 0 == s ) |
156 | { |
156 | { |
157 | if (!(flash && (128 == (a&128)))) |
157 | if (!(flash && (128 == (a&128)))) |
158 | color = &palette[6*(bri+((a>>3)&7))]; |
158 | color = &palette[6*(bri+((a>>3)&7))]; |
159 | else |
159 | else |
160 | color = &palette[6*(bri+(a&7))]; |
160 | color = &palette[6*(bri+(a&7))]; |
161 | 161 | ||
162 | addr = screen + 2*screen_a_w*3*z + 2*3*n; |
162 | addr = screen + 2*screen_a_w*3*z + 2*3*n; |
163 | 163 | ||
164 | for (y = 0; y < 2; y++) |
164 | for (y = 0; y < 2; y++) |
165 | memcpy( addr + y*screen_a_w*3, |
165 | memcpy( addr + y*screen_a_w*3, |
166 | color, 6); |
166 | color, 6); |
167 | } |
167 | } |
168 | else |
168 | else |
169 | { |
169 | { |
170 | if (!(flash && (128 == (a&128)))) |
170 | if (!(flash && (128 == (a&128)))) |
171 | color = &palette[6*(bri+(a&7))]; |
171 | color = &palette[6*(bri+(a&7))]; |
172 | else |
172 | else |
173 | color = &palette[6*(bri+((a>>3)&7))]; |
173 | color = &palette[6*(bri+((a>>3)&7))]; |
174 | 174 | ||
175 | addr = screen + 2*screen_a_w*3*z + 2*3*n; |
175 | addr = screen + 2*screen_a_w*3*z + 2*3*n; |
176 | 176 | ||
177 | for (y = 0; y < 2; y++) |
177 | for (y = 0; y < 2; y++) |
178 | memcpy( addr + y*screen_a_w*3, |
178 | memcpy( addr + y*screen_a_w*3, |
179 | color, 6); |
179 | color, 6); |
180 | } |
180 | } |
181 | 181 | ||
182 | n++; |
182 | n++; |
183 | if (256 == n) |
183 | if (256 == n) |
184 | { |
184 | { |
185 | n = 0; |
185 | n = 0; |
186 | z++; |
186 | z++; |
187 | } |
187 | } |
188 | 188 | ||
189 | c <<= 1; |
189 | c <<= 1; |
190 | } |
190 | } |
191 | } |
191 | } |
192 | 192 | ||
193 | if ( 33 < (kol_time_tick() - time)) |
193 | if ( 33 < (kol_time_tick() - time)) |
194 | { |
194 | { |
195 | if (0 == flash) |
195 | if (0 == flash) |
196 | flash = 1; |
196 | flash = 1; |
197 | else |
197 | else |
198 | flash = 0; |
198 | flash = 0; |
199 | time = kol_time_tick(); |
199 | time = kol_time_tick(); |
200 | } |
200 | } |
201 | 201 | ||
202 | free(scr); |
202 | free(scr); |
203 | free(atr); |
203 | free(atr); |
204 | 204 | ||
205 | } |
205 | } |
206 | 206 | ||
207 | ///============================= |
207 | ///============================= |
208 | 208 | ||
209 | void memory_load_z80(Z80Regs *regs, char *filename) |
209 | void memory_load_z80(Z80Regs *regs, char *filename) |
210 | { |
210 | { |
211 | char header[30]; |
211 | char header[30]; |
212 | kol_struct70 file; |
212 | kol_struct70 file; |
213 | 213 | ||
214 | file.p00 = 0; |
214 | file.p00 = 0; |
215 | file.p04 = 0; |
215 | file.p04 = 0; |
216 | file.p08 = 0; |
216 | file.p08 = 0; |
217 | file.p12 = 30; |
217 | file.p12 = 30; |
218 | file.p16 = (unsigned) header; |
218 | file.p16 = (unsigned) header; |
219 | file.p20 = 0; |
219 | file.p20 = 0; |
220 | file.p21 = filename; |
220 | file.p21 = filename; |
221 | } |
221 | } |
222 | 222 | ||
223 | ///============================= |
223 | ///============================= |
224 | 224 | ||
225 | void memory_load_sna(Z80Regs *regs, char *filename) |
225 | void memory_load_sna(Z80Regs *regs, char *filename) |
226 | { |
226 | { |
227 | char buffer[27]; |
227 | char buffer[27]; |
228 | kol_struct70 file; |
228 | kol_struct70 file; |
229 | 229 | ||
230 | file.p00 = 0; |
230 | file.p00 = 0; |
231 | file.p04 = 0; |
231 | file.p04 = 0; |
232 | file.p08 = 0; |
232 | file.p08 = 0; |
233 | file.p12 = 27; |
233 | file.p12 = 27; |
234 | file.p16 = (unsigned) buffer; |
234 | file.p16 = (unsigned) buffer; |
235 | file.p20 = 0; |
235 | file.p20 = 0; |
236 | file.p21 = filename; |
236 | file.p21 = filename; |
237 | 237 | ||
238 | kol_file_70(&file); |
238 | kol_file_70(&file); |
239 | 239 | ||
240 | regs->I = buffer[ 0]; |
240 | regs->I = buffer[ 0]; |
241 | regs->HLs.B.l = buffer[ 1]; |
241 | regs->HLs.B.l = buffer[ 1]; |
242 | regs->HLs.B.h = buffer[ 2]; |
242 | regs->HLs.B.h = buffer[ 2]; |
243 | regs->DEs.B.l = buffer[ 3]; |
243 | regs->DEs.B.l = buffer[ 3]; |
244 | regs->DEs.B.h = buffer[ 4]; |
244 | regs->DEs.B.h = buffer[ 4]; |
245 | regs->BCs.B.l = buffer[ 5]; |
245 | regs->BCs.B.l = buffer[ 5]; |
246 | regs->BCs.B.h = buffer[ 6]; |
246 | regs->BCs.B.h = buffer[ 6]; |
247 | regs->AFs.B.l = buffer[ 7]; |
247 | regs->AFs.B.l = buffer[ 7]; |
248 | regs->AFs.B.h = buffer[ 8]; |
248 | regs->AFs.B.h = buffer[ 8]; |
249 | regs->HL.B.l = buffer[ 9]; |
249 | regs->HL.B.l = buffer[ 9]; |
250 | regs->HL.B.h = buffer[10]; |
250 | regs->HL.B.h = buffer[10]; |
251 | regs->DE.B.l = buffer[11]; |
251 | regs->DE.B.l = buffer[11]; |
252 | regs->DE.B.h = buffer[12]; |
252 | regs->DE.B.h = buffer[12]; |
253 | regs->BC.B.l = buffer[13]; |
253 | regs->BC.B.l = buffer[13]; |
254 | regs->BC.B.h = buffer[14]; |
254 | regs->BC.B.h = buffer[14]; |
255 | regs->IY.B.l = buffer[15]; |
255 | regs->IY.B.l = buffer[15]; |
256 | regs->IY.B.h = buffer[16]; |
256 | regs->IY.B.h = buffer[16]; |
257 | regs->IX.B.l = buffer[17]; |
257 | regs->IX.B.l = buffer[17]; |
258 | regs->IX.B.h = buffer[18]; |
258 | regs->IX.B.h = buffer[18]; |
259 | regs->IFF1 = regs->IFF2 = (buffer[19]&0x04) >>2; |
259 | regs->IFF1 = regs->IFF2 = (buffer[19]&0x04) >>2; |
260 | regs->R.W = buffer[20]; |
260 | regs->R.W = buffer[20]; |
261 | regs->AF.B.l = buffer[21]; |
261 | regs->AF.B.l = buffer[21]; |
262 | regs->AF.B.h = buffer[22]; |
262 | regs->AF.B.h = buffer[22]; |
263 | regs->SP.B.l =buffer[23]; |
263 | regs->SP.B.l =buffer[23]; |
264 | regs->SP.B.h =buffer[24]; |
264 | regs->SP.B.h =buffer[24]; |
265 | regs->IM = buffer[25]; |
265 | regs->IM = buffer[25]; |
266 | regs->BorderColor = buffer[26]; |
266 | regs->BorderColor = buffer[26]; |
267 | 267 | ||
268 | file.p00 = 0; |
268 | file.p00 = 0; |
269 | file.p04 = 27; |
269 | file.p04 = 27; |
270 | file.p08 = 0; |
270 | file.p08 = 0; |
271 | file.p12 = 0x4000*3; |
271 | file.p12 = 0x4000*3; |
272 | file.p16 = (unsigned) regs->RAM+16384; |
272 | file.p16 = (unsigned) regs->RAM+16384; |
273 | file.p20 = 0; |
273 | file.p20 = 0; |
274 | file.p21 = filename; |
274 | file.p21 = filename; |
275 | 275 | ||
276 | kol_file_70(&file); |
276 | kol_file_70(&file); |
277 | 277 | ||
278 | regs->PC.B.l = Z80MemRead(regs->SP.W, regs); |
278 | regs->PC.B.l = Z80MemRead(regs->SP.W, regs); |
279 | regs->SP.W++; |
279 | regs->SP.W++; |
280 | regs->PC.B.h = Z80MemRead(regs->SP.W, regs); |
280 | regs->PC.B.h = Z80MemRead(regs->SP.W, regs); |
281 | regs->SP.W++; |
281 | regs->SP.W++; |
282 | 282 | ||
283 | } |
283 | } |
284 | 284 | ||
285 | 285 | ||
286 | ///============================= |
286 | ///============================= |
287 | 287 | ||
288 | void memory_save_sna(Z80Regs *regs, char *filename) |
288 | void memory_save_sna(Z80Regs *regs, char *filename) |
289 | { |
289 | { |
290 | char buffer[27]; |
290 | char buffer[27]; |
291 | unsigned char sptmpl, sptmph; |
291 | unsigned char sptmpl, sptmph; |
292 | kol_struct70 file; |
292 | kol_struct70 file; |
293 | 293 | ||
294 | buffer[ 0] = regs->I; |
294 | buffer[ 0] = regs->I; |
295 | buffer[ 1] = regs->HLs.B.l; |
295 | buffer[ 1] = regs->HLs.B.l; |
296 | buffer[ 2] = regs->HLs.B.h; |
296 | buffer[ 2] = regs->HLs.B.h; |
297 | buffer[ 3] = regs->DEs.B.l; |
297 | buffer[ 3] = regs->DEs.B.l; |
298 | buffer[ 4] = regs->DEs.B.h; |
298 | buffer[ 4] = regs->DEs.B.h; |
299 | buffer[ 5] = regs->BCs.B.l; |
299 | buffer[ 5] = regs->BCs.B.l; |
300 | buffer[ 6] = regs->BCs.B.h; |
300 | buffer[ 6] = regs->BCs.B.h; |
301 | buffer[ 7] = regs->AFs.B.l; |
301 | buffer[ 7] = regs->AFs.B.l; |
302 | buffer[ 8] = regs->AFs.B.h; |
302 | buffer[ 8] = regs->AFs.B.h; |
303 | buffer[ 9] = regs->HL.B.l; |
303 | buffer[ 9] = regs->HL.B.l; |
304 | buffer[10] = regs->HL.B.h; |
304 | buffer[10] = regs->HL.B.h; |
305 | buffer[11] = regs->DE.B.l; |
305 | buffer[11] = regs->DE.B.l; |
306 | buffer[12] = regs->DE.B.h; |
306 | buffer[12] = regs->DE.B.h; |
307 | buffer[13] = regs->BC.B.l; |
307 | buffer[13] = regs->BC.B.l; |
308 | buffer[14] = regs->BC.B.h; |
308 | buffer[14] = regs->BC.B.h; |
309 | buffer[15] = regs->IY.B.l; |
309 | buffer[15] = regs->IY.B.l; |
310 | buffer[16] = regs->IY.B.h; |
310 | buffer[16] = regs->IY.B.h; |
311 | buffer[17] = regs->IX.B.l; |
311 | buffer[17] = regs->IX.B.l; |
312 | buffer[18] = regs->IX.B.h; |
312 | buffer[18] = regs->IX.B.h; |
313 | buffer[19] = regs->IFF1 << 2; |
313 | buffer[19] = regs->IFF1 << 2; |
314 | buffer[20] = regs->R.W & 0xFF; |
314 | buffer[20] = regs->R.W & 0xFF; |
315 | buffer[21] = regs->AF.B.l; |
315 | buffer[21] = regs->AF.B.l; |
316 | buffer[22] = regs->AF.B.h; |
316 | buffer[22] = regs->AF.B.h; |
317 | 317 | ||
318 | sptmpl = Z80MemRead( regs->SP.W-1, regs ); |
318 | sptmpl = Z80MemRead( regs->SP.W-1, regs ); |
319 | sptmph = Z80MemRead( regs->SP.W-2, regs ); |
319 | sptmph = Z80MemRead( regs->SP.W-2, regs ); |
320 | 320 | ||
321 | Z80MemWrite( --(regs->SP.W), regs->PC.B.h, regs); |
321 | Z80MemWrite( --(regs->SP.W), regs->PC.B.h, regs); |
322 | Z80MemWrite( --(regs->SP.W), regs->PC.B.l, regs); |
322 | Z80MemWrite( --(regs->SP.W), regs->PC.B.l, regs); |
323 | 323 | ||
324 | buffer[23] = regs->SP.B.l; |
324 | buffer[23] = regs->SP.B.l; |
325 | buffer[24] = regs->SP.B.h; |
325 | buffer[24] = regs->SP.B.h; |
326 | buffer[25] = regs->IM; |
326 | buffer[25] = regs->IM; |
327 | buffer[26] = regs->BorderColor; |
327 | buffer[26] = regs->BorderColor; |
328 | 328 | ||
329 | file.p00 = 2; |
329 | file.p00 = 2; |
330 | file.p04 = 0; |
330 | file.p04 = 0; |
331 | file.p08 = 0; |
331 | file.p08 = 0; |
332 | file.p12 = 27; |
332 | file.p12 = 27; |
333 | file.p16 = (unsigned) buffer; |
333 | file.p16 = (unsigned) buffer; |
334 | file.p20 = 0; |
334 | file.p20 = 0; |
335 | file.p21 = filename; |
335 | file.p21 = filename; |
336 | 336 | ||
337 | kol_file_70(&file); |
337 | kol_file_70(&file); |
338 | 338 | ||
339 | file.p00 = 3; |
339 | file.p00 = 3; |
340 | file.p04 = 27; |
340 | file.p04 = 27; |
341 | file.p08 = 0; |
341 | file.p08 = 0; |
342 | file.p12 = 0x4000*3; |
342 | file.p12 = 0x4000*3; |
343 | file.p16 = (unsigned) regs->RAM+16384; |
343 | file.p16 = (unsigned) regs->RAM+16384; |
344 | file.p20 = 0; |
344 | file.p20 = 0; |
345 | file.p21 = filename; |
345 | file.p21 = filename; |
346 | 346 | ||
347 | kol_file_70(&file); |
347 | kol_file_70(&file); |
348 | 348 | ||
349 | regs->SP.W += 2; |
349 | regs->SP.W += 2; |
350 | Z80MemWrite( regs->SP.W-1, sptmpl, regs ); |
350 | Z80MemWrite( regs->SP.W-1, sptmpl, regs ); |
351 | Z80MemWrite( regs->SP.W-2, sptmph, regs ); |
351 | Z80MemWrite( regs->SP.W-2, sptmph, regs ); |
352 | 352 | ||
353 | } |
353 | } |
354 | 354 | ||
355 | 355 | ||
356 | ///============================= |
356 | ///============================= |
357 | 357 | ||
358 | void memory_save_scr(Z80Regs *regs, char *filename) |
358 | void memory_save_scr(Z80Regs *regs, char *filename) |
359 | { |
359 | { |
360 | kol_struct70 file; |
360 | kol_struct70 file; |
361 | 361 | ||
362 | 362 | ||
363 | file.p00 = 2; |
363 | file.p00 = 2; |
364 | file.p04 = 0x4000; |
364 | file.p04 = 0x4000; |
365 | file.p08 = 0; |
365 | file.p08 = 0; |
366 | file.p12 = 6912; |
366 | file.p12 = 6912; |
367 | file.p16 = (unsigned) regs->RAM+16384; |
367 | file.p16 = (unsigned) regs->RAM+16384; |
368 | file.p20 = 0; |
368 | file.p20 = 0; |
369 | file.p21 = filename; |
369 | file.p21 = filename; |
370 | 370 | ||
371 | kol_file_70(&file); |
371 | kol_file_70(&file); |
372 | 372 | ||
373 | } |
373 | } |
374 | 374 | ||
375 | 375 | ||
376 | ///============================= |
376 | ///============================= |
377 | 377 | ||
378 | void wnd_draw() |
378 | void wnd_draw() |
379 | { |
379 | { |
380 | kol_paint_start(); |
380 | kol_paint_start(); |
381 | kol_wnd_define( (screen_w-540)/2, (screen_h-440)/2, 540, 440, 0x34b0b0b0); |
381 | kol_wnd_define( (screen_w-540)/2, (screen_h-440)/2, 540, 440, 0x34b0b0b0, 0x34b0b0b0, WND_CAPTION); |
382 | kol_wnd_caption(WND_CAPTION); |
382 | screen_print(&spectrumZ80); |
383 | screen_print(&spectrumZ80); |
- | |
384 | kol_paint_image((540 - screen_a_w)/2-5, |
383 | kol_paint_image((540 - screen_a_w)/2-5, |
385 | (440 - screen_a_h-kol_skin_height())/2, |
384 | (440 - screen_a_h-kol_skin_height())/2, |
386 | screen_a_w, screen_a_h, screen); |
385 | screen_a_w, screen_a_h, screen); |
387 | kol_paint_end(); |
386 | kol_paint_end(); |
388 | } |
387 | } |
389 | 388 | ||
390 | ///============================= |
389 | ///============================= |
391 | 390 | ||
392 | void kol_main() |
391 | void kol_main() |
393 | { |
392 | { |
394 | 393 | ||
395 | unsigned event; |
394 | unsigned event; |
396 | unsigned key; |
395 | unsigned key; |
397 | 396 | ||
398 | for (event = strlen(KOL_PATH); event > 0; --event) |
397 | for (event = strlen(KOL_PATH); event > 0; --event) |
399 | if ( '/' == KOL_PATH[event] ) |
398 | if ( '/' == KOL_PATH[event] ) |
400 | { |
399 | { |
401 | KOL_PATH[event+1]=0; |
400 | KOL_PATH[event+1]=0; |
402 | break; |
401 | break; |
403 | } |
402 | } |
404 | 403 | ||
405 | strcpy(szBackup, KOL_PATH); |
404 | strcpy(szBackup, KOL_PATH); |
406 | strcpy(szScreen, KOL_PATH); |
405 | strcpy(szScreen, KOL_PATH); |
407 | strcat(szBackup, "backup.sna"); |
406 | strcat(szBackup, "backup.sna"); |
408 | strcat(szScreen, "screen.scr"); |
407 | strcat(szScreen, "screen.scr"); |
409 | 408 | ||
410 | kol_screen_get_size(&screen_w, &screen_h); |
409 | kol_screen_get_size(&screen_w, &screen_h); |
411 | 410 | ||
412 | screen = malloc(SCREEN_LEN); |
411 | screen = malloc(SCREEN_LEN); |
413 | spectrumZ80.RAM = (char*) malloc(64*1024); |
412 | spectrumZ80.RAM = (char*) malloc(64*1024); |
414 | memcpy(spectrumZ80.RAM, BIOS48, 16*1024); |
413 | memcpy(spectrumZ80.RAM, BIOS48, 16*1024); |
415 | 414 | ||
416 | Z80Reset( &spectrumZ80, 69888 ); |
415 | Z80Reset( &spectrumZ80, 69888 ); |
417 | Z80FlagTables(); |
416 | Z80FlagTables(); |
418 | 417 | ||
419 | fila[1][1] = fila[1][2] = fila[2][2] = fila[3][2] = fila[4][2] = |
418 | fila[1][1] = fila[1][2] = fila[2][2] = fila[3][2] = fila[4][2] = |
420 | fila[4][1] = fila[3][1] = fila[2][1] = 0xFF; |
419 | fila[4][1] = fila[3][1] = fila[2][1] = 0xFF; |
421 | 420 | ||
422 | debug = 0; |
421 | debug = 0; |
423 | 422 | ||
424 | if (KOL_PARAM != NULL) |
423 | if (KOL_PARAM != NULL) |
425 | { |
424 | { |
426 | int type = get_ext(KOL_PARAM); |
425 | int type = get_ext(KOL_PARAM); |
427 | 426 | ||
428 | if (TYPE_SNA == type) |
427 | if (TYPE_SNA == type) |
429 | memory_load_sna(&spectrumZ80, KOL_PARAM); |
428 | memory_load_sna(&spectrumZ80, KOL_PARAM); |
430 | } |
429 | } |
431 | 430 | ||
432 | hay_tecla = main_tecla = 0; |
431 | hay_tecla = main_tecla = 0; |
433 | //keyboard_process(0); |
432 | //keyboard_process(0); |
434 | 433 | ||
435 | kol_key_mode_set(1); |
434 | kol_key_mode_set(1); |
436 | 435 | ||
437 | for (;;) |
436 | for (;;) |
438 | { |
437 | { |
439 | 438 | ||
440 | // event = kol_event_check(); |
439 | // event = kol_event_check(); |
441 | event = kol_event_wait_time(1); |
440 | event = kol_event_wait_time(5); |
442 | 441 | ||
443 | switch (event) |
442 | switch (event) |
444 | { |
443 | { |
445 | 444 | ||
446 | case 1: |
445 | case 1: |
447 | wnd_draw(); |
446 | wnd_draw(); |
448 | break; |
447 | break; |
449 | 448 | ||
450 | case 2: |
449 | case 2: |
451 | key = (kol_key_get()>>8)&0xff; |
450 | key = (kol_key_get()>>8)&0xff; |
452 | 451 | ||
453 | switch (key) |
452 | switch (key) |
454 | { |
453 | { |
455 | case 60: // F2 |
454 | case 60: // F2 |
456 | if ( IDOK == MessageBox("Save snapshot?", |
455 | if ( IDOK == MessageBox("Save snapshot?", |
457 | WND_CAPTION, MB_OKCANCEL) ) |
456 | WND_CAPTION, MB_OKCANCEL) ) |
458 | memory_save_sna(&spectrumZ80, |
457 | memory_save_sna(&spectrumZ80, |
459 | szBackup); |
458 | szBackup); |
460 | break; |
459 | break; |
461 | 460 | ||
462 | case 61: // F3 |
461 | case 61: // F3 |
463 | if ( IDOK == MessageBox("Load snapshot?", |
462 | if ( IDOK == MessageBox("Load snapshot?", |
464 | WND_CAPTION, MB_OKCANCEL) ) |
463 | WND_CAPTION, MB_OKCANCEL) ) |
465 | memory_load_sna(&spectrumZ80, |
464 | memory_load_sna(&spectrumZ80, |
466 | szBackup); |
465 | szBackup); |
467 | break; |
466 | break; |
468 | 467 | ||
469 | case 62: // F4 |
468 | case 62: // F4 |
470 | if ( IDOK == MessageBox("Save screenshot?", |
469 | if ( IDOK == MessageBox("Save screenshot?", |
471 | WND_CAPTION, MB_OKCANCEL) ) |
470 | WND_CAPTION, MB_OKCANCEL) ) |
472 | memory_save_scr(&spectrumZ80, |
471 | memory_save_scr(&spectrumZ80, |
473 | szScreen); |
472 | szScreen); |
474 | break; |
473 | break; |
475 | 474 | ||
476 | case 88: // F12 Reset |
475 | case 88: // F12 Reset |
477 | if ( IDOK == MessageBox("Reset?", |
476 | if ( IDOK == MessageBox("Reset?", |
478 | WND_CAPTION, MB_OKCANCEL) ) |
477 | WND_CAPTION, MB_OKCANCEL) ) |
479 | { |
478 | { |
480 | Z80Reset( &spectrumZ80, 69888 ); |
479 | Z80Reset( &spectrumZ80, 69888 ); |
481 | Z80FlagTables(); |
480 | Z80FlagTables(); |
482 | fila[1][1] = fila[1][2] = |
481 | fila[1][1] = fila[1][2] = |
483 | fila[2][2] = fila[3][2] = |
482 | fila[2][2] = fila[3][2] = |
484 | fila[4][2] = fila[4][1] = |
483 | fila[4][2] = fila[4][1] = |
485 | fila[3][1] = fila[2][1] = 0xFF; |
484 | fila[3][1] = fila[2][1] = 0xFF; |
486 | } |
485 | } |
487 | break; |
486 | break; |
488 | 487 | ||
489 | default: |
488 | default: |
490 | keyboard_process(key); |
489 | keyboard_process(key); |
491 | }; |
490 | }; |
492 | 491 | ||
493 | break; |
492 | break; |
494 | 493 | ||
495 | case 3: |
494 | case 3: |
496 | if ( 1 == (kol_btn_get() & 0xff00)>>8 ) |
495 | if ( 1 == (kol_btn_get() & 0xff00)>>8 ) |
497 | { |
496 | { |
498 | free(screen); |
497 | free(screen); |
499 | free(spectrumZ80.RAM); |
498 | free(spectrumZ80.RAM); |
500 | kol_exit(); |
499 | kol_exit(); |
501 | } |
500 | } |
502 | break; |
501 | break; |
503 | 502 | ||
504 | default: |
503 | default: |
505 | if (0 == debug) |
504 | if (0 == debug) |
506 | { |
505 | { |
507 | 506 | ||
508 | Z80Run( &spectrumZ80, 224*64 ); |
507 | Z80Run( &spectrumZ80, 224*64 ); |
509 | for( scanl=0; scanl<192; scanl++ ) |
508 | for( scanl=0; scanl<192; scanl++ ) |
510 | Z80Run( &spectrumZ80, 224 ); |
509 | Z80Run( &spectrumZ80, 224 ); |
511 | 510 | ||
512 | Z80Run( &spectrumZ80, 224*56 ); |
511 | Z80Run( &spectrumZ80, 224*56 ); |
513 | 512 | ||
514 | if( target_cycle < 2 || frame_counter == 0 ) |
513 | if( target_cycle < 2 || frame_counter == 0 ) |
515 | { |
514 | { |
516 | screen_print(&spectrumZ80); |
515 | screen_print(&spectrumZ80); |
517 | kol_screen_wait_rr(); |
516 | kol_screen_wait_rr(); |
518 | kol_paint_image((540 - screen_a_w)/2-5, |
517 | kol_paint_image((540 - screen_a_w)/2-5, |
519 | (440 - screen_a_h-kol_skin_height())/2, |
518 | (440 - screen_a_h-kol_skin_height())/2, |
520 | screen_a_w, screen_a_h, screen); |
519 | screen_a_w, screen_a_h, screen); |
521 | } |
520 | } |
522 | 521 | ||
523 | while( target_cycle == 0 ) |
522 | while( target_cycle == 0 ) |
524 | { |
523 | { |
525 | target_cycle--; |
524 | target_cycle--; |
526 | frame_counter++; |
525 | frame_counter++; |
527 | } |
526 | } |
528 | } |
527 | } |
529 | break; |
528 | break; |
530 | 529 | ||
531 | }; |
530 | }; |
532 | 531 | ||
533 | } |
532 | } |
534 | 533 | ||
535 | } |
534 | } |
536 | 535 | ||
537 | ///=============================>192;>><>>=><=>>>>>>>> |
536 | ///=============================>192;>><>>=><=>>>>>>>> |