ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Часть 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 |