crt.pp 17 KB

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