СМК на это значения не влияет хоть на 11м хоть на 10ку. Для проверки на наличие СМК используются другие ячейки, если мне память не изменяет то это адрес 167776 и дольжно быть значения 177605.
Вид для печати
Вот это решение на первый взгляд помогло, поясню его сам для себя: L загружает код с 01000, монитор на своём стеке, соответственно, он внесёт 01000 в SP _до_ того, как переключится на стек 02000 от Васика. Да, так работает.
Кстати, спасибо за хороший эмуль и за автозапуск .bin - для разработки это полезная штука. А мало какие эмули БК так умеют.
Были запрошены исходники. Только исходники. Никто не просил среду разработки.
Это пользователь так делает. Если при старте машины зажать пробел, то никакого бейсика не будет, и загрузки с дисков тоже не будет, будет принудительный выход в Монитор. Ну почему никто не читает документацию? :(
Если стек на 2000 -- то так и будет. Но при холодном запуске он должен быть на 1000. Если эмулятор при холодном запуске зачем-то ставит его на 2000 -- то это ошибка в эмуляторе.
В БОС БК11 есть как бы "Kernel mode" это монитор, в котором свой стек, своё окружение, и во время загрузки программы стек находится в 7-й странице, которая подключена в окно 0, а программа пользователя работает в как бы "User mode", параметры и окружение которого можно менять в мониторе.
Точно, не поможет. Тут я ошибся. Заглянул в код ПЗУ и уточнил момент, как делается передача управления программе по команде "G".
Там сперва инициализируются регистры, в том числе устанавливается стек, затем в стек помещается PSW режима пользователя, и адрес перехода, т.е. портится код программы, а потом делается команда RTT. Так что да, лишь первые два пункта верны.
Поточу что я часто советую не подумавши, а потом начинаю думать и проверять, чего я там насоветовал. Ибо на проверки иногда уходит много времени, а глупость ляпнуть - быстро и просто.
Нет, на самом деле даже mov #1000,SP способно минимизировать потери при порче программы. Можно было бы даже предусмотреть "пустое пространство" в несколько слов ниже адреса 02000, но наверное всё-таки это проблема вызывающей стороны, а не самой проги.
Sandro, пока в распространении исходников нет необходимости. Я же сказал, что там идёт работа только с экранной памятью и никаких системных вызовов. К тому же, не каждый кинется разбирать чужие исходники. Если Вам интересно взглянуть чего я там такого ваяю - то в этом нет никакого секрета, всё будет доступно.
Тэкс. Эта проблема решена. Дальше нужен будет опрос клавиатуры, тоже универсальным способом (для всех моделей БК). Желательно без установок векторов. Я старый спектрумист, там векторов нет, я не понимаю как ими пользоваться)
Это проблема именно эмулятора, и не надо подстраиваться под него. Не то, что стек ставится на 2000, его бейсик так устанавливает, а то, что при загрузке бин файла скриптом сперва запускается бейсик. Потому что движок скрипта эмулирует передачу символов через прерывание, а холодный старт, о котором говорит Sandro, это когда нажать пробел нужно, чтобы не попадать в бейсик, отлавливается по флагу нажатия на клавишу в 177716, эту фичу скрипт не умеет. Потому и вся эта котовасия и заварилась.
На БК опрос клавиатуры ещё проще, чем на Спектруме, если разобраться =) Не нужно кучу портов опрашивать и соответствие клавишам делать. Достаточно прочитать код клавиши, чем-то напоминает спектрумовское чтение ячейки 23560. Минус один: одновременно только одна кнопка, аналогично проверке через 23560.
Читать регистры, это будет работать везде :)
В регистре 177660 бит 7 (восьмеричное 200) сигнализирует о том, что в регистре 177662 появился код нажатой клавиши.
Регистр 177662 содержит код нажатой клавиши. После чтения из него сбратывается бит 7 в регистре 177662
Еще можно узнать о нажатии клавиши по биту 6 в регистре 177716 (1-отжата, 0- нажата)
Отлично. Спасибо за ценную инфу. И, насколько я понял, в БК нельзя опрашивать несколько клавиш, нажатых одновременно?
Что будем делать с кнопкой Сбр, вернее, с кнопкой Стоп? Как обычно она срабатывает в играх?
Теперь в свете вышесказанного про правильный детект модели БК. Нужна надёжная установка палитры на БК11 и 11М, но подпрограмма не должна делать ничего деструктивного на БК10. Пока код такой:
Зачем вообще детектить здесь модель? Экспериментально было выяснено, что засылка в регистр 177662 на БК10 приводит к сбою.Код:void PALETTE (int n)
{
asm("\
CMPB @$0177717, $0200 \n\
BEQ BK0010 \n\
MOV %0, R0 \n\
BIC $0177760, R0 \n\
SWAB R0 \n\
BIS $040000, R0 \n\
MOV R0, @$0177662 \n\
BK0010:"
::"g"(n)
);
}
Стандартными средствами - нет.
Обычно она или заблокирована или вызывает рестарт игры. Если надо заблокировать - можно просто прописать вектор 4 на команду RTI
mov #stop,@#4
...
stop: rti
В БК11 и 11М есть специальная блокировка клавиши СТОП:
mov #10000,@#177716
Ну затем и детектить, что по записи в этом регистре переключение палитр на 11 и 11М.
mov #40000,@#177662 ;включение палитры БК0010