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