mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 20:39:01 +00:00
869 lines
No EOL
16 KiB
C#
869 lines
No EOL
16 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
} |