header lorom org $1fffff nop !Freerom = $1FFFFF ;CHANGE ME! The default address WILL make your ROM freeze or crash at the title screen! !Freeram = $7F8800 ;XXX consecutive bytes. ;Ram map: ;0-1: X position we want ;2-3: Y position we want ;4: X speed ;5: Y speed ;6: Direction we are on (0=ground, 1=right wall, 2=roof, 3=left wall) ;7: Timer on how long direction changing is disabled org $00A21B JSL Main org $00A5E1 JSL Init BRA $00;NOP #2 org !Freerom|$800000 Init: LDA #$01FE db $54,$00,$00;MVN $00,$00. I don't know what the form xkas accepts is. LDA $94 STA !Freeram+0 LDA $96 STA !Freeram+2 LDA #$0000 STA !Freeram+4 STA !Freeram+5 RTL Main: PHB PHK PLB PHX PHY PHP JSR UpdateSpeeds JSR CheckIfRunning JSR CheckDirectionChange;I could propably combine this stuff, but this feels easier somehow. JSR CheckMovement ;If you've got any code that should be run each frame, like writing to $13BF, put it here. I didn't include anything, I'll let you decide what to do. PLP PLY PLX PLB LDA $16 AND #$10 RTL UpdateSpeeds: REP #$20 LDA !Freeram+4 AND #$00FF CMP #$0080 BCC .PositiveXSpd ORA #$FF00 .PositiveXSpd CLC ADC !Freeram+0 STA !Freeram+0 SEC SBC $94 SEP #$20 STA $7B REP #$20 LDA !Freeram+5 AND #$00FF CMP #$0080 BCC .PositiveYSpd ORA #$FF00 .PositiveYSpd CLC ADC !Freeram+2 STA !Freeram+2 SEC SBC $96 SEP #$20 STA $7D RTS CheckIfRunning: LDY #$01;Speed while walking, pixels per second LDA $15 AND #$40 BEQ .NotRunning INY LDA $14 AND #$03 BNE .NotRunning;random trick to simulate a speed of 2.25 pixels per second INY .NotRunning RTS CheckDirectionChange: LDA !Freeram+7 BNE .DontDoIt LDA !Freeram+6 ASL TAX JMP (.Table,x) .DontDoIt DEC A STA !Freeram+7 RTS .Table dw OnGround dw OnRightWall dw OnRoof dw OnLeftWall OnGround: LDA $7B BMI .GoingLeft LDA $77 AND #$01 BNE .WalkRightWallFlip BRA .GoingRight .GoingLeft LDA $77 AND #$02 BNE .WalkLeftWall .GoingRight LDA $77 AND #$04 BNE .Return REP #$20 LDA $96 CLC ADC #$0020 STA !Freeram+2 SEP #$20 LDA #$08 STA !Freeram+7 LDA $7B BMI .WalkRightWallFlip ;BRA .WalkLeftWall .WalkLeftWall LDA !Freeram+4 STA !Freeram+5 LDA #$00 STA !Freeram+4 LDA #$03 STA !Freeram+6 REP #$20 LDA $94 STA !Freeram+0 SEP #$20 RTS .WalkRightWallFlip LDA !Freeram+4 EOR #$FF INC A STA !Freeram+5 LDA #$00 STA !Freeram+4 LDA #$01 STA !Freeram+6 REP #$20 LDA $94 STA !Freeram+0 SEP #$20 .Return RTS OnRightWall: LDA $7D BMI .GoingUp LDA $77 AND #$04 BNE .WalkGroundFlip BRA .GoingDown .GoingUp LDA $77 AND #$08 BNE .WalkRoof .GoingDown LDA $77 AND #$01 BNE .Return REP #$20 LDA $94 CLC ADC #$0020 STA !Freeram+0 SEP #$20 LDA #$08 STA !Freeram+7 LDA $7D BMI .WalkGroundFlip ;BRA .WalkRoof .WalkRoof LDA !Freeram+5 STA !Freeram+4 LDA #$00 STA !Freeram+5 LDA #$02 STA !Freeram+6 REP #$20 LDA $96 STA !Freeram+2 SEP #$20 RTS .WalkGroundFlip LDA !Freeram+5 EOR #$FF INC A STA !Freeram+4 LDA #$00 STA !Freeram+5 LDA #$00 STA !Freeram+6 REP #$20 LDA $96 STA !Freeram+2 SEP #$20 .Return RTS OnRoof: LDA $7B BMI .GoingLeft LDA $77 AND #$01 BNE .WalkRightWall BRA .GoingRight .GoingLeft LDA $77 AND #$02 BNE .WalkLeftWallFlip .GoingRight LDA $77 AND #$08 BNE .Return REP #$20 LDA $96 SEC SBC #$0020 STA !Freeram+2 SEP #$20 LDA #$08 STA !Freeram+7 LDA $7B BMI .WalkRightWall ;BRA .WalkLeftWallFlip .WalkLeftWallFlip LDA !Freeram+4 EOR #$FF INC A STA !Freeram+5 LDA #$00 STA !Freeram+4 LDA #$03 STA !Freeram+6 REP #$20 LDA $94 STA !Freeram+0 SEP #$20 RTS .WalkRightWall LDA !Freeram+4 STA !Freeram+5 LDA #$00 STA !Freeram+4 LDA #$01 STA !Freeram+6 REP #$20 LDA $94 STA !Freeram+0 SEP #$20 .Return RTS OnLeftWall: LDA $7D BMI .GoingUp LDA $77 AND #$04 BNE .WalkGround BRA .GoingDown .GoingUp LDA $77 AND #$08 BNE .WalkRoofFlip .GoingDown LDA $77 AND #$02 BNE .Return REP #$20 LDA $94 SEC SBC #$0020 STA !Freeram+0 SEP #$20 LDA #$08 STA !Freeram+7 LDA $7D BMI .WalkGround ;BRA .WalkRoofFlip .WalkRoofFlip LDA !Freeram+5 EOR #$FF INC A STA !Freeram+4 LDA #$00 STA !Freeram+5 LDA #$02 STA !Freeram+6 REP #$20 LDA $96 STA !Freeram+2 SEP #$20 RTS .WalkGround LDA !Freeram+5 STA !Freeram+4 LDA #$00 STA !Freeram+5 LDA #$00 STA !Freeram+6 REP #$20 LDA $96 STA !Freeram+2 SEP #$20 .Return RTS CheckMovement: LDA !Freeram+6 ASL TAX JMP (.Table,x) .Table dw .Ground dw .RightWall dw .Roof dw .LeftWall .Ground LDA #$00 STA !Freeram+4 LDA !Freeram+7 BNE .NoGroundGlue LDA #$10 STA $7D .NoGroundGlue LDA $15 AND #$01 BNE .GoRight LDA $15 AND #$02 BNE .GoLeft RTS .RightWall LDA #$00 STA !Freeram+5 LDA !Freeram+7 BNE .NoRightGlue LDA #$10 STA $7B .NoRightGlue LDA $15 AND #$01 BNE .GoUp LDA $15 AND #$02 BNE .GoDown RTS .GoRight TYA STA !Freeram+4 RTS .GoLeft TYA EOR #$FF INC A STA !Freeram+4 RTS .GoDown TYA STA !Freeram+5 RTS .GoUp TYA EOR #$FF INC A STA !Freeram+5 RTS .Roof LDA #$00 STA !Freeram+4 LDA !Freeram+7 BNE .NoRoofGlue LDA #$F0 STA $7D .NoRoofGlue LDA $15 AND #$01 BNE .GoLeft LDA $15 AND #$02 BNE .GoRight RTS .LeftWall LDA #$00 STA !Freeram+5 LDA !Freeram+7 BNE .NoLeftGlue LDA #$F0 STA $7B .NoLeftGlue LDA $15 AND #$01 BNE .GoDown LDA $15 AND #$02 BNE .GoUp RTS