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