////////////////////////////////////////////////////////////////////////////// // // This file is part of the Atari Machine Specific Library, // and is Copyright 1992 by Warwick W. Allison. // // You are free to copy and modify these sources, provided you acknoledge // the origin by retaining this notice, and adhere to the conditions // described in the file COPYING. // ////////////////////////////////////////////////////////////////////////////// #include #include "SmallGraphics.h" static short Pattern[4]={0xffff,0xffff,0xffff,0xffff}; void InitSmallGraphics() { linea0(); __aline->_LNMASK=0xffff; __aline->_PTSIN[0]=0; __aline->_PTSIN[1]=0; __aline->_WMODE=0; __aline->_LNMASK=0xffff; __aline->_LSTLIN=-1; __aline->_PATPTR=Pattern; __aline->_PATMSK=4; __aline->_MFILL=0; __aline->_CLIP=0; } void Colour(int C) { __aline->_INTIN[0]=C; __aline->_COLBIT0=C&1; __aline->_COLBIT1=C&2; __aline->_COLBIT2=C&4; __aline->_COLBIT3=C&8; } void Plot(int x, int y) { __aline->_PTSIN[0]=x; __aline->_PTSIN[1]=y; linea1(); } void Plot(int x, int y, int C) { Colour(C); __aline->_PTSIN[0]=x; __aline->_PTSIN[1]=y; linea1(); } int ColourAt(int x, int y) { __aline->_PTSIN[0]=x; __aline->_PTSIN[1]=y; return linea2(); } void Line(int x, int y) { __aline->_PTSIN[2]=__aline->_PTSIN[0]; __aline->_PTSIN[3]=__aline->_PTSIN[1]; __aline->_PTSIN[0]=x; __aline->_PTSIN[1]=y; linea3(); } void Line(int x1, int y1, int x2, int y2) { /* __aline->_PTSIN[0]=x1; __aline->_PTSIN[1]=y1; __aline->_PTSIN[2]=x2; __aline->_PTSIN[3]=y2; */ __aline->_X1=x1; __aline->_Y1=y1; __aline->_X2=x2; __aline->_Y2=y2; linea3(); } void Rectangle(int x1, int y1, int x2, int y2) { __aline->_PTSIN[0]=x1; __aline->_PTSIN[1]=y1; __aline->_PTSIN[2]=x2; __aline->_PTSIN[3]=y2; linea5(); } void Fill(int x, int y) { __aline->_PTSIN[0]=x; __aline->_PTSIN[1]=y; lineae(); } int MaxX() { return V_X_MAX; } int MaxY() { return V_Y_MAX; } /* IMPLEMENTATION MODULE SmallGraphics; FROM BIOS IMPORT bconout,setColor,PalleteArray,setPallete; FROM LINEA IMPORT AInit,PutPixel,DrawLine,FilledRectangle,PInterface,PFontList,Interface,GetPixel; FROM SYSTEM IMPORT ADR; FROM Resolutions IMPORT CurrentResolution,ScreenWidth,ScreenHeight,Resolution; FROM RunSupport IMPORT UponTermination; VAR Iface:PInterface; Fonts:PFontList; Col:CARDINAL; Pattern:ARRAY [0..15] OF CARDINAL; PROCEDURE SolidPattern; VAR i:CARDINAL; BEGIN FOR i:=0 TO 15 DO Pattern[i]:=65535; END; END SolidPattern; PROCEDURE Colour(c:CARDINAL); BEGIN Col:=c; END Colour; VAR OldCol:CARDINAL; PROCEDURE SetColourPlanes; VAR c:CARDINAL; BEGIN IF OldCol<>Col THEN OldCol:=Col; c:=Col; WITH Iface^ DO IF c>=8 THEN c:=c-8; COLBIT[3]:=1; ELSE COLBIT[3]:=0; END; IF c>=4 THEN c:=c-4; COLBIT[2]:=1; ELSE COLBIT[2]:=0; END; IF c>=2 THEN c:=c-2; COLBIT[1]:=1; ELSE COLBIT[1]:=0; END; IF c>=1 THEN COLBIT[0]:=1; ELSE COLBIT[0]:=0; END; END; END; END SetColourPlanes; PROCEDURE Bar(x,y,w,h:CARDINAL); BEGIN SetColourPlanes; WITH Iface^ DO X1:=x; Y1:=y; X2:=x+w-1; Y2:=y+h-1; END; FilledRectangle; END Bar; PROCEDURE Plot(x,y:CARDINAL); BEGIN PutPixel(Col,x,y) WITH Iface^ DO X2:=x; Y2:=y; END; END Plot; PROCEDURE ColourAt(x,y:CARDINAL):CARDINAL; (* Get colour at (x,y) *) BEGIN RETURN GetPixel(x,y) END ColourAt; PROCEDURE LineTo(x,y:CARDINAL); BEGIN SetColourPlanes; WITH Iface^ DO X1:=x; Y1:=y; DrawLine; X2:=x; Y2:=y; END; END LineTo; PROCEDURE Line(x1,y1,x2,y2:CARDINAL); BEGIN SetColourPlanes; WITH Iface^ DO X1:=x1; Y1:=y1 X2:=x2; Y2:=y2; DrawLine; END; END Line; PROCEDURE SetScreenSize; BEGIN WITH Iface^ DO XMINCL:=0; YMINCL:=0; XMAXCL:=ScreenWidth[CurrentResolution]-1; YMAXCL:=ScreenHeight[CurrentResolution]-1; (* CASE CurrentResolution OF Low: VPLANES:=4; | Medium: VPLANES:=2; | High: VPLANES:=1; END; *) END; END SetScreenSize; PROCEDURE EraseScreen; BEGIN bconout(2,1bh); bconout(2,ORD('E')); bconout(2,1bh); bconout(2,ORD('v')); SetScreenSize; END EraseScreen; PROCEDURE UseXOR; (* Graphics will use XORing *) BEGIN Iface^.WMODE:=2; END UseXOR; PROCEDURE UseReplace; (* Graphics will mask and OR *) BEGIN Iface^.WMODE:=0; END UseReplace; VAR OriginalColour:PalleteArray; PROCEDURE SetColour(C:CARDINAL; R,G,B:CARDINAL); VAR j:CARDINAL; BEGIN j:=setColor(R*256+G*16+B,C); END SetColour; PROCEDURE GetOriginalColours; VAR c:CARDINAL; BEGIN FOR c:=0 TO 15 DO OriginalColour[c]:=setColor(65535,c); END; END GetOriginalColours; PROCEDURE ResetColours; VAR c:CARDINAL; BEGIN FOR c:=0 TO 15 DO OriginalColour[c]:=setColor(OriginalColour[c],c); END; (* setPallete(OriginalColour); *) END ResetColours; BEGIN GetOriginalColours; AInit(Iface,Fonts); WITH Iface^ DO X2:=0; Y2:=0; WMODE:=0; LNMASK:=0ffffh; LSTLIN:=-1; Colour(0); PATPTR:=ADR(Pattern); PATMSK:=4; SolidPattern; MFILL:=0; CLIP:=0; SetScreenSize; END; UponTermination(ResetColours); END SmallGraphics. */