file MBP.INC ingedikte versie van PIXELS6.INC auteur: Rene van der Schans, augustus 1986 ingedikt: 29 november 1988 TYPE AttrBMCTabel=ArrayCO..2551 QF Integer; PROCEDURE Ma a k Bee 1 d Pr en t StartSegAdr.StartOFsAdr:Integer; adres van de byte in de beeldmatrix die linksboven in de prent moet komen AantalBytesPerRij:Integer; aantal bytes op een rij in de beeldmatrix AantalKolommenAantalRiJen:Integer; grootte van de uitsnede uit de beeldmatrix XLinksBovenYLinksBovenIntegerplaats van de prent op het scherm BitplanesActie-f: Integer; hexadecimaal getal$1011 betekent, dat alleen op de bitplanes 1, 2 en 4 wordt getekend VAR OmzetTabelAttrBMCTabeltabel met de Bitplane Mapping Codes voor de attributen CO..255] in de beeldmatrix voorbeeld van aanroep: j MaakBeeldPrent Seg (BldMatC0,0]) ,0-f s (BldMat [0,0]) ,128,128,128,0,0,$1111OmzetTabel VAR R,k,AR,AK:Integer; APrBytes:Integeraantal bytes op een prentlijn BSABOA: Integersegment- en o-ffsetadres in de beeldmatrix Bi tPlaneNrByte; BMC:ArrayCO..639] 0F Integer; XLB,YLB,YBovenYOnderDeltaXInteger; BPA:ArrayC14] 0F Boolean; actieve bitplanes BitPlaneSeg:Integer; PROCEDURE TekenRijPixels; voor het opbouwen van een regel pixels van drie beeldlijnen hoog TYPE PrentLijn=Array[0.79] 0F Byte; VAR K,BP:Byte; PrLnl,PrLn2:PrentLijn; Hulp,Y,Y0FFset:Integer; BEGIN F0R BitPlaneNr:=1 TO 4 DO IF BPACBitPlaneNr] THEN BEGIN Bi tplaneSeg:=$A000+(Bi tplaneNr-1*$800; BP: (BitPlaneNr1SHL 2; 1 prentlijnen vullen: FOR K:=0 TO APrBytes DO BEGIN bepaal patroon voor linker matrixelements CASE (BMCCK SHL 1] SHR BP) AND 15 OF 0: Hulp:=$0000; 2: Hulp:=$A050; 4: Hulp:=$F0F0; END; van CASE combineer met patroon voor rechter matrixelement: CASE (BMCCsucc(K SHL 1)] SHR BP) AND 15 OF 0: 2: Hulp:=Hulp OR $0A05; 4: Hulp:=Hulp OR $0F0F; END; van CASE verdelen over twee prentlijnen: PrLnlCK]s=Hi(Hulp); PrLn2IK]:=Lo(Hulp) END; opgebouwde prentlijnen wegschrijven naar het schermgeheugen: FOR Y:YBoven TO YOnder DO BEGIN Y0fFset:=(Y AND 3) SHL 13 (Y AND -4) SHL 4 (Y AND -4) SHL 2; CASE (Y AND 1) OF 0: Move(PrLnlCO],MemCBitPlaneSegYOfFset+XLB SHR 3]APrBytes+1 1: Move (PrLn2C0]MemCBi tPl aneSeg, YO-f T set+XLB SHR 3]APrBytes+1 END; van CASE END; END; END; TekenRijPixels BEGIN MaakPi :<el Beel d welke bitplanes doen mee-7: FOR K:=0 TO 3 DO IF (BitplanesActief SHR (K SHL 2) AND 1) 1 THEN BPACK+1=TRUE ELSE BPA[K+1=FALSE; tellers goed zetten: AR:=AantalRijen-1AK:=AantalKolommen-1; prent altijd op een bytegrens starten: XLB:=(XLinksBoven SHR 3) SHL 3; DeltaX:=XLinksBoven-XLB; YBoven=YLinksBoven; YOnder=YBoven+2; IF (StartOfsAdr>0) AND (StartOTsAdr DeltaX) THEN BEGIN BSA:=StartSegAdr-lBOA:=Start0tsAdr+16; END ELSE BEGIN BSA:=StartSegAdrBOA:=StartOFsAdr; END; een eventuele linkerpixel in de byte wordt opmeuw afgebeeld: BOA:=BOA-DeltaX SHR 2; Ak:=Ak+DeltaX SHR 2; aantal bytes op een prentlijn bepalen: APrBytes:=AK SHR 1; AK:=APrBytes SHL 1 1; nu kan het afbeelden van de rijen matrixelementen beginnen: FOR R:=0 TO AR DO BEGIN segmentadres in matrix aanpassen, als offset wat groot is: IF B0A<0 >32767 THEN BEGIN BSA:=BSA+$800; BOA:=B0A-$8000: END: waarden in beeldmatrix omzetten in Bitplane Mapping Codes: FOR K:=0 TO Ak DO BMCIK]=0mzetTabel[Mem[BSA:BOA+k] i pixels op de bitplanes zetten: TekenRijPixels; volgende rij pixels: YBoven=YBoven+3; YOnder=Y0nder+3; offset in beeldmatrix verhogen: BOA: =BOA+Aantal BytesF'erRi j END; END; MaakBeeldPrent Het principe is, dat een tweetal PrentLijnen (PrLnl en PrLn2) wordt gevuld met de juiste opeenvolging van puntjes om later gekopieerd te worden naar het bitplane. Met p'a- troontjes 4*3 heb je altijd twee beeldlijnen met dezelfde in- houd (bij 8*6 zelfs twee maal drie), dus waarom zou je die niet een keer opbouwen en meer keren gebruiken? Het videogeheugen is samengesteld uit bytes die elk afzon- derlijk overeenkomen met 8 puntjes naast elkaar op het scherm. In de procedure wordt er nu voor gezorgd, dat deze bytes worden gevuld met de bits benodigd voor twee naast el kaar gelegen vlakjes van 4*3 punten. Het vullen gebeurt, door per matrixelement de BMC met enig SHL/SHR- geschuif te ontleden tot de voor bitplane 3 toepasselijke en daarbij de patroonkodes voor twee PrentLijnen tegelijk op te halen. Voor het matrixelement met waarde 161, dat 'links' in de bytes van het videogeheugen moet worden afgebeeld, wor den twee (om snelheidsredenen samen in een integer verenig- de) bytes gevuld, met AO (10100000) bestemd voor de ene prentlijn en 50 (01010000) voor de andere. Het matrixelement met waarde 170 komt rechts en de daarbij behorende bytes 0A (00001010) en 05 (00000101) worden direct geORd met de al door het linker matrixelement gevulde bytes. De nu verkre- gen patroonkode wordt met de Hi- en Lo-funkties van Turbo Pascal eerlijk verdeeld over de PrentLijnen PrLnl en PrLn2, waarna het volgende paar matrixelementen deze operatie kan ondergaan. Met oneven aantallen matrixelementen heeft de procedure geen moeite. Wanneer beide PrentLijnen zijn gevuld worden ze met Move gekopieerd naar het onderhanden zijnde bitplane, hier 3. Er wordt rekening mee gehouden, of de 4*3 patroontjes op een even of oneven beeldlijn beginnen. Daarna wordt het volgen de bitplane met drie beeldlijnen gevuld, en wanneer dat ge- beurd is komt de volgende rij elementen uit de BeeldMatrix aan de beurt. Het resultaat van dit horlogemakerswerk is, dat een volledige matrix 128*128 in 4 seconden op het scherm Staat. Met ma- chinekode kan het nog veel sneller, maar dat is voor de echte liefhebber, en loont voor deze toepassing niet de moeite. KT 1989.XV.1 65

Digitale Tijdschriftenarchief Stichting De Hollandse Cirkel en Geo Informatie Nederland

Kartografisch Tijdschrift | 1989 | | pagina 67