Locomotive Basicは、 Locomotive Software社が開発したBASICプログラミング言語の独自方言です。
Amstrad CPCで使用するために(プラットフォームをサポートするための多くのカスタム機能が)変更され、 「Amstrad BASIC」としてROMに組み込まれた。
その後、Locomotive BASIC-2はIBM PC互換プラットフォーム向けにAmstrad PC1512および1640のGEMアプリケーションとして開発され、 Amstrad PCWに付属していたCP/MのインタープリタであるMallard BASIC [ 1 ]の後継となった。
Amstrad BASICには2つのバージョンが公開されています。1.0はCPC464にのみ付属し(バグのあるDEC$機能が含まれていました)、1.1はバグを修正して他のすべてのCPCに同梱されました。BASIC 1.1は、付属のゲームカートリッジの一部として、 Amstrad CPC Plusシリーズのマシンにも含まれていました。
開発は、最近行われたBBC Micro用Acorn Computers Z80アドオン向けMallard BASICの作成作業に基づいている。既存のコードの改良には約12週間かかったと報告されており、 BBC BASICに「非常に影響を受けた」ものの、 BBCではアセンブリ言語が必要だったような機能を追加した。
「ARNOLD」プラットフォーム(CPC464の開発コードネーム)は、Amstradが求める「本格的な」ユーザーを引き付けるのに十分な堅牢性を備えるように設計されました。Locomotive社は、このプラットフォームのファームウェアとBASICの開発を担当しました。この組み合わせにより、固定ジャンプブロックによるファームウェアへのアクセスを整理するアプローチ、ファームウェアをモジュールに分割する方式、複数のRAMとROMページがすべて同じアドレス空間を占有し、同時にアクセス可能で再配置可能なディスプレイメモリなど、当時のプラットフォームではほとんど見られなかった技術的機能を備えた包括的な結果が生まれました。これらの多くは、競合プラットフォームでは部分的にしか見られなかったか、まったく見られませんでした。



プログラマーが豊富なBASIC方言でのプログラミングのみに関心がある場合、そのスキルを存分に発揮できる優れたマシンが用意されており、高品質なソフトウェアを作成するために最終的にマシンコードに頼ったり、ハードウェアの機能を研究したりする必要は一切ありません。しかし、Amstrad BASICの理念を完全に理解し、マシンの性能を最大限に引き出すには、マシン全体の設計思想を少なくとも表面的なレベルで理解する必要があります。
基本的に、CPCプラットフォームは、高度なハードウェアとそれを活用する豊富なファームウェアで構成されており、標準化されたジャンプテーブルを備えたサブシステムに分割され、機能にアクセスできるようになっています。Amstrad BASICは、このプラットフォームとファームウェアの機能をプログラマーが可能な限り利用できるように設計されました。
CPCプラットフォームのマシンレベルでは、アプリケーションソフトウェアは、異なるバージョンや再アセンブルなどによって実際のファームウェア内でコードが移動することについて心配する必要はありません。多くの現代のマシンでは、ファームウェアの再アセンブルとその後のルーチンの移動が大きな問題を引き起こす可能性があります。顕著な例として、1983年にTimexが改造したZX Spectrum(ROMはT/S 2000 BASICとして改造)が挙げられます。構造が不十分だったため、その後の再アセンブルで多くのシステムコールが移動しました。結果としてできたファームウェアは、既存の多くのZX Spectrumプログラムを実行できず、膨大なソフトウェアライブラリへのアクセスを即座に拒否し、ユーザーを遠ざけてしまいました。Locomotiveのシステムコール方式では、プログラムが文書化されたアドレスを使用する限り、このような問題は発生しません。ファームウェア呼び出し $BB5A TXT_OUTPUT (画面に1文字を表示する) は広く普及していますが、BASIC 1.0 と BASIC 1.1 ではファームウェアのアドレスが異なる ($9400 と $93FE) ことに注意してください。プログラムが公開されている関数アドレス (つまり $BB5A) を使用している限り、ソフトウェアはすべての CPC プラットフォームで問題なく動作します。

ファームウェアのバージョン間でジャンプ先は変更されていますが、TXT_OUTPUT のアドレスは $BB5A のままです。

カーネル キーマネージャー テキストVDU グラフィックスVDU スクリーンパック カセットテープ/AMSDOS(AMStrad Disc Operating System) サウンドマネージャー マシンパック 数学パック
Amstrad BASICは、マシンを最大限に活用するために、開発中のプラットフォームを活用し、公開しました。BASICコードをファームウェアへの必要な呼び出しにバンドルし、[ 2 ]競合他社のプラットフォームで機能にアクセスするために必要な汎用的な*FXやPEEK & POKEステートメントに頼るのではなく、機能のための特定のコマンドを提供しました。
BASIC ROMの内部バージョン番号は、ここで議論されている公表済みのバージョンとは異なります。
このプラットフォームは他に類を見ないものではなかったが、独自の形式ではなくASCII文字セットを使用していた点で、同時代の製品とは異彩を放っていた。これは、CPCプラットフォームをより本格的な製品へと押し上げ、プロフェッショナルなビジネス用途にも対応できるというAmstradのマーケティング上の主張をある程度裏付けるものとなったという点で、ある意味強みと言えるだろう。
他の多くの言語と同様に、複数のプログラムステートメントはコロンを使用して1行で区切られます:。
WHILE/WENDは 以外の唯一のループ構造ですFOR/NEXT。
予約語(関数、コマンド、ステートメントなど)は、トークン化されることによりプログラム内で大文字で表記されます。これによりプログラムサイズが縮小され、実行速度が向上します。プログラムをリストすると、トークンが予約語にデコードされます。予約語はトークンテーブルではすべて大文字で表記されています(この方法により、BASIC 1.0 に DEC$ が存在することが明らかになりました - 下記参照)。BASIC プログラムを保存すると、完全にトークン化された形式がバイナリ形式で保存されます。あるいは、オプション「A」を指定して保存すると、テキストと完全に互換性のある ASCII ファイルが作成されます。SAVE "MYPROG",A

Amstrad CPC464に付属していたこのファームウェアは、優れたリリースでしたが、唯一の大きなバグは、関数に関するものでしたDEC$()(PRINT USINGスタイル出力は提供されるものの、画面出力ではなく文字列として出力されてしまう)。ファームウェアをROMチップの製造に回す前にこのバグを修正する時間がありませんでした。そのため、この関数はドキュメント化されずに放置され、遭遇すると構文エラーが発生するように事前に修正されていました。好奇心旺盛なプログラマーがdec$コード内でその単語が大文字になっていることに気づき、それが既知の予約語であることを発見しました。当時は理解できませんでしたが、バグの経緯とBASIC ROMの逆アセンブル結果が明らかになったことで、その理由が判明しました。
BASIC 1.0 ROMを調査すると、その関数の残骸と、機能不全に陥ったトークンテーブルエントリが見つかる。
CPC664/6128に付属していたこの機器は、DEC$の修正に加えて、(とりわけ)以下の追加キーワードを導入しました。
COPYCHR$、CURSOR、FILL、FRAME、GRAPHICS PAPER、GRAPHICS PEN、MASK - ファームウェアとその中のあらゆる進歩を利用するBASICの流れを汲む。
また、この機能により、ディスク エラーを捕捉するための不器用ながらも適切な方法が導入されましたDERR。エラーは従来どおり捕捉する必要がありましたON ERROR GOTO ...が、単一の「Broken In」エラー 32 を拡張して、より詳細な情報を提供できるようになりました。DERR を調べると、さらに 10 個のインジケーターが表示されます。返される値は AMSDOS エラー番号に 128 を加えた値で、たとえば 14 は DERR 値 142 (14+128) として報告されます。考えられるエラーには、通常のファイルが見つからない、ディスクがいっぱいなどのほか、「142 - ストリームが適切な状態ではありません」や「149 - ファイルが開いている間にディスクが変更されました」といったより具体的なものがありました。DERR は BASIC 1.1 の機能であるため、AMSDOS と BASIC 1.0 を組み合わせた FDI1 拡張版 CPC464 では使用できませんでした。 CPC464 のディスクエラーは取得可能でしたが、PEEKAMSDOS システム領域へのアクセスに依存しており、AMSDOS 変数アドレスが移動したため、そのようなプログラムは CPC664/6128 と互換性がありませんでした。
変数名は文字で始まり、最大40文字まで使用できます。変数名はA-Z、数字0-9と.記号で構成されます。変数名では大文字と小文字は区別されませんが、プログラムリストでは入力時の大文字と小文字が保持されます。
変数名に識別子サフィックスを付けることで示される3つのデータ型がサポートされており、DEFINT, DEFREALおよびDEFSTRディレクティブを使用することで選択的に指定できます。
MyString$、最大 255 バイトの長さMy.Integer%: -32768 ~ +32767 の範囲)My99Real!: 約 +/-10E+38 ~ +/-4E-39 の範囲で、有効数字は 9 桁です。型が指定されていない変数名のデフォルトは実数です。浮動小数点演算はすべて、Amstrad BASIC がファームウェアの MATHS_PACK を公開した結果です (非常に完全で、マシン コードから完全に使用可能です)。一部の方言とは異なり、変数名は型まで一意であり、たとえばS%と はS!別々の変数です。
次元付き変数(配列)は、最小要素番号が 0 であり、要素を角括弧で囲むことで、プログラム コード内の複雑な式における他の括弧と区別することができます。たとえば、 はA(3)と記述できますA[3]。
名前付き単一行関数がサポートされており、変数の型と名前の規則に従いますが、先頭にドット(.)が付きますFN。例:FNMy.Func!
メモリ内の変数のアドレスは、@ ディレクティブを使用して決定できます。例: PRINT @A$。これは、BASIC の他の方言にある VARPTR() 関数に代わるもので、主に双方向のデータ転送を可能にするために、変数ポインタをマシン コード ルーチンに渡すために使用されます。
整数型および実数型の変数値は変数テーブルに格納されます(下記のメモリマップを参照)。文字列型の変数の内容はヒープに格納されます。これにより、ガベージコレクションによる断片化されたメモリの集約が可能になります。したがって、文字列の場合、変数テーブルには、変数の長さと、実際の内容が格納されているヒープ内のアドレスからなる3バイトの記述子が格納されます。
BBC BASICは、一部の整数変数を扱うための巧妙な方法を採用しており、Locomotive BASIC(ひいてはAmstrad BASIC)に大きな影響を与えたと主張されているにもかかわらず、後者ではこの方法は採用されませんでした。BBC BASICには、27個の1文字整数値用に54バイトのテーブルが確保されている@%, A%, B% ... Z%ため、変数テーブルを占有したり、参照したりする必要はありません。特定の変数の値を取得するには、左シフトと加算を行うだけで済みます。これにより、対象となる変数へのアクセスが非常に高速になり、その普及度を考えると、この仕組みがAmstrad BASICで採用されなかったのは、ある意味驚きと言えるでしょう。
文字列の場合、記述子は変数テーブル内の3バイトで、長さ記述子と実際のペイロードの(リトルエンディアン)アドレスで構成されます。@によって返される値がヒープ内の2バイトのアドレス(長さプレフィックスもヒープに移動)であれば、2つのアドレス検索が1つに置き換えられるため、アクセス時間が大幅に短縮されます。

グラフィックや色の処理は、などのコマンドで簡単に行えましたDRAW, PLOT, INK, PAPER, BORDER。
Amstrad BASIC V1.1 (CPC664 以降) では、FILLコマンド DRAW により、画面上の複雑な形状の境界領域をペイントすることができ、8 ビットのマスクを適用して点線などを有効にすることができました。
664以降の機種に搭載された3インチディスクドライブの筐体には、27色のシステムカラーに対応する数値コードを示す表が印刷されていた。
テキストは、0~9の番号が付けられた「ストリーム」という概念を用いてシステム内を移動し、適切なコマンドはハッシュ#記号をストリーム番号の先頭に付けて使用します。
ストリーム 0~7 はテキスト ウィンドウです。TEXT_VDU ファームウェア パックでは、それぞれ独自のカーソル、寸法、コンテンツ、色などを持つ複数のテキスト ウィンドウを作成できます。個々のウィンドウは、ストリーム番号を使用してアドレス指定されます。たとえば、 。ストリーム番号を省略すると、デフォルトでストリーム 0 になります。これは と同等です。テキスト ウィンドウは単純な画面領域であり、重なり合うことができますが、他のウィンドウの「下」にあるウィンドウの内容を保持する組み込みの機能がないため、破損を避けるために注意が必要です。後に、ファームウェア呼び出しをインターセプトし (ジャンプ ブロックをパッチすることによって)、別のウィンドウがその上に描画される直前にウィンドウの内容を保持し、新しいウィンドウが閉じられたときにそれを復元するマシン コード ルーチンが利用可能になりました。これにより、時代を意識して、私たちが慣れ親しんだはるかに便利な「ウィンドウ」の外観が実現しました。 1984 年当時、「ポップアップ」は斬新な概念でした。テキスト ウィンドウを使用する場合、画面のスクロールは、CRT コントローラのスクリーン ベース アドレスを調整してハードウェアを使用して画面全体をスクロールするのではなく、ソフトウェアに依存します (画面コンテンツの一部のみが移動するため)。 2 つのフォーム用に 2 つのSCREEN_PACKファームウェア コールが提供されています。$BC4D SCR_HW_ROLL (画面全体を 8 ピクセル行 (つまり 1 文字行) ずつ上下にスクロールします) - ハードウェアに依存するため、スクロールは非常に高速です。$BC50 SCR_SW_ROLL (画面の一部を 8 ピクセル行ずつ上下にスクロールします)。後者は、広い領域をスクロールすると、画面上に顕著な「波紋」が発生する場合があります。PRINT#3,"Hello World!"PRINT"Hello World!"PRINT#0,"Hello World!"
ストリーム 8 はセントロニクスのパラレル ポートです。 1 行のテキストをプリンタに送信するには、 コマンド を使用できます。 印刷リストを作成するには、プログラムをLISTPRINT#8,"Hello World!"してストリーム 8 に送信するだけで済みます。たとえば、 。 この柔軟な方法により、従来の BASIC コマンドおよび は不要になります。 後にシリアル インターフェイスが利用可能になり、より広範囲のプリンタやその他のデバイスへのアクセスが可能になると、 MACHINE_PACKジャンプ ブロックの$BD2B MC_PRINT_CHARをパッチすることで、#8 を別の用途に振り向けることができました。LIST#8LPRINTLLIST
ストリーム 9 は現在開いているファイル (カセットまたはディスク、入力または出力) であり、関連するコマンドはコンテキストに依存します。たとえば、入力ファイルと出力ファイルの両方を同時に開いてPRINT#9、INPUT#9それに応じてテキストをルーティングすることが可能です。
当時の他のほとんどすべての BASIC と比べて際立った特徴は、EVERY、AFTERおよびREMAINコマンドを使用して 1 秒あたり 50 ティックのタイマーベースのソフトウェア割り込みメカニズム (KERNEL のソフトウェア割り込みを利用) です。 4 つのタイマー (0 ~ 3) が使用可能で、優先度が下がるように割り当てられています。これはプラットフォームの制限ではなく BASIC の制約であり、プログラマーは、指定された遅延の後に、必要に応じて繰り返して、BASIC プログラムのセクションを非同期で実行できます。たとえば、 は、EVERY 50,0 GOSUB <line>それ以上の処理を行わずに 1 秒間の呼び出しを繰り返します。 EVERY または AFTER に応答すると、すべての優先度の低い割り込みが暗黙的に無効化されます (下記の DI を参照)。これは、対応する によって自動的にクリアされますRETURN。すべての割り込みサービスルーチン (ISR) と同様に、このような GOSUB は、ISR 内でプログラムを完了しようとするのではなく、プログラムの大きなチャンクをさらに処理するためのフラグを設定するなど、できるだけ短くする必要があります。
割り込み機能を使用するには、不要な場合にその影響を制限する方法が必要です。BASIC割り込みを無効にするコマンドDIとEI有効にするコマンドの2つがあります。DIは、タイマー、カラー点滅、キーボードスキャン、サウンド出力など、BASICの割り込み駆動機能すべてに干渉するため、使用は控えめにしてください。したがって、DIとEIで囲まれたプログラムは、プログラムの流れが阻害されないように、ISRと同じ要件を満たす必要があります。
Amstrad BASICは、3つのトーンチャンネルと1つのノイズチャンネルを備え、割り込み駆動によるサウンド生成と、3つのオーディオチャンネルの包括的な調整、および関連するBASICコマンド(Sound Queueなど)を備えたサウンドチップAY -3-8912を比較的高いレベルで制御することを可能にしました。同じチップは、後期のZX SpectrumやAtari ST、MSXコンピュータでも使用されていましたが、それらのいずれも、これほど完全な組み込みコマンドを備えていませんでした。特定のチャンネルまたはチャンネルの組み合わせの選択、エンベロープ、ボリューム、ピッチ、ノイズなどの設定など、多くのことを最大7つのパラメータを持つ単一のコマンドで実行できました。確かに、特に複雑な、または低レベルの技術は、ハードウェアへのより正確または直接的なアクセスを必要とするため、BASICでは実行できませんでした。たとえば、トラッカーからの特に複雑な音楽(アルペジオを使用したシミュレートされたコードなどを含む)、たとえばゲームRoboCopのようなデジタルサンプリングされたサウンドの再生などです。SQ()ON SQ <channel> GOSUB <line>SOUNDSOUND
BASIC で管理されるディスク、テープ、ファイル管理はすべてファームウェアを介して行われ、などのコマンドを使った簡単なファイル管理には十分です。SAVE, LOAD, MERGE, RUN", CAT当時、デスクトップコンピュータは「BASIC で起動」するのが一般的で、ほとんどの低価格家庭用コンピュータに付属していた BASIC は、ファイルの管理や、マシンと記憶媒体間のプログラムコードとデータの転送を行うシンプルなオペレーティングシステムとしても機能していました。

また、パラメトリックLOADコマンドも利用可能で、例えば、BASIC命令をいくつか実行するだけで、「生」の画像データを含むファイルをビデオメモリにロードして表示させることができます。コマンドにメモリアドレスをパラメータとして追加することでLOAD、SAVE圧縮されていない16KBの生の画面画像を簡単にロードできます。
マシン コードは十分にサポートされています (ただし、BBC Micro のインライン アセンブラほど印象的なレベルではありません)。安全なメモリを割り当てる簡単な方法があります (下記参照)。ディスクまたはカセットからロードされた後、またはPOKEd 入力された後は、Z80 マシン コードは で実行できますCALL <addr>。CALL は、BASIC 変数 (文字列を含む) を使用して、 の形式でパラメータをマシン コードに渡す方法をサポートしていますCALL <addr>,Q,@X$。整数変数と整数即値は、その値として直接渡すことができます (ByVAL)。すべての変数、特に文字列は@、変数記述子のアドレスを指すディレクティブ (ByREF) を使用して渡すことができます。したがって、BASIC プログラムとマシン コード間の双方向のデータ転送は簡単です。
ファームウェアを活用する別の方法では、常駐システム拡張機能 (RSX) と呼ばれる機能を使用して、マシンコードに名前を付けることができます。これは純粋な BASIC の機能ではありませんが、Amstrad BASIC はこの RSX のメカニズムを採用しており、名前は予約語のように BASIC プログラムで使用できます。それぞれにバー|記号がプレフィックスとして付き、残りの構文は CALL と同じです。例|MYRSX,Q,@X$(RSX 名と引数の間にはカンマが必要です)。RSX のコードには、RSX 名、エントリ ポイント、ファームウェアがリストにリンクするための 4 バイトのスクラッチ パッド RAM という非常に特殊なヘッダー構造があります。KERNEL ルーチン $BCD1 KL_LOG_EXT を使用して呼び出しを行い、名前を初期化すると、システム全体で使用できるようになります ($BCD4 KL_FIND_COMMAND を使用して各名前付きセクションを検索します。BASIC は | コマンドに対してこれを行います)。 RSX の大きな利点は、どのバンクにあるマシン コードのアドレスを知る必要がないことです (CALL は、構成に関係なく、メインの 64KB アドレス マップにしかアクセスできません) - KERNEL は、メモリ マップ全体およびすべての ROM/RAM バンクのどこにコードがあっても、そのコードを実行するために必要なパラメータを返します (下記の「バンク切り替え」を参照)。コードは、RSX 名を検索してサイドウェイ コールするだけで、リンク構造からファームウェアは必要な ROM/RAM バンク構成をすぐに認識します。などを使用してマシン コードを実行します。したがって、すべてのメモリがマシン コード プログラムに使用できます。RSX を使用すると、サイドウェイ ROM のマシン コードが BASIC と完全に統合され、ディスク コマンドなどがすべて ROM に存在し、BASIC プログラム コード全体で使用されることが保証されますKL_SIDE_CALL。CPC464では、ディスク コマンドは、FDI1 (サイドウェイ ROM を備えたフロッピー ディスク インターフェイス) が背面拡張ポートに接続されたときにのみ追加されました。KL_SIDE_PCHL|DIR, |A, |TAPEIN, |ERA
当時の英国のCPC界隈では、「bar」で始まる単語をダジャレにして、RSXにそれに応じた名前を付けるのが流行っていた。例えば、|BQ、|BARASTREISAND、|STARDなど。
一般的に言って、BASICプログラマーは、適切な結果を得るために、選択したプラットフォームの内部動作についてあまり深く考える必要はありません。プログラマーがそれらを無視してBASICのみに専念したい場合でも、高速で豊富な言語が用意されているため、十分に対応できます。さらに高度な制御を求めるプログラマーにも、同様に配慮されています。
多くの現代システムでは、メモリブロックの割り当ては後回しにされ、それを実現するための「適切な」方法は存在しないようです。プログラマーは革新的な方法を採用し、その結果、必要な長さのREMステートメントを作成し、 BASIC プログラム行の既知のアドレスにデータをPOKEするなど、非常に難解で扱いにくい方法がいくつか生まれました。このコマンドは ZX81 界隈で有名で、16514 は最初のプログラム行の最初のトークンの後の最初のバイト (通常は行 1 の REM ステートメント) のアドレスであり、追加されたプログラム行、ガベージ コレクションなどで移動したり破損したりしないことが保証されている唯一のメモリ領域です。LETL=USR16514
Amstrad BASIC プログラム領域は、$170 から $A6F0 付近 (BASIC のバージョンやその他の要因によって異なります) までの RAM を占め、BASIC システム領域、AMSDOS 領域、およびハイジャンプブロックのすぐ下に位置し、41KB 強です。数値変数や関数などはプログラムのすぐ上に配置され、その間の残りの空きメモリは「ヒープ」と呼ばれます。文字列変数の内容はヒープの最上部付近に格納され、文字列記述子のみが変数テーブルの数値と同様の方法で、プログラムのすぐ上に格納されます (上記の「変数と関数」を参照)。BASIC プログラムコードは RAM 上で成長し、文字列は互いに下に向かって成長し、その間のヒープを徐々に消費します。Amstrad BASIC には、使用可能なメモリを最大化するためにヒープをデフラグするガベージコレクタがあります。ほとんどのコンピュータ言語と同様に、文字列が作成されてスライス/削除されると、使用済みの部分の間に未使用のメモリの塊が発生し、ヒープが「多孔質」になることがあります。特に、BBC Micro にはガベージ コレクションがなく、文字列の操作によって、要求されたブロックが 1 つのチャンクに存在しないという理由だけで「メモリ不足」エラーが発生する可能性がありました。他の方言と同様に、Amstrad BASIC はFRE()空きヒープの量を返す関数を提供します。この関数には 2 つの形式があります。FRE(numeric)たとえば、 は、ヒープ内の最大の単一ブロックのサイズをバイト単位で返します。2 番目の形式 は、ガベージ コレクションを強制するため、空きヒープの真のカウントを返します。使用領域 (主に文字列と一時構造) は、ギャップなしでヒープの最上部に集約されます。データが移動され、ポインタが更新され、使用可能なヒープは、プログラムと変数に向かって伸びる単一のメモリ チャンクとして残ります。この後者の形式は、ひどく断片化されたシステムでは実行に時間がかかる場合があります。空きヒープがないために「メモリ不足」エラーが差し迫っている場合、Amstrad BASIC は、状況を救うために、プログラムを停止する直前にガベージ コレクションを実行します。そのため、プログラマーはヒープ管理について過度に心配する必要がなくなり、FRE() は必須というよりは情報提供の役割を果たすようになった。PRINTFRE(0)FRE("")
Amstrad BASIC には、BASIC が最後に使用したアドレス、つまりシステム領域の直前のアドレスを返すHIMEM関数があります。MEMORYコマンドを使用してこのアドレスを調整でき、この 2 つの関数を組み合わせることで、メモリ領域を簡単かつ制御可能に確保できます。これは、メモリ領域の原始的な形式です。たとえば、1KB のブロックが必要な場合、BASIC のメモリ 使用量の最大値を調整することで、BASIC の完全な同意と認識のもとでメモリ領域を確保できます。その後、マシン コードを安全にロードして、(またはその 1KB 内の他の場所) で呼び出すことができ、他のプロセスや偶発的な再配置/破損から保護されます。malloc()MEMORY HIMEM-1024HIMEM+1

CPCシリーズは、SCREEN_PACKを介してユーザー定義グラフィックス(UDG)を提供し、文字の8 × 8ピクセルマトリックスを再定義することで特殊文字を作成できます。デフォルトでは、上位16文字(128バイト)が「ソフト」であり、それで十分な場合は、それ以上の調整は必要ありません。BASICでプラットフォーム機能を公開するという理念に従い、この機能が引き継がれ、UDGのメモリはヒープから割り当てられます(つまり、文字数が多いほどHIMEMは小さくなります)。コマンドを使用して、より多くの文字(したがってより多くのRAM)を割り当てることができます。ここでcharは、UDGが使用可能な文字コードを表します。たとえば、印刷可能なASCII文字セット全体を再定義できますが、それに伴い使用可能なプログラム領域(1784バイト)が減少します。ファームウェアは、デフォルトの文字マトリックスをROMから新しく割り当てられた領域にコピーするため、文字マトリックスを定義することは明確さのために必須ではありませんでした。 UDG が不要な場合は、コマンドを使用してメモリを BASIC に戻すことができます (結果として固定文字マトリックスになります) 。SYMBOL AFTER <char>SYMBOL AFTER 32SYMBOL AFTER 256
BASICの実装としては、Amstrad BASICはかなり完成度が高く、CPCプラットフォームをサポートするために多大な努力を払っているものの、すべてのバージョンにおいて、Z80メモリ空間を拡張するために使用されるメモリバンク切り替えメカニズムへのネイティブアクセスが欠けているという注目すべき欠点がある。これは、物理ROMまたはRAMのセクションを重ね合わせることによってアドレス範囲を再利用することである。
カスタム回路の配置により、Z80メモリマップの4つの16KBページ($0xxx、$4xxx、$8xxx、$Cxxx)のいずれかにページを切り替えることが可能です。たとえば、最上位ページ($C000)は(通常)ビデオRAM、BASIC ROM、および(ディスク搭載マシンでは)AMSDOS ROMで占められており、ハードウェアとファームウェアが必要なアクセス制御を提供します。ファームウェアROMは下位16KBにバンク切り替えされ、追加のRAM(Z80の64KBを超えるもの、たとえばCPC6128の追加64KB)とサイドウェイROM(ユーザーマシンコードまたはサードパーティ製ソフトウェアを含む)は最上位ページ($C000)にマッピングされます。実際には、61KBのTPA(一時プログラム領域 - CP/M+実行時の空きプログラムメモリ)が示すように、RAMは任意のバンクにマッピングできます。明らかに、OSの要件は3KBを超えています。

CRTコントローラは通常、メインのZ80アドレス空間の$C000にある16KBのビデオRAMにマッピングされ、ハードウェアは他のバンクが同じページに切り替えられたときにビデオ画像が中断されないようにします。余談ですが、CPUとCRTCが同じメモリにクリーンにアクセスできるようにするため、ハードウェアはバスアクセス時間を一定のクロックサイクル数に合わせる必要があり、すべての命令は(Z80制御バスのWAIT信号を使用して)次の4サイクルまで「引き伸ばされる」ため、Z80で実行されるすべての命令は、Z80の公開されているタイミングに関係なく、常に4の倍数Tステート、つまり4、8、12などになります。この結果、当時の最速のBBC Microよりもコードのパフォーマンスがわずかに遅くなりました。すべてのCPCモデルは、当時としてはかなり先進的なバンク切り替え機能をサポートしており、メモリ容量を増やすことができました。拡張されていないCPC464でさえ、Z80の64KBアドレス空間にマッピングされた96KBのROMとRAMをフルに使用していました。
メモリへの書き込みは、切り替え状態に関係なく、常にメインの64KBアドレス空間内のRAMにのみ適用されます。たとえば、下位ROM($0~$3FFF)がメモリマップに切り替えられた場合でも、書き込みはRAMに対して行われます。カーネルは、メモリマップ内で切り替えバンクが発生する場所について、いくつかの構成をサポートしています。POKE&800,0
CPC464/664 ハードウェアは、最大 8 個の 16KB サイドウェイ ROM を含む最大 256KB までアドレス指定でき、これは大型カスタム チップによって制御されます。1 つの位置は BASIC ROM に使用され、CPC664 と FDI1 で拡張された CPC464 の両方は、AMSDOS ROM 用にさらにスロットを使用するため、6 つのスロットが残ります。CPC6128 ハードウェアは、最大 4MB のバンク切り替えが可能で、16 個 (PCB ハックで 32 個) の 16KB サイドウェイ ROM 用のスペースが増加します。ここでも、2 つの位置は BASIC と AMSDOS で占有され、14 個がユーザーまたはサードパーティ用に使用可能です。KERNEL は、バンク メモリにアクセスするためのいくつかの方法を提供します。一部の方法は、ベクトルを介して擬似 24 ビット アドレスを使用したり、C レジスタを使用して HL レジスタ ペアを拡張したりします。ROM の場合のみ、高位または低位 ROM 切り替えは、16 ビット アドレスの上位 2 ビットによって制御されます。さらに、バンクの状態に関係なく、メインストリームのZ80アドレスマップにあるかのように、あるいはメインの64KB RAMから直接バンクからデータを取得できるものもあります。バンクメモリにアクセスするためのカーネルルーチンには、KL_FAR_CALL、KL_FAR_JMP、KL_RAM_LAMなどがあります。
「サイドウェイ呼び出し」、つまりバンクを切り替えてそのアドレスにあるマシンコードを実行するためにジャンプする前に、カーネルは Z80 スタック上に構造体を構築し、RETバンクメモリ内のコードからの受信 urn を安全にキャプチャできるようにします。これにより、バンクの状態が復元され、コードの実行が問題なく継続されます。バンク ROM 間で呼び出しが行われるのはごく普通のことです。実際、BASIC が AMSDOS (ディスク コマンド) を使用するたびに、両方の ROM が同じ物理アドレス空間を占有するため、この呼び出しはシームレスに行われます。CPC シリーズは割り込み駆動型であるため、Z80 スタック ポインタ (SP) レジスタはそのままにしておくのが賢明です。ローカルで使用すると、割り込みが発生した際にスタックが迂回されてクラッシュする可能性があるためです (ルーチンの実行後にスタックを破棄できるように、スタックをローカル ブロックに設定することはよくあります)。このような割り込みは、カーネルのスタック上の構造体に依存する可能性があります。
BASICはカーネル機能のサポートを提供していなかったものの、BASICプログラムでバンクメモリを使用することは確かに可能だった。ただし、切り替え処理を行い、その結果を活用するには、マシンコードルーチンを使用する必要があった。バンクメモリはBASICプログラムコード自体には使用できませんでした。
同梱されていた CP/M 2.2 および CP/M+ (CPC6128) ディスクには、BASIC に原始的ではあるものの十分なバンク切り替えコマンドを追加する 2 部構成のプログラムが含まれていました。BANKMAN.BAS を実行すると、1317 バイトの RAM が確保され、そこに BANKMAN.BIN がロードされ、そのバイナリが呼び出された後、自身を削除します。後者のファイルには、BASIC プログラムから RAM バンク切り替えを可能にする RSX のセットを初期化するマシン コードが含まれています。機能には、バンク間の画面の保存とロード、バンク間のコピーなどが含まれます。ただし、バンク切り替え RAM を利用するには、BANKMAN ファイルを両方とも自社のソフトウェア製品に含め、コマンド プロンプトで実行する必要があるため、一般的には実用的とは考えられていませんでした。さらに障害となるのは、著作権で保護されていないにもかかわらず、BANKMAN.BAS は保護モード ( ) で保存されているため、リスト化できないことです。つまり、RSX をロードする方法を簡単に特定して、独自のプログラムで使用して、2 段階の起動をなくすことができません。SAVE"<my_prog>",p
バンクメモリを使用して画面イメージを保存し、それらを高速に切り替えることに加えて、一部のアプリケーションは「RAMディスク」を実装していますが、これらは非常に独自性が高いため、カセット/AMSDOSファームウェアではサポートされていません。
グラフィックやサウンド専用のコマンドがなかったCommodore 64の内蔵BASIC(Commodore BASIC )とは異なり、Amstrad BASICはマシンの標準機能の範囲内であればほぼ何でも実行できた。これは重要な点であり、当時の他のマシンの中には、システムのサウンドとグラフィック機能を最大限に活用するためにプログラマがアセンブラを使用する必要があったものもあった。MSX、Sinclair Spectrum、その他いくつかのマシンは、サウンドとグラフィック機能に関して、ほぼ同様のコマンドセットを提供していた。BASICの機能を明確に超えていたのは、ゲームやデモで使用されるオーバースキャンモード、27色グラフィックモード、デジタルサウンド再生、スムーズスクロールだけだった。
Sinclair BASICやCommodore 64 BASICのように、記号や色を選択するための様々なキーボードショートカットや専用キーがあったのとは異なり、Amstrad BASICのキーワードはフルネームで入力し、インタープリタが解析、認識、トークン化を行った?。ただし、「 」を「 」のように省略したり、いくつかのショートカットも存在した。プログラムはコンパクトカセットやフロッピーディスクPRINTに保存でき、バイナリファイルまたはASCIIファイルとして取り出すことができた。