! MCDSBM - AlphaBASIC program to display a Bitmap file using AMIGOS
!
!                                 NOTICE
!
!All  rights  reserved.  This software is the property of Alpha Microsystems
!and the material contained herein is the  proprietary  property  and  trade
!secrets  of  Alpha Microsystems, embodying substantial creative efforts and
!confidential information, ideas and expressions, no part of  which  may  be
!reproduced  or  transmitted  in  any  form  or  by  any  means, electronic,
!mechanical,  or  otherwise,  including  photocopying  or  input  into   any
!information  storage  or  retrieval  system  without  the  express  written
!permission of Alpha Microsystems.
!
!CAUTION: Unauthorized distribution or reproduction  of  this  material  may
!subject you to legal action.
!
!Copyright (C) 1984, 1988 - Alpha Microsystems, An Unpublished Work
!
!Edit History:
!
![100] 13 July 1988 17:00       Edited by RJ Wilcox
!       Created for simple demonstation of AMIGOS interface
!        to AlphaBASIC
! [101] MFC 01/09/89    Changed to wait for mouse input after displaying
!                       image.
!
!Syntax:        DSPBMP {outfile=} infile {altGDVname}
! where:
!               outfile - optional output file to redirect graphics output to.
!                          If not specified, output will be directed to default
!                          output used by the GDV.
!               infile  - existing bitmap file (.BMP) used for input.
!               altGDV  - name of graphics device driver to user for output
!                          code generation. If not specified, the GDV with the
!                          same name as the user's TDV will be used.
!

       PROGRAM MCDSBM,1.0(101)

++INCLUDE AMGSYM.BSI                    ! Get AMIGOS Definitions

MAP1 GCB,X,20000                        ! Graphics control block for AMIGOS

MAP1 ALTGDV,S,6,""                      ! Alternate output GDV name
MAP1 ALTCHN,F,6,0                       ! Alternate output file channel

MAP1 INFILE$,S,30                       ! Input filename

MAP1 CMDLIN,S,100                       ! variable used to parse command line
MAP1 T$,S,30                            ! Token used in parsing
MAP1 TEXT$,S,80                         ! TEXT FOR MOUSE CLICK.  [101]

DSPGRF:
       CALL PARSE'COMMAND              ! parse the command line, open files
!Open the workstation with possible alternate GDV and output file
       XCALL AMGSBR,G'OPWK,GCB,ALTGDV,STATUS,ALTCHN
       IF STATUS<>0 THEN GOTO GRAPH'ERROR

!Clear the workstation
       XCALL AMGSBR,G'CLRW,GCB,STATUS

! Turn cursor off
       PRINT TAB(-1,29);
! Display the file-based bitmap in upper left corner
       XCALL AMGSBR,G'BMF,GCB,0,32767,1,BM'FIL+BM'VOR,STATUS
       IF STATUS<>0 THEN GOTO GRAPH'ERROR

!close the files
       CLOSE   #1
       IF ALTCHN<>0 THEN CLOSE #3
! get mouse input
       GOSUB   MSECLK

! turn cursor on
       PRINT TAB(-1,28);
! Close the workstation
       XCALL AMGSBR,G'CLWK,GCB,STATUS
       END

! Parse the command line and open necessary files.
! External subroutine LSTLIN.SBR returns last line input.

PARSE'COMMAND:
       XCALL LSTLIN,CMDLIN
!find second space to get past RUN DSPGRF
       P=INSTR(1,CMDLIN," ")
       IF P=0 THEN GOTO BAD'COMMAND
       P1=INSTR(P+1,CMDLIN," ")
       IF P1=0 THEN GOTO BAD'COMMAND
       P=P1+1
! P now has pointer to start of command line
GET'INFILE:
       CALL TOKEN                      ! get the next token
       IF T$="" THEN GOTO BAD'COMMAND
       P1=INSTR(1,T$,".")              ! Look for extension
       IF P1=0 THEN INFILE$=T$+".BMP" ELSE INFILE$=T$
       CALL TOKEN                      ! get the next token
       IF T$="" THEN GOTO LINDON
       IF T$<>"=" THEN GOTO GET'AGDV
! Token indicates alternate output file - exchange input file and alternate
       ALTCHN = 3
       OPEN #3,INFILE$,OUTPUT
       GOTO GET'INFILE
! Process alternate GDV
GET'AGDV:
       ALTGDV = T$
LINDON:
       OPEN #1,INFILE$,INPUT
       RETURN

! Parse line starting at P, skip blanks and put next token in T$. Update P
TOKEN:
       T$=""
T'LOOP:
       IF P>LEN(CMDLIN) THEN RETURN
       IF CMDLIN[P;1]<>" " AND CMDLIN[P;1]<>CHR(9) THEN GOTO NOT'SPACE
       P=P+1
       IF LEN(T$)<>0 THEN RETURN ELSE GOTO T'LOOP
NOT'SPACE:
       IF CMDLIN[P;1]<>"=" THEN GOTO ADDT
       IF LEN(T$)<>0 THEN RETURN
       T$="="
       P=P+1
       RETURN
ADDT:
       T$=T$+CMDLIN[P;1]
       P=P+1
       GOTO T'LOOP

BAD'COMMAND:
       PRINT TAB(P-1);"^  Illegal Input"
       END

GRAPH'ERROR:
       PRINT "Graph Error";STATUS
       END


MSECLK:
! Set Mouse Cursor Shape
       PRINT   TAB(-1,29);
       PRINT   TAB(-1,160);CHR(32+8);
! Text Overhead
       XCALL   AMGSBR,G'STXF,GCB,1003,STATUS   ! font
       XCALL   AMGSBR,G'STXC,GCB,7,STATUS      ! color
       XCALL   AMGSBR,G'SCHH,GCB,700,STATUS    ! height
       XCALL   AMGSBR,G'SCHR,GCB,0,STATUS      ! rotation

       XVAL    = 50
       YVAL    = 50
       TEXT$   = "Click mouse once to continue : "
       GOSUB   DISP'TEXT
       GOSUB   GETCOR
       END


DISP'TEXT:
       XCALL   AMGSBR,G'TX,GCB,XVAL,YVAL,TEXT$,STATUS
       RETURN

GETCOR:
       XCALL AMGSBR,G'RQLC,GCB,0,0,0,XVAL,YVAL,CHAR,VALID
       RETURN