问题标签 [cpm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2220 浏览

cpm - 终止悬挂程序并返回 Turbo Pascal 3

我在 CP/M 2.2 上运行 Turbo Pascal 3.01A。假设我使用 Turbo Pascal 中的 R 菜单选项运行的 Pascal 程序有一个错误并进入无限循环。是否有特殊的控制字符会中断我的程序并返回 Turbo Pascal 菜单?

0 投票
1 回答
1690 浏览

z80 - CP/M 3.1 (z80) 的最小汇编程序

我似乎正在与我的愚蠢作斗争。

该站点解释了各种版本的 CP/M 下的系统调用。

但是,当我尝试使用调用 2(C_WRITE,控制台输出)时,什么都没有发生。

我有以下代码。

我在这里背诵这句话。如果有错别字,请放心,它们不在原始文件中,因为文件确实编译了,而且我有一个 COM 文件要启动。

我认为这些线条的含义如下:

  1. 确保它被加载到地址 100h(0h 到 FFh 是零页)。
  2. 将 ASCII 'a' 加载到系统调用 2 的 E 寄存器中。
  3. 将整数 2 加载到系统调用 2 的 C 寄存器中。
  4. 进行系统调用(系统调用的 JMP 位于零页中的地址 5)。
  5. 结束程序(退出命令在零页的地址 0 处)。

程序启动和退出没有问题。如果我删除最后一个命令,它会挂起计算机(我猜这也是预期的,并显示 CALL 0 有效)。

但是,它不打印 ASCII 字符。(但它确实打印了一个额外的新行,但系统可能已经这样做了。)

如何让我的 CP/M 程序执行系统调用应该执行的操作?我究竟做错了什么?

更新:问题是我尝试过的所有汇编程序都需要某种格式的源文件。此文件与 Microsoft 的宏汇编器一起使用:

认为(我猜)asm.com(DR 的汇编程序)和 m80.com(微软的宏汇编程序)期待 Intel 8080 助记符,并且必须告知他们何时必须期待 z80 助记符,这显然是不同的。

无论如何我都会接受下面的答案,因为它也是正确的,因为它建议只需编写图像本身而不用担心 asm.com。

0 投票
1 回答
413 浏览

assembly - m80 宏汇编器 org 指令

我正在使用微软古老的 m80 宏汇编器,并且有一段时间没有遇到任何重大问题。

但是,我现在尝试将 ORG 指令与十六进制数字一起使用,但它失败了。

这有效:

但是,这不起作用:

m80 声称这是一个致命错误:

如何将 ORG 指令与包含 9 以上数字的数字一起使用?

我错过了什么?

0 投票
2 回答
387 浏览

intel-8080 - 在 CP/M 上构建 ROM 映像

我正在尝试使用 CP/M 上古老的 M80 和 L80 工具来构建 ROM 映像。(它用于 CP/M 仿真器,因此我使用 CP/M 工具。)

不幸的是 L80 似乎真的很粗糙 --- AFAICT 它只是将每个目标文件加载到其绝对地址,修复它,然后将所有内容从 0x0100 转储到磁盘。这意味着基于其自身工作空间之外地址的目标文件似乎根本不起作用(只是产生错误消息)。我的 ROM 的基地址是 0xd000,这远远超出了这个范围。

有谁知道是否可以使用 M80 和 L80 来做到这一点,如果可以,怎么做?或者,任何人都可以推荐(并指出我!)一个 CP/M 汇编器/链接器套件吗?

(请注意,如果可能的话,我想避免交叉编译。)

0 投票
1 回答
559 浏览

c++ - 如何将 C/C++ 编译为 CP/M-86 可执行文件 (CMD)

我有这个项目:使用现代编译器将 C/C++ 程序编译为 CP/M-86 可执行文件(CMD 文件)。目标架构是 16 位 x86。你可能会认为我疯了,但我这样做是为了好玩,并且总体上了解 CP/M-86 和低级 x86 编程。

我对 x86 汇编程序编程知之甚少,但我做了一个“Hello World”示例,我可以使用 ASM86 和 GENCMD 生成 CMD 文件。它有效。ASM86 是一个用于 CP/M-86 的汇编程序,它将生成一个 H86 文件,即(据我所知)英特尔十六进制代码。GENCMD 读取这个 HEX 文件并创建 CMD 可执行文件。CMD 是 DOS 和 Windows 中已知的 EXE 可执行文件的 CP/M-86 等价物。

我有一个“现代”工具,它将编译和链接 16 位 x86 NASM 代码并输出一个可以在我的 CP/M-86 机器上运行的工作 CMD——完全在我的 Linux 机器上构建。但是,我需要一个 C/C++ 编译器来创建这个兼容的 NASM 代码。或者可能是某种可以轻松转换为 CMD 的平面二进制文件。

第二件事是系统调用。我可能可以使用内联汇编制作类似打印的功能并对其进行测试。现在我只想编译这个程序,它什么都不做(希望不做任何系统调用?):

CP/M-86 确实存在 C 编译器,但这些编译器非常非常陈旧,几乎无法使用。特别是如果我想做 C++,就像我真的想做的那样。因此,必须使用现代编译器(如 gcc 或 llvm-clang 或类似的东西)来完成。

最后的手段可能是编译一个 16 位 DOS 兼容的 EXE,然后进行一些系统调用转换……但这有点作弊,而且仍然相当耗时。

我怎样才能达到我的目标?提前致谢。任何建议表示赞赏:-)

0 投票
1 回答
210 浏览

cpm - 如何将 CP/M BDOS 重新定位到自定义内存地址?

也许这是一个新手 CP/M 问题,但无论如何......是否可以重新定位 CP/M BDOS?我有一个我为它编写了 BIOS 的硬件,以便能够与 CPM 2.2 一起使用。但是,BDOS(通过反汇编可以看到)使用固定地址。由于我不太了解 CP/M,所以我不知道如何将 CP/M BDOS 放置到另一个起始地址。我能想到的唯一(有点难看!)解决方案:我找到了一个 CP/M 反汇编列表,所以我只是修改了“ORG”指令并重新组装了它。还有其他方法吗,例如一些 CP/M 实用程序?如果是这样,它怎么能做到这一点,因为 BDOS 使用 JP、CALL 等操作码(对不起,我只熟悉 Z80,对原始 8080 组件不太了解)所以它不仅仅是 PC 独立的。谢谢!

0 投票
1 回答
495 浏览

assembly - Z80 汇编器的问题

我试图在 Debian 的 CP/M 2.2 模拟器(z80pack)中使用 Z80 汇编程序编写代码:

每次我尝试写一行时,它都会说“找不到文件”。我找了手册,但没有说明如何开始。我应该输入一个特殊的命令吗?因为 M80 (Macro-Assembler 80) 在每一行也会出错。

0 投票
2 回答
346 浏览

assembly - Z80 Assembly (1MHz) CP/M:如何使用按钮获得正确的物理输入

我是一名学习计算机科学的大一新生。在计算机工程中,我们正在研究 Zilog Z80 8 位微处理器 (1MHz) 和一组需要使用面包板和电缆手动连接的组件。

连接部分并不让我担心,但我确实有关于我需要编写以使我的程序正常工作的装配程序的问题(LED 运行灯,手动输入行为和频率)。

我已经阅读了手册并知道可以使用的一组说明(仅是必需品)。首先,我并不是要尽可能地获得最干净、最好看的代码。不过不用担心,我稍后会对其进行美化,因为我喜欢干净高效的代码。

目前,该程序似乎在模拟器中运行良好,因此语法似乎没问题。不过,我不确定如何解决某些逻辑问题。

该练习具有以下规格:

  1. 起始地址 RAM:E000h
  2. 输入端口1:03h
  3. 输出端口1:05h
  4. 端口的 I/O 映射
  5. 电路自动打开 (1),因此 LED 为低电平有效 (0)
  6. 输入 2、3、4 改变 LED 移动行为
  7. 输入 5,6 改变 LED 闪烁频率

我已经使用 设置了起始地址ORG E000h并使用MOV SP,FFFFh. 对于输入(三种不同类型的闪烁/运行,以及两种不同的频率,总共等于五个按钮),我创建了不同的标签。

我目前的问题是我不太确定如何正确输入物理输入 - IIRC,我需要通过使用 XOR 来指定一个位模式,所有内容都是 1 但所需的输入,以便我可以使用信息在我的程序中。

但即使我确实知道它应该如何工作(至少我认为我知道),我还是不能完全理解软件实现。此外,我遇到了条件问题:按下一个开关将闪烁频率更改为 1/4 Hz,而按下另一个开关将其更改为 4Hz。在高级语言中,我在这里只使用 IF/ELSE,但在这种情况下我不知道该怎么做 - 遗憾的是,手册只包括基本操作,所以我不知所措。

因此,我想我会试试运气并向社区寻求帮助。

对于那些有兴趣的人,我会发布我的代码。正如我已经提到的,这是非常基本的,但我暂时只需要它来完成工作。由于我不喜欢大量格式笨拙的代码,因此我在此处发布了文件。该文件是通过 GoogleDrive 托管的 *.txt。

感谢您的宝贵时间,祝您有美好的一天!

[编辑] 根据用户 Ruud Helderman 的输入,在帖子中添加了特定代码

[编辑] 更新 *.txt 文件中的代码 - 现在更简单、更高效

[编辑] 使用 HTML 格式在帖子中突出显示指令

具体代码片段:

上述功能使用输入开关板上的不同特定物理开关更改 LED 行为(在这种情况下:闪烁)以及频率,总共有 8 个开关(1 到 8,停用状态 = 1;使用开关 2 到 6)。我知道获取输入应该是小菜一碟——它应该只是使用位模式为 0 和恰好一个 1 的 XOR 的问题。

在尝试为我的问题找到解决方案时,我在网上遇到了不同的方法,例如TEST用于检查特定位置的位。尽管如此,我的说明手册没有提到任何这样的指令,作业本身也没有提到它。

我很清楚这可能是一个微不足道的问题,也许我只是陷入了我通过过度思考创造自己的心理循环,但目前我不知道如何去做我需要的(即使我可以看到地平线上的城堡——感谢卡夫卡!)。

任何帮助是极大的赞赏。

0 投票
2 回答
100 浏览

c - 为什么使用 char 类型作为循环索引会产生意想不到的结果?

请记住,这是 C 编译器的旧版本:用于 Z80 的 CP/M。

预期的:

0x0000 | 0x0001 | 0x0002 | 0x0003 | 0x0004 | 0x0005 | 0x0006 | 0x0007 | 0x0008 | 0x0009 | 0x000A | 0x000B | 0x000C | 0x000D | 0x000E | 0x000F | 0x0010 | 0x0011 | 0x0012 | 0x0013 | 0x0014 | 0x0015 | 0x0016 | 0x0017 | 0x0018 | 0x0019 | 0x001A | 0x001B | 0x001C | 0x001D | 0x001E | 0x001F | 0x0020 | 0x0021 | 0x0022 | 0x0023 | 0x0024 | 0x0025 | 0x0026 | 0x0027 | 0x0028 | 0x0029 | 0x002A | 0x002B | 0x002C | 0x002D | 0x002E | 0x002F | 0x0030 | 0x0031 | 0x0032 | 0x0033 | 0x0034 | 0x0035 | 0x0036 | 0x0037 | 0x0038 | 0x0039 | 0x003A | 0x003B | 0x003C | 0x003D | 0x003E | 0x003F | 0x0040 | 0x0041 | 0x0042 | 0x0043 | 0x0044 | 0x0045 | 0x0046 | 0x0047 | 0x0048 | 0x0049 | 0x004A | 0x004B | 0x004C | 0x004D | 0x004E | 0x004F | 0x0050 | 0x0051 | 0x0052 | 0x0053 | 0x0054 | 0x0055 | 0x0056 | 0x0057 | 0x0058 | 0x0059 | 0x005A | 0x005B | 0x005C | 0x005D | 0x005E | 0x005F | 0x0060 | 0x0061 | 0x0062 | 0x0063 | 0x0064 | 0x0065 | 0x0066 | 0x0067 | 0x0068 | 0x0069 | 0x006A | 0x006B | 0x006C | 0x006D | 0x006E | 0x006F | 0x0070 | 0x0071 | 0x0072 | 0x0073 | 0x0074 | 0x0075 | 0x0076 | 0x0077 | 0x0078 | 0x0079 | 0x007A | 0x007B | 0x007C | 0x007D | 0x007E | 0x007F | 0x0080 | 0x0081 | 0x0082 | 0x0083 | 0x0084 | 0x0085 | 0x0086 | 0x0087 | 0x0088 | 0x0089 | 0x008A | 0x008B | 0x008C | 0x008D | 0x008E | 0x008F | 0x0090 | 0x0091 | 0x0092 | 0x0093 | 0x0094 | 0x0095 | 0x0096 | 0x0097 | 0x0098 | 0x0099 | 0x009A | 0x009B | 0x009C | 0x009D | 0x009E | 0x009F | 0x00A0 | 0x00A1 | 0x00A2 | 0x00A3 | 0x00A4 | 0x00A5 | 0x00A6 | 0x00A7 | 0x00A8 | 0x00A9 | 0x00AA | 0x00AB | 0x00AC | 0x00AD | 0x00AE | 0x00AF | 0x00B0 | 0x00B1 | 0x00B2 | 0x00B3 | 0x00B4 | 0x00B5 | 0x00B6 | 0x00B7 | 0x00B8 | 0x00B9 | 0x00BA | 0x00BB | 0x00BC | 0x00BD | 0x00BE | 0x00BF | 0x00C0 | 0x00C1 | 0x00C2 | 0x00C3 | 0x00C4 | 0x00C5 | 0x00C6 | 0x00C7 | 0x00C8 | 0x00C9 | 0x00CA | 0x00CB | 0x00CC | 0x00CD | 0x00CE | 0x00CF | 0x00D0 | 0x00D1 | 0x00D2 | 0x00D3 | 0x00D4 | 0x00D5 | 0x00D6 | 0x00D7 | 0x00D8 | 0x00D9 | 0x00DA | 0x00DB | 0x00DC | 0x00DD | 0x00DE | 0x00DF | 0x00E0 | 0x00E1 | 0x00E2 | 0x00E3 | 0x00E4 | 0x00E5 | 0x00E6 | 0x00E7 | 0x00E8 | 0x00E9 | 0x00EA | 0x00EB | 0x00EC | 0x00ED | 0x00EE | 0x00EF | 0x00F0 | 0x00F1 | 0x00F2 | 0x00F3 | 0x00F4 | 0x00F5 | 0x00F6 | 0x00F7 | 0x00F8 | 0x00F9 | 0x00FA | 0x00FB | 0x00FC | 0x00FD | 0x00FE | 0x00FF | 0x00DC | 0x00DD | 0x00DE | 0x00DF | 0x00E0 | 0x00E1 | 0x00E2 | 0x00E3 | 0x00E4 | 0x00E5 | 0x00E6 | 0x00E7 | 0x00E8 | 0x00E9 | 0x00EA | 0x00EB | 0x00EC | 0x00ED | 0x00EE | 0x00EF | 0x00F0 | 0x00F1 | 0x00F2 | 0x00F3 | 0x00F4 | 0x00F5 | 0x00F6 | 0x00F7 | 0x00F8 | 0x00F9 | 0x00FA | 0x00FB | 0x00FC | 0x00FD | 0x00FE | 0x00FF | 0x00DC | 0x00DD | 0x00DE | 0x00DF | 0x00E0 | 0x00E1 | 0x00E2 | 0x00E3 | 0x00E4 | 0x00E5 | 0x00E6 | 0x00E7 | 0x00E8 | 0x00E9 | 0x00EA | 0x00EB | 0x00EC | 0x00ED | 0x00EE | 0x00EF | 0x00F0 | 0x00F1 | 0x00F2 | 0x00F3 | 0x00F4 | 0x00F5 | 0x00F6 | 0x00F7 | 0x00F8 | 0x00F9 | 0x00FA | 0x00FB | 0x00FC | 0x00FD | 0x00FE | 0x00FF |

实际的:

0x0A00 | 0x0A01 | 0x0A02 | 0x0A03 | 0x0A04 | 0x0A05 | 0x0A06 | 0x0A07 | 0x0A08 | 0x0A09 | 0x0A0A | 0x0A0B | 0x0A0C | 0x0A0D | 0x0A0E | 0x0A0F | 0x0A10 | 0x0A11 | 0x0A12 | 0x0A13 | 0x0A14 | 0x0A15 | 0x0A16 | 0x0A17 | 0x0A18 | 0x0A19 | 0x0A1A | 0x0A1B | 0x0A1C | 0x0A1D | 0x0A1E | 0x0A1F | 0x0A20 | 0x0A21 | 0x0A22 | 0x0A23 | 0x0A24 | 0x0A25 | 0x0A26 | 0x0A27 | 0x0A28 | 0x0A29 | 0x0A2A | 0x0A2B | 0x0A2C | 0x0A2D | 0x0A2E | 0x0A2F | 0x0A30 | 0x0A31 | 0x0A32 | 0x0A33 | 0x0A34 | 0x0A35 | 0x0A36 | 0x0A37 | 0x0A38 | 0x0A39 | 0x0A3A | 0x0A3B | 0x0A3C | 0x0A3D | 0x0A3E | 0x0A3F | 0x0A40 | 0x0A41 | 0x0A42 | 0x0A43 | 0x0A44 | 0x0A45 | 0x0A46 | 0x0A47 | 0x0A48 | 0x0A49 | 0x0A4A | 0x0A4B | 0x0A4C | 0x0A4D | 0x0A4E | 0x0A4F | 0x0A50 | 0x0A51 | 0x0A52 | 0x0A53 | 0x0A54 | 0x0A55 | 0x0A56 | 0x0A57 | 0x0A58 | 0x0A59 | 0x0A5A | 0x0A5B | 0x0A5C | 0x0A5D | 0x0A5E | 0x0A5F | 0x0A60 | 0x0A61 | 0x0A62 | 0x0A63 | 0x0A64 | 0x0A65 | 0x0A66 | 0x0A67 | 0x0A68 | 0x0A69 | 0x0A6A | 0x0A6B | 0x0A6C | 0x0A6D | 0x0A6E | 0x0A6F | 0x0A70 | 0x0A71 | 0x0A72 | 0x0A73 | 0x0A74 | 0x0A75 | 0x0A76 | 0x0A77 | 0x0A78 | 0x0A79 | 0x0A7A | 0x0A7B | 0x0A7C | 0x0A7D | 0x0A7E | 0x0A7F | 0x0A80 | 0x0A81 | 0x0A82 | 0x0A83 | 0x0A84 | 0x0A85 | 0x0A86 | 0x0A87 | 0x0A88 | 0x0A89 | 0x0A8A | 0x0A8B | 0x0A8C | 0x0A8D | 0x0A8E | 0x0A8F | 0x0A90 | 0x0A91 | 0x0A92 | 0x0A93 | 0x0A94 | 0x0A95 | 0x0A96 | 0x0A97 | 0x0A98 | 0x0A99 | 0x0A9A | 0x0A9B | 0x0A9C | 0x0A9D | 0x0A9E | 0x0A9F | 0x0AA0 | 0x0AA1 | 0x0AA2 | 0x0AA3 | 0x0AA4 | 0x0AA5 | 0x0AA6 | 0x0AA7 | 0x0AA8 | 0x0AA9 | 0x0AAA | 0x0AAB | 0x0AAC | 0x0AAD | 0x0AAE | 0x0AAF | 0x0AB0 | 0x0AB1 | 0x0AB2 | 0x0AB3 | 0x0AB4 | 0x0AB5 | 0x0AB6 | 0x0AB7 | 0x0AB8 | 0x0AB9 | 0x0ABA | 0x0ABB | 0x0ABC | 0x0ABD | 0x0ABE | 0x0ABF | 0x0AC0 | 0x0AC1 | 0x0AC2 | 0x0AC3 | 0x0AC4 | 0x0AC5 | 0x0AC6 | 0x0AC7 | 0x0AC8 | 0x0AC9 | 0x0ACA | 0x0ACB | 0x0ACC | 0x0ACD | 0x0ACE | 0x0ACF | 0x0AD0 | 0x0AD1 | 0x0AD2 | 0x0AD3 | 0x0AD4 | 0x0AD5 | 0x0AD6 | 0x0AD7 | 0x0AD8 | 0x0AD9 | 0x0ADA | 0x0亚行 | 0x0ADC | 0x0添加 | 0x0ADE | 0x0ADF | 0x0AE0 | 0x0AE1 | 0x0AE2 | 0x0AE3 | 0x0AE4 | 0x0AE5 | 0x0AE6 | 0x0AE7 | 0x0AE8 | 0x0AE9 | 0x0AEA | 0x0AEB | 0x0AEC | 0x0AED | 0x0AEE | 0x0AEF | 0x0AF0 | 0x0AF1 | 0x0AF2 | 0x0AF3 | 0x0AF4 | 0x0AF5 | 0x0AF6 | 0x0AF7 | 0x0AF8 | 0x0AF9 | 0x0AFA | 0x0AFB | 0x0AFC | 0x0AFD | 0x0AFE | 0x0AFF | 0x0ADC | 0x0添加 | 0x0ADE | 0x0ADF | 0x0AE0 | 0x0AE1 | 0x0AE2 | 0x0AE3 | 0x0AE4 | 0x0AE5 | 0x0AE6 | 0x0AE7 | 0x0AE8 | 0x0AE9 | 0x0AEA | 0x0AEB | 0x0AEC | 0x0AED | 0x0AEE | 0x0AEF | 0x0AF0 | 0x0AF1 | 0x0AF2 | 0x0AF3 | 0x0AF4 | 0x0AF5 | 0x0AF6 | 0x0AF7 | 0x0AF8 | 0x0AF9 | 0x0AFA | 0x0AFB | 0x0AFC | 0x0AFD | 0x0AFE | 0x0AFF | 0x0ADC | 0x0添加 | 0x0ADE | 0x0ADF | 0x0AE0 | 0x0AE1 | 0x0AE2 | 0x0AE3 | 0x0AE4 | 0x0AE5 | 0x0AE6 | 0x0AE7 | 0x0AE8 | 0x0AE9 | 0x0AEA | 0x0AEB | 0x0AEC | 0x0AED | 0x0AEE | 0x0AEF | 0x0AF0 | 0x0AF1 | 0x0AF2 | 0x0AF3 | 0x0AF4 | 0x0AF5 | 0x0AF6 | 0x0AF7 | 0x0AF8 | 0x0AF9 | 0x0AFA | 0x0AFB | 0x0AFC | 0x0AFD | 0x0AFE | 0x0AFF |

我究竟做错了什么?

集会:

0 投票
1 回答
160 浏览

assembly - 在 Z80 CP/M 上等待一段时间

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

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

[编辑]

z88dk CP/M 库说

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

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

[编辑2]

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