Rev 1058 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log
Rev | Author | Line No. | Line |
---|---|---|---|
1057 | alone | 1 | EMUOUT |
2 | ;BC=port, A=value |
||
3 | BIT 0,C |
||
4 | jp Z,eoutFE |
||
5 | BIT 1,C |
||
6 | jr Z,eoutFD |
||
7 | PUSH AF |
||
8 | LD A,(doson0) |
||
9 | OR A |
||
10 | jp Z,EMUOUTDOS |
||
11 | POP AF |
||
12 | RET |
||
13 | eoutFD |
||
14 | BIT 7,B |
||
15 | jp Z,eout7FFD |
||
16 | BIT 6,B |
||
17 | jr NZ,eoutFFFD |
||
18 | LD BC,#BFFD |
||
19 | OUT (C),A |
||
20 | RET |
||
21 | eoutFFFD |
||
22 | BIT 5,B |
||
23 | jr z,eoutDFFD |
||
24 | LD BC,#FFFD |
||
25 | OUT (C),A |
||
26 | RET |
||
27 | eoutDFFD |
||
28 | ld (_dffd),a |
||
29 | AND 128 ;video mode |
||
30 | oldcurvideomode=$+1 |
||
31 | cp 0 |
||
1137 | alone | 32 | ;jr z,eoDFFDnovideomode |
33 | ;ld (oldcurvideomode),a |
||
34 | call nz,setvideomode |
||
35 | ;eoDFFDnovideomode |
||
1057 | alone | 36 | ld a,(_fd) |
37 | eout7FFD |
||
38 | ;TODO block if bit 5 was "1" in (_fd) |
||
39 | LD (_fd),A |
||
40 | LD C,A |
||
41 | AND #C7 |
||
42 | and 7 |
||
43 | ld l,a |
||
44 | ld a,(_dffd) |
||
45 | if PROFI==512 |
||
46 | and 3 ;Profi 512K |
||
47 | else |
||
48 | and 7 ;Profi 1024K |
||
49 | endif |
||
50 | add a,a |
||
51 | add a,a |
||
52 | add a,a |
||
53 | add a,l |
||
54 | ld (_logicpg),a |
||
55 | ld l,a |
||
56 | ld h,temulpgs/256 |
||
57 | ld a,(hl) |
||
58 | deadpg=$+1 |
||
59 | cp 0 |
||
60 | jr nz,eout7FFDOK |
||
61 | push bc |
||
62 | push de |
||
63 | push hl |
||
64 | exx |
||
65 | push bc |
||
66 | push de |
||
67 | push hl |
||
68 | push ix |
||
69 | push iy |
||
70 | exa |
||
71 | push af |
||
72 | OS_NEWPAGE ;мегабайт захватывать динамически постранично |
||
73 | pop af |
||
74 | exa |
||
75 | ld a,e |
||
76 | pop iy |
||
77 | pop ix |
||
78 | pop hl |
||
79 | pop de |
||
80 | pop bc |
||
81 | exx |
||
82 | pop hl |
||
83 | pop de |
||
84 | pop bc |
||
85 | ld (hl),a |
||
86 | eout7FFDOK |
||
87 | |||
88 | ld a,(_dffd) |
||
89 | and 16 ;D4 = rom off |
||
90 | jr z,eout7FFD_romon |
||
91 | ld a,(temulpgs+0) |
||
92 | LD (emulcurpg0000),A |
||
93 | ld a,ROMSTATE_OFF |
||
94 | ld (romstate_flag),a |
||
95 | ld a,DOSSTATE_FROM128 |
||
96 | ld (DOSER_state),a ;skip DOSER |
||
97 | jr eout7FFD_romonq |
||
98 | eout7FFD_romon |
||
99 | LD A,(doson0) ;DOS ports on |
||
100 | OR A |
||
101 | jr Z,eo7FFDdos |
||
102 | BIT 4,C ;номер ПЗУ |
||
103 | ld b,DOSSTATE_FROM48 |
||
104 | LD A,(pgrom48) |
||
105 | jr NZ,eo7FFDo |
||
106 | ld b,DOSSTATE_FROM128 |
||
107 | LD A,(pgrom128) |
||
108 | JR eo7FFDo |
||
109 | eo7FFDdos |
||
110 | BIT 4,C ;номер ПЗУ |
||
111 | ld b,DOSSTATE_FROMDOS |
||
112 | LD A,(pgromDOS) |
||
113 | jr NZ,eo7FFDo |
||
114 | LD A,(pgromSYS) |
||
115 | eo7FFDo |
||
116 | LD (emulcurpg0000),A |
||
117 | ld a,b |
||
118 | ld (DOSER_state),a |
||
119 | ld a,ROMSTATE_ON |
||
120 | ld (romstate_flag),a |
||
121 | eout7FFD_romonq |
||
122 | |||
123 | LD A,C |
||
124 | AND 8 ;номер экрана |
||
125 | LD (curscr),A |
||
126 | oldcurscr7ffd=$+1 |
||
127 | cp 0 |
||
1137 | alone | 128 | ;jr z,eo7FFDnoscr |
129 | ;ld (oldcurscr7ffd),a |
||
130 | call nz,setscreen |
||
131 | ;eo7FFDnoscr |
||
1057 | alone | 132 | ld hl,_dffd |
133 | bit 3,(hl) |
||
134 | ld a,5 |
||
135 | jr z,eo7FFD_nomem4000 |
||
136 | _logicpg=$+1 |
||
137 | ld a,0;(_logicpg) |
||
138 | eo7FFD_nomem4000 |
||
139 | ld (_logicpg4000),a |
||
140 | ld a,(_logicpg) |
||
141 | jr z,eo7FFD_nomemc000 |
||
142 | ld a,7 |
||
143 | eo7FFD_nomemc000 |
||
144 | ld (_logicpgc000),a |
||
145 | bit 6,(hl) |
||
146 | ld a,2 |
||
147 | jr z,eo7FFD_nomem8000 |
||
148 | ld a,6 |
||
149 | eo7FFD_nomem8000 |
||
150 | ld (_logicpg8000),a |
||
151 | ;(_logicpgx000) are formed! |
||
152 | |||
153 | ld hl,(_logicpg4000) |
||
154 | ld h,temulpgs/256 |
||
155 | ld a,(hl) |
||
156 | LD (emulcurpg4000),A |
||
157 | |||
158 | ld hl,(_logicpgc000) |
||
159 | ld h,temulpgs/256 |
||
160 | ld a,(hl) |
||
161 | LD (emulcurpgc000),A |
||
162 | if margins;MEM48C0 |
||
163 | SETPGC000 |
||
164 | endif |
||
165 | ld hl,(_logicpg8000) |
||
166 | ld h,temulpgs/256 |
||
167 | ld a,(hl) |
||
168 | LD (emulcurpg8000),A |
||
169 | if margins;MEM48C0 |
||
170 | SETPG8000 |
||
171 | endif |
||
172 | |||
173 | if extpg5 |
||
174 | ld a,(_dffd) |
||
175 | rla |
||
176 | ld a,(_logicpgc000) |
||
177 | jr nc,screeninc000_noprofi |
||
178 | and 0xff-2 |
||
179 | cp 0x04 |
||
180 | jr z,screeninc000_noprofiq |
||
181 | cp PGATTR0 |
||
182 | jr screeninc000_noprofiq |
||
183 | screeninc000_noprofi |
||
184 | and 0xff-2 |
||
185 | cp 5 |
||
186 | screeninc000_noprofiq |
||
187 | ld a,0xc9 ;screen off |
||
188 | jr nz,$+3 |
||
189 | xor a ;screen on |
||
190 | ld (screeninc000_flag),a |
||
191 | |||
192 | ld a,(_dffd) |
||
193 | rla |
||
194 | ld a,(_logicpg4000) |
||
195 | jr nc,screenin4000_noprofi |
||
196 | and 0xff-2 |
||
197 | cp 0x04 |
||
198 | jr z,screenin4000_noprofiq |
||
199 | cp PGATTR0 |
||
200 | jr screenin4000_noprofiq |
||
201 | screenin4000_noprofi |
||
202 | and 0xff-2 |
||
203 | cp 5 |
||
204 | screenin4000_noprofiq |
||
205 | ld a,0xc9 ;screen off |
||
206 | jr nz,$+3 |
||
207 | xor a ;screen on |
||
208 | ld (screenin4000_flag),a |
||
209 | |||
210 | ld a,(_dffd) |
||
211 | rla |
||
212 | ld a,(_logicpg8000) |
||
213 | jr nc,screenin8000_noprofi |
||
214 | and 0xff-2 |
||
215 | cp 0x04 |
||
216 | jr z,screenin8000_noprofiq |
||
217 | cp PGATTR0 |
||
218 | jr screenin8000_noprofiq |
||
219 | screenin8000_noprofi |
||
220 | and 0xff-2 |
||
221 | cp 5 |
||
222 | screenin8000_noprofiq |
||
223 | ld a,0xc9 ;screen off |
||
224 | jr nz,$+3 |
||
225 | xor a ;screen on |
||
226 | ld (screenin8000_flag),a |
||
227 | |||
228 | endif |
||
229 | |||
230 | if margins |
||
231 | ld a,0x3e |
||
232 | ld (set4000com),a |
||
233 | CALCpgcom |
||
234 | endif |
||
235 | RET |
||
236 | eoutFE |
||
237 | LD (_fe),A |
||
238 | outFE |
||
239 | OUT (#FE),A |
||
240 | RET |
||
241 | EMUOUTDOS |
||
242 | LD A,C |
||
243 | CP #3F |
||
244 | jr Z,eod3F |
||
245 | CP #5F |
||
246 | jr Z,eod5F |
||
247 | CP #FF |
||
248 | jr Z,eodFF |
||
249 | POP AF |
||
250 | RET |
||
251 | eod3F |
||
252 | POP AF |
||
253 | LD (dos3F),A |
||
254 | RET |
||
255 | eod5F |
||
256 | POP AF |
||
257 | LD (dos5F),A |
||
258 | RET |
||
259 | eodFF |
||
260 | POP AF |
||
261 | LD (dosFF),A |
||
262 | RET |
||
263 | |||
264 | copyscreen_profi |
||
265 | ;a=logicpg |
||
266 | ld (copyscreen_profi_logicpg),a |
||
267 | ld c,a |
||
268 | ld b,temulpgs/256 |
||
269 | ld a,(bc) |
||
270 | ld (copyscreen_profi_physpg),a |
||
271 | ld hl,0x4000 |
||
272 | copyscreen_profi0 |
||
273 | push hl |
||
274 | copyscreen_profi_physpg=$+1 |
||
275 | ld a,0 |
||
276 | OUTPG4000 |
||
277 | ld c,(hl) |
||
278 | or a |
||
279 | copyscreen_profi_logicpg=$+1 |
||
280 | ld a,0 |
||
281 | call screen4000_branchvideomode |
||
282 | pop hl |
||
283 | inc l |
||
284 | jr nz,copyscreen_profi0 |
||
285 | inc h |
||
286 | jp p,copyscreen_profi0 |
||
287 | ret |
||
288 | |||
289 | EMUIN |
||
290 | ;BC=port |
||
291 | ;return A=value |
||
292 | BIT 0,C |
||
293 | jr Z,einFE |
||
294 | LD A,(doson0) |
||
295 | OR A |
||
296 | jr Z,EMUINDOS |
||
297 | LD A,C |
||
298 | cp 0xfd |
||
299 | jr z,einAY |
||
300 | CP #DF |
||
301 | jr Z,einMOUSE |
||
302 | CP #1F |
||
303 | jr Z,einKEMPSTON |
||
304 | LD A,#FF |
||
305 | RET |
||
306 | einAY |
||
307 | ld bc,0xfffd |
||
308 | in a,(c) |
||
309 | ret |
||
310 | einMOUSE |
||
311 | LD A,B |
||
312 | CP #FA |
||
313 | jr Z,einFADF |
||
314 | CP #FB |
||
315 | jr Z,einFBDF |
||
316 | CP #FF |
||
317 | jr Z,einFFDF |
||
318 | LD A,#FF |
||
319 | RET |
||
320 | einFADF |
||
321 | ;LD BC,#FADF |
||
322 | ;IN A,(C) |
||
323 | mousebuttons=$+1 |
||
324 | ld a,0xff |
||
325 | RET |
||
326 | einFBDF |
||
327 | ;LD BC,#FBDF |
||
328 | ;IN A,(C) |
||
329 | mousex=$+1 |
||
330 | ld a,0 |
||
331 | RET |
||
332 | einFFDF |
||
333 | ;LD BC,#FFDF |
||
334 | ;IN A,(C) |
||
335 | mousey=$+1 |
||
336 | ld a,0 |
||
337 | RET |
||
338 | einKEMPSTON |
||
339 | ;IN A,(#1f) |
||
340 | kempston=$+1 |
||
341 | ld a,0 |
||
342 | RET |
||
343 | einFE |
||
344 | ;LD C,#FE |
||
345 | ;IN A,(C) |
||
346 | ;ld a,b |
||
347 | ;or a |
||
348 | ;jr z,$ |
||
349 | push hl |
||
350 | ld hl,keymatrix |
||
351 | ld a,0xff |
||
352 | dup 8 |
||
353 | rlc b |
||
354 | jr c,$+3 |
||
355 | and (hl) |
||
356 | inc hl |
||
357 | edup |
||
358 | pop hl |
||
359 | and a |
||
360 | ;LD C,#FE |
||
361 | ;IN A,(C) |
||
1137 | alone | 362 | RET |
1057 | alone | 363 | EMUINDOS |
364 | LD A,C |
||
365 | CP #1F |
||
366 | jr Z,eid1F |
||
367 | CP #3F |
||
368 | jr Z,eid3F |
||
369 | CP #5F |
||
370 | jr Z,eid5F |
||
371 | CP #5F |
||
372 | jr Z,eidFF |
||
373 | LD A,#FF |
||
1137 | alone | 374 | RET |
1057 | alone | 375 | eidFF |
376 | ;LD A,#80 ;INTRQ=команда выполнена ok |
||
377 | ld a,r |
||
378 | rla |
||
379 | and 0xc0 ;D6=DRQ, D7=INTRQ |
||
1137 | alone | 380 | RET |
1057 | alone | 381 | eid1F |
382 | ;LD A,#80 ;команда выполнена ok, диск вставлен |
||
383 | ld a,r |
||
384 | fddstatemask=$+1 |
||
385 | and 3 |
||
386 | or 0x80 |
||
1137 | alone | 387 | RET |
1057 | alone | 388 | eid3F |
389 | LD A,(dos3F) ;trk |
||
1137 | alone | 390 | RET |
1057 | alone | 391 | eid5F |
392 | LD A,(dos5F) ;sec |
||
1137 | alone | 393 | RET |
394 | |||
395 | setvideomode |
||
396 | ld (oldcurvideomode),a |
||
397 | ;video mode changed! set system video mode and recode screen data |
||
398 | ;push bc |
||
399 | push de |
||
400 | ;push hl |
||
401 | rla |
||
402 | jr c,eoDFFD_copyprofi |
||
403 | ld a,SCREEN4000_VIDEOMODE_6912 |
||
404 | ld (screen4000_videomode),a |
||
405 | ld a,SCREEN8000_VIDEOMODE_6912 |
||
406 | ld (screen8000_videomode),a |
||
407 | ld a,SCREENC000_VIDEOMODE_6912 |
||
408 | ld (screenc000_videomode),a |
||
409 | ld a,0x05 |
||
410 | call copyscreen_profi |
||
411 | ld a,0x07 |
||
412 | call copyscreen_profi |
||
413 | ld e,3+0x80 ;6912+keep |
||
414 | jr eoDFFD_copyprofiq |
||
415 | eoDFFD_copyprofi |
||
416 | ld a,(user_scr1_high) ;ok |
||
417 | call clearpg |
||
418 | ld a,(user_scr0_high) ;ok |
||
419 | call clearpg |
||
420 | ld a,SCREEN4000_VIDEOMODE_PROFI |
||
421 | ld (screen4000_videomode),a |
||
422 | ld a,SCREEN8000_VIDEOMODE_PROFI |
||
423 | ld (screen8000_videomode),a |
||
424 | ld a,SCREENC000_VIDEOMODE_PROFI |
||
425 | ld (screenc000_videomode),a |
||
426 | ld a,0x04 |
||
427 | call copyscreen_profi |
||
428 | ld a,0x06 |
||
429 | call copyscreen_profi |
||
430 | ld a,PGATTR0;0x38 |
||
431 | call copyscreen_profi |
||
432 | ld a,PGATTR1;0x3a |
||
433 | call copyscreen_profi |
||
434 | ld e,2+0x80 ;MC+keep |
||
435 | eoDFFD_copyprofiq |
||
436 | exx |
||
437 | push bc |
||
438 | push de |
||
439 | push hl |
||
440 | push ix |
||
441 | push iy |
||
442 | exx |
||
443 | exa |
||
444 | push af |
||
445 | OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode) |
||
446 | pop af |
||
447 | exa |
||
448 | ld a,e |
||
449 | pop iy |
||
450 | pop ix |
||
451 | pop hl |
||
452 | pop de |
||
453 | pop bc |
||
454 | exx |
||
455 | ;pop hl |
||
456 | pop de |
||
457 | ;pop bc |
||
458 | ret |
||
459 | |||
460 | setscreen |
||
461 | ld (oldcurscr7ffd),a |
||
462 | ;push bc |
||
463 | push de |
||
464 | ;push hl |
||
465 | exx |
||
466 | push bc |
||
467 | push de |
||
468 | push hl |
||
469 | push ix |
||
470 | push iy |
||
471 | rrca |
||
472 | rrca |
||
473 | rrca |
||
474 | ld e,a |
||
475 | exa |
||
476 | push af |
||
477 | OS_SETSCREEN |
||
478 | pop af |
||
479 | exa |
||
480 | pop iy |
||
481 | pop ix |
||
482 | pop hl |
||
483 | pop de |
||
484 | pop bc |
||
485 | exx |
||
486 | ;pop hl |
||
487 | pop de |
||
488 | ;pop bc |
||
489 | ret |