БК-0010 имеет неоспоримые преимущества по сравнению с другими отечественными компьютерами. Одно из главных его достоинств в возможности графического вывода информации на экран. Графические возможности БК позволяют создавать иллюстрации к обучающим программам, красивые динамические игры и др.

A.В. Авсеев, B.В. Авсеев

ДИНАМИЧЕСКИЕ ИЗОБРАЖЕНИЯ НА БК-0010

Странно, что, вооружив машину хорошей графикой, разработчики системного программного обеспечения не уделили внимания возможности вывода "спрайтов" (в кавычках потому, что аппаратно они не реализованы). Ни ФОКАЛ, ни БЕЙСИК не предлагают никаких возможностей для быстрого вывода изображений, поэтому в обоих случаях добиться эффекта ’’оживления" картинок невозможно. В случае несложных картинок можно, используя возможности обоих языков, рисовать векторные изображения. В БЕЙСИКе для этого служит оператор DRAW, а в ФОКАЛе оператор TYPE. Для вывода лучше всего использовать подпрограммы на АССЕМБЛЕРе или в машинных кодах.

Чтобы получить динамические изображения, необходимо создать на экране ЭВМ изображение и запомнить прямоугольный участок экранного ОЗУ, соответствующего изображению в виде последовательности байт.

Далее, последовательно выполняя следующие шаги, получаем двигающееся изображение:

  1. Вывод массива с картинкой на экран в виде прямоугольной области.
  2. Произвести задержку в программе.
  3. Стереть картинку. Это достигается выводом в ту же прямоугольную область последовательности байт, соответствующих цвету фона (0 - чёрный).
  4. Вернуться к шагу 1.

ЭВМ может формировать изображение на терминале с очень высокой скоростью. Поэтому в программе необходима задержка, чтобы скорость вывода картинок была более реалистичной. Если циклически выводить разные картинки, меняя при этом координаты вывода, то можно получить эффект мультипликации. Из сказанного выше видно, что для вывода динамических изображений нужны две подпрограммы. Одна для вывода области, другая для её стирания. Ниже приводятся тексты обоих подпрограмм, написанные на языке АССЕМБЛЕРа (например, МИКРО11).

; ПОДПРОГРАММА ВЫВОДА
   MOV KART,R0
   MOV ADR,R3
   MOV X,R1
   MOV Y,R2
2: MOV R1,R4
1: MOVB (R0)+,(R3)+
   SOB R4,1
   ADD#100,R3
   SUB R1,R3
   SOB R2,2
   RTS PC
; KART - НАЧАЛЬНЫЙ АДРЕС КАРТИНКИ В ПАМЯТИ
; ADR - АДРЕС ЭКРАННОГО ОЗУ, СООТВЕТСТВУЮЩИЙ ВЕРХНЕМУ ЛЕВОМУ УГЛУ КАРТИНКИ
; X - КОЛИЧЕСТВО БАЙТ, ЗАНИМАЕМЫХ КАРТИНКОЙ НА ЭКРАНЕ ПО ГОРИЗОНТАЛИ
; Y - ЧИСЛО СТРОК, ЗАНИМАЕМЫХ КАРТИНКОЙ НА ЭКРАНЕ ПО ВЕРТИКАЛИ
; ПОДПРОГРАММА СТИРАНИЯ ОБЛАСТИ КАРТИНКИ
   MOV ADR,R0
   MOV X,R1
   MOV Y,R2
2: MOV R1,R3
1: CLRB (R0)+
   SOB R3,1
   ADD #100,R0
   SUB R1,R0
   SOB R2,2 RTS PC
KART: .E
ADR: .E
X:  .Е
Y:  .Е

Эти простые подпрограммы можно использовать в программах на БЕЙСИКе, ФОКАЛе (если применить соответствующие надстройки) и на языке АССЕМБЛЕРа.

Для тех, кто мало знаком со строением экранной области памяти БК, мы подробнее остановимся на этом вопросе. Экранная область памяти ЭВМ БК-0010(-01) охватывает адреса 40000 - 100000 (восмеричн.), и её содержимое отображается на экране. Одному байту памяти соответствуют четыре цветные соседние точки по горизонтали. Таким образом, цвет каждой точки кодируется двумя битами. В черно-белом режиме каждая точка кодируется одним битом. Для быстрого вывода изображений удобно хранить массив с картинкой в основной памяти (по адресам менее 40000), а затем по мере надобности копировать в экранную область.

Правда, при этом перед программистом не может не встать вопроса о том, как сформировать массив с картинкой в ОЗУ ЭВМ? Можно, например, на бумаге составить изображение, закодировать её в бинарное представление, а затем в кодовом отладчике непосредственно записать в память полученную последовательность байтов (или слов) с картинкой. Но это слишком утомительно. Для создания изображений, сохранения их на магнитной ленте для последующего использования существуют специальные программы - графические редакторы. Есть они и для БК. Некоторые из таких программ, например V003, позволяют записывать картинку в формате системы МИКРО. Тогда изображение можно скомпоновать с собственной программой на языке АССЕМБЛЕРа. Подробнее о работе с конкретным графическим редактором можно прочитать в руководстве к нему.

Приведённые выше программы вывода картинки на экран оперируют не с координатами по горизонтали и вертикали, как это принято в языках высокого уровня (БЕЙСИК, ФОКАЛ), драйвере ЕМТ, а с абсолютным адресом экранного ОЗУ (ADR). Этот адрес соответствует верхнему левому углу выводимого изображения. Байтовая адресация памяти в процессоре БК (К1801ВМ1) позволяет выводить изображение с дискретом не менее одного байта (четыре точки) по горизонтали.

Дальше показан пример небольшой программы на БЕЙСЙКе, демонстрирующей возможности "оживления" изображения. Непосредственно для вывода картинок в ней используются подпрограммы в кодах, аналогичные приведённым выше (см. операторы 6-16,90,100,110). Надо заметить, что для простоты изображения не загружаются вместе с программой, а создаются ею же при помощи оператора DRAW (операторы 170, 240, 320). После этого полученные картинки копируются из экранного ОЗУ в основную память (операторы 190-220, 260-290, 330-360).

В операторах DATA содержатся коды трёх подпрограмм по следующим адресам соответственно: 1000 - подпрограмма запоминания изображения из экранного ОЗУ в основную память; 1072 - подпрограмма вывода изображения на экран; 1040 - подпрограмма стирания изображения.

5 ?CHR$(148%);CHR$(158%);CHR$(140%);CHR$(140%);CHR$(145%);
6 '1000:
7 DATA &O12700,0,&O12701,0,&O11502,&O12703,0,&O10004,&O10205,&O11523,
       &O5025,&O77403,&O62702,&O100,&O77110,&O207
8 '1040:
9 DATA &O12700,0,&O12701,0,&O11502,&O10003,&O5022,&O77302,&O62715,&O100,
       &O11502,&O77107,&O207
10 '1072:
11 DATA &O12700,0,&O12701,0,&O11502,&O12703,0,&O10004,&O10205,&O112325,
        &O77402,&O62702,&O100,&O77107,&O207. &O177777
12 CLS
13 ADR%=&O1000
14 READ X%
15 IF X%=&O177777 GOTO 20
16 POKE ADR%,X%
17 ADR%=ADR%+2%
18 GOTO 14
20 DIM P%(5%),SI%(5%)
30 V%=0%
40 V1%=&O30000
50 V2%=&O30470
70 IP%=0%
80 PR%=&O31160
90 DEF USR1=&O1000
100 DEF USR2=&O1040
110 DEF USR3=&O1072
120 NP%=0%
130 MI%=0%
140 MJ%=0%
150 TEMP%=400%
160 PSET(1,1),4
170 DRAW "S4C1R2F4R14E2R2U2R18D1L17D1R5D1L5D3R11H3L4D3R5H3R2F3R4F2D1G2L20H4L2H1L11H2U4"
180 PAINT(2,2),2,1
190 POKE &O1002,6%
200 POKE &O1006,14%
210 POKE &O1014,V1%
220 X%=USR1(&O40000+64%*15%)
230 PSET(1,1),4
240 DRAW "S4C1R2F4R14E2R2U1L17U1R18D2R5D1L5D3R11H3L4D3R5H3R2F3R4F2D1G2L20H4L2H1L11H2U4"
250 PAINT(2,2),2,1
260 POKE &O1002,6%
270 PORE &O1006,14%
280 POKE &O1014,V2%
290 X%=USR1(&O40000+64%*15%)
300 CIRCLE(9,9),8,3,0.001,-PI
310 PSET(9,9),4
320 DRAW "S4D2R2D2L1D1R2F3G1H2D3F3L2H3L1G3L2E3U3G2H1E3R2U1L1U2R1"
330 POKE &O1002,5%
340 POKE &O1006,25%
350 POKE &O1014,PR%
360 X%=USR1(&O40000+64%*15%)
440 X$=INKEY$
450 IF X$=""THEN500
460 IF NP%=5%THEN500
470 NP%=NP%+1%
480 FOR N%=1%TO5%
490 IF P%(N%)<>0% THEN NEXT N%
495 P%(N%)=1%
496 SI%(N%)=1%
500 IF NP%>0% THEN GOSUB 790
510 IF X$=""GOTO 560
520 IF ASC(X$)=12% THEN MI%=1%
530 IF ASC(X$)=25% THEN MI%=1%
540 IF ASC(X$)=26% THEN MJ%=44%
550 IF ASC(X$)=27% THEN MJ%=64%
560 I%=MI%+MJ%+I%
570 IF I%<0% THEN I%=I%+64%
580 IF I%>&O35000 THEN I%=I%-64%
590 POKE &O1074,12%
600 POKE &O1100,14%
610 POKE &O1106,V1%
620 X%=USR3(&O40000+I%)
630 FOR N%=0% TO TEMP%
640 NEXT N%
650 POKE &O1074,12%
660 POKE &O1100,14%
670 POKE &O1106,V2%
680 X%=USR3(&O40000+I%)
690 FOR N%=0% TO TEMP%
700 NEXT N%
710 POKE &O1042,6%
720 POKE &O1046,14%
730 X%=USR2(&O40000+I%)
740 GOTO 440
770 END
780'
790' ПОДПРОГРАММА ПАДЕНИЯ ПАРАШЮТИСТОВ - НАДО НАЖИМАТЬ ПРОБЕЛ
800 FOR N%=1%TO 5%
810 IF P%(N%)=0% GOTO 940
820 POKE &O1042,5%
830 POKE &O1046,25%
840 X%=USR2(&O40000+SI%(N%))
850 SI%(N%)=SI%(N%)+128%
860 IF SI%(N%)<&O35000 GOTO 900
870 P%(N%)=0%
880 NP%=NP%-1%
890 GOTO 940
900 POKE &O1074,10%
910 POKE &O1100,25%
920 POKE &O1106,PR%
930 X%=USR3(&O40000+SI%(N%))
940 NEXT N%
950 RETURN

 

Performed by © gid, 2012-2022.