sysamiga.pas 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1993,97 by the Free Pascal development team.
  5. Some parts taken from
  6. Marcel Timmermans - Modula 2 Compiler
  7. Nils Sjoholm - Amiga porter
  8. See the file COPYING.FPC, included in this distribution,
  9. for details about the copyright.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. **********************************************************************}
  14. unit sysamiga;
  15. { Things left to do : }
  16. { - Fix randomize }
  17. { - Fix DOSError result variable to conform to IOResult of }
  18. { Turbo Pascal }
  19. {$I os.inc}
  20. interface
  21. { used for single computations }
  22. const BIAS4 = $7f-1;
  23. {$I systemh.inc}
  24. {$I heaph.inc}
  25. const
  26. UnusedHandle : longint = -1;
  27. StdInputHandle : longint = 0;
  28. StdOutputHandle : longint = 0;
  29. StdErrorHandle : longint = 0;
  30. _ExecBase:longint = $4;
  31. _WorkbenchMsg : longint = 0;
  32. intuitionname : pchar = 'intuition.library';
  33. dosname : pchar = 'dos.library';
  34. utilityname : pchar = 'utility.library';
  35. _IntuitionBase : pointer = nil; { intuition library pointer }
  36. _DosBase : pointer = nil; { DOS library pointer }
  37. _UtilityBase : pointer = nil; { utiity library pointer }
  38. _LVOFindTask = -294;
  39. _LVOWaitPort = -384;
  40. _LVOGetMsg = -372;
  41. _LVOOpenLibrary = -552;
  42. _LVOCloseLibrary = -414;
  43. _LVOClose = -36;
  44. _LVOOpen = -30;
  45. _LVOIoErr = -132;
  46. _LVOSeek = -66;
  47. _LVODeleteFile = -72;
  48. _LVORename = -78;
  49. _LVOWrite = -48;
  50. _LVORead = -42;
  51. _LVOCreateDir = -120;
  52. _LVOSetCurrentDirName = -558;
  53. _LVOGetCurrentDirName = -564;
  54. _LVOInput = -54;
  55. _LVOOutput = -60;
  56. implementation
  57. var
  58. Initial: boolean;
  59. {$I system.inc}
  60. {$I lowmath.inc}
  61. type
  62. plongint = ^longint;
  63. {$S-}
  64. PROCEDURE St1(stack_size: longint);[public,alias: 'STACKCHECK'];
  65. begin
  66. asm
  67. { called when trying to get local stack }
  68. { if the compiler directive $S is set }
  69. { it must preserve all registers !! }
  70. move.l stack_size, d0
  71. add.l sp,d0 { stacksize + actual stackpointer }
  72. move.l _ExecBase,a0
  73. move.l 276(A0),A0 { ExecBase.thisTask }
  74. cmp.l 58(A0),D0 { Task.SpLower }
  75. bgt @Ok
  76. move.l #202,d0
  77. jsr HALT_ERROR { stack overflow }
  78. @Ok:
  79. end;
  80. end;
  81. procedure CloseLibrary(lib : pointer);
  82. { Close the library pointed to in lib }
  83. Begin
  84. asm
  85. MOVE.L A6,-(A7)
  86. MOVE.L lib,a1
  87. MOVE.L _ExecBase,A6
  88. JSR _LVOCloseLibrary(A6)
  89. MOVE.L (A7)+,A6
  90. end;
  91. end;
  92. Function KickVersion: word; assembler;
  93. asm
  94. move.l _ExecBase, a0 { Get Exec Base }
  95. move.l 20(a0), d0 { Return version - version at this offset }
  96. end;
  97. procedure halt(errnum : byte);
  98. begin
  99. { WE can only FLUSH the stdio }
  100. { if the handles have correctly }
  101. { been set. }
  102. { No exit procedures exist }
  103. { if in initial state }
  104. If NOT Initial then
  105. Begin
  106. do_exit;
  107. flush(stderr);
  108. end;
  109. { close the libraries }
  110. If _UtilityBase <> nil then
  111. Begin
  112. CloseLibrary(_UtilityBase);
  113. end;
  114. If _DosBase <> nil then
  115. Begin
  116. CloseLibrary(_DosBase);
  117. end;
  118. If _IntuitionBase <> nil then
  119. Begin
  120. CloseLibrary(_IntuitionBase);
  121. end;
  122. asm
  123. clr.l d0
  124. move.b errnum,d0
  125. move.l STKPTR,sp
  126. rts
  127. end;
  128. end;
  129. function paramcount : longint; assembler;
  130. asm
  131. clr.l d0
  132. move.w __ARGC,d0
  133. sub.w #1,d0
  134. end;
  135. function paramstr(l : longint) : string;
  136. function args : pointer; assembler;
  137. asm
  138. move.l __ARGS,d0
  139. end;
  140. var
  141. p : ^pchar;
  142. begin
  143. if (l>=0) and (l<=paramcount) then
  144. begin
  145. p:=args;
  146. paramstr:=strpas(p[l]);
  147. end
  148. else paramstr:='';
  149. end;
  150. procedure randomize;
  151. var
  152. hl : longint;
  153. begin
  154. asm
  155. { !!!!!!! }
  156. end;
  157. randseed:=hl;
  158. end;
  159. { This routine is used to grow the heap. }
  160. { But here we do a trick, we say that the }
  161. { heap cannot be regrown! }
  162. function sbrk( size: longint): longint;
  163. { on exit -1 = if fails. }
  164. Begin
  165. sbrk:=-1;
  166. end;
  167. {$I heap.inc}
  168. {****************************************************************************
  169. Low Level File Routines
  170. ****************************************************************************}
  171. procedure do_close(h : longint);
  172. begin
  173. asm
  174. move.l h,d1
  175. move.l a6,d6 { save a6 }
  176. move.l _DOSBase,a6
  177. jsr _LVOClose(a6)
  178. move.l d6,a6 { restore a6 }
  179. end;
  180. end;
  181. procedure do_erase(p : pchar);
  182. begin
  183. asm
  184. move.l a6,d6 { save a6 }
  185. move.l p,d1
  186. move.l _DOSBase,a6
  187. jsr _LVODeleteFile(a6)
  188. tst.l d0 { zero = failure }
  189. bne @noerror
  190. jsr _LVOIoErr(a6)
  191. move.l d0,InOutRes
  192. @noerror:
  193. move.l d6,a6 { restore a6 }
  194. end;
  195. end;
  196. procedure do_rename(p1,p2 : pchar);
  197. begin
  198. asm
  199. move.l a6,d6 { save a6 }
  200. move.l d2,-(sp) { save d2 }
  201. move.l p1,d1
  202. move.l p2,d2
  203. move.l _DOSBase,a6
  204. jsr _LVORename(a6)
  205. move.l (sp)+,d2 { restore d2 }
  206. tst.l d0
  207. bne @dosreend { if zero = error }
  208. jsr _LVOIoErr(a6)
  209. move.l d0,InOutRes
  210. @dosreend:
  211. move.l d6,a6 { restore a6 }
  212. end;
  213. end;
  214. function do_write(h,addr,len : longint) : longint;
  215. begin
  216. if len <= 0 then
  217. Begin
  218. do_write:=0;
  219. exit;
  220. end;
  221. asm
  222. move.l a6,d6
  223. movem.l d2/d3,-(sp)
  224. move.l h,d1 { we must of course set up the }
  225. move.l addr,d2 { parameters BEFORE getting }
  226. move.l len,d3 { _DOSBase }
  227. move.l _DOSBase,a6
  228. jsr _LVOWrite(a6)
  229. movem.l (sp)+,d2/d3
  230. tst.l d0
  231. bne @doswrend { if zero = error }
  232. jsr _LVOIoErr(a6)
  233. move.l d0,InOutRes
  234. bra @doswrend2
  235. @doswrend:
  236. { we must restore the base pointer before setting the result }
  237. move.l d6,a6
  238. move.l d0,@RESULT
  239. bra @end
  240. @doswrend2:
  241. move.l d6,a6
  242. @end:
  243. end;
  244. end;
  245. function do_read(h,addr,len : longint) : longint;
  246. begin
  247. if len <= 0 then
  248. Begin
  249. do_read:=0;
  250. exit;
  251. end;
  252. asm
  253. move.l a6,d6
  254. movem.l d2/d3,-(sp)
  255. move.l h,d1 { we must set up aparamters BEFORE }
  256. move.l addr,d2 { setting up a6 for the OS call }
  257. move.l len,d3
  258. move.l _DOSBase,a6
  259. jsr _LVORead(a6)
  260. movem.l (sp)+,d2/d3
  261. tst.l d0
  262. bne @doswrend { if zero = error }
  263. jsr _LVOIoErr(a6)
  264. move.l d0,InOutRes
  265. bra @doswrend2
  266. @doswrend:
  267. { to store a result for the function }
  268. { we must of course first get back the}
  269. { base pointer! }
  270. move.l d6,a6
  271. move.l d0,@RESULT
  272. bra @end
  273. @doswrend2:
  274. move.l d6,a6
  275. @end:
  276. end;
  277. end;
  278. function do_filepos(handle : longint) : longint;
  279. begin
  280. asm
  281. move.l a6,d6
  282. move.l handle,d1
  283. move.l d2,-(sp)
  284. move.l d3,-(sp) { save registers }
  285. clr.l d2 { offset 0 }
  286. move.l #0,d3 { OFFSET_CURRENT }
  287. move.l _DOSBase,a6
  288. jsr _LVOSeek(a6)
  289. move.l (sp)+,d3 { restore registers }
  290. move.l (sp)+,d2
  291. cmp.l #-1,d0 { is there a file access error? }
  292. bne @noerr
  293. jsr _LVOIoErr(a6)
  294. move.l d0,InOutRes
  295. bra @fposend
  296. @noerr:
  297. move.l d6,a6 { restore a6 }
  298. move.l d0,@Result
  299. bra @end
  300. @fposend:
  301. move.l d6,a6 { restore a6 }
  302. @end:
  303. end;
  304. end;
  305. procedure do_seek(handle,pos : longint);
  306. begin
  307. asm
  308. move.l a6,d6
  309. move.l handle,d1
  310. move.l d2,-(sp)
  311. move.l d3,-(sp) { save registers }
  312. move.l pos,d2
  313. move.l #-1,d3 { OFFSET_BEGINNING }
  314. move.l _DOSBase,a6
  315. jsr _LVOSeek(a6)
  316. move.l (sp)+,d3 { restore registers }
  317. move.l (sp)+,d2
  318. cmp.l #-1,d0 { is there a file access error? }
  319. bne @noerr
  320. jsr _LVOIoErr(a6)
  321. move.l d0,InOutRes
  322. bra @seekend
  323. @noerr:
  324. @seekend:
  325. move.l d6,a6 { restore a6 }
  326. end;
  327. end;
  328. function do_seekend(handle:longint):longint;
  329. begin
  330. asm
  331. { seek from end of file }
  332. move.l a6,d6
  333. move.l handle,d1
  334. move.l d2,-(sp)
  335. move.l d3,-(sp) { save registers }
  336. clr.l d2
  337. move.l #1,d3 { OFFSET_END }
  338. move.l _DOSBase,a6
  339. jsr _LVOSeek(a6)
  340. move.l (sp)+,d3 { restore registers }
  341. move.l (sp)+,d2
  342. cmp.l #-1,d0 { is there a file access error? }
  343. bne @noerr
  344. jsr _LVOIoErr(a6)
  345. move.l d0,InOutRes
  346. bra @seekend
  347. @noerr:
  348. move.l d6,a6 { restore a6 }
  349. move.l d0,@Result
  350. bra @end
  351. @seekend:
  352. move.l d6,a6 { restore a6 }
  353. @end:
  354. end;
  355. end;
  356. function do_filesize(handle : longint) : longint;
  357. var
  358. aktfilepos : longint;
  359. begin
  360. aktfilepos:=do_filepos(handle);
  361. do_filesize:=do_seekend(handle);
  362. do_seek(handle,aktfilepos);
  363. end;
  364. procedure do_truncate (handle,pos:longint);
  365. begin
  366. {!!!!!!!!!!!!}
  367. end;
  368. procedure do_open(var f;p:pchar;flags:longint);
  369. {
  370. filerec and textrec have both handle and mode as the first items so
  371. they could use the same routine for opening/creating.
  372. when (flags and $10) the file will be append
  373. when (flags and $100) the file will be truncate/rewritten
  374. when (flags and $1000) there is no check for close (needed for textfiles)
  375. }
  376. var
  377. i : longint;
  378. oflags: longint;
  379. begin
  380. { close first if opened }
  381. if ((flags and $1000)=0) then
  382. begin
  383. case filerec(f).mode of
  384. fminput,fmoutput,fminout : Do_Close(filerec(f).handle);
  385. fmclosed : ;
  386. else
  387. begin
  388. inoutres:=102; {not assigned}
  389. exit;
  390. end;
  391. end;
  392. end;
  393. { reset file handle }
  394. filerec(f).handle:=UnusedHandle;
  395. oflags:=$04;
  396. { convert filemode to filerec modes }
  397. case (flags and 3) of
  398. 0 : begin
  399. filerec(f).mode:=fminput;
  400. oflags:=$01;
  401. end;
  402. 1 : filerec(f).mode:=fmoutput;
  403. 2 : filerec(f).mode:=fminout;
  404. end;
  405. if (flags and $100)<>0 then
  406. begin
  407. filerec(f).mode:=fmoutput;
  408. oflags:=$02;
  409. end
  410. else
  411. if (flags and $10)<>0 then
  412. begin
  413. filerec(f).mode:=fmoutput;
  414. oflags:=$04;
  415. end;
  416. { empty name is special }
  417. if p[0]=#0 then
  418. begin
  419. case filerec(f).mode of
  420. fminput : filerec(f).handle:=StdInputHandle;
  421. fmappend,
  422. fmoutput : begin
  423. filerec(f).handle:=StdOutputHandle;
  424. filerec(f).mode:=fmoutput; {fool fmappend}
  425. end;
  426. end;
  427. exit;
  428. end;
  429. { THE AMIGA AUTOMATICALLY OPENS IN READ-WRITE MODE }
  430. { FOR ALL CASES. }
  431. asm
  432. move.l a6,d6 { save a6 }
  433. move.l f,d1
  434. move.l #1004,d0 { MODE_READWRITE }
  435. move.l _DOSBase,a6
  436. jsr _LVOOpen(a6)
  437. tst.l d0
  438. bne @noopenerror { on zero an error occured }
  439. jsr _LVOIoErr(a6)
  440. move.l d0,InOutRes
  441. bra @openend
  442. @noopenerror:
  443. move.l d6,a6 { restore a6 }
  444. move.l d0,i { we need the base pointer to access this variable }
  445. bra @end
  446. @openend:
  447. move.l d6,a6 { restore a6 }
  448. @end:
  449. end;
  450. filerec(f).handle:=i;
  451. if (flags and $10)<>0 then
  452. do_seekend(filerec(f).handle);
  453. end;
  454. {*****************************************************************************
  455. UnTyped File Handling
  456. *****************************************************************************}
  457. {$i file.inc}
  458. {*****************************************************************************
  459. Typed File Handling
  460. *****************************************************************************}
  461. {$i typefile.inc}
  462. {*****************************************************************************
  463. Text File Handling
  464. *****************************************************************************}
  465. {$i text.inc}
  466. {*****************************************************************************
  467. Directory Handling
  468. *****************************************************************************}
  469. procedure mkdir(const s : string);
  470. var
  471. buffer : array[0..255] of char;
  472. begin
  473. move(s[1],buffer,length(s));
  474. buffer[length(s)]:=#0;
  475. asm
  476. move.l a6,d6
  477. { we must load the parameters BEFORE setting up the }
  478. { OS call with a6 }
  479. lea buffer,a0
  480. move.l a0,d1
  481. move.l _DosBase,a6
  482. jsr _LVOCreateDir(a6)
  483. tst.l d0
  484. bne @noerror
  485. move.l #1,InOutRes
  486. @noerror:
  487. move.l d6,a6
  488. end;
  489. end;
  490. procedure rmdir(const s : string);
  491. var
  492. buffer : array[0..255] of char;
  493. begin
  494. move(s[1],buffer,length(s));
  495. buffer[length(s)]:=#0;
  496. do_erase(buffer);
  497. end;
  498. procedure chdir(const s : string);
  499. var
  500. buffer : array[0..255] of char;
  501. begin
  502. move(s[1],buffer,length(s));
  503. buffer[length(s)]:=#0;
  504. asm
  505. move.l a6,d6
  506. lea buffer,a1
  507. move.l a1,d1
  508. move.l _DosBase,a6
  509. jsr _LVOSetCurrentDirName(a6)
  510. bne @noerror
  511. move.l #1,InOutRes
  512. @noerror:
  513. move.l d6,a6
  514. end;
  515. end;
  516. procedure getdir(drivenr : byte;var dir : string);
  517. var
  518. l : longint;
  519. p : pointer;
  520. begin
  521. l:=length(dir);
  522. if drivenr <> 0 then
  523. begin
  524. dir:='';
  525. exit;
  526. end;
  527. p:=@dir[1];
  528. if l <> 0 then { workaround for v36 bug }
  529. Begin
  530. asm
  531. move.l a6,d6
  532. move.l p,d1
  533. move.l l,d2
  534. move.l _DosBase,a6
  535. jsr _LVOGetCurrentDirName(a6)
  536. bne @noerror
  537. move.l #1,InOutRes
  538. @noerror:
  539. move.l d6,a6
  540. end;
  541. end
  542. else
  543. dir:='';
  544. { upcase the string (FPKPascal function) }
  545. dir:=upcase(dir);
  546. end;
  547. {*****************************************************************************
  548. SystemUnit Initialization
  549. *****************************************************************************}
  550. Procedure Startup; Assembler;
  551. asm
  552. move.l a6,d6 { save a6 }
  553. move.l (4),a6 { get ExecBase pointer }
  554. move.l a6,_ExecBase
  555. suba.l a1,a1
  556. jsr _LVOFindTask(a6)
  557. move.l d0,a0
  558. { Check the stack value }
  559. { are we running from a CLI? }
  560. tst.l 172(a0) { 172 = pr_CLI }
  561. bne @fromCLI
  562. { we do not support Workbench yet .. }
  563. move.l d6,a6 { restore a6 }
  564. move.l #1,d0
  565. jsr HALT_ERROR
  566. @fromCLI:
  567. { Open the following libraries: }
  568. { Intuition.library }
  569. { dos.library }
  570. moveq.l #0,d0
  571. move.l intuitionname,a1 { directly since it is a pchar }
  572. jsr _LVOOpenLibrary(a6)
  573. move.l d0,_IntuitionBase
  574. beq @exitprg
  575. moveq.l #0,d0
  576. move.l utilityname,a1 { directly since it is a pchar }
  577. jsr _LVOOpenLibrary(a6)
  578. move.l d0,_UtilityBase
  579. beq @exitprg
  580. moveq.l #0,d0
  581. move.l dosname,a1 { directly since it is a pchar }
  582. jsr _LVOOpenLibrary(a6)
  583. move.l d0,_DOSBase
  584. beq @exitprg
  585. { Find standard input and output }
  586. { for CLI }
  587. @OpenFiles:
  588. move.l _DOSBase,a6
  589. jsr _LVOInput(a6) { get standard in }
  590. move.l d0, StdInputHandle { save standard Input handle }
  591. { move.l d0,d1 }{ set up for next call }
  592. { jsr _LVOIsInteractive(a6)}{ is it interactive? }
  593. { move.l #_Input,a0 }{ get file record again }
  594. { move.b d0,INTERACTIVE(a0) }{ set flag }
  595. { beq StdInNotInteractive }{ skip this if not interactive }
  596. { move.l BUFFER(a0),a1 }{ get buffer address }
  597. { add.l #1,a1 }{ make end one byte further on }
  598. { move.l a1,MAX(a0) }{ set buffer size }
  599. { move.l a1,CURRENT(a0) }{ will need a read }
  600. bra @OpenStdOutput
  601. @StdInNotInteractive
  602. { jsr _p%FillBuffer } { fill the buffer }
  603. @OpenStdOutput
  604. jsr _LVOOutput(a6) { get ouput file handle }
  605. move.l d0,StdOutputHandle { get file record }
  606. bra @startupend
  607. { move.l d0,d1 } { set up for call }
  608. { jsr _LVOIsInteractive(a6) } { is it interactive? }
  609. { move.l #_Output,a0 } { get file record }
  610. { move.b d0,INTERACTIVE(a0)} { set flag }
  611. @exitprg:
  612. move.l d6,a6 { restore a6 }
  613. move.l #219,d0
  614. jsr HALT_ERROR
  615. @startupend:
  616. move.l d6,a6 { restore a6 }
  617. end;
  618. procedure OpenStdIO(var f:text;mode:word;hdl:longint);
  619. begin
  620. Assign(f,'');
  621. TextRec(f).Handle:=hdl;
  622. TextRec(f).Mode:=mode;
  623. TextRec(f).InOutFunc:=@FileInOutFunc;
  624. TextRec(f).FlushFunc:=@FileInOutFunc;
  625. TextRec(f).Closefunc:=@fileclosefunc;
  626. end;
  627. begin
  628. { Initial state is on -- in case of RunErrors before the i/o handles are }
  629. { ok. }
  630. Initial:=TRUE;
  631. { Initialize ExitProc }
  632. ExitProc:=Nil;
  633. Startup;
  634. { to test stack depth }
  635. loweststack:=maxlongint;
  636. { Setup heap }
  637. InitHeap;
  638. { Setup stdin, stdout and stderr }
  639. OpenStdIO(Input,fmInput,StdInputHandle);
  640. OpenStdIO(Output,fmOutput,StdOutputHandle);
  641. { The Amiga does not seem to have a StdError }
  642. { handle, therefore make the StdError handle }
  643. { equal to the StdOutputHandle. }
  644. StdErrorHandle := StdOutputHandle;
  645. OpenStdIO(StdErr,fmOutput,StdErrorHandle);
  646. { Now Handles and function handlers are setup }
  647. { correctly. }
  648. Initial:=FALSE;
  649. { Reset IO Error }
  650. InOutRes:=0;
  651. { Startup }
  652. { Only AmigaOS v2.04 or greater is supported }
  653. If KickVersion < 36 then
  654. Begin
  655. WriteLn('v36 or greater of Kickstart required.');
  656. Halt(1);
  657. end;
  658. end.
  659. {
  660. $Log$
  661. Revision 1.2 1998-05-25 12:08:49 carl
  662. * Handles now proprely setup
  663. * Correct Exit code on init failure
  664. * Library pointer now ok (Thanks to Nils Sjoholm)
  665. * OpenStdError was never initialized
  666. * ;assembler; routines problems bugfixed
  667. * stackcheck routine fix
  668. Revision 1.1.1.1 1998/03/25 11:18:47 root
  669. * Restored version
  670. Revision 1.14 1998/03/21 04:20:09 carl
  671. * correct ExecBase pointer (from Nils Sjoholm)
  672. * correct OpenLibrary vector (from Nils Sjoholm)
  673. Revision 1.13 1998/03/14 21:34:32 carl
  674. * forgot to save a6 in Startup routine
  675. Revision 1.12 1998/02/24 21:19:42 carl
  676. *** empty log message ***
  677. Revision 1.11 1998/02/23 02:22:49 carl
  678. * bugfix if linking problems
  679. Revision 1.9 1998/02/06 16:34:32 carl
  680. + do_open is now standard with other platforms
  681. Revision 1.8 1998/02/02 15:01:45 carl
  682. * fixed bug with opening library versions (from Nils Sjoholm)
  683. Revision 1.7 1998/01/31 19:35:19 carl
  684. + added opening of utility.library
  685. Revision 1.6 1998/01/29 23:20:54 peter
  686. - Removed Backslash convert
  687. Revision 1.5 1998/01/27 10:55:04 peter
  688. * Amiga uses / not \, so change AllowSlash -> AllowBackSlash
  689. Revision 1.4 1998/01/25 21:53:20 peter
  690. + Universal Handles support for StdIn/StdOut/StdErr
  691. * Updated layout of sysamiga.pas
  692. Revision 1.3 1998/01/24 21:09:53 carl
  693. + added missing input/output function pointers
  694. Revision 1.2 1998/01/24 14:08:25 carl
  695. * RunError 217 --> RunError 219 (cannot open lib)
  696. + Standard Handle names implemented
  697. Revision 1.1 1998/01/24 05:12:15 carl
  698. + initial revision, some stuff still missing though.
  699. (and as you might imagine ... untested :))
  700. }