home *** CD-ROM | disk | FTP | other *** search
- {
- **************************************************************************
- * Low Resolution Graphics *
- * *
- * Richard Chandler Raliegh, NC *
- * PC World March 1986 pg. 305 *
- * *
- **************************************************************************
- }
- Program Lo_Res_Graphics;
- type
- scr = array[1..16000] of byte;
- color = array[0..7] of byte;
- const
- blue : color = (1,16,9,24,18,51,26,110);
- green : color = (2,37,31,10,39,102,85,115);
- cyan : color = (17,32,25,52,94,86,116,125);
- red : color = (4,58,62,12,66,126,131,132);
- magenta : color = (5,19,73,59,71,27,78,130);
- brown : color = (6,81,83,41,87,68,128,133);
- gray : color = (0,8,100,7,92,107,90,135);
-
- var
- i,j,k,l : byte;
- stop : char;
- screen : scr absolute $B800:$0000;
- color_table : array[0..135,0..1] of byte;
-
- {----- Set Graphics Controller Chip for Lo-Res -----}
-
- Procedure Set_Lo_Res;
- type
- reg = array[0..11] of byte;
- const
- modereg = $03D8;
- colorreg = $03D9;
- crtreg = $03D4;
- crtdata = $03D5;
- regdata : reg = (113,80,90,10,127,6,100,112,2,1,32,0);
-
- var
- i : byte;
- j : integer;
- modesave : byte absolute $0000:$0465;
- colorsave : byte absolute $0000:$0466;
- begin
- modesave := 0;
- port[modereg] := 0;
- colorsave := 0;
- port[colorreg] := 0;
- for i := 0 to 11 do
- begin
- port[crtreg] := i;
- port[crtdata] := regdata[i];
- end;
- for j := i to 16000 do
- begin
- screen[j] := 177;
- j := j+1;
- screen[j] := 0;
- end;
- modesave := 9;
- port[modereg] := 9;
- end;
-
- {----- Restore Text Screen -----}
-
- Procedure Set_Text_Mode;
- type
- reg = array[0..11] of byte;
- const
- crtreg = $03D4;
- crtdata = $03D5;
- regdata : reg = (113,80,90,10,31,6,25,28,2,7,6,7);
- var
- i : byte;
- begin
- for i := 0 to 11 do
- begin
- port[crtreg] := i;
- port[crtdata] := regdata[i];
- end;
- textmode(3);
- ClrScr;
- end;
-
- {----- Clears Screen -----}
-
- Procedure Clear_Screen;
- var
- i : integer;
- begin
- for i := 1 to 16000 do
- begin
- i := i + 1;
- screen[i] := 0;
- end;
- end;
-
- {----- Set Color Table -----}
-
- Procedure Set_Colors;
- var
- i,c,fg,bg : byte;
- begin
- c := 0;
- for i := 0 to 255 do
- begin
- bg := i div 16;
- fg := i mod 16;
- if bg <= fg then
- begin
- color_table[c,0] := bg;
- color_table[c,1] := fg;
- c := c+1;
- end;
- end;
- end;
-
- {----- Plots Point(x,y) in color bg/fg -----}
-
- Procedure Point(x,y,c:integer);
- var
- bg,fg : integer;
- begin
- bg := color_table[c,0];
- fg := color_table[c,1];
- screen[2*(x+1)+160*y] := fg + bg * 16;
- end;
-
- {----- Display colors in sequence -----}
-
- Procedure Display_All_Colors;
- var
- i,j,k,l : integer;
- begin
- for i := 0 to 16 do
- for j := 0 to 7 do
- for k := 0 to 3 do
- for l := 0 to 11 do
- Point(i*4+k,j*12+l,8*i+j);
- end;
-
- {----- Display selected Palette -----}
-
- Procedure Display_Palette;
- var
- i,j,k : integer;
- begin
- for i := 0 to 7 do
- for j := 0 to 3 do
- for k := 0 to 11 do
- begin
- Point(4*i+j,k,blue[i]);
- Point(4*i+j,k+12,green[i]);
- Point(4*i+j,k+24,cyan[i]);
- Point(4*i+j,k+36,red[i]);
- Point(4*i+j,k+48,magenta[i]);
- Point(4*i+j,k+60,brown[i]);
- Point(4*i+j,k+72,gray[i]);
- end;
- end;
-
- {----- Main Program Begins Here -----}
-
- Begin
- Set_Lo_Res;
- Set_Colors;
- Display_All_Colors;
- read(kbd, stop);
- clear_screen;
- Display_Palette;
- read(kbd,stop);
- Set_text_mode;
- end.