mirror of
https://github.com/peterdell/wudsn-ide.git
synced 2024-06-03 06:29:35 +00:00
2797 lines
295 KiB
NASM
2797 lines
295 KiB
NASM
processor 6502
|
|
;Default 2600 Constants set up by dissasembler..
|
|
VSYNC = $00
|
|
VBLANK = $01
|
|
WSYNC = $02
|
|
RSYNC = $03
|
|
NUSIZ0 = $04
|
|
NUSIZ1 = $05
|
|
COLUP0 = $06
|
|
COLUP1 = $07
|
|
COLUPF = $08
|
|
COLUBK = $09
|
|
CTRLPF = $0A
|
|
PF0 = $0D
|
|
PF1 = $0E
|
|
PF2 = $0F
|
|
RESP0 = $10
|
|
AUDC0 = $15
|
|
AUDF0 = $17
|
|
AUDV0 = $19
|
|
AUDV1 = $1A
|
|
GRP0 = $1B
|
|
GRP1 = $1C
|
|
ENAM0 = $1D
|
|
ENAM1 = $1E
|
|
ENABL = $1F
|
|
HMP0 = $20
|
|
VDEL01 = $26
|
|
HMOVE = $2A
|
|
HMCLR = $2B
|
|
CXCLR = $2C
|
|
CXP0FB = $32
|
|
CXP1FB = $33
|
|
CXM0FB = $34
|
|
CXM1FB = $35
|
|
CXBLPF = $36
|
|
CXPPMM = $37
|
|
INPT4 = $3C
|
|
SWCHA = $0280
|
|
SWCHB = $0282
|
|
INTIM = $0284
|
|
TIM64T = $0296
|
|
|
|
ORG $F000
|
|
|
|
START:
|
|
JMP StartGame ;Jump To Start Game ;3
|
|
|
|
|
|
;Alternate Start
|
|
.byte $78,$D8,$4C,$06,$F3 ;Setup for 6507, Start with no Variable Initialisation.
|
|
|
|
;Print Display
|
|
PrintDisplay:
|
|
STA HMCLR ;Clear horzontal motion. ;3
|
|
LDA $86 ;Position Player00 Sprite To ;3
|
|
LDX #$00 ; the X Coordinate of Object1. ;2
|
|
JSR PosSpriteX ;6
|
|
|
|
LDA $88 ;Position Player01 Sprite to ;3
|
|
LDX #$01 ; the X Coordinate of Object2. ;2
|
|
JSR PosSpriteX ;6
|
|
|
|
LDA $8B ;Position Ball Strite to ;3
|
|
LDX #$04 ; the X Coordinate of the Man. ;2
|
|
JSR PosSpriteX ;6
|
|
|
|
STA WSYNC ;Wait for horizontal Blank. ;3
|
|
STA HMOVE ;Apply Horizontal Motion. ;3
|
|
STA CXCLR ;Clear Collision Latches. ;3
|
|
|
|
LDA $8C ;Get the Y Coordinate of the Man. ;3
|
|
SEC ;2
|
|
SBC #$04 ;And Adjust it (By Four Scan Lines) ;2
|
|
STA $8D ; for printing (so Y Coordinate Specifies Middle) ;3
|
|
|
|
PrintDisplay_1:
|
|
LDA INTIM ;Wait for end of the ;4
|
|
BNE PrintDisplay_1 ; current fame. ;2
|
|
|
|
LDA #$00 ;2
|
|
STA $90 ;Set Player00 definition index. ;3
|
|
STA $91 ;Set Player01 definition index. ;3
|
|
STA $8F ;Set room definition index. ;3
|
|
STA GRP1 ;Clear any graphics for Player01. ;3
|
|
LDA #$01 ;2
|
|
STA VDEL01 ;vertically delay Player 01 ;3
|
|
LDA #$68 ;2
|
|
STA $8E ;Set Scan Lind Count. ;3
|
|
|
|
;Print top line of Room.
|
|
LDY $8F ;Get room definition index. ;3
|
|
LDA ($80),Y ;Get first room definition byte. ;5
|
|
STA PF0 ; and display. ;3
|
|
INY ;2
|
|
LDA ($80),Y ;Get Next room definition byte. ;5
|
|
STA PF1 ; and display. ;3
|
|
INY ;2
|
|
LDA ($80),Y ;Get Last room defintion byte. ;5
|
|
STA PF2 ; and display. ;3
|
|
INY ;2
|
|
STY $8F ;Save for Next Time. ;3
|
|
|
|
STA WSYNC ;Wait for Horizontal Blank. ;3
|
|
LDA #$00 ;2
|
|
STA VBLANK ;Clear any Vertical Blank. ;3
|
|
JMP PrintPlayer00 ;3
|
|
|
|
|
|
;Print Player01 (Object 02)
|
|
PrintPlayer01:
|
|
LDA $8E ;Get Current Scan Line. ;3
|
|
SEC ;Have we reached Object2's ;2
|
|
SBC $89 ; Y Coordinate? ;3
|
|
STA WSYNC ; Wait for Horzonal Blank. ;3
|
|
BPL PrintPlayer00 ;If Not, Branch. ;2
|
|
|
|
LDY $91 ;Get the Player01 definition index. ;3
|
|
LDA ($84),Y ;Get the Next Player01 Definition byte ;5
|
|
STA GRP1 ; and display. ;3
|
|
BEQ PrintPlayer00 ;If Zero then Definition finished. ;2
|
|
|
|
INC $91 ;Goto next Player01 definition byte. ;5
|
|
|
|
;Print Player00 (Object01), Ball (Man) and Room.
|
|
PrintPlayer00:
|
|
LDX #$00 ;2
|
|
LDA $8E ;Get the Current Scan Line. ;3
|
|
SEC ;Have we reached the Object1's ;2
|
|
SBC $87 ; Y coordinate? ;3
|
|
BPL PrintPlayer00_1 ;If not then Branch. ;2
|
|
|
|
LDY $90 ;Get Player00 definition index. ;3
|
|
LDA ($82),Y ;Get the Next Player00 definition byte. ;5
|
|
TAX ;2
|
|
BEQ PrintPlayer00_1 ;If Zero then Definition finished. ;2
|
|
|
|
INC $90 ;Go to Next Player00 definition byte. ;5
|
|
|
|
PrintPlayer00_1:
|
|
LDY #$00 ;Disable Ball Graphic. ;2
|
|
LDA $8E ;Get Scan line count. ;3
|
|
SEC ;Have we reached the Man's ;2
|
|
SBC $8D ; Y Coordinate? ;3
|
|
AND #$FC ;Mask value to four either side (getting depth of 8) ;2
|
|
BNE PrintPlayer00_2 ;If Not, Branch. ;2
|
|
|
|
LDY #$02 ;Enable Ball Graphic. ;2
|
|
|
|
PrintPlayer00_2:
|
|
LDA $8E ;Get Scan Line Count. ;3
|
|
AND #$0F ;Have we reached a sixteenth scan line. ;2
|
|
BNE PrintPlayer00_4 ;If not, Branch. ;2
|
|
|
|
STA WSYNC ;Wait for Horzontal Blank. ;3
|
|
STY ENABL ;Enable Ball (If Wanted) ;3
|
|
STX GRP0 ;Display Player 00 definition byte (if wanted) ;3
|
|
|
|
LDY $8F ;Get room definition index. ;3
|
|
LDA ($80),Y ;Get first room definition byte, ;5
|
|
STA PF0 ; and display. ;3
|
|
INY ;2
|
|
LDA ($80),Y ;Get next room definition byte, ;5
|
|
STA PF1 ; and display. ;3
|
|
INY ;2
|
|
LDA ($80),Y ;Get next room definition byte, ;5
|
|
STA PF2 ; and display. ;3
|
|
INY ;2
|
|
STY $8F ;Save for Next Time. ;3
|
|
|
|
PrintPlayer00_3:
|
|
DEC $8E ;Goto next scan line. ;5
|
|
LDA $8E ;Get the scan line. ;3
|
|
CMP #$08 ;Have we reached to within 8 scanlines of the bottom? ;2
|
|
BPL PrintPlayer01 ;If not, Branch. ;2
|
|
|
|
STA VBLANK ;Turn on VBLANK ;3
|
|
JMP TidyUp ;3
|
|
|
|
;Print Player00 (Object 01) and Ball (Man)
|
|
PrintPlayer00_4:
|
|
STA WSYNC ;Wait for Horzontal blank. ;3
|
|
STY ENABL ;Enable Ball (If Wanted.) ;3
|
|
STX GRP0 ;Display Player00 definition byte (if Wanted). ;3
|
|
JMP PrintPlayer00_3 ;3
|
|
|
|
;Tidy Up
|
|
TidyUp:
|
|
LDA #$00 ;2
|
|
STA GRP1 ;Clear any graphics for Player01 ;3
|
|
STA GRP0 ;Clear any graphics for Player00 ;3
|
|
LDA #$20 ;2
|
|
STA TIM64T ;Stat Timing this frame using ;4
|
|
RTS ; the 64 bit counter. ;6
|
|
|
|
|
|
;Position Sprite X horizontally.
|
|
PosSpriteX:
|
|
LDY #$02 ;Start with 10 clock cycles (to avoid HBLANK) ;2
|
|
SEC ;Divide the Coordinate. ;2
|
|
PosSpriteX_1:
|
|
INY ; Wanted by Fifteen I.E. ;2
|
|
SBC #$0F ; Get Course Horizontal ;2
|
|
BCS PosSpriteX_1 ; Value (In Multiples of 5 Clock Cycles ;2
|
|
; (Therefore giving 15 Color Cycles)
|
|
EOR #$FF ;Flip remanter to positive value (inverted). ;2
|
|
SBC #$06 ;Convert to left or right of current position. ;2
|
|
ASL ;2
|
|
ASL ;Move to high nybble for TIA ;2
|
|
ASL ; horizontal motion. ;2
|
|
ASL ;2
|
|
STY WSYNC ;Wait for horozontal blank. ;3
|
|
|
|
PosSpriteX_2:
|
|
DEY ;Count down the color ;2
|
|
BPL PosSpriteX_2 ; cycles (these are 5 machine/15 color cycles). ;2
|
|
|
|
STA RESP0,X ;Reset the sprite, thus positioning it coursely. ;4
|
|
STA HMP0,X ;Set horizontal (fine) motion of sprite. ;4
|
|
RTS ;6
|
|
|
|
|
|
;Preform VSYNC
|
|
DoVSYNC:
|
|
LDA INTIM ;Get Timer Output ;4
|
|
BNE DoVSYNC ;Wait for Time-Out ;2
|
|
LDA #$02 ;2
|
|
STA WSYNC ;Wait for horizonal blank. ;3
|
|
STA VBLANK ;Start Vertical Blanking. ;3
|
|
STA WSYNC ;Wait for horizonal blank. ;3
|
|
STA WSYNC ;Wait for horizonal blank. ;3
|
|
STA WSYNC ;Wait for horizonal blank. ;3
|
|
STA VSYNC ;Start verticle sync. ;3
|
|
STA WSYNC ;Wait for horizonal blank. ;3
|
|
STA WSYNC ;Wait for horizonal blank. ;3
|
|
LDA #$00 ;2
|
|
STA WSYNC ;Wait for horizonal blank. ;3
|
|
STA VSYNC ;End Vertical sync. ;3
|
|
LDA #$2A ;Set clock interval to ;2
|
|
STA TIM64T ;Countdown next frame. ;4
|
|
RTS ;6
|
|
|
|
;Setup a room for print.
|
|
SetupRoomPrint:
|
|
LDA $8A ;Get current room number. ;3
|
|
JSR RoomNumToAddress ;Convert it to an address. ;6
|
|
LDY #$00 ;2
|
|
LDA ($93),Y ;Get low pointer to room ;5
|
|
STA $80 ; Graphics ;3
|
|
LDY #$01 ;2
|
|
LDA ($93),Y ;Get high pointer to room ;5
|
|
STA $81 ; Graphics ;3
|
|
|
|
;Check B&W Switch for foom graphics.
|
|
LDA SWCHB ;Get console switches. ;4
|
|
AND #$08 ;Check black and white switch ;2
|
|
BEQ UseBW ;Branch if B&W. ;2
|
|
|
|
;Use Color
|
|
LDY #$02 ;2
|
|
LDA ($93),Y ;Get room color ;5
|
|
JSR ChangeColor ;Change if necessary ;6
|
|
STA COLUPF ;Put in Playfiled color register. ;3
|
|
JMP UseColor ;3
|
|
|
|
;Use B&W
|
|
UseBW:
|
|
LDY #$03 ;2
|
|
LDA ($93),Y ;Get B&W Color ;5
|
|
JSR ChangeColor ;Change if necessary ;6
|
|
STA COLUPF ;Put in the Playfield color register. ;3
|
|
|
|
;Color Background.
|
|
UseColor:
|
|
LDA #$08 ;Get light grey background ;2
|
|
JSR ChangeColor ;Change if necessary ;6
|
|
STA COLUBK ;Put it in the Background color register. ;3
|
|
|
|
;Playfield Control.
|
|
LDY #$04 ;2
|
|
LDA ($93),Y ;Get the playfield control value. ;5
|
|
STA CTRLPF ;And put in the playfield control register. ;3
|
|
AND #$C0 ;Get the "this wall" flag. ;2
|
|
LSR ;2
|
|
LSR ;2
|
|
LSR ;Get the first bit into position. ;2
|
|
LSR ;2
|
|
LSR ;2
|
|
STA ENAM1 ;Enable right hand thin wall. (if wanted - missile01) ;3
|
|
LSR ;2
|
|
STA ENAM0 ;Enable left hand thin wall (if wanted - missle00) ;3
|
|
|
|
;Get objects to display.
|
|
JSR CacheObjects ;Get next two objects to display. ;6
|
|
|
|
;Sort out their order.
|
|
LDA $95 ;If the object1 is the ;3
|
|
CMP #$00 ;Invisible surround ;2
|
|
BEQ SwapPrintObjects ;Then branch to swap (we want it as player01) ;2
|
|
|
|
CMP #$5A ;If the first object is the bridge then ;2
|
|
BNE SetupObjectPrint ;Swap the objects (we want it as player01) ;2
|
|
|
|
LDA $96 ;If the object2 is the ;3
|
|
CMP #$00 ;Invisble surround then branch to leave ;2
|
|
BEQ SetupObjectPrint ;it (we want it as player01) ;2
|
|
|
|
SwapPrintObjects:
|
|
LDA $95 ;3
|
|
STA $D8 ;3
|
|
LDA $96 ;3
|
|
STA $95 ;Swap the objects to print. ;3
|
|
LDA $D8 ;3
|
|
STA $96 ;3
|
|
|
|
;Setup Object1 to print.
|
|
SetupObjectPrint:
|
|
LDX $95 ;Get Object1 ;3
|
|
LDA Store1,X ;Get low pointer to it's dynamic information. ;4
|
|
STA $93 ;3
|
|
LDA Store2,X ;Get high pointer to it's dynamic informtion. ;4
|
|
STA $94 ;3
|
|
|
|
LDY #$01 ;2
|
|
LDA ($93),Y ;Get Object1's X coordinate ;5
|
|
STA $86 ;and Store for print. ;3
|
|
LDY #$02 ;2
|
|
LDA ($93),Y ;Get Object1's Y coordinate ;5
|
|
STA $87 ;and Store for print. ;3
|
|
|
|
LDA Store3,X ;Get low pointer to state value. ;4
|
|
STA $93 ;3
|
|
LDA Store4,X ;Get high pointer to state value. ;4
|
|
STA $94 ;3
|
|
LDY #$00 ;2
|
|
LDA ($93),Y ;Retrieve Object1's current state. ;5
|
|
STA $DC ;3
|
|
|
|
LDA Store5,X ;Get low pointer to state information. ;4
|
|
STA $93 ;3
|
|
LDA Store6,X ;Get high pointer to state information. ;4
|
|
STA $94 ;3
|
|
JSR GetObjectState ;Find current state in the state information. ;6
|
|
|
|
INY ;Index to the state's corresponding graphic pointer. ;2
|
|
LDA ($93),Y ;Get Object1's low graphic address ;5
|
|
STA $82 ;and store for print. ;3
|
|
INY ;2
|
|
LDA ($93),Y ;Get Object1's high graphic address ;5
|
|
STA $83 ;and store for print. ;3
|
|
|
|
;Check B&W for object01
|
|
LDA SWCHB ;Get console switches ;4
|
|
AND #$08 ;Check B&W switches. ;2
|
|
BEQ MakeObjectBW ;Branch if B&W. ;2
|
|
|
|
;Colour
|
|
LDA Store7,X ;Get Object1's Color. ;4
|
|
JSR ChangeColor ;Change if necessary. ;6
|
|
STA COLUP0 ;And set color luminance00. ;3
|
|
JMP ResizeObject ;3
|
|
|
|
;B&W
|
|
MakeObjectBW:
|
|
LDA Store8,X ;Get Object's B&W Color. ;4
|
|
JSR ChangeColor ;Change if necessary. ;6
|
|
STA COLUP0 ;Set color luminance00. ;3
|
|
|
|
;Object1 Size
|
|
ResizeObject:
|
|
LDA Store9,X ;Get Object1's Size ;4
|
|
ORA #$10 ;And set to larger size if necessary. ;2
|
|
STA NUSIZ0 ;(Used by bridge and invisible surround) ;3
|
|
|
|
;Setup Object 2 to Print.
|
|
LDX $96 ;Get Object 2 ;3
|
|
LDA Store1,X ;4
|
|
STA $93 ;Get low pointer to it's dynamic information. ;3
|
|
LDA Store2,X ;4
|
|
STA $94 ;Get high pointer to it's dynamic information. ;3
|
|
LDY #$01 ;2
|
|
LDA ($93),Y ;Get Object2's X coordinate ;5
|
|
STA $88 ;and store for print. ;3
|
|
LDY #$02 ;2
|
|
LDA ($93),Y ;Get Object2's Y coordinate ;5
|
|
STA $89 ;and store for print. ;3
|
|
LDA Store3,X ;Get low pointer to state value. ;4
|
|
STA $93 ;3
|
|
LDA Store4,X ;Get high pointer to state value. ;4
|
|
STA $94 ;3
|
|
|
|
|
|
LDY #$00 ;2
|
|
LDA ($93),Y ;Retrieve Object2's current state. ;5
|
|
STA $DC ;3
|
|
LDA Store5,X ;Get low pointer to state information. ;4
|
|
STA $93 ;3
|
|
LDA Store6,X ;Get high pointer to state information. ;4
|
|
STA $94 ;3
|
|
JSR GetObjectState ;Find the current state in the state information. ;6
|
|
|
|
INY ;Index to the state's corresponding graphic pointer. ;2
|
|
LDA ($93),Y ;5
|
|
STA $84 ;Get Object2's low graphic address. ;3
|
|
INY ;2
|
|
LDA ($93),Y ;Get Object2's high graphic address. ;5
|
|
STA $85 ;3
|
|
|
|
;Check B&W for Object2
|
|
LDA SWCHB ;Get Console Switches ;4
|
|
AND #$08 ;Check B&W Switch. ;2
|
|
BEQ MakeObject2BW ;If B&W then Branch. ;2
|
|
|
|
;Color
|
|
LDA Store7,X ;Get Object2;s Color ;4
|
|
JSR ChangeColor ;Change if Necessary. ;6
|
|
STA COLUP1 ;and set color luminance01. ;3
|
|
JMP ResizeObject2 ;3
|
|
|
|
;B&W
|
|
MakeObject2BW:
|
|
LDA Store8,X ;Get Object's B&W Color. ;4
|
|
JSR ChangeColor ;Change if Necessary. ;6
|
|
STA COLUP1 ;and set color luminance01. ;3
|
|
|
|
;Object2 Size
|
|
ResizeObject2:
|
|
LDA Store9,X ;Get Object2's Size ;4
|
|
ORA #$10 ;And set to larger size if necessary. ;2
|
|
STA NUSIZ1 ;(Used by bridge and invisible surround) ;3
|
|
RTS ;6
|
|
|
|
;Fill cache with two objects in this room.
|
|
CacheObjects:
|
|
LDY $9C ;Get Last Object ;3
|
|
LDA #$A2 ;Set cache to ;2
|
|
STA $95 ; no-ojects. ;3
|
|
STA $96 ;3
|
|
MoveNextObject:
|
|
TYA ;2
|
|
CLC ;Goto the next object to ;2
|
|
ADC #$09 ;check (add nine). ;2
|
|
CMP #$A2 ;Check if over maximum. ;2
|
|
BCC GetObjectsInfo ;2
|
|
LDA #$00 ;If so, wrap to zero. ;2
|
|
GetObjectsInfo:
|
|
TAY ;2
|
|
LDA Store1,Y ;Get low byte of object info. ;4
|
|
STA $93 ;3
|
|
LDA Store2,Y ;Get high byte of object info. ;4
|
|
STA $94 ;3
|
|
LDX #$00 ;2
|
|
LDA ($93,X) ;Get objects current room. ;6
|
|
CMP $8A ;Is it in this room? ;3
|
|
BNE CheckForMoreObjects ;If not lets try next object (branch) ;2
|
|
|
|
LDA $95 ;Check first slot. ;3
|
|
CMP #$A2 ;If not default (no-object) ;2
|
|
BNE StoreObjectToPrint ;then branch. ;2
|
|
|
|
STY $95 ;Store this object's number to print ;3
|
|
JMP CheckForMoreObjects ; and try for more. ;3
|
|
|
|
StoreObjectToPrint:
|
|
STY $96 ;Store this object's number to print. ;3
|
|
JMP StoreCount ; and then give up - no slots free. ;3
|
|
|
|
CheckForMoreObjects:
|
|
CPY $9C ;Have we done all the objets? ;3
|
|
BNE MoveNextObject ;If not, continue. ;2
|
|
|
|
StoreCount:
|
|
STY $9C ;If so, store current count ;3
|
|
RTS ; for next time. ;6
|
|
|
|
;Convert room number to address.
|
|
RoomNumToAddress:
|
|
STA $D8 ;Strore room number wanted. ;3
|
|
STA $93 ;3
|
|
LDA #$00 ;Zero the high byte of the ;2
|
|
STA $94 ; offset. ;3
|
|
CLC ;2
|
|
ROL $93 ;5
|
|
ROL $94 ;Multiply room number by eight. ;5
|
|
ROL $93 ;5
|
|
ROL $94 ;5
|
|
ROL $93 ;5
|
|
ROL $94 ;5
|
|
|
|
LDA $D8 ;Get the original room number. ;3
|
|
CLC ;2
|
|
ADC $93 ;3
|
|
STA $93 ;And add it to the offset. ;3
|
|
LDA #$00 ;2
|
|
ADC $94 ;In effect the room number is ;3
|
|
STA $94 ; multiplied by nine. ;3
|
|
|
|
LDA #<RoomDataTable ;2
|
|
CLC ;2
|
|
ADC $93 ;Add the room data base address ;3
|
|
STA $93 ;to the offset therefore getting ;3
|
|
LDA #>RoomDataTable ; the final room data address. ;2
|
|
ADC $94 ;3
|
|
STA $94 ;3
|
|
RTS ;6
|
|
|
|
;Get pointer to current state.
|
|
GetObjectState:
|
|
LDY #$00 ;2
|
|
LDA $DC ;Get the current object state. ;3
|
|
GetObjectState_1:
|
|
CMP ($93),Y ;Have we found it in the list of states. ;5
|
|
BCC GetObjectState_2 ;If nearing it then found it and return ;2
|
|
BEQ GetObjectState_2 ;If found it then return. ;2
|
|
|
|
INY ;2
|
|
INY ;Goto next state in list of states. ;2
|
|
INY ;2
|
|
JMP GetObjectState_1 ;3
|
|
GetObjectState_2:
|
|
RTS ;6
|
|
|
|
;Check for input.
|
|
CheckInput:
|
|
INC $E5 ;Increment low count. ;5
|
|
BNE GetJoystick ;2
|
|
|
|
INC $E6 ;Increment hight count if ;5
|
|
BNE GetJoystick ; needed. ;2
|
|
|
|
LDA #$80 ;Wrap the high count (indicating ;2
|
|
STA $E6 ; timeout) if needed. ;3
|
|
|
|
GetJoystick:
|
|
LDA SWCHA ;Get joystick values. ;4
|
|
CMP #$FF ;If any movement then branch. ;2
|
|
BNE GetJoystick_2 ;2
|
|
|
|
LDA SWCHB ;Get the consol switches ;4
|
|
AND #$03 ;Mast for the reset/select switchs. ;2
|
|
CMP #$03 ;Have either of them been used? ;2
|
|
BEQ GetJoystick_3 ;If not branch. ;2
|
|
|
|
GetJoystick_2:
|
|
LDA #$00 ;Zero the high count of the ;2
|
|
STA $E6 ; switches or joystick have been used. ;3
|
|
GetJoystick_3:
|
|
RTS ;6
|
|
|
|
;Change color if necessary.
|
|
ChangeColor:
|
|
LSR ;If bit 0 of the color is set ;2
|
|
BCC ChangeColor_2 ; then the room is to flash. ;2
|
|
|
|
TAY ;Use color as an index (usually E5- the low counter). ;2
|
|
LDA.wy $0080,Y ;Get flash color (usually the low counter.) ;4
|
|
|
|
ChangeColor_2:
|
|
LDY $E6 ;Get the input counter. ;3
|
|
BPL ChangeColor_3 ;If console/joystick moved reciently then branch. ;2
|
|
|
|
EOR $E6 ;Merge the high counter with the color wanted. ;3
|
|
AND #$FB ;Keep this color bug merge down the luminance. ;2
|
|
|
|
ChangeColor_3:
|
|
ASL ;And restore original color if necessary. ;2
|
|
RTS ;6
|
|
|
|
;Get the address of the dynamic information for an object.
|
|
GetObjectAddress:
|
|
LDA Store1,X ;4
|
|
STA $93 ;Get and store the low address. ;3
|
|
LDA Store2,X ;4
|
|
STA $94 ;Get and store the high address. ;3
|
|
RTS ;6
|
|
|
|
;Game Start
|
|
StartGame:
|
|
SEI ;Set Interupts Off ;2
|
|
CLD ;2
|
|
LDX #$28 ;Clear TIA Registers ;2
|
|
LDA #$00 ;&04-&2C i.e. blank ;2
|
|
ResetAll:
|
|
STA NUSIZ0,X ;Everything And Turn. ;4
|
|
DEX ;Everything Off. ;2
|
|
BPL ResetAll ;2
|
|
TXS ;Reset Stack ;2
|
|
SetupVars:
|
|
STA VSYNC,X ;Clear &80 to &FF User Vars. ;4
|
|
DEX ;2
|
|
BMI SetupVars ;2
|
|
JSR ThinWalls ;Position the thin walls (missiles) ;6
|
|
JSR SetupRoomObjects ;Setup objects rooms and positions. ;6
|
|
MainGameLoop:
|
|
JSR CheckGameStart ;Check for Game Start ;6
|
|
JSR MakeSound ;Make noise if necessary ;6
|
|
JSR CheckInput ;Check for input. ;6
|
|
LDA $DE ;Is The Game Active? ;3
|
|
BNE NonActiveLoop ;If Not Branch.. ;2
|
|
LDA $B9 ;Get the room the Chalise is in. ;3
|
|
CMP #$12 ;Is it in the yellow castle? ;2
|
|
BNE MainGameLoop_2 ;If Not Branch.. ;2
|
|
LDA #$FF ;2
|
|
STA $DF ;Set the note count to maximum. ;3
|
|
STA $DE ;Set the game to inactive. ;3
|
|
LDA #$00 ;Set the noise type to end-noise. ;2
|
|
STA $E0 ;3
|
|
MainGameLoop_2:
|
|
LDY #$00 ;Allow joystick read - all movement. ;2
|
|
JSR BallMovement ;Check ball collisions and move ball. ;6
|
|
JSR MoveCarriedObject ;Move the Carried Object ;6
|
|
JSR DoVSYNC ;Wait for VSYNC ;6
|
|
JSR SetupRoomPrint ;Setup the room and objects for display. ;6
|
|
JSR PrintDisplay ;Display the room and objects. ;6
|
|
JSR PickupPutdown ;Deal with object pickup and putdown. ;6
|
|
LDY #$01 ;Dissalow joystick read - move vertically only. ;2
|
|
JSR BallMovement ;Check ball collisions and move ball. ;6
|
|
JSR Surround ;Deal With Invisible Surround Moving. ;6
|
|
JSR DoVSYNC ;Wait for VSYNC ;6
|
|
JSR MoveBat ;Move and deal with bat. ;6
|
|
JSR Portals ;Move and deal with portcullises. ;6
|
|
JSR PrintDisplay ;Display the room and objects. ;6
|
|
JSR MoveGreenDragon ;Move and deal with the green dragon. ;6
|
|
JSR MoveYellowDragon ;Move and deal with the yellow dragon. ;6
|
|
JSR DoVSYNC ;Wait for VSYNC. ;6
|
|
LDY #$02 ;Dissalow joystic read/bridge check - move horrizonally only. ;2
|
|
JSR BallMovement ;Check ball collisions and move ball. ;6
|
|
JSR MoveRedDragon ;Move and deal with red dragon. ;6
|
|
JSR Mag_1 ;Deal with the magnet. ;6
|
|
JSR PrintDisplay ;Display the room and objects. ;6
|
|
JMP MainGameLoop ;3
|
|
|
|
;Non Active Game Loop.
|
|
NonActiveLoop:
|
|
JSR DoVSYNC ;Wait for VSYNC ;6
|
|
JSR PrintDisplay ;Display the room and objects. ;6
|
|
JSR SetupRoomPrint ;Set up room and objects for display. ;6
|
|
JMP MainGameLoop ;3
|
|
|
|
;Position missiles to "thin wall" areas.
|
|
ThinWalls:
|
|
LDA #$0D ;Position missile 00 to ;2
|
|
LDX #$02 ;(0D,00) - left thin wall. ;2
|
|
JSR PosSpriteX ;6
|
|
LDA #$96 ;Position missile 01 to ;2
|
|
LDX #$03 ;(96,00) - right thin wall. ;2
|
|
JSR PosSpriteX ;6
|
|
STA WSYNC ;Wait for horizonal blank. ;3
|
|
STA HMOVE ;Apply the horizonal move. ;3
|
|
RTS ;6
|
|
|
|
CheckGameStart:
|
|
LDA SWCHB ;Get the console switches. ;4
|
|
EOR #$FF ;Flip (as reset active low). ;2
|
|
AND $92 ;Compare with what was before ;3
|
|
AND #$01 ;And check only the reset switch ;2
|
|
BEQ CheckReset ;If no reset then branch. ;2
|
|
LDA $DE ;Has the Game Started? ;3
|
|
CMP #$FF ;If not then branch. ;2
|
|
BEQ SetupRoomObjects ;2
|
|
LDA #$11 ;Get the yellow castle room. ;2
|
|
STA $8A ;Make it the current room. ;3
|
|
STA $E2 ;Make it the previous room. ;3
|
|
LDA #$50 ;Get the X coordinate. ;2
|
|
STA $8B ;Make it the current ball X coordinate. ;3
|
|
STA $E3 ;Make it the previous ball X coordinate. ;3
|
|
LDA #$20 ;Get the Y coordinate. ;2
|
|
STA $8C ;Make it the current ball Y coordinate. ;3
|
|
STA $E4 ;Make it the previous ball Y coordinate. ;3
|
|
LDA #$00 ;2
|
|
STA $A8 ;Set the red dragon's state to OK. ;3
|
|
STA $AD ;Set the yellow dragon's state to OK. ;3
|
|
STA $B2 ;Set the green dragon's state to OK. ;3
|
|
STA $DF ;Set the note count to zero.. (ops!??) ;3
|
|
LDA #$A2 ;2
|
|
STA $9D ;Set no object being carried. ;3
|
|
CheckReset:
|
|
LDA SWCHB ;Get the console switches. ;4
|
|
EOR #$FF ;Flip (as select active low) ;2
|
|
AND $92 ;Compare with what was before. ;3
|
|
AND #$02 ;And check only the select switch. ;2
|
|
BEQ StoreSwitches ;Branch if select not being used. ;2
|
|
LDA $8A ;Get the Current Room. ;3
|
|
CMP #$00 ;Is it the "Number" room? ;2
|
|
BNE SetupRoomObjects ;Branch if not. ;2
|
|
LDA $DD ;Increment the level. ;3
|
|
CLC ;Number (by two). ;2
|
|
ADC #$02 ;2
|
|
CMP #$06 ;Have we reached the maximum? ;2
|
|
BCC ResetSetup ;2
|
|
LDA #$00 ;If yep then set back to zero. ;2
|
|
ResetSetup:
|
|
STA $DD ;Store the new level number. ;3
|
|
SetupRoomObjects:
|
|
LDA #$00 ;Set the current room to the ;2
|
|
STA $8A ;"Number" room. ;3
|
|
STA $E2 ;And the previous room. ;3
|
|
LDA #$00 ;Set the ball's Y coordinate to zero. ;2
|
|
STA $8C ;And the previous Y coordinate. ;3
|
|
STA $E4 ;(So can't be seen.) ;3
|
|
LDY $DD ;Get the level number. ;3
|
|
LDA Loc_4,Y ;Get the low pointer to object locations. ;4
|
|
STA $93 ;3
|
|
LDA Loc_5,Y ;Get the high pointer to object locations. ;4
|
|
STA $94 ;3
|
|
LDY #$30 ;Copy all the objects dynamic information. ;2
|
|
SetupRoomObjects_2:
|
|
LDA ($93),Y ;(the rooms and positions) into ;5
|
|
STA.wy $00A1,Y ;the working area. ;5
|
|
DEY ;2
|
|
BPL SetupRoomObjects_2 ;2
|
|
LDA $DD ;Get the level number. ;3
|
|
CMP #$04 ;Branch if level one. ;2
|
|
BCC SignalGameStart ;Or two (Where all objects are in defined areas.) ;2
|
|
JSR RandomizeLevel3 ;Put some objects in random rooms. ;6
|
|
JSR DoVSYNC ;Wait for VSYNC ;6
|
|
JSR PrintDisplay ;Display rooms and objects. ;6
|
|
SignalGameStart:
|
|
LDA #$00 ;Signal that the game has started. ;2
|
|
STA $DE ;3
|
|
LDA #$A2 ;Set no object being carried. ;2
|
|
STA $9D ;3
|
|
StoreSwitches:
|
|
LDA SWCHB ;Store the current console switches ;4
|
|
STA $92 ;3
|
|
RTS ;6
|
|
|
|
;Put objects in random rooms for level 3.
|
|
RandomizeLevel3:
|
|
LDY #$1E ;For each of the eleven objects.. ;2
|
|
RandomizeLevel3_2:
|
|
LDA $E5 ;Get the low input counter as seed. ;3
|
|
LSR ;2
|
|
LSR ;2
|
|
LSR ;Generate a psudo-random ;2
|
|
LSR ;room number. ;2
|
|
LSR ;2
|
|
SEC ;2
|
|
ADC $E5 ;Store the low input counter. ;3
|
|
STA $E5 ;3
|
|
AND #$1F ;Trim so represents a room value. ;2
|
|
CMP Loc_2,Y ;If it is less than the ;4
|
|
BCC RandomizeLevel3_2 ;lower bound for object then get another. ;2
|
|
CMP Loc_3,Y ;If it equals or is ;4
|
|
BEQ RandomizeLevel3_3 ;Less than the higher bound for object ;2
|
|
BCS RandomizeLevel3_2 ;Then continue (branch if higher) ;2
|
|
RandomizeLevel3_3:
|
|
LDX Loc_1,Y ;Get the dynamic data index for this object ;4
|
|
STA VSYNC,X ;Store the new room value. ;4
|
|
DEY ;2
|
|
DEY ;Goto the next object. ;2
|
|
DEY ;2
|
|
BPL RandomizeLevel3_2 ;Untill all done ;2
|
|
RTS ;6
|
|
|
|
;Room Bounds Data.
|
|
;Ex. the chalise at location &B9 can only exist in rooms 13-1A for
|
|
; level 3.
|
|
Loc_1:
|
|
.byte $B9 ;
|
|
Loc_2:
|
|
.byte $13 ;Chalise
|
|
Loc_3:
|
|
.byte $1A ;
|
|
.byte $A4,$01,$1D ;Red Dragon
|
|
.byte $A9,$01,$1D ;Yellow Dragon
|
|
.byte $AE,$01,$1D ;Green Dragon
|
|
.byte $B6,$01,$1D ;Sword
|
|
.byte $BC,$01,$1D ;Bridge
|
|
.byte $BF,$01,$1D ;Yellow Key
|
|
.byte $C2,$01,$16 ;White Key
|
|
.byte $C5,$01,$12 ;Black Key
|
|
.byte $CB,$01,$1D ;Bat
|
|
.byte $B3,$01,$1D ;Magnet
|
|
|
|
Loc_4:
|
|
.byte <Game1Objects ;Pointer to object locations for game 01.
|
|
Loc_5:
|
|
.byte >Game1Objects ; --continued.
|
|
.byte <Game2Objects,>Game2Objects ;Pointer to object locations for game 02.
|
|
.byte <Game2Objects,>Game2Objects ;Pointer to object locations for game 03.
|
|
|
|
;Object locations (room and coordinate) for game 01.
|
|
Game1Objects:
|
|
.byte $15,$51,$12 ;Black dot (Room, X, Y)
|
|
.byte $0E,$50,$20,$00,$00 ;Red Dragon (Room, X, Y, Movement, State)
|
|
.byte $01,$50,$20,$00,$00 ;Yellow Dragon (Room, X, Y, Movement, State)
|
|
.byte $1D,$50,$20,$00,$00 ;Green Dragon (Room, X, Y, Movement, State)
|
|
.byte $1B,$80,$20 ;Magnet (Room,X,Y)
|
|
.byte $12,$20,$20 ;Sword (Room,X,Y)
|
|
.byte $1C,$30,$20 ;Challise (Room,X,Y)
|
|
.byte $04,$29,$37 ;Bridge (Room,X,Y)
|
|
.byte $11,$20,$40 ;Yellow Key (Room,X,Y)
|
|
.byte $0E,$20,$40 ;White Key (Room,X,Y)
|
|
.byte $1D,$20,$40 ;Black Key (Room,X,Y)
|
|
.byte $1C ;Portcullis State
|
|
.byte $1C ;Portcullis State
|
|
.byte $1C ;Portcullis State
|
|
.byte $1A,$20,$20,$00,$00 ;Bat (Room, X, Y, Movement, State)
|
|
.byte $78,$00 ;Bat (Carrying, Fed-Up)
|
|
|
|
;Object locations (room and coordinate) for Games 02 and 03.
|
|
Game2Objects:
|
|
.byte $15,$51,$12 ;Black Dot (Room,X,Y)
|
|
.byte $14,$50,$20,$A0,$00 ;Red Dragon (Room,X,Y,Movement,State)
|
|
.byte $19,$50,$20,$A0,$00 ;Yellow Dragon (Room,X,Y,Movement,State)
|
|
.byte $04,$50,$20,$A0,$00 ;Green Dragon (Room,X,Y,Movement,State)
|
|
.byte $0E,$80,$20 ;Magnet (Room,X,Y)
|
|
.byte $11,$20,$20 ;Sword (Room,X,Y)
|
|
.byte $14,$30,$20 ;Chalise (Room,X,Y)
|
|
.byte $0B,$40,$40 ;Bridge (Room,X,Y)
|
|
.byte $09,$20,$40 ;Yellow Key (Room,X,Y)
|
|
.byte $06,$20,$40 ;White Key (Room,X,Y)
|
|
.byte $19,$20,$40 ;Black Key (Room,X,Y)
|
|
.byte $1C ;Portcullis State
|
|
.byte $1C ;Portcullis State
|
|
.byte $1C ;Portcullis State
|
|
.byte $02,$20,$20,$90,$00 ;Bat (Room,X,Y,Movement,State)
|
|
.byte $78,$00 ;Bat (Carrying, Fed-Up)
|
|
|
|
;Check ball collisions and move ball.
|
|
BallMovement:
|
|
LDA CXBLPF ;3
|
|
AND #$80 ;Get ball-playfield collision ;2
|
|
BNE PlayerCollision ;Branch if collision (Player-Wall) ;2
|
|
|
|
LDA CXM0FB ;3
|
|
AND #$40 ;Get ball-missile00 collision. ;2
|
|
BNE PlayerCollision ;Branch if collision. (Player-Left Thin) ;2
|
|
|
|
LDA CXM1FB ;3
|
|
AND #$40 ;Get ball-missile01 collision. ;2
|
|
BEQ BallMovement_2 ;Branch if no collision. ;2
|
|
|
|
LDA $96 ;If object2 (to print) is ;3
|
|
CMP #$87 ; not the black dot then collide. ;2
|
|
BNE PlayerCollision ;2
|
|
BallMovement_2:
|
|
LDA CXP0FB ;3
|
|
AND #$40 ;Get ball-player00 collision. ;2
|
|
BEQ BallMovement_3 ;If no collision then branch. ;2
|
|
|
|
LDA $95 ;If object1 (to print) is ;3
|
|
CMP #$00 ; not the invisible surround then ;2
|
|
BNE PlayerCollision ; branch (collision) ;2
|
|
|
|
BallMovement_3:
|
|
LDA CXP1FB ;3
|
|
AND #$40 ;Get ball-player01 collision. ;2
|
|
BEQ NoCollision ;If no collision then branch. ;2
|
|
|
|
LDA $96 ;If player01 to print is ;3
|
|
CMP #$00 ; not the invisible surround then ;2
|
|
BNE PlayerCollision ; branch (collision) ;2
|
|
|
|
JMP NoCollision ;No collision - branch. ;3
|
|
|
|
;Player collided (with something)
|
|
PlayerCollision:
|
|
CPY #$02 ;Are we checking for the bridge? ;2
|
|
BNE ReadStick ;If not, branch. ;2
|
|
|
|
LDA $9D ;Get the object being carried. ;3
|
|
CMP #$5A ; Branch if it is the bridge. ;2
|
|
BEQ ReadStick ;2
|
|
|
|
LDA $8A ;Get the current room. ;3
|
|
CMP $BC ;Is the bridge in this room. ;3
|
|
BNE ReadStick ;If not branch. ;2
|
|
|
|
;Check going through the bridge.
|
|
LDA $8B ;Get the ball's X coordinate. ;3
|
|
SEC ;2
|
|
SBC $BD ;Subtract the bridge's X coordinate. ;3
|
|
CMP #$0A ;If less than &0A then forget it. ;2
|
|
BCC ReadStick ;2
|
|
|
|
CMP #$17 ;If more than &17 then forget it. ;2
|
|
BCS ReadStick ;2
|
|
|
|
LDA $BE ;Get the bridge's Y coordinate. ;3
|
|
SEC ;2
|
|
SBC $8C ;Subtrac the ball's Y coordinate. ;3
|
|
CMP #$FC ;2
|
|
BCS NoCollision ;If more than &FC then going through bridge. ;2
|
|
|
|
CMP #$19 ;If more than &19 then forget it. ;2
|
|
BCS ReadStick ;2
|
|
|
|
;No collision (and going through bridge)
|
|
NoCollision:
|
|
LDA #$FF ;Reset the joystick input. ;2
|
|
STA $99 ;3
|
|
LDA $8A ;Get the current room. ;3
|
|
STA $E2 ; and store temporarily. ;3
|
|
LDA $8B ;Get the ball's X coordinate. ;3
|
|
STA $E3 ; and store temporarily. ;3
|
|
LDA $8C ;Get the ball's Y coordinate. ;3
|
|
STA $E4 ;And Store Temporarily. ;3
|
|
|
|
;Read Sticks
|
|
ReadStick:
|
|
CPY #$00 ;???Is game in first phase? ;2
|
|
BNE ReadStick_2 ;If not, don't bother with joystick read. ;2
|
|
|
|
LDA SWCHA ;Read joysticks. ;4
|
|
STA $99 ; and store value. ;3
|
|
|
|
ReadStick_2:
|
|
LDA $E2 ;Get Temporary room. ;3
|
|
STA $8A ; and make it the current room. ;3
|
|
LDA $E3 ;Get temporary X coordinate ;3
|
|
STA $8B ; and make it the man's X coordinate. ;3
|
|
LDA $E4 ;Get temporary Y coordinate ;3
|
|
STA $8C ; and make it the man's Y coordinate. ;3
|
|
|
|
LDA $99 ;Get the Joystick position. ;3
|
|
ORA ReadStick_3,Y ;Merge out movement not allowed in this phase. ;4
|
|
STA $9B ;And store cooked movement. ;3
|
|
|
|
LDY #$03 ;Set the delta for the ball. ;2
|
|
LDX #$8A ;Point to ball's coordiates. ;2
|
|
JSR MoveGroundObject ;Move the ball ;6
|
|
RTS ;6
|
|
|
|
;Joystick Merge Values
|
|
ReadStick_3:
|
|
.byte $00,$C0,$30 ;No change, No horizontal, No vertical.
|
|
|
|
;Deal with object pickup and putdown.
|
|
PickupPutdown:
|
|
ROL INPT4 ;Get joystick trigger. ;5
|
|
ROR $D7 ;Merget into joystick record. ;5
|
|
LDA $D7 ;Get joystick record. ;3
|
|
AND #$C0 ;Merget out previous presses. ;2
|
|
CMP #$40 ;Was it previously pressed? ;2
|
|
BNE PickupPutdown_2 ;If not branch. ;2
|
|
|
|
LDA #$A2 ;2
|
|
CMP $9D ;If nothing is being carried ;3
|
|
BEQ PickupPutdown_2 ; then branch. ;2
|
|
|
|
STA $9D ;Drop object. ;3
|
|
LDA #$04 ;Set noise type to four. ;2
|
|
STA $E0 ;3
|
|
LDA #$04 ;Set noise count to four. ;2
|
|
STA $DF ;3
|
|
|
|
PickupPutdown_2:
|
|
LDA #$FF ;???? ;2
|
|
STA $98 ;3
|
|
|
|
;Check for collision.
|
|
LDA CXP0FB ;3
|
|
AND #$40 ;Get Ball-Player00 collision. ;2
|
|
BEQ PickupPutdown_3 ;If nothing occured then branch. ;2
|
|
|
|
;With Player00
|
|
LDA $95 ;Get type of Player00 ;3
|
|
STA $97 ;And Store. ;3
|
|
JMP CollisionDetected ;Deal with collision. ;3
|
|
|
|
PickupPutdown_3:
|
|
LDA CXP1FB ;3
|
|
AND #$40 ;Get Ball-Player01 collision. ;2
|
|
BEQ PickupPutdown_4 ;If nothing has happened, branch. ;2
|
|
|
|
LDA $96 ;Get type of Player01 ;3
|
|
STA $97 ; and store. ;3
|
|
JMP CollisionDetected ;Deal with collision. ;3
|
|
|
|
PickupPutdown_4:
|
|
JMP NoObject ;Deal with no collision (return). ;3
|
|
|
|
;Collision occured.
|
|
CollisionDetected:
|
|
LDX $97 ;Get the object collided with. ;3
|
|
JSR GetObjectAddress ;Get it's dynamic information. ;6
|
|
LDA $97 ;Get the object collided with. ;3
|
|
CMP #$51 ;Is it carriable? ;2
|
|
BCC NoObject ;If not, branch. ;2
|
|
|
|
LDY #$00 ;2
|
|
LDA ($93),Y ;Get the object's room. ;5
|
|
CMP $8A ;Is it in the current room? ;3
|
|
BNE NoObject ;If not, branch. ;2
|
|
|
|
LDA $97 ;Get the object collided with. ;3
|
|
CMP $9D ;Is it the object being carried? ;3
|
|
BEQ PickupObject ;If so, branch (and actually pick it up.) ;2
|
|
|
|
LDA #$05 ;Set noise type to five. ;2
|
|
STA $E0 ;3
|
|
LDA #$04 ;Set noise type to four. ;2
|
|
STA $DF ;3
|
|
|
|
PickupObject:
|
|
LDA $97 ;Set the object as being ;3
|
|
STA $9D ; carried. ;3
|
|
|
|
LDX $93 ;Get the dynamice address low byte. ;3
|
|
LDY #$06 ;2
|
|
LDA $99 ;???? ;3
|
|
JSR MoveObjectDelta ;???? ;6
|
|
|
|
LDY #$01 ;2
|
|
LDA ($93),Y ;Get the object's X coordinate. ;5
|
|
SEC ;2
|
|
SBC $8B ;Subtract the ball's X coordinate. ;3
|
|
STA $9E ; and store the difference. ;3
|
|
LDY #$02 ;2
|
|
LDA ($93),Y ;Get the object's Y coordinate. ;5
|
|
SEC ;2
|
|
SBC $8C ;Subtract the Ball's Y coordinate. ;3
|
|
STA $9F ; and store the difference. ;3
|
|
|
|
;No collision
|
|
NoObject:
|
|
RTS ;6
|
|
|
|
|
|
;Move the carried object
|
|
MoveCarriedObject:
|
|
LDX $9D ;Get the object being carried. ;3
|
|
CPX #$A2 ;If nothing then branch (return) ;2
|
|
BEQ MoveCarriedObject_2 ;2
|
|
|
|
JSR GetObjectAddress ;Get it's dynamic information. ;6
|
|
LDY #$00 ;2
|
|
|
|
LDA $8A ;Get the current room. ;3
|
|
STA ($93),Y ; and stroe the object's current room. ;6
|
|
LDY #$01 ;2
|
|
|
|
LDA $8B ;Get the ball's X coordinate. ;3
|
|
CLC ;2
|
|
ADC $9E ;Add the X difference. ;3
|
|
STA ($93),Y ; and store as the object's X coordinate. ;6
|
|
LDY #$02 ;2
|
|
LDA $8C ;Get the ball's Y coordinate. ;3
|
|
CLC ;2
|
|
ADC $9F ;Add the Y difference. ;3
|
|
STA ($93),Y ; and store as the object's Y coordinate. ;6
|
|
|
|
LDY #$00 ;Set no delta. ;2
|
|
LDA #$FF ;Set no movement. ;2
|
|
LDX $93 ;Get the object's dynamic address. ;3
|
|
JSR MoveGroundObject ;Move the object. ;6
|
|
MoveCarriedObject_2:
|
|
RTS ;6
|
|
|
|
;Move the object.
|
|
MoveGroundObject:
|
|
JSR MoveObjectDelta ;Move the object by delta. ;6
|
|
LDY #$02 ;Set to do the three ;2
|
|
MoveGroundObject_2:
|
|
STY $9A ; portcullises. ;3
|
|
LDA.wy $00C8,Y ;Get the portal state. ;4
|
|
CMP #$1C ;Is it in a closed state? ;2
|
|
BEQ GetPortal ;If not, next portal. ;2
|
|
|
|
;Deal with object moving out of a castle.
|
|
LDY $9A ;Get port number. ;3
|
|
LDA VSYNC,X ;Get object's room number. ;4
|
|
CMP EntryRoomOffsets,Y ;Is it in a castle entry room. ;4
|
|
BNE GetPortal ;If not, next portal. ;2
|
|
|
|
LDA WSYNC,X ;Get the object's Y coordinate. ;4
|
|
CMP #$0D ;Is it above &OD i.e at the bottom. ;2
|
|
BPL GetPortal ;If so then branch. ;2
|
|
|
|
LDA CastleRoomOffsets,Y ;Get the castle room. ;4
|
|
STA VSYNC,X ;And put the object in the castle room. ;4
|
|
LDA #$50 ;2
|
|
STA VBLANK,X ;Set the object's new X coordinate. ;4
|
|
LDA #$2C ;2
|
|
STA WSYNC,X ;Set the new object's Y coordinate. ;4
|
|
LDA #$01 ;2
|
|
STA.wy $00C8,Y ;Set the portcullis state to 01. ;5
|
|
RTS ;6
|
|
|
|
GetPortal:
|
|
LDY $9A ;Get the portcullis number. ;3
|
|
DEY ; goto next, ;2
|
|
BPL MoveGroundObject_2 ; and continue. ;2
|
|
|
|
;Check and Deal with Up.
|
|
LDA WSYNC,X ;Get the object's Y coordinate. ;4
|
|
CMP #$6A ;Has it reched above the top. ;2
|
|
BMI DealWithLeft ;If not, branch. ;2
|
|
|
|
LDA #$0D ;Set new Y coordinate to bottom. ;2
|
|
STA WSYNC,X ;4
|
|
LDY #$05 ;Get the direction wanted. ;2
|
|
JMP GetNewRoom ;Go and get new room. ;3
|
|
|
|
;Check and Deal with Left.
|
|
DealWithLeft:
|
|
LDA VBLANK,X ;Get the object's X coordinate. ;4
|
|
CMP #$03 ;Is it Three or less? ;2
|
|
BCC DealWithLeft_2 ;IF so, branch. (off to left) ;2
|
|
|
|
CMP #$F0 ;Is it's &F0 or more. ;2
|
|
BCS DealWithLeft_2 ;If so, branch. (off to right) ;2
|
|
|
|
JMP DealWithDown ;3
|
|
|
|
DealWithLeft_2:
|
|
CPX #$8A ;Are we dealling with the ball? ;2
|
|
BEQ DealWithLeft_3 ;If so Branch. ;2
|
|
|
|
LDA #$9A ;Set new X coordinate for the others. ;2
|
|
JMP DealWithLeft_4 ;3
|
|
|
|
DealWithLeft_3:
|
|
LDA #$9E ;Set new X coordinate for the ball. ;2
|
|
|
|
DealWithLeft_4:
|
|
STA VBLANK,X ;Store the next X coordinate. ;4
|
|
LDY #$08 ;And get the direction wanted. ;2
|
|
JMP GetNewRoom ;Go and get new room. ;3
|
|
|
|
;Check and Deal with Down.
|
|
DealWithDown:
|
|
LDA WSYNC,X ;Get object's Y coordinate. ;4
|
|
CMP #$0D ;If it's greater than &0D then ;2
|
|
BCS DealWithRight ;Branch. ;2
|
|
|
|
LDA #$69 ;Set new Y coordinate. ;2
|
|
STA WSYNC,X ;4
|
|
LDY #$07 ;Get the direction wanted. ;2
|
|
JMP GetNewRoom ;Go and get new room. ;3
|
|
|
|
;Check and Deal with Right.
|
|
DealWithRight:
|
|
LDA VBLANK,X ;Get the object's X coordinate. ;4
|
|
CPX #$8A ;Are we dealing with the ball. ;2
|
|
BNE DealWithRight_2 ;Branch if not. ;2
|
|
|
|
CMP #$9F ;Has the object reached the right? ;2
|
|
BCC MovementReturn ;Branch if not. ;2
|
|
|
|
LDA VSYNC,X ;Get the Ball's Room. ;4
|
|
CMP #$03 ;Is it room #3 (Right to secret room) ;2
|
|
BNE DealWithRight_3 ;Branch if not. ;2
|
|
|
|
LDA $A1 ;Check the room of the black dot. ;3
|
|
CMP #$15 ;Is it in the hidden room area? ;2
|
|
BEQ DealWithRight_3 ;If so, Branch. ;2
|
|
|
|
;Manually change to secret room.
|
|
LDA #$1E ;Set room to secret room. ;2
|
|
STA VSYNC,X ;And make it current. ;4
|
|
LDA #$03 ;Set the X coordinate. ;2
|
|
STA VBLANK,X ;4
|
|
JMP MovementReturn ;And Exit. ;3
|
|
|
|
DealWithRight_2:
|
|
CMP #$9B ;Has the object reached the right of the screen? ;2
|
|
BCC MovementReturn ;Branch if not (no room change) ;2
|
|
|
|
DealWithRight_3:
|
|
LDA #$03 ;Set the next X coordinate. ;2
|
|
STA VBLANK,X ;4
|
|
LDY #$06 ;And get the direction wanted. ;2
|
|
JMP GetNewRoom ;Get the new room. ;3
|
|
|
|
;Get new room
|
|
GetNewRoom:
|
|
LDA VSYNC,X ;Get the object's room. ;4
|
|
JSR RoomNumToAddress ;Convert it to an address. ;6
|
|
LDA ($93),Y ;Get the adjacent room. ;5
|
|
JSR AdjustRoomLevel ;Deal with the level differences. ;6
|
|
STA VSYNC,X ; and store as new object's room. ;4
|
|
|
|
MovementReturn:
|
|
RTS ;6
|
|
|
|
;Move the object in direction by delta.
|
|
MoveObjectDelta:
|
|
STA $9B ;Stored direction wanted. ;3
|
|
MoveObjectDelta_2:
|
|
DEY ;Count down the delta. ;2
|
|
BMI MoveObjectDelta_7 ;2
|
|
|
|
LDA $9B ;Get direction wanted. ;3
|
|
AND #$80 ;Check for right move. ;2
|
|
BNE MoveObjectDelta_3 ;If no move right then branch. ;2
|
|
|
|
INC VBLANK,X ;Increment the X coordinate. ;6
|
|
|
|
MoveObjectDelta_3:
|
|
LDA $9B ;Get the direction wanted. ;3
|
|
AND #$40 ;Check for left move. ;2
|
|
BNE MoveObjectDelta_4 ;If no move left then branch. ;2
|
|
|
|
DEC VBLANK,X ;Decrement the X coordinate. ;6
|
|
|
|
MoveObjectDelta_4:
|
|
LDA $9B ;Get the direction wanted. ;3
|
|
AND #$10 ;Check for move up. ;2
|
|
BNE MoveObjectDelta_5 ;If no move up then branch. ;2
|
|
INC WSYNC,X ;6
|
|
|
|
MoveObjectDelta_5:
|
|
LDA $9B ;Get direction wanted. ;3
|
|
AND #$20 ;Check for move down. ;2
|
|
BNE MoveObjectDelta_6 ;If no move down the branch. ;2
|
|
|
|
DEC WSYNC,X ;Decrement the Y coordinate. ;6
|
|
|
|
MoveObjectDelta_6:
|
|
JMP MoveObjectDelta_2 ;Keep going until delta finished. ;3
|
|
MoveObjectDelta_7:
|
|
RTS ;6
|
|
|
|
|
|
;Adjust room for different levels.
|
|
AdjustRoomLevel:
|
|
CMP #$80 ;Is the room number ;2
|
|
BCC AdjustRoomLevel_2 ; above &80? ;2
|
|
|
|
SEC ;2
|
|
SBC #$80 ;Remove the &80 flag and ;2
|
|
STA $D8 ; store the room number. ;3
|
|
LDA $DD ;Get the level number. ;3
|
|
LSR ;Devide it by two. ;2
|
|
CLC ;2
|
|
ADC $D8 ;Add to the original room. ;3
|
|
TAY ;2
|
|
LDA RoomDiffs,Y ;Use as an offset to get the next room. ;4
|
|
AdjustRoomLevel_2:
|
|
RTS ;6
|
|
|
|
|
|
;Get player-ball collision.
|
|
PBCollision:
|
|
CMP $95 ;Is it the rist object? ;3
|
|
BEQ PBCollision_2 ;YES - Then Branch. ;2
|
|
|
|
CMP $96 ;Is it the second object? ;3
|
|
BEQ PBCollision_3 ;YES - Then Branch. ;2
|
|
|
|
LDA #$00 ;Otherewise nothing. ;2
|
|
RTS ;6
|
|
|
|
PBCollision_2:
|
|
LDA CXP0FB ;Get player00-ball collision. ;3
|
|
AND #$40 ;2
|
|
RTS ;6
|
|
PBCollision_3:
|
|
LDA CXP1FB ;Get player01-ball collision. ;3
|
|
AND #$40 ;2
|
|
RTS ;6
|
|
|
|
|
|
;Find which object has hit object wanted.
|
|
FindObjHit:
|
|
LDA CXPPMM ;Get Player00-Player01 ;3
|
|
AND #$80 ; collision. ;2
|
|
BEQ FindObjHit_2 ;If nothing, Branch. ;2
|
|
|
|
CPX $95 ;Is object 1 the one being hit? ;3
|
|
BEQ FindObjHit_3 ;If so, Branch. ;2
|
|
|
|
CPX $96 ;Is object 2 the one being hit? ;3
|
|
BEQ FindObjHit_4 ;If so, Branch. ;2
|
|
FindObjHit_2:
|
|
LDA #$A2 ;Therefore select the other. ;2
|
|
RTS ;6
|
|
FindObjHit_3:
|
|
LDA $96 ;Therefore select the other. ;3
|
|
RTS ;6
|
|
FindObjHit_4:
|
|
LDA $95 ;Therefore select the other. ;3
|
|
RTS ;6
|
|
|
|
|
|
;Move object.
|
|
MoveGameObject:
|
|
JSR GetLinkedObject ;Get liked object and movement. ;6
|
|
LDX $D5 ;Get dynamic data address. ;3
|
|
LDA $9B ;Get Movement. ;3
|
|
BNE MoveGameObject_2 ;If movement then branch. ;2
|
|
|
|
LDA RSYNC,X ;Use old movement. ;4
|
|
|
|
MoveGameObject_2:
|
|
STA RSYNC,X ;Stoe the new movement. ;4
|
|
LDY $D4 ;Get the object's Delta. ;3
|
|
JSR MoveGroundObject ;Move the object. ;6
|
|
RTS ;6
|
|
|
|
|
|
;Find liked object and get movement.
|
|
GetLinkedObject:
|
|
LDA #$00 ;Set index to zero. ;2
|
|
STA $E1 ;3
|
|
GetLinkedObject_2:
|
|
LDY $E1 ;Get index. ;3
|
|
LDA ($D2),Y ;Get first object. ;5
|
|
TAX ;2
|
|
INY ;2
|
|
LDA ($D2),Y ;Get second object. ;5
|
|
TAY ;2
|
|
LDA VSYNC,X ;Get object1;s room. ;4
|
|
CMP.wy $0000,Y ;Combare with object2's room. ;4
|
|
BNE GetLinkedObject_3 ;If not the same room then branch. ;2
|
|
|
|
CPY $D6 ;Have we matched the second object ;3
|
|
BEQ GetLinkedObject_3 ; for difficulty (if so, carry on). ;2
|
|
|
|
CPX $D6 ;Have we matched the first object ;3
|
|
BEQ GetLinkedObject_3 ; for difficulty (if so, carry on). ;2
|
|
|
|
JSR GetLinkedObject_4 ;Get object's movement. ;6
|
|
RTS ;6
|
|
GetLinkedObject_3:
|
|
INC $E1 ;Increment the index. ;5
|
|
INC $E1 ;5
|
|
LDY $E1 ;Get the index number. ;3
|
|
LDA ($D2),Y ;Check for end of sequence. ;5
|
|
BNE GetLinkedObject_2 ;If not branch. ;2
|
|
|
|
LDA #$00 ;Set no move if no ;2
|
|
STA $9B ; liked object is found. ;3
|
|
RTS ;6
|
|
|
|
|
|
;Work out object's movement.
|
|
GetLinkedObject_4:
|
|
LDA #$FF ;Set object movement to none. ;2
|
|
STA $9B ;3
|
|
|
|
LDA.wy $0000,Y ;Get oject2's room. ;4
|
|
CMP VSYNC,X ;Compare it with object's room. ;4
|
|
BNE GetLinkedObject_8 ;If not the same, forget it. ;2
|
|
|
|
LDA.wy $0001,Y ;Get Object2's X coordinate. ;4
|
|
CMP VBLANK,X ;Get Object1;s X coordinate. ;4
|
|
BCC GetLinkedObject_5 ;If Object2 to left of Object1 then Branch. ;2
|
|
BEQ GetLinkedObject_6 ;If Object2 on Object1 then Branch. ;2
|
|
|
|
LDA $9B ;Get Object Movement. ;3
|
|
AND #$7F ;Signal a move right. ;2
|
|
STA $9B ;3
|
|
JMP GetLinkedObject_6 ;Now try Vertical. ;3
|
|
GetLinkedObject_5:
|
|
LDA $9B ;Get object movent. ;3
|
|
AND #$BF ;Signal a move left. ;2
|
|
STA $9B ;3
|
|
|
|
GetLinkedObject_6:
|
|
LDA.wy $0002,Y ;Get Object2's Y Coordinate. ;4
|
|
CMP WSYNC,X ;Get Object1's X Coordinate. ;4
|
|
BCC GetLinkedObject_7 ;If Object2 Below Object1 Then Branch. ;2
|
|
BEQ GetLinkedObject_8 ;If Object2 on Object1 Then Branch. ;2
|
|
|
|
LDA $9B ;Get Object Movement. ;3
|
|
AND #$EF ;Signal a move up. ;2
|
|
STA $9B ;3
|
|
JMP GetLinkedObject_8 ;Jump to Finish. ;3
|
|
|
|
GetLinkedObject_7:
|
|
LDA $9B ;Get Object Movement. ;3
|
|
AND #$DF ;Signal a move down. ;2
|
|
STA $9B ;3
|
|
|
|
GetLinkedObject_8:
|
|
LDA $9B ;Get the Move. ;3
|
|
RTS ;6
|
|
|
|
|
|
;Move the Red Dragon
|
|
MoveRedDragon:
|
|
LDA #<RedDragMatrix ;2
|
|
STA $D2 ;Set the Low address of Object Store. ;3
|
|
LDA #>RedDragMatrix ;2
|
|
STA $D3 ;Set the High address of Object Store. ;3
|
|
LDA #$03 ;2
|
|
STA $D4 ;Set the Dragon's Delta ;3
|
|
LDX #$36 ;Select Dragon #1 : Red ;2
|
|
JSR MoveDragon ;6
|
|
RTS ;6
|
|
|
|
;Red Dragon Object Matrix
|
|
RedDragMatrix:
|
|
.byte $B6,$A4 ;Sword, Red Dragon
|
|
.byte $A4,$8A ;Red Dragon, Ball
|
|
.byte $A4,$B9 ;Red Dragon, Chalise
|
|
.byte $A4,$C2 ;Red Dragon, White Key
|
|
.byte $00
|
|
|
|
;Move the Yellow Dragon.
|
|
MoveYellowDragon:
|
|
LDA #<YelDragMatrix ;2
|
|
STA $D2 ;Set the Low Address of Object Store. ;3
|
|
LDA #>YelDragMatrix ;2
|
|
STA $D3 ;Set the High Address of Object Store. ;3
|
|
LDA #$02 ;2
|
|
STA $D4 ;Set the Yellow Dragon's Delta. ;3
|
|
LDX #$3F ;2
|
|
JSR MoveDragon ;Select Dragon #2 : Yellow. ;6
|
|
RTS ;6
|
|
|
|
;Yellow Dragon's Object Matrix
|
|
YelDragMatrix:
|
|
.byte $B6,$A9 ;Sword, Yellow Dragon
|
|
.byte $BF,$A9 ;Yellow Key, Yellow Dragon
|
|
.byte $A9,$8A ;Yellow Dragon, Ball
|
|
.byte $A9,$B9 ;Yellow Dragon, Chalise
|
|
.byte $00
|
|
|
|
|
|
;Move the Green Dragon
|
|
MoveGreenDragon:
|
|
LDA #<GreenDragonMatrix ;2
|
|
STA $D2 ;Set Low Address of Object Store. ;3
|
|
LDA #>GreenDragonMatrix ;2
|
|
STA $D3 ;Set High Address of Object Store. ;3
|
|
LDA #$02 ;2
|
|
STA $D4 ;Set the Green Dragon's Delta. ;3
|
|
LDX #$48 ;Select Dragon #3 : Green ;2
|
|
JSR MoveDragon ;6
|
|
RTS ;6
|
|
|
|
;Green Dragon's Object Matrix
|
|
GreenDragonMatrix:
|
|
.byte $B6,$AE ;Sword, Green Dragon
|
|
.byte $AE,$8A ;Green Dragon, Ball
|
|
.byte $AE,$B9 ;Green Dragon Chalise
|
|
.byte $AE,$BC ;Green Dragon, Bridge
|
|
.byte $AE,$B3 ;Green Dragon, Magnet
|
|
.byte $AE,$C5 ;Green Dragon, Black Key
|
|
.byte $00
|
|
|
|
|
|
;Move A Dragon
|
|
MoveDragon:
|
|
STX $A0 ;Save Object were dealing with. ;3
|
|
LDA Store1,X ;Get the Object's Dynamic Data. ;4
|
|
TAX ;2
|
|
LDA NUSIZ0,X ;Get the Object's State. ;4
|
|
CMP #$00 ;Is it in State 00 (Normal #1) ;2
|
|
BNE MoveDragon_6 ;Branch if not. ;2
|
|
|
|
;Dragon Normal (State 1)
|
|
LDA SWCHB ;Read console switches. ;4
|
|
AND #$80 ;Check for P1 difficulty. ;2
|
|
BEQ MoveDragon_2 ;If Amateur Branch. ;2
|
|
|
|
LDA #$00 ;Set Hard - Ignore Nothing ;2
|
|
JMP MoveDragon_3 ;3
|
|
|
|
MoveDragon_2:
|
|
LDA #$B6 ;Set Easy - Ignore Sword. ;2
|
|
|
|
MoveDragon_3:
|
|
STA $D6 ;Store Difficulty ;3
|
|
STX $D5 ;Store Dynamic Data Address. ;3
|
|
JSR MoveGameObject ;6
|
|
|
|
LDA $A0 ;Get Object ;3
|
|
JSR PBCollision ; And get the Player-Ball collision. ;6
|
|
BEQ MoveDragon_4 ;If None Then Branch. ;2
|
|
|
|
LDA SWCHB ;Get Console Switched. ;4
|
|
ROL ;Move P0 difficulty to ;2
|
|
ROL ; bit 01 position. ;2
|
|
ROL ;2
|
|
AND #$01 ;Mask it out. ;2
|
|
ORA $DD ;Merget in the Level Number. ;3
|
|
TAY ;Create Lookup. ;2
|
|
LDA DragonDiff,Y ;Get New State. ;4
|
|
STA NUSIZ0,X ;Store as Dragon's State (Open Mouthed). ;4
|
|
LDA $E3 ;3
|
|
STA VBLANK,X ;Get Temp Ball X Coord and Store as Dragon's. ;4
|
|
LDA $E4 ;3
|
|
STA WSYNC,X ;Get Temp Ball Y Coord and Store as Dragon's ;4
|
|
LDA #$01 ;2
|
|
STA $E0 ;Set Noise Type to 01 ;3
|
|
LDA #$10 ;2
|
|
STA $DF ;Set Noise Count to 10 i.e. make roar noise. ;3
|
|
|
|
MoveDragon_4:
|
|
STX $9A ;Store Object's Dynamic Data Address. ;3
|
|
LDX $A0 ;Get the Object Number. ;3
|
|
JSR FindObjHit ;See if anoher object has hit the dragon. ;6
|
|
LDX $9A ;Get the Object Address. ;3
|
|
CMP #$51 ;Has the Sword hit the Dragon? ;2
|
|
BNE MoveDragon_5 ;If Not, Branch. ;2
|
|
|
|
LDA #$01 ;Set the State to 01 (Dead) ;2
|
|
STA NUSIZ0,X ;4
|
|
LDA #$03 ;Set Sound Three. ;2
|
|
STA $E0 ;3
|
|
LDA #$10 ;Set a Noise count of &10. ;2
|
|
STA $DF ;3
|
|
|
|
MoveDragon_5:
|
|
JMP MoveDragon_9 ;Jump to Finish. ;3
|
|
|
|
MoveDragon_6:
|
|
CMP #$01 ;Is it in State 01 (Dead) ;2
|
|
BEQ MoveDragon_9 ;Branch if So (Return) ;2
|
|
|
|
CMP #$02 ;Is it int State 02 (Normal #2) ;2
|
|
BNE MoveDragon_7 ;Branch if Not. ;2
|
|
|
|
;Normal Dragon State 2 (Eaten Ball)
|
|
LDA VSYNC,X ;Get the Dragon's Current Room. ;4
|
|
STA $8A ;Store as the Ball's Current Room ;3
|
|
STA $E2 ; and Previous Room. ;3
|
|
LDA VBLANK,X ;Get the Dragon's X Coordinate. ;4
|
|
CLC ;2
|
|
ADC #$03 ;Adjust ;2
|
|
STA $8B ; and store as the ball's X coordinate. ;3
|
|
STA $E3 ; and previous X coordinate. ;3
|
|
LDA WSYNC,X ;Get the Dragon's Y coordinate. ;4
|
|
SEC ;2
|
|
SBC #$0A ;Adjust ;2
|
|
STA $8C ; and store as the ball's Y coordinate. ;3
|
|
STA $E4 ; and the previous Y coordinate. ;3
|
|
JMP MoveDragon_9 ;3
|
|
|
|
|
|
;Dragon Roaring.
|
|
MoveDragon_7:
|
|
INC NUSIZ0,X ;Increment the Dragon's State. ;6
|
|
LDA NUSIZ0,X ;Get it's State. ;4
|
|
CMP #$FC ;Is it near the end? ;2
|
|
BCC MoveDragon_9 ;If Not, Branch. ;2
|
|
|
|
LDA $A0 ;Get the Dragon's Number. ;3
|
|
JSR PBCollision ;Check if the Ball is colliding. ;6
|
|
BEQ MoveDragon_9 ;If not, Branch. ;2
|
|
|
|
LDA #$02 ;Set the State to State 02 : Eaten ;2
|
|
STA NUSIZ0,X ;4
|
|
LDA #$02 ;Set noise two. ;2
|
|
STA $E0 ;3
|
|
LDA #$10 ;Set the Count of Noise to &10. ;2
|
|
STA $DF ;3
|
|
LDA #$9B ;Get the Maximum X Coordinate. ;2
|
|
CMP VBLANK,X ;Compare with the Dragon's X Coordinate. ;4
|
|
BEQ MoveDragon_8 ;2
|
|
BCS MoveDragon_8 ;2
|
|
|
|
STA VBLANK,X ;If too large then Use It. ;4
|
|
|
|
MoveDragon_8:
|
|
LDA #$17 ;Set Minimum Y Coordinate. ;2
|
|
CMP WSYNC,X ;Compare with the Dragon's Y Coordinate. ;4
|
|
BCC MoveDragon_9 ;2
|
|
|
|
STA WSYNC,X ;If Too Small, set as Dragon's Y coordinate. ;4
|
|
MoveDragon_9:
|
|
RTS ;6
|
|
|
|
;Dragon Difficulty
|
|
DragonDiff:
|
|
.byte $D0,$E8 ;Level 1 : Am, Pro
|
|
.byte $F0,$F6 ;Level 2 : Am, Pro
|
|
.byte $F0,$F6 ;Level 3 : Am, Pro
|
|
|
|
;Move Bat
|
|
MoveBat:
|
|
INC $CF ;Put Bat in the Next State. ;5
|
|
LDA $CF ;Get the Bat State. ;3
|
|
CMP #$08 ;Has it Reached the Maximum? ;2
|
|
BNE MoveBat_2 ;2
|
|
|
|
LDA #$00 ;If So, Reset the Bat State. ;2
|
|
STA $CF ;3
|
|
MoveBat_2:
|
|
LDA $D1 ;Get the Bat Fed-Up Value. ;3
|
|
BEQ MoveBat_3 ;If Bat Fed-Up then Branch. ;2
|
|
|
|
INC $D1 ;Increment its value for next time. ;5
|
|
LDA $CE ;Get the Bat's Movement. ;3
|
|
LDX #$CB ;Position to Bat. ;2
|
|
LDY #$03 ;Get the Bat's Deltas. ;2
|
|
JSR MoveGroundObject ;Move the Bat. ;6
|
|
JMP MoveBat_4 ;Update the Bat's Object. ;3
|
|
|
|
;Bat Fed-Up
|
|
MoveBat_3:
|
|
LDA #$CB ;Store the Bat's Dynamic Data Address ;2
|
|
STA $D5 ;3
|
|
LDA #$03 ;Set the Bat's Delta. ;2
|
|
STA $D4 ;3
|
|
LDA #<BatMatrix ;Set the Low Address of Object Store. ;2
|
|
STA $D2 ;3
|
|
LDA #>BatMatrix ;Set the High Address of Object Store. ;2
|
|
STA $D3 ;3
|
|
LDA $D0 ;Get Object being Carried by Bat, ;3
|
|
STA $D6 ; And Copy. ;3
|
|
JSR MoveGameObject ;Move the Bat. ;6
|
|
|
|
LDY $E1 ;Get Object Liked Index. ;3
|
|
LDA ($D2),Y ;Look up the Object Found in the Table. ;5
|
|
BEQ MoveBat_4 ;If nothing found then Forget it. ;2
|
|
|
|
INY ;2
|
|
LDA ($D2),Y ;Get the Object Wanted. ;5
|
|
TAX ;2
|
|
LDA VSYNC,X ;Get the Object's Room. ;4
|
|
CMP $CB ;Is it the Same as the Bats? ;3
|
|
BNE MoveBat_4 ;If not Forget it. ;2
|
|
|
|
;See if Bat Can pick up Object.
|
|
LDA VBLANK,X ;Get the Object's X Coordinate. ;4
|
|
SEC ;2
|
|
SBC $CC ;Find the differenct with the Bat's ;3
|
|
CLC ;X coordinate. ;2
|
|
ADC #$04 ;Adjust so Bat in middle of object. ;2
|
|
AND #$F8 ;Is Bat within Seven Pixels? ;2
|
|
BNE MoveBat_4 ;If not, no pickup possible. ;2
|
|
|
|
LDA WSYNC,X ;Get the Object's Y Coordinate. ;4
|
|
SEC ;2
|
|
SBC $CD ;Find the Difference with the Bat's ;3
|
|
CLC ; Y Coordinate. ;2
|
|
ADC #$04 ;Adjust. ;2
|
|
AND #$F8 ;Is the Bat within Seven Pixels? ;2
|
|
BNE MoveBat_4 ;If not, No Pickup Possible. ;2
|
|
|
|
;Get Object
|
|
STX $D0 ;Store Object as Being Carried. ;3
|
|
LDA #$10 ;Reset the Bat Fed Up Time. ;2
|
|
STA $D1 ;3
|
|
|
|
;Move Object Being Carried by Bat.
|
|
MoveBat_4:
|
|
LDX $D0 ;Get Object Being Carried by Bat. ;3
|
|
LDA $CB ;Get the Bat's Room. ;3
|
|
STA VSYNC,X ;Store this as the Object's Room. ;4
|
|
LDA $CC ;Get the Bat's X coordinate. ;3
|
|
CLC ;2
|
|
ADC #$08 ;Adjust to the Right. ;2
|
|
STA VBLANK,X ;Make it the Object's X coordinate. ;4
|
|
LDA $CD ;Get the Bat's Y Coordinate. ;3
|
|
STA WSYNC,X ;Store it as the Object's Y Coordinate. ;4
|
|
LDA $D0 ;Get the Object Being Carried by the Bat. ;3
|
|
LDY $9D ;Get the Object Being Carried by the Ball. ;3
|
|
CMP Store1,Y ;Are the the Same? ;4
|
|
BNE MoveBat_5 ;If not Branch. ;2
|
|
|
|
LDA #$A2 ;Set Nothing Being ;2
|
|
STA $9D ; Carried. ;3
|
|
MoveBat_5:
|
|
RTS ;6
|
|
|
|
|
|
;Bat Object Matrix.
|
|
BatMatrix:
|
|
.byte $CB,$B9 ;Bat,Chalise
|
|
.byte $CB,$B6 ;Bat,Sword
|
|
.byte $CB,$BC ;Bat,Bridge
|
|
.byte $CB,$BF ;Bat,Yellow Key
|
|
.byte $CB,$C2 ;Bat,White Key
|
|
.byte $CB,$C5 ;Bat,Black Key
|
|
.byte $CB,$A4 ;Bat,Red Dragon
|
|
.byte $CB,$A9 ;Bat,Yellow Dragon
|
|
.byte $CB,$AE ;Bat,Green Dragon
|
|
.byte $CB,$B3 ;Bat,Magnet
|
|
.byte $00
|
|
|
|
|
|
;Deal with Portcullis and Collisions.
|
|
Portals:
|
|
LDY #$02 ;For Each Portcullis. ;2
|
|
Portals_2:
|
|
LDX PortOffsets,Y ;Get the Portcullises offset number. ;4
|
|
JSR FindObjHit ;See if an Object Collided with it. ;6
|
|
STA $97 ; Store that Object. ;3
|
|
CMP KeyOffsets,Y ;Is it the Associated Key? ;4
|
|
BNE Portals_3 ;If not then Branch. ;2
|
|
|
|
TYA ;Get the Portcullis Number ;2
|
|
TAX ;2
|
|
INC $C8,X ;Change it's state to open it. ;6
|
|
Portals_3:
|
|
TYA ;Get the Porcullis number. ;2
|
|
TAX ;2
|
|
LDA $C8,X ;Get the State. ;4
|
|
CMP #$1C ;Is it Closed? ;2
|
|
BEQ Portals_7 ;Yes - then Branch. ;2
|
|
|
|
LDA PortOffsets,Y ;Get Portcullis number. ;4
|
|
JSR PBCollision ;Get the Player-Ball Collision. ;6
|
|
BEQ Portals_4 ;If Not Then Branch. ;2
|
|
|
|
LDA #$01 ;Set the Portcullis to Closed. ;2
|
|
STA $C8,X ;4
|
|
LDX #$8A ;Set to the Castle. ;2
|
|
JMP Portals_6 ;Put the Ball in the Castle. ;3
|
|
|
|
Portals_4:
|
|
LDA $97 ;Get the Object that hit the Portcullis. ;3
|
|
CMP #$A2 ;Is it nothing? ;2
|
|
BEQ Portals_5 ;If so, Branch. ;2
|
|
|
|
LDX $97 ;Get Object. ;3
|
|
STY $9A ;Save Y ;3
|
|
JSR GetObjectAddress ;And find it's Dynamic Address. ;6
|
|
LDY $9A ;Retrieve Y ;3
|
|
LDX $93 ;Get Object's Address. ;3
|
|
JMP Portals_6 ;Put Object In the Castle. ;3
|
|
|
|
Portals_5:
|
|
JMP Portals_7 ;3
|
|
|
|
Portals_6:
|
|
LDA EntryRoomOffsets,Y ;Look up Castle endry room for this port. ;4
|
|
STA VSYNC,X ;Make it the object's Room. ;4
|
|
LDA #$10 ;Give the Object a new Y coordinate. ;2
|
|
STA WSYNC,X ;4
|
|
Portals_7:
|
|
TYA ;Get the Portcullis number. ;2
|
|
TAX ;2
|
|
LDA $C8,X ;Get its State. ;4
|
|
CMP #$01 ;Is it Open? ;2
|
|
BEQ Portals_8 ;Yes - Then Branch. ;2
|
|
|
|
CMP #$1C ;Is it Closed? ;2
|
|
BEQ Portals_8 ;Yes - Then Branch. ;2
|
|
|
|
INC $C8,X ;Increment it's State. ;6
|
|
LDA $C8,X ;Get the State. ;4
|
|
CMP #$38 ;Has it reached the maximum state. ;2
|
|
BNE Portals_8 ;If not, Branch. ;2
|
|
|
|
LDA #$01 ;Set to Closed ;2
|
|
STA $C8,X ; State. ;4
|
|
|
|
Portals_8:
|
|
DEY ;Goto the next portcullis. ;2
|
|
BMI Portals_9 ;Branch if Finished. ;2
|
|
JMP Portals_2 ;Do next Protcullis. ;3
|
|
Portals_9:
|
|
RTS ;6
|
|
|
|
|
|
|
|
|
|
;Portcullis #1, #2, #3
|
|
PortOffsets:
|
|
.byte $09,$12,$1B
|
|
|
|
;Keys #1, #2, #3 (Yellow, White, Black)
|
|
KeyOffsets:
|
|
.byte $63,$6C,$75
|
|
|
|
;Castle Entry Rooms (Yellow, White, Black)
|
|
EntryRoomOffsets:
|
|
.byte $12,$1A,$1B
|
|
|
|
;Castle Rooms (Yellow, White, Black)
|
|
CastleRoomOffsets:
|
|
.byte $11,$0F,$10
|
|
|
|
|
|
;Deal With Magnet.
|
|
Mag_1:
|
|
LDA $B5 ;Get Magnet's Y Coordinate. ;3
|
|
SEC ;2
|
|
SBC #$08 ;Adjust to it's "Poles". ;2
|
|
STA $B5 ;3
|
|
LDA #$00 ;Con Difficulty! ;2
|
|
STA $D6 ;3
|
|
LDA #<MagnetMatrix ;Set Low Address of Object Store. ;2
|
|
STA $D2 ;3
|
|
LDA #>MagnetMatrix ;Set High Address of Object Store. ;2
|
|
STA $D3 ;3
|
|
JSR GetLinkedObject ;Get Liked Object and Set Movement. ;6
|
|
LDA $9B ;Get Movement. ;3
|
|
BEQ Mag_2 ;If None, then Forget It. ;2
|
|
|
|
LDY #$01 ;Set Delta to One. ;2
|
|
JSR MoveGroundObject ;Move Object. ;6
|
|
|
|
Mag_2:
|
|
LDA $B5 ;Reset the Magnet's ;3
|
|
CLC ; Y Coordinate. ;2
|
|
ADC #$08 ;2
|
|
STA $B5 ;3
|
|
RTS ;6
|
|
|
|
;Magnet Object Matrix.
|
|
MagnetMatrix:
|
|
.byte $BF,$B3 ;Yellow Key, Magnet
|
|
.byte $C2,$B3 ;White Key, Magnet
|
|
.byte $C5,$B3 ;Black Key, Magnet
|
|
.byte $B6,$B3 ;Sword, Magnet
|
|
.byte $BC,$B3 ;Bridge, Magnet
|
|
.byte $B9,$B3 ;Chalise, Magnet
|
|
.byte $00
|
|
|
|
|
|
|
|
;Deal with Invisible Surround Moving.
|
|
Surround:
|
|
LDA $8A ;Get the Current Room. ;3
|
|
JSR RoomNumToAddress ;Convert it to an Address. ;6
|
|
LDY #$02 ;2
|
|
LDA ($93),Y ;Get the Room's Color. ;5
|
|
CMP #$08 ;Is it Invisible? ;2
|
|
BEQ Surround_2 ;If So Branch. ;2
|
|
|
|
LDA #$00 ;If not, signal the ;2
|
|
STA $DB ; Invisible surround not ;3
|
|
JMP Surround_4 ; Wanted. ;3
|
|
|
|
Surround_2:
|
|
LDA $8A ;Get the Current Room. ;3
|
|
STA $D9 ;And store as the Invisible Surrounds. ;3
|
|
LDA $8B ;Get the Ball's X Coordinate. ;3
|
|
SEC ;2
|
|
SBC #$0E ;Adjust for Surround, ;2
|
|
STA $DA ; and store as surround's X coordinate. ;3
|
|
LDA $8C ;Get the Ball's Y Coordinate. ;3
|
|
CLC ;2
|
|
ADC #$0E ;Adjust for Surround. ;2
|
|
STA $DB ; and store as surround's Y coordinate. ;3
|
|
LDA $DA ;Get the Surround's X cordinate. ;3
|
|
CMP #$F0 ;Is it close to the right edge? ;2
|
|
BCC Surround_3 ;Branch if not. ;2
|
|
|
|
LDA #$01 ;Flick surround to the ;2
|
|
STA $DA ; otherside of the screen. ;3
|
|
JMP Surround_4 ;3
|
|
|
|
Surround_3:
|
|
CMP #$82 ;??? ;2
|
|
BCC Surround_4 ;??? ;2
|
|
|
|
LDA #$81 ;??? ;2
|
|
STA $DA ;??? ;3
|
|
Surround_4:
|
|
RTS ;6
|
|
|
|
|
|
;Make A Noise.
|
|
MakeSound:
|
|
LDA $DF ;Check Not Count. ;3
|
|
BNE MakeSound_2 ;Branch if Noise to be made. ;2
|
|
|
|
STA AUDV0 ;Turn off the Volume. ;3
|
|
STA AUDV1 ;3
|
|
RTS ;6
|
|
|
|
MakeSound_2:
|
|
DEC $DF ;Goto the Next Note. ;5
|
|
LDA $E0 ;Get the Noise Type. ;3
|
|
BEQ NoiseGameOver ;Game Over ;2
|
|
|
|
CMP #$01 ;Roar ;2
|
|
BEQ NoiseRoar ;2
|
|
|
|
CMP #$02 ;Man Eaten. ;2
|
|
BEQ EatenNoise ;2
|
|
|
|
CMP #$03 ;Dying Dragon. ;2
|
|
BEQ DragDieNoise ;2
|
|
|
|
CMP #$04 ;Dropping Object. ;2
|
|
BEQ NoiseDropObject ;2
|
|
|
|
CMP #$05 ;Picking up Object. ;2
|
|
BEQ NoiseGetObject ;2
|
|
|
|
RTS ;6
|
|
|
|
|
|
;Noise 0 : Game Over
|
|
NoiseGameOver:
|
|
LDA $DF ;3
|
|
STA COLUPF ;Color-Luminance Playfield. ;3
|
|
STA AUDC0 ;Audio-Control 00 ;3
|
|
LSR ;2
|
|
STA AUDV0 ;Audio-Volume 00 ;3
|
|
LSR ;2
|
|
LSR ;2
|
|
STA AUDF0 ;Audio-Frequency 00 ;3
|
|
RTS ;6
|
|
|
|
;Noise 1 : Roar
|
|
NoiseRoar:
|
|
LDA $DF ;Get noise count. ;3
|
|
LSR ;2
|
|
LDA #$03 ;If it was even then ;2
|
|
BCS SetVolume ;Branch. ;2
|
|
|
|
LDA #$08 ;Get a differnt audio control value. ;2
|
|
|
|
SetVolume:
|
|
STA AUDC0 ;Set Audio Control 00. ;3
|
|
LDA $DF ;Set the Volume to the Noise Count. ;3
|
|
STA AUDV0 ;3
|
|
LSR ;Divide by Four. ;2
|
|
LSR ;2
|
|
CLC ;2
|
|
ADC #$1C ;Set the Frequency. ;2
|
|
STA AUDF0 ;3
|
|
RTS ;6
|
|
|
|
|
|
;Noise 2 : Man Eaten
|
|
EatenNoise:
|
|
LDA #$06 ;2
|
|
STA AUDC0 ;Audio-Control 00 ;3
|
|
LDA $DF ;3
|
|
EOR #$0F ;2
|
|
STA AUDF0 ;Audio-Frequency 00 ;3
|
|
LDA $DF ;3
|
|
LSR ;2
|
|
CLC ;2
|
|
ADC #$08 ;2
|
|
STA AUDV0 ;Audio-Volume 00 ;3
|
|
RTS ;6
|
|
|
|
|
|
;Noise 3 : Dyning Dragon
|
|
DragDieNoise:
|
|
LDA #$04 ;Set the Audio Control ;2
|
|
STA AUDC0 ;3
|
|
LDA $DF ;Put the Note Count In ;3
|
|
STA AUDV0 ; the Volume. ;3
|
|
EOR #$1F ;2
|
|
STA AUDF0 ;Flip the Count as store ;3
|
|
RTS ; as the frequency. ;6
|
|
|
|
|
|
;Noise 4 : Dropping Object.
|
|
NoiseDropObject:
|
|
LDA $DF ;Get Not Count ;3
|
|
EOR #$03 ;Reverse it as noise does up. ;2
|
|
NoiseDropObject_2:
|
|
STA AUDF0 ;Store in Frequency for Channel 00. ;3
|
|
LDA #$05 ;2
|
|
STA AUDV0 ;Set Volume on Channel 00. ;3
|
|
LDA #$06 ;2
|
|
STA AUDC0 ;Set a Noise on Channel 00. ;3
|
|
RTS ;6
|
|
|
|
|
|
;Noise 5 : Picking up an Object.
|
|
NoiseGetObject:
|
|
LDA $DF ;Get Not Count. ;3
|
|
JMP NoiseDropObject_2 ; and Make Same noise as Drop. ;3
|
|
|
|
|
|
;Left of Name Room
|
|
LeftOfName:
|
|
.byte $F0,$FF,$FF ;XXXXXXXXXXXXXXXXXXXXRRRRRRRRRRRRRRRRRRRRRRRR
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
|
|
;Below Yellow Castle
|
|
BelowYellowCastle:
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRRRRRR **Line Shared With Above Room ----^
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
.byte $F0,$FF,$FF ;XXXXXXXXXXXXXXXXXXXXRRRRRRRRRRRRRRRRRRRRRRRR
|
|
|
|
|
|
;Side Corridor
|
|
SideCorridor:
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
.byte $00,$00,$00
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
|
|
|
|
;Number Room Definition
|
|
NumberRoom:
|
|
.byte $F0,$FF,$FF ;XXXXXXXXXXXXXXXXXXXXRRRRRRRRRRRRRRRRRRRR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXXXXXXRRRRRRRRRRRRRRRRRRRR
|
|
|
|
|
|
;Object #1 States (Portcullis)
|
|
PortStates:
|
|
.byte $04,<GfxPort07,>GfxPort07 ;State 04 at FB24 -Open
|
|
.byte $08,<GfxPort06,>GfxPort06 ;State 08 at FB22
|
|
.byte $0C,<GfxPort05,>GfxPort05 ;State 0C at FB20
|
|
.byte $10,<GfxPort04,>GfxPort04 ;State 10 at FB1E
|
|
.byte $14,<GfxPort03,>GfxPort03 ;State 14 at FB1C
|
|
.byte $18,<GfxPort02,>GfxPort02 ;State 18 at FB1A
|
|
LFB03: .byte $1C,<GfxPort01,>GfxPort01 ;State 1C at FB18 -Closed
|
|
.byte $20,<GfxPort02,>GfxPort02 ;State 20 at FB1A
|
|
.byte $24,<GfxPort03,>GfxPort03 ;State 24 at FB1C
|
|
.byte $28,<GfxPort04,>GfxPort04 ;State 28 at FB1E
|
|
.byte $2C,<GfxPort05,>GfxPort05 ;State 2C at FB20
|
|
.byte $30,<GfxPort06,>GfxPort06 ;State 30 at FB22
|
|
LFB15: .byte $FF,<GfxPort07,>GfxPort07 ;State FF at FB24 -Open
|
|
|
|
|
|
;Object #1 States 940FF (Graphic)
|
|
GfxPort01:
|
|
.byte $FE ;XXXXXXX
|
|
.byte $AA ;X X X X
|
|
GfxPort02:
|
|
.byte $FE ;XXXXXXX
|
|
.byte $AA ;X X X X
|
|
GfxPort03:
|
|
.byte $FE ;XXXXXXX
|
|
.byte $AA ;X X X X
|
|
GfxPort04:
|
|
.byte $FE ;XXXXXXX
|
|
.byte $AA ;X X X X
|
|
GfxPort05:
|
|
.byte $FE ;XXXXXXX
|
|
.byte $AA ;X X X X
|
|
GfxPort06:
|
|
.byte $FE ;XXXXXXX
|
|
.byte $AA ;X X X X
|
|
GfxPort07:
|
|
.byte $FE ;XXXXXXX
|
|
.byte $AA ;X X X X
|
|
GfxPort08:
|
|
.byte $FE ;XXXXXXX
|
|
.byte $AA ;X X X X
|
|
GfxPort09:
|
|
.byte $00
|
|
|
|
;Two Exit Room
|
|
TwoExitRoom:
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
|
|
|
|
;Top of Blue Maze
|
|
BlueMazeTop:
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
.byte $00,$0C,$0C ; XX XX RR RR
|
|
.byte $F0,$0C,$3C ;XXXX XX XXXX RRRR RR RRRR
|
|
.byte $F0,$0C,$00 ;XXXX XX RR RRRR
|
|
.byte $F0,$FF,$3F ;XXXXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRRRR
|
|
.byte $00,$30,$30 ; XX XX RR RR
|
|
.byte $F0,$33,$3F ;XXXX XX XXXXXXXX RRRRRRRR RR RRRR
|
|
|
|
;Blue Maze #1
|
|
BlueMaze1:
|
|
.byte $F0,$FF,$FF ;XXXXXXXXXXXXXXXXXXXXRRRRRRRRRRRRRRRRRRRR
|
|
.byte $00,$00,$00 ;
|
|
.byte $F0,$FC,$FF ;XXXXXXXXXX XXXXXXXXRRRRRRRR RRRRRRRRRR
|
|
.byte $F0,$00,$C0 ;XXXX XXRR RRRR
|
|
.byte $F0,$3F,$CF ;XXXX XXXXXXXXXX XXRR RRRRRRRRRR RRRR
|
|
.byte $00,$30,$CC ; XX XX XXRR RR RR
|
|
.byte $F0,$F3,$CC ;XXXXXXXX XX XX XXRR RR RR RRRRRRRR
|
|
|
|
;Bottom of Blue Maze
|
|
BlueMazeBottom:
|
|
.byte $F0,$F3,$0C ;XXXXXXXX XX XX RR RR RRRRRRRR
|
|
.byte $00,$30,$0C ; XX XX RR RR
|
|
.byte $F0,$3F,$0F ;XXXX XXXXXXXXXX RRRRRRRRRR RRRR
|
|
.byte $F0,$00,$00 ;XXXX RRRR
|
|
.byte $F0,$F0,$00 ;XXXXXXXX RRRRRRRR
|
|
.byte $00,$30,$00 ; XX RR
|
|
.byte $F0,$FF,$FF ;XXXXXXXXXXXXXXXXXXXXRRRRRRRRRRRRRRRRRRRR
|
|
|
|
;Center of Blue Maze
|
|
BlueMazeCenter:
|
|
.byte $F0,$33,$3F ;XXXX XX XXXXXXXX RRRRRRRR RR RRRR
|
|
.byte $00,$30,$3C ; XX XXXX RRRR RR
|
|
.byte $F0,$FF,$3C ;XXXXXXXXXXXX XXXX RRRR RRRRRRRRRRRR
|
|
.byte $00,$03,$3C ; XX XXXX RRRR RR
|
|
.byte $F0,$33,$3C ;XXXX XX XX XXXX RRRR RR RR RRRR
|
|
.byte $00,$33,$0C ; XX XX XX RR RR RR
|
|
.byte $F0,$F3,$0C ;XXXXXXXX XX XX RR RR RRRRRRRR
|
|
|
|
;Blue Maze Entry
|
|
BlueMazeEntry:
|
|
.byte $F0,$F3,$CC ;XXXXXXXX XX XX XXRR RR RR RRRRRRRR
|
|
.byte $00,$33,$0C ; XX XX XX RR RR RR
|
|
.byte $F0,$33,$FC ;XXXX XX XX XXXXXXRRRRRR RR RR RRRR
|
|
.byte $00,$33,$00 ; XX XX RR RR
|
|
.byte $F0,$F3,$FF ;XXXXXXXX XXXXXXXXXXRRRRRRRRRR RRRRRRRR
|
|
.byte $00,$00,$00 ;
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
|
|
;Maze Middle
|
|
MazeMiddle:
|
|
.byte $F0,$FF,$CC ;XXXXXXXXXXXX XX XXRR RR RRRRRRRRRRRR
|
|
.byte $00,$00,$CC ; XX XXRR RR
|
|
.byte $F0,$03,$CF ;XXXX XXXXXX XXRR RRRRRR RRRR
|
|
.byte $00,$03,$00 ; XX RR
|
|
.byte $F0,$F3,$FC ;XXXXXXXX XX XXXXXXRRRRRR RR RRRRRRRR
|
|
.byte $00,$33,$0C ; XX XX XX RR RR RR
|
|
|
|
;Maze Side
|
|
MazeSide:
|
|
.byte $F0,$33,$CC ;XXXX XX XX XX XXRR RR RR RR RRRR **Line Shared With Above Room ----^
|
|
.byte $00,$30,$CC ; XX XX XXRR RR RR
|
|
.byte $00,$3F,$CF ; XXXXXX XX XXRR RR RRRRRR
|
|
.byte $00,$00,$C0 ; XXRR
|
|
.byte $00,$3F,$C3 ; XXXXXXXX XXRR RRRRRRRR
|
|
.byte $00,$30,$C0 ; XX XXRR RR
|
|
.byte $F0,$FF,$FF ;XXXXXXXXXXXXXXXXXXXXRRRRRRRRRRRRRRRRRRRR
|
|
|
|
;Maze Entry
|
|
MazeEntry:
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
.byte $00,$30,$00 ; XX RR
|
|
.byte $F0,$30,$FF ;XXXX XX XXXXXXXXRRRRRRRRR RR RRRR
|
|
.byte $00,$30,$C0 ; XX XXRR RR
|
|
.byte $F0,$F3,$C0 ;XXXXXXXX XX XXRR RR RRRRRRRR
|
|
.byte $00,$03,$C0 ; XX XXRR RR
|
|
.byte $F0,$FF,$CC ;XXXXXXXXXXXX XX XXRR RR RRRRRRRRRRRR
|
|
|
|
;Castle Definition
|
|
CastleDef:
|
|
.byte $F0,$FE,$15 ;XXXXXXXXXXX X X X R R R RRRRRRRRRRR
|
|
.byte $30,$03,$1F ;XX XXXXXXX RRRRRRR RR
|
|
.byte $30,$03,$FF ;XX XXXXXXXXXXRRRRRRRRRR RR
|
|
.byte $30,$00,$FF ;XX XXXXXXXXRRRRRRRR RR
|
|
.byte $30,$00,$3F ;XX XXXXXX RRRRRR RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXX RRRRRRRRRRRRRR
|
|
|
|
;Object Data
|
|
;Offset 0 : Room number of object.
|
|
;Offset 1 : X Coordinate of object.
|
|
;Offset 2 : Y Coordinate of object.
|
|
|
|
;Object #1 : Portcullis
|
|
PortInfo1:
|
|
.byte $11,$4D,$31 ;Room 11, (4D, 31)
|
|
;Object #2 : Portcullis
|
|
PortInfo2:
|
|
.byte $0F,$4D,$31 ;Room 0F, (4D, 31)
|
|
;Object #3 : Portcullis
|
|
PortInfo3:
|
|
.byte $10,$4D,$31 ;Room 10, (4D, 31
|
|
|
|
;Object #0 : State
|
|
SurroundCurr:
|
|
.byte $00
|
|
|
|
;Object #1 : State List
|
|
SurroundStates:
|
|
.byte $FF,<GfxSurround,>GfxSurround ;State FF as FC05
|
|
|
|
;Object #1 : Graphic
|
|
GfxSurround:
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $00
|
|
|
|
;Red Maze #1
|
|
RedMaze1:
|
|
.byte $F0,$FF,$FF ;XXXXXXXXXXXXXXXXXXXXRRRRRRRRRRRRRRRRRRRR
|
|
.byte $00,$00,$00 ;
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
.byte $00,$00,$0C ; XX RR
|
|
.byte $F0,$FF,$0C ;XXXXXXXXXXXX XX RR RRRRRRRRRRRR
|
|
.byte $F0,$03,$CC ;XXXX XX XX XXRR RR RR RRRR
|
|
|
|
;Bottom of Red Maze
|
|
RedMazeBottom:
|
|
.byte $F0,$33,$CF ;XXXX XX XXXXXX XXRR RRRRRR RR RRRR **Line Shared With Above Room ----^
|
|
.byte $F0,$30,$00 ;XXXX XX RR RRRR
|
|
.byte $F0,$33,$FF ;XXXX XX XXXXXXXXXXRRRRRRRRRR RR RRRR
|
|
.byte $00,$33,$00 ; XX XX RR RR RRRR
|
|
.byte $F0,$FF,$00 ;XXXXXXXXXXXX RRRRRRRRRRRR
|
|
.byte $00,$00,$00 ;
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
|
|
;Top of Red Maze
|
|
RedMazeTop:
|
|
.byte $F0,$FF,$FF ;XXXXXXXXXXXXXXXXXXXXRRRRRRRRRRRRRRRRRRRR
|
|
.byte $00,$00,$C0 ; XXRR
|
|
.byte $F0,$FF,$CF ;XXXXXXXXXXXXXXXX XXRR RRRRRRRRRRRRRRRR
|
|
.byte $00,$00,$CC ; XX XXRR RR
|
|
.byte $F0,$33,$FF ;XXXX XX XXXXXXXXXXRRRRRRRRRR RR RRRR
|
|
.byte $F0,$33,$00 ;XXXX XX XX RR RR RRRR
|
|
|
|
;White Castle Entry
|
|
WhiteCastleEntry:
|
|
.byte $F0,$3F,$0C ;XXXX XXXXXX XX RR RRRRRR RRRR **Line Shared With Above Room ----^
|
|
.byte $F0,$00,$0C ;XXXX XX RR RRRR
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
.byte $00,$30,$00 ; XX RR
|
|
.byte $F0,$30,$00 ;XXXX XX RR RRRR
|
|
.byte $00,$30,$00 ; XX RR
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
|
|
;Top Entry Room
|
|
TopEntryRoom:
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $30,$00,$00 ;XX RR
|
|
.byte $F0,$FF,$FF ;XXXXXXXXXXXXXXXXXXXXRRRRRRRRRRRRRRRRRRRR
|
|
|
|
;Black Maze #1
|
|
BlackMaze1:
|
|
.byte $F0,$F0,$FF ;XXXXXXXX XXXXXXXXRRRRRRRR RRRRRRRR
|
|
.byte $00,$00,$03 ; XX RR
|
|
.byte $F0,$FF,$03 ;XXXXXXXXXXXXXX RRRRRRRRRRRRRR
|
|
.byte $00,$00,$00 ;
|
|
.byte $30,$3F,$FF ;XX XXXXXXXXXXXXXXRRRRRRRRRRRRRR RR
|
|
.byte $00,$30,$00 ; XX RR
|
|
|
|
;Black Maze #3
|
|
BlackMaze3:
|
|
.byte $F0,$F0,$FF ;XXXXXXXX XXXXXXXXRRRRRRRR RRRRRRRR **Line Shared With Above Room ----^ (Mirrored Not Reversed)
|
|
.byte $30,$00,$00 ;XX MM
|
|
.byte $30,$3F,$FF ;XX XXXXXXXXXXXXXXMM MMMMMMMMMMMMMM
|
|
.byte $00,$30,$00 ; XX MM
|
|
.byte $F0,$F0,$FF ;XXXXXXXX XXXXXXXXMMMMMMMM MMMMMMMM
|
|
.byte $30,$00,$03 ;XX XX MM MM
|
|
.byte $F0,$F0,$FF ;XXXXXXXX XXXXXXXXMMMMMMMM MMMMMMMM
|
|
|
|
;Black Maze #2
|
|
BlackMaze2:
|
|
.byte $F0,$FF,$FF ;XXXXXXXXXXXXXXXXXXXXMMMMMMMMMMMMMMMMMMMM
|
|
.byte $00,$00,$C0 ; XX MM
|
|
.byte $F0,$FF,$CF ;XXXXXXXXXXXXXXXX XXMMMMMMMMMMMMMMMM MM
|
|
.byte $00,$00,$0C ; XX MM
|
|
.byte $F0,$0F,$FF ;XXXX XXXXXXXXXXXXMMMM MMMMMMMMMMMM
|
|
.byte $00,$0F,$C0 ; XXXX XX MMMM MM
|
|
|
|
;Black Maze Entry
|
|
BlackMazeEntry:
|
|
.byte $30,$CF,$CC ;XX XX XXXX XX XXMM MM MMMM MM MM **Line Shared With Above Room ----^ (Reversed Not Mirrored)
|
|
.byte $00,$C0,$CC ; XX XX XXRR RR RR
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
.byte $00,$00,$00 ;
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
.byte $00,$00,$00 ;
|
|
.byte $F0,$FF,$0F ;XXXXXXXXXXXXXXXX RRRRRRRRRRRRRRRR
|
|
|
|
;Objtect #0A : State
|
|
BridgeCurr:
|
|
.byte $00
|
|
|
|
;Object #0A : List of States
|
|
BridgeStates:
|
|
.byte $FF,<GfxBridge,>GfxBridge ;State FF at &FCDB
|
|
|
|
;Object #0A : State FF : Graphic
|
|
GfxBridge:
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $42 ; X X
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $00
|
|
|
|
;Object #5 State #1 Graphic :'1'
|
|
GfxNum1:
|
|
.byte $04 ; X
|
|
.byte $0C ;XX
|
|
.byte $04 ; X
|
|
.byte $04 ; X
|
|
.byte $04 ; X
|
|
.byte $04 ; X
|
|
.byte $0E ;XXX
|
|
.byte $00
|
|
|
|
;Object #0B : State
|
|
KeyCurr:
|
|
.byte $00
|
|
|
|
;Object #0B : List of States
|
|
KeyStates:
|
|
.byte $FF,<GfxKey,>GfxKey
|
|
|
|
;Object #0B : State FF : Graphic
|
|
GfxKey:
|
|
.byte $07 ; XXX
|
|
.byte $FD ;XXXXXX X
|
|
.byte $A7 ;X X XXX
|
|
.byte $00
|
|
|
|
;Object #5 State #2 Grphic : '2'
|
|
GfxNum2:
|
|
.byte $0E ; XXX
|
|
.byte $11 ;X X
|
|
.byte $01 ; X
|
|
.byte $02 ; X
|
|
.byte $04 ; X
|
|
.byte $08 ; X
|
|
.byte $1F ;XXXXX
|
|
.byte $00
|
|
|
|
;Object #5 State #3 Graphic :'3'
|
|
GfxNum3:
|
|
.byte $0E ; XXX
|
|
.byte $11 ;X X
|
|
.byte $01 ; X
|
|
.byte $06 ; XX
|
|
.byte $01 ; X
|
|
.byte $11 ;X X
|
|
.byte $0E ; XXX
|
|
.byte $00
|
|
|
|
|
|
;Object #0E : List of States
|
|
BatStates:
|
|
.byte $03,<GfxBat1,>GfxBat1 ;State 03 at &FD1A
|
|
LFD17: .byte $FF,<GfxBat2,>GfxBat2 ;State FF as &FD22
|
|
|
|
;Object #0E : State 03 : Graphic
|
|
GfxBat1:
|
|
.byte $81 ;X X
|
|
.byte $81 ;X X
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $5A ; X XX X
|
|
.byte $66 ; XX XX
|
|
.byte $00
|
|
|
|
;Object #0E : State FF : Graphic
|
|
GfxBat2:
|
|
.byte $01 ; X
|
|
.byte $80 ;X
|
|
.byte $01 ; X
|
|
.byte $80 ;X
|
|
.byte $3C ; XXXX
|
|
.byte $5A ; X XX X
|
|
.byte $66 ; XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $81 ;X X
|
|
.byte $81 ;X X
|
|
.byte $81 ;X X
|
|
.byte $00
|
|
|
|
;Object #6 : States
|
|
DragonStates:
|
|
.byte $00,<GfxDrag0,>GfxDrag0 ;State 00 at &FD3A
|
|
LFD31: .byte $01,<GfxDrag2,>GfxDrag2 ;State 01 at &FD66
|
|
LFD34: .byte $02,<GfxDrag0,>GfxDrag0 ;State 02 at &FD3A
|
|
LFD37: .byte $FF,<GfxDrag1,>GfxDrag1 ;State FF at &FD4F
|
|
|
|
;Object #6 : State #00 : Graphic
|
|
GfxDrag0:
|
|
.byte $06 ; XX
|
|
.byte $0F ; XXXX
|
|
.byte $F3 ;XXXX XX
|
|
.byte $FE ;XXXXXXX
|
|
.byte $0E ; XXX
|
|
.byte $04 ; X
|
|
.byte $04 ; X
|
|
.byte $1E ; XXXX
|
|
.byte $3F ; XXXXXX
|
|
.byte $7F ; XXXXXXX
|
|
.byte $E3 ;XXX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $C7 ;XX XXX
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $3C ; XXXX
|
|
.byte $08 ; X
|
|
.byte $8F ;X XXXX
|
|
.byte $E1 ;XXX X
|
|
.byte $3F ; XXXXXX
|
|
.byte $00
|
|
|
|
;Object 6 : State FF : Graphic
|
|
GfxDrag1:
|
|
.byte $80 ;X
|
|
.byte $40 ; X
|
|
.byte $26 ; X XX
|
|
.byte $1F ; XXXXX
|
|
.byte $0B ; X XX
|
|
.byte $0E ; XXX
|
|
.byte $1E ; XXXX
|
|
.byte $24 ; X X
|
|
.byte $44 ; X X
|
|
.byte $8E ;X XXX
|
|
.byte $1E ; XXXX
|
|
.byte $3F ; XXXXXX
|
|
.byte $7F ; XXXXXXX
|
|
.byte $7F ; XXXXXXX
|
|
.byte $7F ; XXXXXXX
|
|
.byte $7F ; XXXXXXX
|
|
.byte $3E ; XXXXX
|
|
.byte $1C ; XXX
|
|
.byte $08 ; X
|
|
.byte $F8 ;XXXXX
|
|
.byte $80 ;X
|
|
.byte $E0 ;XXX
|
|
.byte $00
|
|
|
|
;Object 6 : State 02 : Graphic
|
|
GfxDrag2:
|
|
.byte $0C ; XX
|
|
.byte $0C ; XX
|
|
.byte $0C ; XX
|
|
.byte $0E ; XXX
|
|
.byte $1B ; XX X
|
|
.byte $7F ; XXXXXXX
|
|
.byte $CE ;XX XXX
|
|
.byte $80 ;X
|
|
.byte $FC ;XXXXXX
|
|
.byte $FE ;XXXXXXX
|
|
.byte $FE ;XXXXXXX
|
|
.byte $7E ; XXXXXX
|
|
.byte $78 ; XXXX
|
|
.byte $20 ; X
|
|
.byte $6E ; XX XXX
|
|
.byte $42 ; X X
|
|
.byte $7E ; XXXXXX
|
|
.byte $00
|
|
|
|
;Object #9 : Current State
|
|
SwordCurr:
|
|
.byte $00
|
|
|
|
;Object #9 : List of States
|
|
SwordStates:
|
|
.byte $FF,<GfxSword,>GfxSword ;State FF at &FD7C
|
|
|
|
;Object #9 : State FF : Graphics
|
|
GfxSword:
|
|
.byte $20 ; X
|
|
.byte $40 ; X
|
|
.byte $FF ;XXXXXXXX
|
|
.byte $40 ; X
|
|
.byte $20 ; X
|
|
.byte $00
|
|
|
|
;Object #0F : State
|
|
DotCurr:
|
|
.byte $00
|
|
|
|
;Object #0F : List of States
|
|
DotStates:
|
|
.byte $FF,<GfxDot,>GfxDot ;State FF at FD86
|
|
|
|
;Object #0F : State FF : Graphic
|
|
GfxDot:
|
|
.byte $80 ;X
|
|
.byte $00
|
|
|
|
;Object #4 : State FF : Graphic
|
|
GfxAuthor:
|
|
.byte $F0 ;XXXX
|
|
.byte $80 ;X
|
|
.byte $80 ;X
|
|
.byte $80 ;X
|
|
.byte $F4 ;XXXX X
|
|
.byte $04 ; X
|
|
.byte $87 ;X XXX
|
|
.byte $E5 ;XXX X X
|
|
.byte $87 ;X XXX
|
|
.byte $80 ;X
|
|
.byte $05 ; X X
|
|
.byte $E5 ;XXX X X
|
|
.byte $A7 ;X X XXX
|
|
.byte $E1 ;XXX X
|
|
.byte $87 ;X XXX
|
|
.byte $E0 ;XXX
|
|
.byte $01 ; X
|
|
.byte $E0 ;XXX
|
|
.byte $A0 ;X X
|
|
.byte $F0 ;XXXX
|
|
.byte $01 ; X
|
|
.byte $40 ; X
|
|
.byte $E0 ;XXX
|
|
.byte $40 ; X
|
|
.byte $40 ; X
|
|
.byte $40 ; X
|
|
.byte $01 ; X
|
|
.byte $E0 ;XXX
|
|
.byte $A0 ;X X
|
|
.byte $E0 ;XXX
|
|
.byte $80 ;X
|
|
.byte $E0 ;XXX
|
|
.byte $01 ; X
|
|
.byte $20 ; X
|
|
.byte $20 ; X
|
|
.byte $E0 ;XXX
|
|
.byte $A0 ;X X
|
|
.byte $E0 ;XXX
|
|
.byte $01 ; X
|
|
.byte $01 ; X
|
|
.byte $01 ; X
|
|
.byte $88 ; X X
|
|
.byte $A8 ;X X X
|
|
.byte $A8 ;X X X
|
|
.byte $A8 ;X X X
|
|
.byte $F8 ;XXXXX
|
|
.byte $01 ; X
|
|
.byte $E0 ;XXX
|
|
.byte $A0 ;X X
|
|
.byte $F0 ;XXXX
|
|
.byte $01 ; X
|
|
.byte $80 ;X
|
|
.byte $E0 ;XXX
|
|
.byte $8F ;X XXXX
|
|
.byte $89 ;X X X
|
|
.byte $0F ; XXXX
|
|
.byte $8A ;X X X
|
|
.byte $E9 ;XXX X X
|
|
.byte $80 ;X
|
|
.byte $8E ;X XXX
|
|
.byte $0A ; X X
|
|
.byte $EE ;XXX XXX
|
|
.byte $A0 ;X X
|
|
.byte $E8 ;XXX X
|
|
.byte $88 ;X X
|
|
.byte $EE ;XXX XXX
|
|
.byte $0A ; X X
|
|
.byte $8E ;X XXX
|
|
.byte $E0 ;XXX
|
|
.byte $A4 ;X X X
|
|
.byte $A4 ;X X X
|
|
.byte $04 ; X
|
|
.byte $80 ;X
|
|
.byte $08 ; X
|
|
.byte $0E ; XXX
|
|
.byte $0A ; X X
|
|
.byte $0A ; X X
|
|
.byte $80 ;X
|
|
.byte $0E ; XXX
|
|
.byte $0A ; X X
|
|
.byte $0E ; XXX
|
|
.byte $08 ; X
|
|
.byte $0E ; XXX
|
|
.byte $80 ;X
|
|
.byte $04 ; X
|
|
.byte $0E ; XXX
|
|
.byte $04 ; X
|
|
.byte $04 ; X
|
|
.byte $04 ; X
|
|
.byte $80 ;X
|
|
.byte $04 ; X
|
|
.byte $0E ; XXX
|
|
.byte $04 ; X
|
|
.byte $04 ; X
|
|
.byte $04 ; X
|
|
.byte $00
|
|
|
|
;Object $4 : Author's Name
|
|
AuthorInfo:
|
|
.byte $1E,$50,$69 ;Room 1E, (50, 69)
|
|
|
|
;Object #4 : Current State
|
|
AuthorCurr:
|
|
.byte $00
|
|
|
|
;Object #4 : States
|
|
AuthorStates:
|
|
.byte $FF,<GfxAuthor,>GfxAuthor ;State FF at &FD88
|
|
|
|
;Object #10 : State
|
|
ChalliseCurr:
|
|
.byte $00
|
|
|
|
;Object #10 : List of States
|
|
ChalliseStates:
|
|
.byte $FF,<GfxChallise,>GfxChallise ;State FF at &FDF3
|
|
|
|
;Object #10 : State FF : Graphic
|
|
GfxChallise:
|
|
.byte $81 ;X X
|
|
.byte $81 ;X X
|
|
.byte $C3 ;XX XX
|
|
.byte $7E ; XXXXXX
|
|
.byte $7E ; XXXXXX
|
|
.byte $3C ; XXXX
|
|
.byte $18 ; XX
|
|
.byte $18 ; XX
|
|
.byte $7E ; XXXXXX
|
|
.byte $00
|
|
|
|
;Object #12 : State
|
|
NullCurr:
|
|
.byte $00
|
|
|
|
;Object #12 : List of States
|
|
NullStates:
|
|
.byte $FF,<GfxNull,>GfxNull
|
|
|
|
;Object #12 " State FF : Graphic
|
|
GfxNull:
|
|
.byte $00
|
|
|
|
;Object #5 Number.
|
|
NumberInfo:
|
|
.byte $00,$50,$40 ;#5 Number: Room 00, (50,40)
|
|
|
|
;Object #5 States.
|
|
NumberStates:
|
|
.byte $01,<GfxNum1,>GfxNum1 ;State 1 as FCF4
|
|
LFE08: .byte $03,<GfxNum2,>GfxNum2 ;State 3 as FD04
|
|
LFE0B: .byte $FF,<GfxNum3,>GfxNum3 ;State FF as FD0C
|
|
|
|
;Object #11 : State
|
|
MagnetCurr:
|
|
.byte $00
|
|
|
|
;Object #11 : List of States
|
|
MagnetStates:
|
|
.byte $FF,<GfxMagnet,>GfxMagnet ;State FF at FE12
|
|
|
|
;Object #11 : State FF : Graphic
|
|
GfxMagnet:
|
|
.byte $3C ; XXXX
|
|
.byte $7E ; XXXXXX
|
|
.byte $E7 ;XXX XXX
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $C3 ;XX XX
|
|
.byte $00
|
|
|
|
|
|
;Room Data
|
|
;Offset 0 : Low byte foom graphics data.
|
|
;Offset 1 : High byte room graphics data
|
|
;Offset 2 : Color
|
|
;Offset 3 : B&W Color
|
|
;Offset 4 : Bits 5-0 : Playfield Control
|
|
; Bit 6 : True if right thin wall wanted.
|
|
; Bit 7 : True if left thin wall wanted.
|
|
;Offset 5 : Room Above
|
|
;Offset 6 : Room Left
|
|
;Offset 7 : Room Down
|
|
;Offset 8 : Room Right
|
|
|
|
RoomDataTable:
|
|
LFE1B: .byte <NumberRoom,>NumberRoom, $66,$0A,$21,$00,$00,$00,$00 ;00; 'Number Room. Purple
|
|
LFE24: .byte <BelowYellowCastle,>BelowYellowCastle, $D8,$0A,$A1,$08,$02,$80,$03 ;01; (Top Acess) Reflected/8 Clock Ball
|
|
LFE2D: .byte <BelowYellowCastle,>BelowYellowCastle, $C8,$0A,$21,$11,$03,$83,$01 ;02; (Top Access) Green
|
|
LFE36: .byte <LeftOfName,>LeftOfName, $E8,$0A,$61,$06,$01,$86,$02 ;03; Left of Name
|
|
LFE3F: .byte <BlueMazeTop,>BlueMazeTop, $86,$0A,$21,$10,$05,$07,$06 ;04; Top of Blue Maze Blue
|
|
LFE48: .byte <BlueMaze1,>BlueMaze1, $86,$0A,$21,$1D,$06,$08,$04 ;05; Blue Maze #1 Blue
|
|
LFE51: .byte <BlueMazeBottom,>BlueMazeBottom, $86,$0A,$21,$07,$04,$03,$05 ;06; Bottom of Blue Maze Blue
|
|
LFE5A: .byte <BlueMazeCenter,>BlueMazeCenter, $86,$0A,$21,$04,$08,$06,$08 ;07; Center of Blue Maze Blue
|
|
LFE63: .byte <BlueMazeEntry,>BlueMazeEntry, $86,$0A,$21,$05,$07,$01,$07 ;08; Blue Maze Entry Blue
|
|
LFE6C: .byte <MazeMiddle,>MazeMiddle, $08,$08,$25,$0A,$0A,$0B,$0A ;09; Maze Middle Invisible
|
|
LFE75: .byte <MazeEntry,>MazeEntry, $08,$08,$25,$03,$09,$09,$09 ;0A; Maze Entry Invisible
|
|
LFE7E: .byte <MazeSide,>MazeSide, $08,$08,$25,$09,$0C,$1C,$0D ;0B; Maze Side Invisible Re
|
|
LFE87: .byte <SideCorridor,>SideCorridor, $98,$0A,$61,$1C,$0D,$1D,$0B ;0C; (Side Corridor)
|
|
LFE90: .byte <SideCorridor,>SideCorridor, $B8,$0A,$A1,$0F,$0B,$0E,$0C ;0D; (Side Corridor)
|
|
LFE99: .byte <TopEntryRoom,>TopEntryRoom, $A8,$0A,$21,$0D,$10,$0F,$10 ;0E; (Top Entry Room)
|
|
LFEA2: .byte <CastleDef,>CastleDef, $0C,$0C,$21,$0E,$0F,$0D,$0F ;0F; White Castle White
|
|
LFEAB: .byte <CastleDef,>CastleDef, $00,$02,$21,$01,$1C,$04,$1C ;10; Black Castle Black
|
|
LFEB4: .byte <CastleDef,>CastleDef, $1A,$0A,$21,$06,$03,$02,$01 ;11; Yellow Castle Yellow
|
|
LFEBD: .byte <NumberRoom,>NumberRoom, $1A,$0A,$21,$12,$12,$12,$12 ;12; Yellow Castle Entry Yellow
|
|
LFEC6: .byte <BlackMaze1,>BlackMaze1, $08,$08,$25,$15,$14,$15,$16 ;13; Black Maze #1 Invisible Re
|
|
LFECF: .byte <BlackMaze2,>BlackMaze2, $08,$08,$24,$16,$15,$16,$13 ;14; Black Maze #2 Invisible Dupl
|
|
LFED8: .byte <BlackMaze3,>BlackMaze3, $08,$08,$24,$13,$16,$13,$14 ;15; Black Maze #3 Invisible Dupl
|
|
LFEE1: .byte <BlackMazeEntry,>BlackMazeEntry, $08,$08,$25,$14,$13,$1B,$15 ;16; Black Maze Entry Invisible R
|
|
LFEEA: .byte <RedMaze1,>RedMaze1, $36,$0A,$21,$19,$18,$19,$18 ;17; Red Maze #1 Red
|
|
LFEF3: .byte <RedMazeTop,>RedMazeTop, $36,$0A,$21,$1A,$17,$1A,$17 ;18; Top of Red Maze Red
|
|
LFEFC: .byte <RedMazeBottom,>RedMazeBottom, $36,$0A,$21,$17,$1A,$17,$1A ;19; Bottom of Red Maze Red
|
|
LFF05: .byte <WhiteCastleEntry,>WhiteCastleEntry, $36,$0A,$21,$18,$19,$18,$19 ;1A; White Castle Entry Red
|
|
LFF0E: .byte <TwoExitRoom,>TwoExitRoom, $36,$0A,$21,$89,$89,$89,$89 ;1B; Black Castle Entry Red
|
|
LFF17: .byte <NumberRoom,>NumberRoom, $66,$0A,$21,$1D,$07,$8C,$08 ;1C; Other Purple Room Purple
|
|
LFF20: .byte <TopEntryRoom,>TopEntryRoom, $36,$0A,$21,$8F,$01,$10,$03 ;1D; (Top Entry Room) Red
|
|
LFF29: .byte <BelowYellowCastle,>BelowYellowCastle, $66,$0A,$21,$06,$01,$06,$03 ;1E; Name Room Purple
|
|
|
|
|
|
;Room differences for different levels (level 1,2,3)
|
|
RoomDiffs:
|
|
LFF32: .byte $10,$0F,$0F ;Down from Room 01
|
|
LFF35: .byte $05,$11,$11 ;Down from Room 02
|
|
LFF38: .byte $1D,$0A,$0A ;Down from Room 03
|
|
LFF3B: .byte $1C,$16,$16 ;U/L/R/D from Room 1B (Black Castle Room)
|
|
LFF3E: .byte $1B,$0C,$0C ;Down from Room 1C
|
|
LFF41: .byte $03,$0C,$0C ;Up from Room 1D (Top Entry Room)
|
|
|
|
;Objects
|
|
;Offset 0 : Low byte object information (moveable stuff)
|
|
;Offset 1 : High byte object information (moveable stuff)
|
|
;Offset 2 : Low byte to object's current state
|
|
;Offset 3 : High byte to object's current state
|
|
;Offset 4 : Low byte list of states
|
|
;Offset 5 : High byte list of states
|
|
;Offset 6 : Colour
|
|
;Offset 7 : Colour in B&W.
|
|
;Offset 8 : Size of object
|
|
|
|
Store1:
|
|
.byte $D9 ;0 ;#0 Invisible Surround Offsets.. 00
|
|
Store2:
|
|
.byte $00 ;1
|
|
Store3:
|
|
.byte <SurroundCurr ;2
|
|
Store4:
|
|
.byte >SurroundCurr ;3
|
|
Store5:
|
|
.byte <SurroundStates ;4
|
|
Store6:
|
|
.byte >SurroundStates ;5
|
|
Store7:
|
|
.byte $28 ;6
|
|
Store8:
|
|
.byte $0C ;7
|
|
Store9:
|
|
.byte $07 ;8
|
|
|
|
LFF4D: .byte <PortInfo1,>PortInfo1, $C8,$00, <PortStates,>PortStates, $00,$00,$00 ;#1 Portcullis #1 Black 09
|
|
LFF56: .byte <PortInfo2,>PortInfo2, $C9,$00, <PortStates,>PortStates, $00,$00,$00 ;#2 Portcullis #2 Black 12
|
|
LFF5F: .byte <PortInfo3,>PortInfo3, $CA,$00, <PortStates,>PortStates, $00,$00,$00 ;#3 Portcullis #3 Black 1B
|
|
LFF68: .byte <AuthorInfo,>AuthorInfo, <AuthorCurr,>AuthorCurr, <AuthorStates,>AuthorStates, $CB,$00,$00 ;#4 Name Flash 24
|
|
LFF71: .byte <NumberInfo,>NumberInfo, $DD,$00, <NumberStates,>NumberStates, $C8,$00,$00 ;#5 Number Green 2D
|
|
LFF7A: .byte $A4,$00, $A8,$00, <DragonStates,>DragonStates, $36,$0E,$00 ;#6 Dragon #1 Red 36
|
|
LFF83: .byte $A9,$00, $AD,$00, <DragonStates,>DragonStates, $1A,$06,$00 ;#7 Dragon #2 Yellow 3F
|
|
LFF8C: .byte $AE,$00, $B2,$00, <DragonStates,>DragonStates, $C8,$00,$00 ;#8 Dragon #3 Green 48
|
|
LFF95: .byte $B6,$00, <SwordCurr,>SwordCurr, <SwordStates,>SwordStates, $1A,$06,$00 ;#9 Sword Yellow 51
|
|
LFF9E: .byte $BC,$00, <BridgeCurr,>BridgeCurr, <BridgeStates,>BridgeStates, $66,$02,$07 ;#0A Bridge Purple 5A
|
|
LFFA7: .byte $BF,$00, <KeyCurr,>KeyCurr, <KeyStates,>KeyStates, $1A,$06,$00 ;#0B Key #01 Yellow 63
|
|
LFFB0: .byte $C2,$00, <KeyCurr,>KeyCurr, <KeyStates,>KeyStates, $0E,$0E,$00 ;#0C Key #02 White 6C
|
|
LFFB9: .byte $C5,$00, <KeyCurr,>KeyCurr, <KeyStates,>KeyStates, $00,$00,$00 ;#0D Key #03 Black 75
|
|
LFFC2: .byte $CB,$00, $CF,$00, <BatStates,>BatStates, $00,$00,$00 ;#0E Bat Black 7E
|
|
LFFCB: .byte $A1,$00, <DotCurr,>DotCurr, <DotStates,>DotStates, $08,$08,$00 ;#0F Black Dot Light Gray 87
|
|
LFFD4: .byte $B9,$00, <ChalliseCurr,>ChalliseCurr, <ChalliseStates,>ChalliseStates, $CB,$06,$00 ;#10 Challise Flash 90
|
|
LFFDD: .byte $B3,$00, <MagnetCurr,>MagnetCurr, <MagnetStates,>MagnetStates, $00,$06,$00 ;#11 Magnet Black 99
|
|
LFFE6: .byte $BC,$00, <NullCurr,>NullCurr, <NullStates,>NullStates, $00,$00,$00 ;#12 Null Black A2
|
|
|
|
;Not Used
|
|
LFFEF: .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
|
|
;6502 Vectors (Not Used??
|
|
LFFFA: .byte $00,$F0
|
|
LFFFC: .byte $00,$F0
|
|
LFFFE: .byte $00,$F0
|