	subroutine draw
#
# Malen eines Bildes ueber Tastatur. Alle Punktkoordinaten gelten
# bezgl. des Ursprungs links unten.
#
# Verwendete externe Routinen, die nicht in FORLIB sind:
# Name		Bibliothek,File
# ibadr		RGEN		berechnet Pixel-Adresse in Bank 1
# loadb		BANKLIB		holt ein Byte aus Bank 1
# storeb	BANKLIB		schreibt ein Byte nach Bank 1
# window	PLOTLIB		setzt das Plott-Fenster
# frame		PLOTLIB		plottet den Rahmen
# putp		PLOTLIB		plottet einen Punkt
# rescur	DRAW		setzt die Cursor-Nachbarschaft
# savcur	DRAW		rettet die Cursor-Nachbarschaft
# putcur	DRAW		plottet den Cursor
# setpix	DRAW		setzt ein Pixel
# getpix	DRAW		holt ein Pixel
#
# Version 1.0	15.08.84
#
logical	wait		# Wait for Key hit
logical	drawin		# Zeichnen/loeschen
#
byte	g,gg		# Grauwerte
byte	char		# Input Character
byte	cursor(3,3)	# Cursor Feld
byte	inkey		# liefert Keyboard-Zeichen
#
integer	xanz,yanz,	# Bildgrenzen
	gwmax		# max.Grauwert
integer	adrb		# Adresse in Bank 1
integer	h		# Hilfsgroesse
integer	i,j,k		# Laufindizes
integer	x0,y0		# neue und
integer	x1,y1		# alte Cursorposition
integer	xi,yi
integer	pen		# Pen up/down
integer pon,pof		# Plott-Pen on/off
integer	ibadr		# function, liefert Adresse in Bank 1
# 
common	/bild/adrb,xanz,yanz,gwmax
common	/neig/cursor
#
data	pon,pof/1,0/
data	wait/.true./
#
write(1,100) 
100 format('1DRAW'//)
write(1,102)
102 format(' B C  =7')	# Fenster 0 auf 0,0 bis 29,24
write(1,110)
write(1,111)
write(1,112)
write(1,113)
write(1,114)
write(1,115)
write(1,116)
110 format('  Key      Cursor')
111 format('   8         up')
112 format(' 4   6   left  right')
113 format('   2        down')
114 format('0  5     pen up/down')
115 format('   -     draw/erase')
116 format('  <CR>      End',//)
#
# Plotte Bild rechts unten 
#
x0=158-xanz ; y0=0 ; x1=x0+xanz+1 ; y1=y0+yanz+1
call window(x0,y0,x1,y1)
call frame
do yi=1,yanz
[	i=yanz-yi+1
	do xi=1,xanz
	[	k=ibadr(xi,yi)
		call loadb(g,k)
		if (g==0) call putp(xi,i,pon)
]	]
#
x0=ifix(float(xanz)/2) ; y0=ifix(float(yanz)/2)
call savcur(x0,y0)				# save cursor neighborhood
call putcur(x0,y0)				# plot cursor
pen=pof ; drawin=.true.
write(1,122) drawin,x0,y0
122 format('+Pen up   - Draw = ',l1,2i4)
123 format('+Pen down - Draw = ',l1,2i4)
#
repeat
[	x1=x0 ; y1=y0				# old cursor position
	char=inkey(wait)			# wait for key input
	if (char==45)
	[	if (drawin) drawin=.false.
		else drawin=.true.
		goto 99
	]
	char=char-48
	if (char<<0) break
	if (char==5)	[ if (pen==pon)	pen=pof
			  else		pen=pon
			]
	else if (char==1)	[ x0=x0-1 ; y0=y0-1 ]
	else if (char==2)	[ y0=y0-1 ]
	else if (char==3)	[ x0=x0+1 ; y0=y0-1 ]
	else if (char==4)	[ x0=x0-1 ]
	else if (char==6)	[ x0=x0+1 ]
	else if (char==7)	[ x0=x0-1 ; y0=y0+1 ]
	else if (char==8)	[ y0=y0+1 ]
	else if (char==9)	[ x0=x0+1 ; y0=y0+1 ]
	#
	x0=max0(1,min0(x0,xanz)) ; y0=max0(1,min0(y0,yanz))
	#
99	call rescur(x1,y1)			# restore old neighborhood
	if (pen==pon)
	[	write(1,123) drawin,x0,y0
		call setpix(x0,y0,drawin)	# set/erase pixel
	]
	else	write(1,122) drawin,x0,y0
	call savcur(x0,y0)			# save new neighborhood
	call putcur(x0,y0)			# plot new cursor position
] until (.false.)
#
write(1,104)
104 format(' C  o7')		# Fenster 0 auf 0,0 bis 79,23
#
return
end


	subroutine setpix(x,y,drawin)
#
# setzt das Pixel x,y auf 0 (schwarz), falls drawin=true, sonst auf 1.
# x,y sind die Koord. bezgl. des Ursprungs links unten.
#
# Verwendete externe Routinen, die nicht in FORLIB sind:
# Name		Bibliothek,File
# ibadr		RGEN		berechnet Pixel-Adresse in Bank 1
# storeb	BANKLIB		schreibt ein Byte nach Bank 1
#
logical drawin
byte	g
integer x,y,k
integer	adrb,xanz,yanz,gwmax
integer	ibadr		# function, liefert Pixel-Adresse in Bank
#
common	/bild/adrb,xanz,yanz,gwmax
#
k=yanz-y+1 ; k=ibadr(x,k)
if (drawin) g=0
else g=gwmax
call storeb(g,k)
return
end


	logical function getpix(x,y)
#
# liefert den Grauwert von Pixel x,y.
#
# Verwendete externe Routinen, die nicht in FORLIB sind:
# Name		Bibliothek,File
# ibadr		RGEN		berechnet Pixel-Adresse in Bank 1
# loadb		BANKLIB		holt ein Byte aus Bank 1
#
byte	g
integer x,y,k
integer	adrb,xanz,yanz
integer	ibadr		# function, liefert Pixel-Adresse in Bank
#
#
common	/bild/adrb,xanz,yanz
#
k=yanz-y+1 ; k=ibadr(x,k) ; call loadb(g,k) ; getpix=g
return
end


	subroutine rescur(x,y)
#
# holt die 3x3-Nachbarschaft des Punktes x,y aus dem Feld cursor
# und plottet sie ins Bild.
#
# Verwendete externe Routinen, die nicht in FORLIB sind:
# Name		Bibliothek,File
# putp		PLOTLIB		plottet ein Pixel
#
byte	g
byte	cursor(3,3)	# Cursor Feld
#
integer	x,y,xi,yi,i,j
integer	adrb,xanz,yanz
#
common	/bild/adrb,xanz,yanz
common	/neig/cursor
#
do i=1,3
[	yi=y+i-2
	if (yi>=1 && yi<=yanz)
		do j=1,3
		[	xi=x+j-2
			if (xi>=1 && xi<=xanz)
			[	g=cursor(j,i)
				if (g==0) g=1
				else g=0
				call putp(xi,yi,g) ]
]		]
return
end


	subroutine savcur(x,y)
#
# rettet die 3x3-Nachbarschaft des Punktes x,y in das Feld cursor.
#
# Verwendete externe Routinen, die nicht in FORLIB sind:
# Name		Bibliothek,File
# getpix	DRAW		holt ein Pixel aus dem Bild
#
byte	cursor(3,3)	# Cursor Feld
byte	getpix		# function; liefert Pixel
#
integer	x,y,xi,yi,i,j
integer	adrb,xanz,yanz
#
common	/bild/adrb,xanz,yanz
common	/neig/cursor
#
do i=1,3
[	yi=y+i-2
	if (yi>=1 && yi<=yanz)
		do j=1,3
		[	xi=x+j-2
			if (xi>=1 && xi<=xanz) 
			[	cursor(j,i)=getpix(xi,yi) ]
]		]
return
end


	subroutine putcur(x,y)
#
# plottet den Cursor bei x,y ins Bild.
#
# Verwendete externe Routinen, die nicht in FORLIB sind:
# Name		Bibliothek,File
# putp		PLOTLIB		plottet ein Pixel
#
byte	g
byte	cursor(3,3)	# Cursor-Maske
#
integer	x,y,xi,yi,i,j
integer	adrb,xanz,yanz
#
common	/bild/adrb,xanz,yanz
#
data cursor/0,1,0,1,0,1,0,1,0/
#
do i=1,3
[	yi=y+i-2
	if (yi>=1 && yi<=yanz)
		do j=1,3
		[	xi=x+j-2
			if (xi>=1 && xi<=xanz)
			[	g=cursor(j,i) ; call putp(xi,yi,g) ]
]		]
return
end


	subroutine thick
#
# verdickt die schwarzen Pixels um ihre 3x3-Nachbarschaft.
#
# Verwendete externe Routinen, die nicht in FORLIB sind:
# Name		Bibliothek,File
# ibadr		RGEN		berechnet Pixel-Adresse in Bank 1
# loadb		BANKLIB		holt ein Byte aus Bank 1
# storeb	BANKLIB		schreibt ein Byte nach Bank 1
#
byte	g,gg		# Grauwert
#
integer	xanz,yanz,	# Bildgrenzen
	gwmax		# max.Grauwert
integer	adrb		# Adresse in Bank 1
integer	x,y,xi,yi
integer	i,j,k
integer	ibadr		# function, liefert Pixel-Adresse in Bank
#
common	/bild/adrb,xanz,yanz,gwmax
#
write(1,100) 
100 format('0THICK'//)
do yi=1,yanz				# nicht-schwarze Pixel weiss machen
[	do xi=1,xanz
	[	k=ibadr(xi,yi) ; call loadb(g,k)
		if (g>>0) call storeb(gwmax,k)
]	]
gg=1
do yi=1,yanz				# Umgebung der schwarzen inkrementieren
[	write(1,110) yi
	110 format('+Zeile',i4)
	do xi=1,xanz
	[	k=ibadr(xi,yi) ; call loadb(g,k)
		if (g==0)
		[	do i=1,3
			[	y=yi+i-2
				if (y>=1 && y<=yanz)
					do j=1,3
					[	x=xi+j-2
						if (x>=1 && x<=xanz)
						[	k=ibadr(x,y)
							call storeb(gg,k)
]	]	]	]		]	]
#
gg=0
do yi=1,yanz				# inkrementierte Pixel schwarz machen
[	do xi=1,xanz
	[	k=ibadr(xi,yi) ; call loadb(g,k)
		if (g==1) call storeb(gg,k)
]	]
return
end
