User:Arnie97/HP Saturn Intro

计算器百科,非营利的计算器专业知识百科。
跳到导航 跳到搜索
施工中.svg
此用户页面尚未完工。
此用户页面尚未完工。原作者将会继续进行编写,而您也可以对该条目进行编辑

本条目介绍的是 HP Apple 39gs 等 Saturn 系列计算器的基础知识。

  • 本条目的主题不是 HP Saturn 系列计算器的基本操作;如果您有此方面的疑问,请查阅对应型号的用户手册。但是,如果您有联机传输方面的疑问,请继续阅读此文。
  • 本条目的主题不是编程语言的语法帮助或函数索引;如果您有此方面的疑问,请查阅相关语言的教程和参考资料。本文中指出了每种编程语言可以参考的部分教程和资料,希望对您有所帮助。

Saturn

Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种 4 位微处理器,该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。[1]

Apple(Saturn+)系列

在 Saturn 处理器停产后,为了保持与 Saturn 平台原有程序的兼容性,HP 推出了一系列在 ARM 处理器上运行 Saturn 模拟器的计算器,与上面的那些子系列相对,软件模拟的 Saturn 处理器被称为 Apple 系列。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能,因此也被称作 Saturn+。 Apple 系列推出后,39、49 系列的图形计算器均发布了多款对应的新型号:

系列 原型号(Yorke 系列处理器) 新型号(Apple 系列模拟处理器)
39 39g 40g 39g+ 39gs 40gs
49 49g 48gII 49g+ 50g

这些新型号的系统软件与相对应的原有型号非常相近,只不过系统是运行在模拟器内,而不是运行在真实的 Saturn 处理器上。因此,很多相关的术语保留了下来。

值得注意的是,名为“HP ??gII”的计算器(“?”代指数字)往往与同编号的其他产品大相径庭,切勿混淆。例如,HP 48gII 不属于 HP 48 系列,而属于 HP 49 系列;而 HP 39gII 则不属于 Saturn 系列产品,而与后期推出的 HP Prime 有几分相近。

系统架构概述

Saturn 汇编语言

无论是原有 Saturn 系列还是 Apple 系列,由于使用了或真或假的 Saturn 处理器,显然都可以直接使用 Saturn 汇编语言编写程序。

Saturn 汇编常与编译型语言 System RPL 共同使用,相关内容详见下文,在此不再赘述。

RPN

RPN(Reverse Polish Notation,逆波兰表示法)将运算符置于操作数的后面,因此又称后缀表示法。与之相对的是绝大多数编程语言采用的代数表示法(Algebraic Notation,运算符位于操作数之间,又称中缀表示法)和 Lisp 等语言采用的波兰表示法(运算符位于操作数之前,又称前缀表示法)。

表达式记法 运算符位置 示例 采用该记法的语言
波兰表示法 前缀 * - 3 4 5 Scheme,Common Lisp 等
代数表示法 中缀 (3 - 4) * 5 C++,Python,TI-Lua,HP Basic 等
逆波兰表示法 后缀 3 4 - 5 * Forth,System RPL 等

逆波兰表达式的解释器一般是基于栈(Stack)这一数据结构的。要理解 RPN,最好先理解栈的概念。 RPN 解释求值的过程一般是:遇到操作数时入栈;遇到运算符时,取对应数量的操作数出栈,求值,将结果入栈;最终栈顶就是表达式的值。

例如,常规中缀记法的 12 * (3 + 4) - 6 + 8 / 2 用 RPN 写作 12 3 4 + * 6 - 8 2 / +,其运算过程如下:

RPN运算过程示意图

  • 首先,12、3、4 依次入栈。
  • 输入加号时,由于它是二元运算符,会弹出栈顶的两个数进行运算,并将结果 7 压入栈中。
  • 乘法同样是二元运算,弹出栈顶的 12 和 7 两个数,并将结果 84 返回栈顶。
  • 随后,数字 6 入栈。
  • 之后是减法,取出栈顶的 84 和 6,并返回结果 78。
  • 随后,8 和 2 入栈。
  • 之后是除法,取出栈顶的 8 和 2,并将结果 4 压入栈中。
  • 最后取出 4 和 78 做加法,得到最终结果 82。

RPN 的运算符之间不存在优先级的高低,不需要使用括号来表明运算的优先级,因此能减少输入部分复杂表达式时按键的次数。 例如,常规中缀记法中 3 - 4 * 5(3 - 4) * 5 的意义不相同,需要用括号加以区分;但后缀记法中前者写做 3 4 5 * - ,后者则写做 3 4 - 5 *

System RPL

System RPL(其中 RPL 指 Reverse Polish Lisp)是 HP 计算器上广泛使用的一种编译型语言。顾名思义,该语言中的语句采用逆波兰表示法。

HP 38、39(40)、48、49(50)等系列的图形计算器均支持该语言[2],且大部分系统软件和很多第三方软件由该语言写就。HP 38、39(40)、49(50)等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。

作为一种贴近底层的编译型系统编程语言,System RPL 常与 Saturn 汇编共同使用,这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 HP Tools 开发。此外,HP 49、50 等系列的计算器内置了 MASD,可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身,并不包含头文件(Entry Points,或简称 Entries),如果不希望手动声明系统提供的函数,需要自行下载头文件,其中的原理与 C 语言是相通的。HP 28、38、39(40)、48、49(50)系列的头文件互不相同,下载时需根据所针对的机型正确选择。

Library

Aplet

User RPL

User RPL 是 HP RPN 计算器上的一种解释型语言。顾名思义,该语言同样采用逆波兰表示法。

HP 28、48、49(50)等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式,那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。

与 System RPL 的关系

User RPL 的语法和 System RPL 相近,但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获,且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全,但也使它的运行速度较 System RPL 缓慢,在需要对系统底层进行操控及性能因素至关重要的场合(如某些游戏)应当选择 System RPL。

User RPL 能通过多种方式调用 System RPL 特有的函数,相关内容并入下文 HP Basic 的相关章节,在此不再赘述。

在 HP 49(50)系列计算器内置的文件管理器(Filer)中,User RPL 代码的文件类型为 PROG,System RPL 源码的类型为普通字符串 STRNG,而 System RPL 编译出的二进制对象类型为 CODE

HP Basic

HP Basic 是 HP 38、39(40)系列计算器的解释型语言,由于该语言的代码通过解释器执行,且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上,因此速度是本文提及的所有语言中最慢的。

由于其为解释型语言,我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的(如赋值号 表示为 \|>),为了输入这些符号而免于记忆对应的 ASCII 序列,可以使用 ADK 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中,代码头部应符合特定的格式,参见下文中的说明

想学习 HP Basic 程序的编写,仅需阅读HP 39gs 用户手册(俗称说明书)即可。高级用法则需要对 System RPL 有所了解,见本章接下来两节的内容。

与 User RPL 和 System RPL 的关系

HP Basic 的定位与 HP 48、49(50)系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。

调用 System RPL

ADK

ADKAplet Develop Kit,Aplet 开发套件)是 16 位 Windows 平台上的 HP Basic 开发工具,该工具可以帮助用户编写 HP Basic,使用 HP Basic 扩充现有 Aplet 的功能(见 HP 39gs 用户手册第 18-10 页)。值得一提的是,该工具能编辑 Aplet 中嵌入的 Note 和 Sketch,因此您可以使用该工具将文本文档和黑白图片传入计算器显示,这对于尚未学会文件头部如何编写的用户尤为有用。

虽然该工具的名称为 Aplet 开发套件,但该工具仅能在现有 Aplet 的基础上,对其 Views 菜单进行扩充(例如,为 Function Aplet 添加自动设置定义域和值域的功能)。要开发全新的 Aplet,请使用 System RPLHPGCC

由于 AMD64 平台的固有限制,64 位系统无法兼容 16 位应用。如果您需要在 64 位系统中运行该应用,建议用 DOSBox、Hyper-V 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。

HPGCC

HPGCC 是一个由第三方团队开发的自由软件项目,它使我们能绕过 Saturn 模拟器,在 HP Apple 系列计算器上开发和运行原生 ARM 应用。该项目的核心开发组成员包括 Ingo Blank,Al Borowski,Claudio Lapilli 和 Benjamin Maurin,在此向他们的贡献表示感谢。

HPGCC 目前已发布三个主版本,最新版本 HPGCC 3 相比前两个版本的变化较大,且仅支持 Big Apple 系列计算器(HP 49g+、HP 50g),因此本文不对其展开讨论,您可以访问其官方网站了解相关知识。下文所述的 HPGCC 均指早期的 HPGCC 版本。

HPGCC 项目的核心是由 C 语言编写的 ARM 函数库和由 System RPL 编写的 ARM Toolbox。此外,HPGCC 的 Windows 发行版中还包含 arm-elf-gcc 工具链、Aplet 框架和简单的 GUI 编辑环境 Programmer's Notepad 2。部分发行版中的 arm-elf-gcc 基于早期的 Cygwin 编译,运行时可能出错崩溃,因此建议换用较新版本的工具链。

ARM Toolbox

Aplet 框架

内存布局与固件

数据类型与联机传输

文件类型的判定:扩展名与特征签名

不同类型的文件需要用不同的方式解析。为了正确理解文件中数据的含义,首先需判断出文件的类型。

文件类型的标示和识别主要有两种方式:

  • 文件名称的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分,也就是扩展名(Extension)
  • 文件内容的某个特定部分,即特征签名(File Signature)指示一个文件的类型——通常是最前面的部分,也就是头部(Header)

扩展名最早在 CP/M 操作系统中被采用,而后又随一脉相承的 DOS 和 Windows 得到了推广;特征签名则在 Unix 中被广泛应用,而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用,现实中两种方式常常共存:

文件类型 扩展名 特征签名[3]
PDF 文档 pdf %PDF
ZIP 压缩文件 zip docx pptx xlsx 等 PK(设计者 Phil Katz)
RAR 压缩文件 rar Rar!
CAB 压缩文件 cab MSCFMicrosoft Cabinet File)
MZ 可执行文件

PE 可执行文件

com exe

exe dll sys ocx cpl scr 等

MZ(设计者 Mark Zbikowski)

(为向下兼容 DOS,PE 文件头部与之相同)

ELF 可执行文件 \x7F E L F
PNG 图片 png \x89 P N G
GIF 图片 gif GIF89aGIF87a
JPEG 图片 jpg jpeg \xFF \xD8开始,\xFF \xD9 结束
Midi 音轨 midi MThdMIDI Track header)
Java 字节码 class \xCA \xFE \xBA \xBE,即十六进制 CAFEBABE

从上面的例子中可以看出,既有一个扩展名对应多种特征签名的情况(如 GIF 文件),也有多种扩展名对应单一特征签名的情况(如 PE 文件)。当扩展名和特征签名共存时,有时会结合两种因素来决定文件如何解析,更多时候则只选择其中的主要因素来判断文件的类型。例如,将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开,说明这些软件仅通过文件内容中的特征签名来判断文件的格式,扩展名无关紧要。同样,HP Saturn 系列计算器也仅判定文件的特征签名,而扩展名的作用只是辅助人类的辨识。

HP Saturn 系列的文件类型(外部表示)

文件类型 常见扩展名 特征签名
HP 39(40)系列 000 apt lib 等 HP39Asc?(文本,ASCII)

HP39Bin?(二进制,Binary)

HP 48 系列 不固定 HPHP48-?
HP 49(50)系列 hp lib 等 HPHP49-?

上表中,? 代指表示文件类型的一个大写拉丁字母;同一字母在不同系列中有着不同的意义,详见下文各章节。另外,由于扩展名并无实质性作用,用户可根据自己的喜好和实际情况选择不同的扩展名——例如,为了方便用记事本打开,可以用 txt 作为扩展名;[4]为了方便用户区分不同机种的文件,跨平台应用的开发者有时直接用 48、49 等作为扩展名。[5]

HP 39(40)系列

文件类型代号 文件类型[6] System RPL 变量类型 对应的储存目录
A Directory list (不包含变量) (无)
B Aplet DIR(Directory) /'apletdir
C Note $(String) /'notesdir
D Program $(String) /'pgmdir
E Variable 等[7] %(Real) /'calcdir
F List { }(List) /'calcdir
G Matrix [[ ]](Array) /'calcdir
H Library (Library) Port 0(IRAM)
I Target list
J Vector specification
K Wildcard *

HP 48 系列

HP 49(50)系列

HP Saturn 系列的对象类型(内部表示)

表面上看,HP 39(40)、48、49(50)的文件格式互不相同,PC 上的官方联机工具(Connectivity Kit)也形式各异。但是,多项证据已经表明,不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象

我们可以通过下面的实验来验证这一结论:用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存,期间保持电源供给,以免 RAM 中的数据丢失。那么,当进入 49 系列的系统后,我们将看到之前在 39 系列系统中储存的所有文件(和文件夹)。鉴于 39 系列系统中并未提供完整的文件管理器,如果想探查 39 系列计算器的目录结构,除了选择 39 系统中不完整的文件管理器或自己编写文件管理器外,亦可利用这一特性,借助 49 系列内置的文件管理器来达到目的。

综上所述,不同系列间文件格式的差异,本质上是相同对象类型的不同序列化形式,传入计算器后的生成的对象是相同的,可谓“换汤不换药”。

串口与驱动程序

Kermit 与 XMODEM

参考文献