Ejemplo n.º 1
0
 private void Z80OnBeforeInstructionFetch(object sender, BeforeInstructionFetchEventArgs e)
 {
     if (((IZ80Processor)sender).Registers.PC == BDOS)
     {
         dosFunctionsExecutor.ExecuteFunctionCall();
         ((IZ80Processor)sender).ExecuteRet();
     }
 }
Ejemplo n.º 2
0
        private void Cpu_BeforeInstructionFetch(object sender, BeforeInstructionFetchEventArgs e)
        {
            if (cpu.Registers.PC == EXTBIO)
            {
                HandleExtbioCall();
            }

            if (cpu.Registers.PC == EntryPointAddress && slots.GetCurrentSlot(1) == slotNumber)
            {
                HandleEntryPointCall();
            }
        }
Ejemplo n.º 3
0
        private void Cpu_BeforeInstructionFetch(object sender, BeforeInstructionFetchEventArgs eventArgs)
        {
            var count = Math.Min(PastedText.Count, 8);

            if (count > 0 && (processor.Memory[GETPNT] == processor.Memory[PUTPNT]))
            {
                processor.Memory.SetContents(KEYBUF, PastedText.Take(count).ToArray(), 0, count);
                WriteShort(GETPNT, KEYBUF);
                WriteShort(PUTPNT, KEYBUF + count);
                PastedText.RemoveRange(0, count);
            }
        }
Ejemplo n.º 4
0
        private void Z80OnBeforeInstructionFetch(object sender, BeforeInstructionFetchEventArgs args)
        {
            //Absolutely minimum implementation of CP/M for ZEXALL and ZEXDOC to work

            var z80 = (IZ80Processor)sender;

            if (z80.Registers.PC == 0)
            {
                args.ExecutionStopper.Stop();
                return;
            }
            else if (z80.Registers.PC != 5)
            {
                return;
            }

            var function = z80.Registers.C;

            if (function == 9)
            {
                var  messageAddress = z80.Registers.DE;
                var  bytesToPrint   = new List <byte>();
                byte byteToPrint;
                while ((byteToPrint = z80.Memory[messageAddress]) != DollarCode)
                {
                    bytesToPrint.Add(byteToPrint);
                    messageAddress++;
                }

                var stringToPrint = Encoding.ASCII.GetString(bytesToPrint.ToArray());
                Console.Write(stringToPrint);
            }
            else if (function == 2)
            {
                var byteToPrint = z80.Registers.E;
                var charToPrint = Encoding.ASCII.GetString(new[] { byteToPrint })[0];
                Console.Write(charToPrint);
            }

            z80.ExecuteRet();
        }
Ejemplo n.º 5
0
        private void Cpu_BeforeInstructionFetch(object sender, BeforeInstructionFetchEventArgs e)
        {
            var pc = cpu.Registers.PC;

            if (addressesToLog.ContainsKey(pc))
            {
                var symbol = addressesToLog[pc];
                Debug.WriteLine($"{indentation}--> {symbol}: HL=0x{cpu.Registers.HL:X4}, DE=0x{cpu.Registers.DE:X4}, BC={cpu.Registers.BC} (0x{cpu.Registers.BC:X4}), A={cpu.Registers.A}, Cy={cpu.Registers.CF}");
                var returnAddress = NumberUtils.CreateUshort(cpu.Memory[cpu.Registers.SP], cpu.Memory[cpu.Registers.SP + 1]);
                trackedCallsStack.Push(returnAddress);
                trackedCallsStackSymbols.Push(symbol);
                UdpateIndentation();
            }
            if (trackedCallsStack.Any() && trackedCallsStack.Peek() == pc)
            {
                trackedCallsStack.Pop();
                var symbol = trackedCallsStackSymbols.Pop();
                UdpateIndentation();
                Debug.WriteLine($"{indentation}<-- {symbol}: HL=0x{cpu.Registers.HL:X4}, DE=0x{cpu.Registers.DE:X4}, BC={cpu.Registers.BC} (0x{cpu.Registers.BC:X4}), A={cpu.Registers.A}, Cy={cpu.Registers.CF}");
            }
        }
Ejemplo n.º 6
0
        private void CpuOnBeforeInstructionFetch(object sender, BeforeInstructionFetchEventArgs e)
        {
            if (!hookedMethods.ContainsKey(regs.PC))
            {
                return;
            }

            if (segmentNumber == null &&
                (mappedRam = slotsSystem.GetSlotContents(slotsSystem.GetCurrentSlot(1)) as IMappedRam) != null &&
                ExtractString(0x4000, 14) == "FileSysDriver")
            {
                segmentNumber = mappedRam.GetBlockInBank(1);
            }

            if (segmentNumber != null &&
                mappedRam?.GetBlockInBank(1) == segmentNumber.Value &&
                slotsSystem.GetSlotContents(slotsSystem.GetCurrentSlot(1)) == mappedRam)
            {
                hookedMethods[regs.PC]();
                cpu.ExecuteRet();
            }
        }