home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / t / test10.zip / DECODE.C next >
C/C++ Source or Header  |  1993-01-22  |  17KB  |  822 lines

  1.  
  2. /*
  3.    DECODE.C
  4.  
  5.    Decode Version 1.1  by David W. Sanderson, Mark K. Mathews
  6.  
  7.    Purpose: Convertes VCR-Plus code to date and time of show.
  8.  
  9.  
  10. */
  11.  
  12. #include <dos.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16.  
  17.  
  18. #define        KEY001    (68150631L)
  19. #define        INVALID    (-987L)
  20.  
  21.  
  22. /* Prototypes */
  23.  
  24. long     mixup(long x, long y);
  25. long     f1(long inva);
  26. void    lookup(long index, long *outtime, long *outdur);
  27. void    bit_shuffle(long t8c5, long t2c1, long *tval, long *cval);
  28. long     map_top(long day, long year, long top, long digits);
  29. void    offset(long day, long year, long top, long *ofout, long *topout);
  30.  
  31. void Syntax(const char * message);
  32.  
  33. int main(int argc, char *argv[])
  34. {
  35.     long     newspaper ;
  36.     long     s1_out, bot3, top5, quo, rem ;
  37.     long     s5_out, mtout, ofout, tval, cval ;
  38.     long     month, year ;
  39.     long     day_out, channel_out;
  40.     long     starttime_out, duration_out ;
  41.    struct date d;
  42.  
  43. //struct date {
  44. //  int da_year;     /* current year */
  45. //  char da_day;     /* day of the month */
  46. //  char da_mon;     /* month (1 = Jan) */
  47. //};
  48.    printf("Decode Version 1.1  by David W. Sanderson, Mark K. Mathews\n\n");
  49.  
  50.     if(argc != 2 )  /* only 1 paramater needed */
  51.        Syntax("Required paramater missing");
  52.  
  53.    if (!strcmp(argv[1],"/?"))
  54.        Syntax("");
  55.  
  56.  
  57.    if (strlen(argv[1]) > 6)
  58.       Syntax("ERROR - VCR-Plus code greater than 6 number.\n");
  59.  
  60.    getdate(&d);
  61.  
  62.    month = d.da_mon;
  63.     year  = d.da_year % 100;
  64.  
  65.  
  66.     newspaper = atol(argv[1]);
  67.  
  68.     ofout = INVALID ;
  69.     mtout = INVALID ;
  70.  
  71.     s1_out = f1(newspaper);
  72.     bot3 = s1_out % 1000;
  73.     top5 = s1_out / 1000;
  74.     quo = (bot3 - 1) / 32 ;
  75.     rem = (bot3 - 1) % 32 ;
  76.     day_out = quo + 1;
  77.  
  78.     if(newspaper >= 1000)
  79.    {
  80.         offset(day_out, year, top5, (&ofout), (&mtout)) ;
  81.    }
  82.     else
  83.    {
  84.       mtout = ofout = 0;
  85.    }
  86.  
  87.     s5_out = (rem + (day_out*(month+1)) + ofout) % 32 ;
  88.  
  89.  
  90.     bit_shuffle(mtout, s5_out, &tval, &cval);
  91.  
  92.     channel_out = cval + 1;
  93.  
  94.     lookup(tval, (&starttime_out), (&duration_out));
  95.            
  96.     printf("VCR-Plus code         = %6ld\n"
  97.           "Date (month/day/year) = %2ld/%2ld/%2ld\n"
  98.           "Magazine Channel      = %2ld\n"
  99.           "Start_time            = %4ld\n"
  100.            "Length                = %3ld\n",
  101.           newspaper, month, day_out, year,
  102.           channel_out, starttime_out, duration_out);
  103.  
  104.     return(0);
  105. }
  106.  
  107.  
  108.  
  109. /* function that performs initial scrambling */
  110. long     mixup(long x, long y)
  111. {
  112.     long     j, k, sum;
  113.    int i;
  114.  
  115.     long a[12], b[12], out[12] ;
  116.  
  117.     /* get the digits of x into a[] */
  118.     j = x ;
  119.     for(i=0; i<9; i++)
  120.     {
  121.         k = j % 10;
  122.         a[i] = k;
  123.         j = (j - k) / 10 ;
  124.     }
  125.  
  126.     /* get the digits of y into b[] */
  127.     j = y ;
  128.     for(i=0; i<9; i++)
  129.     {
  130.         k = j % 10;
  131.         b[i] = k;
  132.         j = (j - k) / 10 ;
  133.         out[i] = 0;
  134.     }
  135.  
  136.  
  137.     for(i=0; i<=8; i++)
  138.     {
  139.         for(j=0; j<=8; j++)
  140.         {
  141.             out[i+(int)j] += (b[(int)j] * a[(int)i]) ;
  142.         }
  143.     }
  144.  
  145.     j = 1;
  146.     sum = 0;
  147.     for(i=0; i<=8; i++)
  148.     {
  149.         sum += j * (out[i] % 10);
  150.         j = j * 10 ;
  151.     }
  152.     return( sum ) ;
  153. }
  154.  
  155.  
  156.  
  157. /* first function */
  158. long     f1(long inval)
  159. {
  160.     long     ndigits, hashval ;
  161.     long     pwr ;
  162.  
  163.  
  164.     ndigits = 0;
  165.     pwr = 1;
  166.     while(inval >= pwr)
  167.    {
  168.       ndigits++; pwr *= 10;
  169.    }
  170.     if(ndigits > 8)
  171.       printf("\nPANIC: %ld has %ld digits\n", inval, ndigits);
  172.     pwr = pwr / 10 ;
  173.  
  174.     hashval = inval;
  175. again:    hashval = mixup(hashval, KEY001) % (pwr * 10) ;
  176.     if(hashval < pwr) goto again ;
  177.  
  178.     return(hashval);
  179. }
  180.  
  181.  
  182.  
  183.  
  184. /* the 512-entry tables of starting time and pgm duration */
  185. void    lookup(long index, long *outtime, long *outdur)
  186. {
  187.     static    long     start[480], leng[480] ;
  188.     static    long     initializer = 0;
  189.  
  190.     long     s;
  191.    int j;
  192.  
  193.     if(initializer == 0)
  194.    {
  195.        initializer = 1;
  196.  
  197.        for(j=0; j<512; j++)
  198.       {
  199.          start[j] = leng[j] = INVALID;
  200.       }
  201.  
  202.        leng[0]   =  30 ;
  203.        leng[100] = 120 ;
  204.        leng[101] =  90 ;
  205.        leng[102] = 120 ;
  206.        leng[103] = 120 ;
  207.        leng[104] =  90 ;
  208.        leng[105] =  90 ;
  209.        leng[106] =  30 ;
  210.        leng[107] =  30 ;
  211.        leng[108] = 120 ;
  212.        leng[109] =  90 ;
  213.        leng[10]  =  30 ;
  214.        leng[110] =  90 ;
  215.          leng[111] =  30 ;
  216.        leng[112] =  90 ;
  217.        leng[113] =  30 ;
  218.        leng[114] =  30 ;
  219.        leng[115] = 120 ;
  220.        leng[116] =  30 ;
  221.        leng[117] = 120 ;
  222.        leng[118] = 120 ;
  223.        leng[119] =  30 ;
  224.        leng[11]  =  30 ;
  225.        leng[120] =  90 ;
  226.        leng[121] =  60 ;
  227.        leng[122] =  60 ;
  228.        leng[123] =  60 ;
  229.        leng[124] = 120 ;
  230.        leng[125] =  90 ;
  231.        leng[126] =  60 ;
  232.        leng[127] =  60 ;
  233.        leng[128] =  90 ;
  234.        leng[129] = 120 ;
  235.        leng[12]  =  30 ;
  236.        leng[130] = 120 ;
  237.        leng[131] =  90 ;
  238.        leng[132] =  60 ;
  239.        leng[133] =  60 ;
  240.        leng[134] = 120 ;
  241.        leng[135] =  90 ;
  242.        leng[136] =  90 ;
  243.        leng[137] = 120 ;
  244.        leng[138] = 120 ;
  245.        leng[139] =  60 ;
  246.        leng[13]  = 120 ;
  247.        leng[140] =  60 ;
  248.        leng[141] =  90 ;
  249.        leng[142] =  90 ;
  250.        leng[143] = 120 ;
  251.        leng[144] =  90 ;
  252.        leng[145] = 120 ;
  253.        leng[146] =  90 ;
  254.        leng[147] = 120 ;
  255.        leng[148] = 120 ;
  256.        leng[149] =  90 ;
  257.        leng[14]  =  30 ;
  258.        leng[150] = 120 ;
  259.        leng[151] =  90 ;
  260.        leng[152] =  90 ;
  261.        leng[153] =  90 ;
  262.        leng[154] =  60 ;
  263.        leng[155] =  60 ;
  264.        leng[156] = 120 ;
  265.        leng[157] =  60 ;
  266.        leng[158] =  60 ;
  267.        leng[159] =  60 ;
  268.        leng[15]  =  30 ;
  269.        leng[160] = 120 ;
  270.        leng[161] =  60 ;
  271.        leng[162] =  90 ;
  272.        leng[163] =  90 ;
  273.        leng[164] =  60 ;
  274.        leng[165] =  90 ;
  275.        leng[166] =  90 ;
  276.        leng[167] =  60 ;
  277.        leng[168] =  90 ;
  278.        leng[169] = 120 ;
  279.        leng[16]  = 120 ;
  280.        leng[170] =  60 ;
  281.        leng[171] = 120 ;
  282.        leng[172] =  60 ;
  283.        leng[173] =  60 ;
  284.        leng[174] = 120 ;
  285.        leng[175] =  90 ;
  286.        leng[176] =  60 ;
  287.        leng[177] = 120 ;
  288.        leng[178] =  60 ;
  289.        leng[179] =  60 ;
  290.        leng[17]  = 120 ;
  291.        leng[180] =  60 ;
  292.        leng[181] =  90 ;
  293.        leng[182] =  60 ;
  294.        leng[183] = 120 ;
  295.        leng[184] =  60 ;
  296.        leng[185] =  60 ;
  297.        leng[186] =  90 ;
  298.        leng[187] =  60 ;
  299.        leng[188] =  90 ;
  300.        leng[189] = 120 ;
  301.        leng[18]  =  60 ;
  302.        leng[190] =  90 ;
  303.        leng[191] =  90 ;
  304.        leng[19]  = 120 ;
  305.        leng[1]   =  30 ;
  306.        leng[20]  =  60 ;
  307.        leng[21]  =  60 ;
  308.        leng[22]  =  60 ;
  309.        leng[23]  = 120 ;
  310.        leng[24]  =  60 ;
  311.        leng[25]  = 120 ;
  312.        leng[26]  =  30 ;
  313.        leng[27]  =  30 ;
  314.        leng[28]  =  30 ;
  315.        leng[29]  =  60 ;
  316.        leng[2]   =  30 ;
  317.        leng[30]  =  90 ;
  318.        leng[31]  =  30 ;
  319.        leng[32]  =  30 ;
  320.        leng[33]  =  30 ;
  321.        leng[34]  =  30 ;
  322.        leng[35]  =  60 ;
  323.        leng[36]  =  30 ;
  324.        leng[37]  =  60 ;
  325.        leng[38]  = 120 ;
  326.        leng[39]  =  60 ;
  327.        leng[3]   =  30 ;
  328.        leng[40]  =  30 ;
  329.        leng[41]  =  30 ;
  330.        leng[42]  =  30 ;
  331.        leng[43]  =  30 ;
  332.        leng[44]  = 120 ;
  333.        leng[45]  =  30 ;
  334.        leng[46]  =  30 ;
  335.        leng[47]  =  30 ;
  336.        leng[48]  = 120 ;
  337.        leng[49]  =  30 ;
  338.        leng[4]   =  30 ;
  339.        leng[50]  =  60 ;
  340.        leng[51]  =  60 ;
  341.        leng[52]  =  30 ;
  342.        leng[53]  =  30 ;
  343.        leng[54]  = 120 ;
  344.        leng[55]  =  60 ;
  345.        leng[56]  =  60 ;
  346.        leng[57]  =  30 ;
  347.        leng[58]  = 120 ;
  348.        leng[59]  =  30 ;
  349.        leng[5]   =  30 ;
  350.        leng[60]  = 120 ;
  351.        leng[61]  = 120 ;
  352.        leng[62]  = 120 ;
  353.        leng[63]  =  30 ;
  354.        leng[64]  =  90 ;
  355.        leng[65]  =  30 ;
  356.        leng[66]  =  30 ;
  357.        leng[67]  =  30 ;
  358.        leng[68]  = 120 ;
  359.        leng[69]  =  90 ;
  360.        leng[6]   =  30 ;
  361.        leng[70]  =  90 ;
  362.        leng[71]  =  60 ;
  363.        leng[72]  =  90 ;
  364.        leng[73]  =  90 ;
  365.        leng[74]  =  90 ;
  366.        leng[75]  =  90 ;
  367.        leng[76]  =  90 ;
  368.        leng[77]  =  60 ;
  369.        leng[78]  =  90 ;
  370.        leng[79]  =  30 ;
  371.        leng[7]   =  30 ;
  372.        leng[80]  = 120 ;
  373.        leng[81]  =  60 ;
  374.        leng[82]  =  90 ;
  375.        leng[83]  = 120 ;
  376.        leng[84]  =  60 ;
  377.        leng[85]  =  60 ;
  378.        leng[86]  = 120 ;
  379.        leng[87]  =  30 ;
  380.        leng[88]  =  90 ;
  381.        leng[89]  = 120 ;
  382.        leng[8]   =  30 ;
  383.        leng[90]  = 120 ;
  384.        leng[91]  =  90 ;
  385.        leng[92]  =  90 ;
  386.        leng[93]  =  90 ;
  387.        leng[94]  =  90 ;
  388.        leng[95]  = 120 ;
  389.        leng[96]  =  60 ;
  390.        leng[97]  = 120 ;
  391.        leng[98]  =  90 ;
  392.        leng[99]  =  30 ;
  393.        leng[9]   =  60 ;
  394.        start[0]   = 1830 ;
  395.        start[100] =  330 ;
  396.        start[101] = 1500 ;
  397.        start[102] = 1500 ;
  398.        start[103] = 2300 ;
  399.        start[104] = 1900 ;
  400.        start[105] =  800 ;
  401.        start[106] =  430 ;
  402.        start[107] =  300 ;
  403.        start[108] = 1330 ;
  404.        start[109] = 1000 ;
  405.        start[10]  = 1400 ;
  406.        start[110] =  700 ;
  407.        start[111] =  100 ;
  408.        start[112] = 2330 ;
  409.        start[113] =  330 ;
  410.        start[114] =  200 ;
  411.        start[115] = 2230 ;
  412.        start[116] =  400 ;
  413.        start[117] =  600 ;
  414.        start[118] =  400 ;
  415.        start[119] =  230 ;
  416.        start[11]  = 2030 ;
  417.        start[120] =  630 ;
  418.        start[121] =   30 ;
  419.        start[122] = 2230 ;
  420.        start[123] =  100 ;
  421.        start[124] =   30 ;
  422.        start[125] = 2300 ;
  423.        start[126] = 1630 ;
  424.        start[127] =  830 ;
  425.        start[128] =    0 ;
  426.        start[129] = 1930 ;
  427.        start[12]  = 1700 ;
  428.        start[130] =  930 ;
  429.        start[131] = 2030 ;
  430.        start[132] =  500 ;
  431.        start[133] = 1730 ;
  432.        start[134] =  200 ;
  433.        start[135] = 1930 ;
  434.        start[136] =  930 ;
  435.        start[137] = 1730 ;
  436.        start[138] =  630 ;
  437.        start[139] = 1830 ;
  438.        start[13]  = 1600 ;
  439.        start[140] = 1430 ;
  440.        start[141] = 1130 ;
  441.        start[142] =   30 ;
  442.        start[143] =  830 ;
  443.        start[144] = 1030 ;
  444.        start[145] = 1430 ;
  445.        start[146] =  100 ;
  446.        start[147] =  730 ;
  447.        start[148] = 2030 ;
  448.        start[149] =  300 ;
  449.        start[14]  = 2000 ;
  450.        start[150] =  300 ;
  451.        start[151] = 1330 ;
  452.        start[152] = 1230 ;
  453.        start[153] =  230 ;
  454.        start[154] = 2130 ;
  455.        start[155] = 1130 ;
  456.        start[156] = 1830 ;
  457.        start[157] =  630 ;
  458.        start[158] =  530 ;
  459.        start[159] =  200 ;
  460.        start[15]  = 1500 ;
  461.        start[160] = 1530 ;
  462.        start[161] =  730 ;
  463.        start[162] =  600 ;
  464.        start[163] = 1730 ;
  465.        start[164] =  400 ;
  466.        start[165] =  730 ;
  467.        start[166] =  430 ;
  468.        start[167] =  430 ;
  469.        start[168] =  130 ;
  470.        start[169] = 1230 ;
  471.        start[16]  = 2000 ;
  472.        start[170] =  130 ;
  473.        start[171] =  230 ;
  474.        start[172] = 1930 ;
  475.        start[173] =  300 ;
  476.        start[174] = 1030 ;
  477.        start[175] =  200 ;
  478.        start[176] =  330 ;
  479.        start[177] =  500 ;
  480.        start[178] =  930 ;
  481.        start[179] =  230 ;
  482.        start[17]  = 2100 ;
  483.        start[180] = 2030 ;
  484.        start[181] =  400 ;
  485.        start[182] = 1530 ;
  486.        start[183] =  430 ;
  487.        start[184] = 1330 ;
  488.        start[185] = 1230 ;
  489.        start[186] =  330 ;
  490.        start[187] = 1030 ;
  491.        start[188] =  500 ;
  492.        start[189] =  530 ;
  493.        start[18]  = 2000 ;
  494.        start[190] =  530 ;
  495.        start[191] = 1100 ;
  496.        start[19]  = 1800 ;
  497.        start[1]   = 1600 ;
  498.        start[20]  = 1900 ;
  499.        start[21]  = 2200 ;
  500.        start[22]  = 2100 ;
  501.        start[23]  = 1400 ;
  502.        start[24]  = 1500 ;
  503.        start[25]  = 2200 ;
  504.        start[26]  = 1130 ;
  505.        start[27]  = 1100 ;
  506.        start[28]  = 2300 ;
  507.        start[29]  = 1600 ;
  508.        start[2]   = 1930 ;
  509.        start[30]  = 2100 ;
  510.        start[31]  = 2100 ;
  511.        start[32]  = 1230 ;
  512.        start[33]  = 1330 ;
  513.        start[34]  =  930 ;
  514.        start[35]  = 1300 ;
  515.        start[36]  = 2130 ;
  516.        start[37]  = 1200 ;
  517.        start[38]  = 1000 ;
  518.        start[39]  = 1800 ;
  519.        start[3]   = 1630 ;
  520.        start[40]  = 2200 ;
  521.        start[41]  = 1200 ;
  522.        start[42]  =  800 ;
  523.        start[43]  =  830 ;
  524.        start[44]  = 1700 ;
  525.        start[45]  =  900 ;
  526.        start[46]  = 2230 ;
  527.        start[47]  = 1030 ;
  528.        start[48]  = 1900 ;
  529.        start[49]  =  730 ;
  530.        start[4]   = 1530 ;
  531.        start[50]  = 2300 ;
  532.        start[51]  = 1000 ;
  533.        start[52]  =  700 ;
  534.        start[53]  = 1300 ;
  535.        start[54]  =  700 ;
  536.        start[55]  = 1100 ;
  537.        start[56]  = 1400 ;
  538.        start[57]  = 1000 ;
  539.        start[58]  =  800 ;
  540.        start[59]  = 2330 ;
  541.        start[5]   = 1730 ;
  542.        start[60]  = 1300 ;
  543.        start[61]  = 1200 ;
  544.        start[62]  =  900 ;
  545.        start[63]  =  630 ;
  546.        start[64]  = 1800 ;
  547.        start[65]  =  600 ;
  548.        start[66]  =  530 ;
  549.        start[67]  =    0 ;
  550.        start[68]  = 2330 ;
  551.        start[69]  = 2200 ;
  552.        start[6]   = 1800 ;
  553.        start[70]  = 1300 ;
  554.        start[71]  =  900 ;
  555.        start[72]  = 1630 ;
  556.        start[73]  = 1600 ;
  557.        start[74]  = 1430 ;
  558.        start[75]  = 2000 ;
  559.        start[76]  = 1830 ;
  560.        start[77]  =  600 ;
  561.        start[78]  = 1200 ;
  562.        start[79]  =   30 ;
  563.        start[7]   = 1430 ;
  564.        start[80]  =  130 ;
  565.        start[81]  =    0 ;
  566.        start[82]  = 1700 ;
  567.        start[83]  =    0 ;
  568.        start[84]  =  800 ;
  569.        start[85]  =  700 ;
  570.        start[86]  = 2130 ;
  571.        start[87]  =  500 ;
  572.        start[88]  = 1530 ;
  573.        start[89]  = 1130 ;
  574.        start[8]   = 1900 ;
  575.        start[90]  = 1100 ;
  576.        start[91]  =  830 ;
  577.        start[92]  = 2230 ;
  578.        start[93]  =  900 ;
  579.        start[94]  = 2130 ;
  580.        start[95]  = 1630 ;
  581.        start[96]  = 2330 ;
  582.        start[97]  =  100 ;
  583.        start[98]  = 1400 ;
  584.        start[99]  =  130 ;
  585.        start[9]   = 1700 ;
  586.  
  587.  
  588.        s = 2330;
  589.        for(j=192; j<240; j++)
  590.        {
  591.          start[j] = s; leng[j] = 150; if(0==(j%2)) s-=30; else s-=70;
  592.       }
  593.  
  594.        s = 2330;
  595.        for(j=240; j<288; j++)
  596.        {
  597.          start[j] = s; leng[j] = 180; if(0==(j%2)) s-=30; else s-=70;
  598.       }
  599.  
  600.        s = 2330;
  601.        for(j=288; j<336; j++)
  602.        {
  603.          start[j] = s; leng[j] = 210; if(0==(j%2)) s-=30; else s-=70;
  604.       }
  605.  
  606.        s = 2330;
  607.        for(j=336; j<384; j++)
  608.        {
  609.          start[j] = s; leng[j] = 240; if(0==(j%2)) s-=30; else s-=70;
  610.       }
  611.  
  612.        s = 2330;
  613.        for(j=384; j<432; j++)
  614.        {
  615.          start[j] = s; leng[j] = 270; if(0==(j%2)) s-=30; else s-=70;
  616.       }
  617.  
  618.        s = 2330;
  619.        for(j=432; j<480; j++)
  620.        {
  621.          start[j] = s; leng[j] = 300; if(0==(j%2)) s-=30; else s-=70;
  622.       }
  623.  
  624.    } /* end of initializer block */
  625.  
  626.  
  627.  
  628.     if((index >= 480) || (index < 0))
  629.         printf("\nPANIC, Illegal table index %ld\n", index);
  630.  
  631.     fflush(stdout);
  632.     *outtime = (start[(int)index]) ;
  633.     *outdur = (leng[(int)index]) ;
  634.  
  635.     if( (*outtime == INVALID) || (*outdur == INVALID) )
  636.     {
  637.         printf("oops, I dont have an entry for index %ld\n", index);
  638.         fflush(stdout);
  639.         *outtime = 0;
  640.         *outdur = 0;
  641.     }
  642. }
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649. void    bit_shuffle(long t8c5, long t2c1, long *tval, long *cval)
  650. {
  651.     long     tt, cc, b;
  652.  
  653.     tt = 0 ;
  654.     cc = 0 ;
  655.  
  656.     /* get t8 thru t3 */
  657.     b = 0x00000001 & (t8c5 >> 9) ;
  658.     tt += (b << 8);
  659.  
  660.     b = 0x00000001 & (t8c5 >> 7) ;
  661.     tt += (b << 7);
  662.  
  663.     b = 0x00000001 & (t8c5 >> 5) ;
  664.     tt += (b << 6);
  665.  
  666.     b = 0x00000001 & (t8c5 >> 4) ;
  667.     tt += (b << 5);
  668.  
  669.     b = 0x00000001 & (t8c5 >> 3) ;
  670.     tt += (b << 4);
  671.  
  672.     b = 0x00000001 & t8c5 ;
  673.     tt += (b << 3);
  674.  
  675.  
  676.     /* get c5 thru c2 */
  677.     b = 0x00000001 & (t8c5 >> 8) ;
  678.     cc += (b << 5);
  679.  
  680.     b = 0x00000001 & (t8c5 >> 6) ;
  681.     cc += (b << 4);
  682.  
  683.     b = 0x00000001 & (t8c5 >> 2) ;
  684.     cc += (b << 3);
  685.  
  686.     b = 0x00000001 & (t8c5 >> 1) ;
  687.     cc += (b << 2) ;
  688.  
  689.  
  690.     /* get t2 thru t0 */
  691.     b = 0x00000001 & (t2c1 >> 4) ;
  692.     tt += (b << 2);
  693.  
  694.     b = 0x00000001 & (t2c1 >> 2) ;
  695.     tt += (b << 1);
  696.  
  697.     b = 0x00000001 & t2c1 ;
  698.     tt += b;
  699.  
  700.  
  701.     /* get c1 thru c0 */
  702.     b = 0x00000001 & (t2c1 >> 3) ;
  703.     cc += (b << 1);
  704.  
  705.     b = 0x00000001 & (t2c1 >> 1) ;
  706.     cc += b ;
  707.  
  708.     *tval = tt;
  709.     *cval = cc;
  710. }
  711.  
  712.  
  713.  
  714.  
  715.  
  716. long     map_top(long day, long year, long top, long digits)
  717. {
  718.     long     d2, d1, d0, y, poot ;
  719.     long     n2, n1, n0, f3, f2, f1, f0;
  720.  
  721.     y = year % 16 ;
  722.     d2 = top / 100 ;
  723.     d1 = (top % 100) / 10 ;
  724.     d0 = top % 10 ;
  725.  
  726.     f0 = 1;
  727.     f1 = (y + 1) % 10;
  728.     f2 = ( ((y+1)*(y+2)) / 2 ) % 10 ;
  729.     f3 = ( ((y+1)*(y+2)*(y+3)) / 6 ) % 10 ;
  730.  
  731.  
  732.     if(digits == 1)
  733.     {
  734.         n0 = ( (d0*f0) + (day*f1) ) % 10 ;
  735.         n1 = 0;
  736.         n2 = 0;
  737.     }
  738.  
  739.     if(digits == 2)
  740.     {
  741.         n0 = ( (d0*f0) + (d1*f1) + (day*f2) ) % 10 ;
  742.         n1 = ( (d1*f0) + (day*f1) ) % 10 ;
  743.         n2 = 0;
  744.     }
  745.  
  746.     if(digits == 3)
  747.     {
  748.         n0 = ( (d0*f0) + (d1*f1) + (d2*f2) + (day*f3) ) % 10 ;
  749.         n1 = ( (d1*f0) + (d2*f1) + (day*f2) ) % 10 ;
  750.         n2 = ( (d2*f0) + (day*f1) ) % 10 ;
  751.     }
  752.  
  753.  
  754.     poot =  (100*n2) + (10*n1) + n0 ;
  755.  
  756.     return( poot );
  757. }
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764. void    offset(long day, long year, long top, long *ofout, long *topout)
  765. {
  766.     long     i, t, tx, off, digits, burp;
  767.     long     pwr ;
  768.  
  769.     pwr = 1 ; digits = 0;
  770.     while(top >= pwr) { digits++; pwr *= 10; }
  771.     pwr = pwr / 10 ;
  772.  
  773.     t = tx = top ;
  774.     off = 0;
  775.     while(tx > 0) { off += (tx % 10);   tx /= 10; }
  776.  
  777. again:
  778.     for(i=0; i<=(year%16); i++)
  779.         {
  780.         burp = ( (map_top(day, i, t, digits)) % 10 ) ;
  781.         off += burp ;
  782.         }
  783.  
  784.     t = map_top(day, year, t, digits) ;
  785.     if(t < pwr) goto again ;
  786.  
  787.  
  788.     *ofout = (off % 32) ;
  789.     *topout = (t) ;
  790. }
  791.  
  792.  
  793. void Syntax(const char *message)
  794. {
  795.    if ( *message != NULL)
  796.    {
  797.       printf(message);
  798.       printf("\n\n");
  799.    }
  800.  
  801.    printf("Decode V1.1 Converts VCR-Plus to Date and time format.\n"
  802.           "\n"
  803.           "DECODE [XXXXXX]\n"
  804.           "\n"
  805.           "   DECODE uses current date.\n"
  806.           "   XXXXXX  - 6 digit VCR-Plus Code from\n"
  807.           "             magazine or newspaper.\n"
  808.           "   /?      - This help info.\n"
  809.          );
  810.     exit(-1);
  811.  
  812. }
  813.  
  814.  
  815.  
  816.  
  817.  
  818.  
  819.  
  820.  
  821.  
  822.