使用者:Arnie97/HP Saturn Intro
此用戶頁面尚未完工。原作者將會繼續進行編寫,而您也可以對該條目進行編輯。
本條目介紹的是 HP Apple 39gs 等 Saturn 系列計算器的基礎知識。
- 本條目的主題不是 HP Saturn 系列計算器的基本操作;如果您有此方面的疑問,請查閱對應型號的用戶手冊。但是,如果您有聯機傳輸方面的疑問,請繼續閱讀此文。
- 本條目的主題不是程式語言的語法幫助或函數索引;如果您有此方面的疑問,請查閱相關語言的教程和參考資料。本文中指出了每種程式語言可以參考的部分教程和資料,希望對您有所幫助。
Saturn
Saturn 是 HP 於上世紀 80 年代為其計算器開發的一種 4 位微處理器,該處理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。[1]
Apple(Saturn+)系列
在 Saturn 處理器停產後,為了保持與 Saturn 平台原有程序的兼容性,HP 推出了一系列在 ARM 處理器上運行 Saturn 模擬器的計算器,與上面的那些子系列相對,軟體模擬的 Saturn 處理器被稱為 Apple 系列。這些模擬處理器相比之前真實的 Saturn 處理器擁有更多的功能,因此也被稱作 Saturn+。 Apple 系列推出後,39、49 系列的圖形計算器均發布了多款對應的新型號:
| 系列 | 原型號(Yorke 系列處理器) | 新型號(Apple 系列模擬處理器) |
|---|---|---|
| 39 | 39g 40g | 39g+ 39gs 40gs |
| 49 | 49g | 48gII 49g+ 50g |
這些新型號的系統軟體與相對應的原有型號非常相近,只不過系統是運行在模擬器內,而不是運行在真實的 Saturn 處理器上。因此,很多相關的術語保留了下來。
值得注意的是,名為「HP ??gII」的計算器(「?」代指數字)往往與同編號的其他產品大相逕庭,切勿混淆。例如,HP 48gII 不屬於 HP 48 系列,而屬於 HP 49 系列;而 HP 39gII 則不屬於 Saturn 系列產品,而與後期推出的 HP Prime 有幾分相近。
系統架構概述
Saturn 彙編語言
無論是原有 Saturn 系列還是 Apple 系列,由於使用了或真或假的 Saturn 處理器,顯然都可以直接使用 Saturn 彙編語言編寫程序。
Saturn 彙編常與編譯型語言 System RPL 共同使用,相關內容詳見下文,在此不再贅述。
RPN
RPN(Reverse Polish Notation,逆波蘭表示法)將運算符置於操作數的後面,因此又稱後綴表示法。與之相對的是絕大多數語言採用的代數表示法(Algebraic Notation,運算符位於操作數之間,又稱中綴表示法)和 Lisp 等語言採用的波蘭表示法(運算符位於操作數之前,又稱前綴表示法)。
| 表達式記法 | 運算符位置 | 示例 | 採用該記法的語言 |
|---|---|---|---|
| 波蘭表示法 | 前綴 | * - 3 4 5 | Scheme,Common Lisp 等 |
| 代數表示法 | 中綴 | (3 - 4) * 5 | C++,Python,TI-Lua,HP Basic 等 |
| 逆波蘭表示法 | 後綴 | 3 4 - 5 * | Forth,System RPL 等 |
逆波蘭表達式的解釋器一般是基於棧(Stack)這一數據結構的。要理解 RPN,最好先理解棧的概念。 RPN 解釋求值的過程一般是:遇到操作數時入棧;遇到運算符時,取對應數量的操作數出棧,求值,將結果入棧;最終棧頂就是表達式的值。
例如,常規中綴記法的 12 * (3 + 4) - 6 + 8 / 2 用 RPN 寫作 12 3 4 + * 6 - 8 2 / +,其運算過程如下:
- 首先,12、3、4 依次入棧。
- 輸入加號時,由於它是二元運算符,會彈出棧頂的兩個數進行運算,並將結果 7 壓入棧中。
- 乘法同樣是二元運算,彈出棧頂的 12 和 7 兩個數,並將結果 84 返回棧頂。
- 隨後,數字 6 入棧。
- 之後是減法,取出棧頂的 84 和 6,並返回結果 78。
- 隨後,8 和 2 入棧。
- 之後是除法,取出棧頂的 8 和 2,並將結果 4 壓入棧中。
- 最後取出 4 和 78 做加法,得到最終結果 82。
RPN 的運算符之間不存在優先級的高低,不需要使用括號來表明運算的優先級,因此能減少輸入部分複雜表達式時按鍵的次數。
例如,常規中綴記法中 3 - 4 * 5 與 (3 - 4) * 5 的意義不相同,需要用括號加以區分;但後綴記法中前者寫做 3 4 5 * - ,後者則寫做 3 4 - 5 * 。
System RPL
System RPL(其中 RPL 指 Reverse Polish Lisp)是 HP 計算器上廣泛使用的一種編譯型語言。顧名思義,該語言中的語句採用逆波蘭表示法。
HP 38、39(40)、48、49(50)等系列的圖形計算器均支持該語言[2],且大部分系統軟體和很多第三方軟體由該語言寫就。HP 38、39(40)、49(50)等新系列計算器的很多第三方應用來源於對 HP 48 等早期系列中 System RPL 應用的移植和重新編譯。
作為一種貼近底層的編譯型系統程式語言,System RPL 常與 Saturn 彙編共同使用,這與 PC 平台上的 C 語言和 x86 彙編語言有著相通之處。這兩種語言可以用 PC 上的 HP Tools 開發。此外,HP 49、50 等系列的計算器內置了 MASD,可以直接在計算器上進行編譯、彙編、調試操作。注意 HP Tools 和 MASD 均是編譯器本身,並不包含頭文件(Entry Points,或簡稱 Entries),如果不希望手動聲明系統提供的函數,需要自行下載頭文件,其中的原理與 C 語言是相通的。HP 28、38、39(40)、48、49(50)系列的頭文件互不相同,下載時需根據所針對的機型正確選擇。
Library
Aplet
User RPL
User RPL 是 HP RPN 計算器上的一種解釋型語言。顧名思義,該語言同樣採用逆波蘭表示法。
HP 28、48、49(50)等系列的計算器支持該語言代碼的運行。如果在設置中選擇 RPN 輸入模式,那麼用戶在計算界面中輸入的有效指令實際上均可以視為合法的 User RPL 代碼。
與 System RPL 的關係
User RPL 的語法和 System RPL 相近,但代碼可以直接在計算器上運行而不需要編譯。運行時發生的大部分錯誤會被正確捕獲,且部分較為危險的底層命令無法直接使用。這些特性使得 User RPL 的編寫和調試更方便和安全,但也使它的運行速度較 System RPL 緩慢,在需要對系統底層進行操控及性能因素至關重要的場合(如某些遊戲)應當選擇 System RPL。
User RPL 能通過多種方式調用 System RPL 特有的函數,相關內容併入下文 HP Basic 的相關章節,在此不再贅述。
在 HP 49(50)系列計算器內置的文件管理器(Filer)中,User RPL 代碼的文件類型為 PROG,System RPL 源碼的類型為普通字符串 STRNG,而 System RPL 編譯出的二進制對象類型為 CODE。
HP Basic
HP Basic 是 HP 38、39(40)系列計算器的解釋型語言,由於該語言的代碼通過解釋器執行,且解釋器本身又運行在速度緩慢的 Saturn 處理器或模擬器上,因此速度是本文提及的所有語言中最慢的。
由於其為解釋型語言,我們僅需記事本等純文本編輯器即可在 PC 上進行該語言的開發。鑑於部分特殊符號是用多個 ASCII 字符來表示的(如賦值號 ► 表示為 \|>),為了輸入這些符號而免於記憶對應的 ASCII 序列,可以使用 ADK 中的文本編輯器代替記事本進行開發。為了將代碼傳入計算器中,代碼頭部應符合特定的格式,參見下文中的說明。
想學習 HP Basic 程序的編寫,僅需閱讀HP 39gs 用戶手冊(俗稱說明書)即可。高級用法則需要對 System RPL 有所了解,見本章接下來兩節的內容。
與 User RPL 和 System RPL 的關係
HP Basic 的定位與 HP 48、49(50)系列中的 User RPL 相似——用戶在 HOME 界面中輸入的有效指令均為合法的 HP Basic 代碼。
調用 System RPL
ADK
ADK(Aplet Develop Kit,Aplet 開發套件)是 16 位 Windows 平台上的 HP Basic 開發工具,該工具可以幫助用戶編寫 HP Basic,使用 HP Basic 擴充現有 Aplet 的功能(見 HP 39gs 用戶手冊第 18-10 頁)。值得一提的是,該工具能編輯 Aplet 中嵌入的 Note 和 Sketch,因此您可以使用該工具將文本文檔和黑白圖片傳入計算器顯示,這對於尚未學會文件頭部如何編寫的用戶尤為有用。
雖然該工具的名稱為 Aplet 開發套件,但該工具僅能在現有 Aplet 的基礎上,對其 Views 菜單進行擴充(例如,為 Function Aplet 添加自動設置定義域和值域的功能)。要開發全新的 Aplet,請使用 System RPL 或 HPGCC。
由於 AMD64 平台的固有限制,64 位系統無法兼容 16 位應用。如果您需要在 64 位系統中運行該應用,建議用 DOSBox、Hyper-V 等虛擬機運行 Windows 3.1、Windows 95 等 16 位作業系統或 Windows XP 等 32 位作業系統。
HPGCC
HPGCC 目前有三個主版本。最新版本 HPGCC 3 相比前兩個版本的變化較大,且僅支持 Big Apple 系列計算器(HP 49g+、HP 50g),因此本文不對其展開討論,您可以訪問其官方網站了解相關知識。下文所述的 HPGCC 均指早期的 HPGCC 版本。
HPGCC 項目的核心是由 C 語言編寫的 ARM 函數庫和由 System RPL 編寫的 ARM Toolbox。此外,HPGCC 的 Windows 發行版中還包含 arm-elf-gcc 工具鏈、Aplet 框架和簡單的 GUI 編輯環境 Programmer's Notepad 2。部分發行版中的 arm-elf-gcc 基於早期的 Cygwin 編譯,運行時可能出錯崩潰,因此建議換用較新版本的工具鏈。
ARM Toolbox
Aplet 框架
內存布局與固件
數據類型與聯機傳輸
文件類型的判定:擴展名與特徵簽名
不同類型的文件需要用不同的方式解析。為了正確理解文件中數據的含義,首先需判斷出文件的類型。
文件類型的標示和識別主要有兩種方式:
- 文件名稱的某個特定部分指示一個文件的類型——通常是最後一個小數點後的部分,也就是擴展名(Extension)。
- 文件內容的某個特定部分,即特徵簽名(File Signature)指示一個文件的類型——通常是最前面的部分,也就是頭部(Header)。
擴展名最早在 CP/M 作業系統中被採用,而後又隨一脈相承的 DOS 和 Windows 得到了推廣;特徵簽名則在 Unix 中被廣泛應用,而後又被 Linux 等作業系統所繼承下來。由於兩類作業系統均得到了廣泛的應用,現實中兩種方式常常共存:
| 文件類型 | 擴展名 | 特徵簽名[3] |
|---|---|---|
| PDF 文檔 | %PDF
| |
| ZIP 壓縮文件 | zip docx pptx xlsx 等 | PK(設計者 Phil Katz)
|
| RAR 壓縮文件 | rar | Rar!
|
| CAB 壓縮文件 | cab | MSCF(Microsoft Cabinet File)
|
| MZ 可執行文件 | com exe
exe dll sys ocx cpl scr 等 |
MZ(設計者 Mark Zbikowski)
(為向下兼容 DOS,PE 文件頭部與之相同) |
| ELF 可執行文件 | 無 | \x7F E L F
|
| PNG 圖片 | png | \x89 P N G
|
| GIF 圖片 | gif | GIF89a 或 GIF87a
|
| JPEG 圖片 | jpg jpeg | 以 \xFF \xD8開始,\xFF \xD9 結束
|
| Midi 音軌 | midi | MThd(MIDI Track header)
|
| Java 字節碼 | class | \xCA \xFE \xBA \xBE,即十六進制 CAFEBABE
|
從上面的例子中可以看出,既有一個擴展名對應多種特徵簽名的情況(如 GIF 文件),也有多種擴展名對應單一特徵簽名的情況(如 PE 文件)。當擴展名和特徵簽名共存時,有時會結合兩種因素來決定文件如何解析,更多時候則只選擇其中的主要因素來判斷文件的類型。例如,將 JPEG 圖片的擴展名更改為 png 仍能用多數圖片查看器正常打開,說明這些軟體僅通過文件內容中的特徵簽名來判斷文件的格式,擴展名無關緊要。同樣,HP Saturn 系列計算器也僅判定文件的特徵簽名,而擴展名的作用只是輔助人類的辨識。
HP Saturn 系列的文件類型(外部表示)
| 文件類型 | 常見擴展名 | 特徵簽名 |
|---|---|---|
| HP 39(40)系列 | 000 apt lib 等 | HP39Asc?(文本,ASCII)
|
| HP 48 系列 | 不固定 | HPHP48-?
|
| HP 49(50)系列 | hp lib 等 | HPHP49-?
|
上表中,? 代指表示文件類型的一個大寫拉丁字母;同一字母在不同系列中有著不同的意義,詳見下文各章節。另外,由於擴展名並無實質性作用,用戶可根據自己的喜好和實際情況選擇不同的擴展名——例如,為了方便用記事本打開,可以用 txt 作為擴展名;[4]為了方便用戶區分不同機種的文件,跨平台應用的開發者有時直接用 48、49 等作為擴展名。[5]
HP 39(40)系列
HP 48 系列
HP 49(50)系列
HP Saturn 系列的對象類型(內部表示)
表面上看,HP 39(40)、48、49(50)的文件格式互不相同,PC 上的官方聯機工具(Connectivity Kit)也形式各異。但是,多項證據已經表明,不同系列的 Saturn 機種使用相同的方式來儲存 RAM 中的對象。
我們可以通過下面的實驗來驗證這一結論:用含有 HP 48gII 固件的 ROM 替換 HP 39gs 原有的快閃記憶體,期間保持電源供給,以免 RAM 中的數據丟失。那麼,當進入 49 系列的系統後,我們將看到之前在 39 系列系統中儲存的所有文件(和文件夾)。鑑於 39 系列系統中並未提供完整的文件管理器,如果想探查 39 系列計算器的目錄結構,除了選擇 39 系統中不完整的文件管理器或自己編寫文件管理器外,亦可利用這一特性,藉助 49 系列內置的文件管理器來達到目的。
綜上所述,不同系列間文件格式的差異,本質上是相同對象類型的不同序列化形式,傳入計算器後的生成的對象是相同的,可謂「換湯不換藥」。