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