108 lines
1.7 KiB
ArmAsm
108 lines
1.7 KiB
ArmAsm
.define .mon
|
|
.sect .text
|
|
.sect .rom
|
|
.sect .data
|
|
.sect .bss
|
|
.sect .text
|
|
|
|
! 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 ix ! returnaddress
|
|
|
|
pop hl ! monitor call number
|
|
ld a,l
|
|
cp 1
|
|
jp z,monexit ! is it an exit?
|
|
cp 3
|
|
jp z,monread ! is it a read?
|
|
cp 4
|
|
jp z,monwrite ! is it a write?
|
|
cp 5
|
|
jp z,monopen ! is it an open?
|
|
cp 6
|
|
jp z,monclose ! is it a close?
|
|
cp 54
|
|
jp z,monioctl
|
|
jp ebadmon ! trap
|
|
|
|
monexit:
|
|
jp 0x38
|
|
|
|
monread:
|
|
pop hl ! file-descriptor, not used
|
|
pop hl ! hl = pointer to output buffer
|
|
pop de ! de = number of bytes to be read
|
|
ld bc,0 ! bc will contain the number of bytes actually read
|
|
1: ld a,d
|
|
or e
|
|
jr z,2f
|
|
call getchar
|
|
push af
|
|
call putchar ! echo character
|
|
pop af
|
|
ld (hl),a
|
|
inc hl
|
|
inc bc
|
|
dec de
|
|
cp 0x0A ! is it a newline?
|
|
jp nz,1b
|
|
2: push bc
|
|
ld hl,0
|
|
push hl
|
|
jp (ix)
|
|
|
|
monwrite:
|
|
pop hl ! file-descriptor, not used
|
|
pop hl ! hl = pointer to output buffer
|
|
pop de ! de = number of bytes
|
|
push de
|
|
1: ld a,e
|
|
or d
|
|
jr z,2f
|
|
ld a,(hl)
|
|
call putchar
|
|
inc hl
|
|
dec de
|
|
jp 1b
|
|
|
|
2: push de ! no error
|
|
jp (ix)
|
|
|
|
|
|
monopen:
|
|
pop hl ! pointer to string
|
|
pop hl ! flag
|
|
ld hl,-1
|
|
push hl ! push file descriptor
|
|
push hl ! push error code twice
|
|
push hl
|
|
jp (ix)
|
|
|
|
monclose:
|
|
ex (sp),hl ! pop file descriptor and push error code
|
|
pop hl ! file descriptor
|
|
ld hl,-1
|
|
push hl ! push error code twice
|
|
push hl
|
|
jp (ix)
|
|
|
|
monioctl:
|
|
pop hl ! file descriptor
|
|
pop hl ! request
|
|
ld hl,0
|
|
ex (sp),hl ! remove argp and push error code
|
|
jp (ix)
|
|
|