 
     step: ->
         @resolveInterrupt()
-        operation = @readOperation()
-        @emptyReadCycle = operation.emptyReadCycle
+
+        operation        = @readOperation()
+        instruction      = operation.instruction
+        addressingMode   = operation.addressingMode
+        @emptyReadCycle  = operation.emptyReadCycle
         @emptyWriteCycle = operation.emptyWriteCycle
-        addressingMode = operation.addressingMode
-        instruction = operation.instruction
-        address = @computeAddress addressingMode
-        @executeInstruction instruction address
+
+        instruction addressingMode()
 
     ###########################################################
     # Program execution

        prevValue = @programCounter
        @programCounter = (@programCounter + size) & 0xFFFF
        prevValue

    computeAddress: (addressingMode) ->
        @addressingModesTable[addressingMode]()

    executeInstruction: (instruction, address) ->
        @instructionsTable[instruction](address)

    ###########################################################
    # Interrupt handling

            @requestedInterrupt = type 

    ###########################################################
    # Basic addressing modes
    ###########################################################

    impliedMode: =>
        @tick()

    accumulatorMode: =>
        @tick()

    immediateMode: =>
        @moveProgramCounter()

    ###########################################################
    # Zero page addressing modes
    ###########################################################

    zeroPageMode: =>
        @readNextProgramByte()

    zeroPageXMode: =>
        @getIndexedAddressByte @readNextProgramByte(), @registerX

    zeroPageYMode: =>
        @getIndexedAddressByte @readNextProgramByte(), @registerY

    ###########################################################
    # Absolute addressing modes
    ###########################################################

    absoluteMode: =>
        @readNextProgramWord()

    absoluteXMode: =>
        @getIndexedAddressWord @readNextProgramWord(), @registerX

    absoluteYMode: =>
        @getIndexedAddressWord @readNextProgramWord(), @registerY

    ###########################################################
    # Relative addressing mode
    ###########################################################

    relativeMode: =>
        offset = @getSignedByte @readNextProgramByte()
        @getIndexedAddressWord @programCounter, offset

    ###########################################################
    # Indirect addressing modes
    ###########################################################

    indirectMode: =>
        @readWord @readNextProgramWord()

    indirectXMode: =>
        address = @getIndexedAddressByte @readNextProgramByte(), @registerX
        @readWord address

    indirectYMode: =>
        base = @readWord @readNextProgramByte()
        @getIndexedAddressWord base, @registerY

    ###########################################################
    # Address computation
