.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