<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://calcwiki.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Arnie97</id>
	<title>计算器百科 - 用户贡献 [zh]</title>
	<link rel="self" type="application/atom+xml" href="https://calcwiki.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Arnie97"/>
	<link rel="alternate" type="text/html" href="https://calcwiki.org/Special:Contributions/Arnie97"/>
	<updated>2026-04-06T10:30:26Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://calcwiki.org/index.php?title=HP-Apple%E7%B3%BB%E5%88%97&amp;diff=8490</id>
		<title>HP-Apple系列</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=HP-Apple%E7%B3%BB%E5%88%97&amp;diff=8490"/>
		<updated>2018-02-05T13:02:36Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​内部链接&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HP-Apple系列是惠普的一个图形计算器系列，包含HP-39/40/48/49/50系列计算器中的一些型号。&lt;br /&gt;
&lt;br /&gt;
HP-Apple系列计算器的特点是，都在使用ARM架构的CPU，但使用的都是Saturn架构的操作系统，整机实际上是在运行早期Saturn架构处理器的模拟器。这种做法的缺点是严重地浪费了计算器的硬件性能；优点是，这使得HP-Apple系列计算器都具备良好的向前兼容性。&lt;br /&gt;
&lt;br /&gt;
此外，HP-Apple系列计算器与苹果计算机公司（Apple Computer Co.,Ltd）互相没有关联。&lt;br /&gt;
==HP-Apple系列==&lt;br /&gt;
HP-Apple系列包括这些计算器型号：&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;HP-Apple系列&amp;quot; mode=&amp;quot;nolines&amp;quot;&amp;gt;&lt;br /&gt;
HP39g+.jpg|HP-39G+|link=HP-39系列&lt;br /&gt;
HP39GS.jpg|HP-39GS|link=HP-39系列&lt;br /&gt;
HP40GS.jpg|HP-40GS|link=HP-39系列&lt;br /&gt;
Hp48gii.jpg|HP-48GII|link=HP-48GII&lt;br /&gt;
HPIM2605.jpg|HP-49G+|link=HP-49G+&lt;br /&gt;
Hp50.png|HP-50G|link=HP-50G&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=HP-Apple%E7%B3%BB%E5%88%97&amp;diff=8489</id>
		<title>HP-Apple系列</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=HP-Apple%E7%B3%BB%E5%88%97&amp;diff=8489"/>
		<updated>2018-02-05T13:01:01Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​修复相册&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HP-Apple系列是惠普的一个图形计算器系列，包含HP-39/40/48/49/50系列计算器中的一些型号。&lt;br /&gt;
&lt;br /&gt;
HP-Apple系列计算器的特点是，都在使用ARM架构的CPU，但使用的都是Saturn架构的操作系统，整机实际上是在运行早期Saturn架构处理器的模拟器。这种做法的缺点是严重地浪费了计算器的硬件性能；优点是，这使得HP-Apple系列计算器都具备良好的向前兼容性。&lt;br /&gt;
&lt;br /&gt;
此外，HP-Apple系列计算器与苹果计算机公司（Apple Computer Co.,Ltd）互相没有关联。&lt;br /&gt;
==HP-Apple系列==&lt;br /&gt;
HP-Apple系列包括这些计算器型号：&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;HP-Apple系列&amp;quot; mode=&amp;quot;nolines&amp;quot;&amp;gt;&lt;br /&gt;
HP39g+.jpg|HP-39G+|link=HP-39系列&lt;br /&gt;
HP39GS.jpg|HP-39GS|link=HP-39系列&lt;br /&gt;
HP40GS.jpg|HP-40GS&lt;br /&gt;
Hp48gii.jpg|HP-48GII|link=HP-48GII&lt;br /&gt;
HPIM2605.jpg|HP-49G+|link=HP-49G+&lt;br /&gt;
Hp50.png|HP-50G|link=HP-50G&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8459</id>
		<title>User:Arnie97/HP 39 FAQ</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8459"/>
		<updated>2017-10-20T03:51:55Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* 自检与重启 */ 加粗&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 自检与重启 =&lt;br /&gt;
* 暂停模拟器：保持{{key|ON}}按下，模拟器即处于暂停状态，直至松开该键后模拟器方恢复运行。&lt;br /&gt;
* 重置模拟器：{{key|ON}}+{{key|F1}}+{{key|F6}}，&#039;&#039;&#039;该操作会清空 SRAM 中的全部用户数据&#039;&#039;&#039;。&lt;br /&gt;
* 重启模拟器：{{key|ON}}+{{key|F3}}，&#039;&#039;&#039;不会影响用户数据&#039;&#039;&#039;，可用于 System RPL 程序死机时。&lt;br /&gt;
* Boot 2 基本自检：{{key|ON}}+{{key|F4}}，会显示 Boot 2 的版本。&lt;br /&gt;
** 循环自检：{{key|ON}}+{{key|F5}}，等价于在基本自检中选{{key|A}}。此测试略过了按键测试等需要人工操作的项目。&lt;br /&gt;
* Boot 2 扩展自检：{{key|ON}}+{{key|F6}}，其测试项目较基本自检多，原有的部分测试项目也被重新设计。&lt;br /&gt;
** 循环自检：此处亦有循环自检{{key|A}}，其中包含所有测试项目，故需要人工操作方能完成。&lt;br /&gt;
* 重启整个系统：在基本自检菜单和自检过程中按{{key|ON}}+{{key|F3}}，在扩展自检菜单中选{{key|ON}}，或在任意情况下戳 RESET 孔。&lt;br /&gt;
* Boot 1：在计算器启动时按{{key|+}}+{{key|-}}三秒。在此可查看 Boot 1 版本和计算器序列号，通过 USB 刷入 ROM（&#039;&#039;&#039;不会影响 SRAM 中的用户数据&#039;&#039;&#039;），或进入 Boot 2 基本自检。该模式中，无法通过{{key|ON}}+{{key|F3}}重启系统，可先进入 Boot 2 来曲线救国，或者通过 RESET 孔来重启。&lt;br /&gt;
* 取消操作：执行上面各操作的过程中，在还没松开{{key|ON}}键之前，你可以按{{key|F2}}反悔（即{{key|ON}}+{{key|F2}}）。如果期间你已经松开了{{key|ON}}键，那么操作已经进行，无法取消。&lt;br /&gt;
&lt;br /&gt;
= 数字格式转换 =&lt;br /&gt;
HP 39gs 价格低廉，吸引了不少 Casio 函数机（含盗版仿制机）用户购买使用。唯二者操作方式差别较大，常有新用户询问某操作在 HP 39 系列上如何进行，故整理如下。&lt;br /&gt;
&lt;br /&gt;
== 极坐标与直角坐标 ==&lt;br /&gt;
利用复数。举例说明如下：&lt;br /&gt;
* 转为直角坐标：&amp;lt;code&amp;gt;(220, ∠30)&amp;lt;/code&amp;gt;，其中{{key|∠}}在减号键上方。&lt;br /&gt;
* 转回极坐标：&amp;lt;code&amp;gt;(ABS(Ans), ARG(Ans))&amp;lt;/code&amp;gt;，其中{{key|ABS}}和{{key|ARG}}在括号键上方。&lt;br /&gt;
&lt;br /&gt;
== 小数、假分数、带分数 ==&lt;br /&gt;
在 MODES（{{key|SHIFT}}+{{key|HOME}}）的第二项中选择 Standard，Fraction 或 Mixed Fraction 即可。&lt;br /&gt;
&lt;br /&gt;
== 角度、弧度、百分度 ==&lt;br /&gt;
同上，MODES 第一项中选择对应选项即可。&lt;br /&gt;
&lt;br /&gt;
角度与弧度间的互相转换则需用 DEG→RAD 和 RAD→DEG 函数，可在{{key|MATH}}菜单的 Real 类别中找到。&lt;br /&gt;
&lt;br /&gt;
== 度分秒与小数 ==&lt;br /&gt;
使用 HMS→ 和 →HMS 函数，同样在{{key|MATH}}菜单的 Real 类别中。举例说明：&lt;br /&gt;
* 12°30&#039;36&amp;quot; 转换为小数：&amp;lt;code&amp;gt;HMS→(12.3036)&amp;lt;/code&amp;gt;⇒12.51&lt;br /&gt;
* 小数转换回度分秒：&amp;lt;code&amp;gt;→HMS(12.51)&amp;lt;/code&amp;gt;⇒12.3036&lt;br /&gt;
&lt;br /&gt;
== 单位转换 ==&lt;br /&gt;
{{key|MATH}}菜单中的 Convert 类别。&lt;br /&gt;
&lt;br /&gt;
== 进制转换 ==&lt;br /&gt;
无原生支持。&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8458</id>
		<title>User:Arnie97/HP 39 FAQ</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8458"/>
		<updated>2017-10-20T03:35:16Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* 自检与重启 */ Boot1 重启&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 自检与重启 =&lt;br /&gt;
* 暂停模拟器：保持{{key|ON}}按下，模拟器即处于暂停状态，直至松开该键后模拟器方恢复运行。&lt;br /&gt;
* 重置模拟器：{{key|ON}}+{{key|F1}}+{{key|F6}}，该操作会清空 SRAM 中的全部用户数据。&lt;br /&gt;
* 重启模拟器：{{key|ON}}+{{key|F3}}，不会影响用户数据，可用于 System RPL 程序死机时。&lt;br /&gt;
* Boot 2 基本自检：{{key|ON}}+{{key|F4}}，会显示 Boot 2 的版本。&lt;br /&gt;
** 循环自检：{{key|ON}}+{{key|F5}}，等价于在基本自检中选{{key|A}}。此测试略过了按键测试等需要人工操作的项目。&lt;br /&gt;
* Boot 2 扩展自检：{{key|ON}}+{{key|F6}}，其测试项目较基本自检多，原有的部分测试项目也被重新设计。&lt;br /&gt;
** 循环自检：此处亦有循环自检{{key|A}}，其中包含所有测试项目，故需要人工操作方能完成。&lt;br /&gt;
* 重启整个系统：在基本自检菜单和自检过程中按{{key|ON}}+{{key|F3}}，在扩展自检菜单中选{{key|ON}}，或在任意情况下戳 RESET 孔。&lt;br /&gt;
* Boot 1：在计算器启动时按{{key|+}}+{{key|-}}三秒。在此可查看 Boot 1 版本和计算器序列号，通过 USB 刷入 ROM，或进入 Boot 2 基本自检。该模式中，无法通过{{key|ON}}+{{key|F3}}重启系统，可先进入 Boot 2 来曲线救国，或者通过 RESET 孔来重启。&lt;br /&gt;
* 取消操作：执行上面各操作的过程中，在还没松开{{key|ON}}键之前，你可以按{{key|F2}}反悔（即{{key|ON}}+{{key|F2}}）。如果期间你已经松开了{{key|ON}}键，那么操作已经进行，无法取消。&lt;br /&gt;
&lt;br /&gt;
= 数字格式转换 =&lt;br /&gt;
HP 39gs 价格低廉，吸引了不少 Casio 函数机（含盗版仿制机）用户购买使用。唯二者操作方式差别较大，常有新用户询问某操作在 HP 39 系列上如何进行，故整理如下。&lt;br /&gt;
&lt;br /&gt;
== 极坐标与直角坐标 ==&lt;br /&gt;
利用复数。举例说明如下：&lt;br /&gt;
* 转为直角坐标：&amp;lt;code&amp;gt;(220, ∠30)&amp;lt;/code&amp;gt;，其中{{key|∠}}在减号键上方。&lt;br /&gt;
* 转回极坐标：&amp;lt;code&amp;gt;(ABS(Ans), ARG(Ans))&amp;lt;/code&amp;gt;，其中{{key|ABS}}和{{key|ARG}}在括号键上方。&lt;br /&gt;
&lt;br /&gt;
== 小数、假分数、带分数 ==&lt;br /&gt;
在 MODES（{{key|SHIFT}}+{{key|HOME}}）的第二项中选择 Standard，Fraction 或 Mixed Fraction 即可。&lt;br /&gt;
&lt;br /&gt;
== 角度、弧度、百分度 ==&lt;br /&gt;
同上，MODES 第一项中选择对应选项即可。&lt;br /&gt;
&lt;br /&gt;
角度与弧度间的互相转换则需用 DEG→RAD 和 RAD→DEG 函数，可在{{key|MATH}}菜单的 Real 类别中找到。&lt;br /&gt;
&lt;br /&gt;
== 度分秒与小数 ==&lt;br /&gt;
使用 HMS→ 和 →HMS 函数，同样在{{key|MATH}}菜单的 Real 类别中。举例说明：&lt;br /&gt;
* 12°30&#039;36&amp;quot; 转换为小数：&amp;lt;code&amp;gt;HMS→(12.3036)&amp;lt;/code&amp;gt;⇒12.51&lt;br /&gt;
* 小数转换回度分秒：&amp;lt;code&amp;gt;→HMS(12.51)&amp;lt;/code&amp;gt;⇒12.3036&lt;br /&gt;
&lt;br /&gt;
== 单位转换 ==&lt;br /&gt;
{{key|MATH}}菜单中的 Convert 类别。&lt;br /&gt;
&lt;br /&gt;
== 进制转换 ==&lt;br /&gt;
无原生支持。&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8457</id>
		<title>User:Arnie97/HP 39 FAQ</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8457"/>
		<updated>2017-10-20T03:27:33Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* 自检与重启 */ ON+F2 的补充&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 自检与重启 =&lt;br /&gt;
* 暂停模拟器：保持{{key|ON}}按下，模拟器即处于暂停状态，直至松开该键后模拟器方恢复运行。&lt;br /&gt;
* 重置模拟器：{{key|ON}}+{{key|F1}}+{{key|F6}}，该操作会清空 SRAM 中的全部用户数据。&lt;br /&gt;
* 重启模拟器：{{key|ON}}+{{key|F3}}，不会影响用户数据，可用于 System RPL 程序死机时。&lt;br /&gt;
* Boot 2 基本自检：{{key|ON}}+{{key|F4}}，会显示 Boot 2 的版本。&lt;br /&gt;
** 循环自检：{{key|ON}}+{{key|F5}}，等价于在基本自检中选{{key|A}}。此测试略过了按键测试等需要人工操作的项目。&lt;br /&gt;
* Boot 2 扩展自检：{{key|ON}}+{{key|F6}}，其测试项目较基本自检多，原有的部分测试项目也被重新设计。&lt;br /&gt;
** 循环自检：此处亦有循环自检{{key|A}}，其中包含所有测试项目，故需要人工操作方能完成。&lt;br /&gt;
* 重启整个系统：在基本自检菜单和自检过程中按{{key|ON}}+{{key|F3}}，在扩展自检菜单中选{{key|ON}}，或在任意情况下戳 RESET 孔。&lt;br /&gt;
* Boot 1：在计算器启动时按{{key|+}}+{{key|-}}三秒。在此可查看 Boot 1 版本和计算器序列号，通过 USB 刷入 ROM，或进入 Boot 2 基本自检。&lt;br /&gt;
* 取消操作：执行上面各操作的过程中，在还没松开{{key|ON}}键之前，你可以按{{key|F2}}反悔（即{{key|ON}}+{{key|F2}}）。如果期间你已经松开了{{key|ON}}键，那么操作已经进行，无法取消。&lt;br /&gt;
&lt;br /&gt;
= 数字格式转换 =&lt;br /&gt;
HP 39gs 价格低廉，吸引了不少 Casio 函数机（含盗版仿制机）用户购买使用。唯二者操作方式差别较大，常有新用户询问某操作在 HP 39 系列上如何进行，故整理如下。&lt;br /&gt;
&lt;br /&gt;
== 极坐标与直角坐标 ==&lt;br /&gt;
利用复数。举例说明如下：&lt;br /&gt;
* 转为直角坐标：&amp;lt;code&amp;gt;(220, ∠30)&amp;lt;/code&amp;gt;，其中{{key|∠}}在减号键上方。&lt;br /&gt;
* 转回极坐标：&amp;lt;code&amp;gt;(ABS(Ans), ARG(Ans))&amp;lt;/code&amp;gt;，其中{{key|ABS}}和{{key|ARG}}在括号键上方。&lt;br /&gt;
&lt;br /&gt;
== 小数、假分数、带分数 ==&lt;br /&gt;
在 MODES（{{key|SHIFT}}+{{key|HOME}}）的第二项中选择 Standard，Fraction 或 Mixed Fraction 即可。&lt;br /&gt;
&lt;br /&gt;
== 角度、弧度、百分度 ==&lt;br /&gt;
同上，MODES 第一项中选择对应选项即可。&lt;br /&gt;
&lt;br /&gt;
角度与弧度间的互相转换则需用 DEG→RAD 和 RAD→DEG 函数，可在{{key|MATH}}菜单的 Real 类别中找到。&lt;br /&gt;
&lt;br /&gt;
== 度分秒与小数 ==&lt;br /&gt;
使用 HMS→ 和 →HMS 函数，同样在{{key|MATH}}菜单的 Real 类别中。举例说明：&lt;br /&gt;
* 12°30&#039;36&amp;quot; 转换为小数：&amp;lt;code&amp;gt;HMS→(12.3036)&amp;lt;/code&amp;gt;⇒12.51&lt;br /&gt;
* 小数转换回度分秒：&amp;lt;code&amp;gt;→HMS(12.51)&amp;lt;/code&amp;gt;⇒12.3036&lt;br /&gt;
&lt;br /&gt;
== 单位转换 ==&lt;br /&gt;
{{key|MATH}}菜单中的 Convert 类别。&lt;br /&gt;
&lt;br /&gt;
== 进制转换 ==&lt;br /&gt;
无原生支持。&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8410</id>
		<title>User:Arnie97/HP 39 FAQ</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8410"/>
		<updated>2017-06-28T04:17:13Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* 自检与重启 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 自检与重启 =&lt;br /&gt;
* 暂停模拟器：保持{{key|ON}}按下，模拟器即处于暂停状态，直至松开该键后模拟器方恢复运行。&lt;br /&gt;
* 重置模拟器：{{key|ON}}+{{key|F1}}+{{key|F6}}，该操作会清空 SRAM 中的全部用户数据。&lt;br /&gt;
* 重启模拟器：{{key|ON}}+{{key|F3}}，不会影响用户数据，可用于 System RPL 程序死机时。&lt;br /&gt;
* Boot 2 基本自检：{{key|ON}}+{{key|F4}}，会显示 Boot 2 的版本。&lt;br /&gt;
** 循环自检：{{key|ON}}+{{key|F5}}，等价于在基本自检中选{{key|A}}。此测试略过了按键测试等需要人工操作的项目。&lt;br /&gt;
* Boot 2 扩展自检：{{key|ON}}+{{key|F6}}，其测试项目较基本自检多，原有的部分测试项目也被重新设计。&lt;br /&gt;
** 循环自检：此处亦有循环自检{{key|A}}，其中包含所有测试项目，故需要人工操作方能完成。&lt;br /&gt;
* 重启整个系统：在基本自检菜单和自检过程中按{{key|ON}}+{{key|F3}}，在扩展自检菜单中选{{key|ON}}，或在任意情况下戳 RESET 孔。&lt;br /&gt;
* Boot 1：在计算器启动时按{{key|+}}+{{key|-}}三秒。在此可查看 Boot 1 版本和计算器序列号，通过 USB 刷入 ROM，或进入 Boot 2 基本自检。&lt;br /&gt;
* 取消操作：{{key|ON}}+{{key|F2}}&lt;br /&gt;
&lt;br /&gt;
= 数字格式转换 =&lt;br /&gt;
HP 39gs 价格低廉，吸引了不少 Casio 函数机（含盗版仿制机）用户购买使用。唯二者操作方式差别较大，常有新用户询问某操作在 HP 39 系列上如何进行，故整理如下。&lt;br /&gt;
&lt;br /&gt;
== 极坐标与直角坐标 ==&lt;br /&gt;
利用复数。举例说明如下：&lt;br /&gt;
* 转为直角坐标：&amp;lt;code&amp;gt;(220, ∠30)&amp;lt;/code&amp;gt;，其中{{key|∠}}在减号键上方。&lt;br /&gt;
* 转回极坐标：&amp;lt;code&amp;gt;(ABS(Ans), ARG(Ans))&amp;lt;/code&amp;gt;，其中{{key|ABS}}和{{key|ARG}}在括号键上方。&lt;br /&gt;
&lt;br /&gt;
== 小数、假分数、带分数 ==&lt;br /&gt;
在 MODES（{{key|SHIFT}}+{{key|HOME}}）的第二项中选择 Standard，Fraction 或 Mixed Fraction 即可。&lt;br /&gt;
&lt;br /&gt;
== 角度、弧度、百分度 ==&lt;br /&gt;
同上，MODES 第一项中选择对应选项即可。&lt;br /&gt;
&lt;br /&gt;
角度与弧度间的互相转换则需用 DEG→RAD 和 RAD→DEG 函数，可在{{key|MATH}}菜单的 Real 类别中找到。&lt;br /&gt;
&lt;br /&gt;
== 度分秒与小数 ==&lt;br /&gt;
使用 HMS→ 和 →HMS 函数，同样在{{key|MATH}}菜单的 Real 类别中。举例说明：&lt;br /&gt;
* 12°30&#039;36&amp;quot; 转换为小数：&amp;lt;code&amp;gt;HMS→(12.3036)&amp;lt;/code&amp;gt;⇒12.51&lt;br /&gt;
* 小数转换回度分秒：&amp;lt;code&amp;gt;→HMS(12.51)&amp;lt;/code&amp;gt;⇒12.3036&lt;br /&gt;
&lt;br /&gt;
== 单位转换 ==&lt;br /&gt;
{{key|MATH}}菜单中的 Convert 类别。&lt;br /&gt;
&lt;br /&gt;
== 进制转换 ==&lt;br /&gt;
无原生支持。&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8409</id>
		<title>User:Arnie97/HP 39 FAQ</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8409"/>
		<updated>2017-06-28T04:09:28Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* 数字格式转换 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 自检与重启 =&lt;br /&gt;
* 暂停模拟器：保持{{key|ON}}按下，模拟器即处于暂停状态，直至松开该键后模拟器方恢复运行。&lt;br /&gt;
* 重置模拟器：{{key|ON}}+{{key|F1}}+{{key|F6}}，该操作会清空 SRAM 中的全部用户数据。&lt;br /&gt;
* 重启模拟器：{{key|ON}}+{{key|F3}}，不会影响用户数据，可用于 System RPL 程序死机时。&lt;br /&gt;
* Boot 2 基本自检：{{key|ON}}+{{key|F4}}，会显示 Boot 2 的版本。&lt;br /&gt;
** 循环自检：{{key|ON}}+{{key|F5}}，等价于在基本自检中选{{key|A}}。此测试略过了按键测试等需要人工操作的项目。&lt;br /&gt;
* Boot 2 扩展自检：{{key|ON}}+{{key|F6}}，其测试项目较基本自检多，原有的部分测试项目也被重新设计。&lt;br /&gt;
** 循环自检：此处亦有循环自检{{key|A}}，其中包含所有测试项目，故需要人工操作方能完成。&lt;br /&gt;
* 重启整个系统：在基本自检和自检过程中按{{key|ON}}+{{key|F3}}，在扩展自检中按{{key|ON}}，或在任意情况下戳 RESET 孔。&lt;br /&gt;
* Boot 1：在计算器启动时按{{key|+}}+{{key|-}}三秒。在此可查看 Boot 1 版本和计算器序列号，通过 USB 刷入 ROM，或进入 Boot 2 基本自检。&lt;br /&gt;
* 取消操作：{{key|ON}}+{{key|F2}}&lt;br /&gt;
&lt;br /&gt;
= 数字格式转换 =&lt;br /&gt;
HP 39gs 价格低廉，吸引了不少 Casio 函数机（含盗版仿制机）用户购买使用。唯二者操作方式差别较大，常有新用户询问某操作在 HP 39 系列上如何进行，故整理如下。&lt;br /&gt;
&lt;br /&gt;
== 极坐标与直角坐标 ==&lt;br /&gt;
利用复数。举例说明如下：&lt;br /&gt;
* 转为直角坐标：&amp;lt;code&amp;gt;(220, ∠30)&amp;lt;/code&amp;gt;，其中{{key|∠}}在减号键上方。&lt;br /&gt;
* 转回极坐标：&amp;lt;code&amp;gt;(ABS(Ans), ARG(Ans))&amp;lt;/code&amp;gt;，其中{{key|ABS}}和{{key|ARG}}在括号键上方。&lt;br /&gt;
&lt;br /&gt;
== 小数、假分数、带分数 ==&lt;br /&gt;
在 MODES（{{key|SHIFT}}+{{key|HOME}}）的第二项中选择 Standard，Fraction 或 Mixed Fraction 即可。&lt;br /&gt;
&lt;br /&gt;
== 角度、弧度、百分度 ==&lt;br /&gt;
同上，MODES 第一项中选择对应选项即可。&lt;br /&gt;
&lt;br /&gt;
角度与弧度间的互相转换则需用 DEG→RAD 和 RAD→DEG 函数，可在{{key|MATH}}菜单的 Real 类别中找到。&lt;br /&gt;
&lt;br /&gt;
== 度分秒与小数 ==&lt;br /&gt;
使用 HMS→ 和 →HMS 函数，同样在{{key|MATH}}菜单的 Real 类别中。举例说明：&lt;br /&gt;
* 12°30&#039;36&amp;quot; 转换为小数：&amp;lt;code&amp;gt;HMS→(12.3036)&amp;lt;/code&amp;gt;⇒12.51&lt;br /&gt;
* 小数转换回度分秒：&amp;lt;code&amp;gt;→HMS(12.51)&amp;lt;/code&amp;gt;⇒12.3036&lt;br /&gt;
&lt;br /&gt;
== 单位转换 ==&lt;br /&gt;
{{key|MATH}}菜单中的 Convert 类别。&lt;br /&gt;
&lt;br /&gt;
== 进制转换 ==&lt;br /&gt;
无原生支持。&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8408</id>
		<title>User:Arnie97/HP 39 FAQ</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8408"/>
		<updated>2017-06-28T04:06:33Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* 自检与重启 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 自检与重启 =&lt;br /&gt;
* 暂停模拟器：保持{{key|ON}}按下，模拟器即处于暂停状态，直至松开该键后模拟器方恢复运行。&lt;br /&gt;
* 重置模拟器：{{key|ON}}+{{key|F1}}+{{key|F6}}，该操作会清空 SRAM 中的全部用户数据。&lt;br /&gt;
* 重启模拟器：{{key|ON}}+{{key|F3}}，不会影响用户数据，可用于 System RPL 程序死机时。&lt;br /&gt;
* Boot 2 基本自检：{{key|ON}}+{{key|F4}}，会显示 Boot 2 的版本。&lt;br /&gt;
** 循环自检：{{key|ON}}+{{key|F5}}，等价于在基本自检中选{{key|A}}。此测试略过了按键测试等需要人工操作的项目。&lt;br /&gt;
* Boot 2 扩展自检：{{key|ON}}+{{key|F6}}，其测试项目较基本自检多，原有的部分测试项目也被重新设计。&lt;br /&gt;
** 循环自检：此处亦有循环自检{{key|A}}，其中包含所有测试项目，故需要人工操作方能完成。&lt;br /&gt;
* 重启整个系统：在基本自检和自检过程中按{{key|ON}}+{{key|F3}}，在扩展自检中按{{key|ON}}，或在任意情况下戳 RESET 孔。&lt;br /&gt;
* Boot 1：在计算器启动时按{{key|+}}+{{key|-}}三秒。在此可查看 Boot 1 版本和计算器序列号，通过 USB 刷入 ROM，或进入 Boot 2 基本自检。&lt;br /&gt;
* 取消操作：{{key|ON}}+{{key|F2}}&lt;br /&gt;
&lt;br /&gt;
= 数字格式转换 =&lt;br /&gt;
HP 39gs 价格低廉，吸引了不少 Casio 函数机（含盗版仿制机）用户购买使用。唯二者操作方式差别较大，常有新用户询问某操作在 HP 39 系列上如何进行，故整理如下。&lt;br /&gt;
&lt;br /&gt;
== 极坐标与直角坐标 ==&lt;br /&gt;
利用复数，举例说明如下：&lt;br /&gt;
&lt;br /&gt;
转为直角坐标：&amp;lt;code&amp;gt;(220, ∠30)&amp;lt;/code&amp;gt;，其中{{key|∠}}在减号键上方。&lt;br /&gt;
&lt;br /&gt;
转回极坐标：&amp;lt;code&amp;gt;(ABS(Ans), ARG(Ans))&amp;lt;/code&amp;gt;，其中{{key|ABS}}和{{key|ARG}}在括号键上方。&lt;br /&gt;
&lt;br /&gt;
== 小数、假分数、带分数 ==&lt;br /&gt;
在 MODES（{{key|SHIFT}}+{{key|HOME}}）的第二项中选择 Standard，Fraction 或 Mixed Fraction 即可。&lt;br /&gt;
&lt;br /&gt;
== 角度、弧度、百分度 ==&lt;br /&gt;
同上，第一项中选择对应选项即可。&lt;br /&gt;
&lt;br /&gt;
角度与弧度间的互相转换则需用 DEG→RAD 和 RAD→DEG 函数，可在{{key|MATH}}菜单的 Real 类别中找到。&lt;br /&gt;
&lt;br /&gt;
== 度分秒与小数 ==&lt;br /&gt;
HMS→ 和 →HMS 函数，同样在{{key|MATH}}菜单的 Real 类别中。举例说明：&lt;br /&gt;
&lt;br /&gt;
12°30&#039;36&amp;quot; 转换为小数：&amp;lt;code&amp;gt;HMS→(12.3036)&amp;lt;/code&amp;gt;⇒12.51&lt;br /&gt;
&lt;br /&gt;
小数转换回度分秒：&amp;lt;code&amp;gt;→HMS(12.51)&amp;lt;/code&amp;gt;⇒12.3036&lt;br /&gt;
&lt;br /&gt;
== 单位转换 ==&lt;br /&gt;
{{key|MATH}}菜单中的 Convert 类别。&lt;br /&gt;
&lt;br /&gt;
== 进制转换 ==&lt;br /&gt;
无原生支持。&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8407</id>
		<title>User:Arnie97/HP 39 FAQ</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8407"/>
		<updated>2017-06-26T17:47:09Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​修正笔误&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 自检与重启 =&lt;br /&gt;
&lt;br /&gt;
= 数字格式转换 =&lt;br /&gt;
HP 39gs 价格低廉，吸引了不少 Casio 函数机（含盗版仿制机）用户购买使用。唯二者操作方式差别较大，常有新用户询问某操作在 HP 39 系列上如何进行，故整理如下。&lt;br /&gt;
&lt;br /&gt;
== 极坐标与直角坐标 ==&lt;br /&gt;
利用复数，举例说明如下：&lt;br /&gt;
&lt;br /&gt;
转为直角坐标：&amp;lt;code&amp;gt;(220, ∠30)&amp;lt;/code&amp;gt;，其中{{key|∠}}在减号键上方。&lt;br /&gt;
&lt;br /&gt;
转回极坐标：&amp;lt;code&amp;gt;(ABS(Ans), ARG(Ans))&amp;lt;/code&amp;gt;，其中{{key|ABS}}和{{key|ARG}}在括号键上方。&lt;br /&gt;
&lt;br /&gt;
== 小数、假分数、带分数 ==&lt;br /&gt;
在 MODES（{{key|SHIFT}}+{{key|HOME}}）的第二项中选择 Standard，Fraction 或 Mixed Fraction 即可。&lt;br /&gt;
&lt;br /&gt;
== 角度、弧度、百分度 ==&lt;br /&gt;
同上，第一项中选择对应选项即可。&lt;br /&gt;
&lt;br /&gt;
角度与弧度间的互相转换则需用 DEG→RAD 和 RAD→DEG 函数，可在{{key|MATH}}菜单的 Real 类别中找到。&lt;br /&gt;
&lt;br /&gt;
== 度分秒与小数 ==&lt;br /&gt;
HMS→ 和 →HMS 函数，同样在{{key|MATH}}菜单的 Real 类别中。举例说明：&lt;br /&gt;
&lt;br /&gt;
12°30&#039;36&amp;quot; 转换为小数：&amp;lt;code&amp;gt;HMS→(12.3036)&amp;lt;/code&amp;gt;⇒12.51&lt;br /&gt;
&lt;br /&gt;
小数转换回度分秒：&amp;lt;code&amp;gt;→HMS(12.51)&amp;lt;/code&amp;gt;⇒12.3036&lt;br /&gt;
&lt;br /&gt;
== 单位转换 ==&lt;br /&gt;
{{key|MATH}}菜单中的 Convert 类别。&lt;br /&gt;
&lt;br /&gt;
== 进制转换 ==&lt;br /&gt;
无原生支持。&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8406</id>
		<title>User:Arnie97/HP 39 FAQ</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8406"/>
		<updated>2017-06-26T17:37:55Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​数字格式转换&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 自检与重启 =&lt;br /&gt;
&lt;br /&gt;
= 数字格式转换 =&lt;br /&gt;
HP 39gs 价格低廉，吸引了不少 Casio 函数机（含盗版仿制机）用户购买使用。唯二者操作方式差别较大，常有新用户询问某操作在 HP 39 系列上如何进行，故整理如下。&lt;br /&gt;
&lt;br /&gt;
== 极坐标与直角坐标 ==&lt;br /&gt;
利用复数，举例说明如下：&lt;br /&gt;
&lt;br /&gt;
转为直角坐标：&amp;lt;code&amp;gt;(220, ∠30)&amp;lt;/code&amp;gt;，其中{{key|∠}}在减号键上方。&lt;br /&gt;
&lt;br /&gt;
转回极坐标：&amp;lt;code&amp;gt;(ABS(Ans), ARG(Ans))&amp;lt;/code&amp;gt;，其中{{key|ABS}}和{{key|ARG}}在括号键上方。&lt;br /&gt;
&lt;br /&gt;
== 小数、假分数、带分数 ==&lt;br /&gt;
在 MODES（{{key|SHIFT}}+{{key|HOME}}）的第二项中选择 Standard，Fraction 或 Mixed Fraction 即可。&lt;br /&gt;
&lt;br /&gt;
== 角度、弧度、百分度 ==&lt;br /&gt;
同上，第一项中选择对应选项即可。&lt;br /&gt;
&lt;br /&gt;
角度与弧度间的互相转换则需用 DEG→RAD 和 RAD→DEG 函数，可在{{key|MATH}}菜单的 Real 类别中找到。&lt;br /&gt;
&lt;br /&gt;
== 度分秒与小数 ==&lt;br /&gt;
HMS→ 和 →HMS 函数，同样在{{key|MATH}}菜单的 Real 类别中。举例说明：&lt;br /&gt;
&lt;br /&gt;
12°30&#039;36&amp;quot; 转换为小数：&amp;lt;code&amp;gt;HMS→(12.3036)&amp;lt;/code&amp;gt;→12.51&lt;br /&gt;
转换回度分秒：&amp;lt;code&amp;gt;HMS→(Ans)&amp;lt;/code&amp;gt;→12.3036&lt;br /&gt;
&lt;br /&gt;
== 单位转换 ==&lt;br /&gt;
{{key|MATH}}菜单中的 Convert 类别。&lt;br /&gt;
&lt;br /&gt;
== 进制转换 ==&lt;br /&gt;
无原生支持。&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8405</id>
		<title>User:Arnie97/HP 39 FAQ</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_39_FAQ&amp;diff=8405"/>
		<updated>2017-06-26T16:41:09Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​目录&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 自检与重启 =&lt;br /&gt;
&lt;br /&gt;
= 数字格式转换 =&lt;br /&gt;
== 极坐标与直角坐标 ==&lt;br /&gt;
== 分数与小数 ==&lt;br /&gt;
== 度分秒与小数 ==&lt;br /&gt;
== 进制转换 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8403</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8403"/>
		<updated>2017-06-14T02:07:32Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​HP 39（40）系列的文件类型&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
* 本条目的主题不是 HP Saturn 系列计算器的基本操作；如果您有此方面的疑问，请查阅对应型号的用户手册。但是，如果您有联机传输方面的疑问，请继续阅读此文。&lt;br /&gt;
* 本条目的主题不是编程语言的语法帮助或函数索引；如果您有此方面的疑问，请查阅相关语言的教程和参考资料。本文中指出了每种编程语言可以参考的部分教程和资料，希望对您有所帮助。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数编程语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 [https://zh.wikipedia.org/wiki/X86-64 AMD64] 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox、Hyper-V 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
&#039;&#039;&#039;HPGCC&#039;&#039;&#039; 是一个由第三方团队开发的自由软件项目，它使我们能绕过 Saturn 模拟器，在 HP Apple 系列计算器上开发和运行原生 ARM 应用。该项目的核心开发组成员包括 Ingo Blank，Al Borowski，Claudio Lapilli 和 Benjamin Maurin，在此向他们的贡献表示感谢。&lt;br /&gt;
&lt;br /&gt;
HPGCC 目前已发布三个主版本，最新版本 HPGCC 3 相比前两个版本的变化较大，且仅支持 Big Apple 系列计算器（HP 49g+、HP 50g），因此本文不对其展开讨论，您可以访问其[http://hpgcc3.org/projects/hpgcc3 官方网站]了解相关知识。下文所述的 HPGCC 均指早期的 HPGCC 版本。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HPGCC 项目的核心是由 C 语言编写的 ARM 函数库和由 System RPL 编写的 ARM Toolbox。&#039;&#039;&#039;此外，HPGCC 的 Windows 发行版中还包含 arm-elf-gcc 工具链、Aplet 框架和简单的 GUI 编辑环境 [http://www.pnotepad.org Programmer&#039;s Notepad 2]。部分发行版中的 arm-elf-gcc 基于早期的 [https://en.wikipedia.org/wiki/Cygwin Cygwin] 编译，运行时可能出错崩溃，因此建议换用较新版本的工具链。&lt;br /&gt;
&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
&lt;br /&gt;
=== 文件类型的判定：扩展名与特征签名 ===&lt;br /&gt;
不同类型的文件需要用不同的方式解析。为了正确理解文件中数据的含义，首先需判断出文件的类型。&lt;br /&gt;
&lt;br /&gt;
文件类型的标示和识别主要有两种方式：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型代号 !! 文件类型&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/scipag/filerecon/blob/master/magicdatabase.txt|title=Github：File Recon}}&amp;lt;/ref&amp;gt; !! System RPL 变量类型 !! 对应的储存目录&lt;br /&gt;
|-&lt;br /&gt;
| A || Directory list || （不包含变量） || （无）&lt;br /&gt;
|-&lt;br /&gt;
| B || Aplet || &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;（Directory） || /&#039;apletdir&lt;br /&gt;
|-&lt;br /&gt;
| C || Note || &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt;（String） || /&#039;notesdir&lt;br /&gt;
|-&lt;br /&gt;
| D || Program || &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt;（String） || /&#039;pgmdir&lt;br /&gt;
|-&lt;br /&gt;
| E || Variable 等&amp;lt;ref&amp;gt;实际上，用 Conn3x 接收 List 及 Matrix，均会保存为该格式&amp;lt;/ref&amp;gt; || &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;（Real） || /&#039;calcdir&lt;br /&gt;
|-&lt;br /&gt;
| F || List || &amp;lt;code&amp;gt;{ }&amp;lt;/code&amp;gt;（List） || /&#039;calcdir&lt;br /&gt;
|-&lt;br /&gt;
| G || Matrix || &amp;lt;code&amp;gt;[[ ]]&amp;lt;/code&amp;gt;（Array） || /&#039;calcdir&lt;br /&gt;
|-&lt;br /&gt;
| H || Library || （Library） || Port 0（IRAM）&lt;br /&gt;
|-&lt;br /&gt;
| I || Target list || ||&lt;br /&gt;
|-&lt;br /&gt;
| J || Vector specification || ||&lt;br /&gt;
|-&lt;br /&gt;
| K || Wildcard || * ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8389</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8389"/>
		<updated>2017-06-03T10:12:02Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​修饰语句&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
* 本条目的主题不是 HP Saturn 系列计算器的基本操作；如果您有此方面的疑问，请查阅对应型号的用户手册。但是，如果您有联机传输方面的疑问，请继续阅读此文。&lt;br /&gt;
* 本条目的主题不是编程语言的语法帮助或函数索引；如果您有此方面的疑问，请查阅相关语言的教程和参考资料。本文中指出了每种编程语言可以参考的部分教程和资料，希望对您有所帮助。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数编程语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 [https://zh.wikipedia.org/wiki/X86-64 AMD64] 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox、Hyper-V 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
&#039;&#039;&#039;HPGCC&#039;&#039;&#039; 是一个由第三方团队开发的自由软件项目，它使我们能绕过 Saturn 模拟器，在 HP Apple 系列计算器上开发和运行原生 ARM 应用。该项目的核心开发组成员包括 Ingo Blank，Al Borowski，Claudio Lapilli 和 Benjamin Maurin，在此向他们的贡献表示感谢。&lt;br /&gt;
&lt;br /&gt;
HPGCC 目前已发布三个主版本，最新版本 HPGCC 3 相比前两个版本的变化较大，且仅支持 Big Apple 系列计算器（HP 49g+、HP 50g），因此本文不对其展开讨论，您可以访问其[http://hpgcc3.org/projects/hpgcc3 官方网站]了解相关知识。下文所述的 HPGCC 均指早期的 HPGCC 版本。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HPGCC 项目的核心是由 C 语言编写的 ARM 函数库和由 System RPL 编写的 ARM Toolbox。&#039;&#039;&#039;此外，HPGCC 的 Windows 发行版中还包含 arm-elf-gcc 工具链、Aplet 框架和简单的 GUI 编辑环境 [http://www.pnotepad.org Programmer&#039;s Notepad 2]。部分发行版中的 arm-elf-gcc 基于早期的 [https://en.wikipedia.org/wiki/Cygwin Cygwin] 编译，运行时可能出错崩溃，因此建议换用较新版本的工具链。&lt;br /&gt;
&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
&lt;br /&gt;
=== 文件类型的判定：扩展名与特征签名 ===&lt;br /&gt;
不同类型的文件需要用不同的方式解析。为了正确理解文件中数据的含义，首先需判断出文件的类型。&lt;br /&gt;
&lt;br /&gt;
文件类型的标示和识别主要有两种方式：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8388</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8388"/>
		<updated>2017-06-01T11:02:15Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​HPGCC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
* 本条目的主题不是 HP Saturn 系列计算器的基本操作；如果您有此方面的疑问，请查阅对应型号的用户手册。但是，如果您有联机传输方面的疑问，请继续阅读此文。&lt;br /&gt;
* 本条目的主题不是编程语言的语法帮助或函数索引；如果您有此方面的疑问，请查阅相关语言的教程和参考资料。本文中指出了每种编程语言可以参考的部分教程和资料，希望对您有所帮助。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 [https://zh.wikipedia.org/wiki/X86-64 AMD64] 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox、Hyper-V 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
&#039;&#039;&#039;HPGCC&#039;&#039;&#039; 是一个由第三方团队开发的自由软件项目，它使我们能绕过 Saturn 模拟器，在 HP Apple 系列计算器上开发和运行原生 ARM 应用。该项目的核心开发组成员包括 Ingo Blank，Al Borowski，Claudio Lapilli 和 Benjamin Maurin，在此向他们的贡献表示感谢。&lt;br /&gt;
&lt;br /&gt;
HPGCC 目前已发布三个主版本，最新版本 HPGCC 3 相比前两个版本的变化较大，且仅支持 Big Apple 系列计算器（HP 49g+、HP 50g），因此本文不对其展开讨论，您可以访问其[http://hpgcc3.org/projects/hpgcc3 官方网站]了解相关知识。下文所述的 HPGCC 均指早期的 HPGCC 版本。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HPGCC 项目的核心是由 C 语言编写的 ARM 函数库和由 System RPL 编写的 ARM Toolbox。&#039;&#039;&#039;此外，HPGCC 的 Windows 发行版中还包含 arm-elf-gcc 工具链、Aplet 框架和简单的 GUI 编辑环境 [http://www.pnotepad.org Programmer&#039;s Notepad 2]。部分发行版中的 arm-elf-gcc 基于早期的 [https://en.wikipedia.org/wiki/Cygwin Cygwin] 编译，运行时可能出错崩溃，因此建议换用较新版本的工具链。&lt;br /&gt;
&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
&lt;br /&gt;
=== 文件类型的判定：扩展名与特征签名 ===&lt;br /&gt;
不同类型的文件需要用不同的方式解析。为了正确理解文件中数据的含义，首先需判断出文件的类型。&lt;br /&gt;
&lt;br /&gt;
文件类型的标示和识别主要有两种方式：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8387</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8387"/>
		<updated>2017-06-01T10:44:09Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​修正笔误&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
* 本条目的主题不是 HP Saturn 系列计算器的基本操作；如果您有此方面的疑问，请查阅对应型号的用户手册。但是，如果您有联机传输方面的疑问，请继续阅读此文。&lt;br /&gt;
* 本条目的主题不是编程语言的语法帮助或函数索引；如果您有此方面的疑问，请查阅相关语言的教程和参考资料。本文中指出了每种编程语言可以参考的部分教程和资料，希望对您有所帮助。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 [https://zh.wikipedia.org/wiki/X86-64 AMD64] 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox、Hyper-V 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
HPGCC 目前有三个主版本。最新版本 HPGCC 3 相比前两个版本的变化较大，且仅支持 Big Apple 系列计算器（HP 49g+、HP 50g），因此本文不对其展开讨论，您可以访问其[http://hpgcc3.org/projects/hpgcc3 官方网站]了解相关知识。下文所述的 HPGCC 均指早期的 HPGCC 版本。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HPGCC 项目的核心是由 C 语言编写的 ARM 函数库和由 System RPL 编写的 ARM Toolbox。&#039;&#039;&#039;此外，HPGCC 的 Windows 发行版中还包含 arm-elf-gcc 工具链、Aplet 框架和简单的 GUI 编辑环境 [http://www.pnotepad.org Programmer&#039;s Notepad 2]。部分发行版中的 arm-elf-gcc 基于早期的 [https://en.wikipedia.org/wiki/Cygwin Cygwin] 编译，运行时可能出错崩溃，因此建议换用较新版本的工具链。&lt;br /&gt;
&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
&lt;br /&gt;
=== 文件类型的判定：扩展名与特征签名 ===&lt;br /&gt;
不同类型的文件需要用不同的方式解析。为了正确理解文件中数据的含义，首先需判断出文件的类型。&lt;br /&gt;
&lt;br /&gt;
文件类型的标示和识别主要有两种方式：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8386</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8386"/>
		<updated>2017-06-01T10:41:24Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* HPGCC */HPGCC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
* 本条目的主题不是 HP Saturn 系列计算器的基本操作；如果您有此方面的疑问，请查阅对应型号的用户手册。但是，如果您有联机传输方面的疑问，请继续阅读此文。&lt;br /&gt;
* 本条目的主题不是编程语言的语法帮助或函数索引；如果您有此方面的疑问，请查阅相关语言的教程和参考资料。本文中指出了每种编程语言可以参考的部分教程和资料，希望对您有所帮助。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 [https://zh.wikipedia.org/wiki/X86-64 AMD64] 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox、Hyper-V 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
HPGCC 目前有三个主版本。最新版本 HPGCC 3 相比前两个版本的变化较大，且仅支持 Big Apple 系列计算器（HP 49g+、HP 50g），因此本文不对其展开讨论，您可以访问其[http://hpgcc3.org/projects/hpgcc3 官方网站]了解相关知识。下文所述的 HPGCC 均指早期的 HPGCC 版本。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HPGCC 项目的核心是由 C 语言编写的 ARM 函数库和由 System RPL 编写的 ARM Toolbox。&#039;&#039;&#039;此外，HPGCC 的 Windows 发行版中还包含 arm-elf-gcc 工具链、Aplet 框架和简单的 GUI 编辑环境 [http://www.pnotepad.org Programmer&#039;s Notepad 2]。部分发行版中的 arm-elf-gcc 基于早期的 [https://en.wikipedia.org/wiki/Cygwin Cygwin]&lt;br /&gt;
 编译，运行时可能出错崩溃，因此建议换用较新版本的工具链。&lt;br /&gt;
&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
&lt;br /&gt;
=== 文件类型的判定：扩展名与特征签名 ===&lt;br /&gt;
不同类型的文件需要用不同的方式解析。为了正确理解文件中数据的含义，首先需判断出文件的类型。&lt;br /&gt;
&lt;br /&gt;
文件类型的标示和识别主要有两种方式：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8385</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8385"/>
		<updated>2017-06-01T10:08:43Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​概述：本文不是什么&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
* 本条目的主题不是 HP Saturn 系列计算器的基本操作；如果您有此方面的疑问，请查阅对应型号的用户手册。但是，如果您有联机传输方面的疑问，请继续阅读此文。&lt;br /&gt;
* 本条目的主题不是编程语言的语法帮助或函数索引；如果您有此方面的疑问，请查阅相关语言的教程和参考资料。本文中指出了每种编程语言可以参考的部分教程和资料，希望对您有所帮助。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 [https://zh.wikipedia.org/wiki/X86-64 AMD64] 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox、Hyper-V 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
&lt;br /&gt;
=== 文件类型的判定：扩展名与特征签名 ===&lt;br /&gt;
不同类型的文件需要用不同的方式解析。为了正确理解文件中数据的含义，首先需判断出文件的类型。&lt;br /&gt;
&lt;br /&gt;
文件类型的标示和识别主要有两种方式：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8384</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8384"/>
		<updated>2017-06-01T09:35:45Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* 数据类型与联机传输 */调整章节顺序&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 [https://zh.wikipedia.org/wiki/X86-64 AMD64] 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox、Hyper-V 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
&lt;br /&gt;
=== 文件类型的判定：扩展名与特征签名 ===&lt;br /&gt;
不同类型的文件需要用不同的方式解析。为了正确理解文件中数据的含义，首先需判断出文件的类型。&lt;br /&gt;
&lt;br /&gt;
文件类型的标示和识别主要有两种方式：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8383</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8383"/>
		<updated>2017-06-01T09:32:54Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* 数据类型与联机传输 */析出离题内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 [https://zh.wikipedia.org/wiki/X86-64 AMD64] 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox、Hyper-V 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
&lt;br /&gt;
=== 文件类型的判定：扩展名与特征签名 ===&lt;br /&gt;
不同类型的文件需要用不同的方式解析。为了正确理解文件中数据的含义，首先需判断出文件的类型。&lt;br /&gt;
&lt;br /&gt;
文件类型的标示和识别主要有两种方式：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/Off_Topic&amp;diff=8382</id>
		<title>User:Arnie97/Off Topic</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/Off_Topic&amp;diff=8382"/>
		<updated>2017-06-01T09:17:32Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​析出离题内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型判定：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8381</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8381"/>
		<updated>2017-06-01T08:52:13Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* 数据类型与联机传输 */内部链接&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 [https://zh.wikipedia.org/wiki/X86-64 AMD64] 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox、Hyper-V 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
以下数节与 HP Saturn 系列没有直接关联，而是计算机领域的基础知识。点击[[#HP Saturn 系列的对象类型（内部表示）|此处]]跳过该部分。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型判定：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8380</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8380"/>
		<updated>2017-06-01T08:28:20Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* ADK */修饰语句&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 [https://zh.wikipedia.org/wiki/X86-64 AMD64] 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox、Hyper-V 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8379</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8379"/>
		<updated>2017-06-01T08:10:42Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​外部链接&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 [https://zh.wikipedia.org/wiki/X86-64 AMD64] 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DOS_MZ_executable MZ 可执行文件]&lt;br /&gt;
[https://zh.wikipedia.org/wiki/可移植可执行 PE 可执行文件]&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| [https://zh.wikipedia.org/wiki/可執行與可鏈接格式 ELF 可执行文件] || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8378</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8378"/>
		<updated>2017-06-01T07:58:51Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​Basic：ADK&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 &#039;&#039;&#039;16 位&#039;&#039;&#039; Windows 平台上的 &#039;&#039;&#039;HP Basic 开发工具&#039;&#039;&#039;，该工具可以帮助用户编写 HP Basic，使用 HP Basic 扩充现有 Aplet 的功能（见 HP 39gs 用户手册第 18-10 页）。值得一提的是，该工具能编辑 Aplet 中嵌入的 Note 和 Sketch，因此您&#039;&#039;&#039;可以使用该工具将文本文档和黑白图片传入计算器显示&#039;&#039;&#039;，这对于尚未学会[[#HP Saturn 系列的文件类型（外部表示）|文件头部如何编写]]的用户尤为有用。&lt;br /&gt;
&lt;br /&gt;
虽然该工具的名称为 Aplet 开发套件，但该工具&#039;&#039;&#039;仅能在现有 Aplet 的基础上，对其 Views 菜单进行扩充&#039;&#039;&#039;（例如，为 Function Aplet 添加自动设置定义域和值域的功能）。要开发全新的 Aplet，请使用 [[#System RPL|System RPL]] 或 [[#HPGCC|HPGCC]]。&lt;br /&gt;
&lt;br /&gt;
由于 AMD64 平台的固有限制，&#039;&#039;&#039;64 位系统无法兼容 16 位应用&#039;&#039;&#039;。如果您需要在 64 位系统中运行该应用，建议用 DOSBox 等虚拟机运行 Windows 3.1、Windows 95 等 16 位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8377</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8377"/>
		<updated>2017-06-01T07:38:00Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​修复笔误&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
&#039;&#039;&#039;ADK&#039;&#039;&#039;（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 16 位 Windows 平台上的 HP Basic 开发工具。由于 AMD64 平台的固有限制，64 位系统无法兼容 16 位应用。如果您需要在 64 位系统中运行该应用，建议用 DOSBox 等虚拟机运行 Windows 3.1、Windows 95 等 16位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8376</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8376"/>
		<updated>2017-06-01T07:36:56Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​Basic：ADK&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
由于其为解释型语言，我们仅需记事本等纯文本编辑器即可在 PC 上进行该语言的开发。鉴于部分特殊符号是用多个 ASCII 字符来表示的（如赋值号 &amp;lt;code&amp;gt;►&amp;lt;/code&amp;gt; 表示为 &amp;lt;code&amp;gt;\|&amp;gt;&amp;lt;/code&amp;gt;），为了输入这些符号而免于记忆对应的 ASCII 序列，可以使用 [[#ADK|ADK]] 中的文本编辑器代替记事本进行开发。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
=== ADK ===&lt;br /&gt;
ADK（&#039;&#039;&#039;A&#039;&#039;&#039;plet &#039;&#039;&#039;D&#039;&#039;evelop &#039;&#039;&#039;K&#039;&#039;&#039;it，Aplet 开发套件）是 16 位 Windows 平台上的 HP Basic 开发工具。由于 AMD64 平台的固有限制，64 位系统无法兼容 16 位应用。如果您需要在 64 位系统中运行该应用，建议用 DOSBox 等虚拟机运行 Windows 3.1、Windows 95 等 16位操作系统或 Windows XP 等 32 位操作系统。&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8375</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8375"/>
		<updated>2017-06-01T07:19:33Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​修饰语句&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在速度缓慢的 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
作为解释性语言，使用记事本等文本编辑器输入代码即可在 PC 上开发 HP Basic 程序。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8374</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8374"/>
		<updated>2017-06-01T07:17:16Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​Basic：说明书&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
作为解释性语言，使用记事本等文本编辑器输入代码即可在 PC 上开发 HP Basic 程序。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
想学习 HP Basic 程序的编写，仅需阅读[http://welcome.hp-ww.com/ctg/Manual/c00751812.pdf HP 39gs 用户手册]（俗称说明书）即可。高级用法则需要对 [[#System RPL|System RPL]] 有所了解，见本章接下来两节的内容。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8373</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8373"/>
		<updated>2017-06-01T07:07:36Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​调整章节&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
作为解释性语言，使用记事本等文本编辑器输入代码即可在 PC 上开发 HP Basic 程序。为了将代码传入计算器中，代码头部应符合特定的格式，参见[[#HP Saturn 系列的文件类型（外部表示）|下文中的说明]]。&lt;br /&gt;
&lt;br /&gt;
=== 与 User RPL 和 System RPL 的关系 ===&lt;br /&gt;
HP Basic 的定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8372</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8372"/>
		<updated>2017-06-01T06:52:03Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​调整章节&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的对象类型（内部表示） ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP Saturn 系列的文件类型（外部表示） ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HP 39（40）系列 ====&lt;br /&gt;
==== HP 48 系列 ====&lt;br /&gt;
==== HP 49（50）系列 ====&lt;br /&gt;
&lt;br /&gt;
=== 串口与驱动程序 ===&lt;br /&gt;
=== Kermit 与 XMODEM ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8371</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8371"/>
		<updated>2017-06-01T06:39:55Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​内部链接&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 内部表示（变量）与外部表示（文件）间的关系 ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择 [[#调用 System RPL|39 系统中不完整的文件管理器]]或自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP 39（40）系列 ===&lt;br /&gt;
=== HP 48 系列 ===&lt;br /&gt;
=== HP 49（50）系列 ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8370</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8370"/>
		<updated>2017-06-01T06:31:39Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​修饰语句&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 内部表示（变量）与外部表示（文件）间的关系 ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
我们可以通过下面的实验来验证这一结论：用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，期间保持电源供给，以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择自己编写文件管理器外，亦可利用这一特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP 39（40）系列 ===&lt;br /&gt;
=== HP 48 系列 ===&lt;br /&gt;
=== HP 49（50）系列 ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8369</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8369"/>
		<updated>2017-06-01T06:28:47Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​引用：文件特征签名列表&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/List_of_file_signatures|title=英文维基百科：文件特征签名列表}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 内部表示（变量）外部表示（文件）与间的关系 ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
例如，我们用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，且期间保持电源供给以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择自己编写文件管理器外，亦可利用上述特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP 39（40）系列 ===&lt;br /&gt;
=== HP 48 系列 ===&lt;br /&gt;
=== HP 49（50）系列 ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8368</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8368"/>
		<updated>2017-06-01T06:22:33Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​修饰语句&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况（如 GIF 文件），也有多种扩展名对应单一特征签名的情况（如 PE 文件）。当扩展名和特征签名共存时，有时会结合两种因素来决定文件如何解析，更多时候则只选择其中的主要因素来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实质性作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 内部表示（变量）外部表示（文件）与间的关系 ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
例如，我们用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，且期间保持电源供给以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择自己编写文件管理器外，亦可利用上述特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP 39（40）系列 ===&lt;br /&gt;
=== HP 48 系列 ===&lt;br /&gt;
=== HP 49（50）系列 ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8367</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8367"/>
		<updated>2017-06-01T06:10:12Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​文件类型&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 数据类型与联机传输 ==&lt;br /&gt;
=== 数据对象的内部表示（变量） ===&lt;br /&gt;
数据在内存中以不同的方式（&#039;&#039;&#039;数据结构&#039;&#039;&#039;）储存着。这些数据结构当中有顺序的（例如线性表的数组形式），也有非顺序的（例如线性表的链表形式）。&lt;br /&gt;
&lt;br /&gt;
=== 数据对象的外部表示（文件） ===&lt;br /&gt;
为了将数据，尤其是非顺序的数据：&lt;br /&gt;
* 保存于外存（硬盘、光盘、闪存等）的某个文件中以备后用&lt;br /&gt;
* 通过网络等方式共享给另一台计算机&lt;br /&gt;
* 通过串口等方式传送至图形计算器等设备&lt;br /&gt;
&lt;br /&gt;
我们需要将数据编码为字符串（字节流）方能储存或传输，这一编码过程称为&#039;&#039;&#039;序列化（Serialization）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 变量的类型系统：静态类型与动态类型 ===&lt;br /&gt;
变量是代指数据的名称、符号。&lt;br /&gt;
* 在 C++、Java 等语言中，&#039;&#039;&#039;每个变量均对应一个特定的数据类型&#039;&#039;&#039;，使用前必须声明每个变量的数据类型，这样的类型系统称为&#039;&#039;&#039;静态类型&#039;&#039;&#039;。&lt;br /&gt;
* 在 Haskell 等语言中，虽然很多情况下不需手动声明变量的数据类型，而是通过计算机的&#039;&#039;&#039;自动推导&#039;&#039;&#039;来确定数据类型，但每个变量均有特定的类型——类似 C++ 11 中使用 &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; 的情形——因此同样属于静态类型。&lt;br /&gt;
* 在 Python、JavaScript 等语言中，&#039;&#039;&#039;类型依附于变量中储存的数据本身，数据有类型而变量无类型&#039;&#039;&#039;，这样的类型系统称为&#039;&#039;&#039;动态类型&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 文件的类型系统：扩展名与特征签名 ===&lt;br /&gt;
类比变量，文件名（和路径）是代指文件的符号。对于文件来说，同样有数种不同的方式来记录它的类型，其中就包括：&lt;br /&gt;
* 文件&#039;&#039;&#039;名称&#039;&#039;&#039;的某个特定部分指示一个文件的类型——通常是最后一个小数点后的部分，也就是&#039;&#039;&#039;扩展名（Extension）&#039;&#039;&#039;。&lt;br /&gt;
* 文件&#039;&#039;&#039;内容&#039;&#039;&#039;的某个特定部分，即&#039;&#039;&#039;特征签名（File Signature）&#039;&#039;&#039;指示一个文件的类型——通常是最前面的部分，也就是&#039;&#039;&#039;头部（Header）&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
扩展名最早在 [https://en.wikipedia.org/wiki/CP/M CP/M] 操作系统中被采用，而后又随一脉相承的 DOS 和 Windows 得到了推广；特征签名则在 &amp;lt;span style=&amp;quot;font-variant: small-caps;&amp;quot;&amp;gt;Unix&amp;lt;/span&amp;gt; 中被广泛应用，而后又被 Linux 等操作系统所继承下来。由于两类操作系统均得到了广泛的应用，现实中两种方式常常共存：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| MZ 可执行文件&lt;br /&gt;
PE 可执行文件&lt;br /&gt;
|| com exe&lt;br /&gt;
exe dll sys ocx cpl scr 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;MZ&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;M&#039;&#039;&#039;ark &#039;&#039;&#039;Z&#039;&#039;&#039;bikowski）&lt;br /&gt;
（为向下兼容 DOS，PE 文件头部与之相同）&lt;br /&gt;
|-&lt;br /&gt;
| ELF 可执行文件 || 无 || &amp;lt;code&amp;gt;\x7F&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDF 文档 || pdf || &amp;lt;code&amp;gt;%PDF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ZIP 压缩文件 || zip docx pptx xlsx 等 || &amp;lt;code&amp;gt;PK&amp;lt;/code&amp;gt;（设计者 &#039;&#039;&#039;P&#039;&#039;&#039;hil &#039;&#039;&#039;K&#039;&#039;&#039;atz）&lt;br /&gt;
|-&lt;br /&gt;
| RAR 压缩文件 || rar || &amp;lt;code&amp;gt;Rar!&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CAB 压缩文件 || cab || &amp;lt;code&amp;gt;MSCF&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;icro&#039;&#039;&#039;s&#039;&#039;&#039;oft &#039;&#039;&#039;C&#039;&#039;&#039;abinet &#039;&#039;&#039;F&#039;&#039;&#039;ile）&lt;br /&gt;
|-&lt;br /&gt;
| PNG 图片 || png || &amp;lt;code&amp;gt;\x89&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GIF 图片 || gif || &amp;lt;code&amp;gt;GIF89a&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;GIF87a&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| JPEG 图片 || jpg jpeg || 以 &amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD8&amp;lt;/code&amp;gt;开始，&amp;lt;code&amp;gt;\xFF&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xD9&amp;lt;/code&amp;gt; 结束&lt;br /&gt;
|-&lt;br /&gt;
| Midi 音轨 || midi || &amp;lt;code&amp;gt;MThd&amp;lt;/code&amp;gt;（&#039;&#039;&#039;M&#039;&#039;&#039;IDI &#039;&#039;&#039;T&#039;&#039;&#039;rack &#039;&#039;&#039;h&#039;&#039;&#039;ea&#039;&#039;&#039;d&#039;&#039;&#039;er）&lt;br /&gt;
|-&lt;br /&gt;
| Java 字节码 || class || &amp;lt;code&amp;gt;\xCA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xFE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBA&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;\xBE&amp;lt;/code&amp;gt;，即十六进制 &amp;lt;code&amp;gt;CAFEBABE&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
从上面的例子中可以看出，既有一个扩展名对应多种特征签名的情况，也有多种扩展名对应单一特征签名的情况。此外，由于两种方式共存，很多软件只选择其一来判断文件的类型。例如，将 JPEG 图片的扩展名更改为 png 仍能用多数图片查看器正常打开，说明这些软件仅通过文件内容中的特征签名来判断文件的格式，扩展名无关紧要。&#039;&#039;&#039;同样，HP Saturn 系列计算器也仅判定文件的特征签名，而扩展名的作用只是辅助人类的辨识：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 文件类型 !! 常见扩展名 !! 特征签名&lt;br /&gt;
|-&lt;br /&gt;
| HP 39（40）系列 || 000 apt lib 等&lt;br /&gt;
|| &amp;lt;code&amp;gt;HP39Asc?&amp;lt;/code&amp;gt;（文本，&#039;&#039;&#039;ASC&#039;&#039;&#039;II）&lt;br /&gt;
&amp;lt;code&amp;gt;HP39Bin?&amp;lt;/code&amp;gt;（二进制，&#039;&#039;&#039;Bin&#039;&#039;&#039;ary）&lt;br /&gt;
|-&lt;br /&gt;
| HP 48 系列 || 不固定 || &amp;lt;code&amp;gt;HPHP48-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HP 49（50）系列 || hp lib 等 || &amp;lt;code&amp;gt;HPHP49-?&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
上表中，&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; 代指表示文件类型的一个大写拉丁字母；同一字母在不同系列中有着不同的意义，详见下文各章节。另外，由于扩展名并无实际作用，用户可根据自己的喜好和实际情况选择不同的扩展名——例如，为了方便用记事本打开，可以用 txt 作为扩展名；&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/Arnie97/neko-notepad/blob/master/readme_40gs.txt|title=GitHub：Neko Notepad}}&amp;lt;/ref&amp;gt;为了方便用户区分不同机种的文件，跨平台应用的开发者有时直接用 48、49 等作为扩展名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.hpcalc.org/details/476|title=HPCalc.org：Columns+}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 内部表示（变量）外部表示（文件）与间的关系 ===&lt;br /&gt;
表面上看，HP 39（40）、48、49（50）的文件格式互不相同，PC 上的官方联机工具（Connectivity Kit）也形式各异。但是，多项证据已经表明，&#039;&#039;&#039;不同系列的 Saturn 机种使用相同的方式来储存 RAM 中的对象&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
例如，我们用含有 HP 48gII 固件的 ROM 替换 HP 39gs 原有的闪存，且期间保持电源供给以免 RAM 中的数据丢失。那么，当进入 49 系列的系统后，我们将看到之前在 39 系列系统中储存的所有文件（和文件夹）。鉴于 39 系列系统中并未提供完整的文件管理器，如果想探查 39 系列计算器的目录结构，除了选择自己编写文件管理器外，亦可利用上述特性，借助 49 系列内置的文件管理器来达到目的。&lt;br /&gt;
&lt;br /&gt;
综上所述，&#039;&#039;&#039;不同系列间文件格式的差异，本质上是相同对象类型的不同序列化形式&#039;&#039;&#039;，传入计算器后的生成的对象是相同的，可谓“换汤不换药”。&lt;br /&gt;
&lt;br /&gt;
=== HP 39（40）系列 ===&lt;br /&gt;
=== HP 48 系列 ===&lt;br /&gt;
=== HP 49（50）系列 ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8366</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8366"/>
		<updated>2017-05-31T18:19:41Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​增加章节&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 文件与联机传输 ==&lt;br /&gt;
=== HP 39（40）系列 ===&lt;br /&gt;
=== HP 48 系列 ===&lt;br /&gt;
=== HP 49（50）系列 ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8365</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8365"/>
		<updated>2017-05-31T18:04:56Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​增加章节&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 系统架构概述 ==&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
=== Aplet 框架 ===&lt;br /&gt;
=== 内存布局与固件 ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8364</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8364"/>
		<updated>2017-05-30T12:24:31Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* RPN */RPN：修正笔误&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 2 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 2，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8363</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8363"/>
		<updated>2017-05-30T11:37:00Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​User RPL：清理迷之重复&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 4 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 4，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8362</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8362"/>
		<updated>2017-05-30T11:32:34Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​User RPL：支持机型&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 4 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 4，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、48、49（50）等系列的计算器支持该语言代码的运行。如果在设置中选择 RPN 输入模式，那么用户在计算界面中输入的有效指令实际上均可以视为合法的 User RPL 代码。&lt;br /&gt;
&lt;br /&gt;
字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的有效指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8361</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8361"/>
		<updated>2017-05-30T11:14:57Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​User RPL 部分&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 4 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 4，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
User RPL 是 HP RPN 计算器上的一种&#039;&#039;&#039;解释型语言&#039;&#039;&#039;。顾名思义，该语言中同样采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
User RPL 的语法和 System RPL 相近，但代码可以直接在计算器上运行而不需要编译。运行时发生的大部分错误会被正确捕获，且部分较为危险的底层命令无法直接使用。这些特性使得 User RPL 的编写和调试更方便和安全，但也使它的运行速度较 System RPL 缓慢，在需要对系统底层进行操控及性能因素至关重要的场合（如某些游戏）应当选择 System RPL。&lt;br /&gt;
&lt;br /&gt;
User RPL 能通过多种方式调用 System RPL 特有的函数，相关内容并入下文 HP Basic 的[[#调用 System RPL|相关章节]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
在 HP 49（50）系列计算器内置的文件管理器（Filer）中，User RPL 代码的文件类型为 &amp;lt;code&amp;gt;PROG&amp;lt;/code&amp;gt;，System RPL 源码的类型为普通字符串 &amp;lt;code&amp;gt;STRNG&amp;lt;/code&amp;gt;，而 System RPL 编译出的二进制对象类型为 &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
HP Basic 是 HP 38、39（40）系列计算器的解释型语言，其定位与 HP 48、49（50）系列中的 User RPL 相似——用户在 HOME 界面中输入的指令均为合法的 HP Basic 代码。由于该语言的代码通过解释器执行，且解释器本身又运行在 Saturn 处理器或模拟器上，因此速度是本文提及的所有语言中最慢的。&lt;br /&gt;
&lt;br /&gt;
=== 调用 System RPL ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8360</id>
		<title>User:Arnie97/HP Saturn Intro</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97/HP_Saturn_Intro&amp;diff=8360"/>
		<updated>2017-05-30T10:21:52Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​HP Saturn 系列编程指南：RPN 与 System RPL 部分&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
本条目介绍的是 [[HP-Apple系列|HP Apple]] {{黑幕|39gs}} 等 Saturn 系列计算器的基础知识。&lt;br /&gt;
&lt;br /&gt;
== Saturn ==&lt;br /&gt;
Saturn 是 HP 于上世纪 80 年代为其计算器开发的一种&#039;&#039;&#039; 4 位微处理器&#039;&#039;&#039;，该处理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/HP_Saturn|title=英文维基百科：HP Saturn}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apple（Saturn+）系列 ==&lt;br /&gt;
在 Saturn 处理器停产后，为了保持与 Saturn 平台原有程序的兼容性，HP 推出了一系列&#039;&#039;&#039;在 ARM 处理器上运行 Saturn 模拟器&#039;&#039;&#039;的计算器，与上面的那些子系列相对，软件模拟的 Saturn 处理器被称为 &#039;&#039;&#039;Apple 系列&#039;&#039;&#039;。这些模拟处理器相比之前真实的 Saturn 处理器拥有更多的功能，因此也被称作 &#039;&#039;&#039;Saturn+&#039;&#039;&#039;。&lt;br /&gt;
Apple 系列推出后，39、49 系列的图形计算器均发布了多款对应的新型号：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 系列 !! 原型号（Yorke 系列处理器） !! 新型号（Apple 系列模拟处理器）&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-39系列|39]] || 39g 40g || 39g+ 39gs 40gs&lt;br /&gt;
|-&lt;br /&gt;
| [[HP-50G|49]] || 49g || 48gII 49g+ 50g&lt;br /&gt;
|}&lt;br /&gt;
这些新型号的系统软件与相对应的原有型号非常相近，只不过系统是运行在模拟器内，而不是运行在真实的 Saturn 处理器上。因此，很多相关的术语保留了下来。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;值得注意的是，名为“HP ??gII”的计算器（“?”代指数字）往往与同编号的其他产品大相径庭，切勿混淆。例如，HP 48gII 不属于 HP 48 系列，而属于 HP 49 系列；而 [[HP-39系列#HP-39GII|HP 39gII]] 则不属于 Saturn 系列产品，而与后期推出的 [[HP-Prime|HP Prime]] 有几分相近。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Saturn 汇编语言 ==&lt;br /&gt;
无论是原有 Saturn 系列还是 Apple 系列，由于使用了或真或假的 Saturn 处理器，显然都可以直接使用 Saturn 汇编语言编写程序。&lt;br /&gt;
&lt;br /&gt;
Saturn 汇编常与编译型语言 System RPL 共同使用，相关内容详见[[#System RPL|下文]]，在此不再赘述。&lt;br /&gt;
&lt;br /&gt;
== RPN ==&lt;br /&gt;
RPN（&#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;N&#039;&#039;&#039;otation，逆波兰表示法）将运算符置于操作数的后面，因此又称&#039;&#039;&#039;后缀表示法&#039;&#039;&#039;。与之相对的是绝大多数语言采用的&#039;&#039;&#039;代数表示法&#039;&#039;&#039;（Algebraic Notation，运算符位于操作数之间，又称中缀表示法）和 Lisp 等语言采用的波兰表示法（运算符位于操作数之前，又称前缀表示法）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 表达式记法 !! 运算符位置 !! 示例 !! 采用该记法的语言&lt;br /&gt;
|-&lt;br /&gt;
| 波兰表示法 || 前缀 || * - 3 4 5 || Scheme，Common Lisp 等&lt;br /&gt;
|-&lt;br /&gt;
| 代数表示法 || 中缀 || (3 - 4) * 5 || C++，Python，[[TI-Lua]]，HP Basic 等&lt;br /&gt;
|-&lt;br /&gt;
| 逆波兰表示法 || 后缀 || 3 4 - 5 * || Forth，System RPL 等&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
逆波兰表达式的解释器一般是基于栈（Stack）这一数据结构的。要理解 RPN，最好先理解栈的概念。&lt;br /&gt;
RPN 解释求值的过程一般是：遇到操作数时入栈；遇到运算符时，取对应数量的操作数出栈，求值，将结果入栈；最终栈顶就是表达式的值。&lt;br /&gt;
&lt;br /&gt;
例如，常规中缀记法的 &amp;lt;code&amp;gt;12 * (3 + 4) - 6 + 8 / 2&amp;lt;/code&amp;gt; 用 RPN 写作 &amp;lt;code&amp;gt;12 3 4 + * 6 - 8 2 / +&amp;lt;/code&amp;gt;，其运算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:RPN运算过程示意图.png|无框|RPN运算过程示意图]]&lt;br /&gt;
&lt;br /&gt;
* 首先，12、3、4 依次入栈。&lt;br /&gt;
* 输入加号时，由于它是二元运算符，会弹出栈顶的两个数进行运算，并将结果 7 压入栈中。&lt;br /&gt;
* 乘法同样是二元运算，弹出栈顶的 12 和 7 两个数，并将结果 84 返回栈顶。&lt;br /&gt;
* 随后，数字 6 入栈。&lt;br /&gt;
* 之后是减法，取出栈顶的 84 和 6，并返回结果 78。&lt;br /&gt;
* 随后，8 和 4 入栈。&lt;br /&gt;
* 之后是除法，取出栈顶的 8 和 4，并将结果 4 压入栈中。&lt;br /&gt;
* 最后取出 4 和 78 做加法，得到最终结果 82。&lt;br /&gt;
&lt;br /&gt;
RPN 的运算符之间不存在优先级的高低，不需要使用括号来表明运算的优先级，因此能减少输入部分复杂表达式时按键的次数。&lt;br /&gt;
例如，常规中缀记法中 &amp;lt;code&amp;gt;3 - 4 * 5&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;(3 - 4) * 5&amp;lt;/code&amp;gt; 的意义不相同，需要用括号加以区分；但后缀记法中前者写做 &amp;lt;code&amp;gt;3 4 5 * -&amp;lt;/code&amp;gt; ，后者则写做 &amp;lt;code&amp;gt;3 4 - 5 *&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
== System RPL ==&lt;br /&gt;
System RPL（其中 RPL 指 &#039;&#039;&#039;R&#039;&#039;&#039;everse &#039;&#039;&#039;P&#039;&#039;&#039;olish &#039;&#039;&#039;L&#039;&#039;&#039;isp）是 HP 计算器上广泛使用的一种&#039;&#039;&#039;编译型语言&#039;&#039;&#039;。顾名思义，该语言中的语句采用逆波兰表示法。&lt;br /&gt;
&lt;br /&gt;
HP 28、38、39（40）、48、49（50）等系列的图形计算器均支持该语言&amp;lt;ref&amp;gt;{{cite web|url=https://en.wikipedia.org/wiki/RPL_(programming_language)|title=英文维基百科：RPL}}&amp;lt;/ref&amp;gt;，且大部分系统软件和很多第三方软件由该语言写就。HP 38、39（40）、49（50）等新系列计算器的很多第三方应用来源于对 HP 48 等早期系列中 System RPL 应用的移植和重新编译。&lt;br /&gt;
&lt;br /&gt;
作为一种贴近底层的编译型系统编程语言，System RPL 常与 Saturn 汇编共同使用，这与 PC 平台上的 C 语言和 x86 汇编语言有着相通之处。这两种语言可以用 PC 上的 &#039;&#039;&#039;HP Tools&#039;&#039;&#039; 开发。此外，HP 49、50 等系列的计算器内置了 &#039;&#039;&#039;MASD&#039;&#039;&#039;，可以直接在计算器上进行编译、汇编、调试操作。注意 HP Tools 和 MASD 均是编译器本身，并不包含&#039;&#039;&#039;头文件（Entry Points，或简称 Entries）&#039;&#039;&#039;，如果不希望手动声明系统提供的函数，需要自行下载头文件，其中的原理与 C 语言是相通的。HP 28、38、39（40）、48、49（50）系列的头文件互不相同，下载时需根据所针对的机型正确选择。&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
=== Aplet ===&lt;br /&gt;
&lt;br /&gt;
== User RPL ==&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
&lt;br /&gt;
== HP Basic ==&lt;br /&gt;
=== 与 System RPL 的关系 ===&lt;br /&gt;
&lt;br /&gt;
== HPGCC ==&lt;br /&gt;
=== ARM Toolbox ===&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=File:RPN%E8%BF%90%E7%AE%97%E8%BF%87%E7%A8%8B%E7%A4%BA%E6%84%8F%E5%9B%BE.png&amp;diff=8359</id>
		<title>File:RPN运算过程示意图.png</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=File:RPN%E8%BF%90%E7%AE%97%E8%BF%87%E7%A8%8B%E7%A4%BA%E6%84%8F%E5%9B%BE.png&amp;diff=8359"/>
		<updated>2017-05-30T07:41:26Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​来自 http://www.cppblog.com/guogangj/archive/2009/10/14/98565.html&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;来自 http://www.cppblog.com/guogangj/archive/2009/10/14/98565.html&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=User:Arnie97-Robot&amp;diff=8357</id>
		<title>User:Arnie97-Robot</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=User:Arnie97-Robot&amp;diff=8357"/>
		<updated>2017-04-19T06:06:14Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​机器人用户页&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User alternate acct|Arnie97}}&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=HP-39%E7%B3%BB%E5%88%97&amp;diff=8355</id>
		<title>HP-39系列</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=HP-39%E7%B3%BB%E5%88%97&amp;diff=8355"/>
		<updated>2017-04-19T05:50:18Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​链接：RPL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{不完整|为本{{NS}}添加词条图片}}&lt;br /&gt;
HP-39系列是HP（惠普公司）的一个图形计算器系列。该系列计算器带有一定程度的代数运算功能，然而这种代数运算并不完善－－－例如，它无法以自然书写方式输出根式。同时，它支持的代数运算仅仅是少数运算命令，而不能完成如A+A=2A等代数运算。&lt;br /&gt;
&lt;br /&gt;
HP-39系列计算器带有一个蜂鸣器（HP-39GII无蜂鸣器），这是图形计算器中非常少见的。然而，HP-39系列的蜂鸣器并不能像基础型计算器那样，在按键时发出按键音－－－该蜂鸣器仅能用于在程序中作为声音提示或用于在游戏中发出音效。&lt;br /&gt;
&lt;br /&gt;
该系列机型由于面向教育市场，为降低操作难度，没有使用惠普推崇的RPN输入方式，而使用线性输入方式。这使得该系列机型成为了惠普图形计算器中少见的不使用RPN输入方式的机型。同时，它也不采用[[RPL|RPL语言]]作为机上编程语言（但Aplet仍然是使用RPL语言编写的）。&lt;br /&gt;
==HP-39==&lt;br /&gt;
HP-39（代号F1906A）是HP-39系列的第一部产品，于2000年发布。&lt;br /&gt;
===硬件信息===&lt;br /&gt;
*  CPU：4MHz “Yorke”，惠普的“土星”架构&lt;br /&gt;
*  RAM：256KB&lt;br /&gt;
*  屏幕：131*64分辨率，黑白液晶屏幕&lt;br /&gt;
*  通讯：红外线通讯和RS-232串口通讯&lt;br /&gt;
*  特色功能：蜂鸣器和简单的代数运算功能&lt;br /&gt;
*  供电：3节AAA电池作为主电池，一枚CR2032电池作为记忆保护电池&lt;br /&gt;
该机采用不可刷写的ROM，用户不能对其操作系统进行升级，也不能在ROM中存储用户数据。&lt;br /&gt;
&lt;br /&gt;
==HP-39G+==&lt;br /&gt;
[[Image:HP39g+.jpg|160px|thumb|right|HP-39G+]]&lt;br /&gt;
HP-39G+（代号：F2224A）是HP-39的改进机型，于2003年9月发布。&lt;br /&gt;
===硬件信息===&lt;br /&gt;
*  CPU：三星S3C2410X，75MHz，ARM架构&lt;br /&gt;
要注意的是，尽管采用了ARM架构的处理器，然而HP-39G+的操作系统和程序仍然是Saturn架构的---这块ARM处理器实际上是在运行一个Saturn模拟器。这种方式极大地浪费了硬件性能，导致计算器运行缓慢---即便是像对整数开平方根这种简单运算也往往需要超过0.3秒才能完成。&lt;br /&gt;
&lt;br /&gt;
*  RAM：256KB&lt;br /&gt;
*  屏幕：131*64分辨率，黑白液晶屏幕&lt;br /&gt;
*  通讯：添加了USB接口以便于和电脑连接来传输程序，然而RS232接口和红外通讯端口被去掉。&lt;br /&gt;
*  供电：3节AAA电池作为主电池，一枚CR2032电池作为记忆保护电池&lt;br /&gt;
*  特色功能：蜂鸣器和简单的代数运算功能&lt;br /&gt;
&lt;br /&gt;
该机采用不可刷写的ROM，用户不能对其操作系统进行升级，也不能在ROM中存储用户数据。&lt;br /&gt;
&lt;br /&gt;
此外，HP39G+不再附赠保护盖。&lt;br /&gt;
&lt;br /&gt;
==HP-39GS==&lt;br /&gt;
[[File:HP39GS.jpg|160px|thumb|right|HP-39GS]]&lt;br /&gt;
HP-39GS（代号：F2223A）是HP-39G+的进一步改进版本，于2006年6月发布。&lt;br /&gt;
===硬件信息===&lt;br /&gt;
*  CPU：三星S3C2410X，75MHz，ARM架构&lt;br /&gt;
要注意的是，尽管采用了ARM架构的处理器，然而HP-39GS的操作系统和程序仍然是Saturn架构的---这块ARM处理器实际上是在运行一个Saturn模拟器。这种方式极大地浪费了硬件性能，导致计算器运行缓慢---即便是像对整数开平方根这种简单运算也往往需要超过0.3秒才能完成。&lt;br /&gt;
&lt;br /&gt;
*  RAM：256KB&lt;br /&gt;
*  屏幕：131*64分辨率，黑白液晶屏幕&lt;br /&gt;
*  通讯：USB接口，并重新启用红外通讯和RS232串口通讯功能&lt;br /&gt;
*  供电：3节AAA电池作为主电池，一枚CR2032电池作为记忆保护电池&lt;br /&gt;
*  特色功能：蜂鸣器和简单的代数运算功能&lt;br /&gt;
该机采用了可刷写的ROM，用户可以对计算器的操作系统进行升级。&lt;br /&gt;
&lt;br /&gt;
HP-39GS附赠保护盖。&lt;br /&gt;
&lt;br /&gt;
===特别提示===&lt;br /&gt;
HP-39GS在网上的售价非常低廉（通常低于50人民币/台），这使得很多人非常推崇此计算器，将其作为一个物美价廉的产品来大力推荐。然而要注意的是：&#039;&#039;&#039;{{color|red|这种计算器运算功能差，速度慢，操作复杂，不推荐作为日常使用的图形计算器&#039;&#039;&#039;。}}&lt;br /&gt;
&lt;br /&gt;
==HP-39GII==&lt;br /&gt;
[[File:HP39Gii Graphing Calculator.jpg|160px|thumb|right|HP-39GII]]&lt;br /&gt;
HP-39GII（代号：NW249AA）是HP-39GS的大幅度改进版本（&#039;&#039;&#039;然而，计算功能上并没有实质上的改进&#039;&#039;&#039;)，于2011年10月发布。&lt;br /&gt;
&lt;br /&gt;
HP-39GII具有如下特点：&lt;br /&gt;
&lt;br /&gt;
*  采用了80MHz的飞思卡尔处理器（ARM架构），并采用了为适应ARM架构而全新设计的操作系统，不再以Saturn模拟器方式运行，极大地提高了运算速度；&lt;br /&gt;
*  ROM容量大幅增加至128MB（其中用户可用空间为80-105MB）；&lt;br /&gt;
*  采用灰阶液晶显示屏，分辨率增加到156*128像素；&lt;br /&gt;
*  操作系统带有全中文界面。&lt;br /&gt;
===硬件信息===&lt;br /&gt;
*  CPU：飞思卡尔处理器，80MHz，ARM架构&lt;br /&gt;
&lt;br /&gt;
该机已不再采用Saturn模拟器，因此运行效率远高于前几代HP-39系列产品。&lt;br /&gt;
*  RAM：256KB&lt;br /&gt;
*  ROM：128MB（其中用户可用空间为80-105MB）&lt;br /&gt;
*  屏幕：131*64分辨率，黑白液晶屏幕&lt;br /&gt;
*  通讯：Mini-USB接口-－－红外通讯和串口通讯功能被去掉&lt;br /&gt;
*  特色功能：简单而不精确的代数运算功能&lt;br /&gt;
该机采用了可刷写的ROM，用户可以对计算器的操作系统进行升级，并可在ROM内存储用户数据。&lt;br /&gt;
&lt;br /&gt;
与此同时，HP-39GII的蜂鸣器被去掉。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;该机售价很昂贵而运算功能不强，因此不推荐购买。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==HP-39系列计算器的功能升级==&lt;br /&gt;
HP-39系列计算器具有一些特殊的特性。通过利用这些特性，可以让HP-39系列免费或以很低廉的成本获得其本身没有的功能。&lt;br /&gt;
===HP-39G和HP-39G+===&lt;br /&gt;
HP-39G和HP-39G+和HP-40G虽然不是相同的机型，但操作系统中均带有HP-40G的代数运算功能。HP-39G（+）和HP-40G在操作系统上的区别仅在于这部分程序是否在操作系统中启用。&lt;br /&gt;
&lt;br /&gt;
利用这个特点，有人为HP-39G和HP-39G+开发了一个特别的应用程序，能够在HP-39G和HP-39G+上启用HP-40G的代数运算功能，从而获得更为强大的代数运算能力。&lt;br /&gt;
&lt;br /&gt;
*  此程序不适用于HP-39GS和HP-39GII。&lt;br /&gt;
&lt;br /&gt;
===HP-39GS===&lt;br /&gt;
来自[http://www.cncalc.org cncalc计算器论坛]的用户nbzwt研究发现，在拆除HP-39GS的ROM芯片，并更换为更大容量的芯片和刷入HP-48GII计算器的操作系统后，HP-39GS就会获得更为强大的HP-48GII计算器的全部功能。&lt;br /&gt;
&lt;br /&gt;
具体的操作步骤，请参见：[http://www.cncalc.org/thread-11475-1-1.html HP 39gs升级48gII]&lt;br /&gt;
&lt;br /&gt;
在进行升级操作后，HP-39GS的按键功能会变为HP-48GII的按键功能，不再与按键标记对应。用户需要自行将HP-48GII的按键标记写在按键上，或打印按键贴纸贴在按键上。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{color|red|注意：此操作需要有一定的集成电路焊接技术，并有一定的危险性。若您对自己的操作技术没有把握，请不要尝试，以免损坏计算器。}}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
nbzwt还发现ARM9的HP-39GS带有JTAG，这样，HP39-GS几乎就是一块S3C2410开发板。&lt;br /&gt;
具体的操作步骤，请参见：[http://www.crystalradio.cn/forum.php?mod=viewthread&amp;amp;tid=750734 把HP 39gs计算器变成ARM9开发板]&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=RPL&amp;diff=8354</id>
		<title>RPL</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=RPL&amp;diff=8354"/>
		<updated>2017-04-19T05:44:43Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​概述&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{尚未完工}}&lt;br /&gt;
&#039;&#039;&#039;RPL&#039;&#039;&#039; 是 HP 部分图形计算器中的系统和应用编程语言。RPL 的名称最初原于 &#039;&#039;&#039;Reverse Polish Lisp&#039;&#039;&#039; 的缩写，但后来 HP 营销部称其为 &#039;&#039;&#039;ROM-based Procedural Language&#039;&#039;&#039; 之缩写。&lt;br /&gt;
&lt;br /&gt;
除 HP 28、48、49、50 系列等支持 RPN 输入的计算器外，HP 38、39、40 等不支持 RPN 输入的计算器中同样使用了 RPL 语言。&lt;br /&gt;
RPL 与同样基于栈的 Forth 语言及基于列表的 Lisp 语言有相似之处。与栈深度最多4级的早期 HP RPN 计算器不同，RPL 栈的大小理论上是无限的，仅受制于计算器 RAM 的可用空间。&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=TI-86&amp;diff=8269</id>
		<title>TI-86</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=TI-86&amp;diff=8269"/>
		<updated>2017-01-10T11:20:44Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* 模拟器 */ macOS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox calculator&lt;br /&gt;
|name = TI-86&lt;br /&gt;
|image = TI-86 calculator.jpg&lt;br /&gt;
|caption = 一台TI-86计算器&lt;br /&gt;
|type = [[图形计算器]]&lt;br /&gt;
| entry        =[[Calculator_input_methods#Infix_notation|D.A.L.]]&lt;br /&gt;
|manufacturer = [[德州仪器]]&lt;br /&gt;
|introduced = 1997&lt;br /&gt;
|discontinued = 2004&lt;br /&gt;
|predecessor = [[TI-85]]&lt;br /&gt;
|successor = &lt;br /&gt;
|processor = [[Zilog Z80]]&lt;br /&gt;
| frequency  = 6 MHz   &lt;br /&gt;
|memory_user =96 kB RAM&lt;br /&gt;
|display_size = 128×64 像素，21×8 个字符&lt;br /&gt;
|precision = &lt;br /&gt;
|link = &lt;br /&gt;
|prog_lang = &lt;br /&gt;
|supply = 4 节 AAA 电池,&amp;lt;br&amp;gt;1 节 CR1616 或 CR1620&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TI-86&#039;&#039;&#039;是一款由[[德州仪器]]于1997年发行的图形计算器。 TI-86使用和[[TI-85]]相同的[[Zilog Z80]]处理器。&lt;br /&gt;
&lt;br /&gt;
TI-86具有比[[TI-83]]更大的屏幕，TI-86还允许用户使用小写字母和希腊字母键入，并设有五个功能键，这提高了导航菜单的方便性，如十进制到分数转换中的操作。该计算器还可以比TI-83更好的处理向量，矩阵和复数等功能。但是其有一个缺点，[[TI-83]]的统计数据包范围并不都预装在TI-86，然而，它可以从德州仪器程序存档网站下载并使用连接电缆的安装在计算器中。&lt;br /&gt;
&amp;lt;ref&amp;gt;[ftp://ftp.ti.com/pub/graph-ti/calc-apps/86/asm/ti-apps/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TI-86现已停产。&amp;lt;ref&amp;gt;{{cite web |url=http://education.ti.com/educationportal/sites/US/productDetail/us_ti86.html |title=TI-86 Features Summary |archiveurl=https://web.archive.org/web/20081118153512/http://education.ti.com/educationportal/sites/US/productDetail/us_ti86.html |archivedate=November 18, 2008}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==技术特征==&lt;br /&gt;
*&#039;&#039;&#039;CPU:&#039;&#039;&#039; [[Zilog Z80]]&amp;lt;ref&amp;gt;{{cite web|url=http://www.math.umbc.edu/~campbell/Calculators/TI8x/|last=Campbell|first=Robert|title=TI-82/83/85/86 Mathematics Use|year=2001|publisher=UMBC}}&amp;lt;/ref&amp;gt; 6&amp;amp;nbsp;MHz&lt;br /&gt;
*&#039;&#039;&#039;RAM:&#039;&#039;&#039; 128 KB, 96 KB 用户可用&lt;br /&gt;
*&#039;&#039;&#039;ROM:&#039;&#039;&#039; 256 KB 不可升级&lt;br /&gt;
*&#039;&#039;&#039;屏幕:&#039;&#039;&#039; 128×64 像素 LCD&lt;br /&gt;
*&#039;&#039;&#039;编程语言:&#039;&#039;&#039; [[TI-BASIC]], Z80 汇编语言&lt;br /&gt;
==模拟器==&lt;br /&gt;
要在Windows系统的电脑上模拟TI-86，可使用Virtual TI，这种模拟器能够模拟包括TI-86在内的多种TI计算器。&lt;br /&gt;
&lt;br /&gt;
Android设备上可以使用名为Almost Real TI-86的软件进行模拟。&lt;br /&gt;
&lt;br /&gt;
此外有一种不常见的方法：经常被用于模拟各种游戏机的MAME也有模拟TI-86的能力。由于MAME是跨平台的，Linux和macOS用户也可用它模拟TI-86.&lt;br /&gt;
&lt;br /&gt;
==参见==&lt;br /&gt;
* [[TI图形计算器对比]]&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&lt;br /&gt;
{{reflist}}&lt;br /&gt;
&lt;br /&gt;
==外部链接==&lt;br /&gt;
*[http://web.archive.org/web/20080727031611/http://education.ti.com/educationportal/sites/US/productDetail/us_ti86.html Official Texas Instruments TI-86 page (Internet Archive)]&lt;br /&gt;
*[http://www.ticalc.org/pub/86/ ticalc.org] hosts a large collection of downloadable freeware programs for the TI-86 can be found at along with [http://www.ticalc.org/basics/calculators/ti-86.html programming tutorials and hardware extensions]&lt;br /&gt;
*[http://calcg.org/ CalcG.org] - Very organized and large archive of games and programs.&lt;br /&gt;
*[http://guide.ticalc.org The Guide] - the largest set of tutorials for TI-86 assembly programming&lt;br /&gt;
*[ftp://ftp.ti.com/pub/graph-ti/calc-apps/86/asm/ti-apps/ Texas Instruments Program Archive]&lt;br /&gt;
*[http://www.takeitapart.net/archives/ti-83-and-86/ Complete Disassembly of a TI-86]&lt;br /&gt;
&lt;br /&gt;
[[Category:计算器]]&lt;br /&gt;
[[Category:图形计算器]]&lt;br /&gt;
[[Category:德州仪器计算器]]&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=TI-86&amp;diff=8268</id>
		<title>TI-86</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=TI-86&amp;diff=8268"/>
		<updated>2017-01-10T11:18:40Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​/* 模拟器 */ 修正拼写错误&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox calculator&lt;br /&gt;
|name = TI-86&lt;br /&gt;
|image = TI-86 calculator.jpg&lt;br /&gt;
|caption = 一台TI-86计算器&lt;br /&gt;
|type = [[图形计算器]]&lt;br /&gt;
| entry        =[[Calculator_input_methods#Infix_notation|D.A.L.]]&lt;br /&gt;
|manufacturer = [[德州仪器]]&lt;br /&gt;
|introduced = 1997&lt;br /&gt;
|discontinued = 2004&lt;br /&gt;
|predecessor = [[TI-85]]&lt;br /&gt;
|successor = &lt;br /&gt;
|processor = [[Zilog Z80]]&lt;br /&gt;
| frequency  = 6 MHz   &lt;br /&gt;
|memory_user =96 kB RAM&lt;br /&gt;
|display_size = 128×64 像素，21×8 个字符&lt;br /&gt;
|precision = &lt;br /&gt;
|link = &lt;br /&gt;
|prog_lang = &lt;br /&gt;
|supply = 4 节 AAA 电池,&amp;lt;br&amp;gt;1 节 CR1616 或 CR1620&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TI-86&#039;&#039;&#039;是一款由[[德州仪器]]于1997年发行的图形计算器。 TI-86使用和[[TI-85]]相同的[[Zilog Z80]]处理器。&lt;br /&gt;
&lt;br /&gt;
TI-86具有比[[TI-83]]更大的屏幕，TI-86还允许用户使用小写字母和希腊字母键入，并设有五个功能键，这提高了导航菜单的方便性，如十进制到分数转换中的操作。该计算器还可以比TI-83更好的处理向量，矩阵和复数等功能。但是其有一个缺点，[[TI-83]]的统计数据包范围并不都预装在TI-86，然而，它可以从德州仪器程序存档网站下载并使用连接电缆的安装在计算器中。&lt;br /&gt;
&amp;lt;ref&amp;gt;[ftp://ftp.ti.com/pub/graph-ti/calc-apps/86/asm/ti-apps/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TI-86现已停产。&amp;lt;ref&amp;gt;{{cite web |url=http://education.ti.com/educationportal/sites/US/productDetail/us_ti86.html |title=TI-86 Features Summary |archiveurl=https://web.archive.org/web/20081118153512/http://education.ti.com/educationportal/sites/US/productDetail/us_ti86.html |archivedate=November 18, 2008}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==技术特征==&lt;br /&gt;
*&#039;&#039;&#039;CPU:&#039;&#039;&#039; [[Zilog Z80]]&amp;lt;ref&amp;gt;{{cite web|url=http://www.math.umbc.edu/~campbell/Calculators/TI8x/|last=Campbell|first=Robert|title=TI-82/83/85/86 Mathematics Use|year=2001|publisher=UMBC}}&amp;lt;/ref&amp;gt; 6&amp;amp;nbsp;MHz&lt;br /&gt;
*&#039;&#039;&#039;RAM:&#039;&#039;&#039; 128 KB, 96 KB 用户可用&lt;br /&gt;
*&#039;&#039;&#039;ROM:&#039;&#039;&#039; 256 KB 不可升级&lt;br /&gt;
*&#039;&#039;&#039;屏幕:&#039;&#039;&#039; 128×64 像素 LCD&lt;br /&gt;
*&#039;&#039;&#039;编程语言:&#039;&#039;&#039; [[TI-BASIC]], Z80 汇编语言&lt;br /&gt;
==模拟器==&lt;br /&gt;
要在Windows系统的电脑上模拟TI-86，可使用Virtual TI，这种模拟器能够模拟包括TI-86在内的多种TI计算器。&lt;br /&gt;
&lt;br /&gt;
Android设备上可以使用名为Almost Real TI-86的软件进行模拟。&lt;br /&gt;
&lt;br /&gt;
此外有一种不常见的方法：经常被用于模拟各种游戏机的MAME也有模拟TI-86的能力。由于MAME是跨平台的，Linux和OS X用户也可用它模拟TI-86.&lt;br /&gt;
&lt;br /&gt;
==参见==&lt;br /&gt;
* [[TI图形计算器对比]]&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&lt;br /&gt;
{{reflist}}&lt;br /&gt;
&lt;br /&gt;
==外部链接==&lt;br /&gt;
*[http://web.archive.org/web/20080727031611/http://education.ti.com/educationportal/sites/US/productDetail/us_ti86.html Official Texas Instruments TI-86 page (Internet Archive)]&lt;br /&gt;
*[http://www.ticalc.org/pub/86/ ticalc.org] hosts a large collection of downloadable freeware programs for the TI-86 can be found at along with [http://www.ticalc.org/basics/calculators/ti-86.html programming tutorials and hardware extensions]&lt;br /&gt;
*[http://calcg.org/ CalcG.org] - Very organized and large archive of games and programs.&lt;br /&gt;
*[http://guide.ticalc.org The Guide] - the largest set of tutorials for TI-86 assembly programming&lt;br /&gt;
*[ftp://ftp.ti.com/pub/graph-ti/calc-apps/86/asm/ti-apps/ Texas Instruments Program Archive]&lt;br /&gt;
*[http://www.takeitapart.net/archives/ti-83-and-86/ Complete Disassembly of a TI-86]&lt;br /&gt;
&lt;br /&gt;
[[Category:计算器]]&lt;br /&gt;
[[Category:图形计算器]]&lt;br /&gt;
[[Category:德州仪器计算器]]&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=TI%E5%9B%BE%E5%BD%A2%E8%AE%A1%E7%AE%97%E5%99%A8%E5%AF%B9%E6%AF%94&amp;diff=8230</id>
		<title>TI图形计算器对比</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=TI%E5%9B%BE%E5%BD%A2%E8%AE%A1%E7%AE%97%E5%99%A8%E5%AF%B9%E6%AF%94&amp;diff=8230"/>
		<updated>2016-10-02T14:03:47Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​增加 TI-85 / 86 / 92 II，整理合并单元格&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;下表列出比较常规和技术信息精选的常见的德州仪器图形计算器供参考。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 型号&lt;br /&gt;
! CPU&lt;br /&gt;
! ROM&amp;amp;RAM&lt;br /&gt;
! 屏幕&lt;br /&gt;
! 编程语言&lt;br /&gt;
! 连接接口&lt;br /&gt;
! [[CAS]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-73系列|TI-73 (Explorer)]]&lt;br /&gt;
| rowspan=3 | Zilog Z80 @ 6MHz&lt;br /&gt;
| 25KB 的RAM, 512KB 的ROM&lt;br /&gt;
| rowspan=6 | 96 × 64 像素，16 × 8 个字符&lt;br /&gt;
| [[TI-BASIC]]，汇编（需Mallard），Flash Apps&lt;br /&gt;
| rowspan=4 | Jack-USB接口&lt;br /&gt;
| rowspan=4 | 无&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-83系列|TI-83]]&lt;br /&gt;
| 32KB RAM&lt;br /&gt;
| [[TI-BASIC]]，汇编&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-83系列|TI-83 plus]]&lt;br /&gt;
| 32KB RAM，512KB ROM（160KB用户可用）&lt;br /&gt;
| rowspan=4 | [[TI-BASIC]]，汇编，Flash Apps&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-83系列|TI-83 plus Sliver Edition]]&lt;br /&gt;
| Zilog Z80 @ 6MHz/15MHz&lt;br /&gt;
| 128KB RAM(24KB用户可用)，2MB ROM（1.5MB用户可用）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-84 Plus系列|TI-84 plus]]&lt;br /&gt;
| rowspan=3 | Zilog Z80 @ 15MHz&lt;br /&gt;
| 128/48KB RAM(24KB用户可用)，1MB ROM（480KB用户可用）&lt;br /&gt;
| rowspan=3 | Jack-USB接口，&lt;br /&gt;
Mini-USB接口&lt;br /&gt;
| rowspan=4 | 无&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-84 Plus系列|TI-84 plus Silver Edition]]&lt;br /&gt;
| 128/48KB RAM（24KB用户可用），2MB ROM（1.5MB用户可用）&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-84 Plus系列|TI-84 plus C Silver Edition]]&lt;br /&gt;
| 128KB RAM（21KB用户可用），4MB ROM（3.5MB用户可用）&lt;br /&gt;
| rowspan=2 | 320 × 240 像素，26 × 10个字符（大字体），65536 色&lt;br /&gt;
| rowspan=2 | [[TI-BASIC]]，汇编（与黑白屏系列不兼容），Flash Apps（与黑白屏系列不兼容）&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-84 Plus系列|TI-84 plus CE]] / [[TI-83 Premium]]&lt;br /&gt;
| Zilog eZ80 @ 48MHz Max&lt;br /&gt;
| 256KB RAM(154KB用户可用)，4MB ROM（3MB用户可用）&lt;br /&gt;
| Mini-USB接口&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-85]]&lt;br /&gt;
| rowspan=2 | Zilog Z80 @ 6 MHz&lt;br /&gt;
| 32 KB RAM（28 KB 用户可用），128 KB ROM&lt;br /&gt;
| rowspan=2 | 128 × 64 像素，21 × 8 个字符&lt;br /&gt;
| [[TI-BASIC]]，汇编（通过系统漏洞）&lt;br /&gt;
| rowspan=2 | Jack-USB接口&lt;br /&gt;
| rowspan=2 | 无&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-86]]&lt;br /&gt;
| 128 KB RAM（96 KB 用户可用），256 KB ROM&lt;br /&gt;
| [[TI-BASIC]]，汇编&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-89系列|TI-89]]&lt;br /&gt;
| Motorola 68000 @ 10 MHz/12 MHz&lt;br /&gt;
| 256KB RAM(188KB用户可用)，2MB ROM&lt;br /&gt;
| rowspan=2 | 160 × 100 像素&lt;br /&gt;
| [[TI-BASIC]]，汇编，Flash Apps，C（需add-in支持）&lt;br /&gt;
| Jack-USB接口&lt;br /&gt;
| rowspan=2 | 有&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-89系列|TI-89 Titanium]]&lt;br /&gt;
| Motorola 68000 @ 16MHz&lt;br /&gt;
| 256KB RAM（188KB 用户可用），2.7MB ROM&lt;br /&gt;
| [[TI-BASIC]]，汇编，Flash Apps，C（需add-in支持）&lt;br /&gt;
| Jack-USB接口，Mini-USB接口&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-92系列|TI-92]]&lt;br /&gt;
| rowspan=3 | Motorola 68000 @ 10MHz&lt;br /&gt;
| 68KB RAM&lt;br /&gt;
| rowspan=4 | 240 × 128 像素&lt;br /&gt;
| rowspan=2 | [[TI-BASIC]]，汇编（通过系统漏洞）&lt;br /&gt;
| rowspan=4 | Jack-USB接口&lt;br /&gt;
| rowspan=4 | 有&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-92系列|TI-92 II]]&lt;br /&gt;
| 136KB RAM&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-92系列|TI-92 plus]]&lt;br /&gt;
| 256KB RAM（188KB用户可用），384KB ROM&lt;br /&gt;
| rowspan=2 | [[TI-BASIC]]，汇编，Flash Apps，C（需add-in支持）&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-92系列|Voyage 200]]&lt;br /&gt;
| Motorola 68000 @ 12MHz&lt;br /&gt;
| 256KB RAM（188KB用户可用），2.7MB ROM&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-Nspire系列|TI-Nspire(CAS)]]&lt;br /&gt;
| ARM @ 120MHz（早期版本OS中为90MHz）&lt;br /&gt;
| 16MB RAM，20MB ROM&lt;br /&gt;
| 320 × 240 像素，16 级灰阶&lt;br /&gt;
| rowspan=3 | [[TI-BASIC]]，[[TI-Lua]]，汇编（需[[Ndless]]），C（需[[Ndless]]），Python（需[[Ndless]]），C++（需[[Ndless]]）&lt;br /&gt;
| Mini-USB接口，RS232传感器接口&lt;br /&gt;
| rowspan=3 | 分为非CAS和CAS两个版本&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-Nspire系列|TI-Nspire CM-C(CAS)]]&lt;br /&gt;
| rowspan=2 | ARM @ 132MHz&lt;br /&gt;
| 32MB RAM，128MB ROM（100MB用户可用）&lt;br /&gt;
| rowspan=2 | 320 × 240 像素，65536色&lt;br /&gt;
| Mini-USB接口，RS232传感器接口&lt;br /&gt;
|-&lt;br /&gt;
| [[TI-Nspire系列|TI-Nspire CX-C(CAS)]]&lt;br /&gt;
| 64MB RAM，128MB ROM（100MB用户可用）&lt;br /&gt;
| Mini-USB接口，RS232传感器接口，无线网卡接口（选配组件）&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
	<entry>
		<id>https://calcwiki.org/index.php?title=TI-86&amp;diff=8229</id>
		<title>TI-86</title>
		<link rel="alternate" type="text/html" href="https://calcwiki.org/index.php?title=TI-86&amp;diff=8229"/>
		<updated>2016-10-02T13:13:18Z</updated>

		<summary type="html">&lt;p&gt;Arnie97：​翻译&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox calculator&lt;br /&gt;
|name = TI-86&lt;br /&gt;
|image = TI-86 calculator.jpg&lt;br /&gt;
|caption = 一台TI-86计算器&lt;br /&gt;
|type = [[图形计算器]]&lt;br /&gt;
| entry        =[[Calculator_input_methods#Infix_notation|D.A.L.]]&lt;br /&gt;
|manufacturer = [[德州仪器]]&lt;br /&gt;
|introduced = 1997&lt;br /&gt;
|discontinued = 2004&lt;br /&gt;
|predecessor = [[TI-85]]&lt;br /&gt;
|successor = &lt;br /&gt;
|processor = [[Zilog Z80]]&lt;br /&gt;
| frequency  = 6 MHz   &lt;br /&gt;
|memory_user =96 kB RAM&lt;br /&gt;
|display_size = 128×64 像素，21×8 个字符&lt;br /&gt;
|precision = &lt;br /&gt;
|link = &lt;br /&gt;
|prog_lang = &lt;br /&gt;
|supply = 4 节 AAA 电池,&amp;lt;br&amp;gt;1 节 CR1616 或 CR1620&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TI-86&#039;&#039;&#039;是一款由[[德州仪器]]于1997年发行的图形计算器。 TI-86使用和[[TI-85]]相同的[[Zilog Z80]]处理器。&lt;br /&gt;
&lt;br /&gt;
TI-86具有比[[TI-83]]更大的屏幕，TI-86还允许用户使用小写字母和希腊字母键入，并设有五个功能键，这提高了导航菜单的方便性，如十进制到分数转换中的操作。该计算器还可以比TI-83更好的处理向量，矩阵和复数等功能。但是其有一个缺点，[[TI-83]]的统计数据包范围并不都预装在TI-86，然而，它可以从德州仪器程序存档网站下载并使用连接电缆的安装在计算器中。&lt;br /&gt;
&amp;lt;ref&amp;gt;[ftp://ftp.ti.com/pub/graph-ti/calc-apps/86/asm/ti-apps/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TI-86现已停产。&amp;lt;ref&amp;gt;{{cite web |url=http://education.ti.com/educationportal/sites/US/productDetail/us_ti86.html |title=TI-86 Features Summary |archiveurl=https://web.archive.org/web/20081118153512/http://education.ti.com/educationportal/sites/US/productDetail/us_ti86.html |archivedate=November 18, 2008}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==技术特征==&lt;br /&gt;
*&#039;&#039;&#039;CPU:&#039;&#039;&#039; [[Zilog Z80]]&amp;lt;ref&amp;gt;{{cite web|url=http://www.math.umbc.edu/~campbell/Calculators/TI8x/|last=Campbell|first=Robert|title=TI-82/83/85/86 Mathematics Use|year=2001|publisher=UMBC}}&amp;lt;/ref&amp;gt; 6&amp;amp;nbsp;MHz&lt;br /&gt;
*&#039;&#039;&#039;RAM:&#039;&#039;&#039; 128 KB, 96 KB 用户可用&lt;br /&gt;
*&#039;&#039;&#039;ROM:&#039;&#039;&#039; 256 KB 不可升级&lt;br /&gt;
*&#039;&#039;&#039;屏幕:&#039;&#039;&#039; 128×64 像素 LCD&lt;br /&gt;
*&#039;&#039;&#039;编程语言:&#039;&#039;&#039; [[TI-BASIC]], Z80 汇编语言&lt;br /&gt;
==模拟器==&lt;br /&gt;
要在Windows系统的电脑上模拟TI-86，可使用Vitural TI，这种模拟器能够模拟包括TI-86在内的多种TI计算器。&lt;br /&gt;
&lt;br /&gt;
Android设备上可以使用名为Almost Real TI-86的软件进行模拟。&lt;br /&gt;
&lt;br /&gt;
此外有一种不常见的方法：经常被用于模拟各种游戏机的MAME也有模拟TI-86的能力。由于MAME是跨平台的，Linux和OS X用户也可用它模拟TI-86.&lt;br /&gt;
&lt;br /&gt;
==参见==&lt;br /&gt;
* [[TI图形计算器对比]]&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&lt;br /&gt;
{{reflist}}&lt;br /&gt;
&lt;br /&gt;
==外部链接==&lt;br /&gt;
*[http://web.archive.org/web/20080727031611/http://education.ti.com/educationportal/sites/US/productDetail/us_ti86.html Official Texas Instruments TI-86 page (Internet Archive)]&lt;br /&gt;
*[http://www.ticalc.org/pub/86/ ticalc.org] hosts a large collection of downloadable freeware programs for the TI-86 can be found at along with [http://www.ticalc.org/basics/calculators/ti-86.html programming tutorials and hardware extensions]&lt;br /&gt;
*[http://calcg.org/ CalcG.org] - Very organized and large archive of games and programs.&lt;br /&gt;
*[http://guide.ticalc.org The Guide] - the largest set of tutorials for TI-86 assembly programming&lt;br /&gt;
*[ftp://ftp.ti.com/pub/graph-ti/calc-apps/86/asm/ti-apps/ Texas Instruments Program Archive]&lt;br /&gt;
*[http://www.takeitapart.net/archives/ti-83-and-86/ Complete Disassembly of a TI-86]&lt;br /&gt;
&lt;br /&gt;
[[Category:计算器]]&lt;br /&gt;
[[Category:图形计算器]]&lt;br /&gt;
[[Category:德州仪器计算器]]&lt;/div&gt;</summary>
		<author><name>Arnie97</name></author>
	</entry>
</feed>