;
;                     *******************************
;                      **        ZOOM V1.1        **
;                       ***************************
;
;                          Author: Antonio Martini
;                Hardware support: Simone Rancitelli   
;                       Assembler: ASM_One V1.0
;
;
;
;  N.B.: Una volta assemblato e mandato in esecuzione, resettare per uscire 
;
;
;

NBUFFER = 3

OldOpenLibrary	= -408
CloseLibrary	= -414

dmaconr	    EQU	  $002
adkconr	    EQU	  $010
intenar	    EQU	  $01C
intreqr	    EQU	  $01E
copcon	    EQU	  $02E

bltcon0	    EQU	  $040
bltcon1	    EQU	  $042
bltafwm	    EQU	  $044
bltalwm	    EQU	  $046
bltcpt	    EQU	  $048
bltbpt	    EQU	  $04C
bltapt	    EQU	  $050
bltdpt	    EQU	  $054
bltsize	    EQU	  $058

bltcmod	    EQU	  $060
bltbmod	    EQU	  $062
bltamod	    EQU	  $064
bltdmod	    EQU	  $066

bltcdat	    EQU	  $070
bltbdat	    EQU	  $072
bltadat	    EQU	  $074

DMASET=	%1000000111000000
;	 -----a-bcdefghij


	SECTION	MAIN,CODE_C

START:
	MOVEM.L	D0-D7/A0-A6,-(A7)	; Put registers on stack

	MOVE.L	$4.W,A6			; Exec pointer to A6
	jsr	-132(A6)

	LEA.L	GfxName,A1		; Set library pointer
	MOVEQ	#0,D0
	JSR	OldOpenLibrary(A6)	; Open graphics.library
	MOVE.L	D0,A1			; Use Base-pointer
	MOVE.L	$26(A1),OLDCOP1		; Store copper1 start addr
	MOVE.L	$32(A1),OLDCOP2		; Store copper1 start addr
	JSR	CloseLibrary(A6)	; Close graphics library

	LEA	$DFF000,A6
	MOVE.W	$1C(A6),xINTENA		; Store old INTENA
	MOVE.W	$2(A6),xDMACON		; Store old DMACON
	MOVE.W	$10(A6),xADKCON		; Store old ADKCON

	MOVE.W	#$7FFF,$9A(A6)		; Clear interrupt enable

	JSR	Wait_Vert_Blank

	MOVE.W	#$7FFF,$96(A6)		; Clear DMA channels
	MOVE.L	#COPLIST,$80(A6)	; Copper1 start address
	MOVE.W	#DMASET!$8600,$96(A6)	; DMA kontrol data
	MOVE.L	$6C.W,OldInter		; Store old inter pointer
	MOVE.L	#INTER,$6C.W		; Set interrupt pointer
	MOVE.W	#$7FFF,$9C(A6)		; Clear request
	MOVE.W	#$C020,$9A(A6)		; Interrupt enable

; --------------------------------------------------------
; MAIN ROUTINE

pxit	lea.l	dr00,a0
	move.w	#-164,8(a0)
	bsr.w	setpos
	bsr.w	front

	lea.l	dr01,a0
	move.w	#-164,8(a0)
	bsr.w	setpos
	bsr.w	front

; -------

	move.w	#60,time
	bsr.w	wait

; -------

	lea.l	dr01,a0
	move.w	#-16,8(a0)
	bsr.w	setpos
	bsr.w	BACK

	lea.l	dr00,a0
	move.w	#-16,8(a0)
	bsr.w	setpos
	bsr.w	BACK

	move.w	#$0200,view+2
	move.w	#35,time
	bsr.w	wait
	jsr	clear5
	move.w	#$2200,view+2

; -------
	jmp	pxit

; ------------------------
; AZZERA TUTTI GLI SCHERMI 
; ------------------------

clear5	lea.l	screen,a0	; puntatore inizio memoria
	move.l	#10240*7-1,d7	; lunghezza
	moveq	#0,d0

clr7	move.b	d0,(a0)+
	subq.l	#1,d7
	bne.s	clr7	
	rts

; -------------------------------
pointer	dc.l	0	; ^.l 1a word destinazione

imlarg 	dc.w	245	; larghezza immagine word aligned
imalt 	dc.w	42	; altezza immagine 

xpos	dc.w	-123	; posizione X immagine nello spazio 3d 
ypos	dc.w	100	; posizione Y immagine nello spazio 3d
zpos	dc.w	-128	; posizione Z immagine nello spazio 3d

Xbox	dc.w	1	; larghezza immagine da calcolare
Ybox	dc.w	1	; altezza immagine da calcolare
xstart	dc.w	0	; posizione x,y spigolo in alto a sinistra del
ystart	dc.w	0	; box d'inscrizione immagine da calcolare

; --------------------------------
; STRUTTURE DATI IMMAGINI

DR00	dc.l	image10	; ^ immagine BitMap
	dc.w	-276/2	; xpos posizione iniziale immagine nello spazio
	dc.w	100	; ypos
	dc.w	-164	; zpos
	dc.w	276	; larghezza immagine allineata a word 
	dc.w	88	; altezza immagine

DR01	dc.l	image11	; come sopra
	dc.w	-263/2	
	dc.w	40	
	dc.w	-164	
	dc.w	263	
	dc.w	53	

; --------------------------------
; 8 bytes per screen che servono per memorizzare l'area di schermo da
; cancellare 

delbuf	ds.w	8	; screen 1
	ds.w	8	; screen 2
	ds.w	8	; screen 3
	ds.w	10
	
; *****************************************************

stack	dc.l	0
dist	dc.w	0	
dist2	dc.w	0	

SETPOS	move.l	(a0)+,image	; puntatore immagine formato RAW_BLIT
	move.w	(a0)+,xpos	; X posizione immagine nello spazio
	move.w	(a0)+,ypos	; Y
	move.w	(a0)+,zpos	; Z
	move.w	(a0)+,imlarg	; larghezza immagine in pixel
	move.w	(a0)+,imalt	; altezza immagine in pixel

	bsr.w	prosp		; -> prospettiva

	movem.w	xbox(pc),d0-d3	; salva parametri box incrizione immagine
	lea.l	delbuf(pc),a0	; per futura cancellazione
	movem.w	d0-d3,(a0)
	movem.w	d0-d3,8(a0)
	movem.w	d0-d3,16(a0)
	
	rts

; ------------------------
; MUOVE IMMAGINE IN AVANTI
; ------------------------
FRONT
init	cmp.w	#-16,zpos	; -16 = valore massimo di avvicinamento
	bge.s	cig
	add.w	#4,zpos		; incrementa coordinata Z immagine

	jsr	bmap		; Alloca buffer di disegno
	jsr	draw		; disegna immagine
	jsr	next		; passa al prossimo fotogramma
	bra.s	init

cig	move.w	#-16,zpos	; disegna immagine ferma nei 3 buffer
	bsr.w	refresh
	RTS

; -----------------------
; MUOVE IMMAGINE INDIETRO
; -----------------------

BACK	cmp.w	#-164,zpos	; -164 = lontananza massima
	ble.s	cig2
	sub.w	#4,zpos		; decrementa coordinata Z immagine

	jsr	bmap		; alloca buffer di disegno
	jsr	draw		; disegna immagine
	jsr	next		; passa al prossimo fotogramma
	bra.s	BACK

cig2	bsr.b	cancel		; cancella i 3 buffer
	RTS

; ------------------
; FUNZIONE DI ATTESA
; ------------------

WAIT	subq.w	#1,time
	bmi.s	cig3
	jsr	bmap
	jsr	draw
	jsr	next
	bra.s	WAIT
cig3	RTS
time	dc.w	0


; ----------------------------------
; CANCELLA L'IMMAGINE DAI TRE BUFFER
; ----------------------------------

CANCEL	jsr	bmap	; schermo 1
	bsr.w	prosp
	bsr.w	clear
	jsr	next

	jsr	bmap	; schermo 2
	bsr.w	prosp
	bsr.w	clear
	jsr	next

	jsr	bmap	; schermo 3
	bsr.w	prosp
	bsr.w	clear
	jsr	next
	rts

; -----------------------------------------
; DISEGNA LA STESSA IMMAGINE SUI TRE BUFFER 
; -----------------------------------------

REFRESH	jsr	bmap
	jsr	draw
	jsr	next

	jsr	bmap
	jsr	draw
	jsr	next

	jsr	bmap
	jsr	draw
	jsr	next

	rts

; ----------------------------
; STABILISCE BUFFER DI DISEGNO
; ----------------------------

BMAP	lea.l	change1,a0
	addq.w	#1,(a0)		; incrementa posizione buffer di disegno
	cmp.w	#NBUFFER-1,(a0)
	bls.s	abtot
	clr.w	(a0)
abtot	move.w	(a0),d0		; n° buffer dove disegnare

lpjj	btst	d0,-3(a0)	; controlla che sia libero 
	bne.s	lpjj
	
	move.w	d0,fg0		; salva posizione buffer

	add.w	d0,d0		; n° buffer
	add.w	d0,d0
	move.l  2(a0,d0.w),d0	; ^.l buffer di disegno		
	move.l	d0,planes
	rts

; -----------------
; SCHERMO DISEGNATO
; -----------------
; comunica alla routine d'interrupt che il buffer di disegno puo' essere
; visualizzato

NEXT	move.w	fg0(pc),d0
	lea.l	sc_cont+1,a0
	bset	d0,(a0)
	rts

fg0	dc.w	0

; -----------
; PROSPETTIVA
; -----------
; non sono usate le tecniche di proiezione piu' veloci perche'
; vanno proiettati solo 4 punti

PROSP	move.w	zpos(pc),d6	; coordinata Z punto riferimento scritta

	move.w	xpos(pc),d2	; coordinata X punto riferimento
	neg.w	d2
	ext.l	d2
	asl.l	#4,d2		; osservatore = 16
	divs	d6,d2
	add.w	#160,d2
	move.w	d2,xstart	; posizione x sullo schermo dell'angolo
				; in alto a sinistra del box incrizione
				; dell'immagine da calcolare	

	move.w	xpos(pc),d2	; coordinata X punto di riferimento
	neg.w	d2
	sub.w	imlarg(pc),d2
	ext.l	d2
	asl.l	#4,d2
	divs	d6,d2
	add.w	#160,d2
	sub.w	xstart(pc),d2
	move.w	d2,xbox		; larghezza box incrizione immagine da
				; calcolare

	move.w	ypos(pc),d2	; posizione Y punto riferimento immagine
	add.w	imalt(pc),d2
	ext.l	d2
	asl.l	#4,d2
	divs	d6,d2
	add.w	#200,d2
	move.w	d2,ystart	; posizione y sullo schermo dell'angolo
				; in alto a sinistra del box incrizione
				; dell'immagine da calcolare	


	move.w	ypos(pc),d2	; posizione Y punto riferimento immagine
	ext.l	d2
	asl.l	#4,d2
	divs	d6,d2
	add.w	#200,d2
	sub.w	ystart(pc),d2
	move.w	d2,ybox		; altezza box incrizione immagine da 
				; calcolare

	RTS

; ----------------------------
; CANCELLA IMMAGINE PRECEDENTE
; ----------------------------
; ogni volta che viene disegnata l'immagine vengono memorizzate le
; coordinate del suo box d'inscrizione, che serviranno per cancellarla
; quando dovremo ridisegnarla in una nuova posizione

CLEAR	lea.l	delbuf(pc),a0
	move.w	change1(pc),d0
	lsl.w	#3,d0
	add.w	d0,a0

	movem.w	(a0),d0-d2/d4	; coordinate box da cancellare
	move.w	d2,d3

	addq.w	#1,d1
	lsl.w	#7,d1		; altezza blit
	and.w	#$f,d2
	add.w	d2,d0
	lsr.w	#4,d0
	addq.w	#1,d0		; larghezza blit
	or.w	d0,d1		; dimensioni blit
	add.w	d0,d0
	neg.w	d0
	add.w	#40,d0		; modulo 

	move.l	planes,a1	; puntatore bitmap
	move.l	a1,a3
	lsr.w	#3,d3
	mulu	#40*2,d4
	add.l	d4,a1
	add.w	d3,a1		; puntatore 1a word

; vengono salvati i parametri della nuova immagine che serviranno per
; cancellarla al momento che la dovremo ridisegnare su questo schermo
; con una posizione differente.

	move.w	xbox(pc),(a0)+		; larghezza immagine	
	move.w	ybox(pc),(a0)+		; altezza immagine
	move.w	xstart(pc),(a0)+	; posizine x,y spigolo in alto a
	move.w	ystart(pc),(a0)+	; sinistra	

; calcola il puntatore alla 1a word contenente la nuova immagine che
; dovremo calcolare 
	move.w	xstart(pc),d3
	move.w	ystart(pc),d4	
	lsr.w	#3,d3
	mulu	#40*2,d4
	add.w	d4,a3
	move.l	a3,pointer

; azzera memoria schermo del fotogramma precedente
	lea.l	$dff000,a6
	btst	#6,2(A6)
cir00	btst	#6,2(A6)
	bne.s	cir00
	
	move.l	a1,bltdpt(a6)
	move.w	d0,bltdmod(a6)
	move.l	#$01000000,bltcon0(a6)
	move.w	d1,bltsize(a6)
	RTS	

; ------------------------------
; DISEGNA IMMAGINE SULLO SCHERMO
; ------------------------------

DRAW	BSR.W	PROSP		; CALCOLA BOX INSCRIZIONE IMMAGINE
	BSR.W	CLEAR		; AZZERA MEMORIA VIDEO FRAME PRECEDENTE
	JSR	YDIMENSION	; RIDIMENSIONA IN DIREZIONE VERTICALE
	JMP	XDIMENSION	; RIDIMENSIONA IN DIREZIONE ORIZZONTALE 
				; ED ESCE

; -----------------------------------------
; RIDIMENSIONAMENTO VERTICALE DELL'IMMAGINE
; -----------------------------------------

YDIMENSION
	lea.l	$dff000,a6
	move.w	YBOX(pc),d7
	move.w	imalt(pc),d1

; d1/d7
	lea.l	STEP_TAB(pc),a0	; ^ tabella 1/val
	move.w	d7,d2
	add.w	d2,d2
	add.w	d1,d1
	muls	0(a0,d2.w),d1
	
gio55	move.l	image,a2	; ^ immagine
	lea.l	screenbuf,a3	; ^ buffer intermedio

	move.w	imlarg(pc),d2	; larghezza immagine sorgente
	lsr.w	#4,d2
	addq.w	#1,d2		; larghezza espressa in words
	move.w	d2,d6		; larghezza Blit

	add.w	d2,d2
	move.w	d2,d5		; larghezza espressain bytes
	add.w	d5,d5		; bytes*DEPTH DEPTH=2
	neg.w	d2
	add.w	#40,d2		; DEST MODULO (BUF_Width = 40)

	moveq	#0,d0
	move.l	d0,a1
	moveq	#-1,d4	
	lea.l	bltapt(a6),a4
	lea.l	bltsize(a6),a5
	move.l	a2,a0

	btst	#6,2(a6)
wblt23	btst	#6,2(a6)
	bne.s	wblt23

	move.w	d0,bltamod(A6)
	move.w	d2,bltdmod(A6)
	move.l	d4,bltafwm(A6)		; machere = $FFFFFFFF
	move.l	#$09f00000,bltcon0(a6)  ; MINTERM= semplice copia
	move.l	a3,bltdpt(a6)	        ; destinazione
	lea.l	$2(a6),a3

	move.w	d6,a6
	move.w	#64*2,d2	; altezza blit
	moveq	#0,d4		; y start
	bra.s	ENTY

; d1=step
LOOP50	subq.w	#1,d7
	bmi.s	LASTY

	btst	#6,(a3)
LOOP00	btst	#6,(a3)
	bne.s	LOOP00

	move.l	a0,(a4)		; source	
	move.w	d6,(a5)		; bltsize

	move.l	a2,a0		; ^ immagine sorgente
	move.w	d4,d0
	mulu	d5,d0		; altezza * lunghezza linea
	add.l	d0,a0		; ^ 1a linea da trasferire

ENTY	move.w	a6,d6		; larghezza blit (altezza=0)
YADD	add.w	d2,d6		; aumenta altezza di una linea
	move.w	d4,d3		; salva Y
	add.l	d1,a1		; Y=Y+STPy 
	move.l	a1,d4
	swap	d4		; calcola nuova Y 
	sub.w	d4,d3
	addq.w	#1,d3		; differenza = 1 ?
	dbne	d7,YADD		
	bne.s	LOOP50

; esegue ultimo trasferimento
LASTY	btst	#6,(a3)
LOOP01	btst	#6,(a3)
	bne.s	LOOP01

	move.l	a0,(a4)		; source	
	move.w	d6,(a5)		; bltsize

	rts

; ****************************************************************

XDIMENSION
	move.l	a7,stack
	lea.l	$dff058,a6

	moveq	#38,d0
	moveq	#0,d2
	moveq	#-1,d1

	btst	#6,2-$58(a6)
wblt9	btst	#6,2-$58(a6)
	bne.s	wblt9

	move.w	d1,bltalwm-$58(a6)
	move.w	d0,bltamod-$58(a6)
	move.w	d0,bltbmod-$58(a6)
	move.w	d0,bltdmod-$58(a6)
	move.w	d2,bltcon1-$58(a6)

; d0= x0 start
; d4= x0 step	
; d6= x1 dest

; ***********************************************************

	move.w	YBOX(pc),d0	; altezza immagine da calcolare 
	add.w	d0,d0		; *numero  bitplanes
	move.w	d0,d1
	mulu	#40,d1		; *(bytes per linea)
	move.w	d1,err0+2
	move.w	d1,err1+2
	
	lsl.w	#6,d0
	addq.w	#1,d0
	move.w	d0,sizev+2	; altezza blit

	move.w	XBOX(pc),d7
	move.w	imlarg,d1

; d1/d7
	lea.l	STEP_TAB(pc),a0 ; tabella 
	move.w	d7,d6
	add.w	d6,d6
	add.w	d1,d1
	muls	0(a0,d6.w),d1	; step<<16

; -----------

	lea.l	screenbuf,a4	; ^.l IMMAGINE 
	move.l	pointer,a5	; ^.l MEMORIA DESTINAZIONE (SCHERMO)

	moveq	#0,d0
	move.l	d0,a7
	move.w	xstart,d6
	bra.w	startX

LOOPX	move.w	d0,d2		; Xpos
	lsr.w	#3,d2
	move.l	a4,a1
	add.w	d2,a1		; BLTAPT source PTR

pre11	move.w	d6,d2
	lsr.w	#3,d2
	move.l	a5,a3
	add.w	d2,a3		; dest PTR

pre00	move.w	d6,d2
	and.w	#$F,d2
	move.w	d0,d3		; word pos1
	and.w	#$F,d3
	sub.w	d3,d2		; word pos2
	bge.w	cik00

brk	neg.w	d2
	and.w	#$F,d2
err0	lea.l	80*254(a3),a3 
err1	lea.l	80*254(a1),a1 

;        *      
; 0123 4567
; *             
; 0123 4567

ran

SBC	MACRO
	add.l	d1,a7
	move.l	a7,d4
	swap	d4
	sub.w	d0,d4
	subq.w	#\1,d4
	ENDM

	swap	d6
	sub.w	d6,d6

	move.w	d0,d5
	not.w	d5
	and.w	#$F,d5	; 15-0 word position

	tst.w	d5	; 0
	beq.w	cik30
	SBC	1
	bne.w	cik31

	subq.w	#1,d5	; 1
	ble.w	buk	
	SBC	2
	bne.w	buk2

	subq.w	#1,d5	; 2
	ble.w	nuk	
	SBC	3
	bne.b	nuk2

	subq.w	#1,d5	; 3
	ble.b	lip	
	SBC	4
	bne.b	lip2

	subq.w	#1,d5	; 4
	ble.b	fip	
	SBC	5
	bne.b	fip2

	subq.w	#1,d5	; 5
	ble.s	rip	
	SBC	6
	bne.s	rip2

	subq.w	#1,d5	; 6
	ble.s	hip	
	SBC	7
	bne.s	hip2

	subq.w	#7,d7
	bmi.b	hip3
	addq.w	#7,d6
	bra.w	cik30

hip3	addq.w	#6,d7
hip2	sub.l	d1,a7
hip	subq.w	#6,d7
	bmi.b	rip3
	addq.w	#6,d6
	bra.w	cik30

rip3	addq.w	#6,d7
rip2	sub.l	d1,a7
rip	subq.w	#5,d7
	bmi.b	lip3
	addq.w	#5,d6
	bra.s	cik30

fip3	addq.w	#5,d7
fip2	sub.l	d1,a7
fip	subq.w	#4,d7
	bmi.b	lip3
	addq.w	#4,d6
	bra.s	cik30

lip3	addq.w	#4,d7
lip2	sub.l	d1,a7
lip	subq.w	#3,d7
	bmi.b	nuk3
	addq.w	#3,d6
	bra.s	cik30

nuk3	addq.w	#3,d7
nuk2	sub.l	d1,a7
nuk	subq.w	#2,d7
	bmi.b	buk3
	addq.w	#2,d6
	bra.s	cik30

; ------------------------

buk3	addq.w	#2,d7
buk2	sub.l	d1,a7
buk	subq.w	#1,d7
	bmi.w	xit
	addq.w	#1,d6
	bra.s	cik30

MASK1	DC.W	$8000
	DC.W	$C000
	DC.W	$E000
	DC.W	$F000
	DC.W	$F800
	DC.W	$FC00
	DC.W	$FE00
	DC.W	$FF00
	DC.W	$FF80
	DC.W	$FFC0
	DC.W	$FFE0
	DC.W	$FFF0
	DC.W	$FFF8
	DC.W	$FFFC
	DC.W	$FFFE
	DC.W	$FFFF

MASK2	DC.W	$FFFF
	DC.W	$7FFF
	DC.W	$3FFF
	DC.W	$1FFF
	DC.W	$0FFF	
	DC.W	$07FF
	DC.W	$03FF
	DC.W	$01FF
	DC.W	$00FF
	DC.W	$007F
	DC.W	$003F
	DC.W	$001F
	DC.W	$000F
	DC.W	$0007
	DC.W	$0003
	DC.W	$0001
	DC.W	$0000

cik31	sub.l	d1,a7
cik30	move.w	d6,d4
	swap	d6
	add.w	d4,d6

	and.w	#$F,d0		; 15-0 word position
	add.w	d0,d4
	add.w	d4,d4
	add.w	d0,d0
	move.w	MASK2(pc,d0.w),d5
	and.w	MASK1(pc,d4.w),d5 	; WORD MASK
	moveq	#2,d4			; desc mode
	bra.b	MVAL

MASK3	DC.W	$FFFF
	DC.W	$7FFF
	DC.W	$3FFF
	DC.W	$1FFF
	DC.W	$0FFF	
	DC.W	$07FF
	DC.W	$03FF
	DC.W	$01FF
	DC.W	$00FF
	DC.W	$007F
	DC.W	$003F
	DC.W	$001F
	DC.W	$000F
	DC.W	$0007
	DC.W	$0003
	DC.W	$0001

MASK4	DC.W	$8000
	DC.W	$C000
	DC.W	$E000
	DC.W	$F000
	DC.W	$F800
	DC.W	$FC00
	DC.W	$FE00
	DC.W	$FF00
	DC.W	$FF80
	DC.W	$FFC0
	DC.W	$FFE0
	DC.W	$FFF0
	DC.W	$FFF8
	DC.W	$FFFC
	DC.W	$FFFE
	DC.W	$FFFF

cik01	move.w	d6,d4
	swap	d6
	add.w	d4,d6
	add.w	d5,d4
	add.w	d4,d4
	add.w	d5,d5
	move.w	MASK3(pc,d5.w),d5
	and.w	MASK4(pc,d4.w),d5 ; WORD MASK
	moveq	#0,d4

MVAL	ror.w	#4,d2		; x DEST shift
	or.w	#$0dfc,d2	; MINTERM
	swap	d2
	move.w	d4,d2		; d2.l = BLTCON0/BLTCON1
	move.l	a3,a0		; BLTBPT=BLTDPT

	btst	#$6,2-$58(a6)		; attende il blitter
bwait	btst	#$6,2-$58(a6)	
	bne.s	bwait

	move.w	d5,bltafwm-$58(a6)	; trasferisce colonna
	movem.l	a0/a1/a3,bltbpt-$58(a6)	; BLTBPT/BLTAPT/BLTDPT
	move.l	d2,bltcon0-$58(a6)	; BLTCON0/BLTCON1
sizev	move.w	#(255<<6)!1,(a6)

	addq.w	#1,d6		; incrementa posizione su schermo x=x+1
	add.l	d1,a7		; 
	move.l	a7,d0
	swap	d0		; source pos

startx	dbra	d7,LOOPX
xit
	move.l	stack(pc),a7
	rts

; d4=0
cik00	swap	d6
	sub.w	d6,d6
	move.w	d0,d5
	and.w	#$F,d5		; 15-0 word position
	move.w	d5,d3
	add.w	d2,d3
	neg.w	d3
	add.w	#$f,d3
	beq.s	cik01
	
	SBC	1
	bne.w	sum00

	subq.w	#1,d3
	beq.w	lin
	SBC	2
	bne.w	lin1

	subq.w	#1,d3
	beq.w	pin
	SBC	3
	bne.w	pin1

	subq.w	#1,d3
	beq.b	sin
	SBC	4
	bne.b	sin1

	subq.w	#1,d3
	beq.b	tin
	SBC	5
	bne.b	tin1

	subq.w	#1,d3
	beq.b	win
	SBC	6
	bne.b	win1

	subq.w	#1,d3
	beq.b	din
	SBC	7
	bne.b	din1

	subq.w	#7,d7
	bmi.s	din2
	addq.w	#7,d6
	bra.w	cik01

din2	addq.w	#7,d7
din1	sub.l	d1,a7
din	subq.w	#6,d7
	bmi.s	win2
	addq.w	#6,d6
	bra.w	cik01

win2	addq.w	#6,d7
win1	sub.l	d1,a7
win	subq.w	#5,d7
	bmi.s	tin2
	addq.w	#5,d6
	bra.w	cik01

tin2	addq.w	#5,d7
tin1	sub.l	d1,a7
tin	subq.w	#4,d7
	bmi.s	sin2
	addq.w	#4,d6
	bra.w	cik01

sin2	addq.w	#4,d7
sin1	sub.l	d1,a7
sin	subq.w	#3,d7
	bmi.s	pin2
	addq.w	#3,d6
	bra.w	cik01

pin2	addq.w	#3,d7
pin1	sub.l	d1,a7
pin	subq.w	#2,d7
	bmi.s	lin2
	addq.w	#2,d6
	bra.w	cik01
	
lin2	addq.w	#2,d7
lin1	sub.l	d1,a7
lin	subq.w	#1,d7
	bmi.b	sum01
	addq.w	#1,d6
	bra.w	cik01

sum00	sub.l	d1,a7
	bra.w	cik01
sum01	sub.l	d1,a7
	addq.w	#1,d7
	bra.w	cik01

; --------------------------------

	dc.w	0
planes
	dc.l	screen
	dc.l	screen+10240*2

frm1	dc.w	0
frm2	dc.w	0
frm3	dc.w	0

; --------------------------
; INTERRUPT ROUTINE. LEVEL 3  
; --------------------------

INTER:	movem.l	d0-d7/a0-a6,-(a7)	; put registers on stack

	move.w	$dff000+INTENAR,d0
	btst	#5,d0			; vertical blank ? 
	beq.s	NOVERT			; -> no

; ------------
	lea.l	change0(pc),a0
	move.w	(a0),d0
	move.w	d0,d1
	addq.w	#1,d0
	cmp.w	#NBUFFER-1,d0
	ble.s	lab_cd
	moveq	#0,d0

lab_cd	addq.w	#1,frm1
	btst	d0,-1(a0)
	beq.s	irq_esc
	move.w	d0,(a0)
	bclr	d1,-1(a0)

	addq.w	#1,frm2
	cmp.w	#50,frm1
	ble.s	lio00
	move.w	frm2,frm3
	clr.w	frm1
	clr.w	frm2
lio00
; ------------
irq_esc	move.w	(a0),d0
	add.w	d0,d0
	add.w	d0,d0
	move.l	4(a0,d0.w),d0
	lea.l	$dff000,a6
	lea.l	plane0+2,a1

SETP	MACRO
	move.l	d0,d1
	move.w	d1,4(a1)
	swap	d1
	move.w	d1,(a1)
	addq.w	#8,a1
	ENDM

	SETP
	add.l	#40,d0
	SETP

NOVERT	movem.l	(a7)+,d0-d7/a0-a6	; get registers from stack
	move.w	#$4020,$dff09c		; clear interrupt request
	rte

sc_cont		dc.b	0,7
change0		dc.w	0
change1		dc.w	-1

bplane01	dc.l	screen		;1 bitmap
bplane02	dc.l	screen+10240*2
bplane03	dc.l	screen+10240*4
		dc.l	0,0,0,0

;*** WAIT VERTICAL BLANK ***

Wait_Vert_Blank:
	BTST	#0,$5(A6)
	BEQ.S	Wait_Vert_Blank
.loop	BTST	#0,$5(A6)
	BNE.S	.loop
	RTS

;*** DATA AREA ***

GfxName		DC.B	'graphics.library',0
		even
DosBase		DC.L	0
OldInter	DC.L	0
OldCop1		DC.L	0
OldCop2		DC.L	0
xINTENA		DC.W	0
xDMACON		DC.W	0
xADKCON		DC.W	0

; ----------------------------------------------------------------------
; TABELLA CONTENENTE (1/x)*2^21, dove x va da 0 alla risoluzione 
; verticale adottata, in questo caso 256

STEP_TAB
	DC.W $7FFF,$7FFF,$4000,$2AAA,$2000,$1999,$1555,$1249,$1000,$E38,$CCC,$BA2,$AAA,$9D8,$924,$888
	DC.W $800,$787,$71C,$6BC,$666,$618,$5D1,$590,$555,$51E,$4EC,$4BD,$492,$469,$444,$421
	DC.W $400,$3E0,$3C3,$3A8,$38E,$375,$35E,$348,$333,$31F,$30C,$2FA,$2E8,$2D8,$2C8,$2B9
	DC.W $2AA,$29C,$28F,$282,$276,$26A,$25E,$253,$249,$23E,$234,$22B,$222,$219,$210,$208
	DC.W $200,$1F8,$1F0,$1E9,$1E1,$1DA,$1D4,$1CD,$1C7,$1C0,$1BA,$1B4,$1AF,$1A9,$1A4,$19E
	DC.W $199,$194,$18F,$18A,$186,$181,$17D,$178,$174,$170,$16C,$168,$164,$160,$15C,$158
	DC.W $155,$151,$14E,$14A,$147,$144,$141,$13E,$13B,$138,$135,$132,$12F,$12C,$129,$127
	DC.W $124,$121,$11F,$11C,$11A,$118,$115,$113,$111,$10E,$10C,$10A,$108,$106,$104,$102
	DC.W $100,$FE,$FC,$FA,$F8,$F6,$F4,$F2,$F0,$EF,$ED,$EB,$EA,$E8,$E6,$E5
	DC.W $E3,$E1,$E0,$DE,$DD,$DB,$DA,$D9,$D7,$D6,$D4,$D3,$D2,$D0,$CF,$CE
	DC.W $CC,$CB,$CA,$C9,$C7,$C6,$C5,$C4,$C3,$C1,$C0,$BF,$BE,$BD,$BC,$BB
	DC.W $BA,$B9,$B8,$B7,$B6,$B5,$B4,$B3,$B2,$B1,$B0,$AF,$AE,$AD,$AC,$AB
	DC.W $AA,$A9,$A8,$A8,$A7,$A6,$A5,$A4,$A3,$A3,$A2,$A1,$A0,$9F,$9F,$9E
	DC.W $9D,$9C,$9C,$9B,$9A,$99,$99,$98,$97,$97,$96,$95,$94,$94,$93,$92
	DC.W $92,$91,$90,$90,$8F,$8F,$8E,$8D,$8D,$8C,$8C,$8B,$8A,$8A,$89,$89
	DC.W $88,$87,$87,$86,$86,$85,$85,$84,$84,$83,$83,$82,$82,$81,$81,$80
	DC.W $80,$7F,$7F,$7E,$7E,$7D,$7D,$7C,$7C,$7B,$7B,$7A,$7A,$79,$79,$78
	DC.W $78,$78,$77,$77,$76,$76,$75,$75,$75,$74,$74,$73,$73,$72,$72,$72
	DC.W $71,$71,$70,$70,$70,$6F,$6F,$6F,$6E,$6E,$6D,$6D,$6D,$6C,$6C,$6C
	DC.W $6B,$6B,$6B,$6A,$6A,$6A,$69,$69,$69,$68,$68,$68,$67,$67,$67,$66
	DC.W $66,$66,$65,$65,$65

; -----------------------
; LISTA ISTRUZIONI COPPER
; -----------------------

	SECTION	Copper,DATA_C

COPLIST:
	DC.W	$0100,$0200	; BIT-PLANE CONTROL REG.
	DC.W	$0102,$0000	; HOR-SCROLL
	DC.W	$0104,$0010	; SPRITE/GFX PRIORITY
	DC.W	$0108,40	; MODOLU (ODD)
	DC.W	$010A,40	; MODOLU (EVEN)
	DC.W	$008E,$2C81	; SCREEN SIZE
	DC.W	$0090,$2CC1	; SCREEN SIZE
	DC.W	$0092,$0038	; H-START
	DC.W	$0094,$00D0	; H-STOP

	DC.W	$0180,$0000	; COLORI
	DC.W	$0182,$0FFF
	DC.W	$0184,$0F00
	DC.W	$0186,$0800

	DC.W	$3001,$FFFE
PLANE0	
	DC.W	$E0,0,$E2,0
	DC.W	$E4,0,$E6,0

VIEW	DC.W	$0100,$2200	; REG. CONTROLLO BITPLANES
	DC.W	$F801,$FFFE
	DC.W	$0100,$0200	; REG. CONTROLLO BITPLANES

	DC.L	$FFFFFFFE	; END COPPERLIST

tok	dc.w	0

image	dc.l	image10

; ------------------------------------
; IMMAGINI SALVATE IN FORMATO RAW-BLIT
; ------------------------------------

	SECTION	IMAGES,DATA_C

; 307*92
image10	incbin	"AMIGA.data"
; 134*29
image11	incbin	"jackson.data"
	ds.b	100

; -------------
; MEMORIA VIDEO
; -------------

	SECTION	SCREEN,BSS_C
; memoria per double o triple buffering 
SCREEN	DS.B	10240*7

; buffer transitorio
screenbuf
	ds.b	10240*2

