跳至內容

用戶:Arnie97/HP Saturn Intro

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

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

  • 本條目的主題不是 HP Saturn 系列計算器的基本操作;如果您有此方面的疑問,請查閱對應型號的用戶手冊。但是,如果您有聯機傳輸方面的疑問,請繼續閱讀此文。
  • 本條目的主題不是編程語言的語法幫助或函數索引;如果您有此方面的疑問,請查閱相關語言的教程和參考資料。本文中指出了每種編程語言可以參考的部分教程和資料,希望對您有所幫助。

Saturn

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

Apple(Saturn+)系列

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

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

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

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

系統架構概述

Saturn 匯編語言

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

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

RPN

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

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

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

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

RPN運算過程示意圖

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

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

System RPL

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

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

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

Library

Aplet

User RPL

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

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

與 System RPL 的關係

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

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

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

HP Basic

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

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

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

與 User RPL 和 System RPL 的關係

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

調用 System RPL

ADK

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

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

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

HPGCC

HPGCC 目前有三個主版本。最新版本 HPGCC 3 相比前兩個版本的變化較大,且僅支持 Big Apple 系列計算器(HP 49g+、HP 50g),因此本文不對其展開討論,您可以訪問其官方網站了解相關知識。下文所述的 HPGCC 均指早期的 HPGCC 版本。

HPGCC 項目的核心是由 C 語言編寫的 ARM 函數庫和由 System RPL 編寫的 ARM Toolbox。此外,HPGCC 的 Windows 發行版中還包含 arm-elf-gcc 工具鏈、Aplet 框架和簡單的 GUI 編輯環境 Programmer's Notepad 2。部分發行版中的 arm-elf-gcc 基於早期的 Cygwin 編譯,運行時可能出錯崩潰,因此建議換用較新版本的工具鏈。

ARM Toolbox

Aplet 框架

內存布局與固件

數據類型與聯機傳輸

文件類型的判定:擴展名與特徵簽名

不同類型的文件需要用不同的方式解析。為了正確理解文件中數據的含義,首先需判斷出文件的類型。

文件類型的標示和識別主要有兩種方式:

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

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

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

PE 可執行文件

com exe

exe dll sys ocx cpl scr 等

MZ(設計者 Mark Zbikowski)

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

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

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

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

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

HP39Bin?(二進制,Binary)

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

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

HP 39(40)系列

HP 48 系列

HP 49(50)系列

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

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

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

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

串口與驅動程序

Kermit 與 XMODEM

參考文獻