.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