; Copyright 1996 Acorn Computers 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.
;
; > $.Kernel.Source.VduModes
;

; general purpose mode macros

; mjs Kernel/HAL split
;
; BigVIDCTable is now in hardware independent format, ie. a VIDC list type 3
;
; Macro VIDC_List10 removed - hardware specific, and very old anyway! (VIDC1 is pre Medusa)
; Macro VIDC_List20 removed - hardware specific, not needed in HAL either
; Macro VIDC_ListT3 newly defined

        MACRO
$label  VIDC_List $lbpp,$hsync,$hbpch,$hlbdr,$hdisp,$hrbdr,$hfpch, $vsync,$vbpch,$vlbdr,$vdisp,$vrbdr,$vfpch,$pixrate,$sp
$label  VIDC_ListT3 $lbpp,$hsync,$hbpch,$hlbdr,$hdisp,$hrbdr,$hfpch, $vsync,$vbpch,$vlbdr,$vdisp,$vrbdr,$vfpch,$pixrate,$sp
        MEND

;
; format of a VIDC list type 3
;
                                ^       4
VIDCList3_PixelDepth            #       4
VIDCList3_HorizSyncWidth        #       4
VIDCList3_HorizBackPorch        #       4
VIDCList3_HorizLeftBorder       #       4
VIDCList3_HorizDisplaySize      #       4
VIDCList3_HorizRightBorder      #       4
VIDCList3_HorizFrontPorch       #       4
VIDCList3_VertiSyncWidth        #       4
VIDCList3_VertiBackPorch        #       4
VIDCList3_VertiTopBorder        #       4
VIDCList3_VertiDisplaySize      #       4
VIDCList3_VertiBottomBorder     #       4
VIDCList3_VertiFrontPorch       #       4
VIDCList3_PixelRate             #       4
VIDCList3_SyncPol               #       4  ; sync polarity/flag bits
VIDCList3_ControlList           #       0  ; possibly empty list of pairs of index,value words
;
; and VIDCList3 is terminated by a -1 word
;
; Indices in VIDCList3_ControlList
;
                                ^       1
ControlList_LCDMode             #       1
ControlList_LCDDualPanelMode    #       1
ControlList_LCDOffset0          #       1
ControlList_LCDOffset1          #       1
ControlList_HiResMode           #       1
ControlList_DACControl          #       1
ControlList_RGBPedestals        #       1
ControlList_ExternalRegister    #       1
ControlList_HClockSelect        #       1
ControlList_RClockFrequency     #       1
ControlList_DPMSState           #       1
ControlList_Interlaced          #       1
ControlList_OutputFormat        #       1
ControlList_InvalidReason       #       0

; bits/flags in VIDCList3_SyncPol word:
;
SyncPol_InvertHSync        *  1
SyncPol_InvertVSync        *  2
SyncPol_InterlaceSpecified *  4   ; if set, interlace bit has been specified, else filled in by kernel
SyncPol_Interlace          *  8   ; set=interlaced, either specified by service call claimant or filled in from *TV by kernel


; Macro VIDC_ListT3 - for hardware independent table (using 'VIDC' list type 3 format, see PRM 5a-125)
;
        MACRO
$label  VIDC_ListT3 $lbpp,$hsync,$hbpch,$hlbdr,$hdisp,$hrbdr,$hfpch, $vsync,$vbpch,$vlbdr,$vdisp,$vrbdr,$vfpch,$pixrate,$sp

$label
        LCLA    sp
        LCLA    dwidth
        GBLA    framerate
        LCLA    framepixels

 [ "$sp"=""
sp      SETA    0                               ; normal sync polarity
 |
        ASSERT $sp<=3
sp      SETA    $sp
 ]

; just to check width is whole number of words (to suit rendering code)
dwidth  SETA    $hdisp :SHL: $lbpp
        ASSERT  (dwidth :AND: 31) = 0

framepixels SETA ($hsync+$hbpch+$hlbdr+$hdisp+$hrbdr+$hfpch)*($vsync+$vbpch+$vlbdr+$vdisp+$vrbdr+$vfpch)
framerate SETA  ($pixrate*1000+framepixels/2)/framepixels

F_$label *      framerate       ; set up frame rate symbol

;
        &       3                ; format (type 3)
        &       $lbpp            ; log2 bits per pixel
; Horizontal (in pixels)
        &       $hsync           ; sync width
        &       $hbpch           ; back porch
        &       $hlbdr           ; left border
        &       $hdisp           ; display size
        &       $hrbdr           ; right border
        &       $hfpch           ; front porch
; Vertical (in rasters)
        &       $vsync           ; sync width
        &       $vbpch           ; back porch
        &       $vlbdr           ; top border
        &       $vdisp           ; display size
        &       $vrbdr           ; bottom border
        &       $vfpch           ; front porch
;
        &       $pixrate         ; pixel rate (kHz)
        &       sp               ; sync polarity
        &       -1               ; terminator (no video control parameters)

        MEND   ; MACRO VIDC_ListT3



NumMonitorTypes *       9
NumModes        *       50
maxmode         *       NumModes-1
minmode         *       0

; These macro are used by various routines in the kernel to check for a valid mode number
; MUST be kept up-to-date with the list of invalid modes between 0 and maxmode

        MACRO
        BranchIfKnownMode $reg, $address
        CMP     $reg, #NumModes
        BCC     $address                ; then branch
        MEND

        MACRO
        BranchIfNotKnownMode $reg, $address
        CMP     $reg, #NumModes
        BCS     $address                ; branch if *NOT* known
        MEND


BigVIDCTable

;
;       monitor type 0, 50Hz TV
;
        &       VLN_0  - BigVIDCTable   ; 0
        &       VLN_1  - BigVIDCTable   ; 1
        &       VLN_2  - BigVIDCTable   ; 2
        &       VLN_3  - BigVIDCTable   ; 3
        &       VLN_4  - BigVIDCTable   ; 4
        &       VLN_5  - BigVIDCTable   ; 5
        &       VLN_6  - BigVIDCTable   ; 6
 [ HiResTTX
        &       -1                      ; 7
 |
        &       VLN_7  - BigVIDCTable   ; 7
 ]
        &       VLN_8  - BigVIDCTable   ; 8
        &       VLN_9  - BigVIDCTable   ; 9
        &       VLN_10 - BigVIDCTable   ; 10
        &       VLN_11 - BigVIDCTable   ; 11
        &       VLN_12 - BigVIDCTable   ; 12
        &       VLN_13 - BigVIDCTable   ; 13
        &       VLN_14 - BigVIDCTable   ; 14
        &       VLN_15 - BigVIDCTable   ; 15
        &       VLN_16 - BigVIDCTable   ; 16
        &       VLN_17 - BigVIDCTable   ; 17
        &       -1                      ; 18
        &       -1                      ; 19
        &       -1                      ; 20
        &       -1                      ; 21
        &       VLN_22 - BigVIDCTable   ; 22
        &       -1                      ; 23
        &       VLN_24 - BigVIDCTable   ; 24
        &       -1                      ; 25
        &       -1                      ; 26
        &       -1                      ; 27
        &       -1                      ; 28
        &       -1                      ; 29
        &       -1                      ; 30
        &       -1                      ; 31
        &       -1                      ; 32
        &       VLN_33 - BigVIDCTable   ; 33
        &       VLN_34 - BigVIDCTable   ; 34
        &       VLN_35 - BigVIDCTable   ; 35
        &       VLN_36 - BigVIDCTable   ; 36
        &       -1                      ; 37
        &       -1                      ; 38
        &       -1                      ; 39
        &       -1                      ; 40
        &       -1                      ; 41
        &       -1                      ; 42
        &       -1                      ; 43
        &       -1                      ; 44
        &       -1                      ; 45
        &       -1                      ; 46
        &       -1                      ; 47
        &       -1                      ; 48
        &       -1                      ; 49

;
;       monitor type 1, multiscan
;
        ASSERT  (.-BigVIDCTable)=((NumModes*1):SHL:2)

        &       VLM_0  - BigVIDCTable   ; 0
        &       VLM_1  - BigVIDCTable   ; 1
        &       VLM_2  - BigVIDCTable   ; 2
        &       VLM_3  - BigVIDCTable   ; 3
        &       VLM_4  - BigVIDCTable   ; 4
        &       VLM_5  - BigVIDCTable   ; 5
        &       VLM_6  - BigVIDCTable   ; 6
        &       VLM_7  - BigVIDCTable   ; 7
        &       VLM_8  - BigVIDCTable   ; 8
        &       VLM_9  - BigVIDCTable   ; 9
        &       VLM_10 - BigVIDCTable   ; 10
        &       VLM_11 - BigVIDCTable   ; 11
        &       VLM_12 - BigVIDCTable   ; 12
        &       VLM_13 - BigVIDCTable   ; 13
        &       VLM_14 - BigVIDCTable   ; 14
        &       VLM_15 - BigVIDCTable   ; 15
        &       VLM_16 - BigVIDCTable   ; 16
        &       VLM_17 - BigVIDCTable   ; 17
        &       VLM_18 - BigVIDCTable   ; 18
        &       VLM_19 - BigVIDCTable   ; 19
        &       VLM_20 - BigVIDCTable   ; 20
        &       VLM_21 - BigVIDCTable   ; 21
        &       VLM_22 - BigVIDCTable   ; 22
        &       -1                      ; 23
        &       VLM_24 - BigVIDCTable   ; 24
        &       VLM_25 - BigVIDCTable   ; 25
        &       VLM_26 - BigVIDCTable   ; 26
        &       VLM_27 - BigVIDCTable   ; 27
        &       VLM_28 - BigVIDCTable   ; 28
        &       VLM_29 - BigVIDCTable   ; 29
        &       VLM_30 - BigVIDCTable   ; 30
        &       VLM_31 - BigVIDCTable   ; 31
        &       VLM_32 - BigVIDCTable   ; 32
        &       VLM_33 - BigVIDCTable   ; 33 Ovscn
        &       VLM_34 - BigVIDCTable   ; 34
        &       VLM_35 - BigVIDCTable   ; 35
        &       VLM_36 - BigVIDCTable   ; 36
        &       VLM_37 - BigVIDCTable   ; 37 dtp
        &       VLM_38 - BigVIDCTable   ; 38
        &       VLM_39 - BigVIDCTable   ; 39
        &       VLM_40 - BigVIDCTable   ; 40
        &       VLM_41 - BigVIDCTable   ; 41 EGA
        &       VLM_42 - BigVIDCTable   ; 42
        &       VLM_43 - BigVIDCTable   ; 43
        &       VLM_44 - BigVIDCTable   ; 44 CGA
        &       VLM_45 - BigVIDCTable   ; 45
        &       VLM_46 - BigVIDCTable   ; 46
        &       VLM_47 - BigVIDCTable   ; 47 PCSoft
        &       VLM_48 - BigVIDCTable   ; 48 Games mode
        &       VLM_49 - BigVIDCTable   ; 49 Games mode


;
;       monitor type 2, HiRes
;
        ASSERT  (.-BigVIDCTable)=((NumModes*2):SHL:2)

        &       -1                      ; 0
        &       -1                      ; 1
        &       -1                      ; 2
        &       -1                      ; 3
        &       -1                      ; 4
        &       -1                      ; 5
        &       -1                      ; 6
        &       -1                      ; 7
        &       -1                      ; 8
        &       -1                      ; 9
        &       -1                      ; 10
        &       -1                      ; 11
        &       -1                      ; 12
        &       -1                      ; 13
        &       -1                      ; 14
        &       -1                      ; 15
        &       -1                      ; 16
        &       -1                      ; 17
        &       -1                      ; 18
        &       -1                      ; 19
        &       -1                      ; 20
        &       -1                      ; 21
        &       -1                      ; 22
        &       VLH_23 - BigVIDCTable   ; 23
        &       -1                      ; 24
        &       -1                      ; 25
        &       -1                      ; 26
        &       -1                      ; 27
        &       -1                      ; 28
        &       -1                      ; 29
        &       -1                      ; 30
        &       -1                      ; 31
        &       -1                      ; 32
        &       -1                      ; 33
        &       -1                      ; 34
        &       -1                      ; 35
        &       -1                      ; 36
        &       -1                      ; 37
        &       -1                      ; 38
        &       -1                      ; 39
        &       -1                      ; 40
        &       -1                      ; 41
        &       -1                      ; 42
        &       -1                      ; 43
        &       -1                      ; 44
        &       -1                      ; 45
        &       -1                      ; 46
        &       -1                      ; 47
        &       -1                      ; 48
        &       -1                      ; 49

;
;       monitor type 3, VGA
;
        ASSERT  (.-BigVIDCTable)=((NumModes*3):SHL:2)

        &       VgaX_0  - BigVIDCTable  ; 0
        &       VgaX_1  - BigVIDCTable  ; 1
        &       VgaX_2  - BigVIDCTable  ; 2
        &       VgaX_3  - BigVIDCTable  ; 3
        &       VgaX_4  - BigVIDCTable  ; 4
        &       VgaX_5  - BigVIDCTable  ; 5
        &       VgaX_6  - BigVIDCTable  ; 6
        &       VgaX_7  - BigVIDCTable  ; 7
        &       VgaX_8  - BigVIDCTable  ; 8
        &       VgaX_9  - BigVIDCTable  ; 9
        &       VgaX_10 - BigVIDCTable  ; 10
        &       VgaX_11 - BigVIDCTable  ; 11
        &       VgaX_12 - BigVIDCTable  ; 12
        &       VgaX_13 - BigVIDCTable  ; 13
        &       VgaX_14 - BigVIDCTable  ; 14
        &       VgaX_15 - BigVIDCTable  ; 15
        &       -1                      ; 16
        &       -1                      ; 17
        &       -1                      ; 18
        &       -1                      ; 19
        &       -1                      ; 20
        &       -1                      ; 21
        &       -1                      ; 22
        &       -1                      ; 23
        &       -1                      ; 24
        &       VLM_25 - BigVIDCTable   ; 25
        &       VLM_26 - BigVIDCTable   ; 26
        &       VLM_27 - BigVIDCTable   ; 27
        &       VLM_28 - BigVIDCTable   ; 28
        &       -1                      ; 29
        &       -1                      ; 30
        &       -1                      ; 31
        &       -1                      ; 32
        &       -1                      ; 33
        &       -1                      ; 34
        &       -1                      ; 35
        &       -1                      ; 36
        &       -1                      ; 37
        &       -1                      ; 38
        &       -1                      ; 39
        &       -1                      ; 40
        &      VgaX_41 - BigVIDCTable   ; 41 EGA
        &      VgaX_42 - BigVIDCTable   ; 42
        &      VgaX_43 - BigVIDCTable   ; 43
        &      VgaX_44 - BigVIDCTable   ; 44 CGA
        &      VgaX_45 - BigVIDCTable   ; 45
        &      VgaX_46 - BigVIDCTable   ; 46
        &       VLM_47 - BigVIDCTable   ; 47 PCSoft
        &       VLM_48 - BigVIDCTable   ; 48 Games mode
        &       VLM_49 - BigVIDCTable   ; 49 Games mode

;
;       monitor type 4, SVGA
;
        ASSERT  (.-BigVIDCTable)=((NumModes*4):SHL:2)

        &       VgaX_0  - BigVIDCTable  ; 0
        &       VgaX_1  - BigVIDCTable  ; 1
        &       VgaX_2  - BigVIDCTable  ; 2
        &       VgaX_3  - BigVIDCTable  ; 3
        &       VgaX_4  - BigVIDCTable  ; 4
        &       VgaX_5  - BigVIDCTable  ; 5
        &       VgaX_6  - BigVIDCTable  ; 6
        &       VgaX_7  - BigVIDCTable  ; 7
        &       VgaX_8  - BigVIDCTable  ; 8
        &       VgaX_9  - BigVIDCTable  ; 9
        &       VgaX_10 - BigVIDCTable  ; 10
        &       VgaX_11 - BigVIDCTable  ; 11
        &       VgaX_12 - BigVIDCTable  ; 12
        &       VgaX_13 - BigVIDCTable  ; 13
        &       VgaX_14 - BigVIDCTable  ; 14
        &       VgaX_15 - BigVIDCTable  ; 15
        &       -1                      ; 16
        &       -1                      ; 17
        &       -1                      ; 18
        &       -1                      ; 19
        &       -1                      ; 20
        &       -1                      ; 21
        &       -1                      ; 22
        &       -1                      ; 23
        &       -1                      ; 24
        &       VLM_25 - BigVIDCTable   ; 25
        &       VLM_26 - BigVIDCTable   ; 26
        &       VLM_27 - BigVIDCTable   ; 27
        &       VLM_28 - BigVIDCTable   ; 28
        &       VLM_29 - BigVIDCTable   ; 29
        &       VLM_30 - BigVIDCTable   ; 30
        &       VLM_31 - BigVIDCTable   ; 31
        &       VLM_32 - BigVIDCTable   ; 32
        &       -1                      ; 33
        &       -1                      ; 34
        &       -1                      ; 35
        &       -1                      ; 36
        &       -1                      ; 37
        &       -1                      ; 38
        &       -1                      ; 39
        &       -1                      ; 40
        &      VgaX_41 - BigVIDCTable   ; 41 EGA
        &      VgaX_42 - BigVIDCTable   ; 42
        &      VgaX_43 - BigVIDCTable   ; 43
        &      VgaX_44 - BigVIDCTable   ; 44 CGA
        &      VgaX_45 - BigVIDCTable   ; 45
        &      VgaX_46 - BigVIDCTable   ; 46
        &       VLM_47 - BigVIDCTable   ; 47 PCSoft
        &       VLM_48 - BigVIDCTable   ; 48 Games mode
        &       VLM_49 - BigVIDCTable   ; 49 Games mode

;
;       monitor type 5, LCD
;
        ASSERT  (.-BigVIDCTable)=((NumModes*5):SHL:2)

        &       -1                      ; 0
        &       -1                      ; 1
        &       -1                      ; 2
        &       -1                      ; 3
        &       -1                      ; 4
        &       -1                      ; 5
        &       -1                      ; 6
        &       -1                      ; 7
        &       -1                      ; 8
        &       -1                      ; 9
        &       -1                      ; 10
        &       -1                      ; 11
        &       -1                      ; 12
        &       -1                      ; 13
        &       -1                      ; 14
        &       -1                      ; 15
        &       -1                      ; 16
        &       -1                      ; 17
        &       -1                      ; 18
        &       -1                      ; 19
        &       -1                      ; 20
        &       -1                      ; 21
        &       -1                      ; 22
        &       -1                      ; 23
        &       -1                      ; 24
        &       LCD_25 - BigVIDCTable   ; 25
        &       LCD_26 - BigVIDCTable   ; 26
        &       LCD_27 - BigVIDCTable   ; 27
        &       LCD_28 - BigVIDCTable   ; 28
        &       -1                      ; 29
        &       -1                      ; 30
        &       -1                      ; 31
        &       -1                      ; 32
        &       -1                      ; 33
        &       -1                      ; 34
        &       -1                      ; 35
        &       -1                      ; 36
        &       -1                      ; 37
        &       -1                      ; 38
        &       -1                      ; 39
        &       -1                      ; 40
        &       -1                      ; 41
        &       -1                      ; 42
        &       -1                      ; 43
        &       -1                      ; 44
        &       -1                      ; 45
        &       -1                      ; 46
        &       -1                      ; 47
        &       -1                      ; 48
        &       -1                      ; 49

;
;       monitor type 6, reserved?
;
        ASSERT  (.-BigVIDCTable)=((NumModes*6):SHL:2)

        &       -1                      ; 0
        &       -1                      ; 1
        &       -1                      ; 2
        &       -1                      ; 3
        &       -1                      ; 4
        &       -1                      ; 5
        &       -1                      ; 6
        &       -1                      ; 7
        &       -1                      ; 8
        &       -1                      ; 9
        &       -1                      ; 10
        &       -1                      ; 11
        &       -1                      ; 12
        &       -1                      ; 13
        &       -1                      ; 14
        &       -1                      ; 15
        &       -1                      ; 16
        &       -1                      ; 17
        &       -1                      ; 18
        &       -1                      ; 19
        &       -1                      ; 20
        &       -1                      ; 21
        &       -1                      ; 22
        &       -1                      ; 23
        &       -1                      ; 24
        &       -1                      ; 25
        &       -1                      ; 26
        &       -1                      ; 27
        &       -1                      ; 28
        &       -1                      ; 29
        &       -1                      ; 30
        &       -1                      ; 31
        &       -1                      ; 32
        &       -1                      ; 33
        &       -1                      ; 34
        &       -1                      ; 35
        &       -1                      ; 36
        &       -1                      ; 37
        &       -1                      ; 38
        &       -1                      ; 39
        &       -1                      ; 40
        &       -1                      ; 41
        &       -1                      ; 42
        &       -1                      ; 43
        &       -1                      ; 44
        &       -1                      ; 45
        &       -1                      ; 46
        &       -1                      ; 47
        &       -1                      ; 48
        &       -1                      ; 49

;
;       monitor type 7, file
;
        ASSERT  (.-BigVIDCTable)=((NumModes*7):SHL:2)

        &       -1                      ; 0
        &       -1                      ; 1
        &       -1                      ; 2
        &       -1                      ; 3
        &       -1                      ; 4
        &       -1                      ; 5
        &       -1                      ; 6
        &       -1                      ; 7
        &       -1                      ; 8
        &       -1                      ; 9
        &       -1                      ; 10
        &       -1                      ; 11
        &       -1                      ; 12
        &       -1                      ; 13
        &       -1                      ; 14
        &       -1                      ; 15
        &       -1                      ; 16
        &       -1                      ; 17
        &       -1                      ; 18
        &       -1                      ; 19
        &       -1                      ; 20
        &       -1                      ; 21
        &       -1                      ; 22
        &       -1                      ; 23
        &       -1                      ; 24
        &       -1                      ; 25
        &       -1                      ; 26
        &       -1                      ; 27
        &       -1                      ; 28
        &       -1                      ; 29
        &       -1                      ; 30
        &       -1                      ; 31
        &       -1                      ; 32
        &       -1                      ; 33
        &       -1                      ; 34
        &       -1                      ; 35
        &       -1                      ; 36
        &       -1                      ; 37
        &       -1                      ; 38
        &       -1                      ; 39
        &       -1                      ; 40
        &       -1                      ; 41
        &       -1                      ; 42
        &       -1                      ; 43
        &       -1                      ; 44
        &       -1                      ; 45
        &       -1                      ; 46
        &       -1                      ; 47
        &       -1                      ; 48
        &       -1                      ; 49

;
;       monitor type 8, 60Hz TV
;
        ASSERT  (.-BigVIDCTable)=((NumModes*8):SHL:2)

        &       -1                      ; 0
        &       -1                      ; 1
        &       -1                      ; 2
        &       -1                      ; 3
        &       -1                      ; 4
        &       -1                      ; 5
        &       -1                      ; 6
        &       -1                      ; 7
        &       -1                      ; 8
        &       -1                      ; 9
        &       -1                      ; 10
        &       -1                      ; 11
        &       -1                      ; 12
        &       -1                      ; 13
        &       -1                      ; 14
        &       -1                      ; 15
        &       -1                      ; 16
        &       -1                      ; 17
        &       -1                      ; 18
        &       -1                      ; 19
        &       -1                      ; 20
        &       -1                      ; 21
        &       -1                      ; 22
        &       -1                      ; 23
        &       -1                      ; 24
        &       -1                      ; 25
        &       -1                      ; 26
        &       -1                      ; 27
        &       -1                      ; 28
        &       -1                      ; 29
        &       -1                      ; 30
        &       -1                      ; 31
        &       -1                      ; 32
        &       -1                      ; 33
        &       -1                      ; 34
        &       -1                      ; 35
        &       -1                      ; 36
        &       -1                      ; 37
        &       -1                      ; 38
        &       -1                      ; 39
        &       -1                      ; 40
        &       -1                      ; 41
        &       -1                      ; 42
        &       -1                      ; 43
        &       VLM_44 - BigVIDCTable   ; 44 CGA
        &       VLM_45 - BigVIDCTable   ; 45
        &       VLM_46 - BigVIDCTable   ; 46
        &       -1                      ; 47
        &       -1                      ; 48
        &       -1                      ; 49

        ASSERT  (.-BigVIDCTable)=((NumModes*NumMonitorTypes):SHL:2)

VLN_0   VIDC_List 0, 76, 88, 96, 640, 96, 28, 3,19,16,256,16, 2,16000,0         ; MODE 0
VLN_1   VIDC_List 1, 38, 44, 48, 320, 48, 14, 3,19,16,256,16, 2, 8000,0         ; MODE 1
VLN_2   VIDC_List 2, 38, 44, 48, 320, 48, 14, 3,19,16,256,16, 2, 8000,0         ; MODE 2
VLN_3   VIDC_List 1, 76, 88, 96, 640, 96, 28, 3,19,19,250,19, 2,16000,0         ; MODE 3
VLN_4   VIDC_List 0, 76, 88, 96, 640, 96, 28, 3,19,16,256,16, 2,16000,0         ; MODE 4
VLN_5   VIDC_List 1, 38, 44, 48, 320, 48, 14, 3,19,16,256,16, 2, 8000,0         ; MODE 5
VLN_6   VIDC_List 1, 38, 44, 48, 320, 48, 14, 3,19,19,250,19, 2, 8000,0         ; MODE 6
 [ :LNOT: HiResTTX
VLN_7   VIDC_List 2, 38, 44, 48, 320, 48, 14, 3,19,19,250,19, 2, 8000,0         ; MODE 7
 ]
VLN_8   VIDC_List 1, 76, 88, 96, 640, 96, 28, 3,19,16,256,16, 2,16000,0         ; MODE 8
VLN_9   VIDC_List 2, 38, 44, 48, 320, 48, 14, 3,19,16,256,16, 2, 8000,0         ; MODE 9
VLN_10  VIDC_List 3, 38, 44, 48, 320, 48, 14, 3,19,16,256,16, 2, 8000,0         ; MODE 10
VLN_11  VIDC_List 1, 76, 88, 96, 640, 96, 28, 3,19,19,250,19, 2,16000,0         ; MODE 11
VLN_12  VIDC_List 2, 76, 88, 96, 640, 96, 28, 3,19,16,256,16, 2,16000,0         ; MODE 12
VLN_13  VIDC_List 3, 38, 44, 48, 320, 48, 14, 3,19,16,256,16, 2, 8000,0         ; MODE 13
VLN_14  VIDC_List 2, 76, 88, 96, 640, 96, 28, 3,19,19,250,19, 2,16000,0         ; MODE 14
VLN_15  VIDC_List 3, 76, 88, 96, 640, 96, 28, 3,19,16,256,16, 2,16000,0         ; MODE 15
VLN_16  VIDC_List 2,114,132, 96,1056, 96, 42, 3,19,16,256,16, 2,24000,0         ; MODE 16
VLN_17  VIDC_List 2,114,132, 96,1056, 96, 42, 3,19,19,250,19, 2,24000,0         ; MODE 17
VLN_22  VIDC_List 2, 76,120,  0, 768,  0, 60, 3,19, 0,288, 0, 2,16000,0         ; MODE 22
VLN_24  VIDC_List 3,114,132, 96,1056, 96, 42, 3,19,16,256,16, 2,24000,0         ; MODE 24
VLN_33  VIDC_List 0, 76,120,  0, 768,  0, 60, 3,19, 0,288, 0, 2,16000,0         ; MODE 33
VLN_34  VIDC_List 1, 76,120,  0, 768,  0, 60, 3,19, 0,288, 0, 2,16000,0         ; MODE 34
VLN_35  VIDC_List 2, 76,120,  0, 768,  0, 60, 3,19, 0,288, 0, 2,16000,0         ; MODE 35
VLN_36  VIDC_List 3, 76,120,  0, 768,  0, 60, 3,19, 0,288, 0, 2,16000,0         ; MODE 36

VLM_0   VIDC_List 0, 72, 62, 88, 640, 88, 74, 3,16,17,256,17, 3,16000,0         ; MODE 0
VLM_1   VIDC_List 1, 36, 30, 44, 320, 44, 38, 3,16,17,256,17, 3, 8000,0         ; MODE 1
VLM_2   VIDC_List 2, 36, 30, 44, 320, 44, 38, 3,16,17,256,17, 3, 8000,0         ; MODE 2
VLM_3   VIDC_List 1, 72, 62, 88, 640, 88, 74, 3,16,20,250,20, 3,16000,0         ; MODE 3
VLM_4   VIDC_List 0, 72, 62, 88, 640, 88, 74, 3,16,17,256,17, 3,16000,0         ; MODE 4
VLM_5   VIDC_List 1, 36, 30, 44, 320, 44, 38, 3,16,17,256,17, 3, 8000,0         ; MODE 5
VLM_6   VIDC_List 1, 36, 30, 44, 320, 44, 38, 3,16,20,250,20, 3, 8000,0         ; MODE 6
 [ TTX256
 ASSERT HiResTTX
VLM_7   VIDC_List 3, 56,112,  0, 640,  0, 88, 3,18, 6,500, 6, 1,24000,0         ; MODE 7
 |
 [ HiResTTX
VLM_7   VIDC_List 2, 56,112,  0, 640,  0, 88, 3,18, 6,500, 6, 1,24000,0         ; MODE 7
 |
VLM_7   VIDC_List 2, 36, 30, 44, 320, 44, 38, 3,16,20,250,20, 3, 8000,0         ; MODE 7
 ]
 ]
VLM_8   VIDC_List 1, 72, 62, 88, 640, 88, 74, 3,16,17,256,17, 3,16000,0         ; MODE 8
VLM_9   VIDC_List 2, 36, 30, 44, 320, 44, 38, 3,16,17,256,17, 3, 8000,0         ; MODE 9
VLM_10  VIDC_List 3, 36, 30, 44, 320, 44, 38, 3,16,17,256,17, 3, 8000,0         ; MODE 10
VLM_11  VIDC_List 1, 72, 62, 88, 640, 88, 74, 3,16,20,250,20, 3,16000,0         ; MODE 11
VLM_12  VIDC_List 2, 72, 62, 88, 640, 88, 74, 3,16,17,256,17, 3,16000,0         ; MODE 12
VLM_13  VIDC_List 3, 36, 30, 44, 320, 44, 38, 3,16,17,256,17, 3, 8000,0         ; MODE 13
VLM_14  VIDC_List 2, 72, 62, 88, 640, 88, 74, 3,16,20,250,20, 3,16000,0         ; MODE 14
VLM_15  VIDC_List 3, 72, 62, 88, 640, 88, 74, 3,16,17,256,17, 3,16000,0         ; MODE 15
VLM_16  VIDC_List 2,108, 72,106,1056,106, 88, 3,16,17,256,17, 3,24000,0         ; MODE 16
VLM_17  VIDC_List 2,108, 72,106,1056,106, 88, 3,16,20,250,20, 3,24000,0         ; MODE 17
VLM_18  VIDC_List 0, 56,112,  0, 640,  0, 88, 3,18, 0,512, 0, 1,24000,0         ; MODE 18
VLM_19  VIDC_List 1, 56,112,  0, 640,  0, 88, 3,18, 0,512, 0, 1,24000,0         ; MODE 19
VLM_20  VIDC_List 2, 56,112,  0, 640,  0, 88, 3,18, 0,512, 0, 1,24000,0         ; MODE 20
VLM_21  VIDC_List 3, 56,112,  0, 640,  0, 88, 3,18, 0,512, 0, 1,24000,0         ; MODE 21
VLM_22  VIDC_List 2, 76, 82,  0, 768,  0, 98, 3,19, 0,288, 0, 2,16000,0         ; MODE 22
VLM_24  VIDC_List 3,108, 72,106,1056,106, 88, 3,16,17,256,17, 3,24000,0         ; MODE 24
VLM_25  VIDC_List 0, 96, 46,  0, 640,  0, 18, 2,32, 0,480, 0,11,25175,3         ; MODE 25
VLM_26  VIDC_List 1, 96, 46,  0, 640,  0, 18, 2,32, 0,480, 0,11,25175,3         ; MODE 26
VLM_27  VIDC_List 2, 96, 46,  0, 640,  0, 18, 2,32, 0,480, 0,11,25175,3         ; MODE 27
VLM_28  VIDC_List 3, 96, 46,  0, 640,  0, 18, 2,32, 0,480, 0,11,25175,3         ; MODE 28
VLM_29  VIDC_List 0, 72,128,  0, 800,  0, 24, 2,22, 0,600, 0, 1,36000,0         ; MODE 29
VLM_30  VIDC_List 1, 72,128,  0, 800,  0, 24, 2,22, 0,600, 0, 1,36000,0         ; MODE 30
VLM_31  VIDC_List 2, 72,128,  0, 800,  0, 24, 2,22, 0,600, 0, 1,36000,0         ; MODE 31

VLM_33  VIDC_List 0, 76,82,  0, 768,  0, 98, 3,19, 0,288, 0, 2,16000,0         ; MODE 33
VLM_34  VIDC_List 1, 76,82,  0, 768,  0, 98, 3,19, 0,288, 0, 2,16000,0         ; MODE 34
VLM_35  VIDC_List 2, 76,82,  0, 768,  0, 98, 3,19, 0,288, 0, 2,16000,0         ; MODE 35
VLM_36  VIDC_List 3, 76,82,  0, 768,  0, 98, 3,19, 0,288, 0, 2,16000,0         ; MODE 36

VLM_37  VIDC_List 0,118, 58,  0, 896,  0, 28, 3, 9, 0,352, 0, 0,24000,2         ; DTP 896x352
VLM_38  VIDC_List 1,118, 58,  0, 896,  0, 28, 3, 9, 0,352, 0, 0,24000,2         ; EGA std
VLM_39  VIDC_List 2,118, 58,  0, 896,  0, 28, 3, 9, 0,352, 0, 0,24000,2
VLM_40  VIDC_List 3,118, 58,  0, 896,  0, 28, 3, 9, 0,352, 0, 0,24000,2

VLM_41  VIDC_List 0, 76, 36,  0, 640,  0, 16, 3, 9, 0,352, 0, 0,16783,2         ; EGA
VLM_42  VIDC_List 1, 76, 36,  0, 640,  0, 16, 3, 9, 0,352, 0, 0,16783,2
VLM_43  VIDC_List 2, 76, 36,  0, 640,  0, 16, 3, 9, 0,352, 0, 0,16783,2

VLM_44  VIDC_List 0, 72,162,  0, 640,  0,146, 3,34, 0,200, 0,25,16000,0         ; CGA
VLM_45  VIDC_List 1, 72,162,  0, 640,  0,146, 3,34, 0,200, 0,25,16000,0
VLM_46  VIDC_List 2, 72,162,  0, 640,  0,146, 3,34, 0,200, 0,25,16000,0

VLM_47  VIDC_List 3, 64, 62,  0, 360,  0, 46, 2,32, 0,480, 0,11,16783,3         ; PC Soft

VLM_48  VIDC_List 2, 48, 22,  0, 320,  0, 10, 2,32, 0,480, 0,11,12587,3         ; Games mode
VLM_49  VIDC_List 3, 48, 22,  0, 320,  0, 10, 2,32, 0,480, 0,11,12587,3         ; Games mode

; New modes for VIDC20

VLM_32  VIDC_List 3, 72,128,  0, 800,  0, 24, 2,22, 0,600, 0, 1,36000,0         ; MODE 32 (800 x 600 x 8bpp)


VLH_23  VIDC_List 2, 52, 46,  2, 288,  2,  2, 3,43, 4,896, 4, 0,24000,0         ; MODE 23

VgaX_0   VIDC_List 0, 96, 46,  0, 640,  0,18, 2,106,0,256, 0,85,25175,2         ; TV modes in VGA_350)
VgaX_1   VIDC_List 1, 48, 22,  0, 320,  0,10, 2,106,0,256, 0,85,12587,2
VgaX_2   VIDC_List 2, 48, 22,  0, 320,  0,10, 2,106,0,256, 0,85,12587,2
VgaX_3   VIDC_List 1, 96, 46,  0, 640,  0,18, 2,109,0,250, 0,88,25175,2
VgaX_4   VIDC_List 0, 96, 46,  0, 640,  0,18, 2,106,0,256, 0,85,25175,2
VgaX_5   VIDC_List 1, 48, 22,  0, 320,  0,10, 2,106,0,256, 0,85,12587,2
VgaX_6   VIDC_List 1, 48, 22,  0, 320,  0,10, 2,109,0,250, 0,88,12587,2
VgaX_7   VIDC_List 2, 48, 22,  0, 320,  0,10, 2,109,0,250, 0,88,12587,2
VgaX_8   VIDC_List 1, 96, 46,  0, 640,  0,18, 2,106,0,256, 0,85,25175,2
VgaX_9   VIDC_List 2, 48, 22,  0, 320,  0,10, 2,106,0,256, 0,85,12587,2
VgaX_10  VIDC_List 3, 48, 22,  0, 320,  0,10, 2,106,0,256, 0,85,12587,2
VgaX_11  VIDC_List 1, 96, 46,  0, 640,  0,18, 2,109,0,250, 0,88,25175,2
VgaX_12  VIDC_List 2, 96, 46,  0, 640,  0,18, 2,106,0,256, 0,85,25175,2
VgaX_13  VIDC_List 3, 48, 22,  0, 320,  0,10, 2,106,0,256, 0,85,12587,2
VgaX_14  VIDC_List 2, 96, 46,  0, 640,  0,18, 2,109,0,250, 0,88,25175,2
VgaX_15  VIDC_List 3, 96, 46,  0, 640,  0,18, 2,106,0,256, 0,85,25175,2

VgaX_41  VIDC_List 0, 96, 46,  0, 640,  0,18, 2,58, 0,352, 0,37,25175,2         ; EGA
VgaX_42  VIDC_List 1, 96, 46,  0, 640,  0,18, 2,58, 0,352, 0,37,25175,2
VgaX_43  VIDC_List 2, 96, 46,  0, 640,  0,18, 2,58, 0,352, 0,37,25175,2

VgaX_44  VIDC_List 0, 96, 46,  0, 640,  0,18,2,134, 0,200,0,113,25175,2         ; CGA
VgaX_45  VIDC_List 1, 96, 46,  0, 640,  0,18,2,134, 0,200,0,113,25175,2
VgaX_46  VIDC_List 2, 96, 46,  0, 640,  0,18,2,134, 0,200,0,113,25175,2

LCD_25   VIDC_List 0,  8, 32,  0, 640,  0,16,1,  0, 0,480,0,  0,27000,0
LCD_26   VIDC_List 1,  8, 32,  0, 640,  0,16,1,  0, 0,480,0,  0,27000,0
LCD_27   VIDC_List 2,  8, 32,  0, 640,  0,16,1,  0, 0,480,0,  0,27000,0
LCD_28   VIDC_List 3,  8, 32,  0, 640,  0,16,1,  0, 0,480,0,  0,27000,0

 [ ModeSelectors

; Table of ideal frame rate for each numbered mode, to put in dummy mode selector
; if numbered mode number is not directly available on this monitortype


FrameRateTable
 [ HiResTTX
        =       F_VLN_0, F_VLN_1, F_VLN_2, F_VLN_3, F_VLN_4, F_VLN_5, F_VLN_6, F_VLM_7
 |
        =       F_VLN_0, F_VLN_1, F_VLN_2, F_VLN_3, F_VLN_4, F_VLN_5, F_VLN_6, F_VLN_7
 ]
        =       F_VLN_8, F_VLN_9, F_VLN_10, F_VLN_11, F_VLN_12, F_VLN_13, F_VLN_14, F_VLN_15
        =       F_VLN_16, F_VLN_17, F_VLM_18, F_VLM_19, F_VLM_20, F_VLM_21, F_VLN_22, F_VLH_23
        =       F_VLN_24, F_VLM_25, F_VLM_26, F_VLM_27, F_VLM_28, F_VLM_29, F_VLM_30, F_VLM_31
        =       F_VLM_32, F_VLN_33, F_VLN_34, F_VLN_35, F_VLN_36, F_VLM_37, F_VLM_38, F_VLM_39
        =       F_VLM_40, F_VLM_41, F_VLM_42, F_VLM_43, F_VLM_44, F_VLM_45, F_VLM_46, F_VLM_47
        =       F_VLM_48, F_VLM_49
        ASSERT  . - FrameRateTable = NumModes
        ALIGN

 ]

Vwstab
 & VW_0  - Vwstab      ; MODE  0
 & VW_1  - Vwstab      ; MODE  1
 & VW_2  - Vwstab      ; MODE  2
 & VW_3  - Vwstab      ; MODE  3
 & VW_4  - Vwstab      ; MODE  4
 & VW_5  - Vwstab      ; MODE  5
 & VW_6  - Vwstab      ; MODE  6
 & VW_7  - Vwstab      ; MODE  7
 & VW_8  - Vwstab      ; MODE  8
 & VW_9  - Vwstab      ; MODE  9
 & VW_10 - Vwstab      ; MODE  10
 & VW_11 - Vwstab      ; MODE  11
 & VW_12 - Vwstab      ; MODE  12
 & VW_13 - Vwstab      ; MODE  13
 & VW_14 - Vwstab      ; MODE  14
 & VW_15 - Vwstab      ; MODE  15
 & VW_16 - Vwstab      ; MODE  16
 & VW_17 - Vwstab      ; MODE  17
 & VW_18 - Vwstab      ; MODE  18
 & VW_19 - Vwstab      ; MODE  19
 & VW_20 - Vwstab      ; MODE  20
 & VW_21 - Vwstab      ; MODE  21
 & VW_22 - Vwstab      ; MODE  22 (new mode for visually handicapped)
 & VW_23 - Vwstab      ; MODE  23
 & VW_24 - Vwstab      ; MODE  24
 & VW_25 - Vwstab      ; MODE  25
 & VW_26 - Vwstab      ; MODE  26
 & VW_27 - Vwstab      ; MODE  27
 & VW_28 - Vwstab      ; MODE  28
 & VW_29 - Vwstab      ; MODE  29 exp
 & VW_30 - Vwstab      ; MODE  30 exp
 & VW_31 - Vwstab      ; MODE  31
 & VW_32 - Vwstab      ; MODE  32
 & VW_33 - Vwstab      ; MODE  33
 & VW_34 - Vwstab      ; MODE  34
 & VW_35 - Vwstab      ; MODE  35
 & VW_36 - Vwstab      ; MODE  36
 & VW_37 - Vwstab      ; MODE  37
 & VW_38 - Vwstab      ; MODE  38
 & VW_39 - Vwstab      ; MODE  39
 & VW_40 - Vwstab      ; MODE  40
 & VW_41 - Vwstab      ; MODE  41
 & VW_42 - Vwstab      ; MODE  42
 & VW_43 - Vwstab      ; MODE  43
 & VW_44 - Vwstab      ; MODE  44
 & VW_45 - Vwstab      ; MODE  45
 & VW_46 - Vwstab      ; MODE  46
 & VW_47 - Vwstab      ; MODE  47
 & VW_48 - Vwstab      ; MODE  48
 & VW_49 - Vwstab      ; MODE  49

; To change the order of mode variables, change the following:-
;  a)   The order of the 'wk' labels below
;  b)   The order of the output variables in macro VWSTAB below
;  c)   The order of the variables in '$.Hdr.Workspace' and '$.Hdr.NewSpace'

        ^ 0
wkstart         # 0
wkScreenSize    # 4
wkXWindLimit    # 4
wkYWindLimit    # 4
wkLineLength    # 4
wkNColour       # 4             ; DDV; defined to be a word (17-Sep-92)
wkmiddle        # 0
wkYShftFactor   # 4
wkModeFlags     # 4
wkXEigFactor    # 4
wkYEigFactor    # 4
wkLog2BPC       # 4
wkLog2BPP       # 4
wkECFIndex      # 4
wkmidend        # 0
wkScrRCol       # 4
wkScrBRow       # 4
wkdispstart     # 0
wkPalIndex      # 4
wkend           # 0
wksize * wkend-wkstart
wkwordsize * (wksize + 3) :AND: :NOT: 3
wklim * wksize-(wkmiddle-wkstart)

;VIDC list type 3 size (hardware independent video controller list)
;
VIDCList3Size * (64 + 16*8 + 4) ; primary params, up to 16 video control params, terminator

PushedInfoSize * wkwordsize + VIDCList3Size

M22S * 1280*976/8  ;  screen size
M23S * 1152*896/8
M25S *  640*480/8
M31S *  800*600/8
M37S *  896*352/8
M41S *  640*352/8
M44S *  640*200/8
M47S *  360*480/8

        MACRO
$label  VWSTAB1 $BaseMode, $ScreenSize,$LineLength,$XWindLimit,$YWindLimit,$YShftFactor,    $XEigFactor,$YEigFactor,$NColour,$ScrRCol,$ScrBRow,$Log2BPC,$Log2BPP,$PalIndex, $ECFIndex,$ModeFlags
$label
        LCLS    ScrSize
        LCLA    xres
        LCLA    yres
        LCLA    pixdepth
        LCLA    yeig
        LCLA    scrsz
        [ ("$ScreenSize" :RIGHT: 1) = "K"
ScrSize SETS ("$ScreenSize" :LEFT: ((:LEN: "$ScreenSize")-1))
scrsz   SETA    $ScrSize * 1024
        |
scrsz   SETA    $ScreenSize
        ]
        &       scrsz
        &       $XWindLimit, $YWindLimit, $LineLength, $NColour
        &       $YShftFactor, $ModeFlags, $XEigFactor, $YEigFactor
        &       $Log2BPC, $Log2BPP, $ECFIndex
        &       $ScrRCol, $ScrBRow, $PalIndex
        ALIGN
 [ MakeModeSelectorsForModeNumbers
xres    SETA    (($XWindLimit+1):SHL:($Log2BPC)):SHR:($Log2BPP)
yres    SETA    ($YWindLimit)+1
pixdepth SETA   $Log2BPP
  [ yres < xres/2
yeig    SETA    2
  |
yeig    SETA    1
  ]

ModeSelector_$label
        &       1, xres, yres, pixdepth
        &       -1                                              ; frame rate (is this going to be OK?)
  [ {FALSE} ; don't need any of this stuff - we're only getting the VIDC stuff via this mechanism
   [ ($ModeFlags)<>0
        &       VduExt_ModeFlags, $ModeFlags
   ]
   [ ($ScrRCol) <> (xres :SHR: 3)-1
        &       VduExt_ScrRCol, $ScrRCol
   ]
   [ ($ScrBRow) <> (yres :SHR: 3)-1
        &       VduExt_ScrBRow, $ScrBRow
   ]
   [ ($NColour) <> NColour_$Log2BPP
        &       VduExt_NColour, $NColour
   ]
   [ ($XEigFactor) <> 1
        &       VduExt_XEigFactor, $XEigFactor
   ]
   [ ($YEigFactor) <> yeig
        &       VduExt_YEigFactor, $YEigFactor
   ]
   [ ($LineLength) <> (xres :SHL: pixdepth) :SHR: 3
        &       VduExt_LineLength, $LineLength
   ]
   [ scrsz <> ((xres * yres) :SHL: pixdepth) :SHR: 3
        &       VduExt_ScreenSize, scrsz
   ]
   [ ($Log2BPC) <> pixdepth
        &       VduExt_Log2BPC, $Log2BPC
   ]
  ]
        &       -1                                              ; terminator
 ]
        MEND

        MACRO
$label  VWSTAB2 $BaseMode, $ScreenSize,$LineLength,$XWindLimit,$YWindLimit,$YShftFactor,    $XEigFactor,$YEigFactor,$NColour,$ScrRCol,$ScrBRow,$Log2BPC,$Log2BPP,$PalIndex, $ECFIndex,$ModeFlags
$label
        LCLS ScrSize
        &       0       ; wslist type (default)
        &       $BaseMode
        [ ("$ScreenSize" :RIGHT: 1) = "K"
ScrSize SETS ("$ScreenSize" :LEFT: ((:LEN: "$ScreenSize")-1))
        &       VduExt_ScreenSize, $ScrSize * 1024
        |
        &       VduExt_ScreenSize, $ScreenSize
        ]
        &       VduExt_LineLength, $LineLength
        &       VduExt_XWindLimit, $XWindLimit
        &       VduExt_YWindLimit, $YWindLimit
        &       VduExt_YShftFactor, $YShftFactor
        &       VduExt_XEigFactor, $XEigFactor
        &       VduExt_YEigFactor, $YEigFactor
        &       VduExt_NColour, $NColour
        &       VduExt_ScrRCol, $ScrRCol
        &       VduExt_ScrBRow, $ScrBRow
        &       VduExt_Log2BPC, $Log2BPC
        &       VduExt_Log2BPP, $Log2BPP
        &       VduExt_ModeFlags, $ModeFlags
        &       -1
        MEND

        MACRO
$label  VWSTAB $BaseMode, $ScreenSize,$LineLength,$XWindLimit,$YWindLimit,$YShftFactor,    $XEigFactor,$YEigFactor,$NColour,$ScrRCol,$ScrBRow,$Log2BPC,$Log2BPP,$PalIndex, $ECFIndex,$ModeFlags
        [ AssemblingArthur
$label  VWSTAB1 $BaseMode, $ScreenSize,$LineLength,$XWindLimit,$YWindLimit,$YShftFactor,    $XEigFactor,$YEigFactor,$NColour,$ScrRCol,$ScrBRow,$Log2BPC,$Log2BPP,$PalIndex, $ECFIndex,$ModeFlags
        |
$label  VWSTAB2 $BaseMode, $ScreenSize,$LineLength,$XWindLimit,$YWindLimit,$YShftFactor,    $XEigFactor,$YEigFactor,$NColour,$ScrRCol,$ScrBRow,$Log2BPC,$Log2BPP,$PalIndex, $ECFIndex,$ModeFlags
        ]
        MEND

VW_0    VWSTAB  0, 20K, 80, 639,255,4,1,2, 1, 79, 31,0,0,0,1,0                                             ; MODE 0
VW_1    VWSTAB  1, 20K, 80, 319,255,4,2,2, 3, 39, 31,1,1,1,2,0                                             ; MODE 1
VW_2    VWSTAB  2, 40K,160, 159,255,5,3,2,15, 19, 31,3,2,2,3,0                                             ; MODE 2
VW_3    VWSTAB  3, 40K,160, 639,249,5,1,2, 1, 79, 24,1,1,0,0,Flag_NonGraphic+Flag_GapMode+Flag_BBCGapMode  ; MODE 3
VW_4    VWSTAB  4, 20K, 80, 319,255,4,2,2, 1, 39, 31,1,0,0,4,0                                             ; MODE 4
VW_5    VWSTAB  5, 20K, 80, 159,255,4,3,2, 3, 19, 31,2,1,1,2,0                                             ; MODE 5
VW_6    VWSTAB  6, 20K, 80, 319,249,4,2,2, 1, 39, 24,1,1,0,0,Flag_NonGraphic+Flag_GapMode+Flag_BBCGapMode  ; MODE 6
 [ TTX256
 ASSERT HiResTTX
VW_7    VWSTAB  7,640K,640, 639,499,5,1,1,63, 39, 24,3,3,4,0,Flag_NonGraphic+Flag_GapMode+Flag_Teletext+Flag_DoubleVertical ; MODE 7
 |
 [ HiResTTX
VW_7    VWSTAB  7,320K,320, 639,499,5,1,1,15, 39, 24,2,2,4,0,Flag_NonGraphic+Flag_GapMode+Flag_Teletext+Flag_DoubleVertical ; MODE 7
 |
VW_7    VWSTAB  7, 80K,160, 319,249,5,2,2,15, 39, 24,2,2,4,0,Flag_NonGraphic+Flag_GapMode+Flag_Teletext    ; MODE 7
 ]
 ]
VW_8    VWSTAB  8, 40K,160, 639,255,5,1,2, 3, 79, 31,1,1,1,2,0                                             ; MODE 8
VW_9    VWSTAB  9, 40K,160, 319,255,5,2,2,15, 39, 31,2,2,2,3,0                                             ; MODE 9
VW_10   VWSTAB 10, 80K,320, 159,255,6,3,2,63, 19, 31,4,3,3,5,0                                             ; MODE 10
VW_11   VWSTAB 11, 40K,160, 639,249,5,1,2, 3, 79, 24,1,1,1,2,Flag_GapMode                                  ; MODE 11
VW_12   VWSTAB 12, 80K,320, 639,255,6,1,2,15, 79, 31,2,2,2,3,0                                             ; MODE 12
VW_13   VWSTAB 13, 80K,320, 319,255,6,2,2,63, 39, 31,3,3,3,5,0                                             ; MODE 13
VW_14   VWSTAB 14, 80K,320, 639,249,6,1,2,15, 79, 24,2,2,2,3,Flag_GapMode                                  ; MODE 14
VW_15   VWSTAB 15,160K,640, 639,255,7,1,2,63, 79, 31,3,3,3,5,0                                             ; MODE 15
VW_16   VWSTAB 16,132K,528,1055,255,0,1,2,15,131, 31,2,2,2,3,0                                             ; MODE 16
VW_17   VWSTAB 17,132K,528,1055,249,0,1,2,15,131, 24,2,2,2,3,Flag_GapMode                                  ; MODE 17
VW_18   VWSTAB 18, 40K, 80, 639,511,4,1,1, 1, 79, 63,0,0,0,4,0                                             ; MODE 18
VW_19   VWSTAB 19, 80K,160, 639,511,5,1,1, 3, 79, 63,1,1,1,2,0                                             ; MODE 19
VW_20   VWSTAB 20,160K,320, 639,511,6,1,1,15, 79, 63,2,2,2,3,0                                             ; MODE 20
VW_21   VWSTAB 21,320K,640, 639,511,7,1,1,63, 79, 63,3,3,3,5,0                                             ; MODE 21
VW_22   VWSTAB 22,108K,384, 767,287,0,0,1,15, 95, 35,2,2,2,3,0                                             ; MODE 22
VW_23   VWSTAB 23,M23S,144,1151,895,0,1,1, 1,143, 55,0,0,5,4,Flag_HiResMono+Flag_DoubleVertical            ; MODE 23
VW_24   VWSTAB 24,264K,1056,1055,255,0,1,2,63,131,31,3,3,3,5,0                                             ; MODE 24
VW_25 VWSTAB 25,M25S  , 80, 639,479,4,1,1, 1, 79, 59,0,0,0,4,0                                             ; MODE 25
VW_26 VWSTAB 26,M25S*2,160, 639,479,5,1,1, 3, 79, 59,1,1,1,2,0                                             ; MODE 26
VW_27 VWSTAB 27,M25S*4,320, 639,479,6,1,1,15, 79, 59,2,2,2,3,0                                             ; MODE 27
VW_28 VWSTAB 28,M25S*8,640, 639,479,7,1,1,63, 79, 59,3,3,3,5,0                                             ; MODE 28

VW_29 VWSTAB 29,M31S  ,100, 799,599,0,1,1, 1, 99, 74,0,0,0,4,0                                             ; MODE 29
VW_30 VWSTAB 30,M31S*2,200, 799,599,0,1,1, 3, 99, 74,1,1,1,2,0                                             ; MODE 30
VW_31 VWSTAB 31,M31S*4,400, 799,599,0,1,1,15, 99, 74,2,2,2,3,0                                             ; MODE 31
VW_32 VWSTAB 32,M31S*8,800, 799,599,0,1,1,63, 99, 74,3,3,3,5,0                                             ; MODE 32

VW_33   VWSTAB 33, 27K, 96, 767,287,0,1,2, 1, 95, 35,0,0,0,4,0                                             ; MODE 33
VW_34   VWSTAB 34, 54K,192, 767,287,0,1,2, 3, 95, 35,1,1,1,2,0                                             ; MODE 34
VW_35   VWSTAB 35,108K,384, 767,287,0,1,2,15, 95, 35,2,2,2,3,0                                             ; MODE 35
VW_36   VWSTAB 36,216K,768, 767,287,0,1,2,63, 95, 35,3,3,3,5,0                                             ; MODE 36

VW_37 VWSTAB 37,M37S  ,112, 895,351,0,1,2, 1,111, 43,0,0,0,4,0                                             ; MODE 37
VW_38 VWSTAB 38,M37S*2,224, 895,351,0,1,2, 3,111, 43,1,1,1,2,0                                             ; MODE 38
VW_39 VWSTAB 39,M37S*4,448, 895,351,0,1,2,15,111, 43,2,2,2,3,0                                             ; MODE 39
VW_40 VWSTAB 40,M37S*8,896, 895,351,0,1,2,63,111, 43,3,3,3,5,0                                             ; MODE 40

VW_41 VWSTAB 41,M41S  , 80, 639,351,0,1,2, 1, 79, 43,0,0,0,4,0                                             ; EGA 1,2,4bpp
VW_42 VWSTAB 42,M41S*2,160, 639,351,0,1,2, 3, 79, 43,1,1,1,2,0                                             ;
VW_43 VWSTAB 43,M41S*4,320, 639,351,0,1,2,15, 79, 43,2,2,2,3,0                                             ; 640x352

VW_44 VWSTAB 44,M44S  , 80, 639,199,0,1,2, 1, 79, 24,0,0,0,4,0                                             ; CGA 1,2,4bpp
VW_45 VWSTAB 45,M44S*2,160, 639,199,0,1,2, 3, 79, 24,1,1,1,2,0                                             ;
VW_46 VWSTAB 46,M44S*4,320, 639,199,0,1,2,15, 79, 24,2,2,2,3,0                                             ; 640x200

VW_47 VWSTAB 47,M47S*8,360, 359,479,0,2,2,63, 89, 59,3,3,3,5,0                                             ; PCSoft 360 x 480 x 8bpp
VW_48 VWSTAB 48,   75K,160, 319,479,0,2,1,15, 39, 59,2,2,2,3,0                                             ; Games 320 x 480 x 4bpp
VW_49 VWSTAB 49,  150K,320, 319,479,0,2,1,63, 39, 59,3,3,3,5,0                                             ; Games 320 x 480 x 8bpp

;            $BaseMode               $YShftFactor  $ScrBRow   $ModeFlags
;               $ScreenSize            $XEigFactor    $Log2BPC
;                      $LineLength       $YEigFactor    $Log2BPP
;                           $XWindLimit    $NColour       $PalIndex
;                                $YWindLimit  $ScrRCol      $ECFIndex

 [ MakeModeSelectorsForModeNumbers
ModeSelectorTable
        GBLA    modecount
        GBLS    h
        GBLS    l
modecount SETA  0
        ASSERT  NumModes <= 100
        WHILE   modecount < NumModes
  [ modecount >= 10
h       SETS    :CHR:(&30 + modecount/10)
  |
h       SETS    ""
  ]
l       SETS    :CHR:(&30 + modecount :MOD: 10)
        &       ModeSelector_VW_$h$l-ModeSelectorTable
modecount SETA  modecount + 1
        WEND

        ! 0,    "Mode selector table at ":CC: :STR: ModeSelectorTable
 ]

        END