filectrl.inc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. {
  2. System independent filecontrol interface for go32v2
  3. $Id$
  4. }
  5. uses
  6. Go32;
  7. function OpenFileStr(FName: PChar; Flags: Longint): TFileHandle;
  8. Var
  9. regs : trealregs;
  10. begin
  11. copytodos(FName^,256);
  12. if LFNSupport then
  13. regs.realeax:=$716c
  14. else
  15. regs.realeax:=$6c00;
  16. regs.realedx:=$1;
  17. regs.realds:=tb_segment;
  18. regs.realesi:=tb_offset;
  19. regs.realebx:=$2000;
  20. regs.realecx:=$20;
  21. realintr($21,regs);
  22. if (regs.realflags and carryflag) <> 0 then
  23. begin
  24. ErrorCode:=lo(regs.realeax);
  25. exit(0);
  26. end
  27. else
  28. OpenFileStr:=regs.realeax and $ffff;
  29. end;
  30. function CreateFileStr(FName: PChar): TFileHandle;
  31. Var
  32. regs : trealregs;
  33. begin
  34. copytodos(FName^,256);
  35. if LFNSupport then
  36. regs.realeax:=$716c
  37. else
  38. regs.realeax:=$6c00;
  39. regs.realedx:=$12;
  40. regs.realds:=tb_segment;
  41. regs.realesi:=tb_offset;
  42. regs.realebx:=$2001;
  43. regs.realecx:=$20;
  44. realintr($21,regs);
  45. if (regs.realflags and carryflag) <> 0 then
  46. begin
  47. ErrorCode:=lo(regs.realeax);
  48. exit(0);
  49. end
  50. else
  51. CreateFileStr:=regs.realeax and $ffff;
  52. end;
  53. procedure DeleteFileStr(FName: PChar);
  54. var
  55. regs : trealregs;
  56. begin
  57. copytodos(FName^,256);
  58. regs.realedx:=tb_offset;
  59. regs.realds:=tb_segment;
  60. if LFNSupport then
  61. regs.realeax:=$7141
  62. else
  63. regs.realeax:=$4100;
  64. regs.realesi:=0;
  65. regs.realecx:=0;
  66. realintr($21,regs);
  67. if (regs.realflags and carryflag) <> 0 then
  68. ErrorCode:=lo(regs.realeax);
  69. end;
  70. procedure CloseFile(Handle: TFileHandle);
  71. var
  72. regs : trealregs;
  73. begin
  74. regs.realebx:=handle;
  75. regs.realeax:=$3e00;
  76. RealIntr($21,regs);
  77. if (regs.realflags and carryflag) <> 0 then
  78. ErrorCode:=lo(regs.realeax);
  79. end;
  80. function SeekFile(Handle: TFileHandle; Pos: TFileInt; SeekType: Word): TFileInt;
  81. var
  82. regs : trealregs;
  83. begin
  84. regs.realebx:=handle;
  85. regs.realecx:=pos shr 16;
  86. regs.realedx:=pos and $ffff;
  87. regs.realeax:=$4200 or SeekType;
  88. RealIntr($21,regs);
  89. if (regs.realflags and carryflag) <> 0 then
  90. begin
  91. ErrorCode:=lo(regs.realeax);
  92. SeekFile:=-1;
  93. end
  94. else
  95. SeekFile:=lo(regs.realedx) shl 16+lo(regs.realeax);
  96. end;
  97. function ReadFile(Handle: TFileHandle; var Buff; Count: CPUWord): CPUWord;
  98. var
  99. regs : trealregs;
  100. addr : pchar;
  101. len,
  102. size,
  103. readsize : longint;
  104. begin
  105. len:=count;
  106. addr:=@buff;
  107. readsize:=0;
  108. while len > 0 do
  109. begin
  110. if len>tb_size then
  111. size:=tb_size
  112. else
  113. size:=len;
  114. regs.realecx:=len;
  115. regs.realedx:=tb_offset;
  116. regs.realds:=tb_segment;
  117. regs.realebx:=handle;
  118. regs.realeax:=$3f00;
  119. RealIntr($21,regs);
  120. if (regs.realflags and carryflag) <> 0 then
  121. begin
  122. InOutRes:=lo(regs.realeax);
  123. exit(0);
  124. end
  125. else
  126. if regs.realeax<size then
  127. begin
  128. copyfromdos(addr^,regs.realeax);
  129. exit(readsize+regs.realeax);
  130. end;
  131. copyfromdos(addr^,regs.realeax);
  132. inc(readsize,regs.realeax);
  133. inc(addr,regs.realeax);
  134. dec(len,regs.realeax);
  135. end;
  136. readfile:=readsize;
  137. end;
  138. function WriteFile(Handle: TFileHandle; var Buff; Count: CPUWord): CPUWord;
  139. var
  140. regs : trealregs;
  141. addr : pchar;
  142. len,
  143. size,
  144. writesize : longint;
  145. begin
  146. len:=count;
  147. addr:=@buff;
  148. writesize:=0;
  149. while len > 0 do
  150. begin
  151. if len>tb_size then
  152. size:=tb_size
  153. else
  154. size:=len;
  155. copytodos(addr^,size);
  156. regs.realecx:=size;
  157. regs.realedx:=tb_offset;
  158. regs.realds:=tb_segment;
  159. regs.realebx:=handle;
  160. regs.realeax:=$4000;
  161. RealIntr($21,regs);
  162. if (regs.realflags and carryflag) <> 0 then
  163. begin
  164. ErrorCode:=lo(regs.realeax);
  165. exit(writesize);
  166. end;
  167. dec(len,size);
  168. inc(writesize,size);
  169. inc(addr,size);
  170. end;
  171. WriteFile:=WriteSize;
  172. end;
  173. procedure FlushFile(Handle: TFileHandle);
  174. var
  175. regs : trealregs;
  176. begin
  177. regs.ebx:=handle;
  178. regs.ah:=$68;
  179. realintr($21,regs);
  180. if (regs.realflags and carryflag) <> 0 then
  181. ErrorCode:=lo(regs.realeax);
  182. end;
  183. procedure TruncateFile(Handle: TFileHandle);
  184. var
  185. regs : trealregs;
  186. begin
  187. regs.realecx:=0;
  188. regs.realedx:=tb_offset;
  189. regs.realds:=tb_segment;
  190. regs.realebx:=handle;
  191. regs.realeax:=$4000;
  192. RealIntr($21,regs);
  193. if (regs.realflags and carryflag) <> 0 then
  194. ErrorCode:=lo(regs.realeax);
  195. end;
  196. function EndOfFile(Handle: TFileHandle): Boolean;
  197. begin
  198. EndOfFile := FilePos(Handle) >= FileSize(Handle);
  199. end;
  200. function FilePos(Handle: TFileHandle): TFileInt;
  201. var
  202. regs : trealregs;
  203. begin
  204. regs.realebx:=handle;
  205. regs.realecx:=0;
  206. regs.realedx:=0;
  207. regs.realeax:=$4201;
  208. RealIntr($21,regs);
  209. if (regs.realflags and carryflag) <> 0 then
  210. Begin
  211. InOutRes:=lo(regs.realeax);
  212. filepos:=-1;
  213. end
  214. else
  215. filepos:=lo(regs.realedx) shl 16+lo(regs.realeax);
  216. end;
  217. function FileSize(Handle: TFileHandle): TFileInt;
  218. var
  219. aktfilepos : longint;
  220. begin
  221. aktfilepos:=filepos(handle);
  222. filesize:=seekfile(handle,0,2);
  223. seekfile(handle,aktfilepos,0);
  224. end;
  225. {
  226. $Log$
  227. Revision 1.2 2000-07-13 11:32:24 michael
  228. + removed logs
  229. }