PDA

Просмотр полной версии : Возврат в Бэйсик



Doktor
04.04.2011, 15:51
Разбираюсь с вызовом подпрограмм в кодах из Бэйсика по RND USR xxxx. То, что для успешного возвращения нельзя портить регистр IY, общеизвестно. Нашёл в литературе ещё такое:

„Особенным примером для программ Спектрум с 16К монитором является ситуация, когда при вычислении с плавающей запятой используются H и L регистры для сохранения адреса возврата. Поэтому, если эти регистры испорчены, то возвращение в Бейсик невозможно.“

„В микро-ЭВМ "СПЕКТР" пользователь может без каких-либо ограничений использовать альтернативный набор регистров, кроме регистров H' и L', в которых сохраняется адрес возврата к Бейсику.“

Кто знает точно?

jerri
04.04.2011, 16:10
поломанный IY плохо совмещается с IM1
HL' надо восстанавливать при работе бейсика

ваш КО

GriV
04.04.2011, 16:16
1. Не трогайте IY
2. Не трогайте HL' (альтернативный HL) - или по крайней мере восстанавливайте если используете.
3. BC на выходе хранит значение, которое возвращается функцией USR.

Doktor
04.04.2011, 16:32
Т.е. всё-таки альтернативный H´L´ . И если в подпрограмме не используются команды переключения регистров, то о сохранении регистров можно не заботиться? (разумеется, за исключением IY).

GM BIT
04.04.2011, 16:52
В начале программы пишите

LD (QUIT+1),SP

Потом ваша программа


И на выходе пишите:
QUIT LD SP,0
LD IY,23610
IM 1
LD HL,10072
EXX
EI
RET

И все будет нормально

Alex Rider
05.04.2011, 01:45
Не надо делать все сразу! Тем более, не понимая откуда какие проблемы возникают. Итак, по порядку:
1. LD (QUIT+1),SP: QUIT LD SP,0
Не надо писать программы, в которых SP на выходе не равен SP на входе!!! Если есть разбаланс стека, это серьезный баг, иногда очень трудноуловимый! Оставьте SP в покое - если он у вас в программе портится, путь лучше выход в из нее в BASIC (скорее всего, печальный) это покажет после очередного изменения программы, приведшего к разбалансу стека.
2. Если в программе есть DI, на выходе в BASIC должен быть EI, иначе остаемся без кнопок в BASIC'е. Зачем принудительно включать прерывания, если их не выключали?
3. Не понятно зачем при каждом выходе устанавливать IM1. Если Вы его меняли, то сами знаете, когда надо его вернуть обратно. Если нет - либо больше некому его менять, либо тот, кто поменял, знает зачем это сделал, когда надо вернуть обратно, и расстроится, если вы сами принудительно это сделаете когда оно не ожидает такой подставы. Кстати, IM 1 правильно возвращать так: DI: LD A,#3F: LD I,A: IM 1: EI.
4. LD IY,23610 - эта инструкция стоит в ПЗУ сразу после возврата из подпрограммы пользователя. На выходе этого делать не надо. Ограничение на использование IY состоит в том, что в обработчике прерывания IM 1 есть инструкция INC (IY + 40), увеличивающая старший байт переменной FRAMES. И, если Вы не запретили прерывания, переписав IY, то при переполнении младших байт FRAMES у Вас в программе что-то увеличится без вашей на то воли. Регистр IY можно использовать свободно только если прерывания запрещены или если установлен режим IM 2, но стандартная процедура обработки прерываний не зовется когда в IY Ваше значение.
5. А вот по поводу 10072 в HL' - это правда, без этого значения там хужает калькулятору, который "досчитывает" функцию USR после возврата из Вашей подпрограммы. Это значение точно портится, если вы зовете подпрограммы, реализующие команды Бэйсика DRAW, CIRCLE, ну, или портите его сами.

Doktor
05.04.2011, 09:00
Всем спасибо.
Я вобщем-то хотел только выяснить, какую пару нельзя портить, HL или H´L´.

jerri
05.04.2011, 09:58
Всем спасибо.
Я вобщем-то хотел только выяснить, какую пару нельзя портить, HL или H´L´.

Альтернативную HL

VNN_KCS
05.04.2011, 19:06
H´L´.
А это как? Только одну половину регистра? Что, так можно?:v2_dizzy_no:

Alex Rider
05.04.2011, 23:43
Важно, что бы при выходе в Basic в альтернативной паре HL' было значение 10072 (2758h). Сохранять его не обязательно, оно всегда одно и то же на входе в подпрограмму, вызываемую из функции USR. HL' = H'L' - апостроф(ы) указывает(ют), что регистры H и L находятся в наборе, альтернативном тому, что установлен при выполнении RET в Basic.



А это как? Только одну половину регистра? Что, так можно?:v2_dizzy_no:

Формально можно.
EXX
LD H,n
EXX
L' не испортится.
Но это уже словоблудие. Надо, чтобы в паре (то есть, в обоих регистрах) было так важное Бэйсику значение.

VNN_KCS
06.04.2011, 10:40
Но это уже словоблудие
Дык и я об этом. Зачем заморачиваться если можно гораздо проще?