home *** CD-ROM | disk | FTP | other *** search
- PROGRAM DCLOCK ; { by Steve Pauley 7/25/87 }
- { a digital clock/time using 200hz timer }
-
- CONST
- {$I GEMCONST.PAS}
- Zero = 0 ;
- DY = 35 ;
- TYPE
- {$I gemtype.pas} { note that case doesn't matter }
- (* ... your TYPEs ... *)
- Pic_Dat = PACKED ARRAY [ 1..32034 ] of Byte;
- { this is for our off screen buffer }
- scrn_memory = PACKED ARRAY[1..32000] of Byte;
- S_Ptr = ^scrn_memory; { pointer to screen data }
- Path_Chars = PACKED ARRAY [ 1..80 ] OF Char ;
-
- VAR
- (* ... your VARiables ... *)
- x, y : integer ;
- Start,So_Far : long_integer;
- Total_Sec : Long_Integer ;
- Original_Sec : Long_Integer ;
- Temp_Sec,N : Long_Integer ;
- BSec, BMin, BHr : Integer ;
- Sec, Min, Hr : Integer ;
- Temp_Time, Temp_Date : Integer ;
- Sec_1, Sec_10 : Integer ;
- Min_1, Min_10 : Integer ;
- Hr_1, Hr_10 : Integer ;
- Old_Sec_1, Old_Sec_10 : Integer ;
- Old_Min_1, Old_Min_10 : Integer ;
- Old_Hr_1, Old_Hr_10 : Integer ;
- Day, Mon, Yr : Integer ;
- Old_Day : Integer ;
- Old_Mon : Integer ;
- Old_Yr : Integer ;
- Day_1, Day_10 : Integer ;
- Mon_1, Mon_10 : Integer ;
- Yr_1, Yr_10 : Integer ;
- PM_Flag, Keep_Running : Boolean ;
- DX : Integer ; { pionts to location of digit on screen }
- L : Integer ; { for FOR loop }
- Pic_Buf : Pic_Dat; { a place to read picture file data into }
- Scn_buf : scrn_memory; { a place to stash the screen }
- Scn_ptr : S_Ptr; { a pointer to screen }
- Dat_Ptr : Integer ; { position of next pixil data in Pic_Buf array }
- Scn_Buf_Ptr : Integer ; { position of next pixil data in Scn_Buf array }
- Starting_Rez : Integer ; { resolution program was run from }
- Pic_Rez : Integer ; { store picture resolution value }
- Kolor_Reg : ARRAY[ 0..15 ] OF Integer; { stores color registers }
- Starting_Kolor_Reg: ARRAY[ 0..15 ] OF Integer; { stores color registers }
- X_Screen : Long_Integer ; { screen location return from xbios call }
- More : Boolean ; { if true show another picture }
- Valid_Name : Boolean; { flag for valid file name extender }
- F_Name, P_Name : Path_Name ; { file an path names for gem dialoge box }
-
- {$I gemsubs} { and that ".PAS" is default }
- {$I rezcolor} { resolution check/change and color stuff }
- {$I srcnload} { load and display Tiny format background of clock }
- {$I timestuf} { time, date, 200hz timer and event loop stuff }
- {$I digits} { procedures for plotting digits on screen }
- {$I time} { gets time from system and converts to total sec.}
- {$I stopwatc} { run the stop watch procedure }
- {$I date} { gets date from system }
-
-
- PROCEDURE Keep_Time;
- VAR
- which,
- dummy,
- key_state, W_key,
- x, y : integer ;
- msg : Message_Buffer ;
- BEGIN
- Total_Sec := 0;
- Hide_Mouse ;
- REPEAT { wait for button up }
- which := Get_Event( E_Timer | E_Button, $0001, 0, 0,
- 0, { time count of zero - quik return }
- false, 0, 0, 0, 0, false, 0, 0, 0, 0, { no rect's }
- msg, W_Key, { what key }
- dummy, dummy, x, y, key_state ) ;
- UNTIL which>33;
- REPEAT
- { Get a left mouse button event. check for button push to stop clock }
- which := Get_Event( E_Timer | E_Button, $0001, 0, 0,
- 0, { time count of zero - quik return }
- false, 0, 0, 0, 0, false, 0, 0, 0, 0, { no rect's }
- msg, W_Key, { what key }
- dummy, dummy, x, y, key_state ) ;
- So_Far := Ticks ;
- Temp_Sec := So_Far - Start ; { how many seconds times 200 have past }
- Temp_Sec := Temp_Sec DIV 200 ; { convert to seconds }
- Total_Sec := Original_Sec + Temp_Sec ; { original time + time elapesed }
- { ** if greater than 24 hrs start counting over ** }
- IF Total_Sec > 86399 THEN
- BEGIN
- { get time from regular system clock and break into hrs., mins. and sec.}
- Start := Ticks; { starting point for second counter }
- Temp_Time := T_Gettime ; { get system time }
- Sec := ( Temp_Time & 31 ); { Seconds * 2 }
- Sec := Sec * 2 ;
- Min := SHR( ( Temp_Time & 2016 ),5 ); { Minutes }
- Hr := SHR( Temp_Time,11 );{ Hours - military }
- Hr := Hr & 31 ;
- { calculate total seconds from midnight on system clock }
- Total_Sec := 0 ;
- Temp_Sec := Hr ;
- Temp_Sec := ( Temp_Sec*3600 );
- Total_Sec := Temp_Sec ;
- Temp_Sec := Min ;
- Temp_Sec := ( Temp_Sec*60 ) ;
- Total_Sec := Total_Sec + Temp_Sec ;
- Temp_Sec := Sec ;
- Total_Sec := Total_Sec + Temp_Sec ;
- Temp_Sec := Total_Sec ;
- Original_Sec := Total_Sec ;
- So_Far := Ticks ;
- Temp_Sec := So_Far - Start ; { how many seconds times 200 have past }
- Temp_Sec := Temp_Sec DIV 200 ; { convert to seconds }
- Total_Sec := Original_Sec + Temp_Sec ; {original time + time elapesed}
- END;
- { check for pm or am time in seconds and set our flag }
- PM_Flag := False ;
- IF Total_Sec > 43199 THEN PM_Flag := True ;
- { now break down Total_Sec into hours, minutes and seconds }
- Hr := INT( Total_Sec DIV 3600 ) ;
- N := Hr ;
- Total_Sec := Total_Sec - N*3600 ;
- Min := INT( Total_Sec DIV 60 ) ;
- N := Min ;
- Total_Sec := Total_Sec - N*60 ;
- Sec := INT( Total_Sec ) ;
- IF Hr > 12 THEN Hr := Hr - 12 ;
- IF Hr = 0 THEN Hr := 12 ;
- Hr_10 := Hr DIV 10 ;
- Hr_1 := Hr MOD 10 ;
- IF Sec = 0 THEN
- BEGIN
- Sec_1 := 0;
- Sec_10 := 0;
- END
- ELSE BEGIN
- Sec_10 := Sec DIV 10 ;
- Sec_1 := Sec MOD 10 ;
- END;
- IF Min = 0 THEN
- BEGIN
- Min_1 := 0;
- Min_10 := 0;
- END
- ELSE BEGIN
- Min_10 := Min DIV 10 ;
- Min_1 := Min MOD 10 ;
- END;
- { If digits have change Draw New Digit on the screen }
- IF Sec_1 <> Old_Sec_1 THEN
- BEGIN
- DX := 260 ;
- D_Digit( Sec_1 ) ;
- END;
- IF Sec_10 <> Old_Sec_10 THEN
- BEGIN
- DX := 212 ;
- D_Digit( Sec_10 ) ;
- END;
- IF Min_1 <> Old_Min_1 THEN
- BEGIN
- DX := 148 ;
- D_Digit( Min_1 ) ;
- END;
- IF Min_10 <> Old_Min_10 THEN
- BEGIN
- DX := 100 ;
- D_Digit( Min_10 ) ;
- END;
- IF Hr_1 <> Old_Hr_1 THEN
- BEGIN
- DX := 36 ;
- D_Digit( Hr_1 ) ;
- END;
- IF Hr_10 <> Old_Hr_10 THEN D_Hr_10 ;
- Text_Color( 2 );
- IF PM_Flag THEN Draw_String( 272,119,'PM' )
- ELSE Draw_String( 272,119,'AM' );
- Old_Hr_10:=Hr_10; Old_Hr_1:=Hr_1;
- Old_Min_10:=Min_10; Old_Min_1:=Min_1;
- Old_Sec_10:=Sec_10; Old_Sec_1:=Sec_1;
- UNTIL which<34;
- Show_Mouse ;
- END; { of Keep_Time }
-
-
- PROCEDURE Change_Time;
- BEGIN
- Hide_Mouse ;
- Old_Hr_10:=Hr_10; Old_Hr_1:=Hr_1;
- Old_Min_10:=Min_10; Old_Min_1:=Min_1;
- Old_Sec_10:=Sec_10; Old_Sec_1:=Sec_1;
- IF ( X>30 ) AND ( X<52 ) THEN Original_Sec := Original_Sec + 3600;
- IF ( X>52 ) AND ( X<73 ) THEN Original_Sec := Original_Sec - 3600;
- IF ( X>122 ) AND ( X<144 ) THEN Original_Sec := Original_Sec + 60;
- IF ( X>144 ) AND ( X<165 ) THEN Original_Sec := Original_Sec - 60;
- IF ( X>211 ) AND ( X<232 ) THEN Original_Sec := Original_Sec + 1;
- IF ( X>232 ) AND ( X<254 ) THEN Original_Sec := Original_Sec - 1;
- { ** if greater than 24 hrs start counting over ** }
- IF Original_Sec > 86399 THEN Original_Sec := 0 ;
- IF Original_Sec < 0 THEN Original_Sec := 86399 ;
- Total_Sec := Original_Sec ; { new original time }
- { check for pm or am time in seconds and set our flag }
- PM_Flag := False ;
- IF Total_Sec > 43199 THEN PM_Flag := True ;
- { now break down Total_Sec into hours, minutes and seconds }
- Hr := INT( Total_Sec DIV 3600 ) ;
- N := Hr ;
- Total_Sec := Total_Sec - N*3600 ;
- Min := INT( Total_Sec DIV 60 ) ;
- N := Min ;
- Total_Sec := Total_Sec - N*60 ;
- Sec := INT( Total_Sec ) ;
- IF Hr > 12 THEN Hr := Hr - 12 ;
- IF Hr = 0 THEN Hr := 12 ;
- Hr_10 := Hr DIV 10 ;
- Hr_1 := Hr MOD 10 ;
- IF Sec = 0 THEN
- BEGIN
- Sec_1 := 0;
- Sec_10 := 0;
- END
- ELSE BEGIN
- Sec_10 := Sec DIV 10 ;
- Sec_1 := Sec MOD 10 ;
- END;
- IF Min = 0 THEN
- BEGIN
- Min_1 := 0;
- Min_10 := 0;
- END
- ELSE BEGIN
- Min_10 := Min DIV 10 ;
- Min_1 := Min MOD 10 ;
- END;
- { If digits have change Draw New Digit on the screen }
- IF Sec_1 <> Old_Sec_1 THEN
- BEGIN
- DX := 260 ;
- D_Digit( Sec_1 ) ;
- END;
- IF Sec_10 <> Old_Sec_10 THEN
- BEGIN
- DX := 212 ;
- D_Digit( Sec_10 ) ;
- END;
- IF Min_1 <> Old_Min_1 THEN
- BEGIN
- DX := 148 ;
- D_Digit( Min_1 ) ;
- END;
- IF Min_10 <> Old_Min_10 THEN
- BEGIN
- DX := 100 ;
- D_Digit( Min_10 ) ;
- END;
- IF Hr_1 <> Old_Hr_1 THEN
- BEGIN
- DX := 36 ;
- D_Digit( Hr_1 ) ;
- END;
- IF Hr_10 <> Old_Hr_10 THEN D_Hr_10 ;
- Text_Color( 2 );
- IF PM_Flag THEN Draw_String( 272,119,'PM' )
- ELSE Draw_String( 272,119,'AM' );
- Old_Hr_10:=Hr_10; Old_Hr_1:=Hr_1;
- Old_Min_10:=Min_10; Old_Min_1:=Min_1;
- Old_Sec_10:=Sec_10; Old_Sec_1:=Sec_1;
- Show_Mouse ;
- END; { of Change_Time }
-
-
- PROCEDURE Change_Date;
- BEGIN
- Hide_Mouse ;
- { Change Month, Day or Year }
- IF ( X>30 ) AND ( X<52 ) THEN { Up_Mon }
- BEGIN
- Mon := Mon + 1 ;
- IF Mon > 12 THEN Mon := 1 ;
- END ;
- IF ( X>52 ) AND ( X<73 ) THEN { Down_Mon }
- BEGIN
- Mon := Mon - 1 ;
- IF Mon < 1 THEN Mon := 12 ;
- END ;
- IF ( X>122 ) AND ( X<144 ) THEN { Up_Day }
- BEGIN
- Day := Day + 1 ;
- IF Day > 31 THEN Day := 1 ;
- END ;
- IF ( X>144 ) AND ( X<165 ) THEN { Down_Day }
- BEGIN
- Day := Day - 1 ;
- IF Day < 1 THEN Day := 31 ;
- END;
- IF ( X>211 ) AND ( X<232 ) THEN { Up_Yr }
- BEGIN
- Yr := Yr + 1 ;
- END ;
- IF ( X>232 ) AND ( X<254 ) THEN { Down_Yr }
- BEGIN
- Yr := Yr - 1 ;
- IF Yr < 80 Then Yr := 80
- END ;
-
- Day_10 := Day DIV 10 ;
- Day_1 := Day MOD 10 ;
- Mon_10 := Mon DIV 10 ;
- Mon_1 := Mon MOD 10 ;
- Yr_10 := Yr DIV 10 ;
- IF Yr_10 > 9 THEN Yr_10 := Yr_10 - 10 ;
- Yr_1 := Yr MOD 10 ;
-
- { Draw Digit that have changed on the screen }
- IF Mon <> Old_Mon THEN
- BEGIN
- D_Mon_10 ;
- DX := 36 ;
- D_Digit( Mon_1 ) ;
- END ;
- IF Day <> Old_Day THEN
- BEGIN
- DX := 100 ;
- D_Digit( Day_10 ) ;
- DX := 148 ;
- D_Digit( Day_1 ) ;
- END ;
- IF Yr <> Old_Yr THEN
- BEGIN
- DX := 212 ;
- D_Digit( Yr_10 ) ;
- DX := 260 ;
- D_Digit( Yr_1 ) ;
- END ;
-
- Old_Mon := Mon ;
- Old_Day := Day ;
- Old_Yr := Yr ;
-
- Show_Mouse ;
- END ; { of Change_Date }
-
-
- PROCEDURE Time_Set;
- VAR
- Gt, Dummy :integer;
- BEGIN
- { now break down Total_Sec into hours, minutes and seconds }
- Temp_Sec := Original_Sec ;
- Hr := INT( Temp_Sec DIV 3600 ) ;
- N := Hr ;
- Temp_Sec := Temp_Sec - N*3600 ;
- Min := INT( Temp_Sec DIV 60 ) ;
- N := Min ;
- Temp_Sec := Temp_Sec - N*60 ;
- Sec := INT( Temp_Sec DIV 2 ) ;
- Gt := ( Hr * 2048 ) + ( Min * 32 ) + ( Sec ) ;
- Dummy := T_Settime( Gt ) ;
- Start := Ticks ;
- END ; { of Time_Set }
-
-
- PROCEDURE Date_Set;
- VAR
- Gt, Dummy :integer;
- BEGIN
- { now break down Total_Sec into hours, minutes and seconds }
- Gt := ( (Yr-80) * 512 ) + ( Mon * 32 ) + ( Day ) ;
- Dummy := T_Setdate( Gt ) ;
- END ; { of Date_Set }
-
-
- PROCEDURE Option_Loop;
- VAR
- Off : Boolean ;
- Time_Flag : Boolean ;
- which,
- dummy,
- key_state, W_key : Integer ;
- msg : Message_Buffer ;
- BEGIN
- Off := False ;
- Time_Flag := True ;
- REPEAT
- { Get a left mouse button event. }
- REPEAT
- which := Get_Event( E_Timer | E_Button, $0001, 0, 0,
- 0, { time count of zero - quik return }
- false, 0, 0, 0, 0, false, 0, 0, 0, 0, { no rect's }
- msg, W_Key, { what key }
- dummy, dummy, x, y, key_state ) ;
- UNTIL which>33;
- REPEAT
- which := Get_Event( E_Timer | E_Button, $0001, 0, 0,
- 0, { time count of zero - quik return }
- false, 0, 0, 0, 0, false, 0, 0, 0, 0, { no rect's }
- msg, W_Key, { what key }
- dummy, dummy, x, y, key_state ) ;
- UNTIL which<34;
-
- IF X > 319 THEN X := X - 320 ; { correct for running prg. from med.rez }
-
- IF ( Y>110 ) AND ( Y< 122 ) THEN { up/down arrow keys }
- BEGIN
- IF Time_Flag = True THEN Change_Time
- ELSE Change_Date ;
- END;
-
- IF ( Y>163 ) AND ( Y< 176 ) THEN { near option buttons }
- BEGIN
- IF ( X>14 ) AND ( X<63 ) THEN { S/W option picked }
- BEGIN
- IF Time_Flag THEN
- BEGIN
- Original_Sec := 0 ;
- Start := Ticks ;
- Stop_Watch ;
- Event_Loop ;
- Time ;
- END ;
- END;
- IF ( X>63 ) AND ( X<96 ) THEN { RUN option picked }
- BEGIN
- IF ( Time_Flag ) THEN { If time display then run clock }
- BEGIN
- Keep_Time ;
- END;
- END;
- IF ( X>117 ) AND ( X<160 ) THEN { DATE }
- BEGIN
- Time_Flag := False ;
- Date ;
- END;
- IF ( X>160 ) AND ( X<202 ) THEN { TIME }
- BEGIN
- Time_Flag := True ;
- Time ;
- END;
- IF ( X>222 ) AND ( X<256 ) THEN { SET date or time }
- BEGIN
- Hide_Mouse ;
- IF Time_Flag = True THEN Time_Set
- ELSE Date_Set ;
- FOR Dummy := 1 TO 1000 DO { slight delay }
- BEGIN
- Dummy := Dummy ;
- END ;
- Show_Mouse ;
- END;
- IF ( X>256 ) AND ( X<289 ) THEN { OFF }
- BEGIN
- Off := True ;
- END;
- END;
- UNTIL Off ;
- END ; { of Option_Loop }
-
-
- BEGIN { main program }
- IF Init_Gem >= 0 THEN
- BEGIN
- Set_Mouse( M_Bee );
- Save_Kolors ; { reads color registers }
- Starting_Kolor_Reg := Kolor_Reg ; { back-up of starting colors }
- Starting_Rez := Screen_Rez ; { gets rez that program was run from }
- X_Screen := Logical_Screen; { gets visible/logical screen address }
- Pic_Rez := 0 ; { low rez }
- Set_Screen( X_Screen, X_Screen, Pic_Rez ); { change picture rez }
-
- F_Name := 'DCLOCK.RSC' ;
- S_Load; { load raw data in buffer }
- Un_Tiny ; { uncompress data and store in buffer }
- Restore_Kolors ; { sets new picture colors }
- Hide_Mouse;
- Rest_Scn; { move picture buffer to visible screen }
- Temp_Date := T_Getdate ; { get current date from system }
- Day := ( Temp_Date & 31 ) ;
- Mon := SHR( ( Temp_Date & 480 ),5 ) ;
- Yr := SHR( ( Temp_Date ),9 ) ;
- Yr := Yr + 80 ;
- Old_Yr := 0 ; Old_Mon := 0 ; Old_Day := 0 ; { init these variables }
- Time ;
- Show_Mouse ;
- Set_Mouse( M_Point_Hand );
- Option_Loop ;
- Set_Mouse( M_Arrow );
- Kolor_Reg := Starting_Kolor_Reg ;
- Set_Screen( X_Screen, X_Screen, Starting_Rez ); { restore rez }
- Restore_Kolors ; { restore desk top kolors }
- Exit_Gem ;
- END ;
- END.
-