qdos.inc 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  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,-(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
  26. end;
  27. function mt_inf(sys_vars: ppchar; 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. function io_open_qlstr(name_qlstr: pointer; mode: longint): Tchanid; assembler; nostackframe; public name '_io_open_qlstr';
  89. asm
  90. movem.l d2-d3,-(sp)
  91. move.l name_qlstr,a0
  92. moveq.l #-1,d1
  93. move.l mode,d3
  94. moveq.l #_IO_OPEN,d0
  95. trap #2
  96. tst.l d0
  97. bne.s @quit
  98. move.l a0,d0
  99. @quit:
  100. movem.l (sp)+,d2-d3
  101. end;
  102. function io_open(name: pchar; mode: longint): Tchanid; public name '_io_open';
  103. var
  104. len: longint;
  105. name_qlstr: array[0..63] of char;
  106. begin
  107. len:=length(name);
  108. if len > length(name_qlstr)-2 then
  109. len:=length(name_qlstr)-2;
  110. PWord(@name_qlstr)[0]:=len;
  111. Move(name^,name_qlstr[2],len);
  112. result:=io_open_qlstr(@name_qlstr,mode);
  113. end;
  114. function io_close(chan: Tchanid): longint; assembler; nostackframe; public name '_io_close';
  115. asm
  116. move.l chan,a0
  117. moveq.l #_IO_CLOSE,d0
  118. trap #2
  119. end;
  120. const
  121. _IO_FBYTE = $01;
  122. _IO_FLINE = $02;
  123. _IO_FSTRG = $03;
  124. _IO_SBYTE = $05;
  125. _IO_SSTRG = $07;
  126. _SD_WDEF = $0D;
  127. _SD_CLEAR = $20;
  128. _FS_POSAB = $42;
  129. _FS_POSRE = $43;
  130. _FS_HEADR = $47;
  131. _FS_TRUNCATE = $4B;
  132. function io_fbyte(chan: Tchanid; timeout: Ttimeout): longint; assembler; nostackframe; public name '_io_fbyte';
  133. asm
  134. move.l d3,-(sp)
  135. move.w timeout,d3
  136. clr.l d1
  137. move.l chan,a0
  138. moveq.l #_IO_FBYTE,d0
  139. trap #3
  140. tst.l d0
  141. bne @quit
  142. move.l d1,d0
  143. @quit:
  144. move.l (sp)+,d3
  145. end;
  146. function io_fetch(chan: Tchanid; timeout: Ttimeout; buf: pointer; len: word; trap_no: longint): longint; assembler;
  147. asm
  148. movem.l d2-d3,-(sp)
  149. move.w len,d2
  150. move.l buf,a1
  151. move.w timeout,d3
  152. move.l chan,a0
  153. move.l trap_no,d0
  154. trap #3
  155. tst.l d0
  156. beq @ok
  157. cmp.w #ERR_EF,d0
  158. beq @eof
  159. cmp.w #ERR_NC,d0
  160. bne @quit
  161. @eof:
  162. tst.w d1
  163. beq @quit
  164. @ok:
  165. clr.l d0
  166. move.w d1,d0
  167. @quit:
  168. movem.l (sp)+,d2-d3
  169. end;
  170. function io_fline(chan: Tchanid; timeout: Ttimeout; buf: pointer; len: word): longint; public name '_io_fline';
  171. begin
  172. io_fline := io_fetch(chan, timeout, buf, len, _IO_FLINE);
  173. end;
  174. function io_fstrg(chan: Tchanid; timeout: Ttimeout; buf: pointer; len: word): longint; public name '_io_fstrg';
  175. begin
  176. io_fstrg := io_fetch(chan, timeout, buf, len, _IO_FSTRG);
  177. end;
  178. function io_sbyte(chan: Tchanid; timeout: Ttimeout; c: char): longint; assembler; public name '_io_sbyte';
  179. asm
  180. move.l d3,-(sp)
  181. move.w timeout,d3
  182. clr.l d1
  183. move.b c,d1
  184. move.l chan,a0
  185. moveq.l #_IO_SBYTE,d0
  186. trap #3
  187. move.l (sp)+,d3
  188. end;
  189. function io_sstrg(chan: Tchanid; timeout: Ttimeout; buf: pointer; len: word): longint; assembler; public name '_io_sstrg';
  190. asm
  191. movem.l d2-d3,-(sp)
  192. move.w len,d2
  193. move.l buf,a1
  194. move.w timeout,d3
  195. move.l chan,a0
  196. moveq.l #_IO_SSTRG,d0
  197. trap #3
  198. tst.l d0
  199. beq @ok
  200. cmp.w #ERR_EF,d0
  201. beq @eof
  202. cmp.w #ERR_NC,d0
  203. bne @quit
  204. @eof:
  205. tst.w d1
  206. beq @quit
  207. @ok:
  208. clr.l d0
  209. move.w d1,d0
  210. @quit:
  211. movem.l (sp)+,d2-d3
  212. end;
  213. function sd_wdef(chan: Tchanid; timeout: Ttimeout; border_colour: byte; border_width: word; window: PQLRect): longint; assembler; public name '_sd_wdef';
  214. asm
  215. movem.l d2-d3,-(sp)
  216. move.l window,a1
  217. move.w timeout,d3
  218. move.w border_width,d2
  219. move.b border_colour,d1
  220. move.l chan,a0
  221. moveq.l #_SD_WDEF,d0
  222. trap #3
  223. movem.l (sp)+,d2-d3
  224. end;
  225. function sd_clear(chan: Tchanid; timeout: Ttimeout): longint; assembler; nostackframe; public name '_sd_clear';
  226. asm
  227. move.l d3,-(sp)
  228. move.w timeout,d3
  229. move.l chan,a0
  230. moveq.l #_SD_CLEAR,d0
  231. trap #3
  232. move.l (sp)+,d3
  233. end;
  234. function fs_posab(chan: Tchanid; new_pos: dword):longint; assembler; nostackframe; public name '_fs_posab';
  235. asm
  236. move.l d3,-(sp)
  237. moveq #_FS_POSAB,d0
  238. move.l new_pos,d1
  239. moveq #-1,d3
  240. move.l chan,a0
  241. trap #3
  242. tst.l d0
  243. bne.s @quit
  244. move.l d1,d0
  245. @quit:
  246. move.l (sp)+,d3
  247. end;
  248. function fs_posre(chan: Tchanid; new_pos: dword): longint; assembler; nostackframe; public name '_fs_posre';
  249. asm
  250. move.l d3,-(sp)
  251. moveq #_FS_POSRE,d0
  252. move.l new_pos,d1
  253. moveq #-1,d3
  254. move.l chan,a0
  255. trap #3
  256. tst.l d0
  257. bne.s @quit
  258. move.l d1,d0
  259. @quit:
  260. move.l (sp)+,d3
  261. end;
  262. function fs_headr(chan: Tchanid; buf: pointer; buf_size: word): longint; assembler; nostackframe; public name '_fs_headr';
  263. asm
  264. movem.l d2-d3,-(sp)
  265. moveq #_FS_HEADR,d0
  266. move.l buf_size,d2
  267. moveq #-1,d3
  268. move.l chan,a0
  269. trap #3
  270. tst.l d0
  271. bne.s @quit
  272. move.l d1,d0
  273. @quit:
  274. movem.l (sp)+,d2-d3
  275. end;
  276. function fs_truncate(chan: Tchanid): longint; assembler; nostackframe; public name '_fs_truncate';
  277. asm
  278. move.l d3,-(sp)
  279. moveq #_FS_TRUNCATE,d0
  280. moveq #-1,d3
  281. move.l chan, a0
  282. trap #3
  283. move.l (sp)+,d3
  284. end;
  285. const
  286. _UT_CON = $c6;
  287. _UT_SCR = $c8;
  288. function ut_con(params: PWindowDef): Tchanid; assembler; nostackframe; public name '_ut_con';
  289. asm
  290. movem.l d2-d3/a2-a3,-(sp)
  291. move.l params,a1
  292. move.w _UT_CON,a2
  293. jsr (a2)
  294. tst.l d0
  295. bne @quit
  296. move.l a0,d0
  297. @quit:
  298. movem.l (sp)+,d2-d3/a2-a3
  299. end;
  300. function ut_scr(params: PWindowDef): Tchanid; assembler; nostackframe; public name '_ut_scr';
  301. asm
  302. movem.l d2-d3/a2-a3,-(sp)
  303. move.l params,a1
  304. move.w _UT_SCR,a2
  305. jsr (a2)
  306. tst.l d0
  307. bne @quit
  308. move.l a0,d0
  309. @quit:
  310. movem.l (sp)+,d2-d3/a2-a3
  311. end;