code: def emit_end(MEMORY=None):
      
      output = []
      output.extend(AT_END)
  
      if REQUIRES.intersection(MEMINITS) or '__MEM_INIT' in INITS:
          output.append(OPTIONS.heap_start_label.value + ':')
          output.append('; Defines DATA END\n' + 'ZXBASIC_USER_DATA_END EQU ZXBASIC_MEM_HEAP + ZXBASIC_HEAP_SIZE')
      else:
          output.append('; Defines DATA END --> HEAP size is 0\n' + 'ZXBASIC_USER_DATA_END EQU ZXBASIC_MEM_HEAP')
  
      output.append('; Defines USER DATA Length in bytes\n' +
                    'ZXBASIC_USER_DATA_LEN EQU ZXBASIC_USER_DATA_END - ZXBASIC_USER_DATA')
  
      if OPTIONS.autorun.value:
          output.append('END %s' % START_LABEL)
      else:
          output.append('END')
  
      return output
docs: This special ending autoinitializes required inits
      (mainly alloc.asm) and changes the MEMORY initial address if it is
      ORG XXXX to ORG XXXX + heap size