***********************************
*      Schnelle Linienroutine
*
* Assembler: ATMAS-II
*
* Peter Finzel                 1987
***********************************
*
* IOCB-Struktur, CIO-Befehle...
*
ICCOM	EQU $342
ICBAL	EQU $344
ICBAH	EQU $345
ICAX1	EQU $34A
ICAX2	EQU $34B
CIOV	EQU $E456	CIO-Vektor
COPEN	EQU 3
CCLSE	EQU 12
*
* Betriebssystem-Variable
*
SAVMSC	EQU $58	Bildschirm-Adresse
*
* Konstante fuer GRAPHICS 6
*
YMAX	EQU 96	Aufloesung vert.
XMAX	EQU 160	Aufloesung hor.
ZLAENGE	EQU 20	Bytes pro Zeile
*
* Zeropage-Variable
*
XNEU	EQU $E0	(Byte) Endpunkt X
YNEU	EQU $E1	(Byte) Endpunkt Y
XALT	EQU $E2	(Byte) Startpunkt X
YALT	EQU $E3	(Byte) Startpunkt Y
ZAEHLER	EQU $E4	(Byte) Pixelzaehler
DELTAX	EQU $E5	(Byte) Abstand X
DELTAY	EQU $E6	(Byte) Abstand Y
XFLAG	EQU $E7	(Byte) Merker links/rechts
YFLAG	EQU $E8	(Byte) Merker oben/unten
HILFA	EQU $E9	(Word) Hilfsregister
HILFB	EQU $EB	(Word) fuer Naeherung
HILFT	EQU $ED	(Word)
ZEIGER	EQU $EF	(Word) Vektor f. Plot

* 
* Zwei Makros fuer 16-Bit Zahlen... 
* 
ADD	MACRO P1,P2 
	CLC 
	LDA P2 
	ADC P1 
	STA P2 
	LDA P2+1 
	ADC P1+1
	STA P2+1 
	MEND 

SUB	MACRO P1,P2,P3 
	SEC 
	LDA P1 
	SBC P2 
	STA P3 
	LDA P1+1 
	SBC #0 
	STA P3+1 
	MEND
*
	ORG $A800	im res. Bereich
***********************************
* Demo-Programm 'Hilights' 
***********************************
*
* GRAPHICS 6+16 
*
	LDA #6+16	GRAPHICS 7 
	JSR GRAPHICS	ganzen Screen 
	JSR PLOTAB	Tabellen... 
DEMO	LDA #0	Linienstart 
	STA XSTART
DEMO2	LDA #160	Linienende 
	STA XENDE

DEMO1	LDA XSTART	Anfangspunkt 
	STA XALT	setzen (X & Y)
	LDA #0
	STA YALT 
	LDX XENDE	Endpunkt setzen 
	LDY #95 

	JSR DRAWTO	Linie zeichnen 

	SEC	neue Koordinaten 
	LDA XENDE	berechnen
	SBC #20 
	STA XENDE 
	BNE DEMO1 
	CLC 
	LDA XSTART	Startpunkt 
	ADC #39 
	STA XSTART
	CMP #160 
	BCC DEMO2 
	JMP DEMO	Endloses Demo 
* 
* Variablen Demoprogramm
* 
XSTART	DFB 0 
XENDE	DFB 0 
* 
************************************* 
* Schnelle Berechnung von Linien 
* 
* Parameter: XALT,YALT: Startpunkt 
*           <X>,<Y>   : Endpunkt
************************************* 
* 
DRAWTO	STX XNEU	Endpunkt merken 
	STY YNEU
	LDX XALT	Anfangspunkt
	LDY YALT	zeichnen
	JSR PLOT
	LDA #0	Flags ruecksetzen
	STA XFLAG
	STA YFLAG
	LDX XNEU	Endpunkt in Register
	LDY YNEU	(einfacher)

	CPX XALT	Anfang = Ende?
	BNE DR1
	CPY YALT
	BNE DR1
 	RTS		ja fertig!==>

DR1	CPX XALT	Neuer Punkt ist
 	BCC DRX		links von alten P.->
 	INC XFLAG	rechts!
	TXA	Delta ausrechnen
	SBC XALT
	JMP DR2

DRX	DEC XFLAG	links!
	SEC
 	LDA XALT	Delta her.
 	SBC XNEU

DR2	STA DELTAX	Abstand merken
 	CPY YALT	neuer Punkt ist
 	BCC DRY	oberhalb alten P. 
 	INC YFLAG	unterhalb
 	TYA
 	SBC YALT	Delta berechnen
	JMP DR3

DRY	DEC YFLAG	oberhalb
	SEC
	LDA YALT	Abstand (delta)
	SBC YNEU

DR3	STA DELTAY	und merken
	LDA XALT	Neuer P.= alter P.
	STA XNEU
	LDA YALT
	STA YNEU
	LDA DELTAX	welches Delta ist
	CMP DELTAY	groesser?
	BCC DRYSTEP	DY ist groesser->

	LDA DELTAY	DX ist groesser!
	ASL
	STA HILFA	Naeherung fuer
	LDA #0	Schrittweite
	ROL
	STA HILFA+1

	SUB HILFA,DELTAX,HILFT
	SUB HILFT,DELTAX,HILFB
	LDA DELTAX	Zaehler fuer
	STA ZAEHLER	Pixels einrichten

DXSCHL	CLC
	LDA XNEU	X weiterzaehlen
	ADC XFLAG
	STA XNEU
	LDA HILFT+1	Schritt nach Y
	BPL DRX5	erfoderlich? Ja->
	ADD HILFA,HILFT
	JMP DRX4	kein Schritt

DRX5	CLC 
	ADD HILFB,HILFT
	CLC
	LDA YNEU	Schritt nach Y
	ADC YFLAG	ausfuehren
	STA YNEU

DRX4	LDX XNEU	Pixel plotten
	LDY YNEU
	JSR PLOT
	DEC ZAEHLER	ganzes Deltax
	BNE DXSCHL	abgefahren? nein->
	JMP DREND fertig !==>

DRYSTEP	LDA DELTAX	Delta Y war groesser
	ASL
	STA HILFA	Naeherung fuer
	LDA #0	Schritt in X-Richt.
	ROL
	STA HILFA+1

	SUB HILFA,DELTAY,HILFT
	SUB HILFT,DELTAY,HILFB

	LDA DELTAY	Zaehler fuer Abstand
	STA ZAEHLER	einrichten

DYSCHL	CLC
	LDA YNEU	Y weiterzaehlen
	ADC YFLAG
	STA YNEU
	LDA HILFT+1	Schritt nach X
	BPL DRY5	noetig? ja ->
	ADD HILFA,HILFT
	JMP DRY4	keine X-Korrektur

DRY5	ADD HILFB,HILFT
	CLC
	LDA XNEU	X-Korrektur aus-
	ADC XFLAG	fuehren
	STA XNEU
DRY4	LDX XNEU	Pixel ausgeben
	LDY YNEU
	JSR PLOT
	DEC ZAEHLER	alle Punkte?
	BNE DYSCHL	nein —->

DREND	LDX XNEU	Ende der Linie
	LDY YNEU	kann Anfang einer
	STX XALT	neuen sein.
	STY YALT
	RTS	fertig !

************************************* 
* GRAPHICS-Unterprogramm
*
* Aufruf: JSR GRAPHICS
* PARAMETER:
* <A> 0 bis 15 (XL/XE)
*     0 bis 11 (400/800)
************************************* 
GRAPHICS	PHA	Graphik-Stufe merken
	LDX #$60	IOCB Nr. 6
	LDA #CCLSE	Screen-IOCB zuerst
	STA ICCOM,X	schliessen
	JSR CIOV
	PLA 	Graphik-Stufe
	STA ICAX2,X	zurueckholen
	AND #$F0	und passende
	EOR #$10	Bit-Kombination
	ORA #$0C	fuer Händler
	STA ICAX1,X	herstellen
	LDA #COPEN	jetzt den Befehl
	STA ICCOM,X	zum Oeffen des Screens
	LDA #SDEVICE	Zeiger auf Device-
	STA ICBAL,X	bezeichnung
	LDA #SDEVICE/256
	STA ICBAH,X
	JSR CIOV
	RTS

SDEVICE	ASC "S:"	Display-Handler

************************************* 
* HI-SPEED PLOT fuer Einfarb-Modi
* Aufruf: JSR PLOT
*
* PARAMETER:
* <X>,<Y> je nach Graphikstufe
*         X,Y werden zerstoert!
************************************* 
PLOT	CPY #YMAX	Grenzen
	BCS PLOTEND	pruefen
	CPX #XMAX
	BCS PLOTEND
	LDA ADRLO,Y	Bildschirm-
	STA ZEIGER	adresse
	LDA ADRHI,Y	in Zeropage
	STA ZEIGER+1
	TXA
	LSR	;geteilt
	LSR	;durch 8
	LSR
	TAY	;Index f. X-Pos
	TXA	;X-Position
	AND #7
	TAX
	LDA PIXTAB,X	Welches Pixel
	EOR (ZEIGER),Y	und Pixel manipulieren
	STA (ZEIGER),Y	zurueck in Graphik
PLOTEND	RTS

************************************* 
* Erzeugt Adresstabellen fuer Plot
*
* muss vor der ersten Verwendung von
* Plot und nach dem GRAPHICS-Befehl
* stehen!
************************************* 
PLOTAB	LDA SAVMSC	Anfangsadresse
	STA ZEIGER	des Video-Rams
	LDA SAVMSC+1
	STA ZEIGER+1
	LDY #0	Index auf 0
NXTADR	LDA ZEIGER	Adresstabellen
	STA ADRLO,Y	aufbauen
	LDA ZEIGER+1	MSB-Tabelle
	STA ADRHI,Y
	CLC
	LDA ZEIGER	Adresse des
	ADC #ZLAENGE	naechsten Zeilen
	STA ZEIGER	anfangs berechnen
	LDA ZEIGER+1
	ADC #0
	STA ZEIGER+1
	INY
	CPY #YMAX	schon f. alle Zeilen?
	BNE NXTADR	nein — >
	RTS
*
* ab hier stehen die Tabellen
*
PIXTAB	DFB 128,64,32,16,8,4,2,1
ADRLO	ORG *+YMAX	Platz fuer
ADRHI	ORG *+YMAX	Tabellen
