User:Arnie97/HP Saturn Intro
此用户页面尚未完工。原作者将会继续进行编写,而您也可以对该条目进行编辑。
本条目介绍的是 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 / +
,其运算过程如下:
- 首先,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
ADK(Aplet 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 RPL 或 HPGCC。
由于 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
| |
ZIP 压缩文件 | zip docx pptx xlsx 等 | PK (设计者 Phil Katz)
|
RAR 压缩文件 | rar | Rar!
|
CAB 压缩文件 | cab | MSCF (Microsoft Cabinet File)
|
MZ 可执行文件 | 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 | GIF89a 或 GIF87a
|
JPEG 图片 | jpg jpeg | 以 \xFF \xD8 开始,\xFF \xD9 结束
|
Midi 音轨 | midi | MThd (MIDI 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)
|
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
参考文献
- ↑ 英文维基百科:HP Saturn.
- ↑ 英文维基百科:RPL.
- ↑ 英文维基百科:文件特征签名列表.
- ↑ GitHub:Neko Notepad.
- ↑ HPCalc.org:Columns+.
- ↑ Github:File Recon.
- ↑ 实际上,用 Conn3x 接收 List 及 Matrix,均会保存为该格式