private void Z80OnBeforeInstructionFetch(object sender, BeforeInstructionFetchEventArgs e) { if (((IZ80Processor)sender).Registers.PC == BDOS) { dosFunctionsExecutor.ExecuteFunctionCall(); ((IZ80Processor)sender).ExecuteRet(); } }
private void Cpu_BeforeInstructionFetch(object sender, BeforeInstructionFetchEventArgs e) { if (cpu.Registers.PC == EXTBIO) { HandleExtbioCall(); } if (cpu.Registers.PC == EntryPointAddress && slots.GetCurrentSlot(1) == slotNumber) { HandleEntryPointCall(); } }
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); } }
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(); }
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}"); } }
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(); } }