using System; using System.Collections.Generic; using System.Linq; using System.Text; using Indy.IL2CPU.IL.X86.CustomImplementations.System; namespace Indy.IL2CPU.IL.X86.Native.CustomImplementations.System { public static class ConsoleImpl { public const int Columns = 80; public const int Lines = 24; public const int Attribute = 7; public const int VideoAddr = 0xB8000; private static int mCurrentLine = 0; private static int mCurrentChar = 0; private static unsafe void MoveLinesUp() { for (int i = 0; i < Columns * (Lines - 1); i++) { byte* xScreenPtr = (byte*)(VideoAddr + (i* 2)); *xScreenPtr = *(xScreenPtr + (Columns * 2)); xScreenPtr += 1; *xScreenPtr = *(xScreenPtr + (Columns * 2)); } for(int i = 0; i < Columns;i++) { byte* xScreenPtr = (byte*)(VideoAddr + (i + Lines * Columns) * 2); *xScreenPtr = 0; xScreenPtr += 1; *xScreenPtr = 0; } } public static unsafe void Clear() { for (int i = 0; i < Columns * Lines * 2; i++) { byte* xScreenPtr = (byte*)VideoAddr; xScreenPtr += i; *xScreenPtr = 0; } mCurrentLine = 0; mCurrentChar = 0; } private unsafe static void PutChar(int aLine, int aPos, byte aChar) { int xScreenOffset = ((aPos + aLine * 80) * 2); byte* xScreenPtr = (byte*)((0xB8000) + xScreenOffset); byte xVal = aChar; *xScreenPtr = xVal; xScreenPtr += 1; *xScreenPtr = 7; } public static void OutputBytes(byte[] aBytes) { for (int i = 0; i < aBytes.Length; i++) { OutputByte(aBytes[i]); } } public static void OutputByteValue(byte aByte) { switch (aByte) { case 0: OutputString("0x00"); break; case 1: OutputString("0x01"); break; case 2: OutputString("0x02"); break; case 3: OutputString("0x03"); break; case 4: OutputString("0x04"); break; case 5: OutputString("0x05"); break; case 6: OutputString("0x06"); break; case 7: OutputString("0x07"); break; case 8: OutputString("0x08"); break; case 9: OutputString("0x09"); break; case 10: OutputString("0x0A"); break; case 11: OutputString("0x0B"); break; case 12: OutputString("0x0C"); break; case 13: OutputString("0x0D"); break; case 14: OutputString("0x0E"); break; case 15: OutputString("0x0F"); break; case 16: OutputString("0x10"); break; case 17: OutputString("0x11"); break; case 18: OutputString("0x12"); break; case 19: OutputString("0x13"); break; case 20: OutputString("0x14"); break; case 21: OutputString("0x15"); break; case 22: OutputString("0x16"); break; case 23: OutputString("0x17"); break; case 24: OutputString("0x18"); break; case 25: OutputString("0x19"); break; case 26: OutputString("0x1A"); break; case 27: OutputString("0x1B"); break; case 28: OutputString("0x1C"); break; case 29: OutputString("0x1D"); break; case 30: OutputString("0x1E"); break; case 31: OutputString("0x1F"); break; case 32: OutputString("0x20"); break; case 33: OutputString("0x21"); break; case 34: OutputString("0x22"); break; case 35: OutputString("0x23"); break; case 36: OutputString("0x24"); break; case 37: OutputString("0x25"); break; case 38: OutputString("0x26"); break; case 39: OutputString("0x27"); break; case 40: OutputString("0x28"); break; case 41: OutputString("0x29"); break; case 42: OutputString("0x2A"); break; case 43: OutputString("0x2B"); break; case 44: OutputString("0x2C"); break; case 45: OutputString("0x2D"); break; case 46: OutputString("0x2E"); break; case 47: OutputString("0x2F"); break; case 48: OutputString("0x30"); break; case 49: OutputString("0x31"); break; case 50: OutputString("0x32"); break; case 51: OutputString("0x33"); break; case 52: OutputString("0x34"); break; case 53: OutputString("0x35"); break; case 54: OutputString("0x36"); break; case 55: OutputString("0x37"); break; case 56: OutputString("0x38"); break; case 57: OutputString("0x39"); break; case 58: OutputString("0x3A"); break; case 59: OutputString("0x3B"); break; case 60: OutputString("0x3C"); break; case 61: OutputString("0x3D"); break; case 62: OutputString("0x3E"); break; case 63: OutputString("0x3F"); break; case 64: OutputString("0x40"); break; case 65: OutputString("0x41"); break; case 66: OutputString("0x42"); break; case 67: OutputString("0x43"); break; case 68: OutputString("0x44"); break; case 69: OutputString("0x45"); break; case 70: OutputString("0x46"); break; case 71: OutputString("0x47"); break; case 72: OutputString("0x48"); break; case 73: OutputString("0x49"); break; case 74: OutputString("0x4A"); break; case 75: OutputString("0x4B"); break; case 76: OutputString("0x4C"); break; case 77: OutputString("0x4D"); break; case 78: OutputString("0x4E"); break; case 79: OutputString("0x4F"); break; case 80: OutputString("0x50"); break; case 81: OutputString("0x51"); break; case 82: OutputString("0x52"); break; case 83: OutputString("0x53"); break; case 84: OutputString("0x54"); break; case 85: OutputString("0x55"); break; case 86: OutputString("0x56"); break; case 87: OutputString("0x57"); break; case 88: OutputString("0x58"); break; case 89: OutputString("0x59"); break; case 90: OutputString("0x5A"); break; case 91: OutputString("0x5B"); break; case 92: OutputString("0x5C"); break; case 93: OutputString("0x5D"); break; case 94: OutputString("0x5E"); break; case 95: OutputString("0x5F"); break; case 96: OutputString("0x60"); break; case 97: OutputString("0x61"); break; case 98: OutputString("0x62"); break; case 99: OutputString("0x63"); break; case 100: OutputString("0x64"); break; case 101: OutputString("0x65"); break; case 102: OutputString("0x66"); break; case 103: OutputString("0x67"); break; case 104: OutputString("0x68"); break; case 105: OutputString("0x69"); break; case 106: OutputString("0x6A"); break; case 107: OutputString("0x6B"); break; case 108: OutputString("0x6C"); break; case 109: OutputString("0x6D"); break; case 110: OutputString("0x6E"); break; case 111: OutputString("0x6F"); break; case 112: OutputString("0x70"); break; case 113: OutputString("0x71"); break; case 114: OutputString("0x72"); break; case 115: OutputString("0x73"); break; case 116: OutputString("0x74"); break; case 117: OutputString("0x75"); break; case 118: OutputString("0x76"); break; case 119: OutputString("0x77"); break; case 120: OutputString("0x78"); break; case 121: OutputString("0x79"); break; case 122: OutputString("0x7A"); break; case 123: OutputString("0x7B"); break; case 124: OutputString("0x7C"); break; case 125: OutputString("0x7D"); break; case 126: OutputString("0x7E"); break; case 127: OutputString("0x7F"); break; case 128: OutputString("0x80"); break; case 129: OutputString("0x81"); break; case 130: OutputString("0x82"); break; case 131: OutputString("0x83"); break; case 132: OutputString("0x84"); break; case 133: OutputString("0x85"); break; case 134: OutputString("0x86"); break; case 135: OutputString("0x87"); break; case 136: OutputString("0x88"); break; case 137: OutputString("0x89"); break; case 138: OutputString("0x8A"); break; case 139: OutputString("0x8B"); break; case 140: OutputString("0x8C"); break; case 141: OutputString("0x8D"); break; case 142: OutputString("0x8E"); break; case 143: OutputString("0x8F"); break; case 144: OutputString("0x90"); break; case 145: OutputString("0x91"); break; case 146: OutputString("0x92"); break; case 147: OutputString("0x93"); break; case 148: OutputString("0x94"); break; case 149: OutputString("0x95"); break; case 150: OutputString("0x96"); break; case 151: OutputString("0x97"); break; case 152: OutputString("0x98"); break; case 153: OutputString("0x99"); break; case 154: OutputString("0x9A"); break; case 155: OutputString("0x9B"); break; case 156: OutputString("0x9C"); break; case 157: OutputString("0x9D"); break; case 158: OutputString("0x9E"); break; case 159: OutputString("0x9F"); break; case 160: OutputString("0xA0"); break; case 161: OutputString("0xA1"); break; case 162: OutputString("0xA2"); break; case 163: OutputString("0xA3"); break; case 164: OutputString("0xA4"); break; case 165: OutputString("0xA5"); break; case 166: OutputString("0xA6"); break; case 167: OutputString("0xA7"); break; case 168: OutputString("0xA8"); break; case 169: OutputString("0xA9"); break; case 170: OutputString("0xAA"); break; case 171: OutputString("0xAB"); break; case 172: OutputString("0xAC"); break; case 173: OutputString("0xAD"); break; case 174: OutputString("0xAE"); break; case 175: OutputString("0xAF"); break; case 176: OutputString("0xB0"); break; case 177: OutputString("0xB1"); break; case 178: OutputString("0xB2"); break; case 179: OutputString("0xB3"); break; case 180: OutputString("0xB4"); break; case 181: OutputString("0xB5"); break; case 182: OutputString("0xB6"); break; case 183: OutputString("0xB7"); break; case 184: OutputString("0xB8"); break; case 185: OutputString("0xB9"); break; case 186: OutputString("0xBA"); break; case 187: OutputString("0xBB"); break; case 188: OutputString("0xBC"); break; case 189: OutputString("0xBD"); break; case 190: OutputString("0xBE"); break; case 191: OutputString("0xBF"); break; case 192: OutputString("0xC0"); break; case 193: OutputString("0xC1"); break; case 194: OutputString("0xC2"); break; case 195: OutputString("0xC3"); break; case 196: OutputString("0xC4"); break; case 197: OutputString("0xC5"); break; case 198: OutputString("0xC6"); break; case 199: OutputString("0xC7"); break; case 200: OutputString("0xC8"); break; case 201: OutputString("0xC9"); break; case 202: OutputString("0xCA"); break; case 203: OutputString("0xCB"); break; case 204: OutputString("0xCC"); break; case 205: OutputString("0xCD"); break; case 206: OutputString("0xCE"); break; case 207: OutputString("0xCF"); break; case 208: OutputString("0xD0"); break; case 209: OutputString("0xD1"); break; case 210: OutputString("0xD2"); break; case 211: OutputString("0xD3"); break; case 212: OutputString("0xD4"); break; case 213: OutputString("0xD5"); break; case 214: OutputString("0xD6"); break; case 215: OutputString("0xD7"); break; case 216: OutputString("0xD8"); break; case 217: OutputString("0xD9"); break; case 218: OutputString("0xDA"); break; case 219: OutputString("0xDB"); break; case 220: OutputString("0xDC"); break; case 221: OutputString("0xDD"); break; case 222: OutputString("0xDE"); break; case 223: OutputString("0xDF"); break; case 224: OutputString("0xE0"); break; case 225: OutputString("0xE1"); break; case 226: OutputString("0xE2"); break; case 227: OutputString("0xE3"); break; case 228: OutputString("0xE4"); break; case 229: OutputString("0xE5"); break; case 230: OutputString("0xE6"); break; case 231: OutputString("0xE7"); break; case 232: OutputString("0xE8"); break; case 233: OutputString("0xE9"); break; case 234: OutputString("0xEA"); break; case 235: OutputString("0xEB"); break; case 236: OutputString("0xEC"); break; case 237: OutputString("0xED"); break; case 238: OutputString("0xEE"); break; case 239: OutputString("0xEF"); break; case 240: OutputString("0xF0"); break; case 241: OutputString("0xF1"); break; case 242: OutputString("0xF2"); break; case 243: OutputString("0xF3"); break; case 244: OutputString("0xF4"); break; case 245: OutputString("0xF5"); break; case 246: OutputString("0xF6"); break; case 247: OutputString("0xF7"); break; case 248: OutputString("0xF8"); break; case 249: OutputString("0xF9"); break; case 250: OutputString("0xFA"); break; case 251: OutputString("0xFB"); break; case 252: OutputString("0xFC"); break; case 253: OutputString("0xFD"); break; case 254: OutputString("0xFE"); break; case 255: OutputString("0xFF"); break; } } private static void OutputByte(byte aByte) { PutChar(mCurrentLine, mCurrentChar, aByte); mCurrentChar += 1; if (mCurrentChar == Columns) { mCurrentChar = 0; mCurrentLine += 1; if (mCurrentLine == Lines) { Clear(); } } } private static void OutputString(string aText) { int theLength = aText.Length; global::System.Diagnostics.Debugger.Break(); for (int i = 0; i < aText.Length; i++) { Write_char_(aText[i]); } } public static void Write_char_(char aChar) { OutputByte(StringImpl.GetByteFromChar(aChar)); } public static void Write_string_(string aText) { OutputString(aText); } public static void WriteLine(string aLine) { OutputString(aLine); mCurrentLine += 1; mCurrentChar = 0; if (mCurrentLine == Lines) { MoveLinesUp(); mCurrentLine -= 1; mCurrentChar = 0; } } } }