;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	DRAGONFIRE
;		AKA
;	CHEESE
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	MAY 21, 1982
;	COPYRIGHT 1982 BY IMAGIC
;	ROBERT GRAVES SMITH III
;

	processor	6502

RELEASE	EQU	1
PAL	EQU	0		;(PAL COLORS NOT IN THIS LISTING, OTHER PAL SHOULD WORK)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; STELLA EQUATES
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


VSYNC	EQU		$00			; VERT SYNC
VBLNK	EQU		$01			;
HSYNC	EQU		$02			; STROBE
MCRES	EQU		$03			; MASTER COUNTER RESET
P0SIZE	EQU		$04			; SIZE, NUMBER OF COPIES
P1SIZE	EQU		$05			;
P0CLR	EQU		$06			; COLOR
P1CLR	EQU		$07			;
PFCLR	EQU		$08			;
BKCLR	EQU		$09
PFCTRL	EQU		$0A			; PLAYFIELD CONTROL

P0REF	EQU		$0B			; REFLECT
P1REF	EQU		$0C			;

PF0		EQU		$0D			; PLAYFIELD REGISTERS
PF1		EQU		$0E			;
PF2		EQU		$0F			;

P0RES	EQU		$10			; RESETS
P1RES	EQU		$11			;
M0RES	EQU		$12			;
M1RES	EQU		$13			;
BRES	EQU		$14			;

SNDC0	EQU		$15			; SOUND CONTROL
SNDC1	EQU		$16			;
SNDF0	EQU		$17			; FREQUENCY
SNDF1	EQU		$18			;
SNDV0	EQU		$19			; VOLUME
SNDV1	EQU		$1A			;

P0GR	EQU		$1B			; GRAPHICS REGISTERS
P1GR	EQU		$1C			;
M0GR	EQU		$1D			;
M1GR	EQU		$1E			;
BGR		EQU		$1F			;

P0HM	EQU		$20			; HMOVES
P1HM	EQU		$21
M0HM	EQU		$22
M1HM	EQU		$23
BHM		EQU		$24			;

P0VDEL	EQU		$25			; VERTICAL DELAYS
P1VDEL	EQU		$26			;
BVDEL	EQU		$27			;

MP0RES	EQU		$28			; MISSILE TRACKING
MP1RES	EQU		$29			;
HMOV	EQU		$2A			; HORIZ MOVEMENT STROBE
CLRHM	EQU		$2B			; CLEAR HMOVE STROBE
CCLR	EQU		$2C			; CX REGISTER RESET STROBE

;READ ADDRESSES

M0PPCX	EQU		$00			; M0 PLAYER CX
M1PPCX	EQU		$01			; M1 PLAYER
P0BPCX	EQU		$02			; P0 BALL/PLAYFIELD CX
P1BPCX	EQU		$03			;
M0BPCX	EQU		$04			; M0 BALL/PLAYFIELD CX
M1BPCX	EQU		$05			;
BPCX	EQU		$06			; BALL PLAYFIELD CX
PPMMCX	EQU		$07			; P0/P1 MISSILE CX
POT0A	EQU		$08			; POT IN, LEFT
POT0B	EQU		$09			; POT IN, LEFT
POT1A	EQU		$0A			; POT IN, RIGHT
POT1B	EQU		$0B			; POT IN, RIGHT
TRIG0	EQU		$0C			; SCHMIDT TRIGGER LEFT
TRIG1	EQU		$0D			; RIGHT

; PIA ADDRESSES

PLRCTL	EQU		$280			; PORT A (CONTROLLERS)
DDRA	EQU		$281			; DATA DIRECTION A
FPCTL	EQU		$282			; FRONT PANEL SWITCHES
DDRB	EQU		$283			; DATA DRIECTION B
TIMER	EQU		$284			; PIA TIMER
TIMOUT	EQU		$285			; PIA TIMER FLAG
TIMD1	EQU		$294			; CLOCK / 1
TIMD8	EQU		$295			; CLOCK / 8
TIMD64	EQU		$296			; CLOCK / 64
TIMD1K	EQU		$297			; CLOCK / 1024

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; GAME EQUATES
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

TOP		EQU		$A0

	IF	PAL
NUP1S	EQU		10			; NUMBER OF PLAYER 1'S
	ELSE
NUP1S	EQU		9
	ENDIF
NUP0S	EQU		5			; NUMBER OF PLAYER 0'S

DEAD	EQU		$D0
SUPRESS	EQU		$FF
FBSPEED	EQU		2			;FIREBALL SPEED
WINDOW	EQU		20
CAVECLR	EQU		$0A

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; SOUND EQUATES
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FIRES	EQU		0			;FIRE FIREBALL
BONSND	EQU		1			;BONUS
JUMPS	EQU		2			;JUMP SOUND
EXSND	EQU		3			;EXPLOSION
DEATHS	EQU		4			;DEATH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; RAM ALOCATION
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;		CODE
		SEG.U	RAM
		ORG	$80

RAND		DS	1		;
RANDH		DS	1
FLAGS		DS	1		; D7=0=LOGO, D6=1, SHOW VERSION NUM
				 		; D0 = RESET SWITCH

EYETOP		DS	1		; UPPER LIMIT OF EYE
EYEBOT		DS	1		; LOWER LIMIT OF EYE
NEWCNT		DS	1		; COUNTER FOR NEW BOARD SETUP
ATTRACT		DS	1		; 
GAMESTAT	DS	1		; D7 RESET=CASTLE SCREEN, D6 RESET=ATTR
PLYRSTAT	DS	1		; D7 SET=PLAYER INIT
DRAGSTAT	DS	1		; D6 SET=FLAMING
REFSHAD		DS	1		; REFLECT FOR PLAYER
GSEL		DS	1		; SELECT TIMER
GAMNUM		DS	1		; GAME NUMBER
T0			DS	1		;
T1			DS	1		;
T2			DS	1		;
T3			DS	1		;
CX			DS	1		; COLLISION POINTER
LIVES		DS	2		; LIFE COUNTERS
P1POINT		DS	1		;
P0POINT		DS	1		;
COUNT		DS	1		;

ZSTART
XSTART

P0XS		DS	NUP0S
DRAGONX		DS	1		;
EYEX		DS	1		; EYE XPOS
PLAYERX		DS	1		;
XEND

PLAYERY		DS	1		;
PLAYNO		DS	1		; PLAYER UP
WAVENO		DS	1		; WAVE NUM
FRAME		DS	2		; 16 BIT FRAME COUNTER
DEATH		DS	1		; DEATH FLAG
;
PLAYERLX	DS	1		;
PLAYERLY	DS	1		;
PLAYERDX	DS	1		;
PLAYERDY	DS	1		;
;
DRAGONDX	DS	1		;DRAGON DELTA
;
SCOREL0		DS	2		; LO SCORE
SCOREM0		DS	2		;
SCOREH0		DS	2	;

ZEND
; HMOVE VALUES
P1HMS		DS	NUP1S		;LIST OF HMOVES FOR P1'S
P0HMS		DS	NUP0S		;
DRAGONHM	DS	1		;
EYEHM		DS	1		;
PLAYERHM	DS	1		;

P0YS		DS	NUP0S		;
P0Y			DS	1		;
P1ID		DS	NUP1S		;
P0ID		DS	NUP0S		;

;MAP THE RAT & ARROW RAM OVER THE P0 ID LIST
RATTIME		EQU	*-4		; RAT TIMER
ARROWTIM	EQU	*-3		; ARROW TIMER
RATHM		EQU	*-2		; RAT HMOVE
ARROWHM		EQU	*-1		; ARROW HMOVE

PLAYERID	DS	1		;
P1INDCLR	DS	2		;
P0INDCLR	DS	2		;
P1IND		DS	2		;
P0IND		DS	2		;

DRAGTIME	DS	1		; DRAGON FLAMING TIMER
DRAGONAN	DS	1		;

; DRAGON AND SIXCHAR INDIRECTION
ARRWIND					; ARROW INDIRECTION
SIXIND0
DRAGH0		DS	2
;
ARRWINDC				; ARROW COLOR INDIRECTION
SIXIND1
DRAGH1		DS	2
;
SIXIND2
DRAGH2		DS	2		;
;
SIXIND3
DRAGH3		DS	2
;
SIXIND4
DELAY		DS	2		; INDIRECT JUMP INTO KERNEL

SIXIND5		DS	2		;

CAVESHAD   	DS	1		; SHADOW CAVE COLOR

SND1		DS	1		; SOUND ID
SND1TIME	DS	1		; SOUND TIMER
JUMPTIME	DS	1		;
SELTIME		DS	1		; SELECT SWITCH TIMER
SEA			DS	1		;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; MAIN PROGRAM
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	SEG	CODE
	ORG	$1000,0

START	SEI
		CLD			; NO DECIMAL
		LDX	#$00
		TXA
CLP		STA	$0,X	; CLEAR STELLA & RAM
		TXS
		INX
		BNE	CLP
;
; INITS
;
		DEC	ATTRACT
		LDA	#$11
		STA	PFCTRL
		STA	RANDH
		JSR	SETUPCA		; SET UP CASTELE SCREEN
		LDA	#150
		STA	PLAYERX
		STA	PLAYERY
		STA	RAND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; SYNC FOR NEW FRAME
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SCRNTOP	LDA	#2			; VBLANK ON
		STA	VBLNK
		STA	HSYNC		; VSYNC FOR 3 SCAN LINES
		STA	VSYNC

	; SET UP HIGH BYTES FOR INDIRECTION
		LDA	#(ATREAS >>8 )
		STA	P1IND+1
		LDA	#MAN0 >>8
		STA	P0IND+1
		LDA	#TREASCLR >>8
		STA	P1INDCLR+1
		LDA	#MAN0C >> 8
		STA	P0INDCLR+1

; SET UP DRAGONS EYE OR FLAME
; 30 MC
;
		LDA	DRAGSTAT
		ASL
		ASL
		LDA	DRAGONDX
		ROL
		ROL
		AND	#$3
		TAX
		LDA	DRAGONX
		CLC
		ADC	OFFSETS,X
		STA	EYEX
; RANDOM NUMBER GENERATOR
RANDOM	LDA	RAND
		ROR
		ROR
		ROR
		EOR	RANDH
		ASL
		ASL
		ROL	RAND
		ROL	RANDH
		LDA	RAND
;
		STA	HSYNC
		LDA	CAVESHAD	; SETUP PLAYFIELD COLOR
		EOR	#$C			; DROP 2 LUMES
		AND	ATTRACT
		STA	PFCLR
		LDA	#$0
		STA	HSYNC
		STA	VSYNC		; OFF GOES VSYNC

	IF PAL
		LDA	#$42
	ELSE	
		LDA	#$2C
	ENDIF
		STA	TIMD64
;
; SOMEONE DIE THIS FRAME?
;
		LDX	PLAYNO
		LDA	LIVES,X
		BPL	OUT23
; START DEATH, SOMEONE DEAD!
	IF PAL
		LDA	#150+15
		STA	PLAYERY
		LDA	#150
		STA	PLAYERX
	ELSE
		LDA	#150
		STA	PLAYERY
		STA	PLAYERX
	ENDIF

		LDY	SND1TIME
		DEY
		BEQ	SKIP39
		LDX	#DEATHS
		CPX	SND1
		BEQ	OUT23
		JSR	STARTSND
		JMP	OUT23
SKIP39
;
		LDA	GAMNUM
		LSR
		BCS	PLAY2		; TWO PLAYER

; END GAME
ENDGAME	JSR	SETUPCA
		STA	LIVES		;(A = 0)
		STA	LIVES+1
		STA	GAMESTAT
		LDA	#150
		STA	PLAYERY
		STA	PLAYERX
		BNE	OUT23
; 2 PLAYER VERSION
PLAY2	LDA	LIVES
		BPL	ALIVE0
		LDA	LIVES+1
		BMI	ENDGAME		; BOTH DEAD
; O DEAD, 1 ALIVE
ALIVE1	LDA	PLAYNO
		EOR	#$1
		STA	PLAYNO
		JSR	SETUPCA
		BEQ	OUT23
ALIVE0 LDY WAVENO
		INY
		CPY	#9
		BCS	ALIVE1
		STY	WAVENO
		BCC	ALIVE1		; START NEW WAVE
OUT23
;
; ANIMATE MAN
;
		LDA	FRAME
		AND	#$7
		TAY
		AND	#$1
		BNE	OUT16
; SPECIAL CASE, EXPLODING MAN
		LDA	PLAYERID
		CMP	#(SUPINE & $FF)
		BCC	SKIP40
;EXPLODING MAN
		CPY	#0
		BNE	OUT16
		ADC	#$F
		CMP	#(SUPINE2+1) & $FF
		BCC	WRID
;EXPLOSION OVER
		LDA	#$8C
		STA	PLAYERX
		LDA	#0
		STA	PLAYERY
		STA	PLAYERDY
		LDA	#$80
		STA	PLYRSTAT
		LDX	PLAYNO
		DEC	LIVES,X
		LDA	#MAN0 & $FF
WRID	STA	PLAYERID
		JMP	OUT16
SKIP40
; FORCE KNEELING MAN IF CASTLE AND DOWN STICK
		BIT	GAMESTAT
		BMI	SKIP07		; DOING DRAGON SCREEN
		LDA	PLRCTL		; LOAD STICK
		LDX	PLAYNO
		BEQ	SKIP09
		ASL
		ASL
		ASL
		ASL
SKIP09	AND	#$20
		BNE	SKIP23
		STA	PLAYERDX	;KNEELING MAN CAN'T MOVE
		LDA	#MAN4 & $FF
		BNE	SKIP75
SKIP23
SKIP07
		LDA	PLAYERDX
		ORA	PLAYERDY
		BNE	SKIP76
DOMAN0	LDA	#(MAN0 & $FF)	;FORCE STILL PICTURE
		BEQ	SKIP75
SKIP76	LDA	PLAYERID
		CMP	#(MAN2 & $FF)
		BCS	DOMAN0
		ADC	#$10
SKIP75	STA	PLAYERID
OUT16
; SET UP SCORE FOR VERSION NUMBER
		BIT FLAGS
; SET UP VERSION NUMBER
NOLOGO	BVC	OUT03
		LDA	GAMNUM
		AND	#$1
		LSR
		STA	SCOREM0
		ADC	#1
		STA	SCOREL0
		LDA	GAMNUM
		LSR
		TAX
		INX
		STX	SCOREH0
OUT03



;
; REMOVE ONE EMPTY SLOT IN LIST OF P0'S
;
		LDX	#0
		STX	T0
;
LOOP2	LDY	P0YS,X
		CPY	#DEAD
		BNE	SKIP08
		INC	T0
LOOP3	INX				; BUMP LOOP COUNT
		CPX	#NUP0S
		BNE	LOOP2
		BEQ	OUT06
SKIP08	LDA	T0
		BEQ	LOOP3
;READING VLID ENTRY
LOOP4	LDA	P0ID,X		; GET ID
		PHA
		LDA	P0XS,X		
		DEX
		STA	P0XS,X
		PLA
		STA	P0ID,X
		STY	P0YS,X
		INX				; POINT TO OLD ENTRY
		INX				; POINT OVER
		LDY	P0YS,X
		CPX	#NUP0S		; CHECK FOR MAX
		BNE	LOOP4
OUT06
;
; ROOM CLEAR?
;
		LDX	#NUP1S-1
		LDA	#(SPACE10 & $FF)
ENDLOOP	CMP	P1ID,X
		BNE	OUT11
		DEX
		BNE	ENDLOOP
;
		LDA	#(ODOOR & $FF)
		STA	P1ID+NUP1S-1
		STX	P1HMS+NUP1S-1	; X = 0
OUT11
;
; FIREBALL BIRTH
;
		BIT	GAMESTAT	;DON'T DO IF CASTLE SCREEN
		BPL	OUT10

		LDX	#$FF
		LDA	PLAYERY		; IF PLAYER HIDDEN, QUIT
		BEQ	OUT10
;SCAN LIST TO FIND AVAILABLE SLOT
SERCHLP	INX
		CPX	#NUP0S-1
		BCS	OUT10
		LDA	P0YS,X
		CMP	#DEAD
		BNE	SERCHLP

;FOUND A SLOT
GOTONE	CPX	#0			;ALREADY TOP OF LIST?
		BEQ	SKIP17
		DEX				;SEE IF ROOM
		LDA	P0YS,X
		CMP	#42			;MIN SEPARATION
		BCC	OUT10
		INX				;ROOM TO SPARE
SKIP17	LDA	DRAGONX
		ADC	#$14		;OFFSET TO DRAGON HEAD
		BIT	DRAGONDX	;TRAVEL LEFT OR RIGHT
		BPL	SKIP16		;RIGHT
		SBC	#$12
SKIP16	STA	T0			;CHECK FOR PRESENSE IN FLAME WINDOW
		CMP	PLAYERX
		BCC	SUBT0
		SBC	PLAYERX
		BCS	SKIP29		;ALWAYS TAKEN
;
SUBT0	LDA	PLAYERX
		SEC
		SBC	T0
SKIP29	CMP	#WINDOW
		BCS	OUT10
		LDA	T0
		STA	P0XS,X
		LDA	#$10		;START FLAME TIMER
		STA	DRAGTIME
		LDA	#$40
		STA	DRAGSTAT	;ENABLE GRAPHICS
		STX	T1
		LDX	#FIRES		;START SOUND
		JSR	STARTSND
		LDX	T1
		LDA	#17			;SET UP FLAME
		STA	EYETOP
		LDA	#10
		STA	EYEBOT
		LDA	#0
		STA	P0YS,X
		LDA	#(FB0 & $FF)
		STA	P0ID,X
OUT10
		INC	FRAME
		BNE	NOINC
; CHANGE PLAYER NUMBER IF 2 PLAYER AND GAME OVER
		BIT FLAGS
		BVS	OUT21
		BIT	GAMESTAT
		BVS	OUT21
		LDA	GAMNUM
		LSR
		BCC	OUT21
		LDA	PLAYNO
		EOR	#1
		STA	PLAYNO
OUT21
;
		INC	FRAME+1
		BNE	NOINC
		LDA	#$F3
		STA	ATTRACT
		LDA	#$0
		STA	GAMESTAT
NOINC
;
; PLAYER/ FIRE BALL COLLISIONS
;
		LDA	#0
		STA	T0
		BIT	GAMESTAT
		BPL	OUT04
		LDA	PLAYERID		;DONT CX WITH EXPLODING MAN
		CMP	#(SUPINE & $FF)
		BCS	OUT04
		LDA	PLAYERY			;CHECK FOR Y CX FIRST
		BEQ	OUT04
		SEC
		SBC	#16
		BCC	NEGNUM
		STA	T0
NEGNUM	CLC
		ADC	#32
		STA	T1
;CHECK IN Y
		LDX	#NUP0S-1
PCXLOOP	LDA	P0YS,X
		CMP	#DEAD
		BEQ	NEXT07
		CMP	T0
		BCC	NEXT07
		CMP	T1
		BCC	MAYBE
NEXT07	DEX
		BPL	PCXLOOP
		BMI	OUT04
;CHECK IN X
MAYBE	LDA	 PLAYERX
		SBC	#6
		BCC	NEGNUM1
		CMP	P0XS,X
		BCS	NEXT07		;NO CX
NEGNUM1
		ADC	#12
		CMP	P0XS,X
		BCC	NEXT07
;COLLISION!!
		LDA	#(DOOR & $FF)
		STA	P1ID
		LDA	#DEAD		;EXPLODE FIREBALL
		STA	P0YS,X
		LDA	#SUPINE & $FF
		STA	PLAYERID
		LDX	#EXSND		;SOUND
		JSR	STARTSND
OUT04
;
; DERIVE HMOVE AND DELAY VALUES FOR OBJECTS
;
DOHMS	LDX	#XEND-XSTART-1	;LOAD NUMBER OF OBJECTS
DOHMOVES	LDA	P0XS,X		;LOAD XPOS
		LSR					;/16
		LSR
		LSR
		LSR
		SEC
		ADC	P0XS,X
		LSR
		LSR
		LSR
		LSR
		STA	T0			;DELAY VALUE
		CLC
		ADC	P0XS,X
		AND	#$F			;GET HMOVE VALUE 0-E
		SEC
		SBC	#$7			;MAKE 0-E FORMAT INTO SIGNED FOR HMOV
		EOR	#$FF
		ASL
		ASL
		ASL
		ASL				;60 = CLOCK 0
		ORA	T0
		STA	P0HMS,X
		DEX
		BPL	DOHMOVES
; RESET EYE OR FLAME
		STA	HSYNC
		LDA	EYEHM
		STA	BHM
		AND	#$F
		TAY
		NOP
		NOP
		NOP
EYELOOP DEY
		BPL	EYELOOP
		STA	BRES



; SET UP INDIRECT JUMP FOR MOVING FOUR CHAR
		LDA	DRAGONHM
		LSR
		LSR
		LSR
		LSR
		TAY
		LDA	DELAYS,Y
		STA	DELAY			;SET UP INDIRECT JUMP
		LDA	#(W11 >> 8)
		STA	DELAY+1
	;
; RESET TOP OF LIST P0
		LDA	FRAME
		LSR
		BCS	DOPLYR1
		LDA	P0HMS
		LDX	#1
		STX	P0POINT
		LDX	P0ID
		LDY	P0YS
		CPY	#DEAD
		BNE	SKIP11
DOPLYR1	LDA PLAYERHM
		LDX	#NUP0S
		STX	P0POINT
		LDX	PLAYERID
		LDY	PLAYERY
SKIP11	STA	HSYNC
		STX	P0IND
		STX	P0INDCLR
		STY	P0Y
		STA	P0HM
		AND	#$F			;GET DELAY
		TAY
RLOOPP0	DEY
		BPL	RLOOPP0
		STA	P0RES
		STA	HSYNC
		STA	HMOV
		STY	CX			;PUT FF INTO CX
		INY
		STY	P1SIZE
		STY	P0SIZE
;
; LAST LINES BEFORE KERNEL
;
		LDY	#NUP1S		;NUMBER OF BANDS
		STY	P1POINT
	IF PAL
		LDX	#$A5
	ELSE
		LDX	#$A5-15		;SETUP LINE COUNT
	ENDIF

		LDY	#0
		STY	COUNT
		LDA	REFSHAD		;REFLECT PLAYER 1
		STA	P0REF
		STA	CLRHM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; END OF VERTICAL BLANK
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VBOUT	BIT	TIMOUT		;WAIT FOR VERTICAL BLANK OVER
		BPL	VBOUT
		STA	HSYNC
		STY	VBLNK		;ENABLE ELECTRON BEAM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; KERNELS BGINS HERE
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		STY	BKCLR
		BIT	GAMESTAT
		BMI	DOCAVE
		STY	PF0
		STY	PF1
		STY	PF2
	IF PAL
		LDA	#$DA
	ELSE
		LDA	#$C8
	ENDIF
		STA	TIMD64
		BNE	DOCASTLE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;CAVE TOP KERNEL
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DOCAVE	LDY	#$03
CAVELOOP	STA	HSYNC
		STA	HSYNC
		STA	HSYNC
		LDA	CAVE0,Y
		STA	PF0
		LDA	CAVE1,Y
		STA	PF1
		LDA	CAVE2,Y
	
		DC	$8D		; STA PF2 (ABSOLUTE)
		DC.W	PF2

		DEY
		BPL	CAVELOOP
		NOP
		NOP
		JMP	KENTRY			;MC 33
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; CASTLE KERNALS
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DOCASTLE
		LDA	#$15
		STA	PFCTRL
;
		LDA	#(HFB0 >>8)
		STA	ARRWIND+1
		LDX	#(HFB0 & $FF)	;HORIZONTAL FIREBALL
		LDA	FRAME
		
		AND	#4
		BNE	SKIP41
		LDX	#(HFB1 & $FF)
SKIP41	STX	ARRWIND
		LDX	#14
		STX	T0				;COUNT FOR ARROW
;
		LDY	#$0A
CASLOOP	LDX	#7
CASLOOP0	STA	HSYNC
		LDA	CASTLE0,Y
		STA	PF0
		LDA	CASTLE1,Y
		STA	PF1
		DEX
		BPL	CASLOOP0
		DEY
		BPL	CASLOOP
		INY
		STA	T1
;
		LDA	RATHM
		STA	T2				;SAVE HMOVE VALUE
		AND	#$F
		STA	T3				;HOLD RAT DELAY
		STA	HSYNC
		NOP
		NOP
		LDa	ARROWHM	
		LDX	#25				;LINE COUNT
		STA	P1HM
		AND	#$F
		TAY
RESLOOP0	DEY
		BPL	RESLOOP0
		STA	P1RES
		STA	HSYNC
		STA	HMOV
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;ARROW/RAT/MAN KERNAL
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WALKLOOP	STA	HSYNC
		STA	P0CLR			;MC 3
		LDA	T1				;MC 6
		STA	P0GR			;MC 9
		LDY	T0				;MC 12
		LDA	(ARRWIND),Y		;MC 17
		STA	P1GR			;MC 20
		LDA	#$44			;MC 22 LOAD RED COLOR
		STA	P1CLR			;MC 25
;
		LDA	T2
		STA	P1HM			;MC 31
MKERNEL	TXA
		SEC
		SBC	P0Y
		TAY
		AND	#$F0
		BNE	SKIP95
		LDA	(P0IND),Y
		STA	T1
		LDA	(P0INDCLR),Y
SKIP95	DEX
		BMI	SHIELDK
		DEC	T0
		BPL	WALKLOOP
;
RESET	STA	HSYNC
		STA	P0CLR
		LDA	T1
		STA	P0GR
		LDY	T3
;
		TXA
		SEC
;
RATLOOP	DEY
		BPL	RATLOOP
		STA	P1RES
		STA	HSYNC
		STA	HMOV
		SBC	P0Y
		TAY
		LDA	(P0IND),Y
		STA	P0GR
		LDA	(P0INDCLR),Y
		STA	P0CLR
SKIP04	DEX
		LDY	#$9
		STY	T0
		JMP	MKERNEL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; SHIELD KERNAL
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHIELDK
		LDA	P0BPCX	;PLAYER/WALL CX
		STA	HSYNC
		STA	CX
		LDA	#0
		STA	P1GR
		STA	P0GR
		STX	P0REF
		STX	PF0
		STX	PF1
		STX	PF2
		LDY	#$11
		NOP
		STA	P1RES	;MC 30
		STY	PFCTRL
		LDA	#3
		STA	P1SIZE
		STA	P0SIZE
		LDX	WAVENO
		LDA	DRAGCLR,X
		STA	P0RES	;MC 51
		AND	ATTRACT
		STA	P1CLR
		STA	P0CLR
		LDX	#9
		STA	HSYNC
		LDA	CAVESHAD
		EOR	#$2
		AND	ATTRACT
		STA	PFCLR
		STA	HSYNC
SHIELDLP	STA	HSYNC
		LDA	SHIELD,X
		STA	P1GR
		STA	P0GR
		DEX
		BPL	SHIELDLP
;
;
		STA	HSYNC
		LDY	#$80
		STY	PF1
		STY	PF2

	IF	PAL
		LDY	#30
	ELSE
		LDY	#20
	ENDIF
MOATLOOP	STA	HSYNC
		DEY
		BPL	MOATLOOP
		LDA	SEA
		STA	BKCLR
		STA	HSYNC

	IF PAL
		LDA	#$B4
	ELSE
		LDA	#$84
	ENDIF

		AND	ATTRACT
		STA	BKCLR
;
; RETURN TO MAIN SCREEN
;
		JMP	TIMLOOP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; CASTLE SCREEN ROUTINES
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOVERAT	LDA	PLAYERID
		CMP	#(SUPINE & $FF)
		BCS	SKIP06
		LDA	PLAYERX
		CMP	#12
		BCS	SKIP06
		JMP	SETUPDR
SKIP06
;
; MOVE RATS AND ARROWS
;
		LDX	#1
MRATLOOP	LDY	RATTIME,X
		BEQ	MOVE
		DEC	RATTIME,X
		BNE	NEXT08
		STX	T1
		LDX	#FIRES
		JSR	STARTSND
		LDX	T1
MOVE	TXA
		TAY
		LDA	RATHM,X
MOVELOOP	SEC
		SBC	#$10
		BVC	NOWRAP
		SEC
		SBC	#$F
NOWRAP	CMP	#$CA
		BNE	SKIP02
		LDA	#$60
SKIP02
		CMP	#$40
		BNE	SKIP03
		LDA	RAND
		AND	#$1F
		ADC	WAVENO
		EOR	#$3F
		ASL
		STA	RATTIME,X
		LDA	#$40
		BNE	NEXT09
SKIP03	DEY
		BPL	MOVELOOP
NEXT09	STA	RATHM,X
NEXT08	DEX
		BPL	MRATLOOP
	;
; JUMP
;
J		BIT	GAMESTAT
		BVC	OUT18
		LDA	PLAYERDY
		BNE	SKIP24
		LDY	PLAYERID
		CPY	#(SUPINE & $FF)
		BCS	OUT18
		LDX	PLAYNO
		LDY	TRIG0,X
		BMI	SKIP24
		LDX	#JUMPS
		JSR	STARTSND
		LDA	#12
		STA	JUMPTIME
		LDA	#1
		STA	PLAYERDY
;
SKIP24
		CLC
		ADC	PLAYERY
		STA	PLAYERY
		BNE	SKIP27
		STA	PLAYERDY
SKIP27
		CMP	#$9
		BCC	OUT18
; AT TOP OF JUMP
		DEC	PLAYERY
		DEC	JUMPTIME
		BNE	OUT18
		LDY	#$FF
		STY	PLAYERDY
OUT18
;
; CX
;
		LDA	PLAYERID		;DONT CX WITH EXPLODING MAN
		CMP	#(SUPINE & $FF)
		BCS	OUT19
		BIT	PPMMCX
		BPL	OUT19
		BIT	CX
		BMI	OUT19			;LEAVE IF TOUCHING WALL
		LDA	#(SUPINE & $FF)
		STA	PLAYERID
		LDX	#EXSND			;TURN ON EXPLOSION
		JSR	STARTSND
		LDA	#$4A
		STA	ARROWHM			;START FIREBALLS AGAIN
		STA	RATHM
		LDA	#0
		STA	RATTIME
		STA	ARROWTIM
OUT19	STA	CCLR
		RTS
;
; MORE SUBROUTINES
;
SETUPCA
		ROL	GAMESTAT
		CLC
		ROR	GAMESTAT
		LDA	#$60
		STA	ARROWHM
		STA	RATHM
		LDA	#$8C
		STA	PLAYERX
		LDA	#NUP1S-1
		STA	NEWCNT
;
; CLEAR P0 LISR
;
		LDX	#NUP0S-1
		LDA	#DEAD
KILLLOOP	STA	P0YS,X
		DEX
		BPL	KILLLOOP
		LDA	#0
		STA	ARROWTIM
		STA	RATTIME
		STA	PLAYERDX
		STA	PLAYERDY
		STA	PLAYERY
		STA	DRAGSTAT
		RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; MAIN KERNEL
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		ORG	$1500

LDZERO0	NOP							;MC 49
		NOP							;MC 51
		LDA	#0						;MC 53
		STA	T1						;MC 56
		BEQ	SKIP10					;MC 59
TOENDK	JMP	ENDK
LOOP1	STA	P0CLR					;MC 73
		LDA	T1						;MC 76
;
KERNEL	STA	P0GR					;MC 3
		LDA	(P1IND),Y				;MC 8
		STA	P1GR					;MC 11
		LDA	(P1INDCLR),Y			;MC 16
		STA	P1CLR					;MC 19
;
		JSR	WASTE12					
		DEX							
KENTRY	TXA							;MC 35
		SEC							;MC 37
		SBC	P0Y						;MC 40
		TAY							;MC 42
		AND	#$F0					;MC 44
		BNE	LDZERO0					;MC 46/47
		LDA	(P0IND),Y				;MC 51
		STA	T1						;MC 54
		LDA	(P0INDCLR),Y			;MC 59
SKIP10
		DEC	COUNT					;MC 64
		LDY	COUNT					;MC 67
		BPL	LOOP1					;MC 69/70
;
; LINE 11 SETUP P1
;
		DEC	P1POINT					;MC 74
		BMI	TOENDK					;END KERNEL
		STA	P0CLR					;MC 3
		LDA	T1						;MC 6
		STA	P0GR					;MC 9
;SETUP P1
		LDY	P1POINT					;MC 12
		LDA	PPMMCX					;MC 15 P1/P0 CX
		BPL	EQUTIME					;MC 17/18
		STY	CX						;MC 20 SAVE LINE NUM OF CX
EQUTIME	STY	CCLR					;MC 23 CLEAR CX
		LDA	P1ID,Y					;MC 27
		STA	P1IND					;MC 30
		STA	P1INDCLR				;MC 33
		LDA	P1HMS,Y					;MC 37
		STA	P1HM					;MC 40 SET UP HMOVE
		DEX							;MC 42
		AND	#$F						;MC 44 GET DELAY VALUE
		STA	T0						;MC 47
		JMP	SKIP05					;MC 50
;
;
;
LDZERO2	LDA	#0
		TAY
		BEQ	SKIP12
LDZERO4	LDA	#0
		BEQ	SKIP13
;
;
SKIP05	TXA							;MC 52
		SEC							;MC 54
		SBC	P0Y						;MC 57
		TAY							;MC 59
		AND	#$F0					;MC 61
		BNE	LDZERO2					;MC 63/64
		LDA	(P0IND),Y				;MC 68
		STA	P0GR					;MC 71
SKIP12
;
; LINE 12 RESET P1 KERNEL
;
		STA	HSYNC
		LDA	(P0INDCLR),Y			;MC 5
		STA	P0CLR					;MC 8
		DEX							;MC 10
		SEC							;MC 12	;PREPARE FOR P0
		TXA							;MC 14
		LDY	T0						;MC 17
RESETLP	DEY							;MC 19
		BPL	RESETLP					;MC 21/22
		STA	P1RES					;MC 24
;
		SBC	P0Y						;MC 73
		STA	HSYNC					;MC 76
;
; LINE 13 CHECK FOR P0 RESET
;
		TAY							;MC 2
		AND	#$F0					;MC 4
		BNE	LDZERO4					;MC 6/7
		LDA	(P0INDCLR),Y			;MC 11
		STA	P0CLR					;MC 14
		LDA	(P0IND),Y				;MC 19
		STA	P0GR					;MC 22
SKIP13	STA	T1						;MC 25 (15 IF NO P0)
		TXA							;MC 27
;
		LDY	P0POINT					;MC 42
		DEX							;MC 44
		CMP	P0Y						;MC 48
		BCS	NORESET					;MC 50/51
; IF THIS PATH IS TAKEN, NO P0, SO MAX COUNT IS 39
		CPY	#NUP0S					;MC 
		BEQ	DOPLYR					;MC 
		LDA	P0YS,Y					;MC 43
;
		CMP	#DEAD					;MC 
		BNE	SKIP99					;MC 
;PUT PLAYER ON SCREEN
DOPLYR	LDA	PLAYERHM				;MC 
		STA	P0HM					;MC 
		AND	#$F						;MC 
		STA	T2						;MC 
		LDA	PLAYERY					;MC 
		STA	P0Y						;MC 
		LDA	PLAYERID				;MC 
		JMP	CONT0					;MC 
SKIP99
		STA	P0Y						;MC 56
		LDA	P0HMS,Y					;MC 
		STA	P0HM					;MC 46
		AND	#$F						;MC 
		STA	T2						;MC 49
		LDA	P0ID,Y					;MC 66
		INY							;MC 
CONT0	STA	HSYNC					;MC 74
;
; LINE 14 RESET P0
;
		STA	P0IND					;MC 
		STA	P0INDCLR				;MC 
		STY	P0POINT					;WASTE 3
		LDY	T2						;MC 
		NOP							;MC 
		DEX							;MC 17
RP0LP	DEY							;MC 19
		BPL	RP0LP					;MC 21/22
		STA	P0RES					;MC 24/?
;
; LINE 15 SETUP TO RETURN TO MAIN KERNEL
;
		STA	HSYNC					;MC 
		STA	HMOV					;MC 3
		NOP							;MC 5
		NOP							;MC 7
		NOP							;MC 9
		JMP	AENTRY					;MC 12
;
TOENDK1	JMP	ENDK
;
; LINE 13 NO P0 RESET, RUN INSTEAD OF P0 RESET
;
NORESET	TXA							;MC 53
		SEC							;MC 55
		SBC	P0Y						;MC 58
		TAY							;MC 60
		AND	#$F0					;MC 62
		BNE	SKIP14					;MC 64/65
		LDA	(P0IND),Y				;MC 69
		STA	T1						;MC 72
SKIP14
;
; LINE 14 MAPS TO P0 RESET LINE
;
		STA	HSYNC					;MC 75 MAX
		LDA	T1						;MC 3
		STA	P0GR					;MC 6
		LDA	(P0INDCLR),Y			;MC 11
		STA	P0CLR					;MC 14
		DEX							;MC 16
		TXA							;MC 18
		SEC							;MC 20
		SBC	P0Y						;MC 23
		TAY							;MC 25
		AND	#$F0					;MC 27
		BNE	LDZERO3					;MC 29/30
		LDA	(P0IND),Y				;MC 44
		STA	T1						;MC 47
SKIP15
		LDA	(P0INDCLR),Y			;MC 52
		STA	HSYNC					;MC 55
;
; LINE 15 MAPS TO P1 SETUP LINE
;
		STA	HMOV					;MC 3
		STA	P0CLR					;MC 6
		LDA	T1						;MC 9
		STA	P0GR					;MC 12
AENTRY	DEX							;MC 14
		NOP							;MC 16
		NOP							;MC 18
		NOP							;MC 20
		NOP							;MC 22
		LDA	#10						;MC 24 SET UP LINE COUNT FOR KERNEL
		STA	COUNT					;MC 27
		STA	CLRHM					;MC 30
		JMP	KENTRY					;MC 33
;
LDZERO3	LDY	#0
		BEQ	SKIP15

ENDK
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; DRAGON KERNEL
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		LDA	DRAGSTAT			; TURN ON FLAME?
		ROL
		ROL
		ROL
		ROL
		STA	BGR
;
		LDX	WAVENO
		LDA	#$4C				; FLAME COLOR
		STA	PFCLR
;
		LDY	#0
		STY	P0GR

	IF PAL
		LDA	#$C0
	ELSE
		LDA	#$C0
	ENDIF

		STA	TIMD8

; RESET PLAYERS FOR DRAGON
		INY
		STY	P1SIZE
		STY	P0SIZE
		LDA	DRAGONHM
		STA	HSYNC
		STA	P1HM
		CLC
		ADC	#$10
		STA	P0HM
		NOP
		AND	#$0F
		TAY
DRLOOP	DEY
		BPL	DRLOOP
		STA	P1RES				; POSITION PLAYERS
		STA	P0RES
;LAST LINE BEFORE KERNEL
		STA	HSYNC
		STA	HMOV
		TAY
DELLOOP	DEY
		BPL	DELLOOP
		JMP	(DELAY)					;MC 14 JUMP TO PROPER TIME WASTER

;
; KERNEL ENTRY POINTS
; WASTE 5-11 CYCLES (INCLUDING INDIRECT JUMP)
;
W11	DC	$A9			; LDA IMMED (LDA #A9,LDA #A9,LDA $EAA5 = 8)
W10	DC	$A9			; (LDA #A9, LDA #AD, LDA $EA = 7)
W9	DC	$A9			; (LDA #A9, LDA $EAA5 = 6)
W8	DC	$A9			; (LDA #AD, LDA $EA = 5)
W7	DC	$AD			; LDA ABS (LDA $EAA5 = 4)
W6	DC	$A5			; LDA ZP (LDA $EA = 3) 
W5	DC	$EA			; NOP	(NOP= 2) 

DKERNEL
		LDA	DRAGCLR,X
		AND	ATTRACT
		STA	P1CLR
		STA	P0CLR
		NOP
		LDY	#15
KERLOOP	CPY	EYETOP
		BCS	OFF
		CPY	EYEBOT
		ROL
		ROL
		NOP
SKIP25	STA	BGR
		JMP	SKIP26
OFF		LDA	ATTRACT	;WASTE 3 MC
		LDA	#0
		BEQ	SKIP25
SKIP26	LDA	DRAGONDX
		STA	P1REF
		STA	P0REF
		NOP
		NOP
		NOP
		NOP
;
;
		LDA	(DRAGH3),Y				;MC 42
		STA	P1GR					;MC 45
		LDA	(DRAGH2),Y				;MC 50
		STA	P0GR					;MC 53
		LDA	(DRAGH1),Y				;MC 58
		TAX							;MC 60
		LDA	(DRAGH0),Y				;MC 65

		STX	P1GR					;MC 68
		STA	P0GR					;MC 71
;
		DEY							;MC 73
		BPL	KERLOOP					;MC 75/76
		INY
		STY	P1GR
		STY	P0GR
;
TIMLOOP1	LDA	TIMER
		BNE	TIMLOOP1
		STA	HSYNC
		LDA	CAVESHAD				; HOLD COLOR
		STA	PFCLR
		LDX	#$FF
		STX	PF1
		STX	PF0
		STX	PF2
		LDA	#4						; WHICH SCORE?
		CLC
		ADC	PLAYNO
		TAY
		LDA	#(SPACE & $FF)
		STA	T2						; STORE SPACE FOR ZERO SUPRESSION

		LDA	#(NUMBERS >>8 )
		STA	SIXIND0+1
		STA	SIXIND0+3
		STA	SIXIND0+5
		STA	SIXIND0+7
		STA	SIXIND0+9
		STA	SIXIND0+11
	
		STA	CLRHM

;
; WRITE SCORE INDIRECTION
;
		LDX	#11
SIXILOOP	DEX
		LDA	SCOREL0,Y
		STY	T0					; HOLD INDEX
		PHA						; SAVE SCORE BYTE
		AND	#$F0
		LSR
		ADC	#(N0 & $FF)
		CMP	#(N0 & $FF)
		BNE	SKIP89				; NON ZERO
;
		LDA	T2
		BNE	SKIP88
SKIP89	LDY	#(N0 & $FF)
		STY	T2					; MAKE T2 "ZERO"
SKIP88	STA	SIXIND0,X
		DEX
		PLA						; GET SCORE BYTE
		DEX
		AND	#$F
		ASL
		ASL
		ASL
		ADC	#(N0 & $FF)			; CARRY WAS ALWAYS CLEAR
		CMP	#(N0 & $FF)
		BNE	SKIP86
;
		LDA	T2
		BNE	SKIP85
SKIP86	BIT	FLAGS
		BVS	SKIP85
		LDY	#(N0 & $FF)
		STY	T2
SKIP85
		STA	SIXIND0,X
		DEX
		CPX	#4						; ALWAYS STOP ZPRESS
		BCS	SKIP84
		BIT	FLAGS					; DONT SSTOP ZPRESS IF VERSION SHOWN
		BVS	SKIP84
		LDY	#(N0 & $FF)
		STY	T2
SKIP84
		LDY	T0
		DEY
		DEY
		BPL	SIXILOOP
;
		STA	HSYNC
		LDY	#1
		LDX	PLAYNO				; POINT TO PLAYER UP
		LDA	SCORECLR,X
		AND	ATTRACT
		STA	P0CLR
		STA	P1CLR
		LDA	#0
		STA	P1REF
		STA	P0REF
		LDA	#3					; DO SCORE RESET
		STA	P1SIZE				; TRIPLE COPIES CLOSE
		STA	P0SIZE
		LDA	#$F0
		STA	P1RES
		STA	P0RES
		STA	P1HM
		STA	HSYNC
		STA	HMOV
		STY	P1VDEL
		STY	P0VDEL
;
; DO SIX CHAR TWICE
;
		LDY	#$07
		JSR	SIXCHAR
;
		LDX	PLAYNO
		LDY	LIVES,X
		LDX	#10					; POINT INTO INDIRECTION
		LDA	#(MAN & $FF)
LIFELOOP	DEY
		BPL	WSPACE
		LDA	#(SPACE & $FF)
WSPACE	STA	SIXIND0,X
NEXT04	DEX
		DEX
		BPL	LIFELOOP
		LDY	#4
		JSR	SIXCHAR

		STY	P1VDEL
		STY	P0VDEL


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; OVERSCAN
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OVSCAN
	IF PAL
		LDA	#$37
	ELSE
		LDA	#$23
	ENDIF

		STA	TIMD64
		LDA	#2
		STA	VBLNK
;
; WRITE CASTLE COLR
;
		LDY	WAVENO
		LDA	COLORS,Y
		AND	ATTRACT
		STA	CAVESHAD
;
; COUNT DOWN SELECT TIMER
;
		LDA	SELTIME
		BEQ	SKIP44
		DEC	SELTIME
SKIP44
;
; SKIP CX IF CASTLE SCREEN
;
		BIT	GAMESTAT
		BMI	DRAGCX
		JSR	MOVERAT
		JMP	NOCX
;
; P0/P1 CX DETECT
;
DRAGCX	LDA	FRAME
		LSR
		BCC	NOCX
		LDX	#$FF
		BIT	PPMMCX
		BMI	SKIP20
		LDX	CX
		BMI	NOCX
SKIP20	INX
		STX	CX						; CX POINTS TO HIT P1
		LDA	CX
		BNE	SKIP21					; NOT BOTTOM DOOR
; COLLISION WITH BOTTOM DOOR
		LDA	PLAYERDX				; PLAYER MOVING RIGHT?
		BMI	NOCX					; NO
		BEQ	NOCX					;NO
HIDE	LDA	#0
		STA	PLAYERY					; HIDE PLAYER
		STA	PLAYERDY
		LDA	#$80
		STA	PLYRSTAT
		LDA	#(DOOR & $FF)			; CLOSE DOOR
		STA	P1ID
		BNE	NOCX					; LEAVE
; TOP DOOR CX
SKIP21
		LDA	P1ID,X
		CMP	#(ODOOR & $FF)			; OPEN DOOR?
		BNE	SKIP22					;NO
		LDA	#1
		JSR	SCORE
		LDX	#7						;START SCORE SOUND
		JSR	STARTSND
; END WAVE HERE
		LDA GAMNUM
		LSR
		BCC NEWWAVE					; ONE PLAYER VERSION
; 2 PLAYER
		LDA	PLAYNO
		EOR	#1
		TAX
		LDY	LIVES,X					;OTHER PLAYER DEAD?
		BMI	SKIP36
		TAX							; PLAYER NUM
		STA	PLAYNO
		BNE	OUT22
NEWWAVE
SKIP36	LDY	WAVENO
		INY
		CPY	#9
		BCS	SKIP37
		STY	WAVENO
SKIP37
OUT22
		JSR	SETUPCA
		BEQ	NOCX
SKIP22
;
; SCORING VALUES
;
		LDY	#$FF
		LDA	P1ID,X
SCLOOP	INY
		CMP	BRKS,Y
		BCS	SCLOOP
SCONE	LDA	#(SPACE & $FF)
		STA	P1ID,X
		LDX	SCORESND,Y			; START SCORING SOUND
		JSR	STARTSND
		LDA	SCORES,Y
		ASL
		JSR	SCORE
NOCX
OUT05	STA	CCLR

;
; TURN OFF FLAMING IF TIMED OUT
;
		LDY	DRAGTIME
		BEQ	STOPFL
		DEC	DRAGTIME
		BNE	OUT17
; TURN OFF FALAMING BIT OF DRAGSTAT
STOPFL	LDA	#0
		STA	DRAGSTAT
		LDY	#6
		STY	EYETOP
		DEY
		STY	EYEBOT
OUT17
;
; DELTA FIREBALLS
;
		LDA	FPCTL			; DO FIREBALL SPEED WITH WAVENO E DIFF
		ASL					; SHIFT DIFFICULTY TO CARRY
		LDX	PLAYNO
		BNE	SKIP34
		ASL
SKIP34
		LDY	WAVENO
		LDA	#0
		ADC	FBSPEEDS,Y
		STA	T0
		LDX	#NUP0S-1
DEFBLOOP	LDA	P0YS,X
		CMP	#DEAD
		BEQ	NEXT05
		ADC	T0				; FIREBALL SPEED

	IF	PAL
		CMP	#$95+15
	ELSE
		CMP	#$95
	ENDIF

		BCC OKXX
		LDA	#DEAD
OKXX
SKIP18	STA	P0YS,X
NEXT05	DEX
	BPL	DEFBLOOP
;
; GAME RESET AND GAME SELECT
;
		BIT GAMESTAT		; RESET GAME ON TRIGGER IF GAME OVER
		BVS	SKIP46
		BIT	TRIG0
		BPL	NWGAME
SKIP46
		LDA	FPCTL
		LSR
		BCC	NWGAME
		LSR
		BCS	CONTVB
;SELECT SWITCH PRESSED
		LDA	SELTIME
		BNE	GMCONT
		LDA	#$1F
		STA	SELTIME
		LDA	#0
		STA	PLAYNO
		STA	GAMESTAT
		LDA	#150
		STA	PLAYERX
		STA	PLAYERY
		LDA	#$C0			; SET D6-D7 OF FLAGS
		STA	FLAGS
		INC	GAMNUM
		LDA	GAMNUM
		AND	#7				; VERSIONS 0-7 ONLY
		STA	GAMNUM
		BPL	GMCONT
NWGAME	LDA	#$81			; GAME RESET BRINGS YOU HERE
		STA	FLAGS			; TURN OFF LOGO (SET D7)
;
; START NEW GAME
;
		LDX	#ZEND-ZSTART-1
		LDA	#0
ZEROLOOP	STA	ZSTART,X
		DEX
		BPL	ZEROLOOP
		LDA	#6
		STA	LIVES
		STA	LIVES+1	
		JSR	SETUPCA			; SET UP CASTLE SCREEN
		LDA	#$40			; YOU HERE
		STA	GAMESTAT		; TURN OFF SOFT ATTRACT
		LDA	GAMNUM
		AND	#$FE
		STA	WAVENO			; SKIP WAVES ACCORDING TO GAME NUMBER
GMCONT
		LDA	#$FF			; SELECT SWITCH BRINGS YOU HERE
		STA	ATTRACT

CONTVB						; NO SWITCHES BRINGS YOU HERE

;
; DRAGON INTELLIGENCE
;
; WRITE MAX DRAGON SPEED
		LDA WAVENO
		LSR
		TAX
		INX
		INX
		STX	T2				; MAX SPEED
		LDA	FRAME
		AND	#$3
		BNE	OUT12

		LDX	PLAYERX
		LDA	PLAYERY
		BNE	SKIP35
		LDX	#80				; IF PLAYER HIDDEN, USE CENTER
SKIP35	STX	T1

		LDA	DRAGONX
		LDX	DRAGONDX
		BMI	GOLEFT
		ADC	#$19
GOLEFT
;
; DRAGON IGNORANVE WINDOW
;
		LDY	WAVENO
		CMP	T1
		BCS	NORIGHT
; DRGON < PLAYERX
		STA	T0				; STORE DRAGON POSITION
		LDA	T1
		SEC
		SBC	T0				; GET DIFFERENCE
		CMP	MINDMAX,Y		; TABLE OF IGNORANCE WIDTHS
		BCC OUT12			; IN WINDOW, DO NOTHING
GORIGHT	INX
		BEQ	GORIGHT
		BNE	WRITEDX
; DRAGON > PlAYERX
NORIGHT	SEC
		SBC	T1
		CMP	MINDMAX,Y
		BCC	OUT12
NOZERO0	DEX
		BEQ	NOZERO0
WRITEDX	TXA
		BPL	WRMAX			; CHECK ABS VALUE AGAINST DRAGMAX
		EOR	#$FF
		ADC	#0				; CARRY ALWAYS SET
WRMAX	CMP	T2
		BCS	NOWRITE
		STX	DRAGONDX
NOWRITE
OUT12
;
; DELTA DRAGON
;
		LDA	DRAGONDX
		CLC
		ADC	DRAGONX
		CMP	#129
		BCS	WRAP			;IF 0>A>130 THEN IT WRAPPED
		STA	DRAGONX
		BCC	OUT01
;COMPLEMENT DELTA
WRAP	LDX	#1
		BIT	DRAGONDX
		BMI	STOP
		LDX	#$FF
STOP						; TURN ON HOMING ONLY IF D1 SET
OUT13	STX	DRAGONDX
OUT01
;
; WRITE LO INDIRECTION FOR DRAGON
		LDA	DRAGONAN		;DRAGON ANIMATION COUNTER
		ROR
		ROR
		ROR
		AND	#$C0			;PUT ANIM NUMBER INTO D6-D7
		LDX	#$10
		BIT	DRAGSTAT
		BVC	SKIP31
		LDA	#$C0			;FLAMING GRX
		LDY	DRAGONDX
		BVS	SKIP92
SKIP31
		LDY	DRAGONDX
		BNE	SKIP92
		LDA	#$80			;STILL GRX
		BMI	SKIP93
SKIP92	BPL	SKIP93
		CLC
		ADC	#$30
		LDX	#$F0
SKIP93	STX	T0
		LDX	#7				;POINT TO INDIRECTION
		LDY	#(DRAGON0 >> 8)
INDLOOP	STY	DRAGH0,X
		DEX
		STA	DRAGH0,X
		CLC
		ADC	T0
		DEX
		BPL	INDLOOP
;
; ANIMATE DRAGON
;
		LDA	FRAME
		AND	#3
		BNE	OUT02
		DEC	DRAGONAN
		BPL	SKIP91
		LDA	#2
		STA	DRAGONAN
SKIP91
OUT02
;
; ALTER SIGNED DELTAS ACCORDING TO STICK
;
		LDA	PLRCTL				;GET STICK
		LDX	PLAYNO				;TWO PLAYER?
		BEQ	SKIP90
		ASL
		ASL
		ASL
		ASL
SKIP90
		LDX	#0
		LDY	#0
		BIT GAMESTAT			;SOFT ATTRACT ON?
		BVC	OUT07				; GO IF SO
		PHA
		LDA	SND1
		CMP	#EXSND
		PLA
		BCS	OUT07
		PHA
		LDA	PLAYERID			;EXPLODING MAN
		CMP	#(SUPINE & $FF)
		PLA
		BCS	OUT07
;
; SEE IF PLAYER WAITING OUTSIDE
; LEFT STICK STARTS GAME
;
		BIT	GAMESTAT
		BPL	OUT08
		BIT	PLYRSTAT
		BPL	OUT08
;
; WAITING FOR INPUT
;
		AND	#$F0			;GET TOP NIBBLE
		CMP	#$B0			;LEFT STICK?
		BNE	OUT07			;NO STICK
;
;LEFT STICK
		LDA	#(ODOOR & $FF)
		STA	P1ID
		LDA	#16
		STA	PLAYERY
		LDA	#$88
		STA	PLAYERX
		LDA	#0				;RESET D7 OF PLYRSTAT
		STA	PLYRSTAT
;
OUT08
		ASL					;GET RIGHT
		BCS	NR
		INX					;MARK RIGHT
NR		ASL
		BCS	NL
		DEX					;MARK LEFT
NL		ASL
		BCS	ND
		DEY					;MARK DOWN
ND		ASL
		BCS	NU
		INY					;MARK UP
NU
OUT07
;
; ALTER DELTAS ACCORDING TO X AND Y
;
		BIT	GAMESTAT
		BMI	SKIP32
		LDA	P0IND
		CMP	#(MAN4 & $FF)	;KNEELING MAN?
		BEQ	OUT20
		LDA	PLAYERY
		BNE	OUT20			;DONT CHANGE DELTA IF IN AIR
SKIP32
		TXA
		PHP
		BEQ	SKIP28
		LSR	FRAME+1
SKIP28
		TYA
		PHP
		LDX	#1
		BIT	GAMESTAT
		BMI	SKIP96
		PLP				;DONT DO Y'S IF CASTLE
		DEX
SKIP96
ALTLOOP	LDA	PLAYERDX,X
		PLP					;GET SIGN OF DELTADELTA
		BNE	SKIP94			;GO IF STICK PRESSED
;DECAY DELTA
		ORA	#0				;DELTA ZERO ?
		BEQ	ABORT0			;DONT CHANGE IF SO
		BPL	NEGDELT			;POS, DECREASE
		BMI	POSDELT			;NEG, INCREASE
SKIP94	PHP
		CPX	#0				;DOING X?
		BNE	SKIP77
		STA	REFSHAD
SKIP77	PLP
		BMI	NEGDELT
; POS DELTA, ADD
POSDELT	CLC
		ADC	#$7F/4
		BCS	OK00			;GO TO POSITIVE IS OK
		BVS	ABORT0			;DONT OVERFLOW TO NEGATIVE
		BVC	OK00
;NEGATIVE DELTA
NEGDELT	SEC
		SBC	#$7F/4
		BCC	OK00			;WRAP TO NEGATIVE OK
		BVS	ABORT0
OK00	STA	PLAYERDX,X
ABORT0	DEX
		BPL	ALTLOOP
OUT20
;
; APPLY DELTAS TO 16 BIT POSITION
; X=0 DELTA X, X=1 DELTAY
;
		LDX	#1
DELTLOOP	LDY	#0			;SPEED FOR CASTLE
		BIT	GAMESTAT		;WHICH SCREEEN?
		BPL	SKIP33
		INY		
		LDA	WAVENO
		CMP	#4
		BCC	SKIP33
		INY
SKIP33
		LDA	PLAYERDX,X		;LOAD DELTA
		ASL
		BCS	SUBDELTA
;ADD DELTA
ADDDELT	CLC
		PHA
		ADC	PLAYERLX,X
		STA	PLAYERLX,X
		BCC	NOCARRY0
		LDA	PLAYERX,X
		ADC	#0
		CMP	MAXLIMS,X		;CHECK AGAINST MAX VALUE
		BCS	NOCARRY0
		STA	PLAYERX,X
NOCARRY0	PLA
		DEY
		BPL	ADDDELT
		BMI	CONT01
;SUBTRACT DELTA
SUBDELTA	ROR				;RESTORE SIGN
		CMP	#$80			;FUCKING SPECIAL CASE
		BNE	SKIP97
		LDA	#$81
SKIP97
		EOR	#$FF			;COMPLEMENT
		CLC
		ADC	#1
		ASL					;*2
		STA	T0
SUBLOOP	LDA	PLAYERLX,X
		SEC
		SBC	T0
		STA	PLAYERLX,X
		BCS	CARRY0
		LDA	PLAYERX,X
		SBC	#0
		BCC	CARRY0			;BOTTOM LIMIT
		CMP	MINLIMS,X
		BCC	CARRY0
		STA	PLAYERX,X
CARRY0
		DEY
		BPL	SUBLOOP

CONT01	DEX
		BPL	DELTLOOP
;
; SET UP PLAYER 0
;
NEWBOARD	LDX	NEWCNT
		BEQ	OUT09
		LDA	RAND
		AND	#$7
		CLC
		ADC	WAVENO
		TAY
		LDA	TREATABL,Y
		STA	P1ID,X
;DRIVE XPOS
		LDA	RANDH
		AND	#$F
		TAY
		LDA	RANDH
		CPY	#$A					;RIGHT MAX
		BCC	INRANGE
		AND	#$F7				;ZERO D3
		ADC	#1
INRANGE	AND	#$EF				;DISALLOW ODD HMOVE VALUES
		STA	P1HMS,X
		DEC	NEWCNT
;SET UP LOWER DOOR
DODOORS	LDA	#(DOOR & $FF)
		STA	P1ID
		LDA	#$88
		STA	P1HMS
;
OUT09
;
		JSR	SOUND
;
; SET UP SEA COLOR
;
		LDA FRAME
		AND	#$7
		BNE	OUT100
		LDA	RAND
		AND	#$7

	IF PAL
		ORA	#$B0
	ELSE
		ORA	#$80
	ENDIF

		STA	SEA
OUT100
;
; ANIMATE FIREBALLS
;
		BIT	GAMESTAT
		BPL	OUT15
		LDA	FRAME
		AND	#$3				;FASTEST RATE
		BNE	OUT15
		LDX	#NUP0S-1
ALOOP1	LDA	P0YS,X
		CMP	#DEAD
		BEQ	NEXT01
		LDA	P0ID,X
;MOVING FIREBALL
		EOR	#$10
SKIP00	STA	P0ID,X
NEXT01	DEX
		BPL	ALOOP1
OUT14
;
; ANIMATE TREASURES
;
		LDX	#NUP1S-1
ALOOP0	LDA	P1ID,X
		CMP	#(TREAS & $FF)
		BCS	NEXT02
;ANIMATED TREASURES
ATR		LDY	#6
ALOOP2	DEY
		CMP	ATABLE,Y
		BNE	ALOOP2
		TYA
		EOR	#1
		TAY
		LDA	ATABLE,Y
		STA	P1ID,X
NEXT02	DEX
		BPL	ALOOP0
OUT15
;
OVOUT	BIT	TIMOUT				;WAIT FOR OVERSCAN TIMEOUT
		BPL	OVOUT
		JMP	SCRNTOP				; NEW FRAME !

;
;
; SUBROUTINES
;
; SETUP DRAGON SCREEN
;
SETUPDR	LDA	#$C0
		STA	GAMESTAT
		LDA	#0
		STA	BKCLR
		STA	PLAYERDY
		STA	PLAYERY
		STA	DRAGONX
		LDA	#1
		STA	DRAGONDX
		LDA	#$80
		STA	PLYRSTAT
		RTS
;
; START SOUND, HIGHTEST NUBER GET PRIOITIY
; X HAS SOUND NUMBER
; Z FLAG RESET ON RETURN
STARTSND
		LDA	SNDNOS,X
		CMP	SND1
		BCC	OUT25
		STA	SND1
		LDA	SNDTIMS,X
		STA	SND1TIME
OUT25	RTS
;
; SCORING VALUES
;
SCORES	DC		$82
		DC		$81
		DC		$30
		DC		$08

; TOP OF DRAGONS CAVE GRAPHICS
CAVE0	DC	$00,$60,$FF,$FF
CAVE1	DC	$00,$DB,$FF,$FF
CAVE2	DC	$00,$B6,$FF,$FF
;
; CASTLE COLORS
;
	IF PAL
COLORS	DC	$0A,$7A,$2A,$3A,$7A,$BA,$5A,$AA,$8A
	ELSE
COLORS	DC	$0A,$BA,$1A,$DA,$BA,$7A,$CA,$6A,$5A
	ENDIF

;FIREBALL SPEEDS
FBSPEEDS	DC	2,2,2,2,2,3,3,3,4


;SKIP TO PAGE BOUNDRY
	ORG	$1B00

; DRAGON 3
DRAGON8
	DC	$2E, $6C, $F9, $FF, $BF, $3F, $7F, $FF
	DC	$F7, $E0, $E0, $60, $30, $19, $1F, $0E
DRAGON9
	DC	$00, $F0, $FC, $FF, $FF, $FF, $FF, $8F
	DC	$07, $03, $81, $4F, $C3, $9E, $02, $3E
DRAGON10
	DC	$70, $61, $F9, $F1, $FF, $FF, $FC, $F8
	DC	$F1, $E0, $80, $00, $00, $02, $00, $10
DRAGON11
	DC	$00, $20, $90, $F8, $FF, $EF, $F8, $70
	DC	$E0, $00, $00, $00, $40, $00, $00, $00

; DRAGON 2
DRAGON4
	DC	$38, $70, $F8, $7F, $3F, $3F, $FF, $FF
	DC	$F3, $E0, $60, $30, $11, $1F, $0E, $00
DRAGON5
	DC	$00, $78, $FE, $FF, $FF, $FF, $FF, $CF
	DC	$87, $C3, $47, $C1, $8F, $02, $1E, $00
DRAGON6
	DC	$EC, $D9, $F9, $F1, $FF, $FF, $FC, $F8
	DC	$F1, $E0, $80, $00, $00, $00, $00, $00
DRAGON7
	DC	$00, $20, $90, $F8, $FF, $EF, $F9, $70
	DC	$E0, $00, $04, $08, $10, $40, $00, $00

; DRAGON 1
DRAGON0
	DC	$7E, $30, $71, $7B, $7F, $3F, $7F, $FF
	DC	$F7, $E0, $E0, $60, $30, $19, $1F, $0E
DRAGON1
	DC	$00, $F0, $FC, $FF, $FF, $FF, $FF, $8F
	DC	$07, $03, $87, $41, $CF, $82, $1E, $21
DRAGON2
	DC	$38, $61, $E1, $F1, $FF, $FF, $F8, $F0
	DC	$E1, $C0, $80, $00, $00, $00, $00, $00
DRAGON3
	DC	$00, $20, $90, $F8, $FF, $EF, $F9, $70
	DC	$E1, $02, $04, $04, $08, $00, $00, $00
;FLAMING DRAGON
DRAGON12
	DC	$7E, $30, $71, $7B, $7F, $3F, $7F, $FF
	DC	$F7, $E0, $E0, $60, $30, $19, $1F, $0E
DRAGON13
	DC	$00, $F0, $FC, $FF, $FF, $FF, $FF, $8F
	DC	$07, $03, $87, $41, $CF, $82, $1E, $21
DRAGON14
	DC	$70, $6E, $F8, $FC, $FF, $FF, $FB, $F1
	DC	$EB, $CB, $8F, $06, $03, $03, $07, $0E
DRAGON15
	DC	$00, $00, $00, $00, $00, $80, $C0, $C0
	DC	$F0, $E0, $E8, $F0, $E0, $30, $10, $18



MAN0
	DC	$00, $C2, $42, $4E, $58, $50, $70, $30
	DC	$30, $70, $78, $3C, $38, $60, $60, $60
MAN1
	DC	$00, $60, $20, $24, $3C, $38, $30, $30
	DC	$30, $30, $70, $38, $30, $60, $60, $60
MAN2
	DC	$00, $18, $28, $18, $38, $70, $70, $30
	DC	$30, $30, $F4, $B4, $38, $60, $60, $60
MAN4
	DC	$00, $7C, $60, $3C, $0E, $0E, $7E, $04
	DC	$0C, $0C, $00, $00, $00, $00, $00, $00
FB0
	DC	$00, $10, $5A, $1A, $48, $42, $1A, $3C
	DC	$6E, $FE, $3F, $6E, $3A, $3C, $18, $00
FB1
	DC	$52, $08, $40, $12, $02, $48, $00, $98
	DC	$3D, $7A, $5E, $FE, $74, $19, $24, $08

SUPINE
	DC	$00, $00, $00, $00, $C2, $4E, $48, $7C
	DC	$3E, $06, $06, $07, $3F, $03, $06, $06
SUPINE1
	DC	$00, $00, $00, $30, $31, $99, $FF, $38
	DC	$38, $78, $4C, $4F, $61, $20, $00, $00
SUPINE2
	DC	$00, $00, $20, $3B, $0A, $0A, $0E, $9C
	DC	$B8, $F0, $FC, $E4, $C4, $C0, $00, $00
HFB0
	DC	$00, $00, $04, $AA, $1F, $4A, $14, $00
	DC	$00, $00, $00, $00, $00, $00, $00
HFB1
	DC	$00
	DC	$00, $08, $5E, $07, $2F, $8A, $00, $00
	DC	$00, $00, $00, $00, $00, $00
	
;
; SIX CHAR ROUTINE
;
SIXCHAR
SCKRNL	STY	T1					;MC 64
		LDA	(SIXIND5),Y			;MC 69
		STA	P1GR				;MC 72
		STA	HSYNC				;MC 75 (76)
		LDA	(SIXIND4),Y			;MC 5
		STA	P0GR				;MC 8
		LDA	(SIXIND3),Y			;MC 13
		STA	P1GR				;MC 16
		LDA	(SIXIND2),Y			;MC 21
		STA	T2					;MC 24
		LDA	(SIXIND1),Y			;MC 29
		TAX						;MC 31
		LDA	(SIXIND0),Y			;MC 36
		TAY						;MC 38
		LDA	T2					;MC 41
		STA	P0GR				;MC 44
		STX	P1GR				;MC 47
		STY	P0GR				;MC 50
		STY	P1GR				;MC 53
		LDY	T1					;MC 56
		DEY						;MC 58
		BPL	SCKRNL				;MC 60/61
		INY						; MAKE Y=0
		STY	P1GR
		STY	P0GR
		STY	P1GR
		STY	P0GR
WASTE12	RTS
;
;SCORE
; A HAS BYTE CARRY CLEAR=ADD TO LO, CARRY SET=ADD TO MID SCORE
;
SCORE	SED
		LDX	PLAYNO				;PLAYER UP
		BCC	SKIP78				;ADD TO LO BYTE
		INX						;POINT TO MID BYTE
		INX
SKIP78	CLC
SCORLOOP	ADC	SCOREL0,X
		STA	SCOREL0,X
		BCC	OK01
		INX
		INX
		LDA	#1
		CPX	#6
		BCC	SCORLOOP
OK01	CLD
		RTS

;
; TREASURE SCORING DIVISIONS
	
BRKS	DC	(BRK1 & $FF),(BRK2 & $FF),(BRK3 & $FF),$FF		


;PAD TO NEXT PAGE BOUNDRY
	DC	$00, $00, $00

ATREAS
DIAMD0
	DC	$00, $10, $28, $28, $54, $54, $BA, $54
	DC	$28, $10
DIAMD1
	DC	$00, $10, $28, $28, $54, $54
	DC	$BA, $54, $28, $10
CROWN0
	DC	$00, $7E, $7E, $5A
	DC	$5A, $00, $81, $00, $24, $00
CROWN1
	DC	$00, $7E
	DC	$7E, $5A, $5A, $00, $00, $42, $18, $00
BRK1
HARPL0
	DC	$00, $7E, $95, $95, $95, $95, $56, $56
	DC	$42, $81
HARPL1
	DC	$00, $7E, $A9, $A9, $A9, $A9
	DC	$6A, $6A, $42, $81
TREAS
CHEST	
	DC	$00, $7E, $7E, $7E
	DC	$66, $FF, $54, $28, $00, $00
BRK2
HELMET	
	DC	$00, $42
	DC	$66, $66, $42, $E7, $BD, $BD, $99, $42
CHEST1
	DC	$00, $7C, $38, $10, $38, $10, $38, $6C
	DC	$AA, $AA
BRK3
LAMP	
	DC	$00, $3C, $18, $FE, $BF, $AD
	DC	$E1, $00, $00, $00
URN
	DC	$00, $7C, $38, $10
	DC	$38, $10, $38, $7C, $FE, $FE
JUG	
	DC	$00, $3C
	DC	$7E, $FF, $BF, $DF, $7E, $3C, $3C, $7E
DOOR
	DC	$00, $FF, $FE, $FF, $DF, $FF, $FE, $FF
	DC	$FF, $7E
ODOOR
	DC	$00, $8F, $8E, $8F, $8B, $8F
	DC	$8E, $8F, $C7, $7E
SPACE
SPACE10
	DC	$00, $00, $00, $00
	DC	$00, $00, $00, $00, $00, $00
NUMBERS
N0	
	DC	$38, $6C
	DC	$C6, $86, $86, $C6, $6C, $38
N1	
	DC	$08, $1C
	DC	$18, $18, $18, $18, $38, $10
N2	
	DC	$FC, $FE
	DC	$62, $30, $18, $8C, $CC, $78
N3	
	DC	$3C, $6E
	DC	$66, $C6, $1C, $0E, $66, $3C
N4	
	DC	$08, $1C
	DC	$0C, $FE, $CC, $6C, $3C, $1C
N5	
	DC	$FC, $8E
	DC	$0E, $EE, $BC, $80, $FC, $FC
N6	
	DC	$7C, $C6
	DC	$C6, $FC, $C0, $C0, $FC, $78
N7	
	DC	$E0, $E0
	DC	$70, $30, $18, $8C, $FE, $7E
N8	
	DC	$3C, $66
	DC	$CE, $7C, $64, $C6, $7C, $38
N9
	DC	$78, $CC
	DC	$0E, $7E, $CE, $CE, $CC, $78
MAN	
	DC	$00, $A0
	DC	$40, $E0, $40
	
DELAYS
	DC	W8 & $FF
	DC	W8 & $FF
	DC	W8 & $FF
	DC	W7 & $FF
	DC	W7 & $FF
	DC	W7 & $FF
	DC	W6 & $FF
	DC	W6 & $FF
	DC	W11 & $FF
	DC	W11 & $FF
	DC	W10 & $FF
	DC	W10 & $FF
	DC	W10 & $FF
	DC	W9 & $FF
	DC	W9 & $FF
	DC	W9 & $FF


;PAD TO NEXT PAGE BOUNDRY
	DC	$00, $00, $00, $00, $00

;
; COLORS FOR 16 LINE GRAPHICS
MAN0C
	DC	$00, $C8, $C8, $C8, $C8, $C8, $44, $00
	DC	$44, $44, $44, $44, $44, $18, $18, $12
MAN1C
	DC	$00, $C8, $C8, $C8, $C8, $C8, $44, $00
	DC	$44, $44, $44, $44, $44, $18, $18, $12
MAN2C
	DC	$00, $C8, $C8, $C8, $C8, $C8, $44, $00
	DC	$44, $44, $44, $44, $44, $18, $18, $12
MAN4C
	DC	$00, $C8, $C8, $C8, $44, $44, $44, $44
	DC	$18, $18, $00, $00
SCORESND 
	DC	$05, $06, $07, $08
FB0C
	DC	$00, $44, $44, $F6, $44, $44, $44, $44
	DC	$44, $44, $44, $44, $44, $44, $44, $42
FB1C
	DC	$00, $44, $44, $F6, $44, $44, $44, $44
	DC	$44, $44, $44, $44, $44, $44, $44, $42
SUPINEC
	DC	$00, $C8, $C8, $C8, $C8, $C8, $C8, $C8
	DC	$44, $00, $44, $44, $44, $44, $18, $12
SUPINE1C
	DC	$00, $12, $18, $18, $18, $44, $44, $44
	DC	$44, $C8, $C8, $C8, $C8, $18, $18, $12
SUPINE2C
	DC	$00, $C8, $C8, $C8, $C8, $C8, $44, $00
	DC	$44, $44, $44, $44, $18, $18, $18, $12
SHIELD
	DC	$00, $38, $44, $6C, $D6, $FE, $C6, $82
	DC	$82, $00

;
; RUNTIME SOUND	
;
SOUND	
		LDA	GAMESTAT
		BEQ	TURNOFF			; DISALLOW SOUND DURING ATTRACT
		LDA	SND1TIME
		BNE	SKIP43
		STA	SND1			; TUN OFF SOUND ID
		BEQ	TURNOFF
SKIP43	DEC	SND1TIME
; A HAS SOUND COUNTDOWN TIMER
		LDX	SND1
		LDY	CTLS,X
		STY	SNDC1
		LDY	FREQS,X
		DEX
		BPL	NOT0
;FIRE SOUND
; TIMER/8 INTO VOLUME
		LSR	
		LSR	
		LSR	
		JMP	TURNOFF
NOT0	DEX
;BONUS SOUND
		BMI	TURNOFF
NOT1	DEX
;JUMP SOUND
		BMI	TURNOFF
NOT2	DEX
		BPL	NOT3
;EXPLOSION
; RANDOM D4 INTO FREQ, 8 INTO VOL
		LDA	RAND
		ORA	#$10
		TAY
		LDA	#$8
		BNE	TURNOFF
NOT3
;DEATH SOUND
; 32-TIMER/2 INTO FREQ, TIMER/4 INTO VOL
		LSR
		EOR	#$1F
		TAY
		EOR	#$1F
		LSR
		STA	CAVESHAD
TURNOFF	STY	SNDF1
		STA	SNDV1
OUT24
;
; RUNNING SOUND
;
		LDY	#0
		LDA	PLAYERDX
		ORA	PLAYERDY
		BEQ	OUT42
		LDA	FRAME
		AND	#7
		BNE	OUT42
;HERE IF MOVING & EVERY EIGHTH FRAME
		BIT	GAMESTAT
		BVC	OUT42			;SOFT ATTRACT ON
		BMI	SKIP42
		LDA	PLAYERY
		BNE	OUT43
SKIP42
		;SET FREQ & VOLUME OF STEP
		LDA	#$1C
		STA	SNDF0
		LDY	#$A
OUT42	STY	SNDV0
		STY	SNDC0
OUT43
		RTS


;PAD TO PAGE BOUNDRY
	DC	$00, $00, $00

;
; TREASURE COLORS
;
TREASCLR

DIAMD0C
	DC	$00, $FF, $FF, $FF, $FF, $88, $88, $88
	DC	$FF, $FF
DIAMD1C
	DC	$00, $FA, $FA, $FA, $FA, $88
	DC	$FF, $88, $FA, $FA 
CROWN0C	
	DC	$00, $28, $44, $28
	DC	$28, $28, $28, $00, $78, $00
CROWN1C	
	DC	$00, $28
	DC	$44, $28, $28, $28, $28, $00, $78, $00
HARPL0C
	DC	$00, $D8, $88, $88, $88, $88, $88, $88
	DC	$88, $FF
HARPL1C
	DC	$00, $D8, $88, $88, $88, $88
	DC	$88, $88, $88, $FF
CHESTC	
	DC	$00, $14, $14, $14
	DC	$14, $12, $FC, $FC, $00, $00
HELMETC	
	DC	$00, $88
	DC	$88, $88, $18, $18, $18, $18, $18, $18
CHEST1C
	DC	$00, $16, $44, $16, $44, $16, $16, $16
	DC	$FF, $FF
LAMPC	
	DC	$00, $88, $14, $14, $14, $14
	DC	$14, $00, $00, $00
URNC	
	DC	$44, $44, $14, $44
	DC	$14, $44, $44, $44, $44, $14
JUGC	
	DC	$00, $18
	DC	$88, $18, $18, $18, $18, $88, $88, $18
DOORC
	DC	$00, $12, $12, $16, $12, $12, $12, $16
	DC	$12, $12
ODOORC	
	DC	$00, $12, $12, $16, $12, $12
	DC	$12, $16, $12, $12
MAXLIMS	
	DC	$94, $87
MINLIMS
	DC	$01, $10
SCORECLR
	DC	$00, $44
LINES	
	DC	$00, $10, $1F, $2E, $3D, $4C
	DC	$5B, $6A, $79, $88
OFFSETS	
	DC	$1C, $05, $19, $07


DRAGCLR
	DC	$D6, $18, $86, $64, $46, $18, $F6, $02
	DC	$0F
MINDMAX	
	DC	$50, $40, $30, $28, $20, $18, $18
	DC	$18, $18, $20
ATABLE	
	DC	$28, $32, $14, $1E, $00
	DC	$0A
CASTLE0
	DC	$70, $70, $F0, $D0, $D0, $D0, $F0
	DC	$F0, $50, $00, $00
CASTLE1	
	DC	$00, $00, $00, $00
	DC	$00, $00, $80, $80, $80, $00, $00
CTLS	
	DC	$08
	DC	$05, $01, $04, $0C
FREQS	
	DC	$1A, $0A, $15, $0A
	DC	$10
;
; SOUND TO USE
;
SNDNOS	
	DC	FIRES, BONSND, JUMPS, EXSND, DEATHS, BONSND, BONSND, BONSND, BONSND
;
; DURATION OF SOUNDS
SNDTIMS
	DC	$1F, $1F, $0F, $0F, $3F, $3F, $2F, $1F, $0F
; TREASURES TABLE
; USED FOR WEIGHTED RAMDOM SELECTION
TREATABL
	DC	URN & $FF
	DC	LAMP & $FF
	DC	JUG & $FF
	DC	CHEST1 & $FF
	DC	JUG & $FF
	DC	HELMET & $FF
	DC	CHEST1 & $FF
	DC	URN & $FF
	DC	LAMP & $FF
	DC	CHEST & $FF
	DC	HELMET & $FF
	DC	HARPL0 & $FF
	DC	LAMP & $FF
	DC	DIAMD1 & $FF
	DC	CROWN0 & $FF
	DC	JUG & $FF

	DC $F7		; TO MATCH RELEASE EPROM
VECTORS
	DC.W	START
	DC.W	START

END

