subr.s 2.9 KB

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