5

TI-83 +計算機(Z80プロセッサ)用のアプリケーションをアセンブルするたびに、CALLで実行が停止します。次に例を示します( "Hello")—正常に実行を開始しますが、電卓はCALL命令でフリーズします。CALLの前に置いたものはすべて正常に機能し、後に置いたものはすべて実行されません。これは、ラベルではなく住所を表示するためのコードの逆アセンブルです。読みやすくするために、それらが含まれるDB行を表示するために「修正」しました。

アセンブリ「プログラム」(RAMにロードされる)を作成するときにこの問題が発生したことはありません。「アプリケーション」(フラッシュROMに保持されている)の実行に関して私が知っている唯一の問題は、それらが自己変更できないことと、ページングが必要なため、別のページのデータにアクセスできないことです。これは自己変更ではなく、1ページしかありません...私は何を間違えましたか?

0080 218900        LD   HL, 0089h
0083 cd9900        CALL 0099h        ;                      --- App stops here
0086 c38f00        JP   008fh
0089 48656c6c6f00  DB   "Hello", 0
008f fd360500      LD   (IY+05h), 0
0093 ef            RST  28h          ; B_CALL (
0094 364c          DB   4C36h        ;   _ReloadAppEntryVecs)
0096 ef            RST  28h          ; B_CALL (
0097 2740          DB   4027h        ;   _JForceCmdNoChar)  --- App should end here
0099 7e            LD   A, (HL)      ;                      --- Call goes to here
009a ef            RST  28h          ; B_CALL (
009b 0445          DB   4504h        ;   _PutC)
009d fe00          CP   0
009f c8            RET  Z
00a0 23            INC  HL
00a1 18f6          JR   0099h
4

2 に答える 2

9

どうやら、あなたは0080hに対応するために集まっています。アドレス範囲0000h〜3FFFhがROMページ0にロックされているため、これは正しくありません。実際、この例によれば、 4000hにアセンブルします。したがって、問題は、CALLがアプリケーションの一部ではなく、ファームウェアにジャンプしていることです。

于 2010-01-27T21:57:35.657 に答える
2

これが私がTi-83+のために見つけたメモリマップです。ROMが存在するアドレス$0080でこのプログラムをロードすることはできません。他の場所にロードされます。それは、JPまたはCALLを作成するまでしばらくの間機能します。CALL $ 0099は、予想されるジャンプアドレスにジャンプせず、ROMにジャンプします。それはクイックエンドです。

.asmで適切なORGディレクティブを選択して、RAMの予想されるアドレスにロードされるようにする必要があります。それがどこにあるかもしれません。

于 2010-01-27T22:09:00.540 に答える