Subversion Repositories NedoOS

Rev

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