ack/mach/z8000/libem/mon.s
1987-01-19 10:51:50 +00:00

89 lines
1.4 KiB
ArmAsm

.define mon
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
mon:
popl saveret, *RR14
pop R0, *RR14 ! iocode
cp R0, $1 ! exit
jr NE, read
inc R15, $2
sc $EXIT
read: cp R0, $3 ! read
jr NE, write
pop R0, *RR14 ! dummy; all input from stdin
pop R1, *RR14 ! ptr to buffer
pop R2, *RR14 ! nr of bytes to be read
ld R3, R1
cp R2, $0
jr EQ, 6f
1: sc $2 ! read character into RL0
cpb RL0, $004 ! \^D
jr EQ, 6f
cpb RL0, $015 ! \cr
jr NE, 2f
ldb RL0, $012
2: sc $4 ! echo
cpb RL0, $010 ! \^H
jr NE, 3f
cp R1, R3
jr EQ, 5f
dec R1
jr 5f
3: cpb RL0, $0100 ! \@
jr NE, 4f
ld R1, R3
ldb RL0, $012
sc $4
jr 5f
4: ldb 0(R1), RL0
inc R1
cpb RL0, $012 ! \nl
jr EQ, 6f
5: djnz R2, 1b
6: sub R1, R3 ! nr of bytes read
push *RR14, R1
push *RR14, $0
jr retu
write: cp R0, $4 ! write
jr NE, open
pop R0, *RR14 ! dummy; all output to stdout
pop R1, *RR14 ! ptr to buffer
pop R2, *RR14 ! nr of bytes to be written
ld R3, R2
cp R2, $0
jr EQ, 8f
9: ld R0, $5000 ! counter to delay printing a little
7: djnz R0, 7b
ldb RL0, 0(R1)
sc $4
inc R1
djnz R2, 9b
8: sub R3, R2 ! nr of bytes written
push *RR14, R3
push *RR14, $0
jr retu
open: cp R0, $5 ! open
jr close
jr NE, close
ld *RR14, $0
ld 2(R15), $0
jr retu
close: cp R0, $6 ! close
jr NE, ioctl
ld *RR14, $0
jr retu
ioctl: cp R0, $54 ! ioctl
jr NE, err
inc R15, $4
ld *RR14, $0
retu: ldl RR2, saveret
jp *RR2
err: push *RR14, saveret
push *RR14, $EBADMON
calr trp
ret