*********************************************
*****              FG_MENU              *****
*****  All coded by GURUMASTER of F.G.  *****
*****        All rights reserved        *****
*****           (c) 1992 F.G            *****
*********************************************
>EXTERN		"dh0:graficos/pictures/data/bola.data",bolas_data
>EXTERN		"dh0:graficos/pictures/data/bola.mask",bolas_mask
>EXTERN		"dh0:graficos/pictures/data/logo.esm.d",logo_data
>EXTERN		"dh0:graficos/pictures/data/font_menu.d",font_data
>EXTERN		"dh0:sonido/modules/mod.menu.np",np_data

Min_demo = 3	;minima demo activada
Max_demo = 6	;maxima demo activada

section a, code_c
;org $40000

********************************************
*** INICIO                               ***
********************************************
START:          bsr	INIT
		move.l  4,a6
                move.l  #2*$3cf0,d0	;bpla double buffering
		move.l  #$10002,d1	;requerimientos
		jsr	-$c6(a6)
		beq	ERROR1
		move.l	d0,BPL_BLIT	;bpl para DOUBLE BUFFERING
                move.l	d0,BBLIT
                lea     GFXNAME,a1      ;apunta nombre libreria
                jsr     -$198(a6)       ;Open Library
                move.l  d0,GFXBASE      ;salva base
                beq     ERROR12         ;salta si error           
	        move.l 4,a6             ;apunta exec
                move.l  #$3cf0,d0       ;bytes por bitplane
		mulu	#5,d0		;por cinco
                move.l  #$10002,d1      ;chip memory
                jsr     -$c6(a6)        ;allocate
                move.l  d0,BITPLANE1    ;salva posicion
                beq     ERROR2          ;salta si error
		move.l	d0,BVIEW	;para DB
                move.l  BITPLANE1,d0    ;carga posicion
                lea     BPL1PTH,a1      ;direccion primer bitplane en copper list
                move.w  #4,d1           ;d1 contador (5 bitplanes)
BUC_BPL:        swap    d0
                move.w  d0,(a1)         ;insertamos H en Copper
                adda.l  #4,a1           ;nueva direccion
                swap    d0
                move.w  d0,(a1)         ;insertamos L en Copper
                adda.l  #4,a1
                add.l   #$3cf0,d0       ;nuevo bitplane
                dbra    d1,BUC_BPL

;Insertamos sprites super scroll stars
		move.l	#SPR_DATA1,d1
		lea	SPR1PTH,a1
		swap	d1
		move	d1,(a1)
		swap	d1
		move	d1,4(a1)
		adda.l	#8,a1
		move.l	#SPR_DATA2,d1
		;addi.l	#524,d1
		swap	d1
		move	d1,(a1)
		swap	d1
		move	d1,4(a1)
		adda.l	#8,a1
		move.l	#SPR_DATA3,d1
		;addi.l	#420,d1
		swap	d1
		move	d1,(a1)
		swap	d1
		move	d1,4(a1)
		adda.l	#8,a1
		move.l	#SPR_DATA4,d1
		;addi.l	#316,d1
		swap	d1
		move	d1,(a1)
		swap	d1
		move	d1,4(a1)

; Quitamos multitasking
		move.l	4,a6
		jsr	-$84(a6)	;forbid

		bsr	DO_PERSP	;perspectiva	
		bsr	PUT_LOGO
		bsr	DO_YTABLE
		bsr	DO_TEXTO
		bsr	MOUSE		;primera llamada para raton
		move.l	#Min_demo,DEMO	;demo actual
		bsr	np_init
		
		move	#$4000,$dff09a
		move.l	$6c,OLD_INT+2
		move.l	#NEW_INT,$6c
		move	#-$4000,$dff09a

; Activamos Copper
                move.l  GFXBASE,a0      ;apunta GFX base
                move.w  #$a0,$dff096    ;quita dma Copper y sprite
                move.l  $32(a0),OLDCOPP ;salva antiguo copperlist
                move.l  #COPPER,$32(a0) ;nuevo copperlist
                move.w  #$83e0,$dff096  ;permite Blitter, Bpln, Copper 
					;y Sprite
      
                bset    #1,$bfe001      ;apagamos LED

		
***********************************************
*** Esperamos raton                     *******
***********************************************
LOOP2:          btst    #6,$bfe001      ;raton
                bne.s   LOOP2           ;salta si no

; Salida de la demo
JUMP55:         move.l  GFXBASE,a0      ;carga base gfx
                move.w  #$80,$dff096    ;quita dma copper
                move.l  OLDCOPP,$32(a0) ;antiguo copper
                move.w  #$80a0,$dff096  ;pone dma copper
                move.l  4,a6            ;exec base

;Fuera interrupcion
		move	#$4000,$dff09a
		move.l	OLD_INT+2,$6c
		move	#-$4000,$dff09a

		bsr	np_end
		
		move.l	4,a6
		jsr	-$8a(a6)	;permit

                bclr    #1,$bfe001      ;encendemos LED
ERROR3:         move.l  4,a6            ;carga exec
                move.l  BITPLANE1,a1    ;apunta
                move.l  #$3cf0,d0       ;bytes
                mulu    #5,d0           ;5 bitplanes
                jsr     -$d2(a6)        ;deallocate
ERROR2:         move.l  4,a6            ;exedc
                move.l  GFXBASE,a1
                jsr     -$19e(a6)       ;cierra
ERROR12:        move.l	4,a6
                move.l	BPL_BLIT,a1
		move.l  #2*$3cf0,d0
		jsr	-$d2(a6)	;bye bpl virtual

WBEND:		btst	#$e,$dff002
		bne.s	WBEND
ERROR1:		
EXIT:           ;clr.l	DEMO
		tst.l	DEMO
		beq	ENDMENU
		move.l	FG_TXT,d0
		add.l	DEMO,d0
		move.l	d0,$70000	 ;para loader
		bra	ENDMENU

		move.l	4,a6
		lea	DOSNAME,a1
		jsr	-$198(a6)

		move.l	d0,DOSBASE
		beq	ENDMENU

		move.l	FG_TXT,d0
		add.l	DEMO,d0
		move.l	d0,FG_TXT

		move.l	#FG_TXT,d1
		clr.l	d2
		clr.l	d3		
		move.l	DOSBASE,a6
		jsr	-$de(a6)
		
		move.l	DOSBASE,a1
		move.l	4,a6
		jsr	-$19e(a6)
		;bra	START

ENDMENU:	clr.l	d0 	         ;borra
		rts


DOSNAME:	dc.b	'dos.library',0
		even
DOSBASE:	dc.l	0
FG_TXT:		dc.b	'FG_0',0
		even
		
*************************************************************
*** Escribimos texto en pantalla                          ***
*************************************************************
DO_TEXTO:	lea	TEXT(pc),a0	;apuntamos a texto
		lea	FONT_DATA(pc),a6 ; caracteres
		move.l	BITPLANE1,a1
		adda.l	#2*$3cf0,a1	;pos bitplane
		lea	Y_TABLE(pc),a5
		move	POSX,d2
		move	POSY,d3		;posiciones iniciales
buc:		clr	d7
		move.b	(a0),d7
		cmpi.b	#32,d7
		beq	SPC
		cmpi.b	#0,d7		;fin texto
		beq	END_TXT
		cmpi.b	#1,d7
		bne	CCD
		move	POSX,d2		;retorno de carro
		addi	#10,d3		;next line
		bra	NEXT_CHR
CCD:		subi.b	#$2c,d7
		mulu	#7*2*2,d7	;obtenemos offset tamaño
		lea	(a6,d7.w),a2
		move	d2,d0
		move	d3,d1
		bsr	PUT_CHAR
SPC:		addi	#9,d2		;next x
NEXT_CHR:	adda.l	#1,a0
		bra.s	buc
END_TXT:	rts


PUT_CHAR:	add	d1,d1
		move	(a5,d1.w),d1

		divu	#16,d0		;words
		add	d0,d0		;en bytes
		add	d0,d1		;en d1 offset
		clr	d0		;fuera palabra baja

		swap	d0
		ror.l	#4,d0		;4 bytes menores: shift
		ori.l	#$0ff20000,d0	;ya tenemos bltcon0
		lea	(a1,d1.l),a3	;destino en a3
		swap	d0

WAITT1:		btst	#$e,$dff002
		bne.s	WAITT1

		move.l	#$00300000,$dff060	;datos blitter necesarios
		move.l	#$00000030,$dff064
		move.l	#-1,$dff044

		move.w	d0,$dff040	;bltcon0
		and	#$f000,d0	;solo shift b
		move.w	d0,$dff042	;bltcon1
		move.l	a2,$dff050	;origen A
		move.l	a2,$dff04c	;B mask
		move.l	a3,$dff048	;destino C
		move.l	a3,$dff054	;D
		move	#[7*64]+2,$dff058	;start1 (3words)

		rts

POSX:	dc.w	0
POSY:	dc.w	90
TEXT:
dc.b	1
dc.b	'             /// FG  DEMOS ///            ',1
dc.b	1
dc.b	'          RELEASE DATE: 19-MAY-92  ',1
dc.b	1
dc.b 	1;'    FIFTH GENERATION.......URANIUM DEMO',1  	;demo1
dc.b	1;'    FAIRLIGHT.............TRADING INTRO',1   	;demo2
dc.b	'    FIFTH GENERATION..............DEMO2',1	;demo3
dc.b	'    FIFTH GENERATION..............DEMO3',1	;demo4
dc.b	'    FIFTH GENERATION.............INTRO2',1 	;demo5
dc.b	'    FIFTH GENERATION............URANIUM',1	;demo6
dc.b	1;'    MOTION....................CONFUZION',1	;demo7
dc.b	0
	even

*************************************************************
*************************************************************
*** INTERRUPCION PRINCIPAL    *******************************
*************************************************************
*************************************************************
;Macro definition
Blitter_Ok:	macro
.bOk:		btst	#$e,$dff002
		bne.s	.bOk
		move	#$0040,$dff09c
		endm
		
NEW_INT:        move    sr,-(a7)        ;salva sr
                movem.l d0-d7/a0-a6,-(a7)       ;registros

		bsr	VECTORS_ROUTINE		
		bsr	SCROLL_UP		
		subi	#1,cont_mouse
		bne	SIGUEM
		move	#2,cont_mouse
		bsr	MOUSE
		
SIGUEM:		subi	#1,cont_col
		bne	SIGUEN
		move	#3,cont_col
		bsr	DO_CHCOLOR
		
SIGUEN:		Blitter_Ok
;		move	#$0f00,$dff180
;		move	#$0000,$dff180
END_INT3:       movem.l (a7)+,d0-d7/a0-a6       ;restablece
                move    (a7)+,sr        ;registro de estado
OLD_INT:	jmp	$ffffff          

cont_mouse: 	dc.w	2
cont_col:	dc.w	1

**************************************************************
*** RUTINA DE SCROLL HORIZONTAL ******************************
**************************************************************
VPos_sc = 245   ;posicion scroll
SCROLL_UP:      btst	#$e,$dff002
		bne.s	SCROLL_UP

		tst.b	PAUSE
		beq	SIGUE_SC
		subi	#1,CPAUSE
		bne	END_SC_UP
		move	#100,CPAUSE
		clr.b	PAUSE			;end pause

SIGUE_SC:       move.l  BITPLANE1,a0            ;leemos direccion bitplane arriba
		adda.l	#2*$3cf0,a0
                adda.l	#VPos_sc*52+2,a0
                move.l  a0,a1
		suba.l	#2,a1 
                move.l  #$e9f00000,$dff040	;BPLCON0,1
	        move.l  #$00ffffff,$dff044	;mask A
	        clr.l   $dff064
                move.l  a0,$dff050	;A
       	        move.l  a1,$dff054	;D
         	move.w  #7*64+26,$dff058;20 alto 52 bytes ancho
		sub.b   #2,CH_CNT
		bne 	END_SC_UP
		move.b	#10,CH_CNT		                 
GET_CHAR:	move.l	TEXT_POS,a0
	 	clr.l	d1
		move.b	(a0),d1		
SPACE:	        cmpi.b	#32,d1
		bge	PPP
		move.b	#1,PAUSE
		bra	NEW_CHAR
PPP:		beq	NEW_CHAR
		bsr   	PRINT_CHAR
NEW_CHAR: 	addi.l	#1,TEXT_POS
		cmp.l	#TEXT_END,TEXT_POS
		bne	END_SC_UP
		move.l	#TEXT_INIT,TEXT_POS
END_SC_UP:	rts

;Imprimimos caracter
PRINT_CHAR:     btst	#$e,$dff002
		bne.s	PRINT_CHAR

		sub.b   #$2c,d1         ;vamos a obtener offset caracter
                mulu    #2*2*7,d1       ;obtenemos direccion caracter
                lea     FONT_DATA,a0
                adda.l  d1,a0           ;caracter actual
                move.l  BITPLANE1,a1     ;leemos direccion bitplane arriba
		adda.l	#2*$3cf0,a1
                adda.l	#VPOS_SC*52+48,a1
                move.l  #$09f00000,$dff040	;BPLCON0,1
	        move.l  #-1,$dff044	;mask A
	        clr.w	$dff064		;no module A
                move.w  #48,$dff066	;module D (52-ancho font)
	        move.l  a0,$dff050	;A
       	        move.l  a1,$dff054	;D
         	move.w  #7*64+2,$dff058 ;7 alto 1 words ancho
END_PRTS:       rts

CH_CNT:		dc.b	10
		even

PAUSE:		dc.b	0
		even
CPAUSE:		dc.w	100
TEXT_POS:	dc.l	TEXT_INIT
TEXT_INIT:	
dc.b	'       ;UNKNOWN IS THE PLACE WHERE THE DEATH WAITS FOR YOU, SO WAIT '
dc.b	'HER ANYWHERE...; '
dc.b	'                                '
dc.b	'WELCOME TO ANOTHER COOL CD BY '
dc.b	' /FIFTH GENERATION/   ENJOY IT> '
dc.b	'                                '
dc.b	'CREDITS FOR THIS MENU ARE:         '
dc.b	'ALL CODING BY   / GURUMASTER /        '
dc.b	'ALL GRAPHICS DESIGN AND PACK BY   / EXCELSIOR /        '
dc.b	'AND MUSIC COMPOSED BY   / DEE-LITE /   '
;dc.b	'     - HI GUY CONGRATULATIONS ON MAKING SUCH A GOOD TUNE >>> - '
dc.b	'                             '

;dc.b	'NOTE: THIS MENU WAS COMPLETELY MADE IN A FUN AND CRAZY NIGHT: '
;dc.b	'FROM  24TH APRIL AT 22:00 PM  TO  25TH APRIL AT 7:30 AM '
dc.b	'                                    '

dc.b	'  SPANISH MESSAGE:        SALUDOS ESPECIALES A TODOS LOS VISITANTES'
dc.b	' DE TECNOCOM-92 Y A LOS EXPOSITORES  - EN ESPECIAL A LOS STANDS DE'
dc.b	' COMMODORE - , ASI COMO A TODA LA GENTE DE TELECO ..........  '
dc.b    '                                              '
Dc.b	'FOR THOSE WHO DON;T KNOW IT, F.G HAS 2 FURTHER DIVISIONS THAT YOU '
dc.b	'MUST TRY FOR COOL-FAST SWAPPING: '
dc.b	'                                '
dc.b	'SFHQ:           / LOZENGE /              ',1
dc.b	'PITKALANNIEMENTIE 25         ',1
dc.b	'78500 VARKAUS. FINLAND.      ',1,'              '
dc.b	'NWHQ:           / DEE-LITE /             ',1
dc.b	'KJ.LIA 3               ',1
dc.b	'5050 NESTTUN. NORWAY.         ',1
dc.b	'                                '
dc.b	'OUR GREETZ ARE FLYING TO THESE NICE CREWS, IN A-Z ORDER:            '
dc.b	'AMIGA CONNECTION / BRAINSTORM / CONTEX / CRUSADERS / CRYPTOBURNERS / '
dc.b	'DAMAGE INC. / DARKNESS / DAI / FALCONS / FUSION / GRAFFITI / '
dc.b	'HIPNOTIC / INMORTALS / LUNATIC EARLS / LSD / MANIACS / MAJIC 12 / '
dc.b	'MYSTIX / PHASE / PMC / POORSOFT / PROTON INC. / RAMJAM / SCOOPEX / '
dc.b	'SCS / SKYLLION / TECHNIX / THE FAMILY / ... AND THE OTHER GUYS WE '
dc.b	'HAVE FORGOTTEN NOW. '
dc.b	'                                '
dc.b	'IF YOU WANNA BE A MEMBER OF F.G. THEN SEND A SAMPLE OF YOUR TASK AND '
dc.b	'A PHOTO OF YOUR SISTER TO:                '
dc.b	'/ EXCELSIOR /            ',1
dc.b	'APDO. 12182             ',1
dc.b	'46020 VALENCIA. SPAIN.        ',1
dc.b	'                                '
dc.b	'WE WELCOME OUR NEW MUSICIAN IN SPAIN   / EVELRED / '
dc.b	'                            '
dc.b	'MESSAGE TO DEE-LITE - F.G. : SORRY FOR SHORTEN YOUR MOD. BUT IT '
dc.b	'WAS TOO LONG FOR A MENU ...     O.K. ?? '
dc.b	'                               '
dc.b	'BYE>  SEE YOU IN THE NEXT F.G. PRODUCTION... '
dc.b 	'                                                          '
TEXT_END:	dc.b	0
		even

FONT_DATA:	blk.b	2*658,0
		
***************************************************************
***************************************************************
** RUTINA DE VECTORES 3D. All coding done by Gurumaster of FG *
***************************************************************
***************************************************************
;;
VECTORS_ROUTINE:
;Primero que nada, borramos la pantalla (primer bitplano)
		move.l	BBLIT,d0
		addi.l	#84*52+14,d0
		move.l	d0,$dff054
		move.l	#$00000020,$dff064
		move.l	#$0000ffff,$dff044
		move.l	#$01000000,$dff040
		move	#[147*64]+10,$dff058
		
		bsr	STARS
		bsr	np_music
				
;Y ahora viene el quid de la cuestion
;Obtenemos valores de los nuevos angulos
		lea	SIN_DATA,a1
		lea	XYADD,a0
		lea	XYANG,a2
		movem	(a0),d2-d4	;xyadd,zyadd,xzadd		

		move	(a2),d0		;plano XY
		add	d2,d0
		bsr	GETVALS
		move	d0,COSXY
		move	d1,SINXY

		move	(a2),d0		;plano YZ
		add	d3,d0
		bsr	GETVALS
		move	d0,COSYZ
		move	d1,SINYZ

		move	(a2),d0		;plano XZ
		add	d4,d0
		bsr	GETVALS		
		move	d0,COSXZ
		move	d1,SINXZ

;Calculamos nuevas posiciones punto por punto e imprimimos bolas

PP:		move.l	BALLS,d7	;contador
		lea	VEC_DATA,a0	;apuntamos a datos
		lea	PERSP_TAB,a1
		lea	PUT_DATA,a2
		lea	COSXY,a3
		move	ZCDM,d6

BUC_PRAL:	bsr	CALC_POINT	;calculamos punto
		move	d0,(a2)+
		move	d1,(a2)+
		move	d2,(a2)+
		dbra	d7,BUC_PRAL	;next
;		move	#$0fff,$dff180

;Borramos segundo bitplano
ZZZ1:		btst	#$e,$dff002
		bne.s	ZZZ1
		move.l	BBLIT,d0
		addi.l	#$3cf0,d0
		addi.l	#84*52+14,d0
		move.l	d0,$dff054
		move.l	#$00000020,$dff064
		move.l	#$0000ffff,$dff044
		move.l	#$01000000,$dff040
		move	#[147*64]+10,$dff058

;Ordenacion Vballs
		bsr	SHELL
		;move	#$00ff,$dff180
ZZZ:		btst	#$e,$dff002
		bne.s	ZZZ

		;move	#$0000,$dff180

* RUTINA DE IMPRESION DE LOS BOBS ************

		move.l	#$00300000,$dff060	;datos blitter necesarios
		move.l	#$00000030,$dff064
		move.l	#-1,$dff044
		lea	BOLAS_MASK(pc),a4
		lea	Y_TABLE(pc),a5
		move.l	BALLS,d7
		lea	PUT_DATA,a6
		move.l	BBLIT,a1
BUCPDATA:	movem	(a6)+,d0-d1
		bsr	PUT_BOB
		addq.l	#2,a6
		dbra	d7,BUCPDATA
		
; Hacemos DOUBLE BUFFERING
		move.l	BBLIT,d0
		move.l	d0,BBLIT
		swap	d0
		move.w	d0,BPL1PTH
		swap	d0
		move.w	d0,BPL1PTH+4	
		add.l	#$3cf0,d0	;next bplane
		swap	d0
		move.w	d0,BPL2PTH
		swap	d0
		move.w	d0,BPL2PTH+4	;Bblit->Bview
					;(visualizamos donde acabamos
					;de imprimir)
		move.l	BBLIT,d0
		move.l	BVIEW,BBLIT
		move.l	d0,BVIEW

		bsr	CH_TRIG		;cambiamos valores

		rts			;salimos de la rutina

;**************************
;  CALCULAMOS X,Y,Z GIRO
;**************************
;a0: apunta a datos actuales puntos a procesar
CALC_POINT:	movem	(a0),d0-d2	;sacamos x,y y z
		movem	(a0)+,d3-d5
		;move	d0,d3
		;move	d1,d4
		;move	d2,d5		;guardamos temporalmente

;Calculamos x'=xcos-ysen 	(d0 = x')
		muls	(a3),d0
		muls	2(a3),d1
		sub	d1,d0		;xcos-ysen
		asr	#8,d0		;entre 256 
;Calculamos y'=xsen+ycos 	(d1 = y') 
		muls	2(a3),d3
		muls	(a3),d4
		add	d3,d4		;xsen+ycos
		asr	#8,d4
		move	d0,d3		;d3 = x'
		move	d4,d1		;d4 = y'

;Calculamos z'=zcos-y'sen	(d2 = z')
		muls	4(a3),d2
		muls	6(a3),d1
		sub	d1,d2		;zcos-y'sen
		asr	#8,d2
;Calculamos y''=zsen+y'cos	(d4 = y'')
		muls	6(a3),d5
		muls	4(a3),d4
		add	d5,d4		;zsen+y'cos
		asr	#8,d4	
		move	d2,d5		;d5 = z'
		move	d4,d1		;d1 = y'' (ni tocarla ya)

;Calculamos x''=x'cos-z'sen
		muls	8(a3),d0
		muls	10(a3),d2
		sub	d2,d0		;x'cos-z'sen
		asr	#8,d0		;d0 = x'' (ni tocarlo ya)
;Calculamos z''=x'sen+z'cos
		muls	10(a3),d3
		muls	8(a3),d5
		add	d3,d5		;x'sin+z'cos
		asr	#8,d5
		move	d5,d2		;d2 = z'' (ni tocarlo ya)
	
;Proyecciones 
;		bra	ENDIT
;		tst.b	FLAG_PERSP
;		beq	ENDIT

		move	d2,d4
		asr	#1,d2
		add	d6,d2		;zcdm+z''
		add	d2,d2
		move	(a1,d2.w),d2
		asl	#1,d0
		asl	#1,d1
		muls	d2,d0
		muls	d2,d1
		swap	d0
		swap	d1
		move	d4,d2		;recuperamos Z
		
ENDIT:		add	XCDM,d0
;		neg	d1
		add	YCDM,d1
		rts			;y salimos

;Obtenemos seno y coseno, dado el angulo en d0 (d0=cos, d1=sen)
;a1: apunta a inicio lista sinus
;a2: apunta a valor angulo
GETVALS:	tst	d0
		bpl	CNTGV1
		addi	#360,d0
		bra	CNTGV2
CNTGV1:		cmpi	#360,d0
		blo	CNTGV2
		subi	#360,d0
CNTGV2:		move	d0,(a2)+
		move	d0,d1
		addi	#90,d0
		cmpi	#360,d0
		blo	CNTGV3
		subi	#360,d0
CNTGV3:		add	d0,d0
		add	d1,d1
		move	(a1,d0.w),d0
		move	(a1,d1.w),d1
		rts


*** Construimos perspectiva  ********************************
;d0: $2000;	d2: $2000*$7fff;	incD0: 19
;asr: swap
DO_PERSP:	lea	PERSP_TAB,a1
		move.l	#$1000,d0         ;#$1800
		move.l	#$1000*$5aff,d2   ;$59ff
		move.l	#3000-1,d7
		clr.l	d6
BUC_PERSP:	move.l	d2,d1
		divu	d0,d1
		move	d1,(a1)+
		add	d6,d0
		addq	#1,d6
		dbra	d7,BUC_PERSP
		rts 

*** Rutina de cambio de valores trigonometricos *************
CH_TRIG:	subi	#1,CONT_TRIG
		bne	END_CHTRIG
		lea	XYADD,a1
		move.l	TRIG_POS,a0
		move.l	(a0)+,(a1)+	;xy, yz
		move.l	(a0)+,(a1)+	;xz, contador
		cmpa.l	#END_TRIG,a0
		bne	EXTRIG
		move.l	#INTRIG2,a0
EXTRIG:		move.l	a0,TRIG_POS
END_CHTRIG:	rts

*************************************************
*** RUTINA DE ORDENACION "SHELL"              ***
*************************************************
SHELL:		clr.l	d1		;para offset
		clr.l	d2		;para temporal intercambio
		move.l	BALLS,d0	;numero de datos en d0
		addq.l	#1,d0		;reales
BUC1_SH:	lsr.l	#1,d0		;dividimos por 2
		beq	END_SH		;si cero, salimos
		move.l	d0,d1		;a d1
		mulu	#6,d1		;<=== '6'ancho en offset
BUC2_SH:	move.b	#1,FLAG_SH	;no cambio
		lea	PUT_DATA,a0
		move.l  BALLS,d7
		addq.l	#1,d7
		sub.l	d0,d7		;datos-ancho
		subq.l	#1,d7		;menos 1
BUC3_SH:	move	4(a0),d2  	;<==== '4'comparamos
		move	4(a0,d1),d3
		cmp	d2,d3
		ble.s	CONT_SH		;si en orden, salimos
		move	d2,4(a0,d1)
		move	d3,4(a0)	;Z
		move.l	(a0),d2
		move.l	(a0,d1),(a0)	;X e Y
		move.l	d2,(a0,d1)	;cambiamos
		clr.b	FLAG_SH		;y activamos cambio
CONT_SH:	adda.l	#6,a0		;<---- '6'incrementamos

		dbra	d7,BUC3_SH	;seguimos
		tst.b	FLAG_SH
		beq	BUC2_SH
		bra	BUC1_SH		;seguimos
END_SH:		rts

FLAG_SH:	dc.b	0	;para comprobar cambio
		even


*********************************
*** IMPRIMIMOS BOB           ****
*********************************
;d0: pos X; d1: pos Y; a1: bitplane destino

PUT_BOB:	lea	BOLAS_DATA(pc),a2

;Calculamos destino
		add	d1,d1
		move	(a5,d1.w),d1
		;mulu	#52,d1

		divu	#16,d0		;words
		add	d0,d0		;en bytes
		add	d0,d1		;en d1 offset
		clr	d0		;fuera palabra baja

		swap	d0
		ror.l	#4,d0		;4 bytes menores: shift
		ori.l	#$0ff20000,d0	;ya tenemos bltcon0
		lea	(a1,d1.l),a3	;destino en a3
		swap	d0

WAITTC:		btst	#$e,$dff002
		bne.s	WAITTC

		move.w	d0,$dff040	;bltcon0
		and	#$f000,d0	;solo shift b
		move.w	d0,$dff042	;bltcon1
		move.l	a2,$dff050	;origen A
		move.l	a4,$dff04c	;B mask
		move.l	a3,$dff048	;destino C
		move.l	a3,$dff054	;D
		move	#[16*64]+2,$dff058	;start1 (3words)

WAITT:		btst	#$e,$dff002
		bne.s	WAITT

		adda.l	#4*16,a2
		adda.l	#$3cf0,a3	;next plane
		move.l	a2,$dff050	;origen A
		move.l	a4,$dff04c	;B mask
		move.l	a3,$dff048	;destino
		move.l	a3,$dff054	;D
		move	#[16*64]+2,$dff058	;start2 (3words)

		rts

BOLAS_DATA:	blk.b	2*4*16		;bytes para grafico bola y
BOLAS_MASK:	blk.b	4*16		;mascara

		even

*** Valores necesarios rutina vectores **********************
;Flag de perspectiva (si, no)
FLAG_PERSP:	dc.b	1		;si
		even

;Centro giro figura
XCDM:		dc.w	190
YCDM:		dc.w	149
ZCDM:		dc.w    60		;para proyeccion profundidad

;Adders
XYADD:		dc.w	0
YZADD:		dc.w	0
XZADD:		dc.w	0
CONT_TRIG:	dc.w	1		;contador duracion

;Angulos actuales
XYANG:		dc.w	0
YZANG:		dc.w	180
XZANG:		dc.w	0

;Senos y cosenos angulos
COSXY:		dc.w	0	;XY
SINXY:		dc.w	0
COSYZ:		dc.w	0	;YZ
SINYZ:		dc.w	0
COSXZ:		dc.w	0	;XZ
SINXZ:		dc.w	0

;Temporales
X1:		dc.w	0	;x inicial vector
Y1:		dc.w	0	;y inicial vector

;Lista de giros
TRIG_POS:	dc.l	INIT_TRIG
INIT_TRIG:	
;dc.w	0,0,0,20
;dc.w	2,0,0,180, 0,0,0,20, 0,2,0,180, 0,0,0,20, 0,0,2,180
INTRIG2:
dc.w	0,1,2,100, 1,0,1,100, 1,-1,2,150, 1,-2,1,150
dc.w	2,-1,1,200, 3,0,1,200, 2,1,2,200, 1,2,1,200
dc.w	1,1,0,231, 1,0,3,197
END_TRIG:	dc.l	0

;No. de vectorballs
BALLS:	dc.l	18-1		;no. de bolas-1

;Datos de los vectorballs
;;
VEC_DATA:	
dc.w	-96,64,0, -64,64,0, -32,64,0, 32,64,0, 64,64,0, 96,64,0
dc.w	-96,32,0,                     32,32,0
dc.w	-96,0,0,  -64,0,0,            32,0, 0
dc.w	-96,-32,0,                    32,-32,0,          96,-32,0
dc.w	-96,-64,0,                    32,-64,0, 64,-64,0,96,-64,0


PUT_DATA:	blk.w	30*3	;para 30 bolas

PERSP_TAB1:	blk.w	100	;hasta -100
PERSP_TAB:	blk.w	3000	;para perspectiva

***********************************************************
*** Rutina de cambio de demo ******************************
***********************************************************
MOUSE:		move	$dff00a,d0	;movemos Joy0Dat
		lsr	#8,d0		;pos vertical
		move	ANT_MOUSE,d2
		move	d0,ANT_MOUSE
		sub	d0,d2
		beq	CCDE
		bmi	DOWN
UP:		;move	#$0fff,$dff180
		cmp	#1,d2
		blo	CCDE	
		cmp.l	#Min_demo,DEMO
		beq	CCDE
		bsr	END_COL
		sub.l	#1,DEMO
		bra	CCDE
DOWN:		;move	#$0f0f,$dff180
		cmp	#-1,d2
		bge	CCDE
		cmp.l	#Max_demo,DEMO
		beq	CCDE
		bsr	END_COL
		add.l	#1,DEMO
CCDE:		rts

;Cambiamos color actual
DO_CHCOLOR:	move.l	DEMO,d0
		subq.l	#1,d0
		lea	COPTEXT,a0
		mulu	#7*8,d0
		addq.l	#6,d0		;saltamos espera
		adda.l	d0,a0
		move	(a0),d0
		move.l	#7-2,d7
.buc:		move	8(a0),(a0)
		addq.l	#8,a0
		dbra	d7,.buc
		move	d0,(a0)
		rts
		
;Fin color actual
END_COL:	move.l	DEMO,d0
		subq.l	#1,d0
		move.l	d0,d1
		mulu	#7*8,d0
		lea	COPTEXT,a1
		addq.l	#6,d0		;fuera espera
		adda.l	d0,a1

		mulu	#2*7,d1
		lea	COLTEXT,a0
		adda.l	d1,a0

		move.l	#7-1,d7
.buc:		move	(a0)+,(a1)
		addq.l	#8,a1
		dbra	d7,.buc
		rts

DEMO:		dc.l	0
ANT_MOUSE:	dc.w	0


*** Construimos tabla de incrementos **********************
MaxYtable = 300 ;max. no. de lineas
DO_YTABLE:	lea	Y_TABLE(pc),a1
		move.l	#MaxYtable-1,d0
		clr.l	d1
.buc:		move	d1,(a1)+
		addi	#52,d1
		dbra	d0,.buc
		rts

Y_TABLE:	blk.w	MaxYtable

*** Imprimimos LOGO ***************************************
Alt_logo = 79
PUT_LOGO:	lea	LOGO_DATA,a1
		move.l	BITPLANE1,a0
		adda.l	#2*$3cf0+4,a0
		move.l	#3-1,d0
.buc0:		move.l	#0,d7
.buc1:		move.l	#0,d6
.buc2:		move.l	d7,d1
		mulu	#52,d1
		add.l	d6,d1
		move.b	(a1)+,(a0,d1)
		addq	#1,d6		
		cmpi	#40,d6
		bne	.buc2
		addq	#1,d7
		cmpi	#Alt_logo,d7
		bne	.buc1
		adda.l	#$3cf0,a0
		dbra	d0,.buc0	
		rts

***********************************************************
* Rutina de Scroll de estrellas ***************************
***********************************************************
;;		
STARS:		clr.l	d0
		clr.l	d1
                lea	SPR_DATA,a0	;coordenadas (20 X y 20 Y)
                lea	SPR_DATA1,a1	;2
		moveq.l	#1,d4		;last line (9)
		moveq.l	#8,d5		;offset suma (8)
		moveq.l	#1*4+4,d6	;offset next control words (5)
		moveq.l	#12,d7		;contador 13 sprites x sprite
		bsr	DO_SPRITE	
                lea	SPR_DATA2,a1	;1
		moveq.l	#1,d4		;last line
		moveq.l	#6,d5		;offset suma 6
		moveq.l	#1*4+4,d6	;offset next control words
		moveq.l	#12,d7		;contador 13 sprites x sprite
		bsr	DO_SPRITE
                lea	SPR_DATA3,a1	;4
		moveq.l	#1,d4		;last line
		moveq.l	#4,d5		;offset suma 4
		moveq.l	#1*4+4,d6	;offset next control words
		moveq.l	#12,d7		;contador 13 sprites x sprite
		bsr	DO_SPRITE
                lea	SPR_DATA4,a1	;3
		moveq.l	#1,d4		;last line
		moveq.l	#2,d5		;offset suma 2
		moveq.l	#1*4+4,d6	;offset next control words
		moveq.l	#12,d7		;contador 13 sprites x sprite
		bsr	DO_SPRITE
		rts
; movemos sprites
DO_SPRITE:	movem	(a0),d0-d1	;pos x, pos y
		move.b	d1,(a1)		;first line
		btst	#8,d1
		beq.s	CONT_YSP
		or.b	#6,3(a1)	;first and last
CONT_YSP:	add	d4,d1	
		move.b	d1,2(a1)	;last line+1
		add	d5,d0		;siguiente posicion
		btst	#9,d0
		beq.s	CONT_SP
		moveq	#20,d0
CONT_SP:	move	d0,(a0)		;actualizamos posicion X
		lsr	#1,d0
		bcc	CONT_SP1
		bset	#0,3(a1)	;activamos bit H0
CONT_SP1:	;bclr	#0,3(a1)
                move.b	d0,1(a1)	;H pos
		addq.l	#4,a0		;next X and Y position
		adda.l	d6,a1		;next control words
		dbra	d7,DO_SPRITE	;hasta sprites por sprite
		rts

; Posiciones X e Y sprites
SPR_DATA: ;(y min:90 ; ymax:300)
dc.w	200,128,122,137,347,155	
dc.w	315,165,452,175,188,185,149,195,92,205
dc.w	333,215,122,225,324,240,230,265,462,265

dc.w	150,130,400,140,270,150
dc.w	178,160,434,170,449,180,96,190,0,200
dc.w	177,210,260,222,20,233,150,253,424,264

dc.w	67,132,340,137,210,147
dc.w	480,156,167,173,309,187,260,197,151,207
dc.w	453,221,344,248,124,258,501,261,120,268

dc.w	123,129,247,133,367,143
dc.w	310,159,510,164,110,179,350,188,100,196
dc.w	400,204,500,219,121,239,204,246,478,261

star1:  macro 
dc.w	$8000,$0000
	endm 
star2: 	macro
dc.w	$0000,$8000 
 	endm 
star3: 	macro 
dc.w	$8000,$0000
 	endm 
star4: 	macro 
dc.w	$0000,$8000
	endm 

SPR_DATA1:	
	dc.w    0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
	star1
  	dc.w	0,0
SPR_DATA2:
	dc.w    0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
	star2
  	dc.w	0,0
SPR_DATA3:
	dc.w    0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
	star3
  	dc.w	0,0
SPR_DATA4:
	dc.w    0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0
	star4
  	dc.w	0,0

***********************************************************
* Etiquetas y datos        ********************************
***********************************************************
		
GFXNAME:        dc.b    'graphics.library',0
                even
GFXBASE:        dc.l    0
BITPLANE1:      dc.l    0
OLDCOPP:        dc.l    0
BPL_BLIT:	dc.l	0
BBLIT:		dc.l	0	;bplane para double buffering
BVIEW:		dc.l	0


* Colores texto ***********************
COLTEXT:
;1 (Rojo)
dc.w	$600,$900,$c00,$f00,$c00,$900,$600
;2 (Naranja)
dc.w	$630,$940,$c60,$f80,$c60,$940,$630
;3 (Amarillo)
dc.w	$660,$990,$cc0,$ff0,$cc0,$990,$660
;4 (Verde)
dc.w	$060,$090,$0c0,$0f0,$0c0,$090,$060
;5 (Magenta)
dc.w	$066,$099,$0cc,$0ff,$0cc,$099,$066
;6 (Azul)
dc.w	$036,$049,$06c,$08f,$06c,$049,$036
;7 (Violeta)
dc.w	$407,$50a,$70d,$90f,$70d,$50a,$407

* Lista del Copper ********************
;;
COPPER:        dc.w    $008e,$2981,$0090,$74f1,$0092,$0028
               dc.w    $0094,$00d8,$00e0
; Punteros a los 5 bitplanes
BPL1PTH:       dc.w    $0000,$00e2,$0000,$00e4
BPL2PTH:       dc.w    $0000,$00e6
               dc.w    $0000,$00e8,$0000
               dc.w    $00ea,$0000,$00ec,$0000,$00ee,$0000
               dc.w    $00f0,$0000,$00f2,$0000
; Puntero sprites
		dc.w	$0120
SPR1PTH:	dc.w	0,$0122,0,$0124,0,$0126,0,$0128,0,$012a,0
		dc.w	$012c,0,$012e,0
		
; Otros valores
               dc.w    $0100,$5200,$0102,$0000,$0104,$0000
               dc.w    $0108,$0006,$010a,$0006 ;modulo
               dc.w    $0180,$0224 ;,$0182,$0333,$0184,$0333,$0186,$0333

dc.w	$0188,$08bf,$0190,$079e,$0198,$068d
dc.w	$01a0,$057c,$01a8,$046b,$01b0,$035a,$01b8,$0249

dc.w    $0182,$0000,$0184,$0000,$0186,$0000

dc.w	$7b0f,$fffe,$0180,$0a0a,$0182,$0fff,$0184,$0fff,$0186,$0fff
dc.w    $0182,$0a0a,$0184,$0a0a,$0186,$0a0a
dc.w	$7d0f,$fffe,$0180,$0000
               dc.w    $0182
VEC_COL:       dc.w	$0539,$0184,$074b,$0186,$085e

		dc.w	$01a2,$0fff,$01a4,$0ccc,$01a6,$0fff
		dc.w	$01aa,$0999,$01ac,$0666,$01ae,$0999

               dc.w    $0182,$0539,$0184,$074b,$0186,$085e
	       dc.w    $018a,$0539,$018c,$074b,$018e,$085e
;Col texto
dc.w $8d0f,$fffe,$0188,$0666,$8e0f,$fffe,$0188,$0999,$8f0f,$fffe,$0188,$0ccc
dc.w $900f,$fffe,$0188,$0fff,$910f,$fffe,$0188,$0ccc,$920f,$fffe,$0188,$0999
dc.w $930f,$fffe,$0188,$0666

;Release date
dc.w $a10f,$fffe,$0188,$0666,$a20f,$fffe,$0188,$0999,$a30f,$fffe,$0188,$0ccc
dc.w $a40f,$fffe,$0188,$0fff,$a50f,$fffe,$0188,$0ccc,$a60f,$fffe,$0188,$0999
dc.w $a70f,$fffe,$0188,$0666

COPTEXT:
;1
dc.w $b50f,$fffe,$0188,$0600,$b60f,$fffe,$0188,$0900,$b70f,$fffe,$0188,$0c00
dc.w $b80f,$fffe,$0188,$0f00,$b90f,$fffe,$0188,$0c00,$ba0f,$fffe,$0188,$0900
dc.w $bb0f,$fffe,$0188,$0600
;2
dc.w $bf0f,$fffe,$0188,$0630,$c00f,$fffe,$0188,$0940,$c10f,$fffe,$0188,$0c60
dc.w $c20f,$fffe,$0188,$0f80,$c30f,$fffe,$0188,$0c60,$c40f,$fffe,$0188,$0940
dc.w $c50f,$fffe,$0188,$0630
;3
dc.w $c90f,$fffe,$0188,$0660,$ca0f,$fffe,$0188,$0990,$cb0f,$fffe,$0188,$0cc0
dc.w $cc0f,$fffe,$0188,$0ff0,$cd0f,$fffe,$0188,$0cc0,$ce0f,$fffe,$0188,$0990
dc.w $cf0f,$fffe,$0188,$0660
;4
dc.w $d30f,$fffe,$0188,$0060,$d40f,$fffe,$0188,$0090,$d50f,$fffe,$0188,$00c0
dc.w $d60f,$fffe,$0188,$00f0,$d70f,$fffe,$0188,$00c0,$d80f,$fffe,$0188,$0090
dc.w $d90f,$fffe,$0188,$0060
;5
dc.w $dd0f,$fffe,$0188,$0066,$de0f,$fffe,$0188,$0099,$df0f,$fffe,$0188,$00cc
dc.w $e00f,$fffe,$0188,$00ff,$e10f,$fffe,$0188,$00cc,$e20f,$fffe,$0188,$0099
dc.w $e30f,$fffe,$0188,$0066
;6
dc.w $e70f,$fffe,$0188,$0036,$e80f,$fffe,$0188,$0049,$e90f,$fffe,$0188,$006c
dc.w $ea0f,$fffe,$0188,$008f,$eb0f,$fffe,$0188,$006c,$ec0f,$fffe,$0188,$0049
dc.w $ed0f,$fffe,$0188,$0036
;7
dc.w $f10f,$fffe,$0188,$0407,$f20f,$fffe,$0188,$050a,$f30f,$fffe,$0188,$070d
dc.w $f40f,$fffe,$0188,$090f,$f50f,$fffe,$0188,$070d,$f60f,$fffe,$0188,$050a
dc.w $f70f,$fffe,$0188,$0407

dc.w	$ffdf,$fffe
dc.w	$0f0f,$fffe,$0180,$0a0a,$0182,$0fff,$0184,$0fff,$0186,$0fff
dc.w	$110f,$fffe,$0180,$0224,            $0184,$0333,$0186,$0333

;Col scroll
dc.w $1e0f,$fffe,$0188,$0666,$1f0f,$fffe,$0188,$0999,$200f,$fffe,$0188,$0ccc
dc.w $210f,$fffe,$0188,$0fff,$220f,$fffe,$0188,$0ccc,$230f,$fffe,$0188,$0999
dc.w $240f,$fffe,$0188,$0666

               dc.w    $ffff,$fffe             ;END Copper List

*************************************************
*** Lista 360 valores SENO              *********
*************************************************
SIN_DATA:	;datos senos de los 360 grados por 256
dc.w 0,4,9,13,18,22,27,31,36,40,44,49,53,58,62,66,71,75,79,83
dc.w 88,92,96,100,104,108,112,116,120,124,128,132,136,139,143,147
dc.w 150,154,158,161,165,168,171,175,178,181,184,187,190,193,196
dc.w 199,202,204,207,210,212,215,217,219,222,224,226,228,230,232
dc.w 234,236,237,239,241,242,243,245,246,247,248,249,250,251,252
dc.w 253,254,254,255,255,255,256,256,256,256	;<--90
dc.w 256,256,256,255,255,255,254,254,253,252,251,250,249,248,247
dc.w 246,245,243,242,241,239,237,236,234,232,230,228,226,224,222
dc.w 219,217,215,212,210,207,204,202,199,196,193,190,187,184,181
dc.w 178,175,171,168,165,161,158,154,150,147,143,139,136,132,128
dc.w 124,120,116,112,108,104,100,96,92,88,83,79,75,71,66,62,58
dc.w 53,49,44,40,36,31,27,22,18,13,9,4,0	;<-180
dc.w -4,-9,-13,-18,-22,-27,-31,-36
dc.w -40,-44,-49,-53,-58,-62,-66,-71,-75,-79,-83
dc.w -88,-92,-96,-100,-104,-108,-112
dc.w -116,-120,-124,-128,-132,-136,-139,-143,-147
dc.w -150,-154,-158,-161,-165,-168,-171
dc.w -175,-178,-181,-184,-187,-190,-193,-196
dc.w -199,-202,-204,-207,-210,-212,-215
dc.w -217,-219,-222,-224,-226,-228,-230,-232
dc.w -234,-236,-237,-239,-241,-242,-243,-245
dc.w -246,-247,-248,-249,-250,-251,-252
dc.w -253,-254,-254,-255,-255,-255,-256,-256,-256,-256	;<--270
dc.w -256,-256,-256,-255,-255,-255,-254
dc.w -254,-253,-252,-251,-250,-249,-248,-247
dc.w -246,-245,-243,-242,-241,-239,-237
dc.w -236,-234,-232,-230,-228,-226,-224,-222
dc.w -219,-217,-215,-212,-210,-207,-204
dc.w -202,-199,-196,-193,-190,-187,-184,-181
dc.w -178,-175,-171,-168,-165,-161,-158
dc.w -154,-150,-147,-143,-139,-136,-132,-128
dc.w -124,-120,-116,-112,-108,-104,-100
dc.w -96,-92,-88,-83,-79,-75,-71,-66,-62,-58
dc.w -53,-49,-44,-40,-36,-31,-27,-22,-18,-13,-9,-4  	;<-359

INIT:          btst    #5,$dff01f
               beq.s   INIT
               move.w  #$20,$dff096
               move.l  4,a6
               rts

LOGO_DATA:	blk.b	40*Alt_logo*3,$af

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* NoisePacker V2.02 PlayRoutine ©1990 Twins of Phenomena. *
* Used registers are d0-d7/a0-a6.     Not using lev6irq.  *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

np_init:
	lea	np_data,a4
	lea	$dff000,a5
	lea	np_position(pc),a6
	moveq	#2,d0
	moveq	#0,d1
	move.l	a4,a3
np_init1:
	add	(a4)+,a3
	move.l	a3,(a6)+
	dbf	d0,np_init1
	move	(a4)+,d0
	add.l	d0,a3

	move.l	#$01060100,(a6)+
	move	#$8200,(a6)+
	move.l	d1,(a6)+
	move.l	#np_portup,(a6)+
	move.l	#np_portdown,(a6)+
	move.l	#np_port,(a6)+
	move.l	#np_vib,(a6)+
	move.l	#np_port2,(a6)+
	move.l	#np_vib2,(a6)+
	move.l	#np_volslide,(a6)+
	move.l	#np_arp,(a6)+
	move.l	#np_songjmp,(a6)+
	move.l	#np_setvol,(a6)+
	move.l	#np_pattbreak,(a6)+
	move.l	#np_filter,(a6)+
	move.l	#np_setspeed,(a6)+

	moveq	#0,d0
	move.l	a4,a6
	add	-8(a4),a6
	sub	#12,a6
np_init2:
	move.l	a3,(a4)
	move.l	a3,a2
	move	14(a4),d0
	add	d0,d0
	add.l	d0,a2
	move.l	a2,8(a4)
	move	4(a4),d0
	add	d0,d0
	add.l	d0,a3
	add	#16,a4
	cmp.l	a4,a6
	bne.s	np_init2

	bset	#1,$bfe001
	move	d1,$a8(a5)
	move	d1,$b8(a5)
	move	d1,$c8(a5)
	move	d1,$d8(a5)

	rts

np_end:	moveq	#0,d0
	lea	$dff000,a5
	move	d0,$a8(a5)
	move	d0,$b8(a5)
	move	d0,$c8(a5)
	move	d0,$d8(a5)
	bclr	#1,$bfe001
	move	#$f,$96(a5)
	rts

np_music:
	moveq	#0,d6
	lea	$dff000,a5
	lea	$d0(a5),a4
	lea	np_block(pc),a6
	subq.b	#1,(a6)
	bhi	np_nonew

	lea	np_position(pc),a3
	move.l	(a3)+,a0
	add	6(a6),a0
	move	(a0),d0
	move.l	(a3)+,a0
	add	d0,a0
	move.l	(a3)+,a1
	add	8(a6),a1
	lea	np_voidat1(pc),a2

	moveq	#8,d0
	moveq	#0,d5
np_loop1:
	moveq	#0,d1
	move	(a0)+,d1
	lea	(a1,d1.l),a3
	move.b	(a3)+,d1
	move.b	(a3)+,d3
	move.b	(a3)+,d4

	move.b	d3,d7
	lsr.b	#4,d7
	move.b	d1,d2
	and	#1,d2
	beq.s	np_loop2
	moveq	#$10,d2
np_loop2:
	lea	np_data-8,a3
	or.b	d7,d2
	bne.s	np_loop3

	move.b	1(a2),d2
	lsl	#4,d2
	add	d2,a3
	bra.s	np_loop4
np_loop3:
	move.b	d2,1(a2)
	lsl	#4,d2
	add	d2,a3
	move	6(a3),4(a2)
np_loop4:
	and	#$f,d3
	move.b	d3,2(a2)
	move.b	d4,3(a2)

	and	#$fe,d1
	beq.s	np_loop5

	move	np_periods-2(pc,d1.w),d7

	subq	#3,d3
	beq	np_setport
	subq	#2,d3
	beq	np_setport

	or	d0,d5
	move.b	d1,(a2)
	move.b	d6,49(a2)
	move	d7,24(a2)

	move.l	(a3)+,(a4)
	move	(a3)+,4(a4)
	addq	#2,a3
	move.l	(a3)+,72(a2)
	move	(a3)+,76(a2)

	subq	#6,d3
	bmi.s	np_loop6
	add	d3,d3
	add	d3,d3
	move.l	42(a6,d3.w),a3
	jmp	(a3)

np_loop5:
	sub	#11,d3
	bmi.s	np_loop6
	add	d3,d3
	add	d3,d3
	move.l	42(a6,d3.w),a3
	jmp	(a3)

np_periods:
	dc.w	$0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a
	dc.w	$01fc,$01e0,$01c5,$01ac,$0194,$017d,$0168,$0153,$0140
	dc.w	$012e,$011d,$010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be
	dc.w	$00b4,$00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071

np_loop6:
	move	24(a2),6(a4)
np_loop7:
	move	4(a2),8(a4)
	addq	#6,a2
	sub	#$10,a4
	lsr	#1,d0
	bne	np_loop1

	move	d5,$96(a5)
	move.b	d5,5(a6)
	move.b	1(a6),(a6)

	move	#270,d0
wait1:	dbf	d0,wait1

	move	4(a6),$96(a5)

	moveq	#80,d0
wait2:	dbf	d0,wait2

	move.l	np_position(pc),a0
	bset	#0,2(a6)
	beq.s	np_break
	addq	#3,8(a6)
	cmp	#192,8(a6)
	bne.s	np_next
np_break:
	move	d6,8(a6)
	addq	#2,6(a6)
	move	6(a6),d0
	cmp	-4(a0),d0
	bne.s	np_next
	move	-2(a0),6(a6)
np_next:lea	np_voidat2(pc),a0
	move.l	(a0)+,$d0(a5)
	move	(a0)+,$d4(a5)
	move.l	(a0)+,$c0(a5)
	move	(a0)+,$c4(a5)
	move.l	(a0)+,$b0(a5)
	move	(a0)+,$b4(a5)
	move.l	(a0)+,$a0(a5)
	move	(a0)+,$a4(a5)
	rts

np_setvol:
	move.b	d4,5(a2)
	bra.L	np_loop6

np_pattbreak:
	move	d6,2(a6)
	bra.L	np_loop6

np_songjmp:
	move	d6,2(a6)
	move.b	d4,7(a6)
	bra.L	np_loop6

np_setspeed:
	move.b	d4,1(a6)
	bra	np_loop6

np_filter:
	and.b	#$fd,$bfe001
	or.b	d4,$bfe001
	bra	np_loop6

np_setport:
	move.b	d6,50(a2)
	move	d7,26(a2)
	cmp	24(a2),d7
	beq.s	np_clrport
	bge	np_loop7
	move.b	#1,50(a2)
	bra	np_loop7
np_clrport:
	move	d6,26(a2)
	bra	np_loop7

np_nonew:
	lea	np_voidat1(pc),a0
	moveq	#3,d0
np_lop1:moveq	#0,d1
	move.b	2(a0),d1
	beq.s	np_lop2
	subq	#8,d1
	bhi.s	np_lop2
	addq	#7,d1
	add	d1,d1
	add	d1,d1
	move.l	10(a6,d1.w),a3
	jmp	(a3)
np_lop2:addq	#6,a0
	sub	#$10,a4
	dbf	d0,np_lop1
	rts

np_portup:
	moveq	#0,d2
	move.b	3(a0),d2
	sub	d2,24(a0)
	cmp	#$71,24(a0)
	bpl.s	np_portup2
	move	#$71,24(a0)
np_portup2:
	move	24(a0),6(a4)
	bra.s	np_lop2

np_portdown:
	moveq	#0,d2
	move.b	3(a0),d2
	add	d2,24(a0)
	cmp	#$358,24(a0)
	bmi.s	np_portdown2
	move	#$358,24(a0)
np_portdown2:
	move	24(a0),6(a4)
	bra.s	np_lop2

np_arp:	moveq	#0,d2
	move.b	(a6),d2
	sub.b	1(a6),d2
	neg.b	d2
	move.b	np_arplist(pc,d2.w),d2
	beq.s	np_arp0
	subq.b	#2,d2
	beq.s	np_arp2
np_arp1:move.b	3(a0),d2
	lsr	#3,d2
	and	#$e,d2
	bra.s	np_arp3
np_arp2:move.b	3(a0),d2
	and	#$f,d2
	add	d2,d2
np_arp3:add.b	(a0),d2
	cmp	#$48,d2
	bls.s	np_arp4
	moveq	#$48,d2
np_arp4:lea	np_periods-2(pc),a3
	move	(a3,d2.w),6(a4)
	bra	np_lop2
np_arp0:move	24(a0),6(a4)
	bra	np_lop2

np_arplist:
	dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1

np_sin:
	dc.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
	dc.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18

np_vib:	move.b	3(a0),d3
	beq.s	np_vib2
	move.b	d3,48(a0)
np_vib2:	
	move.b	49(a0),d3
	lsr.b	#2,d3
	and	#$1f,d3
	moveq	#0,d2
	move.b	np_sin(pc,d3.w),d2
	move.b	48(a0),d3
	and	#$f,d3
	mulu	d3,d2
	lsr	#7,d2
	move	24(a0),d3
	tst.b	49(a0)
	bmi.s	np_vibsub
	add	d2,d3
	bra.s	np_vib3
np_vibsub:
	sub	d2,d3
np_vib3:move	d3,6(a4)
	move.b	48(a0),d3
	lsr.b	#2,d3
	and	#$3c,d3
	add.b	d3,49(a0)
	cmp.b	#20,d1
	bne	np_lop2

np_volslide:
	move.b	3(a0),d2
	add.b	d2,5(a0)
	bmi.s	np_vol3
	cmp.b	#$40,5(a0)
	bmi.s	np_vol2
	move	#$40,4(a0)
np_vol2:move	4(a0),8(a4)
	bra	np_lop2

np_vol3:move	d6,4(a0)
	move	4(a0),8(a4)
	bra	np_lop2

np_port:move.b	3(a0),d2
	beq.s	np_port2
	move.b	d2,29(a0)

np_port2:
	move	26(a0),d2
	beq.s	np_rts
	move	28(a0),d3
	tst.b	50(a0)
	bne.s	np_sub
	add	d3,24(a0)
	cmp	24(a0),d2
	bgt.s	np_portok
	move	d2,24(a0)
	move	d6,26(a0)
np_portok:
	move	24(a0),6(a4)
np_rts:	cmp.b	#16,d1
	beq.s	np_volslide
	bra	np_lop2

np_sub:	sub	d3,24(a0)
	cmp	24(a0),d2
	blt.s	np_portok
	move	d2,24(a0)
	move	d6,26(a0)
	move	24(a0),6(a4)
	cmp.b	#16,d1
	beq	np_volslide
	bra	np_lop2

np_position:	dc.l	0
np_pattern:	dc.l	0
np_voice:	dc.l	0
np_block:	blk.w	31,0
np_voidat1:	blk.l	18,0
np_voidat2:	blk.l	6,0
np_data:	blk.b	15042,0



