Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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
Add Comment
Please, Sign In to add comment