mon.s 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. .define .mon
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! Monitor call
  8. ! Expects on stack: monitor call number
  9. ! parameters
  10. ! Implemented are the following monitor calls:
  11. ! number 1: exit
  12. ! number 3: read
  13. ! number 4: write
  14. ! number 5: open
  15. ! number 6: close
  16. ! number 54: ioctl
  17. ! If called with a number of a call that is not implemented,
  18. ! a trap is generated.
  19. .mon:
  20. pop ix ! returnaddress
  21. pop hl ! monitor call number
  22. ld a,l
  23. cp 1
  24. jp z,monexit ! is it an exit?
  25. cp 3
  26. jp z,monread ! is it a read?
  27. cp 4
  28. jp z,monwrite ! is it a write?
  29. cp 5
  30. jp z,monopen ! is it an open?
  31. cp 6
  32. jp z,monclose ! is it a close?
  33. cp 54
  34. jp z,monioctl
  35. jp ebadmon ! trap
  36. monexit:
  37. jp 0x38
  38. monread:
  39. pop hl ! file-descriptor, not used
  40. pop hl ! hl = pointer to output buffer
  41. pop de ! de = number of bytes to be read
  42. ld bc,0 ! bc will contain the number of bytes actually read
  43. 1: ld a,d
  44. or e
  45. jr z,2f
  46. call getchar
  47. push af
  48. call putchar ! echo character
  49. pop af
  50. ld (hl),a
  51. inc hl
  52. inc bc
  53. dec de
  54. cp 0x0A ! is it a newline?
  55. jp nz,1b
  56. 2: push bc
  57. ld hl,0
  58. push hl
  59. jp (ix)
  60. monwrite:
  61. pop hl ! file-descriptor, not used
  62. pop hl ! hl = pointer to output buffer
  63. pop de ! de = number of bytes
  64. push de
  65. 1: ld a,e
  66. or d
  67. jr z,2f
  68. ld a,(hl)
  69. call putchar
  70. inc hl
  71. dec de
  72. jp 1b
  73. 2: push de ! no error
  74. jp (ix)
  75. monopen:
  76. pop hl ! pointer to string
  77. pop hl ! flag
  78. ld hl,-1
  79. push hl ! push file descriptor
  80. push hl ! push error code twice
  81. push hl
  82. jp (ix)
  83. monclose:
  84. ex (sp),hl ! pop file descriptor and push error code
  85. pop hl ! file descriptor
  86. ld hl,-1
  87. push hl ! push error code twice
  88. push hl
  89. jp (ix)
  90. monioctl:
  91. pop hl ! file descriptor
  92. pop hl ! request
  93. ld hl,0
  94. ex (sp),hl ! remove argp and push error code
  95. jp (ix)