UNIT coul256; INTERFACE uses dos; const video=$10; g640x480x256=$53; g640x480x16=$12; maxX=639; maxY=479; maxcolors=255; copyput=0; xorput=128; activepage:byte=0; type colorvalue=record r,g,b:0..63; end; rgbpalettetypen=object size:word; colors:array[0..maxcolors] of colorvalue; PROCEDURE setrgb(c,r,g,b:byte); end; palettetypen=record colors:array[0..16] of byte; end; windowtypeptr=^windowtypen; windowtypen=object x1,y1,x2,y2:integer; color,writemode:byte; PROCEDURE locate(h1,v1,h2,v2:integer); end; const screen:windowtypen= (x1:0; y1:0; x2:maxX; y2:maxY; color:0; writemode:copyput); var activemode:byte; activewindow:windowtypeptr; PROCEDURE setmoden(m:byte); PROCEDURE clearscreen; PROCEDURE setpaletten(var p:palettetypen); PROCEDURE getpaletten(var p:palettetypen); PROCEDURE setrgbpaletten(var p:rgbpalettetypen); PROCEDURE getrgbpaletten(var p:rgbpalettetypen); PROCEDURE setcolorn(c:byte); PROCEDURE setwritemoden(m:byte); PROCEDURE setactivewindown(var wnd:windowtypen); {PROCEDURE putpixeln(x,y:integer); PROCEDURE putpixeln2(x,y:word;coul:byte); {FUNCTION getpixeln(x,y:integer):byte;} PROCEDURE rectanglen(x1,y1,x2,y2:integer); PROCEDURE writexy(x,y:byte;s:string); IMPLEMENTATION var regs:registers; PROCEDURE rgbpalettetypen.setrgb; begin colors[c].R:=R; colors[c].G:=G; colors[c].B:=B; end; PROCEDURE windowtypen.locate; begin x1:=h1; y1:=h1; x2:=h2; y2:=v2; end; PROCEDURE setmoden; begin regs.ax:=m; intr(video,regs); activemode:=m; end; PROCEDURE clearscreen; var p:palettetypen; rgb:rgbpalettetypen; begin getpaletten(p); getrgbpaletten(rgb); regs.ax:=activemode; intr(video,regs); setpaletten(p); setrgbpaletten(rgb); end; PROCEDURE setpaletten(var p:palettetypen); begin with regs,p do begin ax:=$1002; es:=seg(colors); dx:=ofs(colors); intr(video,regs); end; end; PROCEDURE getpaletten(var p:palettetypen); begin with regs,p do begin ax:=$1009; es:=seg(colors); dx:=ofs(colors); intr(video,regs); end; end; PROCEDURE setrgbpaletten(var p:rgbpalettetypen); begin with regs,p do begin ax:=$1012; bx:=0; cx:=size; es:=seg(colors); dx:=ofs(colors); intr(video,regs); end; end; PROCEDURE getrgbpaletten(var p:rgbpalettetypen); begin with regs,p do begin ax:=$1017; bx:=0; cx:=maxcolors+1; es:=seg(colors); dx:=ofs(colors); intr(video,regs); size:=cx; end; end; PROCEDURE setcolorn(c:byte); begin activewindow^.color:=c; end; PROCEDURE setwritemoden(m:byte); begin activewindow^.color:=m; end; PROCEDURE setactivewindown(var wnd:windowtypen); begin activewindow:=@wnd; end; {PROCEDURE putpixeln; begin with regs,activewindow^do if (x>=0) and (y>=0) and (x<=x2-x1) and (y<=y2-y1) then begin if maxcolors=255 then begin if writemode=xorput then al:=getpixeln(x,y) xor color else al:=color; end else al:=color or writemode; ah:=$0c; bh:=activepage; cx:=x+x1; dx:=y+y1; intr(video,regs); end; end; PROCEDURE putpixeln2(x,y:word;coul:byte); assembler; asm mov ah,$0c mov al,coul mov cx,x mov dx,y int 10h end; FUNCTION getpixeln(x,y:integer):byte; begin with regs,activewindow^do if (x>=0) and (y>=0) and (x<=x2-x1) and (y<=y2-y1) then begin ah:=$0d; bh:=activepage; cx:=x+x1; dx:=y+y1; intr(video,regs); getpixeln:=al; end else getpixeln:=0; end; } PROCEDURE rectanglen(x1,y1,x2,y2:integer); begin end; PROCEDURE writexy(x,y:byte;s:string); begin end; BEGIN activewindow:=@screen; with regs do begin ah:=$0f; intr(video,regs); activemode:=al; end; END.