qdos.inc 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2020 by Karoly Balogh
  4. Interface QDOS OS functions used by the Sinclair QL RTL
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {$i qdosh.inc}
  12. const
  13. _MT_INF = $00;
  14. _MT_FRJOB = $05;
  15. _MT_DMODE = $10;
  16. _MT_ALCHP = $18;
  17. _MT_RECHP = $19;
  18. procedure mt_frjob(jobID: Tjobid; exitCode: longint); assembler; nostackframe; public name '_mt_frjob';
  19. asm
  20. movem.l d2-d3/a2-a3,-(sp)
  21. move.l exitCode,d3
  22. move.l jobID,d1
  23. moveq #_MT_FRJOB,d0
  24. trap #1
  25. movem.l (sp)+,d2-d3/a2-a3
  26. end;
  27. function mt_inf(sys_vars: PPAnsiChar; ver_ascii: plongint): Tjobid; assembler; nostackframe; public name '_mt_inf';
  28. asm
  29. move.l d2,-(sp)
  30. move.l sys_vars,-(sp)
  31. move.l ver_ascii,-(sp)
  32. moveq.l #_MT_INF,d0
  33. trap #1
  34. move.l (sp)+,d0
  35. beq.s @skip_vars
  36. move.l d0,a1
  37. move.l d2,(a1) { ver_ascii }
  38. @skip_vars:
  39. move.l (sp)+,d0
  40. beq.s @skip_ver
  41. move.l d0,a1
  42. move.l a0,(a1) { sys_vars }
  43. @skip_ver:
  44. move.l (sp)+,d2
  45. move.l d1,d0 { jobid }
  46. end;
  47. procedure mt_dmode(s_mode: pword; d_type: pword); assembler; nostackframe; public name '_mt_dmode';
  48. asm
  49. movem.l d2/a3-a4,-(sp)
  50. move.w (a0),d1
  51. move.w (a1),d2
  52. moveq.l #_MT_DMODE,d0
  53. trap #1
  54. move.w d1,(a0)
  55. move.w d2,(a1)
  56. movem.l (sp)+,d2/a3-a4
  57. end;
  58. function mt_alchp(size: dword; sizegot: pdword; jobid: Tjobid): pointer; assembler; nostackframe; public name '_mt_alchp';
  59. asm
  60. movem.l d2-d3/a2-a3,-(sp)
  61. move.l sizegot,-(sp)
  62. move.l jobid,d2
  63. move.l size,d1
  64. moveq.l #_MT_ALCHP,d0
  65. trap #1
  66. move.l (sp)+,d2 // sizegot ptr
  67. tst d0
  68. bne @quit
  69. move.l d2,a1
  70. beq @nosizegot
  71. move.l d1,(a1)
  72. @nosizegot:
  73. move.l a0,d0
  74. @quit:
  75. movem.l (sp)+,d2-d3/a2-a3
  76. end;
  77. procedure mt_rechp(area: pointer); assembler; nostackframe; public name '_mt_rechp';
  78. asm
  79. movem.l d2-d3/a2-a3,-(sp)
  80. move.l area,a0
  81. moveq.l #_MT_RECHP,d0
  82. trap #1
  83. movem.l (sp)+,d2-d3/a2-a3
  84. end;
  85. const
  86. _IO_OPEN = $01;
  87. _IO_CLOSE = $02;
  88. _IO_DELET = $04;
  89. function io_open_qlstr(name_qlstr: pointer; mode: longint): Tchanid; assembler; nostackframe; public name '_io_open_qlstr';
  90. asm
  91. movem.l d2-d3,-(sp)
  92. move.l name_qlstr,a0
  93. moveq.l #-1,d1
  94. move.l mode,d3
  95. moveq.l #_IO_OPEN,d0
  96. trap #2
  97. tst.l d0
  98. bne.s @quit
  99. move.l a0,d0
  100. @quit:
  101. movem.l (sp)+,d2-d3
  102. end;
  103. function io_open(name: PAnsiChar; mode: longint): Tchanid; public name '_io_open';
  104. var
  105. len: longint;
  106. name_qlstr: array[0..63] of AnsiChar;
  107. begin
  108. len:=length(name);
  109. if len > length(name_qlstr)-2 then
  110. len:=length(name_qlstr)-2;
  111. PWord(@name_qlstr)[0]:=len;
  112. Move(name^,name_qlstr[2],len);
  113. result:=io_open_qlstr(@name_qlstr,mode);
  114. end;
  115. function io_close(chan: Tchanid): longint; assembler; nostackframe; public name '_io_close';
  116. asm
  117. move.l chan,a0
  118. moveq.l #_IO_CLOSE,d0
  119. trap #2
  120. end;
  121. function io_delet_qlstr(name_qlstr: pointer): longint; assembler; nostackframe; public name '_io_delet_qlstr';
  122. asm
  123. movem.l d2-d3,-(sp)
  124. move.l name_qlstr,a0
  125. moveq.l #-1,d1
  126. moveq.l #_IO_DELET,d0
  127. trap #2
  128. tst.l d0
  129. @quit:
  130. movem.l (sp)+,d2-d3
  131. end;
  132. function io_delet(name: PAnsiChar): Tchanid; public name '_io_delet';
  133. var
  134. len: longint;
  135. name_qlstr: array[0..63] of AnsiChar;
  136. begin
  137. len:=length(name);
  138. if len > length(name_qlstr)-2 then
  139. len:=length(name_qlstr)-2;
  140. PWord(@name_qlstr)[0]:=len;
  141. Move(name^,name_qlstr[2],len);
  142. result:=io_delet_qlstr(@name_qlstr);
  143. end;
  144. const
  145. _IO_FBYTE = $01;
  146. _IO_FLINE = $02;
  147. _IO_FSTRG = $03;
  148. _IO_SBYTE = $05;
  149. _IO_SSTRG = $07;
  150. _SD_WDEF = $0D;
  151. _SD_CLEAR = $20;
  152. _FS_POSAB = $42;
  153. _FS_POSRE = $43;
  154. _FS_HEADR = $47;
  155. _FS_RENAME = $4A;
  156. _FS_TRUNCATE = $4B;
  157. function io_fbyte(chan: Tchanid; timeout: Ttimeout): longint; assembler; nostackframe; public name '_io_fbyte';
  158. asm
  159. move.l d3,-(sp)
  160. move.w timeout,d3
  161. clr.l d1
  162. move.l chan,a0
  163. moveq.l #_IO_FBYTE,d0
  164. trap #3
  165. tst.l d0
  166. bne @quit
  167. move.l d1,d0
  168. @quit:
  169. move.l (sp)+,d3
  170. end;
  171. function io_fetch(chan: Tchanid; timeout: Ttimeout; buf: pointer; len: word; trap_no: longint): longint; assembler;
  172. asm
  173. movem.l d2-d3,-(sp)
  174. move.w len,d2
  175. move.l buf,a1
  176. move.w timeout,d3
  177. move.l chan,a0
  178. move.l trap_no,d0
  179. trap #3
  180. tst.l d0
  181. beq @ok
  182. cmp.w #ERR_EF,d0
  183. beq @eof
  184. cmp.w #ERR_NC,d0
  185. bne @quit
  186. @eof:
  187. tst.w d1
  188. beq @quit
  189. @ok:
  190. clr.l d0
  191. move.w d1,d0
  192. @quit:
  193. movem.l (sp)+,d2-d3
  194. end;
  195. function io_fline(chan: Tchanid; timeout: Ttimeout; buf: pointer; len: word): longint; public name '_io_fline';
  196. begin
  197. io_fline := io_fetch(chan, timeout, buf, len, _IO_FLINE);
  198. end;
  199. function io_fstrg(chan: Tchanid; timeout: Ttimeout; buf: pointer; len: word): longint; public name '_io_fstrg';
  200. begin
  201. io_fstrg := io_fetch(chan, timeout, buf, len, _IO_FSTRG);
  202. end;
  203. function io_sbyte(chan: Tchanid; timeout: Ttimeout; c: AnsiChar): longint; assembler; public name '_io_sbyte';
  204. asm
  205. move.l d3,-(sp)
  206. move.w timeout,d3
  207. clr.l d1
  208. move.b c,d1
  209. move.l chan,a0
  210. moveq.l #_IO_SBYTE,d0
  211. trap #3
  212. move.l (sp)+,d3
  213. end;
  214. function io_sstrg(chan: Tchanid; timeout: Ttimeout; buf: pointer; len: word): longint; assembler; public name '_io_sstrg';
  215. asm
  216. movem.l d2-d3,-(sp)
  217. move.w len,d2
  218. move.l buf,a1
  219. move.w timeout,d3
  220. move.l chan,a0
  221. moveq.l #_IO_SSTRG,d0
  222. trap #3
  223. tst.l d0
  224. beq @ok
  225. cmp.w #ERR_EF,d0
  226. beq @eof
  227. cmp.w #ERR_NC,d0
  228. bne @quit
  229. @eof:
  230. tst.w d1
  231. beq @quit
  232. @ok:
  233. clr.l d0
  234. move.w d1,d0
  235. @quit:
  236. movem.l (sp)+,d2-d3
  237. end;
  238. function sd_wdef(chan: Tchanid; timeout: Ttimeout; border_colour: byte; border_width: word; window: PQLRect): longint; assembler; public name '_sd_wdef';
  239. asm
  240. movem.l d2-d3,-(sp)
  241. move.l window,a1
  242. move.w timeout,d3
  243. move.w border_width,d2
  244. move.b border_colour,d1
  245. move.l chan,a0
  246. moveq.l #_SD_WDEF,d0
  247. trap #3
  248. movem.l (sp)+,d2-d3
  249. end;
  250. function sd_clear(chan: Tchanid; timeout: Ttimeout): longint; assembler; nostackframe; public name '_sd_clear';
  251. asm
  252. move.l d3,-(sp)
  253. move.w timeout,d3
  254. move.l chan,a0
  255. moveq.l #_SD_CLEAR,d0
  256. trap #3
  257. move.l (sp)+,d3
  258. end;
  259. function fs_posab(chan: Tchanid; var new_pos: longint): longint; assembler; nostackframe; public name '_fs_posab';
  260. asm
  261. movem.l d3/a0,-(sp) { a0 = new_pos }
  262. move.l (a0),d1
  263. move.l chan,a0
  264. moveq #-1,d3
  265. moveq #_FS_POSAB,d0
  266. trap #3
  267. movem.l (sp)+,d3/a0
  268. move.l d1,(a0)
  269. end;
  270. function fs_posre(chan: Tchanid; var new_pos: longint): longint; assembler; nostackframe; public name '_fs_posre';
  271. asm
  272. movem.l d3/a0,-(sp) { a0 = new_pos }
  273. move.l (a0),d1
  274. move.l chan,a0
  275. moveq #-1,d3
  276. moveq #_FS_POSRE,d0
  277. trap #3
  278. movem.l (sp)+,d3/a0
  279. move.l d1,(a0)
  280. end;
  281. function fs_headr(chan: Tchanid; buf: pointer; buf_size: word): longint; assembler; nostackframe; public name '_fs_headr';
  282. asm
  283. movem.l d2-d3,-(sp)
  284. move.l buf,a1
  285. move.l chan,a0
  286. move.l buf_size,d2
  287. moveq #-1,d3
  288. moveq #_FS_HEADR,d0
  289. trap #3
  290. tst.l d0
  291. bne.s @quit
  292. move.l d1,d0
  293. @quit:
  294. movem.l (sp)+,d2-d3
  295. end;
  296. function fs_rename_qlstr(chan: Tchanid; new_name_as_qlstr: pointer): longint; assembler; nostackframe; public name '_fs_rename_qlstr';
  297. asm
  298. move.l d3,-(sp)
  299. move.l new_name_as_qlstr,a1
  300. move.l chan,a0
  301. moveq #-1,d3
  302. moveq #_FS_RENAME,d0
  303. trap #3
  304. move.l (sp)+,d3
  305. end;
  306. function fs_rename(chan: Tchanid; new_name: PAnsiChar): longint; public name '_fs_rename';
  307. var
  308. len: longint;
  309. new_name_qlstr: array[0..63] of AnsiChar;
  310. begin
  311. len:=length(new_name);
  312. if len > length(new_name_qlstr)-2 then
  313. len:=length(new_name_qlstr)-2;
  314. PWord(@new_name_qlstr)[0]:=len;
  315. Move(new_name^,new_name_qlstr[2],len);
  316. fs_rename:=fs_rename_qlstr(chan,@new_name_qlstr);
  317. end;
  318. function fs_truncate(chan: Tchanid): longint; assembler; nostackframe; public name '_fs_truncate';
  319. asm
  320. move.l d3,-(sp)
  321. move.l chan, a0
  322. moveq #-1,d3
  323. moveq #_FS_TRUNCATE,d0
  324. trap #3
  325. move.l (sp)+,d3
  326. end;
  327. const
  328. _UT_CON = $c6;
  329. _UT_SCR = $c8;
  330. function ut_con(params: PWindowDef): Tchanid; assembler; nostackframe; public name '_ut_con';
  331. asm
  332. movem.l d2-d3/a2-a3,-(sp)
  333. move.l params,a1
  334. move.w _UT_CON,a2
  335. jsr (a2)
  336. tst.l d0
  337. bne @quit
  338. move.l a0,d0
  339. @quit:
  340. movem.l (sp)+,d2-d3/a2-a3
  341. end;
  342. function ut_scr(params: PWindowDef): Tchanid; assembler; nostackframe; public name '_ut_scr';
  343. asm
  344. movem.l d2-d3/a2-a3,-(sp)
  345. move.l params,a1
  346. move.w _UT_SCR,a2
  347. jsr (a2)
  348. tst.l d0
  349. bne @quit
  350. move.l a0,d0
  351. @quit:
  352. movem.l (sp)+,d2-d3/a2-a3
  353. end;
  354. const
  355. _MT_RCLCK = $13;
  356. function mt_rclck: longint; assembler; nostackframe; public name '_mt_rclck';
  357. asm
  358. move.l d2,-(sp)
  359. moveq #_MT_RCLCK,d0
  360. trap #1
  361. move.l d1,d0
  362. move.l (sp)+,d2
  363. end;