	PAGE 60
	ENTRY GETG
	EXT XMING,YMING,XMAXG,YMAXG,MULTAC
	.Z80
	.COMMENT #

GETP(IX,IY,IP)  liefert den Grauwert IP (0..15) vom Pixel IX,IY.

		Die Koordinaten beginnen mit 1,1 (links oben!).
ACHTUNG!!	Die Pixel sind zwar mit x,y-Koordinaten anzugeben,
		aber y=1 ist oben und waechst nach unten.

Einsprung ueber Entry  GETG  mit Adresse von x in HL, von y in DE
und von IP in BC.
Die Koordinaten gelten bezgl. des Fensters XMING <= x-1 <= XMAXG und
YMING <= y-1 <= YMAXG.
Falls die Grenzen ueberschritten sind oder das Video-Byte kein Grauwert-
Zeichen ist, ist IP = 0.

Die Byte-Position im Video-RAM wird wie folgt bestimmt:
x' = x-1+XMING
y' = y-1+YMING	y"=[y'/2]
DE = VRAMA + y"*COLS + x'	Attribut-Byte-Pos. im Video RAM
HL = COFFS + DE			Char.-Byte-Pos.

Falls y' mod 2 = 0, steht der Grauwert im unteren Halb-Byte von B,
falls y' mod 2 = 1, im oberen Halb-Byte von B.
Grauwerte groesser als 7 im oberen Halb-Byte (unteres Pixel) werden durch 
Invertierung dargestellt (Attribut-Bit Nr.0 gesetzt). Das untere Halb-Byte 
wird entsprechend komplementiert.

Die externen Variablen XMING,YMING und XMAXG,YMAXG im Modul PUTG enthalten
die Grenzen des momentanen Plott-Fensters. Ihr Wertebereich ist 0,0 bis 79,47.
Sie werden mit der Routine WINDWG gesetzt.

A.Herrmann	23.02.85
#
LINES	EQU 24		; Zeilen auf Bildschirm
COLS	EQU 80		; Spalten auf Bildschirm
VRAMA	EQU 0E000H	; Video RAM Adresse der Attribute
COFFS	EQU 00800H	; Offset zur Video RAM Adresse der Zeichen
VPORT	EQU 28H		; Video Port Adresse
GCS	EQU 12H		; Attribut fuer Grauwert-Zeichensatz
;
GETG:	PUSH BC		; Rette Pointer auf Ausgangsvariable
	LD C,(HL)
	INC HL
	LD B,(HL)
	DEC BC		; x-1 in BC
	EX DE,HL
	LD E,(HL)
	INC HL
	LD D,(HL)
	DEC DE		; y-1 in DE
;
	XOR A		; Ausgangswert init.
	LD HL,(XMING)
	PUSH HL
	ADD HL,BC
	LD B,H
	LD C,L		; x' in BC
	POP HL
	SCF
	SBC HL,BC
	JP P,GETG6	; x' < XMING ?
	LD HL,(XMAXG)
	SCF
	CCF
	SBC HL,BC
	JP C,GETG6	; x' > XMAXG ?
	LD HL,(YMING)
	PUSH HL
	ADD HL,DE
	EX DE,HL	; y' in DE
	POP HL
	SCF
	SBC HL,DE
	JP P,GETG6	; y' < YMING ?
	LD HL,(YMAXG)
	SCF
	CCF
	SBC HL,DE
	JP C,GETG6	; y' > YMAXG ?
;
	LD D,E		; D=y'
	LD E,C		; E=x'
;
	BIT 0,D		; y' mod 2 = 0 ?
	PUSH AF		; Flag retten
	SRL D		; D = y"
	LD A,D
	LD C,COLS
	CALL MULTAC	; HL = A*C
	LD D,0
	ADD HL,DE
	LD DE,VRAMA
	ADD HL,DE	; Attribut-Byte Adresse
	LD DE,COFFS
	EX DE,HL
	ADD HL,DE	; Character-Byte Adresse
	DI
	OUT (VPORT),A
	LD A,(DE)	; Lies Attribut Byte
	OUT (VPORT),A
	EI
	BIT 1,A		; Grauwert-Zeichen?
	JR Z,GETG3
	BIT 4,A
	JR NZ,GETG4
GETG3:	POP AF		; Nein, Ausgabe = 0
	XOR A
	JR GETG6
GETG4:	BIT 0,A		; Ja, invertiertes Komplement
	DI
	OUT (VPORT),A
	LD C,(HL)	; des Zeichen-Byte ?
	OUT (VPORT),A
	EI
	JR Z,GETG5
	LD A,0FFH	; Ja, komplementieren.
	SUB C
	LD C,A
GETG5:	POP AF		; oberes Halb-Byte?
	LD A,C
	JR Z,GETG51
	SRL A		; Ja, nach unten schieben
	SRL A
	SRL A
	SRL A
GETG51:	AND 0FH		; und maskieren.
GETG6:	POP BC
	LD (BC),A	; In Ausgangsvariable schreiben
	RET		; Exit
;
	END
