crt.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1993-98 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 $8f) or (TextAttr and $70);
  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. movl $0x46c,%edi
  364. movl $-28,%edx
  365. movl %fs:(%edi),%ebx
  366. .LInitDel1:
  367. cmpl %fs:(%edi),%ebx
  368. je .LInitDel1
  369. movl %fs:(%edi),%ebx
  370. movl %edx,%eax
  371. call DelayLoop
  372. notl %eax
  373. xorl %edx,%edx
  374. movl $55,%ecx
  375. divl %ecx
  376. movl %eax,DelayCnt
  377. end;
  378. procedure Delay(MS: Word);assembler;
  379. asm
  380. movzwl MS,%ecx
  381. jecxz .LDelay2
  382. movl $0x400,%edi
  383. movl DelayCnt,%edx
  384. movl %fs:(%edi),%ebx
  385. .LDelay1:
  386. movl %edx,%eax
  387. call DelayLoop
  388. loop .LDelay1
  389. .LDelay2:
  390. end;
  391. procedure sound(hz : word);
  392. begin
  393. if hz=0 then
  394. begin
  395. nosound;
  396. exit;
  397. end;
  398. asm
  399. movzwl hz,%ecx
  400. movl $1193046,%eax
  401. cltd
  402. divl %ecx
  403. movl %eax,%ecx
  404. movb $0xb6,%al
  405. outb %al,$0x43
  406. movb %cl,%al
  407. outb %al,$0x42
  408. movb %ch,%al
  409. outb %al,$0x42
  410. inb $0x61,%al
  411. orb $0x3,%al
  412. outb %al,$0x61
  413. end ['EAX','ECX','EDX'];
  414. end;
  415. procedure nosound;
  416. begin
  417. asm
  418. inb $0x61,%al
  419. andb $0xfc,%al
  420. outb %al,$0x61
  421. end ['EAX'];
  422. end;
  423. {****************************************************************************
  424. HighLevel Crt Functions
  425. ****************************************************************************}
  426. procedure removeline(y : longint);
  427. var
  428. fil : word;
  429. begin
  430. fil:=32 or (textattr shl 8);
  431. y:=WinMinY+y-1;
  432. While (y<WinMaxY) do
  433. begin
  434. dosmemmove(VidSeg,(y*ScreenWidth+(WinMinX-1))*2,
  435. VidSeg,((y-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1)*2);
  436. inc(y);
  437. end;
  438. dosmemfillword(VidSeg,((WinMaxY-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1),fil);
  439. end;
  440. procedure delline;
  441. begin
  442. removeline(wherey);
  443. end;
  444. procedure insline;
  445. var
  446. my,y : longint;
  447. fil : word;
  448. begin
  449. fil:=32 or (textattr shl 8);
  450. y:=WhereY;
  451. my:=WinMaxY-WinMinY;
  452. while (my>=y) do
  453. begin
  454. dosmemmove(VidSeg,(((WinMinY+my-1)-1)*ScreenWidth+(WinMinX-1))*2,
  455. VidSeg,(((WinMinY+my)-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1)*2);
  456. dec(my);
  457. end;
  458. dosmemfillword(VidSeg,(((WinMinY+y-1)-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1),fil);
  459. end;
  460. {****************************************************************************
  461. Extra Crt Functions
  462. ****************************************************************************}
  463. procedure cursoron;
  464. var
  465. regs : trealregs;
  466. begin
  467. regs.realeax:=$0100;
  468. regs.realecx:=$90A;
  469. If VidSeg=$b800 then
  470. regs.realecx:=$90A
  471. else
  472. regs.realecx:=$b0d;
  473. realintr($10,regs);
  474. end;
  475. procedure cursoroff;
  476. var
  477. regs : trealregs;
  478. begin
  479. regs.realeax:=$0100;
  480. regs.realecx:=$ffff;
  481. realintr($10,regs);
  482. end;
  483. procedure cursorbig;
  484. var
  485. regs : trealregs;
  486. begin
  487. regs.realeax:=$0100;
  488. regs.realecx:=$10A;
  489. realintr($10,regs);
  490. end;
  491. {*****************************************************************************
  492. Read and Write routines
  493. *****************************************************************************}
  494. var
  495. CurrX,CurrY : longint;
  496. Procedure WriteChar(c:char);
  497. var
  498. regs : trealregs;
  499. begin
  500. case c of
  501. #10 : inc(CurrY);
  502. #13 : CurrX:=WinMinX;
  503. #8 : begin
  504. if CurrX>WinMinX then
  505. dec(CurrX);
  506. end;
  507. #7 : begin { beep }
  508. regs.dl:=7;
  509. regs.ah:=2;
  510. realintr($21,regs);
  511. end;
  512. else
  513. begin
  514. memw[VidSeg:((CurrY-1)*ScreenWidth+(CurrX-1))*2]:=(textattr shl 8) or byte(c);
  515. inc(CurrX);
  516. end;
  517. end;
  518. if CurrX>WinMaxX then
  519. begin
  520. CurrX:=WinMinX;
  521. inc(CurrY);
  522. end;
  523. while CurrY>WinMaxY do
  524. begin
  525. removeline(1);
  526. dec(CurrY);
  527. end;
  528. end;
  529. Function CrtWrite(var f : textrec):integer;
  530. var
  531. i : longint;
  532. begin
  533. GetScreenCursor(CurrX,CurrY);
  534. for i:=0 to f.bufpos-1 do
  535. WriteChar(f.buffer[i]);
  536. SetScreenCursor(CurrX,CurrY);
  537. f.bufpos:=0;
  538. CrtWrite:=0;
  539. end;
  540. Function CrtRead(Var F: TextRec): Integer;
  541. procedure BackSpace;
  542. begin
  543. if (f.bufpos>0) and (f.bufpos=f.bufend) then
  544. begin
  545. WriteChar(#8);
  546. WriteChar(' ');
  547. WriteChar(#8);
  548. dec(f.bufpos);
  549. dec(f.bufend);
  550. end;
  551. end;
  552. var
  553. ch : Char;
  554. Begin
  555. GetScreenCursor(CurrX,CurrY);
  556. f.bufpos:=0;
  557. f.bufend:=0;
  558. repeat
  559. if f.bufpos>f.bufend then
  560. f.bufend:=f.bufpos;
  561. SetScreenCursor(CurrX,CurrY);
  562. ch:=readkey;
  563. case ch of
  564. #0 : case readkey of
  565. #71 : while f.bufpos>0 do
  566. begin
  567. dec(f.bufpos);
  568. WriteChar(#8);
  569. end;
  570. #75 : if f.bufpos>0 then
  571. begin
  572. dec(f.bufpos);
  573. WriteChar(#8);
  574. end;
  575. #77 : if f.bufpos<f.bufend then
  576. begin
  577. WriteChar(f.bufptr^[f.bufpos]);
  578. inc(f.bufpos);
  579. end;
  580. #79 : while f.bufpos<f.bufend do
  581. begin
  582. WriteChar(f.bufptr^[f.bufpos]);
  583. inc(f.bufpos);
  584. end;
  585. end;
  586. ^S,
  587. #8 : BackSpace;
  588. ^Y,
  589. #27 : begin
  590. f.bufpos:=f.bufend;
  591. while f.bufend>0 do
  592. BackSpace;
  593. end;
  594. #13 : begin
  595. WriteChar(#13);
  596. WriteChar(#10);
  597. f.bufptr^[f.bufend]:=#13;
  598. f.bufptr^[f.bufend+1]:=#10;
  599. inc(f.bufend,2);
  600. break;
  601. end;
  602. #26 : if CheckEOF then
  603. begin
  604. f.bufptr^[f.bufend]:=#26;
  605. inc(f.bufend);
  606. break;
  607. end;
  608. else
  609. begin
  610. if f.bufpos<f.bufsize-2 then
  611. begin
  612. f.buffer[f.bufpos]:=ch;
  613. inc(f.bufpos);
  614. WriteChar(ch);
  615. end;
  616. end;
  617. end;
  618. until false;
  619. f.bufpos:=0;
  620. SetScreenCursor(CurrX,CurrY);
  621. CrtRead:=0;
  622. End;
  623. Function CrtReturn(Var F: TextRec): Integer;
  624. Begin
  625. CrtReturn:=0;
  626. end;
  627. Function CrtClose(Var F: TextRec): Integer;
  628. Begin
  629. F.Mode:=fmClosed;
  630. CrtClose:=0;
  631. End;
  632. Function CrtOpen(Var F: TextRec): Integer;
  633. Begin
  634. If F.Mode=fmOutput Then
  635. begin
  636. TextRec(F).InOutFunc:=@CrtWrite;
  637. TextRec(F).FlushFunc:=@CrtWrite;
  638. end
  639. Else
  640. begin
  641. F.Mode:=fmInput;
  642. TextRec(F).InOutFunc:=@CrtRead;
  643. TextRec(F).FlushFunc:=@CrtReturn;
  644. end;
  645. TextRec(F).CloseFunc:=@CrtClose;
  646. CrtOpen:=0;
  647. End;
  648. procedure AssignCrt(var F: Text);
  649. begin
  650. Assign(F,'');
  651. TextRec(F).OpenFunc:=@CrtOpen;
  652. end;
  653. var
  654. x,y : longint;
  655. begin
  656. { Load startup values }
  657. ScreenWidth:=GetScreenWidth;
  658. ScreenHeight:=GetScreenHeight;
  659. WindMax:=(ScreenWidth-1) or ((ScreenHeight-1) shl 8);
  660. { Load TextAttr }
  661. GetScreenCursor(x,y);
  662. lastmode := mem[$40:$49];
  663. if screenheight>25 then
  664. lastmode:=lastmode or $100;
  665. If not(lastmode=Mono) then
  666. VidSeg := $b800
  667. else
  668. VidSeg := $b000;
  669. TextAttr:=mem[VidSeg:((y-1)*ScreenWidth+(x-1))*2+1];
  670. { Redirect the standard output }
  671. assigncrt(Output);
  672. Rewrite(Output);
  673. TextRec(Output).Handle:=StdOutputHandle;
  674. assigncrt(Input);
  675. Reset(Input);
  676. TextRec(Input).Handle:=StdInputHandle;
  677. { Calculates delay calibration }
  678. initdelay;
  679. end.
  680. {
  681. $Log$
  682. Revision 1.8 1999-11-06 14:38:23 peter
  683. * truncated log
  684. Revision 1.7 1999/11/03 23:47:34 peter
  685. * support extended keys
  686. Revision 1.6 1999/10/22 14:36:20 peter
  687. * crtreturn also needs f:textrec as parameter
  688. Revision 1.5 1999/06/09 16:46:09 peter
  689. * fixed fullwin,textbackground
  690. Revision 1.4 1999/03/26 00:00:17 peter
  691. * fixed lastmode at startup for > 25 lines
  692. Revision 1.3 1999/02/03 09:56:17 florian
  693. + added simple support for monochrome video cards (not cursors yet),
  694. thanks to Jeff Patterson
  695. Revision 1.2 1999/01/22 11:12:09 florian
  696. + support of font8x8 added
  697. Revision 1.1 1998/12/21 13:07:02 peter
  698. * use -FE
  699. Revision 1.17 1998/12/15 22:42:49 peter
  700. * removed temp symbols
  701. Revision 1.16 1998/12/09 23:04:36 jonas
  702. * fixed bug in InsLine (changed "my" from "WinMaxY -1" to "WinMaxY - WinMinY")
  703. Revision 1.15 1998/11/28 14:09:48 peter
  704. * NOATTCDQ define
  705. Revision 1.14 1998/11/26 23:14:52 jonas
  706. * changed cdq to cltd in AT&T assembler block
  707. Revision 1.13 1998/08/26 10:01:54 peter
  708. * fixed readln cursor position
  709. Revision 1.12 1998/08/19 17:57:55 peter
  710. * fixed crtread with wrong cursor position
  711. Revision 1.11 1998/08/19 14:55:44 peter
  712. * fixed removeline which scrolled too much lines
  713. Revision 1.10 1998/08/18 13:32:46 carl
  714. * bugfix to make it work with FPC 0.99.5 (Delayloop is not correctly
  715. converted by ATT parser)
  716. Revision 1.9 1998/08/15 17:00:10 peter
  717. * moved delaycnt from interface to implementation
  718. Revision 1.8 1998/08/08 21:56:45 peter
  719. * updated crt with new delay, almost like bp7 routine
  720. Revision 1.5 1998/05/31 14:18:12 peter
  721. * force att or direct assembling
  722. * cleanup of some files
  723. Revision 1.4 1998/05/28 10:21:38 pierre
  724. * Handles of input and output restored
  725. Revision 1.3 1998/05/27 00:19:16 peter
  726. * fixed crt input
  727. }