code: def step(self, action):
          
          # if the environment is done, raise an error
          if self.done:
              raise ValueError('cannot step in a done environment! call `reset`')
          # set the action on the controller
          self.controllers[0][:] = action
          # pass the action to the emulator as an unsigned byte
          _LIB.Step(self._env)
          # get the reward for this step
          reward = self._get_reward()
          # get the done flag for this step
          self.done = self._get_done()
          # get the info for this step
          info = self._get_info()
          # call the after step callback
          self._did_step(self.done)
          # bound the reward in [min, max]
          if reward < self.reward_range[0]:
              reward = self.reward_range[0]
          elif reward > self.reward_range[1]:
              reward = self.reward_range[1]
          # return the screen from the emulator and other relevant data
          return self.screen, reward, self.done, info
docs: Run one frame of the NES and return the relevant observation data.
  
          Args:
              action (byte): the bitmap determining which buttons to press
  
          Returns:
              a tuple of:
              - state (np.ndarray): next frame as a result of the given action
              - reward (float) : amount of reward returned after given action
              - done (boolean): whether the episode has ended
              - info (dict): contains auxiliary diagnostic information