crt.pp 16 KB

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