ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 8


7.  Программирование для платы VGA на Бейсике
-----------------------------------------------------------------
     
     После подробного обсуждения программирования для  платы  VGA
на Паскале  мы рассмотрим возможности доступа к плате VGA из двух
диалектов популярного языка  программирования  Бейсик.  Подробное
описание функций  VGA для каждого из рассматриваемых в дальнейшем
языков уже не приводится.
     
     Следовательно, данная  глава  не  будет   содержать   длинных
последовательностей описаний процедур,  команд и функций.  Вместо
этого мы рассмотрим  "шаблон"  программы  и  несколько  примеров.
Потом программист,  хорошо  владеющий  Бейсиком,  сможет  на базе
этого шаблона построить собственные программы,  добавив  желаемые
вызовы BIOS  для  создания широкого спектра графических команд на
соответствующем языке.  Функции BIOS подробно  рассматриваются  в
Разделе 3.1.
     
7.1  Turbo BASIC и PowerBASIC
-----------------------------------------------------------------
     
     Для программирования в  видео-режиме  19  (шестнадцатиричное
13) на   Бейсике   нам   понадобится  его  диалект  с  командами,
аналогичными тем, что были использованы для этого в Turbo Pascal.
Сначала рассмотрим  Turbo  BASIC  и некоторые стандартные команды
этого диалекта.
     
7.1.1  Команды Turbo BASIC и PowerBASIC
-----------------------------------------------------------------
     
     Следующие примеры  программ  требуют  иметь  текущую  версию
Turbo BASIC.  Данный  раздел  не  предназначен   служить   полным
описанием всех  команд Turbo BASIC.  Однако,  существует несколько
редко используемых  команд,   которые   требуют   дополнительного
пояснения.
     
-----------------------------------------------------------------
Def Seg...           Определение адреса сегмента для команды POKE.
     
Poke...              Прямой ввод значений, начиная с адреса памяти,
                     определенного перед этим в слове.
     
for n=... to... next Условный цикл по счетчику n.
     
Reg...,...           Присвоение переменным значений, передаваемых
                     в регистры процессора.
     
Call Interrupt...    Ввод значений в регистры процессора через
                     прерывание.
     
Screen...            Включение видео-режима (для режима шестнад-
                     цатиричное 13 не работает).
     
Print"..."           Вывод текста (или строк) на экран.
-----------------------------------------------------------------
                                                                 
     
7.1.2  Примеры программ на Turbo BASIC и PowerBASIC
-----------------------------------------------------------------
     
     Программа INTBASIC выполняется медленнее, чем аналогичная по
функциям программа INTPASCAL, которая написана на Turbo Pascal:
     
Program inTPascal;
uses dos,crt,vga19;
var x,y,z,Color: integer;
begin
  VMode(19);
  directvideo:=false;
  Randomize;
  writeln(' Демонстрационная программа для видео-режима 19 ');
  writeln('    (c)  1990 Jan Rueggeberg    ');
  plot(319,199,100);
  for y := 24 to 100 do begin
   for x := 0 to 319 do begin
    z := x; if z>255 then z := z-255;
    Mem[$a000 + y*20:x] := z;
   end;
  end;
  for z := 0 to 10000 do begin
   x := Random(320);
   y := Random(184)+16;
   Color := Random(256);
   Mem[$a000 + y*20:x] := Color;
  end;
  ZeroKey; repeat until keypressed;
end.
     
                                                          
10 ProgramInTBasic:
20 EnableVModeHex13:
30  Screen 10    : Rem Включение режима $11
35               : Rem для сброса всех регистров
40  Reg 1,&H0013
50  Call Interrupt &h10
60  PrintInVModeHex13:
70  Print" Демонстрационная программа для видео-режима 19"
80  Print"    (c) 1990 Jan Rueggeberg    "
90  SetPixel:               : Rem Вывод
100  Def Seg = &Ha000       : Rem в адрес экрана.
110  Poke 199*320 + 319,100 : Rem Помещение пикселя в нижний
115                         : Rem правый угол экрана.
120   Rem  ^y-value  ^x-value
130  FillScreenWithStandardPalette:
140   for y = 24 to 100 step 1
150    for x = 0 to 319 step 1
160     z=x: if z>255 then z=z-255
170      poke y*320+x, z  : Rem Plot
180     next x
190    next y
200 RandomPlot:
210  Randomize WXYZ
220   for z=0 to 10000
230    x=int(rnd*320)
240    y=int(rnd*200)
250    TheColor=int(rnd*256)
260    poke y*320+x,TheColor : Rem Plot
270   next z
                                                     
     
7.2  Quick BASIC
-----------------------------------------------------------------
     
     Другим популярным  диалектом   Бейсика,   имеющим   элементы
конструкций языков   высокого   уровня,   помимо  обычных  команд
Бейсика, является Quick BASIC.
     
     Quick BASIC версии 4.5 имеет  команды  для  работы  с  новым
VGA-BIOS.
     
7.2.1  Команды Quick BASIC
-----------------------------------------------------------------
     
     Одно из достоинств  языка  Quick  BASIC  состоит  в  наличии
стандартных команд,  позволяющих обойтись без программирования на
уровне регистров.  Например,  вы  можете  перейти  в  видео-режим
19  (шестнадцатиричное  13)  непосредственно командой
SCREEN 13.
     
     Разумеется, таким  образом  можно  обратиться  не  ко   всем
функциям VGA-BIOS.  Например,  сложные  манипуляции  с  палитрой,
описанные в Главе 6,  потребуют программирования  соответствующих
регистров.
     
     Существует еще  несколько  полезных команд,  например PSET и
CIRCLE, которые вы можете использовать в режиме 19.
     
     Команда PSET  соответствует  команде  Plot  из  расширенного
набора команд  Паскаля.  Она  не требует прямого ввода значений в
память компьютера командой POKE.
     
     Команда CIRCLE  имеет  одну  особенность,  по  которой   она
несовместима с режимом 19:
     
     Коэффициент сжатия   по   осям   x   и   y  равен  5:6,  что
соответствует разрешению платы EGA 320*200  пикселей.  Вы  можете
исправить это  значение  для использования с VGA,  введя параметр
Aspect, равный 1.
     
7.7.2  Пример программы на Quick BASIC
-----------------------------------------------------------------
     
10  ProgramInQBasic:
12
14  '$INCLUDE: 'qbx.bi'
20  DEFINT A-Z
25  DIM InRegs AS RegType, Outregs AS RegType
30
40  EnableVMode19:
50   SCREEN 11: REM режим IBM $11 (17 десятичное) восстанавливает регистры
60   SCREEN 13: REM многоцветный режим (VGA/MCGA) $13 (19 десятичное)
70
80  WriteInVModeHex13:
85    COLOR (1)
90    PRINT " Демонстрация видео-режима 19 на QuickBASIC V4.5 "
100   PRINT "  (c) 1990  Jan  &  Helke  Rueggeberg  "
110
120  SetPixels:
130   PSET (319, 199), 100
140
150 FillScreenWithStandardPalette:
160  FOR y = 100 TO 150 STEP 1
170   FOR x = 2 TO 317 STEP 1
180    VColor = x / 320 * 256 + RND * 2: IF VColor > 255 THEN VColor = VColor - 255
190    PSET (x, y), VColor
200   NEXT x
210  NEXT y
220
230 RandomPlot:
240  RANDOMIZE WXYZ
250  FOR z = 2 TO 400
260   x = INT(RND * 320)
270   y = INT(RND * 184) + 16
280   VColor = INT(RND * 256)
290   PSET (x, y), VColor
300  NEXT z
310
400 DrawCircles:
410  FOR x = 240 TO 2 STEP -1
420   CIRCLE (x / 2 + 40, x / 3 + 40), x / 5, 256 - x, 0, x / 43, 1
423   CIRCLE (x / 2 + 41, x / 3 + 40), x / 5, 256 - x, 0, x / 43, 1
425   CIRCLE (x / 2 + 80, -x / 3 + 160), x / 5, x, -x / 43, 0, 1
428   CIRCLE (x / 2 + 81, -x / 3 + 160), x / 5, x, -x / 43, 0, 1
430   REM Unlike book and default parameters in mode 19,       ^  ^
440   REM parameter aspect -> x/y -> 1/1 = 1                   ^  ^
450  NEXT x
460
470 Entry1:
480 F1 = 1: B1 = 15: G1 = 2: R1 = 11
485 F2 = 255: B2 = 42: G2 = 58: R2 = 63
487 Counter = 1
490
500 Blend:
510  nr = F2 - F1
520   FOR x = 0 TO nr
530    IF nr > 0 THEN Blue = (B1 * (nr - x) + B2 * (x)) / nr
540    IF nr > 0 THEN Green = (G1 * (nr - x) + G2 * (x)) / nr
550    IF nr > 0 THEN Red = (R1 * (nr - x) + R2 * (x)) / nr
570    VColornumber = F1 + x
580    GOTO VGAPalette
585    DoubleBack:
590  NEXT x
595
600 Entry2:
610  VColornumber = 1: Blue = 25: Green = 32: Red = 29
620 Counter = 2
630
700 VGAPalette:
710  IF Blue > 63 THEN Blue = 63: IF Blue < 0 THEN Blue = 0
720  IF Green > 63 THEN Green = 63: IF Green < 0 THEN Green = 0
730  IF Red > 63 THEN Red = 63: IF Red < 0 THEN Red = 0
740    AL = &H10: AH = &H10
742   InRegs.ax = AH * 256 + AL
744   InRegs.bx = VColornumber
746    CL = Blue: CH = Green
748   InRegs.cx = CH * 256 + CL
750    DH = Red
752   InRegs.dx = DH * 256 + 0
760  CALL Interrupt(&H10, InRegs, Outregs)
765
770 IF Counter = 1 THEN GOTO DoubleBack:
780 IF Counter = 2 THEN END
790
800 END

     
     
     
     


Яндекс цитирования