public FoenixSystem(Gpu gpu, BoardVersion version, string DefaultKernel) { this.gpu = gpu; boardVersion = version; int memSize = MemoryMap.RAM_SIZE; CodecRAM codec = null; SDCardDevice sdcard = null; if (boardVersion == BoardVersion.RevC) { memSize *= 2; codec = new CodecRAM(MemoryMap.CODEC_WR_CTRL_FMX, 2); // This register is only a single byte but we allow writing a word sdcard = new GabeSDController(MemoryMap.GABE_SDC_CTRL_START, MemoryMap.GABE_SDC_CTRL_SIZE); } else { codec = new CodecRAM(MemoryMap.CODEC_WR_CTRL, 2); // This register is only a single byte but we allow writing a word sdcard = new CH376SRegister(MemoryMap.SDCARD_DATA, MemoryMap.SDCARD_SIZE); } MemMgr = new MemoryManager { RAM = new MemoryRAM(MemoryMap.RAM_START, memSize), // RAM: 2MB Rev B, 4MB Rev C VICKY = new MemoryRAM(MemoryMap.VICKY_START, MemoryMap.VICKY_SIZE), // 60K VIDEO = new MemoryRAM(MemoryMap.VIDEO_START, MemoryMap.VIDEO_SIZE), // 4MB Video FLASH = new MemoryRAM(MemoryMap.FLASH_START, MemoryMap.FLASH_SIZE), // 8MB RAM BEATRIX = new GabeRAM(MemoryMap.BEATRIX_START, MemoryMap.BEATRIX_SIZE), // 4K // Special devices MATH = new MathCoproRegisters(MemoryMap.MATH_START, MemoryMap.MATH_END - MemoryMap.MATH_START + 1), // 48 bytes KEYBOARD = new KeyboardRegister(MemoryMap.KBD_DATA_BUF, 5), SDCARD = sdcard, INTERRUPT = new InterruptController(MemoryMap.INT_PENDING_REG0, 4), UART1 = new UART(MemoryMap.UART1_REGISTERS, 8), UART2 = new UART(MemoryMap.UART2_REGISTERS, 8), OPL2 = new OPL2(MemoryMap.OPL2_S_BASE, 256), MPU401 = new MPU401(MemoryMap.MPU401_REGISTERS, 2), VDMA = new VDMA(MemoryMap.VDMA_START, MemoryMap.VDMA_SIZE) }; MemMgr.CODEC = codec; // Assign memory variables used by other processes CPU = new CPU(MemMgr); CPU.SimulatorCommand += CPU_SimulatorCommand; gpu.VRAM = MemMgr.VIDEO; gpu.RAM = MemMgr.RAM; gpu.VICKY = MemMgr.VICKY; MemMgr.VDMA.setVideoRam(MemMgr.VIDEO); // Load the kernel.hex if present ResetCPU(true, DefaultKernel); // This fontset is loaded just in case the kernel doesn't provide one. gpu.LoadFontSet("Foenix", @"Resources\Bm437_PhoenixEGA_8x8.bin", 0, CharacterSet.CharTypeCodes.ASCII_PET, CharacterSet.SizeCodes.Size8x8); // Write bytes $9F in the joystick registers to mean that they are not installed. MemMgr.WriteWord(0xAFE800, 0x9F9F); MemMgr.WriteWord(0xAFE802, 0x9F9F); }
public FoenixSystem(BoardVersion version, string DefaultKernel) { boardVersion = version; int memSize = MemoryMap.RAM_SIZE; CodecRAM codec = null; SDCardDevice sdcard = null; if (boardVersion == BoardVersion.RevC || boardVersion == BoardVersion.RevU) { memSize *= 2; codec = new CodecRAM(MemoryMap.CODEC_WR_CTRL_FMX, 2); // This register is only a single byte but we allow writing a word sdcard = new GabeSDController(MemoryMap.GABE_SDC_CTRL_START, MemoryMap.GABE_SDC_CTRL_SIZE); } else { codec = new CodecRAM(MemoryMap.CODEC_WR_CTRL, 2); // This register is only a single byte but we allow writing a word sdcard = new CH376SRegister(MemoryMap.SDCARD_DATA, MemoryMap.SDCARD_SIZE); } MemMgr = new MemoryManager { RAM = new MemoryRAM(MemoryMap.RAM_START, memSize), // RAM: 2MB Rev B, 4MB Rev C VICKY = new MemoryRAM(MemoryMap.VICKY_START, MemoryMap.VICKY_SIZE), // 60K VIDEO = new MemoryRAM(MemoryMap.VIDEO_START, MemoryMap.VIDEO_SIZE), // 4MB Video FLASH = new MemoryRAM(MemoryMap.FLASH_START, MemoryMap.FLASH_SIZE), // 8MB RAM BEATRIX = new GabeRAM(MemoryMap.BEATRIX_START, MemoryMap.BEATRIX_SIZE), // 4K // Special devices MATH = new MathCoproRegister(MemoryMap.MATH_START, MemoryMap.MATH_END - MemoryMap.MATH_START + 1), // 48 bytes KEYBOARD = new KeyboardRegister(MemoryMap.KBD_DATA_BUF, 5), SDCARD = sdcard, INTERRUPT = new InterruptController(MemoryMap.INT_PENDING_REG0, 4), UART1 = new UART(MemoryMap.UART1_REGISTERS, 8), UART2 = new UART(MemoryMap.UART2_REGISTERS, 8), OPL2 = new OPL2(MemoryMap.OPL2_S_BASE, 256), FLOAT = new MathFloatRegister(MemoryMap.FLOAT_START, MemoryMap.FLOAT_END - MemoryMap.FLOAT_START + 1), MPU401 = new MPU401(MemoryMap.MPU401_REGISTERS, 2), VDMA = new VDMA(MemoryMap.VDMA_START, MemoryMap.VDMA_SIZE), TIMER0 = new TimerRegister(MemoryMap.TIMER0_CTRL_REG, 8), TIMER1 = new TimerRegister(MemoryMap.TIMER1_CTRL_REG, 8), TIMER2 = new TimerRegister(MemoryMap.TIMER2_CTRL_REG, 8) }; MemMgr.CODEC = codec; MemMgr.KEYBOARD.SetKernel(this); // Assign memory variables used by other processes CPU = new CPU(MemMgr); MemMgr.VDMA.setVideoRam(MemMgr.VIDEO); MemMgr.VDMA.setSystemRam(MemMgr.RAM); // Load the kernel.hex if present ResetCPU(DefaultKernel); // Write bytes $9F in the joystick registers to mean that they are not installed. MemMgr.WriteWord(0xAFE800, 0x9F9F); MemMgr.WriteWord(0xAFE802, 0x9F9F); MemMgr.TIMER0.TimerInterruptDelegate += TimerEvent0; MemMgr.TIMER1.TimerInterruptDelegate += TimerEvent1; MemMgr.TIMER2.TimerInterruptDelegate += TimerEvent2; }
public FoenixSystem(BoardVersion version, string DefaultKernel) { boardVersion = version; int memSize = MemoryMap.RAM_SIZE; CodecRAM codec = null; SDCardDevice sdcard = null; byte SystemStat = 0; // FMX int keyboardAddress = MemoryMap.KBD_DATA_BUF_FMX; // FMX switch (boardVersion) { case BoardVersion.RevB: break; case BoardVersion.RevC: memSize *= 2; break; case BoardVersion.RevU: SystemStat = 1; keyboardAddress = MemoryMap.KBD_DATA_BUF_U; break; case BoardVersion.RevUPlus: memSize *= 2; SystemStat = 5; keyboardAddress = MemoryMap.KBD_DATA_BUF_U; break; } if (boardVersion == BoardVersion.RevB) { codec = new CodecRAM(MemoryMap.CODEC_WR_CTRL, 2); // This register is only a single byte but we allow writing a word sdcard = new CH376SRegister(MemoryMap.SDCARD_DATA, MemoryMap.SDCARD_SIZE); } else { codec = new CodecRAM(MemoryMap.CODEC_WR_CTRL_FMX, 2); // This register is only a single byte but we allow writing a word sdcard = new GabeSDController(MemoryMap.GABE_SDC_CTRL_START, MemoryMap.GABE_SDC_CTRL_SIZE); } MemMgr = new MemoryManager { RAM = new MemoryRAM(MemoryMap.RAM_START, memSize), // RAM: 2MB Rev B & U, 4MB Rev C & U+ VICKY = new MemoryRAM(MemoryMap.VICKY_START, MemoryMap.VICKY_SIZE), // 60K VIDEO = new MemoryRAM(MemoryMap.VIDEO_START, MemoryMap.VIDEO_SIZE), // 4MB Video FLASH = new MemoryRAM(MemoryMap.FLASH_START, MemoryMap.FLASH_SIZE), // 8MB RAM GABE = new GabeRAM(MemoryMap.GABE_START, MemoryMap.GABE_SIZE), // 4K // Special devices MATH = new MathCoproRegister(MemoryMap.MATH_START, MemoryMap.MATH_END - MemoryMap.MATH_START + 1), // 48 bytes KEYBOARD = new KeyboardRegister(keyboardAddress, 5), SDCARD = sdcard, INTERRUPT = new InterruptController(MemoryMap.INT_PENDING_REG0, 4), UART1 = new UART(MemoryMap.UART1_REGISTERS, 8), UART2 = new UART(MemoryMap.UART2_REGISTERS, 8), OPL2 = new OPL2(MemoryMap.OPL2_S_BASE, 256), FLOAT = new MathFloatRegister(MemoryMap.FLOAT_START, MemoryMap.FLOAT_END - MemoryMap.FLOAT_START + 1), MPU401 = new MPU401(MemoryMap.MPU401_REGISTERS, 2), VDMA = new VDMA(MemoryMap.VDMA_START, MemoryMap.VDMA_SIZE), TIMER0 = new TimerRegister(MemoryMap.TIMER0_CTRL_REG, 8), TIMER1 = new TimerRegister(MemoryMap.TIMER1_CTRL_REG, 8), TIMER2 = new TimerRegister(MemoryMap.TIMER2_CTRL_REG, 8) }; MemMgr.CODEC = codec; MemMgr.KEYBOARD.SetKernel(this); // Assign memory variables used by other processes CPU = new CPU(MemMgr); MemMgr.VDMA.setVideoRam(MemMgr.VIDEO); MemMgr.VDMA.setSystemRam(MemMgr.RAM); MemMgr.VDMA.setVickyRam(MemMgr.VICKY); MemMgr.GABE.WriteByte(MemoryMap.GABE_SYS_STAT - MemoryMap.GABE_START, SystemStat); // Load the kernel.hex if present ResetCPU(DefaultKernel); // Write bytes $9F in the joystick registers to mean that they are not installed. MemMgr.WriteWord(0xAFE800, 0x9F9F); MemMgr.WriteWord(0xAFE802, 0x9F9F); MemMgr.TIMER0.TimerInterruptDelegate += TimerEvent0; MemMgr.TIMER1.TimerInterruptDelegate += TimerEvent1; MemMgr.TIMER2.TimerInterruptDelegate += TimerEvent2; // Set the Vicky rev and subrev MemMgr.VICKY.WriteWord(0x1C, 0x7654); MemMgr.VICKY.WriteWord(0x1E, 0x3456); MemMgr.VICKY.WriteByte(MemoryMap.GAMMA_CTRL_REG - MemoryMap.VICKY_BASE_ADDR, 0x11); // Gamma and hi-res are off // set the date MemMgr.VICKY.WriteByte(MemoryMap.FPGA_DOR - MemoryMap.VICKY_BASE_ADDR, 0x1); MemMgr.VICKY.WriteByte(MemoryMap.FPGA_MOR - MemoryMap.VICKY_BASE_ADDR, 0x2); MemMgr.VICKY.WriteByte(MemoryMap.FPGA_YOR - MemoryMap.VICKY_BASE_ADDR, 0x21); // Set board revision MemMgr.GABE.WriteByte(MemoryMap.REVOFPCB_C - MemoryMap.GABE_START, (byte)'E'); MemMgr.GABE.WriteByte(MemoryMap.REVOFPCB_4 - MemoryMap.GABE_START, (byte)'M'); MemMgr.GABE.WriteByte(MemoryMap.REVOFPCB_A - MemoryMap.GABE_START, (byte)'U'); // Set the rev date }