************************************
*         SOFTWARE-BLITTER     V1.02
* 
*       PUT/GET fuer Graphik
*        (Byte-Aufloesung)
* 
*  Peter Finzel                1996
************************************
*
ZLAENGE	EQU 40		Zeilenlaenge in BYTE
*
SAVMSC	EQU $58		Zeiger auf Video-RAM
*
* Variable in der Zero-Page
*
ZEIGER	EQU $D4		Pointer in Screen 
STRING	EQU $D6		Pointer in String 
BZAEHL	EQU $D8		Zaehler 
ORAND	EQU $D9		Koordinaten: oberer Rand 
LRAND	EQU $DA		linker Rand 
URAND	EQU $DB		unterer Rand 
RRAND	EQU $DC		rechter Rand 
BLAENGE	EQU $DD		Laenge fuer Blitter 
MODUS	EQU $DE		Modus fuer PUT 0: Oder 
* 			64:Exor      128: Pset 
*
	ORG $0600
*
* Sprungleiste
*
	JMP GET
	JMP PUT
*
* GET-Routine fuer Bildausschnitte 
* Aufruf:
* A=USR(1536,X1,Y1,X2,Y2,ADR(A$))
*
GET	CLD
	PLA		Anz. der Parameter 
	PLA		Linker Rand MSB
	PLA		Linker Rand LSB 
	STA LRAND
	PLA		Oberer Rand MSB
	PLA		Oberer Rand LSB
	STA ORAND
	PLA		Rechter Rand MSB
	PLA		Rechter Rand LSB
	STA RRAND
	PLA		Unterer Rand MSB
	PLA		Unterer Rand LSB
	STA URAND
	PLA		Adresse des Strings
	STA STRING+1
	PLA
	STA STRING
*
	SEC		Anz. der horizontalen 
	LDA RRAND	Bytes ermitteln 
	SBC LRAND
	BCS LENOK	ueberhaupt moeglich? 
	RTS		Linker > Rechter! 
*
LENOK	STA BLAENGE	Laenge merken 
	INC BLAENGE 	Laenge= R-L+l 
	SEC		Anzahl der Zeilen 
	LDA URAND	ermitteln
	SBC ORAND
	BCS HOEHOK	moeglich?
	RTS		Oben > Unten! 
*
HOEHOK	CLC		Zeilenanzahl 
	ADC #1		korrigieren
	STA URAND	und in URAND eintragen
	JSR PUTSTR	Hoehe und Breite des
	LDA BLAENGE	Ausschnittes im
	JSR PUTSTR	String eintragen
*
MSB1	JSR BERZEIG 	Zeiger in Video-Ram
*
* Soft-Blitter fuer GET
*
GETZEIL	LDY LRAND	linker Rand
	LDA BLAENGE 	Byte-Zaehler
	STA BZAEHL 	einrichten
GETBYTE	LDA (ZEIGER),Y	Wert aus Video/RAM
	JSR PUTSTR	in String ablegen
	INY		naechstes Byte
	DEC BZAEHL	schon ganze Zeile
	BNE GETBYTE	nein ->
	CLC		Zeiger auf naechste
	LDA ZEIGER	Zeile im Video-RAM
	ADC #ZLAENGE	richten (plus 40)
	STA ZEIGER
	BCC GET2	jetzt MSB
	INC ZEIGER+1
*
GET2	DEC URAND	schon alle Zeilen?
	BNE GETZEIL	nein -->
	RTS
*
* PUT-ROUTINE fuer Bildausschnitte
* Aufruf:
* A=USR(1539,X,Y,Mod,Adr(A$))
*
PUT	CLD
	PLA		Anz. der Parameter 
	PLA		Linker Rand MSB
	PLA		Linker Rand LSB 
	STA LRAND
	PLA		Oberer Rand MSB
	PLA		Oberer Rand LSB
	STA ORAND
	PLA		Modus-Byte MSB
	PLA		Modus-Byte LSB
	STA MODUS
	PLA		Adresse des Strings
	STA STRING+1
	PLA
	STA STRING
*
	JSR GETSTR 	Anzahl d. Zeilen
	STA URAND 	des Ausschnittes
	JSR GETSTR 	Hor. Laenge des
	STA BLAENGE	Ausschnittes
*
ERHZ2	JSR BERZEIG	Zeiger in Video-RAM
*
* Soft-Blitter fuer PUT
*
PUTZEIL	LDA BLAENGE
	STA BZAEHL	Zaehler Zeilenlaenge
	LDY LRAND	linker Rand
PUTBYTE	JSR GETSTR	Zeichen aus String
	BIT MODUS	welcher Modus?
	BMI PSET	-> 'PSET'
	BVS EXOR	> Ex-Oder
	ORA (ZEIGER),Y 	'Oder'
	BVC PSET	verzweigt immer
EXOR	EOR (ZEIGER),Y	Exor-Verkn.
PSET	STA (ZEIGER),Y	in Video-RAM
	INY		naechst. Spalte
	DEC BZAEHL	Zeile fertig?
	BNE PUTBYTE	nein — >
	CLC		naechste Zeile
	LDA ZEIGER	Zeiger=Zeiger+40
	ADC #ZLAENGE
	STA ZEIGER
	BCC PUT2
	INC ZEIGER+1	MSB
*
PUT2	DEC URAND	alle Zeilen fertig? 
	BNE PUTZEIL	nein — > 
	RTS
*
* Zeiger auf erstes Byte berechnen 
*        ZEIGER = ORAND * 40 
*
BERZEIG	LDA ORAND	LSB Zeiger=ORAND 
	STA ZEIGER
	LDA #0		MSB Zeiger=0
	STA ZEIGER+1
	ASL ZEIGER 	Zeiger=Zeiger*2
	ROL ZEIGER+1 
	ASL ZEIGER 	Zeiger=Zeiger*2
	ROL ZEIGER+1 	ergibt ORAND*4
	CLC
	LDA ZEIGER	Zeiger=Zeiger+ORAND 
	ADC ORAND 	bisher berechnet: 
	STA ZEIGER 	Zeiger=ORAND*5
	BCC SCRADR1 
	INC ZEIGER+1
SCRADR1	ASL ZEIGER	Zeiger=Zeiger*2 
	ROL ZEIGER+1 
	ASL ZEIGER 	Zeiger=Zeiger*2
	ROL ZEIGER+1 	ergibt ORAND*4
	ASL ZEIGER 	Zeiger=Zeiger*2
	ROL ZEIGER+1 	damit:
	CLC		ZEIGER=ORAND*40
	LDA ZEIGER	nun noch die
	ADC SAVMSC	Basisadresse des
	STA ZEIGER	Video-Rams addieren
	LDA ZEIGER+1
	ADC SAVMSC+1
	STA ZEIGER+1
	RTS
*
* Routine zur String-Verwaltung
*
GETSTR	LDX #0		Ein Byte aus
	LDA (STRING,X) 	dem String holen
	INC STRING 	und Stringzeiger
	BNE GS1		weiterschalten
	INC STRING+1
GS1 	RTS
*
PUTSTR	LDX #0		Ein Byte in
	STA (STRING,X) 	String eintragen
	INC STRING 	und Stringzeiger
	BNE PS1		weiterschalten
	INC STRING+1
PS1	RTS
