	PAGE 60
	ENTRY PUTP,PUTPBD,PUTPDE,MULTAC
	PUBLIC XBEAM,YBEAM,XMIN,YMIN,XMAX,YMAX
	.Z80
	.COMMENT #

Subroutine  PUTP  setzt einen Semi-Graphik-Punkt (x,y) dunkel (Pen = 0)
oder hell (Pen <> 0).

Einsprung ueber Entry
- PUTP   mit Adresse von x in HL, Adr.von y in DE und Adr.von Pen in BC.
	 ( z.B. FORTRAN-Aufruf  CALL PUTP(IX,IY,IP) )
- PUTPBD mit x in BC, y in DE und Pen in A
	 In beiden Faellen gelten die Koordinaten bezgl. des Fensters
	 XMIN <= x <= XMAX und YMIN <= y <= YMAX.
	 Falls die Grenzen ueberschritten sind, wird nicht geplottet.
- PUTPDE mit x in E, y in D und Pen in A
	 Hier werden absolute Schirmkoordinaten erwartet.
	 Die Grenzen werden nicht abgetestet.

Die Byte- und Bit-Position im Video-RAM wird wie folgt bestimmt:
x' = x+XMIN	x"=[x'/2]
y' = y+YMIN	y"=[y'/4]
B  = 4*(x' mod 2) + 3 - (y' mod 4)	Bit-Pos. in Reg. B
DE = VRAMA + (LINES - 1 - y")*COLS + x"	Attribut-Byte-Pos. im Video RAM
HL = COFFS + DE				Char.-Byte-Pos.

Bitkombinationen mit gesetztem 7.Bit werden als invertiertes Komplement
dargestellt (Attribut-Bit 0 gesetzt).

Die globalen Variablen XBEAM und YBEAM enthalten die momentane Plott-
Position. Sie wird von den Routinen MOVETO und LINETO benutzt.
Die globalen Variablen XMIN,YMIN und XMAX,YMAX enthalten die Grenzen
des momentanen Plott-Fensters. Sie werden mit der Routine WINDOW gesetzt.

A.Herrmann	20.11.83
#
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 02		; Attribut fuer graf. Zeichensatz
;
PUTP:	LD A,(BC)	; Pen in A
	LD C,(HL)
	INC HL
	LD B,(HL)	; x in BC
	EX DE,HL
	LD E,(HL)
	INC HL
	LD D,(HL)	; y in DE
;
PUTPBD:	LD HL,(XMIN)
	PUSH HL
	ADD HL,BC
	LD B,H
	LD C,L		; x' in BC
	POP HL
	SCF
	SBC HL,BC
	JP P,PUTP10	; x' < XMIN ?
	LD HL,(XMAX)
	SCF
	CCF
	SBC HL,BC
	JP C,PUTP10	; x' > XMAX ?
	LD HL,(YMIN)
	PUSH HL
	ADD HL,DE
	EX DE,HL	; y' in DE
	POP HL
	SCF
	SBC HL,DE
	JP P,PUTP10	; y' < YMIN ?
	LD HL,(YMAX)
	SCF
	CCF
	SBC HL,DE
	JP C,PUTP10	; y' > YMAX ?
;
	LD D,E		; D=y'
	LD E,C		; E=x'
;
PUTPDE:	PUSH AF		; Save Pen in A
	LD A,D
	AND 3
	NEG
	ADD A,3
	LD B,A		; Bit-Pos. fuer y
	SRL D
	SRL D		; D = y"
	SRL E		; E = x"
	JR NC,PUTP1
	SET 2,B		; Bit-Pos. fuer x
PUTP1:	LD A,B
	LD B,1
	OR A
	JP Z,PUTP3
PUTP2:	SLA B
	DEC A
	JP NZ,PUTP2
PUTP3:	LD A,LINES-1
	SUB 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
	OUT (VPORT),A
	LD A,(DE)	; Lies Attribut Byte
	OUT (VPORT),A
	BIT 1,A		; Im Graphic Char.Set?
	JR NZ,PUTP4
	XOR A		; Nein, erstes Grafik-Bit.
	LD C,A
	JR PUTP5
PUTP4:	BIT 0,A		; Ja, invertiertes Komplement
	OUT (VPORT),A
	LD C,(HL)	; des Grafik-Byte ?
	OUT (VPORT),A
	JR Z,PUTP5
	LD A,C
	CPL		; Ja, komplementieren.
	LD C,A
PUTP5:	POP AF
	OR A
	JP Z,PUTP6	; Pen = 0 ?
	LD A,C
	OR B		; Nein, Bit dazu.
	JP PUTP7
PUTP6:	LD A,B
	CPL
	AND C		; Ja, Bit weg.
PUTP7:	BIT 7,A		; Komplement noetig?
	JR Z,PUTP8
	CPL
PUTP8:	OUT (VPORT),A
	LD (HL),A	; Schreibe Grafik-Byte
	LD A,GCS
	JR Z,PUTP9	; Invertierungs-Bit noetig?
	INC A
PUTP9:	LD (DE),A	; Schreibe Attribut-Byte
	OUT (VPORT),A
PUTP10:	RET		; Exit
;
;
; Subroutine  MULTAC
; multipliziert den Akku mit Register C und liefert das Ergebnis in HL.
; (nach L.A.Leventhal Z80 Assembly Language Programming  p.8-11)
;
MULTAC:	PUSH BC
	PUSH DE
	LD E,A
	LD D,0
	LD A,C
	LD HL,0
	LD B,8
MULT:	ADD HL,HL
	RLA
	JR NC,CHCNT
	ADD HL,DE
CHCNT:	DJNZ MULT
	POP DE
	POP BC
	RET
;
XMIN:	DW 0		; min. und
XMAX:	DW 159		; max. x Koord.
YMIN:	DW 0		; min. und
YMAX:	DW 95		; max. y Koord.
XBEAM:	DW 0		; momentane
YBEAM:	DW 0		; Plottkoord.
;
	END



