If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

Notes:Dragon's Lair (NES)

From The Cutting Room Floor
Jump to navigation Jump to search

This page contains notes for the game Dragon's Lair (NES).

Combined Source

The Japanese and European versions contain different portions of their source code, oddly enough, but they can still be compiled into one huge file which covers almost all of program banks 30-39. Regardless, there are some differences between the two versions, and it appears the Japanese one was done earlier; see the "diff" file in the next section.

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

B3B_END
	IF	B3B_END>$BFFF
		PRINTF "**** BANK $3B too long !! ****"
	ENDIF


; End of bank $3A/$3B
; --- -- ---- -------

;======================================

; Start of bank $39
; ----- -- ---- ---

	ORG	$139,$A000

;--------------------------------------
; Sprite attribute tables
; ------ --------- ------

SPR3_ATAB_L
	DL	A_B0
	DL	A_B1
	DL	A_B2
	DL	A_B3
	DL	A_B4
	DL	A_B5
	DL	A_B6
	DL	A_B7
	DL	A_B8
	DL	A_B9
	DL	A_B10
	DL	A_B11
	DL	A_B12
	DL	A_B13
	DL	A_B14
	DL	A_B15
	DL	A_B16
	DL	A_B17
	DL	A_B18
	DL	A_B19
	DL	A_B20
	DL	A_B21
	DL	A_B22
	DL	A_B23
	DL	A_B24
	DL	A_B25
	DL	A_B26
	DL	A_B27
	DL	A_B28
	DL	A_B29
	DL	A_B30
	DL	A_B31
	DL	A_B32
	DL	A_B33

SPR3_ATAB_H
	DH	A_B0
	DH	A_B1
	DH	A_B2
	DH	A_B3
	DH	A_B4
	DH	A_B5
	DH	A_B6
	DH	A_B7
	DH	A_B8
	DH	A_B9
	DH	A_B10
	DH	A_B11
	DH	A_B12
	DH	A_B13
	DH	A_B14
	DH	A_B15
	DH	A_B16
	DH	A_B17
	DH	A_B18
	DH	A_B19
	DH	A_B20
	DH	A_B21
	DH	A_B22
	DH	A_B23
	DH	A_B24
	DH	A_B25
	DH	A_B26
	DH	A_B27
	DH	A_B28
	DH	A_B29
	DH	A_B30
	DH	A_B31
	DH	A_B32
	DH	A_B33

A_B0	DS	34,2
	DS	22,1
	DS	8,0
A_B1	DS	31,2
	DS	24,1
	DS	9,0
A_B2	DS	34,2
	DS	25,1
	DS	5,0
A_B3	DS	21,2
	DS	16,1
	DS	7,2
	DS	8,1
	DS	12,0
A_B4	DS	9,2
	DS	12,1
	DS	1,0
	DS	18,2
	DS	24,1
A_B5	DS	28,2
	DS	31,1
	DS	5,0
A_B6	DS	31,2
	DS	21,1
	DS	12,0
A_B7	DS	28,2
	DS	23,1
	DS	13,0
A_B8	DS	9,2
	DS	15,1
	DS	1,0
	DS	24,2
	DS	15,1
A_B9	DS	37,2
	DS	20,1
	DS	7,0
A_B10	DS	14,2
	DS	10,1
	DS	40,0
A_B11	DS	25,0
	DS	11,2
	DS	25,1
	DS	3,0
A_B12	DS	15,2
	DS	36,1
	DS	13,0
A_B13	DS	9,2
	DS	17,1
	DS	1,0
	DS	16,2
	DS	21,1
A_B14	DS	31,2
	DS	31,1
	DS	2,0
A_B15	DS	9,2
	DS	13,1
	DS	1,0
	DS	18,2
	DS	23,1
A_B16	DS	29,2
	DS	32,1
	DS	3,0
A_B17	DS	12,2
	DS	17,1
	DS	1,0
	DS	8,2
	DS	22,1
	DS	4,0
A_B18	DS	13,0
	DS	6,1
	DS	45,0
A_B19	DS	18,0
	DS	2,1
	DS	34,3
	DS	10,1
A_B20	DS	52,3
	DS	12,1
A_B21	DS	64,0
A_B22	DS	46,1
	DS	18,0
A_B23	DS	11,0
	DS	20,1
	DS	10,2
	DS	23,3
A_B24	DS	25,0
	DS	23,3
	DS	16,0
A_B26	DS	58,0
	DS	6,1
A_B33
A_B27        	DS	64,1
A_B28	DS	15,3
	DS	17,0
	DS	32,1
A_B29	DS	11,0
	DS	20,2
	DS	33,3
A_B30	DS	18,3
	DS	46,0
A_B31
A_B25	DS	64,3
A_B32         	DS	32,2
	DS	23,1
	DS	9,0

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

; Gold bonus screen
; ---- ----- ------

; IN
; --
; A = 0-No bonus , 1-Normal bonus , 2-Big bonus

G_BONUS1
	TAX
	BNE	!1	;No bonus
	RTS
!1
	LDA	#3	;Preload with start adding to
	DEX		;10's digit.
	BEQ	!2
	LDA	#2	;Change to adding to 100's 
!2			;digit.
	STA	ZPAGE_BYTE9	;Store which digit to start
			;adding to.

	LDA	PL_GOLD
	ORA	PL_GOLD+1	;Don't do gold bonus if no
	ORA	PL_GOLD+2	;gold.
	CMP	#246
	BNE	!3
	RTS
!3

	LDA	#0
	STA	N_COLAP_CHR
	STA	N_BONUS_FLAG

	JSR	SET_S0

	LDA	#128	;Stop music
	JSR	START_TUNE

	JSR	DISABLE_NC

	LDA	#GR_1ST+24      	;Background bank for chrs
	STA	N_BG_BANK1
	LDA	#GR_1ST+24+2
	STA	N_BG_BANK2

	LDA	#PAL_1
	JSR	CLS

	LDA	#21	;'GOLD BONUS'
	JSR	DRAW_SCR39

	JSR	D_GB	;Draw gold bars

	JSR	ENABLE_CN

	LDA	#$FF
	STA	CDF_A1+1

	JSR	SPR_CLEAR    	;All sprite off screen
	LDA	#39                   	;Put on split CHR
	STA	$200	;Y
 	LDA	#64	
	STA	$201	;Character
	LDA	#BIT5
	STA	$202	;Ctr
	LDA	#16
	STA	$203	;X
	LDA	#1
	STA	N_DMA_FLAG
	WAIT_FRAME

	JSR	ENABLE_SPR

	LDX	#0
	JSR	FADE_IN

	LDX	#20	;Wait before starting
	JSR	M_WAIT_FRAME

	LDY	#>SCR_START+(32*16)+10-2
	LDX	#<SCR_START+(32*16)+10-2
	LDA	PL_GOLD+2	;1's of gold
	JSR	GB_R
	LDY	#>SCR_START+(32*20)+10-2
	LDX	#<SCR_START+(32*20)+10-2
	LDA	PL_GOLD+1	;10's of gold
	JSR	GB_R
	LDY	#>SCR_START+(32*24)+10-2
	LDX	#<SCR_START+(32*24)+10-2
	LDA	PL_GOLD	;100's of gold
	JSR	GB_R


	LDX	#80	;Wait before exiting
	JSR	M_WAIT_FRAME

	LDX	#0
	JSR	FADE_OUT

	RTS

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

; Draw gold bonus bars

D_GB
	LDA	#13	;X1,X10,X100
	JSR	PR_STR_TAB
	LDA	#14
	JSR	PR_STR_TAB
	LDA	#15
	JSR	PR_STR_TAB

	LDY	#>SCR_START+(32*16)+10
	LDX	#<SCR_START+(32*16)+10
	LDA	PL_GOLD+2	;1's of gold
	JSR	GB_D
	LDY	#>SCR_START+(32*20)+10
	LDX	#<SCR_START+(32*20)+10
	LDA	PL_GOLD+1	;10's of gold
	JSR	GB_D
	LDY	#>SCR_START+(32*24)+10
	LDX	#<SCR_START+(32*24)+10
	LDA	PL_GOLD	;100's of gold
	JSR	GB_D

	RTS

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

; Draw a highlighted bar

; IN
; --
; X - LSB Screen address of bar left
; Y - MSB Screen address of bar left
; A = Number in bar

GB_D
	PHA
	LDA	#0
	STA	ZPAGE_BYTE11
	PLA

	SEC
	SBC	#246
	STA	ZPAGE_BYTE10    	;Number highlighted
	BEQ	!1

	LDA	#PAL_1
	STA	PR_ATTR

; Draw highlighted ones

!2	JSR	D_G2X2
	INC	ZPAGE_BYTE11	;Number drawn
	DEC	ZPAGE_BYTE10
	BNE	!2

	
; Draw unhighlighted ones

!1
	LDA	#PAL_3
	STA	PR_ATTR

!4	LDA	ZPAGE_BYTE11
	CMP	#10
	BNE	!3
	RTS
!3	JSR	D_G2X2
	INC	ZPAGE_BYTE11
	JMP	!4


; Draw a gold 2x2
; ---- - ---- ---

D_G2X2
	STX	ZPAGE_WORD1
  	STY	ZPAGE_WORD1+1

; Set attribute
	LDA	PR_ATTR
	JSR	SET_SCR_ATTR	;Set attribute for quad

	LDX	ZPAGE_WORD1
	LDY	ZPAGE_WORD1+1
; Draw top line
	STY	VDP_VRAM_PTR
	STX	VDP_VRAM_PTR

	LDA	#$69
	STA	VDP_VRAM_DATA
	LDA	#$6A
	STA	VDP_VRAM_DATA

; Downline and draw second line
	TXA
	CLC
	ADC	#32
	TAX
	BCC	!1
	INY	    
!1	STY	VDP_VRAM_PTR
	STX	VDP_VRAM_PTR

	LDA	#$6B
	STA	VDP_VRAM_DATA
	LDA	#$6C
	STA	VDP_VRAM_DATA

	LDX	ZPAGE_WORD1
  	LDY	ZPAGE_WORD1+1
	INX
	INX
	
	RTS

;------------------
; Clear a bar

; IN
; --
; X - LSB Screen address of bar left
; Y - MSB Screen address of bar left
; A - Number in bar to start with

GB_R

	SEC
	SBC	#246
	STA	ZPAGE_BYTE10
	STY	ZPAGE_WORD11+1
	STX	ZPAGE_WORD11


!3	LDA	ZPAGE_BYTE10
	BEQ	!5
	ASL	A	;Icons 2 chrs wide
!1	LDY	ZPAGE_WORD11+1	;Add offset to screen address
	ADC	ZPAGE_WORD11
	TAX

	JSR	CON_SCR_ATTR	;Calc attribute address
	STX	N_BONUS_AADR	;Set up NMI to draw attribute
	STY	N_BONUS_AADR+1

	STA	N_BONUS_ATTR	;PAL_3 in rlevant bits
	EOR	#$FF
	STA	N_BONUS_AMASK	;Hole for attribute
	LDA	#1
	STA	N_BONUS_FLAG
	STA	N_BG_FLAG

	LDA	#24
	STA	ZPAGE_BYTE11

	LDA	#1	;Add to score
	LDY	ZPAGE_BYTE9
	JSR	SC_ADD

	LDY	#18        	;Make sound FX
	JSR	FX_TRIGGER

!4	JSR	PANEL_SCAN
	LDA	#1                    
	STA	N_BG_FLAG             
	WAIT_FRAME
	DEC	ZPAGE_BYTE11
	BNE	!4

	DEC	ZPAGE_BYTE10
	BNE	!3

!5
	DEC	ZPAGE_BYTE9

	RTS

;--------------------------------------
; Setup NMI vars to change score digits
; ----- --- ---- -- ------ ----- ------

; Scan the scores,lives and gold and if any need changing then
; setup one digit to be changed.

PANEL_SCAN
	LDA	N_P_FLAG
	BEQ	!1	;Still waiting for update
	RTS
!1

;   Scan current player score,gold or lives

	LDX	#PL_VARS_LEN-1
PS_LP	LDA	PL_SC,X
	CMP	PL_DATA_SO,X	;Search for any differences
	BNE	PS_FND
	DEX
	BPL	PS_LP

;   Scan dormat players score

	LDX	#5-1	;Just do score
PS_LP2	LDA	PL_SC+P_VARS_LEN,X
	CMP	PL2_DATA_SO,X	;Search for any differences
	BNE	PS_FND1
	DEX
	BPL	PS_LP2

	RTS

PS_FND1	STA	PL2_DATA_SO,X	;Set onscreen for pl 2 score
	SEC
	SBC	#246-$0A
	STA	N_P_CHR	;Set character to draw

	LDA	PL_NUM
	BNE	PS_SNMI	;This is player 1's score(Lft)
	JMP	PS_RGT	;This is player 2's score(Rgt)


PS_FND
	STA	PL_DATA_SO,X	;Set onscreen var
	SEC
	SBC	#246-$0A
	STA	N_P_CHR	;Set character to draw

	LDA	PL_NUM
	BEQ	PS_SNMI	;This is player 1's score(Lft)
			;This is player 2's score(Rgt)
PS_RGT	TXA
	CMP	#5	;If Gold or lives alternate
	BCS	!1	;with whoose go it is
	CLC
	ADC	#PL_VARS_LEN	;If score swap their sides
	TAX
!1

; Setup vars to get NMI to draw a score digit.

PS_SNMI
	LDA	P_ATAB,X
	STA	N_P_SADR
	LDA	#>SCR_START
	STA	N_P_SADR+1

	LDA	#1
	STA	N_P_FLAG

	RTS


; Screen address offset table

P_ATAB	DB	96+96+9	;Player 1 score
	DB	96+96+10
	DB	96+96+11
	DB	96+96+12
	DB	96+96+13
	DB	96+64+24	;         Gold
	DB	96+64+25
	DB	96+64+26
	DB	96+64+5	;         Lives
	DB	96+64+6
	DB	96+96+18	;Player 2 score
	DB	96+96+19
	DB	96+96+20
	DB	96+96+21
	DB	96+96+22


;--------------------------------------
; Throw a dagger control routines
; ----- - ------ ------- --------

; Initialization, this routine starts a dagger if there is one free

; This routine was modifyed to cope with axes and fireballs

; IN
; --
; A=Direction (BIT6=0 - Facing right  1 - Facing left)


D_INIT
	STA	ZPAGE_BYTE2

	LDX	WEAPON_TYPE
	BEQ	DI_3ON	;3 daggers allowed
	DEX	
	BEQ	DI_2ON	;2 axes
	JMP	DI_1ON	;1 fireball

DI_3ON	LDX	#2*D_VAR_LEN
	LDA	D_VARS+D_X_OFF+(2*D_VAR_LEN)
	BEQ	DI_FREE
DI_2ON	LDX	#1*D_VAR_LEN
	LDA	D_VARS+D_X_OFF+(1*D_VAR_LEN)
	BEQ	DI_FREE
DI_1ON	LDX	#0*D_VAR_LEN
	LDA	D_VARS+D_X_OFF+(0*D_VAR_LEN)
	BEQ	DI_FREE

	RTS

; X holds offset of block to init.

DI_FREE
	LDA	WEAPON_TYPE
	STA	D_VARS+D_TYP_OFF,X ;Store type in vars

	LDA	#0
	STA	D_VARS+D_ANI_OFF,X ;Start at first anim

; Setup Y velocity

	LDA	#<(-800)
	STA	D_VARS+D_YSP_OFF,X
	LDA	#>(-800)
	STA	D_VARS+D_YSP_OFF+1,X

; Setup X velocitys and X,Y's

	LDA	ZPAGE_BYTE2
	AND	#SDC_LEFT
	BEQ	DI_GOING_RGT

;  Going left


;    Set velocity going left

	LDA	#<0+(0-D_XSPEED)
	STA	D_VARS+D_XSP_OFF,X
	LDA	#>0+(0-D_XSPEED)
	STA	D_VARS+D_XSP_OFF+1,X

	LDA	ZPAGE_BYTE2
	AND	#SDC_DOWN    
	BNE	DI_CRAWLING_L

;    Throw while standing up facing left

	LDA	DIRK_X_ONSCR
	STA	D_VARS+D_X_OFF,X
	LDA	DIRK_Y
	SEC
	SBC	#52
	STA	D_VARS+D_Y_OFF,X
	JMP	DI_XVXY_END


;    Throw while crawling left

DI_CRAWLING_L

	LDA	DIRK_X_ONSCR
	SEC
	SBC	#18
	BCS	!1
	RTS		; Error, Off edge
!1	STA	D_VARS+D_X_OFF,X
	LDA	DIRK_Y
	SEC
	SBC	#31
	STA	D_VARS+D_Y_OFF,X
	JMP	DI_XVXY_END


;  Going right

DI_GOING_RGT

;    Setup X velocity for going right

	LDA	#<D_XSPEED
	STA	D_VARS+D_XSP_OFF,X
	LDA	#>D_XSPEED
	STA	D_VARS+D_XSP_OFF+1,X

	LDA	ZPAGE_BYTE2
	AND	#SDC_DOWN    
	BNE	DI_CRAWLING_R

;    Throw while standing up facing right

	LDA	DIRK_X_ONSCR
	CLC		;Setup dagger starting X
	ADC	#24
	BCS	!1
	CMP	#230
	BCC	!2
!1	RTS		; Error, Off edge
!2	STA	D_VARS+D_X_OFF,X
	LDA	DIRK_Y
	SEC
	SBC	#52
	STA	D_VARS+D_Y_OFF,X
	JMP	DI_XVXY_END

;    Throw while crawling right

DI_CRAWLING_R
	LDA	DIRK_X_ONSCR
	CLC
	ADC	#38
	BCC	!1
	RTS		; Error, Off edge
!1	STA	D_VARS+D_X_OFF,X
	LDA	DIRK_Y
	SEC
	SBC	#31
	STA	D_VARS+D_Y_OFF,X


DI_XVXY_END
	LDA	D_E_FRAC	;Subtract energy from Dirk
	CLC		;for each weapon thrown
	ADC	#16
	STA	D_E_FRAC
	BCC	!1
	LDA	#-1
	JSR	DIRK_NRG_ADD
!1

	LDY	#1	;Preload with normal dagger FX
	LDX	WEAPON_TYPE
	DEX
	BNE	!2
	LDY	#15	;Axe throw FX
!2	JMP	FX_TRIGGER	;and 'RTS'

;------------------
; Process all currently running daggers

D_PROCESS
	LDX	#2*D_VAR_LEN	;Offset to current dagger vars
DP_LOOP
	LDA	D_VARS+D_X_OFF,X
	BEQ16	DP_END	;This dagger isn't on

	LDA	#D_GRAVITY
	CLC
	ADC	D_VARS+D_YSP_OFF,X
	STA	D_VARS+D_YSP_OFF,X	;Add gravity to
	BCC	!1  	;speed
	INC	D_VARS+D_YSP_OFF+1,X
!1

	CLC
	ADC	D_VARS+D_YF_OFF,X
	STA	D_VARS+D_YF_OFF,X	;Add Y speed to Yf
	LDA	D_VARS+D_YSP_OFF+1,X	;and Y
	ADC	D_VARS+D_Y_OFF,X
	STA	D_VARS+D_Y_OFF,X

	LDA	D_VARS+D_YSP_OFF+1,X
	BMI	BP_STILL_GOING
	CMP	#7
	BCC	BP_STILL_GOING


; Stop this dagger

BP_STOP
	LDA	#0 	;the end
	STA	D_VARS+D_X_OFF,X	;If so,stop dagger
	JMP	DP_END
BP_STILL_GOING

	LDA	D_VARS+D_XSP_OFF,X
	CLC	   	;Add X speed to
	ADC	D_VARS+D_XF_OFF,X	;dagger X
	STA	D_VARS+D_XF_OFF,X
	LDA	D_VARS+D_XSP_OFF+1,X
	ADC	D_VARS+D_X_OFF,X
	CMP	#255-(D_XSPEED/256)
	BCS	BP_STOP   	;Gone off edge of
	STA	D_VARS+D_X_OFF,X	;screen

	LDA	D_VARS+D_TYP_OFF,X
	BEQ16	DP_DAG_SP


; Draw an axe and fireball

DP_AF_SP
	LDA	D_VARS+D_X_OFF,X
	STA	ZPAGE_WORD5
	LDA	D_VARS+D_Y_OFF,X
	STA	ZPAGE_WORD6	;Setup X and Y's
	LDA	#0
	STA	ZPAGE_WORD5+1
	STA	ZPAGE_WORD6+1

	LDA	D_VARS+D_TYP_OFF,X
	CMP	#1
	BEQ	DP_AXE_SP     	;Axe specific draw


;  Specific draw for fireball

	LDA	D_VARS+D_ANI_OFF,X
	CMP	#3
	BCC	DP_FB_AOK
	LDA	#0
DP_FB_AOK	TAY	              	;Animate the fireball
	CLC
	ADC	#1
	STA	D_VARS+D_ANI_OFF,X

	LDA	D_VARS+D_XSP_OFF+1,X
	BMI	DP_FB_LEFT
 
	SET16	ZPAGE_WORD2,DP_FB_LDEF
 	LDA	#BIT6
	JMP	DP_FB_DEF_END
DP_FB_LEFT
	SET16	ZPAGE_WORD2,DP_FB_RDEF
	LDA	#0
DP_FB_DEF_END
	STX	ZPAGE_BYTE10	;Preserve X
	TAX		;Setup X for SPR_DRAW

	TYA
	ASL	A
	STA	ZPAGE_BYTE1
	ASL	A
	CLC		;6 bytes per animation
	ADC	ZPAGE_BYTE1	;entry.
	ADD16_A	ZPAGE_WORD2

	LDA	#128+1        	;Window number

	JSR	SPR3_DRAW_39	;Draw sprite

	LDX	ZPAGE_BYTE10	;Restore X

	JMP	DP_END


; Specific draw for axe

DP_AXE_SP
	LDA	D_VARS+D_ANI_OFF,X
	CMP	#4
	BCC	DP_AXE_AOK
	LDA	#0
DP_AXE_AOK	TAY		;Animate the dagger
	CLC
	ADC	#1
	STA	D_VARS+D_ANI_OFF,X

	LDA	D_VARS+D_XSP_OFF+1,X
	BMI	DP_AXE_LEFT
 
	SET16	ZPAGE_WORD2,DP_AXE_LDEF
 	LDA	#0
	JMP	DP_AXE_DEF_END
DP_AXE_LEFT
	SET16	ZPAGE_WORD2,DP_AXE_RDEF
	LDA	#BIT6
DP_AXE_DEF_END
	STX	ZPAGE_BYTE10	;Preserve X
	TAX		;Setup X for SPR_DRAW

	TYA
	ASL	A
	STA	ZPAGE_BYTE1
	ASL	A
	CLC		;6 bytes per animation
	ADC	ZPAGE_BYTE1	;entry.
	ADD16_A	ZPAGE_WORD2

	LDA	#128+1	;Window number

	JSR	SPR3_DRAW_39	;Draw sprite

	LDX	ZPAGE_BYTE10	;Restore X

	JMP	DP_END


; Draw a dagger

DP_DAG_SP
	LDY	#0
	LDA	D_VARS+D_Y_OFF,X
	STA	(SD_PAGE_PTR),Y	;Setup Y of dagger sprites
	LDY	#4
	STA	(SD_PAGE_PTR),Y

	LDA	D_VARS+D_X_OFF,X
	DEY		; Y=3
	STA	(SD_PAGE_PTR),Y	;Setup X of dagger sprites
	CLC
	ADC	#8
	LDY	#7
	STA	(SD_PAGE_PTR),Y

	LDA	D_VARS+D_XSP_OFF+1,X
	BMI	DP_CHR_LEFT

;   Setup dagger characters for going right

	LDA	#$14+64
	LDY	#1
	STA	(SD_PAGE_PTR),Y	;Characters
	LDA	#$13+64
	LDY	#5
	STA	(SD_PAGE_PTR),Y
	LDA	#0+SPR_CTR_X_FLIP
	JMP	DP_CHR_SEND

;   Setup dagger characters for going left

DP_CHR_LEFT
	LDA	#$13+64
	LDY	#1
	STA	(SD_PAGE_PTR),Y	;Characters
	LDA	#$14+64
	LDY	#5
	STA	(SD_PAGE_PTR),Y
	LDA	#0
DP_CHR_SEND

	LDY	#2
	STA	(SD_PAGE_PTR),Y	;Attribute
	LDY	#6
	STA	(SD_PAGE_PTR),Y

	LDA	SD_PAGE_PTR	;Move over 2 sprites
	CLC
	ADC	#8
	BNE	!1
	LDA	#4
!1	STA	SD_PAGE_PTR

DP_END
	TXA
	SEC		;Move to next daggers vars
	SBC	#D_VAR_LEN
	TAX
	BCS16	DP_LOOP

	JMP	SET_NORM_BANK     	;and 'RTS'

;--------------------------------------
; Cameo screens
; ----- -------

CAMEO
	LDA	#128	;Stop tune playing
	JSR	START_TUNE

	LDX	SCR_NUM        	;Setup BG bank
	LDA	CAM_B_TAB,X
	BEQ	!1
	STA	N_BG_BANK1
	CLC
	ADC	#2
	STA	N_BG_BANK2

	WAIT_FRAME
	LDA	VDP_CTR_VAR0	;Force screen 1
	AND	#NOT-HORI_SWAP	;to get rid of the
	STA	VDP_CTR_VAR0	;dash.
	STA	VDP_CTR_REG0

	LDA	#-1
	LDX	SCR_NUM
	DEX
	BEQ	!2        	;Don't scroll entrance cameo
	LDA	#-6       
!2	STA	N_SC_X
	JSR	DISABLE_NC        	;Turn off NMI and CHR's

	LDA	#PAL_1
	JSR	CLS      	;Clear screen

	LDX	SCR_NUM 	;Draw screen
	LDA	CAM_S_TAB,X
	JSR	S7_DS

	LDX	SCR_NUM           	;Draw attributes
	LDA	CAM_A_TABL,X
	STA	ZPAGE_WORD1
	LDA	CAM_A_TABH,X
	STA	ZPAGE_WORD1+1
	SET_VRAM_PTR 27C8
	LDX	#56
	JSR	SI_SET_ATTR2	

	LDA	#0        	;Leave dash on other screen
	STA	N_SPLIT

	JSR	ENABLE_CN

	LDX	SCR_NUM
	LDA	CAM_F_TAB,X
	PHA
	TAX
	JSR	FADE_IN

	LDX	#100	;Wait for 100 frames
	JSR	M_WAIT_FRAME

	PLA
	TAX
	JSR	FADE_OUT

!1
 	RTS

CAM_B_TAB	DB	0	; 0 - Drawbridge
	DB	GR_1ST+38	; 1 - Entrance hall
	DB	GR_1ST+42              	; 2 - Mines
	DB	GR_1ST+46              	; 3 - Reaper
	DB	0             	; 4 -
	DB	GR_1ST+50              	; 5 - Singe
	DB	0                	; 6 - Elevator
	DB	0                     	; 7 - Treasury
	DB	0                     	; 8 - Dungeon


CAM_S_TAB	DB	0	; 0 - Drawbridge
	DB	31	; 1 - Entrance hall
	DB	32                     	; 2 - Mines
	DB	33                    	; 3 - Reaper
	DB	0	; 4 - 
	DB	35              	; 5 - Singe
	DB	0                	; 6 - Elevator
	DB	0                     	; 7 - Treasury
	DB	0                     	; 8 - Dungeon

CAM_F_TAB	DB	0	; 0 - Drawbridge
	DB	75	; 1 - Entrance hall
	DB	80                     	; 2 - Mines
	DB	85                    	; 3 - Reaper
	DB	0	; 4 -
	DB	90              	; 5 - Singe


	DB	0                	; 6 - Elevator
	DB	0                     	; 7 - Treasury
	DB	0                     	; 8 - Dungeon

CAM_A_TABH	DH	0	; 0 - Drawbridge
	DH	AM_C102_0	; 1 - Entrance hall
	DH	AM_C106_0	; 2 - Mines
	DH	AM_C110_0	; 3 - Reaper
	DH	0	; 4 -
	DH	AM_C114_0    	; 5 - Singe
	DH	0    	; 6 - Elevator
	DH	0    	; 7 - Treasury
	DH	0                     	; 8 - Dungeon

CAM_A_TABL	DL	0	; 0 - Drawbridge
	DL	AM_C102_0	; 1 - Entrance hall
	DL	AM_C106_0	; 2 - Mines
	DL	AM_C110_0	; 3 - Reaper
	DL	0	; 4 -
	DL	AM_C114_0    	; 5 - Singe
	DL	0    	; 6 - Elevator
	DL	0    	; 7 - Treasury
	DL	0                     	; 8 - Dungeon



;	C102_0 ATTRIBUTE MAP ( 8 X 6 )

AM_C102_0

	DB	$65,$95,$65,$15,$45,$95,$65,$95
	DB	$EE,$BB,$EE,$33,$CC,$BB,$EE,$BB
	DB	$AA,$22,$00,$00,$00,$00,$88,$AA
	DB	$AA,$22,$00,$00,$00,$00,$88,$AA
	DB	$AA,$22,$00,$00,$00,$00,$88,$AA
	DB	$AA,$AA,$00,$00,$00,$00,$88,$AA
	DB	$AA,$AA,$00,$00,$00,$00,$88,$AA




;	C106_0 ATTRIBUTE MAP ( 8 X 6 )

AM_C106_0

	DB	$55,$B5,$A5,$A5,$A5,$A5,$F5,$11
	DB	$9D,$AA,$AA,$AA,$AA,$AA,$AE,$11
	DB	$99,$AA,$55,$55,$55,$99,$AA,$11
	DB	$99,$AA,$55,$95,$55,$99,$AA,$11
	DB	$99,$AA,$05,$09,$05,$89,$AA,$11
	DB	$99,$AA,$00,$00,$00,$88,$AA,$11
	DB	$99,$AA,$00,$00,$00,$88,$AA,$11

;	C110_0 ATTRIBUTE MAP ( 8 X 6 )

AM_C110_0

	DB	$55,$55,$55,$55,$55,$55,$55,$11
	DB	$55,$55,$05,$05,$05,$05,$45,$01
	DB	$15,$00,$00,$00,$00,$00,$44,$00
	DB	$00,$00,$C0,$FF,$33,$00,$44,$00
	DB	$00,$00,$FC,$FF,$FF,$00,$44,$20
	DB	$00,$C0,$FF,$00,$CC,$30,$A6,$22
	DB	$0F,$0F,$0F,$00,$0C,$0F,$0A,$02


;	C114_0 ATTRIBUTE MAP ( 8 X 6 )

AM_C114_0

	DB	$AA,$EF,$77,$55,$FF,$FF,$FF,$33
	DB	$BA,$EE,$77,$55,$FF,$FF,$FF,$33
	DB	$FF,$FA,$86,$55,$FF,$FF,$FF,$33
	DB	$FF,$BF,$AA,$65,$5F,$5F,$5F,$13
	DB	$FF,$FF,$FF,$76,$55,$55,$55,$11
	DB	$FF,$FF,$FF,$FF,$FF,$FF,$FF,$33
	DB	$FF,$FF,$FF,$FF,$FF,$FF,$FF,$33

;--------------------------------------
; Lizard king
; ------ ----

LIZ_ON_TIME	EQU	100


LIZARD_PROCESS

	LDA	LIZARD_FLAG
	BEQ16	LP_NOT_ON	;Wait before bringing
	DEC	LIZARD_FLAG	;another on.
	BNE	LP_NOT_END


; Lizard has ended
	LDA	FADE_PALETTE
	CLC
	ADC	#4
	LDX	#4
	LDY	#4
	JSR	CHANGE_PAL	;Set sprite palette

	LDA	SPR3_WIN2_R	;Reset back to normal
	STA	SPR3_WIN2              	;sprite bank

	LDY	#FLAG_OFF+1
	LDA	(LIZ_FCD_VARS),Y
	ORA	#(FCD_SP1_BIT/256)	;Set death bit
	STA	(LIZ_FCD_VARS),Y

	RTS

LP_NOT_END
	LDA	LIZARD_FLAG
	CMP	#LIZ_ON_TIME-20
	BEQ	LP_EXPLODE	;Start lizard on explosions
	RTS

;  Start lizard appear explosions

LP_EXPLODE
	LDA	#18
	LDX	#7
	LDY	#1
	JSR	CHANGE_PAL

; Start lizard king.

	SET16	ZPAGE_WORD2,FCD_LZ
	LDA	#8
	STA	ZPAGE_BYTE1	;Hit count
	LDA	#ST_LZ
	STA	ZPAGE_BYTE2	;Sprite type
	JSR	SI_39	;Try to start FCD sprite.
	BNE	LP_CANT_START
	LDA	ZPAGE_WORD1
	STA	LIZ_FCD_VARS	;Store address of FCD vars 
	LDA	ZPAGE_WORD1+1
	STA	LIZ_FCD_VARS+1
	LDA	DIRK_Y
	SEC
	SBC	#22
	JSR	SR_39	;Start Lizard after waiting

	JSR	LP_ST_SMOKE
	BNE	LP_CANT_START	;Can't start smoke
	LDA	DIRK_Y	;Start bottom smoke
	SEC
	SBC	#44
	JSR	SR_39

	JSR	LP_ST_SMOKE
	BNE	LP_CANT_START	;Can't start smoke
	LDA	DIRK_Y	;Start top smoke
	SEC
	SBC	#72
	JSR	SR_39


LP_CANT_START

; Change to correct sprite bank in window 2
	LDA	#23
	STA	SPR3_WIN2

; Start lizard king fanfare

	LDY	#31
	JSR	FX_TRIGGER
	LDY	#32
	JSR	FX_TRIGGER
	LDY	#33
	JMP	FX_TRIGGER  	;and 'RTS'


; Lizard king is not on so check if he can be brought on

LP_NOT_ON

; Don't bring on if no gold
	LDA	PL_GOLD
	ORA	PL_GOLD+1	;Don't do gold bonus if no
	ORA	PL_GOLD+2	;gold.
	CMP	#246
	BNE	!1
	RTS
!1

; Check if allowed on at the current scroll position
	LDX	SCR_NUM
	LDA	LIZ_SCR_TABL,X
	STA	ZPAGE_WORD1	;Setup WORD1 as pointer to
	LDA	LIZ_SCR_TABH,X	;ON/OFF data.
	STA	ZPAGE_WORD1+1

LP_FLOOP
	LDY	#0
	LDA	(ZPAGE_WORD1),Y
	STA	ZPAGE_WORD2
	INY		;WORD2 is ON x
	LDA	(ZPAGE_WORD1),Y
	STA	ZPAGE_WORD2+1
	ORA	ZPAGE_WORD2
	CMP	#$FF
	BNE	LP_!END
	RTS

LP_!END
	CMP16	ZPAGE_WORD2,SCROLL_XOFFSET
	BCS16	LP_FLOOP_NEXT

	LDY	#2
	LDA	(ZPAGE_WORD1),Y
	STA	ZPAGE_WORD2
	INY		;WORD2 is OFF x
	LDA	(ZPAGE_WORD1),Y
	STA	ZPAGE_WORD2+1

	CMP16	ZPAGE_WORD2,SCROLL_XOFFSET
	BCC	LP_FLOOP_NEXT

; In range so bring lizard king on.

	JSR	RND_A1
	CMP	#251
	BCS	LP_BO_S1
	RTS
LP_BO_S1	JSR	RND_A1
	CMP  	#18
	BCC	LP_BO_S2
	RTS
LP_BO_S2

;  Bring lizard king on.
	LDA	#LIZ_ON_TIME
	STA	LIZARD_FLAG

;    Kill all other sprites

	LDX	#MAX_FCD_UNITS
	SET16	ZPAGE_WORD1,SPR0
	LDY	#FLAG_OFF+1
LP_LP	LDA	(ZPAGE_WORD1),Y
	ORA	#FCD_DEATH_BIT/256
	STA	(ZPAGE_WORD1),Y
	ADD16_8	ZPAGE_WORD1,FCD_VARS_LEN
	DEX
	BNE	LP_LP

	RTS


LP_FLOOP_NEXT
	ADD16_8 ZPAGE_WORD1,4	;Move to next 
	JMP	LP_FLOOP


LP_ST_SMOKE
	SET16	ZPAGE_WORD2,FCD_SMOKE
	LDA	#200
	STA	ZPAGE_BYTE1	;Hit count
	LDA	#ST_NULL
	STA	ZPAGE_BYTE2	;Sprite type
	JMP	SI_39	;Start lizard appear smoke
			;and 'RTS'

LIZ_SCR_TABL	DL	LIZ_DUMMY
	DL	LIZ_SCR1
	DL	LIZ_SCR2
	DL	LIZ_DUMMY
	DL	LIZ_DUMMY
	DL	LIZ_SCR5
	DL	LIZ_DUMMY
	DL	LIZ_DUMMY
	DL	LIZ_DUMMY

LIZ_SCR_TABH	DH	LIZ_DUMMY
	DH	LIZ_SCR1
	DH	LIZ_SCR2
	DH	LIZ_DUMMY
	DH	LIZ_DUMMY
	DH	LIZ_SCR5
	DH	LIZ_DUMMY
	DH	LIZ_DUMMY
	DH	LIZ_DUMMY


; Entrance hall
; Singe
LIZ_SCR5
LIZ_SCR1	DW	0,980
	DW	$FFFF

; Mines
LIZ_SCR2	DW	0,500
	DW	1400,1500
	DW	$FFFF

LIZ_DUMMY	DW	$FFFF


B39_END
	IF	B39_END>$BFFF
		PRINTF "**** BANK $39 too long !! ****"
	ENDIF


; End of bank $39
; --- -- ---- ---
;======================================
; Start of bank $38
; ----- -- ---- ---

	ORG	$138,$8000

;--------------------------------------
; Include all the BG animation data.
; ------- --- --- -- --------- -----

	INCLUDE "BG_ANIM.SRC"	;ACB's and DCB's
	INCLUDE "BG_MAP1.SRC"	;Bg anims map data

;--------------------------------------
; Table of pointers to palettes.
; ----- -- -------- -- ---------

SPAL_PTR_TAB
	DW	PAL_BLACK	;0 - Mines (Bright)
	DW	MI_P1	;1
	DW	MI_P2	;2
	DW	MI_P3	;3
	DW	S_PAL_S2	;4
	DW	PAL_BLACK	;5 - Mines (Dark)
	DW	MI_P1	;6
	DW	MI_P2	;7
	DW	MI_P4	;8
	DW	S_PAL_S2	;9
	DW	DIRK_FLASH_PAL	;10
	DW	PAL_BLACK	;11 - Elevator
	DW	ELEV_PAL0	;12
	DW	ELEV_PAL1	;13
	DW	ELEV_PAL2	;14
	DW	S_PAL_S6 	;15
	DW	MI_P5	;16 - 2 entry candle lit mines
	DW	MI_P6	;17 - 2 entry bright mines
	DW	S_PAL_S2A	;18 - 1 entry for lizard king
	DW	S_PAL_S2B	;19 - 1 entry for normal
	DW	PAL_BLACK	;20 - Grim reaper
	DW	R00_PAL	;21
	DW	R01_PAL	;22 
	DW	R02_PAL	;23 
	DW	S_PAL_S2	;24
	DW	FLASH_PAL	;25 - 4 ent Lighting flash
	DW	PAL_BLACK	;26 - Drawbridge
	DW	DB_PAL1	;27
	DW	DB_PAL2	;28
	DW	DB_PAL3	;29
	DW	S_PAL_S0	;30
	DW	PAL_BLACK	;31 - Name entry,
	DW	AT_PAL1	;32 - high score table
	DW	AT_PAL2	;33 - and title screen
	DW	AT_PAL3	;34
	DW	AT_SPR_PAL	;35
	DW	G1_PAL0	;36 - 'Start' glow
	DW	G1_PAL1	;37
	DW	G1_PAL2	;38
	DW	G1_PAL3	;39
	DW	G1_PAL4	;40
	DW	PAL_BLACK	;41
	DW	SG_PAL1	;42 - Singe's Lair
	DW	SG_PAL2	;43
	DW	SG_PAL3	;44
	DW	S_PAL_S0	;45
	DW	SG_PAL4	;46 - Dragon on
	DW	PAL_BLACK	;47 - Entrance Hall
	DW	PAL_BLACK	;48
	DW	EH2_PAL	;49 
	DW	EH2_PAL	;50 
	DW	S_PAL_S2	;51
	DW	PAL_BLACK	;52 - Treasury
	DW	T_PAL0	;53
	DW	T_PAL1	;54
	DW	T_PAL2	;55
	DW	S_PAL_S7	;56
	DW	SG_PAL	;57 - Singe bits palette
	DW	PAL_BLACK	;58 - No fade set of palettes
	DW	PAL_BLACK	;59   for use with mines drak
	DW	PAL_BLACK	;60   section and grim reaper
	DW	PAL_BLACK	;61   end.
	DW	S_PAL_S2	;62
	DW	SG_PAL5	;63 - Singe 1 ent green
        	DW	SG_FLASH	;64 - Flash Reaper/Singe white
	DW	R03_PAL	;65 - Reaper 1 ent blue
	DW	PAL_BLACK	;66 - End screen palettes
	DW	ES_PAL1	;67
	DW	ES_PAL2	;68
	DW	ES_PAL3	;69
	DW	S_PAL_S0	;70
	DW	S0_SNK	;71 - Green for snake s0
            	DW	EH3_PAL	;72 - End screen (Entrance hall)
	DW	EH3_F	;73 - Flash snake
	DW	EH3_R	;74 - Restore snake
	DW	PAL_BLACK	;75 - Entrance hall cameo
	DW	PAL_BLACK 	;76 
	DW	CAM_PAL3 	;77 
	DW	CAM_PAL3 	;78 
	DW	S_PAL_S0	;79
	DW	PAL_BLACK	;80 - Mines cameo
	DW	PAL_BLACK 	;81 
	DW	MIN_PAL3 	;82 
	DW	MIN_PAL3 	;83 
	DW	S_PAL_S0	;84
	DW	PAL_BLACK	;85
	DW	PAL_BLACK 	;86 
	DW	REAP_PAL3 	;87 
	DW	REAP_PAL3 	;88 
	DW	S_PAL_S0	;89
	DW	PAL_BLACK	;90
	DW	PAL_BLACK	;91
	DW	SING_PAL3	;92
	DW	SING_PAL3	;93
	DW	S_PAL_S0	;94
	DW	PAL_BLACK	;95
	DW	EH3_R	;96 - Restore snake
	DW	EH3_R	;97
	DW	EH3_R	;98
	DW	S_PAL_S0	;99
	DW	PAL_BLACK	;100 - Credit screens
	DW	R00_PAL	;101
	DW	R01_PAL	;102
	DW	CS_PAL	;103
	DW	S_PAL_S2	;104


; BG palettes

FLASH_PAL	DB	WHITE3,WHITE2,WHITE1,WHITE0
	DB	WHITE3,WHITE2,WHITE1,WHITE0
	DB	WHITE3,WHITE2,WHITE1,WHITE0
	DB	WHITE3,WHITE2,WHITE1,WHITE0


PAL_BLACK	DB	BLACK,BLACK,BLACK,BLACK
	DB	BLACK,BLACK,BLACK,BLACK
	DB	BLACK,BLACK,BLACK,BLACK
	DB	BLACK,BLACK,BLACK,BLACK

; Sprite palettes

; Screen 0 - Drawbridge

S_PAL_S0	DB	BLACK,WHITE2,WHITE1,WHITE0
	DB	BLACK,ORANGE2,ORANGE3,YELLOW1
	DB	BLACK,WHITE2,YELLOW2,WHITE0
S0_SNK	DB	BLACK,GREEN3,GREEN2,MID_GREEN1


S_PAL_S2	DB	BLACK,WHITE2,WHITE1,WHITE0
	DB	BLACK,ORANGE2,ORANGE3,YELLOW1
	DB	BLACK,WHITE2,YELLOW2,WHITE0
S_PAL_S2B	DB	BLACK,ORANGE3,ORANGE2,ORANGE1


; Screen 6 - Elevator

S_PAL_S6	DB	BLACK,WHITE2,WHITE1,WHITE0
	DB	BLACK,ORANGE2,ORANGE3,YELLOW1
	DB	BLACK,WHITE2,YELLOW2,WHITE0
	DB	BLACK,ORANGE3,ORANGE2,ORANGE1


S_PAL_S7	DB	BLACK,WHITE2,WHITE1,WHITE0
	DB	BLACK,ORANGE2,ORANGE3,YELLOW1
	DB	BLACK,WHITE2,YELLOW2,WHITE0
S_PAL_S2A	DB	BLACK,WHITE2,LT_GREEN1,LT_GREEN2 ;Lizard king palette


DIRK_FLASH_PAL	DB	BLACK,WHITE2,WHITE1,WHITE0
	DB	BLACK,WHITE2,WHITE2,WHITE2
	DB	BLACK,WHITE2,WHITE2,WHITE2
;	DB	BLACK,WHITE1,MID_GREEN1,MID_GREEN0

SG_FLASH	DB	BLACK,WHITE3,WHITE3,WHITE3

; Attract mode sprite palette

AT_SPR_PAL	DB	BLACK,BLUE2,BLUE2,BLUE1
	DB	BLACK,ORANGE2,ORANGE1,ORANGE0
	DB	BLACK,GREEN3,GREEN2,GREEN1
	DB	BLACK,ORANGE3,ORANGE2,ORANGE1

; Sprite palette for Singe's bits

SG_PAL	DB	BLACK,WHITE3,PURPLE2,PURPLE1

MI_F	DB	BLACK

;======================================


B38_END
	IF	B38_END>$9FFF
		PRINTF "**** BANK $38 too long !! ****"
	ENDIF

; End of bank $38
; --- -- ---- ---
;--------------------------------------
; Start of bank $37
; ----- -- ---- ---

	ORG	$137,$A000

; Include screen maps
; ------- ------ ----

	INCLUDE "GR_SMAP2.SRC"

B37_END
	IF	B37_END>$BFFF
		PRINTF "**** BANK $37 too long !! ****"
	ENDIF


; End of bank $37
; --- -- ---- ---
;--------------------------------------
; Start of bank $36
; ----- -- ---- ---

	ORG	$136,$8000

; Include the ZZ_ and BM_ data for SPR_DRAW
; ------- --- --- --- --- ---- --- --------

	INCLUDE "GR_MAP.SRC"	
	INCLUDE "GR_MAP2.SRC"
	INCLUDE "GR_MAP3.SRC"


; ZZ_ and BM_ maps for test sprite

BM_TEST	DB	%11000000
	DB	%11000000

ZZ_TEST	DB	30,30,30,30



B36_END
	IF	B36_END>$9FFF
		PRINTF "**** BANK $36 too long !! ****"
	ENDIF


; End of bank $36
; --- -- ---- ---

;--------------------------------------
; Start of bank $34+35
; ----- -- ---- ------

	ORG	$134,$8000

	INCBIN	"SCRBLK.INC"

B35_END
	IF	B35_END>$BFFF
		PRINTF "**** BANK $34+$35 too long !! ****"
	ENDIF


; End of bank $34+$35
; --- -- ---- -------
;--------------------------------------
; Start of bank $32
; ----- -- ---- ---

	ORG	$132,$8000

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

	INCBIN  "ATTR.INC"

;--------------------------------------
; Collapsing floor collision tables.(X,Screen address)
; ---------- ----- --------- ------  ----------------

;  Screen 0 - Drawbridge

SCR0_COLAP_TAB
	DW	104,9024+13
	DW	112,9024+14
	DW	120,9024+15

	DW	$FFFF


;  Screen 3 - Grim reaper

SCR3_COLAP_TAB	
     
; Gr #1
	DW	88,9024+11
	DW	96,9024+12
	DW	104,9024+13
	DW	136,9024+17
	DW	144,9024+18
	DW	152,9024+19
	DW	184,9024+23
	DW	192,9024+24
	DW	200,9024+25
	DW	232,9024+29
	DW	240,9024+30
	DW	248,9024+31

; Gr #3
	DW	512+152,8896+19
	DW	512+160,8896+20  
	DW	512+168,8896+21

; Gr #6
	DW	1280+208,9984+26
	DW	1280+216,9984+27
	DW	1280+224,9984+28
	DW	1280+232,9984+29

; Gr #7
	DW	1536+8,8960+1
	DW	1536+16,8960+2
	DW	1536+24,8960+3
	DW	1536+32,8960+4
	DW	1536+40,8960+5
	DW	1536+72,8960+9
	DW	1536+80,8960+10
	DW	1536+88,8960+11
	DW	1536+120,9024+15
	DW	1536+128,9024+16

; Gr #8
	DW	1792+120,10048+15
	DW	1792+128,10048+16
	DW	1792+136,10048+17
	DW	1792+168,10112+21
	DW	1792+176,10112+22
	DW	1792+184,10112+23
	DW	1792+192,10112+24
	DW	1792+200,10112+25
	DW	1792+232,10112+29
	DW	1792+240,10112+30

; Gr #9
	DW	2048+16,9088+2
	DW	2048+24,9088+3
	DW	2048+32,9088+4
	DW	2048+40,9088+5
	DW	2048+192,9024+24
	DW	2048+200,9024+25
	DW	2048+208,9024+26
	DW	2048+216,9024+27
	DW	2048+248,9024+31

; Gr #10
	DW	2304+0,10048+0
	DW	2304+8,10048+1 
	DW	2304+16,10048+2
	DW	2304+48,10048+6
	DW	2304+56,10048+7
	DW	2304+64,10048+8
	DW	2304+72,10048+9
	DW	2304+104,10048+13
	DW	2304+112,10048+14

; Gr #11
	DW	2560+32,9024+4
	DW	2560+40,9024+5
	DW	2560+48,9024+6
	DW	2560+80,9024+10
	DW	2560+88,9024+11
	DW	2560+200,9024+25
	DW	2560+232,9024+29
	DW	2560+240,9024+30

; Gr

	DW	$FFFF

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

B32_END
	IF	B32_END>$BFFF
		PRINTF "**** BANK $32 too long !! ****"
	ENDIF


; End of bank $32
; --- -- ---- ---
;--------------------------------------
; Start of bank $30/31
; ----- -- ---- ------

	ORG	$130,$8000

MUSIC_BASE	INCBIN	"MUSIC.INC"

FX_INIT	EQU	MUSIC_BASE+0
FX_TRIGGER1	EQU	MUSIC_BASE+3
FX_PROCESS	EQU	MUSIC_BASE+6
MUSIC_TRIGGER	EQU	MUSIC_BASE+9
MUSIC_PROCESS	EQU	MUSIC_BASE+12



B30_END
	IF	B30_END>$BFFF
		PRINTF "**** BANK $30 too long !! ****"
	ENDIF


; End of bank $30/$31
; --- -- ---- -------
;======================================
	IF	EPROM=99
	SEND COMPUTER1
	ENDIF
	IF	EPROM=98
	SEND MSDOS,"C:\PDSMAST\DLAIRFCS\EPROM\DL.PDS"
             	ENDIF

; -------------------------------------------------------------
; Print memory usage messages
; ----- ------ ----- --------

	PRINTF "Bank $3F has %d bytes free",$FFFF-B3F_END
	PRINTF "Bank $3C/D has %d bytes free",$C000-B3D_END
	PRINTF "Bank $3A/B has %d bytes free",$C000-B3B_END
	PRINTF "Bank $39 has %d bytes free",$C000-B39_END
	PRINTF "Bank $38 has %d bytes free",$A000-B38_END
	PRINTF "Bank $37 has %d bytes free",$C000-B37_END
	PRINTF "Bank $36 has %d bytes free",$A000-B36_END
	PRINTF "Bank $34 has %d bytes free",$C000-B35_END
	PRINTF "Bank $32/3 has %d bytes free",$C000-B32_END
	PRINTF "Bank $30/1 has %d bytes free",$C000-B30_END

	END


; End of file: DLAIR.ASM
; --- -- ----  ---------

�ize
	LDA	#2
	STA	ZPAGE_BYTE2		;Ysize
	JSR	DRAW_CHR_BLOCK	;Draw disc

	SET16	ZPAGE_WORD1,ATTRWALL0
	JSR	SI_SET_ATTR	;Set screen attributes
	JSR	SET_PA	;Reset panel attributes

	JSR	SET_S0	;Set to screen 0

	LDA	#104
	STA	DIRK_X
	LDA	#167
	STA	DIRK_Y

	LDX	#0	
	STX	ELEV_CNT	;Brick scroll position

	LDY	#1
	JMP	INIT_SCR_END


;   1a) Normal screen

INIT_STATIC
	INY
	LDA	(ZPAGE_WORD10),Y	;Screen number
	JSR	DRAW_SCREEN	;Draw normal screen

	LDY	#2
	LDA	(ZPAGE_WORD10),Y
	STA	ZPAGE_WORD1	;Setup WORD1 as pointer
	INY		;to attribute map
	LDA	(ZPAGE_WORD10),Y
	STA	ZPAGE_WORD1+1
	JSR	SI_SET_ATTR	;Draw screen attributes

	JSR	SET_S0	;Set to screen 0

	LDY	#4
	LDA	(ZPAGE_WORD10),Y
	STA	DIRK_Y

	LDA	#12
	STA	DIRK_X

	LDY	#5
	JMP	INIT_SCR_END

;   1b) Draw scrolling screen

INIT_SCROLLING

; Setup screen height and Y offset to top of strip

	LDX	SCR_NUM
	LDA	IS_SCR_YS,X
	STA	SCROLL_YS
	LDA	IS_SCR_YOFF,X
	STA	SCROLL_YOFF

; Find correct reset point and setup parms for Dirk start pos and screen
; draw.
	INY
	LDA	(ZPAGE_WORD10),Y
	STA	ZPAGE_WORD1
	INY		;Setup WORD1 pointing
	LDA	(ZPAGE_WORD10),Y	;at reset point
	STA	ZPAGE_WORD1+1	;table

	LDY	#0
SI_FPOS_LOOP
	LDA	(ZPAGE_WORD1),Y
	STA	ZPAGE_WORD2
	INY		;WORD2 is reset X
	LDA	(ZPAGE_WORD1),Y
	STA	ZPAGE_WORD2+1
	CMP16	DIRK_X_DIE,ZPAGE_WORD2	;Compare against how far Dirk
			;got last go.
	BCC	SI_POS_FOUND	;Exit if reset X is greater
	TYA
	CLC
	ADC	#9-1	;Move to next entry
	TAY
	JMP	SI_FPOS_LOOP
SI_POS_FOUND
	TYA
	SEC
	SBC	#9+1	;Move back to last entry
	TAY
	LDA	(ZPAGE_WORD1),Y
	STA	SCROLL_XOFFSET
	INY		;Setup Dirk's X position
	LDA	(ZPAGE_WORD1),Y
	STA	SCROLL_XOFFSET+1


utine comprises of three separate tables:-


; Table 0 contains pointers to the top left hand corner screen address.

SCR_DRAW_TAB0	DW	DL_SCR_TLFT	;0 - Panel
	DW	DL_SCR_TLFT+(5*32)	;1 - Draw Bridge
	DW	SCR1_START+(26*32)	;2 - Reaper floor
	DW	DL_SCR_TLFT+(5*32)	;3 - Treasury
	DW	SCR1_START+(15*32)+22	;4 - Reaper

	IF	FCS=1
	DW	SCR_START+(9*32)+10	;5 - SBIM logo
	DW	SCR_START+(13*32)+13	;6 - Presents
	DW	SCR_START+(12*32)+24	;7 - TM
	DW	SCR_START+(19*32)+11	;8 - Released by
	DW	SCR_START+(21*32)+4	;9 - EPIC logo
	DW	SCR_START+(24*32)+5	;10- Licensed by Nintendo
	DW	SCR_START+(7*32)+7	;11- EPIC release
	DW	SCR_START+(12*32)+10	;12- Developed by
	DW	SCR_START+(14*32)+12	;13- MotiveTime logo
	DW	SCR_START+(18*32)+1	;14- Copyright message
	DW	SCR_START+(15*32)+10	;15- Dragons Lair logo s1
	ENDIF

	IF	GBR=1
	DW	SCR_START+(5*32)+9	;5 - SBIM logo
	DW	SCR_START+(9*32)+11	;6 - Presents
	DW	SCR_START+(3*32)+9	;7 - Don Bluth cs2
	DW	SCR_START+(14*32)+10	;8 - Released by
	DW	SCR_START+(16*32)+6	;9 - Elite logo
	DW	SCR_START+(24*32)+5	;10- Licensed by Nintendo
	DW	SCR_START+(7*32)+5	;11- Elite release
	DW	SCR_START+(12*32)+10	;12- Developed by
	DW	SCR_START+(14*32)+11	;13- MotiveTime logo
	DW	SCR_START+(18*32)+1	;14- Copyright message
	DW	SCR_START+(11*32)+8	;15- Dragons Lair logo s1
	ENDIF

	DW	SCR_START+(3*32)+9	;16- Dragons Lair logo s2
	DW	SCR_START+(4*32)+23	;17- TM credits screen 2
	DW	SCR_START+(32*8)+7	;18- SCORES
	DW	SCR_START+(32*10)+8	;19- PLAYERS
	DW	SCR_START+(32*13)+8	;20- MUSIC
	DW	SCR_START+(32*10)+7	;21- GOLD
	DW	SCR_START+(32*23)+13	;22- Mtime logo option screens
	DW	SCR1_START+(32*8)+10	;23-


	DL	0
	ENDIF

	DL	0	;4- 

	IF	SINGE
	DL	S5_TP_TAB	;5 - Singe
	ELSE
	DL	0
	ENDIF

	DL	S6_TP_TAB	;6 - Elevator
	DL	S7_TP_TAB	;7 - Treasury
	DL	S8_TP_TAB	;8 - Dungeon

SCR_TPTR_TABH	DH	S0_TP_TAB	;0 - Drawbridge

	IF	HALL
	DH	S1_TP_TAB	;1 - Entrance hall
	ELSE
	DH	0
	ENDIF

	IF	MINES
	DH	S2_TP_TAB	;2 - Mines
	ELSE
	DH	0
	ENDIF

	IF	REAPER
	DH	S3_TP_TAB	;3 - Grim reaper
	ELSE
	DH	0
	ENDIF

	DH	0	;4-

	IF	SINGE
	DH	S5_TP_TAB	;5 - Singe
	ELSE
	DH	0
	ENDIF

	DH	S6_TP_TAB	;6 - Elevator
	DH	S7_TP_TAB	;7 - Treasury
	DH	S8_TP_TAB	;8 - Dungeon


;--------------------------------------
; Include graphics source files
; ------- -------- ------ -----

	INCLUDE "GR_SMAP1.SRC"

;--------------------------------------
; Sprite Collision boxes
; ------ --------- -----

; Table of pointers to collision boxes

SDC_COL_PTRS_L	DL	SCOL_0
	DL	SCOL_1
	DL	SCOL_2
	DL	SCOL_3
	DL	SCOL_4
	DL	SCOL_5
	DL	SCOL_6
	DL	SCOL_7
	DL	SCOL_8
	DL	SCOL_9
	DL	SCOL_10
	DL	SCOL_11
	DL	SCOL_12
	DL	SCOL_13
	DL	SCOL_14
	DL	SCOL_15
	DL	SCOL_16
	DL	SCOL_17
	DL	SCOL_18
	DL	SCOL_19
	DL	SCOL_20
	DL	SCOL_21
	DL	SCOL_22
	DL	SCOL_23
	DL	SCOL_24
	DL	SCOL_25
	DL	SCOL_26
	DL	SCOL_27
	DL	SCOL_25 ;28
	DL	SCOL_26 ;29
	DL	SCOL_27 ;30
	DL	SCOL_31
	DL	SCOL_32
	DL	SCOL_33
	DL	SCOL_34
	DL	SCOL_35
	DL	SCOL_36
	DL	SCOL_37
	DL	SCOL_38
	DL	SCOL_39
	DL	SCOL_40
	DL	SCOL_41
	DL	SCOL_42
	DL	SCOL_43
	DL	SCOL_44
	DL	SCOL_45
	DL	SCOL_46
	DL	SCOL_47

SDC_COL_PTRS_H	DH	SCOL_0
	DH	SCOL_1
	DH	SCOL_2
	DH	SCOL_3
	DH	SCOL_4
	DH	SCOL_5
	DH	SCOL_6
	DH	SCOL_7
	DH	SCOL_8
	DH	SCOL_9
	DH	SCOL_10
	DH	SCOL_11
	DH	SCOL_12
	DH	SCOL_13
	DH	SCOL_14
	DH	SCOL_15
	DH	SCOL_16
	DH	SCOL_17
	DH	SCOL_18
	DH	SCOL_19
	DH	SCOL_20
	DH	SCOL_21
	DH	SCOL_22
	DH	SCOL_23
	DH	SCOL_24
	DH	SCOL_25
	DH	SCOL_26


	SCR_NUM
	CMP	#6
	BNE	SF_NOT_6	

; Screen 6 (Elevator)

	LDA	DIRK_FLAG
	AND	#FCD_SEC_BIT	;Only check for exit if on
	BEQ	SF_NOT_6	;platform, else do normal bump
			;into sides.

	LDA	DIRK_X	;Test if walked off left
	CMP	#L_EDGE	;or right edge of elevator
	BCC	SF_OFF_ELEV
	CMP	#R_EDGE
	BCS	SF_OFF_ELEV

	RTS


; Walked off edge

SF_OFF_ELEV
	LDX	SCR_NUM_OLD	;Start correct screen
	LDA	SF_ETABL,X
	STA	ZPAGE_WORD1
	LDA	SF_ETABH,X	;Setup W1 as pointer to
	STA	ZPAGE_WORD1+1	;exit list

	LDY	ELEV_ENUM	;Number of exit from elevator
	LDA	(ZPAGE_WORD1),Y	;Screen to go to
	CMP	#7	;If new screen is treasury
	BEQ	!1	;don't update SCR_NUM_OLD so
	CMP	#8
	BEQ	!1
	STA	SCR_NUM_OLD	;It's the same elev next time
!1	STA	SCR_NUM
	JMP	SCR_E_END


SF_ETABL	DL	SF_EL0
	DL	SF_EL1
	DL	SF_EL2
	DL	SF_EL3
	DL	SF_EL4
	DL	SF_EL5
	DL	SF_EL6
	DL	SF_EL7


SF_ETABH	DH	SF_EL0
	DH	SF_EL1
	DH	SF_EL2
	DH	SF_EL3
	DH	SF_EL4
	DH	SF_EL5
	DH	SF_EL6
	DH	SF_EL7


SF_EL0			;Drawbridge

SF_EL1	DB	1,2,8,7	;Entrance hall
		   
SF_EL2	DB	8,2,3,7	;Mines

SF_EL3	DB	5,8,3,7	;Grim reaper

SF_EL4			;Not implemented

SF_EL5			;Singe

SF_EL6			;Elevator

SF_EL7			;Treasury


SF_NOT_6

; Stop exit off left of screen

	LDA	DIRK_X_ONSCR
	CMP	#L_EDGE
	BCS	SF_LOK

	LDA	SCR_NUM	;Dirk exits on the left
	CMP	#7	;in the treasury
	BNE	!1
	LDA	END_LEVEL_FLAG	;Exit from treasury
	BNE	SF_LEVEL_END
!1
	LDA	#L_EDGE+4	;Put Dirk at left
	JSR	SF_CEP

SF_LOK

SF_SCROLL
	LDA	SCROLL_FLAG  	;Is it a scrolling section
	BEQ	SF_NOT_SCROLL

	LDA	SCROLL_XOFFSET+1	;Test if finished scrolling
	CMP	SCROLL_LENGTH+1	;(16 bit compare)
	BCC	SF_END
	BNE	!1
	LDA	SCROLL_XOFFSET
	CMP	SCROLL_LENGTH
	BCC	SF_END


; Scroll has finished so allow Dirk freedom to walk right.

!1
	LDA	#0
	STA	SCROLL_FLAG	;Clear scroll flag

SF_NOT_SCROLL
	LDA	DIRK_X_ON


OL_S1	;Scr 1 - Entrance Hall 
	DH	BG_COL_S2	;Scr 2 - Mines
	DH	BG_COL_S3	;Scr 3 - Grim reaper
	DH	0	;Scr 4 -
	DH	BG_COL_S5	;Scr 5 - Singe
	DH	BG_COL_S6	;Scr 6 - Elevator
	DH	BG_COL_S7	;Scr 7 - Treasury
	DH	BG_COL_S8	;Scr 8 - Dungeon


; Bonus collision data
; ----- --------- ---- 

BONUS_TABL	DL	BTAB_S0
	DL	BTAB_S1
	DL	BTAB_S2
	DL	BTAB_S3
	DL	0
	DL	BTAB_S5
	DL	BTAB_S6
	DL	BTAB_S7
	DL	BTAB_S8

BONUS_TABH	DH	BTAB_S0
	DH	BTAB_S1
	DH	BTAB_S2
	DH	BTAB_S3
	DH	0
	DH	BTAB_S5
	DH	BTAB_S6
	DH	BTAB_S7
	DH	BTAB_S8

	INCLUDE "BG_COL.SRC"	;Background

Source Differences

The Japanese and European source codes have some differences:

  • The Japanese code has the "cameo" screens disabled by inserting the RTS opcode at the start of the display routine. The same difference is present in the final binary code. There are no splash screens between levels, but they can be enabled by using Game Genie code XVEZKGAV.
  • The Japanese version lacks the "Dungeon" level data tables.
--- EU.asm
+++ JP.asm
@@ -956,6 +956,8 @@
 	LDA	#128	;Stop tune playing
 	JSR	START_TUNE
 
+	RTS
+
 	LDX	SCR_NUM        	;Setup BG bank
 	LDA	CAM_B_TAB,X
 	BEQ	!1
@@ -1953,7 +1955,6 @@
 
 	DL	S6_TP_TAB	;6 - Elevator
 	DL	S7_TP_TAB	;7 - Treasury
-	DL	S8_TP_TAB	;8 - Dungeon
 
 SCR_TPTR_TABH	DH	S0_TP_TAB	;0 - Drawbridge
 
@@ -1985,7 +1986,6 @@
 
 	DH	S6_TP_TAB	;6 - Elevator
 	DH	S7_TP_TAB	;7 - Treasury
-	DH	S8_TP_TAB	;8 - Dungeon
 
 
 ;--------------------------------------
@@ -2140,11 +2140,11 @@
 
 SF_EL0			;Drawbridge
 
-SF_EL1	DB	1,2,8,7	;Entrance hall
+SF_EL1	DB	1,2,0,7	;Entrance hall
 		   
-SF_EL2	DB	8,2,3,7	;Mines
+SF_EL2	DB	1,2,3,7	;Mines
 
-SF_EL3	DB	5,8,3,7	;Grim reaper
+SF_EL3	DB	5,2,3,7	;Grim reaper
 
 SF_EL4			;Not implemented