z80システム用のブートローダーを書き始めました。これまでのところ、プログラムはシリアル経由で16進数を受け入れ、メモリ内の場所にロードできます。
私が抱えている問題は、ブートローダーがメモリの先頭にあり、割り込みを使用していることです。ブートローダーを上書きせずに新しいプログラムをロードするにはどうすればよいですか?
(また、ロードされたプログラムは割り込みも使用したい場合があります)
z80システム用のブートローダーを書き始めました。これまでのところ、プログラムはシリアル経由で16進数を受け入れ、メモリ内の場所にロードできます。
私が抱えている問題は、ブートローダーがメモリの先頭にあり、割り込みを使用していることです。ブートローダーを上書きせずに新しいプログラムをロードするにはどうすればよいですか?
(また、ロードされたプログラムは割り込みも使用したい場合があります)
最も広く使用されている最善のアプローチは、アプリを、更新されない安定したブートローダーと、随時交換できるアプリケーションに分割することです。
AFAIK、Z80には割り込みベクトルだけがあり、CPU自体でそれらを置き換えることはサポートされていません。あなたはあなたのメモリブロックを置き換える何かをあなたのハードウェアに持っている必要があります。
それ以外の場合は、ダウンロード中にブートローダーがアプリ部分で何も使用しないという機能を備え、アプリ内で何かを呼び出す可能性のある割り込みをブロックする必要があります。
場所については、ブートローダーをアドレススペースの上部に配置し、プログラムをアドレススペースの先頭にロードできます。
プログラムの場所とサイズをプロトコルに含めることもできます。これにより、ブートローダーは、値のペアがブートローダーの場所とサイズと互換性があるかどうかを確認できます(IOW、プログラムがロードされた場合にブートローダーを上書きするかどうか) 。
もう1つのオプションは、プログラムに再配置情報を含め、ブートローダーに単純な再配置子を含めることです。そうすれば、十分な空きメモリがあれば、どの場所でもプログラムをロードできます。これは、多くのOSがプログラムをロードするときに行うことです。
割り込みに関しては、問題はありません。プログラムが割り込みを使用することを許可しないのは誰または何ですか?または、ブートローダーに常駐と言って、バックグラウンドで何かを続行するか、プログラムからそれに戻ることができるようにしますか?これらのいずれも必要ない場合は、プログラムに割り込みを使用させるだけです(おそらく、それを許可するために何もする必要はありません)。
OTOHで、ブートローダーの機能を維持したい場合は、追加の割り込みベクトルテーブルを維持することで、間接化の追加レイヤーを導入できます。プライマリISRは、この割り込みベクタテーブルからセカンダリISRを抽出し、そこにジャンプします。次に、ブートローダーとプログラムは、新しいISRを追加したり、既存のISRをオーバーライドしたりするために、これを行う必要があります。
ISRの削除は明らかであり、上記と同様です。
新しいISRは、次のことができます。
プログラムとブートローダーがこのテーブルを使用し、独自のISRが不要になったときにテーブルを復元するように要求する必要があります。
新しいISRの前後に古いISRを実行してISRを連鎖させる場合、どのような問題を解決する必要があるのかわかりません。しかし、一部のシステムでは、それが可能な設計です。多くのx86PCプログラムとドライバーがMSDOSでそれを行いました。