// LGP-21 Flexowriter to ASCII
// tables from Christian Corti's  flex2asc.pas program
//
#include <stdio.h>
#include <stdlib.h>
//                  Z    )   SP         B    L    _    <    Y    *    =         R    "    :
//            EOT   I    &    ?   BS    D    %    ]   HT    N    $    [         M         V
//             '    P         O         E    (    X         U    F              T    G
//                  H    J              C    K              A    Q              S    W  BEL
 
/* orig table
char uc[] = {  0,  90,  41,  32,   0,  66,  76,  95,  60,  89,  42,  61,   0,  82,  34,  58,
               4,  73,  38,  63,   8,  68,  37,  93,   9,  78,  36,  91,   0,  77, 227,  86,
              39,  80, 228,  79,   0,  69,  40,  88,   0,  85,  70,   0,   0,  84,  71,   0,
               0,  72,  74,   0,   0,  67,  75,   0,   0,  65,  81,   0,   0,  83,  87,   7 };
*/

char uc[] = {  0,  90,  41,  32,   0,  66,  76,  95,  60,  89,  42,  61,   0,  82,  34,  58,
              10,  73,  38,  63,   8,  68,  37,  93,   9,  78,  36,  91,   0,  77, 227,  86,
              39,  80, 228,  79,   0,  69,  40,  88,   0,  85,  70,   0,   0,  84,  71,   0,
               0,  72,  74,   0,   0,  67,  75,   0,   0,  65,  81,   0,   0,  83,  87,   0 };

//                  z    .   SP         b    l    -    >    y    2    +         r    3    ;
//                  i    4    /   BS    d    5    .   HT    n    6    ,         m    7    v
//             '    p    8    o         e    9    x         u    f              t    g   
//                  h    j              c    k              a    q              s    w  BEL

/* orig table
char lc[] = {  0, 122,  48,  32,   0,  98, 108,  45,  62, 121,  50,  43,   0, 114,  51,  59,
               4, 105,  52,  47,   8, 100,  53,  46,   9, 110,  54,  44,   0, 109,  55, 118,
              39, 112,  56, 111,   0, 101,  57, 120,   0, 117, 102,   0,   0, 116, 103,   0,
               0, 104, 106,   0,   0,  99, 107,   0,   0,  97, 113,   0,   0, 115, 119,   7 }; 
*/

char lc[] = {  0, 122,  48,  32,   0,  98, 108,  45,  62, 121,  50,  43,   0, 114,  51,  59,
              10, 105,  52,  47,   8, 100,  53,  46,   9, 110,  54,  44,   0, 109,  55, 118,
              39, 112,  56, 111,   0, 101,  57, 120,   0, 117, 102,   0,   0, 116, 103,   0,
               0, 104, 106,   0,   0,  99, 107,   0,   0,  97, 113,   0,   0, 115, 119,   0 }; 

int main(){
unsigned char in, c, out;
int caseflag = 0;
 while(1){
  in = getchar();
  if(feof(stdin)){putchar('\n'); exit(0);}

#ifdef DEBUG
  if(in&0x20) putchar('1'); else putchar('0');
  if(in&0x10) putchar('1'); else putchar('0');
  if(in&0x08) putchar('1'); else putchar('0');
  if(in&0x04) putchar('1'); else putchar('0');
  if(in&0x02) putchar('1'); else putchar('0');
  if(in&0x01) putchar('1'); else putchar('0');
  putchar(' ');
#endif

// bits in paper tape frame
// 1 6 5 4 3 2
//   shifts to
//     6 5 4 3 2 1
//

  c  = in << 1;
  c  |= ((c & 0x40) >> 6);
  c  = c & 0x3f;

#ifdef DEBUG
  if(c&0x20) putchar('1'); else putchar('0');
  if(c&0x10) putchar('1'); else putchar('0');
  if(c&0x08) putchar('1'); else putchar('0');
  if(c&0x04) putchar('1'); else putchar('0');
  if(c&0x02) putchar('1'); else putchar('0');
  if(c&0x01) putchar('1'); else putchar('0');
  putchar(' ');
#endif

  if(c == 8){ caseflag = 1;  continue;}
  if(c == 4){ caseflag = 0;  continue;}
  if(caseflag) c = uc[c]; else c = lc[c];
  if(c == 0){ caseflag = 0; continue;}  // force lower-case if we are in tape leader
  putchar(c);
 }
}
