ack/mach/arm/libmon/swi.s
1990-11-12 17:13:45 +00:00

95 lines
1.5 KiB
ArmAsm

.define _Swi, _Swix, _bbc_get, _bbc_vduw, _bbc_vdu
.sect .text
! Swi(code, regpt)
_Swi:
ADR R11,_100
LDR R10,[R11]
LDR R9,[R12]
AND R10,R10,#0xFF000000
AND R9,R9,#0xFFFFFF
ORR R10,R10,R9
STR R10,[R11]
LDR R11,[R12,#4] ! PT TO REGS
STMFD R12<,{R4,R5,R6,R7}
LDR R0,[R11,#0]
LDR R1,[R11,#4]
LDR R2,[R11,#8]
LDR R3,[R11,#12]
LDR R4,[R11,#16]
LDR R5,[R11,#20]
LDR R6,[R11,#24]
LDR R7,[R11,#28]
LDR R8,[R11,#32]
LDR R9,[R11,#36]
_100:
SWI 0
STR R0,[R11,#0]
STR R1,[R11,#4]
STR R2,[R11,#8]
STR R3,[R11,#12]
STR R4,[R11,#16]
STR R5,[R11,#20]
STR R6,[R11,#24]
STR R7,[R11,#28]
STR R8,[R11,#32]
STR R9,[R11,#36]
LDMFD R12<,{R4,R5,R6,R7}
MOV.S R15,R14
_Swix:
ADR R11,_101
LDR R10,[R11]
LDR R9,[R12]
AND R10,R10,#0xFF000000
AND R9,R9,#0xFFFFFF
ORR R10,R10,R9
ORR R10,R10,#0x20000
STR R10,[R11]
LDR R11,[R12,#4]
STMFD R12<,{R4,R5,R6,R7}
LDR R0,[R11,#0]
LDR R1,[R11,#4]
LDR R2,[R11,#8]
LDR R3,[R11,#12]
LDR R4,[R11,#16]
LDR R5,[R11,#20]
LDR R6,[R11,#24]
LDR R7,[R11,#28]
LDR R8,[R11,#32]
LDR R9,[R11,#36]
_101:
SWI 0
STR R0,[R11,#0]
STR R1,[R11,#4]
STR R2,[R11,#8]
STR R3,[R11,#12]
STR R4,[R11,#16]
STR R5,[R11,#20]
STR R6,[R11,#24]
STR R7,[R11,#28]
STR R8,[R11,#32]
STR R9,[R11,#36]
MOV.VC R0, #0
LDMFD R12<,{R4,R5,R6,R7}
MOV.S R15,R14
! the rest is for Acorn compatibility
_bbc_get:
SWI 4 ! READC
MOV.S R15,R14
_bbc_vduw:
LDR R0,[R12]
SWI 0 !WRITEC
MOV R0,R0,LSR #8
SWI 0
MOV.S R15,R14
_bbc_vdu:
LDR R0,[R12]
SWI 0
MOV.S R15,R14