PDA

Просмотр полной версии : Режим совместимости БК-0011М с БК-0010



Oleg N. Cher
29.11.2021, 02:20
Подскажите, плз, как правильно инициализировать БК-0011М, чтобы он работал подобно БК-0010?

Нужно:

1. Пользовательская программа с 01000 по 037777
2. Экран с 040000

Мой текущий инициализатор выглядит вот так, но похоже, что он кривой (глючит):


void Init (void)
{
asm("\
CMPB @$0177717, $0200 \n\
BEQ L0010 \n\
MOV $0152112, @$030 \n\
EMT 0 \n\
MOV $5, R0 \n\
EMT 012 // Scr 40000 \n\
CLR R0 \n\
EMT 056 // Buf 0 r/w \n\
MOV $0140000, @$4 \n\
L0010:"
);
} // Init

Глюк похож на криво сработавшее прерывание - работа программы завершается аварийно. А вот если Init не вызывать, то в режиме БК-0011 программа отрабатывает нормально. Да, прога не юзает EMT, кроме тех, что в Init.

В режиме БК-0010 прога тоже работает правильно.

76524

grf
29.11.2021, 03:51
Если прога не юзает ЕМТ, то проще включить страницу экрана и установить стек:

mov #16000,@#177716
mov #1000,sp

Но если хотя бы клавишу нажать надо, то еще надо переписывать векторы прерываний 60, 274, 4 на себя, иначе они вызовут монитор 11М.

Oleg N. Cher
29.11.2021, 13:24
А можно чуть подробнее про переустановку векторов? Кстати, а зачем устанавливать стек? Разве прога не может работать со стеком, который есть на момент её вызова? Так, к тому же, в монитор выходить проще (просто RST PC в конце программы).

Меня как бы не ломает, если они чего-то там вызовут, если оно не сломает работу кода. А клавиши опрашивать будет нужно. Но я об этом пока ничего не знаю. Думал делать опрос через системные переменные.

grf
29.11.2021, 13:34
А можно чуть подробнее про переустановку векторов?

Векторы прерываний от клавиатуры, по СТОП и от таймера на 11М ведут в монитор 11М, а на БК0010 - в монитор БК0010. Монитор 11М находится с адреса 140000, а десяточный - с адреса 100000. Так что если векторы не переустановить, то при нажатии клавиши вызовется кусок монитора 11М, который может переключить страницы, экран, прописать какие-нибудь системные переменные и т.д. К чему это приведет - не знаю, не пользовался монитором 11М )) Но явно программа не получит код клавиши в системных переменных БК0010, потому как они не совпадают у 10 и 11М




Кстати, а зачем устанавливать стек? Разве прога не может работать со стеком, который есть на момент её вызова? Так, к тому же, в монитор выходить проще (просто RST PC в конце программы).


Может конечно, но при старте 11М вроде бы устанавливает стек на 2000, а БК0010 - на 1000



Меня как бы не ломает, если они чего-то там вызовут, если оно не сломает работу кода. А клавиши опрашивать будет нужно. Но я об этом пока ничего не знаю. Думал делать опрос через системные переменные.

Проще код клавиши тогда в регистре 177662 смотреть или просто переписать прерывание на себя, где помещать код из этого регистра в свою переменную.

Oleg N. Cher
29.11.2021, 14:36
Может конечно, но при старте 11М вроде бы устанавливает стек на 2000, а БК0010 - на 1000Уууу, теперь я понимаю почему под 11М прога работает столь нестабильно. Получается, что нет возможности загрузить прогу размером в пару Кб штатными средствами с адреса 01000, раз стек идёт с 02000. Т.е. можно, но ещё до запуска прога будет испорчена тем, что стек установлен в её тело. Что с этим можно сделать? Нужно делать загрузчик, который переустановит стек ниже, а потом загрузит прогу?

Есть ли вообще смысл придерживаться идеи, чтобы одна прога работала и на БК-0010, и на БК-0011М? Или лучше сразу сделать две версии?

Ткните в маны, где освещена именно эта тема страниц и векторов 11М. "Руководство системного программиста 11М" уже читал, но оно слишком непонятное для новичка.

- - - Добавлено - - -

Есть ли смысл выходить из проги обратно в монитор 11М? Или для БК-шников, как и для спектрумистов, характерно выходить из игр по Reset?

grf
29.11.2021, 14:53
Уууу, теперь я понимаю почему под 11М прога работает столь нестабильно. Получается, что нет возможности загрузить прогу размером в пару Кб штатными средствами с адреса 01000, раз стек идёт с 02000. Т.е. можно, но ещё до запуска прога будет испорчена тем, что стек установлен в её тело. Что с этим можно сделать? Нужно делать загрузчик, который переустановит стек ниже, а потом загрузит прогу?


Ну если прога в пару Кб, то можно ее и с 2000 загрузить :)



Есть ли вообще смысл придерживаться идеи, чтобы одна прога работала и на БК-0010, и на БК-0011М? Или лучше сразу сделать две версии?


На 11М из голого монитора никто программы не грузит, все грузят из какой-либо ДОС - Andos, MKDos, CsiDOS. А там везде есть возможность запуска программ от 10-ки. Так что, если прога написана под 10, то она итак будет работать на 11М ))



Ткните в маны, где освещена именно эта тема страниц и векторов 11М. "Руководство системного программиста 11М" уже читал, но оно слишком непонятное для новичка.


Там и есть:
Векторы (http://gid.pdp-11.ru/books/00015-01.32.01.html#_ref_p14)
Страницы (http://gid.pdp-11.ru/books/00015-01.32.01.html#_ref_p1262)



Есть ли смысл выходить из проги обратно в монитор 11М? Или для БК-шников, как и для спектрумистов, характерно выходить из игр по Reset?

Есть конечно, чтобы вернуться в оболочку запуска. Только тогда уж не прямо в монитор 11М надо (все сбросится), а туда откуда вызвали.

gid
29.11.2021, 14:55
Получается, что нет возможности загрузить прогу размером в пару Кб штатными средствами с адреса 01000
Есть. Надо перед загрузкой теми же штатными средствами не забыть установить стек как нужно.
в мониторе набираем R6/ (появится старое значение) 1000<Ввод> и затем загружаем прогу.

Есть ли вообще смысл придерживаться идеи, чтобы одна прога работала и на БК-0010, и на БК-0011М?
Чтобы прога работала и на БК10 и на БК11(М), она должна быть полностью автономной, не пользоваться вызовами из ПЗУ, либо определять тип машины и пользоваться при необходимости вызовами именно того типа машины, на которой запущена. И должна полностью все векторы обрабатывать сама. Как правило, так сделано в играх, где нужно быстродействие.
Если пытаться писать универсальную прогу, но непременно пользоваться системными вызовами (в том числе и векторами клавиатуры), то в конце концов так и получится две версии в одном.

Есть ли смысл выходить из проги обратно в монитор 11М?
Это считалось правилом хорошего тона. Но выход в монитор делался не по rts pc из стека, а просто jmp @#100000 на БК10, или jmp @#140000 на БК11, т.к. прога всегда сама инициализировала стек и плевать ей было на то, что там кто насохранял до неё.

Oleg N. Cher
29.11.2021, 15:18
Ну если прога в пару Кб, то можно ее и с 2000 загрузить :)Вообще да, но я так сказал наобум - а вообще для моей задумки, боюсь, и 16 Кб не хватит...


На 11М из голого монитора никто программы не грузит, все грузят из какой-либо ДОС - Andos, MKDos, CsiDOS. А там везде есть возможность запуска программ от 10-ки. Так что, если прога написана под 10, то она итак будет работать на 11М ))Я запускаю прогу в эмуле GID-BK командой BK.exe /B myprog.bin
Что делает эмуль. Он (в режиме 11М) загружает Бейсик, вводит команду MON, выходит в монитор, а там набирает команду L и загружает образ ленты в формате bin, и сам его запускает. Таким способом, насколько я понимаю, загружать прогу с 01000 не получится. А нам нужен максимальный объём памяти, который будет работать и в 0010, и в 0011М.


Есть конечно, чтобы вернуться в оболочку запуска. Только тогда уж не прямо в монитор 11М надо (все сбросится), а туда откуда вызвали.Т.е. по RST PC, пользуясь адресом на стеке? :)


Чтобы прога работала и на БК10 и на БК11(М), она должна быть полностью автономной, не пользоваться вызовами из ПЗУ, либо определять тип машины и пользоваться при необходимости вызовами именно того типа машины, на которой запущена.Так и собираюсь поступить.

Кстати, есть ли возможность программно определить - у нас БК-0011 или БК-0011М?

С другой стороны, мне посоветовали забить на БК-0011 вообще.


Это считалось правилом хорошего тона. Но выход в монитор делался не по rts pc из стека, а просто jmp @#100000 на БК10, или jmp @#140000 на БК11, т.к. прога всегда сама инициализировала стек и плевать ей было на то, что там кто насохранял до неё.Ну тогда цитирую Вас: "Только тогда уж не прямо в монитор 11М надо (все сбросится), а туда откуда вызвали."

То есть, если сделать jmp @#100000 на БК10, или jmp @#140000 на БК11 (а что надо сделать на БК11М?), то всё сбросится.

Получается, что и по RST PC плохо выходить, и стек вызывающей проги юзать плохо, и выходить прямо в монитор плохо, потому что всё сбросится. Я запутался :)

Sandro
29.11.2021, 15:58
Может конечно, но при старте 11М вроде бы устанавливает стек на 2000, а БК0010 - на 1000


Не сбивай людей с толку ;)
Монитор 11М вообще ставит стек на 44000. В своей 7 странице. А пользовательский стек он ставит, как и принято, на 1000. Грузить пользовательскую программу можно любой длины вплоть до адреса 140000. См. мою адаптацию УКНЦшного порта Desolate на БК. Она занимает адреса до 125450. Когда я отлаживался, то грузил именно как .bin в Монитор. Командой L.

Тут грабля в другом: сразу после старта машины назначение страниц одно (5000->177716), а если, например, вернуться из Бейсика, то другое. И это надо отслеживать особо, поскольку регистр переключения страниц прочитать нельзя.

Да, Desolate как раз вообще не пользуется Монитором, всё своё. И первая же команда -- MTPS #340, чтобы не возиться с прерываниями, этой игре они не нужны.

А так, нужно поставить вектора 4, 60, 274, если нужен таймер -- то ещё и 100. Это всё.

- - - Добавлено - - -



То есть, если сделать jmp @#100000 на БК10, или jmp @#140000 на БК11 (а что надо сделать на БК11М?), то всё сбросится.


На 11М тоже 140000. Но если в машине стоит СМК, то у него другой адрес старта. Поэтому совсем правильно так:



mov @#177716, r0
clrb r0
jmp @r0


Кстати, именно поэтому проверять на тип машины командой CMPB @#177717, #200 неправильно. На машине с СМК это может, в зависимости от режима, привести к идентификации машины как БК-0011М.

Более правильно попробовать записать в @#177662. На БК-0010 это trap to 4, на 11М -- управление экраном и таймером. Но это тоже ненадежно. Я бы, наверное, проверял через переключение страниц памяти. Если переключаются -- то это 11М.



Получается, что и по RST PC плохо выходить, и стек вызывающей проги юзать плохо, и выходить прямо в монитор плохо, потому что всё сбросится. Я запутался :)


Если ты полез сам рулить машиной (не через EMT), то Монитор больше не знает её состояние. Поэтому попытка выхода в него может закончится чем угодно. В этом случае надо сбрасывать таким куском когда, который я привёл.

А если ты законопослушный гражданин, стек и прерывания не переставляешь, работаешь с машиной только через EMT, то RTS PC

Oleg N. Cher
29.11.2021, 19:20
Если кто-то желает мне помочь кодом, то добро пожаловать.
Резюмируем задачу. Чтобы пользоваться EMT'ами - нам нужно точно знать какая у нас машинка.

Итак, нужен код для:

1. Инициализации (установка экрана в 040000 на БК-0011/11М, запрет векторов, установка нужных страниц. На БК-0010 ничего не делать). Кстати, если при запрещённых векторах можно каким-то образом опрашивать клаву, то это отлично.

2. Запрет кнопки Сбр (насколько я понимаю - это хороший тон, чтобы её нажатие не приводило к аварийному выходу, а вызывало интеллигентный холодный рестарт программы (или хотя бы корректный выход туда, откуда вызывали - в монитор или в ОС). Что-то там ещё про запрет рулонного скроллинга и другие подготовительные операции. Это то, в чём мне разобраться без вашей помощи очень тяжело.

3. Адреса 01000..037777 освободим для пользовательской программы, держа в уме её рабочесть на всех моделях БК.

4. Выход в вызывающую среду. Стек трогать не будем, пусть остаётся ниже 01000 там, где его установила вызывающая прога. Если мы что-то повредили, из-за чего монитор будет некорректно работать, восстановить.

Можно ли пользоваться EMT'ами? Конечно, никаких препятствий для этого нет, кроме того, что вызовы EMT на всех моделях БК различны. Поэтому предлагаю если пользоваться ими, то делать это надёжно, с точным знанием на какой модели мы сейчас работаем.

5. Ну и надёжный способ определения какая у нас модель БК. Если на 11 (без М) можно забить, то давайте забьём. Я вообще узнал про столь кардинальные различия между 11 и 11М с большим удивлением - раньше думал, что они совместимы.

С векторами, насколько я понял, можно организовать фоновый буферизованный опрос клавы? Я ещё думаю, понадобится ли он мне, но, скорее всего, нет. Так что если можно без векторов, обойдёмся без них.

Чтобы с чего-то начать, наводящий вопрос: что делает mov #16000,@#177716 ?

Кстати, решение этой задачки в коде позволит нам иметь заготовку для программирования под БК-0010, 0011 и 11М на Си (GCC) и Обероне. Всё, что нам удастся сделать, будет выложено на гитхабе (https://github.com/Oleg-N-Cher/Pdp11Dev) для общего доступа.

MM
29.11.2021, 21:31
различия между 11 и 11М
Различия железа косметические - набор ПЗУ от 11М пойдет и на БК11 без "М". Кроме номера экрана и бита запрета кнопки Стоп - грамотные господа, уточните пожалуйста.
*
Почему так вышло ?
Потому как 11 без "М" делалась как расширение БК0010, с его ЕМТ16 и др. наследством. Но нормального сбыта не получила, т.к. тогда ( 1988 - 1989 г. ) еще небыло "эффективных менеджеров" ( по Русски - барыг ), которые бы окучили бы каждые "Радиотовары", хотя бы в Москве.
А потом, с моим приходом в 1988 г. в ОКБ Э., вдруг внезапно руководство поняло, что БК0010 - отстой, надо равняться на ДВК и в частности КЦГД/КСМ с его ESC последовательностями, и нормализовать таки клаву по образцу и подобию УКНЦ ( МС7008 ) - чем и пришлось заниматься, или скорее помогать процессу.

Как отличать 10/11 - по чтению РНП, 100ххх - 10, 140ххх - 11, хххххх - загадочная хрень ( ДВК ? ).
Как отличить 11 от 11М - по к/с ПЗУ на 140000 адресе, или его фрагменту.

Oleg N. Cher
29.11.2021, 23:41
С вот таким инициализатором работает БК10 и 11, а 11М всё равно вылетает. Что здесь неправильно? В монитор не выхожу (вообще никуда не выхожу, зацикливаю прогу в конце).


void Basic_Init (void)
{
asm("\
CMPB @$0177717, $0200 \n\
BEQ L0010 \n\
MTPS $0340 \n\
MOV $016000, @$0177716 \n\
L0010:"
);
} // Basic_Init

P.S. Да, CMPB @#177717, #200 это конечно плохой способ проверить наличие 11М (срабатывает и для 11), но пока вчерновую проверяю хотя бы на наличие БК10. Здесь в теме уже было сказано много полезного теоретического материала, но я очень с трудом понимаю как это реализовать в коде. Даже непонятно как работает команда MTPS #340 (пока предположу, что она запрещает все прерывания). Но тогда почему прога подвисает и не выполняется до конца на БК11М?

76555

Sandro
30.11.2021, 02:25
Вообще-то в таких случаях принято прикладывать исходники. Никто не будет возиться с дизассемблированием, чтобы понять, что это такое.

А так -- у меня в эмуляторе оно работает. Что в режиме 0010, что 11М показывает червового туза и зацикливается.

Да, MTPS #340 запрещает прерывания. Для опроса клавиатуры прерывания не обязательны.

Maxvel
30.11.2021, 03:05
Для проверки 11 или 10 нужно CMPB #300,@#177716
Ну и я бы сделал вот так



Программа инициализации и распознания БК
MOV #1000,SP ;Устанавливаем границу стека
MOV @#4,-(SP) ;Заносим содержимое вектора 4 она нам понадобится
RES ;Блокируем клавиатуру - можно и по другому через регистр 177660
CMPB #300,@#177717 ;Проверяем какая машина 10 или 11х
BNE BK10 ;Если 10 то переходим к 10ке
MOV #16000,@#177716 ;Устанавливаем страници 5:7
MOV #40000,@#177662 ;Включаем палитру БК0010
CMP @#140454,#140502 ;Проверяем а вдруг не БК11м
BEQ BK11M ;Если 11м то идем туда
BR BK11 ;Ну а если не 11м то тогда точно 11 идем туда
BK10: MOV #EXIT,@#4 ;А вот и понадобился 4 вектор и он тут нам очень поможет
MOV @#100000,@#100000 ;Ну а теперь попытаемся чего нибудь записать если ПЗУ то нас выкенит по 4ому вектору и будет ясно что 10ка
BK SMK ;Запись в этот адрес все таки удалась значит это СМК64/512 и он отключил ПЗУ 10ки и с этим что то нужно делать
EXIT: MOV (SP)+,@#4 ;Возвращаем 4 вектор на место как и было
JMP @#START ;Запуск основного тела программы
bk11M: ...
... ;Здесь все то что не обходимо сделать для 11м и затем перейти на метку EXIT для востановления вектора 4
...
EXIT
BK11 ...
... ;То же самое что и чуть выше
...
EXIT
SMK: ...
... ;Тут мы выполняем действия связаные с СМК64/512 если все таки мы сюда попали.
...
EXIT
.END


Ну как то так

grf
30.11.2021, 07:19
Не сбивай людей с толку ;)
Монитор 11М вообще ставит стек на 44000. В своей 7 странице. А пользовательский стек он ставит, как и принято, на 1000.


Инфа из телеграм-канала "БК0010/11М World":
Раз (https://pic.maxiol.com/?v=1638245869.1545979971.stack.png&dp=2)
Два (https://pic.maxiol.com/?v=1638245725.1545979971.image2021080210422.png&dp=2)

Sandro
30.11.2021, 11:06
Инфа из телеграм-канала "БК0010/11М World":
Раз (https://pic.maxiol.com/?v=1638245869.1545979971.stack.png&dp=2)
Два (https://pic.maxiol.com/?v=1638245725.1545979971.image2021080210422.png&dp=2)

А если БЕЗ МСТД?
Инфа только что (с эмулятора, но какая разница?):

https://pic.maxiol.com/?v=1638259227.1406987928.bk11mstackatstart.png&dp=2

1000, как и должно быть.

- - - Добавлено - - -


Для проверки 11 или 10 нужно CMPB #300,@#177716
Ну и я бы сделал вот так


При 11М с воткнутым СМК оно скажет, что это десятка. СМК подменяет адрес начального пуска, сто раз обсуждалось уже. Там будет не 300, а 370 или что-то около того

Oleg N. Cher
30.11.2021, 11:36
Вообще-то в таких случаях принято прикладывать исходники. Никто не будет возиться с дизассемблированием, чтобы понять, что это такое.Я бы приложил и это вообще не проблема, но в них вряд ли кто-то разберётся. И вряд ли кто-то захочет. К тому же, исходники частично на Обероне. И юзают библиотеки. В общем, там сложновасто.

Но что я счёл нужным дать - то дал. Процедуру инициализации. Вот она-то самая ключевая. Остальной код просто работает с экраном, не вызывая никаких EMT и не юзая ячеек-регистров.


Что в режиме 0010, что 11М показывает червового туза и зацикливается.

В эмуле GID'а в режиме "БК-0011М + МСТД" баг выглядит так:

http://i.piccy_.info/i9/6593755266bc881f3b35d16cfa8eaa39/1638260906/51062/1320134/BK11M.png
Иногда не рисуется масть, только голая рамка карты.

- - - Добавлено - - -

Но ведь не глюк эмуля это?

76557

gid
30.11.2021, 12:20
Но ведь не глюк эмуля это?
Не глюк. Фича.
Мне никогда не приходило в голову загружать программы из монитора БК11М и я даже не обращал на это внимание никогда. Но действительно в конфигурации БК11М стек инициализируется числом 2000, не зависимо, есть блок МСТД или нету. ЕСЛИ выйти из бейсика в монитор.
Но если как Sandro, не дать запуститься бейсику, то стек будет инициализирован числом 01000.
Команда запуска G в стек ничего не помещает, т.е. на начале программы по адресу 1000, значение SP==02000. Это можно увидеть просто поставив в эмуляторе точку останова.
Поэтому проблема решается тремя способами:
1. загружать .bin файл вручную, как сделал я, но перед запуском вручную же инициализировать стек нужным числом.
2. подредактировать файл скрипта загрузки .bin файла bk11m_load.bkscript, просто добавить туда одну строку:


|#MO
|#|0|1L|2
R6/1000
G

3. В своей программе, самым первым делом писать команду mov #1000,SP.

Кстати, тест 02 и тест 03 вполне работают на БК11М.

Sandro
30.11.2021, 12:24
Я бы приложил и это вообще не проблема, но в них вряд ли кто-то разберётся. И вряд ли кто-то захочет. К тому же, исходники частично на Обероне. И юзают библиотеки. В общем, там сложновасто.


В бинарнике, значит, разобраться проще, да?
Я умываю руки. Не собираюсь заниматься декомпиляцией и анализом кода.



Но что я счёл нужным дать - то дал. Процедуру инициализации. Вот она-то самая ключевая. Остальной код просто работает с экраном, не вызывая никаких EMT и не юзая ячеек-регистров.


При сообщении об ошибке нужно давать ВСЮ информацию, а не только то, что считаешь нужным. Вообще всю, включая действия перед проявлением ошибки. Могу только предполагать, что сначала действительно был запущен Бейсик, а уже потом был выход в Монитор и программа была запущена оттуда.
Никогда нельзя так делать. После Бейсика машина находится в крайне левом состоянии, включая, действительно, стек на 2000, произвольную карту памяти и прочие приколы.

PS: И не надо думать, что Оберон -- это тайна за семью печатями. Я, например, его знаю. Просто не использую. Все мои задачи гораздо лучше решаются на других языках.

Oleg N. Cher
30.11.2021, 12:42
Ну смотрите. Мне надо тогда выкладывать среду разработки, включая все скрипты сборки библиотек и прочего. Оно всё сырое и даже пока не закоммичено в Pdp11Dev. Кроме того, опыт показывает, что в этом разбираться никто не будет.

Так что тут дело далеко не в Обероне, а в тонкостях его трансляции в Си и увязки с утилитами GNU.

Что касаемо запуска монитора из-под Васика - так это эмуль так делает.

- - - Добавлено - - -


В своей программе, самым первым делом писать команду mov #1000,SP.Я, знаете, чего не пойму? Как происходит загрузка кода с адреса 01000, если стек стоит на 02000. Ведь тут-то должно всё закрэшиться. Но хорошо. Допустим, монитор использует свой собственный стек, но когда он запускает пользовательскую программу после её загрузки, то он переключается на стек 02000 и делает, к примеру, JSR PC, 01000 - соответственно, слово по адресу 02000-2 будет испорчено адресом возврата. Ведь куда-то мы возвращаемся, когда делаем RST PC. Так что mov #1000,SP тут не поможет. Пока только предполагаю и удивляюсь, что Вы так уверенно это советуете.

Maxvel
30.11.2021, 12:55
А если БЕЗ МСТД?
Инфа только что (с эмулятора, но какая разница?):

https://pic.maxiol.com/?v=1638259227.1406987928.bk11mstackatstart.png&dp=2

1000, как и должно быть.

- - - Добавлено - - -



При 11М с воткнутым СМК оно скажет, что это десятка. СМК подменяет адрес начального пуска, сто раз обсуждалось уже. Там будет не 300, а 370 или что-то около того

СМК на это значения не влияет хоть на 11м хоть на 10ку. Для проверки на наличие СМК используются другие ячейки, если мне память не изменяет то это адрес 167776 и дольжно быть значения 177605.

Oleg N. Cher
30.11.2021, 13:06
2. подредактировать файл скрипта загрузки .bin файла bk11m_load.bkscript, просто добавить туда одну строку:


|#MO
|#|0|1L|2
R6/1000
G
Вот это решение на первый взгляд помогло, поясню его сам для себя: L загружает код с 01000, монитор на своём стеке, соответственно, он внесёт 01000 в SP _до_ того, как переключится на стек 02000 от Васика. Да, так работает.

Кстати, спасибо за хороший эмуль и за автозапуск .bin - для разработки это полезная штука. А мало какие эмули БК так умеют.

Sandro
30.11.2021, 13:50
Ну смотрите. Мне надо тогда выкладывать среду разработки, включая все скрипты сборки библиотек и прочего. Оно всё сырое и даже пока не закоммичено в Pdp11Dev. Кроме того, опыт показывает, что в этом разбираться никто не будет.


Были запрошены исходники. Только исходники. Никто не просил среду разработки.



Что касаемо запуска монитора из-под Васика - так это эмуль так делает.


Это пользователь так делает. Если при старте машины зажать пробел, то никакого бейсика не будет, и загрузки с дисков тоже не будет, будет принудительный выход в Монитор. Ну почему никто не читает документацию? :(



Допустим, монитор использует свой собственный стек, но когда он запускает пользовательскую программу после её загрузки, то он переключается на стек 02000 и делает, к примеру, JSR PC, 01000 - соответственно, слово по адресу 02000-2 будет испорчено адресом возврата.

Если стек на 2000 -- то так и будет. Но при холодном запуске он должен быть на 1000. Если эмулятор при холодном запуске зачем-то ставит его на 2000 -- то это ошибка в эмуляторе.

gid
30.11.2021, 14:00
Как происходит загрузка кода с адреса 01000, если стек стоит на 02000.
В БОС БК11 есть как бы "Kernel mode" это монитор, в котором свой стек, своё окружение, и во время загрузки программы стек находится в 7-й странице, которая подключена в окно 0, а программа пользователя работает в как бы "User mode", параметры и окружение которого можно менять в мониторе.

Так что mov #1000,SP тут не поможет.
Точно, не поможет. Тут я ошибся. Заглянул в код ПЗУ и уточнил момент, как делается передача управления программе по команде "G".
Там сперва инициализируются регистры, в том числе устанавливается стек, затем в стек помещается PSW режима пользователя, и адрес перехода, т.е. портится код программы, а потом делается команда RTT. Так что да, лишь первые два пункта верны.

Пока только предполагаю и удивляюсь, что Вы так уверенно это советуете.
Поточу что я часто советую не подумавши, а потом начинаю думать и проверять, чего я там насоветовал. Ибо на проверки иногда уходит много времени, а глупость ляпнуть - быстро и просто.

Oleg N. Cher
30.11.2021, 14:26
Нет, на самом деле даже mov #1000,SP способно минимизировать потери при порче программы. Можно было бы даже предусмотреть "пустое пространство" в несколько слов ниже адреса 02000, но наверное всё-таки это проблема вызывающей стороны, а не самой проги.

Sandro, пока в распространении исходников нет необходимости. Я же сказал, что там идёт работа только с экранной памятью и никаких системных вызовов. К тому же, не каждый кинется разбирать чужие исходники. Если Вам интересно взглянуть чего я там такого ваяю - то в этом нет никакого секрета, всё будет доступно.

Тэкс. Эта проблема решена. Дальше нужен будет опрос клавиатуры, тоже универсальным способом (для всех моделей БК). Желательно без установок векторов. Я старый спектрумист, там векторов нет, я не понимаю как ими пользоваться)

gid
30.11.2021, 15:22
но наверное всё-таки это проблема вызывающей стороны
Это проблема именно эмулятора, и не надо подстраиваться под него. Не то, что стек ставится на 2000, его бейсик так устанавливает, а то, что при загрузке бин файла скриптом сперва запускается бейсик. Потому что движок скрипта эмулирует передачу символов через прерывание, а холодный старт, о котором говорит Sandro, это когда нажать пробел нужно, чтобы не попадать в бейсик, отлавливается по флагу нажатия на клавишу в 177716, эту фичу скрипт не умеет. Потому и вся эта котовасия и заварилась.

reddie
30.11.2021, 15:37
Дальше нужен будет опрос клавиатуры, тоже универсальным способом (для всех моделей БК). Желательно без установок векторов. Я старый спектрумист, там векторов нет, я не понимаю как ими пользоваться)
На БК опрос клавиатуры ещё проще, чем на Спектруме, если разобраться =) Не нужно кучу портов опрашивать и соответствие клавишам делать. Достаточно прочитать код клавиши, чем-то напоминает спектрумовское чтение ячейки 23560. Минус один: одновременно только одна кнопка, аналогично проверке через 23560.

grf
30.11.2021, 15:41
Тэкс. Эта проблема решена. Дальше нужен будет опрос клавиатуры, тоже универсальным способом (для всех моделей БК). Желательно без установок векторов. Я старый спектрумист, там векторов нет, я не понимаю как ими пользоваться)

Читать регистры, это будет работать везде :)

В регистре 177660 бит 7 (восьмеричное 200) сигнализирует о том, что в регистре 177662 появился код нажатой клавиши.
Регистр 177662 содержит код нажатой клавиши. После чтения из него сбратывается бит 7 в регистре 177662
Еще можно узнать о нажатии клавиши по биту 6 в регистре 177716 (1-отжата, 0- нажата)

Oleg N. Cher
30.11.2021, 15:51
Отлично. Спасибо за ценную инфу. И, насколько я понял, в БК нельзя опрашивать несколько клавиш, нажатых одновременно?

Что будем делать с кнопкой Сбр, вернее, с кнопкой Стоп? Как обычно она срабатывает в играх?

Теперь в свете вышесказанного про правильный детект модели БК. Нужна надёжная установка палитры на БК11 и 11М, но подпрограмма не должна делать ничего деструктивного на БК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)
);
}Зачем вообще детектить здесь модель? Экспериментально было выяснено, что засылка в регистр 177662 на БК10 приводит к сбою.

grf
30.11.2021, 16:12
Отлично. Спасибо за ценную инфу. И, насколько я понял, в БК нельзя опрашивать несколько клавиш, нажатых одновременно?


Стандартными средствами - нет.



Что будем делать с кнопкой Сбр, вернее, с кнопкой Стоп? Как обычно она срабатывает в играх?


Обычно она или заблокирована или вызывает рестарт игры. Если надо заблокировать - можно просто прописать вектор 4 на команду RTI

mov #stop,@#4
...
stop: rti

В БК11 и 11М есть специальная блокировка клавиши СТОП:

mov #10000,@#177716




Теперь в свете вышесказанного про правильный детект модели БК. Нужна надёжная установка палитры на БК11 и 11М, но подпрограмма не должна делать ничего деструктивного на БК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)
);
}Зачем вообще детектить здесь модель? Экспериментально было выяснено, что засылка в регистр 177662 на БК10 приводит к сбою.

Ну затем и детектить, что по записи в этом регистре переключение палитр на 11 и 11М.

mov #40000,@#177662 ;включение палитры БК0010

Oleg N. Cher
30.11.2021, 17:28
Не, нам палитра БК10 не нужна, ядовитый RGB это зло :) Кстати, палитры на 11-х просто атас. В плохом смысле. На УКНЦ сделано гораздо лучше.

Пользуясь советом уважаемого grf, наваял подпрограмму INKEY, но она не работает. Что здесь может быть не так?


signed char Basic_INKEY (void) {
asm("\
CLR R0 \n\
BITB $0200, @$0177660 \n\
BEQ $NOKEY \n\
MOVB @$0177662, R0 \n\
$NOKEY: \n"
);
} // Basic_INKEY

Hunta
30.11.2021, 17:41
CLR R0
10$:
TSTB @#177660
BPL 10$
BISB @#0177662, R0

Если, конечно, на БК CSR и буфер клавиатуры - это 177660 и 177662

Sandro
30.11.2021, 17:42
Обычно она или заблокирована или вызывает рестарт игры. Если надо заблокировать - можно просто прописать вектор 4 на команду RTI

mov #stop,@#4
...
stop: rti


Чуть поправлю; из-за особенностей микрокода ВМ1 при обработке именно немаскируемого прерывания туда попадёт PC+2, поэтому правильно так:



stop: sub #2, @sp
rti

Oleg N. Cher
30.11.2021, 17:50
Интересное решение. А что - разве надо проверять все биты регистра 177660 ? Вроде было бы сказано только про бит 7.

А почему здесь не MOVB, а BISB @#0177662, R0 ?

Да, INKEY не ждёт нажатия, если все кнопки отпущены, то она должна вернуть 0.

- - - Добавлено - - -


Чуть поправлю; из-за особенностей микрокода ВМ1 при обработке именно немаскируемого прерывания туда попадёт PC+2, поэтому правильно такОтлично. А такой перехват сработает и на 10, и на 11(M)?

- - - Добавлено - - -


CLR R0
10$:
TSTB @#177660
BPL 10$
BISB @#0177662, R0

Если, конечно, на БК CSR и буфе клавиатуры - это 177660 и 177662

Про CSR я не понял, но в режиме БК-0010-01 на эмуле GID'а этот код тоже не работает.

Хорошо. При каких условиях регистры 177660 и 177662 могут не работать?

gid
30.11.2021, 19:33
правильно так
Ещё более правильно так (но только для 1801ВМ1):


stop: sub (PC),(SP)
rti

и обычно этот код размещают по адресам 2 и 4, т.е. команда RTI одновременно является адресом вектора прерывания

код тоже не работает
Вообще-то это классический код, и он просто обязан работать. Но есть одна особенность, если старый код клавиши из 177662 не прочитан, то бит 7 вообще никогда не установится, поэтому нужно делать так:


tst @#177662 ;один раз в начале достаточно
10$:
tstb @#177660
bpl 10$
mov @#0177662, R0 ;пофиг, байтовая операция или словная, код всё равно 7-битный

Oleg N. Cher
30.11.2021, 19:58
Пока что добиться работы опроса клавиш не удалось. Код:


MODULE TestKeys; (*$MAIN*)
IMPORT b := Basic;
BEGIN
b.Init;
REPEAT UNTIL b.INKEY() # 0X;
END TestKeys.


;# GNU C17 (GCC) version 11.2.1 20211109 (pdp11-aout)
;# compiled by GNU C version 9.3-win32 20200320, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3, isl version none
;# GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
;# options passed: -mbm1 -msoft-float -O2 -Os -fomit-frame-pointer
.text
.even
.globl _main
_main:
;# TestKeys.c:14: {
jsr pc,___main ;#
;# TestKeys.c:19: Basic_Init();
jsr pc,_Basic_Init ;# Basic_Init
L_2:
;# TestKeys.c:21: } while (!(Basic_INKEY() != 0x00));
jsr pc,_Basic_INKEY ;# Basic_INKEY
;# TestKeys.c:21: } while (!(Basic_INKEY() != 0x00));
tstb r0 ;# tmp29
beq L_2 ;#
;# TestKeys.c:23: }
clr r0 ;#
rts pc


void Basic_Init (void)
{
asm("\
CMPB @$0177717, $0200 \n\
BEQ 10$ \n\
MTPS $0340 \n\
MOV $016000, @$0177716 \n\
10$: TSTB @$0177662 // A key \n\ <-- делаем "один раз в начале достаточно"
MOV $041000, _Basic_scradr"
);
} // Basic_Init

signed char Basic_INKEY (void) {
asm("\
CLR R0 \n\
TSTB @$0177660 \n\
BPL NOKEY$ \n\
MOVB @$0177662, R0 \n\
NOKEY$: \n"
);
} // Basic_INKEY

76560

Hunta
30.11.2021, 20:18
А может стоит для начала почитать про систему команд? Как говорится, RTFM, там всё есть. И желательно почитать DEC-овские оригиналы.

Oleg N. Cher
30.11.2021, 21:41
Это как понимать? RTFM? Читал уже в нужном для меня объёме. Но читать мало - мастерство приходит с опытом.
Или Вы намекаете на то, что я использовал неверные команды?

- - - Добавлено - - -

А DEC-овские оригиналы вообще никак не помогут для БК и УКНЦ. Не, если Вам надо делать PDP-11 на ПЛИС, то тут да. А я ставлю более простую цель.

Hunta
30.11.2021, 21:45
А DEC-овские оригиналы вообще никак не помогут для БК и УКНЦ
С учётом того, что плаванье в том, что делают команды, да, безусловно, не помогут никак.

Oleg N. Cher
30.11.2021, 22:00
В данном случае проблема не в командах. Кстати, я вообще не очень жаждал вникать в низкий уровень. Просто приходится делать то, чего не сделало ваше сообщество - разбираться в низком уровне. Где библиотеки подпрограмм для БК и УКНЦ? Есть что-то такое?

- - - Добавлено - - -

Hunta, понимаю желание меня потроллить - де-я ламер, а Вы крутой перец, но нет. Это контрпродуктивно и ведёт только к срачикам. Оно нам надо?

- - - Добавлено - - -

Я просто пытаюсь сделать подсистему, чтобы можно было написать прогу для БК/УКНЦ на простом паскалеподобном языке и собрать её одной кнопкой. Но количество проблем, которое для этого пришлось и приходится решать - оно вообще подымает барьер вхождения до небес.

Hunta
30.11.2021, 23:11
Кстати, я вообще не очень жаждал вникать в низкий уровень. Просто приходится делать то, чего не сделало ваше сообщество - разбираться в низком уровне. Где библиотеки подпрограмм для БК и УКНЦ? Есть что-то такое
О, знакомая песТня. Прощевайте, больше не потревожу.

Oleg N. Cher
01.12.2021, 00:13
И Вам не хворать. Не больно-то и хотелось выяснять у кого потолще... знания PDP-11.

С клавишми разобрался. Надо было запретить прерывания от клавиатуры командой MOVB $0100, @$0177660
Что же никто об этом не сказал? :)

- - - Добавлено - - -

Но, кстати, опрос клавиш работает только на БК10. Что надо подшаманить для 11(М) ?

grf
01.12.2021, 04:54
С клавишми разобрался. Надо было запретить прерывания от клавиатуры командой MOVB $0100, @$0177660
Что же никто об этом не сказал? :)
Но, кстати, опрос клавиш работает только на БК10. Что надо подшаманить для 11(М) ?

Ну, просто никто так не делает, вот и возникают непонятки. Если прерывание разрешено и программа обработки прерывания сама забирает код нажатой клавиши из регистра (первой, естественно, ведь она получает управление по прерыванию) то, само собой, основная программа уже не получит ни флагов ни кода. Тогда уже надо смотреть код клавиши в системных переменных, которые на БК10 и 11М вроде разные. Запрещать прерывание от клавы - зачем? Прерывание позволяет реагировать на все тогда, когда надо, занимаясь другими делами. Понятное дело, если идет какой-то критичный процесс, типа смены палитры на лету или запись на диск, тогда прерывание и длинный обработчик могут испортить всю малину. Куда проще сделать так, как я написал изначально:



mov #v60,@#60 ;переписать прерывание от клавы по вектору 60
mov #v274,@#274 ;вектор 274 (клавиши с АР2)
clr @#key ;начальный сброс буфера
.....
0: tst @#key ;цикл ожидания или просто проверка когда надо. Код клавиши тут появится сам.
beq 0
;делаем с кодом что надо и очищаем буфер
clr @#key
.....

v60: mov @#177662,@#key ;взять код клавиши
;можно и тут сразу обработать какие-то клавиши, которые должны прерывать исполнение программы
rti

v274: mov @#177662,@#key
bis #200,@#key
;можно и тут сразу обработать какие-то клавиши, которые должны прерывать исполнение программы
rti

key: .#0 ;код нажатой клавиши, если >200 то с АР2

reddie
01.12.2021, 07:50
Что же никто об этом не сказал?
Видимо, подразумевали, что вектора прерываний уже перехвачены =) выше grf уже расписал, если подробнее - на Спектруме клаву опрашивает процедура в составе ПЗУшного RST#38, а тут надо "перехватить" прерывание, записав адрес своей процедуры по адресу вектора. Можно опрашивать и по кадровому прерыванию, а ля Спектрум, но его нет на БК10. Можно просто воткнуть заглушку, если реакция на клаву не требуется, либо да, запретить прерывания через регистр. На БК специфичная система прерываний, после Спектрума к этому трудновато привыкать, но в ней есть и свои плюсы.

Oleg N. Cher
01.12.2021, 12:24
Куда проще сделать так, как я написал изначальноПока не попробовал, но сразу вопрос: а как правильно восстанавливать векторы 60 и 274 перед выходом из программы? У них есть какие-то стандартные адреса или лучше будет запомнить те, что были записаны в них на момент установки наших векторов? *Нужно, чтобы работало на БК10/11(М).

grf
01.12.2021, 12:41
Пока не попробовал, но сразу вопрос: а как правильно восстанавливать векторы 60 и 274 перед выходом из программы? У них есть какие-то стандартные адреса или лучше будет запомнить те, что были записаны в них на момент установки наших векторов? *Нужно, чтобы работало на БК10/11(М).

Изначально прерывания от клавы обрабатывает монитор 10/11/11М - ведь должна же машина как-то на клавиши реагировать. Если просто запомнить какие были - можно восстановить при выходе.

gid
01.12.2021, 16:48
а как правильно восстанавливать векторы 60 и 274 перед выходом из программы?
А зачем? jmp @#100000 на БК10, или на БК11(М) из под всяких андос мкдос (что равнозначно работе на БК10), или jmp @#140000 на голой БК11(М) и всё само восстановится как надо.
На БК ведь нет многозадачной ОС, чтобы заботиться о сохранности векторов.

Manwe
03.12.2021, 16:55
Я просто в начале своих программ сохраняю все системные ячейки, которые собираюсь изменять. А при выходе восстанавливаю.

- - - Добавлено - - -


Пока что добиться работы опроса клавиш не удалось.Статья про то как правильно сделать опрос клавиатуры и джойстика одновременно: https://manwe.pdp-11.ru/?/programming/joystick

Oleg N. Cher
05.12.2021, 01:40
Издревле повелось гарантированно различать БК10 и БК11, тем, что на БК10 регистр 177662 недоступен по записи.Кстати, а как это правильно сделать? При попытке записи в этот регистр БК10 вызывает какое-то аццкое прерывание?

Sandro
05.12.2021, 02:07
Кстати, а как это правильно сделать? При попытке записи в этот регистр БК10 вызывает какое-то аццкое прерывание?

Примерно так. На 0010 при попытке записи туда возникает ошибка шины, что приводит к прерыванию по 4 вектору.



clr @#is11m
mov @#4, @#save4
mov r6, @#savesp
mov #restor, @#4
clr @177662
mov #1, @#is11m
restor:
mov (r7)+, r6
savesp:
.word 1000
mov (r7)+, @(r7)+
save4:
.word 100000, 4
....
is11m:
.word 0


Признаю, код немного хулиганский, но жаль тратить память просто так. Её у нас немного.
Если неясно, я сохраняю указатель стека и предыдущее значение вектора 4 прямо в поле непосредственной константы команды mov, которая восстанавливает всё обратно.

Oleg N. Cher
05.12.2021, 02:38
Нормальный код, мы ПЗУ писать не собираемся.

Так я окончательно отказываюсь от CMPB @#177717, #200 ? Если нет других предложений.

Осталось ещё понять как отличить программно БК11 от 11М. Хотя пока вроде не нужно. Команда MOV #16000, @#177716 оказалась настолько мощной, что решила все проблемы совместимости (на нужном мне уровне) между 11 и 11М - потому что режим 11 работает (в эмуле GID'а) с экраном по адресу 40000, а в режиме 11М после запуска моего бинаря попытки записи в экран по этому адресу ни к чему не ведут - до волшебной команды. Спасибо!

gid
05.12.2021, 09:45
Нормальный код, мы ПЗУ писать не собираемся.
Почти нормальный. Что попало записывать на БК11М в 177662 не стоит, иначе можно попасть впросак. Вдруг разрешится прерывание по вектору 100, а оно ещё не инициализировано?
ещё можно сделать так, менее хулигански:

mov @#4, -(SP) ; сохраняем вектор 4 в стеке
mov #bk10, @#4 ; задаём свой
mov #40000, @#177662 ; устанавливаем палитру, состояние таймера 50Гц и отображаемый экран
; прерывания не произошло
mov (SP)+, @#4 ; восстанавливаем вектор 4
; тут код для БК11(M)
.....

bk10: ; произошло прерывание
tst (SP)+ ; адрес возврата из прерывания игнорируем
mtps (SP)+ ; восстанавливаем приоритет программы
mov (SP)+, @#4 ; восстанавливаем вектор 4
; тут код для БК10

Осталось ещё понять как отличить программно БК11 от 11М
По содержимому ПЗУ по адресам 140000-157777, берём любой понравившийся адрес, и смотрим в эмуляторе, какое значение там на БК11 и какое на БК11М, и по этому значению определяем тип машины.

Oleg N. Cher
17.12.2021, 03:06
Я наткнулся в журнале "Персональный компьютер БК-0010 - БК-0011м" на информацию, что на некоторых БК10 не было таймера. Вопрос к спецам: так ли это? Говорят даже, что игра King's Valley была завязана на таймере, поэтому музыка в ней работала не везде.

Если всё так, то как правильно отмерять отрезки времени и делать задержки на БК10-11(М) ? Чтобы работало универсальным способом, на всей линейке БК.

SuperMax
17.12.2021, 08:38
Я наткнулся в журнале "Персональный компьютер БК-0010 - БК-0011м" на информацию, что на некоторых БК10 не было таймера. Вопрос к спецам: так ли это? Говорят даже, что игра King's Valley была завязана на таймере, поэтому музыка в ней работала не везде.
неверно
таймер находится внутри процессора, но он был не всегда исправен
или глючил

соответственно я написал пару тестов таймера - быстрый tim74
и полный который стоит запустить на сутки tim791

Manwe
17.12.2021, 15:37
у меня в PONG Charged есть тест таймера – если таймер сломан, игра пишет об этом и предупреждает, что изображение будет мерцать. Исходники можно посмотреть здесь (https://www.pouet.net/prod.php?which=87745).

AFZ
17.12.2021, 18:38
таймер находится внутри процессора, но он был не всегда исправен
или глючилПоскольку таймер не заявлен в составе оборудования ВМ1, его не проверяли на заводе при тестировании процессоров и, соответственно, дефект таймера не служил основанием для выбраковки этого экземпляра ВМ1. Поэтому таймер у ВМ1 - как повезет...

Oleg N. Cher
18.12.2021, 05:40
Хорошо. Мы выяснили, что таймер на десятых Бэкашках не всегда функционировал. Как же отмерять время? Как, допустим, универсальным способом замерить 1/50 секунды без таймера? Есть ли такие наработки? В играх ведь как-то задержки делали даже без таймера? Задача, видимо, упрощается тем, что частота проца ВМ1 была одинаковой, т.е. процы работали с одной скоростью на всех десятых Бэкашках. Или это не так?

SuperMax
18.12.2021, 08:47
Хорошо. Мы выяснили, что таймер на десятых Бэкашках не всегда функционировал. Как же отмерять время?
надо просто заменить процессор на исправный
и если говорить о % неисправных таймеров, то это не более 1% от всего объема

Manwe
18.12.2021, 11:00
В играх ведь как-то задержки делали даже без таймера? Задача, видимо, упрощается тем, что частота проца ВМ1 была одинаковой, т.е. процы работали с одной скоростью на всех десятых Бэкашках. Или это не так?Всё так. Без таймера не получится точно отмерять время, но можно примерно. Для этого можно рассчитать оптимальное количество спрайтов на экране (допустим, 20 штук) и когда реально на экране их меньше (допустим, 7), запускать "фейковую" процедуру, которая будет симулировать вывод спрайта в какую-нибудь ненужную область памяти оставшееся число раз (13). Таким образом, время на отрисовку каждого кадра будет примерно одинаковым, независимо от того, сколько спрайтов выводится на экран.

Oleg N. Cher
19.12.2021, 09:25
А если нам нужно делать такую задержку, не завязанную на вывод графики, например, при опросе клавиатуры?

Допустимо ли написать подпрограмму, крутящую пустой цикл? И правильно ли будет, если я откалибрую её хотя бы примерно по скорости работы эмулятора? (всё равно живой БэКа у мну нет)

Но тут же всплывёт то, что БК11 имеет более высокую частоту? Ладно. Буду тогда использовать таймер, куда ж деваться.

reddie
19.12.2021, 11:30
всплывёт то, что БК11 имеет более высокую частоту?
На 11/11М есть кадровое прерывание в 50 (ну, 48.8) Герц, по которому можно откалибровать задержки. Хотя проблему с 10-кой это не решит.
В старых играх под 10-ку реально видно забивание на тайминги по моргающим спрайтам и прочим тонкостям, но тогда никто с этим не парился...

Sandro
19.12.2021, 11:54
Время работы пустого цикла через команду SOB хорошо известно. 20 циклов на БК-0010. Испольовать его для задержки -- типовое решение.

Manwe
19.12.2021, 12:03
В старых играх под 10-ку реально видно забивание на тайминги по моргающим спрайтам и прочим тонкостям, но тогда никто с этим не парился...Сейчас это уже решаемо: можно делать обновление экрана по внутреннему таймеру процессора, предварительно откалибровав ход луча, как в PONG Charged (https://www.pouet.net/prod.php?which=87745). Тогда на БК 0010 ничего не будет мерцать и обновление содержимого экрана будет идти через равные промежутки.