    ! EDWIN driver for the DEC GIGI Colour Graphics terminal

    from Edwin include Device
    from Edwin include Icodes

    ! Screen information
    own integer SX = 0       { Current device position
    own integer SY = 0
    own integer XL = 0
    own integer XR = 511     { Right hand side of device window
    own integer YB = 0
    own integer YT = 511

    external routine SET COLOUR MAP alias "EDWIN___G_MAP" (integer ADR, RED, BLUE, GREEN)
       ! red, blue, green combination for this address in color map
    end

    external routine GIGI alias "EDWIN___G" (integer COM, X, Y)
       own integer WX, WY
       switch SW(0:MAX COM)

       routine SWAP (integer name  A, B)
          integer C
          C = A;   A = B;   B = C
       end

       routine CHANGE ATTRIBUTE (integer WHAT, TO)
          switch AS (0:ATT MAXIMUM)
          -> AS (WHAT)

    AS(att colour):
           return

    AS(att char size):
           return

    AS(att colour mode):
           return

    AS(*): ! All other attributes ignored
       end

       -> SW(COM)

    SW(0): ! Initialise
           DEV DATA_NAME = "a DEC GIGI terminal"
           DEV DATA_DVX = 767
           DEV DATA_DVY = 479
           DEV DATA_MVX = 767
           DEV DATA_MVY = 479
           TTMODE (1)
           return

    SW(1): !Terminate
           TTMODE (0)
           return

    SW(2): ! Update
           return

    SW(3): ! New frame
           return

    SW(4): ! Move Abs
           return

    SW(5): ! Line Abs
           return

    SW(6): ! Character
           return

    SW(7): ! Attribute  Change
           CHANGE ATTRIBUTE (X, Y)
           return

    SW(8): ! Set lower window settings
           XL = X;   YB = Y
           return

    SW(9): ! Set upper window bounds
           XR = X;   YT = Y
           return

    SW(10): ! Mode change
            return

    SW(11): ! Set Colour replacement mode (old entry point)
            change attribute (att colour mode, X)
            return

    SW(12): ! Lower box bounds
            WX = X;   WY = Y
            return

    SW(13): ! Upper box bounds, and do box
            SWAP (WX, X) if WX > X
            SWAP (WY, Y) if WY > Y
            return if WX > XR or X < XL or WY > YT or Y < YB
            WX = XL if WX < XL
            WY = YB if WY < YB
            X = XR if X > XR
            Y = YT if Y > YT
            ! Box now clipped into the screen.
            return

    SW(*):
    end

    external routine G SAM alias "EDWIN___G_SAM" (integer name BUT, X, Y)
       signal 14, 8
    end

    external routine G REQ alias "EDWIN___G_REQ" (integer name BUT, X, Y)
       signal 14, 8
    end

    end of file