blob: 233f378ebef059195081a17127d3af3f828ac7bc [file] [log] [blame]
Alexandre Julliard9ea19e51997-01-01 17:29:55 +00001/*
2 * BIOS interrupt 1ah handler
Alexandre Julliard0799c1a2002-03-09 23:29:33 +00003 *
4 * Copyright 1993 Erik Bos
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000019 */
20
Alexandre Julliard0e607781993-11-03 19:23:37 +000021#include <time.h>
Alexandre Julliarde2abbb11995-03-19 17:39:39 +000022#include <sys/time.h>
Alexandre Julliard58199531994-04-21 01:20:00 +000023#include <stdlib.h>
Alexandre Julliard7e50df31994-08-06 11:22:41 +000024#include "options.h"
Alexandre Julliard234bc241994-12-10 13:02:28 +000025#include "miscemu.h"
Alexandre Julliard0799c1a2002-03-09 23:29:33 +000026#include "wine/debug.h"
Alexandre Julliard0e607781993-11-03 19:23:37 +000027
Alexandre Julliard0799c1a2002-03-09 23:29:33 +000028WINE_DEFAULT_DEBUG_CHANNEL(int);
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000029
Alexandre Julliard0e607781993-11-03 19:23:37 +000030#define BCD_TO_BIN(x) ((x&15) + (x>>4)*10)
31#define BIN_TO_BCD(x) ((x%10) + ((x/10)<<4))
32
Alexandre Julliarde2991ea1995-07-29 13:09:43 +000033
34/**********************************************************************
Alexandre Julliardb7258be1995-09-01 15:57:28 +000035 * INT1A_GetTicksSinceMidnight
36 *
37 * Return number of clock ticks since midnight.
38 */
39DWORD INT1A_GetTicksSinceMidnight(void)
40{
41 struct tm *bdtime;
42 struct timeval tvs;
Alexandre Julliardaf0bae51995-10-03 17:06:08 +000043 time_t seconds;
Alexandre Julliardb7258be1995-09-01 15:57:28 +000044
45 /* This should give us the (approximately) correct
46 * 18.206 clock ticks per second since midnight.
47 */
48 gettimeofday( &tvs, NULL );
Alexandre Julliardaf0bae51995-10-03 17:06:08 +000049 seconds = tvs.tv_sec;
50 bdtime = localtime( &seconds );
Alexandre Julliardb7258be1995-09-01 15:57:28 +000051 return (((bdtime->tm_hour * 3600 + bdtime->tm_min * 60 +
52 bdtime->tm_sec) * 18206) / 1000) +
53 (tvs.tv_usec / 54927);
54}
55
56
57/**********************************************************************
Patrik Stridvall3ca98232001-06-20 23:03:14 +000058 * INT_Int1aHandler (WPROCS.126)
Alexandre Julliarde2991ea1995-07-29 13:09:43 +000059 *
Alexandre Julliarda0d77311998-09-13 16:32:00 +000060 * Handler for int 1ah
61 * 0x00 - 0x07 - date and time
62 * 0x?? - 0x?? - Microsoft Real Time Compression Interface
63 */
Alexandre Julliard617955d1999-06-26 18:40:24 +000064void WINAPI INT_Int1aHandler( CONTEXT86 *context )
Alexandre Julliarde2991ea1995-07-29 13:09:43 +000065{
Alexandre Julliard808cb041995-08-17 17:11:36 +000066 time_t ltime;
67 DWORD ticks;
68 struct tm *bdtime;
Alexandre Julliard0e607781993-11-03 19:23:37 +000069
Alexandre Julliardca22b331996-07-12 19:02:39 +000070 switch(AH_reg(context))
Alexandre Julliard808cb041995-08-17 17:11:36 +000071 {
Alexandre Julliarda0d77311998-09-13 16:32:00 +000072 case 0x00:
Alexandre Julliardb7258be1995-09-01 15:57:28 +000073 ticks = INT1A_GetTicksSinceMidnight();
Alexandre Julliardca22b331996-07-12 19:02:39 +000074 CX_reg(context) = HIWORD(ticks);
75 DX_reg(context) = LOWORD(ticks);
76 AX_reg(context) = 0; /* No midnight rollover */
Alexandre Julliard61fece01999-06-26 19:09:08 +000077 TRACE("int1a: AH=00 -- ticks=%ld\n", ticks);
Alexandre Julliardb7258be1995-09-01 15:57:28 +000078 break;
Alexandre Julliard0e607781993-11-03 19:23:37 +000079
Alexandre Julliarda0d77311998-09-13 16:32:00 +000080 case 0x02:
Alexandre Julliard0e607781993-11-03 19:23:37 +000081 ltime = time(NULL);
82 bdtime = localtime(&ltime);
83
Alexandre Julliardca22b331996-07-12 19:02:39 +000084 CX_reg(context) = (BIN_TO_BCD(bdtime->tm_hour)<<8) |
85 BIN_TO_BCD(bdtime->tm_min);
86 DX_reg(context) = (BIN_TO_BCD(bdtime->tm_sec)<<8);
Alexandre Julliard0e607781993-11-03 19:23:37 +000087
Alexandre Julliarda0d77311998-09-13 16:32:00 +000088 case 0x04:
Alexandre Julliard0e607781993-11-03 19:23:37 +000089 ltime = time(NULL);
90 bdtime = localtime(&ltime);
Alexandre Julliardca22b331996-07-12 19:02:39 +000091 CX_reg(context) = (BIN_TO_BCD(bdtime->tm_year/100)<<8) |
92 BIN_TO_BCD((bdtime->tm_year-1900)%100);
93 DX_reg(context) = (BIN_TO_BCD(bdtime->tm_mon)<<8) |
94 BIN_TO_BCD(bdtime->tm_mday);
Alexandre Julliard0e607781993-11-03 19:23:37 +000095 break;
96
97 /* setting the time,date or RTC is not allow -EB */
Alexandre Julliarda0d77311998-09-13 16:32:00 +000098 case 0x01:
Alexandre Julliard0e607781993-11-03 19:23:37 +000099 /* set system time */
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000100 case 0x03:
Alexandre Julliard0e607781993-11-03 19:23:37 +0000101 /* set RTC time */
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000102 case 0x05:
Alexandre Julliard0e607781993-11-03 19:23:37 +0000103 /* set RTC date */
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000104 case 0x06:
Alexandre Julliard0e607781993-11-03 19:23:37 +0000105 /* set ALARM */
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000106 case 0x07:
Alexandre Julliard0e607781993-11-03 19:23:37 +0000107 /* cancel ALARM */
108 break;
109
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000110 case 0xb0: /* Microsoft Real Time Compression */
111 switch AL_reg(context)
112 {
113 case 0x01:
114 /* not present */
115 break;
116 default:
117 INT_BARF(context, 0x1a);
118 }
119 break;
120
Alexandre Julliard0e607781993-11-03 19:23:37 +0000121 default:
Alexandre Julliardca22b331996-07-12 19:02:39 +0000122 INT_BARF( context, 0x1a );
Alexandre Julliard808cb041995-08-17 17:11:36 +0000123 }
Alexandre Julliard0e607781993-11-03 19:23:37 +0000124}