ack/mach/i80/libmon/mon.s
1985-03-18 13:12:07 +00:00

109 lines
1.7 KiB
ArmAsm

.define .mon
! Monitor call
! Expects on stack: monitor call number
! parameters
! Implemented are the following monitor calls:
! number 1: exit
! number 3: read
! number 4: write
! number 5: open
! number 6: close
! number 54: ioctl
! If called with a number of a call that is not implemented,
! a trap is generated.
.mon: pop h
shld .retadr
mov h,b
mov l,c
shld .bcreg
pop h ! monitor call number
mov a,l
cpi 1
jz monexit ! is it an exit?
cpi 3
jz monread ! is it a read?
cpi 4
jz monwrite ! is it a write?
cpi 5
jz monopen ! is it an open?
cpi 6
jz monclose ! is it a close?
cpi 54
jz monioctl
jmp ebadmon ! trap
monexit:
jmp .stop
monread:
pop h ! file-descriptor, not used
pop h ! hl = pointer to output buffer
pop d ! de = number of bytes to be read
lxi b,0 ! bc will contain the number of bytes actually read
1: mov a,d
ora e
jz 2f
call getchar
push psw
call putchar ! echo character
pop psw
mov m,a
inx h
inx b
dcx d
cpi 0x0A ! is it a newline?
jnz 1b
2: push b
lxi h,0
push h
jmp monret
monwrite:
pop h ! file-descriptor, not used
pop h ! hl = pointer to output buffer
pop d ! de = number of bytes
push d
1: mov a,e
ora d
jz 2f
mov a,m
call putchar
inx h
dcx d
jmp 1b
2: push d ! no error
jmp monret
monopen:
pop h ! pointer to string
pop h ! flag
lxi h,-1
push h ! push file descriptor
push h ! push error code twice
push h
jmp monret
monclose:
lxi h,0
xthl ! remove file descriptor and push error code
jmp monret
monioctl:
pop h ! file descriptor
pop h ! request
lxi h,0
xthl ! remove argp and push error code
jmp monret
monret:
lhld .bcreg
mov b,h
mov c,l
lhld .retadr
pchl