Example #1
0
        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);
        }
Example #2
0
        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;
        }
Example #3
0
        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
        }