Subversion Repositories NedoOS

Rev

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