diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 8770e05..c22b313 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -913,13 +913,22 @@ static void shader_arb_get_swizzle(const struct wined3d_shader_src_param *param,
     *ptr = '\0';
 }
 
-static void shader_arb_request_a0(const struct wined3d_shader_instruction *ins, const char *src)
+static void shader_arb_request_a0(const struct wined3d_shader_instruction *ins, const char *src, UINT offset)
 {
     struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct arb_vshader_private *shader_data = shader->baseShader.backend_data;
+    IWineD3DDeviceImpl *device = shader->baseShader.device;
+    const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
 
     if (!strcmp(priv->addr_reg, src)) return;
 
+    if(gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT) {
+		shader_data->rel_offset = offset & 0xfff0;
+        shader_addline(buffer, "ADD A0_SHADOW.x, A0_SHADOW, %u;\n", offset & 0xfff0);
+    }
+
     strcpy(priv->addr_reg, src);
     shader_addline(buffer, "ARL A0.x, %s;\n", src);
 }
@@ -1035,7 +1044,7 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction
             if (!pshader && reg->rel_addr)
             {
                 const struct arb_vshader_private *shader_data = shader->baseShader.backend_data;
-                UINT rel_offset = shader_data->rel_offset;
+                UINT rel_offset;
                 BOOL aL = FALSE;
                 char rel_reg[50];
                 if (reg_maps->shader_version.major < 2)
@@ -1048,11 +1057,12 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction
                         {
                             aL = TRUE;
                         } else {
-                            shader_arb_request_a0(ins, rel_reg);
+                            shader_arb_request_a0(ins, rel_reg, reg->idx);
                             sprintf(rel_reg, "A0.x");
                         }
                     }
                 }
+                rel_offset = shader_data->rel_offset;
                 if(aL)
                     sprintf(register_name, "C[%u]", ctx->aL + reg->idx);
                 else if (reg->idx >= rel_offset)

