crt.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  1. {
  2. $Id$
  3. Copyright (c) 1999-2000 by the Free Pascal development team.
  4. Borland Pascal 7 Compatible CRT Unit for Go32V2
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit crt;
  12. interface
  13. const
  14. { CRT modes }
  15. BW40 = 0; { 40x25 B/W on Color Adapter }
  16. CO40 = 1; { 40x25 Color on Color Adapter }
  17. BW80 = 2; { 80x25 B/W on Color Adapter }
  18. CO80 = 3; { 80x25 Color on Color Adapter }
  19. Mono = 7; { 80x25 on Monochrome Adapter }
  20. Font8x8 = 256; { Add-in for ROM font }
  21. { Mode constants for 3.0 compatibility }
  22. C40 = CO40;
  23. C80 = CO80;
  24. { Foreground and background color constants }
  25. Black = 0;
  26. Blue = 1;
  27. Green = 2;
  28. Cyan = 3;
  29. Red = 4;
  30. Magenta = 5;
  31. Brown = 6;
  32. LightGray = 7;
  33. { Foreground color constants }
  34. DarkGray = 8;
  35. LightBlue = 9;
  36. LightGreen = 10;
  37. LightCyan = 11;
  38. LightRed = 12;
  39. LightMagenta = 13;
  40. Yellow = 14;
  41. White = 15;
  42. { Add-in for blinking }
  43. Blink = 128;
  44. var
  45. { Interface variables }
  46. CheckBreak: Boolean; { Enable Ctrl-Break }
  47. CheckEOF: Boolean; { Enable Ctrl-Z }
  48. DirectVideo: Boolean; { Enable direct video addressing }
  49. CheckSnow: Boolean; { Enable snow filtering }
  50. LastMode: Word; { Current text mode }
  51. TextAttr: Byte; { Current text attribute }
  52. WindMin: Word; { Window upper left coordinates }
  53. WindMax: Word; { Window lower right coordinates }
  54. { Interface procedures }
  55. procedure AssignCrt(var F: Text);
  56. function KeyPressed: Boolean;
  57. function ReadKey: Char;
  58. procedure TextMode(Mode: Integer);
  59. procedure Window(X1,Y1,X2,Y2: Byte);
  60. procedure GotoXY(X,Y: Byte);
  61. function WhereX: Byte;
  62. function WhereY: Byte;
  63. procedure ClrScr;
  64. procedure ClrEol;
  65. procedure InsLine;
  66. procedure DelLine;
  67. procedure TextColor(Color: Byte);
  68. procedure TextBackground(Color: Byte);
  69. procedure LowVideo;
  70. procedure HighVideo;
  71. procedure NormVideo;
  72. procedure Delay(MS: Word);
  73. procedure Sound(Hz: Word);
  74. procedure NoSound;
  75. {Extra Functions}
  76. procedure cursoron;
  77. procedure cursoroff;
  78. procedure cursorbig;
  79. implementation
  80. uses
  81. go32;
  82. {$ASMMODE ATT}
  83. var
  84. DelayCnt,
  85. ScreenWidth,
  86. ScreenHeight : longint;
  87. VidSeg : Word;
  88. {
  89. definition of textrec is in textrec.inc
  90. }
  91. {$i textrec.inc}
  92. {****************************************************************************
  93. Low level Routines
  94. ****************************************************************************}
  95. procedure setscreenmode(mode : byte);
  96. var
  97. regs : trealregs;
  98. begin
  99. regs.realeax:=mode;
  100. realintr($10,regs);
  101. end;
  102. function GetScreenHeight : longint;
  103. begin
  104. getscreenheight:=mem[$40:$84]+1;
  105. If mem[$40:$84]=0 then
  106. getscreenheight := 25;
  107. end;
  108. function GetScreenWidth : longint;
  109. begin
  110. getscreenwidth:=memw[$40:$4a];
  111. end;
  112. procedure SetScreenCursor(x,y : longint);
  113. var
  114. regs : trealregs;
  115. begin
  116. regs.realeax:=$0200;
  117. regs.realebx:=0;
  118. regs.realedx:=(y-1) shl 8+(x-1);
  119. realintr($10,regs);
  120. end;
  121. procedure GetScreenCursor(var x,y : longint);
  122. begin
  123. x:=mem[$40:$50]+1;
  124. y:=mem[$40:$51]+1;
  125. end;
  126. {****************************************************************************
  127. Helper Routines
  128. ****************************************************************************}
  129. Function WinMinX: Byte;
  130. {
  131. Current Minimum X coordinate
  132. }
  133. Begin
  134. WinMinX:=(WindMin and $ff)+1;
  135. End;
  136. Function WinMinY: Byte;
  137. {
  138. Current Minimum Y Coordinate
  139. }
  140. Begin
  141. WinMinY:=(WindMin shr 8)+1;
  142. End;
  143. Function WinMaxX: Byte;
  144. {
  145. Current Maximum X coordinate
  146. }
  147. Begin
  148. WinMaxX:=(WindMax and $ff)+1;
  149. End;
  150. Function WinMaxY: Byte;
  151. {
  152. Current Maximum Y coordinate;
  153. }
  154. Begin
  155. WinMaxY:=(WindMax shr 8) + 1;
  156. End;
  157. Function FullWin:boolean;
  158. {
  159. Full Screen 80x25? Window(1,1,80,25) is used, allows faster routines
  160. }
  161. begin
  162. FullWin:=(WinMinX=1) and (WinMinY=1) and
  163. (WinMaxX=ScreenWidth) and (WinMaxY=ScreenHeight);
  164. end;
  165. {****************************************************************************
  166. Public Crt Functions
  167. ****************************************************************************}
  168. procedure textmode(mode : integer);
  169. var
  170. regs : trealregs;
  171. begin
  172. lastmode:=mode;
  173. mode:=mode and $ff;
  174. setscreenmode(mode);
  175. { set 8x8 font }
  176. if (lastmode and $100)<>0 then
  177. begin
  178. regs.realeax:=$1112;
  179. regs.realebx:=$0;
  180. realintr($10,regs);
  181. end;
  182. screenwidth:=getscreenwidth;
  183. screenheight:=getscreenheight;
  184. windmin:=0;
  185. windmax:=(screenwidth-1) or ((screenheight-1) shl 8);
  186. end;
  187. Procedure TextColor(Color: Byte);
  188. {
  189. Switch foregroundcolor
  190. }
  191. Begin
  192. TextAttr:=(Color and $f) or (TextAttr and $70);
  193. If (Color>15) Then TextAttr:=TextAttr Or Blink;
  194. End;
  195. Procedure TextBackground(Color: Byte);
  196. {
  197. Switch backgroundcolor
  198. }
  199. Begin
  200. TextAttr:=((Color shl 4) and ($f0 and not Blink)) or (TextAttr and ($0f OR Blink) );
  201. End;
  202. Procedure HighVideo;
  203. {
  204. Set highlighted output.
  205. }
  206. Begin
  207. TextColor(TextAttr Or $08);
  208. End;
  209. Procedure LowVideo;
  210. {
  211. Set normal output
  212. }
  213. Begin
  214. TextColor(TextAttr And $77);
  215. End;
  216. Procedure NormVideo;
  217. {
  218. Set normal back and foregroundcolors.
  219. }
  220. Begin
  221. TextColor(7);
  222. TextBackGround(0);
  223. End;
  224. Procedure GotoXy(X: Byte; Y: Byte);
  225. {
  226. Go to coordinates X,Y in the current window.
  227. }
  228. Begin
  229. If (X>0) and (X<=WinMaxX- WinMinX+1) and
  230. (Y>0) and (Y<=WinMaxY-WinMinY+1) Then
  231. Begin
  232. Inc(X,WinMinX-1);
  233. Inc(Y,WinMinY-1);
  234. SetScreenCursor(x,y);
  235. End;
  236. End;
  237. Procedure Window(X1, Y1, X2, Y2: Byte);
  238. {
  239. Set screen window to the specified coordinates.
  240. }
  241. Begin
  242. if (X1>X2) or (X2>ScreenWidth) or
  243. (Y1>Y2) or (Y2>ScreenHeight) then
  244. exit;
  245. WindMin:=((Y1-1) Shl 8)+(X1-1);
  246. WindMax:=((Y2-1) Shl 8)+(X2-1);
  247. GoToXY(1,1);
  248. End;
  249. Procedure ClrScr;
  250. {
  251. Clear the current window, and set the cursor on 1,1
  252. }
  253. var
  254. fil : word;
  255. y : longint;
  256. begin
  257. fil:=32 or (textattr shl 8);
  258. if FullWin then
  259. DosmemFillWord(VidSeg,0,ScreenHeight*ScreenWidth,fil)
  260. else
  261. begin
  262. for y:=WinMinY to WinMaxY do
  263. DosmemFillWord(VidSeg,((y-1)*ScreenWidth+(WinMinX-1))*2,WinMaxX-WinMinX+1,fil);
  264. end;
  265. Gotoxy(1,1);
  266. end;
  267. Procedure ClrEol;
  268. {
  269. Clear from current position to end of line.
  270. }
  271. var
  272. x,y : longint;
  273. fil : word;
  274. Begin
  275. GetScreenCursor(x,y);
  276. fil:=32 or (textattr shl 8);
  277. if x<WinMaxX then
  278. DosmemFillword(VidSeg,((y-1)*ScreenWidth+(x-1))*2,WinMaxX-x+1,fil);
  279. End;
  280. Function WhereX: Byte;
  281. {
  282. Return current X-position of cursor.
  283. }
  284. var
  285. x,y : longint;
  286. Begin
  287. GetScreenCursor(x,y);
  288. WhereX:=x-WinMinX+1;
  289. End;
  290. Function WhereY: Byte;
  291. {
  292. Return current Y-position of cursor.
  293. }
  294. var
  295. x,y : longint;
  296. Begin
  297. GetScreenCursor(x,y);
  298. WhereY:=y-WinMinY+1;
  299. End;
  300. {*************************************************************************
  301. KeyBoard
  302. *************************************************************************}
  303. var
  304. is_last : boolean;
  305. last : char;
  306. function readkey : char;
  307. var
  308. char2 : char;
  309. char1 : char;
  310. regs : trealregs;
  311. begin
  312. if is_last then
  313. begin
  314. is_last:=false;
  315. readkey:=last;
  316. end
  317. else
  318. begin
  319. regs.ah:=$10;
  320. realintr($16,regs);
  321. if (regs.al=$e0) and (regs.ah<>0) then
  322. regs.al:=0;
  323. char1:=chr(regs.al);
  324. char2:=chr(regs.ah);
  325. if char1=#0 then
  326. begin
  327. is_last:=true;
  328. last:=char2;
  329. end;
  330. readkey:=char1;
  331. end;
  332. end;
  333. function keypressed : boolean;
  334. var
  335. regs : trealregs;
  336. begin
  337. if is_last then
  338. begin
  339. keypressed:=true;
  340. exit;
  341. end
  342. else
  343. begin
  344. regs.ah:=$11;
  345. realintr($16,regs);
  346. keypressed:=((regs.realflags and zeroflag) = 0);
  347. end;
  348. end;
  349. {*************************************************************************
  350. Delay
  351. *************************************************************************}
  352. procedure Delayloop;assembler;
  353. asm
  354. .LDelayLoop1:
  355. subl $1,%eax
  356. jc .LDelayLoop2
  357. cmpl %fs:(%edi),%ebx
  358. je .LDelayLoop1
  359. .LDelayLoop2:
  360. end;
  361. procedure initdelay;assembler;
  362. asm
  363. { for some reason, using int $31/ax=$901 doesn't work here }
  364. { and interrupts are always disabled at this point when }
  365. { running a program inside gdb(pas). Web bug 1345 (JM) }
  366. sti
  367. movl $0x46c,%edi
  368. movl $-28,%edx
  369. movl %fs:(%edi),%ebx
  370. .LInitDel1:
  371. cmpl %fs:(%edi),%ebx
  372. je .LInitDel1
  373. movl %fs:(%edi),%ebx
  374. movl %edx,%eax
  375. call DelayLoop
  376. notl %eax
  377. xorl %edx,%edx
  378. movl $55,%ecx
  379. divl %ecx
  380. movl %eax,DelayCnt
  381. end;
  382. procedure Delay(MS: Word);assembler;
  383. asm
  384. movzwl MS,%ecx
  385. jecxz .LDelay2
  386. movl $0x400,%edi
  387. movl DelayCnt,%edx
  388. movl %fs:(%edi),%ebx
  389. .LDelay1:
  390. movl %edx,%eax
  391. call DelayLoop
  392. loop .LDelay1
  393. .LDelay2:
  394. end;
  395. procedure sound(hz : word);
  396. begin
  397. if hz=0 then
  398. begin
  399. nosound;
  400. exit;
  401. end;
  402. asm
  403. movzwl hz,%ecx
  404. movl $1193046,%eax
  405. cltd
  406. divl %ecx
  407. movl %eax,%ecx
  408. inb $0x61,%al
  409. testb $0x3,%al
  410. jnz .Lsound_next
  411. orb $0x3,%al
  412. outb %al,$0x61
  413. movb $0xb6,%al
  414. outb %al,$0x43
  415. .Lsound_next:
  416. movb %cl,%al
  417. outb %al,$0x42
  418. movb %ch,%al
  419. outb %al,$0x42
  420. end ['EAX','ECX','EDX'];
  421. end;
  422. procedure nosound;
  423. begin
  424. asm
  425. inb $0x61,%al
  426. andb $0xfc,%al
  427. outb %al,$0x61
  428. end ['EAX'];
  429. end;
  430. {****************************************************************************
  431. HighLevel Crt Functions
  432. ****************************************************************************}
  433. procedure removeline(y : longint);
  434. var
  435. fil : word;
  436. begin
  437. fil:=32 or (textattr shl 8);
  438. y:=WinMinY+y-1;
  439. While (y<WinMaxY) do
  440. begin
  441. dosmemmove(VidSeg,(y*ScreenWidth+(WinMinX-1))*2,
  442. VidSeg,((y-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1)*2);
  443. inc(y);
  444. end;
  445. dosmemfillword(VidSeg,((WinMaxY-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1),fil);
  446. end;
  447. procedure delline;
  448. begin
  449. removeline(wherey);
  450. end;
  451. procedure insline;
  452. var
  453. my,y : longint;
  454. fil : word;
  455. begin
  456. fil:=32 or (textattr shl 8);
  457. y:=WhereY;
  458. my:=WinMaxY-WinMinY;
  459. while (my>=y) do
  460. begin
  461. dosmemmove(VidSeg,(((WinMinY+my-1)-1)*ScreenWidth+(WinMinX-1))*2,
  462. VidSeg,(((WinMinY+my)-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1)*2);
  463. dec(my);
  464. end;
  465. dosmemfillword(VidSeg,(((WinMinY+y-1)-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1),fil);
  466. end;
  467. {****************************************************************************
  468. Extra Crt Functions
  469. ****************************************************************************}
  470. procedure cursoron;
  471. var
  472. regs : trealregs;
  473. begin
  474. regs.realeax:=$0100;
  475. regs.realecx:=$90A;
  476. If VidSeg=$b800 then
  477. regs.realecx:=$90A
  478. else
  479. regs.realecx:=$b0d;
  480. realintr($10,regs);
  481. end;
  482. procedure cursoroff;
  483. var
  484. regs : trealregs;
  485. begin
  486. regs.realeax:=$0100;
  487. regs.realecx:=$ffff;
  488. realintr($10,regs);
  489. end;
  490. procedure cursorbig;
  491. var
  492. regs : trealregs;
  493. begin
  494. regs.realeax:=$0100;
  495. regs.realecx:=$10A;
  496. realintr($10,regs);
  497. end;
  498. {*****************************************************************************
  499. Read and Write routines
  500. *****************************************************************************}
  501. var
  502. CurrX,CurrY : longint;
  503. Procedure WriteChar(c:char);
  504. var
  505. regs : trealregs;
  506. begin
  507. case c of
  508. #10 : inc(CurrY);
  509. #13 : CurrX:=WinMinX;
  510. #8 : begin
  511. if CurrX>WinMinX then
  512. dec(CurrX);
  513. end;
  514. #7 : begin { beep }
  515. regs.dl:=7;
  516. regs.ah:=2;
  517. realintr($21,regs);
  518. end;
  519. else
  520. begin
  521. memw[VidSeg:((CurrY-1)*ScreenWidth+(CurrX-1))*2]:=(textattr shl 8) or byte(c);
  522. inc(CurrX);
  523. end;
  524. end;
  525. if CurrX>WinMaxX then
  526. begin
  527. CurrX:=WinMinX;
  528. inc(CurrY);
  529. end;
  530. while CurrY>WinMaxY do
  531. begin
  532. removeline(1);
  533. dec(CurrY);
  534. end;
  535. end;
  536. Function CrtWrite(var f : textrec):integer;
  537. var
  538. i : longint;
  539. begin
  540. GetScreenCursor(CurrX,CurrY);
  541. for i:=0 to f.bufpos-1 do
  542. WriteChar(f.buffer[i]);
  543. SetScreenCursor(CurrX,CurrY);
  544. f.bufpos:=0;
  545. CrtWrite:=0;
  546. end;
  547. Function CrtRead(Var F: TextRec): Integer;
  548. procedure BackSpace;
  549. begin
  550. if (f.bufpos>0) and (f.bufpos=f.bufend) then
  551. begin
  552. WriteChar(#8);
  553. WriteChar(' ');
  554. WriteChar(#8);
  555. dec(f.bufpos);
  556. dec(f.bufend);
  557. end;
  558. end;
  559. var
  560. ch : Char;
  561. Begin
  562. GetScreenCursor(CurrX,CurrY);
  563. f.bufpos:=0;
  564. f.bufend:=0;
  565. repeat
  566. if f.bufpos>f.bufend then
  567. f.bufend:=f.bufpos;
  568. SetScreenCursor(CurrX,CurrY);
  569. ch:=readkey;
  570. case ch of
  571. #0 : case readkey of
  572. #71 : while f.bufpos>0 do
  573. begin
  574. dec(f.bufpos);
  575. WriteChar(#8);
  576. end;
  577. #75 : if f.bufpos>0 then
  578. begin
  579. dec(f.bufpos);
  580. WriteChar(#8);
  581. end;
  582. #77 : if f.bufpos<f.bufend then
  583. begin
  584. WriteChar(f.bufptr^[f.bufpos]);
  585. inc(f.bufpos);
  586. end;
  587. #79 : while f.bufpos<f.bufend do
  588. begin
  589. WriteChar(f.bufptr^[f.bufpos]);
  590. inc(f.bufpos);
  591. end;
  592. end;
  593. ^S,
  594. #8 : BackSpace;
  595. ^Y,
  596. #27 : begin
  597. f.bufpos:=f.bufend;
  598. while f.bufend>0 do
  599. BackSpace;
  600. end;
  601. #13 : begin
  602. WriteChar(#13);
  603. WriteChar(#10);
  604. f.bufptr^[f.bufend]:=#13;
  605. f.bufptr^[f.bufend+1]:=#10;
  606. inc(f.bufend,2);
  607. break;
  608. end;
  609. #26 : if CheckEOF then
  610. begin
  611. f.bufptr^[f.bufend]:=#26;
  612. inc(f.bufend);
  613. break;
  614. end;
  615. else
  616. begin
  617. if f.bufpos<f.bufsize-2 then
  618. begin
  619. f.buffer[f.bufpos]:=ch;
  620. inc(f.bufpos);
  621. WriteChar(ch);
  622. end;
  623. end;
  624. end;
  625. until false;
  626. f.bufpos:=0;
  627. SetScreenCursor(CurrX,CurrY);
  628. CrtRead:=0;
  629. End;
  630. Function CrtReturn(Var F: TextRec): Integer;
  631. Begin
  632. CrtReturn:=0;
  633. end;
  634. Function CrtClose(Var F: TextRec): Integer;
  635. Begin
  636. F.Mode:=fmClosed;
  637. CrtClose:=0;
  638. End;
  639. Function CrtOpen(Var F: TextRec): Integer;
  640. Begin
  641. If F.Mode=fmOutput Then
  642. begin
  643. TextRec(F).InOutFunc:=@CrtWrite;
  644. TextRec(F).FlushFunc:=@CrtWrite;
  645. end
  646. Else
  647. begin
  648. F.Mode:=fmInput;
  649. TextRec(F).InOutFunc:=@CrtRead;
  650. TextRec(F).FlushFunc:=@CrtReturn;
  651. end;
  652. TextRec(F).CloseFunc:=@CrtClose;
  653. CrtOpen:=0;
  654. End;
  655. procedure AssignCrt(var F: Text);
  656. begin
  657. Assign(F,'');
  658. TextRec(F).OpenFunc:=@CrtOpen;
  659. end;
  660. { use the C version to avoid using dpmiexcp unit
  661. which makes sysutils and exceptions working incorrectly PM }
  662. function __djgpp_set_ctrl_c(enable : longint) : boolean;cdecl;external;
  663. var
  664. x,y : longint;
  665. begin
  666. { Load startup values }
  667. ScreenWidth:=GetScreenWidth;
  668. ScreenHeight:=GetScreenHeight;
  669. WindMax:=(ScreenWidth-1) or ((ScreenHeight-1) shl 8);
  670. { Load TextAttr }
  671. GetScreenCursor(x,y);
  672. lastmode := mem[$40:$49];
  673. if screenheight>25 then
  674. lastmode:=lastmode or $100;
  675. If not(lastmode=Mono) then
  676. VidSeg := $b800
  677. else
  678. VidSeg := $b000;
  679. TextAttr:=mem[VidSeg:((y-1)*ScreenWidth+(x-1))*2+1];
  680. { Redirect the standard output }
  681. assigncrt(Output);
  682. Rewrite(Output);
  683. TextRec(Output).Handle:=StdOutputHandle;
  684. assigncrt(Input);
  685. Reset(Input);
  686. TextRec(Input).Handle:=StdInputHandle;
  687. { Calculates delay calibration }
  688. initdelay;
  689. { Enable ctrl-c input (JM) }
  690. __djgpp_set_ctrl_c(0);
  691. end.
  692. {
  693. $Log$
  694. Revision 1.5 2001-02-27 15:46:48 jonas
  695. * fixed web bug 1345 (merged)
  696. Revision 1.4 2000/10/31 23:39:30 pierre
  697. * fix for bug 1152 (merged)
  698. Revision 1.1.2.2 2000/10/31 09:32:16 pierre
  699. * fix for bug1152
  700. Revision 1.3 2000/07/31 14:07:43 jonas
  701. Revision 1.1.2.1 2000/07/31 14:05:58 jonas
  702. * fixed web bug 1037 (disable linking of ctrl-c to exception handler,
  703. ctrl-break still works fine then) (merged from fixes)
  704. Revision 1.2 2000/07/13 11:33:39 michael
  705. + removed logs
  706. }