А кто писал игры\системный софт для БК0010
как там были организованы прерывания\освежение экрана?
интересует как обычно синхронизировались игры для получения стабильной скорости?
Вид для печати
А кто писал игры\системный софт для БК0010
как там были организованы прерывания\освежение экрана?
интересует как обычно синхронизировались игры для получения стабильной скорости?
цитирую бкашного программера из ATLANTIS (PRS):
"вопрос, кст, дурацкий. никто не задумывался над синхронизацией скорости. какой проц, так и бегало. и причем тут вообще обновление экрана тоже не пойму. видимо чел далек от структуры БК."
Лично от меня - этот человек на форуме зарегиться не может, поэтому уточни вопрос, я его переспрошу.
Насколько я знаю, там есть таймер, не зависящий от скорости процессора -- порты 177706, 177710, 177712.
См. например http://pdp-11.ru/mybk/textbk/FL11M.TXT
Но для меня остаётся загадкой как можно узнать о начале/завершении обновления экрана -- подозреваю что никак.
---------- Post added at 14:45 ---------- Previous post was at 14:43 ----------
Да, коммент конечно крайне познавательный. И полный уважения к тому же.
Насколько я помню, в 0010 таймера не было, был лишь в 0011М, и экраны переключать можно было лишь в 0011М. Поэтому в играх было видно перерисовывание спрайтов. В последних программах для 11М графика уже была плавная, за счет нескольких видео буферов.
Задержки по времени делали через пустые циклы.
---------- Post added at 13:48 ---------- Previous post was at 13:48 ----------
Насколько я помню, в 0010 таймера не было, был лишь в 0011М, и экраны переключать можно было лишь в 0011М. Поэтому в играх было видно перерисовывание спрайтов. В последних программах для 11М графика уже была плавная, за счет нескольких видео буферов.
Задержки по времени делали через пустые циклы.
nzeemin, обидеть jerri я не хотел, если что, приношу свои извинения.
Естественно далек, все общение с БК ограничивалось играми в компьютерном клубе, хотя первая игрушка моя была именно на БК на бейсике написанная. ;)
вопрос стоит в чем: берем любую игру
если просто перерисовывать персонажей не забивая голову
синхронизацией скорости то скорость игры при наличии 1 персонажа и 10 персонажей на экране будет серьезно отличаться, что серьезно сказывается на играбельности
на Спеке в есть комманда HALT и маскируемое прерывание выполняемое с одной и той же частотой 50 раз в секунду
есть ли на БК0010 идентичные способы определения во времени? или у там нельзя определить что луч сейчас пошел на новый круг?
Вот тут статейка: http://bk0010.moy.su/publ/20-1-0-25 -- из которой можно предположить что таймер в БК-0010(01) был, но не был документирован, соответственно им и не пользовались. Может кто-либо подтведить/опровергнуть?
---------- Post added at 15:51 ---------- Previous post was at 15:48 ----------
Тогда по всей вероятности, таймер должен работать с разной частотой в БК-0010 и БК-0011 -- из-за разной частоты процессора (3 и 4 МГц)?
вобщем и целом понятно :( все делалось на глазок
Вот его ответ:
"он хочет сказать, что программно экран обновляется при каждом изменении изображения? экран тупо кусок памяти. соответственно все изменения делаются на нем в нужном месте путем занесения, стирания, ксоренья данных. синхронизацию с таймером можно зафигачить, но я не помню как это делается. а команда HALT на бк это остановка программы."
видимо действительно написание программ для БК настолько радикально отличается
да экран является просто куском памяти
да графика на экран наносится путем арифметических операций
вопрос был в чем:
как на БК решали проблему изменения скорости при изменении количества подвижных обьектов(стабилизация скорости в играх)
из того что посмотрел и из того что почерпнул из различных описаний
понимаю что НИКАК... работает и ладно :( ппц
На десятке - только при помощи таймера (который был недокументирован), к тому же там есть такое понятие, как "сломанный таймер". Что это означает не знаю даже я, хотя в моём эмуляторе тесты пишут, что "таймер - сломан". А что же означало "не сломанный таймер"?
была игра для Бк-0010, называлась King Valley вроде как от Shishkin Software и она юзала таймер для проигрывания музона, но из трех виденных мною бках она работала на одной только, пришлось писать утилиту которая заменяла адрес с которым пытается работать прога как с таймерным на вроде 177716 и в процессе игры шел шум и скрежет но она начинала играть, как мне сказали на некоторых бкашках таймер был, на некоторых не был.. так что для эмулей можно в качестве теста юзать кинг валлей игруху
На моём работает, с музыкой и скрежетом :)
Подразобрался немного. Таймер 50 Гц там есть, даёт прерывания по вектору 100, маскируется битом 14 порта 177662. Не знаю только как в точности оно расположено по времени относительно кадра. Весь кадр -- 312 строк, по 64 мкс на строку, итого 20 мс = 50 Гц.
Кроме того есть программируемый таймер на портах 177706, 177710, 177712. Наступление события проверяется чтением портов, прерывания нет.
Похоже, я нашёл этому подтверждение.
Цитата из Донского:
Считаем.Цитата:
Г. Работа с таймером
Подробное описние таймера (счетчика времени) БК с интересными
примерами приводится в [6] и [12]. Здесь лишь приведем простейший
пример работы с ним и порекомендуем читателю поэкспериментировать, так
как в БК разных заводов таймер может работать по-разному. Посмотрите,
что получится, если вместо &O160 записать 0, &O20, &O60, &O120 и как
зависит период Т от начального значения S0 (рис.10):
10 POKE &O177706,32767% 'установка длительности периода S0
20 POKE &O177712,&O160 'запуск таймера
30 ? AT(0,0)PEEK(&O177710) 'смотрим, как он работает
40 GOTO 30
Рис.10. Иллюстрация работы таймера.
Таймер работает независимо от работы программы. Содержимое счетчика
времени определяется как результат функции PEEK(&O177710) и
периодически уменьшается от S0 до 0 (рис.10).
В приведенном примере при S0=32767 период счетчика Т=89,657 с [6].
89,657 сек / 32767 = 2,7362 мс на тик таймера, с учётом делителей на 16 и 4 получаем 2736,2 / 16 / 4 = 42,75 мкс на наименьший тик таймера.
Частота процессора 3 МГц, это 0,333 мкс на такт, умножаем на 128, получаем 42,67 мкс -- довольно близко, можем считать что сходится.
Теперь смотрим тут: http://pdp-11.ru/mybk/textbk/FL11M.TXT
Цитата:
5. СИСТЕМНЫЙ ТАЙМЕР
ТАЙМЕР СОСТОИТ:
A. генератор с периодом 32 мкс (т.к. тактовая частота процессора
В. делители на 4 и 16 БК-11 и БК-11М составляет 4 MHz, а
C. реверсивный счетчик (177710) не 5 MHz, kak написано в литературе)
D. регистр установки (177706)
E. регистр команд и состояний (177712)
* ДЛЯ СПРАВКИ: тактовая частота, поступающая на процессор, делится на
128. , а потом поступает на таймер
В БК0010-01 таймер был недокументирован. В Армянских БК-шках он вообще не работал.
В БК0011М было прерывание по таймеру.
У меня есть подпрограмма синхронизации экрана с таймером БК-0010. Закончу игру - выложу исходники. Сможете взять оттуда.
Вложение 68354
Вложение 68355
Генератор случайных чисел спрашивали. Вот, например. Простой, короткий, быстрый, с хорошим разбросом.
Использование таймера закомментировано (символами "точка с запятой"), но кому надо - может раскомментировать. Единственное, между запуском таймера и началом работы генератора вставьте какую-то пользовательскую активность типа нажатия клавиш в меню и т.п., чтобы при каждом запуске получалось действительно случайно.
Первая картинка - код, вторая результат вывода на экран 16536 случайных слов:
Вложение 68360 Вложение 68361
Ну и, понятное дело, если в вашей программе много свободных регистров, то надобность в ячейках памяти RND1 и RND2 отпадает, всё можно хранить в регистрах R1 и R2. Такая процедура будет работать раза в два быстрее. Или в три.Код:; Random generator for BK-0010 (c) Manwe/SandS 2019
; Compile this source with PDPy11: https://github.com/imachug/PDPy11
; TIMER=177712 ; timer port address
; MOV #123,@#TIMER-4 ; timer initial value
; MOV #1,@#TIMER ; stop and init timer
; MOV #20,@#TIMER ; start timer
MOV #20000,R0 ; generate 20000 random numbers
MOV #40000,R3 ; screen address
1: CALL RND
MOV R1,(R3)+ ; put random number on the screen
SOB R0,1
HALT
RND: MOV RND1,R1
MOV RND2,R2
ROR R1
ROL R2
SWAB R2
; ADD @#TIMER-2,R2
XOR R2,R1
MOV R1,RND1
MOV R2,RND2
RET
RND1: .WORD 173451
RND2: .WORD 54102
.END
у меня такая - но игрушки все работали нормально, фотка платы тут,
машинка кстати живая тока клавиатура дребезг ужасен
Как будет выглядеть самый красивый PUSHA;POPA...
Несколько я уже видел... не впечатлили...
Первое предложение, которое пришло в голову:
Занимает больше, чем 5 push’ей или 5 pop’ов подряд. Так что практического смысла не имеет.Код:PUSHA: MOV R0,-(SP)
ADD #100,PUSHA
DEC #5
BPL PUSHA
POPA: MOV (SP)+,R5
DEC POPA
DEC #5
BPL POPA
А также эти процедуры одноразовые. Так как самомодифицируются. Стало быть, надо их выправлять перед началом.
А кто мешает? Добавляем модификаторы:
Получаем ещё более бесполезного монстра.Код:PUSHA: MOV #5,PUCN$
MOV (PC)+,(PC)
.WORD 10046
PUMD$: MOV R0,-(SP)
ADD #100,PUMD$
DEC (PC)+
PUCN$: .WORD 5
BPL PUMD$
POPA: MOV #5,POCN$
MOV (PC)+,(PC)
.WORD 12605
POMD$: MOV (SP)+,R5
DEC POMD$
DEC (PC)+
POCN$: .WORD 5
BPL POMD$
С моей точки зрения, ничего лучше, чем метод подсмотренный в ПЗУ БОС БК11М не придумать.
Код:;вызов так: JSR R5,PUSHA, сохраняем все регистры
;но через R5 нельзя передать параметр функции, чтобы было можно, есть более сложный метод
PUSHA: MOV R4,-(SP)
MOV R3,-(SP)
MOV R2,-(SP)
MOV R1,-(SP)
MOV R0,-(SP)
;MOV R5,-(SP) ;это - чтобы и в R5 можно было
;MOV 14(SP),R5 ;передавать параметры
;CALL @(SP)+
CALL (R5)
MOV (SP)+,R0
MOV (SP)+,R1
MOV (SP)+,R2
MOV (SP)+,R3
MOV (SP)+,R4
MOV (SP)+,R5
RETURN
;пример использования
SUBR: JSR R5,PUSHA ;сохраняем все регистры выполняем функцию
...
...
RETURN ;выход и восстановление всех регистров
Очевидно, практического смысла это не имеет. Только из любви к искусству :) Быстрее и короче написать пять раз MOV Rn,-(SP). А если такая процедура есть в ПЗУ, то ещё быстрее и короче обратиться к ней.
Я в другой теме как-то затупил... спрашивал, оказалось, что тот монстр был PUSHA...POPA.. но весьма навороченный и и порожденный ЯВУ.
Но натолкнуло на мысль, что можно сделать процедуру для этого...
- - - Добавлено - - -
Просто я наивно полагал, что на супер-пупер ортогональном процессоре. за многие годы сложились какие-то шаблоны программирования
Давно всё уже изобретено DEC и помещено в SYSLIB
Код:CALL $SAVAL
;;
$SAVAL::
MOV R4,-(SP) ;Save R4
MOV R3,-(SP) ;Save R3
MOV R2,-(SP) ;Save R2
MOV R1,-(SP) ;Save R1
MOV R0,-(SP) ;Save R0
MOV 12(SP),-(SP) ;Get the return address
MOV R5,14(SP) ;Save R5
CALL @(SP)+ ;Call the caller
MOV (SP)+,R0 ;Restore R0
MOV (SP)+,R1 ;and R1
MOV (SP)+,R2 ;and R2
MOV (SP)+,R3 ;and R3
MOV (SP)+,R4 ;and R4
MOV (SP)+,R5 ;and R5
RETURN
Из одной пАставки для этой п/п не требуется - мало того, что она практически во всех SYSLIB-ах, так ещё и ОЧЕНЬ древняя, не удивлюсь, если и в DOS/BATCH-11 найдётся.
Нужна именно SYSLIB.OBJ или SYSLIB.OLB - она там в оттранслированном виде. SYSMAC здесь не причём - некоторые, как обычно, не в теме
Исходники имеются? Все что я видел про RT11 сплошные макросы.., что не очень интересно особенно в приложении к БК10
Народ спрашивал программу печати числа в 10-ой системе счисления.
Этой теме посвящена одна глава из книги «Хакеры» – очень вдохновляющая, советую прочитать!
Я попытался воссоздать эту программу:
Смысл программы, конечно, не в скорости, а в минимальном размере.Код:; Decimal by Manwe
; input: R0 - number to print
; output: R1 - pointer to text string
DECIM: MOV #NUMBER,R1 ; pointer to output text string
CLRB -(R1) ; end of text marker
MOV #10.,R4
1: MOV #-1.,R5
2: INC R5 ; counter of 10s
SUB R4,R0
BHIS 2 ; branch if higher or same
ADD #72,R0 ; #10. + '0' ASCII code
MOVB R0,-(R1) ; store R0 to text string
MOV R5,R0 ; let's count next how many 10s in number of 10s
BNE 1
RET ; returns text string pointer in R1
.BLKB 6
NUMBER:
Скрытый текст
Хакерская эстетика программирования
Так произошло и с программой печати десятичных чисел. Это была подпрограмма, иногда использовавшаяся в других программах. Она позволяла транслировать двоичные числа, которыми оперировал компьютер, в обычные десятичные цифры. По словам Сандерса, эта проблема являлась «своего рода павлиньим хвостом в программировании, и если вы могли написать рабочую программу печати десятичных чисел, то вы знали о компьютере достаточно, чтобы расправить хвост и называть себя, в некотором роде, программистом. А если вы были в состоянии написать действительно хорошую процедуру, то вы могли бы попробовать называть себя хакером». Проблема превратилась в нечто большее, чем просто состязание, окончательный бамминг (bumming на хакерском жаргоне - выкидывание "лишних" команд) процедуры печати десятичных чисел превратился для хакеров в своеобразные поиски Святого Грааля.
В течение нескольких месяцев было изготовлено множество версий процедуры печати десятичных чисел. Если программист был непроходимо глуп или был полным идиотом и совершенным «лузером», то подпрограмма конверсии отняла бы у него около сотни команд. Но любой хакер, стоивший своего имени, мог уместить ее в меньший объем. В конечном счете, попеременно убирая инструкции то в одном, то в другом месте, процедуру уменьшили до примерно пятидесяти инструкций.
После этого дела приняли серьезный оборот. Хакеры тратили многие часы, пытаясь найти путь, как можно было бы сделать все то же самое, но при помощи меньшего количества кода. Это стало больше чем соревнованием - это стало настоящим крестовым походом. Сколько бы сил не было потрачено, никто не был в состоянии преодолеть барьер из пятидесяти команд. Возник вопрос: а можно ли вообще сделать ее меньше? И есть ли предел, ниже которого бамнуть программу просто нельзя?
Среди многих, кто пытался решить эту головоломку, был парень по фамилии Дженсен, высокий и тихий хакер из Мэйна. Он обычно тихо сидел в Клудж Комнате (Kluge Room - пристанище хакеров в Массачусетском Технологическом Институте конца 50-ых и начала 60-ых годов) и покрывал своими каракулями распечатки с таким же невозмутимым спокойствием, как живущий в лесной глуши человек неспешно обстругивает ножом деревяшку, сидя на завалинке перед своим домом. Дженсен всегда пытался найти способ как сжать свои программы в объеме и увеличить их скорость. Его код, на первый взгляд, представлял собой беспорядочную последовательность логических и арифметических команд, часто вызывающих производство различных расчетов в разных частях одного и того же 18-битного слова (компьютер TX-0 использовал 18-разрядные слова). Если коротко, то его стиль программирования состоял из удивительных вещей и волшебных трюков.
До Дженсена существовала некоторая устоявшаяся точка зрения, что единственным логическим алгоритмом для процедуры печати десятичных чисел является последовательное вычитание, при котором использовались таблицы степеней числа 10 так, чтобы результирующее число попадало в соответствующие столбцы цифр. Дженсен как-то догадался, что таблица со степенями десятки была не нужна. Он придумал алгоритм, который позволял конвертировать числа обратным образом, а при помощи хитрого программного фокуса печатать их в нужном порядке. Кроме того, было дано сложное математическое доказательство всего этого, которое становилось понятным только после того, как хакеры увидели программу Дженсена, пришпиленную к доске объявлений, из которой было видно, что ему удалось преодолеть лимит длины программы для печати десятичных чисел. В ней было сорок шесть команд. Все присутствовавшие, с отпавшими челюстями уставились на код. Марж Сандерс потом припоминала, что хакеры, впервые за много дней, вели себя необычно тихо.
«Мы поняли, что дошли до логического конца»,- сказал позднее Боб Сандерс, - «Это была Нирвана».
Автор: Стивен Леви
Перевод: Андрей Лукин
[свернуть]