2 Copyright (C) 1998 BJ Eirich (aka vecna)
\r
3 This program is free software; you can redistribute it and/or
\r
4 modify it under the terms of the GNU General Public License
\r
5 as published by the Free Software Foundation; either version 2
\r
6 of the License, or (at your option) any later version.
\r
7 This program is distributed in the hope that it will be useful,
\r
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
\r
10 See the GNU General Public Lic
\r
11 See the GNU General Public License for more details.
\r
12 You should have received a copy of the GNU General Public License
\r
13 along with this program; if not, write to the Free Software
\r
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
\r
26 #define PITMODE 0x43
\r
27 #define PITCONST 1193180L
\r
35 // ================================= Data ====================================
\r
37 int _crt0_startup_flags = _CRT0_FLAG_NEARPTR;
\r
38 typedef __dpmi_paddr *PVI;
\r
39 static PVI oldhandler;
\r
41 unsigned int systemtime=0, timer_count=0;
\r
42 int (*callback) (void);
\r
44 // ================================= Code ====================================
\r
46 PVI DJSetHandlerFunc(unsigned char irqno, void (*handler)(), int len)
\r
48 PVI oldvect = (PVI) malloc(sizeof(__dpmi_paddr));
\r
49 int vecno=(irqno>7) ? irqno+0x68 : irqno+0x8;
\r
50 _go32_dpmi_seginfo wrapper;
\r
53 wrapper.pm_offset = (long int) handler;
\r
54 wrapper.pm_selector = _my_cs();
\r
55 _go32_dpmi_allocate_iret_wrapper(&wrapper);
\r
56 new.offset32 = wrapper.pm_offset;
\r
57 new.selector = wrapper.pm_selector;
\r
58 __dpmi_get_and_disable_virtual_interrupt_state();
\r
59 if (len) _go32_dpmi_lock_code(handler,len);
\r
60 _go32_dpmi_lock_data(&wrapper,sizeof(_go32_dpmi_seginfo));
\r
61 __dpmi_get_protected_mode_interrupt_vector(vecno,oldvect);
\r
62 __dpmi_set_protected_mode_interrupt_vector(vecno,&new);
\r
63 __dpmi_get_and_enable_virtual_interrupt_state();
\r
67 void DJSetHandlerAddr(unsigned char irqno, PVI handler)
\r
69 int vecno=(irqno>7) ? irqno+0x68 : irqno+0x8;
\r
70 _go32_dpmi_seginfo wrapper;
\r
71 __dpmi_paddr oldhandler;
\r
73 __dpmi_get_and_disable_virtual_interrupt_state();
\r
74 __dpmi_get_protected_mode_interrupt_vector(vecno, &oldhandler);
\r
75 wrapper.pm_offset = oldhandler.offset32;
\r
76 wrapper.pm_selector = oldhandler.selector;
\r
77 _go32_dpmi_free_iret_wrapper(&wrapper);
\r
78 __dpmi_set_protected_mode_interrupt_vector(vecno,handler);
\r
79 __dpmi_get_and_enable_virtual_interrupt_state();
\r
83 static void SendEOI (unsigned char irqno)
\r
85 unsigned char ocr=(irqno>7) ? OCR2 : OCR1;
\r
86 unsigned char eoi=0x60|(irqno&7);
\r
89 if (irqno>7) outportb(OCR1,0x20);
\r
92 static void newhandler(void)
\r
96 if (cpu_watch) CPUTick();
\r
97 if (callback) callback();
\r
98 CheckTileAnimation();
\r
104 static void EndNewHandler() { }
\r
106 void sethz(unsigned int hz)
\r
107 { unsigned int pit0_set, pit0_value;
\r
111 outportb(PITMODE, 0x34);
\r
112 pit0_value=PITCONST / hz;
\r
113 pit0_set=(pit0_value & 0x00ff);
\r
114 outportb(PIT0, pit0_set);
\r
115 pit0_set=(pit0_value >> 8);
\r
116 outportb(PIT0, pit0_set);
\r
124 outportb(PITMODE, 0x34);
\r
125 outportb(PIT0, 0x00);
\r
126 outportb(PIT0, 0x00);
\r
132 oldhandler = DJSetHandlerFunc(0, (void *) newhandler,
\r
133 ((int) EndNewHandler) - ((int) newhandler));
\r
137 void ShutdownTimer()
\r
139 DJSetHandlerAddr(0, oldhandler);
\r