public static void cycle() {
		indexCrossedPageBoundary = false;
		
		checkInterrupts();
		
		// Save bank/pc values for display later
		int bank = pbr.getValue();
		int addr = pc.getValue();
		
		// Get the current opcode
		int opcode = Core.mem.read(Size.BYTE, pbr.getValue(), pc.getValue());
		pc.add(1);
		
		// Get the current instruction
		Instruction inst = jmp[opcode];
		if (inst == null) 
			throw new RuntimeException(String.format("Instruction not implemented: 0x%02x", opcode));
		
		// Init argument array
		int[] args;
		if (inst.addrMode == AddressingMode.IMPLIED) {	// Implied instructions determine their argument count
			args = new int[inst.argCount];
		} else {
			args = new int[inst.addrMode.getNumArgs()];
		}
		
		// Grab arguments
		if (args.length > 0) {
			for (int k = 0; k < args.length; k++) {
				args[k] = Core.mem.read(Size.BYTE, pbr.getValue(), pc.getValue());
				pc.add(1);
			}
		}
		
		// Log current instruction
		if (Log.instruction.enabled()) 
			logInstruction(opcode, args, bank, addr);	

		if(tracingEnabled)
			CPUState.saveState(opcode, args);
		
		// Perform the instruction (finally)
		Timing.cycle(inst.run(args)*6);
	}