Z80 (TI-83+) перестает работать на ЗВОНОК

Каждый раз, когда я собираю приложение для калькулятора TI-83+ (процессор Z80), оно перестает запускаться на CALL. Вот пример («Hello») — запускается нормально, но калькулятор зависает на инструкции CALL. Все, что я ставлю перед CALL, работает нормально, а все, что я ставлю после, не запускается. Это дизассемблирование кода для отображения адресов, а не меток. Я «подправил» его, чтобы показать строки БД, куда они попадают, чтобы их было легче читать.

У меня никогда не было этой проблемы при написании ассемблерных «программ» (которые загружаются в оперативную память). Единственные известные мне проблемы с запуском «приложений» (которые хранятся во флэш-памяти) заключаются в том, что они не могут самомодифицироваться, а поскольку разбиение по страницам необходимо, доступ к данным на отдельной странице невозможен. Это не самоизменяющийся и имеет только одну страницу... Что я сделал не так?

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

person c4757p    schedule 27.01.2010    source источник
comment
Гарантирует ли вызов putc сохранение содержимого регистра А? Большая беда, если нет. Чтобы выяснить, не в этом ли проблема, окружите вызов putc символами push и pop, чтобы сохранить A.   -  person Wayne Conrad    schedule 28.01.2010
comment
Почти уверен, что приложения начинаются с 4080h.   -  person Nietzche-jou    schedule 28.01.2010
comment
Да, putc сохраняет аккумулятор.   -  person c4757p    schedule 28.01.2010
comment
Я не думаю, что приложения начинаются с 4080h — как я уже сказал, все, что я ставлю перед CALL, работает (и не все, что до 0083h, все до того, куда я ставлю CALL). Если бы приложения начинались с 4080h, они бы пропустили его. 0080h находится сразу после заголовка, где вся неясная документация намекает, что он должен начинаться.   -  person c4757p    schedule 28.01.2010
comment
да. В любом случае код никогда не доходит до вызова PutC.   -  person c4757p    schedule 28.01.2010
comment
Я предполагаю, что указатель стека установлен на что-то разумное?   -  person Richard Pennington    schedule 28.01.2010
comment
Интересный вопрос. Извините, что задаю очевидные вопросы, хоть и знаю Z80 asm, но про ваш калькулятор ничего не знаю. Итак, 1) Как узнать, что приложение останавливается при звонке? 2) Если предположить, что ответом на [1] является пошаговое выполнение с помощью какого-либо отладчика, вы уверены, что пошаговое выполнение работает в приложениях? Я говорю это потому, что пошаговое выполнение обычно работает путем вставки RST после инструкции, что невозможно во флэш-памяти. 3) Вы уверены, что установили указатель стека на конец допустимой оперативной памяти? (вызов помещает в этот стек ret-адрес 0x0086). Позже я могу спросить о RST 28h.   -  person Bill Forster    schedule 28.01.2010
comment
Однако на всякий случай я попробую нажать и вытолкнуть как AF, так и HL. Почти каждый второй системный вызов, который у них есть, уничтожает кучу регистров, поэтому мне трудно поверить, что регистры уничтожены: в документации нет.   -  person c4757p    schedule 28.01.2010
comment
Приложения определенно живут в диапазоне 4000-7FFF. Все, что вы ставите перед CALL, вероятно, работает, потому что ни одно из них не чувствительно к адресам.   -  person Nietzche-jou    schedule 28.01.2010
comment
@Bill: 1/2) Да, пошагово с отладчиком. Я проверил, и да, пошаговое выполнение работает с приложениями. Я предполагаю, что он интегрирован в эмулятор процессора, который выполняет только одну инструкцию за раз. 3) Я знаю, что это беспорядочно (я определенно должен установить указатель стека в «настоящем» коде), но указатель стека всегда начинается в хорошем месте. Я проверял это, и это всегда там, где оно должно быть в начале. 3+(4)) РСТ 28ч | Согласно TI, DB xxxxh — это официальный способ выполнения системного вызова.   -  person c4757p    schedule 28.01.2010
comment
@sgm: Хорошо, я попробую. Может быть, я просто туплю. Однако я не смог найти никакой хорошей документации.   -  person c4757p    schedule 28.01.2010
comment
Меня очень пугает то, что я помню некоторые коды операций (cd, c3, 23 и многие другие).   -  person Richard Pennington    schedule 28.01.2010
comment
Я собираюсь перевести свои мысли в ответ. Он также содержит ссылку на учебник!   -  person Nietzche-jou    schedule 28.01.2010
comment
@Richard, z80 был моим первым набегом на настоящее кодирование в подростковом возрасте, у меня остались приятные воспоминания о мнемониках, особенно о невероятно мощном DJNZ, но CD и 00 - единственные коды операций, которые я помню, поэтому я тоже тебя боюсь: -)   -  person paxdiablo    schedule 28.01.2010
comment
@paxdiablo: Ах! Знаменитый 00. Конечно! Я думаю, что помню их, потому что впервые научился программировать, прочитав синюю книгу данных 8080 и кодируя, набирая программы в шестнадцатеричном формате.   -  person Richard Pennington    schedule 28.01.2010
comment
@ Ричард Пеннингтон. Я тоже! Мой первый проект включал ручную сборку нескольких сотен строк кода 8080, а затем ввод шестнадцатеричных кодов на плату разработчика Intel с 20-клавишной панелью и одной строкой из 7-сегментных светодиодных цифр. В то время я не мог представить себе программирование по-другому.   -  person Bill Forster    schedule 28.01.2010
comment
@Richard Pennington: Только что наткнулся на эту ветку и не могу удержаться от комментария-некрокомментария. Да, я тоже помню коды операций. Точно мои мысли. Вы не одиноки. Да, CD и 23. И прошло около 25 лет с тех пор, как я взломал их в свой ZX Spectrum, потому что у него не было ассемблера. Реально страшно ^^   -  person Gunther Piez    schedule 23.04.2011


Ответы (2)


Судя по всему, вы собираете по адресу 0080h. Это не может быть правильным, потому что диапазон адресов 0000h--3FFFh привязан к странице ПЗУ 0. Действительно, согласно этот пример, вы собираете до 4000h. Так что ваша проблема в том, что ваш ЗВОНОК прыгает в прошивку, а не в часть вашего приложения.

person Nietzche-jou    schedule 27.01.2010
comment
Да, это был глупый момент. Я добавил «ORG 4000h», и теперь он работает. У меня теперь другая проблема... Ничего из того, что я 'PutC' не выводит на экран — возможно, идиотская ошибка. Боже, первым гребаным языком, на котором я когда-либо программировал, был ассемблер 8080, и теперь мой ассемблерный код так долго выглядит, как будто его написал шимпанзе. - person c4757p; 28.01.2010
comment
Ok. Задача решена. Да, проблема с PutC тоже идиотская ошибка. Спасибо. - person c4757p; 28.01.2010

Вот карта памяти, которую я нашел для Ti-83+. Вы не можете загружать эту программу по адресу $0080, там находится ПЗУ. Он загружается в другом месте. Это работает какое-то время, пока вы не сделаете JP или CALL. CALL $0099 переходит не на ожидаемый адрес перехода, а в ПЗУ. Это быстрый конец.

Вам нужно выбрать правильную директиву ORG в вашем .asm, чтобы он загружался в ОЗУ по ожидаемому адресу. Где бы это ни было.

person Hans Passant    schedule 27.01.2010