跳至內容

用戶:Arnie97/HP Saturn Intro

出自计算器百科
於 2017年6月1日 (四) 08:10 由 Arnie97對話 | 貢獻 所作的修訂 (外部链接)
此用戶頁面尚未完工。
此用戶頁面尚未完工。原作者將會繼續進行編寫,而您也可以對該條目進行編輯

本條目介紹的是 HP Apple 39gs 等 Saturn 系列計算器的基礎知識。

Saturn

Saturn 是 HP 於上世紀 80 年代為其計算器開發的一種 4 位微處理器,該處理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。[1]

Apple(Saturn+)系列

在 Saturn 處理器停產後,為了保持與 Saturn 平台原有程序的兼容性,HP 推出了一系列在 ARM 處理器上運行 Saturn 模擬器的計算器,與上面的那些子系列相對,軟件模擬的 Saturn 處理器被稱為 Apple 系列。這些模擬處理器相比之前真實的 Saturn 處理器擁有更多的功能,因此也被稱作 Saturn+。 Apple 系列推出後,39、49 系列的圖形計算器均發布了多款對應的新型號:

系列 原型號(Yorke 系列處理器) 新型號(Apple 系列模擬處理器)
39 39g 40g 39g+ 39gs 40gs
49 49g 48gII 49g+ 50g

這些新型號的系統軟件與相對應的原有型號非常相近,只不過系統是運行在模擬器內,而不是運行在真實的 Saturn 處理器上。因此,很多相關的術語保留了下來。

值得注意的是,名為「HP ??gII」的計算器(「?」代指數字)往往與同編號的其他產品大相逕庭,切勿混淆。例如,HP 48gII 不屬於 HP 48 系列,而屬於 HP 49 系列;而 HP 39gII 則不屬於 Saturn 系列產品,而與後期推出的 HP Prime 有幾分相近。

系統架構概述

Saturn 匯編語言

無論是原有 Saturn 系列還是 Apple 系列,由於使用了或真或假的 Saturn 處理器,顯然都可以直接使用 Saturn 匯編語言編寫程序。

Saturn 匯編常與編譯型語言 System RPL 共同使用,相關內容詳見下文,在此不再贅述。

RPN

RPN(Reverse Polish Notation,逆波蘭表示法)將運算符置於操作數的後面,因此又稱後綴表示法。與之相對的是絕大多數語言採用的代數表示法(Algebraic Notation,運算符位於操作數之間,又稱中綴表示法)和 Lisp 等語言採用的波蘭表示法(運算符位於操作數之前,又稱前綴表示法)。

表達式記法 運算符位置 示例 採用該記法的語言
波蘭表示法 前綴 * - 3 4 5 Scheme,Common Lisp 等
代數表示法 中綴 (3 - 4) * 5 C++,Python,TI-Lua,HP Basic 等
逆波蘭表示法 後綴 3 4 - 5 * Forth,System RPL 等

逆波蘭表達式的解釋器一般是基於棧(Stack)這一數據結構的。要理解 RPN,最好先理解棧的概念。 RPN 解釋求值的過程一般是:遇到操作數時入棧;遇到運算符時,取對應數量的操作數出棧,求值,將結果入棧;最終棧頂就是表達式的值。

例如,常規中綴記法的 12 * (3 + 4) - 6 + 8 / 2 用 RPN 寫作 12 3 4 + * 6 - 8 2 / +,其運算過程如下:

RPN運算過程示意圖

  • 首先,12、3、4 依次入棧。
  • 輸入加號時,由於它是二元運算符,會彈出棧頂的兩個數進行運算,並將結果 7 壓入棧中。
  • 乘法同樣是二元運算,彈出棧頂的 12 和 7 兩個數,並將結果 84 返回棧頂。
  • 隨後,數字 6 入棧。
  • 之後是減法,取出棧頂的 84 和 6,並返回結果 78。
  • 隨後,8 和 2 入棧。
  • 之後是除法,取出棧頂的 8 和 2,並將結果 4 壓入棧中。
  • 最後取出 4 和 78 做加法,得到最終結果 82。

RPN 的運算符之間不存在優先級的高低,不需要使用括號來表明運算的優先級,因此能減少輸入部分複雜表達式時按鍵的次數。 例如,常規中綴記法中 3 - 4 * 5(3 - 4) * 5 的意義不相同,需要用括號加以區分;但後綴記法中前者寫做 3 4 5 * - ,後者則寫做 3 4 - 5 *

System RPL

System RPL(其中 RPL 指 Reverse Polish Lisp)是 HP 計算器上廣泛使用的一種編譯型語言。顧名思義,該語言中的語句採用逆波蘭表示法。

HP 38、39(40)、48、49(50)等系列的圖形計算器均支持該語言[2],且大部分系統軟件和很多第三方軟件由該語言寫就。HP 38、39(40)、49(50)等新系列計算器的很多第三方應用來源於對 HP 48 等早期系列中 System RPL 應用的移植和重新編譯。

作為一種貼近底層的編譯型系統編程語言,System RPL 常與 Saturn 匯編共同使用,這與 PC 平台上的 C 語言和 x86 匯編語言有着相通之處。這兩種語言可以用 PC 上的 HP Tools 開發。此外,HP 49、50 等系列的計算器內置了 MASD,可以直接在計算器上進行編譯、匯編、調試操作。注意 HP Tools 和 MASD 均是編譯器本身,並不包含頭文件(Entry Points,或簡稱 Entries),如果不希望手動聲明系統提供的函數,需要自行下載頭文件,其中的原理與 C 語言是相通的。HP 28、38、39(40)、48、49(50)系列的頭文件互不相同,下載時需根據所針對的機型正確選擇。

Library

Aplet

User RPL

User RPL 是 HP RPN 計算器上的一種解釋型語言。顧名思義,該語言同樣採用逆波蘭表示法。

HP 28、48、49(50)等系列的計算器支持該語言代碼的運行。如果在設置中選擇 RPN 輸入模式,那麼用戶在計算界面中輸入的有效指令實際上均可以視為合法的 User RPL 代碼。

與 System RPL 的關係

User RPL 的語法和 System RPL 相近,但代碼可以直接在計算器上運行而不需要編譯。運行時發生的大部分錯誤會被正確捕獲,且部分較為危險的底層命令無法直接使用。這些特性使得 User RPL 的編寫和調試更方便和安全,但也使它的運行速度較 System RPL 緩慢,在需要對系統底層進行操控及性能因素至關重要的場合(如某些遊戲)應當選擇 System RPL。

User RPL 能通過多種方式調用 System RPL 特有的函數,相關內容併入下文 HP Basic 的相關章節,在此不再贅述。

在 HP 49(50)系列計算器內置的文件管理器(Filer)中,User RPL 代碼的文件類型為 PROG,System RPL 源碼的類型為普通字符串 STRNG,而 System RPL 編譯出的二進制對象類型為 CODE

HP Basic

HP Basic 是 HP 38、39(40)系列計算器的解釋型語言,由於該語言的代碼通過解釋器執行,且解釋器本身又運行在速度緩慢的 Saturn 處理器或模擬器上,因此速度是本文提及的所有語言中最慢的。

由於其為解釋型語言,我們僅需記事本等純文本編輯器即可在 PC 上進行該語言的開發。鑑於部分特殊符號是用多個 ASCII 字符來表示的(如賦值號 表示為 \|>),為了輸入這些符號而免於記憶對應的 ASCII 序列,可以使用 ADK 中的文本編輯器代替記事本進行開發。為了將代碼傳入計算器中,代碼頭部應符合特定的格式,參見下文中的說明

想學習 HP Basic 程序的編寫,僅需閱讀HP 39gs 用戶手冊(俗稱說明書)即可。高級用法則需要對 System RPL 有所了解,見本章接下來兩節的內容。

與 User RPL 和 System RPL 的關係

HP Basic 的定位與 HP 48、49(50)系列中的 User RPL 相似——用戶在 HOME 界面中輸入的有效指令均為合法的 HP Basic 代碼。

調用 System RPL

ADK

ADKAplet Develop Kit,Aplet 開發套件)是 16 位 Windows 平台上的 HP Basic 開發工具,該工具可以幫助用戶編寫 HP Basic,使用 HP Basic 擴充現有 Aplet 的功能(見 HP 39gs 用戶手冊第 18-10 頁)。值得一提的是,該工具能編輯 Aplet 中嵌入的 Note 和 Sketch,因此您可以使用該工具將文本文檔和黑白圖片傳入計算器顯示,這對於尚未學會文件頭部如何編寫的用戶尤為有用。

雖然該工具的名稱為 Aplet 開發套件,但該工具僅能在現有 Aplet 的基礎上,對其 Views 菜單進行擴充(例如,為 Function Aplet 添加自動設置定義域和值域的功能)。要開發全新的 Aplet,請使用 System RPLHPGCC

由於 AMD64 平台的固有限制,64 位系統無法兼容 16 位應用。如果您需要在 64 位系統中運行該應用,建議用 DOSBox 等虛擬機運行 Windows 3.1、Windows 95 等 16 位作業系統或 Windows XP 等 32 位作業系統。

HPGCC

ARM Toolbox

Aplet 框架

內存布局與固件

數據類型與聯機傳輸

數據對象的內部表示(變量)

數據在內存中以不同的方式(數據結構)儲存着。這些數據結構當中有順序的(例如線性表的數組形式),也有非順序的(例如線性表的鍊表形式)。

數據對象的外部表示(文件)

為了將數據,尤其是非順序的數據:

  • 保存於外存(硬盤、光盤、閃存等)的某個文件中以備後用
  • 通過網絡等方式共享給另一台計算機
  • 通過串口等方式傳送至圖形計算器等設備

我們需要將數據編碼為字符串(字節流)方能儲存或傳輸,這一編碼過程稱為序列化(Serialization)

變量的類型系統:靜態類型與動態類型

變量是代指數據的名稱、符號。

  • 在 C++、Java 等語言中,每個變量均對應一個特定的數據類型,使用前必須聲明每個變量的數據類型,這樣的類型系統稱為靜態類型
  • 在 Haskell 等語言中,雖然很多情況下不需手動聲明變量的數據類型,而是通過計算機的自動推導來確定數據類型,但每個變量均有特定的類型——類似 C++ 11 中使用 auto 的情形——因此同樣屬於靜態類型。
  • 在 Python、JavaScript 等語言中,類型依附於變量中儲存的數據本身,數據有類型而變量無類型,這樣的類型系統稱為動態類型

文件的類型系統:擴展名與特徵簽名

類比變量,文件名(和路徑)是代指文件的符號。對於文件來說,同樣有數種不同的方式來記錄它的類型,其中就包括:

  • 文件名稱的某個特定部分指示一個文件的類型——通常是最後一個小數點後的部分,也就是擴展名(Extension)
  • 文件內容的某個特定部分,即特徵簽名(File Signature)指示一個文件的類型——通常是最前面的部分,也就是頭部(Header)

擴展名最早在 CP/M 作業系統中被採用,而後又隨一脈相承的 DOS 和 Windows 得到了推廣;特徵簽名則在 Unix 中被廣泛應用,而後又被 Linux 等作業系統所繼承下來。由於兩類作業系統均得到了廣泛的應用,現實中兩種方式常常共存:

文件類型 擴展名 特徵簽名[3]
PDF 文檔 pdf %PDF
ZIP 壓縮文件 zip docx pptx xlsx 等 PK(設計者 Phil Katz)
RAR 壓縮文件 rar Rar!
CAB 壓縮文件 cab MSCFMicrosoft Cabinet File)
MZ 可執行文件

PE 可執行文件

com exe

exe dll sys ocx cpl scr 等

MZ(設計者 Mark Zbikowski)

(為向下兼容 DOS,PE 文件頭部與之相同)

ELF 可執行文件 \x7F E L F
PNG 圖片 png \x89 P N G
GIF 圖片 gif GIF89aGIF87a
JPEG 圖片 jpg jpeg \xFF \xD8開始,\xFF \xD9 結束
Midi 音軌 midi MThdMIDI Track header)
Java 字節碼 class \xCA \xFE \xBA \xBE,即十六進制 CAFEBABE

從上面的例子中可以看出,既有一個擴展名對應多種特徵簽名的情況(如 GIF 文件),也有多種擴展名對應單一特徵簽名的情況(如 PE 文件)。當擴展名和特徵簽名共存時,有時會結合兩種因素來決定文件如何解析,更多時候則只選擇其中的主要因素來判斷文件的類型。例如,將 JPEG 圖片的擴展名更改為 png 仍能用多數圖片查看器正常打開,說明這些軟件僅通過文件內容中的特徵簽名來判斷文件的格式,擴展名無關緊要。同樣,HP Saturn 系列計算器也僅判定文件的特徵簽名,而擴展名的作用只是輔助人類的辨識。

HP Saturn 系列的對象類型(內部表示)

表面上看,HP 39(40)、48、49(50)的文件格式互不相同,PC 上的官方聯機工具(Connectivity Kit)也形式各異。但是,多項證據已經表明,不同系列的 Saturn 機種使用相同的方式來儲存 RAM 中的對象

我們可以通過下面的實驗來驗證這一結論:用含有 HP 48gII 固件的 ROM 替換 HP 39gs 原有的閃存,期間保持電源供給,以免 RAM 中的數據丟失。那麼,當進入 49 系列的系統後,我們將看到之前在 39 系列系統中儲存的所有文件(和文件夾)。鑑於 39 系列系統中並未提供完整的文件管理器,如果想探查 39 系列計算器的目錄結構,除了選擇 39 系統中不完整的文件管理器或自己編寫文件管理器外,亦可利用這一特性,藉助 49 系列內置的文件管理器來達到目的。

綜上所述,不同系列間文件格式的差異,本質上是相同對象類型的不同序列化形式,傳入計算器後的生成的對象是相同的,可謂「換湯不換藥」。

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

文件類型 常見擴展名 特徵簽名
HP 39(40)系列 000 apt lib 等 HP39Asc?(文本,ASCII)

HP39Bin?(二進制,Binary)

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

上表中,? 代指表示文件類型的一個大寫拉丁字母;同一字母在不同系列中有着不同的意義,詳見下文各章節。另外,由於擴展名並無實質性作用,用戶可根據自己的喜好和實際情況選擇不同的擴展名——例如,為了方便用記事本打開,可以用 txt 作為擴展名;[4]為了方便用戶區分不同機種的文件,跨平台應用的開發者有時直接用 48、49 等作為擴展名。[5]

HP 39(40)系列

HP 48 系列

HP 49(50)系列

串口與驅動程序

Kermit 與 XMODEM

參考文獻