#z80 #computer #pio #called #memory #emulation #cpu

无需 std ral1243

RAL 1243 是 z80emu 的一个虚构计算机模拟器

3 个稳定版本

2.0.1 2024 年 2 月 25 日
1.0.0 2024 年 2 月 11 日

#105 in 模拟器

每月下载量:32
z80emu 中使用

LGPL-3.0-or-later

605KB
12K SLoC

Rust 10K SLoC // 0.1% comments Ruby 1.5K SLoC // 0.1% comments

RAL 1243

RAL 1243 是一个虚构的计算机,被引入虚拟存在,以提供基于 z80emu Z80 CPU 模拟器的模拟器实现示例。

这台计算机没有图形或键盘界面,而是通过板载 PIO 芯片组与用户通信。

RAL 1243 计算机是一个库,适用于嵌入式系统。

用法

z80emu/examples 中可以找到一个使用此库的示例,名为 terminal

内存

RAL 1243 的内存映射

  • 0x0000-0x1FFF 占用 ROM 内核。
  • 0x2000-0x3FFF 占用可交换的 EX-ROM 插槽,包含用户程序或仅可通过 RAM 页面访问的内核。
  • 0x4000-RAMTOP 可用于用户程序的随机访问内存。

陷阱

如果程序计数器在 0x00000x1FFF(包含)之间,则 RAM 页正在交换到内存页 0x2000-0x3FFF。否则,当前交换的 ROM 可在此内存页上访问。

I/O

系统上的总线Bus通过级联的设备处理I/O,其中存在以下外围设备

内存控制器

  • IN (124) - 读取当前已交换的卡带编号。
  • OUT (124) - 选择256个可交换卡带中的一个,将其映射到内存页0x2000-0x3FFF。如果卡带不存在,则显示一个全部为0xFF的字节填充页。

PIO Z8420

一个PIO Z8420芯片控制连接到其通道A的终端输入和从其通道B的输出。

注意:PIO芯片的实现仅模拟输入输出通道模式。双向和控制模式目前不受支持。

  • IN (8) - 通过通道 A从终端读取一个字符。
  • OUT (9) - PIO 通道 A控制。
  • OUT (10) - 通过通道 B将一个字符输出到终端。
  • OUT (11) - PIO 通道 B控制。

PIO芯片通过触发中断来指示终端输入和输出数据的可用性。

CTC Z8430

一个CTC Z8430芯片控制4个定时器/计数器。

  • 通道02CLK/TRG线连接到一个(与CPU时钟无关)的100µs脉冲(10 kHz)时钟。

  • 通道0ZT/CO线连接到通道1CLK/TRG线。

  • 通道1ZT/CO线目前未连接到任何设备。

  • 通道2ZT/CO线连接到通道3CLK/TRG线。

  • IN (4) - CTC Channel 0 当前的计数器值。

  • OUT (4) - CTC Channel 0 控制。

  • IN (5) - CTC Channel 1 当前的计数器值。

  • OUT (5) - CTC Channel 1 控制。

  • IN (6) - CTC Channel 2 当前的计数器值。

  • OUT (6) - CTC Channel 2 控制。

  • IN (7) - CTC Channel 3 当前的计数器值。

  • OUT (7) - CTC Channel 3 控制。

CTC 芯片可能在计数到 0 时触发中断。

中断

IM 2 中断模式必须始终开启。

系统

在地址 0x20000x3FFF 之间映射的 RAM 内存区域仅由 ROM 内核专用。

机器堆栈占用 RAM 内存区的最后字节。系统启动后,SP 被初始化为可用 RAM 的最后一个地址加 1。如果检测到没有用户 RAM 内存,系统将拒绝启动。

  • RST 00h - 软件系统复位。
  • RST 08h - 将输入字符存入累加器,并通过 ZF=0 信号表示新字符。只有在新输入时,累加器寄存器 A 才会被修改。寄存器 HL' 也会被修改。当使用 CF=1 调用时,等待下一个字符可用,总是成功。当使用 CF=0 调用时,立即返回,并通过 ZF=1 信号表示可能失败。
  • RST 10h - 将累加器中的单个字符输出,并通过 ZF=1 信号表示成功。寄存器 HL' 也会被修改。当使用 CF=0 调用时,等待字符可以被缓冲,总是成功。当使用 CF=1 调用时,立即返回,并通过 ZF=0 信号表示可能失败。
  • RST 18h - 将调用转发到 IX 地址。
  • RST 20h - 将调用转发到 IY 地址。
  • RST 28h - 将调用转发到累加器中标识为8位函数向量的 syslib 函数。修改 AHL'。函数可能会修改更多寄存器。有关系统库例程的列表,请参考 ROM 内核源代码 rom/ral1243_rom.rb
  • RST 30h - 将调用转发到 HL 地址。
  • RST 38h - 返回系统菜单。
  • NMI - 如果正在运行 EX-ROM 代码,则返回系统菜单。

终端

终端将任何用户按键输入转发到 RAL 1243 PIO 输入设备。

连接到控制代码并发送到 PIO A

按键名称 数据
PgUp 1
Home 2
End 3
PgDn 4
Ins 5
Backspace 8
Tab 9
Up 17
Left 18
Down 19
Right 20
Esc 27
Del 127

任何ASCII可打印字符都按原样转发。

PIO 输出(通道 Channel B)的数据正在转发到控制台。

终端解释的特殊输出控制代码

代码 动作
8 将光标向左移动。
10 将光标移到下一行。
12 清除终端。
13 将光标移到第一列。
16 将光标移动到绝对位置;后跟行索引,后跟列索引。
17 向上移动光标 ↑
18 向左移动光标 ←
19 向下移动光标 ↓
20 移动光标→右
21 更改光标外观;后跟光标形状编号。

光标形状

  • 0 - 隐藏
  • 1 - 下划线
  • 2 - 块

根据终端能力,可能还有更多形状可用。

依赖项

~185–410KB