Мелентьев A.B.

(г. Огре Латвийской ССР)

  1. Многие программы гасят служебную строку, но её место никем не используется. А если выполнить оператор РОКЕ 136, 16384, то область служебной строки станет доступна для графики с координатами Y от 240 до 255. Если, кроме этого, сделать РОКЕ -76,512 OR (РЕЕК(132)/64-40), то освобождённая область служебной строки установится снизу, т.е. получается графический экран размером 256x256 точек. Кстати, оператор CLS теперь очистит экран вместе со служебной строкой.
  2. При работе БЕЙСИКа, зашитого у БК в ПЗУ, с символьными переменными возникают ошибки: полная утрата значения переменной, замена значения на совершенно абсурдное, неизвестно откуда взявшееся. Работая с БЕЙСИКом, я заметил, что во всех операторах, которые работают с константами, заключёнными в кавычки, таких ошибок не возникает. Теперь я во всех операторах вставляю сложение с пустой строчкой. Например:
    230 A$ = "" + MID$ (B$,3,1)
    240 C$ = "" + A$ + B$
  3. В некоторых программах требуется вывод в последнюю позицию экрана, но при этом весь экран сдвигается вверх. Чтобы этого не произошло, перед выводом выполните оператор РОКЕ 114,0. После того как символ введён, рекомендую выполнить РОКЕ 114,2 и вернуть тем самым систему в исходное состояние.
  4. В любой динамической игре важна скорость вывода на экран отдельных участков, в которых изображены герои игры. В некоторых версиях БЕЙСИКа для этого используют спрайты. Что-то подобное можно сделать и на БК. Для этого в программу следует вставить строки:
    10 POKE 256, 7489
    20 POKE 258, 2
    30 POKE 260, 2527
    40 POKE 262, 31244
    50 POKE 264, 135
    60 DEF USR = 256

    Каждый спрайт задаётся символьной последовательностью из 10 символов, код каждого из которых есть двоичная зашифровка соответствующей строки спрайта. Например, для спрайта:

    1

    2

    4

    8

    16

    32

    64

    128

     

     

     

    X

    X

    X

    X

     

     

    4+8+16+32=60

     

     

    X

     

     

    X

     

     

    4+32=36

     

     

     

    X

    X

     

     

     

    8+16=24

    x

    X

    X

    X

    X

    X

    X

    X

    1+2+...+128=255

    X

     

    X

     

     

    X

     

    X

    1+4+32+128=165

    X

     

    X

     

     

    X

     

    X

    1+4+32+128=165

    X

     

    X

    X

    X

    X

     

    X

    165+8+16=189

     

     

    X

     

     

    X

     

     

    36

     

     

    X

     

     

    X

     

     

    36

     

    X

    X

     

     

    X

    X

     

    36+2+64=102

     

    Получаем: A$ = "<$" + CHR$ (24) + "Ъ├├╞$$F". Для того чтобы вывести такой спрайт на экран, надо выполнить операторы:

    1000 LOCATE X,Y,0
    1010 A$ = USR(A$)

    Внимание! Вывод спрайта не приводит к передвижению курсора, поэтому "увидеть" спрайт в диалоговом режиме невозможно.

  5. Оператор COLOR БЕЙСИКа БК0010.01 позволяет менять цвет текста, однако локальное изменение цвета фона невозможно: весь экран меняет цвет. Что делать?

В системной области есть ячейка с адресом 138, которая содержит маску фона.

Цвет

Маска

1

-1

2

-21846

3

21845

4

0

 

Если надо, например, установить синий фон, выполните оператор РОКЕ 138, 21845.

КОММЕНТАРИЙ РЕЦЕНЗЕНТА

На способ использования служебной строки в БЕЙСИКе БК0010.01

Многие программы используют решение информации в служебной строке.

Можно, например, воспользоваться советом П. Лучка из г. Кировска: удерживая клавиши AP2 и "Shift", нажать клавиши 4, 5, 5, строка исчезнет, но вместе с курсором. Не отпуская первые две клавиши, нажимаем 1, и курсор появляется. Вернуть обратно служебную строку можно командой NEW (журнал "Информатика и образование'' - 1988. - № 6).

Вывести информацию на служебную строку в БЕЙСИКе можно также с помощью простого способа, предложенного С. Комаровым из г. Львова (журнал "Информатика и образование. - 1989. - № 4).

Способ, предложенный A.B. Meлентьевым, отличается от вышеупомянутых лаконичностью и работает как в диалоговом, так и в программном режиме. Освобождённую строку можно использовать для вывода графической информации.

На способ устранения ошибок при работе с символьными функциями БЕЙСИКа БК0010.01

Многие пользователи БЕЙСИКа БК 0010.01 с огорчением обнаруживают ошибки БЕЙСИК-системы при работе с символьными переменными. Особенно часто сбои возникают при использовании функции MID$. A.B. Meлентьев заметил, что при добавлении результата вычислений символьных функций к пустой строке ошибки не возникают, и предлагает этот способ другим пользователям БК.

Опыт использования символьных функций в БЕЙСИКе БК 0010.01 позволяет с уверенностью утверждать, что подавляющее большинство ошибок применения символьных функций связано с неверной работой функции MlD$.

Надо отметить, что эта функция особая и требует к себе повышенного внимания. Это единственная функция, которая может присутствовать по обе стороны оператора присваивания, и именно с этой особенностью связаны сложности и ошибки её реализации.

Верность её вычисления, как показывает практика программирования, в правой части оператора присваивания обеспечена только при присвоении результата пустой символьной переменной. Например:

10 В$ = "ПУСТА"
20 A$ = "" ' Очистка символьной переменной
30 A$ = MID$(B$,2%,4%)
40 ? A$;

Правильной работы этой функции можно достичь и способом, предлагаемым А.В. Мелентьевым, т.е. добавляя результат вычисления функции MID$ к пустой строке, например:

10 DIM A$(2)
20 FOR I%=1% ТО 2%
30 A$(I%)="KK"
40 B$="YY" 'Если B$ = "" ошибки не возникает
50 B$=""+MID$(A$(I%),2%,1%) 'Пустая строка добавляется обязательно спереди
60 ? B$;
70 ? A$(I%);
80 NEXT I%
90 END

Достаточно убрать в операторе 50 пустую строку, и возникнет ошибка. В этом случае функция MID$ делает довольно странный гибрид из строк B$ и A$(2%). Меняя числа в операторе 50 и строки A$(I%) и B$, можно достичь удивительных, интересных и просто нужных результатов. Эти способы устранения ошибок при работе с символьными переменными очень полезны, так как с ними встречается практически каждый любитель, программирующий на БЕЙСИКе БК0010.01.

На способ вывода информации в последнюю позицию экрана

Существуют программы, в которых необходимо вывести символ в последнюю позицию экрана без сдвига всей информации вверх (скроллинг). Способ, предлагаемый автором, очень прост и достоин внимания.

В качестве примера использования способа предлагаю следующую программу:

10 POKE 114%,0% 'Отмена скроллинга
20 ?АТ(31,23)"*";
30 C$=""
40 C$=INKEY$
50 IF C$="" THEN 40 'Задержка до нажатия любой клавиши
60 POKE 114%,2% 'Восстановление скроллинга
70 END

На способ создания в БЕЙСИКе БК 0010.01 спрайтов

Создание быстро выводимых изображений - один из очень важных и интересных вопросов при использовании персональных компьютеров и, в частности, бытовых ЭВМ. Существует большое количество способов кодирования и вывода на экран дисплея изображений. Предложенная автором программа достаточно лаконична для того, чтобы её можно было включать в любую программу на БЕЙСИКе. По сути, предлагаемая программа в кодах вызывает системную подпрограмму, расположенную в адресах 1027468-1032208, но не с самого начала, а с адреса 1027648, чтобы исключить некоторые начальные установки. Эта системная подпрограмма обеспечивает вывод спрайта в место расположения курсора. Возможности программы несколько ограничены из-за того, что изображение, выводимое за один вызов, имеет строго определённый размер: 8x10 точек. Большое изображение необходимо поэтому строить из многих спрайтов.

Кроме того, выводимый на экран спрайт естественным образом затирает информацию, представленную в соответствующем участке экрана. Восстановить стёртую информацию может только программист.

В целом предложенный способ вывода графической информации достаточно быстрый. Например, заполнение одним и тем же спрайтом всего экрана в цикле занимает около 4-5 секунд, что соответствует приблизительно скорости вывода текстовой информации.

В примере программы, выводящей спрайт на экран, необходимо добавить дополнительный оператор LOCATE для смещения курсора в следующую позицию экрана. При его отсутствии можно потерять много времени на поиск несуществующей ошибки, так как спрайта не видно. Он будет стёрт радостным сообщением БЕЙСИКа "Ок".

Предлагаю несколько иной текст тестовой программы:

1 REM*СПРАЙТ*БК0010.01
2 REM Автор Мелентьев A.B.
10 РОКЕ 256%,7489%
20 РОКЕ 258%,2%
30 РОКЕ 260%,2527%
40 РОКЕ 262%,-31244%
50 РОКЕ 264%,135%
60 DEF USR=256%
70 LOCATE 10%,10%,0% 'Установление позиции и гашение курсора
80 A$="<$"+CHR$(24)+"Ъ├├╞$$F"
90 A$=USR(A$) 'Вывод спрайта
100 LOCATE 11%,10%,1% 'Смещение и включение курсора
110 END

Performed by © gid, 2012-2022.