;return RO3.11 address if emulating <RO3.5
; R11 - pointer to VARS

.vector_handler_31
 TST     R1, #1				;is it our code asking for the actual
 BICNE   R1, R1, #1			;..address?
 BNE     vector_handler_forward		;YES, pass to OS

 LDRB    R14, [R11, #is_screen_remapped - VARS]	;RO3.11 emulation?
 TEQ     R14, #0			;is the screen memory remapped?
 BEQ     vector_handler_forward		;NO, exit

 BL      check_taskID			;task we support?
 BLEQ    check_SWI_in_appspace_or_JIT
 BNE     vector_handler_forward		;NO, pass to OS

 STMFD   R13!, {R0, R2-R5}
 MOV     R3, R13
 SUB     R13, R13, #4 * 4		;space for result info
 MOV     R2, R13
 SUB     R5, R0, #4
 ._L1
   LDR     R14, [R5, #4]!

   TEQ     R14, #148			;ScreenStart?
   TEQNE   R14, #149			;DisplayStart?
   SUBEQ   R4, R5, R0
   STREQ   R4, [R2], #4			;store the result address

   CMN     R14, #1			;last in list?
   TEQNE   R2, R3			;end of our table?
 BNE     _L1

 BL      pre_SWI_veneer			;call SWI that follows
 SWI     XOS_ReadVduVariables
 BL      post_SWI_veneer
 BL      dontexit_SWI_veneer

 LDR     R3, DA2_address
 LDR     R0, DA2_size
 #if compile_RO == 400
   LDR     R14, [R11, #DA2_delta - VARS]	;fix RO4/6 SA
   ADD     R0, R0, R14
 #endif
 SUB     R3, R3, #&2000000
 ADD     R3, R3, R0
 MOV     R0, R13
 ._L2
   TEQ     R0, R2			;last entry?
   ADDEQ   R13, R13, #4 * 4		;YES, release space
   LDMEQFD R13!, {R0, R2-R5}		; |   clear stack
   BEQ     vector_handler_trap		; |+  exit

   LDR     R5, [R0], #4
   LDR     R4, [R1, R5]			;get the entry
   CMP     R4, #&2000000		;is it in RO3.5+ space?
   SUBHI   R4, R4, R3			;YES, correct address
   STRHI   R4, [R1, R5]			; |+ store back
 B        _L2
