
; Listing24b.s		Sind maskierte CopperWaits nutzlos?

		SECTION	COPPER,CODE

	incdir	"/Sources/include/"
	include	MVstartup.s			; Startup Code: Nimmt
								; Systemprüfung vor und Aufruf
								; durch Platzieren der START-Routine: 
								; A5=$DFF000

			;5432109876543210
DMASET	equ	%1000001010000000	; copper DMA

Start:
	move	#DMASET,dmacon(a5)
	move.l	#Copperlist,cop1lc(a5)
	
Mouse:
	btst	#6,$bfe001			; Maus gedrückt?
	bne.s	Mouse

	rts
	
******************************************************************************

	SECTION	MY_COPPER,CODE_C

Copperlist:
;--------------------------
; horizontal maskierte Waits

    dc.w	$2139,$ff7e
	dc.w	$180,$f00

	dc.w	$2149,$fffe
	dc.w	$180,$000

	dc.w	$2139,$ff7e
	dc.w	$180,$f00

	dc.w	$2201,$fffe
	dc.w	$180,$fff

;--------------------------
; vertikal maskierte Waits
	dc.w	$8039,$3ffe
	dc.w	$180,$0ff

	dc.w	$8539,$fffe
	dc.w	$180,$0000

	dc.w	$8039,$3ffe
	dc.w	$180,$0ff

	dc.w	$c239,$fffe
	dc.w	$180,$f00

	dc.w	$ffff,$fffe
	
	end


Erklärung:

Sind Copper-Wait Masken nutzlos?

Ich habe mich lange gefragt, was man mit diesen vertikalen und horizontalen
Maskenbits anfangen kann bis ich mir ein Programm geschrieben hatte, was mir
die Auslösepunkte (also alle wirksamen Wait-Positionen) visuell anzeigen kann.
Ich dachte ich hätte es verstanden. Doch dann kamen bei Tests Ergebnisse
heraus die es wieder in Frage stellten und tatsächlich macht es der Amiga
doch wieder anders als von mir gedacht.

Meine Denkweise war, dass jede maskierte Waitposition ein Wait an dieser
Position ist.

z.B. vertikal maskierte Waits
	dc.w	$8039,$3ffe		; maskierte Y-Position
	dc.w	$180,$0ff

	dc.w	$8539,$fffe
	dc.w	$180,$0000

	dc.w	$8039,$3ffe		; maskierte Y-Position
	dc.w	$180,$0ff

	dc.w	$c239,$fffe
	dc.w	$180,$f00

Ein maskiertes Wait $3ffe (BFD OFF) entspricht zwei Waitpositionen: 
$y1fe und $y2fe und zwar: $8039,$fffe und $c039,$fffe

Ich hätte nun also gedacht, dass der Farbwechsel wie folgt erfolgt:
Pos 1) $8039 - Zeile $80	- Farbwechsel cyan
Pos 2) $8539 - Zeile $85	- Farbwechsel schwarz
Pos 3) $8039 - Zeile $c0	- Farbwechsel cyan
Pos 4) $c239 - Zeile $c2	- Farbwechsel rot	

Tatsächlich passiert aber folgendes:
Pos 1) $8039 - Zeile $80	- Farbwechsel cyan
Pos 2) $8539 - Zeile $85	- Farbwechsel schwarz
Pos 3) $8039 - Zeile $85 - selbe Zeile - Farbwechsel cyan	(sofort danach !!!!)
Pos 4) $c239 - Zeile $c2	- Farbwechsel rot
	
Das heißt also, nur das allererste gültige Wait hat eine Bedeutung. Alle
folgenden werden sofern der Elektronenstrahl diese Position bereits 
überschritten hat sofort ausgeführt.
(nach der Zeit die der Copper für das Wait und Move selbst braucht.)

Das gleiche gilt auch für das horizontale Wait.

	dc.w	$2149,$ff7e		; maskierte X-Position
	dc.w	$180,$f00

	dc.w	$2169,$fffe
	dc.w	$180,$000

	dc.w	$2149,$ff7e		; maskierte X-Position
	dc.w	$180,$f00

	dc.w	$2201,$fffe
	dc.w	$180,$fff

Ich hätte nun also gedacht, dass der Farbwechsel wie folgt erfolgt:	
Pos1)	$2139 - horizontale Position $38 - Farbwechsel rot
Pos2)	$2149 - horizontale Position $48 - Farbwechsel schwarz
Pos3)	$2139 - horizontale Position $b8 - Farbwechsel rot
Pos4)	$2201 - nächste Zeile			 - Farbwechsel weiß

Tatsächlich passiert aber folgendes:
Pos1)	$2139 - horizontale Position $38 - Farbwechsel rot
Pos2)	$2149 - horizontale Position $48 - Farbwechsel schwarz
Pos3)	$2139 - horizontale Position - kurz danach - Farbwechsel rot
Pos4)	$2201 - nächste Zeile			 - Farbwechsel weiß

Schlussfolgerung:
Damit könnte man zu dem Ergebnis kommen, das diese Maskenbits so gut wie nicht
zu gebrauchen sind und es bleiben nur wenige sinnvolle übrig.

Folgende "Waits" haben einen Sinn:
dc.w	$yyhh,$fffe			; der Klassiker
dc.w	$80e1,$80fe			; dieses WAIT wartet auf das Ende einer Zeile.
dc.w	$0001,$fffe			; dieses WAIT ist eine "nutzlose" Anweisung um
							; etwas Copper-Zeit zu verschwenden

Damit sind folgende Waits nur von Bedeutung:
yyhh,$fffe
yyhh,$00fe (entspricht yyhh,$80fe BFD On)
yyhh,$8001 (entspricht yyhh,$80fe BFD On) 
		
Aber wie wir im nächsten Beispiel sehen werden sind das Programm:
"Copper-Screen-Wait" und die Maskenbits doch nicht ganz unbrauchbar.
