Video display modes: Difference between revisions

From Rosetta Code
Content added Content deleted
No edit summary
No edit summary
Line 56: Line 56:


=={{header|QBasic}}==
=={{header|QBasic}}==
'''This example is wrong! QBASIC can use EGA/VGA Graphics until SCREEN 13 (320x200 - 256 colors) or SCREEN 12 (640x480 - 16 colors).QBASIC version used: 1.1'''
<lang qbasic>'QBasic can switch VGA modes
<lang qbasic>'QBasic can switch VGA modes
SCREEN 18 'Mode 12h 640x480 16 colour graphics</lang>
SCREEN 18 'Mode 12h 640x480 16 colour graphics</lang>

Revision as of 10:19, 7 February 2015

Task
Video display modes
You are encouraged to solve this task according to the task description, using any language you may know.

The task is to demonstrate how to switch video display modes within the language. A brief description of the supported video modes would be useful.

Applesoft BASIC

There are ten possible modes:

TEXT, page 1, 40 x 24
GR, page 1, 40 x 40, 16 colors, mixed with four lines of text
HGR, page 1, 280 x 160, 6 colors, mixed with four lines of text
HGR2, page 2, 280 x 192, 6 colors, full screen
text, page 2, 40 x 24
gr, page 1, 40 x 48, 16 colors, full screen
gr, page 2, 40 x 40, 16 colors, mixed with four lines of text 
gr, page 2, 40 x 48, 16 colors, full screen
hgr, page 1, 280 x 192, 6 colors, full screen
hgr, page 2, 280 x 160, 6 colors, mixed with four lines of text

<lang ApplesoftBasic>10 GR 20 FOR I = 0 TO 15 : COLOR = I : PLOT I,I : NEXT 30 HGR 40 FOR I = 1 TO 6 : HCOLOR = I : HPLOT I * 2, I TO I * 2 + 1, I : NEXT 50 TEXT 60 HOME : FOR I = 0 TO 7 : VTAB I + 1 : FOR J = 0 TO 31 : POKE PEEK(40) + PEEK(41) * 256 + 4 + J, I * 32 + J : NEXT J, I 70 HGR2 80 FOR I = 1 TO 6 : HCOLOR = I : HPLOT I * 2, I + 6 TO I * 2 + 1, I + 6 : NEXT 90 TEXT 100 GET A$ 110 IF A$ = "H" THEN POKE -16297,0 : REM HI-RESOLUTION 120 IF A$ = "L" THEN POKE -16298,0 : REM LO-RESOLUTION 130 IF A$ = "2" THEN POKE -16299,0 : REM PAGE 2 140 IF A$ = "1" THEN POKE -16300,0 : REM PAGE 1 150 IF A$ = "M" THEN POKE -16301,0 : REM MIXED TEXT 160 IF A$ = "F" THEN POKE -16302,0 : REM FULL SCREEN 170 IF A$ = "T" THEN POKE -16303,0 : REM TEXT 180 IF A$ = "G" THEN POKE -16304,0 : REM GRAPHICS 190 IF A$ <> "Q" THEN 100 200 TEXT</lang>

BBC BASIC

<lang bbcbasic>10 MODE 1: REM 320x256 4 colour graphics</lang>

GW-BASIC

This example is wrong! GWBASIC can use ONLY EGA-Graphic until SCREEN 9 (640 x 350 - 16 colors) with color monitor or SCREEN 10 (640 x 350 - 2 "colors") for monochrome monitor. GWBASIC version used: 3.23

<lang gwbasic>10 REM GW Basic can switch VGA modes 20 SCREEN 18: REM Mode 12h 640x480 16 colour graphics</lang>

Locomotive Basic

The Amstrad CPC464 supports three video modes:

  • Mode 0 - Graphics: 160x200 Text: 20x25 Colours: 16
  • Mode 1 - Graphics: 320x200 Text: 40x25 Colours: 4
  • Mode 2 - Graphics: 640x200 Text: 80x25 Colours: 2

Note that text can be displayed using conventional means in all display modes. <lang locobasic>10 MODE 0: REM switch to mode 0</lang>

QBasic

This example is wrong! QBASIC can use EGA/VGA Graphics until SCREEN 13 (320x200 - 256 colors) or SCREEN 12 (640x480 - 16 colors).QBASIC version used: 1.1 <lang qbasic>'QBasic can switch VGA modes SCREEN 18 'Mode 12h 640x480 16 colour graphics</lang>

Icon and Unicon

The following works in both languages on X-windows based systems and assume xrandr is installed:

Translation of: UNIX Shell

<lang unicon>procedure main(A)

   mode := A[1]
   if \mode then system("xrandr -s " || \mode || " >/dev/null")
   else system("xrandr -q")    # Display available modes

end</lang>

Output with no arguments:

->vdm
Screen 0: minimum 8 x 8, current 3840 x 1200, maximum 8192 x 8192
DVI-I-0 disconnected (normal left inverted right x axis y axis)
VGA-0 connected 1920x1200+0+0 (normal left inverted right x axis y axis) 518mm x 324mm
   1920x1200      60.0*+
   1600x1200      75.0     70.0     65.0     60.0  
   1280x1024      75.0     60.0  
   1280x960       60.0  
   1152x864       75.0  
   1024x768       75.0     70.1     60.0  
   800x600        75.0     72.2     60.3     56.2  
   640x480        75.0     72.8     59.9  
TV-0 disconnected (normal left inverted right x axis y axis)
DVI-I-1 connected 1920x1200+1920+0 (normal left inverted right x axis y axis) 518mm x 324mm
   1920x1200      60.0*+
   1680x1050      60.0  
   1600x1200      60.0  
   1280x1024      75.0     60.0  
   1280x960       75.0  
   1024x768       75.0     60.0  
   800x600        75.0     60.3  
   640x480        75.0     59.9  
->

REXX

This method only works in DOS prompt either under (native) DOS or Microsoft WINDOWS.

DOS (under Microsoft Windows) will support:

  • columns   of   11 ──> 32,766   (inclusive)
  • lines         of   1 ──> 32,766   (inclusive)

version 1: no checking for which OS

<lang rexx>/*REXX program to switch video display modes based on columns and lines.*/

parse arg cols lines . 'MODE' "CON: COLS="cols 'LINES='lines

                                      /*stick a fork in it, we're done.*/</lang>

version 2: checks for which OS

The prologue code (at the bottom of the program) is a collection of some general-purpose subroutines which determine:

  • which environment (operating system) the REXX interpreter is running under
  • if Windows/NT/XP/Vista/7/8 (the NT family) is running
  • which REXX is being executed
  • what literal to use to obtain the environmental variables (for the value bif)
  • what the fileName, fileType/fileExt, fileMode/path is of the REXX program
  • which command to use to clear the terminal screen
  • invokes $H to show general documentation (1st and only arg = ?)
  • invokes $H to show a flow diagram (1st and only arg = ?FLOW)
  • invokes $H to show sample uses (1st and only arg = ?SAMPLE)
  • invokes $H to show the author & contact info (1st and only arg = ?AUTHOR)

All the prologue was left intact to give a general feel of the scope of the boilerplate code. The prologue code is in many REXX programs and it's easier to keep them on one line for copying purposes and sorting. <lang rexx>/*REXX program to switch video display modes based on columns and lines.*/ parse arg !; if !all() then exit /*exit if documentation specified*/ if \!dos & \!os2 then exit /*if this isn't DOS, then exit. */

parse arg cols lines . 'MODE' "CON: COLS="cols 'LINES='lines

exit /*stick a fork in it, we're done.*/ /*══════════════════════════════════general 1-line subs═════════════════*/ !all:!!=!;!=space(!);upper !;call !fid;!nt=right(!var('OS'),2)=='NT';!cls=word('CLS VMFCLEAR CLRSCREEN',1+!cms+!tso*2);if arg(1)\==1 then return 0;if wordpos(!,'? ?SAMPLES ?AUTHOR ?FLOW')==0 then return 0;!call=']$H';call '$H' !fn !;!call=;return 1 !cal:if symbol('!CALL')\=="VAR" then !call=;return !call !env:!env='ENVIRONMENT';if !sys=='MSDOS'|!brexx|!r4|!roo then !env='SYSTEM';if !os2 then !env='OS2'!env;!ebcdic=1=='f0'x;return !fid:parse upper source !sys !fun !fid . 1 . . !fn !ft !fm .;call !sys;if !dos then do;_=lastpos('\',!fn);!fm=left(!fn,_);!fn=substr(!fn,_+1);parse var !fn !fn '.' !ft;end;return word(0 !fn !ft !fm,1+('0'arg(1))) !rex:parse upper version !ver !vernum !verdate .;!brexx='BY'==!vernum;!kexx='KEXX'==!ver;!pcrexx='REXX/PERSONAL'==!ver|'REXX/PC'==!ver;!r4='REXX-R4'==!ver;!regina='REXX-REGINA'==left(!ver,11);!roo='REXX-ROO'==!ver;call !env;return !sys:!cms=!sys=='CMS';!os2=!sys=='OS2';!tso=!sys=='TSO'|!sys=='MVS';!vse=!sys=='VSE';!dos=pos('DOS',!sys)\==0|pos('WIN',!sys)\==0|!sys=='CMD';call !rex;return !var:call !fid;if !kexx then return space(dosenv(arg(1)));return space(value(arg(1),,!env))</lang>

UNIX Shell

If the system runs X11 and supports XRANDR, then <lang bash>$ xrandr -q</lang> lists the available modes, and <lang bash>$ xrandr -s 1024x768</lang> sets the screen to the given size.

With modern LCD monitors, this feature is not very useful. These monitors have a single best mode, and the X server discovers and uses that mode by default. Smaller screen modes might work, but make a blurry picture.

XPL0

<lang XPL0>code SetVid=45; SetVid(Mode)</lang> Any display mode supported by the IBM-PC-compatible hardware and by the VGA or VESA standards can be enabled by calling the SetVid intrinsic routine. This works without problem on computers booted into DOS and under versions of Windows up until XP. DOSBox[1] gets around most of the incompatibilities introduced by WinXP and later versions.

Example display modes:

$03 - CGA 80x25 text in 16 colors (x4)
$12 - VGA 640x480x4 graphics
$13 - VGA 320x200x8
$101 - VESA 640x480x8
$118 - VESA 1024x768x24

On modern LCD displays (as opposed to older CRT monitors) images can look terrible if the selected mode does not match the native resolution of the LCD.