ports.cpp
 1  /* ports.c - handles port I/O for Fake86 CPU core. it's ugly, will fix up later. */
 2  
 3  #include <stdint.h>
 4  #include "emu.h"
 5  
 6  volatile uint16_t pit0counter = 65535;
 7  volatile uint32_t speakercountdown, latch42, pit0latch, pit0command, pit0divisor;
 8  uint8_t portram[0x400];
 9  uint8_t crt_controller_idx, crt_controller[256], port3D9 = 0;
10  
11  void portout(uint16_t portnum, uint16_t value) {
12    if (portnum < 0x400) portram[portnum] = value;
13    switch (portnum) {
14      case 0x20:
15      case 0x21: //i8259
16        out8259(portnum, value);
17        return;
18      case 0x40:
19      case 0x41:
20      case 0x42:
21      case 0x43: //i8253
22        out8253(portnum, value);
23        break;
24      case 0x3D4:
25        crt_controller_idx = value;
26        break;
27      case 0x3D5:
28        crt_controller[crt_controller_idx] = value;
29        if ((crt_controller_idx == 0x0E) || (crt_controller_idx == 0x0F)) {
30          //setcursor(((uint16_t)crt_controller[0x0E] << 8) | crt_controller[0x0F]);
31          //Serial.write(27); Serial.write('['); Serial.print(crt_controller[0x0E] + 1); Serial.write(';'); Serial.print(crt_controller[0x0F] + 1); Serial.write('H');
32        }
33        break;
34      case 0x3D9:
35        port3D9 = value;
36        break;
37    }
38  
39  #ifdef ADVANCED_CLIENT
40    if ((portnum >= 0x3C0) && (portnum <= 0x3DA)) {
41      uint8_t chksum;
42      Serial.write(0xFF);
43      Serial.write(0x04);
44      outByte(portnum & 0xFF); chksum = portnum & 0xFF;
45      outByte(portnum >> 8); chksum += portnum >> 8;
46      outByte(value); chksum += value;
47      outByte(chksum);
48      Serial.write(0xFE);
49      Serial.write(0x02);
50    }
51  #endif
52  
53  #ifdef VGA
54    if ((portnum >= 0x3C0) && (portnum <= 0x3DA)) outVGA(portnum, value);
55  #endif
56  }
57  
58  uint16_t portin(uint16_t portnum) {
59  #ifdef VGA
60    if ((portnum >= 0x3C0) && (portnum <= 0x3DA)) return inVGA(portnum);
61  #endif
62  /*  uint8_t chksum;
63    Serial.write(0xFF);
64    Serial.write(0x07);
65    outByte(portnum & 0xFF); chksum = portnum & 0xFF;
66    outByte((portnum >> 8) & 0xFF); chksum += (portnum >> 8) & 0xFF;
67    outByte(chksum);
68    Serial.write(0xFE);
69    Serial.write(0x02);*/
70    switch (portnum) {
71      case 0x20:
72      case 0x21: //i8259
73        return (in8259(portnum));
74      case 0x40:
75      case 0x41:
76      case 0x42:
77      case 0x43: //i8253
78        return in8253(portnum);
79      case 0x60:
80      case 0x64:
81        return portram[portnum];
82      case 0x3D4:
83        return crt_controller_idx;
84        break;
85      case 0x3D5:
86        return crt_controller[crt_controller_idx];
87        break;
88      case 0x3DA:
89        port3da ^= 1;
90        if (!(port3da & 1)) port3da ^= 8;
91        //port3da = random(256) & 9;
92        return (port3da);
93      default:
94        return (0xFF);
95    }
96  }
97  
98