Z80 (TI-83+) перестает работать при вызове
-
23-09-2019 - |
Вопрос
Каждый раз, когда я собираю приложение для калькулятора TI-83 + (процессор Z80), оно перестает запускаться при вызове.Вот пример ("Привет") — он начинает работать просто отлично, но калькулятор зависает при выполнении команды ВЫЗОВА.Все, что я ставлю перед вызовом, работает просто отлично, а все, что я ставлю после, не запускается.Это дизассемблирование кода, чтобы показывать адреса, а не метки.Я "подправил это", чтобы показать строки базы данных, в которые они попадают, чтобы их было легче читать.
У меня никогда не возникало такой проблемы при написании ассемблерных "программ" (которые загружаются в оперативную память).Единственные проблемы, о которых я знаю при запуске "приложений" (которые хранятся во флэш-ПЗУ), заключаются в том, что они не могут самоизменяться и что, поскольку необходима подкачка, доступ к данным на отдельной странице невозможен.Это не самоизменяющийся файл и содержит только одну страницу...Что я сделал не так?
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
Решение
По-видимому, вы выполняете сборку по адресу 0080h.Это не может быть правильным, потому что диапазон адресов 0000h--3FFFh заблокирован на странице 0 ПЗУ.Действительно, согласно этот пример, вы собираете до 4000 часов.Итак, ваша проблема в том, что ваш вызов переходит в прошивку, а не является частью вашего приложения.
Другие советы
Вот такой карта памяти Я нашел для Ti-83+.Вы не можете загружать эту программу по адресу $ 0080, именно там находится ROM.Он загружается в другое место.Это работает некоторое время, пока вы не сделаете заказ или звонок.Вызов $ 0099 не переходит на ваш ожидаемый адрес перехода, он переходит в ПЗУ.Это быстрый конец.
Вам нужно выбрать правильную директиву ORG в вашем .asm, чтобы она загружалась в оперативную память по ожидаемому адресу.Где бы это ни было.