int __cdecl readProgramCode(signed int argc, int argv)
{
  int File; // esi@2
  int i; // edi@4
  int bytes; // eax@5
  int v5; // ebx@5
  int bull4AllCode; // eax@7
  int ptrEndNewProgramCode; // edi@8
  int newProgramCode; // esi@8
  int nextLinePtr; // eax@10
  int nextLinePtr2; // ebx@10
  char v11; // cl@12
  int v12; // eax@15
  int j; // ecx@21
  int maxAddress2; // eax@22
  char byteValue; // dl@22
  char v16; // dl@23
  int maxAddress3; // eax@24
  int result; // eax@26
  int progCode; // eax@31
  int oldProgCode; // [sp+18h] [bp-420h]@4
  char buff; // [sp+1Ch] [bp-41Ch]@5
  int v22; // [sp+41Ch] [bp-1Ch]@30
  int v23; // [sp+420h] [bp-18h]@30
  int v24; // [sp+424h] [bp-14h]@30
  int v25; // [sp+428h] [bp-10h]@30

  if ( argc <= 1 )
  {
    File = (int)FILEstdin;
    instParams = 0;
    dword_80E49A0 = 0;
  }
  else
  {
    dword_80E49A0 = argv + 8;
    instParams = argc - 2;
    File = fopen(*(_DWORD *)(argv + 4), (int)&aR[1]);
  }
  if ( !File )
  {
    sub_805A1D0(*(_DWORD *)argv);
    exitCallingFuncs(0);
  }
  oldProgCode = 0;
  for ( i = 0; ; weirdMemcpy(i + progCode - v5, &buff, v5) )
  {
    while ( 1 )
    {
      bytes = fread(&buff, 1, 1024, File);
      v5 = bytes;
      if ( bytes != -1 )
        break;
      if ( *(_DWORD *)getUnkGlobalVar() != 4 && *(_DWORD *)getUnkGlobalVar() != 35 )
        goto LABEL_35;
    }
    if ( !bytes )
      break;
    i += bytes;
    progCode = realloc(oldProgCode, i);
    if ( !progCode )
      goto LABEL_35;
    oldProgCode = progCode;
  }
  bull4AllCode = malloc(i);
  dword_80E49A8 = 0;
  off_80E4FCC = bull4AllCode;
  instrPointer = bull4AllCode;
  maxAddress = bull4AllCode;
  if ( !bull4AllCode )
    goto LABEL_35;
  ptrEndNewProgramCode = oldProgCode + i;
  newProgramCode = oldProgCode;
  while ( newProgramCode < (unsigned int)ptrEndNewProgramCode )
  {
    while ( 1 )
    {
      while ( 1 )
      {
        nextLinePtr = ptrToNextLine(newProgramCode, 10, ptrEndNewProgramCode - newProgramCode);
        nextLinePtr2 = nextLinePtr;
        if ( nextLinePtr )
          break;
        nextLinePtr2 = ptrEndNewProgramCode - 1;
        if ( newProgramCode < (unsigned int)(ptrEndNewProgramCode - 1) )
          goto LABEL_12;
LABEL_29:
        if ( *(_BYTE *)newProgramCode == 32 )
          goto LABEL_30;
LABEL_21:
        for ( j = newProgramCode + 1; j < (unsigned int)nextLinePtr2; maxAddress = maxAddress2 + 1 )
        {
          maxAddress2 = maxAddress;
          byteValue = *(_BYTE *)j++;
          *(_BYTE *)maxAddress = byteValue;
        }
        v16 = *(_BYTE *)j;
        if ( *(_BYTE *)j != 10 )
        {
          maxAddress3 = maxAddress;
          ++j;
          *(_BYTE *)maxAddress = v16;
          maxAddress = maxAddress3 + 1;
        }
        newProgramCode = j + 1;
        if ( j + 1 >= (unsigned int)ptrEndNewProgramCode )
          goto LABEL_26;
      }
      if ( newProgramCode >= (unsigned int)nextLinePtr )
        goto LABEL_29;
LABEL_12:
      v11 = *(_BYTE *)newProgramCode;
      if ( *(_BYTE *)newProgramCode == 32 )
        break;
      if ( v11 == 9 )
        break;
LABEL_14:
      newProgramCode = nextLinePtr2 + 1;
    }
    v12 = newProgramCode;
    while ( 1 )
    {
      ++v12;
      if ( v12 == nextLinePtr2 )
        break;
      while ( *(_BYTE *)v12 != 32 )
      {
        if ( *(_BYTE *)v12 != 9 )
          goto LABEL_14;
        ++v12;
        if ( v12 == nextLinePtr2 )
          goto LABEL_20;
      }
    }
LABEL_20:
    if ( v11 != 32 )
      goto LABEL_21;
LABEL_30:
    v25 = nextLinePtr2 - (newProgramCode + 1);
    v24 = newProgramCode + 1;
    newProgramCode = nextLinePtr2 + 1;
    sub_80487B0(&v24, &v22);
    sub_8048A20(v22, v23);
  }
LABEL_26:
  result = off_80E4FCC;
  if ( off_80E4FCC == maxAddress )
LABEL_35:
    exitCallingFuncs(0);
  return result;


