; Copyright 2002 Tematic Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
;     http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
; > $.Source.VduGrafV
;
; ARTHUR OPERATING SYSTEM - Vdu Drivers
; =======================
;
; Vdu driver code - Default GraphicsV claimant
;
; Author K J Bracey
; Date   30.8.02
;

 [ UseGraphicsV

        ASSERT  GraphicsV_VSync = 1
        ASSERT  GraphicsV_SetMode = 2
        ASSERT  GraphicsV_SetInterlace = 3
        ASSERT  GraphicsV_SetBlank = 4
        ASSERT  GraphicsV_UpdatePointer = 5
        ASSERT  GraphicsV_SetDMAAddress = 6
        ASSERT  GraphicsV_VetMode = 7
        ASSERT  GraphicsV_DisplayFeatures = 8
        ASSERT  GraphicsV_WritePaletteEntry = 10
        ASSERT  GraphicsV_WritePaletteEntries = 11
        ASSERT  GraphicsV_Render = 13
        ASSERT  GraphicsV_IICOp = 14


MOSGraphicsV ROUT
        CMP     r4, #(MOSGraphicsV_TableEnd - MOSGraphicsV_Table) / 4
        ADDLS   pc, pc, r4, LSL #2
MOSGraphicsV_Table
        MOV     pc, lr                  ; reason code not known, so pass it on
        MOV     pc, lr                  ; 0
        B       GV_VSync                ; 1
        B       GV_SetMode              ; 2
        B       GV_SetInterlace         ; 3
        B       GV_SetBlank             ; 4
        B       GV_UpdatePointer        ; 5
        B       GV_SetAddress           ; 6
        B       GV_VetMode              ; 7
        B       GV_Features             ; 8
        MOV     pc, lr                  ; 9
        B       GV_WritePaletteEntry    ; 10
        B       GV_WritePaletteEntries  ; 11
        MOV     pc, lr                  ; 12
        B       GV_Render               ; 13
        B       GV_IICOp                ; 14
MOSGraphicsV_TableEnd

GV_VSync        ROUT
 [ {FALSE}
  [ HAL
        Push    "lr"
  ]
        LDR     WsPtr, =OsbyteVars
        MOV     r4, #0
        B       VsyncIRQ_ExtEntry
 |
; Switch to interrupt mode to process this.
        ASSERT  No26bitCode
        LDR     WsPtr, =OsbyteVars
        MRS     r4, CPSR
        Push    "lr"
        MSR     CPSR_c, #I32_bit + IRQ32_mode
        Push    "r4, lr"
     [ HAL
        Push    "pc"
        B       VsyncIRQ_ExtEntry
        NOP
     |
        BL      VsyncIRQ_ExtEntry
     ]
        Pull    "r4, lr"
        MSR     CPSR_c, r4
        MOV     r4, #0
        Pull    "pc"
 ]

GV_SetMode
        Push    "r0-r3, r9, lr"
        mjsAddressHAL WsPtr
        MOV     r4, #0
        mjsCallHAL HAL_Video_SetMode
        Pull    "r0-r3, r9, pc"

GV_SetInterlace
        Push    "r0-r3, r9, lr"
        mjsAddressHAL WsPtr
        MOV     r4, #0
        mjsCallHAL HAL_Video_SetInterlace
        Pull    "r0-r3, r9, pc"

GV_SetBlank
        Push    "r0-r3, r9, lr"
        mjsAddressHAL WsPtr
        MOV     r4, #0
        mjsCallHAL HAL_Video_SetBlank
        Pull    "r0-r3, r9, pc"

GV_UpdatePointer
        Push    "r0-r3, r9, lr"
        mjsAddressHAL WsPtr
        MOV     r4, #0
        mjsCallHAL HAL_Video_UpdatePointer
        Pull    "r0-r3, r9, pc"

GV_SetAddress
        Push    "r0-r3, r9, lr"
        mjsAddressHAL WsPtr
        MOV     r4, #0
        mjsCallHAL HAL_Video_SetDAG
        Pull    "r0-r3, r9, pc"

GV_VetMode
        Push    "r1-r3, r9, lr"
        mjsAddressHAL WsPtr
        MOV     r4, #0
        mjsCallHAL HAL_Video_VetMode
        Pull    "r1-r3, r9, pc"

GV_Features
        Push    "r0,r1,r3, r9, lr"
        mjsAddressHAL WsPtr
        MOV     r4, #0
        mjsCallHAL HAL_Video_Features
        STR     r0, [sp, #0]
        mjsCallHAL HAL_Video_PixelFormats
        STR     r0, [sp, #4]
        mjsCallHAL HAL_Video_BufferAlignment
        MOV     r2, r0
        Pull    "r0,r1,r3, r9, pc"

GV_WritePaletteEntry
        Push    "r0-r3, r9, lr"
        mjsAddressHAL WsPtr
        MOV     r4, #0
        mjsCallHAL HAL_Video_WritePaletteEntry
        Pull    "r0-r3, r9, pc"

GV_WritePaletteEntries
        Push    "r0-r3, r9, lr"
        mjsAddressHAL WsPtr
        MOV     r4, #0
        mjsCallHAL HAL_Video_WritePaletteEntries
        Pull    "r0-r3, r9, pc"

GV_Render
        VDWS    WsPtr
        LDR     WsPtr, [WsPtr, #HALVideoFeatures]
        TST     WsPtr, #1:SHL:4
        MOVEQ   pc, lr
        Push    "r0-r3, r9, lr"
        ORR     r0, r0, #1:SHL:31
        mjsAddressHAL
        mjsCallHAL HAL_Video_Render
        TEQ     r0, #0
        MOVPL   r4, #0
        Pull    "r0-r3, r9, pc"

GV_IICOp
        Push    "r9, lr"
        mjsAddressHAL WsPtr
        MOV     r4, #0
        mjsCallHAL HAL_Video_IICOp
        Pull    "r9, pc"

CallGraphicsV
        Push    "r10,r12,lr"
        MOV     r10, #GraphicsV
        BL      CallVector
        Pull    "r10,r12,pc"

; Corrupts R9-R11
; returns EQ if acceleration valid
CheckAcceleration
        ASSERT  Log2BPP = Log2BPC +4
        ADD     R9, WsPtr, #Log2BPC
        LDMIA   R9, {R9, R10}                   ; R9 = Log2BPC; R10 = Log2BPP
        LDR     R11, [WsPtr, #VduSprite]
        TEQ     R9, R10                         ; BPC must equal BPP
        TEQEQ   R11, #0                         ; Must not be redirected
        MOV     PC, R14

 ] ; UseGraphicsV

        END