Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
716 lvd 1
#include "std.h"
2
 
3
#include "emul.h"
784 DimkaM 4
#include "funcs.h"
716 lvd 5
#include "vars.h"
6
#include "draw.h"
7
#include "memory.h"
8
#include "atm.h"
784 DimkaM 9
#include "profi.h"
10
#include "sndrender/sndcounter.h"
716 lvd 11
#include "sound.h"
12
#include "gs.h"
13
#include "sdcard.h"
14
#include "zc.h"
15
#include "tape.h"
730 lvd 16
#include "zxevo.h"
800 DimkaM 17
#include "upd765.h"
819 DimkaM 18
#include "zxusbnet.h"
716 lvd 19
 
20
void out(unsigned port, unsigned char val)
21
{
22
   port &= 0xFFFF;
23
   u8 p1 = (port & 0xFF);
24
   brk_port_out = port; brk_port_val = val;
25
 
26
   //       8
784 DimkaM 27
 
28
   if(conf.ula_plus)
29
   {
30
       if(port == 0xBF3B)
31
       {
32
           comp.ula_plus_group = val >> 6;
33
           if(comp.ula_plus_group == 0)
34
           {
35
               comp.ula_plus_pal_idx = val & 0x3F;
36
           }
37
           return;
38
       }
39
 
40
       if(port == 0xFF3B)
41
       {
42
           if(comp.ula_plus_group == 0)
43
           {
44
               comp.comp_pal[comp.ula_plus_pal_idx] = val;
45
               temp.comp_pal_changed = 1;
46
               return;
47
           }
48
 
49
           if(comp.ula_plus_group == 1)
50
           {
51
               bool en = (val & 1) != 0;
52
               if(comp.ula_plus_en != en)
53
               {
54
                   comp.ula_plus_en = en;
55
                   if(comp.ula_plus_en)
56
                   {
57
                       temp.rflags |= RF_COMPPAL | RF_PALB;
58
                   }
59
                   else
60
                   {
61
                       temp.rflags &= unsigned(~(RF_COMPPAL | RF_PALB));
62
                   }
63
                   video_color_tables();
64
                   temp.comp_pal_changed = 1;
65
               }
66
               return;
67
           }
68
           return;
69
       }
70
   }
71
 
716 lvd 72
   #ifdef MOD_GS
73
   // 10111011 | BB
74
   // 10110011 | B3
75
   // 00110011 | 33
76
   if ((port & 0xFF) == 0x33 && conf.gs_type) // 33
77
   {
784 DimkaM 78
       out_gs(p1, val);
716 lvd 79
       return;
80
   }
81
   if ((port & 0xF7) == 0xB3 && conf.gs_type) // BB, B3
82
   {
784 DimkaM 83
       out_gs(p1, val);
716 lvd 84
       return;
85
   }
86
   #endif
87
 
88
   // z-controller
730 lvd 89
   if (conf.zc && (port & 0xFF) == 0x57 )
716 lvd 90
   {
730 lvd 91
      if ((port & 0x80FF) == 0x8057 && conf.mem_model == MM_ATM3
92
         &&(comp.flags & CF_DOSPORTS))
93
         return;
716 lvd 94
       Zc.Wr(port, val);
95
       return;
96
   }
819 DimkaM 97
 
98
   if(conf.wiznet && (port & 0xff) == 0xab ){
99
      pXXAB_Write(port,val);
100
      return;
101
   }
716 lvd 102
   // divide  nemo 
103
   if(conf.ide_scheme == IDE_NEMO_DIVIDE)
104
   {
105
       if((port & 0x1E) == 0x10) // rrr1000x
106
       {
107
           if((port & 0xFF) == 0x11)
108
           {
109
               comp.ide_write = val;
110
               comp.ide_hi_byte_w = 0;
111
               comp.ide_hi_byte_w1 = 1;
112
               return;
113
           }
114
 
115
           if((port & 0xFE) == 0x10)
116
           {
117
               comp.ide_hi_byte_w ^= 1;
118
 
119
               if(comp.ide_hi_byte_w1) //     0x11 (   )
120
               {
121
                   comp.ide_hi_byte_w1 = 0;
122
               }
123
               else
124
               {
125
                   if(comp.ide_hi_byte_w) //   
126
                   {
127
                       comp.ide_write = val;
128
                       return;
129
                   }
130
                   else //       (   write_hdd_5)
131
                   {
132
                       u8 tmp = comp.ide_write;
133
                       comp.ide_write = val;
134
                       val = tmp;
135
                   }
136
               }
137
           }
138
           else
139
           {
140
               comp.ide_hi_byte_w = 0;
141
           }
142
           goto write_hdd_5;
143
       }
144
       else if((port & 0xFF) == 0xC8)
145
       {
146
           return hdd.write(8, val);
147
       }
148
   }
149
 
150
   if(conf.mem_model == MM_ATM3)
151
   {
847 DimkaM 152
           switch(port & 0xFF){
153
                   case 0xBF:   //   
154
                                if((comp.pBF ^ val) & comp.pBF & 8) // D3: 1->0
155
                                {
156
                                        nmi_pending  = 1;
157
                                        trdos_in_nmi = comp.flags&CF_TRDOS;
158
                                }
159
                           comp.pBF = val;
160
                           set_banks();
161
                           return;
162
                   case 0xBE:   //   RAM0 3
163
                           if(cpu.nmi_in_progress&&(cpu.nmi_in_progress==conf.trdos_IORam))
164
                           {
165
                                  if(trdos_in_nmi)
166
                                          comp.flags |= CF_SETDOSROM|CF_TRDOS;
167
                                  cpu.nmi_in_progress = false;
168
                                  set_banks();
169
                                  return;
170
                           }
171
                           comp.pBE = 2; //     nmi
172
                           return;
173
                   case 0xBD:   //        FDD
174
                           switch(port & 0xEFFF){
175
                                   case 0x00BD:
176
                                           comp.brk_addr &= 0xFF00;
177
                                           comp.brk_addr |= ((u16)val)&0x00FF;
178
                                           break;
179
                                   case 0x01BD:
180
                                           comp.brk_addr &= 0x00FF;
181
                                           comp.brk_addr |= ( ((u16)val) << 8 )&0xFF00;
182
                                           break;
183
                                   case 0x03BD:
184
                                           comp.fddIO2Ram_mask = val;
185
                                           break;                                          
186
                           }
187
                           return;
730 lvd 188
           }
716 lvd 189
   }
190
 
191
   if (comp.flags & CF_DOSPORTS)
192
   {
730 lvd 193
      if(conf.mem_model == MM_ATM3 && (p1 & 0x1F) == 0x0F && !(((p1 >> 5) - 1) & 4))
716 lvd 194
      {
195
          // 2F = 001|01111b
196
          // 4F = 010|01111b
197
          // 6F = 011|01111b
198
          // 8F = 100|01111b
759 dimkam 199
                     comp.wd_shadow[(p1 >> 5) - 1] = val;
716 lvd 200
      }
201
      if (conf.ide_scheme == IDE_ATM && (port & 0x1F) == 0x0F)
202
      {
203
         if (port & 0x100) { comp.ide_write = val; return; }
204
      write_hdd_5:
205
         port >>= 5;
206
      write_hdd:
207
         port &= 7;
208
         if (port)
209
             hdd.write(port, val);
210
         else
784 DimkaM 211
             hdd.write_data(unsigned(val | (comp.ide_write << 8)));
716 lvd 212
         return;
213
      }
214
 
215
      if ((port & 0x18A3) == (0xFFFE & 0x18A3))
216
      { // SMUC
217
         if (conf.smuc)
218
         {
219
            if ((port & 0xA044) == (0xDFBA & 0xA044))
220
            { // clock
221
               if (comp.pFFBA & 0x80)
222
                   cmos_write(val);
223
               else
224
                   comp.cmos_addr = val;
225
               return;
226
            }
227
            if ((port & 0xA044) == (0xFFBA & 0xA044))
228
            { // SMUC system port
229
               if ((val & 1) && (conf.ide_scheme == IDE_SMUC))
230
                   hdd.reset();
231
               comp.nvram.write(val);
232
               comp.pFFBA = val;
233
               return;
234
            }
235
            if ((port & 0xA044) == (0x7FBA & 0xA044))
236
            {
237
                comp.p7FBA = val;
238
                return;
239
            }
240
         }
241
         if ((port & 0x8044) == (0xFFBE & 0x8044) && conf.ide_scheme == IDE_SMUC)
242
         { // FFBE, FEBE
243
            if(comp.pFFBA & 0x80)
244
            {
245
                if(!(port & 0x100))
246
                    hdd.write(8, val); // control register
247
                return;
248
            }
249
 
250
            if (!(port & 0x2000))
251
            {
252
                comp.ide_write = val;
253
                return;
254
            }
255
            port >>= 8;
256
                goto write_hdd;
257
         }
258
      }
259
 
260
      if (conf.mem_model == MM_ATM710 || conf.mem_model == MM_ATM3)
261
      {
262
         if ((conf.mem_model == MM_ATM3) && ((port & 0x3FFF) == 0x37F7)) // x7f7 ATM3 4Mb memory manager
263
         {
264
             unsigned idx = ((comp.p7FFD & 0x10) >> 2) | ((port >> 14) & 3);
784 DimkaM 265
             comp.pFFF7[idx] = (comp.pFFF7[idx] & ~0x1FFU) | (val ^ 0xFF); // always ram
716 lvd 266
             set_banks();
267
             return;
268
         }
269
 
270
         if (p1 == 0x77) // xx77
271
         {
272
             set_atm_FF77(port, val);
273
             return;
274
         }
275
 
730 lvd 276
         u32 mask = (conf.mem_model == MM_ATM3) ? /*0x3FFF*/ 0x0FFF : 0x00FF; // lvd fix: pentevo hardware decodes fully only low byte,
277
                        // so using eff7 in shadow mode lead to outting to fff7,
278
                                                                              // unlike this was in unreal!
716 lvd 279
         if ((port & mask) == (0x3FF7 & mask)) // xff7
280
         {
784 DimkaM 281
             comp.pFFF7[((comp.p7FFD & 0x10) >> 2) | ((port >> 14) & 3)] = unsigned(((val & 0xC0) << 2) | (val & 0x3F)) ^ 0x33FU;
716 lvd 282
             set_banks();
283
             return;
284
         }
285
 
286
         if ((p1 & 0x9F) == 0x9F && !(comp.aFF77 & 0x4000))
287
             atm_writepal(val); // don't return - write to TR-DOS system port
288
      }
289
 
290
      if(conf.mem_model == MM_PROFI)
291
      {
292
          if((comp.p7FFD & 0x10) && (comp.pDFFD & 0x20)) // modified ports
293
          {
294
              // BDI ports
295
              if((p1 & 0x9F) == 0x83) // WD93 ports
296
              {
297
                  comp.wd.out((p1 & 0x60) | 0x1F, val);
298
                  return;
299
              }
300
 
301
              if((p1 & 0xE3) == 0x23) // port FF
302
              {
303
                  comp.wd.out(0xFF, val);
304
                  return;
305
              }
306
 
307
              // RTC
308
              if((port & 0x9F) == 0x9F && conf.cmos)
309
              {
310
                if(port & 0x20)
311
                {
312
                    comp.cmos_addr = val;
313
                    return;
314
                }
315
                cmos_write(val);
316
                return;
317
              }
318
 
319
              // IDE (AB=10101011, CB=11001011, EB=11101011)
320
              if ((p1 & 0x9F) == 0x8B && (conf.ide_scheme == IDE_PROFI))
321
              {
322
                  if(p1 & 0x40)
323
                  {    // cs1
324
                      if (!(p1 & 0x20))
325
                      {
326
                          comp.ide_write = val;
327
                          return;
328
                      }
329
                      port >>= 8;
330
                      goto write_hdd;
331
                  }
332
 
333
                  // cs3
334
                  if(p1 & 0x20)
335
                  {
336
                      if(((port>>8) & 7) == 6)
337
                          hdd.write(8, val);
338
                      return;
339
                  }
340
              }
341
          }
342
          else
343
          {
344
              // BDI ports
345
              if((p1 & 0x83) == 0x03)  // WD93 ports 1F, 3F, 5F, 7F
346
              {
347
                  comp.wd.out((p1 & 0x60) | 0x1F,val);
348
                  return;
349
              }
350
 
351
              if((p1 & 0xE3) == ((comp.pDFFD & 0x20) ? 0xA3 : 0xE3)) // port FF
352
              {
353
                  comp.wd.out(0xFF,val);
354
                  return;
355
              }
356
          }
357
      } // profi
358
 
359
      if(conf.mem_model == MM_QUORUM /* && !(comp.p00 & Q_TR_DOS)*/) // cpm ports
360
      {
361
          if((p1 & 0xFC) == 0x80) // 80, 81, 82, 83
362
          {
784 DimkaM 363
              p1 = u8(((p1 & 3) << 5) | 0x1F);
716 lvd 364
 
365
              comp.wd.out(p1, val);
366
              return;
367
          }
368
 
369
          if(p1 == 0x85) // 85
370
          {
371
//            01 -> 00 A
372
//            10 -> 01 B
373
//            00 -> 11 D (unused)
374
//            11 -> 11 D (unused)
375
              static const u8 drv_decode[] = { 3, 0, 1, 3 };
376
              u8 drv = drv_decode[val & 3];
377
              comp.wd.out(0xFF, ((val & ~3) ^ 0x10) | 0xCC | 8 | drv);
378
              return;
379
          }
380
      } // quorum
381
      else if ((p1 & 0x1F) == 0x1F) // 1F, 3F, 5F, 7F, FF
382
      {
874 dimkam 383
                  if(p1 & 0x80) {
384
                        comp.trdos_last_ff = val & 0x1f;
385
                  }
873 DimkaM 386
                  if((comp.flags & CF_TRDOS)&&conf.trdos_IORam&&(bankr[0]==base_dos_rom)&&(p1 & 0x80)){
387
                     comp.wd.out(p1, val);
388
                         if((1<<comp.wd.drive)&comp.fddIO2Ram_mask){
389
                                trdos_in_nmi = comp.flags&CF_TRDOS;
390
                                cpu.nmi_in_progress=conf.trdos_IORam;
391
                                set_banks();
392
                         }
393
                  }else if((comp.flags & CF_TRDOS)&&conf.trdos_IORam
765 dimkam 394
                                &&(1<<comp.wd.drive)&comp.fddIO2Ram_mask&&(bankr[0]==base_dos_rom)){
759 dimkam 395
                     trdos_in_nmi = comp.flags&CF_TRDOS;
396
                         cpu.nmi_in_progress=conf.trdos_IORam;
397
                         set_banks();
398
                  }else{
873 DimkaM 399
                     comp.wd.out(p1, val);
759 dimkam 400
                  }
716 lvd 401
          return;
402
      }
403
      // don't return - out to port #FE works in trdos!
404
   }
405
   else //  dos
406
   {
800 DimkaM 407
       if((p1 == 0x3F) && (conf.sound.ay_scheme == AY_SCHEME_FULLER)) // fuller AY register select
408
       {
409
           ay[0].select(val);
410
           return;
411
       }
412
       if((p1 == 0x5F) && (conf.sound.ay_scheme == AY_SCHEME_FULLER)) // fuller AY data
413
       {
414
           ay[0].write(temp.sndblock ? 0 : cpu.t, val);
415
           return;
416
       }
417
 
716 lvd 418
         if(((port & 0xA3) == 0xA3) && (conf.ide_scheme == IDE_DIVIDE))
419
         {
420
             if((port & 0xFF) == 0xA3)
421
             {
422
                 comp.ide_hi_byte_w ^= 1;
423
                 if(comp.ide_hi_byte_w)
424
                 {
425
                     comp.ide_write = val;
426
                     return;
427
                 }
428
                 u8 tmp = comp.ide_write;
429
                 comp.ide_write = val;
430
                 val = tmp;
431
             }
432
             else
433
             {
434
                 comp.ide_hi_byte_w = 0;
435
             }
436
             port >>= 2;
437
             goto write_hdd;
438
         }
439
 
440
         if ((unsigned char)port == 0x1F && conf.sound.ay_scheme == AY_SCHEME_POS)
441
         {
442
             comp.active_ay = val & 1;
443
             return;
444
         }
445
 
446
         if (!(port & 6) && (conf.ide_scheme == IDE_NEMO || conf.ide_scheme == IDE_NEMO_A8))
447
         {
448
             unsigned hi_byte = (conf.ide_scheme == IDE_NEMO)? (port & 1) : (port & 0x100);
449
             if (hi_byte)
450
             {
451
                 comp.ide_write = val;
452
                 return;
453
             }
454
             if ((port & 0x18) == 0x08)
455
             {
456
                 if ((port & 0xE0) == 0xC0)
457
                     hdd.write(8, val);
458
                 return;
459
             } // CS1=0,CS0=1,reg=6
460
             if ((port & 0x18) != 0x10)
461
                 return; // invalid CS0,CS1
462
             goto write_hdd_5;
463
         }
464
   }
465
 
466
   if((port & 0xFF) == 0x00 && conf.mem_model == MM_QUORUM)
467
   {
468
       comp.p00 = val;
469
       set_banks();
470
       return;
471
   }
472
 
473
   #ifdef MOD_VID_VD
474
   if ((unsigned char)port == 0xDF)
475
   {
476
       comp.pVD = val;
477
       comp.vdbase = (comp.pVD & 4)? vdmem[comp.pVD & 3] : 0;
478
       return;
479
   }
480
   #endif
481
 
482
   // port #FE
483
   bool pFE;
484
 
485
   // scorp  xx1xxx10 /dos=1 (sc16 green)
800 DimkaM 486
   if((conf.mem_model == MM_SCORP || conf.mem_model == MM_PROFSCORP))
487
       pFE = ((port & 0x23) == (0xFE & 0x23)) && !(comp.flags & CF_DOSPORTS);
716 lvd 488
   else if(conf.mem_model == MM_QUORUM) // 1xx11xx0
489
       pFE = ((port & 0x99) == (0xFE & 0x99));
490
   else // others xxxxxxx0
491
       pFE = !(port & 1);
492
 
493
   if (pFE)
494
   {
495
//[vv]      assert(!(val & 0x08));
496
 
497
      spkr_dig = (val & 0x10) ? conf.sound.beeper_vol : 0;
498
      mic_dig = (val & 0x08) ? conf.sound.micout_vol : 0;
499
 
500
      // speaker & mic
501
      if ((comp.pFE ^ val) & 0x18)
502
      {
503
//          __debugbreak();
504
          flush_dig_snd();
505
      }
506
 
507
 
508
      unsigned char new_border = (val & 7);
509
      if (conf.mem_model == MM_ATM710 || conf.mem_model == MM_ATM3 || conf.mem_model == MM_ATM450)
730 lvd 510
          new_border |= ((port & 8) ^ 8);
716 lvd 511
      if (comp.border_attr ^ new_border)
512
          update_screen();
513
      comp.border_attr = new_border;
514
 
515
      if (conf.mem_model == MM_ATM450)
516
          set_atm_aFE((unsigned char)port);
517
 
518
      if (conf.mem_model == MM_PROFI)
519
      {
520
        if(!(port & 0x80) && (comp.pDFFD & 0x80))
521
        {
784 DimkaM 522
          profi_writepal(u8(~(port >> 8)));
716 lvd 523
        }
524
      }
525
 
526
      comp.pFE = val;
527
      // do not return! intro to navy seals (by rst7) uses out #FC for to both FE and 7FFD
528
   }
529
 
530
   // #xD
531
   if (!(port & 2))
532
   {
533
 
534
      if (conf.sound.covoxDD && (unsigned char)port == 0xDD)
535
      { // port DD - covox
536
//         __debugbreak();
537
         flush_dig_snd();
538
         covDD_vol = val*conf.sound.covoxDD_vol/0x100;
539
         return;
540
      }
541
 
542
      if (!(port & 0x8000)) // zx128 port
543
      {
800 DimkaM 544
         // 0001xxxxxxxxxx0x (bcig4) // 1FFD
545
         // 0010xxxxxxxxxx0x (bcig4) // 2FFD
546
         // 0011xxxxxxxxxx0x (bcig4) // 3FFD
547
          if((port & (3 << 14)) == 0 && conf.mem_model == MM_PLUS3)
548
          {
549
              unsigned Idx = (port >> 12) & 3;
550
              switch(Idx)
551
              {
552
              case 1: // 1FFD
553
                  goto set1FFD;
554
              case 3: // 3FFD
555
                  Upd765.out(val);
556
                  return;
557
              }
558
          }
716 lvd 559
 
560
         if ((port & 0xC003) == (0x1FFD & 0xC003) && conf.mem_model == MM_KAY)
561
             goto set1FFD;
562
 
563
         // 00xxxxxxxx1xxx01 (sc16 green)
564
         if ((port & 0xC023) == (0x1FFD & 0xC023) && (conf.mem_model == MM_SCORP || conf.mem_model == MM_PROFSCORP))
565
         {
566
set1FFD:
567
            comp.p1FFD = val;
568
            set_banks();
569
            return;
570
         }
571
 
572
         // gmx
573
         if(port == 0x7EFD && conf.mem_model == MM_PROFSCORP)
574
         {
575
            comp.p7EFD = val;
576
            set_banks();
577
            return;
578
         }
579
 
580
         if (conf.mem_model == MM_ATM450 && (port & 0x8202) == (0x7DFD & 0x8202))
581
         {
582
             atm_writepal(val);
583
             return;
584
         }
585
 
586
         // if (conf.mem_model == MM_ATM710 && (port & 0x8202) != (0x7FFD & 0x8202)) return; // strict 7FFD decoding on ATM-2
587
 
588
         // 01xxxxxxxx1xxx01 (sc16 green)
589
         if ((port & 0xC023) != (0x7FFD & 0xC023) && (conf.mem_model == MM_SCORP || conf.mem_model == MM_PROFSCORP))
590
             return;
591
         // 0xxxxxxxxxx11x0x
592
         if ((port & 0x801A) != (0x7FFD & 0x801A) && (conf.mem_model == MM_QUORUM))
593
             return;
594
 
595
         // 7FFD
596
         if (comp.p7FFD & 0x20)
597
         { // 48k lock
598
            // #EFF7.2 forces lock
599
            if ((comp.pEFF7 & EFF7_LOCKMEM) && conf.mem_model == MM_PENTAGON && conf.ramsize == 1024)
600
                return;
601
 
730 lvd 602
                        if ((comp.pEFF7 & EFF7_LOCKMEM) && conf.mem_model == MM_ATM3) // lvd added eff7 to atm3
603
                                return;
604
 
605
 
606
            // if not pentagon-1024 or pentevo (atm3) --(added by lvd)-- or profi with #DFFD.4 set, apply lock
716 lvd 607
            if (!((conf.ramsize == 1024 && conf.mem_model == MM_PENTAGON) ||
730 lvd 608
                              (conf.mem_model == MM_ATM3)                             ||
716 lvd 609
                  (conf.mem_model == MM_PROFI && (comp.pDFFD & 0x10)))) // molodcov_alex
610
                return;
611
         }
612
 
613
         if ((comp.p7FFD ^ val) & 0x08)
614
             update_screen();
615
 
616
         comp.p7FFD = val;
617
         set_banks();
618
         return;
619
      }
620
 
621
      // xx0xxxxxxxxxxx0x (3.2) [vv]
622
      if ((port & 0x2002) == (0xDFFD & 0x2002) && conf.mem_model == MM_PROFI)
623
      {
624
          comp.pDFFD = val;
625
          set_banks();
626
          return;
627
      }
628
 
629
      if (conf.mem_model == MM_ATM450 && (port & 0x8202) == (0xFDFD & 0x8202))
630
      {
631
          comp.pFDFD = val;
632
          set_banks();
633
          return;
634
      }
635
 
636
      // 1x0xxxxxxxx11x0x
637
      if ((port & 0xA01A) == (0x80FD & 0xA01A) && conf.mem_model == MM_QUORUM)
638
      {
639
          comp.p80FD = val;
640
          set_banks();
641
          return;
642
      }
643
 
800 DimkaM 644
      if ((port & 0xC0FF) == 0xC0FD && conf.sound.ay_scheme >= AY_SCHEME_SINGLE)
716 lvd 645
      { // A15=A14=1, FxFD - AY select register
745 DimkaM 646
         if ((conf.sound.ay_scheme == AY_SCHEME_CHRV) && ((val & 0xF0) == 0xF0)) //Alone Coder
716 lvd 647
         {
745 DimkaM 648
            if (conf.sound.ay_chip == (SNDCHIP::CHIP_YM2203))
877 DimkaM 649
             {
650
                                 comp.tfmstat = val;
651
                 fmsoundon0 = val & 4;
652
                 tfmstatuson0 = val & 2;
653
             } //Alone Coder 0.36.6
745 DimkaM 654
            comp.active_ay = val & 1;
655
                        return;
716 lvd 656
         };
745 DimkaM 657
                 if((conf.sound.saa1099 == SAA_TFM_PRO)&&((comp.tfmstat&CF_TFM_SAA)==0)){
658
                    Saa1099.WrCtl(val);
659
                 }else{
660
            unsigned n_ay = (conf.sound.ay_scheme == AY_SCHEME_QUADRO)? (port >> 12) & 1 : comp.active_ay;
661
            ay[n_ay].select(val);
662
                 }
716 lvd 663
         return;
664
      }
665
 
666
      if ((port & 0xC000)==0x8000 && conf.sound.ay_scheme)
667
      {  // BFFD - AY data register
745 DimkaM 668
                 if((conf.sound.saa1099 == SAA_TFM_PRO)&&((comp.tfmstat&CF_TFM_SAA)==0)){
669
                    Saa1099.WrData(temp.sndblock ? 0 : cpu.t, val);
670
                 }else{
671
                    unsigned n_ay = (conf.sound.ay_scheme == AY_SCHEME_QUADRO)? (port >> 12) & 1 : comp.active_ay;
672
            ay[n_ay].write(temp.sndblock? 0 : cpu.t, val);
673
            if (conf.input.mouse == 2 && ay[n_ay].get_activereg() == 14)
674
                input.aymouse_wr(val);
675
                 }
716 lvd 676
         return;
677
      }
678
      return;
679
   }
680
 
681
   if (conf.sound.sd && (port & 0xAF) == 0x0F)
682
   { // soundrive
683
//      __debugbreak();
684
      if ((unsigned char)port == 0x0F) comp.p0F = val;
685
      if ((unsigned char)port == 0x1F) comp.p1F = val;
686
      if ((unsigned char)port == 0x4F) comp.p4F = val;
687
      if ((unsigned char)port == 0x5F) comp.p5F = val;
688
      flush_dig_snd();
689
      sd_l = (conf.sound.sd_vol * (comp.p0F+comp.p1F)) >> 8;
690
      sd_r = (conf.sound.sd_vol * (comp.p4F+comp.p5F)) >> 8;
691
      return;
692
   }
693
   if (conf.sound.covoxFB && !(port & 4))
694
   { // port FB - covox
695
//      __debugbreak();
696
      flush_dig_snd();
697
      covFB_vol = val*conf.sound.covoxFB_vol/0x100;
698
      return;
699
   }
700
 
745 DimkaM 701
   if (conf.sound.saa1099 == SAA_ZXM && ((port & 0xFF) == 0xFF)) // saa1099
716 lvd 702
   {
703
       if(port & 0x100)
704
           Saa1099.WrCtl(val);
705
       else
706
           Saa1099.WrData(temp.sndblock? 0 : cpu.t, val);
707
       return;
708
   }
709
 
791 DimkaM 710
   if( (port == 0xEFF7) && ( (conf.mem_model==MM_PENTAGON) || (conf.mem_model==MM_ATM3)
711
           || conf.mem_model == MM_ATM710 ) ) // lvd added eff7 to atm3
716 lvd 712
   {
713
      unsigned char oldpEFF7 = comp.pEFF7; //Alone Coder 0.36.4
714
      comp.pEFF7 = (comp.pEFF7 & conf.EFF7_mask) | (val & ~conf.EFF7_mask);
791 DimkaM 715
          if(conf.mem_model == MM_ATM710)
716
                  return;
716 lvd 717
      comp.pEFF7 |= EFF7_GIGASCREEN; // [vv] disable turbo
718
//    if ((comp.pEFF7 ^ oldpEFF7) & EFF7_GIGASCREEN) {
719
//      conf.frame = frametime;
720
//      if ((conf.mem_model == MM_PENTAGON)&&(comp.pEFF7 & EFF7_GIGASCREEN))conf.frame = 71680;
721
//      apply_sound();
722
//    } //Alone Coder removed 0.37.1
723
 
724
      if (!(comp.pEFF7 & EFF7_4BPP))
725
      {
726
          temp.offset_vscroll = 0;
727
          temp.offset_vscroll_prev = 0;
728
          temp.offset_hscroll = 0;
729
          temp.offset_hscroll_prev = 0;
730
      }
731
 
732
      if ((comp.pEFF7 ^ oldpEFF7) & (EFF7_ROCACHE | EFF7_LOCKMEM))
733
          set_banks(); //Alone Coder 0.36.4
734
      return;
735
   }
791 DimkaM 736
   if (conf.cmos && (((comp.pEFF7 & EFF7_CMOS) &&
737
                (conf.mem_model == MM_PENTAGON || conf.mem_model == MM_ATM710)) ||
738
                conf.mem_model == MM_ATM3))
716 lvd 739
   {
784 DimkaM 740
      unsigned mask = (conf.mem_model == MM_ATM3 && (comp.flags & CF_DOSPORTS)) ? ~0x100U : 0xFFFF;
716 lvd 741
 
742
      if (port == (0xDFF7 & mask))
743
      {
744
          comp.cmos_addr = val;
745
          return;
746
      }
747
      if (port == (0xBFF7 & mask))
748
      {
847 DimkaM 749
             /*if (comp.cmos_addr >= 0xF0 && (val & 0xf0) == 0x10 && conf.mem_model == MM_ATM3){
765 dimkam 750
                        comp.fddIO2Ram_mask=val;
847 DimkaM 751
                 }else */
752
                 if (comp.cmos_addr >= 0xF0 && val <= 2 && conf.mem_model == MM_ATM3)
730 lvd 753
         {//thims added
754
            if (val < 2)
755
            {
756
               input.buffer_enabled = false;
757
               static unsigned version = 0;
758
               if (!version)
759
               {
760
                  unsigned day, year;
761
                  char month[8];
762
                  static const char months[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
763
                  sscanf(__DATE__, "%s %d %d", month, &day, &year);
764
                  version = day | ((strstr(months, month) - months) / 3 + 1) << 5 | (year - 2000) << 9;
765
               }
766
 
767
               strcpy((char*)cmos + 0xF0, "UnrealSpeccy");
768
               *(unsigned*)(cmos + 0xFC) = version;
769
            }
770
            else input.buffer_enabled = true;
771
         }
772
         else cmos_write(val);
773
         return;
716 lvd 774
      }
775
   }
776
   if ((port & 0xF8FF) == 0xF8EF && modem.open_port)
777
       modem.write((port >> 8) & 7, val);
778
}
779
 
780
__inline unsigned char in1(unsigned port)
781
{
782
   port &= 0xFFFF;
783
   brk_port_in = port;
784
 
785
   u8 p1 = (port & 0xFF);
786
 
787
/*
788
   if((port & 0xFF) == 0xF0)
789
       __debugbreak();
790
 
791
   if((comp.flags & CF_DOSPORTS) && port == 0xFADF)
792
       __debugbreak();
793
*/
794
 
795
   //       8
784 DimkaM 796
 
797
   if(conf.ula_plus && port == 0xFF3B)
798
   {
799
       if(comp.ula_plus_group == 0)
800
       {
801
           return comp.comp_pal[comp.ula_plus_pal_idx];
802
       }
803
 
804
       if(comp.ula_plus_group == 1)
805
       {
806
           u8 val = comp.ula_plus_en ? 1 : 0;
807
           return val;
808
       }
809
       return 0xFF;
810
   }
811
 
716 lvd 812
   // ngs
813
   #ifdef MOD_GS
814
   if ((port & 0xF7) == 0xB3 && conf.gs_type)
784 DimkaM 815
       return in_gs(p1);
716 lvd 816
   #endif
817
 
818
   // z-controller
730 lvd 819
   if (conf.zc && (port & 0xFF) == 0x57)
820
   {
821
      // no shadow-mode ZXEVO patch here since 0x57 port in read mode is the same
822
          // as in noshadow-mode, i.e. no A15 is used to decode port.
823
      return Zc.Rd(port);
824
   }
819 DimkaM 825
 
826
   if(conf.wiznet && (port & 0xff) == 0xab ){
827
       return pXXAB_Read(port);
828
   }
716 lvd 829
 
830
   if(conf.mem_model == MM_ATM3)
831
   {
832
       //   3
833
       if((port & 0xFF) == 0xBF)
834
           return comp.pBF;
835
 
873 DimkaM 836
       if(((port & 0xFF) == 0xBE) || ((port & 0xFF) == 0xBD))
716 lvd 837
       {
838
           u8 port_hi = (port >> 8) & 0xFF;
839
           if((port_hi & ~7) == 0) //     
840
           {
841
               unsigned PgIdx = port_hi & 7;
842
               return (comp.pFFF7[PgIdx] & 0xFF) ^ 0xFF;
843
           }
844
 
845
           switch(port_hi)
846
           {
847
           case 0x8: // ram/rom
848
           {
849
               u8 RamRomMask = 0;
850
               for(unsigned i = 0; i < 8; i++)
851
                   RamRomMask |= ((comp.pFFF7[i] >> 8) & 1) << i;
852
               return ~RamRomMask;
853
           }
854
           case 0x9: //dos7ffd
855
           {
856
               u8 RamRomMask = 0;
857
               for(unsigned i = 0; i < 8; i++)
858
                   RamRomMask |= ((comp.pFFF7[i] >> 9) & 1) << i;
859
               return ~RamRomMask;
860
           }
861
           case 0xA: return comp.p7FFD;
730 lvd 862
           case 0xB: return comp.pEFF7; // lvd - added EFF7 reading in pentevo (atm3)
863
 
864
           // lvd: fixed bug with no-anding bits from aFF77, added CF_TRDOS to bit 4
865
                   // lvd: changed bit 4 to dos state, remembered during nmi
866
           case 0xC: return (((comp.aFF77 >> 14) << 7) & 0x0080) | (((comp.aFF77 >> 9) << 6) & 0x0040) | (((comp.aFF77 >> 8) << 5) & 0x0020) | (/*(comp.flags & CF_TRDOS)*/trdos_in_nmi?0x0010:0) | (comp.pFF77 & 0xF);
716 lvd 867
           case 0xD: return atm_readpal();
730 lvd 868
                   case 0xE: return zxevo_readfont();
869
 
870
                   // breakpoint address readback
871
                   case 0x10: return comp.brk_addr&0x00FF;
872
                   case 0x11: return (comp.brk_addr>>8)&0x00FF;
779 dimkam 873
 
873 DimkaM 874
                   //read fddIO2Ram_mask
875
                   case 0x13: return comp.fddIO2Ram_mask;
876
 
779 dimkam 877
                   //read scanline
873 DimkaM 878
                   case 0x14: return ((cpu.t / 224)>>1)&0x00FF;
779 dimkam 879
 
716 lvd 880
           }
881
       }
882
   }
883
 
884
   // divide  nemo 
885
   if(conf.ide_scheme == IDE_NEMO_DIVIDE)
886
   {
887
       if(((port & 0x1E) == 0x10)) // rrr1000x
888
       {
889
           if((port & 0xFF) == 0x11)
890
           {
891
               comp.ide_hi_byte_r = 0;
892
               return comp.ide_read;
893
           }
894
 
895
           if((port & 0xFE) == 0x10)
896
           {
897
               comp.ide_hi_byte_r ^= 1;
898
               if(!comp.ide_hi_byte_r)
899
               {
900
                   return comp.ide_read;
901
               }
902
           }
903
           else
904
           {
905
               comp.ide_hi_byte_r = 0;
906
           }
907
           goto read_hdd_5;
908
       }
909
       else if((port & 0xFF) == 0xC8)
910
       {
911
        return hdd.read(8);
912
       }
913
   }
914
 
915
   // quorum additional keyboard port
916
   if((conf.mem_model == MM_QUORUM) && ((port & 0xFF) == 0x7E))
917
   {
784 DimkaM 918
      u8 val = input.read_quorum(u8(port >> 8));
716 lvd 919
      return val;
920
   }
921
 
922
   if (comp.flags & CF_DOSPORTS)
923
   {
730 lvd 924
      if(conf.mem_model == MM_ATM3 && (p1 & 0x1F) == 0x0F && !(((p1 >> 5) - 1) & 4))
716 lvd 925
      {
926
          // 2F = 001|01111b
927
          // 4F = 010|01111b
928
          // 6F = 011|01111b
929
          // 8F = 100|01111b
759 dimkam 930
                  return comp.wd_shadow[(p1 >> 5) - 1];
931
 
932
     }
730 lvd 933
 
716 lvd 934
 
935
      if (conf.ide_scheme == IDE_ATM && (port & 0x1F) == 0x0F)
936
      {
937
         if (port & 0x100)
938
             return comp.ide_read;
939
      read_hdd_5:
940
         port >>= 5;
941
      read_hdd:
942
         port &= 7;
943
         if (port)
944
             return hdd.read(port);
945
         unsigned v = hdd.read_data();
946
         comp.ide_read = (unsigned char)(v >> 8);
947
         return (unsigned char)v;
948
      }
949
 
950
      if ((port & 0x18A3) == (0xFFFE & 0x18A3))
951
      { // SMUC
952
         if (conf.smuc)
953
         {
954
            if ((port & 0xA044) == (0xDFBA & 0xA044)) return cmos_read(); // clock
955
            if ((port & 0xA044) == (0xFFBA & 0xA044)) return comp.nvram.out; // SMUC system port
956
            if ((port & 0xA044) == (0x7FBA & 0xA044)) return comp.p7FBA | 0x3F;
957
            if ((port & 0xA044) == (0x5FBA & 0xA044)) return 0x3F;
958
            if ((port & 0xA044) == (0x5FBE & 0xA044)) return 0x57;
959
            if ((port & 0xA044) == (0x7FBE & 0xA044)) return 0x57;
960
         }
961
         if ((port & 0x8044) == (0xFFBE & 0x8044) && conf.ide_scheme == IDE_SMUC)
962
         { // FFBE, FEBE
963
            if(comp.pFFBA & 0x80)
964
            {
965
                if(!(port & 0x100))
966
                    return hdd.read(8); // alternate status
967
                return 0xFF; // obsolete register
968
            }
969
 
970
            if (!(port & 0x2000))
971
                return comp.ide_read;
972
            port >>= 8;
973
            goto read_hdd;
974
         }
975
      }
976
 
977
      if (conf.mem_model == MM_PROFI) // molodcov_alex
978
      {
979
          if((comp.p7FFD & 0x10) && (comp.pDFFD & 0x20))
980
          { // modified ports
981
            // BDI ports
982
            if((p1 & 0x9F) == 0x83)
983
                return comp.wd.in((p1 & 0x60) | 0x1F);  // WD93 ports (1F, 3F, 7F)
984
            if((p1 & 0xE3) == 0x23)
985
                return comp.wd.in(0xFF);                // port FF
986
 
987
            // RTC
988
            if((port & 0x9F) == 0x9F && conf.cmos)
989
            {
990
                if(!(port & 0x20))
991
                    return cmos_read();
992
            }
993
 
994
            // IDE
995
            if((p1 & 0x9F) == 0x8B && (conf.ide_scheme == IDE_PROFI))
996
            {
997
                if(p1 & 0x40) // cs1
998
                {
999
                    if (p1 & 0x20)
1000
                        return comp.ide_read;
1001
                    port >>= 8;
1002
                    goto read_hdd;
1003
                }
1004
            }
1005
          }
1006
          else
1007
          {
1008
              // BDI ports
1009
              if((p1 & 0x83) == 0x03)
1010
                  return comp.wd.in((p1 & 0x60) | 0x1F);  // WD93 ports
1011
              if((p1 & 0xE3) == ((comp.pDFFD & 0x20) ? 0xA3 : 0xE3))
1012
                  return comp.wd.in(0xFF);                // port FF
1013
          }
1014
      }
1015
 
1016
      if(conf.mem_model == MM_QUORUM /* && !(comp.p00 & Q_TR_DOS) */) // cpm ports
1017
      {
1018
          if((p1 & 0xFC) == 0x80) // 80, 81, 82, 83
1019
          {
784 DimkaM 1020
              p1 = u8(((p1 & 3) << 5) | 0x1F);
716 lvd 1021
              return comp.wd.in(p1);
1022
          }
1023
      }
1024
          // 1F = 0001|1111b
1025
          // 3F = 0011|1111b
1026
          // 5F = 0101|1111b
1027
          // 7F = 0111|1111b
1028
          // DF = 1101|1111b  
1029
          // FF = 1111|1111b
759 dimkam 1030
      else if ((p1 & 0x9F) == 0x1F || p1 == 0xFF) {// 1F, 3F, 5F, 7F, FF
765 dimkam 1031
                  if((comp.flags & CF_TRDOS)&&conf.trdos_IORam
874 dimkam 1032
                                &&((1<<comp.wd.drive)&comp.fddIO2Ram_mask)&&(bankr[0]==base_dos_rom)){
759 dimkam 1033
                      cpu.nmi_in_progress=conf.trdos_IORam;
1034
                          trdos_in_nmi = comp.flags&CF_TRDOS;
1035
                          set_banks();
1036
                          return 0xff;
1037
                  }else{
873 DimkaM 1038
                      if(conf.trdos_IORam && (p1&0x80)) return (comp.wd.in(p1) & 0xE0) | comp.trdos_last_ff;
1039
                          return comp.wd.in(p1);
759 dimkam 1040
                  }
1041
          }
716 lvd 1042
   }
1043
   else //  dos
1044
   {
1045
       if(((port & 0xA3) == 0xA3) && (conf.ide_scheme == IDE_DIVIDE))
1046
       {
1047
           if((port & 0xFF) == 0xA3)
1048
           {
1049
               comp.ide_hi_byte_r ^= 1;
1050
               if(!comp.ide_hi_byte_r)
1051
               {
1052
                   return comp.ide_read;
1053
               }
1054
           }
1055
           else
1056
           {
1057
               comp.ide_hi_byte_r = 0;
1058
           }
1059
           port >>= 2;
1060
           goto read_hdd;
1061
       }
1062
 
1063
 
1064
       if (!(port & 6) && (conf.ide_scheme == IDE_NEMO || conf.ide_scheme == IDE_NEMO_A8))
1065
       {
1066
          unsigned hi_byte = (conf.ide_scheme == IDE_NEMO)? (port & 1) : (port & 0x100);
1067
          if(hi_byte)
1068
              return comp.ide_read;
1069
          comp.ide_read = 0xFF;
1070
          if((port & 0x18) == 0x08)
1071
              return ((port & 0xE0) == 0xC0)? hdd.read(8) : 0xFF; // CS1=0,CS0=1,reg=6
1072
          if((port & 0x18) != 0x10)
1073
              return 0xFF; // invalid CS0,CS1
1074
          goto read_hdd_5;
1075
       }
1076
   }
1077
 
1078
 
730 lvd 1079
 
1080
 
1081
   if (!(port & 0x20))
716 lvd 1082
   { // kempstons
1083
      port = (port & 0xFFFF) | 0xFA00; // A13,A15 not used in decoding
1084
      if ((port == 0xFADF || port == 0xFBDF || port == 0xFFDF) && conf.input.mouse == 1)
1085
      { // mouse
1086
         input.mouse_joy_led |= 1;
1087
         if (port == 0xFBDF)
1088
             return input.kempston_mx();
1089
         if (port == 0xFFDF)
1090
             return input.kempston_my();
1091
         return input.mbuttons;
1092
      }
1093
      input.mouse_joy_led |= 2;
1094
      unsigned char res = (conf.input.kjoy)? input.kjoy : 0xFF;
1095
      if (conf.mem_model == MM_SCORP || conf.mem_model == MM_PROFSCORP)
1096
         res = (res & 0x1F) | (comp.wd.in(0xFF) & 0xE0);
1097
      return res;
1098
   }
1099
 
784 DimkaM 1100
   // fuller joystick
1101
   if((p1 == 0x7F) && conf.input.fjoy)
1102
   {
1103
       input.mouse_joy_led |= 2;
1104
       return  input.fjoy;
1105
   }
1106
 
716 lvd 1107
   // port #FE
1108
   bool pFE;
1109
 
1110
   // scorp  xx1xxx10 (sc16)
800 DimkaM 1111
   if((conf.mem_model == MM_SCORP || conf.mem_model == MM_PROFSCORP))
1112
       pFE = ((port & 0x23) == (0xFE & 0x23)) && !(comp.flags & CF_DOSPORTS);
716 lvd 1113
   else if(conf.mem_model == MM_QUORUM) // 1xx11xx0
1114
       pFE = ((port & 0x99) == (0xFE & 0x99));
1115
   else // others xxxxxxx0
1116
       pFE = !(port & 1);
1117
 
1118
   if (pFE)
1119
   {
784 DimkaM 1120
      if ((cpu.pc & 0xFFFF) == 0x0564 && bankr[0][0x0564]==0x1F && conf.tape_autostart && comp.tape.stopped)
716 lvd 1121
          start_tape();
784 DimkaM 1122
      u8 val = input.read(u8(port >> 8));
716 lvd 1123
      if (conf.mem_model == MM_ATM450)
1124
          val = (val & 0x7F) | atm450_z(cpu.t);
1125
      return val;
1126
   }
1127
 
1128
   if ((port & 0x8202) == (0x7FFD & 0x8202) && (conf.mem_model == MM_ATM710 || conf.ide_scheme == IDE_ATM))
1129
   { // ATM-2 IDE+DAC/ADC
1130
      unsigned char irq = 0x40;
1131
      if (conf.ide_scheme == IDE_ATM) irq = (hdd.read_intrq() & 0x40);
1132
      return irq + 0x3F;
1133
   }
1134
 
800 DimkaM 1135
   // 0001xxxxxxxxxx0x (bcig4) // 1FFD
1136
   // 0010xxxxxxxxxx0x (bcig4) // 2FFD
1137
   // 0011xxxxxxxxxx0x (bcig4) // 3FFD
1138
   if((port & ((3 << 14) | 2)) == 0 && conf.mem_model == MM_PLUS3)
716 lvd 1139
   {
800 DimkaM 1140
       unsigned Idx = (port >> 12) & 3;
1141
       switch(Idx)
1142
       {
1143
       case 2: // 2FFD
1144
           return Upd765.in(Idx);
1145
       case 3: // 3FFD
1146
           return Upd765.in(Idx);
1147
       }
1148
   }
1149
 
1150
   if ((unsigned char)port == 0xFD && conf.sound.ay_scheme >= AY_SCHEME_SINGLE)
1151
   {
877 DimkaM 1152
      if((conf.sound.ay_scheme == AY_SCHEME_CHRV) && (conf.sound.ay_chip == (SNDCHIP::CHIP_YM2203)) && (tfmstatuson0 == 0))
716 lvd 1153
          return 0x7f /*always ready*/; //Alone Coder 0.36.6
1154
      if ((port & 0xC0FF) != 0xC0FD) return 0xFF;
1155
      unsigned n_ay = (conf.sound.ay_scheme == AY_SCHEME_QUADRO)? (port >> 12) & 1 : comp.active_ay;
1156
      // else FxFD - read selected AY register
1157
      if (conf.input.mouse == 2 && ay[n_ay].get_activereg() == 14) { input.mouse_joy_led |= 1; return input.aymouse_rd(); }
1158
      return ay[n_ay].read();
1159
   }
1160
 
1161
//   if ((port & 0x7F) == 0x7B) { // FB/7B
1162
   if ((port & 0x04) == 0x00)
1163
   { // FB/7B //Alone Coder 0.36.6 (for MODPLAYi)
1164
      if (conf.mem_model == MM_ATM450)
1165
      {
1166
         comp.aFB = (unsigned char)port;
1167
         set_banks();
1168
      }
1169
      else if (conf.cache)
1170
      {
1171
         comp.flags &= ~CF_CACHEON;
1172
         if (port & 0x80) comp.flags |= CF_CACHEON;
1173
         set_banks();
1174
      }
1175
      return 0xFF;
1176
   }
1177
 
791 DimkaM 1178
   if (conf.cmos && ((comp.pEFF7 & EFF7_CMOS) || conf.mem_model == MM_ATM3 || conf.mem_model == MM_ATM710))
716 lvd 1179
   {
784 DimkaM 1180
      unsigned mask = (conf.mem_model == MM_ATM3 && (comp.flags & CF_DOSPORTS)) ? ~0x100U : 0xFFFF;
716 lvd 1181
      if(port == (0xBFF7 & mask))
1182
          return cmos_read();
1183
   }
1184
 
1185
   if ((port & 0xF8FF) == 0xF8EF && modem.open_port)
1186
       return modem.read((port >> 8) & 7);
1187
 
1188
   if (conf.portff && ((port & 0xFF) == 0xFF))
1189
   {
1190
      update_screen();
1191
      if (vmode != 2) return 0xFF; // ray is not in paper
1192
      unsigned ula_t = (cpu.t+temp.border_add) & temp.border_and;
1193
      return temp.base[vcurr->atr_offs + (ula_t - vcurr[-1].next_t)/4];
1194
   }
1195
   return 0xFF;
1196
}
1197
 
1198
unsigned char in(unsigned port)
1199
{
1200
   brk_port_val = in1(port);
1201
   return brk_port_val;
1202
}
1203
 
1204
#undef in_trdos
1205
#undef out_trdos