【问题标题】:Waiting for some time on Z80 CP/M在 Z80 CP/M 上等待一段时间
【发布时间】:2021-01-18 15:55:28
【问题描述】:

我想在 CP/M 2.X (Z80) 上编写一个游戏循环,需要等待一段时间,例如一秒。我查看了 BDOS,但没有找到函数,循环取决于处理器(仿真速度),不存在垂直空白等中断。

关于如何编写游戏循环的任何想法?

[编辑]

z88dk CP/M 库说

不是(当然)CPM 1.x 和 2.x,它们没有实时功能; ,也不是 QX/M,它的时钟不是基于 BCD 的。

有像 LADDER 这样的动作游戏,所以应该有一种游戏循环方式。

[编辑2]

我可以让用户用两次按键检查 5 秒并测量一次速度(双循环)来配置游戏 - 但只能作为最后的手段。

【问题讨论】:

  • 查看 BDOS 调用列表,我没有看到任何有用的信息(DELAY 不在 Z80 CP/M 中)。您可以通过再次获取日期和时间、等待一些大但任意数量的周期(大约 10 秒)并再次获取时间来估计等待多长时间。然而,这会很慢,因为长时间没有发生任何事情,并且依赖于很少/没有中断占用周期。如果你的目标是更具体的东西(例如 RomWBW),你应该能够得到一些半便携的东西。
  • 如何以便携的方式获取时间? (例如 NC 100、PC 1600、模拟器)- Turbo Pascal 也有延迟(t),但我找不到源。
  • 如果有这样的问题,您可能会在Retrocomputing 上获得更好的运气。
  • CP/M 2.2 中没有标准时钟或定时器功能。您将不得不假设一些时钟速度或依赖机器相关的硬件。
  • 我已经实现了一个CP/M;我可以确认确实没有可用的时间信息。没有时钟,没有时间戳。在 8080、Z80A 和 B 以及 V20 之间,包括像 Commodore C128 这样严重瘫痪的机器,那里有相当广泛的性能。

标签: assembly z80 cpm


【解决方案1】:

在 CP/M 2.2 下没有可移植的方法来等待一定的时间。 CP/M 不需要或使用实时时钟或任何类型的计时器,因此您甚至不能假设系统中存在一个,更不用说它使用任何类型的通用接口。

Turbo Pascal 的Delay 函数通过假设特定的 CPU 频率工作,该频率是在安装 Turbo Pascal 时配置的。 CP/M游戏Ladder是用Turbo Pascal编写的,使用了它的Delay函数,所以也假设了一定的CPU频率。如果您在更快或更慢的 CPU 上玩游戏,游戏会比预期的更快或更慢。

最简单的解决方案是实现您自己的延迟函数,假设 CPU 频率为特定值。我相信 4 MHz 是 CP/M 最常见的 Z80 速度。您可以将此设置为可配置选项,以便用户可以更改假定的 CPU 速度。您可能还想为用户提供更改终端类型的选项,就像 Ladder 所做的那样,因为有许多可能的终端可以与 CP/M 一起使用。

【讨论】:

  • 谢谢,我会按照你的建议配置CPU速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 2021-08-26
  • 2014-12-29
  • 2021-05-08
相关资源
最近更新 更多