subr.s 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. .define _read,_write,_ioctl,_getpid,_open,_close,_exit,_errno
  2. _read:
  3. ld (savebc),bc
  4. push af
  5. pop bc
  6. ld (saveaf),bc ! save all registers in savereg
  7. ld (savede),de
  8. ld (savehl),hl
  9. ld (saveix),ix
  10. ex (sp),hl ! return address in hl
  11. pop bc ! skip return address
  12. pop bc ! get fd
  13. ld a,b ! check fd = 0
  14. or c
  15. jr nz,errrd
  16. pop de ! get buffer
  17. pop bc ! get count
  18. ld ix,0 ! reset counter
  19. push bc
  20. push de
  21. push ix
  22. push hl ! return address
  23. ex de,hl ! buffer to hl
  24. 1: ld a,b
  25. or c
  26. jr z,done ! done if count = 0
  27. call getchr
  28. ld (hl),a
  29. inc hl ! increment pointer
  30. inc ix ! increment char counter
  31. dec bc ! decrement count
  32. cp 0xA
  33. jr nz,1b ! done if char = CR
  34. done:
  35. ld bc,(saveaf)
  36. push bc
  37. pop af
  38. ld bc,(savebc)
  39. ld de,(savede)
  40. ld hl,(savehl)
  41. ld ix,(saveix)
  42. ret
  43. errrd:
  44. push bc
  45. push hl ! return address
  46. ld bc,(saveaf)
  47. push bc
  48. pop af
  49. ld bc,(savebc)
  50. ld de,(savede)
  51. ld hl,(savehl)
  52. ld ix,(saveix)
  53. ld ix,-1
  54. ret
  55. _write:
  56. ld (savebc),bc
  57. push af
  58. pop bc
  59. ld (saveaf),bc ! save all registers in savereg
  60. ld (savede),de
  61. ld (savehl),hl
  62. ld (saveix),ix
  63. ex (sp),hl ! return address in hl
  64. pop de ! skip return address
  65. pop de ! get fd
  66. ld a,e ! check for fd = 1
  67. cp 1
  68. jr nz,errwr
  69. ld a,d
  70. or a
  71. jr nz,errwr
  72. pop de ! buffer in de
  73. pop bc ! count in bc
  74. push bc
  75. push de
  76. push de
  77. push hl
  78. ex de,hl ! buffer in hl
  79. ld e,c
  80. ld d,b ! count also in de
  81. 1: ld a,b
  82. or c
  83. jr z,exit
  84. ld a,(hl)
  85. call putchr
  86. inc hl
  87. dec bc
  88. jr 1b
  89. errwr:
  90. push de
  91. push hl
  92. ld bc,(saveaf)
  93. push bc
  94. pop af
  95. ld bc,(savebc)
  96. ld de,(savede)
  97. ld hl,(savehl)
  98. ld ix,(saveix)
  99. ld ix,-1 ! error in fd
  100. ret
  101. exit:
  102. push de ! count on stack
  103. ld bc,(saveaf)
  104. push bc
  105. pop af
  106. ld bc,(savebc)
  107. ld de,(savede)
  108. ld hl,(savehl)
  109. ld ix,(saveix)
  110. pop ix ! return count to caller
  111. ret
  112. _ioctl:
  113. ret
  114. _getpid:
  115. ret
  116. ! open return a file descriptor (0,1,2)
  117. ! depending on 'mode'
  118. ! mode 2 doesn't work!!
  119. _open:
  120. ld (savebc),bc
  121. push af
  122. pop bc
  123. ld (saveaf),bc ! save all registers in savereg
  124. ld (savede),de
  125. ld (savehl),hl
  126. ld (saveix),ix
  127. pop bc ! return address
  128. pop de ! name pointer
  129. pop ix ! mode (0 for read,
  130. ! 1 for write)
  131. push ix
  132. push de
  133. push bc
  134. ld bc,(saveaf)
  135. push bc
  136. pop af
  137. ld bc,(savebc)
  138. ld de,(savede)
  139. ld hl,(savehl)
  140. ld ix,(saveix)
  141. ret ! return fd = 0 for read
  142. ! fd = 1 for write
  143. _close:
  144. ld ix,0 ! return succes
  145. ret
  146. _exit:
  147. jp 0x38
  148. .data
  149. _errno:
  150. .word 0
  151. ! output routine in monitor
  152. CRT = 0x013B
  153. ! output a charcter
  154. ! entry: ascii character in a
  155. .text
  156. !putchr:
  157. ! push hl
  158. ! push bc
  159. ! ld hl,tab
  160. ! ld b,5
  161. !1: cp (hl)
  162. ! jr z,fetch
  163. ! inc hl
  164. ! inc hl
  165. ! djnz 1b
  166. !2: call CRT
  167. ! pop bc
  168. ! pop hl
  169. ! ret
  170. !fetch: inc hl
  171. ! ld a,(hl)
  172. ! jr 2b
  173. !! conversion table for nascom characters
  174. !tab: .byte 0x0D,0x00
  175. ! .byte 0x1B,0x1E
  176. ! .byte 0x08,0x1D
  177. ! .byte 0x0A,0x1F
  178. ! .byte 0x7F,0x00
  179. KBD = 0x69
  180. ! get character from keyboard
  181. getchr:
  182. call KBD
  183. jr nc,getchr
  184. cp 0x1F
  185. jr z,CR
  186. cp 0x1D
  187. jr z,BS
  188. ret
  189. CR: ld a,0xA
  190. ret
  191. BS: ld a,0x8
  192. ret