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 ; 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 ; --continued. .byte Game2Objects ;Pointer to object locations for game 02. .byte 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 $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 $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 $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 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 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 ;State 04 at FB24 -Open .byte $08,GfxPort06 ;State 08 at FB22 .byte $0C,GfxPort05 ;State 0C at FB20 .byte $10,GfxPort04 ;State 10 at FB1E .byte $14,GfxPort03 ;State 14 at FB1C .byte $18,GfxPort02 ;State 18 at FB1A LFB03: .byte $1C,GfxPort01 ;State 1C at FB18 -Closed .byte $20,GfxPort02 ;State 20 at FB1A .byte $24,GfxPort03 ;State 24 at FB1C .byte $28,GfxPort04 ;State 28 at FB1E .byte $2C,GfxPort05 ;State 2C at FB20 .byte $30,GfxPort06 ;State 30 at FB22 LFB15: .byte $FF,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 ;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 ;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 ;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 ;State 03 at &FD1A LFD17: .byte $FF,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 ;State 00 at &FD3A LFD31: .byte $01,GfxDrag2 ;State 01 at &FD66 LFD34: .byte $02,GfxDrag0 ;State 02 at &FD3A LFD37: .byte $FF,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 ;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 ;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 ;State FF at &FD88 ;Object #10 : State ChalliseCurr: .byte $00 ;Object #10 : List of States ChalliseStates: .byte $FF,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 ;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 ;State 1 as FCF4 LFE08: .byte $03,GfxNum2 ;State 3 as FD04 LFE0B: .byte $FF,GfxNum3 ;State FF as FD0C ;Object #11 : State MagnetCurr: .byte $00 ;Object #11 : List of States MagnetStates: .byte $FF,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, $66,$0A,$21,$00,$00,$00,$00 ;00; 'Number Room. Purple LFE24: .byte BelowYellowCastle, $D8,$0A,$A1,$08,$02,$80,$03 ;01; (Top Acess) Reflected/8 Clock Ball LFE2D: .byte BelowYellowCastle, $C8,$0A,$21,$11,$03,$83,$01 ;02; (Top Access) Green LFE36: .byte LeftOfName, $E8,$0A,$61,$06,$01,$86,$02 ;03; Left of Name LFE3F: .byte BlueMazeTop, $86,$0A,$21,$10,$05,$07,$06 ;04; Top of Blue Maze Blue LFE48: .byte BlueMaze1, $86,$0A,$21,$1D,$06,$08,$04 ;05; Blue Maze #1 Blue LFE51: .byte BlueMazeBottom, $86,$0A,$21,$07,$04,$03,$05 ;06; Bottom of Blue Maze Blue LFE5A: .byte BlueMazeCenter, $86,$0A,$21,$04,$08,$06,$08 ;07; Center of Blue Maze Blue LFE63: .byte BlueMazeEntry, $86,$0A,$21,$05,$07,$01,$07 ;08; Blue Maze Entry Blue LFE6C: .byte MazeMiddle, $08,$08,$25,$0A,$0A,$0B,$0A ;09; Maze Middle Invisible LFE75: .byte MazeEntry, $08,$08,$25,$03,$09,$09,$09 ;0A; Maze Entry Invisible LFE7E: .byte MazeSide, $08,$08,$25,$09,$0C,$1C,$0D ;0B; Maze Side Invisible Re LFE87: .byte SideCorridor, $98,$0A,$61,$1C,$0D,$1D,$0B ;0C; (Side Corridor) LFE90: .byte SideCorridor, $B8,$0A,$A1,$0F,$0B,$0E,$0C ;0D; (Side Corridor) LFE99: .byte TopEntryRoom, $A8,$0A,$21,$0D,$10,$0F,$10 ;0E; (Top Entry Room) LFEA2: .byte CastleDef, $0C,$0C,$21,$0E,$0F,$0D,$0F ;0F; White Castle White LFEAB: .byte CastleDef, $00,$02,$21,$01,$1C,$04,$1C ;10; Black Castle Black LFEB4: .byte CastleDef, $1A,$0A,$21,$06,$03,$02,$01 ;11; Yellow Castle Yellow LFEBD: .byte NumberRoom, $1A,$0A,$21,$12,$12,$12,$12 ;12; Yellow Castle Entry Yellow LFEC6: .byte BlackMaze1, $08,$08,$25,$15,$14,$15,$16 ;13; Black Maze #1 Invisible Re LFECF: .byte BlackMaze2, $08,$08,$24,$16,$15,$16,$13 ;14; Black Maze #2 Invisible Dupl LFED8: .byte BlackMaze3, $08,$08,$24,$13,$16,$13,$14 ;15; Black Maze #3 Invisible Dupl LFEE1: .byte BlackMazeEntry, $08,$08,$25,$14,$13,$1B,$15 ;16; Black Maze Entry Invisible R LFEEA: .byte RedMaze1, $36,$0A,$21,$19,$18,$19,$18 ;17; Red Maze #1 Red LFEF3: .byte RedMazeTop, $36,$0A,$21,$1A,$17,$1A,$17 ;18; Top of Red Maze Red LFEFC: .byte RedMazeBottom, $36,$0A,$21,$17,$1A,$17,$1A ;19; Bottom of Red Maze Red LFF05: .byte WhiteCastleEntry, $36,$0A,$21,$18,$19,$18,$19 ;1A; White Castle Entry Red LFF0E: .byte TwoExitRoom, $36,$0A,$21,$89,$89,$89,$89 ;1B; Black Castle Entry Red LFF17: .byte NumberRoom, $66,$0A,$21,$1D,$07,$8C,$08 ;1C; Other Purple Room Purple LFF20: .byte TopEntryRoom, $36,$0A,$21,$8F,$01,$10,$03 ;1D; (Top Entry Room) Red LFF29: .byte 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 ;3 Store5: .byte SurroundStates ;5 Store7: .byte $28 ;6 Store8: .byte $0C ;7 Store9: .byte $07 ;8 LFF4D: .byte PortInfo1, $C8,$00, PortStates, $00,$00,$00 ;#1 Portcullis #1 Black 09 LFF56: .byte PortInfo2, $C9,$00, PortStates, $00,$00,$00 ;#2 Portcullis #2 Black 12 LFF5F: .byte PortInfo3, $CA,$00, PortStates, $00,$00,$00 ;#3 Portcullis #3 Black 1B LFF68: .byte AuthorInfo, AuthorCurr, AuthorStates, $CB,$00,$00 ;#4 Name Flash 24 LFF71: .byte NumberInfo, $DD,$00, NumberStates, $C8,$00,$00 ;#5 Number Green 2D LFF7A: .byte $A4,$00, $A8,$00, DragonStates, $36,$0E,$00 ;#6 Dragon #1 Red 36 LFF83: .byte $A9,$00, $AD,$00, DragonStates, $1A,$06,$00 ;#7 Dragon #2 Yellow 3F LFF8C: .byte $AE,$00, $B2,$00, DragonStates, $C8,$00,$00 ;#8 Dragon #3 Green 48 LFF95: .byte $B6,$00, SwordCurr, SwordStates, $1A,$06,$00 ;#9 Sword Yellow 51 LFF9E: .byte $BC,$00, BridgeCurr, BridgeStates, $66,$02,$07 ;#0A Bridge Purple 5A LFFA7: .byte $BF,$00, KeyCurr, KeyStates, $1A,$06,$00 ;#0B Key #01 Yellow 63 LFFB0: .byte $C2,$00, KeyCurr, KeyStates, $0E,$0E,$00 ;#0C Key #02 White 6C LFFB9: .byte $C5,$00, KeyCurr, KeyStates, $00,$00,$00 ;#0D Key #03 Black 75 LFFC2: .byte $CB,$00, $CF,$00, BatStates, $00,$00,$00 ;#0E Bat Black 7E LFFCB: .byte $A1,$00, DotCurr, DotStates, $08,$08,$00 ;#0F Black Dot Light Gray 87 LFFD4: .byte $B9,$00, ChalliseCurr, ChalliseStates, $CB,$06,$00 ;#10 Challise Flash 90 LFFDD: .byte $B3,$00, MagnetCurr, MagnetStates, $00,$06,$00 ;#11 Magnet Black 99 LFFE6: .byte $BC,$00, NullCurr, 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