;POUR CHARGER LES DATAS TAPEZ:
;
;RI		RETURN
;MODULE		RETURN
;MT_DATA	RETURN RETURN
;
;PUIS TAPEZ
;G BEGIN	RETURN RETURN
;
;SUPPRIMEZ LES LIGNES SUIVANTES SI VOTRE VERSION DU SEKA
;NE COMPORTE PAS LA COMMANDE Y

>EXTERN "MODULE",MT_DATA

org $30000	;EMPLACEMENT EN MEMOIRE
load $30000	;DE NOTRE PROGRAMME

BEGIN:
JMP START
;=====================================================================
EXECBASE=4
OPENLIBRARY=-408
CLOSELIBRARY=-414
SUPERSTATE=-150
USERSTATE=-156	
FORBID=-132
PERMIT=-138
ADDINTSERVER=-168
REMINTSERVER=-174
Open=-30
Close=-36
Read=-42

;=====================================================================
BLTCON0=$DFF040		
BLTCON1=$DFF042
BLTAFWM=$DFF044
BLTALWM=$DFF046
BLTCPTH=$DFF048
BLTCPTL=$DFF04A
BLTBPTH=$DFF04C
BLTBPTL=$DFF04E
BLTAPTH=$DFF050
BLTAPTL=$DFF052
BLTDPTH=$DFF054
BLTDPTL=$DFF056
BLTSIZE=$DFF058
BLTCMOD=$DFF060
BLTBMOD=$DFF062
BLTAMOD=$DFF064
BLTDMOD=$DFF066
BLTCDAT=$DFF070
BLTBDAT=$DFF072
BLTADAT=$DFF074
DMACONR=$DFF002
;==================================
SCREEN1=$40000   		;ECRAN 1    

SCREEN2=SCREEN1+[40*256*3]	;ECRAN 2

PLANE=SCREEN2+[40*256*3]	;ECRAN POUR TRANSFERT BLITTER

MT_DATA=PLANE+[40*256]		;MUSIQUE

FINDATA=MT_DATA+92384 		;FIN DES DATAS

;==================================
START:    
MOVEM.L D0-D7/A0-A6,-(A7)	;SAUVE REGISTRES
MOVE.L EXECBASE,A6		;CHARGE ADRESSE EXECBASE DANS A6
JSR FORBID(A6)    		;SAUTE SOUS PROGRAMME: INTERDIT MULTITACHE
JSR OPENLIB  			;SAUTE SOUS PROGRAMME: OUVERTURE LIBRAIRIES

LEA SCREEN1,A0			;EFFACE LES 2 ECRANS
MOVE.W #[20*256*7]-1,D0
CLR_SCREEN:
MOVE.W #0,(A0)+
DBF D0,CLR_SCREEN

BSR.L SKIFT			;MET EN PLACE VALEUR DE L'OBJET

BSR.L INIT_MUSIQUE		;INITIALISATION DE LA MUSIQUE

BSR.L SETCOPPER			;SAUTE SOUS PROGRAMME: MET EN PLACE LISTE COPPER

BSR.s NEWIRQ3			;SAUTE SOUS PROGRAMME: MET EN PLACE ROUTINE D'INTERRRUPTION

BSR.L MAIN			;VA A ROUTINES DE CALCULS

END: 				;FIN:	
BSR.L STOP_MUSIQUE		;ARRET DE LA MUSIQUE
BSR.s STOPIRQ3        		;SAUTE SOUS PROGRAMME: STOPPE INTERRUPTION
BSR.L CLRCOPPER       		;SAUTE SOUS PROGRAMME: RESTAURE ANCIENNE LISTE COPPER
BSR.L CLOSELIB        		;SAUTE SOUS PROGRAMME: FERME LIBRAIRIES 
MOVE.L EXECBASE,A6		;CHARGE ADRESSE EXECBASE DANS A6
JSR PERMIT(A6)      		;AUTORISE MULTITACHE
                      
MOVEM.L (A7)+,D0-D7/A0-A6	;RESTAURE REGISTRES
RTS
;========================
NEWIRQ3:			;MET EN PLACE NOTRE ROUTINE 
MOVE.L	EXECBASE,A6		;D'INTERRUPTION
lea	irqstr,a1
move.l	#5,d0
jsr	addintserver(a6)
move.l	d0,irq
beq.s	irqerror
rts
irqerror:
rts
;==========================
STOPIRQ3:			;RESTAURE ANCIENNE ROUTINE
movem.l	a0-a6/d0-d7,-(sp)	;D'INTERRUPTION
	tst.l	irq
	beq.s	irqoff1
	move.l	execbase,a6
	lea	irqstr,a1
	move.l	#32,d0
	jsr	remintserver(a6)
irqoff1:movem.l	(sp)+,a0-a6/d0-d7
	rts
irqstr:
	dc.l	0,0
	dc.b	2,-127
	dc.l	0,irqdat,interrupt
irqdat:	dc.l	0,0,0,0
irq:	dc.l	0
;============================
interrupt:			;NOTRE ROUTINE D'INTERRUPTION	
movem.l	a0-a6/d0-d7,-(sp)

BSR.L PLAY_MUSIQUE		;VA A LA ROUTINE POUR JOUER LA MUSIQUE
	
movem.l	(sp)+,a0-a6/d0-d7
rts
;============================
OPENLIB:  			;OUVERTURE DE LA LIBRAIRIE GRAPHIQUE
move.l execbase,a6      	;MET ADRESSE EXECBASE DANS A6
lea gfxname,a1			;MET NOM DE LA LIBRAIRIE DANS A1
move.l #$0,d0           	;MET 0 DANS D0
jsr openlibrary(a6)		;OUVRE LIBRAIRIE
tst d0				;TESTE D0
beq.s error			;SI = A 0   VA A ERROR = SORTIE
move.l d0,gfxbase       	;SI NON, MET ADRESSE D0 DANS GFXBASE
add.l #$32,d0			;AJOUTE $32 A CETTE ADRESSE
move.l d0,coppertr      	;MET D0=ADRESSE ACTUELLE LISTE COPPER
rts				;DANS COPPERTR
even
gfxname: dc.b 'graphics.library',0 	;NOM DE LA LIBRAIRIE
even
gfxbase: dc.l 0				;POINTEUR POUR LA GRAPHICS LIBRARY
coppertr: dc.l 0			;POINTEUR POUR ADRESSE LISTE COPPER
;====================
CLOSELIB: 			;FERMETURE LIBRAIRIE
move.l execbase,a6      	;MET ADRESSE EXECBASE DANS A6
move.l gfxbase,a1		;MET NOM DE LA LIBRAIRIE DANS A1
jsr closelibrary(a6)		;FERME LIBRAIRIE
rts
;====================
ERROR:				;SI ERREUR
illegal				;SORTIE
rts
;====================
SETCOPPER:			;MET EN PLACE NOTRE LISTE COPPER
move.l coppertr,a0		;MET ADRESSE ACTUEL COPPER DANS A0
move.l (a0),oldcopper		;MET CONTENU DANS OLDCOPPER
move.l #newcopper,(a0)		;MET NOTRE LISTE COPPER DANS A0
move.w #$81c0,$dff096		;ACTIVE LISTE COPPER
rts		
oldcopper: dc.l 0
;====================
CLRCOPPER:			;RESTAURE ANCIENNE LISTE COPPER
move.l coppertr,a0		;MET ANCIENNE ADRESSE DANS A0
move.l oldcopper,(a0)		;MET CONTENU DANS A0
move.w #$80a0,$dff096		;REACTIVE ANCIENNE COPPER
rts
;====================
WAIT_BLITTER:			;ROUTINE POUR ATTENDRE QUE LE BLITTER
BTST #14,DMACONR		;EST FINI SON PRECEDENT TRAVAIL
BNE.S WAIT_BLITTER
RTS
;===================
PAGEUP:
MOVEM.L	D0/A0,-(A7)

BSR	WAITBOT			;ATTENDS LIGNE RASTER

;MET ADRESSE ECRAN 1 DANS POINTEURS ECRAN POUR ANIMATION

MOVE.L	#SCREEN1+[40*256*0],DRAWPLANE1		; RASTPORT STRUCTURE
MOVE.L	#SCREEN1+[40*256*1],DRAWPLANE2		; RASTPORT STRUCTURE
MOVE.L	#SCREEN1+[40*256*2],DRAWPLANE3		; RASTPORT STRUCTURE

;MET ADRESSE ECRAN 2 DANS LISTE COPPER

MOVE.W #SCREEN2+[40*256*0]/65536,HI1
MOVE.W #SCREEN2+[40*256*0]&65535,LO1
MOVE.W #SCREEN2+[40*256*1]/65536,HI2
MOVE.W #SCREEN2+[40*256*1]&65535,LO2
MOVE.W #SCREEN2+[40*256*2]/65536,HI3
MOVE.W #SCREEN2+[40*256*2]&65535,LO3

MOVEM.L	(A7)+,D0/A0		
RTS

****************************
* Pass lower screen to VDC *
*  while drawing the other *
****************************

PAGEDOWN:
MOVEM.L	D0/A0,-(A7)

BSR	WAITBOT

;MET ADRESSE ECRAN 2 DANS POINTEURS ECRAN POUR ANIMATION

MOVE.L	#SCREEN2+[40*256*0],DRAWPLANE1		; RASTPORT STRUCTURE
MOVE.L	#SCREEN2+[40*256*1],DRAWPLANE2		; RASTPORT STRUCTURE
MOVE.L	#SCREEN2+[40*256*2],DRAWPLANE3		; RASTPORT STRUCTURE

;MET ADRESSE ECRAN 1 DANS LISTE COPPER

MOVE.W #SCREEN1+[40*256*0]/65536,HI1
MOVE.W #SCREEN1+[40*256*0]&65535,LO1
MOVE.W #SCREEN1+[40*256*1]/65536,HI2
MOVE.W #SCREEN1+[40*256*1]&65535,LO2
MOVE.W #SCREEN1+[40*256*2]/65536,HI3
MOVE.W #SCREEN1+[40*256*2]&65535,LO3

MOVEM.L	(A7)+,D0/A0
RTS

WAITBOT:			;ATTENDS LIGNE 293
	MOVE.L $DFF004,D0       
	ROR.L #8,D0
	CMP #293,D0
	BNE.S WAITBOT
RTS

********************
* Clear the screen *
********************

CLWORK:
CMP #0,BLITSIZE3
BNE OK
RTS

OK:
CLWORK2:			;EFFACE PLAN 1
BTST #14,DMACONR
BNE.S	CLWORK2
MOVE.L	DRAWPLANE1,D0
ADD	CLEARSTART2,D0
MOVE.L	D0,BLTDPTH
MOVE.L	#$01000000,BLTCON0
MOVE.W	MODULO3,BLTDMOD
MOVE.W	BLITSIZE3,BLTSIZE

CLWORK3:			;EFFACE PLAN 2
BTST	#14,DMACONR
BNE.S	CLWORK3
MOVE.L	DRAWPLANE2,D0
ADD	CLEARSTART2,D0
MOVE.L	D0,BLTDPTH
MOVE.L	#$01000000,BLTCON0
MOVE.W	MODULO3,BLTDMOD
MOVE.W	BLITSIZE3,BLTSIZE

CLWORK4:			;EFFACE PLAN 3
BTST	#14,DMACONR
BNE.S	CLWORK4
MOVE.L	DRAWPLANE3,D0
ADD	CLEARSTART2,D0
MOVE.L	D0,BLTDPTH
MOVE.L	#$01000000,BLTCON0
MOVE.W	MODULO3,BLTDMOD
MOVE.W	BLITSIZE3,BLTSIZE
RTS

SURFDRAW:			;REMPLISSAGE DE SURFACE 
	MOVE.L XPLOT,A4
	MOVE.L YPLOT,A5
	MOVE.L #VPLANE,A6
	MOVE SURFCOUNT,D0
	EXT.L D0
	SUBQ.L #1,D0
	BMI SURFEND
SURFLOP1:
	MOVE.L #PUNKT,PUNKTSAVE
	MOVE (A6)+,D1
	EXT.L D1
	SUBQ.L #1,D1
SURFLOP2:
	MOVE.L (A6)+,D5
	SUBQ #1,D5
	LSL.W #1,D5
	MOVE 0(A4,D5.W),D2
	MOVE 0(A5,D5.W),D3
	SWAP D5
	SUBQ #1,D5
	LSL #1,D5
	MOVE 0(A4,D5.W),A2
	MOVE 0(A5,D5.W),A3
	JSR DRAWL
	DBRA D1,SURFLOP2
	MOVEM.L A4-A6/D0-D1,-(A7)
	MOVE ADDTAB,D0
	ADDQ #2,ADDTAB
	MOVE.L #SURFACES,A0
	MOVE (A0,D0.W),D1
	LSL.W #2,D1
	MOVE.L SURFFARGER,A0
	MOVE.L (A0,D1.W),D2
	MOVE.B D2,PLANEBIT1
	LSR.L #8,D2	
	MOVE.B D2,PLANEBIT2
	LSR.L #8,D2	
	MOVE.B D2,PLANEBIT3
	BSR PLOT_FILL
	BSR ORPLANE
	MOVEM.L (A7)+,A4-A6/D0-D1
	DBRA D0,SURFLOP1
SURFEND:
	BSR CLEARDATAS
	MOVE.B #0,CHECKBIT2
	MOVE #0,ADDTAB
	RTS

ADDTAB: DC.W 0
*******************************************************************
* Draw-line routine, The points are passed in D2,D3 (start point) *
* and A2, A3 (end point)                                          *
*******************************************************************

DRAWL:
MOVEM.L	D0-D3/A0-A1,-(A7)
	MOVE.L D2,D0
	MOVE.L D3,D1
	MOVE.L A2,D2
	MOVE.L A3,D3
	MOVE.L PUNKTSAVE,A0
	ADDQ.B #1,CHECKBIT
	CMP.B #1,CHECKBIT
	BGT NOTFIRST
	MOVE D0,XMIN 
	MOVE D1,YMIN
	MOVE D2,XMAX
	MOVE D3,YMAX
NOTFIRST:
	CMP XMIN,D0
	BGE NEFT1
	MOVE D0,XMIN
NEFT1:
	CMP XMAX,D0
	BLE NEFT2
	MOVE D0,XMAX
NEFT2:

	CMP YMIN,D1
	BGE NEFT3
	MOVE D1,YMIN
NEFT3:
	CMP YMAX,D1
	BLE NEFT4
	MOVE D1,YMAX
NEFT4:

	CMP XMIN,D2
	BGE NEFT5
	MOVE D2,XMIN
NEFT5:
	CMP XMAX,D2
	BLE NEFT6
	MOVE D2,XMAX
NEFT6:

	CMP YMIN,D3
	BGE NEFT7
	MOVE D3,YMIN
NEFT7:
	CMP YMAX,D3
	BLE NEFT8
	MOVE D3,YMAX
NEFT8:
	CMP D1,D3
	BNE NEFT9  
	MOVE D0,(A0)+
	MOVE D1,(A0)+
	MOVE D2,(A0)+
	MOVE D3,(A0)+
	MOVE.L A0,PUNKTSAVE
	MOVEM.L	(A7)+,D0-D3/A0-A1
	RTS
NEFT9:
	MOVE D0,(A0)+
	MOVE D1,(A0)+
	MOVE D2,(A0)+
	MOVE D3,(A0)+
	MOVE.L A0,PUNKTSAVE
BSR	DRAW

	MOVEM.L	(A7)+,D0-D3/A0-A1
RTS

****************
* Blitter Line *
****************
CHANGERS1: DC.W 0
CHANGERS2: DC.W 0

DRAW:
CMP D1,D3
BGE ALLRIGHT
MOVE D2,CHANGERS1
MOVE D3,CHANGERS2
MOVE D0,D2
MOVE D1,D3
MOVE CHANGERS1,D0
MOVE CHANGERS2,D1
ALLRIGHT:
MOVEM.L	D2-D7/A2-A3,-(A7)
MOVEQ	#$F,D4
AND.W	D2,D4				; LOW 4 BITS
SUB.W	D3,D1				; HEIGHT
MULU	#320/8,D3			; START ADDRESS
SUB.W	D2,D0				; WIDTH
BLT.S	NO1
TST.W	D1
BLT.S	NO2
CMP.W	D0,D1
BGE.S	NO3
MOVEQ	#$11,D7
BRA.S	OCTSEL				; OCTANT #
NO3:
MOVEQ	#1,D7
EXG	D1,D0
OCTSEL:
BRA.S	NO4
NO2:
NEG.W	D1
CMP.W	D0,D1
BGE.S	SKIP
MOVEQ	#$19,D7
BRA.S	NO4
SKIP:
MOVEQ	#5,D7
EXG	D1,D0
NO4:
BRA.S	OCTSSEL
NO1:
NEG.W	D0
TST.W	D1
BLT.S	NO11

CMP.W	D0,D1
BGE.S	NO12
MOVEQ	#$15,D7
BRA.S	OCTSEL2

NO12:
MOVEQ	#9,D7
EXG	D1,D0
OCTSEL2:
BRA.S	OCTSSEL

NO11:
NEG.W	D1
CMP.W	D0,D1
BGE.S	NO13
MOVEQ	#$1D,D7
BRA.S	OCTSSEL
NO13:
MOVEQ	#$D,D7
EXG	D1,D0
OCTSSEL:
ADD.W	D1,D1
ASR.W	#3,D2
EXT.L	D2
ADD.L	D2,D3				; TOTAL OFFSET
MOVE.W	D1,D2
SUB.W	D0,D2
BGE.S	NOMINUS
ORI.W	#$40,D7				; SIGN = -
NOMINUS:
LEA	$DFF000,A0
MOVE.W	D2,A3
MOVE.W	#$FFFF,D6			; LINEPTRN
WAITBL:
BTST	#6,2(A0)
BNE.S	WAITBL
MOVE.W	D1,$62(A0)			; 4Y
MOVE.W	D2,D1
SUB.W	D0,D1
MOVE.W	D1,$64(A0)			; 4Y-4X
MOVEQ	#-1,D1
MOVE.L	D1,$44(A0)			; AFWM+ALWM
MOVE.W	#320/8,$60(A0)			; BITMAP WIDTH IN BYTES
MOVE.W	D7,D5
ADDQ.W	#1,D0
ASL.W	#6,D0
ADDQ.W	#2,D0				; BLITSIZE
MOVE.W	D4,D2
SWAP	D4
ASR.L	#4,D4				; FIRST PIXELPOS
ORI.W	#$B00,D4			; USE ABD
MOVE.W	#$8000,$74(A0)			; INDEX
CLR.W	D1
NOSPESH:
MOVE.L	#PLANE,D7			; POINTER
SWAP	D5
MOVE.W	D4,D5
MOVE.B	#$4A,D5				; MINTERMS
SWAP	D5
ADD.L	D3,D7
WTBL2:
BTST	#6,2(A0)
BNE.S	WTBL2
BSET #1,D5                              ; SINGLE BIT
MOVE.L	D5,$40(A0)			; BLTCON0 & 1
MOVE.W	A3,$52(A0)			; 2Y-X
MOVE.L	D7,$48(A0)
MOVE.L	D7,$54(A0)			; START ADDRESS OF LINE
MOVE.W	D6,$72(A0)			; PATTERN
MOVE.W	D0,$58(A0)			; SIZE
MOVEM.L	(A7)+,D2-D7/A2-A3
RTS

PLOT_FILL:
	MOVE XMIN,D0 
	MOVE YMIN,D1
	MOVE XMAX,D2
	MOVE YMAX,D3
	ADDQ.B #1,CHECKBIT2
	CMP.B #1,CHECKBIT2
	BGT NOTFIRST2
	MOVE D0,GXMIN 
	MOVE D1,GYMIN
	MOVE D2,GXMAX
	MOVE D3,GYMAX
NOTFIRST2:
	CMP GXMIN,D0
	BGE KEFT1
	MOVE D0,GXMIN
KEFT1:
	CMP GXMAX,D0
	BLE KEFT2
	MOVE D0,GXMAX
KEFT2:

	CMP GYMIN,D1
	BGE KEFT3
	MOVE D1,GYMIN
KEFT3:
	CMP GYMAX,D1
	BLE KEFT4
	MOVE D1,GYMAX
KEFT4:

	CMP GXMIN,D2
	BGE KEFT5
	MOVE D2,GXMIN
KEFT5:
	CMP GXMAX,D2
	BLE KEFT6
	MOVE D2,GXMAX
KEFT6:

	CMP GYMIN,D3
	BGE KEFT7
	MOVE D3,GYMIN
KEFT7:
	CMP GYMAX,D3
	BLE KEFT8
	MOVE D3,GYMAX
KEFT8:
	MOVE.L #PUNKT,A0
	MOVE.L #BUGLINES,A2
PLOT2:
	CMP #0,(A0) 	
	BNE PLOTIT
        JMP BO_AND_F
PLOTIT:
	MOVE 2(A0),D0
	CMP YMIN,D0
	BNE NOTMIN
	ADD.L #4,A0
	BRA PLOT2
NOTMIN:	
	CMP YMAX,D0
	BNE NOTMAX
	ADD.L #4,A0
	BRA PLOT2
NOTMAX:
	MOVE.L #PLANE,A1
	MOVE (A0),D0    
	MOVE D0,D2      
	LSR.W #4,D0     
	MOVE D0,D1      
	LSL.W #1,D0     
	LSL.W #4,D1     
	SUB D1,D2       
	MOVE 2(A0),D3   
	MOVE.L #BUGLINES-2,A3
CHECKSAVE:
	CMP 2(A3),D3
	BEQ NOSAVE
	ADDQ.L #2,A3
	CMP.L A2,A3
	BNE CHECKSAVE
	MOVE D3,(A2)+
NOSAVE:
	MULU #40,D3	
	ADD D0,D3       
	MOVE #15,D5
	SUB D2,D5
	CMP #7,D5
	BGT NOSHIT
	ADDQ.L #1,A1
	ADD #8,D5
NOSHIT:
	BSET D5,(A1,D3) ; SET BIT
	ADD.L #4,A0
	BRA PLOT2		

BO_AND_F:			; BUGOFF AND FILLDATAS
	MOVE.L #BUGLINES,A2
	MOVE.L #PLANE,A1
	MOVE XMAX,D0    
	LSR.W #4,D0     
	LSL.W #1,D0     
	MOVE YMAX,D3    
	MULU #40,D3	
	ADD D0,D3       
	ADD D3,A1         
	MOVE.L A1,FILLSTART

	MOVE XMIN,D1    
	LSR.W #4,D1     
	LSL.W #1,D1     
	SUB D1,D0       
	LSR.W #1,D0
	ADDQ #1,D0
	MOVE D0,D1
	LSL.W #1,D1
	MOVE #40,D2
	SUB D1,D2
	MOVE D2,D3
	SWAP D3
	MOVE D2,D3	
	MOVE.L D3,MODULO
	MOVE YMAX,D1
	SUB YMIN,D1     
	CLR.L D4
	MOVE D1,D4
	ADDQ #1,D1
	LSL.W #6,D1     	
	ADD D0,D1       	
	MOVE D1,BLITSIZE
	MOVE D0,D3
	SUBQ #1,D0
	LSL.W #1,D0
	MULU #40,D4
	ADD D0,D4
	MOVE.L FILLSTART,A1
	SUB.L D4,A1
	MOVE.L A1,ORSTART
BUGOFF:
	MOVE.L FILLSTART,A1
	MOVE D3,D0
	CLR D1
	CLR D2
	MOVE (A2)+,D1
	CMP #0,D1
	BEQ FILL
	MOVE YMAX,D2
	SUB D1,D2
	MULU #40,D2
	SUB D2,A1      
	MOVE.L A1,A0
	ADDQ.L #2,A0   
	SUBQ #1,D0
	LSL.W #1,D0    	
	SUB D0,A1      

	MOVE.L #BUGBYTES,A3
	MOVE.L #BYTEHOMES,A4	
	SUBQ.L #1,A1
	CLR D0
	CLR D1
	CLR D2
ANTILOOP:
	ADDQ.L #1,A1
	CMP.B #0,(A1)
	BEQ CHECK
	ADDQ.B #1,D2
	MOVE.B (A1),(A3)+
	MOVE.L A1,(A4)+
CHECK:
	CMP.L A0,A1
	BNE ANTILOOP

	MOVE.L #BUGBYTES,A0
	MOVE.B #9,D0
LOOPLEFT:
	SUBQ.B #1,D0
	BTST D0,(A0)    ; LEFTBIT
	BEQ LOOPLEFT

	MOVE.L A0,A3    ; LEFT BIT ADRESS
	SUBQ.B #1,D2
	ADD D2,A0       ; RIGHT BIT ADRESS
LOOPRIGHT:
	ADDQ.B #1,D1
	BTST D1,(A0)   ; RIGHT BIT
	BEQ LOOPRIGHT

	CMP.B D0,D1
	BNE YEAH
	CMP #0,D2
	BEQ YEAH2
YEAH:
	MOVE.L #MASK,A1 
	BSET D0,(A1)
	ADD D2,A1 
	BSET D1,(A1)     
YEAH2:
	MOVE.L #BYTEHOMES,A1
	MOVE.L #MASK,A0	
CHANGELOOP:
	MOVE.L (A1)+,A3
	MOVE.B (A0)+,(A3)	
	CMP.L #0,(A1)
	BNE CHANGELOOP

	MOVE.L #BUGBYTES,A0
	MOVE #14,D0
CLEARLOOP:
	CLR.L (A0)+
	DBRA D0,CLEARLOOP	
	JMP BUGOFF

FILL: 
	MOVE.L #PUNKT,A0
	MOVE #24,D0
CLEARLOOP2:
	CLR.L (A0)+
	DBRA D0,CLEARLOOP2	
	MOVE.B #0,CHECKBIT
	
FILL2:
	BTST #14,DMACONR  ; SYNC
	BNE FILL2

	MOVE #%0000100111110000,BLTCON0 ; BLITCON0. 
	      ;^^^^!!!!********  ^=SHIFTING A. !=USE A,B,C,D.
              ; *=LOGIC FUNCTION CODE.

	MOVE #%0000000000010010,BLTCON1 ; BLITCON1. 
	      ;^^^^       !@#$   ^=SHIFTING B. !=EXCLUSIVE FILL EN.
	      ; @=INCLUSIVE FILL EN. #=FILL CARRY INPUT. $=DESCEND.

	MOVE.L #$FFFFFFFF,BLTAFWM	; LW & FW MASK
	MOVE.L FILLSTART,BLTAPTH	; LOW-RIGHT CORNER OF FILL ; A
	MOVE.L FILLSTART,BLTDPTH	; SAME                     ; D
	MOVE.L MODULO,BLTAMOD		; MOD. A & D
	MOVE BLITSIZE,BLTSIZE		; TRIGGER & SIZE
	RTS

ORPLANE: 
	MOVE.L #PLANE,A0
	MOVE.L ORSTART,A1
	SUB.L A0,A1         

	CMP.B #1,PLANEBIT1
	BNE NEXTPLANE1
ORPLANE2:
	BTST #14,DMACONR		; SYNC
	BNE ORPLANE2
	MOVE.L DRAWPLANE1,A0
	ADD.L A1,A0			; DEST
	MOVE.L #$0DFC0000,BLTCON0	; BLITCON0+1. 
	MOVE.L #$FFFFFFFF,BLTAFWM	; LW & FW MASK
	MOVE.L ORSTART,BLTAPTH		;  A
	MOVE.L A0,BLTBPTH		; B
	MOVE.L A0,BLTDPTH		; D
	MOVE.L MODULO,BLTAMOD		; MOD. A & D
	MOVE   MODULO,BLTBMOD		; MOD. B
	MOVE BLITSIZE,BLTSIZE		; TRIGGER & SIZE
NEXTPLANE1:

	CMP.B #1,PLANEBIT2
	BNE NEXTPLANE2
ORPLANE3:
	BTST #14,DMACONR		; SYNC
	BNE ORPLANE3
	MOVE.L DRAWPLANE2,A0
	ADD.L A1,A0			; DEST
	MOVE.L #$0DFC0000,BLTCON0	; BLITCON0+1. 
	MOVE.L #$FFFFFFFF,BLTAFWM	; LW & FW MASK
	MOVE.L ORSTART,BLTAPTH		; A
	MOVE.L A0,BLTBPTH		; B
	MOVE.L A0,BLTDPTH		; D
	MOVE.L MODULO,BLTAMOD		; MOD. A & D
	MOVE   MODULO,BLTBMOD		; MOD. B
	MOVE BLITSIZE,BLTSIZE		; TRIGGER & SIZE
NEXTPLANE2:

	CMP.B #1,PLANEBIT3
	BNE NEXTPLANE3
ORPLANE4:
	BTST #14,DMACONR		; SYNC
	BNE ORPLANE4
	MOVE.L DRAWPLANE3,A0
	ADD.L A1,A0			; DEST
	MOVE.L #$0DFC0000,BLTCON0	; BLITCON0+1. 
	MOVE.L #$FFFFFFFF,BLTAFWM	; LW & FW MASK
	MOVE.L ORSTART,BLTAPTH		; A
	MOVE.L A0,BLTBPTH		; B
	MOVE.L A0,BLTDPTH		; D
	MOVE.L MODULO,BLTAMOD		; MOD. A & D
	MOVE   MODULO,BLTBMOD		; MOD. B
	MOVE BLITSIZE,BLTSIZE		; TRIGGER & SIZE
NEXTPLANE3:

ORPLANE5:
	BTST #14,DMACONR		; SYNC
	BNE ORPLANE5
	MOVE.L #$01000000,BLTCON0	; BLITCON0+1. 
	MOVE.L #$FFFFFFFF,BLTAFWM	; LW & FW MASK
	MOVE.L ORSTART,BLTDPTH		; A
	MOVE MODULO,BLTDMOD		; MOD. A & D
	MOVE BLITSIZE,BLTSIZE		; TRIGGER & SIZE
	RTS

CLEARDATAS:
	MOVE GXMIN,D1  
	LSR.W #4,D1    
	LSL.W #1,D1    
	MOVE GYMIN,D3  
	MULU #40,D3	
	ADD D1,D3      
	MOVE D3,CLEARSTART1

	MOVE GXMAX,D0  
	LSR.W #4,D0    
	LSL.W #1,D0    
	SUB D1,D0      
	LSR.W #1,D0
	ADDQ #1,D0
	MOVE D0,D1
	LSL.W #1,D1
	MOVE #40,D2
	SUB D1,D2
	MOVE D2,MODULO2
	MOVE GYMAX,D1
	SUB GYMIN,D1     
	ADDQ #1,D1
	LSL.W #6,D1     	
	ADD D0,D1       	
	MOVE D1,BLITSIZE2
	RTS

PUNKTSAVE: DC.L 0
DRAWPLANE1: DC.L 0
DRAWPLANE2: DC.L 0
DRAWPLANE3: DC.L 0
CHECKBIT: DC.B 0
CHECKBIT2: DC.B 0
PLANEBIT1: DC.B 1
PLANEBIT2: DC.B 0
PLANEBIT3: DC.B 1
EVEN
CLEARSTART1: DC.W 0
CLEARSTART2: DC.W 0
ORSTART: DC.L 0
FILLSTART: DC.L 0
MODULO: DC.L 0
BLITSIZE: DC.W 0
MODULO2: DC.W 0
BLITSIZE2: DC.W 0
MODULO3: DC.W 0
BLITSIZE3: DC.W 0
XMIN: DC.W 0
XMAX: DC.W 0
YMIN: DC.W 0
YMAX: DC.W 0
GXMIN: DC.W 0
GXMAX: DC.W 0
GYMIN: DC.W 0
GYMAX: DC.W 0
PUNKT: BLK.W 4*10,0
BUGLINES: BLK.W 10,0
BUGBYTES: BLK.B 10,0
MASK: BLK.B 10,0
BYTEHOMES: BLK.L 10,0

*****************************************************
* Sine and cosine function, angle is passed in D0   *
* and the sine and cosine are returned in D1 and D2 *
*****************************************************

sincos:
tst.w	d0				; Angle neg. add 360°
bpl.s	NoAddi
add.w	#360,d0
noaddi:
move.l	#sintab,a1			; Beginning ad. of sinetable
move.l	d0,d2				; Angle in d0 and d2
lsl.w	#1,d0				; Angle times 2 as index
move.w	0(a1,d0.w),d1			; Sine to D1
cmp.w	#270,d2				; Calc cosine through
blt.s	plus9				; displacement of sine value
sub.w	#270,d2				; by 90 degrees
bra	sendsin
plus9:
add.w	#90,d2
sendsin:
lsl.w	#1,d2
move.w	(a1,d2.w),d2			; Cosine to D2

rts					; And return

*****************************************************
* Sine function					    *
* Angle is passed in d0 and the sine returned in D1 *
*****************************************************

sin:
move.l	#sintab,a1
tst.w	d0
bpl.s	sin1
add.w	#360,d0
sin1:
lsl.w	#1,d0
move.w	(a1,d0.w),d1
rts

*************************************************************
* Init the main diagonal of the result matrix with          *
* ones which were multiplied by 2^14. This subroutine must  *
* be called at least once before the call by rotate, or the *
* result matrix will only consist of zeros.                 *
*************************************************************

matinit:
moveq	#0,d1
move.w	#16384,d2			; The initial value for
move.w	d2,Matrix11			; the main diagonal of
move.w	d1,Matrix12			; the result matrix
move.w	d1,Matrix13			; all other elements 
move.w	d1,Matrix21			; at zero.
move.w	d2,Matrix22
move.w	d1,Matrix23
move.w	d1,Matrix31
move.w	d1,Matrix32
move.w	d2,Matrix33
rts

***************************************************************
* Multiplication of the rotation matrix by the rotation       *
* matrix for rotation about the X-Axis                        *
***************************************************************

xrotate:
move.w	XAngle,d0		; Multiply matrix11-matrix33
jsr	SinCos			; with the rotation matrix
move.w	d1,sinx			; for a rotation about the X-Axis
move.w	d2,cosx
move.w	d1,d3
move.w	d2,d4
move.w	Matrix11,Rotx11		; The first column of the matrix
move.w	Matrix21,Rotx21		; Does not change with X rotation
move.w	Matrix31,Rotx31
muls	Matrix12,d2
muls	Matrix13,d1
sub.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx12
move.w	d3,d1
move.w	d4,d2
muls	Matrix22,d2
muls	Matrix23,d1
sub.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,rotx22
move.w	d3,d1
move.w	d4,d2
muls	Matrix32,d2
muls	Matrix33,d1
sub.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx32
move.w	d3,d1
move.w	d4,d2
muls	Matrix12,d1
muls	Matrix13,d2
add.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx13
move.w	d3,d1
move.w	d4,d2
muls	Matrix22,d1
muls	Matrix23,d2
add.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx23
muls	Matrix32,d3
muls	Matrix33,d4
add.l	d3,d4
lsl.l	#2,d4
swap	d4
move.w	d4,Rotx33
move.l	#Rotx11,a1
move.l	#Matrix11,a2
moveq	#8,d7			; Number of matrix elements

roxlop1:
move.w	(a1)+,(a2)+		; Copy result matrix, which
dbra	d7,roxlop1		; is still in ROTXnn, to MATRIXnn
rts

***********************************************************
* Multiply the general rotation matrix by the Y-axis	  *
* rotation matrix. Results are stored in the general	  *
* rotation matrix					  *
***********************************************************

yrotate:
move.w	YAngle,d0		; Angle around which rotation is made
jsr	SinCos
move.w	d1,siny
move.w	d2,cosy
move.w	d1,d3			; Sine of Y-Angle
move.w	d2,d4			; Cosine of Y-angle

muls	Matrix11,d2
muls	Matrix13,d1
add.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx11
move.w	d3,d1
move.w	d4,d2

muls	Matrix21,d2
muls	Matrix23,d1
add.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx21
move.w	d3,d1
move.w	d4,d2

muls	Matrix31,d2
muls	Matrix33,d1
add.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx31
neg.w	d3
move.w	d3,d1				; -siny in the rotation mat.
move.w	d4,d2

move.w	Matrix12,Rotx12
move.w	Matrix22,Rotx22			; The second column
move.w	Matrix32,Rotx32			; of the starting matrix
					; does not change.
muls	Matrix11,d1
muls	Matrix13,d2
add.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx13
move.w	d3,d1
move.w	d4,d2

muls	Matrix21,d1
muls	Matrix23,d2
add.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx23

muls	Matrix31,d3
muls	Matrix33,d4
add.l	d3,d4
lsl.l	#2,d4
swap	d4
move.w	d4,Rotx33

moveq	#8,d7

move.l	#Rotx11,a1			; Address of result matrix
move.l	#Matrix11,a2			; Address of original matrix

yrotlop1:
move.w	(a1)+,(a2)+			; Copy result matrix
dbra	d7,yrotlop1			; to original matrix
rts

********************************************
* Z-axis - Rotation matrix multiplications *
********************************************

zrotate:
move.w	ZAngle,d0
jsr	SinCos
move.w	d1,SinZ
move.w	d2,CosZ
move.w	d1,d3
move.w	d2,d4

muls	Matrix11,d2
muls	Matrix12,d1
sub.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx11
move.w	d3,d1
move.w	d4,d2

muls	Matrix21,d2
muls	Matrix22,d1
sub.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx21
move.w	d3,d1
move.w	d4,d2

muls	Matrix31,d2
muls	Matrix32,d1
sub.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx31
move.w	d3,d1
move.w	d4,d2

muls	Matrix11,d1
muls	Matrix12,d2
add.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx12
move.w	d3,d1
move.w	d4,d2

muls	Matrix21,d1
muls	Matrix22,d2
add.l	d1,d2
lsl.l	#2,d2
swap	d2
move.w	d2,Rotx22

muls	Matrix31,d3
muls	Matrix32,d4
add.l	d3,d4
lsl.l	#2,d4
swap	d4
move.w	d4,Rotx32

move.w	Matrix13,Rotx13			; The third column remains
move.w	Matrix23,Rotx23			; Unchanged
move.w	Matrix33,Rotx33

moveq	#8,d7
move.l	#Rotx11,a1
move.l	#Matrix11,a2

zrotlop1:
move.w	(a1)+,(a2)+			; Copy to general
dbra	d7,zrotlop1			; rotation matrix
rts

**************************************************************
* Multiply every point whose Array address is in datx etc.   *
* by previous translation of the coordinate source to        *
* point [offx,offy,offz], with the general rotation matrix.  *
* The coordinate source of the result coordinates is then    *
* moved to point [xoffs,yoffs,zoffs]                         *
**************************************************************

rotate:
move.w	NumMark,d0			; Number of points to be
ext.l	d0				; transformed as counter
subq.l	#1,d0

move.l	datx,a1
move.l	daty,a2
move.l	datz,a3

move.l	pointx,a4
move.l	pointy,a5
move.l	pointz,a6

rotate1:
move.w	(a1)+,d1			; X-Coordinate
add.w	Offx,d1
move.w	d1,d4

move.w	(a2)+,d2			; Y-Coordinate
add.w	Offy,d2			; Translation to point[offx,offy,offz]
move.w	d2,d5

move.w	(a3)+,d3			; Z-Coordinate
add.w	offz,d3
move.w	d3,d6

muls	Matrix11,d1
muls	Matrix21,d2
muls	Matrix31,d3

add.l	d1,d2
add.l	d2,d3
lsl.l	#2,d3
swap	d3
add.w	xoffs,d3
move.w	d3,(a4)+			; Rotated X-Coordinate

move.w	d4,d1
move.w	d5,d2
move.w	d6,d3

muls	Matrix12,d1
muls	Matrix22,d2
muls	Matrix32,d3
add.l	d1,d2
add.l	d2,d3
lsl.l	#2,d3
swap	d3
add.w	yoffs,d3
move.w	d3,(a5)+		; Rotated Y-Coordinate

muls	Matrix13,d4
muls	Matrix23,d5
muls	Matrix33,d6
add.l	d4,d5
add.l	d5,d6
lsl.l	#2,d6
swap	d6
add.w	Zoffs,d6
move.w	d6,(a6)+		; Rotated Z-Coordinate

dbra	d0,rotate1
rts

*********************************************************************
* Perspective, calculated from the transformed points in the arrays *
* pointx, pointy and pointz the screen coordinates, which           *
* are then stored in the arrays xplot and yplot.                    *
*********************************************************************

pers:
move.l	pointx,a1		; Beginning address of point arrays
move.l	pointy,a2
move.l	pointz,a3

move.l	xplot,a4		; Start address of display coordinate
move.l	yplot,a5		; array.

move.w	NumMark,d0		; Number of points to be transformed
ext.l	d0
subq.l	#1,d0

perlop:
move.w	(a3)+,d5		; Z-coordinate of object
move.w	d5,d6
move.w	Dist,d4			; Enlargement factor
sub.w	d5,d4			; Dist minus Z-coordinate of obj.coord
ext.l	d4
lsl.l	#8,d4			; Times 256 for value fitting
move.w	Zobs,d3			; Projection center Z-coordinates
ext.l	d3

sub.l	d6,d3			; Minus z-coordinate of object
bne.s	pers1

moveq	#0,d1			; Catch division by zero
addq.l	#2,a1
addq.l	#2,a2
move.w	d1,(a4)+
move.w	d1,(a5)+
bra.s	perend1

pers1:
divs	d3,d4
move.w	d4,d3
move.w	(a1)+,d1		; X-Coordinate of object
move.w	d1,d2
neg.w	d1
muls	d1,d3			; Multiplied by perspective factor
lsr.l	#8,d3			; /256 save value fitting

add.w	d3,d2			; Add to x-coordinate
add.w	x0,d2			; Add screen offset (center point)
move.w	d2,(a4)+		; Display X-coordinate

move.w	(a2)+,d1		; Y-Coordinate of object
move.w	d1,d2
neg.w	d1
muls	d1,d4
lsr.l	#8,d4			; /256

add.w	d4,d2
neg.w	d2			; Display offset, mirror of Y-Axis
add.w	y0,d2			; Source at [X0,Y0]
move.w	d2,(a5)+		; Display Y-Coordinate
perend1:
dbra	d0,perlop		; Until all points transformed
rts

***********************************
* Variables for the basic program *
***********************************

* Sine table starts here

sintab:
dc.w	0,286,572,857,1143,1428,1713,1997,2280
dc.w	2563,2845,3126,3406,3686,3964,4240,4516
dc.w	4790,5063,5334,5604,5872,6138,6402,6664
dc.w	6924,7182,7438,7692,7943,8192,8438,8682
dc.w	8923,9162,9397,9630,9860,10087,10311,10531
dc.w	10749,10963,11174,11381,11585,11786,11982,12176
dc.w	12365,12551,12733,12911,13085,13255,13421,13583
dc.w	13741,13894,14044,14189,14330,14466,14598,14726
dc.w	14849,14962,15082,15191,15296,15396,15491,15582
dc.w	15668,15749,15826,15897,15964,16026,16083,16135
dc.w	16182,16225,16262,16294,16322,16344,16362,16374
dc.w	16382,16383

dc.w	16382,16374,16362,16344,16322,16294,16262,16225
dc.w	16182
dc.w	16135,16083,16026,15964,15897,15826,15749,15668
dc.w	15582,15491,15396,15296,15191,15082,14962,14849
dc.w	14726,14598,14466,14330,14189,14044,13894,13741
dc.w	13583,13421,13255,13085,12911,12733,12551,12365
dc.w	12176,11982,11786,11585,11381,11174,10963,10749
dc.w	10531,10311,10087,9860,9630,9397,9162,8923
dc.w	8682,8438,8192,7943,7692,7438,7182,6924
dc.w	6664,6402,6138,5872,5604,5334,5063,4790
dc.w	4516,4240,3964,3686,3406,3126,2845,2563
dc.w	2280,1997,1713,1428,1143,857,572,286,0

dc.w	-286,-572,-857,-1143,-1428,-1713,-1997,-2280
dc.w	-2563,-2845,-3126,-3406,-3686,-3964,-4240,-4516
dc.w	-4790,-5063,-5334,-5604,-5872,-6138,-6402,-6664
dc.w	-6924,-7182,-7438,-7692,-7943,-8192,-8438,-8682
dc.w	-8923,-9162,-9397,-9630,-9860,-10087,-10311,-10531
dc.w	-10749,-10963,-11174,-11381,-11585,-11786,-11982,-12176
dc.w	-12365,-12551,-12733,-12911,-13085,-13255,-13421,-13583
dc.w	-13741,-13894,-14044,-14189,-14330,-14466,-14598,-14726
dc.w	-14849,-14962,-15082,-15191,-15296,-15396,-15491,-15582
dc.w	-15668,-15749,-15826,-15897,-15964,-16026,-16083,-16135
dc.w	-16182,-16225,-16262,-16294,-16322,-16344,-16362,-16374
dc.w	-16382,-16383

dc.w	-16382,-16374,-16362,-16344,-16322,-16294,-16262,-16225
dc.w	-16182
dc.w	-16135,-16083,-16026,-15964,-15897,-15826,-15749,-15668
dc.w	-15582,-15491,-15396,-15296,-15191,-15082,-14962,-14849
dc.w	-14726,-14598,-14466,-14330,-14189,-14044,-13894,-13741
dc.w	-13583,-13421,-13255,-13085,-12911,-12733,-12551,-12365
dc.w	-12176,-11982,-11786,-11585,-11381,-11174,-10963,-10749
dc.w	-10531,-10311,-10087,-9860,-9630,-9397,-9162,-8923
dc.w	-8682,-8438,-8192,-7943,-7692,-7438,-7182,-6924
dc.w	-6664,-6402,-6138,-5872,-5604,-5334,-5063,-4790
dc.w	-4516,-4240,-3964,-3686,-3406,-3126,-2845,-2563
dc.w	-2280,-1997,-1713,-1428,-1143,-857,-572,-286,0

x0:dc.w	0
y0:dc.w	0
z0:dc.w	0
z1:dc.w	0

nummark:dc.w	0		; Number of points

pointx:dc.l	0		; Variables of point arrays for world,
pointy:dc.l	0		; view, and screen coordinates
pointz:dc.l	0

xplot:dc.l	0
yplot:dc.l	0

datx:dc.l	0
daty:dc.l	0
datz:dc.l	0

sinx:dc.w	0		; Temporary storage for sin & cos
siny:dc.w	0		; values
sinz:dc.w	0

cosx:dc.w	0
cosy:dc.w	0
cosz:dc.w	0

var1:dc.w	0		; General variables
var2:dc.w	0
var3:dc.w	0

xangle:dc.w	0		; Variables for passing angles
yangle:dc.w	0		; to the rotation subroutine
zangle:dc.w	0

leftx:dc.w	0
lefty:dc.w	0
rightx:dc.w	0
righty:dc.w	0

dist:dc.w	0
zobs:dc.w	1500

rotx11:dc.w	16384		; Space here for the result matrix
rotx12:dc.w	0		; of matrix multiplication
rotx13:dc.w	0
rotx21:dc.w	0
rotx22:dc.w	16384
rotx23:dc.w	0
rotx31:dc.w	0
rotx32:dc.w	0
rotx33:dc.w	16384

matrix11:dc.w	0		; Space here for the general rotation
matrix12:dc.w	0		; matrix
matrix13:dc.w	0
matrix21:dc.w	0
matrix22:dc.w	0
matrix23:dc.w	0
matrix31:dc.w	0
matrix32:dc.w	0
matrix33:dc.w	0

;============================================================
MAIN:
BSR	GETRESO

MOVE.L OBJSURFACES,WORLDPLA

BSR	MAKEWRLD		; CREATE THE WORLD SYSTEM
BSR	WORLDSET		; PASS THE WORLD PARAMETERS
BSR	SETROTDP		; INIT OBS.REF.POINT
BSR	PAGEUP
BSR	CLWORK
BSR	PAGEDOWN
BSR	CLWORK			; INIT BOTH PAGES
BSR	INP_CHAN		; INPUT AND CHANGE PARAMETERS

MAINLOP1:
BSR	POINTROT
BSR	PERS			; DO PERSPECTIVE
BSR     HIDEIT 
BSR     SURFDRAW
BSR	PAGEUP			; DISPLAY IT

BSR	INP_CHAN		; INPUT NEW PARAMETERS
BSR	CLWORK

	MOVE CLEARSTART1,CLEARSTART2
	MOVE MODULO2,MODULO3
	MOVE BLITSIZE2,BLITSIZE3

BSR	POINTROT		; ROTATE
BSR	PERS			; PERSPECTIVE
BSR     HIDEIT
BSR     SURFDRAW
BSR	PAGEDOWN
BSR	INP_CHAN		; INPUT PARAMETERS
BSR	CLWORK

	MOVE CLEARSTART1,CLEARSTART2
	MOVE MODULO2,MODULO3
	MOVE BLITSIZE2,BLITSIZE3

BTST #6,$BFE001
BNE MAINLOP1

MAINEND:
BSR	PAGEUP
RTS

SKIFT:
	MOVE.L #XDAT0,OBJDATX
	MOVE.L #YDAT0,OBJDATY
	MOVE.L #ZDAT0,OBJDATZ
	MOVE.L #OBJSURF0,OBJSURFACES
	MOVE.L #SURFCOLORS0,SURFFARGER
	MOVE.L #POINTSNR0,A0
	MOVE (A0),HNUMMARK
	MOVE.L #SURFS0,A0
	MOVE (A0),HNUMSURF
	RTS


INP_CHAN:
	ADD.W	#2,HXANGLE
	ADD.W	#2,HYANGLE
	ADD.W	#2,HZANGLE

	CMP.W	#360,HYANGLE
	BLT.S	NOSUB
	SUB.W	#360,HYANGLE
NOSUB:
	CMP.W	#360,HXANGLE
	BLT.S	NOSUBY
	SUB.W	#360,HXANGLE
NOSUBY:
	CMP.W	#360,HZANGLE
	BLT.S	NOSUBZ
	SUB.W	#360,HZANGLE
NOSUBZ:
	CMP.W	#0,HYANGLE
	BGT.S	NOSUB4
	ADD.W	#360,HYANGLE
NOSUB4:
	CMP.W	#0,HXANGLE
	BGT.S	NOSUB5
	ADD.W	#360,HXANGLE
NOSUB5:
	CMP.W	#0,HZANGLE
	BGT.S	NOSUB6
	ADD.W	#360,HZANGLE
NOSUB6:
	RTS

************************************************
* Init the rotation reference point to [0,0,0] *
************************************************

setrotdp:
move.w	#0,hyangle		; Start rotation angle
move.w	#0,hxangle
move.w	#0,hzangle
rts

***********************************************************
* Rotation around one point, the rotation reference point *
***********************************************************

pointrot:
move.w	Hxangle,xangle	; Rotate the world around the angle
move.w	hyangle,yangle	; hxangle, hyangle, hzangle about the
move.w	hzangle,zangle
move.w	rotdpx,d0	; Rotation reference point
move.w	rotdpy,d1
move.w	rotdpz,d2
move.w	d0,xoffs
move.w	d1,yoffs
move.w	d2,zoffs	; Add for back transformation
neg.w	d0
neg.w	d1
neg.w	d2
move.w	d0,offx		; Subtract for transformation
move.w	d1,offy
move.w	d2,offz
bsr	Matinit
bsr	zrotate
bsr	yrotate
bsr	xrotate
bsr	rotate
rts

*****************************************************
* Creation of the world system from the object data *
*****************************************************

Makewrld:
move.l	ObjDatx,a1		; Create the world system by
move.l	ObjDaty,a2
move.l	ObjDatz,a3
move.l	#worldx,a4
move.l	#worldy,a5
move.l	#worldz,a6
move.w	hnummark,d0
ext.l	d0
subq.l	#1,d0
makewl1:
move.w	(a1)+,(a4)+		; Copying the object data into the
move.w	(a2)+,(a5)+		; world data
move.w	(a3)+,(a6)+
dbra	d0,makewl1

move.l worldpla,a0
move.l #wplane,a1
move hnumsurf,d0
ext.l d0
subq.l #1,d0

makewl3:
move (a0)+,d1
move d1,(a1)+
ext.l d1
subq.l #1,d1

makewl4:
move.l (a0)+,(a1)+
dbra d1,makewl4
dbra d0,makewl3
rts


***********************************************
* Pass the world parameters to base variables *
***********************************************

worldset:
move.l	#Worldx,datx		; Pass variables for rotation routine
move.l	#worldy,daty
move.l	#Worldz,datz
move.l	#viewx,pointx
move.l	#viewy,pointy
move.l	#viewz,pointz
move.w	PictureX,x0
move.w	Picturey,Y0
move.w	proz,zobs
move.l	#screenx,xplot
move.l	#screeny,yplot
move.w	hnummark,nummark
move hnumsurf,numsurf
rts
;========================
getReso:
move.w	#320/2,PictureX
move.w	#120,pictureY
rts
;========================
HIDEIT:			;CALCUL DES FACES CACHEES
	MOVE NUMSURF,D0
	EXT.L D0
	SUBQ.L #1,D0
	MOVE.L #VIEWX,A1
	MOVE.L #VIEWY,A2
 	MOVE.L #VIEWZ,A3
	MOVE.L #WPLANE,A0
	MOVE.L #VPLANE,A5
	MOVE #0,SURFCOUNT

VISIBLE:
	MOVE (A0),D1
	EXT.L D1
	MOVE 2(A0),D2
	MOVE 4(A0),D3
	MOVE 8(A0),D4
	SUBQ #1,D2
	SUBQ #1,D3
	SUBQ #1,D4
	LSL.W #1,D2
	LSL.W #1,D3
	LSL.W #1,D4
	MOVE (A1,D3.W),D6
	CMP (A1,D4.W),D6
	BNE DOIT1
	MOVE (A2,D3.W),D6
	CMP (A2,D4.W),D6
	BNE DOIT1
	MOVE (A3,D4.W),D6
	CMP (A3,D3.W),D6
	BNE DOIT1
	MOVE 12(A0),D4
	SUBQ #1,D4
	LSL #1,D4
	
DOIT1:
	MOVE (A1,D3.W),D5
	MOVE D5,KX
	SUB (A1,D2.W),D5
	MOVE D5,PX
	MOVE (A2,D3.W),D5
	MOVE D5,KY
	SUB (A2,D2.W),D5
	MOVE D5,PY
	MOVE (A3,D3.W),D5
	MOVE D5,KZ
	SUB (A3,D2.W),D5
	MOVE D5,PZ
	
	MOVE (A1,D4.W),D5
	SUB (A1,D2.W),D5	
	MOVE (A2,D4.W),D6
	SUB (A2,D2.W),D6	
	MOVE (A3,D4.W),D7
	SUB (A3,D2.W),D7	
	MOVE D5,D1
	MOVE D6,D2
	MOVE D7,D3

	MULS PY,D3
	MULS PZ,D2
	SUB D2,D3
	MOVE D3,RX
	MULS PZ,D1
	MULS PX,D7
	SUB D7,D1
	MOVE D1,RY
	MULS PX,D6
	MULS PY,D5
	SUB D5,D6
	MOVE D6,RZ
	
	MOVE PROX,D1
	SUB KX,D1
	MOVE PROY,D2
	SUB KY,D2
	MOVE PROZ,D3
	SUB KZ,D3
	MULS RX,D1
	MULS RY,D2
	MULS RZ,D3
	ADD.L D1,D2
	ADD.L D2,D3
	BMI DOSIGHT

	MOVE (A0),D1
	EXT.L D1
	LSL.L #2,D1
	ADDQ.L #2,D1
	ADD.L D1,A0
SIGHT1:
	DBRA D0,VISIBLE
	BRA HIDEEND
DOSIGHT:
	MOVE (A0),D1
	EXT.L D1
	LSL.L #1,D1
SIGHT3:
	MOVE (A0)+,(A5)+	
	DBRA D1,SIGHT3
	MOVE NUMSURF,D1
	SUB D0,D1
	SUBQ #1,D1
	MOVE.L #SURFACES,A4
	MOVE SURFCOUNT,D2
	LSL.W #1,D2
	MOVE D1,(A4,D2.W)

	ADDQ #1,SURFCOUNT
	BRA SIGHT1
HIDEEND:
	RTS

SURFACES: BLK.W 50,0

*****************
* variable data *
*****************

*********************
* Object definition *
*********************

ObjDatx: dc.l 0

ObjDaty: dc.l 0

ObjDatz: dc.l 0

coppercolors: dc.l 0

objsurfaces: dc.l 0

surffarger: dc.l 0

hnummark:
dc.w	0	; Number of corner points of the object

hnumsurf:
dc.w 0

;-------------------------
pointsnr0:dc.w	8		;NOMBRE DE POINTS
zdat0:
dc.w -40,-40,-40,-40		;COORDONNEES Z
dc.w  40, 40, 40, 40

ydat0:				;COORDONNEES Y
dc.w -40,-40, 40, 40
dc.w -40,-40, 40, 40

xdat0:				;COORDONNEES X
dc.w -40, 40, 40,-40
dc.w -40, 40, 40,-40

objsurf0:			;SURFACE
dc.w 4, 1,2, 2,3, 3,4, 4,1	;PREMIER CHIFFRE = NOMBRE DE POINTS CONSTITUANTS
dc.w 4, 5,8, 8,7, 7,6, 6,5	;LA FACE
				;PUIS NUMEROS DES POINTS RELIES ENTRE EUX
	

dc.w 4, 1,4, 4,8, 8,5, 5,1
dc.w 4, 2,6, 6,7, 7,3, 3,2

dc.w 4, 1,5, 5,6, 6,2, 2,1
dc.w 4, 4,3, 3,7, 7,8, 8,4

surfcolors0: 			;COULEURS DES FACES
dc.l $000001			
dc.l $000100					
dc.l $010000				
dc.l $010101
dc.l $010100
dc.l $010001

surfs0: dc.w 6			;NOMBRE DE SURFACES
;=====================
hxangle:dc.w	0	; Rotation angle of the object around X axis
hyangle:dc.w	0
hzangle:dc.w	0

picturex:dc.w	320
picturey:dc.w	100	; Origin location on screen

rotdpx:dc.w	0
rotdpy:dc.w	0
rotdpz:dc.w	0	; Rotation datum point

normz:dc.w	1500

worldpla: blk.l 1,0

flag:dc.b	1
even

diffz:dc.w	0
dx:dc.w		0
dy:dc.w		0
dz:dc.w		0

worldx:blk.w	100,0	; World coordinate array
worldy:blk.w	100,0
worldz:blk.w	100,0

viewx:blk.w	100,0	; View coordinate array
viewy:blk.w	100,0
viewz:blk.w	100,0

screenx:blk.w	100,0	; Display coordinate array
screeny:blk.w	100,0

wplane:	blk.l  600,0
vplane: blk.l  600,0

surfcount: dc.w 0

numsurf: dc.w 0
zcount:  dc.l 0
zpla: dc.w 0

sx: dc.w 0
sy: dc.w 0
sz: dc.w 0

px: dc.w 0
py: dc.w 0
pz: dc.w 0

rx: dc.w 0
ry: dc.w 0
rz: dc.w 0

qx: dc.w 0
qy: dc.w 0
qz: dc.w 0

kx: dc.w 0
ky: dc.w 0
kz: dc.w 0

prox:dc.w	0	; Coordinates of the projection center
proy:dc.w	0	; on the positive Z-axis
proz:dc.w	1000

offx:dc.w	0
offy:dc.w	0
offz:dc.w	0
xoffs:dc.w	0
yoffs:dc.w	0
zoffs:dc.w	0
loopc:dc.l	0


;====================
EVEN
;CETTE ROUTINE PERMET DE JOUER TOUS LES MODULES DE SOUNDTRACKERS
;DE LA VERSION 1.0 A LA VERSION 2.6  AINSI QUE CERTAINS MODULES
;NOISETRACKER.

INIT_MUSIQUE:			;INITIALISATION DE LA MUSIQUE
mt_init:move.l	mt_rdata(pc),a0
	cmp.l	#"M.K.",$438(a0)
	bne.s	mt_st20
	lea	mt_forst23(pc),a2
	move.l	a2,mt_forst
	bra.s	ok1st23
mt_st20:
	lea	mt_forst20(pc),a2
	move.l	a2,mt_forst
ok1st23:	
	add.l	(a2),a0
	moveq	#$7f,d0
	moveq	#0,d1
mt_init1:
	move.l	d1,d2
	subq.w	#1,d0
mt_init2:
	move.b	(a0)+,d1
	cmp.b	d2,d1
	bgt.s	mt_init1
	dbf	d0,mt_init2
	addq.b	#1,d2

mt_init3:
	move.l	mt_rdata(pc),a0
	lea	mt_sample1(pc),a1
	asl.l	#8,d2
	asl.l	#2,d2
	add.l	4(a2),d2
	add.l	a0,d2
	move.l	8(a2),d0
mt_init4:
	move.l	d2,(a1)+
	moveq	#0,d1
	move.w	42(a0),d1
	asl.l	#1,d1
	add.l	d1,d2
	add.l	#$1e,a0
	dbf	d0,mt_init4

	lea	mt_sample1(PC),a0
	moveq	#0,d0
mt_clear:
	move.l	(a0,d0.w),a1
	clr.l	(a1)
	addq.w	#4,d0
	cmp.w	#$7c,d0
	bne.s	mt_clear

	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	clr.l	mt_partnrplay
	clr.l	mt_partnote
	clr.l	mt_partpoint
	move.l	mt_rdata(pc),a1
	add.l	12(a2),a1
	move.b	(a1),mt_maxpart+1
	rts

STOP_MUSIQUE:			;ARRET DE LA MUSIQUE
mt_end:	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	move.w	#$f,$dff096
	rts

PLAY_MUSIQUE:			;JOUE LA MUSIQUE
mt_music:
	addq.w	#1,mt_counter
mt_cool:cmp.w	#6,mt_counter
	bne.s	mt_notsix
	clr.w	mt_counter
	bra.L	mt_rout2

mt_notsix:
	lea	mt_aud1temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp1
	lea	$dff0a0,a5		
	bsr.s	mt_arprout
mt_arp1:lea	mt_aud2temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp2
	lea	$dff0b0,a5
	bsr.s	mt_arprout
mt_arp2:lea	mt_aud3temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp3
	lea	$dff0c0,a5
	bsr.s	mt_arprout
mt_arp3:lea	mt_aud4temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp4
	lea	$dff0d0,a5
	bra.s	mt_arprout
mt_arp4:rts

mt_arprout:
	move.b	2(a6),d0
	and.b	#$0f,d0
	tst.b	d0
	beq.L	mt_arpegrt
	cmp.b	#$01,d0
	beq.s	mt_portup
	cmp.b	#$02,d0
	beq.s	mt_portdwn
	cmp.b	#$0a,d0
	beq.s	mt_volslide
	rts

mt_portup:
	moveq	#0,d0
	move.b	3(a6),d0
	sub.w	d0,22(a6)
	cmp.w	#$71,22(a6)
	bpl.s	mt_ok1
	move.w	#$71,22(a6)
mt_ok1:	move.w	22(a6),6(a5)
	rts

mt_portdwn:
	moveq	#0,d0
	move.b	3(a6),d0
	add.w	d0,22(a6)
	cmp.w	#$538,22(a6)
	bmi.s	mt_ok2
	move.w	#$538,22(a6)
mt_ok2:	move.w	22(a6),6(a5)
	rts

mt_volslide:
	moveq	#0,d0
	move.b	3(a6),d0
	lsr.b	#4,d0
	tst.b	d0
	beq.s	mt_voldwn
	add.w	d0,18(a6)
	cmp.w	#64,18(a6)
	bmi.s	mt_ok3
	move.w	#64,18(a6)
mt_ok3:	move.w	18(a6),8(a5)
	rts
mt_voldwn:
	moveq	#0,d0
	move.b	3(a6),d0
	and.b	#$0f,d0
	sub.w	d0,18(a6)
	bpl.s	mt_ok4
	clr.w	18(a6)
mt_ok4:	move.w	18(a6),8(a5)
	rts

mt_arpegrt:
	move.w	mt_counter(PC),d0
	cmp.w	#1,d0
	beq.s	mt_loop2
	cmp.w	#2,d0
	beq.s	mt_loop3
	cmp.w	#3,d0
	beq.s	mt_loop4
	cmp.w	#4,d0
	beq.s	mt_loop2
	cmp.w	#5,d0
	beq.s	mt_loop3
	rts

mt_loop2:
	moveq	#0,d0
	move.b	3(a6),d0
	lsr.b	#4,d0
	bra.s	mt_cont
mt_loop3:
	moveq	#$00,d0
	move.b	3(a6),d0
	and.b	#$0f,d0
	bra.s	mt_cont
mt_loop4:
	move.w	16(a6),d2
	bra.s	mt_endpart
mt_cont:
	add.w	d0,d0
	moveq	#0,d1
	move.w	16(a6),d1
	lea	mt_arpeggio(PC),a0
mt_loop5:
	move.w	(a0,d0),d2
	cmp.w	(a0),d1
	beq.s	mt_endpart
	addq.l	#2,a0
	bra.s	mt_loop5
mt_endpart:
	move.w	d2,6(a5)
	rts

mt_rout2:
	move.l	mt_rdata(pc),a0
	move.l	a0,a3
	add.l	#$0c,a3
	move.l	a0,a2
	move.l	mt_forst,a4
	add.l	(a4),a2
	add.l	16(a4),a0
	move.l	mt_partnrplay(PC),d0
	moveq	#0,d1
	move.b	(a2,d0),d1
	asl.l	#8,d1
	asl.l	#2,d1
	add.l	mt_partnote(PC),d1
	move.l	d1,mt_partpoint
	clr.w	mt_dmacon

	lea	$dff0a0,a5
	lea	mt_aud1temp(PC),a6
	bsr.L	mt_playit
	lea	$dff0b0,a5
	lea	mt_aud2temp(PC),a6
	bsr.L	mt_playit
	lea	$dff0c0,a5
	lea	mt_aud3temp(PC),a6
	bsr.L	mt_playit
	lea	$dff0d0,a5
	lea	mt_aud4temp(PC),a6
	bsr.L	mt_playit
	move.w	#$01f4,d0
mt_rls:	dbf	d0,mt_rls

	move.w	#$8000,d0
	or.w	mt_dmacon,d0
	move.w	d0,$dff096

	lea	mt_aud4temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice3
	move.l	10(a6),$dff0d0
	move.w	#1,$dff0d4
mt_voice3:
	lea	mt_aud3temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice2
	move.l	10(a6),$dff0c0
	move.w	#1,$dff0c4
mt_voice2:
	lea	mt_aud2temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice1
	move.l	10(a6),$dff0b0
	move.w	#1,$dff0b4
mt_voice1:
	lea	mt_aud1temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice0
	move.l	10(a6),$dff0a0
	move.w	#1,$dff0a4
mt_voice0:
	move.l	mt_partnote(PC),d0
	add.l	#$10,d0
	move.l	d0,mt_partnote
	cmp.l	#$400,d0
	bne.s	mt_stop
mt_higher:
	clr.l	mt_partnote
	addq.l	#1,mt_partnrplay
	moveq	#0,d0
	move.w	mt_maxpart(PC),d0
	move.l	mt_partnrplay(PC),d1
	cmp.l	d0,d1
	bne.s	mt_stop
	clr.l	mt_partnrplay
mt_stop:tst.w	mt_status
	beq.s	mt_stop2
	clr.w	mt_status
	bra.s	mt_higher
mt_stop2:
	rts

mt_playit:
	move.l	(a0,d1.l),(a6)
	addq.l	#4,d1
	moveq	#0,d2
	move.b	2(a6),d2
	and.b	#$f0,d2
	lsr.b	#4,d2

	move.b	(a6),d0
	and.b	#$f0,d0
	or.b	d0,d2
	tst.b	d2
	beq.s	mt_nosamplechange

	moveq	#0,d3
	lea	mt_samples(PC),a1
	move.l	d2,d4
	lsl.l	#2,d2
	mulu	#$1e,d4
	move.l	(a1,d2),4(a6)
	move.w	(a3,d4.l),8(a6)
	move.w	2(a3,d4.l),18(a6)
	move.w	4(a3,d4.l),d3
	tst.w	d3
	beq.s	mt_displace
	move.l	4(a6),d2
	add.l	d3,d2
	move.l	d2,4(a6)
	move.l	d2,10(a6)
	move.w	6(a3,d4.l),8(a6)
	move.w	6(a3,d4.l),14(a6)
	move.w	18(a6),8(a5)
	bra.s	mt_nosamplechange

mt_displace:
	move.l	4(a6),d2
	add.l	d3,d2
	move.l	d2,10(a6)
	move.w	6(a3,d4.l),14(a6)
	move.w	18(a6),8(a5)
mt_nosamplechange:
	move.w (a6),d0
	andi.w #$fff,d0			;it's the bug
	tst.w	d0			;of the real
	beq.s	mt_retrout		;source replay
	move.w	(a6),16(a6)
	move.w	20(a6),$dff096
	move.l	4(a6),(a5)
	move.w	8(a6),4(a5)
	move.w	(a6),d0
	andi.w #$fff,d0			;second bug
	move.w d0,6(a5)			;of the source
	move.w	20(a6),d0
	or.w	d0,mt_dmacon

mt_retrout:
	tst.w	(a6)
	beq.s	mt_nonewper
	move.w	(a6),22(a6)

mt_nonewper:
	move.b	2(a6),d0
	and.b	#$0f,d0
	cmp.b	#$0b,d0
	beq.s	mt_posjmp
	cmp.b	#$0c,d0
	beq.s	mt_setvol
	cmp.b	#$0d,d0
	beq.s	mt_break
	cmp.b	#$0e,d0
	beq.s	mt_setfil
	cmp.b	#$0f,d0
	beq.s	mt_setspeed
	rts

mt_posjmp:
	not.w	mt_status
	moveq	#0,d0
	move.b	3(a6),d0
	subq.b	#1,d0
	move.l	d0,mt_partnrplay
	rts

mt_setvol:
	move.b	3(a6),8(a5)
	rts

mt_break:
	not.w	mt_status
	rts

mt_setfil:
	moveq	#0,d0
	move.b	3(a6),d0
	and.b	#1,d0
	rol.b	#1,d0
	and.b	#$fd,$bfe001
	or.b	d0,$bfe001
	rts

mt_setspeed:
	move.b	3(a6),d0
	and.b	#$0f,d0
	beq.s	mt_back
	clr.w	mt_counter
	move.b	d0,mt_cool+3
mt_back:rts

mt_aud1temp:
	blk.w	10,0
	dc.w	1
	blk.w	2,0
mt_aud2temp:
	blk.w	10,0
	dc.w	2
	blk.w	2,0
mt_aud3temp:
	blk.w	10,0
	dc.w	4
	blk.w	2,0
mt_aud4temp:
	blk.w	10,0
	dc.w	8
	blk.w	2,0
mt_partnote:	dc.l	0
mt_partnrplay:	dc.l	0
mt_counter:	dc.w	0
mt_partpoint:	dc.l	0
mt_samples:	dc.l	0
mt_sample1:	blk.l	31,0
mt_maxpart:	dc.w	0
mt_dmacon:	dc.w	0
mt_status:	dc.w	0
mt_forst:	dc.l	0

mt_forst20:	dc.l 472,600,14,470,600
mt_forst23:	dc.l $3b8,$438,$1e,$3b6,$43c
mt_arpeggio:
	dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c
	dc.w $023a,$021a,$01fc,$01e0,$01c5,$01ac,$0194,$017d
	dc.w $0168,$0153,$0140,$012e,$011d,$010d,$00fe,$00f0
	dc.w $00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097
	dc.w $008f,$0087,$007f,$0078,$0071,$0000,$0000,$0000
mt_rdata:	dc.l mt_data
;====================
EVEN				;NOTRE LISTE COPPER
NEWCOPPER:   
	DC.W	$008E,$2981	;DIMENSIONS DE L'ECRAN
	DC.W	$0090,$29D1	;256 LIGNES

	DC.W	$0092,$0038,$0094,$00D0

	;POINTEURS ADRESSE DES PLANS DE L'IMAGE

	DC.W $00E0
HI1:	DC.W 0
	DC.W $00E2
LO1:	DC.W 0
	DC.W $00E4
HI2:	DC.W 0
	DC.W $00E6
LO2:	DC.W 0
	DC.W $00E8
HI3:	DC.W 0
	DC.W $00EA
LO3:	DC.W 0


	;REGISTRE POUR CHOISIR RESOLUTION	

	DC.W	$0100,$3200		;4 PLANS+MODE COULEURS

	;DECALAGE ECRAN - INUTILISE ICI

	DC.W	$0102,$0000

	;PRIORITE DES PLANS ET SPRITES - INUTILISE ICI

	DC.W 	$0104,$0000

	;MODULOS DES PLANS

	DC.W	$0108, 0	;MODULOS PLANS PAIRS
	DC.W 	$010A, 0	;MODULOS PLANS IMPAIRS

	;POINTEURS DES SPRITES - MIS A 0 SI PAS DE SPRITES

	DC.W	$0120,$0000,$0122,$0000
	DC.W	$0124,$0000,$0126,$0000
	DC.W	$0128,$0000,$012A,$0000	;PAS DE SPRITES
	DC.W	$012C,$0000,$012E,$0000
	DC.W	$0130,$0000,$0132,$0000
	DC.W	$0134,$0000,$0136,$0000
	DC.W	$0138,$0000,$013A,$0000
	DC.W	$013C,$0000,$013E,$0000

	;REGISTRES DES COULEURS

	DC.W	$0180,$0000	;COULEUR 00
	DC.W	$0182,$0F00	;COULEUR 01
	DC.W	$0184,$0D00	;COULEUR 02
	DC.W	$0186,$0B00	;COULEUR 03
	DC.W	$0188,$0900	;COULEUR 04
	DC.W	$018A,$0700	;COULEUR 05
	DC.W	$018C,$0500	;COULEUR 06
	DC.W	$018E,$0300	;COULEUR 07

	DC.W	$0190,$0000	;COULEUR 08
	DC.W	$0192,$0002	;COULEUR 09
	DC.W	$0194,$0004	;COULEUR 10
	DC.W	$0196,$0006	;COULEUR 11
	DC.W	$0198,$0009	;COULEUR 12
	DC.W	$019A,$000B	;COULEUR 13
	DC.W	$019C,$000F	;COULEUR 14
	DC.W	$019E,$000F	;COULEUR 15

	DC.W	$01A0,$0DEF	;COULEUR 16	;LES COULEURS DE 16 A 31 SONT
	DC.W	$01A2,$0BEF	;COULEUR 17	;AUSSI CELLES DES SPRITES
	DC.W	$01A4,$0ADF	;COULEUR 18
	DC.W	$01A6,$07BD	;COULEUR 19	;LES COULEURS 16 A 31 NE SONT
	DC.W	$01A8,$058A	;COULEUR 20	;PAS UTILISEES DANS LE MODE
	DC.W	$01AA,$0357	;COULEUR 21	;HOLD AND MODIFY (HAM)
	DC.W	$01AC,$0234	;COULEUR 22
	DC.W	$01AE,$0011	;COULEUR 23
	DC.W	$01B0,$0FD0	;COULEUR 24
	DC.W	$01B2,$0FA0	;COULEUR 25
	DC.W	$01B4,$0E80	;COULEUR 26
	DC.W	$01B6,$0C60	;COULEUR 27
	DC.W	$01B8,$0A30	;COULEUR 28
	DC.W	$01BA,$0720	;COULEUR 29
	DC.W	$01BC,$0510	;COULEUR 30
	DC.W	$01BE,$0300	;COULEUR 31

	;INSTRUCTIONS POUR AVOIR UN ECRAN PAL (256 LIGNES DE HAUT)

	DC.W $FFDF,$FFFE


DC.L $FFFFFFFE ;FIN LISTE COPPER
EVEN
FINDEMO:
