ack/mach/i80/libmon/mon.s

78 lines
1.2 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
! 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?
jmp ebadmon ! trap
monexit:
rst 4
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
monret:
lhld .bcreg
mov b,h
mov c,l
lhld .retadr
pchl