Subversion Repositories DASM

Compare Revisions

Rev 1 → Rev 2

games/dragonfire/DFIRE.ASM
0,0 → 1,2742
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; 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