mon.cpm.s 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929
  1. .define .mon
  2. .define uxfinish
  3. .sect .text
  4. .sect .rom
  5. .sect .data
  6. .sect .bss
  7. .sect .text
  8. ! monitor instruction
  9. ! a small collection of UNIX system calls implemented under CP/M
  10. ! ux_indir=e.mon
  11. ! ux_fork=e.mon
  12. ! ux_wait=e.mon
  13. ! ux_link=e.mon
  14. ! ux_exec=e.mon
  15. ! ux_chdir=e.mon
  16. ! ux_mknod=e.mon
  17. ! ux_chmod=e.mon
  18. ! ux_chown=e.mon
  19. ! ux_break=e.mon
  20. ! ux_stat=e.mon
  21. ! ux_seek=e.mon
  22. ! ux_mount=e.mon
  23. ! ux_umount=e.mon
  24. ! ux_setuid=e.mon
  25. ! ux_getuid=e.mon
  26. ! ux_stime=e.mon
  27. ! ux_ptrace=e.mon
  28. ! ux_alarm=e.mon
  29. ! ux_fstat=e.mon
  30. ! ux_pause=e.mon
  31. ! ux_utime=e.mon
  32. ! ux_stty=e.mon
  33. ! ux_gtty=e.mon
  34. ! ux_access=e.mon
  35. ! ux_nice=e.mon
  36. ! ux_sync=e.mon
  37. ! ux_kill=e.mon
  38. ! ux_dup=e.mon
  39. ! ux_pipe=e.mon
  40. ! ux_times=e.mon
  41. ! ux_prof=e.mon
  42. ! ux_unused=e.mon
  43. ! ux_setgid=e.mon
  44. ! ux_getgid=e.mon
  45. ! ux_sig=e.mon
  46. ! ux_umask=e.mon
  47. ! ux_chroot=e.mon
  48. EPERM = 1
  49. ENOENT = 2
  50. ESRCH = 3
  51. EINTR = 4
  52. EIO = 5
  53. ENXIO = 6
  54. E2BIG = 7
  55. ENOEXEC = 8
  56. EBADF = 9
  57. ECHILD = 10
  58. EAGAIN = 11
  59. ENOMEM = 12
  60. EACCES = 13
  61. EFAULT = 14
  62. ENOTBLK = 15
  63. EBUSY = 16
  64. EEXIST = 17
  65. EXDEV = 18
  66. ENODEV = 19
  67. ENOTDIR = 20
  68. EISDIR = 21
  69. EINVAL = 22
  70. ENFILE = 23
  71. EMFILE = 24
  72. ENOTTY = 25
  73. ETXTBSY = 26
  74. EFBIG = 27
  75. ENOSPC = 28
  76. ESPIPE = 29
  77. EROFS = 30
  78. EMLINK = 31
  79. EPIPE = 32
  80. EDOM = 33
  81. ! Structure of filearea maintained by this implementation
  82. ! First iobuffer of 128 bytes
  83. ! Then the fcb area of 36 bytes
  84. ! The number of bytes left in the buffer, 1 byte
  85. ! The iopointer into the buffer, 2 bytes
  86. ! The openflag 0 unused, 1 reading, 2 writing, 1 byte
  87. ! The filedescriptor starting at 3, 1 byte
  88. ! The number of CTRL-Zs that have been absorbed, 1 byte
  89. ! The byte read after a sequence of CTRL-Zs, 1 byte
  90. maxfiles=8
  91. filesize=128+36+1+2+1+1+1+1
  92. filefcb=0 ! pointers point to fcb
  93. position=33
  94. nleft=36
  95. iopointer=37
  96. openflag=39
  97. fildes=40
  98. zcount=41
  99. zsave=42
  100. .assert [ filefcb] <> 0
  101. 0: .space maxfiles*filesize
  102. filearea = 0b+128
  103. sibuf:
  104. .data2 0
  105. .space 82
  106. siptr: .space 2
  107. saveargs:
  108. .space 128
  109. argc: .space 2
  110. ttymode:.data1 9,9,8,21;.data2 06310+RAW*040 ! raw = 040
  111. return:
  112. .data2 0,0
  113. uxinit:
  114. xor a
  115. ld c,maxfiles
  116. ld hl,0b
  117. 1: ld b,filesize
  118. 2: ld (hl),a
  119. inc hl
  120. djnz 2b
  121. dec c
  122. jr nz,1b
  123. ret
  124. uxfinish:
  125. ld a,maxfiles-1
  126. 1: push af
  127. call closefil
  128. pop af
  129. dec a
  130. cp 0377
  131. jr nz,1b
  132. ret
  133. .mon:
  134. pop ix
  135. ld (return),ix ! return adres
  136. pop de ! system call number
  137. xor a
  138. or d
  139. jr nz,unimpld ! too big
  140. ld a,e
  141. and 0300 ! only 64 system calls
  142. jr nz,unimpld
  143. sla e
  144. ld hl,systab
  145. add hl,de
  146. ld e,(hl)
  147. inc hl
  148. ld d,(hl)
  149. ex de,hl
  150. jp (hl)
  151. systab:
  152. .data2 e.mon ! ux_indir
  153. .data2 ux_exit
  154. .data2 e.mon ! ux_fork
  155. .data2 ux_read
  156. .data2 ux_write
  157. .data2 ux_open
  158. .data2 ux_close
  159. .data2 e.mon ! ux_wait
  160. .data2 ux_creat
  161. .data2 e.mon ! ux_link
  162. .data2 ux_unlink
  163. .data2 e.mon ! ux_exec
  164. .data2 e.mon ! ux_chdir
  165. .data2 ux_time
  166. .data2 e.mon ! ux_mknod
  167. .data2 e.mon ! ux_chmod
  168. .data2 e.mon ! ux_chown
  169. .data2 e.mon ! ux_break
  170. .data2 e.mon ! ux_stat
  171. .data2 e.mon ! ux_seek
  172. .data2 ux_getpid
  173. .data2 e.mon ! ux_mount
  174. .data2 e.mon ! ux_umount
  175. .data2 e.mon ! ux_setuid
  176. .data2 e.mon ! ux_getuid
  177. .data2 e.mon ! ux_stime
  178. .data2 e.mon ! ux_ptrace
  179. .data2 e.mon ! ux_alarm
  180. .data2 e.mon ! ux_fstat
  181. .data2 e.mon ! ux_pause
  182. .data2 e.mon ! ux_utime
  183. .data2 e.mon ! ux_stty
  184. .data2 e.mon ! ux_gtty
  185. .data2 e.mon ! ux_access
  186. .data2 e.mon ! ux_nice
  187. .data2 ux_ftime
  188. .data2 e.mon ! ux_sync
  189. .data2 e.mon ! ux_kill
  190. .data2 unimpld
  191. .data2 unimpld
  192. .data2 unimpld
  193. .data2 e.mon ! ux_dup
  194. .data2 e.mon ! ux_pipe
  195. .data2 e.mon ! ux_times
  196. .data2 e.mon ! ux_prof
  197. .data2 e.mon ! ux_unused
  198. .data2 e.mon ! ux_setgid
  199. .data2 e.mon ! ux_getgid
  200. .data2 e.mon ! ux_sig
  201. .data2 unimpld
  202. .data2 unimpld
  203. .data2 unimpld
  204. .data2 unimpld
  205. .data2 unimpld
  206. .data2 ux_ioctl
  207. .data2 unimpld
  208. .data2 unimpld
  209. .data2 unimpld
  210. .data2 unimpld
  211. .data2 unimpld ! ux_exece
  212. .data2 e.mon ! ux_umask
  213. .data2 e.mon ! ux_chroot
  214. .data2 unimpld
  215. .data2 unimpld
  216. emptyfile:
  217. ! searches for a free filestructure
  218. ! returns pointer in iy, 0 if not found
  219. ld ix,filearea
  220. ld l,maxfiles
  221. 1:
  222. xor a
  223. or (ix+openflag)
  224. jr nz,3f
  225. ld a,maxfiles+3
  226. sub l
  227. ld (ix+fildes),a
  228. ! #ifdef CPM1
  229. push iy
  230. push ix
  231. ld de,-128
  232. add ix,de
  233. push ix
  234. pop de
  235. ld c,setdma
  236. call bdos
  237. pop ix
  238. pop iy
  239. or a ! to clear C
  240. ! #endif
  241. ret
  242. 3:
  243. ld de,filesize
  244. add ix,de
  245. dec l
  246. jr nz,1b
  247. scf
  248. ret
  249. findfile:
  250. ld ix,filearea
  251. ld de,filesize
  252. 0:
  253. dec a
  254. ret m
  255. add ix,de
  256. jr 0b
  257. getchar:
  258. push iy
  259. push de
  260. push hl
  261. dec (ix+nleft)
  262. jp p,0f
  263. push ix
  264. pop hl
  265. ld de,-128
  266. add hl,de
  267. ld (ix+iopointer),l
  268. ld (ix+iopointer+1),h
  269. ex de,hl
  270. push ix
  271. ld c,setdma
  272. call bdos
  273. ! #ifdef CPM1
  274. ld c,seqread
  275. ! #else
  276. ! ld c,randomread
  277. ! #endif
  278. pop de
  279. call bdos
  280. or a
  281. jr z,1f
  282. ld (ix+zcount),0
  283. pop hl
  284. pop de
  285. pop iy
  286. scf
  287. ret
  288. 1:
  289. inc (ix+position)
  290. jr nz,2f
  291. inc (ix+position+1)
  292. 2:
  293. ld a,127
  294. ld (ix+nleft),a
  295. 0:
  296. ld h,(ix+iopointer+1)
  297. ld l,(ix+iopointer)
  298. ld a,(hl)
  299. inc hl
  300. ld (ix+iopointer),l
  301. ld (ix+iopointer+1),h
  302. pop hl
  303. pop de
  304. pop iy
  305. ret
  306. or a
  307. putchar:
  308. push hl
  309. ld h,(ix+iopointer+1)
  310. ld l,(ix+iopointer)
  311. ld (hl),a
  312. dec (ix+nleft)
  313. jr z,0f
  314. inc hl
  315. ld (ix+iopointer+1),h
  316. ld (ix+iopointer),l
  317. pop hl
  318. ret
  319. 0:
  320. pop hl
  321. flsbuf:
  322. push hl
  323. push de
  324. push iy
  325. push ix
  326. pop hl
  327. ld de,-128
  328. add hl,de
  329. ld (ix+iopointer+1),h
  330. ld (ix+iopointer),l
  331. ex de,hl
  332. push ix
  333. ld c,setdma
  334. call bdos
  335. pop de
  336. ! #ifdef CPM1
  337. ld c,seqwrite
  338. ! #else
  339. ! ld c,randomwrite
  340. ! #endif
  341. call bdos
  342. or a
  343. jr z,1f
  344. pop iy
  345. pop de
  346. pop hl
  347. scf
  348. ret
  349. 1:
  350. inc (ix+position)
  351. jr nz,2f
  352. inc (ix+position+1)
  353. 2:
  354. ld a,128
  355. ld (ix+nleft),a
  356. ld b,a
  357. push ix
  358. pop hl
  359. ld de,-128
  360. add hl,de
  361. ld a,26 ! ctrl z
  362. 1: ld (hl),a
  363. inc hl
  364. djnz 1b
  365. pop iy
  366. pop de
  367. pop hl
  368. or a
  369. ret
  370. parsename:
  371. ! parses file name pointed to by hl and fills in fcb
  372. ! of the file pointed to by ix.
  373. ! recognizes filenames as complicated as 'b:file.zot'
  374. ! and as simple as 'x'
  375. push iy
  376. push ix
  377. pop de
  378. xor a
  379. push de
  380. ld b,36 ! sizeof fcb
  381. 0: ld (de),a
  382. inc de
  383. djnz 0b
  384. pop de
  385. inc hl
  386. ld a,(hl)
  387. dec hl
  388. cp ':' ! drive specified ?
  389. jr nz,1f
  390. ld a,(hl)
  391. inc hl
  392. inc hl
  393. dec a
  394. and 15
  395. inc a ! now 1<= a <= 16
  396. ld (de),a
  397. 1: inc de
  398. ld b,8 ! filename maximum of 8 characters
  399. 1: ld a,(hl)
  400. or a
  401. jr nz,8f
  402. dec hl
  403. ld a,'.'
  404. 8:
  405. inc hl
  406. cp '.'
  407. jr z,2f
  408. and 0177 ! no parity
  409. bit 6,a
  410. jr z,9f
  411. and 0337 ! UPPER case
  412. 9:
  413. ld (de),a
  414. inc de
  415. djnz 1b
  416. ld a,(hl)
  417. inc hl
  418. cp '.'
  419. jr z,3f
  420. ld a,' '
  421. ld (de),a
  422. inc de
  423. ld (de),a
  424. inc de
  425. ld (de),a
  426. pop iy
  427. ret ! filenames longer than 8 are truncated
  428. 2: ld a,' ' ! fill with spaces
  429. 0: ld (de),a
  430. inc de
  431. djnz 0b
  432. 3: ld b,3 ! length of extension
  433. 1: ld a,(hl)
  434. inc hl
  435. or a
  436. jr z,4f
  437. cp 0100
  438. jp m,2f
  439. and 0137
  440. 2: ld (de),a
  441. inc de
  442. djnz 1b
  443. pop iy
  444. ret
  445. 4: ld a,' '
  446. 0: ld (de),a
  447. inc de
  448. djnz 0b
  449. pop iy
  450. ret
  451. ! various routines
  452. ux_close:
  453. pop hl
  454. ld a,l
  455. sub 3
  456. jp m,1f
  457. cp maxfiles
  458. call m,closefil
  459. 1: ld hl,0
  460. push hl ; jr rtn
  461. closefil:
  462. call findfile
  463. ld a,(ix+openflag)
  464. or a
  465. jr z,3f
  466. ld (ix+openflag),0
  467. cp 1
  468. jr z,2f
  469. ld a,(ix+nleft)
  470. cp 128
  471. jr z,2f
  472. call flsbuf
  473. 2:
  474. push iy
  475. push ix
  476. pop de
  477. ld c,close
  478. call bdos
  479. pop iy
  480. 3: ret
  481. ux_ioctl:
  482. pop hl
  483. ld a,l
  484. sub 3
  485. jp p,1f
  486. pop hl
  487. ld a,h
  488. cp 't'
  489. jr nz,e.mon
  490. ld a,l
  491. cp 8
  492. jr z,tiocgetp
  493. cp 9
  494. jr z,tiocsetp
  495. jr e.mon
  496. 1: pop hl
  497. pop hl
  498. ld hl,-1
  499. push hl ; jr rtn
  500. tiocgetp:
  501. pop de
  502. ld hl,ttymode
  503. 2: push bc
  504. ld bc,6
  505. ldir
  506. ld h,b
  507. ld l,c
  508. pop bc
  509. push hl ; jr rtn
  510. tiocsetp:
  511. pop hl
  512. ld de,ttymode
  513. jr 2b
  514. ux_time:
  515. call time4
  516. rtn: ld ix,(return) ; jp (ix)
  517. ux_ftime:
  518. pop hl
  519. ld (retarea+6),hl
  520. call time4
  521. ld hl,(retarea+6)
  522. pop de
  523. ld (hl),e
  524. inc hl
  525. ld (hl),d
  526. inc hl
  527. pop de
  528. ld (hl),e
  529. inc hl
  530. ld (hl),d
  531. inc hl
  532. xor a
  533. ld (hl),a
  534. inc hl
  535. ld (hl),a
  536. inc hl
  537. ld (hl),a
  538. inc hl
  539. ld (hl),a
  540. inc hl
  541. ld (hl),a
  542. inc hl
  543. ld (hl),a
  544. ld ix,(return) ; jp (ix)
  545. time4:
  546. pop hl
  547. ld (retarea),iy
  548. ld (retarea+2),bc
  549. ld (retarea+4),hl
  550. ld hl,(timebuf+2)
  551. push hl
  552. ld hl,(timebuf)
  553. push hl
  554. ld hl,0
  555. push hl
  556. ld hl,50
  557. push hl
  558. call .dvu4
  559. ld iy,(retarea)
  560. ld bc,(retarea+2)
  561. ld hl,(retarea+4)
  562. jp (hl)
  563. ux_exit:
  564. call uxfinish
  565. ld c,reset
  566. call bdos
  567. ! no return
  568. ux_creat:
  569. call emptyfile
  570. jr c,openfailed
  571. pop hl
  572. call parsename
  573. pop hl ! file mode, not used under CP/M
  574. push iy
  575. push ix
  576. push ix
  577. pop de
  578. ld c,delete
  579. call bdos
  580. pop de
  581. ld c,makefile
  582. call bdos
  583. pop iy
  584. ld l,1
  585. jr afteropen
  586. ux_open:
  587. call emptyfile
  588. jr nc,1f
  589. openfailed:
  590. pop hl
  591. pop hl ! remove params
  592. ld hl,EMFILE
  593. push hl
  594. push hl ; jr rtn
  595. 1:
  596. pop hl ! filename
  597. call parsename
  598. push iy
  599. ld c,open
  600. push ix
  601. pop de
  602. call bdos
  603. pop iy
  604. pop hl
  605. afteropen:
  606. inc a
  607. jr nz,1f
  608. ld hl,ENOENT
  609. push hl
  610. push hl ; jr rtn
  611. 1:
  612. inc l
  613. ld (ix+openflag),l
  614. xor a
  615. ld (ix+nleft),a
  616. ld (ix+zcount),a
  617. ld (ix+zsave),26
  618. bit 1,l
  619. jr z,2f
  620. ld (ix+nleft),128
  621. 2:
  622. ld (ix+position),a
  623. ld (ix+position+1),a
  624. push ix
  625. pop hl
  626. push bc
  627. ld b,128
  628. 3: dec hl
  629. ld (hl),26
  630. djnz 3b
  631. pop bc
  632. ld (ix+iopointer+1),h
  633. ld (ix+iopointer),l
  634. ld h,a
  635. ld l,(ix+fildes)
  636. push hl
  637. ld l,a
  638. push hl ; jr rtn
  639. ux_read:
  640. pop hl
  641. ld a,l
  642. sub 3
  643. jp p,readfile
  644. ld a,(ttymode+4)
  645. bit 5,a
  646. jr z,1f ! not raw
  647. push iy
  648. ! #ifdef CPM1
  649. !raw echo interface
  650. ld c,consolein
  651. call bdos
  652. ! #else
  653. ! !no echo interface
  654. ! 4:
  655. ! ld c,diconio
  656. ! ld e,0xff
  657. ! call bdos
  658. ! or a
  659. ! jr z,4b
  660. !end of no echo interface
  661. ! #endif
  662. pop iy
  663. pop hl
  664. ld (hl),a
  665. pop hl
  666. ld hl,1
  667. push hl
  668. ld hl,0
  669. push hl ; jr rtn
  670. 1:
  671. ld hl,sibuf+1 ! read from console assumed
  672. dec (hl)
  673. jp p,2f
  674. dec hl ! go read console line
  675. ld (hl),80 ! max line length
  676. push iy
  677. push hl
  678. ld c,readconsole
  679. ex de,hl
  680. call bdos
  681. ld c,writeconsole
  682. ld e,'\n'
  683. call bdos
  684. pop hl
  685. pop iy
  686. inc hl
  687. inc (hl)
  688. ld (siptr),hl ! ready for transfer
  689. push hl
  690. ld e,(hl)
  691. ld d,0
  692. add hl,de
  693. ld (hl),'\r'
  694. inc hl
  695. ld (hl),'\n'
  696. pop hl
  697. 2:
  698. push bc
  699. pop ix
  700. ld b,(hl)
  701. inc b ! bytes remaining
  702. pop hl ! copy to
  703. pop de ! bytes wanted (probably 512)
  704. push ix
  705. ld ix,(siptr) ! copy from
  706. xor a ! find out minimum of ramaining and wanted
  707. or d
  708. jr nz,3f ! more than 255 wanted (forget that)
  709. ld a,b
  710. cp e
  711. jp m,3f ! not enough remaining
  712. ld b,e
  713. 3:
  714. ld c,b ! keep copy
  715. 0:
  716. inc ix
  717. ld a,(ix)
  718. ld (hl),a
  719. inc hl
  720. djnz 0b
  721. ld a,(sibuf+1)
  722. sub c
  723. inc a
  724. ld (sibuf+1),a
  725. ld (siptr),ix
  726. pop hl
  727. push bc
  728. ld c,b
  729. push bc ! load 0
  730. ld b,h
  731. ld c,l
  732. ld ix,(return) ; jp (ix)
  733. readfile:
  734. call findfile
  735. pop de
  736. pop hl ! count
  737. push bc
  738. ld bc,0
  739. 0:
  740. xor a
  741. or l
  742. jr z,1f
  743. dec l
  744. 3:
  745. ! warning: this may not work if zcount overflows
  746. ld a,(ix+zcount)
  747. or a
  748. jr nz,5f
  749. ld a,(ix+zsave)
  750. cp 26
  751. jr z,4f
  752. ld (ix+zsave),26
  753. jr 8f
  754. 4:
  755. call getchar
  756. jr c,2f
  757. ld (de),a
  758. sub 26 ! CTRL-Z
  759. jr z,7f
  760. ld a,(ix+zcount)
  761. or a
  762. jr z,6f
  763. ld a,(de)
  764. ld (ix+zsave),a
  765. 5:
  766. ld a,26
  767. dec (ix+zcount)
  768. 8:
  769. ld (de),a
  770. 6:
  771. inc de
  772. inc bc
  773. jr 0b
  774. 1:
  775. dec l
  776. dec h
  777. jp p,3b
  778. 2:
  779. pop hl
  780. push bc
  781. ld b,h
  782. ld c,l
  783. ld hl,0
  784. push hl ; jr rtn
  785. 7:
  786. inc (ix+zcount)
  787. jr 4b
  788. ux_write:
  789. pop hl
  790. ld a,l
  791. sub 3
  792. jp p,writefile
  793. pop hl ! buffer address
  794. pop de ! count
  795. push de
  796. ld ix,0
  797. push ix
  798. push bc
  799. ld b,e ! count now in 'db'
  800. 0:
  801. ld a,b
  802. or a
  803. jr nz,1f
  804. ld a,d
  805. or a
  806. jr nz,2f
  807. pop bc
  808. ld ix,(return) ; jp (ix)
  809. 2:
  810. dec d
  811. 1:
  812. dec b
  813. ld e,(hl)
  814. inc hl
  815. push bc
  816. push de
  817. push hl
  818. ld c,writeconsole
  819. call bdos
  820. pop hl
  821. pop de
  822. pop bc
  823. jr 0b
  824. writefile:
  825. call findfile
  826. pop de
  827. pop hl ! count
  828. push bc
  829. ld bc,0
  830. 0:
  831. xor a
  832. or l
  833. jr z,1f
  834. dec l
  835. 3:
  836. ld a,(de)
  837. inc de
  838. call putchar
  839. jr c,4f
  840. inc bc
  841. jr 0b
  842. 1:
  843. dec l
  844. dec h
  845. jp p,3b
  846. ld ix,0
  847. 2:
  848. pop hl
  849. push bc
  850. ld b,h
  851. ld c,l
  852. push ix
  853. ld ix,(return) ; jp (ix)
  854. 4:
  855. ld ix,ENOSPC
  856. jr 2b
  857. ux_unlink:
  858. pop hl
  859. ld ix,fcb
  860. call parsename
  861. push bc
  862. ld c,delete
  863. ld de,fcb
  864. call bdos
  865. pop bc
  866. inc a
  867. jr nz,1f
  868. ld hl,ENOENT
  869. push hl ; jr rtn
  870. 1:
  871. ld hl,0
  872. push hl ; jr rtn
  873. ux_getpid:
  874. ld hl,12345 ! nice number
  875. push hl ; jr rtn
  876. retarea: .data2 0 ! base of buffer for result values (max 8 bytes)
  877. .data2 0
  878. .data2 0
  879. .data2 0
  880. trapproc:
  881. .data2 0
  882. nextp: .data1 0
  883. header:
  884. ntext: .data2 0
  885. ndata: .data2 0
  886. nproc: .data2 0
  887. entry: .data2 0
  888. nline: .data2 0
  889. hp: .data2 0
  890. pb: .data2 0
  891. pd: .data2 0