crt.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  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 Go32V1 and 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, { don't modify this var name, as it is hard coded }
  86. ScreenWidth,
  87. ScreenHeight : longint;
  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. begin
  97. asm
  98. movb 8(%ebp),%al
  99. xorb %ah,%ah
  100. pushl %ebp
  101. int $0x10
  102. popl %ebp
  103. end;
  104. end;
  105. function GetScreenHeight : longint;
  106. begin
  107. dosmemget($40,$84,getscreenheight,1);
  108. inc(getscreenheight);
  109. end;
  110. function GetScreenWidth : longint;
  111. begin
  112. dosmemget($40,$4a,getscreenwidth,1);
  113. end;
  114. procedure SetScreenCursor(x,y : longint);
  115. begin
  116. asm
  117. movb $0x02,%ah
  118. movb $0,%bh
  119. movb y,%dh
  120. movb x,%dl
  121. subw $0x0101,%dx
  122. pushl %ebp
  123. int $0x10
  124. popl %ebp
  125. end;
  126. end;
  127. procedure GetScreenCursor(var x,y : longint);
  128. begin
  129. x:=0;
  130. y:=0;
  131. dosmemget($40,$50,x,1);
  132. dosmemget($40,$51,y,1);
  133. inc(x);
  134. inc(y);
  135. end;
  136. {****************************************************************************
  137. Helper Routines
  138. ****************************************************************************}
  139. Function WinMinX: Byte;
  140. {
  141. Current Minimum X coordinate
  142. }
  143. Begin
  144. WinMinX:=(WindMin and $ff)+1;
  145. End;
  146. Function WinMinY: Byte;
  147. {
  148. Current Minimum Y Coordinate
  149. }
  150. Begin
  151. WinMinY:=(WindMin shr 8)+1;
  152. End;
  153. Function WinMaxX: Byte;
  154. {
  155. Current Maximum X coordinate
  156. }
  157. Begin
  158. WinMaxX:=(WindMax and $ff)+1;
  159. End;
  160. Function WinMaxY: Byte;
  161. {
  162. Current Maximum Y coordinate;
  163. }
  164. Begin
  165. WinMaxY:=(WindMax shr 8) + 1;
  166. End;
  167. Function FullWin:boolean;
  168. {
  169. Full Screen 80x25? Window(1,1,80,25) is used, allows faster routines
  170. }
  171. begin
  172. FullWin:=(WindMax-WindMin=$184f);
  173. end;
  174. {****************************************************************************
  175. Public Crt Functions
  176. ****************************************************************************}
  177. procedure textmode(mode : integer);
  178. begin
  179. lastmode:=mode;
  180. mode:=mode and $ff;
  181. setscreenmode(mode);
  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 $8f) or (TextAttr and $70);
  193. End;
  194. Procedure TextBackground(Color: Byte);
  195. {
  196. Switch backgroundcolor
  197. }
  198. Begin
  199. TextAttr:=(Color shl 4) or (TextAttr and $0f);
  200. End;
  201. Procedure HighVideo;
  202. {
  203. Set highlighted output.
  204. }
  205. Begin
  206. TextColor(TextAttr Or $08);
  207. End;
  208. Procedure LowVideo;
  209. {
  210. Set normal output
  211. }
  212. Begin
  213. TextColor(TextAttr And $77);
  214. End;
  215. Procedure NormVideo;
  216. {
  217. Set normal back and foregroundcolors.
  218. }
  219. Begin
  220. TextColor(7);
  221. TextBackGround(0);
  222. End;
  223. Procedure GotoXy(X: Byte; Y: Byte);
  224. {
  225. Go to coordinates X,Y in the current window.
  226. }
  227. Begin
  228. If (X>0) and (X<=WinMaxX- WinMinX+1) and
  229. (Y>0) and (Y<=WinMaxY-WinMinY+1) Then
  230. Begin
  231. Inc(X,WinMinX-1);
  232. Inc(Y,WinMinY-1);
  233. SetScreenCursor(x,y);
  234. End;
  235. End;
  236. Procedure Window(X1, Y1, X2, Y2: Byte);
  237. {
  238. Set screen window to the specified coordinates.
  239. }
  240. Begin
  241. if (X1>X2) or (X2>ScreenWidth) or
  242. (Y1>Y2) or (Y2>ScreenHeight) then
  243. exit;
  244. WindMin:=((Y1-1) Shl 8)+(X1-1);
  245. WindMax:=((Y2-1) Shl 8)+(X2-1);
  246. GoToXY(1,1);
  247. End;
  248. Procedure ClrScr;
  249. {
  250. Clear the current window, and set the cursor on 1,1
  251. }
  252. var
  253. fil : word;
  254. y : longint;
  255. begin
  256. fil:=32 or (textattr shl 8);
  257. if FullWin then
  258. DosmemFillWord($b800,0,ScreenHeight*ScreenWidth,fil)
  259. else
  260. begin
  261. for y:=WinMinY to WinMaxY do
  262. DosmemFillWord($b800,((y-1)*ScreenWidth+(WinMinX-1))*2,WinMaxX-WinMinX+1,fil);
  263. end;
  264. Gotoxy(1,1);
  265. end;
  266. Procedure ClrEol;
  267. {
  268. Clear from current position to end of line.
  269. }
  270. var
  271. x,y : longint;
  272. fil : word;
  273. Begin
  274. GetScreenCursor(x,y);
  275. fil:=32 or (textattr shl 8);
  276. if x<WinMaxX then
  277. DosmemFillword($b800,((y-1)*ScreenWidth+(x-1))*2,WinMaxX-x+1,fil);
  278. End;
  279. Function WhereX: Byte;
  280. {
  281. Return current X-position of cursor.
  282. }
  283. var
  284. x,y : longint;
  285. Begin
  286. GetScreenCursor(x,y);
  287. WhereX:=x-WinMinX+1;
  288. End;
  289. Function WhereY: Byte;
  290. {
  291. Return current Y-position of cursor.
  292. }
  293. var
  294. x,y : longint;
  295. Begin
  296. GetScreenCursor(x,y);
  297. WhereY:=y-WinMinY+1;
  298. End;
  299. {*************************************************************************
  300. KeyBoard
  301. *************************************************************************}
  302. var
  303. is_last : boolean;
  304. last : char;
  305. function readkey : char;
  306. var
  307. char2 : char;
  308. char1 : char;
  309. begin
  310. if is_last then
  311. begin
  312. is_last:=false;
  313. readkey:=last;
  314. end
  315. else
  316. begin
  317. asm
  318. movb $0,%ah
  319. pushl %ebp
  320. int $0x16
  321. popl %ebp
  322. movb %al,char1
  323. movb %ah,char2
  324. end;
  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. begin
  335. if is_last then
  336. begin
  337. keypressed:=true;
  338. exit;
  339. end
  340. else
  341. begin
  342. asm
  343. movb $1,%ah
  344. pushl %ebp
  345. int $0x16
  346. popl %ebp
  347. setnz %al
  348. movb %al,__RESULT
  349. end;
  350. end;
  351. end;
  352. {*************************************************************************
  353. Delay
  354. *************************************************************************}
  355. procedure Delayloop;assembler;
  356. asm
  357. .LDelayLoop1:
  358. subl $1,%eax
  359. jc .LDelayLoop2
  360. cmpl %fs:(%edi),%ebx
  361. je .LDelayLoop1
  362. .LDelayLoop2:
  363. end;
  364. procedure initdelay;assembler;
  365. asm
  366. movl $0x46c,%edi
  367. movl $-28,%edx
  368. movl %fs:(%edi),%ebx
  369. .LInitDel1:
  370. cmpl %fs:(%edi),%ebx
  371. je .LInitDel1
  372. movl %fs:(%edi),%ebx
  373. movl %edx,%eax
  374. call DelayLoop
  375. notl %eax
  376. xorl %edx,%edx
  377. movl $55,%ecx
  378. divl %ecx
  379. movl %eax,DelayCnt
  380. end;
  381. procedure Delay(MS: Word);assembler;
  382. asm
  383. movzwl MS,%ecx
  384. jecxz .LDelay2
  385. movl $0x400,%edi
  386. movl DelayCnt,%edx
  387. movl %fs:(%edi),%ebx
  388. .LDelay1:
  389. movl %edx,%eax
  390. call DelayLoop
  391. loop .LDelay1
  392. .LDelay2:
  393. end;
  394. procedure sound(hz : word);
  395. begin
  396. if hz=0 then
  397. begin
  398. nosound;
  399. exit;
  400. end;
  401. asm
  402. movzwl hz,%ecx
  403. movl $1193046,%eax
  404. cltd
  405. divl %ecx
  406. movl %eax,%ecx
  407. movb $0xb6,%al
  408. outb %al,$0x43
  409. movb %cl,%al
  410. outb %al,$0x42
  411. movb %ch,%al
  412. outb %al,$0x42
  413. inb $0x61,%al
  414. orb $0x3,%al
  415. outb %al,$0x61
  416. end ['EAX','ECX','EDX'];
  417. end;
  418. procedure nosound;
  419. begin
  420. asm
  421. inb $0x61,%al
  422. andb $0xfc,%al
  423. outb %al,$0x61
  424. end ['EAX'];
  425. end;
  426. {****************************************************************************
  427. HighLevel Crt Functions
  428. ****************************************************************************}
  429. procedure removeline(y : longint);
  430. var
  431. fil : word;
  432. begin
  433. fil:=32 or (textattr shl 8);
  434. y:=WinMinY+y-1;
  435. While (y<WinMaxY) do
  436. begin
  437. dosmemmove($b800,(y*ScreenWidth+(WinMinX-1))*2,
  438. $b800,((y-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1)*2);
  439. inc(y);
  440. end;
  441. dosmemfillword($b800,((WinMaxY-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1),fil);
  442. end;
  443. procedure delline;
  444. begin
  445. removeline(wherey);
  446. end;
  447. procedure insline;
  448. var
  449. my,y : longint;
  450. fil : word;
  451. begin
  452. fil:=32 or (textattr shl 8);
  453. y:=WhereY;
  454. my:=WinMaxY-WinMinY;
  455. while (my>=y) do
  456. begin
  457. dosmemmove($b800,(((WinMinY+my-1)-1)*ScreenWidth+(WinMinX-1))*2,
  458. $b800,(((WinMinY+my)-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1)*2);
  459. dec(my);
  460. end;
  461. dosmemfillword($b800,(((WinMinY+y-1)-1)*ScreenWidth+(WinMinX-1))*2,(WinMaxX-WinMinX+1),fil);
  462. end;
  463. {****************************************************************************
  464. Extra Crt Functions
  465. ****************************************************************************}
  466. procedure cursoron;
  467. begin
  468. asm
  469. movb $1,%ah
  470. movb $10,%cl
  471. movb $9,%ch
  472. pushl %ebp
  473. int $0x10
  474. popl %ebp
  475. end;
  476. end;
  477. procedure cursoroff;
  478. begin
  479. asm
  480. movb $1,%ah
  481. movb $-1,%cl
  482. movb $-1,%ch
  483. pushl %ebp
  484. int $0x10
  485. popl %ebp
  486. end;
  487. end;
  488. procedure cursorbig;
  489. begin
  490. asm
  491. movb $1,%ah
  492. movw $110,%cx
  493. pushl %ebp
  494. int $0x10
  495. popl %ebp
  496. end;
  497. end;
  498. {*****************************************************************************
  499. Read and Write routines
  500. *****************************************************************************}
  501. var
  502. CurrX,CurrY : longint;
  503. Procedure WriteChar(c:char);
  504. var
  505. chattr : word;
  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. end;
  516. else
  517. begin
  518. chattr:=(textattr shl 8) or byte(c);
  519. dosmemput($b800,((CurrY-1)*ScreenWidth+(CurrX-1))*2,chattr,2);
  520. inc(CurrX);
  521. end;
  522. end;
  523. if CurrX>WinMaxX then
  524. begin
  525. CurrX:=WinMinX;
  526. inc(CurrY);
  527. end;
  528. while CurrY>WinMaxY do
  529. begin
  530. removeline(1);
  531. dec(CurrY);
  532. end;
  533. end;
  534. Function CrtWrite(var f : textrec):integer;
  535. var
  536. i : longint;
  537. begin
  538. GetScreenCursor(CurrX,CurrY);
  539. for i:=0 to f.bufpos-1 do
  540. WriteChar(f.buffer[i]);
  541. SetScreenCursor(CurrX,CurrY);
  542. f.bufpos:=0;
  543. CrtWrite:=0;
  544. end;
  545. Function CrtRead(Var F: TextRec): Integer;
  546. procedure BackSpace;
  547. begin
  548. if (f.bufpos>0) and (f.bufpos=f.bufend) then
  549. begin
  550. WriteChar(#8);
  551. WriteChar(' ');
  552. WriteChar(#8);
  553. dec(f.bufpos);
  554. dec(f.bufend);
  555. end;
  556. end;
  557. var
  558. ch : Char;
  559. Begin
  560. GetScreenCursor(CurrX,CurrY);
  561. f.bufpos:=0;
  562. f.bufend:=0;
  563. repeat
  564. if f.bufpos>f.bufend then
  565. f.bufend:=f.bufpos;
  566. SetScreenCursor(CurrX,CurrY);
  567. ch:=readkey;
  568. case ch of
  569. #0 : case readkey of
  570. #71 : while f.bufpos>0 do
  571. begin
  572. dec(f.bufpos);
  573. WriteChar(#8);
  574. end;
  575. #75 : if f.bufpos>0 then
  576. begin
  577. dec(f.bufpos);
  578. WriteChar(#8);
  579. end;
  580. #77 : if f.bufpos<f.bufend then
  581. begin
  582. WriteChar(f.bufptr^[f.bufpos]);
  583. inc(f.bufpos);
  584. end;
  585. #79 : while f.bufpos<f.bufend do
  586. begin
  587. WriteChar(f.bufptr^[f.bufpos]);
  588. inc(f.bufpos);
  589. end;
  590. end;
  591. ^S,
  592. #8 : BackSpace;
  593. ^Y,
  594. #27 : begin
  595. f.bufpos:=f.bufend;
  596. while f.bufend>0 do
  597. BackSpace;
  598. end;
  599. #13 : begin
  600. WriteChar(#13);
  601. WriteChar(#10);
  602. f.bufptr^[f.bufend]:=#13;
  603. f.bufptr^[f.bufend+1]:=#10;
  604. inc(f.bufend,2);
  605. break;
  606. end;
  607. #26 : if CheckEOF then
  608. begin
  609. f.bufptr^[f.bufend]:=#26;
  610. inc(f.bufend);
  611. break;
  612. end;
  613. else
  614. begin
  615. if f.bufpos<f.bufsize-2 then
  616. begin
  617. f.buffer[f.bufpos]:=ch;
  618. inc(f.bufpos);
  619. WriteChar(ch);
  620. end;
  621. end;
  622. end;
  623. until false;
  624. f.bufpos:=0;
  625. SetScreenCursor(CurrX,CurrY);
  626. CrtRead:=0;
  627. End;
  628. Function CrtReturn:Integer;
  629. Begin
  630. CrtReturn:=0;
  631. end;
  632. Function CrtClose(Var F: TextRec): Integer;
  633. Begin
  634. F.Mode:=fmClosed;
  635. CrtClose:=0;
  636. End;
  637. Function CrtOpen(Var F: TextRec): Integer;
  638. Begin
  639. If F.Mode=fmOutput Then
  640. begin
  641. TextRec(F).InOutFunc:=@CrtWrite;
  642. TextRec(F).FlushFunc:=@CrtWrite;
  643. end
  644. Else
  645. begin
  646. F.Mode:=fmInput;
  647. TextRec(F).InOutFunc:=@CrtRead;
  648. TextRec(F).FlushFunc:=@CrtReturn;
  649. end;
  650. TextRec(F).CloseFunc:=@CrtClose;
  651. CrtOpen:=0;
  652. End;
  653. procedure AssignCrt(var F: Text);
  654. begin
  655. Assign(F,'');
  656. TextRec(F).OpenFunc:=@CrtOpen;
  657. end;
  658. var
  659. x,y : longint;
  660. begin
  661. { Load startup values }
  662. ScreenWidth:=GetScreenWidth;
  663. ScreenHeight:=GetScreenHeight;
  664. WindMax:=(ScreenWidth-1) or ((ScreenHeight-1) shl 8);
  665. { Load TextAttr }
  666. GetScreenCursor(x,y);
  667. dosmemget($b800,((y-1)*ScreenWidth+(x-1))*2+1,TextAttr,1);
  668. dosmemget($40,$49,lastmode,1);
  669. { Redirect the standard output }
  670. assigncrt(Output);
  671. Rewrite(Output);
  672. TextRec(Output).Handle:=StdOutputHandle;
  673. assigncrt(Input);
  674. Reset(Input);
  675. TextRec(Input).Handle:=StdInputHandle;
  676. { Calculates delay calibration }
  677. initdelay;
  678. end.
  679. {
  680. $Log$
  681. Revision 1.1 1998-12-21 13:07:02 peter
  682. * use -FE
  683. Revision 1.17 1998/12/15 22:42:49 peter
  684. * removed temp symbols
  685. Revision 1.16 1998/12/09 23:04:36 jonas
  686. * fixed bug in InsLine (changed "my" from "WinMaxY -1" to "WinMaxY - WinMinY")
  687. Revision 1.15 1998/11/28 14:09:48 peter
  688. * NOATTCDQ define
  689. Revision 1.14 1998/11/26 23:14:52 jonas
  690. * changed cdq to cltd in AT&T assembler block
  691. Revision 1.13 1998/08/26 10:01:54 peter
  692. * fixed readln cursor position
  693. Revision 1.12 1998/08/19 17:57:55 peter
  694. * fixed crtread with wrong cursor position
  695. Revision 1.11 1998/08/19 14:55:44 peter
  696. * fixed removeline which scrolled too much lines
  697. Revision 1.10 1998/08/18 13:32:46 carl
  698. * bugfix to make it work with FPC 0.99.5 (Delayloop is not correctly
  699. converted by ATT parser)
  700. Revision 1.9 1998/08/15 17:00:10 peter
  701. * moved delaycnt from interface to implementation
  702. Revision 1.8 1998/08/08 21:56:45 peter
  703. * updated crt with new delay, almost like bp7 routine
  704. Revision 1.5 1998/05/31 14:18:12 peter
  705. * force att or direct assembling
  706. * cleanup of some files
  707. Revision 1.4 1998/05/28 10:21:38 pierre
  708. * Handles of input and output restored
  709. Revision 1.3 1998/05/27 00:19:16 peter
  710. * fixed crt input
  711. Revision 1.2 1998/05/21 19:30:46 peter
  712. * objects compiles for linux
  713. + assign(pchar), assign(char), rename(pchar), rename(char)
  714. * fixed read_text_as_array
  715. + read_text_as_pchar which was not yet in the rtl
  716. }