跳转到内容

Oberon/ETH Oberon/newfaq

来自 Wikibooks,开放世界中的开放书籍

该文档最初托管在 ETHZ。它仍然在 ETH 许可证 下,并且位于 WayBack 存档 中。


ETH Oberon - alpha/beta 版本常见问题解答
下载

来自: ftp://ftp.ethoberon.ethz.ch/ETHOberon/Native/Update/Beta/ [已过期]

当前最新: beta00120

链接


已修复的错误

  1. 文件何时从文件系统中有效删除?
  2. Windows 2000 问题与 Oberon 冲突
  3. 复制特定长度的文件会导致系统冻结
  4. System3.Tool 中的按钮颜色错误

已知错误

  1. Adaptec AIC-7861AHA-2940AU SCSI 控制器挂起
  2. 安装期间发生 TRAP -7

看似问题,但不是问题

  1. 在具有 1024 Kb 扩展内存的机器上启动 Oberon-0
  2. "版本不兼容" 错误
  3. Oberon-0 磁盘上的引导病毒
  4. Intel Pentium F0 0F 错误

一般问题

  1. 给新手一些关于如何开始使用 Oberon 的建议
  2. 解释 Oberon 的编号方案
  3. ETH Oberon 系统的历史背景是什么?
  4. 我在哪里可以找到有关 Oberon-0 的信息?
  5. 如何从多任务处理的角度来描述 Native Oberon?
  6. 是否计划发布新的 ETH Oberon 版本?
  7. 是否计划发布具有集成开发环境 (IDE) 的 ETH Oberon 版本,类似于 CodeWarrior、Visual C++ 或 Visual Basic?
  8. Aos 与 Native Oberon 有什么区别?

硬件支持

  1. 是否有可用的 Native Oberon 磁盘演示?
  2. 支持哪些硬件?
  3. 是否有用于编写驱动程序的 SDK?
  4. 我可以使用 ... Intel 克隆 / 非美国键盘 / 双按钮鼠标 / AGP / USB / 点阵打印机吗?
  5. 我可以使用 ... EIDE 和 SCSI 结合 / ZIP / SCSI CD-ROM / 可录制 CD 驱动器吗?
  6. 我可以使用 ... 模块化磁盘 / 片上磁盘吗?
  7. 我可以将 Oberon 安装到闪存中吗?
  8. 是否支持电源管理?
  9. 旧机器中安装的哪些设备可能有效?

安装

  1. 我需要花多少时间才能让 Native Oberon 系统运行?
  2. 我应该如何在机器上设置 BIOS?
  3. 我可以从大于 8GB 的磁盘上的任何分区引导 Oberon 吗?
  4. 我可以不重新分区就安装 Oberon 吗?
  5. 我可以从硬盘安装 Oberon 吗?
  6. 选择 HD 驱动程序时系统挂起
  7. Partitions.Show 指示硬盘读取错误
  8. Oberon 在 Partitions.Show 中如何分配驱动器盘符?
  9. 如何使用用户名、密码、域名访问网络服务?
  10. 如何将 Oberon 安装到索尼 VAIO 上?
  11. 启动期间的奇怪的莫尔斯电码式蜂鸣声是什么意思?

启动磁盘

  1. 为什么创建 Oberon0 启动磁盘会导致错误?
  2. 如何为现有 Oberon 创建启动磁盘
  3. 如何创建现有 Oberon(分区)的映像文件

系统启动

  1. 显示 "OBE" 后系统挂起
  2. 从 LILO 引导时,显示 "OBE" 后系统挂起
  3. 配置文件 Oberon.Text 有多特殊?
  4. 自定义 Oberon.Text 后系统无法重新启动
  5. 启动时发生 Oberon.Text 错误
  6. 启动时系统挂起并出现黑屏

系统关机

  1. 关机后系统锁定

编译器(一般)

  1. 我可以获得目标文件的反汇编代码吗?
  2. 是否有用于其他开发环境的 Oberon 编译器?
  3. 如何为新架构编写后端: ETH Oberon 编译器

文件系统

  1. 如何使用最少两个分区来组织系统
  2. 随着文件数量的增加,文件搜索会变慢吗?
  3. 文件垃圾回收何时发生?
  4. 如何将文件定向到正确的文件系统
  5. 如何挂载 FAT16 分区
  6. 如何访问备份磁盘
  7. 文件名最大长度是多少?
  8. 如何在临时文件中缓存数据
  9. 我可以在 Oberon 中处理 *.zip 存档吗?

软件开发

  1. 使用 Watson 获取的模块定义 ( .Def) 的语法是什么?
  2. 模块 SYSTEM 的定义在哪里?
  3. Oberon 在 SYSTEM 中是否公开了足够的系统功能?
  4. 如何强制 Oberon 进入“输入模式”?
  5. 如何以所需的精度输出实数值?
  6. 如何比较过程变量?

PCI 检测

  1. 如何解释使用 PCI.Mod 获得的值?

Oberon 文本

  1. 如何区分下划线和连字符?
  2. 可以修补下划线吗?
  3. 如何使用光标移动键?
  4. 如何只使用小写字母编写 Oberon 源代码?

使用 Gfx 进行 2D 图形绘制

  1. 如何在 Leonardo 中加速文本绘制?

超文本文档

  1. 如何保存浏览过的文档的源代码?
  2. 如何清除缓存?

Postscript 文件

  1. 如何打印 Postscript 文件?
  2. 是否有类似于 Postscript 文件查看器的工具?

I/O 端口控制

  1. 如何控制串行端口?
  2. 如何控制声卡?
  3. 如何控制并行端口: 串行和并行端口支持
  4. 如何控制 USB 端口: USB 支持
  5. 如何在扬声器上发出简单的声音: 扬声器支持

小工具

  1. 如何在小工具 TextField 中突破 64 个字符的限制?
  2. 如何在用户界面中插入图像?
  3. 如何在 System3.Tool 的下拉菜单中添加项目?
  4. 如何创建类似于 System3.Tool 中的下拉菜单?

Linux Native Oberon

  1. 使用操作码 OUT 时发生 TRAP
  2. 如何使用 Linux 声卡驱动程序?
  3. 如何将屏幕尺寸从当前的 1024x768 像素缩小?

Oberon for Linux (x86)

  1. 如何将屏幕尺寸从当前的 1024x768 像素缩小?

VNC 客户端

  1. Alt 键不起作用
  2. 向下箭头键不起作用
已修复的错误
  1. 当我从 AosFS 卷中删除文件时,该空间不会释放,直到卷被卸载然后再重新挂载。例如,如果我有一个已满的 AosFS 格式的软盘,我挂载该卷并删除所有文件,然后尝试将文件复制到这个“空的”软盘,结果是出现一个陷阱,指出该卷已满。如果我卸载软盘然后再重新挂载,我就可以将文件复制到该卷中。这是个疏忽吗,还是出于某种原因这样做的?
    A: 这是从 Project Oberon 中发布的 Ceres 文件系统继承来的。该文件系统仅在启动时执行垃圾回收,此时我们确定没有打开的文件。这极大地简化了垃圾回收器。旧的 Native 文件系统也是如此。当前的 beta 版本对匿名文件进行了动态垃圾回收。
  2. Windows 2000 问题。如果在安装一个(或多个)Native Oberon 后安装 W2,它会认为它找到了一个损坏的 FAT32 分区,并通过写入前几个扇区来修复它,过了一会儿 W2 就挂起了。再见 Oberon 分区!无论分区类型如何,无论是 76(新)还是 79(旧)都会发生这种情况。如果在安装 W2 后安装 Oberon,则在下一次启动时,W2 会崩溃并出现“未处理的异常”。没有 W2,Oberon 也无法完整保留。
    A: Partitions.Format 现已修复,以解决 Windows 2000 安装程序中的错误,该错误会导致它将 Native Oberon 分区“识别”为 FAT 分区。
  3. 奇怪的错误:创建一个文本文件,名为“c11936”,包含正好 11936 个字节,然后执行;
    DOS.CopyTo "c:/" c11936 ~
    系统冻结,但没有出现陷阱。Ctrl-Break 可以恢复。如果文件包含 11935 或 11937 个字符,则不会出现问题。DOS.CopyTo 从未在其他任何文件中失败。
    A: 问题实际上出在正常文件系统中。它从 Project Oberon 中发布的第一个 Oberon 系统开始就存在。当 Files.ReadBytes 读取超出大小为 n*2048-352(对于任何整数 n > 0)的文件末尾时,骑手的 .res 字段将被错误地设置。这会导致 DOS.Copy 无限循环。在新的 AosFS 中也会出现相同的错误,但发生在大小为 n*4096-568 的文件上。这两个错误现在都已修复。
  4. 使用新的 Voodoo 卡和 Vesa2 驱动程序时,System3.Tool 中的按钮有点绿色。这是一个新功能还是错误?
    A: 这是一个驱动程序错误(直到 beta000526),现在已修复。
已知错误
  1. 我的计算机配备了 Adaptec AIC-7861AHA-2940AU SCSI 控制器,它挂起了。你能帮忙吗? - Alan Freed
    A: 目前没有线索。正在调查这个问题。
  2. 安装期间发生 TRAP -7。
    A: TRAP -7 是处理器的“设备不可用”异常。这意味着遇到了浮点指令,而处理器没有实现浮点。所提到的 Cyrix Cy486SLC 没有浮点。

    实际上,这是 Native 的一个错误,因为我们已切换到 zip 格式来压缩启动磁盘。以前可以不使用浮点来启动系统,而浮点模拟器由 System 模块加载。要修复它,必须从引导过程中使用的 Zip 模块过程中删除浮点运算,或者必须将浮点模拟模块与引导文件链接。
看似问题,但不是问题
1. 从 Oberon-0 磁盘引导我的 486 笔记本电脑,该笔记本电脑有 1024 Kb 的扩展内存,结果如下:
     TRAP 14 
     ... 
     Kernel PC=9860, Kernel PC=9808, Kernel PC=10565, OFSRAMVolumes PC=461, ...
A: Oberon-0 默认情况下会创建一个 2Mb 的 RAM 磁盘。这意味着至少需要 3Mb 或更多内存才能进行安装。从技术上讲,Oberon 可以使用更少的内存运行,但这需要更新安装程序以使用更少的内存。
2. 执行 Diff.Do Empty.Display.Mod GD54xx.Display.Mod ~ 会导致:
     Call error: Disk imports incompatible version of Kernel 
          GetConfig incompatible 
          WriteString incompatible
在其他文件中也会发生这种情况。
A: 看起来你正在新系统上运行旧版本的 Diff。新的目标文件具有与旧系统不兼容的键。差异与开放数组相关,这似乎由上面列出的两个过程得到证实。
==> 你重新安装了新系统上的 apps 包吗?
 
3. 我在从 beta000320 版本创建的启动磁盘中发现了一个 parity.b 引导病毒。这是一个潜在的威胁吗?
A: 这是一个误报。病毒检测器通常使用启发式方法来“检测”病毒。在这种情况下,引导扇区看起来不像正常的 DOS 引导扇区,因此病毒检测器认为它被病毒感染了。磁盘映像文件在制作过程中不会被非 Oberon 机器触碰。一些检测器会检测到Bloodhound.Boot 病毒。
4. 当我运行 Linux 下的 dmesg 来帮助追踪我的 SCSI 问题时,我注意到以下一行:
     Intel Pentium with F0 0F bug - workaround enabled.
似乎我的电脑存在奔腾漏洞。我不知道内核是否检测到这个漏洞,如果检测到,是否会像 Linux 一样进行解决?
A: 在 Oberon 中修复奔腾漏洞可能不是必需的。从 https://en.wikipedia.org/wiki/Pentium_F00F_bug 中对该漏洞的描述来看,该漏洞的唯一影响似乎是使机器挂起。这在多用户操作系统中很严重,因为任何非特权用户都可以使机器挂起(而不仅仅是 root 或管理员用户)。
 
在 Oberon 中这不是问题,因为它是一个协作式的单用户环境。如果您不坚持使用 Oberon 语言的安全部分,还有许多其他方法可以使机器挂起。
一般问题
  1. 给一个新手一些建议,如何开始学习 Oberon
    A: 假设您对使用 Oberon 编程感兴趣,可以先阅读 N. Wirth 和 M. Reiser 撰写的《Oberon 编程》一书,以学习该语言本身。根据您的背景,这可能需要您花很少时间,尤其是在您有一些 Pascal 经验的情况下。试试这些教程:
    • Oberon 入门 由 Günther Sawitzki 编写 - http://www.statlab.uni-heidelberg.de/projects/oberon/Ito/ 一个德语版本 Einführung in die Programmiersprache Oberon 也已提供。这两个教程都包含一个名为“Oberon for Pascal Programmers”的附录。
    • Pedro G. Gonnet 为第一年计算机科学学生编写的快速简便的教程(德语)。
  2. 解释 Oberon 的编号方案。
    A: 从历史上看,Oberon 有两个独立维护的“分支”:V4 和 System 3。System 3 是 ETH 分支,由 Gutknecht 教授的小组和像布莱梅大学的 Günter Feldmann 这样的外部合作者继续积极维护。V4 由奥地利林茨大学维护。
     
    为了减少混乱,我们几年前将“Oberon System 3”重命名为“ETH Oberon”。
     
    ETH Oberon 的最新官方版本适用于各种平台,始终可以通过 Sourceforge 匿名 FTP 获取。以前在 ftp://ftp.ethoberon.ethz.ch/ETHOberon/。
  3. ETH Oberon 系统的历史背景是什么?
    A: 阅读ETH Oberon 系统白皮书
  4. 我在哪里可以找到关于 Oberon-0 的信息?
    A: Oberon-0 可以指以下三种东西
    1. Wirth 最近出版的书籍编译器构造中介绍的 Oberon 编程语言子集。德语版本。Oberon-0 包含一组最小的必要编程语言功能,例如赋值、语句序列、if 和 while 结构以及过程的概念。因此,该语言易于学习,并且表达能力足以指定应用程序进程。此外,该语言的简洁性使编译器体积小巧且效率高,这对于运行时编译和评估非常重要。
    2. Mössenböck 教授的面向对象编程在 Oberon-2 中一书中介绍的经典 Oberon 系统的子集,采用面向对象风格。德语版本
    3. 用于启动 Intel 机器以安装 Native Oberon的最小 Oberon 系统。由 Oberon0.Dsk 生成。
    最后,Oberon-00 编程语言是 Oberon 的一个子集,它被翻译成一个Lola 数据结构,程序由 Niklaus Wirth 编写。
  5. 如何从多任务处理的角度来描述 Native Oberon?
    A: Native Oberon 是一个单线程多任务系统。它有两种类型的任务:交互式任务和后台任务。交互式任务由用户使用鼠标启动的短时运行的“命令”组成,而后台任务由系统空闲循环定期调用的“处理程序”组成。

    从传统操作系统的角度来看,Oberon 系统只有一个驻留在单个进程中的执行线程。Oberon 中的过程调用是不可分割的执行单元(除了作为中断处理程序安装的过程)。

    系统范围内的中央循环(Oberon.Loop)在以下两个方面循环:
    1. 通过将消息记录广播到屏幕上的查看器来将事件分发给屏幕上的查看器。这样的广播不过是使用包含发生的事件信息的记录(通过引用传递)调用每个显示帧中安装的处理程序过程。
    2. 调用后台任务,这些任务只是包含过程指针的对象(在堆中)。该对象可以在调用之间保存过程的本地状态。安装的任务需要避免占用处理器(即及时将控制权返回给 Oberon.Loop),以便保持系统的响应能力。
    原始的 Oberon 系统已通过各种方式扩展,以允许更多任务以相同优先级运行。参见 Wirth 的“任务与线程”论文、Concurrent Oberon、ETHOS、Aos。
  6. 是否计划发布当前 Alpha ETH Oberon 的新版本?
    A: 该系统由志愿者维护。ETH 开发人员现在正在开发Bluebottle 系统,因此没有固定的发布计划。计划在 2002 年底发布新版本。它主要是一个 bug 修复和整合版本。
  7. 是否计划发布一个集成了类似 CodeWarrior、Visual C++ 或 Visual Basic 的集成开发环境 (IDE) 的 ETH Oberon 版本?
    A: Oberon 操作系统最初是在 80 年代后期开发的,早于上面提到的所有集成开发环境。它旨在成为一个极简操作系统,可以在所有级别的细节中进行研究和使用。有关其基本原理,请参阅 Wirth 和 Gutknecht 撰写的“Project Oberon”一书。Oberon 操作系统远不止一个 IDE!

    其他小组已经创建了类似 Oberon 的环境,这些环境与 Windows 紧密集成,并且可能更像传统的基于 Windows 的开发环境。以下是可以引用的:
    在 ETH,对于教学,系统首选的是原始的文本用户界面,而不是 GUI 桌面或 Windows 嵌入。如果作为没有干扰的极简系统正确展示,这在教授编程方面可能会非常成功。TUI 的操作(编辑、编译、测试)可以在一次教程中教授。
  8. Aos 与 Native Oberon 有什么不同?
    A: 在 Aos 中,活动被映射到活动对象,这些对象在多个处理器上抢占式调度。
硬件支持
  1. 是否提供类似 QNX 演示软盘的 Native Oberon 演示软盘(或 2 张软盘或一个 CD 镜像),用于测试 Oberon 并检查我的硬件是否得到良好支持?
    A: 在 ftp://ftp.ethoberon.ethz.ch/ETHOberon/Native/Update/Alpha/ 下载 Oberon0.Dsk 和 rawrite.exe。使用 rawrite.exe 将 Oberon0.Dsk 写入格式化的 1.44MB 软盘,并启动它。
  2. 支持哪些硬件?从一些文档来看,需要更多硬件支持。是否有什么计划?
    A: 查看硬件兼容性列表,其中包含有关如何编写磁盘和图形控制器驱动程序的说明,尤其是这些驱动程序。对于显示控制器,我们有一些带有真彩色支持的加速驱动程序(Permedia 2、S3Trio64)和一些没有真彩色的驱动程序(S3C805、W32、GD54xx),然后是一些适用于许多卡的通用驱动程序(VGA、VESA 2.0、VESA 3.0)。一直在添加更多显示驱动程序。
  3. 是否提供用于编写驱动程序的 SDK?
    A: 没有。最好的信息来源是现有“模型”驱动程序的源代码。目的是确定驱动程序中的最佳驱动程序,并让这些驱动程序成为示例。
  4. 我可以使用...吗?
    A:
  5. 我可以使用...吗?
    A:
  6. 我可以使用...?
    A:
    • 磁盘模块 - DOM:是 - 磁盘支持

      Michael A. McGaw 关于此主题的报告
      我一直使用磁盘模块,型号为 DOM-4-40V,由 ADLink Technology, Inc 生产。这些模块本身带有 IDE 连接器,因此直接插在主板的 IDE 连接器上(不需要 IDE 线,也不需要任何特殊的安装硬件/位置)。有一个 Molex 电源连接器,必须连接到 PC 电源的 Molex 连接器之一。就这样。它们工作正常;我在 Tyan 和 DFI 主板上使用了大量此类模块(目前用于基于 DOS 的应用程序)。它们似乎也能很好地与 Oberon 协同工作。我已经在该模块的 4 MB 版本上运行了稳定的原生版本(不是 beta 或 alpha 版本;我没有尝试过这些版本,尽管我认为它们也会很好)。对于此系统,我拥有非常紧凑且高效的模块组合,使我能够进行开发,尽管这是旨在作为仅运行时的目标环境,由通过以太网上的 UDP 与目标进行通信的 Windows 应用程序远程控制。您建议使用 8 MB 模块的建议很好。

    • 磁盘芯片 - DOC:否 - 磁盘支持
  7. 我可以在闪存中安装 Oberon 吗?
    A:不能,下载版本不行。但 Radiar 为其 C2 板上使用的英特尔 DA28F640JS 闪存 PROM 内存开发了定制解决方案,包括 OBL。此板是为 Colortronic 公司制造的。在该工业系统中,没有 Gadget 的底层应用程序使用具有 1.3 MB 的文件系统。一个简单的带有 Gadget 的应用程序使用不到 4 MB 的内存。
  8. 是否支持电源管理?参考笔记本电脑。
    A:支持简单的电源管理。在空闲循环期间,Oberon 执行 HLT 指令,该指令停止处理器,直到下一个中断(例如计时器、鼠标或键盘中断)。这节省了大量的电源。原生 Oberon 已经使用高级电源管理 (APM) 规范在关机期间关闭机器。将来,我们可能会考虑使用 ACPI。
  9. 较旧机器中安装的哪些设备可能有效?我想把它变成一台专门的原生 Oberon 机器。
    A:该机器具有
    • 两个 IDE 硬盘:标准 ATA/EIDE 驱动程序可能会成功使用。否则,可以重新启用/刷新早期版本中包含的标准 IDE 驱动程序,用于真正的旧控制器。不过,只能使用一个驱动器。
    • 一块 Adaptec AVA-1505:可能无法工作。支持 AHA-1520。
    • 一块 ATI Mach 64 显卡:在 1024 x 768 x 8 模式下无法工作,因为我们希望它能这样工作。vesainfo.exe 显示
     
    VESA 1.2 512kb ATI MACH64
     
    100 C000:4DC9 A000 W A000 R 64K 64K 640x400x8
    101 C000:4DC9 A000 W A000 R 64K 64K 640x480x8
     
    但即使如此,请阅读有关 显示支持 的内容。
    更一般地说,请查阅 硬件兼容性列表
安装
  1. 我需要投入多少时间才能让原生 Oberon 系统运行起来?
    A:以下步骤所需的时间
    • 可选:组织您的机器以接受 Oberon,使其与已安装的操作系统共存于专用分区中。考虑购买商业软件以完成此步骤。其中,PartitionMagic 是一项不错的投资。
    • 下载您选择的实现文件。至少 3 MB,最多 10 MB。
    • 在您的平台上解压缩软件,有时需要创建启动软盘。这是有效的安装过程,大约需要 10 分钟。
    • 通过编辑 Oberon.Text 对 Oberon 系统进行自定义,遵循 System.Text 中的说明。
    • 可选:在已完全功能的编程环境之上安装 Oberon 包。每个包的安装时间不超过几秒钟。
  2. 我该如何在我的机器上设置 BIOS?
    A如何设置 BIOS
  3. 我可以在大于 8GB 的磁盘上的任何分区启动 Oberon 吗?
    A8.4GB 硬盘容量限制
  4. 我可以在不重新分区的情况下安装 Oberon 吗?
    A:可以,在以下情况下
    1. 针对 初学者的原生 Oberon 版本 可以安装在具有 40MB 或更多可用空间的 FAT16 分区中。FAT32 支持正在开发中。 文档
    2. 基于 Linux 的原生 Oberon 可以安装在现有的 ext2 分区中。
    3. 至少 40MB 的现有且完全空闲的分区可以专门用于 Oberon。
  5. 是否可以从硬盘启动和安装 Oberon?我这里有一台笔记本电脑,我想安装 Oberon,但它没有软盘驱动器,而且我没有 ide<->mini-ide 线(找不到供应商)。
    A:可以,但只能使用最新发布版本,不能使用新的 beta 版本。参见
    ftp://ftp.ethoberon.ethz.ch/ETHOberon/Native/DosBased/ [已过期]
    稍后 beta 版本也将支持从非软盘介质安装。
  6. 当我尝试从 Oberon-0 中选择 Adaptec 驱动程序时,系统会冻结。
    A:有时初始化驱动程序可能需要很长时间,因为会扫描 SCSI 总线。尝试等待最多一分钟以完成此操作。
  7. 我尝试安装新的 beta 版本,当我从 Oberon-0 启动并使用 Partitions.Show 时,我的第一个 IDE 硬盘读取时出现读取错误 2,第二个驱动器读取正常,但我使用 Partition Magic 4.0 在第一个驱动器上释放了空间以安装它。为什么它没有被正确读取?
    A:在配置磁盘驱动程序之前,在 Oberon-0 中执行 System.OpenKernelLog。配置并运行 Partitions.Show 后,存储 Kernel.Log 并将其传输到软盘(参见 Install.Tool 的附录 C),并将文本邮件发送给我。ATA 磁盘错误记录在 ATADisks.Mod 模块的末尾。
  8. Oberon 在 Partitions.Show 中如何分配驱动器盘符?
    A:自从引入可挂载文件系统以来,就不再使用驱动器盘符了。在当前 Alpha/Beta 版本之前的版本中,通过从 C: 开始并依次扫描所有分区表以查找类型为 1、4 或 6 的分区,将驱动器盘符分配给 FAT 分区。如果有多个磁盘可用,则首先扫描 IDE 磁盘,按照主磁盘、从磁盘、次主磁盘和 then 次从磁盘的顺序进行扫描。然后扫描所有 Adaptec SCSI 磁盘,按照总线顺序进行扫描,最后扫描 USB 设备,按照初始化顺序进行扫描。
  9. 我如何使用用户名、密码和域名访问网络服务?
    A:必须在 Oberon.Text 的 NetSystem 部分配置通信适配器。NetSystem.SetUser 命令用于访问服务。有许多方法可以自定义访问过程:从偶尔访问到更永久的设置。在以下说明中,我们假设密码始终以不可见模式输入,由系统提示控制。
    1. 通过其 URL 指定文档并打开它 - 例如 ftp://[email protected] ~
      系统日志中将显示以下内容
      NetSystem.SetUser ftp:user@server ~
      - 未指定密码或用户名
      ftp://[email protected] 加载文档失败
       
      现在,执行 NetSystem.SetUser 命令,并在提示符后输入密码。最后,打开文档。
    2. 在尝试通过其 URL 打开文档之前,执行 NetSystem.SetUser。同样,日志中会显示一个提示消息,要求输入密码。现在,打开所需的文档。
      可以在 SetUser 命令之后指定 URL 列表,以便一次设置多个密码。用至少一个空格分隔密码。如果 URL 的数量超过密码的数量,则最后一个密码将应用于剩余的 URL。
      执行 NetSystem.Show 以显示 NetSystem 的状态,包括为哪些用户输入了密码。密码永远不会泄露。
      执行 NetSystem.ClearUser 以清除所有密码。
    3. 编辑 Oberon.Text,在 System.InitCommands 部分添加 NetSystem.SetUser 命令。同样,可以在 SetUser 命令之后指定 URL 列表。对于到目前为止介绍的所有过程,密码可以包含在 URL 中(例如 ftp://user:password@server),但要注意可怕的安全漏洞!!!有关命令语法的更多信息,请参阅 NetSystem.Tool。
  10. 我该如何在索尼 VAIO 上安装 Oberon?
    A:困难在于 Oberon 尚未支持 PCMCIA。假设在 Windows 下存在一个空闲分区和一个 FAT167FAT32 分区,可以绕过此困难。
    1. 在 Windows 中,安装 Oberon Dummy(从 VIS CD-ROM 或下载它),并使用通过 USB 连接的软盘驱动器制作可启动软盘。
    2. 将通过 ftp 获得的 Aos 安装文件复制到 FAT 分区中的一个目录中。
    3. 从刚创建的软盘启动 Oberon。可能需要停用 VAIO BIOS 的即插即用选项,以便 Oberon 能够识别 USB 软盘驱动器。
    4. 挂载包含 Aos 安装文件的 FAT 分区。
    5. 打开 AosInst.Tool(位于这些安装文件中)。
    6. 遵循 AosInst.Tool 中的说明。
  11. 启动期间出现的奇怪莫尔斯电码般的蜂鸣声是什么意思?
    A:旧版本的原生 Oberon 在启动期间发生不可恢复的错误时会生成莫尔斯电码。莫尔斯电码实际上可以提供有关错误位置的有用信息,但在更高版本中,这种声音信号已被删除,因为很少有人能够破译代码,而且大多数人似乎都被它吓了一跳。问题可能与缺乏协处理器有关,如旧笔记本电脑 Compaq Conture 4/25CX 中报告的 i486SX 主板上所述。某些版本的 Native 不会在引导文件中包含浮点仿真器。请尝试使用在 Sourceforge 上可下载的最新 Alpha 版本。
启动磁盘
  1. 为什么创建 Oberon0 启动软盘会以错误结束?无法写入最后一个块。软盘容量已超过。
    A:确保以二进制模式传输 Oberon0.Dsk 文件。一些 FTP 客户端默认使用 ASCII 模式,该模式会将 CR 转换为 CR-LF。将下载的文件大小与服务器上的文件大小进行比较。如果您拥有正在运行的 Oberon 系统,请使用它。ftp 查看器可以清楚地区分“二进制”和“ascii”。
  2. 我该如何为现有的 Oberon 系统创建启动软盘?
    A:如果在安装过程中没有创建可启动软盘,则必须启动 Oberon-0 系统并执行 .Tool 文本中列出的少量命令。
    1. 执行与您的磁盘控制器相对应的 Config.Disk 命令
    2. 执行:Partitions.Show 并选择相关分区
    3. 通过执行以下命令挂载该分区:OFSTools.Mount DST AosFS ^
    4. 打开 Configure.Tool 以配置系统(至少要配置显示卡和键盘)
    5. 通过执行以下命令创建软盘:Config.BootDiskette
  3. 如何创建现有 Oberon(分区)的映像文件。
    A: 使用 Partitions.PartitionToFile 命令创建 Oberon 分区映像文件,包括软盘上的分区,如 ETH Oberon 简介 中所述。使用对应命令 Partitions.FileToPartition 还原分区。例如:以这种方式创建和还原安装基础上的 Oberon0.Dsk 软盘映像文件。
系统启动
  1. 我的启动管理器设置为启动 Oberon,但在启动时系统在显示字符“OBE”后冻结。出了什么问题?
    A: 这意味着 OBL 启动加载程序的第二个块未正确加载。
  2. 我在 IDE 控制器 2 上安装为 MASTER 的硬盘的逻辑分区中成功安装了最新的 beta 版。在 Linux 下,我更新了 /etc/lilo.conf 并调用了 lilo,它确认添加了 linux * oberon。但是当我想要从 LILO 启动时,我只得到“OBE”,系统挂起。是什么导致了这种情况?
    A: 从第二个硬盘启动 Native 只有在以下情况下才有可能
    • 使用支持链式启动的启动管理器(例如 LILO)
    • 使用支持此功能的 BIOS
    • 使用 Native 启动软盘
    • 使用 noboot.exe
    如果您的启动加载程序不支持“链式启动”以从第二个驱动器启动分区,您可以尝试使用 Norton Disk Editor 等扇区编辑器“修补”Oberon 分区的引导扇区。引导扇区中偏移量 24h 处的字节应设置为 81h 而不是 80h,以从第二个硬盘启动。为了确保您修改的是正确的扇区,请检查字符串“OBERON”是否出现在扇区中的偏移量 3 处。
  3. Oberon.Text 是否是一个异常/特殊/怪异的文件,它必须根据用户的需求进行定制?
    A: 否,它是一个非常普通的文本,但将小部件嵌入其中会使系统从 Oberon 启动时加载比预期更多的系统资源。它必须在安装过程中进行定制,之后偶尔才需要定制。顶部的 InitCommands 部分是最有可能需要编辑的部分,例如添加在系统启动时自动执行的命令。
  4. 我已经定制了 Oberon.Text 的 InitCommands 部分,现在当我重新启动系统时,没有出现查看器。如何恢复?
    A: 您在文本中输入了错误。按 Ctrl-Break 获取陷阱查看器。现在,您可以输入命令再次打开 Oberon.Text 并修复错误。检查所有 { 和 } 字符是否匹配。
  5. 启动后,我的 System.Log 如下所示
    System.Time 2000 年 3 月 21 日 16:14:52
    ETH Oberon / PC Native 2000 年 3 月 20 日
    Oberon.Text - Gadgets.Aliases 未找到
    Oberon.Text - Gadgets.Documents 未找到
    Oberon.Text - Gadgets.DocumentServices 未找到
    A: 这看起来像是 Oberon.Text 中的语法错误。同样,请检查所有 { 和 } 字符是否匹配。
  6. 我尝试在我的旧 386SX 上安装新的 beta 版。它有一个 IDE 磁盘和一个额外的旧 Adaptec SCSI 控制器,带有磁盘和 CD。出现带有白色边框的黑色屏幕,但随后什么也没发生,系统挂起。
    A: 它有显示“OBERON 加载中…”吗?OBL> 提示符出现了吗?软盘灯亮了吗?如果 OBL> 提示符出现,请在“c”之前尝试“Init=9090”,查看显示屏上是否出现一些有用的错误消息。
系统关机
  1. 我注意到当我通过 Shutdown 退出时,系统锁定。Ctrl-Brk 和 Ctrl-Alt-Del 无效。
    A: 这可能是用于关闭计算机的 APM 代码存在问题。尝试设置配置字符串“APM=0”以禁用它。
编译器(一般)
  1. 我可以获取目标文件的反汇编吗?我对查看 Oberon 编译器生成的代码感兴趣。我特别感兴趣的是 PowerPC 和 Intel 代码生成器。
    A: 使用 Decoder 工具反汇编 Native Oberon 或 Linux Native Oberon 目标文件。语法:Decoder.Decode some.Obj 打开一个文本查看器“Decoder.Dec”,显示反汇编代码。您可以在 System3.Tool 中的“浏览器”弹出菜单中调用该命令。
     
    Native Oberon 对象文件格式 (OFF) 是 Windows Oberon OFF 的演变,只有很小的区别。符号文件信息(文件扩展名为 .Sym)现在包含在目标文件中,并且已扩展为包含 Active Oberon 和 OberonX 语言扩展。 文档(html,pdf,ps 可用)。
  2. 是否有适用于其他开发环境的 Oberon 编译器?
    A: 可以引用来自英国牛津大学的 Oberon-2 编译器
    此外,请查看 BlackBox 和 POW! 系统。
文件系统
  1. 我至少想要创建两个独立的分区:SYS 和 USR。拥有 APPS 分区也很有用。我该怎么做呢?
    A: 请阅读“一台机器上的多个 Oberon 分区”部分中的“ETH Oberon 简介”。
  2. 当在文件系统中创建了非常多的(>10000)文件时,Oberon 系统会发生什么?文件搜索会变得太慢,以至于用户必须等待打开文件吗?如果不是,为什么?
    A: 不会。请阅读“文件目录”部分中“ETH Oberon 简介”中的详细解释。
  3. 我知道 Native Oberon 垃圾收集器是标记-清除,而不是复制,但是它是否会移动对象,例如如果内存变得过度碎片化,则对其进行压缩?
    A: 不会,对象不会被标记/清除收集器移动。为了避免在不断分配内存的程序中出现碎片,请定期调用垃圾收集器 (Oberon.Collect) 以释放未使用的内存。不过,请避免过度调用它,因为它确实需要几毫秒才能运行,具体取决于堆上可达对象的数量。
  4. 我有很多 .Arc 文件需要移植。我已经将它们放在我想要卷中,但是当我解压缩它们时,它们会写入 SYS: 卷。
    A: 使用 OFSTools.SetDefault.
  5. 如何挂载 FAT16 分区?
    A: 从 2000 年 12 月 8 日的 beta 版开始,可以在 FAT16 文件系统中嵌入 Oberon 系统。这使得无需创建专用 Oberon 分区即可安装 Oberon 系统成为可能。此功能在早期版本中存在,后来被暂时放弃,现在已恢复。现在可以完全支持挂载 FAT12、FAT16 或 FAT32 分区。
  6. 我有许多初始化为 Native Oberon 软盘的软盘。当我将其中一个放入驱动器 A 并执行
    OFSTools.Mount A NatFS Diskette0 ~
    System.Log 读取“A: OFSDiskVolumes: 未找到设备 Diskette0”。我做错了什么?
    A: Backup.Format 与 Partitions.Format 不兼容。使用 Backup 工具访问 Backup 格式的软盘。也许有人可以将 Backup 工具集成到文件系统中。
  7. 文件名最大长度是多少,允许使用哪些字符?
    A: 这取决于挂载的特定文件系统。原始 Oberon 文件系统具有以下特征:每个名称最大 31 个字符(不包括尾部的 0X)。名称必须以字母字符开头,并且只能包含字母数字字符和“.”。
  8. 如何在临时文件中缓存数据。
    A: 在 Native Oberon 中,我们使用所有临时文件以“Temp”开头的约定。如果需要大量临时文件,我们建议将临时文件命名为 TempApplicNNNNNNNN,其中 Applic 唯一标识应用程序,NNNNNNNN 是一个十六进制的唯一数字(可能初始化为启动时的日期/时间,然后依次递增)。当然,您需要在覆盖文件之前检查文件是否存在。如果可行,最好使用匿名文件 (Files.New(""))。
  9. 我可以在 Oberon 中处理 *.zip 存档吗?
    A: 正在准备对打开 zip 存档和提取文件的大量支持。Unzip 工具存在了一段时间,但已被删除,因为它偶尔会出现问题。传统的 Oberon *.Arc 文件将被节省空间的 zip 存档替换。在 ZIP.Tool 中有记录。
软件开发
  1. 使用 Watson 获得的模块定义 ( .Def) 的语法是什么?
    A: 请参阅 语言的 EBNF 定义.
  2. 我尝试过 Watson.ShowDef SYSTEM,但它失败并显示错误消息“无可用信息”——在哪里可以找到有关 SYSTEM 导出的所有函数的完整描述?
    A: 请参阅 SYSTEM
  3. Oberon 在 SYSTEM 中是否公开了足够多的系统功能,以允许我想要进行的内存操作?
    A: 是的。请注意区分 SYSTEM 和 System 模块。SYSTEM 是一个伪模块,其调用由编译器内联编译。System 是一个系统“工具箱”模块,提供基本系统函数,例如 Directory、ShowModules 等。模块 SYSTEM 公开了完整的内存,并允许进行不安全的类型转换。使用时要小心,因为如果使用不当,它很容易使整个系统崩溃。这有点像用 C 编程 :-)
4.  如何强制 Oberon 进入“输入模式”。
A: 本质上,Oberon 是非模态的。人们可能希望将其强制进入某种模式,但只有在特殊情况下才会这样做。例如,在输入密码或一组值时,可能需要“输入模式”,如以下提示模块中所建议的那样。命令 NetSystem.SetUserEditKeys.GetKeyCode 具有输入模式。
       MODULE Prompt;  (* inspired from NetSystem.SetUser *)
       IMPORT Input, Texts, Oberon; 
       VAR 
          W:  Texts.Writer; entered: ARRAY 64 OF CHAR; 

          (* The parameter "show" controls the appearance of the characters typed, for secrecy purposes. *) 
          PROCEDURE InputMode(prompt: ARRAY OF CHAR; show: BOOLEAN; VAR str: ARRAY OF CHAR); 
          VAR i: LONGINT; ch: CHAR; 
          BEGIN 
             Texts.SetColor(W, 1); Texts.WriteString(W, prompt); Texts.SetColor(W, 15); 
             Texts.Append(Oberon.Log, W.buf); 
             Input.Read(ch); i := 0; 
             WHILE (ch #; <span id=""></span>0DX) & (ch # 1AX)  DO 
                IF ch = 7FX THEN   (* Use backspace to correct the current input *) 
                   IF i > 0 THEN 
                      Texts.Delete(Oberon.Log, Oberon.Log.len-1, Oberon.Log.len); 
                      DEC(i) 
                   END 
                ELSE 
                   IF show THEN Texts.Write(W, ch) ELSE Texts.Write(W, "*") END; 
                   Texts.Append(Oberon.Log, W.buf); 
                   str[i] := ch;  INC(i) 
                END; 
                Input.Read(ch)
             END;
             str[i] := 0X;
             Texts.WriteLn(W);  Texts.Append(Oberon.Log, W.buf) 
          END InputMode;

          PROCEDURE Prompt*; 
          BEGIN 
             InputMode("Enter data: ", TRUE, entered); (* use for entering a password *) 
             REPEAT InputMode("Enter data: ", TRUE, entered) UNTIL entered = "q" (* use for a set of values *) 
          END Prompt; 

       BEGIN 
          Texts.OpenWriter(W)
       END Prompt.

5.   如何以所需的精度输出实数值(例如,不是 1.E+03 而是 1037)。
A: 使用过程 Out.RealFix (x: REAL; n, f: INTEGER); 以 n 个字段位置的定点表示法输出实数 x,并具有 f 个小数位。LongRealFix 也存在。在用于 Windows 或 Linux 的 Oberon 中,必须打开一个查看器并在程序控制下写入编辑后的值。
6.   如何比较过程变量。Oberon 仅允许将过程变量与 NIL 进行比较。
A: 可以通过这种方式比较过程变量
       MODULE Temp; 
         VAR p, q: PROCEDURE;
         PROCEDURE P;
         END P;
       BEGIN
         p := P; q := P;
         (*IF p = P THEN END;*)  (* does not compile *)
         IF p = q THEN END  (* but this works *)
       END Temp.
PCI 检测
  1. 我发现 PCI.Mod 模块很容易使用。但是,当我读取我拥有的卡的基地址时,我发现值偏离了 1。为什么?
    A: 这是正确的。PCI 模块直接访问 PCI BIOS32,无需进一步解释结果。请参阅 PCI 规范第 6.2.5.1 节(我们拥有版本 2.0)。如果基地址的最低位为 1,则表示 I/O 空间寄存器,位 1 保留。如果最低位为 0,则表示内存映射寄存器,位 1-2 表示位置,位 3 表示内存是否可预取。其余位是实际的 I/O 或内存地址。
Oberon 文本
  1. 使用 Unix 文件名,很难区分连字符 "-" 和下划线 "_"。有没有可能在下一个版本中修复它?或者至少给出它必须这样做的原因?
    A: 尚不清楚为什么将短连字符映射到下划线 ASCII 字符。作为解决此类问题的快速变通方法,请在系统工具中保留一些 Courier10 文本,您可以使用它来快速重新格式化并显示任何其他文本中的下划线
    1. 使用 MR 拖动选择目标文本
    2. 在 Courier10 文本上进行 ML-MR 互点
  2. 如果下划线要保留下来,是否可以有人给我们提供一个工具来修补字体文件,以便我们得到一个真正的下划线?我想这不会花超过几个小时的时间。
    A: 尝试 Apps 包中的 FontEditor。 文档; 以前在 http://www.ethoberon.ethz.ch/ethoberon/tutorial/FontEditor.htm [已过期]。

    也许有人也可以生成一套新的 Oberon 字体来映射 ISO Latin-1 字符集。这可以使用程序来完成,我们建议将新字体重命名以避免冲突。有关字体文件格式,请参见 Source1.Arc 中的 Fonts.Internalize 过程。

  3. 原生 Oberon 运行良好,但无法使用光标移动键控制光标。我需要调整/设置什么才能启用这些键?
    A: 默认文本编辑器只支持使用鼠标定位。要安装更高级的编辑器,请执行 ET.ReplaceSystemEditor。您也可以将此命令放在 Oberon.Text 的 System.InitCommands 部分中,以使其自动执行。如果您已安装 Gadgets 包,请执行 TextDocs.ReplaceSystemEditor 命令以安装更好的编辑器。
  4. 如何只使用小写字符编写 Oberon 源文本。患有 RSI 的人可能希望这样做。
    A1: 修改编译器模块 OPS(扫描器)。
    1. 创建一个过程“Check”
      PROCEDURE Check(ident, keyword: ARRAY OF CHAR): BOOLEAN; 
      BEGIN 
          i := 0; 
          WHILE ident[i] # 0X DO ident[i] := CAP(ident[i]) END; 
          RETURN ident = keyword 
      END Check;
    2. 在 OPS.Get 中,为每个字母更改
      | "B": Identifier(s);
          IF name = "BEGIN" THEN s := begin
          ELSIF name = "BY" THEN s := by
          END

      | "B", "b": Identifier(s);
          IF Check(name, "BEGIN") THEN s := begin
          ELSIF Check(name, "BY") THEN s := by
          END

      重新编译 OPS.Mod。请注意,内置类型(CHAR、INTEGER 等)未定义为关键字。如果您也想重命名它们,您将在 OPT.Mod(符号表)中找到它们的声明。建议是拥有大写和小写版本,以便您仍然能够编译发布程序。

      在 OPT.Mod 模块体中,为每个类型声明添加类似于此的别名

      EnterTyp("CHAR", Char, OPM.CharSize, chartyp, SFtypChar);
      EnterTypAlias("char", chartyp);
    A2: 使用 RX 正则表达式工具将源文本中的小写关键字转换为大写关键字。
    RX.SetSearch "begin"
    RX.SetReplace "BEGIN"
    RX.ReplaceAll filename | *
    

    使用一个脚本,每个关键字有一个条目。然后,使用 Configuration.DoText 脚本名称 ~ 执行它

    A3: 使用 EditKeys 工具,允许用户定义个人快捷键。例如,如果您键入“XYZ:M”并按插入键,EditKeys 会将其替换为
    MODULE XYZ;
        ....
    END XYZ.

    您可以在 EditKeys.Text 中添加自己的宏,例如 integer(“INTEGER” write)。在“integer”后按“Insert”键会将其更改为“INTEGER”。

    最后,希望有人能将这些脚本提交为贡献。

使用 Gfx 进行 2D 图形绘制
  1. 如何在 Leonardo 中加速文本绘制?Leonardo 是一个不错的矢量图形工具,但是,在当前的实现中,文本绘制非常慢。当我第一次打开示例图形 Leonardo.Fig 时,我注意到“Welcome To”这两个字是如何缓慢地绘制到屏幕上的。我最初以为这是某种动画“功能”。但很快我意识到,如果您使用较大的文本字体(超过 20 点),Leonardo 就会变得非常慢。
    A: 建议的解决方法是编辑文件 LeoCaptions,将以下行
    Gfx.DrawStringAt(msg.ctxt, 0, 0, cap.text^);

    替换为以下行

    Gfx.Begin(msg.ctxt, {Gfx.Stroke, Gfx.Fill}); 
    Gfx.ShowAt(msg.ctxt, 0, 0, cap.text^); 
    Gfx.End(msg.ctxt);
    文本绘制速度将显着提高。这是解释:通过在渲染模式中包含 Gfx.Stroke,您强制 Gfx 将文本中字形的轮廓附加到当前路径,然后填充和描边它们。如果您在渲染模式中只有 {Gfx.Fill}(如 Gfx.DrawStringAt 所做的那样),Gfx 会直接将预渲染的缓存字形位图复制到屏幕上,因为这通常快得多。但是,在 Windows Oberon 中,当没有匹配的 Oberon 位图字体时,此假设就会失效,因为只有这些字体可以快速渲染。如果没有 Oberon 位图字体,GfxDisplay 驱动程序必须从屏幕内存中读取像素,将字形位图复制到它们上面,并将它们写回屏幕。不幸的是,在 Windows 上,从帧缓冲区读取像素非常慢。这个问题在原生 Oberon 中不存在。

    上述解决方案使用当前描边颜色描边字符,并使用当前填充颜色填充它们。如果当前描边颜色和填充颜色不同,上述解决方法会导致所有字符周围出现可见的轮廓。为了避免这种效果,Gfx 必须被强制使用轮廓字体,而无需实际描边轮廓。这可以通过首先将字符轮廓记录在路径中,然后填充该路径来实现,如以下算法所示

    Gfx.Begin(msg.ctxt, {Gfx.Record}); 
    Gfx.ShowAt(msg.ctxt, 0, 0, cap.text^); 
    Gfx.End(msg.ctxt); 
    Gfx.Render(msg.ctxt, {Gfx.Fill});

    这应该至少与最初建议的解决方案一样快。但是,有一个警告:小尺寸的文本可能看起来很糟糕,因为它直接从相应的字体轮廓渲染,没有任何提示。
超文本文档
  1. 如何保存浏览文档的源文本。
    A1: 执行 HTMLDocs.ShowHTML *。将打开一个文本文档查看器,显示 HTML 源文本,然后可以使用 [Store] 保存它。文档必须完全下载才能存储。参见 HTTP.Tool
     
    A2: 选择一个超链接并执行 HyperDocsTools.Fetch localname ~。将获取具有所选 URL 的文档,并将其存储在本地文件“localname”中。参见 HyperDocs.Tool
     
    A3: 这两个命令都可以在 GUI HyperDocs.Panel 中找到。
     
  2. 如何清除超文本文档缓存?如果我在不重启的情况下重新获取文档,该文档不会从网络中检索。
    A: 使用以下两种方法之一
    1. 执行 HyperDocs.ClearCache
    2. 打开 HyperDocs.Panel 并单击 [Clear Cache] 按钮
    3. 打开文档并单击 [Reload] 按钮
PostScript 文件
  1. 如何打印 PostScript 文件?
    A: 要将文件直接发送到 PostScript 打印机,请使用(在 Miscellaneous.Tool 中):Miscellaneous.PrintFiles LPT1 {file} ~
  2. 是否有像 Oberon 的 Postscript 文件查看器(相当于 Windows 的 ghostview)这样的东西?
    A: 没有。
I/O 端口控制
  1. 如何控制串行端口 RS-232。
    A1: Oberon 包含了控制串行端口所需的一切,无需进一步操作。请参阅原生 Oberon 中的 Applications.Tool -> V24Terminal。使用 V24.Panel 可以轻松地控制串行端口,无需编程。非常适合对调制解调器进行 AT 命令测试,或通过串行控制端口(控制台端口)设置路由器,如 原生 Oberon 安装文档(连接部分)中所述。
     
    未记录的 V24Log.Mod 是一个小型应用程序,它将到达串行端口的所有内容复制到 System.Log。在源文本的末尾可以找到使用它的示例。
     
    A2: 在您自己的程序中使用 V24.Mod 模块中的过程。
     
    A3: 当前的 V24 模块只支持两个“标准”固定端口
    COM1: 3F8H / IRQ 4 和 COM2: 2F8H / IRQ 3。Alpha 版本扩展到也支持 COM3 和 COM4。请参阅 串行和并行端口支持
  2. 如何控制声卡。
    A: 通过查看 PC 原生 Oberon 中 Sound.Mod 模块的源文本获取一些灵感。在 ETH Oberon for Windows 中,Win.Audio.Arc 是要寻找的地方。注意:Windows 实现中的一些模块不可移植(使用选项 \N 编译)。
小工具
  1. 当我定义按钮的 Command 字段时,很快就会达到 Columbus 中 TextField 可用的 64 个字符的最大长度。是否可以将 MaxLen 增加到 96 或 128?
    A: 无论使用哪个数字,对于某些人来说,它总是太小了。最好用其他方式解决问题,例如,让命令直接从相关对象读取您的参数。使用 Gadgets.FindObj(Gadgets.context, "ObjName") 查找对象,然后使用 Attributes.GetXXX 读取属性值。然后,您每个参数有 64 个字符,而不是所有参数加起来。

    如果您确实需要在命令中使用更多字符,请将小部件的 Cmd 文本字段替换为最多 10 个字段,并在您的某个模块中插入以下命令过程

    (** Glue together the attributes Cmd0 to at most Cmd9 of the gadget and 
        execute the resulting string. Macros are expanded. 
        This helps when the Cmd attribute limited to 64 characters is too short.  *)
    PROCEDURE ExecAttrCmds*; 
    VAR 
         cmd, cmdN: ARRAY 1024 OF CHAR; cmdName: ARRAY 8 OF CHAR; 
    BEGIN 
         cmd := ""; cmdName := "Cmd0"; 
         LOOP 
              Attributes.GetString(Gadgets.executorObj, cmdName, cmdN); 
              IF (cmdN = "") OR (cmdName[3] > "9") THEN EXIT; END; 
              Strings.Append(cmd, cmdN); cmdName[3] := CHR(ORD(cmdName[3])+1); 
         END; 
         Gadgets.Execute(cmd, Gadgets.executorObj, Gadgets.context, NIL, NIL); 
    END ExecAttrCmds;
    
  2. 我正在尝试为开发中的用户界面提供良好的外观,并希望导入一些图像以将其放入我的界面(例如)作为背景图像。在 Oberon 中实现这一点的最佳方法是什么?
    A: 如果您的用户界面驻留在面板上,您需要将面板的“图片”链接设置为图片。以下是一个具体的示例
    1. 打开 Clown.Pict 并选择帧
    2. Columbus.Inspect ~(您应该看到一个 Rembrandt.New 生成器)
    3. 按下链接按钮以查看“模型”链接。
    4. 选择您的面板并执行另一个 Columbus.Inspect ~(Panels.NewPanel 生成器)
    5. 按下链接按钮以查看“图片”链接(其中有一个十字)
    6. 在 Rembrandt.New 的“模型”链接上进行 MM-MR 交叉点击,然后将其拖放到 Panels.NewPanel 的“图片”链接上。十字应变成一个带有小圆圈的方框。
    7. 按下“应用”按钮。您的面板现在应该有一个小丑背景。
  3. 如何在 System3.Tool 的下拉菜单中添加项目?.
    A:
    1. 将带有下拉菜单的图标工具的深层副本复制到工作区。
    2. 选择已复制的图标工具并将插入符设置在工作区中。
    3. 执行 Icon.Break 以将图标工具拆开。两侧将插入插入符处。
    4. 使用 Columbus 编辑“打开”侧,添加新条目。列表容器通常被锁定。
    5. 通过将“关闭”组件放到其中来重建图标工具,然后翻转图标工具,最后将“打开”组件放到其中。
    6. 将完成的图标工具复制到 System3.Tool。
  4. 如何创建类似于 System3.Tool 中的下拉菜单?.
    A:
    1. 交互式地,在工作区中,结合使用 Columbus 和 Gadgets.Panel。
    2. 编写图标工具及其组件的 LayLa 描述。参见《奥伯龙伴侣》第 6 章 - 奥伯龙中的 Chapter6.Text。

    示例

    LayLa.OpenAsDoc
    { Example of drop-down menu Iconizer à la System3.Tool. } 
    (CONFIG 
      (DEF width 60) 
      (DEF height 24) 
      (DEF ClosedSide 
        (VLIST Panel (w=width h=height hjustify=CENTER vjustify=CENTER) 
            (ATTR Locked=TRUE) 
          (NEW Caption (ATTR Value="Menu")) 
        ) 
      ) 
      (DEF OpenSide 
        (VLIST Panel (w=width h=100 border=1 dist=1) (ATTR Locked=TRUE) 
          (NEW Button (w=[] h=height) (ATTR Caption="Text1" Cmd="...")) 
          (NEW Button (w=[] h=height) (ATTR Caption="Text2" Cmd="...")) 
          (NEW Button (w=[] h=height) (ATTR Caption="Text3" Cmd="...")) 
          (NEW Button (w=[] h=height) (ATTR Caption="Text4" Cmd="...")) 
          ) 
      ) 
      (NEW Iconizer (w=60 h=24) (ATTR Popup=TRUE Menu=TRUE) 
        (LINKS Closed=ClosedSide Open=OpenSide)) 
    )
    
Linux Native Oberon
  1. 每次在 Linux 的 Oberon 中使用操作码 OUT 时我都会被困住。为什么?
    A: 要在 Linux 中使用 IN 和 OUT 汇编指令,您需要执行此操作的权限。作为 root 用户,您的程序可以使用 ioperm 或 iopl 设置权限。
    尝试 1 到 3 之间的级别。默认级别为 0。成功时,将返回零。
            PROCEDURE iopl( level: LONGINT): LONGINT; 
            CONST IOPL= 110; 
            CODE {SYSTEM.i386} 
                 MOV     EAX, IOPL 
                 MOV     EBX, level[ EBP] 
                 INT     80H 
            END iopl;
  1. 我如何使用 Linux 声音驱动程序?
    A: 当前未实现声音。欢迎志愿者。
  2. 如何将屏幕尺寸从当前的 1024x768 像素缩小?
    A: 编辑 oberon.cnf 中的宽度和高度。
Oberon for Linux (x86)
  1. 如何将屏幕尺寸从当前的 1024x768 像素缩小?
    A: 虽然旨在全屏模式下运行,但您可以通过编辑 X11.Mod 并重新编译它来创建一个更小的 Oberon 桌面。
    在过程 X11.OpenDisp 中,找到以下行
            (* adjust to physical window size *) 
            GetGeometry( display, primary, gRoot, gX, gY, gW, gH, gBW, gD );   
            IF gW MOD 8 # 0 THEN  
                 DEC( gW, gW MOD 8 );   
            ResizeWindow( display, primary, gW, gH );   
            END;
并将它们替换为
            (* gW MOD 8 should be 0 for efficiency! *)
            GetGeometry( display, primary, gRoot, gX, gY, gW, gH, gBW, gD ); 
            gW := <your desired witdh> 
            gH := <your desired height> 
            ResizeWindow( display, primary, gW, gH );
VNC 客户端
  1. 一些重要的按键,如左 Alt,似乎不起作用。为什么?
    A: 输入模块不会返回所有可能的按键组合。例如,在 Oberon 中,Alt-a 会生成德语“ä”。但 VNC 客户端为此提供了解决方案。如果您按下并释放 Alt,VNC 会记住它并将“Alt”添加到下一个键中。例如,要切换我的虚拟 X 桌面,我按下并释放 Alt,然后按下 Ctrl-Left/Right/Up/Down。VNC 查看器必须首先获得焦点,因此您必须先在查看器中单击鼠标左键。我们希望稍后修复输入模块。
  2. 向下箭头键不能可靠地工作。这不是机械问题,因为我使用过三种不同的键盘进行了测试。但是,关闭 VNC 客户端窗口并打开一个新的窗口似乎可以“修复”它。
    A: 也许这是因为焦点丢失了。不幸的是,当查看器获得焦点时没有视觉指示。尝试在查看器中按鼠标左键以使其获得焦点。

2003 年 1 月 23 日 - 版权所有 © 2003 ETH Zürich。保留所有权利。
电子邮件:oberon at lists.inf.ethz.ch
主页:http://www.ethoberon.ethz.ch/

华夏公益教科书