81 lines
1.8 KiB
ArmAsm
81 lines
1.8 KiB
ArmAsm
|
.sect .text; .sect .rom; .sect .data; .sect .bss
|
||
|
.define __send, __receive, __sendrec
|
||
|
|
||
|
! See ../h/com.h for C definitions
|
||
|
SEND = 1
|
||
|
RECEIVE = 2
|
||
|
BOTH = 3
|
||
|
NB_SEND = 1 + 16 ! SEND | 0xF0
|
||
|
NB_RECEIVE = 2 + 16 ! RECEIVE | 0xF0
|
||
|
SYSVEC = 33
|
||
|
|
||
|
SRCDEST = 8
|
||
|
MESSAGE = 12
|
||
|
|
||
|
!*========================================================================*
|
||
|
! _send and _receive *
|
||
|
!*========================================================================*
|
||
|
! _send(), _nb_send(), _receive(), _nb_receive(), and _sendrec() all
|
||
|
! save ebp, but destroy eax and ecx.
|
||
|
.define __send, __nb_send, __receive, __nb_receive, __sendrec
|
||
|
.sect .text
|
||
|
__send:
|
||
|
push ebp
|
||
|
mov ebp, esp
|
||
|
push ebx
|
||
|
mov eax, SRCDEST(ebp) ! eax = dest-src
|
||
|
mov ebx, MESSAGE(ebp) ! ebx = message pointer
|
||
|
mov ecx, SEND ! _send(dest, ptr)
|
||
|
int SYSVEC ! trap to the kernel
|
||
|
pop ebx
|
||
|
pop ebp
|
||
|
ret
|
||
|
|
||
|
__nb_send:
|
||
|
push ebp
|
||
|
mov ebp, esp
|
||
|
push ebx
|
||
|
mov eax, SRCDEST(ebp) ! eax = dest-src
|
||
|
mov ebx, MESSAGE(ebp) ! ebx = message pointer
|
||
|
mov ecx, NB_SEND ! _nb_send(dest, ptr)
|
||
|
int SYSVEC ! trap to the kernel
|
||
|
pop ebx
|
||
|
pop ebp
|
||
|
ret
|
||
|
|
||
|
__receive:
|
||
|
push ebp
|
||
|
mov ebp, esp
|
||
|
push ebx
|
||
|
mov eax, SRCDEST(ebp) ! eax = dest-src
|
||
|
mov ebx, MESSAGE(ebp) ! ebx = message pointer
|
||
|
mov ecx, RECEIVE ! _receive(src, ptr)
|
||
|
int SYSVEC ! trap to the kernel
|
||
|
pop ebx
|
||
|
pop ebp
|
||
|
ret
|
||
|
|
||
|
__nb_receive:
|
||
|
push ebp
|
||
|
mov ebp, esp
|
||
|
push ebx
|
||
|
mov eax, SRCDEST(ebp) ! eax = dest-src
|
||
|
mov ebx, MESSAGE(ebp) ! ebx = message pointer
|
||
|
mov ecx, NB_RECEIVE ! _nb_receive(src, ptr)
|
||
|
int SYSVEC ! trap to the kernel
|
||
|
pop ebx
|
||
|
pop ebp
|
||
|
ret
|
||
|
|
||
|
__sendrec:
|
||
|
push ebp
|
||
|
mov ebp, esp
|
||
|
push ebx
|
||
|
mov eax, SRCDEST(ebp) ! eax = dest-src
|
||
|
mov ebx, MESSAGE(ebp) ! ebx = message pointer
|
||
|
mov ecx, BOTH ! _sendrec(srcdest, ptr)
|
||
|
int SYSVEC ! trap to the kernel
|
||
|
pop ebx
|
||
|
pop ebp
|
||
|
ret
|