home *** CD-ROM | disk | FTP | other *** search
- PROGRAM DATE;
- CONST
- Esc = #27;
- TYPE
- MONTHTYPE = (JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC);
- DOWTYPE = (SUN,MON,TUE,WED,THU,FRI,SAT);
- YEARTYPE = 1583..9999;
- StringType = STRING[80];
- VAR
- CH : CHAR;
- YEAR : YEARTYPE;
- MONTH : MONTHTYPE;
- DAY_OF_WEEK : DOWTYPE;
-
-
- PROCEDURE GetTime;
- TYPE
- RegsType = RECORD
- AX,BX,CX,DX,BP,
- SI,DI,DS,ES,Flags : INTEGER;
- END;
- TimeType = RECORD
- Year : BYTE;
- Mon_DOW : BYTE;
- Day : BYTE;
- Hour : BYTE;
- Mins : BYTE;
- Secs : BYTE;
- END;
-
- VAR
- Regs : RegsType;
- TimeBuf : TimeType;
-
- FUNCTION Get_Nibble(N : BYTE) : BYTE;
- BEGIN
- Get_Nibble := N AND $F;
- END;
-
- FUNCTION Get_BCD(N : BYTE) : BYTE;
- VAR
- Temp : BYTE;
-
- BEGIN
- Temp := (N SHR 4 ) * 10;
- Get_BCD := Temp + (N AND $F);
- END;
-
- BEGIN
-
- Regs.DX := Ofs(TimeBuf);
- Regs.DS := Seg(TimeBuf);
- Regs.CX := 0;
- INTR(220,Regs);
-
- Year := Get_BCD(TimeBuf.Year) + 1900;
- Month := MonthType(Get_Nibble(TimeBuf.Mon_DOW SHR 4)-1);
- Day_Of_Week := DOWType(Get_Nibble(TimeBuf.Mon_DOW) - 1);
-
- {
- WITH TimeBuf DO BEGIN
- WRITELN('Year ',Get_BCD(Year));
- WRITELN('Month ',Get_Nibble(Mon_DOW SHR 4));
- WRITELN('DOW ',Get_Nibble(Mon_DOW));
- WRITELN('Day ',Get_BCD(Day));
- WRITELN('Hours ',Get_BCD(Hour));
- WRITELN('Mins ',Get_BCD(Mins));
- WRITELN('Secs ',Get_BCD(Secs));
- END;
- HALT;
- }
- END;
-
- PROCEDURE PRINT_MONTH(MONTH : MONTHTYPE;
- YEAR : YEARTYPE;
- VAR DAY_OF_WEEK : DOWTYPE);
- CONST
- SPACE = ' ';
- SPACE6 = ' ';
- VAR
- X : DOWTYPE;
- J : INTEGER;
- ROW : INTEGER;
- DAY_OF_MONTH, DAYS_IN_MONTH : INTEGER;
- NEW_MONTH : BOOLEAN;
-
- PROCEDURE INIT_MONTH;
- BEGIN
- CASE MONTH OF
- JAN,MAR,MAY,JUL,AUG,OCT,DEC : DAYS_IN_MONTH := 31;
- APR,JUN,SEP,NOV : DAYS_IN_MONTH := 30;
- FEB : BEGIN
- DAYS_IN_MONTH := 28;
- IF YEAR MOD 4 = 0
- THEN IF YEAR MOD 100 <> 0 THEN DAYS_IN_MONTH := 29
- ELSE IF YEAR MOD 400 = 0 THEN DAYS_IN_MONTH := 29;
- END; { BEGIN }
- END; { CASE }
- END; { INIT_MONTH }
-
- PROCEDURE DO_START;
- BEGIN
- GOTOXY(16,6);
- DAY_OF_MONTH := 1;
- FOR X := SUN TO SAT DO
- IF X < DAY_OF_WEEK THEN WRITE(SPACE6)
- ELSE BEGIN
- WRITE(DAY_OF_MONTH:5,SPACE);
- DAY_OF_MONTH := DAY_OF_MONTH + 1;
- END; { ELSE BEGIN }
- WRITELN;
- END; { DO_START }
-
- PROCEDURE DO_MIDDLE;
- BEGIN
- GOTOXY(16,ROW);
- FOR X := SUN TO SAT DO
- IF DAY_OF_MONTH <= DAYS_IN_MONTH THEN BEGIN
- WRITE(DAY_OF_MONTH:5,SPACE);
- DAY_OF_MONTH := DAY_OF_MONTH + 1;
- END; { THEN BEGIN }
- ROW := ROW + 3; (* SKIP 3 SCREEN LINES *)
- END; { DO_MIDDLE }
-
- PROCEDURE DO_HEADER;
- BEGIN
- GOTOXY(34,2);
- NormVideo;
- CASE MONTH OF
- JAN : WRITE('JANUARY');
- FEB : WRITE('FEBRUARY');
- MAR : WRITE('MARCH');
- APR : WRITE('APRIL');
- MAY : WRITE('MAY');
- JUN : WRITE('JUNE');
- JUL : WRITE('JULY');
- AUG : WRITE('AUGUST');
- SEP : WRITE('SEPTEMBER');
- OCT : WRITE('OCTOBER');
- NOV : WRITE('NOVEMBER');
- DEC : WRITE('DECEMBER');
- END; { CASE }
- WRITE(YEAR:5);
- LowVideo;
- GOTOXY(15,4); (* CURSOR 1 PLACE BEFORE Reverse *)
- WRITELN(ESC,'[7m','SUN':6,'MON':6,'TUE':6,'WED':6,'THU':6,'FRI':6,'SAT':6,
- ' ',ESC,'[1m');
- END; { DO_HEADER }
-
- BEGIN { PRINT_MONTH }
- ROW := 8; (* FOR SCREEN LINE *)
- NEW_MONTH := TRUE;
- INIT_MONTH;
- ClrScr;
- DO_HEADER;
- NormVideo;
- FOR J := 1 TO 6 DO BEGIN
- IF NEW_MONTH THEN DO_START ELSE DO_MIDDLE;
- NEW_MONTH := FALSE;
- END; { DO BEGIN }
- LowVideo;
- END; { PRINT_MONTH }
-
- PROCEDURE ToUpper(VAR S : StringType);
- VAR
- X : INTEGER;
-
- BEGIN
- FOR X := 1 TO LENGTH(S) DO S[X] := UPCASE(S[X]);
- END; { ToUpper }
-
- PROCEDURE GET_MONTH;
- TYPE
- MonListType = STRING[36];
-
- CONST
- MonList : MonListType = 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
-
- VAR
- M : StringType;
- X : BYTE;
-
- BEGIN { GET_MONTH }
- REPEAT
- GOTOXY(0,21); ClrEol;
- WRITE('Month: '); READLN(M);
- M := COPY(M,1,3);
- ToUpper(M);
- X := POS(M,MonList);
- UNTIL X <> 0;
- Month := MonthType((X - 1) DIV 3);
- REPEAT
- GOTOXY(0,22); ClrEol;
- WRITE('Year: '); READLN(YEAR);
- IF (YEAR >= 0) AND (YEAR < 100) THEN YEAR := YEAR + 1900;
- UNTIL (YEAR >= 1583) AND (YEAR <= 9999);
- END; { GET_MONTH }
-
- PROCEDURE GET_DOW(Y : YEARTYPE; M : MONTHTYPE);
- VAR
- X,CENTURY,YEAR,MONTH,DAY : INTEGER;
- BEGIN
- YEAR := Y;
- MONTH := ORD(M) + 1;
- DAY := 1;
- MONTH := MONTH - 2;
- IF MONTH < 1 THEN BEGIN
- MONTH := MONTH + 12;
- YEAR := YEAR - 1;
- END; { THEN BEGIN }
- CENTURY := YEAR DIV 100;
- YEAR := YEAR MOD 100;
- X := ((26*MONTH-2) DIV 10 + DAY + YEAR + YEAR DIV 4 + CENTURY DIV 4
- - (CENTURY * 2)) MOD 7;
- Day_Of_Week := DOWType(X);
- END; { GET_DOW }
-
- BEGIN { MAIN }
- LowVideo; WRITELN('Calendar version 3.0'); WRITELN;
- GetTime;
- REPEAT
- REPEAT
- Get_DOW(YEAR,MONTH);
- PRINT_MONTH(MONTH,YEAR,DAY_OF_WEEK);
- GOTOXY(0,23); WRITE('<--[ , ]--> , Q(uit, N(ew ');
- REPEAT
- READ(KBD,CH);
- CH := UPCASE(CH);
- UNTIL CH IN ['Q','N',#29,#8,#19,#12,#4];
- CASE CH OF
- 'Q' : HALT;
- #29,#8,#19 : IF MONTH = JAN THEN BEGIN
- MONTH := DEC;
- YEAR := YEAR - 1;
- END
- ELSE MONTH := PRED(MONTH);
- #12,#4 : IF MONTH = DEC THEN BEGIN
- MONTH := JAN;
- YEAR := YEAR + 1;
- END
- ELSE MONTH := SUCC(MONTH);
- END; { CASE }
- UNTIL CH = 'N';
- Get_Month;
- Get_DOW(Year,Month);
- UNTIL FALSE;
- END. { MAIN }