home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TIMEXX.ZIP / TIMEXX.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1985-08-24  |  6.1 KB  |  197 lines

  1. {TIME/DATE IN ENGLISH -- an exercise... thanks to
  2. T.U.G., Bela Lubkin, the author of qt, especially, Skip Gilbrech, others.
  3. Please forward comments/ suggestions to J. Levine at 718 238 7855
  4. or leave on Compuserve 70210,1027.  Thanks}
  5.  
  6. type
  7.     REGPACK = record          {establish record for registers}
  8.         case integer of
  9.             1: (Ax,Bx,Cx,Dx,Bp,Di,Si,Ds,Es,Flags : integer);
  10.             2: (Al,Ah,Bl,Bh,Cl,Ch,Dl,Dh : byte);
  11.     end;
  12.  
  13.     STRING1 = string[1];        {set up strings for varying lengths}
  14.     STRING2 = string[2];
  15.     STRING3 = string[3];
  16.     STRING4 = string[4];
  17.     STRING5 = string[5];
  18.     STRING6 = string[6];
  19.     STRING7 = string[7];
  20.     STRING8 = string[8];
  21.     STRING9 = string[9];
  22.     STRING10 = string[10];
  23.     STRING11 = string[11];
  24.     STRING12 = string[12];
  25.     STRING13 = string[13];
  26.     STRING14 = string[14];
  27.     STRING15 = string[15];
  28.     STRING16 = string[16];
  29.     STRING17 = string[17];
  30.     STRING18 = string[18];
  31.     STRING19 = string[19];
  32.     STRING20 = string[20];
  33.  
  34. var
  35.    rg : regpack;              {variable to be used within procedures}
  36.  
  37. {------------------------------------------------------------------------}
  38. { Fill passed variables with current date from DOS }
  39.  
  40. procedure GetDate ( var Yr : integer; var Mn, Dt, Dy : byte );
  41.                       {Yr, Mn, Dt, Dy will be passed values from registers}
  42.  
  43.  
  44.      begin
  45.           With rg do            {using the registers}
  46.                begin
  47.                     Ah := $2A;      { set AH and perform DOS interrupt }
  48.                     Intr( $21, Rg );
  49.                     Yr := Cx;       { set passed variables to register values }
  50.                     Mn := Dh - 1;   { change 1-12 to 0-11 }
  51.                     Dt := Dl;
  52.                     Dy := Al;
  53.               end;
  54.     end;
  55. {------------------------------------------------------------------------}
  56. { Fill passed variables with current time from DOS }
  57.  
  58. procedure GetTime ( var Hr, Min, Sec, Hsec : byte );
  59.  
  60.  
  61.     begin
  62.          with rg do
  63.              begin
  64.                   Ah := $2C;           { set AH and perform DOS interrupt }
  65.                   Intr( $21, Rg );
  66.  
  67.                   Hr := Ch;         { set passed variables to register values }
  68.                   Min := Cl;
  69.                   Sec := Dh;
  70.                   Hsec := Dl;
  71.              end;
  72.    end;
  73. {------------------------------------------------------------------------}
  74. { Return an ascii string representing minutes past the hour }
  75.  
  76. function GetMin (Min : byte) : STRING17;
  77.  
  78.     const
  79.         MinName1 : array [1..19] of STRING10 =
  80.         (
  81.             'one ','two ','three ','four ','five ','six ','seven ','eight ',
  82.             'nine ','ten ','eleven ','twelve ','thirteen ','fourteen ',
  83.             'fifteen ','sixteen ','seventeen ', 'eighteen ','nineteen '
  84.         );
  85.  
  86.         MinName2 : array[2..5] of STRING6 =
  87.         (
  88.             'twenty','thirty','forty','fifty'
  89.         );
  90.  
  91.     var
  92.         MinTens, MinOnes : integer;     { local variables for 'tens' & 'ones' }
  93.         RetString : STRING17;           { local work string }
  94.  
  95.     begin
  96.         if Min < 20 then          { use only numbers from 'one' to 'nineteen' }
  97.             RetString := MinName1 [ Min ]
  98.         else
  99.             begin                { first get tens, then add ones string }
  100.  
  101.                 MinTens := Min div 10; { use integer division to get 'tens' }
  102.                 MinOnes := Min mod 10; { get remainder to use as 'ones' }
  103.  
  104.                 RetString := MinName2 [ MinTens ];  { get 'tens' string }
  105.  
  106.                 if MinOnes <> 0 then   { concatenate 'ones'
  107.                                        string if appropriate }
  108.                     begin
  109.                         RetString := RetString + '-';
  110.                         RetString := RetString + MinName1 [ MinOnes ];
  111.                     end
  112.                 else
  113.                     RetString := RetString + ' ';
  114.             end;
  115.  
  116.         Getmin := RetString;    { return the completed string }
  117.  
  118.     end;
  119.  
  120. {------------------------------------------------------------------------}
  121. { Return an ascii string representing the hour in 12-hour format }
  122.  
  123. function GetHr (Hr : byte) : STRING7;
  124.  
  125.     const
  126.         HourName : array [0..11] of STRING7 =
  127.         (
  128.             'twelve ','one ','two ','three ','four ','five ',
  129.             'six ','seven ','eight ','nine ','ten ','eleven '
  130.         );
  131.  
  132.     begin
  133.         GetHr := HourName [ Hr mod 12 ]; { ensure value never greater than 11 }
  134.     end;
  135.  
  136. {------------------------------------------------------------------------}
  137. { main body of program }
  138.  
  139. const
  140.     DayName : array [0..6] of STRING9 =
  141.     (
  142.         'Sunday','Monday','Tuesday','Wednesday',
  143.         'Thursday','Friday','Saturday'
  144.     );
  145.  
  146.     MonthName : array [0..11] of STRING9 =
  147.     (
  148.         'January','February','March','April','May','June',
  149.         'July','August','September', 'October','November','December'
  150.     );
  151.  
  152. var                                    {set up the variables}
  153.     Year : integer;
  154.  
  155.     Month, Date, Day, Hour, Min, Sec, Hsec : byte;
  156.  
  157. begin
  158.     Getdate ( Year, Month, Date, Day );
  159.     GetTime ( Hour, Min, Sec, Hsec );
  160.  
  161.     WriteLn;
  162.  
  163.     Write ( 'Today is ', DayName [ Day ], ',', ' ' );
  164.     Write ( MonthName [ Month ], ' ' );
  165.     WriteLn ( Date : 2, ',', ' ', year, '.' );
  166.  
  167.     Write ( 'It is now ' );
  168.     if Min = 0 then
  169.         Write( 'exactly ' )
  170.     else
  171.  
  172.         begin
  173.             Write ( Getmin ( Min ) );
  174.             if Min = 1 then
  175.                 Write ( 'minute past ' )
  176.             else
  177.                 Write ( 'minutes past ' );
  178.         end;
  179.  
  180.     Write ( GetHr ( Hour ) );
  181.  
  182.     case Hour of
  183.         0       :   WriteLn ( 'midnight.' );
  184.         1 .. 11 :   WriteLn ( 'a.m.' );
  185.         12      :   WriteLn ( 'noon.' );
  186.         else        WriteLn ( 'p.m.' );
  187.     end;
  188.  
  189.     WriteLn;
  190.  
  191.     case Hour of
  192.         0 .. 11 :   WriteLn ( ' Good morning.' );
  193.         12 ..17 :   WriteLn ( ' Good afternoon.' );
  194.         else        WriteLn ( ' Good evening.' );
  195.     end;
  196. end.
  197.