crt.pp 16 KB

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